From 883b5eaf7f9d2f7fde6c4b61f48f6835c7db4bd7 Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 19 Jul 2023 15:27:51 +0400 Subject: [PATCH 001/478] Update links to grant programs --- src/content/community/grants/index.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/content/community/grants/index.md b/src/content/community/grants/index.md index a2ae5975418..0f1e1fbd702 100644 --- a/src/content/community/grants/index.md +++ b/src/content/community/grants/index.md @@ -28,17 +28,16 @@ These programs support the broad Ethereum ecosystem by offering grants to a wide These projects have created their own grants for projects aimed at developing and experimenting with their own technology. - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) grants DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ecosystem fund_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) ecosystem fund_ - [Chainlink Grants Program](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) community grants_ -- [Compound Grants Program](https://compoundgrants.org/) – _[Compound](https://compound.finance/) finance ecosystem_ +- [Compound Grants Program](https://twitter.com/compoundgrants/status/1615562418297659393?s=20) – _[Compound](https://compound.finance/) finance ecosystem_ - [Decentraland Grants Program](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverse_ - [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) finance ecosystem_ - [MetaMask Program](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) employee-led grants DAO_ -- [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) community_ - [SKALE Network Grants Program](https://skale.space/developers#grants) - _[SKALE Network](https://skale.space/) ecosystem_ -- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) ecosystem_ +- [The Graph](https://thegraph.com/ecosystem/grants/) – _[The Graph](https://thegraph.com/) ecosystem_ - [UMA Grants Program](https://grants.umaproject.org/) - _[UMA](https://umaproject.org/) developer support_ -- [Uniswap Grants Program](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) community_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/grants) – _[Uniswap](https://uniswap.org/) community_ - [Web3 Grants](https://web3grants.net) - _An extensive list of web3/crypto related grant programs_ ## Quadratic funding {#quadratic-funding} From b75a719a99dcf53dc1fc4267514e2b953bcded1f Mon Sep 17 00:00:00 2001 From: jimgreen2013 Date: Fri, 18 Aug 2023 21:48:45 +0800 Subject: [PATCH 002/478] Fix typos --- src/content/developers/docs/nodes-and-clients/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/nodes-and-clients/index.md b/src/content/developers/docs/nodes-and-clients/index.md index 61106a9df3e..97d61decf41 100644 --- a/src/content/developers/docs/nodes-and-clients/index.md +++ b/src/content/developers/docs/nodes-and-clients/index.md @@ -56,7 +56,7 @@ If you want to [run your own node](/developers/docs/nodes-and-clients/run-a-node ### Full node {#full-node} -Full nodes do a block-by-block validation of the blockchain, including downloading and verifying the block body and state data for each block. There are different classes of full node - some start from the genesis block and verify every single block in the entie history of the blockchain. Others start their verification at a more recent block that they trust to be valid (e.g. Geth's 'snap sync'). Regardless of where the verification starts, full nodes only keep a local copy of relatively recent data (typically the msot recent 128 blocks), allowing older data to be deleted to save disk space. Older data can be regenerated when it is needed. +Full nodes do a block-by-block validation of the blockchain, including downloading and verifying the block body and state data for each block. There are different classes of full node - some start from the genesis block and verify every single block in the entire history of the blockchain. Others start their verification at a more recent block that they trust to be valid (e.g. Geth's 'snap sync'). Regardless of where the verification starts, full nodes only keep a local copy of relatively recent data (typically the msot recent 128 blocks), allowing older data to be deleted to save disk space. Older data can be regenerated when it is needed. - Stores full blockchain data (although this is periodically pruned so a full node does not store all state data back to genesis) - Participates in block validation, verifies all blocks and states. From cf564573bf37b858ed4ed8c578230c3ebc216712 Mon Sep 17 00:00:00 2001 From: Derek Lee Date: Thu, 28 Sep 2023 15:13:44 -0400 Subject: [PATCH 003/478] docs: update links to ethereum-package after our rename --- src/content/developers/docs/development-networks/index.md | 2 +- src/pages/developers/local-environment.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/developers/docs/development-networks/index.md b/src/content/developers/docs/development-networks/index.md index 6cfedb507d1..12260e128b2 100644 --- a/src/content/developers/docs/development-networks/index.md +++ b/src/content/developers/docs/development-networks/index.md @@ -68,7 +68,7 @@ Kurtosis is a build system for multi-container test environments which enables d The Ethereum Kurtosis package locally instantiates a containerized and parameterizable Ethereum testnet, with support for multiple different Execution Layer (EL) and Consensus Layer (CL) clients and an n-number of nodes. Kurtosis gracefully handles all local port mappings and service connections for easy dApp and smart contract prototyping and testing. -- [Ethereum network package](https://github.com/kurtosis-tech/eth-network-package) +- [Ethereum network package](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) - [Github](https://github.com/kurtosis-tech/kurtosis) - [Documentation](https://docs.kurtosis.com/) diff --git a/src/pages/developers/local-environment.tsx b/src/pages/developers/local-environment.tsx index c33f5c2a7c4..e66634e070e 100644 --- a/src/pages/developers/local-environment.tsx +++ b/src/pages/developers/local-environment.tsx @@ -78,7 +78,7 @@ const ChooseStackPage = ({ { id: "kurtosis", url: "https://www.kurtosis.com/", - githubUrl: "https://github.com/kurtosis-tech/kurtosis", + githubUrl: "https://github.com/kurtosis-tech/ethereum-package", background: "#000000", name: "Kurtosis", description: t("page-local-environment-kurtosis-desc"), From 3bd020146269548afc4ed2587d97b6fa518e536f Mon Sep 17 00:00:00 2001 From: Derek Lee Date: Thu, 28 Sep 2023 15:23:26 -0400 Subject: [PATCH 004/478] more updates --- src/content/developers/docs/development-networks/index.md | 2 +- src/pages/developers/local-environment.tsx | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/developers/docs/development-networks/index.md b/src/content/developers/docs/development-networks/index.md index 12260e128b2..f715239483f 100644 --- a/src/content/developers/docs/development-networks/index.md +++ b/src/content/developers/docs/development-networks/index.md @@ -66,7 +66,7 @@ There are also two maintained public test implementations of Ethereum: Goerli an Kurtosis is a build system for multi-container test environments which enables developers to locally spin up reproducible instances of blockchain networks. -The Ethereum Kurtosis package locally instantiates a containerized and parameterizable Ethereum testnet, with support for multiple different Execution Layer (EL) and Consensus Layer (CL) clients and an n-number of nodes. Kurtosis gracefully handles all local port mappings and service connections for easy dApp and smart contract prototyping and testing. +The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scaleable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Etheruem core infrastructure. - [Ethereum network package](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) diff --git a/src/pages/developers/local-environment.tsx b/src/pages/developers/local-environment.tsx index e66634e070e..ed71d9ac099 100644 --- a/src/pages/developers/local-environment.tsx +++ b/src/pages/developers/local-environment.tsx @@ -76,11 +76,11 @@ const ChooseStackPage = ({ alt: t("page-local-environment-waffle-logo-alt"), }, { - id: "kurtosis", - url: "https://www.kurtosis.com/", + id: "Kurtosis Ethereum Package", + url: "https://github.com/kurtosis-tech/ethereum-package", githubUrl: "https://github.com/kurtosis-tech/ethereum-package", background: "#000000", - name: "Kurtosis", + name: "Kurtosis Ethereum Package", description: t("page-local-environment-kurtosis-desc"), alt: t("page-local-environment-kurtosis-logo-alt"), }, From 840680514f5b87a9225a10d4faf305bbf2a3ad25 Mon Sep 17 00:00:00 2001 From: Idris Olubisi Date: Thu, 28 Sep 2023 23:34:39 +0100 Subject: [PATCH 005/478] update general message passing bridges example This commit adds Axelar as a General message passing bridges example in the Bridge Type section. --- src/content/developers/docs/bridges/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/bridges/index.md b/src/content/developers/docs/bridges/index.md index 8fc4ee0fb17..0a044941670 100644 --- a/src/content/developers/docs/bridges/index.md +++ b/src/content/developers/docs/bridges/index.md @@ -42,7 +42,7 @@ Bridges can usually be classified into one of the following buckets: - **Native bridges –** These bridges are typically built to bootstrap liquidity on a particular blockchain, making it easier for users to move funds to the ecosystem. For example, the [Arbitrum Bridge](https://bridge.arbitrum.io/) is built to make it convenient for users to bridge from Ethereum Mainnet to Arbitrum. Other such bridges include Polygon PoS Bridge, [Optimism Gateway](https://app.optimism.io/bridge), etc. - **Validator or oracle based bridges –** These bridges rely on an external validator set or oracles to validate cross-chain transfers. Examples: Multichain and Across. -- **Generalized message passing bridges –** These bridges can transfer assets, along with messages and arbitrary data across chains. Examples: Nomad and LayerZero. +- **Generalized message passing bridges –** These bridges can transfer assets, along with messages and arbitrary data across chains. Examples: Nomad, Axelar, and LayerZero. - **Liquidity networks –** These bridges primarily focus on transferring assets from one chain to another via atomic swaps. Generally, they don’t support cross-chain message passing. Examples: Connext and Hop. ## Trade-offs to consider {#trade-offs} From b34cd6f4548d1c27d776c791428ae1b033fb3a81 Mon Sep 17 00:00:00 2001 From: Idris Olubisi Date: Fri, 29 Sep 2023 07:00:05 +0100 Subject: [PATCH 006/478] sort bridge examples alphabetically --- src/content/developers/docs/bridges/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/bridges/index.md b/src/content/developers/docs/bridges/index.md index 0a044941670..fe97e455db5 100644 --- a/src/content/developers/docs/bridges/index.md +++ b/src/content/developers/docs/bridges/index.md @@ -42,7 +42,7 @@ Bridges can usually be classified into one of the following buckets: - **Native bridges –** These bridges are typically built to bootstrap liquidity on a particular blockchain, making it easier for users to move funds to the ecosystem. For example, the [Arbitrum Bridge](https://bridge.arbitrum.io/) is built to make it convenient for users to bridge from Ethereum Mainnet to Arbitrum. Other such bridges include Polygon PoS Bridge, [Optimism Gateway](https://app.optimism.io/bridge), etc. - **Validator or oracle based bridges –** These bridges rely on an external validator set or oracles to validate cross-chain transfers. Examples: Multichain and Across. -- **Generalized message passing bridges –** These bridges can transfer assets, along with messages and arbitrary data across chains. Examples: Nomad, Axelar, and LayerZero. +- **Generalized message passing bridges –** These bridges can transfer assets, along with messages and arbitrary data across chains. Examples: Axelar, LayerZero, and Nomad. - **Liquidity networks –** These bridges primarily focus on transferring assets from one chain to another via atomic swaps. Generally, they don’t support cross-chain message passing. Examples: Connext and Hop. ## Trade-offs to consider {#trade-offs} From b7f015443838d917c0003877eacb922ab8af585c Mon Sep 17 00:00:00 2001 From: tylerapfledderer Date: Mon, 2 Oct 2023 11:25:02 -0400 Subject: [PATCH 007/478] style: declare secondary styling for outline buttons in "primary/secondary" button pairs --- src/components/PageHero.tsx | 3 +++ src/pages-conditional/what-is-ethereum.tsx | 6 +++--- src/pages/bug-bounty.tsx | 2 +- src/pages/community.tsx | 7 ++++++- src/pages/index.tsx | 5 +++-- src/pages/run-a-node.tsx | 2 +- src/pages/stablecoins.tsx | 9 ++++++++- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/components/PageHero.tsx b/src/components/PageHero.tsx index 6a01e1a248a..165163c03af 100644 --- a/src/components/PageHero.tsx +++ b/src/components/PageHero.tsx @@ -100,6 +100,7 @@ const PageHero: React.FC = ({ // global styles in `src/@chakra-ui/gatsby-plugin/styles.ts` {buttons.map((button, idx) => { + const isSecondary = idx !== 0 if (isButtonLink(button)) { return ( @@ -113,6 +114,7 @@ const PageHero: React.FC = ({ eventName: button.matomo.eventName, }) } + isSecondary={isSecondary} > {button.content} @@ -133,6 +135,7 @@ const PageHero: React.FC = ({ eventName: button.matomo.eventName, }) } + isSecondary={isSecondary} > {button.content} diff --git a/src/pages-conditional/what-is-ethereum.tsx b/src/pages-conditional/what-is-ethereum.tsx index a46a6da21fb..91ed20c64a0 100644 --- a/src/pages-conditional/what-is-ethereum.tsx +++ b/src/pages-conditional/what-is-ethereum.tsx @@ -651,7 +651,7 @@ const WhatIsEthereumPage = ({ - + @@ -678,7 +678,7 @@ const WhatIsEthereumPage = ({ - + @@ -705,7 +705,7 @@ const WhatIsEthereumPage = ({ - + diff --git a/src/pages/bug-bounty.tsx b/src/pages/bug-bounty.tsx index 1743c9a2717..fad6e016c25 100644 --- a/src/pages/bug-bounty.tsx +++ b/src/pages/bug-bounty.tsx @@ -460,7 +460,7 @@ const BugBountiesPage = ({ - + diff --git a/src/pages/community.tsx b/src/pages/community.tsx index c74135c6995..518307fa866 100644 --- a/src/pages/community.tsx +++ b/src/pages/community.tsx @@ -324,7 +324,11 @@ const CommunityPage = ({ - + @@ -370,6 +374,7 @@ const CommunityPage = ({ diff --git a/src/pages/index.tsx b/src/pages/index.tsx index eba47de2c82..1d32434e1c9 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -359,7 +359,7 @@ const HomePage = ({ - + @@ -438,7 +438,7 @@ const HomePage = ({ - + @@ -570,6 +570,7 @@ const HomePage = ({ to="https://github.com/ethereum/ethereum-org-website" leftIcon={} variant="outline" + isSecondary > GitHub diff --git a/src/pages/run-a-node.tsx b/src/pages/run-a-node.tsx index d00eff91898..f7de3acd176 100644 --- a/src/pages/run-a-node.tsx +++ b/src/pages/run-a-node.tsx @@ -809,7 +809,7 @@ const RunANodePage = ({ data }: PageProps) => { > - + diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 839c89fdcb4..365757dbeb2 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -505,6 +505,7 @@ const StablecoinsPage = ({ data }: PageProps) => { @@ -556,6 +557,7 @@ const StablecoinsPage = ({ data }: PageProps) => { @@ -627,7 +629,12 @@ const StablecoinsPage = ({ data }: PageProps) => { - + From 5b55a70591ea2e97c98bdf1038050f90d9a7aa08 Mon Sep 17 00:00:00 2001 From: Pranav Konde <76070589+pranavkonde@users.noreply.github.com> Date: Wed, 4 Oct 2023 15:57:08 +0530 Subject: [PATCH 008/478] Update correct link for DAI info --- src/pages/stablecoins.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 839c89fdcb4..0fdcab38097 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -504,7 +504,7 @@ const StablecoinsPage = ({ data }: PageProps) => { From 91f773326ee9a3cdbaf1e8a4bda6424df8829739 Mon Sep 17 00:00:00 2001 From: Oleksandr Hyriavets Date: Wed, 4 Oct 2023 17:38:02 +0200 Subject: [PATCH 009/478] Fixed paddings of what is etherium page [Fixes #11361] --- src/pages-conditional/what-is-ethereum.tsx | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/pages-conditional/what-is-ethereum.tsx b/src/pages-conditional/what-is-ethereum.tsx index a46a6da21fb..af0dd3c5beb 100644 --- a/src/pages-conditional/what-is-ethereum.tsx +++ b/src/pages-conditional/what-is-ethereum.tsx @@ -1,4 +1,4 @@ -import React from "react" +import React, { ComponentPropsWithRef } from "react" import { graphql, PageProps } from "gatsby" import { useI18next, useTranslation } from "gatsby-plugin-react-i18next" import { @@ -162,6 +162,17 @@ const ButtonRow = (props: ChildOnlyProp) => ( ) +export const StyledCard = (props: ComponentPropsWithRef) => ( + +) + const Stat: React.FC<{ stat: IFetchStat }> = ({ stat }) => { const isLoading = !stat.value @@ -322,6 +333,7 @@ const WhatIsEthereumPage = ({ image={getImage(data.hero)!} alt={t("page-what-is-ethereum-alt-img-bazaar")} loading="eager" + mb={8} /> @@ -363,21 +375,17 @@ const WhatIsEthereumPage = ({

-
+

{cards.map((card, idx) => ( - ))} From 5ecedeed2eda971ee1a87b8605b82c514ce63389 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 30 Oct 2023 11:11:30 -0600 Subject: [PATCH 010/478] add Aurox wallet information --- src/assets/wallets/aurox.png | Bin 0 -> 4460 bytes src/data/wallets/wallet-data.ts | 48 ++++++++++++++++++++++++++++++ src/pages/wallets/find-wallet.tsx | 3 ++ 3 files changed, 51 insertions(+) create mode 100644 src/assets/wallets/aurox.png diff --git a/src/assets/wallets/aurox.png b/src/assets/wallets/aurox.png new file mode 100644 index 0000000000000000000000000000000000000000..4caeaadc529eab1ffed29115a85f88eee4a097be GIT binary patch literal 4460 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 literal 0 HcmV?d00001 diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 03b4eb2547b..1ad9ae8e043 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -2702,6 +2702,54 @@ const walletData: WalletData[] = [ documentation: "https://docs.xdefi.io/xdefi-wallet-v2-draft/technical-docs/extension-integration", }, + { + last_updated: "2023-10-30", + name: "Aurox Wallet", + image_name: "aurox", + brand_color: "#1F47FF", + url: "https://getaurox.com/wallet", + wallet_live_date: "2022-12-06", + active_development_team: true, + languages_supported: ["en"], + twitter: "https://twitter.com/getaurox", + discord: "https://aurox.app/discord", + reddit: "", + telegram: "", + ios: false, + android: false, + linux: false, + windows: false, + macOS: false, + firefox: false, + chromium: true, + hardware: false, + open_source: true, + repo_url: "https://github.com/GetAurox/Aurox-Wallet", + non_custodial: true, + security_audit: ["https://skynet.certik.com/projects/aurox"], + scam_protection: true, + hardware_support: true, + walletconnect: false, + rpc_importing: true, + nft_support: true, + connect_to_dapps: true, + staking: false, + swaps: true, + multichain: true, + layer_2: true, + gas_fee_customization: true, + ens_support: true, + erc_20_support: true, + eip_1559_support: true, + buy_crypto: false, + withdraw_crypto: false, + multisig: false, + social_recovery: false, + onboard_documentation: + " https://docs.getaurox.com/product-docs/aurox-ecosystem/what-is-the-aurox-ecosystem", + documentation: + " https://docs.getaurox.com/product-docs/aurox-ecosystem/what-is-the-aurox-ecosystem", + }, ] export default walletData diff --git a/src/pages/wallets/find-wallet.tsx b/src/pages/wallets/find-wallet.tsx index a74b4874b34..d1dd1d9089a 100644 --- a/src/pages/wallets/find-wallet.tsx +++ b/src/pages/wallets/find-wallet.tsx @@ -515,5 +515,8 @@ export const query = graphql` XDEFI: file(relativePath: { eq: "wallets/XDEFI.png" }) { ...walletImage } + aurox: file(relativePath: { eq: "wallets/aurox.png" }) { + ...walletImage + } } ` From 1d76a57d656da4abede7c0c4e3fed012400000ae Mon Sep 17 00:00:00 2001 From: Zheng Fu <24203166+fuzheng1998@users.noreply.github.com> Date: Sat, 18 Nov 2023 15:32:41 +1100 Subject: [PATCH 011/478] Refactor section to use Box component --- src/pages-conditional/what-is-ethereum.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages-conditional/what-is-ethereum.tsx b/src/pages-conditional/what-is-ethereum.tsx index f7701da650d..5694c2b8a44 100644 --- a/src/pages-conditional/what-is-ethereum.tsx +++ b/src/pages-conditional/what-is-ethereum.tsx @@ -363,7 +363,7 @@ const WhatIsEthereumPage = ({

-
+

@@ -381,7 +381,7 @@ const WhatIsEthereumPage = ({ /> ))} -
+ From 054acef1ddd97b76684d7fe36f34bb4734d6503d Mon Sep 17 00:00:00 2001 From: 0xMBL <0xmbl@proton.me06> Date: Tue, 28 Nov 2023 11:36:49 +0000 Subject: [PATCH 012/478] added aria label to main feedback widget for screen readers to identify the use of the button. Also added to en common.json file. Text subject to change if necessary. --- src/components/FeedbackWidget.tsx | 1 + src/intl/en/common.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index 66d2a8a7a10..ad669ea7c39 100644 --- a/src/components/FeedbackWidget.tsx +++ b/src/components/FeedbackWidget.tsx @@ -58,6 +58,7 @@ const FixedDot: React.FC = ({ }} transition="transform 0.2s ease-in-out, width 0.25s linear, border-radius 0.25s linear" + aria-label={t("feedback-widget")} {...props} > {children} diff --git a/src/intl/en/common.json b/src/intl/en/common.json index d93be2f3864..daa29553239 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -90,6 +90,7 @@ "ethereum-support": "Ethereum support", "ethereum-wallets": "Ethereum wallets", "ethereum-whitepaper": "Ethereum Whitepaper", + "feedback-widget": "feedback", "feedback-widget-prompt": "Is this page helpful?", "feedback-card-prompt-page": "Was this page helpful?", "feedback-card-prompt-article": "Was this article helpful?", From 81e35539c1963f22e425e3fa8c1735253332530e Mon Sep 17 00:00:00 2001 From: shyam-patel-kira Date: Wed, 6 Dec 2023 21:34:36 -0500 Subject: [PATCH 013/478] fix H4 sizing on /staking page: [Fixes #11409] --- src/pages/staking/index.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pages/staking/index.tsx b/src/pages/staking/index.tsx index 9266bcc341c..ba2784d5aa2 100644 --- a/src/pages/staking/index.tsx +++ b/src/pages/staking/index.tsx @@ -374,7 +374,7 @@ const StakingPage = ({ borderBottom: "1px solid #3335", }} > - +
    @@ -395,7 +395,7 @@ const StakingPage = ({ borderBottom: "1px solid #3335", }} > - +
      @@ -411,7 +411,7 @@ const StakingPage = ({
    - +
      @@ -439,7 +439,7 @@ const StakingPage = ({ borderBottom: "1px solid #3335", }} > - +
        @@ -457,7 +457,7 @@ const StakingPage = ({ borderBottom: "1px solid #3335", }} > - +
          @@ -470,7 +470,7 @@ const StakingPage = ({
    - +
      @@ -499,7 +499,7 @@ const StakingPage = ({ borderBottom: "1px solid #3335", }} > - +
        @@ -520,7 +520,7 @@ const StakingPage = ({ borderBottom: "1px solid #3335", }} > - +
          @@ -533,7 +533,7 @@ const StakingPage = ({
    - +
      From 1f268835f654c7bb4bc18e42330b137338578bdc Mon Sep 17 00:00:00 2001 From: elcristiancamilo <90621933+elcristiancamilo@users.noreply.github.com> Date: Mon, 11 Dec 2023 21:35:25 -0700 Subject: [PATCH 014/478] Update community-meetups.json I added a new meetup in the city of Edmonton, Canada --- src/data/community-meetups.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/community-meetups.json b/src/data/community-meetups.json index 3bd65cd1628..d7a31593878 100644 --- a/src/data/community-meetups.json +++ b/src/data/community-meetups.json @@ -424,5 +424,11 @@ "emoji": ":belgium:", "location": "Brussels", "link": "https://dao.brussels/" + }, + { + "title": "Ethereum Edmonton Meetup", + "emoji": ":canada:", + "location": "Edmonton", + "link": "https://www.meetup.com/es/ethereum-edmonton-meetup/" } ] From 51bd507939f633eea32ad1f1223e205fa856f618 Mon Sep 17 00:00:00 2001 From: Bhaskar Kashyap <31563474+bskrksyp9@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:18:14 +0530 Subject: [PATCH 015/478] Fix typo Spelling correction --- src/content/developers/docs/scaling/sidechains/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/scaling/sidechains/index.md b/src/content/developers/docs/scaling/sidechains/index.md index 5db91e3c6e2..2a8d09c21d1 100644 --- a/src/content/developers/docs/scaling/sidechains/index.md +++ b/src/content/developers/docs/scaling/sidechains/index.md @@ -51,7 +51,7 @@ While bridges help users move funds between Ethereum and the sidechain, the asse | Pros | Cons | | --------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -| The technology underpinning sidechains is well-established and benefits from extensive research and improvements in design. | Sidechains trade off some measure of decentralization and trustlesness for scalability. | +| The technology underpinning sidechains is well-established and benefits from extensive research and improvements in design. | Sidechains trade off some measure of decentralization and trustlessness for scalability. | | Sidechains support general computation and offer EVM compatibility (they can run Ethereum-native dapps). | A sidechain uses a separate consensus mechanism and doesn't benefit from Ethereum's security guarantees. | | Sidechains use different consensus models to efficiently process transactions and lower transaction fees for users. | Sidechains require higher trust assumptions (e.g., a quorum of malicious sidechain validators can commit fraud). | | EVM-compatible sidechains allow dapps to expand their ecosystem. | | From 9cd3c1f45af2f548c5f89f86802a385f5ca1e310 Mon Sep 17 00:00:00 2001 From: Bhaskar Kashyap <31563474+bskrksyp9@users.noreply.github.com> Date: Wed, 13 Dec 2023 16:49:18 +0530 Subject: [PATCH 016/478] Fix typo Grammatical correction --- src/content/roadmap/pbs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/roadmap/pbs/index.md b/src/content/roadmap/pbs/index.md index 645759b68a2..d9f79124074 100644 --- a/src/content/roadmap/pbs/index.md +++ b/src/content/roadmap/pbs/index.md @@ -20,7 +20,7 @@ For example, inclusion lists can be introduced so that when validators know abou -Powerful organizations can pressure validators to censor transactions to or from certain addresses. Validators comply with this pressure by detecting blacklisted addresses in their transaction pool and omitting them from the blocks the propose. After PBS this will no longer be possible because block proposers will not know which transactions they are broadcasting in their blocks. It might be important for certain individuals or apps to comply with censorship rules, for example when it is made law in their region. In these cases, compliance happens at the application level, while the protocol remains permissionless and censorship free. +Powerful organizations can pressure validators to censor transactions to or from certain addresses. Validators comply with this pressure by detecting blacklisted addresses in their transaction pool and omitting them from the blocks they propose. After PBS this will no longer be possible because block proposers will not know which transactions they are broadcasting in their blocks. It might be important for certain individuals or apps to comply with censorship rules, for example when it is made law in their region. In these cases, compliance happens at the application level, while the protocol remains permissionless and censorship free. From 84ee619fb4456fbda88063c6e82d6f3f7822d336 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 13 Dec 2023 17:46:19 +0000 Subject: [PATCH 017/478] Fix a typo --- src/content/developers/docs/scaling/zk-rollups/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/developers/docs/scaling/zk-rollups/index.md b/src/content/developers/docs/scaling/zk-rollups/index.md index 56e1b731473..ba5fef6b45e 100644 --- a/src/content/developers/docs/scaling/zk-rollups/index.md +++ b/src/content/developers/docs/scaling/zk-rollups/index.md @@ -1,5 +1,5 @@ --- -title: Zero-Knowledge rollups +title: Zero-knowledge rollups description: An introduction to zero-knowledge rollups—a scaling solution used by the Ethereum community. lang: en --- From 62568ddbe4ad7222b3ad7d21481320f46ba5e4d6 Mon Sep 17 00:00:00 2001 From: Sean O'Connor Date: Thu, 4 Jan 2024 13:16:18 -0700 Subject: [PATCH 018/478] Update Block Explorer List to include Ethernow .md Adding Ethernow.xyz to the list of explorers available to the ecosystem. --- .../developers/docs/data-and-analytics/block-explorers/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/developers/docs/data-and-analytics/block-explorers/index.md b/src/content/developers/docs/data-and-analytics/block-explorers/index.md index 494aba59cc6..bd9b317a2e9 100644 --- a/src/content/developers/docs/data-and-analytics/block-explorers/index.md +++ b/src/content/developers/docs/data-and-analytics/block-explorers/index.md @@ -14,6 +14,7 @@ You should understand the basic concepts of Ethereum so you can make sense of th ## Services {#services} - [Etherscan](https://etherscan.io/) -_Also available in Chinese, Korean, Russian, and Japanese_ +- [Ethernow](https://www.ethernow.xyz/) - [Beaconcha.in](https://beaconcha.in/) - [Blockchair](https://blockchair.com/ethereum) -_Also available in Spanish, French, Italian, Dutch, Portuguese, Russian, Chinese, and Farsi_ - [Blockscout](https://blockscout.com/) @@ -232,6 +233,7 @@ The consensus layer top-level data includes the following: ## Block explorers {#block-explorers} - [Etherscan](https://etherscan.io/) - a block explorer you can use to fetch data for Ethereum Mainnet and Goerli Testnet +- [Ethernow](https://www.ethernow.xyz/) - a real-time transaction explorer that enables you to see the Ethereum Mainnet pre-chain layer - [Beaconcha.in](https://beaconcha.in/) - an open source block explorer for Ethereum Mainnet and Goerli Testnet - [Blockchair](https://blockchair.com/ethereum) - the most private Ethereum explorer. Also for sorting and filtering (mempool) data - [Etherchain](https://www.etherchain.org/) - a block explorer for the Ethereum Mainnet From e2527129f35929245185513535745a7e5a9ac0e4 Mon Sep 17 00:00:00 2001 From: Ev Date: Wed, 10 Jan 2024 17:24:21 -0500 Subject: [PATCH 019/478] Update index.md Adding Amazon Managed Blockchain for Ethereum. --- .../docs/nodes-and-clients/nodes-as-a-service/index.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md index a1ac64a38da..6c14db1fed5 100644 --- a/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md +++ b/public/content/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -76,6 +76,15 @@ Here is a list of some of the most popular Ethereum node providers, feel free to - Trace/Debug namespace available - Automated updates - Technical support +- [**Amazon Managed Blockchain**](https://aws.amazon.com/managed-blockchain/) + - [Docs](https://aws.amazon.com/managed-blockchain/resources/) + - Features + - Fully managed Ethereum nodes + - Available in six regions + - JSON-RPC over HTTP and secure WebSockets + - Supports 3 chains + - SLAs, AWS Support 24/7 + - Go-ethereum and Lighthouse - [**Ankr**](https://www.ankr.com/) - [Docs](https://docs.ankr.com/) - Features From 75731c9da18b6065cae1a7cdf12df63c2970846e Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 14 Jan 2024 20:35:13 -0800 Subject: [PATCH 020/478] feat: add desktop locale-picker menu --- src/components/Nav/index.tsx | 103 +++++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 22 deletions(-) diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 5374671b252..8027d8edaf2 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -1,10 +1,23 @@ -import React, { FC, useRef } from "react" +import { FC, useRef } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" import { MdBrightness2, MdLanguage, MdWbSunny } from "react-icons/md" -import { Box, Flex, HStack, Icon, useDisclosure } from "@chakra-ui/react" +import { + Box, + Flex, + HStack, + Icon, + Menu as ChakraMenu, + MenuButton, + MenuDivider, + MenuItem, + MenuList, + useDisclosure, +} from "@chakra-ui/react" -import { ButtonLink, IconButton } from "../Buttons" +import { DEFAULT_LOCALE } from "@/lib/constants" + +import { IconButton } from "../Buttons" import { EthHomeIcon } from "../icons" import { BaseLink } from "../Link" import Search from "../Search" @@ -28,7 +41,7 @@ const Nav: FC = ({ path }) => { linkSections, mobileNavProps, } = useNav({ path }) - const { locale } = useRouter() + const { asPath, locale, locales } = useRouter() const { t } = useTranslation("common") const searchModalDisclosure = useDisclosure() const navWrapperRef = useRef(null) @@ -99,24 +112,70 @@ const Nav: FC = ({ path }) => { color: "primary.hover", }} onClick={toggleColorMode} - > - } - variant="ghost" - isSecondary - px={1.5} - _hover={{ - color: "primary.hover", - "& svg": { - transform: "rotate(10deg)", - transition: "transform 0.5s", - }, - }} - > - {t("languages")} {locale!.toUpperCase()} - + /> + + {/* Locale-picker menu */} + + + + {t("languages")} {locale!.toUpperCase()} + + + + + View all languages + + + + {locales + ?.map( + ( + localeChoice: string + ): { + localeChoice: string + source: string + target: string + } => ({ + localeChoice, + source: + new Intl.DisplayNames([locale!], { + type: "language", + }).of(localeChoice) || "", + target: + new Intl.DisplayNames([localeChoice], { + type: "language", + }).of(localeChoice) || "", + }) + ) + .sort((a, b) => + b.localeChoice === DEFAULT_LOCALE + ? 1 + : a.source.localeCompare(b.source) + ) + .map(({ localeChoice, source, target }) => ( + + + {source} ({target}) + + + ))} + + From 9be3ce6ec6d3d11d53bc0580dc9d7de399fbb655 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 16 Jan 2024 21:32:49 -0800 Subject: [PATCH 021/478] style: add menu semantic tokens --- src/@chakra-ui/semanticTokens.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/@chakra-ui/semanticTokens.ts b/src/@chakra-ui/semanticTokens.ts index 9e20353d72b..ec1f72a8447 100644 --- a/src/@chakra-ui/semanticTokens.ts +++ b/src/@chakra-ui/semanticTokens.ts @@ -96,6 +96,36 @@ const semanticTokens = { _light: "rgba(255, 255, 255, 0.80)", _dark: "rgba(34, 34, 34, 0.80)", }, + + // Menu + menu: { + stroke: { _light: "gray.200", _dark: "gray.600" }, + highlight: "primary.base", + lvl1: { + main: "body.base", + subtext: { _light: "gray.400", _dark: "gray.400" }, + background: { _light: "white", _dark: "black" }, + activeBackground: { _light: "gray.150", _dark: "gray.700" }, + }, + lvl2: { + main: "body.base", + subtext: { _light: "gray.400", _dark: "gray.300" }, + background: { _light: "gray.150", _dark: "gray.700" }, + activeBackground: { _light: "gray.200", _dark: "gray.600" }, + }, + lvl3: { + main: "body.base", + subtext: { _light: "gray.500", _dark: "gray.300" }, + background: { _light: "gray.200", _dark: "gray.600" }, + activeBackground: { _light: "gray.100", _dark: "gray.700" }, + }, + lvl4: { + main: "body.base", + subtext: { _light: "gray.700", _dark: "gray.300" }, + background: { _light: "gray.300", _dark: "gray.700" }, + activeBackground: { _light: "gray.200", _dark: "gray.800" }, + }, + } }, gradients: { bgMainGradient: { From 32fbf6daaceb794b713bd4e518c5d4fa18698cfa Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 16 Jan 2024 21:43:27 -0800 Subject: [PATCH 022/478] refactor: update nav item architecture --- src/components/Nav/types.ts | 37 +-- src/components/Nav/useNav.ts | 550 +++++++++++++++++++++-------------- src/intl/en/common.json | 9 + 3 files changed, 368 insertions(+), 228 deletions(-) diff --git a/src/components/Nav/types.ts b/src/components/Nav/types.ts index bac78bda1aa..3bafab72199 100644 --- a/src/components/Nav/types.ts +++ b/src/components/Nav/types.ts @@ -1,23 +1,26 @@ -export type SectionKey = - | "useEthereum" - | "learn" - | "developers" - | "enterprise" - | "community" +import { IconType } from "react-icons" -export interface IItem { - text: string - to?: string - items?: Array +export type NavItem = { + label: string + description: string + icon?: IconType isPartiallyActive?: boolean -} +} & ( + | { items: NavItem[], href?: never } + | { href: string, items?: never } + ) -export interface ISection { - text: string +export type NavSectionKey = + | "learn" + | "use" + | "build" + | "participate" + | "research" + +export type NavSectionDetail = { + label: string ariaLabel: string - items: Array + items: NavItem[] } -export type ISections = { - [key in SectionKey]: ISection -} +export type NavSections = Record diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index 02f9bdbecaa..7d3fee0d215 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -1,323 +1,451 @@ import { useState } from "react" -import { cloneDeep } from "lodash" +import { useRouter } from "next/router" import { useTranslation } from "next-i18next" -import { useColorMode } from "@chakra-ui/react" +import { useColorMode, useColorModeValue, useDisclosure } from "@chakra-ui/react" import { trackCustomEvent } from "@/lib/utils/matomo" import { FROM_QUERY } from "@/lib/constants" -import { IItem, ISections } from "./types" +import type { NavItem, NavSections } from "./types" -export const useNav = ({ path }: { path: string }) => { - const [isMenuOpen, setIsMenuOpen] = useState(false) - const { colorMode, toggleColorMode } = useColorMode() +export const useNav = () => { + const { asPath } = useRouter() + const { isOpen, onToggle } = useDisclosure() const { t } = useTranslation("common") - const isDarkTheme = colorMode === "dark" + const colorToggleEvent = useColorModeValue("dark mode", "light mode") // This will be inverted as the state is changing + const { toggleColorMode: chakraToggleColorMode } = useColorMode() - const linkSections: ISections = { - useEthereum: { - text: t("use-ethereum"), - ariaLabel: t("use-ethereum-menu"), - items: [ - { - text: t("find-wallet"), - to: "/wallets/find-wallet/", - }, - { - text: t("get-eth"), - to: "/get-eth/", - }, - { - text: t("decentralized-applications-dapps"), - to: "/dapps/", - }, - { - text: t("layer-2"), - to: "/layer-2/", - }, - { - text: t("nft-page"), - to: "/nft/", - }, - { - text: t("defi-page"), - to: "/defi/", - }, - { - text: t("dao-page"), - to: "/dao/", - }, - { - text: t("stablecoins"), - to: "/stablecoins/", - }, - { - text: t("stake-eth"), - to: "/staking/", - }, - { - text: t("run-a-node"), - to: "/run-a-node/", - }, - { - text: t("decentralized-social-networks"), - to: "/social-networks/", - }, - { - text: t("decentralized-identity"), - to: "/decentralized-identity/", - }, - { - text: t("decentralized-science"), - to: "/desci/", - }, - { - text: t("regenerative-finance"), - to: "/refi/", - }, - ], - }, + const linkSections: NavSections = { learn: { - text: t("learn"), + label: t("learn"), ariaLabel: t("learn-menu"), items: [ { - text: t("start-here"), + label: "Overview", + description: "All things Ethereum education", + href: "/learn/" + }, + { + label: "Basics", + description: "Understand the fundamentals of Ethereum", items: [ { - text: t("learn-hub"), - to: "/learn/", + label: t("what-is-ethereum"), + description: "Understand what makes Ethereum special", + href: "/what-is-ethereum/", }, { - text: t("guides-hub"), - to: "/guides/", + label: t("what-is-ether"), + description: "The currency of Ethereum apps", + href: "/eth/", + }, + { + label: t("ethereum-wallets"), + description: "An app to interact with your Ethereum account", + href: "/wallets/", + }, + { + label: "What is Web3?", + description: "An alternative to centralized monopolies dictating the rules", + href: "/web3/", + }, + { + label: t("smart-contracts"), + description: "The fundamental buliding blocks of the Ethereum ecosystem", + href: "/smart-contracts/", }, ], }, { - text: t("ethereum-basics"), + label: "Advanced", + description: "Learn the more complex topics", items: [ { - text: t("what-is-ethereum"), - to: "/what-is-ethereum/", + label: "Gas fees", + description: "How are ETH transaction fees calculated", + href: "/gas/", }, { - text: t("what-is-ether"), - to: "/eth/", + label: t("bridges"), + description: "Web3 has evolved into an ecosystem of primary L1 blockchains and L2 scaling solutions", + href: "/bridges/", }, { - text: t("ethereum-wallets"), - to: "/wallets/", + label: t("zero-knowledge-proofs"), + description: "A way to prove the validity of a statement without reveling the statement itself", + href: "/zero-knowledge-proofs/", }, { - text: "Gas fees", - to: "/gas/", + label: t("run-a-node"), + description: "Become fully sovereign while helping secure the network", + href: "/run-a-node/", }, { - text: t("ethereum-security"), - to: "/security/", + label: t("ethereum-security"), + description: "Learn best practices when using cryptocurrency", + href: "/security/", }, + ], + }, + { + label: "Test your knowledge", + description: "Find out how well you understand Ethereum and cryptocurrencies", + href: "/quizzes/", + } + ], + }, + use: { + label: t("use"), + ariaLabel: t("use-menu"), + items: [ + { + label: "Get started", + description: "Your first steps to use Ethereum", + items: [ { - text: t("web3"), - to: "/web3/", + label: "Choose your wallet", + description: "Wallets allow you to use crypto", + href: "/wallets/find-wallet/", }, { - text: t("smart-contracts"), - to: "/smart-contracts/", + label: t("get-eth"), + description: "You need ether (ETH) to use Ethereum applications", + href: "/get-eth/", + }, + { + label: t("decentralized-applications-dapps"), + description: "Explore a rich ecosystem of apps using Ethereum", + href: "/dapps/", }, - { - text: t("quizzes-title"), - to: "/quizzes/", + label: "How to guides", + description: "Practical step-by-step guides to help you get started", + items: [ + // TODO: Add /guides/ link as first sub-item? + { + label: "How to create an Ethereum account", + description: "Anyone can create an Ethereum account at any time, for free with a wallet app", + href: "/guides/how-to-create-an-ethereum-account/", + }, + { + label: "How to use a wallet", + description: "Learn how to operate all the basic functions of a wallet", + href: "/guides/how-to-use-a-wallet/", + }, + { + label: "How to revoke smart contract access", + description: "Stay safe when interacting with smart contracts and applications in the Ethereum ecosystem", + href: "/guides/how-to-revoke-token-access/", + }, + ] }, ], }, { - text: t("ethereum-protocol"), + label: "Use cases", + description: "Discover different ideas for Ethereum usage", items: [ { - text: t("energy-consumption"), - to: "/energy-consumption/", + label: t("stablecoins"), + description: "Stablecoins are Ethereum tokens designed to stay at a fixed value", + href: "/stablecoins/", }, { - text: t("ethereum-roadmap"), - to: "/roadmap/", + label: t("nft-page"), + description: "A way to represent anything unique as an Ethereum-based asset", + href: "/nft/", }, { - text: t("eips"), - to: "/eips/", + label: t("defi-page"), + description: "A global, open alternative to the traditional financial market", + href: "/defi/", }, { - text: t("history-of-ethereum"), - to: "/history/", + label: t("dao-page"), + description: "Member-owned communities without centralized authority", + href: "/dao/", }, { - text: t("ethereum-whitepaper"), - to: "/whitepaper/", - }, + label: "Emerging use cases", + description: "Get to know other newer use cases for Ethereum", + items: [ + { + label: t("decentralized-identity"), + description: "Issue and own your unique decentralized identifiers", + href: "/decentralized-identity/", + }, + { + label: t("decentralized-social-networks"), + description: "Blockchain-based platforms for social interaction and content creation", + href: "/social-networks/", + }, + { + label: t("decentralized-science"), + description: "A global, open alternative to th current scientific system", + href: "/desci/", + }, + { + label: t("regenerative-finance"), + description: "An alternative economic system build on regenerative principles", + href: "/refi/", + }, + ] + } + ], + }, + { + label: "Stake", + description: "Earn rewards for securing Ethereum", + items: [ { - text: t("ethereum-glossary"), - to: "/glossary/", + label: "Staking home", + description: "An overview of different options for staking", + href: "/staking/", }, { - text: t("ethereum-governance"), - to: "/governance/", + label: "Staking from home", + description: "Run home hardware and personally add to the security and decentralization of the Ethereum network", + href: "/staking/solo/", }, { - text: t("bridges"), - to: "/bridges/", + label: "Staking with a service", + description: "Third-party node operators handle the operation of your validator client", + href: "/staking/saas/", }, { - text: t("zero-knowledge-proofs"), - to: "/zero-knowledge-proofs/", + label: "Pooled staking", + description: "Stake and earn rewards with any amount of ETH by joining with others", + href: "/staking/pools/", }, ], }, - ], + { + label: t("layer-2"), + description: "Cheaper and faster transactions for Ethereum", + href: "/layer-2/", + } + ] }, - developers: { - text: t("developers"), - ariaLabel: t("page-developers-aria-label"), + build: { + label: t("build"), + ariaLabel: t("build-menu"), items: [ { - text: t("developers-home"), - to: "/developers/", - }, - { - text: t("documentation"), - to: "/developers/docs/", + label: "Builder's home", + description: "A builder's manual for Ethereum—by builders, for builders", + href: "/developers/", }, { - text: t("tutorials"), - to: "/developers/tutorials/", + label: "Get started", + description: "Useful information for newcomers", + items: [ + { + label: "Tutorials", + description: "Curated list of community tutorials", + href: "/developers/tutorials/", + }, + { + label: "Learn by coding", + description: "Tools that help you experiment with Ethereum", + href: "/developers/learning-tools/", + }, + { + label: "Set up local environment", + description: "Choose and set up your Ethereum development stack", + href: "/developers/local-environment/", + }, + { + label: "Grants", + description: "A curated list by our community on projects that provide grant funding programs", + href: "/community/grants/", + } + ] }, { - text: t("learn-by-coding"), - to: "/developers/learning-tools/", + label: "Documentation", + description: "Docs to help you understand and build with Ethereum", + items: [ + { + label: "Overview", + description: "Your home for developer docs", + href: "/developers/docs/", + }, + { + label: "Foundational topics", + description: "Core fundamentals to develop on Ethereum", + href: "/developers/docs/intro-to-ethereum/", + }, + { + label: "Ethereum stack", + description: "Understand all the details of the Ethereum stack", + href: "/developers/docs/ethereum-stack/", + }, + { + label: "UX/UI design fundamentals", + description: "Description of unique web3 design challenges, best practices and user research insights", + href: "/developers/docs/design-and-ux/" + } + ], }, { - text: t("set-up-local-env"), - to: "/developers/local-environment/", - }, + label: "Enterprise", + description: "Business applications for Ethereum", + items: [ + { + label: "Mainnet Ethereum", + description: "Enterprise blockchain applications can be built on the public Ethereum Mainnet", + href: "/enterprise/", + }, + { + label: "Private Ethereum", + description: "Developer resources for private enterprise Ethereum", + href: "/enterprise/private-ethereum/" + } + ] + } ], }, - enterprise: { - text: t("enterprise"), - ariaLabel: t("enterprise-menu"), + participate: { + label: t("participate"), + ariaLabel: t("participate-menu"), items: [ { - text: t("mainnet-ethereum"), - to: "/enterprise/", + label: t("community-hub"), + description: "Overview on how to participate", + href: "/community/", }, { - text: t("private-ethereum"), - to: "/enterprise/private-ethereum/", + label: "Communities and events", + description: "Decentralization and freedom to participate for anyone", + items: [ + { + label: t("ethereum-online"), + description: "Hundreds of thousands of Ethereum enthusiasts father in these online communities", + href: "/community/online/", + }, + { + label: t("ethereum-events"), + description: "Every month there are major Ethereum events in-person and online", + href: "/community/events/", + }, + ] }, + { + label: "Ethereum.org", + description: "This website is community driven—join us and contribute too", + items: [ + { + label: "Contributing to ethereum.org", + description: "If you want to help, this will guide you", + href: "/contributing/", + }, + { + label: "Translation program", + description: "A collaborative effort to translate ethereum.org to all languages", + href: "/contributing/translation-program/", + }, + { + label: "About ethereum.org", + description: "A public, open-source project for the Ethereum community", + href: "/about/", + }, + ], + } ], }, - community: { - text: t("community"), - ariaLabel: t("community-menu"), + research: { + label: t("research"), + ariaLabel: t("research-menu"), items: [ { - text: t("community-hub"), - to: "/community/", - }, - { - text: t("ethereum-online"), - to: "/community/online/", - }, - { - text: t("ethereum-events"), - to: "/community/events/", - }, - { - text: t("get-involved"), - to: "/community/get-involved/", - }, - { - text: t("open-research"), - to: "/community/research/", - }, - { - text: t("grants"), - to: "/community/grants/", + label: t("ethereum-whitepaper"), + description: "The original Ethereum whitepaper written by Vitalik Buterin in 2014", + href: "/whitepaper/", }, { - text: t("ethereum-support"), - to: "/community/support/", + label: "Roadmap", + description: "The path to more scalability, security and sustainabillity for Ethereum", + items: [ + { + label: "Improved security", + description: "Making sure Ethereum stays resilient to all kinds of attacks into the future", + href: "/roadmap/security/", + }, + { + label: "Cheaper transactions", + description: "Network updates to further reduce transaction costs and speed", + href: "/roadmap/scaling/", + }, + { + label: "Better user experience", + description: "Using Ethereum needs to be simplified", + href: "/roadmap/user-experience/", + }, + { + label: "Future-proofing", + description: "Solidifying Ethereum as a robust and decentralized network", + href: "/roadmap/future-proofing/", + }, + ] }, { - text: t("language-resources"), - to: "/community/language-resources/", + label: "Research and development", + description: "PRocesses used to improve Ethereum", + items: [ + { + label: "Technical history of Ethereum", + description: "A timeline of all the major forks and updates", + href: "/history/", + }, + { + label: "Open research", + description: "One of the primary strengths of Ethereum is its active research community", + href: "/community/research/", + }, + { + label: "Ethereum improvement proposals (EIPs)", + description: "Standards that specify new features or processes", + href: "/eips/", + }, + { + label: "Governance", + description: "The process involved in upgrading the Ethereum protocol", + href: "/governance/", + }, + ] }, ], }, } - const ednLinks: Array = [ - { - text: t("home"), - to: "/developers/", - isPartiallyActive: false, - }, - { - text: t("docs"), - to: "/developers/docs/", - }, - { - text: t("tutorials"), - to: "/developers/tutorials/", - }, - { - text: t("learn-by-coding"), - to: "/developers/learning-tools/", - }, - { - text: t("set-up-local-env"), - to: "/developers/local-environment/", - }, - ] - - let mobileLinkSections = cloneDeep(linkSections) - const toggleMenu = (): void => { - setIsMenuOpen((prev) => !prev) - } - - const shouldShowSubNav = path.includes("/developers") - const splitPath = path.split("/") + const splitPath = asPath.split("/") const fromPageParameter = splitPath.length > 1 && splitPath[1] !== "languages" ? `?${FROM_QUERY}=/${splitPath.slice(1).join("/")}` : "" - const changeColorMode = () => { - toggleColorMode() + const toggleColorMode = () => { + chakraToggleColorMode() trackCustomEvent({ eventCategory: "nav bar", eventAction: "click", - eventName: isDarkTheme ? "light mode" : "dark mode", // This will be inverted as the state is changing + eventName: colorToggleEvent, }) } const mobileNavProps = { - isMenuOpen, - isDarkTheme, - toggleMenu, - toggleTheme: changeColorMode, - linkSections: mobileLinkSections, fromPageParameter, + isOpen, + toggleColorMode, + onToggle, } return { - toggleColorMode: changeColorMode, - isDarkTheme, - ednLinks, - linkSections, - shouldShowSubNav, fromPageParameter, + linkSections, mobileNavProps, + toggleColorMode, } } diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 2776770d91c..7bb3c926bbd 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -16,6 +16,8 @@ "beacon-chain": "Beacon Chain", "bridges": "Blockchain bridges", "bug-bounty": "Bug bounty", + "build": "Build", + "build-menu": "Build menu", "clear": "Clear", "close": "Close", "community": "Community", @@ -39,6 +41,7 @@ "decentralized-identity": "Decentralized identity", "decentralized-social-networks": "Decentralized social networks", "decentralized-science": "Decentralized science (DeSci)", + "description": "Description for nav item", "defi-page": "Decentralized finance (DeFi)", "design": "Design", "design-principles": "Design Principles", @@ -155,6 +158,8 @@ "page-developers-aria-label": "Developers' Menu", "page-index-meta-title": "Home", "page-last-updated": "Page last updated", + "participate": "Participate", + "participate-menu": "Participate menu", "pbs": "Proposer-builder separation", "pools": "Pooled staking", "privacy-policy": "Privacy policy", @@ -165,6 +170,8 @@ "refresh": "Please refresh the page.", "return-home": "return home", "roadmap": "Ethereum roadmap", + "research": "Research", + "research-menu": "Research menu", "resources": "Translation resources", "regenerative-finance": "Regenerative finance (ReFi)", "run-a-node": "Run a node", @@ -212,8 +219,10 @@ "try-using-search": "Try using search to find what you're looking for or", "tutorials": "Tutorials", "up": "Up", + "use": "Use", "use-ethereum": "Use Ethereum", "use-ethereum-menu": "Use Ethereum menu", + "use-menu": "Use menu", "user-experience": "User experience", "verkle-trees": "Verkle trees", "wallets": "Wallets", From c91dac5e70c072684886d1210df35d13da5747b0 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 16 Jan 2024 21:45:13 -0800 Subject: [PATCH 023/478] refactor: update Nav with new useNav, rm subnav --- src/components/Nav/Dropdown.tsx | 8 +-- src/components/Nav/index.tsx | 93 ++++++++++----------------------- src/layouts/RootLayout.tsx | 2 +- 3 files changed, 32 insertions(+), 71 deletions(-) diff --git a/src/components/Nav/Dropdown.tsx b/src/components/Nav/Dropdown.tsx index 43b1a1b0214..700e78c54dd 100644 --- a/src/components/Nav/Dropdown.tsx +++ b/src/components/Nav/Dropdown.tsx @@ -4,7 +4,7 @@ import { Box, Fade, Flex, Icon, ListItem } from "@chakra-ui/react" import { BaseLink, type LinkProps } from "../Link" -import { ISection } from "./types" +import { NavSectionDetail } from "./types" import { useOnClickOutside } from "@/hooks/useOnClickOutside" @@ -41,7 +41,7 @@ const DropdownContext = React.createContext(null) export interface IProps { children?: React.ReactNode - section: ISection + section: NavSectionDetail } const NavDropdown: React.FC & { @@ -76,7 +76,7 @@ const NavDropdown: React.FC & { } } - const ariaLabel = section.ariaLabel || section.text + const ariaLabel = section.ariaLabel || section.label return ( & { }, }} > - {section.text} + {section.label} = ({ path }) => { - const { - ednLinks, - fromPageParameter, - isDarkTheme, - shouldShowSubNav, - toggleColorMode, - linkSections, - mobileNavProps, - } = useNav({ path }) +const Nav = () => { + const { fromPageParameter, toggleColorMode, linkSections, mobileNavProps } = + useNav() + const { locale } = useRouter() const { t } = useTranslation("common") const searchModalDisclosure = useDisclosure() const navWrapperRef = useRef(null) + const themeIcon = useColorModeValue(, ) + const themeIconAriaLabel = useColorModeValue( + "Switch to Dark Theme", + "Switch to Light Theme" + ) + return ( - + = ({ path }) => { maxW="container.2xl" > = ({ path }) => { justifyContent={{ base: "flex-end", lg: "space-between" }} ms={{ base: 3, xl: 8 }} > - + = ({ path }) => { {/* Mobile */} = ({ path }) => { : } - aria-label={ - isDarkTheme - ? "Switch to Light Theme" - : "Switch to Dark Theme" - } + icon={themeIcon} + aria-label={themeIconAriaLabel} variant="ghost" isSecondary px={1.5} @@ -99,9 +99,9 @@ const Nav: FC = ({ path }) => { color: "primary.hover", }} onClick={toggleColorMode} - > + /> } variant="ghost" @@ -122,45 +122,6 @@ const Nav: FC = ({ path }) => { - {shouldShowSubNav && ( - - {ednLinks.map((link, idx) => ( - - {link.text} - - ))} - - )} ) } diff --git a/src/layouts/RootLayout.tsx b/src/layouts/RootLayout.tsx index 00c6ec18dec..d610e58336d 100644 --- a/src/layouts/RootLayout.tsx +++ b/src/layouts/RootLayout.tsx @@ -50,7 +50,7 @@ export const RootLayout = ({ -
    -詳細については、Tim Beiko によるブログ投稿マージがイーサリアムのアプリケーションレイヤーに与える影響をご覧ください。 +詳細については、Tim Beikoによるブログ投稿マージがイーサリアムのアプリケーションレイヤーに与える影響をご覧ください。 ## マージとエネルギー消費 {#merge-and-energy} -マージは、イーサリアムでのプルーフ・オブ・ワークの終わりを意味し、より持続可能で環境に優しいイーサリアムの時代をスタートさせました。 イーサリアムのエネルギー消費量は推定で 99.95%減少し、環境に優しいブロックチェーンとなりました。 [イーサリアムのエネルギー消費の詳細](/energy-consumption/) +マージは、イーサリアムでのプルーフ・オブ・ワークの終わりを意味し、より持続可能で環境に優しいイーサリアムの時代をスタートさせました。 イーサリアムのエネルギー消費量は推定で99.95%減少し、環境に優しいブロックチェーンとなりました。 [イーサリアムのエネルギー消費の詳細](/energy-consumption/) ## マージとスケーリング {#merge-and-scaling} @@ -122,9 +121,9 @@ contentPreview="False. Anyone is free to sync their own self-verified copy of Et イーサリアムのノードには、ブロックを提案できるノードとできないノードがあります。 -ブロックを提案するノードは、イーサリアムの全ノードのうち、ごくわずかに過ぎません。 このカテゴリには、プルーフ・オブ・ワーク(PoW) のマイニングノードとプルーフ・オブ・ステーク(PoS) のバリデータノードがあります。 このカテゴリでは、時折次のブロックを提案し、プロトコル報酬を得る能力と引き換えに、経済的リソース(プルーフ・オブ・ワークでは GPU ハッシュパワー、プルーフ・オブ・ステークでは ETH のステーキング)を必要とします。 +ブロックを提案するノードは、イーサリアムの全ノードのうち、ごくわずかに過ぎません。 このカテゴリには、プルーフ・オブ・ワーク(PoW) のマイニングノードとプルーフ・オブ・ステーク(PoS) のバリデータノードがあります。 このカテゴリでは、時折次のブロックを提案し、プロトコル報酬を得る能力と引き換えに、経済的リソース(プルーフ・オブ・ワークではGPUハッシュパワー、プルーフ・オブ・ステークではETHのステーキング)を必要とします。 -ネットワーク上の他のノード (例: 大多数)は、利用可能なストレージとインターネット接続の 1〜2TB の消費者グレードのコンピュータを超えて経済的なリソースを何もコミットする必要はありません。 これらのノードはブロックを提案しませんが、新しいブロックをリスニングし、ブロックの出現時にネットワークのコンセンサスルールに従って有効性を検証し、すべてのブロック提案者に責任を持たせます。このようにネットワークを保護する重要な役割を担っています。 ブロックが有効と判断されれば、ノードはそのブロックをネットワークを通じて伝搬し続けます。 何らかの理由でブロックが無効と判断された場合、ノードソフトウェアはそのブロックを無効とみなし、伝搬を停止させます。 +ネットワーク上の他のノード (例: 大多数)は、利用可能なストレージとインターネット接続の1〜2TBの消費者グレードのコンピュータを超えて経済的なリソースを何もコミットする必要はありません。 これらのノードはブロックを提案しませんが、新しいブロックをリスニングし、ブロックの出現時にネットワークのコンセンサスルールに従って有効性を検証し、すべてのブロック提案者に責任を持たせます。このようにネットワークを保護する重要な役割を担っています。 ブロックが有効と判断されれば、ノードはそのブロックをネットワークを通じて伝搬し続けます。 何らかの理由でブロックが無効と判断された場合、ノードソフトウェアはそのブロックを無効とみなし、伝搬を停止させます。 両方の合意メカニズム(プルーフ・オブ・ワークまたはプルーフ・オブ・ステーク)のもとで、誰でもブロックを生成しないノードを実行できます。可能な限り多くのユーザーにノードの実行を推奨します。 ノードの運用はイーサリアムに非常に大きな貢献となり、セキュリティやプライバシー、検閲耐性を向上させるなど、ノードを運用するすべての人もその恩恵を受けることになります。 @@ -140,7 +139,7 @@ contentPreview="False. The Merge was a change of consensus mechanism, not an exp ガス代は、ネットワーク容量に対するネットワーク需要の産物です。 マージにより、コンセンサスにプルーフ・オブ・ワークからプルーフ・オブ・ステークに移行しましたが、ネットワーク容量やスループットに直接影響するパラメーターは大幅に変更されませんでした。 -ロールアップを中心としたロードマップでは、レイヤー 2でのユーザーアクティビティのスケーリングに集中して取り組み、レイヤー 1 メインネットをロールアップのデータ保存に最適化された安全な分散型決済レイヤーとして稼働させ、ロールアップトランザクションの大幅な低コスト化を目指しています。 プルーフ・オブ・ステークへの移行は、これを実現するための重要な布石となります。 ガスとフィーについての詳細 +ロールアップを中心としたロードマップでは、レイヤー2でのユーザーアクティビティのスケーリングに集中して取り組み、レイヤー1メインネットをロールアップのデータ保存に最適化された安全な分散型決済レイヤーとして稼働させ、ロールアップトランザクションの大幅な低コスト化を目指しています。 プルーフ・オブ・ステークへの移行は、これを実現するための重要な布石となります。 ガスとフィーについての詳細 @@ -149,9 +148,9 @@ title="誤解: "マージにより、トランザクションが大幅に contentPreview="False. Though some slight changes exist, transaction speed is mostly the same on layer 1 now as it was before The Merge."> トランザクションの「速度」は、ブロックに含まれるまでの時間や確定までの時間など、いくつかの方法で測定することができます。 いずれも若干の違いはありますが、ユーザーが気づくようなものではありません。 -従来、プルーフ・オブ・ワークでの目標は約 13.3 秒ごとに新しいブロックを生成することでした。 プルーフ・オブ・ステークの下では、スロットが 12 秒ごとに正確に発生し、そのたびにバリデータがブロックを公開する機会があります。 ほとんどのスロットにはブロックがありますが、必ずしもすべてのスロットにブロックがあるわけではありません (例: バリデータがオフラインの場合など) 。 プルーフ・オブ・ステークでは、プルーフ・オブ・ワークに比べてブロックの生成頻度が 10%程度高くなっています。 これはかなり些細な変更のため、ユーザーが気付くほどではありません。 +従来、プルーフ・オブ・ワークでの目標は約13.3秒ごとに新しいブロックを生成することでした。 プルーフ・オブ・ステークの下では、スロットが12秒ごとに正確に発生し、そのたびにバリデータがブロックを公開する機会があります。 ほとんどのスロットにはブロックがありますが、必ずしもすべてのスロットにブロックがあるわけではありません (例: バリデータがオフラインの場合など) 。 プルーフ・オブ・ステークでは、プルーフ・オブ・ワークに比べてブロックの生成頻度が10%程度高くなっています。 これはかなり些細な変更のため、ユーザーが気付くほどではありません。 -プルーフ・オブ・ステークにより、以前は存在しなかったトランザクションのファイナリティのコンセプトが導入されました。 プルーフ・オブ・ワークでは、トランザクションが含まれるブロックの改ざんは、新たなブロックがマイニングされるたびに、指数関数的に難しくなっていきますが、可能性が完全にゼロになることはありません。 プルーフ・オブ・ステークでは、ブロックはエポック(6.4 分間、この間に 32 ブロックが生成可能)に束ねられ、バリデータが投票します。 1 つのエポックの終了時に、バリデータはそのエポックを「正当」とみなすかどうか投票します。 バリデータがエポックの正当性に同意した場合、次のエポックで確定されます。 確定したトランザクションを取り消すには、ステーキングされた全 ETH の 3 分の 1 以上を取得し、焼却する必要があるため、経済的に不可能となります。 +プルーフ・オブ・ステークにより、以前は存在しなかったトランザクションのファイナリティのコンセプトが導入されました。 プルーフ・オブ・ワークでは、トランザクションが含まれるブロックの改ざんは、新たなブロックがマイニングされるたびに、指数関数的に難しくなっていきますが、可能性が完全にゼロになることはありません。 プルーフ・オブ・ステークでは、ブロックはエポック(6.4分間、この間に32ブロックが生成可能)に束ねられ、バリデータが投票します。 1つのエポックの終了時に、バリデータはそのエポックを「正当」とみなすかどうか投票します。 バリデータがエポックの正当性に同意した場合、次のエポックで確定されます。 確定したトランザクションを取り消すには、ステーキングされた全ETHの3分の1以上を取得し、焼却する必要があるため、経済的に不可能となります。 @@ -159,9 +158,9 @@ contentPreview="False. Though some slight changes exist, transaction speed is mo title="誤解: "マージにより、ステーキングの引き出しができるようになった"" contentPreview="False, but staking withdrawals have since been enabled via the Shanghai/Capella upgrade."> -マージ後の初期段階では、ステーカーはブロック提案の結果として獲得したフィーチップと MEV のみにアクセスできました。 これらの報酬は、バリデータが管理する非ステーキングアカウント (フィーの受取人と呼ばれる) に入金され、すぐに利用できます。 これらの報酬は、バリデータの職務を遂行するためのプロトコル報酬と別です。 +マージ後の初期段階では、ステーカーはブロック提案の結果として獲得したフィーチップとMEVのみにアクセスできました。 これらの報酬は、バリデータが管理する非ステーキングアカウント (フィーの受取人と呼ばれる) に入金され、すぐに利用できます。 これらの報酬は、バリデータの職務を遂行するためのプロトコル報酬と別です。 -上海/カペラネットワークのアップグレード以降、 ステーカーは引き出しアドレスを指定して、超過しているステーキング残高(32ETH を越えた分のプロトコル報酬)の自動支払を受け取れるようになりました。 このアップグレードにより、バリデータがネットワークから抜け出すときに、ロックを解除して残高全体を回収できるようになりました。 +上海/カペラネットワークのアップグレード以降、 ステーカーは引き出しアドレスを指定して、超過しているステーキング残高(32ETHを越えた分のプロトコル報酬)の自動支払を受け取れるようになりました。 このアップグレードにより、バリデータがネットワークから抜け出すときに、ロックを解除して残高全体を回収できるようになりました。 ステーキングの引き出しについての詳細 @@ -170,18 +169,18 @@ contentPreview="False, but staking withdrawals have since been enabled via the S -上海/カペラアップグレードにより出金が可能になってから、バリデータは 32ETH を超えるステーキング残高を出金するよう奨励されています。これらの資金は利回りに追加されず、ロックされているためです。 年換算利回り(ステークした ETH の合計により決定)によっては、バリデータをやめて残高を引き出すか、報酬を使ってさらにステーキングして、より多くの利回りを得ることもできます。 +上海/カペラアップグレードにより出金が可能になってから、バリデータは32ETHを超えるステーキング残高を出金するよう奨励されています。これらの資金は利回りに追加されず、ロックされているためです。 年換算利回り(ステークしたETHの合計により決定)によっては、バリデータをやめて残高を引き出すか、報酬を使ってさらにステーキングして、より多くの利回りを得ることもできます。 -ステーキングの重要な注意点として、全バリデータの退出はプロトコルによってレート制限が設定されており、エポックごとに(6.4 分ごとに)退出できるバリデータの数は限られています。 この制限はアクティブなバリデータの数に応じて変動しますが、1 日の間にネットワークから退出できるのは、ステークされた ETH の合計の約 0.33%になります。 +ステーキングの重要な注意点として、全バリデータの退出はプロトコルによってレート制限が設定されており、エポックごとに(6.4分ごとに)退出できるバリデータの数は限られています。 この制限はアクティブなバリデータの数に応じて変動しますが、1日の間にネットワークから退出できるのは、ステークされたETHの合計の約0.33%になります。 -これにより、ステークされた資金の大量流出を防ぎます。 さらに、プロトコルがスラッシングペナルティを執行する前に、ステークされた全ての ETH の大部分にアクセスできる攻撃者がスラッシング対象の違反をして、同じエポック内で違反しているバリデータの残高をすべて終了または引き出してしまうことを防ぎます。 +これにより、ステークされた資金の大量流出を防ぎます。 さらに、プロトコルがスラッシングペナルティを執行する前に、ステークされた全てのETHの大部分にアクセスできる攻撃者がスラッシング対象の違反をして、同じエポック内で違反しているバリデータの残高をすべて終了または引き出してしまうことを防ぎます。 また、年換算利回りは意図的にダイナミックに設定されており、ステーカー市場がバリデータの報酬額をバランスよく調整できるようになっています。 レートが低すぎる場合は、ステーカーはプロトコルが制限するレート範囲内で退出していきます。 その結果、残っているステーカーの年換算利回りが徐々に上昇し、新しいステーカーを引き寄せたり、ステーカーが再度戻ってくることになります。 -## Eth2 の名称廃止 {#eth2} +## Eth2の名称廃止 {#eth2} -「Eth2」という用語は廃止されました。 「Eth1」と「Eth2」が単一チェーンに統合された今では、2 つのイーサリアムネットワークを区別する必要はなくなり「イーサリアム」のみとなりました。 +「Eth2」という用語は廃止されました。 「Eth1」と「Eth2」が単一チェーンに統合された今では、2つのイーサリアムネットワークを区別する必要はなくなり「イーサリアム」のみとなりました。 混乱をなくすため、次の名称が変更になりました。 @@ -200,7 +199,7 @@ contentPreview="False. Validator exits are rate limited for security reasons."> マージにより、元のメインネットの実行レイヤーへ、新しくコンセンサスレイヤーとしてビーコンチェーンが正式に採用されました。 マージ以降、バリデータがイーサリアムメインネットの保護にあたり、[プルーフ・オブ・ワーク](/developers/docs/consensus-mechanisms/pow/)によるマイニングはブロック生成の有効な手段ではなくなっています。 -ブロックは、コンセンサスに参加する権利を得るために、ETH をステーキングしたノードを検証することで提案されます。 これらのアップグレードは、シャーディングを含む将来のスケーラビリティのアップグレードの準備段階となります。 +ブロックは、コンセンサスに参加する権利を得るために、ETHをステーキングしたノードを検証することで提案されます。 これらのアップグレードは、シャーディングを含む将来のスケーラビリティのアップグレードの準備段階となります。 ビーコンチェーン @@ -208,15 +207,15 @@ contentPreview="False. Validator exits are rate limited for security reasons."> ### マージと上海アップグレード {#merge-and-shanghai} -プルーフ・オブ・ステークへの移行を簡略化し、移行作業に最大限の注力を注ぐため、マージでは、ステーキングした ETH の引き出し機能など、いくつかの予定されたいた機能が対象外となりました。 この機能は別途、上海/カペラアップグレードのアップグレードで有効化されました。 +プルーフ・オブ・ステークへの移行を簡略化し、移行作業に最大限の注力を注ぐため、マージでは、ステーキングしたETHの引き出し機能など、いくつかの予定されたいた機能が対象外となりました。 この機能は別途、上海/カペラアップグレードのアップグレードで有効化されました。 -さらにご興味のある方は、ヴィタリックが 2021 年 4 月の ETHGlobal イベントで発表した[マージ後の予定](https://youtu.be/7ggwLccuN5s?t=101)をご覧ください。 +さらにご興味のある方は、ヴィタリックが2021年4月のETHGlobalイベントで発表した[マージ後の予定](https://youtu.be/7ggwLccuN5s?t=101)をご覧ください。 ### マージとシャーディング {#merge-and-data-sharding} -もともとの計画では、マージ前にシャーディングに取り組み、スケーラビリティに対応する予定でした。 しかし、[レイヤー 2 スケーリングソリューション](/layer-2/)の高まりにより、まずはプルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行が優先されました。 +もともとの計画では、マージ前にシャーディングに取り組み、スケーラビリティに対応する予定でした。 しかし、[レイヤー2スケーリングソリューション](/layer-2/)の高まりにより、まずはプルーフ・オブ・ワークからプルーフ・オブ・ステークへの移行が優先されました。 -シャーディング計画は急速に進展していますが、トランザクションの実行をスケールリングするレイヤー 2 技術の台頭と成功により、ロールアップコントラクトからの圧縮コールデータ(calldata)の保存を負荷分散する最適な方法を見つけることにシフトしています。これにより、ネットワーク容量を指数関数的に増やすことができるようになります。 プルーフ・オブ・ステークへの移行がなければ、これは実現不可能なことでした。 +シャーディング計画は急速に進展していますが、トランザクションの実行をスケールリングするレイヤー2技術の台頭と成功により、ロールアップコントラクトからの圧縮コールデータ(calldata)の保存を負荷分散する最適な方法を見つけることにシフトしています。これにより、ネットワーク容量を指数関数的に増やすことができるようになります。 プルーフ・オブ・ステークへの移行がなければ、これは実現不可能なことでした。 シャーディング画像 diff --git a/public/content/translations/ja/roadmap/merge/issuance/index.md b/public/content/translations/ja/roadmap/merge/issuance/index.md index 0af063497d9..fb07218b074 100644 --- a/public/content/translations/ja/roadmap/merge/issuance/index.md +++ b/public/content/translations/ja/roadmap/merge/issuance/index.md @@ -4,25 +4,25 @@ description: マージがETHの供給に与えた影響についての概要 lang: ja --- -# マージが ETH の供給に与えた影響について {#how-the-merge-impacts-ETH-supply} +# マージがETHの供給に与えた影響について {#how-the-merge-impacts-ETH-supply} -マージとは、2022 年 9 月にイーサリアムネットワークがプルーフ・オブ・ワークからプルーフ・オブ・ステークへ移行したアップデートのことです。 この移行により、ETH の発行方法が変更されました。 以前は、実行レイヤー( メインネット)とコンセンサスレイヤー( ビーコンチェーン)の 2 つのレイヤーから発行されていましたが、 マージ以降は、実行レイヤーで発行されなくなりました。 それでは、詳しく見ていきましょう。 +マージとは、2022年9月にイーサリアムネットワークがプルーフ・オブ・ワークからプルーフ・オブ・ステークへ移行したアップデートのことです。 この移行により、ETHの発行方法が変更されました。 以前は、実行レイヤー( メインネット)とコンセンサスレイヤー( ビーコンチェーン)の2つのレイヤーから発行されていましたが、 マージ以降は、実行レイヤーで発行されなくなりました。 それでは、詳しく見ていきましょう。 -## ETH を発行するコンポーネント {#components-of-eth-issuance} +## ETHを発行するコンポーネント {#components-of-eth-issuance} -ETH の供給は、「発行」と「バーン」という 2 つの主要な要因に分けられます。 +ETHの供給は、「発行」と「バーン」という2つの主要な要因に分けられます。 -ETH の**発行**は、ETH を作成するプロセスで以前は存在しなかった仕組みです。 ETH を破壊して流通から排除することを**バーン**といいます。 発行とバーンの割合は、いくつかのパラメータに基づいて計算されます。発行とバーンのバランスによって、イーサのインフレ/デフレ率が決まります。 +ETHの**発行**は、ETHを作成するプロセスで以前は存在しなかった仕組みです。 ETHを破壊して流通から排除することを**バーン**といいます。 発行とバーンの割合は、いくつかのパラメータに基づいて計算されます。発行とバーンのバランスによって、イーサのインフレ/デフレ率が決まります。 -- プルーフ・オブ・ステークに移行する前、マイナー全体で、1 日あたり約 13,000ETH を発行していました。 -- ステーキングされている計約 1,400 万 ETH に基づいて、1 日あたり約 1,700ETH がステーカーに発行されます。 -- ステーキングによる正確な発行量は、ステーキングされた ETH の総量に応じて変動します。 -- **マージ以降、1 日あたり最大 1,700ETH しか発行されなくなり、新たな ETH の発行総量は、最大で約 88%減少しています** -- バーンは、ネットワークの需要に応じて変動します。 とある日に、平均のガス価格が 16Gwei 以上になると、バリデータによって発行される約 1,700ETH が実質的に相殺されるので、その日の純 ETH インフレ率はゼロ以下になります。 +- プルーフ・オブ・ステークに移行する前、マイナー全体で、1日あたり約13,000ETHを発行していました。 +- ステーキングされている計約1,400万ETHに基づいて、1日あたり約 1,700ETHがステーカーに発行されます。 +- ステーキングによる正確な発行量は、ステーキングされたETHの総量に応じて変動します。 +- **マージ以降、1日あたり最大 1,700ETHしか発行されなくなり、新たなETHの発行総量は、最大で約88%減少しています** +- バーンは、ネットワークの需要に応じて変動します。 とある日に、平均のガス価格が16Gwei以上になると、バリデータによって発行される約1,700ETHが実質的に相殺されるので、その日の純ETHインフレ率はゼロ以下になります。 @@ -30,29 +30,29 @@ title="ETHの発行についての概要"> ### 実行レイヤーでの発行 {#el-issuance-pre-merge} -プルーフ・オブ・ワークでは、マイナーは実行レイヤーのみとやり取りを行い、最初に次のブロックを解決したマイナーがブロック報酬を受け取っていました。 2019 年の[コンスタンティノープルアップグレード](/history/#constantinople)以降、ブロックごとの報酬は 2ETH になりました。 マイナーは、[オマー](/glossary/#ommer)ブロック(最長または正規チェーンに含まれない有効なブロック)を発行しても報酬を受けました。 オマーブロックあたりの報酬は最大 1.75 ETH で、正規ブロックから発行された報酬とは*別*でした。 マイニングのプロセスは経済的に集中化された活動であり、これを維持するには、ETH の発行量を歴史的に高い水準に維持する必要があったのです。 +プルーフ・オブ・ワークでは、マイナーは実行レイヤーのみとやり取りを行い、最初に次のブロックを解決したマイナーがブロック報酬を受け取っていました。 2019年の[コンスタンティノープルアップグレード](/history/#constantinople)以降、ブロックごとの報酬は2ETHになりました。 マイナーは、[オマー](/glossary/#ommer)ブロック(最長または正規チェーンに含まれない有効なブロック)を発行しても報酬を受けました。 オマーブロックあたりの報酬は最大1.75 ETHで、正規ブロックから発行された報酬とは_別_でした。 マイニングのプロセスは経済的に集中化された活動であり、これを維持するには、ETHの発行量を歴史的に高い水準に維持する必要があったのです。 ### コンセンサスレイヤーでの発行 {#cl-issuance-pre-merge} -2020 年に稼働を開始した[ビーコンチェーン](/history/#beacon-chain-genesis)では、 マイナーに代わって、バリデータがプルーフ・オブ・ステークでネットワークを保護します。 ビーコンチェーンは、イーサリアムユーザーがメインネット(実行レイヤー)上のスマートコントラクトに ETH を一方向に入金することによってブートされます。ビーコンチェーンは、この入金をリッスンしており、ユーザーに対して新しいチェーンに同額の ETH をクレジットします。 マージが起こるまで、ビーコンチェーンのバリデータは、トランザクションの処理を行わず、基本的にはバリデータプールの状態についてのコンセンサスを形成していました。 +2020年に稼働を開始した[ビーコンチェーン](/history/#beacon-chain-genesis)では、 マイナーに代わって、バリデータがプルーフ・オブ・ステークでネットワークを保護します。 ビーコンチェーンは、イーサリアムユーザーがメインネット(実行レイヤー)上のスマートコントラクトにETHを一方向に入金することによってブートされます。ビーコンチェーンは、この入金をリッスンしており、ユーザーに対して新しいチェーンに同額のETHをクレジットします。 マージが起こるまで、ビーコンチェーンのバリデータは、トランザクションの処理を行わず、基本的にはバリデータプールの状態についてのコンセンサスを形成していました。 -ビーコンチェーンのバリデータは、チェーンの状態を証明し、ブロックを提案することで、報酬として ETH を受け取ります。 報酬(またはペナルティ)は、バリデータのパフォーマンスに応じて、各エポック(6.4 分ごと)に計算、分配されます。 バリデータの報酬は、プルーフ・オブ・ワーク時代のマイニング報酬(約 13.5 秒ごとに 2ETH)と比べて**大幅**に少なくなっています。これは、バリデータノードの運用にそれほどコストがかからないため、高い報酬は必要ないからです。 +ビーコンチェーンのバリデータは、チェーンの状態を証明し、ブロックを提案することで、報酬としてETHを受け取ります。 報酬(またはペナルティ)は、バリデータのパフォーマンスに応じて、各エポック(6.4分ごと)に計算、分配されます。 バリデータの報酬は、プルーフ・オブ・ワーク時代のマイニング報酬(約13.5秒ごとに2ETH)と比べて**大幅**に少なくなっています。これは、バリデータノードの運用にそれほどコストがかからないため、高い報酬は必要ないからです。 ### マージ以前の発行についての概要 {#pre-merge-issuance-breakdown} -総 ETH 供給量: **約 120,520,000ETH**(2022 年 9 月のマージ時点) +総ETH供給量: **約120,520,000ETH**(2022年9月のマージ時点) **実行レイヤーでの発行** -- 13.3 秒あたり 2.08ETH と推定されています。\*: 年間で**約 4,930,000**ETH が発行される計算になります。 -- 結果、**約 4.09%**のインフレ率(年間 493 万/合計 1 億 2050 万)。 -- \*この計算には、正規ブロックごとに発行される 2ETH と、その期間におけるオマーブロックの平均 0.08ETH が含まれています。 また、[ディフィカルティボム](/glossary/#difficulty-bomb)の影響を受けないベースラインブロック時間ターゲットである 13.3 秒を使用しています。 ([参照元をご覧ください](https://bitinfocharts.com/ethereum/)) +- 13.3秒あたり2.08ETHと推定されています。\*: 年間で**約4,930,000**ETHが発行される計算になります。 +- 結果、**約4.09%**のインフレ率(年間493万/合計1億2050万)。 +- \*この計算には、正規ブロックごとに発行される2ETHと、その期間におけるオマーブロックの平均0.08ETHが含まれています。 また、[ディフィカルティボム](/glossary/#difficulty-bomb)の影響を受けないベースラインブロック時間ターゲットである13.3秒を使用しています。 ([参照元をご覧ください](https://bitinfocharts.com/ethereum/)) **コンセンサスレイヤーでの発行** -- ステーキングされた合計が 14,000,000ETH だと、ETH 発行レートは、1 日あたり約 1700ETH になります。([参照元をご覧ください](https://ultrasound.money/)) -- 年間で**約 620,500**ETH が発行される計算になります。 -- 結果、**約 0.52%**のインフレ率(年間 62 万 500/合計 1 憶 1930 万)。 +- ステーキングされた合計が14,000,000ETHだと、ETH発行レートは、1日あたり約1700ETHになります。([参照元をご覧ください](https://ultrasound.money/)) +- 年間で**約620,500**ETHが発行される計算になります。 +- 結果、**約0.52%**のインフレ率(年間62万500/合計1憶1930万)。 合計年発行率(マージ前): 約4.61% (4.09% + 0.52%)

    @@ -60,7 +60,7 @@ title="ETHの発行についての概要"> 約11.3%がコンセンサスレイヤーのステーカーへ発行されました (0.52 / 4.61 * 100) 。
    -## マージ以降(現在) {#post-merge} +## マージ以降(現在) {#post-merge} ### 実行レイヤーでの発行 {#el-issuance-post-merge} @@ -68,67 +68,67 @@ title="ETHの発行についての概要"> ### コンセンサスレイヤーでの発行 {#cl-issuance-post-merge} -コンセンサスレイヤーでの発行は、マージ以前から同様に現在も続いており、ブロックを証明して提案したバリデータには少額の報酬が支払われます。 報酬は、コンセンサスレイヤー内で管理される*バリデータ残高*に積み立てられ、 メインネット上でトランザクションが可能な現行のアカウント (「実行」アカウント)とは別のイーサリアムアカウントに蓄積されます。そのため、他のイーサリアムアカウントとの自由なトランザクションはできません。 また、これらのアカウントの資金は、指定された 1 つの実行アドレス以外には引き出すことができません。 +コンセンサスレイヤーでの発行は、マージ以前から同様に現在も続いており、ブロックを証明して提案したバリデータには少額の報酬が支払われます。 報酬は、コンセンサスレイヤー内で管理される_バリデータ残高_に積み立てられ、 メインネット上でトランザクションが可能な現行のアカウント (「実行」アカウント)とは別のイーサリアムアカウントに蓄積されます。そのため、他のイーサリアムアカウントとの自由なトランザクションはできません。 また、これらのアカウントの資金は、指定された1つの実行アドレス以外には引き出すことができません。 -2023 年 4 月に実施された上海/カペラのアップグレードにより、ステーカーは引き出しが可能になりました。 ただし、*収益/報酬(32ETH を越える残高)*は、ステークウェイト(最大 32)として貢献しないため、引き出さない方がよいとされています。 +2023年4月に実施された上海/カペラのアップグレードにより、ステーカーは引き出しが可能になりました。 ただし、_収益/報酬(32ETHを越える残高)_は、ステークウェイト(最大32)として貢献しないため、引き出さない方がよいとされています。 ステーカーは、バリデータの残高すべてを引き出して、アクティビティを終了することもできます。 ただし、イーサリアムの安定性を確保するために、同時に終了するバリデータの数には上限が設けられています。 -1 日あたち、すべてのバリデータのうち約 0.33%が終了できます。 デフォルトでは、エポックごとに 4 台のバリデータが終了できます(6.4 分ごと 4 台、1 日では 900 台) 。 バリデータ数が 262,144(218)台を超えると、65,536(216)台のバリデータが増設されるたびに、追加で 1 台のバリデータが終了できます。 例えば、バリデータが 327,680 台を超えると、エポックごとに 5 台が終了すします(1 日あたり 1,125 台) 。 アクティブなバリデータ数が 393,216 台を超えると、6 台の終了が許可されます(以降も同様です)。 +1日あたち、すべてのバリデータのうち約0.33%が終了できます。 デフォルトでは、エポックごとに4台のバリデータが終了できます(6.4分ごと4台、1日では900台) 。 バリデータ数が262,144(218)台を超えると、65,536(216)台のバリデータが増設されるたびに、追加で1台のバリデータが終了できます。 例えば、バリデータが327,680台を超えると、エポックごとに5台が終了すします(1日あたり1,125台) 。 アクティブなバリデータ数が393,216台を超えると、6台の終了が許可されます(以降も同様です)。 -多数のバリデータが引き出すと、ネットワークが不安定になる可能性があるため、終了するバリデータの最大数を 4 台に縮小し、「ステーキングされた ETH が一度に大量に引き出されること」を防ぎます。 +多数のバリデータが引き出すと、ネットワークが不安定になる可能性があるため、終了するバリデータの最大数を4台に縮小し、「ステーキングされたETHが一度に大量に引き出されること」を防ぎます。 ### マージ以降のインフレについての概要 {#post-merge-inflation-breakdown} -- 総 ETH 供給量: **約 120,520,000ETH**(2022 年 9 月のマージ時点) +- 総ETH供給量: **約120,520,000ETH**(2022年9月のマージ時点) - 実行レイヤーでの発行: **0**(なし) -- コンセンサスレイヤーでの発行: 上記(マージ以前)と同じで、年間発行率**約 0.52%**(合計 1,400 万 ETH がステーキングされている場合) +- コンセンサスレイヤーでの発行: 上記(マージ以前)と同じで、年間発行率**約0.52%**(合計1,400万ETH がステーキングされている場合) 合計年間発行率: 約0.52%

    年間ETH発行の純削減率: 約88.7% ((4.61% - 0.52%) / 4.61% * 100)
    -## バーン(焼却) {#the-burn} +## バーン(焼却) {#the-burn} -ETH の発行とは逆に、イーサリアムでは ETH がバーンされるレートがあります。 イーサリアムでトランザクションを実行するには、最低手数料(「ベースフィー」)を支払う必要があります。ベースフィーは、ネットワークの混雑状況によって(ブロックごとに)常に変動し、 ETH で支払われます。ベースフィーは、トランザクションが有効に成立するために*必要*となり、 トランザクション処理中に*バーン*され、流通から消滅します。 +ETHの発行とは逆に、イーサリアムではETHがバーンされるレートがあります。 イーサリアムでトランザクションを実行するには、最低手数料(「ベースフィー」)を支払う必要があります。ベースフィーは、ネットワークの混雑状況によって(ブロックごとに)常に変動し、 ETHで支払われます。ベースフィーは、トランザクションが有効に成立するために_必要_となり、 トランザクション処理中に_バーン_され、流通から消滅します。 フィーのバーンは、2021年8月のロンドンアップグレードから始まり、マージ以降も継続されます。 -ロンドンのアップグレードで実装されたフィーのバーンに加えて、バリデータがオフラインになるとペナルティを課されます。さらに深刻なことに、ネットワークのセキュリティを脅かす特定のルールに違反した場合にはスラッシュされることがあります。 これらのペナルティにより、バリデータの残高から ETH が減少し、他のどのアカウントにも直接報酬として支払われず、事実上は流通から消滅することになります。 +ロンドンのアップグレードで実装されたフィーのバーンに加えて、バリデータがオフラインになるとペナルティを課されます。さらに深刻なことに、ネットワークのセキュリティを脅かす特定のルールに違反した場合にはスラッシュされることがあります。 これらのペナルティにより、バリデータの残高からETHが減少し、他のどのアカウントにも直接報酬として支払われず、事実上は流通から消滅することになります。 ### デフレ時における平均ガス価格の計算 {#calculating-average-gas-price-for-deflation} -上述したように、特定の日に発行される ETH の量はステーキングされた ETH の合計額によって決まります。 この記事の執筆時点では、1 日あたり約 1700ETH が発行されています。 +上述したように、特定の日に発行されるETHの量はステーキングされたETHの合計額によって決まります。 この記事の執筆時点では、1日あたり約1700ETHが発行されています。 -指定された 24 時間内で、ETH の発行を完全に相殺するのに必要な平均ガス価格を決定するには、ブロック時間を 12 秒として、1 日の総ブロック数を計算することから始めます。 +指定された24時間内で、ETHの発行を完全に相殺するのに必要な平均ガス価格を決定するには、ブロック時間を12秒として、1日の総ブロック数を計算することから始めます。 - `(1ブロック/12秒) * (60秒/分) = 5ブロック/分` - `(5ブロック/分) * (60分/時間) = 300ブロック/時間` - `(300ブロック/時間) * (24時間/日) = 7200ブロック/日` -各ブロックは、`15x10^6 gas/block`をターゲットとしています([ガスの詳細](/developers/docs/gas/))。 1 日あたりの合計 ETH 発行量が 1700ETH であるとすると、発行を相殺するために必要な平均ガス価格(ガスあたりの gwei)は、次の計算式で求めることができます。 +各ブロックは、`15x10^6 gas/block`をターゲットとしています([ガスの詳細](/developers/docs/gas/))。 1日あたりの合計ETH発行量が1700ETHであるとすると、発行を相殺するために必要な平均ガス価格(ガスあたりのgwei)は、次の計算式で求めることができます。 - `7200 blocks/day * 15x10^6 gas/block *`**`Y gwei/gas`**`* 1 ETH/ 10^9 gwei = 1700 ETH/day` `Y`を次のように求めます。 -- `Y = (1700(10^9))/(7200 * 15(10^6)) = (17x10^3)/(72 * 15) = 16 gwei`(有効数字 2 桁に丸める) +- `Y = (1700(10^9))/(7200 * 15(10^6)) = (17x10^3)/(72 * 15) = 16 gwei`(有効数字2桁に丸める) -上記の最終ステップを再構成するもう 1 つの方法は、`1700`を 1 日あたりの ETH 発行量を意味する変数`X`に置き換え、残りは次のように単純化します。 +上記の最終ステップを再構成するもう1つの方法は、`1700`を1日あたりのETH発行量を意味する変数`X`に置き換え、残りは次のように単純化します。 - `Y = (X(10^3)/(7200 * 15)) = X/108` これは、`X`の関数として単純化することができます。 -- `f(X) = X/108`: ここで`X`は、ETH の一日の発行量、そして`f(X)`は、新しく発行されたすべての ETH を相殺するために必要なガス価格あたりの gwei を表しています。 +- `f(X) = X/108`: ここで`X`は、ETHの一日の発行量、そして`f(X)`は、新しく発行されたすべてのETHを相殺するために必要なガス価格あたりのgweiを表しています。 -したがって、例えば`X`(一日の ETH 発行量)がステークされた合計 ETH 量をもととして 1800ETH になったとすると、`f(X)`(すべての発行量を相殺するために必要な gwei) は、`17gwei`となります(有効数字 2 桁の場合) 。 +したがって、例えば`X`(一日のETH発行量)がステークされた合計ETH量をもととして1800ETHになったとすると、`f(X)`(すべての発行量を相殺するために必要なgwei) は、`17gwei`となります(有効数字2桁の場合) 。 ## さらに学びたい方へ {#further-reading} - [マージ](/roadmap/merge/) -- [Ultrasound.money](https://ultrasound.money/) - _ETH の発行とバーンをリアルタイムで可視化したダッシュボードが利用可能_ +- [Ultrasound.money](https://ultrasound.money/) - _ETHの発行とバーンをリアルタイムで可視化したダッシュボードが利用可能_ - [Charting Ethereum Issuance](https://www.attestant.io/posts/charting-ethereum-issuance/) - _Jim McDonald 2020_ diff --git a/public/content/translations/ja/roadmap/pbs/index.md b/public/content/translations/ja/roadmap/pbs/index.md index f19fffa01d4..6266e5ef6b5 100644 --- a/public/content/translations/ja/roadmap/pbs/index.md +++ b/public/content/translations/ja/roadmap/pbs/index.md @@ -6,13 +6,13 @@ lang: ja # プロポーザー/ビルダーセパレーション(PBS) {#proposer-builder-separation} -現在、イーサリアムのバリデータは、*ブロックを作成、ブロードキャスト*します。 バリデータは、ゴシップネットワークを通じて伝達されたトランザクションを 1 つのブロックにまとめて、イーサリアムネットワーク上のピアに送信します。 **プロポーザー/ビルダーセパレーション(PBS)**は、ブロック提案とブロック生成のタスクを複数のバリデータに分割します。 ブロックビルダーは、各スロットのブロック提案者にブロックを提供する責任を負います。 ブロックプロポーザーは、ブロックの内容を事前に知ることができません。ブロックビルダーに料金を支払い、最も報酬の高いものを選び、その後、ブロックをピアに送信します。 +現在、イーサリアムのバリデータは、_ブロックを作成、ブロードキャスト_します。 バリデータは、ゴシップネットワークを通じて伝達されたトランザクションを1つのブロックにまとめて、イーサリアムネットワーク上のピアに送信します。 **プロポーザー/ビルダーセパレーション(PBS)**は、ブロック提案とブロック生成のタスクを複数のバリデータに分割します。 ブロックビルダーは、各スロットのブロック提案者にブロックを提供する責任を負います。 ブロックプロポーザーは、ブロックの内容を事前に知ることができません。ブロックビルダーに料金を支払い、最も報酬の高いものを選び、その後、ブロックをピアに送信します。 このアップグレードが重要な理由はいくつかあります。 まず、このアップグレードでプロトコルレベルでトランザクションの検閲を防ぐことができます。 次に、ブロック構築の収益性をより最適化できる機関投資家に個人のバリデータが出し抜かれることを防ぐことができます。 最後に、ダンクシャーディングのアップグレードが有効になると、イーサリアムのスケーリングを補助します。 -## PBS と検閲耐性 {#pbs-and-censorship-resistance} +## PBSと検閲耐性 {#pbs-and-censorship-resistance} -ブロックビルダーとブロック提案者を分離すると、ブロックビルダーがトランザクションを検閲することがかなり困難になります。 これは、PBS により、ブロックが提案される前に、検閲が行われていないことを保証する比較的複雑な基準を追加できるためです。 ブロック提案者は、ブロックビルダーとは別のエンティティであるため、ブロックビルダーによる検閲を防ぐ役割を担うことができます。 +ブロックビルダーとブロック提案者を分離すると、ブロックビルダーがトランザクションを検閲することがかなり困難になります。 これは、PBSにより、ブロックが提案される前に、検閲が行われていないことを保証する比較的複雑な基準を追加できるためです。 ブロック提案者は、ブロックビルダーとは別のエンティティであるため、ブロックビルダーによる検閲を防ぐ役割を担うことができます。 例えば、包含リストを導入すると、バリデータがトランザクションについて把握した時に、それがブロックに含まれていないことがわかった場合、次のブロックでそのトランザクションを必ず含めるように強制できるようになります。 包含リストは、ブロック提案者のローカルのメンプール(認識しているトランザクションのリスト)から生成され、ブロックが提案される直前にピアに送信されます。 包含リストのトランザクションのいずれかが失われている場合、提案者はブロックを拒否するか、提案する前に失われているトランザクションを追加するか、ブロックを提案して他のバリデータからブロックを受信した場合に拒否することができます。 また、より効率的なバージョンもあります。ビルダーは利用可能なブロック領域をすべて活用する必要があることを主張し、そうしなかった場合、提案者の包含リストからトランザクションを追加するというアイデアです。 まだ研究中の分野なので、包含リストの最適な構成はまだ決定されていません。 @@ -20,32 +20,32 @@ lang: ja -経済力のある組織は、特定のアドレスのトランザクションをブロックするようにバリデータに圧力をかけてくるかもしれません。 バリデータは、ブラックリストに登録されたアドレスのトランザクションを検出し、その組織が提案したブロックを除外することで、この圧力に対抗します。 PBS を導入すると、ブロック提案者は、自身のブロックでどのトランザクションをブロードキャストしているのか分からなくなるので、この対抗策は使えなくなります。 住んでいる地域で検閲が法律になっている場合、個人やアプリが検閲ルールに準拠しなければならないことがあります。 これらのケースでは、コンプライアンスはアプリケーションレベルで行われ、プロトコルはパーミッションレスで検閲が行われない状態のままです。 +経済力のある組織は、特定のアドレスのトランザクションをブロックするようにバリデータに圧力をかけてくるかもしれません。 バリデータは、ブラックリストに登録されたアドレスのトランザクションを検出し、その組織が提案したブロックを除外することで、この圧力に対抗します。 PBSを導入すると、ブロック提案者は、自身のブロックでどのトランザクションをブロードキャストしているのか分からなくなるので、この対抗策は使えなくなります。 住んでいる地域で検閲が法律になっている場合、個人やアプリが検閲ルールに準拠しなければならないことがあります。 これらのケースでは、コンプライアンスはアプリケーションレベルで行われ、プロトコルはパーミッションレスで検閲が行われない状態のままです。 -## PBS と MEV {#pbs-and-mev} +## PBSとMEV {#pbs-and-mev} -**最大抽出可能価値(MEV)**とは、トランザクションを好ましい順序に並べ替えることによって収益を最大化するバリデータのことです。 具体的には、分散型取引所での裁定取引(大規模な売買を行うフロントランニング)や、DeFi ポジションの清算などが挙げられます。 MEV を最大化するには、高度な技術ノウハウと、通常のバリデータに追加するカスタムソフトウェアが必要です。そのため MEV 抽出において、組織的なオペレータの方が個人や趣味でバリデータ立てている人物よりも優れたパフォーマンスを発揮する可能性が非常に高くなります。 つまり、集中化されたオペレータは、個人でステーキングするよりも高いリターンを得られる可能性があるため、ホームステークを阻害する力が働いてしまうということです。 +**最大抽出可能価値(MEV)**とは、トランザクションを好ましい順序に並べ替えることによって収益を最大化するバリデータのことです。 具体的には、分散型取引所での裁定取引(大規模な売買を行うフロントランニング)や、DeFiポジションの清算などが挙げられます。 MEVを最大化するには、高度な技術ノウハウと、通常のバリデータに追加するカスタムソフトウェアが必要です。そのためMEV抽出において、組織的なオペレータの方が個人や趣味でバリデータ立てている人物よりも優れたパフォーマンスを発揮する可能性が非常に高くなります。 つまり、集中化されたオペレータは、個人でステーキングするよりも高いリターンを得られる可能性があるため、ホームステークを阻害する力が働いてしまうということです。 -PBS では、MEV の経済を再設定することによって、この問題を解決します。 ブロック提案者は、MEV を自分で探す代わりに、ブロックビルダーが提案したブロックの中から、適当なブロックを選択します。 ブロックビルダーは、MEV を巧みに抽出しているかもしれませんが、その報酬はブロック提案者に支払われます。 つまり、専門のブロックビルダーが小さなプールを持っていても、MEV の抽出を独占していても、その報酬は、個人のホームステーカーを含む、ネットワーク上のすべてのバリデータに分配される可能性があるということです。 +PBSでは、MEVの経済を再設定することによって、この問題を解決します。 ブロック提案者は、MEVを自分で探す代わりに、ブロックビルダーが提案したブロックの中から、適当なブロックを選択します。 ブロックビルダーは、MEVを巧みに抽出しているかもしれませんが、その報酬はブロック提案者に支払われます。 つまり、専門のブロックビルダーが小さなプールを持っていても、MEVの抽出を独占していても、その報酬は、個人のホームステーカーを含む、ネットワーク上のすべてのバリデータに分配される可能性があるということです。 -個人でステークするよりも、プールでステークする方が有利になるかもしれません。これは、複雑な MEV 戦略によって得られる報酬が増えるからです。 ブロックの構築とブロックの提案を分離することで、抽出された MEV は、最も使われている MEV サーチャーに集中するのではなく、より多くのバリデータに分散されます。 同時に、専門のブロックビルダーの存在を許可することで、ブロック構築の負担が軽減され、MEV の盗難も防止されます。また、独立したバリデータの数も最大化され、ブロックの正しさをチェックできるようになります。 これは、「証明者と検証者の非対称性」という重要なコンセプトであり、ブロックが誠実であることを証明できる堅牢かつ最大限に分散化された検証者のネットワークが存在する限り、集中的なブロック生成は問題ないという考えを参考にしています。 分散化はあくまでも手段であって、目的ではありません。私たちが本当に望んでいるのは、正しいブロックです。 +個人でステークするよりも、プールでステークする方が有利になるかもしれません。これは、複雑なMEV戦略によって得られる報酬が増えるからです。 ブロックの構築とブロックの提案を分離することで、抽出されたMEVは、最も使われているMEVサーチャーに集中するのではなく、より多くのバリデータに分散されます。 同時に、専門のブロックビルダーの存在を許可することで、ブロック構築の負担が軽減され、MEVの盗難も防止されます。また、独立したバリデータの数も最大化され、ブロックの正しさをチェックできるようになります。 これは、「証明者と検証者の非対称性」という重要なコンセプトであり、ブロックが誠実であることを証明できる堅牢かつ最大限に分散化された検証者のネットワークが存在する限り、集中的なブロック生成は問題ないという考えを参考にしています。 分散化はあくまでも手段であって、目的ではありません。私たちが本当に望んでいるのは、正しいブロックです。 -## PBS とダンクシャーディング {#pbs-and-danksharding} +## PBSとダンクシャーディング {#pbs-and-danksharding} -ダンクシャーディングは、イーサリアムの処理能力を 1 秒あたり 10 万トランザクション以上までスケーリングします。これにより、ロールアップユーザーの手数料を最小限に抑えることができます。 ダンクシャーディングでは、ブロックビルダーの作業負荷が増加します。ブロックビルダーは、最大 64MB のロールアップデータの証明を 1 秒未満で計算する必要があるため、PBS に依存しています。 このタスクは、かなりのハードウェアリソースを必要とするものです。そのため、専門のビルダーが専属で取り組む必要がありますが、 現在の状況では、いずれにせよ MEV 抽出によって、ブロック構築は、より洗練化した強力なオペレーターを中心にますます集中化する可能性があります。 プロポーザー/ビルダーセパレーションは、ブロックの検証やステーキング報酬の分配といった重要な役割を、複数のバリデーターに分散することで、集中化を防ぐための仕組みです。 また、この仕組みには、副次的な利点もあります。それは、専門のブロックビルダーが、ダンクシャーディングに必要なデータ証明を、より意欲的に計算できるようになるということです。 +ダンクシャーディングは、イーサリアムの処理能力を1秒あたり10万トランザクション以上までスケーリングします。これにより、ロールアップユーザーの手数料を最小限に抑えることができます。 ダンクシャーディングでは、ブロックビルダーの作業負荷が増加します。ブロックビルダーは、最大64MBのロールアップデータの証明を1秒未満で計算する必要があるため、PBSに依存しています。 このタスクは、かなりのハードウェアリソースを必要とするものです。そのため、専門のビルダーが専属で取り組む必要がありますが、 現在の状況では、いずれにせよMEV抽出によって、ブロック構築は、より洗練化した強力なオペレーターを中心にますます集中化する可能性があります。 プロポーザー/ビルダーセパレーションは、ブロックの検証やステーキング報酬の分配といった重要な役割を、複数のバリデーターに分散することで、集中化を防ぐための仕組みです。 また、この仕組みには、副次的な利点もあります。それは、専門のブロックビルダーが、ダンクシャーディングに必要なデータ証明を、より意欲的に計算できるようになるということです。 ## 現在の進行状況 {#current-progress} -PBS の研究は、順調に進んでいます。しかし、イーサリアムクライアントでプロトタイプを作成するには、まだいくつかの設計上の重大な問題を解決する必要があります。 そのため、仕様の確定に至っていません。 つまり、PBS の実装は 1 年以上先になる可能性があります。 最新の研究状況は、[こちら](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance)でご確認ください。 +PBSの研究は、順調に進んでいます。しかし、イーサリアムクライアントでプロトタイプを作成するには、まだいくつかの設計上の重大な問題を解決する必要があります。 そのため、仕様の確定に至っていません。 つまり、PBSの実装は1年以上先になる可能性があります。 最新の研究状況は、[こちら](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance)でご確認ください。 ## 参考文献 {#further-reading} -- [研究状況: PBS の下での検閲耐性](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) -- [PBS にふさわしい手数料市場のデザイン](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) -- [PBS と検閲耐性](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Secondary-auctions) +- [研究状況: PBSの下での検閲耐性](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) +- [PBSにふさわしい手数料市場のデザイン](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) +- [PBSと検閲耐性](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Secondary-auctions) - [包括リスト](https://notes.ethereum.org/@fradamt/H1ZqdtrBF) diff --git a/public/content/translations/ja/roadmap/scaling/index.md b/public/content/translations/ja/roadmap/scaling/index.md index 5e5ea41acc7..2fd5847e575 100644 --- a/public/content/translations/ja/roadmap/scaling/index.md +++ b/public/content/translations/ja/roadmap/scaling/index.md @@ -7,7 +7,7 @@ alt: "イーサリアムロードマップ" template: roadmap --- -イーサリアムは、[レイヤー 2](/layer-2/#rollups)(ロールアップとも呼ばれます)と呼ばれるスケーリング技術で、トランザクションをまとめて処理し、出力をイーサリアムに送信します。 ロールアップでは、イーサリアムメインネットよりも最大 8 倍安価に取引を行うことができますが、ロールアップのさらなる最適化によって、さらにコストを削減できる可能性があります。 ただし、ロールアップには一部の集中化されたコンポーネントも含まれており、これはロールアップが成熟するにつれてデベロッパーによって取り除かれる予定です。 +イーサリアムは、[レイヤー2](/layer-2/#rollups)(ロールアップとも呼ばれます)と呼ばれるスケーリング技術で、トランザクションをまとめて処理し、出力をイーサリアムに送信します。 ロールアップでは、イーサリアムメインネットよりも最大8倍安価に取引を行うことができますが、ロールアップのさらなる最適化によって、さらにコストを削減できる可能性があります。 ただし、ロールアップには一部の集中化されたコンポーネントも含まれており、これはロールアップが成熟するにつれてデベロッパーによって取り除かれる予定です。
      @@ -24,15 +24,15 @@ template: roadmap ### プロトダンクシャーディング {#proto-danksharding} -ロールアップのデータは、イーサリアム上に永続的に保存されるため、コストがかかります。 ユーザーは、ロールアップで支払うトランザクションコストの 90%以上を、データストレージに費やしています。 トランザクションコストを削減するため、新たに「ブロブ」と呼ばれる一時ストレージ領域にデータを移動できるようになりました。 ブロブは、永続的でないため、比較的コストが安くなっており、不要になるとイーサリアムから削除されます。 ロールアップデータの長期保存は、ロールアップオペレータ、取引所、インデックスサービスなど、それを必要とする人々の役割となります。 イーサリアムへのブロブトランザクションの追加は、「プロトダンクシャーディング」と呼ばれるアップグレードの一部であり、 2023 年後半の比較的早い時期にリリースされる予定です。 +ロールアップのデータは、イーサリアム上に永続的に保存されるため、コストがかかります。 ユーザーは、ロールアップで支払うトランザクションコストの90%以上を、データストレージに費やしています。 トランザクションコストを削減するため、新たに「ブロブ」と呼ばれる一時ストレージ領域にデータを移動できるようになりました。 ブロブは、永続的でないため、比較的コストが安くなっており、不要になるとイーサリアムから削除されます。 ロールアップデータの長期保存は、ロールアップオペレータ、取引所、インデックスサービスなど、それを必要とする人々の役割となります。 イーサリアムへのブロブトランザクションの追加は、「プロトダンクシャーディング」と呼ばれるアップグレードの一部であり、 2023年後半の比較的早い時期にリリースされる予定です。 -プロトダンクシャーディングによって、イーサリアムプロトコルにブロブトランザクションが組み込まれると、イーサリアムのブロックにたくさんのブロブを追加できるようになります。 これにより、イーサリアムのスループットが大幅に向上し(100 倍以上)、トランザクションのコストも下げることができます。 +プロトダンクシャーディングによって、イーサリアムプロトコルにブロブトランザクションが組み込まれると、イーサリアムのブロックにたくさんのブロブを追加できるようになります。 これにより、イーサリアムのスループットが大幅に向上し(100倍以上)、トランザクションのコストも下げることができます。 ### ダークシャーディング {#danksharding} -ブロブデータ拡張の第 2 段階は、大変複雑です。理由は、ロールアップデータがネットワーク上で利用可能であることを確認する新しい方法が必要だからです。また、バリデータの役割を分離して、ブロック構築とブロック提案に分けることも必要です。 さらに、バリデータがブロブデータの小さなサブセットを検証したことを暗号的に証明する方法も必要になります。 +ブロブデータ拡張の第2段階は、大変複雑です。理由は、ロールアップデータがネットワーク上で利用可能であることを確認する新しい方法が必要だからです。また、バリデータの役割を分離して、ブロック構築とブロック提案に分けることも必要です。 さらに、バリデータがブロブデータの小さなサブセットを検証したことを暗号的に証明する方法も必要になります。 -この 2 番目のステップは、[「ダンクシャーディング」](/roadmap/danksharding/)と呼ばれます。 完全に実装されるまでには、数年かかると予想されています。 ダンクシャーディングは、[ブロック構築とブロック提案を分離する](/roadmap/pbs)などの他の開発に依存しています。また、データが利用可能であることを効率的に確認するために、[データ可用性サンプリング(DAS)](/developers/docs/data-availability)と呼ばれる、数キロバイトのデータをランダムにサンプリングする新しいネットワーク設計も採用しています。 +この2番目のステップは、[「ダンクシャーディング」](/roadmap/danksharding/)と呼ばれます。 完全に実装されるまでには、数年かかると予想されています。 ダンクシャーディングは、[ブロック構築とブロック提案を分離する](/roadmap/pbs)などの他の開発に依存しています。また、データが利用可能であることを効率的に確認するために、[データ可用性サンプリング(DAS)](/developers/docs/data-availability)と呼ばれる、数キロバイトのデータをランダムにサンプリングする新しいネットワーク設計も採用しています。 ダンクシャーディングの詳細 diff --git a/public/content/translations/ja/roadmap/secret-leader-election/index.md b/public/content/translations/ja/roadmap/secret-leader-election/index.md index 76c494e099f..85e4c933f25 100644 --- a/public/content/translations/ja/roadmap/secret-leader-election/index.md +++ b/public/content/translations/ja/roadmap/secret-leader-election/index.md @@ -10,34 +10,34 @@ summaryPoints: # シークレットリーダー選出 {#single-secret-leader-election} -現在の[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)ベースのコンセンサスメカニズムでは、今後のブロック提案者のリストが公開され、彼らの IP アドレスをマッピングすることが可能です。 そのため、攻撃者は、ブロックを提案する予定のバリデータを特定し、そのバリデータに対してサービス拒否(DOS)攻撃を仕掛けることで、時間通りにブロックの提案を行わせないように妨害することができます。 +現在の[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)ベースのコンセンサスメカニズムでは、今後のブロック提案者のリストが公開され、彼らのIPアドレスをマッピングすることが可能です。 そのため、攻撃者は、ブロックを提案する予定のバリデータを特定し、そのバリデータに対してサービス拒否(DOS)攻撃を仕掛けることで、時間通りにブロックの提案を行わせないように妨害することができます。 -この状況は、攻撃者にとって利益を得る機会になる可能性があります。 例えば、スロット`n+1`に選ばれたブロック提案者が、スロット`n`の提案者に対して DoS 攻撃を行うことで、ブロックを提案する機会を奪うことができます。 これにより、攻撃側のブロック提案者は、両方のスロットの MEV を抽出したり、2 つのブロックに分かれるはずだったすべてのトランザクションを 1 つのブロックにまとめたりすることで、関連するすべての手数料を独占できます。 この攻撃は、高度な方法を使って DOS 攻撃から防御することができる技術力の高い機関のバリデータよりも、一般的な家庭のバリデータに対して悪影響を与える可能性が高く、結果的にバリデータの集中化につながる可能性があります。 +この状況は、攻撃者にとって利益を得る機会になる可能性があります。 例えば、スロット`n+1`に選ばれたブロック提案者が、スロット`n`の提案者に対してDoS攻撃を行うことで、ブロックを提案する機会を奪うことができます。 これにより、攻撃側のブロック提案者は、両方のスロットのMEVを抽出したり、2つのブロックに分かれるはずだったすべてのトランザクションを1つのブロックにまとめたりすることで、関連するすべての手数料を独占できます。 この攻撃は、高度な方法を使ってDOS攻撃から防御することができる技術力の高い機関のバリデータよりも、一般的な家庭のバリデータに対して悪影響を与える可能性が高く、結果的にバリデータの集中化につながる可能性があります。 -この問題には、いくつかの解決策があります。 1 つは、[分散バリデータ技術](https://github.com/ethereum/distributed-validator-specs)です。これは、バリデータの実行に必要なさまざまなタスクを、冗長性のある複数のマシンに分散する技術です。これにより、攻撃者が特定のスロットでブロックの提案を妨害するのが難しくなります。 しかし、最も有効な解決策は、**シークレット・シングル・リーダー選出(SSLE)** です。 +この問題には、いくつかの解決策があります。 1つは、[分散バリデータ技術](https://github.com/ethereum/distributed-validator-specs)です。これは、バリデータの実行に必要なさまざまなタスクを、冗長性のある複数のマシンに分散する技術です。これにより、攻撃者が特定のスロットでブロックの提案を妨害するのが難しくなります。 しかし、最も有効な解決策は、**シークレット・シングル・リーダー選出(SSLE)** です。 ## シークレット・シングル・リーダー選出 {#secret-leader-election} -SSLE(シークレット・シングル・リーダー選出)では、選出されたバリデータのみが自分が選ばれたことを知ることができるように、高度な暗号化が使用されます。 これは、各バリデータが秘密に対するコミットメントを送信することで機能します。このコミットメントは、バリデータ全員で共有します。 コミットメントは、シャッフル、再構成され、誰もコミットメントをバリデータにマッピングすることはできませんが、各バリデータは自分に属するコミットメントを把握しています。 その後、ランダムに 1 つのコミットメントが選ばれます。 バリデータが自身のコミットメントが選ばれたことを確認すると、そのバリデータがブロックを提案する番になります。 +SSLE(シークレット・シングル・リーダー選出)では、選出されたバリデータのみが自分が選ばれたことを知ることができるように、高度な暗号化が使用されます。 これは、各バリデータが秘密に対するコミットメントを送信することで機能します。このコミットメントは、バリデータ全員で共有します。 コミットメントは、シャッフル、再構成され、誰もコミットメントをバリデータにマッピングすることはできませんが、各バリデータは自分に属するコミットメントを把握しています。 その後、ランダムに1つのコミットメントが選ばれます。 バリデータが自身のコミットメントが選ばれたことを確認すると、そのバリデータがブロックを提案する番になります。 このアイデアを実装した主要なものとして、[ウィスク](https://ethresear.ch/t/whisk-a-practical-shuffle-based-ssle-protocol-for-ethereum/11763)と呼ばれるものがあります。 ウィスクは、次のように機能します。 1. バリデータは共有シークレットにコミットします。 このコミットメントスキームでは、バリデータのアイデンティティにバインドできるように設計されています。また、第三者がこのバインドをリバースエンジニアリングして、特定のコミットメントを特定のバリデータに関連づけることができないようにランダム化することもできます。 -2. エポックの開始時に、RANDAO を用いて 16,384 のバリデータからランダムなバリデータセットが選択され、コミットメントがサンプリングされます。 -3. 次の 8182 スロット(1 日分)の間に、ブロック提案者は独自のプライベートエントロピーを使用して、コミットメントのサブセットをシャッフルし、ランダム化します。 -4. シャッフルが終了したら、RANDAO を使用して、コミットメントを順番に並べたリストを作成します。 このリストは、イーサリアムスロットにマッピングされます。 +2. エポックの開始時に、RANDAOを用いて16,384のバリデータからランダムなバリデータセットが選択され、コミットメントがサンプリングされます。 +3. 次の8182スロット(1日分)の間に、ブロック提案者は独自のプライベートエントロピーを使用して、コミットメントのサブセットをシャッフルし、ランダム化します。 +4. シャッフルが終了したら、RANDAOを使用して、コミットメントを順番に並べたリストを作成します。 このリストは、イーサリアムスロットにマッピングされます。 5. バリデータは、自身のコミットメントが特定のスロットに紐づいていることを確認し、そのスロットになったらブロックを提案します。 6. この手順を繰り返し行うことで、スロットに対するコミットメントの割り当ては、常に現在のスロットよりもはるかに先に進んでいきます。 -これにより、攻撃者は、次のブロックを提案する特定のバリデータが事前にわからないので、DOS 攻撃ができなくなります。 +これにより、攻撃者は、次のブロックを提案する特定のバリデータが事前にわからないので、DOS攻撃ができなくなります。 ## シークレット・非シングル・リーダー選出(SnSLE) {#secret-non-single-leader-election} -プルーフ・オブ・ワークにおいてブロックの提案を決定する方法と同様に、バリデータが各スロットでブロックを提案する機会をランダムに与える仕組みもあり、シークレット・非シングル・リーダー選出(SnSLE)と呼ばれています。 例えば、現在のプロトコルでバリデータをランダムに選択するために使われている RANDAO 関数を活用すれば、簡単に実現できます。 RANDAO を使うアイデアとは、多くの独立しているバリデータから送信されたハッシュを混合することで、十分な乱数が生成するというものです。 SnSLE において、これらのハッシュを使って、次のブロック提案者を選ぶことができます。例えば、最小値のハッシュの選択です。 有効なハッシュ値の範囲を設定することで、各スロットでバリデータが選ばれる可能性を調整することができます。 ハッシュ値が`2^256 * 5 / N` (`N` = アクティブなバリデータ数)未満でなければならないとアサートすると、各スロットで個々のバリデータが選択される可能性は、`5/N`になります。 この例では、少なくとも 1 人の提案者が各スロットで有効なハッシュを生成する確率は 99.3%になります。 +プルーフ・オブ・ワークにおいてブロックの提案を決定する方法と同様に、バリデータが各スロットでブロックを提案する機会をランダムに与える仕組みもあり、**シークレット・非シングル・リーダー選出(SnSLE)**と呼ばれています。 例えば、現在のプロトコルでバリデータをランダムに選択するために使われているRANDAO関数を活用すれば、簡単に実現できます。 RANDAOを使うアイデアとは、多くの独立しているバリデータから送信されたハッシュを混合することで、十分な乱数が生成するというものです。 SnSLEにおいて、これらのハッシュを使って、次のブロック提案者を選ぶことができます。例えば、最小値のハッシュの選択です。 有効なハッシュ値の範囲を設定することで、各スロットでバリデータが選ばれる可能性を調整することができます。 ハッシュ値が`2^256 * 5 / N` (`N` = アクティブなバリデータ数)未満でなければならないとアサートすると、各スロットで個々のバリデータが選択される可能性は、`5/N`になります。 この例では、少なくとも1人の提案者が各スロットで有効なハッシュを生成する確率は99.3%になります。 ## 現在の進行状況 {#current-progress} -SSLE と SnSLE はまだ研究段階にあるため、 仕様が決まっていません。 また、SSLE と SnSLE は競合しているので、両方が実装されるということはありません。 この提案をリリースするには、さらに研究開発を行い、プロトタイピングを作成した上で、公開テストネットで実装する必要があります。 +SSLEとSnSLEはまだ研究段階にあるため、 仕様が決まっていません。 また、SSLEとSnSLEは競合しているので、両方が実装されるということはありません。 この提案をリリースするには、さらに研究開発を行い、プロトタイピングを作成した上で、公開テストネットで実装する必要があります。 ## 参考文献 {#further-reading} diff --git a/public/content/translations/ja/roadmap/security/index.md b/public/content/translations/ja/roadmap/security/index.md index 3c525979778..981c6e3c9a0 100644 --- a/public/content/translations/ja/roadmap/security/index.md +++ b/public/content/translations/ja/roadmap/security/index.md @@ -13,25 +13,25 @@ template: roadmap ## ステーキングの引き出し {#staking-withdrawals} -イーサリアムのプルーフ・オブ・ワークからプルーフ・オブ・ステークへのアップグレードは、イーサリアムの先駆者たちが自分のイーサ(ETH)をデポジットコントラクトに「ステーキング」することで始まりました。 このステーキングに使われる ETH は、ネットワークの保護に使われます。 ただし、この ETH は、現時点ではロックされており、ユーザーに返すことはできません。 プルーフ・オブ・ステークのアップグレードでは、ステーキングした ETH の引き出しが可能になります。 これは、プルーフ・オブ・ステークのプロトコルが完全に機能するために重要な要素であり、ステーカーが ETH 報酬を自由に使えるようになることで、イーサリアムのセキュリティにも有益です。 なぜなら、ステーキングに流動性を求めるユーザーが、リキッドステーキングデリバティブ(LSD)に頼る必要がなくなるからです。LSD は、イーサリアムを集中化させる力になる可能性があります。 このアップグレードは、2023 年 4 月 12 日に完了する予定です。 +イーサリアムのプルーフ・オブ・ワークからプルーフ・オブ・ステークへのアップグレードは、イーサリアムの先駆者たちが自分のイーサ(ETH)をデポジットコントラクトに「ステーキング」することで始まりました。 このステーキングに使われるETHは、ネットワークの保護に使われます。 ただし、このETHは、現時点ではロックされており、ユーザーに返すことはできません。 プルーフ・オブ・ステークのアップグレードでは、ステーキングしたETHの引き出しが可能になります。 これは、プルーフ・オブ・ステークのプロトコルが完全に機能するために重要な要素であり、ステーカーがETH報酬を自由に使えるようになることで、イーサリアムのセキュリティにも有益です。 なぜなら、ステーキングに流動性を求めるユーザーが、リキッドステーキングデリバティブ(LSD)に頼る必要がなくなるからです。LSDは、イーサリアムを集中化させる力になる可能性があります。 このアップグレードは、2023年4月12日に完了する予定です。 引き出しについての詳細 ## 攻撃からの防御 {#defending-against-attacks} -引き出しが可能になった後にも、イーサリアムの[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)のプロトコルにはいくつかの改善点があります。 1 つは、[ビューマージ](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739)と呼ばれる、より安全なフォーク選択アルゴリズムです。 これにより、高度なタイプの攻撃をさらに防ぐことができます。 +引き出しが可能になった後にも、イーサリアムの[プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)のプロトコルにはいくつかの改善点があります。 1つは、[ビューマージ](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739)と呼ばれる、より安全なフォーク選択アルゴリズムです。 これにより、高度なタイプの攻撃をさらに防ぐことができます。 -イーサリアムがブロックを確定させるまでの時間を短縮することで、ユーザーがより快適に利用できるようになります。また、攻撃者が、高度な「再編成」攻撃を行って直近のブロックの再シャッフルを試みることで、利益を得たり、特定のトランザクションを検閲しようとするのを防ぐことができます。 [**シングルスロット・ファイナリティ(SSF)**](/roadmap/single-slot-finality/)は、トランザクションが確定に至るまでの遅延時間を短縮する方法です。 現行のシステムでは、15 分以内に生成されたブロックは、理論上攻撃者が他のバリデータにブロックの再構成を誘導できます。 SSF では、この脆弱性が解消されます。 個人からアプリや取引所まで、全てのユーザーは、トランザクションが取り消されないという保証を迅速に受けられます。ネットワークでは、SSF によりあらゆる種類の攻撃を遮断することができます。 +イーサリアムがブロックを確定させるまでの時間を短縮することで、ユーザーがより快適に利用できるようになります。また、攻撃者が、高度な「再編成」攻撃を行って直近のブロックの再シャッフルを試みることで、利益を得たり、特定のトランザクションを検閲しようとするのを防ぐことができます。 [**シングルスロット・ファイナリティ(SSF)**](/roadmap/single-slot-finality/)は、トランザクションが確定に至るまでの遅延時間を短縮する方法です。 現行のシステムでは、15分以内に生成されたブロックは、理論上攻撃者が他のバリデータにブロックの再構成を誘導できます。 SSFでは、この脆弱性が解消されます。 個人からアプリや取引所まで、全てのユーザーは、トランザクションが取り消されないという保証を迅速に受けられます。ネットワークでは、SSFによりあらゆる種類の攻撃を遮断することができます。 シングルスロット・ファイナリティの詳細 ## 検閲からの防御 {#defending-against-censorship} -分散化は、個人や少数のグループのバリデータが、過剰な影響力を持ってしまうことを防ぐ効果があります。 新たなステーキングの技術は、イーサリアムのバリデータを可能な限り分散化した状態に保ち、ハードウェア、ソフトウェア、ネットワークの障害から保護します。 この新たなステーキングの技術では、複数のノード間でバリデータの責任を共有するソフトウェアも対象になっています。 これを、**分散バリデータ技術(DVT)**と呼びます。 DVT により、複数のコンピュータが共同で検証を行うことで、冗長性とフォールトトレランスが向上します。そのため、ステーキングプールでは、DVT の使用が推奨されています。 DVT では、バリデータ鍵を複数のシステムに分割します。これにより、1 つのオペレータが複数のバリデータを実行できなくなり、 不正なオペレータによるイーサリアムへ攻撃が困難になります。 つまり、バリデータを個人ではなく、*コミュニティ*全体で実行することで、セキュリティを高めるというアイデアです。 +分散化は、個人や少数のグループのバリデータが、過剰な影響力を持ってしまうことを防ぐ効果があります。 新たなステーキングの技術は、イーサリアムのバリデータを可能な限り分散化した状態に保ち、ハードウェア、ソフトウェア、ネットワークの障害から保護します。 この新たなステーキングの技術では、複数のノード間でバリデータの責任を共有するソフトウェアも対象になっています。 これを、**分散バリデータ技術(DVT)**と呼びます。 DVTにより、複数のコンピュータが共同で検証を行うことで、冗長性とフォールトトレランスが向上します。そのため、ステーキングプールでは、DVTの使用が推奨されています。 DVTでは、バリデータ鍵を複数のシステムに分割します。これにより、1つのオペレータが複数のバリデータを実行できなくなり、 不正なオペレータによるイーサリアムへ攻撃が困難になります。 つまり、バリデータを個人ではなく、_コミュニティ_全体で実行することで、セキュリティを高めるというアイデアです。 分散バリデータ技術の詳細 -**プロポーザー/ビルダーセパレーション(PBS)**の実装により、イーサリアムの検閲耐性が大幅に向上します。 PBS では、ブロックの作成とイーサリアムネットワーク全体へのブロードキャストを別々のバリデータが担います。 これにより、利益を最大化している専門家のブロック構築アルゴリズムによる利益の偏りを防ぎ、ネットワーク全体でより公平な利益分配を実現します。また、時間の経過とともに、最もパフォーマンスの高い機関投資家に**ステークが集中化することを防ぐ**ことができます。 ブロック提案者は、ブロックビルダーの市場から提供されたブロックの中から、最も収益性の高いものを選択できます。 しかし、検閲を行うためには、収益性の低いブロックを選択なければならない状況が頻繁に発生します。これは、**ネットワーク上の残りのバリデータにとっても利益が低く、経済的に不合理**な行為です。 +**プロポーザー/ビルダーセパレーション(PBS)**の実装により、イーサリアムの検閲耐性が大幅に向上します。 PBSでは、ブロックの作成とイーサリアムネットワーク全体へのブロードキャストを別々のバリデータが担います。 これにより、利益を最大化している専門家のブロック構築アルゴリズムによる利益の偏りを防ぎ、ネットワーク全体でより公平な利益分配を実現します。また、時間の経過とともに、最もパフォーマンスの高い機関投資家に**ステークが集中化することを防ぐ**ことができます。 ブロック提案者は、ブロックビルダーの市場から提供されたブロックの中から、最も収益性の高いものを選択できます。 しかし、検閲を行うためには、収益性の低いブロックを選択なければならない状況が頻繁に発生します。これは、**ネットワーク上の残りのバリデータにとっても利益が低く、経済的に不合理**な行為です。 イーサリアムの検閲耐性をさらに向上させるために、暗号化されたトランザクションや包含リストなどのアドオンが検討されています。 これらのアドオンを使うと、ブロックの構築者や提案者は、ブロックに含まれる実際のトランザクションを把握できなくなります。 @@ -39,10 +39,10 @@ template: roadmap ## バリデータの保護 {#protecting-validators} -高度な攻撃者は、次に担当するバリデータを特定して、ブロックの提案を阻止するためにスパムを送信してくる可能性があります。これは**サービス拒否(DoS)攻撃**と呼ばれるものです。 [**シークレットリーダー選出(SLE)**](/roadmap/secret-leader-election)が実装されれば、ブロック提案者を事前に知ることができなくなるため、このタイプの攻撃から保護することができます。 SLE は、候補のブロック提案者を表す暗号コミットメントのセットを、継続的にシャッフルして順番を決め、その順番でバリデータを選択します。この方法により、バリデータは自分の順番を事前に知ることができます。 +高度な攻撃者は、次に担当するバリデータを特定して、ブロックの提案を阻止するためにスパムを送信してくる可能性があります。これは**サービス拒否(DoS)攻撃**と呼ばれるものです。 [**シークレットリーダー選出(SLE)**](/roadmap/secret-leader-election)が実装されれば、ブロック提案者を事前に知ることができなくなるため、このタイプの攻撃から保護することができます。 SLEは、候補のブロック提案者を表す暗号コミットメントのセットを、継続的にシャッフルして順番を決め、その順番でバリデータを選択します。この方法により、バリデータは自分の順番を事前に知ることができます。 シークレットリーダー選出の詳細 ## 現在の進行状況 {#current-progress} -ロードマップ上のセキュリティアップグレードの研究は進んでいますが、実装にはまだ時間がかかりそうです。 ビューマージ、PBS、SSF、SLE における次のステップは、仕様を決定し、プロトタイプの構築を開始することです。 +ロードマップ上のセキュリティアップグレードの研究は進んでいますが、実装にはまだ時間がかかりそうです。 ビューマージ、PBS、SSF、SLEにおける次のステップは、仕様を決定し、プロトタイプの構築を開始することです。 diff --git a/public/content/translations/ja/roadmap/single-slot-finality/index.md b/public/content/translations/ja/roadmap/single-slot-finality/index.md index ba528957ef4..add46d2a795 100644 --- a/public/content/translations/ja/roadmap/single-slot-finality/index.md +++ b/public/content/translations/ja/roadmap/single-slot-finality/index.md @@ -6,61 +6,61 @@ lang: ja # シングルスロット・ファイナリティ {#single-slot-finality} -イーサリアムのブロックが確定するまで、約 15 分かかります。 しかし、イーサリアムのコンセンサスメカニズムでブロックをより効率的に検証することで、ファイナリティまでの時間を大幅に短縮することができます。 15 分間待つ必要はなく、同じスロット内でブロックが提案され、確定することができます。 このコンセプトは、**シングルスロット・ファイナリティ(SSF)**と呼ばれます。 +イーサリアムのブロックが確定するまで、約15分かかります。 しかし、イーサリアムのコンセンサスメカニズムでブロックをより効率的に検証することで、ファイナリティまでの時間を大幅に短縮することができます。 15分間待つ必要はなく、同じスロット内でブロックが提案され、確定することができます。 このコンセプトは、**シングルスロット・ファイナリティ(SSF)**と呼ばれます。 ## ファイナリティとは {#what-is-finality} -ファイナリティとは、イーサリアムの新しいコンセンサスメカニズムであるプルーフ・オブ・ステークにおいて、ステークされた ETH 全体の少なくとも 33%をバーンしない限り、ブロックを変更したり、ブロックチェーンから削除したりできないことを保証する仕組みです。 これは、「暗号経済」を利用したセキュリティです。チェーンの順序や内容を変更する際に非常に高いコストがかかるため、合理的な経済主体がチェーンを変更しようとする試みを防ぐことができます。 +ファイナリティとは、イーサリアムの新しいコンセンサスメカニズムであるプルーフ・オブ・ステークにおいて、ステークされたETH全体の少なくとも33%をバーンしない限り、ブロックを変更したり、ブロックチェーンから削除したりできないことを保証する仕組みです。 これは、「暗号経済」を利用したセキュリティです。チェーンの順序や内容を変更する際に非常に高いコストがかかるため、合理的な経済主体がチェーンを変更しようとする試みを防ぐことができます。 ## ファイナリティを短縮する理由 {#why-aim-for-quicker-finality} -現在のファイナリティに至るまでの時間は、長すぎることが判明しています。 ほとんどのユーザーは、ファイナリティに至るまで 15 分待つことも嫌がります。高いトランザクションスループットを必要とするアプリや取引所でも、トランザクションが永続的になったことを確認するために、長い間待たなければならなりません。 ブロックの提案とファイナリティの間に遅延があると、攻撃者が特定のブロックを検閲したり、MEV を抽出したりするなど、ショートレンジの再編成の機会が生じてしまいます。 ブロックを段階的にアップグレードするメカニズムも非常に複雑で、セキュリティの脆弱性を解消するために何度もパッチが当てられており、イーサリアムのコードベースの中でちょっとしたバグが入りやすい部分の 1 つです。 これらの問題は、ファイナリティに至るまでの時間を単一のスロットに短縮することで、すべて解決できます。 +現在のファイナリティに至るまでの時間は、長すぎることが判明しています。 ほとんどのユーザーは、ファイナリティに至るまで15分待つことも嫌がります。高いトランザクションスループットを必要とするアプリや取引所でも、トランザクションが永続的になったことを確認するために、長い間待たなければならなりません。 ブロックの提案とファイナリティの間に遅延があると、攻撃者が特定のブロックを検閲したり、MEVを抽出したりするなど、ショートレンジの再編成の機会が生じてしまいます。 ブロックを段階的にアップグレードするメカニズムも非常に複雑で、セキュリティの脆弱性を解消するために何度もパッチが当てられており、イーサリアムのコードベースの中でちょっとしたバグが入りやすい部分の1つです。 これらの問題は、ファイナリティに至るまでの時間を単一のスロットに短縮することで、すべて解決できます。 ## 分散化・時間・オーバーヘッドのトレードオフ {#the-decentralization-time-overhead-tradeoff} -ファイナリティ保証は、新しいブロックの即時のプロパティではありません。 新しいブロックがファイナライズされるまでには時間がかかります。 時間がかかる理由は、ネットワーク上でステーキングされた ETH の合計の 3 分の 2 以上に相当するバリデータが、ブロックをファイナライズするために投票(「証明」)する必要があるからです。 ネットワーク上の各バリデータノードは、他のノードから送られるアテステーションを処理して、ブロックが 3 分の 2 のしきい値に達したかどうかを確認する必要があります。 +ファイナリティ保証は、新しいブロックの即時のプロパティではありません。 新しいブロックがファイナライズされるまでには時間がかかります。 時間がかかる理由は、ネットワーク上でステーキングされたETHの合計の3分の2以上に相当するバリデータが、ブロックをファイナライズするために投票(「証明」)する必要があるからです。 ネットワーク上の各バリデータノードは、他のノードから送られるアテステーションを処理して、ブロックが3分の2のしきい値に達したかどうかを確認する必要があります。 ファイナライズに達するまでの時間が短くなるほど、アテステーションの処理を速く実行する必要があるため、各ノードでより高いコンピューティングパワーが必要になります。 また、ネットワーク上のバリデータノードの数が増えるほど、各ブロックごとに処理するアテステーションが増えるため、必要な処理能力も増加します。 より高い処理能力が必要になると、バリデータノードを実行するために必要なハードウェアの費用が高くなるため、参加できる人が減ってしまいます。 一方、ブロックの間隔を長くすると、各ノードで必要なコンピューティングパワーは減りますが、アテステーションの処理が遅くなるため、ファイナリティに至るまでの時間が長くなります。 -したがって、オーバーヘッド(コンピューティングパワー)、分散化(チェーンの検証に参加できるノードの数)、ファイナリティまでの時間の間にトレードオフがあります。 理想的なシステムでは、最小のコンピューティングパワー、最大の分散化、ファイナリティに達する最短の時間というように、3 つのパラメータを最適なバランスで実現することが重要です。 +したがって、オーバーヘッド(コンピューティングパワー)、分散化(チェーンの検証に参加できるノードの数)、ファイナリティまでの時間の間にトレードオフがあります。 理想的なシステムでは、最小のコンピューティングパワー、最大の分散化、ファイナリティに達する最短の時間というように、3つのパラメータを最適なバランスで実現することが重要です。 -イーサリアムの現在のコンセンサスメカニズムでは、次のように、これら 3 つのパラメータのバランスを取っています。 +イーサリアムの現在のコンセンサスメカニズムでは、次のように、これら3つのパラメータのバランスを取っています。 -- **最小ステークを 32ETH に設定。** これにより、個々のノードが処理する必要があるバリデータのアテステーションの上限数が設定されます。よって、各ノードの計算要件の上限も設定されます。 -- **ファイナリティまでの時間を約 15 分に設定。** これにより、一般的な家庭用コンピュータで実行されるバリデータが各ブロックのアテステーションを安全に処理するのに十分な時間が与えられます。 +- **最小ステークを32ETHに設定。** これにより、個々のノードが処理する必要があるバリデータのアテステーションの上限数が設定されます。よって、各ノードの計算要件の上限も設定されます。 +- **ファイナリティまでの時間を約15分に設定。** これにより、一般的な家庭用コンピュータで実行されるバリデータが各ブロックのアテステーションを安全に処理するのに十分な時間が与えられます。 -現在の仕組みでは、ファイナリティまでの時間を短くするには、ネットワーク上のバリデータの数を減らすか、各ノードのハードウェア要件を増やす必要があります。 ただし、各ノードのオーバーヘッドを増加させることなく、より多くのアテステーションをカウントできるように処理方法を改善することができます。 これにより、2 つのエポックにまたがることなく、単一スロット内でファイナリティを決定できるようになります。 +現在の仕組みでは、ファイナリティまでの時間を短くするには、ネットワーク上のバリデータの数を減らすか、各ノードのハードウェア要件を増やす必要があります。 ただし、各ノードのオーバーヘッドを増加させることなく、より多くのアテステーションをカウントできるように処理方法を改善することができます。 これにより、2つのエポックにまたがることなく、単一スロット内でファイナリティを決定できるようになります。 -## SSF への道筋 {#routes-to-ssf} +## SSFへの道筋 {#routes-to-ssf} -現在のコンセンサスメカニズムでは、委員会と呼ばれているものが複数のバリデータからのアテステーションをまとめて、ブロックを検証するために各バリデータが処理しなければならないメッセージの数を減らしています。 各バリデータは、各エポック(32 スロット)で証明する機会がありますが、各スロットでは、バリデータのサブセットのみが証明を行います。このサブセットを「委員会」と呼びます。 委員会は、複数のバリデータが「アグリゲータ」として選択され、サブネットに分割されることによって選ばれます。 これらのアグリゲータはそれぞれ、サブネット内の他のバリデータから受け取ったすべての署名を、1 つの集約された署名にまとめます。 個々のコントリビューションを最も多いアグリゲータが、その集約された署名をブロック提案者に渡します。ブロック提案者は、その署名を、他の委員会から受け取った集約された署名とともに、ブロックにまとめます。 +現在のコンセンサスメカニズムでは、委員会と呼ばれているものが複数のバリデータからのアテステーションをまとめて、ブロックを検証するために各バリデータが処理しなければならないメッセージの数を減らしています。 各バリデータは、各エポック(32スロット)で証明する機会がありますが、各スロットでは、バリデータのサブセットのみが証明を行います。このサブセットを「委員会」と呼びます。 委員会は、複数のバリデータが「アグリゲータ」として選択され、サブネットに分割されることによって選ばれます。 これらのアグリゲータはそれぞれ、サブネット内の他のバリデータから受け取ったすべての署名を、1つの集約された署名にまとめます。 個々のコントリビューションを最も多いアグリゲータが、その集約された署名をブロック提案者に渡します。ブロック提案者は、その署名を、他の委員会から受け取った集約された署名とともに、ブロックにまとめます。 -このプロセスでは、「32 スロット × 64 の委員会 × 委員会あたり 256 のバリデータ = エポックあたり 524,288 のバリデータ」となり、各バリデータが各エポックで投票する十分な容量を提供します。 執筆時点(2023 年 2 月)では、約 513,000 ものバリデータが存在しています。 +このプロセスでは、「32スロット × 64の委員会 × 委員会あたり256のバリデータ = エポックあたり524,288のバリデータ」となり、各バリデータが各エポックで投票する十分な容量を提供します。 執筆時点(2023年2月)では、約513,000ものバリデータが存在しています。 このスキームにおいて、ブロックに投票するには、すべてのバリデータがエポック全体でアテステーションを分配する必要があります。 しかしながら、各バリデータが各スロットで証明できるように、このメカニズムを改善する実現可能な方法があります。 -イーサリアムのコンセンサスメカニズムが設計された当初、署名集約スキーム(BLS)のスケーラビリティは懸念されていましたが、その後の研究により、BLS は当初考えられていたよりもはるかにスケーラブルであることがわかりました。また、クライアントにおける署名の処理および検証の処理能力も向上したことで、 バリデータから送られる膨大な数のアテステーションの処理が、現実的に 1 つのスロット内で可能になりました。 例えば、100 万のバリデータが各スロットで 2 回投票し、スロットの時間を 16 秒に調節している場合、スロットあたり 100 万のアテステーションを処理するためには、ノードは 1 秒に最低 125,000 もの集約に対して署名を検証する必要があります。 実際には、一般的なコンピュータが 1 つの署名を検証するのに約 500 ナノ秒かかるので、125,000 の署名の検証は約 62.5 ミリ秒で完了します。これは、1 秒のしきい値をはるかに下回っています。 +イーサリアムのコンセンサスメカニズムが設計された当初、署名集約スキーム(BLS)のスケーラビリティは懸念されていましたが、その後の研究により、BLSは当初考えられていたよりもはるかにスケーラブルであることがわかりました。また、クライアントにおける署名の処理および検証の処理能力も向上したことで、 バリデータから送られる膨大な数のアテステーションの処理が、現実的に1つのスロット内で可能になりました。 例えば、100万のバリデータが各スロットで2回投票し、スロットの時間を16秒に調節している場合、スロットあたり100万のアテステーションを処理するためには、ノードは1秒に最低125,000もの集約に対して署名を検証する必要があります。 実際には、一般的なコンピュータが1つの署名を検証するのに約500ナノ秒かかるので、125,000の署名の検証は約62.5ミリ秒で完了します。これは、1秒のしきい値をはるかに下回っています。 -スーパー委員会を設けることで、効率性がさらに向上する可能性があります。具体的には、125,000 ものバリデータをスロットごとにランダムに選択するなどです。 このバリデータのサブセットのみがブロックに対して投票できるため、ブロックがファイナライズされるかどうかを決定できるのです。 このアイデアが受け入れられるかどうかは、イーサリアムへの攻撃の成功に必要なコストを、コミュニティがどの程度高く設定するかにかかっています。 現在の仕様では、ステーキングされた総イーサの 3 分の 2 が必要ですが、このアイデアでは、*スーパー委員会*内でステーキングされたイーサの 3 分の 2 を使って不正なブロックをファイナライズさせる可能性があるためです。 これはまだ研究中の分野ですが、そもそもスーパー委員会を必要とするほどの大きなバリデータセットの場合、そのサブ委員会のいずれかを攻撃するコストが非常に高くなると考えられます(例: ETH 建ての攻撃コストは、`2/3 * 125,000 * 32 = ~2.6 million ETH`になります)。 攻撃のコストは、バリデータセットのサイズを増やすことで調整可能です(例: 攻撃のコストを 100 万 ETH、400 万 ETH、1000 万 ETH などにするために、バリデータのサイズを調整する等) 。 コミュニティの[事前調査](https://youtu.be/ojBgyFl6-v4?t=755)によると、100 万から 200 万イーサが許容可能な攻撃コストです。この場合、スーパー委員会ごとのバリデータ数は、約 65,536 ~ 97,152 になります。 +スーパー委員会を設けることで、効率性がさらに向上する可能性があります。具体的には、125,000ものバリデータをスロットごとにランダムに選択するなどです。 このバリデータのサブセットのみがブロックに対して投票できるため、ブロックがファイナライズされるかどうかを決定できるのです。 このアイデアが受け入れられるかどうかは、イーサリアムへの攻撃の成功に必要なコストを、コミュニティがどの程度高く設定するかにかかっています。 現在の仕様では、ステーキングされた総イーサの3分の2が必要ですが、このアイデアでは、_スーパー委員会_内でステーキングされたイーサの3分の2を使って不正なブロックをファイナライズさせる可能性があるためです。 これはまだ研究中の分野ですが、そもそもスーパー委員会を必要とするほどの大きなバリデータセットの場合、そのサブ委員会のいずれかを攻撃するコストが非常に高くなると考えられます(例: ETH建ての攻撃コストは、`2/3 * 125,000 * 32 = ~2.6 million ETH`になります)。 攻撃のコストは、バリデータセットのサイズを増やすことで調整可能です(例: 攻撃のコストを100万ETH、400万ETH、1000万ETHなどにするために、バリデータのサイズを調整する等) 。 コミュニティの[事前調査](https://youtu.be/ojBgyFl6-v4?t=755)によると、100万から200万イーサが許容可能な攻撃コストです。この場合、スーパー委員会ごとのバリデータ数は、約65,536~97,152になります。 -しかし、検証自体はボトルネックではありません。バリデータノードにとって実際に問題となるのは、署名の集約です。 署名の集約をスケールするには、各サブネットのバリデータの数を増やす、サブネットの数を増やす、集約レイヤーを追加する(つまり、委員会の委員会を実装する)などの方法が考えられます。 解決策の 1 つとして、専門のアグリゲーターを許可する方法があります。これは、プロポーザー/ビルダーセパレーション(PBS)とダンクシャーディングの環境下で、ブロック構築とロールアップデータのコミットメント生成を専門のブロックビルダーにアウトソーシングするのと似た方法です。 +しかし、検証自体はボトルネックではありません。バリデータノードにとって実際に問題となるのは、署名の集約です。 署名の集約をスケールするには、各サブネットのバリデータの数を増やす、サブネットの数を増やす、集約レイヤーを追加する(つまり、委員会の委員会を実装する)などの方法が考えられます。 解決策の1つとして、専門のアグリゲーターを許可する方法があります。これは、プロポーザー/ビルダーセパレーション(PBS)とダンクシャーディングの環境下で、ブロック構築とロールアップデータのコミットメント生成を専門のブロックビルダーにアウトソーシングするのと似た方法です。 -## SSF におけるフォーク選択ルールの役割 {#role-of-the-fork-choice-rule} +## SSFにおけるフォーク選択ルールの役割 {#role-of-the-fork-choice-rule} -現在のコンセンサスメカニズムでは、ファイナリティガジェット(バリデータの 3 分の 2 がチェーンを証明したかどうかを判断するアルゴリズム)とフォーク選択ルール(複数のチェーンが存在する場合に、どのチェーンが正しいかを判断するアルゴリズム)が密接に連携して動作しています。 フォーク選択アルゴリズムでは、 最後にファイナライズしたブロック*以降*のブロックのみが対象と見なされます。 SSF では、ブロックが提案されると同時に、そのスロットのファイナリティが発生します。そのため、フォーク選択ルールが適用されるブロックがありません。 つまり、SSF では、フォーク選択アルゴリズム*または*ファイナリティガジェットの*いずれか*が常に有効です。 ファイナリティガジェットは、3 分の 2 のバリデータがオンラインで、ブロックが正しいことが証明された場合に、そのブロックを確定します。 ブロックが 3 分の 2 のしきい値を超えることができない場合は、フォーク選択ルールが作動して、どのチェーンに従うかを決定します。 多少のニュアンスが追加されるものの、バリデータの 3 分の 1 以上がオフラインになった場合でも、チェーンを回復する非アクティブリークメカニズムを維持する機会も生まれます。 +現在のコンセンサスメカニズムでは、ファイナリティガジェット(バリデータの3分の2がチェーンを証明したかどうかを判断するアルゴリズム)とフォーク選択ルール(複数のチェーンが存在する場合に、どのチェーンが正しいかを判断するアルゴリズム)が密接に連携して動作しています。 フォーク選択アルゴリズムでは、 最後にファイナライズしたブロック_以降_のブロックのみが対象と見なされます。 SSFでは、ブロックが提案されると同時に、そのスロットのファイナリティが発生します。そのため、フォーク選択ルールが適用されるブロックがありません。 つまり、SSFでは、フォーク選択アルゴリズム_または_ファイナリティガジェットの_いずれか_が常に有効です。 ファイナリティガジェットは、3分の2のバリデータがオンラインで、ブロックが正しいことが証明された場合に、そのブロックを確定します。 ブロックが3分の2のしきい値を超えることができない場合は、フォーク選択ルールが作動して、どのチェーンに従うかを決定します。 多少のニュアンスが追加されるものの、バリデータの3分の1以上がオフラインになった場合でも、チェーンを回復する非アクティブリークメカニズムを維持する機会も生まれます。 ## 未解決の問題 {#outstanding-issues} -サブネットごとのバリデータ数を増やすことで集約をスケーリングする際の問題は、ピアツーピアネットワークの負荷が増大することです。 また、集約レイヤーを追加すると、エンジニアリングが非常に複雑になり、レイテンシーが増加します(つまり、ブロック提案者が全てのサブネットアグリゲーターからのメッセージを受信するまでに時間がかかる可能性があります)。 BLS 署名集約を使用しても、ネットワーク上にアクティブなバリデータが多数存在する場合、各スロット内で処理できる数を超えてしまう可能性があります。その場合の対応方法は明らかになっていません。 1 つの解決策として考えられるのは、全バリデータが各スロットで証明を行い、SSF において委員会を廃止し、有効残高の 32ETH 上限を撤廃することです。つまり、複数のバリデータを管理するオペレータは、ステークを統合して実行回数を減らし、バリデータノードはバリデータセット全体を構成することで処理するメッセージの数を減らすことができます。 大規模なステーカーがバリデータを統合することに同意することで、この問題は解決します。 また、バリデータの数やステーキングされた ETH の量に一定の上限を設けることも可能ですが、 その場合は、参加を許可するバリデータを選ぶ何らかのメカニズムが必要になるため、望ましくない二次的な影響が生じる可能性があります。 +サブネットごとのバリデータ数を増やすことで集約をスケーリングする際の問題は、ピアツーピアネットワークの負荷が増大することです。 また、集約レイヤーを追加すると、エンジニアリングが非常に複雑になり、レイテンシーが増加します(つまり、ブロック提案者が全てのサブネットアグリゲーターからのメッセージを受信するまでに時間がかかる可能性があります)。 BLS署名集約を使用しても、ネットワーク上にアクティブなバリデータが多数存在する場合、各スロット内で処理できる数を超えてしまう可能性があります。その場合の対応方法は明らかになっていません。 1つの解決策として考えられるのは、全バリデータが各スロットで証明を行い、SSFにおいて委員会を廃止し、有効残高の32ETH上限を撤廃することです。つまり、複数のバリデータを管理するオペレータは、ステークを統合して実行回数を減らし、バリデータノードはバリデータセット全体を構成することで処理するメッセージの数を減らすことができます。 大規模なステーカーがバリデータを統合することに同意することで、この問題は解決します。 また、バリデータの数やステーキングされたETHの量に一定の上限を設けることも可能ですが、 その場合は、参加を許可するバリデータを選ぶ何らかのメカニズムが必要になるため、望ましくない二次的な影響が生じる可能性があります。 ## 現在の進行状況 {#current-progress} -SSF はまだ研究段階です。 [バークルツリー](/roadmap/verkle-trees/)や[ダンクシャーディング](/roadmap/danksharding])などの他の大きなアップグレードが完了してから、数年後になるかもしれません。 +SSFはまだ研究段階です。 [バークルツリー](/roadmap/verkle-trees/)や[ダンクシャーディング](/roadmap/danksharding])などの他の大きなアップグレードが完了してから、数年後になるかもしれません。 ## 参考文献 {#further-reading} -- [ヴィタリックによる EDCON 2022 での SSF の説明](https://www.youtube.com/watch?v=nPgUKNPWXNI) +- [ヴィタリックによるEDCON 2022でのSSFの説明](https://www.youtube.com/watch?v=nPgUKNPWXNI) - [ヴィタリックのノート: シングルスロット・ファイナリティへの道](https://notes.ethereum.org/@vbuterin/single_slot_finality) diff --git a/public/content/translations/ja/roadmap/statelessness/index.md b/public/content/translations/ja/roadmap/statelessness/index.md index 182b724204a..d95b07803fc 100644 --- a/public/content/translations/ja/roadmap/statelessness/index.md +++ b/public/content/translations/ja/roadmap/statelessness/index.md @@ -8,7 +8,7 @@ lang: ja 真に分散化するためには、一般的なハードウェアでイーサリアムノードを実行できることが重要です。 なぜなら、ユーザーがノードを実行することで、サードパーティにデータを供給してもらうのではなく、自身で暗号チェックを行って情報を検証できるからです。 また、ノードを実行することで、仲介者を介することなく、イーサリアムのピアツーピアネットワークに直接トランザクションを送信できます。 これらの利点を享受できるのが高価なハードウェアを使用するユーザーだけだと、分散化は実現できません。 そのため、ノードは、携帯電話やマイクロコンピュータ、家庭用コンピュータでも問題なく動作できるように、処理要件やメモリ要件を極力抑えて実行する必要があります。 -現在のイーサリアムでは、ノードへのユニバーサルアクセスを妨げている主な障壁は、高いディスク容量要件です。 これは主に、イーサリアムの状態データの大部分を保存する必要があることに起因しています。 状態データには、新しいブロックとトランザクションを正しく処理するために必要となる重要な情報が含まれています。 この記事の執筆時点では、イーサリアムのフルノードを実行するには、2TB の高速 SSD が推奨されています。 古いデータをプルーニングしないノードの場合、ストレージ容量は週に約 14GB ずつ増加していきます。誕生以降のすべてのデータを保存するアーカイブノードでは、現在 12TB 近くの容量が必要です(この記事は 2023 年 2 月に執筆されました)。 +現在のイーサリアムでは、ノードへのユニバーサルアクセスを妨げている主な障壁は、高いディスク容量要件です。 これは主に、イーサリアムの状態データの大部分を保存する必要があることに起因しています。 状態データには、新しいブロックとトランザクションを正しく処理するために必要となる重要な情報が含まれています。 この記事の執筆時点では、イーサリアムのフルノードを実行するには、2TBの高速SSDが推奨されています。 古いデータをプルーニングしないノードの場合、ストレージ容量は週に約14GBずつ増加していきます。誕生以降のすべてのデータを保存するアーカイブノードでは、現在12TB近くの容量が必要です(この記事は2023年2月に執筆されました)。 古いデータは安価なハードドライブで保存できますが、新しいこれから受信するブロックを処理するには遅すぎます。 イーサリアムの状態は「無限」に増えるため、現在のクライアントのストレージ設計を維持したまま、データをより安価で保存できるようにしても、問題の根本的な解決にはなりません。つまり、ストレージ要件は今後も増加する可能性があり、技術的な改善は常に求められます。また、状態の肥大化に追いつくためにも、継続的な努力が必要です。 そのため、クライアントは、ローカルデータベースによるデータの検索に依存しない、ブロックとトランザクションを検証する新しい方法を見つける必要があります。 @@ -16,7 +16,7 @@ lang: ja 各ノードが保存する必要があるデータ量を削減するには、以下の方法があります。それぞれ異なる範囲でイーサリアムのコアプロトコルを更新する必要があります。 -- **履歴の有効期限**: イーサリアムクライアントの状態データを処理する方法自体は変更しませんが、ノードが X ブロックよりも古い状態データを破棄できるようにします。 +- **履歴の有効期限**: イーサリアムクライアントの状態データを処理する方法自体は変更しませんが、ノードがXブロックよりも古い状態データを破棄できるようにします。 - **状態の有効期限**: 頻繁に使用されない状態データを非アクティブにすることができます。 非アクティブなデータは、復元されない限りクライアントによって無視されます。 - **弱いステートレス**: ブロック作成者のみが、すべての状態データにアクセスする必要があり、他のノードはローカル状態データベースがなくても、ブロックを検証できます。 - **強いステートレス**: すべての状態データにアクセスするノードが不要になります。 @@ -25,13 +25,13 @@ lang: ja ### 履歴の有効期限 {#history-expiry} -履歴の有効期限とは、クライアントが必要性の低い古いデータを削除することです。少量の履歴データは少量しか保存しないため、新しいデータが到着すると古いデータを削除します。 クライアントが履歴データを必要とする理由は、2 つあります。1 つはデータの同期、もう 1 つはデータのリクエストの処理です。 もともとクライアントでは、始まりのブロックから同期することで、連続する各ブロックがチェーンの先頭に至るまで正しく追加されていることを検証する必要がありました。 しかし、現在のクライアントでは、「弱い主観性チェックポイント」と呼ばれる方法を使って、チェーンの先頭にたどり着くまでの時間を短縮しています。 これらのチェックポイントは、イーサリアムの始まりではなく、現在に近い始まりのブロックを基準にしているため、信頼できる開始点となります。 つまり、最新の弱い主観性チェックポイントより前のすべての情報は、 クライアントがチェーンの先頭へ同期する機能に影響を与えることなく削除できるということです。 現在のクライアントは、ローカルデータベースから履歴データを取得することで、(JSON-RPC 経由で届く)履歴データのリクエストを処理しています。 ただし、履歴の有効期限が切れると、リクエストされたデータが削除されている場合は、履歴データを取得できません。 この履歴データを提供するには、いくつかの革新的なソリューションが必要です。 +履歴の有効期限とは、クライアントが必要性の低い古いデータを削除することです。少量の履歴データは少量しか保存しないため、新しいデータが到着すると古いデータを削除します。 クライアントが履歴データを必要とする理由は、2つあります。1つはデータの同期、もう1つはデータのリクエストの処理です。 もともとクライアントでは、始まりのブロックから同期することで、連続する各ブロックがチェーンの先頭に至るまで正しく追加されていることを検証する必要がありました。 しかし、現在のクライアントでは、「弱い主観性チェックポイント」と呼ばれる方法を使って、チェーンの先頭にたどり着くまでの時間を短縮しています。 これらのチェックポイントは、イーサリアムの始まりではなく、現在に近い始まりのブロックを基準にしているため、信頼できる開始点となります。 つまり、最新の弱い主観性チェックポイントより前のすべての情報は、 クライアントがチェーンの先頭へ同期する機能に影響を与えることなく削除できるということです。 現在のクライアントは、ローカルデータベースから履歴データを取得することで、(JSON-RPC経由で届く)履歴データのリクエストを処理しています。 ただし、履歴の有効期限が切れると、リクエストされたデータが削除されている場合は、履歴データを取得できません。 この履歴データを提供するには、いくつかの革新的なソリューションが必要です。 -履歴データを取得する方法の 1 つは、クライアントがポータルネットワークなどのソリューションを介して、ピアから履歴データをリクエストすることです。 ポータルネットワークは、まだ開発中ではありますが、履歴データを提供するピアツーピアネットワークです。各ノードは、イーサリアムの履歴の一部を保存し、履歴全体がネットワーク全体に分散されるようにします。 履歴データのリクエストは、関連するデータを保存しているピアを探し出し、そのピアからデータを取得することで処理されます。 また、履歴データへのアクセスを必要とするのは、通常アプリであるため、アプリがデータを保存する役割を担うかもしれません。 イーサリアム空間には、履歴のアーカイブを維持したいという利他的なアクターが十分に存在する可能性があります。 履歴データストレージを管理するための DAO が立ち上がる可能性もあります。あるいは、これらすべての選択肢を組み合わせた理想的な方法があるかもしれません。 これらのプロバイダは、トレント、FTP、Filecoin、IPFS など、様々な方法でデータを提供することが考えられます。 +履歴データを取得する方法の1つは、クライアントがポータルネットワークなどのソリューションを介して、ピアから履歴データをリクエストすることです。 ポータルネットワークは、まだ開発中ではありますが、履歴データを提供するピアツーピアネットワークです。各ノードは、イーサリアムの履歴の一部を保存し、履歴全体がネットワーク全体に分散されるようにします。 履歴データのリクエストは、関連するデータを保存しているピアを探し出し、そのピアからデータを取得することで処理されます。 また、履歴データへのアクセスを必要とするのは、通常アプリであるため、アプリがデータを保存する役割を担うかもしれません。 イーサリアム空間には、履歴のアーカイブを維持したいという利他的なアクターが十分に存在する可能性があります。 履歴データストレージを管理するためのDAOが立ち上がる可能性もあります。あるいは、これらすべての選択肢を組み合わせた理想的な方法があるかもしれません。 これらのプロバイダは、トレント、FTP、Filecoin、IPFSなど、様々な方法でデータを提供することが考えられます。 履歴の有効期限を実装することについては、多少の議論があります。イーサリアムはこれまで、履歴データが常に利用可能であることを暗黙的に保証してきました。 そのため、誕生からのフル同期は、過去のデータの再構築にスナップショットを利用する場合でも、標準として常に可能になっています。 履歴の有効期限があることで、イーサリアムコアプロトコルは履歴データの保証責任を放棄します。 こうして、過去データを提供するのが中央集権的な組織になってしまうと、新たな検閲リスクが生じる可能性があります。 -EIP-4444 は、現在も活発な議論が行われており、まだリリースする準備はできていません。 EIP-4444 の課題は、技術的なものではなく、そのほとんどがコミュニティ管理に関するものであることが興味深い点です。 この機能をリリースするには、単なる合意だけでなく、信頼できるエンティティによる履歴データの保存および提供の約束を含めたコミュニティの賛同が必要になります。 +EIP-4444は、現在も活発な議論が行われており、まだリリースする準備はできていません。 EIP-4444の課題は、技術的なものではなく、そのほとんどがコミュニティ管理に関するものであることが興味深い点です。 この機能をリリースするには、単なる合意だけでなく、信頼できるエンティティによる履歴データの保存および提供の約束を含めたコミュニティの賛同が必要になります。 このアップグレードは、イーサリアムノードにおける状態データの扱いを大きく変えるものではありません。あくまでも、履歴データへのアクセス方法を変更するだけです。 @@ -44,7 +44,7 @@ EIP-4444 は、現在も活発な議論が行われており、まだリリー レンタル料による有効期限の場合、データベースをアクティブ状態に維持するためには、アカウントに直接貸し出すことが考えられます。 時間による有効期限の場合、最後のアカウント操作から有効期限をカウントダウンによるものか、すべてのアカウントの定期的な有効期限切れによるものか、いずれの可能性も考えられます また、時間ベースのモデルとレンタル料ベースのモデルの両方の要素を組み合わせたメカニズムも考えられます。例えば、各アカウントは、時間ベースの有効期限が切れる前に少額の料金を支払いをすることで、アクティブな状態を維持できる等です。 状態の有効期限が切れても、非アクティブな状態は**削除されない**ことに注意してください。アクティブな状態とは別に保存されます。 また、非アクティブな状態をアクティブに戻すこともできます。 -この機能を実現するには、約 1 年間の状態ツリーが必要です。 新たな期間が開始するたびに、新たな状態ツリーが作成されます。 現在の状態ツリーのみ変更でき、以前のものは変更できません。 イーサリアムノードでは、現在の状態ツリーと次の最新の状態ツリーのみを保持する予定です。 そのためには、アドレスにその存在期間をタイムスタンプする方法が必要になります。 [いくつかの方法](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607)が考えられますが、有力な方法としては、追加情報を格納できるように[アドレスを長くするよう](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)要求することです。これにより、アドレスが長くなるほど安全性が高まるという利点も追加されます。 このロードマップアイテムは、[アドレス空間拡張](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)と呼ばれます。 +この機能を実現するには、約1年間の状態ツリーが必要です。 新たな期間が開始するたびに、新たな状態ツリーが作成されます。 現在の状態ツリーのみ変更でき、以前のものは変更できません。 イーサリアムノードでは、現在の状態ツリーと次の最新の状態ツリーのみを保持する予定です。 そのためには、アドレスにその存在期間をタイムスタンプする方法が必要になります。 [いくつかの方法](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607)が考えられますが、有力な方法としては、追加情報を格納できるように[アドレスを長くするよう](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)要求することです。これにより、アドレスが長くなるほど安全性が高まるという利点も追加されます。 このロードマップアイテムは、[アドレス空間拡張](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)と呼ばれます。 履歴の有効期限と同様に、状態の有効期限では、ユーザーは古い状態データを自分で保存する必要がなくなります。代わりに、中央集権型のプロバイダー、利他的なコミュニティのメンバー、またはポータルネットワークなどのより革新的な分散型ソリューションなど、他のエンティティが保存の責任を担います。 @@ -52,7 +52,7 @@ EIP-4444 は、現在も活発な議論が行われており、まだリリー ## ステートレス {#statelessness} -「状態」の概念がなくなるわけではなく、イーサリアムノードが状態データを処理する方法が変更されるものであるため、ステートレスという名称は少し不適切かもしれません。 ステートレスには、弱いステートレスと強いステートレスの 2 種類があります。 弱いステートレスでは、状態ストレージの役割を少数のノードに負わせることで、ほとんどのノードをステートレスにすることができます。 強いステートレスでは、すべてのノードが完全な状態データを保存する必要がなくなります。 弱いステートレスと強いステートレスのどちらも、通常のバリデータに次の利点をもたらします。 +「状態」の概念がなくなるわけではなく、イーサリアムノードが状態データを処理する方法が変更されるものであるため、ステートレスという名称は少し不適切かもしれません。 ステートレスには、弱いステートレスと強いステートレスの2種類があります。 弱いステートレスでは、状態ストレージの役割を少数のノードに負わせることで、ほとんどのノードをステートレスにすることができます。 強いステートレスでは、すべてのノードが完全な状態データを保存する必要がなくなります。 弱いステートレスと強いステートレスのどちらも、通常のバリデータに次の利点をもたらします。 - ほぼ瞬時に同期できる - ブロックを順不同で検証できる @@ -66,7 +66,7 @@ EIP-4444 は、現在も活発な議論が行われており、まだリリー **弱いステートレスでは、ブロックの提案には、完全な状態データへのアクセスが必要になりますが、ブロックの検証では状態データは不要です。** -これを実現するには、イーサリアムクライアントに[バークルツリー](/roadmap/verkle-trees)が実装されている必要があります。 バークルツリーは、イーサリアムの状態データを保存するための次世代のデータ構造です。ローカルデータベースでブロックを検証する代わりに、データに対して小さな固定サイズの「ウィットネス」をピア間で受け渡し、ブロックを検証します。 [プロポーザー/ビルダーセパレーション](/roadmap/pbs/)も必要です。これにより、ブロックビルダーは、完全な状態データへのアクセスが必要なため、より強力なハードウェアを備えた専門のノードになります。 +これを実現するには、イーサリアムクライアントに[バークルツリー](/roadmap/verkle-trees/)が実装されている必要があります。 バークルツリーは、イーサリアムの状態データを保存するための次世代のデータ構造です。ローカルデータベースでブロックを検証する代わりに、データに対して小さな固定サイズの「ウィットネス」をピア間で受け渡し、ブロックを検証します。 [プロポーザー/ビルダーセパレーション](/roadmap/pbs/)も必要です。これにより、ブロックビルダーは、完全な状態データへのアクセスが必要なため、より強力なハードウェアを備えた専門のノードになります。 @@ -81,7 +81,7 @@ EIP-4444 は、現在も活発な議論が行われており、まだリリー ### 強いステートレス {#strong-statelessness} -強いステートレスでは、ブロックに状態データを保存する必要がなくなります。 代わりに、集約されたウィットネスとともにトランザクションが送信されます。 ブロック生成者は、関連するアカウントのウィットネスを生成するために必要な状態のみを保存します。 状態に対する責任はほとんどユーザーが負い、ユーザーはどのアカウントとストレージ鍵とやり取りしているかを宣言するために、ウィットネスと「アクセスリスト」を送信します。 +強いステートレスでは、ブロックに状態データを保存する必要がなくなります。 代わりに、集約されたウィットネスとともにトランザクションが送信されます。 ブロック生成者は、関連するアカウントのウィットネスを生成するために必要な状態のみを保存します。 状態に対する責任はほとんどユーザーが負い、ユーザーはどのアカウントとストレージ鍵とやり取りしているかを宣言するために、ウィットネスと「アクセスリスト」を送信します。 これにより、ノードが非常に軽量になりますが、スマートコントラクトとのトランザクションがより困難になるなどのトレードオフがあります。 強いステートレスは、研究者によって調査されていますが、現時点では、イーサリアムのロードマップには含まれていません。イーサリアムのスケーリングには、弱いステートレスが十分に機能すると考えられているためです。 @@ -91,12 +91,12 @@ EIP-4444 は、現在も活発な議論が行われており、まだリリー ## 参考文献 {#further-reading} -- [ヴィタリックによるステートレスに関する AMA](https://www.reddit.com/r/ethereum/comments/o9s15i/impromptu_technical_ama_on_statelessness_and/) +- [ヴィタリックによるステートレスに関するAMA](https://www.reddit.com/r/ethereum/comments/o9s15i/impromptu_technical_ama_on_statelessness_and/) - [状態サイズの管理理論](https://hackmd.io/@vbuterin/state_size_management) - [Resurrection-conflict-minimized 状態境界](https://ethresear.ch/t/resurrection-conflict-minimized-state-bounding-take-2/8739) - [ステートレスと状態の有効期限への工程](https://hackmd.io/@vbuterin/state_expiry_paths) -- [EIP-4444 の仕様](https://eips.ethereum.org/EIPS/eip-4444) -- [アレックス・ストークス(Alex Stokes)EIP-4444 の概要を説明するビデオ](https://youtu.be/SfDC_qUZaos) +- [EIP-4444の仕様](https://eips.ethereum.org/EIPS/eip-4444) +- [アレックス・ストークス(Alex Stokes)EIP-4444の概要を説明するビデオ](https://youtu.be/SfDC_qUZaos) - [ステートレスにすることが重要な理由](https://dankradfeist.de/ethereum/2021/02/14/why-stateless.html) - [ステートレスクライアントのオリジナルコンセプトに関するノート](https://ethresear.ch/t/the-stateless-client-concept/172) - [状態の有効期限の詳細](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) diff --git a/public/content/translations/ja/roadmap/user-experience/index.md b/public/content/translations/ja/roadmap/user-experience/index.md index de914192e35..e9cf4e03df0 100644 --- a/public/content/translations/ja/roadmap/user-experience/index.md +++ b/public/content/translations/ja/roadmap/user-experience/index.md @@ -7,11 +7,11 @@ alt: "イーサリアムロードマップ" template: roadmap --- -イーサリアムを簡単に使用するためには、鍵やウォレットの管理からトランザクションの開始まで、さまざまな手順が必要です。 一般への普及を促進するには、これらの手順を簡略化して、イーサリアムを大幅に使いやすくする必要があります。また、Web2 アプリのようなスムーズなユーザーエクスペリエンスを提供することで、パーミッションレスで検閲耐性のあるアクセスを体験できるようにしなければなりません。 +イーサリアムを簡単に使用するためには、鍵やウォレットの管理からトランザクションの開始まで、さまざまな手順が必要です。 一般への普及を促進するには、これらの手順を簡略化して、イーサリアムを大幅に使いやすくする必要があります。また、Web2アプリのようなスムーズなユーザーエクスペリエンスを提供することで、パーミッションレスで検閲耐性のあるアクセスを体験できるようにしなければなりません。 ## シードフレーズを超えて {#no-more-seed-phrases} -イーサリアムのアカウントは、 「公開鍵」でアカウントを特定し、「秘密鍵」でメッセージに署名します。この鍵のペアを利用して、イーサリアムのアカウントは保護されています。 秘密鍵は、マスターパスワードのようなものです。この鍵があれば、イーサリアムアカウントに完全にアクセスすることができます。 イーサリアムのアカウントの操作は、銀行や Web2 アプリのように、ユーザーに代わって口座を管理する仕組みとは異なるため、戸惑う人もいるでしょう。 集中化されているサードパーティに依存することなくイーサリアムを一般に普及させるには、ユーザーが公開鍵と秘密鍵による暗号化や鍵管理を理解しなくても、自分の資産を保管し、自分のデータを管理できる簡単でスムーズな方法が必要です。 +イーサリアムのアカウントは、 「公開鍵」でアカウントを特定し、「秘密鍵」でメッセージに署名します。この鍵のペアを利用して、イーサリアムのアカウントは保護されています。 秘密鍵は、マスターパスワードのようなものです。この鍵があれば、イーサリアムアカウントに完全にアクセスすることができます。 イーサリアムのアカウントの操作は、銀行やWeb2アプリのように、ユーザーに代わって口座を管理する仕組みとは異なるため、戸惑う人もいるでしょう。 集中化されているサードパーティに依存することなくイーサリアムを一般に普及させるには、ユーザーが公開鍵と秘密鍵による暗号化や鍵管理を理解しなくても、自分の資産を保管し、自分のデータを管理できる簡単でスムーズな方法が必要です。 これに対する解決策は、スマートコントラクトウォレットを使用してイーサリアムとやり取りすることです。 スマートコントラクトウォレットは、鍵の紛失や盗難に備えたアカウント保護、より優れた不正行為の検出や防御、新しい機能の追加など、さまざまなメリットをもたらします。 スマートコントラクトウォレットはすでに存在していますが、まだ使いにくいため、イーサリアムプロトコルがそれらをより便利に使えるようにサポートする必要があります。 この追加サポートは、アカウント抽象化と呼ばれています。 @@ -25,11 +25,11 @@ template: roadmap バークルツリーについての詳細 -これらのアップグレードにより、ノードの実行に対する障壁が事実上無くなります。 ユーザーは、コンピューターや携帯電話のディスク容量や CPU を気にせずに、イーサリアムに安全かつパーミッションレスにアクセスできるようになります。また、アプリを使用するときに、データやネットワークへのアクセスでサードパーティに依存する必要がなくなります。 +これらのアップグレードにより、ノードの実行に対する障壁が事実上無くなります。 ユーザーは、コンピューターや携帯電話のディスク容量やCPUを気にせずに、イーサリアムに安全かつパーミッションレスにアクセスできるようになります。また、アプリを使用するときに、データやネットワークへのアクセスでサードパーティに依存する必要がなくなります。 ## 現在の進行状況 {#current-progress} -スマートコントラクトウォレットはすでに利用可能ですが、それらをできるだけ分散化してパーミッションレスにするには、さらなるアップグレードが必要です。 EIP-4337 は、イーサリアムのプロトコルへを変更せずに導入できる成熟した提案です。 EIP-4337 で必要となる主要なスマートコントラクトは、2023 年 3 月にデプロイされました。 +スマートコントラクトウォレットはすでに利用可能ですが、それらをできるだけ分散化してパーミッションレスにするには、さらなるアップグレードが必要です。 EIP-4337は、イーサリアムのプロトコルへを変更せずに導入できる成熟した提案です。 EIP-4337で必要となる主要なスマートコントラクトは、2023年3月にデプロイされました。 完全なステートレスはまだ研究段階にあり、実装されるのは数年先になると考えられます。 データ有効期限を含む完全にステートレスになる工程には、いくつかのマイルストーンがあり、そのうちのいくつかは、近い将来に実装される可能性がありますが、 [バークルツリー](/roadmap/verkle-trees/)や[プロポーザー/ビルダーセパレーション](/roadmap/pbs/)などの他の工程が先に完了している必要があります。 diff --git a/public/content/translations/ja/roadmap/verkle-trees/index.md b/public/content/translations/ja/roadmap/verkle-trees/index.md index a869f0f6ed8..5ab6fc0bfa7 100644 --- a/public/content/translations/ja/roadmap/verkle-trees/index.md +++ b/public/content/translations/ja/roadmap/verkle-trees/index.md @@ -13,33 +13,33 @@ summaryPoints: ## ステートレス {#statelessness} -バークルツリーは、ステートレスなイーサリアムクライアントの実現に欠かせない重要なステップです。 ステートレスクライアントは、受信したブロックを検証するために、状態データベース全体を格納する必要がありません。 クライアントがローカルに保存しているイーサリアムの状態のコピーを使用してブロックを検証する代わりに、ブロックに含まれる状態データの「ウィットネス」を使用します。 この「ウィットネス」は、特定の一連のトランザクションを実行するために必要な状態データの個々の部分を集めたもので、データ全体の一部であることを示す暗号学的証明になります。 このウィットネスを、状態データベースの*代わりに*使用します。 ネットワーク全体に安全にブロードキャストするには、バリデータが 12 秒のスロット内に処理できる必要があります。そのためには、ウィットネスが非常に小さくなければなりません。 しかし、現在の状態データの構造では、ウィットネスが大きすぎるため、適していません。 バークルツリーは、小さなウィットネスを可能にすることで、この問題を解決します。これにより、ステートレスクライアントを実現するための、1 つの大きな障害を克服することができます。 +バークルツリーは、ステートレスなイーサリアムクライアントの実現に欠かせない重要なステップです。 ステートレスクライアントは、受信したブロックを検証するために、状態データベース全体を格納する必要がありません。 クライアントがローカルに保存しているイーサリアムの状態のコピーを使用してブロックを検証する代わりに、ブロックに含まれる状態データの「ウィットネス」を使用します。 この「ウィットネス」は、特定の一連のトランザクションを実行するために必要な状態データの個々の部分を集めたもので、データ全体の一部であることを示す暗号学的証明になります。 このウィットネスを、状態データベースの_代わりに_使用します。 ネットワーク全体に安全にブロードキャストするには、バリデータが12秒のスロット内に処理できる必要があります。そのためには、ウィットネスが非常に小さくなければなりません。 しかし、現在の状態データの構造では、ウィットネスが大きすぎるため、適していません。 バークルツリーは、小さなウィットネスを可能にすることで、この問題を解決します。これにより、ステートレスクライアントを実現するための、1つの大きな障害を克服することができます。 -イーサリアムクライアントは現在、状態データを保存するためにパトリシア・マークル・ツリーと呼ばれるデータ構造を使用しています。 個々のアカウントに関する情報はツリー上のリーフとして保存され、そのリーフのペアが 1 つのハッシュになるまで繰り返しハッシュ化されます。 この最後のハッシュは、「ルート」と呼ばれます。 イーサリアムクライアントは、ブロック内のすべてのトランザクションを実行し、ローカルにある状態ツリーを更新することで、ブロックを検証します。 ローカルにあるツリーのルートが、ブロック提案者によって提供されたルートと同じであれば、ブロックは有効であると判断されます。なぜなら、ブロック提案者と検証ノードが異なる計算を実行した場合、ルートハッシュが完全に違うものになるためです。 問題は、ブロックチェーンを検証するために、各クライアントがブロックの先頭までの状態ツリー全体と複数の履歴ブロックを保持する必要があることです(Geth のデフォルト設定では、ヘッドから遡って 128 ブロックの状態データを保持します)。 現在の状態では、クライアントは大容量のディスク領域が必要になり、安価で低電力のハードウェアでフルノードを実行する際の障壁となります。 これに対する解決策は、より効率的な構造(バークルツリー)を持った状態ツリーを更新することです。バークルツリーでは、完全な状態データの代わりに、共有可能なデータである小さな「ウィットネス」を使うことで集約することができます。 状態データをバークルツリーに再フォーマットすることは、ステートレスクライアントへ移行するための足掛かりとなります。 +イーサリアムクライアントは現在、状態データを保存するためにパトリシア・マークル・ツリーと呼ばれるデータ構造を使用しています。 個々のアカウントに関する情報はツリー上のリーフとして保存され、そのリーフのペアが1つのハッシュになるまで繰り返しハッシュ化されます。 この最後のハッシュは、「ルート」と呼ばれます。 イーサリアムクライアントは、ブロック内のすべてのトランザクションを実行し、ローカルにある状態ツリーを更新することで、ブロックを検証します。 ローカルにあるツリーのルートが、ブロック提案者によって提供されたルートと同じであれば、ブロックは有効であると判断されます。なぜなら、ブロック提案者と検証ノードが異なる計算を実行した場合、ルートハッシュが完全に違うものになるためです。 問題は、ブロックチェーンを検証するために、各クライアントがブロックの先頭までの状態ツリー全体と複数の履歴ブロックを保持する必要があることです(Gethのデフォルト設定では、ヘッドから遡って128ブロックの状態データを保持します)。 現在の状態では、クライアントは大容量のディスク領域が必要になり、安価で低電力のハードウェアでフルノードを実行する際の障壁となります。 これに対する解決策は、より効率的な構造(バークルツリー)を持った状態ツリーを更新することです。バークルツリーでは、完全な状態データの代わりに、共有可能なデータである小さな「ウィットネス」を使うことで集約することができます。 状態データをバークルツリーに再フォーマットすることは、ステートレスクライアントへ移行するための足掛かりとなります。 ## ウィットネスの説明とその必要性 {#what-is-a-witness} -ブロックの検証では、ブロックに含まれるトランザクションを再実行し、その変更をイーサリアムの状態ツリーに適用することで、新しいルートハッシュを計算します。 検証されたブロックでは、その計算された状態ルートのハッシュがブロックで提供されたものと一致します。つまり、ブロックの提案者が本当にルートハッシュの計算を行ったことが確認できます。 現状のイーサリアムクライアントで状態を更新するには、状態ツリー全体にアクセスする必要があり、この巨大なデータ構造がローカルに保存されていなければなりません。 ウィットネスは、ブロック内のトランザクションを実行するために必要な状態データのフラグメントのみを含みます。 バリデータは、このフラグメントを使用して、ブロック提案者がブロックトランザクションを正しく実行し、状態が正常に更新されたかどうかを検証できます。 ただし、ウィットネスが各ノードにおいて 12 秒間のスロット内で安全に受信、処理されるためには、イーサリアムネットワーク上のピア間で十分な速度で転送する必要があります。 ウィットネスが大きすぎると、一部のノードにおいて、それをダウンロードしてチェーンを最新の状態を維持するのに時間がかかりすぎる可能性があります。 これでは、高速インターネット接続を持つノードのみがブロックの検証に参加できることになり、中央集権的な影響力を高めてしまいます。 バークルツリーを使用することで、状態をハードウェアドライブに保存する必要がなくなります。 つまり、ブロックを検証するために必要な*すべて*がブロック内に含まれます。 残念ながら、マークルツリーから生成されるウィットネスは大きすぎるため、ステートレスクライアントをサポートできません。 +ブロックの検証では、ブロックに含まれるトランザクションを再実行し、その変更をイーサリアムの状態ツリーに適用することで、新しいルートハッシュを計算します。 検証されたブロックでは、その計算された状態ルートのハッシュがブロックで提供されたものと一致します。つまり、ブロックの提案者が本当にルートハッシュの計算を行ったことが確認できます。 現状のイーサリアムクライアントで状態を更新するには、状態ツリー全体にアクセスする必要があり、この巨大なデータ構造がローカルに保存されていなければなりません。 ウィットネスは、ブロック内のトランザクションを実行するために必要な状態データのフラグメントのみを含みます。 バリデータは、このフラグメントを使用して、ブロック提案者がブロックトランザクションを正しく実行し、状態が正常に更新されたかどうかを検証できます。 ただし、ウィットネスが各ノードにおいて12秒間のスロット内で安全に受信、処理されるためには、イーサリアムネットワーク上のピア間で十分な速度で転送する必要があります。 ウィットネスが大きすぎると、一部のノードにおいて、それをダウンロードしてチェーンを最新の状態を維持するのに時間がかかりすぎる可能性があります。 これでは、高速インターネット接続を持つノードのみがブロックの検証に参加できることになり、中央集権的な影響力を高めてしまいます。 バークルツリーを使用することで、状態をハードウェアドライブに保存する必要がなくなります。 つまり、ブロックを検証するために必要な_すべて_がブロック内に含まれます。 残念ながら、マークルツリーから生成されるウィットネスは大きすぎるため、ステートレスクライアントをサポートできません。 ## バークルツリーが小さなウィットネスを可能にする仕組み {#why-do-verkle-trees-enable-smaller-witnesses} -マークルツリーの構造では、ウィットネスのサイズが非常に大きくなるため、12 秒間のスロット内では、ピア間で安全にブロードキャストすることができません。 これは、ウィットネスがリーフが持つデータからルートハッシュへ接続するパスであるためです。 データを確認するには、各リーフからルートに接続するための全ての中間ハッシュだけでなく、全ての「兄弟」ノードのハッシュを持っている必要があります。 証明内にある各ノードには、ツリーの一段階上へのハッシュを作成するためにハッシュされる兄弟ノードがあります。 これは非常に大きなデータになります。 バークルツリーは、ツリーのリーフとルートの距離を短縮し、ルートハッシュを検証するために兄弟ノードを提供する必要性をなくすことで、ウィットネスのサイズを削減します。 また、ハッシュ形式のベクトルコミットメントの代わりに強力な多項式コミットメント機構を利用することで、スペース効率がさらに向上します。 多項式コミットメントにより、ウィットネスが証明するリーフの数に関係なく、サイズを固定にすることができます。 +マークルツリーの構造では、ウィットネスのサイズが非常に大きくなるため、12秒間のスロット内では、ピア間で安全にブロードキャストすることができません。 これは、ウィットネスがリーフが持つデータからルートハッシュへ接続するパスであるためです。 データを確認するには、各リーフからルートに接続するための全ての中間ハッシュだけでなく、全ての「兄弟」ノードのハッシュを持っている必要があります。 証明内にある各ノードには、ツリーの一段階上へのハッシュを作成するためにハッシュされる兄弟ノードがあります。 これは非常に大きなデータになります。 バークルツリーは、ツリーのリーフとルートの距離を短縮し、ルートハッシュを検証するために兄弟ノードを提供する必要性をなくすことで、ウィットネスのサイズを削減します。 また、ハッシュ形式のベクトルコミットメントの代わりに強力な多項式コミットメント機構を利用することで、スペース効率がさらに向上します。 多項式コミットメントにより、ウィットネスが証明するリーフの数に関係なく、サイズを固定にすることができます。 多項式コミットメントスキームでは、ウィットネスが管理しやすいサイズになり、ピアツーピアネットワーク上で簡単に転送できます。 この仕組みにより、クライアントは、各ブロックの状態変化を最小限のデータで検証することができます。 -ウィットネスのサイズは、含まれるリーフの数によって変わります。 例えば、1000 枚のリーフを扱うウィットネスは、マークルツリーで約 3.5MB(ツリーが 7 レベルと仮定しています)、 バークルツリーでは約 150KB(ツリーが 4 レベルあると仮定します)となり、**約 23 分の 1**に縮小できます。 このウィットネスのサイズ縮小により、ステートレスクライアントでも許容できる大きさになります。 多項式ウィットネスは、使用される個別の多項式コミットメントによって、0.128 ~ 1KB の範囲に収まります。 +ウィットネスのサイズは、含まれるリーフの数によって変わります。 例えば、1000枚のリーフを扱うウィットネスは、マークルツリーで約3.5MB(ツリーが7レベルと仮定しています)、 バークルツリーでは約150KB(ツリーが4レベルあると仮定します)となり、**約23分の1**に縮小できます。 このウィットネスのサイズ縮小により、ステートレスクライアントでも許容できる大きさになります。 多項式ウィットネスは、使用される個別の多項式コミットメントによって、0.128~1KBの範囲に収まります。 ## バークルツリーの構造 {#what-is-the-structure-of-a-verkle-tree} -バークルツリーは、`(key,value)`のペアで構成されたデータ構造です。キーは、31 バイトの*ステム*と 1 バイトの*サフィックス*で構成されています。 これらのキーは、*拡張*ノードと*内部*ノードに編成されます。 拡張ノードは、1 つのステムを表すノードです。256 個の子ノードがあり、それぞれ異なるサフィックスを持っています。 内部ノードも 256 個の子ノードを持っていますが、他の拡張ノードになることもあります。 バークルツリーとマークルツリー構造の主な違いは、バークルツリーの方がはるかにフラットなことです。 つまり、リーフとルートを結ぶ中間ノードが少ないため、証明を生成するために必要なデータが小さくなります。 +バークルツリーは、`(key,value)`のペアで構成されたデータ構造です。キーは、31バイトの_ステム_と1バイトの_サフィックス_で構成されています。 これらのキーは、_拡張_ノードと_内部_ノードに編成されます。 拡張ノードは、1つのステムを表すノードです。256個の子ノードがあり、それぞれ異なるサフィックスを持っています。 内部ノードも256個の子ノードを持っていますが、他の拡張ノードになることもあります。 バークルツリーとマークルツリー構造の主な違いは、バークルツリーの方がはるかにフラットなことです。 つまり、リーフとルートを結ぶ中間ノードが少ないため、証明を生成するために必要なデータが小さくなります。 ![](./verkle.png) @@ -51,15 +51,15 @@ summaryPoints: [ビバリーヒルズ・バークルテストネットの探索](https://beverlyhills.ethpandaops.io) -[Guillaume Ballet による Condrieu バークルテストネットの説明をご覧ください](https://www.youtube.com/watch?v=cPLHFBeC0Vg) (Condrieu テストネットはプルーフ・オブ・ワークでしたが、現在は[Kaustinen テストネット](https://kaustinen.ethdevops.io)に置き換えらていることにご注意ください)。 +[Guillaume BalletによるCondrieuバークルテストネットの説明をご覧ください](https://www.youtube.com/watch?v=cPLHFBeC0Vg) (Condrieuテストネットはプルーフ・オブ・ワークでしたが、現在は[Kaustinenテストネット](https://kaustinen.ethdevops.io)に置き換えらていることにご注意ください)。 ## 参考文献 {#further-reading} -- [ダンクラッド・フィーストによる PEEPanEIP でのバークルツリーの説明](https://www.youtube.com/watch?v=RGJOQHzg3UQ) -- [Guillaume Ballet による ETHGlobal でのバークルツリーの説明](https://www.youtube.com/watch?v=f7bEtX3Z57o) -- [Devcon6 での Guillaume Ballet による「バークルツリーがイーサリアムを効率的にする仕組み」](https://www.youtube.com/watch?v=Q7rStTKwuYs) -- [ETHDenver 2020 での Piper Merriam によるステートレスクライアントに関する説明](https://www.youtube.com/watch?v=0yiZJNciIJ4) +- [ダンクラッド・フィーストによるPEEPanEIPでのバークルツリーの説明](https://www.youtube.com/watch?v=RGJOQHzg3UQ) +- [Guillaume BalletによるETHGlobalでのバークルツリーの説明](https://www.youtube.com/watch?v=f7bEtX3Z57o) +- [Devcon6でのGuillaume Balletによる「バークルツリーがイーサリアムを効率的にする仕組み」](https://www.youtube.com/watch?v=Q7rStTKwuYs) +- [ETHDenver 2020でのPiper Merriamによるステートレスクライアントに関する説明](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [ゼロ知識ポッドキャストでのダンクラッド・フィーストによるバークルツリーとステートレスに関する説明](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) - [ヴィタリック・ブテリンによるバークルツリーの説明](https://vitalik.ca/general/2021/06/18/verkle.html) - [ダンクラッド・フィーストによるバークルツリーの説明](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) -- [バークルツリーの EIP ドキュメント](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) +- [バークルツリーのEIPドキュメント](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/src/intl/ja/page-upgrades-index.json b/src/intl/ja/page-upgrades-index.json index c6c0245380a..083fb958f05 100644 --- a/src/intl/ja/page-upgrades-index.json +++ b/src/intl/ja/page-upgrades-index.json @@ -10,7 +10,7 @@ "consensus-client-teku-logo-alt": "Tekuロゴ", "page-upgrades-answer-1": "ビーコンチェーンは、マージでイーサリアムメインネットをアップグレードするためのツールとして使用されました。", "page-upgrades-answer-2": "マージはこれまでにない大規模なアップグレードとなり、プルーフ・オブ・ワークからプルーフ・オブ・ステークをベースとした新しいコンセンサスレイヤーへの移行が行われました。", - "page-upgrades-answer-4": "ビーコンチェーンは、今日のプルーフ・オブ・ステークをベースとしたイーサリアムを開発するために使用されました。ビーコンチェーンは、イーサリアムメインネットとは別個に実行されたため、実環境での使用前に、デベロッパー達は分離した別環境で合意メカニズムを確認できました。", + "page-upgrades-answer-4": "ビーコンチェーンは、今日のプルーフ・オブ・ステークをベースとしたイーサリアムを開発するために使用されました。ビーコンチェーンは、実環境での使用前にデベロッパー達が分離した別環境で合意メカニズムを確認することができるように、イーサリアムメインネットとは別に実行されました。", "page-upgrade-article-author-status": "ステータス", "page-upgrade-article-author-ethmerge": "Ethmerge", "page-upgrade-article-author-alchemy": "Alchemy", @@ -18,10 +18,10 @@ "page-upgrade-article-author-delphi-digital": "Delphi Digital", "page-upgrade-article-author-eip-4844": "Vitalik Buterin、Dankrad Feist、Diederik Loerakker、George Kadianakis、Matt Garnett、Mofi Taiwo", "page-upgrade-article-author-ethereum-foundation": "イーサリアム・ファウンデーション", - "page-upgrade-article-author-vitalik-buterin": "Vitalik Buterin", + "page-upgrade-article-author-vitalik-buterin": "ヴィタリック・ブテリン", "page-upgrade-article-author-ethos-dev": "Ethos.dev", "page-upgrade-article-title-two-point-oh": "2.0: ビーコンチェーン", - "page-upgrade-article-title-beacon-chain-explainer": "ビーコンチェーン イーサリアム2.0を最初に読んでください", + "page-upgrade-article-title-beacon-chain-explainer": "ビーコンチェーン イーサリアム2.0をまずお読みください", "page-upgrade-article-title-sharding-consensus": "シャーディング・コンセンサス", "page-upgrade-article-title-sharding-is-great": "シャーディングのメリット: テクニカルな特性", "page-upgrade-article-title-rollup-roadmap": "ロールアップを中心としたロードマップ", @@ -37,7 +37,7 @@ "page-upgrade-article-title-consensus-layer-specs": "コンセンサスレイヤーの仕様", "page-upgrade-article-title-engine-api-specs": "Engine APIの仕様", "page-upgrades-beacon-chain-date": "ビーコンチェーンは2020年12月1日に稼働", - "page-upgrades-beacon-chain-desc": "ビーコンチェーンによってイーサリアムはステーキングできるようになり、将来のアップグレードの基礎を築きました。現在ビーコンチェーンは、新しいプルーフ・オブ・ステークのイーサリアムを調整しています。", + "page-upgrades-beacon-chain-desc": "ビーコンチェーンによってイーサリアムはステーキングができるようになり、将来のアップグレードの基盤を築きました。これにより、新しいプルーフ・オブ・ステークを備えたイーサリアムを調整しています。", "page-upgrades-beacon-chain-estimate": "ビーコンチェーンの稼働", "page-upgrades-beacon-chain-title": "ビーコンチェーン", "page-upgrades-bug-bounty": "バグ報奨金プログラムを見る", @@ -46,61 +46,61 @@ "page-upgrades-dive": "ビジョンに関する詳細", "page-upgrades-dive-desc": "分散化というイーサリアムのコアとなる概念を維持しながら、 イーサリアムをよりスケーラブルで安全で持続可能なものにする。", "page-upgrades-docking": "マージ", - "page-upgrades-merge-answer-1": "マージは、イーサリアムが2022年9月15日にプルーフ・オブ・ステークに移行したときのことです。ビーコンチェーンがメインネットにマージされ、イーサリアムで正式にプルーフ・オブ・ワークが廃止されました。これにより、イーサリアムのエネルギー消費量が約99.95%削減されました。", + "page-upgrades-merge-answer-1": "マージは、イーサリアムが2022年9月15日にプルーフ・オブ・ステークに移行したときに行われました。ビーコンチェーンがメインネットにマージされ、イーサリアムで正式にプルーフ・オブ・ワークが廃止されました。これにより、イーサリアムのエネルギー消費量が約99.95%削減されました。", "page-upgrades-merge-btn": "マージの詳細", - "page-upgrades-merge-desc": "メインネットイーサリアムは、プルーフ・オブ・ステークのビーコンチェーンと「マージ」し、エネルギー集約型のマイニングの終焉となりました。", + "page-upgrades-merge-desc": "メインネットイーサリアムは、プルーフ・オブ・ステークのビーコンチェーンとマージし、エネルギー集約型のマイニングは終焉を迎えました。", "page-upgrades-merge-estimate": "マージ完了", - "page-upgrades-merge-mainnet": "メインネットとは", + "page-upgrades-merge-mainnet": "メインネットとは?", "page-upgrades-eth-blog": "ethereum.orgのブログ", "page-upgrades-explore-btn": "アップグレードの探索", "page-upgrades-get-involved": "イーサリアムのアップグレードへの参加", - "page-upgrades-get-involved-2": "参加", + "page-upgrades-get-involved-2": "参加しましょう", "page-upgrades-head-to-ethresearch": "ethresear.chへ移動", - "page-upgrades-help": "イーサリアムのアップグレードへの貢献", + "page-upgrades-help": "イーサリアムのアップグレードに貢献したい場合", "page-upgrades-help-desc": "イーサリアムのアップグレードに関する意見を述べたり、テストを手伝ったり、さらには報酬を得る機会も沢山あります。", "page-upgrades-index-staking": "ステーキングはこちら", "page-upgrades-index-staking-desc": "イーサリアムのアップグレードの鍵となるのが、ステーキングの導入です。イーサリアムネットワークのセキュリティ向上のためにETHをステーキングしたい場合は、以下の手順に従ってください。", "page-upgrades-index-staking-learn": "ステーキングについて学ぶ", - "page-upgrades-index-staking-learn-desc": "ビーコンチェーンにより、ステーキングできるようになりました。ETHをお持ちの場合、ステーキングしネットワークのセキュリティ確保に貢献することで、ETHの報酬を獲得できます。", - "page-upgrades-index-staking-step-1": "1. ランチパッドのセットアップ", + "page-upgrades-index-staking-learn-desc": "ビーコンチェーンにより、ステーキングが可能になりました。ETHをお持ちの場合は、ネットワークのセキュリティ確保に貢献することで、ETHの報酬を獲得できます。", + "page-upgrades-index-staking-step-1": "1. ランチパッドを利用したセットアップ", "page-upgrades-index-staking-step-1-btn": "ステーキング・ランチパッドにアクセス", - "page-upgrades-index-staking-step-1-desc": "イーサリアムでステーキングするには、手順を段階を追って案内するランチパッドを使用する必要があります。", + "page-upgrades-index-staking-step-1-desc": "イーサリアムでステーキングするには、ランチパッドを使用し、手順を追う必要があります。", "page-upgrades-index-staking-step-2": "2. ステーキングアドレスの確認", "page-upgrades-index-staking-step-2-btn": "デポジットコントラクトアドレスの確認", - "page-upgrades-index-staking-step-2-desc": "ETHをステーキングする前に、必ずデポジット先のアドレスが正しいことを確認してください。これを行う前に、ランチパッドをセットアップしている必要があります。", + "page-upgrades-index-staking-step-2-desc": "ETHをステーキングする前に、必ずデポジット先のアドレスが正しいことを確認してください。この前に、ランチパッドをセットアップが完了していることも確認してください。", "page-upgrades-index-staking-sustainability": "持続可能性", - "page-upgrades-meta-desc": "イーサリアムのアップグレードと実現を望むビジョン。", + "page-upgrades-meta-desc": "イーサリアムのアップグレードの概要と実現したいビジョン。", "page-upgrades-meta-title": "イーサリアムのアップグレード(旧称「Eth2」)", "page-upgrades-proof-stake-link": "プルーフ・オブ・ステークの詳細", - "page-upgrades-question-1-title": "アップグレードの時期", + "page-upgrades-question-1-title": "アップグレードされる時期はいつですか?", "page-upgrades-question-1-desc": "イーサリアムは徐々にアップグレードを積み重ねており、それぞれのアップグレードが行われる日付は異なります。", - "page-upgrades-question-2-title": "ビーコンチェーンは独立したブロックチェーンか", - "page-upgrades-question-2-desc": "はい。ビーコンチェーンとは、プルーフ・オブ・ステークブロックチェーンに付けられた名前で、イーサリアムメインネットをアップグレードに向けて、メインネットで同時に並列して稼働していました。現在は、元のイーサリアムブロックチェーンがビーコンチェーンと統合されたため、ブロックチェーンは一つだけです。", - "page-upgrades-question-3-answer-2a": "マージによる分散型アプリ(Dapp)デベロッパーへの影響はほとんどなく、これまでと同様にイーサリアムを利用できています。", + "page-upgrades-question-2-title": "ビーコンチェーンは独立したブロックチェーンですか?", + "page-upgrades-question-2-desc": "はい。ビーコンチェーンとは、プルーフ・オブ・ステークのブロックチェーンに付けられた名前で、イーサリアムメインネットのアップグレードに向けて、メインネットで同時に並列して稼働していました。現在は、元のイーサリアムブロックチェーンがビーコンチェーンと統合されたため、ブロックチェーンは一つだけです。", + "page-upgrades-question-3-answer-2a": "マージによる分散型アプリ(Dapp)デベロッパーへの影響はほとんどなく、これまでと同様にイーサリアムを使用できています。", "page-upgrades-question-3-answer-2a-link": "マージと分散型アプリ(Dapp)のデベロッパー", "page-upgrades-question-3-answer-2b": "シャーディングの計画はまだ策定中ですが、レイヤー2のロールアップを念頭に置いて設計される予定です。", "page-upgrades-layer-2-rollups": "レイヤー2ロールアップの詳細", "page-upgrades-question-3-answer-3-link": "ethresear.chを訪問", "page-upgrades-question-3-desc": "アップグレードの準備を今すぐに始める必要はありません。", - "page-upgrades-question-3-title": "アップグレードの準備", + "page-upgrades-question-3-title": "アップグレードの準備をするには何をすればいいですか?", "page-upgrades-question-4-answer-1": "トランザクションを送信したり、分散型アプリ(Dapp)を使用するたびに、メインネットとも呼ばれる実行レイヤーを使用しています。", "page-upgrades-question-4-answer-3": "マージ以降、プルーフ・オブ・ステークにより、バリデータがネットワーク全体を保護しています。", "page-upgrades-question-4-answer-6": "ETHをステーキングすることで誰でもバリデータになることができます。", - "page-upgrades-question-4-answer-7": "ステーキングの詳細", - "page-upgrades-question-4-title": "実行レイヤーとは", - "page-upgrades-question-4-desc": "マージ前には、イーサリアムブロックチェーンは「Eth1」と呼ばれましたが、段階的に名称が「実行レイヤー」に変更されました。", + "page-upgrades-question-4-answer-7": "ステークの詳細", + "page-upgrades-question-4-title": "実行レイヤーとは何ですか?", + "page-upgrades-question-4-desc": "マージ前には、イーサリアムブロックチェーンは「Eth1」とも呼ばれていましたが、徐々に「実行レイヤー」へと変わっていきました。", "page-upgrades-question-5-answer-1": "ネットワークのバリデータになるためには、32 ETHをステーキングする必要があります。それほど多くの資金を保有していない場合やそれほど多くの資金をステーキングしたくない場合は、ステークキングプールに参加することができます。このプールに参加することで、より少ない金額で報酬総額の一部を得ることができます。", "page-upgrades-question-5-desc": "ステーキングにはランチパッドを使用するか、ステーキングプールに参加する必要があります。", "page-upgrades-question-5-title": "ステーキング方法", "page-upgrades-question-6-answer-3": "イーサリアム・ファウンデーションのDanny Ryanは定期的に情報を更新しています:", "page-upgrades-question-6-answer-4": "ConsenSysのBen Edgingtonは、イーサリアムのアップグレードに関する週刊ニュースレターを発行しています:", "page-upgrades-question-6-answer-5": "または、ethresear.chでイーサリアムの研究開発に関する議論に参加することもできます。", - "page-upgrades-question-6-title": "分散型アプリ(Dapp)への影響", - "page-upgrades-question-6-desc": "マージは、分散型アプリ(Dapp)デベロッパーにほとんど影響がないように設計されましたが、注意すべき小さな変更点がいくつかありました。", - "page-upgrades-question-6-answer-1": "マージ前のイーサリアムをご存じの分散型アプリ(Dapp)デベロッパーは、いくつかの変更点に注意する必要があります。ブロック構造とタイミング、いくつかのオペコードの変更、オンチェーンランダムネスのソース、およびエポックファイナライズのコンセプトが変更されています。", + "page-upgrades-question-6-title": "分散型アプリ(Dapp)では何をする必要がありますか?", + "page-upgrades-question-6-desc": "マージは、分散型アプリ(Dapp)デベロッパーにほとんど影響を及ぼさないように設計されましたが、注意すべき小さな変更点がいくつかありました。", + "page-upgrades-question-6-answer-1": "マージ前のイーサリアムをご存じの分散型アプリ(Dapp)デベロッパーは、ブロック構造とタイミング、いくつかのオペコードの変更、オンチェーンランダムネスのソース、およびエポックのファイナライズのコンセプトといったいくつかの変更点に注意する必要があります。", "page-upgrades-question-6-answer-1-link": "マージがイーサリアムのアプリケーションレイヤーに与えた影響", "page-upgrades-question-6-answer-2": "アプリケーションに影響はほとんどありませんでした。", - "page-upgrades-question-7-desc": "コミュニティの多くの異なるチームが、さまざまなイーサリアムのアップグレードに取り組んでいます。", + "page-upgrades-question-7-desc": "コミュニティ中の多くの異なるチームが、さまざまなイーサリアムのアップグレードに取り組んでいます。", "page-upgrades-question-7-lighthouse": "Lighthouse", "page-upgrades-question-7-lighthouse-lang": "(Rustの実装)", "page-upgrades-question-7-lodestar": "Lodestar", @@ -115,37 +115,37 @@ "page-upgrades-question-7-title": "イーサリアムのアップグレードを構築しているのは誰ですか?", "page-upgrades-question-7-clients": "イーサリアムクライアントについてもっと詳しく学ぶ", "page-upgrades-question-8-answer-1": "イーサリアムのアップグレードは、セキュリティを維持し、持続可能性を向上させながら、分散化した方法でイーサリアムがスケーリングするのに役立ちます。", - "page-upgrades-question-8-answer-2": "最も明らかな問題は、イーサリアムが1秒間に15~45件以上のトランザクションを処理できる能力が必要なことです。しかし、アップグレードにより、現在のイーサリアムが持つ他のいくつかの課題にも対処します。", - "page-upgrades-question-8-answer-3": "ネットワークの需要が非常に高いときには、イーサリアムの使用が高額になってしまいます。ネットワークのノードは、イーサリアムの規模とコンピュータが処理しなければならないデータ量に苦戦しています。また、イーサリアムのセキュリティと分散化の基盤となる元のアルゴリズムは、エネルギー集約型であったので、より環境に優しいものにする必要がありました。", + "page-upgrades-question-8-answer-2": "最も明らかな問題は、イーサリアムが1秒間に15~45件以上のトランザクションを処理する必要があることです。しかし、アップグレードにより、現在のイーサリアムが持つ他のいくつかの課題にも対処します。", + "page-upgrades-question-8-answer-3": "ネットワークの需要が非常に高いときには、イーサリアムの使用が高額になってしまいます。ネットワークのノードは、イーサリアムの規模とコンピュータが処理しなければならないデータ量への対応に苦戦しています。また、イーサリアムのセキュリティと分散化の基盤となる元のアルゴリズムはエネルギー集約型だったことから、より環境に優しいものにする必要がありました。", "page-upgrades-question-8-answer-4": "これらの変更の多くは、2015年からずっとイーサリアムのロードマップにあったものですが、現在の状況によりアップグレードの必要性がさらに高まっています。", "page-upgrades-question-8-answer-6": "イーサリアムのビジョンの探索", - "page-upgrades-question-8-desc": "現在のイーサリアムは、エンドユーザーとネットワーク参加者のエクスペリエンスを改善する必要があります。", - "page-upgrades-question-8-title": "アップグレードが必要な理由", + "page-upgrades-question-8-desc": "現在のイーサリアムでは、エンドユーザーとネットワーク参加者のエクスペリエンスを改善する必要があります。", + "page-upgrades-question-8-title": "アップグレードが必要な理由はなんですか?", "page-upgrades-question-9-answer-1": "もっともアクティブに活躍するには、ETHをステーキングすることです。", "page-upgrades-question-9-answer-2": "また、クライアントの多様性を向上させるために、第2のクライアントを実行することもできます。", - "page-upgrades-question-9-answer-3": "テクニカルに長けた方の場合は、新しいクライアントのバグを探すのをサポートすることができます。", + "page-upgrades-question-9-answer-3": "より技術力の高い方は、新規クライアントのバグを見つけるサポートをすることができます。", "page-upgrades-question-9-answer-4": "ethresear.chでイーサリアムの研究者とのテクニカルな議論に参加することもできます。", "page-upgrades-question-9-desc": "貢献するのにテクニカルなスキルが必要なわけではありません。コミュニティでは、あらゆる種類のスキルセットからの貢献を募っています。", "page-upgrades-question-9-stake-eth": "ETHのステーキング", - "page-upgrades-question-9-title": "イーサリアムのアップグレードへの貢献方法", - "page-upgrades-question-9-more": "イーサリアムに参加する一般的な方法を見つける", - "page-upgrades-question-10-title": "「Eth2フェーズ」とは", - "page-upgrades-question-10-desc": "いくつかのことが変わりました。", - "page-upgrades-question-10-answer-0": "単一のアップグレードや新しいネットワークを表すものではないため、「Eth2」という名称そのものが段階的に廃止されています。実際のところアップグレードは、イーサリアムをよりスケーラブルで、安全で、持続可能なものにするための複数のアップグレードからなります。皆さまがすでにご存知で大好きなネットワークは、ただ単に「イーサリアム」と呼ばれます。", - "page-upgrades-question-10-answer-1": "テクニカルなロードマップに関しては、これがソフトウェアであり、状況が変化する可能性があるため、あまり話をしたくはありません。また、結果を読んだほうが何が起こっているのかを理解しやすいと考えています。", + "page-upgrades-question-9-title": "イーサリアムのアップグレードに貢献するどうすればいいですか?", + "page-upgrades-question-9-more": "イーサリアムに参加するためのさらに一般的な方法を見つける", + "page-upgrades-question-10-title": "「Eth2フェーズ」とは?", + "page-upgrades-question-10-desc": "ここでいくつか変化がありました。", + "page-upgrades-question-10-answer-0": "「Eth2」は、単一のアップグレードや新しいネットワークを表すものではないため、その名称そのものが徐々に廃止されています。正確には、イーサリアムをよりスケーラブルで、安全で、持続可能なものにするためにそれぞれ役割を持つ複数のアップグレードのことを指します。皆さまがご存知で愛用いただいているネットワークは、シンプルに「イーサリアム」と呼ばれることになります。", + "page-upgrades-question-10-answer-1": "技術ロードマップに関しては、これがソフトウェアであり、常に状況が変化する可能性があることから、あまり説明をしたくはありません。それに、結果を読んだほうが何が起こっているのかを理解しやすいと考えています。", "page-upgrades-question-10-answer-1-link": "アップグレードを見る", - "page-upgrades-question-10-answer-2": "これまでに議論をフォローしてきてい場合に備えて、アップグレードがテクニカルなロードマップにどのように適合し、変化してきているかをここで紹介します。", - "page-upgrades-question-10-answer-3": "フェーズ0は、ビーコンチェーンを稼働するための作業でした。", - "page-upgrades-question-10-answer-5": "フェーズ1では、本来シャードチェーンの実装に焦点を当てていましたが、優先順位が2022年9月15日にリリースされた「マージ」に変更されました。", - "page-upgrades-question-10-answer-6": "フェーズ1.5では、もともと、シャード実装の後、ビーコンチェーンの最後のシャードとしてメインネットが追加されるときに予定されていました。しかし、ロールアップ技術の進化に伴い、イーサリアムコミュニティにより、プルーフ・オブ・ワークからの移行が優先させました。", + "page-upgrades-question-10-answer-2": "とはいえ、これまでの議論をフォローされてきた方には、アップグレードが技術ロードマップにどのように適合し、変化してきているかをここで紹介しましょう。", + "page-upgrades-question-10-answer-3": "フェーズ0は、ビーコンチェーンを稼働させるための作業でした。", + "page-upgrades-question-10-answer-5": "フェーズ1では、本来シャードチェーンの実装に焦点を当てていましたが、その優先順位は2022年9月15日にリリースされた「マージ」に移りました。", + "page-upgrades-question-10-answer-6": "フェーズ1.5は、もともとシャード実装の後にビーコンチェーンの最後のシャードとしてメインネットが追加されるときに実行が予定されていました。しかし、ロールアップ技術の進化に伴い、イーサリアムコミュニティは、プルーフ・オブ・ワークからの移行を優先させることになりました。", "page-upgrades-question-10-answer-7": "フェーズ2の計画については、熱心な研究と議論が繰り返されてきました。マージを経て、レイヤー2ソリューションの進歩により、ロールアップの効率を最大化させるため、目標がより簡素化された形式のデータシャーディングを提供することに変わりました。現在のレイヤー2はトランザクションの実行をスケーリングでき、シャーディングはこのデータのプルーフを安価でスケーラブルな方法でレイヤー1に保存することを可能にします。", "page-upgrades-question-10-answer-8": "ロールアップを中心としたロードマップの詳細", - "page-upgrades-question-11-title": "Eth2の購入について", - "page-upgrades-question-11-desc": "Eth2というトークンはなく、マージ後もお持ちのETHに変更はありません。", - "page-upgrades-question-11-answer-1": "Eth2の名称が変更された理由の一つには、マージ後、または他のアップグレードにより、ETH保有者が「ETH」から「ETH2.0」へ移行する必要があるという誤解が広がったためです。これは真実ではなく、お持ちのETHを変更、移行する必要は一切ありません。", - "page-upgrades-question-11-answer-2": "この誤解が詐欺の手口として使われていますので、ご注意ください。", + "page-upgrades-question-11-title": "Eth2を購入することはできますか?", + "page-upgrades-question-11-desc": "いいえ。Eth2というトークンはなく、マージ後もお持ちのETHに変更はありません。", + "page-upgrades-question-11-answer-1": "Eth2の名称が変更された理由の一つは、マージ後や他のアップグレードにより、ETH保有者が「ETH」から「ETH2.0」へ移行する必要があるという誤解が広がったためです。こういう事実はなく、お持ちのETHを変更、移行する必要は一切ありません。", + "page-upgrades-question-11-answer-2": "この誤解が頻繁に詐欺の手口として使われていますので、ご注意ください。", "page-upgrades-question-title": "よくある質問", - "page-upgrades-question3-answer-1": "ETHの保有者は何も対応する必要はなく、ETHの交換やアップグレードの必要もありません。何かをしないといけない言われた場合は、ほぼ確実に詐欺のためご注意ください。", + "page-upgrades-question3-answer-1": "ETH保有者は何の対応も行う必要はありません。ETHの取引やアップグレードの必要もありません。対応を求められた場合は、ほぼ詐欺ですので、ご注意ください。", "page-upgrades-scalable": "よりスケーラブルに", "page-upgrades-scalable-desc": "アプリケーションをより速く、より安価で利用できるようにするには、イーサリアムは1秒間に何千件ものトランザクション量に対応できる必要があります。", "page-upgrades-secure": "よりセキュアに", @@ -178,18 +178,18 @@ "page-upgrades-what-happened-to-eth2-1": "「Eth2」という用語は、マージ前に一般的に使用されていましたが、より正確な用語が好ましいため段階的に廃止されています。", "page-upgrades-what-happened-to-eth2-1-more": "マージの詳細", "page-upgrades-what-happened-to-eth2-2": "「Eth1」と「Eth2」が統合された今では、2つの異なるイーサリアムブロックチェーンがあるのではなく、イーサリアムだけが存在します。", - "page-upgrades-what-happened-to-eth2-3": "混乱をなくすため、これらの名称が変更になりました:", - "page-upgrades-what-happened-to-eth2-3-1": "「Eth1」は「実行レイヤー」と名称が変わり、これはトランザクションと実行を処理するものです。", - "page-upgrades-what-happened-to-eth2-3-2": "「Eth2」は「コンセンサスレイヤー」になり、プルーフ・オブ・ステークのコンセンサスを処理します。", + "page-upgrades-what-happened-to-eth2-3": "混乱をなくすため、次の名称が変更になりました。", + "page-upgrades-what-happened-to-eth2-3-1": "「Eth1」は「実行レイヤー」と名称が変わり、これはトランザクションと実行を処理するレイヤーです。", + "page-upgrades-what-happened-to-eth2-3-2": "「Eth2」は「コンセンサスレイヤー」となり、プルーフ・オブ・ステークのコンセンサスを処理するレイヤーです。", "page-upgrades-what-happened-to-eth2-4": "これらの用語の変更は、単に名称を変更するだけのものであり、イーサリアムの目標やロードマップには影響を及ぼしません。", "page-upgrades-what-happened-to-eth2-5": "「Eth2」名称変更の詳細", "page-upgrades-why-cant-we-just-use-eth2-title": "名称の変更理由", "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "メンタルモデル", - "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Eth2ブランディングの大きな問題の1つには、イーサリアムの新規ユーザーが誤った印象を抱きかねないことです。新規ユーザーは、直感的にEth1が最初で、Eth2が後発のものと思い込んでしまう可能性があります。 また、Eth2の出現によりEth1がなくなると誤解されるおそれもあります。 これらの両方ともに正しくなく、 Eth2という名称を廃止することで、今後こういった紛らわしい誤解をなくすことを意図しています。", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Eth2ブランディングの大きな問題の1つは、イーサリアムの新規ユーザーが誤った印象を抱くかもしれないことです。新規ユーザーは、直感的にEth1が最初で、Eth2が後発のものと思い込んでしまう可能性があります。 また、Eth2の出現によりEth1がなくなると誤解されるおそれもあります。 これらはどちらも間違っており、 Eth2という名称を廃止することで、今後こういった紛らわしい誤解をなくしていきます。", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "包括性", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "イーサリアムのロードマップが進化するにつれて、「イーサリアム2.0」という表現は不正確なものになりました。 名称を慎重かつ正確に選ぶことで、イーサリアムのコンテンツを出来るだけ幅広い人に理解されることを目的としています。", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "詐欺防止", - "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "残念なことに、「ETHをETH2トークンと交換する必要がある」、または「Eth2アップグレード前にETHを移行する必要がある」といった詐欺が横行しました。名称を改めることにより、このような詐欺を一掃し、エコシステムをより安全にすることを目指しています。", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "残念なことに、「ETHをETH2トークンと取引する必要がある」、または「Eth2アップグレード前にETHを移行する必要がある」といった詐欺が横行しました。名称を改めることにより、このような詐欺を一掃し、エコシステムをより安全にすることを目指しています。", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "ステーキングに関して誤解を防ぐために", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "一部のステーキングオペレーターは、ビーコンチェーンにステーキングされたETHを「ETH2」というティッカーで表現していました。 しかし、実際にETH2というトークンを受け取るわけではなく、これらのサービスを利用するユーザーに混乱を引き起こすおそれがあります。 「ETH2」というトークンは存在せず、単に特定のプロバイダーのシェアを表します。", "page-upgrades-what-to-do": "アップグレードによる対応の必要性", From b9ac7cbdb72e5e4f42b519f588d94c08ac2d7951 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 18 Jan 2024 16:41:51 -0700 Subject: [PATCH 041/478] Korean import (Homepage, Essential pages, Use Ethereum) --- public/content/translations/ko/dao/index.md | 16 +++--- src/intl/ko/common.json | 25 ++++++-- src/intl/ko/page-gas.json | 64 +++++++++++++++++++++ src/intl/ko/page-get-eth.json | 35 ++++++----- src/intl/ko/page-languages.json | 9 ++- src/intl/ko/page-layer-2.json | 1 + src/intl/ko/page-wallets-find-wallet.json | 3 +- 7 files changed, 126 insertions(+), 27 deletions(-) create mode 100644 src/intl/ko/page-gas.json diff --git a/public/content/translations/ko/dao/index.md b/public/content/translations/ko/dao/index.md index 1a0872058a2..ce6e56fd920 100644 --- a/public/content/translations/ko/dao/index.md +++ b/public/content/translations/ko/dao/index.md @@ -28,13 +28,13 @@ DAO는 그룹의 승인 없이는 누구도 접근할 수 없는 내장된 자 ### 비교 {#dao-comparison} -| 탈중앙화 자율 조직 | 기존의 조직 | -| -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -| 일반적으로 수평적이고, 완전히 민주화되어 있습니다. | 일반적으로 계층적입니다. | -| 변경 사항을 구현하려면 회원의 투표가 필요합니다. | 구조에 따라 단독 주체가 변경을 요구하거나 투표가 제안될 수 있습니다. | -| 투표가 집계되고, 결과는 신뢰할 수 있는 중개자 없이 자동으로 구현됩니다. | 투표가 시행되는 경우, 투표는 내부적으로 집계되고 투표 결과는 수동으로 처리해야 합니다. | -| 제공되는 서비스는 탈중앙화된 방식으로 자동 처리됩니다(예: 자선 기금 분배). | 사람이 직접 처리하거나 중앙에서 제어되는 자동화가 필요하며 조작하기 쉽습니다. | -| 모든 활동은 투명하고 완전히 공개됩니다. | 활동은 일반적으로 비공개로 이루어지며 공개에 제한적입니다. | +| 탈중앙화 자율 조직 | 기존의 조직 | +| ------------------------------------------- | ------------------------------------------------- | +| 일반적으로 수평적이고, 완전히 민주화되어 있습니다. | 일반적으로 계층적입니다. | +| 변경 사항을 구현하려면 회원의 투표가 필요합니다. | 구조에 따라 단독 주체가 변경을 요구하거나 투표가 제안될 수 있습니다. | +| 투표가 집계되고, 결과는 신뢰할 수 있는 중개자 없이 자동으로 구현됩니다. | 투표가 시행되는 경우, 투표는 내부적으로 집계되고 투표 결과는 수동으로 처리해야 합니다. | +| 제공되는 서비스는 탈중앙화된 방식으로 자동 처리됩니다(예: 자선 기금 분배). | 사람이 직접 처리하거나 중앙에서 제어되는 자동화가 필요하며 조작하기 쉽습니다. | +| 모든 활동은 투명하고 완전히 공개됩니다. | 활동은 일반적으로 비공개로 이루어지며 공개에 제한적입니다. | ### DAO 예시 {#dao-examples} @@ -91,7 +91,7 @@ DAO에는 수천 명의 의결권을 가진 회원이 있을 수 있지만, 자 1977년 와이오밍 주에서 기업가를 보호하고 책임을 제한하는 유한책임회사를 고안했습니다. 더 최근에는 DAO의 법적 상태를 확립하는 DAO 법을 제정하기도 했습니다. 현재 와이오밍, 버몬트 및 버진 아일랜드에는 어떤 형태로든 DAO 법률이 존재합니다. -### 유명한 예시 {#law-example} +#### 유명한 예시 {#law-example} [CityDAO](https://citydao.io) - CityDAO는 와이오밍의 DAO 법을 사용하여 옐로스톤 국립공원 근처의 40에이커의 땅을 구입했습니다. diff --git a/src/intl/ko/common.json b/src/intl/ko/common.json index 0fa72c87cc7..d7de7046e1c 100644 --- a/src/intl/ko/common.json +++ b/src/intl/ko/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "계정 추상화", "about-ethereum-org": "ethereum.org 소개", "about-us": "회사 소개", + "adding-desci-projects": "DeSci 프로젝트 추가", + "adding-developer-tools": "개발자 도구 추가", + "adding-exchanges": "거래소 추가", + "adding-glossary-terms": "용어집 용어 추가", + "adding-layer-2s": "Layer 2s (오프체인) 추가", + "adding-products": "제품 추가하기", + "adding-staking-products": "스테이킹 상품 추가", + "adding-wallets": "지갑 추가", + "account-abstraction": "계정 추상화", + "acknowledgements": "감사의 글", "aria-toggle-search-button": "검색 버튼 보이기/숨기기", "aria-toggle-menu-button": "메뉴 버튼 보이기/숨기기", "beacon-chain": "비콘 체인", @@ -12,6 +21,8 @@ "community-hub": "커뮤니티 허브", "community-menu": "커뮤니티 메뉴", "contact": "문의처", + "content-buckets": "콘텐츠 버킷", + "content-resources": "콘텐츠 참고 자료", "content-standardization": "콘텐츠 표준화", "contributing": "기여", "contributors": "기여자", @@ -28,6 +39,8 @@ "decentralized-social-networks": "탈중앙화 소셜 네트워크", "decentralized-science": "탈중앙화 과학(DeSci)", "defi-page": "분산형 금융(DeFi)", + "design": "디자인", + "design-principles": "디자인 원칙", "devcon": "Devcon", "developers": "개발자", "developers-home": "개발자 홈", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "이 튜토리얼이 도움이 되셨나요?", "feedback-widget-thank-you-title": "피드백을 주셔서 감사합니다!", "feedback-widget-thank-you-subtitle": "몇 가지 질문에 답하여 이 페이지를 개선해 주세요.", - "feedback-widget-thank-you-subtitle-ext": "도움이 필요하다면 Discord에서 커뮤니티를 활용해 보십시오.", + "feedback-widget-thank-you-subtitle-ext": "도움이 필요하다면 Discord에서 커뮤니티를 활용해 보십시오.", "feedback-widget-thank-you-timing": "2–3분", "feedback-widget-thank-you-cta": "짧은 공개 설문조사", "find-wallet": "지갑 찾기", @@ -94,11 +107,11 @@ "grants": "지원금", "grant-programs": "생태계 지원금 프로그램", "guides": "가이드", - "guides-hub": "가이드 허브", + "guides-hub": "How-to guides", "history-of-ethereum": "이더리움 연혁", "home": "홈", "how-ethereum-works": "이더리움의 작동 원리", - "how-to-register-an-ethereum-account": "이더리움 계정을 \"등록\"하는 방법", + "how-to-create-an-ethereum-account": "이더리움 계정 \"생성\"하는 법", "how-to-revoke-token-access": "암호화폐 자금에 대한 스마트 계약 액세스를 취소하는 방법", "how-to-swap-tokens": "토큰 교환 방법", "how-to-use-a-bridge": "레이어 2로 토큰을 브리지하는 방법", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "데이터를 로드할 수 없습니다. 나중에 다시 시도하세요.", "logo": "로고", "mainnet-ethereum": "메인넷(Mainnet) 이더리움", + "merge": "병합", "more": "더 보기", "nav-developers": "개발자", "nav-developers-docs": "개발자 문서", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "바로 검색!", "search-eth-address": "이것은 이더리움 주소로 보입니다. 당사는 특정 주소에 대한 데이터를 제공하지 않습니다. 블록 탐색기를 통해 아래와 같이 검색해 보세요.", "search-no-results": "검색과 일치하는 결과가 없습니다.", + "security": "보안", "single-slot-finality": "단일 슬롯 최종 승인", "statelessness": "무상태성", "see-contributors": "기여자 확인하기", @@ -181,6 +196,7 @@ "start-here": "여기서 시작하세요", "style-guide": "스타일 가이드", "solo": "솔로 스테이킹", + "support": "지원", "terms-of-use": "이용 약관", "translation-banner-body-new": "이 페이지는 아직 내용이 번역되지 않아 영어로 쓰여 있습니다. 이 콘텐츠의 번역을 도와 주세요.", "translation-banner-body-update": "이 페이지의 새로운 버전이 있지만 현재는 영어로만 제공됩니다. 최신 버전의 번역을 도와 주세요.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "버그 없음!", "translation-banner-no-bugs-content": "이 페이지는 번역되고 있지 않습니다. 이 페이지는 현재 영어로만 제공되고 있습니다.", "translation-banner-no-bugs-dont-show-again": "다시 표시하지 않기", + "translation-program": "번역 프로그램", "try-using-search": "원하는 항목을 찾기 위해 검색을 해보세요.", "tutorials": "튜토리얼", "up": "위로", diff --git a/src/intl/ko/page-gas.json b/src/intl/ko/page-gas.json new file mode 100644 index 00000000000..bed3fa03513 --- /dev/null +++ b/src/intl/ko/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Gas fees on Ethereum: how do they work?", + "page-gas-meta-description": "Learn about gas on Ethereum: how they work and how to pay less in gas fees", + "page-gas-hero-title": "Gas fees", + "page-gas-hero-header": "Network fees", + "page-gas-hero-button-1-content": "가스란 무엇인가요?", + "page-gas-hero-subtitle-1": "Network fees on Ethereum are called gas.", + "page-gas-hero-subtitle-2": "Gas is the fuel that powers Ethereum.", + "page-gas-summary-title": "요약", + "page-gas-summary-item-1": "Every transaction on Ethereum requires a small form of payment to process", + "page-gas-summary-item-2": "These fees are known as ‘gas’ fee", + "page-gas-summary-item-3": "Gas fees change based on network congestion", + "page-gas-what-are-gas-fees-header": "What are gas fees?", + "page-gas-what-are-gas-fees-text-1": "Think of Ethereum as a large computer network where people can do tasks like sending messages or running programs. Just like in the real world, these tasks require energy to get done.", + "page-gas-what-are-gas-fees-text-2": "In Ethereum, each computational action has a set \"gas\" price. Your gas fees are the total cost of the actions in your transaction. When you send a transaction or run a smart contract, you pay in gas fees to process it.", + "page-gas-how-do-i-pay-less-gas-header": "How do I pay less gas?", + "page-gas-how-do-i-pay-less-gas-text": "While higher fees on Ethereum are sometimes inevitable, there are strategies you can use to reduce the cost:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Time your transactions", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Just like travelling off-peak is less crowded and more affordable, Ethereum is generally cheaper to use when North America is asleep.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Wait for gas to go down", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Gas prices go up and down every twelve seconds based on how congested Ethereum is. When gas prices are high, waiting just a few minutes before making a transaction could see a significant drop in what you pay.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "레이어 2 사용", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Layer-2 chains are built atop Ethereum, offering lower fees and handling more transactions. They're a good choice to save on fees for transactions that don't need to happen on the main Ethereum network.", + "page-gas-try-layer-2": "Try layer 2", + "page-gas-what-causes-high-gas-fees-header": "What causes high gas fees?", + "page-gas-what-causes-high-gas-fees-text-1": "Whenever the amount of computation (gas) on Ethereum exceeds a certain threshold, gas fees begin to rise. The more the gas exceeds this threshold, the quicker gas fees increase.", + "page-gas-what-causes-high-gas-fees-text-2": "Higher fees could be caused by things like popular dapps or NFTs, periodically increased trading on DEXs, or an overwhelming number of user activity at peak times.", + "page-gas-what-causes-high-gas-fees-text-3": "Developers on Ethereum should take care to optimise their smart contracts usage before deploying. If lots of people are using a poorly written smart contract, it will consume more gas and could inadvertently cause network congestion.", + "page-gas-want-to-dive-deeper": "Want to dive deeper?", + "page-gas-check-out-the-developer-docs": "Check out the developer docs.", + "page-gas-attack-of-the-cryptokitties-header": "Attack of the Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "In November 2017, the popular CryptoKitties project was launched. Its rapid spike in popularity caused significant network congestion and extremely high gas fees. The challenges posed by CryptoKitties accelerated the urgency of finding solutions for scaling Ethereum.", + "page-gas-why-do-we-need-gas-header": "Why do we need gas?", + "page-gas-why-do-we-need-gas-text": "Gas is a critical element in keeping Ethereum secure and processing transactions. Gas helps in many ways:", + "page-gas-benefits-1-description": "Gas keeps Ethereum sybil-resistant by preventing malicious actors from overwhelming the network with fraudulent activities.", + "page-gas-benefits-2-description": "Because computation costs gas, spamming Ethereum with expensive transactions, either accidentally and maliciously, is financially disencentivised.", + "page-gas-benefits-3-description": "A hard-limit on the amount of computation that can be done at any one time prevents Ethereum from being overwhelmed, helping to ensure the network is always accessible.", + "page-gas-how-is-gas-calculated-header": "How is gas calculated?", + "page-gas-advanced": "고급", + "page-gas-how-is-gas-calculated-text-1": "The total gas fee you pay is made up of a few parts:", + "page-gas-how-is-gas-calculated-item-1": "Base fee: a fee set by the network that has to be paid for a transaction", + "page-gas-how-is-gas-calculated-item-2": "Priority fee: an optional tip to incentivise node operators to include your transaction", + "page-gas-how-is-gas-calculated-item-3": "Units of gas used*: remember we said gas represented computation? More complex actions, like interacting with a smart contract, use more gas than simple ones, such as sending a transaction.", + "page-gas-how-is-gas-calculated-list-item-1": "* See Figure 1 to see how much gas different types of transactions use", + "page-gas-how-is-gas-calculated-text-2": "The formula for calculating a gas fee is units of gas used * (base fee + priority fee). Most wallets will calculate gas usage and display it in a more straight-forward way.", + "page-gas-table-figure": "Figure 1: Gas used by transaction type", + "page-gas-table-header-1": "Transaction type", + "page-gas-table-header-2": "Units of gas used", + "page-gas-table-item-1-transaction-type": "Sending ETH", + "page-gas-table-item-2-transaction-type": "Sending ERC-20 tokens", + "page-gas-table-item-3-transaction-type": "Transferring and NFT", + "page-gas-table-item-4-transaction-type": "Swapping on Uniswap", + "page-gas-faq-header": "Frequency asked questions", + "page-gas-faq-question-1-q": "Who gets paid the gas fee in my transaction?", + "page-gas-faq-question-1-a-1": "The majority is gas fee—the base fee— is destroyed by the protocol (burned). The priority fee, if included in your transaction, will be given to the validator who proposed your transaction.", + "page-gas-faq-question-1-a-2": "You can read a detailed description of the process in the gas developer docs.", + "page-gas-faq-question-2-q": "Do I need to pay gas in ETH?", + "page-gas-faq-question-2-a-1": "Yes. All gas fees on Ethereum must be paid in the native ETH currency.", + "page-gas-faq-question-2-a-2": "ETH에 대해 자세히 알아보기", + "page-gas-faq-question-3-q": "What is gwei?", + "page-gas-faq-question-3-a-1": "In most wallets or gas trackers, you will see gas prices denominated as ‘gwei’.", + "page-gas-faq-question-3-a-2": "Gwei is just a smaller unit of ETH, just as pennies are to dollars, with the difference being that 1 ETH equals 1 billion gwei. Gwei is useful when talking about very small amounts of ETH.", + "page-gas-use-layer-2": "레이어 2 사용" +} diff --git a/src/intl/ko/page-get-eth.json b/src/intl/ko/page-get-eth.json index 6d73e3de1a8..c678ffc0c5e 100644 --- a/src/intl/ko/page-get-eth.json +++ b/src/intl/ko/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "거래소는 기존 통화를 사용하여 암호화폐를 구매할 수 있는 비즈니스입니다. 거래소는 당신이 구매한 ETH를 지갑으로 보낼 때까지 모든 ETH에 대한 보호권을 가집니다.", "page-get-eth-checkout-dapps-btn": "디앱스 확인하기", "page-get-eth-community-safety": "보안에 대한 커뮤니티 게시물", - "page-get-eth-description": "이더리움과 ETH는 중앙 정부나 기업의 통제를 받지 않으며 분권화되어 있습니다. 이것은 ETH가 모든 개인에게 열려 있음을 의미합니다.", + "page-get-eth-description": "이더리움은 어떠한 단일 조직의 통제도 받지 않습니다. 탈중앙화되어 있기 때문입니다.", "page-get-eth-dex": "탈중앙화 거래소(DEX)", - "page-get-eth-dex-desc": "더 많이 제어하시려면 ETH 피어-투-피어를 구입하십시오. DEX를 사용하면 중앙 집권화된 회사에 귀하의 재산을 제어할 수 있는 권한을 주지 않고 거래할 수 있습니다.", + "page-get-eth-dex-desc": "통제권을 더 확보하려면 스마트 계약을 사용하여 ETH를 매수하세요. DEX를 이용하면 보유한 자금의 통제권을 중앙화된 기업에 넘기지 않고도 디지털 자산을 거래할 수 있습니다.", + "page-get-eth-peers": "다른 사람한테서 ETH 받기", + "page-get-eth-peers-desc": "이더리움 계정을 개설하셨나요? 이제 주소를 공유하기만 하면 ETH(및 기타 토큰)를 P2P로 주고 받을 수 있습니다.", + "page-get-eth-staking": "보상 스테이크 중", + "page-get-eth-staking-desc": "이미 ETH를 보유하고 있는 경우 검증자 노드를 실행하여 ETH를 추가로 획득할 수 있습니다. 이 검증 작업을 수행하여 ETH로 보상을 받습니다.", + "page-get-eth-earn": "ETH 획득하기", + "page-get-eth-earn-desc": "암호화폐로 급여를 지불하는 DAO 또는 회사에서 일하거나 바운티(보상)을 받거나 소프트웨어 버그 등을 찾아 ETH를 획득할 수 있습니다.", + "page-get-eth-daos-link-desc": "DAO 알아보기", + "page-get-eth-cex-link-desc": "거래소 목록 보기", + "page-get-eth-staking-link-desc": "스테이킹 자세히 알아보기", "page-get-eth-dexs": "탈중앙화 거래소(DEX)", "page-get-eth-dexs-desc": "탈중앙화 거래소는 ETH 및 다른 토큰을 위한 오픈 마켓입니다. 해당 거래소는 구매자와 판매자를 직접 연결합니다.", "page-get-eth-dexs-desc-2": "거래소는 거래에서 재산을 보호할 때 신뢰받는 타사를 이용하는 대신, 코드를 사용합니다. 판매자의 ETH는 납부가 확인되었을 경우에만 이체됩니다. 이러한 유형의 코드를 스마트 계약이라고 합니다.", - "page-get-eth-dexs-desc-3": "이는 중앙화 거래소에 비해 지리적 제한을 덜 받음을 의미합니다. 누군가가 당신이 원하는 것을 판매하고 귀하가 제공하는 지불 방식을 받아들인다면, 완료된 것입니다. DEX에서는 다른 토큰, PayPal 또는 현금 직거래를 통해 ETH를 구매할 수 있습니다.", + "page-get-eth-dexs-desc-3": "이는 중앙화 거래소에 비해 지리적 제약이 적다는 뜻입니다. 누군가가 내가 원하는 것을 팔고 있고 내가 사용할 수 있는 지불 수단을 받아들인다면 거래가 가능합니다.", "page-get-eth-do-not-copy": "예제: 복사하지 마시오", "page-get-eth-exchanges-disclaimer": "이 정보는 저희가 직접 수집한 것입니다. 잘못된 부분이 있으면 이메일을 보내주세요.", - "page-get-eth-exchanges-empty-state-text": "ETH를 구입하기 위해 사용할 수 있는 지갑과 거래소의 목록을 확인하려면 거주하고 계신 국가를 입력하세요.", + "page-get-eth-exchanges-empty-state-text": "이용할 수 있는 거래소 목록을 보려면 거주 국가를 입력하세요.", "page-get-eth-exchanges-except": "제외", "page-get-eth-exchanges-header": "어느 국가에 살고 있습니까?", "page-get-eth-exchanges-header-exchanges": "거래소", "page-get-eth-exchanges-header-wallets": "지갑", - "page-get-eth-exchanges-intro": "거래소와 지갑에는 암호화폐를 판매할 수 있는 곳이 제한되어 있습니다.", + "page-get-eth-exchanges-intro": "거래소는 암호화폐를 판매할 수 있는 지리적 규제를 받습니다. 이 목록은 국가별 영업 중인 거래소 서비스를 정리한 것입니다. 단, 목록에 포함되었다고 해서 서비스 제공이 보장되지는 않으므로 정확한 정보는 직접 확인하시길 바랍니다!", "page-get-eth-exchanges-no-exchanges": "죄송합니다. 이 국가에는 ETH를 구매할 수 있는 거래소가 없습니다. 거래 가능한 거래소를 알고 있으면 이메일을 보내주십시오.", - "page-get-eth-exchanges-no-exchanges-or-wallets": "죄송합니다. 이 국가에는 ETH를 구매할 수 있는 거래소나 지갑이 없습니다. 거래 가능한 거래소나 지갑을 알고 있으면 이메일을 보내주십시오.", + "page-get-eth-exchanges-no-exchanges-or-wallets": "죄송합니다. 이 국가에는 ETH를 구매할 수 있는 거래소가 없습니다. 거래 가능한 거래소를 알고 있으면 이메일을 보내주십시오.", "page-get-eth-exchanges-no-wallets": "죄송합니다. 이 국가에는 ETH를 구매할 수 있는 지갑이 없습니다. 거래 가능한 지갑을 알고 계시면 이메일을 보내주십시오.", "page-get-eth-exchanges-search": "사는 곳을 입력하세요...", "page-get-eth-exchanges-success-exchange": "법적인 확인 절차로 인해 거래소 등록에 며칠이 걸릴 수 있습니다.", @@ -36,28 +45,28 @@ "page-get-eth-hero-image-alt": "ETH 구매 히어로 이미지", "page-get-eth-keep-it-safe": "당신의 ETH를 안전하게 지키기", "page-get-eth-meta-description": "거주지에 따라 ETH를 구매하고 관리하는 방법", - "page-get-eth-meta-title": "ETH 구매 방법", + "page-get-eth-meta-title": "ETH 획득 방법", "page-get-eth-need-wallet": "DEX를 사용하시려면 지갑이 필요합니다.", "page-get-eth-new-to-eth": "ETH는 처음이신가요? 시작하려면 개요를 읽어보세요.", "page-get-eth-other-cryptos": "다른 암호화폐로 구매하기", - "page-get-eth-protect-eth-desc": "ETH를 많이 구매하시려면 거래소가 아니라 소유하신 지갑에 보관하는 게 좋습니다. 거래소는 해커들의 목표가 될 수 있기 때문입니다. 해커가 접근하게 되면 재산을 잃을 수도 있습니다. 대신, 오직 귀하만이 자신의 지갑을 통제할 수 있습니다.", - "page-get-eth-protect-eth-in-wallet": "지갑 안의 ETH 보호하기", + "page-get-eth-protect-eth-desc": "이더리움의 주요 기능 중 하나는 사용자가 본인의 계정을 직접 관리하여 원하는 대로 자신의 자산을 통제할 수 있다는 점입니다. 즉, 자산을 제3자에게 위탁하지 않아도 되며 관리인의 부정행위, 파산 또는 해킹 위험으로부터 보호받습니다. 단, 사용자 본인이 자기 책임하에 보안도 유지해야 합니다.", + "page-get-eth-protect-eth-in-wallet": "본인 지갑에 ETH 보관하기", "page-get-eth-search-by-country": "국가별 검색", - "page-get-eth-security": "하지만 이는 자산의 안전을 진지하게 보호해야 한다는 뜻이기도 합니다. ETH의 경우, 은행이 당신의 돈을 지켜주는 게 아니라 당신 자신이 지켜야 하니까요.", + "page-get-eth-security": "이는 자기 자산은 본인이 직접 빈틈없이 지켜야 한다는 뜻입니다. ETH를 이용하면 은행이나 다른 기업에 자산을 맡기는 것이 아니라 사용자 본인이 스스로에 대한 책임을 집니다.", "page-get-eth-smart-contract-link": "스마트 계약에 대한 자세한 정보", "page-get-eth-swapping": "당신의 토큰을 다른 사람의 ETH와 교환하세요. 역으로도 가능합니다.", "page-get-eth-try-dex": "탈중앙화 거래소 사용해 보기", "page-get-eth-use-your-eth": "귀하의 ETH 사용", "page-get-eth-use-your-eth-dapps": "이제 ETH를 소유하셨으니 이더리움 애플리케이션(디앱스)을 확인해보세요. 금융, 소셜 미디어, 게임 등 다양한 카테고리를 위한 디앱스가 있습니다.", "page-get-eth-wallet-instructions": "지갑 설명서 따르기", - "page-get-eth-wallet-instructions-lost": "지갑에 대한 접근권을 잃어버리면 본인의 자산에 접근할 수 없게 됩니다. 지갑에는 이를 방지하기 위한 설명서가 제공됩니다. 주의하여 그 내용을 따라주십시오. 대부분의 경우, 지갑에 대한 접근권을 잃어버리면 아무도 도와줄 수 없습니다.", + "page-get-eth-wallet-instructions-lost": "계정에 대한 액세스 권한을 분실하면 자금에 액세스할 권한도 잃습니다. 지갑은 이를 방지할 수 있는 지침을 제공합니다. 지침을 꼼꼼하게 읽으세요. 대부분의 경우 계정의 액세스 권한을 분실하면 그 누구도 도와줄 수 없습니다.", "page-get-eth-wallets": "지갑", "page-get-eth-wallets-link": "지갑에 대해 자세히 알아보기", "page-get-eth-wallets-purchasing": "일부 지갑은 직불 카드/신용 카드, 계좌 이체나 Apple Pay로도 암호화폐를 구매할 수 있습니다. 지리적 제한이 적용됩니다.", - "page-get-eth-warning": "이 탈중앙화 거래소는 어느 정도 ETH가 필요하기 때문에 초보자에게 적합하지 않습니다.", + "page-get-eth-warning": "이러한 DEX를 이용하려면 일정량의 ETH가 필요하기 때문에 초보자에게 적합하지 않습니다. 이는 단지 예시일 뿐이며 보장된 상품이 아닙니다. 정보는 본인이 직접 찾아야 합니다!", "page-get-eth-what-are-DEX's": "DEX란 무엇인가요?", "page-get-eth-whats-eth-link": "ETH란 무엇인가요?", - "page-get-eth-where-to-buy-desc": "거래소나 지갑에서 직접 ETH를 구매할 수 있습니다.", + "page-get-eth-where-to-buy-desc": "ETH를 벌거나 다른 사람으로부터 받거나 거래소 및 앱에서 매수할 수 있습니다.", "page-get-eth-where-to-buy-desc-2": "거주지에 따라 사용 가능한 서비스를 확인하세요.", "page-get-eth-where-to-buy-title": "ETH 구매처", "page-get-eth-your-address": "귀하의 ETH 주소", diff --git a/src/intl/ko/page-languages.json b/src/intl/ko/page-languages.json index 6da152a9534..1226027369a 100644 --- a/src/intl/ko/page-languages.json +++ b/src/intl/ko/page-languages.json @@ -12,10 +12,13 @@ "page-languages-want-more-link": "번역 프로그램", "page-languages-want-more-paragraph": "ethereum.org 번역가는 항상 가능한 많은 언어로 페이지를 번역하고 있습니다. 현재 작업하고 있는 내용을 확인하거나, 참여하기 위해서는 다음 자료를 참조하세요.", "page-languages-filter-placeholder": "필터", + "langauge-am": "암하라어", "language-ar": "아랍어", "language-az": "아제르바이잔어", + "langauge-be": "벨라루스어", "language-bg": "불가리아어", "language-bn": "벵골어", + "language-bs": "보스니아어", "language-ca": "카탈루냐어", "language-cs": "체코어", "language-da": "덴마크어", @@ -32,6 +35,7 @@ "language-hi": "힌디어", "language-hr": "크로아티아어", "language-hu": "헝가리어", + "language-hy-am": "아르메니아어", "language-id": "인도네시아어", "language-ig": "이그보어", "language-it": "이탈리아어", @@ -39,12 +43,14 @@ "language-ka": "조지아어", "language-kk": "카자흐스탄어", "language-km": "캄보디아어", + "language-kn": "칸나다어", "language-ko": "한국어", "language-lt": "리투아니아어", "language-ml": "말라얄람어", "language-mr": "마라티어", "language-ms": "말레이어", "language-nb": "노르웨이어", + "language-ne-np": "Nepali", "language-nl": "네덜란드어", "language-pcm": "나이지리아 피진어", "language-fil": "필리핀어", @@ -58,8 +64,9 @@ "language-sl": "슬로베니아어", "language-sr": "세르비아어", "language-sw": "스와힐리어", - "language-th": "태국어", "language-ta": "타밀어", + "language-th": "태국어", + "language-tk": "투르크멘어", "language-tr": "터키어", "language-uk": "우크라이나어", "language-ur": "우르두어", diff --git a/src/intl/ko/page-layer-2.json b/src/intl/ko/page-layer-2.json index 646bce15f3d..9e26a33a7b3 100644 --- a/src/intl/ko/page-layer-2.json +++ b/src/intl/ko/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "zkSync는 Matter Labs에서 개발한 사용자 중심의 영지식 롤업 플랫폼입니다. 이더리움을 위한 확장 솔루션이며 이미 이더리움 메인넷에서 사용되고 있습니다. 결제, 토큰 교환 및 NFT 발행을 지원합니다.", "zkspace-description": "ZKSpace 플랫폼은 세 가지 주요 부분인 ZKSwap(ZK롤업 기술을 활용한 레이어 2 AMM DEX), ZKSquare(지급결제 서비스), ZKSea(NFT 마켓플레이스)로 구성됩니다.", "aztec-description": "Aztec 네트워크는 이더리움의 첫 번째 비공개 영지식 롤업이며 분산형 애플리케이션이 정보를 보호하고 확장할 수 있도록 합니다.", + "starknet-description": "스타크넷은 검증 롤업 레이어2입니다. 이는 많은 양을 처리할 수 있으며 가스 비용이 저렴하고 이더리움 레이어1의 보안 수준을 유지합니다.", "layer-2-note": "참고:", "layer-2-ecosystem-portal": "생태계 포털", "layer-2-token-lists": "토큰 목록", diff --git a/src/intl/ko/page-wallets-find-wallet.json b/src/intl/ko/page-wallets-find-wallet.json index 66c6304db15..f3f1dbcd05a 100644 --- a/src/intl/ko/page-wallets-find-wallet.json +++ b/src/intl/ko/page-wallets-find-wallet.json @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "브라우저 확장 기능이 있는 지갑", "page-find-wallet-device": "기기", "page-find-choose-to-compare": "비교하도록 선택", - "page-find-wallet-choose-features": "기능 선택" + "page-find-wallet-choose-features": "기능 선택", + "page-find-wallet-reset-filters": "필터 초기화" } From 1c082eb610b23ab719b8604154cc6f1bd14e2646 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 18 Jan 2024 16:50:05 -0700 Subject: [PATCH 042/478] Polish import (Homepage, Essential pages, Exploring, Use Ethereum, Use cases, Staking, Learn hub & guides, Community) --- .../pl/community/get-involved/index.md | 2 +- .../translations/pl/community/grants/index.md | 28 +++--- .../pl/community/language-resources/index.md | 2 +- .../translations/pl/community/online/index.md | 10 +- .../pl/community/research/index.md | 9 +- .../pl/community/support/index.md | 18 ++-- .../pl/decentralized-identity/index.md | 12 ++- public/content/translations/pl/defi/index.md | 4 +- public/content/translations/pl/desci/index.md | 4 +- .../pl/guides/how-to-swap-tokens/index.md | 2 +- .../pl/guides/how-to-use-a-bridge/index.md | 2 +- .../pl/guides/how-to-use-a-wallet/index.md | 2 +- public/content/translations/pl/nft/index.md | 38 +++++--- public/content/translations/pl/refi/index.md | 4 +- .../translations/pl/smart-contracts/index.md | 18 ++-- .../translations/pl/staking/pools/index.md | 5 +- .../translations/pl/staking/saas/index.md | 7 +- .../translations/pl/staking/solo/index.md | 7 +- .../pl/staking/withdrawals/index.md | 16 ++-- src/intl/pl/common.json | 29 ++++-- src/intl/pl/learn-quizzes.json | 8 +- src/intl/pl/page-dapps.json | 94 ++++++++++++++++--- src/intl/pl/page-developers-index.json | 2 +- src/intl/pl/page-gas.json | 64 +++++++++++++ src/intl/pl/page-get-eth.json | 39 +++++--- src/intl/pl/page-index.json | 12 +-- src/intl/pl/page-languages.json | 9 +- src/intl/pl/page-layer-2.json | 1 + src/intl/pl/page-learn.json | 2 +- src/intl/pl/page-stablecoins.json | 45 ++++----- src/intl/pl/page-staking.json | 2 +- src/intl/pl/page-wallets-find-wallet.json | 17 ++-- src/intl/pl/page-wallets.json | 16 ++-- 33 files changed, 351 insertions(+), 179 deletions(-) create mode 100644 src/intl/pl/page-gas.json diff --git a/public/content/translations/pl/community/get-involved/index.md b/public/content/translations/pl/community/get-involved/index.md index 2fc324eff24..3769f42dad1 100644 --- a/public/content/translations/pl/community/get-involved/index.md +++ b/public/content/translations/pl/community/get-involved/index.md @@ -28,7 +28,7 @@ Czy masz doświadczenie w matematyce, kryptografii lub ekonomii? Może zainteres - Napisz lub zrecenzuj Propozycję Ulepszenia Ethereum - Napisz EIP 1. Przedstaw swój pomysł na [Ethereum Magicians](https://ethereum-magicians.org) - 2. Przeczytaj [EIP-1](https://eip.ethereum.org/EIPS/eip-1) — **Tak, jest to _cały_ dokument.** + 2. Przeczytaj [EIP-1](https://eips.ethereum.org/EIPS/eip-1) — **Tak, jest to _cały_ dokument.** 3. Postępuj zgodnie z instrukcjami w EIP-1. Odwołaj się do niego podczas pisania wersji wstępnej. - Dowiedz się jak zostać [edytorem EIP](https://eips.ethereum.org/EIPS/eip-5069) - Możesz już teraz recenzować EIP! Zobacz [otwarte pull requesty (PR) z tagiem `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Przekaż techniczną opinię na temat linku `discussion-to`. diff --git a/public/content/translations/pl/community/grants/index.md b/public/content/translations/pl/community/grants/index.md index bc38982af0d..b21a24d80ce 100644 --- a/public/content/translations/pl/community/grants/index.md +++ b/public/content/translations/pl/community/grants/index.md @@ -15,31 +15,27 @@ Ta lista jest tworzona przez naszą społeczność. Jeśli czegoś brakuje lub j Te programy wspierają rozległy ekosystem Ethereum, oferując granty dla wielu projektów. Obejmują one rozwiązania skalowalności, budowania społeczności, bezpieczeństwa, prywatności i nie tylko. Granty te nie są specyficzne dla żadnej platformy Ethereum i są dobrym miejscem do rozpoczęcia, jeśli nie masz pewności. - [Program wsparcia ekosystemu prowadzony przez EF](https://esp.ethereum.foundation) — _Finansowanie projektów open source, które przynoszą korzyści Ethereum, ze szczególnym naciskiem na uniwersalne narzędzia, infrastrukturę, badania i dobra publiczne_ -- [Ethereum RFP](https://github.com/ethereum/requests-for-proposals) — _Zapytania o propozycje Fundacji Ethereum prac i projektów w ekosystemie Ethereum_ -- [MetaCartel](https://www.metacartel.org/grants/) — _Rozwój zdecentralizowanych aplikacji, tworzenie DAO_ -- [Moloch DAO](https://www.molochdao.com/) — _Prywatność, skalowanie warstwy 2, bezpieczeństwo klienta i nie tylko_ -- [Open Grants](https://opengrants.com/explore) -- [Granty DAO](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) — _Arkusz kalkulacyjny Google organizacji oferujących granty_ -- [Crunchbase dla grantów Web3](https://www.cryptoneur.xyz/web3-grants) — _Filtruj i wyszukuj granty według kategorii, przypadku użycia, kwoty i nie tylko. Przyczyń się, aby pomóc innym w znalezieniu odpowiedniego grantu._ -- [Granty Akademickie](https://esp.ethereum.foundation/academic-grants) — _Granty na wsparcie prac akademickich związanych z Ethereum_ +- [MetaCartel](https://www.metacartel.org/grants/) — _rozwój zdecentralizowanych aplikacji, tworzenie DAO_ +- [Moloch DAO](https://www.molochdao.com/) — _prywatność, skalowanie warstwy 2, bezpieczeństwo klienta i nie tylko_ +- [Granty DAO](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) — _arkusz kalkulacyjny Google organizacji oferujących granty_ +- [Crunchbase dla grantów Web3](https://www.cryptoneur.xyz/web3-grants) — _filtruj i wyszukuj granty według kategorii, przypadku użycia, kwoty i nie tylko. Przyczyń się, aby pomóc innym w znalezieniu odpowiedniego grantu._ +- [Granty Akademickie](https://esp.ethereum.foundation/academic-grants) — _granty na wsparcie prac akademickich związanych z Ethereum_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Firma Blockworks opracowała kompleksowy katalog wszystkich dotacji, zapytań ofertowych i nagród za błędy._ ## Granty specyficzne dla projektu {#project-specific} Projekty te stworzyły własne granty dla projektów mających na celu rozwój i eksperymentowanie z własną technologią. - [Program grantów Aave](https://aavegrants.org/) — _DAO grantów [Aave](https://aave.com/)_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) — _Fundusz ekosystemu [Balancer](https://balancer.fi/)_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) — _fundusz ekosystemu [Balancer](https://balancer.fi/)_ - [Program grantów Chainlink](https://chain.link/community/grants) — _Granty społeczności [Chainlink](https://chain.link/)_ -- [Program grantów Compound](https://compoundgrants.org/) — _Ekosystem finansowy [Compound](https://compound.finance/)_ - [Program grantów Decetraland](https://governance.decentraland.org/grants/) — _Metaverse DAO [Decentraland](https://decentraland.org/)_ -- [Organizacja grantów ekosystemu Lido (LEGO)](https://lego.lido.fi/) — _Ekosystem finansowy [Lido](https://lido.fi/)_ +- [Organizacja grantów ekosystemu Lido (LEGO)](https://lido.fi/lego) — _ekosystem finansowy [Lido](https://lido.fi/)_ - [Program MetaMask](https://metamaskgrants.org/) — _DAO prowadzonych przez pracowników grantów [MetaMask](https://metamask.io/)_ -- [Program grantów mStable](https://docs.mstable.org/advanced/grants-program) — _Społeczność [mStable](https://mstable.org/)_ -- [Program grantów sieci SKALE](https://skale.space/developers#grants) — _Ekosystem [sieci SKALE](https://skale.space/)_ -- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) — _Ekosystem [The Graph](https://thegraph.com/)_ -- [Program grantów UMA](https://grants.umaproject.org/) — _Wsparcie dla deweloperów [UMA](https://umaproject.org/)_ -- [Program grantów Uniswap](https://www.unigrants.org/) — _Społeczność [Uniswap](https://uniswap.org/)_ -- [Granty Web3](https://web3grants.net) — _Obszerna lista programów grantowych związanych z web3/krypto_ +- [Program grantów sieci SKALE](https://skale.space/developers#grants) — _ekosystem [sieci SKALE](https://skale.space/)_ +- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) — _ekosystem [The Graph](https://thegraph.com/)_ +- [Program grantów Uniswap](https://www.uniswapfoundation.org/apply-for-a-grant) — _społeczność [Uniswap](https://uniswap.org/)_ +- [Granty Web3](https://web3grants.net) — _obszerna lista programów grantowych związanych z web3/krypto_ ## Quadratic funding {#quadratic-funding} diff --git a/public/content/translations/pl/community/language-resources/index.md b/public/content/translations/pl/community/language-resources/index.md index a4ca3261834..dfd08947fb1 100644 --- a/public/content/translations/pl/community/language-resources/index.md +++ b/public/content/translations/pl/community/language-resources/index.md @@ -72,7 +72,7 @@ Jeśli jesteś dwujęzyczny i chcesz pomóc nam dotrzeć do większej liczby os - [Gwei.cz](https://gwei.cz) — lokalna społeczność skupiona wokół Web3, tworzy treści edukacyjne, organizuje wydarzenia online i stacjonarne - [Gwei.cz Příručka](https://prirucka.gwei.cz/) — przewodnik Ethereum dla początkujących - [DAO Příručka](https://dao.gwei.cz/) — przewodnik dla początkujących o DAO -- [Mastering Ethereum](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) — doskonalenie Ethereum po czesku +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) — doskonalenie Ethereum po czesku ### Francuski {#fr} diff --git a/public/content/translations/pl/community/online/index.md b/public/content/translations/pl/community/online/index.md index 54dfa383fca..c5e716197af 100644 --- a/public/content/translations/pl/community/online/index.md +++ b/public/content/translations/pl/community/online/index.md @@ -24,13 +24,13 @@ Setki tysięcy entuzjastów Ethereum gromadzi się na tych forach internetowych, Ethereum Cat Herders — społeczność skoncentrowana na oferowaniu wsparcia w zarządzaniu projektami rozwoju Ethereum Ethereum Hackers — czat Discord prowadzony przez ETHGlobal: społeczność internetowa dla hakerów Ethereum na całym świecie CryptoDevs — społeczność Discord skupiająca się na rozwoju Ethereum -EthStaker Discord — prowadzone przez społeczność wskazówki, edukacja, wsparcie i zasoby dla obecnych i potencjalnych stakerów -Zespół strony internetowej ethereum.org — wpadnij i porozmawiaj o tworzeniu i projektowaniu strony internetowej ethereum.org z zespołem i ludźmi ze społeczności +EthStaker Discord — prowadzone przez społeczność wskazówki, edukacja, wsparcie i zasoby dla obecnych i potencjalnych stakerów +Zespół strony internetowej ethereum.org — wpadnij i porozmawiaj o tworzeniu i projektowaniu strony internetowej ethereum.org z zespołem i ludźmi ze społeczności Matos Discord — społeczność twórców web3, w której spotykają się budujący, przedstawiciele przemysłu i entuzjaści Ethereum. Jesteśmy pasjonatami rozwoju, projektowania i kultury web3. Przyjdź tworzyć z nami. -Solidity Gitter — czat dla deweloperów Solidity (Gitter) +Solidity Gitter — czat dla deweloperów Solidity (Gitter) Solidity Matrix — czat dla rozwoju Solidity (Matrix) -Ethereum Stack Exchange _— forum pytań i odpowiedzi_ -Peeranha _— zdecentralizowane forum pytań i odpowiedzi_ +Ethereum Stack Exchange *— forum pytań i odpowiedzi* +Peeranha *— zdecentralizowane forum pytań i odpowiedzi* ## YouTube i Twitter {#youtube-and-twitter} diff --git a/public/content/translations/pl/community/research/index.md b/public/content/translations/pl/community/research/index.md index 19e0eb559eb..287d1af0adc 100644 --- a/public/content/translations/pl/community/research/index.md +++ b/public/content/translations/pl/community/research/index.md @@ -35,7 +35,7 @@ Badania nad konsensusem są związane z [mechanizmem proof-of-stake Ethereum](/d - zwiększanie bezpieczeństwa lub wydajności implementacji klienta; - oraz rozwijanie lekkich klientów. -Oprócz badań wybiegających w przyszłość, badane są niektóre fundamentalne przeprojektowania protokołu, takie jak nieodwołalność pojedynczego slotu, aby umożliwić znaczące ulepszenia Ethereum. Co więcej, wydajność, bezpieczeństwo i monitorowanie sieci peer-to-peer między klientami konsensusu są również ważnymi tematami badawczymi. +Oprócz badań wybiegających w przyszłość, badane są niektóre fundamentalne przeprojektowania protokołu, takie jak finalizacja pojedynczego slotu, aby umożliwić znaczące ulepszenia Ethereum. Co więcej, wydajność, bezpieczeństwo i monitorowanie sieci peer-to-peer między klientami konsensusu są również ważnymi tematami badawczymi. #### Podstawowe informacje {#background-reading} @@ -48,7 +48,7 @@ Oprócz badań wybiegających w przyszłość, badane są niektóre fundamentaln - [Konsensus ethresear.ch](https://ethresear.ch/c/consensus/29) - [Dylemat dostępności/nieodwołalności](https://arxiv.org/abs/2009.04987) -- [Single slot finality](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) +- [Finalizacja pojedynczego slotu](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) - [Separacja proponujący-budujący](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) ### Wykonanie {#execution} @@ -124,7 +124,7 @@ Jednym ze szczególnych obszarów warstwy 2, który wymaga dalszych badań i roz - [Wprowadzenie do mostów blockchain](/bridges/) - [Vitalik o mostach](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [Artykuł o mostach blockchain](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Wartość zablokowana w mostach]() +- [Wartość zablokowana w mostach](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Ostatnie badania {#recent-research-3} @@ -216,7 +216,7 @@ Aby wprowadzić więcej osób do Ethereum, ekosystem musi poprawić UX/UI. Będz ### Ekonomia {#economics} -Badania ekonomiczne w Ethereum zasadniczo opierają się na dwóch podejściach: walidacji bezpieczeństwa mechanizmów opartych na zachętach ekonomicznych („mikroekonomia”) i analizie przepływów wartości między protokołami, aplikacjami i użytkownikami („makroekonomia”). Istnieją złożone czynniki krypto-ekonomiczne związane z natywnym aktywem Ethereum (Ethereum) i tokenami zbudowanymi na nim (na przykład NFT i tokeny ERC20). +Badania ekonomiczne w Ethereum zasadniczo opierają się na dwóch podejściach: walidacji bezpieczeństwa mechanizmów opartych na zachętach ekonomicznych („mikroekonomia”) i analizie przepływów wartości między protokołami, aplikacjami i użytkownikami („makroekonomia”). Istnieją złożone czynniki krypto-ekonomiczne związane z natywnym aktywem Ethereum (ethereum) i tokenami zbudowanymi na nim (na przykład NFT i tokeny ERC20). #### Podstawowe informacje {#background-reading-9} @@ -346,7 +346,6 @@ Narzędzia dla deweloperów Ethereum szybko się poprawiają. W tym obszarze wym - [Frameworki dla deweloperów](/developers/docs/frameworks/) - [Lista narzędzi deweloperskich konsensusu](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Standardy tokenów](/developers/docs/standards/tokens/) -- [Biastek: narzędzia Ethereum](https://biastek.com/ethereum-tools/) - [CryptoDevHub: Narzędzia EVM](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Ostatnie badania {#recent-research-17} diff --git a/public/content/translations/pl/community/support/index.md b/public/content/translations/pl/community/support/index.md index 66a749ef960..900682b41f7 100644 --- a/public/content/translations/pl/community/support/index.md +++ b/public/content/translations/pl/community/support/index.md @@ -30,7 +30,7 @@ Masz problemy z portfelem? Większość portfeli ma dedykowane zespoły wsparcia - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Nie jest to pełna lista. Potrzebujesz pomocy w znalezieniu wsparcia konkretnego portfela? Dołącz do [Discorda ethereum.org](https://discord.gg/ethereum-org), a my postaramy się pomóc._ +_Nie jest to pełna lista. Potrzebujesz pomocy w znalezieniu wsparcia konkretnego portfela? Dołącz do [Discorda ethereum.org](https://discord.gg/rZz26QWfCg), a my postaramy się pomóc._ Szukasz portfela Ethereum? [ Zapoznaj się z naszą pełną listą portfeli Ethereum](/wallets/find-wallet/). @@ -39,7 +39,7 @@ Szukasz portfela Ethereum? [ Zapoznaj się z naszą pełną listą portfeli Ethe Budowanie może być trudne. Oto kilka miejsc skoncentrowanych na rozwoju z doświadczonymi deweloperami Ethereum, którzy chętnie pomogą. - [Alchemy University](https://university.alchemy.com/#starter_code) -- [Discord CryptoDevs](https://discord.gg/Z9TA39m8Yu) +- [Discord CryptoDevs](https://discord.com/invite/5W5tVb3) - [Ethereum StackExchange](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Web3 University](https://www.web3.university/) @@ -53,7 +53,7 @@ Czy twoje pytanie dotyczy konkretnego narzędzia, projektu lub biblioteki? Więk Oto kilka popularnych przykładów: -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [Hardhat](https://discord.gg/xtrMGhmbfZ) @@ -65,7 +65,7 @@ Oto kilka popularnych przykładów: Jeśli uruchamiasz węzeł lub walidator, oto kilka społeczności, które pomogą Ci zacząć. -- [Discord EthStaker](https://discord.io/ethstaker) +- [Discord EthStaker](https://discord.gg/ethstaker) - [Reddit EthStaker](https://www.reddit.com/r/ethstaker) Większość zespołów tworzących klienty Ethereum ma również dedykowane, publiczne przestrzenie, w których można uzyskać wsparcie i zadawać pytania. @@ -89,17 +89,17 @@ Możesz także [ dowiedzieć się, jak uruchomić węzeł tutaj](/developers/doc ## Najczęściej zadawane pytania (FAQ) {#faq} -### Wysłałem ETH do niewłaściwego portfela {#wrong-wallet} +#### Wysłałem ETH do niewłaściwego portfela {#wrong-wallet} Transakcja wysłana na Ethereum jest nieodwracalna. Niestety, jeśli wysłałeś ETH do niewłaściwego portfela, nie ma sposobu na odzyskanie tych środków. Żadna centralna organizacja, podmiot ani osoba nie jest właścicielem Ethereum, co oznacza, że nikt nie może cofnąć transakcji. Dlatego ważne jest, aby zawsze dokładnie sprawdzać transakcje przed ich wysłaniem. -### Jak mogę odebrać wygraną w konkursie Ethereum? {#giveaway-scam} +#### Jak mogę odebrać wygraną w konkursie Ethereum? {#giveaway-scam} Konkursy z nagrodami Ethereum to oszustwa mające na celu kradzież twojego ETH. Nie daj się skusić ofertom, które wydają się zbyt piękne, aby były prawdziwe — jeśli wyślesz ETH na adres konkursowy, nie otrzymasz nagrody i nie będziesz w stanie odzyskać swoich środków. [Więcej informacji na temat zapobiegania oszustwom](/security/#common-scams) -### Moja transakcja utknęła {#stuck-transaction} +#### Moja transakcja utknęła {#stuck-transaction} Transakcje na Ethereum mogą czasami utknąć, jeśli złożyłeś niższą opłatę transakcyjną niż jest to wymagane ze względu na zapotrzebowanie sieci. Wiele portfeli oferuje opcję ponownego przesłania tej samej transakcji z wyższą opłatą transakcyjną, aby umożliwić przetworzenie transakcji. Alternatywnie możesz anulować oczekującą transakcję, wysyłając transakcję na swój własny adres i używając tego samego nonce, co oczekująca transakcja. @@ -107,10 +107,10 @@ Transakcje na Ethereum mogą czasami utknąć, jeśli złożyłeś niższą opł [Jak anulować oczekujące transakcje Ethereum](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) -### Jak wydobywać Ethereum? {#mining-ethereum} +#### Jak wydobywać Ethereum? {#mining-ethereum} Kopanie Ethereum nie jest już dłużej możliwe. Wydobywanie zostało wyłączone, gdy Ethereum przeszło z proof-of-work na proof-of-stake. Teraz, zamiast górników, Ethereum ma walidatorów. Walidatorzy stakują ETH i otrzymują nagrody za zabezpieczenie sieci. -### Jak zostać stakerem/walidatorem? {#become-validator} +#### Jak zostać stakerem/walidatorem? {#become-validator} Aby zostać walidatorem, musisz zestakować 32 ETH w kontrakcie depozytowym Ethereum i skonfigurować węzeł walidatora. Więcej informacji można znaleźć na naszych[ stronach poświęconych stakingowi](/staking) oraz na[ launchpadzie stakingu](https://launchpad.ethereum.org/). diff --git a/public/content/translations/pl/decentralized-identity/index.md b/public/content/translations/pl/decentralized-identity/index.md index 17739bd2286..a688e24d673 100644 --- a/public/content/translations/pl/decentralized-identity/index.md +++ b/public/content/translations/pl/decentralized-identity/index.md @@ -6,16 +6,16 @@ template: use-cases emoji: ":id:" sidebarDepth: 2 image: /eth-gif-cat.png -summaryPoint1: W tradycyjnych systemach tożsamościwydawanie, utrzymywanie i kontrola identyfikatorów są scentralizowane. +summaryPoint1: W tradycyjnych systemach tożsamości wydawanie, utrzymywanie i kontrola Twoich identyfikatorów są scentralizowane. summaryPoint2: Tożsamość zdecentralizowana usuwa zależność od scentralizowanych podmiotów trzecich. -summaryPoint3: Dzięki crypto użytkownicy, po raz kolejny, mają teraz narzędzia do wydawania i kontrolowania własnych identyfikatorów i zaświadczeń. +summaryPoint3: Dzięki technologii kryptograficznej użytkownicy mają ponownie narzędzia do wydawania, przechowywania i kontrolowania własnych identyfikatorów i poświadczeń. --- Tożsamość stanowi dzisiaj podstawę praktycznie każdego aspektu życia. Korzystając z usług internetowych, otwierając konto bankowe, głosując w wyborach, kupując nieruchomości, zatrudniając się — zawsze musisz udowodnić swoją tożsamość. Jednak tradycyjne systemy zarządzania tożsamością od dawna polegają na scentralizowanych pośrednikach, którzy wydają, przechowują i kontrolują Twoje identyfikatory oraz [poświadczenia](#what-are-attestations). Oznacza to, że nie możesz kontrolować informacji związanych z tożsamością ani decydować, kto ma dostęp do informacji umożliwiających identyfikację osoby (PII) i jak duży jest ten dostęp. -Te problemy rozwiązują zdecentralizowane systemy tożsamości oparte na publicznych łańcuchach bloków, takie jak Ethereum. Tożsamość zdecentralizowana umożliwia jednostkom zarządzanie informacjami związanymi z ich tożsamością. Dzięki zdecentralizowanym rozwiązaniom w zakresie tożsamości możesz _samodzielnie_ tworzyć identyfikatory oraz żądać swoich poświadczeń i przechowywać je bez polegania na organach centralnych, takich jak dostawcy usług lub rządy. +Te problemy rozwiązują zdecentralizowane systemy tożsamości oparte na publicznych blockchainach takich jak Ethereum. Tożsamość zdecentralizowana umożliwia jednostkom zarządzanie informacjami związanymi z ich tożsamością. Dzięki zdecentralizowanym rozwiązaniom w zakresie tożsamości możesz _samodzielnie_ tworzyć identyfikatory oraz żądać swoich poświadczeń i przechowywać je bez polegania na organach centralnych, takich jak dostawcy usług lub rządy. ## Co to jest tożsamość? {#what-is-identity} @@ -33,7 +33,7 @@ Identyfikator jest informacją, która wskazuje określoną lub określone tożs Te tradycyjne przykłady identyfikatorów są wydawane, przechowywane i kontrolowane przez jednostki centralne. Potrzebujesz pozwolenia od swojego rządu, aby zmienić swoje imię i nazwisko, a od platformy mediów społecznościowych, aby zmienić swój identyfikator. -## Co to są atesty? {#what-are-attestations} +## Co to są poświadczenia? {#what-are-attestations} Poświadczenie jest oświadczeniem złożonym przez jeden podmiot na temat innego podmiotu. Jeśli mieszkasz w Stanach Zjednoczonych, prawo jazdy wydane przez departament pojazdów mechanicznych (jeden podmiot) potwierdza, że inny podmiot (Ty) jest uprawniony do prowadzenia samochodu. @@ -161,6 +161,7 @@ Istnieje wiele ambitnych projektów wykorzystujących Ethereum jako podstawę zd - **[Proof of Humanity (lub PoH)](https://www.proofofhumanity.id)** — _ system weryfikacji tożsamości społecznościowej oparty na Ethereum._ - **[BrightID](https://www.brightid.org/)** — _sieć zdecentralizowanych tożsamości społecznościowych typu open source. Jej celem jest zreformowanie weryfikacji tożsamości poprzez tworzenie i analizę wykresu społecznego._ - **[Proof-of-personhood Passport](https://proofofpersonhood.com/)** — _zdecentralizowany agregator tożsamości cyfrowych._ +- **[walt.id](https://walt.id)** — _zdecentralizowana infrastruktura tożsamości i portfela o otwartym kodzie źródłowym, która umożliwia deweloperom i organizacjom wykorzystanie niezależnej tożsamości i NFT/SBT._ ## Dalsza lektura {#further-reading} @@ -170,6 +171,7 @@ Istnieje wiele ambitnych projektów wykorzystujących Ethereum jako podstawę zd - [Co to jest Ethereum ERC725? Samodzielne zarządzanie tożsamością w łańcuchu bloków](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ - [Jak łańcuch bloków może rozwiązać problem cyfrowej tożsamości](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ - [Co to jest zdecentralizowana tożsamość i dlaczego warto się nią zajmować?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- [Wprowadzenie do zdecentralizowanej tożsamości](https://walt.id/white-paper/digital-identity) — _Dominik Beron_ ### Materiały wideo {#videos} @@ -177,9 +179,11 @@ Istnieje wiele ambitnych projektów wykorzystujących Ethereum jako podstawę zd - [Logowanie za pomocą Ethereum i zdecentralizowanej tożsamości za pomocą Ceramic, IDX, React i 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _samouczek YouTube pokazujący, jak zbudować system zarządzania tożsamością do tworzenia, odczytywania i aktualizowania profilu użytkownika przy użyciu portfela Ethereum autorstwa Nadera Dabita._ - [BrightID — zdecentralizowana tożsamość w Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _odcinek podcastu Bankless omawiający BrightID, zdecentralizowane rozwiązanie tożsamości dla Ethereum._ - [Internet poza łańcuchem: zdecentralizowana tożsamość i weryfikowalne dane uwierzytelniające](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — prezentacja EthDenver 2022 autorstwa Evina McMullena. +- [Wyjaśnienie weryfikowalnych danych uwierzytelniających](https://www.youtube.com/watch?v=ce1IdSr-Kig) — film wyjaśniający na YouTube z demonstracją autorstwa Tamino Baumanna ### Społeczności {#communities} - [Sojusz ERC-725 na GitHub](https://github.com/erc725alliance) — _zwolennicy standardu ERC725 do zarządzania tożsamością w łańcuchu bloków Ethereum._ - [Serwer Discord SpruceID](https://discord.com/invite/Sf9tSFzrnt) — _społeczność dla entuzjastów i programistów pracujących nad logowaniem za pomocą Ethereum._ - [Veramo Labs](https://discord.gg/sYBUXpACh4) — _społeczność programistów uczestniczących w budowaniu struktury weryfikowalnych danych dla aplikacji._ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _społeczność deweloperów i twórców pracujących nad przypadkami użycia zdecentralizowanej tożsamości w różnych branżach_ diff --git a/public/content/translations/pl/defi/index.md b/public/content/translations/pl/defi/index.md index 3ed5cad1322..52c0c6f2108 100644 --- a/public/content/translations/pl/defi/index.md +++ b/public/content/translations/pl/defi/index.md @@ -4,7 +4,7 @@ description: Przegląd DeFi na Ethereum lang: pl template: use-cases emoji: ":money_with_wings:" -image: /use-cases/defi.png +image: /assets/use-cases/defi.png alt: Logo ETH wykonane z klocków lego. sidebarDepth: 2 summaryPoint1: Globalna, otwarta alternatywa dla obecnego systemu finansowego. @@ -277,7 +277,7 @@ Zdecentralizowane ubezpieczenia mają na celu obniżenie kosztów ubezpieczenia, Produkty Ethereum, podobnie jak każde oprogramowanie, mogą zawierać błędy i są narażone na oprogramowanie wykorzystujące luki. Dlatego obecnie wiele dostępnych produktów ubezpieczeniowych koncentruje się na ochronie użytkowników przed utratą środków. Jednak pojawiają się projekty, które zaczynają obejmować swoim zasięgiem wszystko, czym może nas zaskoczyć życie. Dobrym tego przykładem jest program Crop firmy Etherisc, którego celem jest [ochrona drobnych rolników w Kenii przed suszami i powodziami](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc). Zdecentralizowane ubezpieczenie może zapewnić tańszą ochronę ubezpieczeniową dla rolników, którzy często nie są uwzględniani przez tradycyjnych ubezpieczycieli. - Zobacz d-aplikacje ubezpieczeniowe + Zobacz zdecentralizowane aplikacje ubezpieczeniowe diff --git a/public/content/translations/pl/desci/index.md b/public/content/translations/pl/desci/index.md index ee01b6381cb..b3520962280 100644 --- a/public/content/translations/pl/desci/index.md +++ b/public/content/translations/pl/desci/index.md @@ -18,7 +18,7 @@ Zdecentralizowana nauka (DeSci) jest ruchem, który ma na celu zbudowanie public DeSci ma na celu stworzenie ekosystemu, w którym naukowcy są zachęcani do otwartego dzielenia się swoimi badaniami i otrzymują uznanie za swoją pracę, jednocześnie umożliwiając każdemu łatwy dostęp do badań i uczestniczenie w nich. DeSci działa w oparciu o ideę, że wiedza naukowa powinna być dostępna dla każdego, a proces badań naukowych powinien być przejrzysty. DeSci tworzy bardziej zdecentralizowany i rozproszony model badań naukowych, dzięki czemu są one bardziej odporne na cenzurę i kontrolę ze strony władz centralnych. DeSci to środowisko, w którym nowe i niekonwencjonalne pomysły mogą się rozwijać poprzez decentralizację dostępu do finansowania, narzędzi naukowych i kanałów komunikacji. -Zdecentralizowana nauka umożliwia bardziej zróżnicowane źródła finansowania (od [DAO](/dao/), [kwadratowych darowizn](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) do finansowania społecznościowego i innych form), łatwiejszy dostęp do danych i metod, a także poprzez zapewnienie zachęt do odtwarzalności. +Zdecentralizowana nauka pozwala na bardziej zróżnicowane źródła finansowania (od [DAO](/dao/), [kwadratowych darowizn](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) do finansowania społecznościowego i nie tylko), bardziej dostępne dane i metody oraz poprzez zapewnienie zachęt do odtwarzalności. ### Juan Benet — ruch DeSci @@ -103,7 +103,7 @@ Przeglądaj projekty i dołącz do społeczności DeSci. - [OceanDAO: DAO finansuje naukę związaną z danymi](https://oceanprotocol.com/dao) - [Opscientia: otwarty, zdecentralizowany przepływ prac naukowych](https://opsci.io/research/) - [LabDAO: projektuj białka in-silico (za pomocą komputera)](https://alphafodl.vercel.app/) -- [Bio.xyz: zdobądź fundusze na swój biotechnologiczny projekt DAO lub desci](https://www.molecule.to/) +- [Bio.xyz: zdobądź fundusze na swój biotechnologiczny projekt DAO lub desci](https://www.bio.xyz/) - [Research Hub: wysyłaj wyniki naukowe i angażuj się w rozmowy z partnerami](https://www.researchhub.com/) - [VitaDAO: uzyskuj środki finansowe w ramach sponsorowanych umów badawczych na długotrwałe badania](https://www.vitadao.com/) - [Protokół Fleminga: gospodarka danymi typu open-source, która wspiera wspólne odkrycia biomedyczne](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/pl/guides/how-to-swap-tokens/index.md b/public/content/translations/pl/guides/how-to-swap-tokens/index.md index e0c477e148d..ddc39bbab67 100644 --- a/public/content/translations/pl/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/pl/guides/how-to-swap-tokens/index.md @@ -12,7 +12,7 @@ Wymiana tokenów obejmuje wymianę dwóch różnych aktywów istniejących w sie **Wymaganie wstępne:** -- posiadanie portfela kryptowalutowego, możesz postępować zgodnie z tym samouczkiem: [Jak „zarejestrować” konto Ethereum](/guides/how-to-register-an-ethereum-account/) +- posiadanie portfela kryptowalutowego, możesz postępować zgodnie z tym samouczkiem: [Jak „zarejestrować” konto Ethereum](/guides/how-to-create-an-ethereum-account/) - dodanie środków do portfela ## 1. Podłącz swój portfel do wybranej przez siebie zdecentralizowanej giełdy (DEX) diff --git a/public/content/translations/pl/guides/how-to-use-a-bridge/index.md b/public/content/translations/pl/guides/how-to-use-a-bridge/index.md index 65b310b8af0..3d7375616c4 100644 --- a/public/content/translations/pl/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/pl/guides/how-to-use-a-bridge/index.md @@ -10,7 +10,7 @@ Jeśli ruch na Ethereum jest duży, może stać się drogi. Jednym z rozwiązań **Wymaganie wstępne:** -- posiadanie portfela kryptowalutowego, możesz postępować zgodnie z tym samouczkiem: [Jak „zarejestrować” konto Ethereum](/guides/how-to-register-an-ethereum-account/) +- posiadanie portfela kryptowalutowego, możesz postępować zgodnie z tym samouczkiem: [Jak „zarejestrować” konto Ethereum](/guides/how-to-create-an-ethereum-account/) - dodanie środków do portfela ## 1. Określ jaką sieć warstwy 2 chcesz używać diff --git a/public/content/translations/pl/guides/how-to-use-a-wallet/index.md b/public/content/translations/pl/guides/how-to-use-a-wallet/index.md index 290d868ace8..408269211fb 100644 --- a/public/content/translations/pl/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/pl/guides/how-to-use-a-wallet/index.md @@ -51,7 +51,7 @@ Twój adres będzie taki sam we wszystkich projektach Ethereum. Nie musisz rejes 1. Odwiedź stronę internetową dowolnego projektu. 2. Jeśli strona docelowa projektu jest tylko statycznym opisem projektu, powinieneś mieć możliwość kliknięcia przycisku „Otwórz aplikację” w menu, który przeniesie Cię do rzeczywistej aplikacji internetowej. -3. Gdy będziesz w aplikacji kliknij „Połącz”. +3. Gdy będziesz w aplikacji, kliknij „Połącz”. ![Przycisk pozwalający użytkownikowi połączyć się ze stroną internetową za pomocą portfela](./connect1.png) diff --git a/public/content/translations/pl/nft/index.md b/public/content/translations/pl/nft/index.md index 2258f8e89e1..bff48785784 100644 --- a/public/content/translations/pl/nft/index.md +++ b/public/content/translations/pl/nft/index.md @@ -14,15 +14,15 @@ summaryPoint3: Wspierane przez inteligentne kontrakty na blockchainie Ethereum. ## Czym są NFT? {#what-are-nfts} -NFT to tokeny, które są unikalne. Każdy NFT ma inne właściwości (niezamienne) i można udowodnić, że jest rzadki. Różni się to od tokenów takich jak ERC-20, gdzie każdy token w zestawie jest identyczny i ma te same właściwości („zamienne”). Nie obchodzi cię, który konkretnie banknot masz w portfelu, ponieważ wszystkie są identyczne i warte tyle samo. Jednakże _ma_ znaczenie, który konkretnie NFT posiadasz, ponieważ wszystkie mają indywidualne właściwości, które odróżniają je od innych („niezamienne”). +NFT to tokeny, które są unikalne. Każdy NFT ma inne właściwości (niezamienne) i można udowodnić, że jest rzadki. Różni się to od tokenów takich jak ETH lub innych tokenów opartych na Ethereum, takich jak USDC, gdzie każdy token jest identyczny i ma te same właściwości („zamienne”). Nie ma znaczenia, który konkretnie banknot (lub ETH) masz w portfelu, ponieważ wszystkie są identyczne i warte tyle samo. Jednakże _ma_ znaczenie, który konkretnie NFT posiadasz, ponieważ wszystkie mają indywidualne właściwości, które odróżniają je od innych („niezamienne”). -Unikalność każdego NFT umożliwia tokenizację rzeczy takich jak dzieła artystyczne, przedmioty kolekcjonerskie, a nawet nieruchomości, gdzie jeden konkretny unikalny NFT reprezentuje konkretny unikalny prawdziwy lub cyfrowy przedmiot. Własność aktywa zabezpieczona jest przez blockchain Ethereum — nikt nie może zmodyfikować rejestrów własności ani skopiować/wkleić nowego NFT. +Unikalność każdego NFT umożliwia tokenizację rzeczy takich jak dzieła artystyczne, przedmioty kolekcjonerskie, a nawet nieruchomości, gdzie jeden konkretny unikalny NFT reprezentuje konkretny unikalny prawdziwy lub cyfrowy przedmiot. Własność aktywa jest publicznie weryfikowalna na blockchainie Ethereum. ## Internet rzeczy {#internet-of-assets} -NFT i Ethereum rozwiązują niektóre z problemów występujących w dzisiejszym internecie. Ponieważ wszystko staje się coraz bardziej cyfrowe, istnieje potrzeba odtworzenia właściwości przedmiotów fizycznych, takich jak rzadkość, unikalność i dowód własności w sposób, który nie jest kontrolowany przez centralną organizację. Na przykład, dzięki NFT możesz posiadać muzykę mp3, która nie jest specyficzna dla konkretnej aplikacji muzycznej jednej firmy, lub możesz mieć nazwę konta w mediach społecznościowych, którą możesz sprzedać lub wymienić, ale nie może ona zostać samowolnie odebrana przez dostawcę platformy. +NFT i Ethereum rozwiązują niektóre z problemów występujących w dzisiejszym Internecie. Ponieważ wszystko staje się coraz bardziej cyfrowe, istnieje potrzeba odtworzenia właściwości przedmiotów fizycznych, takich jak rzadkość, unikalność i dowód własności w sposób, który nie jest kontrolowany przez centralną organizację. Dzięki NFT możesz na przykład posiadać plik muzyczny mp3 we wszystkich aplikacjach opartych na Ethereum i nie być przywiązanym do konkretnej aplikacji muzycznej danej firmy, takiej jak Spotify lub Apple Music. Możesz posiadać nazwę w mediach społecznościowych, którą możesz sprzedać lub wymienić, ale nie może ona zostać samowolnie odebrana przez dostawcę platformy. Oto jak wygląda porównanie Internetu NFT z Internetem, z którego korzysta większość z nas... @@ -30,19 +30,13 @@ Oto jak wygląda porównanie Internetu NFT z Internetem, z którego korzysta wi | Internet NFT | Internet dzisiaj | | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Ty jesteś właścicielem swoich aktywów! Tylko Ty możesz je sprzedać lub wymienić. | Wynajmujesz aktywa od jakiejś organizacji. | +| Ty jesteś właścicielem swoich aktywów! Tylko Ty możesz je sprzedać lub wymienić. | Wynajmujesz aktywa od jakiejś organizacji i mogą one zostać Ci odebrane. | | NFT są cyfrowo unikalne, nie istnieją dwa takie same NFT. | Kopia jakiejś jednostki często nie może być odróżniona od oryginału. | | Własność NFT jest przechowywana w blockchainie tak, aby każdy mógł ją zweryfikować. | Rejestry własności przedmiotów cyfrowych są przechowywane na serwerach kontrolowanych przez instytucje — musisz im wierzyć na słowo. | | NFT to inteligentne kontrakty na Ethereum. Oznacza to, że można je łatwo wykorzystać w innych inteligentnych kontraktach i aplikacjach na Ethereum! | Firmy posiadające elementy cyfrowe zazwyczaj wymagają własnej infrastruktury typu „ogrodzony ogród” („walled garden”). | | Twórcy mogą sprzedawać swoje prace w dowolnym miejscu i mają dostęp do globalnego rynku. | Twórcy opierają się na infrastrukturze i systemie dystrybucji platform, z których korzystają. Są one często objęte określonymi warunkami użytkowania i ograniczeniami geograficznymi. | | Twórcy NFT mogą zachować prawa własności do własnej pracy i zaprogramować tantiemy bezpośrednio w kontrakcie NFT. | Platformy, takie jak serwisy streamingu muzyki, zachowują większość zysków ze sprzedaży. | -## Jak działają NFT? {#how-nfts-work} - -Podobnie jak każdy token wydany na Ethereum, NFT są wydawane przez inteligentny kontrakt. Inteligentny kontrakt jest zgodny z jednym z kilku standardów NFT (najczęściej ERC-721 lub ERC-1155), które określają funkcje, jakie posiada kontrakt. Kontrakt może tworzyć („wybijać”) NFT i przypisywać je do określonego właściciela. Własność jest określona w kontrakcie poprzez mapowanie określonych NFT na określone adresy. NFT ma ID i zazwyczaj powiązane z nim metadane, które sprawiają, że konkretny token jest unikalny. - -Kiedy ktoś tworzy lub wybija NFT, tak naprawdę wykonuje funkcję w inteligentnym kontrakcie, która przypisuje określony NFT do jego adresu. Informacja ta jest przechowywana w pamięci kontraktu, która jest częścią blochainu. Twórca kontraktu może zapisać w niej dodatkową logikę, na przykład ograniczając całkowitą ilość lub określając tantiemę, która ma być wypłacana twórcy za każdym razem, gdy token zostanie przeniesiony. - ## W jakim celu używa się NFT? {#nft-use-cases} NFT są używane do wielu rzeczy, w tym: @@ -58,23 +52,37 @@ NFT są używane do wielu rzeczy, w tym: - zdecentralizowane nazwy domen internetowych - jako zabezpieczenie w DeFi -Być może jesteś artystą, który chce udostępniać swoje prace za pomocą NFT, bez utraty kontroli i poświęcania zysków na rzecz pośredników. Możesz utworzyć nowy kontrakt i określić liczbę NFT, ich właściwości oraz link do określonego dzieła sztuki. Jako artysta możesz zaprogramować w inteligentnym kontrakcie tantiemy, które powinny zostać Ci zapłacone (np. przekazać 5% ceny sprzedaży właścicielowi kontraktu za każdym razem, gdy NFT zostanie przeniesione). Zawsze możesz również udowodnić, że NFT został stworzony przez Ciebie, ponieważ jesteś właścicielem portfela, który wdrożył kontrakt. Kupujący mogą łatwo udowodnić, że posiadają autentyczny NFT z Twojej kolekcji, ponieważ ich adres portfela jest powiązany z tokenem w Twoim inteligentnym kontrakcie. Mogą go używać w całym ekosystemie Ethereum, mając pewność co do jego autentyczności. +Być może jesteś artystą, który chce udostępniać swoje prace za pomocą NFT, bez utraty kontroli i poświęcania zysków na rzecz pośredników. Możesz utworzyć nowy kontrakt i określić liczbę NFT, ich właściwości oraz link do określonego dzieła sztuki. Jako artysta możesz zaprogramować w inteligentnym kontrakcie tantiemy, które powinny zostać Ci zapłacone (np. przekazywać 5% ceny sprzedaży właścicielowi kontraktu za każdym razem, gdy NFT zostanie przeniesione). Zawsze możesz również udowodnić, że NFT został stworzony przez Ciebie, ponieważ jesteś właścicielem portfela, który wdrożył kontrakt. Kupujący mogą łatwo udowodnić, że posiadają autentyczny NFT z Twojej kolekcji, ponieważ ich adres portfela jest powiązany z tokenem w Twoim inteligentnym kontrakcie. Mogą go używać w całym ekosystemie Ethereum, mając pewność co do jego autentyczności. -To tak jak bilet na wydarzenie sportowe. Podobnie jak organizator wydarzenia może wybrać, ile biletów chce sprzedać, twórca NFT może zdecydować, ile istnieje replik. Czasami są to dokładne repliki, takie jak 5000 takich samych biletów wstępu. Czasami wybijanych jest kilka bardzo podobnych, ale każdy z nich nieco się różni, np. bilet z przypisanym miejscem. Można je kupować i sprzedawać peer-to-peer bez płacenia osobie obsługującej bilety, a kupujący zawsze ma pewność co do autentyczności biletu, sprawdzając adres kontraktu. +Pomyśl o tym tak jak o bilecie na wydarzenie sportowe. Podobnie jak organizator wydarzenia może wybrać, ile biletów chce sprzedać, twórca NFT może zdecydować, ile istnieje replik. Czasami są to dokładne repliki, takie jak 5000 takich samych biletów wstępu. Czasami wybijanych jest kilka bardzo podobnych, ale każdy z nich nieco się różni, np. bilet z przypisanym miejscem. Można je kupować i sprzedawać peer-to-peer bez płacenia osobie obsługującej bilety, a kupujący zawsze ma pewność co do autentyczności biletu, sprawdzając adres kontraktu. -Na ethereum.org NFT są używane do pokazania, że ludzie wnieśli swój wkład do naszego repozytorium GitHub lub uczestniczyli w rozmowach, a nawet mamy własną nazwę domeny NFT. Jeśli przyczynisz się do rozwoju ethereum.org, możesz otrzymać NFT w formie POAPu. Niektóre spotkania kryptowalutowe wykorzystywały tokeny POAP jako bilety. [Więcej na temat przyczyniania się do rozwoju Ethereum](/contributing/#poap). +Na ethereum.org, NFT są używane do pokazania, że ludzie wnieśli znaczący wkład w nasze repozytorium na GitHubie (zaprogramowali stronę, napisali lub zmodyfikowali artykuł...), przetłumaczyli nasze treści lub uczestniczyli w naszych rozmowach ze społecznością, mamy nawet własną nazwę domeny NFT. Jeśli przyczynisz się do rozwoju ethereum.org, możesz otrzymać NFT w formie POAPu. Niektóre spotkania kryptowalutowe wykorzystywały POAPy jako bilety. [Więcej na temat przyczyniania się do rozwoju](/contributing/#poap). ![ethereum.org POAP](./poap.png) -Ta strona ma alternatywną domenę obsługiwaną przez NFT, **ethereum.eth**. Nasz adres `.org` jest zarządzany centralnie przez DNS, podczas gdy ethereum`.eth` jest zarejestrowany na Ethereum za pośrednictwem Ethereum Name Service (ENS). Jest ona naszą własnością i jest zarządzana przez nas. [Sprawdź nasz wpis do ENS](https://app.ens.domains/name/ethereum.eth) +Ta strona ma również alternatywną domenę obsługiwaną przez NFT, **ethereum.eth**. Nasz adres `.org` jest zarządzany centralnie przez dostawcę DNS, podczas gdy ethereum`.eth` jest zarejestrowany na Ethereum za pośrednictwem Ethereum Name Service (ENS). Jest ona naszą własnością oraz jest zarządzana przez nas. [Sprawdź nasz rekord ENS](https://app.ens.domains/name/ethereum.eth) [Więcej o ENS](https://app.ens.domains) +## Jak działają NFT? {#how-nfts-work} + +NFT, podobnie jak inne cyfrowe elementy w blockchainie Ethereum, są tworzone za pomocą specjalnego programu komputerowego opartego na Ethereum, zwanego „inteligentnym kontraktem”. Kontrakty te są zgodne z pewnymi zasadami, takimi jak standardy ERC-721 lub ERC-1155, które określają, co kontrakt może robić. + +Inteligentny kontrakt NFT może robić kilka kluczowych czynności: + +- **Tworzyć NFT:** może tworzyć nowe NFT. +- **Przypisywać własność:** utrzymuje kontrolę nad tym, kto jest właścicielem, którego NFT, łącząc je z określonymi adresami Ethereum. +- **Nadawać każdemu NFT własne ID:** każdy NFT ma numer, który sprawia, że jest unikalny. Ponadto dołączone są do niego zazwyczaj pewne informacje (metadane) opisujące, co reprezentuje NFT. + +Kiedy ktoś „tworzy” lub „wybija” NFT, w zasadzie mówi inteligentnemu kontraktowi, aby dał mu prawo własności do konkretnego NFT. Ta informacja jest bezpiecznie i publicznie przechowywana w blockchainie. + +Co więcej, twórca kontraktu może dodać dodatkowe zasady. Może ograniczyć liczbę NFT, które mogą zostać utworzone lub zdecydować, że powinien otrzymywać niewielką tantiemę za każdym razem, gdy NFT zmieni właściciela. + ### Bezpieczeństwo NFT {#nft-security} -Bezpieczeństwo Ethereum wynika z algorytmu proof-of-stake. System został zaprojektowany w celu ekonomicznego zniechęcenia do złośliwych działań, dzięki czemu Ethereum jest odporne na manipulacje. To właśnie umożliwia działanie NFT. Gdy blok zawierający Twoją transakcję NFT zostanie sfinalizowany, zmiana go kosztowałaby atakującego miliony ETH. Każdy, kto korzysta z oprogramowania Ethereum, byłby w stanie natychmiast wykryć nieuczciwe manipulacje w NFT, a przestępca zostałby ekonomicznie ukarany i wyrzucony. +Bezpieczeństwo Ethereum wynika z algorytmu proof-of-stake. System ten został zaprojektowany w celu ekonomicznego zniechęcenia do złośliwych działań, dzięki czemu Ethereum jest odporne na manipulacje. To właśnie umożliwia działanie NFT. Gdy blok zawierający Twoją transakcję NFT zostanie sfinalizowany, zmiana go kosztowałaby atakującego miliony ETH. Każdy, kto korzysta z oprogramowania Ethereum, byłby w stanie natychmiast wykryć nieuczciwą manipulację w NFT, a przestępca zostałby ekonomicznie ukarany i wyrzucony. Kwestie bezpieczeństwa związane z NFT są najczęściej związane z oszustwami typu phishing, lukami w inteligentnych kontraktach lub błędami użytkownika (takimi jak nieumyślne ujawnienie kluczy prywatnych), co sprawia, że dbanie o bezpieczeństwo portfela ma kluczowe znaczenie dla właścicieli NFT. diff --git a/public/content/translations/pl/refi/index.md b/public/content/translations/pl/refi/index.md index 384f88abaed..3d2d0e8f5a0 100644 --- a/public/content/translations/pl/refi/index.md +++ b/public/content/translations/pl/refi/index.md @@ -18,9 +18,9 @@ summaryPoint3: Narzędzie do drastycznego skalowania aktywów przynoszących kor Zamiast tego ReFi ma na celu rozwiązywanie problemów środowiskowych, komunalnych lub społecznych poprzez tworzenie cykli regeneracyjnych. Systemy te tworzą wartość dla uczestników, jednocześnie przynosząc korzyści ekosystemom i społecznościom. -Jednym z fundamentów ReFi jest koncepcja ekonomii regeneracyjnej, której pionierem jest John Fullerton z [Capital Institute](https://capitalinstitute.org). Zaproponował osiem powiązanych ze sobą zasad, które leżą u podstaw zdrowia systemowego: +Jednym z fundamentów ReFi jest koncepcja ekonomii regeneracyjnej, której pionierem jest John Fullerton z Capital Institute. Zaproponował [osiem powiązanych ze sobą zasad](https://capitalinstitute.org/8-principles-regenerative-economy/), które leżą u podstaw zdrowia systemowego: -![Osiem połączonych ze sobą zasad](refi-regenerative-economy-diagram.png) +![Osiem połączonych ze sobą zasad](../../assets/use-cases/refi-regenerative-economy-diagram.png) Projekty ReFi realizują te zasady przy użyciu [inteligentnych kontraktów](/developers/docs/smart-contracts/) i aplikacji [zdecentralizowanych finansów (DeFi)](/defi/) w celu zachęcania do zachowań regeneracyjnych, np. przywracania zdegradowanych ekosystemów i ułatwiania współpracy na dużą skalę w kwestii globalnych problemów, takich jak zmiany klimatu i utrata różnorodności biologicznej. diff --git a/public/content/translations/pl/smart-contracts/index.md b/public/content/translations/pl/smart-contracts/index.md index be2e32b4919..2e60d12b576 100644 --- a/public/content/translations/pl/smart-contracts/index.md +++ b/public/content/translations/pl/smart-contracts/index.md @@ -12,7 +12,7 @@ Termin „inteligentny kontrakt” stworzył Nick Szabo. W 1994 r. napisał [wpr Szabo wyobraził sobie cyfrowy rynek, na którym automatyczne, kryptograficznie bezpieczne procesy umożliwiają przeprowadzanie transakcji i funkcji biznesowych bez zaufanych pośredników. Inteligentne kontrakty na Ethereum wprowadzają tę wizję w życie. -## Zaufanie do konwencjonalnych kontraktów {#trust-and-contracts} +### Zaufanie do konwencjonalnych kontraktów {#trust-and-contracts} Jednym z największych problemów związanych z tradycyjnym kontraktem jest konieczność przestrzegania jego postanowień przez zaufane osoby. @@ -22,11 +22,7 @@ Alicja i Bob urządzają sobie wyścig rowerowy. Załóżmy, że Alice założy Ten jaskrawy przykład ilustruje problem z dowolną umową nieinteligentną. Nawet jeśli warunki umowy zostaną spełnione (np. Ty jesteś zwycięzcą wyścigu), nadal musisz ufać innej osobie, że wywiąże się z umowy (np. wypłaci zakład). -## Inteligentne kontrakty {#smart-contracts} - -Inteligentne kontrakty digitalizują umowy, przekształcając warunki umowy w kod komputerowy, który automatycznie wykonuje się, gdy warunki kontraktu są spełnione. - -## Cyfrowy automat do sprzedaży {#vending-machine} +### Cyfrowy automat do sprzedaży {#vending-machine} Prostą metaforą inteligentnego kontraktu jest automat sprzedający, który działa nieco podobnie do inteligentnego kontraktu — określone wejścia gwarantują z góry określone wyjścia. @@ -38,25 +34,25 @@ Prostą metaforą inteligentnego kontraktu jest automat sprzedający, który dzi Automat wyda żądany produkt dopiero po spełnieniu wszystkich wymagań. Jeśli nie wybierzesz produktu lub nie umieścisz wystarczającej ilości pieniędzy, automat sprzedający nie wyda produktu. -## Automatyczne wykonanie {#automation} +### Automatyczne wykonanie {#automation} Główną zaletą inteligentnego kontraktu jest to, że deterministycznie wykonuje on jednoznaczny kod po spełnieniu określonych warunków. Nie ma potrzeby czekania, aż człowiek zinterpretuje lub wynegocjuje wynik. Eliminuje to potrzebę korzystania z zaufanych pośredników. Można na przykład napisać inteligentny kontrakt, który przechowuje środki finansowe na rzecz dziecka, umożliwiając mu wypłatę środków po określonej dacie. Jeśli spróbują wypłacić przed tą datą, inteligentny kontrakt nie zostanie wykonany. Możesz też napisać kontrakt, który automatycznie udostępni Ci cyfrową wersję tytułu własności samochodu, gdy zapłacisz sprzedawcy. -## Przewidywalne wyniki {#predictability} +### Przewidywalne wyniki {#predictability} Tradycyjne kontrakty są niejednoznaczne, ponieważ polegają na interpretacji i realizacji zależnej od człowieka. Na przykład, dwóch sędziów może różnie interpretować kontrakt, co może prowadzić do niespójnych decyzji i niejednakowych wyników. Inteligentne kontrakty usuwają tę możliwość. Zamiast tego, inteligentne kontrakty wykonują dokładnie to, co zostało zapisane w kodzie kontraktu. Dokładność ta oznacza, że w takich samych okolicznościach inteligentny kontrakt wygeneruje taki sam wynik. -## Rekord publiczny {#public-record} +### Rekord publiczny {#public-record} Inteligentne kontrakty są przydatne do celów kontroli i śledzenia. Ponieważ inteligentne kontrakty Ethereum znajdują się w publicznym blockchainie, każdy może natychmiast śledzić transfery aktywów i inne powiązane informacje. Możesz na przykład sprawdzić, czy ktoś wysłał pieniądze na Twój adres. -## Ochrona prywatności {#privacy-protection} +### Ochrona prywatności {#privacy-protection} Inteligentne kontrakty chronią również Twoją prywatność. Ponieważ Ethereum jest siecią pseudonimową (Twoje transakcje są związane publicznie z unikalnym adresem kryptograficznym, a nie z Twoją tożsamością), możesz chronić swoją prywatność przed obserwatorami. -## Widoczne terminy {#visible-terms} +### Widoczne terminy {#visible-terms} Wreszcie, podobnie jak w przypadku tradycyjnych kontraktów, możesz sprawdzić, co jest w inteligentnym kontrakcie, zanim go podpiszesz (lub wejdziesz z nim w interakcje w inny sposób). Przejrzystość inteligentnego kontraktu gwarantuje, że każdy może go przeanalizować. diff --git a/public/content/translations/pl/staking/pools/index.md b/public/content/translations/pl/staking/pools/index.md index 4234aaba88c..58933d27d26 100644 --- a/public/content/translations/pl/staking/pools/index.md +++ b/public/content/translations/pl/staking/pools/index.md @@ -53,14 +53,14 @@ Dostępnych jest wiele opcji ułatwiających konfigurację. Skorzystaj z powyżs -Należy pamiętać, że ważne jest, aby wybrać usługę, która poważnie traktuje [różnorodność klientów](/developers/docs/nodes-and-clients/client-diversity/), ponieważ zwiększa to bezpieczeństwo sieci i ogranicza ryzyko. Usługi, które mają dowody na ograniczanie korzystania z większości klientów, są oznaczone „różnorodność klientów wykonawczych” i „różnorodność klientów konsensusu.” +Należy pamiętać, że ważne jest, aby wybrać usługę, która poważnie traktuje [różnorodność klientów](/developers/docs/nodes-and-clients/client-diversity/), ponieważ zwiększa to bezpieczeństwo sieci i ogranicza ryzyko. Usługi, które mają dowody na ograniczanie korzystania z większości klientów, są oznaczone jako „różnorodność klientów wykonawczych” i „różnorodność klientów konsensusu”. Masz sugestię dotyczącą narzędzia do stakingu, które pominęliśmy? Zapoznaj się z naszymi [zasadami umieszczania produktów na liście](/contributing/adding-staking-products/), aby sprawdzić, czy są one odpowiednie i przesłać je do recenzji. ## Często zadawane pytania {#faq} -Zazwyczaj tokeny stakingu ERC-20 są wydawane stakerom, które reprezentują wartość zestakowanego przez nich ETH plus nagrody. Należy pamiętać, że różne pule będą dystrybuować nagrody ze stakowania do swoich użytkowników za pomocą nieco innych metod, ale jest to częste. +Zazwyczaj tokeny stakingu ERC-20 są wydawane stakerom i reprezentują wartość zestakowanego przez nich ETH plus nagrody. Należy pamiętać, że różne pule będą dystrybuować nagrody ze stakowania do swoich użytkowników za pomocą nieco innych metod, ale jest to częste. @@ -81,5 +81,6 @@ Niektóre opcje puli są bardziej zdecentralizowane niż inne, jeśli chodzi o w ## Dodatkowo przeczytaj {#further-reading} +- [Katalog stakingu Ethereum](https://www.staking.directory/) — _Eridian i Spacesider_ - [Staking z Rocket Pool - Przegląd stakingu](https://docs.rocketpool.net/guides/staking/overview.html) — _Dokumenty RocketPool_ - [Staking Ethereum z Lido](https://help.lido.fi/en/collections/2947324-staking-ethereum-with-lido) — _dokumenty pomocy Lido_ diff --git a/public/content/translations/pl/staking/saas/index.md b/public/content/translations/pl/staking/saas/index.md index 8203a0bb034..87136e46c02 100644 --- a/public/content/translations/pl/staking/saas/index.md +++ b/public/content/translations/pl/staking/saas/index.md @@ -43,13 +43,13 @@ Poniżej znajduje się paru dostępnych dostawców SaaS. Skorzystaj z powyższyc -### Dostawcy SaaS +#### Dostawcy SaaS -Należy pamiętać o znaczeniu wspierania [różnorodności klientów](/developers/docs/nodes-and-clients/client-diversity/), ponieważ poprawia to bezpieczeństwo sieci i ogranicza ryzyko. Usługi, które mają dowody na ograniczanie korzystania z większości klientów, są oznaczone „różnorodność klientów wykonawczych” i „różnorodność klientów konsensusu.” +Należy pamiętać o znaczeniu wspierania [różnorodności klientów](/developers/docs/nodes-and-clients/client-diversity/), ponieważ poprawia to bezpieczeństwo sieci i ogranicza ryzyko. Usługi, które mają dowody na ograniczanie korzystania z większości klientów, są oznaczone jako „różnorodność klientów wykonawczych” i „różnorodność klientów konsensusu”. -### Generatory kluczy +#### Generatory kluczy @@ -91,4 +91,5 @@ Skontaktuj się z indywidualnym dostawcą SaaS, aby uzyskać więcej informacji ## Dodatkowo przeczytaj {#further-reading} +- [Katalog stakingu Ethereum](https://www.staking.directory/) — _Eridian i Spacesider_ - [Ocena usług stakingu](https://www.attestant.io/posts/evaluating-staking-services/) — _Jim McDonald 2020 r._ diff --git a/public/content/translations/pl/staking/solo/index.md b/public/content/translations/pl/staking/solo/index.md index 811d8a2116f..5cdca788902 100644 --- a/public/content/translations/pl/staking/solo/index.md +++ b/public/content/translations/pl/staking/solo/index.md @@ -105,13 +105,13 @@ Dostępnych jest wiele opcji ułatwiających konfigurację. Skorzystaj z powyżs -### Narzędzia węzła +#### Narzędzia węzła -Należy pamiętać o znaczeniu wybrania [klienta mniejszościowego](/developers/docs/nodes-and-clients/client-diversity/), ponieważ poprawia to bezpieczeństwo sieci i ogranicza ryzyko. Narzędzia, które pozwalają na konfigurację klienta mniejszościowego są oznaczone jako „multi-klient”. +Należy pamiętać o znaczeniu wybrania [klienta mniejszościowego](/developers/docs/nodes-and-clients/client-diversity/), ponieważ poprawia to bezpieczeństwo sieci i ogranicza ryzyko. Narzędzia, które pozwalają na konfigurację klienta mniejszościowego, są oznaczone jako „multi-klient”. -### Generatory kluczy +#### Generatory kluczy Narzędzia te mogą być używane jako alternatywa dla [CLI depozytu stakingu](https://github.com/ethereum/staking-deposit-cli/), aby pomóc w generowaniu kluczy. @@ -195,6 +195,7 @@ Aby odblokować i otrzymać całe saldo z powrotem, należy również zakończy ## Dalsza lektura {#further-reading} +- [Katalog stakingu Ethereum](https://www.staking.directory/) — _Eridian i Spacesider_ - [Problem różnorodności klientów Ethereum](https://hackernoon.com/ethereums-client-diversity-problem) — _@emmanuelawosika 2022 r._ - [Wspieranie różnorodności klientów](https://www.attestant.io/posts/helping-client-diversity/) — _Jim McDonald 2022 r._ - [Różnorodność klientów w warstwie konsensusu Ethereum](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) — _jmcook.eth 2022 r._ diff --git a/public/content/translations/pl/staking/withdrawals/index.md b/public/content/translations/pl/staking/withdrawals/index.md index e9f76d356ca..626d86b30e4 100644 --- a/public/content/translations/pl/staking/withdrawals/index.md +++ b/public/content/translations/pl/staking/withdrawals/index.md @@ -114,12 +114,12 @@ Rozszerzając te obliczenia, możemy oszacować czas potrzebny na przetworzenie | Liczba wypłat | Czas realizacji | -| :-----------: | :-------------: | -| 400,000 | 3,5 dnia | -| 500,000 | 4,3 dnia | -| 600,000 | 5,2 dnia | -| 700,000 | 6,1 dnia | -| 800,000 | 7,0 dni | +| :-------------------: | :--------------: | +| 400,000 | 3,5 dnia | +| 500,000 | 4,3 dnia | +| 600,000 | 5,2 dnia | +| 700,000 | 6,1 dnia | +| 800,000 | 7,0 dni | @@ -194,7 +194,7 @@ eventCategory="FAQ" eventAction="I operate a validator. Where can I find more information on enabling withdrawals?" eventName="read more"> -Operatorom walidatorów zaleca się odwiedzenie strony wypłaty Staking Launchpad, gdzie można znaleźć więcej szczegółów na temat przygotowania walidatora do wypłat. przygotowane, czas zdarzeń i więcej szczegółów na temat funkcjonowania wypłat. +Operatorom walidatorów zaleca się odwiedzenie strony wypłaty Staking Launchpad, gdzie można znaleźć więcej szczegółów na temat przygotowania walidatora do wypłat, czasu wydarzeń i więcej szczegółów na temat działania wypłat. Aby najpierw wypróbować swoją konfigurację w sieci testowej, odwiedź Goerli Testnet Staking Launchpad, aby rozpocząć. @@ -214,5 +214,5 @@ Nie. Po wyjściu walidatora i wypłaceniu jego pełnego salda wszelkie dodatkowe - [EIP-4895: Wypłaty z łańcucha śledzącego jako operacje](https://eips.ethereum.org/EIPS/eip-4895) - [Ethereum Cat Herders — Szanghaj](https://www.ethereumcatherders.com/shanghai_upgrade/index.html) - [PEEPanEIP #94: Wypłata zestakowanego ETH (testowanie) z Potuz & Hsiao-Wei Wang](https://www.youtube.com/watch?v=G8UstwmGtyE) -- [PEEPanEIP#68: EIP-4895: Łańcuch śledzący wywiera wypłaty jako operacje z Alexem Stokesem](https://www.youtube.com/watch?v=CcL9RJBljUs) +- [PEEPanEIP#68: EIP-4895: Wypłaty push łańcucha śledzącego jako operacje z Alexem Stokesem](https://www.youtube.com/watch?v=CcL9RJBljUs) - [Zrozumienie efektywnego bilansu walidatora](https://www.attestant.io/posts/understanding-validator-effective-balance/) diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index 790e36f3b1c..5b6fc8cc380 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Abstrakcja konta", "about-ethereum-org": "Informacje o ethereum.org", "about-us": "O nas", + "adding-desci-projects": "Dodawanie projektów Desci", + "adding-developer-tools": "Dodawanie narzędzi deweloperskich", + "adding-exchanges": "Dodawanie giełd", + "adding-glossary-terms": "Dodawanie terminów glosariusza", + "adding-layer-2s": "Adding Layer 2s", + "adding-products": "Adding Products", + "adding-staking-products": "Dodawanie produktów stakingowych", + "adding-wallets": "Dodawanie portfeli", + "account-abstraction": "Abstrakcja konta", + "acknowledgements": "Podziękowania", "aria-toggle-search-button": "Włącz przycisk szukania", "aria-toggle-menu-button": "Włącz przycisk menu", "beacon-chain": "Łańcuch śledzący", @@ -12,9 +21,11 @@ "community-hub": "Centrum społeczności", "community-menu": "Menu społeczności", "contact": "Kontakt", + "content-buckets": "Zestawy treści", + "content-resources": "Zasoby treści", "content-standardization": "Normalizacja treści", "contributing": "Współpraca", - "contributors": "Współpracownicy", + "contributors": "Współtwórcy", "contributors-thanks": "Dziękujemy wszystkim, którzy przyczynili się do powstania tej strony!", "cookie-policy": "Polityka dotycząca plików cookie", "copied": "Skopiowane", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Zdecentralizowane sieci społecznościowe", "decentralized-science": "Zdecentralizowana nauka (DeSci)", "defi-page": "Zdecentralizowane finanse (DeFi)", + "design": "Projekt", + "design-principles": "Zasady projektowania", "devcon": "Devcon", "developers": "Deweloperzy", "developers-home": "Strona główna dla deweloperów", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "Czy ten samouczek był pomocny?", "feedback-widget-thank-you-title": "Dziękujemy za opinię!", "feedback-widget-thank-you-subtitle": "Spraw, aby ta strona była jeszcze lepsza, odpowiadając na kilka pytań.", - "feedback-widget-thank-you-subtitle-ext": "Jeśli potrzebujesz pomocy, możesz skontaktować się ze społecznością na naszym kanale Discord.", + "feedback-widget-thank-you-subtitle-ext": "Jeśli potrzebujesz pomocy, możesz skontaktować się ze społecznością na naszym kanale Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Otwórz krótką ankietę", "find-wallet": "Znajdź portfel", @@ -94,11 +107,11 @@ "grants": "Granty", "grant-programs": "Programy grantów dla ekosystemów", "guides": "Przewodniki", - "guides-hub": "Centrum przewodników", + "guides-hub": "Przewodniki", "history-of-ethereum": "Historia Ethereum", "home": "Strona główna", "how-ethereum-works": "Jak działa Ethereum", - "how-to-register-an-ethereum-account": "Jak „zarejestrować” konto Ethereum", + "how-to-create-an-ethereum-account": "Jak „stworzyć” konto Ethereum", "how-to-revoke-token-access": "Jak unieważnić dostęp inteligentnych kontraktów do środków kryptowaluty", "how-to-swap-tokens": "Jak zamienić tokeny", "how-to-use-a-bridge": "Jak zmostkować tokeny do warstwy 2", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Nie udało się załadować danych. Spróbuj ponownie później.", "logo": "logo", "mainnet-ethereum": "Sieć główna Ethereum", + "merge": "Połącz", "more": "Więcej", "nav-developers": "Autorzy", "nav-developers-docs": "Dokumentacja deweloperów", @@ -164,7 +178,8 @@ "search-box-blank-state-text": "Szukaj!", "search-eth-address": "Wygląda to na adres Ethereum. Nie udostępniamy danych specyficznych dla adresów. Spróbuj wyszukać go na eksploratorze bloków, takim jak", "search-no-results": "Brak wyników wyszukiwania", - "single-slot-finality": "Nieodwołalność pojedynczego slotu", + "security": "Bezpieczeństwo", + "single-slot-finality": "Finalizacja pojedynczego slotu", "statelessness": "Bezstanowość", "see-contributors": "Zobacz współtwórców", "set-up-local-env": "Konfiguracja środowiska lokalnego", @@ -181,6 +196,7 @@ "start-here": "Zacznij tutaj", "style-guide": "Przewodnik stylu", "solo": "Stakowanie solo", + "support": "Wsparcie", "terms-of-use": "Warunki użytkowania", "translation-banner-body-new": "Widzisz tę stronę w języku angielskim, ponieważ jeszcze nie została przetłumaczona. Pomóż nam ją przetłumaczyć.", "translation-banner-body-update": "Dostępna jest nowsza wersja tej strony, ale tylko w języku angielskim. Pomóż nam przetłumaczyć najnowszą wersję.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Brak błędów!", "translation-banner-no-bugs-content": "Ta strona nie jest tłumaczona. Na razie celowo zostawiliśmy tę stronę w języku angielskim.", "translation-banner-no-bugs-dont-show-again": "Nie wyświetlaj ponownie", + "translation-program": "programie tłumaczenia", "try-using-search": "Aby znaleźć to, czego szukasz, spróbuj użyć wyszukiwania lub", "tutorials": "Samouczki", "up": "W górę", diff --git a/src/intl/pl/learn-quizzes.json b/src/intl/pl/learn-quizzes.json index 2f4c247b3ef..19551e48a34 100644 --- a/src/intl/pl/learn-quizzes.json +++ b/src/intl/pl/learn-quizzes.json @@ -15,7 +15,7 @@ "questions": "Pytania", "questions-answered": "Pytania, na które odpowiedziano:", "quizzes-subtitle": "Dowiedz się, jak dobrze rozumiesz Ethereum i kryptowaluty. Czy jesteś gotów stać się ekspertem?", - "retry": "Ponów próbę:", + "retry": "Wskaźnik ponownych prób:", "score": "Wynik", "see-results": "Zobacz wyniki", "share-results": "Udostępnij wyniki", @@ -37,7 +37,7 @@ "a001-c-explanation": "W przeciwieństwie do Ethereum, Bitcoin nie jest programowalny i nie może uruchamiać dowolnych programów komputerowych.", "a001-d-label": "Mają inne logo", "a001-d-explanation": "Mają inne logo! Jednak nie jest to największa różnica między nimi.", - "a002-prompt": "Natywna kryptowaluta Ethereum jest nazywana:", + "a002-prompt": "Natywna kryptowaluta Ethereum to:", "a002-a-label": "Ether", "a002-a-explanation": "Ether jest natywną kryptowalutą dla sieci Ethereum.", "a002-b-label": "Ethereum", @@ -155,7 +155,7 @@ "d001-a-label": "Portfel mobilny", "d001-a-explanation": "Portfele mobilne przechowują klucze prywatne na urządzeniu mobilnym, które zazwyczaj posiada połączenie z internetem i może być zagrożone przez inne oprogramowanie.", "d001-b-label": "Portfel sprzętowy", - "d001-b-explanation": "Klucze prywatne portfela sprzętowego są przechowywane na dedykowanym urządzeniu, które może być przechowywane bez internetu oraz są odizolowane od innych aplikacji na twoich urządzeniach.", + "d001-b-explanation": "Klucze prywatne portfela sprzętowego są przechowywane na dedykowanym urządzeniu, które może być przechowywane bez internetu oraz są odizolowane od innych aplikacji na Twoich urządzeniach.", "d001-c-label": "Portfel internetowy", "d001-c-explanation": "Portfele internetowe są mniej bezpieczne niż portfele sprzętowe, ponieważ klucze prywatne są przechowywane na urządzeniu podłączonym do internetu.", "d001-d-label": "Portfel komputerowy", @@ -241,7 +241,7 @@ "f004-b-explanation": "NFT pomogły stworzyć nową gospodarkę dla twórców, a nie emisyjną.", "f004-c-label": "gospodarkę twórców", "f004-c-explanation": "NFT przyczyniły się do powstania gospodarki twórców.", - "f004-d-label": "gospodarki doge", + "f004-d-label": "gospodarkę doge", "f004-d-explanation": "NFT pomogły stworzyć nową gospodarkę dla twórców, a nie gospodarkę doge 🐶.", "f005-prompt": "NFT na Ethereum są szkodliwe dla środowiska", "f005-a-label": "Prawda", diff --git a/src/intl/pl/page-dapps.json b/src/intl/pl/page-dapps.json index 1386f87d14f..4422657ed32 100644 --- a/src/intl/pl/page-dapps.json +++ b/src/intl/pl/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "1-calowe logo", - "page-dapps-dexguru-logo-alt": "Logo DexGuru", "page-dapps-aave-logo-alt": "Logo Aave", "page-dapps-add-button": "Zasugeruj dapp", "page-dapps-add-title": "Dodaj dapp", + "page-dapps-ankr-logo-alt": "Logo Ankr", + "page-dapps-api3-logo-alt": "Logo API3", + "page-dapps-arweave-logo-alt": "Logo ARweave", "page-dapps-audius-logo-alt": "Logo Audius", "page-dapps-augur-logo-alt": "Logo Augur", "page-dapps-axie-infinity-logo-alt": "Logo Axie Infinity", "page-dapps-balancer-logo-alt": "Logo Balancer", "page-dapps-brave-logo-alt": "Logo Brave", + "page-dapps-beginner-friendly-description": "Klika zdecentralizowanych aplikacji dobrych dla początkujących. Odkryj więcej poniżej.", + "page-dapps-beginner-friendly-header": "Przyjazne dla początkujących", "page-dapps-category-arts": "Sztuka i moda", "page-dapps-category-browsers": "Przeglądarki", + "page-dapps-category-code-marketplaces": "Rynki kodów", "page-dapps-category-collectibles": "Cyfrowe artykuły kolekcjonerskie", - "page-dapps-category-competitive": "Konkurencja", + "page-dapps-category-competitive": "Gry Web3", "page-dapps-category-computing": "Narzędzia deweloperskie", - "page-dapps-category-dex": "Zamiana tokenów", - "page-dapps-category-investments": "Inwestycje", + "page-dapps-category-dex": "Giełdy", + "page-dapps-category-investments": "Fundusze inwestycyjne", "page-dapps-category-lending": "Kredyty i pożyczki", "page-dapps-category-lottery": "Fundusze społecznościowe", "page-dapps-category-marketplaces": "Rynki", "page-dapps-category-music": "Muzyka", "page-dapps-category-payments": "Płatności", "page-dapps-category-insurance": "Ubezpieczenie", - "page-dapps-category-portfolios": "Portfolia", - "page-dapps-category-trading": "Rynki handlowe i prognostyczne", + "page-dapps-category-portfolios": "Zarządzanie portfolio", + "page-dapps-category-trading": "Rynki prognostyczne", "page-dapps-category-utilities": "Narzędzia", "page-dapps-category-worlds": "Wirtualne światy", + "page-dapps-category-demand-aggregator": "Agregatory popytu", + "page-dapps-category-derivatives": "Pochodne", + "page-dapps-category-liquid-staking": "Płynny staking", + "page-dapps-category-bridges": "Mosty", + "page-dapps-category-experiences": "Wspólne doświadczenia", + "page-dapps-category-guilds": "Gildie zysków", + "page-dapps-category-avatar": "Awatary", "page-dapps-choose-category": "Wybierz kategorię", + "page-dapps-category-social": "Media społecznościowe", + "page-dapps-category-content": "Treść", + "page-dapps-category-messaging": "Wiadomości", + "page-dapps-category-identity": "Tożsamość", "page-dapps-collectibles-benefits-1-description": "Gdy dzieło sztuki jest tokenizowane na Ethereum, można udowodnić jego własność w sposób widoczny dla wszystkich. Można prześledzić drogę dzieła sztuki od momentu jego stworzenia do obecnego posiadacza. Zapobiega to fałszerstwom.", "page-dapps-collectibles-benefits-1-title": "Można udowodnić własność", "page-dapps-collectibles-benefits-2-description": "Płacenie za streaming muzyki lub zakup dzieł sztuki jest o wiele bardziej sprawiedliwe dla artystów. Dzięki Ethereum nie ma potrzeby korzystania z pośredników. A jeśli pośrednicy są potrzebni, ich koszty nie są tak wysokie, ponieważ platformy nie muszą płacić za infrastrukturę sieci.", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "Są to aplikacje, które skupiają się na własności cyfrowej, zwiększaniu potencjału zarobkowego twórców oraz wymyślaniu nowych sposobów inwestowania w ulubionych twórców i ich pracę.", "page-dapps-collectibles-title": "Zdecentralizowane przedmioty artystyczne i kolekcjonerskie", "page-dapps-compound-logo-alt": "Logo Compound", + "page-dapps-convex-logo-alt": "Logo Convex", "page-dapps-cryptopunks-logo-alt": "Logo CryptoPunks", "page-dapps-cryptovoxels-logo-alt": "Logo Cryptovoxels", + "page-dapps-cyberconnect-logo-alt": "Logo CyberConnect", "page-dapps-dapp-description-1inch": "Pomaga uniknąć znaczących poślizgów cenowych dzięki agregacji najlepszych cen.", "page-dapps-dapp-description-aave": "Wypożycz swoje tokeny, aby zarobić odsetki i wypłacić je w dowolnym czasie.", + "page-dapps-dapp-description-ankr": "Zestaw różnych produktów infrastruktury Web3 do budowania, zarabiania, grania i nie tylko — wszystko na blockchainie.", + "page-dapps-dapp-description-api3": "Kanały referencyjne danych first-party cen, które umożliwiają zdecentralizowanym aplikacjom w 10 sieciach (a ich liczba stale rośnie) łączenie się z danymi cen aktywów w czasie rzeczywistym, w tym cenami kryptowalut oraz forexów.", + "page-dapps-dapp-description-arweave": "Przechowuj dane permanentnie, w sposób zrównoważony, za jedną opłatą z góry.", "page-dapps-dapp-description-async-art": "Twórz, zbieraj i handluj #ProgrammableArt - obrazami cyfrowymi podzielonymi na \"Warstwy\", które możesz wykorzystać, aby wpłynąć na ogólny obraz. Każdy mistrz i warstwa jest tokenem ERC721.", "page-dapps-dapp-description-audius": "Zdecentralizowana platforma streamingowa. Słuchanie = pieniądze dla twórców, a nie etykiet.", "page-dapps-dapp-description-augur": "Obstawiaj wyniki sportowe, ekonomiczne i inne wydarzenia na świecie.", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "Zarabiaj tokeny za przeglądanie i wspieraj swoich ulubionych twórców.", "page-dapps-dapp-description-cent": "Sieć społecznościowa, w której zarabiasz poprzez umieszczenie NFT.", "page-dapps-dapp-description-compound": "Wypożycz swoje tokeny, aby zarobić odsetki i wypłacić je w dowolnym czasie.", + "page-dapps-dapp-description-convex": "Convex pozwala dostawcom płynności Curve zarabiać na opłatach transakcyjnych i ubiegać się o zwiększone CRV bez blokowania ich CRV.", "page-dapps-dapp-description-cryptopunks": "Kupuj, licytuj i oferuj punki na sprzedaż — jeden z pierwszych tokenów kolekcjonerskich na Ethereum.", "page-dapps-dapp-description-cryptovoxels": "Stwórz galerię sztuki, buduj sklepy i kup ziemię — wirtualny świat Ethereum.", + "page-dapps-dapp-description-cyberconnect": "Zdecentralizowany protokół grafu społecznościowego, który pomaga zdecentralizowanym aplikacjom w uruchamianiu efektów sieciowych i budowaniu spersonalizowanych doświadczeń społecznościowych", "page-dapps-dapp-description-dark-forest": "Podbijaj planety w nieskończonym, proceduralnie generowanym, kryptograficznie określonym wszechświecie.", "page-dapps-dapp-description-decentraland": "Zbieraj, handluj wirtualną ziemią w wirtualnym świecie, który możesz odkrywać.", "page-dapps-dapp-description-ens": "Przyjazne dla użytkowników nazwy adresów Ethereum i zdecentralizowanych stron.", "page-dapps-dapp-description-foundation": "Inwestuj w unikalne edycje sztuki cyfrowej i handluj z innymi nabywcami.", "page-dapps-dapp-description-gitcoin": "Zarabiaj kryptowaluty, pracując nad oprogramowaniem open-source.", "page-dapps-dapp-description-gitcoin-grants": "Finansowanie społecznościowe projektów społeczności Ethereum ze zwiększonym wkładem finansowym", + "page-dapps-dapp-description-gm": "Uniwersalna platforma do czatu, forów i komunikacji głosowej, która dzieli się przychodami ze swoimi twórcami", "page-dapps-dapp-description-gods-unchained": "Strategiczna handlowa gra karciana. Grając, zdobywaj karty, które możesz sprzedać w prawdziwym życiu.", "page-dapps-dapp-description-golem": "Uzyskaj dostęp do współdzielonej mocy obliczeniowej lub wynajmuj własne zasoby.", + "page-dapps-dapp-description-graph": "Protokół indeksujący do zapytań w sieciach takich jak Ethereum i IPFS.", + "page-dapps-dapp-description-ipfs": "Protokół hipermedialny peer-to-peer zaprojektowany w celu zachowania i rozwoju wiedzy ludzkości poprzez uczynienie sieci możliwą do aktualizacji, odporną i bardziej otwartą.", "page-dapps-dapp-description-radicle": "Bezpieczna współpraca z kodem peer-to-peer bez pośredników.", + "page-dapps-dapp-description-kyberswap": "Wymieniaj i zarabiaj po najlepszych kursach.", + "page-dapps-dapp-description-lido": "Uproszczony i bezpieczny staking dla aktywów cyfrowych.", "page-dapps-dapp-description-loopring": "Platforma handlowa peer-to-peer stworzona z myślą o szybkości.", "page-dapps-dapp-description-marble-cards": "Twórz unikalne karty cyfrowe oparte na adresach URL i handluj nimi.", "page-dapps-dapp-description-matcha": "Wyszukuje wiele giełd, aby pomóc Ci znaleźć najlepsze ceny.", + "page-dapps-dapp-description-mirror": "Zbudowana na web3 dla web3, solidna platforma wydawnicza Mirror przesuwa granice pisania online", + "page-dapps-dapp-description-multichain": "Najlepszy router dla web3. Jest to infrastruktura stworzona do dowolnych interakcji międzyłańcuchowych.", "page-dapps-dapp-description-nifty-gateway": "Kupuj prace w łańcuchu od najlepszych artystów, sportowców, marek i twórców.", "page-dapps-dapp-description-oasis": "Handluj, pożyczaj i oszczędzaj z Dai, stablecoinem Ethereum.", "page-dapps-dapp-description-opensea": "Kupuj, sprzedawaj, odkrywaj i wymieniaj rzeczami z limitowanych edycji.", "page-dapps-dapp-description-opera": "Wyślij kryptowaluty ze swojej przeglądarki do sprzedawców, innych użytkowników i aplikacji.", + "page-dapps-dapp-description-osuvox": "Awatary 3D żyjące na blockchainie", "page-dapps-dapp-description-poap": "Zbieraj NFT potwierdzające, że brałeś udział w różnych wirtualnych lub stacjonarnych wydarzeniach. Użyj ich, aby dołączyć do loterii, głosować, współpracować lub po prostu móc się pochwalić.", "page-dapps-dapp-description-polymarket": "Postaw na wyniki. Handluj na rynkach informacji.", "page-dapps-dapp-description-pooltogether": "Loteria, w której nie można przegrać. Nagrody co tydzień.", @@ -82,13 +113,19 @@ "page-dapps-dapp-description-rotki": "Narzędzie open source do śledzenia portfela, analizy, księgowości i raportowania podatkowego, które szanuje Twoją prywatność.", "page-dapps-dapp-description-krystal": "Kompleksowa platforma umożliwiająca dostęp do wszystkich Twoich ulubionych usług DeFi.", "page-dapps-dapp-description-rarible": "Twórz, sprzedawaj i kupuj tokenizowane przedmioty kolekcjonerskie.", + "page-dapps-dapp-description-rubic": "Międzyłańcuchowy agregator technologii dla użytkowników i zdecentralizowanych aplikacji.", "page-dapps-dapp-description-sablier": "Przesyłaj pieniądze w czasie rzeczywistym.", + "page-dapps-dapp-description-skiff": "Całkowicie szyfrowana poczta e-mail, kalendarz, dokumenty i pliki, które umożliwiają swobodną komunikację.", + "page-dapps-dapp-description-spatial": "Stwórz swój własny awatar i światy 3D", + "page-dapps-dapp-description-spruce": "Stos open-source pozostawiający kontrolę nad tożsamością i danymi tam, gdzie powinna być — z użytkownikami.", + "page-dapps-dapp-description-status": "Zaprojektowany, aby umożliwić swobodny przepływ informacji, chronić prawo do prywatnych, bezpiecznych rozmów i promować suwerenność jednostek.", "page-dapps-dapp-description-superrare": "Kupuj dzieła cyfrowe bezpośrednio od artystów lub na rynkach wtórnych.", + "page-dapps-dapp-description-synthetix": "Synthetix to protokół do emisji i handlu aktywami syntetycznymi", "page-dapps-dapp-description-token-sets": "Strategie kryptowalutowych inwestycji, które automatycznie przywracają równowagę.", "page-dapps-dapp-description-tornado-cash": "Wysyłaj anonimowe transakcje na Ethereum.", "page-dapps-dapp-description-uniswap": "Wymieniaj tokeny w prosty sposób lub dostarczaj tokeny w zamian za % nagrody.", - "page-dapps-dapp-description-dexguru": "Terminal handlowy bez ograniczeń dla traderów DeFi", - "page-dapps-dapp-description-synthetix": "Synthetix to protokół do emisji i handlu aktywami syntetycznymi", + "page-dapps-dapp-description-xmtp": "Wysyłaj wiadomości między kontami blockchain, w tym wiadomości prywatne, alerty, ogłoszenia i nie tylko.", + "page-dapps-dapp-description-yearn": "Yearn Finance to agregator zysków. Daje osobom fizycznym, DAO i innym protokołom sposób na wpłacenie zasobów cyfrowych i otrzymywanie zysków.", "page-dapps-docklink-dapps": "Wprowadzenie do dapps", "page-dapps-docklink-smart-contracts": "Inteligentne kontrakty", "page-dapps-dark-forest-logo-alt": "Logo Dark Forest", @@ -104,9 +141,7 @@ "page-dapps-desc": "Znajdź aplikację Ethereum, aby wypróbować.", "page-dapps-doge-img-alt": "Ilustracja pieseła siedzącego przy komputerze", "page-dapps-editors-choice-dark-forest": "Graj przeciwko innym, aby podbijać planety i wypróbować najnowocześniejszą technologię skalowania/prywatności Ethereum. Być może dla tych, którzy są już zaznajomieni z Ethereum.", - "page-dapps-editors-choice-description": "Kilka zdecentralizowanych aplikacji, które zespół ethereum.org uwielbia w tej chwili. Odkryj więcej zdecentralizowanych aplikacji poniżej.", "page-dapps-editors-choice-foundation": "Zainwestuj w kulturę. Kupuj, wymieniaj i sprzedawaj unikalne cyfrowe dzieła sztuki i modę od niesamowitych artystów, muzyków i marek.", - "page-dapps-editors-choice-header": "Wybór redakcji", "page-dapps-editors-choice-pooltogether": "Kup bilet na loterię bez przegranych. Co tydzień, odsetki wygenerowane z całej puli losów trafiają do jednego szczęśliwego zwycięzcy. Odzyskaj swoje pieniądze, kiedy tylko zechcesz.", "page-dapps-editors-choice-uniswap": "Z łatwością zamieniaj tokeny. Ulubiona aplikacja społeczności pozwalająca na handel tokenami z ludźmi w całej sieci.", "page-dapps-ens-logo-alt": "Logo Ethereum Name Service", @@ -156,8 +191,10 @@ "page-dapps-get-started-title": "Rozpocznij", "page-dapps-gitcoin-grants-logo-alt": "Logo Gitcoin Grants", "page-dapps-gitcoin-logo-alt": "Logo Gitcoin", + "page-dapps-gm-logo-alt": "Logo gm.xyz", "page-dapps-gods-unchained-logo-alt": "Logo Gods Unchained", "page-dapps-golem-logo-alt": "Logo Golem", + "page-dapps-graph-logo-alt": "Logo Graph", "page-dapps-radicle-logo-alt": "Logo Radicle", "page-dapps-hero-header": "Narzędzia i usługi oparte na Ethereum", "page-dapps-hero-subtitle": "Aplikacje zdecentralizowane stanowią rosnący trend wśród aplikacji wykorzystujących Ethereum do przekształcania modeli biznesowych lub tworzenia nowych.", @@ -165,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "Inteligentny kontrakt jest jak zestaw reguł, które są widoczne dla wszystkich w łańcuchu i działają dokładnie według tych reguł. Wyobraź sobie automat sprzedający: jeśli dostarczysz mu wystarczającą ilość środków i dokonasz właściwego wyboru, otrzymasz żądany przedmiot. Podobnie jak automaty sprzedające, inteligentne kontrakty mogą przechowywać środki, podobnie jak Twoje konto Ethereum. Pozwala to kodowi pośredniczyć w umowach i transakcjach.", "page-dapps-how-dapps-work-p3": "Gdy zdecentralizowane aplikacje zostaną wdrożone do sieci Ethereum, nie można ich zmienić. Aplikacje mogą być zdecentralizowane, ponieważ są kontrolowane przez logikę zapisaną w kontrakcie, a nie przez osobę czy firmę.", "page-dapps-how-dapps-work-title": "Jak działają aplikacje zdecentralizowane", + "page-dapps-ipfs-logo-alt": "Logo IPFS", + "page-dapps-kyberswap-logo-alt": "Logo KyberSwap", "page-dapps-learn-callout-button": "Zacznij tworzenie", - "page-dapps-learn-callout-description": "Nasz portal społeczności deweloperów zawiera dokumenty, narzędzia i ramy, które pomogą Ci rozpocząć tworzenie zdecentralizowanej aplikacji.", + "page-dapps-learn-callout-description": "Nasz portal społeczności deweloperów zawiera dokumenty, narzędzia i frameworki, które pomogą Ci rozpocząć tworzenie zdecentralizowanej aplikacji.", "page-dapps-learn-callout-image-alt": "Ilustracja przedstawiająca dłoń tworzącą symbol ETH z klocków lego.", "page-dapps-learn-callout-title": "Naucz się tworzyć zdecentralizowane aplikacje", + "page-dapps-lido-logo-alt": "Logo Lido", "page-dapps-loopring-logo-alt": "Logo Loopring", "page-dapps-magic-behind-dapps-description": "Aplikacje zdecentralizowane mogą wydawać się zwykłymi aplikacjami. Mają jednak pewne specjalne cechy, ponieważ dziedziczą wszystkie supermoce Ethereum. Dzięki temu aplikacje zdecentralizowane różnią się od zwykłych aplikacji.", "page-dapps-magic-behind-dapps-link": "Co decyduje o wspaniałości Ethereum?", @@ -179,11 +219,23 @@ "page-dapps-marble-cards-logo-alt": "Logo marble.cards", "page-dapps-async-logo-alt": "Logo Async", "page-dapps-matcha-logo-alt": "Logo Matcha", + "page-dapps-metaverse-benefits-title": "metaverse", + "page-dapps-metaverse-benefits-description": "Co takiego jest w Ethereum, że pozwala metaverse rozwijać się?", + "page-dapps-metaverse-benefits-1-title": "Tokeny NFT", + "page-dapps-metaverse-benefits-1-description": "Unikalne przedmioty w grze, które są własnością użytkowników i są interoperacyjne między wirtualnymi światami i rynkami obsługującymi te same standardy.", + "page-dapps-metaverse-benefits-2-title": "Społeczności należące do użytkowników", + "page-dapps-metaverse-benefits-2-description": "Tożsamości są własnością użytkowników z nieskończonymi możliwościami odkrywania i tworzenia sieci społecznościowych w wielu wirtualnych światach.", + "page-dapps-metaverse-button": "Metaverse", + "page-dapps-metaverse-title": "Metaverse", + "page-dapps-metaverse-description": "Są to aplikacje, które umożliwiają użytkownikom na swobodne uczestnictwo w wirtualnych światach. Użytkownicy mogą tworzyć osobiste sieci i przejmować na własność cyfrowe zasoby", + "page-dapps-mirror-logo-alt": "Logo Mirror", "page-dapps-mobile-options-header": "Przeglądaj inne kategorie", + "page-dapps-multichain-logo-alt": "Logo Multichain", "page-dapps-nifty-gateway-logo-alt": "Logo Nifty Gateway", "page-dapps-oasis-logo-alt": "Logo Oasis", "page-dapps-opensea-logo-alt": "Logo OpenSea", "page-dapps-opera-logo-alt": "Logo Opera", + "page-dapps-osuvox-logo-alt": "Logo OSUVOX", "page-dapps-polymarket-logo-alt": "Logo Polymarket", "page-dapps-poap-logo-alt": "Logo protokołu potwierdzającego obecność", "page-dapps-pooltogether-logo-alt": "Logo PoolTogether", @@ -191,10 +243,18 @@ "page-dapps-ready-button": "Przejdź", "page-dapps-ready-description": "Wybierz aplikację, aby wypróbować", "page-dapps-ready-title": "Gotów?", + "page-dapps-rubic-logo-alt": "Logo Rubic", "page-dapps-sablier-logo-alt": "Logo Sablier", "page-dapps-set-up-a-wallet-button": "Znajdź portfel", "page-dapps-set-up-a-wallet-description": "Portfel jest twoim „loginem” dla zdecentralizowanych aplikacji", "page-dapps-set-up-a-wallet-title": "Konfiguracja portfela", + "page-dapps-skiff-logo-alt": "Logo Skiff", + "page-dapps-social-button": "Społeczność", + "page-dapps-social-description": "Są to aplikacje, które koncentrują się na tworzeniu zdecentralizowanych sieci społecznościowych wykorzystujących zdecentralizowane technologie tożsamości, w których cyfrowe tożsamości i wykresy społecznościowe są własnością użytkowników.", + "page-dapps-social-title": "Społeczność", + "page-dapps-spatial-logo-alt": "Logo Spatial", + "page-dapps-spruce-logo-alt": "Logo Spruce", + "page-dapps-status-logo-alt": "Logo statusu", "page-dapps-superrare-logo-alt": "Logo SuperRare", "page-dapps-technology-button": "Technologia", "page-dapps-technology-description": "Są to aplikacje, które koncentrują się na decentralizacji narzędzi deweloperskich, włączaniu systemów kryptoekonomicznych do istniejących technologii oraz tworzeniu rynków dla prac rozwojowych typu open source.", @@ -214,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "Więcej o tokenizowanych przedmiotach w grze", "page-dapps-dapp-description-pwn": "Łatwe pożyczki zabezpieczone dowolnym tokenem lub NFT w Ethereum.", "page-dapps-pwn-image-alt": "Logo PWN", - "page-dapps-dapp-description-yearn": "Yearn Finance to agregator zysków. Daje osobom fizycznym, DAO i innym protokołom sposób na wpłacenie zasobów cyfrowych i otrzymywanie zysków.", + "page-dapps-xmtp-logo-alt": "Logo XMTP", + "opage-dapps-yearn-logo-alt": "Logo Yearn", "page-dapps-yearn-image-alt": "Logo Yearn", - "page-dapps-dapp-description-convex": "Convex pozwala dostawcom płynności Curve zarabiać na opłatach transakcyjnych i ubiegać się o zwiększone CRV bez blokowania ich CRV.", "page-dapps-convex-image-alt": "Logo Convex", "foundation": "Fundacja", "transaction-fees": "Co to są opłaty transakcyjne?", - "page-wallets-get-some": "Weź trochę ETH" + "page-wallets-get-some": "Zdobądź trochę ETH", + "page-dapps-dapp-description-curve": "Curve to zdecentralizowana giełda skupiająca się na stablecoinach", + "page-dapps-curve-image-alt": "Logo Curve", + "page-dapps-dapp-description-dodo": "DODO jest dostawcą płynności w łańcuchu, który wykorzystuje algorytm Proactive Market Maker (PMM)", + "page-dapps-dodo-image-alt": "Logo DODO", + "page-dapps-dapp-description-artblocks": "Art Blocks zajmuje się ożywianiem fascynujących dzieł współczesnej sztuki generatywnej", + "page-dapps-artblocks-image-alt": "Logo Art Blocks" } diff --git a/src/intl/pl/page-developers-index.json b/src/intl/pl/page-developers-index.json index 205fbe377d0..d27c1ba8dc9 100644 --- a/src/intl/pl/page-developers-index.json +++ b/src/intl/pl/page-developers-index.json @@ -24,7 +24,7 @@ "page-developers-explore-documentation": "Przejrzyj dokumentację", "page-developers-feedback": "Jeśli chcesz nam przekazać swoją opinię, jesteśmy dostępni poprzez GitHub lub na serwerze Discord.", "page-developers-frameworks-desc": "Narzędzia służące przyspieszeniu rozwoju", - "page-developers-frameworks-link": "Ramy rozwojowe", + "page-developers-frameworks-link": "Frameworki programistyczne", "page-developers-fundamentals": "Podstawy", "page-developers-gas-desc": "Ether potrzebny do zasilania transakcji", "page-developers-gas-link": "Paliwo", diff --git a/src/intl/pl/page-gas.json b/src/intl/pl/page-gas.json new file mode 100644 index 00000000000..209bb4b3ba8 --- /dev/null +++ b/src/intl/pl/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Opłaty za gaz na Ethereum: jak działają?", + "page-gas-meta-description": "Dowiedz się o gazie na Ethereum, o tym, jak działa i jak płacić mniejsze opłaty za gaz", + "page-gas-hero-title": "Opłaty za gaz", + "page-gas-hero-header": "Opłaty sieciowe", + "page-gas-hero-button-1-content": "Co to jest gaz?", + "page-gas-hero-subtitle-1": "Opłaty sieciowe w Ethereum nazywane są gazem.", + "page-gas-hero-subtitle-2": "Gaz jest paliwem zasilającym Ethereum.", + "page-gas-summary-title": "Podsumowanie", + "page-gas-summary-item-1": "Każda transakcja na Ethereum wymaga niewielkiej płatności, aby została przetworzona", + "page-gas-summary-item-2": "Te opłaty są znane jako opłata za „gaz”", + "page-gas-summary-item-3": "Opłaty za gaz zmieniają się w zależności od przeciążenia sieci", + "page-gas-what-are-gas-fees-header": "Czym są opłaty za gaz?", + "page-gas-what-are-gas-fees-text-1": "Pomyśl o Ethereum jak o dużej sieci komputerowej, w której ludzie mogą wykonywać zadania, takie jak wysyłanie wiadomości lub uruchamianie programów. Podobnie jak w prawdziwym świecie, zadania te wymagają energii do ich wykonania.", + "page-gas-what-are-gas-fees-text-2": "W Ethereum każde działanie obliczeniowe ma ustaloną cenę „gazu”. Twoje opłaty za gaz to całkowity koszt działań w Twojej transakcji. Kiedy wysyłasz transakcję lub uruchamiasz inteligentny kontrakt, płacisz opłaty za gaz, aby dane działanie zostało przetworzone.", + "page-gas-how-do-i-pay-less-gas-header": "Jak płacić mniej za gaz?", + "page-gas-how-do-i-pay-less-gas-text": "Chociaż wyższe opłaty za Ethereum są czasami nieuniknione, istnieją strategie, których możesz użyć, aby obniżyć koszty:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Planuj czas transakcji", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Podobnie jak podróżowanie poza sezonem wiąże się z mniejszym zatłoczeniem i bardziej przystępnymi cenami, tak Ethereum jest generalnie tańsze w użyciu, gdy Ameryka Północna śpi.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Poczekaj na spadek cen gazu", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Ceny gazu rosną i spadają co dwanaście sekund w zależności od zatłoczenia Ethereum. Gdy ceny gazu są wysokie, odczekanie zaledwie kilku minut przed dokonaniem transakcji może spowodować znaczny spadek ceny.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Używanie warstwy 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Łańcuchy warstwy 2 są zbudowane na Ethereum, oferując niższe opłaty i obsługując więcej transakcji. Są dobrym wyborem, aby zaoszczędzić na opłatach za transakcje, które nie muszą odbywać się w głównej sieci Ethereum.", + "page-gas-try-layer-2": "Wypróbuj warstwę 2", + "page-gas-what-causes-high-gas-fees-header": "Co powoduje wysokie ceny za gaz?", + "page-gas-what-causes-high-gas-fees-text-1": "Gdy tylko ilość obliczeń (gazu) w Ethereum przekroczy określony próg, opłaty za gaz zaczynają rosnąć. Im bardziej gaz przekracza ten próg, tym szybciej rosną opłaty za gaz.", + "page-gas-what-causes-high-gas-fees-text-2": "Wyższe opłaty mogą być spowodowane przez rzeczy takie jak popularne zdecentralizowane aplikacje lub NFT, okresowo zwiększony handel na DEX lub przytłaczającą liczbę aktywności użytkowników w godzinach szczytu.", + "page-gas-what-causes-high-gas-fees-text-3": "Deweloperzy na Ethereum powinni zadbać o optymalizację wykorzystania swoich inteligentnych kontraktów przed ich wdrożeniem. Jeśli wiele osób korzysta ze słabo napisanego inteligentnego kontraktu, będzie on zużywał więcej gazu i może nieumyślnie spowodować przeciążenie sieci.", + "page-gas-want-to-dive-deeper": "Chcesz zagłębić się w temat?", + "page-gas-check-out-the-developer-docs": "Zapoznaj się z dokumentacją dla deweloperów.", + "page-gas-attack-of-the-cryptokitties-header": "Atak Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "W listopadzie 2017 r. wystartował popularny projekt CryptoKitties. Jego gwałtowny wzrost popularności spowodował znaczne przeciążenie sieci i niezwykle wysokie opłaty za gaz. Wyzwania stawiane przez projekt CryptoKitties przyspieszyły pilną potrzebę znalezienia rozwiązań do skalowania Ethereum.", + "page-gas-why-do-we-need-gas-header": "Dlaczego potrzebujemy gazu?", + "page-gas-why-do-we-need-gas-text": "Gaz jest kluczowym elementem zapewniającym bezpieczeństwo Ethereum i przetwarzanie transakcji. Gaz pomaga na wiele sposobów:", + "page-gas-benefits-1-description": "Gaz sprawia, że Ethereum jest odporne na atak Sybil, uniemożliwiając złośliwym podmiotom przeciążanie sieci nieuczciwymi czynnościami.", + "page-gas-benefits-2-description": "Ponieważ obliczenia kosztują gaz, spamowanie Ethereum drogimi transakcjami, zarówno przypadkowo, jak i złośliwie, jest finansowo utrudnione.", + "page-gas-benefits-3-description": "Twardy limit ilości obliczeń, które można wykonać w danym momencie, zapobiega przeciążaniu Ethereum, pomagając zapewnić stałą dostępność sieci.", + "page-gas-how-is-gas-calculated-header": "Jak obliczany jest gaz?", + "page-gas-advanced": "Zaawansowane", + "page-gas-how-is-gas-calculated-text-1": "Całkowita opłata za gaz składa się z kilku części:", + "page-gas-how-is-gas-calculated-item-1": "Opłata podstawowa: opłata ustalana przez sieć, którą należy uiścić za transakcję", + "page-gas-how-is-gas-calculated-item-2": "Opłata priorytetowa: opcjonalny napiwek zachęcający operatorów węzłów do uwzględnienia Twojej transakcji", + "page-gas-how-is-gas-calculated-item-3": "Ilość zużytego gazu*: pamiętasz, jak mówiliśmy, że gaz reprezentuje obliczenia? Bardziej złożone działania, takie jak interakcja z inteligentnym kontraktem, zużywają więcej gazu niż proste, takie jak wysyłanie transakcji.", + "page-gas-how-is-gas-calculated-list-item-1": "* Sprawdź Tabelę 1, aby zobaczyć, ile gazu zużywają różne rodzaje transakcji", + "page-gas-how-is-gas-calculated-text-2": "Wzór na obliczenie opłaty za gaz to: ilość zużytego gazu * (opłata podstawowa + opłata priorytetowa). Większość portfeli oblicza zużycie gazu i wyświetla je w prostszy sposób.", + "page-gas-table-figure": "Tabela 1: Zużycie gazu według rodzaju transakcji", + "page-gas-table-header-1": "Rodzaj transakcji", + "page-gas-table-header-2": "Ilość zużytego gazu", + "page-gas-table-item-1-transaction-type": "Wysyłanie ETH", + "page-gas-table-item-2-transaction-type": "Wysyłanie tokenów ERC-20", + "page-gas-table-item-3-transaction-type": "Transfer NFT", + "page-gas-table-item-4-transaction-type": "Zamiana na Uniswap", + "page-gas-faq-header": "Najczęściej zadawane pytania", + "page-gas-faq-question-1-q": "Kto otrzymuje opłatę za gaz w mojej transakcji?", + "page-gas-faq-question-1-a-1": "Większość opłaty za gaz — opłata podstawowa — jest niszczona (spalana) przez protokół. Opłata priorytetowa, jeśli została uwzględniona w Twojej transakcji, zostanie przekazana walidatorowi, który zaproponował Twoją transakcję.", + "page-gas-faq-question-1-a-2": "Szczegółowy opis tego procesu można znaleźć w dokumentach dla deweloperów gazu.", + "page-gas-faq-question-2-q": "Czy muszę płacić za gaz w ETH?", + "page-gas-faq-question-2-a-1": "Tak. Wszystkie opłaty za gaz w Ethereum muszą być uiszczane w natywnej walucie ETH.", + "page-gas-faq-question-2-a-2": "Więcej na temat ETH", + "page-gas-faq-question-3-q": "Czym jest gwei?", + "page-gas-faq-question-3-a-1": "W większości portfeli lub modułów do śledzenia gazu można zobaczyć ceny gazu wyrażone w „gwei”.", + "page-gas-faq-question-3-a-2": "Gwei to po prostu mniejsza jednostka ETH, podobnie jak grosze dla złotówek, z tą różnicą, że 1 ETH równa się 1 miliardowi gwei. Gwei jest przydatne, gdy mówimy o bardzo małych ilościach ETH.", + "page-gas-use-layer-2": "Używanie warstwy 2" +} diff --git a/src/intl/pl/page-get-eth.json b/src/intl/pl/page-get-eth.json index 772f893c7ad..054937f992c 100644 --- a/src/intl/pl/page-get-eth.json +++ b/src/intl/pl/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Giełdy to firmy, które pozwalają kupować kryptowaluty za pomocą tradycyjnych walut. Mają pieczę nad każdym zakupionym ETH, dopóki nie wyślesz go do portfela, który kontrolujesz.", "page-get-eth-checkout-dapps-btn": "Wypróbuj zdecentralizowane aplikacje", "page-get-eth-community-safety": "Posty społeczności dotyczące bezpieczeństwa", - "page-get-eth-description": "Ethereum i ETH nie są kontrolowane przez żaden rząd ani firmę — są zdecentralizowane. Oznacza to, że ETH jest dostępne dla każdego.", + "page-get-eth-description": "Ethereum nie jest kontrolowane przez żadną pojedynczą organizację — jest zdecentralizowane.", "page-get-eth-dex": "Giełdy zdecentralizowane (DEX)", - "page-get-eth-dex-desc": "Jeśli chcesz mieć większą kontrolę, kup ETH peer-to-peer. Dzięki DEX możesz handlować bez oddawania kontroli nad swoimi środkami scentralizowanej firmie.", + "page-get-eth-dex-desc": "Jeśli chcesz mieć większą kontrolę, kup ETH za pomocą inteligentnych kontraktów. Dzięki DEX możesz handlować cyfrowymi zasobami bez oddawania kontroli nad swoimi środkami scentralizowanej firmie.", + "page-get-eth-peers": "Otrzymuj ETH od innych użytkowników", + "page-get-eth-peers-desc": "Gdy już będziesz mieć konto Ethereum, wystarczy udostępnić swój adres, aby rozpocząć wysyłanie i odbieranie ETH (i innych tokenów) peer-to-peer.", + "page-get-eth-staking": "Nagrody ze stakingu", + "page-get-eth-staking-desc": "Jeśli masz już trochę ETH, możesz zarobić więcej, uruchamiając węzeł walidatora. Otrzymujesz wynagrodzenie w ETH za wykonanie tej pracy weryfikacyjnej.", + "page-get-eth-earn": "Zarób ETH", + "page-get-eth-earn-desc": "Możesz zarabiać ETH, pracując dla DAO lub firm, które płacą w kryptowalutach, wygrywając nagrody, znajdując błędy w oprogramowaniu i nie tylko.", + "page-get-eth-daos-link-desc": "Dowiedz się o DAO", + "page-get-eth-cex-link-desc": "Zobacz listę giełd", + "page-get-eth-staking-link-desc": "Dowiedz się więcej o stakingu", "page-get-eth-dexs": "Giełdy zdecentralizowane (DEX)", "page-get-eth-dexs-desc": "Zdecentralizowane giełdy to otwarte rynki dla ETH i innych tokenów. Łączą bezpośrednio kupujących i sprzedających.", "page-get-eth-dexs-desc-2": "Zamiast korzystać z zaufanej strony trzeciej do zabezpieczenia środków w transakcji, używają kodu. ETH sprzedającego zostanie przeniesiony tylko wtedy, gdy płatność jest gwarantowana. Ten rodzaj kodu jest znany jako inteligentny kontrakt.", - "page-get-eth-dexs-desc-3": "Oznacza to, że istnieje mniej ograniczeń geograficznych niż w przypadku scentralizowanych alternatyw. Jeśli ktoś sprzedaje to, co chcesz, i akceptuje metodę płatności, którą możesz zapewnić, możesz działać. DEX pozwalają kupować ETH za pomocą innych tokenów, PayPala, a nawet osobiście dostarczać gotówkę.", + "page-get-eth-dexs-desc-3": "Oznacza to, że istnieje mniej ograniczeń geograficznych niż w przypadku scentralizowanych alternatyw. Jeśli ktoś sprzedaje to, co chcesz, i akceptuje metodę płatności, którą możesz zapewnić, możesz działać.", "page-get-eth-do-not-copy": "Przykład: Nie kopiuj", "page-get-eth-exchanges-disclaimer": "Zebraliśmy te informacje ręcznie. Jeśli zauważysz, że coś jest nie tak, daj nam znać", - "page-get-eth-exchanges-empty-state-text": "Wprowadź swój kraj zamieszkania, aby zobaczyć listę portfeli i giełd, których możesz użyć do zakupu ETH", + "page-get-eth-exchanges-empty-state-text": "Wprowadź swój kraj zamieszkania, aby zobaczyć listę giełd, z których możesz skorzystać", "page-get-eth-exchanges-except": "Z wyjątkiem", "page-get-eth-exchanges-header": "W jakim kraju mieszkasz?", "page-get-eth-exchanges-header-exchanges": "Giełdy", "page-get-eth-exchanges-header-wallets": "Portfele", - "page-get-eth-exchanges-intro": "Giełdy i portfele mają ograniczenia co do tego, gdzie mogą sprzedawać kryptowalutę.", + "page-get-eth-exchanges-intro": "Giełdy mają ograniczenia dotyczące tego, gdzie mogą sprzedawać kryptowaluty. Jest to orientacyjna lista usług, o których sądzi się, że działają w każdym kraju. Umieszczenie ich tutaj nie stanowi poparcia — należy przeprowadzić własny research!", "page-get-eth-exchanges-no-exchanges": "Przepraszamy, nie znamy żadnej giełdy, która pozwoli Ci kupić ETH w tym kraju. Jeśli zrobisz, powiedz nam na", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Przepraszamy, nie znamy żadnych giełd ani portfeli, które pozwalają Ci kupić ETH w tym kraju. Jeśli to zrobisz, powiedz nam na", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Przepraszamy, nie znamy żadnej giełdy, która pozwoli Ci kupić ETH w tym kraju. Jeśli zrobisz, powiedz nam na", "page-get-eth-exchanges-no-wallets": "Przepraszamy, nie znamy żadnych portfeli, które pozwolą Ci kupić ETH w tym kraju. Jeśli to zrobisz, powiedz nam na", "page-get-eth-exchanges-search": "Wpisz miejsce zamieszkania...", "page-get-eth-exchanges-success-exchange": "Rejestracja na giełdzie może potrwać kilka dni ze względu na ich prawne kontrole.", @@ -36,33 +45,33 @@ "page-get-eth-hero-image-alt": "Pobierz obraz główny ETH", "page-get-eth-keep-it-safe": "Dbanie o bezpieczeństwo ETH", "page-get-eth-meta-description": "Jak kupować ETH w zależności od miejsca zamieszkania i porady, jak się nim zajmować.", - "page-get-eth-meta-title": "Jak kupić ETH", + "page-get-eth-meta-title": "Jak zdobyć ETH", "page-get-eth-need-wallet": "Będziesz potrzebować portfela, aby korzystać ze zdecentralizowanej giełdy.", "page-get-eth-new-to-eth": "ETH jest dla Ciebie nowością? Oto przegląd na początek.", "page-get-eth-other-cryptos": "Kupuj za inne kryptowaluty", - "page-get-eth-protect-eth-desc": "Jeśli planujesz kupić dużo ETH, możesz chcieć trzymać go w portfelu, który kontrolujesz, a nie na giełdzie. To dlatego, że giełda jest prawdopodobnym celem hakerów. Jeśli haker uzyska dostęp, możesz stracić swoje środki. Alternatywnie tylko Ty masz kontrolę nad swoim portfelem.", - "page-get-eth-protect-eth-in-wallet": "Zabezpiecz swój ETH w portfelu", + "page-get-eth-protect-eth-desc": "Jedną z głównych funkcji Ethereum jest to, że użytkownik zachowuje kontrolę nad własnymi aktywami, zarządzając własnym kontem. Oznacza to, że użytkownik nie musi ufać żadnej stronie trzeciej w kwestii swoich aktywów i jest chroniony przed nieuczciwym działaniem, bankructwem lub włamaniem. Oznacza to jednak również, że bierze odpowiedzialność za własne bezpieczeństwo.", + "page-get-eth-protect-eth-in-wallet": "Przechowuj swoje ETH we własnym portfelu", "page-get-eth-search-by-country": "Szukaj według kraju", - "page-get-eth-security": "Ale oznacza to również, że musisz poważnie traktować bezpieczeństwo swoich funduszy. Dzięki ETH nie ufasz bankowi, że zajmie się Twoimi pieniędzmi, ufasz sobie.", + "page-get-eth-security": "Oznacza to, że musisz poważnie traktować bezpieczeństwo swoich środków. Dzięki ETH nie ufasz bankowi lub firmie, że zajmie się Twoimi aktywami, ale bierzesz odpowiedzialność za siebie.", "page-get-eth-smart-contract-link": "Więcej na temat inteligentnych kontraktów", "page-get-eth-swapping": "Zamień swoje tokeny na ETH innych osób. I wzajemnie.", "page-get-eth-try-dex": "Wypróbuj DEX", "page-get-eth-use-your-eth": "Użyj swojego ETH", "page-get-eth-use-your-eth-dapps": "Teraz, gdy jesteś właścicielem ETH, sprawdź niektóre aplikacje Ethereum (aplikacje zdecentralizowane). Istnieją aplikacje dla finansów, mediów społecznościowych, gier i wielu innych kategorii.", "page-get-eth-wallet-instructions": "Postępuj zgodnie z instrukcją portfela", - "page-get-eth-wallet-instructions-lost": "Jeśli utracisz dostęp do swojego portfela, stracisz dostęp do swoich środków. Twój portfel powinien zawierać instrukcje dotyczące ochrony przed tym. Pamiętaj, aby dokładnie ich przestrzegać — w większości przypadków nikt nie może Ci pomóc, jeśli stracisz dostęp do swojego portfela.", + "page-get-eth-wallet-instructions-lost": "Jeśli utracisz dostęp do swojego konta, stracisz dostęp do swoich środków. Twój portfel powinien zawierać instrukcje dotyczące ochrony przed tym. Pamiętaj, aby dokładnie ich przestrzegać — w większości przypadków nikt nie może Ci pomóc, jeśli stracisz dostęp do swojego konta.", "page-get-eth-wallets": "Portfele", "page-get-eth-wallets-link": "Więcej o portfelach", - "page-get-eth-wallets-purchasing": "Niektóre portfele pozwalają na zakup kryptowalut za pomocą karty debetowej/kredytowej, przelew bankowy lub nawet Apple Pay. Zastosowanie mają ograniczenia geograficzne.", - "page-get-eth-warning": "Te DEXy nie są dla początkujących, ponieważ będziesz potrzebować ETH, aby z nich korzystać.", + "page-get-eth-wallets-purchasing": "Niektóre portfele pozwalają na zakup kryptowalut za pomocą karty debetowej/kredytowej, przelewu bankowego lub nawet Apple Pay. Obowiązują ograniczenia geograficzne.", + "page-get-eth-warning": "Te DEX-y nie są przeznaczone dla początkujących, ponieważ do ich używania potrzebne jest trochę ETH. To tylko przykłady, a nie rekomendowane produkty. Przeprowadź własną analizę!", "page-get-eth-what-are-DEX's": "Czym jest DEX?", "page-get-eth-whats-eth-link": "Co to jest ETH?", - "page-get-eth-where-to-buy-desc": "Możesz kupić ETH bezpośrednio z giełd lub z portfeli.", + "page-get-eth-where-to-buy-desc": "Możesz zarabiać ETH, otrzymywać je od innych użytkowników lub kupować je na giełdach i w aplikacjach.", "page-get-eth-where-to-buy-desc-2": "Sprawdź usługi, z których możesz korzystać w miejscu zamieszkania.", "page-get-eth-where-to-buy-title": "Gdzie uzyskać ETH", "page-get-eth-your-address": "Twój adres ETH", "page-get-eth-your-address-desc": "Kiedy pobierzesz portfel, stworzy dla Ciebie publiczny adres ETH. Oto jak wygląda:", - "page-get-eth-your-address-desc-3": "To coś podobnego do adresu e-mail, ale zamiast wysyłać wiadomość, możesz odbierać ETH. Jeśli chcesz przenieść ETH z giełdy do swojego portfela, użyj swojego adresu jako miejsca docelowego. Upewnij się, że zawsze sprawdzasz dokładnie przed wysłaniem!", + "page-get-eth-your-address-desc-3": "Pomyśl o tym, jak o swoim adresie e-mail, ale zamiast poczty, możesz odbierać ETH. Jeśli chcesz przesłać ETH z giełdy do swojego portfela, użyj swojego adresu jako miejsca docelowego. Pamiętaj, aby zawsze dokładnie sprawdzić przed wysłaniem!", "page-get-eth-your-address-wallet-link": "Sprawdź portfele", "listing-policy-raise-issue-link": "Zgłoś problem", "page-find-wallet-last-updated": "Ostatnia aktualizacja" diff --git a/src/intl/pl/page-index.json b/src/intl/pl/page-index.json index b51a9d02ac9..c26b296c986 100644 --- a/src/intl/pl/page-index.json +++ b/src/intl/pl/page-index.json @@ -41,7 +41,7 @@ "page-index-developers-code-example-title-0": "Twój własny bank", "page-index-developers-code-example-description-0": "Możesz stworzyć bank zasilany przez zaprogramowaną przez Ciebie logikę.", "page-index-developers-code-example-title-1": "Twoja własna waluta", - "page-index-developers-code-example-description-1": "Twórz tokeny, które możesz transferować i wykorzystywać w innych aplikacjach.", + "page-index-developers-code-example-description-1": "Twórz tokeny, które możesz przesyłać i wykorzystywać w innych aplikacjach.", "page-index-developers-code-example-title-2": "Portfel JavaScript Ethereum", "page-index-developers-code-example-description-2": "Możesz użyć istniejących języków do interakcji z Ethereum i innymi aplikacjami.", "page-index-developers-code-example-title-3": "Otwarty, niewymagający uprawnień DNS", @@ -50,7 +50,7 @@ "page-index-network-stats-subtitle": "Najnowsze statystyki sieciowe", "page-index-network-stats-total-eth-staked": "Całkowite zestakowane ETH", "page-index-network-stats-eth-price-description": "Cena ETH (USD)", - "page-index-network-stats-eth-price-explainer": "Najnowsza cena za 1 ether. Możesz kupić nawet 0,000000000000001 – nie musisz kupować całego ETH.", + "page-index-network-stats-eth-price-explainer": "Najnowsza cena za 1 ether. Możesz kupić nawet 0,000000000000000001 – nie musisz kupować całego 1 ETH.", "page-index-network-stats-total-eth-staked-explainer": "Całkowita ilość ETH, która jest obecnie stakowana i zabezpiecza sieć.", "page-index-network-stats-tx-day-description": "Dzisiejsze transakcje", "page-index-network-stats-tx-day-explainer": "Liczba pozytywnie przetworzonych transakcji w sieci w ciągu ostatnich 24 godzin.", @@ -64,16 +64,16 @@ "page-index-contribution-banner-image-alt": "Logo ETH wykonane z klocków lego.", "page-index-contribution-banner-button": "Więcej o wsparciu", "page-index-tout-upgrades-title": "Dowiedz się więcej o aktualizacjach", - "page-index-tout-upgrades-description": "Ethereum składa się ze wzajemnie połączonych modernizacji zaprojektowanych tak, aby sieć była bardziej skalowana, bezpieczniejsza i zrównoważona.", - "page-index-tout-upgrades-image-alt": "Ilustracja statku kosmicznego przedstawiającego zwiększoną moc po ulepszeniu Ethereum.", + "page-index-tout-upgrades-description": "Plan działania Ethereum składa się z połączonych ze sobą aktualizacji zaprojektowanych w celu zwiększenia skalowalności, bezpieczeństwa i zrównoważenia sieci.", + "page-index-tout-upgrades-image-alt": "Ilustracja statku kosmicznego przedstawiającego zwiększoną moc po aktualizacji Ethereum.", "page-index-tout-enterprise-title": "Ethereum dla przedsiębiorstw", "page-index-tout-enterprise-description": "Zobacz, w jaki sposób Ethereum może tworzyć nowe modele biznesowe, obniżać koszty i zabezpieczać działalność na potrzeby rozwoju w przyszłości.", "page-index-tout-enterprise-image-alt": "Ilustracja futurystycznego komputera lub urządzenia.", "page-index-tout-community-title": "Społeczność Ethereum", "page-index-tout-community-description": "W Ethereum najważniejsza jest społeczność. Tworzą ją ludzie z wielu środowisk o różnych zainteresowaniach. Zobacz, jak możesz do niej dołączyć.", - "page-index-tout-community-image-alt": "Ilustracja grupy konstruktorów pracujących razem.", + "page-index-tout-community-image-alt": "Ilustracja grupy budowlańców pracujących razem.", "page-index-nft": "Internet zasobów", - "page-index-nft-description": "W Ethereum nie chodzi jedynie o cyfrowe pieniądze. Wszystko, co posiadasz, może być reprezentowane, wymienione lub używane jako niewymienialne tokeny (NFT). Możesz stokenizować swoją sztukę i uzyskać tantiemy za każdym razem, gdy zostanie ona odsprzedana. Albo użyć tokenu do zaciągnięcia pożyczki. Co rusz pojawiają się nowe możliwości.", + "page-index-nft-description": "W Ethereum nie chodzi jedynie o cyfrowe pieniądze. Wszystko, co można posiadać, można reprezentować, handlować i wykorzystywać w postaci niewymienialnych tokenów (NFT). Możesz tokenizować swoją sztukę i automatycznie otrzymywać tantiemy za każdym razem, gdy jest odsprzedawana. Można też użyć tokena do zaciągnięcia pożyczki. Możliwości cały czas rosną.", "page-index-nft-button": "Więcej na temat niewymienialnych tokenów (NFT)", "page-index-nft-alt": "Logo ETH wyświetlane za pomocą hologramu.", "community-events-content-heading": "Dołącz do społeczności ethereum.org", diff --git a/src/intl/pl/page-languages.json b/src/intl/pl/page-languages.json index bd37d65137d..2574043825a 100644 --- a/src/intl/pl/page-languages.json +++ b/src/intl/pl/page-languages.json @@ -12,10 +12,13 @@ "page-languages-want-more-link": "programie tłumaczenia", "page-languages-want-more-paragraph": "Tłumacze ethereum.org zawsze tłumaczą strony na jak najwięcej języków. Aby zobaczyć, nad czym teraz pracują, lub aby się zarejestrować, aby dołączyć do nich, przeczytaj o naszym", "page-languages-filter-placeholder": "Filtr", + "langauge-am": "Amharski", "language-ar": "Arabski", "language-az": "Azerski", + "langauge-be": "Białoruski", "language-bg": "Bułgarski", "language-bn": "Bengali", + "language-bs": "Bośniacki", "language-ca": "Kataloński", "language-cs": "Czeski", "language-da": "Duński", @@ -32,6 +35,7 @@ "language-hi": "Hindi", "language-hr": "Chorwacki", "language-hu": "Węgierski", + "language-hy-am": "Armeński", "language-id": "Indonezyjski", "language-ig": "Igbo", "language-it": "Włoski", @@ -39,12 +43,14 @@ "language-ka": "Gruziński", "language-kk": "Kazachski", "language-km": "Khmerski", + "language-kn": "Kannada", "language-ko": "Koreański", "language-lt": "Litewski", "language-ml": "Malajalam", "language-mr": "Marathi", "language-ms": "Malajski", "language-nb": "Norweski", + "language-ne-np": "Nepalski", "language-nl": "Holenderski", "language-pcm": "Pidżyn nigeryjski", "language-fil": "Filipiński", @@ -58,8 +64,9 @@ "language-sl": "Słoweński", "language-sr": "Serbski", "language-sw": "Suahili", - "language-th": "Tajski", "language-ta": "Tamilski", + "language-th": "Tajski", + "language-tk": "Turkmeński", "language-tr": "Turecki", "language-uk": "Ukraiński", "language-ur": "Urdu", diff --git a/src/intl/pl/page-layer-2.json b/src/intl/pl/page-layer-2.json index 5bf0c4bd08c..a7afb4e69d3 100644 --- a/src/intl/pl/page-layer-2.json +++ b/src/intl/pl/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "zkSync jest platformą rollup zk zorientowaną na użytkownika z Matter Labs. Jest to rozwiązanie skalujące dla Ethereum, już obecne w sieci głównej Ethereum. Obsługuje płatności, wymianę tokenów i kopanie NFT.", "zkspace-description": "Platforma ZKSpace składa się z trzech głównych części: warstwy 2 AMM DEX wykorzystującej technologię pakietów zbiorczych o wiedzy zerowej o nazwie ZKSwap, usługi płatniczej o nazwie ZKSquare oraz rynku NFT o nazwie ZKSea.", "aztec-description": "Aztec Network to pierwszy prywatny zk rollup na Ethereum, umożliwiający zdecentralizowanym aplikacjom dostęp do prywatności i skali.", + "starknet-description": "Starknet to rozwiązanie warstwy 2 walidujących pakietów zbiorczych. Zapewnia wysoką przepustowość, niskie koszty gazu i zachowuje poziom bezpieczeństwa warstwy 1 Ethereum.", "layer-2-note": "Uwaga:", "layer-2-ecosystem-portal": "Portal ekosystemu", "layer-2-token-lists": "Lista tokenów", diff --git a/src/intl/pl/page-learn.json b/src/intl/pl/page-learn.json index 1e3c4fb6e21..75f01097f00 100644 --- a/src/intl/pl/page-learn.json +++ b/src/intl/pl/page-learn.json @@ -11,7 +11,7 @@ "hero-subtitle": "Twój edukacyjny przewodnik po świecie Ethereum. Dowiedz się, jak działa Ethereum i jak się z nim połączyć. Ta strona zawiera techniczne i nietechniczne artykuły, przewodniki i zasoby.", "hero-button-lets-get-started": "Zaczynajmy", "what-is-crypto-1": "Być może słyszałeś o kryptowalutach, blockchainach i Bitcoinie. Poniższe linki pomogą Ci dowiedzieć się, czym one są i w jaki sposób są powiązane z Ethereum.", - "what-is-crypto-2": "Kryptowaluty, takie jak Bitcoin, umożliwiają każdemu przesyłanie pieniędzy na całym świecie. Ethereum również to pozwala, ale może również uruchamiać kod, który umożliwia ludziom tworzenie aplikacji i organizacji. Jest zarówno odporny, jak i elastyczny: każdy program komputerowy może działać na Ethereum. Dowiedz się więcej i zobacz jak zacząć:", + "what-is-crypto-2": "Kryptowaluty, takie jak bitcoin, umożliwiają każdemu przesyłanie pieniędzy na całym świecie. Ethereum również na to pozwala, ale może również uruchamiać kod, który umożliwia ludziom tworzenie aplikacji i organizacji. Jest zarówno odporne, jak i elastyczne: każdy program komputerowy może działać na Ethereum. Dowiedz się więcej i zobacz, jak zacząć:", "what-is-ethereum-card-title": "Co to jest Ethereum?", "what-is-ethereum-card-description": "Jeśli jesteś nowy, zacznij tutaj, aby dowiedzieć się, dlaczego Ethereum ma znaczenie.", "what-is-ethereum-card-image-alt": "Ilustracja osoby przyglądającej się bazarowi, który ma reprezentować Ethereum.", diff --git a/src/intl/pl/page-stablecoins.json b/src/intl/pl/page-stablecoins.json index b0ebfd932ab..761645cdf55 100644 --- a/src/intl/pl/page-stablecoins.json +++ b/src/intl/pl/page-stablecoins.json @@ -4,26 +4,26 @@ "page-stablecoins-accordion-borrow-crypto-collateral-copy-p2": "Ale ponieważ cena ETH jest zmienna, będziesz musiał zawyżać zabezpieczenie. Oznacza to, że jeśli chcesz pożyczyć 100 stabicoinów, prawdopodobnie potrzebujesz co najmniej 150 dolarów ETH. To chroni system i kredytodawców.", "page-stablecoins-accordion-borrow-crypto-collateral-link": "Więcej o stablecoinach zabezpieczonych kryptowalutami", "page-stablecoins-accordion-borrow-pill": "Zaawansowane", - "page-stablecoins-accordion-borrow-places-intro": "Te aplikacje pozwalają pożyczać stablecoiny za pomocą kryptowalut. Niektóre z nich akceptują inne tokeny, jak również ETH.", - "page-stablecoins-accordion-borrow-places-title": "Miejsca do pożyczenia stablecoinów", + "page-stablecoins-accordion-borrow-places-intro": "Te zdecentralizowane aplikacje pozwalają pożyczać stablecoiny za pomocą kryptowalut jako zabezpieczenia. Niektóre z nich akceptują inne tokeny, jak również ETH.", + "page-stablecoins-accordion-borrow-places-title": "Miejsca, w których można pożyczyć stablecoiny", "page-stablecoins-accordion-borrow-requirement-1": "Portfel Ethereum", - "page-stablecoins-accordion-borrow-requirement-1-description": "Będziesz potrzebował portfela aby korzystać z decentralizowanej aplikacji", + "page-stablecoins-accordion-borrow-requirement-1-description": "Będziesz potrzebował portfela, aby korzystać z decentralizowanej aplikacji", "page-stablecoins-accordion-borrow-requirement-2": "Ether (ETH)", "page-stablecoins-accordion-borrow-requirement-2-description": "Będziesz potrzebował ETH do zabezpieczenia i/lub opłat transakcyjnych", "page-stablecoins-accordion-borrow-requirements-description": "Aby pożyczyć stablecoiny, musisz użyć odpowiedniej zdecentralizowanej aplikacji. Będziesz również potrzebował portfela i trochę ETH.", - "page-stablecoins-accordion-borrow-risks-copy": "Jeśli użyjesz ETH jako zabezpieczenia, a jego wartość spadnie, Twoje zabezpieczenie nie pokryje wygenerowanych stablecoinów. Spowoduje to zlikwidowanie ETH i może grozić Ci kara. Więc jeśli pożyczysz stablecoiny, będziesz musiał obserwować cenę ETH.", + "page-stablecoins-accordion-borrow-risks-copy": "Jeśli użyjesz ETH jako zabezpieczenia, a jego wartość spadnie, Twoje zabezpieczenie nie pokryje wygenerowanych stablecoinów. Spowoduje to likwidację Twojego ETH i może grozić Ci kara. Jeśli więc pożyczasz stablecoiny, musisz obserwować cenę ETH.", "page-stablecoins-accordion-borrow-risks-link": "Najnowsza cena ETH", "page-stablecoins-accordion-borrow-risks-title": "Ryzyko", "page-stablecoins-accordion-borrow-text-preview": "Możesz pożyczyć trochę stablecoinów, używając kryptowaluty jako zabezpieczenia, które musisz spłacić.", "page-stablecoins-accordion-borrow-title": "Pożyczaj", "page-stablecoins-accordion-buy-exchanges-title": "Popularne giełdy", - "page-stablecoins-accordion-buy-requirement-1": "Wymiana kryptowalut i portfele", + "page-stablecoins-accordion-buy-requirement-1": "Giełdy kryptowalut i portfele", "page-stablecoins-accordion-buy-requirement-1-description": "Sprawdź usługi, z których możesz korzystać w miejscu zamieszkania", - "page-stablecoins-accordion-buy-requirements-description": "Konto z giełdą lub portfelem, z którego możesz kupić kryptowalutę bezpośrednio. Być może użyłeś już jednego, aby uzyskać trochę ETH. Sprawdź, z jakich usług możesz korzystać w swojej okolicy.", + "page-stablecoins-accordion-buy-requirements-description": "Konto z giełdą lub portfelem, z którego możesz kupić kryptowalutę bezpośrednio. Być może użyłeś już jednego, aby uzyskać trochę ETH. Sprawdź, z jakich usług możesz korzystać w miejscu swojego zamieszkania.", "page-stablecoins-accordion-buy-text-preview": "Wiele giełd i portfeli pozwala kupować stablecoiny bezpośrednio. Obowiązują ograniczenia geograficzne.", "page-stablecoins-accordion-buy-title": "Kup", - "page-stablecoins-accordion-buy-warning": "Scentralizowane giełdy mogą wymieniać tylko stablecoiny wspierane przez pieniądz fiducjarny oparty na złocie, takie jak USDC, Tether i inne. Możesz nie być w stanie ich kupić bezpośrednio, ale powinieneś być w stanie wymienić je na ETH lub inne kryptowaluty, które możesz kupić na platformie.", - "page-stablecoins-accordion-earn-project-1-description": "Głównie prace techniczne dla ruchu oprogramowania open source.", + "page-stablecoins-accordion-buy-warning": "Scentralizowane giełdy mogą zawierać jedynie stablecoiny zabezpieczone pieniądzem fiducjarnym, takie jak USDC, Tether i inne. Możesz nie być w stanie kupić ich bezpośrednio, ale powinieneś być w stanie wymienić je z ETH lub innych kryptowalut, które możesz kupić na platformie.", + "page-stablecoins-accordion-earn-project-1-description": "Głównie prace techniczne dla ruchu oprogramowania open-source.", "page-stablecoins-accordion-earn-project-2-description": "Technologia, treść i inne prace dla społeczności MakerDao (zespół, który przyniósł Ci Dai).", "page-stablecoins-accordion-earn-project-3-description": "Jeśli naprawdę znasz się na rzeczy, znajdź błędy, aby zarobić Dai.", "page-stablecoins-accordion-earn-project-bounties": "Nagrody Gitcoin", @@ -33,41 +33,41 @@ "page-stablecoins-accordion-earn-projects-title": "Gdzie zarabiać stablecoiny", "page-stablecoins-accordion-earn-requirement-1": "Portfel Ethereum", "page-stablecoins-accordion-earn-requirement-1-description": "Będziesz potrzebować portfela, aby otrzymać zarobione stablecoiny", - "page-stablecoins-accordion-earn-requirements-description": "Stablecoiny są świetną metodą płatności za pracę i usługi, ponieważ wartość jest stabilna. Jednak potrzebujesz portfela do zapłaty.", + "page-stablecoins-accordion-earn-requirements-description": "Stablecoiny są świetną metodą płatności za pracę i usługi, ponieważ ich wartość jest stabilna. Jednak potrzebujesz portfela, aby otrzymać zapłatę.", "page-stablecoins-accordion-earn-text-preview": "Możesz zarabiać stablecoiny, pracując nad projektami w ramach ekosystemu Ethereum.", "page-stablecoins-accordion-earn-title": "Zarabiaj", "page-stablecoins-accordion-less": "Mniej", "page-stablecoins-accordion-more": "Więcej", "page-stablecoins-accordion-requirements": "Czego będziesz potrzebować", - "page-stablecoins-accordion-swap-dapp-intro": "Jeśli masz już ETH i portfel, możesz użyć tych aplikacji do wymiany na stablecoiny.", + "page-stablecoins-accordion-swap-dapp-intro": "Jeśli masz już ETH i portfel, możesz użyć tych zdecentralizowanych aplikacji do wymiany na stablecoiny.", "page-stablecoins-accordion-swap-dapp-link": "Więcej na temat zdecentralizowanych giełd", "page-stablecoins-accordion-swap-dapp-title": "Zdecentralizowane aplikacje do wymiany tokenów", "page-stablecoins-accordion-swap-editors-tip": "Wskazówka redaktora", "page-stablecoins-accordion-swap-editors-tip-button": "Znajdź portfel", "page-stablecoins-accordion-swap-editors-tip-copy": "Zdobądź portfel, który pozwoli Ci kupić ETH i zamienić go bezpośrednio na tokeny, w tym na stablecoiny.", - "page-stablecoins-accordion-swap-pill": "Rekomendowane", + "page-stablecoins-accordion-swap-pill": "Zalecane", "page-stablecoins-accordion-swap-requirement-1": "Portfel Ethereum", "page-stablecoins-accordion-swap-requirement-1-description": "Będziesz potrzebował portfela aby autoryzować wymianę i przechowywać swoje monety", "page-stablecoins-accordion-swap-requirement-2": "Ether (ETH)", - "page-stablecoins-accordion-swap-requirement-2-description": "Zapłać za wymianę", + "page-stablecoins-accordion-swap-requirement-2-description": "Aby zapłacić za zamianę", "page-stablecoins-accordion-swap-text-preview": "Większość stablecoinów możesz odebrać na zdecentralizowanych giełdach. Możesz więc zamienić dowolne posiadane tokeny na żądany stablecoin.", "page-stablecoins-accordion-swap-title": "Zamień", "page-stablecoins-algorithmic": "Algorytmicznie", "page-stablecoins-algorithmic-con-1": "Musisz zaufać algorytmowi (lub być w stanie go odczytać).", "page-stablecoins-algorithmic-con-2": "Twoje saldo monet zmieni się w zależności od całkowitej podaży.", - "page-stablecoins-algorithmic-description": "Te stablecoiny nie są wspierane żadnymi innymi aktywami. Zamiast tego algorytm będzie sprzedawał tokeny, jeśli cena spadnie poniżej pożądanej wartości, i dostarczy tokeny, jeśli wartość przekroczy pożądaną kwotę. Ponieważ liczba tych tokenów w obiegu zmienia się regularnie, liczba posiadanych przez Ciebie tokenów będzie się zmieniać, ale zawsze będzie odzwierciedlać Twój udział.", + "page-stablecoins-algorithmic-description": "Te stablecoiny nie są zabezpieczone żadnym innym aktywem. Zamiast tego algorytm sprzedaje tokeny, jeśli cena spadnie poniżej żądanej wartości i dostarcza tokeny, jeśli wartość przekroczy żądaną kwotę. Ponieważ liczba tych tokenów w obiegu zmienia się regularnie, liczba posiadanych przez Ciebie tokenów będzie się zmieniać, ale zawsze będzie odzwierciedlać Twój udział.", "page-stablecoins-algorithmic-pro-1": "Zabezpieczenie nie jest wymagane.", "page-stablecoins-algorithmic-pro-2": "Kontrolowany przez algorytm publiczny.", "page-stablecoins-bank-apy": "0,05%", - "page-stablecoins-bank-apy-source": "Średnia stawka płacona przez banki na podstawie rachunków oszczędnościowych ubezpieczonych federalnie, w USA.", + "page-stablecoins-bank-apy-source": "Średnie oprocentowanie płacone przez banki na podstawowych, ubezpieczonych federalnie kontach oszczędnościowych w USA.", "page-stablecoins-bank-apy-source-link": "Źródło", "page-stablecoins-bitcoin-pizza": "Niesamowita pizza bitcoin", - "page-stablecoins-bitcoin-pizza-body": "W 2010 roku ktoś kupił 2 pizze za 10 000 bitcoinów. W tamtym czasie były one warte ~41 USD. Na dzisiejszym rynku to miliony dolarów. W historii Ethereum jest wiele podobnych żałosnych transakcji. Stablecoins rozwiązują ten problem, dzięki czemu możesz cieszyć się pizzą i trzymać się ETH.", + "page-stablecoins-bitcoin-pizza-body": "W 2010 roku ktoś kupił 2 pizze za 10.000 bitcoinów. W tamtym czasie były one warte ~41 USD. Na dzisiejszym rynku to miliony dolarów. W historii Ethereum jest wiele podobnych, godnych pożałowania transakcji. Stablecoiny rozwiązują ten problem, dzięki czemu możesz cieszyć się pizzą i zachować swoje ETH.", "page-stablecoins-coin-price-change": "Zmiana cen monet (ostatnie 30 dni)", "page-stablecoins-crypto-backed": "Zabezpieczone kryptowalutą", "page-stablecoins-crypto-backed-con-1": "Mniej stabilne niż stablecoiny wspierane przez pieniądz fiducjarny.", "page-stablecoins-crypto-backed-con-2": "Musisz przyglądać się wartości zabezpieczenia kryptowalutą.", - "page-stablecoins-crypto-backed-description": "Te stablecoiny są wspierane przez inne aktywa kryptowalutowe, takie jak ETH. Ich cena zależy od wartości aktywów bazowych (lub zabezpieczenia), które mogą być zmienne. Ponieważ wartość ETH może ulegać wahaniom, te stablecoiny są zabezpieczane, aby zapewnić jak najbardziej stabilną cenę. Oznacza to, że bliższe jest stwierdzenie, że stablecoin wspierany kryptowalutą o wartości 1 USD ma bazowy zasób kryptowalutowy o wartości co najmniej 2 USD. Więc jeśli cena ETH spadnie, więcej ETH musi zostać wykorzystane do wsparcia stablecoina, w przeciwnym razie stablecoiny stracą swoją wartość.", + "page-stablecoins-crypto-backed-description": "Te stablecoiny są zabezpieczone innymi aktywami kryptograficznymi, takimi jak ETH. Ich cena zależy od wartości aktywów bazowych (lub zabezpieczenia), które mogą być zmienne. Ponieważ wartość ETH może się wahać, te stablecoiny są nadmiernie zabezpieczone, aby zapewnić, że cena pozostanie tak stabilna, jak to tylko możliwe. Oznacza to, że stablecoin zabezpieczony kryptowalutą o wartości 1 USD ma bazowe aktywo kryptograficzne o wartości co najmniej 2 USD. Jeśli więc cena ETH spadnie, do zabezpieczenia stablecoina należy użyć więcej ETH, w przeciwnym razie stablecoiny stracą na wartości.", "page-stablecoins-crypto-backed-pro-1": "Przejrzysty i w pełni zdecentralizowany.", "page-stablecoins-crypto-backed-pro-2": "Szybko zamieni się w inne aktywa kryptowalutowe.", "page-stablecoins-crypto-backed-pro-3": "Brak zewnętrznych powierników – wszystkie aktywa są kontrolowane przez konta Ethereum.", @@ -82,7 +82,7 @@ "page-stablecoins-fiat-backed": "Zabezpieczone pieniądzem fiducjarnym", "page-stablecoins-fiat-backed-con-1": "Centralizacja – ktoś musi wydać tokeny.", "page-stablecoins-fiat-backed-con-2": "Wymaga audytu, aby zapewnić posiadanie przez przedsiębiorstwo wystarczających rezerw.", - "page-stablecoins-fiat-backed-description": "Zasadniczo tokeny IOU (I owe you) za tradycyjną walutę fiducjarną (zwykle dolary). Używasz swojej waluty fiducjarnej do zakupu stablecoina, który możesz później spieniężyć i wymienić na oryginalną walutę.", + "page-stablecoins-fiat-backed-description": "Zasadniczo IOU (I owe you) za tradycyjną walutę fiducjarną (zwykle dolary). Używasz swojej waluty fiducjarnej do zakupu stablecoinów, które możesz później spieniężyć i wymienić na oryginalną walutę.", "page-stablecoins-fiat-backed-pro-1": "Bezpieczny przed zmiennością kryptowalut.", "page-stablecoins-fiat-backed-pro-2": "Zmiany w cenie są minimalne.", "page-stablecoins-find-stablecoin": "Znajdź stablecoina", @@ -93,7 +93,7 @@ "page-stablecoins-hero-alt": "Trzy największe stablecoiny według kapitalizacji rynkowej: Dai, USDC i Tether.", "page-stablecoins-hero-button": "Zdobądź stablecoiny", "page-stablecoins-hero-header": "Pieniądze cyfrowe do codziennego użytku", - "page-stablecoins-hero-subtitle": "Stablecoins to tokeny Ethereum zaprojektowane tak, aby utrzymywać stałą wartość, nawet gdy zmienia się cena ETH.", + "page-stablecoins-hero-subtitle": "Stablecoiny to tokeny Ethereum zaprojektowane tak, aby utrzymywać stałą wartość, nawet gdy zmienia się cena ETH.", "page-stablecoins-interest-earning-dapps": "Zdecentralizowane aplikacje przynoszące odsetki", "page-stablecoins-meta-description": "Wprowadzenie do stablecoinów Ethereum: czym są, jak je zdobyć i dlaczego są ważne.", "page-stablecoins-precious-metals": "Metale szlachetne", @@ -102,19 +102,19 @@ "page-stablecoins-precious-metals-description": "Podobnie jak pieniądze fiducjarne oparte na złocie, te stablecoiny wykorzystują zasoby takie jak złoto, aby utrzymać swoją wartość.", "page-stablecoins-precious-metals-pro-1": "Bezpieczny przed zmiennością kryptowalut.", "page-stablecoins-prices": "Ceny stablecoinów", - "page-stablecoins-prices-definition": "Stablecoiny to kryptowaluty bez zmienności. Mają wiele takich samych właściwości jak ETH, ale ich wartość jest stała, bardziej jak tradycyjna waluta. Masz więc dostęp do stabilnych pieniędzy, które możesz wykorzystać na Ethereum. ", + "page-stablecoins-prices-definition": "Stablecoiny to kryptowaluty bez zmienności. Mają wiele takich samych mocy jak ETH, ale ich wartość jest stabilna, bardziej przypomina tradycyjną walutę. Masz więc dostęp do stabilnych pieniędzy, które możesz wykorzystać na Ethereum. ", "page-stablecoins-prices-definition-how": "Jak stablecoiny zyskują stabilność", "page-stablecoins-research-warning": "Ethereum to nowa technologia i większość aplikacji jest nowa. Upewnij się, że jesteś świadomy ryzyka i deponuj tylko tyle, ile możesz stracić.", - "page-stablecoins-research-warning-title": "Zawsze wykonuj własne wyszukiwania", + "page-stablecoins-research-warning-title": "Zawsze przeprowadzaj własne badania", "page-stablecoins-save-stablecoins": "Oszczędzaj za pomocą stablecoinów", "page-stablecoins-save-stablecoins-body": "Stablecoiny często mają ponadprzeciętne oprocentowanie, ponieważ istnieje duże zapotrzebowanie na ich pożyczanie. Istnieją zdecentralizowane aplikacje, które pozwalają zarabiać odsetki na stablecoinach w czasie rzeczywistym, deponując je w puli pożyczek. Podobnie jak w świecie bankowym, dostarczasz tokeny dla pożyczkobiorców, ale w każdej chwili możesz wypłacić swoje tokeny i odsetki.", - "page-stablecoins-saving": "Umieść swoje oszczędności w stablecoinach i zarób trochę odsetek. Jak wszystko w kryptowalutach, przewidywane roczne zyski procentowe (APY) mogą zmieniać się z dnia na dzień w zależności od podaży/popytu w czasie rzeczywistym.", + "page-stablecoins-saving": "Wykorzystaj swoje oszczędności w stablecoinach i zarób trochę odsetek. Jak wszystko w kryptowalutach, przewidywane roczne zyski procentowe (APY) mogą zmieniać się z dnia na dzień w zależności od podaży/popytu w czasie rzeczywistym.", "page-stablecoins-stablecoins-dapp-callout-description": "Sprawdź zdecentralizowane aplikacje Ethereum – stablecoiny są często bardziej przydatne do codziennych transakcji.", "page-stablecoins-stablecoins-dapp-callout-image-alt": "Ilustracja pieseła.", "page-stablecoins-stablecoins-dapp-callout-title": "Użyj swoich stablecoinów", "page-stablecoins-stablecoins-dapp-description-1": "Rynki dla wielu stablecoinów, w tym Dai, USDC, TUSD, USDT i innych. ", "page-stablecoins-stablecoins-dapp-description-2": "Pożyczaj stablecoiny i zarabiaj odsetki oraz $COMP, własny token Compound.", - "page-stablecoins-stablecoins-dapp-description-3": "Platforma handlowa, na której możesz zarabiać na swoich Dai i USDC.", + "page-stablecoins-stablecoins-dapp-description-3": "Platforma handlowa, na której możesz zarabiać odsetki od swoich Dai i USDC.", "page-stablecoins-stablecoins-dapp-description-4": "Aplikacja zaprojektowana do oszczędzania Dai.", "page-stablecoins-stablecoins-feature-1": "Stablecoiny są globalne i można je wysyłać przez Internet. Łatwo je otrzymać lub wysłać, gdy masz konto Ethereum.", "page-stablecoins-stablecoins-feature-2": "Popyt na stablecoiny jest wysoki, więc możesz zarabiać odsetki za pożyczanie swoich. Upewnij się, że jesteś świadomy ryzyka przed pożyczeniem.", @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "Waluta fiducjarna", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "Metale szlachetne", "page-stablecoins-table-error": "Nie udało się wczytać stablecoinów. Spróbuj odświeżyć stronę.", + "page-stablecoins-table-loading": "Ładowanie danych stablecoina...", "page-stablecoins-title": "Stablecoiny", "page-stablecoins-top-coins": "Najlepsze stablecoiny według kapitalizacji rynkowej", "page-stablecoins-top-coins-intro": "Kapitalizacja rynkowa to", diff --git a/src/intl/pl/page-staking.json b/src/intl/pl/page-staking.json index 0a2e60ece67..6090d278f3c 100644 --- a/src/intl/pl/page-staking.json +++ b/src/intl/pl/page-staking.json @@ -23,7 +23,7 @@ "page-staking-benefits-1-description": "Nagrody są przyznawane za działania, które pomagają sieci osiągnąć konsensus. Zostaniesz wynagrodzony za uruchomienie oprogramowania, które prawidłowo grupuje transakcje w nowe bloki i sprawdza pracę innych walidatorów, ponieważ dzięki temu łańcuch działa bezpiecznie.", "page-staking-benefits-2-title": "Lepsze bezpieczeństwo", "page-staking-benefits-2-description": "Sieć staje się silniejsza przed atakami w miarę stakowania większej ilości ETH, ponieważ wymaga wtedy więcej ETH do kontrolowania większości sieci. Aby stać się zagrożeniem, musiałbyś posiadać większość walidatorów, co oznacza, że musiałbyś kontrolować większość ETH w systemie — to dużo!", - "page-staking-benefits-3-title": "Bardziej zrównoważony", + "page-staking-benefits-3-title": "Większe zrównoważenie", "page-staking-benefits-3-description": "Stakerzy nie muszą wykonywać energochłonnych obliczeń proof-of-work, aby uczestniczyć w zabezpieczaniu sieci, co oznacza, że węzły stakujące mogą działać na stosunkowo skromnym sprzęcie, zużywając bardzo mało energii.", "page-staking-benefits-3-link": "Więcej o zużyciu energii przez Ethereum", "page-staking-description": "Staking to akt zdeponowania 32 ETH w celu aktywacji oprogramowania walidatora. Jako walidator będziesz odpowiedzialny za przechowywanie danych, przetwarzanie transakcji i dodawanie nowych bloków do blockchainu. Dzięki temu Ethereum będzie bezpieczne dla wszystkich, a przy okazji zarobisz nowe ETH.", diff --git a/src/intl/pl/page-wallets-find-wallet.json b/src/intl/pl/page-wallets-find-wallet.json index 13e4c6fe684..124da75e16d 100644 --- a/src/intl/pl/page-wallets-find-wallet.json +++ b/src/intl/pl/page-wallets-find-wallet.json @@ -1,16 +1,16 @@ { "page-find-wallet-clear": "Wyczyść filtry", - "page-find-wallet-desc-2": "Wybierz więc portfel w oparciu o żądane funkcje.", + "page-find-wallet-desc-2": "Wybierz więc portfel w oparciu o funkcje, których potrzebujesz.", "page-find-wallet-description": "Portfele mają wiele opcjonalnych funkcji, które mogą Ci się spodobać.", "page-find-wallet-last-updated": "Ostatnia aktualizacja", - "page-find-wallet-meta-description": "Znajdź i porównaj portfele Ethereum w oparciu o pożądane funkcje.", + "page-find-wallet-meta-description": "Znajdź i porównaj portfele Ethereum w oparciu o funkcje, których potrzebujesz.", "page-find-wallet-meta-title": "Znajdź portfel Ethereum", "page-find-wallet-title": "Znajdź portfel", "page-find-wallet-try-removing": "Spróbuj usunąć jedną lub dwie funkcje", "page-find-wallet-choose-to-compare": "Wybierz, aby porównać", "page-stake-eth": "Stakuj ETH", "page-find-wallet-open-source": "Otwarte źródło", - "page-find-wallet-open-source-desc": "Oprogramowanie open-source pozwala każdemu kontrolować integralność i zabezpieczenia aplikacji", + "page-find-wallet-open-source-desc": "Oprogramowanie open-source pozwala każdemu kontrolować uczciwość i bezpieczeństwo aplikacji", "page-find-wallet-self-custody": "Samodzielny nadzór", "page-find-wallet-non-custodial": "Niepowiernicze", "page-find-wallet-non-custodial-desc": "Portfele niekontrolujące Twoich kluczy prywatnych", @@ -29,9 +29,9 @@ "page-find-wallet-swaps": "Zamiany", "page-find-wallet-swaps-desc": "Zamiana tokenów ERC-20 bezpośrednio w portfelu", "page-find-wallet-layer-2": "Warstwa 2", - "page-find-wallet-layer-2-desc": "Portfele obsługujące warstwę 2s Ethereum", + "page-find-wallet-layer-2-desc": "Portfele obsługujące warstwę 2 Ethereum", "page-find-wallet-gas-fee-customization": "Dostosowanie opłat za gaz", - "page-find-wallet-gas-fee-customization-desc": "Personalizacja swoich ilości gazu (opłaty bazowej, priorytetowej i maksymalnej)", + "page-find-wallet-gas-fee-customization-desc": "Personalizuj swoje ilości gazu (opłaty bazowej, priorytetowej i maksymalnej)", "page-find-wallet-ens-support": "Obsługa ENS", "page-find-wallet-ens-support-desc": "Portfele obsługujące Ethereum Name Service (ENS)", "page-find-wallet-token-importing": "Importowanie tokenów", @@ -78,10 +78,10 @@ "page-find-wallet-filters": "Filtry", "page-find-wallet-active": "aktywny", "page-find-wallet-profile-filters": "Filtry profilów", - "page-find-wallet-feature-filters": "Filtry cech", + "page-find-wallet-feature-filters": "Filtry funkcji", "page-find-wallet-footnote-1": "Wyszczególnienie portfeli na tej stronie nie stanowi ich oficjalnej aprobaty i portfele te podano wyłącznie do celów informacyjnych.", "page-find-wallet-footnote-2": "Ich opisy zostały dostarczone przez projekty portfelowe.", - "page-find-wallet-footnote-3": "Produkty dodajemy do tej strony na podstawie kryteriów określonych w naszych zasadach . Jeśli chcesz, abyśmy dodali jakiś portfel, prześlij zgłoszenie w GitHub.", + "page-find-wallet-footnote-3": "Produkty dodajemy do tej strony na podstawie kryteriów określonych w naszych zasadach . Jeśli chcesz, abyśmy dodali jakiś portfel, prześlij zgłoszenie w GitHub.", "page-find-wallet-mobile": "Mobilny", "page-find-wallet-mobile-desc": "Portfele z aplikacjami mobilnymi", "page-find-wallet-desktop": "Desktopowe", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Portfele z rozszerzeniami przeglądarki", "page-find-wallet-device": "Urządzenie", "page-find-choose-to-compare": "Wybierz, aby porównać", - "page-find-wallet-choose-features": "Wybierz funkcje" + "page-find-wallet-choose-features": "Wybierz funkcje", + "page-find-wallet-reset-filters": "Zresetuj filtry" } diff --git a/src/intl/pl/page-wallets.json b/src/intl/pl/page-wallets.json index 9b106b847c5..a35c25785ca 100644 --- a/src/intl/pl/page-wallets.json +++ b/src/intl/pl/page-wallets.json @@ -13,29 +13,29 @@ "page-wallets-desc-3": "Twój portfel jest narzędziem do interakcji z kontem Ethereum. Oznacza to, że w każdej chwili możesz zmieniać dostawców portfeli. Wiele portfeli umożliwia również zarządzanie kilkoma kontami Ethereum z jednej aplikacji.", "page-wallets-desc-4": "Dostawcy portfeli nie mają dostępu do Twoich środków. Zapewniają jedynie okno do przeglądania aktywów na Ethereum i narzędzia do łatwego zarządzania nimi.", "page-wallets-description": "Portfele Ethereum to aplikacje, które dają kontrolę nad kontem. Podobnie jak fizyczny portfel, zawierają wszystko, czego potrzebujesz, aby potwierdzić swoją tożsamość i obsługiwać swoje aktywa. Portfel umożliwia logowanie się do aplikacji, odczytywanie salda, wysyłanie transakcji i weryfikację tożsamości.", - "page-wallets-desktop": "Aplikacje stacjonarne, jeśli wolisz zarządzać środkami za pośrednictwem MacOS, Windows lub linux", + "page-wallets-desktop": "Aplikacje komputerowe, jeśli wolisz zarządzać środkami za pośrednictwem MacOS, Windows lub Linux", "page-wallets-ethereum-wallet": "Portfel jest narzędziem, które pozwala Ci zarządzać Twoim kontem Ethereum przy użyciu kluczy. Umożliwia on wyświetlanie salda konta, wysyłanie transakcji i wiele więcej.", "page-wallets-explore": "Odkryj Ethereum", "page-wallets-features-desc": "Możemy pomóc Ci wybrać Twój portfel w oparciu o funkcje, których potrzebujesz.", "page-wallets-features-title": "Porównaj portfele na podstawie funkcji", "page-wallets-find-wallet-btn": "Znajdź portfel", "page-wallets-find-wallet-link": "Znajdź portfel", - "page-wallets-get-some": "Weź trochę ETH", + "page-wallets-get-some": "Zdobądź trochę ETH", "page-wallets-get-some-alt": "Ilustracja przedstawiająca dłoń tworzącą logo ETH z klocków lego", "page-wallets-get-some-btn": "Weź trochę ETH", "page-wallets-get-some-desc": "ETH to natywna kryptowaluta Ethereum. Aby korzystać z aplikacji Ethereum, będziesz potrzebować trochę ETH w portfelu.", "page-wallets-how-to-store": "Jak przechowywać aktywa cyfrowe na Ethereum", "page-wallets-keys-to-safety": "Klucze do zachowania bezpieczeństwa kryptowalut", "page-wallets-manage-funds": "Aplikacja do zarządzania Twoimi środkami", - "page-wallets-manage-funds-desc": "Twój portfel pokazuje salda, historię transakcji i umożliwia wysyłanie / otrzymywanie środków. Niektóre portfele mogą oferować więcej.", + "page-wallets-manage-funds-desc": "Twój portfel pokazuje salda, historię transakcji i umożliwia wysyłanie/otrzymywanie środków. Niektóre portfele mogą oferować więcej.", "page-wallets-meta-description": "Co musisz wiedzieć, aby korzystać z portfeli Ethereum.", "page-wallets-meta-title": "Portfele Ethereum", "page-wallets-mobile": "Aplikacje mobilne, dzięki którym Twoje środki są dostępne z dowolnego miejsca", "page-wallets-more-on-dapps-btn": "Więcej na temat aplikacji zdecentralizowanych", "page-wallets-most-wallets": "Większość portfeli umożliwia wygenerowanie konta Ethereum. Więc nie potrzebujesz go przed pobraniem portfela.", "page-wallets-protecting-yourself": "Chroń siebie i swoje fundusze", - "page-wallets-seed-phrase": "Zapisz swoją frazę seed", - "page-wallets-seed-phrase-desc": "Portfele często zawierają frazę seed, którą musisz zapisać w bezpiecznym miejscu. Tylko w ten sposób odzyskasz swój portfel.", + "page-wallets-seed-phrase": "Zapisz swoją frazę ziarna", + "page-wallets-seed-phrase-desc": "Portfele często zawierają frazę ziarna, którą musisz zapisać w bezpiecznym miejscu. Tylko w ten sposób odzyskasz swój portfel.", "page-wallets-seed-phrase-example": "Tutaj jest przykład:", "page-wallets-seed-phrase-snippet": "there aeroplane curve vent formation doge possible product distinct under spirit lamp", "page-wallets-seed-phrase-write-down": "Nie przechowuj go na komputerze. Zapisz go i przechowuj w bezpiecznym miejscu.", @@ -54,12 +54,12 @@ "page-wallets-try-dapps-alt": "Ilustracja przedstawiająca współpracujących ze sobą członków społeczności Ethereum", "page-wallets-try-dapps-desc": "Aplikacje zdecentralizowane (dapps) są aplikacjami zbudowanymi na Ethereum. Są tańsze, bardziej sprawiedliwe i bardziej przyjazne dla Twoich danych niż większość tradycyjnych aplikacji.", "page-wallets-types": "Typy portfeli", - "page-wallets-types-desc": "Istnieje kilka sposobów na interfejs i interakcję z kontem:", - "page-wallets-web-browser": "Portfele przeglądarki to aplikacje internetowe, które pozwalają na interakcję z kontem bezpośrednio w przeglądarce", + "page-wallets-types-desc": "Istnieje kilka sposobów łączenia się i interakcji z kontem:", + "page-wallets-web-browser": "Portfele przeglądarkowe to aplikacje internetowe, które pozwalają na interakcję z kontem bezpośrednio w przeglądarce", "page-wallets-web-browser-extension": "Portfele rozszerzeń przeglądarki to pobierane rozszerzenia, które pozwalają na interakcję z kontem i aplikacjami przez przeglądarkę", "page-wallets-whats-a-wallet": "Czym jest portfel Ethereum?", "page-wallets-your-ethereum-account": "Twoje konto Ethereum", - "page-wallets-your-ethereum-account-desc": "Twój portfel to okno na konto Ethereum - Twoje saldo konta, historia transakcji i inne. Możesz jednak zmienić dostawców portfela w dowolnym momencie.", + "page-wallets-your-ethereum-account-desc": "Twój portfel to okno na konto Ethereum — saldo, historię transakcji i nie tylko. Możesz jednak zmienić dostawcę portfela w dowolnym momencie.", "page-wallets-your-login": "Twój login dla aplikacji Ethereum", "page-wallets-your-login-desc": "Twój portfel pozwala Ci połączyć się z aplikacją przy użyciu konta Ethereum. Jest to jak login, którego możesz używać w wielu aplikacjach.", "additional-reading-how-to-create-an-ethereum-account": "Jak stworzyć konto Ethereum", From d4ce7267b714f659af5b26d0568ce786ea70bc35 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 18 Jan 2024 17:28:53 -0700 Subject: [PATCH 043/478] Portuguese Brazilian import (Homepage, Essential pages, Roadmap, Community, Foundational docs, Foundational docs - nodes and clients, Foundational docs - proof-of-stake, Foundational docs - proof-of-work, Smart contracts - basics, Smart contracts - advanced, Whitepaper, Advanced docs - scaling, Research pages, Misc, Contributing, Tutorials I, Tutorials II, Tutorials III, Tutorials IV) --- .../content/translations/pt-br/about/index.md | 6 +- .../pt-br/community/code-of-conduct/index.md | 2 +- .../pt-br/community/get-involved/index.md | 2 +- .../pt-br/community/grants/index.md | 18 +- .../community/language-resources/index.md | 2 +- .../pt-br/community/online/index.md | 10 +- .../pt-br/community/research/index.md | 7 +- .../pt-br/community/support/index.md | 18 +- .../adding-desci-projects/index.md | 2 +- .../adding-developer-tools/index.md | 2 +- .../contributing/adding-exchanges/index.md | 2 +- .../adding-glossary-terms/index.md | 2 +- .../contributing/adding-layer-2s/index.md | 2 +- .../contributing/adding-products/index.md | 4 +- .../adding-staking-products/index.md | 31 +- .../contributing/content-resources/index.md | 2 +- .../contributing/design-principles/index.md | 2 +- .../design/adding-design-resources/index.md | 67 + .../pt-br/contributing/design/index.md | 77 + .../translations/pt-br/contributing/index.md | 28 +- .../pt-br/contributing/quizzes/index.md | 62 + .../translation-program/faq/index.md | 4 +- .../how-to-translate/index.md | 4 +- .../contributing/translation-program/index.md | 6 +- .../translation-program/resources/index.md | 2 +- .../translators-guide/index.md | 32 +- .../pt-br/developers/docs/blocks/index.md | 14 +- .../pos/block-proposal/index.md | 2 +- .../docs/consensus-mechanisms/pos/index.md | 2 +- .../docs/consensus-mechanisms/pow/index.md | 2 +- .../consensus-mechanisms/pow/mining/index.md | 2 +- .../dagger-hashimoto/index.md | 2 +- .../mining/mining-algorithms/ethash/index.md | 2 +- .../pt-br/developers/docs/dapps/index.md | 4 +- .../patricia-merkle-trie/index.md | 10 +- .../data-structures-and-encoding/rlp/index.md | 6 +- .../data-structures-and-encoding/ssz/index.md | 2 +- .../web3-secret-storage-definition/index.md | 14 +- .../pt-br/developers/docs/evm/index.md | 3 +- .../developers/docs/evm/opcodes/index.md | 308 ++-- .../pt-br/developers/docs/gas/index.md | 6 +- .../developers/docs/networking-layer/index.md | 4 +- .../network-addresses/index.md | 2 +- .../networking-layer/portal-network/index.md | 82 + .../pt-br/developers/docs/networks/index.md | 23 +- .../nodes-and-clients/archive-nodes/index.md | 2 +- .../client-diversity/index.md | 2 +- .../docs/nodes-and-clients/index.md | 1 + .../nodes-and-clients/run-a-node/index.md | 2 +- .../pt-br/developers/docs/scaling/index.md | 36 +- .../docs/scaling/optimistic-rollups/index.md | 4 +- .../developers/docs/scaling/plasma/index.md | 9 +- .../docs/scaling/sidechains/index.md | 2 +- .../developers/docs/scaling/validium/index.md | 2 +- .../docs/scaling/zk-rollups/index.md | 16 +- .../docs/smart-contracts/anatomy/index.md | 2 +- .../docs/smart-contracts/compiling/index.md | 2 +- .../smart-contracts/composability/index.md | 4 +- .../docs/smart-contracts/deploying/index.md | 23 +- .../formal-verification/index.md | 16 +- .../developers/docs/smart-contracts/index.md | 17 +- .../docs/smart-contracts/languages/index.md | 2 +- .../docs/smart-contracts/libraries/index.md | 9 +- .../docs/smart-contracts/security/index.md | 14 +- .../docs/smart-contracts/testing/index.md | 306 ++-- .../docs/smart-contracts/upgrading/index.md | 165 ++ .../docs/smart-contracts/verifying/index.md | 107 ++ .../developers/docs/transactions/index.md | 2 +- .../index.md | 72 +- .../tutorials/all-you-can-cache/index.md | 867 ++++++++++ .../create-and-deploy-a-defi-app/index.md | 481 +++++ .../index.md | 99 ++ .../index.md | 163 ++ .../index.md | 127 ++ .../erc-721-vyper-annotated-code/index.md | 632 +++++++ .../tutorials/erc20-annotated-code/index.md | 796 +++++++++ .../erc20-with-safety-rails/index.md | 213 +++ .../index.md | 154 ++ .../index.md | 105 ++ .../index.md | 1540 +++++++++++++++++ .../hello-world-smart-contract/index.md | 55 +- .../index.md | 149 ++ .../tutorials/how-to-mint-an-nft/index.md | 19 +- .../index.md | 106 ++ .../index.md | 693 ++++++++ .../index.md | 514 ++++++ .../index.md | 238 +++ .../how-to-use-tellor-as-your-oracle/index.md | 84 + .../how-to-view-nft-in-metamask/index.md | 12 +- .../how-to-write-and-deploy-an-nft/index.md | 46 +- .../index.md | 177 ++ .../index.md | 110 ++ .../index.md | 272 +++ .../logging-events-smart-contracts/index.md | 66 + .../index.md | 241 +++ .../index.md | 147 ++ .../developers/tutorials/nft-minter/index.md | 874 ++++++++++ .../index.md | 1277 ++++++++++++++ .../reverse-engineering-a-contract/index.md | 744 ++++++++ .../tutorials/run-node-raspberry-pi/index.md | 293 ++-- .../secure-development-workflow/index.md | 56 + .../tutorials/send-token-etherjs/index.md | 212 +++ .../index.md | 206 +++ .../index.md | 94 + .../developers/tutorials/short-abi/index.md | 550 ++++++ .../index.md | 94 + .../index.md | 194 +++ .../index.md | 1138 ++++++++++++ .../index.md | 313 ++++ .../token-integration-checklist/index.md | 84 + .../index.md | 13 +- .../index.md | 2 +- .../uniswap-v2-annotated-code/index.md | 44 +- .../tutorials/using-websockets/index.md | 249 +++ .../index.md | 298 ++++ .../index.md | 202 +++ .../index.md | 203 +++ .../tutorials/yellow-paper-evm/index.md | 264 +++ .../translations/pt-br/enterprise/index.md | 2 + .../enterprise/private-ethereum/index.md | 1 + .../translations/pt-br/foundation/index.md | 2 +- .../roadmap/account-abstraction/index.md | 6 +- .../translations/pt-br/roadmap/index.md | 4 +- .../roadmap/single-slot-finality/index.md | 2 +- .../pt-br/roadmap/statelessness/index.md | 4 +- .../translations/pt-br/whitepaper/index.md | 15 +- src/intl/pt-br/common.json | 29 +- src/intl/pt-br/page-about.json | 11 +- src/intl/pt-br/page-bug-bounty.json | 24 +- src/intl/pt-br/page-developers-tutorials.json | 3 +- src/intl/pt-br/page-gas.json | 64 + src/intl/pt-br/page-get-eth.json | 45 +- src/intl/pt-br/page-upgrades-index.json | 106 +- src/intl/pt-br/page-wallets-find-wallet.json | 11 +- src/intl/pt-br/page-wallets.json | 10 +- src/intl/pt-br/page-what-is-ethereum.json | 8 +- src/scripts/crowdin-import.ts | 2 +- 137 files changed, 16615 insertions(+), 947 deletions(-) create mode 100644 public/content/translations/pt-br/contributing/design/adding-design-resources/index.md create mode 100644 public/content/translations/pt-br/contributing/design/index.md create mode 100644 public/content/translations/pt-br/contributing/quizzes/index.md create mode 100644 public/content/translations/pt-br/developers/docs/networking-layer/portal-network/index.md create mode 100644 public/content/translations/pt-br/developers/docs/smart-contracts/upgrading/index.md create mode 100644 public/content/translations/pt-br/developers/docs/smart-contracts/verifying/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/all-you-can-cache/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/create-and-deploy-a-defi-app/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/deploying-your-first-smart-contract/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/eip-1271-smart-contract-signatures/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/erc20-with-safety-rails/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/guide-to-smart-contract-security-tools/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/how-to-implement-an-erc721-market/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/interact-with-other-contracts-from-solidity/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/logging-events-smart-contracts/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/nft-minter/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/send-token-etherjs/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/short-abi/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/smart-contract-security-guidelines/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/token-integration-checklist/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/using-websockets/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md create mode 100644 public/content/translations/pt-br/developers/tutorials/yellow-paper-evm/index.md create mode 100644 src/intl/pt-br/page-gas.json diff --git a/public/content/translations/pt-br/about/index.md b/public/content/translations/pt-br/about/index.md index 7b62188d139..f10686f3eaf 100644 --- a/public/content/translations/pt-br/about/index.md +++ b/public/content/translations/pt-br/about/index.md @@ -94,7 +94,7 @@ Para tornar nosso trabalho mais acessível e fomentar mais colaboração comunit **O que você acha disso?** Nós sempre agradecemos o feedback sobre nosso roadmap — se houver algo em que você acha que deveríamos melhorar, por favor nos avise! Agradecemos o envio de ideias e PRs (pull requests) de qualquer pessoa da comunidade. -**Quer se envolver?** [Saiba mais sobre como contribuir](/contributing/), [visite-nos no Twitter](https://twitter.com/ethdotorg) ou junte-se às discussões da comunidade em [nosso servidor Discord](https://discord.gg/ethereum-org). +**Quer se envolver?** [Saiba mais sobre como contribuir](/contributing/), [visite-nos no Twitter](https://twitter.com/ethdotorg) ou junte-se às discussões da comunidade em [nosso servidor Discord](https://discord.gg/CetY6Y4). ## Princípios de design {#design-principles} @@ -104,7 +104,7 @@ Nós usamos um conjunto de [princípios de design](/contributing/design-principl Construímos e lançamos um [sistema de design](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) para enviar funcionalidades mais rapidamente e permitir que os membros da comunidade participem do design aberto do ethereum.org. -Quer se envolver?[Acompanhe no Figma](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), [assuntos no GitHub](https://github.com/ethereum/ethereum-org-website/issues/6284) e junte-se à conversa em nosso [canal #design no Discord](https://discord.gg/ethereum-org). +Quer se envolver?[Acompanhe no Figma](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), [assuntos no GitHub](https://github.com/ethereum/ethereum-org-website/issues/6284) e junte-se à conversa em nosso [canal #design no Discord](https://discord.gg/bKycYhVUwV). ## Guia de estilo {#style-guide} @@ -118,6 +118,6 @@ Agradecemos seus comentários sobre nossos princípios de design, sistema de des Embora este site seja de código aberto e qualquer um possa trabalhar nele, temos uma equipe dedicada ao ethereum.org e outros projetos web da Ethereum Foundation. -Publicaremos qualquer vaga de emprego aqui. Se você não encontrar uma vaga aqui para você, acesse [nosso servidor do Discord](https://discord.gg/ethereum-org) e nos conte como gostaria de trabalhar conosco! +Publicaremos qualquer vaga de emprego aqui. Se você não encontrar uma vaga aqui para você, acesse [nosso servidor do Discord](https://discord.gg/CetY6Y4) e nos conte como gostaria de trabalhar conosco! Procurando algo além da equipe do ethereum.org? [Confira outros trabalhos relacionados ao Ethereum](/community/get-involved/#ethereum-jobs/). diff --git a/public/content/translations/pt-br/community/code-of-conduct/index.md b/public/content/translations/pt-br/community/code-of-conduct/index.md index 86f60aaa7f5..97f86892aa1 100644 --- a/public/content/translations/pt-br/community/code-of-conduct/index.md +++ b/public/content/translations/pt-br/community/code-of-conduct/index.md @@ -52,7 +52,7 @@ Exemplos de comportamento inaceitável por parte dos participantes incluem: - Violência física, ameaça de violência física ou incentivo à violência física de qualquer tipo - Usar linguagem ou imagens sexualizadas ou impor atenção sexual indesejada -- Fazer-se passar por outra pessoa ou reivindicar, de forma desonesta, afiliação a alguma pessoa ou organização. +- Fazer-se passar por outra pessoa ou reivindicar, de forma desonesta, afiliação a alguma pessoa ou organização - Brincadeiras de mau gosto, comentários ofensivos/pejorativos e ataques pessoais ou políticos - Assediar outros membros da comunidade em canais públicos ou privados - Publicar informações privadas de outras pessoas, como endereço físico ou eletrônico, sem permissão explícita diff --git a/public/content/translations/pt-br/community/get-involved/index.md b/public/content/translations/pt-br/community/get-involved/index.md index ae0f42d6c1b..800711d9be5 100644 --- a/public/content/translations/pt-br/community/get-involved/index.md +++ b/public/content/translations/pt-br/community/get-involved/index.md @@ -28,7 +28,7 @@ Você tem formação em matemática, criptografia ou economia? Talvez tenha inte - Escreva ou avalie uma proposta de melhoria do Ethereum (EIP) - Escreva uma EIP 1. Envie a sua ideia em [Ethereum Magicians](https://ethereum-magicians.org) - 2. Leia a [EIP-1](https://eip.ethereum.org/EIPS/eip-1) - **Sim, esse é o documento _na íntegra_.** + 2. Leia a [EIP-1](https://eips.ethereum.org/EIPS/eip-1) - **Sim, esse é o documento _na íntegra_.** 3. Siga as orientações estabelecidas na EIP-1. Consulte-a ao redigir a sua versão preliminar. - Saiba como se tornar um [editor de EIP](https://eips.ethereum.org/EIPS/eip-5069) - Você pode fazer a revisão por pares de EIPs agora mesmo! Consulte os [PRs abertos com a tag `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Envie feedback técnico por meio do link `discussion-to`. diff --git a/public/content/translations/pt-br/community/grants/index.md b/public/content/translations/pt-br/community/grants/index.md index e854cc23703..9c95ed0a19c 100644 --- a/public/content/translations/pt-br/community/grants/index.md +++ b/public/content/translations/pt-br/community/grants/index.md @@ -15,31 +15,27 @@ Esta página é administrada por nossa comunidade. Se houver algo faltando ou er Esses programas abrangem um amplo ecossistema Ethereum ao oferecer recompensas a um grande escopo de projetos. Eles incluem soluções de dimensionamento, formação de comunidades, segurança, privacidade e muito mais. Essas recompensas não são específicas de nenhuma plataforma Ethereum e são um bom lugar para começar se você não tiver certeza. - [ Programa de suporte ao ecossistema EF](https://esp.ethereum.foundation)-_ Financiar projetos de código aberto que beneficiam o Ethereum, com foco particular em ferramentas universais, infraestrutura, pesquisa e bens públicos _ -- [ Ethereum RFP](https://github.com/ethereum/requests-for-proposals)-_ Solicitações de propostas da Fundação Ethereum para trabalho e projetos no seu ecossistema_ - [MetaCartel](https://www.metacartel.org/grants/) – _Desenvolvimento de Dapp, criação de DAO_ - [Moloch DAO](https://www.molochdao.com/) – _Privacidade, dimensionamento da camada 2, segurança do cliente e mais_ -- [Recompensas abertas](https://opengrants.com/explore) - [Concessões DAO](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _Planilha Google de organizações que oferecem concessões_ -- [Crunchbase para subvenções Web3](https://www.cryptoneur.xyz/web3-grants) – _Filtre e pesquise subvenções por categoria, caso de uso, valor e muito mais. Contribua para ajudar outros a encontrar a subvenção certa._ +- [Crunchbase para concessões Web3](https://www.cryptoneur.xyz/web3-grants) – _Filtre e pesquise subvenções por categoria, caso de uso, valor e muito mais. Contribua para ajudar outros a encontrar a concessão certa._ - [Bolsas acadêmicas](https://esp.ethereum.foundation/academic-grants) – _Bolsas para apoiar o trabalho acadêmico relacionado com o Ethereum_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _A Blockworks compilou um diretório abrangente de todas as recompensas, RFPs e programas de caça a bugs._ ## Especificidades do projeto {#project-specific} Estes projetos criaram seus próprios programas de recompensas destinados a desenvolvimento e experimentação de suas tecnologias. - [Programa de concessões Aave](https://aavegrants.org/) – _[Aave](https://aave.com/) concede DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _Fundo do ecossistema [Balancer](https://balancer.fi/)_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _Fundo do ecossistema [Balancer](https://balancer.fi/)_ - [Programa de concessões da Chainlink](https://chain.link/community/grants) – _Concessões da comunidade da [Chainlink](https://chain.link/)_ -- [Programa de concessões Compound](https://compoundgrants.org/) – _Ecossistema financeiro [Compound](https://compound.finance/)_ -- [Programa de Recompensas Decentraland](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/)Metaverso DAO_ -- [Organização de concessões do ecossistema Lido (LEGO)](https://lego.lido.fi/) – _Ecossistema financeiro [Lido](https://lido.fi/)_ +- [Programa de recompensas Decentraland](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/)Metaverso DAO_ +- [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _Ecossistema financeiro [Lido](https://lido.fi/)_ - [Programa MetaMask](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) bolsas lideradas por funcionários DAO_ -- [Programa de bolsas mStable](https://docs.mstable.org/advanced/grants-program) – _Comunidade [mStable](https://mstable.org/)_ - [Programa de bolsas da SKALE Network](https://skale.space/developers#grants) - _[Ecossistema da SKALE Network](https://skale.space/)_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _Ecossistema [The Graph](https://thegraph.com/)_ -- [Programa de bolsas UMA](https://grants.umaproject.org/): _[suporte ao desenvolvedor](https://umaproject.org/)UMA_ -- [Programa de bolsas da Uniswap](https://www.unigrants.org/) – _Comunidade [Uniswap](https://uniswap.org/)_ -- [Bolsas Web3](https://web3grants.net) – _Uma extensa lista de programas de bolsas relacionados com web3/criptomoedas_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/apply-for-a-grant) - _[Comunidade da Uniswap](https://uniswap.org/)_ +- [Web3 Grants](https://web3grants.net) – _Uma extensa lista de programas de concessão web3/crypto relacionados_ ## Financiamento quadrático {#quadratic-funding} diff --git a/public/content/translations/pt-br/community/language-resources/index.md b/public/content/translations/pt-br/community/language-resources/index.md index e67a8b6cec5..dc97cadd3db 100644 --- a/public/content/translations/pt-br/community/language-resources/index.md +++ b/public/content/translations/pt-br/community/language-resources/index.md @@ -72,7 +72,7 @@ Se você for bilíngue e deseja nos ajudar a alcançar mais pessoas, também pod - [Gwei.cz](https://gwei.cz) – Comunidade local em torno da Web3, que cria conteúdo educacional, organiza eventos online e presenciais - [Gwei.cz Příručka](https://prirucka.gwei.cz/) – Guia Ethereum para iniciantes - [DAO Příručka](https://dao.gwei.cz/) – Guia do iniciante para DAOs -- [ Mastering Ethereum](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Dominando o Ethereum em Tcheco +- [ Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Dominando o Ethereum em Tcheco ### Francês {#fr} diff --git a/public/content/translations/pt-br/community/online/index.md b/public/content/translations/pt-br/community/online/index.md index 86ecbb5c9d3..e65bb8d2e57 100644 --- a/public/content/translations/pt-br/community/online/index.md +++ b/public/content/translations/pt-br/community/online/index.md @@ -24,13 +24,13 @@ Centenas de milhares de entusiastas do Ethereum se reúnem nestes fóruns na Int Ethereum Cat Herders –Comunidade orientada em torno da oferta de apoio à gestão de projetos para o desenvolvimento do Ethereum Ethereum Hackers – Chat no Discord administrado pela ETHGlobal: uma comunidade online para hackers Ethereum em todo o mundo CryptoDevs – Comunidade Discord focada no desenvolvimento do Ethereum -EthStaker Discord - orientação, educação, apoio e recursos geridos pela comunidade para stakers existentes e potenciais -Equipe do site Ethereum.org – pare e converse sobre desenvolvimento e design do site ethereum.org com a equipe e pessoas da comunidade +EthStaker Discord - orientação, educação, apoio e recursos geridos pela comunidade para stakers existentes e potenciais +Equipe do site Ethereum.org – pare e converse sobre desenvolvimento e design do site ethereum.org com a equipe e pessoas da comunidade Matos Discord – comunidade de criadores da Web3 na qual construtores, líderes do setor e entusiastas do Ethereum se encontram. Somos apaixonados pelo desenvolvimento, design e cultura Web3. Venha criar conosco. -Solidity Gitter — chat para desenvolvimento do solidity (Gitter) +Solidity Gitter — chat para desenvolvimento do solidity (Gitter) Solidity Matrix — chat para desenvolvimento do solidity (Matrix) -Ethereum Stack Exchange _ — fórum de perguntas e respostas_ -Peeranha _ — fórum descentralizado de perguntas e respostas_ +Ethereum Stack Exchange * — fórum de perguntas e respostas* +Peeranha * — fórum descentralizado de perguntas e respostas* ## YouTube e Twitter {#youtube-and-twitter} diff --git a/public/content/translations/pt-br/community/research/index.md b/public/content/translations/pt-br/community/research/index.md index af6b9a08775..fbea537bda3 100644 --- a/public/content/translations/pt-br/community/research/index.md +++ b/public/content/translations/pt-br/community/research/index.md @@ -124,7 +124,7 @@ Uma área específica da camada 2 que exige mais pesquisa e desenvolvimento são - [Introdução às pontes de blockchain](/bridges/) - [Vitalik sobre pontes](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [Artigo de pontes de blockchain](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Valor bloqueado em pontes]() +- [Valor bloqueado em pontes](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Pesquisa recente {#recent-research-3} @@ -152,11 +152,11 @@ A fragmentação do blockchain do Ethereum faz parte do roadmap de desenvolvimen #### Leitura de apoio {#background-reading-5} -- [Ethereum na ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) +- [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) #### Pesquisa recente {#recent-research-5} -- [ecsda em FGPAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [ecdsa em FPGAs](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Segurança {#security} @@ -346,7 +346,6 @@ As ferramentas para desenvolvedores do Ethereum têm melhorado rapidamente. Há - [Frameworks do desenvolvedor](/developers/docs/frameworks/) - [Lista de ferramentas do desenvolvedor de consenso](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Padrões de token](/developers/docs/standards/tokens/) -- [Biastek: ferramentas Ethereum](https://biastek.com/ethereum-tools/) - [CryptoDevHub: ferramentas EVM](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Pesquisa recente {#recent-research-17} diff --git a/public/content/translations/pt-br/community/support/index.md b/public/content/translations/pt-br/community/support/index.md index 32eb46c156d..13ef33d4f86 100644 --- a/public/content/translations/pt-br/community/support/index.md +++ b/public/content/translations/pt-br/community/support/index.md @@ -30,7 +30,7 @@ Está tendo problemas com sua carteira? A maioria das carteiras tem equipes de s - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Esta não é uma lista exaustiva. Precisa de ajuda para encontrar suporte para uma carteira específica? Una-se ao [Discord da ethereum.org](https://discord.gg/ethereum-org) e tentaremos ajudar._ +_Esta não é uma lista exaustiva. Precisa de ajuda para encontrar suporte para uma carteira específica? Una-se ao [Discord da ethereum.org](https://discord.gg/rZz26QWfCg) e tentaremos ajudar._ Procurando uma carteira Ethereum? [Veja a nossa lista completa de carteiras Ethereum](/wallets/find-wallet/). @@ -39,7 +39,7 @@ Procurando uma carteira Ethereum? [Veja a nossa lista completa de carteiras Ethe Desevolver um dapp pode ser difícil. Aqui estão alguns espaços voltados ao desenvolvimento com desenvolvedores Ethereum experientes dispostos a ajudar. - [Universidade Alchemy](https://university.alchemy.com/#starter_code) -- [Discord CryptoDevs](https://discord.gg/Z9TA39m8Yu) +- [Discord CryptoDevs](https://discord.com/invite/5W5tVb3) - [Stackexchange do Ethereum](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Universidade Web3](https://www.web3.university/) @@ -53,7 +53,7 @@ Sua pergunta está relacionada a uma ferramenta, projeto ou biblioteca em partic Aqui estão alguns exemplos populares: -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [Hardhat](https://discord.gg/xtrMGhmbfZ) @@ -65,7 +65,7 @@ Aqui estão alguns exemplos populares: Se você estiver executando um nó ou validador, aqui estão algumas comunidades que se dedicam a ajudá-lo a começar. -- [Discord EthStaker](https://discord.io/ethstaker) +- [Discord EthStaker](https://discord.gg/ethstaker) - [Reddit EthStaker](https://www.reddit.com/r/ethstaker) A maioria das equipes que estão construindo clientes Ethereum também tem espaços dedicados ao público, onde você pode obter suporte e fazer perguntas. @@ -89,17 +89,17 @@ Você também pode [aprender a executar um nó aqui](/developers/docs/nodes-and- ## Perguntas frequentes {#faq} -### Enviei ETH para a carteira errada {#wrong-wallet} +#### Enviei ETH para a carteira errada {#wrong-wallet} Uma transação enviada em Ethereum é irreversível. Infelizmente, se você enviou ETH para a carteira errada, não há como recuperar esses fundos. Nenhuma organização central, entidade ou pessoa é proprietária do Ethereum, o que significa que ninguém pode reverter transações. Portanto, é vital verificar sempre as suas transações antes de enviá-las. -### Como eu posso solicitar minha doação de Ethereum? {#giveaway-scam} +#### Como eu posso solicitar minha doação de Ethereum? {#giveaway-scam} Doações/airdrops de Ethereum são golpes criados para roubar o seu ETH. Não se sinta tentado por ofertas que parecem boas demais para serem verdadeiras — se você enviar ETH para um endereço de doação, não receberá nenhuma doação/airdrop e não poderá recuperar seus fundos. [Mais sobre prevenção de fraudes](/security/#common-scams) -### Minha transação está bloqueada {#stuck-transaction} +#### Minha transação está bloqueada {#stuck-transaction} Transações em Ethereum podem algumas vezes ficar bloqueadas se você tiver enviado uma taxa de transação menor do que a necessária devido à demanda na rede. Muitas carteiras oferecem uma opção para reenviar a mesma transação com uma taxa de transação maior para permitir que a transação seja processada. Como alternativa, você pode cancelar uma transação pendente enviando uma transação para seu próprio endereço e usando o mesmo nonce que a transação pendente. @@ -107,10 +107,10 @@ Transações em Ethereum podem algumas vezes ficar bloqueadas se você tiver env [Como cancelar transações pendentes no Ethereum](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) -### Como minero Ethereum? {#mining-ethereum} +#### Como minero Ethereum? {#mining-ethereum} A mineração do Ethereum não é mais possível. A mineração foi desativada quando o Ethereum passou de prova de trabalho para prova de participação. Agora, em vez de mineradores, o Ethereum tem validadores. Os validadores participam com ETH e recebem recompensas de aposta para proteger a rede. -### Como me torno um participante/validador? {#become-validator} +#### Como me torno um participante/validador? {#become-validator} Para se tornar um validador, você deve participar com 32 ETH no contrato de depósito do Ethereum e configurar um nó validador. Mais informações estão disponíveis em nossas [páginas de participação](/staking) e na [plataforma de lançamento de participação](https://launchpad.ethereum.org/). diff --git a/public/content/translations/pt-br/contributing/adding-desci-projects/index.md b/public/content/translations/pt-br/contributing/adding-desci-projects/index.md index fb6d6deea0b..07b5b7694f9 100644 --- a/public/content/translations/pt-br/contributing/adding-desci-projects/index.md +++ b/public/content/translations/pt-br/contributing/adding-desci-projects/index.md @@ -37,7 +37,7 @@ O Ethereum é fluido por natureza, por isso, suas equipes e produtos vêm e vão - garantir que todos os projetos listados ainda atendam aos nossos critérios - verificar se não há produtos sugeridos que atendam mais aos nossos critérios do que os atualmente listados -O ethereum.org é mantido pela comunidade de código aberto e dependemos da comunidade para ajudar a mantê-lo atualizado. Se você observar alguma informação sobre os projetos listados que precisam ser atualizados, abra um tíquete ou uma solicitação por pull em nosso repositório do GitHub. +O ethereum.org é mantido pela comunidade de código aberto e dependemos da comunidade para ajudar a mantê-lo atualizado. Se você notar alguma informação sobre projetos listados que precisam ser atualizados, abra um tíquete ou uma solicitação de pull em nosso repositório do GitHub. ## Termos de uso {#terms-of-use} diff --git a/public/content/translations/pt-br/contributing/adding-developer-tools/index.md b/public/content/translations/pt-br/contributing/adding-developer-tools/index.md index 9874eefdaef..11139288968 100644 --- a/public/content/translations/pt-br/contributing/adding-developer-tools/index.md +++ b/public/content/translations/pt-br/contributing/adding-developer-tools/index.md @@ -54,7 +54,7 @@ A menos que os produtos sejam ordenados especificamente de outra forma, como em ## Adicione sua ferramenta de desenvolvedor {#how-decisions-about-the-site-are-made} -Se você deseja adicionar uma ferramenta de desenvolvedor ao ethereum.org e ela atender aos critérios, crie um tíquete no GitHub. +Se você deseja adicionar uma ferramenta de desenvolvedor ao ethereum.org que atende aos critérios, crie um tíquete no GitHub. Criar tíquete diff --git a/public/content/translations/pt-br/contributing/adding-exchanges/index.md b/public/content/translations/pt-br/contributing/adding-exchanges/index.md index d04e1baff27..2ef923a0d70 100644 --- a/public/content/translations/pt-br/contributing/adding-exchanges/index.md +++ b/public/content/translations/pt-br/contributing/adding-exchanges/index.md @@ -20,7 +20,7 @@ Devido a esse contexto, precisaremos de algumas informações específicas quand ## Do que precisamos {#what-we-need} -- As restrições geográficas aplicáveis ao câmbio +- As restrições geográficas aplicáveis ao câmbio. As restrições geográficas associadas ao câmbio devem ser detalhadas em uma página ou seção dedicada do site da corretora de câmbio. - As moedas que os usuários podem usar para comprar ETH - Prova de que a agência de câmbio é uma empresa comercial legítima - Qualquer informação adicional que você tenha: podem ser informações sobre a empresa, como anos de operação, apoio financeiro, etc. diff --git a/public/content/translations/pt-br/contributing/adding-glossary-terms/index.md b/public/content/translations/pt-br/contributing/adding-glossary-terms/index.md index 64eb3ae3f9d..6f5a315b1a9 100644 --- a/public/content/translations/pt-br/contributing/adding-glossary-terms/index.md +++ b/public/content/translations/pt-br/contributing/adding-glossary-terms/index.md @@ -23,4 +23,4 @@ Novos termos inseridos no glossário serão avaliados pelos seguintes critérios ## Adicione seu termo {#how-decisions-about-the-site-are-made} -Se você quiser adicionar um termo ao glossário no ethereum.org e que atenda aos critérios, [ abra um tíquete no GitHub](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml). +Se você quiser adicionar um termo ao glossário no ethereum.org que atenda aos critérios, [abra um tíquete no 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/pt-br/contributing/adding-layer-2s/index.md b/public/content/translations/pt-br/contributing/adding-layer-2s/index.md index 2f75be526bb..8bd03a8ee16 100644 --- a/public/content/translations/pt-br/contributing/adding-layer-2s/index.md +++ b/public/content/translations/pt-br/contributing/adding-layer-2s/index.md @@ -90,7 +90,7 @@ _Não consideramos outras soluções de dimensionamento que não usam o Ethereum ## Adicione sua camada 2 {#add-exchange} -Se você deseja adicionar a camada 2 ao ethereum.org, crie um tíquete no GitHub. +Se você quiser adicionar uma camada 2 ao ethereum.org, abra um tíquete no Github. Crie um ticket diff --git a/public/content/translations/pt-br/contributing/adding-products/index.md b/public/content/translations/pt-br/contributing/adding-products/index.md index 61ebb3f3f62..21ecdd5bd30 100644 --- a/public/content/translations/pt-br/contributing/adding-products/index.md +++ b/public/content/translations/pt-br/contributing/adding-products/index.md @@ -85,7 +85,7 @@ O Ethereum é fluido por natureza, por isso, suas equipes e produtos vêm e vão - garantir que todos os dapps listados continuem atendendo a nossos critérios - verificar se não há produtos sugeridos que atendam mais aos nossos critérios do que os atualmente listados -Você pode nos ajudar com isso, verificando e nos informando. [Abra um tíquete](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) ou envie um email para[website@ethereum.org](mailto:website@ethereum.org) +Você pode nos ajudar com isso, verificando e nos informando. [Abra um tíquete](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) ou envie um e-mail para[website@ethereum.org](mailto:website@ethereum.org) _Estamos também investigando opções de votação para que a comunidade possa indicar suas preferências e destacar os melhores produtos disponíveis para recomendarmos._ @@ -93,7 +93,7 @@ _Estamos também investigando opções de votação para que a comunidade possa ## Adicione seu produto {#add-your-product} -Se você quiser adicionar um dapp ao ethereum.org e ele atender aos critérios, crie um tíquete no GitHub. +Se você quiser adicionar um dapp ao ethereum.org e ele atender aos critérios, abra um tíquete no GitHub. Criar um novo problema diff --git a/public/content/translations/pt-br/contributing/adding-staking-products/index.md b/public/content/translations/pt-br/contributing/adding-staking-products/index.md index 3fcf88e2410..393d0e7f9f7 100644 --- a/public/content/translations/pt-br/contributing/adding-staking-products/index.md +++ b/public/content/translations/pt-br/contributing/adding-staking-products/index.md @@ -8,7 +8,7 @@ lang: pt-br Queremos ter certeza de que listamos os melhores recursos possíveis, mantendo os usuários seguros e confiantes. -Qualquer pessoa é livre para sugerir a adição de participações em produtos ou serviços no ethereum.org. Se houver algum que esquecemos, **[sugira aqui](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** +Qualquer pessoa é livre para sugerir a adição de participações em produtos ou serviços no ethereum.org. Se houver algum de que esquecemos, **[sugira aqui](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** Atualmente, listamos participações em produtos e serviços nas seguintes páginas: @@ -20,7 +20,7 @@ A prova de participação na Beacon Chain está ativa desde 1 de dezembro de 202 ## O framework de decisão {#the-decision-framework} -A decisão de listar um produto no ethereum.org não depende de um único fator. Vários critérios são considerados em conjunto ao decidir listar um produto ou serviço. Quanto esses critérios ou mais forem atendidos, maior será a probabilidade de eles serem listados. +A decisão de listar um produto no ethereum.org não depende de um único fator. Vários critérios são considerados em conjunto ao decidir listar um produto ou serviço. Quanto mais desses critérios forem atendidos, maior será a probabilidade de eles serem listados. **Primeiro, de qual categoria de produto ou serviço isso se trata?** @@ -29,7 +29,7 @@ A decisão de listar um produto no ethereum.org não depende de um único fator. - Participação como Serviço (SaaS) - Pool de participação (staking) -Atualmente, estamos listando apenas produtos ou serviços nessas categorias. +Atualmente, estamos apenas listando produtos ou serviços nessas categorias. ### Critérios para inclusão {#criteria-for-inclusion} @@ -50,6 +50,11 @@ As submissões de produtos ou serviços de participação serão avaliadas pelos - Quais etapas na jornada dos usuários exigem que humanos de confiança tenham as chaves de seus fundos ou distribuam recompensas adequadamente? - Isso é usado para determinar a pontuação de produtos e serviços "sem confiança". +**O projeto fornece informação precisa e confiável?** + +- É crucial que o website do produto exiba informações atualizadas, precisas e que não induzam a erro, particularmente se ele pertence ao protocolo Ethereum ou outras tecnologias relacionadas. +- Envios contendo informações incorretas, detalhes desatualizados, afirmações potencialmente confusas sobre o Ethereum ou outros assuntos relevantes não serão listadas, ou serão removidas se já estiverem listadas. + **Quais plataformas são suportadas?** - ou seja, Linux, macOS, Windows, iOS, Android @@ -63,7 +68,7 @@ Para qualquer sistema personalizado ou contrato inteligente envolvido: - Projetos de código aberto devem ter um repositório de código-fonte disponível publicamente - Isso é usado para determinar a pontuação de "código aberto" dos produtos. -**O produto está fora do desenvolvimento _beta_?** +**O produto está fora do desenvolvimento de uma versão _beta_?** - Onde se encontra o produto em seu ciclo de desenvolvimento? - Os produtos na fase beta não são considerados para inclusão no ethereum.org @@ -82,14 +87,14 @@ Para qualquer sistema personalizado ou contrato inteligente envolvido: Para produtos de software relacionados à configuração de nó ou cliente, gerenciamento ou migração: -**Quais clientes da camada de consenso (por exemplo, Lighthouse, Teku, Nimbus, Prysm) são suportados?** +**Quais clientes da camada de consenso (como Lighthouse, Teku, Nimbus, Prysm) são suportados?** - Quais clientes são suportados? O usuário pode escolher? - Isso é usado para determinar a pontuação dos produtos "multicliente". #### Participação sobre Serviço {#staking-as-a-service} -Para [listagens de participação como serviço](/staking/saas/) (ou seja, operação de nó delegado): +Para [listagens de staking-as-a-service](/staking/saas/) (ou seja, operação de nó delegada): **Quais são as taxas associadas ao uso do serviço?** @@ -108,7 +113,7 @@ Para [listagens de participação como serviço](/staking/saas/) (ou seja, opera **Qual é a diversidade de clientes dos nós que estão sendo operados?** -- Qual é a porcentagem de chaves do validador sendo executadas por um cliente para constituir a camada de consenso (CL)? +- Que percentual de chaves validadoras estão sendo rodadas pela por uma maioria de clientes de camada de consenso (CL)? - Na última edição, o Prysm é o cliente da camada de consenso executado pela maioria dos nós operadores, o que é perigoso para a rede. Se um cliente atualmente estiver usando mais de 33% da rede, solicitamos os dados relacionados a esse uso. - Isso é usado para determinar a pontuação de “diversidade de clientes” dos produtos. @@ -123,7 +128,7 @@ Para [serviços de participação (stake) em pool](/staking/pools/): **Quais são as taxas ou requisitos de participação (stake) envolvidos?** - Qual é o percentual de recompensas removidas como taxas? -- Quaisquer requisitos adicionais de participação? +- Você tem requisitos adicionais de participação (staking)? **Há um token de liquidez?** @@ -139,14 +144,14 @@ Para [serviços de participação (stake) em pool](/staking/pools/): **Qual é a diversidade de clientes dos operadores de nós em pool?** - Qual é a porcentagem de operadores de nós que usam um cliente da camada de consenso? -- Na última edição, o Prysm é o cliente da camada de concenso executado pela maioria dos nós operadores, o que é perigoso para a rede. Se qualquer cliente CL está atualmente sendo usado acima de 33% da rede, ele pede os dados relacionados para o uso. -- Isso é usado para determinar a pontuação de "clientes distintos" dos produtos. +- Na última edição, o Prysm é o cliente da camada de consenso executado pela maioria dos nós operadores, o que é perigoso para a rede. Se um cliente atualmente estiver usando mais de 33% da rede, solicitamos os dados relacionados a esse uso. +- Isso é usado para determinar a pontuação de “diversidade de clientes” dos produtos. ### Outros critérios: os bons para ter {#other-criteria} **Quais interfaces de usuário são suportadas?** -- Por exemplo, Aplicativos de navegador, desktop, mobile ou CLI +- ou seja, Aplicativos de navegador, desktop, mobile ou CLI **Para ferramentas de nós, o software fornece uma maneira fácil de alternar entre clientes?** @@ -158,13 +163,13 @@ Para [serviços de participação (stake) em pool](/staking/pools/): ## Como exibimos os resultados {#product-ordering} -Os [critérios de inclusão](#criteria-for-inclusion) acima são usados para calcular a pontuação acumulada para cada produto ou serviço. Isso é usado como meio de classificação e apresentação de produtos que atendem a determinados critérios objetivos. Quanto mais critérios forem fornecidos para essa evidência, maior será a classificação de um produto, com ligações carregadas aleatoriamente. +Os [critérios de inclusão](#criteria-for-inclusion) acima são usados para calcular a pontuação acumulada para cada produto ou serviço. Isso é usado como meio de classificação e apresentação de produtos que atendem a determinados critérios objetivos. Quanto mais critérios forem fornecidos para essa evidência, maior será a classificação de um produto, com ligações exibidas aleatoriamente durante o carregamento. Atualmente, a lógica e os valores do código para esses critérios estão contidos [neste componente JavaScript](https://github.com/ethereum/ethereum-org-website/blob/dev/src/components/Staking/StakingProductsCardGrid.js#L350) em nosso repositório. ## Adicione seu produto ou serviço {#add-product} -Se você quiser adicionar uma participação (stake) de produto ou serviço ao ethereum.org, crie um tíquete no GitHub. +Se você quiser adicionar uma participação (stake) de produto ou serviço ao ethereum.org, crie um tíquete no Github. Crie um ticket diff --git a/public/content/translations/pt-br/contributing/content-resources/index.md b/public/content/translations/pt-br/contributing/content-resources/index.md index 1cdd883e273..8215db0dd93 100644 --- a/public/content/translations/pt-br/contributing/content-resources/index.md +++ b/public/content/translations/pt-br/contributing/content-resources/index.md @@ -25,7 +25,7 @@ Conteúdos de aprendizado serão avaliados pelos seguintes critérios: ## Adicione seu recurso de conteúdo {#add-your-content-resource} -Se você deseja adicionar uma fonte de conteúdo que atende aos critérios ao ethereum.org, crie um tíquete no GitHub. +Se você deseja adicionar uma fonte de conteúdo ao ethereum.org que atende aos critérios, abra um tíquete no GitHub. Criar um novo problema diff --git a/public/content/translations/pt-br/contributing/design-principles/index.md b/public/content/translations/pt-br/contributing/design-principles/index.md index 7d15606696b..5d673b36cc3 100644 --- a/public/content/translations/pt-br/contributing/design-principles/index.md +++ b/public/content/translations/pt-br/contributing/design-principles/index.md @@ -90,4 +90,4 @@ Você pode ver nossos princípios de design em ação [em nosso site](/). Embora esses princípios estejam focados no site ethereum.org, esperamos que muitos deles representem os valores do ecossistema Ethereum em geral (por exemplo, você pode ver a influência doo [princípios do Whitepape Ethereum](https://github.com/ethereum/wiki/wiki/White-Paper#philosophy)). Talvez você até queira incorporar alguns deles em seu próprio projeto! -Dê sua opinião no [servidor Discord](https://discord.gg/ethereum-org) ou [criando um tíquete](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=). +Dê sua opinião no [servidor Discord](https://discord.gg/CetY6Y4) ou [criando um tíquete](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/pt-br/contributing/design/adding-design-resources/index.md b/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md new file mode 100644 index 00000000000..29f23778127 --- /dev/null +++ b/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md @@ -0,0 +1,67 @@ +--- +title: Adicionando recursos de design +description: Diretrizes e requisitos para garantir a qualidade dos materiais de design no ethereum.org +lang: pt-br +--- + +Qualquer pessoa pode sugerir novos materiais de design para a página de [Design e UX na web3](/developers/docs/design-and-ux/). + +Esteja ciente de que o foco desta página é fornecer valor ao usuário para candidatos a designers web3. A seção de design não está lá para anunciar seus serviços, produtos ou plataformas. + +Para garantir que possamos manter um alto padrão de informações e promover visões valiosas, estabelecemos uma política de listagem: + +## Estudos de Pesquisa e Painéis {#Research-studies} + +1. Metodologia do Som + +a. A metodologia deve definir claramente como os dados foram coletados. + +b. O número de participantes envolvidos na pesquisa deve ser informado. + +c. Os métodos de pesquisa empregados devem ser descritos. + +2. Relevância para designers Web3 e casos de uso comuns de design + +a. O tópico da pesquisa deve ser relevante para designers web3 e abordar casos de uso comuns de design. + +3. Foco no fornecimento de informações + +a. O objetivo principal do texto deve ser compartilhar informações em vez de promover um projeto ou empresa específica. + +## Artigos {#Articles} + +1. Relevância para Designers/Pesquisadores Web3 e Casos de Uso Comuns de Design Web3 + +a. O tópico do artigo deve ser pertinente para designers e pesquisadores web3, com foco em casos de uso comuns de design web3. + +2. Qualidade básica de redação + +a. O artigo deve estar livre de erros gramaticais e ortográficos. + +b. A ênfase deve ser colocada na entrega de informações e aprendizados fundamentais. + +c. A redação deve ser concisa e direta. + +3. Objetivo do texto + +a. O objetivo principal do artigo deve ser compartilhar informações em vez de promover um determinado projeto ou empresa. + +## Comunidades / DAOs {#Communities-and-DAOs} + +1. O site deve indicar claramente como participar da Comunidade/DAO + +2. Benefícios claros de ser um membro + +a. Os benefícios de se tornar um membro devem ser apresentados em destaque. + +**Exemplos**: receber comentários sobre o trabalho, acessar oportunidades de trabalho ou recompensas, compartilhar conhecimentos de design e pesquisa. + +3. Comunicação ativa e vibrante no Discord + +a. A comunidade do Discord deve exibir uma comunicação ativa e engajada. + +b. Os moderadores devem se envolver ativamente na manutenção da comunidade e na facilitação de discussões. + +c. A comunidade deve demonstrar um histórico de conversas valiosas e produtivas nas últimas duas semanas. + +Ao aderir a esses critérios, nosso objetivo é promover um ambiente próspero e de compartilhamento de conhecimento em nossa comunidade. Nós acreditamos que esta política de lista branca vai garantir que nossos usuários tenham acesso a recursos confiáveis, relevantes e perspicazes. Agradecemos sua compreensão e cooperação para manter a qualidade do conteúdo em nossa plataforma. diff --git a/public/content/translations/pt-br/contributing/design/index.md b/public/content/translations/pt-br/contributing/design/index.md new file mode 100644 index 00000000000..6699fa9d24c --- /dev/null +++ b/public/content/translations/pt-br/contributing/design/index.md @@ -0,0 +1,77 @@ +--- +title: Contribuição no design +description: Contribuição no design do ethereum.org +lang: pt-br +--- + +# Contribuição no design do ethereum.org {#design-contributions} + +O design é um componente crítico de qualquer projeto e, dedicando seu tempo e habilidades de design ao Ethereum.org, você pode ajudar a melhorar a experiência do usuário para nossos visitantes. Contribuir para um projeto de código aberto oferece uma oportunidade de ganhar experiência relevante e desenvolver suas habilidades em um ambiente colaborativo. Você terá a chance de trabalhar com outros designers, desenvolvedores e membros da comunidade, todos com suas próprias perspectivas e visões. + +Por fim, essa é uma ótima maneira de construir um portfólio diversificado e impressionante que mostre suas habilidades de design. + +## Como contribuir? + +### Forneça feedback sobre os primeiros protótipos de design {#design-critique} + +Às vezes, precisamos de ajuda para testar nossas ideias originais. Esta é uma ótima maneira de como contribuir sem nenhum conhecimento técnico. + +1. A equipe de design compartilhará um desenho de projeto no [Discord](https://discord.com/invite/CetY6Y4) e no [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). +2. Você será guiado pelos projetos para fornecer feedback por meio da função de comentários. +3. O resultado será compartilhado em problemas do GitHub e depois fechado pela equipe. + +### Participe da pesquisa de levantamento {#answer-surveys} + +Forneça seus comentários em nosso site: + +1. Visitando ethereum.org e lendo as páginas. +2. Clicando no widget de feedback no canto inferior direito e respondendo a perguntas relacionadas ao design e conteúdo. +3. Foque nas perguntas de formato livre. + +### Encontre problemas relacionados ao design no site e reporte-os {#report-design-issues} + +O Ethereum.org é um site de rápido crescimento com muitos recursos e conteúdo. Algumas das interfaces de usuário podem facilmente se tornar obsoletas ou poderiam ser aprimoradas. Se você encontrar qualquer caso parecido, por favor reporte ele para que chame a nossa atenção. + +1. Acesse o site e preste atenção em seu design. +2. Faça capturas de tela e anotações se você notar algum problema visual ou de experiência do usuário. +3. Reporte os problemas encontrados usando um [formulário de bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). + +### Proponha mudanças de design {#propose-design-changes} + +Se você se sente à vontade para enfrentar desafios de design, visite nosso quadro de problemas do GitHub e filtre por [problemas relacionados ao design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). + +1. Vá ao nosso site e preste atenção em seu design ou acesse nosso repositório GitHub e analise os problemas sinalizados com a [Etiqueta "Design necessário"](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). +2. Idealize a solução e desenhe-a. (idealmente usando nosso [sistema de design](https://www.figma.com/community/file/1134414495420383395)). +3. Proponha a solução no tíquete do GitHub correspondente ou [abra um novo.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) +4. Aguarde a revisão do time de design. + +### Construir o Sistema de Design juntos {#Contribute-to-design-system} + +Nosso sistema de design torna o projeto ethereum.org divertido e fácil. Se você é um designer experiente, você pode nos ajudar a preparar muitos componentes para o site. + +1. Selecione um problema para trabalhar no painel [sobre sistema de design](https://github.com/ethereum/ethereum-org-website/labels/design%20system) no GitHub ou crie um novo. +2. Peça que o problema selecionado seja atribuído a você. +3. Comece a projetar o componente solicitado na figma. +4. Compartilhe-o com a equipe de design no GitHub, assim que você precisar de revisão ou orientação. +5. A equipe de design revisará. +6. A equipe de design vai incorporar as mudanças no arquivo principal e publicará o arquivo para a comunidade. + +### Escreva o conteúdo relacionado ao design no site {#write-design-articles} + +A comunidade de desenvolvedores Ethereum é forte, mas a comunidade de design está ficando um pouco para trás. Se você é um designer com conhecimento em web3, por favor, considere compartilhar seus aprendizados com a comunidade maior, para que todos possamos crescer e melhorar juntos; temos [uma página sobre design para Ethereum](/developers/docs/design-and-ux/) para a qual você pode contribuir. Você também pode verificar nossas [políticas de listagem](/contributing/design/adding-design-resources). + +1. Idealize sobre tópicos de design que devem ser cobertos no ethereum.org e seriam benéficos para os designers no espaço. +2. Vá ao nosso repositório do GitHub e [levante um problema](https://github.com/ethereum/ethereum-org-website/issues/new) propondo um tópico (não escreva o conteúdo ainda). +3. Aguarde a aprovação do time de design. +4. Uma vez aprovado, escreva o conteúdo. +5. Envie-o no problema GH correspondente. + +### Desenhe novas ilustrações {#prepare-illustrations} + +As visualizações são uma das ferramentas mais poderosas para explicar tópicos abstratos. Há um enorme potencial ao adicionar diagramas e infográficos. Afinal, uma imagem pode dizer mil palavras. + +1. Vá ao nosso site e veja as páginas onde alguns novos infográficos poderiam ser adicionados. +2. Certifique-se de que o estilo da ilustração corresponda aos nossos [recursos](/assets/). +3. Vá ao nosso repositório GitHub e [levante um problema](https://github.com/ethereum/ethereum-org-website/issues/new) propondo a ilustração. +4. A equipe de design irá analisá-lo. +5. Nós criamos um novo problema para pedir a um desenvolvedor que implemente a nova imagem. diff --git a/public/content/translations/pt-br/contributing/index.md b/public/content/translations/pt-br/contributing/index.md index 2a9febc4d48..f3eb285f93a 100644 --- a/public/content/translations/pt-br/contributing/index.md +++ b/public/content/translations/pt-br/contributing/index.md @@ -16,10 +16,10 @@ O site ethereum.org, como o Ethereum de forma mais ampla, é um projeto de códi ## Formas de contribuir {#ways-to-contribute} - [Trabalhe em um tíquete aberto](https://github.com/ethereum/ethereum-org-website/issues) _ — Trabalho pendente identificado_ -- [Participe do programa de tradução](/contributing/translation-program/) _ — Ajude-nos a traduzir o ethereum.org para novos idiomas_ -- [Ajude com o design do site](/contributing/design/) _ — Designers de todos os níveis podem contribuir para melhorar o site_ +- [Participar do programa de tradução](/contributing/translation-program/) _ — Ajude-nos a traduzir o ethereum.org para novos idiomas_ +- [Ajudar com o design do site](/contributing/design/) _ — Designers de todos os níveis podem contribuir para melhorar o site_ - [Adicionar recursos da comunidade](/contributing/content-resources/) _ — Adicione um artigo ou recurso útil a uma página relevante_ -- [Adicione um produto](/contributing/adding-products/) _ — Adicione um dapp ou carteira a uma página relevante_ +- [Adicionar um produto](/contributing/adding-products/) _ — Adicione um dapp ou carteira a uma página relevante_ - [Adicionar ferramentas de desenvolvedor](/contributing/adding-developer-tools/) _ — Adicione uma ferramenta de desenvolvedor a uma página relevante_ - [Adicionar uma troca](/contributing/adding-exchanges/) _ — Adicione um câmbio ao nosso [localizador de câmbios](/get-eth/#country-picker)_ - [Melhorar nossa pesquisa](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c) _ — Envie seus comentários sobre nossa pesquisa ou contribua com a sua própria_ @@ -30,8 +30,10 @@ O site ethereum.org, como o Ethereum de forma mais ampla, é um projeto de códi - [Adicionar um produto ou serviço de staking](/contributing/adding-staking-products/) _ — Adicione um projeto que ajude a facilitar o stake individual, stake combinado ou stake como serviço_ - [Adicionar uma carteira](/contributing/adding-wallets/) _ — Adicione uma carteira à [página de pesquisa de carteiras](/wallets/find-wallet/)_ - [Sugerir um projeto para nossa página DeSci](/contributing/adding-desci-projects/) _ — Adicione um projeto construído no Ethereum que contribua para a ciência descentralizada_ +- [Questionários](/contributing/quizzes/) _- Adicione, atualize e exclua bancos de perguntas do questionário para uma página relevante_ +- [Sugerir um recurso de design](/contributing/design/adding-design-resources/) _- Adicionar, atualizar e excluir recursos úteis de design_ -_Alguma dúvida?_ 🤔 Entre em contato no nosso [servidor do Discord](https://discord.gg/ethereum-org) +_Alguma dúvida?_ 🤔 Entre em contato no nosso [servidor do Discord](https://discord.gg/CetY6Y4) ## Como trabalhar no ethereum.org {#how-to-update-content} @@ -42,13 +44,14 @@ Todas as atualizações são efetuadas por meio do processo de PR (solicitação Você não precisa de permissão para trabalhar em nada, mas é sempre melhor nos informar sobre o que está planejando fazer. Você pode fazer isso: - Comentando sobre um problema ou uma solicitação de pull (PR) no [GitHub](https://github.com/ethereum/ethereum-org-website) -- Enviando uma mensagem em nosso [servidor Discord](https://discord.gg/ethereum-org) +- Enviando uma mensagem em nosso [servidor Discord](https://discord.gg/CetY6Y4) Antes de contribuir, certifique-se de está familiarizado com: - a [visão do ethereum.org](/about/) em evolução - nossos [princípios de design](/contributing/design-principles/) - nosso [guia de estilo](/contributing/style-guide/) +- nosso [código de conduta](/community/code-of-conduct) ## Como são tomadas as decisões sobre o site {#how-decisions-about-the-site-are-made} @@ -56,7 +59,7 @@ As decisões sobre PRs individuais, desenvolvimento do design e grandes atualiza - [website@ethereum.org](mailto:website@ethereum.org) - [@ethdotorg](https://twitter.com/ethdotorg) -- [Servidor do Discord](https://discord.gg/ethereum-org) +- [Servidor do Discord](https://discord.gg/CetY6Y4) ### Observação sobre plágio {#plagiarism} @@ -74,13 +77,24 @@ Se a sua contribuição for incluída no ethereum.org, cunharemos um POAP único ### Como solicitar seu POAP {#how-to-claim} -1. Entre em nosso [servidor do Discord](https://discord.gg/ethereum-org). +1. Entre em nosso [servidor do Discord](https://discord.gg/premid). 2. Cole o link com sua contribuição no `#🥇| ` [canal poaps](https://discord.com/channels/714888181740339261/804005643211898911). 3. Espere que um membro de nossa equipe envie um link para o seu POAP. 4. Solicite seu POAP! Você só deve usar carteiras autônomas para reivindicar POAPs. Não use contas de agências de câmbio ou outras contas das quais você não possui as chaves privadas, pois você não poderá acessar ou gerenciar seus POAPs. +## Resgate seu GitPOAP {#claim-gitpoap} + +O GITPOAP também reconhecerá automaticamente sua contribuição fusionada e permitirá que você cunhe um POAP de colaboradores exclusivo e separado na sua própria plataforma! + +### Como solicitar seu POAP {#how-to-claim} + +1. Visite [GitPOAP](https://www.gitpoap.io). +2. Conecte-se à sua carteira ou mesmo ao seu e-mail com a opção de entrada. +3. Procure seu nome de usuário no GitHub, endereço ETH, nomes ENS ou qualquer GitPOAP para verificar se você é elegível. +4. Se sua conta no GitHub for elegível, você poderá cunhar um GitPOAP! + ## Colaboradores {#contributors} diff --git a/public/content/translations/pt-br/contributing/quizzes/index.md b/public/content/translations/pt-br/contributing/quizzes/index.md new file mode 100644 index 00000000000..02f684c109e --- /dev/null +++ b/public/content/translations/pt-br/contributing/quizzes/index.md @@ -0,0 +1,62 @@ +--- +title: Adicionando um questionário +description: A política que nós usamos quando adicionando questionários na ethereum.org +lang: pt-br +--- + +# Questionários {#quizzes} + +Questionários são uma oportunidade para os usuários testarem se entenderam o conteúdo da página que acabaram de ler. As questões devem ser baseadas somente no conteúdo fornecido na página e não deve perguntar sobre informações que não estejam mencionadas na página. + +As questões são estruturadas como a seguir. A questão mostra 1 resposta correta com uma explicação do porquê ela é correta, 3 respostas incorretas com uma explicação do porquê elas são incorretas. + +Alguns exemplos de questionários atuais podem ser encontrados aqui: + +- [Camada 2](/layer-2) +- [NFT](/nft/) +- [O que é o Ethereum?](/what-is-ethereum/) +- [O que é ETH?](/eth/) + +## Adicionando um questionário de aprendizado + +Se há uma página que não tem um questionário de aprendizado criado para ela, por favor [abra um issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) para ela. + +Por favor forneça as seguintes informações: + +- A página a qual você quer adicionar um questionário +- 5 questões com as seguintes informações: + - A seção da página em que a questão é baseada + - Enunciado da questão + - 1 resposta correta com uma explicação da razão pela qual ela é correta + - 3 respostas incorretas, cada uma com uma explicação porquê elas são incorretas + +## Adicionando uma pergunta ao questionário + +Se há uma questão que você quer adicionar para o banco de questões para um questionário, por favor [abra um issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) e forneça as seguintes informações: + +- A página a qual você quer adicionar uma questão de questionário +- Para cada questão, forneça as seguintes informações: + - A seção da página em que a questão é baseada + - Enunciado da questão + - 1 resposta correta com uma explicação da razão pela qual ela é correta + - 3 respostas incorretas, cada uma com uma explicação porquê elas são incorretas + +## Atualizando uma questão de questionário + +Se há uma questão que você quer atualizar no banco de questões para um questionário, por favor [abra um issue](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) e forneça as seguintes informações: + +- A página à qual você quer atualizar uma questão de questionário +- Para cada questão sendo atualizada, forneça as seguintes informações: + - A seção da página em que a questão é baseada + - Enunciado da questão que você quer atualizar + - Enunciado da questão atualizado + - 1 resposta correta com uma explicação da razão pela qual ela é correta + - 3 respostas incorretas, cada uma com uma explicação porquê elas são incorretas + +## Removendo uma questão de questionário + +Se o conteúdo não existe mais na página de uma questão e ela precisa ser removida, [abra um tíquete](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) para remover a questão e forneça as seguintes informações: + +- A página à qual você quer excluir uma questão de questionário +- A questão que você quer excluir +- Explicação, se necessário, da razão pela qual a questão deve ser removida diff --git a/public/content/translations/pt-br/contributing/translation-program/faq/index.md b/public/content/translations/pt-br/contributing/translation-program/faq/index.md index 23af6adcb01..de0624572e7 100644 --- a/public/content/translations/pt-br/contributing/translation-program/faq/index.md +++ b/public/content/translations/pt-br/contributing/translation-program/faq/index.md @@ -110,10 +110,10 @@ O processo de revisão é simples: uma vez que um determinado [lote de conteúdo Atualmente, todo o conteúdo que não está na língua inglesa é traduzido diretamente do conteúdo em inglês, e qualquer conteúdo que não esteja nesse idioma não pode ser adicionado a outros idiomas. -Para sugerir um novo conteúdo para o ethereum.org, é possível [registrar uma contribuição](https://github.com/ethereum/ethereum-org-website/issues) no GitHub. Se adicionado, o conteúdo será escrito em inglês e traduzido para outros idiomas usando o Crowdin. +Para sugerir um novo conteúdo para o ethereum.org, é possível [criar um tíquete](https://github.com/ethereum/ethereum-org-website/issues) no GitHub. Se adicionado, o conteúdo será escrito em inglês e traduzido para outros idiomas usando o Crowdin. Planejamos adicionar suporte para adições de conteúdos que não estejam em inglês em um futuro próximo. ## Entre em contato conosco {#contact} -Agradecemos por ter lido todas estas informações. Esperamos que elas tenham incentivado você a participar de nosso programa. Junte-se ao nosso [canal de tradução do Discord](https://discord.gg/ethereum-org) para fazer perguntas e colaborar com outros tradutores, ou entre em contato conosco em translations@ethereum.org! +Agradecemos por ter lido todas estas informações. Esperamos que elas tenham incentivado você a participar de nosso programa. Junte-se ao nosso [canal de tradução do Discord](https://discord.gg/XVepFu7sqR) para fazer perguntas e colaborar com outros tradutores, ou entre em contato conosco em translations@ethereum.org! diff --git a/public/content/translations/pt-br/contributing/translation-program/how-to-translate/index.md b/public/content/translations/pt-br/contributing/translation-program/how-to-translate/index.md index 19a63214c8c..5e4f9bdd65e 100644 --- a/public/content/translations/pt-br/contributing/translation-program/how-to-translate/index.md +++ b/public/content/translations/pt-br/contributing/translation-program/how-to-translate/index.md @@ -18,7 +18,7 @@ Para as pessoas que aprendem melhor de forma visual, assistam ao vídeo do Luka Você precisará fazer login na sua conta do Crowdin ou criar uma conta, caso ainda não tenha. Você só precisa de uma conta de e-mail e senha para se cadastrar. - + Junte-se ao projeto @@ -38,7 +38,7 @@ Não vê seu idioma na lista? [Abra um tíquete](https://github.com/ethereum/eth ![Arquivos traduzidos e não traduzidos no Crowdin](./crowdin-files.png) -Uma nota sobre recipientes de conteúdo: utilizamos “recipientes de conteúdos” dentro do Crowdin para ter o conteúdo de prioridade mais alta lançado primeiro. Ao verificar um idioma, por exemplo, [Filipino](https://crowdin.com/project/ethereum-org/fil#) você verá pastas por categoria de conteúdo (“1. Página inicial", "2. Use páginas do Ethereum” etc.). +Uma nota sobre recipientes de conteúdo: utilizamos “recipientes de conteúdos” dentro do Crowdin para ter o conteúdo de prioridade mais alta lançado primeiro. Ao verificar um idioma, por exemplo, [Filipino](https://crowdin.com/project/ethereum-org/fil#) você verá pastas por categoria de conteúdo (“1. Página inicial", "2. Essenciais", "3. Explorando”, etc.). Recomendamos que você traduza nesta ordem numérica (1 → 2 → 3 → ⋯) para assegurar que as páginas de maior impacto sejam traduzidas primeiro. diff --git a/public/content/translations/pt-br/contributing/translation-program/index.md b/public/content/translations/pt-br/contributing/translation-program/index.md index 849c4771ac5..37e0454af91 100644 --- a/public/content/translations/pt-br/contributing/translation-program/index.md +++ b/public/content/translations/pt-br/contributing/translation-program/index.md @@ -22,7 +22,7 @@ O Programa de Tradução do ethereum.org está aberto e qualquer um pode contrib _Junte-se ao [ethereum.org Discord](/discord/) para colaborar com traduções, fazer perguntas, compartilhar comentários e ideias ou juntar-se a um grupo de tradução._ - + Comece a traduzir @@ -36,7 +36,7 @@ Leia mais sobre a [missão e visão](/contributing/translation-program/mission-a ### Nosso progresso até agora {#our-progress} -- [**Mais de 5.000** tradutores](/contributing/translation-program/contributors/) +- [**5.100 +** tradutores](/contributing/translation-program/contributors/) - [**54** idiomas presentes no site](/languages/) - [**3 milhões** de palavras traduzidas em 2022](/contributing/translation-program/acknowledgements/) @@ -77,7 +77,7 @@ Para outras ferramentas úteis de tradução, comunidades de tradutores e postag ## Envolva-se {#get-in-touch} -Você tem alguma dúvida? Ou quer colaborar com nossa equipe e outros tradutores? Publique no canal #translations do nosso [servidor Discord do ethereum.org](https://discord.gg/ethereum-org) +Você tem alguma dúvida? Ou quer colaborar com nossa equipe e outros tradutores? Publique no canal #translations do nosso [servidor Discord do ethereum.org](https://discord.gg/6WX7E97) Você também pode entrar em contato conosco por meio do e-mail translations@ethereum.org diff --git a/public/content/translations/pt-br/contributing/translation-program/resources/index.md b/public/content/translations/pt-br/contributing/translation-program/resources/index.md index 3ba18e0f13d..ec1dbe736be 100644 --- a/public/content/translations/pt-br/contributing/translation-program/resources/index.md +++ b/public/content/translations/pt-br/contributing/translation-program/resources/index.md @@ -38,7 +38,7 @@ Para se manter atualizado sobre os avanços mais recentes do Programa de Traduç ## Horários de trabalho para tradutores {#office-hours} -Temos horários de plantão para tradutores na segunda quarta-feira de cada mês. Eles são mantidos no canal de voz #horários de plantão no [Discord do ethereum.org](https://discord.gg/geKhWjtF), no qual você também pode encontrar os horários exatos e detalhes adicionais. +Temos horários de plantão para tradutores na segunda quarta-feira de cada mês. Eles são mantidos no canal de voz #horários de plantão no [Discord do ethereum.org](/discord/), no qual você também pode encontrar os horários exatos e detalhes adicionais. O horário de plantão permite que nossos tradutores façam perguntas sobre o processo de tradução, forneçam comentários sobre o programa, compartilhem suas ideias ou simplesmente conversem com a equipe principal do ethereum.org. Por último, queremos usar essas chamadas para comunicar desenvolvimentos recentes no Programa de Tradução e compartilhar dicas importantes e instruções com nossos colaboradores. diff --git a/public/content/translations/pt-br/contributing/translation-program/translators-guide/index.md b/public/content/translations/pt-br/contributing/translation-program/translators-guide/index.md index 79cfe10415a..a8b4c6d5c2c 100644 --- a/public/content/translations/pt-br/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/pt-br/contributing/translation-program/translators-guide/index.md @@ -10,15 +10,15 @@ O Guia de Estilo de Tradução do ethereum.org contém algumas das diretrizes, i Este documento serve como um guia geral e não é específico para nenhum idioma. -Se você tiver alguma dúvida, sugestão ou feedback, entre em contato conosco em translations@ethereum.org, envie uma mensagem para @ethdotorg no Crowdin, ou [inscreva-se no nosso Discord](https://discord.gg/ethereum-org), onde você poderá nos enviar mensagens no canal #translations ou entrar em contato com qualquer um dos membros da equipe. +Se você tiver alguma dúvida, sugestão ou feedback, entre em contato conosco em translations@ethereum.org, envie uma mensagem para @ethdotorg no Crowdin, ou [inscreva-se no nosso Discord](https://discord.gg/XVepFu7sqR), onde você poderá nos enviar mensagens no canal #translations ou entrar em contato com qualquer um dos membros da equipe. -## Como usar o Crowdin {#using-crowdin} +### Como usar o Crowdin {#using-crowdin} Você pode encontrar instruções básicas sobre como participar do projeto no Crowdin e como usar o editor online do Crowdin na [página do Programa de Tradução](/contributing/translation-program/#how-to-translate). Se você quiser saber mais sobre o Crowdin e usar alguns dos seus recursos avançados, a [Base de conhecimento do Crowdin](https://support.crowdin.com/online-editor/) contém vários de guias detalhados e resumos de todas as funcionalidades do Crowdin. -## Captando a essência da mensagem {#capturing-the-essence} +### Captando a essência da mensagem {#capturing-the-essence} Ao traduzir o conteúdo do ethereum.org, evite traduções literais. @@ -28,7 +28,7 @@ Idiomas diferentes têm diferentes regras gramaticais, convenções e ordem de p Em vez de traduzir o texto de origem palavra por palavra, é recomendado ler toda a frase e adaptá-la para que ela se adapte às convenções do idioma de destino. -## Formal ou informal {#formal-vs-informal} +### Formal ou informal {#formal-vs-informal} Utilizamos linguagem formal, que é sempre mais educada e apropriada a todos os visitantes. @@ -36,13 +36,13 @@ O uso do estilo formal nos permite evitar soarmos ofensivos ou inapropriados, e A maioria dos idiomas indo-europeus e afro-asiáticos utiliza pronomes pessoais em segunda pessoa específicos de gênero, que fazem a distinção entre masculino e feminino. Quando nos dirigimos ao usuário ou usamos pronomes possessivos, podemos evitar supor o sexo do visitante, uma vez que a maneira formal de tratamento é geralmente aplicável e consistente, independentemente da forma como se identificam. -## Vocabulário simples e claro {#simple-vocabulary} +### Vocabulário simples e claro {#simple-vocabulary} Nosso objetivo é tornar o conteúdo do site compreensível para o maior número de pessoas possível. Na maioria dos casos, isso pode ser facilmente alcançado através da utilização de palavras curtas e simples, que sejam facilmente compreensíveis. Se existirem várias traduções possíveis para uma determinada palavra no seu idioma com o mesmo significado, a melhor opção é, na maioria das vezes, a palavra mais curta que reflita claramente o significado. -## Sistema de escrita {#writing-system} +### Sistema de escrita {#writing-system} O ethereum.org está disponível em vários idiomas, utilizando sistemas de escrita (ou scripts de escrita) diferentes do sistema latino. @@ -54,7 +54,7 @@ Um engano comum é o de que Ethereum deve ser escrito sempre em caracteres latin **O mencionado acima não se aplica a idiomas em que nomes próprios não devem ser traduzidos como regra geral.** -## Traduzindo metadados da página {#translating-metadata} +### Traduzindo metadados da página {#translating-metadata} Algumas páginas contêm metadados, como "title", "lang", "description", "sidebar", etc. @@ -72,7 +72,7 @@ Alguns exemplos de códigos para os idiomas mais falados: - Híndi - hi - Espanhol - es -## Títulos de artigos externos {#external-articles} +### Títulos de artigos externos {#external-articles} Algumas frases contêm títulos de artigos externos. A maioria das nossas páginas de desenvolvedor contém links para artigos externos para uma leitura mais aprofundada. As frases que contêm títulos de artigos precisam ser traduzidas, independentemente do idioma do artigo, para garantir uma experiência de usuário mais eficiente para quem quiser acessar a página em seu idioma. @@ -80,7 +80,7 @@ Você pode encontrar alguns exemplos de como essas frases aparecem para os tradu ![Títulos de artigos no sidebar.png](./article-titles-in-sidebar.png) ![Títulos de artigos no editor.png](./article-titles-in-editor.png) -## Alertas do Crowdin {#crowdin-warnings} +### Alertas do Crowdin {#crowdin-warnings} O Crowdin tem um recurso integrado que alerta os tradutores quando eles estão prestes a cometer um erro. O Crowdin avisará automaticamente antes de salvar sua tradução, caso você se esqueça de incluir uma tag da fonte, traduzir elementos que não devem ser traduzidos, adicionar espaços adicionais ou se esqueça da pontuação final, etc. Se você vir um aviso como este, verifique novamente a tradução sugerida. @@ -88,7 +88,7 @@ O Crowdin tem um recurso integrado que alerta os tradutores quando eles estão p Um exemplo de alerta do Crowdin quando você se esquece de adicionar uma tag à sua tradução: ![Exemplo de um aviso do Crowdin](./crowdin-warning-example.png) -## Lidando com tags e trechos de código {#dealing-with-tags} +### Lidando com tags e trechos de código {#dealing-with-tags} Grande parte do conteúdo fonte contém tags e variáveis, que são destacadas em amarelo no editor do Crowdin. Elas desempenham funções diferentes e devem ser abordadas corretamente. @@ -116,7 +116,7 @@ A melhor maneira de lidar com links é copiá-los diretamente da fonte, clicando ![Exemplo de link.png](./example-of-link.png) -Os links também aparecem no texto de origem na forma de tags (por exemplo, <0> ). Se você passar o mouse por cima da tag, o editor exibirá seu conteúdo completo. Às vezes, essas tags representarão links. +Links também aparecem no texto fonte na forma de tags (ou seja, <0> ). Se você passar o mouse por cima da tag, o editor exibirá seu conteúdo completo. Às vezes, essas tags representarão links. É muito importante copiar os links da origem e não mudar a sua ordem. @@ -158,7 +158,7 @@ No exemplo abaixo, ao passar o mouse sobre a <0> tag mostra que ela representa ` ![Exemplo de tags.png ambíguas](./example-of-ambiguous-tags.png) -## Formas/abreviaturas curtas vs. completas {#short-vs-full-forms} +### Formas/abreviaturas curtas vs. completas {#short-vs-full-forms} Existem muitas abreviações usadas no site, por exemplo, dapps, NFT, DAO, DeFi, etc. Essas abreviações são comumente usadas em inglês e a maioria dos visitantes do site estão familiarizados com elas. @@ -170,7 +170,7 @@ Exemplo de como traduzir dapps: - Aplicativos descentralizados (dapps) → _Formulário completo traduzido (abreviação em inglês entre parênteses)_ -## Termos sem traduções estabelecidas {#terms-without-established-translations} +### Termos sem traduções estabelecidas {#terms-without-established-translations} Alguns termos podem não ter traduções estabelecidas em outros idiomas e são mais conhecidos pelo termo original em inglês. Esses termos incluem principalmente conceitos novos, como proof-of-work, proof-of-stake, Beacon Chain, staking, etc. @@ -180,7 +180,7 @@ Ao traduzi-los, sinta-se livre para ser criativo, use traduções descritivas ou **A razão pela qual a maioria dos termos deveria ser traduzida, em vez ser deixada em inglês, é que essa nova terminologia se tornará mais difundida no futuro, à medida que mais pessoas começarem a usar o Ethereum e tecnologias relacionadas. Se queremos envolver mais pessoas de todo o mundo nesse espaço, precisamos fornecer uma terminologia compreensível no maior número possível de idiomas, mesmo que precisemos criá-la nós mesmos.** -## Botões e chamadas para a ação (CTAs) {#buttons-and-ctas} +### Botões e chamadas para a ação (CTAs) {#buttons-and-ctas} O site contém vários botões, que devem ser traduzidos de forma diferente dos outros tipos de conteúdo. @@ -190,7 +190,7 @@ As traduções dos botões devem ser o mais curtas possível, para evitar incomp ![Como encontrar um botão.png](./how-to-find-a-button.png) -## Traduzindo de forma inclusiva {#translating-for-inclusivity} +### Traduzindo de forma inclusiva {#translating-for-inclusivity} Os visitantes do ethereum.org vêm de todo o mundo e de diferentes origens. Por conseguinte, a linguagem utilizada no site deve ser neutra, acolhedora para todos e inclusiva. @@ -284,7 +284,7 @@ Aqui estão alguns exemplos a que você deve ter atenção: - Como regra geral, mantenha as unidades de medida iguais ao texto original. Se o seu país usa um sistema diferente, você pode incluir a conversão entre parênteses. - Além da localização das unidades de medida, também é importante observar as diferenças na forma como as línguas abordam essas unidades. A principal diferença é o espaçamento entre o número e a unidade, que pode diferir dependendo da língua. Por exemplo: 100kB versus 100 kB ou 50ºF versus 50 ºF. -## Conclusão {#conclusion} +### Conclusão {#conclusion} A tradução do ethereum.org é uma ótima oportunidade para aprender sobre os diferentes aspectos do Ethereum. diff --git a/public/content/translations/pt-br/developers/docs/blocks/index.md b/public/content/translations/pt-br/developers/docs/blocks/index.md index 0756285de93..b238868da7e 100644 --- a/public/content/translations/pt-br/developers/docs/blocks/index.md +++ b/public/content/translations/pt-br/developers/docs/blocks/index.md @@ -40,7 +40,7 @@ Prova de participação significa o seguinte: Há muitas informações contidas em um bloco. No nível mais alto, um bloco contém os seguintes campos: | Campo | Descrição | -| :--------------- | :--------------------------------------------------------- | +|:---------------- |:---------------------------------------------------------- | | `slot` | o slot ao qual o bloco pertence | | `proposer_index` | a ID do validador que propõe o bloco | | `parent_root` | o hash do bloco anterior | @@ -50,7 +50,7 @@ Há muitas informações contidas em um bloco. No nível mais alto, um bloco con O bloco `body` contém vários campos próprios: | Campo | Descrição | -| :------------------- | :------------------------------------------------------------ | +|:-------------------- |:------------------------------------------------------------- | | `randao_reveal` | um valor usado para selecionar o proponente do próximo bloco | | `eth1_data` | informações sobre o contrato de depósito | | `graffiti` | dados arbitrários usados para marcar blocos | @@ -65,7 +65,7 @@ O bloco `body` contém vários campos próprios: O campo `attestations` contém uma lista de todas as atestações no bloco. As atestações têm seu próprio tipo de dados que contém vários dados. Cada atestação contém: | Campo | Descrição | -| :----------------- | :---------------------------------------------------------- | +|:------------------ |:----------------------------------------------------------- | | `aggregation_bits` | uma lista de quais validadores participaram desta atestação | | `data` | um contêiner com vários subcampos | | `signature` | assinatura agregada com todos os validadores de atestação | @@ -73,7 +73,7 @@ O campo `attestations` contém uma lista de todas as atestações no bloco. As a O campo `data` no `attestation` contém o seguinte: | Campo | Descrição | -| :------------------ | :----------------------------------------------- | +|:------------------- |:------------------------------------------------ | | `slot` | o local ao qual a atestação se refere | | `index` | índices para as atestações dos validadores | | `beacon_block_root` | o hash raiz do bloco Beacon contendo este objeto | @@ -85,7 +85,7 @@ A execução das transações no `execution_payload` atualiza o estado global. T O `execution_payload_header` contém os seguintes campos: | Campo | Descrição | -| :------------------ | :----------------------------------------------------------------- | +|:------------------- |:------------------------------------------------------------------ | | `parent_hash` | hash do bloco pai | | `fee_recipient` | endereço da conta para pagar taxas de transação para | | `state_root` | hash raiz para o estado global após aplicar alterações neste bloco | @@ -105,7 +105,7 @@ O `execution_payload_header` contém os seguintes campos: O próprio `execution_payload` contém o seguinte (note que é idêntico ao cabeçalho, exceto que, em vez do hash raiz das transações, ele inclui a lista real de transações e informações de retirada): | Campo | Descrição | -| :----------------- | :----------------------------------------------------------------- | +|:------------------ |:------------------------------------------------------------------ | | `parent_hash` | hash do bloco pai | | `fee_recipient` | endereço da conta para pagar taxas de transação para | | `state_root` | hash raiz para o estado global após aplicar alterações neste bloco | @@ -125,7 +125,7 @@ O próprio `execution_payload` contém o seguinte (note que é idêntico ao cabe A lista `withdrawals` contém objetos `withdrawal` estruturados da seguinte forma: | Campo | Descrição | -| :--------------- | :---------------------------- | +|:---------------- |:----------------------------- | | `endereço` | endereço da conta que retirou | | `amount` | quantidade retirada | | `index` | valor do índice da retirada | diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/block-proposal/index.md index 00de9fab23b..52527a8e786 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/block-proposal/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -64,6 +64,6 @@ O proponente de blocos recebe pagamento pelo seu trabalho. Há uma `base_reward` - [Introdução aos blocos](/developers/docs/blocks/) - [Introdução à prova de participação](/developers/docs/consensus-mechanisms/pos/) -- [Especificações do consenso do Ethereum](https://www.github.com/ethereum/consensus-specs) +- [Especificações do consenso do Ethereum](https://github.com/ethereum/consensus-specs) - [Introdução ao Gasper](/developers/docs/consensus-mechanisms/pos/) - [Atualizando o Ethereum](https://eth2book.info/) diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md index 7b38d05ed66..a08d0f9efa6 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md @@ -16,7 +16,7 @@ A prova de participação é um meio de provar que os validadores colocam algo d ## Validadores {#validators} -Para participar como validador, um usuário deve depositar 32 ETH no contrato de depósito e executar três softwares separados: um cliente de execução, um cliente de consenso e um validador. Ao depositar seu ETH, o usuário entra em uma fila de ativação que limita a taxa de novos validadores que entram na rede. Uma vez ativados, os validadores recebem novos blocos de pares na rede Ethereum. As transações entregues no bloco são reexecutadas para verificar se, as alterações propostas para o estado do Ethereum são válidas e a assinatura do bloco é verificada. O validador então envia um voto (chamado de atestação) a favor desse bloco para toda a rede. +To participate as a validator, a user must deposit 32 ETH into the deposit contract and run three separate pieces of software: an execution client, a consensus client, and a validator client. Ao depositar seu ETH, o usuário entra em uma fila de ativação que limita a taxa de novos validadores que entram na rede. Uma vez ativados, os validadores recebem novos blocos de pares na rede Ethereum. As transações entregues no bloco são reexecutadas para verificar se, as alterações propostas para o estado do Ethereum são válidas e a assinatura do bloco é verificada. O validador então envia um voto (chamado de atestação) a favor desse bloco para toda a rede. Enquanto na prova de trabalho, o tempo dos blocos é determinado pela dificuldade de mineração, na prova de participação o tempo é fixo. O tempo na prova de participação do Ethereum é dividido em espaços (12 segundos) e épocas (32 espaços). Um validador é selecionado aleatoriamente para ser um proponente de bloco em cada espaço. Esse validador é responsável por criar um novo bloco e enviá-lo para outros nós da rede. Também em cada slot, um comitê de validadores é escolhido aleatoriamente, cujos votos são utilizados para determinar a validade do bloco proposto. Dividir o validador configurado em comitês é importante para manter a carga de rede gerenciável. Os comitês dividem o conjunto de validadores, de modo que cada validador ativo ateste em cada época, mas não em cada espaço (slot). diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/index.md index 2f33ec4694f..97227170952 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/index.md @@ -68,7 +68,7 @@ Para complicar ainda mais, as transações rejeitadas na bifurcação temporári ## Uso de energia na prova de trabalho {#energy} -Uma importante crítica à prova de trabalho é a quantidade de energia necessária para manter a rede segura. Para manter a segurança e a descentralização, o Ethereum na prova de trabalho consumia grandes quantidades de energia. Pouco antes de mudar para a prova de participação, os mineradores do Ethereum consumiam coletivamente cerca de 70 TWh/ano (aproximadamente o mesmo que a República Tcheca – de acordo com [digiconomist](https://digiconomist.net) em 18 de julho de 2022). +Uma importante crítica à prova de trabalho é a quantidade de energia necessária para manter a rede segura. Para manter a segurança e a descentralização, o Ethereum na prova de trabalho consumia grandes quantidades de energia. Pouco antes de mudar para a prova de participação, os mineradores do Ethereum consumiam coletivamente cerca de 70 TWh/ano (aproximadamente o mesmo que a República Tcheca – de acordo com [digiconomist](https://digiconomist.net/) em 18 de julho de 2022). ## Prós e contras {#pros-and-cons} diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md index 5d32213258b..5eb4f08e938 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -43,7 +43,7 @@ Para conhecer ainda mais a rentabilidade da mineração, use uma calculadora de O seguinte fornece uma visão geral de como as transações foram mineradas na prova de trabalho Ethereum. Uma descrição análoga deste processo para a prova de participação Ethereum pode ser encontrada [aqui](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [conta](/developers/docs/accounts/). +1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [ conta ](/developers/docs/accounts/). 2. O usuário transmite a solicitação de transação para toda a rede Ethereum de algum [nó](/developers/docs/nodes-and-clients/). 3. Ao ouvir tomar conhecimento da nova solicitação de transação, cada nó na rede Ethereum adiciona a solicitação ao seu mempool local, uma lista de todas as solicitações de transação sobre as quais eles têm conhecimento que ainda não foram confirmadas na blockchain em um bloco. 4. Em algum ponto, um nó de mineração agrega várias dezenas ou centenas de solicitações de transação a um [bloco](/developers/docs/blocks/) potencial, de uma forma que maximiza as [taxas de transação](/developers/docs/gas/) que eles ganham enquanto ainda estão abaixo do limite de gás de bloco. Então, o nó de mineração: diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 3f5b0428f79..c396ee0a381 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -294,7 +294,7 @@ Para certos valores de `P` e `w`, a função `pow(x, w, P)` pode ter muitas coli Dado que `P` é primo, então um `w` apropriado para uma função hash de exponenciação modular pode ser escolhida usando o seguinte resultado: > Observação 3. Considere `P` um primo; `w` e `P-1` são relativamente primos, se e somente se para todos `a` e `b` em `Z/PZ`: -> +> >
      > `aʷ mod P ≡ bʷ mod P` se e somente se `a mod P ≡ b mod P` >
      diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index 8e8381dd4eb..547b3e3c738 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -135,7 +135,7 @@ def calc_dataset(full_size, cache): ## Loop principal {#main-loop} -Agora, especificamos o loop padrão "hashimoto" principal, onde agregamos dados do conjunto de dados completo para produzir nosso valor final para um cabeçalho em particular ou nonce. No código abaixo, `header` representa o _hash \_SHA3-256 da representação RLP de um cabeçalho de bloco \_truncado_, ou seja, de um cabeçalho excluindo os campos **mixHash** e **nonce**. `nonce` é os oito bytes de um inteiro sem sinal de 64 bits na ordem big-endian. Então `nonce[::-1]` é a representação little-endian de oito bytes desse valor: +Agora, especificamos o loop padrão "hashimoto" principal, onde agregamos dados do conjunto de dados completo para produzir nosso valor final para um cabeçalho em particular ou nonce. No código abaixo, `header` representa o _hash _SHA3-256 da representação RLP de um cabeçalho de bloco _truncado_, ou seja, de um cabeçalho excluindo os campos **mixHash** e **nonce**. `nonce` é os oito bytes de um inteiro sem sinal de 64 bits na ordem big-endian. Então `nonce[::-1]` é a representação little-endian de oito bytes desse valor: ```python def hashimoto(header, nonce, full_size, dataset_lookup): diff --git a/public/content/translations/pt-br/developers/docs/dapps/index.md b/public/content/translations/pt-br/developers/docs/dapps/index.md index fd44943e0d4..ffa529e600d 100644 --- a/public/content/translations/pt-br/developers/docs/dapps/index.md +++ b/public/content/translations/pt-br/developers/docs/dapps/index.md @@ -35,7 +35,7 @@ Um contrato inteligente é um código presente na blockchain Ethereum e funciona - **Completar a integridade dos dados**: os dados armazenados na blockchain são imutáveis e indiscutíveis, graças aos primitivos criptográficos. Atores mal-intencionados não podem forjar transações ou outros dados que já foram tornados públicos. - **Computação sem confiança/comportamento verificável** – Contratos inteligentes podem ser analisados e têm garantia de execução de maneiras previsíveis, sem a necessidade de confiar em uma autoridade central. Isso não é verdade nos modelos tradicionais; por exemplo, quando usamos sistemas bancários on-line, temos que confiar que as instituições financeiras não usarão indevidamente nossos dados financeiros, adulterarão registros ou serão hackeadas. -## Desvantagens do desenvolvimento de dapps {#drawbacks-of-dapp-development} +## Benefícios do desenvolvimento de dapps {#drawbacks-of-dapp-development} - **Manutenção**: os dapps podem ser mais difíceis de manter, porque o código e os dados publicados na blockchain são mais difíceis de modificar. É difícil para os desenvolvedores fazerem atualizações em seus dapps (ou nos dados armazenados sob um dapp) uma vez que eles foram implantados, mesmo se bugs ou riscos de segurança forem identificados em uma versão antiga. - **Impactos no desempenho**: há um grande impacto no desempenho, e o dimensionamento é realmente difícil. Para alcançar o nível de segurança, integridade, transparência e confiabilidade que o Ethereum aspira, cada nó executa e armazena cada transação. Além disso, o consenso de prova de participação também leva tempo. @@ -54,7 +54,7 @@ Um contrato inteligente é um código presente na blockchain Ethereum e funciona - [GitHub](https://github.com/austintgriffith/scaffold-eth) - [Exemplo de dapp](https://punkwallet.io/) -**Crie um aplicativo Eth*: crie aplicativos com a tecnologia Ethereum apenas com um comando.*** +**Crie um aplicativo Eth_: crie aplicativos com a tecnologia Ethereum apenas com um comando._** - [GitHub](https://github.com/paulrberg/create-eth-app) diff --git a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md index 81dea175177..b51e17aa68f 100644 --- a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md +++ b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -7,7 +7,7 @@ sidebarDepth: 2 Uma árvore Merkle Patricia fornece uma estrutura de dados criptograficamente autenticada que pode ser usada para armazenar todas as ligações `(key, value)`. -Árvores Merkle Patricia são totalmente determinísticas, o que significa que há a garantia de que árvores com as mesmas ligações `(key, value)` são idênticas – até o último byte. Isto significa que elas têm o mesmo hash raiz, fornecendo a máxima eficiência `o(log(n))` para inserções, buscas e exclusões. Além disso, elas são mais simples de entender e codificar do que alternativas mais complexas baseadas em comparação, como as árvores vermelho-pretas. +A Merkle Patricia Tries é totalmente determinística, significando que Tries - testes - com a mesma ligação `(key, value)` são com certeza idênticas - até o último byte. Isto significa que elas têm o mesmo hash raiz, fornecendo a máxima eficiência `o(log(n))` para inserções, buscas e exclusões. Além disso, elas são mais simples de entender e codificar do que alternativas mais complexas baseadas em comparação, como as árvores vermelho-pretas. ## Pré-requisitos {#prerequisites} @@ -25,7 +25,7 @@ Onde `i0 ... in` representa o símbolo do alfabeto (muitas vezes binário ou hex Digamos que você queria usar uma estrutura de dados da árvore radix para persistir em uma ordem em um conjunto de pares de valor-chave. Para encontrar o valor atualmente relacionado com a chave `dog` na árvore, primeiro você converteria `dog` em letras do alfabeto (dando `64 6f 67`), e então desceria pela árvore seguindo o caminho até encontrar o valor. Ou seja, você começa por procurar o hash raiz em uma base de dados texto chave/valor para encontrar o nó raiz da árvore. Ele é representado como uma matriz de chaves apontando para outros nós. Use o valor no índice `6` como uma chave e procure na base chave/valor para obter o nó um nível abaixo. Em seguida, escolha o índice `4` para procurar o próximo valor, depois escolha o índice `6` e assim por diante. Uma vez tendo seguido o caminho: `root-> 6 -> 4 -> 6 -> 15 -> 6 -> 7`, procure o valor do nó e retorne o resultado. -Há uma diferença entre buscar algo na árvore e no banco de dados base subjacente (chave/valor). Ambos definem combinações chave/valor, mas o banco de dados subjacente pode realizar uma busca tradicional de uma chave em 1 etapa. Procurar uma chave na árvore requer várias buscas no banco de dados subjacente para obter o valor final descrito acima. Vamos nos referir a este último como um `path` para eliminar ambiguidade. +Há uma diferença entre buscar algo na árvore e no banco de dados base subjacente (chave/valor). Ambos definem arranjos chave/valor, mas o DB subjacente pode fazer uma tradicional busca de 1 passo pela chave. Procurar uma chave na árvore requer várias buscas no banco de dados subjacente para obter o valor final descrito acima. Vamos nos referir a este último como um `path` para eliminar ambiguidade. As operações de atualização e exclusão em árvores radix são simples, e podem ser definidas da seguinte forma: @@ -62,9 +62,9 @@ As operações de atualização e exclusão em árvores radix são simples, e po return hash(newnode) ``` -Uma árvore Radix "Merkle" é construída ligando os nós usando digests de hash criptográficos gerados deterministicamente. Este endereçamento de conteúdo (em banco de dados de chave/valor `key == keccak256(rlp(value))`) fornece autenticação criptográfica dos dados armazenados. Se o hash raiz de uma determinada árvore for conhecido publicamente, então, qualquer um poderá fornecer uma prova de que a árvore inclui um determinado valor em um caminho específico, fornecendo os hashes de cada nó que se junta a um valor específico para a raiz da árvore. +Uma árvore Radix "Merkle" é construída ligando os nós usando digests de hash criptográficos gerados deterministicamente. Este endereçamento de conteúdo (no BD chave/valor `key == keccak256(rlp(value))`) fornece uma integridade criptográfica garantida do dado armazenado. Se o hash raiz de um Trie - teste - determinado for conhecido publicamente, então, qualquer um com acesso aos dados da folha subjacente poderá fornecer uma prova de que o Trie - teste - inclui um determinado valor em um caminho específico, fornecendo os hashes de cada nódulo que se junta a um valor específico para a raiz da árvore. -É impossível para um atacante fornecer uma prova de um par `(path, value)` que não exista, já que o hash raiz é, em última análise, baseado em todos os hashes abaixo dele. Qualquer modificação subjacente alteraria o hash raiz. +É impossível para um atacante fornecer uma prova de um par `(path, value)` que não exista, já que o hash raiz é, em última análise, baseado em todos os hashes abaixo dele. Qualquer modificação subjacente alteraria o hash raiz. Você pode pensar no hash como uma representação comprimida de informações estruturais sobre os dados, seguros pela proteção pré-imagem da função de hash. Vamos nos referir a uma unidade atômica de uma árvore de radix (por exemplo, um único caractere hexadecimal, ou número binário de 4 bits) como um "nibble". Ao percorrerem um caminho um nibble de cada vez, conforme descrito acima, os nós podem fazer referência a 16 filhos, no máximo, mas incluir um elemento `value`. Portanto, nós os representamos como uma faixa de comprimento 17. Chamamos esses arrays de 17 elementos de "branch nodes". @@ -233,6 +233,8 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ {"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} ``` +Nota: O `storageRoot` para uma conta Ethereum está vazio pelo padrão se ele não for uma conta de contrato. + ### Árvore de transações {#transaction-trie} Há uma árvore de transações separada para cada bloco, armazenando novamente pares `(key, value)`. Um caminho aqui é: `rlp(transactionIndex)` que representa a chave que corresponde a um valor determinado por: diff --git a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/rlp/index.md index 03b74f18093..af64d513aa2 100644 --- a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/rlp/index.md +++ b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/rlp/index.md @@ -35,7 +35,7 @@ A codificação RLP é definida da seguinte forma: - Para um único byte cujo valor está na faixa `[0x00, 0x7f]` (decimal `[0, 127]`), este byte é a sua própria codificação RLP. - Caso contrário, se uma string tem de 0 a 55 bytes de comprimento, a codificação RLP consiste em um único byte com valor **0x80** (dec. 128) mais o comprimento da string seguida pela string. O intervalo do primeiro byte é, portanto, `[0x80, 0xb7]` (dec. `[128, 183]`). - Se uma string tem mais de 55 bytes de comprimento, a codificação RLP consiste em um único byte com valor **0xb7** (dec. 183) mais o comprimento em bytes do comprimento da sequência de caracteres na forma binária, seguido pelo comprimento da string, seguido pela string. Por exemplo, uma string de 1024 bytes de comprimento seria codificada como `\xb9\x04\x00` (dec. `185, 4, 0`) seguida pela string. Aqui, `0xb9` (183 + 2 = 185) como o primeiro byte, seguido pelos 2 bytes `0x0400` (dec. 1024) que denotam o comprimento da string real. O intervalo do primeiro byte é, portanto, `[0x80, 0xb7]` (dec. `[184, 191]`). -- Se a carga total de uma lista (ou seja, o comprimento combinado de todos os seus itens sendo codificados em RLP) tem 0-55 bytes, a codificação RLP consiste em um único byte com valor **0xc0** mais o comprimento da lista seguida pela concatenação das codificações RLP dos itens. O intervalo do primeiro byte é, portanto, `[0x80, 0xb7]` (dec. `[192, 247]`). +- Se o total de carga de uma lista (ou seja, o comprimento combinado de totos os seus itens com codificação RLP) tiver 0 a 55 bytes de comprimento, a codificação RLP consiste em um único byte com valor **0xc0** mais o comprimento da carga seguido da concatenação das codificações dos itens. O intervalo do primeiro byte é, portanto, `[0x80, 0xb7]` (dec. `[192, 247]`). - Se o payload total de uma lista tem mais de 55 bytes de comprimento, a codificação RLP consiste em um único byte com valor **0xf7** mais o comprimento em bytes do payload na forma binária, seguida pelo comprimento do payload, seguido pela concatenação das codificações RLP dos itens. O intervalo do primeiro byte é, portanto, `[0x80, 0xb7]` (dec. `[248, 255]`). Em código, isto é: @@ -75,7 +75,7 @@ def to_binary(x): - o inteiro 0 = `[ 0x80 ]` - o inteiro codificado 0 ('\\x00') = `[ 0x00 ]` - o inteiro codificado 15 ('\\x0f') = `[ 0x00 ]` -- o inteiro codificado 1024 ('\\x04') = `[ 0x82, 0x04, 0x00 ]` +- o inteiro codificado 1024 ('\\x04') = `[ 0x82, 0x04, 0x00 ]` - [define a representação teórica](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) para três, `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc0, 0xc1, 0xc0 ]` - a string "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't' ]` @@ -113,7 +113,7 @@ def rlp_decode(input): 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)) + output += rlp_decode(substr(input, offset + dataLen)) return output def decode_length(input): diff --git a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/ssz/index.md index 1f435d3606a..f03378a49e1 100644 --- a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/ssz/index.md +++ b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/ssz/index.md @@ -109,7 +109,7 @@ Esse objeto serializado SSZ pode então ser merkleizado, o seja, transformado em Há também casos em que as folhas da árvore não se distribuem naturalmente, de maneira uniforme, como o fazem no exemplo acima. Por exemplo, a folha 4 pode ser um contêiner com vários elementos que exige "profundidade" adicional para serem adicionados à árvore Merkle, criando uma árvore desnivelada. -Em vez de nos referirmos a esses elementos da árvore como folha X, nó X etc., podemos dar a eles índices generalizados, começando com raiz = 1 e contando da esquerda para a direita ao longo de cada nível. Este é o índice generalizado explicado acima. Cada elemento na lista serializada tem um índice generalizado igual a `2**depth + idx` onde idx é sua posição indexada em zero no objeto serializado e a profundidade é o número de níveis na árvore Merkle, que pode ser determinado como a raiz quadrada do número de elementos (folhas). +Em vez de nos referirmos a esses elementos da árvore como folha X, nó X etc., podemos dar a eles índices generalizados, começando com raiz = 1 e contando da esquerda para a direita ao longo de cada nível. Este é o índice generalizado explicado acima. Cada elemento na lista serializada tem um índice genérico igual a `2**profundidade + idx`, onde o idx é a sua posição indexada por zero no objeto serializado e a profundidade é o número de níveis na árvore Merkle, que pode ser determinado como o logaritmo de base dois do número de elementos (folhas). ## Índices generalizados {#generalized-indices} diff --git a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md index 8de0c5f952a..70b036fdda7 100644 --- a/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md +++ b/public/content/translations/pt-br/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md @@ -123,18 +123,18 @@ Vetor de teste usando AES-128-CTR e Scrypt: "crypto": { "cipher": "aes-128-ctr", "cipherparams": { - "iv": "83dbcc02d8ccb40e466191a123791e0e" + "iv": "740770fce12ce862af21264dab25f1da" }, - "ciphertext": "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", + "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2", "kdf": "scrypt", "kdfparams": { "dklen": 32, "n": 262144, - "p": 8, - "r": 1, - "salt": "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" + "p": 1, + "r": 8, + "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034" }, - "mac": "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097" + "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c" }, "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", "version": 3 @@ -143,7 +143,7 @@ Vetor de teste usando AES-128-CTR e Scrypt: **Intermédios**: -`Derived key`: `fac192ceb5fd772906bea3e118a69e8bbb5cc24229e20d8766fd298291bba6bd` `MAC Body`: `bb5cc24229e20d8766fd298291bba6bdd172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c` `MAC`: `2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097` `Cipher key`: `fac192ceb5fd772906bea3e118a69e8b` +`Derived key`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` `MAC Body`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` `MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` `Cipher key`: `7446f59ecc301d2d79bc3302650d8a5c` ## Alterações da versão 1 {#alterations-from-v2} diff --git a/public/content/translations/pt-br/developers/docs/evm/index.md b/public/content/translations/pt-br/developers/docs/evm/index.md index 62409a013f9..4636eaae2ce 100644 --- a/public/content/translations/pt-br/developers/docs/evm/index.md +++ b/public/content/translations/pt-br/developers/docs/evm/index.md @@ -10,7 +10,7 @@ O próprio protocolo Ethereum existe apenas com o propósito de manter a operaç ## Pré-requisitos {#prerequisites} -Alguma familiaridade básica com a terminologia comum em ciência da computação, como [bytes](https://wikipedia.org/wiki/Byte), [memória](https://wikipedia.org/wiki/Computer_memory) e [pilha]() é necessária para entender a EVM. Também recomendamos se familiarizar com conceitos de criptografia/cadeia de blocos, como [funções hash](https://wikipedia.org/wiki/Cryptographic_hash_function) e a [árvore Merkle](https://wikipedia.org/wiki/Merkle_tree). +Alguma familiaridade básica com a terminologia comum em ciência da computação, como [bytes](https://wikipedia.org/wiki/Byte), [memória](https://wikipedia.org/wiki/Computer_memory) e [pilha](https://wikipedia.org/wiki/Stack_(abstract_data_type)) é necessária para entender a EVM. Também recomendamos se familiarizar com conceitos de criptografia/cadeia de blocos, como [funções hash](https://wikipedia.org/wiki/Cryptographic_hash_function) e a [árvore Merkle](https://wikipedia.org/wiki/Merkle_tree). ## Do livro-razão para a máquina de estado {#from-ledger-to-state-machine} @@ -64,6 +64,7 @@ Os [clientes de execução Ethereum](/developers/docs/nodes-and-clients/#executi - [evmone](https://github.com/ethereum/evmone) - _C++_ - [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_ - [eEVM](https://github.com/microsoft/eevm) - _C++_ +- [revm](https://github.com/bluealloy/revm) - _Rust_ ## Leitura adicional {#further-reading} diff --git a/public/content/translations/pt-br/developers/docs/evm/opcodes/index.md b/public/content/translations/pt-br/developers/docs/evm/opcodes/index.md index f7fdc77e4bd..de723433193 100644 --- a/public/content/translations/pt-br/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/pt-br/developers/docs/evm/opcodes/index.md @@ -14,157 +14,157 @@ Para operações com custos de gás dinâmico, consulte [gas.md](https://github. 💡 Dica rápida: Para ver linhas inteiras, use `[shift] + scroll` para rolar horizontalmente na área de trabalho. -| Pilha | Nome | Gás | Pilha inicial | Pilha resultante | Memória / Armazenamento | Observações | -| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 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` | | address of miner of current 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-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-5E | _invalid_ | | | | | | -| 5F | PUSH0 | 2 | `.` | `uint8` | | empurra o valor constante 0 para a pilha | -| 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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | | destroy contract and sends all funds to `addr` | +| Pilha | Nome | Gás | Pilha inicial | Pilha resultante | Memória / Armazenamento | Observações | +|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 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` | | address of miner of current 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-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-5E | _invalid_ | | | | | | +| 5F | PUSH0 | 2 | `.` | `uint8` | | empurra o valor constante 0 para a pilha | +| 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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | | destroy contract and sends all funds to `addr` | diff --git a/public/content/translations/pt-br/developers/docs/gas/index.md b/public/content/translations/pt-br/developers/docs/gas/index.md index 2d3458231d1..dd94bfd39df 100644 --- a/public/content/translations/pt-br/developers/docs/gas/index.md +++ b/public/content/translations/pt-br/developers/docs/gas/index.md @@ -24,7 +24,7 @@ Taxas de gas tem que ser pagas na moeda nativa do Ethereum, ether (ETH). Preços Por exemplo, em vez de dizer que seu gás custa 0.000000001 Ether, pode-se dizer que ele custa 1 Gwei. -A palavra 'gwei' é uma contração de 'giga-wei', significando 'bilhão de wei'. Um gwei é igual a um bilhão de wei. O próprio Wei (nomeado em homenagem a [Wei Dai](https://wikipedia.org/wiki/Wei_Dai), criador do [B-Money](https://www.investopedia.com/terms/b/bmoney.asp)) é a menor unidade de ETH. +A palavra 'gwei' é uma contração de 'giga-wei', significando 'bilhão de wei'. Um gwei é igual a um bilhão de wei. O próprio Wei (nomeado em homenagem a [Wei Dai](https://wikipedia.org/wiki/WeiDai), criador do [B-Money](https://www.investopedia.com/terms/b/bmoney.asp)) é a menor unidade de ETH. ## Como são calculadas as taxas de gás? {#how-are-gas-fees-calculated} @@ -55,7 +55,7 @@ Cada bloco tem uma taxa base que funciona como um preço de reserva. Para ser el A taxa base é calculada por uma fórmula que compara o tamanho do bloco anterior (a quantidade de gás utilizada para todas as transações) com o tamanho do alvo. A taxa base aumentará em um máximo de 12,5% por bloco se o tamanho do bloco de destino for excedido. Esse crescimento exponencial torna economicamente inviável que o tamanho do bloco permaneça elevado indefinidamente. | Número do bloco | Gás incluído | Aumento de taxa | Taxa base atual | -| --------------- | -----------: | --------------: | --------------: | +| --------------- | ------------:| ---------------:| ---------------:| | 1 | 15M | 0% | 100 gwei | | 2 | 30M | 0% | 100 gwei | | 3 | 30M | 12,5% | 112,5 gwei | @@ -70,7 +70,7 @@ Conforme a tabela acima, para criar uma transação no bloco número 9, uma cart Também é importante notar que, é improvável que veremos picos prolongados de blocos completos, devido à velocidade com que a taxa base aumenta antes de um bloco completo. | Número do bloco | Gás incluído | Aumento da taxa | Taxa base atual | -| --------------- | -----------: | --------------: | --------------: | +| --------------- | ------------:| ---------------:| ---------------:| | 30 | 30M | 12,5% | 2705,6 gwei | | ... | ... | 12,5% | ... | | 50 | 30M | 12,5% | 28531,3 gwei | diff --git a/public/content/translations/pt-br/developers/docs/networking-layer/index.md b/public/content/translations/pt-br/developers/docs/networking-layer/index.md index 7d6728e0d35..11d3b364887 100644 --- a/public/content/translations/pt-br/developers/docs/networking-layer/index.md +++ b/public/content/translations/pt-br/developers/docs/networking-layer/index.md @@ -125,7 +125,7 @@ Ambos os clientes de consenso e execução executam em paralelo. Eles precisam e Um resumo do fluxo de controle é mostrado abaixo, com a pilha de rede relevante entre colchetes. -### Quando o cliente de consenso não é produtor de bloco: +##### Quando o cliente de consenso não é produtor de bloco: - O cliente de consenso recebe um bloco através do protocolo gossip do bloco (consenso p2p) - O cliente de consenso pré-valida o bloco, ou seja, garante que chegou de um remetente válido com metadados corretos @@ -134,7 +134,7 @@ Um resumo do fluxo de controle é mostrado abaixo, com a pilha de rede relevante - A camada de execução passa os dados de validação de volta para a camada de consenso, bloco agora considerado validado (conexão RPC local) - A camada de consenso adiciona bloco no nício de sua própria blockchain e o atesta, transmitindo o atestado pela rede (consenso p2p) -### Quando o cliente de consenso é produtor de blocos: +##### Quando o cliente de consenso é produtor de blocos: - O cliente de consenso recebe o aviso de que é o próximo produtor de bloco (consenso p2p) - A camada de consenso chama o método `create block` no cliente de execução (RPC local) diff --git a/public/content/translations/pt-br/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/pt-br/developers/docs/networking-layer/network-addresses/index.md index 312b531d212..3f9220b964a 100644 --- a/public/content/translations/pt-br/developers/docs/networking-layer/network-addresses/index.md +++ b/public/content/translations/pt-br/developers/docs/networking-layer/network-addresses/index.md @@ -9,7 +9,7 @@ Nós Ethereum precisam se identificar com algumas informações básicas para se ## Pré-Requisitos {#prerequisites} -É necessário ter algum entendimento sobre a [camada de rede](/developers/docs/networking-layer/) do Ethereum para entender esta página. +É necessário ter algum entendimento sobre a [camada de rede](/developers/docs/networking-layer/)do Ethereum para entender esta página. ## Multiaddr {#multiaddr} diff --git a/public/content/translations/pt-br/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/pt-br/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..921bf996809 --- /dev/null +++ b/public/content/translations/pt-br/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,82 @@ +--- +title: A Rede Portal +description: Uma visão geral da Rede Portal - uma rede em desenvolvimento para dar suporte a clientes com poucos recursos. +lang: pt-br +--- + +O Ethereum é uma rede composta de computadores que rodam o software Ethereum. Cada um destes computadores é chamado de um 'nódulo'. O software cliente permite a um nódulo enviar e receber dados na rede Ethereum, e verifica os dados contra as regras do protocolo Ethereum. Nódulos mantém um monte de dados históricos no armazenamento dos seus discos e adicionam a eles quando recebem novos pacotes de informações, conhecidos como blocos, de outros nódulos da rede. Isto é necessário para sempre checar que um nódulo tem informação consistente com o resto da rede. Isto significa que rodar um nódulo pode requerer muito espaço em disco. Algumas operações de nódulos podem requerer muita memória RAM também. + +Para resolver este problema de armazenamento, nódulos 'leves' tem sido desenvolvidos para requisitar informações de nódulos completos ao invés de armazenar eles mesmos. Entretanto, isto significa o nódulo leve não verifica as informações independentemente; ao invés disso, confia em outro nódulo. Isto também significa que nós completos são necessários para pegar um trabalho extra para servir estes nós leves. + +A Rede Portal é um novo desenho de rede para o Ethereum que visa resolver o problema de disponibilidade de dados para nódulos 'leves' sem ter que confiar ou colocar pressão extra nos nódulos completos, compartilhando os dados necessários em pequenos pedaços através da rede. + +Mais sobre [nós e clientes](/developers/docs/nodes-and-clients/) + +## Por que nós precisamos da Rede Portal {#why-do-we-need-portal-network} + +Os nódulos da Ethereum armazenam sua própria cópia total ou parcial do blockchain Ethereum. Esta cópia local é usada para validar transações e garantir que o nódulo está seguindo a cadeia correta. Este dado armazenado localmente permite aos nódulos verificarem de maneira independente que os dados de chegada são válidos e corretos sem precisar acreditar em nenhuma outra entidade. + +Esta cópia local do blockchain, além de seu estado associado e do recebimento de dados tomam muito espaço no disco rígido do nódulo. Por exemplo, um disco rígido de 2TB é recomendado para rodar um nó utilizando [Geth](https://geth.ethereum.org) pareado com um cliente de consenso. Usando sincronização instantânea, que armazena apenas dados da cadeia de um conjunto de blocos relativamente recente, Geth tipicamente ocupa cerca de 650GB de espaço em disco, mas cresce cerca de 14GB/semana (você pode podar o nó de volta a 650GB periodicamente). + +Isto significa que rodar nódulos pode ser caro, porque uma grande quantidade de espaço em disco tem de ser dedicada ao Ethereum. Há diversas soluções para este problema no roadmap do Ethereum, incluindo [expiração de histórico](/roadmap/statelessness/#history-expiry), [expiração de estado](/roadmap/statelessness/#state-expiry) e [falta de estado](/roadmap/statelessness/). Entretanto, ainda há muito até que eles sejam implementados. Há também [nódulos leves](/developers/docs/nodes-and-clients/light-clients/) que não gravam suas próprias cópias dos dados da cadeia, eles solicitam os dados que eles precisam dos nódulos completos. Entretanto, isso significa que nódulos leves tem que acreditar em nódulos completos para fornecer dados honestos e também estressa os nódulos completos que tem que servir os dados para as necessidades dos nódulos leves. + +A Rede Portal visa fornecer uma maneira alternativa para nós leves terem seus dados que sem requerer confiança ou adicionar significantemente ao trabalho que tem de ser feito pelos nós completos. Isto será feito com a introdução de uma nova maneira dos nós Ethereum compartilharem dados através da rede. + +## Como a Rede Portal funciona? {#how-does-portal-network-work} + +Nós Ethereum tem protocolos estritos que definem como eles se comunicam com os outros. Clientes de execução se comunicam usando um conjunto de sub-protocolos conhecidos como [DevP2P](/developers/docs/networking-layer/#devp2p), enquanto clientes de consenso usam uma pilha diferente de sub-protocolos chamada [libP2P](/developers/docs/networking-layer/#libp2p). Eles definem os tipos de dados que podem ser passados entre nós. + +![devP2P e libP2P](portal-network-devp2p-libp2p.png) + +Os nós podem também servir dados específicos através da [API JSON-RPC](/developers/docs/apis/json-rpc/), que é como apps e carteiras trocam informações com os nós Ethereum. Entretanto, nenhum destes são protocolos ideias para servir dados para clientes leves. + +Clientes leves não podem atualmente requisitar pedaços específicos da cadeia de dados pelo DevP2P ou libP2P, porque estes protocolos são desenhados somente para habilitar sincronização de cadeias e transmissão de blocos e transações. Clientes leves não querem fazer o download desta informação, porque deixariam de ser 'leves'. + +A API JSON-RPC não é a escolha ideal para requisições de dados de clientes leves também, porque ela confia na conexão para um nó completo específico ou fornecedor de RPC centralizado que pode servir os dados. Isto significa que clientes leves tem que confiar em um específico nó/provedor ser honesto, e também o nó completo pode ter que manipular muitas requisições de muitos clientes leves, adicionando aos requisitos da sua largura de banda. + +A meta da Rede Portal é repensar todo o desenho, construindo especificamente para leveza, fora das limitações de desenho dos clientes Ethereum existentes. + +A ideia central da Rede Portal é pegar os melhores bits da pilha da rede atual habilitando informações necessárias pelos clientes leves, como dados históricos e a identidade da cabeça atual da cadeia para ser servida através de um estilo DevP2P peso leve ponto-a-ponto em uma rede descentralizada, usando um [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (similar à Bittorrent). + +A ideia é adicionar pequenas partes do histórico de dados total do Ethereum e algumas responsabilidades específicas de nós para cada nó. Então, requisições são servidas procurando os nós que armazenam o dado específico que foi requisitado e recuperando-o deles. + +Isto inverte o modelo normal de nós leves encontrando um único nó e requisitando a eles filtrar e servir grandes volumes de dados; ao invés disso, eles rapidamente filtram uma grande rede de nós onde cada um manipula pequenas quantidades de dados. + +O objetivo é permitir uma rede descentralizada de clientes Portal peso leve para: + +- rastrear a cabeça da cadeia +- sincronizar dados recentes e históricos da cadeia +- recuperar os dados de estado +- transmitir transações +- executar transações usando a [EVM](/developers/docs/evm/) + +Os benefícios deste desenho de rede são: + +- reduzir a dependência em fornecedores centralizados +- reduzir o uso de banda de internet +- minimizar ou zerar a sincronia +- ser acessível a dispositivos com restrição de recursos (<1GB RAM, <100MB de disco, 1CPU) + +O diagrama abaixo mostra as funções dos clientes existentes que podem ser entregues pela Rede Portal, habilitando ao usuários acessar estas funções em dispositivos com muito poucos recursos. + +![tabela rede portal](portal-network-table2.png) + +## Diversidade de cliente por padrão {#client-diversity-as-default} + +Os desenvolvedores da Rede Portal também fizeram com que o design assumido construísse três clientes separados na Rede Portal desde o primeiro dia. + +Os clientes da Rede Portal são: + +- [Trin](https://github.com/ethereum/trin): escrito em Rust +- [Fluffy](https://nimbus.team/docs/fluffy.html): escrito em Nim +- [Ultralight](https://github.com/ethereumjs/ultralight): escrito em Typescript + +Ter várias implementações de clientes independentes melhora a resiliência e descentralização da rede Ethereum. + +Se um cliente enfrenta problemas de vulnerabilidades, outros clientes podem continuar a operar tranquilamente, evitando o ponto único de falha. Adicionalmente, diversidade na implementação de clientes fomenta inovação e competição, conduzindo melhorias e reduzindo risco de monocultura dentro do ecossistema. + +## Leitura adicional {#futher-reading} + +- [A Rede Portal (Piper Merriam na Devcon Bogota)](https://www.youtube.com/watch?v=0stc9jnQLXA). +- [O desacordo da Rede Portal](https://discord.gg/CFFnmE7Hbs) +- [O website da Rede Portal](https://www.ethportal.net/) diff --git a/public/content/translations/pt-br/developers/docs/networks/index.md b/public/content/translations/pt-br/developers/docs/networks/index.md index ec72e59b0fe..f01cbe3f3da 100644 --- a/public/content/translations/pt-br/developers/docs/networks/index.md +++ b/public/content/translations/pt-br/developers/docs/networks/index.md @@ -38,7 +38,7 @@ As duas redes de testes públicas que os desenvolvedores dos clientes estão atu #### Sepolia {#sepolia} -\*\*\*\*Sepolia é a rede de teste padrão recomendada para desenvolvimento de aplicativos. A rede Sepolia usa um conjunto de validadores autorizados. É bastante novo, o que significa que seu estado e história são bastante pequenos. Isso significa que a rede é rápida para sincronizar e que a execução de um nó requer menos armazenamento. Isso é útil para usuários que desejam ativar rapidamente um nó e interagir diretamente com a rede. +****Sepolia é a rede de teste padrão recomendada para desenvolvimento de aplicativos. A rede Sepolia usa um conjunto de validadores autorizados. É bastante novo, o que significa que seu estado e história são bastante pequenos. Isso significa que a rede é rápida para sincronizar e que a execução de um nó requer menos armazenamento. Isso é útil para usuários que desejam ativar rapidamente um nó e interagir diretamente com a rede. - Conjunto de validadores fechado, controlado pelo cliente & equipes de teste - Nova rede de teste, menos aplicativos implantados que outras redes de teste @@ -56,10 +56,11 @@ As duas redes de testes públicas que os desenvolvedores dos clientes estão atu - [Faucet do QuickNode Sepolia](https://faucet.quicknode.com/drip) - [Grabteeth](https://grabteeth.xyz/) - [Faucet de PoW](https://sepolia-faucet.pk910.de/) -- [Faucet da Carteira da Coinbase | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) +- [Faucet da Carteira Coinbase | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Faucet do Alchemy Sepolia](https://sepoliafaucet.com/) - [Faucet do Infura Sepolia](https://www.infura.io/faucet) - [Faucet da Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Faucet da rede de teste | Sepolia](https://testnet-faucet.com/sepolia/) #### Goerli _(suporte a longo prazo)_ {#goerli} @@ -102,7 +103,7 @@ Uma rede de testes para [Arbitrum](https://arbitrum.io/). - [Faucet do Chainlink](https://faucets.chain.link/) -#### Goerli otimista {#optimistic-goerli} +#### Optimistic Goerli {#optimistic-goerli} Uma rede de testes para [Optimism](https://www.optimism.io/). @@ -111,26 +112,34 @@ Uma rede de testes para [Optimism](https://www.optimism.io/). - [Faucet Paradigm](https://faucet.paradigm.xyz/) - [Coinbase Wallet Faucet | Optimism Goerli](https://coinbase.com/faucets/optimism-goerli-faucet) +#### Starknet Goerli {#starknet-goerli} + +Uma rede de teste para [Starknet](https://www.starknet.io). + +##### Faucets + +- [Faucet da Starknet](https://faucet.goerli.starknet.io) + ## Redes privadas {#private-networks} -Uma rede Ethereum é uma rede privada se seus nós não estiverem conectados a uma rede pública (ex: Rede principal e rede de testes). Neste contexto, privado significa apenas reservado ou isolado, em vez de protegido ou seguro. +Uma rede Ethereum é uma rede privada se seus nódulos não estiverem conectados a uma rede pública (ex: Rede principal e rede de testes). Neste contexto, privado significa apenas reservado ou isolado, em vez de protegido ou seguro. ### Redes de desenvolvimento {#development-networks} -Para desenvolver um aplicativo Ethereum, você deve executá-lo em uma rede privada para ver como funciona antes de implantá-lo. Tal como você pode criar um servidor local em seu computador para desenvolvimento Web, você pode criar uma instância local de cadeia de blocos para testar seu dapp. Isso permite uma iteração muito mais rápida do que uma rede de testes pública. +Para desenvolver um aplicativo Ethereum, você deve executá-lo em uma rede privada para ver como funciona antes de implantá-lo. Tal como você pode criar um servidor local em seu computador para desenvolvimento Web, você pode criar uma instância local de blockchain para testar seu dapp. Isso permite uma iteração muito mais rápida do que uma rede de testes pública. Existem projetos e ferramentas dedicadas a ajudá-lo com isso. Saiba mais sobre [redes de desenvolvimento](/developers/docs/development-networks/). ### Redes de consórcio {#consortium-networks} -O processo de consenso é controlado por um conjunto predefinido de nós confiáveis. Por exemplo, uma rede privada de instituições acadêmicas conhecidas, cada uma administrando um único nó, e os blocos são validados por um limite de signatários dentro da rede. +O processo de consenso é controlado por um conjunto predefinido de nódulos confiáveis. Por exemplo, uma rede privada de instituições acadêmicas conhecidas, cada uma administrando um único nódulo, e os blocos são validados por um limite de signatários na rede. Se uma rede pública Ethereum é como a internet pública, uma rede de consórcio é como uma intranet privada. ## Ferramentas relacionadas {#related-tools} - [Chainlist](https://chainlist.org/) _Lista de redes EVM para conectar carteiras e fornecedores aos identificadores de cadeia e rede apropriados_ -- [/Cadeias baseadas na EVM](https://github.com/ethereum-lists/chains) _repositório do GitHub com metadados de cadeias que alimenta a Chainlist_ +- [/Cadeias baseadas em EVM](https://github.com/ethereum-lists/chains) _Repositório do GitHub com metadados de cadeias que alimenta a Chainlist_ ## Leitura adicional {#further-reading} diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/archive-nodes/index.md index c9cfe4ef61a..9ec5ad14275 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/archive-nodes/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -70,7 +70,7 @@ Durante a sincronização inicial, os clientes no modo arquivo executarão todas ## Leitura adicional {#further-reading} -- [Nó completo Ethereum vs Nó de arquivo](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) — _QuickNode, setembro de 2022_ +- [Nó completo Ethereum vs Nó de arquivo](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) — *QuickNode, setembro de 2022* - [Construindo seu próprio nó de arquivo Ethereum](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) — _Thomas Jay Rush, agosto de 2021_ - [Como configurar Erigon, o RPC do Erigon e TrueBlocks (extração e API) como serviços](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– Magnus Hansson, atualizado em setembro de 2022_ diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/client-diversity/index.md index 18bad4e622a..f5061c43027 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/client-diversity/index.md @@ -31,7 +31,7 @@ A diversidade de clientes também oferece resiliência a ataques. Por exemplo, u Um erro em um cliente de consenso com mais de 33% dos nós Ethereum poderia impedir a finalização da camada de consenso, e isso deixaria os utilizadores em dúvida com respeito à probabilidade de as transações não serem revertidas ou alteradas em algum momento. Isso seria muito problemático para muitos dos aplicativos construídos em cima do Ethereum, particularmente o DeFi. - Pior ainda, um bug crítico em um cliente com uma maioria de dois terços poderia fazer com que a cadeia se dividisse e finalizasse incorretamente, gerando um grande conjunto de validadores que ficam presos em uma cadeia inválida. Se quiserem voltar a integrar à cadeia correta, esses validadores enfrentam cortes ou uma lenta e cara retirada e reativação voluntária. A magnitude de uma escala de remoção com o número de nós culpáveis com uma maioria de dois terços reduzido ao máximo (32 ETH). + Pior ainda, um bug crítico em um cliente com uma maioria de dois terços poderia fazer com que a cadeia se dividisse e finalizasse incorretamente, gerando um grande conjunto de validadores que ficam presos em uma cadeia inválida. Se quiserem voltar a integrar à cadeia correta, esses validadores enfrentam cortes ou uma lenta e cara retirada e reativação voluntária. A magnitude de uma escala de remoção com o número de nós culpáveis com uma maioria de dois terços reduzido ao máximo (32 ETH). Embora estes sejam cenários improváveis, o ecossistema Ethereum pode mitigar seus riscos nivelando a distribuição de clientes entre os nós ativos. Idealmente, nenhum cliente de consenso chegaria a uma participação de 33% dos nós totais. diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md index 388bf230b61..6df51a16938 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md @@ -136,6 +136,7 @@ Essa tabela resume os diferentes clientes. Todos eles passam por [testes de clie | [Nethermind](http://nethermind.io/) | C#, .NET | Linux, Windows, macOS | Rede principal, Sepolia, Goerli, e outras | Instantâneo (sem servidor), Rápido, Completo | Arquivo, Removido | | [Besu](https://besu.hyperledger.org/en/stable/) | Java | Linux, Windows, macOS | Rede principal, Sepolia, Goerli, e outras | Instantâneo, Rápido, Completo | Arquivo, Removido | | [Erigon](https://github.com/ledgerwatch/erigon) | Go | Linux, Windows, macOS | Rede principal, Sepolia, Goerli, e outras | Completo | Arquivo, Removido | +| [Reth](https://github.com/paradigmxyz/reth) | Rust | Linux, Windows, macOS | Rede principal, Sepolia, Goerli, e outras | Completo | Arquivo, Removido | Para saber mais sobre redes suportadas, leia sobre as [redes Ethereum](/developers/docs/networks/). diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md index 3d021ef8e24..b1e0b4587b3 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/run-a-node/index.md @@ -151,7 +151,7 @@ Aqui estão as páginas de lançamento dos clientes, nas quais você pode encont ##### Clientes de execução - [Besu](https://github.com/hyperledger/besu/releases) -- [Erigon](https://github.com/ledgerwatch/erigon#usage) (não fornece um binário pré-compilado, precisa ser compilado) +- [Erigon](https://github.com/ledgerwatch/erigon/releases) - [Geth](https://geth.ethereum.org/downloads/) - [Nethermind](https://downloads.nethermind.io/) diff --git a/public/content/translations/pt-br/developers/docs/scaling/index.md b/public/content/translations/pt-br/developers/docs/scaling/index.md index 93f8d3de54b..a1ec38088d1 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/index.md @@ -21,27 +21,25 @@ Você deveria ter um bom entendimento de todos os tópicos fundamentais. Impleme ## Dimensionamento on-chain {#on-chain-scaling} -Este método de dimensionamento requer alterações no protocolo Ethereum ([rede principal](/glossary/#mainnet) da camada 1). A fragmentação é atualmente o principal objetivo deste método de dimensionamento. +A escalabilidade em cadeia requer mudanças no protocolo do Ethereum ([Mainnet](/glossary/#mainnet) de camada 1). A solução de fragmentação da blockchain era aguardada há muito tempo para escalar o Ethereum. Isso implicava dividir a blockchain em partes discretas (fragmentos), que seriam verificadas por subconjuntos de validadores. No entanto, a técnica de escalabilidade principal adotada foi a de escalar por rollups de camada 2. Ela é suportada pela adição de uma nova forma mais barata de dados anexados aos blocos Ethereum, que foi especialmente criada para tornar os rollups baratos para os usuários. ### Fragmentação {#sharding} -A fragmentação é o processo de dividir um banco de dados horizontalmente para repartir a carga de trabalho. No contexto do Ethereum, a fragmentação reduzirá o congestionamento da rede e aumentará o número de transações por segundo graças à geração de novas cadeias conhecidas como "fragmentos". Isso também irá aliviar a carga para cada validador, que não precisará mais processar a totalidade de todas as transações da rede. - -Saiba mais sobre [fragmentação](/roadmap/danksharding/). +Fragmentação é o processo de dividir um banco de dados. Subconjuntos de validadores seriam responsáveis por seus próprios fragmentos, em vez de manter o controle de todo o Ethereum. A fragmentação esteve no [planejamento](/roadmap/) do Ethereum por muito tempo, com a intenção de ser enviada para prova de participação antes do The Merge (A Fusão). No entanto, o rápido desenvolvimento de [rollups de camada 2](#layer-2-scaling) e a invenção do [Danksharding](/roadmap/danksharding) (adicionando blobs de dados do rollup para blocos do Ethereum que podem ser verificados eficientemente pelos validadores) têm levado a comunidade Ethereum a preferir o dimensionamento centrado por rollup em vez do dimensionamento por fragmentação. Isso também ajudará a manter a lógica de consenso do Ethereum mais simples. ## Dimensionamento off-chain {#off-chain-scaling} -As soluções off-chain são implementadas separadamente da rede principal da camada 1. Ou seja, elas não requerem alterações no protocolo Ethereum Ethereum existente. Algumas soluções, conhecidas como soluções de "camada 2", derivam sua segurança diretamente do consenso da camada 1 do Ethereum, por exemplo, os [optimistic rollups](/developers/docs/scaling/layer-2-rollups/), os [rollups de conhecimento zero](/developers/docs/scaling/zk-rollups/) ou os [canais de estado](/developers/docs/scaling/state-channels/). Outras soluções envolvem a criação de novas cadeias em várias formas que derivam sua segurança separadamente da rede principal, como [sidechains](#sidechains), [validiums](#validium) ou [cadeias Plasma](#plasma). Essas soluções se comunicam com a rede principal, mas derivam sua segurança de forma diferente para obter uma variedade de objetivos. +As soluções off-chain são implementadas separadamente da rede principal da camada 1. Ou seja, elas não requerem alterações no protocolo Ethereum existente. Algumas soluções, conhecidas como soluções de “camada 2”, obtêm sua segurança diretamente do consenso da camada 1 do Ethereum, por exemplo, os [rollups otimistas](/developers/docs/scaling/layer-2-rollups/), os [rollups de conhecimento zero](/developers/docs/scaling/zk-rollups/) ou os [canais de estado](/developers/docs/scaling/state-channels/). Outras soluções envolvem a criação de novas cadeias em várias formas, que obtêm sua segurança separadamente da Mainnet (Rede principal), como [cadeias laterais](#sidechains), [validiums](#validium) ou [cadeias Plasma](#plasma). Essas soluções se comunicam com a Mainnet (Rede principal), mas obtêm sua segurança de forma diferente para alcançar uma variedade de objetivos. ### Dimensionamento da camada 2 {#layer-2-scaling} -Esta categoria de soluções off-chain deriva a sua segurança da rede principal do Ethereum. +Esta categoria de soluções off-chain obtém sua segurança da Mainnet (Rede principal) do Ethereum. -A camada 2 é um termo coletivo para soluções projetadas para ajudar a dimensionar os aplicativos, manipulando para isso as transações fora da rede principal (camada 1) de Ethereum, tirando proveito do robusto modelo de segurança descentralizada fornecido pela rede principal. A velocidade das transações sofre quando a rede está ocupada, o que pode tornar a experiência do usuário ruim para certos tipos de dapps. E à medida que a rede fica mais movimentada, os preços do gás tendem a aumentar devido a que os remetentes das transações tendem a oferecer mais para processar sua transação antes que as dos outros. E essa conjuntura pode tornar o uso do Ethereum bem mais caro. +A camada 2 é um termo coletivo de soluções projetadas para ajudar a dimensionar os aplicativos, gerenciando transações fora da rede principal (camada 1) do Ethereum, aproveitando o robusto modelo de segurança descentralizada da Mainnet (Rede principal). A velocidade das transações é reduzida quando a rede está ocupada, o que pode tornar a experiência do usuário ruim para certos tipos de dapps. À medida que a rede fica mais movimentada, os preços do gás aumentam, pois os remetentes de transações tendem a oferecer mais para processar sua transação antes das dos outros. Isso pode tornar o uso do Ethereum bem mais caro. -A maioria das soluções de camada 2 orbitam ao redor de um servidor, ou cluster de servidores, cada um dos quais pode ser referenciado como um nó, como um validador, como um operador, como um sequenciador de transações, como um produtor de blocos ou como algo semelhante. Dependendo da implementação, esses nós da camada 2 podem ser executados pelos indivíduos, pelas empresas ou pelas entidades que os usam, ou por um operador de terceiros, ou ainda por um grande grupo de indivíduos (da maneira similar à rede principal). Em geral, ao invés de serem enviadas diretamente para a camada 1 (rede principal), as transações são submetidas a esses nós da camada 2. Para algumas soluções, a camada 2 instancia as transações e as agrupa antes de ancorá-las à camada 1. Depois disso, elas são protegidas pela própria camada 1 e não podem ser mais alteradas. Os pormenores de como isso é feito variam significativamente entre diferentes tecnologias de camada 2 e suas diferentes implementações. +A maioria das soluções de camada 2 são centralizadas em torno de um servidor ou cluster de servidores, cada um dos quais pode ser referenciado como um nó, validador, operador, sequenciador, produtor de bloco, ou um termo semelhante. Dependendo da implementação, esses nós da camada 2 podem ser executados pelos indivíduos, empresas ou entidades que os usam, por um operador de terceiros ou por um grande grupo de indivíduos (semelhante à Mainnet). Em geral, as transações são submetidas a esses nós de camada 2, em vez de serem enviadas diretamente para a camada 1 (Mainnet). Para algumas soluções, a instância da camada 2 agrupa-os em grupos antes de ancorá-los na camada 1, na qual ficam protegidos e não podem ser alterados. Os pormenores de como isso é feito variam significativamente entre diferentes tecnologias de camada 2 e implementações. -Uma instância específica da camada 2 pode ser aberta e compartilhada por muitos aplicativos, ou pode ser implantada por um projeto e dedicada especificamente a apoiar apenas seu aplicativos. +Uma instância específica da camada 2 pode ser aberta e compartilhada por muitos aplicativos, ou pode ser implantada por um projeto e dedicada a dar suporte apenas ao seu aplicativo. #### Por que a camada 2 é necessária? {#why-is-layer-2-needed} @@ -54,36 +52,36 @@ Uma instância específica da camada 2 pode ser aberta e compartilhada por muito #### Rollups {#rollups} -Os rollups levam a execução das transações para fora da camada 1 e, posteriormente, tais dados são reportados para a camada 1, onde o consenso é alcançado. Como os dados de transação estão incluídos nos blocos da camada 1, isso permite que os rollups sejam protegidos pela segurança nativa do Ethereum. +Os rollups executam a transação fora da camada 1 e, em seguida, os dados são publicados na camada 1, na qual o consenso é alcançado. Como os dados de transação estão incluídos nos blocos da camada 1, isso permite que os rollups fiquem protegidos pela segurança nativa da Ethereum. -Existem dois tipos de rolllups com diferentes modelos de segurança: +Existem dois tipos de rollups com diferentes modelos de segurança: - **Optimistic rollups**: assumem que as transações são válidas por padrão e só executam computação através de uma [**prova de fraude**](/glossary/#fraud-proof), caso alguém levante alguma objeção. [Mais sobre optimistic-rollups](/developers/docs/scaling/optimistic-rollups/). - **Rollups de conhecimento zero**: executam a computação off-chain e enviam uma [**prova de validade**](/glossary/#validity-proof) para a cadeia. [Mais sobre rollups de conhecimento zero](/developers/docs/scaling/zk-rollups/). #### Canais de Estado {#channels} -Os canais de estado utilizam contratos multisig para permitir que os participantes façam transações de forma rápida e livre off-chain, e em seguida, liquidam a finalidade com a rede principal. Isto minimiza o congestionamento, as taxas e os atrasos na rede. Neste momento, existem dois tipos de canais: canais de estado e canais de pagamento. +Os canais de estado utilizam contratos multisig para permitir que os participantes realizem transações de forma rápida e livre off-chain para, em seguida, liquidar a finalidade com a Mainnet. Isso minimiza o congestionamento, as taxas e os atrasos na rede. Atualmente, existem dois tipos de canais: canais de estado e canais de pagamento. -Saiba mais sobre [canais de estado](/developers/docs/scaling/state-channels/). +Aprenda mais sobre [canais de estado](/developers/docs/scaling/state-channels/). ### Correntes paralelas {#sidechains} -Uma sidechain é uma blockchain independente e compatível com EVM que se executa em paralelo com a rede principal. Essas são compatíveis com Ethereum através de pontes de dois sentidos e são executadas de acordo com as regras de consenso escolhidas e com os parâmetros do bloco. +Uma sidechain (cadeia paralela) é uma blockchain independente e compatível com EVM que roda em paralelo à Mainnet (Rede principal). As sidechains são compatíveis com o Ethereum através de pontes bidirecionais e são executadas conforme as regras de consenso escolhidas e os parâmetros do bloco. Saiba mais sobre [Sidechains](/developers/docs/scaling/sidechains/). ### Plasma {#plasma} -A cadeia Plasma é uma blockchain separada que é ancorada à cadeia principal do Ethereum, e usa provas de fraude (como as [optimistic rollups](/developers/docs/scaling/optimistic-rollups/)) para arbitrar disputas. +A cadeia plasma é uma blockchain separada que é ancorada à cadeia principal do Ethereum e usa provas de fraude (como os [rollups otimistas](/developers/docs/scaling/optimistic-rollups/)) para arbitrar litígios. -Saiba mais sobre [Plasma](/developers/docs/scaling/plasma/). +Aprenda mais sobre o [Plasma](/developers/docs/scaling/plasma/). ### Validium {#validium} Uma cadeia Validium usa provas de validade como rollups de conhecimento zero, mas os dados não são armazenados na cadeia Ethereum da camada 1 principal. Isso pode levar a 10 mil transações por segundo por cadeia Validium, e várias cadeias podem ser executadas em paralelo. -Saiba mais sobre [fragmentação](/developers/docs/scaling/validium/). +Saiba mais sobre o [Validium](/developers/docs/scaling/validium/). ## Por que tantas soluções de dimensionamento são necessárias? {#why-do-we-need-these} @@ -96,7 +94,7 @@ Saiba mais sobre [fragmentação](/developers/docs/scaling/validium/). -_Note que a explicação no vídeo usa o termo "Camada 2" para se referir a todas as soluções de escalonamento off-chain enquanto diferenciamos a "Camada 2" como uma solução off-chain que deriva sua segurança através do consenso principal da camada 1._ +_Observe que a explicação no vídeo usa o termo “Camada 2" para se referir a todas as soluções de escalabilidade off-chain, enquanto nós diferenciamos a “Camada 2" como uma solução off-chain que deriva sua segurança a partir do consenso da Mainnet (Rede principal) de camada 1._ @@ -112,4 +110,4 @@ _Note que a explicação no vídeo usa o termo "Camada 2" para se referir a toda - [Por que os rollups, junto com as fragmentações dos dados, são a única solução sustentável para atingir alto dimensionamento](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) - [Que tipo de camada 3 faz sentido?](https://vitalik.ca/general/2022/09/17/layer_3.html) -_Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ +_Conhece um recurso da comunidade que te ajudou? Edite essa página e adicione!_ diff --git a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md index 7e03809f057..361204091b1 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md @@ -198,7 +198,7 @@ Os optimistic rollups usam um esquema de taxa de gás, muito parecido com o Ethe 2. **`calldata`**: além da taxa básica de transação, o custo de cada escrita de estado depende do tamanho de `calldata` publicado na L1. Os custos de `calldata` são atualmente regidos por [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), que estipula um custo de 16 gás para bytes diferentes de zero e 4 gás para zero bytes de `calldata`, respectivamente. Para reduzir as taxas do usuário, os operadores de rollup compactam as transações para reduzir o número de bytes `calldata` publicados no Ethereum. -3. **Taxas do operador L2**: este é o valor pago aos nós de rollup como compensação pelos custos computacionais incorridos no processamento de transações, assim como as taxas do minerador no Ethereum. Os nós de rollup cobram taxas de transação mais baixas, pois os L2s têm capacidades de processamento mais altas e não enfrentam congestionamentos de rede que forçam os mineradores no Ethereum a priorizar transações com taxas mais altas. +3. **Taxas do operador L2**: Este é o valor pago aos nódulos de rollup como compensação pelos custos computacionais decorrentes do processamento de transações, muito parecido com as taxas de Gas no Ethereum. Os nódulos de rollup cobram taxas de transação mais baixas, já que as L2s têm capacidades de processamento mais altas e não enfrentam os congestionamentos de rede, que forçam os validadores no Ethereum a priorizar transações com taxas mais altas. Os optimistic rollups aplicam vários mecanismos para reduzir as taxas para os usuários, incluindo transações em lote e compactando `calldata` para reduzir os custos de publicação de dados. Você pode verificar o [rastreador de taxas L2](https://l2fees.info/), para ter uma ideia geral real do custo de uso de optimistic rollups baseados em Ethereum. @@ -229,7 +229,7 @@ Fazer alguns cálculos aproximados sobre esses números pode ajudar a mostrar as Esta é uma estimativa bastante otimista, uma vez que as transações de optimistic rollups não podem abranger um bloco inteiro no Ethereum. No entanto, pode dar uma ideia aproximada de quantos ganhos de dimensionamento os optimistic rollups podem proporcionar aos usuários do Ethereum (as implementações atuais oferecem até 2.000 TPS). -Espera-se que a introdução de [particionamento de dados (sharding)](/roadmap/danksharding/) no Ethereum melhore o dimensionamento do optimistic rollup. Como as transações de rollup devem compartilhar o espaço de blocos (blockspace) com outras transações não-rollup, sua capacidade de processamento é limitada pela taxa de transferência de dados na cadeia principal do Ethereum. O particionamento aumentará o espaço disponível para as cadeias L2, para publicar dados por bloco, aumentando ainda mais a taxa de transferência nos rollups. +Espera-se que a introdução de [fragmentação (sharding) de dados](/roadmap/danksharding/) no Ethereum melhore o dimensionamento do rollup otimista. Como as transações de rollup devem compartilhar o espaço de blocos (blockspace) com outras transações não-rollup, sua capacidade de processamento é limitada pela taxa de transferência de dados na cadeia principal do Ethereum. Danksharding aumentará o espaço disponível para que cadeias L2 publiquem dados por bloco, usando armazenamento de “blob” impermanente e mais barato em vez de `CALLDATA`, que é permanente e caro. ### Prós e contras dos optimistic rollups {#optimistic-rollups-pros-and-cons} diff --git a/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md b/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md index 3339bb28c39..54bbfe417cc 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md @@ -150,20 +150,19 @@ Inversamente, as cadeias Plasma derivam sua segurança da rede principal. Isto a ### Plasma vs fragmentação (sharding) {#plasma-vs-sharding} -Tanto as cadeias Plasma quanto as [cadeias de shard](/roadmap/danksharding/) publicam periodicamente provas criptográficas para a rede principal do Ethereum. No entanto, ambas têm propriedades de segurança diferentes. +Tanto as cadeias plasma quanto as cadeias de fragmentos periodicamente publicam provas criptográficas na Mainnet (Rede principal) do Ethereum. No entanto, ambas têm propriedades de segurança diferentes. As cadeias de shard gravam "cabeçalhos de agrupamento" na rede principal contendo informações detalhadas sobre cada shard de dados. Os nós na rede principal verificam e garantem a validade de shards de dados, reduzindo a possibilidade de transições de shards inválidos e protegendo a rede contra atividades maliciosas. A cadeia Plasma é diferente porque a rede principal só recebe informação mínima sobre o estado das cadeias filhas. Isto significa que rede principal não pode verificar eficazmente as transações realizadas em cadeias filhas, tornando-as menos seguras. +**Observe** que fragmentar a blockchain Ethereum não está mais no roteiro. Ela foi substituída por escalabilidade via rollups e [Danksharding](/roadmap/danksharding). + ### Usar a cadeia Plasma {#use-plasma} Vários projetos fornecem implementações da cadeia Plasma que você pode integrar aos seus dapps: -- [OMG Network](https://omg.network/) - [Polygon](https://polygon.technology/) (anteriormente Matic Network) -- [Gluon](https://gluon.network/) -- [LeapDAO](https://ipfs.leapdao.org/) ## Leitura adicional {#further-reading} @@ -173,4 +172,4 @@ Vários projetos fornecem implementações da cadeia Plasma que você pode integ - [Entenda a cadeia Plasma - parte 1: O básico](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) - [A vida e a morte da cadeia Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) -_Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ +_Conhece um recurso da comunidade que te ajudou? Edite essa página e adicione!_ diff --git a/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md b/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md index b82f9847c5b..d2918d7a0d7 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md @@ -18,7 +18,7 @@ As sidechains são blockchains independentes, com diferentes histórias, roteiro Uma das qualidades que tornam as sidechains únicas (ou seja, diferentes do Ethereum) é o algoritmo de consenso usado. As sidechains não contam com o Ethereum para consenso e podem escolher protocolos de consenso alternativos que atendam às suas necessidades. Alguns exemplos de algoritmos de consenso usados nas sidechains incluem: - [Prova de autoridade](https://wikipedia.org/wiki/Proof_of_authority) -- [Prova de participação delegada](https://en.bitcoinwiki.org/wiki/DPoS) +- [Prova de participação delegada](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) - [Tolerância a falhas bizantinas](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained). Como o Ethereum, as sidechains têm nós de validação que verificam e processam transações, produzem blocos e armazenam o estado da blockchain. Os validadores são também responsáveis por manterem o consenso em toda a rede e protegê-la contra ataques maliciosos. diff --git a/public/content/translations/pt-br/developers/docs/scaling/validium/index.md b/public/content/translations/pt-br/developers/docs/scaling/validium/index.md index e5f5882fb8b..b4976043580 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/validium/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/validium/index.md @@ -121,7 +121,7 @@ Algumas equipes, no entanto, estão tentando otimizar opcodes de EVM existentes ### 1. Armazenamento de dados off-chain {#off-chain-data-storage} -Projetos de dimensionamento de camada 2, como optimistic rollups e ZK-rollups, negociam o dimensionamento infinito de protocolos de dimensionamento off-chain puros (por exemplo, [Plasma](/developers/docs/scaling/plasma/)) para fins de segurança, publicando alguns dados de transação na L1. Mas isso significa que as propriedades de dimensionamento dos rollups são limitadas pela banda de dados na rede principal do Ethereum (a [fragmentação (sharding) de dados](/roadmap/danksharding/) propõe melhorar a capacidade de armazenamento de dados do Ethereum por este motivo). +Projetos de dimensionamento de camada 2, como optimistic rollups e ZK-rollups, negociam o dimensionamento infinito de protocolos de dimensionamento off-chain puros (por exemplo, [Plasma](/developers/docs/scaling/plasma/)) para fins de segurança, publicando alguns dados de transação na L1. Mas isso significa que as propriedades de dimensionamento dos rollups são limitadas pela largura de banda na Mainnet (Rede principal) do Ethereum (a [fragmentação (sharding) de dados](/roadmap/danksharding/) propõe melhorar a capacidade de armazenamento de dados do Ethereum por este motivo). Os validiums alcançam o dimensionamento mantendo todos os dados de transação off-chain e apenas publicando compromissos do estado (e provas de validade) ao transmitir atualizações de estado para a cadeia principal do Ethereum. A existência de provas de validade, no entanto, dá aos validiums garantias de segurança mais elevadas do que outras soluções de dimensionamento off-chain puras, incluindo Plasma e [sidechains](/developers/docs/scaling/sidechains/). Ao reduzir a quantidade de dados que o Ethereum precisa processar antes de validar transações off-chain, os desenhos de validiums estendem muito a taxa de transferência na rede principal. diff --git a/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md index 7da116c6973..943f4763229 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md @@ -1,6 +1,6 @@ --- title: Rollups de conhecimento zero -description: "Uma introdução aos rollups de zero conhecimento: uma solução de dimensionamento usada pela comunidade Ethereum." +description: 'Uma introdução aos rollups de zero conhecimento: uma solução de dimensionamento usada pela comunidade Ethereum.' lang: pt-br --- @@ -12,7 +12,7 @@ Você deve ler e entender mais sobre em nossa página [Ethereum scaling](/develo ## O que são rollups de conhecimento zero? {#what-are-zk-rollups} -**Rollups de conhecimento zero (ZK-rollups)** agrupam (ou acumulam) transações em lotes que são executados off-chain. A computação off-chain reduz a quantidade de dados que devem ser publicados na blockchain. Operadores de ZK-rollups submetem um resumo das mudanças necessárias para representar todas as transações em um lote, ao invés de enviar cada transação individualmente. Eles também produzem [provas de validade](/glossary/#validity-proof) para provar a exatidão de suas mudanças. A prova de validade demonstra com certeza criptográfica que as alterações propostas para o estado do Ethereum são verdadeiramente o resultado final da execução de todas as transações do referido lote. +**Rollups de conhecimento zero (ZK-rollups)** agrupam (ou acumulam) transações em lotes que são executados off-chain. A computação off-chain reduz a quantidade de dados que devem ser publicados na blockchain. Operadores de ZK-rollups submetem um resumo das mudanças necessárias para representar todas as transações em um lote, ao invés de enviar cada transação individualmente. Eles também produzem [provas de validade](/glossary/#validity-proof) para provar a exatidão de suas mudanças. O estado dos ZK-rollups é mantido por um contrato inteligente implantado na rede Ethereum. Para atualizar este estado, os nós ZK-rollup devem enviar uma prova de validade para verificação. Como mencionado, a prova de validade é uma garantia criptográfica de que a mudança de estado proposta pelo rollup é realmente o resultado da execução de um determinado lote de transações. Isso significa que os ZK-rollups só precisam fornecer provas de validade para finalizar as transações no Ethereum, em vez de publicar todos os dados da transação on-chain, como [optimistic rollups](/developers/docs/scaling/optimistic-rollups/). @@ -117,7 +117,7 @@ Antes de aceitar transações, o operador realizará as verificações habituais Uma vez que o nó ZK-rollup tenha transações suficientes, ele as agrega em um lote e compila entradas para o circuito de prova para reunir em uma prova ZK sucinta. Isso pode incluir: -- Uma árvore de Merkle composta de todas as transações no lote. +- A Merkle tree root comprising all the transactions in the batch. - Provas de Merkle de transações para provar a inclusão no lote. - Provas de Merkle para cada par de destinatário-remetente em transações para provar que essas contas são parte da árvore de estado do rollup. - Um conjunto de raízes de estado intermediárias, derivadas da atualização da raiz de estado após a aplicação de atualizações de estado para cada transação (ou seja, diminuindo as contas do remetente e aumentando as contas do destinatário). @@ -232,13 +232,17 @@ Existem várias implementações de ZK-rollups que você pode integrar aos seus Os projetos que trabalham em zkEVMs incluem: -- **[ZKSync](https://docs.zksync.io/zkevm/)**: _o ZkSync 2.0 é um ZK-rollup compatível com EVM sendo desenvolvido pelo Matter Labs, com tecnologia de seu próprio zkEVM._ +- **[Applied ZKP](https://github.com/privacy-scaling-explorations/zkevm-specs)** — _Applied ZKP é um projeto financiado pela Ethereum Foundation para desenvolver um ZK-rollup compatível com EVM e um mecanismo para gerar provas de validade para blocos Ethereum._ -- **[Applied ZKP](https://github.com/privacy-scaling-explorations/zkevm-specs)**: _Applied ZKP é um projeto financiado pela Ethereum Foundation para desenvolver um ZK-rollup compatível com EVM e um mecanismo para gerar provas de validade para blocos Ethereum._ +- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** — _é um ZK-Rollup descentralizado na rede principal do Ethereum que trabalha em uma Máquina Virtual Ethereum de conhecimento zero (zkEVM) e executa transações do Ethereum de maneira transparente, incluindo contratos inteligentes com validações de prova de conhecimento._ - **[Scroll](https://scroll.io/blog/zkEVM)**: _Scroll é uma empresa impulsionada pela tecnologia que trabalha no desenvolvimento de uma solução nativa zkEVM de camada 2 para Ethereum._ -- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)**: _é um ZK-Rollup descentralizado na rede principal do Ethereum trabalhando em uma Máquina Virtual Ethereum de conhecimento zero (zkEVM) que executa transações Ethereum de maneira transparente, incluindo contratos inteligentes com validações de prova de conhecimento._ +- **[Taiko](https://taiko.xyz)** - _Taiko é um ZK-rollup descentralizado, equivalente ao Ethereum (um [ZK-EVM do Tipo 1](https://vitalik.ca/general/2022/08/04/zkevm.html))._ + +- **[ZKSync](https://docs.zksync.io/zkevm/)** - _ZkSync Era is an EVM-compatible ZK Rollup built by Matter Labs, powered by its own zkEVM._ + +- **[Starknet](https://starkware.co/starknet/)** - _StarkNet is an EVM-compatible layer 2 scaling solution built by StarkWare._ ## Leitura adicional sobre leitura de ZK-rollups {#further-reading-on-zk-rollups} diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/anatomy/index.md index a90ea39c778..5f2ade26179 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/anatomy/index.md @@ -6,7 +6,7 @@ lang: pt-br Um contrato inteligente (smart contract) é um programa executado em um endereço na Ethereum. Eles são compostos por dados e funções que podem ser executadas ao receber uma transação. Veja aqui uma visão geral do que compõe um contrato inteligente. -## Pré-requisitos {#prerequisites} +### Pré-requisitos {#prerequisites} Não deixe de ler sobre [contratos inteligentes](/developers/docs/smart-contracts/). Este documento presume que você já está familiarizado com linguagens de programação como JavaScript ou Python. diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/compiling/index.md index f5a47a51143..5fbdb5fe5fe 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/compiling/index.md @@ -7,7 +7,7 @@ incomplete: true Você precisa compilar seu contrato para que seu aplicativo web e a máquina virtual Ethereum (EVM) possam entendê-lo. -## Pré-requisitos {#prerequisites} +## Pré-requisitos {#prerequisites} Você pode achar útil ler nossa introdução a [contratos inteligentes](/developers/docs/smart-contracts/) e a [máquina virtual Ethereum](/developers/docs/evm/) antes de ler sobre compilação. diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/composability/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/composability/index.md index d892a3a401a..b13077b0510 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/composability/index.md @@ -45,13 +45,13 @@ Usaremos um exemplo de negociação de arbitragem para ilustrar os benefícios d Se um token estiver sendo negociado mais alto na `troca A` do que na `troca B`, você pode aproveitar a diferença de preço para obter lucro. No entanto, você só pode fazer isso se tiver capital suficiente para financiar a transação (ou seja, comprar o token da `troca B` e vendê-lo na `troca A`). -Em um cenário em que você não tem fundos suficientes para cobrir a negociação, um empréstimo rápido pode ser o ideal. Os [empréstimos relâmpagos](/defi/#flash-loans) são altamente técnicos, mas a ideia básica é que você pode emprestar ativos (sem garantias) e devolvê-los dentro de _uma_ transação. +Em um cenário em que você não tem fundos suficientes para cobrir a negociação, um empréstimo rápido pode ser o ideal. Os [empréstimos relâmpagos](/defi/#flash-loans) são altamente técnicos, mas a ideia básica é que você pode emprestar ativos (sem garantias) e devolvê-los dentro de *uma* transação. Voltando ao nosso exemplo inicial, um trader de arbitragem pode fazer um grande empréstimo relâmpago, comprar tokens da `troca B`, vendê-los na `troca A`, pagar o capital + juros, e manter o lucro, dentro da mesma transação. Essa lógica complexa requer a combinação de chamadas para vários contratos, o que não seria possível se os contratos inteligentes não tivessem interoperabilidade. ## Exemplos de composabilidade na Ethereum {#composability-in-ethereum} -### Troca de tokens {#token-swaps} +### Trocas de tokens {#token-swaps} Se você criar um dapp que exige que as transações sejam pagas em ETH, você pode permitir que os usuários paguem em outros tokens ERC-20 integrando a lógica de troca de token. O código converterá automaticamente o token do usuário em ETH antes que o contrato execute a função chamada. diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/deploying/index.md index ced3ed4ed9c..6b80a29a8b1 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/deploying/index.md @@ -20,16 +20,14 @@ Finalmente, você precisará compilar seu contrato antes de implantá-lo, então ### O que você precisará {#what-youll-need} -- bytecode do seu contrato - isto é gerado através da [compilação](/developers/docs/smart-contracts/compiling/). +- Bytecode do seu contrato - isto é gerado através da [compilação](/developers/docs/smart-contracts/compiling/). - Ether para gás – você definirá o seu limite de gás como outras transações, então esteja ciente de que a implantação do contrato precisa de muito mais gás do que uma simples transferência de ETH - um script de implantação ou um plugin -- acesso a um [nó Ethereum](/developers/docs/nodes-and-clients/), ou executando o seu próprio, conectando a um nó público, ou usando uma chave API usando um [serviço de nó](/developers/docs/nodes-and-clients/nodes-as-a-service/) como [Infura](https://www.infura.io/) ou [Alchemy](https://docs.alchemy.com/). +- acesso a um [nó Ethereum](/developers/docs/nodes-and-clients/), executando o seu próprio, conectando a um nó público ou por meio de uma chave de API usando um [serviço de nó](/developers/docs/nodes-and-clients/nodes-as-a-service/) ### Como implantar um contrato inteligente {#steps-to-deploy} -Os passos específicos envolvidos dependerão das ferramentas que você usa. Por exemplo, confira a [documentação de hardware sobre a implantação de seus contratos](https://hardhat.org/guides/deploying.html) ou [documentação do Truffle sobre redes e implantação de aplicativos](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment). Estas são duas das ferramentas mais populares para a implantação de contratos inteligentes, que envolvem a elaboração de um script para manipular as etapas de implementação. - -Uma vez implantado, o seu contrato terá um endereço Ethereum, como outras [contas](/developers/docs/accounts/). +The specific steps involved will depend on the development framework in question. For example, you can check out [Hardhat's documentation on deploying your contracts](https://hardhat.org/guides/deploying.html) or [Foundry's documentation on deploying and verifying a smart contract](https://book.getfoundry.sh/forge/deploying). Once deployed, your contract will have an Ethereum address like other [accounts](/developers/docs/accounts/) and can be verified using [source code verification tools](/developers/docs/smart-contracts/verifying/#source-code-verification-tools). ## Ferramentas relacionadas {#related-tools} @@ -51,27 +49,26 @@ Uma vez implantado, o seu contrato terá um endereço Ethereum, como outras [con - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**Truffle -\*\***_Um ambiente de desenvolvimento, teste de framework, compilação e outras ferramentas._\*\* +**thirdweb - _Implemente facilmente qualquer contrato em qualquer cadeia compatível com EVM, usando um único comando_** -- [trufflesuite.com](https://www.trufflesuite.com/) -- [Documentos em redes e implantação de aplicativos](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment) -- [GitHub](https://github.com/trufflesuite/truffle) +- [Documentação](https://portal.thirdweb.com/deploy/) ## Tutoriais relacionados {#related-tutorials} -- [Implantando o seu primeiro contrato inteligente](/developers/tutorials/deploying-your-first-smart-contract/) _– Uma introdução à implantação do seu primeiro contrato inteligente em uma rede de teste da Ethereum._ -- [Hello World | tutorial para contrato inteligente](/developers/tutorials/hello-world-smart-contract/)_ - Um tutorial fácil de seguir para criar & implantar um contrato inteligente básico na Ethereum._ +- [Implementando o seu primeiro contrato inteligente](/developers/tutorials/deploying-your-first-smart-contract/) _– Uma introdução à implementação do seu primeiro contrato inteligente em uma rede de teste da Ethereum._ +- [Hello World | tutorial para contrato inteligente](/developers/tutorials/hello-world-smart-contract/)_ - Um tutorial fácil de seguir para criar & implementar um contrato inteligente básico na Ethereum._ - [Interaja com outros contratos da Solidity](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Como implantar um contrato inteligente a partir de um contrato existente e interagir com ele._ -- [Como diminuir o tamanho de seu contrato](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _- Como reduzir o tamanho do seu contrato para mantê-lo abaixo do limite e economizar gás_ +- [Como diminuir o tamanho de seu contrato](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _- Como reduzir o tamanho do seu contrato para mantê-lo abaixo do limite e economizar Gas_ ## Leia mais {#further-reading} - [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) - _OpenZeppelin_ - [Implementando seus contratos com Hardhat](https://hardhat.org/guides/deploying.html) - _Nomic Labs_ -_Conhece um recurso da comunidade que o ajudou? Edite esta página e adicione-o!_ +_Conhece um recurso da comunidade que te ajudou? Edite essa página e adicione!_ ## Tópicos relacionados {#related-topics} - [Estruturas de desenvolvimento](/developers/docs/frameworks/) - [Executando um nó Ethereum](/developers/docs/nodes-and-clients/run-a-node/) +- [Nódulos como serviço](/developers/docs/nodes-and-clients/nodes-as-a-service) diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/formal-verification/index.md index 492c21749f5..cfb0f311b41 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/formal-verification/index.md @@ -212,16 +212,16 @@ Além disso, nem sempre é possível que os verificadores de programa determinem ### Linguagens de especificação para criação de especificações formais {#specification-languages} -**Act**: \_\*O Act permite a especificação de atualizações de armazenamento, condições de pré/pós e invariáveis do contrato. Seu conjunto de ferramentas também tem backends capazes de comprovar muitas propriedades via Coq, solucionadores SMT, ou hevm.\*\* +**Act**: _*O Act permite a especificação de atualizações de armazenamento, condições de pré/pós e invariáveis do contrato. Seu conjunto de ferramentas também tem backends capazes de comprovar muitas propriedades via Coq, solucionadores SMT, ou hevm.** - [GitHub](https://github.com/ethereum/act) - [Documentação](https://ethereum.github.io/act/) -**Scribble** - \_\*Scribble transforma anotações de código na linguagem de especificação Scribble em afirmações concretas que verificam a especificação.\*\* +**Scribble** - _*Scribble transforma anotações de código na linguagem de especificação Scribble em afirmações concretas que verificam a especificação.** - [Documentação](https://docs.scribble.codes/) -**Dafny** - \_\*Dafny é uma linguagem de programação pronta para verificação que depende de anotações de alto nível para argumentar e comprovar a exatidão do código.\*\* +**Dafny** - _*Dafny é uma linguagem de programação pronta para verificação que depende de anotações de alto nível para argumentar e comprovar a exatidão do código.** - [GitHub](https://github.com/dafny-lang/dafny) @@ -232,15 +232,15 @@ Além disso, nem sempre é possível que os verificadores de programa determinem - [Site](https://www.certora.com/) - [Documentação](https://docs.certora.com/en/latest/index.html) -**Solidity SMTChecker** - \_\*Solidity’s SMTChecker é um verificador de modelos integrado com base no SMT (Teorias do Módulo de Satisfiabilidade) e na resolução de Horn. Ele confirma se o código-fonte de um contrato corresponde às especificações durante a compilação e procura estaticamente por violações de propriedades de segurança.\*\* +**Solidity SMTChecker** - _*Solidity’s SMTChecker é um verificador de modelos integrado com base no SMT (Teorias do Módulo de Satisfiabilidade) e na resolução de Horn. Ele confirma se o código-fonte de um contrato corresponde às especificações durante a compilação e procura estaticamente por violações de propriedades de segurança.** - [GitHub](https://github.com/ethereum/solidity) -**solc-verify** - \_\*solc-verify é uma versão estendida do compilador Solidity que pode executar a verificação formal automatizada no código Solidity usando anotações e verificação de programa modular.\*\* +**solc-verify** - _*solc-verify é uma versão estendida do compilador Solidity que pode executar a verificação formal automatizada no código Solidity usando anotações e verificação de programa modular.** - [GitHub](https://github.com/SRI-CSL/solidity) -**KEVM** - \_\*KEVM é uma semântica formal da Máquina Virtual Ethereum (EVM) escrita no framework K. KEVM é executável e pode comprovar determinadas declarações relacionadas à propriedade usando a lógica de alcançabilidade.\*\* +**KEVM** - _*KEVM é uma semântica formal da Máquina Virtual Ethereum (EVM) escrita no framework K. KEVM é executável e pode comprovar determinadas declarações relacionadas à propriedade usando a lógica de alcançabilidade.** - [GitHub](https://github.com/runtimeverification/evm-semantics) - [Documentação](https://jellopaper.org/) @@ -259,12 +259,12 @@ Além disso, nem sempre é possível que os verificadores de programa determinem ### Ferramentas de execução simbólica para detectar padrões vulneráveis em contratos inteligentes {#symbolic-execution-tools} -**Manticore** - \__Uma ferramenta para analisar a ferramenta de análise de bytecode EVM com base em execução simbólica_.\* +**Manticore** - _*Uma ferramenta para analisar a ferramenta de análise de bytecode EVM com base em execução simbólica*.* - [GitHub](https://github.com/trailofbits/manticore) - [Documentação](https://github.com/trailofbits/manticore/wiki) -**hevm** - \_\*hevm é um mecanismo de execução simbólico e um verificador de equivalência para bytecode EVM.\*\* +**hevm** - _*hevm é um mecanismo de execução simbólico e um verificador de equivalência para bytecode EVM.** - [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm) diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/index.md index 282d4433f53..c6e5da0801b 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/index.md @@ -66,7 +66,7 @@ De maneira similar a como uma máquina de venda automática elimina a necessidad ## Sem necessidade de permissão {#permissionless} -Qualquer um pode escrever um contrato inteligente e implantá-lo na rede. Você só precisa aprender a codificar em uma [linguagem de contrato inteligente](/developers/docs/smart-contracts/languages/) e ter ETH suficiente para implantar seu contrato. A implantação de um contrato inteligente é tecnicamente uma transação, portanto, você precisa pagar [Gas](/developers/docs/gas/) da mesma forma que precisa pagar gás por uma simples transferência de ETH. No entanto, os custos de gás para implantação de contrato são muito mais altos. +Qualquer um pode escrever um contrato inteligente e implantá-lo na rede. Você só precisa aprender a codificar em uma [linguagem de contrato inteligente](/developers/docs/smart-contracts/languages/) e ter ETH suficiente para implantar seu contrato. A implantação de um contrato inteligente é tecnicamente uma transação, portanto, você precisa pagar o [gás](/developers/docs/gas/) da mesma forma que precisa pagar o Gas por uma simples transferência de ETH. No entanto, os custos de gás para implantação de contrato são muito mais altos. A Ethereum tem linguagens que o desenvolvedor terá facilidade de usar para escrever contratos inteligentes: @@ -85,9 +85,9 @@ Saiba mais sobre a [composição do contrato inteligente](/developers/docs/smart ## Limitações {#limitations} -Os contratos inteligentes, por si só, não conseguem obter informações sobre eventos do "mundo-real" porque não podem enviar solicitações HTTP. Isto é por concepção. A sua concepção é a de que as informações externas podem pôr em causa o consenso, que é importante para a segurança e a descentralização. +Os contratos inteligentes sozinhos não podem obter informações sobre eventos do "mundo real", porque não podem recuperar dados de fontes off-chain. Isso significa que eles não podem responder a eventos no mundo real. Isto é, por concepção. A sua concepção é a de que as informações externas podem pôr em causa o consenso, que é importante para a segurança e a descentralização. -Há maneiras de contornar isso usando [oráculos](/developers/docs/oracles/). +No entanto, é importante que aplicações blockchain possam usar dados off-chain. A solução são os [oráculos](/developers/docs/oracles/), que são instrumentos que ingerem dados off-chain e os disponibilizam para contratos inteligentes. Outra limitação de contratos inteligentes é o tamanho máximo do contrato. Um contrato inteligente pode ser um máximo de 24KB ou ficará sem gás. Isso pode ser contornado usando [O Padrão de Diamante](https://eips.ethereum.org/EIPS/eip-2535). @@ -103,13 +103,8 @@ Os contratos multisig (com múltiplas assinaturas) são contas de contrato intel - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [Fórum da Comunidade](https://forum.openzeppelin.com/c/general/16) -**DappSys -** **_Blocos de código seguros, simples e flexíveis para contratos inteligentes._** - -- [Dappsys](https://dappsys.readthedocs.io/) -- [GitHub](https://github.com/dapphub/dappsys) - ## Leitura adicional {#further-reading} -- [Contratos Inteligentes: A Tecnologia Blockchain que substituirá Advogados](https://blockgeeks.com/guides/smart-contracts/) _– Blockgeeks_ -- [Melhores Práticas para Desenvolvimento de Contrato Inteligente](https://yos.io/2019/11/10/smart-contract-development-best-practices/) _– 10 de Novembro de 2019 - Yos Riady_ -- [Contratos claros - um guia sobre padrões de contrato inteligente & práticas](https://www.wslyvh.com/clean-contracts/) _– Jul 30 2020 - wslyvh_ +- [Coinbase: O que é um contrato inteligente?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) +- [Chainlink: O que é um contrato inteligente?](https://chain.link/education/smart-contracts) +- [Vídeo: Simplesmente Explicado - Contratos Inteligentes](https://youtu.be/ZE2HxTmxfrI) diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/languages/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/languages/index.md index 2e1d944815c..5e0177ca32e 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/languages/index.md @@ -35,7 +35,7 @@ Conhecimento anterior de linguagens de programação, especialmente de JavaScrip - [Portal da linguagem Solidity](https://soliditylang.org/) - [Solidity como exemplo](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Gitter Chatroom](https://gitter.im/ethereum/solidity) ponte para [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Solidity Gitter Chatroom](https://gitter.im/ethereum/solidity/) ponte para [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) - [Dicas](https://reference.auditless.com/cheatsheet) - [Blog da Solidity](https://blog.soliditylang.org/) - [Solidity Twitter](https://twitter.com/solidity_lang) diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md index 2986d153316..a017c2ac84a 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/libraries/index.md @@ -16,7 +16,7 @@ Geralmente, você pode encontrar dois tipos de blocos de construção em bibliot ### Comportamentos {#behaviors} -Ao escrever contratos inteligentes, há uma boa chance de você escrever padrões semelhantes repetidamente, como atribuir um endereço de administrador \__ para realizar operações protegidas em um contrato, ou adicionando um botão de emergência \_pause_ em caso de um problema inesperado. +Ao escrever contratos inteligentes, há uma boa chance de você escrever padrões semelhantes repetidamente, como atribuir um endereço de administrador __ para realizar operações protegidas em um contrato, ou adicionando um botão de emergência _pause_ em caso de um problema inesperado. As bibliotecas inteligentes de contratos geralmente fornecem implementações reutilizáveis destes comportamentos como [bibliotecas](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) ou via [herança](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) em Solidity. @@ -102,6 +102,11 @@ Por último, ao decidir se deve incluir uma biblioteca, considere a sua utiliza - [GitHub](https://github.com/HQ20/contracts) +**thirdweb Solidity SDK -** **_Fornece as ferramentas necessárias para criar contratos inteligentes e personalizados com eficiência_** + +- [Documentação](https://portal.thirdweb.com/solidity/) +- [GitHub](https://github.com/thirdweb-dev/contracts) + ## Tutoriais relacionados {#related-tutorials} - [Considerações de segurança para os desenvolvedores da Ethereum](/developers/docs/smart-contracts/security/) _– Um tutorial sobre considerações de segurança ao criar contratos inteligentes, incluindo o uso da biblioteca._ @@ -109,4 +114,4 @@ Por último, ao decidir se deve incluir uma biblioteca, considere a sua utiliza ## Leitura adicional {#further-reading} -_Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ +_Conhece um recurso da comunidade que te ajudou? Edite essa página e adicione!_ diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md index daf7a2f23bf..47c1aea61e9 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/security/index.md @@ -8,7 +8,7 @@ Os contratos inteligentes são extremamente flexíveis e capazes de controlar gr Blockchains públicas, como a Ethereum, complicam ainda mais a questão de proteger contratos inteligentes. O código de contrato implantado _geralmente_ não pode ser alterado para corrigir falhas de segurança, enquanto os ativos roubados de contratos inteligentes são extremamente difíceis de rastrear e, em sua maioria, irrecuperáveis devido à imutabilidade. -Embora os números variem, estima-se que o valor total roubado ou perdido devido a defeitos de segurança em contratos inteligentes é facilmente superior a 1 bilhão de dólares. Isso inclui incidentes de alto perfil, como o [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (com 3,6 milhões de ETH roubados, no valor de mais de US$ 1 bilhão de dólares nos preços de hoje), [Hack da carteira múltiplas assinaturas da Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (US$ 30 milhões perdidos para hackers) e o [Caso da carteira congelada da Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (mais de US$ 300 milhões em ETH bloqueados para sempre). +Embora os números variem, estima-se que o valor total roubado ou perdido devido a defeitos de segurança em contratos inteligentes é facilmente superior a 1 bilhão de dólares. Isso inclui incidentes de alto perfil, como o [DAO hack](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (com 3,6 milhões de ETH roubados, no valor de mais de US$ 1 bilhão de dólares nos preços de hoje), [ Hack da carteira múltiplas assinaturas da Parity](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (US$ 30 milhões perdidos para hackers) e o [ Caso da carteira congelada da Parity](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (mais de US$ 300 milhões em ETH bloqueados para sempre). As questões mencionadas tornam imperativo para os desenvolvedores investirem esforços na construção de contratos inteligentes seguros, sólidos e resistentes. Segurança dos contratos inteligentes é um assunto sério, e todo desenvolvedor deve aprender. Este guia abrangerá considerações de segurança para desenvolvedores de Ethereum e explorará recursos para melhorar a segurança dos contratos inteligentes. @@ -470,13 +470,13 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider ### Ferramentas para monitorar contratos inteligentes {#smart-contract-monitoring-tools} -- **[OpenZeppelin Defender Sentinels](https://docs.openzeppelin.com/defender/sentinel)** - _Uma ferramenta para monitorar e responder automaticamente a eventos, funções e parâmetros de transação em seus contratos inteligentes._ +- **[OpenZeppelin Defender Sentinels](https://docs.openzeppelin.com/defender/v1/sentinel)** - *Uma ferramenta para monitorar e responder automaticamente a eventos, funções e parâmetros de transação em seus contratos inteligentes.* - **[Alerta leve e em tempo real](https://tenderly.co/alerting/)** - _Uma ferramenta para receber notificações em tempo real quando eventos incomuns ou inesperados acontecem em seus contratos inteligentes ou carteiras._ ### Ferramentas para administração segura de contratos inteligentes {#smart-contract-administration-tools} -- **[Administrador do OpenZeppelin Defender](https://docs.openzeppelin.com/defender/admin)** - _Interface para gerenciar a administração de contrato inteligente, incluindo controles de acesso, atualizações e pausas._ +- **[Administrador do OpenZeppelin Defender](https://docs.openzeppelin.com/defender/v1/admin)** - *Interface para gerenciar a administração de contrato inteligente, incluindo controles de acesso, atualizações e pausas.* - **[Safe](https://safe.global/)** - _Carteira de contrato inteligente em execução na Ethereum, que requer um número mínimo de pessoas para aprovar uma transação antes que ela possa ocorrer (M-de-N)._ @@ -500,10 +500,12 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider - **[Hacken](https://hacken.io)** - _Auditor de cibersegurança da Web3 que traz a abordagem de 360 graus à segurança da blockchain._ -- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Serviços de auditoria Solidity e Cairo que garantem a integridade dos contratos inteligentes e a segurança dos usuários em toda a Ethereum e Starknet._ +- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Serviços de auditoria Solidity e Cairo que garantem a integridade dos contratos inteligentes e a segurança dos usuários em toda a Ethereum e Starknet._ - **[HashEx](https://hashex.org/)** – _O HashEx se dedica a blockchain e auditoria de contrato inteligente para garantir a segurança de criptomoedas, fornecendo serviços como desenvolvimento de contrato inteligente, teste de penetração e consultoria em blockchain._ +- **[Code4rena](https://code4rena.com/)** - _Plataforma de auditoria competitiva que incentiva especialistas em segurança de contratos inteligentes a encontrar vulnerabilidades e ajudar a tornar a web3 mais segura._ + ### Plataformas de recompensa de bugs {#bug-bounty-platforms} - **[Immunefi](https://immunefi.com/)** - _Plataforma de recompensa por bugs para contratos inteligentes e projetos DeFi, onde os pesquisadores de segurança revisam o código, divulgam vulnerabilidades, recebem pagamentos e tornam a criptografia mais segura._ @@ -522,7 +524,7 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider ### Desafios para aprender a segurança de contratos inteligentes {#challenges-for-learning-smart-contract-security} -- **[A Incrível BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _Lista selecionada de jogos de guerra de segurança na blockchain, desafios e a [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/) com competições e descrições de soluções._ +- **[A Incrível BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - *Lista selecionada de jogos de guerra de segurança na blockchain, desafios e a [Capture The Flag](https://www.webopedia.com/definitions/ctf-event/amp/) com competições e descrições de soluções.* - **[Maldito DeFi Vulnerável](https://www.damnvulnerabledefi.xyz/)** - _Jogo de guerra para aprender a segurança ofensiva de contratos inteligentes DeFi e desenvolver habilidades em caça a bugs e auditoria de segurança._ @@ -534,7 +536,7 @@ Se você planeja consultar um oráculo on-chain para preços de ativos, consider - **[Nascent: Kit de Ferramentas de Segurança Simples](https://github.com/nascentxyz/simple-security-toolkit)** - _Coleção de guias práticos com foco em segurança e listas de verificação para o desenvolvimento de contratos inteligentes._ -- **[Padrões Solidity](https://fravoll.github.io/solidity-patterns/)** - _Compilação útil de padrões segurança e melhores práticas para contratos inteligentes da linguagem de programação Solidity._ +- **[Padrões Solidity](https://fravoll.github.io/solidity-patterns/)** - *Compilação útil de padrões segurança e melhores práticas para contratos inteligentes da linguagem de programação Solidity.* - **[Documentação Solidity: Considerações de Segurança](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _Diretrizes para programar contratos inteligentes seguros com Solidity._ diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md index fa18a71775e..12fb8e32535 100644 --- a/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/testing/index.md @@ -1,265 +1,299 @@ --- title: Testes de contratos inteligentes -description: Uma visão geral das técnicas e considerações para testar contratos inteligentes Ethereum +description: Uma visão geral das técnicas e considerações para testar contratos inteligentes Ethereum. lang: pt-br --- -Testar [contratos inteligentes](/developers/docs/smart-contracts/) é uma das mais importantes medidas para melhorar a [segurança do contrato inteligente](/developers/docs/smart-contracts/security/). Ao contrário do software tradicional, os contratos inteligentes normalmente não podem ser atualizados após o lançamento, tornando imperativo testar rigorosamente antes de implantar contratos na rede Ethereum. +Blockchains públicas como Ethereum são imutáveis, dificultando alterações de código de contratos inteligentes após sua implementação. Existem [padrões de atualização de contrato](/developers/docs/smart-contracts/upgrading/) para realizar "atualizações virtuais", mas são difíceis de implementar e requer um consenso social. Além disso, uma atualização só pode corrigir um erro _após_ que é descoberto se um invasor descobrir a vulnerabilidade primeiro, seu contrato inteligente corre o risco sofrer um exploit. -## O que é teste de contrato inteligente? {#what-is-smart-contract-testing} - -Teste de contrato inteligente significa realizar uma análise e avaliação detalhada de um contrato inteligente para avaliar a qualidade de seu código-fonte durante o ciclo de desenvolvimento. Testar um contrato inteligente facilita a identificação de bugs e vulnerabilidades, e reduz a possibilidade de erros de software que podem levar a onerosas explorações. +Por estas razões, testar contratos inteligentes antes de [implementar](/developers/docs/smart-contracts/deploying/) à rede principal é o requisito mínimo para [segurança](/developers/docs/smart-contracts/security/). Existem muitas técnicas para testar contratos e avaliar a corretude de código; qual escolher depende de suas necessidades. No entanto, um conjunto de testes feito a partir de diferentes ferramentas e abordagens é ideal para pegar pequenas e grandes falhas de segurança no código do contrato. -O teste de contrato inteligente assume muitas formas, com diferentes métodos oferecendo benefícios. As estratégias para testar contratos inteligentes da Ethereum podem ser classificadas em duas grandes categorias: **teste automatizado** e **teste manual**. +## Pré-requisitos {#prerequisites} -### Teste automatizado {#automated-testing} +Esta página explica como testar contratos inteligentes antes de implantar na rede Ethereum. Pressupõe-se que você esteja familiarizado com [contratos inteligentes](/developers/docs/smart-contracts/). -O teste automatizado envolve o uso de ferramentas automatizadas para realizar testes com script de contratos inteligentes. Essa técnica depende de software automatizado que pode executar testes repetidos para encontrar defeitos em contratos inteligentes. +## O que é teste de contrato inteligente? {#what-is-smart-contract-testing} -O teste automatizado é eficiente, usa menos recursos e promete níveis mais altos de cobertura do que a análise manual. As ferramentas de teste automatizadas também podem ser configuradas com dados de teste, permitindo-lhes comparar comportamentos previstos com resultados reais. +O teste de contrato inteligente é o processo de verificação de que o código de um contrato inteligente funciona conforme o esperado. Testar é útil para verificar se um contrato inteligente específico atende aos requisitos de confiabilidade, usabilidade e segurança. -### Teste manual {#manual-testing} +Embora as abordagens variem, a maioria dos métodos de teste exige a execução de um contrato inteligente com uma pequena amostra dos dados que se espera manipular. Se o contrato produzir resultados corretos para dados da amostra, presume-se que esteja funcionando corretamente. A maioria das ferramentas de teste fornece recursos para escrever e executar [casos de teste](https://en.m.wikipedia.org/wiki/Test_case) para verificar se a execução de um contrato corresponde aos resultados esperados. -O teste manual é auxiliado por humanos e envolve um indivíduo que executa as etapas de teste manualmente. As auditorias de código, em que desenvolvedores e/ou auditores examinam cada linha de código do contrato, é um exemplo de teste manual para contratos inteligentes. +### Por que é importante testar contratos inteligentes? {#importance-of-testing-smart-contracts} -O teste manual de contratos inteligentes requer habilidade considerável e um investimento considerável de tempo, dinheiro e esforço. Além disso, o teste manual às vezes pode ser suscetível a problemas de erro humano. +Como os contratos inteligentes geralmente gerenciam ativos financeiros de alto valor, pequenos erros de programação podem e geralmente levam a [perdas massivas para os usuários](https://rekt.news/leaderboard/). Rigorous testing can, however, help you discover defects and issues in a smart contract's code early and fix them before launching on Mainnet. -Entretanto, aplicar testes manuais a contratos inteligentes também pode ser benéfico. As auditorias de código aproveitam a inteligência humana para encontrar defeitos no código do contrato que podem não ser detectados durante os testes automatizados. +Embora seja possível atualizar um contrato se um bug for descoberto, as atualizações são complexas e podem [ resultar em erros](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) se tratadas de forma inadequada. A atualização de um contrato vai contra o princípio da imutabilidade e sobrecarrega os usuários com suposições de confiança adicionais. Por outro lado, um plano abrangente para testar seu contrato reduz os riscos de segurança do contrato inteligente e reduz a necessidade de realizar atualizações lógicas complexas após a implantação. -O teste manual de seus contratos inteligentes também pode revelar vulnerabilidades que existem fora do código, mas ainda podem afetá-lo. Por exemplo, uma auditoria de contrato inteligente pode descobrir vulnerabilidades decorrentes da interação inadequada com componentes off-chain. +## Métodos para testar contratos inteligentes {#methods-for-testing-smart-contracts} -## Por que é importante testar contratos inteligentes? {#benefits-of-smart-contract-testing} +Methods for testing Ethereum smart contracts fall under two broad categories: **automated testing** and **manual testing**. Testes automatizados e testes manuais tem seus prós e contras, mas você pode combinar ambos para criar um plano robusto para analisar seus contratos. -Testar contratos inteligentes é importante pelos seguintes motivos: +### Teste automatizado {#automated-testing} -### 1. Contratos inteligentes são aplicativos de alto valor {#smart-contracts-are-high-value-applications} +O teste automatizado usa ferramentas que verificam automaticamente um código de contratos inteligentes em busca de erros na execução. O benefício do teste automatizado vem do uso de [scripts](https://www.techtarget.com/whatis/definition/script?amp=1) para orientar a avaliação das funcionalidades do contrato. Os scripts de testes podem ser programados para serem executados repetidamente com o mínimo de intervenção humana, tornando o teste automatizado mais eficiente do que as abordagens manuais de teste. -Contratos inteligentes geralmente lidam com ativos financeiros de alto valor, especialmente em setores como [finanças descentralizadas (DeFi)](/defi/) e itens valiosos, como [tokens não fungíveis (NFTs)](/nft/). Como tal, pequenas vulnerabilidades em contratos inteligentes podem e geralmente levam a perdas maciças e irrecuperáveis para os usuários. Testes abrangentes podem, no entanto, expor erros no código do contrato inteligente e reduzir os riscos de segurança antes da implantação. +O teste automatizado é particularmente útil quando os testes são repetitivos e demorados; difícil de realizar manualmente; suscetíveis a erro humano; ou envolvem a avaliação de funções contratuais críticas. Mas as ferramentas de teste automatizadas podem ter desvantagens - elas podem perder certos bugs e produzir muitos [falsos positivos](https://www.contrastsecurity.com/glossary/false-positive). Portanto, combinar testes automatizados com testes manuais para contratos inteligentes é ideal. -### 2. Contratos inteligentes são imutáveis {#smart-contracts-are-immutable} +### Teste manual {#manual-testing} -Os contratos inteligentes implantados na [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) são imutáveis por padrão. Enquanto os desenvolvedores tradicionais podem ser usados para corrigir bugs de software após o lançamento, o desenvolvimento da Ethereum deixa pouco espaço para corrigir falhas de segurança uma vez que um contrato inteligente está ativo na blockchain. +O teste manual é auxiliado por humanos e envolve a execução de cada caso de teste em seu conjunto de testes, um após o outro, ao analisar a corretude de um contrato inteligente. Isso é diferente do teste automatizado, no qual você pode executar simultaneamente vários testes isolados em um contrato e obter um relatório mostrando todos os testes que falharam e os que foram aprovados. -Embora existam mecanismos de atualização para contratos inteligentes, como padrões de proxy, estes podem ser difíceis de implementar. Além de reduzir a imutabilidade e introduzir complexidade, as atualizações geralmente exigem processos de governança complexos. +O teste manual pode ser realizado por um único indivíduo seguindo um plano de teste escrito que cobre diferentes cenários de teste. Você também pode ter vários indivíduos ou grupos interagindo com um contrato inteligente durante um período especificado como parte do teste manual. Os testadores compararão o comportamento real do contrato com o comportamento esperado, sinalizando qualquer diferença como um bug. -Na maioria das vezes, as atualizações devem ser consideradas o último recurso e evitadas, a menos que sejam necessárias. A detecção de potenciais vulnerabilidades e falhas em seu contrato inteligente durante a fase de pré-lançamento reduz a necessidade de uma atualização lógica. +Um teste manual eficaz requer recursos consideráveis ​​(habilidade, tempo, dinheiro e esforço) e é possível, devido a erro humano, perder certos erros durante a execução dos testes. Mas o teste manual também pode ser benéfico - por exemplo, um testador humano (por exemplo, um auditor) pode usar a intuição para detectar casos extremos que uma ferramenta de teste automatizada perderia. ## Teste automatizado para contratos inteligentes {#automated-testing-for-smart-contracts} -### 1. Teste funcional {#functional-testing} +### Teste unitário {#unit-testing-for-smart-contracts} -Testes funcionais verifica a funcionalidade de um contrato inteligente e fornece garantia de que cada função no código funciona conforme o esperado. Teste funcional requer entender como seu contrato inteligente deve se comportar em determinadas condições. Em seguida, você pode testar cada função executando cálculos com valores selecionados e comparando a saída retornada com a saída esperada. +O teste unitário avalia as funções do contrato separadamente e verifica se cada componente funciona corretamente. Testes unitários bons devem ser simples, rápidos de executar e fornecer uma ideia clara do que deu errado se os testes falharem. -Testes funcionais abrange três métodos: **teste unitário**, **teste de integração**, e **teste de sistema**. +Os testes unitários são úteis para verificar se as funções retornam os valores esperados e se o armazenamento do contrato é atualizado corretamente após a execução da função. Além disso, a execução de testes unitários após fazer alterações em uma base de código de contratos garante que a adição de nova lógica não introduza erros. Abaixo estão algumas diretrizes para executar testes unitários eficazes: -#### Teste unitário +#### Diretrizes para testes unitários de contratos inteligentes {#unit-testing-guidelines} -Teste unitário envolve testar componentes individuais em um contrato inteligente para correção. Um teste unitário é simples, rápido de executar e fornece uma ideia clara do que deu errado se o teste falhar. +##### 1. Entenda a lógica de negócios e o fluxo de trabalho de seus contratos -Testes unitário são cruciais para o desenvolvimento de contratos inteligentes, especialmente se você precisar adicionar uma nova lógica ao código. Você pode verificar o comportamento de cada função e confirmar que ela é executada como esperado. +Antes de escrever testes unitários, é bom saber quais funcionalidades um contrato inteligente oferece e como os usuários acessarão e usarão essas funções. Isso é particularmente útil para executar [testes de caminho feliz](https://en.m.wikipedia.org/wiki/Happy_path) que determinam se as funções em um contrato retornam a saída correta para entradas válidas do usuário. Explicaremos esse conceito usando este exemplo (resumido) de [um contrato de leilão](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction) -Executar um teste unitário muitas vezes requer criar _asserções_— simples e informais instruções especificando requisitos para um contrato inteligente. Testes unitários podem então ser usados para testar cada asserção e ver se ela se mantém verdadeira sob execução. +``` +constructor( + uint biddingTime, + address payable beneficiaryAddress + ) { + beneficiary = beneficiaryAddress; + auctionEndTime = block.timestamp + biddingTime; + } -Exemplos de asserções relacionadas a contratos incluem: +function bid() external payable { -i. Somente o administrador pode pausar o contrato + if (block.timestamp > auctionEndTime) + revert AuctionAlreadyEnded(); -ii. "Não administradores não podem cunhar novos tokens" + if (msg.value <= highestBid) + revert BidNotHighEnough(highestBid); -iii. "O contrato reverte em erros" + if (highestBid != 0) { + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); + } -#### Teste de Integração + function withdraw() external returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + pendingReturns[msg.sender] = 0; -O teste de integração é um nível superior ao dos testes unitários na hierarquia de testes. Em testes de integração, os componentes individuais do contrato inteligente são testados juntos. + if (!payable(msg.sender).send(amount)) { + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; + } -Esta abordagem detecta erros decorrentes de interações entre diferentes componentes de um contrato ou em vários contratos. Você deve usar este método se você tiver um contrato complexo com várias funções ou um que interfaces com outros contratos. +function auctionEnd() external { + if (block.timestamp < auctionEndTime) + revert AuctionNotYetEnded(); + if (ended) + revert AuctionEndAlreadyCalled(); -Testes de integração podem ser úteis para garantir que coisas como a [herança](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) e a injeção de dependência funcionem corretamente. + ended = true; + emit AuctionEnded(highestBidder, highestBid); -#### Teste de sistema + beneficiary.transfer(highestBid); + } +} +``` -Os testes do sistema são a fase final dos testes funcionais de contratos inteligentes. Um sistema avalia o contrato inteligente como um produto totalmente integrado para ver se ele executa conforme especificado nos requisitos técnicos. +Este é um contrato de leilão simples projetado para receber lances durante o período de submissão de ofertas. Se a variável `highestBid` aumentar, o licitante anterior mais alto receberá seu dinheiro; uma vez terminado o período de licitação, o objeto `beneficiary` aciona o contrato para obter seu dinheiro. -Você pode pensar neste estágio como verificar o fluxo de ponta a ponta do seu contrato inteligente do ponto de vista do usuário. Uma boa maneira de realizar testes de sistema em um contrato inteligente é implementá-lo em um ambiente semelhante a produção, como uma [testnet](/developers/docs/networks/#ethereum-testnets) ou uma [rede de desenvolvimento](/developers/docs/development-networks/). +Testes unitários para um contrato como este cobriria diferentes funções que um usuário poderia chamar quando interagindo com o contrato. Um exemplo seria um teste unitário que checa se o usuário pode colocar uma ordem enquanto o leilão está em andamento (ou seja, chamadas para `bid()` com sucesso) ou checar se um usuário pode colocar uma ordem mais alta que o atual `highestBid`. -Aqui, os usuários finais podem realizar o teste são executados e relatar quaisquer problemas com a lógica de negócios do contrato e a funcionalidade no geral. O teste do sistema é importante porque você não pode alterar o código uma vez que o contrato é implantado no ambiente EVM principal. +Entendendo o fluxo operacional do contrato também ajuda a escrever testes unitários que checam se a execução atende os requisitos. Por exemplo, o contrato de leilão especifica que os usuários não podem colocar ordens quando o leilão terminou (ou seja, quando `auctionEndTime` é menor que `block.timestamp`). Portanto, o desenvolvedor deve rodar um teste unitário que checa se chamadas para a função `bid()` tiveram sucesso ou falharam quando o leilão terminou (ou seja, quando `auctionEndTime` > `block.timestamp`). -### 2. Análise estática/dinâmica {#static-dynamic-analysis} +##### 2. Avalie todas as suposições relacionadas à execução do contrato -Análise estática e análise dinâmica são dois métodos automatizados de teste para avaliar as qualidades de segurança dos contratos inteligentes. No entanto, ambas as técnicas utilizam diferentes abordagens para encontrar defeitos no código de contratos. +É importante documentar quaisquer suposições sobre a execução do contrato e escrever testes unitários para verificar a validade destas suposições. Além de oferecer proteção contra execução inesperada, testar afirmações força você a pensar sobre operações que poderiam quebrar o modelo de segurança do contrato inteligente. Uma dica útil é ir além dos "testes do usuário feliz" e escrever testes negativos que checam se a função falha com as entradas erradas. -#### Análise estática +Muitos frameworks de teste unitário permitem você criar afirmações - simples declarações que declaram o que um contrato pode e não pode fazer - e rodar testes para ver se estas afirmações funcionam durante a execução. Um desenvolvedor trabalhando no contrato de leilão descrito anteriormente poderia fazer as seguintes afirmações sobre o seu comportamento antes de rodar testes negativos: -Análise estática examina o código-fonte ou bytecode de um contrato inteligente antes da execução. Isso significa que você pode depurar código de contrato sem na verdade executar o programa. Os analistas estáticos podem detectar vulnerabilidades comuns nos contratos inteligentes da Ethereum e ajudar na conformidade com as melhores práticas. +- Usuários não podem colocar ordens quando o leilão acabou ou não começou. -#### Análise dinâmica +- O contrato de leilão reverte se a ordem é abaixo do limite aceitável. -Técnicas de análise dinâmicas requerem a execução do contrato inteligente em um ambiente de tempo de execução para identificar problemas no seu código. Analisadores de código dinâmicos observam os comportamentos dos contratos durante a execução e geram um relatório detalhado de vulnerabilidades identificadas e violações de propriedades. +- Usuários que falham em vencer o leilão são creditados com seus fundos -A difusão é um exemplo de uma técnica de análise dinâmica para testar os contratos. Durante os testes de difusão, um difusor alimenta seu contrato inteligente com dados incorretos e inválidos e monitora como o contrato responde a essas entradas. +**Nota**: Uma outra maneira de testar suposições é escrever testes que disparam [modificadores de função](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) em um contrato, especialmente declarações`require`, `assert`, e `if…else`. -Como qualquer programa, os contratos inteligentes dependem de entradas fornecidas pelos usuários para executar funções. E, enquanto assumimos que os usuários fornecerão entradas corretas, nem sempre esse é o caso. +##### 3. Medida de cobertura do código -Em alguns casos, enviar valores de entrada incorretos para um contrato inteligente pode causar vazamentos de recursos, falhas ou piores, levar à execução de código não pretendida. Campanhas difusas identificam tais problemas previamente, permitindo que você elimine a vulnerabilidade. +[Cobertura de código](https://en.m.wikipedia.org/wiki/Code_coverage) é uma métrica de teste que rastreia o número de ramificações, linhas e comandos no seu código executados durante os testes. Testes devem ter boa cobertura de código, caso contrário você pode ter "falsos negativos" que acontecem quando um contrato passa todos os testes, mas vulnerabilidades ainda existem no código. Obtendo alta cobertura de código, entretanto, dá a segurança que todos os comandos/funções em um contrato inteligente foram suficientemente testados por exatidão. -## Testes manuais para contratos inteligentes {#manual-testing-for-smart-contracts} +##### 4. Use frameworks de teste bem desenvolvidos -### 1. Auditorias de código {#code-audits} +A qualidade das ferramentas usada para rodar testes unitários para o seu contrato inteligente é crucial. Um framework de teste ideal é aquele que é regularmente mantido; fornece recursos úteis (por exemplo, capacidades de log e relatórios); e tem de ter sido extensivamente usado por outros desenvolvedores. -Uma auditoria de código é uma avaliação detalhada do código-fonte de um contrato inteligente para descobrir possíveis falhas de pontos, falhas de segurança e práticas de desenvolvimento ruins. Embora as auditorias de código possam ser automatizadas, nos referimos à análise de código com ajuda humana. +Frameworks de teste unitário para contratos inteligentes em Solidity vêm em diferentes linguagens (geralmente JavaScript, Python e Rust). Veja alguns dos guias abaixo para informações sobre como começar a rodar testes unitários com diferentes frameworks de teste: -Auditorias de código requerem uma mentalidade de invasor para mapear possíveis vetores de ataque em contratos inteligentes. Mesmo se você executar auditorias automatizadas, analisar cada linha de código-fonte é um requisito mínimo para escrever contratos inteligentes seguros. +- **[Rodando testes unitários com Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** +- **[Rodando testes unitários com Foundry](https://book.getfoundry.sh/forge/writing-tests)** +- **[Rodando testes unitários com Waffle](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests)** +- **[Rodando testes unitários com Remix](https://remix-ide.readthedocs.io/en/latest/unittesting.html#write-tests)** +- **[Rodando testes unitários com Ape](https://docs.apeworx.io/ape/stable/userguides/testing.html)** +- **[Rodando testes unitários com Hardhat](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** -Você também pode encomendar uma auditoria de segurança para dar aos usuários maiores garantias de segurança dos contratos inteligentes. Auditorias se beneficiam de uma análise extensiva realizada por profissionais de cibersegurança e detectam possíveis vulnerabilidades ou bugs que possam comprometer a funcionalidade do contrato inteligente. +### Teste de Integração {#integration-testing-for-smart-contracts} -### 2. Recompensa por bugs {#bug-bounties} +Enquanto o teste unitário depura funções de contrato isoladamente, testes integrados avaliam os componentes de um contrato inteligente como um todo. Teste de integração pode detectar defeitos vindos de chamadas entre contratos ou interações entre diferentes funções no mesmo contrato inteligente. Por exemplo, testes de integração podem ajudar a checar se coisas como [herança](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) e injeção de dependência funcionam devidamente. -A recompensa por bugs é uma reconhecimento financeiro dado a um indivíduo que descobre uma vulnerabilidade ou bug no código de um programa e reporta aos desenvolvedores. As recompensas por bugs são semelhantes às auditorias, uma vez que envolve pedir que outras pessoas ajudem a encontrar defeitos em contratos inteligentes. A principal diferença é que os programas de recompensas por bugs estão abertos para uma comunidade mais ampla de desenvolvedores/hacker. +Teste de integração é útil se o seu contrato adota uma arquitetura modular ou interfaces com outros contratos on-chain durante a execução. One way of running integration tests is to [fork the blockchain](/glossary/#fork) at a specific height (using a tool like [Forge](https://book.getfoundry.sh/forge/fork-testing) or [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks) and simulate interactions between your contract and deployed contracts. -Programas de recompensa por bugs frequentemente atraem uma ampla classe de hackers éticos e profissionais de segurança independentes com habilidades e experiência exclusivas. Isso pode ser uma vantagem em relação às auditorias de contratos inteligentes, que dependem principalmente de equipes que podem possuir conhecimentos especializados limitados ou estreitos. +O blockchain que sofreu fork irá se comportar similarmente à Mainnet e ter contas com estados e saldos associados. Mas ele age somente como um ambiente de área local de desenvolvimento restrita, significando que você não precisará de ETH real para transações, por exemplo, nem suas modificações irão afetar o protocolo Ethereum real. -## Testes vs. Verificação formal {#testing-vs-formal-verification} +### Teste baseado em propriedade {#property-based-testing-for-smart-contracts} -Ao passo que testar ajuda a confirmar se um contrato retorna os resultados esperados para algumas entradas de dados, isso não pode comprovar de forma conclusiva o mesmo para entradas não utilizadas durante os testes. Testar um contrato inteligente não pode garantir "correção funcional", o que significa que não pode mostrar que um programa se comporta conforme necessário para _todos os_ conjuntos de valores e condições de entrada. +Teste baseado em propriedade é o processo de checar que um contrato inteligente satisfaz algumas propriedades definidas. Propriedades afirmam fatos sobre o comportamento de um contrato esperado continuar verdadeiro em diferentes cenários - um exemplo de propriedade de contrato inteligente poderia ser "Operações aritméticas no contrato nunca sofrem overflow ou underflow." -Como tal, os desenvolvedores são incentivados a incorporar **verificação formal** em sua abordagem para avaliar a exatidão dos contratos inteligentes. A verificação formal usa [métodos formais](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/)— técnicas matematicamente rigorosas para especificar e verificar softwares. +**Análise estática** e **análise dinâmica** são duas técnicas comuns de execução de teste baseado em propriedade, e ambas podem verificar que o código para um programa (um contrato inteligente no caso) satisfaz algumas propriedades pré-definidas. Algumas ferramentas de teste baseadas em propriedade vem com regras pré-definidas sobre propriedades esperadas de contratos e checam o código contra estas regras, enquanto outras permitem você criar propriedades customizadas para um contrato inteligente. -A verificação formal é considerada importante para contratos inteligentes, porque ajuda os desenvolvedores a testar formalmente suposições relacionadas a contratos inteligentes. Isso é feito criando especificações formais que descrevem as propriedades de um contrato inteligente e verificam que um modelo formal do contrato inteligente corresponde à especificação. Esta abordagem aumenta a confiança de que um contrato inteligente executará funções apenas como definido na lógica de negócios e nada mais. +#### Análise estática {#static-analysis} -[Saiba mais sobre verificação formal de contratos inteligentes](/developers/docs/smart-contracts/formal-verification) +Um analisador estático pega como entrada o código-fonte de um contrato inteligente e retorna resultados declarando se o contrato satisfaz a propriedade ou não. Diferente da análise dinâmica, análise estática não envolve executar um contrato para analisá-lo por exatidão. Análise estática gera razões alternativas sobre todos os caminhos possíveis que um contrato inteligente poderia tomar durante a execução (ou seja, examinando a estrutura do código-fonte para determinar o que significaria para a operação do contrato em tempo de execução). -## Testando ferramentas e bibliotecas {#testing-tools-and-libraries} +Testes [Linting](https://www.perforce.com/blog/qac/what-lint-code-and-why-linting-important) e [estático](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) são métodos comuns de rodar análise estática em contratos. Ambos requerem analisar representações de baixo nível da execução de um contrato, como [árvores de sintaxe abstrata](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) e [gráficos de controle de fluxo](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/) retornados pelo compilador. -### Ferramentas de testes unitários {#unit-testing-tools} +Na maioria dos casos, análise estática é útil para detectar problemas de segurança como uso de construtores inseguros, erros de sintaxe, ou violações de padrões de código no código de contratos. Entretanto, analisadores estáticos são conhecidos por geralmente serem instáveis em detectar vulnerabilidades mais profundas, e podem produzir excessivos falsos positivos. -**Solidity-Coverage** - _Ferramenta de cobertura de código em Solidity útil para testar contratos inteligentes._ +#### Análise dinâmica {#dynamic-analysis} -- [GitHub](https://github.com/sc-forks/solidity-coverage) +Análise dinâmica gera entradas simbólicas (por exemplo, em [execução simbólica](https://en.m.wikipedia.org/wiki/Symbolic_execution)) ou entradas concretas (por exemplo, em [fuzzing](https://owasp.org/www-community/Fuzzing)) para funções de contratos inteligentes para ver se qualquer trace de execução violou propriedades específicas. Esta forma de teste baseado em propriedades difere dos testes unitários no tocante a casos de teste cobrem múltiplos cenários e um programa manipula a geração de casos de teste. -**Waffle** - _Um framework para desenvolvimento avançado de contratos inteligentes e testes (baseado em ethers.js)_. +[Fuzzing](https://halborn.com/what-is-fuzz-testing-fuzzing/) é um exemplo de análise técnica dinâmica para verificar propriedades arbitrárias em contratos inteligentes. Um fuzzer invoca funções em um contrato alvo com variações randômicas ou mal formadas de um valor de entrada definido. Se um contrato inteligente entra em estado de erro (por exemplo, uma afirmação 'where' falha), o problema é indicado e as entradas que geraram esta execução para o caminho da vulnerabilidade são produzidas em um relatório. -- [Documentação](https://ethereum-waffle.readthedocs.io/en/latest/) -- [GitHub](https://github.com/TrueFiEng/Waffle) -- [Site](https://getwaffle.io/) +Fuzzing é útil para avaliação de um mecanismo de validação de entrada de contratos inteligentes, já que manipulação imprópria de entradas inesperadas pode resultar em execução não pretendida e produzir efeitos perigosos. Esta forma de teste baseado em propriedade pode ser ideal por muitas razões: -**Remix Tests** - _Ferramenta para testar contratos inteligentes em Solidity. Funciona abaixo do plugin Remix IDE "Solidity Unit Testing" usado para escrever e executar casos de teste para um contrato._ +1. **Escrever casos de teste para cobrir muitos cenários é difícil.** Um teste de propriedade somente requer que você defina o comportamento e faixa de dados com a qual testar o comportamento - o programa automaticamente gera casos de teste baseados na propriedade definida. -- [Documentação](https://remix-ide.readthedocs.io/en/latest/unittesting.html) -- [GitHub](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests) +2. **Sua suíte de testes pode não cobrir suficientemente todos os caminhos possíveis dentro do programa. ** Até com 100% de cobertura, é possível perder alguns casos limítrofes. -**OpenZeppelin Test Environment -** _ Biblioteca de asserções para teste de contrato inteligente Ethereum. Certifique-se de que seus contratos se comportam como esperado!_ +3. **Testes unitários provam que um contrato executa corretamente para dados de amostra, mas se o contrato executa corretamente para entradas fora das amostras, permanece desconhecido.** Testes de propriedade executam um contrato alvo com múltiplas variações de uma dado valor de entrada para encontrar traços de execução que causaram falhas de afirmação. Por isso, um teste proprietário fornece mais garantias que um contrato execute corretamente para uma larga classe de dados de entrada. -- [GitHub](https://github.com/OpenZeppelin/openzeppelin-test-helpers) -- [Documentação](https://docs.openzeppelin.com/test-helpers) +### Orientações para rodar teste baseado em propriedade para contratos inteligentes {#running-property-based-tests} -**Framework para teste de contrato inteligente Truffle** - _Framework de testes automatizado para tornar os testes de seus contratos mais simples._ +Executar testes baseados em propriedade geralmente começa com a definição da propriedade (por exemplo, ausência de [overflows de inteiro](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)) ou com coleções de propriedades que você quer verificar em um contrato inteligente. Você pode também precisar definir uma faixa de valores dentro da qual o programa pode gerar dados para entradas de transação quando escrevendo os testes de propriedade. -- [Documentação](https://trufflesuite.com/docs/truffle/testing/testing-your-contracts/) -- [Site](https://trufflesuite.com/) +Uma vez configurado propriamente, a ferramenta de teste de propriedade irá executar as suas funções do contrato inteligente com entradas aleatoriamente geradas. Se houver quaisquer violações de afirmações, você deve receber um relatório com os dados de entrada concretos que violaram a propriedade sendo avaliada. Veja alguns dos guias abaixo para começar com testes baseados em propriedade com diferentes ferramentas: -**Framework para testes unitário Brownie** - _Brownie utiliza Pytest, um framework de testes rico em recursos que permite que você escreva pequenos testes com código mínimo, dimensiona bem para projetos grandes e é altamente extensível._ +- **[Análise estática de contratos inteligentes com Slither](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither#slither)** +- **[Teste baseado em propriedade com Brownie](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)** +- **[Contratos Fuzzing com Foundry](https://book.getfoundry.sh/forge/fuzz-testing)** +- **[Contratos Fuzzing com Echidna](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial)** +- **[Execução simbólica de contratos inteligentes com Manticore](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore#manticore-tutorial)** +- **[Execução simbólica de contratos inteligentes com Mythril](https://mythril-classic.readthedocs.io/en/master/tutorial.html)** -- [Documentação](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html) -- [GitHub](https://github.com/eth-brownie/brownie) +## Testes manuais para contratos inteligentes {#manual-testing-for-smart-contracts} -**Foundry testes** - _Foundry oferece o Forge, um framework de testes da Ethereum rápido e flexível capaz de executar testes unitários simples, verificações de otimização de gás e fusão de contratos._ +Teste manual de contratos inteligentes frequentemente vêm mais tarde no ciclo de desenvolvimento, após rodar testes automatizados. Essa forma de teste avalia o contrato inteligente como um produto totalmente integrado para ver se ele executa conforme especificado nos requisitos técnicos. -- [GitHub](https://github.com/foundry-rs/foundry/tree/master/forge) -- [Documentação](https://book.getfoundry.sh/forge/) +### Testando contratos no blockchain local {#testing-on-local-blockchain} -**Etheno** - _Ferramenta de teste de Ethereum All-in-one compreendendo um multiplexador de RPC JSON, ferramenta de ferramentas de análise e ferramenta de integração de teste. Etheno elimina a complexidade da criação de ferramentas de análise como Manticore e Echidna em grandes projetos multicontratos._ +Enquanto testes automatizados realizados em um ambiente local de desenvolvimento podem fornecer informações úteis de depuração, você irá querer saber como seus contrato inteligente se comporta em um ambiente de produção. Entretanto, implantar na cadeia principal do Ethereum incorre em taxas de gas - sem mencionar que você ou seus usuários podem perder dinheiro real se o seu contrato inteligente ainda tem falhas. -- [GitHub](https://github.com/crytic/etheno) +Testar seu contrato em um blockchain local (também conhecido como uma [rede de desenvolvimento](/developers/docs/development-networks/)) é uma alternativa recomendada em relação a testar na Mainnet. Um blockchain local é uma cópia do blockchain Ethereum rodando localmente no seu computador que simula o comportamento da camada de execução do Ethereum. Como tal, você pode programar transações para interagir com um contrato sem incorrer em custo significante. -**Estrutura de testes e desenvolvimento Woke** — _Scripts de teste e implantação com dicas, fuzzer, suporte para depuração, cobertura de código e teste cross-chain em Python._ +Rodar contratos em blockchain local pode ser útil como forma de teste de integração manual. [Contratos inteligentes são altamente combináveis](/developers/docs/smart-contracts/composability/), permitindo você integrar com protocolos existentes - mais você ainda precisará garantir que interações on-chain assim tão complexas produzam os resultados corretos. -- [Documentação](https://ackeeblockchain.com/woke/docs/latest/testing-framework/overview/) -- [GitHub](https://github.com/Ackee-Blockchain/woke) +[Mais sobre redes de desenvolvimento.](/developers/docs/development-networks/) -### Ferramentas de análise estática {#static-analysis-tools} +### Testando contratos nas redes de teste {#testing-contracts-on-testnets} -**Mythril** — _Ferramenta de avaliação de bytecode de EVM para detectar vulnerabilidades de contrato usando análise concolic e análise de fluxo de controle._ +Uma rede de teste ou testnet funciona exatamente como o Ethereum Mainnet, exceto que ela usa Ether (ETH) sem valor no mundo real. Implantar seu contrato em uma [testnet](/developers/docs/networks/#ethereum-testnets) significa que qualquer um pode interagir com ele (por exemplo, via o front-end do dapp) sem colocar fundos em risco. -- [GitHub](https://github.com/ConsenSys/mythril-classic) -- [Documentação](https://mythril-classic.readthedocs.io/en/master/about.html) +Esta forma de teste manual é útil para avaliação do fluxo fim-a-fim da sua aplicação do ponto de vista do usuário. Aqui, testadores beta podem também realizar execuções experimentais e reportar qualquer problema com a lógica de negócios do contrato e funcionalidade geral. -**Slither** — _Estrutura de análise estática do Solidity baseado em Python para encontrar vulnerabilidades, aprimorando a compreensão de código e escrevendo análises personalizadas para contratos inteligentes._ +Implantar na testnet depois de testar no blockchain local é ideal desde que o primeiro é mais perto do comportamento da Máquina Virtual Ethereum. Portanto, é comum para muitos projetos nativos do Ethereum implantar dapps nas testnets para avaliar a operação dos contratos inteligentes em condições de vida real. -- [GitHub](https://github.com/crytic/slither) +[Mais sobre redes de teste do Ethereum.](/developers/docs/development-networks/#public-beacon-testchains) + +## Testes vs. Verificação formal {#testing-vs-formal-verification} -**Rattle** — _Estrutura de análise estática de bytecode de EVM concebido para trabalhar em contratos inteligentes implementados._ +Ao passo que testar ajuda a confirmar se um contrato retorna os resultados esperados para algumas entradas de dados, isso não pode comprovar de forma conclusiva o mesmo para entradas não utilizadas durante os testes. Testar um contrato inteligente, portanto, não pode garantir "correção funcional" (o que significa que não pode mostrar que um programa se comporta conforme necessário para _todos os_ conjuntos de valores de entrada). -- [GitHub](https://github.com/crytic/rattle) +Verificação formal é uma abordagem para avaliação da correção do software checando se um modelo formal do programa bate com a especificação formal. Um modelo formal é uma representação matemática abstrata de um programa, enquanto uma especificação formal define as propriedades de um programa (por exemplo, afirmações lógicas sobre a execução do programa). -### Ferramentas de análise dinâmica {#dynamic-analysis-tools} +Pelo fato de propriedades serem escritas em termos matemáticos, é possível verificar que um modelo formal (matemático) do sistema satisfaz uma especificação usando regras lógicas de inferência. Por isso, ferramentas de verificação formal são ditas produzir 'provas matemáticas' da correção de um sistema. -**Echidna** — _Difusor de contrato rápido para detectar vulnerabilidades em contratos inteligentes por meio de testes baseados em propriedades._ +Diferente de testar, verificações formais podem ser usadas para verificar se a execução de um contrato inteligente satisfaz uma especificação formal para _todas_ as execuções (por exemplo, não ter falhas) sem necessitar executá-lo com dados de amostra. Não apenas isto reduz tempo gasto em rodar dezenas de testes unitários, mas é também mais efetivo na caça por vulnerabilidades escondidas. Dito isto, técnicas de verificação formal se baseiam em um espectro dependendo da sua dificuldade de implementação e utilidade. -- [GitHub](https://github.com/crytic/echidna/) +[Saiba mais sobre verificação formal de contratos inteligentes.](/developers/docs/smart-contracts/formal-verification) -**Harvey** — _Ferramenta automatizada de difusão útil para detectar violações de propriedades em código de contrato inteligente._ +## Testes vs auditorias e recompensas por bugs {#testing-vs-audits-bug-bounties} -- [Website](https://consensys.net/diligence/fuzzing/) +Como mencionado, testes rigorosos raramente podem garantir a ausência de bugs em um contrato; abordagens de verificação formal podem fornecer garantias mais fortes da correção, mas atualmente são difíceis de usar e incorrem em custos consideráveis. -**Mantícora** — _Estrutura de execução simbólica dinâmica para analisar o bytecode de EVM._ +Ainda assim, você pode aumentar a possibilidade de encontrar vulnerabilidades de contrato pegando uma revisão independente de código. [Auditorias de contratos inteligentes](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) e [recompensas por bugs](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) são duas maneiras de ter outros analisando os seus contratos. -- [GitHub](https://github.com/trailofbits/manticore) -- [Documentação](https://github.com/trailofbits/manticore/wiki) +Auditorias são realizadas por auditores experientes em encontrar casos de falhas de segurança e práticas pobres de desenvolvimento em contratos inteligentes. Uma auditoria irá geralmente incluir testes (e possivelmente verificação formal) assim como revisão manual de todo o código. -### Serviços de auditoria de contrato inteligente {#smart-contract-auditing-services} +Por outro lado, um programa de recompensas por bug geralmente envolve oferta de recompensa financeira para um indivíduo (geralmente descrito como um [whitehat hackers](https://en.wikipedia.org/wiki/White_hat_(computer_security))) que descobre uma vulnerabilidade em um contrato inteligente e divulga-a para os desenvolvedores. As recompensas por bugs são semelhantes às auditorias, uma vez que envolve pedir que outras pessoas ajudem a encontrar defeitos em contratos inteligentes. -**ConsenSys Diligence** — _Serviço de auditoria inteligente de contratos que ajuda projetos no ecossistema da blockchain e garante que seus protocolos estejam prontos para serem lançados e criados para proteger os usuários._ +A maior diferença é que programas de recompensa por bug são abertos a uma maior comunidade de desenvolvedores/hackers e atraem uma vasta classe de hackers éticos e profissionais de segurança independentes com habilidades únicas e experiência. Isso pode ser uma vantagem em relação às auditorias de contratos inteligentes, que dependem principalmente de equipes que podem possuir conhecimentos especializados limitados ou estreitos. + +## Testando ferramentas e bibliotecas {#testing-tools-and-libraries} + +### Ferramentas de testes unitários {#unit-testing-tools} -- [Site](https://consensys.net/diligence/) +- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** - _Ferramenta de cobertura de código para contratos inteligentes escritos em Solidity._ -**CertiK** — _Empresa de segurança de blockchain pioneira no uso de tecnologia de verificação formal de ponta em contratos inteligentes e redes blockchain._ +- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** - _Framework para desenvolvimento avançado de contratos inteligentes e teste (baseado no ethers.js)_. -- [Site](https://www.certik.com/) +- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** - _Ferramenta para testar contratos inteligentes em Solidity. Funciona abaixo do plugin Remix IDE "Solidity Unit Testing" usado para escrever e executar casos de teste para um contrato._ -**Trail of Bits** — _Empresa de segurança virtual que combina pesquisa de segurança com uma mentalidade de invasores para reduzir riscos e fortalecer o código._ +- **[Auxiliar para Teste do OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _Biblioteca de asserções para teste de contrato inteligente Ethereum. Certifique-se de que seus contratos se comportam como esperado!_ -- [Site](https://www.trailofbits.com/) +- **[Framework de teste de unidade do Brownie](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie utiliza Pytest, uma estrutura de teste rica em recursos que permite que você escreva pequenos testes com o mínimo de código, escala bem para grandes projetos e é altamente extensível._ -**PeckShield** — _Empresa de segurança de blockchain que oferece produtos e serviços para a segurança, privacidade e usabilidade de todo o ecossistema blockchain._ +- **[Froundry Testes](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry oferece o Forge, um framework de teste no Ethereum rápido e flexível, capaz de executar testes de unidade simples, verificações de otimização de gás e mutações (fuzzing) em contratos._ -- [Site](https://peckshield.com/) +- **[Hardhat Testes](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _Framework para testar contratos inteligentes com base no ethers.js, Mocha e Chai._ -**QuantStamp** — _Serviço de auditoria que facilita a adoção geral da tecnologia blockchain por meio de serviços de segurança e avaliação de riscos._ +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _Desenvolvimento baseado em Python e framework de teste para contratos inteligentes voltados para a Máquina Virtual Ethereum._ -- [Site](https://quantstamp.com/) +### Ferramentas de teste baseadas em propriedades {#property-based-testing-tools} -**OpenZeppelin** — _Empresa de segurança de contrato inteligente, que fornece auditorias de segurança para sistemas distribuídos._ +#### Ferramentas de análise estática {#static-analysis-tools} -- [Site](https://www.openzeppelin.com/security-audits) +- **[Slither](https://github.com/crytic/slither)** - _Framework com base no Python de análise estática estabelecida no Solidity para encontrar vulnerabilidades, aprimorar a compreensão do código e escrever análises personalizadas para contratos inteligentes._ -**Nethermind** — _Serviços de auditoria Solidity e Cairo, que garantem a integridade de contratos inteligentes e a segurança dos usuários pelo Ethereum e Starknet._ +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _Analisador (linter) para garantir as práticas recomendadas de estilo e segurança para a linguagem de programação de contrato inteligente Solidity._ -- [Site](https://nethermind.io/smart-contracts-audits) +#### Ferramentas de análise dinâmica {#dynamic-analysis-tools} -### Plataformas de recompensa por bugs {#bug-bounty-platforms} +- **[Echidna](https://github.com/crytic/echidna/)** - _Fuzzer (analisador) de contrato para detectar vulnerabilidades em contratos inteligentes por meio de testes baseados em propriedade._ -**Immunefi** — _Plataforma de recompensa por bugs para contratos inteligentes e projetos DeFi, na qual pesquisadores de segurança revisam o código, divulgam vulnerabilidades, são pagos e tornam as criptomoedas mais seguras._ +- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** - _ Ferramenta de análise automatizada útil para detectar violações de propriedade no código de contrato inteligente._ -- [Website](https://immunefi.com/) +- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** - _Framework de execução simbólica dinâmica para análise de bytecode na EVM._ -**HackerOne** — _Coordenação de vulnerabilidades e plataforma de recompensas por bug que conecta empresas com testadores de infiltração e pesquisadores de cibersegurança._ +- **[Mithril](https://github.com/ConsenSys/mythril-classic)** - _ Ferramenta para diagnóstico de bytecode na EVM para detectar vulnerabilidades de contrato usando análise de contaminação, análise simbólica e verificação de fluxo de controle._ -- [Website](https://www.hackerone.com/) +- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** - _ Scribble é uma linguagem de especificação e ferramenta de verificação do tempo de execução, que possibilita anotar contratos inteligentes com propriedades, o que permite testar automaticamente os contratos com ferramentas como Diligence Fuzzing ou MythX._ ## Tutoriais relacionados {#related-tutorials} -- [Configuração de integração contínua do Solidity e Truffle](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _ – Como configurar Travis ou Circle CI para testes de Truffle juntamente com plugins úteis._ -- [Visão geral de testes de produtos](/developers/tutorials/guide-to-smart-contract-security-tools/) _ – Uma visão geral e comparação de diferentes produtos de teste_ +- [Uma visão geral e comparação de diferentes produtos de teste](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ - [Como usar o Echidna para testar contratos inteligentes](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) - [Como usar o Manticore para encontrar bugs em contratos inteligentes](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [Como utilizar o Slither para encontrar bugs nos contratos inteligentes](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) -- [Como simular contratos do Solidity para teste](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) -- [Como migrar do Truffle Tests para o ambiente de teste OpenZeppelin](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) -- [Como testar os contratos depois que eles foram implantados em uma rede](https://fulldecent.blogspot.com/2019/04/testing-deployed-ethereum-contracts.html) -- [Aprenda sobre desenvolvimento de Blockchain, Solidity e Web3 de pilha completa com JavaScript no YouTube](https://www.youtube.com/watch?v=gyMwXuJrbJQ) -- [Curso de Contrato Inteligente, Solidity e Blockchain no YouTube](https://www.youtube.com/watch?v=M576WGiDBdQ) +- [Como simular contratos Solidity para teste](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) +- [How to run unit tests in Solidity using Foundry](https://www.rareskills.io/post/foundry-testing-solidity) ## Leitura adicional {#further-reading} -- [Um guia completo para testar contratos inteligentes do Ethereum](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) — _Ben Hauser_ -- [Como testar os contratos inteligentes do Ethereum](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) — _Alex Roan_ +- [Um guia detalhado para testar contratos inteligentes do Ethereum](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) +- [Como testar contratos inteligentes do Ethereum](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) +- [Guia de teste de unidade do MolochDAO para desenvolvedores](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) +- [Como testar contratos inteligentes como um astro do rock](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/upgrading/index.md new file mode 100644 index 00000000000..0ea6b7aca97 --- /dev/null +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/upgrading/index.md @@ -0,0 +1,165 @@ +--- +title: Atualizando contratos inteligentes +description: Uma visão geral dos padrões de atualização de contratos inteligentes no Ethereum +lang: pt-br +--- + +Contratos inteligentes no Ethereum são programas auto-executados que rodam em Máquina Virtual Ethereum (EVM). Estes programas são imutáveis por desenho, o que evita quaisquer atualizações na lógica de negócios uma vez que o contrato é implantado. + +Enquanto imutabilidade é necessária para falta de confiança, descentralização, e segurança de contratos inteligentes, ela pode ser um problema em certos casos. Por exemplo, código imutável pode tornar impossível desenvolvedores consertar contratos vulneráveis. + +Entretanto, mais pesquisas sobre melhoria de contratos inteligentes tem levado à introdução de vários padrões de atualização. Estes padrões de atualização permitem a desenvolvedores atualizar contratos inteligentes (enquanto preservam a imutabilidade) colocando lógica de negócio em diferentes contratos. + +## Pré-requisitos {#prerequisites} + +Você deve ter um bom entendimento de [contratos inteligentes](/developers/docs/smart-contracts/), [anatomia de contratos inteligentes](/developers/docs/smart-contracts/anatomy/), e a [Máquina Virtual Ethereum (EVM)](/developers/docs/evm/). Este guia também presume que os leitores entendam de programação de contratos inteligentes. + +## O que é uma atualização de contrato inteligente? {#what-is-a-smart-contract-upgrade} + +Uma atualização de contrato inteligente envolve mudar a lógica de negócios de um contrato inteligente enquanto preserva o estado do contrato. É importante esclarecer que capacidade de atualização e mutabilidade não são o mesmo, especialmente no contexto de contratos inteligentes. + +Você ainda não pode mudar um programa implantado em um endereço na rede Ethereum. Mas você pode alterar o código que é executado quando usuários interagem com um contrato inteligente. + +Isto pode ser feito por meio dos seguintes métodos: + +1. Criando múltiplas versões de um contrato inteligente e migrando o estado (ou seja, os dados) de um contrato antigo para uma nova instância do contrato. + +2. Criando contratos separados para armazenar lógica de negócios e estado. + +3. Usando padrões de proxy para delegar chamadas de função de um contrato de proxy imutável para um contrato de lógica modificável. + +4. Criando um contrato principal imutável que faz interface e confia em contratos satélites flexíveis para executar funções específicas. + +5. Usando o padrão diamante para delegar chamadas de função de um contrato proxy para contratos lógicos. + +### Mecanismo de atualização 1: Migração de contrato {#contract-migration} + +Migração de contrato é baseada no versionamento - a ideia de criar e gerenciar estados únicos do mesmo software. Migração de contrato envolve implantar uma nova instância de um contrato inteligente existente e transferir o storage e saldos para o novo contrato. + +O recém-implantado contrato terá um storage vazio, permitindo você recuperar dados do contrato antigo e escrevê-lo na nova implementação. Depois disso, você precisará atualizar todos os contratos que interagiram com o contrato antigo para refletir o novo endereço. + +O último passo na migração do contrato é convencer usuários a mudar para o novo contrato. A nova versão do contrato irá reter saldos de usuários e endereços, que preserva a imutabilidade. Se for um contrato baseado em token, você também precisará contatar a corretora para descartar o contrato antigo e usar o novo contrato. + +Migração de contrato é uma medida relativamente direta e segura para atualização de contratos inteligentes sem quebrar interações de usuários. Entretanto, migrar manualmente o storage do usuário e saldos para o novo contrato é demorado e pode incorrer em altos gastos com gas. + +[Mais sobre migração de contrato.](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) + +### Mecanismo de atualização 2: Separação de dados {#data-separation} + +Um outro método para atualização de contratos inteligentes é separar a lógica de negócios e o armazenamento de dados em contratos separados. Isto significa usuários interagirem com a lógica do contrato, enquanto dados são armazenados na storage do contrato. + +O contrato lógico contém o código executado quando usuários interagem com a aplicação. Ele também mantém o endereço de storage do contrato e interage com ele para pegar e configurar os dados. + +Enquanto isso, o storage do contrato mantém o estado associado com o contrato inteligente, como saldos de usuários e endereços. Note que o storage do contrato é de propriedade da lógica do contrato e é configurado com o endereço do último na implantação. Isto evita contratos não autorizados de chamar o storage do contrato ou atualizar seus dados. + +Por padrão, o storage do contrato é imutável - mas você pode substituir o contrato lógico que ele aponta para uma nova implementação. Isto irá mudar o código que roda na EVM, enquanto mantém o storage o saldos intactos. + +Usando este método de atualização requer atualizar o endereço do contrato lógico na storage do contrato. Você tem também que configurar o novo contrato lógico com o endereço do storage do contrato, por razões já explicadas anteriormente. + +O padrão de separação de dados é discutivelmente mais fácil de implementar comparado à migração de contrato. Entretanto, você terá de gerenciar múltiplos contratos e implementar esquemas complexos de autorização para proteger contratos inteligentes de atualizações maliciosas. + +### Mecanismo de atualização 3: Padrões de proxy {#proxy-patterns} + +O padrão de proxy também usa separação de dados para manter lógica de negócio e dados em contratos separados. Entretanto, em um padrão de proxy, o storage do contrato (chamado de proxy) chama o contrato lógico durante a execução do código. Isto é o contrário do método de separação de dados, onde o contrato lógico chama o contrato de storage. + +Isto é o que acontece em um padrão proxy: + +1. Usuários interagem com o contrato de proxy, que armazena dados, mas não mantém a lógica de negócio. + +2. O contrato proxy armazena os endereços do contrato lógico e delega todas as chamadas de função para o contrato lógico (que mantém a lógica de negócio) usando a função `delegatecall`. + +3. Depois de a chamada ser direcionada para o contrato lógico, os dados retornados do contrato lógico é recuperado e retornado ao usuário. + +Usar padrões de proxy requer um entendimento da função **delegatecall**. Basicamente, `delegatecall` é um opcode que permite um contrato chamar outro contrato, enquanto a execução real do código acontece no contexto do contrato chamado. Uma implicação de usar `delegatecall` em padrões proxy é que o contrato proxy lê e escreve no seu storage e executa lógica armazenada no contrato lógico como se chamando uma função interna. + +Da [Documentação Solidity](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries): + +> _Existe uma variante especial de chamada de mensagem, chamada **delegatecall** que é idêntica à chamada de mensagem, exceto pelo fato de que o código no endereço alvo é executado no contexto (ou seja, no endereço) do contrato chamador e `msg.sender` e `msg.value` não mudam seus valores._ _Isto significa que um contrato pode dinamicamente carregar código de um endereço diferente em tempo de execução. Storage, endereço atual e saldo ainda se referem ao contrado chamador, somente o código é pego do endereço chamado._ + +O contrato proxy sabe invocar `delegatecall` sempre quando um usuário chama a função, porque ele tem uma funçaõ `fallback` construída dentro dele. Em programação Solidity a [função fallback](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) é executada quando uma chamada de função não encontra funções especificadas em um contrato. + +Fazer o padrão proxy trabalhar requer escrever uma função fallback customizada que especifique como o contrato proxy deve manipular chamadas de função que ele não suporta. Neste caso, a função de fallback do proxy é programada para iniciar um delegatecall and re-rotear a requisição do usuário para a implementação atual do contrato lógico. + +O contrato proxy é imutável por padrão, mas novos contratos lógicos com lógicas de negócio atualizadas podem ser criados. Fazer a atualização é então uma questão de mudança de endereço do contrato lógico referenciado no contrato proxy. + +Ao apontar o contrato proxy para um novo contrato lógico, o código executado quando os usuários chamam a função do contrato proxy é alterado. Isso nos permite atualizar a lógica do contrato sem pedir para os usuários interagirem com o novo contrato. + +Padrões proxy são um método popular para atualização de contratos inteligentes porque eles eliminam as dificuldades associadas com migração de contrato. No entanto, os padrões de proxy são mais complicados de usar e podem introduzir falhas críticas, como [conflitos do seletor de funções](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357), se usado indevidamente. + +[Mais sobre padrões de proxy](https://blog.openzeppelin.com/proxy-patterns/). + +### Mecanismo de atualização 4: Padrão de estratégia {#strategy-pattern} + +Esta técnica é influenciada pelo [padrão de estratégia](https://en.wikipedia.org/wiki/Strategy_pattern), que encoraja criar programas de software que fazem interface com outros programas para implementar recursos específicos. Aplicar padrão de estratégia para desenvolvimento Ethereum significaria construir um contrato inteligente que chama funções de outros contratos. + +O contrato principal neste caso contém o núcleo da lógica de negócio, mas faz interface com outros contratos inteligentes ("contratos satélites") para executar certas funções. Este contrato principal também armazena o endereço para cada contrato satélite e pode alternar entre diferentes implementações de contrato satélite. + +Você pode construir um novo contrato satélite e configurar o contrato principal com o novo endereço. Isto permite você mudar _estratégias_ (ou seja, implementar nova lógica) para um contrato inteligente. + +Apesar de similar ao padrão de proxy discutido anteriormente, o padrão de estratégia é diferente porque o contrato principal, com o qual usuários interagem, mantém a lógica de negócios. Usar este padrão te dá a oportunidade de introduzir mudanças limitadas a um contrato inteligente sem afetar a infraestrutura principal. + +A principal desvantagem é que este padrão é mais útil para implantar atualizações menores. Além disso, se o contrato for comprometido (por exemplo, via um hack), você não pode usar este método de atualização. + +### Mecanismo de atualização 5: Padrão Diamante {#diamond-pattern} + +O padrão diamante pode ser considerado uma melhoria do padrão proxy. Padrões diamante diferem dos padrões proxy porque o contrato proxy diamante pode delegar chamadas de função para mais de um contrato lógico. + +Os contratos lógicos no padrão diamante são conhecidos como _facets_. Para fazer o padrão diamante funcionar, você precisa criar um mapeamento no contrato proxy que mapeie [funções seletoras](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) para endereços facet diferentes. + +Quando um usuário faz uma chamada de função, o contrato proxy checa o mapeamento para encontrar o facet responsável por executar aquela função. Então ele invoca `delegatecall` (usando a função fallback) e redireciona a chamada para o devido contrato lógico. + +O padrão de atualização diamante tem algumas desvantagens sobre os padrões tradicionais de atualização proxy: + +1. Ele permite você atualizar uma pequena parte do contrato sem alterar todo o código. Usar o padrão proxy para atualizações requer criar um contrato lógico inteiramente novo, mesmo para pequenas atualizações. + +2. Todos os contratos inteligentes (incluindo contratos lógicos usados nos padrões proxy) tem 24KB de limite de tamanho, o que pode ser uma limitação - especialmente para contratos complexos que requerem mais funções. O padrão diamante facilita resolver este problema dividindo funções por múltiplos contratos lógicos. + +3. Padrões proxy adotam uma abordagem de pegar todos para controle de acesso. Uma entidade com acesso a funções de atualização pode mudar o contrato _inteiro_. Mas o padrão diamante habilita uma abordagem de permissões modulares, onde você pode restringir entidades para atualizar certas funções dentro de um contrato inteligente. + +[Mais sobre padrão diamante](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w). + +## Prós e contras da atualização de contratos inteligentes {#pros-and-cons-of-upgrading-smart-contracts} + +| Prós | Contras | +| ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Uma atualização de contrato inteligente pode tornar mais fácil corrigir vulnerabilidades descobertas na fase pós-implantação. | A atualização de contratos inteligentes nega a ideia de imutabilidade do código, o qual tem implicações sobre descentralização e segurança. | +| Os desenvolvedores podem usar atualizações lógicas para adicionar novas funcionalidades para aplicações descentralizadas. | Os usuários devem confiar nos desenvolvedores para não modificar contratos inteligentes de forma arbitrária. | +| As atualizações de contratos inteligentes podem melhorar a segurança para os usuários finais, pois os bugs podem ser corrigidos rapidamente. | A funcionalidade de atualização de programação em contratos inteligentes adiciona outra camada de complexidade e aumenta a possibilidade de falhas críticas. | +| As atualizações de contrato dá aos desenvolvedores mais liberdade para experimentar diferentes recursos e melhorar os dapps ao longo do tempo. | A oportunidade para atualizar contratos inteligentes pode encorajar os desenvolvedores a lançar projetos mais rapidamente sem fazer a devida diligência durante a fase de desenvolvimento. | +| | O controle de acesso inseguro ou a centralização em contratos inteligentes podem tornar mais fácil por atores maliciosos a execução de atualizações não autorizadas. | + +## Considerações para atualizar contratos inteligentes {#considerations-for-upgrading-smart-contracts} + +1. Use mecanismos seguros de controle/autorização de acesso para evitar atualizações não autorizadas de contratos inteligentes, especialmente ao usar padrões de proxy, padrões de estratégia ou separação de dados. Um exemplo é restringir o acesso à função de atualização, de modo que apenas o proprietário do contrato possa chamá-lo. + +2. A atualização de contratos inteligentes é uma atividade complexa e requer um alto nível de diligência para impedir a introdução de vulnerabilidades. + +3. Reduza as suposições de confiança ao descentralizar o processo de implementação de atualizações. As estratégias possíveis incluem usar um [contrato de carteira multi-sig](/developers/docs/smart-contracts/#multisig), para controlar atualizações ou exigir [membros de um DAO](/dao/) para votar na aprovação da atualização. + +4. Esteja ciente dos custos envolvidos na atualização de contratos. Por uma razão que, ao copiar o estado (por exemplo, saldos do usuário) de um contrato antigo para um novo contrato durante a migração do contrato pode exigir mais do que uma transação, o que significa mais taxas de gás. + +5. Considere implementar **bloqueios de tempo** para proteger os usuários. Um bloqueio de tempo se refere a um atraso aplicado de mudanças em um sistema. Os bloqueios de tempo podem ser combinados com um sistema de governança multi-sig para controlar as atualizações: se uma ação proposta atingir o limite de aprovação necessária, ela não será executada até que o período de atraso predefinido termine. + +Os bloqueios de tempo dão aos usuários algum tempo para sair do sistema, se eles discordarem de uma mudança proposta (por exemplo, atualização lógica ou novos esquemas de taxas). Sem bloqueios de tempo, os usuários precisam confiar nos desenvolvedores para não implementar alterações arbitrárias em um contrato inteligente sem aviso prévio. A desvantagem aqui é que os bloqueios de tempo restringem a capacidade de corrigir vulnerabilidades rapidamente. + +## Recursos {#resources} + +**Plugins de atualização do OpenZeppelin - _Um conjunto de ferramentas para implantar e proteger contratos inteligentes atualizáveis._** + +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades) +- [Documentação](https://docs.openzeppelin.com/upgrades) + +## Tutoriais {#tutorials} + +- [Atualizando seus contratos inteligentes | Tutorial do YouTube](https://www.youtube.com/watch?v=bdXJmWajZRY) por Patrick Collins +- [Tutorial de migração de contrtos inteligentes Ethereum](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) por Austin Griffith +- [Usando o padrão de proxy UUPS para atualizar contratos inteligentes](https://blog.logrocket.com/author/praneshas/) por Pranesh A.S +- [Tutorial Web3: Escreva o contrato inteligente atualizável (proxy) usando OpenZeppelin](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) por fangjun.eth + +## Leitura adicional {#further-reading} + +- [O estado das atualizações de contratos inteligentes](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) por Santiago Palladino +- [Várias maneiras de atualizar um contrato inteligente Solidity](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) - Blog do Crypto Market Pool +- [Aprenda: Atualizando contratos inteligentes](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) - Documentos do OpenZeppelin +- [Padrões de proxy para capacidade de atualização de contratos Solidity: Proxies Transparentes vs UUPS](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) por Naveen Sahu +- [Como funcionam as atualizações por diamantes](https://dev.to/mudgen/how-diamond-upgrades-work-417j) de Nick Mudge diff --git a/public/content/translations/pt-br/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/pt-br/developers/docs/smart-contracts/verifying/index.md new file mode 100644 index 00000000000..f1bea65fc45 --- /dev/null +++ b/public/content/translations/pt-br/developers/docs/smart-contracts/verifying/index.md @@ -0,0 +1,107 @@ +--- +title: Verificando contratos inteligentes +description: Uma visão geral da verificação do código-fonte de contratos inteligentes no Ethereum +lang: pt-br +--- + +[Contratos inteligentes](/developers/docs/smart-contracts/) são projetados para serem "sem confiança", ou seja, usuários não precisam ter que confiar em terceiros (ex. desenvolvedores e empresas) antes de interagir com um contrato. Como um requisito para a não necessidade de confiança, usuários e outros desenvolvedores precisam ser capazes de verificar o código-fonte de um contrato inteligente. A verificação do código-fonte assegura aos usuários e desenvolvedores que o código do contrato publicado é o mesmo código em execução no endereço do contrato na blockchain Ethereum. + +É importante fazer a distinção entre "verificação de código-fonte" e "[verificação formal](/developers/docs/smart-contracts/formal-verification/)". Verificação do código-fonte, que será explicada em detalhes abaixo, refere-se à verificação de que um determinado código-fonte de um contrato inteligente em uma linguagem de alto nível (ex. Solidity) compila com o mesmo bytecode a ser executado no endereço do contrato. Por outro lado, verificação formal descreve a verificação da corretude de um contrato inteligente, assegurando que o contrato se comporta como o esperado. Embora dependa do contexto, a verificação do contrato geralmente se refere à verificação do código-fonte. + +## O que é verificação do código-fonte? {#what-is-source-code-verification} + +Antes de fazer o deploy de um contrato inteligente na [Máquina Virtual do Ethereum (EVM)](/developers/docs/evm/), desenvolvedores [compilam](/developers/docs/smart-contracts/compiling/) o código-fonte do contrato —instruções [escritas em Solidity](/developers/docs/smart-contracts/languages/) ou outra linguagem de programação de alto nível— para bytecode. Como a EVM não pode interpretar instruções de alto nível, compilar o código-fonte para bytecode (ou seja, de baixo nível, instruções de máquina) é necessário para executar a lógica do contrato na EVM. + +A verificação do código-fonte é a comparação entre o código-fonte do contrato inteligente e o bytecode compilado usado durante a criação do contrato para detectar quaisquer diferenças. A verificação de contratos inteligentes é importante visto que o código do contrato anunciado pode diferir do que é executado na blockchain. + +A verificação do contrato inteligente permite investigar o que um contrato faz através da linguagem de alto nível em que é escrito, sem ter que ler código de máquina. Funções, valores, e geralmente os nomes de variáveis e comentários permanecem os mesmos do código-fonte original em que é compilado e feito o deploy. Isso torna a leitura do código muito mais fácil. A verificação da origem também incentiva a documentação do código, para que os usuários finais saibam o que um contrato inteligente é projetado para fazer. + +### O que é a verificação total? {#full-verification} + +Há algumas partes do código-fonte que não afetam o bytecode compilado, como comentários ou nomes de variáveis. Isso significa que dois códigos-fonte com diferentes nomes de variáveis e comentários conseguiriam verificar o mesmo contrato. Com isso, um ator malicioso consegue adicionar comentários enganosos ou dar nomes de variáveis enganosas dentro do código-fonte e obter o contrato verificado com um código-fonte diferente do código-fonte original. + +It is possible to avoid this by appending extra data to the bytecode to serve as a _cryptographic guarantee_ for the exactness of the source code, and as a _fingerprint_ of the compilation information. A informação necessária está disponível em [Metadados de contrato Solidity](https://docs.soliditylang.org/en/v0.8.15/metadata.html), e o hash desse arquivo é adicionado ao bytecode do contrato. Você pode conferi-lo em ação no [playground de metadados](https://playground.sourcify.dev). + +O arquivo de metadados contém informações sobre a compilação do contrato incluindo o código-fonte e seus hashes. Significa que, se alguma das configurações de compilação ou até mesmo um byte em um dos arquivos de origem mudar, o arquivo de metadados muda. Consequentemente, o hash do arquivo de metadados, o qual é anexado ao bytecode, também muda. Isso significa que se o bytecode de um contrato + seu hash de metadados correspondem ao determinado código-fonte e as configurações de compilação, nós podemos ter certeza de que é o mesmo código-fonte usando na compilação original, nem mesmo um único byte de diferença. + +Esse é tipo de verificação que se aproveita do hash é referenciado como **[verificação total](https://docs.sourcify.dev/docs/full-vs-partial-match/)** (também "verificação perfeita"). Se os hashes de metadados não coincidirem ou não forem considerados na verificação, essa seria uma "correspondência parcial", que atualmente é a maneira mais comum de se verificar contratos. É possível [inserir código malicioso](https://samczsun.com/hiding-in-plain-sight/) que não apareceria no código-fonte verificado sem a verificação total. A maioria dos desenvolvedores não está ciente da verificação completa e não mantém o arquivo de metadados de sua compilação, portanto, a verificação parcial tem sido o método de fato para verificar os contratos até agora. + +## Por que a verificação do código-fonte é importante? {#importance-of-source-code-verification} + +### Ausência de confiança {#trustlessness} + +A ausência da necessidade de confiança é provavelmente a maior premissa para contratos inteligentes e [aplicações descentralizadas (dapps)](/developers/docs/dapps/). Os contratos inteligentes são "imutáveis" e não podem ser alterados; um contrato executará apenas a lógica de negócio definida no código no momento do deploy. Isto significa que os desenvolvedores e empresas não podem manipular o código de um contrato após o deploy no Ethereum. + +Para que um contrato inteligente seja ausente de confiança, o código do contrato deve estar disponível para verificação independente. Embora o bytecode compilado de cada contrato inteligente esteja disponível publicamente na blockchain, uma linguagem de baixo nível é difícil de entender — tanto para desenvolvedores quanto para usuários. + +Projetos reduzem as suposições de confiança publicando o código-fonte de seus contratos. But this leads to another problem: it is difficult to verify that the published source code matches the contract bytecode. Nesse cenário, o valor da ausência de confiança é perdido porque os usuários precisam confiar nos desenvolvedores para não mudar a lógica de negócios de um contrato (ex. alterando o bytecode) antes do deploy na blockchain. + +As ferramentas de verificação do código-fonte fornecem garantias de que os arquivos do código-fonte do contrato inteligente correspondem ao código de montagem. O resultado é um ecossistema sem necessidade de confiança, no qual os usuários não dependem de confiar em terceiros uma vez que podem verificar o código antes de depositar fundos em um contrato. + +### Segurança do usuário {#user-safety} + +Em contratos inteligentes, geralmente há muito dinheiro envolvido. Isso pede por altas garantias de segurança e verificação da lógica de um contrato inteligente antes de usá-lo. O problema é que desenvolvedores inescrupulosos podem enganar usuários inserindo código malicioso em um contrato inteligente. Sem a verificação, contratos inteligentes maliciosos podem ter [backdoors](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), controversos mecanismos de controle de acesso, vulnerabilidades exploráveis, e outras coisas que comprometem a segurança dos usuários e que passariam despercebidas. + +Publicar os arquivos de código-fonte de um contrato inteligente torna mais fácil para interessados, como auditores, avaliar o contrato quanto a possíveis vetores de ataque. Com várias partes verificando independentemente o contrato inteligente, os usuários têm maiores garantias quanto à sua segurança. + +## Como verificar o código-fonte para contratos inteligentes Ethereum {#source-code-verification-for-ethereum-smart-contracts} + +[Implantar um contrato inteligente no Ethereum](/developers/docs/smart-contracts/deploying/) requer o envio de uma transação com o payload de dados (bytecode compilado) para um endereço especial. O payload de dados é gerado compilando o código-fonte, além dos [argumentos do construtor](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) da instância do contrato anexado aos dados do payload na transação. A compilação é determinística, o que significa que sempre produz a mesma saída (ou seja, bytecode de contrato), se os mesmos arquivos de origem e configurações de compilação (por exemplo, versão do compilador, otimizador) forem usados. + +![Um diagrama mostrando a verificação do código-fonte do contrato inteligente](./source-code-verification.png) + +A verificação de um contrato inteligente basicamente envolve os seguintes passos: + +1. Insira os arquivos de origem e as configurações de compilação em um compilador. + +2. O compilador gera o bytecode do contrato + +3. Obtenha o bytecode do contrato implantado em um dado endereço + +4. Compare o bytecode implantado com o bytecode recompilado. Se os códigos corresponderem, o contrato é verificado com o código-fonte fornecido e as configurações de compilação. + +5. Além disso, se os hashes de metadados no final do bytecode corresponderem, será uma correspondência completa. + +Note que esta é uma descrição simplista de verificação e há muitas exceções que não funcionariam com isso, como ter [variáveis imutáveis](https://docs.sourcify.dev/docs/immutables/). + +## Ferramentas de verificação de código-fonte {#source-code-verification-tools} + +O processo tradicional de verificação de contratos pode ser complexo. Isto é porque nós temos ferramentas para verificar o código-fonte para contratos inteligentes implantados no Ethereum. Estas ferramentas automatizam grandes partes da verificação de código-fonte e também selecionam contratos verificados para os benefícios dos usuários. + +### Etherscan {#etherscan} + +Embora mais conhecido como um [observador da blockchain do Ethereum](/developers/docs/data-and-analytics/block-explorers/), o Etherscan também oferece um [serviço de verificação de código-fonte](https://etherscan.io/verifyContract) para desenvolvedores e usuários de contratos inteligentes. + +O Etherscan permite que você recompile o bytecode do contrato a partir do payload de dados original (código-fonte, endereço da biblioteca, configurações do compilador, endereço do contrato, etc.) Se o bytecode recompilado está associado ao bytecode (e aos parâmetros do construtor) do contrato on-chain, então [o contrato é verificado](https://info.etherscan.com/types-of-contract-verification/). + +Uma vez verificado, o código-fonte do seu contrato recebe um rótulo "Verificado" e é publicado no Etherscan, para que outros auditem. Ele também é adicionado à seção [Contratos Verificados](https://etherscan.io/contractsVerified/) - um repositório de contratos inteligentes com códigos-fonte verificados. + +Etherscan é a ferramenta mais usada para verificação de contratos. No entanto, a verificação de contrato do Etherscan tem uma desvantagem: ele falha ao comparar o **hash de metadados** do bytecode on-chain e o bytecode recompilado. Portanto, as correspondências no Etherscan são correspondências parciais. + +[Mais sobre a verificação de contratos no Etherscan](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327). + +### Sourcify {#sourcify} + +[Sourcify](https://sourcify.dev/#/verifier) é outra ferramenta para verificação de contratos que é de código aberto e descentralizada. Não é um observador de blocos e apenas verifica contratos em [diferentes redes baseadas em EVM](https://docs.sourcify.dev/docs/chains). Ele atua como uma infraestrutura pública para que outras ferramentas construam sobre ele, e tem como objetivo permitir interações de contrato mais amigáveis a humanos usando o [ABI](/developers/docs/smart-contracts/compiling/#web-applications) e [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) encontrados no arquivo de metadados. + +Ao contrário do Etherscan, o Sourcify suporta correspondências completas com o hash de metadados. Os contratos verificados são servidos em seu [repositório público](https://docs.sourcify.dev/docs/repository/) HTTP e [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs), que é um [armazenamento descentralizado](https://web3.storage/docs/concepts/content-addressing/) endereçado ao conteúdo. Isso permite buscar o arquivo de metadados de um contrato sobre IPFS, pois o hash de metadados incluído é um hash IPFS. + +Adicionalmente, também é possível recuperar os arquivos de código-fonte por IPFS, pois os hashes IPFS desses arquivos também são encontrados nos metadados. Um contrato pode ser verificado fornecendo o arquivo de metadados e os arquivos da origem por meio de sua API ou [UI](https://sourcify.dev/#/verifier) ou usando os plugins. A ferramenta de monitoramento Sourcify também escuta as criações de contratos em novos blocos e tenta verificar os contratos se os seus metadados e arquivos de origem são publicados no IPFS. + +[Mais sobre a verificação de contratos no Sourcify](https://blog.soliditylang.org/2020/06/25/sourcify-faq/). + +### Tenderly {#tenderly} + +A [plataforma Tenderly](https://tenderly.co/) permite desenvolvedores Web3 criem, testem, monitorem e operem contratos inteligentes. Ao combinar ferramentas de depuração com observabilidade e blocos de construção de infraestrutura, o Tenderly ajuda os desenvolvedores a acelerar o desenvolvimento de contratos inteligentes. Para habilitar totalmente os recursos do Tenderly, os desenvolvedores precisam [realizar a verificação do código-fonte](https://docs.tenderly.co/monitoring/contract-verification) usando vários métodos. + +É possível verificar um contrato de forma privada ou pública. Se verificado privadamente, o contrato inteligente ficará visível apenas para você (e outros membros do seu projeto). A verificação de um contrato publicamente o torna visível para todos que usam a plataforma Tenderly. + +Você pode verificar seus contratos usando o [Painel](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-a-smart-contract), [Plugin Tenderly da Hardhat](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-the-tenderly-hardhat-plugin) ou [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli). + +Ao verificar contratos através do Painel, você precisa importar o arquivo de origem ou o arquivo de metadados gerado pelo compilador Solidity, o endereço/rede e as configurações do compilador. + +O uso do plugin Tenderly da Hardhat permite mais controle sobre o processo de verificação com menos esforço, permitindo escolher entre verificação automática (sem código) e manual (baseado no código). + +## Leitura adicional {#further-reading} + +- [Verificando o código-fonte do contrato](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) diff --git a/public/content/translations/pt-br/developers/docs/transactions/index.md b/public/content/translations/pt-br/developers/docs/transactions/index.md index da8aa151a31..cd6142a6138 100644 --- a/public/content/translations/pt-br/developers/docs/transactions/index.md +++ b/public/content/translations/pt-br/developers/docs/transactions/index.md @@ -1,6 +1,6 @@ --- title: Transações -description: "Uma visão geral das transações no Ethereum: como elas funcionam, sua estrutura de dados e como enviá-las através de um aplicativo." +description: 'Uma visão geral das transações no Ethereum: como elas funcionam, sua estrutura de dados e como enviá-las através de um aplicativo.' lang: pt-br --- diff --git a/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index 588e248d0ba..cb4c27d78e7 100644 --- a/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/pt-br/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -4,16 +4,15 @@ description: Uma introdução ao desenvolvimento do Ethereum, especialmente úti author: Marc Garreau lang: pt-br tags: - - "primeiros passos" - "python" - "web3.py" skill: beginner published: 2020-09-08 -source: Snake charmers +source: O encantador de cobras sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/ --- -Você ouviu falar sobre Ethereum e agora está pronto para saber mais? Este post cobrirá rapidamente alguns conceitos básicos de blockchain e, em seguida, fará com que você interaja com um nó simulado do Ethereum – lendo dados do bloco, verificando saldos da conta e enviando transações. Em todo o caminho, vamos destacar as diferenças entre as maneiras tradicionais de desenvolver aplicativos e este novo paradigma descentralizado. +Então, você ouviu falar sobre esta coisa do Ethereum e está pronto para se aventurar no buraco do coelho? Este post cobrirá rapidamente alguns conceitos básicos de blockchain e, em seguida, fará com que você interaja com um nó simulado do Ethereum – lendo dados do bloco, verificando saldos da conta e enviando transações. Em todo o caminho, vamos destacar as diferenças entre as maneiras tradicionais de desenvolver aplicativos e este novo paradigma descentralizado. ## Pré-requisitos de software {#soft-prerequisites} @@ -21,8 +20,8 @@ Este post espera ser acessível a muitos desenvolvedores. Usaremos [ferramentas Suposições: -- você pode utilizar um terminal, -- você já escreveu algumas linhas de código Python, +- Você pode utilizar um terminal, +- Você já escreveu algumas linhas de código Python, - A versão 3.6 ou superior do Python está instalada no seu computador (uso de um [ambiente virtual](https://realpython.com/effective-python-environment/#virtual-environments) é fortemente recomendado) e - você já usou o `pip`, instalador de pacotes do Python. Novamente, se algum destes pré-requisitos não for verdadeiro, ou se você não planeja reproduzir o código apresentado neste artigo, é provável que você ainda possa acompanhar sem maiores problemas. @@ -35,7 +34,6 @@ Há muitas maneiras de descrever o Ethereum, mas no fundo é uma blockchain. As "number": 1234567, "hash": "0xabc123...", "parentHash": "0xdef456...", - "miner": "0xa1b2c3...", ..., "transactions": [...] } @@ -43,7 +41,7 @@ Há muitas maneiras de descrever o Ethereum, mas no fundo é uma blockchain. As Cada [bloco](/developers/docs/blocks/) tem uma referência ao bloco que veio antes dele; o `parentHash` é simplesmente o hash do bloco anterior. -Observação: o Ethereum faz uso regular de funções hash para produzir valores de tamanho fixo ("hashes"). Os hashes desempenham um papel importante no Ethereum, mas você pode pensar neles como IDs exclusivos por enquanto. + ![Um diagrama que retrata uma blockchain incluindo os dados dentro de cada bloco](./blockchain-diagram.png) @@ -59,11 +57,11 @@ Esta nova pilha de tecnologia descentralizada gerou novas ferramentas de desenvo Os desenvolvedores do Python que querem interagir com o Ethereum provavelmente usem a [Web3.py](https://web3py.readthedocs.io/). Web3.py é uma biblioteca que simplifica muito a forma como você se conecta a um nó Ethereum, e depois envia e recebe dados dele. -Nota: "Nó Ethereum" e "Cliente Ethereum" são usados de forma intercambiável. Em ambos os casos, refere-se ao software que um participante da rede Ethereum executa. Este software pode ler dados de blocos, receber atualizações quando novos blocos são adicionados à cadeia ("minerado"), transmitir novas transações e muito mais. + [Clientes Ethereum](/developers/docs/nodes-and-clients/) podem ser configurados para serem acessíveis por [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTPS ou Websockets, então Web3. y precisará espelhar esta configuração. Web3.py refere-se a estas opções de conexão como **provedores**. Você vai querer escolher um dos três provedores para vincular a instância da Web3.py ao seu nó. -![Um diagrama que mostra como web3.py usa o IPC para conectar o seu aplicativo a um nó Ethereum](./web3py-and-nodes.png) +![Um diagrama mostrando como web3.py usa IPC para conectar seu aplicativo a um nódulo Ethereum](./web3py-and-nodes.png) _Configure o nó Ethereum e o Web3.py para se comunicarem através do mesmo protocolo, por exemplo, o IPC neste diagrama._ @@ -81,34 +79,36 @@ w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) Neste guia, vamos trabalhar apenas com um interpretador de Python. Não criaremos nenhum diretório, arquivos, classes ou funções. -Observação: nos exemplos abaixo, os comandos que começam com `$` devem ser executados no terminal. (Não digite o `$`, ele apenas significa o início da linha.) + Primeiro, instale [IPython](https://ipython.org/) para explorar em um ambiente amigável. IPython propõe, entre outros, um recurso de autopreenchimento com tab, o que facilita a navegação no Web3.py. ```bash -$ pip install ipython +pip install ipython ``` Web3.py é publicado sob o nome `web3`. Instale-o assim: ```bash -$ pip install web3 +pip install web3 ``` Mais uma coisa: vamos simular uma blockchain mais tarde, o que requer mais algumas dependências. Você pode instalar por meio de: ```bash -$ pip install 'web3[tester]' +pip install 'web3[tester]' ``` Você está pronto para começar! +Nota: o pacote `web3[tester]` funciona até Python 3.10.xx + ## Crie uma sandbox {#spin-up-a-sandbox} -Abra um novo ambiente Python executando o `ipython` no seu terminal. Isso é comparável a executar `python`, mas vem com mais "efeitos especiais". +Abra um novo ambiente Python executando o `ipython` no seu terminal. Isso é como executar `python`, mas vem com mais "efeitos especiais". ```bash -$ ipython +ipython ``` Isso mostrará algumas informações sobre as versões do Python e do IPython que você está executando, então você deve ver um prompt esperando por uma entrada: @@ -117,7 +117,7 @@ Isso mostrará algumas informações sobre as versões do Python e do IPython qu In [1]: ``` -Você está olhando para um shell interativo do Python agora. Essencialmente, é uma sandbox para utilizar. If you’ve made it this far, its time to import Web3.py: +Você está olhando para um shell interativo do Python agora. Essencialmente, é um ambiente de testes para brincar. Se você chegou até aqui, é hora de importar Web3.py: ```python In [1]: from web3 import Web3 @@ -127,9 +127,9 @@ In [1]: from web3 import Web3 Além de ser um gateway para Ethereum, o módulo [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) oferece algumas funções práticas. Vamos ver algumas. -Em um aplicativo Ethereum, você normalmente precisará converter denominações de moeda. O módulo Web3 fornece alguns métodos auxiliares só para isso: [fromWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.fromWei) e [toWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toWei). +Em um aplicativo Ethereum, você normalmente precisará converter denominações de moeda. O módulo web3 fornece alguns métodos auxiliares apenas para isso: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) e [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei). - + Tente converter alguns valores de e para wei. Note que [existem nomes para muitas das denominações](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) entre ether e wei. Um dos mais conhecidos entre eles é o **gwei**, já que é frequentemente como as taxas de transação são representadas. ```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') ``` @@ -175,14 +175,14 @@ O nó simulado é chamado [eth-tester](https://github.com/ethereum/eth-tester) e In [4]: w3 = Web3(Web3.EthereumTesterProvider()) ``` -Agora você está pronto para navegar pela cadeia! Isso não é algo que as pessoas falam. É algo que eu acabei de inventar. Façamos um tour rápido. +Agora você está pronto para navegar pela cadeia! Disso as pessoas não falam. É algo que eu acabei de inventar. Façamos um tour rápido. ## O tour rápido {#the-quick-tour} Primeiro, uma verificação: ```python -In [5]: w3.isConnected() +In [5]: w3.is_connected() Out[5]: True ``` @@ -201,7 +201,7 @@ Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] ``` -Se você executar esse comando, você deverá ver uma lista de dez strings que começam com `0x`. Cada um é um **endereço público** e é, em alguns aspectos, análogo ao número da conta em uma conta corrente. Você forneceria este endereço a alguém que quisesse mandar ether para você. +Se você executar esse comando, você deverá ver uma lista de dez variáveis que começam com `0x`. Cada um é um **endereço público** e é, em alguns aspectos, análogo ao número da conta em uma conta corrente. Você forneceria este endereço a alguém que quisesse mandar ether para você. Como mencionado, o provedor de teste pré-carregou cada uma dessas contas com algum ether. Vamos descobrir quanto há na primeira conta: @@ -213,7 +213,7 @@ Out[7]: 1000000000000000000000000 São muitos zeros! Antes de você ir rindo até o banco falso, lembre-se daquela lição anterior sobre denominações de moeda. Os valores de ether são representados na menor denominação, wei. Converta para ether: ```python -In [8]: w3.fromWei(1000000000000000000000000, 'ether') +In [8]: w3.from_wei(1000000000000000000000000, 'ether') Out[8]: Decimal('1000000') ``` @@ -236,30 +236,30 @@ Out[9]: AttributeDict({ Sãp fornecidas muitas informações sobre um bloco, mas há apenas alguns pontos para salientar aqui: -- O número de bloco é zero — não importa quanto tempo você configurou o provedor de teste. Ao contrário da rede Ethereum real, que minera um novo bloco aproximadamente a cada 15 segundos, essa simulação esperará até que você a instrua a fazer alguma coisa. +- O número de bloco é zero — não importa quanto tempo você configurou o provedor de teste. Ao contrário da rede Ethereum real, que minera um novo bloco aproximadamente a cada 12 segundos, essa simulação esperará até que você a instrua a fazer alguma coisa. - `transactions` é uma lista vazia, pelo mesmo motivo: ainda não fizemos nada. Este primeiro bloco é um **bloco vazio**, apenas para iniciar a cadeia. - Observe que o `parentHash` é apenas um monte de bytes vazios. Isso significa que ele é o primeiro bloco da cadeia, também conhecido como **bloco de início**. ## Parada n.º 2 do tour: [transações](/developers/docs/transactions/) {#tour-stop-3-transactions} -Estamos presos no bloco zero até que haja uma transação para minerar, então vamos começar. Envie um teste com ether de uma conta para outra: +Estamos parados no bloco zero até que haja uma transação para minerar, então vamos começar. Envie um teste com ether de uma conta para outra: ```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 }) ``` -Normalmente, esse é o ponto em que você espera que sua transação seja minerada em um novo bloco. O processo completo envolve algo como isto: +Esse é normalmente o ponto em que você espera (vários segundos) até que sua transação seja minerada em um novo bloco. O processo completo envolve algo como isto: -1. Envie uma transação e espere pelo hash da transação. A transação fica "pendente" até que seja minerada. `tx_hash = w3.eth.send_transaction({ … })` +1. Envie uma transação e espere pelo hash da transação. Até que o bloco que contém a transação seja criado e transmitido, a transação fica "pendente" `tx_hash = w3.eth.send_transaction({ … })` 2. Aguarde a mineração da transação: `w3.eth.wait_for_transaction_receipt(tx_hash)` 3. Continue a lógica do aplicativo. Para visualizar a transação bem-sucedida: `w3.eth.get_transaction(tx_hash)` -Nosso ambiente simulado adicionará a transação a um novo bloco instantaneamente, para que possamos ver a transação imediatamente: +Nosso ambiente simulado adicionará a transação a um novo bloco instantaneamente para que possamos ver a transação imediatamente: ```python In [11]: w3.eth.get_transaction(tx_hash) @@ -274,21 +274,23 @@ Out[11]: AttributeDict({ }) ``` -You’ll see some familiar details here: the `from`, `to`, and `value` fields should match the inputs of our `send_transaction` call. A outra parte tranquilizadora é que esta transação foi incluída como a primeira transação (`'transactionIndex': 0`) dentro do bloco número 1. +Você verá alguns detalhes familiares aqui: os campos `de`, `para` e `valor` devem corresponder às entradas da chamada `sendTransaction`. A outra parte tranquilizadora é que esta transação foi incluída como a primeira transação (`'transactionIndex': 0`) dentro do bloco número 1. Também podemos ver facilmente o sucesso dessa transação, verificando o saldo das duas contas envolvidas. Três ether deveriam ter sido enviados de uma conta para outra. ```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 ``` -O último parece bem! O saldo foi de 1.000.000 a 1.000.003 ether. Mas o que aconteceu com a primeira conta? Parece ter perdido um pouco mais de três ether. Infelizmente, nada na vida é gratuito, e o uso da rede pública Ethereum requer que você compense os seus pares pelo papel de apoio deles. A small transaction fee was deducted from the account making the transaction to the tune of 31000 wei. +O último parece bem! O saldo foi de 1.000.000 a 1.000.003 ether. Mas o que aconteceu com a primeira conta? Parece ter perdido um pouco mais que três ether. Infelizmente, nada na vida é gratuito, e o uso da rede pública Ethereum requer que você compense os seus pares pelo papel de apoio deles. Uma pequena taxa de transação foi deduzida da conta que submeteu a transação - esta taxa é a quantidade de gás queimado (21000 unidades de gás para uma transferência ETH) multiplicado por uma taxa base, que varia de acordo com a atividade da rede, mais a gorjeta que vai para o validador que inclui a transação em um bloco. + +Mais sobre [gás](/developers/docs/gas/#post-london) -Observação: na rede pública, as taxas de transação são variáveis baseadas na demanda da rede e na rapidez com que você gostaria que uma transação fosse processada. Se você estiver interessado em ver como as taxas são calculadas, veja minha publicação anterior sobre como transações são incluídas em um bloco. + ## Agora uma pausa {#and-breathe} diff --git a/public/content/translations/pt-br/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/pt-br/developers/tutorials/all-you-can-cache/index.md new file mode 100644 index 00000000000..7a99bcf4de1 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/all-you-can-cache/index.md @@ -0,0 +1,867 @@ +--- +title: "Tudo que você puder armazenar em cache" +description: Aprenda como criar e usar um contrato de cache para transações de roll-up mais baratas +author: Ori Pomerantz +tags: + - "camada 2" + - "armazenamento em cache" + - "armazenamento" +skill: intermediate +published: 2022-09-15 +lang: pt-br +--- + +Ao usar roll-ups, o custo de um byte na transação é muito mais caro que o custo de um slot de armazenamento. Portanto, faz sentido armazenar em cache o máximo de informações possível na cadeia. + +Neste artigo, você aprenderá como criar e usar um contrato de armazenamento em cache de forma que qualquer valor de parâmetro, provável de ser usado diversas vezes, será armazenado em cache e ficará disponível para uso (depois da primeira vez) com um número muito menor de bytes, e como escrever código off-chain para usar esse cache. + +Se você quiser pular o artigo e somente ver o código-fonte, [consulte-o aqui](https://github.com/qbzzt/20220915-all-you-can-cache). A pilha de desenvolvimento é [Foundry](https://book.getfoundry.sh/getting-started/installation). + +## Design Geral {#overall-design} + +Para fins de simplicidade, vamos supor que todos os parâmetros de transação são `uint256`, com 32 bytes de tamanho. Quando recebemos uma transação, fazemos o parse em cada parâmetro deste modo: + +1. Se o primeiro byte for `0xFF`, pegue os 32 bytes seguintes como um valor de parâmetro e escreva-o no cache. + +2. Se o primeiro byte for `0xFE`, pegue os próximos 32 bytes como um valor de parâmetro, mas _não_ o escreva no cache. + +3. Para qualquer outro valor, pegue os primeiros quatro bits como o número de bytes adicionais, e os últimos quatro bits como os bits mais significantes da chave do cache. Veja aqui alguns exemplos: + + | Bytes em calldata | Chave da cache | + |:----------------- | --------------:| + | 0x0F | 0x0F | + | 0x10,0x10 | 0x10 | + | 0x12,0xAC | 0x02AC | + | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | + +## Manipulação do cache {#cache-manipulation} + +A cache é implementada em [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol). Vamos passar por ele linha a linha. + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + + +contract Cache { + + bytes1 public constant INTO_CACHE = 0xFF; + bytes1 public constant DONT_CACHE = 0xFE; +``` + +Essas constantes são usadas para interpretar os casos especiais nos quais fornecemos todas as informações, independentemente de as querermos escritas no cache ou não. Escrever no cache requer duas operações [`SSTORE`](https://www.evm.codes/#55) nos slots de armazenamento previamente não utilizados, ao custo de 22.100 gás cada. Portanto, deixamos isso opcional. + +```solidity + + mapping(uint => uint) public val2key; +``` + +Um [mapeamento](https://www.geeksforgeeks.org/solidity-mappings/) entre os valores e suas chaves. Esta informação é necessária para codificar valores antes de você enviar a transação. + +```solidity + // Location n has the value for key n+1, because we need to preserve + // zero as "not in the cache". + uint[] public key2val; +``` + +Podemos usar uma matriz para mapear das chaves aos valores, pois atribuímos as chaves e, para simplificar, fazemos isso de modo sequencial. + +```solidity + function cacheRead(uint _key) public view returns (uint) { + require(_key <= key2val.length, "Reading uninitialize cache entry"); + return key2val[_key-1]; + } // cacheRead +``` + +Ler um valor da cache. + +```solidity + // Write a value to the cache if it's not there already + // Only public to enable the test to work + function cacheWrite(uint _value) public returns (uint) { + // If the value is already in the cache, return the current key + if (val2key[_value] != 0) { + return val2key[_value]; + } +``` + +Não faz sentido colocar o mesmo valor no cache mais de uma vez. Se o valor já está lá, apenas retorne a chave existente. + +```solidity + // Since 0xFE is a special case, the largest key the cache can + // hold is 0x0D followed by 15 0xFF's. If the cache length is already that + // large, fail. + // 1 2 3 4 5 6 7 8 9 A B C D E F + require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + "cache overflow"); +``` + +Não acho que iremos algum dia ter um cache tão grande (cerca de 1,8\*1037 entradas, o que exigiria cerca de 1027 TB de armazenamento). No entanto, eu sou velho o suficiente para lembrar que ["640kB sempre será o suficiente"](https://quoteinvestigator.com/2011/09/08/640k-enough/). Este teste é muito barato. + +```solidity + // Write the value using the next key + val2key[_value] = key2val.length+1; +``` + +Adicione a busca reversa (do valor para a chave). + +```solidity + key2val.push(_value); +``` + +Adicione a busca para frente (da chave para o valor). Como atribuímos valores de modo sequencial, podemos apenas adicioná-los depois do último valor da matriz. + +```solidity + return key2val.length; + } // cacheWrite +``` + +Retorne o novo tamanho de `key2val`, que é a célula onde o novo valor está armazenado. + +```solidity + function _calldataVal(uint startByte, uint length) + private pure returns (uint) +``` + +Essa função lê um valor de calldata de tamanho arbitrário (até 32 bytes, o tamanho da palavra). + +```solidity + { + uint _retVal; + + require(length < 0x21, + "_calldataVal length limit is 32 bytes"); + require(length + startByte <= msg.data.length, + "_calldataVal trying to read beyond calldatasize"); +``` + +A função é interna, por isso, se o resto do código for escrito corretamente, esses testes não serão obrigatórios. Porém, como eles não custam muito, podemos tê-los de qualquer forma. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Este código está em [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html). Ele lê um valor de 32 bytes do calldata. Isso funciona até mesmo se o calldata parar antes `startByte+32`, pois o espaço não inicializado na EVM é considerado como zero. + +```solidity + _retVal = _retVal >> (256-length*8); +``` + +Não queremos necessariamente um valor de 32 bytes. Isso elimina os bytes em excesso. + +```solidity + return _retVal; + } // _calldataVal + + + // Read a single parameter from the calldata, starting at _fromByte + function _readParam(uint _fromByte) internal + returns (uint _nextByte, uint _parameterValue) + { +``` + +Leia um único parâmetro do calldata. Observe que precisamos retornar não somente o valor que lemos, mas também a localização do próximo byte, pois os parâmetros podem estar na faixa de comprimento de 1 byte a 33 bytes. + +```solidity + // The first byte tells us how to interpret the rest + uint8 _firstByte; + + _firstByte = uint8(_calldataVal(_fromByte, 1)); +``` + +O Solidity tenta reduzir o número de bugs proibindo [conversões de tipo implícitas](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) potencialmente perigosas. Um rebaixamento, por exemplo, de 256 bits para 8 bits, precisa ser explícito. + +```solidity + + // Read the value, but do not write it to the cache + if (_firstByte == uint8(DONT_CACHE)) + return(_fromByte+33, _calldataVal(_fromByte+1, 32)); + + // Read the value, and write it to the cache + if (_firstByte == uint8(INTO_CACHE)) { + uint _param = _calldataVal(_fromByte+1, 32); + cacheWrite(_param); + return(_fromByte+33, _param); + } + + // If we got here it means that we need to read from the cache + + // Number of extra bytes to read + uint8 _extraBytes = _firstByte / 16; +``` + +Pegue o [nibble](https://en.wikipedia.org/wiki/Nibble) inferior e combine-o com os outros bytes para ler o valor do cache. + +```solidity + uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) + + _calldataVal(_fromByte+1, _extraBytes); + + return (_fromByte+_extraBytes+1, cacheRead(_key)); + + } // _readParam + + + // Read n parameters (functions know how many parameters they expect) + function _readParams(uint _paramNum) internal returns (uint[] memory) { +``` + +Poderíamos pegar o número de parâmetros que temos do calldata propriamente dito, mas as funções que nos chamam sabem quantos parâmetros elas esperam. É mais fácil que elas nos contem. + +```solidity + // The parameters we read + uint[] memory params = new uint[](_paramNum); + + // Parameters start at byte 4, before that it's the function signature + uint _atByte = 4; + + for(uint i=0; i<_paramNum; i++) { + (_atByte, params[i]) = _readParam(_atByte); + } +``` + +Leia os parâmetros até que você tenha o número de que precisa. Se ultrapassarmos o fim do calldata, `_readParams` reverterá a chamada. + +```solidity + + return(params); + } // readParams + + // For testing _readParams, test reading four parameters + function fourParam() public + returns (uint256,uint256,uint256,uint256) + { + uint[] memory params; + params = _readParams(4); + return (params[0], params[1], params[2], params[3]); + } // fourParam +``` + +Uma grande vantagem do Foundry é que ele permite que os testes sejam escritos no Solidity ([veja o teste de cache abaixo](#testing-the-cache)). Isto faz testes unitários muito mais fáceis. Essa é uma função que lê quatro parâmetros e retorna-os para que o teste possa verificar que eles estão corretos. + +```solidity + // Get a value, return bytes that will encode it (using the cache if possible) + function encodeVal(uint _val) public view returns(bytes memory) { +``` + +`encodeVal` é uma função que o código off-chain chama para ajudar a criar o calldata que usa o cache. Ela recebe um único valor e retorna os bytes que o codificam. Essa função é uma `view`, portanto, ela não requer uma transação e, quando chamada externamente, não custa nenhum gás. + +```solidity + uint _key = val2key[_val]; + + // The value isn't in the cache yet, add it + if (_key == 0) + return bytes.concat(INTO_CACHE, bytes32(_val)); +``` + +Na [EVM](/developers/docs/evm/) todo o armazenamento não inicializado é considerado como zero. Então, se buscarmos a chave de um valor que não está lá, obteremos zero. Nesse caso, os bytes que o codificaram são `INTO_CACHE` (portanto, ele será armazenado em cache da próxima vez), seguido do valor real. + +```solidity + // If the key is <0x10, return it as a single byte + if (_key < 0x10) + return bytes.concat(bytes1(uint8(_key))); +``` + +Bytes únicos são os mais fáceis. Somente usamos [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat) para transformar um tipo de `bytes` em uma matriz de bytes que pode ser de qualquer tamanho. Apesar do nome, isso funciona bem quando fornecemos somente um argumento. + +```solidity + // Two byte value, encoded as 0x1vvv + if (_key < 0x1000) + return bytes.concat(bytes2(uint16(_key) | 0x1000)); +``` + +Quando temos uma chave que é inferior a 163, podemos expressá-la em dois bytes. Primeiro, convertemos `_key`, que é um valor de 256 bits, para um valor de 16 bits e usamos um cálculo lógico para adicionar o número de bytes extras ao primeiro byte. Então, convertemos o byte em um valor `bytes2`, que pode ser convertido para `bytes`. + +```solidity + // There is probably a clever way to do the following lines as a loop, + // but it's a view function so I'm optimizing for programmer time and + // simplicity. + + 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))); +``` + +Os outros valores (3 bytes, 4 bytes, etc.) são manipulados da mesma maneira, apenas com diferentes tamanhos de campo. + +```solidity + // If we get here, something is wrong. + revert("Error in encodeVal, should not happen"); +``` + +Se chegarmos até aí, significa que temos a chave que não é inferior a 16\*25615. Porém, `cacheWrite` limita as chaves, portanto, não conseguimos nem mesmo chegar a 14\*25616 (o que teria o primeiro byte de 0xFE, que se pareceria com `DONT_CACHE`). Mas ele não nos custa tanto para adicionar um teste caso um futuro programador introduza um bug. + +```solidity + } // encodeVal + +} // Cache +``` + +### Testando o cache {#testing-the-cache} + +Uma das vantagens do Foundry é que [ele deixa você escrever testes em Solidity](https://book.getfoundry.sh/forge/tests), o que facilita escrever testes de unidade. Os testes para a classe `Cache` estão [aqui](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Como o código de teste pode ser repetitivo, assim como os testes tendem a ser, este artigo explica apenas as partes interessantes. + +```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"; +``` + +Isso é apenas um modelo necessário para usar o pacote de teste e `console.log`. + +```solidity +import "src/Cache.sol"; +``` + +Precisamos conhecer o contrato que estamos testando. + +```solidity +contract CacheTest is Test { + Cache cache; + + function setUp() public { + cache = new Cache(); + } +``` + +A função `setUp` é chamada antes de cada teste. Nesse caso, acabamos de criar um novo cache, de modo que nossos testes não sejam afetados um pelo outro. + +```solidity + function testCaching() public { +``` + +Testes são funções cujos nomes começam com `test`. Essa função verifica a funcionalidade básica do cache, escrevendo valores e lendo-os novamente. + +```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); +``` + +Isto é como você faz teste realmente, usando as funções [`assert...`](https://book.getfoundry.sh/reference/forge-std/std-assertions). Nesse caso, nós verificamos que o valor que escrevemos é o mesmo que lemos. Podemos descartar o resultado de `cache.cacheWrite`, pois sabemos que as chaves do cache são atribuídos linearmente. + +```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); + } +``` + +Primeiro, escrevemos cada valor duas vezes para o cache e nos certificamos de que as chaves são as mesmas (ou seja, a segunda escrita não aconteceu realmente). + +```solidity + for(uint i=1; i<100; i+=3) { + uint _key = cache.cacheWrite(i); + assertEq(_key, i); + } + } // testRepeatCaching +``` + +Na teoria poderia haver um bug que não afetasse escritas em cache consecutivas. Então, fazemos aqui algumas escritas que não sejam consecutivas e observamos que os valores ainda não foram reescritos. + +```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) +``` + +Leia uma palavra de 256 bits de um buffer de `bytes memory`. Essa função utilitária nos deixa verificar que recebemos os resultados corretos quando executamos uma chamada de função que usa o cache. + +```solidity + { + require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + uint256 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } +``` + +O Yul não suporta estruturas de dados além de `uint256`, então quando você se refere a uma estrutura de dados mais sofisticada, como um buffer de memória `_bytes`, você obtém o endereço dessa estrutura. O Solidity armazena valores `bytes memory` como uma palavra de 32 bytes que contém o tamanho, seguida dos bytes reais, então, para obter o número de bytes `_start`, precisamos calcular `_bytes+32+_start`. + +```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; +``` + +Algumas constantes de que precisamos para os testes. + +```solidity + function testReadParam() public { +``` + +Chame `fourParams()`, uma função que usa `readParams`, para testar nós podemos ler parâmetros corretamente. + +```solidity + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; +``` + +Não podemos usar o mecanismo de ABI normal para chamar uma função usando o cache, por isso, precisamos usar o mecanismo de baixo nível [`
      .call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses). Esse mecanismo pega um `bytes memory` como entrada e retorna aquele (assim como o valor booleano) como saída. + +```solidity + // First call, the cache is empty + _callInput = bytes.concat( + FOUR_PARAMS, +``` + +É útil para o mesmo contrato suportar ambas funções em cache (para chamadas diretamente de transações) e funções não em cache (para chamadas de outros contratos inteligentes). Para fazer isso nós precisamos continuar a confiar no mecanismo Solidity para chamar a função correta, ao invés de pôr tudo em [uma função `fallback`](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function). Fazer isso torna a componibilidade muito mais fácil. Um único byte seria suficiente para identificar a função na maioria dos casos, por isso, estamos desperdiçando três bytes (16\*3=48 gás). No entanto, no momento em que escrevo este artigo, 48 gás custam 0,07 centavos de dólar, o que é um custo razoável para um código mais simples e menos sujeito a bugs. + +```solidity + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), +``` + +O primeiro valor: Um sinalizador dizendo que é um valor que precisa ser escrito na cache, seguido pelos 32 bytes do valor. Os outros três valores são similares, exceto que `VAL_B` não é escrito no cache e `VAL_C` é ambos o terceiro e quarto parâmetros. + +```solidity + . + . + . + ); + (_success, _callOutput) = _cacheAddr.call(_callInput); +``` + +É aqui que realmente chamamos o contrato `Cache`. + +```solidity + assertEq(_success, true); +``` + +Nós esperamos que a chamada tenha sucesso. + +```solidity + assertEq(cache.cacheRead(1), VAL_A); + assertEq(cache.cacheRead(2), VAL_C); +``` + +Nós começamos com uma cache vazia e então adicionamos `VAL_A` seguida de `VAL_C`. Nós esperaríamos a primeira ter a chave 1, e a segunda ter a 2. + +``` + assertEq(toUint256(_callOutput,0), VAL_A); + assertEq(toUint256(_callOutput,32), VAL_B); + assertEq(toUint256(_callOutput,64), VAL_C); + assertEq(toUint256(_callOutput,96), VAL_C); +``` + +A saída é composta pelos quatro parâmetros. Aqui, verificamos que está correto. + +```solidity + // Second call, we can use the cache + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value in the Cache + bytes1(0x01), +``` + +As chaves de cache abaixo de 16 correspondem a apenas um byte. + +```solidity + // Second value, don't add it to the cache + cache.DONT_CACHE(), + bytes32(VAL_B), + + // Third and fourth values, same value + bytes1(0x02), + bytes1(0x02) + ); + . + . + . + } // testReadParam +``` + +Os testes depois da chamada são idênticos a aqueles depois da primeira chamada. + +```solidity + function testEncodeVal() public { +``` + +Esta função é similar a `testReadParam`, exceto que ao invés de escrever os parâmetros explicitamente, nós usamos `encodeVal()`. + +```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 +``` + +O único teste adicional em `testEncodeVal()` é verificar que o comprimento de `_callInput` está correto. Para a primeira chamada, ele é 4+33\*4. Para a segunda, na qual cada valor já está no cache, ele é 4+1\*4. + +```solidity + // Test encodeVal when the key is more than a single byte + // Maximum three bytes because filling the cache to four bytes takes + // too long. + function testEncodeValBig() public { + // Put a number of values in the cache. + // To keep things simple, use key n for value n. + for(uint i=1; i<0x1FFF; i++) { + cache.cacheWrite(i); + } +``` + +A função `testEncodeVal` acima somente escreve quatro valores na cache, então [a parte da função que lida com valores multi-byte](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) não é checada. Porém, esse código é complicado e sujeito a erros. + +A primeira parte dessa função é um loop que escreve todos os valores de 1 até 0x1FFF para o cache em ordem, a fim de podermos codificar esses valores e saber para onde eles estão indo. + +```solidity + . + . + . + + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(0x000F), // One byte 0x0F + cache.encodeVal(0x0010), // Two bytes 0x1010 + cache.encodeVal(0x0100), // Two bytes 0x1100 + cache.encodeVal(0x1000) // Three bytes 0x201000 + ); +``` + +Teste valores de um byte, dois bytes e três bytes. Não testamos além disso, pois levaria tempo demais para escrever entradas de pilha suficientes (pelo menos 0x10000000, cerca de um quarto de bilhão). + +```solidity + . + . + . + . + } // testEncodeValBig + + + // Test what with an excessively small buffer we get a revert + function testShortCalldata() public { +``` + +Teste o que acontece no caso anormal em que não há parâmetros suficientes. + +```solidity + . + . + . + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, false); + } // testShortCalldata +``` + +Como ele é revertido, o resultado deve ser `false`. + +``` + // Call with cache keys that aren't there + function testNoCacheKey() public { + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), + + // Second value + bytes1(0x0F), + bytes2(0x1234), + bytes11(0xA10102030405060708090A) + ); +``` + +Esta função pega quatro parâmetros perfeitamente legítimos, exceto que a cache está vazia, então não há valores lá para ler. + +```solidity + . + . + . + // Test what with an excessively long buffer everything works file + function testLongCalldata() public { + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; + + // First call, the cache is empty + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_A), + + // Second value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_B), + + // Third value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_C), + + // Fourth value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_D), + + // And another value for "good luck" + bytes4(0x31112233) + ); +``` + +Esta função envia cinco valores. Sabemos que o quinto valor é ignorado porque não é uma entrada de cache válida, o que causaria uma reversão se não tivesse sido incluída. + +```solidity + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, true); + . + . + . + } // testLongCalldata + +} // CacheTest + +``` + +## Uma amostra do aplicativo {#a-sample-app} + +Escrever testes em Solidity é tudo muito bem, mas no final do dia, um dapp precisa ser capaz de processar requisições de fora da cadeia para ser útil. Este artigo demonstra como usar o cache em um dapp com `WORM`, que significa “escrever uma vez, ler várias” (em inglês, "Write Once, Read Many"). Se uma chave ainda não estiver escrita, você pode escrever um valor para ela. Se a chave já estiver escrita, você terá uma reversão. + +### O contrato {#the-contract} + +[Este é o contrato](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). Ele repete, em grande parte, o que já fizemos com `Cache` e `CacheTest`, então abrangeremos somente as partes que são interessantes. + +```solidity +import "./Cache.sol"; + +contract WORM is Cache { +``` + +A maneira mais fácil de usar `Cache` é herdá-lo no seu próprio contrato. + +```solidity + function writeEntryCached() external { + uint[] memory params = _readParams(2); + writeEntry(params[0], params[1]); + } // writeEntryCached +``` + +Essa função é similar a `fourParam` no `CacheTest` acima. Como nós não seguimos as especificações da ABI, é melhor não declarar nenhum parâmetro dentro da função. + +```solidity + // Make it easier to call us + // Function signature for writeEntryCached(), courtesy of + // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3 + bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3; +``` + +O código externo que chama `writeEntryCached` precisará construir manualmente o calldata, ao invés de usar `worm.writeEntryCached`, porque nós não seguimos as especificações da ABI. Tendo o valor desta constante só facilita escrevê-la. + +Observe que, apesar de definirmos `WRITE_ENTRY_CACHED` como uma variável de estado, para lê-la externamente é necessário usar a função getter, `worm.WRITE_ENTRY_CACHED()`. + +```solidity + function readEntry(uint key) public view + returns (uint _value, address _writtenBy, uint _writtenAtBlock) +``` + +A função de leitura é uma `view`, então ela não requer uma transação e não custa gas. Como resultado, não há benefício de usar cache para o parâmetro. Com funções view é melhor usar o mecanismo padrão, que é mais simples. + +### O código de teste {#the-testing-code} + +[Este é o código de teste para o contrato](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Novamente, vamos ver somente o que é interessante. + +```solidity + function testWReadWrite() public { + worm.writeEntry(0xDEAD, 0x60A7); + + vm.expectRevert(bytes("entry already written")); + worm.writeEntry(0xDEAD, 0xBEEF); +``` + +[Este (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) é como especificamos em um teste Foundry que a próxima chamada deve falhar, assim como a razão dessa falha. Isto se aplica quando nós usamos a sintaxe `.()` ao invés de construir o calldata e chamar o contrato usando interface de baixo nível (`.call()`, etc.). + +```solidity + function testReadWriteCached() public { + uint cacheGoat = worm.cacheWrite(0x60A7); +``` + +Aqui nós usamos o fato de `cacheWrite` retornar a chave da cache. Isto não é algo que nós esperaríamos usar em produção, porque `cacheWrite` altera o estado, e por isso pode ser chamado apenas durante a transação. Transações não têm valores de retorno. Se elas têm resultados, esses resultados devem ser supostamente emitidos como eventos. Assim, o valor de retorno de `cacheWrite` é somente acessível do código on-chain, e o código on-chain não precisa armazenar parâmetros em cache. + +```solidity + (_success,) = address(worm).call(_callInput); +``` + +É assim que contamos ao Solidity que, enquanto `.call()` tem dois valores de retorno, só nos importamos com o primeiro. + +```solidity + (_success,) = address(worm).call(_callInput); + assertEq(_success, false); +``` + +Como usamos a função de baixo nível `
      .call()`, não podemos usar `vm.expectRevert()` e temos de olhar para o valor de êxito booleano que obtivemos da chamada. + +```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); +``` + +Essa é a maneira que verificamos que o código [emite um evento corretamente](https://book.getfoundry.sh/cheatcodes/expect-emit) no Foundry. + +### O cliente {#the-client} + +Uma coisa que você não obtém com testes no Solidity é código JavaScript, que você pode cortar e colar no seu próprio aplicativo. Para escrever este código, implantei WORM na [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), a nova rede de teste da [Optimism](https://www.optimism.io/). Ela está no endereço [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a). + +[Você pode ver o código JavaScript para o cliente aqui](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). Para usá-lo: + +1. Clone o repositório git: + + ```sh + git clone https://github.com/qbzzt/20220915-all-you-can-cache.git + ``` + +2. Instale os pacotes necessários: + + ```sh + cd javascript + yarn + ``` + +3. Copie o arquivo de configuração: + + ```sh + cp .env.example .env + ``` + +4. Edite `.env` para a sua configuração: + + | Parâmetro | Valor | + | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | MNEMÔNICO | O mnemônico para uma conta que tem ETH suficiente para pagar por uma transação. [Você consegue ETH grátis para a rede Optimism Goerli aqui](https://optimismfaucet.xyz/). | + | OPTIMISM_GOERLI_URL | URL da Optimism Goerli. O endpoint público, `https://goerli.optimism.io`, tem taxa limitada mas suficiente para o que precisamos aqui | + +5. Rode `index.js`. + + ```sh + node index.js + ``` + + Primeiro, esse exemplo de aplicativo escreve uma entrada para WORM, exibindo o calldata e um link para a transação no Etherscan. Em seguida, ele lê novamente essa entrada e exibe a chave que usou e os valores na entrada (valor, bloco, número e autor). + +A maioria dos clientes é Javascript Dapp normal. Então, novamente, passaremos apenas pelas partes interessantes. + +```javascript +. +. +. +const main = async () => { + const func = await worm.WRITE_ENTRY_CACHED() + + // Need a new key every time + const key = await worm.encodeVal(Number(new Date())) +``` + +Um dado slot pode ser apenas escrito uma vez, então usamos o carimbo de data/hora para ter certeza de que não vamos reutilizar esses slots. + +```javascript +const val = await worm.encodeVal("0x600D") + +// Write an entry +const calldata = func + key.slice(2) + val.slice(2) +``` + +Ethers espera que o dado da chamada seja uma cadeia de caracteres hexadecimal, `0x` seguida de um número par de dígitos hexadecimais. Como `key` e `val` começam com `0x`, precisamos remover esses cabeçalhos. + +```javascript +const tx = await worm.populateTransaction.writeEntryCached() +tx.data = calldata + +sentTx = await wallet.sendTransaction(tx) +``` + +Como no código de teste Solidity, não podemos chamar uma função em cache normalmente. Ao invés disso, nós precisamos usar um mecanismo de nível mais baixo. + +```javascript + . + . + . + // Read the entry just written + const realKey = '0x' + key.slice(4) // remove the FF flag + const entryRead = await worm.readEntry(realKey) + . + . + . +``` + +Para ler entradas, podemos usar o mecanismo normal. Não há necessidade de armazenar em cache parâmetros com funções `view`. + +## Conclusão {#conclusion} + +O código neste artigo é uma prova de conceito, a finalidade é tornar a ideia fácil de entender. Para um sistema pronto para produção, recomenda-se implementar funcionalidades adicionais: + +- Manipular valores que não são `uint256`. Por exemplo, cadeias de caracteres. +- Em vez de um cache global, talvez ter um mapeamento entre usuários e caches. Usuários diferentes usam valores diferentes. +- Valores usados para endereços são distintos daqueles usados para outras finalidades. Pode fazer sentido ter um cache separado só para endereços. +- Atualmente, as chaves de cache estão em um algoritmo do tipo “o primeiro que chega tem a chave menor”. Os primeiros dezesseis valores podem ser enviados como um único byte. Os próximos 4.080 valores podem ser enviados como dois bytes. Os próximos milhões de valores são três bytes, etc. Um sistema de produção deveria manter contadores de uso nas entradas de cache e reorganizá-las para que os dezesseis _mais comuns_ valores sejam um byte, os próximos 4080 valores mais comuns sejam dois bytes, etc. + + No entanto, essa é uma operação potencialmente perigosa. Imagine a seguinte sequência de eventos: + + 1. Noam Naive chama `encodeVal` para codificar o endereço para o qual ele quer enviar tokens. Este endereço é um dos primeiros usados na aplicação, então o valor codificado é 0x06. Trata-se de uma função `view`, e não uma transação, então ela diz respeito unicamente a Noam e ao nó que ele usa, e ninguém mais sabe disso + + 2. Owen Owner executa a operação de reordenação de cache. Muito poucas pessoas realmente usam esse endereço, por isso, ele é agora codificado como 0x201122. Para um valor diferente, 1018, é atribuído 0x06. + + 3. Noam Naive envia seus tokens para 0x06. Eles vão para o endereço `0x0000000000000000000000000de0b6b3a7640000`, e já que ninguém sabe a chave privada para esse endereço, eles ficam presos lá. Noam _não está contente_. + + Existem maneiras de resolver esse problema, e o problema relacionado às transações que estão na mempool durante a reordenação do cache, mas você deve estar atento a isso. + +Demonstrei o processo de armazenamento em cache aqui com o Optimism, porque sou funcionário da Optimism e esse é o roll-up que conheço melhor. Mas deve funcionar com qualquer rollup que cobre um mínimo custo por processamento interno, de modo que em comparação com escrever os dados da transação na L1 é a maior despesa. diff --git a/public/content/translations/pt-br/developers/tutorials/create-and-deploy-a-defi-app/index.md b/public/content/translations/pt-br/developers/tutorials/create-and-deploy-a-defi-app/index.md new file mode 100644 index 00000000000..5b726fa0266 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/create-and-deploy-a-defi-app/index.md @@ -0,0 +1,481 @@ +--- +title: Criar e promover um Aplicativo DeFi +description: Deposite tokens ERC20 para o contrato inteligente e crie fazenda de tokens +author: "strykerin" +tags: + - "solidity" + - "defi" + - "web3" + - "truffle" + - "ganache" + - "Contratos Inteligentes" +skill: intermediate +lang: pt-br +published: 2020-12-31 +source: github.com +sourceUrl: https://github.com/strykerin/DeFi-Token-Farm +--- + +Neste tutorial, construiremos um aplicativo DeFi com Solidity onde os usuários podem depositar um token ERC20 no contrato inteligente e ele cunhará e transferirá os Tokens Farm para eles. Os usuários podem posteriormente retirar seus tokens ERC20 queimando seu Farm Token em contrato inteligente e os tokens ERC20 serão transferidos de volta para eles. + +## Instale o Truffle e o Ganache {#install-truffle-and-ganache} + +Se esta for a primeira vez que você está escrevendo um contrato inteligente, você precisará configurar seu ambiente primeiro. Vamos usar duas ferramentas:[Truffle](https://www.trufflesuite.com/) and [Ganache](https://www.trufflesuite.com/ganache). + +O Truffle é um ambiente de desenvolvimento e estrutura de teste para o desenvolvimento de contratos inteligentes para o Ethereum. Com o Truffle, é fácil construir e implantar contratos inteligentes na blockchain. O Ganache nos permite criar uma blockchain Ethereum local para testar contratos inteligentes. Ele simula os recursos da rede real e as primeiras 10 contas são financiadas com 100 ether de teste, tornando a implantação e o teste do contrato inteligente gratuitos e fáceis. O Ganache está disponível como um aplicativo de desktop e uma ferramenta de linha de comandos. Para este artigo, usaremos o aplicativo de desktop de interface do usuário. + +![Aplicativo de área de trabalho Ganache UI](https://cdn-images-1.medium.com/max/2360/1*V1iQ5onbLbT5Ib2QaiOSyg.png)_Aplicativo de desktop Ganache UI_ + +Para criar o projeto, execute os seguintes passos + +```bash +mkdir your-project-name +cd your-project-name +truffle init +``` + +Isso criará um projeto em branco para o desenvolvimento e implantação de nossos contratos inteligentes. A estrutura do projeto criada é a seguinte: + +- A Pasta para os contratos inteligentes de solidez: `contracts` + +- `migrações`: Pasta para os scripts de implantação + +- `test`: Pasta para testar nossos contratos inteligentes + +- `truffle-config.js`: Arquivo de configuração do Truffle + +## Criar o token ERC20 {#create-the-erc20-token} + +Primeiro, precisamos criar seu token ERC20 que usaremos para apostar no contrato inteligente. Para criar nosso token fungível, primeiro precisamos instalar a biblioteca OpenZeppelin. Esta biblioteca contém as implementações de padrões como o ERC20 e o ERC721. Para instalá-lo, execute os passos: + +```bash +npm install @openzeppelin/contracts +``` + +Usando a biblioteca OpenZeppelin, podemos criar nosso token ERC20 gravando em `contracts/MyToken.sol` com o seguinte código solidity: + +```solidity +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MyToken is ERC20 { + constructor() public ERC20("MyToken", "MTKN"){ + _mint(msg.sender, 1000000000000000000000000); + } +} +``` + +No código acima em: + +- Linha 3: Importamos o contrato ERC20.sol do openzeppelin que contém a implementação para este padrão de token. + +- Linha 5: Herdamos do contrato ERC20.sol. + +- Linha 6: Estamos chamando o construtor ERC20.sol e passando os parâmetros name e symbol como `"MyToken"` e `"MTKN"` respectivamente. + +- Linha 7: Estamos cunhando e transferindo 1 milhão de tokens para a conta que está implantando o contrato inteligente (estamos usando os 18 decimais padrão para o token ERC20, o que significa que, se quisermos cunhar 1 token, você o representará como 1000000000000000000, 1 com 18 zeros). + +Podemos ver abaixo a implementação do construtor ERC20.sol onde o campo `_decimals` está definido como 18: + +```solidity +string private _name; +string private _symbol; +uint8 private _decimals; + +constructor (string memory name_, string memory symbol_) public { + _name = name_; + _symbol = symbol_; + _decimals = 18; +} +``` + +## Compilar o token ERC20 {#compile-the-erc20-token} + +Para compilar nosso contrato inteligente, devemos primeiro verificar nossa versão do compilador de solidez. Você pode verificar isso executando o comando: + +```bash +truffle version +``` + +A versão padrão é a `Solidity v0.5.16`. Como nosso token é escrito usando a versão solidity `0.6.2`, se executarmos o comando para compilar nossos contratos, obteremos um erro do compilador. Para especificar qual versão do compilador de solidez será usada, acesse o arquivo `truffle-config. s` e são definidos para a versão desejada do compilador como vistos abaixo: + +```javascript +// Configure your compilers +compilers: { + solc: { + version: "^0.8.0", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } +} +``` + +Agora podemos compilar nosso contrato inteligente executando o seguinte comando: + +```bash +truffle compile +``` + +## Instalar Token ERC20 {#deploy-erc20-token} + +Depois de compilado, podemos publicar nosso token. + +Na pasta de `migrations`, crie um arquivo chamado `2_deploy_Tokens.js`. Este arquivo é onde implantaremos nosso token ERC20 e nosso contrato inteligente FarmToken. O código abaixo é usado para publicar nosso contrato MyToken.sol: + +```javascript +const MyToken = artifacts.require("MyToken") + +module.exports = async function (deployer, network, accounts) { + // Deploy MyToken + await deployer.deploy(MyToken) + const myToken = await MyToken.deployed() +} +``` + +Abra o Ganache e selecione a opção "Quickstart" para iniciar uma blockchain local de Ethereum. Para publicar nosso contrato, execute: + +```bash +truffle migrate +``` + +O endereço usado para implantar nossos contratos é o primeiro da lista de endereços que o Ganache nos mostra. Para verificar isso, podemos abrir o aplicativo de trabalho Ganache e podemos verificar se o saldo de ether para a primeira conta foi reduzido devido ao custo de ether para a implantação dos nossos contratos inteligentes: + +![Aplicativo de desktop Ganache Ui](https://cdn-images-1.medium.com/max/2346/1*1iJ9VRlyLuza58HL3DLfpg.png)_Aplicativo de desktop Ganache Ui_ + +Para verificar que 1 milhão de tokens MyToken foram enviados para o endereço de deploy, podemos utilizar o Truffle Console para interagir com o nosso contrato inteligente que foi publicado. + +> [Truffle Console é um console básico interativo conectando-se a qualquer cliente Ethereum.](https://www.trufflesuite.com/docs/truffle/getting-started/using-truffle-develop-and-the-console) + +Para interagir com nosso contrato inteligente, execute o seguinte comando: + +```bash +truffle console +``` + +Agora podemos escrever os seguintes comandos no terminal: + +- Obter o contrato inteligente: `meuToken = await MyToken.deployed()` + +- Obter o array de contas de Ganache: `contas = aguardar web3.eth.getAccounts()` + +- Obter o saldo para a primeira conta: `balance = await myToken.balanceOf(contas[0])` + +- Formate o saldo de 18 decimals: `web3.utils.fromWei(balance.toString())` + +Executando os comandos acima, vamos ver que o primeiro endereço tem na verdade 1 milhão de MyTokens: + +![Primeiro endereço tem 1000000 MyTokens](https://cdn-images-1.medium.com/max/2000/1*AQlj9A7dw-qtY4QAD3Bpxw.png) + +_Primeiro endereço tem 1000000 MyTokens_ + +## Criando FarmToken Smart Contract {#create-farmtoken-smart-contract} + +O contrato inteligente FarmToken terá 3 funções: + +- `balance()`: Obter o balanço do MyToken no contrato inteligente FarmToken. + +- `deposit(uint256 _amount)`: Transfira MyToken em nome do usuário para o contrato inteligente FarmToken e então importe FarmToken para o usuário. + +- `withdraw(uint256 _amount)`: Queimar FarmTokens do usuário e transferir MyTokens para o endereço do usuário. + +Vamos dar uma olhada no construtor do FarmToken: + +```solidity +pragma solidity ^0.6.2; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract FarmToken is ERC20 { + using Address for address; + using SafeMath for uint256; // As of Solidity v0.8.0, mathematical operations can be done safely without the need for SafeMath + using SafeERC20 for IERC20; + + IERC20 public token; + + constructor(address _token) + public + ERC20("FarmToken", "FRM") + { + token = IERC20(_token); + } +``` + +- Linhas 3-6: Estamos importando os seguintes contratos do openzeppelin: IERC20.sol, Address.sol, SafeERC20.sol e ERC20.sol. + +- Linha 8: O FarmToken vai herdar do contrato ERC20. + +- Linhas 14-19: O construtor FarmToken receberá como parâmetro o endereço do contrato MyToken e atribuiremos seu contrato à nossa variável pública chamada `token`. + +Vamos implementar a função `balance()`. Ele não receberá parâmetros e retornará o saldo do MyToken neste contrato inteligente. Ela está implementada como mostrado abaixo: + +```solidity +function balance() public view returns (uint256) { + return token.balanceOf(address(this)); +} +``` + +Para a função `deposit(uint256 _amount)`, ele receberá como parâmetro a quantia que o usuário deseja depositar e irá fazer a cunhagem e transferir FarmTokens para o usuário: + +```solidity +function deposit(uint256 _amount) public { + // Amount must be greater than zero + require(_amount > 0, "amount cannot be 0"); + + // Transfer MyToken to smart contract + token.safeTransferFrom(msg.sender, address(this), _amount); + + // Mint FarmToken to msg sender + _mint(msg.sender, _amount); +} +``` + +Para a função `withdraw(uint256 _amount)`, nós vamos receber como parâmetro a quantidade de FarmTokens que o usuário deseja queimar e então vamos transferir a mesma quantidade de MyTokens de volta para o usuário: + +```solidity +function withdraw(uint256 _amount) public { + // Burn FarmTokens from msg sender + _burn(msg.sender, _amount); + + // Transfer MyTokens from this smart contract to msg sender + token.safeTransfer(msg.sender, _amount); +} +``` + +Como implantar um contrato inteligente. Para fazer isso, vamos voltar para o arquivo `2_deploy_Tokens.js` e adicionar o novo contrato a ser implantado: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (deployer, network, accounts) { + // Deploy MyToken + await deployer.deploy(MyToken) + const myToken = await MyToken.deployed() + + // Deploy Farm Token + await deployer.deploy(FarmToken, myToken.address) + const farmToken = await FarmToken.deployed() +} +``` + +Note que ao implantar o FarmToken, passamos como parâmetro o endereço do contrato MyToken implantado. + +Agora, rode `truffle compilar` e `truffle migrar` para implantar nossos contratos. + +Vamos testar o nosso contrato inteligente. Em vez de usar o `truffle console` para interagir com o nosso contrato inteligente, criaremos um script para automatizar esse processo. Crie uma pasta chamada `scripts` e adicione o seguinte arquivo `getMyTokenBalance.js`. Ele irá verificar o saldo dos MyTokens no contrato inteligente do Farmtoken: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (callback) { + myToken = await MyToken.deployed() + farmToken = await FarmToken.deployed() + balance = await myToken.balanceOf(farmToken.address) + console.log(web3.utils.fromWei(balance.toString())) + callback() +} +``` + +Para executar esse script, execute o seguinte comando na linha de comando: + +```bash +truffle exec .\scripts\getMyTokenBalance.js +``` + +Vamos obter o resultado esperado que é 0. Se você receber um erro sobre o FarmToken ainda não foi implantado, a rede truffle não recebeu a versão mais recente do seu código de contratos. Apenas feche o ganache, reinicie o programa rapidamente e certifique-se de executar `a migração de um truffle`. + +Agora, vamos fazer o staking do MyToken para o contrato inteligente. Desde a função `deposit(uint256 _amount)` chama a função `safeTransferFrom` do ERC20, primeiro o usuário deve aprovar o contrato inteligente para transferir MyToken em nome do usuário. Então, no script abaixo, primeiro aprovaremos esta etapa e então chamaremos a função: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (callback) { + const accounts = await new web3.eth.getAccounts() + const myToken = await MyToken.deployed() + const farmToken = await FarmToken.deployed() + + // Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner through transferFrom. + // This is zero by default. + const allowanceBefore = await myToken.allowance( + accounts[0], + farmToken.address + ) + console.log( + "Amount of MyToken FarmToken is allowed to transfer on our behalf Before: " + + allowanceBefore.toString() + ) + + // In order to allow the Smart Contract to transfer to MyToken (ERC-20) on the accounts[0] behalf, + // we must explicitly allow it. + // We allow farmToken to transfer x amount of MyToken on our behalf + await myToken.approve(farmToken.address, web3.utils.toWei("100", "ether")) + + // Validate that the farmToken can now move x amount of MyToken on our behalf + const allowanceAfter = await myToken.allowance(accounts[0], farmToken.address) + console.log( + "Amount of MyToken FarmToken is allowed to transfer on our behalf After: " + + allowanceAfter.toString() + ) + + // Verify accounts[0] and farmToken balance of MyToken before and after the transfer + balanceMyTokenBeforeAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenBeforeFarmToken = await myToken.balanceOf(farmToken.address) + console.log("*** My Token ***") + console.log( + "Balance MyToken Before accounts[0] " + + web3.utils.fromWei(balanceMyTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance MyToken Before TokenFarm " + + web3.utils.fromWei(balanceMyTokenBeforeFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenBeforeAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenBeforeFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken Before accounts[0] " + + web3.utils.fromWei(balanceFarmTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance FarmToken Before TokenFarm " + + web3.utils.fromWei(balanceFarmTokenBeforeFarmToken.toString()) + ) + // Call Deposit function from FarmToken + console.log("Call Deposit Function") + await farmToken.deposit(web3.utils.toWei("100", "ether")) + console.log("*** My Token ***") + balanceMyTokenAfterAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenAfterFarmToken = await myToken.balanceOf(farmToken.address) + console.log( + "Balance MyToken After accounts[0] " + + web3.utils.fromWei(balanceMyTokenAfterAccounts0.toString()) + ) + console.log( + "Balance MyToken After TokenFarm " + + web3.utils.fromWei(balanceMyTokenAfterFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenAfterAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenAfterFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken After accounts[0] " + + web3.utils.fromWei(balanceFarmTokenAfterAccounts0.toString()) + ) + console.log( + "Balance FarmToken After TokenFarm " + + web3.utils.fromWei(balanceFarmTokenAfterFarmToken.toString()) + ) + + // End function + callback() +} +``` + +Para rodar esse script: `truffle exec .\scripts\transferMyTokenToFarmToken.js`. Você deve ver no seu console: + +![output do transferMyTokenToFarmToken.js](https://cdn-images-1.medium.com/max/2000/1*MoekE2QCw7vB98u5dl7ang.png) + +_output do transferMyTokenToFarmToken.js_ + +Como podemos ver, depositamos MyTokens com sucesso no contrato inteligente já que a primeira conta agora tem FarmTokens. + +Para retirar: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (callback) { + const accounts = await new web3.eth.getAccounts() + const myToken = await MyToken.deployed() + const farmToken = await FarmToken.deployed() + + // Verify accounts[0] and farmToken balance of MyToken before and after the transfer + balanceMyTokenBeforeAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenBeforeFarmToken = await myToken.balanceOf(farmToken.address) + console.log("*** My Token ***") + console.log( + "Balance MyToken Before accounts[0] " + + web3.utils.fromWei(balanceMyTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance MyToken Before TokenFarm " + + web3.utils.fromWei(balanceMyTokenBeforeFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenBeforeAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenBeforeFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken Before accounts[0] " + + web3.utils.fromWei(balanceFarmTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance FarmToken Before TokenFarm " + + web3.utils.fromWei(balanceFarmTokenBeforeFarmToken.toString()) + ) + + // Call Deposit function from FarmToken + console.log("Call Withdraw Function") + await farmToken.withdraw(web3.utils.toWei("100", "ether")) + + console.log("*** My Token ***") + balanceMyTokenAfterAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenAfterFarmToken = await myToken.balanceOf(farmToken.address) + console.log( + "Balance MyToken After accounts[0] " + + web3.utils.fromWei(balanceMyTokenAfterAccounts0.toString()) + ) + console.log( + "Balance MyToken After TokenFarm " + + web3.utils.fromWei(balanceMyTokenAfterFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenAfterAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenAfterFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken After accounts[0] " + + web3.utils.fromWei(balanceFarmTokenAfterAccounts0.toString()) + ) + console.log( + "Balance FarmToken After TokenFarm " + + web3.utils.fromWei(balanceFarmTokenAfterFarmToken.toString()) + ) + + // End function + callback() +} +``` + +Para rodar esse script: `truffle exec .\scripts\transferMyTokenToFarmToken.js`. Como podemos ver no output abaixo, nós conseguimos de volta os MyTokens com sucesso e acabamos com os FarmTokens: + +![output do withdrawMyTokenFromTokenFarm.js](https://cdn-images-1.medium.com/max/2000/1*jHYlTFg0NgGbhASpsRvc0w.png) + +_output do withdrawMyTokenFromTokenFarm.js_ + +## Referências {#references} + +[Contratos - OpenZeppelin Docs](https://docs.openzeppelin.com/contracts/3.x/) + +[Ferramentas Suplentes para Contratos Inteligentes Common Suite](https://www.trufflesuite.com/) + +[Ganache | Truffle Suite](https://www.trufflesuite.com/ganache) + +[O que é DeFi? Um guia para iniciantes (atualizado em 2021) (99bitcoins.com)](https://99bitcoins.com/what-is-defi/) + +[DeFi - A classificação da finança descentraliza no DeFi Llama](https://defillama.com/) diff --git a/public/content/translations/pt-br/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/deploying-your-first-smart-contract/index.md new file mode 100644 index 00000000000..4d78c0a3e2e --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -0,0 +1,99 @@ +--- +title: Implementando seu primeiro contrato inteligente +description: Uma introdução à implantação do seu primeiro contrato inteligente em uma rede de teste Ethereum +author: "jdourlens" +tags: + - "contratos inteligentes" + - "remix" + - "solidity" + - "implementação" +skill: beginner +lang: pt-br +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Acho que você está tão animado quanto nós para [implantar](/developers/docs/smart-contracts/deploying/) e interagir com o seu primeiro [contrato inteligente](/developers/docs/smart-contracts/) na blockchain Ethereum. + +Não se preocupe, pois como este é o nosso primeiro contrato inteligente, vamos publicá-lo em uma [rede de testes local](/developers/docs/networks/), assim não custa nada para você implementar e brincar com ele o quanto quiser. + +## Escrevendo nosso contrato {#writing-our-contract} + +O primeiro passo é [visitar a Remix](https://remix.ethereum.org/) e criar um novo arquivo. Na parte superior esquerda da interface Remix adicione um novo arquivo e digite o nome do arquivo desejado. + +![Adicionando um novo arquivo na interface Remix](./remix.png) + +No novo arquivo, vamos colar o seguinte código. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.5.17; + +contract Counter { + + // Public variable of type unsigned int to keep the number of counts + uint256 public count = 0; + + // Function that increments our counter + function increment() public { + count += 1; + } + + // Not necessary getter to get the count value + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Se você está acostumado com programação, você pode facilmente adivinhar o que este programa faz. Aqui está uma explicação linha a linha: + +- Linha 4: Definimos um contrato com o nome `Counter`. +- Linha 7: Nosso contrato armazena um inteiro não assinado chamado `count` começando com 0. +- Linha 10: A primeira função vai modificar o estado do contrato e `increment()` nossa variável `count`. +- Linha 15: A segunda função é apenas um getter para ser capaz de ler o valor da variável `count` fora do contrato inteligente. Observe que, como definimos nossa variável `count` como pública, isso não é necessário, mas é mostrado como um exemplo. + +Tudo isso para o nosso primeiro contrato inteligente simples. Como você deve saber, ele se parece com uma classe de linguagens OOP (Object-Oriented Programming, programação orientada a objetos) como Java ou C++. Agora é hora de brincar com o nosso contrato. + +## Implantando nosso contrato {#deploying-our-contract} + +Como escrevemos nosso primeiro contrato inteligente, nós agora faremos deploy para a blockchain para poder brincar com ele. + +[Implantar o contrato inteligente no blockchain](/developers/docs/smart-contracts/deploying/) é, na verdade, apenas enviar uma transação que contém o código do contrato inteligente compilado sem especificar os destinatários. + +Primeiro, vamos [compilar o contrato](/developers/docs/smart-contracts/compiling/) clicando no ícone de compilação no lado esquerdo: + +![O ícone de compilação na barra de ferramentas Remix](./remix-compile-button.png) + +Em seguida, clique no botão de compilação: + +![O botão de compilação no compilador do solidity Remix](./remix-compile.png) + +Você pode escolher selecionar a opção "Compilação automática", para que o contrato sempre seja compilado quando você salvar o conteúdo no editor de texto. + +Em seguida, navegue para a tela de implantação e execução de transações: + +![O ícone de compilação na barra de ferramentas do Remix](./remix-deploy.png) + +Assim que você estiver na tela de transações "deploy and run" verifique se o nome do seu contrato aparece e clique em Deploy. Como você pode ver no topo da página, o ambiente atual é o "Javascript VM", o que significa que iremos implantar e interagir com nosso contrato inteligente em uma blockchain de teste local para podermos testar mais rápido e sem quaisquer custos. + +![O botão de deploy no compilador do solidity Remix](./remix-deploy-button.png) + +Quando você clicar no botão "Deploy", você verá seu contrato aparecer abaixo. Clique na seta à esquerda para expandi-la, para que possamos ver o conteúdo de nosso contrato. Esta é nossa variável `counter`, nossa função `increment()` e a getter `getCounter()`. + +Se você clicar no botão `count` ou `getCount`, ele recuperará o conteúdo da variável `count` do contrato e o exibirá. Como ainda não chamamos a função `increment`, ela deve exibir 0. + +![O botão de função no compilador do solidity Remix](./remix-function-button.png) + +Vamos agora chamar a função `increment` clicando no botão. Você verá logs das transações que são feitas aparecendo no parte inferior da janela. Você verá que os logs são diferentes quando estiver pressionando o botão para recuperar os dados em vez do botão `increment`. Isso porque a leitura de dados na blockchain não necessita de quaisquer transações (escritas) ou taxas. Porque somente modificar o estado do blockchain requer fazer uma transação: + +![Um log de transações](./transaction-log.png) + +Após pressionar o botão de incremento que gerará uma transação para chamar nossa função `increment()` se clicarmos novamente nos botões count ou getCount, iremos ler o estado recém-atualizado de nosso contrato inteligente com a variável de contagem maior que 0. + +![Estado recentemente atualizado do contrato inteligente](./updated-state.png) + +No próximo tutorial, explicaremos [como você pode adicionar eventos aos seus contratos inteligentes](/developers/tutorials/logging-events-smart-contracts/). Eventos de registro são uma maneira conveniente para depurar seu contrato inteligente e entender o que está acontecendo durante a chamada de uma função. diff --git a/public/content/translations/pt-br/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/pt-br/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md new file mode 100644 index 00000000000..ed91278fc09 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -0,0 +1,163 @@ +--- +title: "Reduzir contratos para combater o limite de tamanho do contrato" +description: O que você pode fazer para evitar que seus contratos inteligentes fiquem muito grandes? +author: Markus Waas +lang: pt-br +tags: + - "solidez" + - "smart contracts" + - "armazenamento" + - "truffle" +skill: intermediate +published: 2020-06-26 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/max-contract-size +--- + +## Por que há um limite? {#why-is-there-a-limit} + +Em [22 de novembro de 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/) o fork Spurius Dragon introduziu a [EIP-170](https://eips.ethereum.org/EIPS/eip-170) que adicionou um limite de tamanho do contrato inteligente de 24.576 kb. Para você como desenvolvedor de Solidity isso significa que quando você adiciona mais e mais funcionalidade ao seu contrato, em algum momento você alcançará o limite e quando implantado verá o erro: + +`Aviso: O código do contrato excede 24576 bytes (um limite introduzido no Dragão Purioso). This contract may not be deployable on Mainnet. Considere habilitar o otimizador (com um valor baixo de "execução"!), desligar as strings de reverter ou usar bibliotecas.` + +Este limite foi introduzido para impedir ataques de negação de serviço (DOS). Qualquer apelo a um contrato é relativamente barato. No entanto, o impacto de uma chamada de contrato para os nós da Ethereum aumenta de forma desproporcionada, dependendo do tamanho do código do contrato chamado (lendo o código do disco, pré-processando o código, adicionando dados à prova de Merkle). Sempre que você tiver uma situação em que o agressor requer poucos recursos para causar muito trabalho para os outros, você tem o potencial para ataques DOS. + +Originalmente, tratava-se de um problema menor, porque um limite de tamanho natural do contrato é o limite de gas por bloco. Obviamente, um contrato precisa ser implementado dentro de uma transação que tenha todo o bytecode do contrato. Se você incluir apenas essa transação em um bloco, você pode usar todo esse gas, mas não é infinito. Desde a [London Upgrade](/history/#london), o limite de gas de bloco tem sido capaz de variar entre 15M e 30M de unidades, de acordo com a demanda da rede. + +## Começando a luta {#taking-on-the-fight} + +Infelizmente, não há maneira fácil de obter o tamanho do bytecode dos seus contratos. Uma ótima ferramenta para ajudá-lo é o plugin [truffle-contract-size](https://github.com/IoBuilders/truffle-contract-size) se você estiver usando o Truffle. + +1. `npm install truffle-contract-size` +2. Adicione o plugin ao _truffle-config.js_: `plugins: ["truffle-contract-size"]` +3. Execute `truffle rodando contract-size` + +Isso irá ajudá-lo a descobrir como suas mudanças estão afetando o tamanho total do contrato. + +A seguir, analisaremos alguns métodos ordenados pelo seu potencial impacto. Pense nisso em termos de perda de peso. A melhor estratégia para alguém atingir o seu peso alvo (no nosso caso 24kb) é concentrar-se primeiro nos grandes métodos de impacto. Na maioria dos casos, só de ajustar a sua dieta já ajudará, mas às vezes é necessário de um pouco mais. Então você pode adicionar algum exercício (impacto médio) ou até suplementos (impacto pequeno). + +## Grande impacto {#big-impact} + +### Separe os seus contratos {#separate-your-contracts} + +Esta deve ser sempre sua primeira abordagem. Como você pode separar o contrato em vários contratos menores? Geralmente isso te força a criar uma boa arquitetura para seus contratos. Os contratos menores são sempre preferidos por uma perspectiva de legibilidade de código. Para dividir contratos, pergunte a si mesmo: + +- Quais as funções que devem estar juntas? Cada conjunto de funções pode ser o melhor em seu próprio contrato. +- Que funções não requerem leitura do estado do contrato ou apenas um subconjunto específico do estado? +- Você pode dividir o armazenamento e a funcionalidade? + +### Bibliotecas {#libraries} + +Uma maneira simples de mover o código de funcionalidade para longe do armazenamento é usando [uma biblioteca](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). Não declarar as funções da biblioteca como internas, como essas, serão [adicionadas ao contrato](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) diretamente durante a compilação. Mas se usarmos funções públicas, elas estarão então de fato, num contrato separado de biblioteca. Considere [o uso de](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for) para fazer o uso de bibliotecas mais convenientes. + +### Proxies {#proxies} + +Uma estratégia mais avançada seria um sistema de procuração. As bibliotecas usam `DELEGATECALL` na parte traseira, que simplesmente executa a função de outro contrato com o estado do contrato de chamada. Confira [esta postagem no blog](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) para saber mais sobre sistemas de proxy. Eles lhe dão mais funcionalidade, por exemplo, permitem a atualização, mas também adicionam muita complexidade. Eu não adicionaria aquelas apenas para reduzir os tamanhos dos contratos, a menos que fosse a sua única opção por qualquer motivo. + +## Médio impacto {#medium-impact} + +### Remover funções {#remove-functions} + +Este deveria ser óbvio. Funções aumentam um pouco o tamanho de um contrato. + +- **Externo**: Frequentemente adicionamos muitas funções de exibição por motivos de conveniência. Está perfeitamente tudo bem até que você atinja o limite de tamanho. Então talvez queiram realmente pensar na eliminação de todos que não os absolutamente essenciais. +- **Interno**: Você também pode remover funções internas/privadas e simplesmente inserir o código, desde que a função seja chamada apenas uma vez. + +### Evitar variáveis adicionais {#avoid-additional-variables} + +Uma mudança simples assim: + +```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); +} +``` + +faz diferença de **0.28kb**. Você pode encontrar muitas situações semelhantes nos seus contratos e isso pode realmente somar quantias significativas. + +### Encurtar mensagem de erro {#shorten-error-message} + +Mensagens de reversão longa e, em particular, muitas mensagens de reversão diferentes podem bloquear o contrato. Em vez disso, use códigos de erro curtos e decodifique-os no contrato. Uma mensagem longa poderia ser muito mais curta: + +```solidity +require(msg.sender == owner, "Only the owner of this contract can call this function"); + +``` + +```solidity +require(msg.sender == owner, "OW1"); +``` + +### Use erros personalizados ao invés de mensagens de erro + +Erros personalizados foram introduzidos no [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/). Eles são uma ótima maneira de reduzir o tamanho de seus contratos, porque são codificados por ABI como seletores (assim como as funções são). + +```solidity +error Unauthorized(); + +if (msg.sender != owner) { + revert Unauthorized(); +} +``` + +### Considere um valor de baixa execução no otimizador {#consider-a-low-run-value-in-the-optimizer} + +Você também pode alterar as configurações do otimizador. O valor padrão de 200 significa que está tentando otimizar o bytecode como se uma função fosse chamada 200 vezes. Se você alterá-lo para 1, basicamente diga ao otimizador para otimizar em caso de executar cada função apenas uma vez. Uma função otimizada para rodar apenas uma vez significa que ela é otimizada para a própria implantação. Esteja ciente de que **isso aumenta o custo do [gás](/developers/docs/gas/) por executar as funções**, então você pode querer não otimizá-la. + +## Pequeno impacto {#small-impact} + +### Evite passar instruções para funções {#avoid-passing-structs-to-functions} + +Se você estiver usando o [ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2), ele pode ajudar a não passar de structs para uma função. Em vez de passar o parâmetro como uma estrutura... + +```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); +} +``` + +... passe os parâmetros necessários diretamente. Neste exemplo, salvamos outro **0.1kb**. + +### Declarar a visibilidade correta para funções e variáveis {#declare-correct-visibility-for-functions-and-variables} + +- Funções ou variáveis que são chamadas apenas do lado de fora? Declará-las como `externas` em vez de `públicas`. +- Funções ou variáveis apenas chamadas dentro do contrato? Declará-las como `private` ou `internal` em vez de `public`. + +### Remover modificadores {#remove-modifiers} + +Os modificadores, especialmente quando usados intencionalmente, podem ter um impacto significativo no tamanho do contrato. Considere removê-los e, em vez disso, usar funções. + +```solidity +modifier checkStuff() {} + +function doSomething() checkStuff {} +``` + +```solidity +function checkStuff() private {} + +function doSomething() { checkStuff(); } +``` + +Essas dicas devem ajudá-lo a reduzir significativamente o tamanho do contrato. Mais uma vez, nunca é demais salientar que se foca sempre na divisão dos contratos, se possível para o maior impacto. diff --git a/public/content/translations/pt-br/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/pt-br/developers/tutorials/eip-1271-smart-contract-signatures/index.md new file mode 100644 index 00000000000..36a492a687b --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/eip-1271-smart-contract-signatures/index.md @@ -0,0 +1,127 @@ +--- +title: "EIP-1271: Assinatura e verificação de contratos inteligentes" +description: Uma visão geral de geração de assinatura de contratos inteligentes e verificação com a EIP-1271. Também passaremos pela implementação da EIP-1271 usada no Safe (anteriormente Gnosis Safe) para fornecer um exemplo concreto de contrato inteligente para que desenvolvedores possam construir por cima dele. +author: Nathan H. Leung +lang: pt-br +tags: + - "eip-1271" + - "contratos inteligentes" + - "verificando" + - "assinatura" +skill: intermediate +published: 2023-01-12 +--- + +A norma [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) permite a contratos inteligentes verificarem assinaturas. + +Neste tutorial, forneceremos uma visão geral das assinaturas digitais, noções básicas sobre a EIP-1271, e a implementação específica da EIP-1271 usada pelo [Safe](https://safe.global/) (previamente Gnosis Safe). Tudo isso pode servir como ponto de partida para a implementação da EIP-1271 nos seus próprios contratos. + +## O que é assinatura? + +Nesse contexto, uma assinatura (mais precisamente, uma “assinatura digital”) é uma mensagem, acompanhada de um tipo de prova de que a mensagem veio de uma pessoa, remetente ou endereço específico. + +Por exemplo, uma assinatura digital pode se parecer com isto: + +1. Mensagem: “Quero me conectar a este website com minha carteira Ethereum.” +2. Assinante: Meu endereço é `0x000…` +3. Prova: Aqui está uma prova de que eu, `0x000…`, realmente criei esta mensagem inteira (isto é geralmente algo criptográfico). + +É importante observar que uma assinatura digital inclui ambos, uma “mensagem” e uma “assinatura”. + +Por quê? Por exemplo, se você me der um contrato para assinar, e eu retirar a página de assinatura e devolver somente a minha assinatura sem o resto do contrato, o contrato não seria válido. + +Da mesma maneira, uma assinatura digital não significa nada sem uma mensagem associada! + +## Por que a EIP-1271 existe? + +Para criar uma assinatura digital para uso em blockchains baseados em Ethereum, você geralmente precisa de uma chave secreta que ninguém mais conhece. Isto é o que faz sua assinatura, sua (ninguém mais pode criar a mesma assinatura sem o conhecimento da chave secreta). + +Sua conta Ethereum (ou seja, conta de propriedade externa / EOA) tem uma chave privada associada a ela quando um website ou dapp pergunta por sua assinatura (por exemplo: “Log in with Ethereum”). + +Um app pode [verificar uma assinatura](https://docs.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) que você criou usando uma biblioteca de terceiros, como ethers.js [sem conhecer sua chave privada](https://en.wikipedia.org/wiki/Public-key_cryptography) e estar confiante de que foi _você_ quem criou a assinatura. + +> De fato, como as assinaturas digitais EOA usam criptografia de chave pública, elas podem ser geradas e verificadas **off-chain**! É assim que a votação em DAO sem gás funciona — em vez de submeter votos on-chain, as assinaturas digitais podem ser criadas e verificadas off-chain usando bibliotecas criptográficas. + +Enquanto as contas EOA têm uma chave privada, as contas de contrato inteligente não têm nenhum tipo de chave privada ou secreta (portanto, “Entrar com Ethereum”, etc. não pode funcionar nativamente com contas de contratos inteligentes). + +O problema que a EIP-1271 visa resolver: como podemos dizer que uma assinatura de contrato inteligente é válida se o contrato inteligente não tem um “segredo” que ele possa incorporar na assinatura? + +## Como a EIP-1271 funciona? + +Contratos inteligentes não têm chaves privadas que possam ser usadas para assinar mensagens. Então, como podemos saber se uma assinatura é autêntica? + +Bem, uma ideia é que podemos _perguntar_ ao contrato inteligente se uma assinatura é autêntica! + +O que o EIP-1271 faz é padronizar a ideia de "perguntar" ao contrato inteligente se uma dada assinatura é válida. + +Um contrato que implementa EIP-1271 deve ter uma função chamada `isValidSignature` que recebe a mensagem e a assinatura. O contrato pode então executar alguma lógica de validação (a especificação não força nada específico aqui) e então retornar um valor indicando se a assinatura é válida ou não. + +Se `isValidSignature` retornar um resultado válido, isso é basicamente o contrato dizendo “sim, eu aprovo esta assinatura + mensagem!” + +### Interface + +Aqui está a interface exata na especificação da EIP-1271 (falaremos sobre o parâmetro `_hash` abaixo, mas por enquanto, pense nele como a mensagem que está sendo verificada): + +```jsx +pragma solidity ^0.5.0; + +contract ERC1271 { + + // bytes4(keccak256("isValidSignature(bytes32,bytes)") + bytes4 constant internal MAGICVALUE = 0x1626ba7e; + + /** + * @dev Should return whether the signature provided is valid for the provided hash + * @param _hash Hash of the data to be signed + * @param _signature Signature byte array associated with _hash + * + * MUST return the bytes4 magic value 0x1626ba7e when function passes. + * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) + * MUST allow external calls + */ + function isValidSignature( + bytes32 _hash, + bytes memory _signature) + public + view + returns (bytes4 magicValue); +} +``` + +## Exemplo de implementação da EIP-1271: Safe + +Os contratos podem implementar `isValidSignature` de várias maneiras — a especificação somente não diz muito sobre a implementação exata. + +Um contrato importante que implementa a EIP-1271 é o Safe (anteriormente Gnosis Safe). + +No código do Safe, `isValidSignature` [ é implementada](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol) para que assinaturas possam ser criadas e verificadas de [duas maneiras](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support): + +1. Mensagens on-chain + 1. Criação: um proprietário Safe cria uma nova transação Safe para “assinar” a mensagem, passando a mensagem como um dado na transação. Uma vez que proprietários suficientes assinam a transação para alcançar o limite multisig, a transação é enviada e executada. Na transação, há uma função Safe chamada, que adiciona a mensagem à lista de mensagens “aprovadas”. + 2. Verificação: chame `isValidSignature` no contrato Safe, e transmita a mensagem para verificar enquanto parâmetro da mensagem e [ um parâmetro vazio como parâmetro da assinatura](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (i.e. `0x`). O Safe verá que o parâmetro da assinatura está vazio e, em vez de verificar a assinatura criptograficamente, ele saberá que deve prosseguir e verificar se a mensagem está na lista de mensagens “aprovadas”. +2. Mensagens off-chain: + 1. Criação: um proprietário Safe cria uma mensagem off-chain, e então consegue outros proprietários Safe para assinar a mensagem, cada um individualmente, até que haja assinaturas suficientes para conseguir a aprovação pelo limite do multisig. + 2. Verificação: chama `isValidSignature`. No parâmetro da mensagem, passa a mensagem para ser verificada. No parâmetro da assinatura, passa cada assinatura individual de proprietário Safe todas concatenadas juntas. O Safe irá checar que há assinaturas suficientes para atingir o limite **e** que cada assinatura é válida. Acontecendo isso, ele retornará um valor indicando verificação da assinatura com sucesso. + +## O que é exatamente o parâmetro `_hash`? Por que não passar a mensagem inteira? + +Você pode ter notado que a função `isValidSignature` na interface [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) não pega a mensagem propriamente dita, mas, em vezés disso, um parâmetro `_hash`. O que isto significa é que ao invés de passar a mensagem inteira de tamanho arbitrário para `isValidSignature`, nós passamos um hash de 32-bytes da mensagem (geralmente keccak256). + +Cada byte de calldata — ou seja, dados de parâmetro da função passados para uma função de contrato inteligente — [custa16 gás (4 gás se zero byte)](https://eips.ethereum.org/EIPS/eip-2028), então, isso pode economizar um monte de gás se a mensagem for longa. + +### Especificações EIP-1271 anteriores + +Existem outras especificações EIP-1271 por aí, que têm uma função `isValidSignature` com um primeiro parâmetro do tipo `bytes` (tamanho arbitrário, em vez de tamanho fixo `bytes32`) e nome de parâmetro `message`. Essa é uma [versão mais antiga](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) da norma EIP-1271. + +## Como o EIP-1271 poderia ser implementado nos meus próprios contratos? + +A especificação é bem aberta aqui. A implementação Safe tem algumas boas ideias: + +- Você pode considerar assinaturas EOA do "proprietário" do contrato serem válidas. +- Você poderia armazenar uma lista de mensagens aprovadas e somente considerar estas serem válidas. + +No final, depende de você, como desenvolvedor do contrato! + +## Conclusão + +A [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) é uma norma versátil que permite contratos inteligentes verificar assinaturas. Ele abre a porta para contratos inteligentes que funcionam mais como EOAs - por exemplo fornecendo uma maneira de se "conectar via Ethereum" para trabalhar com contratos inteligentes - e ele pode ser implementado de várias maneiras (Safe tendo uma implementação interessante e não trivial a se considerar). diff --git a/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md new file mode 100644 index 00000000000..960c69543fb --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -0,0 +1,632 @@ +--- +title: "Passo a passo do contrato Vyper ERC-721" +description: Ryuya Nakamura's ERC-721 contrato e como funciona +author: Ori Pomerantz +lang: pt-br +tags: + - "vyper" + - "erc-721" + - "python" +skill: beginner +published: 2021-04-01 +--- + +## Introdução {#introduction} + +O [ERC-721](/developers/docs/standards/tokens/erc-721/) padrão é usado para manter a propriedade de tokens não fungíveis (NFT). [ERC-20](/developers/docs/standards/totens/erc-20/) os tokens se comportam como uma mercadoria, porque não há diferença entre os totens individuais. Em contraste com isso, ERC-721 tokens são projetados para ativos semelhantes, mas não idênticos, como diferentes [cat cartoons](https://www.cryptokitties.co/) ou títulos de diferentes imóveis. + +Neste artigo, vamos analisar o [contrato ERC-721 de Ryuya Nakamura](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy). Este contrato é escrito em [Vyper](https://vyper.readthedocs.io/en/latest/index.html), a Python-like linguagem de contrato projetada para tornar é mais difícil escrever código inseguro do que na solidez. + +## O Contrato {#contract} + +```python +# @dev Implementation of ERC-721 non-fungible token standard. +# @author Ryuya Nakamura (@nrryuya) +# Modified from: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy +``` + +Comentários em Vyper, como em Python, começam com um hash (`#`) e continuam até o final da linha. Comentários que incluem `@` são usados ​​por [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) para produzir documentação legível para humanos. + +```python +from vyper.interfaces import ERC721 + +implements: ERC721 +``` + +A interface ERC-721 é construída na linguagem Vyper. [você pode ver o código definido aqui](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py). A definição da interface é escrita em Python, em vez de Vyper, porque as interfaces são usadas não apenas dentro da blockchain, mas também ao enviar à blockchain uma transação de um cliente externo, que pode ser escrito em Python. + +A primeira linha importa a ‘interface’, e o segundo especifica o que estamos incrementando aqui. + +### A interface ERC721Receiver {#receiver-interface} + +```python +# Interface for the contract called by safeTransferFrom() +interface ERC721Receiver: + def onERC721Received( +``` + +ERC-721 suporta dois tipos de transferência: + +- ` transfere de `, que permite ao remetente especifique qualquer endereço de destino e coloca a responsabilidade para a transferência no remetente. Isso significa que você pode transferir para um endereço inválido, caso em que o NFT será perdido para sempre. +- `safeTransferFrom`, que verifica se o endereço de destino é um contrato. Se for assim, o contrato ERC-721 pergunta ao contrato receptor se deseja receber o NFT. + +Para responder ` transferência segura de ` solicita um recebimento contrato deve implementar `ERC721 recebedor `. + +```python + _operator: address, + _from: address, +``` + +O endereço `_de ` é o proprietário atual do token. O endereço `_operador` é aquele que solicitou a transferência (esses dois podem não ser o mesmo devido às provisões). + +```python + _tokenId: uint256, +``` + +ERC-721 token IDs está 256 bits. Normalmente, elas são criados por meio de uma execução de hash da descrição que o token representa. + +```python + _data: Bytes[1024] +``` + +O requerimento pode ter até 1024 bytes de dados do usuário. + +```python + ) -> bytes32: view +``` + +Para evitar casos em que um contrato acidentalmente aceita uma transferência o valor de retorno não é um booleano, mas 256 bits com um valor específico. + +Essa função é uma `view`, o que significa que pode ler o estado da blockchain, mas não modificá-lo. + +### Eventos {#events} + +Os [eventos](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) são emitidos para informar usuários e servidores fora da blockchain de eventos. Observe que o conteúdo dos eventos não está disponível para contratos na blockchain. + +```python +# @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are +# created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any +# number of NFTs may be created and assigned without emitting Transfer. At the time of any +# transfer, the approved address for that NFT (if any) is reset to none. +# @param _from Sender of NFT (if address is zero address it indicates token creation). +# @param _to Receiver of NFT (if address is zero address it indicates token destruction). +# @param _tokenId The NFT that got transferred. +event Transfer: + sender: indexed(address) + receiver: indexed(address) + tokenId: indexed(uint256) +``` + +Isso é similar para o evento ERC-20 Transfer, exceto que informamos um `tokenId` em vez de um valor. Ninguém possui o endereço zero, portanto, por convenção, o usamos para relatar a criação e a destruição de tokens. + +```python +# @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero +# address indicates there is no approved address. When a Transfer event emits, this also +# indicates that the approved address for that NFT (if any) is reset to none. +# @param _owner Owner of NFT. +# @param _approved Address that we are approving. +# @param _tokenId NFT which we are approving. +event Approval: + owner: indexed(address) + approved: indexed(address) + tokenId: indexed(uint256) +``` + +Uma aprovação ERC-721 é semelhante a uma permissão ERC-20. Um endereço específico é autorizado a transferir um determinado símbolo. Isso fornece um mecanismo para os contratos responderem quando aceitam um token. Os contratos não podem ouvir os eventos, portanto, se você apenas transferir o token para eles, eles não “saberão” disso. Desta forma, primeiro, o proprietário envia uma aprovação e, em seguida, envia uma solicitação ao contrato: “Aprovei para você transferir o token X, faça…”. + +Esse é o designe escolhido por fazer o ERC-721 padrão semelhante ao padrão ERC-20. Como os tokens ERC-721 não são fungíveis, um contrato também pode identificar que obteve um token específico olhando a propriedade do token. + +```python +# @dev This emits when an operator is enabled or disabled for an owner. The operator can manage +# all NFTs of the owner. +# @param _owner Owner of NFT. +# @param _operator Address to which we are setting operator rights. +# @param _approved Status of operator rights(true if operator rights are given and false if +# revoked). +event ApprovalForAll: + owner: indexed(address) + operator: indexed(address) + approved: bool +``` + +Às vezes, é útil ter um _operador_ que pode gerenciar todos os tokens da conta de um tipo específico (aqueles gerenciados por um contrato específico), semelhante a uma procuração. Por exemplo, eu posso querer dar tal poder a um contrato que verifica se Eu não tenho contatado ele por seis meses, e se assim for distribuo os meus bens aos meus herdeiros (se um deles o pedir, contrata não pode fazer nada sem ser chamado por uma transação). No ERC-20, podemos simplesmente atribuir uma provisão alta a um contrato de herança, mas isso não funciona para ERC-721, pois os tokens não são fungíveis. Isso é o equivalente. + +O valor `approved` nos informa se o evento é para uma aprovação ou a retirada de uma aprovação. + +### Variáveis ​​de Estado {#state-vars} + +Essas variáveis contêm o estado atual dos tokens: os quais estão disponíveis e a quem os possui. A maioria delas são objetos `HashMap`, [mapeamentos unidirecionais que existem entre dois tipos](https://vyper.readthedocs.io/en/latest/types.html#mappings). + +```python +# @dev Mapping from NFT ID to the address that owns it. +idToOwner: HashMap[uint256, address] + +# @dev Mapping from NFT ID to approved address. +idToApprovals: HashMap[uint256, address] +``` + +As identidades de usuários e contratos no Ethereum são representados por endereços de 160 bits. Essas duas variáveis mapeiam IDs de tokens para seus proprietários e aqueles aprovados a transferi-los (no máximo um para cada). No Ethereum, os dados não inicializados são sempre zero, pois, se não houver proprietário ou transferidor aprovado, o valor desse token será zero. + +```python +# @dev Mapping from owner address to count of his tokens. +ownerToNFTokenCount: HashMap[address, uint256] +``` + +Essa variável possui a contagem de tokens para cada proprietário. Não há mapeamento de proprietários para tokens, então, a única forma de identificar os tokens que um proprietário específico possui é olhar para trás no histórico de eventos da blockchain e ver os eventos `Transfer` apropriados. Podemos usar essa variável para saber quando temos todos os NFTs e não precisaremos mais olhar ainda mais no tempo. + +Observe que esse algoritmo funciona apenas para interfaces do usuário e servidores externos. Código em execução na blockchain em si não pode ler eventos passados. + +```python +# @dev Mapping from owner address to mapping of operator addresses. +ownerToOperators: HashMap[address, HashMap[address, bool]] +``` + +Uma conta pode ter mais de um único operador. Um simples `HashMap` é insuficiente para mantê-los, pois cada chave gera um único valor. Em vez disso, você pode usar `HashMap[address, bool]` como valor. Por padrão, o valor para cada endereço é `False`, o que significa que ele não é um operador. Você pode definir valores como `True` conforme necessário. + +```python +# @dev Address of minter, who can mint a token +minter: address +``` + +Novos tokens têm de ser criados de alguma forma. Neste contrato há uma única entidade que está autorizada a fazê-lo, o `minter`. É provável que isso seja suficiente para um jogo, por exemplo. Para outros propósitos, pode ser necessário criar uma lógica de negócio mais complicada. + +```python +# @dev Mapping of interface id to bool about whether or not it's supported +supportedInterfaces: HashMap[bytes32, bool] + +# @dev ERC165 interface ID of ERC165 +ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7 + +# @dev ERC165 interface ID of ERC721 +ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd +``` + +[ERC-165](https://eips.ethereum.org/EIPS/eip-165) especifica um mecanismo para um contrato divulgar como aplicações podem se comunicar com ele, com os quais ERCs ele está em conformidade. Neste caso, o contrato está em conformidade com ERC-165 e ERC-721. + +### Funções {#functions} + +Estas são as funções que realmente implementam o ERC-721. + +#### Construtor {#constructor} + +```python +@external +def __init__(): +``` + +No Vyper, assim como no Python, a função construtora é chamada `__init__`. + +```python + """ + @dev Contract constructor. + """ +``` + +No Python e no Vyper, você também pode criar um comentário especificando uma string de múltiplas linhas (que começa e termina com `"""`), e não usá-lo de qualquer forma. Esses comentários também podem incluir [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html). + +```python + self.supportedInterfaces[ERC165_INTERFACE_ID] = True + self.supportedInterfaces[ERC721_INTERFACE_ID] = True + self.minter = msg.sender +``` + +Para acessar variáveis de estado, você usa `self.` (novamente, o mesmo que em Python). + +#### Exibir funções {#views} + +São funções que não modificam o estado da blockchain e, por isso, podem ser executadas gratuitamente se chamadas externamente. Se as funções de exibição forem chamadas por um contrato, elas ainda têm de ser executadas em cada nó e, portanto, custam gás. + +```python +@view +@external +``` + +Essas palavras-chave anteriores a uma definição de função que começam com um sinal de (`@`) são chamadas de _decoradores_. Elas especificam as circunstâncias em que uma função pode ser chamada. + +- `@view` especifica que esta função é um modo de exibição. +- `@external` especifica que essa função em particular pode ser chamada por transações e por outros contratos. + +```python +def supportsInterface(_interfaceID: bytes32) -> bool: +``` + +Ao contrário do Python, o Vyper é uma [linguagem de tipo estática](https://wikipedia.org/wiki/Type_system#Static_type_checking). Você não pode declarar uma variável ou um parâmetro de função, sem identificar os tipos de [dados](https://vyper.readthedocs.io/en/latest/types.html). Neste caso, o parâmetro de entrada é `bytes32`, um valor de 256 bits (256 bits é o tamanho da palavra nativa da [Máquina Virtual do Ethereum](/developers/docs/evm/)). A saída é um booleano valor. Por convenção, os nomes dos parâmetros da função começam com um sublinhado (`_`). + +```python + """ + @dev Interface identification is specified in ERC-165. + @param _interfaceID Id of the interface + """ + return self.supportedInterfaces[_interfaceID] +``` + +Retorne o valor do `self.supportedInterfaces` HashMap, o qual é definido no construtor (`__init__`). + +```python +### VIEW FUNCTIONS ### +``` + +Estas são as funções de visualização que fornecem informações sobre os tokens disponíveis para usuários e outros contratos. + +```python +@view +@external +def balanceOf(_owner: address) -> uint256: + """ + @dev Returns the number of NFTs owned by `_owner`. + Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. + @param _owner Address for whom to query the balance. + """ + assert _owner != ZERO_ADDRESS +``` + +Esta linha [afirma](https://vyper.readthedocs.io/en/latest/statements.html#assert) que `_owner` não é zero. Se for zero, há um erro e a operação é anulada. + +```python + return self.ownerToNFTokenCount[_owner] + +@view +@external +def ownerOf(_tokenId: uint256) -> address: + """ + @dev Returns the address of the owner of the NFT. + Throws if `_tokenId` is not a valid NFT. + @param _tokenId The identifier for an NFT. + """ + owner: address = self.idToOwner[_tokenId] + # Throws if `_tokenId` is not a valid NFT + assert owner != ZERO_ADDRESS + return owner +``` + +Na Máquina Virtual do Ethereum (EVM) qualquer armazenamento que não tenha um valor armazenado nele é zero. Se não houver token em `_tokenId`, o valor de `self.idToOwner[_tokenId]` é zero. Naquilo caso a função reverta. + +```python +@view +@external +def getApproved(_tokenId: uint256) -> address: + """ + @dev Get the approved address for a single NFT. + Throws if `_tokenId` is not a valid NFT. + @param _tokenId ID of the NFT to query the approval of. + """ + # Throws if `_tokenId` is not a valid NFT + assert self.idToOwner[_tokenId] != ZERO_ADDRESS + return self.idToApprovals[_tokenId] +``` + +Observe que `getApproved` _pode_ retornar zero. Se o token for válido, ele retorna `self.idToApprovals[_tokenId]`. Se não houver aprovador, esse valor é zero. + +```python +@view +@external +def isApprovedForAll(_owner: address, _operator: address) -> bool: + """ + @dev Checks if `_operator` is an approved operator for `_owner`. + @param _owner The address that owns the NFTs. + @param _operator The address that acts on behalf of the owner. + """ + return (self.ownerToOperators[_owner])[_operator] +``` + +Esta função checa se `_operator` tem permissão para gerenciar todos os tokens de `_owner` neste contrato. Como pode haver vários operadores, este é um Hashmap de dois níveis. + +#### Funções Auxiliares de Transferência {#transfer-helpers} + +Essas funções implementam operações que fazem parte da transferência ou gerenciamento de tokens. + +```python + +### TRANSFER FUNCTION HELPERS ### + +@view +@internal +``` + +Este decorador, `@internal`, significa que a função é somente acessível de outras funções dentro do mesmo contrato. Por convenção, estes nomes de função também começam com um sublinhado (`_`). + +```python +def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: + """ + @dev Returns whether the given spender can transfer a given token ID + @param spender address of the spender to query + @param tokenId uint256 ID of the token to be transferred + @return bool whether the msg.sender is approved for the given token ID, + is an operator of the owner, or is the owner of the token + """ + 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 +``` + +Há três maneiras na qual um endereço pode ser permitido a transferir um token: + +1. O endereço é o proprietário do token +2. O endereço é aprovado a gastar o token +3. O endereço é um operador do proprietário do token + +A função acima pode ser uma view porque ela não muda o estado. Para reduzir custos operacionais, qualquer função que _possa_ ser uma view, _deve_ ser uma view. + +```python +@internal +def _addTokenTo(_to: address, _tokenId: uint256): + """ + @dev Add a NFT to a given address + Throws if `_tokenId` is owned by someone. + """ + # Throws if `_tokenId` is owned by someone + assert self.idToOwner[_tokenId] == ZERO_ADDRESS + # Change the owner + self.idToOwner[_tokenId] = _to + # Change count tracking + self.ownerToNFTokenCount[_to] += 1 + + +@internal +def _removeTokenFrom(_from: address, _tokenId: uint256): + """ + @dev Remove a NFT from a given address + Throws if `_from` is not the current owner. + """ + # Throws if `_from` is not the current owner + assert self.idToOwner[_tokenId] == _from + # Change the owner + self.idToOwner[_tokenId] = ZERO_ADDRESS + # Change count tracking + self.ownerToNFTokenCount[_from] -= 1 +``` + +Quando há um problema com uma transferência, anulamos a chamada. + +```python +@internal +def _clearApproval(_owner: address, _tokenId: uint256): + """ + @dev Clear an approval of a given address + Throws if `_owner` is not the current owner. + """ + # Throws if `_owner` is not the current owner + assert self.idToOwner[_tokenId] == _owner + if self.idToApprovals[_tokenId] != ZERO_ADDRESS: + # Reset approvals + self.idToApprovals[_tokenId] = ZERO_ADDRESS +``` + +Altere o valor apenas se necessário. Variáveis de estado vivem no armazenamento. Escrever para o storage é uma das operações mais caras que a EVM (Máquina Virtual Ethereum) faz (em termos de [gas](/developers/docs/gas/)). Portanto, é uma boa ideia minimizá-lo, mesmo escrevendo o valor existente tem um custo alto. + +```python +@internal +def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address): + """ + @dev Execute transfer of a NFT. + Throws unless `msg.sender` is the current owner, an authorized operator, or the approved + address for this NFT. (NOTE: `msg.sender` not allowed in private function so pass `_sender`.) + Throws if `_to` is the zero address. + Throws if `_from` is not the current owner. + Throws if `_tokenId` is not a valid NFT. + """ +``` + +Nós temos esta função interna porque há duas maneiras de transferir tokens (normal e segura), mas nós queremos somente uma única localização no código onde nós fazemos isso para facilitar auditoria. + +```python + # Check requirements + assert self._isApprovedOrOwner(_sender, _tokenId) + # Throws if `_to` is the zero address + assert _to != ZERO_ADDRESS + # Clear approval. Throws if `_from` is not the current owner + self._clearApproval(_from, _tokenId) + # Remove NFT. Throws if `_tokenId` is not a valid NFT + self._removeTokenFrom(_from, _tokenId) + # Add NFT + self._addTokenTo(_to, _tokenId) + # Log the transfer + log Transfer(_from, _to, _tokenId) +``` + +Para emitir um evento em Vyper você usa uma declaração de `log` ([veja aqui para mais detalhes](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)). + +#### Funções de Transferência {#transfer-funs} + +```python + +### TRANSFER FUNCTIONS ### + +@external +def transferFrom(_from: address, _to: address, _tokenId: uint256): + """ + @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved + address for this NFT. + Throws if `_from` is not the current owner. + Throws if `_to` is the zero address. + Throws if `_tokenId` is not a valid NFT. + @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else + they maybe be permanently lost. + @param _from The current owner of the NFT. + @param _to The new owner. + @param _tokenId The NFT to transfer. + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Esta função deixa você transferir para um endereço arbitrário. A não ser que o endereço é um usuário, ou um contrato que sabe como transferir tokens, qualquer token que você transferir ficará preso no endereço e inútil. + +```python +@external +def safeTransferFrom( + _from: address, + _to: address, + _tokenId: uint256, + _data: Bytes[1024]=b"" + ): + """ + @dev Transfers the ownership of an NFT from one address to another address. + Throws unless `msg.sender` is the current owner, an authorized operator, or the + approved address for this NFT. + Throws if `_from` is not the current owner. + Throws if `_to` is the zero address. + Throws if `_tokenId` is not a valid NFT. + If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if + the return value is not `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + NOTE: bytes4 is represented by bytes32 with padding + @param _from The current owner of the NFT. + @param _to The new owner. + @param _tokenId The NFT to transfer. + @param _data Additional data with no specified format, sent in call to `_to`. + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Tudo bem fazer a transferência primeiro, porque se der um problema, vamos revertê-la de qualquer maneira, a fim de anular tudo o que foi feito durante a chamada. + +```python + if _to.is_contract: # check if `_to` is a contract address +``` + +Primeiro cheque para ver se o endereço é um contrato (se ele tem código). Se não, assuma que ele é um endereço de usuário e o usuário será capaz de usar o token ou transferi-lo. Mas não deixe que isso engane você com uma falsa sensação de segurança. Você pode perder tokens, mesmo com `safeTransferFrom`, se você transferi-los para um endereço que ninguém conhece a chave privada. + +```python + returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) +``` + +Chame o contrato-alvo para ver se ele pode receber tokens ERC-721. + +```python + # Throws if transfer destination is a contract which does not implement 'onERC721Received' + assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32) +``` + +Se o destino é um contrato, mas um que não aceita tokens ERC-721 (ou que decide não aceitar esta transferência em particular), reverta. + +```python +@external +def approve(_approved: address, _tokenId: uint256): + """ + @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address. + Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. + Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP) + Throws if `_approved` is the current owner. (NOTE: This is not written the EIP) + @param _approved Address to be approved for the given NFT ID. + @param _tokenId ID of the token to be approved. + """ + owner: address = self.idToOwner[_tokenId] + # Throws if `_tokenId` is not a valid NFT + assert owner != ZERO_ADDRESS + # Throws if `_approved` is the current owner + assert _approved != owner +``` + +Por convenção, se você não quiser ter um aprovador, designe o endereço zero, não você mesmo. + +```python + # Check requirements + senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender + senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender] + assert (senderIsOwner or senderIsApprovedForAll) +``` + +Para configurar um aprovador você pode ou ser o proprietário, ou um operador autorizado pelo proprietário. + +```python + # Set the approval + self.idToApprovals[_tokenId] = _approved + log Approval(owner, _approved, _tokenId) + + +@external +def setApprovalForAll(_operator: address, _approved: bool): + """ + @dev Enables or disables approval for a third party ("operator") to manage all of + `msg.sender`'s assets. It also emits the ApprovalForAll event. + Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP) + @notice This works even if sender doesn't own any tokens at the time. + @param _operator Address to add to the set of authorized operators. + @param _approved True if the operators is approved, false to revoke approval. + """ + # Throws if `_operator` is the `msg.sender` + assert _operator != msg.sender + self.ownerToOperators[msg.sender][_operator] = _approved + log ApprovalForAll(msg.sender, _operator, _approved) +``` + +#### Cunhar novos tokens e destruir os existentes {#mint-burn} + +A conta que criou o contrato é o `minter`, o superusuário autorizado a cunhar novos NFTs. No entanto, mesmo isso não é autorizado para queimar tokens existentes. Somente o proprietário, ou uma entidade autorizada pelo proprietário, podem fazer isso. + +```python +### MINT & BURN FUNCTIONS ### + +@external +def mint(_to: address, _tokenId: uint256) -> bool: +``` + +Esta função sempre retorna `True`, porque se a operação falhar, ela é revertida. + +```python + """ + @dev Function to mint tokens + Throws if `msg.sender` is not the minter. + Throws if `_to` is zero address. + Throws if `_tokenId` is owned by someone. + @param _to The address that will receive the minted tokens. + @param _tokenId The token id to mint. + @return A boolean that indicates if the operation was successful. + """ + # Throws if `msg.sender` is not the minter + assert msg.sender == self.minter +``` + +Somente o minter (a conta que criou o contrato ERC-721) pode cunhar novos tokens. Isso pode ser um problema no futuro se você quiser mudar a identidade do minter. Em um contrato de produção, provavelmente seria desejável ter uma função que permita ao minter transferir privilégios de minter para uma outra pessoa. + +```python + # Throws if `_to` is zero address + assert _to != ZERO_ADDRESS + # Add NFT. Throws if `_tokenId` is owned by someone + self._addTokenTo(_to, _tokenId) + log Transfer(ZERO_ADDRESS, _to, _tokenId) + return True +``` + +Por convenção, a cunhagem de novos tokens conta como uma transferência do endereço zero. + +```python + +@external +def burn(_tokenId: uint256): + """ + @dev Burns a specific ERC721 token. + Throws unless `msg.sender` is the current owner, an authorized operator, or the approved + address for this NFT. + Throws if `_tokenId` is not a valid NFT. + @param _tokenId uint256 id of the ERC721 token to be burned. + """ + # Check requirements + assert self._isApprovedOrOwner(msg.sender, _tokenId) + owner: address = self.idToOwner[_tokenId] + # Throws if `_tokenId` is not a valid NFT + assert owner != ZERO_ADDRESS + self._clearApproval(owner, _tokenId) + self._removeTokenFrom(owner, _tokenId) + log Transfer(owner, ZERO_ADDRESS, _tokenId) +``` + +Qualquer pessoa autorizada a transferir um token, tem permissão para queimá-lo. Enquanto uma queima aparece equivalente à transferência para o endereço zero, o endereço zero não recebe de verdade o token. Isso permite-nos liberar todo o armazenamento usado pelo token, o que pode reduzir o custo de gás da transação. + +# Usando este contrato {#using-contract} + +Ao contrário do Solidity, o Vyper não tem herança. Esta é uma escolha de design deliberada para tornar o código mais claro e, com isso, mais fácil de proteger. Portanto, para criar seu próprio contrato Vyper ERC-721, você usa [este contrato](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) e o modifica para implementar a lógica comercial que você desejar. + +# Conclusão {#conclusion} + +Recapitulando, aqui estão algumas das ideias mais importantes neste contrato: + +- Para receber os tokens ERC-721 com uma transferência segura, os contratos têm de implementar a interface `ERC721Receiver`. +- Mesmo que você use a transferência segura, os tokens ainda podem ficar presos se você os enviar para um endereço cuja chave privada. +- Quando há um problema com uma operação, é uma boa ideia fazer o `revert` da chamada, em vez de apenas retornar um valor de falha. +- Os tokens ERC-721 existem quando eles têm um proprietário. +- Existem três formas de ser autorizado a transferir um NFT. Você pode ser o proprietário, ser aprovado para um token específico, ou ser um operador para todos os tokens do proprietário. +- Eventos passados são visíveis apenas fora da blockchain. O código executando dentro da blockchain não pode visualizá-los. + +Agora, você está pronto para implementar contratos Vyper seguros. diff --git a/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md new file mode 100644 index 00000000000..f779a27481c --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/erc20-annotated-code/index.md @@ -0,0 +1,796 @@ +--- +title: "Demonstração do Contrato ERC-20" +description: O que é o contrato OpenZeppelin ERC-20 e por que está lá? +author: Ori Pomerantz +lang: pt-br +tags: + - "solidez" + - "erc-20" +skill: beginner +published: 2021-03-09 +--- + +## Introdução {#introduction} + +Um dos usos mais comuns do Ethereum é a criação por um grupo de pessoas de um token negociável que, de certa forma, criam sua própria moeda. Essas moedas seguem a norma [ERC-20](/developers/docs/standards/tokens/erc-20/). Essa norma possibilita a criação de ferramentas, como os pools de liquidez e carteiras, que funcionam com todos os tokens ERC-20. Neste artigo, analisaremos a [Implementação do OpenZeppelin Solidity ERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol), assim como a [definição de interface](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol). + +Este é o código-fonte anotado. Se você deseja implementar ERC-20, [leia este tutorial](https://docs.openzeppelin.com/contracts/2.x/erc20-supply). + +## A 'Interface' {#the-interface} + +O objetivo de uma norma como a ERC-20 é permitir que as implementações das várias moedas sejam interoperáveis entre aplicativos, como carteiras e corretoras descentralizadas. Para atingirmos tal objetivo, criamos uma ['interface'](https://www.geeksforgeeks.org/solidity-basics-of-interface/). Qualquer código que necessite utilizar o contrato pode usar as mesmas definições de interface e ser compatível com todos os contratos de token que o usem, seja uma carteira de criptomoedas como a MetaMask, um aplicativo descentralizado como o Etherscan.io, ou um contrato diferente como um pool de liquidez. + +![Ilustração da interface ERC-20](erc20_interface.png) + +Se você é um programador experiente, provavelmente se lembra de ver constructos semelhantes em [Java](https://www.w3schools.com/java/java_interface.asp) ou mesmo em [arquivos de cabeçalho em C](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html). + +Essa é a definição da [interface ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) do OpenZeppelin. Ela é uma tradução do [padrão legível para humanos](https://eips.ethereum.org/EIPS/eip-20) em código Solidity. Obviamente, a interface por si só não define _como_ fazer algo. Isso é explicado no código-fonte do contrato abaixo. + +  + +```solidity +// SPDX-License-Identifier: MIT +``` + +Os arquivos Solidity devem incluir um identificador de licença. [Você pode ver a lista de licenças aqui](https://spdx.org/licenses/). Se você necessitar de uma licença diferente, explique nos comentários. + +  + +```solidity +pragma solidity >=0.6.0 <0.8.0; +``` + +A linguagem Solidity continua evoluindo rapidamente, e novas versões podem não ser compatíveis com o código antigo. (confira aqui). Portanto, é uma boa ideia especificar não apenas uma versão mínima da linguagem, mas também uma versão máxima com a qual você testou o código. + +  + +```solidity +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +``` + +O `@dev` no comentário faz parte do [formato NatSpec](https://docs.soliditylang.org/en/develop/natspec-format.html), usado para produzir a documentação a partir de um código-fonte. + +  + +```solidity +interface IERC20 { +``` + +Convenientemente, nomes de Interface começam com `I`. + +  + +```solidity + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); +``` + +Essa função é `external`, ou seja, [só pode ser chamada de fora do contrato](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2). Ela retorna o fornecimento total de tokens no contrato. Esse valor é retornado usando o tipo mais comum no Ethereum, 256 bits não assinado (256 bits é o tamanho de fonte nativo da EVM). Essa função também é uma `view`, ou seja, ela não pode alterar o estado, portanto, ela pode ser executada em apenas um nó em vez de fazer com que todos os nós da blockchain a executem. Esse tipo de função não gera transação e não custa [gás](/developers/docs/Gas/). + +**Observação:** Em teoria, pode-se ter a impressão de que o criador do contrato conseguiria trapacear retornando uma quantia menor do fornecimento total do que a quantia real, fazendo com que cada moeda valha mais do que realmente vale. De qualquer forma, este medo ignora a verdadeira natureza da blockchain. Tudo que acontece na blockchain pode ser verificado em cada nó. Para conseguir isso, cada contrato da linguagem de código e armazenamento esta disponível em cada nó. Embora não seja obrigatório publicar o código Solidity, mas ninguém confiará em você a menos que publique o código-fonte e a versão do Solidity usados na compilação, para que ele possa ser comparado com o código de linguagem da máquina que você forneceu. Por exemplo, confira [este contrato](https://etherscan.io/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD#code). + +  + +```solidity + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); +``` + +Como o próprio nome já diz, `balanceOf` retorna o saldo de uma conta. Contas de Ethereum são identificadas em Solidity usando `address`, que contem 160 bits. Também são `external` e `view`. + +  + +```solidity + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); +``` + +A função `transfer` transfere as moedas de um chamador para outro endereço. Isso envolve uma mudança de estado, então não é um `view`. Quando um usuário chama essa função, ele cria uma transação a um custo cobrada em gás. Ele também emite um evento, `Transfer`, para informar a todos na blockchain sobre esse evento. + +Essa função possui duas saídas para dois chamadores diferentes: + +- Os usuários que chamam a função diretamente de uma interface de usuário. Normalmente o usuário envia uma transação e não espera por uma resposta, que pode demorar uma quantidade indefinida de tempo. O usuário pode ver o que ocorreu procurando pelo recibo da transação (identificado pela transação hash) ou procurando pelo evento `transfer`. +- Outros contratos, nos quais chamam a função como parte de uma transação inteira. Esses contratos obtêm o resultado imediatamente, pois eles executam a mesma transação, para usar o valor de retorno da função. + +O mesmo tipo de saída é criado por outras funções que mudam o estado do contrato. + +  + +As provisões permitem que uma conta gaste tokens que pertencem a um proprietário diferente. Isso é útil, por exemplo, para contratos que agem como vendedores. Contratos não podem monitorar eventos, portanto, se um comprador quiser transferir diretamente, tokens para o contrato do vendedor, esse contrato não saberá se foi pago. Em vez disso, o comprador permite que o contrato do vendedor gaste uma certa quantia, e o vendedor transfere essa quantia. Isso é feito por meio de uma função do contrato do vendedor, para que o contrato do vendedor possa saber se a operação foi bem-sucedida. + +```solidity + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. Isso é + * zero por padrão. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); +``` + +A função `allowance` permite que qualquer pessoa consulte qual é a provisão que um endereço (`owner`) permite que outro endereço (`spender`) gaste. + +  + +```solidity + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. Uma solução possível para mitigar esta corrida + * é primeiramente reduzir a tolerância do remetente para 0 e definir o + * valor desejado depois: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emite um evento de {Approval}. + */ + function approve(address spender, uint256 amount) external returns (bool); +``` + +A função `approve` cria uma provisão. Certifique-se de ler a mensagem sobre como ela pode ser usada indevidamente. No Ethereum, você controla a ordem de suas próprias transações, mas não é possível controlar a ordem na qual as transações de outras pessoas serão executadas, a menos que você não envie sua própria transação até ver a transação de outro lado ser executada. + +  + +```solidity + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. O valor é então deduzido do rendimento do chamador. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); +``` + +Por fim, `transferFrom` é utilizado pelo cliente para realmente gastar a provisão. + +  + +```solidity + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `Valor` é a nova permissão. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} +``` + +Esses eventos são emitidos quando o estado do contrato ERC-20 é alterado. + +## O contrato real {#the-actual-contract} + +Este é o contrato que implementa o padrão ERC-20, [retirado daqui](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). Ele não é destinado a ser usado tal como é, mas você pode [herdar](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm) dele para estendê-lo para algo utilizável. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.8.0; +``` + +  + +### Importar declarações {#import-statements} + +Além das definições de interface acima, o contrato de definição importa outros dois arquivos: + +```solidity + +import "../../GSN/Context.sol"; +import "./IERC20.sol"; +import "../../math/SafeMath.sol"; +``` + +- `GSN/Context.sol` são as definições necessárias para usar [OpenGSN](https://www.opengsn.org/), um sistema que permite que usuários sem ether possam usar a blockchain. Observe que esta é uma versão antiga. Se você quiser integrá-la com o OpenGSN [use este tutorial](https://docs.opengsn.org/javascript-client/tutorial.html). +- [A biblioteca SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-‘overflows’/), que é usada para fazer adições e subtrações sem estouros. Isso é necessário, pois, do contrário, uma pessoa pode ter um token, dois tokens, e então ter 2^256-1 tokens. + +  + +Este comentário explica o propósito do contrato. + +```solidity +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. Isto significa +* que um mecanismo de oferta deve ser adicionado em um contrato derivado usando {_mint}. + * For a generic mechanism see {ERC20PresetMinterPauser}. + * + * TIP: For a detailed writeup see our guide + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * We have followed general OpenZeppelin guidelines: functions revert instead + * of returning `false` on failure. Esse comportamento é, no entanto, convencional + * e não entra em conflito com as expectativas das aplicações do ERC20. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Outras implementações do EIP podem não emitir + * esses eventos, pois não é exigido pela especificação. + * + * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} + * functions have been added to mitigate the well-known issues around setting + * allowances. Veja {IERC20-approve}. + */ + +``` + +### Definição de contrato {#contract-definition} + +```solidity +contract ERC20 is Context, IERC20 { +``` + +Esta linha especifica a herança, neste caso de `IERC20` acima e `Context`, para OpenGSN. + +  + +```solidity + + using SafeMath for uint256; + +``` + +Essa linha anexa a biblioteca `SafeMath` ao tipo `uint256`. Você pode encontrar essa biblioteca [aqui](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol). + +### Definições de variáveis {#variable-definitions} + +Essas definições especificam as variáveis de estado do contrato. Existem variáveis declaradas como `private`, mas isso apenas significa que outros contratos na blockchain não as podem ler. _Não há segredos na blockchain_, o software em cada nó possui o estado de cada contrato em cada bloco. Por convenção, as variáveis de estado são denominadas `_`. + +As duas primeiras variáveis são [mapeamentos](https://www.tutorialspoint.com/solidity/solidity_mappings.html), ou seja, se comportam mais ou menos da mesma forma que [matrizes associativas](https://wikipedia.org/wiki/Associative_array), com exceção das chaves, que são valores numéricos. O armazenamento é alocado apenas para as entradas que possuem valores diferentes do padrão (zero). + +```solidity + mapping (address => uint256) private _balances; +``` + +O primeiro mapeamento, `_balances`, é composta por endereços e seus respectivos saldos desse token. Para acessar o saldo, utilize a sintaxe: `_balances[
      ]`. + +  + +```solidity + mapping (address => mapping (address => uint256)) private _allowances; +``` + +Esta variável, `_allowances`, armazena as margens explicadas anteriormente. O primeiro índice é o proprietário das moedas, e o segundo é o contrato com a provisão. Para acessar a quantia que o endereço A pode gastar na conta do endereço B, use `_allowances[B][A]`. + +  + +```solidity + uint256 private _totalSupply; +``` + +Como o nome sugere, essa variável mantém registro do fornecimento total de tokens. + +  + +```solidity + string private _name; + string private _symbol; + uint8 private _decimals; +``` + +Essas três variáveis são usadas para melhorar a legibilidade. As duas primeiras são autoexplicativas, mas `_decimals` não. + +De um lado, o Ethereum não possui ponto flutuante ou variáveis fracionadas. De outro, as pessoas gostam de poder dividir tokens. Uma das razões pelas quais as pessoas estabeleceram o uso do ouro como moeda foi devido à dificuldade de trocá-lo quando alguém queria, por exemplo, comprar vaca pelo valor de um pato. + +A solução é manter o registro dos inteiros, mas em vez de contar o token real, contar o token fracionário, que praticamente não tem valor. No caso do ether, a moeda fracionária é chamada de wei, e 10^18 WEI é igual a um ETH. No momento da criação deste artigo, 10.000.000.000.000 WEI equivalem a cerca de um centavo de Dólar ou Euro. + +Os aplicativos precisam saber como exibir o saldo do token. Se um usuário tiver 3.141.000.000.000.000.000 WEI, seria equivalente a 3,14 ETH? 31,41 ETH? 3,141 ETH? No caso do ETH, é definido 10^18 WEI para o ETH, mas para sua moeda, você pode escolher um valor diferente. Se dividir uma moeda não fizer sentido, você pode usar um valor `_decimals` de zero. Se você quiser utilizar o mesmo padrão utilizado em ETH, use o valor **18**. + +### O Constructor {#the-constructor} + +```solidity + /** + * @dev Sets the values for {name} and {symbol}, initializes {decimals} with + * a default value of 18. + * + * To select a different value for {decimals}, use {_setupDecimals}. + * + * All three of these values are immutable: they can only be set once during + * construction. + */ + constructor (string memory name_, string memory symbol_) public { + _name = name_; + _symbol = symbol_; + _decimals = 18; + } +``` + +O construtor é chamado quando o contrato é criado pela primeira vez. Por convenção, os parâmetros da função são denominados `_`. + +### Funções da interface do usuário {#user-interface-functions} + +```solidity + /** + * @dev Returns the name of the token. + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5,05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * ether and wei. Esse é o valor {ERC20} usado, a menos que {_setupDecimals} seja + * chamado. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view returns (uint8) { + return _decimals; + } +``` + +Essas funções, `nome`, `symbol` e `decimals`, ajudam as interfaces do usuário a conhecer o seu contrato para poderem exibi-lo corretamente. + +O tipo do retorno é `string memory`, o que significa que retorna uma string que é armazenada na memória. Variáveis, como ‘strings’, podem ser armazenadas em três locais: + +| | Tempo de vida | Acesso ao contrato | Custo em gás | +| ------------- | ----------------- | ------------------ | ------------------------------------------------------------------------ | +| Memória | Chamada da função | Leitura/gravação | Dezenas ou centenas (maior para locais mais altos) | +| Calldata | Chamar Função | Somente leitura | Não pode ser usada como retorno, apenas como tipo de parâmetro de função | +| Armazenamento | Até ser alterado | Ler/Escrever | Alto (800 para leitura, 20 mil para gravação) | + +Neste caso, `memory` é a melhor escolha. + +### Informação de leitura do token {#read-token-information} + +Essas funções fornecem informações sobre o token, seja o fornecimento total ou o saldo de uma conta. + +```solidity + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } +``` + +A função `totalSupply` retorna o fornecimento total de tokens. + +  + +```solidity + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view override returns (uint256) { + return _balances[account]; + } +``` + +Leia o saldo de uma conta. Observe que qualquer um pode obter o saldo da conta de outra pessoa. Não há motivo para esconder essa informação, pois ela está disponível em todos os nós. _Não há segredos na blockchain._ + +### Transferência de tokens {#transfer-tokens} + +```solidity + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `recipient` cannot be the zero address. + * - the caller must have a balance of at least `amount`. + */ + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { +``` + +A função `transfer` é chamada para transferir os tokens do remetente para um destinatário. Observe que mesmo que ela retorne um valor booleano, o valor é sempre **true**. Se a transferência falhar, o contrato anulará a chamada. + +  + +```solidity + _transfer(_msgSender(), recipient, amount); + return true; + } +``` + +A função `_transfer` faz o trabalho real. Ela é uma função privada que só pode ser chamada por outras funções de contrato. Por convenção, funções privadas são denominadas `_`, assim como as variáveis de estado. + +Normalmente, usamos `msg.sender` no Solidity para o remetente de mensagens. No entanto, isso rompe a [OpenGSN](http://opengsn.org/). Caso queiramos permitir transações sem Eth com nosso token, precisamos usar `_msgSender()`. Ela retornará `msg.sender` para transações normais, mas para transações sem Eth, ela indicará o signatário original e não o contrato que repassou a mensagem. + +### Funções de margem {#allowance-functions} + +Estas são as funções que implementam a funcionalidade da margem: `allowance`, `approve`, `transferFrom`, e `_approve`. Além disso, a implementação do OpenZeppelin vai além do padrão básico, para poder incluir alguns recursos que melhoram a segurança: `increaseAllowance`, e `decreaseAllowance`. + +#### A função allowance {#allowance} + +```solidity + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view virtual override returns (uint256) { + return _allowances[owner][spender]; + } +``` + +A função `allowance` permite que todo mundo confira qualquer margem. + +#### A função approve {#approve} + +```solidity + /** + * @dev See {IERC20-approve}. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 amount) public virtual override returns (bool) { +``` + +Essa função é chamada para criar uma provisão. Ela é semelhante à função `transfer` acima: + +- A função apenas chama uma função interna (neste caso, `_approve`) que realmente faz o trabalho. +- A função retorna `true` (se for bem-sucedida) ou é revertida (se falhar). + +  + +```solidity + _approve(_msgSender(), spender, amount); + return tu; +} +``` + +Usamos funções internas para minimizar a quantidade de lugares onde as mudanças de estado ocorrem. _Qualquer_ função que mude o estado constitui um risco de segurança em potencial que precisa ser auditado para segurança. Dessa forma, temos menos chances de errar. + +#### A função transferFrom {#transferFrom} + +Essa é a função que um gastador chama para gastar uma margem. Isso requer duas operações: transfira o valor sendo gasto e reduza a margem nesse valor. + +```solidity + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. Isso não é + * necessário para o EIP. Veja a nota no início do {ERC20}. + * + * Requirements: + * + * - `sender` and `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + * - the caller must have allowance for ``sender``'s tokens of at least + * `amount`. + */ + function transferFrom(address sender, address recipient, uint256 amount) public virtual + override returns (bool) { + _transfer(sender, recipient, amount); +``` + +  + +A chamada da função `a.sub(b, "message")` faz duas coisas. Primeiro, ela calcula `a-b`, que é a nova margem. Em seguida, ela verifica se esse resultado não é negativo. Se for negativo, a chamada é revertida com a mensagem fornecida. Observe que, quando uma chamada reverte qualquer processamento feito anteriormente a essa chamada, ela é ignorada para não precisarmos desfazer a `_transfer`. + +```solidity + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, + "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +#### Adições de segurança do OpenZeppelin {#openzeppelin-safety-additions} + +É perigoso definir uma margem que não seja zero como outro valor que não seja zero, porque você só controla a ordem de suas próprias transações, mas não as de outras pessoas. Imagine que você tenha dois usuários: Alice, que é ingênua, e Bill, que é desonesto. Alice quer solicitar um serviço de Bill que, segundo ela, custa cinco tokens — então, ela dá a Bill uma provisão de cinco tokens. + +Então, algo muda e o preço de Bill aumenta para dez tokens. Alice, que ainda quer o serviço, envia uma transação que define a provisão de Bill para dez. No momento em que Bill vê essa nova transação no pool de transações, ele envia uma transação que gasta os cinco tokens de Alice e com uma tarifa de gás muito mais alta que, portanto, será minerada mais rápido. Dessa forma, Bill pode gastar os cinco primeiros tokens e, quando a nova provisão de Alice for minerada, pode gastar mais dez por um preço total de quinze tokens, mais do que Alice queria autorizar. Essa técnica é chamada de [front-running](https://consensys.github.io/smart-contract-best-practices/attacks/#front-running) + +| Transação de Alice | Nonce de Alice | Transação de Bill | Nonce de Bill | A provisão de Bill | Total faturado por Bill de 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 | + +Para evitar esse problema, essas duas funções (`increaseAllowance` e `reduaseAllowance`) permitem que você modifique a provisão por um valor específico. Então, se Bill já tinha gastado cinco tokens, ele só poderá gastar mais cinco tokens. Dependendo do tempo disponível, há duas maneiras de proceder, sendo que as duas acabam com Bill obtendo os dez tokens: + +A: + +| Transação de Alice | Nonce de Alice | Transação de Bill | Nonce de Bill | Permissão de Bill | Cobrança Total de 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: + +| Transação de Alice | Nonce de Alice | Transação de Bill | Nonce de Bill | Permissão de Bill | Cobrança Total de 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 Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } +``` + +A função `a.add(b)` é uma adição segura. No caso improvável de `um`+`b`>=`2^256`, ele não é contornado da mesma maneira que uma adição normal. + +```solidity + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + 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; + } +``` + +### Funções que modificam informações do token {#functions-that-modify-token-information} + +Essas são as quatro funções que realmente funcionam: `_transfer`, `_mint`, `_burn`, e `_appro`. + +#### A função \_transfer {#\_transfer} + +```solidity + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer(address sender, address recipient, uint256 amount) internal virtual { +``` + +Esta função, `_transfer`, transfere moedas de uma conta para outra. Ela é chamada por `transfer` (para transferências da própria conta do remetente) e `transferFrom` (para usar as provisões a serem transferidas da conta de outra pessoa). + +  + +```solidity + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); +``` + +Na verdade, ninguém possui o endereço zero no Ethereum (ou seja, ninguém conhece uma chave privada cuja chave pública correspondente tenha sido transformada no endereço zero). Quando as pessoas usam esse endereço, geralmente se trata de um bug de software, portanto, falhamos se o endereço zero é usado como o remetente ou o destinatário. + +  + +```solidity + _beforeTokenTransfer(sender, recipient, amount); + +``` + +Existem duas maneiras de usar esse contrato: + +1. Use-o como um modelo para o seu próprio código +1. [Herde a partir daqui](https://www.bitdegree.org/learn/solidity-inheritance) e substitua apenas as funções que você precisa modificar + +O segundo método é muito melhor, porque o código OpenZeppelin ERC-20 já foi auditado e comprovado como seguro. Ao usar a herança, é fácil distinguir quais são as funções que você modificou e, para confiar nos seus contratos, as pessoas só precisam auditar essas funções específicas. + +Geralmente, é útil executar uma função toda vez que os tokens mudam de mãos. No entanto,`_transfer` é uma função muito importante e é possível escrevê-la de forma não segura (veja abaixo). Portanto, é melhor não substituí-la. A solução é `_beforeTokenTransfer`, uma [função hook](https://wikipedia.org/wiki/Hooking). Você pode substituir essa função e ela será chamada em cada transferência. + +  + +```solidity + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); +``` + +Essas são as linhas que realmente executam a transferência. Observe que não há **nada** entre elas, e que subtraímos o valor transferido do remetente antes de adicioná-lo ao destinatário. Isso é importante, pois se tivesse ocorrido uma chamada para um contrato diferente nesse meio tempo, ela poderia ter sido utilizada para enganar esse contrato. Dessa forma, a transferência é atômica, ou seja, nada pode acontecer enquanto ela está em execução. + +  + +```solidity + emit Transfer(sender, recipient, amount); + } +``` + +Essa função emite o evento `Transfer`. Os eventos não são acessíveis para contratos inteligentes, mas o código executado fora da blockchain pode ouvir os eventos e reagir a eles. Por exemplo, uma carteira pode monitorar quando o proprietário obtém mais tokens. + +#### As funções \_mint e \_burn {#\_mint-and-\_burn} + +Essas duas funções (`_mint` e `_burn`) modificam o fornecimento total de moedas. Elas são internas e não há nenhuma função que as chame nesse contrato, portanto, elas só são úteis se você herdar do contrato e adicionar sua própria lógica para decidir em que condições gerar novos tokens ou usar os tokens já existentes. + +**OBSERVAÇÃO:** Todos os tokens ERC-20 têm sua própria lógica comercial que dita o gerenciamento de tokens. Por exemplo, um contrato de fornecimento fixo só pode chamar `_mint` no construtor e nunca chamar `_burn`. Um contrato que vende tokens chamará `_mint` quando for pago, e provavelmente chamará `_burn` em algum momento para evitar hiperinflação. + +```solidity + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements: + * + * - `to` cannot be the zero address. + */ + 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); + } +``` + +Certifique-se de atualizar o `_totalSupply` quando o número total de tokens mudar. + +  + +``` + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements: + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + 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); + } +``` + +A função `_burn` é quase idêntica à `_mint`, exceto que ela funciona na direção inversa. + +#### A função \_approve {#\_approve} + +Essa é a função que especifica as provisões. Observe que ela permite que um proprietário especifique uma provisão superior ao saldo atual do proprietário. Isso não tem problema, pois o saldo é verificado no momento da transferência, quando ele poderia diferir do saldo no momento da criação da provisão. + +```solidity + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + 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; +``` + +  + +Emita um evento `Approval`. Dependendo de como o aplicativo é escrito, o contrato do gastador pode ser informado sobre a aprovação, seja pelo proprietário, seja pelo servidor que realiza esses eventos. + +```solidity + emit Approval(owner, spender, amount); + } + +``` + +### Modificando as variáveis decimais {#modify-the-decimals-variable} + +```solidity + + + /** + * @dev Sets {decimals} to a value other than the default one of 18. + * + * WARNING: This function should only be called from the constructor. A maioria dos + * aplicativos que interagem com contratos das moedas não esperarão que + * {decimals} altere, e pode funcionar incorretamente se ele o fizer. + */ + function _setupDecimals(uint8 decimals_) internal { + _decimals = decimals_; + } +``` + +Essa função modifica a variável `_decimals` utilizada para dizer às ‘interfaces’ de usuário como interpretar o valor. Você deve chamá-la a partir do construtor. Seria desonesto chamá-la em qualquer ponto subsequente, ainda mais que aplicativos não são projetados para lidar com isso. + +### Ganchos {#hooks} + +```solidity + + /** + * @dev Hook that is called before any transfer of tokens. This includes + * minting and burning. + * + * Calling conditions: + * + * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens + * will be to transferred to `to`. + * - when `from` is zero, `amount` tokens will be minted for `to`. + * - when `to` is zero, `amount` of ``from``'s tokens will be burned. + * - `from` and `to` are never both zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } +} +``` + +Essa é a função hook a ser chamada durante as transferências. Ela está vazia, mas se precisar dela para fazer algo, basta sobrescrevê-la. + +# Conclusão {#conclusion} + +Resumindo, aqui estão algumas das ideias mais importantes neste contrato (na minha opinião, pode ser que as suas não sejam as mesmas): + +- _Não há segredos na blockchain_. Qualquer informação que um contrato inteligente possa acessar está disponível para o mundo inteiro. +- Você pode controlar a ordem de suas transações, mas não quando transações de outras pessoas estão em andamento. É por isso que alterar uma provisão pode ser perigoso, porque permite que o gastador gaste a soma das duas provisões. +- Valores do tipo `uint256` aproximados. Em outras palavras, _0-1=2^256-1_. Se esse não for o comportamento desejado, você precisa verificá-lo (ou usar a biblioteca SafeMath que faz isso por você). Observe que isso foi alterado em [Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html). +- Faça todas as mudanças de estado de um tipo específico e em um local específico, pois isso facilita a auditoria. Esse é o motivo pelo qual temos, por exemplo, `_approve`, chamado por `approve`, `transferFrom`, `increaseAllowance` e `decreaseAllowance` +- Mudanças de estado devem ser atômicas, sem qualquer outra ação no meio (como se pode ver em `_transfer`). Isso ocorre, pois, durante a mudança de estado, o estado é inconsistente. Por exemplo, entre o tempo que você deduz do saldo do remetente e o tempo de adicionar ao saldo do beneficiário, há menos tokens existentes do que deveria haver. Isto pode ser potencialmente explorado mal-intencionadamente se houver operações entre eles, especialmente chamadas para um contrato diferente. + +Agora que você já viu como o contrato do OpenZeppelin ERC-20 é escrito, e especialmente como ele se tornou mais seguro, escreva seus próprios contratos e aplicativos seguros. diff --git a/public/content/translations/pt-br/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/pt-br/developers/tutorials/erc20-with-safety-rails/index.md new file mode 100644 index 00000000000..e0ffcd80edf --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/erc20-with-safety-rails/index.md @@ -0,0 +1,213 @@ +--- +title: ERC-20 com Trilhos de Segurança +description: Como ajudar pessoas para evitar erros tolos +author: Ori Pomerantz +lang: pt-br +tags: + - "erc-20" +skill: intermediate +published: 2022-08-15 +--- + +## Introdução {#introduction} + +Uma das melhores coisas sobre o Ethereum é que não há autoridade central que possa modificar ou desfazer transações. Um dos maiores problemas do Ethereum é que não há autoridade central com o poder de desfazer erros de usuário ou transações ilícitas. Neste artigo, você aprenderá sobre alguns dos erros comuns que usuários cometem com tokens [ERC-20](/developers/docs/standards/tokens/erc-20/), assim como criar contratos ERC-20 que ajudam usuários a evitar esses erros, ou que dão a uma autoridade central algum poder (por exemplo, congelar contas). + +Observe que, apesar de usarmos o [contrato de token ERC-20 da OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), este artigo não o explica em maiores detalhes. Você pode encontrar esta informação [aqui](/developers/tutorials/erc20-annotated-code). + +Se você quiser ver o código-fonte completo: + +1. Abra o [Remix IDE](https://remix.ethereum.org/). +2. Clique o ícone de clonar o github (![clone github icon](icon-clone.png)). +3. Clone o repositório github `https://github.com/qbzzt/20220815-erc20-safety-rails`. +4. Abra **contracts > erc20-safety-rails.sol**. + +## Criando um contrato ERC-20 {#creating-an-erc-20-contract} + +Antes que nós possamos adicionar funcionalidade de trilhos de segurança, nós precisamos de um contrato ERC-20. Neste artigo, usaremos o [o Assistente de contratos da OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Abra-o em outro navegador e siga estas instruções: + +1. Selecione **ERC20**. +2. Entre estas configurações: + + | Parâmetro | Valor | + | ------------------------- | ---------------- | + | Nome | SafetyRailsToken | + | Símbolo | SAFE | + | Pré-cunhagem | 1.000 | + | Recursos | Nenhum | + | Controle de acesso | Proprietário | + | Capacidade de atualização | Nenhum | + +3. Suba e clique **Open in Remix** (para o Remix) ou **Download** para usar um ambiente diferente. Vou presumir que você está usando o Remix. Se você estiver usando algo diferente, faça as mudanças apropriadas. +4. Agora, temos um contrato ERC-20 totalmente funcional. Você pode expandir `.deps` e `npm` para ver o código importado. +5. Compile, implante e brinque com o contrato para ver se ele funciona como um contrato ERC-20. Se você precisar aprender como usar o Remix, [use este tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). + +## Erros comuns {#common-mistakes} + +### Os erros {#the-mistakes} + +Às vezes, os usuários enviam tokens para o endereço errado. Embora não consigamos ler a mente dos usuários para saber o que querem fazer, há dois tipos de erros que ocorrem muitas vezes e são fáceis de detectar: + +1. Enviar os tokens para o próprio endereço do contrato. Por exemplo, [token Optimism's OP](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) acabou acumulando [mais de 120.000](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042#tokentxns) tokens OP em menos de dois meses. Isso representa uma quantia de dinheiro significativa, que presumimos que as pessoas tenham simplesmente perdido. + +2. Enviar os tokens para um endereço vazio, um que não corresponde a uma [conta de propriedade externa](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) ou um [contrato inteligente](/developers/docs/smart-contracts). Enquanto eu não tenho estatísticas de quão frequente isso acontece, [um incidente poderia ter custado 20.000.000 de tokens](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). + +### Evitando transferências {#preventing-transfers} + +O contrato OpenZeppelin ERC-20 inclui [um hook, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), que é chamado antes de um token ser transferido. Por padrão, esse hook não faz nada, mas podemos pendurar nossas próprias funcionalidades, como verificações que são anuladas se houver um problema. + +Para usar o hook, adicione esta função depois do construtor: + +```solidity + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal virtual + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + } +``` + +Algumas partes desta função podem ser novas se você não estiver muito familiarizado com o Solidity: + +```solidity + internal virtual +``` + +A palavra-chave `virtual` significa que conforme herdamos funcionalidades do `ERC20` e substituímos essa função, outros contratos podem herdar de nós e substituir essa função. + +```solidity + override(ERC20) +``` + +Temos que especificar explicitamente que estamos [substituindo](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) a definição de token ERC20 de `_beforeTokenTransfer`. Em geral, definições explícitas são muito melhores, do ponto de vista da segurança, do que as implícitas — você não pode se esquecer de que fez algo se isso estive bem na sua frente. Esta também é a razão que nós precisamos para especificar que superclasses `_beforeTokenTransfer` nós estamos sobrepondo. + +```solidity + super._beforeTokenTransfer(from, to, amount); +``` + +Esta linha chama a função `_beforeTokenTransfer` do contrato ou contratos que herdamos e que a possui. Neste caso, isto é somente `ERC20`, `Ownable` não tem esse hook. Mesmo que, atualmente, o `ERC20._beforeTokenTransfer` não faça nada, nós o chamamos caso a funcionalidade seja adicionada no futuro (e nós então decidimos reimplantar o contrato, porque contratos não mudam depois da implantação). + +### Codificando os requisitos {#coding-the-requirements} + +Nós queremos adicionar estes requisitos para a função: + +- O endereço `to` não pode ser igual a `address(this)`, o endereço do contrato ERC-20 propriamente dito. +- O endereço `to` não pode ser vazio, ele tem de ser: + - Uma conta de propriedade externa (EOA). Nós não podemos checar se um endereço é um EOA diretamente, mas nós podemos checar o saldo em ETH de um endereço. EOAs quase sempre têm um saldo, mesmo que não estejam mais sendo usados — é difícil esvaziá-los até o último wei. + - Um contrato inteligente. Testar se um endereço é um contrato inteligente é um pouco mais difícil. Há um opcode que checa o tamanho do código externo, chamado [`EXTCODESIZE`](https://www.evm.codes/#3b), mas ele não é disponível diretamente em Solidity. Para isso, temos que usar [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), que é um assembly da EVM. Há outros valores do Solidity que poderíamos usar ([`
      .code` e `
      .codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), mas eles são mais caros. + +Vamos passar sobre o código novo, linha a linha: + +```solidity + require(to != address(this), "Can't send tokens to the contract address"); +``` + +Este é o primeiro requisito, verificar se `to` e `this(address)` não são a mesma coisa. + +```solidity + bool isToContract; + assembly { + isToContract := gt(extcodesize(to), 0) + } +``` + +É assim que verificamos se um endereço é um contrato. Não podemos receber saídas diretamente do Yul, então, em vez disso, definimos uma variável para manter o resultado (`isToContract` neste caso). A maneira como o Yul trabalha é considerando cada opcode como uma função. Então, primeiro chamamos [`EXTCODESIZE`](https://www.evm.codes/#3b) para obter o tamanho do contrato e, em seguida, usamos [`GT`](https://www.evm.codes/#11) para verificar se não é zero (estamos lidando com inteiros sem sinal, então claro que ele não pode ser negativo). Então, escrevemos o resultado em `isToContract`. + +```solidity + require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); +``` + +Por fim, temos a verificação real de endereços vazios. + +## Acesso administrativo {#admin-access} + +Algumas vezes é útil ter um administrador que pode desfazer erros. Para reduzir o potencial de abuso, esse administrador pode ser um [multisig](https://blog.logrocket.com/security-choices-multi-signature-wallets/) para que várias pessoas tenham que concordar com uma ação. Neste artigo, teremos dois recursos administrativos: + +1. Congelar e descongelar contas. Isto pode ser útil, por exemplo, quando uma conta for comprometida. +2. Limpeza de ativos. + + Às vezes, fraudadores enviam tokens fraudulentos para o contrato do token real para ganhar legitimidade. Por exemplo, [veja aqui](https://optimistic.etherscan.io/token/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe?a=0x4200000000000000000000000000000000000042). O contrato ERC-20 legítimo é [0x4200....0042](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042). A fraude que finge ser o contrato é [0x234....bbe](https://optimistic.etherscan.io/address/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe). + + Também é possível que pessoas enviem tokens ERC-20 legítimos para nosso contrato por erro, que é outra razão para querer ter uma maneira de tirá-los de lá. + +OpenZeppelin fornece dois mecanismos para habilitar acesso administrativo: + +- [`Ownable`](https://docs.openzeppelin.com/contracts/4.x/access-control#ownership-and-ownable) contratos tem um único priprietário. Funções que tem o [modifier](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `onlyOwner` só podem ser chamadas por este proprietário. Os proprietários podem transferir a propriedade para outra pessoa ou renunciar a ela completamente. Os direitos de todas as outras contas são geralmente idênticas. +- Os contratos [`AccessControl`](https://docs.openzeppelin.com/contracts/4.x/access-control#role-based-access-control) têm [controle de acesso baseado em função (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). + +Por simplicidade, neste artigo usamos `Ownable`. + +### Congelando e descongelando contratos {#freezing-and-thawing-contracts} + +Congelar e descongelar contratos requer várias mudanças: + +- Um [mapeamento](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) de endereços em [booleanos](https://en.wikipedia.org/wiki/Boolean_data_type) para manter o controle de quais endereços estão congelados. Todos os valores são inicialmente zero, o que, para valores booleanos, é interpretado como falso. Isto é o que queremos porque, por padrão, as contas não são congeladas. + + ```solidity + mapping(address => bool) public frozenAccounts; + ``` + +- [Eventos](https://www.tutorialspoint.com/solidity/solidity_events.htm) para informar qualquer pessoa interessada, quando uma conta é congelada ou descongelada. Tecnicamente falando, os eventos não são necessários para essas ações, mas ajuda o código fora da cadeia a ser capaz de ouvir esses eventos e saber o que está acontecendo. É considerado uma boa conduta para um contrato inteligente emiti-los quando acontece algo que pode ser relevante para outra pessoa. + + Os eventos são indexados, então, será possível pesquisar todas as vezes que uma conta foi congelada ou descongelada. + + ```solidity + // When accounts are frozen or unfrozen + event AccountFrozen(address indexed _addr); + event AccountThawed(address indexed _addr); + ``` + +- Funções para congelar e descongelar contas. Essas duas funções são praticamente idênticas, por isso, analisaremos apenas a função de congelamento. + + ```solidity + function freezeAccount(address addr) + public + onlyOwner + ``` + + As funções marcadas como [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) podem ser chamadas a partir de outros contratos inteligentes ou diretamente por uma transação. + + ```solidity + { + require(!frozenAccounts[addr], "Account already frozen"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); + } // freezeAccount + ``` + + Se a conta já estiver congelada, reverta-a. Caso contrário, congele-a e envie um evento `emit`. + +- Mude o `_beforeTokenTransfer` para evitar que o dinheiro seja movido de uma conta congelada. Note que o dinheiro ainda pode ser transferido para a conta congelada. + + ```solidity + require(!frozenAccounts[from], "The account is frozen"); + ``` + +### Limpeza de ativos {#asset-cleanup} + +Para liberar os tokens ERC-20 mantidos por este contrato, precisamos chamar uma função no contrato do token ao qual eles fazem parte, [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) ou [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). Nesse caso, não faz sentido desperdiçar gás em provisões. Vale mais a pena transferir diretamente. + +```solidity + function cleanupERC20( + address erc20, + address dest + ) + public + onlyOwner + { + IERC20 token = IERC20(erc20); +``` + +Essa é a sintaxe para criar um objeto para um contrato quando recebemos o endereço. Podemos fazer isso porque temos a definição de tokens ERC20 como parte do código-fonte (veja a linha 4) e esse arquivo inclui [a definição para IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), a interface para um contrato OpenZeppelin ERC-20. + +```solidity + uint balance = token.balanceOf(address(this)); + token.transfer(dest, balance); + } +``` + +Esta é uma função de limpeza, portanto, provavelmente não queremos deixar nenhum token. Em vez de obter o saldo do usuário manualmente, podemos também automatizar o processo. + +## Conclusão {#conclusion} + +Esta não é uma solução perfeita — não há solução perfeita para o problema do “usuário que cometeu um erro”. No entanto, usar esses tipos de verificações pode, pelo menos, evitar alguns erros. A capacidade de congelar contas, embora seja perigosa, pode ser usada para limitar os danos de certos ataques ao negar ao hacker os fundos roubados. diff --git a/public/content/translations/pt-br/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/pt-br/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md new file mode 100644 index 00000000000..922ce204baa --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -0,0 +1,154 @@ +--- +title: Introdução ao Desenvolvimento Ethereum +description: "Este é um guia para iniciantes no desenvolvimento do Ethereum. Iremos levá-lo desde a criação de um endpoint de API, para fazer uma solicitação de linha de comando, para escrever seu primeiro script web3! Não é necessário ter experiência em desenvolvimento de blockchain!" +author: "Elan Halpern" +tags: + - "javascript" + - "ethers.js" + - "nódulos" + - "consultando" + - "alchemy" +skill: beginner +lang: pt-br +published: 2020-10-30 +source: Médio +sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f +--- + +![Logos do Ethereum e Alchemy](./ethereum-alchemy.png) + +Este é um guia de iniciantes para começar com o desenvolvimento na Ethereum. Neste tutorial, usaremos a [Alchemy](https://alchemyapi.io/), a plataforma líder de desenvolvedores de blockchain, capacitando milhões de usuários em 70% dos principais aplicativos de blockchain, incluindo Maker, 0x, MyEtherWallet, Dharma e Kyber. A Alchemy nos dará acesso a um ponto de extremidade de API na cadeia do Ethereum para que possamos ler e escrever transações. + +Ajudaremos você a se inscrever na Alchemy para escrever o seu primeiro script web3! Não é necessário ter experiência em desenvolvimento de blockchain! + +## 1. Inscreva-se para obter uma conta gratuita da Alchemy {#sign-up-for-a-free-alchemy-account} + +Criar uma conta em Alchemy é fácil, [inscreva-se gratuitamente aqui](https://auth.alchemyapi.io/signup). + +## 2. Criar um app Alchemy {#create-an-alchemy-app} + +Para se comunicar com a chain da Ethereum e usar os produtos da Alchemy, você precisa de uma chave de API para autenticar as suas solicitações. + +Você pode [criar chaves de API a partir do painel de controle](http://dashboard.alchemyapi.io/). Para fazer uma nova chave, navegue até "Create app" como mostrado abaixo: + +Um agradecimento especial ao [_ShapeShift_](https://shapeshift.com/) _por nos permitir mostrar seu painel!_ + +![Painel de controle Alchemy](./alchemy-dashboard.png) + +Preencha os detalhes em "Create app" para obter sua nova chave. Aqui você também pode ver os apps criados anteriormente, bem como os criados pela sua equipe. Pegue chaves existentes clicando em "View Key" para qualquer app. + +![Criar app com um Alchemy screenshot](./create-app.png) + +Você também pode extrair chaves de API existentes, passando o mouse sobre “Aplicativos” e selecionando uma. Você pode “Visualizar chave” aqui, bem como “Editar aplicativo” na lista de permissões de domínios específicos, ver várias ferramentas de desenvolvedor e visualizar análises. + +![Gif mostrando a um usuário como requisitar chaves API](./pull-api-keys.gif) + +## 3. Fazer uma requisição via Command line {#make-a-request-from-the-command-line} + +Interagir com a blockchain Ethereum através de Alchemy, usando JSON-RPC e curl. + +Para solicitações manuais, recomendamos interagir com `JSON-RPC` via solicitações de `POST`. Simplesmente passe no header `Content-Type: application/json` e sua query como corpo do `POST` com os seguintes campos: + +- `jsonrpc`: Atualmente, somente a versão `2.0` do JSON-RPC é suportada. +- `method`: O método ETH API. [Veja a referência da API.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) +- `params`: Uma lista de parâmetros para passar ao método. +- `id`: A ID da sua solicitação. Será retornado pela resposta para que você possa manter o controle sobre qual solicitação uma resposta pertence. + +Aqui está um exemplo que você pode executar a partir da linha de comando, para recuperar o preço atual do gás: + +```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}' +``` + +_**NOTA:** Substitua [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) por sua própria chave de API `https://eth-mainnet.alchemyapi.io/v2/**sua-chave-api`._ + +**Resultados:** + +```json +{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 } +``` + +## 4. Configure seu Cliente Web3 {#set-up-your-web3-client} + +**Se você tem um cliente existente,** mude o URL do seu provedor de nó atual para uma URL de Alchemy com a sua chave API: `“https://eth-mainnet.alchemyapi.io/v2/your-api-key"` + +**_NOTA:_** Os scripts abaixo precisam ser executados em um **contexto de nó** ou **salvo em um arquivo**. Não é executado na linha de comando. Se você ainda não instalou o Node ou o NPM, confira este rápido [guia de configuração para macs](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs). + +Há inúmeras [bibliotecas Web3](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) que você pode integrar com Alchemy. No entanto, nós recomendamos usar [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), um drop-in substituto para web3.js, construída e configurada para trabalhar sem interrupções com Alchemy. Isto fornece múltiplas vantagens, tais como novas tentativas automáticas e um suporte robusto a WebSocket. + +Para instalar AlchemyWeb3.js, **navegue até o diretório do seu projeto** e execute: + +**Com o Yarn:** + +``` +yarn add @alch/alchemy-web3 +``` + +**Com NPM:** + +``` +yarn add @alch/alchemy-web3 +``` + +Para interagir com a infraestrutura dos nós de Alchemy, execute em NodeJS ou adicione isso a um arquivo JavaScript: + +```js +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3( + "https://eth-mainnet.alchemyapi.io/v2/your-api-key" +) +``` + +## 5. Escreva seu primeiro script Web3! {#write-your-first-web3-script} + +Agora vamos colocar a mão na massa com um pouco de programação na Web3. Vamos escrever um script simples que exibe o número de bloco mais recente da Rede principal do Ethereum. + +**1. Se você ainda não fez, no seu terminal, crie um novo diretório e cd do projeto dentro dele:** + +``` +mkdir web3-example +cd web3-example +``` + +**2. Instale a dependência do Alchemy web3 (ou qualquer web3) em seu projeto, se você ainda não tiver:** + +``` +npm install @alch/alchemy-web3 +``` + +**3. Crie um arquivo chamado `index.js` e adicione o seguinte conteúdo:** + +> Por fim, você deve substituir `demo` pela sua chave de API HTTP do Alchemy. + +```js +async function main() { + const { createAlchemyWeb3 } = require("@alch/alchemy-web3") + const web3 = createAlchemyWeb3("https://eth- mainnet.alchemyapi.io/v2/demo") + const blockNumber = await web3.eth.getBlockNumber() + console.log("The latest block number is " + blockNumber) +} +main() +``` + +Não está familiarizado com programação assíncrona? Confira este [post no Medium](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c). + +**4. Executá-lo em seu terminal usando o nó** + +``` +node index.js +``` + +**5. Agora você deve ver a saída do último número de bloco no seu console!** + +``` +O último número de bloco é 11043912 +``` + +**Eba! Parabéns! Você acabou de escrever o seu primeiro script web3 usando Alchemy 🎉** + +Não tem certeza do que fazer a seguir? Experimente implementar seu primeiro contrato inteligente e colocar a mão na massa com um pouco de programação Solidity em nosso [Guia de contratos inteligentes “Olá, mundo”](https://docs.alchemyapi.io/tutorials/hello-world-smart-contract), ou teste seus conhecimentos sobre painel de controle com o [Aplicativo de demonstração do painel](https://docs.alchemyapi.io/tutorials/demo-app)! + +_[Cadastre-se com o Alchemy](https://auth.alchemyapi.io/signup) gratuitamente, confira [a nossa documentação](https://docs.alchemyapi.io/), e para receber as últimas notícias, siga-nos no [Twitter](https://twitter.com/AlchemyPlatform)_. diff --git a/public/content/translations/pt-br/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/pt-br/developers/tutorials/guide-to-smart-contract-security-tools/index.md new file mode 100644 index 00000000000..877be8a219b --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -0,0 +1,105 @@ +--- +title: Um guia para ferramentas de segurança de contratos inteligentes +description: Uma visão geral de três diferentes técnicas de análise de testes e programas +author: "Trailofbits" +lang: pt-br +tags: + - "solidez" + - "smart contracts" + - "segurança" +skill: intermediate +published: 2020-09-07 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis +--- + +We are going to use three distinctive testing and program analysis techniques: + +- **Análise estática com [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Todos os caminhos do programa são aproximados e analisados ao mesmo tempo, por meio de diferentes apresentações de programa (por exemplo, um control-flow-graph) +- **Fuzzing com [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** O código é executado com uma geração pseudo-aleatória de transações. O fuzzer tentará encontrar uma sequência de transações para violar uma determinada propriedade. +- **A execução simbólica com a [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Uma técnica de verificação formal, que traduz cada caminho de execução para uma fórmula matemática, na qual as restrições de cima podem ser verificadas. + +Cada técnica tem vantagens e armadilhas, e será útil em [casos específicos](#determining-security-properties): + +| Técnica | Ferramenta | Uso | Velocidade | Erros perdidos | Alarmes falso | +| ------------------ | ---------- | ------------------------------------ | ---------- | -------------- | ------------- | +| Análise estática | Slither | CLI & scripts | segundos | moderado | baixo | +| Fuzzing | Echidna | Propriedades da Solidity | minutos | baixo | nenhum | +| Execução simbólica | Manticore | Propriedades & scripts & da Solidity | horas | nenhum\* | nenhum | + +\* se todos os caminhos forem explorados sem tempo limite + +**Slither** analisa contratos em poucos segundos, no entanto análise estática pode levar a alarmes falsos e será menos adequada para verificações complexas (e.. verificações aritméticas). Execute o Slither por meio da API para acesso com botão de comando para detectores internos ou por meio da API para verificações definidas pelo usuário. + +O **Echidna** precisa ser executado por vários minutos e só produzirá verdadeiros positivos. O Echidna verifica as propriedades de segurança fornecidas pelo usuário escritas em Solidity. Ele pode perder erros, pois é baseado em exploração aleatória. + +O **Manticore** executa a análise com maior peso. Como o Echidna, o Manticore verifica as propriedades fornecidas pelo usuário. Será necessário mais tempo de execução, mas isso poderá comprovar a validade de uma propriedade e não relatará alarmes falsos. + +## Fluxo de trabalho sugerido {#suggested-workflow} + +Comece com os detectores internos do Slither para garantir que nenhum bug simples esteja presente agora ou seja introduzido mais tarde. Use o Slither para verificar propriedades relacionadas a herança, dependências de variáveis e questões estruturais. À medida que a base de código cresce, use o Echidna para testar propriedades mais complexas da máquina de estado. Revisite o Slither para desenvolver verificações personalizadas de proteções indisponíveis na Solidity, como proteger contra uma função que está sendo substituída. Finalmente, use o Manticore para realizar a verificação direcionada de propriedades de segurança críticas, por exemplo, operações aritméticas. + +- Use a CLI do Slither para capturar problemas comuns +- Use o Echidna para testar as propriedades de segurança de alto nível do seu contrato +- Use o Slither para escrever verificações estáticas personalizadas +- Use o Manticore quando quiser uma garantia aprofundada de propriedades de segurança críticas + +**Uma nota sobre testes de unidade**. Testes de unidade são necessários para construir softwares de alta qualidade. No entanto, estas técnicas não são as mais adequadas para encontrar falhas de segurança. Normalmente, eles são usados para testar comportamentos positivos de código (ou seja, o código funciona conforme o esperado no contexto normal), enquanto as falhas de segurança tendem a residir em casos de risco que os desenvolvedores não consideraram. No nosso estudo sobre dezenas de revisões inteligentes de segurança do contrato, a [cobertura do teste de unidade não teve efeito sobre o número ou gravidade das falhas de segurança](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/) que encontramos no código do nosso cliente. + +## Determinando propriedades de segurança {#determining-security-properties} + +Para testar e verificar efetivamente seu código, você deve identificar as áreas que precisam de atenção. Como seus recursos gastos com a segurança são limitados, é importante otimizar seus esforços para determinar o escopo das partes fracas ou de grande valor da sua base de código. A modelagem de ameaças pode ajudar nisso. Considere revisar: + +- [Avaliação de risco rápida](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (nossa abordagem preferida quando o tempo é curto) +- [Guia de modelagem de ameaças do sistema centralizado de dados](https://csrc.nist.gov/publications/detail/sp/800-154/draft) (também conhecido como NIST 800-154) +- [Modelagem de ameaças Shostack](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.) +- [Uso de asserções](https://blog.regehr.org/archives/1091) + +### Componentes {#components} + +Saber o que você deseja verificar também ajudará a escolher a ferramenta certa. + +As vastas áreas que são frequentemente relevantes para os contratos inteligentes incluem: + +- **Máquina de estado.** A maioria dos contratos pode ser representada como uma máquina de estado. Recomendamos verificar que: (1) nenhum estado inválido pode ser alcançado, (2) se um estado é válido, que ele seja alcançável e (3) nenhum estado bloqueia o contrato. + + - Echidna e Manticore são as ferramentas para testar as especificações da máquina. + +- **Controles de acesso.** Se o seu sistema tiver usuários privilegiados (por exemplo, um proprietário, controladores, …), você deve garantir que (1) cada usuário pode executar apenas as ações autorizadas e (2) nenhum usuário pode bloquear ações de um usuário com mais privilégios. + + - Slither, Echidna e Manticore podem verificar se há controles de acesso corretos. Por exemplo, o Slither pode verificar que apenas as funções da lista de permissões não possuem o modificador onlyOwner. O Echidna e a Manticore são úteis para um controle de acesso mais complexo, como uma autorização dada apenas se o contrato atingir um determinado estado. + +- **Operações aritméticas.** É essencial verificar a solidez das operações aritméticas. Usar o `SafeMath` em todo lugar é um bom passo para evitar overflow/underflow, no entanto, ainda é importante considerar outras falhas aritméticas, incluindo problemas de arredondamento e falhas que atrapalham o contrato. + + - A Manticore é a melhor escolha aqui. O Echidna pode ser utilizado se a aritmética estiver fora do escopo da solução SMT. + +- **Exatidão da herança.** Os contratos do Solidity dependem fortemente de várias heranças. Erros como uma função de sombreamento faltando uma chamada `super` e uma ordem de linearização c3 interpretada erradamente podem ser facilmente introduzidos. + + - O Slither é a ferramenta que garante a detecção desses problemas. + +- **Interações externas.** Os contratos interagem entre si, e não se deve confiar em alguns contratos externos. Por exemplo, se o seu contrato depende de oráculos externos, ele permanecerá seguro se metade dos oráculos disponíveis estiverem comprometidos? + + - A Manticore e o Echidna são a melhor escolha para testar as interações externas com seus contratos. A Manticore possui um mecanismo integrado para o stub de contratos externos. + +- **Conformidade padrão.** As normas do Ethereum (por exemplo, ERC20) têm um histórico de falhas em seu design. Esteja ciente das limitações da norma no qual você está construindo. + - Slither, Echidna e Manticore vão ajudar você a detectar desvios de uma determinada norma. + +### Folha de dicas de ferramentas {#tool-selection-cheatsheet} + +| Componentes | Ferramentas | Exemplos | +| --------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Máquina de estado | Echidna, Manticore | | +| Controle de acesso | Slither, Echidna, Manticore | [Slither exercise 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/slither/exercise2.md), [Echidna exercício 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/Exercise-2.md) | +| Operações aritméticas | Manticore, Echidna | [Echidna exercício 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/Exercise-1.md), [Manticore exercícios 1 a 3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | +| Exatidão da herança | Slither | [Slither exercício 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/slither/exercise1.md) | +| Interações externas | Manticore, Echidna | | +| Conformidade padrão | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | + +Outras áreas terão de ser verificadas dependendo dos seus objetivos, mas essas áreas gerais são um bom começo para qualquer sistema de contrato inteligente. + +Nossas auditorias públicas contêm exemplos de propriedades verificadas ou testadas. Considere a leitura das seções `Teste Automatizado e Verificação` dos seguintes relatórios para revisar as propriedades de segurança em situações reais: + +- [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) +- [Balanceador](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) diff --git a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md new file mode 100644 index 00000000000..83b560c08ac --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -0,0 +1,1540 @@ +--- +title: Contrato inteligente "Hello World" para iniciantes - Fullstack +description: Tutorial introdutório sobre como escrever e implementar um contrato inteligente simples no Ethereum. +author: "nstrike2" +tags: + - "solidity" + - "hardhat" + - "alchemy" + - "contratos inteligentes" + - "implementação" + - "blockexplorer" + - "front-end" + - "transações" +skill: beginner +lang: pt-br +published: 2021-10-25 +--- + +Este guia é para você que é iniciante em desenvolvimento de blockchain e não sabe por onde começar ou como implantar e interagir com contratos inteligentes. Nós iremos passar por criação e implantação de um contrato inteligente simples na rede de teste Goerli, usando [MetaMask](https://metamask.io), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org), e [Alchemy](https://alchemyapi.io/eth). + +Você irá precisar de uma conta Alchemy para completar este tutorial. [Registre-se para uma conta grátis](https://www.alchemy.com/). + +E claro, se você tiver alguma dúvida em qualquer momento, não hesite em entrar no [Discord da Alchemy](https://discord.gg/gWuC7zB)! + +## Parte 1 - Criando e Implantando seu Contrato Inteligente usando Hardhat {#part-1} + +### Conectar-se à rede Ethereum {#connect-to-the-ethereum-network} + +Existem muitas maneiras de fazer solicitações à cadeia de Ethereum. Para simplificar, usaremos uma conta gratuita na Alchemy, uma plataforma de desenvolvedores de blockchain e API que nos permite comunicar com a cadeia Ethereum sem termos que executar nosso próprio nó. A Alchemy também possui ferramentas de desenvolvedor para monitoração e análise. Neste tutorial, vamos aproveitá-las para entender o que está acontecendo nos bastidores da implantação do nosso contrato inteligente. + +### Crie o seu app e sua chave API {#create-your-app-and-api-key} + +Assim que criar uma conta na Alchemy, você poderá gerar uma chave API criando um app. Isso nos permitirá fazer solicitações na rede de teste Goerli. Se você não estiver familiarizado com redes de teste, você pode [ler o guia da Alchemy para escolher uma rede](https://docs.alchemyapi.io/guides/choosing-a-network). + +No painel da Alchemy, encontre o item **Apps** no menu suspenso na barra de navegação e selecione **Criar aplicativo**. + +![Criar um aplicativo Hello World](./hello-world-create-app.png) + +Dê ao seu app o nome “_Olá, Mundo_” e escreva uma breve descrição. Selecione **Staging** como o seu ambiente, e **Goerli** como a sua rede. + +![criar uma visualização do app hello world](./create-app-view-hello-world.png) + +_Observação: certifique-se de selecionar **Goerli**, ou este tutorial não funcionará._ + +Clique em **Criar app**. Seu app aparecerá na tabela abaixo. + +### Cria uma conta Ethereum {#create-an-ethereum-account} + +Você precisa de uma conta Ethereum para enviar e receber transações. Nós usaremos MetaMask, a carteira virtual no navegador que permite usuários gerenciarem o endereço da sua conta Ethereum. + +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). + +### Etapa 4: Adicionar ether de um faucet {#step-4-add-ether-from-a-faucet} + +Para implantar nosso contrato inteligente na rede de teste, precisaremos de alguns ETHs falsos. Para conseguir ETH da rede Goerli, vá para o Goerli faucet e entre o endereço da sua conta Goerli. Note that Goerli faucets can be a bit unreliable recently - see the [test networks page](/developers/docs/networks/#goerli) for a list of options to try: + +_Nota: devido a tráfego de rede, isto pode demorar um pouco._ + +### Etapa 5: Verificar seu saldo {#step-5-check-your-balance} + +Para garantir que o ETH está na sua carteira, vamos fazer uma chamada [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando a [ferramenta de composição da 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). Ele mostrará a quantidade de ETH em nossa carteira. Para saber mais, confira o [Breve tutorial da Alchemy sobre como usar a ferramenta de composição](https://youtu.be/r6sjRxBZJuU). + +Insira o endereço da sua conta MetaMask e clique em **Send Request**. Você verá a resposta que se parece com o pedação de código abaixo. + +```json +{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } +``` + +> _Nota: Este resultado é em wei, não ETH. Lembre-se de que "Wei" é a menor unidade de ether._ + +Ufa! O nosso dinheiro falso está todo lá. + +### Etapa 6: Dar início a nosso projeto {#step-6-initialize-our-project} + +Primeiro, precisamos criar uma pasta para o nosso projeto. Navegue para a sua linha de comando e entre o seguinte. + +``` +mkdir hello-world +cd hello-world +``` + +Agora que estamos dentro da pasta do nosso projeto, vamos usar o comando `npm init `para inicializar o projeto. + +> Se você não tem npm instalado ainda, siga [essas instruções para instalar o Node.js e o npm](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm). + +Para finalidade deste tutorial, não importa como você responde às questões de inicialização. Aqui está como nós fizemos para referência: + +``` +package name: (hello-world) +version: (1.0.0) +description: hello world smart contract +entry point: (index.js) +test command: +git repository: +keywords: +author: +license: (ISC) + +About to write to /Users/.../.../.../hello-world/package.json: + +{ + "name": "hello-world", + "version": "1.0.0", + "description": "hello world smart contract", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +Aprove o package.json e estaremos prontos para começar! + +### Passo 7: Baixar Hardhat {#step-7-download-hardhat} + +Hardhat é um ambiente de desenvolvimento para compilar, implementar, testar e depurar seu software de Ethereum. Ele ajuda os desenvolvedores na criação de contratos inteligentes e dapps localmente antes de implantar na cadeia real. + +Dentro de nosso projeto `hello-world` execute: + +``` +npm install --save-dev hardhat +``` + +Para mais detalhes, confira esta página sobre as [instruções de instalação](https://hardhat.org/getting-started/#overview). + +### Etapa 8: Criar o projeto Hardhat {#step-8-create-hardhat-project} + +Dentro da pasta do nosso projeto `hello-world`, rode: + +``` +npx hardhat +``` + +Você deve então ver uma mensagem de boas-vindas e a opção de selecionar o que quer fazer. Selecione "criar uma hardhat.config.js vazia": + +``` +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 +``` + +Isto irá gerar um arquivo `hardhat.config.js` no projeto. Usaremos isso mais tarde neste tutorial para especificar a configuração do nosso projeto. + +### Etapa 9: Adicionar as pastas do projeto {#step-9-add-project-folders} + +Para manter a organização do nosso projeto, vamos criar duas novas pastas. No comando de linha, navegue para o diretório raiz do nosso projeto `hello-world` e digite: + +``` +mkdir contracts +mkdir scripts +``` + +- `contracts/` é onde nós vamos manter o arquivo de código do contrato inteligente "hello world" +- `scripts/` é onde nós vamos manter scripts para implantar e interagir com nosso contrato + +### Etapa 10: Escrever nosso contrato {#step-10-write-our-contract} + +Você pode estar se perguntando, quando é que nós vamos escrever código? Está na hora! + +Abra o projeto hello-world no seu editor favorito. Contratos inteligentes são mais comumente escritos em Solidity, o que nós usaremos para escrever o nosso contrato inteligente. + +1. Navegue para a pasta `contracts` e crie um novo arquivo chamado `HelloWorld.sol` +2. Veja abaixo uma amostra de contrato inteligente “Hello World”, que usaremos neste tutorial. Copie o conteúdo abaixo no arquivo `HelloWorld.sol`. + +_Nota: Certifique-se de ler os comentários para entender o que o contrato faz._ + +``` +// Especifica a versão do Solidity usando a versão semântica. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity >=0.7.3; + +// Defines a contract named `HelloWorld`. +// Um contrato é uma coleção de funções e dados (seu estado). Uma vez implantado, um contrato reside em um endereço específico na blockchain Ethereum. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Emitted when update function is called + //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. + event UpdatedMessages(string oldStr, string newStr); + + // Declares a state variable `message` of type `string`. + // Variáveis de estado são variáveis cujos valores são permanentemente armazenados no armazenamento do contrato. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + string public message; + + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Os construtores são usados para inicializar os dados do contrato. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + message = initMessage; + } + + // A public function that accepts a string argument and updates the `message` storage variable. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Este é um contrato inteligente básico que armazena uma mensagem quando da sua criação. Ele pode ser atualizado chamando-se a função `update`. + +### Etapa 11: Vincular as contas MetaMask e Alchemy a seu projeto {#step-11-connect-metamask-alchemy-to-your-project} + +Nós já criamos uma carteira Metamask, uma conta Alchemy e já escrevemos nosso contrato inteligente. Agora é hora de vincularmos os três. + +Toda transação enviada da sua carteira requer uma assinatura, usando sua chave privada única. Para fornecer esta permissão ao nosso programa, podemos armazenar seguramente nossa chave privada em um arquivo de ambiente. Nós armazenaremos também uma chave de API da Alchemy aqui. + +> Para saber mais sobre o envio de transações, confira [este tutorial](https://docs.alchemyapi.io/alchemy/tutorials/sending-transactions-using-web3-and-alchemy) sobre o envio de transações usando web3. + +Primeiro, instale o pacote dotenv na pasta do seu projeto: + +``` +npm install dotenv --save +``` + +Então, crie um arquivo `.env` no diretório raiz do projeto. Adicione sua chave privada MetaMask e URL da API HTTP Alchemy a ele. + +Seu arquivo de ambiente deve ser nomeado `.env` or ele não será reconhecido como arquivo de ambiente. + +Não o nomeie como `process.env` ou `.env-custom` ou qualquer outra coisa. + +- Siga [estas instruções](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) para exportar sua chave privada +- Veja abaixo como obter o URL da API HTTP Alchemy + +![](./get-alchemy-api-key.gif) + +Seu arquivo `.env` ficará assim: + +``` +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PRIVATE_KEY = "your-metamask-private-key" +``` + +Para realmente vinculá-los a nosso código, vamos fazer referência a essas variáveis em nosso arquivo `hardhat.config.js` no passo 13. + +### Etapa 12: Instalar o Ethers.js {#step-12-install-ethersjs} + +Ethers.js é uma biblioteca que facilita a interação e o envio de solicitações ao Ethereum ao incorporar [métodos padrões JSON-RPC](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc) a outros métodos mais amigáveis ao usuário. + +O Hardhat nos permite integrar [plugins](https://hardhat.org/plugins/) para ferramentas adicionais e funcionalidade estendida. Aproveitaremos o [plugin Ethers](https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html) para implantar o contrato. + +No diretório do projeto, digite: + +```bash +npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" +``` + +### Etapa 13: Atualizar hardhat.config.js {#step-13-update-hardhat.configjs} + +Até aqui, já adicionamos diversas dependências e plugins. Agora precisamos atualizar o `hardhat.config.js` para que nosso projeto reconheça todos eles. + +Atualize seu `hardhat.config.js` para ficar assim: + +```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}`], + }, + }, +} +``` + +### Etapa 14: Compilar nosso contrato {#step-14-compile-our-contract} + +Para ter certeza de que tudo está funcionando, vamos compilar nosso contrato. A tarefa `compile` é uma das tarefas integradas do Hardhat. + +Na linha de comando, execute: + +```bash +npx hardhat compile +``` + +Você pode receber o aviso `SPDX license identifier not provided in source file`, mas não há necessidade de se preocupar com isso. Esperemos que tudo mais esteja bem! Se não, você sempre pode enviar uma mensagem no [discord Alchemy](https://discord.gg/u72VCg3). + +### Etapa 15: Escrever nosso script de implantação {#step-15-write-our-deploy-script} + +Agora que nosso contrato está escrito e nosso arquivo de configuração está pronto, é hora de escrever o script de implantação do contrato. + +Navegue até a pasta `scripts/` e crie um novo arquivo chamado `deploy.js`, adicionando o seguinte conteúdo: + +```javascript +async function main() { + const HelloWorld = await ethers.getContractFactory("HelloWorld") + + // Start deployment, returning a promise that resolves to a contract object + const hello_world = await HelloWorld.deploy("Hello World!") + console.log("Contract deployed to address:", hello_world.address) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) +``` + +A Hardhat fez um trabalho incrível ao explicar o que cada uma dessas linhas de código faz em seu [Tutorial sobre contratos](https://hardhat.org/tutorial/testing-contracts.html#writing-tests). Adotamos aqui as explicações deles. + +```javascript +const HelloWorld = await ethers.getContractFactory("HelloWorld") +``` + +Uma `ContractFactory` em ethers.js é uma abstração usada para implantar novos contratos inteligentes, então, aqui, `HelloWorld` representa uma [fábrica](https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)) para instâncias do nosso contrato Hello World. Quando usar o plugin `hardhat-ethers` `ContractFactory` e `Contract`, as instâncias estão conectadas ao primeiro assinante (proprietário) por padrão. + +```javascript +const hello_world = await HelloWorld.deploy() +``` + +Chamar `deploy()` em uma `ContractFactory`, irá iniciar a implantação, e retornará uma `Promise` que se resolve em um objeto `Contract`. Este é o objeto que tem um método para cada uma de nossas funções de contrato inteligente. + +### Etapa 16: Implantar nosso contrato {#step-16-deploy-our-contract} + +Finalmente estamos prontos para implantar o nosso contrato inteligente! Navegue até a linha de comando e digite: + +```bash +npx hardhat run scripts/deploy.js --network goerli +``` + +Você deverá ver algo assim: + +```bash +Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 +``` + +**Por favor, grave este endereço**. Nós o usaremos mais tarde neste tutorial. + +Se formos ao [etherscan da Goerli](https://goerli.etherscan.io) e procurarmos nosso endereço de contrato, devemos ser capazes de ver que ele foi implantado com sucesso. A transação ficará parecida com isto: + +![](./etherscan-contract.png) + +O endereço `From` deve combinar com o endereço da sua conta MetaMask, e o endereço `To` conterá **Contract Creation**. Se clicarmos na transação, veremos o nosso endereço de contrato no campo `To`. + +![](./etherscan-transaction.png) + +Parabéns! Você acaba de implantar um contrato inteligente em uma rede de teste Ethereum. + +Para entender o que está acontecendo nos bastidores, vamos navegar até a guia Explorer no [painel do Alchemy](https://dashboard.alchemyapi.io/explorer). Se você tem vários aplicativos Alchemy, certifique-se de filtrar por app e selecionar **Hello World**. + +![](./hello-world-explorer.png) + +Aqui você verá um punhado de métodos JSON-RPC que Hardhat/Ethers fizeram em segundo plano para nós quando chamamos a função `.deploy() `. Dois importantes métodos aqui são [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), que é a requisição para escrever nosso contrato na cadeia Goerli, e [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash) que é uma requisição para ler informações sobre nossa transação, dado o hash. Para saber mais sobre o envio de transações, confira [este tutorial sobre o envio de transações usando web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). + +## Parte 2: Interaja com o seu Contrato Inteligente {#part-2-interact-with-your-smart-contract} + +Agora que você implantou com sucesso um contrato inteligente na rede Goerli, vamos aprender como interagir com ele. + +### Crie um arquivo interact.js {#create-a-interactjs-file} + +Este é o arquivo onde nós iremos escrever nosso script de interação. Nós usaremos a biblioteca Ether.js que você instalou anteriormente na Parte1. + +Dentro da pasta `scripts/` crie um novo arquivo chamado `interact.js`, adicionando o seguinte código: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS +``` + +### Atualize seu arquivo .env {#update-your-env-file} + +Nós usaremos novas variáveis de ambiente, portanto nós precisamos defini-las no arquivo `.env` que [ nós criamos antes](#step-11-connect-metamask-&-alchemy-to-your-project). + +Nós precisaremos adicionar uma definição para a nossa `API_KEY` Alchemy e o `CONTRACT_ADDRESS` onde o nosso contrato inteligente foi implantado. + +Seu arquivo `.env` deverá se parecer com isto: + +```bash +# .env + +API_URL = "https://eth-goerli.alchemyapi.io/v2/" +API_KEY = "" +PRIVATE_KEY = "" +CONTRACT_ADDRESS = "0x" +``` + +### Pegue a ABI do seu contrato {#grab-your-contract-ABI} + +O [ABI (Interface binária da aplicação)](/glossary/#abi) do nosso contrato é a interface para interagir com o nosso contrato inteligente. O Hardhat automaticamente gera uma ABI e a salva no arquivo `HelloWorld.json`. Para usar a ABI, precisaremos analisar o conteúdo adicionando as seguintes linhas de código ao nosso arquivo `interact.js`: + +```javascript +// interact.js +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") +``` + +Se quiser ver a ABI, pode imprimi-la no console: + +```javascript +console.log(JSON.stringify(contract.abi)) +``` + +Para ver o seu ABI impresso no console, navegue até seu terminal e execute: + +```bash +npx hardhat run scripts/interact.js +``` + +### Criar uma instância do seu contrato {#create-an-instance-of-your-contract} + +Para interagir com o nosso contrato, precisamos criar uma instância dele em nosso código. Para fazer isso com Ether.js, nós precisaremos trabalhar com três conceitos: + +1. Provedor — um nó fornecedor que lhe dá acesso de leitura e escrita ao blockchain +2. Signatário — representa uma conta Ethereum que pode assinar transações +3. Contrato — um objeto Ether.js representando um contrato específico implantado on-chain + +Usaremos a ABI do contrato da etapa anterior para criar nossa instância do contrato: + +```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 +) +``` + +Aprenda mais sobre Provedores, Signatários e Contratos na [documentação ethers.js](https://docs.ethers.io/v5/). + +### Leia a mensagem init {#read-the-init-message} + +Lembra-se de quando implantamos nosso contrato com o `initMessage = "Hello world!"`? Nós vamos agora ler a mensagem armazenada no nosso contrato inteligente e imprimi-la no console. + +Em JavaScript, funções assíncronas são usadas quando interagindo com redes. Para aprender mais sobre funções assíncronas, [leia este artigo](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff). + +Use o código abaixo para chamar a função `message` no nosso contrato inteligente e ler a mensagem init: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) +} +main() +``` + +Depois de rodar o arquivo usando `npx hardhat run scripts/interact.js` no terminal, nós devemos ver esta resposta: + +``` +The message is: Hello world! +``` + +Parabéns! Você acabou de ler com sucesso dados de contrato inteligente do blockchain Ethereum, continue assim! + +### Atualize a mensagem {#update-the-message} + +Ao invés de só ler a mensagem, nós podemos também atualizar a mensagem salva no nosso contrato inteligente usando a função `update`! Muito bacana, não? + +Para atualizar a mensagem, nós podemos chamar diretamente a função `update` no nosso objeto Contract instanciado: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("This is the new message.") + await tx.wait() +} +main() +``` + +Note que na linha 11, nós fazemos uma chamada para `.wait()` no objeto da transação retornada. Isso garante que nosso script espere pela transação ser minerada no blockchain antes de sair da função. Se a chamada `.wait()` não estiver incluída, o script pode não ver o valor da `message` atualizada no contrato. + +### Leia a nova mensagem {#read-the-new-message} + +Você deve ser capaz de repetir o [passo anterior](#read-the-init-message) para ler o valor atualizado da `message`. Pegue um momento e veja se você pode fazer as mudanças necessárias para imprimir o novo valor! + +Se você precisar de uma dica, aqui está o que o seu arquivo `interact.js` deve se parecer neste ponto: + +```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 - you +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// contract instance +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("this is the new message") + await tx.wait() + + const newMessage = await helloWorldContract.message() + console.log("The new message is: " + newMessage) +} + +main() +``` + +Agora apenas rode o script e você deve ser capaz de ver a mensagem antiga, o estado atualizado, e a nova mensagem impressa no seu terminal! + +`npx hardhat run scripts/interact.js --network goerli` + +``` +The message is: Hello World! +Updating the message... +The new message is: This is the new message. +``` + +Enquanto estiver rodando este script, você pode perceber que o passo `Updating the message...` leva um tempo para carregar antes da nova mensagem carregar. Isto é por causa do processo de mineração; se você é curioso sobre rastrear transações enquanto elas estão sendo mineradas, visite o [Alchemy mempool](https://dashboard.alchemyapi.io/mempool) para ver o estado da transação. Se a transação for derrubada, também é útil checar o [Goerli Etherscan](https://goerli.etherscan.io) e procurar pelo hash da sua transação. + +## Parte 3: Publique seu Contrato Inteligente no Etherscan {#part-3-publish-your-smart-contract-to-etherscan} + +Você fez todo o trabalho duro dar vida ao seu contrato inteligente; agora é hora de compartilhá-lo com o mundo! + +Verificando seu contrato inteligente no Etherscan, qualquer um pode ver seu código-fonte e interagir com o seu contrato inteligente. Vamos começar! + +### Passo 1: Gere a Chave API na sua conta Etherscan {#step-1-generate-an-api-key-on-your-etherscan-account} + +Uma Chave API Etherscan é necessária para verificar que você possui o contrato inteligente que você está tentando publicar. + +Se você não tem uma conta Etherscan ainda, [se inscreva para uma conta](https://etherscan.io/register). + +Uma vez conectado, encontre seu nome de usuário na barra de navegação, passe o mouse em cima dele, e selecione o botão **My profile**. + +Na página do seu perfil, você deve ver uma barra de navegação lateral. Da barra de navegação lateral, selecione **API Keys**. Em seguida, pressione o botão "Add" para criar uma nova chave API, nomeie seu app **hello-world**e pressione o botão **Create New API Key**. + +Sua nova chave API deve aparecer na tabela de chaves API. Copie a chave API na sua área de transferência. + +Agora nós precisamos adicionar a chave API Etherscan no seu arquivo `.env`. + +Depois de adicionar isso, seu arquivo `.env` deve se parecer com isso: + +```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" +``` + +### Contratos inteligentes implantados pelo Hardhat {#hardhat-deployed-smart-contracts} + +#### Instale o hardhat-etherscan {#install-hardhat-etherscan} + +Publicar o seu contrato no Etherscan usando Hardhat é uma tarefa direta. Você primeiro precisa instalar o plugin `hardhat-etherscan` para começar. `hardhat-etherscan` verificará automaticamente o código-fonte do contrato inteligente e da ABI no Etherscan. Para adicionar isso, no diretório `hello-world` rode: + +```text +npm install --save-dev @nomiclabs/hardhat-etherscan +``` + +Uma vez instalado, inclua o seguinte comando no topo do seu `hardhat.config.js`, e adicione as opções de configuração Etherscan: + +```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: { + // Your API key for Etherscan + // Obtain one at https://etherscan.io/ + apiKey: ETHERSCAN_API_KEY, + }, +} +``` + +#### Verifique seu contrato inteligente no Etherscan {#verify-your-smart-contract-on-etherscan} + +Certifique-se que todos os arquivos foram salvos e todas as variáveis `.env` estão corretamente configuradas. + +Rode a tarefa `verify`, passando o endereço do contrato, e a rede onde ele foi implantado: + +```text +npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!' +``` + +Certifique-se que `DEPLOYED_CONTRACT_ADDRESS` é o endereço do seu contrato inteligente implantado na rede de teste Goerli. Além disso, o argumento final (`'Hello World!'`) tem de ser o mesmo valor de string usado [durante o passo de implantação na parte 1](#write-our-deploy-script). + +Se tudo der certo, você verá a seguinte mensagem no seu terminal: + +```text +Successfully submitted source code for contract +contracts/HelloWorld.sol:HelloWorld at 0xdeployed-contract-address +for verification on Etherscan. Waiting for verification result... + + +Successfully verified contract HelloWorld on Etherscan. +https://goerli.etherscan.io/address/#contracts +``` + +Parabéns! O código do seu contrato inteligente está no Etherscan! + +### Cheque seu contrato inteligente no Etherscan! {#check-out-your-smart-contract-on-etherscan} + +Quando você navegar para o link fornecido no seu terminal, você deve ser capaz de ver o código do seu contrato inteligente e ABI publicados no Etherscan! + +**Parabéns, você conseguiu, campeão! Agora qualquer um pode chamar ou escrever no seu contrato inteligente! Nós mal conseguimos esperar o que você vai construir em seguida!** + +## Parte 4 - Integrando seu contrato inteligente com o front-end {#part-4-integrating-your-smart-contract-with-the-frontend} + +No fim deste tutorial você saberá como: + +- Conectar uma carteira MetaMask no seu dapp +- Ler dados do seu contrato inteligente usando a API [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) +- Assinar transações Ethereum usando MetaMask + +Para este dapp, estaremos usando [React](https://reactjs.org/) como nosso framework de front-end; entretanto, é importante notar que nós não gastaremos muito tempo explicando seus fundamentos, já que estaremos principalmente focados em trazer funcionalidade Web3 para o nosso projeto. + +Como um pré-requisito, você deve ter um nível iniciante de entendimento de React. Caso contrário, recomendamos concluir o tutorial oficial [Introdução ao React](https://reactjs.org/tutorial/tutorial.html). + +### Clonar os arquivos iniciais {#clone-the-starter-files} + +Primeiro, vá até o [repositório GitHub hello-world-part-four](https://github.com/alchemyplatform/hello-world-part-four-tutorial) para obter os arquivos iniciais para esse projeto e clone o repositório no seu computador local. + +Abra o repositório clonado localmente. Note que ele contém duas pastas: `starter-files` e `completed`. + +- `starter-files`- **nós trabalharemos neste diretório**, nós conectaremos a UI à nossa carteira Ethereum e o contrato inteligente que nós publicamos no Etherscan na [Parte 3](#part-3). +- `completed` contém o tutorial inteiro completado e deve ser somente usado como referência se você estiver empacado. + +Em seguida, abra sua cópia de `starter-files` no seu editor de código favorito, e então navegue na pasta `src`. + +Todo o código que vamos escrever será exibido na pasta `src`. Nós estaremos editando o componente `HelloWorld.js` e os arquivos JavaScript `util/interact.js` para dar ao seu projeto funcionalidade Web3. + +### Cheque os arquivos iniciais {#check-out-the-starter-files} + +Antes de começar a codificar, vamos explorar o que nos é fornecido nos arquivos iniciais. + +#### Tenha seu projeto React em execução {#get-your-react-project-running} + +Vamos começar executando o projeto React em nosso navegador. A beleza do React é que uma vez que nosso projeto esteja sendo executado no nosso navegador, qualquer alteração que salvarmos será atualizada ao vivo em nosso navegador. + +Para fazer com que o projeto funcione, navegue até o diretório raiz da pasta `starter-files`, e execute`npm install` no seu terminal para instalar as dependências do projeto: + +```bash +cd starter-files +npm install +``` + +Uma vez terminada a instalação, execute `npm start` em seu terminal: + +```bash +npm start +``` + +Ao fazê-lo, deve abrir [http://localhost:3000/](http://localhost:3000/) no seu navegador, onde você verá o front-end do nosso projeto. Ele deve consistir em um campo \ (um lugar para atualizar a mensagem armazenada no seu contrato inteligente\), um botão “Conectar Carteira”, e um botão “Atualizar”. + +Se você tentar clicar em qualquer dos botões você notará que eles não funcionam — isso porque ainda precisamos programar a funcionalidade deles. + +#### O componente `HelloWorld.js` {#the-helloworld-js-component} + +Vamos voltar à pasta `src` no nosso editor e abrir o arquivo `HelloWorld.js`. É muito importante que entendamos tudo neste arquivo, pois é o principal componente do React no qual vamos trabalhar. + +No começo deste arquivo você irá notar que nós temos diversas declarações importantes que são necessárias para termos nosso projeto rodando, incluindo a biblioteca React, os hooks useEffect e UseState, alguns itens do `./util/interact.js` (nós os descreveremos em mais detalhes em breve!), e o logo Alchemy. + +```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" +``` + +Em seguida, temos nossas variáveis de estado que serão atualizadas após eventos específicos. + +```javascript +// HelloWorld.js + +//State variables +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [message, setMessage] = useState("No connection to the network.") +const [newMessage, setNewMessage] = useState("") +``` + +Veja aqui o que cada uma das variáveis representa: + +- `walletAddress` - uma string que armazena o endereço da carteira do usuário +- `status` uma string que armazena uma mensagem útil que guia o usuário em como interagir com o dapp +- `message` - uma string que armazena a mensagem atual no contrato inteligente +- `newMessage` -uma string que armazena a nova mensagem que será escrita no contrato inteligente + +Depois das variáveis de estado, você verá cinco funções não implementadas: `useEffect` ,`addSmartContractListener`, `addWalletListener` , `connectWalletPressed`, e `onUpdatePressed`. Nós explicaremos o que elas fazem abaixo: + +```javascript +// HelloWorld.js + +//called only once +useEffect(async () => { + //TODO: implement +}, []) + +function addSmartContractListener() { + //TODO: implement +} + +function addWalletListener() { + //TODO: implement +} + +const connectWalletPressed = async () => { + //TODO: implement +} + +const onUpdatePressed = async () => { + //TODO: implement +} +``` + +- [`useEffect`](https://reactjs.org/docs/hooks-effect.html)- isto é um hook React hook que é chamado depois que o seu componente é renderizado. Por ele ter um array vazio `[]` prop passada por ele \(veja linha 4\), ele só será chamado na _primeira_ renderização do componente. Aqui nós vamos carregar a mensagem atual armazenada no nosso contrato inteligente, chamar nosso contrato inteligente e listeners da carteira, e atualizar nos UI para refletir se a carteira já está conectada. +- `addSmartContractListener`- esta função configura um listener que irá aguardar o evento `UpdatedMessages` do nosso contrato HelloWorld e atualizar nossa UI quando a mensagem é alterada em nosso contrato inteligente. +- `addWalletListener`- esta função configura um listener que detecta mudanças no estado da carteira MetaMask do usuário, como quando o usuário desconecta sua carteira ou muda endereços. +- `connectWalletPressed`- esta função será chamada para conectar a carteira MetaMask do usuário no nosso dapp. +- `onUpdatePressed` - essa função será chamada quando o usuário quiser atualizar a mensagem armazenada no contrato inteligente. + +Perto do final desse arquivo, temos a interface de usuário do nosso componente. + +```javascript +// HelloWorld.js + +//the UI of our component +return ( +
      + + + +

      Current Message:

      +

      {message}

      + +

      New Message:

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

      {status}

      + + +
      +
      +) +``` + +Se você procurar com cuidado no código, você notará quando nós usamos nossas várias variáveis de estado na nossa UI: + +- Nas linhas 6 a 12, se a carteira do usuário estiver conectada \(ou seja. `walletAddress.length > 0`\), mostraremos uma versão truncada da `walletAddress` do usuário no botão com a ID "walletButton;", caso contrário, ele simplesmente dirá "Connect Wallet." +- Na linha 17, nós mostramos a mensagem atual armazenada no contrato inteligente, que é capturada na string `message`. +- Nas linhas 23-26, nós usamos um [componente controlado](https://reactjs.org/docs/forms.html#controlled-components) para atualizar nossa variável de estado `newMessage` quando a entrada no campo texto muda. + +Em adição às nossas variáveis de estado, você também verá que as funções `connectWalletPressed` e `onUpdatePressed` são chamadas quando os botões com IDs `publishButton` e `walletButton` são respectivamente clicados. + +Finalmente, vamos endereçar onde esse componente `HelloWorld.js` será adicionado. + +Se você for ao arquivo `App.js`, que é o componente principal do React, que atua como um contêiner para todos os outros componentes, você verá que o nosso componente `HelloWorld.js` é injetado na linha 7. + +Finalmente, mas não menos importante, vamos checar mais um arquivo fornecido para você, o arquivo `interact.js`. + +#### O arquivo `interact.js` {#the-interact-js-file} + +Como queremos respeitar o paradigma [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), queremos um arquivo separado que contém todas as nossas funções para gerenciar a lógica, dados e regras do nosso dapp, para então conseguirmos exportar essas funções para o nosso front-end \(nosso componente `HelloWorld.js` component\). + +👆🏽Esta é a exata finalidade do nosso arquivo `interact.js`! + +Navegue para a pasta `util` no seu diretório `src`, e você notará que nós incluimos um arquivo chamado `interact.js` que irá conter todas as nossas interações com o contrato inteligente, funções de carteira, e variáveis. + +```javascript +// interact.js + +//export const helloWorldContract; + +export const loadCurrentMessage = async () => {} + +export const connectWallet = async () => {} + +const getCurrentWalletConnected = async () => {} + +export const updateMessage = async (message) => {} +``` + +Você pode notar no topo do arquivo que nós transformamos o objeto `helloWorldContract` em um comentário. Mais tarde neste tutorial nós vamos descomentar este objeto e instanciar nosso contrato inteligente nesta variável, que irá então exportar no nosso componente `HelloWorld.js`. + +As quatro funções não implementadas depois do nosso objeto `helloWorldContract` fazem o seguinte: + +- `loadCurrentMessage`: esta função manipula a lógica de carregamento da mensagem atual armazenada no contrato inteligente. Ela fará uma chamada _read_ para o contrato inteligente Olá, Mundo usando a [API Web3 da Alchemy](https://github.com/alchemyplatform/alchemy-web3). +- `connectWallet`: essa função conectará a MetaMask do usuário ao nosso dapp. +- `getCurrentWalletConnected` - essa função irá checar se uma conta Ethereum já está conectada no nosso dapp no carregamento da página e atualização da nossa UI devidamente. +- `updateMessage` - esta função atualizará a mensagem armazenada no contrato inteligente. Ela fará uma chamada _write_ para o contrato inteligente Hello World, para que a carteira do usuário MetaMask tenha que assinar uma transação Ethereum para atualizar a mensagem. + +Agora que você entende no que estamos trabalhando, vamos entender como ler do nosso contrato inteligente! + +### Passo 3: Leia do seu Contrato Inteligente {#step-3-read-from-your-smart-contract} + +Para ler do seu contrato inteligente, você irá precisar configurar com sucesso: + +- Uma conexão API com a cadeia Ethereum +- Uma instância carregada para o seu contrato inteligente +- Uma função para chamar para a sua função de contrato inteligente +- Um ouvinte para observar as atualizações quando os dados de contrato inteligente que você está lendo mudem + +Isto pode parecer que são muitos passos, mas não se preocupe! Nós vamos acompanhá-lo como fazer cada um deles passo a passo! :\) + +#### Estabeleça uma conexão API com a cadeia Ethereum {#establish-an-api-connection-to-the-ethereum-chain} + +Você se lembra como na Parte 2 deste tutorial usamos a nossa chave [Alchemy Web3 para ler do nosso contrato inteligente](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)? Você também irá precisar de uma chave Alchemy Web3 em seu dapp para ler da cadeia. + +Se você ainda não tem, primeiro instale [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) navegando até o diretório raiz do seu `starter-files` e executando o seguinte em seu terminal: + +```text +yarn add @alch/alchemy-web3 +``` + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) é um invólucro em torno do [Web3.js](https://docs.web3js.org/), fornecendo métodos aprimorados da API e outros benefícios cruciais para tornar a sua vida de desenvolvedor da Web3 mais fácil. Ele foi projetado para exigir uma configuração mínima, para que você possa começar a usá-la no seu aplicativo imediatamente! + +Então, instale o pacote [dotenv](https://www.npmjs.com/package/dotenv) no seu diretório do projeto, para termos um lugar seguro para armazenar nossa chave API depois de pegarmos ela. + +```text +npm install dotenv --save +``` + +Para o nosso dapp, **nós usaremos nossa chave API Websockets** ao invés de nossa chave API HTTP, já que nos garante configurar um listener que detecta quando a mensagem, armazenada no contrato inteligente, muda. + +Uma vez que você tem a chave API, crie um arquivo `.env` no seu diretório raiz e adicione sua url Alchemy Websockets a ele. Depois disso, seu arquivo `.env` deve se parecer com isso: + +```javascript +REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/ +``` + +Agora estamos prontos para configurar nosso ponto de extremidade Web3 da Alchemy no nosso dapp! Vamos voltar para o nosso `interact.js`, que é aninhado dentro da nossa pasta `util` e adicionar o seguinte código no topo do arquivo: + +```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; +``` + +Acima, nós primeiro importamos a chave Alchemy do nosso arquivo `.env` e então passamos nosso `alchemyKey` para `createAlchemyWeb3` estabelecer nosso endpoint Alchemy Web3. + +Com este endpoint pronto, é hora de carregar nosso contrato inteligente! + +#### Carregando o seu contrato inteligente Hello World {#loading-your-hello-world-smart-contract} + +Para carregar o seu contrato inteligente Hello World, você precisará do seu endereço de contrato e ABI, ambos os quais podem ser encontrados no Etherscan se você completou a [Parte 3 deste tutorial.](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan) + +#### Como obter a ABI do seu contrato no Etherscan {#how-to-get-your-contract-abi-from-etherscan} + +Se você pulou a Parte 3 deste tutorial, você pode usar o contrato Olá, Mundo com o endereço [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). Sua ABI pode ser encontrada [aqui](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). + +A ABI de um contrato é necessária para especificar qual função um contrato irá invocar, assim como garantir que a função irá retornar dados no formato que você está esperando. Uma vez que nós copiamos nosso contrato ABI, vamos salvá-lo como um arquivo JSON chamado `contract-abi.json` no seu diretório `src`. + +O seu contract-abi.json deve ser armazenado na sua pasta src. + +Armados com nosso endereço de contrato, ABI, e endpoint Alchemy Web3, nós podemos usar o [método do contrato](https://docs.web3js.org/api/web3-eth-contract/class/Contract) para carregar uma instância do nosso contrato inteligente. Importe a ABI do seu contrato no arquivo `interact.js` e adicione o seu endereço de contrato. + +```javascript +// interact.js + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" +``` + +Nós podemos agora finalmente descomentar nossa variável `helloWorldContract`, e carregar o contrato inteligente usando nosso endpoint AlchemyWeb3: + +```javascript +// interact.js +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +Para recapitular, as primeiras 12 linhas do seu `interact.js` deve agora se parecer com isso: + +```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 +) +``` + +Agora que nós temos nosso contrato carregado, nós podemos implementar nossa função `loadCurrentMessage`! + +#### Implementando `loadCurrentMessage` no nosso arquivo `interact.js` {#implementing-loadCurrentMessage-in-your-interact-js-file} + +Esta função é super simples. Nós vamos fazer uma simples chamada async web3 para ler do nosso contrato. Nossa função irá retornar a mensagem armazenada no contrato inteligente: + +Atualize o `loadCurrentMessage` no seu arquivo `interact.js` para o seguinte: + +```javascript +// interact.js + +export const loadCurrentMessage = async () => { + const message = await helloWorldContract.methods.message().call() + return message +} +``` + +Já que nós queremos exibir este contrato inteligente na nossa UI, vamos atualizar a função `useEffect` no nosso componente `HelloWorld.js` com o seguinte: + +```javascript +// HelloWorld.js + +//called only once +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) +}, []) +``` + +Note que nós somente queremos nosso `loadCurrentMessage` ser chamado uma vez durante a primeira renderização do componente. Logo implementaremos `addSmartContractListener` para atualizar automaticamente a interface do usuário depois que a mensagem no contrato inteligente mudar. + +Antes que nós mergulhemos no nosso listener, vamos checar o que nós temos até aqui! Salve seus arquivos `HelloWorld.js` e `interact.js`, e então vá para [http://localhost:3000/](http://localhost:3000/) + +Você notará que a mensagem atual não diz mais "No connection to the network." Ao invés disso, ela reflete a mensagem armazenada no contrato inteligente. Ótimo! + +#### Sua UI poderia agora refletir a mensagem armazenada no contrato inteligente {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract} + +Agora falando daquele listener... + +#### Implementar `addSmartContractListener` {#implement-addsmartcontractlistener} + +Se você voltar para pensar no arquivo `HelloWorld.sol` que escrevemos na [Parte 1 desta série de tutoriais](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract), você se lembrará que há um evento de contrato inteligente chamado `UpdatedMessages` que é emitido depois da função `update` do nosso contrato inteligente ser invocada \(ver linhas 9 e 27\): + +```javascript +// HelloWorld.sol + +// Specifies the version of Solidity, using semantic versioning. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.3; + +// Defines a contract named `HelloWorld`. +// Um contrato é uma coleção de funções e dados (seu estado). Uma vez implantado, um contrato reside em um endereço específico na blockchain Ethereum. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Emitted when update function is called + //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. + event UpdatedMessages(string oldStr, string newStr); + + // Declares a state variable `message` of type `string`. + // Variáveis de estado são variáveis cujos valores são permanentemente armazenados no armazenamento do contrato. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + string public message; + + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Os construtores são usados para inicializar os dados do contrato. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + message = initMessage; + } + + // A public function that accepts a string argument and updates the `message` storage variable. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Eventos de contratos inteligentes são uma maneira do seu contrato comunicar que alguma coisa aconteceu \(ou seja, houve um _event_\) na blockchain no seu aplicativo de front-end, que pode “escutar” eventos específicos e tomar uma ação quando eles acontecem. + +A função `addSmartContractListener` escutará especificamente o evento `UpdatedMessages` do nosso contrato inteligente Olá, Mundo e atualizar nossa interface do usuário para mostrar a nova mensagem. + +Modifique `addSmartContractListener` da seguinte maneira: + +```javascript +// HelloWorld.js + +function addSmartContractListener() { + helloWorldContract.events.UpdatedMessages({}, (error, data) => { + if (error) { + setStatus("😥 " + error.message) + } else { + setMessage(data.returnValues[1]) + setNewMessage("") + setStatus("🎉 Your message has been updated!") + } + }) +} +``` + +Vamos quebrar em partes o que acontece quando o listener detecta um evento: + +- Se um erro ocorre quando o evento é emitido, ele será refletido na UI via nossa variável de estado `status`. +- Caso contrário, nós usaremos o objeto `data` retornado. O `data.returnValues` é uma array indexada no zero onde o primeiro elemento da array armazena a mensagem anterior e o segundo elemento armazena o atualizado. Ao todo, em um evento bem-sucedido, iremos configurar nossa cadeia de caracteres `message` com a mensagem atualizada, limpar a cadeia de caracteres `newMessage` e atualizar nossa variável de estado `status` para refletir que uma nova mensagem foi publicada no nosso contrato inteligente. + +Finalmente, vamos chamar nosso listener em nossa função `useEffect` para que seja inicializada na primeira renderização do componente `HelloWorld.js`. Tudo junto, sua função `useEffect` deve se parecer com: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() +}, []) +``` + +Agora que nós somos capazes de ler do nosso contrato inteligente, seria ótimo descobrir como escrever nele também! Entretanto, para escrever no nosso dapp, nós precisamos primeiro uma carteira Ethereum conectada nele. + +Então, em seguida vamos configurar nossa carteira Ethereum \(MetaMask\) e então conectá-la ao nosso dapp! + +### Passo 4: Configurar sua carteira Ethereum {#step-4-set-up-your-ethereum-wallet} + +Para escrever qualquer coisa na cadeia Ethereum, usuários devem assinar transações usando as chaves privadas das suas carteiras virtuais. Para este tutorial, usaremos o [MetaMask](https://metamask.io/), uma carteira virtual no navegador usada para gerenciar o seu endereço de conta do Ethereum, pois ele torna esta assinatura de transação superfácil para o usuário final. + +Se você quiser entender mais sobre como as transações no Ethereum funcionam, confira [esta página](/developers/docs/transactions/) na Fundação Ethereum. + +#### Baixar MetaMask {#download-metamask} + +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Ao criar uma conta, ou mesmo se você já tiver uma conta, certifique-se de mudar para "Goerli Test Network” na parte superior direita \(para não lidarmos com dinheiro real\). + +#### Etapa: Adicionar Faucet ether {#add-ether-from-a-faucet} + +Para assinar a transação no blockchain Ethereum, nós precisamos de alguns Eth falsos. Para obter Eth você pode ir em[FaucETH](https://fauceth.komputing.org) e entrar seu endereço de conta Goerli, clicar em “Request funds”, e então selecionar “Ethereum Testnet Goerli” no menu, e finalmente clicar no botão "Request funds" novamente. Em seguida, você deve ver Eth em sua conta Metamask! + +#### Cheque seu Saldo {#check-your-balance} + +Para verificar novamente que tem saldo, vamos fazer uma solicitação através da ferramenta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) fornecida pelo [compositor da 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). Ela mostrará a quantidade de Eth na sua carteira. Depois de inserir o endereço da sua conta da MetaMask e clicar em "Send Request", você verá uma resposta como esta: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**NOTA:** Este resultado está em wei, não em ETH. Lembre-se de que "Wei" é a menor unidade de ether. A conversão de wei para eth é: 1 eth = 10¹⁸ wei. Então, se convertemos 0xde0b6b3a7640000 para decimal, temos 1\*10¹⁸ wei, que é igual a 1 eth. + +Ufa! Nosso dinheiro falso está todo lá! 🤑 + +### Passo 5: Conecte o MetaMask na sua UI {#step-5-connect-metamask-to-your-UI} + +Agora que nossa carteira MetaMask está configurada, vamos conectar nosso dapp a ela! + +#### Função `connectWallet` {#the-connectWallet-function} + +No nosso arquivo `interact.js`, vamos implementar a função `connectWallet`, a qual podemos então chamar no nosso componente `HelloWorld.js`. + +Vamos modificar `connectWallet` para o seguinte: + +```javascript +// interact.js + +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Write a message in the text-field above.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

      +
      + ), + } + } +} +``` + +Então, o que esse bloco gigante de código faz exatamente? + +Bem, primeiro, ele checar se a `window.ethereum` está habilitada no seu navegador. + +`window.ethereum` é uma API global injetada pela MetaMask e outros provedores de carteira que permitem que sites solicitem contas Ethereum dos usuários. Se aprovado, ele pode ler dados dos blockchains que o usuário está conectado, e sugerir que o usuário assine mensagens e transações. Confira a [documentação da MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) para obter mais informações! + +Se `window.ethereum` _não está_ presente, então isso significa que o MetaMask não está instalado. Isso resulta em um objeto JSON sendo retornado, onde o `endereço` retornado é uma string vazia, e o `status` do objeto JSX repassa que o usuário deve instalar o MetaMask. + +Agora se `window.ethereum` _estiver_ presente, e é aí que as coisas ficam interessantes. + +Usando um laço try/catch, nós vamos tentar conectar ao MetaMask chamando[`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts). Chamando esta função o MetaMask irá abrir no navegador, onde o usuário será solicitado a conectar sua carteira ao seu dapp. + +- Se o usuário escolher conectar, `method: "eth_requestAccounts"` irá retornar uma array que contém todos os endereços de contas de usuário que conectaram ao dapp. No total, nossa função `connectWallet` retornará um objeto JSON que contém o _primeiro_ `address` desta matriz \(ver linha 9\) e uma mensagem `status` que pede que o usuário escreva uma mensagem para o contrato inteligente. +- Se o usuário rejeitar a conexão, então o objeto JSON vai conter uma string vazia para o `address` retornado e uma mensagem de `status` que reflete que o usuário rejeitou a conexão. + +Agora que nós escrevemos esta função `connectWallet`, o próximo passo é chamar ele para o nosso componente `HelloWorld.js`. + +#### Adicione a função `connectWallet` ao seu componente de interface do usuário `HelloWorld.js` {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component} + +Navegue para a função `connectWalletPressed` em `HelloWorld.js`, e atualize-o para o seguinte: + +```javascript +// HelloWorld.js + +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +Observe como a maior parte das nossas funcionalidades está abstraída do nosso componente `HelloWorld.js` do arquivo `interact.js`? É assim que respeitamos o paradigma M-V-C! + +Em `connectWalletPressed`, simplesmente fazemos uma chamada de espera (await) para a função `connectWallet`, importada, e usando sua resposta, nós atualizaremos nossas variáveis `status` e `walletAddress` através de seus state hooks. + +Agora, vamos salvar os dois arquivos `HelloWorld.js` e `interact.js` e testar nossa UI até agora. + +Abra seu navegador na página [http://localhost:3000/](http://localhost:3000/) e clique no botão “Connect Wallet” na parte superior direita da página. + +Se você tiver o MetaMask instalado, você será solicitado a conectar sua carteira ao seu dapp. Aceite o convite para se conectar. + +Observe que o botão de carteira agora mostra que o seu endereço está conectado! Ótimo!!🔥 + +Em seguida, tente atualizar a página... isso é estranho. Nosso botão de carteira está nos pedindo para conectar o MetaMask, mesmo que já esteja conectado... + +Entretanto, não tenha medo! Nós podemos endereçar (entendeu?) facilmente isso implementando `getCurrentWalletConnected`, o qual irá checar se um endereço já está conectado no nosso dapp e atualizar nossa UI de acordo! + +#### A função `getCurrentWalletConnected` {#the-getcurrentwalletconnected-function} + +Atualize a sua função `getCurrentWalletConnected` no arquivo `interact.js` como mostrado abaixo: + +```javascript +// interact.js + +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 Write a message in the text-field above.", + } + } else { + return { + address: "", + status: "🦊 Connect to MetaMask using the top right button.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

      +
      + ), + } + } +} +``` + +Este código é _muito_ similar à função `connectWallet` que nós acabamos de escrever no passo anterior. + +A diferença principal é que, em vez de chamar o método `eth_requestAccounts`, que abre o MetaMask para o usuário conectar sua carteira, aqui chamamos o método `eth_accounts`, que simplesmente retorna uma matriz que contém os endereços MetaMask atualmente conectados ao nosso dapp. + +Para ver esta função em ação, vamos chamar nossa função `useEffect` do nosso componente `HelloWorld.js`: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +Note que nós usamos a resposta da nossa chamada a `getCurrentWalletConnected` para atualizar nossa `walletAddress` e nossa variável de estado `status`. + +Agora que você adicionou este código, tente atualizar a janela do navegador. + +Ótimo!!!! O botão deve dizer que você está conectado e mostrar uma visualização do endereço de sua carteira conectada - mesmo depois de atualizar! + +#### Implemente `addWalletListener` {#implement-addwalletlistener} + +O passo final na configuração da nossa carteira dapp é implementar o ouvinte de carteira, para que nossa interface atualize quando o estado mudar, como quando o usuário desconecta ou troca de contas. + +No seu arquivo `HelloWorld.js`, modifique a sua função `addWalletListener` para o seguinte: + +```javascript +// HelloWorld.js + +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Write a message in the text-field above.") + } else { + setWallet("") + setStatus("🦊 Connect to MetaMask using the top right button.") + } + }) + } else { + setStatus( +

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

      + ) + } +} +``` + +Eu aposto que você nem mesmo precisou da nossa ajuda para entender o que está acontecendo aqui neste ponto, mas por finalidade de clareza, vamos quebrá-lo em partes: + +- Primeiro, nossa função verifica se o `window.ethereum` está habilitado no seu navegador \(ex. MetaMask instalado\). + - Caso contrário, nós simplesmente configuramos a variável de estado `status` para uma JSX string que solicita o usuário instalar a MetaMask. + - Se estiver habilitado, configuramos o ouvinte `window.ethereum.on("accountsChanged")` na linha 3 que houve mudança de estado na carteira MetaMask, inclusive quando o usuário conecta uma conta adicional ao dapp, troca de conta ou desconecta uma conta. Se houver pelo menos uma conta conectada, a variável de estado `walletAddress` é atualizada como a primeira conta no array `accounts` retornada pelo ouvinte. Caso contrário, `walletAddress` é definida como uma string vazia. + +Por último, mas não menos importante, nós devemos chamá-la em nossa função `useEffect`: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +E é isso! Concluímos com sucesso a programação de toda a nossa carteira! Agora, a nossa última tarefa: atualizar a mensagem armazenada no nosso contrato inteligente! + +### Passo 6: Implemente a função `updateMessage` {#step-6-implement-the-updateMessage-function} + +Tudo bem, nós chegamos ao trecho caseiro! No `updateMessage` do seu arquivo `interact.js`, façamos o seguinte: + +1. Certifique-se que a mensagem que nós queremos publicar no nosso contrato inteligente é válida +2. Assine nossa transação usando MetaMask +3. Chame esta função do nosso componente de frontend `HelloWorld.js` + +Isso não vai demorar muito; vamos terminar este dapp! + +#### Manipulação de erros de script {#input-error-handling} + +Naturalmente, faz sentido ter alguns tipos de gerencialmente de erros de entrada no início da função. + +Queremos que nossa função retorne rapidamente. Se não houver uma extensão MetaMask instalada, não haverá carteiras conectadas \(ou seja, o `address` transmitido é uma cadeira de caracteres vazia\) ou a `message` será uma cadeira de caracteres vazia. Vamos adicionar o seguinte gerencialmente de erro em `updateMessage`: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } +} +``` + +Agora que ele tem o devido gerenciamento de erro de entrada, é hora de assinar a transação via MetaMask! + +#### Assinando a nossa transação {#signing-our-transaction} + +Se você já está confortável com as transações tradicionais Web3 do Ethereum, o código que vamos escrever em seguida será bastante familiar. Abaixo, nosso código de manipulação de erro de entrada, adicione o seguinte a `updateMessage`: + +```javascript +// interact.js + +//set up transaction parameters +const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: address, // must match user's active address. + data: helloWorldContract.methods.update(message).encodeABI(), +} + +//sign the transaction +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
      + ℹ️ Once the transaction is verified by the network, the message will be + updated automatically. +
      + ), + } +} catch (error) { + return { + status: "😥 " + error.message, + } +} +``` + +Vamos quebrar em partes o que está acontecendo. Primeiro, configuramos nossos parâmetros de transações, em que: + +- `to` especificar o endereço do destinatário \(nosso contrato inteligente\) +- `from` especifica o signatário da transação, a variável `address` que transmitimos para a nossa função +- `data` contém a chamada para o método `update` do nosso contrato inteligente Olá, Mundo, recebendo nossa variável de cadeia de caracteres `message` como entrada + +Então, nós fazemos uma chamada await, `window.ethereum.request`, onde nós pedimos ao MetaMask para assinar a transação. Observe que nas linhas 11 e 12, estamos especificando nosso método eth `eth_sendTransaction` e passando os nossos `transactionParameters`. + +Neste ponto, a MetaMask irá abrir no navegador e pedirá que o usuário assine ou rejeite a transação. + +- Se a transação tiver sucesso, a função retornará um objeto JSON no qual a cadeia de caracteres JSX `status` pede ao usuário para verificar o Etherscan para mais informações sobre suas transações. +- Se a transação falha, a função irá retornar um objeto JSON onde a string `status` retransmite a mensagem de erro. + +Tudo junto, nossa função `updateMessage` deve se parecer com isso: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + //input error handling + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } + + //set up transaction parameters + const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: address, // must match user's active address. + data: helloWorldContract.methods.update(message).encodeABI(), + } + + //sign the transaction + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
      + ℹ️ Once the transaction is verified by the network, the message will + be updated automatically. +
      + ), + } + } catch (error) { + return { + status: "😥 " + error.message, + } + } +} +``` + +Por último, mas não menos importante, nós precisamos conectar nossa função `updateMessage` ao componente `HelloWorld.js`. + +#### Conecte `updateMessage` ao front-end `HelloWorld.js` {#connect-updatemessage-to-the-helloworld-js-frontend} + +Nossa função `onUpdatePressed` deve fazer uma chamada await para a função `updateMessage` importada e modificar a variável de estado `status` para refletir se a nossa transação teve sucesso ou falhou: + +```javascript +// HelloWorld.js + +const onUpdatePressed = async () => { + const { status } = await updateMessage(walletAddress, newMessage) + setStatus(status) +} +``` + +É super limpo e simples. E advinhe... SEU DAPP ESTÁ COMPLETO!!! + +Vá em frente e teste com o botão **Update**! + +### Faça o seu próprio dapp customizado {#make-your-own-custom-dapp} + +Ebaaaaa, você chegou até o fim deste tutorial! Para recapitular, você aprendeu como: + +- Conectar a carteira MetaMask no seu projeto dapp +- Ler dados do seu contrato inteligente usando a API [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) +- Assinar transações Ethereum usando MetaMask + +Agora você está totalmente equipado para aplicar suas habilidades deste tutorial para construir seu próprio projeto dapp customizado! Como sempre, se você tiver questões, não hesite em nos contatar para pedir ajuda no[Discord da Alchemy](https://discord.gg/gWuC7zB). 🧙‍♂️ + +Uma vez que você terminou este tutorial, nos diga como foi sua experiência ou se você tem alguma opinião, nos marcando no Twitter [@alchemyplatform](https://twitter.com/AlchemyPlatform)! diff --git a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md index 04864b12d21..2db6baca805 100644 --- a/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/hello-world-smart-contract/index.md @@ -7,16 +7,23 @@ tags: - "hardhat" - "alchemy" - "contratos inteligentes" - - "primeiros passos" - "implementação" skill: beginner lang: pt-br published: 2021-03-31 --- -Se você é novo no desenvolvimento de blockchain e não sabe por onde começar, ou se apenas deseja entender como implementar ou interagir com contratos inteligentes, este guia é para você. Mostraremos a você como criar e implementar um simples contrato inteligente na rede de testes Ropsten usando uma carteira virtual ([MetaMask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://alchemyapi.io/eth). Não se preocupe caso não entenda ainda o que tudo isso significa. Vamos explicar). +Se você é novo no desenvolvimento de blockchain e não sabe por onde começar, ou se apenas deseja entender como implementar ou interagir com contratos inteligentes, este guia é para você. Vamos criar e implantar um contrato inteligente simples na rede de teste Goerli usando uma carteira virtual [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) e [Alchemy](https://alchemyapi.io/eth) (não se preocupe se você ainda não entendeu o que isso significa, nós explicaremos). -Na segunda parte deste tutorial, analisaremos como podemos interagir com nosso contrato inteligente uma vez que ele esteja implementado e, já na terceira parte, abordaremos como publicá-lo no Etherscan. +> **Atenção** +> +> Aviso de descontinuidade +> +> Para este guia inteiro, a rede de teste Goerli está sendo usada para criação e implantação de contratos inteligentes. Entretanto, por favor note que a Ethereum Foundation anunciou que a [Goerli será descontinuada em breve](https://www.alchemy.com/blog/goerli-faucet-deprecation). +> +> Nós recomendamos você usar a [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) e [faucets Sepolia](https://sepoliafaucet.com/) para este tutorial. + +Na [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) deste tutorial, veremos como podemos interagir com nosso contrato inteligente, assim que for implantado aqui, e na [parte 3](https://docs.alchemy.com/docs/submitted-your-smart-contract-to-etherscan), abordaremos como publicá-lo no Etherscan. Caso surjam perguntas em qualquer momento, sinta-se à vontade para falar no Discord da [Alchemy](https://discord.gg/gWuC7zB)! @@ -26,29 +33,29 @@ Existem muitas maneiras de fazer solicitações à cadeia de Ethereum. Por simpl ## Passo 2: Crie seu aplicativo (e chave de API) {#step-2} -Assim que você criar uma conta na Alchemy, você pode gerar uma chave de API criando um app. Isso nos permitirá fazer solicitações à rede de testes Ropsten. Se não estiver familiarizado com as redes de teste, confira [esta página](/developers/docs/networks/). +Assim que você criar uma conta na Alchemy, você pode gerar uma chave de API criando um app. Isso nos permitirá fazer solicitações na rede de teste Goerli. Se não estiver familiarizado com as redes de teste, confira [esta página](/developers/docs/networks/). -1. Vá até a página "Create App" no painel da Alchemy, passe o mouse sobre a palavra "Apps" na barra de navegação e clique em "Create App" +1. Navegue até a pagina "Create App" na sua "Dashboard da Alchemy", indo na aba de "Apps" na barra de navegação e clicando em “Create App” ![Criar um aplicativo Hello World](./hello-world-create-app.png) -2. Nomeie seu aplicativo "Hello World", ofereça uma breve descrição, selecione "Staging" para o ambiente (usado para a contabilidade de seu app) e escolha "Ropsten" para sua rede. +2. Nomeie seu aplicativo “Hello World”, ofereça uma breve descrição, selecione “Staging” para o ambiente (usado para seu aplicativo de contabilidade) e escolha “Goerli” para sua rede. ![criar uma visualização do app hello world](./create-app-view-hello-world.png) -3. Clique em "Create App", e é isso e tudo! Seu app deveria aparecer na tabela abaixo. +3. Clique em "Criar app" e pronto! Seu app deve aparecer na tabela abaixo. ## Passo 3: Crie uma conta (endereço) de Ethereum {#step-3} Precisamos de uma conta de Ethereum para enviar e receber transações. Para este tutorial, usaremos uma carteira virtual no navegador, a MetaMask, para gerenciar o endereço da sua conta Ethereum. Mais sobre [transações](/developers/docs/transactions/). -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando estiver criando uma conta, ou se já tiver uma, certifique-se de mudar para a "Ropsten Test Network", no canto superior direito (para não precisar lidar com dinheiro de verdade). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). ![exemplo metamask ropsten](./metamask-ropsten-example.png) ## Passo 4: Adicione ether de um faucet {#step-4} -Para implementar nosso contrato inteligente na rede de teste, precisaremos de alguns ETHs de imitação. Para obter ETH você pode ir para o [faucet da Ropsten](https://faucet.dimensions.network/), inserir seu endereço de conta Ropsten e clicar em "Send Ropsten ETH". Devido ao tráfego de rede, pode levar algum tempo até receber o seu ETH de imitação. Você deveria ver o ETH na sua conta MetaMask logo depois! +Para implantar nosso contrato inteligente na rede de teste, precisaremos de algum Eth falso. Para obter Eth, você pode acessar a [torneira Goerli](https://goerlifaucet.com/), fazer login na sua conta Alchemy, inserir o endereço da carteira e clicar em "Send Me Eth." Pode levar algum tempo para receber seu Eth falso devido ao tráfego de rede. (Enquanto escrevia isto, levou cerca de 30 minutos) Você deve ver Eth em sua conta Metamask logo depois! ## Passo 5: Verifique seu saldo {#step-5} @@ -58,8 +65,8 @@ Para verificar novamente que temos saldo, vamos fazer uma solicitação através { "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } ``` -> **OBSERVAÇÃO:** este resultado é em wei não em ETH. Lembre-se de que o wei é a menor unidade do ether. A conversão de wei para ETH é 1 ETH = 1018 wei. Desta maneira, se convertermos 0x2B5E3AF16B1880000 em decimal obteremos 5\*10¹⁸, o que equivale a 5 ETH. -> +> **OBSERVAÇÃO:** este resultado é em wei não em ETH. Lembre-se de que "Wei" é a menor unidade de ether. A conversão de wei para ETH é 1 ETH = 1018 wei. Desta maneira, se convertermos 0x2B5E3AF16B1880000 em decimal obteremos 5\*10¹⁸, o que equivale a 5 ETH. +> > Ufa! Nosso dinheiro de imitação está todo aí . ## Passo 6: Inicialize nosso projeto {#step-6} @@ -106,9 +113,9 @@ About to write to /Users/.../.../.../hello-world/package.json: Aprove o package.json e estaremos prontos para começar! -## Passo 7: Baixe o [Hardhat](https://hardhat.org/getting-started/#overview){#step-7} +## Etapa 7: Faça o download do [Hardhat](https://hardhat.org/getting-started/#overview) {#step-7} -Hardhat é um ambiente de desenvolvimento para compilar, implementar, testar e depurar seu software de Ethereum. Ele ajuda os desenvolvedores na criação de contratos inteligentes e dApps localmente antes de serem implementados na cadeia online. +Hardhat é um ambiente de desenvolvimento para compilar, implementar, testar e depurar seu software de Ethereum. Ele ajuda os desenvolvedores na criação de contratos inteligentes e dapps localmente antes de implantar na cadeia real. Dentro de nosso projeto `hello-world` execute: @@ -199,9 +206,9 @@ contract HelloWorld { Este é um contrato inteligente muito simples, que armazena uma mensagem ao ser criado e pode ser atualizado através da função `update`. -## Passo 11: Vincule MetaMask e Alchemy a seu projeto {#step-11} +## Passo 11: Vincule Metamask e Alchemy a seu projeto {#step-11} -Nós já criamos uma carteira MetaMask, uma conta Alchemy e já escrevemos nosso contrato inteligente. Agora é hora de vincularmos os três. +Nós já criamos uma carteira Metamask, uma conta Alchemy e já escrevemos nosso contrato inteligente. Agora é hora de vincularmos os três. Toda transação enviada da sua carteira virtual requer uma assinatura, usando sua chave privada única. Para fornecer essa permissão ao nosso programa, nós podemos armazenar com segurança nossa chave privada (e a chave Alchemy API) em um arquivo de ambiente. @@ -213,7 +220,7 @@ Primeiro, instale o pacote dotenv na pasta do seu projeto: npm install dotenv --save ``` -Depois, crie um arquivo `.env` no diretório raiz do seu projeto e adicione sua chave MetaMask privada e o URL da API HTTP Alchemy nele. +Depois, crie um arquivo `.env` no diretório raiz do seu projeto e adicione sua chave Metamask privada e o URL da API HTTP Alchemy nele. - Siga [estas instruções](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) para exportar sua chave privada - Veja abaixo como obter o URL da API HTTP Alchemy @@ -225,14 +232,14 @@ Copiar o URL da Alchemy API Seu arquivo `.env` ficará assim: ``` -API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key" +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" PRIVATE_KEY = "your-metamask-private-key" ``` Para realmente vinculá-los a nosso código, vamos fazer referência a essas variáveis em nosso arquivo `hardhat.config.js` no passo 13. -Don't commit .env! Please make sure never to share or expose your .env file with anyone, as you are compromising your secrets in doing so. If you are using version control, add your .env to a gitignore file. +No faça commit do .env! Por favor, tenha certeza de nunca compartilhar ou expor seu arquivo .env com ninguém, pois estará comprometendo suas partes secretas ao fazê-lo. Se estiver usando um controle de versão, adicione seu .env ao arquivo gitignore ## Passo 12: Instale o Ethers.js {#step-12-install-ethersjs} @@ -266,10 +273,10 @@ const { API_URL, PRIVATE_KEY } = process.env; */ module.exports = { solidity: "0.7.3", - defaultNetwork: "ropsten", + defaultNetwork: "goerli", networks: { hardhat: {}, - ropsten: { + goerli: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`] } @@ -330,7 +337,7 @@ Ao chamar `deploy()` em uma `ContractFactory`, a implantação se iniciará e re Finalmente estamos prontos para implantar o nosso contrato inteligente! Navegue até a linha de comando e digite: ``` -npx hardhat run scripts/deploy.js --network ropsten +npx hardhat run scripts/deploy.js --network goerli ``` Você deverá ver algo assim: @@ -339,11 +346,11 @@ Você deverá ver algo assim: Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 ``` -Se formos para a [etherscan Ropsten](https://ropsten.etherscan.io/) e procurarmos o endereço de nosso contrato, poderemos ver se ele foi implantado com sucesso. A transação ficará parecida com isto: +Se formos ao [etherscan da Goerli](https://goerli.etherscan.io/) e procurarmos nosso endereço de contrato, devemos ser capazes de ver que ele foi implantado com sucesso. A transação ficará parecida com isto: ![contrato etherscan](./etherscan-contract.png) -O endereço `From` deve corresponder ao endereço da sua conta MetaMask, e o endereço "Para" vai dizer "Criação de contrato", mas se clicarmos na transação veremos o endereço do nosso contrato no campo `To`: +O endereço `From` deve corresponder ao endereço da sua conta Metamask, e o endereço "Para" vai dizer "Criação de contrato", mas se clicarmos na transação veremos o endereço do nosso contrato no campo `To`: ![transação etherscan](./etherscan-transaction.png) @@ -351,7 +358,7 @@ Parabéns! Você acaba de implantar um contrato inteligente para a cadeia Ethere Para entender o que está acontecendo nos bastidores, vamos navegar até a guia Explorer no [painel do Alchemy](https://dashboard.alchemyapi.io/explorer). Se você tem vários aplicativos Alchemy, certifique-se de filtrar por app e selecionar “Hello World”. ![explorador hello world](./hello-world-explorer.png) -Aqui você verá um punhado de chamadas JSON-RPC que Hardhat/Ethers fizeram em segundo plano para nós quando chamamos a função `.deploy() `. Duas importantes chamadas aqui são a [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), que é o pedido para realmente escrever nosso contrato inteligente na cadeia de Ropsten, e a [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), que é um pedido para ler informações sobre nossa transação, dado o hash (um padrão típico ao enviar transações). Para saber mais sobre o envio de transações, confira este tutorial em [ sobre como enviar transações usando a Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +Aqui você verá um punhado de chamadas JSON-RPC que Hardhat/Ethers fizeram em segundo plano para nós quando chamamos a função `.deploy() `. Duas importantes chamadas aqui são [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), que é o pedido para escrever de fato nosso contrato na cadeia Goerli, e [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash) que é um pedido para ler informações sobre nossa transação dado o hash (um padrão típico em transações). Para saber mais sobre o envio de transações, confira este tutorial em [ sobre como enviar transações usando a Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) Isso é tudo para a parte 1 deste tutorial. Na parte 2, [interagiremos com nosso contrato inteligente](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract) atualizando nossa mensagem inicial e, na parte 3, [publicaremos nosso contrato inteligente no Etherscan](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan) para que todos aprendam como interagir com ele. diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-implement-an-erc721-market/index.md new file mode 100644 index 00000000000..dc2b696978c --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -0,0 +1,149 @@ +--- +title: Como implementar um mercado ERC-721 +description: Como colocar itens tokenizados para venda em um mercado descentralizado +author: "Alberto Cuesta Cañada" +tags: + - "contratos inteligentes" + - "erc-721" + - "solidez" + - "tokens" +skill: intermediate +lang: pt-br +published: 2020-03-19 +source: Hackernoon +sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9 +--- + +Neste artigo, vou lhe mostrar como programar um Craigslist na blockchain Ethereum. + +Antes de Gumtree, Ebay e Craigslist, classificados eram basicamente painéis de cortiça ou papel. Havia seções de classificados nos corredores da escola, jornais, postes de rua, e vitrines. + +Tudo isso mudou com a internet. O número de pessoas que podiam ver um determinado quadro classificado foi multiplicado por muitas ordens de magnitude. Com isso, os mercados que representam tornaram-se muito mais eficientes e escalaram até à dimensão global. A Ebay é uma empresa gigantesca que rastreia a origem destes quadros de classificações físicas. + +Com a blockchain, esses mercados estão definidos para mudar mais uma vez, deixe-me te mostrar como. + +## Monetização {#monetization} + +O modelo de negócio de um conselho de classificações públicas da blockchain precisará ser diferente do da Ebay e da empresa. + +Primeiro, há [o ângulo de descentralização](/developers/docs/web2-vs-web3/). Plataformas existentes precisam manter seus próprios servidores. Uma plataforma descentralizada é mantida por seus usuários, então o custo de executar a plataforma principal cai para zero para o proprietário da plataforma. + +Em seguida, há o front-end, o site ou a interface que dá acesso à plataforma. Aqui há muitas opções. Os proprietários da plataforma podem restringir o acesso e forçar todos a usar a interface, carregando uma taxa. Os proprietários da plataforma também podem decidir abrir o acesso (Poder para as Pessoas!) e deixar qualquer pessoa construir interfaces na plataforma. Ou os proprietários poderiam decidir qualquer abordagem no meio desses extremos. + +_Os líderes empresariais com mais visão do que eu saberão bem como monetizar isso. Tudo o que entendo é que isto é diferente do status quo e é, provavelmente, lucrativo._ + +Além disso, há o ponto relativo à automação e aos pagamentos. Algumas coisas podem ser [efetivamente tokenizadas](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) e negociadas em um quadro de classificações. Ativos tokenizados são facilmente transferidos em uma blockchain. Métodos de pagamento altamente complexos podem ser facilmente implementados em uma blockchain. + +Sinto uma oportunidade de negócios aqui. Um quadro de classificados sem custos correntes pode ser facilmente implementado, com caminhos de pagamento complexos incluídos em cada transação. Tenho certeza de que alguém vai ter uma ideia sobre em que usar isso. + +Estou feliz construindo. Vamos dar uma olhada no código. + +## Implementação {#implementation} + +Há algum tempo iniciamos um [repositório de código aberto](https://github.com/HQ20/contracts?ref=hackernoon.com) com implementações de exemplos de casos de negócios e outros brindes, dê uma olhada. + +O código para este [Ethereum Classifieds Board](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) está lá, por favor, use e abuse dele. Apenas esteja ciente de que o código não foi auditado e de que você precisa fazer a sua própria diligência antes de deixar o dinheiro entrar. + +Os fundamentos do conselho não são complexos. Todos os anúncios no board serão apenas uma construção com alguns campos: + +```solidity +struct Trade { + address poster; + uint256 item; + uint256 price; + bytes32 status; // Open, Executed, Cancelled +} +``` + +Portanto, há alguém que publique o anúncio. Item à venda. Um preço para o item. O status da operação que pode ser aberto, executado ou cancelado. + +Todas essas trocas serão mantidas em um mapeamento. Porque tudo no Solidity parece ser um mapeamento. Também porque é conveniente. + +```solidity +mapping(uint256 => Trade) public trades; +``` + +Usando um mapeamento significa apenas que temos que criar um id para cada anúncio antes de publicá-lo, e precisaremos saber a identificação de um anúncio antes de podermos operar sobre ele. Existem várias maneiras de lidar com isto, seja no contrato inteligente ou na parte front-end. Por favor pergunte se você precisa de alguns ponteiros. + +Em seguida, a questão de quais são os itens com que lidamos, e qual é esta moeda que é usada para pagar a transação. + +Para os itens, vamos apenas pedir que eles implementem a interface [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), que realmente é apenas uma maneira de representar itens do mundo real em uma blockchain, embora [funcione melhor com os recursos digitais](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Vamos especificar o nosso próprio contrato ERC721 no construtor, significa que todos os ativos do nosso quadro de classificados precisam ter sido tokenizados previamente. + +Quanto aos pagamentos, vamos fazer algo semelhante. A maioria dos projetos blockchain definem suas próprias criptomoedas [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com). Outros preferem usar um mainstream como a DAI. Neste quadro de classificações, você só precisa decidir em construção qual será a sua moeda. Fácil. + +```solidity +constructor ( + address _currencyTokenAddress, address _itemTokenAddress +) public { + currencyToken = IERC20(_currencyTokenAddress); + itemToken = IERC721(_itemTokenAddress); + tradeCounter = 0; +} +``` + +Nós estamos chegando lá. Temos anúncios, itens para negociação e uma moeda para pagamentos. Fazer um anúncio significa colocar um item no escopo para mostrar que você o tem e que você não publicou duas vezes, possivelmente em um quadro diferente. + +O código abaixo faz exatamente isso. Coloca o item no escrow, cria o anúncio, faz algum serviço doméstico. + +```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"); +} +``` + +Aceitar a troca significa escolher um anúncio (negociação), pagar o preço, receber o item. O código abaixo recupera uma troca. Verifica se está disponível. Paga o item. Recupera o item. Atualiza o anúncio. + +```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"); +} +``` + +Por último, temos uma opção para os vendedores recuarem numa negociação antes que um comprador a aceite. Em alguns modelos, os anúncios estariam vivos por um período de tempo antes de eles expirarem. Fica a sua escolha, dependendo do design do seu mercado. + +O código é muito semelhante ao usado para executar uma negociação, apenas não há nenhuma mudança de moeda e o item volta para o cartaz anunciante. + +```solidity +function cancelTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require( + msg.sender == trade.poster, + "Trade can be cancelled only by poster." + ); + require(trade.status == "Open", "Trade is not Open."); + itemToken.transferFrom(address(this), trade.poster, trade.item); + trades[_trade].status = "Cancelled"; + emit TradeStatusChange(_trade, "Cancelled"); +} +``` + +É isso. Você chegou ao fim da implementação. É bastante surpreendente como alguns conceitos de negócios se tornam compactos quando são expressados em código, e este é um desses casos. Verifique o contrato completo [no nosso repositório](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol). + +## Conclusão {#conclusion} + +As seções de classificados são uma configuração comum de mercado que cresceu em grande escala com a internet, tornando-se um modelo de negócio extremamente popular com alguns vencedores monopolistas. + +Também acontece de as seções de classificados serem uma ferramenta fácil de replicar em um ambiente blockchain, com características muito específicas que possibilitarão um desafio para os gigantes da atualidade. + +Neste artigo, tentei fazer uma ponte entre a realidade comercial de um conselho de administração clássico com a implementação tecnológica. Este conhecimento deve ajudá-lo a criar uma visão e um roteiro para a implementação, se você tiver as habilidades certas. + +Como sempre, se você for construir algo divertido e gostaria de alguns conselhos, por favor [envie-me uma mensagem](https://albertocuesta.es/)! Fico sempre feliz em ajudar. diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-mint-an-nft/index.md index bbabf05713c..94593c6e630 100644 --- a/public/content/translations/pt-br/developers/tutorials/how-to-mint-an-nft/index.md +++ b/public/content/translations/pt-br/developers/tutorials/how-to-mint-an-nft/index.md @@ -4,7 +4,8 @@ description: Este tutorial descreve como criar um NFT na blockchain Ethereum usa author: "Sumi Mudgil" tags: - "ERC-721" - - "Solidity" + - "alchemy" + - "solidity" - "contratos inteligentes" skill: beginner lang: pt-br @@ -13,7 +14,7 @@ published: 2021-04-22 [Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): 69 milhões de doláres [3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): 11 milhões de doláres [Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): 6 milhões de doláres -Estes NFTs foram criados usando a poderosa API da Alchemy. Neste tutorial, vamos te ensinar a fazer o mesmo em < 10 minutos. +All of them minted their NFTs using Alchemy’s powerful API. Neste tutorial, vamos te ensinar a fazer o mesmo em < 10 minutos. "Cunhar um NFT" é o ato de publicar uma instância única do seu token ERC-721 na blockchain. Usando nosso contrato inteligente da [Parte 1 desta série de tutoriais NFT](/developers/tutorials/how-to-write-and-deploy-an-nft/), vamos usar nossas habilidades Web3 e criar um NFT. No final deste tutorial, você será capaz de cunhar tantos NFTs quanto seu coração (e sua carteira) desejar! @@ -110,9 +111,9 @@ Uma vez terminada a edição do arquivo JSON, salve-o e faça o upload para o Pi ## Etapa 5: Criar uma instância de seu contrato {#instance-contract} -Agora, para interagir com o nosso contrato, precisamos criar uma instância dele em nosso código. Para fazer isso, precisaremos do nosso endereço de contrato, obtido na implantação ou no [Etherscan](https://goerli.etherscan.io/), procurando o endereço que você usou para implantar o contrato. +Agora, para interagir com o nosso contrato, precisamos criar uma instância dele em nosso código. Para fazer isso, precisaremos do nosso endereço de contrato, obtido na implantação ou no [Etherscan](https://sepolia.etherscan.io/), procurando o endereço que você usou para implantar o contrato. -![Veja o seu endereço de contrato no Etherscan](./viewContractEtherscan.png) +![Veja o seu endereço de contrato no Etherscan](./view-contract-etherscan.png) No exemplo acima, o endereço do contrato é 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778. @@ -131,7 +132,7 @@ Agora, para criar e enviar transações para a cadeia Ethereum, usaremos seu end Adicione sua chave pública ao seu arquivo `.env` — se você concluiu a parte 1 do tutorial, nosso arquivo `.env` deve ficar assim: ```js -API_URL = "https://eth-goerli.g.alchemy.com/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" ``` @@ -314,15 +315,15 @@ mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP") Agora, execute `node scripts/mint-nft.js` para implantar seu NFT. Depois de alguns segundos, você deverá ver uma resposta como essa no seu terminal: O hash de sua transação é: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 - + Verifique o Mempool da Alquemy para ver o estado da sua transação! -Em seguida, acesse a [mempool (área de espera) da Alchemy](https://dashboard.alchemyapi.io/mempool) para ver o estado da sua transação (se pendente, minerada ou recusada pela rede). Se a sua transação foi descartada, também é útil verificar o [Goerli Etherscan](https://goerli.etherscan.io/) e procurar pelo hash da transação. +Em seguida, acesse a [mempool (área de espera) da Alchemy](https://dashboard.alchemyapi.io/mempool) para ver o estado da sua transação (se pendente, minerada ou recusada pela rede). Se a sua transação se perdeu, também é útil verificar no [Sepolia Etherscan](https://sepolia.etherscan.io/) e procurar o hash da transação. -![Veja seu hash de transação NFT no Etherscan](./viewNFTEtherscan.png)_Veja seu hash de transação NFT no Etherscan_ +![Veja seu hash de transação NFT no Etherscan](./view-nft-etherscan.png)_Veja seu hash de transação NFT no Etherscan_ E pronto! Você agora implantou E cunhou um NFT na blockchain Ethereum -Usando o `mint-nft.js`, você pode cunhar quantos NFTs você (e sua carteira) desejar! Apenas certifique-se de transmitir um novo tokenURI descrevendo os metadados do NFT (caso contrário, você acaba criando um monte de identificações idênticas, com IDs diferentes). +Using the `mint-nft.js` you can mint as many NFTs as your heart (and wallet) desires! Apenas certifique-se de transmitir um novo tokenURI descrevendo os metadados do NFT (caso contrário, você acaba criando um monte de identificações idênticas, com IDs diferentes). Provavelmente você gostaria de poder exibir seu NFT na sua carteira — então certifique-se de conferir [Parte 3: Como ver seu NFT na sua carteira](/developers/tutorials/how-to-view-nft-in-metamask/)! diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md new file mode 100644 index 00000000000..5621dda9432 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -0,0 +1,106 @@ +--- +title: Como simular contratos inteligentes em Solidity para teste +description: Por que você deve aproveitar os seus contratos ao testar +author: Markus Waas +lang: pt-br +tags: + - "solidez" + - "contratos inteligentes" + - "testando" + - "simulando" +skill: intermediate +published: 2020-05-02 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/mocking-contracts +--- + +[Mock de objetos ](https://wikipedia.org/wiki/Mock_object) são um padrão de design comum na programação orientada a objetos. Vindo da velha palavra francesa "mocquer" com o significado de "diversão de", evoluiu para a "imitação de algo real", que é na realidade, o que estamos fazendo na programação. Por favor, só se divirta de seus contratos inteligentes se você quiser, mas faça o mock deles sempre que puder. Isso torna sua vida mais fácil. + +## Testes de unidade de contratos com simulações {#unit-testing-contracts-with-mocks} + +Simular um contrato (mocking) significa essencialmente criar uma segunda versão desse contrato que se comporta de maneira muito semelhante ao original, mas de uma maneira que pode ser facilmente controlada pelo desenvolvedor. Muitas vezes, você acaba com contratos complexos nos quais você só quer [fazer testes de unidade de pequenas partes do contrato](/developers/docs/smart-contracts/testing/). O problema é: e se o teste desta pequena parte exigir um estado de contrato muito específico que seja difícil de alcançar? + +Você poderia escrever uma lógica de configuração de testes complexa toda vez que apresentasse o contrato no estado necessário ou você escreveria uma simulação (mock, em inglês). Simular um contrato é fácil com herança. Basta criar um segundo contrato mock que herda do original. Agora você pode substituir funções de seu mock. Vejamos com um exemplo. + +## Exemplo: ERC20 Privado {#example-private-erc20} + +Usamos um exemplo de contrato ERC-20 que tem um tempo privado inicial. O proprietário pode gerenciar usuários privados e apenas esses terão permissão para receber tokens no início. Uma vez que um certo tempo tenha passado, todos poderão utilizar os tokens. Se você estiver curioso, estamos usando o hook (código modificado) [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks) dos novos contratos OpenZeppelin 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: invalid recipient"); + } + + function _validRecipient(address to) private view returns (bool) { + if (isPublic()) { + return true; + } + + return isPrivateUser[to]; + } +} +``` + +E agora vamos fazer o mock disso. + +```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; + } +} +``` + +Você receberá uma das seguintes mensagens de erro: + +- `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.` +- `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.` + +Como estamos usando a nova versão 0.6 do Solidity, temos que adicionar a palavra-chave `virtual` para funções que podem ser sobrescritas e substituídas pela função substituta. Então vamos adicioná-los para ambas as funções `isPublic`. + +Agora você pode usar `PrivateERC20Mock` nos seus testes de unidade. Quando você quiser testar o comportamento durante o tempo de uso privado, use `setIsPublic(false)` e, da mesma forma, `setIsPublic(true)` para testar o tempo de uso público. É claro que em nosso exemplo, poderíamos usar simplesmente [auxiliares de tempo](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) para alterar os tempos de acordo também. Mas a ideia de mocking deve estar clara agora e você pode imaginar cenários em que não é tão fácil quanto simplesmente avançar no tempo. + +## Mocking em muitos contratos {#mocking-many-contracts} + +Pode ficar confuso se você tiver que criar outro contrato para cada mock. Se isso incomoda você, dê uma olhada na biblioteca [MockContract](https://github.com/gnosis/mock-contract). Ele permite que você sobrescreva e modifique comportamentos de contratos em tempo real. No entanto, ele só funciona para chamadas mocking para outro contrato, portanto, não funcionaria para o nosso exemplo. + +## Mocking podem ser ainda mais poderosas {#mocking-can-be-even-more-powerful} + +Os poderes de mocking não terminam aí. + +- Adicionando funções: sobrescrever uma função específica é útil, mas apenas acrescentar funções adicionais também poderá ser. Um bom exemplo para tokens é ter apenas uma função adicional `mint` para permitir que qualquer usuário obtenha novos tokens gratuitamente. +- Uso em testnets: ao implantar e testar seus contratos em testnets juntamente com seu Dapp, considere usar uma versão mock. Evite sobrescrever funções, a menos que você realmente precise. Afinal, você quer testar a lógica real. Mas adicionar, por exemplo, uma função de redefinição pode ser útil que simplesmente redefine o estado do contrato para o início, sem necessidade de nova implantação. Obviamente, você não gostaria de ter isso em um contrato na mainnet (rede principal). diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md new file mode 100644 index 00000000000..899dffa2ab9 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -0,0 +1,693 @@ +--- +title: Como usar o Echidna para testar contratos inteligentes +description: Como usar o Echidna para testar automaticamente contratos inteligentes +author: "Trailofbits" +lang: pt-br +tags: + - "solidez" + - "smart contracts" + - "segurança" + - "testando" + - "fuzzing" +skill: advanced +published: 2020-04-10 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna +--- + +## Instalação {#installation} + +Echidna pode ser instalado através do docker ou usando o binário pré-compilado. + +### Echidna com docker {#echidna-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_O último comando roda a eth-security-toolbox em um docker que tem acesso ao seu diretório atual. Você pode alterar os arquivos do seu host e executar as ferramentas nos arquivos através do docker_ + +Dentro do docker, execute : + +```bash +solc-select 0.5.11 +cd /home/training +``` + +### Binário {#binary} + +[https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0) + +## Introdução a fuzzing baseado em propriedade {#introduction-to-property-based-fuzzing} + +Echidna é um fuzzer baseado em propriedades, descrevemos em nossos posts anteriores ([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) é uma técnica bem conhecida na comunidade de segurança. It consists of generating inputs that are more or less random to find bugs in the program. Fuzzers por software tradicional (como [AFL](http://lcamtuf.coredump.cx/afl/) ou [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) são conhecidos por serem ferramentas eficientes para encontrar bugs. + +Além da geração aleatória de entradas, há muitas técnicas e estratégias para gerar bons inputs, incluindo: + +- Obtenha feedback de cada execução e geração de guias usando-o. Por exemplo, se uma entrada recém-gerada leva à descoberta de um novo caminho, ele pode fazer sentido para gerar novas entradas fechadas a ele. +- Geração da entrada respeitando uma restrição estrutural. Por exemplo, se a sua entrada contiver um cabeçalho com uma soma de verificação, fará sentido deixar o difusor gerar uma entrada validando a soma de verificação. +- Usando entradas conhecidas para gerar novas entradas: se você tem acesso a um grande conjunto de dados de entrada válida, seu difusor pode gerar novas entradas a partir deles, ao invés de começar sua geração do zero. Eles geralmente são chamados de _seeds_. + +### Fuzzing baseado em propriedade {#property-based-fuzzing} + +Echidna pertence a uma família específica de fuzzer: fuzzing baseada em propriedades fortemente inspirada pelo [QuickCheck](https://wikipedia.org/wiki/QuickCheck). Em contraste com o fuzzing clássico que tentará encontrar falhas, Echidna tentará quebrar invariantes definidos pelo usuário. + +Nos contratos inteligentes, invariantes são funções Solidity, que podem representar qualquer estado incorreto ou inválido que o contrato possa alcançar, incluindo: + +- Controle de acesso incorreto: quem ataca tornou-se o proprietário do contrato. +- Máquina de estado incorreta: os tokens podem ser transferidos enquanto o contrato é pausado. +- Aritmética incorreta: o usuário pode passar abaixo do saldo e obter tokens gratuitos ilimitados. + +### Testando uma propriedade com Echidna {#testing-a-property-with-echidna} + +Veremos como testar um contrato inteligente com o Echidna. O alvo é o seguinte contrato inteligente [`exemplo.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; + } +} +``` + +Assumiremos que esse token deve ter as seguintes propriedades: + +- Qualquer um pode ter no máximo 1000 tokens +- O token não pode ser transferido (não é um token ERC20) + +### Escrever uma propriedade {#write-a-property} + +Propriedades do Echidna são funções de Solidity. Uma propriedade deve: + +- Ter nenhum argumento +- Retornar `verdadeiro` se for bem sucedido +- Tenha seu nome começando com `echidna` + +Echidna irá: + +- Gera automaticamente transações arbitrárias para testar a propriedade. +- Relata quaisquer transações que levem uma propriedade para retornar `` falso ou lançar um erro. +- Descartar efeito lateral ao chamar uma propriedade (ou seja, se a propriedade altera uma variável de estado, ela é descartada após o teste) + +A propriedade a seguir verifica que o "caller" não possui mais do que 1000 tokens: + +```solidity +function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; +} +``` + +Use herança para separar seu contrato de suas propriedades: + +```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) implementa a propriedade e herda do token. + +### Iniciar um contrato {#initiate-a-contract} + +Echidna precisa de um [constructor](/developers/docs/smart-contracts/anatomy/#constructor-functions) sem argumento. Se seu contrato precisa de uma inicialização específica, você precisa fazê-lo no construtor. + +Há alguns endereços específicos no Echidna: + +- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72` que chama o constructor. +- `0x10000`, `0x20000`, e `0x00a329C0648769a73afAC7F9381e08fb43DBEA70` que aleatoriamente chama as outras funções. + +Nós não precisamos de nenhuma inicialização específica em nosso exemplo atual, como resultado, nosso construtor está vazio. + +### Executando Echidna {#run-echidna} + +Echidna foi lançado com: + +```bash +echidna-test contract.sol +``` + +Se o contract.sol contém múltiplos contratos, você pode especificar o alvo: + +```bash +echidna-test contract.sol --contract MyContract +``` + +### Resumo: Testando uma propriedade {#summary-testing-a-property} + +O seguinte resumo é a execução de Echidna no nosso exemplo: + +```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 descobriu que a propriedade é violada se `backdoor` é chamada. + +## Filtrando funções para chamar durante uma campanha de fuzzing {#filtering-functions-to-call-during-a-fuzzing-campaign} + +Veremos como filtrar as funções a serem "fuzzed". O alvo é o seguinte contrato inteligente: + +```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); + } +} +``` + +Este pequeno exemplo força Echidna a encontrar uma determinada sequência de transações para alterar uma variável de estado. Isso é difícil para um fuzzer (é recomendado usar uma ferramenta de execução simbólica como [Manticore](https://github.com/trailofbits/manticore)). Podemos executar o Echidna para verificar isto: + +```bash +echidna-test multi.sol +... +echidna_state4: passed! 🎉 +Seed: -3684648582249875403 +``` + +### Filtrando funções {#filtering-functions} + +Echidna tem problemas para encontrar a sequência correta para testar esse contrato, porque as duas funções de redefinição (`reset1` e `reset2`) definirão todas as variáveis de estado como `false`. No entanto, podemos usar um recurso especial Echidna para ou para a lista negra redefinir a função ou apenas para a lista branca `f`, `g`, `h` e `i` funções. + +Para funções da lista negra, podemos usar esse arquivo de configuração: + +```yaml +filterBlacklist: true +filterFunctions: ["reset1", "reset2"] +``` + +Outra abordagem para as funções de filtro é listar as funções na lista branca. Para fazer isso, podemos usar este arquivo de configuração: + +```yaml +filterBlacklist: false +filterFunctions: ["f", "g", "h", "i"] +``` + +- `filterBlacklist` é `verdadeiro` por padrão. +- A filtragem será executada apenas por nome (sem parâmetros). Se você tiver `f()` e `f(uint256)`, o filtro `"f"` corresponderá a ambas as funções. + +### Executar Echidna {#run-echidna-1} + +Para executar Echidna com um arquivo de configuração `blacklist.yaml`: + +```bash +echidna-test multi.sol --config blacklist.yaml +... +echidna_state4: failed!💥 + Call sequence: + f(12) + g(8) + h(42) + i() +``` + +Echidna vai encontrar a sequência de transações para falsificar a propriedade quase de forma mesquinha. + +### Resumo: Filtrando funções {#summary-filtering-functions} + +Echidna pode ser chamada na lista negra ou na lista branca durante uma campanha de fuzzing: + +```yaml +filterBlacklist: true +filterFunctions: ["f1", "f2", "f3"] +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +Echidna inicia uma campanha de fuzzing em qualquer blacklist `f1`, `f2` e `f3` ou apenas chamando a eles, de acordo com o valor do booleano `filterBlacklist`. + +## Como testar a asserção de Solidity com Echidna {#how-to-test-soliditys-assert-with-echidna} + +Neste breve tutorial, vamos mostrar como usar o Echidna para testar a verificação de asserção em contratos. Vamos supor que tenhamos um contrato como este: + +```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); + } +} +``` + +### Escreva uma asserção {#write-an-assertion} + +Queremos ter certeza de que `tmp` é menor ou igual a `contador` depois de retornar a sua diferença. Nós poderíamos escrever uma propriedade de Echidna, mas precisaremos armazenar o valor de `tmp` em algum lugar. Em vez disso, poderíamos usar uma asserção como esta: + +```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); + } +} +``` + +### Executando Echidna {#run-echidna-2} + +Para habilitar o teste de falha de asserção, crie um arquivo de configuração [Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +checkAsserts: true +``` + +Quando executamos este contrato em Echidna, obtemos os resultados esperados: + +```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 +``` + +Como você pode ver, Echidna relata algumas falhas de afirmação na função `inc`. Adicionar mais de uma asserção por função é possível, mas Echidna não pode dizer qual afirmação falhou. + +### Quando e como usar asserções {#when-and-how-use-assertions} + +As asserções podem ser usadas como alternativas às propriedades explícitas, se as condições a serem verificadas estão diretamente relacionadas com o uso correto de alguma operação `f`. Adicionar asserções após algum código forçará que a verificação ocorra imediatamente após sua execução: + +```solidity +function f(..) public { + // some complex code + ... + assert (condition); + ... +} + +``` + +Pelo contrário, usando uma propriedade Echidna explícita irá executar transações aleatoriamente e não há maneira fácil de aplicar exatamente quando elas serão verificadas. Ainda é possível fazer esta solução alternativa: + +```solidity +function echidna_assert_after_f() public returns (bool) { + f(..); + return(condition); +} +``` + +Entretanto, existem alguns problemas: %{issues}: + +- Ele falha se `f` é declarado como `interno` ou `externo`. +- Não está claro quais argumentos devem ser usados para chamar `f`. +- Se `f` reverter, a propriedade irá falhar. + +Em geral, recomendamos seguir a recomendação de [John Regehr](https://blog.regehr.org/archives/1091) sobre como usar asserções: + +- Não force qualquer efeito colateral durante a verificação de asserção. Por exemplo: `assert(ChangeStateAndReturn() == 1)` +- Não faça asserções óbvias. Por exemplo, `assert(var >= 0)` onde `var` é declarado como `uint`. + +Finalmente, **não use** `require` em vez de `assert`, já que Echidna não será capaz de detectá-lo (mas o contrato será revertido mesmo assim). + +### Resumo: checando a asserção {#summary-assertion-checking} + +O seguinte resumo é a execução de Echidna no nosso exemplo: + +```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 percebeu que a asserção em `inc` pode falhar se essa função é chamada várias vezes com argumentos grandes. + +## Coletando e modificando um corpus Echidna {#collecting-and-modifying-an-echidna-corpus} + +Veremos como coletar e usar um corpus de transações com Echidna. O alvo é o seguinte contrato inteligente [`exemplo.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; + } + +} +``` + +Este pequeno exemplo força Echidna a encontrar uma determinada sequência de transações para alterar uma variável de estado. Isso é difícil para um fuzzer (é recomendado usar uma ferramenta de execução simbólica como [Manticore](https://github.com/trailofbits/manticore)). Podemos executar o Echidna para verificar isto: + +```bash +echidna-test magic.sol +... + +echidna_magic_values: passed! 🎉 + +Seed: 2221503356319272685 +``` + +No entanto, ainda podemos usar o Echidna para coletar corpus na condução desta campanha de fuzzing. + +### Coletando um corpus {#collecting-a-corpus} + +Para habilitar a coleção de corpus, crie um diretório corpus: + +```bash +mkdir corpus-magic +``` + +E um [arquivo de configuração Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +coverage: true +corpusDir: "corpus-magic" +``` + +Agora podemos rodar nossa ferramenta e checar o corpus coletado: + +```bash +echidna-test magic.sol --config config.yaml +``` + +Echidna ainda não conseguiu encontrar os valores mágicos corretos, mas podemos olhar para o corpus que ele coletou. Por exemplo, um desses arquivos foi: + +```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" + } +] +``` + +Claramente, esse input não causará falha em nossa propriedade. No entanto, no próximo passo, veremos como modificá-lo nesse sentido. + +### Semeando um corpus {#seeding-a-corpus} + +Echidna precisa de ajuda para lidar com a função `mágica`. Vamos copiar e modificar a entrada para usar os parâmetros adequados para ele: + +```bash +cp corpus/2712688662897926208.txt corpus/new.txt +``` + +Nós iremos modificar `new.txt` para chamar `mágica(42,129,333,0)`. Agora, podemos reexecutar o Echidna: + +```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 + +``` + +Desta vez, constatou que a propriedade é violada imediatamente. + +## Localizando transações com alto consumo de gas {#finding-transactions-with-high-gas-consumption} + +Veremos como encontrar as transações com alto consumo de gas com o Echidna. O alvo é o seguinte contrato inteligente: + +```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; + } + +} +``` + +Aqui `caro` pode ter um grande consumo de gas. + +Atualmente, Echidna sempre precisa de uma propriedade para testar: aqui `echidna_test` sempre retorna `true`. Podemos executar o Echidna para verificar isto: + +``` +echidna-test gas.sol +... +echidna_test: passed! 🎉 + +Seed: 2320549945714142710 +``` + +### Medição do consumo de gas {#measuring-gas-consumption} + +Para habilitar o consumo de gas com Echidna, crie um arquivo de configuração `config.yaml`: + +```yaml +estimateGas: true +``` + +Neste exemplo, também reduziremos o tamanho da sequência de transações para facilitar a compreensão dos resultados: + +```yaml +seqLen: 2 +estimateGas: true +``` + +### Executando Echidna {#run-echidna-3} + +Assim que tivermos o arquivo de configuração criado, poderemos executar o Echidna assim: + +```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 + +``` + +- O gas mostrado é um cálculo fornecido por [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-). + +### Filtrando Chamadas com Redução de Gas {#filtering-out-gas-reducing-calls} + +O tutorial sobre **funções de filtragem para chamar durante uma campanha de difusão** acima mostra como remover algumas funções de seu teste. +Isso pode ser fundamental para obter uma estimativa de gas precisa. Considere o seguinte exemplo: + +```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; + } +} +``` + +Se Echidna pode chamar todas as funções, ele não encontrará facilmente transações com alto custo de gas: + +``` +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 +``` + +Isso porque o custo depende do tamanho dos `addrs` e chamadas aleatórias tendem a deixar o array quase vazio. Lista negra `pop` e `limpa`, no entanto, nos dá resultados muito melhores: + +```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 +``` + +### Localizando transações com alto consumo de gás {#summary-finding-transactions-with-high-gas-consumption} + +Echidna pode encontrar transações com alto consumo de gás usando a opção de configuração `estimateGas`: + +```yaml +estimateGas: true +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +Echidna irá relatar uma sequência com o consumo máximo de gas para cada função, uma vez terminada a campanha de fuzzing. diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..3382b47b034 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -0,0 +1,514 @@ +--- +title: Como usar o Manticore para encontrar bugs em contratos inteligentes +description: Como usar o Manticore para encontrar bugs automaticamente em contratos inteligentes +author: Trailofbits +lang: pt-br +tags: + - "solidez" + - "smart contracts" + - "segurança" + - "testando" + - "verificação formal" +skill: advanced +published: 2020-01-13 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore +--- + +O objetivo deste tutorial é mostrar como usar o Manticore para encontrar bugs em contratos inteligentes automaticamente. + +## Instalação {#installation} + +Manticore requer >= python 3.6. Pode ser instalado pelo pip ou usando o docker. + +### Manticore através do Docker {#manticore-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_O último comando roda a eth-security-toolbox em um docker que tem acesso ao seu diretório atual. Você pode alterar os arquivos do seu host e executar as ferramentas nos arquivos através do docker_ + +Dentro do docker, execute: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### Manticore através do pip {#manticore-through-pip} + +```bash +pip3 install --user manticore +``` + +solc 0.5.11 é recomendado. + +### Executando um script {#running-a-script} + +Para executar um script python com python 3: + +```bash +python3 script.py +``` + +## Introdução à execução simbólica dinâmica {#introduction-to-dynamic-symbolic-execution} + +### Execução Simbólica Dinâmica em uma Nutshell {#dynamic-symbolic-execution-in-a-nutshell} + +A execução simbólica dinâmica (DSE) é uma técnica de análise de programa que explora um espaço de estado com um alto grau de consciência semântica. Esta técnica baseia-se na descoberta de "caminhos do programa", representados como fórmulas matemáticas chamadas de `predicados de caminho`. Conceitualmente, esta técnica opera em predicados de caminho em dois passos: + +1. Eles são construídos usando restrições na entrada de dados do programa. +2. Eles são usados para gerar entradas no programa que farão com que os caminhos associados sejam executados. + +Esta abordagem não produz falsos positivos no sentido de que todos os estados identificados do programa podem ser acionados durante a execução concreta. Por exemplo, se a análise encontrar um integer overflow, é certo que será reproduzível. + +### Exemplo de Predicado do Caminho {#path-predicate-example} + +Para se ter uma idéia de como o DSE funciona, considere o seguinte exemplo: + +```solidity +function f(uint a){ + + if (a == 65) { + // Um bug está presente + } + +} +``` + +Como `f()` contém dois caminhos, uma DSE construirá dois caminhos diferentes atribuídos: + +- Caminho 1: `a == 65` +- Caminho 2: `Not (a == 65)` + +Cada caminho atribuido é uma fórmula matemática que pode ser dada a uma chamada [SMT solver](https://wikipedia.org/wiki/Satisfiability_modulo_theories), que tentará resolver a equação. Para o `Caminho 1`, o solver dirá que o caminho pode ser explorado com `a = 65`. Para o `Caminho 2`, o solver pode dar para `a` qualquer valor diferente de 65, por exemplo, `a = 0`. + +### Verificando propriedades {#verifying-properties} + +A Manticore permite um controle total sobre toda a execução de cada caminho. Como resultado, permite que você adicione restrições arbitrárias a quase qualquer coisa. Este controle permite a criação de propriedades no contrato. + +Considere o seguinte exemplo: + +```solidity +function unsafe_add(uint a, uint b) returns(uint c){ + c = a + b; // no overflow protection + return c; +} +``` + +Aqui há apenas um caminho para explorar na função: + +- Caminho 1: `c = a + b` + +Usando o Manticore, você pode verificar se há overflow, e adicionar restrições à previsão do caminho: + +- `c = a + b AND (c < a OR c < b)` + +Se é possível encontrar uma avaliação de `um` e `b` para a qual o caminho predicado acima é viável, significa que encontrou um transbordamento ("overflow"). Por exemplo, o solver pode gerar a entrada `a = 10 , b = MAXUINT256`. + +Se você considerar uma versão fixa: + +```solidity +function safe_add(uint a, uint b) returns(uint c){ + c = a + b; + require(c>=a); + require(c>=b); + return c; +} +``` + +A fórmula associada com verificação de overflow seria: + +- `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)` + +Esta fórmula não pode ser resolvida; em outras palavras, esta é uma **prova** que em `safe_add`, `c` irá sempre aumentar. + +DSE é assim uma ferramenta poderosa, que pode verificar restrições arbitrárias no seu código. + +## Executando sob Manticore {#running-under-manticore} + +Veremos como explorar um contrato inteligente com a API Manticore. O alvo é o seguinte contrato inteligente [`exemplo.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(); + } + } +} +``` + +### Executar uma exploração independente {#run-a-standalone-exploration} + +Você pode executar a Manticore diretamente no contrato inteligente pelo seguinte comando (`projeto` pode ser um Arquivo Solidity, ou um diretório de projeto): + +```bash +$ manticore project +``` + +Você obterá a saída de casos de teste como este (a ordem pode mudar): + +``` +... +... 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 +... +``` + +Sem informações adicionais, Manticore explorará o contrato com novas transações simbólicas até que não explore novos caminhos do contrato. Manticore não executa novas transações após uma falha (por exemplo: após um reversão). + +Manticore irá gerar as informações em um diretório `mcore_*`. Entre outros, você encontrará nesse diretório: + +- `global.summary`: cobertura e avisos do compilador +- `test_XXXXX.summary`: cobertura, última instrução, saldos de conta por caso de teste +- `test_XXXXX.tx`: lista detalhada de transações por caso de teste + +Aqui, Manticore encontrou 7 casos de teste, que correspondem à (a ordem do nome do arquivo pode mudar): + +| | Transação 0 | Transação 1 | Transação 2 | Resultado | +|:--------------------:|:-------------------:|:----------------------:| ---------------------- |:---------:| +| **test_00000000.tx** | Criação de contrato | f(!=65) | f(!=65) | STOP | +| **test_00000001.tx** | Criação de contrato | função de contingência | | REVERT | +| **test_00000002.tx** | Criação de contrato | | | RETURN | +| **test_00000003.tx** | Criação de contrato | f(65) | | REVERT | +| **test_00000004.tx** | Criação de contrato | f(!=65) | | STOP | +| **test_00000005.tx** | Criação de contrato | f(!=65) | f(65) | REVERT | +| **test_00000006.tx** | Criação de contrato | f(!=65) | função de contingência | REVERT | + +_Resumo da exploração f(!=65) denota f chamado com qualquer valor diferente de 65._ + +Como você pode perceber, Manticore gera um caso de teste único para cada transação bem sucedida ou revertida. + +Use a flag `--quick-mode` se você quiser uma exploração rápida de código (ele desativa detectores de bugs, cálculo de gas, ...) + +### Manipule um contrato inteligente através da API {#manipulate-a-smart-contract-through-the-api} + +Esta seção descreve detalhes sobre como manipular um contrato inteligente através da API Manticore Python. Você pode criar um novo arquivo com a extensão python `*. y` e escreva o código necessário adicionando os comandos da API (básicos dos quais serão descritos abaixo) neste arquivo e então execute-o com o comando `$ python3 *. a`. Também você pode executar os comandos abaixo diretamente no console python, para executar o console use o comando `$ python3`. + +### Criando Contas {#creating-accounts} + +A primeira coisa que você deve fazer é iniciar uma nova blockchain com os seguintes comandos: + +```python +from manticore.ethereum import ManticoreEVM +``` + +Uma conta de não-contrato é criada usando [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account): + +```python +user_account = m.create_account(balance=1000) +``` + +Um contrato de Solidity pode ser implantado usando [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract): + +```solidity +source_code = ''' +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +''' +# Iniciar o contrato +contract_account = m.solidity_create_contract(source_code, owner=user_account) +``` + +#### Resumo {#summary} + +- Você pode criar contas de usuário e contratos com [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) and [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract). + +### Executando transações {#executing-transactions} + +Manticore suporta dois tipos de transação: + +- Transação bruta: todas as funções são exploradas +- Transação nomeada: apenas uma função é explorada + +#### Transação bruta {#raw-transaction} + +Uma transação bruta é executada usando [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction): + +```python +m.transaction(caller=user_account, + address=contract_account, + data=data, + value=value) +``` + +O chamador, o endereço, os dados ou o valor da transação pode ser concreto ou simbólico: + +- [m.make_symbollic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) cria um valor simbólico. +- [m.make_symbollic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) cria um valor simbólico "byte array". + +Por exemplo: + +```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 +``` + +Se os dados forem simbólicos, Manticore irá explorar todas as funções do contrato durante a execução da transação. Será útil ver a explicação de Função de Fallback nas [Mãos do CTF Ethernaut](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/), artigo para entender como a seleção de função funciona. + +#### Transação nomeada {#named-transaction} + +Funções podem ser executadas através de seu nome. Para executar `f(uint var)` com um valor simbólico, do user_account, e com 0 ether, use: + +```python +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var, caller=user_account, value=0) +``` + +Se `valor` da transação não for especificado, ela é 0 por padrão. + +#### Resumo {#summary-1} + +- Os argumentos de uma transação podem ser concretos ou simbólicos +- Uma transação bruta irá explorar todas as funções +- A função pode ser chamada pelo nome + +### Espaço de trabalho {#workspace} + +`m.workspace` é o diretório usado como diretório de saída para todos os arquivos gerados: + +```python +print("Results are in {}".format(m.workspace)) +``` + +### Terminar a Exploração {#terminate-the-exploration} + +Para parar a exploração, use [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). Nenhuma transação adicional deve ser enviada quando este método for chamado e a Manticore gerar casos de teste para cada caminho explorado. + +### Resumo: Executando sob Manticore {#summary-running-under-manticore} + +Juntando todos os passos anteriores, obtemos: + +```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("Results are in {}".format(m.workspace)) +m.finalize() # stop the exploration +``` + +Todo o código acima você pode encontrar no [`exemple_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) + +## Obtendo caminhos {#getting-throwing-paths} + +Agora vamos gerar entradas específicas para os caminhos levantando uma exceção em `f()`. O alvo é ainda o seguinte contrato inteligente [`exemplo.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(); + } + } +} +``` + +### Usando informações do estado {#using-state-information} + +Cada caminho executado tem seu estado de blockchain. Um estado ou está pronto ou é morto, o que significa que atinge um caminho de THROW ou REVERT: + +- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): a lista de estados que estão prontos (não executaram um REVERT/INVALID) +- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): a lista de estados que estão mortos +- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): todos os estados + +```python +for state in m.all_statees: + # faz algo com estado +``` + +Você pode acessar informações de estado. Por exemplo: + +- `state.platform.get_balance(account.address)`: o saldo da conta +- `state.platform.transactions`: a lista de transações +- `state.platform.transactions[-1].return_data`: os dados retornados pela última transação + +Os dados retornados pela última transação são um array, que pode ser convertido para um valor com ABI.deserialize, por exemplo: + +```python +data = state.platform.transactions[0].return_data +data = ABI.deserialize("uint", data) +``` + +### Como gerar caixa de teste {#how-to-generate-testcase} + +Use [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) para gerar a caixa de teste: + +```python +m.generate_testcase(estado, 'BugFound') +``` + +### Resumo {#summary-2} + +- Você pode iterar sobre o estado com m.all_states +- `state.platform.get_balance(account.address)` retorna o saldo da conta +- `state.platform.transactions` retorna a lista de transações +- `Transtion.return_data` são os dados retornados +- `m.generate_testcase(state, name)` gera entradas para o estado + +### Resumo: Obtendo o caminho de lançamento {#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) + +## Verificando se a execução termina com um REVERT ou INVALID +for state in m.terminated_states: + last_tx = state.platform.transactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + print('Throw found {}'.format(m.workspace)) + m.generate_testcase(state, 'ThrowFound') +``` + +Todo o código acima você pode encontrar no [`exemple_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) + +_Note que poderíamos ter gerado um script muito mais simples, como todos os estados retornados por terminated_state REVERT ou INVALID no seu resultado: este exemplo foi destinado apenas para demonstrar como manipular a API._ + +## Adicionar Restrições {#adding-constraints} + +Veremos como restringir a exploração. Vamos fazer a suposição de que a documentação de `f()` que afirma que a função nunca é chamada com `a == 65`, então qualquer erro com `a == 65` não é um bug de verdade. O alvo é o seguinte contrato inteligente [`exemplo.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(); + } + } +} +``` + +### Operadores {#operators} + +O módulo [Operadores](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) facilita a manipulação de restrições, entre outras que fornece: + +- Operadores.AND, +- Operadores.OR, +- Operators.UGT (não assinado maior que), +- Operators.UGE (não assinado maior ou igual a), +- Operators.UGT (não assinado menor que), +- Operators.ULE (menor que ou igual a). + +Para importar o módulo use o seguinte: + +```python +from manticore.core.smtlib import Operators +``` + +`Operators.CONCAT` é usado para concatenar uma matriz a um valor. Por exemplo, o return_data de uma transação precisa ser alterado para um valor a ser verificado contra outro valor: + +```python +last_return = Operators.CONCAT(256, *last_return) +``` + +### Restrições {#state-constraint} + +Você pode usar restrições globalmente ou para um estado específico. + +#### Restrição global {#state-constraint} + +Use `m.constrain(constraint)` para adicionar um constraint ("restrição") global. Por exemplo, você pode chamar um contrato de um endereço simbólico e restringir este endereço para serem valores específicos: + +```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) +``` + +#### Restrição de estado {#state-constraint} + +Use o estado de [. onstrain(restrição)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) para adicionar uma restrição a um estado específico. Ele pode ser usado para restringir o estado após sua exploração para verificar alguma propriedade nele. + +### Verificando a constraint ("restrição") {#checking-constraint} + +Use `solver.check(state.constraints)` para saber se uma restrição ainda é viável. Por exemplo, o seguinte irá restringir o simbolic_valor para ser diferente do 65 e verificar se o estado ainda é viável: + +```python +state.constrain(symbolic_var != 65) +if solver.check(state.constraints): + # estado é viável +``` + +### Resumo: Adicionando constraints ("restrições") {#summary-adding-constraints} + +Adicionando constraints ("restrições") ao código anterior, obtemos: + +```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 + +## Verificar se a execução termina com um REVERT ou INVALID +for state in m.terminated_states: + last_tx = state.platform.transactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + # we do not consider the path were a == 65 + condition = symbolic_var != 65 + if m.generate_testcase(state, name="BugFound", only_if=condition): + print(f'Bug found, results are in {m.workspace}') + no_bug_found = False + +if no_bug_found: + print(f'No bug found') +``` + +Todo o código acima você pode encontrar no [`exemple_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..b9ac9dc2118 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -0,0 +1,238 @@ +--- +title: Como utilizar o Slither para encontrar bugs nos contratos inteligentes +description: Como usar o Slither para encontrar automaticamente bugs em contratos inteligentes +author: Trailofbits +lang: pt-br +tags: + - "solidity" + - "smart contracts" + - "segurança" + - "testando" + - "análise estática" +skill: advanced +published: 2020-06-09 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither +--- + +## Como usar o Slither {#how-to-use-slither} + +O objetivo deste tutorial é mostrar como usar o Slither para localizar automaticamente bugs em contratos inteligentes. + +- [Instalação](#installation) +- [Uso da linha de comando](#command-line) +- [Introdução à análise estática](#static-analysis): Breve introdução à análise estática +- [API](#api-basics): Descrição da API Python + +## Instalação {#installation} + +O Slither requer a versão 3.6 do Python ou superior. Pode ser instalado pelo pip ou usando o docker. + +Slither via pip: + +```bash +pip3 install --user slither-analyzer +``` + +Slither através de docker: + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox +``` + +_O último comando roda a eth-security-toolbox em um docker que tem acesso ao seu diretório atual. Você pode alterar os arquivos do seu host e executar as ferramentas nos arquivos através do docker_ + +Dentro do docker, execute: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### Executando um script {#running-a-script} + +Para executar um script python com python 3: + +```bash +python3 script.py +``` + +### Linha de comando {#command-line} + +**Linha de comando versus scripts definidos pelo usuário.** O Slither vem com um conjunto de detectores predefinidos que encontram muitos bugs comuns. Chamar o Slither na linha de comando irá executar todos os detectores. Nenhum conhecimento detalhado da análise estática é necessária: + +```bash +slither project_paths +``` + +Além de detectadores, o Slither possui recursos de revisão de código através de suas [printers](https://github.com/crytic/slither#printers) e [ferramentas](https://github.com/crytic/slither#tools). + +Use [crytic.io](https://github.com/crytic) para obter acesso a detectadores privados e integração GitHub. + +## Análise estática {#static-analysis} + +Os recursos e design do framework estático de análise do Slither foram descritos nos posts de blog ([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/)) e em um [documento acadêmico](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf). + +A análise estática existe em diferentes "flavors". Você provavelmente percebe que compiladores como [clang](https://clang-analyzer.llvm.org/) e [gcc](https://lwn.net/Articles/806099/) dependem destas técnicas de pesquisa, mas também sustenta ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) e ferramentas baseadas em métodos formais como [Frama-C](https://frama-c.com/) e [Polyspace](https://www.mathworks.com/products/polyspace.html). + +Nós não analisaremos exaustivamente técnicas de análise estática e pesquisador aqui. Em vez disso, vamos focar no que é necessário para entender como o Slither funciona para que você possa usá-lo de forma mais eficiente para encontrar bugs e entender códigos. + +- [Representação de código](#code-representation) +- [Análise de código](#analysis) +- [Representação intermediária](#intermediate-representation) + +### Representação de código {#code-representation} + +Em contraste com uma análise dinâmica, que justifica um único caminho de execução, razões de análise estática sobre todos os caminhos ao mesmo tempo. Para isso, ele depende de uma representação diferente do código. As duas mais comuns são a árvore de sintaxe abstrata (AST) e o gráfico de fluxo de controle (CFG). + +### Árvores de sintaxe abstratas (AST) {#abstract-syntax-trees-ast} + +AST é usado toda vez que o compilador analisa o código. É provavelmente a estrutura mais básica sobre a qual se pode efetuar a análise estática. + +Em poucas palavras, a AST é uma árvore estruturada onde, normalmente, cada folha contém uma variável ou uma constante e os nós internos são operações ou operações de fluxo de controle. Considere o seguinte código: + +```solidity +function safeAdd(uint a, uint b) pure internal returns(uint){ + if(a + b <= a){ + revert(); + } + return a + b; +} +``` + +O AST correspondente é mostrado em: + +![AST](./ast.png) + +O Slither usa o AST exportado pelo solc. + +Enquanto for simples construir, o AST é uma estrutura aninhada. Por vezes, esta não é a mais simples de analisar. Por exemplo, para identificar as operações usadas pela expressão `a + b <= a`,, primeiro você deve analisar `<=` e, em seguida, `+`. Uma abordagem comum é usar o chamado padrão de visitantes, que navega pela árvore recursivamente. O Slither contém um visitante genérico em [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). + +O código a seguir usa `ExpressionVisitor` para detectar se a expressão contém uma adição: + +```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 is the expression to be tested +print(f'The expression {expression} has a addition: {visitor.result()}') +``` + +### Controlar Gráfico de Fluxos (CFG) {#control-flow-graph-cfg} + +A segunda representação de código mais comum é o gráfico de fluxo de controle (CFG). Como seu nome sugere, é uma representação baseada em gráficos que expõe todos os caminhos de execução. Cada nó contém uma ou várias instruções. Bordas no gráfico representam as operações de fluxo de controle (se/então/outra vez, loop, etc). O nosso exemplo anterior é o do CFG: + +![CFG](./cfg.png) + +O CFG é a representação que está por cima da qual se constrói a maioria das análises. + +Existem muitas outras representações de código. Cada representação tem vantagens e desvantagens de acordo com a análise que você deseja realizar. + +### Análise {#analysis} + +O tipo mais simples de análises que você pode realizar com o Slither são análises sintáticas. + +### Análises de sintaxe {#syntax-analysis} + +O Slither pode navegar através dos diferentes componentes do código e sua representação para encontrar inconsistências e falhas usando uma abordagem semelhante a padrões de correspondência. + +Por exemplo, os seguintes detectores procuram por problemas relacionados à sintaxe: + +- [State variable shadowing](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): itera sobre todas as variáveis de estado e verifica se tem alguma variável "shadow" de um contrato herdado ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) + +- [Interface ERC20 incorreta](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): procurar por assinaturas de função ERC20 incorretas ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) + +### Análise semântica {#semantic-analysis} + +Em contraste com a análise de sintaxe, uma análise semântica vai aprofundar e analisar o "significado" do código. Esta família inclui vários tipos de análises. Conduzem a resultados mais poderosos e úteis, mas são também mais complexos de escrever. + +Análises semânticas são usadas para detecções de vulnerabilidades mais avançadas. + +#### Análise de dependência de dados {#fixed-point-computation} + +Uma variável `variable_a` diz ser dependente de dados `variable_b` se houver um caminho para o qual o valor de `variable_a` seja influenciado pela `variable_b`. + +No código a seguir, `variable_a` depende de `variable_b`: + +```solidity +// ... +variable_a = variable_b + 1; +``` + +O Slither vem com capacidades embutidas de [dependência de dados,](https://github.com/crytic/slither/wiki/data-dependency) graças à sua representação intermediária (discutida em uma seção posterior). + +Um exemplo de uso de dependência de dados pode ser encontrado em ["dangerous strict equality detector"](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Aqui o Slither procurará por uma comparação rigorosa de igualdade com um valor perigoso ([incorrect_strict_equality. y#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)), e informará o usuário que deve usar `>=` ou `<=` ao invés de `==`para evitar um invasor para prender o contrato. Entre outros, o detector considerará como perigoso o valor de retorno de uma chamada para o `balanceOf(endereço)` ([incorrect_strict_equality. y#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)), e usará o mecanismo de dependência de dados para rastrear seu uso. + +#### Cálculo de ponto fixo {#fixed-point-computation} + +Se a sua análise navegar através do CFG e seguir as bordas, é provável que você veja os nós já visitados. Por exemplo, se um loop é apresentado como mostrado abaixo: + +```solidity +for(uint i; i < range; ++){ + variable_a += 1 +} +``` + +A sua análise terá de saber quando parar. Existem duas estratégias principais aqui: (1) iterar em cada nó um número finito de vezes, (2) calcular um chamado _fixpoint_. Um ponto de acesso basicamente significa que a análise deste nó não fornece nenhuma informação significativa. + +Um exemplo de fixpoint usado pode ser encontrado nos detectadores de reentrância: Slither explora os nós, e procurar por chamadas externas, escrever e ler para armazenar. Uma vez que chegou a um ponto de correção ("fixpoint") ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), interrompe a exploração e analisa os resultados para ver se uma reentrância está presente, através de diferentes padrões de reentrada ([reentrancy_benign. y](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)). + +Escrever análises usando um cálculo de ponto fixo eficiente requer um bom entendimento de como a análise propaga sua informação. + +### Representação intermediária {#intermediate-representation} + +Uma representação intermediária (IR) é uma linguagem que deve ser mais acessível à análise estática do que a original. Slither traduz Solidity para seu próprio IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). + +Compreender o SlithIR não é necessário se você quiser apenas escrever verificações básicas. No entanto, será útil se você planejar escrever análises semânticas avançadas. As [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) e [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa)printers irão ajudá-lo a entender como o código é traduzido. + +## API Básica {#api-basics} + +Slither tem uma API que permite explorar os atributos básicos do contrato e suas funções. + +Carregando um codebase: + +```python +from slither import Slither +slither = Slither('/path/to/project') + +``` + +### Explorando contratos e funções {#exploring-contracts-and-functions} + +Um objeto `Slither` contém: + +- contracts`contracts (list(Contract)`: lista de contratos +- `contracts_derived (list(Contract)`: lista de contratos que não são herdados por outro contrato (subconjunto de contratos) +- `get_contract_from_name (str)`: Retorna um contrato a partir de seu nome + +Um objeto `Slither` contém: + +- `name (str)`: Nome do contrato +- `functions (list(Function))`: Lista de funções +- `modifiers (list(Modifier))`: Lista de funções +- `all_functions_called (list(Função/Modificador))`: Lista de todas as funções internas acessíveis pelo contrato +- `herança (lista(contrato))`: Lista de contratos herdados +- `get_function_from_signature (str)`: Retorna uma função a partir de sua assinatura +- `get_function_from_signature (str)`: Retorna uma função a partir de sua assinatura +- `get_contract_from_name (str)`: Retorna um contrato a partir de seu nome + +Um objeto `Function` ou `Modifier` têm: + +- `name (str)`: Nome da função +- `contract (contract)`: o contrato onde a função é declarada +- `nodes (list(Node))`: Lista dos nós que compõem o CFG da função/modificador +- `entry_point (Node)`: Ponto de entrada do CFG +- `variables_read (list(variável))`: Lista de variáveis lidas +- `variables_written (list(variável))`: Lista de variáveis escritas +- `state_variables_read (list(StateVariable))`: Lista de variáveis de estado lidas (subconjunto de variáveis lidas) +- `state_variables_written (list(StateVariable))`: Lista de variáveis de estado escritas (subconjunto de variáveis escritas) diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md new file mode 100644 index 00000000000..2dae6657637 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -0,0 +1,84 @@ +--- +title: Como configurar Tellor como seu Oráculo +description: Um guia para começar a integrar o oráculo Tellor ao seu protocolo +author: "Tellor" +lang: pt-br +tags: + - "solidity" + - "contratos inteligentes" + - "oráculos" +skill: intermediate +published: 2021-06-29 +source: Documentação Tellor +sourceUrl: https://docs.tellor.io/tellor/ +--- + +Pop Quiz: Seu protocolo está quase pronto, mas precisa de um oráculo para obter acesso aos dados off-chain... O que você faz? + +## (Soft) Pré-requisitos {#soft-prerequisites} + +Esse texto tem como objetivo tornar o acesso a um conjunto de dados através do uso de um oráculo o mais simples e direto possível. Dito isso, estamos assumindo o seguinte sobre seu nível de habilidade de codificação para focar no aspecto do oráculo. + +Suposições: + +- você pode navegar em um terminal +- você tem o npm instalado +- você sabe como usar o npm para gerenciar dependências + +Tellor é um oráculo vivo e de código aberto pronto para implementação. Este guia para iniciantes está aqui para mostrar a facilidade com que se pode começar a trabalhar com Tellor, fornecendo ao seu projeto um oráculo totalmente descentralizado e resistente à censura. + +## Visão geral {#overview} + +Tellor é um sistema de oráculo onde as partes podem solicitar o valor de um ponto de dados off-chain (por exemplo, BTC/USD) e os repórteres (nós ou participantes) competem para adicionar esse valor a um banco de dados on-chain, acessível por todos os contratos inteligentes do Ethereum. As entradas para este banco de dados são asseguradas por uma rede de repórteres participantes. Tellor utiliza mecanismos de incentivo cripto-econômico, recompensando envios de dados honestos por repórteres e punindo maus atores por meio da emissão do token Tellor, Tributos (TRB) e um mecanismo de disputa. + +Neste tutorial, nós iremos ver: + +- Configurar o kit de ferramentas inicial, que você precisará para começar a trabalhar. +- Percorra por um exemplo simples. +- Listar os endereços de teste das redes as quais você pode testar o Tellor atualmente. + +## UsingTellor {#usingtellor} + +A primeira coisa que você vai querer fazer é instalar as ferramentas básicas necessárias para usar o Tellor como seu oráculo. Use [este pacote](https://github.com/tellor-io/usingtellor) para instalar os contratos de usuário do Tellor: + +`npm install usingtellor` + +Uma vez instalado, isso permitirá que seus contratos herdem as funções do contrato 'UsingTellor'. + +Excelente! Agora que você tem as ferramentas prontas, vamos passar por um simples exercício onde recuperamos o preço do bitcoin: + +### Exemplo BTC/USD {#btcusd-example} + +Herde o contrato UsingTellor, passando o endereço do Tellor como um argumento do construtor: + +Aqui está um exemplo: + +```solidity +import "usingtellor/contracts/UsingTellor.sol"; + +contract PriceContract is UsingTellor { + uint256 public btcPrice; + + //This Contract now has access to all functions 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)); + } +} +``` + +Para uma lista completa de endereços de contrato, consulte [aqui](https://docs.tellor.io/tellor/the-basics/contracts-reference). + +Para facilidade de uso, o repositório UsingTellor vem com uma versão do contrato [Tellor Playground](https://github.com/tellor-io/TellorPlayground) para facilitar a integração. Consulte [aqui](https://github.com/tellor-io/sampleUsingTellor#tellor-playground) para obter uma lista de funções úteis. + +Para uma implementação mais robusta do oráculo Tellor, confira a lista completa de funções, disponíveis [aqui](https://github.com/tellor-io/usingtellor/blob/master/README.md). diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-view-nft-in-metamask/index.md index c5a4eaf33c3..3171780741b 100644 --- a/public/content/translations/pt-br/developers/tutorials/how-to-view-nft-in-metamask/index.md +++ b/public/content/translations/pt-br/developers/tutorials/how-to-view-nft-in-metamask/index.md @@ -1,12 +1,12 @@ --- title: Como ver seu NFT na sua carteira (Parte 3/3 da série de tutorial sobre NFT) -description: Este tutorial descreve como visualizar um NFT existente no MetaMask! +description: This tutorial describes how to view an existing NFT on MetaMask! author: "Sumi Mudgil" tags: - "ERC-721" - "Alchemy" - "Solidity" -skill: beginner +skill: intermediate lang: pt-br published: 2021-04-22 --- @@ -17,15 +17,15 @@ Parabéns! Você chegou à parte mais curta e simples da nossa série de tutoria Como pré-requisito, você já deve ter MetaMask instalado no celular e deve incluir a conta para a qual você cunhou seu NFT. Você pode obter o aplicativo gratuitamente no [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) ou [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US). -## Passo 1: Definir a sua rede como Goerli {#set-network-to-goerli} +## Passo 1: Defina sua rede para Sepolia {#set-network-to-sepolia} -No topo do aplicativo, pressione o botão "Wallet". Em seguida, você será solicitado a selecionar uma rede. Como o nosso NFT foi cunhado na rede Goerli, selecione Goerli como a sua rede. +No topo do aplicativo, pressione o botão "Wallet". Em seguida, você será solicitado a selecionar uma rede. Como nosso NFT foi cunhado na rede Sepolia, você deverá selecionar Sepolia como sua rede. -![Como definir a Goerli como sua rede na MetaMask Mobile](./goerliMetamask.gif) +![Como definir Sepolia como sua rede no MetaMask Mobile](./goerliMetamask.gif) ## Passo 2: Adicionar o seu colecionável ao MetaMask {#add-nft-to-metamask} -Assim que você estiver na rede Goerli, selecione a guia "Colecionáveis" na direita e adicione o endereço do contrato inteligente do NFT e o ID do token ERC-721 correspondente, que você deve encontrar no Etherscan com base no hash de transação do seu NFT, como visto na Parte II do nosso tutorial. +Quando estiver na rede Sepolia, selecione a guia “Colecionáveis” à direita e adicione o endereço do contrato inteligente NFT e o ID do token ERC-721 do seu NFT - o qual você poderá encontrar no Etherscan com base no hash da transação do seu NFT implantado na Parte II do nosso tutorial. ![Como encontrar seu hash de transação e o ID do token ERC-721](./findNFTEtherscan.png) diff --git a/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md index f2727475e78..1419b4d33c0 100644 --- a/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md +++ b/public/content/translations/pt-br/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -7,7 +7,7 @@ tags: - "Alchemy" - "Solidity" - "contratos inteligentes" -skill: beginner +skill: intermediate lang: pt-br published: 2021-04-22 --- @@ -16,7 +16,7 @@ Com os NFTs trazendo a blockchain aos olhos do público, agora é uma excelente A Alchemy tem muito orgulho por estar no espaço NFT com os maiores nomes incluindo Makersplace (recentemente atingiu a marca de 69 milhões de doláres em vendas de artes digitais), Dapper Labs (criadores do NBA Top Shot e Crypto Kitties), OpenSea (o maior mercado de NFT do mundo), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable e muito mais. -Neste tutorial, veremos como criar e implantar um contrato inteligente ERC-721 na rede de teste Goerli usando [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) e [Alchemy](https://alchemy.com/signup/eth) (não se preocupe se você não entender o que isso significa — vamos explicar!). +Neste tutorial, nós vamos criar e implantar um contrato inteligente ERC-721 na rede de teste Sepolia usando [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) e [Alquimia](https://alchemy.com/signup/eth) (não se preocupe caso não entender o que tudo isso significa — explicaremos tudo!). Na parte 2 deste tutorial, veremos como podemos usar nosso contrato inteligente para gerar NFT, e na Parte 3, explicaremos como ver seu NFT no MetaMask. @@ -30,15 +30,15 @@ Neste tutorial, também aproveitaremos as ferramentas de desenvolvedor da Alchem ## Etapa 2: Criar seu aplicativo (e chave de API) {#make-api-key} -Assim que criar uma conta na Alchemy, você pode gerar uma chave de API criando um "app". Isso nos permitirá fazer solicitações na rede de teste Goerli. Confira [este guia](https://docs.alchemyapi.io/guides/choosing-a-network) se você está curioso para aprender mais sobre as redes de teste. +Assim que criar uma conta na Alchemy, você pode gerar uma chave de API criando um "app". Isso nos permitirá fazer solicitações à rede de teste Sepolia. Confira [este guia](https://docs.alchemyapi.io/guides/choosing-a-network) se você está curioso para aprender mais sobre as redes de teste. 1. Vá até a página "Create App" no painel da Alchemy, passe o mouse sobre a palavra "Apps" na barra de navegação e clique em "Create App" ![Crie seu aplicativo](./create-your-app.png) -2. Nomeie seu aplicativo (escolhemos “Meu primeiro NFT!”), faça uma breve descrição dele, selecione “Ethereum” para a cadeia e escolha “Goerli” para sua rede. Desde a fusão, as outras redes de teste foram descontinuadas. +2. Nomeie seu app (nós escolhemos “Meu primeiro NFT!”), ofereça uma breve descrição, selecione “Ethereum” para a rede e escolha “Sepolia” para sua rede. Desde a fusão, as outras redes de teste foram descontinuadas. -![Configure e publique seu aplicativo](./configure-and-publish-your-app.png) +![Configure e publique seu aplicativo](./alchemy-explorer-sepolia.png) 3. Clique em "Create App", e é isso e tudo! Seu app deveria aparecer na tabela abaixo. @@ -46,13 +46,13 @@ Assim que criar uma conta na Alchemy, você pode gerar uma chave de API criando Precisamos de uma conta Ethereum para enviar e receber transações. Para este tutorial, usaremos uma carteira virtual no navegador, a MetaMask, para gerenciar o endereço da sua conta Ethereum. Se você quiser entender mais sobre como as transações no Ethereum funcionam, confira [esta página](/developers/docs/transactions/) na Fundação Ethereum. -Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se já tiver uma conta, certifique-se de mudar para a “Rede de teste Goerli”, no canto superior direito (para que não estejamos lidando com dinheiro real). +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando você estiver criando uma conta, ou se você já tiver uma, certifique-se de mudar para a “Sepolia Test Network” no canto superior direito (para que não lidemos com dinheiro real). -![Defina Goerli como sua rede](./metamask-goerli.png) +![Defina Sepolia como sua rede](./metamask-goerli.png) ## Etapa 4: Adicionar ether de um faucet {#step-4-add-ether-from-a-faucet} -Para implementar nosso contrato inteligente na rede de teste, precisaremos de alguns ETHs de imitação. Para obter ETH, você pode acessar [Goerli Faucet](https://goerlifaucet.com/) hospedado pela Alchemy, fazer login e inserir o endereço da sua conta, clicar em "Send Me ETH". Você deveria ver o ETH na sua conta MetaMask logo depois! +Para implementar nosso contrato inteligente na rede de teste, precisaremos de alguns ETHs de imitação. Para obter ETH, você pode acessar a [Torneira da Sepolia](https://sepoliafaucet.com/) hospedada pela Alchemy, fazer login, inserir o endereço da sua conta e clicar em "Enviar-me ETH". Você deveria ver o ETH na sua conta MetaMask logo depois! ## Etapa 5: Verificar seu saldo {#check-balance} @@ -87,7 +87,7 @@ Não importa realmente como você responde às questões de instalação; aqui e author: license: (ISC) About to write to /Users/thesuperb1/Desktop/my-nft/package.json: - + { "name": "my-nft", "version": "1.0.0", @@ -234,14 +234,12 @@ Então crie um arquivo `.env` no diretório raiz do nosso projeto e adicione sua Seu arquivo `.env` ficará assim: - API_URL="https://eth-goerli.g.alchemy.com/v2/your-api-key" + API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key" PRIVATE_KEY="your-metamask-private-key" Para realmente conectá-las ao nosso código, referenciaremos essas variáveis em nosso arquivo hardhat.config.js na etapa 13. - -No faça commit do .env! Por favor, tenha certeza de nunca compartilhar ou expor seu arquivo .env com ninguém, pois estará comprometendo suas partes secretas ao fazê-lo. Se estiver usando um controle de versão, adicione seu .env ao arquivo gitignore. - + ## Etapa 12: Instalar o Ethers.js {#install-ethers} @@ -249,7 +247,7 @@ Ethers.js é uma biblioteca que facilita a interação e o envio de solicitaçõ Hardhat torna muito fácil a integração de [plugins](https://hardhat.org/plugins/), para ferramentas adicionais e funcionalidades extendidas. Aproveitaremos o [plugin Ethers](https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html) para implantação de contratos. ([Ethers.js](https://github.com/ethers-io/ethers.js/) tem alguns métodos de implantação de contratos bastante claros). -No diretório do seu projeto, digite: +No diretório do projeto, digite: npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0 @@ -269,10 +267,10 @@ Atualize seu hardhat.config.js para ficar assim: const { API_URL, PRIVATE_KEY } = process.env; module.exports = { solidity: "0.8.1", - defaultNetwork: "goerli", + defaultNetwork: "sepolia", networks: { hardhat: {}, - goerli: { + sepolia: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`] } @@ -287,7 +285,7 @@ Na linha de comando, execute: npx hardhat compile -Você pode receber o aviso "SPDX license identifier not provided in source file", mas não há necessidade de se preocupar com isso. Esperamos que tudo mais esteja bem! Se não, você sempre pode enviar uma mensagem no [discord Alchemy](https://discord.gg/u72VCg3). +Você pode receber o aviso do identificador de licença SPDX não fornecido no arquivo fonte, mas não há necessidade de se preocupar com isso. Esperemos que tudo mais esteja bem! Se não, você sempre pode enviar uma mensagem no [discord Alchemy](https://discord.gg/u72VCg3). ## Etapa 15: Escrever nosso script de implantação {#write-deploy} @@ -317,7 +315,7 @@ A Hardhat fez um trabalho incrível ao explicar o que cada uma dessas linhas de const MyNFT = await ethers.getContractFactory("MyNFT"); -Uma ContractFactory em ethers.js é uma abstração usada para implantar novos contratos inteligentes, então, MyNFT aqui representa uma fábrica para instâncias do nosso contrato NFT. Ao usar o plug-in hardhat-ethers, as instâncias ContractFactory e Contract são conectadas ao primeiro signatário por padrão. +Uma ContractFactory em ethers.js é uma abstração usada para implantar novos contratos inteligentes, então a MyNFT aqui representa uma fábrica para instâncias do nosso contrato NFT. Ao usar o plug-in hardhat-ethers, as instâncias ContractFactory e Contract são conectadas ao primeiro signatário por padrão. const myNFT = await MyNFT.deploy(); @@ -327,26 +325,26 @@ Ao chamar deploy() em uma ContractFactory, a implantação se iniciará e retorn Finalmente estamos prontos para implantar o nosso contrato inteligente! Navegue de volta para a raiz do diretório do seu projeto e, na linha de comando, execute: - npx hardhat --network goerli run scripts/deploy.js + npx hardhat --network sepo lia run scripts/deploy.js Você deverá ver algo assim: Contrato implantado no endereço: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 -Se nós formos ao [Goerli etherscan](https://goerli.etherscan.io/) e procurarmos pelo endereço do nosso contrato, conseguiremos ver que ele foi implantado com sucesso. Se você não conseguir ver o endereço imediatamente, aguarde um momento, pois pode demorar algum tempo. A transação ficará parecida com isto: +Se nós formos ao [Sepolia etherscan](https://sepolia.etherscan.io/) e procurarmos o endereço do nosso contrato, poderemos ver que ele foi implantado com sucesso. Se você não puder ver o endereço imediatamente, por favor, aguarde um momento, pois pode levar algum tempo. A transação ficará parecida com isto: -![Veja o seu endereço de transação no Etherscan](./etherscan-goerli-contract-creation.png) +![Veja o seu endereço de transação no Etherscan](./etherscan-sepoila-contract-creation.png) O endereço do remetente (From) deve corresponder ao seu endereço da conta MetaMask e o endereço do destinatário (To) deve dizer "Contract Creation". Se clicarmos na transação, veremos o nosso endereço de contrato no campo "To": -![Veja o seu endereço de contrato no Etherscan](./etherscan-goerli-tx-details.png) +![Veja o seu endereço de contrato no Etherscan](./etherscan-sepolia-tx-details.png) Sim! Você acabou de implantar seu contrato inteligente NFT na cadeia Ethereum (testnet)! -Para entender o que está acontecendo nos bastidores, vamos navegar até a guia Explorer no [painel do Alchemy](https://dashboard.alchemyapi.io/explorer). Se você tem vários aplicativos Alchemy, certifique-se de filtrar por app e selecionar "MyNFT". +Para entender o que está acontecendo nos bastidores, vamos navegar até a guia Explorer no [painel do Alchemy](https://dashboard.alchemyapi.io/explorer). Se você tem vários aplicativos Alchemy certifique-se de filtrar por app e selecionar "MyNFT". ![Exibir chamadas feitas "em segundo plano" com o Explorer Dashboard do Alquimia](./alchemy-explorer-goerli.png) -Aqui você verá um punhado de chamadas JSON-RPC que Hardhat/Ethers fizeram em segundo plano para nós quando chamamos a função .deploy() . Duas chamadas importantes aqui são [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), que é o pedido para realmente escrever nosso contrato inteligente na cadeia Goerli e [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash) que é um pedido para ler informações sobre nossa transação, conforme o hash (um padrão típico ao enviar transações). Para saber mais sobre o envio de transações, confira [este tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sobre como enviar transações usando a Web3. +Aqui você verá um punhado de chamadas JSON-RPC que Hardhat/Ethers fizeram em segundo plano para nós quando chamamos a função .deploy() . Dois importantes pontos a destacar aqui são [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), que é a solicitação para realmente escrever nosso contrato inteligente na cadeia Sepolia, e [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash), que é uma solicitação para ler informações sobre nossa transação dado o hash (um padrão típico ao enviar transações). Para saber mais sobre o envio de transações, confira [este tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sobre como enviar transações usando a web3. Isso é tudo para a Parte 1 deste tutorial. Na [Parte 2, interagiremos com o nosso contrato inteligente cunhando um NFT](/developers/tutorials/how-to-mint-an-nft/), e na [Parte 3, mostraremos como ver o seu NFT na sua carteira Ethereum](/developers/tutorials/how-to-view-nft-in-metamask/)! diff --git a/public/content/translations/pt-br/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/pt-br/developers/tutorials/interact-with-other-contracts-from-solidity/index.md new file mode 100644 index 00000000000..53c8a1a6b79 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -0,0 +1,177 @@ +--- +title: Interaja com outros contratos de Solidity +description: Como implantar um contrato inteligente a partir de um contrato existente e interagir com ele +author: "jdourlens" +tags: + - "contratos Inteligentes" + - "solidity" + - "remix" + - "implementação" + - "componibilidade" +skill: advanced +lang: pt-br +published: 2020-04-05 +source: EthereumDev +sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Nos tutoriais anteriores, aprendemos muito [como publicar seu primeiro contrato inteligente](/developers/tutorials/deploying-your-first-smart-contract/) e adicionar alguns recursos a ele, como [controlar o acesso com modificadores](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) ou [manipulação de erros no Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). Neste tutorial, aprenderemos como implantar um contrato inteligente a partir de um contrato existente e interagir com ele. + +Faremos um contrato que permite a qualquer pessoa ter seu próprio contrato inteligente`Counter`, criando uma fábrica para ele. Seu nome será `CounterFactory`. De início, aqui está o código do nosso primeiro contrato inteligente `Counter`: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "You're not the owner of the contract"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "You need to use the factory"); + _; + } + + 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++; + } + +} +``` + +Note que modificamos ligeiramente o código do contrato para manter um controle do endereço da fábrica e do endereço do proprietário. Quando você chamar um código de contrato de outro contrato, o msg.sender irá consultar o endereço da nossa fábrica de contratos. Este é **um ponto muito importante para entender** como usar um contrato para interagir com outros contratos é uma prática comum. Você deve, portanto, cuidar de quem é o remetente em casos complexos. + +Para isso também adicionamos um modificador de `onlyFactory` que certifica-se de que a função de mudança de estado só pode ser chamada pela fábrica que passará o chamador original como um parâmetro. + +Dentro de nossa nova `CounterFactory` que gerenciará todos os outros Counters, adicionaremos um mapeamento que associará o proprietário ao endereço de seu contrato: + +```solidity +mapping(address => Counter) _counters; +``` + +Na Ethereum, o mapeamento é equivalente a objetos em Javascript. Eles permitem mapear uma chave do tipo A para um valor do tipo B. Neste caso, mapeamos o endereço de um proprietário com a instância de seu Counter. + +Instanciar um novo Counter para alguém ficará assim: + +```solidity + function createCounter() public { + require (_counters[msg.sender] == Counter(0)); + _counters[msg.sender] = new Counter(msg.sender); + } +``` + +Primeiro, verificamos se a pessoa já possui um Counter. Se ele não tem um Counter, instanciamos um novo Counter, passando seu endereço para o construtor `Counter` e atribuímos a instância recém-criada para o mapeamento. + +Para obter a contagem de um Counter específico, fica assim: + +```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)); +} +``` + +A primeira função verifica se o contrato do Counter existe para um determinado endereço e, em seguida, chama o método `getCount` a partir da instância. A segunda função: `getMyCount` é apenas um breve fim para passar a função msg.sender diretamente para a função `getCount`. + +A função `increment` é bastante parecida, mas passa o remetente da transação original para o contrato `Counter`: + +```solidity +function increment() public { + require (_counters[msg.sender] != Counter(0)); + Counter(_counters[msg.sender]).increment(msg.sender); + } +``` + +Observe que, se for chamado várias vezes, nosso contador poderá ser vítima de um transbordamento ("overflow"). Você deve usar a [biblioteca SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) tanto quanto possível para se proteger deste possível caso. + +Para implantar nosso contrato, você precisará fornecer tanto o código da `CounterFactory` quanto o `Counter`. Ao implantar, por exemplo, em Remix, você precisará selecionar a CounterFactory. + +Aqui está o código completo: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "You're not the owner of the contract"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "You need to use the factory"); + _; + } + + 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)); + } + +} +``` + +Depois de compilar, na seção de implante de Remix, você selecionará a fábrica a ser implantada: + +![Selecionando a fábrica a ser implantada no Remix](./counterfactory-deploy.png) + +Então você pode brincar com sua fábrica de contrato e verificar a mudança de valor. Se você prefere chamar o contrato inteligente a partir de um endereço diferente, altere o endereço na Conta selecionada do Remix. diff --git a/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md new file mode 100644 index 00000000000..d96aa4a5e30 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -0,0 +1,110 @@ +--- +title: Comece a desenvolver o front-end do seu dapp usando create-eth-app +description: Uma visão geral de como criar um aplicativo eth-app e seus recursos +author: "Markus Waas" +tags: + - "create-eth-app" + - "front-end" + - "javascript" + - "ethers.js" + - "o grafo" + - "defi" +skill: intermediate +lang: pt-br +published: 2020-04-27 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/create-eth-app +--- + +Da última vez, olhamos [para a grande imagem de Solidity](https://soliditydeveloper.com/solidity-overview-2020) e já mencionamos o app [create-eth-](https://github.com/PaulRBerg/create-eth-app). Agora você vai descobrir como usá-lo, quais recursos são integrados e ideias adicionais sobre como expandir sobre isso. Iniciado por Paul Razvan Berg, o fundador do [Sablier](http://sablier.com/), este aplicativo irá iniciar seu desenvolvimento de frontend e vem com várias integrações opcionais para escolher. + +## Instalação {#installation} + +A instalação requer Yarn 0.25 ou versão superior (`npm install yarn --global`). Ela é muito simples de executar: + +```bash +yarn create eth-app my-eth-app +cd my-eth-app +yarn react-app:start +``` + +Está usando [create-react-app](https://github.com/facebook/create-react-app) debaixo do "hood". Para ver sua aplicação, abra `http://localhost:3000/`. Quando você estiver pronto para implantar em produção, crie um pacote minificado com o build Yarn. Uma maneira fácil de hospedar isso seria [Netlify](https://www.netlify.com/). Você pode criar um repositório GitHub, adicioná-lo ao Netlify, configurar o comando build e pronto! Seu aplicativo será hospedado e utilizável para todos. E tudo isso gratuitamente. + +## Funcionalidades {#features} + +### React & create-react-app {#react--create-react-app} + +Primeiro de tudo o coração da aplicação: React e todas as funcionalidades adicionais que vêm com o _create-react-app_. Usar apenas essa é uma ótima opção se você não quiser integrar a Ethereum. O [React](https://reactjs.org/) torna a construção de interfaces de usuário interativas muito fácil. Ele pode não ser tão simples para iniciantes como o [Vue](https://vuejs.org/), mas ainda é o mais usado, tem mais recursos e, sobretudo, conta com milhares de opções de bibliotecas adicionais. O _create-react-app_ torna muito fácil começar com ele também e inclui: + +- React, JSX, ES6, TypeScript, Sintaxe Flow. +- Idioma extra além do ES6 como o operador de propagação de objetos. +- CSS prefixados automaticamente, para que você não precise de -webkit- ou outros prefixos. +- Um rápido corretor de teste de unidade interativa com suporte embutido para relatórios de cobertura. +- Um servidor de desenvolvimento dinâmico que avisa sobre erros comuns. +- Um script de compilação para empacotar JS, CSS e imagens para produção, com hashes e sourcemaps. + +O _create-eth-app_ em particular está usando novos [efeitos de hooks](https://reactjs.org/docs/hooks-effect.html). Um método para escrever componentes ditos funcionais, poderosos, mas muito pequenos. Veja a seção abaixo sobre Apollo sobre como eles são usados no _create-eth-app_. + +### Yarn workspaces {#yarn-workspaces} + +[Yarn Workspace](https://classic.yarnpkg.com/en/docs/workspaces/) permite que você tenha vários pacotes, mas ser capaz de gerenciar tudo a partir da pasta raiz e instalar as dependências de uma só vez usando `yarn install`. Isso faz sentido especialmente para pacotes adicionais menores, como o gerenciamento de endereços de contratos inteligentes / ABI (a informação sobre onde você implementou quais contratos inteligentes e como se comunicar com eles) ou a integração de grafos, ambos parte do `create-eth-app`. + +### ethers.js {#ethersjs} + +Enquanto o [Web3](https://docs.web3js.org/) ainda é mais usado, [ethers. s](https://docs.ethers.io/) tem recebido muito mais tração como uma alternativa no último ano e é integrada no _create-eth-app_. Você pode trabalhar com este, alterá-lo para Web3 ou considerar a possibilidade de atualizar para [ethers.js v5](https://docs-beta.ethers.io/) que já quase saiu da versão beta. + +### The Graph {#the-graph} + +[GraphQL](https://graphql.org/) é uma forma alternativa de manipular dados em comparação com uma [Restful API](https://restfulapi.net/). Eles têm várias vantagens sobre o Restful Apis, especialmente para dados descentralizados da blockchain. Se você estiver interessado no raciocínio por trás disso, dê uma olhada no [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). + +Geralmente, você obteria dados diretamente do seu contrato inteligente. Gostaria de saber o horário da última transação? Basta chamar `MyContract.methods.latestTradeTime().call()` que busca os dados de um nó Ethereum em seu dapp. Mas e se você precisar de centenas de pontos de dados diferentes? Isso resultaria em centenas de buscas de dados para o nó, cada vez exigindo um [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) tornando seu dapp lento e ineficiente. Uma solução alternativa pode ser uma função de busca de chamadas dentro do seu contrato que retorna vários dados de uma só vez. Mas nem sempre é o ideal. + +E então talvez também estejam interessados em dados históricos. Você quer saber não apenas a última troca, mas também os tempos para todas as negociações que você já fez. Use o _create-eth-app_ pacote de subgráfico, leia a [documentação](https://thegraph.com/docs/define-a-subgraph) e adapte-a aos seus próprios contratos. Se você estiver procurando contratos inteligentes populares, pode até ser que já exista um subgrafo. Confira o [explorador de subgrafos](https://thegraph.com/explorer/). + +Ao obter um subgrafo, você pode escrever uma consulta simples em seu dapp para recuperar todos os dados importantes da blockchain, incluindo os históricos de que você precisa — basta uma única busca. + +### Apollo {#apollo} + +Graças à integração do [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), você pode integrar facilmente o grafo em seu aplicativo React. Especialmente ao usar [React hooks e Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), buscar dados é tão simples como escrever uma única consulta GraphQl em seu componente: + +```js +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +## Modelos {#templates} + +No topo, você pode escolher entre vários modelos diferentes. Até agora você pode usar uma integração de Aave, composto, UniSwap ou saborosa. Todos eles adicionam importantes endereços de contrato inteligente de serviço, juntamente com integrações pré-fabricadas de subgráficos. Apenas adicione o template ao comando de criação como `yarn create eth-app my-eth-app --with-template aave`. + +### Aave {#aave} + +[Aave](https://aave.com/) é um mercado descentralizado de empréstimos de dinheiro. Os depositantes fornecem liquidez ao mercado para ganhar uma renda passiva, enquanto os tomadores podem fazer um empréstimo usando garantias. Uma característica única da Aave são os [empréstimos rápidos](https://docs.aave.com/developers/guides/flash-loans) que permitem que você empreste dinheiro sem nenhuma garantia, contanto que você devolva o empréstimo dentro de uma transação. Isso pode ser útil, por exemplo, para você obter dinheiro extra em uma operação de arbitragem. + +Os tokens negociados que ganham seus interesses são chamados de _aTokens_. + +Quando você optar por integrar o Aave ao _create-eth-app_, você terá uma [integração subgraph](https://docs.aave.com/developers/getting-started/using-graphql). O Aave usa The Graph e já fornece vários subgrafos prontos para uso no [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) e na [Rede principal](https://thegraph.com/explorer/subgraph/aave/protocol), em formato [bruto](https://thegraph.com/explorer/subgraph/aave/protocol-raw) ou [formatado](https://thegraph.com/explorer/subgraph/aave/protocol). + +![Meme de Empréstimo Aave – "Yeahhh, se eu conseguisse manter meu empréstimo rápido por mais de 1 transação, isso seria ótimo"](./flashloan-meme.png) + +### Compound {#compound} + +[Compound](https://compound.finance/) é similar a Aave. A integração já inclui o novo [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Aqui, os tokens que obtêm lucro são surpreendentemente chamados de _cTokens_. + +### Uniswap {#uniswap} + +[Uniswap](https://uniswap.exchange/) é uma exchange descentralizada (DEX). Provedores de liquidez podem ganhar taxas fornecendo os tokens necessários ou serviços para ambos os lados de uma negociação. Ela é amplamente utilizada e, portanto, possui uma das mais altas taxas de liquidez para uma grande variedade de tokens. Você pode integrá-lo facilmente ao seu dapp para, por exemplo, permitir que os usuários troquem seu ETH por DAI. + +Infelizmente, no momento em que escrevemos a integração é apenas para o Uniswap v1 e não para o [recém-lançado v2](https://uniswap.org/blog/uniswap-v2/). + +### Sablier {#sablier} + +O [Sablier](https://sablier.com/) permite que os usuários efetuem pagamentos continuamente. Em vez de um único dia de pagamento, você na verdade recebe o seu dinheiro constantemente sem mais administração após a configuração inicial. A integração inclui seu [próprio subgráfico](https://thegraph.com/explorer/subgraph/sablierhq/sablier). + +## O que vem a seguir? {#whats-next} + +Se você tiver perguntas sobre o _create-eth-app_, acesse o [servidor da comunidade Sablier](https://discord.gg/bsS8T47), onde você pode entrar em contato com os autores do _create-eth-app_. Como alguns primeiros passos que você pode querer integrar uma estrutura UI como [Material UI](https://material-ui.com/), escrever consultas GraphQL para os dados que você realmente precisa e configurar a implantação. diff --git a/public/content/translations/pt-br/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/pt-br/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md new file mode 100644 index 00000000000..0457b9e3218 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -0,0 +1,272 @@ +--- +title: Aprenda Tópicos fundamentais de Ethereum com SQL +description: Este tutorial ajuda os leitores a entender os conceitos fundamentais de Ethereum, incluindo transações, blocos e gas, consultando dados on-chain com linguagem de consulta estruturada (SQL). +author: "Paul Apivat" +tags: + - "SQL" + - "Querying" + - "Transações" +skill: intermediate +lang: pt-br +published: 2021-05-11 +source: paulapivat.com +sourceUrl: https://paulapivat.com/post/query_ethereum/ +--- + +Muitos tutorias da Ethereum são direcionadas para desenvolvedores, mas há uma falta de recursos educacionais para analistas de dados ou pessoas que desejam ver dados on-chain sem executar um cliente ou um nó. + +Esse tutorial ajuda os leitores a entenderem os conceitos fundamentais da Ethereum, incluindo transações, blocos e gás, consultando dados on-chain com a linguagem SQL por meio de uma interface fornecida por [Dune Analytics](https://dune.xyz/home). + +Dados on-chain podem nos ajudar a compreender a rede Ethereum como uma economia para capacidade computacional, e deve servir como base para entender os desafios enfrentados pela Ethereum hoje (por exemplo, o aumento dos preços do gas) e, o mais importante, discussões sobre soluções de escalabilidade. + +### Transações {#transactions} + +A jornada do usuário no Ethereum começa com a inicialização de uma conta controlada ou uma entidade com saldo ETH. Há duas categorias de contas: controlada pelo usuário ou um contrato inteligente (veja em: [ethereum.org](/developers/docs/accounts/)). + +Qualquer conta pode ser visualizada em um explorador de bloco como a [Etherscan](https://etherscan.io/). Exploradores de bloco são um portal para os dados da Ethereum. Eles exibem, em tempo real, dados em blocos, transações, mineiradores, contas, e outras atividades on-chain (veja [aqui](/developers/docs/data-and-analytics/block-explorers/)). + +No entanto, um usuário pode desejar consultar um dado diretamente para reconciliar as informações fornecidas por exploradores de bloco externos. O [Dune Analytics](https://duneanalytics.com/) fornece esse recurso para qualquer pessoa com algum conhecimento em SQL. + +Como referência, a conta de contrato inteligente da Fundação Ethereum (EF) pode ser visualizada na [Etherscan](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae). + +Uma coisa a ser observada é que todas as contas, incluindo as EF's, têm um endereço público que pode ser utilizado para enviar e receber transações. + +O saldo da conta na Etherscan inclui transações regulare e transações internas. As transações internas, apesar do nome, não são _realmente_ transações que alteram o estado da cadeia. Elas são transferências de valores iniciadas pela execução de um contrato ([fonte](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Visto que as transações internas não têm assinatura, elas **não** são incluídas na blockchain e não podem ser consultadas com o Dune Analytics. + +Portanto, este tutorial irá focar em transações regulares. Isso pode ser consultado como: + +```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 +``` + +Isso irá gerar as mesmas informações fornecidas na página de transações do Etherscan. Para você comparar, aqui estão duas fontes: + +#### Etherscan {#etherscan} + +![](./etherscan_view.png) + +[Visualizar página de contratos de EF's no Etherscan.](https://etherscan.io/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) + +#### Dune Analytics {#dune-analytics} + +![](./dune_view.png) + +Você pode encontrar o painel [aqui](https://duneanalytics.com/paulapivat/Learn-Ethereum). Clique na tabela para visualizar a consulta (veja também acima). + +### Decompondo Transações {#breaking_down_transactions} + +Uma transação enviada inclui várias informações, incluindo ([fonte](/developers/docs/transactions/)): + +- **Destinatário**: O endereço de recebimento (chamado como "para") +- **Assinatura**: Enquanto as chaves privadas de um remetente assinam uma transação, o que podemos consultar com o SQL é o endereço público de um remetente ("de"). +- **Valor**: Esta é a quantidade de ETH transferido (veja a coluna `ether`). +- **Dados**: Estes são dados arbitrários misturados (veja a coluna `dados`). +- **gasLimit**: a quantidade máxima de gas que pode ser consumida pela transação. As unidades de gas representam etapas computacionais +- **maxPriorityFeePerGas**: a quantidade máxima de gas a ser incluída como dica para o minerador +- **maxFeePerGas** - a quantidade máxima de gas disposta a ser paga pela transação (incluindo baseFeePerGas e maxPriorityFeePerGas) + +Podemos consultar essas informações específicas sobre transações no endereço público da Fundação Ethereum: + +```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 +``` + +### Blocos {#blocks} + +Cada transação irá alterar o estado da máquina virtual da Ethereum ([EVM](/developers/docs/evm/)) ([fonte](/developers/docs/transactions/)). As transações são transmitidas à rede para serem verificadas e incluídas em um bloco. Cada transação está associada a um número de bloco. Para ver os dados, nós podemos consultar um número de bloco específico: 12396854 (o bloco mais recente entre as transações da Fundação Ethereum a partir desta escrita, 11/05/21). + +Além disso, quando consultarmos os próximos dois blocos, podemos observar que cada bloco contém o hash do bloco anterior (i.., hash pai), ilustrando como a blockchain é formada. + +Cada bloco contém uma referência ao bloco pai. Isso é mostrado abaixo entre as colunas `hash` e `parent_hash` (fonte[](/developers/docs/blocks/)): + +![parent_hash](./parent_hash.png) + +Aqui está a [consulta](https://duneanalytics.com/queries/44856/88292) no Dune Analytics: + +```sql +SELECT + time, + number, + hash, + parent_hash, + nonce +FROM ethereum."blocks" +WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856 +LIMIT 10 +``` + +Podemos examinar um bloco consultando o horário, o número de bloco, a dificuldade (quantidade de computação necessária), o hash, o hash pai e a nonce. + +A única coisa que esta consulta não cobre é a _lista de transações_ que requer uma consulta separada abaixo e _raiz do estado_. Um nó completo ou de arquivamento irá armazenar todas as transações e transições de estado, permitindo que os clientes consultem o estado da cadeia a qualquer momento. Como isso requer um grande espaço de armazenamento, nós podemos separar os dados em cadeia dos dados de estado: + +- Dados em cadeia (lista de blocos, transações) +- Dados de estado (resultado da transição de estado de cada transação) + +A raiz de estado cai na última e são _ dados implícitos_ (não armazenados na cadeia), enquanto os dados em cadeia são explícitos e armazenados na própria cadeia ([fonte](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). + +Para este tutorial, estaremos focando em dados on-chain que _podem_ ser consultados com SQL via Dune Analytics. + +Como mencionado acima, cada bloco contém uma lista de transações, podemos consultar isso filtrando por um bloco específico. Vamos tentar o bloco mais recente, 12396854: + +```sql +SELECT * FROM ethereum."transactions" +WHERE block_number = 12396854 +ORDER BY block_time DESC` +``` + +Segue o SQL output no Dune: + +![](./list_of_txn.png) + +Este único bloco sendo adicionado à cadeia altera o estado da máquina virtual Ethereum ([EVM](/developers/docs/evm/)). Dezenas, às vezes centenas, de transações são verificadas de uma só vez. Neste caso específico, foram incluídas 222 transações. + +Para ver quantas foram realmente bem-sucedidas, nós adicionaríamos outro filtro para contar transações bem-sucedidas: + +```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 +``` + +Para o bloco 12396854, do total de 222 transações, 204 foram verificadas com sucesso: + +![](./successful_txn.png) + +As solicitações de transações ocorrem dezenas de vezes por segundo, mas os blocos são confirmados aproximadamente uma vez a cada 15 segundos ([source](/developers/docs/blocks/)). + +Para ver que há um bloco produzido aproximadamente a cada 15 segundos, poderíamos pegar o número de segundos em um dia (86400) por 15, para obter um número médio estimado de blocos por dia (~ 5760). + +O gráfico de blocos Ethereum produzidos por dia (2016 - presente) é: + +![](./daily_blocks.png) + +O número médio de blocos produzidos diariamente durante esse período de tempo é de aproximadamente ~5.874: + +![](./avg_daily_blocks.png) + +As consultas são: + +```sql +# query to visualize number of blocks produced daily since 2016 + +SELECT + DATE_TRUNC('day', time) AS dt, + COUNT(*) AS block_count +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 + +# average number of blocks produced per day + +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 +``` + +O número médio de blocos produzidos por dia desde 2016 está um pouco acima desse número em 5.874. Alternativamente, dividindo 86400 segundos por 5874 blocos médios resultam em 14,7 segundos ou aproximadamente um bloco a cada 15 segundos. + +### Gás {#gas} + +Blocos são limitados em tamanho. O tamanho máximo do bloco é dinâmico e varia de acordo com a demanda de rede entre 12.500.000 e 25.000.000 unidades. Limites são necessários para evitar que, blocos de tamanho arbitrariamente grandes coloquem tensão em nós completos, em termos de espaço em disco e requisitos de velocidade ([source](/developers/docs/blocks/)). + +Uma maneira de conceitualizar o limite de gas do bloco é pensar nele como o **suprimento** de espaço de bloco disponível para as transações em lote. O limite de gas do bloco pode ser consultado e visualizado a partir de 2016 até o presente dia: + +![](./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 +``` + +Depois, há o gas real usado diariamente para pagar pela computação realizada na cadeia Ethereum (ou seja, enviar transações, chamar um contrato inteligente, cunhar um NFT). Esta é a **demanda** por espaço de bloco disponível no Ethereum: + +![](./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 +``` + +Também podemos justapor esses dois gráficos para ver como a **demanda e oferta** se alinham: + +![gas_demand_supply](./gas_demand_supply.png) + +Portanto, podemos entender os preços do gas em função da demanda por espaço no bloco Ethereum, dada a oferta disponível. + +Finalmente, podemos querer consultar os preços médios diários do gas para a cadeia Ethereum, no entanto, fazê-lo resultará em um tempo de consulta especialmente longo, então, filtraremos a nossa consulta pela quantidade média de gas paga por transação pela Fundação Ethereum. + +![](./ef_daily_gas.png) + +Podemos ver os preços do gas pagos por todas as transações feitas para o endereço da Ethereum Foundation ao longo dos anos. Aqui está a consulta: + +```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 +``` + +### Resumo {#summary} + +Com este tutorial, entendemos os conceitos fundamentais do Ethereum e como a blockchain do Ethereum funciona consultando e obtendo uma ideia dos dados on-chain. + +O painel que contém todo o código usado neste tutorial pode ser encontrado [aqui](https://duneanalytics.com/paulapivat/Learn-Ethereum). + +Para mais uso de dados para explorar a web3 [siga-me no Twitter](https://twitter.com/paulapivat). diff --git a/public/content/translations/pt-br/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/pt-br/developers/tutorials/logging-events-smart-contracts/index.md new file mode 100644 index 00000000000..d74031cc9e8 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/logging-events-smart-contracts/index.md @@ -0,0 +1,66 @@ +--- +title: Registrando dados de contratos inteligentes com eventos +description: Uma introdução aos eventos de contrato inteligentes e como você pode usá-los para registrar os dados +author: "jdourlens" +tags: + - "contratos inteligentes" + - "remix" + - "solidity" + - "eventos" +skill: intermediate +lang: pt-br +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/logging-data-with-events/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +No Solidity, [eventos](/developers/docs/smart-contracts/anatomy/#events-and-logs) são sinais enviados que os contratos inteligentes podem disparar. Dapps, ou qualquer coisa conectada à API Ethereum JSON-RPC, podem reconhecer esses eventos e agir em conformidade. Um evento também pode ser indexado para que o histórico de eventos seja pesquisável posteriormente. + +## Eventos {#events} + +O evento mais comum na blockchain Ethereum no momento da redação deste artigo é o evento Transfer, que é emitido por tokens ERC20 quando alguém transfere tokens. + +```solidity +event Transfer(address indexed from, address indexed to, uint256 value); +``` + +A assinatura do evento é declarada dentro do código do contrato e pode ser emitida com a palavra-chave de emissão. Por exemplo, os registros de eventos de transferência que enviaram a transferência (_from_), para quem foram transferidos (_to_) e quantos tokens foram transferidos (_value_). + +Se voltarmos ao nosso contrato inteligente Contador e decidirmos registrar toda vez que o valor for alterado. Como este contrato não é para ser usado, mas serve como uma base para a construção de outro contrato, estendendo-o: é chamado de contrato abstrato. No caso de nosso exemplo de contador, ele ficaria assim: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + event ValueChanged(uint oldValue, uint256 newValue); + + // Private variable of type unsigned int to keep the number of counts + uint256 private count = 0; + + // Function that increments our counter + function increment() public { + count += 1; + emit ValueChanged(count - 1, count); + } + + // Getter to get the count value + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Observe que: + +- **Linha 5**: declaramos nosso evento e o que ele contém, o valor antigo e o novo valor. + +- **Linha 13**: Quando incrementamos nossa variável de contagem, emitimos o evento. + +Se implementarmos o contrato e chamarmos a função de incremento, veremos que o Remix será exibido automaticamente se você clicar na nova transação dentro de um array de logs nomeados. + +![Captura de tela Remix](./remix-screenshot.png) + +Os logs são muito úteis para depurar seus contratos inteligentes, mas também são importantes se você criar aplicativos usados por diferentes pessoas e tornar mais fácil fazer análises para rastrear e entender como seu contrato inteligente é usado. Os registros gerados pelas transações são exibidos em exploradores de blocos populares e você também pode, por exemplo, usá-los para criar 'scripts' fora da cadeia para ver eventos específicos e agir quando eles ocorrerem. diff --git a/public/content/translations/pt-br/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/pt-br/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md new file mode 100644 index 00000000000..f0a29036ae2 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -0,0 +1,241 @@ +--- +title: Provas de Merkle para integridade de dados offline +description: Assegurar a integridade dos dados na cadeia para os dados armazenados, sobretudo, fora da cadeia +author: Ori Pomerantz +tags: + - "armazenamento" +skill: advanced +lang: pt-br +published: 2021-12-30 +--- + +## Introdução {#introduction} + +Idealmente, gostaríamos de guardar tudo no armazenamento do Ethereum, que é armazenado em milhares de computadores e conta com uma disponibilidade extremamente alta (os dados não podem ser censurados) e integridade (os dados não podem ser modificados de forma não autorizada), sabendo que armazenar uma palavra de 32 bytes normalmente custa 20.000 gás. No momento em que estou escrevendo isto, o custo é equivalente a $6,60. A 21 centavos por byte, isso é bastante caro para muitas utilizações. + +Para resolver esse problema, o ecossistema do Ethereum desenvolveu [muitas formas alternativas de armazenar dados de forma descentralizada](/developers/docs/storage/). Geralmente, elas envolvem um equilíbrio entre a disponibilidade e o preço. No entanto, a integridade é geralmente assegurada. + +Neste artigo, você aprenderá **como** garantir a integridade dos dados sem armazenar os dados na blockchain, usando [ provas de Merkle](https://computersciencewiki.org/index.php/Merkle_proof). + +## Como isso funciona? {#how-does-it-work} + +Em teoria, poderíamos apenas armazenar o hash dos dados na cadeia e enviar todos os dados em transações que precisam deles. No entanto, isso ainda é demasiado caro. Um byte de dados para uma transação custa cerca de 16 gás, atualmente cerca de meio centavo ou cerca de $5 por kilobyte. A $5.000 por megabyte, isso ainda é muito caro para várias utilizações, mesmo sem o custo adicional de hashing de dados. + +A solução é fazer hash repetidamente de diferentes subconjuntos dos dados. Para os dados que você não precisa enviar, você pode apenas enviar um hash. Você pode fazer isso usando uma árvore de Merkle, uma estrutura de dados de árvore em que cada nó é um hash dos nós abaixo: + +![Árvores de Merkle](tree.png) + +O hash raiz é a única parte que precisa ser armazenada na cadeia. Para comprovar um determinado valor, forneça todos os hashes que precisam ser combinados com ele para obter a raiz. Por exemplo, para provar `C` você fornece `D`, `(H-B)`, e `H(E-H)`. + +![Prova do valor de C](proof-c.png) + +## Implementação {#implementation} + +[O código de exemplo é fornecido aqui](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). + +### Código fora da cadeia {#off-chain-code} + +Neste artigo, usamos JavaScript para os cálculos fora da cadeia. A maioria dos aplicativos descentralizados tem seu componente off-chain em JavaScript. + +#### Criando a raiz Merkle {#creating-the-merkle-root} + +Primeiro, precisamos fornecer a raiz Merkle à cadeia. + +```javascript +const ethers = require("ethers") +``` + +[Usamos a função hash do pacote ethers](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). + +```javascript +// The raw data whose integrity we have to verify. The first two bytes a +// are a user identifier, and the last two bytes the amount of tokens the +// user owns at present. +const dataArray = [ + 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, + 0xface0070, 0xbad00080, 0x060d0091, +] +``` + +Codificar cada entrada em um único inteiro de 256 bits resulta em um código menos legível que o JSON, por exemplo. No entanto, isso significa um processamento significativamente menor para recuperar os dados contidos no contrato, portanto, custos de gás muito menores. [Você pode ler o JSON na cadeia](https://github.com/chrisdotn/jsmnSol), porém, isso é uma má ideia e evite fazer isso se puder. + +```javascript +// The array of hash values, as BigInts +const hashArray = dataArray +``` + +Nesse caso, para começar, nossos dados têm um valor 256 bits. Portanto, não é necessário qualquer tipo de processamento. Se usarmos uma estrutura de dados mais complicada, como cadeias de caracteres, precisamos ter certeza de que fazemos primeiro o hash dos dados para obter uma matriz de hashes. Observe que isso também é devido ao fato de não nos importarmos se usuários conhecem as informações de outros usuários. Caso contrário, teríamos tido que fazer um hash, para que o usuário 1 não saiba o valor para o usuário 0, ao usuário 2 que não saberá o valor para o usuário 3, etc. + +```javascript +// Convert between the string the hash function expects and the +// BigInt we use everywhere else. +const hash = (x) => + BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) +``` + +A função hash de ethers espera obter uma cadeia de caracteres em JavaScript com um número hexadecimal, como `0x60A7`, e responde com outra cadeia de caracteres com a mesma estrutura. No entanto, para o resto do código, é mais fácil usar `BigInt`, então convertemos em uma cadeia de caracteres hexadecimal e de volta novamente. + +```javascript +// Symmetrical hash of a pair so we won't care if the order is reversed. +const pairHash = (a, b) => hash(hash(a) ^ hash(b)) +``` + +Essa função é simétrica (hash de um [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Isto significa que quando verificamos a prova de Merkle, não precisamos nos preocupar se devemos colocar o valor da prova antes ou depois do valor calculado. A verificação da prova de Merkle é feita na cadeia, portanto, quanto menos precisarmos fazer lá, melhor. + +Atenção: A criptografia é mais difícil do que parece. A versão inicial deste artigo tinha a função hash `hash(a^b)`. Essa foi uma **má** ideia, porque significava que se você conhecesse os valores legítimos de `a` e de `b`, você poderia usar `b' = a^b^a'` para provar qualquer valor `a'` desejado. Com essa função, você teria que calcular `b'`, de forma que `hash(a') ^ hash(b')` fosse igual a um valor conhecido (o próximo branch a caminho da raiz), o que é muito mais difícil. + +```javascript +// The value to denote that a certain branch is empty, doesn't +// have a value +const empty = 0n +``` + +Quando o número de valores não é uma potência inteira de dois, precisamos lidar com branches vazios. O programa faz isso colocando zero como espaço reservado. + +![Árvore de Merkle com branches faltando](merkle-empty-hash.png) + +```javascript +// Calculate one level up the tree of a hash array by taking the hash of +// each pair in sequence +const oneLevelUp = (inputArray) => { + var result = [] + var inp = [...inputArray] // To avoid over writing the input // Add an empty value if necessary (we need all the leaves to be // paired) + + 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 +``` + +Esta função “escala” um nível na árvore de Merkle, fazendo hash dos pares de valores na camada atual. Observe que esta não é a implementação mais eficiente. Poderíamos ter evitado copiar a entrada e apenas adicionar `hashEmpty` quando apropriado no loop, mas este código é otimizado para melhorar a legibilidade. + +```javascript +const getMerkleRoot = (inputArray) => { + var result + + result = [...inputArray] // Climb up the tree until there is only one value, that is the // root. // // If a layer has an odd number of entries the // code in oneLevelUp adds an empty value, so if we have, for example, // 10 leaves we'll have 5 branches in the second layer, 3 // branches in the third, 2 in the fourth and the root is the fifth + + while (result.length > 1) result = oneLevelUp(result) + + return result[0] +} +``` + +Para obter a raiz, suba até que haja apenas um valor restante. + +#### Criando uma prova de Merkle {#creating-a-merkle-proof} + +Uma prova de Merkle é o conjunto de valores a fazer hash junto com o valor que está sendo provado para recuperar a raiz de Merkle. O valor a provar está frequentemente disponível a partir de outros dados, então eu prefiro fornecê-lo separadamente do que como parte do código. + +```javascript +// A merkle proof consists of the value of the list of entries to +// hash with. Because we use a symmetrical hash function, we don't +// need the item's location to verify the proof, only to create it +const getMerkleProof = (inputArray, n) => { +    var result = [], currentLayer = [...inputArray], currentN = n + +    // Until we reach the top +    while (currentLayer.length > 1) { +        // No odd length layers +        if (currentLayer.length % 2) +            currentLayer.push(empty) + +        result.push(currentN % 2 +               // If currentN is odd, add with the value before it to the proof +            ? currentLayer[currentN-1] +               // If it is even, add the value after it +            : currentLayer[currentN+1]) + +``` + +Fazemos o hash `(v[0],v[1])`, `(v[2],v[3])`, etc. Portanto, para valores pares, precisamos do próximo e, para valores ímpares, precisamos do anterior. + +```javascript +        // Move to the next layer up +        currentN = Math.floor(currentN/2) +        currentLayer = oneLevelUp(currentLayer) +    }   // while currentLayer.length > 1 + +    return result +}   // getMerkleProof +``` + +### Código on-chain {#on-chain-code} + +Por fim, temos o código que verifica a prova. O código on-chain é escrito em [Solidity](https://docs.soliditylang.org/en/v0.8.11/). A otimização é aqui muito mais importante, porque o gás é relativamente caro. + +```solidity +//SPDX-License-Identifier: Public Domain +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; +``` + +Escrevi isso usando o [ambiente de desenvolvimento de hardware](https://hardhat.org/), que nos permite ter [saída do console do Solidity](https://hardhat.org/tutorial/debugging-with-hardhat-network.html) em desenvolvimento. + +```solidity + +contract MerkleProof { +    uint merkleRoot; + +    function getRoot() public view returns (uint) { +      return merkleRoot; +    } + +    // Extremely insecure, in production code access to +    // this function MUST BE strictly limited, probably to an +    // owner +    function setRoot(uint _merkleRoot) external { +      merkleRoot = _merkleRoot; +    }   // setRoot +``` + +Configure e obtenha funções para a raiz de Merkle. Deixar que todo mundo atualize a raiz de Merkle é uma _ideia extremamente má_ em um sistema de produção. Aqui, faço isso por uma questão de simplicidade no código de exemplo. **Não faça isso em um sistema no qual a integridade de dados realmente importa**. + +```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)); +    } +``` + +Essa função gera um par de hashes. Ela é simplesmente a tradução do Solidity do código em JavaScript para `hash` e `pairHash`. + +**Observação:** Este é outro caso de otimização para facilidade de leitura. Baseado em [a definição da função](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm), é possível armazenar os dados como um valor de [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) e evitar as conversões. + +```solidity +    // Verify a Merkle proof +    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 +``` + +Na notação matemática, a verificação pela prova de Merkle tem esta aparência: `H(proof_n, H(proof_n-1, H(proof_n-2, ... H(prova_1, H(prova_0, valor)...)))`. Este código implementa-o. + +## Provas de Merkle e rollups não se misturam {#merkle-proofs-and-rollups} + +As provas de Merkle não funcionam bem com [rollups](/developers/docs/scaling/#rollups). O motivo é que os rollups escrevem todos os dados da transação no L1, mas são processadas no L2. O custo para enviar uma prova de Merkle com uma média de transação a 638 gás por camada (atualmente, um byte nos dados de chamadas custa 16 gás se não for zero, e 4 se for zero). Se temos 1024 palavras de dados, uma prova de Merkle requer dez camadas, ou um total de 6380 gás. + +Procurando um exemplo no [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m), escrever custos de gás L1 custa cerca de 100 gwei e escrever custos de gás L2 custa 0,001 gwei (esse é o preço normal, que pode aumentar com o congestionamento). Portanto, pelo custo de um gás L1 podemos gastar cem mil gás no processamento L2. Supondo que não sobrescrevamos o armazenamento, isso significa que podemos escrever cerca de cinco palavras para armazenamento na L2 pelo preço de um gás L1. Para uma única prova de Merkle, podemos escrever todas as 1024 palavras para armazenamento (assumindo que elas podem ser calculadas em cadeia para começar, em vez de serem fornecidos em uma transação) e ainda restam a maior parte do gás. + +## Conclusão {#conclusion} + +Na vida real, você pode nunca implementar Merkle por conta própria. Existem bibliotecas conhecidas e auditadas que você pode usar e, de um modo geral, é melhor não implementar primitivos criptográficos por conta própria. Mas espero que agora você compreenda melhor as provas de Merkle e que possa decidir quando é que vale a pena utilizar. + +Observe que, enquanto as provas de Merkle preservam a _integridade_, elas não preservam a disponibilidade __. Saber que mais ninguém pode tomar seus ativos é uma pequena consolação se o armazenamento de dados decidir impedir o acesso e você não pode construir uma Merkle para acessá-los também. Portanto, as árvores de Merkle são melhor usadas com algum tipo de armazenamento descentralizado, como IPFS. diff --git a/public/content/translations/pt-br/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/pt-br/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md new file mode 100644 index 00000000000..bbef2e73677 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -0,0 +1,147 @@ +--- +title: Monitorando o Geth com InfluxDB e Grafana +description: +author: "Mário Havel" +tags: + - "clientes" + - "nós" +skill: intermediate +lang: pt-br +published: 2021-01-13 +--- + +Esse tutorial ajudará você a configurar o monitoramento do seu Geth para você poder entender melhor o seu desempenho e identificar possíveis problemas. + +## Pré-Requisitos {#prerequisites} + +- Você já deveria estar executando uma instância de Geth. +- A maioria dos passos e exemplos são para o ambiente Linux, o conhecimento básico sobre terminais será útil. +- Confira este vídeo da visão geral da suíte de métricas do Geth: Monitoring an Ethereum infrastructure by Péter Szilágyi. + +## Stack de monitoramento {#monitoring-stack} + +Um cliente Ethereum coleta muitos dados que podem ser lidos na forma de uma base de dados cronológica. Para facilitar o monitoramento, você pode inserir isso em um software de visualização de dados. Existem múltiplas opções disponíveis: + +- [Prometheus](https://prometheus.io/) (modelo pull) +- [InfluxDB](https://www.influxdata.com/get-influxdb/) (modelo push) +- [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/) + +Também há o [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), uma opção pré-configurada com InfluxDB e Grafana. Você pode configurá-lo facilmente usando docker e [Ethbian OS](https://ethbian.org/index.html) para RPi 4. + +Neste tutorial, nós configuramos seu cliente Geth para enviar dados para o InfluxDB para criar um banco de dados e o Grafana para criar um gráfico de visualização dos dados. Fazer isso manualmente ajudará você a entender melhor o processo, alterá-lo e fazer deploy em diferentes ambientes. + +## Configurando o InfluxDB {#setting-up-influxdb} + +Primeiro, vamos baixar e instalar o InfluxDB. Várias opções de download podem ser encontradas na [página de release do Influxdata](https://portal.influxdata.com/downloads/). Escolha o que mais se adequa ao seu ambiente. Você também pode instalá-lo a partir de um [repositório](https://repos.influxdata.com/). Por exemplo, em uma distribuição baseada em Debian: + +``` +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 +``` + +Após instalar o InfluxDB com sucesso, certifique-se de que ele está sendo executado em segundo plano. Por padrão, ele é acessível em `localhost:8086`. Antes de usar o cliente `influx` você tem que criar um novo usuário com privilégios de administrador. Este usuário servirá para gerenciamento de alto nível, criando bancos de dados e usuários. + +``` +curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES" +``` + +Agora você pode usar o cliente influx para entrar no [shell do InfluxDB](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) com este usuário. + +``` +influx -username 'username' -password 'password' +``` + +Comunificando diretamente com o InfluxDB em seu shell, você pode criar banco de dados e usuário para métricas do geth. + +``` +create database geth +create user geth with password choosepassword +``` + +Verifique as entradas criadas com: + +``` +show databases +show users +``` + +Saia do Shell InfluxDB. + +``` +exit +``` + +O InfluxDB está rodando e configurado para armazenar métricas do Geth. + +## Preparando o Geth {#preparing-geth} + +Depois de configurar o banco de dados, precisamos habilitar a coleção de métricas no Geth. Preste atenção em `METRICS AND STATS OPTIONS` com `geth --help`. Várias opções podem ser encontradas lá, neste caso queremos que o Geth envie dados para o InfluxDB. A configuração básica especifica o endpoint onde o InfluxDB é acessível e a autenticação para o banco de dados. + +``` +geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword" +``` + +Estas flags podem ser anexadas a um comando que inicie o cliente ou salvas no arquivo de configuração. + +Você pode verificar que o Geth está fazendo push de dados com sucesso, por exemplo, listando as métricas no banco de dados. Saia do shell do InfluxDB: + +``` +use geth +show measurements +``` + +## Configurando o Grafana {#setting-up-grafana} + +O próximo passo é instalar o Grafana que interpretará os dados graficamente. Siga o processo de instalação do seu ambiente na documentação do Grafana. Certifique-se de instalar a versão OSS se você não quiser o contrário. Etapas de instalação de exemplo para distribuições Debian usando o repositório: + +``` +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 +``` + +Quando você estiver rodando o Grafana, ele deve ser acessível em `localhost:3000`. Use seu navegador preferido para acessar esta URL e, em seguida, faça login com as credenciais padrão (usuário: `admin` e senha: `admin`). Quando solicitado, altere a senha padrão e salve. + +![](./grafana1.png) + +Você vai ser redirecionado para a página principal do Grafana. Primeiro, configure seu source data. Clique no ícone de configuração na barra esquerda e selecione "Data sources". + +![](./grafana2.png) + +Ainda não existem data sources criados, clique em "Add data source" para definir um. + +![](./grafana3.png) + +Para esta configuração, selecione "InfluxDB" e prossiga. + +![](./grafana4.png) + +A configuração do data source é bem simples se você estiver rodando ferramentas na mesma máquina. Você precisa configurar o endereço e os detalhes do InfluxDB para acessar o banco de dados. Consulte a imagem abaixo. + +![](./grafana5.png) + +Se tudo estiver completo e o InfluxDB estiver acessível, clique em "Save and test" e aguarde a confirmação aparecer. + +![](./grafana6.png) + +O Grafana está agora configurado para ler dados do InfluxDB. Agora você precisa criar um painel que o interprete e o exiba. As propriedades dos Dashboards são codificadas em arquivos JSON que podem ser criados por qualquer um e podem ser facilmente importados. Na barra esquerda, clique em "Create and Import". + +![](./grafana7.png) + +Para um dashboard de monitoramento do Geth, copie o ID [deste dashboard](https://grafana.com/grafana/dashboards/13877/) e cole-o em "Import page" no Grafana. Depois de salvar o dashboard, ele deve ficar assim: + +![](./grafana8.png) + +Você pode modificar seus dashboards. Cada dashboard pode ser editado, movido, removido ou adicionado. Você pode alterar suas configurações. É com você! Para saber mais sobre como os dashboards funcionam, consulte a [documentação do Grafana](https://grafana.com/docs/grafana/latest/dashboards/). Você também pode estar interessado sobre [Notificações / Alertas](https://grafana.com/docs/grafana/latest/alerting/). Isso permite configurar notificações de alerta para quando as métricas alcançarem certos valores. Vários canais de comunicação são suportados. diff --git a/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md b/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md new file mode 100644 index 00000000000..b5ef01302fc --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/nft-minter/index.md @@ -0,0 +1,874 @@ +--- +title: Tutorial de criação de uma NFT +description: Neste tutorial, você irá construir um minter NFT e, também, aprender a como criar um full stack dapp conectando seu contrato inteligente a um React frontend usando MetaMask e ferramentas Web3. +author: "smudgil" +tags: + - "solidity" + - "NFT" + - "alchemy" + - "contratos inteligentes" + - "front-end" + - "Pinata" +skill: intermediate +lang: pt-br +published: 2021-10-06 +--- + +Um dos maiores desafios para desenvolvedores vindos de um background Web2 é descobrir como conectar seu contrato inteligente a um projeto frontend e interagir com ele. + +Ao criar um minter NFT — uma simples UI onde você pode inserir um link para seu ativo digital, um título e uma descrição — você aprenderá a: + +- Conectar ao MetaMask através do seu projeto frontend +- Chamar métodos de contrato inteligentes no seu frontend +- Assine transações usando MetaMask + +Neste tutorial, usaremos o [React](https://reactjs.org/) como nossa estrutura de frontend. Como este tutorial está focado principalmente no desenvolvimento da Web3, nós não passaremos muito tempo detalhando os fundamentos do React. Em vez disso, nós focaremos em trazer funcionalidade para o nosso projeto. + +Como pré-requisito, você deve ter uma compreensão mínima do React – saber como funcionam componentes, props, useState/useEffect e chamadas de funções básicas. Se você nunca ouviu falar de nenhum desses termos antes, você pode querer conferir este [Intro to React tutorial](https://reactjs.org/tutorial/tutorial.html). Para os que apreciam mais visualidade, é altamente recomendável esta excelente série de vídeos [Full Modern React Tutorial](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-TvwTutorialfod2gaISzfRiP9d) por Net Ninja. + +E se você ainda não fez, você definitivamente precisará criar uma conta Alchemy para concluir este tutorial, bem como construir qualquer coisa no blockchain. Inscreva-se para uma conta gratuita [aqui](https://alchemy.com/). + +Sem mais delongas, vamos começar! + +## Criando NFTs 101 {#making-nfts-101} + +Antes de começarmos a olhar para qualquer código, é importante entender como funciona fazer uma NFT. Envolve duas etapas: + +### Publicar um contrato inteligente da NFT no blockchain Ethereum {#publish-nft} + +A maior diferença entre os dois padrões de contrato inteligente NFT é que o ERC-1155 é um padrão multi-token e inclui a funcionalidade de lote, enquanto o ERC-721 é um padrão de token único, portanto, suporta apenas a transferência de um token por vez. + +### Chamar a função mint {#minting-function} + +Normalmente, esta função mint requer que você passe duas variáveis como parâmetros, primeiro o destinatário `recipient`, que especifica o endereço que receberá a sua NFT recém-mintada, e segundo o `tokenURI` da NFT, uma string que indica a um documento JSON que descreve os metadados da NFT. + +Os metadados de uma NFT são o que realmente a torna realidade, permitindo que tenha propriedades configuráveis, como um nome, descrição, imagem (ou diferentes ativos digitais), e outros atributos. Aqui está [um exemplo de um tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), que contém os metadados de uma NFT. + +Neste tutorial, vamos nos concentrar na parte 2, chamando a função mint de contrato inteligente de uma NFT existente usando nossa interface do React. + +[Aqui está um link](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) para o contrato inteligente NFT ERC-721 que vamos chamar neste tutorial. Se você gostaria de saber como o fizemos, é altamente recomendável que você veja nosso outro tutorial, ["Como criar uma NFT"](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft). + +Legal, agora que entendemos como fazer uma NFT funcionar, vamos clonar nossos arquivos iniciais! + +## Clonar os arquivos iniciais {#clone-the-starter-files} + +Primeiro, vá para o [repositório GitHub do nft-minter-tutorial](https://github.com/alchemyplatform/nft-minter-tutorial) para obter os arquivos iniciais para este projeto. Clone este repositório para o seu ambiente local.= + +Quando você abrir este repositório clonado `nft-minter-tutorial`, irá notar que ele contém duas pastas: `minter-starter-files` e `nft-minter`. + +- `minter-starter-files` contém os arquivos iniciais (essencialmente a interface do React) para este projeto. Neste tutorial, **trabalharemos nesse diretório**, enquanto você aprende a dar vida a sua interface do usuário, conectando-a à sua carteira Ethereum e a um contrato inteligente de NFT. +- `nft-minter` contém o tutorial completo e serve para você como uma **referência** **se você ficar preso.** + +Em seguida, abra sua cópia de `minter-starter-files` no seu editor de código e navegue para a pasta `src`. + +Todo o código que vamos escrever será exibido na pasta `src`. Vamos editar o componente `Minter.js` e escrever arquivos javascript adicionais para dar funcionalidades Web3 ao nosso projeto. + +## Passo 2: Confira nossos arquivos iniciais {#step-2-check-out-our-starter-files} + +Antes de começarmos a codificar, é importante verificar o que já está fornecido para nós nos arquivos iniciais. + +### Tenha seu projeto React em execução {#get-your-react-project-running} + +Vamos começar executando o projeto React em nosso navegador. A beleza do React é que uma vez que nosso projeto esteja sendo executado no nosso navegador, qualquer alteração que salvarmos será atualizada ao vivo em nosso navegador. + +Para fazer com que o projeto funcione, navegue até o diretório raiz da pasta `minter-starter-files`, e execute`npm install` no seu terminal para instalar as dependências do projeto: + +```bash +cd minter-starter-files +npm install +``` + +Uma vez terminada a instalação, execute `npm start` em seu terminal: + +```bash +npm start +``` + +Feito isso, você deve abrir http://localhost:3000/ no seu navegador, onde você verá o frontend do nosso projeto. Ele deve consistir de 3 campos: um local para inserir um link para o ativo do seu NFT, digite o nome da sua NFT e forneça uma descrição. + +Se você tentar clicar nos botões "Connectar Wallet" ou "Mint NFT", você notará que eles não funcionam — isso porque ainda precisamos programar a funcionalidade deles! :\) + +### O componente Minter.js {#minter-js} + +**NOTA:** Certifique-se de estar na pasta `minter-starter-files` e não na pasta `nft-minter`! + +Vamos voltar à pasta `src` no nosso editor e abrir o arquivo `Minter.js`. É muito importante que entendamos tudo neste arquivo, pois é o principal componente do React no qual vamos trabalhar. + +No topo do nosso arquivo, temos nossas variáveis de estado que serão atualizadas após eventos específicos. + +```javascript +//State variables +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [name, setName] = useState("") +const [description, setDescription] = useState("") +const [url, setURL] = useState("") +``` + +Nunca ouviu falar de variáveis de estado do React ou State Hooks? Confira [está](https://reactjs.org/docs/hooks-state.html) documentação. + +Veja aqui o que cada uma das variáveis representa: + +- `walletAddress` - uma string que armazena o endereço da carteira do usuário +- `status` - uma string que contém uma mensagem a ser exibida na parte inferior da interface do usuário +- `name` - uma string que armazena o nome da NFT +- `descrição` - uma string que armazena a descrição da NFT +- `url` - uma string que é um link para o ativo digital da NFT + +Após as variáveis de estado, você verá três funções não implementadas: `useEffect`, `connectWalletPressed`, e `onMintPressed`. Você irá notar que todas essas funções são `async`, isso é porque iremos fazer chamadas assíncronas da API nelas! Os nomes delas são relacionadas com sua funcionalidade: + +```javascript +useEffect(async () => { + //TODO: implement +}, []) + +const connectWalletPressed = async () => { + //TODO: implement +} + +const onMintPressed = async () => { + //TODO: implement +} +``` + +- [`useEffect`](https://reactjs.org/docs/hooks-effect.html) - este é um React Hook que é chamado depois que seu componente é renderizado. Porque ele tem uma array vazia `[]` "prop" passada para ela (veja a linha 3), ela só será chamada na _primeira_ renderização do componente. Aqui vamos chamar nosso ouvinte de carteira e outra função de carteira para atualizar nossa interface de usuário para refletir se uma carteira já está conectada. +- `connectWalletPressed` - esta função será chamada para conectar a carteira MetaMask do usuário ao nosso dapp. +- `onMintPressed` - esta função será chamada para mintar a NFT do usuário. + +Perto do final desse arquivo, temos a interface de usuário do nosso componente. Se você escanear este código com cuidado, notará que atualizamos nossa `url`, `name`, e `description` variáveis de estado quando a entrada em seus campos de texto correspondentes muda. + +Você também verá que `connectWalletPressed` e `onMintPressed` são chamadas quando os botões com IDs `mintButton` e `walletButton` são clicados respectivamente. + +```javascript +//the UI of our component +return ( +
      + + +

      +

      🧙‍♂️ Alchemy NFT Minter

      +

      + Simply add your asset's link, name, and description, then press "Mint." +

      +
      +

      🖼 Link to asset:

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

      🤔 Name:

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

      ✍️ Description:

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

      {status}

      +
      +) +``` + +Finalmente, vamos endereçar onde esse componente Minter será adicionado. + +Se você for ao arquivo `App.js`, que é o componente principal do React que atua como um contêiner para todos os outros componentes, você verá que nosso componente Minter é injetado na linha 7. + +**Neste tutorial, vamos apenas editar o arquivo `Minter.js` e adicionar arquivos em nossa pasta `src`.** + +Agora que entendemos com o que estamos trabalhando, vamos configurar a nossa carteira Ethereum! + +## Configure sua carteira Ethereum {#set-up-your-ethereum-wallet} + +Para que os usuários possam interagir com o seu contrato inteligente, eles precisarão conectar a sua carteira Ethereum ao seu dapp. + +### Baixar MetaMask {#download-metamask} + +Para este tutorial, usaremos uma carteira virtual no navegador, a MetaMask, para gerenciar o endereço da sua conta Ethereum. Se você quiser entender mais sobre como as transações no Ethereum funcionam, confira [esta página](/developers/docs/transactions/) na Fundação Ethereum. + +Você pode baixar e criar uma conta MetaMask gratuitamente [neste link](https://metamask.io/download.html). Quando estiver criando uma conta, ou se já tiver uma, certifique-se de mudar para a "Ropsten Test Network", no canto superior direito (para não precisar lidar com dinheiro de verdade\). + +### Etapa: Adicionar Faucet ether {#add-ether-from-faucet} + +Para mintar as nossas NFT (ou assinar quaisquer transações no blockchain Ethereum), precisaremos de alguns Eth falsos. Para obter Eth você pode ir para o [faucet da Ropsten](https://faucet.ropsten.be/), inserir seu endereço de conta Ropsten e clicar em "Send Ropsten Eth." Em seguida, você deve ver Eth em sua conta Metamask! + +### Conferir o seu saldo {#check-your-balance} + +Para verificar novamente que tem saldo, vamos fazer uma solicitação através da ferramenta [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) fornecida pelo [compositor da 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). Ela mostrará a quantidade de Eth na sua carteira. Depois de inserir o endereço da sua conta da MetaMask e clicar em "Send Request", você verá uma resposta como esta: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**NOTA:** Este resultado está em wei, não em ETH. Lembre-se de que "Wei" é a menor unidade de ether. A conversão de wei para eth é: 1 eth = 10¹⁸ wei. Então, se convertemos 0xde0b6b3a7640000 para decimal, temos 1\*10¹⁸ wei, que é igual a 1 eth. + +Ufa! Nosso dinheiro falso está todo lá! + +## Conecte o MetaMask à sua interface {#connect-metamask-to-your-UI} + +Agora que nossa carteira MetaMask está configurada, vamos conectar nosso dapp a ela! + +Como queremos prescrever conforme o paradigma [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), vamos criar um arquivo separado que contém nossas funções para gerenciar a lógica, dados e regras de nosso dapp, e então passar essas funções para nosso frontend (nosso componente Minter.js). + +### Função `connectWallet` {#connect-wallet-function} + +Para fazer isso, vamos criar uma nova pasta chamada `utils` em seu diretório `src` e adicionar um arquivo chamado `interact.js` dentro dele, que conterá todas as funções de nossa carteira e da interação com o contrato inteligente. + +No nosso arquivo `interact.js`, vamos escrever uma função `connectWallet`, que então importar e chamará nosso componente `Minter.js`. + +No seu arquivo`interact.js`, adicione o seguinte + +```javascript +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Write a message in the text-field above.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

      +
      + ), + } + } +} +``` + +Vamos dividir o que este código faz: + +Primeiro, nossa função verifica se o `window.ethereum` está habilitado no seu navegador. + +`window.ethereum` é uma API global injetada pela MetaMask e outros provedores de carteira que permitem que sites solicitem contas Ethereum dos usuários. Se aprovada, ela pode ler dados das blockchains ao qual o usuário está conectado e sugerir que o usuário assine mensagens e transações. Confira a [documentação da MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) para obter mais informações! + +Se `window.ethereum` _não está_ presente, então isso significa que o MetaMask não está instalado. Isso resulta em um objeto JSON sendo retornado, onde o `endereço` retornado é uma string vazia, e o `status` do objeto JSX repassa que o usuário deve instalar o MetaMask. + +**A maioria das funções que escrevermos retornarão objetos JSON que podemos usar para atualizar nossas variáveis de estado e interface de usuário.** + +Agora se `window.ethereum` _estiver_ presente, e é aí que as coisas ficam interessantes. + +Usando um loop de try/catch, tentaremos nos conectar a MetaMask chamando`[window.ethereum.request({ method: "eth_requestAccounts" });](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)`. Chamando esta função o MetaMask irá abrir no navegador, onde o usuário será solicitado a conectar sua carteira ao seu dapp. + +- Se o usuário escolher conectar-se, `método: "eth_requestAccounts"` retornará um array que contém todos os endereços de conta do usuário que estão conectados ao dapp. No total, nossa função `connectWallet` retornará um objeto JSON que contém o _primeiro_ `address` desta matriz \(ver linha 9\) e uma mensagem `status` que pede que o usuário escreva uma mensagem para o contrato inteligente. +- Se o usuário rejeitar a conexão, então o objeto JSON vai conter uma string vazia para o `address` retornado e uma mensagem de `status` que reflete que o usuário rejeitou a conexão. + +### Adicionar função connectWallet ao seu componente UI Minter.js {#add-connect-wallet} + +Agora que escrevemos esta função `connectWallet`, vamos conectá-la ao nosso componente `Minter.js.`. + +Primeiro, teremos que importar nossa função para o arquivo `Minter.js` adicionando `import { connectWallet } from "./utils/interact.js";` para o topo do arquivo `Minter.js`. Suas primeiras 11 linhas de `Minter.js` agora devem se parecer com isto: + +```javascript +import { useEffect, useState } from "react"; +import { connectWallet } from "./utils/interact.js"; + +const Minter = (props) => { + + //State variables + const [walletAddress, setWallet] = useState(""); + const [status, setStatus] = useState(""); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [url, setURL] = useState(""); +``` + +Então, dentro da nossa função `connectWalletPressed`, vamos chamar nossa função importada `connectWallet`, assim: + +```javascript +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +Observe como a maior parte das nossas funcionalidades está abstraída do nosso componente `Minter.js` do arquivo `interact.js`? É assim que respeitamos o paradigma M-V-C! + +Em `connectWalletPressed`, simplesmente fazemos uma chamada de espera (await) para a função `connectWallet`, importada, e usando sua resposta, nós atualizaremos nossas variáveis `status` e `walletAddress` através de seus state hooks. + +Agora, vamos salvar os dois arquivos `Minter.js` e `interact.js` e testar nossa UI até agora. + +Abra seu navegador em localhost:3000, e pressione o botão "Conectar Carteira" no canto superior direito da página. + +Se você tiver o MetaMask instalado, você será solicitado a conectar sua carteira ao seu dapp. Aceite o convite para se conectar. + +Você verá que o botão da carteira agora reflete que seu endereço está conectado. + +Em seguida, tente atualizar a página... isso é estranho. Nosso botão de carteira está nos pedindo para conectar o MetaMask, mesmo que já esteja conectado... + +Mas não se preocupe! Nós podemos facilmente corrigir isso implementando uma função chamada `getCurrentWalletConnected`, que irá verificar se um endereço já está conectado ao nosso dapp e atualizará nossa interface do usuário adequadamente! + +### Função getCurrentWalletConnected {#get-current-wallet} + +Em seu arquivo `interact.js`, adicione a função`getCurrentWalletConnected`: + +```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: "👆🏽 Write a message in the text-field above.", + } + } else { + return { + address: "", + status: "🦊 Connect to MetaMask using the top right button.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

      +
      + ), + } + } +} +``` + +Este código é _muito_ semelhante à função `connectWallet` que acabamos de escrever. + +A diferença principal é que, em vez de chamar o método `eth_requestAccounts`, que abre o MetaMask para o usuário conectar sua carteira, aqui chamamos o método `eth_accounts`, que simplesmente retorna uma matriz que contém os endereços MetaMask atualmente conectados ao nosso dapp. + +Para ver essa função em ação, vamos chamá-la na função `useEffect` do nosso componente `Minter.js`. + +Como fizemos para `connectWallet`, devemos importar essa função do nosso arquivo `interact.js` para o `Minter.js`, assim: + +```javascript +import { useEffect, useState } from "react" +import { + connectWallet, + getCurrentWalletConnected, //import here +} from "./utils/interact.js" +``` + +Agora, simplesmente a chamamos em nossa função `useEffect`: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +Note que nós usamos a resposta da nossa chamada a `getCurrentWalletConnected` para atualizar nossa `walletAddress` e nossa variável de estado `status`. + +Depois de adicionar este código, tente atualizar a janela do navegador. O botão deve dizer que você está conectado e mostrar uma visualização do endereço de sua carteira conectada - mesmo depois de atualizar! + +### Implementar addWalletListener {#implement-add-wallet-listener} + +O passo final na configuração da nossa carteira dapp é implementar o ouvinte de carteira, para que nossa interface atualize quando o estado mudar, como quando o usuário desconecta ou troca de contas. + +No seu arquivo `Minter.js`, adicione a função `addWalletListener` que se parece com o seguinte: + +```javascript +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Write a message in the text-field above.") + } else { + setWallet("") + setStatus("🦊 Connect to MetaMask using the top right button.") + } + }) + } else { + setStatus( +

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

      + ) + } +} +``` + +Vamos dividir rapidamente o que está acontecendo aqui: + +- Primeiro, nossa função verifica se o `window.ethereum` está habilitado no seu navegador \(ex. MetaMask instalado\). + - Caso contrário, nós simplesmente configuramos a variável de estado `status` para uma JSX string que solicita o usuário instalar a MetaMask. + - Se estiver habilitado, configuramos o ouvinte `window.ethereum.on("accountsChanged")` na linha 3 que houve mudança de estado na carteira MetaMask, inclusive quando o usuário conecta uma conta adicional ao dapp, troca de conta ou desconecta uma conta. Se houver pelo menos uma conta conectada, a variável de estado `walletAddress` é atualizada como a primeira conta no array `accounts` retornada pelo ouvinte. Caso contrário, `walletAddress` é definida como uma string vazia. + +Finalmente, nós devemos chamá-la em nossa função `useEffect`: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +E Voila! Concluímos a programação de toda a funcionalidade da nossa carteira! Agora que a nossa carteira está pronta, vamos descobrir como mintar nossa NFT! + +## Metadados NFT 101 {#nft-metadata-101} + +Lembra dos metadados da NFT que acabamos de falar no Passo 0 deste tutorial - ele dá vida a uma NFT, permitindo que tenha propriedades, como um ativo digital, nome, descrição e outros atributos. + +Vamos precisar configurar esse metadado como um objeto JSON e amarzena-lo, para que possamos passa-lo como parâmetro `tokenURI` quando chamarmos a função `mintNFT` do nosso contrato inteligente. + +No campo texto "Link to Asset", "Name", "Description" inclui as diferentes propriedades dos metadados de nosso NFT. Nós vamos formatar estes metadados como um objeto JSON, mas há algumas opções para onde podemos armazenar este objeto JSON: + +- Poderíamos armazená-lo no blockchain Ethereum; no entanto, fazê-lo seria muito caro. +- Nós poderíamos armazená-lo em um servidor centralizado, como AWS ou Firebase. Mas isso iria contra nossa ética de descentralização. +- Poderíamos usar o IPFS, um protocolo descentralizado e uma rede peer-to-peer para armazenar e compartilhar dados em um sistema de arquivos distribuído. Como este protocolo é descentralizado e gratuito, essa é a melhor opção! + +Para armazenar nossos metadados no IPFS, vamos usar [Pinata](https://pinata.cloud/), uma conveniente API IPFS e um conjunto de ferramentas. Na próxima etapa, vamos explicar exatamente como fazer isso! + +## Use o Pinata para fixar seus metadados no IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} + +Se você não tem uma conta no [Pinata](https://pinata.cloud/), cadastre-se [aqui](https://pinata.cloud/) gratuitamente e conclua as etapas de confirmação do seu e-mail e conta. + +### Crie sua chave API do Pinata {#create-pinata-api-key} + +Navegue para a página[https://pinata.cloud/keys](https://pinata.cloud/keys), então selecione o botão "New Key" no topo da página, defina o Admin widget como ativado, e nomeie sua chave. + +Será mostrado a você um pop-up com as informações da sua API. Certifique-se de colocar isto num lugar seguro. + +Agora que a nossa chave está configurada, vamos adicioná-la ao nosso projeto para que possamos usá-la. + +### Criar o arquivo .env {#create-a-env} + +Podemos armazenar com segurança nossa chave e segredo do Pinata em um arquivo de ambiente. Vamos instalar o [pacote dotenv](https://www.npmjs.com/package/dotenv) no diretório do seu projeto. + +Abra uma nova aba no seu terminal \(separado do terminal executando o local host\) e certifique-se de estar na pasta `minter-starter-files`, então execute o seguinte comando no seu terminal: + +```text +npm install dotenv --save +``` + +Em seguida, crie um arquivo `.env` no diretório raiz dos seus `minter-starter-files` inserindo o seguinte na sua linha de comando: + +```javascript +vim.env +``` + +Isto abrirá seu arquivo `.env` no formato vim \(um editor de texto\). Para salvar, aperte "esc" + ":" + "q" no seu teclado nesta ordem. + +Em seguida, no VSCode, navegue até o seu arquivo `.env` e adicione sua chave de API Pinata e sua API secreta, assim: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +``` + +Salve o arquivo e então você estará pronto para começar a escrever a função de enviar seus metadados JSON para IPFS! + +### Implementar pinJSONToIPFS {#pin-json-to-ipfs} + +Felizmente para nós, a Pinata tem uma API [especificamente para carregar dados JSON para o IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) e um JavaScript conveniente com axios de exemplo que podemos usar, com algumas pequenas modificações. + +Na sua pasta `utils`, vamos criar outro arquivo chamado `pinata.js` e então importar nossa chave Pinata do arquivo .env assim: + +```javascript +require("dotenv").config() +const key = process.env.REACT_APP_PINATA_KEY +const secret = process.env.REACT_APP_PINATA_SECRET +``` + +Em seguida, cole o código adicional abaixo no seu arquivo `pinata.js`. Não se preocupe, nós iremos clarificar o que tudo isso significa! + +```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` + //making axios POST request to Pinata ⬇️ + 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, + } + }) +} +``` + +Então, o que esse código faz exatamente? + +Primeiro, importa [axios](https://www.npmjs.com/package/axios), a um cliente HTTP baseado em promessas para o navegador e node.js, que utilizaremos para fazer um pedido a Pinata. + +Em seguida, temos nossa função assíncrona `pinJSONToIPFS`, que recebe um `JSONBody` como sua entrada e a chave e senha do API Pinata em seu cabeçalho, tudo para fazer uma solicitação POST para sua API `pinJSONToIPFS`. + +- Se esta solicitação POST for bem sucedida, então nossa função retorna um objeto JSON com o valor booleano `sucess` como verdadeiro e a `pinataUrl` onde nossos metadados foram fixados. Nós usaremos a `pinataUrl` retornada, como entrada na `tokenURI` para a função mint do nosso contrato inteligente. +- Se esta solicitação POST falhar, então, nossa função retorna um objeto JSON com o booleano `success` como falso e uma `message` que transmite nosso erro. + +Assim como na nossa função `connectWallet`retorna tipos, estamos retornando objetos JSON para que possamos usar seus parâmetros para atualizar nossas variáveis de estado e nossa interface de usuário. + +## Carregar seu contrato inteligente {#load-your-smart-contract} + +Agora que temos uma maneira de enviar nossos metadados NFT para IPFS através de nossa função de `pinJSONToIPFS`, vamos precisar de uma forma de carregar uma instância do nosso contrato inteligente para que possamos chamar a função `mintNFT`. + +Como mencionado anteriormente, neste tutorial usaremos [este é um contrato inteligente NFT existente](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE); no entanto, se você quer aprender como o fizemos ou como fazer um você mesmo, é altamente recomendável que você confira nosso outro tutorial, ["Como criar uma NFT.](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft). + +### O contrato ABI {#contract-abi} + +Se você examinar de perto nossos arquivos, você notará que no nosso diretório `src`, há um arquivo `contract-abi.json`. Um ABI é necessário para especificar qual função um contrato irá invocar, como também garantir que a função retornará dados no formato que você espera. + +Também precisaremos de uma chave API Alchemy e da API Alchemy Web3 para conectar ao blockchain Ethereum e carregar o nosso contrato inteligente. + +### Crie a sua chave API Alchemy {#create-alchemy-api} + +Se ainda não tiver uma conta na Alchemy, você pode se cadastrar gratuitamente [neste link](https://alchemy.com/?a=eth-org-nft-minter) + +Assim que criar uma conta na Alchemy, você pode gerar uma chave de API criando um "app". Isso nos permitirá fazer solicitações à rede de testes Ropsten. + +Navegue até a pagina "Create App" no seu "Dashboard da Alchemy", passe o cursor sob "Apps" na barra de navegação e clique em “Create App”. + +Nomeie seu aplicativo; nós escolhemos "Minha primeira NFT!", faça uma breve descrição, selecione "Staging" para o ambiente (usado para a contabilidade do seu ‘app’) e escolha "Ropsten" para sua rede. + +Clique em "Create App", e é isso e tudo! Seu app deveria aparecer na tabela abaixo. + +Incrível agora que criamos a nossa URL de API Alchemy HTTP, copie-a para a sua área de transferência... + +…e então vamos adicioná-lo ao nosso arquivo `.env`. Ao todo, seu arquivo .env deve se parecer com isto: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ +``` + +Agora que temos nosso contrato ABI e nossa chave API do Alchemy, estamos prontos para carregar o nosso contrato inteligente usando [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3). + +### Configure seu Alchemy Web3 endpoint e contrato {#setup-alchemy-endpoint} + +Primeiro, se você ainda não tiver, você precisará instalar [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) navegando até o diretório home: `nft-minter-tutorial` no terminal: + +```text +cd .. +yarn add @alch/alchemy-web3 +``` + +Em seguida, voltaremos para o nosso arquivo `interact.js`. No topo do arquivo, adicione o seguinte código para importar a chave de Alchemy do seu arquivo .env e configure seu Alchemy Web3 endpoint: + +```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) é um invólucro em torno do [Web3.js](https://docs.web3js.org/), fornecendo métodos aprimorados da API e outros benefícios cruciais para tornar a sua vida de desenvolvedor da Web3 mais fácil. Ele foi projetado para exigir uma configuração mínima, para que você possa começar a usá-la no seu aplicativo imediatamente! + +Em seguida, vamos adicionar nosso contrato ABI e endereço do contrato ao nosso arquivo. + +```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" +``` + +Assim que tivermos ambas as coisas, estaremos prontos para começar a codificar a nossa função "mint"! + +## Implementar a função mintNFT {#implement-the-mintnft-function} + +Dentro do seu arquivo `interact.js`, vamos definir nossa função, `mintNFT`, que deliberadamente vai criar nossa NFT. + +Porque vamos fazer numerosas chamadas assíncronas \(para o Pinata fixar nossos metadados para IPFS, Alchemy Web3 para carregar o nosso contrato inteligente, e MetaMask para assinar nossas transações\), nossa função também será assíncrona. + +As três entradas para nossa função serão a `url` do nosso ativo digital, `name`e `description`. Adicione a seguinte assinatura da função abaixo da função `connectWallet`: + +```javascript +export const mintNFT = async (url, name, description) => {} +``` + +### Manipulação de erros de script {#input-error-handling} + +Naturalmente, faz sentido ter algum tipo de tratamento de erro de entrada no início da função, então vamos sair desta função se nossos parâmetros de entrada não estiverem corretos. Dentro da nossa função, vamos adicionar o seguinte código: + +```javascript +export const mintNFT = async (url, name, description) => { + //error handling + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Please make sure all fields are completed before minting.", + } + } +} +``` + +Essencialmente, se algum dos parâmetros de entrada for uma string vazia, então retornamos um objeto JSON onde o valor booleano `success` é falso, e a string `status` repassa que todos os campos na nossa UI precisam estar completos. + +### Carregar os metadados para o IPFS {#upload-metadata-to-ipfs} + +Assim que soubermos que nossos metadados estão formatados corretamente, o próximo passo é envolvê-lo em um objeto JSON e enviá-lo para IPFS através do `pinJSONToIPFS` que escrevemos! + +Para fazer isso, precisamos primeiro importar a função `pinJSONToIPFS` para nosso arquivo `interact.js`. No topo do `interact.js`, vamos adicionar: + +```javascript +import { pinJSONToIPFS } from "./pinata.js" +``` + +Lembre-se que `pinJSONToIPFS` recebe um corpo JSON. Então, antes de fazer a chamada, precisaremos formatar a nossa `url`, `name`e `description` parâmetros em um objeto JSON. + +Vamos atualizar nosso código para criar um objeto JSON chamado `metadada` e então fazer uma chamada para `pinJSONToIPFS` com este parâmetro `metadada`: + +```javascript +export const mintNFT = async (url, name, description) => { + //error handling + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Please make sure all fields are completed before minting.", + } + } + + //make metadata + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //make pinata call + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 Something went wrong while uploading your tokenURI.", + } + } + const tokenURI = pinataResponse.pinataUrl +} +``` + +Note, nós armazenamos a resposta de nossa chamada para `pinJSONToIPFS(metadada)` no objeto `pinataResponse`. Então, analisamos esse objeto para quaisquer erros. + +Se houver um erro, nós retornamos um objeto JSON onde o `sucess` booleano é falso e nossa string `status` relata que nossa chamada falhou. Caso contrário, nós extraímos a `pinataURL` da `pinataResponse` e armazenamos como nossa variável `tokenURI`. + +Agora é hora de carregar o nosso contrato inteligente usando a API da Alchemy Web3 que inicializamos no topo do nosso arquivo. Adicione a seguinte linha de código na parte inferior da função `mintNFT` para definir o contrato na `window.contract` variável global: + +```javascript +window.contract = await new web3.eth.Contract(contractABI, contractAddress) +``` + +A última coisa a adicionar em nossa função `mintNFT` é a nossa transação Ethereum: + +```javascript +//set up your Ethereum transaction +const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: window.ethereum.selectedAddress, // must match user's active address. + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //make call to NFT smart contract +} + +//sign the transaction via MetaMask +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + + txHash, + } +} catch (error) { + return { + success: false, + status: "😥 Something went wrong: " + error.message, + } +} +``` + +Se você já está familiarizado com as transações na Ethereum, perceberá que a estrutura é bem parecida com a que você já viu. + +- Primeiro, nós configuramos nossos parâmetros de transações. + - `to` especificar o endereço do destinatário \(nosso contrato inteligente\) + - `from` especifica o signatário da transação \(o endereço conectado ao MetaMask: `window.ethereum.selectedAddress`\) + - `data` contém a chamada para nosso contrato inteligente do método `mintNFT`, que recebe nossa `tokenURI` e o endereço da carteira do usuário, `window.ethereum.selectedAddress` como entradas +- Então, faremos uma chamada para, `window.ethereum.request,` onde pedimos ao MetaMask para assinar a transação. Note que nessa solicitação, estamos especificando nosso método eth \(eth_SentTransaction\) e passando em nossos `transactionParameters`. Neste ponto, a MetaMask irá abrir no navegador e pedirá que o usuário assine ou rejeite a transação. + - Se a transação for bem-sucedida, a função retornará um objeto JSON onde o booleano `success` é definido como verdadeiro e a string `status` pede que o usuário verifique o Etherscan para obter mais informações sobre sua transação. + - Se a transação falhar, a função retornará um objeto JSON onde o booleano `success` é definido como falso, `status` string retransmite a mensagem de erro. + +Ao todo, nossa função `mintNFT` deve-se parecer com isto: + +```javascript +export const mintNFT = async (url, name, description) => { + //error handling + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Please make sure all fields are completed before minting.", + } + } + + //make metadata + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //pinata pin request + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 Something went wrong while uploading your tokenURI.", + } + } + const tokenURI = pinataResponse.pinataUrl + + //load smart contract + window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract(); + + //set up your Ethereum transaction + const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: window.ethereum.selectedAddress, // must match user's active address. + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //make call to NFT smart contract + } + + //sign transaction via MetaMask + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + + txHash, + } + } catch (error) { + return { + success: false, + status: "😥 Something went wrong: " + error.message, + } + } +} +``` + +Essa é uma função gigante! Agora, só precisamos conectar nossa função `mintNFT` com nosso componente `Minter.js`... + +## Conectando mintNFT ao nosso frontend Minter.js {#connect-our-frontend} + +Abra o seu arquivo `Minter.js` e atualize `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` a linha em cima deve ser: + +```javascript +import { + connectWallet, + getCurrentWalletConnected, + mintNFT, +} from "./utils/interact.js" +``` + +Finalmente, implemente a função `onMintPressed` para fazer a chamada(await call) para a função `mintNFT`importada e atualize a variável de estado `status` para refletir se nossa transação foi bem-sucedida ou falhou: + +```javascript +const onMintPressed = async () => { + const { status } = await mintNFT(url, name, description) + setStatus(status) +} +``` + +## Implante seu NFT a um site ao vivo {#deploy-your-NFT} + +Pronto para deixar seu projeto ao vivo para que usuários interajam? Confira [este tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) para implantar seu Minter em um site ao vivo. + +Um último passo... + +## Leve o mundo blockchain numa enxurrada {#take-the-blockchain-world-by-storm} + +Só uma brincadeira, você chegou ao fim do tutorial! + +Para recapitular, construindo um minter NFT, você aprendeu com sucesso como: + +- Conectar ao MetaMask através do seu projeto frontend +- Chamar métodos de contrato inteligentes no seu frontend +- Assine transações usando MetaMask + +Provavelmente você gostaria de poder exibir seu NFT na sua carteira — então certifique-se de conferir [ a parte Como ver seu NFT na sua carteira](https://docs.alchemyapi.io/alchemy/tutorials/how-to-write-and-deploy-a-nft-smart-contract/how-to-view-your-nft-in-your-wallet)! + +E, como sempre, se você tiver alguma dúvida, estamos aqui para ajudar no [Alchemy Discord](https://discord.gg/gWuC7zB). Mal podemos esperar para ver como você aplicará os conceitos deste tutorial em seus projetos futuros! diff --git a/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md new file mode 100644 index 00000000000..4eb6f676681 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -0,0 +1,1277 @@ +--- +title: "Passo a passo do contrato de ponte padrão da Optimism" +description: Como funciona a ponte padrão para a Optimism? Porque funciona desta maneira? +author: Ori Pomerantz +tags: + - "solidity" + - "ponte" + - "camada 2" +skill: intermediate +published: 2022-03-30 +lang: pt-br +--- + +[Optimism](https://www.optimism.io/) é uma [ Optimistic Rollup](/developers/docs/scaling/optimistic-rollups/). Optimistic rollups podem processar transações por um preço muito inferior ao Ethereum Mainnet (também conhecido como layer 1 ou L1) porque as transações são processadas apenas por alguns nós, em vez de cada nó na rede. Ao mesmo tempo, os dados são todos escritos em L1, de modo que tudo pode ser provado e reconstruído com todas as garantias de integridade e disponibilidade da rede principal. + +Para usar ativos L1 na Optimism (ou qualquer outra L2), os ativos precisam ser [enviados pela ponte](/bridges/#prerequisites). Uma maneira de conseguir isso é os usuários bloquearem ativos (ETH e [tokens ERC-20](/developers/docs/standards/tokens/erc-20/) são os mais comuns) na L1, e receber ativos equivalentes para usar na L2. Por fim, quem for que acabe com eles, talvez queira enviá-los de volta para a L1. Ao fazer isso, os ativos são queimados na L2 e, em seguida, liberados para o usuário na L1. + +É assim que a [ponte padrão Optimism](https://community.optimism.io/docs/developers/bridge/standard-bridge) funciona. Neste artigo, passamos pelo código-fonte para essa ponte para ver como ele funciona e estudá-lo como um exemplo de código Solidity bem escrito. + +## Fluxo de controle {#control-flows} + +A ponte tem dois fluxos principais: + +- Depósito (de L1 a L2) +- Saque de (L2 para L1) + +### Fluxo de depósitos {#deposit-flow} + +#### Camada 1 {#deposit-flow-layer-1} + +1. Se depositar um ERC-20, o depositante dá à ponte uma permissão para gastar o valor que está sendo depositado +2. O depositor chama a ponte L1(`depositERC20`, `depositERC20To`, `depositETH`, ou `depositETHTo`) +3. A ponte L1 toma posse do ativo que está na ponte + - ETH: O ativo é transferido pelo depositante como parte da chamada + - ERC-20: O ativo é transferido pela ponte para si mesmo usando a permissão fornecida pelo depositante +4. A ponte L1 usa o mecanismo de mensagem entre domínios para chamar `finalizeDeposit` na ponte L2 + +#### Camada 2 {#deposit-flow-layer-2} + +5. A ponte L2 verifica que a chamada do `finalizeDeposit` é legítima: + - Se veio do contrato de mensagem entre domínios + - Era originalmente da ponte em L1 +6. A ponte L2 checa se o contrato do token ERC-20 na L2 é o correto: + - O contrato L2 reporta que sua contraparte L1 é a mesma de onde vieram os tokens da L1 + - O contrato L2 reporta que suporta a interface correta ([usando ERC-165](https://eips.ethereum.org/EIPS/eip-165)). +7. Se o contrato L2 é o correto, chame-o para cunhar o número apropriado de tokens para o endereço apropriado. Se não, comece o processo de retirada para permitir o usuário reclamar os tokens no L1. + +### Fluxo de retirada {#withdrawal-flow} + +#### Camada 2 {#withdrawl-flow-layer-2} + +1. O sacador chama a ponte L2 (`withdraw` ou `withdrawTo`) +2. A ponte L2 queima o número apropriado de tokens pertencentes a `msg.sender` +3. A ponte L2 usa o mecanismo de mensagens entre domínios para chamar `finalizeETHWithdrawal` ou `finalizeERC20Withdrawal` na ponte L1 + +#### Camada 1 {#withdrawl-flow-layer-1} + +4. A ponte L1 verifica a chamada a `finalizeETHWithdrawal` ou `finalizeERC20Withdrawal` é legitima: + - Veio de um mecanismo de mensagens entre domínios + - Foi originada da ponte no L2 +5. A ponte L1 transfere o ativo apropriado (ETH ou ERC-20) para o endereço apropriado + +## Código Camada 1 {#layer-1-code} + +Este é o código que roda na L1, a Rede Principal do Ethereum. + +### IL1ERC20Bridge {#IL1ERC20Bridge} + +[Esta interface é definida aqui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol). Ela inclui funções e definições exigidas para realizar a ponte de tokens ERC-20. + +```solidity +// SPDX-License-Identifier: MIT +``` + +[Maioria do código da Optimism é lançada sob a licença MIT](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). + +```solidity +pragma solidity >0.5.0 <0.9.0; +``` + +Neste momento, a última versão do Solidity é 0.8.12. Até versão 0.9.0 ser lançada, nós não sabemos se este código é compatível com ele ou não. + +```solidity +/** + * @title IL1ERC20Bridge + */ +interface IL1ERC20Bridge { + /********** + * Events * + **********/ + + event ERC20DepositInitiated( +``` + +Na terminologia de ponte Optimism _deposit_ significa transferência de L2 para L2, e _withdrawal_ significa uma transferência de L2 para L1. + +```solidity + address indexed _l1Token, + address indexed _l2Token, +``` + +Na maioria dos casos o endereço de um ERC-20 na L1 não é o mesmo endereço do equivalente ERC-20 na L2. [Você pode ver a lista de endereços de tokens aqui](https://static.optimism.io/optimism.tokenlist.json). O endereço com `chainId` 1 está na L1 (Mainnet) e o endereço com `chainId` 10 está na L2 (Optimism). Os outros dois valores `chainId` são para a rede de testes Kovan (42) e a rede de testes Optimistic Kovan (69). + +```solidity + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +É possível adicionar notas para transferências, caso no qual elas são adicionadas para os eventos que as reportam. + +```solidity + event ERC20WithdrawalFinalized( + address indexed _l1Token, + address indexed _l2Token, + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +O mesmo contrato de ponte manipula transferências em ambas as direções. No caso da ponte L1, isto significa inicialização de depósitos e finalização de retiradas. + +```solidity + + /******************** + * Public Functions * + ********************/ + + /** + * @dev get the address of the corresponding L2 bridge contract. + * @return Address of the corresponding L2 bridge contract. + */ + function l2TokenBridge() external returns (address); +``` + +Esta função não é realmente necessária, porque na L2 ela é um contrato pré-implantado, então ela está sempre no endereço `0x4200000000000000000000000000000000000010`. Ela está aqui por simetria com a ponte L2, porque o endereço da ponte L1 _não_ é trivial de saber. + +```solidity + /** + * @dev deposit an amount of the ERC20 to the caller's balance on L2. + * @param _l1Token Address of the L1 ERC20 we are depositing + * @param _l2Token Address of the L1 respective L2 ERC20 + * @param _amount Amount of the ERC20 to deposit + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function depositERC20( + address _l1Token, + address _l2Token, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +O parâmetro `_l2Gas` é a quantidade de gas L2 que a transação tem permissão de gastar. [Até um certo (alto) limite, isto é grátis](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), portanto a menos que o contrato ERC-20 faça algo realmente estranho quando cunhando, isto não deveria ser um problema. Esta função cuida do cenário comum, onde um usuário faz a ponte dos ativos para o mesmo endereço em uma blockchain diferente. + +```solidity + /** + * @dev deposit an amount of ERC20 to a recipient's balance on L2. + * @param _l1Token Address of the L1 ERC20 we are depositing + * @param _l2Token Address of the L1 respective L2 ERC20 + * @param _to L2 address to credit the withdrawal to. + * @param _amount Amount of the ERC20 to deposit. + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function depositERC20To( + address _l1Token, + address _l2Token, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +Esta função é quase idêntica a `depositERC20`, mas ela deixa você enviar o ERC-20 para diferentes endereços. + +```solidity + /************************* + * Cross-chain Functions * + *************************/ + + /** + * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the + * L1 ERC20 token. + * This call will fail if the initialized withdrawal from L2 has not been finalized. + * + * @param _l1Token Address of L1 token to finalizeWithdrawal for. + * @param _l2Token Address of L2 token where withdrawal was initiated. + * @param _from L2 address initiating the transfer. + * @param _to L1 address to credit the withdrawal to. + * @param _amount Amount of the ERC20 to deposit. + * @param _data Data provided by the sender on L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +Saques (e outras mensagens de L2 para L1) na Optimism é um processo em duas etapas: + +1. Uma transação inicial no L2. +2. Uma transação de finalização ou de reclamação na L1. Esta transação precisa acontecer depois do [período de desafio de falha](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) para a transação L2 terminar. + +### IL1StandardBridge {#il1standardbridge} + +[Esta interface é definida aqui](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol). Este arquivo contém definições de evento e função para ETH. Estas definições são muito similares com aquelas definidas em `IL1ERC20Bridge` acima para ERC-20. + +A ponte interface é dividida entre dois arquivos, porque alguns tokens ERC-20 requerem processamento customizado e não podem ser manipulados pela ponte padrão. Dessa maneira a ponte customizada que manipula este token pode implementar `IL1ERC20Bridge` e não ter que também fazer a ponte ETH. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +import "./IL1ERC20Bridge.sol"; + +/** + * @title IL1StandardBridge + */ +interface IL1StandardBridge is IL1ERC20Bridge { + /********** + * Events * + **********/ + event ETHDepositInitiated( + address indexed _from, + address indexed _to, + uint256 _amount, + bytes _data + ); +``` + +Este evento é praticamente idêntico à versão ERC-20 (`ERC20DepositInitiated`), exceto por não ter os endereços de token L1 e L2. O mesmo é verdade para outros eventos e funções. + +```solidity + event ETHWithdrawalFinalized( + . + . + . + ); + + /******************** + * Public Functions * + ********************/ + + /** + * @dev Deposit an amount of the ETH to the caller's balance on L2. + . + . + . + */ + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable; + + /** + * @dev Deposit an amount of ETH to a recipient's balance on L2. + . + . + . + */ + function depositETHTo( + address _to, + uint32 _l2Gas, + bytes calldata _data + ) external payable; + + /************************* + * Cross-chain Functions * + *************************/ + + /** + * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the + * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called + * before the withdrawal is finalized. + . + . + . + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +### CrossDomainEnabled {#crossdomainenabled} + +[Este contrato](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) é herdado por ambas pontes ([L1](#the-l1-bridge-contract) e [L2](#the-l2-bridge-contract)) para enviar mensagens para a outra camada. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +/* Interface Imports */ +import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; +``` + +[Esta interface](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) mostra ao contrato como enviar mensagens para a outra camada, usando o mensageiro entre domínios. Este mensageiro entre domínios é todo um outro sistema, e merece um artigo próprio, que espero escrever no futuro. + +```solidity +/** + * @title CrossDomainEnabled + * @dev Helper contract for contracts performing cross-domain communications + * + * Compiler used: defined by inheriting contract + */ +contract CrossDomainEnabled { + /************* + * Variables * + *************/ + + // Messenger contract used to send and receive messages from the other domain. + address public messenger; + + /*************** + * Constructor * + ***************/ + + /** + * @param _messenger Address of the CrossDomainMessenger on the current layer. + */ + constructor(address _messenger) { + messenger = _messenger; + } +``` + +O único parâmetro que o contrato precisa saber é o endereço do mensageiro entre domínios nessa camada. Este parâmetro é configurado uma vez, no construtor, e nunca muda. + +```solidity + + /********************** + * Function Modifiers * + **********************/ + + /** + * Enforces that the modified function is only callable by a specific cross-domain account. + * @param _sourceDomainAccount The only account on the originating domain which is + * authenticated to call this function. + */ + modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) { +``` + +O mensageiro entre domínios é acessível por qualquer contrato na blockchain onde estiver rodando (seja Ethereum mainnet ou Optimism). Mas nós precisamos da ponte em cada lado para _apenas_ confiar em certas mensagens se eles vierem da ponte do outro lado. + +```solidity + require( + msg.sender == address(getCrossDomainMessenger()), + "OVM_XCHAIN: messenger contract unauthenticated" + ); +``` + +Somente mensagens do mensageiro entre domínios apropriado (`messenger`, como você vê abaixo) pode ser confiado. + +```solidity + + require( + getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount, + "OVM_XCHAIN: wrong sender of cross-domain message" + ); +``` + +A maneira que o mensageiro entre domínios fornece o endereço que enviou uma mensagem com a outra camada é [a função `.xDomainMessageSender()`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). Enquanto ele for chamado na transação que foi iniciada pela mensagem, ele pode fornecer esta informação. + +Nós precisamos nos certificar que a mensagem que nós recebemos veio da outra ponte. + +```solidity + + _; + } + + /********************** + * Internal Functions * + **********************/ + + /** + * Gets the messenger, usually from storage. This function is exposed in case a child contract + * needs to override. + * @return The address of the cross-domain messenger contract which should be used. + */ + function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) { + return ICrossDomainMessenger(messenger); + } +``` + +Esta função retorna o mensageiro entre domínios. Nós usamos uma função ao invés da variável `messenger` para permitir contratos que herdam deste para usar um algoritmo para especificar qual mensageiro entre domínios usar. + +```solidity + + /** + * Sends a message to an account on another domain + * @param _crossDomainTarget The intended recipient on the destination domain + * @param _message The data to send to the target (usually calldata to a function with + * `onlyFromCrossDomainAccount()`) + * @param _gasLimit The gasLimit for the receipt of the message on the target domain. + */ + function sendCrossDomainMessage( + address _crossDomainTarget, + uint32 _gasLimit, + bytes memory _message +``` + +Finalmente, a função que envia a mensagem para a outra camada. + +```solidity + ) internal { + // slither-disable-next-line reentrancy-events, reentrancy-benign +``` + +[Slither](https://github.com/crytic/slither)é um analisador estático que a Optimism roda em cada contrato para procurar por vulnerabilidades e outros problemas em potencial. Nesse caso, as seguintes linhas disparam duas vulnerabilidades: + +1. [Eventos de reentrância](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) +2. [Reentrância Benigna](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) + +```solidity + getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit); + } +} +``` + +Neste caso nós não estamos preocupados sobre reentrância. Nós sabemos que `getCrossDomainMessenger()` returna um endereço confiável, mesmo se Slither não tem como saber isso. + +### O contrato da ponte L1 {#the-l1-bridge-contract} + +[O código-fonte para este contrato está aqui](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; +``` + +A interface pode ser parte de outros contratos, então eles têm de suportar uma larga faixa de versões de Solidity. Mas a ponte por ela mesma é o nosso contrato, e nós podemos ser estritos sobre qual versão Solidity ela usa. + +```solidity +/* Interface Imports */ +import { IL1StandardBridge } from "./IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; +``` + +[IL1ERC20Bridge](#IL1ERC20Bridge) e [IL1StandardBridge](#IL1StandardBridge) são explicados acima. + +```solidity +import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol"; +``` + +[Esta interface](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) nos deixa criar mensagens para controlar a ponte padrão em L2. + +```solidity +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[Esta interface](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) nos deixa controlar contratos ERC-20. [Você pode ler mais sobre ela aqui](/developers/tutorials/erc20-annotated-code/#the-interface). + +```solidity +/* Library Imports */ +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +``` + +[Como explicado acima](#crossdomainenabled), este contrato é usado para mensageria entre camadas. + +```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) tem os endereços dos contratos L2 que sempre tem o mesmo endereço. Isto inclui a ponte padrão em L2. + +```solidity +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +``` + +[Utilitários de endereços OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Ele é usado para distinguir entre endereços de contrato e aqueles pertencentes a contas de propriedade externa (EOA). + +Note que isto não é a solução perfeita, porque não há como distinguir entre chamadas diretas e chamadas feitas de um construtor de contrato, mas pelo menos isto nos deixa identificar e evitar alguns erros comuns de usuário. + +```solidity +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +``` + +[O padrão ERC-20 ](https://eips.ethereum.org/EIPS/eip-20) suporta duas maneiras para um contrato reportar falha: + +1. Revert +2. Return `false` + +Gerenciar ambos casos faria nosso código mais complicado, então ao invés disso, usamos [OpenZeppelin `SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), que garante [ que todas as falhas resultem num revert](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). + +```solidity +/** + * @title L1StandardBridge + * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard + * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits + * and listening to it for newly finalized withdrawals. + * + */ +contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled { + using SafeERC20 for IERC20; +``` + +Esta linha é como especificamos para usar o wrapper `SafeERC20` cada vez que nós usamos a interface `IERC20`. + +```solidity + + /******************************** + * External Contract References * + ********************************/ + + address public l2TokenBridge; +``` + +O endereço de [L2StandardBridge](#the-l2-bridge-contract). + +```solidity + + // Maps L1 token to L2 token to balance of the L1 token deposited + mapping(address => mapping(address => uint256)) public deposits; +``` + +Um [mapeamento](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) em dobro como este é a maneira de você definir uma [array esparsa bi-dimensional](https://en.wikipedia.org/wiki/Sparse_matrix). Valores nesta estrutura de dados são identificados como `deposit[L1 token addr][L2 token addr]`. O valor padrão é zero. Somente células que são configuradas para um valor diferente são escritas no storage. + +```solidity + + /*************** + * Constructor * + ***************/ + + // This contract lives behind a proxy, so the constructor parameters will go unused. + constructor() CrossDomainEnabled(address(0)) {} +``` + +Para querer ser capaz de atualizar este contrato sem ter que copiar todas as variáveis no storage. Para fazer isso, nós usamos um [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), um contrato que usa [`delegatecall`](https://solidity-by-example.org/delegatecall/) para transferir chamadas para um contato separado cujo endereço é armazenado pelo contrato proxy (quando você atualiza, você diz ao proxy para mudar o endereço). Quando você usa `delegatecall` o storage permanece com o valor do contrato _chamador_, então os valores de todas as variáveis de estado do contrato não são afetadas. + +Um efeito deste padrão é que o storage do contrato que é _chamado_ pelo `delegatecall` não é usado, e portanto os valores do construtor passados para ele não importam. Esta é a razão pela qual nós podemos fornecer um valor sem sentido para o construtor `CrossDomainEnabled`. É também a razão que a inicialização abaixo é separada do construtor. + +```solidity + /****************** + * Initialization * + ******************/ + + /** + * @param _l1messenger L1 Messenger address being used for cross-chain communications. + * @param _l2TokenBridge L2 standard bridge address. + */ + // slither-disable-next-line external-function +``` + +Este [teste Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) identifica funções que não são chamadas do código do contrato e poderiam portanto serem declaradas `external` ao invés de `public`. As funções de custo de gas `external` podem ser menores, porque elas podem ser fornecidas com parâmetros no calldata. Funções declaradas `public` têm de ser acessíveis de dentro do contrato. Contratos não podem modificar seus próprios calldata, então os parâmetros têm que estar na memória. Quando esta função é chamada externamente, é necessário copiar o calldata para a memória, que custa gas. Nesse caso a função é chamada somente uma vez, então a ineficiência não importa para nós. + +```solidity + function initialize(address _l1messenger, address _l2TokenBridge) public { + require(messenger == address(0), "Contract has already been initialized."); +``` + +A função `initialize` deve ser chamada só uma vez. Se o endereço do mensageiro entre domínios L1 ou se a ponte do token L2 mudam, nós criamos um novo proxy e uma nova ponte que chama ele. Isto é improvável de acontecer, exceto quando o sistema inteiro é atualizado, uma ocorrência muito rara. + +Note que esta função não tem nenhum mecanismo que restringe _quem_ pode chamá-la. Isto significa que em teoria um atacante poderia esperar até que nós implantassemos o proxy e a primeira versão da ponte e então [front-run](https://solidity-by-example.org/hacks/front-running/)para pegar a função `initialize` antes que o usuário legítimo o faça. Mas há dois métodos para evitar isso: + +1. Se o contrato for implantado não diretamente por um EOA mas [em uma transação que tem outro contrato criando eles,](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595) o processo inteiro pode ser atômico, e finalizar antes que qualquer outra transação seja executada. +2. Se a chamada legítima para `initialize` falhar, é sempre possível ignorar o proxy recém-criado e fazer a ponte para criar outros novos. + +```solidity + messenger = _l1messenger; + l2TokenBridge = _l2TokenBridge; + } +``` + +Estes são dois parâmetros que a ponte precisa conhecer. + +```solidity + + /************** + * Depositing * + **************/ + + /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious + * contract via initcode, but it takes care of the user error we want to avoid. + */ + modifier onlyEOA() { + // Used to stop deposits from contracts (avoid accidentally lost tokens) + require(!Address.isContract(msg.sender), "Account not EOA"); + _; + } +``` + +É por essa razão que precisamos de utilitários de `Address` do OpenZeppelin. + +```solidity + /** + * @dev This function can be called with no data + * to deposit an amount of ETH to the caller's balance on L2. + * Since the receive function doesn't take data, a conservative + * default amount is forwarded to L2. + */ + receive() external payable onlyEOA { + _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes("")); + } +``` + +A função existe para finalidade de testes. Note que ela não aparece nas definições de interface - não é para uso corrente. + +```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); + } +``` + +Estas duas funções são wrappers em volta do `_initiateETHDeposit`, a função que manipula o depósito do ETH real. + +```solidity + /** + * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of + * the deposit. + * @param _from Account to pull the deposit from on L1. + * @param _to Account to give the deposit to on L2. + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function _initiateETHDeposit( + address _from, + address _to, + uint32 _l2Gas, + bytes memory _data + ) internal { + // Construct calldata for finalizeDeposit call + bytes memory message = abi.encodeWithSelector( +``` + +A maneira que mensagens entre domínios trabalham é que o contrato de destino é chamado com a mensagem como o seu calldata. Contratos Solidity sempre interpretam seu calldata de acordo com [a especificação ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). A função Solidity [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) cria este calldata. + +```solidity + IL2ERC20Bridge.finalizeDeposit.selector, + address(0), + Lib_PredeployAddresses.OVM_ETH, + _from, + _to, + msg.value, + _data + ); +``` + +A mensagem aqui é chamar [a função `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) com estes parâmetros: + +| Parâmetro | Valores | Significado | +| ----------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| \_l1Token | address(0) | Valor especial para o ETH (que não é um token ERC-20) na L1 | +| \_l2Token | Lib_PredeployAddresses.OVM_ETH | O contrato L2 que gerencia ETH na Optimism, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (este contrato é apenas para uso interno da Optimism) | +| \_from | \_from | Os endereços na L1 que enviam o ETH | +| \_to | \_to | O endereço na L2 que recebe o ETH | +| amount | msg.value | Quantidade de wei enviado (que já foi enviado para a ponte) | +| \_data | \_data | Dados adicionais para anexar ao depósito | + +```solidity + // Send calldata into L2 + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); +``` + +Enviar a mensagem através de mensageiro entre domínios. + +```solidity + // slither-disable-next-line reentrancy-events + emit ETHDepositInitiated(_from, _to, msg.value, _data); + } +``` + +Emitir um evento para informar qualquer aplicação descentralizada que escuta esta transferência. + +```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); + } +``` + +Estas duas funções são wrappers em volta do `_initiateERC20Deposit`, a função que manipula o depósito real do ERC-20. + +```solidity + /** + * @dev Performs the logic for deposits by informing the L2 Deposited Token + * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom) + * + * @param _l1Token Address of the L1 ERC20 we are depositing + * @param _l2Token Address of the L1 respective L2 ERC20 + * @param _from Account to pull the deposit from on L1 + * @param _to Account to give the deposit to on L2 + * @param _amount Amount of the ERC20 to deposit. + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function _initiateERC20Deposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) internal { +``` + +Esta função é similiar a `_initiateETHDeposit` acima, com algumas poucas diferenças importantes. A primeira diferença é que esta função recebe o endereço de token e a quantia a transferir como parâmetros. No caso do ETH, a chamada para a ponte já inclui a transferência do ativo para a conta da ponte (`msg.value`). + +```solidity + // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future + // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if + // _from is an EOA or address(0). + // slither-disable-next-line reentrancy-events, reentrancy-benign + IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount); +``` + +Transferências de tokens ERC-20 seguem um processo diferente do ETH: + +1. O usuário (`_from`) dá uma permissão para a ponte para transferir os tokens apropriados. +2. O usuário chama a ponte com o endereço do contrato do token, a quantia, etc. +3. A ponte transfere os tokens (para ela mesmo) como parte do processo de depósito. + +O primeiro passo pode acontecer em uma transação separada das últimas duas. Entretanto, front-running não é um problema porque as duas funções que chamam `_initiateERC20Deposit` (`depositERC20` e `depositERC20To`) somente chamam essa função com `msg.sender` como parâmetro `_from`. + +```solidity + // Construct calldata for _l2Token.finalizeDeposit(_to, _amount) + bytes memory message = abi.encodeWithSelector( + IL2ERC20Bridge.finalizeDeposit.selector, + _l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + + // Send calldata into 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; +``` + +Adicione a quantia depositada de tokens para a estrutura de dados `deposits`. Pode haver múltiplos endereços em L2 que correspondam ao mesmo token ERC-20 L1, portanto não é suficiente usar saldo de ponte de token ERC-20 L1 para rastrear os depósitos. + +```solidity + + // slither-disable-next-line reentrancy-events + emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data); + } + + /************************* + * Cross-chain Functions * + *************************/ + + /** + * @inheritdoc IL1StandardBridge + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +A ponte L2 envia uma mensagem para o mensageiro entre domínios L2 que causa o mensageiro entre domínios L1 chamar esta função (uma vez que a [transação que finaliza a mensagem](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions) é submetida no L1, claro). + +```solidity + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +Certifique-se que isto é uma mensagem _legítima_, vinda do mensageiro entre domínios e originada com o token da ponte L2. Esta função é usada para retirar ETH da ponte, então nós temos que nos certificar que é somente chamada pelo chamador autorizado. + +```solidity + // slither-disable-next-line reentrancy-events + (bool success, ) = _to.call{ value: _amount }(new bytes(0)); +``` + +A maneira de transferir ETH é chamar o recebedor com a quantia de wei no `msg.value`. + +```solidity + require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); + + // slither-disable-next-line reentrancy-events + emit ETHWithdrawalFinalized(_from, _to, _amount, _data); +``` + +Emitir um evento sobre o saque. + +```solidity + } + + /** + * @inheritdoc IL1ERC20Bridge + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +Esta função é similar a `finalizeETHWithdrawal` acima, com as mudanças necessárias para os tokens ERC-20. + +```solidity + deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount; +``` + +Atualiza a estrutura de dados`deposits`. + +```solidity + + // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer + // 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); + } + + + /***************************** + * Temporary - Migrating ETH * + *****************************/ + + /** + * @dev Adds ETH balance to the account. This is meant to allow for ETH + * to be migrated from an old gateway to a new gateway. + * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the + * old contract + */ + function donateETH() external payable {} +} +``` + +Houve uma implementação anterior dessa ponte. Quando nos movemos da implementação para esta ponte, tivemos que mover todos os ativos. Tokens ERC-20 podem serem simplesmente movidos. Entretanto, para transferir ETH para um contrato, você precisa da aprovação do contrato, que é o que `donateETH` nos fornece. + +## Tokens ERC-20 na L2 {#erc-20-tokens-on-l2} + +Para um token ERC-20 servir na ponte padrão, ele precisa permitir que a ponte padrão, e _somente_ a ponte padrão, cunhe token. Isto é necessário porque as pontes precisam garantir que o número de tokens circulando na Optimism é igual ao número de tokens travados dentro do contrato da ponte L1. Se houver tokens demais na L2, alguns usuários ficarão incapazes de usar a ponte de volta para os seus ativos para a L1. Ao invés de uma ponte confiável, nós iriamos essencialmente recriar [reserva fracionária bancária](https://www.investopedia.com/terms/f/fractionalreservebanking.asp). Se houver tokens demais em L1, alguns desses tokens estaria travados dentro do contrato da ponte para sempre, porque não há maneira de liberá-los sem queimar tokens L2. + +### IL2StandardERC20 {#il2standarderc20} + +Cada token ERC-20 na L2 que usa a ponte padrão precisa fornecer [esta interface](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol), que tem as funções e eventos que a ponte padrão necessita. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[A interface padrão ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) não inclui as funções `mint` e `burn`. Estes métodos não são necessários pelo [padrão ERC-20](https://eips.ethereum.org/EIPS/eip-20), que não deixa especificado os mecanismos para criar e destruir tokens. + +```solidity +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +``` + +[A interface ERC-165 ](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol)é usada para especificar que funções um contrato fornece. [Você pode ler o padrão aqui](https://eips.ethereum.org/EIPS/eip-165). + +```solidity +interface IL2StandardERC20 is IERC20, IERC165 { + function l1Token() external returns (address); +``` + +Esta função fornece o endereço do token L1 que usa a ponte para este contrato. Note que nós não temos uma função similar na direção oposta. Nós precisamos ser capazes de usar a ponte para qualquer token L1, independente se o suporte L2 foi planejado quando foi implementado ou não. + +```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); +} +``` + +Funções e eventos para cunhar (criar) e queimar (destruir) tokens. A ponte deveria ser a única entidade que pode rodar estas funções para garantir que o número de tokens esteja correto (igual ao número de tokens travados na L1). + +### L2StandardERC20 {#L2StandardERC20} + +[Essa é a nossa implementação da interface `IL2StandardERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). A não ser que você precise de algum tipo de lógica customizada, você deveria usar esta. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +``` + +[O contrato ERC-20 OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). A Optimism não acredita em reinventar a roda, especialmente quando a roda é bem auditada e precisa ser estimada o suficiente para manter ativos. + +```solidity +import "./IL2StandardERC20.sol"; + +contract L2StandardERC20 is IL2StandardERC20, ERC20 { + address public l1Token; + address public l2Bridge; +``` + +Há dois parâmetros de configuração adicionais que nós precisamos, e um ERC-20 normalmente não precisa. + +```solidity + + /** + * @param _l2Bridge Address of the L2 standard bridge. + * @param _l1Token Address of the corresponding L1 token. + * @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; + } +``` + +Primeiro chame o construtor do contrato que nós herdamos (`ERC20(_name, _symbol)`) e então configure suas próprias variáveis. + +```solidity + + modifier onlyL2Bridge() { + require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn"); + _; + } + + + // 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; + } +``` + +Essa é a maneira que o[ERC-165](https://eips.ethereum.org/EIPS/eip-165) funciona. Cada interface é um número de funções suportadas, como identificadas no [ou exclusivo](https://en.wikipedia.org/wiki/Exclusive_or) dos [seletores de funções ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) destas funções. + +A ponte L2 usa ERC-165 como checagem de sanidade para garantir que o contrato ERC-20 para o qual ela envia ativos é um `IL2StandardERC20`. + +**Note:** Não há nada para evitar contratos trapaceiros de fornecer falsas respostas para `supportsInterface`, portanto isto é um mecanismo de checagem de sanidade, _não_ um mecanismo de segurança. + +```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); + } +} +``` + +Somente a ponte L2 pode cunhar e queimar ativos. + +`_mint` e `_burn` são na verdade definidos no [contrato ERC-20 OpenZeppelin](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn). Este contrato só não os expõem externamente, porque as condições para cunhar e queimar tokens são tão variadas como o número de maneiras de usar ERC-20. + +## Código da ponte L2 {#l2-bridge-code} + +Este é o código que roda na ponte na Optimism. [A fonte deste contrato é aqui](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; + +/* Interface Imports */ +import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol"; +import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol"; +``` + +A interface [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) é muito similar ao [equivalente L1](#IL1ERC20Bridge) que nós vimos acima. Há duas diferenças significantes: + +1. Na L1 você inicia depósitos e finaliza retiradas. Aqui você inicia retiradas e finaliza depósitos. +2. Na L1 é necessário distinguir entre ETH e tokens ERC-20. Na L2 nós podemos usar as mesmas funções para ambos os casos porque internamente saldos ETH na Optimism são manipulados por um token ERC-20 com o endereço [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://optimistic.etherscan.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000). + +```solidity +/* Library Imports */ +import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; + +/* Contract Imports */ +import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol"; + +/** + * @title L2StandardBridge + * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to + * enable ETH and ERC20 transitions between L1 and L2. + * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard + * bridge. + * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 + * bridge to release L1 funds. + */ +contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { + /******************************** + * External Contract References * + ********************************/ + + address public l1TokenBridge; +``` + +Acompanhe o endereço da ponte L1. Observe que, em contraste com o equivalente L1, aqui _precisamos_ desta variável. O endereço da ponte L1 não é conhecido antecipadamente. + +```solidity + + /*************** + * Constructor * + ***************/ + + /** + * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract. + * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain. + */ + constructor(address _l2CrossDomainMessenger, address _l1TokenBridge) + CrossDomainEnabled(_l2CrossDomainMessenger) + { + l1TokenBridge = _l1TokenBridge; + } + + /*************** + * Withdrawing * + ***************/ + + /** + * @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); + } +``` + +Estas duas funções iniciam retiradas. Observe que não há necessidade de especificar o endereço do token L1. Espera-se que os tokens L2 nos digam o endereço do equivalente L1. + +```solidity + + /** + * @dev Performs the logic for withdrawals by burning the token and informing + * the L1 token Gateway of the withdrawal. + * @param _l2Token Address of L2 token where withdrawal is initiated. + * @param _from Account to pull the withdrawal from on L2. + * @param _to Account to give the withdrawal to on L1. + * @param _amount Amount of the token to withdraw. + * @param _l1Gas Unused, but included for potential forward compatibility considerations. + * @param _data Optional data to forward to L1. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function _initiateWithdrawal( + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) internal { + // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 + // usage + // slither-disable-next-line reentrancy-events + IL2StandardERC20(_l2Token).burn(msg.sender, _amount); +``` + +Observe que _não_ estamos contando com o parâmetro `_from`, mas com o `msg.sender` que é muito mais difícil de falsificar (impossível, até onde eu sei). + +```solidity + + // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) + // slither-disable-next-line reentrancy-events + address l1Token = IL2StandardERC20(_l2Token).l1Token(); + bytes memory message; + + if (_l2Token == Lib_PredeployAddresses.OVM_ETH) { +``` + +Na L1 é necessário distinguir entre ETH e ERC-20. + +```solidity + message = abi.encodeWithSelector( + IL1StandardBridge.finalizeETHWithdrawal.selector, + _from, + _to, + _amount, + _data + ); + } else { + message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + } + + // Send message up to L1 bridge + // 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 Function: Depositing * + ************************************/ + + /** + * @inheritdoc IL2ERC20Bridge + */ + function finalizeDeposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +Essa função é chamada pelo `L1StandardBridge`. + +```solidity + ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) { +``` + +Certifique-se que a origem da mensagem é legítima. Isso é importante porque a função chama `_mint` e poderia ser usada para dar tokens que não foram cobertos pelos tokens que a ponte tem na L1. + +```solidity + // Check the target token is compliant and + // verify the deposited token on L1 matches the L2 deposited token representation here + if ( + // slither-disable-next-line reentrancy-events + ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) && + _l1Token == IL2StandardERC20(_l2Token).l1Token() +``` + +Verificações de sanidade: + +1. A interface correta é suportada +2. O endereço L1 do contrato ERC-20 L2 bate com a fonte L1 dos tokens + +```solidity + ) { + // When a deposit is finalized, we credit the account on L2 with the same amount of + // tokens. + // 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); +``` + +Se a checagem de sanidade passar, finalize o depósito: + +1. Cunhe os tokens +2. Emita o evento apropriado + +```solidity + } else { + // Either the L2 token which is being deposited-into disagrees about the correct address + // of its L1 token, or does not support the correct interface. + // This should only happen if there is a malicious L2 token, or if a user somehow + // specified the wrong L2 token address to deposit into. + // In either case, we stop the process here and construct a withdrawal + // message so that users can get their funds out in some cases. + // There is no way to prevent malicious token contracts altogether, but this does limit + // user error and mitigate some forms of malicious contract behavior. +``` + +Se um usuário fez um erro detectável usando o endereço de token L2 errado, nós queremos cancelar o depósito e retornar os tokens na L1. A única maneira que nós podemos fazer isso de L2 é enviar uma mensagem que irá ter que esperar pelo período de desafio de falha, mas isto é muito melhor para o usuário que perder seus tokens permanentemente. + +```solidity + bytes memory message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + _l1Token, + _l2Token, + _to, // switched the _to and _from here to bounce back the deposit to the sender + _from, + _amount, + _data + ); + + // Send message up to L1 bridge + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l1TokenBridge, 0, message); + // slither-disable-next-line reentrancy-events + emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data); + } + } +} +``` + +## Conclusão {#conclusion} + +A ponte padrão é o mecanismo mais flexível para transferência de ativos. Porém, por ser genérico não é sempre o mecanismo mais fácil de usar. Especialmente para retiradas, a maioria dos usuários prefere usar [pontes de terceiros](https://www.optimism.io/apps/bridges) a esperar o período de desafio e também não precisar de uma prova de Merkle para finalizar a retirada. + +Estas pontes tipicamente funcionam tendo ativos na L1, que elas fornecem imediatamente por uma taxa pequena (geralmente menor que o custo de gas para uma retirada de uma ponte padrão). Quando a ponte (ou as pessoas que a administram) antecipa a falta de ativos L1, ela transfere ativos suficientes da L2. Como estes são saques muito grandes, o custo do saque é amortizado por uma larga quantia e é um percentual muito menor. + +Esperamos que este artigo tenha ajudado você a entender mais sobre como a camada 2 funciona, e como escrever um código Solidity claro e seguro. diff --git a/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md new file mode 100644 index 00000000000..fd8d52243ae --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/reverse-engineering-a-contract/index.md @@ -0,0 +1,744 @@ +--- +title: "Engenharia reversa de um contrato" +description: Como entender um contrato quando você não tem o código-fonte +author: Ori Pomerantz +lang: pt-br +tags: + - "evm" + - "códigos de operação" +skill: advanced +published: 2021-12-30 +--- + +## Introdução {#introduction} + +_Não há segredos no blockchain_. Tudo o que acontece é consistente, verificável e está disponível publicamente. O ideal é que os contratos [tenham seu código-fonte publicado e verificado na Etherscan](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). No entanto, [nem sempre isso acontece](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). Neste artigo, você aprenderá a usar engenharia reversa em contratos analisando um contrato sem código-fonte, [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). + +Existem compiladores reversos, mas eles nem sempre produzem [resultados utilizáveis](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). Neste artigo, você aprenderá como usar engenharia reversa manualmente e entender um contrato dos [opcodes](https://github.com/wolflo/evm-opcodes), além de interpretar os resultados de um descompilador. + +Para entender este artigo, é preciso saber o básico de EVM e pelo menos estar um pouco familiarizado com a montagem de EVM. [Você pode ler sobre estes tópicos aqui](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). + +## Preparar o Código Executável {#prepare-the-executable-code} + +Você pode obter os opcodes acessando o contrato no Etherscan clicando na guia **Contrato** e depois em **Alternar para a Visualização de Opcodes**. Você poderá visualizar um opcode por linha. + +![Visualização do Opcode no Etherscan](opcode-view.png) + +Para entender os saltos, no entanto, você precisa saber onde no código cada opcode está localizado. Uma maneira de fazer isso é abrir uma planilha do Google e colar os opcodes na coluna C. [Você pode pular as seguintes etapas ao fazer uma cópia desta planilha já preparada](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). + +O próximo passo é obter os locais de código corretos para que possamos entender os saltos. Colocaremos o tamanho do opcode na coluna B e o local (em hexadecimal) na coluna A. Digite esta função na célula `B1` e então copie e cole para o resto da coluna B, até o final do código. Depois de fazer isso, você pode ocultar a coluna B. + +``` +=1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) +``` + +Primeiro essa função adiciona um byte no opcode em si e depois procura por `PUSH`. Opcodes de push são especiais porque eles precisam ter bytes adicionais para o valor que está sendo enviado. Se o opcode é um `PUSH`, extraímos o número de bytes e adicionamos isso. + +Em `A1` coloque o primeiro offset (descolamento de bits), para zero. Depois, em `A2`, insira esta função e copie e cole novamente para o resto da coluna A: + +``` +=dec2hex(hex2dec(A1)+B1) +``` + +Nós precisamos desta função, para nos dar o valor hexadecimal, porque os valores que são enviados antes dos saltos (`JUMP` e `JUMPI`) são dados a nós em hexadecimal. + +## O Ponto de Entrada (0x00) {#the-entry-point-0x00} + +Os contratos são sempre executados a partir do primeiro byte. Essa é a parte inicial do código: + +| Deslocamento | Código de Operação | Montante (depois do opcode) | +| ------------:| ------------------ | --------------------------- | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | Vazio | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE<4 | +| C | JUMPI | Vazio | + +Esse código faz duas coisas: + +1. Escreva 0x80 como um valor de 32 bytes para locais da memória 0x40-0x5F (0x80 é armazenado em 0x5F, e 0x40-0x5E são todos zeros). +2. Leia o tamanho dos dados de chamada. Normalmente, os dados de chamada para um contrato Ethereum seguem [a ABI (interface binária do aplicativo)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), o qual requer no mínimo quatro bytes para o seletor de função. Se o tamanho dos dados da chamada for menor que quatro, pule para 0x5E. + +![Fluxograma para esta parte](flowchart-entry.png) + +### O controlador em 0x5E (para dados de chamada não ABI) {#the-handler-at-0x5e-for-non-abi-call-data} + +| Deslocamento | Código de Operação | +| ------------:| ------------------ | +| 5E | JUMPDEST | +| 5F | CALLDATASIZE | +| 60 | PUSH2 0x007c | +| 63 | JUMPI | + +Este trecho começa com um `JUMPDEST`. Os programas EVM (Máquina Virtual Ethereum) lançam uma exceção se você pular para um opcode que não for `JUMPDEST`. Então, ele examina o CALLDATASIZE e, se for "verdadeiro" (ou seja, não for zero), pula para 0x7C. Veremos isso abaixo. + +| Deslocamento | Código de Operação | Montante (depois do opcode) | +| ------------:| ------------------ | ----------------------------------------------------------------------------- | +| 64 | CALLVALUE | [Wei](/glossary/#wei) fornecido pela chamada. Chamado `msg.value` no Solidity | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | + +Portanto, quando não há dados de chamada, nós lemos o valor de Storage[6]. Ainda não sabemos que valor é esse, mas podemos buscar as transações que o contrato recebeu sem nenhum dado de chamada. Transações que apenas transferem ETH sem nenhum dado de chamada (e, portanto, nenhum método) têm no Etherscan o método `Transfer`. De fato, [a primeira transação que o contrato recebeu](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) é uma transferência. + +Se nós olharmos nessa transação e clicarmos em **Clique para ver mais**, veremos que os dados da chamada, chamados de dados de entrada, estão de fato vazios (`0x`). Observe também que o valor é 1.559 ETH, que será relevante mais tarde. + +![Os dados da chamada estão vazios](calldata-empty.png) + +Em seguida, clique na guia o **Estado** e expanda o contrato que estamos fazendo engenharia reversa (0x2510...). Você pode ver que `Storage[6]` (armazenamento) mudou durante a transação e, se você alterar Hex para **Número**, verá que se tornou 1.559.000.000.000.000.000, o valor transferido em wei (adicionei as vírgulas para maior clareza), que corresponde ao próximo valor do contrato. + +![A mudança no Armazenamento[6]](storage6.png) + +Se observarmos as mudanças de estado causadas por [outras transações de `Transfer` (transferência) do mesmo período](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange), vemos que `Storage[6]` rastreou o valor do contrato por um tempo. Por enquanto, vamos chamá-lo de `Value*` (valor). O asterisco (`*`) nos lembra que não _sabemos_ o que esta variável faz, ainda, mas não pode ser apenas para rastrear o valor do contrato porque não há necessidade de usar armazenamento, o que é muito caro, quando você pode obter o saldo de suas contas usando `ADDRESS BALANCE`. O primeiro opcode envia o próprio endereço do contrato. O segundo lê o endereço no topo da pilha e o substitui com o saldo desse endereço. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | --------------------------------------------- | +| 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE | +| 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE | +| 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 74 | JUMP | | + +Nós continuaremos a rastrear esse código no destino do salto (desvio). + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------------------------- | +| 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | + +O `NOT` é bit a bit, portanto, ele inverte o valor de cada bit no valor da chamada. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------------------------------------------- | +| 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AE | ISZERO | Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AF | PUSH2 0x01df | 0x01DF Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1B2 | JUMPI | | + +Nós pulamos se `Value*` (o valor) for menor que 2^256-CALLVALUE-1 ou igual a ele. Isso parece lógico para evitar vazamento (overflow). E, de fato, vemos que depois de algumas operações sem sentido (escrever na memória que está prestes a ser excluída, por exemplo) no deslocamento 0x01DE, o contrato é revertido se o vazamento for detectado, o que é um comportamento normal. + +Note que esse vazamento é extremamente improvável, porque exigiria que o valor da chamada mais o `Value*` fosse comparável a 2^256 wei, em torno de 10^59 ETH. [O suprimento total de ETH, no momento desta redação, é inferior a duzentos milhões](https://etherscan.io/stat/supply). + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------- | +| 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE | +| 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE | +| 1E3 | JUMP | | + +Se chegamos aqui, pegue `Value* + CALLVALUE` e salte para o offset 0x75. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | --------------------------------- | +| 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE | +| 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE | +| 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | + +Se nós chegarmos aqui (o que requer que os dados da chamada estejam vazios), adicionamos o `Value*` ao valor da chamada. Isso é consistente com o que dizemos que as transações de `Transfer` fazem. + +| Deslocamento | Código de Operação | +| ------------:| ------------------ | +| 79 | POP | +| 7A | POP | +| 7B | STOP | + +Finalmente, limpe a pilha (o que não é necessário) e sinalize o fim bem-sucedido da transação. + +Para simplificar tudo, aqui está um fluxograma para o código inicial. + +![Fluxograma do ponto de entrada](flowchart-entry.png) + +## O Controlador em 0x7C {#the-handler-at-0x7c} + +Eu propositalmente não coloquei no cabeçalho o que esse controlador faz. O propósito não é ensinar como esse contrato específico funciona, mas como fazer engenharia reversa de contratos. Você irá aprender o que ele faz da mesma forma que eu, seguindo o código. + +Nós chegamos aqui a partir de vários locais: + +- Se houver dados de chamada de 1, 2 ou 3 bytes (a partir do deslocamento 0x63) +- Se a assinatura do método for desconhecida (dos offsets 0x42 e 0x5D) + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------------- | +| 7C | JUMPDEST | | +| 7D | PUSH1 0x00 | 0x00 | +| 7F | PUSH2 0x009d | 0x9D 0x00 | +| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | +| 84 | SLOAD | Storage[3] 0x9D 0x00 | + +Esta é outra célula de armazenamento, que não poderia encontrar em nenhuma transação, portanto, é mais difícil saber o que significa. O código abaixo deixará isso mais claro. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------------------------------------- | ------------------------------- | +| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | +| 9A | AND | Storage[3]-as-address 0x9D 0x00 | + +Esses opcodes truncam o valor que lemos do Armazenamento[3] para 160 bits, o tamanho de um endereço Ethereum. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------- | +| 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | +| 9C | JUMP | Storage[3]-as-address 0x00 | + +Este salto é supérfluo, pois estamos indo para o próximo opcode. Esse código não é tão eficiente em relação ao consumo de gás quanto ele poderia ser. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------- | +| 9D | JUMPDEST | Storage[3]-as-address 0x00 | +| 9E | SWAP1 | 0x00 Storage[3]-as-address | +| 9F | POP | Storage[3]-as-address | +| A0 | PUSH1 0x40 | 0x40 Storage[3]-as-address | +| A2 | MLOAD | Mem[0x40] Storage[3]-as-address | + +Bem no início do código, definimos Mem[0x40] como 0x80. Se procurarmos 0x40 posteriormente, veremos que nós não o alteramos - então podemos assumir que é 0x80. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------------- | +| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Storage[3]-as-address | +| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | +| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | +| A7 | CALLDATACOPY | 0x80 Storage[3]-as-address | + +Copie todos os dados da chamada para a memória, começando por 0x80. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------------------------------------------------------------------------- | +| A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address | +| AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address | +| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AD | DUP6 | Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AE | GAS | GAS Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AF | DELEGATE_CALL | | + +Agora as coisas estão muito mais claras. Este contrato pode atuar como um [proxy](https://blog.openzeppelin.com/proxy-patterns/), chamando o endereço no Armazenamento[3] para fazer o trabalho real. `DELEGATE_CALL` chama um contrato separado, mas permanece no mesmo armazenamento. Isto significa que o contrato delegado, aquele para o qual somos proxy, acessa o mesmo espaço de armazenamento. Os parâmetros para a chamada são: + +- _Gas_: Todo o gas restante +- _Endereço chamado_: Armazenamento[3] como endereço +- _Dados da chamada_: Os bytes CALLDATASIZE começando em 0x80, que é onde colocamos os dados originais da chamada +- _Dados de retorno_: Nenhum (0x00 - 0x00) Nós vamos obter os dados de retorno por outros meios (veja abaixo) + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | --------------------------------------------------------------------------------------------- | +| B0 | RETURNDATASIZE | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B5 | RETURNDATACOPY | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | + +Aqui copiamos todos os dados de retorno para o buffer de memória começando em 0x80. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| B6 | DUP2 | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B7 | DUP1 | (((call success/failure))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B8 | ISZERO | (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B9 | PUSH2 0x00c0 | 0xC0 (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BC | JUMPI | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BD | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BE | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BF | RETURN | | + +Então, após a chamada, nós copiamos os dados de retorno para o buffer 0x80 - 0x80+RETURNDATASIZE e, se a chamada for bem-sucedida, nós então fazemos o `RETURN` com exatamente este buffer. + +### DELEGATECALL falhou {#delegatecall-failed} + +Se chegarmos aqui, para 0xC0, significa que o contrato que chamamos foi revertido. Como somos apenas um proxy para esse contrato, queremos retornar os mesmos dados e também reverter. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------------------------------------------------------------------------------- | +| C0 | JUMPDEST | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| C1 | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| C2 | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| C3 | REVERT | | + +Portanto, fazemos o `REVERT` com o mesmo buffer que usamos para o `RETURN` anteriormente: 0x80 - 0x80+RETURNDATASIZE + +![Fluxograma de chamada ao proxy](flowchart-proxy.png) + +## Chamadas da ABI {#abi-calls} + +Se o tamanho dos dados da chamada for quatro bytes ou mais, pode ser uma chamada ABI válida. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------------- | +| D | PUSH1 0x00 | 0x00 | +| F | CALLDATALOAD | (((First word (256 bits) of the call data))) | +| 10 | PUSH1 0xe0 | 0xE0 (((First word (256 bits) of the call data))) | +| 12 | SHR | (((first 32 bits (4 bytes) of the call data))) | + +O Etherscan nos conta que `1C` é um opcode desconhecido, porque [ele foi adicionado depois que o Etherscan escreveu essa funcionalidade](https://eips.ethereum.org/EIPS/eip-145) e eles não o atualizaram. An [up to date opcode table](https://github.com/wolflo/evm-opcodes) shows us that this is shift right + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------------------------------------------------------------------------------------------------- | +| 13 | DUP1 | (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | +| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | +| 19 | GT | 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | +| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | +| 1D | JUMPI | (((first 32 bits (4 bytes) of the call data))) | + +Ao dividir os testes de correspondência da assinatura do método em dois, dessa forma, economiza metade dos testes, em média. O código que segue imediatamente e o código em 0x43 seguem o mesmo padrão: `DUP1` os primeiros 32 bits dos dados da chamada, `PUSH4 (((method signature>`, executa `EQ` para verificar a igualdade e, então, fazer o `JUMPI` se a assinatura do método corresponder. Aqui estão as assinaturas de método, seus endereços e, se conhecido [a definição de método correspondente](https://www.4byte.directory/): + +| Método | Assinatura do método | Deslocamento por salto | +| -------------------------------------------------------------------------------------- | -------------------- | ---------------------- | +| [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 | + +Se nenhuma combinação for encontrada, o código pula para [o controlador do proxy em 0x7C](#the-handler-at-0x7c), na esperança de que o contrato para o qual somos um proxy tenha uma correspondência. + +![Fluxograma de chamadas ABI](flowchart-abi.png) + +## splitter() {#splitter} + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ----------------------------- | +| 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 | | + +A primeira coisa que esta função faz é verificar que a chamada não enviou nenhum ETH. Esta função não é [`payable`](https://solidity-by-example.org/payable/) pagável. Se alguém nos enviou ETH, isso deve ser um erro, e queremos fazer o `REVERT` para evitar ter esse ETH que eles não possam recuperá-lo. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------------------------------------- | --------------------------------------------------------------------------- | +| 10F | JUMPDEST | | +| 110 | POP | | +| 111 | PUSH1 0x03 | 0x03 | +| 113 | SLOAD | (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 114 | PUSH1 0x40 | 0x40 (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 116 | MLOAD | 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 12D | SWAP2 | (((Storage[3] a.k.a the contract for which we are a proxy))) 0xFF...FF 0x80 | +| 12E | AND | ProxyAddr 0x80 | +| 12F | DUP2 | 0x80 ProxyAddr 0x80 | +| 130 | MSTORE | 0x80 | + +E 0x80 agora contém o endereço do proxy + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | --------- | +| 131 | PUSH1 0x20 | 0x20 0x80 | +| 133 | ADD | 0xA0 | +| 134 | PUSH2 0x00e4 | 0xE4 0xA0 | +| 137 | JUMP | 0xA0 | + +### O código E4 {#the-e4-code} + +Essa é a primeira vez que vemos essas linhas, mas elas são compartilhadas com outros métodos (veja abaixo). Então, vamos chamar o valor na pilha de X, e lembre-se que em `splitter()` o valor desse X é 0xA0. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ----------- | +| 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 | | + +Portanto, esse código recebe um ponteiro de memória no montante (X) e faz com que o contrato faça o `RETURN` com um buffer que é 0x80 - X. + +No caso do `splitter()`, isto retorna o endereço do qual somos um proxy. O `RETURN` devolve o buffer em 0x80-0x9F, que é onde escrevemos esses dados (offset 0x130 acima). + +## currentWindow() {#currentwindow} + +O código nos deslocamentos 0x158-0x163 é idêntico ao que vimos em 0x103-0x10E em `splitter()` (que não seja o destino `JUMPI`), então sabemos que `currentWindow()` também não é `payable` (pagável). + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------------- | +| 164 | JUMPDEST | | +| 165 | POP | | +| 166 | PUSH2 0x00da | 0xDA | +| 169 | PUSH1 0x01 | 0x01 0xDA | +| 16B | SLOAD | Storage[1] 0xDA | +| 16C | DUP2 | 0xDA Storage[1] 0xDA | +| 16D | JUMP | Storage[1] 0xDA | + +### O código DA {#the-da-code} + +Esse código também é compartilhado com outros métodos. Então, chamaremos o valor na pilha de Y e lembre-se de que em `currentWindow()` o valor desse Y é o Armazenamento[1]. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ---------------- | +| 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 | + +Escreva Y em 0x80-0x9F. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------- | +| E1 | PUSH1 0x20 | 0x20 0x80 0xDA | +| E3 | ADD | 0xA0 0xDA | + +E o resto já está explicado conforme [acima](#the-e4-code). Portanto, salte para 0xDA, escreva no topo da pilha (Y) para 0x80-0x9F e retorne esse valor. No caso de `currentWindow()`, retorne o Armazenamento[1]. + +## merkleRoot() {#merkleroot} + +O código nos deslocamentos 0xED-0xF8 é idêntico ao que vimos em 0x103-0x10E em `splitter()` (além do alvo `JUMPI`), então sabemos `merkleRoot()` também não é `payable`. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------------- | +| F9 | JUMPDEST | | +| FA | POP | | +| FB | PUSH2 0x00da | 0xDA | +| FE | PUSH1 0x00 | 0x00 0xDA | +| 100 | SLOAD | Storage[0] 0xDA | +| 101 | DUP2 | 0xDA Storage[0] 0xDA | +| 102 | JUMP | Storage[0] 0xDA | + +O que acontece após o salto [já descobrimos](#the-da-code). Portanto, `merkleRoot()` retorna o Armazenamento[0]. + +## 0x81e580d3 {#0x81e580d3} + +O código nos deslocamentos 0x138-0x143 é idêntico ao que vimos em 0x103-0x10E em `splitter()` (além do alvo `JUMPI`), então sabemos que esta função também é não `payable`. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ------------------------------------------------------------ | +| 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 | + +Parece que esta função leva ao menos 32 bytes (uma palavra) de dados da chamada. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | -------------------------------------------- | +| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19F | REVERT | | + +Se não obtiver os dados da chamada, a transação é revertida sem nenhum dado de retorno. + +Vamos ver o que acontece se a função _obtiver_ os dados de chamada necessários. + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ---------------------------------------- | +| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | + +`calldataload(4)` é a primeira palavra dos dados da chamada _após_ a assinatura do método + +| Deslocamento | Código de Operação | Pilha | +| ------------:| ------------------ | ---------------------------------------------------------------------------- | +| 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 | Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 174 | DUP2 | calldataload(4) Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 175 | LT | calldataload(4))`, e outro é `isClaimed()`, então parece como um contrato airdrop. Em vez de passar pelo restante opcode por opcode, podemos [tentar o descompilador](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), que produz resultados uteis para três funções deste contrato. A engenharia reversa dos outros é deixada como um exercício para o leitor. + +### scaleAmountByPercentage {#scaleamountbypercentage} + +Isso é o que o descompilador nos fornece para essa função: + +```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) +``` + +O primeiro `require` testa que os dados da chamada tenham, além dos quatro bytes da assinatura da função, ao menos 64 bytes, suficientes para os dois parâmetros. Do contrário, obviamente, há algo errado. + +A instrução `if` da sentença parece verificar que `_param1` não é zero e que `_param1 * _param2` não é negativo. Provavelmente, isso é para evitar casos de desvios. + +Finalmente, a função retorna um valor em escala. + +### Reivindicação {#claim} + +O código que o descompilador cria é complexo, e nem todo ele é relevante para nós. Vou pular algumas partes para focar nas linhas que acredito fornecerem informações úteis + +```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' +``` + +Vemos aqui duas coisas importantes: + +- `_param2`, embora esteja declarado como um `uint256`, é na verdade um endereço +- `_param1` é a janela que está sendo reivindicada, o qual tem de ser `currentWindow` ou a anterior. + +```python + ... + if stor5[_claimWindow][addr(_claimFor)]: + revert with 0, 'Account already claimed the given window' +``` + +Ou seja, agora sabemos que Armazenamento[5] é uma matriz de janelas e endereços e se o endereço reivindicou a recompensa por essa janela. + +```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' +``` + +Sabemos que `unknown2eb4a7ab` é na verdade a função `merkleRoot()`, então este código parece estar verificando um [prova de merkle](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5). Isso significa que `_param4` é uma prova de merkle. + +```python + call addr(_param2) with: + value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei + gas 30000 wei +``` + +É assim que um contrato transfere seu próprio ETH para outro endereço (de contrato ou de propriedade externa). Ele o chama com um valor que é a quantidade a ser transferida. Logo, parece que isso é um airdrop do ETH. + +```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 +``` + +As duas linhas mais abaixo nos dizem que o Armazenamento[2] também é um contrato que chamamos. Se nós [olharmos a transação do construtor](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), veremos que este contrato é o [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), um contrato de Ether encapsulado [cujo código-fonte foi carregado no Etherscan](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). + +Assim, parece que os contratos tentam enviar ETH para `_param2`. Se puder fazer isso, ótimo. Se não, ele tenta enviar [WETH](https://weth.io/). Se `_param2` for uma conta de propriedade externa (EOA), então ele sempre pode receber ETH, mas os contratos podem se recusar a receber ETH. No entanto, WETH é ERC-20 e os contratos não podem se recusar a aceitar isso. + +```python + ... + log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) +``` + +No final da função, nós vemos uma entrada de log sendo gerada. [Veja as entradas de log geradas](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) e filtre pelo tópico que começa com `0xdbd5...`. Se nós [clicarmos em uma das transações que gerou tal entrada](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), veremos que realmente parece uma reivindicação - a conta enviou uma mensagem para o contrato, que estamos fazendo engenharia reversa e, em troca, recebemos ETH. + +![Uma transação de reivindicação](claim-tx.png) + +### 1e7df9d3 {#1e7df9d3} + +Esta função é muito semelhante à [`claim`](#claim) (reinvidicação) acima. Ela também verifica uma prova de merkle, que tenta transferir ETH para o primeiro e produz o mesmo tipo de entrada de log. + +```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) +``` + +A principal diferença é que o primeiro parâmetro, a janela para retirada, não está lá. Em vez disso, há um loop em todas as janelas que podem ser reivindicadas. + +```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 +``` + +Portanto, parece uma variante da `claim` que reivindica todas as janelas. + +## Conclusão {#conclusion} + +A esta altura, você já deveria saber como entender os contratos cujo código-fonte não está disponível, usando os opcodes ou (quando funciona) o descompilador. Como é evidente na extensão deste artigo, a engenharia reversa de um contrato não é trivial, mas em um sistema em que a segurança é essencial, é uma habilidade importante ser capaz de verificar se os contratos funcionam como prometido. diff --git a/public/content/translations/pt-br/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/pt-br/developers/tutorials/run-node-raspberry-pi/index.md index 668e366fb63..94b31639d96 100644 --- a/public/content/translations/pt-br/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/pt-br/developers/tutorials/run-node-raspberry-pi/index.md @@ -1,6 +1,6 @@ --- title: Como transformar o Raspberry Pi 4 em um nó apenas instalando o cartão MicroSD -description: Formate seu Raspberry Pi 4, conecte um cabo de ethernet e um disco SSD, e ligue o dispositivo. Desta maneira, você terá transformado seu Raspberry Pi 4 em um full node de Ethereum, executando a camada de execução, ou a camada de consendo (Beacon Chain/validador) +description: Piscar seu Raspberry Pi 4, plugar em um cabo ethernet, conectar o disco SSD e ligar o dispositivo para transformar o Raspberry Pi 4 em um nó Ethereum completo + validador author: "EthereumOnArm" tags: - "clientes" @@ -9,258 +9,177 @@ tags: - "nós" lang: pt-br skill: intermediate -published: 2020-05-07 -source: r/ethereum -sourceUrl: https://www.reddit.com/r/ethereum/comments/gf3nhg/ethereum_on_arm_raspberry_pi_4_images_release/ +published: 2022-06-10 +source: Ethereum on ARM +sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ --- -**TL;DR**: formate seu Raspberry Pi 4, conecte um cabo de rede e um disco SSD, e ligue o dispositivo. Desta maneira, você terá transformado seu Raspberry Pi 4 em um nó completo do Ethereum, executando a camada de execução, ou a camada de consenso (Beacon Chain/validador) +**A Ethereum on Arm é uma imagem personalizada de Linux que pode transformar um Raspberry Pi em um nó Ethereum.** -[Aprenda sobre as implementações no Ethereum](/roadmap/) +Para usar Ethereum on Arm para transformar um Raspberry Pi em um nó Ethereum, recomenda-se o seguinte hardware: -Um pouco de contexto primeiro. Como você sabe, tivemos alguns problemas de memória [[1]](/developers/tutorials/run-node-raspberry-pi/#references) com a imagem do Raspberry Pi 4, já que o Raspbian OS ainda está em 32 bits [[2]](/developers/tutorials/run-node-raspberry-pi/#references) (pelo menos no nível de usuário). Embora preferíssemos manter o sistema operacional oficial, chegamos à conclusão que, para resolver esses problemas, precisamos migrar para um sistema operacional nativo de 64 bits. - -Além disso, os clientes de consenso não suportam binários de 32 bits, então usar o sistema operacional Raspbian impediria que o Raspberry Pi executasse um nó da camada de consenso (e também a possibilidade de fazer staking). - -Portanto, após vários testes, estamos lançando 2 imagens diferentes baseadas no Ubuntu 20.04 de 64 bits [[3]](/developers/tutorials/run-node-raspberry-pi/#references): edições para a camada de execução e para camada de consenso. - -Basicamente, ambos são a mesma imagem e incluem as mesmas funcionalidades das imagens baseadas em Raspbian. Mas elas estão configuradas para executar o “software” da camada de execução ou da camada de consenso por padrão. - -**As imagens cuidam de todos os passos necessários**, desde configurar o ambiente e formatar o disco SSD até instalar e executar o “software” Ethereum, bem como iniciar a sincronização da blockchain. - -## Principais recursos {#main-features} - -- Baseado no Ubuntu 20.04 de 64 bits -- Particionamento e formatação automáticas do disco USB -- Adiciona memória de troca (módulo de “kernel” ZRAM + um arquivo de troca) com base no trabalho do Armbian [[7]](/developers/tutorials/run-node-raspberry-pi/#references) -- Muda o nome do computador para algo como "ethnode-e2a3e6fe" baseado no hash MAC -- Executa o “software” como um serviço systemd e começa a sincronizar a Blockchain -- Inclui um repositório APT para instalar e atualizar o “software” Ethereum -- Inclui um painel de monitoramento baseado no Grafana/Prometheus - -## Software incluído {#software-included} - -Ambas as imagens incluem os mesmos pacotes, a única diferença entre elas é que, por padrão, a versão de execução executa o Geth e a versão de consenso executa o Prysm Beacon Chain. - -### Clientes de execução {#execution-clients} - -- Geth [[8]](/developers/tutorials/run-node-raspberry-pi/#references): 1.9.13 (binário oficial) -- Parity [[9]](/developers/tutorials/run-node-raspberry-pi/#references): 2.7.2 (compilação cruzada) -- Nethermind [[10]](/developers/tutorials/run-node-raspberry-pi/#references): 1.8.28 (compilação cruzada) -- Hyperledger Besu [[11]](/developers/tutorials/run-node-raspberry-pi/#references): 1.4.4 (compilado) - -### Clientes de consenso {#consensus-clients} - -- Prysm [[12]](/developers/tutorials/run-node-raspberry-pi/#references): 1.0.0-alpha6 (binário oficial) -- Lighthouse [[13]](/developers/tutorials/run-node-raspberry-pi/#references): 0.1.1 (compilado) - -### Estrutura Ethereum {#ethereum-framework} - -- Swarm [[14]](/developers/tutorials/run-node-raspberry-pi/#references): 0.5.7 (binário oficial) -- Raiden Network[[15]](/developers/tutorials/run-node-raspberry-pi/#references): 0.200.0~rc1 (binário oficial) -- IPFS [[16]](/developers/tutorials/run-node-raspberry-pi/#references): 0.5.0 (binário oficial) -- Statusd [[17]](/developers/tutorials/run-node-raspberry-pi/#references): 0.52.3 (compilado) -- Vipnode [[18]](/developers/tutorials/run-node-raspberry-pi/#references): 2.3.3 (binário oficial) - -## Guia de instalação e uso {#installation-guide-and-usage} - -### Configuração e equipamentos recomendados {#recommended-hardware-and-setup} - -- Raspberry 4 (modelo B) - 4GB +- Raspberry 4 (modelo B 8 GB), placa mãe Odroid M1 ou Rock 5B (8 GB/16 GB RAM) - Cartão MicroSD (mínimo 16 GB Classe 10) -- Disco SSD 3.0 (ver seção de armazenamento) +- 2 TB SSD minimum USB 3.0 disk ou um SSD com USB para SATA case. - Fonte de alimentação -- Cabo de rede -- Redirecionamento da porta 30303 (camada de execução) e da porta 13000 (camada de consenso) [[4]](/developers/tutorials/run-node-raspberry-pi/#references) -- Um gabinete com dissipador de calor e ventilador (opcional, mas altamente recomendado) -- Teclado USB, Monitor e cabo HDMI (microHDMI) (opcional) +- Cabo da Ethernet +- Encaminhamento de porta (consulte os clientes para obter mais informações) +- Uma case com dissipador de calor e cooler +- Teclado USB, Monitor e cabo HDMI (micro-HDMI) (Opcional) -## Armazenamento {#storage} +## Por que executar Ethereum no ARM? {#why-run-ethereum-on-arm} -Você precisará de um SSD para executar os clientes Ethereum (sem um drive SSD não há absolutamente nenhuma chance de sincronizar a blockchain Ethereum). Existem 2 opções: +Os painéis ARM são computadores muito acessíveis, flexíveis e pequenos. Eles são boas escolhas para rodar os nós do Ethereum porque são baratos, configurados de forma que todos os recursos foquem em apenas um nó, tornando-os mais eficiente; eles consomem energia e são fisicamente menores, assim cabendo em qualquer casa. Também é muito fácil de rodar nós porque o cartão de memória do Raspberry Pi pode simplesmente ser ligado com uma imagem pré montada, sem precisar de download ou software de montagem. -- Use um disco SSD portátil USB, como o SSD Portátil Samsung T5. -- Use um disco externo USB 3.0 com um disco SSD. No nosso caso, utilizamos um disco rígido de 2,5 polegadas Inateck FE2011. Certifique-se de comprar um "case" com um chip compatível com UAS, particularmente, um desses: JMicron (JMS567 or JMS578) ou ASMedia (ASM1153E). +## Como funciona? {#how-does-it-work} -Em ambos os casos, evite obter discos SSD de baixa qualidade, pois é um componente fundamental do seu nó e pode afetar drasticamente o desempenho (e o tempo de sincronização). +O cartão de memória do Raspberry Pi já vem com uma imagem pré montada. Esta imagem contém tudo o que é necessário para executar um nó da Ethereum. Com um cartão flash, tudo o que o usuário precisa fazer é ligar o Raspberry Pi. Todos os processos necessários para executar o nó são iniciados automaticamente. Isso funciona porque o cartão de memória contém um sistema operacional baseado no Linux (OS) na qual os processos em nível de sistema rodam automaticamente e se tornam a unidade em um nó de Ethereum. -Tenha em mente que você precisa conectar o disco a uma porta USB 3.0 (azul) +O Ethereum não pode rodar usando o popular Raspberry Pi Linux "Raspbian" porque o Raspbian ainda usa uma arquitetura de 32 bits que leva os Usuários do Ethereum a ter problemas com memória e o cliente de consenso não suporta binários de 32-bits. Para superar isso, a Ethereum on Arm migrou para um OS nativo de 64 bits chamado "Armbian". -## Download e instalação de imagens {#image-download-and-installation} +**As imagens cuidam de todos os passos necessários**, desde configurar o ambiente e formatar o disco SSD até instalar e executar o “software” Ethereum, bem como iniciar a sincronização da blockchain. + +## Execução de acoplamento e clientes de consenso {#note-on-execution-and-consensus-clients} + +A imagem do Ethereum on Arm incluí uma execução pré construída e o cliente de consenso como serviços. Um nó Ethereum exige que ambos os clientes estejam sincronizados e executados. Você só precisa fazer o download, instalar a imagem flash e iniciar os serviços. A imagem é pré carregada com os seguintes clientes de execução: -### 1. Baixar as imagens das camadas de execução e de consenso {#1-download-execution-or-consensus-images} +- Geth +- Nethermind +- Besu - - Baixar imagem da camada de execução - +e os seguintes clientes de consenso: -sha256 7fa9370d13857dd6abcc8fde637c7a9a7e3a66b307d5c28b0c0d29a09c73c55c +- Lighthouse +- Nimbus +- Prysm +- Teku - - Baixar imagem da camada de consenso - +Você deve escolher um de cada para executar - todos os clientes de execução são compatíveis com todos os clientes de consenso. Se você não selecionar explicitamente um cliente, o nó vai voltar aos seus padrões - Geth e Lighthouse - e executá-los automaticamente quando o quadro estiver ligado. Você precisa abrir a porta 30303 no seu roteador para o Geth Encontrar e conectar-se aos pares. -sha256 74c0c15b708720e5ae5cac324f1afded6316537fb17166109326755232cd316e +## Baixando imagem {#downloading-the-image} -### 2. Instalar a imagem {#2-flash-the-image} +A imagem Ethereum Raspberry Pi 4 é uma imagem "plug and play" que vai instalar automaticamente e configurar ambos clientes de consenso e de execução, configurando-os para conversarem entre si e conectarem-se à rede Ethereum. Tudo o que o usuário precisa fazer é iniciar seus processos usando um simples comando. -Insira o microSD no seu computador e baixe o arquivo (camada de execução, por exemplo): +Baixe a imagem do Raspberry Pi em [Ethereum no Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) e verifique o hash SHA256: -```bash -wget https://ethraspbian.com/downloads/ubuntu-20.04-preinstaladod-server-arm64+raspi-eth1.img.zip +```sh +# From directory containing the downloaded image +shasum -a 256 ethonarm_22.04.00.img.zip +# Hash should output: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f ``` -Nota: Se você não estiver cômodo com a linha de comando ou se estiver executando o Windows, você pode usar o [Etcher](https://etcher.io) +Note que as imagens para as placas Rock 5B e Odroid M1 estão disponíveis no Ethereum-On-Arm [página de downloads](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html). -Abra um terminal e verifique o nome do seu MicroSD em execução: +## Instalando o MicroSD {#flashing-the-microsd} -```bash -sudo fdisk -l -``` +O cartão MicroSD que vai ser usado no Raspberry Pi deve ser primeiro inserido em um desktop ou laptop para que seja instalado. Em seguida, os seguintes comandos do terminal instalarão a imagem baixada no cartão SD: -Você deve ver um dispositivo chamado mmcblk0 ou sdd. Descompactar e instalar a imagem: +```shell +# check the MicroSD card name +sudo fdisk -l -```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 +>> sdxxx ``` -### 3. Insira o MicroSD no Raspberry Pi 4. Conecte um cabo de rede e conecte o disco SSD USB (certifique-se de estar usando uma porta azul). {#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. Ligue o dispositivo {#4-power-on-the-device} +É muito importante se atentar ao nome correto pois o próximo comando inclui`dd` que apaga completamente o conteúdo existente do cartão antes de instalar a imagem dentro nele. Para continuar, navegue até o diretório que contém a imagem compactada: -O sistema operacional Ubuntu se iniciará em menos de um minuto, mas **você precisará esperar aproximadamente 10 minutos** para permitir que o script execute as tarefas necessárias para transformar o dispositivo em um nó Ethereum e reiniciar o Raspberry. +```shell +# unzip and flash image +unzip ethonarm_22.04.00.img.zip +sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress +``` -Dependendo da imagem, você estará executando: +O cartão esta instalado, para que seja inserido no Raspberry Pi. -- Cliente de execução: Geth como o cliente padrão que sincroniza a blockchain -- Cliente de consenso: Prysm como cliente padrão que sincroniza a Beacon Chain (rede de teste Goerli) +## Inicie o nó {#start-the-node} -### 5. Iniciar sessão {#5-log-in} +Com o cartão SD inserido no Raspberry Pi, conecte o cabo Ethernet e SSD e então ligue o aparelho. O OS vai iniciar e automaticamente começará a executar as tarefas pré-configuradas que transformam o Raspberry Pi em um nó de Ethereum, incluindo a instalação e construção de um software cliente. Isso levará provavelmente 10-15 minutos. -Você pode fazer login através do SSH ou usando o console (se você tiver um monitor e teclado conectados) +Assim que tudo estiver instalado e configurado, faça login no dispositivo via uma conecção ssh ou usando o terminal diretamente se um monitor e teclado estiverem conectados à placa. Use a conta `ethereum` para logar, pois isso tem as permissões necessárioas para iniciar o nó. -```bash +```shell Usuário: ethereum Senha: Ethereum ``` -Você será solicitado a alterar a senha no primeiro login, então você precisará se conectar duas vezes. - -### 6. Abra a porta 30303 para Geth e 13000 se estiver executando a Beacon Chain Prysm. Se você não sabe como fazer isso, faça uma busca no Google de "encaminhamento de porta", seguido pelo seu modelo de roteador. {#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. Ver a saída no console {#7-get-console-output} - -Você pode ver o que está acontecendo em segundo plano digitando: +O cliente de execução padrão, Geth, irá iniciar automaticamente. Você pode confirmar isso checando os logs usando o seguinte comando no terminal: -```bash -sudo tail -f /var/log/syslog +```sh +sudo journalctl -u geth -f ``` -**Parabéns. Agora você está executando um nó Ethereum completo no seu Raspberry Pi 4.** - -## Sincronizando a Blockchain {#syncing-the-blockchain} - -Agora você precisa esperar que a blockchain seja sincronizada. No caso da camada de execução, esse processo levará alguns dias dependendo de vários fatores, mas você pode esperar algo entre 5 – 7 dias. - -Se está executando a rede de teste Goerli para a camada de consenso, você pode esperar entre 1–2 dias para a sincronização da Beacon Chain. Lembre-se de que precisará configurar o validador mais tarde para iniciar o processo de apostas. [Como executar o validador da camada de consenso](/developers/tutorials/run-node-raspberry-pi/#validator) - -## Painéis de monitoramento {#monitoring-dashboards} - -Para esta primeira versão, incluímos 3 dashboards de monitoramento com base no Prometheus [[5]](/developers/tutorials/run-node-raspberry-pi/#references) / Grafana [[6]](/developers/tutorials/run-node-raspberry-pi/#references) para monitorar os dados do nó e dos clientes (Geth e Besu). Você pode acessar através do seu navegador: +O cliente de consenso precisa de ser iniciado explicitamente. Para fazer isso, primeiro abra a porta 9000 no seu roteador para que o farol possa encontrar e se conectar a pares. Então habilite e inicie o serviço de lighthouse: -```bash -URL: http://your_raspberrypi_IP:3000 -Usuário: admin -Senha: ethereum +```sh +sudo systemctl enable lighthouse-beacon +sudo systemctl start lighthouse-beacon ``` -## Alternando clientes {#switching-clients} +Verifique o cliente usando os logs: -Todos os clientes são executados como um serviço systemd. Isto é importante porque, se surgir um problema, o sistema recomeçará automaticamente o processo. - -Geth and Prysm beacon chain run by default (depending on what you are synchronizing, execution layer or consensus layer) so, if you want to switch to other clients (from Geth to Nethermind, for instance), you need to stop and disable Geth first, and enable and start the other client: - -```bash -sudo systemctl stop geth && sudo systemctl disable geth +```sh +sudo journalctl -u lighthouse-beacon ``` -Comandos para habilitar e iniciar cada cliente de execução: +Observe que o cliente de consenso irá sincronizar em alguns minutos porque ele usa a sincronização do ponto de controle. O cliente de execução vai levar mais tempo - Potencialmente algumas horas, e ele não vai executar até que o cliente de consenso termine de sincronizar (isso porque o cliente de execução precisa de um alvo para sincronizar, que o cliente de consenso sincronizado fornece). -```bash -sudo systemctl habilita besu && sudo systemctl start besu -sudo systemctl enable nethermind && sudo systemctl start nethermind -sudo systemctl enable parity && sudo systemctl start parity -``` +Com os serviços Geth e Lighthouse sincronizados e rodando, seu Raspberry Pi agora é um nó de Ethereum! É mais comum interagir com a rede Ethereum utilizando o console Javascript do Geth, que pode ser anexado ao cliente Geth na porta 8545. Também é possível enviar comandos formatados como objetos JSON usando uma ferramenta de solicitação como o Curl. Veja mais em [Documentação Geth](https://geth.ethereum.org/). -Clientes de consenso: +Geth é pré configurado para enviar relatórios pro painel Grafana, que pode ser visto no seu navegador. Usuários mais avançados podem querer usar este recurso para monitorar a saúde do seu nó navegando para `ipaddress.3000`, passing`usuário: admin` e `senha:ethereum`. -```bash -sudo systemctl stop prysm-beacon && sudo systemctl disable prysm-beacon -sudo systemctl start lighthouse && sudo systemctl enable light thouse -``` +## Validadores {#validators} -## Modificando parâmetros {#changing-parameters} +Um validador também pode ser opcionalmente adicionado ao cliente de consenso. O software validador permite seu nó de participar ativamente no consenso e fornece a rede com segurança criptoeconomica. Você será recompensado por este trabalho em ETH. Para rodar um validador, você precisa primeiro ter 32 ETH, que precisa ser depositado em um contrato de depósito. **Este é um termo de compromisso a longo prazo - ainda não é possível sacar este ETH!**. O depósito pode ser feito seguindo o passo a passo no [Launchpad](https://launchpad.ethereum.org/). Faça isso em um desktop/laptop, mas não gere chaves — isso pode ser feito diretamente no Raspberry Pi. -Os arquivos de configuração do cliente estão localizados no diretório /etc/ethereum/. Você pode editar esses arquivos e reiniciar o serviço do sistema para que as alterações tenham efeito. A única exceção é o Nethermind que, além disso, tem um arquivo de configuração Mainnet localizado aqui: +Abra um terminal no Raspberry Pi e execute o seguinte comando para gerar as chaves de depósito: -```bash -/etc/nethermind/configs/mainnet.cfg ``` - -Os dados dos clientes Blockchain são armazenados no diretório inicial da conta Ethereum do seguinte modo (observe o ponto antes do nome do diretório): - -### Camada de execução {#execution-layer} - -```bash -/home/ethereum/.geth -/home/ethereum/.parity -/home/ethereum/.besu -/home/ethereum/.nethermind +sudo apt-get update +sudo apt-get install staking-deposit-cli +cd && deposit new-mnemonic --num_validators 1 ``` -### Camada de consenso {#consensus-layer} +Mantenha a frase mnemônica segura! O comando acima gerou dois arquivos no keystore: as chaves validadoras e um arquivo de dados de depósito. Os dados do depósito precisam ser carregados no launchpad, portanto, devem ser copiados do Raspberry Pi para o desktop/laptop. Isso pode ser feito usando uma conexão ssh ou qualquer outro método de copiar/colar. -```bash -/home/ethereum/.eth2 -/home/ethereum/.eth2validators -/home/ethereum/.lighthouse -``` +Uma vez que o arquivo de dados do depósito estiver disponível no computador que executa o launchpad, ele pode ser arrastado e solto no `+` na tela do launchpad. Siga as instruções na tela para enviar uma transação para o contrato de depósito. -## Nethermind e Hyperledger Besu {#nethermind-and-hyperledger-besu} +De volta ao Raspberry Pi, um validador pode ser iniciado. Isso requer importar as chaves do validador, definir o endereço para coletar recompensas e, em seguida, iniciar o processo do validador pré-configurado. O exemplo abaixo é para o Lighthouse - instruções para outros clientes de consenso estão disponíveis na [Ethereum on Arm docs](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/): -Estes 2 grandes clientes de execução tornaram-se uma ótima alternativa ao Geth e Parity. Quanto maior a diversidade na rede melhor. Testá-los contribui para a integridade da rede. +```shell +# import the validator keys +lighthouse account validator import --directory=/home/ethereum/validator_keys -Ambos precisam de mais testes, por isso sinta-se livre para testá-los e compartilhar suas impressões. +# set the reward address +sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf -## Como gerenciar o validador do consenso (staking) {#validator} +# start the validator +sudo systemctl start lighthouse-validator +``` -Uma vez que a Beacon Chain da rede de teste Goerli for sincronizada, você vai poder executar um validador no mesmo dispositivo. Você precisará seguir [essas etapas de participação](https://prylabs.net/participate). +Parabéns, agora você tem um nó Ethereum completo e um validador rodando em um Raspberry Pi! -Na primeira vez, você precisa criar uma conta manualmente executando o binário "validador" e configurando uma senha. Depois de concluir esta etapa, você pode adicionar a senha a `/etc/ethereum/prysm-validator.conf` e iniciar o validador como um serviço systemd. +## Mais detalhes {#more-details} -## Agradecemos o feedback {#feedback-appreciated} +Esta página deu uma visão geral de como configurar um nó e validador Geth-Lighthouse usando Raspberry Pi. Instruções mais detalhadas estão disponíveis no [site Ethereum-on-Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html). -Nos esforçamos muito para configurar o Raspberry Pi 4 como um nó Ethereum completo, pois sabemos que a base de usuários massiva deste dispositivo pode causar um impacto muito positivo na rede. +## Agradecemos o feedback {#feedback-appreciated} -Como esta é a primeira imagem baseada no Ubuntu 20.04, pode haver alguns erros. Caso haja, informe o problema no [GitHub](https://github.com/diglos/ethereumonarm) ou entre em contato conosco no [Twitter](https://twitter.com/EthereumOnARM). +Sabemos que o Raspberry Pi tem uma enorme base de usuários, que pode ter um impacto muito positivo na saúde da rede Ethereum. Por favor, explore os detalhes deste tutorial, tente rodar em redes de teste, confira o Ethereum on Arm pelo GitHub, dê feedback, levante questões e pull requests e ajude a avançar a tecnologia e a documentação! ## Referências {#references} -1. [geth falha repetidamente com SIGSEGV](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. **Note que o OpenEthereum [foi descontinuado](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) e não está mais sendo mantido.** Use-o com cuidado e de preferência mude para outra implementação de cliente. -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/pt-br/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md new file mode 100644 index 00000000000..4a20bad7f85 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/secure-development-workflow/index.md @@ -0,0 +1,56 @@ +--- +title: Checklist de segurança para smart contracts +description: Um workflow sugerido para escrever smart contracts seguros +author: "Trailofbits" +tags: + - "contratos inteligentes" + - "segurança" + - "solidity" +skill: intermediate +lang: pt-br +published: 2020-09-07 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md +--- + +## Processo de desenvolvimento do contrato inteligente {#smart-contract-development-checklist} + +Aqui temos um processo de alto nível que recomendamos seguir enquanto você escreve seus contratos inteligentes. + +Verificar problemas de segurança conhecidos: + +- Reveja seus contratos com o [Slither](https://github.com/crytic/slither). Tem mais de 40 detectores internos para vulnerabilidades comuns. Execute em cada check-in com um novo código e certifique-se de que ele recebe um relatório limpo (ou use o modo de triagem para silenciar certos problemas). +- Reveja seus contratos com o [Crytic](https://crytic.io/). Ele verifica 50 problemas que o Slither não tem. O Crytic também pode ajudar sua equipe a se manter atualizada, resolvendo problemas de segurança facilmente nas solicitações de pull no GitHub. + +Considere as características especiais do seu contrato: + +- Os seus contratos são atualizáveis? Verifique se há defeitos em seu código de capacidade de atualização com o [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) ou [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Documentamos 17 situações em que as atualizações podem correr mal. +- Seus contratos pretendem estar em conformidade com os ERCs? Verifique com [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Esta ferramenta identifica instantaneamente desvios de seis especificações comuns. +- Você tem testes de unidade no Truffle? Verifique com [`slither-check-erc`](https://github.com/crytic/slither/wiki/Property-generation). Ele gera automaticamente um robusto conjunto de propriedades de segurança para recursos do ERC20 com base no seu código específico. +- Você faz integrações com tokens de outras empresas? Revise nossa [lista de verificação de integração de tokens](/developers/tutorials/token-integration-checklist/) antes de confiar em contratos externos. + +Visualmente inspecione recursos críticos de segurança com seu código: + +- Analise o printer [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) do Slither. Evite problemas de linearização de sombras e C3 involuntários. +- Analise o printer [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) do Slither. Reporta a visibilidade da função e os controles de acesso. +- Analise o printer [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) do Slither. Ele relata os controles de acesso às variáveis de estado. + +Propriedades de segurança críticas do documento e use geradores de testes automatizados para avaliá-las: + +- Aprenda com [as propriedades de segurança de documentos para o seu código](/developers/tutorials/guide-to-smart-contract-security-tools/). É difícil no início, mas é a atividade mais importante para alcançar um bom resultado. Também é um pré-requisito para usar qualquer uma das técnicas avançadas neste tutorial. +- Defina as propriedades de segurança no Solidity, para usar com [Echidna](https://github.com/crytic/echidna) e [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Concentre-se na sua máquina do estado, controles de acesso, operações aritméticas, interações externas e padrões de conformidade. +- Defina as propriedades de segurança com [API Python do Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Concentre-se na herança, nas dependências variáveis, nos controles de acesso e em outras questões estruturais. +- Execute seus testes de propriedade em cada commit com [Crytic](https://crytic.io). Critica pode consumir e avaliar testes de propriedade de segurança para que todos na sua equipe possam facilmente ver que eles passam no GitHub. Os testes que falharam podem bloquear os commits. + +Finalmente, esteja atento a questões que as ferramentas automatizadas não conseguem facilmente encontrar: + +- Falta de privacidade: todos os outros podem ver suas transações enquanto são enfileiradas no pool +- Transações principais em execução +- Operações criptográficas +- Interações arriscadas com componentes externos de DeFi + +## Pedir ajuda {#ask-for-help} + +[Horário de escritório Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours) executa todas as terças da tarde. Essas sessões presenciais de uma hora são uma oportunidade para você nos fazer quaisquer perguntas que sobre segurança, solucionar problemas usando nossas ferramentas e obter comentários de especialistas sobre sua abordagem atual. Vamos ajudá-lo a trabalhar neste guia. + +Junte-se ao nosso Slack: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Sempre estaremos disponíveis nos canais #crytic e #ethereum caso tenha alguma dúvida. diff --git a/public/content/translations/pt-br/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/pt-br/developers/tutorials/send-token-etherjs/index.md new file mode 100644 index 00000000000..f57529f2ef8 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/send-token-etherjs/index.md @@ -0,0 +1,212 @@ +--- +title: Envio de fichas usando ethers.js +description: Guia amigo para iniciantes enviarem tokens usando ethers.js. +author: Kim YongJun +tags: + - "ETHERS.JS" + - "ERC-20" + - "TOKENS" +skill: beginner +lang: pt-br +published: 2021-04-06 +--- + +## Enviar Token usando ethers.js(5.0) {#send-token} + +### Neste tutorial, você aprenderá {#you-learn-about} + +- Importar ethers.js +- Transferência de tokens +- Defina o preço do gás de acordo com a situação do tráfego de rede + +### Iniciado {#to-get-started} + +Para começar, primeiro devemos importar a biblioteca ethers.js para nossa javascript Incluir ethers.js(5.0) + +### Instalando {#install-ethersjs} + +```shell +/home/ricmoo> npm install --save ethers +``` + +ES6 no Navegador + +```html + +``` + +ES3(UMD) no Navegador + +```html + +``` + +### Parâmetros {#param} + +1. **`contract_address`**: Endereço do contrato do token (o endereço do contrato é necessário quando o token que você deseja transferir não for ether) +2. **`send_token_amount`**: A quantia que você deseja enviar para o destinatário +3. **`to_address`**: O endereço do destinatário +4. **`to_address`**: O endereço do destinatário +5. **`private_key`**: Chave privada do remetente para assinar a transação e realmente transferir os tokens + +## Nota {#notice} + +`signTransaction(tx)` foi removido porque `sendTransaction()` fez isso internamente. + +## Enviando Procedimentos {#procedure} + +### 1. Conectar à rede (testnet) {#connect-to-network} + +#### Definir Provedor (Infura) {#set-provider} + +Conecte-se à rede de teste Ropsten + +```javascript +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") +``` + +### 2. Criar Carteira {#create-wallet} + +```javascript +let wallet = new ethers.Wallet(private_key) +``` + +### 3. Conectar carteira à rede {#connect-wallet-to-net} + +```javascript +let walletSigner = wallet.connect(window.ethersProvider) +``` + +### 4. Obter o atual preço do gás {#get-gas} + +```javascript +window.ethersProvider.getGasPrice() // gasPrice +``` + +### 5. Definir a Transação {#define-transaction} + +Essas variáveis definidas abaixo dependem de `send_token()` + +### Parâmetros de transação {#transaction-params} + +1. **`send_account`**: endereço do remetente do token +2. **`to_address`**: endereço do receptor do token +3. **`send_token_amount`**: a quantidade de tokens a serem enviados +4. **`gas_limit`**: limite de gas +5. **`gas_price`**: preço do gas + +[Veja abaixo como usar](#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. Transferir {#transfer} + +```javascript +walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("Send finished!") +}) +``` + +## Como usar {#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 +) +``` + +### Sucesso! {#success} + +![imagem da transação realizada com sucesso](./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) { + // general token send + let contract = new ethers.Contract( + contract_address, + send_abi, + walletSigner + ) + + // How many tokens? + let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) + console.log(`numberOfTokens: ${numberOfTokens}`) + + // Send tokens + contract.transfer(to_address, numberOfTokens).then((transferResult) => { + console.dir(transferResult) + alert("sent token") + }) + } // ether send + 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("Send finished!") + }) + } catch (error) { + alert("failed to send!!") + } + } + }) +} +``` diff --git a/public/content/translations/pt-br/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/pt-br/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md new file mode 100644 index 00000000000..0e1b489cdc3 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -0,0 +1,206 @@ +--- +title: Enviando transações usando Web3 +description: "Este é um guia amigável para iniciantes enviarem transações Ethereum usando web3. Existem três etapas principais para enviar uma transação para a blockchain Ethereum: criar, assinar e transmitir. Analisaremos todas as três." +author: "Elan Halpern" +tags: + - "transações" + - "web3.js" + - "alchemy" +skill: intermediate +lang: pt-br +published: 2020-11-04 +source: Documentação do Alchemy +sourceUrl: https://docs.alchemy.com/alchemy/tutorials/sending-txs +--- + +Este é um guia amigável para iniciantes enviarem transações Ethereum usando web3. Existem três etapas principais para enviar uma transação para a blockchain Ethereum: criar, assinar e transmitir. Analisaremos todas as três, esperamos responder a quaisquer perguntas que você possa ter! Neste tutorial, estaremos usando [Alchemy](https://www.alchemy.com/) para enviar as nossas transações para a cadeia Ethereum. Você pode [criar uma conta Alchemy grátis aqui](https://auth.alchemyapi.io/signup). + +**NOTA:** Este guia é para assinar suas transações no _back-end_ do seu aplicativo. Se você quer integrar a assinatura de suas transações no front-end, verifique a integração [Web3 com um provedor de navegador](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider). + +## O básico {#the-basics} + +Como a maioria dos desenvolvedores blockchain quando iniciam, você pode ter feito algumas pesquisas sobre como enviar uma transação (algo que deve ser bem simples) e encontrado com uma infinidade de guias, cada um deles diz coisas diferentes e te deixa um pouco sobrecarregado e confuso. Se você está naquele barco, não se preocupe, todos estivemos em algum momento! Então, antes de começarmos, vamos ver algumas coisas certas: + +### 1\. Alchemy não armazena suas chaves privadas {#alchemy-does-not-store-your-private-keys} + +- Isso significa que Alchemy não pode assinar e enviar transações em seu nome. A razão para isso é a questão da segurança. Alchemy nunca vai te pedir para compartilhar sua chave privada, e você nunca deve compartilhar sua chave privada com um nó hospedado (ou alguém para isso). +- Você pode ler a partir da blockchain usando a API principal do Alchemy, mas para gravar nela, você precisará usar outra coisa para assinar suas transações antes de enviá-las por meio do Alchemy (assim como para qualquer outro [serviço de nó](/developers/docs/nodes-and-clients/nodes-as-a-service/)). + +### 2\. O que é um “assinante”? {#what-is-a-signer} + +- Assinantes assinarão transações para você usando sua chave privada. Neste tutorial iremos utilizar [Alchemy web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) para assinar a nossa transação, mas também poderia utilizar qualquer outra biblioteca web3. +- No front-end, um bom exemplo de assinante seria o [MetaMask](https://metamask.io/), que assinará e enviará transações em seu nome. + +### 3\. Por que preciso assinar minhas transações? {#why-do-i-need-to-sign-my-transactions} + +- Cada usuário que desejar enviar uma transação na rede Ethereum deve assinar a transação (usando sua chave privada), a fim de validar a autenticidade da origem da transação. +- É super importante proteger esta chave privada, uma vez que o acesso a ela concede controle total sobre a sua conta Ethereum, permitindo que você (ou qualquer um com acesso) realize transações em seu nome. + +### 4\. Como eu protejo minha chave privada? {#how-do-i-protect-my-private-key} + +- Há muitas maneiras de proteger a sua chave privada e usá-la para enviar transações. Neste tutorial, usaremos um arquivo `.env`. No entanto, você também pode usar um provedor separado que armazena chaves privadas, usa um arquivo de keystore ou outras opções. + +### 5\. Qual é a diferença entre `eth_sendTransaction` e `eth_sendRawTransaction`? {#difference-between-send-and-send-raw} + +`eth_sendTransaction` e `eth_sendRawTransaction` são ambas funções da API da Ethereum que transmitem uma transação para a rede Ethereum, então ela será adicionada a um bloco futuro. Eles diferem na forma como lidam com a assinatura das transações. + +- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) é usado para enviar _transações_ não assinadas, o que significa que o nó que você está enviando deve gerenciar a sua chave privada para que possa assinar a transação antes de transmiti-la para a cadeia. Como o Alchemy não possui as chaves privadas do usuário, eles não oferecem suporte a esse método. +- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) é usado para transmitir transações que já foram assinadas. Isso significa que você deve primeiro usar [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction), e então transmitir o resultado para `eth_sendRawTransaction`. + +Ao usar o web3, `eth_sendRawTransaction` é acessado ao chamar a função [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction). + +Isso é o que nós usaremos neste tutorial. + +### 6\. Qual é a biblioteca de web3? {#what-is-the-web3-library} + +- Web3.js é uma biblioteca wrapper em torno das chamadas JSON-RPC padrão que é bastante comum de usar no desenvolvimento de Ethereum. +- Há várias bibliotecas Web3 para diferentes tipos de linguagem. Neste tutorial, estaremos usando [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) que está escrito em JavaScript. Você pode verificar outras opções [aqui](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) como [ethers.js](https://docs.ethers.org/v5/). + +Ok, agora que temos esclarecemos esses pontos, passemos para o tutorial. Sinta-se à vontade para fazer perguntas a qualquer momento no [discord](https://discord.gg/gWuC7zB) do Alchemy! + +### 7\. Como enviar transações seguras, otimizadas de gás e privadas? {how-to-send-secure-gas-optimized-and-private-transactions} + +- [Alchemy tem um conjunto de APIs para Transações](https://docs.alchemy.com/reference/transact-api-quickstart). Você pode usá-los para reforçar transações, simular transações antes que elas aconteçam, enviar transações privadas e enviar transações otimizadas de gás +- Você também pode usar a [API de notificação](https://docs.alchemy.com/docs/alchemy-notify) para ser alertado quando sua transação for retirada do mempool e adicionada à cadeia + +**NOTA:** Este guia requer uma conta Alchemy, um endereço Ethereum ou carteira MetaMask, NodeJs e npm instalados. Se não, siga estes passos: + +1. [Crie uma conta gratuita em Alchemy](https://auth.alchemyapi.io/signup) +2. [Crie uma conta MetaMask](https://metamask.io/) (ou obtenha um endereço Ethereum) +3. [Siga estes passos para instalar o NodeJs e NPM](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs) + +## Passos para enviar sua transação {#steps-to-sending-your-transaction} + +### 1\. Crie um aplicativo Alchemy na rede de testes Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet} + +Navegue até o seu [Painel da Alchemy](https://dashboard.alchemyapi.io/) e crie um novo aplicativo, escolhendo Sepolia (ou qualquer outra rede de teste) para sua rede. + +### 2\. Solicite ETH do faucet Sepolia {#request-eth-from-sepolia-faucet} + +Siga as instruções na [torneira Sepolia da Alchemy](https://www.sepoliafaucet.com/) para receber ETH. Certifique-se de incluir seu endereço do Ethereum **Sepolia** (da MetaMask) e não outra rede. Após seguir as instruções, verifique novamente se você recebeu o ETH em sua carteira. + +### 3\. Crie um novo diretório do projeto e insira `cd` {#create-a-new-project-direction} + +Crie um novo diretório de projetos a partir da linha de comando (terminal para macs) e navegue até ele: + +``` +mkdir sendtx-example +cd sendtx-example +``` + +### 4\. Instale o Alchemy Web3 (ou qualquer biblioteca web3) {#install-alchemy-web3} + +Execute o seguinte comando em seu diretório do projeto para instalar [Alchemy Web3](https://docs.alchemy.com/reference/api-overview): + +Note que, se você quiser usar a biblioteca ethers.js, [siga as instruções aqui](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). + +``` +yarn add @alch/alchemy-web3 +``` + +### 5\. Instale o dotenv {#install-dotenv} + +Usaremos um arquivo `.env` para armazenar com segurança nossa chave de API e a chave privada. + +``` +npm install dotenv --save +``` + +### 6\. Crie o arquivo `.env` {#create-the-dotenv-file} + +Crie um arquivo `.env` no diretório de seu projeto e adicione o seguinte (substituindo “`your-api-url`" e "`your-private-key` ") + +- Para encontrar o URL da API de Alchemy, navegue até a página de detalhes do aplicativo que você acabou de criar no seu painel, clique em "Ver Chave" no canto superior direito e pegue a URL HTTP. +- Para encontrar sua chave privada usando MetaMask, confira este [guia](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key). + +``` +API_URL = "your-api-url" +PRIVATE_KEY = "your-private-key" +``` + + +No faça commit do .env! Por favor, tenha certeza de nunca compartilhar ou expor seu arquivo .env com ninguém, pois estará comprometendo suas partes secretas ao fazê-lo. Se estiver usando um controle de versão, adicione seu .env ao arquivo gitignore + + +### 7\. Crie um arquivo `iframe.ts` {#create-sendtx-js} + +Ótimo, agora que temos nossos dados confidenciais protegidos em um arquivo `.env`, vamos começar a codificar. Para nosso exemplo de envio de transação, enviaremos ETH de volta para o faucet Sepolia. + +Criar um `sendTx. s` arquivo, que é onde vamos configurar e enviar nossa transação de exemplo, e adicionar as seguintes linhas de código a ele: + +``` +async function main() { + require('dotenv').config(); + const { API_URL, PRIVATE_KEY } = process.env; + const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); + const web3 = createAlchemyWeb3(API_URL); + const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: replace this address with your own public address + + const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0 + + const transaction = { + 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth + 'value': 1000000000000000000, // 1 ETH + 'gas': 30000, + 'nonce': nonce, + // optional data field to send message or execute smart contract + }; + + const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY); + + web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) { + if (!error) { + console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!"); + } else { + console.log("❗Something went wrong while submitting your transaction:", error) + } + }); +} + +main(); +``` + +Certifique-se de substituir o endereço na **linha 6** pelo seu próprio endereço público. + +Agora, antes de nós começarmos a executar este código, vamos falar sobre alguns dos componentes aqui. + +- `nonce` : A especificação nonce é usada para acompanhar o número de transações enviadas a partir do seu endereço. Precisamos disso para fins de segurança e para evitar [replay de ataques](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Para obter o número de transações enviadas a partir do seu endereço, usamos [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +- `transação`: O objeto da transação tem alguns aspectos que precisamos especificar + - `para`: Este é o endereço para o qual queremos enviar ETH. Nesse caso, reenviamos ETH para o [faucet Sepolia](https://sepoliafaucet.com/) no qual fizemos a solicitação inicialmente. + - `valor`: Este é o valor que desejamos enviar, especificado em Wei onde 10^18 Wei = 1 ETH + - `gás`: Há muitas maneiras de determinar a quantidade de gás certa a ser incluída na sua transação. Alchemy até tem um [webhook de preço de gás](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) para notificá-lo quando o preço do gás cai dentro de um determinado limiar. Para transações na Mainnet, é uma boa prática verificar um estimador de gás como [ETH Gas Station](https://ethgasstation.info/), para determinar a quantidade certa de gás a incluir. 21000 é a quantidade mínima de gás que uma operação na Ethereum usará. Portanto, para garantir que nossa transação será executada, colocamos 30000 aqui. + - `nonce`: ver acima nonce definição. Nonce começa a contagem de zero. + - Dados [OPTATIVOS]: Usados para enviar informações adicionais com a sua transferência, ou para chamar um contrato inteligente, não necessário para transferências de saldo, confira a nota abaixo. +- `signedTx`: Para assinar nosso objeto de transação, usaremos o método `signTransaction` com nosso `PRIVATE_KEY` +- `sendSignedTransação`: Uma vez assinada, teremos uma transação assinada. podemos enviá-lo para ser incluído em um bloco subsequente usando `sendSignedTransaction` + +**Uma observação sobre os dados** Existem dois tipos principais de transações que podem ser enviadas ao Ethereum. + +- Transferência de saldo: Envie ETH de um endereço para outro. Não é necessário campo de dados, no entanto, se você quiser enviar informações adicionais junto com sua transação, você pode incluir essas informações no formato HEX neste campo. + - Por exemplo, digamos que nós queríamos escrever o hash de um documento IPFS para a cadeia Ethereum, para dar a ele um timestamp (registro de data e hora) imutável. Nosso campo de dados deveria se parecer com data: `web3.utils.toHex('IPFS hash')`. E agora, qualquer pessoa pode consultar a cadeia e ver quando esse documento foi adicionado. +- Transação de contrato inteligente: Execute algum código de contrato inteligente na cadeia. Nesse caso, o campo de dados deveria conter a função inteligente, que você deseja executar, juntamente com quaisquer parâmetros. + - Para um exemplo prático, confira a Etapa 8 neste [Tutorial Olá Mundo](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction). + +### 8\. Execute o código usando `node sendTx.js` {#run-the-code-using-node-sendtx-js} + +Navegue de volta ao seu terminal ou linha de comando e execute: + +``` +node sendTx.js +``` + +### 9\. Consultar suas transações no Mempool {#see-your-transaction-in-the-mempool} + +Abra a página de [Mempool](https://dashboard.alchemyapi.io/mempool) no painel de controle de Alchemy e filtre pelo app que você criou para encontrar sua transação. É aqui que podemos assistir nossa transição de um estado pendente para um estado minerado (se bem-sucedida) ou estado descartado em caso de falha. Certifique-se de mantê-lo em "Todos" para capturar as transações "mineradas", "pendentes", e "descartadas". Também é possível procurar sua transação procurando por transações enviadas para o endereço `0x31b98d14007bdee637298086988a0bbd31184523`. + +Para ver os detalhes da sua transação assim que encontrá-la, selecione o hash tx, que deve levar você a uma visão que se parece com isso: + +![Captura do observador Mempool](./mempool.png) + +A partir daí, você pode ver sua transação no Etherscan clicando no ícone circulado em vermelho! + +**Eba! Você acabou de enviar a sua primeira transação Ethereum usando Alchemy 🎉** + +_Para enviar comentários e sugestões sobre este guia, entre em contato com Elan no [Discord da Alchemy](https://discord.gg/A39JVCM)!_ + +_Publicado originalmente em [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/pt-br/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/pt-br/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md new file mode 100644 index 00000000000..04b61740046 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md @@ -0,0 +1,94 @@ +--- +title: Configure o web3.js para usar a Ethereum blockchain em JavaScript +description: Como usar um contrato inteligente para interagir com um token usando a linguagem Solidity +author: "jdourlens" +tags: + - "web3.js" + - "javascript" +skill: intermediate +lang: pt-br +published: 2020-04-11 +source: EthereumDev +sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Neste tutorial, vamos ver como começar com [web3.js](https://web3js.readthedocs.io/) para interagir com a blockchain Ethereum. Web3.js podem ser usados em frontend e backends para ler dados da blockchain, fazer transações e até mesmo implantar contratos inteligentes. + +O primeiro passo é incluir web3.js no seu projeto. Para usá-la em uma página da web, você pode importar a biblioteca diretamente usando um CDN como JSDeliver. + +```html + +``` + +Se você preferir instalar a biblioteca para usar em seu backend ou um projeto do frontend que usa build, você pode instalá-la usando o npm: + +```bash +npm install web3 --save +``` + +Em seguida, para importar o Web3.js em um script Node.js ou projeto front-end do Browserify, você pode usar a seguinte linha de JavaScript: + +```js +const Web3 = require("web3") +``` + +Agora que incluímos a biblioteca no projeto, precisamos inicializá-la. Seu projeto precisa ser capaz de se comunicar com a blockchain. A maioria das bibliotecas Ethereum se comunicam com um [nó](/developers/docs/nodes-and-clients/) através de chamadas RPC. Para iniciar nosso provedor Web3, nós criaremos uma instância Web3 passando como construtor a URL do provedor. Se você tiver uma instância de um nó ou [ganache executando no seu computador](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/) será parecido com isto: + +```js +const web3 = new Web3("http://localhost:8545") +``` + +Se você deseja acessar diretamente um nó hospedado, poderá encontrar opções em [nós como um serviço](/developers/docs/nodes-and-clients/nodes-as-a-service). + +```js +const web3 = new Web3("https://cloudflare-eth.com") +``` + +Para testar se configuramos corretamente nossa instância Web3, tentaremos recuperar o número do último bloco usando a função `getBlockNumber`. Esta função aceita uma chamada de callback como parâmetro e retorna o número do bloco como um inteiro. + +```js +var Web3 = require("web3") +const web3 = new Web3("https://cloudflare-eth.com") + +web3.eth.getBlockNumber(function (error, result) { + console.log(result) +}) +``` + +Se você executar este programa, ele simplesmente imprimirá o bloco mais recente: o topo do blockchain. Você também pode usar chamadas de função `await/async` para evitar aninhar (encadear por identação) chamadas de callback em seu código: + +```js +async function getBlockNumber() { + const latestBlockNumber = await web3.eth.getBlockNumber() + console.log(latestBlockNumber) + return latestBlockNumber +} + +getBlockNumber() +``` + +Você pode ver todas as funções disponíveis da instância Web3 na [documentação oficial do web3.js](https://docs.web3js.org/). + +A maioria das bibliotecas Web3 são assíncronas porque em segundo plano a biblioteca faz chamadas JSON RPC para o nó que envia os resultados. + + + +Se você estiver trabalhando no navegador, algumas carteiras injetam diretamente uma instância Web3, e você deveria tentar usá-la sempre que possível, especialmente se planeja interagir com o endereço Ethereum do usuário para fazer transações. + +Aqui está o trecho de código para detectar se uma carteira MetaMask está disponível e tentar habilitá-la se estiver. Isso permitirá mais tarde você ler o saldo do usuário e permitir-lhe-á validar as transações que gostaria de fazer na blockchain Ethereum: + +```js +if (window.ethereum != null) { + state.web3 = new Web3(window.ethereum) + try { + // Request account access if needed + await window.ethereum.enable() + // Accounts now exposed + } catch (error) { + // User denied account access... + } +} +``` + +Alternativas para web3.js como [Ethers.js](https://docs.ethers.io/) existem e também são comumente usadas. No próximo tutorial, veremos [como escutar facilmente novos blocos recebidos na blockchain e ver o que eles contêm](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/). diff --git a/public/content/translations/pt-br/developers/tutorials/short-abi/index.md b/public/content/translations/pt-br/developers/tutorials/short-abi/index.md new file mode 100644 index 00000000000..4ce396e010e --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/short-abi/index.md @@ -0,0 +1,550 @@ +--- +title: "ABIs curtos para otimização de dados de chamada" +description: Otimizando contratos inteligentes para Rollups Otimistas +author: Ori Pomerantz +lang: pt-br +tags: + - "camada 2" +skill: intermediate +published: 2022-04-01 +--- + +## Introdução {#introduction} + +Neste artigo, você aprenderá sobre [optimistic rollups](/developers/docs/scaling/optimistic-rollups), os custos das transações e como essa estrutura de custos diferente nos obriga a otimizar coisas diferentes do que fazemos na Ethereum Mainnet. Você também aprenderá como implementar essa otimização. + +### Divulgação completa {#full-disclosure} + +Eu sou funcionário em tempo integral da [Optimism](https://www.optimism.io/), então os exemplos neste artigo serão executados na Optimism. No entanto, a técnica explicada aqui deve funcionar para outras rollups também. + +### Terminologia {#terminology} + +Quando se discute rollups, o termo 'camada 1' (L1) é usado para a Mainnet, a rede Ethereum de produção. O termo 'camada 2' (L2) é usado para a rollup ou qualquer outro sistema que depende do L1 para segurança, mas faz a maior parte de seu processamento fora da cadeia + +## Como podemos reduzir ainda mais o custo das transações L2? {#how-can-we-further-reduce-the-cost-of-L2-transactions} + +[Optimistic rollups](/developers/docs/scaling/optimistic-rollups) tem que preservar um registro de cada transação histórica para que qualquer pessoa possa passar por elas e verificar se o estado atual está correto. A forma mais barata de obter dados na Ethereum Mainnet é escrevê-los como calldata. Esta solução foi escolhida por ambos [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) e [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups). + +### Custo das transações L2 {#cost-of-l2-transactions} + +O custo das transações L2 é composto por dois componentes: + +1. Processamento L2, que geralmente é extremamente barato +2. Armazenamento L1, vinculado aos custos de gas da Mainnet + +No momento em que escrevo isso, no Optimism, o custo do gas L2 é de 0,001 [Gwei](/developers/docs/gas/#pre-london). O custo do gas na L1 é de aproximadamente 40 gwei. [Você pode ver os preços atuais aqui](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m). + +Um byte de dado da chamada custa, ou 4 gas (se for zero), ou 16 gas (se for qualquer outro valor). Uma das operações mais caras no EVM é escrever no storage. O custo máximo de escrever uma palavra de 32 bytes para armazenamento na L2 é de 22100 gas. Atualmente, isso é 22.1 gwei. Portanto, se nós pudermos salvar um único byte zero de calldata, poderemos gravar cerca de 200 bytes no armazenamento e ainda sairemos ganhando. + +### O ABI {#the-abi} + +A grande maioria das transações acessa um contrato de uma conta de propriedade externa. A maioria dos contratos é escrita em Solidity e interpreta seu campo de dados de acordo com a [interface binária do aplicativo (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). + +No entanto, a ABI foi projetada para L1, em que um byte de dados da chamada custa aproximadamente o mesmo que quatro operações aritméticas, não para L2, em que um byte de dados da chamada custa mais de mil operações aritméticas. Por exemplo, [aqui está uma transação de transferência ERC-20](https://kovan-optimistic.etherscan.io/tx/0x7ce4c144ebfce157b4de99d8ad53a352ae91b57b3fa06d8a1c79439df6bfa998). Os dados da chamada são divididos da seguinte forma: + +| Seção | Comprimento | Bytes | Bytes gastos | Gas gasto | Bytes necessários | Gas necessário | +| ------------------- | -----------:| -----:| ------------:| ---------:| -----------------:| --------------:| +| Seletor de função | 4 | 0-3 | 3 | 48 | 1 | 16 | +| Zeros | 12 | 4-15 | 12 | 48 | 0 | 0 | +| Endereço de destino | 20 | 16-35 | 0 | 0 | 20 | 320 | +| Quantidade | 32 | 16-35 | 17 | 64 | 15 | 240 | +| Total | 68 | | | 576 | | 576 | + +Explicação: + +- **Seletor de funções**: O contrato tem menos de 256 funções, portanto podemos distingui-las com um único byte. Esses bytes são tipicamente diferentes de zero e, portanto, [custam dezesseis gás](https://eips.ethereum.org/EIPS/eip-2028). +- **Zeros**: Esses bytes são sempre zero porque um endereço de vinte bytes não requer uma palavra de trinta e dois bytes para usá-lo. Bytes que possuem zero custam quatro gas ([consulte o yellow paper](https://ethereum.github.io/yellowpaper/paper.pdf), Apêndice G, pág. 27, o valor para `G``txdatazero`). +- **Quantia**: Se nós assumirmos que neste contrato `decimais` são dezoito (o valor normal) e o valor máximo de tokens que nós transferimos será 1018, nós temos uma quantia máxima de 1036. 25615 > 1036, então quinze bytes são suficientes. + +Um gasto de 160 gas na L1 é normalmente insignificante. Uma transação custa pelo menos [21.000 gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), então um extra de 0,8% não importa. Entretanto, na L2, as coisas são diferentes. Quase o custo inteiro da transação é escrevendo-o na L1. Em adição ao calldata da transação, há 109 bytes de cabeçalho de transação (endereço de destino, assinatura, etc.). O custo total é portanto `109*16+576+160=2480`, e nós estamos desperdiçando cerca de 6,5% disso. + +## Reduzindo custos quando você não controla o destino {#reducing-costs-when-you-dont-control-the-destination} + +Assumindo que você não tem controle sobre o contrato de destino, você pode ainda usar uma solução similar a [esta](https://github.com/qbzzt/ethereum.org-20220330-shortABI). Vamos passar pelos arquivos relevantes. + +### Token.sol {#token-sol} + +[Este é o contrato destino](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). É um contrato ERC-20 padrão, com um recurso adicional. Esta função `faucet` permite qualquer usuário obter algum token para usar. Ele faria o contrato de produção ERC-20 inútil, mas ele facilita a vida quando um ERC-20 existe somente para facilitar o teste. + +```solidity + /** + * @dev Gives the caller 1000 tokens to play with + */ + function faucet() external { + _mint(msg.sender, 1000); + } // function faucet +``` + +[Você pode ver um exemplo deste contrato sendo implantado aqui](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8). + +### CalldataInterpreter.sol {#calldatainterpreter-sol} + +[Este é o contrato que transações devem chamar com calldata menor](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). Vamos passar por ele linha a linha. + +```solidity +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + + +import { OrisUselessToken } from "./Token.sol"; +``` + +Nós precisamos da função do token para saber como chamá-lo. + +```solidity +contract CalldataInterpreter { + + OrisUselessToken public immutable token; +``` + +O endereço do token para o qual nós somos um proxy. + +```solidity + + /** + * @dev Specify the token address + * @param tokenAddr_ ERC-20 contract address + */ + constructor( + address tokenAddr_ + ) { + token = OrisUselessToken(tokenAddr_); + } // constructor +``` + +O endereço do token é o único parâmetro que nós precisamos especificar. + +```solidity + function calldataVal(uint startByte, uint length) + private pure returns (uint) { +``` + +Ler um valor do calldata. + +```solidity + uint _retVal; + + require(length < 0x21, + "calldataVal length limit is 32 bytes"); + + require(length + startByte <= msg.data.length, + "calldataVal trying to read beyond calldatasize"); +``` + +Nós iremos carregar uma simples palavra de 32-bytes (256-bit) para a memória e remover os bytes que não são parte do campo que nós queremos. Este algoritmo não funciona para valores maiores que 32 bytes, e claro, não podemos ler depois do fim do calldata. Na L1 pode ser necessário pular estes testes para economizar gas, mas na L2 o gas é extremamente barato, o que permite qualquer checagem de sanidade que possamos pensar. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Nós poderiamos ter copiado os dados da chamada ao `fallback()` (veja abaixo), mas é mais fácil usar [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), a linguagem de montagem da EVM. + +Aqui nós usamos [o opcode CALLDATALOAD](https://www.evm.codes/#35) para ler bytes `startByte` até `startByte+31` na pilha. Em geral, a sintaxe de um opcode em Yul é `(,...)`. + +```solidity + + _retVal = _retVal >> (256-length*8); +``` + +Somente os bytes mais `length` significantes são parte do campo, então nós fazemos [right-shift](https://en.wikipedia.org/wiki/Logical_shift) para se livrar dos outros valores. Isto tem a vantagem adicional de mover o valor para a direita do campo, então é o valor por ele mesmo, ao invés do valor vezes 256alguma coisa. + +```solidity + + return _retVal; + } + + + fallback() external { +``` + +Quando uma chamada a um contrato Solidity não encontra nenhuma das assinaturas de função, ela chama a função [the `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (assumindo que exista uma). No caso de `CalldataInterpreter`, _qualquer_ chamada chega aqui porque não há outras funções `external` ou `public`. + +```solidity + uint _func; + + _func = calldataVal(0, 1); +``` + +Leia o primeiro byte do calldata, que nos conta a função. Há duas razões porque uma função não estaria disponível aqui: + +1. Funções que são `pure` ou `view` não mudam seu estado e não custam gas (quando chamadas off-chain). Não faz sentido tentar reduzir seus custos de gas. +2. Funções que confiam em [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties). O valor de `msg.sender` será o endereço do `CalldataInterpreter`, não o chamador. + +Infelizmente, [olhando as especificações do ERC-20](https://eips.ethereum.org/EIPS/eip-20), isto deixa apenas uma função, `transfer`. Isto nos deixa com somente duas funções: `transfer` (porque nós podemos chamar `transferFrom`) e `faucet` (porque nós podemos transferir os tokens de volta a quem quer tenha nos chamado). + +```solidity + + // Call the state changing methods of token using + // information from the calldata + + // faucet + if (_func == 1) { +``` + +Uma chamada para `faucet()`, que não tem parâmetros. + +```solidity + token.faucet(); + token.transfer(msg.sender, + token.balanceOf(address(this))); + } +``` + +Depois que nós chamamos `token.faucet()` nós obtivemos tokens. Entretanto, como o contrato proxy, nós não **precisamos** de tokens. O EOA (externally owned account) ou contrato que nos chamou o faz. Então nós transferimos todos nossos tokens para quem quer tenha nos chamado. + +```solidity + // transfer (assume we have an allowance for it) + if (_func == 2) { +``` + +Transferir tokens requer dois parâmetros: o endereço de destino e a quantidade. + +```solidity + token.transferFrom( + msg.sender, +``` + +Nós apenas permitimos chamadores transferir tokens que eles possuam + +```solidity + address(uint160(calldataVal(1, 20))), +``` + +O endereço de destino começa no byte 1 (o byte 0 é a função). Como um endereço, ele tem 20-bytes de comprimento. + +```solidity + calldataVal(21, 2) +``` + +Para esse contrato em particular nós assumimos que o número máximo de tokens que qualquer um poderia querer transferir cabe em dois bytes (menos que 65536). + +```solidity + ); + } +``` + +Em geral, uma transferência pega 35 bytes de calldata: + +| Seção | Comprimento | Bytes | +| ------------------- | -----------:| -----:| +| Seletor de função | 1 | 0 | +| Endereço de destino | 32 | 1-32 | +| Quantidade | 2 | 33-34 | + +```solidity + } // fallback + +} // contract CalldataInterpreter +``` + +### test.js {#test-js} + +[Este teste unitário JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) nos mostra como usar este mecanismo (e como verificar que ele trabalha corretamente). Parto do princípio que você entendeu [chai](https://www.chaijs.com/) e [ethers](https://docs.ethers.io/v5/) e apenas explicar as partes que especificamente se aplicam ao contrato. + +```js +const { expect } = require("chai"); + +describe("CalldataInterpreter", function () { + it("Should let us use tokens", async function () { + const Token = await ethers.getContractFactory("OrisUselessToken") + const token = await Token.deploy() + await token.deployed() + console.log("Token addr:", token.address) + + const Cdi = await ethers.getContractFactory("CalldataInterpreter") + const cdi = await Cdi.deploy(token.address) + await cdi.deployed() + console.log("CalldataInterpreter addr:", cdi.address) + + const signer = await ethers.getSigner() +``` + +Nós começamos por implantar ambos contratos. + +```javascript + // Get tokens to play with + const faucetTx = { +``` + +Nós não podemos usar funções de alto nível que nós normalmente usamos (como `token.faucet()`) para criar transações, porque nós não seguimos o ABI. Ao invés disso, nós temos que construir a transação nós mesmos e enviá-la. + +```javascript + to: cdi.address, + data: "0x01" +``` + +Há dois parâmetros que nós precisamos fornecer para a transação: + +1. `to`, o endereço de destino. Isto é o contrato interpretador do calldata. +2. `data`, o calldata a enviar. No caso de uma chamada de faucet, o dado é um único byte, `0x01`. + +```javascript + + } + await (await signer.sendTransaction(faucetTx)).wait() +``` + +Nós chamamos o método `sendTransaction` do [assinante](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) porque nós já especificamos o destino (`faucetTx.to`) e nós precisamos que a transação seja assinada. + +```javascript +// Check the faucet provides the tokens correctly +expect(await token.balanceOf(signer.address)).to.equal(1000) +``` + +Aqui nós verificamos o saldo. Não há necessidade de economizar gas em funções `view`, então nós só as rodamos normalmente. + +```javascript +// Give the CDI an allowance (approvals cannot be proxied) +const approveTX = await token.approve(cdi.address, 10000) +await approveTX.wait() +expect(await token.allowance(signer.address, cdi.address)).to.equal(10000) +``` + +Dar ao intérprete calldata uma permissão para ser capaz de fazer transferências. + +```javascript +// Transfer tokens +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +``` + +Criar uma transação de transferência. O primeiro byte é "0x02", seguido pelo endereço de destino, e finalmente a quantia (0x0100, que é 256 em decimal). + +```javascript + await (await signer.sendTransaction(transferTx)).wait() + + // Check that we have 256 tokens less + expect (await token.balanceOf(signer.address)).to.equal(1000-256) + + // And that our destination got them + expect (await token.balanceOf(destAddr)).to.equal(256) + }) // it +}) // describe +``` + +### Exemplo {#example} + +Se você quiser ver estes arquivos em ação sem precisar rodá-los, siga estes links: + +1. [Implantação de `OrisUselessToken`](https://kovan-optimistic.etherscan.io/tx/1410744) no [endereço `0x950c753c0edbde44a74d3793db738a318e9c8ce8`](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8). +2. [Implantação de `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1410745) no [endereço `0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55`](https://kovan-optimistic.etherscan.io/address/0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55). +3. [Chamada para `faucet()`](https://kovan-optimistic.etherscan.io/tx/1410746). +4. [Chamada para `OrisUselessToken.approve()`](https://kovan-optimistic.etherscan.io/tx/1410747). Esta chamada tem de ir diretamente para o contrato do token porque o processamento confia no `msg.sender`. +5. [Chamada para `transfer()`](https://kovan-optimistic.etherscan.io/tx/1410748). + +## Reduzindo o custo quando você controla o contrato destino {#reducing-the-cost-when-you-do-control-the-destination-contract} + +Se você realmente tem controle sobre o contrato destino, você pode criar funções que ignoram as checagens do `msg.sender` porque eles acreditam no intérprete do calldata. [Você pode ver um exemplo de como isto funciona aqui, no branch `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract). + +Se o contrato estiver respondendo somente para transações externas, nós poderíamos ter apenas um contrato. Entretanto, isso iria quebrar [a capacidade de composição](/developers/docs/smart-contracts/composability/). É bem melhor ter um contrato que responda a chamadas ERC-20 normais, e outro contrato que responda a transações com chamadas curtas de dados. + +### Token.sol {#token-sol-2} + +Neste exemplo nós podemos modificar `Token.sol`. Isto nos deixa ter um número de funções que somente o proxy pode chamar. Eis aqui as novas partes: + +```solidity + // The only address allowed to specify the CalldataInterpreter address + address owner; + + // The CalldataInterpreter address + address proxy = address(0); +``` + +O contrato ERC-20 precisa saber a identidade do proxy autorizado. Entretanto, nós não podemos configurar esta variável no construtor, porque nós não sabemos o valor ainda. Este contrato é instanciado primeiro porque o proxy espera o endereço do token no seu construtor. + +```solidity + /** + * @dev Calls the ERC20 constructor. + */ + constructor( + ) ERC20("Oris useless token-2", "OUT-2") { + owner = msg.sender; + } +``` + +O endereço do criador (chamado`owner`) é armazenado aqui porque este é o único endereço permitido para configurar o proxy. + +```solidity + /** + * @dev set the address for the proxy (the CalldataInterpreter). + * Can only be called once by the owner + */ + function setProxy(address _proxy) external { + require(msg.sender == owner, "Can only be called by owner"); + require(proxy == address(0), "Proxy is already set"); + + proxy = _proxy; + } // function setProxy +``` + +O proxy tem acesso privilegiado, porque ele pode ignorar checagens de segurança. Para garantir que nós podemos acreditar no proxy, nós somente deixamos `owner` chamar esta função, e somente uma vez. Uma vez que `proxy` tenha um valor real (não zero), este valor não pode mudar, então mesmo se o proprietário decide se tornar trapaceiro, ou caso o mnemônico seja revelado a ele, nós ainda estamos seguros. + +```solidity + /** + * @dev Some functions may only be called by the proxy. + */ + modifier onlyProxy { +``` + +Isto é uma função [`modifier`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), ela modifica a maneira que outras funções trabalham. + +```solidity + require(msg.sender == proxy); +``` + +Primeiro, verifique que nós fomos chamados pelo proxy e ninguém mais. Se não, `revert`. + +```solidity + _; + } +``` + +Neste caso, rode a função que nós modificamos. + +```solidity + /* Functions that allow the proxy to actually proxy for accounts */ + + function transferProxy(address from, address to, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _transfer(from, to, amount); + return true; + } + + function approveProxy(address from, address spender, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _approve(from, spender, amount); + return true; + } + + function transferFromProxy( + address spender, + address from, + address to, + uint256 amount + ) public virtual onlyProxy() returns (bool) + { + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + return true; + } +``` + +Há três operações que normalmente requerem que a mensagem venha direto da entidade transferindo tokens ou aprovando uma permissão. Aqui nós temos uma versão de proxy destas operações que: + +1. É modificada pelo `onlyProxy()`, de modo que ninguém mais tem permissão de controlá-los. +2. Pega o endereço que seria normalmente `msg.sender` como um parâmetro extra. + +### CalldataInterpreter.sol {#calldatainterpreter-sol-2} + +O interpretador calldata é praticamente idêntico ao acima, exceto que as funções com proxy recebem um parâmetro `msg.sender` e não há necessidade de permissão `transfer`. + +```solidity + // transfer (no need for allowance) + if (_func == 2) { + token.transferProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // approve + if (_func == 3) { + token.approveProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // transferFrom + if (_func == 4) { + token.transferFromProxy( + msg.sender, + address(uint160(calldataVal( 1, 20))), + address(uint160(calldataVal(21, 20))), + calldataVal(41, 2) + ); + } +``` + +### Test.js {#test-js-2} + +Há pequenas mudanças entre o código de teste anterior e este. + +```js +const Cdi = await ethers.getContractFactory("CalldataInterpreter") +const cdi = await Cdi.deploy(token.address) +await cdi.deployed() +await token.setProxy(cdi.address) +``` + +Nós precisamos contar ao contrato ERC-20 qual proxy acreditar + +```js +console.log("CalldataInterpreter addr:", cdi.address) + +// Need two signers to verify allowances +const signers = await ethers.getSigners() +const signer = signers[0] +const poorSigner = signers[1] +``` + +Para checar `approve()` e `transferFrom()` nós precisamos de um segundo assinante. Nós o chamamos de `poorSigner` porque ele não pega nenhum de nossos tokens (ele precisa ter ETH, claro). + +```js +// Transfer tokens +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +await (await signer.sendTransaction(transferTx)).wait() +``` + +Como o contrato ERC-20 confia no proxy (`cdi`), nós não precisamos de uma permissão para confiar em transferências. + +```js +// approval and 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() + +// Check the approve / transferFrom combo was done correctly +expect(await token.balanceOf(destAddr2)).to.equal(255) +``` + +Teste as duas novas funções. Note que `transferFromTx` requer dois parâmetros de endereço: o que deu a permissão e o recebedor. + +### Exemplo {#example-2} + +Se você quiser ver estes arquivos em ação sem precisar rodá-los, siga estes links: + +1. [Implantação de `OrisUselessToken-2`](https://kovan-optimistic.etherscan.io/tx/1475397) no endereço [`0xb47c1f550d8af70b339970c673bbdb2594011696`](https://kovan-optimistic.etherscan.io/address/0xb47c1f550d8af70b339970c673bbdb2594011696). +2. [Implantação de `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1475400) no endereço [`0x0dccfd03e3aaba2f8c4ea4008487fd0380815892`](https://kovan-optimistic.etherscan.io/address/0x0dccfd03e3aaba2f8c4ea4008487fd0380815892). +3. [Chamada para `transfer()`](https://kovan-optimistic.etherscan.io/tx/1475402). +4. [Chamada para `faucet()`](https://kovan-optimistic.etherscan.io/tx/1475409). +5. [Chamada para `transferProxy()`](https://kovan-optimistic.etherscan.io/tx/1475416). +6. [Chamada para `approveProxy()`](https://kovan-optimistic.etherscan.io/tx/1475419). +7. [Chamada para `transferFromFProxy()`](https://kovan-optimistic.etherscan.io/tx/1475421). Note que esta chamada vem de um endereço diferente dos outros, `poorSigner` ao invés de `signer`. + +## Conclusão {#conclusion} + +Ambos [Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) e [Arbitrum](https://developer.offchainlabs.com/docs/special_features) estão procurando por maneiras de reduzir o tamanho do calldata escrito no L1 e portanto o custo das transações. Entretanto, como provedores de infraestrutura procurando por soluções genéricas, nossas habilidades são limitadas. Como desenvolvedor dapp, você tem conhecimento específico de aplicações, o que te leva a otimizar seu calldata muito melhor do que nós poderíamos com uma solução genérica. Esperamos que este artigo ajude você a encontrar a solução ideal para as suas necessidades. diff --git a/public/content/translations/pt-br/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/pt-br/developers/tutorials/smart-contract-security-guidelines/index.md new file mode 100644 index 00000000000..6053257ce85 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/smart-contract-security-guidelines/index.md @@ -0,0 +1,94 @@ +--- +title: Diretrizes de segurança do contrato inteligente +description: Uma lista de verificações de diretrizes de segurança a considerar ao construir seu dapp +author: "Trailofbits" +tags: + - "solidity" + - "contratos inteligentes" + - "segurança" +skill: intermediate +lang: pt-br +published: 2020-09-06 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md +--- + +Siga estas recomendações de alto nível para construir contratos inteligentes mais seguros. + +## Padrões de design {#design-guidelines} + +O design do contrato deve ser discutido antecipadamente, antes de escrever qualquer linha de código. + +### Documentação e especificações {#documentation-and-specifications} + +A documentação pode ser escrita em diferentes níveis, e deve ser atualizada durante a implementação dos contratos: + +- **Uma descrição simples em inglês do sistema**, descrevendo o que os contratos fazem e qualquer suposição no código. +- **Esquemas e diagramas arquitetônicos**, incluindo as interações de contratos e a máquina de estado do sistema. [Impressoras do Slither](https://github.com/crytic/slither/wiki/Printer-documentation) podem ajudar a gerar esses esquemas. +- **Documentação de código Thorough**, o [formato Natspec](https://solidity.readthedocs.io/en/develop/natspec-format.html) pode ser usado para Solidity. + +### Computação on-chain vs off-chain {#on-chain-vs-off-chain-computation} + +- **Mantenha o máximo de código que puder off-chain (fora da cadeia).** Mantenha a menor camada on-chain (dentro da cadeia). Pré-processe dados com código off-chain de tal forma que a verificação on-chain torne-se simples. Você precisa de uma lista ordenada? Ordene a lista off-chain, então apenas verifique a ordem on-chain. + +### Capacidade de Atualização {#upgradeability} + +Nós discutimos as diferentes soluções de atualização em [nosso blog](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Faça ou não uma escolha deliberada para apoiar a capacidade de atualização antes de escrever qualquer código. A decisão irá influenciar como você estrutura nosso código. Em geral, recomendamos: + +- **Favorecer a [migração do contrato](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) sobre a atualização.** O sistema de migração tem muitas das mesmas vantagens do que ser atualizável, sem suas desvantagens. +- **Usando o padrão de separação de dados sobre o proxy delegatecallproxy.** Se o seu projeto tem uma separação de abstração clara, a atualizabilidade usando a separação de dados exigirá apenas alguns ajustes. O delegatecallproxy exige conhecimento de EVM e é altamente susceptível de erros. +- **Documentar o procedimento de migração/atualização antes da implantação.** Se você tiver que reagir sob o estresse sem quaisquer diretrizes, você cometerá erros. Escreva o procedimento a seguir com antecedência. Ele deve incluir: + - As exigências que iniciam os novos contratos + - Onde são armazenadas as chaves e como acessá-las + - Como verificar a implantação de arquivos! Desenvolva e teste um script de pós-implantação. + +## Orientações de implementação {#implementation-guidelines} + +**Esforço pela simplicidade.** Sempre use a solução mais simples que se encaixa em seu propósito. Qualquer membro da sua equipe deve ser capaz de entender a sua solução. + +### Composição de funções {#function-composition} + +A arquitetura da sua base de código deve facilitar a revisão do seu código. Evite escolhas arquitetônicas que diminuam a capacidade de raciocínio sobre sua exatidão. + +- **Divida a lógica do seu sistema**, seja por meio de vários contratos ou agrupando funções semelhantes juntas (por exemplo, autenticação, aritmética, ...). +- **Escreva funções pequenas, com um propósito claro.** Isso facilitará uma revisão mais tranquila e permitirá o teste de componentes individuais. + +### Herança {#inheritance} + +- **Mantenha a herança gerenciável.** A herança deve ser usada para dividir a lógica, no entanto, seu projeto deve visar minimizar a profundidade e a largura da árvore de herança. +- **Use a [impressora de herança de Slither](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) para verificar a hierarquia dos contratos.** A impressora de herança irá ajudá-lo a rever o tamanho da hierarquia. + +### Eventos {#events} + +- **Registre todas as operações cruciais.** Os eventos ajudarão a depurar o contrato durante o desenvolvimento e a monitorá-lo após a implantação. + +### Evite armadilhas conhecidas {#avoid-known-pitfalls} + +- **Esteja ciente dos problemas de segurança mais comuns.** Há muitos recursos on-line para aprender sobre problemas comuns, como [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture o Ether](https://capturetheether.com/), ou [ contratos não tão inteligentes](https://github.com/crytic/not-so-smart-contracts/). +- **Esteja ciente das seções de avisos na [documentação Solidity](https://solidity.readthedocs.io/en/latest/)** As seções de avisos irão informá-lo sobre comportamentos não óbvios da linguagem. + +### Dependências {#dependencies} + +- **Use bibliotecas testadas.** A importação de código de bibliotecas testadas reduzirá a probabilidade de você escrever código com erros. Se você deseja escrever um contrato ERC20, use [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20). +- **Use um gerenciador de dependências; evite "copiar-e-colar" códigos.** Se você estiver contando com uma fonte externa, então você deve mantê-lo atualizado com a fonte original. + +### Teste e Validação {#testing-and-verification} + +- **Escreva testes unitários completos.** Um conjunto extenso de testes é crucial para construir softwares de alta qualidade. +- **Escreva propriedades e verificações personalizadas com [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) e [Manticore](https://github.com/trailofbits/manticore).** Ferramentas automatizadas ajudarão a garantir que o seu contrato é seguro. Revise o resto deste guia para aprender a escrever propriedades e verificações eficientes. +- **Use o [crytic.io](https://crytic.io/).** O Critic integra-se ao Github, fornece acesso a detectores privados do Slither e executa verificações de propriedade personalizadas pelo Echidna. + +### Solidity {#solidity} + +- **Favoreça a Solidity 0.5 em vez de 0.4 e 0.6.** Em nossa opinião, a Solidity 0.5 é mais seguro e tem melhores práticas incorporadas que a 0.4. A Solidity 0.6 provou ser demasiado instável para produção e precisa de tempo para amadurecer. +- **Use um lançamento estável para compilar; use a versão mais recente para verificar se há avisos.** Verifique se o seu código não relatou problemas com a versão mais recente do compilador. No entanto, a Solidity tem um ciclo de lançamento rápido e tem um histórico de erros do compilador, então não recomendamos a versão mais recente para implantar (veja a [recomendação de versão solc do Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33)). +- **Não use montagem embutida.** A montagem requer experiência em EVM. Não escreva o código EVM se você não tiver _dominado_ o Yellow Paper da Ethereum. + +## Orientações de implantação {#deployment-guidelines} + +Uma vez que o contrato tenha sido desenvolvido e implantado: + +- **Monitore seus contratos.** Observe os acessos e esteja pronto para reagir em caso de comprometimento do contrato ou da carteira. +- **Adicione suas informações de contato em [contatos de segurança da blockchain](https://github.com/crytic/blockchain-security-contacts).** Essa lista ajuda a terceiros a entrar em contato com você caso uma falha de segurança seja descoberta. +- **Proteja as carteiras de usuários privilegiados.** Siga nossas [melhores práticas](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) se você armazenar chaves em carteiras físicas (hardware). +- **Tenha uma resposta ao plano de incidentes.** Considere que seus contratos inteligentes possam ser comprometidos. Mesmo que seus contratos estejam livres de erros, um invasor pode assumir o controle das chaves do proprietário do contrato. diff --git a/public/content/translations/pt-br/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md b/public/content/translations/pt-br/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md new file mode 100644 index 00000000000..df50e1e3c93 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md @@ -0,0 +1,194 @@ +--- +title: "Configuração contínua de integração Solidity e Truffle" +description: Como configurar o Travis ou Circle CI para testes deTruffle, juntamente com plugins úteis +author: Markus Waas +lang: pt-br +tags: + - "solidez" + - "contratos inteligentes" + - "testando" + - "truffle" + - "ganache" +skill: intermediate +published: 2020-06-05 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/continuous-integration +--- + +A integração contínua (CI) com o Truffle é excelente para desenvolvimento assim que você tiver um conjunto básico de testes implementados. Isso permite que você execute testes muito longos, garantir que todos os testes passem antes de mesclar um [pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) e para manter o controle de várias estatísticas usando ferramentas adicionais. + +Usaremos o [Truffle Metacoin Box](https://www.trufflesuite.com/boxes/metacoin) para configurar nossa integração contínua. Você pode escolher o Travis CI ou o Circle CI. + +## Configurando Travis CI {#setting-up-travis-ci} + +Adicionando [Travis CI](https://travis-ci.org/) é reta. Você só precisará adicionar um arquivo de configuração `.travis.yml` na pasta raiz do projeto: + +```yml +language: node_js +node_js: + - 10 + +cache: npm + +before_script: + - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p + +script: + - npm test +``` + +Nós estamos mantendo tudo simples por enquanto e estamos executando apenas o script de teste que executa os testes de unidade Truffle. Mas temos um problema, não haverá uma blockchain disponível na máquina Travis CI. Uma correção simples para isso é `npm install ganache-cli` e simplesmente executá-lo antes do teste. Você pode fazer isso adicionando um bash script com a linha npx `ganache-cli > /dev/null` e antes da chamada `npx truffle`. O [script bash completo de exemplo](https://github.com/gorgos/Truffle-CI-Example/blob/master/scripts/run_tests.sh). + +## Configurando o Circle CI {#setting-up-circle-ci} + +[CircleCi](https://circleci.com/) requer um arquivo de configuração mais longo. O comando adicional [`npm ci`](https://docs.npmjs.com/cli/ci.html) é feito automaticamente no Travis. Ele instala as dependências mais rápido e mais seguro do que o `npm install` faz. Nós usamos novamente o mesmo script da versão de Travis para rodar ganache-cli antes dos testes. + +```yml +version: 2 + +aliases: + - &defaults + docker: + - image: circleci/node:10 + + - &cache_key_node_modules + key: v1-node_modules-{{ checksum "package-lock.json" }} + +jobs: + dependencies: + <<: *defaults + steps: + - checkout + - restore_cache: + <<: *cache_key_node_modules + - run: + name: Install npm dependencies + command: | + if [ ! -d node_modules ]; then + npm ci + fi + - persist_to_workspace: + root: . + paths: + - node_modules + - build + - save_cache: + paths: + - node_modules + <<: *cache_key_node_modules + + test: + <<: *defaults + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Unit tests + command: npm test + +workflows: + version: 2 + everything: + jobs: + - dependencies + - test: + requires: + - dependencies +``` + +## Adicionando o plugin eth-gas-reportter {#adding-the-eth-gas-reporter-plugin} + +O plugin eth-gas-reportter é bastante útil para manter o controle dos custos de gas de suas funções de contrato inteligente. Tê-lo em seu CI será mais útil para mostrar diffs ao adicionar pull requests. + +### Passo 1: Instale o plugin eth-gas-reportter e as verificações de código {#step-1-install-the-eth-gas-reporter-plugin-and-codechecks} + +```bash +npm install --save-dev eth-gas-reporter +npm install --save-dev @codechecks/client +``` + +### Etapa 2: Adicione o plugin nas configurações do mocha dentro do arquivo truffle-config.js {#step-2-add-the-plugin-to-the-mocha-settings-inside-your-truffle-configjs} + +[Ver opções](https://github.com/cgewecke/eth-gas-reporter#options) + +```js +module.exports = { + networks: { ... }, + mocha: { + reporter: 'eth-gas-reporter', + reporterOptions: { + excludeContracts: ['Migrations'] + } + } +}; +``` + +### Passo 3: Adicione um codechecks.yml ao diretório raiz do seu projeto {#step-3-add-a-codechecksyml-to-your-projects-root-directory} + +```yml +checks: + - name: eth-gas-reporter/codechecks +``` + +### Passo 4: Execute verificações de código após o comando de teste {#step-4-run-codechecks-after-the-test-command} + +```bash +- npm test +- npx codechecks +``` + +### Passo 5: Crie uma conta no Codechecks {#step-5-create-a-codechecks-account} + +- Crie uma conta com [Codechecks](http://codechecks.io/). +- Adicionar o repositório do Github a ele. +- Copie o segredo e adicione o `CC_SECRET=SEGRET COPIADO` ao seu CI (veja aqui para [Travis](https://docs.travis-ci.com/user/environment-variables/),, aqui para [CircleCi](https://circleci.com/docs/2.0/env-vars/#setting-an-environment-variable-in-a-project)). +- Agora vá em frente e crie um pull request. + +É isso. Agora você vai encontrar um bom relatório sobre mudanças nos custos de gas do seu pull request. + +![Exemplos de relatórios de gas](./gas-reports.png) + +## Adicionando o plugin Solidity-coverage {#adding-the-solidity-coverage-plugin} + +Com o plugin Solidity-coverage, você pode verificar a quantidade de caminhos de seu código cobertos por seus testes. Adicionar isto à sua criação de CI é muito conveniente quando for criado. + +### Passo 1: Crie um projeto metacoin e instale ferramentas de cobertura {#step-1-create-a-metacoin-project-and-install-coverage-tools} + +```bash +npm install --save-dev truffle coveralls solidity-coverage +``` + +### Etapa 2: Adicionar solidity-coverage para o array de plugins em truffle-config.js {#step-2-add-solidity-coverage-to-the-plugins-array-in-truffle-configjs} + +```js +module.exports = { + networks: {...}, + plugins: ["solidity-coverage"] +} +``` + +### Passo 3: Adicione os comandos de cobertura ao arquivo .travis.yml ou Circle CI config.yml {#step-3-add-the-coverage-commands-to-the-travisyml-or-circle-ci-configyml} + +```bash +- npx truffle run coverage +- cat coverage/lcov.info | npx coveralls +``` + +A cobertura da Solidity começa seu próprio ganache-cli, então não precisamos nos preocupar com isso. Não substitua o comando de teste regular, porém, a cobertura de ganache-cli funciona de forma diferente e, portanto, não é substituto para a execução de testes de unidade regulares. + +### Passo 4: Adicionar repositório às coberturas {#step-4-add-repository-to-coveralls} + +- Crie uma conta com [Codechecks](https://coveralls.io/). +- Adicionar o repositório do Github a ele. +- Agora vá em frente e crie um pull request. + +![Exemplo de cobertura](./coverall.png) + +## Mais idéias {#further-ideas} + +- [MitX](https://mythx.io/): Com MythX você pode analisar automaticamente a segurança de seu contrato inteligente. Então faz muito sentido [adicionar isto ao seu CI](https://blog.mythx.io/howto/mythx-and-continuous-integration-part-1-circleci/). +- [Linting](https://wikipedia.org/wiki/Lint_%28software%29): Um bom código pode ser aplicado até certo ponto com ferramentas de linting. [Eslint](https://eslint.org/) funciona muito bem para JavaScript, é [ fácil de configurar](https://eslint.org/docs/user-guide/getting-started), enquanto [Solhint](https://protofire.github.io/solhint/) pode ser usado para Solidity. +- Testes longos: Às vezes, você pode querer adicionar testes extremos, por exemplo, testar contratos com centenas de usuários. Isto leva muito tempo. Em vez de executar aqueles em cada execução de teste, adicione-os ao CI. + +Aí está o que tem. A integração contínua é uma estratégia muito útil para os seus desenvolvimentos. Você pode conferir um exemplo completo em [Truffle-CI-Example](https://github.com/gorgos/Truffle-CI-Example). Basta remover o Circle-CI ou Travis, um é suficiente! diff --git a/public/content/translations/pt-br/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md b/public/content/translations/pt-br/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md new file mode 100644 index 00000000000..8e3afcb9a68 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md @@ -0,0 +1,1138 @@ +--- +title: Testando tokens ERC-20 com Waffle +description: Aprenda como testar contratos inteligentes do Solidity e usar "matchers" de contratos inteligentes com o Waffle. +author: Vladislav Starostenko +tags: + - "waffle" + - "contratos inteligentes" + - "solidity" + - "testando" + - "erc-20" +skill: intermediate +lang: pt-br +published: 2020-10-16 +--- + +Neste tutorial, você aprenderá: + +- Crie testes para contratos inteligentes com Waffle +- Use alguns matchers populares para testar contratos inteligentes com Waffle + +Pressupostos: + +- você pode conseguir em um terminal, +- você pode criar um novo projeto de `JavaScript`, +- você escreveu algumas linhas de código `Solidity`, +- você escreveu alguns testes em `JavaScript`, +- você usou `yarn` or `npm`, o instalador de pacotes de JavaScript. + +Novamente. Caso algum desse tópicos não se apliquem, ou você não planeja reproduzir o código desse artigo, você provavelmente vai conseguir acompanhar o que vem a seguir. + +## Algumas palavras sobre Waffle {#a-few-words-about-waffle} + +[Waffle](https://getwaffle.io) é a biblioteca mais avançada para escrever e testar contratos inteligentes. + +Funciona com a [API JavaScript](/developers/docs/apis/javascript/) ethers-js. + +Você pode ler mais detalhes na [documentação Waffle](https://ethereum-waffle.readthedocs.io/en/latest/#waffle-documentation)! + +## O tutorial rápido {#the-quick-tutorial} + +Primeiro as coisas primeiras, crie um novo projeto de `JavaScript` ou `TypeScript` (Vou usar `TS`, mas se você usa `JS` não é um problema) : + +Alguma coisa como esta : + +
      +package.json + + { + "name": "tutorial", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "scripts": { + "test": "export NODE_ENV=test && mocha", + "lint": "eslint '{src,test}/**/*.ts'", + "lint:fix": "eslint --fix '{src,test}/**/*.ts'", + "build": "waffle" + }, + "devDependencies": { + "@types/mocha": "^5.2.7", + "@typescript-eslint/eslint-plugin": "^2.30.0", + "@typescript-eslint/parser": "^2.30.0", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.2", + "ethers": "^5.0.17", + "mocha": "^7.1.2", + "ts-node": "^8.9.1", + "typescript": "^3.8.3" + } + } + +
      + +
      +tsconfig.json + + { + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": [ + "ES2018" + ], + "module": "CommonJS", + "moduleResolution": "node", + "outDir": "dist", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2018" + } + } + +
      + +
      +.gitignore + + node_modules + build + +
      + +
      +.eslintrc.js + + module.exports = { + "env": { + "es6": true + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "sourceType": "module" + }, + "rules": { + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-member-accessibility": [ + "error", + { + "accessibility": "no-public", + "overrides": { + "parameterProperties": "off" + } + } + ], + "@typescript-eslint/indent": [ + "error", + 2, + { + "ArrayExpression": 1, + "CallExpression": { + "arguments": 1 + }, + "FunctionDeclaration": { + "body": 1, + "parameters": 1 + }, + "FunctionExpression": { + "body": 1, + "parameters": 1 + }, + "ImportDeclaration": 1, + "MemberExpression": 1, + "ObjectExpression": 1, + "SwitchCase": 1, + "VariableDeclarator": 1, + "flatTernaryExpressions": false, + "ignoreComments": false, + "outerIIFEBody": 1 + } + ], + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none", + "ignoreRestSiblings": true, + "vars": "all" + } + ], + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-useless-constructor": "error", + "@typescript-eslint/no-var-requires": "warn", + "accessor-pairs": "error", + "array-bracket-spacing": [ + "error", + "never" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-spacing": [ + "error", + "always" + ], + "brace-style": [ + "error", + "1tbs", + { + "allowSingleLine": true + } + ], + "camelcase": "off", + "comma-dangle": [ + "error", + { + "arrays": "never", + "exports": "never", + "functions": "never", + "imports": "never", + "objects": "never" + } + ], + "comma-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "comma-style": [ + "error", + "last" + ], + "computed-property-spacing": [ + "error", + "never" + ], + "constructor-super": "error", + "curly": [ + "error", + "multi-line" + ], + "dot-location": [ + "error", + "property" + ], + "eol-last": "error", + "eqeqeq": [ + "error", + "always", + { + "null": "ignore" + } + ], + "func-call-spacing": [ + "error", + "never" + ], + "generator-star-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "handle-callback-err": [ + "error", + "^(err|error)$" + ], + "import/default": "off", + "import/named": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": false + } + ], + "import/no-unresolved": "off", + "indent": "off", + "key-spacing": [ + "error", + { + "afterColon": true, + "beforeColon": false + } + ], + "keyword-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "linebreak-style": [ + "error", + "unix" + ], + "lines-between-class-members": [ + "error", + "always", + { + "exceptAfterSingleLine": true + } + ], + "max-len": [ + "error", + { + "code": 120 + } + ], + "new-cap": [ + "error", + { + "capIsNew": false, + "newIsCap": true + } + ], + "new-parens": "error", + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-caller": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ], + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-args": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-boolean-cast": "error", + "no-extra-parens": [ + "error", + "functions" + ], + "no-fallthrough": "error", + "no-floating-decimal": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-implied-eval": "error", + "no-inner-declarations": [ + "error", + "functions" + ], + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": [ + "error", + { + "allowLoop": false, + "allowSwitch": false + } + ], + "no-lone-blocks": "error", + "no-misleading-character-class": "error", + "no-mixed-operators": [ + "error", + { + "allowSamePrecedence": true, + "groups": [ + [ + "==", + "!=", + "===", + "!==", + ">", + ">=", + "<", + "<=" + ], + [ + "&&", + "||" + ], + [ + "in", + "instanceof" + ] + ] + } + ], + "no-mixed-spaces-and-tabs": "error", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": [ + "error", + { + "max": 1, + "maxEOF": 0 + } + ], + "no-negated-in-lhs": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-symbol": "error", + "no-new-wrappers": "error", + "no-obj-calls": "error", + "no-octal": "error", + "no-octal-escape": "error", + "no-path-concat": "error", + "no-proto": "error", + "no-prototype-builtins": "error", + "no-redeclare": [ + "error", + { + "builtinGlobals": false + } + ], + "no-regex-spaces": "error", + "no-return-assign": [ + "error", + "except-parens" + ], + "no-return-await": "error", + "no-self-assign": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-this-before-super": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-unexpected-multiline": "error", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": [ + "error", + { + "defaultAssignment": false + } + ], + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "no-use-before-define": [ + "error", + { + "classes": false, + "functions": false, + "variables": false + } + ], + "no-useless-call": "error", + "no-useless-catch": "error", + "no-useless-computed-key": "error", + "no-useless-escape": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-whitespace-before-property": "error", + "no-with": "error", + "object-curly-spacing": [ + "error", + "never" + ], + "object-property-newline": [ + "error", + { + "allowMultiplePropertiesPerLine": true + } + ], + "one-var": [ + "error", + { + "initialized": "never" + } + ], + "operator-linebreak": [ + "error", + "after", + { + "overrides": { + ":": "before", + "?": "before" + } + } + ], + "padded-blocks": [ + "error", + { + "blocks": "never", + "classes": "never", + "switches": "never" + } + ], + "prefer-const": [ + "error", + { + "destructuring": "all" + } + ], + "prefer-promise-reject-errors": "error", + "quote-props": [ + "error", + "as-needed" + ], + "quotes": [ + "error", + "single" + ], + "rest-spread-spacing": [ + "error", + "never" + ], + "semi": [ + "error", + "always" + ], + "semi-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "space-before-blocks": [ + "error", + "always" + ], + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } + ], + "space-in-parens": [ + "error", + "never" + ], + "space-infix-ops": "error", + "space-unary-ops": [ + "error", + { + "nonwords": false, + "words": true + } + ], + "spaced-comment": [ + "error", + "always", + { + "block": { + "balanced": true, + "exceptions": [ + "*" + ], + "markers": [ + "*package", + "!", + ",", + ":", + "::", + "flow-include" + ] + }, + "line": { + "markers": [ + "*package", + "!", + "/", + ",", + "=" + ] + } + } + ], + "symbol-description": "error", + "template-curly-spacing": [ + "error", + "never" + ], + "template-tag-spacing": [ + "error", + "never" + ], + "unicode-bom": [ + "error", + "never" + ], + "use-isnan": "error", + "valid-typeof": [ + "error", + { + "requireStringLiterals": true + } + ], + "wrap-iife": [ + "error", + "any", + { + "functionPrototypeMethods": true + } + ], + "yield-star-spacing": [ + "error", + "both" + ], + "yoda": [ + "error", + "never" + ] + }, + "overrides": [ + { + "files": [ + "test/**/*.ts" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-var-requires": "off", + "no-unused-expressions": "off", + "prefer-promise-reject-errors": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": true + } + ] + } + } + ] + } + +
      + +## Passo #1: Instale o waffle no seu projeto [Link para o documento](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#installation) {#step-1-install-waffle-in-your-project} + +To get started, install `ethereum-waffle`. Neste tutorial, eu usarei `yarn`, então para instalar `ethereum-waffle` executar: + +```bash + yarn add --dev ethereum-waffle +``` + +## Passo #2: Escreva um contrato inteligente [Link para documento](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-a-contract) {#step-2-write-a-smart-contract} + +Neste tutorial, usarei o [ERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/ded2b0a55c9c13731963ab7b85a70c8e73504bab/contracts/token/ERC20/ERC20.sol) token de [OpenZeppelin](https://openzeppelin.com). + +Então, adicione `OpenZeppelin` instalando-o com `yarn`: + +```bash + yarn add @openzeppelin/contracts -D +``` + +Em seguida, crie o contrato `BasicToken.sol` no diretório `src`: + +```solidity +pragma solidity ^0.6.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +// Example class - a mock class using delivering from ERC20 +contract BasicToken is ERC20 { + constructor(uint256 initialBalance) ERC20("Basic", "BSC") public { + _mint(msg.sender, initialBalance); + } +} + +``` + +## Passo #3: Escreva um contrato inteligente [Link para documento](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#compiling-the-contract) {#step-3-compile-your-smart-contract} + +Para compilar seu contrato inteligente, adicione a seguinte entrada no `package.json` do seu projeto: + +```json +{ + "scripts": { + "test": "jest" + } +} +``` + +Além disso, adicione o arquivo `waffle.json` na pasta principal do seu projeto. + +Um exemplo da configuração do `waffle.json`: + +```json +{ + "compilerType": "solcjs", + "compilerVersion": "0.6.2", + "sourceDirectory": "./contracts", + "outputDirectory": "./build" +} +``` + +Leia mais sobre a configuração do Waffle [aqui](https://ethereum-waffle.readthedocs.io/en/latest/configuration.html#configuration). + +Em seguida, execute `yarn build` para compilar seu contrato inteligente. + +Você deve ver que Waffle compilou seu contrato e colocou a saída JSON resultante dentro da pasta `compilação`. + +
      +BasicToken.json + + { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60806040523480156200001157600080fd5b506040516200153938038062001539833981810160405260208110156200003757600080fd5b81019080805190602001909291905050506040518060400160405280600581526020017f42617369630000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42534300000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000cc92919062000389565b508060049080519060200190620000e592919062000389565b506012600560006101000a81548160ff021916908360ff16021790555050506200011633826200011d60201b60201c565b5062000438565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620001d560008383620002fb60201b60201c565b620001f1816002546200030060201b62000f2d1790919060201c565b6002819055506200024f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200030060201b62000f2d1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b6000808284019050838110156200037f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003cc57805160ff1916838001178555620003fd565b82800160010185558215620003fd579182015b82811115620003fc578251825591602001919060010190620003df565b5b5090506200040c919062000410565b5090565b6200043591905b808211156200043157600081600090555060010162000417565b5090565b90565b6110f180620004486000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461025f57806370a08231146102c557806395d89b411461031d578063a457c2d7146103a0578063a9059cbb14610406578063dd62ed3e1461046c576100a9565b806306fdde03146100ae578063095ea7b31461013157806318160ddd1461019757806323b872dd146101b5578063313ce5671461023b575b600080fd5b6100b66104e4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f65780820151818401526020810190506100db565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017d6004803603604081101561014757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610586565b604051808215151515815260200191505060405180910390f35b61019f6105a4565b6040518082815260200191505060405180910390f35b610221600480360360608110156101cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105ae565b604051808215151515815260200191505060405180910390f35b610243610687565b604051808260ff1660ff16815260200191505060405180910390f35b6102ab6004803603604081101561027557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069e565b604051808215151515815260200191505060405180910390f35b610307600480360360208110156102db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610751565b6040518082815260200191505060405180910390f35b610325610799565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036557808201518184015260208101905061034a565b50505050905090810190601f1680156103925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ec600480360360408110156103b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061083b565b604051808215151515815260200191505060405180910390f35b6104526004803603604081101561041c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610908565b604051808215151515815260200191505060405180910390f35b6104ce6004803603604081101561048257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610926565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561057c5780601f106105515761010080835404028352916020019161057c565b820191906000526020600020905b81548152906001019060200180831161055f57829003601f168201915b5050505050905090565b600061059a6105936109ad565b84846109b5565b6001905092915050565b6000600254905090565b60006105bb848484610bac565b61067c846105c76109ad565b6106778560405180606001604052806028815260200161102660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061062d6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006107476106ab6109ad565b8461074285600160006106bc6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6109b5565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b5050505050905090565b60006108fe6108486109ad565b846108f98560405180606001604052806025815260200161109760259139600160006108726109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b6001905092915050565b600061091c6109156109ad565b8484610bac565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806110736024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610fde6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061104e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610fbb6023913960400191505060405180910390fd5b610cc3838383610fb5565b610d2e81604051806060016040528060268152602001611000602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dc1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290610f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610edf578082015181840152602081019050610ec4565b50505050905090810190601f168015610f0c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015610fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122081c840f087cef92feccb03fadc678b2708c331896ec5432b5d4c675f27b6d3e664736f6c63430006020033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1539 CODESIZE SUB DUP1 PUSH3 0x1539 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4261736963000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4253430000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xCC SWAP3 SWAP2 SWAP1 PUSH3 0x389 JUMP JUMPDEST POP DUP1 PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xE5 SWAP3 SWAP2 SWAP1 PUSH3 0x389 JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP POP POP PUSH3 0x116 CALLER DUP3 PUSH3 0x11D PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP PUSH3 0x438 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH3 0x1C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH3 0x1D5 PUSH1 0x0 DUP4 DUP4 PUSH3 0x2FB PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x1F1 DUP2 PUSH1 0x2 SLOAD PUSH3 0x300 PUSH1 0x20 SHL PUSH3 0xF2D OR SWAP1 SWAP2 SWAP1 PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH3 0x24F DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH3 0x300 PUSH1 0x20 SHL PUSH3 0xF2D OR SWAP1 SWAP2 SWAP1 PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH3 0x37F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x3CC JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3FD JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3FD JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3FC JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x3DF JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x40C SWAP2 SWAP1 PUSH3 0x410 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x435 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x431 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x417 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x10F1 DUP1 PUSH3 0x448 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3A0 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x46C JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1B5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x23B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x4E4 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 0xF6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x123 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 PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x586 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x19F PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x221 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2AB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x69E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x307 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x751 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x325 PUSH2 0x799 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 0x365 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x34A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x392 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 PUSH2 0x3EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x83B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x452 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x41C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x908 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4CE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x926 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x57C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x551 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x57C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x55F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x59A PUSH2 0x593 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5BB DUP5 DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH2 0x67C DUP5 PUSH2 0x5C7 PUSH2 0x9AD JUMP JUMPDEST PUSH2 0x677 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1026 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x62D PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x747 PUSH2 0x6AB PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x742 DUP6 PUSH1 0x1 PUSH1 0x0 PUSH2 0x6BC PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x831 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x806 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x831 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x814 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8FE PUSH2 0x848 PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x8F9 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1097 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 PUSH2 0x872 PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x91C PUSH2 0x915 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA3B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1073 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xAC1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFDE PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xC32 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x104E PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xCB8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFBB PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCC3 DUP4 DUP4 DUP4 PUSH2 0xFB5 JUMP JUMPDEST PUSH2 0xD2E DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1000 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xDC1 DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 GT ISZERO DUP3 SWAP1 PUSH2 0xF1A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD 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 0xEDF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEC4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0C 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 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 SUB SWAP1 POP DUP1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0xFAB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20747261 PUSH15 0x736665722066726F6D20746865207A PUSH6 0x726F20616464 PUSH19 0x65737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x735822122081C8 BLOCKHASH CREATE DUP8 0xCE 0xF9 0x2F 0xEC 0xCB SUB STATICCALL 0xDC PUSH8 0x8B2708C331896EC5 NUMBER 0x2B 0x5D 0x4C PUSH8 0x5F27B6D3E664736F PUSH13 0x63430006020033000000000000 ", + "sourceMap": "142:152:5:-:0;;;177:115;8:9:-1;5:2;;;30:1;27;20:12;5:2;177:115:5;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;177:115:5;;;;;;;;;;;;;;;;2013:141:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2093:4;2085:5;:12;;;;;;;;;;;;:::i;:::-;;2117:6;2107:7;:16;;;;;;;;;;;;:::i;:::-;;2145:2;2133:9;;:14;;;;;;;;;;;;;;;;;;2013:141;;252:33:5::1;258:10;270:14;252:5;;;:33;;:::i;:::-;177:115:::0;142:152;;7835:370:2;7937:1;7918:21;;:7;:21;;;;7910:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7986:49;8015:1;8019:7;8028:6;7986:20;;;:49;;:::i;:::-;8061:24;8078:6;8061:12;;:16;;;;;;:24;;;;:::i;:::-;8046:12;:39;;;;8116:30;8139:6;8116:9;:18;8126:7;8116:18;;;;;;;;;;;;;;;;:22;;;;;;:30;;;;:::i;:::-;8095:9;:18;8105:7;8095:18;;;;;;;;;;;;;;;:51;;;;8182:7;8161:37;;8178:1;8161:37;;;8191:6;8161:37;;;;;;;;;;;;;;;;;;7835:370;;:::o;10695:92::-;;;;:::o;874:176:1:-;932:7;951:9;967:1;963;:5;951:17;;991:1;986;:6;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;1035:8;;;874:176;;;;:::o;142:152:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461025f57806370a08231146102c557806395d89b411461031d578063a457c2d7146103a0578063a9059cbb14610406578063dd62ed3e1461046c576100a9565b806306fdde03146100ae578063095ea7b31461013157806318160ddd1461019757806323b872dd146101b5578063313ce5671461023b575b600080fd5b6100b66104e4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f65780820151818401526020810190506100db565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017d6004803603604081101561014757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610586565b604051808215151515815260200191505060405180910390f35b61019f6105a4565b6040518082815260200191505060405180910390f35b610221600480360360608110156101cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105ae565b604051808215151515815260200191505060405180910390f35b610243610687565b604051808260ff1660ff16815260200191505060405180910390f35b6102ab6004803603604081101561027557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069e565b604051808215151515815260200191505060405180910390f35b610307600480360360208110156102db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610751565b6040518082815260200191505060405180910390f35b610325610799565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036557808201518184015260208101905061034a565b50505050905090810190601f1680156103925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ec600480360360408110156103b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061083b565b604051808215151515815260200191505060405180910390f35b6104526004803603604081101561041c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610908565b604051808215151515815260200191505060405180910390f35b6104ce6004803603604081101561048257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610926565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561057c5780601f106105515761010080835404028352916020019161057c565b820191906000526020600020905b81548152906001019060200180831161055f57829003601f168201915b5050505050905090565b600061059a6105936109ad565b84846109b5565b6001905092915050565b6000600254905090565b60006105bb848484610bac565b61067c846105c76109ad565b6106778560405180606001604052806028815260200161102660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061062d6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006107476106ab6109ad565b8461074285600160006106bc6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6109b5565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b5050505050905090565b60006108fe6108486109ad565b846108f98560405180606001604052806025815260200161109760259139600160006108726109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b6001905092915050565b600061091c6109156109ad565b8484610bac565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806110736024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610fde6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061104e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610fbb6023913960400191505060405180910390fd5b610cc3838383610fb5565b610d2e81604051806060016040528060268152602001611000602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dc1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290610f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610edf578082015181840152602081019050610ec4565b50505050905090810190601f168015610f0c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015610fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122081c840f087cef92feccb03fadc678b2708c331896ec5432b5d4c675f27b6d3e664736f6c63430006020033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3A0 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x46C JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1B5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x23B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x4E4 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 0xF6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x123 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 PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x586 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x19F PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x221 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2AB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x69E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x307 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x751 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x325 PUSH2 0x799 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 0x365 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x34A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x392 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 PUSH2 0x3EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x83B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x452 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x41C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x908 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4CE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x926 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x57C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x551 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x57C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x55F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x59A PUSH2 0x593 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5BB DUP5 DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH2 0x67C DUP5 PUSH2 0x5C7 PUSH2 0x9AD JUMP JUMPDEST PUSH2 0x677 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1026 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x62D PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x747 PUSH2 0x6AB PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x742 DUP6 PUSH1 0x1 PUSH1 0x0 PUSH2 0x6BC PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x831 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x806 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x831 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x814 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8FE PUSH2 0x848 PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x8F9 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1097 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 PUSH2 0x872 PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x91C PUSH2 0x915 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA3B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1073 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xAC1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFDE PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xC32 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x104E PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xCB8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFBB PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCC3 DUP4 DUP4 DUP4 PUSH2 0xFB5 JUMP JUMPDEST PUSH2 0xD2E DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1000 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xDC1 DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 GT ISZERO DUP3 SWAP1 PUSH2 0xF1A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD 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 0xEDF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEC4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0C 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 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 SUB SWAP1 P + +
      + +## Passo #4: Escreva um contrato inteligente [Link para documento](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) {#step-4-test-your-smart-contract} + +### Passo #4.1: Instale o waffle no seu projeto [Link para o documento](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) {#step-4-1} + +Depois de criarmos com sucesso um Contrato Inteligente, podemos testá-lo. Vamos usar o `Waffle` para fazer isso. + +Os testes em `Waffle` são escritos usando `Mocha` juntamente com `Chai`. Podemos usar um ambiente de teste diferente mas `Waffle` matchers só trabalham com `Chai`. + +Então, precisamos adicionar `Chai` a nossas dependências : + +```bash + yarn add --dev mocha chai +``` + +### Passo #4.2: Escreva um contrato inteligente [Link para documento](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) {#step-4-2} + +Para escrever nosso teste precisamos criar o arquivo `BasicToken.test.ts` em nosso diretório de teste. + +```ts +import { expect, use } from "chai" +import { Contract } from "ethers" +import { deployContract, MockProvider, solidity } from "ethereum-waffle" +import BasicToken from "../build/BasicToken.json" + +use(solidity) + +describe("BasicToken", () => { + const [wallet, walletTo] = new MockProvider().getWallets() + let token: Contract + + beforeEach(async () => { + token = await deployContract(wallet, BasicToken, [1000]) + }) +}) +``` + +Então, usamos o `deployContract` método de `Waffle`para publicar nosso token. Como argumentos, devemos passar a carteira ``, o arquivo json compilado de nosso contrato e saldo padrão. + +`Waffle` também nos permite criar uma `carteira`, o que facilita a implantação de um contrato. + +Você pode ler mais sobre a `carteira` [aqui](https://ethereum-waffle.readthedocs.io/en/latest/basic-testing.html?highlight=wallet#getting-wallets) e pode ler mais sobre a função de implantação [aqui](https://ethereum-waffle.readthedocs.io/en/latest/basic-testing.html?highlight=wallet#deploying-contracts). + +Vamos escrever um teste simples para verificar o saldo da nossa carteira. Desde que enviamos o valor 1000 durante a implantação do nosso contrato, o saldo de nossa carteira deve ser 1000 tokens, que podemos fazer check-in no primeiro teste. + +```ts +it("Assigns initial balance", async () => { + expect(await token.balanceOf(wallet.address)).to.equal(1000) +}) +``` + +Para executar o teste, use `yarn test` + +### Passo #4.3 Emitindo eventos [Link para o documento](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html?highlight=changeBalance#emitting-events) {#step-4-3} + +Neste tutorial, eu quero mostrar a você as correspondências mais úteis do `Waffle`, então vamos começar com o primeiro. + +`Waffle` nos permite testar quais eventos foram emitidos. + +Neste tutorial, vou testar o método de `transfer` do nosso contrato. + +Neste teste, farei uma transferência de uma carteira para outra e verificarei se o evento `transfer` foi chamado. + +```ts +it("Transfer emits event", async () => { + await expect(token.transfer(walletTo.address, 7)) + .to.emit(token, "Transfer") + .withArgs(wallet.address, walletTo.address, 7) +}) +``` + +Além disso, uma grande vantagem desse "matcher" é que podemos verificar com quais argumentos este evento foi chamado adicionando `withArgs` ao teste. + +Isso permitir-nos-á ter a certeza de que a nossa função está a ser chamada corretamente! + +### Passo #4.4 Emitindo eventos [Link para o documento](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html?highlight=changeBalance#revert-with-message) {#step-4-4} + +`Waffle` nos permite testar quais eventos foram emitidos. + +Usaremos `revertedWith` "matcher" em nosso teste para verificar. + +Podemos escrever um teste no qual realizaremos uma transferência por um valor maior do que o que fizemos na nossa carteira. E então verificaremos se a transação reverteu com a mensagem exata! + +```ts +it("Can not transfer above the amount", async () => { + await expect(token.transfer(walletTo.address, 1007)).to.be.revertedWith( + "VM Exception while processing transaction: revert ERC20: transfer amount exceeds balance" + ) +}) +``` + +### Passo #4.5 Emitindo eventos [Link para o documento](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html?highlight=changeBalance#change-balance) {#step-4-5} + +`Waffle` nos permite verificar se há mudanças nos saldos das carteiras! + +Podemos usar o matcher `changeTokenBalance` para verificar a mudança do saldo ou o `changeTokenBalances` para uma conta múltipla. + +O matcher pode aceitar `números`, `strings` e `BigNumbers` como uma alteração de saldo, enquanto o endereço deve ser especificado como uma carteira ou um contrato. + +Vamos escrever o próximo teste: + +```ts +it("Send transaction changes receiver balance", async () => { + await expect(() => + wallet.sendTransaction({ to: walletTo.address, gasPrice: 0, value: 200 }) + ).to.changeBalance(walletTo, 200) +}) +``` + +O teste acima é um teste para uma única carteira. + +E a próxima para múltiplas carteiras: + +```ts +it("Send transaction changes receiver balance", async () => { + await expect(() => + wallet.sendTransaction({ to: walletTo.address, gasPrice: 0, value: 200 }) + ).to.changeBalance(walletTo, 200) +}) +``` + +A transação é esperada para ser passada como um callback (precisamos verificar o saldo antes da chamada) ou como uma resposta de transação. + +## Parabéns {#congratulations} + +**Parabéns! Você o fez através do meu tutorial. Você deu o seu primeiro grande passo para testar contratos inteligentes com Waffle.** + +**O código deste tutorial que você pode encontrar [aqui](https://github.com/VladStarostenko/tutorial-for-ethereum-org-website).** + +**Mais documentação sobre `Waffle` disponível [aqui](https://getwaffle.io).** diff --git a/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md new file mode 100644 index 00000000000..d87753ec150 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -0,0 +1,313 @@ +--- +title: "The Graph: Consertando a consulta de dados da Web3" +description: Blockchain é como um banco de dados, mas sem SQL. Todos os dados estão lá, mas não há maneira de acessá-los. Deixe-me mostrar a você como consertar isso com The Graph e GraphQL. +author: Markus Waas +lang: pt-br +tags: + - "solidez" + - "smart contracts" + - "consultando" + - "the Graph" + - "create-eth-app" + - "react" +skill: intermediate +published: 2020-09-06 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/thegraph +--- + +Dessa vez, daremos uma olhada mais de perto no The Graph que essencialmente se tornou parte do stack padrão para o desenvolvimento de Dapps no último ano. Primeiro, vamos ver como faríamos as coisas da maneira tradicional... + +## Sem The Graph... {#without-the-graph} + +Então vamos começar com um exemplo simples para propósitos ilustrativos. Todos nós gostamos de jogos, então imagine um jogo simples com os usuários fazendo apostas: + +```solidity +pragma solidity 0.7.1; + +contract Game { + uint256 totalGamesPlayerWon = 0; + uint256 totalGamesPlayerLost = 0; + event BetPlaced(address player, uint256 value, bool hasWon); + + function placeBet() external payable { + bool hasWon = evaluateBetForPlayer(msg.sender); + + if (hasWon) { + (bool success, ) = msg.sender.call{ value: msg.value * 2 }(''); + require(success, "Transfer failed"); + totalGamesPlayerWon++; + } else { + totalGamesPlayerLost++; + } + + emit BetPlaced(msg.sender, msg.value, hasWon); + } +} +``` + +Agora, digamos em nosso dapp, queremos exibir as apostas totais, os jogos perdidos/ganhos e também atualizá-lo sempre que alguém jogar novamente. A abordagem seria: + +1. Busca `totalGamesPlayerWon`. +2. Busca `totalGamesPlayerWon`. +3. Inscreva-se nos eventos `BetPlaced`. + +Nós podemos escutar [evento na Web3](https://docs.web3js.org/api/web3/class/Contract#events) como mostrado à direita, mas isso requer manipular alguns casos. + +```solidity +AmeContract.events.BetPlaced({ + fromBlock: 0 +}, function(error, event) { console.log(event); }) +.on('data', function(event) { + // event fired +}) +.on('changed', function(event) { + // event was removed again +}) +.on('error', function(error, receipt) { + // tx rejected +}); +``` + +Por hora está de bom tamanho nosso simples exemplo. Mas digamos que queremos exibir as quantidades das apostas perdidas/ganhas apenas para o jogador atual. Se estivermos sem sorte, você pode implantar um novo contrato que armazena esses valores e busca. E agora imagine um contrato inteligente e um Dapp muito mais complicados. As coisas podem ficar confusas rapidamente. + +![Não basta uma simples consulta](./one-does-not-simply-query.jpg) + +Você pode ver que isso não é ideal: + +- Não funciona para contratos já implementados. +- Custos de gas adicionais para armazenar esses valores. +- Requer outra chamada para obter os dados para um nó Ethereum. + +![Não é bom o suficiente](./not-good-enough.jpg) + +Agora vamos ver uma solução melhor. + +## Deixe-me apresentá-lo ao GraphQL {#let-me-introduce-to-you-graphql} + +Primeiro, vamos falar sobre GraphQL, originalmente projetado e implementado pelo Facebook. Você deve estar familiarizado com o modelo tradicional da Rest API. Agora imagine que você poderia escrever uma consulta para exatamente os dados que você queria: + +![GraphQL API vs. REST API](./graphql.jpg) + + + +As duas imagens capturam praticamente a essência do GraphQL. Com a consulta à direita, podemos definir exactamente quais os dados que queremos, assim aí temos tudo ao alcance e nada mais do que aquilo de que precisamos. Um servidor GraphQL lida com a busca de todos os dados necessários, então é incrivelmente fácil para o lado frontend do consumidor. [Esta é uma bela explicação](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) de como exatamente o servidor lida com uma consulta se estiver interessado. + +Agora com esse conhecimento, vamos finalmente adentrar o espaço da blockchain e The Graph. + +## O que é The Graph? {#what-is-the-graph} + +Um blockchain é um banco de dados descentralizado, mas em contraste com o que é geralmente o caso, nós não temos uma linguagem de consulta para esse banco de dados. Soluções para a obtenção de dados são dolorosas ou completamente impossíveis. The Graph é um protocolo descentralizado para indexação e consulta de dados da blockchain. E você pode ter adivinhado, ele está usando GraphQL como idioma de consulta. + +![The Graph](./thegraph.png) + +Os exemplos são sempre os melhores para entender algo, então vamos usar The Graph para o nosso exemplo de GameContract. + +## Como criar um Subgraph {#how-to-create-a-subgraph} + +A definição de como indexar dados é chamada de subgráfico. Requer três componentes: + +1. Manifesto (`subgraph.yaml`) +2. Esquema (`schema.graphql`) +3. Mapping (`mapping.ts`) + +### Manifesto (`subgraph.yaml`) {#manifest} + +O manifesto é nosso arquivo de configuração e define: + +- que contratos inteligentes indexar (endereço, rede, ABI...) +- quais eventos ouvir +- outras coisas para ouvir como chamadas de função ou blocos +- as fnções de mapping sendo chamadas (conferir `mapping.ts` below) + +Aqui você pode definir vários contratos e manipuladores. Uma configuração típica teria uma pasta de subgráfico dentro do projeto Truffle/Hardhat com seu próprio repositório. Então você pode facilmente se referir ao ABI. + +Por conveniência você também pode querer usar uma ferramenta modelo tipo um bigode. Em seguida, você cria um `subgraph.template.yaml` e insere os endereços com base nas mais recentes implantações. Para uma configuração de exemplo mais avançada, veja, por exemplo, o [repositório de subgráfico Aave](https://github.com/aave/aave-protocol/tree/master/thegraph). + +E a documentação completa pode ser vista [aqui](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest). + +```yaml +specVersion: 0.0.1 +description: Placing Bets on Ethereum +repository: - GitHub link - +schema: + file: ./schema.graphql +dataSources: + - kind: ethereum/contract + name: GameContract + network: mainnet + source: + address: '0x2E6454...cf77eC' + abi: GameContract + startBlock: 6175244 + mapping: + kind: ethereum/events + apiVersion: 0.0.1 + language: wasm/assemblyscript + entities: + - GameContract + abis: + - name: GameContract + file: ../build/contracts/GameContract.json + eventHandlers: + - event: PlacedBet(address,uint256,bool) + handler: handleNewBet + file: ./src/mapping.ts +``` + +### Esquema (`schema.graphql`) {#schema} + +O esquema é a definição de dados do GraphQL. Permitirá que você defina quais entidades existem e seus tipos. Tipos suportados do The Graph são + +- Bytes +- ID +- String +- Booleano +- Int +- BigInt +- BigDecimal + +Você também pode usar entidades como tipo para definir relações. No nosso exemplo, definimos uma relação entre 1 e muitos entre jogadores e apostas. O ! significa que o valor não pode ser vazio. A documentação completa pode ser vista [aqui](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest). + +```graphql +type Bet @entity { + id: ID! + player: Player! + playerHasWon: Boolean! + time: Int! +} + +type Player @entity { + id: ID! + totalPlayedCount: Int + hasWonCount: Int + hasLostCount: Int + bets: [Bet]! +} +``` + +### Mapping (`mapping.ts`) {#mapping} + +O arquivo de mapeamento no The Graph define nossas funções que transformam eventos recebidos em entidades. É escrito em AssemblyScript, um subconjunto de Typescript. Isto significa que pode ser compilado em WASM (WebAssembly) para uma execução mais eficiente e portátil do mapeamento. + +Você precisará definir cada função nomeada no arquivo `subgraph.yaml`, portanto, no nosso caso, precisamos apenas uma: `handleNewBet`. Primeiro, tentamos carregar a entidade Jogador a partir do endereço do remetente como id. Se não existir, nós criamos uma nova entidade e a preenchemos com os valores iniciais. + +Em seguida, criamos uma nova entidade Bet. O ID para isso sempre `event.transaction.hash.toHex() + "-" + event.logIndex.toString()` garantirá um valor exclusivo. Usar somente o hash não é o suficiente porque alguém pode chamar a função placeBet várias vezes em uma transação através de um contrato inteligente. + +Finalmente, nós podemos atualizar a entidade "Player" com todos os dados. Arrays não podem ser empurrados diretamente, mas precisam ser atualizados como mostrado aqui. Usamos o id para fazer referência à aposta. E `.save()` é necessário no final para armazenar uma entidade. + +A documentação completa pode ser vista aqui: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Você também pode adicionar a saída do log ao arquivo de mapeamento, consultando [aqui](https://thegraph.com/docs/assemblyscript-api#api-reference). + +```typescript +import { Bet, Player } from "../generated/schema" +import { PlacedBet } from "../generated/GameContract/GameContract" + +export function handleNewBet(event: PlacedBet): void { + let player = Player.load(event.transaction.from.toHex()) + + if (player == null) { + // create if doesn't exist yet + player = new Player(event.transaction.from.toHex()) + player.bets = new Array(0) + player.totalPlayedCount = 0 + player.hasWonCount = 0 + player.hasLostCount = 0 + } + + let bet = new Bet( + event.transaction.hash.toHex() + "-" + event.logIndex.toString() + ) + bet.player = player.id + bet.playerHasWon = event.params.hasWon + bet.time = event.block.timestamp + bet.save() + + player.totalPlayedCount++ + if (event.params.hasWon) { + player.hasWonCount++ + } else { + player.hasLostCount++ + } + + // update array like this + let bets = player.bets + bets.push(bet.id) + player.bets = bets + + player.save() +} +``` + +## Usando isso no Frontend {#using-it-in-the-frontend} + +Usando algo como Apollo Boost, você pode facilmente integrar o The Graph em seu React Dapp (ou Apollo-Vue). Especialmente ao usar React hooks e Apollo, buscar dados é tão simples quanto escrever uma única consulta GraphQl no seu componente. Uma típica configuração pode se parecer com isso: + +```javascript +// See all subgraphs: https://thegraph.com/explorer/ +const client = new ApolloClient({ + uri: "{{ subgraphUrl }}", +}) + +ReactDOM.render( + + + , + document.getElementById("root") +) +``` + +E agora podemos escrever, por exemplo, uma consulta como esta. Isso vai nos ajudar + +- quantas vezes o usuário atual ganhou +- quantas vezes o usuário atual perdeu +- uma lista de horários com todas as suas apostas anteriores + +Tudo em um único pedido para o servidor do GraphQL. + +```javascript +const myGraphQlQuery = gql` + players(where: { id: $currentUser }) { + totalPlayedCount + hasWonCount + hasLostCount + bets { + time + } + } +` + +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +![Magic](./magic.jpg) + +Mas precisamos de uma última peça do quebra-cabeças: o servidor. Você pode também executá-lo por conta própria ou usar o serviço hospedado. + +## Servidor The Graph {#the-graph-server} + +### Graph Explorer: o serviço hospedado {#graph-explorer-the-hosted-service} + +O jeito mais fácil é usar o serviço hospedado. Siga as instruções [aqui](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/) para publicar um subgráfico. Para muitos projetos, você pode encontrar subgrafos existentes no [explorer](https://thegraph.com/explorer/). + +![O Graph-Explorer](./thegraph-explorer.png) + +### Executando seu próprio nó {#running-your-own-node} + +Como alternativa, você pode executar seu próprio nó. Documentação [aqui](https://github.com/graphprotocol/graph-node#quick-start). Uma das razões para isso: você pode estar usando uma rede não suportada pelo serviço hospedado. As redes que contam atualmente com suporte [podem ser encontradas aqui](https://thegraph.com/docs/en/developing/supported-networks/). + +## O futuro descentralizado {#the-decentralized-future} + +GraphQL também suporta streams para os próximos eventos. Elas tem suporte no grafo por meio de [Subfluxos](https://thegraph.com/docs/en/substreams/), que se encontram atualmente em versão beta de código aberto. + +Em [2021](https://thegraph.com/blog/mainnet-migration/) O Grafo iniciou sua transição para uma rede de indexação descentralizada. Leia mais sobre a arquitetura dessa rede de indexação descentralizada [aqui](https://thegraph.com/docs/en/network/explorer/). + +Dois aspectos fundamentais são: + +1. Os usuários pagam aos indexadores pelas perguntas. +2. Os indexadores fazem stake dos Graph Tokens (GRT). diff --git a/public/content/translations/pt-br/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/pt-br/developers/tutorials/token-integration-checklist/index.md new file mode 100644 index 00000000000..e8b891a158a --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/token-integration-checklist/index.md @@ -0,0 +1,84 @@ +--- +title: Checklist de integração do token +description: Uma lista de coisas a considerar ao interagir com tokens +author: "Trailofbits" +lang: pt-br +tags: + - "solidity" + - "contratos inteligentes" + - "segurança" + - "tokens" +skill: intermediate +published: 2020-08-13 +source: Construindo contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md +--- + +Siga este checklist ao interagir com tokens arbitrários. Certifique-se de que você entende os riscos associados a cada item e justifique qualquer exceção a essas regras. + +Por conveniência, todos os [utilitários](https://github.com/crytic/slither#tools) do Slither podem ser executados diretamente em um endereço de token, como: + +[Usando Tutorial do Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) + +```bash +slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken +``` + +Para seguir esta lista de verificação, você vai querer ter essa saída do Slither para o token: + +```bash +- slither-check-erc [target] [contractName] [optional: --erc ERC_NUMBER] +- slither [target] --print human-summary +- slither [target] --print contract-summary +- slither-prop . --contract ContractName # requer configuração, e uso de Echidna e Manticore +``` + +## Considerações gerais {#general-considerations} + +- **O contrato tem uma revisão de segurança.** Evite interagir com contratos que não tenham uma revisão de segurança. Verifique a duração da avaliação (também conhecida como "nível de esforço"), a reputação da empresa de segurança e o número e a gravidade das descobertas. +- **Você entrou em contato com os desenvolvedores.** Talvez você precise alertar sua equipe para um incidente. Procure por contatos apropriados em [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts). +- **Eles têm uma lista de e-mails de segurança para anúncios críticos.** Sua equipe deve aconselhar usuários (como você!) quando são encontrados problemas críticos ou quando ocorrem atualizações. + +## Conformidade do ERC {#erc-conformity} + +O Slither inclui um utilitário, [slither-check-erc](https://github.com/crytic/slither/wiki/ERC-Conformance), que analisa a conformidade de um token com vários padrões de ERC relacionados. Use slither-check-erc para revisar que: + +- **Transfer e transferFrom retornam um booleano.** Vários tokens não retornam um booleano nessas funções. Como resultado, suas chamadas no contrato podem falhar. +- **As funções "name", "decimals" e "symbol" estão presentes se usados.** Essas funções são opcionais no padrão do ERC20 e podem não estar presentes. +- **"Decimals" retorna um uint8.** Vários tokens retornam uma uint256 incorretamente. Se este for o caso, certifique-se de que o valor retornado é inferior a 255. +- **O token mitiga a conhecida condição de corrida do [ERC20](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729).** O padrão ERC20 possui uma condição de corrida conhecida do ERC20 que deve ser mitigada para evitar que invasores roubem tokens. +- **O token não é um token ERC777 e não tem nenhuma chamada de função externa na "transfer" e "transferFrom".** Chamadas externas nas funções de transferência podem levar a reentradas. + +O Slither inclui um utilitário, [slither-prop](https://github.com/crytic/slither/wiki/Property-generation), que gera testes unitários e propriedades de segurança que podem descobrir muitas falhas comuns do ERC. Use slither-check-erc para revisar que: + +- **O contrato passa em todos os testes unitários e propriedades de segurança do slither-prop.** Execute os testes unitários gerados e então verifique as propriedades com [Echidna](https://github.com/crytic/echidna) e [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). + +Por último, há certas características que são difíceis de identificar automaticamente. Revisão destas condições manualmente: + +- **"Transfer" e "transferFrom" não devem cobrar taxas.** Os tokens deflacionários podem levar a um comportamento inesperado. +- **Os potenciais juros obtidos com os token são retirados da conta.** Alguns tokens distribuem juros para os titulares (holders) de tokens. Estes juros podem estar atados ao contrato caso não tenham sido retirados da conta. + +## Composição do contrato {#contract-composition} + +- **O contrato evita a complexidade desnecessária.** O token deve ser um contrato simples; um token com código complexo requer um padrão de revisão mais alto. Use o [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#human-summary) do Slither para identificar um código complexo. +- **O contrato usa SafeMath.** Contratos que não usam SafeMath requerem um padrão de revisão mais elevado. Inspecione o contrato manualmente para uso de SafeMath. +- **O contrato tem apenas algumas funções "non–token-related".** Funções "non–token-related" aumentam a probabilidade de ocorrência de problemas no contrato. Use o [contract-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) do Slither para revisar amplamente o código usado no contrato. +- **O token tem apenas um endereço.** Tokens com vários pontos de entrada para atualizações de saldo podem quebrar a contabilidade interna com base no endereço (Ex.: `balances[token_address][msg.sender]` pode não refletir o saldo atual). + +## Privilégios do proprietário {#owner-privileges} + +- **O token não é atualizável.** Contratos atualizáveis podem mudar suas regras ao longo do tempo. Use a impressora de [resumo-humano do Slither](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) para identificar um código complexo. +- **O proprietário tem capacidades limitadas de cunhagem.** Os proprietários maliciosos ou comprometidos podem abusar das capacidades de cunhagem. Use a impressora [de resumo humano do Sliter](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) para revisar as capacidades de cunhagem e considere revisar manualmente o código. +- **O token não é pausável.** Os proprietários maliciosos ou comprometidos podem capturar contratos que dependem de tokens pausáveis. Identifique o código pauseável à mão. +- **O proprietário não pode bloquear o contrato.** Donos maliciosos ou comprometidos podem prender contratos dependendo de tokens com uma lista negra. Identifique os recursos da lista negra à mão. +- **A equipe por trás do token é conhecida e pode ser considerada responsável por abusos.** Contratos com equipes de desenvolvimento anônimas, ou que residam em abrigos legais devem exigir um padrão de revisão mais elevado. + +## Escassez de token {#token-scarcity} + +Revisões de problemas de escassez de tokens requerem revisão manual. Verifique estas condições: + +- **Nenhum usuário é dono da maior parte do abastecimento.** Se alguns usuários possuem a maioria dos tokens, eles podem influenciar operações baseadas na repartição do token. +- **A oferta total é suficiente.** Tokens com uma oferta baixa podem ser facilmente manipulados. +- **Os tokens estão localizados em mais de algumas trocas.** Se todos os tokens estiverem em uma troca, um compromisso da troca pode comprometer o contrato que depende do token. +- **Os usuários entendem os riscos associados a grandes fundos ou flash loans.** Contratos que dependem do saldo do token devem levar cuidadosamente em consideração ataques com grandes fundos ou ataques por meio de flash loans. +- **O token não permite flash minting**. O "Flash minting" pode levar a oscilações substanciais na balança e no fornecimento total, o que exige verificações de overflow rigorosas e abrangentes na operação do token. diff --git a/public/content/translations/pt-br/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md index 64d2f3820c0..6426998c4ea 100644 --- a/public/content/translations/pt-br/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md @@ -6,7 +6,6 @@ tags: - "contratos inteligentes" - "tokens" - "solidity" - - "introdução" - "erc-20" skill: intermediate lang: pt-br @@ -18,7 +17,7 @@ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" No tutorial anterior, estudamos [a estrutura de um token ERC-20 no Solidity](/developers/tutorials/understand-the-erc-20-token-smart-contract/)usado na blockchain Ethereum. Nesse artigo, veremos como usar um contrato inteligente para interagir com um token usando a linguagem Solidity. -Para esse contrato inteligente, vamos criar uma troca descentralizada realmente robusta na qual o usuário pode negociar o Ethereum com o nosso recém-implantado [token ERC-20](/developers/docs/standards/tokens/erc-20/). +Para este contrato inteligente, nós criaremos uma corretora descentralizada realmente fictícia, na qual um usuário pode trocar ether por nosso [token ERC-20](/developers/docs/standards/tokens/erc-20/) recém-implantado. Para este tutorial, usaremos o código que escrevemos no tutorial anterior como uma base. Nosso DEX instanciará um contrato em seu construtor e realizará as operações de: @@ -141,7 +140,7 @@ Vamos programar a função de compra. Primeiro, precisaremos verificar a quantid Observe que, se chamarmos a função `require` em caso de um erro, o ether enviado será diretamente revertido e retornado para o usuário. -To keep things simple, we just exchange 1 token for 1 Wei. +Para simplificar, apenas trocamos 1 "token" por 1 "Wei". ```solidity function buy() payable public { @@ -160,7 +159,7 @@ No caso de a compra ser bem-sucedida, devemos ver dois eventos na transação: o ## A função de venda {#the-sell-function} -A função responsável pela venda primeiro exigirá que o usuário tenha aprovado o valor, chamando a função approve antecipadamente. Approving the transfer requires the ERC20Basic token instantiated by the DEX to be called by the user. This can be achieved by first calling the DEX contract's `token()` function to retrieve the address where DEX deployed the ERC20Basic contract called `token`. Then we create an instance of that contract in our session and call its `approve` function. Then we are able to call the DEX's `sell` function and swap our tokens back for ether. For example, this is how this looks in an interactive brownie session: +A função responsável pela venda primeiro exigirá que o usuário tenha aprovado o valor, chamando a função `approve` antecipadamente. Aprovar a transferência requer que o token ERC20Basic instanciado pelo DEX seja chamado pelo usuário. Isso pode ser feito chamando a função `token()` do contrato da DEX para recuperar o endereço onde a DEX implantou o contrato ERC20Basic chamado `token`. Em seguida, criamos uma instância desse contrato em nossa sessão e chamamos sua função `approve`. Então podemos chamar a função `sell` da DEX e trocar nossos tokens de volta por ether. Por exemplo, é assim que fica em uma sessão interativa usando brownie: ```python #### Python in interactive brownie console... @@ -184,7 +183,7 @@ token.approve(dex.address, 3e18, {'from':account2}) ``` -Então quando a função `sell` é chamada, verificamos se a transferência do endereço do remetente para o endereço do contrato foi bem-sucedida e depois enviamos os Ethers para o endereço de chamada. +Então quando a função sell é chamada, verificamos se a transferência do endereço do remetente para o endereço do contrato foi bem-sucedida e depois enviamos os Ethers para o endereço de chamada. ```solidity function sell(uint256 amount) public { @@ -197,7 +196,7 @@ function sell(uint256 amount) public { } ``` -Se tudo funcionar, você deve ver 2 eventos (um `Transfer` e `Sold`) na transação, e o seu saldo de token e saldo de Ethereum atualizados. +Se tudo funcionar, você deverá ver 2 eventos (uma `Transferência` e `Vendido`) na transação e seu saldo de token e saldo de ether atualizados. ![Dois eventos na transação: transferência e venda](./transfer-and-sold-events.png) @@ -205,7 +204,7 @@ Se tudo funcionar, você deve ver 2 eventos (um `Transfer` e `Sold`) na transaç Neste tutorial, vimos como verificar o saldo e a dedução de um token ERC-20 e também como chamar a `Transfer` e `TransferFrom` de um contrato inteligente ERC20 usando a interface. -Once you make a transaction we have a JavaScript tutorial to [wait and get details about the transactions](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/) that were made to your contract and a [tutorial to decode events generated by token transfers or any other events](https://ethereumdev.io/how-to-decode-event-logs-in-javascript-using-abi-decoder/) as long as you have the ABI. +Uma vez feita a transação, temos um tutorial JavaScript [esperando e pegando detalhes de uma transação](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/) feitas para seu contrato e um [tutorial para decodificar eventos gerados em transferências de tokens e outros eventos](https://ethereumdev.io/how-to-decode-event-logs-in-javascript-using-abi-decoder/) desde que você tenha um ABI. Aqui está o código completo para o tutorial: diff --git a/public/content/translations/pt-br/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md index 2c7b488b713..655f1f643c2 100644 --- a/public/content/translations/pt-br/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/understand-the-erc-20-token-smart-contract/index.md @@ -7,7 +7,7 @@ tags: - "tokens" - "solidity" - "erc-20" -skill: beginner +skill: intermediate lang: pt-br published: 2020-04-05 source: EthereumDev diff --git a/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md index b49ae45db1a..abb2688c1cb 100644 --- a/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -202,13 +202,13 @@ A forma como o par de troca decide sobre a taxa de câmbio entre o token0 e o to Veja um exemplo. Note que para manter a simplicidade a tabela mostra apenas três dígitos após a vírgula decimal e ignoramos a taxa de negociação de 0,3%, portanto os números não são precisos. | Evento | reserve0 | reserve1 | reserve0 \* reserve1 | Taxa de câmbio média (token1 / token0) | -| ------------------------------------------- | --------: | --------: | -------------------: | -------------------------------------- | -| Configuração Inicial | 1.000,000 | 1.000,000 | 1.000.000 | | -| Trader A troca 50 token0 por 47,619 token1 | 1.050,000 | 952,381 | 1.000.000 | 0,952 | -| Trader B troca 10 token0 por 8,984 token1 | 1.060,000 | 943,396 | 1.000.000 | 0,898 | -| Trader C troca 40 token0 por 34,305 token1 | 1.100,000 | 909,090 | 1.000.000 | 0,858 | -| Trader D troca 100 token1 por 109,01 token0 | 990,990 | 1.009,090 | 1.000.000 | 0,917 | -| Trader E troca 10 token0 por 10,079 token1 | 1.000,990 | 999,010 | 1.000.000 | 1,008 | +| ------------------------------------------- | ---------:| ---------:| ----------------------:| -------------------------------------- | +| Configuração Inicial | 1.000,000 | 1.000,000 | 1.000.000 | | +| Trader A troca 50 token0 por 47,619 token1 | 1.050,000 | 952,381 | 1.000.000 | 0,952 | +| Trader B troca 10 token0 por 8,984 token1 | 1.060,000 | 943,396 | 1.000.000 | 0,898 | +| Trader C troca 40 token0 por 34,305 token1 | 1.100,000 | 909,090 | 1.000.000 | 0,858 | +| Trader D troca 100 token1 por 109,01 token0 | 990,990 | 1.009,090 | 1.000.000 | 0,917 | +| Trader E troca 10 token0 por 10,079 token1 | 1.000,990 | 999,010 | 1.000.000 | 1,008 | À medida que os traders fornecem mais token0, o valor relativo do token1 aumenta, e vice-versa, baseado na oferta e na demanda. @@ -362,12 +362,12 @@ Se o tempo decorrido não for zero, isso significa que somos a primeira transaç } ``` -Cada acumulador de custo é atualizado com o último custo (reserva do outro token/reserva desse token) vezes o tempo decorrido em segundos. Para obter um preço médio, deve-se ler o preço cumulativo de dois pontos no tempo e dividir pela diferença de tempo entre eles. Por exemplo, suponha esta sequência de eventos: +Cada acumulador de custo é atualizado com o último custo (reserva do outro token/reserva desse token) vezes o tempo decorrido em segundos. Para obter um preço médio, tome o preço acumulado em dois pontos no tempo e divida-o pela diferença de tempo entre eles. Por exemplo, suponha esta sequência de eventos: -| Evento | reserva0 | reserva1 | carimbo de data/hora | Taxa de câmbio marginal (reserve1 / reserve0) | price0CumulativeLast | -| ----------------------------------------------------- | --------: | --------: | -------------------- | --------------------------------------------: | -------------------------: | -| Configuração Inicial | 1.000,000 | 1.000,000 | 5.000 | 1.000 | 0 | -| Trader A deposita 50 token0 e recebe 47,619 token1 | 1.050,000 | 952,381 | 5.020 | 0,907 | 20 | +| Evento | reserva0 | reserva1 | carimbo de data/hora | Taxa de câmbio marginal (reserve1 / reserve0) | price0CumulativeLast | +| ----------------------------------------------------- | ---------:| ---------:| -------------------- | ---------------------------------------------:| ----------------------------:| +| Configuração Inicial | 1.000,000 | 1.000,000 | 5.000 | 1.000 | 0 | +| Trader A deposita 50 token0 e recebe 47,619 token1 | 1.050,000 | 952,381 | 5.020 | 0,907 | 20 | | Trader B deposita 10 token0 e recebe 8,984 token1 | 1.060,000 | 943,396 | 5.030 | 0,890 | 20+10\*0,907 = 29,07 | | Trader C deposita 40 token0 e recebe 34,305 token1 | 1.100,000 | 909,090 | 5.100 | 0,826 | 29,07+70\*0,890 = 91,37 | | Trader D deposita 100 token1 e recupera 109,01 token0 | 990,990 | 1.009,090 | 5.110 | 1.018 | 91,37+10\*0,826 = 99,63 | @@ -499,9 +499,9 @@ No momento do primeiro depósito, não sabemos o valor relativo dos dois tokens, Podemos confiar nisso, pois é do interesse do depositante oferecer o mesmo valor para evitar perda de valor por arbitragem. Digamos que o valor dos dois tokens é idêntico, mas nosso depositante depositou quatro vezes mais o **Token1** do que o **Token0**. Um trader pode usar o fato de que o par de troca pensa que o **Token0** é mais valioso para extrair valor dessa situação. | Evento | reserva0 | reserva1 | reserva0 \* reserva1 | Valor do pool (reserve0 + reserve1) | -| -------------------------------------------------------------- | -------: | -------: | -------------------: | ----------------------------------: | -| Configuração Inicial | 8 | 32 | 256 | 40 | -| O trader deposita 8 tokens **Token0** e recupera 16 **Token1** | 16 | 16 | 256 | 32 | +| -------------------------------------------------------------- | --------:| --------:| ----------------------:| -----------------------------------:| +| Configuração Inicial | 8 | 32 | 256 | 40 | +| O trader deposita 8 tokens **Token0** e recupera 16 **Token1** | 16 | 16 | 256 | 32 | Como você pode ver, o trader ganhou 8 tokens extra, que vêm de uma redução do valor do pool, prejudicando o depositante que a possui. @@ -515,12 +515,12 @@ Em todos os depósitos subsequentes, já conhecemos a taxa de câmbio entre os d Seja um depósito inicial, seja um depósito subsequente, o número de tokens de liquidez que fornecemos é igual à raiz quadradada da alteração em `reserve0*reserve1` e o valor do token de liquidez não muda (a menos que obtenhamos um depósito com valores diferentes nos dois tipos, então, neste caso, a "multa" é distribuída). Aqui está outro exemplo com dois tokens que têm o mesmo valor, com três depósitos bons e um ruim (depósito de apenas um tipo de token, portanto, ele não produz nenhum token de liquidez). | Evento | reserva0 | reserva1 | reserva0 \* reserva1 | Valor do Pool (reserve0 + reserve1) | Tokens de liquidez cunhados para este depósito | Total de tokens de liquidez | valor de cada token de liquidez | -| ------------------------------- | -------: | -------: | -------------------: | ----------------------------------: | ---------------------------------------------: | --------------------------: | ------------------------------: | -| Configuração Inicial | 8,000 | 8,000 | 64 | 16,000 | 8 | 8 | 2,000 | -| Depósito de quatro de cada tipo | 12,000 | 12,000 | 144 | 24,000 | 4 | 12 | 2,000 | -| Depósito de dois de cada tipo | 14,000 | 14,000 | 196 | 28,000 | 2 | 14 | 2,000 | -| Depósito de valores desiguais | 18,000 | 14,000 | 252 | 32,000 | 0 | 14 | ~2,286 | -| Após a arbitragem | ~15,874 | ~15,874 | 252 | ~31,748 | 0 | 14 | ~2,267 | +| ------------------------------- | --------:| --------:| ----------------------:| -----------------------------------:| ----------------------------------------------:| ---------------------------:| -------------------------------:| +| Configuração Inicial | 8,000 | 8,000 | 64 | 16,000 | 8 | 8 | 2,000 | +| Depósito de quatro de cada tipo | 12,000 | 12,000 | 144 | 24,000 | 4 | 12 | 2,000 | +| Depósito de dois de cada tipo | 14,000 | 14,000 | 196 | 28,000 | 2 | 14 | 2,000 | +| Depósito de valores desiguais | 18,000 | 14,000 | 252 | 32,000 | 0 | 14 | ~2,286 | +| Após a arbitragem | ~15,874 | ~15,874 | 252 | ~31,748 | 0 | 14 | ~2,267 | ```solidity } @@ -985,7 +985,7 @@ Provedores de liquidez especificam um mínimo, geralmente porque querem limitar Por exemplo, imagine um caso em que a taxa de câmbio é de um para um, e o provedor de liquidez especifica esses valores: | Parâmetro | Valor | -| -------------- | ----: | +| -------------- | -----:| | amountADesired | 1.000 | | amountBDesired | 1.000 | | amountAMin | 900 | diff --git a/public/content/translations/pt-br/developers/tutorials/using-websockets/index.md b/public/content/translations/pt-br/developers/tutorials/using-websockets/index.md new file mode 100644 index 00000000000..15e52f84e95 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/using-websockets/index.md @@ -0,0 +1,249 @@ +--- +title: Usando WebSockets +description: Guia para usar WebSockets e Alchemy para fazer solicitações JSON-RPC e escutar eventos. +author: "Elan Halpern" +lang: pt-br +tags: + - "alchemy" + - "websocket" + - "consultando" + - "javascript" +skill: intermediate +source: Docs Alchemy +sourceUrl: https://docs.alchemyapi.io/guides/using-websockets +published: 2020-12-01 +--- + +Este é um guia de nível de entrada para usar WebSockets e Alchemy para fazer solicitações para a blockchain Ethereum. + +## WebSockets vs. HTTP {#websockets-vs-http} + +Ao contrário da HTTP, com WebSockets, você não precisa continuamente fazer solicitações quando quiser informações específicas. WebSockets mantêm uma conexão de rede para você (se for feito corretamente) e ouvem por mudanças. + +Como em qualquer conexão de rede, você não deve assumir que um WebSocket permanecerá aberto para sempre sem interrupção, mas o processamento correto de conexões descartadas e reconexão à mão podem ser desafiadores pra acertar. Outro lado negativo dos WebSockets é que você não obtém códigos de status HTTP na resposta, mas apenas a mensagem de erro. + +£[Alquimia Web3](https://docs.alchemy.com/reference/api-overview) adiciona automaticamente manipulação em falhas de WebSocket e obtém sem a configuração necessária. + +## Experimente {#try-it-out} + +A maneira mais fácil de testar WebSockets é instalar uma ferramenta de linha de comando para fazer solicitações de WebSocket como [wscat](https://github.com/websockets/wscat). Usando o wscat, você pode enviar solicitações da seguinte forma: + +_Nota: se você tem uma conta da Alchemy, você pode substituir `demo` com sua própria chave de API. [Cadastre-se para uma conta de Alquimia gratuita aqui!](https://auth.alchemyapi.io/signup)_ + +``` +wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo + +> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"} + +< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0} + +``` + +## Como usar WebSockets {#how-to-use-websockets} + +Para começar, abra um WebSocket usando a URL de WebSocket para seu aplicativo. Você pode encontrar a URL de WebSocket do seu aplicativo abrindo a página do aplicativo no [seu painel](https://dashboard.alchemyapi.io/) e clicando em "Visualizar chave". Note que a URL do seu aplicativo para WebSockets é diferente da URL para solicitações HTTP, mas ambos podem ser encontrados clicando em "Ver Chave". + +![Onde encontrar a sua URL de WebSocket no seu painel Alchemy](./use-websockets.gif) + +Qualquer uma das APIs listadas na [Referência API do Alquimia](https://docs.alchemyapi.io/documentation/alchemy-api-reference/) pode ser usada via WebSocket. Para fazer isso, use o mesmo payload que seria enviado como corpo de uma solicitação HTTP POST, mas ao invés disso, envie esse payload através do WebSocket. + +## Com Web3 {#with-web3} + +A transição para WebSockets enquanto se usa uma biblioteca de clientes como a Web3 é simples. Simplesmente passe a URL de WebSocket em vez da URL HTTP ao instanciar seu cliente Web3. Por exemplo: + +```js +const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key") + +web3.eth.getBlockNumber().then(console.log) // -> 7946893 +``` + +## Assinatura {#subscription-api} + +Quando conectado através de um WebSocket, você pode usar dois métodos adicionais: `eth_subscribe` e `eth_unsubscribe`. Esses métodos permitirão que você ouça eventos específicos e seja notificado imediatamente. + +### `eth_subscribe` {#eth-subscribe} + +Cria uma nova assinatura para eventos específicos. [Saiba mais sobre `eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe). + +#### Parâmetros {#parameters} + +1. Tipos de assinatura +2. Parâmetros opcionais + +O primeiro argumento especifica o tipo de evento para o qual ouvir. O segundo argumento contém opções adicionais que dependem do primeiro argumento. Os diferentes tipos de descrição, suas opções e suas cargas de evento são descritos abaixo. + +#### Retorna {#returns} + +O ID de subscrição: Este ID será anexado a qualquer evento recebido, e também pode ser usado para cancelar a assinatura usando `eth_unsubscribe`. + +#### Eventos de assinatura {#subscription-events} + +Enquanto a assinatura estiver ativa, você receberá eventos que são objetos com os seguintes campos: + +- `jsonrpc`: Sempre "2.0" +- `método`: Sempre "eth_subscription" +- `params`: Um objeto com os seguintes campos: + - `subscription`: O ID de assinatura retornado pela chamada `eth_subscription` que criou essa assinatura. + - `resultado`: Um objeto cujo conteúdo varia dependendo do tipo de assinatura. + +#### Tipos de assinatura {#subscription-types} + +1. `alchemy_newFullPendingTransactions` + +Retorna as informações de transação para todas as transações que são adicionadas ao estado pendente. Este tipo de assinatura se inscreve em transações pendentes, similar à chamada Web3 padrão `web3.eth. ubscribe("pendingTransações")`, mas difere do que emite _informações completas de transação_ ao invés de apenas hashes de transação. + +Exemplo: + +```json +> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]} + +< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"} +< { + "jsonrpc":"2.0", + "method":"eth_subscription", + "params":{ + "result":{ + "blockHash":null, + "blockNumber":null, + "from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f", + "gas":"0x1adb0", + "gasPrice":"0x7735c4d40", + "hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf", +"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000", + "nonce":"0x0", + "to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40", + "transactionIndex":null, + "value":"0x0", + "v":"0x26", + "r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b", + "s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"}, + "subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8" + } + } + +``` + +2. `newHeads` + +Emite um evento a qualquer momento que um novo cabeçalho seja adicionado à cadeia, incluindo durante uma reorganização em cadeia. + +Quando ocorre uma reorganização da cadeia, esta assinatura emitirá um evento contendo todos os novos cabeçalhos da nova cadeia. Em particular, isso significa que você pode ver vários cabeçalhos emitidos com a mesma altura, e quando isso acontecer, o cabeçalho mais recente deve ser tomado como o correto após uma reorganização. + +Exemplo: + +```json +> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]} + +< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"} +< { + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "result": { + "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773", + "gasLimit": "0x47e7c4", + "gasUsed": "0x38658", + "logsBloom": +"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x084149998194cc5f", + "number": "0x1348c9", + "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701", + "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378", + "timestamp": "0x56ffeff8", + "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f" + }, + "subscription": "0x9ce59a13059e417087c02d3236a0b1cc" + } +} + +``` + +3. `logs` + +Emite logs que fazem parte dos blocos recém-adicionados que correspondem aos critérios de filtro especificado. + +Quando ocorre uma reorganização da cadeia, logs que fazem parte dos blocos da cadeia antiga serão emitidos novamente com a propriedade `removido` definido como `verdadeiro`. Além disso, são emitidos registros que fazem parte dos blocos da nova cadeia, significando que é possível ver logs para a mesma transação várias vezes no caso de uma reorganização. + +Parâmetros + +1. Um objeto com os seguintes campos: + - `endereço` (opcional): ou uma string representanda por um endereço, ou um array de tais strings. + - Somente logs criados a partir de um desses endereços serão emitidos. + - `Tópicos`: um array de especificadores de tópicos. + - Cada especialista de tópico é `null` uma string que representa um tópico, ou uma matriz de strings. + - Cada posição no array que não é `nulo` restringe os logs emitidos para apenas aqueles que têm um dos tópicos indicados nessa posição. + +Alguns exemplos de especificações de tópico: + +- `[]`: Qualquer tópico permitido. +- `[A]`: A na primeira posição (e qualquer coisa depois). +- `[null, B]`: Qualquer coisa na primeira posição e B na segunda posição (e qualquer coisa depois). +- `[null, B]`: Qualquer coisa na primeira posição e B na segunda posição (e qualquer coisa depois). +- .`[[A, B], [A, B]]`: (A or B) na primeira posição e (A or B) na segunda posição (e nada depois). + +Exemplo: + +```json +> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]} + +< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"} +< { + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4a8a4c0517381924f9838102c5a4dcb7", + "result": { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04", + "blockNumber": "0x29e87", + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003", + "logIndex":"0x0", + "topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"], + "transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4", + "transactionIndex": "0x0" + } + } +} + +``` + +### `eth_unsubscribe` {#eth-unsubscribe} + +Cancela uma assinatura existente para que não sejam enviados mais eventos. + +Parâmetros + +1. Inscrição ID, como retornado anteriormente de uma chamada de `eth_subscribe`. + +Retornos + +`true` se uma assinatura foi cancelada com sucesso, ou `false` se não existir nenhuma assinatura com o ID fornecido. + +Exemplo: + +**Requisição** + +``` +curl https://eth-mainnet.alchemyapi.io/v2/your-api-key +-X POST +-H "Content-Type: application/json" +-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}' + + +``` + +**Resultado** + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +--- + +[Cadastre-se com o Alchemy](https://auth.alchemyapi.io/signup) gratuitamente, confira [a nossa documentação](https://docs.alchemyapi.io/), e para receber as últimas notícias, siga-nos no [Twitter](https://twitter.com/AlchemyPlatform). diff --git a/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md new file mode 100644 index 00000000000..166750fb68b --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -0,0 +1,298 @@ +--- +title: "Waffle: simulações dinâmicas e testando chamadas de contrato" +description: Tutorial avançado de Waffle para usar simulação dinâmica e testar chamadas contratuais +author: "Daniel Izdebski" +tags: + - "waffle" + - "Contratos Inteligentes" + - "solidity" + - "Testes" + - "simulando" +skill: intermediate +lang: pt-br +published: 2020-11-14 +--- + +## Do que se trata esse tutorial? {#what-is-this-tutorial-about} + +Neste tutorial, você aprenderá: + +- use simulação dinâmica +- testar interações entre contratos inteligentes + +Pressupostos: + +- você já sabe como escrever um contrato inteligente simples em `Solidity` +- você conhece o seu `JavaScript` e `TypeScript` +- você fez outros `tutoriais` do Waffle ou sabe alguma coisa sobre isso + +## Simulação dinâmica {#dynamic-mocking} + +Por que a simulação dinâmica é útil? Bem, isso permite-nos escrever testes unitários em vez de testes de integração. O que isso significa? Isso significa que não precisamos nos preocupar com as dependências dos contratos inteligentes, assim podemos testar todos eles em total isolamento. Deixe-me te mostrar como exatamente você pode fazer isso. + +### **1. Projeto** {#1-project} + +Antes de começar, precisamos preparar um projeto simples no node.js: + +```bash +mkdir dynamic-mocking +cd dynamic-mocking +mkdir contracts src + +yarn init +# or if you're using npm +npm init +``` + +Vamos começar adicionando typescript e testes de dependências - mocha & chai: + +```bash +yarn add --dev @types/chai @types/mocha chai mocha ts-node typescript +# or if you're using npm +npm install @types/chai @types/mocha chai mocha ts-node typescript --save-dev +``` + +Agora vamos adicionar `Waffle` e `ethers`: + +```bash +yarn add --dev ethereum-waffle ethers +# or if you're using npm +npm install ethereum-waffle ethers --save-dev +``` + +A nossa estrutura de projetos deverá ficar assim: + +``` +. +├── contracts +├── package.json +└── test +``` + +### **2. Contrato inteligente** {#2-smart-contract} + +Para iniciar uma simulação dinâmica, precisamos de um contrato inteligente com dependências. Não se preocupe, nós ajudamos você! + +Aqui está um simples contrato inteligente escrito na `Solidity` cujo único objetivo é conferir se somos ricos. Ele usa o token ERC20 para verificar se temos tokens suficientes. Coloque em `./contracts/AmIRichAlready.sol`. + +```solidity +pragma solidity ^0.6.2; + +interface IERC20 { + function balanceOf(address account) external view returns (uint256); +} + +contract AmIRichAlready { + IERC20 private tokenContract; + uint public richness = 1000000 * 10 ** 18; + + constructor (IERC20 _tokenContract) public { + tokenContract = _tokenContract; + } + + function check() public view returns (bool) { + uint balance = tokenContract.balanceOf(msg.sender); + return balance > richness; + } +} +``` + +Como queremos usar simulação dinâmica, não precisamos de todo o ERC20, é por isso que estamos usando a interface IERC20 com apenas uma função. + +É hora de construir este contrato! Para isso, usaremos o `Waffle`. Primeiro, vamos criar um arquivo de configuração simples `waffle.json` que especifica as opções de compilação. + +```json +{ + "compilerType": "solcjs", + "compilerVersion": "0.6.2", + "sourceDirectory": "./contracts", + "outputDirectory": "./build" +} +``` + +Agora estamos prontos para construir o contrato com Waffle: + +```bash +npx waffle +``` + +Fácil, certo? Na pasta `de compilação/` dois arquivos correspondentes ao contrato e a interface apareceu. Nós os utilizaremos mais tarde para testar. + +### **3. Testando** {#3-testing} + +Vamos criar um arquivo chamado `AmIRichAlready.test.ts` para os testes reais. Em primeiro lugar, temos de lidar com as importações. Nós precisaremos deles para mais tarde: + +```typescript +import { expect, use } from "chai" +import { Contract, utils, Wallet } from "ethers" +import { + deployContract, + deployMockContract, + MockProvider, + solidity, +} from "ethereum-waffle" +``` + +Exceto para dependências JS, precisamos importar nossa interface e contrato construídos: + +```typescript +import IERC20 from "../build/IERC20.json" +import AmIRichAlready from "../build/AmIRichAlready.json" +``` + +Waffle usa `chai` para testes. No entanto, antes de podermos usá-lo, temos que injetar os "matchers" de Waffle em si mesmo: + +```typescript +use(solidity) +``` + +Precisamos implementar a função `beforeEach()` que irá redefinir o estado do contrato antes de cada teste. Primeiro, vamos pensar no que precisamos lá. Para implantar um contrato, precisamos de duas coisas: uma carteira e um contrato ERC20 implementado para passá-la como um argumento para o contrato `AmIRichalready`. + +Em primeiro lugar, criamos uma carteira: + +```typescript +const [wallet] = new MockProvider().getWallets() +``` + +Depois, precisamos de implantar um contrato do ERC20. Aqui está a parte complicada - nós temos apenas uma interface. Esta é a parte em que Waffle vem nos salvar. Waffle tem uma função mágica `deployMockContract()` que cria um contrato usando apenas o _abi_ da interface: + +```typescript +const mockERC20 = await deployMockContract(wallet, IERC20.abi) +``` + +Agora com a carteira e o ERC20 implantados, podemos ir em frente e implantar o contrato `AmIRichalready` (Contrato: + +```typescript +const contract = await deployContract(wallet, AmIRichAlready, [ + mockERC20.address, +]) +``` + +Com tudo isso, nossa função `beforeEach()` está terminada. Até agora o seu arquivo `AmIRichAlready.test.ts` deve se parecer com isto: + +```typescript +import { expect, use } from "chai" +import { Contract, utils, Wallet } from "ethers" +import { + deployContract, + deployMockContract, + MockProvider, + solidity, +} from "ethereum-waffle" + +import IERC20 from "../build/IERC20.json" +import AmIRichAlready from "../build/AmIRichAlready.json" + +use(solidity) + +describe("Am I Rich Already", () => { + let mockERC20: Contract + let contract: Contract + let wallet: Wallet + + beforeEach(async () => { + ;[wallet] = new MockProvider().getWallets() + mockERC20 = await deployMockContract(wallet, IERC20.abi) + contract = await deployContract(wallet, AmIRichAlready, [mockERC20.address]) + }) +}) +``` + +Vamos fazer o primeiro teste para o contrato `AmIRichalready`. Sobre o que acha que o nosso teste deveria ser? Sim, você tem razão! Deveríamos verificar se já somos ricos :) + +Um, pera um segundo. Como o nosso contrato simulado saberá quais valores retornar? Não implementamos nenhuma lógica para a função `balanceOf()`. Mais uma vez, Waffle pode ajudar aqui. Nosso contrato simulado tem algumas coisas novas e bonitas agora: + +```typescript +await mockERC20.mock..returns() +await mockERC20.mock..withArgs().returns() +``` + +Com esse conhecimento, podemos finalmente escrever nosso primeiro teste: + +```typescript +it("returns false if the wallet has less than 1000000 tokens", async () => { + await mockERC20.mock.balanceOf.returns(utils.parseEther("999999")) + expect(await contract.check()).to.be.equal(false) +}) +``` + +Vamos travar esse teste em partes: + +1. Definimos nosso contrato simulado no ERC20 para sempre devolver o saldo de tokens de 9999999999. +2. Verifique se o método `contract.check()` retorna `false`. + +Nós estamos prontos para disparar a fera: + +![Um test passando](test-one.png) + +Então o teste funciona, mas... ainda há espaço para melhorias. A função `saldoOf()` sempre retornará 99999. Podemos melhorá-la especificando uma carteira para a qual a função deve retornar algo - como um contrato de verdade: + +```typescript +it("returns false if the wallet has less than 1000001 tokens", async () => { + await mockERC20.mock.balanceOf + .withArgs(wallet.address) + .returns(utils.parseEther("999999")) + expect(await contract.check()).to.be.equal(false) +}) +``` + +Até agora, nós testamos apenas o caso em que não estamos ricos o suficiente. Em vez disso, vamos testar o oposto: + +```typescript +it("returns true if the wallet has at least 1000001 tokens", async () => { + await mockERC20.mock.balanceOf + .withArgs(wallet.address) + .returns(utils.parseEther("1000001")) + expect(await contract.check()).to.be.equal(true) +}) +``` + +Você executa os testes... + +![Dois testes passando](test-two.png) + +E aqui está você! Nosso contrato parece funcionar como pretendido :) + +## Testando chamadas de contrato {#testing-contract-calls} + +Vamos resumir o que fez até agora. Nós testamos a funcionalidade do nosso contrato de `AmIRichalready` e parece que ele está funcionando corretamente. Isso significa que estamos prontos, né? Não exatamente! Waffle permite-nos testar ainda mais o nosso contrato. Mas o quanto exatamente? Bem, no arsenal de Waffle há um `calledOnContract()` e `calledOnContractWith()` correspondentes. Eles nos permitirão verificar se nosso contrato chamado de simulação (mock, em inglês) do ERC20. Aqui está um teste básico com um desses matchers: + +```typescript +it("checks if contract called balanceOf on the ERC20 token", async () => { + await mockERC20.mock.balanceOf.returns(utils.parseEther("999999")) + await contract.check() + expect("balanceOf").to.be.calledOnContract(mockERC20) +}) +``` + +Podemos ir ainda mais longe e melhorar este teste com o outro "matcher" que eu te falei: + +```typescript +it("checks if contract called balanceOf with certain wallet on the ERC20 token", async () => { + await mockERC20.mock.balanceOf + .withArgs(wallet.address) + .returns(utils.parseEther("999999")) + await contract.check() + expect("balanceOf").to.be.calledOnContractWith(mockERC20, [wallet.address]) +}) +``` + +Vamos verificar se os testes estão corretos: + +![Três testes passando](test-three.png) + +Ótimo, todos os testes são verdes. + +Testar chamadas de contrato com Waffle é super fácil. E aqui está a melhor parte. Esses "matchers" trabalham com contratos normais e simulados! É porque o Waffle registra e filtra chamadas EVM em vez de injetar código, como é no caso de bibliotecas de teste populares de outras tecnologias. + +## A Linha de Chegada {#the-finish-line} + +Parabéns! Agora você sabe como usar Waffle para testar chamadas de contrato e contratos simulados dinamicamente. Há características muito mais interessantes para descobrir. Recomendo mergulhar na documentação do Waffle. + +A documentação do Waffle está disponível [aqui](https://ethereum-waffle.readthedocs.io/). + +O código fonte deste tutorial pode ser encontrado [aqui](https://github.com/EthWorks/Waffle/tree/master/examples/dynamic-mocking-and-testing-calls). + +Você pode também estar interessado em: + +- [Testando contratos inteligentes com Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) diff --git a/public/content/translations/pt-br/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md b/public/content/translations/pt-br/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md new file mode 100644 index 00000000000..851cb979840 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md @@ -0,0 +1,202 @@ +--- +title: "Tutorial Waffle diz hello world com hardhat e ethers" +description: Faça seu primeiro projeto Waffle com hardhat e ethers.js +author: "MiZiet" +tags: + - "waffle" + - "contratos inteligentes" + - "solidity" + - "testando" + - "hardhat" + - "ethers.js" +skill: intermediate +lang: pt-br +published: 2020-10-16 +--- + +Neste [tutorial do Waffle](https://ethereum-waffle.readthedocs.io), aprenderemos como criar um simples projeto de contrato inteligente "Hello world", usando [hardhat](https://hardhat.org/) e [ethers. s](https://docs.ethers.io/v5/). Em seguida, aprenderemos como adicionar uma nova funcionalidade ao nosso contrato inteligente e como testá-lo com Waffle. + +Vamos começar criando um novo projeto: + +```bash +yarn init +``` + +ou + +```bash +npm init +``` + +e instalando os pacotes necessários: + +```bash +yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai +``` + +ou + +```bash +npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai +``` + +O próximo passo é criar um projeto hardhat de amostra, executando `npx hardhat`. + +```bash +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.3 👷‍ + +? O que você deseja fazer? … +★ Crie um projeto de exemplo +Crie um hardhat.config.js vazio +Saia +``` + +Selecione `Create a sample project` + +A nossa estrutura de projetos deverá ficar assim: + +``` +MyWaffleProject +├── contracts +│ └── Greeter.sol +├── node_modules +├── scripts +│ └── sample-script.js +├── test +│ └── sample-test.js +├── .gitattributs +├── .gitignore +├── hardhat.config.js +└── package.json +``` + +### Agora vamos falar sobre alguns desses arquivos: {#now-lets-talk} + +- Greeter.sol - nosso smart contract escrito em Solidity; + +```solidity +contract Greeter { +string greeting; + +constructor(string memory _greeting) public { +console.log("Deploying a Greeter with greeting:", _greeting); +greeting = _greeting; +} + +function greet() public view returns (string memory) { +return greeting; +} + +function setGreeting(string memory _greeting) public { +console.log("Changing greeting from '%s' to '%s'", greeting, _greeting); +greeting = _greeting; +} +} +``` + +Nosso contrato inteligente pode ser dividido em três partes: + +1. constructor - onde declaramos uma variável de tipo string chamada `greeting`, +2. function greet - função que retornará `greeting` quando chamada, +3. function setGreeting - uma função que nos permite alterar o valor da função `greeting`. + +- sample-test.js - nosso arquivo de testes + +```js +describe("Greeter", function () { + it("Should return the new greeting once it's changed", async function () { + const Greeter = await ethers.getContractFactory("Greeter") + const greeter = await Greeter.deploy("Hello, world!") + + await greeter.deployed() + expect(await greeter.greet()).to.equal("Hello, world!") + + await greeter.setGreeting("Hola, mundo!") + expect(await greeter.greet()).to.equal("Hola, mundo!") + }) +}) +``` + +### O próximo passo consiste em compilar nosso contrato e executar testes: {#compiling-and-testing} + +Testes de Waffle usam Mocha (um framework de teste) com Chai (uma biblioteca de asserção). Tudo o que você precisa fazer é executar `npx hardhat test` e esperar que a seguinte mensagem apareça. + +```bash +✓ Deve retornar a nova saudação uma vez alterada +``` + +### Tudo parece ótimo até agora, vamos adicionar mais complexidade ao nosso projeto {#adding-complexity} + +Imagine uma situação quando alguém adiciona uma string vazia como saudação. Não seria uma saudação calorosa, né? +Vamos nos certicar que isso não aconteça: + +Queremos usar o `revert` do Solidity quando alguém passar uma string vazia. Uma coisa boa é que podemos facilmente testar esta funcionalidade com o chai matcher do Waffle `to.be.revertedWith()`. + +```js +it("Should revert when passing an empty string", async () => { + const Greeter = await ethers.getContractFactory("Greeter") + const greeter = await Greeter.deploy("Hello, world!") + + await greeter.deployed() + await expect(greeter.setGreeting("")).to.be.revertedWith( + "Greeting should not be empty" + ) +}) +``` + +Parece que o nosso novo teste não passou: + +```bash +Implantando um Greeter com saudação: Olá, mundo! +Mude de saudação de 'Hello, world!' para 'Hola, mundo!' + ✓ Deve devolver a nova saudação uma vez que ela tenha sido alterada (1514ms) +Implantando um Greeter com saudação: Olá, mundo! +Mudar saudação de 'Olá, mundo!' para '' + 1) Deve reverter quando passar uma seqüência vazia + + + 1 passagem (2s) + 1 falhando +``` + +Vamos implementar esta funcionalidade em nosso contrato inteligente: + +```solidity +require(bytes(_greeting).length > 0, "Greeting message is empty"); +``` + +Agora, nossa função setGreeting se parece com isso: + +```solidity +function setGreeting(string memory _greeting) public { +require(bytes(_greeting).length > 0, "Greeting should not be empty"); +console.log("Changing greeting from '%s' to '%s'", greeting, _greeting); +greeting = _greeting; +} +``` + +Vamos executar os testes novamente: + +```bash +✓ Deve retornar a nova saudação quando ela for alterada (1467ms) +✓ Deve reverter quando passar uma string vazia (276ms) + +2 passagem (2s) +``` + +Parabéns! Você terminou :) + +### Conclusão {#conclusion} + +Fizemos um projeto simples com Waffle, Hardhat e ethers.js. Aprendemos como criar um projeto, adicionar um teste e implementar novas funcionalidades. + +Para mais combinações excelentes de chai para testar seus smart contracts, confira a [documentação oficial da Waffle](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html). diff --git a/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md new file mode 100644 index 00000000000..1a3ade19e87 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -0,0 +1,203 @@ +--- +title: Testando um contrato inteligente simples com a biblioteca Waffle +description: Tutorial para iniciantes +author: Ewa Kowalska +tags: + - "contratos inteligentes" + - "solidity" + - "Waffle" + - "testando" +skill: intermediate +lang: pt-br +published: 2021-02-26 +--- + +## Neste tutorial, você aprenderá como {#in-this-tutorial-youll-learn-how-to} + +- Testar as mudanças do saldo da carteira +- Testar a emissão de eventos com argumentos especificados +- Assegurar que uma transação foi revertida + +## Suposições {#assumptions} + +- Você pode criar um novo projeto JavaScript ou TypeScript +- Você tem alguma experiência básica com testes em JavaScript +- Você tem usado gerenciadores de pacotes como Yarn ou NPM +- Você possui um conhecimento muito básico de contratos inteligentes e Solidity + +# Introdução {#getting-started} + +O tutorial demonstra a configuração do teste e a execução usando yarn, mas não há problema se você preferir npm - Eu fornecerei referências adequadas a [documentação](https://ethereum-waffle.readthedocs.io/en/latest/index.html) oficial do Waffle. + +## Instalando Dependências {#install-dependencies} + +[Adicione](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#installation) as dependências do ethereum-waffle e typescript às dependências de desenvolvimento do seu projeto. + +```bash +yarn add --dev ethereum-waffle ts-node typescript @types/jest +``` + +## Exemplo de contrato inteligente {#example-smart-contract} + +Durante o tutorial, nós trabalharemos em um exemplo de contrato inteligente simples - EtherSplitter. Não faz nada de mais, além de permitir que qualquer um envie somas em wei e divida-as igualmente entre dois destinatários predefinidos. A função split exige que a quantidade de wei seja par, caso contrário, ela será anulada. Para ambos os destinatários, ela realiza uma transferência em wei, seguido da emissão do evento Transferir. + +Coloque o trecho de código EtherSplitter em `src/EtherSplitter.sol`. + +```solidity +pragma solidity ^0.6.0; + +contract EtherSplitter { + address payable receiver1; + address payable receiver2; + + event Transfer(address from, address to, uint256 amount); + + constructor(address payable _address1, address payable _address2) public { + receiver1 = _address1; + receiver2 = _address2; + } + + function split() public payable { + require(msg.value % 2 == 0, 'Uneven wei amount not allowed'); + receiver1.transfer(msg.value / 2); + emit Transfer(msg.sender, receiver1, msg.value / 2); + receiver2.transfer(msg.value / 2); + emit Transfer(msg.sender, receiver2, msg.value / 2); + } +} +``` + +## Compilar o contrato {#compile-the-contract} + +Para [compilar](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#compiling-the-contract) o contrato, adicione a seguinte entrada ao arquivo package.json: + +```json +"scripts": { + "build": "waffle" + } +``` + +Em seguida, crie o arquivo de configuração do Waffle, no diretório raiz do projeto - `waffle.json` - e então cole a seguinte configuração lá: + +```json +{ + "compilerType": "solcjs", + "compilerVersion": "0.6.2", + "sourceDirectory": "./contracts", + "outputDirectory": "./build" +} +``` + +Execute `yarn build`. Como resultado, o diretório `build` aparecerá com o contrato compilado, EtherSplitter, no formato JSON. + +## Teste de configuração {#test-setup} + +Testar com Waffle requer usar os matchers (comparadores) Chai e Mocha, então você precisa [adicionar](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) ao seu projeto. Atualize seu arquivo package.json e adicione a entrada `test` na parte de scripts: + +```json +"scripts": { + "build": "waffle", + "test": "export NODE_ENV=test && mocha -r ts-node/register 'test/**/*.test.ts'" + } +``` + +Se você quiser [executar](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#running-tests) seus testes, basta executar `yarn test`. + +# Testando {#testing} + +Agora crie o diretório `test` e crie o novo arquivo `test\EtherSplitter.test.ts`. Copie o trecho de código abaixo e cole-o em nosso arquivo de teste. + +```ts +import { expect, use } from "chai" +import { Contract } from "ethers" +import { deployContract, MockProvider, solidity } from "ethereum-waffle" +import EtherSplitter from "../build/EtherSplitter.json" + +use(solidity) + +describe("Ether Splitter", () => { + const [sender, receiver1, receiver2] = new MockProvider().getWallets() + let splitter: Contract + + beforeEach(async () => { + splitter = await deployContract(sender, EtherSplitter, [ + receiver1.address, + receiver2.address, + ]) + }) + + // add the tests here +}) +``` + +Algumas palavras antes de começarmos. O `MockProvider` vem com uma versão em mock (simulada de um objeto real) da blockchain. Ele também fornece o mock de carteiras que nos servirão para testar o contrato EtherSplitter. Podemos obter até dez carteiras chamando o método `getWallets()` no provedor. No exemplo, nós obtemos três carteiras - para o remetente e duas para os destinatários. + +Em seguida, declaramos uma variável chamada 'splitter' - este é o nosso contrato mock EtherSplitter. Ele é criado antes de cada execução de um único teste pelo método `deployContract`. Este método simula a implantação de um contrato, da carteira passada como primeiro parâmetro (a carteira do remetente em nosso caso). O segundo parâmetro é a ABI e o bytecode do contrato testado — passamos para lá o arquivo json do contrato EtherSplitter compilado no diretório `build`. O terceiro parâmetro é uma matriz com os argumentos do construtor do contrato que, no nosso caso, são os dois endereços dos destinatários. + +## changeBalances {#changebalances} + +Primeiro, verificaremos se o método split realmente altera os saldos das carteiras dos destinatários. Se dividirmos 50 wei da conta do remetente, nós esperaríamos que os saldos de ambos os destinatários aumentassem em 25 wei. Nós usaremos o matcher `changeBalances` do Waffle: + +```ts +it("Changes accounts balances", async () => { + await expect(() => splitter.split({ value: 50 })).to.changeBalances( + [receiver1, receiver2], + [25, 25] + ) +}) +``` + +Como o primeiro parâmetro do matcher, nós passamos um array de carteiras dos destinatários e, como segundo - um array de aumentos esperados nas contas correspondentes. Se nós quiséssemos verificar o saldo de uma carteira específica, também poderíamos usar o matcher `changeBalance`, que não requer a passagem de arrays, como no exemplo abaixo: + +```ts +it("Changes account balance", async () => { + await expect(() => splitter.split({ value: 50 })).to.changeBalance( + receiver1, + 25 + ) +}) +``` + +Observe que, em ambos os casos de `changeBalance` e de `changeBalances`, transmitimos a função split como um retorno de chamada, pois o comparador precisa acessar o estado dos saldos antes e depois da chamada. + +A seguir, testaremos se o evento Transfer foi emitido após cada transferência de wei. Vamos passar para outro comparador do Waffle: + +## Emit {#emit} + +```ts +it("Emits event on the transfer to the first receiver", async () => { + await expect(splitter.split({ value: 50 })) + .to.emit(splitter, "Transfer") + .withArgs(sender.address, receiver1.address, 25) +}) + +it("Emits event on the transfer to the second receiver", async () => { + await expect(splitter.split({ value: 50 })) + .to.emit(splitter, "Transfer") + .withArgs(sender.address, receiver2.address, 25) +}) +``` + +O matcher `emit` nos permite verificar, se um contrato emitiu um evento ao chamar um método. Como parâmetros para o matcher `emit`, nós fornecemos o mock do contrato, que prevemos para emitir o evento, juntamente com o nome desse evento. Em nosso caso, o contrato simulado é o `splitter` e o nome do evento é `Transfer`. Nós também podemos verificar os valores precisos dos argumentos, com os quais o evento foi emitido - nós passamos tantos argumentos para o matcher `withArgs`, como espera a nossa declaração de evento. No caso do contrato EtherSplitter, passamos os endereços do remetente e do destinatário, juntamente com a quantia de wei transferida. + +## revertedWith {#revertedwith} + +Como último exemplo, nós verificaremos se a transação foi revertida, em caso de número desigual de wei. Usaremos o matcher `revertedWith`: + +```ts +it("Reverts when Vei amount uneven", async () => { + await expect(splitter.split({ value: 51 })).to.be.revertedWith( + "Uneven wei amount not allowed" + ) +}) +``` + +O teste, se aprovado, nos garantirá que a transação foi revertida de fato. No entanto, também deve haver uma correspondência exata entre as mensagens que passamos, na instrução `require` e a mensagem que esperamos em `revertedWith`. Se voltarmos ao código do contrato EtherSplitter, na declaração `require` para a quantidade wei, fornecemos a mensagem: 'Quantidade de wei desigual não permitida'. Isso corresponde à mensagem que esperamos em nosso teste. Se eles não fossem iguais, o teste falharia. + +# Parabéns! {#congratulations} + +Você acabou de dar seu primeiro grande passo para testar contratos inteligentes com Waffle! Caso esteja interessado em outros tutoriais do Waffle: + +- [Testando ERC20 com Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) +- [Waffle: simulações dinâmicas e testando chamadas de contrato](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) +- [Waffle diga olá mundo tutorial com capacete de segurança e ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) diff --git a/public/content/translations/pt-br/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/pt-br/developers/tutorials/yellow-paper-evm/index.md new file mode 100644 index 00000000000..5aced52da90 --- /dev/null +++ b/public/content/translations/pt-br/developers/tutorials/yellow-paper-evm/index.md @@ -0,0 +1,264 @@ +--- +title: Entendendo as especificações do Yellow Paper da EVM +description: Entendendo a parte do Yellow Paper, a especificação formal do Ethereum, você entenderá a Máquina Virtual Ethereum (EVM). +author: "qbzzt" +tags: + - "evm" +skill: intermediate +lang: pt-br +published: 2022-05-15 +--- + +[O Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) é uma especificação formal do Ethereum. Exceto onde alterado pelo [processo EIP](/eips/), ele contém a descrição exata de como tudo funciona. Ele foi escrito como um documento matemático, que inclui terminologia que programadores podem não achar familiar. Nesse documento você aprende como lê-lo, e por extensão outros documentos matemáticos relacionados. + +## Qual Yellow Paper? {#which-yellow-paper} + +Como quase tudo mais no Ethereum, o Yellow Paper evolui com o tempo. Para ser capaz de se referir a uma versão específica, eu fiz o upload [da versão atual](yellow-paper-berlin.pdf). A seção, página e números de equação que eu uso irão se referir a esta versão. É uma boa ideia tê-lo aberto em uma janela diferente enquanto você lê esse documento. + +### Por que a EVM? {#why-the-evm} + +O yellow paper original foi escrito logo no começo do desenvolvimento do Ethereum. Ele descreve o mecanismo de consenso original baseado em proof-of-work que foi originalmente usado para proteger a rede. Entretanto, o Ethereum desligou o proof-of-work e começou a usar consenso baseado em proof-of-stake em setembro de 2022. Este tutorial focará nas partes do yellow paper que definem a Máquina Virtual Ethereum. A EVM ficou inalterada pela transição para proof-of-stake (exceto pelo valor de retorno do opcode DIFFICULTY). + +## Modelo de execução 9 {#9-execution-model} + +Esta seção (pág. 12.14) inclui a maioria da definição da EVM. + +O termo _estado do sistema_ inclui tudo que você precisa saber sobre o sistema para rodá-lo. Em um computador comum, isto significa memória, conteúdo dos registradores, etc. + +Uma [máquina de Turing](https://en.wikipedia.org/wiki/Turing_machine) é um modelo computacional. Essencialmente, é uma versão simplificada de um computador, que comprovadamente tem a mesma habilidade de executar computações que um computador normal tem (tudo que um computador pode calcular, uma máquina de Turing pode calcular, e vice-versa). Este modelo facilita provar vários teoremas sobre o que é e o que não é computável. + +O termo [Turing-completo](https://en.wikipedia.org/wiki/Turing_completeness) significa um computador que pode rodar os mesmos cálculos que uma máquina de Turing. Máquinas de Turing pode entrar em laços infinitos, e a EVM não pode porque ela irá ficar sem gas, então é somente quase-Turing-completa. + +## Básico 9.1 {#91-basics} + +Esta seção fornece o básico sobre EVM e como ela se equipara a outros modelos computacionais. + +A [máquina de pilha](https://en.wikipedia.org/wiki/Stack_machine) é um computador que armazena dados intermediários não em registros, mas em uma [**pilha**](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). Esta é a arquitetura preferida para máquinas virtuais porque é fácil de implementar, significando que bugs e a vulnerabilidades de segurança são bem menos prováveis. A memória na pilha é dividida em palavras de 256-bit. Esta escolha foi tomada por ser a mais conveniente às operações criptográficas do núcleo do Ethereum, como as computações de hash Keccak-256 e curva elíptica. O tamanho máximo da pilha é 1.024 bytes. Quando opcodes são executados, eles geralmente estão pegando seus parâmetros da pilha. Há opcodes especificamente para reorganizar elementos na pilha, como `POP` (remove item do topo da pilha), `DUP_N` (N-ésimo item duplicado na pilha), etc. + +A EVM também tem um espaço volátil chamado **memory** que é usado para armazenar dados durante execução. Esta memória é organizada em palavras de 32-byte. Todas as locações de memória são inicializadas em zero. Se você executar este código [Yul](https://docs.soliditylang.org/en/latest/yul.html) para adicionar uma palavra na memória, ele irá preencher 32 bytes de memória preenchendo o espaço vazio na palavra com zeros, ou seja, ele cria uma palavra - com zeros nos locais 0-29, 0x60 a 30, e 0xA7 a 31. + +```yul +mstore(0, 0x60A7) +``` + +`mstore` é um dos três opcodes que a EVM fornece para interação com a memória - ele carrega uma palavra na memória. Os outros dois são `mstore8`, que carrega um único byte na memória, e `mload`, que move uma palavra da memória para a pilha. + +A EVM também tem um modelo separado não volátil chamado **storage**, que é mantido como parte do estado do sistema - esta memória é organizada em arrays de palavras (ao contrário de arrays de byte endereçáveis por palavra na pilha). Esta storage é quando contratos mantém dados resistentes - um contrato pode somente interagir com o seu própria storage. Storage é organizado em mapeamentos chave-valor. + +Apesar de não ser mencionado nessa seção do Yellow Paper, é útil também saber que há um quarto tipo de memória. **Calldata** é uma memória endereçável por byte, somente de leitura, usada para armazenar o valor passado com o parâmetro `data` da transação. A EVM tem opcodes específicos para gerenciamento de `calldata`. `calldatasize` retorna o tamanho dos dados. `calldataload` carrega os dados na pilha. `calldatacopy` copia os dados na memória. + +A [arquitetura Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) armazena código e dados na mesma memória. A EVM não segue este padrão por razões de segurança - compartilhar memória volátil torna possível mudar o código do programa. Ao invés disso, o código é gravado na storage. + +Há apenas dois casos em que o código é executado da memória: + +- Quando um contrato cria outro contrato (usando [`CREATE`](https://www.evm.codes/#f0) ou [`CREATE2`](https://www.evm.codes/#f5)), o código do construtor do contrato vem da memória. +- Durante a criação de _qualquer_ contrato, o código do construtor roda e então retorna com o código do contrato real, também da memória. + +O termo execução excepcional significa uma exceção que causa a interrupção da execução do contrato atual. + +## 9.2 Visão geral de taxas {#92-fees-overview} + +Esta seção explica como as taxas de gas são calculadas. Há três custos: + +### Custo de opcode {#opcode-cost} + +O custo herdado de um opcode específico. Para obter este valor, encontre o grupo de custo do opcode no apêndice H (p. 28, sob equação (327)), e encontre o grupo de custo na equação (324). Isto te dá uma função do custo, que na maioria dos casos usa parâmetros do apêndice G (p. 27). + +Por exemplo, o opcode [`CALLDATACOPY`](https://www.evm.codes/#37) é um membro do grupo _Wcopy_. O custo de opcode para este grupo é _Gverylow+Gcopy×⌈μs[2]÷32⌉_. Olhando no apêndice G, nós vemos que ambas constantes são 3, o que nos dá _3+3×⌈μs[2]÷32⌉_. + +Nós ainda precisamos decifrar a expressão _⌈μs[2]÷32⌉_. A parte mais de fora, _⌈ \ ⌉_ é a função ceiling, uma função em que é dado valor onde retorna o menor inteiro que ainda não é menor que o valor. Por exemplo, _⌈2.5⌉ = ⌈3⌉ = 3_. A parte mais interna é _μs[2]÷32_. Olhando na seção 3 (Convenções) na p. 3, _μ_ é o estado da máquina. O estado da máquina é definido na seção 9.4.1 na p. 13. De acordo com essa seção, um dos parâmetros do estado da máquina é _s_ para a pilha. Colocando tudo junto, parece que _μs[2]_ é a locação número 2 na pilha. Olhando o [opcode](https://www.evm.codes/#37), a locação número dois na pilha é o tamanho do dado em bytes. Olhando em outros opcodes do grupo Wcopy, [`CODECOPY`](https://www.evm.codes/#39) e [`RETURNDATACOPY`](https://www.evm.codes/#3e), eles também têm um tamanho de dado na mesma locação. Então,_⌈μs[2]÷32⌉_ é o número de 32 byte necessário para armazenar o dado sendo copiado. Colocando tudo junto, o custo herdado de [`CALLDATACOPY`](https://www.evm.codes/#37) é 3 gas mais 3 por palavra de dado sendo copiada. + +### Custo de execução {#running-cost} + +O custo de rodar o código que nós estamos chamando. + +- No caso do [`CREATE`](https://www.evm.codes/#f0) e [`CREATE2`](https://www.evm.codes/#f5), o construtor para o novo contrato. +- No caso do [`CALL`](https://www.evm.codes/#f1), [`CALLCODE`](https://www.evm.codes/#f2), [`STATICCALL`](https://www.evm.codes/#fa), ou [`DELEGATECALL`](https://www.evm.codes/#f4), o contrato que nós chamamos. + +### Expandindo o custo de memória {#expanding-memory-cost} + +O custo de expandir a memória (se necessário). + +Na equação 324, este valor é escrito como _Cmemi')-Cmemi)_. Olhando na seção 9.4.1 novamente, nós vemos que _μi_ é o número de palavras na memória. Então, _μi_ é o número de palavras na memória antes do opcode e _μi'_ é o número de palavras na memória depois do opcode. + +A função _Cmem_ é definida na equação 326: _Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋_. _⌊x⌋_ é a função floor, uma função que dado um valor, retorna o maior inteiro que ainda não é maior que o valor. Por exemplo, _⌊2.5⌋ = ⌊2⌋ = 2._ Quando_ a < √512_, _a2 < 512_, e o resultado da função floor é zero. Então para as primeiras 22 palavras (704 bytes), o custo sobe linearmente com o número de palavras na memória necessárias. Além desse ponto _⌊a2 ÷ 512⌋_ é positivo. Quando a memória necessária é grande o suficiente, o custo de gas é proporcional ao quadrado da quantidade de memória. + +**Note** que estes fatores somente influenciam o custo de gas _herdado_ - ele não leva em conta a taxa de mercado ou gorjetas aos validadores que determinam quanto um usuário final precisa pagar - isto é apenas o custo líquido de rodar uma operação particular na EVM. + +[Leia mais sobre gas](/developers/docs/gas/). + +## Ambiente de execução 9.3 {#93-execution-env} + +O ambiente de execução é uma tupla, _I_, que inclui informações que não são parte do estado do blockchain ou da EVM. + +| Parâmetro | Opcode para acessar o dado | Código Solidity para acessar o dado | +| --------------- | -------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | +| _Ia_ | [`ADDRESS`](https://www.evm.codes/#30) | `address(this)` | +| _Io_ | [`ORIGIN`](https://www.evm.codes/#32) | `tx.origin` | +| _Ip_ | [`GASPRICE`](https://www.evm.codes/#3a) | `tx.gasprice` | +| _Id_ | [`CALLDATALOAD`](https://www.evm.codes/#35), etc. | `msg.data` | +| _Is_ | [`CALLER`](https://www.evm.codes/#33) | `msg.sender` | +| _Iv_ | [`CALLVALUE`](https://www.evm.codes/#34) | `msg.value` | +| _Ib_ | [`CODECOPY`](https://www.evm.codes/#39) | `address(this).code` | +| _IH_ | Campos do cabeçalho do bloco, como [`NUMBER`](https://www.evm.codes/#43) e [`DIFFICULTY`](https://www.evm.codes/#44) | `block.number`, `block.difficulty`, etc. | +| _Ie_ | Profundidade da pilha de chamada para chamadas entre contratos (incluindo criação de contrato) | | +| _Iw_ | A EVM tem permissão de mudar de estado, ou está rodando estaticamente | | + +Alguns outros poucos parâmetros são necessários para entender o resto da seção 9: + +| Parâmetro | Definido na seção | Significado | +| --------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| _σ_ | 2 (p. 2, equação 1) | O estado do blockchain | +| _g_ | 9.3 (p. 13) | Gas remanescente | +| _A_ | 6.1 (p. 8) | Substrato acumulado (muda agendado para quando a transação termina) | +| _o_ | 9.3 (p. 13) | Saída - o resultado retornado no caso de transação interna (quando um contrato chama outro) e chamadas para funções view (quando você está apenas perguntando por informação, então não há necessidade de esperar pela transação) | + +## Visão geral da execução 9.4 {#94-execution-overview} + +Agora que temos todas as preliminares, nós podemos finalmente começar a trabalhar como a EVM trabalha. + +Equações 137-142 nos dá as condições iniciais para rodar a EVM: + +| Símbolo | Valor inicial | Significado | +| ---------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| _μg_ | _g_ | Gas remanescente | +| _μpc_ | _0_ | Contador do programa, o endereço da próxima instrução para executar | +| _μm_ | _(0, 0, ...)_ | Memória, inicializada toda com zeros | +| _μi_ | _0_ | Maior locação de memória usada | +| _μs_ | _()_ | A pilha, inicialmente vazia | +| _μo_ | _∅_ | O resultado, conjunto vazio até e, a não ser que nós paremos ou com os dados de retorno ([`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)) ou sem ele ([`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)). | + +A equação 143 nos conta que há quatro condições possíveis em cada ponto no tempo durante a execução, e o que fazer com elas: + +1. `Z(σ,μ,A,I)`. Z representa uma função que testa se uma operação cria uma transição de estado inválida (veja [parada excepcional](#942-exceptional-halting)). Se ele for avaliado para True, o novo estado é idêntico ao antigo (exceto o gas que foi queimado) porque as mudanças não foram implementadas. +2. Se o the opcode sendo executado é [`REVERT`](https://www.evm.codes/#fd), o novo estado é o mesmo que o antigo estado, algum gas é perdido. +3. Se a sequência de operações for finalizada, como significa um [`RETURN`](https://www.evm.codes/#f3)), o estado é atualizado para o novo estado. +4. Se não estivermos em uma das condições finais 1-3, continua rodando. + +## Estado da Máquina 9.4 {#941-machine-state} + +Esta seção explica o estado da máquina em maiores detalhes. Ela especifica que _w_ é o opcode atual. Se _μpc_ é menor que _||Ib||_, o tamanho do código, então aquele byte (_Ibpc]_) é o opcode. Caso contrário, o opcode é definido como [`STOP`](https://www.evm.codes/#00). + +Como esse é uma [máquina de pilha](https://en.wikipedia.org/wiki/Stack_machine), nós precisamos rastrear o número de itens que apareceram (_δ_) e empurraram em (_α_) por cada opcode. + +## Interrupção excepcional 9.4.2 {#942-exceptional-halt} + +Esta seção define a função _Z_, a qual especifica quando nós temos uma terminação anormal. Isto é uma função [booleana](https://en.wikipedia.org/wiki/Boolean_data_type), então ela usa [_∨_ para um ou lógico](https://en.wikipedia.org/wiki/Logical_disjunction) e [_∧_ para um e lógico](https://en.wikipedia.org/wiki/Logical_conjunction). + +Nós temos uma parada excepcional se qualquer destas condições for verdadeira: + +- **_μg < C(σ,μ,A,I)_** Como vimos na seção 9.2, _C_ é a função que especifica o custo de gas. Não há gas suficiente deixado para cobrir o próximo opcode. + +- **_δw=∅_** Se o número de itens que apareceram para um opcode é indefinido, então o opcode em si é indefinido. + +- **_|| μs || < δw_** Underflow de pilha, itens não suficientes na pilha para o opcode atual. + +- **_w = JUMP ∧ μs[0]∉D(Ib)_** O opcode é [`JUMP`](https://www.evm.codes/#56) e o endereço não é um [`JUMPDEST`](https://www.evm.codes/#5b). Saltos são _somente_ válidos quando o destino é um [`JUMPDEST`](https://www.evm.codes/#5b). + +- **_w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib)_** O opcode é [`JUMPI`](https://www.evm.codes/#57), a condição é verdadeira (não zero) então o salto pode acontecer, e o endereço não é um [`JUMPDEST`](https://www.evm.codes/#5b). Saltos são _somente_ válidos quando o destino é um [`JUMPDEST`](https://www.evm.codes/#5b). + +- **_w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo ||_** O opcode é [`RETURNDATACOPY`](https://www.evm.codes/#3e). Neste elemento da pilha de opcode _μs[1]_ é o offset de onde se lê no buffer de retorno de dados, e elemento da pilha _μs[2]_ é o tamanho do dado. A condição ocorre quando você tenta ler além do fim do buffer de dado de retorno. Note que não há uma condição similar para o calldata ou para o código ele mesmo. Quando você tentar ler além do fim destes buffers, você obtém somente zeros. + +- **_|| μs || - δw + αw > 1024_** + + Overflow de pilha. Se rodando o opcode resultar em uma pilha com mais de 1.024 itens, aborte. + +- **_¬Iw ∧ W(w,μ)_** Estamos rodando estaticamente ([¬ é negação](https://en.wikipedia.org/wiki/Negation) e_Iw_ é verdade quando nós somos permitidos mudar o estado do blockchain)? Se sim, e nós estamos tentando mudar o estado da operação, ela pode acontecer. + + A função _W(w,μ)_ é definida mais tarde na equação 150. _W(w,μ)_ é verdade se uma destas condições for verdadeira: + + - **_w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT}_** Estes opcodes mudando o estado, ou criando um novo contrato, armazenando valor, ou destruindo o contrato atual. + + - **_LOG0≤w ∧ w≤LOG4_** Se nãos formos chamados estaticamente, nós não podemos emitir entradas de log. Os opcodes de log estão todos na faixa entre [`LOG0` (A0)](https://www.evm.codes/#a0) e [`LOG4` (A4)](https://www.evm.codes/#a4). O número depois do opcode de log especifica quantos tópicos a entrada de log contém. + - **_w=CALL ∧ μs[2]≠0_** Você pode chamar um outro contrato quando você está estático, mas se você o fizer, você não pode transferir ETH para ele. + +- **_w = SSTORE ∧ μg ≤ Gcallstipend_** Você não pode rodar [`SSTORE`](https://www.evm.codes/#55) a não ser que você tenha mais que Gcallstipend (definido como 2300 no apêndice G) gas. + +## Validade do Destino do Salto 9.4.3 {#943-jump-dest-valid} + +Aqui nós definimos formalmente quais são os opcodes [`JUMPDEST`](https://www.evm.codes/#5b). Nós não podemos apenas procurar por valor de byte 0x5B, porque ele pode estar dentro de um PUSH (e, portanto, dado, não um opcode). + +Na equação (153) nós definimos a função, _N(i,w)_. O primeiro parâmetro, _i_, é a localização do opcode. A segunda, _w_, é o próprio opcode. Se _w∈[PUSH1, PUSH32]_ que significa que o opcode é um PUSH (colchetes definem uma faixa que inclui os endpoints). Se esse caso, o próximo opcode é em _i+2+(w−PUSH1)_. Para [`PUSH1`](https://www.evm.codes/#60) nós precisamos avançar dois bytes (o PUSH propriamente dito e o valor de um byte), para [`PUSH2`](https://www.evm.codes/#61) nós precisamos avançar três bytes porque é um valor de dois bytes, etc. Todos os outros opcodes EVM são apenas um byte de comprimento, então em todos os outros casos _N(i,w)=i+1_. + +Esta função é usada na equação (152) para definir _DJ(c,i)_, o qual é o [conjunto](https://en.wikipedia.org/wiki/Set_(mathematics)) de todos as destinações válidas de salto no código _c_, começando com a localização do opcode _i_. Esta função é definida recursivamente. Se _i≥||c||_, isto significa que nós estamos no fim do código ou depois dele. Nós não vamos descobrir mais nenhuma destinação de salto, então apenas retorna um conjunto vazio. + +Em todos os outros casos nós estamos olhando no resto do código indo para o próximo opcode e obtendo o conjunto iniciando dele. _c[i]_ é o opcode atual, então _N(i,c[i])_ é a localização do próximo opcode. _DJ(c,N(i,c[i]))_ é portanto o conjunto de destinos válidos de jump que começa no próximo opcode. Se o opcode atual não é um`JUMPDEST`, apenas retorne aquele conjunto. Se ele é `JUMPDEST`, inclua-o no conjunto de resultado e retorne-o. + +## Parada normal 9.4.4 {#944-normal-halt} + +A função halting _H_, pode retornar três tipos de valores. + +- Se nós não estivermos em um opcode halt, retorne _∅_, o conjunto vazio. Por convenção, este valor é interpretado como o falso booleano. +- Se nós temos um opcode halt que não produz saída (seja um [`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)), retorna uma sequência de tamanho zero bytes como valor de retorno. Note que isto é muito diferente do conjunto vazio. Este valor significa que a EVM realmente parou, apenas não há dados de retorno para ler. +- Se nós tivermos um opcode de halt que produz sim saída (seja [`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)), retorna a sequência de bytes especificada por este opcode. Esta sequência é pega da memória, o valor no topo da pilha (_μs[0]_) é o primeiro byte, e o valor depois dele (_μs[1]_) é o comprimento. + +## Conjunto de instruções H.2 {#h2-instruction-set} + +Antes de nós irmos para a subseção final da EVM, 9.5, vamos ver as instruções propriamente ditas. Elas estão definidas no apêndice H.2 que começa na página 29. Qualquer coisa que não esteja especificada como mudança com este específico opcode é esperada que continue o mesmo. Variáveis que realmente mudam são especificadas como \′. + +Por exemplo, vamos olhar o opcode [`ADD`](https://www.evm.codes/#01). + +| Valor | Mnemônico | δ | α | Descrição | +| -----:| --------- | - | - | --------------------------------------------------------- | +| 0x01 | ADD | 2 | 1 | Operação adição. | +| | | | | _μ′s[0] ≡ μs[0] + μs[1]_ | + +_δ_ é o número de valores que nós pegamos da pilha. Neste caso dois, porque nós estamos adicionando no topo dois valores. + +_α_ é o número de valores que nós retrocedemos. Neste caso um, a soma. + +Então o novo topo da pilha (_μ′s[0]_) é a soma do velho topo da pilha (_μs[0]_) e o velho valor abaixo dele (_μs[1]_). + +Ao invés de passar por todos os opcodes com olhos vidrados na lista, este artigo explica somente aqueles opcodes que introduzem algo novo. + +| Valor | Mnemônico | δ | α | Descrição | +| -----:| --------- | - | - | ---------------------------------------------------------------------------------------------------------- | +| 0x20 | KECCAK256 | 2 | 1 | Computa o hash Keccak-256. | +| | | | | _μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])_ | +| | | | | _μ′i ≡ M(μis[0],μs[1])_ | + +Este é o primeiro opcode que acessa memória (nesse caso, somente leitura). Entretanto, ele pode expandir além dos limites atuais de memória, portanto nós precisamos atualizar _μi._ Nós fazemos isso usando a função _M_ definida na equação 328 na pág. 29. + +| Valor | Mnemônico | δ | α | Descrição | +| -----:| --------- | - | - | ---------------------------- | +| 0x31 | BALANCE | 1 | 1 | Obtém o saldo de dada conta. | +| | | | | ... | + +O endereço destes saldos que nós precisamos encontrar é _μs[0] mod 2160_. O topo da pilha é o endereço, mas por endereços serem somente 160 bits, nós calculamos o valor [modulo](https://en.wikipedia.org/wiki/Modulo_operation) 2160. + +Se _σ[μs[0] mod 2160] ≠ ∅_, isto significa que há informação sobre este endereço. Neste caso, _σ[μs[0] mod 2160]b_ é o saldo para aquele endereço. Se _σ[μs[0] mod 2160] = ∅_, significa que este endereço não está inicializado e que o saldo é zero. Você pode ver a lista de campos de informações de contas na seção 4.1 na página 4. + +A segunda equação, _A'a ≡ Aa ∪ {μs[0] mod 2160}_, é relacionada com a diferença no custo entre acesso à warm storage (storage que foi recenteimente acessada e é provável que esteja em cache) e cold storage (storage que não tem sido acessada e provavelmente esteja em uma storage mais lenta, que é mais cara para se recuperar). _Aa_ é a lista de endereços previamente acessados pela transação, que deveria, portanto ser de acesso mais barato, como definido na seção 6.1 na página 8. Você pode ler mais sobre este assunto em [EIP-2929](https://eips.ethereum.org/EIPS/eip-2929). + +| Valor | Mnemônico | δ | α | Descrição | +| -----:| --------- | -- | -- | --------------------------------------- | +| 0x8F | DUP16 | 16 | 17 | Duplica o 16o item da pilha. | +| | | | | _μ′s[0] ≡ μs[15]_ | + +Note que para usar qualquer item da pilha, nós precisamos pegá-lo, o que significa que nós também precisamos pegar todos os itens da pilha acima dele. No caso de [`DUP`](https://www.evm.codes/#8f) e [`SWAP`](https://www.evm.codes/#9f), isto significa ter que pegar e então empurrar os dezesseis valores. + +## O ciclo de execução 9.5 {#95-exec-cycle} + +Agora que nós temos todas as partes, nós podemos finalmente entender como o ciclo de execução da EVM é documentado. + +A equação (155) diz que dado o estado: + +- _σ_ (estado global do blockchain) +- _μ_ (estado da EVM) +- _A_ (sub-estado, mudanças a acontecer quando a transação terminar) +- _I_ (ambiente de execução) + +O novo estado é _(σ', μ', A', I')_. + +Equações (156)-(158) definem a pilha e a mudança nela devido a um opcode (_μs_). Equação (159) é a mudança em gas (_μg_). Equação (160) é a mudança no contador do programa (_μpc_). Finalmente, equações (161)-(164) especificam que os outros parâmetros continuam iguais, salvo explicitamente mudados pelo opcode. + +Com isto, a EVM está totalmente definida. + +## Conclusão {#conclusion} + +Notação matemática é precisa e tem permitido o Yellow Paper especificar cada detalhe do Ethereum. Entretanto, ela tem realmente algumas desvantagens: + +- Ela só pode ser entendida por humanos, o que significa que [testes de conformidade](https://github.com/ethereum/tests) devem ser escritos manualmente. +- Programadores entendem código de computador. Eles podem ou não entender notação matemática. + +Talvez por estas razões, a mais nova [especificação da camada de consenso](https://github.com/ethereum/consensus-specs/blob/dev/tests/core/pyspec/README.md) seja escrita em Python. Estas são [especificações da camada de execução em Python](https://ethereum.github.io/execution-specs), mas elas não estão completas. Até que, ou a não ser que, o Yellow Paper inteiro esteja também traduzido para Python ou linguagem similar, o Yellow Paper continuará em serviço, e é útil ser capaz de lê-lo. diff --git a/public/content/translations/pt-br/enterprise/index.md b/public/content/translations/pt-br/enterprise/index.md index 06041f03963..55796b31763 100644 --- a/public/content/translations/pt-br/enterprise/index.md +++ b/public/content/translations/pt-br/enterprise/index.md @@ -57,11 +57,13 @@ Diversas organizações trabalharam juntas para tornar o Ethereum amigável para - O [Hyperledger Besu](https://www.hyperledger.org/use/besu) _é um cliente Ethereum de código aberto desenvolvido sob licença Apache 2.0 e escrito em Java_ - O [Infura](https://infura.io/) _é uma API escalável de acesso às redes Ethereum e IPFS_ - O [Kaleido](https://kaleido.io/) _é uma plataforma de desenvolvimento focada em empresas que oferece uma cadeia de blocos simplificada e aplicativos de ativos digitais_ +- [NodeReal](https://nodereal.io/) _fornece infraestrutura de blockchain escalável e a API do provedor de serviços para o ecossistema Web3_ - O [Provide](https://provide.services/) _fornece infraestrutura e APIs para aplicativos Web3 para empresas_ - O [QuickNode](https://www.quicknode.com/) _fornece nós confiáveis e rápidos com APIs de alto nível como NFT API, Token API, entre outras, enquanto entrega um pacote unificado de produtos e soluções de nível empresarial_ - [Tenderly](https://tenderly.co) _é uma plataforma de desenvolvimento Web3 que fornece blocos de depuração de infraestrutura, observação e construção para desenvolvimento, teste, monitoramento e operação de contratos inteligentes_ - A [Unibright](https://unibright.io/) _é uma equipe de especialistas, arquitetos, desenvolvedores e consultores da blockchain, com mais de 20 anos de experiência em processos de negócios e integração_ - [Zero Services GmbH](https://www.zeroservices.eu/) _é um provedor de serviços gerenciados espalhado por locais compartilhados na Europa e na Ásia. Opera e monitora seus nós de forma segura e confiável_ +- [Zeeve](https://www.zeeve.io/) _fornece uma variedade de produtos e ferramentas de criação no Ethereum, além de infraestrutura e APIs para aplicativos Web3 para empresas._ ### Ferramentas e bibliotecas {#tooling-and-libraries} diff --git a/public/content/translations/pt-br/enterprise/private-ethereum/index.md b/public/content/translations/pt-br/enterprise/private-ethereum/index.md index cafab5463b4..88829be24b7 100644 --- a/public/content/translations/pt-br/enterprise/private-ethereum/index.md +++ b/public/content/translations/pt-br/enterprise/private-ethereum/index.md @@ -25,3 +25,4 @@ Diversas organizações trabalharam juntas para tornar o Ethereum amigável para - [Hyperledger Burrow](https://www.hyperledger.org/projects/hyperledger-burrow) _cliente de cadeia de blocos modular com um intérprete de contratos inteligentes autorizados, parcialmente desenvolvido para a especificação da Máquina Virtual do Ethereum (EVM)_ - [Kaleido](https://kaleido.io/) _ é uma plataforma de pilha completa para construção e execução de ecossistemas empresariais multinuvem e híbridos_ - [Quorum](https://consensys.net/quorum/) _ é uma plataforma de cadeia de blocos para empresas de código aberto baseada em Ethereum, com recursos avançados de nível empresarial, oferecendo privacidade, permissões e desempenho_ +- [Zeeve](https://www.zeeve.io/) _fornece uma variedade de produtos e ferramentas de criação no Ethereum, além de infraestrutura e APIs para aplicativos Web3 para empresas_ diff --git a/public/content/translations/pt-br/foundation/index.md b/public/content/translations/pt-br/foundation/index.md index 42fa4af0da1..f2c680d4287 100644 --- a/public/content/translations/pt-br/foundation/index.md +++ b/public/content/translations/pt-br/foundation/index.md @@ -27,7 +27,7 @@ Desde 2014, a Fundação Ethereum organiza a Devcon, uma conferência anual para Você pode acessar todo o conteúdo de vídeo das conferências de cada ano em [archive.devcon.org](https://archive.devcon.org/). -Saiba mais em [devcon.org](https://devcon.org/), confira o [Blog da Devcon](https://devcon.org/en/blogs/) ou siga [@efdevcon](https://twitter.com/EFDevcon) para ler os últimos comunicados. +Saiba mais em [devcon.org](https://devcon.org/), confira o [Blog da Devcon](https://blog.ethereum.org/category/devcon/) ou siga [@efdevcon](https://twitter.com/EFDevcon) para ler os últimos comunicados. ### Programa de Bolsas {#fellowship-program} diff --git a/public/content/translations/pt-br/roadmap/account-abstraction/index.md b/public/content/translations/pt-br/roadmap/account-abstraction/index.md index 8394e092bb5..ded45b7278c 100644 --- a/public/content/translations/pt-br/roadmap/account-abstraction/index.md +++ b/public/content/translations/pt-br/roadmap/account-abstraction/index.md @@ -32,7 +32,7 @@ Se você perder as suas chaves, elas não poderão ser recuperadas, e as chaves As carteiras de contratos inteligentes são a solução para esses problemas, mas atualmente são difíceis de programar porque, no final, qualquer lógica que elas implementem precisa ser traduzida em um conjunto de transações EOA antes que possam ser processadas pelo Ethereum. A abstração de conta permite que contratos inteligentes iniciem as próprias transações. Dessa forma, qualquer lógica que o usuário queira implementar poderá ser codificada na própria carteira de contrato inteligente e executada no Ethereum. -Em última análise, a abstração de contas melhora o suporte a carteiras de contratos inteligentes, tornando-as mais fáceis de criar e mais seguras de usar. No final, com a abstração de conta, os usuários podem aproveitar todos os benefícios do Ethereum sem precisar conhecer ou se preocupar com a tecnologia subjacente. +Na realidade, é a abstração de contas que melhora o suporte a carteiras de contratos inteligentes, tornando-as mais fáceis de criar e mais seguras de usar. No final, com a abstração de conta, os usuários podem aproveitar todos os benefícios do Ethereum sem precisar conhecer ou se preocupar com a tecnologia subjacente. ## Além das frases sementes {#beyond-seed-phrases} @@ -47,8 +47,8 @@ Por exemplo, as chaves de backup podem ser adicionadas a uma carteira para que, - **Autorização multisig**: você pode compartilhar credenciais de autorização entre várias pessoas ou dispositivos confiáveis. Em seguida, o contrato pode ser configurado de modo que as transações superiores a um valor predefinido exijam autorização de uma proporção específica (por exemplo, 3/5) das partes confiáveis. Por exemplo, transações de alto valor podem exigir a aprovação de um dispositivo móvel e de uma carteira de hardware, ou assinaturas de contas distribuídas a familiares confiáveis. - **Congelamento de conta**: se um dispositivo for perdido ou comprometido, a conta pode ser bloqueada a partir de outro dispositivo autorizado, protegendo os ativos do usuário. - **Recuperação de conta**: perdeu um dispositivo ou esqueceu uma senha? No paradigma atual, isso significa que os seus ativos podem ser congelados para sempre. Com uma carteira de contrato inteligente, você pode definir algumas contas pré-aprovadas que podem autorizar novos dispositivos e redefinir o acesso. -- **Definir limites de transação**: especifique limites diários de quanto valor pode ser transferido da conta em um dia/semana/mês. Isso significa que, se um invasor obtiver acesso à sua conta, ele não poderá ficar com tudo de uma vez e você terá oportunidades de congelar e redefinir o acesso. -- **Criar listas de permissões**: permita transações apenas para endereços específicos, que você sabe que são seguros. Isso significa que, _mesmo_ em caso de roubo da sua chave privada, o invasor não poderia enviar fundos para contas de destino não autorizadas. Essas listas de permissão exigiriam várias assinaturas para alterá-las, de modo que um invasor não poderia adicionar o endereço dele à lista, a menos que tivesse acesso a diversas das suas chaves de backup. +- **Definição de limites de transações**: especifique limites diários de transferência de valores da conta em um dia/semana/mês. Isso significa que, se um invasor obtiver acesso à sua conta, ele não poderá ficar com tudo de uma vez e você terá oportunidades de congelar e redefinir o acesso. +- **Criação de listas de permissões**: só permita transações para determinados endereços tidos como seguros. Isso significa que, _mesmo_ em caso de roubo da sua chave privada, o invasor não poderia enviar fundos para contas de destino não autorizadas. Essas listas de permissão exigiriam várias assinaturas para alterá-las, de modo que um invasor não poderia adicionar o endereço dele à lista, a menos que tivesse acesso a diversas das suas chaves de backup. ## Melhor experiência do usuário {#better-user-experience} diff --git a/public/content/translations/pt-br/roadmap/index.md b/public/content/translations/pt-br/roadmap/index.md index 22cdf38bada..3bab123ac1c 100644 --- a/public/content/translations/pt-br/roadmap/index.md +++ b/public/content/translations/pt-br/roadmap/index.md @@ -3,7 +3,7 @@ title: Planejamento Ethereum description: O caminho para mais escalabilidade, segurança e sustentabilidade no Ethereum. lang: pt-br template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Planejamento Ethereum" summaryPoints: buttons: @@ -59,7 +59,7 @@ O Ethereum recebe melhorias regulares que aprimoram a escalabilidade, a seguran -O planejamento é, em grande parte, o resultado de anos de trabalho de pesquisadores e desenvolvedores, pois o protocolo é muito técnico, mas qualquer pessoa motivada pode participar. As ideias geralmente começam como discussões em um fórum, como [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) ou no servidor Eth R&D no Discord. Elas podem ser respostas a novas vulnerabilidades constatadas, sugestões de organizações que trabalham na camada de aplicativos (como dApps e corretoras) ou de atritos conhecidos junto a usuários finais (como custos ou velocidades de transação). Quando essas ideias amadurecem, elas podem ser apresentadas como [Propostas de melhorias do Ethereum] (https://eips.ethereum.org/). Tudo isso é feito abertamente, e qualquer pessoa da comunidade pode dar sua opinião, a qualquer momento. +O planejamento é, em grande parte, o resultado de anos de trabalho de pesquisadores e desenvolvedores, pois o protocolo é muito técnico, mas qualquer pessoa motivada pode participar. As ideias geralmente começam como discussões em um fórum, como [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://ethereum-magicians.org) ou no servidor Eth R&D no Discord. Elas podem ser respostas a novas vulnerabilidades constatadas, sugestões de organizações que trabalham na camada de aplicativos (como dApps e corretoras) ou de atritos conhecidos junto a usuários finais (como custos ou velocidades de transação). Quando essas ideias amadurecem, elas podem ser apresentadas como [Propostas de melhorias do Ethereum] (https://eips.ethereum.org/). Tudo isso é feito abertamente, e qualquer pessoa da comunidade pode dar sua opinião, a qualquer momento. [Mais sobre a governança do Ethereum](/governance/) diff --git a/public/content/translations/pt-br/roadmap/single-slot-finality/index.md b/public/content/translations/pt-br/roadmap/single-slot-finality/index.md index 56a8f504565..da52f022deb 100644 --- a/public/content/translations/pt-br/roadmap/single-slot-finality/index.md +++ b/public/content/translations/pt-br/roadmap/single-slot-finality/index.md @@ -37,7 +37,7 @@ Com o design do mecanismo atual, para reduzir o tempo de finalização, é neces O mecanismo de consenso atual combina atestações de diversos validadores, conhecidos como "comitês", para reduzir o número de mensagens que cada validador precisa processar para validar um bloco. Cada validador tem a oportunidade de atestar em cada época (32 espaços), mas em cada espaço, apenas um subconjunto de validadores, conhecido como uma atestação de "comitê". Eles fazem isso ao se dividir em sub-redes, nas quais alguns validadores são selecionados para serem "agregadores". Esses agregadores combinam, em uma única assinatura agregada, todas as assinaturas que observam de outros validadores na respectiva sub-rede. O agregador que inclui o maior número de contribuições individuais passa a assinatura agregada ao proponente do bloco, que a inclui no bloco juntamente com a assinatura agregada dos demais comitês. -Esse processo oferece capacidade suficiente para cada validador votar em cada época, porque "32 espaços _ 64 comitês _ 256 validadores por comitê = 524.288 validadores por época". No momento da redação deste artigo (fevereiro de 2023), há aproximadamente 513.000 validadores ativos. +Esse processo oferece capacidade suficiente para cada validador votar em cada época, porque "32 espaços * 64 comitês * 256 validadores por comitê = 524.288 validadores por época". No momento da redação deste artigo (fevereiro de 2023), há aproximadamente 513.000 validadores ativos. Nesse esquema, só é possível que cada validador vote em um bloco se distribuir as respectivas atestações por toda a época. Entretanto, há potencialmente maneiras de aprimorar o mecanismo para que _cada validador tenha a chance de atestar em cada espaço_. diff --git a/public/content/translations/pt-br/roadmap/statelessness/index.md b/public/content/translations/pt-br/roadmap/statelessness/index.md index 4b19b709a66..56fc288c4f5 100644 --- a/public/content/translations/pt-br/roadmap/statelessness/index.md +++ b/public/content/translations/pt-br/roadmap/statelessness/index.md @@ -66,7 +66,7 @@ Sem estado fraco envolve alterações na maneira como os nós Ethereum verificam **Em sem estado fraco, propor blocos exige acesso a dados de estado completos, mas verificar blocos não exige dados do estado** -Para que isso aconteça, [Verkle Trees](/roadmap/verkle-trees) já devem ter sido implementadas nos clientes Ethereum. As Verkle Trees são uma estrutura de dados de substituição para armazenar dados de estado do Ethereum que permitem que "testemunhas" pequenas e de tamanho fixo dos dados sejam transmitidas entre pares e utilizadas para verificar blocos, em vez de verificar blocos com relação aos bancos de dados locais. A [separação entre proponente e construtor](/roadmap/pbs/) também é necessária, porque isso permite que os construtores de blocos sejam nós especializados com hardware mais poderoso, e esses são os que exigem acesso aos dados de estado completos. +Para que isso aconteça, [Verkle Trees](/roadmap/verkle-trees/) já devem ter sido implementadas nos clientes Ethereum. As Verkle Trees são uma estrutura de dados de substituição para armazenar dados de estado do Ethereum que permitem que "testemunhas" pequenas e de tamanho fixo dos dados sejam transmitidas entre pares e utilizadas para verificar blocos, em vez de verificar blocos com relação aos bancos de dados locais. A [separação entre proponente e construtor](/roadmap/pbs/) também é necessária, porque isso permite que os construtores de blocos sejam nós especializados com hardware mais poderoso, e esses são os que exigem acesso aos dados de estado completos. @@ -81,7 +81,7 @@ O conceito "sem estado fraco" está em um estado avançado de pesquisa, mas depe ### Sem estado forte {#strong-statelessness} -O conceito "sem estado forte" remove a necessidade de armazenamento de dados do estado por qualquer bloco. Em vez disso, as transações são enviadas com testemunhas que podem ser agregadas pelos produtores de blocos. Portanto, os produtores de blocos serão responsáveis por armazenar apenas o estado necessário para gerar testemunhas para as contas relevantes. A responsabilidade pelo estado é quase totalmente transferida para os usuários, pois eles enviam testemunhas e "listas de acesso" para declarar com quais contas e chaves de armazenamento estão interagindo. +O conceito "sem estado forte" remove a necessidade de armazenamento de dados do estado por qualquer bloco. Em vez disso, as transações são enviadas com testemunhas que podem ser agregadas pelos produtores de blocos. Portanto, os produtores de blocos serão responsáveis por armazenar apenas o estado necessário para gerar testemunhas para as contas relevantes. A responsabilidade pelo estado é quase totalmente transferida para os usuários, pois eles enviam testemunhas e "listas de acesso" para declarar com quais contas e chaves de armazenamento estão interagindo. Embora isso permitiria nódulos altamente leves, seria mais difícil realizar trtansações conm contratos inteligentes. O conceito "sem estado forte" foi investigado por pesquisadores, mas atualmente não se espera que faça parte do planejamento do Ethereum. É mais provável que o sem estado fraco seja suficiente para as necessidades de escalabilidade do Ethereum. diff --git a/public/content/translations/pt-br/whitepaper/index.md b/public/content/translations/pt-br/whitepaper/index.md index 51924a1ce68..cc27215b19e 100644 --- a/public/content/translations/pt-br/whitepaper/index.md +++ b/public/content/translations/pt-br/whitepaper/index.md @@ -3,6 +3,7 @@ title: Whitepaper sobre o Ethereum description: Um documento de introdução ao Ethereum, publicado em 2013 antes de seu lançamento. lang: pt-br sidebarDepth: 2 +hideEditButton: true --- # Whitepaper do Ethereum {#ethereum-whitepaper} @@ -11,7 +12,7 @@ _Este artigo de introdução foi publicado em 2014 por Vitalik Buterin, o fundad _Apesar de já terem se passado alguns anos desde sua publicação, nós o mantivemos porque ele continua a ser uma referência útil e uma autêntica representação do Ethereum e de sua visão. Para aprender sobre os desenvolvimentos mais recentes do Ethereum e como as mudanças no protocolo são feitas, recomendamos [este manual](/learn/)._ -[Abra o whitepaper do Ethereum em PDF](./whitepaper-pdf/Ethereum_Whitepaper_-_Buterin_2014.pdf) +[Pesquisadores e acadêmicos que buscam uma versão histórica ou uma versão canônica do whitepaper [de Dezembro de 2014] devem usar este PDF.](./whitepaper-pdf/Ethereum_Whitepaper_-_Buterin_2014.pdf) ## Uma nova geração de contrato inteligente e plataforma de aplicativos descentralizada {#a-next-generation-smart-contract-and-decentralized-application-platform} @@ -134,7 +135,7 @@ Mesmo sem nenhuma extensão, o protocolo Bitcoin realmente facilita uma versão No entanto, o idioma de scripting conforme implementado no Bitcoin tem várias limitações importantes: - **A falta de completude de Turing** - ou seja, embora haja um grande subconjunto de computação que a linguagem de script de Bitcoin suporta, ele nem de perto suporta tudo. A principal categoria que está faltando são laços (loops). Isso é feito para evitar loops infinitos durante a verificação da transação. Teoricamente é um obstáculo para programadores de script, já que qualquer loop pode ser simulado simplesmente repetindo o código, muitas vezes com uma instrução if, mas leva a scripts que são muito ineficientes em termos de espaço. Por exemplo, a implementação de um algoritmo alternativo de assinatura de curva elíptica provavelmente exigiria 256 rodadas de multiplicação repetidas, todas incluídas individualmente no código. -- **Valor blindado** - não há como um script UTXO fornecer controle fino sobre o valor que pode ser sacado. Por exemplo, um caso de uso poderoso de um contrato Oracle seria um contrato de hedge, em que A e B colocam BTC 1000 e, após 30 dias, o script envia BTC 1000 para A e o restante para B. Isto exigiria um Oracle para determinar o valor de BTC 1 em USD, mesmo assim é uma grande melhoria em termos de confiança e requisitos de infraestrutura em relação às soluções totalmente centralizadas que estão disponíveis agora. No entanto, como UTXOs são tudo ou nada, a única maneira de conseguir isso é com o hack muito ineficiente de ter muitos UTXO de denominações variadas (por exemplo, um UTXO de 2k para todo k até 30) e fazendo com que O escolha qual UTXO enviar para A e qual para B. +- **Valor blindado** - não há como um script UTXO fornecer controle fino sobre o valor que pode ser sacado. Por exemplo, um caso de uso poderoso de um contrato Oracle seria um contrato de hedge, em que A e B colocam BTC 1000 e, após 30 dias, o script envia BTC 1000 para A e o restante para B. Isto exigiria um Oracle para determinar o valor de BTC 1 em USD, mesmo assim é uma grande melhoria em termos de confiança e requisitos de infraestrutura em relação às soluções totalmente centralizadas que estão disponíveis agora. No entanto, como os UTXO são tudo ou nada, a única forma de alcançar isso é através do hack muito ineficiente de ter muitos UTXO de denominações variadas (por exemplo, um UTXO de 2k para cada k até 30) e fazer com que o oráculo escolha qual UTXO enviar para A e qual para B. - **Falta de estado** - UTXOs podem ser gastos ou não. Contratos multiestados ou scripts que mantenham qualquer outro estado interno além disso não são possíveis. Isso dificulta a criação de contratos de opções multiestados, ofertas de troca descentralizadas ou protocolos de compromisso criptográfico de dois estágios (necessários para recompensas computacionais seguras). Isso também significa que o UTXO só pode ser usado para construir contratos pontuais simples e não contratos "com estado" mais complexos (como organizações descentralizadas) torna os meta-protocolos difíceis de implementar. O estado binário combinado com o valor blindado também significa que a importante aplicação de limites de retirada é possível. - **Blockchain blindada** - o UTXO é blindado para os dados de blockchain, como nonce, carimbos de tempo e hashes de blocos anteriores. Isto limita extremamente as aplicações em jogos de azar e várias outras categorias, privando a linguagem de script de uma fonte potencialmente valiosa de aleatoriedade. @@ -229,7 +230,7 @@ O código nos contratos Ethereum é escrito em linguagem bytecode "stack-based" O código também pode acessar o valor, o remetente e os dados da mensagem entrante, bem como os dados do cabeçalho do bloco. Ele também pode retornar um array de bytes como resultado. -O modelo de execução formal do código EVM é bem simples. Enquanto a máquina virtual Ethereum está em execução, seu estado computacional completo pode ser definido pela tupla `(block_state, transaction, message, code, memory, stack, pc, gas)`, em que `block_state` é o estado global que contém todas as contas e inclui saldos e armazenamento. No início de cada rodada de execução, a instrução atual é encontrada pegando o `pc`ésimo byte de `code` (ou 0 se `pc >= len(code)`), e cada instrução tem sua própria definição em termos de como ela afeta a tupla. Por exemplo, `ADD` retira dois itens do stack e adiciona a soma deles, reduz `gas` em 1, incrementa `pc` em 1 e `SSTORE` retira os dois itens do stack, finalmente insere o segundo item no armazenamento do contrato no índice especificado pelo primeiro item. Embora existam muitas maneiras de otimizar a execução da máquina virtual Ethereum por meio de compilação just-in-time, a implementação básica do Ethereum pode ser feita com poucas centenas de linhas de código. +O modelo de execução formal do código EVM é bem simples. Enquanto a máquina virtual Ethereum está em execução, seu estado computacional completo pode ser definido pela tupla `(block_state, transaction, message, code, memory, stack, pc, gas)`, em que `block_state` é o estado global que contém todas as contas e inclui saldos e armazenamento. No início de cada rodada de execução, a instrução atual é encontrada pegando o `pc`ésimo byte de `code` (ou 0 se `pc >= len(code)`), e cada instrução tem sua própria definição em termos de como ela afeta a tupla. Por exemplo, `ADD` retira dois itens da pilha e coloca sua soma, reduz o `gás` em 1 e incrementa o `pc` em 1 e o ` SSTORE` remove os dois primeiros itens da pilha e insere o segundo item no armazenamento do contrato, no índice especificado pelo primeiro item. Embora existam muitas maneiras de otimizar a execução da máquina virtual Ethereum por meio de compilação just-in-time, a implementação básica do Ethereum pode ser feita com poucas centenas de linhas de código. ### Blocos e mineração {#blockchain-and-mining} @@ -314,7 +315,7 @@ Um esboço geral de como codificar uma DAO é o seguinte: o design mais simples - `[1,i]` para registrar um voto a favor da proposta `i` - `[2,i]` para finalizar a proposta `i` se houver votos suficientes -O contrato teria, então, cláusulas para cada uma dessas transações. Ele manteria um registro de todas as mudanças no armazenamento aberto, e uma lista de quem votou nelas. Haveria também uma lista de todos os membros. Quando qualquer alteração de armazenamento chega a dois terços dos membros votando nela, uma transação finalizada poderia executar a mudança. Um esqueleto mais sofisticado também teria capacidade de votação integrada para recursos como enviar uma transação, adicionar e remover membros e poderia até fornecer delegação de votos no estilo [democracia líquida](https://wikipedia.org/wiki/Delegative_democracy), em que qualquer um pode designar alguém para votar em seu lugar, e a designação é transitiva: se A designa B e B designa C, então C determina o voto de A. Este desenho faria a DAO crescer de forma orgânica como comunidade descentralizada, permitindo que pessoas eventualmente delegassem a tarefa de filtrar quem é um membro a especialistas, diferente do "sistema atual" em que especialistas podem aparecer e desaparecer ao longo do tempo à medida que os membros individuais da comunidade mudam seus alinhamentos. +O contrato teria, então, cláusulas para cada uma dessas transações. Ele manteria um registro de todas as mudanças no armazenamento aberto, e uma lista de quem votou nelas. Haveria também uma lista de todos os membros. Quando qualquer alteração de armazenamento chega a dois terços dos membros votando nela, uma transação finalizada poderia executar a mudança. Um esqueleto mais sofisticado também teria a capacidade de votação integrada para recursos, como enviar uma transação, adicionar e remover membros, e poderia até fornecer uma delegação de votos no estilo [Democracia Líquida](https://wikipedia.org/wiki/Liquid_democracy) (ou seja, qualquer pessoa pode designar alguém para votar em seu lugar, e a designação é transitiva: se A designa B e B designa C, então C determina o voto de A). Este desenho faria a DAO crescer de forma orgânica como comunidade descentralizada, permitindo que pessoas eventualmente delegassem a tarefa de filtrar quem é um membro a especialistas, diferente do "sistema atual" em que especialistas podem aparecer e desaparecer ao longo do tempo à medida que os membros individuais da comunidade mudam seus alinhamentos. Um modelo alternativo seria o de empresa descentralizada, onde qualquer conta pode ter zero ou mais ações, e dois terços das ações são necessários para se tomar uma decisão. Um esqueleto completo envolveria a funcionalidade de gerenciamento de ativos, a capacidade de fazer uma oferta de compra ou venda de ações, e a capacidade de aceitar ofertas (de preferência com um mecanismo de correspondência de pedidos dentro do contrato). A delegação também existiria no estilo democracia líquida, generalizando o conceito de "conselho de administração". @@ -501,15 +502,15 @@ O conceito de uma função de transição de estado arbitrária implementada pel 10. [Whitepaper sobre moedas coloridas](https://docs.google.com/a/buterin.com/document/d/1AnkP_cVZTCMLIzw4DvsW6M8Q2JC0lIzrTLuoWu2z1BE/edit) 11. [Whitepaper sobre Mastercoin](https://github.com/mastercoin-MSC/spec) 12. [Empresas autônomas descentralizadas, Bitcoin Magazine](http://bitcoinmagazine.com/7050/bootstrapping-a-decentralized-autonomous-corporation-part-i/) -13. [Verificação de pagamento simplificado](https://en.bitcoin.it/wiki/Scalability#Simplifiedpaymentverification) +13. [Verificação de pagamento simplificado](https://en.bitcoin.it/wiki/Scalability#Simplified_payment_verification) 14. [Árvores de Merkle](https://wikipedia.org/wiki/Merkle_tree) 15. [Árvores Patricia](https://wikipedia.org/wiki/Patricia_tree) 16. [GHOST](https://eprint.iacr.org/2013/881.pdf) 17. [StorJ e agentes autónomos, Jeff Garzik](http://garzikrants.blogspot.ca/2013/01/storj-and-bitcoin-autonomous-agents.html) -18. [Mike Hearn fala sobre propriedades inteligentes no Festival de Turing](http://www.youtube.com/watch?v=Pu4PAMFPo5Y) +18. [Mike Hearn fala sobre propriedades inteligentes no Festival de Turing](https://www.youtube.com/watch?v=MVyv4t0OKe4) 19. [Ethereum RLP](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP) 20. [Árvores Ethereum Merkle Patricia](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-Patricia-Tree) -21. [Pedro Todd sobre árvores da soma Merkle](http://sourceforge.net/p/bitcoin/mailman/message/31709140/) +21. [Pedro Todd sobre árvores da soma Merkle](https://web.archive.org/web/20140623061815/http://sourceforge.net/p/bitcoin/mailman/message/31709140/) _Para a história do whitepaper, veja [esta wiki](https://github.com/ethereum/wiki/blob/old-before-deleting-all-files-go-to-wiki-wiki-instead/old-whitepaper-for-historical-reference.md)._ diff --git a/src/intl/pt-br/common.json b/src/intl/pt-br/common.json index 521721f4b67..9b36306b79e 100644 --- a/src/intl/pt-br/common.json +++ b/src/intl/pt-br/common.json @@ -1,7 +1,16 @@ { + "about-ethereum-org": "Sobre ethereum.org", + "about-us": "Quem somos", + "adding-desci-projects": "Adicionar projetos DeSci", + "adding-developer-tools": "Adicionando ferramentas de desenvolvedor", + "adding-exchanges": "Adicionando corretoras", + "adding-glossary-terms": "Adicionando termos do glossário", + "adding-layer-2s": "Adicionando Camada 2S", + "adding-products": "Adicionando produtos", + "adding-staking-products": "Sobre nós", + "adding-wallets": "Adicionando carteiras", "account-abstraction": "Abstração de conta", - "about-ethereum-org": "Sobre o ethereum.org", - "about-us": "Sobre nós", + "acknowledgements": "Agradecimentos", "aria-toggle-search-button": "Alternar botão de pesquisa", "aria-toggle-menu-button": "Alternar botão de menu", "beacon-chain": "Beacon Chain", @@ -12,6 +21,8 @@ "community-hub": "Centro comunitário", "community-menu": "Comunidade", "contact": "Contato", + "content-buckets": "Sobre nós", + "content-resources": "Recursos de conteúdo", "content-standardization": "Padronização do conteúdo", "contributing": "Contribuições", "contributors": "Colaboradores", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Redes sociais descentralizadas", "decentralized-science": "Ciência descentralizada (DeSci)", "defi-page": "Finanças descentralizadas (DeFi)", + "design": "Visual", + "design-principles": "Princípios do design", "devcon": "Devcon", "developers": "Desenvolvedores", "developers-home": "Página inicial dos desenvolvedores", @@ -59,7 +72,7 @@ "enterprise-menu": "Menu Empresarial", "esp": "Programa de suporte do Ecossistema", "eth-current-price": "Preço atual do ETH (USD)", - "ethereum-basics": "Informações básicas da Ethereum", + "ethereum-basics": "Fundamentos básicos do Ethereum", "ethereum-bug-bounty": "Plano de recompensas à caça a erros de programação", "consensus-when-shipping": "Quando estará disponível?", "ethereum-upgrades": "Melhorias no Ethereum", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "Este tutorial foi útil?", "feedback-widget-thank-you-title": "Agradecemos o seu feedback!", "feedback-widget-thank-you-subtitle": "Torne esta página ainda melhor respondendo a estas perguntas.", - "feedback-widget-thank-you-subtitle-ext": "Se precisar de ajuda, entre em contato com a comunidade em nosso Discord.", + "feedback-widget-thank-you-subtitle-ext": "Se precisar de ajuda, entre em contato com a comunidade em nosso Discord.", "feedback-widget-thank-you-timing": "2 – 3 minutos", "feedback-widget-thank-you-cta": "Abrir pesquisa rápida", "find-wallet": "Buscar carteira", @@ -94,11 +107,11 @@ "grants": "Recompensas", "grant-programs": "Programas de recompensas do ecossistema", "guides": "Guias", - "guides-hub": "Central de guias", + "guides-hub": "How-to guides", "history-of-ethereum": "História do Ethereum", "home": "Início", "how-ethereum-works": "Como Ethereum funciona", - "how-to-register-an-ethereum-account": "Como \"registrar\" uma conta Ethereum", + "how-to-create-an-ethereum-account": "Como \"criar\" uma conta Ethereum", "how-to-revoke-token-access": "Como revogar o acesso ao contrato inteligente aos seus fundos cripto", "how-to-swap-tokens": "Como trocar tokens", "how-to-use-a-bridge": "Como fazer transferir tokens para a camada 2", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Não foi possível carregar os dados. Tente novamente mais tarde.", "logo": "logotipo", "mainnet-ethereum": "Rede principal da Ethereum", + "merge": "Integração", "more": "Mais", "nav-developers": "Desenvolvedores", "nav-developers-docs": "Documentação para o desenvolvedor", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Procurar em outro lugar", "search-eth-address": "Esse parece um endereço Ethereum. Nós não fornecemos dados específicos para endereços. Tente procurá-lo em um explorador de blocos como", "search-no-results": "A pesquisa não retornou nenhum resultado", + "security": "Segurança", "single-slot-finality": "Finalidade do espaço único", "statelessness": "Sem estado", "see-contributors": "Ver colaboradores", @@ -181,6 +196,7 @@ "start-here": "Comece aqui", "style-guide": "Guia de estilo", "solo": "Participação individual", + "support": "Suporte", "terms-of-use": "Termos de uso", "translation-banner-body-new": "Você está visualizando esta página em inglês porque ainda não foi traduzida. Ajude-nos a traduzir o conteúdo.", "translation-banner-body-update": "Há uma nova versão desta página mas, no momento, ela está apenas em inglês. Ajude-nos a traduzir a última versão.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Não há bugs aqui!", "translation-banner-no-bugs-content": "Esta página não está sendo traduzida. Ela foi intencionalmente deixada em inglês, por enquanto.", "translation-banner-no-bugs-dont-show-again": "Não mostrar novamente", + "translation-program": "Programa de tradução", "try-using-search": "Tente usar a pesquisa para encontrar o que está procurando ou", "tutorials": "Tutoriais", "up": "Acima", diff --git a/src/intl/pt-br/page-about.json b/src/intl/pt-br/page-about.json index f94657a9d20..011b31dff25 100644 --- a/src/intl/pt-br/page-about.json +++ b/src/intl/pt-br/page-about.json @@ -9,11 +9,11 @@ "page-about-li-4": "implementado", "page-about-link-1": "O código fonte deste repositório está licenciado sob a Licença MIT", "page-about-link-2": "GitHub", - "page-about-link-3": "Ver a lista completa de tarefas em andamento no GitHub", + "page-about-link-3": "Ver a lista completa de tarefas em andamento no Github", "page-about-link-4": "Entre no nosso servidor do Discord", "page-about-link-5": "Encontre-nos no Twitter", - "page-about-link-6": "Ver a lista completa de tarefas implementadas no GitHub", - "page-about-link-7": "Levantar uma questão no GitHub", + "page-about-link-6": "Ver a lista completa de tarefas implementadas no Github", + "page-about-link-7": "Levantar uma questão no Github", "page-about-p-1": "Desde o lançamento da ethereum.org, esforçamo-nos para ser transparentes na forma como operamos. Este é um dos nossos valores principais porque acreditamos que a transparência é crucial para o sucesso do Ethereum.", "page-about-p-2": "Nós utilizamos", "page-about-p-3": "como nossa principal ferramenta de gerenciamento de projeto. Organizamos nossas tarefas em 3 categorias:", @@ -24,10 +24,9 @@ "page-about-p-8": "Você tem alguma ideia de como podemos melhorar a ethereum.org? Nós adoraríamos colaborar com você!", "page-what-is-ethereum-energy-consumption-chart-legend": "Consumo anual de energia em TWH/ano", "page-upgrades-post-merge-banner-governance-ood": "Alguns conteúdos nesta página estão desatualizados após a fusão. Por favor, faça um PR se você deseja contribuir.", - "energy-consumption-chart-youtube-label": "YouTube", - "energy-consumption-chart-gold-mining-galaxy-label": "Mineração de ouro (Galáxia Digital)", "energy-consumption-chart-global-data-centers-label": "Centros de dados globais", - "energy-consumption-chart-gold-mining-cbeci-label": "Mineração de ouro (CBECI)", + "energy-consumption-chart-airbnb-label": "AirBnB", + "energy-consumption-gold-mining-cbeci-label": "Mineração de ouro", "energy-consumption-chart-btc-pow-label": "BTC PoW", "energy-consumption-chart-netflix-label": "Netflix", "energy-consumption-chart-eth-pow-label": "BTC PoW", diff --git a/src/intl/pt-br/page-bug-bounty.json b/src/intl/pt-br/page-bug-bounty.json index d9b2e5a34ae..bbef9185a8b 100644 --- a/src/intl/pt-br/page-bug-bounty.json +++ b/src/intl/pt-br/page-bug-bounty.json @@ -3,7 +3,7 @@ "page-upgrades-bug-bounty-annotations": "Pode ser útil conferir as seguintes anotações:", "page-upgrades-bug-bounty-client-bugs": "Bugs do cliente", "page-upgrades-bug-bounty-client-bugs-desc": "Os clientes executam a rede Ethereum e precisam seguir a lógica estabelecida na especificação e estar seguros contra possíveis ataques. Os bugs que queremos encontrar estão relacionados à implementação do protocolo.", - "page-upgrades-bug-bounty-client-bugs-desc-2": "Atualmente, clientes da camada de execução (Besu, Erigon, Geth e Nethermind) e clientes da camada de consenso (Lighthouse, Lodestar, Nimbus, Teku e Prysm) estão incluídos no programa Bug Bounty. Mais clientes podem ser adicionados à medida que completam as auditorias e ficam prontos para a produção.", + "page-upgrades-bug-bounty-client-bugs-desc-2": "Currently execution layer clients (Besu, Erigon, Geth and Nethermind) and consensus layer clients (Lighthouse, Lodestar, Nimbus, Teku and Prysm) are included in the Bug Bounty Program. More clients may be added as they complete audits and become production ready. Currently, c-kzg-4844 and go-kzg-4844 are also included in the bug bounty program.", "page-upgrades-bug-bounty-clients": "Clientes em destaque nas recompensas", "page-upgrades-bug-bounty-clients-type-1": "Problemas de não conformidade de especificação", "page-upgrades-bug-bounty-clients-type-2": "Falhas inesperadas, vulnerabilidades RCE ou de negação de serviço (DOS)", @@ -17,17 +17,17 @@ "page-upgrades-bug-bounty-email-us": "Envie-nos um e-mail:", "page-upgrades-bug-bounty-help-links": "Links úteis", "page-upgrades-bug-bounty-hunting": "Regras de caça a bugs", - "page-upgrades-bug-bounty-hunting-desc": "O programa bug bounty é um programa de recompensas experimental e discricionário destinado à ativa comunidade do Ethereum, visando incentivar e recompensar aqueles que estão ajudando a melhorar a plataforma. Isso não é uma competição. É importante saber que podemos cancelar o programa a qualquer momento, e os prêmios ficam a critério exclusivo do painel de recompensa por bugs da Ethereum Foundation. Além disso, não podemos conceder prêmios a indivíduos que estejam nas listas de sanções ou que estejam em países nas listas de sanções (por exemplo, Coreia do Norte, Irã etc.). As leis locais exigem que solicitemos prova de sua identidade. Você é responsável por todos os impostos. Todos os prêmios estão sujeitos à lei aplicável. Por fim, seu teste não deve violar nenhuma lei ou comprometer quaisquer dados que não sejam seus e deve ocorrer em redes de teste locais em execução.", - "page-upgrades-bug-bounty-hunting-leaderboard": "Tabela de classificação de recompensas por bugs da camada de consenso", - "page-upgrades-bug-bounty-hunting-execution-leaderboard": "Tabela de classificação de recompensas por bugs da camada de execução", - "page-upgrades-bug-bounty-hunting-leaderboard-subtitle": "Encontre bugs na camada de consenso para serem adicionados a esta tabela de classificação", - "page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle": "Encontre bugs da camada de execução para ser adicionado a esta tabela de classificação", + "page-upgrades-bug-bounty-hunting-desc": "O programa de caça a bugs é um programa de recompensas experimental e discricionário destinado à comunidade ativa do Ethereum, visando incentivar e recompensar aqueles que estão ajudando a melhorar a plataforma. Não se trata de uma competição. É importante saber que podemos cancelar o programa a qualquer momento, e os prêmios ficam a critério exclusivo do painel de recompensas por bugs da Ethereum Foundation. Além disso, não podemos conceder prêmios a indivíduos que estejam nas listas de sanções ou que estejam em países nas listas de sanções (por exemplo, Coreia do Norte, Irã, etc.). As leis locais exigem que solicitemos prova de sua identidade. Você é responsável por todos os impostos. Todos os prêmios estão sujeitos à lei aplicável. Por fim, seu teste não deve violar nenhuma lei ou comprometer quaisquer dados que não sejam seus e deve ocorrer em redes de teste locais em execução.", + "page-upgrades-bug-bounty-hunting-leaderboard": "Placar de recompensas por bugs da camada de consenso", + "page-upgrades-bug-bounty-hunting-execution-leaderboard": "Placar de recompensas por bugs da camada de execução", + "page-upgrades-bug-bounty-hunting-leaderboard-subtitle": "Encontre bugs da camada de consenso para serem adicionados a este placar", + "page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle": "Encontre bugs da camada de execução para ser adicionado a este placar", "page-upgrades-bug-bounty-hunting-li-1": "Tickets sem um POC que já tenham sido submetidos por outro usuário ou que já sejam conhecidos por mantenedores de especificações e clientes não são elegíveis para o programa de recompensas.", "page-upgrades-bug-bounty-hunting-li-2": "A divulgação pública de uma vulnerabilidade a torna inelegível para uma recompensa.", "page-upgrades-bug-bounty-hunting-li-3": "Funcionários e contratados da Ethereum Foundation ou equipes de clientes no escopo do programa de recompensas podem participar do programa apenas no acúmulo de pontos e não receberão recompensas monetárias.", "page-upgrades-bug-bounty-hunting-li-4": "O programa de recompensas de Ethereum considera um número de variáveis na determinação de recompensas. Determinações de elegibilidade, pontuação e todos os termos relacionados a um prêmio são a critério único e final do painel de recompensas da Fundação Ethereum.", - "page-upgrades-bug-bounty-leaderboard": "Ver a tabela de classificação completa", - "page-upgrades-bug-bounty-leaderboard-list": "Placar de recompensa por caça a bugs", + "page-upgrades-bug-bounty-leaderboard": "Ver o placar completo", + "page-upgrades-bug-bounty-leaderboard-list": "Placar de recompensas por caça a bugs", "page-upgrades-bug-bounty-leaderboard-points": "pontos", "page-upgrades-bug-bounty-ledger-desc": "As especificações do Ethereum detalham a lógica do design para a Camada de Execução e a Camada de Consenso.", "page-upgrades-bug-bounty-ledger-title": "Especificação de bugs", @@ -56,8 +56,8 @@ "page-upgrades-bug-bounty-execution-specs": "Especificações da Camada de Execução", "page-upgrades-bug-bounty-specs-docs": "Documentos da especificação", "page-upgrades-bug-bounty-submit": "Enviar um bug", - "page-upgrades-bug-bounty-submit-desc": "Para cada bug válido que você encontrar você receberá recompensas. A quantidade de recompensas concedidas variará conforme a severidade. A severidade é calculada de acordo com o modelo de classificação de risco da OWASP com base no impacto na Rede Ethereum e na Probabilidade.", - "page-upgrades-bug-bounty-subtitle": "Ganhe até US$250.000 e um lugar na tabela de classificação ao encontrar bugs no protocolo, cliente e Solidity que afete a rede Ethereum.", + "page-upgrades-bug-bounty-submit-desc": "Para cada bug válido que você encontrar, receberá recompensas. A quantidade de recompensas concedidas variará conforme a gravidade. A gravidade é calculada segundo o modelo de classificação de risco da OWASP, com base no impacto na Rede Ethereum e na Probabilidade.", + "page-upgrades-bug-bounty-subtitle": "Ganhe até US$ 250.000 e uma posição na tabela de classificação ao encontrar bugs no protocolo, no cliente e no Solidity que afetem a rede Ethereum.", "page-upgrades-bug-bounty-title": "Aberto para inscrições", "page-upgrades-bug-bounty-title-1": "Beacon Chain", "page-upgrades-bug-bounty-title-2": "Escolha do fork", @@ -83,7 +83,7 @@ "page-upgrades-bug-bounty-card-label-6": "Até 50.000 dólares", "page-upgrades-bug-bounty-card-label-7": "Até 25.000 pontos", "page-upgrades-bug-bounty-card-label-8": "Até 250.000 dólares", - "page-upgrades-bug-bounty-card-li-1": "Impacto baixo, probabilidade media", + "page-upgrades-bug-bounty-card-li-1": "Impacto baixo, probabilidade média", "page-upgrades-bug-bounty-card-li-2": "Impacto médio, probabilidade baixa", "page-upgrades-bug-bounty-card-li-3": "Impacto alto, probabilidade baixa", "page-upgrades-bug-bounty-card-li-4": "Impacto médio, probabilidade média", @@ -122,7 +122,7 @@ "bug-bounty-faq-q5-title": "Informei um problema / vulnerabilidade, mas não recebi nenhuma resposta!", "bug-bounty-faq-q5-contentPreview": "Por favor, aguarde alguns dias para que alguém responda ao seu envio.", "bug-bounty-faq-q5-content-1": "Nosso objetivo é responder aos envios o mais rápido possível. Envie-nos um e-mail para bounty@ethereum.org se você não tiver recebido uma resposta em um dia ou dois.", - "bug-bounty-faq-q6-title": "Eu quero ser anônimo / Eu não quero meu nome no painel de líderes.", + "bug-bounty-faq-q6-title": "Quero ser anônimo / Não quero meu nome no placar.", "bug-bounty-faq-q6-contentPreview": "Você pode fazer isso, mas isso pode torná-lo inelegível para ganhar recompensas.", "bug-bounty-faq-q6-content-1": "Você pode fazer um envio anonimamente ou com um pseudônimo, mas ficará inelegível para recompensas ETH/DAI. Para se candidatar a recompensas ETH/DAI, precisamos do seu nome verdadeiro e uma prova de sua identidade. Doar sua recompensa para caridade não requer sua identidade.", "bug-bounty-faq-q6-content-2": "Avise-nos caso não queira seu nome/apelido exibido no placar.", diff --git a/src/intl/pt-br/page-developers-tutorials.json b/src/intl/pt-br/page-developers-tutorials.json index f7995a82d04..96098845ee3 100644 --- a/src/intl/pt-br/page-developers-tutorials.json +++ b/src/intl/pt-br/page-developers-tutorials.json @@ -24,5 +24,6 @@ "page-tutorial-intermediate": "Intermediário", "page-tutorial-advanced": "Avançado", "page-find-wallet-try-removing": "Tente remover um ou dois recursos", - "page-find-wallet-clear": "Limpar filtros" + "page-find-wallet-clear": "Limpar filtros", + "page-tutorials-env-banner": "Não comprometa o .env! Certifique-se de nunca compartilhar ou explicar o seu . arquivo nv com qualquer pessoa, pois você estará comprometendo seus segredos ao fazê-lo. Se você estiver usando o controle de versão, adicione seu .env a um arquivo gitignore." } diff --git a/src/intl/pt-br/page-gas.json b/src/intl/pt-br/page-gas.json new file mode 100644 index 00000000000..d715bf33e9b --- /dev/null +++ b/src/intl/pt-br/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Gas fees on Ethereum: how do they work?", + "page-gas-meta-description": "Learn about gas on Ethereum: how they work and how to pay less in gas fees", + "page-gas-hero-title": "Gas fees", + "page-gas-hero-header": "Network fees", + "page-gas-hero-button-1-content": "O que é gás?", + "page-gas-hero-subtitle-1": "Network fees on Ethereum are called gas.", + "page-gas-hero-subtitle-2": "Gas is the fuel that powers Ethereum.", + "page-gas-summary-title": "Resumo", + "page-gas-summary-item-1": "Every transaction on Ethereum requires a small form of payment to process", + "page-gas-summary-item-2": "These fees are known as ‘gas’ fee", + "page-gas-summary-item-3": "Gas fees change based on network congestion", + "page-gas-what-are-gas-fees-header": "What are gas fees?", + "page-gas-what-are-gas-fees-text-1": "Think of Ethereum as a large computer network where people can do tasks like sending messages or running programs. Just like in the real world, these tasks require energy to get done.", + "page-gas-what-are-gas-fees-text-2": "In Ethereum, each computational action has a set \"gas\" price. Your gas fees are the total cost of the actions in your transaction. When you send a transaction or run a smart contract, you pay in gas fees to process it.", + "page-gas-how-do-i-pay-less-gas-header": "How do I pay less gas?", + "page-gas-how-do-i-pay-less-gas-text": "While higher fees on Ethereum are sometimes inevitable, there are strategies you can use to reduce the cost:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Time your transactions", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Just like travelling off-peak is less crowded and more affordable, Ethereum is generally cheaper to use when North America is asleep.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Wait for gas to go down", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Gas prices go up and down every twelve seconds based on how congested Ethereum is. When gas prices are high, waiting just a few minutes before making a transaction could see a significant drop in what you pay.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Usar a camada 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Layer-2 chains are built atop Ethereum, offering lower fees and handling more transactions. They're a good choice to save on fees for transactions that don't need to happen on the main Ethereum network.", + "page-gas-try-layer-2": "Try layer 2", + "page-gas-what-causes-high-gas-fees-header": "What causes high gas fees?", + "page-gas-what-causes-high-gas-fees-text-1": "Whenever the amount of computation (gas) on Ethereum exceeds a certain threshold, gas fees begin to rise. The more the gas exceeds this threshold, the quicker gas fees increase.", + "page-gas-what-causes-high-gas-fees-text-2": "Higher fees could be caused by things like popular dapps or NFTs, periodically increased trading on DEXs, or an overwhelming number of user activity at peak times.", + "page-gas-what-causes-high-gas-fees-text-3": "Developers on Ethereum should take care to optimise their smart contracts usage before deploying. If lots of people are using a poorly written smart contract, it will consume more gas and could inadvertently cause network congestion.", + "page-gas-want-to-dive-deeper": "Quer mais detalhes?", + "page-gas-check-out-the-developer-docs": "Check out the developer docs.", + "page-gas-attack-of-the-cryptokitties-header": "Attack of the Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "In November 2017, the popular CryptoKitties project was launched. Its rapid spike in popularity caused significant network congestion and extremely high gas fees. The challenges posed by CryptoKitties accelerated the urgency of finding solutions for scaling Ethereum.", + "page-gas-why-do-we-need-gas-header": "Why do we need gas?", + "page-gas-why-do-we-need-gas-text": "Gas is a critical element in keeping Ethereum secure and processing transactions. Gas helps in many ways:", + "page-gas-benefits-1-description": "Gas keeps Ethereum sybil-resistant by preventing malicious actors from overwhelming the network with fraudulent activities.", + "page-gas-benefits-2-description": "Because computation costs gas, spamming Ethereum with expensive transactions, either accidentally and maliciously, is financially disencentivised.", + "page-gas-benefits-3-description": "A hard-limit on the amount of computation that can be done at any one time prevents Ethereum from being overwhelmed, helping to ensure the network is always accessible.", + "page-gas-how-is-gas-calculated-header": "How is gas calculated?", + "page-gas-advanced": "Avançado", + "page-gas-how-is-gas-calculated-text-1": "The total gas fee you pay is made up of a few parts:", + "page-gas-how-is-gas-calculated-item-1": "Base fee: a fee set by the network that has to be paid for a transaction", + "page-gas-how-is-gas-calculated-item-2": "Priority fee: an optional tip to incentivise node operators to include your transaction", + "page-gas-how-is-gas-calculated-item-3": "Units of gas used*: remember we said gas represented computation? More complex actions, like interacting with a smart contract, use more gas than simple ones, such as sending a transaction.", + "page-gas-how-is-gas-calculated-list-item-1": "* See Figure 1 to see how much gas different types of transactions use", + "page-gas-how-is-gas-calculated-text-2": "The formula for calculating a gas fee is units of gas used * (base fee + priority fee). Most wallets will calculate gas usage and display it in a more straight-forward way.", + "page-gas-table-figure": "Figure 1: Gas used by transaction type", + "page-gas-table-header-1": "Transaction type", + "page-gas-table-header-2": "Units of gas used", + "page-gas-table-item-1-transaction-type": "Sending ETH", + "page-gas-table-item-2-transaction-type": "Sending ERC-20 tokens", + "page-gas-table-item-3-transaction-type": "Transferring and NFT", + "page-gas-table-item-4-transaction-type": "Swapping on Uniswap", + "page-gas-faq-header": "Frequency asked questions", + "page-gas-faq-question-1-q": "Who gets paid the gas fee in my transaction?", + "page-gas-faq-question-1-a-1": "The majority is gas fee—the base fee— is destroyed by the protocol (burned). The priority fee, if included in your transaction, will be given to the validator who proposed your transaction.", + "page-gas-faq-question-1-a-2": "You can read a detailed description of the process in the gas developer docs.", + "page-gas-faq-question-2-q": "Do I need to pay gas in ETH?", + "page-gas-faq-question-2-a-1": "Yes. All gas fees on Ethereum must be paid in the native ETH currency.", + "page-gas-faq-question-2-a-2": "Mais sobre ETH", + "page-gas-faq-question-3-q": "What is gwei?", + "page-gas-faq-question-3-a-1": "In most wallets or gas trackers, you will see gas prices denominated as ‘gwei’.", + "page-gas-faq-question-3-a-2": "Gwei is just a smaller unit of ETH, just as pennies are to dollars, with the difference being that 1 ETH equals 1 billion gwei. Gwei is useful when talking about very small amounts of ETH.", + "page-gas-use-layer-2": "Usar a camada 2" +} diff --git a/src/intl/pt-br/page-get-eth.json b/src/intl/pt-br/page-get-eth.json index d981ca45e10..35eab997a5a 100644 --- a/src/intl/pt-br/page-get-eth.json +++ b/src/intl/pt-br/page-get-eth.json @@ -9,26 +9,35 @@ "page-get-eth-cex-desc": "Corretoras são negócios que permitem que você compre criptomoedas usando moedas tradicionais. Elas têm custódia sobre qualquer ETH que você comprar até que você a envie para uma carteira que você controla.", "page-get-eth-checkout-dapps-btn": "Confira os dapps", "page-get-eth-community-safety": "Publicações da comunidade sobre segurança", - "page-get-eth-description": "Ethereum e ETH não são controlados por nenhum governo ou empresa: são descentralizados. Isso significa que os ETH estão abertos para que todos usem.", + "page-get-eth-description": "Ethereum não é controlado por nenhuma organização - ele é descentralizado.", "page-get-eth-dex": "Corretoras descentralizadas (DEXs)", - "page-get-eth-dex-desc": "Se você quiser um maior controle, compre ETH ponto a ponto. Com uma DEX você pode operar sem dar controle de seus fundos a uma empresa centralizada.", + "page-get-eth-dex-desc": "Se você deseja mais controle, compre ETH utilizando smart contracts. Com DEX você pode ter mais controle nas trocas de ativos digitais sem depender de uma companhia centralizada para gerir seus fundos.", + "page-get-eth-peers": "Receba ETH das suas conexões", + "page-get-eth-peers-desc": "Uma vez que você tenha uma conta Ethereum, tudo que você precisa fazer é compartilhar seu endereço para começar a receber e enviar ETC (e outros tokens) peer-to-peer.", + "page-get-eth-staking": "Recompensas de staking", + "page-get-eth-staking-desc": "Se você já tem uma conta ETH, você pode ganhar mais executando um nódulo validador. Você é pago em ETH para realizar essa verificação.", + "page-get-eth-earn": "Receber ETH", + "page-get-eth-earn-desc": "Você pode receber ETH trabalhando para DAOs ou companhias que pagam em crypto, ganhando recompensas, encontrando erros de software e mais.", + "page-get-eth-daos-link-desc": "Aprenda mais sobre DAOs", + "page-get-eth-cex-link-desc": "Veja uma lista de corretoras de câmbio", + "page-get-eth-staking-link-desc": "Aprenda mais sobre staking", "page-get-eth-dexs": "Corretoras descentralizadas (DEXs)", - "page-get-eth-dexs-desc": "Corretoras descentralizadas são mercados abertos para ETH e outros tokens. Elas conectam diretamente compradores e vendedores.", + "page-get-eth-dexs-desc": "Exchanges descentralizadas são mercados abertos para ETH e outros tokens. Elas conectam diretamente compradores e vendedores.", "page-get-eth-dexs-desc-2": "Em vez de usar uma corretora de confiança para proteger fundos na transação, eles usam código. O ETH do vendedor só será transferido quando o pagamento for garantido. Esse tipo de código é conhecido como um contrato inteligente.", - "page-get-eth-dexs-desc-3": "Isto significa que há menos restrições geográficas do que com alternativas centralizadas. Se alguém está vendendo o que você quer e aceitando um método de pagamento que você pode fornecer, vocês podem fazer negócio. Os DEXs podem permitir que você compre ETH com outros tokens, PayPal ou inclusive entregas em dinheiro pessoalmente.", + "page-get-eth-dexs-desc-3": "Isso significa que há menos restrições geográficas do que com alternativas centralizadas. Se alguém vende o que você quer e aceita um método de pagamento que você pode fornecer, é um bom negócio.", "page-get-eth-do-not-copy": "Não copiar", "page-get-eth-exchanges-disclaimer": "Nós coletamos essas informações manualmente. Se você encontrar algum erro, nos informe em", - "page-get-eth-exchanges-empty-state-text": "Digite o país em que você vive para ver uma lista de carteiras e exchanges que você pode usar para comprar ETH", + "page-get-eth-exchanges-empty-state-text": "Informe seu país de residência para ter acesso à lista de corretoras de câmbio que você pode utilizar", "page-get-eth-exchanges-except": "Exceto", "page-get-eth-exchanges-header": "Em qual país você mora?", "page-get-eth-exchanges-header-exchanges": "Corretoras", "page-get-eth-exchanges-header-wallets": "Carteiras", - "page-get-eth-exchanges-intro": "Exchanges e carteiras têm restrições sobre onde podem vender cripto.", - "page-get-eth-exchanges-no-exchanges": "Desculpe, não conhecemos nenhum exchange que permita que você compre ETH neste país. Caso você conheça alguma, nos informe em", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Desculpe, não conhecemos nenhum exchange ou carteira que permita que você compre ETH neste país. Caso você conheça alguma, nos informe em", - "page-get-eth-exchanges-no-wallets": "Desculpe, não conhecemos nenhuma carteira que permita que você compre ETH neste país. Caso você conheça alguma, nos informe em", + "page-get-eth-exchanges-intro": "Corretoras possuem restrições de lugares onde podem comercializar crypto. Essa lista é um indicativo de serviços que podem operar em cada país. Estar na lista não é um endosso - realize sua própria pesquisa!", + "page-get-eth-exchanges-no-exchanges": "Desculpe, não conhecemos nenhuma corretora que permita que você compre ETH neste país. Caso você conheça alguma, nos informe em", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Desculpe, não conhecemos nenhuma corretora que permita que você compre ETH neste país. Caso você conheça alguma, nos informe em", + "page-get-eth-exchanges-no-wallets": "Desculpe, não conhecemos nenhuma carteira que lhe permita comprar ETH neste país. Se você sabe de alguma, informe-nos em", "page-get-eth-exchanges-search": "Digite onde você mora...", - "page-get-eth-exchanges-success-exchange": "Pode demorar vários dias para se inscrever em uma exchange devido aos controles jurídicos.", + "page-get-eth-exchanges-success-exchange": "Pode demorar vários dias para se inscrever em uma corretora devido aos controles jurídicos.", "page-get-eth-exchanges-success-wallet-link": "carteiras", "page-get-eth-exchanges-success-wallet-paragraph": "Onde você mora, é possível comprar ETH diretamente destas carteiras. Saiba mais", "page-get-eth-exchanges-usa": "Estados Unidos da América (EUA)", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Imagem de Get ETH hero", "page-get-eth-keep-it-safe": "Mantenha seus ETH seguros", "page-get-eth-meta-description": "Como comprar ETH com base no local onde você vive e conselhos sobre como cuidar dele.", - "page-get-eth-meta-title": "Como comprar ETH", + "page-get-eth-meta-title": "Como obter ETH", "page-get-eth-need-wallet": "Você precisará de uma carteira para usar uma DEX.", "page-get-eth-new-to-eth": "Novo em ETH? Aqui está uma visão geral para você começar.", "page-get-eth-other-cryptos": "Compre com outras criptomoedas", - "page-get-eth-protect-eth-desc": "Se você planeja comprar uma grande quantidade de ETH, você pode querer mantê-los em uma carteira que você controla, não em uma exchange. O motivo é que uma exchange é um alvo provável de hackers. Se um hacker ganha acesso, você pode perder seus fundos. Já com a carteira, você é o único a ter controle total dela.", - "page-get-eth-protect-eth-in-wallet": "Proteja seus ETH em uma carteira", + "page-get-eth-protect-eth-desc": "Uma das principais características do Ethereum é que você mantém o controle de seus próprios ativos gerenciando sua própria conta. Isso significa que você não precisa confiar seus ativos a terceiros e está protegido contra qualquer custodiante que aja desonestamente, vá à falência ou seja hackeado. No entanto, também significa que você assume a responsabilidade por sua própria segurança.", + "page-get-eth-protect-eth-in-wallet": "Mantenha seu ETH na sua carteira", "page-get-eth-search-by-country": "Procurar por país", - "page-get-eth-security": "Mas isso também significa que você precisa levar a sério a segurança dos seus fundos. Com ETH, você não confia em um banco para cuidar do seu dinheiro, você está confiando em você mesmo.", + "page-get-eth-security": "Isso significa que você precisa tomar cuidado com a segurança dos seus fundos. Com ETH, você não tem um banco ou companhia para validar suas ações, você tem total responsabilidade por suas transações.", "page-get-eth-smart-contract-link": "Mais sobre contratos inteligentes", "page-get-eth-swapping": "Troque seus tokens por ETH de outras pessoas. E vice-versa.", "page-get-eth-try-dex": "Veja como funciona um DEX", "page-get-eth-use-your-eth": "Use seu ETH", "page-get-eth-use-your-eth-dapps": "Agora que você possui alguns ETH, confira alguns aplicativos Ethereum (dapps). Existem dapps para finanças, mídias sociais, jogos e muitas outras categorias.", "page-get-eth-wallet-instructions": "Siga as instruções da carteira", - "page-get-eth-wallet-instructions-lost": "Saiba que se você perder o acesso a sua carteira, estará perdendo o acesso a seus fundos. Sua carteira deverá dar a você instruções sobre como evitar que isso aconteça. Certifique-se de segui-las com cuidado. Na maioria dos casos, ninguém poderá ajudá-lo se você perder o acesso a sua carteira.", + "page-get-eth-wallet-instructions-lost": "Se você perder acesso a sua conta, irá perder todos os seus fundos. Sua carteira tem informações sobre proteção nesses casos. Tenha certeza que está seguindo tudo corretamente - geralmente, ninguém poderá ajudá-lo se você perder acesso a sua conta.", "page-get-eth-wallets": "Carteiras", "page-get-eth-wallets-link": "Mais sobre carteiras", "page-get-eth-wallets-purchasing": "Algumas carteiras permitem que você compre criptomoeda com um cartão de débito/crédito, por transferência bancária ou até mesmo via Apple Pay. Aplicam-se restrições geográficas.", - "page-get-eth-warning": "Esses DEXs não são para iniciantes, já que você precisará de alguns ETH para usá-los.", + "page-get-eth-warning": "Estes DEXs não são para iniciantes, pois você precisa de algum ETH para utilizar. São apenas exemplos, não são recomendações. Você precisa pesquisar!", "page-get-eth-what-are-DEX's": "O que são DEXs?", "page-get-eth-whats-eth-link": "O que é ETH?", - "page-get-eth-where-to-buy-desc": "Você pode comprar ETH de corretoras ou diretamente de carteiras.", + "page-get-eth-where-to-buy-desc": "Você pode receber ETH, receber ela dos seus pares, ou comprar em exchanges e apps.", "page-get-eth-where-to-buy-desc-2": "Verifique quais serviços estão disponíveis onde você mora.", - "page-get-eth-where-to-buy-title": "Onde comprar ETH", + "page-get-eth-where-to-buy-title": "Onde obter ETH", "page-get-eth-your-address": "Seu endereço de ETH", "page-get-eth-your-address-desc": "Quando você baixar uma carteira, ela criará um endereço ETH público para você. Ele se verá assim:", "page-get-eth-your-address-desc-3": "Pense nele como seu endereço de e-mail, mas em vez de mensagem, ele pode receber ETH. Se você quiser transferir ETH de uma exchange para sua carteira, use seu endereço como o destino. Não deixe de verificar o endereço antes de enviar!", diff --git a/src/intl/pt-br/page-upgrades-index.json b/src/intl/pt-br/page-upgrades-index.json index 6bc77abef38..d75f7cba81b 100644 --- a/src/intl/pt-br/page-upgrades-index.json +++ b/src/intl/pt-br/page-upgrades-index.json @@ -9,8 +9,8 @@ "consensus-client-prysm-logo-alt": "Logotipo da Prysm", "consensus-client-teku-logo-alt": "Logotipo da Teku", "page-upgrades-answer-1": "A Beacon Chain foi usada como uma ferramenta para atualizar a Rede principal do Ethereum na Fusão.", - "page-upgrades-answer-2": "Com A Fusão, o Ethereum teve a sua atualização mais substancial de todos os tempos, trocando a prova de trabalho por uma nova camada de consenso baseada em prova de participação.", - "page-upgrades-answer-4": "A Beacon Chain foi usada para desenvolver o consenso baseado na prova de participação que o Ethereum usa atualmente. Ele foi executado separadamente na Rede principal do Ethereum para que os desenvolvedores pudessem observar o mecanismo de consenso isoladamente antes de usá-lo para coordenar a atividade real.", + "page-upgrades-answer-2": "Com a Fusão, o Ethereum teve a sua atualização mais substancial de todos os tempos, trocando a prova de trabalho por uma nova camada de consenso baseada em prova de participação.", + "page-upgrades-answer-4": "A Beacon Chain foi usada para desenvolver o consenso baseado na prova de participação que o Ethereum usa atualmente. Ela foi executada separadamente na Rede principal do Ethereum para que os desenvolvedores pudessem observar o mecanismo de consenso isoladamente antes de usá-lo para coordenar a atividade real.", "page-upgrade-article-author-status": "Status", "page-upgrade-article-author-ethmerge": "Ethmerge", "page-upgrade-article-author-alchemy": "Alchemy", @@ -22,32 +22,32 @@ "page-upgrade-article-author-ethos-dev": "Ethos.dev", "page-upgrade-article-title-two-point-oh": "Melhoria: a Beacon Chain", "page-upgrade-article-title-beacon-chain-explainer": "A explicação sobre Beacon Chain Ethereum 2.0 que você deve ler primeiro", - "page-upgrade-article-title-sharding-consensus": "Consenso de fragmentação (sharding)", + "page-upgrade-article-title-sharding-consensus": "Consenso de particionamento (sharding)", "page-upgrade-article-title-sharding-is-great": "Por que o particionamento é ótimo: desmistificando as propriedades técnicas", "page-upgrade-article-title-rollup-roadmap": "Um roadmap centrado em rollup", "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "O Guia do Mochileiro sobre o Ethereum", - "page-upgrade-article-title-eip-4844": "EIP-4844: Transações de Blob de Fragmentos (Proto-Danksharding)", - "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding – FAQ", - "page-upgrade-article-title-sharding-das": "Uma explicação sobre a amostragem de fragmentação e disponibilidade de dados (DAS)", + "page-upgrade-article-title-eip-4844": "EIP-4844: Transações de blob de particionamento (Proto-Danksharding)", + "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding: perguntas frequentes", + "page-upgrade-article-title-sharding-das": "Uma explicação sobre a amostragem de particionamento e disponibilidade de dados (DAS)", "page-upgrade-article-title-ethmerge": "Ethmerge", "page-upgrade-article-title-merge-is-coming": "A Fusão está chegando", - "page-upgrade-article-title-state-of-the-merge": "O Estado da Fusão: uma atualização sobre A Fusão do Ethereum para a prova de participação em 2022", - "page-upgrade-article-title-ropsten-merge-testnet": "Anunciando a Rede de testes da Fusão do Ropsten", + "page-upgrade-article-title-state-of-the-merge": "O estado da Fusão: uma atualização sobre a Fusão do Ethereum para a prova de participação em 2022", + "page-upgrade-article-title-ropsten-merge-testnet": "Lançamento da Ropsten, a rede de testes para a Fusão", "page-upgrade-article-title-execution-layer-specs": "Especificações da camada de execução", "page-upgrade-article-title-consensus-layer-specs": "Especificações da camada de consenso", "page-upgrade-article-title-engine-api-specs": "Especificações da Engine API", "page-upgrades-beacon-chain-date": "A Beacon Chain foi lançada em 01 de dezembro de 2020", - "page-upgrades-beacon-chain-desc": "A Beacon Chain trouxe a participação para o Ethereum e lançou as bases para futuras atualizações. Ela coordena a nova prova de participação do Ethereum.", + "page-upgrades-beacon-chain-desc": "A Beacon Chain trouxe a participação para o Ethereum e estabeleceu as bases para futuras melhorias. Ela coordena a nova prova de participação do Ethereum.", "page-upgrades-beacon-chain-estimate": "A Beacon Chain está ativa", "page-upgrades-beacon-chain-title": "A Beacon Chain", "page-upgrades-bug-bounty": "Veja o programa de recompensas por caça aos bugs", "page-upgrades-clients": "Confira os clientes de consenso (anteriormente conhecidos como clientes 'Eth2')", "page-staking-deposit-contract-title": "Verifique o endereço do contrato de depósito", - "page-upgrades-dive": "Aprofundando a visão", - "page-upgrades-dive-desc": "Como podemos tornar o Ethereum mais escalável, seguro e sustentável? Mantendo a ética fundamental de descentralização do Ethereum.", - "page-upgrades-docking": "A fusão", - "page-upgrades-merge-answer-1": "A Fusão aconteceu quando a Ethereum fez a alteração para o consenso Prova de participação em 15 de setembro de 2022. A Beacon Chain se fundiu com a rede principal, tornando oficialmente obsoleta a Prova de trabalho e reduzindo o consumo de energia da Ethereum em ~99,95%.", - "page-upgrades-merge-btn": "Mais sobre a fusão", + "page-upgrades-dive": "Mais detalhes sobre a visão", + "page-upgrades-dive-desc": "Como podemos tornar o Ethereum mais escalável, seguro e sustentável sem deixar de considerar a ética fundamental de descentralização do Ethereum?", + "page-upgrades-docking": "A integração", + "page-upgrades-merge-answer-1": "A Fusão ocorreu quando o Ethereum passou para o consenso de prova de participação em 15 de setembro de 2022. A Beacon Chain se fundiu com a rede principal, tornando a prova de trabalho oficialmente obsoleta e reduzindo o consumo de energia do Ethereum em cerca de 99,95%.", + "page-upgrades-merge-btn": "Mais sobre a integração", "page-upgrades-merge-desc": "A Rede principal do Ethereum se fundiu com a prova de participação da Beacon Chain, marcando o fim da mineração de alto consumo energético.", "page-upgrades-merge-estimate": "A Fusão chegou", "page-upgrades-merge-mainnet": "O que é rede principal?", @@ -59,13 +59,13 @@ "page-upgrades-help": "Quer fazer parte das melhorias no Ethereum?", "page-upgrades-help-desc": "Há muitas oportunidades para contribuir com as melhorias do Ethereum, ajudar com testes e até ganhar recompensas.", "page-upgrades-index-staking": "A participação está aqui", - "page-upgrades-index-staking-desc": "A chave para as melhorias do Ethereum é a introdução do staking. Se você quiser usar o seu ETH para ajudar a proteger a rede Ethereum, certifique-se de seguir estas etapas.", - "page-upgrades-index-staking-learn": "Saiba mais sobre participação", + "page-upgrades-index-staking-desc": "A chave para as melhorias do Ethereum é a introdução do staking (participação). Se você quiser usar o seu ETH para ajudar a proteger a rede Ethereum, certifique-se de seguir estas etapas.", + "page-upgrades-index-staking-learn": "Saiba mais sobre staking (participação)", "page-upgrades-index-staking-learn-desc": "A Beacon Chain trouxe participação para o Ethereum. Se você tiver ETH, pode contribuir para um bem coletivo protegendo a rede e recebendo mais ETH por isso.", "page-upgrades-index-staking-step-1": "1. Configuração com o launchpad", "page-upgrades-index-staking-step-1-btn": "Acesse a plataforma Staking Launchpad", "page-upgrades-index-staking-step-1-desc": "Para fazer staking no Ethereum, você precisará usar a plataforma launchpad, que o guiará pelo processo.", - "page-upgrades-index-staking-step-2": "2. Confirme o endereço de participação", + "page-upgrades-index-staking-step-2": "2. Confirme o endereço de staking (participação)", "page-upgrades-index-staking-step-2-btn": "Confirme o endereço do contrato de depósito", "page-upgrades-index-staking-step-2-desc": "Antes de depositar seus ETH, certifique-se de que o endereço seja o correto. Você precisa ter acessado a plataforma Launchpad antes de fazer isso.", "page-upgrades-index-staking-sustainability": "Mais sustentável", @@ -75,8 +75,8 @@ "page-upgrades-question-1-title": "Quando as melhorias serão lançadas?", "page-upgrades-question-1-desc": "O Ethereum está sendo atualizado progressivamente; as melhorias são distintas e têm diferentes datas de lançamento.", "page-upgrades-question-2-title": "A Beacon Chain é uma blockchain separada?", - "page-upgrades-question-2-desc": "Sim. A Beacon Chain foi o nome dado a uma cadeia de blocos de prova de participação paralela usada para atualizar a Rede principal do Ethereum. Agora existe apenas uma cadeia de blocos, formada pela fusão da cadeia de blocos original do Ethereum e da Beacon Chain juntas.", - "page-upgrades-question-3-answer-2a": "A Fusão teve um impacto mínimo sobre os desenvolvedores de dapp — eles ainda interagem com a Ethereum da mesma maneira.", + "page-upgrades-question-2-desc": "Sim. A Beacon Chain foi o nome dado a uma blockchain de prova de participação paralela usada para atualizar a Rede principal do Ethereum. Agora existe apenas uma blockchain, formada pela fusão da blockchain original do Ethereum e da Beacon Chain juntas.", + "page-upgrades-question-3-answer-2a": "A Fusão teve um impacto mínimo sobre os desenvolvedores de dapp — eles ainda interagem com o Ethereum da mesma maneira.", "page-upgrades-question-3-answer-2a-link": "A Fusão e os desenvolvedores de dapp", "page-upgrades-question-3-answer-2b": "Os planos de fragmentação ainda estão sendo desenvolvidos, mas serão projetados tendo em mente os rollups de camada 2.", "page-upgrades-layer-2-rollups": "Mais sobre rollups de camada 2", @@ -85,21 +85,21 @@ "page-upgrades-question-3-title": "Como eu me preparo para as melhorias?", "page-upgrades-question-4-answer-1": "Hoje em dia, sempre que você envia uma transação ou usa um dapp, está usando a camada de execução, também conhecida como Rede principal.", "page-upgrades-question-4-answer-3": "Depois da Fusão, validadores protegerão toda a rede por meio da prova de participação.", - "page-upgrades-question-4-answer-6": "Qualquer pessoa pode se tornar um validador através da participação (staking) dos respectivos ETH.", + "page-upgrades-question-4-answer-6": "Qualquer pessoa pode se tornar um validador através do staking (participação) dos respectivos ETH.", "page-upgrades-question-4-answer-7": "Mais sobre participação", "page-upgrades-question-4-title": "O que é a camada de execução?", - "page-upgrades-question-4-desc": "Antes da Fusão, a cadeia de blocos do Ethereum era algumas vezes chamada de \"Eth1\". Este termo foi eliminado e substituído por \"camada de execução\".", - "page-upgrades-question-5-answer-1": "Para se tornar um validador na rede, você precisará participar com 32 ETH. Se você não tem tanto, ou não está disposto a apostar essa quantia, você pode participar de participações compartilhadas. Esses compartilhamentos permitirão que você participe com menos e ganhe frações do total de recompensas.", + "page-upgrades-question-4-desc": "Antes da Fusão, a blockchain do Ethereum era algumas vezes chamada de \"Eth1\". Este termo foi eliminado e substituído por \"camada de execução\".", + "page-upgrades-question-5-answer-1": "Para se tornar um validador na rede, você precisará participar com 32 ETH. Se você não tem tanto, ou não está disposto a apostar essa quantia, você pode se unir a participações compartilhadas. Esses compartilhamentos permitirão que você participe com menos e ganhe frações do total de recompensas.", "page-upgrades-question-5-desc": "Você precisará usar a plataforma Staking Launchpad ou entrar em um pool de participação.", "page-upgrades-question-5-title": "Como faço staking?", - "page-upgrades-question-6-answer-3": "Danny Ryan, da Fundação Ethereum, atualiza regularmente a comunidade:", - "page-upgrades-question-6-answer-4": "Ben Edgington da ConsenSys tem uma newsletter semanal sobre as melhorias do Ethereum:", + "page-upgrades-question-6-answer-3": "Danny Ryan, da Ethereum Foundation, atualiza regularmente a comunidade:", + "page-upgrades-question-6-answer-4": "Ben Edgington, da ConsenSys, tem uma newsletter semanal sobre as melhorias no Ethereum:", "page-upgrades-question-6-answer-5": "Você também pode participar da discussão sobre pesquisa e desenvolvimento no Ethereum em ethresear.ch.", "page-upgrades-question-6-title": "O que eu preciso fazer com meu dapp?", - "page-upgrades-question-6-desc": "A Fusão foi projetada para ter um impacto mínimo nos desenvolvedores de dapp, embora houvesse algumas pequenas mudanças que valem a pena apontar.", + "page-upgrades-question-6-desc": "A Fusão foi projetada para ter um impacto mínimo nos desenvolvedores de dapp, embora haja algumas pequenas mudanças que vale a pena apontar.", "page-upgrades-question-6-answer-1": "Os desenvolvedores de dapp familiarizados com o Ethereum antes da fusão devem estar cientes de algumas mudanças. Essas mudanças incluem estrutura e tempo de bloco, algumas mudanças de opcode, fontes de aleatoriedade na cadeia e o conceito de finalização de época.", "page-upgrades-question-6-answer-1-link": "Como A Fusão afeta a camada de aplicativos do Ethereum", - "page-upgrades-question-6-answer-2": "As aplicações praticamente não foram afetadas.", + "page-upgrades-question-6-answer-2": "Os aplicativos praticamente não foram afetados.", "page-upgrades-question-7-desc": "Muitas equipes diferentes de toda a comunidade estão trabalhando nas distantas melhorias do Ethereum.", "page-upgrades-question-7-lighthouse": "Lighthouse", "page-upgrades-question-7-lighthouse-lang": "(Implementação Rust)", @@ -116,53 +116,53 @@ "page-upgrades-question-7-clients": "Saiba mais sobre clientes de Ethereum", "page-upgrades-question-8-answer-1": "As melhorias do Ethereum ajudarão a dimensionar o Ethereum de forma descentralizada, mantendo a segurança e aumentando a sustentabilidade.", "page-upgrades-question-8-answer-2": "Talvez o problema mais óbvio seja que o Ethereum precisa ser capaz de lidar com mais de 15-45 transações por segundo. Mas as melhorias também abordam alguns outros problemas atuais do Ethereum.", - "page-upgrades-question-8-answer-3": "A rede está com uma demanda tão alta que está tornando o uso do Ethereum caro. Os nós da rede estão lutando com o tamanho da Ethereum e a quantidade de dados que seus computadores estão tendo que processar. O algoritmo original que sustentava a segurança e descentralização do Ethereum consome muita energia e precisa ser mais ecológico.", + "page-upgrades-question-8-answer-3": "A rede está com uma demanda tão alta que está tornando o uso do Ethereum caro. Os nós da rede estão lutando com o tamanho do Ethereum e a quantidade de dados que seus computadores estão tendo que processar. O algoritmo original que sustentava a segurança e descentralização do Ethereum consome muita energia e precisa ser mais ecológico.", "page-upgrades-question-8-answer-4": "Muito do que está mudando sempre esteve nos planos do Ethereum desde 2015. Mas as condições atuais estão tornando essas melhorias cada vez mais necessárias.", - "page-upgrades-question-8-answer-6": "Conheça a visão do Ethereum", + "page-upgrades-question-8-answer-6": "Conheça a visão sobre o Ethereum", "page-upgrades-question-8-desc": "O Ethereum que utilizamos hoje precisa oferecer uma melhor experiência para usuários finais e participantes da rede.", "page-upgrades-question-8-title": "Por que as melhorias são necessárias?", - "page-upgrades-question-9-answer-1": "O papel mais ativo que você pode desempenhar é a participação com seus ETH.", + "page-upgrades-question-9-answer-1": "O papel mais ativo que você pode desempenhar é participar com seus ETH.", "page-upgrades-question-9-answer-2": "Você também pode querer executar um segundo cliente para ajudar a melhorar a diversidade de clientes.", "page-upgrades-question-9-answer-3": "Se você tem habilidades mais técnicas, pode ajudar a resolver bugs em novos clientes.", "page-upgrades-question-9-answer-4": "Você também pode participar das discussões técnicas com pesquisadores do Ethereum em ethresear.ch.", "page-upgrades-question-9-desc": "Você não precisa ser técnico para contribuir. A comunidade está procurando contribuições de todos os tipos de habilidades.", "page-upgrades-question-9-stake-eth": "Participe com ETH", "page-upgrades-question-9-title": "Como posso contribuir para melhorias no Ethereum?", - "page-upgrades-question-9-more": "Encontre formas mais gerais de se envolver com Ethereum", + "page-upgrades-question-9-more": "Encontre formas mais gerais de se envolver com o Ethereum", "page-upgrades-question-10-title": "Quais são as fases do Eth2?'", "page-upgrades-question-10-desc": "Algumas coisas mudaram aqui.", - "page-upgrades-question-10-answer-0": "O próprio termo \"Eth2\" está sendo eliminado, uma vez que não representa uma atualização única ou nova rede. É mais precisamente um conjunto de várias melhorias e todas fazem sua parte para tornar o Ethereum mais dimensionável, seguro e sustentável. A rede que você conhece e ama simplesmente será referida como Ethereum.", + "page-upgrades-question-10-answer-0": "O próprio termo \"Eth2\" está sendo eliminado, uma vez que não representa uma melhoria única ou nova rede. É mais precisamente um conjunto de várias melhorias e todas fazem sua parte para tornar o Ethereum mais dimensionável, seguro e sustentável. A rede que você conhece e ama simplesmente será referida como Ethereum.", "page-upgrades-question-10-answer-1": "Somos relutantes em falar em termos de um roadmap técnico, porque é um software: as coisas podem mudar. Achamos que é mais fácil entender o que está acontecendo quando você lê sobre os resultados.", "page-upgrades-question-10-answer-1-link": "Veja as melhorias", "page-upgrades-question-10-answer-2": "Mas se você seguiu as discussões, esta é a maneira como as melhorias se encaixam nos roadmaps técnicos.", "page-upgrades-question-10-answer-3": "A Fase 0 descreve o que é feito para manter a Beacon Chain funcionando.", "page-upgrades-question-10-answer-5": "A fase 1 originalmente se concentrou na implementação das cadeias de fragmentos, mas a priorização mudou para A Fusão, lançada em 15 de setembro de 2022.", - "page-upgrades-question-10-answer-6": "A fase 1.5 foi originalmente planejada para seguir as implementações de fragmentos quando a Rede principal fosse adicionada como o último fragmento à Beacon Chain. No entanto, à medida que a tecnologia de rollup progrediu, a comunidade do Ethereum acelerou a transição, afastando-se da prova de trabalho.", - "page-upgrades-question-10-answer-7": "Os planos em torno da Fase 2 têm sido um ponto de intensa pesquisa e discussão. Com A Fusão por trás de nós e os avanços nas soluções de camada 2, os objetivos mudaram para fornecer uma forma mais simplificada de fragmentação de dados para maximizar a eficiência do rollup. A camada 2 atual permite a capacidade de dimensionar a execução da transação, e a fragmentação permitirá o armazenamento de provas para esses dados na camada 1 de maneira barata e escalável.", + "page-upgrades-question-10-answer-6": "A fase 1.5 foi originalmente planejada para seguir as implementações de fragmentos quando a Rede principal fosse adicionada como o último fragmento à Beacon Chain. No entanto, à medida que a tecnologia de rollup progrediu, a comunidade do Ethereum acelerou a transição, migrando da prova de trabalho.", + "page-upgrades-question-10-answer-7": "Os planos em torno da Fase 2 têm sido um ponto de intensa pesquisa e discussão. Com a implementação da Fusão e os avanços nas soluções de camada 2, os objetivos mudaram para fornecer uma forma mais simplificada de fragmentação de dados para maximizar a eficiência do rollup. A camada 2 atual permite a capacidade de dimensionar a execução da transação, e a fragmentação permitirá o armazenamento de provas para esses dados na camada 1 de maneira barata e escalável.", "page-upgrades-question-10-answer-8": "Mais sobre o roadmap voltado a rollups", "page-upgrades-question-11-title": "Posso comprar Eth2?", - "page-upgrades-question-11-desc": "Não. Não há nenhum token Eth2 e seu ETH não mudou após A Fusão.", - "page-upgrades-question-11-answer-1": "Um dos principais motivos por trás da alteração do termo Eth2 era o equívoco comum de que os detentores de ETH eram obrigados a migrar seu ETH para \"ETH 2.0\" após A Fusão ou qualquer outra atualização. Isso não é verdade e nunca foi.", + "page-upgrades-question-11-desc": "Não. Não há nenhum token Eth2, e seu ETH não mudou após a Fusão.", + "page-upgrades-question-11-answer-1": "Um dos principais motivos por trás da alteração do termo Eth2 era o equívoco comum de que os detentores de ETH eram obrigados a migrar seu ETH para \"ETH 2.0\" após a Fusão ou qualquer outra melhoria. Isso não é verdade e nunca foi.", "page-upgrades-question-11-answer-2": " Essa confusão geralmente é explorada por golpistas.", "page-upgrades-question-title": "Perguntas frequentes", - "page-upgrades-question3-answer-1": "Os detentores de ETH certamente não necessitarão fazer nada. Seus ETH não precisarão de mudanças ou atualizações. Com certeza existirão fraudadores dizendo o contrário, então tenha cuidado.", + "page-upgrades-question3-answer-1": "Os detentores de ETH não necessitarão fazer nada. Seus ETH não precisarão de mudanças ou melhorias. Com certeza existirão golpistas dizendo o contrário, então tenha cuidado.", "page-upgrades-scalable": "Mais dimensionável", "page-upgrades-scalable-desc": "O Ethereum precisa lidar com milhares de transações por segundo, para tornar os aplicativos mais rápidos e mais baratos de usar.", "page-upgrades-secure": "Mais seguro", "page-upgrades-secure-desc": "O Ethereum precisa ser mais seguro. À medida que a adoção do Ethereum aumenta, o protocolo precisa ficar mais seguro contra todas as formas de ataque.", - "page-upgrades-shard-date": "A fragmentação acompanhará A Fusão em várias fases, entre 2023 e 2024.", - "page-upgrades-shard-desc": "O Danksharding ampliará a capacidade do Ethereum de armazenar dados e trabalhará em harmonia com as L2s para dimensionar a taxa de transferência e reduzir as taxas de rede. O Danksharding será implementado em diversas etapas, começando com o ProtoDanksharding.", + "page-upgrades-shard-date": "A fragmentação acompanhará a Fusão em várias fases, em algum momento entre 2023 e 2024.", + "page-upgrades-shard-desc": "O Danksharding ampliará a capacidade do Ethereum de armazenar dados e funcionará em harmonia com as L2s para dimensionar a taxa de transferência e reduzir as taxas de rede. Também será implementado em diversas etapas, começando com o ProtoDanksharding.", "page-upgrades-shard-estimate": "Estimativa: 2023-2024", "page-upgrades-shard-lower": "Mais sobre fragmentação", "page-upgrades-shard-title": "Fragmentação", "page-upgrades-stay-up-to-date": "Mantenha-se atualizado", - "page-upgrades-stay-up-to-date-desc": "Fique por dentro das últimas notícias dos pesquisadores e desenvolvedores que trabalham nas atualizações do Ethereum.", + "page-upgrades-stay-up-to-date-desc": "Fique por dentro das últimas notícias dos pesquisadores e desenvolvedores que trabalham nas melhorias do Ethereum.", "page-upgrades-sustainable-desc": "O consumo de energia do Ethereum era intenso até recentemente. A transição para a prova de participação trouxe uma redução de energia para a rede de mais de 99,9%.", "page-upgrades-take-part": "Participe da pesquisa", "page-upgrades-take-part-desc": "Os pesquisadores e entusiastas do Ethereum se encontram aqui para discutir os esforços de pesquisa, incluindo tudo sobre as melhorias do Ethereum.", "page-upgrades-the-upgrades": "As melhorias do Ethereum", - "page-upgrades-the-upgrades-desc": "As atualizações do Ethereum visam melhorar a escalabilidade, segurança e sustentabilidade da rede. O Ethereum passou recentemente por algumas grandes melhorias na segurança e sustentabilidade, e outras estão por vir, especialmente em relação à escalabilidade.", - "page-upgrades-unofficial-roadmap": "Não se trata de um roteiro oficial. É assim que vemos o que está acontecendo com base nas informações disponíveis. Mas como isso é tecnologia, as coisas podem mudar rapidamente. Pedimos, então, que não veja isso como um processo imutável.", + "page-upgrades-the-upgrades-desc": "As melhorias do Ethereum visam aumentar o dimensionamento, a segurança e a sustentabilidade da rede. O Ethereum passou recentemente por algumas grandes melhorias na segurança e sustentabilidade, e outras estão por vir, especialmente em relação ao dimensionamento.", + "page-upgrades-unofficial-roadmap": "Não se trata de um roadmap oficial. É assim que vemos o que está acontecendo com base nas informações disponíveis. Mas como isso é tecnologia, as coisas podem mudar rapidamente. Pedimos, então, que não veja isso como um processo imutável.", "page-upgrades-upgrade-desc": "O Ethereum que conhecemos e amamos, agora mais dimensionável, seguro e sustentável...", "page-upgrades-upgrades": "As melhorias do Ethereum", "page-upgrades-upgrades-aria-label": "Menu de melhorias do Ethereum", @@ -172,33 +172,33 @@ "page-upgrades-energy-consumption": "Mais sobre o consumo energético do Ethereum", "page-upgrades-upgrading": "Melhorias do Ethereum para níveis mais avançados", "page-roadmap-vision": "A visão", - "page-roadmap-vision-btn": "Mais sobre a visão Ethereum", + "page-roadmap-vision-btn": "Mais acerca da visão sobre o Ethereum", "page-roadmap-vision-desc": "Para integrar o Ethereum e atender a toda a humanidade, precisamos torná-lo mais dimensionável, seguro e sustentável.", - "page-upgrades-what-happened-to-eth2-title": "O que aconteceu com \"Eth2?\"", + "page-upgrades-what-happened-to-eth2-title": "O que aconteceu com o \"Eth2\"?", "page-upgrades-what-happened-to-eth2-1": "O termo \"Eth2\" era comumente usado antes da Fusão, mas está sendo descontinuado e substituído por uma terminologia mais precisa.", - "page-upgrades-what-happened-to-eth2-1-more": "Mais sobre a fusão.", - "page-upgrades-what-happened-to-eth2-2": "Desde a fusão de \"Eth1\" e \"Eth2\", não há mais duas cadeias de blocos Ethereum distintas; existe apenas um Ethereum.", + "page-upgrades-what-happened-to-eth2-1-more": "Mais informações sobre a Fusão.", + "page-upgrades-what-happened-to-eth2-2": "Desde a fusão de \"Eth1\" e \"Eth2\", não há mais duas blockchains Ethereum distintas; existe apenas um Ethereum.", "page-upgrades-what-happened-to-eth2-3": "Para diminuir a confusão, a comunidade atualizou estes termos:", - "page-upgrades-what-happened-to-eth2-3-1": "O \"Eth1\" é agora a \"camada de execução\", que lida com transações e execução.", + "page-upgrades-what-happened-to-eth2-3-1": "O \"Eth1\" agora é a \"camada de execução\", que lida com transações e execução.", "page-upgrades-what-happened-to-eth2-3-2": "O \"Eth2\" é agora a \"camada de consenso\", que lida com o consenso da prova de participação.", - "page-upgrades-what-happened-to-eth2-4": "Estas atualizações de terminologia apenas alteram as convenções de nomenclatura; isso não altera os objetivos ou o roadmap do Ethereum.", - "page-upgrades-what-happened-to-eth2-5": "Saiba mais sobre a renomeação 'Eth2'", + "page-upgrades-what-happened-to-eth2-4": "Estas atualizações de terminologia apenas alteram as convenções de nomenclatura; isso não altera os objetivos ou o roteiro do Ethereum.", + "page-upgrades-what-happened-to-eth2-5": "Saiba mais sobre a renomeação \"Eth2\"", "page-upgrades-why-cant-we-just-use-eth2-title": "Por que não podemos simplesmente usar Eth2?", "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "Modelos mentais", - "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Um dos principais problemas com a marca Eth2 é que ela cria um modelo mental errado para novos usuários do Ethereum. Acreditam intuitivamente que Eth1 vem primeiro e Eth2 vem depois. Ou que a Eth1 deixa de existir uma vez que a Eth2 existe, nenhum deles é verdadeiro. Removendo a terminologia Eth2, evitamos que todos os futuros usuários naveguem por este modelo mental confuso.", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Um dos principais problemas com a marca Eth2 é que ela cria um modelo mental errado para novos usuários do Ethereum. Acreditam intuitivamente que Eth1 vem primeiro e Eth2 vem depois, ou que a Eth1 deixa de existir uma vez que a Eth2 existe. Mas nada disso é certo. Ao remover a terminologia Eth2, evitamos que todos os futuros usuários lidem com esse modelo mental confuso.", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "Inclusividade", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "À medida que o roteiro para o Ethereum evoluiu, o Ethereum 2.0 tornou-se uma representação imprecisa do roteiro do Ethereum. Sendo cuidadosos e precisos em nossa escolha de palavras permite que o conteúdo do Ethereum seja entendido pelo público mais amplo possível.", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "Prevenção contra golpes", - "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "Infelizmente, atores maliciosos tentaram usar o temo impróprio Eth2 para enganar usuários, dizendo a eles para trocar seus ETH por tokens \"ETH2\" ou que eles deveriam de alguma forma migrar seus ETH antes da atualização do Eth2. Esperamos que essa terminologia atualizada traga clareza para eliminar este vetor de fraude e ajudar a tornar o ecossistema mais seguro.", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "Infelizmente, pessoas mal-intencionadas tentaram usar o termo incorreto Eth2 para enganar usuários, dizendo a eles para trocar seus ETH por tokens \"ETH2\" ou que eles deveriam de alguma forma migrar seus ETH antes da atualização do Eth2. Esperamos que essa terminologia atualizada traga clareza para eliminar este vetor de fraude e ajudar a tornar o ecossistema mais seguro.", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "Transparência na participação", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "Alguns operadores de participação também representaram ETH em participação na Beacon Chain com o rótulo de \"ETH2\". Isso gera uma potencial confusão, uma vez que os utilizadores desses serviços não recebem realmente um token \"ETH2\". Não existe um token \"ETH2\"; ele simplesmente representa a sua parte na participação de um provedor específico.", "page-upgrades-what-to-do": "O que você precisa fazer?", "page-upgrades-what-to-do-desc": "Se você é um usuário de dapps ou um detentor de ETH, não precisa fazer nada. Se você é um desenvolvedor ou quer começar a participar, existem formas de fazer isso hoje mesmo.", "page-upgrades-whats-next": "Quais são as melhorias do Ethereum?", - "page-upgrades-whats-next-desc": "O roadmap do Ethereum envolve melhorias de protocolo interconectadas que tornarão a rede mais dimensionável, mais segura e mais sustentável. Estas melhorias estão sendo desenvolvidas por várias equipes de todo o ecossistema do Ethereum.", - "page-upgrades-whats-next-history": "Aprenda sobre melhorias anteriores do Ethereum", + "page-upgrades-whats-next-desc": "O roadmap do Ethereum envolve melhorias de protocolo interconectadas que tornarão a rede mais dimensionável, mais segura e mais sustentável. Essas melhorias estão sendo desenvolvidas por várias equipes de todo o ecossistema do Ethereum.", + "page-upgrades-whats-next-history": "Saiba mais sobre as melhorias anteriores do Ethereum", "page-upgrades-whats-ethereum": "Um momento, o que é Ethereum?", - "page-upgrades-whats-new": "Ethereum: próximos passos", + "page-upgrades-whats-new": "Ethereum: próximas etapas", "page-upgrades-security-link": "Mais sobre segurança e prevenção de fraude", "page-staking-deposit-contract-staking-more-link": "Mais sobre participação", "docs-nav-proof-of-stake": "Prova de participação", diff --git a/src/intl/pt-br/page-wallets-find-wallet.json b/src/intl/pt-br/page-wallets-find-wallet.json index c6e7fb5ac2b..de451aecbfa 100644 --- a/src/intl/pt-br/page-wallets-find-wallet.json +++ b/src/intl/pt-br/page-wallets-find-wallet.json @@ -1,6 +1,6 @@ { "page-find-wallet-clear": "Limpar filtros", - "page-find-wallet-desc-2": "Então, escolha sua carteira com base nas características que você deseja.", + "page-find-wallet-desc-2": "Escolha sua carteira com base nas características que você deseja.", "page-find-wallet-description": "As carteiras têm muitos recursos dos quais você pode gostar.", "page-find-wallet-last-updated": "Última atualização", "page-find-wallet-meta-description": "Encontre e compare carteiras Ethereum com base nos recursos que você deseja.", @@ -30,8 +30,8 @@ "page-find-wallet-swaps-desc": "Trocar tokens ERC-20 diretamente na carteira", "page-find-wallet-layer-2": "Camada 2", "page-find-wallet-layer-2-desc": "Carteiras que suportam camadas 2 de Ethereum", - "page-find-wallet-gas-fee-customization": "Personalização da taxa de gás", - "page-find-wallet-gas-fee-customization-desc": "Personalize suas quantidades de gás (taxa base, taxa prioritária e taxa máxima)", + "page-find-wallet-gas-fee-customization": "Personalização da taxa Gas", + "page-find-wallet-gas-fee-customization-desc": "Personalize suas quantidades de Gas (taxa base, taxa prioritária e taxa máxima)", "page-find-wallet-ens-support": "Suporte para ENS", "page-find-wallet-ens-support-desc": "Carteiras que suportam o Ethereum Name Service (ENS)", "page-find-wallet-token-importing": "Importação de token", @@ -40,7 +40,7 @@ "page-find-wallet-fee-optimization-desc": "Suporte a transações tipo 2 para taxas de gás otimizadas e taxas de reembolso para gás não utilizado", "page-find-wallet-buy-crypto": "Comprar cripto", "page-find-wallet-buy-crypto-desc": "Compre cripto com fiat diretamente na carteira \n *Observação: comprar cripto pode ser específico da região", - "page-find-wallet-sell-for-fiat": "Venda por fiat", + "page-find-wallet-sell-for-fiat": "Venda através de fiduciários", "page-find-wallet-sell-for-fiat-desc": "Vender cripto para fiduciário diretamente na carteira\n *Observação: saque de cripto pode ser específico da região", "page-find-wallet-multisig": "Multi-assinaturas", "page-find-wallet-multisig-desc": "Carteiras que requerem múltiplas assinaturas para autorizar uma transação", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Carteiras com extensões de navegador", "page-find-wallet-device": "Dispositivo", "page-find-choose-to-compare": "Selecione para comparar", - "page-find-wallet-choose-features": "Escolher recursos" + "page-find-wallet-choose-features": "Escolher recursos", + "page-find-wallet-reset-filters": "Redefinir filtros" } diff --git a/src/intl/pt-br/page-wallets.json b/src/intl/pt-br/page-wallets.json index 438f33613e0..fe5ee2cb32b 100644 --- a/src/intl/pt-br/page-wallets.json +++ b/src/intl/pt-br/page-wallets.json @@ -3,7 +3,7 @@ "page-wallets-accounts-addresses-desc": "Vale a pena entender as diferenças entre alguns termos-chave.", "page-wallets-accounts-ethereum-addresses": "Uma conta Ethereum tem um endereço, assim como um e-mail tem um endereço. Isso é utilizado para identificar os seus ativos digitais.", "page-wallets-alt": "Ilustração de um robô com um corpo em forma de cofre, representando uma carteira Ethereum", - "page-wallets-ethereum-account": "Uma conta Ethereum é um par de chaves. Uma chave é utilizada para criar o endereço e pode ser compartilhada livremente, enquanto a outra chave deverá ser mantida em segredo, pois é utilizada para assinar instrumentos. Juntas, essas chaves permitem manter ativos e realizar transações.", + "page-wallets-ethereum-account": "Uma conta Ethereum é um par de chaves. Uma chave é usada para criar o endereço que você pode compartilhar livremente, e a outra chave você precisa manter em segredo, pois é usada para assinar coisas. Juntas, essas chaves permitem que você detenha ativos e realize transações.", "page-wallets-blog": "Blog da Coinbase", "page-wallets-bookmarking": "Marque sua carteira nos Favoritos", "page-wallets-bookmarking-desc": "Se você usar uma carteira web, coloque o site nos Favoritos para se proteger contra golpes de phishing.", @@ -13,7 +13,7 @@ "page-wallets-desc-3": "A sua carteira é uma ferramenta para interagir com a sua conta Ethereum. Ou seja, você pode trocar de provedor de carteira a qualquer momento. Muitas carteiras também permitem gerenciar diversas contas Ethereum em um único aplicativo.", "page-wallets-desc-4": "Os provedores de carteira não têm custódia sobre os seus fundos, apenas oferecem um espaço para visualização dos seus ativos no Ethereum e ferramentas para gerenciá-los facilmente.", "page-wallets-description": "As carteiras Ethereum são aplicativos que permitem que você controle a sua conta. Assim como uma carteira física, ela contém tudo o que você precisa para comprovar a sua identidade e gerenciar os seus ativos. A sua carteira permite fazer login em aplicativos, ver saldos, enviar transações e verificar a sua identidade.", - "page-wallets-desktop": "Aplicativos desktop, se você preferir gerenciar seus fundos via MacOS, Windows ou Linux", + "page-wallets-desktop": "Aplicativos desktop, se você prefere gerenciar seus fundos via MacOS, Windows ou Linux", "page-wallets-ethereum-wallet": "Uma carteira é uma ferramenta que permite a interação com a sua conta por meio de chaves, bem como ver o saldo da conta, enviar transações e muito mais.", "page-wallets-explore": "Conheça Ethereum", "page-wallets-features-desc": "Nós podemos ajudá-lo a escolher sua carteira com base nos recursos que são mais importantes para você.", @@ -38,8 +38,8 @@ "page-wallets-seed-phrase-desc": "As carteiras geralmente darão a você uma frase \"semente\" que você deve escrever em algum lugar seguro. Esta é a única maneira para você recuperar sua carteira.", "page-wallets-seed-phrase-example": "Aqui está um exemplo:", "page-wallets-seed-phrase-snippet": "there aeroplane curve vent formation doge possible product distinct under spirit lamp", - "page-wallets-seed-phrase-write-down": "Não a armazene em um computador. Anote-a e mantenha-a segura.", - "page-wallets-slogan": "Controle as chaves do seu futuro digital", + "page-wallets-seed-phrase-write-down": "Não a armazene no computador. Anote e mantenha-a em segurança.", + "page-wallets-slogan": "Mantendo as chaves para o seu futuro digital", "page-wallets-stay-safe": "Como se manter seguro", "page-wallets-stay-safe-desc": "Para ter liberdade financeira e a capacidade de acessar e utilizar fundos em qualquer lugar envolve responsabilidades – não há atendimento ao cliente no espaço cripto. Você é responsável por manter as suas chaves seguras e protegidas.", "page-wallets-subtitle": "As carteiras ajudam você a acessar os seus ativos digitais e fazer login em aplicativos.", @@ -61,7 +61,7 @@ "page-wallets-your-ethereum-account": "Sua conta Ethereum", "page-wallets-your-ethereum-account-desc": "A sua carteira é a janela para a sua conta Ethereum – o seu saldo, histórico de transações e muito mais. Mas você pode trocar os provedores de carteira a qualquer momento.", "page-wallets-your-login": "Seu login para aplicativos Ethereum", - "page-wallets-your-login-desc": "A sua carteira permite a conexão a aplicativos por meio da sua conta Ethereum. Serve como credenciais de login que você pode utilizar em diversos aplicativos.", + "page-wallets-your-login-desc": "Sua carteira permite que você se conecte a aplicativos usando a sua conta Ethereum. É como um login que você pode usar em vários aplicativos.", "additional-reading-how-to-create-an-ethereum-account": "Como criar uma conta Ethereum", "additional-reading-how-to-use-a-wallet": "Como usar uma carteira" } diff --git a/src/intl/pt-br/page-what-is-ethereum.json b/src/intl/pt-br/page-what-is-ethereum.json index b38ca941f87..9e610911cb2 100644 --- a/src/intl/pt-br/page-what-is-ethereum.json +++ b/src/intl/pt-br/page-what-is-ethereum.json @@ -57,15 +57,15 @@ "page-what-is-ethereum-slide-4-title": "Empoderando gamers", "page-what-is-ethereum-slide-4-desc-1": "Jogos Play-to-Earn (onde os jogadores são de fato recompensados por jogar os jogos) surgiram recentemente e estão transformando a indústria de jogos. Tradicionalmente, muitas vezes é proibido negociar ou transferir ativos do jogo para outros jogadores com dinheiro real. Isso força os jogadores a usar sites do mercado negro que geralmente são um risco de segurança. Os jogos Blockchain abraçam a economia do jogo e promovem esse comportamento de maneira confiável.", "page-what-is-ethereum-slide-4-desc-2": "Além disso, os jogadores são incentivados pela possibilidade de trocar os tokens do jogo por dinheiro real e, assim, serem verdadeiramente recompensados pelo tempo que jogaram.", - "page-what-is-ethereum-meet-ether-title": "Conheça o ether, a criptomoeda da Ethereum", - "page-what-is-ethereum-meet-ether-desc-1": "Muitas ações na rede Ethereum exigem que algum trabalho seja feito no computador embutido do Ethereum (conhecido como Ethereum Virtual Machine). Esta computação não é gratuita; é paga usando a criptomoeda nativa do Ethereum chamada ether (ETH). Isso significa que você precisa de pelo menos uma pequena quantidade de ether para usar a rede.", - "page-what-is-ethereum-meet-ether-desc-2": "O Ether é puramente digital e você pode enviá-lo para qualquer pessoa em qualquer lugar do mundo instantaneamente. O fornecimento de ether não é controlado por nenhum governo ou empresa — ele é descentralizado e totalmente transparente. O Ether é emitido de maneira precisa, e de acordo com o protocolo, apenas aos participantes que protegem a rede.", + "page-what-is-ethereum-meet-ether-title": "Conheça o Ether, a criptomoeda da Ethereum", + "page-what-is-ethereum-meet-ether-desc-1": "Muitas ações na rede Ethereum exigem que algum trabalho seja feito no computador embutido do Ethereum (conhecido como Ethereum Virtual Machine). Esta computação não é gratuita; é paga usando a criptomoeda nativa do Ethereum chamada Ether (ETH). Isso significa que você precisa de pelo menos uma pequena quantidade de Ether para usar a rede.", + "page-what-is-ethereum-meet-ether-desc-2": "O Ether é puramente digital e você pode enviá-lo para qualquer pessoa em qualquer lugar do mundo instantaneamente. O fornecimento de ether não é controlado por nenhum governo ou empresa - ele é descentralizado e totalmente transparente. O Ether é emitido de maneira precisa de acordo com o protocolo, apenas aos participantes que protegem a rede.", "page-what-is-ethereum-what-is-ether": "O que é ether?", "page-what-is-ethereum-get-eth": "Compre ETH", "page-what-is-ethereum-explore-applications": "Conheça as aplicações", "page-what-is-ethereum-learn-defi": "Saiba mais sobre DeFi", "page-what-is-ethereum-who-runs-ethereum-title": "Quem executa o Ethereum?", - "page-what-is-ethereum-who-runs-ethereum-desc-1": "O Ethereum não é controlado por nenhuma entidade em particular. Ele existe sempre que há computadores conectados executando software seguindo o protocolo Ethereum e adicionando à blockchain Ethereum. Cada um desses computadores é conhecido como um nó. Os nós podem ser executados por qualquer pessoa, embora, para participar da proteção da rede, você precisa colocar ETH (token nativo do Ethereum). Qualquer pessoa com 32 ETH pode fazer isso sem precisar de permissão.", + "page-what-is-ethereum-who-runs-ethereum-desc-1": "O Ethereum não é controlado por nenhuma entidade em particular. Ele existe sempre que há computadores conectados executando software seguindo o protocolo Ethereum e adicionando ao blockchain Ethereum. Cada um desses computadores é conhecido como um nó. Os nós podem ser executados por qualquer pessoa, embora, para participar da proteção da rede, você precisa colocar ETH (token nativo do Ethereum). Qualquer pessoa com 32 ETH pode fazer isso sem precisar de permissão.", "page-what-is-ethereum-who-runs-ethereum-desc-2": "Até mesmo o código-fonte do Ethereum não é produzido por uma única entidade. Qualquer um pode sugerir mudanças no protocolo e discutir atualizações. Existem várias implementações do protocolo Ethereum que são produzidas por organizações independentes em várias linguagens de programação, e elas geralmente são construídas de forma aberta e encorajam as contribuições da comunidade.", "page-what-is-ethereum-run-a-node": "Execute um nó", "page-what-is-ethereum-smart-contract-title": "O que são contratos inteligentes?", diff --git a/src/scripts/crowdin-import.ts b/src/scripts/crowdin-import.ts index 03c73ad55d0..fd75a3b940c 100644 --- a/src/scripts/crowdin-import.ts +++ b/src/scripts/crowdin-import.ts @@ -64,7 +64,7 @@ type BucketsList = { [key: string]: Array } const USER_OVERRIDE: BucketsList = { // FORMAT: lang_code: [bucket_number, bucket_number, ...], // EXAMPLE: es: [1, 10, 12, 14], - + 'pt-br': [1,2,9,10,11,12,13,14,16,17,18,21,22,23,24,25,26,27,28] } /****************************** From 5d050b619c6c05aa9585ea91b320682e641a197f Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 18 Jan 2024 17:34:20 -0700 Subject: [PATCH 044/478] Russian import (Homepage, Essential pages, Learn hub & guide, Community, Foundational docs) --- .../ru/community/get-involved/index.md | 2 +- .../translations/ru/community/grants/index.md | 34 +- .../ru/community/language-resources/index.md | 2 +- .../translations/ru/community/online/index.md | 6 +- .../ru/community/research/index.md | 5 +- .../ru/community/support/index.md | 18 +- .../ru/developers/docs/blocks/index.md | 16 +- .../ru/developers/docs/evm/index.md | 3 +- .../ru/developers/docs/evm/opcodes/index.md | 308 +++++++++--------- .../ru/developers/docs/gas/index.md | 4 +- .../ru/developers/docs/networks/index.md | 27 +- .../ru/developers/docs/transactions/index.md | 2 +- .../index.md | 2 +- .../ru/guides/how-to-swap-tokens/index.md | 4 +- .../ru/guides/how-to-use-a-bridge/index.md | 2 +- .../ru/guides/how-to-use-a-wallet/index.md | 2 +- src/intl/ru/common.json | 27 +- src/intl/ru/page-gas.json | 64 ++++ src/intl/ru/page-get-eth.json | 37 ++- src/intl/ru/page-index.json | 2 +- src/intl/ru/page-learn.json | 2 +- src/intl/ru/page-wallets-find-wallet.json | 3 +- 22 files changed, 334 insertions(+), 238 deletions(-) create mode 100644 src/intl/ru/page-gas.json diff --git a/public/content/translations/ru/community/get-involved/index.md b/public/content/translations/ru/community/get-involved/index.md index 6acc443a8d5..58c4e3c7a0d 100644 --- a/public/content/translations/ru/community/get-involved/index.md +++ b/public/content/translations/ru/community/get-involved/index.md @@ -28,7 +28,7 @@ lang: ru - Составьте или рассмотрите предложение по улучшению Ethereum (EIP) - Составьте EIP 1. Представьте свою идею на [Ethereum Magicians](https://ethereum-magicians.org) - 2. Прочтите [EIP-1](https://eip.ethereum.org/EIPS/eip-1) — **да, это _весь_ документ.** + 2. Прочтите [EIP-1](https://eips.ethereum.org/EIPS/eip-1). **Да, это _весь_ документ.** 3. Следуйте указаниям из документа EIP-1. Ссылайтесь на него при составлении черновика. - Узнайте, как стать [редактором EIP](https://eips.ethereum.org/EIPS/eip-5069) - Теперь вы можете рассматривать EIP других участников! Просматривайте [открытые запросы на включение изменений с тегом `e-review`](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Давайте обратную связь относительно технических аспектов по ссылке `discussion-to`. diff --git a/public/content/translations/ru/community/grants/index.md b/public/content/translations/ru/community/grants/index.md index aa7cadd9287..1628070804f 100644 --- a/public/content/translations/ru/community/grants/index.md +++ b/public/content/translations/ru/community/grants/index.md @@ -1,5 +1,5 @@ --- -title: Фонд Ethereum и программы грантов сообщества +title: Фонд Ethereum Foundation и программы грантов сообщества description: Список программ грантов в рамках экосистемы Ethereum. lang: ru --- @@ -15,31 +15,27 @@ lang: ru Эти программы поддерживают обширную экосистему Ethereum, предлагая гранты для широкого круга проектов. Они включают решения по масштабируемости, созданию сообществ, безопасности, конфиденциальности и не только. Эти гранты не относятся к какой-либо конкретной платформе Ethereum и являются хорошей отправной точкой, если вы не уверены в себе. - [Программа поддержки экосистемы EF](https://esp.ethereum.foundation) — _финансирование проектов с открытым исходным кодом, которые приносят пользу Ethereum, с особым акцентом на универсальные инструменты, инфраструктуру, исследования и общественные блага_ -- [Запросы предложений (RFP) Ethereum](https://github.com/ethereum/requests-for-proposals) — _запросы предложений Фондом Ethereum для работы и проектов в экосистеме Ethereum_ -- [MetaCartel](https://www.metacartel.org/grants/) — _разработка децентрализованных приложений, создание DAO_ -- [Децентрализованная автономная организация (DAO) Moloch](https://www.molochdao.com/) — _конфиденциальность, масштабирование второго уровня, безопасность клиентов и многое другое_ -- [Открытые гранты](https://opengrants.com/explore) -- [Гранты DAO](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) — _таблица Google организаций, предлагающих гранты_ -- [Аналог Crunchbase для грантов по Web3](https://www.cryptoneur.xyz/web3-grants) — _отфильтровывайте и ищите гранты по категории, назначению, количеству и другим характеристикам. Внесите свой вклад, чтобы помочь другим найти нужный грант._ -- [Академические гранты](https://esp.ethereum.foundation/academic-grants) — _гранты на поддержку академической работы, связанной с Ethereum_ +- [MetaCartel](https://www.metacartel.org/grants/): _разработка децентрализованных приложений, создание DAO._ +- [DAO Moloch](https://www.molochdao.com/): _конфиденциальность, масштабирование второго уровня, безопасность клиентов и многое другое._ +- [Гранты DAO](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0): _Google-таблица организаций, предлагающих гранты._ +- [Crunchbase для грантов по Web3](https://www.cryptoneur.xyz/web3-grants): _отфильтровывайте и ищите гранты по категории, назначению, количеству и другим характеристикам. Помогите другим найти нужный грант._ +- [Академические гранты](https://esp.ethereum.foundation/academic-grants): _гранты на поддержку академической работы, связанной с Ethereum._ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs): _компания Blockworks составила полный каталог всех грантов, запросов предложений (RFP) и наград за найденные ошибки._ ## Отдельные проекты {#project-specific} В рамках этих проектов созданы их собственные гранты, направленные на разработку и тестирование собственных технологий. - [Программа грантов Aave](https://aavegrants.org/) — _гранты DAO от [Aave](https://aave.com/)_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) — _фонд экосистемы [Balancer](https://balancer.fi/)_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41): _фонд экосистемы [Balancer](https://balancer.fi/)._ - [Программа грантов Chainlink](https://chain.link/community/grants) — _гранты сообщества [Chainlink](https://chain.link/)_ -- [Программа грантов Compound](https://compoundgrants.org/) — _финансовая экосистема [Compound](https://compound.finance/)_ -- [ Программа грантов Decentraland](https://governance.decentraland.org/grants/) — _метавселенная децентрализованных автономных организаций (DAO) [Decentraland](https://decentraland.org/)_ -- [Организация грантов экосистемы Lido (LEGO)](https://lego.lido.fi/) — _финансовая экосистема [Lido](https://lido.fi/)_ -- [ Программа MetaMask](https://metamaskgrants.org/) — _децентрализованная автономная организация (DAO) по выдаче грантов, возглавляемая сотрудниками [MetaMask](https://metamask.io/)_ -- [Программа грантов mStable](https://docs.mstable.org/advanced/grants-program) — _сообщество [mStable](https://mstable.org/)_ -- [Программа грантов SKALE Network](https://skale.space/developers#grants) — _экосистема [SKALE Network](https://skale.space/)_ -- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) — _экосистема [The Graph](https://thegraph.com/)_ -- [Программа грантов UMA](https://grants.umaproject.org/) — _поддержка разработчиков [UMA](https://umaproject.org/)_ -- [Программа грантов Uniswap](https://www.unigrants.org/) — _сообщество [Uniswap](https://uniswap.org/)_ -- [Гранты по Web3](https://web3grants.net) — _большой список грантовых программ по Web3/криптовалютам_ +- [ Программа грантов Decentraland](https://governance.decentraland.org/grants/): _метавселенная DAO [Decentraland](https://decentraland.org/)._ +- [Организация грантов экосистемы Lido (LEGO)](https://lido.fi/lego): _финансовая экосистема [Lido](https://lido.fi/)._ +- [ Программа MetaMask](https://metamaskgrants.org/): _DAO по выдаче грантов под руководством сотрудников [MetaMask](https://metamask.io/)._ +- [Программа грантов SKALE Network](https://skale.space/developers#grants): _экосистема [SKALE Network](https://skale.space/)._ +- [The Graph](https://airtable.com/shrdfvnFvVch3IOVm): _экосистема [The Graph](https://thegraph.com/)._ +- [Программа грантов Uniswap](https://www.uniswapfoundation.org/apply-for-a-grant): _сообщество [Uniswap](https://uniswap.org/)._ +- [Web3 Grants](https://web3grants.net): _обширный список грантов, связанных с web3/криптовалютами._ ## Квадратичное финансирование {#quadratic-funding} diff --git a/public/content/translations/ru/community/language-resources/index.md b/public/content/translations/ru/community/language-resources/index.md index cd59f0875a1..bdd13c751e9 100644 --- a/public/content/translations/ru/community/language-resources/index.md +++ b/public/content/translations/ru/community/language-resources/index.md @@ -72,7 +72,7 @@ lang: ru - [Gwei.cz](https://gwei.cz) — локальное сообщество на тему Web3, создает образовательный контент, организует очные и онлайн-мероприятия - [Gwei.cz Příručka](https://prirucka.gwei.cz/) — руководство по Ethereum для начинающих - [DAO Příručka](https://dao.gwei.cz/) — руководство для начинающих по DAO -- [Mastering Ethereum](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) — о тонкостях работы Ethereum на чешском языке +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) — о тонкостях работы Ethereum на чешском языке ### Французский {#fr} diff --git a/public/content/translations/ru/community/online/index.md b/public/content/translations/ru/community/online/index.md index 59daaa04008..20953881298 100644 --- a/public/content/translations/ru/community/online/index.md +++ b/public/content/translations/ru/community/online/index.md @@ -24,10 +24,10 @@ lang: ru Ethereum Cat Herders — сообщество, нацеленное на помощь с управлением проектами при разработке Ethereum Ethereum Hackers — чат Discord, управляемый ETHGlobal: онлайн-сообщество для хакеров Ethereum со всего мира CryptoDevs — сообщество Discord, сконцентрированное на разработке Ethereum -Сообщество EthStaker на Discord — сообщество для образования, наставничества, поддержки и предоставления ресурсов для существующих и потенциальных стейкеров -Команда сайта Ethereum.org — возможность решить проблемы и поговорить о разработке и дизайне ethereum.org с командой и членами сообщества +Сообщество EthStaker на Discord — сообщество для образования, наставничества, поддержки и предоставления ресурсов для существующих и потенциальных стейкеров +Команда сайта Ethereum.org — возможность решить проблемы и поговорить о разработке и дизайне ethereum.org с командой и членами сообщества Matos Discord — сообщество создателей Web3, где собираются разработчики, видные представители отрасли и энтузиасты Ethereum. Мы заинтересованы в разработке, дизайне и культуре Web3. Создавайте вместе с нами. -Solidity Gitter — чат для разработки Solidity (Gitter) +Solidity Gitter — чат для разработки Solidity (Gitter) Solidity Matrix — чат для разработки Solidity (Matrix) Ethereum Stack Exchange *— форум вопросов и ответов* Peeranha *— децентрализованный форум вопросов и ответов* diff --git a/public/content/translations/ru/community/research/index.md b/public/content/translations/ru/community/research/index.md index 15e9ae7fc23..edaff3209b9 100644 --- a/public/content/translations/ru/community/research/index.md +++ b/public/content/translations/ru/community/research/index.md @@ -124,7 +124,7 @@ lang: ru - [Введение в блокчейн-мосты](/bridges/) - [Виталик о мостах](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [Статья о блокчейн-мостах](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Значения, заблокированные в мостах]() +- [Значения, заблокированные в мостах](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Новейшие исследования {#recent-research-3} @@ -156,7 +156,7 @@ lang: ru #### Новейшие исследования {#recent-research-5} -- [ecdsa в FGPA](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [ECDSA на основе программируемых пользователем вентильных матриц (FPGA)](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Безопасность {#security} @@ -346,7 +346,6 @@ lang: ru - [Фреймворки для разработчиков](/developers/docs/frameworks/) - [Список инструментов для разработчиков с использованием консенсуса](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Стандарты токенов](/developers/docs/standards/tokens/) -- [Biastek: инструменты для Ethereum](https://biastek.com/ethereum-tools/) - [CryptoDevHub: инструменты для EVM](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Новейшие исследования {#recent-research-17} diff --git a/public/content/translations/ru/community/support/index.md b/public/content/translations/ru/community/support/index.md index 55433b8d926..379af949203 100644 --- a/public/content/translations/ru/community/support/index.md +++ b/public/content/translations/ru/community/support/index.md @@ -30,7 +30,7 @@ lang: ru - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Это не полный список. Нужна помощь в поиске поддержки для определенного кошелька? Присоединяйтесь к [ethereum.org на платформе Discord](https://discord.gg/ethereum-org), и мы постараемся помочь._ +_Это не полный список. Нужна помощь в поиске поддержки для определенного кошелька? Присоединяйтесь к [ethereum.org на платформе Discord](https://discord.gg/rZz26QWfCg), и мы постараемся помочь._ Ищете кошелек Ethereum? [Ознакомьтесь с полным списком кошельков Ethereum](/wallets/find-wallet/). @@ -39,7 +39,7 @@ _Это не полный список. Нужна помощь в поиске Этот процесс может быть сложным. Вот несколько ориентированных на разработку ресурсов с опытными разработчиками Ethereum, которые будут рады помочь. - [Университет Alchemy](https://university.alchemy.com/#starter_code) -- [CryptoDevs на платформе Discord](https://discord.gg/Z9TA39m8Yu) +- [CryptoDevs на платформе Discord](https://discord.com/invite/5W5tVb3) - [Ethereum StackExchange](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Университет Web3](https://www.web3.university/) @@ -53,7 +53,7 @@ _Это не полный список. Нужна помощь в поиске Вот примеры нескольких популярных. -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [Hardhat](https://discord.gg/xtrMGhmbfZ) @@ -65,7 +65,7 @@ _Это не полный список. Нужна помощь в поиске Если вы запускаете узел или валидатора, вот несколько сообществ, призванных помочь вам начать работу. -- [EthStaker на платформе Discord](https://discord.io/ethstaker) +- [EthStaker на платформе Discord](https://discord.gg/ethstaker) - [EthStaker на платформе Reddit](https://www.reddit.com/r/ethstaker) У большинства команд, разрабатывающих клиентов Ethereum, также есть специальные открытые площадки, где вы можете получить поддержку и задать вопросы. @@ -89,17 +89,17 @@ _Это не полный список. Нужна помощь в поиске ## Часто задаваемые вопросы {#faq} -### Эфиры (ETH) отправлены не на тот кошелек {#wrong-wallet} +#### Эфиры (ETH) отправлены не на тот кошелек {#wrong-wallet} Транзакция, отправленная на Ethereum, необратима. К сожалению, если вы отправили эфиры (ETH) не на тот кошелек, вернуть эти средства невозможно. Ни одна центральная организация, структура или лицо не владеет Ethereum — это означает, что никто не может отменить транзакции. Поэтому очень важно всегда перепроверять свои транзакции перед отправкой. -### Как мне получить Ethereum в бесплатной раздаче? {#giveaway-scam} +#### Как мне получить Ethereum в бесплатной раздаче? {#giveaway-scam} Раздачи Ethereum — это мошенничество, предназначенное для кражи ваших эфиров (ETH). Не ведитесь на предложения, которые кажутся слишком хорошими, чтобы быть правдой, — если вы отправите эфиры (ETH) на адрес раздачи, вы не получите раздачу и не сможете вернуть свои средства. [Подробнее о предотвращении мошенничества](/security/#common-scams) -### Моя транзакция зависла {#stuck-transaction} +#### Моя транзакция зависла {#stuck-transaction} Транзакции в Ethereum иногда могут зависать, если вы ввели меньшую, чем требуется в сети из-за нагрузки, комиссию за транзакцию. Многие кошельки предоставляют возможность повторной отправки той же транзакции, но с более высокой комиссией, чтобы она была обработана. Кроме того, вы можете отменить ожидающую транзакцию, отправив транзакцию на свой адрес и используя тот же одноразовый номер (nonce), что и ожидающая транзакция. @@ -107,10 +107,10 @@ _Это не полный список. Нужна помощь в поиске [Как отменить ожидающие транзакции Ethereum](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) -### Как я могу добыть Ethereum? {#mining-ethereum} +#### Как я могу добыть Ethereum? {#mining-ethereum} Майнинг Ethereum стал невозможен. Майнинг был отключен, когда Ethereum перешел с доказательства работы на доказательство владения. Теперь вместо майнеров в Ethereum появились валидаторы. Валидаторы занимаются стейкингом ETH и получают вознаграждение за обеспечение безопасности сети. -### Как я могу стать дольщиком (стейкером) или валидатором? {#become-validator} +#### Как я могу стать дольщиком (стейкером) или валидатором? {#become-validator} Чтобы стать валидатором, нужно стать дольщиком 32 ETH в депозитном контракте Ethereum и установить узел валидатора. Более подробная информация доступна на [страницах](/staking) и [лаунчпаде](https://launchpad.ethereum.org/) стейкинга. diff --git a/public/content/translations/ru/developers/docs/blocks/index.md b/public/content/translations/ru/developers/docs/blocks/index.md index b4556c44b50..336b353a754 100644 --- a/public/content/translations/ru/developers/docs/blocks/index.md +++ b/public/content/translations/ru/developers/docs/blocks/index.md @@ -1,6 +1,6 @@ --- title: Блоки -description: "Обзор блоков в блокчейне Ethereum: их структура данных, почему они необходимы и как сделаны." +description: 'Обзор блоков в блокчейне Ethereum: их структура данных, почему они необходимы и как сделаны.' lang: ru --- @@ -40,7 +40,7 @@ lang: ru В блоке содержится много разной информации. На самом высоком уровне блок содержит следующие поля: | Поле | Описание | -| :--------------- | :------------------------------------------------- | +|:---------------- |:-------------------------------------------------- | | `ячейка` | слот, к которому относится блок | | `proposer_index` | ID валидатора, который предлагает блок | | `parent_root` | хэш предыдущего блока | @@ -50,7 +50,7 @@ lang: ru Блок `body` содержит в себе несколько собственных полей: | Поле | Описание | -| :------------------- | :-------------------------------------------------------------- | +|:-------------------- |:--------------------------------------------------------------- | | `randao_reveal` | значение, используемое для выбора следующего предлагающего блок | | `eth1_data` | информация о депозитном контракте | | `граффити` | случайные данные, используемые для пометки блоков | @@ -65,7 +65,7 @@ lang: ru Поле `attestations` содержит список всех свидетельств в блоке. У свидетельств есть собственный тип данных, который содержит несколько частичек данных. Каждое свидетельство содержит следующее: | Поле | Описание | -| :----------------- | :-------------------------------------------------------- | +|:------------------ |:--------------------------------------------------------- | | `aggregation_bits` | список валидаторов, участвовавших в этом свидетельстве | | `данные` | контейнер с несколькими подполями | | `подпись` | агрегированная подпись всех свидетельствующих валидаторов | @@ -73,7 +73,7 @@ lang: ru Поле `data` в свидетельстве `attestation` содержит следующие данные: | Поле | Описание | -| :------------------ | :---------------------------------------------------------- | +|:------------------- |:----------------------------------------------------------- | | `ячейка` | слот, к которому относится свидетельство | | `index` | индексы свидетельствующих валидаторов | | `beacon_block_root` | корневой хэш блока Beacon, в котором содержится этот объект | @@ -85,7 +85,7 @@ lang: ru `execution_payload_header` содержит следующие поля: | Поле | Описание | -| :------------------ | :---------------------------------------------------------------------- | +|:------------------- |:----------------------------------------------------------------------- | | `parent_hash` | хэш родительского блока | | `fee_recipient` | адрес аккаунта для оплаты комиссий за транзакции | | `state_root` | корневой хэш глобального состояния после внесения изменений в этот блок | @@ -105,7 +105,7 @@ lang: ru Сама по себе проверочная строка `execution_payload` содержит следующие данные (заметьте, что она идентична заголовку, если не учитывать, что, в отличие корневого хэша транзакций, она включает текущий список транзакций и информации о выводах): | Поле | Описание | -| :------------------ | :---------------------------------------------------------------------- | +|:------------------- |:----------------------------------------------------------------------- | | `parent_hash` | хэш родительского блока | | `fee_recipient` | адрес аккаунта для оплаты комиссий за транзакции | | `state_root` | корневой хэш глобального состояния после внесения изменений в этот блок | @@ -125,7 +125,7 @@ lang: ru Список `withdrawals` содержит объекты вывода `withdrawal`, структурированные следующим образом: | Поле | Описание | -| :--------------- | :-------------------------------------------- | +|:---------------- |:--------------------------------------------- | | `address` | адрес аккаунта, с которого производится вывод | | `amount` | сумма вывода | | `index` | значение индекса вывода | diff --git a/public/content/translations/ru/developers/docs/evm/index.md b/public/content/translations/ru/developers/docs/evm/index.md index 6532ffc2f12..ab5ecf8dd52 100644 --- a/public/content/translations/ru/developers/docs/evm/index.md +++ b/public/content/translations/ru/developers/docs/evm/index.md @@ -10,7 +10,7 @@ lang: ru ## Прежде чем начать {#prerequisites} -Некоторые базовые знания в информатике, например термины [байт](https://wikipedia.org/wiki/Byte), [память](https://wikipedia.org/wiki/Computer_memory) и [стек](), необходимы для понимания работы EVM. Также было бы полезно ознакомиться с такими понятиями криптографии и блокчейна, как [хэш-функции](https://wikipedia.org/wiki/Cryptographic_hash_function) и [дерево Меркла](https://wikipedia.org/wiki/Merkle_tree). +Некоторые базовые знания в информатике, например термины [байт](https://wikipedia.org/wiki/Byte), [память](https://wikipedia.org/wiki/Computer_memory) и [стек](https://wikipedia.org/wiki/Stack_(abstract_data_type)), необходимы для понимания работы EVM. Также было бы полезно ознакомиться с такими понятиями криптографии и блокчейна, как [хэш-функции](https://wikipedia.org/wiki/Cryptographic_hash_function) и [дерево Меркла](https://wikipedia.org/wiki/Merkle_tree). ## От реестра к машине состояний {#from-ledger-to-state-machine} @@ -64,6 +64,7 @@ EVM работает как [стековая машина](https://wikipedia.or - [evmone](https://github.com/ethereum/evmone) — _C++_ - [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) — _JavaScript_ - [eEVM](https://github.com/microsoft/eevm) — _C++_ +- [revm](https://github.com/bluealloy/revm) - _Rust_ ## Дополнительные ресурсы {#further-reading} diff --git a/public/content/translations/ru/developers/docs/evm/opcodes/index.md b/public/content/translations/ru/developers/docs/evm/opcodes/index.md index f71a5a63b99..363213979c7 100644 --- a/public/content/translations/ru/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/ru/developers/docs/evm/opcodes/index.md @@ -14,157 +14,157 @@ lang: ru 💡 Небольшой совет: чтобы посмотреть строки целиком, используйте `[shift] + scroll` для горизонтальной прокрутки экрана. -| Стек | Имя | Газ | Исходный стек | Итоговый стек | Память/хранилище | Примечания | -| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 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 = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | -| 41 | COINBASE | 2 | `.` | `block.coinbase` | | address of miner of current 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-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-5E | _invalid_ | | | | | | -| 5F | PUSH0 | 2 | `.` | `uint8` | | добавить постоянное значение 0 в стек | -| 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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | | destroy contract and sends all funds to `addr` | +| Стек | Имя | Газ | Исходный стек | Итоговый стек | Память/хранилище | Примечания | +|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 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 = addr.exists ? keccak256(addr.code) : 0 | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | address of miner of current 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-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-5E | _invalid_ | | | | | | +| 5F | PUSH0 | 2 | `.` | `uint8` | | добавить постоянное значение 0 в стек | +| 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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | | destroy contract and sends all funds to `addr` | diff --git a/public/content/translations/ru/developers/docs/gas/index.md b/public/content/translations/ru/developers/docs/gas/index.md index c0ef820186d..4c1aeaad058 100644 --- a/public/content/translations/ru/developers/docs/gas/index.md +++ b/public/content/translations/ru/developers/docs/gas/index.md @@ -55,7 +55,7 @@ lang: ru Базовая комиссия рассчитывается по формуле, которая сравнивает размер предыдущего блока (количество газа, использованного для всех транзакций) с целевым размером. Базовая комиссия увеличится максимум на 12,5 % за блок, если размер целевого блока превышен. Этот экспоненциальный рост делает экономически нецелесообразным, чтобы размер блока оставался высоким на неопределенный срок. | Номер блока | Включенный газ | Увеличение комиссии | Текущая базовая комиссия | -| ----------- | -------------: | ------------------: | -----------------------: | +| ----------- | --------------:| -------------------:| ------------------------:| | 1 | 15 млн | 0 % | 100 gwei | | 2 | 30 млн | 0 % | 100 gwei | | 3 | 30 млн | 12,5 % | 112,5 gwei | @@ -70,7 +70,7 @@ lang: ru Также важно отметить, что сильные всплески серий полных блоков маловероятны из-за скорости, с которой базовая комиссия увеличивается перед полным блоком. | Номер блока | Включенный газ | Увеличение комиссии | Текущая базовая комиссия | -| ----------- | -------------: | ------------------: | -----------------------: | +| ----------- | --------------:| -------------------:| ------------------------:| | 30 | 30 млн | 12,5 % | 2705,6 gwei | | ... | ... | 12,5 % | ... | | 50 | 30 млн | 12,5 % | 28531,3 gwei | diff --git a/public/content/translations/ru/developers/docs/networks/index.md b/public/content/translations/ru/developers/docs/networks/index.md index 3aa643e2e57..bad5b4e680d 100644 --- a/public/content/translations/ru/developers/docs/networks/index.md +++ b/public/content/translations/ru/developers/docs/networks/index.md @@ -56,10 +56,11 @@ lang: ru - [Кран QuickNode Sepolia](https://faucet.quicknode.com/drip) - [Grabteeth](https://grabteeth.xyz/) - [Кран PoW](https://sepolia-faucet.pk910.de/) -- [Кран кошелька Coinbase Wallet | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) +- [Кран кошелька Coinbase | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) - [Кран Alchemy Sepolia](https://sepoliafaucet.com/) - [Кран Infura Sepolia](https://www.infura.io/faucet) - [Кран Chainstack Sepolia](https://faucet.chainstack.com/sepolia-faucet) +- [Кран тестовой сети | Sepolia](https://testnet-faucet.com/sepolia/) #### Goerli _(долгосрочная поддержка)_ {#goerli} @@ -111,28 +112,36 @@ Goerli — тестовая сеть для проверки валидации - [Кран Paradigm](https://faucet.paradigm.xyz/) - [Кран Coinbase Wallet | Optimism Goerli](https://coinbase.com/faucets/optimism-goerli-faucet) +#### Starknet Goerli {#starknet-goerli} + +Тестовая сеть для [Starknet](https://www.starknet.io). + +##### Краны + +- [Кран Starknet](https://faucet.goerli.starknet.io) + ## Частные сети {#private-networks} -Сеть Ethereum представляет собой частную сеть, если ее узлы не подключены к публичной сети (т. е. к основной или тестовой сети). В этом контексте «частная» означает только «зарезервированная» или «изолированная», а не «защищенная» или «безопасная». +Сеть Ethereum представляет собой частную сеть, если ее узлы не подключены к общедоступной сети (т. е. к основной или тестовой сети). В этом контексте «частная» означает только «зарезервированная» или «изолированная», а не «защищенная» или «безопасная». ### Сети разработки {#development-networks} -Чтобы разработать приложение Ethereum, вам нужно запустить его в частной сети и увидеть, как оно работает, прежде чем развертывать. Подобно тому, как вы создаете локальный сервер на своем компьютере для веб-разработки, вы можете создать локальный экземпляр блокчейна для тестирования своего децентрализованного приложения. Это позволяет выполнять итерацию намного быстрее, чем в публичной тестовой сети. +При разработке приложения Ethereum вам нужно запустить его в частной сети и увидеть, как оно работает, прежде чем развертывать. Подобно тому, как вы создаете локальный сервер на своем компьютере для веб-разработки, вы можете создать локальный экземпляр блокчейна для тестирования своего децентрализованного приложения. Это позволяет повторять итерации намного быстрее, чем в общедоступной тестовой сети. -Существуют проекты и инструменты, которые могут помочь в этом. Подробнее о [сетях для разработки](/developers/docs/development-networks/). +Существуют проекты и инструменты, которые могут помочь в этом. Узнайте больше о [сетях для разработки](/developers/docs/development-networks/). ### Сети консорциума {#consortium-networks} -Процесс консенсуса контролируется заранее определенным набором узлов, которым доверяют. Например, частная сеть известных академических учреждений, каждое из которых управляет одним узлом, а блоки проверяются пороговым числом подписантов внутри сети. +Процесс консенсуса контролируется заранее определенным набором доверенных узлов. Например, частная сеть известных академических учреждений, каждое из которых управляет одним узлом, а блоки проверяются пороговым числом подписантов внутри сети. -Если общедоступная сеть Ethereum похожа на общедоступный Интернет, то сеть консорциума похожа на частный интранет. +Если общедоступная сеть Ethereum похожа на общедоступный интернет, то сеть консорциума похожа на частный интранет. ## Связанные инструменты {#related-tools} -- [Chainlist](https://chainlist.org/) — _список сетей EVM для подключения кошельков и поставщиков к соответствующему ID цепочки и ID сети_ -- [Цепочки на основе EVM](https://github.com/ethereum-lists/chains) — _репозиторий GitHub с метаданными цепочки, на которых основан Chainlist_ +- [Chainlist](https://chainlist.org/) — _список сетей EVM для подключения кошельков и поставщиков услуг к соответствующим идентификаторам цепочки и сети._ +- [Цепочки на основе EVM](https://github.com/ethereum-lists/chains) — _репозиторий GitHub с метаданными цепочки, на которых основан Chainlist._ ## Дополнительные ресурсы {#further-reading} -- [Предложение: предсказуемый жизненный цикл тестовых Ethereum](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) +- [Предложение: предсказуемый жизненный цикл тестовых сетей Ethereum](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) - [Эволюция тестовых сетей Ethereum](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) diff --git a/public/content/translations/ru/developers/docs/transactions/index.md b/public/content/translations/ru/developers/docs/transactions/index.md index e2bbd6d470d..ebfc54e4a8f 100644 --- a/public/content/translations/ru/developers/docs/transactions/index.md +++ b/public/content/translations/ru/developers/docs/transactions/index.md @@ -1,6 +1,6 @@ --- title: Транзакции -description: "Обзор транзакций Ethereum: как они работают, их структура данных и как их отправлять через приложение." +description: 'Обзор транзакций Ethereum: как они работают, их структура данных и как их отправлять через приложение.' lang: ru --- diff --git a/public/content/translations/ru/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/ru/guides/how-to-create-an-ethereum-account/index.md index 1d5b1f97fe8..1c9747c0943 100644 --- a/public/content/translations/ru/guides/how-to-create-an-ethereum-account/index.md +++ b/public/content/translations/ru/guides/how-to-create-an-ethereum-account/index.md @@ -20,7 +20,7 @@ lang: ru Если вы новичок, то можете выбрать фильтр «Новичок в криптовалютах» на странице «найти кошелек», чтобы определить кошельки, которые должны включать все необходимые функции, подходящие для начинающих. -![выбор фильтра на странице «найти кошелек»](./wallet-box.png) +![Выбор фильтра на странице поиска кошелька](./wallet-box.png) Существуют также другие фильтры профиля, позволяющие учесть ваши потребности. Это примеры часто используемых кошельков. Вам нужно самостоятельно изучить ситуацию, прежде чем доверять какому-либо программному обеспечению. diff --git a/public/content/translations/ru/guides/how-to-swap-tokens/index.md b/public/content/translations/ru/guides/how-to-swap-tokens/index.md index 53eb4c759d2..a01ca0220e0 100644 --- a/public/content/translations/ru/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/ru/guides/how-to-swap-tokens/index.md @@ -12,12 +12,12 @@ lang: ru **Необходимо соблюдать следующие предварительные условия:** -- иметь криптовалютный кошелек. Вы можете ознакомиться с этим руководством: [Как зарегистрировать учетную запись Ethereum](/guides/how-to-register-an-ethereum-account/); +- иметь криптовалютный кошелек (вы можете воспользоваться следующим руководством: [Как зарегистрировать учетную запись Ethereum](/guides/how-to-create-an-ethereum-account/)); - добавить средства на свой кошелек. ## 1. Подключите свой кошелек к децентрализованной бирже (DEX) по выбору -Вот некоторые популярные биржи. +Вот некоторые популярные биржи: - [Uniswap](https://app.uniswap.org/#/swap) - [Sushiswap](https://www.sushi.com/swap) diff --git a/public/content/translations/ru/guides/how-to-use-a-bridge/index.md b/public/content/translations/ru/guides/how-to-use-a-bridge/index.md index 5617eee7e04..5c07132896e 100644 --- a/public/content/translations/ru/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/ru/guides/how-to-use-a-bridge/index.md @@ -10,7 +10,7 @@ lang: ru **Необходимо соблюдать следующие предварительные условия:** -- иметь криптовалютный кошелек. Вы можете ознакомиться с этим руководством: [Как зарегистрировать учетную запись Ethereum](/guides/how-to-register-an-ethereum-account/); +- иметь криптовалютный кошелек (вы можете воспользоваться следующим руководством: [Как зарегистрировать учетную запись Ethereum](/guides/how-to-create-an-ethereum-account/)); - добавить средства на свой кошелек. ## 1. Определите, какую сеть второго уровня вы хотите использовать diff --git a/public/content/translations/ru/guides/how-to-use-a-wallet/index.md b/public/content/translations/ru/guides/how-to-use-a-wallet/index.md index 46fc7f43bb1..1ab60e11a47 100644 --- a/public/content/translations/ru/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/ru/guides/how-to-use-a-wallet/index.md @@ -51,7 +51,7 @@ lang: ru 1. Посетите сайт любого проекта. 2. Если целевая страница проекта является просто его статичным описанием, у вас должна быть возможность нажать кнопку «Открыть приложение» (Open the App) в меню, после чего вы перейдете к соответствующему веб-приложению. -3. После того как вы зайдете в приложение, нажмите кнопку «Подключиться» (Connect). +3. Войдя в приложение, нажмите кнопку Connect (Подключиться). ![Кнопка, позволяющая пользователю подключаться к сайту с помощью кошелька](./connect1.png) diff --git a/src/intl/ru/common.json b/src/intl/ru/common.json index 9939d346540..ac646cd9838 100644 --- a/src/intl/ru/common.json +++ b/src/intl/ru/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Абстрагирование аккаунта", "about-ethereum-org": "Об ethereum.org", "about-us": "О нас", + "adding-desci-projects": "Добавление проектов DeSci", + "adding-developer-tools": "Добавление инструментов для разработчиков", + "adding-exchanges": "Добавление бирж", + "adding-glossary-terms": "Добавление терминов в глоссарий", + "adding-layer-2s": "Adding Layer 2s", + "adding-products": "Добавление продуктов", + "adding-staking-products": "Добавление продуктов, использующих стейкинг", + "adding-wallets": "Добавление кошельков", + "account-abstraction": "Абстрагирование аккаунта", + "acknowledgements": "Благодарности", "aria-toggle-search-button": "Переключение кнопки поиска", "aria-toggle-menu-button": "Переключение кнопки меню", "beacon-chain": "Beacon Chain", @@ -12,6 +21,8 @@ "community-hub": "Центр сообщества", "community-menu": "Меню сообщества", "contact": "Контактные данные", + "content-buckets": "Категории материалов", + "content-resources": "Ресурсы с информационными материалами", "content-standardization": "Стандартизация содержимого", "contributing": "Содействие", "contributors": "Соавторы", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Децентрализованные социальные сети", "decentralized-science": "Децентрализованная наука (DeSci)", "defi-page": "Децентрализованные финансы (DeFi)", + "design": "Дизайн", + "design-principles": "Принципы дизайна", "devcon": "Девкон", "developers": "Разработчикам", "developers-home": "Домашняя страница для разработчиков", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "Было ли это руководство полезным?", "feedback-widget-thank-you-title": "Спасибо за ваш отзыв!", "feedback-widget-thank-you-subtitle": "Сделайте эту страницу еще лучше, ответив на несколько вопросов.", - "feedback-widget-thank-you-subtitle-ext": "Если вам нужна помощь, вы можете связаться с сообществом в нашем Discord.", + "feedback-widget-thank-you-subtitle-ext": "Если вам нужна помощь, вы можете связаться с сообществом в нашем Discord.", "feedback-widget-thank-you-timing": "2–3 мин", "feedback-widget-thank-you-cta": "Открыть небольшой опрос", "find-wallet": "Найти кошелек", @@ -94,11 +107,11 @@ "grants": "Гранты", "grant-programs": "Программы грантов экосистемы", "guides": "Руководства", - "guides-hub": "Центр руководств", + "guides-hub": "Практические руководства", "history-of-ethereum": "История Ethereum", "home": "Главная", "how-ethereum-works": "Как работает Ethereum", - "how-to-register-an-ethereum-account": "Как зарегистрировать аккаунт Ethereum", + "how-to-create-an-ethereum-account": "Как «создать» учетную запись Ethereum", "how-to-revoke-token-access": "Как отозвать доступ умного контракта к вашим средствам в криптовалюте", "how-to-swap-tokens": "Как менять токены", "how-to-use-a-bridge": "Как переводить токены на уровень 2", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Загрузить данные не удалось. Повторите попытку позже.", "logo": "логотип", "mainnet-ethereum": "Основная сеть Ethereum", + "merge": "Слияние", "more": "Больше", "nav-developers": "Разработчикам", "nav-developers-docs": "Документация для разработчиков", @@ -140,7 +154,7 @@ "page-developers-aria-label": "Меню разработчиков", "page-index-meta-title": "Главная", "page-last-updated": "Последнее обновление страницы", - "pbs": "Разделение автора предложения и разработчика", + "pbs": "Разделение предлагающих и строителей", "pools": "Объединенный стейкинг", "privacy-policy": "Политика о конфиденциальности", "private-ethereum": "Частный Ethereum", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Искать здесь!", "search-eth-address": "Похоже на адрес Ethereum. Мы не предоставляем особые данные для адресов. Попробуйте поискать их в обозревателе блоков, как", "search-no-results": "Поиск не дал результатов", + "security": "Безопасность", "single-slot-finality": "Завершение в одном слоте", "statelessness": "Клиенты, не использующие состояние", "see-contributors": "Посмотреть участников", @@ -181,6 +196,7 @@ "start-here": "Начните здесь", "style-guide": "Руководство по стилю", "solo": "Одиночный стейкинг", + "support": "Поддержка", "terms-of-use": "Условия пользования", "translation-banner-body-new": "Вы просматриваете эту страницу на английском языке, потому что мы еще не перевели ее. Помогите нам перевести эти материалы.", "translation-banner-body-update": "Есть новая версия этой страницы, но пока только на английском языке. Помогите нам перевести последнюю версию.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Здесь нет ошибок!", "translation-banner-no-bugs-content": "Эта страница сейчас не переводится. Пока что мы намеренно оставили эту страницу на английском языке.", "translation-banner-no-bugs-dont-show-again": "Больше не показывать", + "translation-program": "Программа перевода", "try-using-search": "Попробуйте использовать поиск, чтобы найти то, что вы ищете, или", "tutorials": "Учебники", "up": "Вверх", diff --git a/src/intl/ru/page-gas.json b/src/intl/ru/page-gas.json new file mode 100644 index 00000000000..cacdc0cb65b --- /dev/null +++ b/src/intl/ru/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Gas fees on Ethereum: how do they work?", + "page-gas-meta-description": "Learn about gas on Ethereum: how they work and how to pay less in gas fees", + "page-gas-hero-title": "Gas fees", + "page-gas-hero-header": "Network fees", + "page-gas-hero-button-1-content": "Что такое газ?", + "page-gas-hero-subtitle-1": "Network fees on Ethereum are called gas.", + "page-gas-hero-subtitle-2": "Gas is the fuel that powers Ethereum.", + "page-gas-summary-title": "Обзор", + "page-gas-summary-item-1": "Every transaction on Ethereum requires a small form of payment to process", + "page-gas-summary-item-2": "These fees are known as ‘gas’ fee", + "page-gas-summary-item-3": "Gas fees change based on network congestion", + "page-gas-what-are-gas-fees-header": "What are gas fees?", + "page-gas-what-are-gas-fees-text-1": "Think of Ethereum as a large computer network where people can do tasks like sending messages or running programs. Just like in the real world, these tasks require energy to get done.", + "page-gas-what-are-gas-fees-text-2": "In Ethereum, each computational action has a set \"gas\" price. Your gas fees are the total cost of the actions in your transaction. When you send a transaction or run a smart contract, you pay in gas fees to process it.", + "page-gas-how-do-i-pay-less-gas-header": "How do I pay less gas?", + "page-gas-how-do-i-pay-less-gas-text": "While higher fees on Ethereum are sometimes inevitable, there are strategies you can use to reduce the cost:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Time your transactions", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Just like travelling off-peak is less crowded and more affordable, Ethereum is generally cheaper to use when North America is asleep.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Wait for gas to go down", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Gas prices go up and down every twelve seconds based on how congested Ethereum is. When gas prices are high, waiting just a few minutes before making a transaction could see a significant drop in what you pay.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Использовать уровень 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Layer-2 chains are built atop Ethereum, offering lower fees and handling more transactions. They're a good choice to save on fees for transactions that don't need to happen on the main Ethereum network.", + "page-gas-try-layer-2": "Try layer 2", + "page-gas-what-causes-high-gas-fees-header": "What causes high gas fees?", + "page-gas-what-causes-high-gas-fees-text-1": "Whenever the amount of computation (gas) on Ethereum exceeds a certain threshold, gas fees begin to rise. The more the gas exceeds this threshold, the quicker gas fees increase.", + "page-gas-what-causes-high-gas-fees-text-2": "Higher fees could be caused by things like popular dapps or NFTs, periodically increased trading on DEXs, or an overwhelming number of user activity at peak times.", + "page-gas-what-causes-high-gas-fees-text-3": "Developers on Ethereum should take care to optimise their smart contracts usage before deploying. If lots of people are using a poorly written smart contract, it will consume more gas and could inadvertently cause network congestion.", + "page-gas-want-to-dive-deeper": "Хотите узнать больше?", + "page-gas-check-out-the-developer-docs": "Check out the developer docs.", + "page-gas-attack-of-the-cryptokitties-header": "Attack of the Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "In November 2017, the popular CryptoKitties project was launched. Its rapid spike in popularity caused significant network congestion and extremely high gas fees. The challenges posed by CryptoKitties accelerated the urgency of finding solutions for scaling Ethereum.", + "page-gas-why-do-we-need-gas-header": "Why do we need gas?", + "page-gas-why-do-we-need-gas-text": "Gas is a critical element in keeping Ethereum secure and processing transactions. Gas helps in many ways:", + "page-gas-benefits-1-description": "Gas keeps Ethereum sybil-resistant by preventing malicious actors from overwhelming the network with fraudulent activities.", + "page-gas-benefits-2-description": "Because computation costs gas, spamming Ethereum with expensive transactions, either accidentally and maliciously, is financially disencentivised.", + "page-gas-benefits-3-description": "A hard-limit on the amount of computation that can be done at any one time prevents Ethereum from being overwhelmed, helping to ensure the network is always accessible.", + "page-gas-how-is-gas-calculated-header": "How is gas calculated?", + "page-gas-advanced": "Дополнительно", + "page-gas-how-is-gas-calculated-text-1": "The total gas fee you pay is made up of a few parts:", + "page-gas-how-is-gas-calculated-item-1": "Base fee: a fee set by the network that has to be paid for a transaction", + "page-gas-how-is-gas-calculated-item-2": "Priority fee: an optional tip to incentivise node operators to include your transaction", + "page-gas-how-is-gas-calculated-item-3": "Units of gas used*: remember we said gas represented computation? More complex actions, like interacting with a smart contract, use more gas than simple ones, such as sending a transaction.", + "page-gas-how-is-gas-calculated-list-item-1": "* See Figure 1 to see how much gas different types of transactions use", + "page-gas-how-is-gas-calculated-text-2": "The formula for calculating a gas fee is units of gas used * (base fee + priority fee). Most wallets will calculate gas usage and display it in a more straight-forward way.", + "page-gas-table-figure": "Figure 1: Gas used by transaction type", + "page-gas-table-header-1": "Transaction type", + "page-gas-table-header-2": "Units of gas used", + "page-gas-table-item-1-transaction-type": "Sending ETH", + "page-gas-table-item-2-transaction-type": "Sending ERC-20 tokens", + "page-gas-table-item-3-transaction-type": "Transferring and NFT", + "page-gas-table-item-4-transaction-type": "Swapping on Uniswap", + "page-gas-faq-header": "Frequency asked questions", + "page-gas-faq-question-1-q": "Who gets paid the gas fee in my transaction?", + "page-gas-faq-question-1-a-1": "The majority is gas fee—the base fee— is destroyed by the protocol (burned). The priority fee, if included in your transaction, will be given to the validator who proposed your transaction.", + "page-gas-faq-question-1-a-2": "You can read a detailed description of the process in the gas developer docs.", + "page-gas-faq-question-2-q": "Do I need to pay gas in ETH?", + "page-gas-faq-question-2-a-1": "Yes. All gas fees on Ethereum must be paid in the native ETH currency.", + "page-gas-faq-question-2-a-2": "Подробнее о ETH", + "page-gas-faq-question-3-q": "What is gwei?", + "page-gas-faq-question-3-a-1": "In most wallets or gas trackers, you will see gas prices denominated as ‘gwei’.", + "page-gas-faq-question-3-a-2": "Gwei is just a smaller unit of ETH, just as pennies are to dollars, with the difference being that 1 ETH equals 1 billion gwei. Gwei is useful when talking about very small amounts of ETH.", + "page-gas-use-layer-2": "Использовать уровень 2" +} diff --git a/src/intl/ru/page-get-eth.json b/src/intl/ru/page-get-eth.json index dce84fc632d..4d8abc3dad7 100644 --- a/src/intl/ru/page-get-eth.json +++ b/src/intl/ru/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Биржи - это компании, которые позволяют покупать криптовалюту за традиционную валюту. Они обладают контролем над любым купленным вами ETH, пока вы не отправите его на кошелек, контролируемый вами.", "page-get-eth-checkout-dapps-btn": "Просмотреть децентрализованные приложения", "page-get-eth-community-safety": "Записи сообщества о безопасности", - "page-get-eth-description": "Ethereum и ETH не контролируются каким-либо правительством или компанией - они децентрализованы. Это означает, что ETH может использовать любой человек.", + "page-get-eth-description": "Ethereum не контролируется ни одной организацией — он децентрализован.", "page-get-eth-dex": "Децентрализованные биржи (DEX)", - "page-get-eth-dex-desc": "Если вы хотите больше контроля, покупайте ETH у физических лиц. С помощью DEX вы можете торговать, не передавая контроль над своими средствами централизованной компании.", + "page-get-eth-dex-desc": "Если вы хотите больше контроля, покупайте ETH, используя умные контракты. С помощью DEX вы можете торговать цифровыми активами, не передавая контроль над своими средствами централизованной компании.", + "page-get-eth-peers": "Получайте ЕТН от одноранговых пользователей", + "page-get-eth-peers-desc": "Обзаведясь учетную запись Ethereum, вам останется только поделиться своим адресом, чтобы начать отправлять и получать ETH (и другие токены) с помощью одноранговой передачи.", + "page-get-eth-staking": "Вознаграждения за стейкинг", + "page-get-eth-staking-desc": "Если у вас уже есть ETH, их количество можно увеличить, заработав их в качестве узла-валидатора. Вы будете получать ETH как оплату за работу по проверке.", + "page-get-eth-earn": "Зарабатывайте ETH", + "page-get-eth-earn-desc": "Вы можете заработать ЕТН, работая на DAO или компании, которые платят в криптовалюте, выигрывая награды, находя баги в программном обеспечении и используя другие возможности.", + "page-get-eth-daos-link-desc": "Подробнее о DAO", + "page-get-eth-cex-link-desc": "Просматривайте список бирж", + "page-get-eth-staking-link-desc": "Узнавайте больше о стейкинге", "page-get-eth-dexs": "Децентрализованные биржи (DEX)", "page-get-eth-dexs-desc": "Децентрализованные биржи - открытые торговые площадки для ETH и других токенов. Они напрямую соединяют покупателей и продавцов.", "page-get-eth-dexs-desc-2": "Вместо использования доверенных третьих лиц для защиты средств в сделке они используют код. ETH продавца будут переданы только тогда, когда оплата будет гарантирована. Этот тип кода известен как смарт-контракт.", - "page-get-eth-dexs-desc-3": "Это означает, что существует меньше географических ограничений, чем при использовании централизованных альтернатив. Если кто-то продает то, что вы хотите, и принимает способ оплаты, который вы можете предоставить, то все готово. DEX может позволить вам купить ETH за другие токены, через PayPal или даже за наличные.", + "page-get-eth-dexs-desc-3": "Это означает, что существует меньше географических ограничений, чем при использовании централизованных альтернатив. Если кто-то продает то, что вы хотите, и принимает способ оплаты, который вы можете предоставить, то все готово.", "page-get-eth-do-not-copy": "Пример: не копировать", "page-get-eth-exchanges-disclaimer": "Мы собрали эту информацию вручную. Если вы обнаружите ошибки, дайте нам знать на", - "page-get-eth-exchanges-empty-state-text": "Введите вашу страну проживания, чтобы увидеть список кошельков и бирж, которые можно использовать для покупки ETH", + "page-get-eth-exchanges-empty-state-text": "Укажите свою страну проживания, чтобы увидеть список бирж, которые можно использовать", "page-get-eth-exchanges-except": "Кроме", "page-get-eth-exchanges-header": "В какой стране вы живете?", "page-get-eth-exchanges-header-exchanges": "Биржи", "page-get-eth-exchanges-header-wallets": "Кошельки", - "page-get-eth-exchanges-intro": "Биржи и кошельки имеют ограничение по месту продажи.", + "page-get-eth-exchanges-intro": "У бирж есть ограничения на то, где они могут покупать криптовалюту. Это ориентировочный список услуг, который должен действовать в каждой стране. Включение в него не является гарантией качества, вам необходимо самостоятельно изучать ситуацию!", "page-get-eth-exchanges-no-exchanges": "К сожалению, нам неизвестны биржи, позволяющие купить ETH в этой стране. Если вы знаете, то сообщите нам на", - "page-get-eth-exchanges-no-exchanges-or-wallets": "К сожалению, нам неизвестны биржи или кошельки, позволяющие купить ETH в этой стране. Если вы знаете, то сообщите нам на", + "page-get-eth-exchanges-no-exchanges-or-wallets": "К сожалению, нам неизвестны биржи, позволяющие купить ETH в этой стране. Если вы знаете, то сообщите нам на", "page-get-eth-exchanges-no-wallets": "К сожалению, нам неизвестны кошельки, позволяющие купить ETH в этой стране. Если вы знаете, то сообщите нам на", "page-get-eth-exchanges-search": "Напишите, где вы живете...", "page-get-eth-exchanges-success-exchange": "Регистрация на бирже может занять несколько дней из-за их юридических проверок.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Получить изображение героя ETH", "page-get-eth-keep-it-safe": "Сохранение ваших ETH в безопасности", "page-get-eth-meta-description": "Как купить ETH в том месте, где вы живете, и советы, как позаботиться о них.", - "page-get-eth-meta-title": "Как купить ETH", + "page-get-eth-meta-title": "Как получить ETH", "page-get-eth-need-wallet": "Вам понадобится кошелек, чтобы использовать DEX.", "page-get-eth-new-to-eth": "Новичок в ETH? Вот обзор, чтобы помочь вам начать.", "page-get-eth-other-cryptos": "Купить за другую криптовалюту", - "page-get-eth-protect-eth-desc": "Если вы планируете купить много ETH, вам, вероятно, понадобится хранить их в подконтрольном вам кошельке, а не на бирже. Дело в том, что биржи являются главной мишенью для хакеров. Если хакер получит доступ, то вы можете потерять все средства. С другой стороны, доступ к вашему кошельку есть только у вас.", - "page-get-eth-protect-eth-in-wallet": "Защитите ваши ETH в кошельке", + "page-get-eth-protect-eth-desc": "Одна из основных функций Ethereum — это возможность контролировать свои активы, управляя аккаунтом. Это означает, что вы не обязаны доверять свои активы какой-либо ретьей стороне, вы получаете защиту от недобросовестных действий всех возможных опекунов активов, их банкротства или взлома. Однако это накладывает на вас обязанности по самостоятельному обеспечению их безопасности.", + "page-get-eth-protect-eth-in-wallet": "Храните ЕТН в собственном кошельке", "page-get-eth-search-by-country": "Найти по стране", - "page-get-eth-security": "Но это также означает, что вы должны серьёзно относиться к безопасности своих средств. С ETH вы не доверяете банку смотреть за вашими деньгами – вы доверяете только себе.", + "page-get-eth-security": "Это означает, что вы должны серьезно относиться к безопасности своих средств. С ETH вы не доверяете банку или компании смотреть за вашими активами, вы несете за них ответственность самостоятельно.", "page-get-eth-smart-contract-link": "Подробнее о смарт-контрактах", "page-get-eth-swapping": "Обменяйте ваши токены на ETH. И наоборот.", "page-get-eth-try-dex": "Попробуйте DEX", "page-get-eth-use-your-eth": "Используйте ваши ETH", "page-get-eth-use-your-eth-dapps": "Теперь, когда у вас есть ETH, взгляните на несколько приложений Ethereum (dapps). Существуют приложения для финансов, социальных сетей, игр и многого другого.", "page-get-eth-wallet-instructions": "Следуйте инструкциям кошелька", - "page-get-eth-wallet-instructions-lost": "Если вы потеряете доступ к своему кошельку, вы также потеряете доступ и к своим средствам. Ваш кошелек должен дать вам инструкции, чтобы предупредить подобные ситуации. Удостоверьтесь, что вы внимательно следуете им – в большинстве случаев никто не сможет помочь вам в случае потери доступа к своему кошельку.", + "page-get-eth-wallet-instructions-lost": "Если вы потеряете доступ к своему аккаунту, вы также потеряете доступ и к своим средствам. Ваш кошелек должен дать вам инструкции, чтобы предупредить подобные ситуации. Удостоверьтесь, что вы внимательно следуете им: в большинстве случаев никто не сможет помочь вам в случае потери доступа к своему аккаунту.", "page-get-eth-wallets": "Кошельки", "page-get-eth-wallets-link": "Подробнее о кошельках", "page-get-eth-wallets-purchasing": "Некоторые кошельки позволяют вам купить криптовалюту с помощью дебетовой или кредитной карты, банковского перевода или даже Apple Pay. Имеются географические ограничения.", - "page-get-eth-warning": "Данные DEX не предназначены для начинающих, поскольку для их использования понадобится некоторое количество ETH.", + "page-get-eth-warning": "Эти DEX не предназначены для новичков, так как для их использования потребуется некоторое количество ETH. Это лишь примеры, а не рекомендованные продукты. Изучайте ситуацию самостоятельно!", "page-get-eth-what-are-DEX's": "Что такое DEX?", "page-get-eth-whats-eth-link": "Что такое ETH?", - "page-get-eth-where-to-buy-desc": "Вы можете купить ETH на биржах или прямо из кошельков.", + "page-get-eth-where-to-buy-desc": "Вы можете заработать ЕТН, получить от одноранговых пользователей или купить на биржах и в приложениях.", "page-get-eth-where-to-buy-desc-2": "Проверьте, какими службами вы сможете воспользоваться в вашем месте проживания.", - "page-get-eth-where-to-buy-title": "Где купить ETH", + "page-get-eth-where-to-buy-title": "Где получить ETH", "page-get-eth-your-address": "Ваш адрес ETH", "page-get-eth-your-address-desc": "Когда вы загружаете кошелек, он создает для вас общедоступный адрес ETH. Вот пример такого адреса:", "page-get-eth-your-address-desc-3": "Думайте об этом, как о вашем адресе электронной почты, но вместо сообщений вы получаете ETH. Если вы хотите перевести ETH из биржи в свой кошелек, используйте ваш адрес в качестве точки назначения. Дважды проверьте его перед отправкой!", diff --git a/src/intl/ru/page-index.json b/src/intl/ru/page-index.json index 21d686fba6b..42be9eed72e 100644 --- a/src/intl/ru/page-index.json +++ b/src/intl/ru/page-index.json @@ -48,7 +48,7 @@ "page-index-developers-code-example-description-3": "Вы можете переосмыслить существующие сервисы как децентрализованные открытые приложения.", "page-index-network-stats-title": "Ethereum сегодня", "page-index-network-stats-subtitle": "Последняя статистика сети", - "page-index-network-stats-total-eth-staked": "Общая сумма поставленного ETH", + "page-index-network-stats-total-eth-staked": "Общая сумма поставленного в ETH", "page-index-network-stats-eth-price-description": "Цена ETH (долл. США)", "page-index-network-stats-eth-price-explainer": "Последняя цена за 1 эфир. Покупать можно даже 0,000000000000000001, нет необходимости в покупке целой единицы ETH.", "page-index-network-stats-total-eth-staked-explainer": "Общее количество ETH, стейкинг которых проводится в настоящее время и обеспечивает безопасность сети.", diff --git a/src/intl/ru/page-learn.json b/src/intl/ru/page-learn.json index 9b308ea726d..86ad946a0c3 100644 --- a/src/intl/ru/page-learn.json +++ b/src/intl/ru/page-learn.json @@ -11,7 +11,7 @@ "hero-subtitle": "Ваш учебный справочник по миру Ethereum. Узнайте, как работает Ethereum и как подключиться к сети. Эта страница содержит технические и нетехнические статьи, руководства и ресурсы.", "hero-button-lets-get-started": "Начать", "what-is-crypto-1": "Возможно, вы слышали о криптовалютах, блокчейнах и биткоине. Ссылки ниже помогут вам узнать, что они из себя представляют и как они относятся к Ethereum.", - "what-is-crypto-2": "Криптовалюты, такие как биткоин, позволяют кому угодно переводить деньги по всему миру. Ethereum делает то же, но также может запустить код, который позволяет людям создавать приложения и организации. Это сочетает упругость и гибкость: любая компьютерная программа может работать на Ethereum. Откройте для себя больше и узнайте, как начать:", + "what-is-crypto-2": "Криптовалюты, такие как биткоин, позволяют людям переводить деньги по всему миру. Ethereum делает то же, но также может запустить код, который позволяет людям создавать приложения и организации. Это дает стойкость и гибкость: любая компьютерная программа может работать на Ethereum. Узнайте больше, в том числе о том, как начать использовать Ethereum.", "what-is-ethereum-card-title": "Что такое Ethereum?", "what-is-ethereum-card-description": "Если вы заинтересовались Ethereum недавно, узнайте здесь о преимуществах платформы.", "what-is-ethereum-card-image-alt": "Изображение человека, заглядывающего на базар, призвано быть олицетворением Ethereum.", diff --git a/src/intl/ru/page-wallets-find-wallet.json b/src/intl/ru/page-wallets-find-wallet.json index c5d8d2087a0..038cc3f13bc 100644 --- a/src/intl/ru/page-wallets-find-wallet.json +++ b/src/intl/ru/page-wallets-find-wallet.json @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Кошельки с расширениями для браузеров", "page-find-wallet-device": "Устройство", "page-find-choose-to-compare": "Выбрать для сравнения", - "page-find-wallet-choose-features": "Выберите функции" + "page-find-wallet-choose-features": "Выберите функции", + "page-find-wallet-reset-filters": "Сбросить фильтры" } From e5024c0db536bbfb089ac782aae2fec9e9313b82 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 18 Jan 2024 20:30:58 -0800 Subject: [PATCH 045/478] fix: apply 'modal' zIndex to search modal --- src/components/Search/utils.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/Search/utils.ts b/src/components/Search/utils.ts index df7a21a79a8..ca82216f1bd 100644 --- a/src/components/Search/utils.ts +++ b/src/components/Search/utils.ts @@ -101,6 +101,10 @@ export const getSearchModalStyles = (): SystemStyleObject => ({ }, }, + ".DocSearch-Container.DocSearch[aria-expanded='true']": { + zIndex: "modal", + }, + ".DocSearch-Container--Stalled .DocSearch-MagnifierLabel, .DocSearch-Container--Stalled .DocSearch-LoadingIndicator": { color: "primary.highContrast", From 7e59a80aa1a6191ef92eb0e3f5a2e0fb6c984e8c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:29:24 -0800 Subject: [PATCH 046/478] style: change isPartiallyActive to highContrast --- src/components/Nav/Menu.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx index 3d6f222b28e..04ca8b83efa 100644 --- a/src/components/Nav/Menu.tsx +++ b/src/components/Nav/Menu.tsx @@ -93,7 +93,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { lvl === 1 ? ( ) : undefined @@ -119,7 +119,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { {label} @@ -127,7 +127,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { From 07ec669b48484b8ec054dcd92b1f2061ca4231cf Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:36:57 -0800 Subject: [PATCH 047/478] fix: hiding logic for desktop and mobile close mobile menu by clicking outside of drawer --- src/components/Nav/Menu.tsx | 7 +++---- src/components/Nav/Mobile.tsx | 6 ++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx index 04ca8b83efa..271ae580c2f 100644 --- a/src/components/Nav/Menu.tsx +++ b/src/components/Nav/Menu.tsx @@ -126,9 +126,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { {description} @@ -280,6 +278,7 @@ const Menu = ({ sections, ...props }: MenuProps) => { { borderColor="menu.stroke" position="absolute" bg={`menu.lvl${has.lvl3Items ? 3 : has.lvl2Items ? 2 : 1}.background`} - insetInlineStart="-5.375rem" + insetInlineStart={{ base: "-3rem", xl: "-5.375rem" }} w="min(100vw, 1504px)" mx="auto" zIndex={0} diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index 8e93b287ba8..ed447d4dae6 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -22,6 +22,7 @@ import { Icon, IconButton, Text, + useBreakpointValue, useColorModeValue, } from "@chakra-ui/react" @@ -311,7 +312,7 @@ export type MobileNavMenuProps = ButtonProps & { } const MobileNavMenu = ({ - isOpen: isMenuOpen, + isOpen, onToggle, toggleColorMode: toggleTheme, toggleSearch, @@ -323,6 +324,7 @@ const MobileNavMenu = ({ const { t } = useTranslation("common") const themeIcon = useColorModeValue(MdBrightness2, MdWbSunny) const themeLabelKey = useColorModeValue("dark-mode", "light-mode") + const isMenuOpen = !!useBreakpointValue({ base: isOpen, md: false }) return ( <> @@ -336,7 +338,7 @@ const MobileNavMenu = ({ placement="start" size="md" > - + Date: Fri, 19 Jan 2024 17:39:17 -0800 Subject: [PATCH 048/478] style: display mobile menu below md breakpoint --- src/components/Nav/Menu.tsx | 2 +- src/components/Nav/index.tsx | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx index 271ae580c2f..56aa31c5abd 100644 --- a/src/components/Nav/Menu.tsx +++ b/src/components/Nav/Menu.tsx @@ -278,7 +278,7 @@ const Menu = ({ sections, ...props }: MenuProps) => { { px={{ base: 4, xl: 8 }} > @@ -68,10 +68,10 @@ const Nav = () => { {/* Desktop */} - + { - + Date: Fri, 19 Jan 2024 18:10:12 -0800 Subject: [PATCH 049/478] style: add box styles per design --- src/@chakra-ui/semanticTokens.ts | 5 ++ src/components/Nav/Menu.tsx | 90 ++++++++++++++++++-------------- src/components/Nav/Mobile.tsx | 16 +++--- 3 files changed, 64 insertions(+), 47 deletions(-) diff --git a/src/@chakra-ui/semanticTokens.ts b/src/@chakra-ui/semanticTokens.ts index ec1f72a8447..75fd9c25c9e 100644 --- a/src/@chakra-ui/semanticTokens.ts +++ b/src/@chakra-ui/semanticTokens.ts @@ -135,6 +135,11 @@ const semanticTokens = { "linear-gradient(102.7deg, rgba(185, 185, 241, 0.2) 0%, rgba(84, 132, 234, 0.2) 51.56%, rgba(58, 142, 137, 0.2) 100%)", }, }, + shadows: { + menu: { + accordion: "0px 2px 2px 0px rgba(0, 0, 0, 0.12) inset, 0px -3px 2px 0px rgba(0, 0, 0, 0.14) inset" + } + } } export default semanticTokens diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx index 56aa31c5abd..1a8edd2ac9c 100644 --- a/src/components/Nav/Menu.tsx +++ b/src/components/Nav/Menu.tsx @@ -8,6 +8,7 @@ import { type ButtonProps, Flex, type FlexProps, + Grid, Icon, IconProps, List, @@ -82,6 +83,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { ) })} From 5534be543da2d6dd5716b1dddc9b3afb856ba858 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:59:18 -0800 Subject: [PATCH 053/478] style: improve logic for minW of menu section --- src/components/Nav/Menu.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx index 855d7e1081f..0f2d9272cd1 100644 --- a/src/components/Nav/Menu.tsx +++ b/src/components/Nav/Menu.tsx @@ -6,6 +6,7 @@ import { MdChevronLeft, MdChevronRight } from "react-icons/md" import { Box, type ButtonProps, + calc, Flex, type FlexProps, Grid, @@ -16,6 +17,7 @@ import { PopoverContent, PopoverTrigger, Text, + useToken, } from "@chakra-ui/react" import type { Lang } from "@/lib/types" @@ -80,11 +82,16 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { const { asPath } = useRouter() const isLink = !!action.href const isActive = isLink && cleanPath(asPath) === action.href + const minW = calc.subtract( + calc.multiply(useToken("sizes.container", "md"), 0.5), + useToken("space", 8) + ) // Half of `md` container (smallest desktop width) minus padding + return ( + + - e.stopPropagation()} - /> - setFilterValue(e.target.value)} - ref={inputRef} - h="8" - mt="1" - mb="2" - bg="background.base" - color="body.base" - onKeyDown={(e) => { - // If Enter, navigate to first result - if (e.key === "Enter") { - e.preventDefault() - firstItemRef.current?.click() - } - // If ArrowDown, move focus to first result - if (e.key === "ArrowDown") { - e.preventDefault() - firstItemRef.current?.focus() - } - }} - /> - - {filteredNames.map( - ({ localeChoice, source, target, approvalProgress }, index) => { - const firstResult = index === 0 - return ( + {browserLocaleInfo && ( + <> + + Browser default + - {target} + {browserLocaleInfo.target} - - - {source} ·{" "} - - - {new Intl.NumberFormat(locale!, { - style: "percent", - }).format(approvalProgress / 100)}{" "} - translated - - - + + {browserLocaleInfo.source} + + - ) - } - )} + + + )} + + + Filter list ({filteredNames.length} languages) + + inputRef.current?.focus()} + p="0" + bg="transparent" + position="relative" + pointerEvents="none" + > + e.stopPropagation()} + /> + setFilterValue(e.target.value)} + ref={inputRef} + h="8" + mt="1" + mb="2" + bg="background.base" + color="body.base" + onKeyDown={(e) => { + // If Enter, navigate to first result + if (e.key === "Enter") { + e.preventDefault() + firstItemRef.current?.click() + } + // If ArrowDown, move focus to first result + if (e.key === "ArrowDown") { + e.preventDefault() + firstItemRef.current?.focus() + } + }} + /> + + {filteredNames.map( + ( + { localeChoice, source, target, approvalProgress }, + index + ) => { + const firstResult = index === 0 + const percentage = new Intl.NumberFormat(locale!, { + style: "percent", + }).format(approvalProgress / 100) + const progress = + approvalProgress === 0 + ? "<" + percentage.replace("0", "1") + : percentage + return ( + + + {target} + + + + {source} ·{" "} + + {progress} translated + + + + + + ) + } + )} + ) diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index 09ada7695a9..da09276d893 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -270,14 +270,14 @@ const MobileNavMenu: React.FC = ({ {t(isDarkTheme ? "light-mode" : "dark-mode")} - {/* TODO: Close mobile menu when language search is engaged */} - + Date: Wed, 24 Jan 2024 10:03:26 -0800 Subject: [PATCH 080/478] refactor: save word/phrase counts with progress --- src/data/translationProgress.json | 1096 ++++++++++++++++- src/lib/types.ts | 48 +- src/scripts/crowdin/getTranslationProgress.ts | 14 +- 3 files changed, 1141 insertions(+), 17 deletions(-) diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index a1e93d9c224..7b8f39ddf89 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -1,456 +1,1548 @@ [ { "languageId": "af", + "words": { + "total": 336489, + "translated": 2654, + "preTranslateAppliedTo": 134, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 474, + "preTranslateAppliedTo": 36, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "am", + "words": { + "total": 336489, + "translated": 34590, + "preTranslateAppliedTo": 3747, + "approved": 9634 + }, + "phrases": { + "total": 24685, + "translated": 3447, + "preTranslateAppliedTo": 362, + "approved": 993 + }, "translationProgress": 10, "approvalProgress": 2 }, { "languageId": "ar", + "words": { + "total": 336489, + "translated": 101830, + "preTranslateAppliedTo": 35259, + "approved": 40466 + }, + "phrases": { + "total": 24685, + "translated": 8511, + "preTranslateAppliedTo": 3243, + "approved": 3373 + }, "translationProgress": 30, "approvalProgress": 12 }, { "languageId": "az", + "words": { + "total": 336489, + "translated": 29092, + "preTranslateAppliedTo": 1761, + "approved": 18707 + }, + "phrases": { + "total": 24685, + "translated": 2701, + "preTranslateAppliedTo": 310, + "approved": 1852 + }, "translationProgress": 8, "approvalProgress": 5 }, { "languageId": "be", + "words": { + "total": 336489, + "translated": 7372, + "preTranslateAppliedTo": 726, + "approved": 5879 + }, + "phrases": { + "total": 24685, + "translated": 822, + "preTranslateAppliedTo": 94, + "approved": 603 + }, "translationProgress": 2, "approvalProgress": 1 }, { "languageId": "bg", + "words": { + "total": 336489, + "translated": 36624, + "preTranslateAppliedTo": 12272, + "approved": 14767 + }, + "phrases": { + "total": 24685, + "translated": 3737, + "preTranslateAppliedTo": 1422, + "approved": 1531 + }, "translationProgress": 10, "approvalProgress": 4 }, { "languageId": "bi", + "words": { + "total": 336489, + "translated": 180, + "preTranslateAppliedTo": 20, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 115, + "preTranslateAppliedTo": 17, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "bn", + "words": { + "total": 336489, + "translated": 44527, + "preTranslateAppliedTo": 4114, + "approved": 36246 + }, + "phrases": { + "total": 24685, + "translated": 3853, + "preTranslateAppliedTo": 532, + "approved": 3027 + }, "translationProgress": 13, "approvalProgress": 10 }, { "languageId": "br-FR", + "words": { + "total": 336489, + "translated": 192, + "preTranslateAppliedTo": 148, + "approved": 82 + }, + "phrases": { + "total": 24685, + "translated": 29, + "preTranslateAppliedTo": 21, + "approved": 7 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "bs", + "words": { + "total": 336489, + "translated": 12036, + "preTranslateAppliedTo": 713, + "approved": 5879 + }, + "phrases": { + "total": 24685, + "translated": 1160, + "preTranslateAppliedTo": 68, + "approved": 603 + }, "translationProgress": 3, "approvalProgress": 1 }, { "languageId": "ca", + "words": { + "total": 336489, + "translated": 46990, + "preTranslateAppliedTo": 14452, + "approved": 19695 + }, + "phrases": { + "total": 24685, + "translated": 4571, + "preTranslateAppliedTo": 1601, + "approved": 2056 + }, "translationProgress": 13, "approvalProgress": 5 }, { "languageId": "cs", + "words": { + "total": 336489, + "translated": 62786, + "preTranslateAppliedTo": 6867, + "approved": 26678 + }, + "phrases": { + "total": 24685, + "translated": 5544, + "preTranslateAppliedTo": 1004, + "approved": 2427 + }, "translationProgress": 18, "approvalProgress": 7 }, { "languageId": "da", + "words": { + "total": 336489, + "translated": 15857, + "preTranslateAppliedTo": 2817, + "approved": 1466 + }, + "phrases": { + "total": 24685, + "translated": 1668, + "preTranslateAppliedTo": 488, + "approved": 263 + }, "translationProgress": 4, "approvalProgress": 0 }, { "languageId": "de", + "words": { + "total": 336489, + "translated": 237654, + "preTranslateAppliedTo": 43906, + "approved": 163737 + }, + "phrases": { + "total": 24685, + "translated": 18419, + "preTranslateAppliedTo": 4130, + "approved": 13313 + }, "translationProgress": 70, "approvalProgress": 48 }, { "languageId": "el", + "words": { + "total": 336489, + "translated": 102635, + "preTranslateAppliedTo": 18079, + "approved": 102345 + }, + "phrases": { + "total": 24685, + "translated": 10333, + "preTranslateAppliedTo": 2113, + "approved": 10314 + }, "translationProgress": 30, "approvalProgress": 30 }, { "languageId": "eo", + "words": { + "total": 336489, + "translated": 824, + "preTranslateAppliedTo": 268, + "approved": 169 + }, + "phrases": { + "total": 24685, + "translated": 77, + "preTranslateAppliedTo": 27, + "approved": 16 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "es-EM", + "words": { + "total": 336489, + "translated": 331819, + "preTranslateAppliedTo": 51273, + "approved": 296693 + }, + "phrases": { + "total": 24685, + "translated": 24558, + "preTranslateAppliedTo": 4649, + "approved": 21958 + }, "translationProgress": 98, - "approvalProgress": 85 + "approvalProgress": 88 }, { "languageId": "et", + "words": { + "total": 336489, + "translated": 1014, + "preTranslateAppliedTo": 245, + "approved": 75 + }, + "phrases": { + "total": 24685, + "translated": 149, + "preTranslateAppliedTo": 46, + "approved": 12 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "eu", + "words": { + "total": 336489, + "translated": 768, + "preTranslateAppliedTo": 217, + "approved": 36 + }, + "phrases": { + "total": 24685, + "translated": 83, + "preTranslateAppliedTo": 38, + "approved": 4 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "fa", + "words": { + "total": 336489, + "translated": 149845, + "preTranslateAppliedTo": 28269, + "approved": 96744 + }, + "phrases": { + "total": 24685, + "translated": 12201, + "preTranslateAppliedTo": 2782, + "approved": 7769 + }, "translationProgress": 44, "approvalProgress": 28 }, { "languageId": "fa-AF", + "words": { + "total": 336489, + "translated": 193, + "preTranslateAppliedTo": 37, + "approved": 186 + }, + "phrases": { + "total": 24685, + "translated": 22, + "preTranslateAppliedTo": 6, + "approved": 17 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "fi", + "words": { + "total": 336489, + "translated": 45286, + "preTranslateAppliedTo": 11063, + "approved": 22594 + }, + "phrases": { + "total": 24685, + "translated": 4157, + "preTranslateAppliedTo": 1096, + "approved": 2136 + }, "translationProgress": 13, "approvalProgress": 6 }, { "languageId": "fil", + "words": { + "total": 336489, + "translated": 63679, + "preTranslateAppliedTo": 5142, + "approved": 54718 + }, + "phrases": { + "total": 24685, + "translated": 5343, + "preTranslateAppliedTo": 656, + "approved": 4539 + }, "translationProgress": 18, "approvalProgress": 16 }, { "languageId": "fr", + "words": { + "total": 336489, + "translated": 336489, + "preTranslateAppliedTo": 54154, + "approved": 336420 + }, + "phrases": { + "total": 24685, + "translated": 24685, + "preTranslateAppliedTo": 4849, + "approved": 24674 + }, "translationProgress": 100, "approvalProgress": 99 }, { "languageId": "gi", + "words": { + "total": 336489, + "translated": 4, + "preTranslateAppliedTo": 4, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 2, + "preTranslateAppliedTo": 2, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "gl", + "words": { + "total": 336489, + "translated": 8308, + "preTranslateAppliedTo": 1290, + "approved": 1062 + }, + "phrases": { + "total": 24685, + "translated": 1042, + "preTranslateAppliedTo": 238, + "approved": 165 + }, "translationProgress": 2, "approvalProgress": 0 }, { "languageId": "gu-IN", + "words": { + "total": 336489, + "translated": 3066, + "preTranslateAppliedTo": 1043, + "approved": 1300 + }, + "phrases": { + "total": 24685, + "translated": 551, + "preTranslateAppliedTo": 251, + "approved": 235 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "ha", + "words": { + "total": 336489, + "translated": 524, + "preTranslateAppliedTo": 114, + "approved": 4 + }, + "phrases": { + "total": 24685, + "translated": 54, + "preTranslateAppliedTo": 18, + "approved": 2 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "he", + "words": { + "total": 336489, + "translated": 7207, + "preTranslateAppliedTo": 1109, + "approved": 1222 + }, + "phrases": { + "total": 24685, + "translated": 1041, + "preTranslateAppliedTo": 268, + "approved": 203 + }, "translationProgress": 2, "approvalProgress": 0 }, { "languageId": "hi", + "words": { + "total": 336489, + "translated": 75996, + "preTranslateAppliedTo": 8937, + "approved": 57736 + }, + "phrases": { + "total": 24685, + "translated": 6278, + "preTranslateAppliedTo": 975, + "approved": 4820 + }, "translationProgress": 22, "approvalProgress": 17 }, { "languageId": "hr", + "words": { + "total": 336489, + "translated": 28058, + "preTranslateAppliedTo": 9317, + "approved": 13546 + }, + "phrases": { + "total": 24685, + "translated": 3014, + "preTranslateAppliedTo": 1040, + "approved": 1399 + }, "translationProgress": 8, "approvalProgress": 4 }, { "languageId": "hu", + "words": { + "total": 336489, + "translated": 218207, + "preTranslateAppliedTo": 18587, + "approved": 148555 + }, + "phrases": { + "total": 24685, + "translated": 16143, + "preTranslateAppliedTo": 1952, + "approved": 11899 + }, "translationProgress": 64, "approvalProgress": 44 }, { "languageId": "hy-AM", + "words": { + "total": 336489, + "translated": 10508, + "preTranslateAppliedTo": 1290, + "approved": 9634 + }, + "phrases": { + "total": 24685, + "translated": 1094, + "preTranslateAppliedTo": 243, + "approved": 993 + }, "translationProgress": 3, "approvalProgress": 2 }, { "languageId": "id", + "words": { + "total": 336489, + "translated": 280227, + "preTranslateAppliedTo": 37675, + "approved": 156274 + }, + "phrases": { + "total": 24685, + "translated": 21146, + "preTranslateAppliedTo": 3636, + "approved": 12116 + }, "translationProgress": 83, "approvalProgress": 46 }, { "languageId": "ig", + "words": { + "total": 336489, + "translated": 31195, + "preTranslateAppliedTo": 1678, + "approved": 23475 + }, + "phrases": { + "total": 24685, + "translated": 2954, + "preTranslateAppliedTo": 299, + "approved": 2278 + }, "translationProgress": 9, "approvalProgress": 6 }, { "languageId": "it", + "words": { + "total": 336489, + "translated": 336489, + "preTranslateAppliedTo": 57137, + "approved": 336174 + }, + "phrases": { + "total": 24685, + "translated": 24685, + "preTranslateAppliedTo": 5157, + "approved": 24656 + }, "translationProgress": 100, "approvalProgress": 99 }, { "languageId": "ja", + "words": { + "total": 336489, + "translated": 316663, + "preTranslateAppliedTo": 48606, + "approved": 284629 + }, + "phrases": { + "total": 24685, + "translated": 23404, + "preTranslateAppliedTo": 4431, + "approved": 20925 + }, "translationProgress": 94, "approvalProgress": 84 }, { "languageId": "ka", + "words": { + "total": 336489, + "translated": 15234, + "preTranslateAppliedTo": 2130, + "approved": 1449 + }, + "phrases": { + "total": 24685, + "translated": 1936, + "preTranslateAppliedTo": 387, + "approved": 253 + }, "translationProgress": 4, "approvalProgress": 0 }, { "languageId": "kk", + "words": { + "total": 336489, + "translated": 2027, + "preTranslateAppliedTo": 1138, + "approved": 1155 + }, + "phrases": { + "total": 24685, + "translated": 427, + "preTranslateAppliedTo": 225, + "approved": 185 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "km", + "words": { + "total": 336489, + "translated": 16940, + "preTranslateAppliedTo": 1646, + "approved": 15713 + }, + "phrases": { + "total": 24685, + "translated": 1769, + "preTranslateAppliedTo": 327, + "approved": 1551 + }, "translationProgress": 5, "approvalProgress": 4 }, { "languageId": "kn", + "words": { + "total": 336489, + "translated": 44325, + "preTranslateAppliedTo": 1474, + "approved": 26051 + }, + "phrases": { + "total": 24685, + "translated": 3595, + "preTranslateAppliedTo": 144, + "approved": 2343 + }, "translationProgress": 13, "approvalProgress": 7 }, { "languageId": "ko", + "words": { + "total": 336489, + "translated": 108091, + "preTranslateAppliedTo": 19220, + "approved": 51562 + }, + "phrases": { + "total": 24685, + "translated": 8998, + "preTranslateAppliedTo": 2057, + "approved": 3874 + }, "translationProgress": 32, "approvalProgress": 15 }, { "languageId": "ku", + "words": { + "total": 336489, + "translated": 897, + "preTranslateAppliedTo": 70, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 116, + "preTranslateAppliedTo": 40, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "ky", + "words": { + "total": 336489, + "translated": 456, + "preTranslateAppliedTo": 129, + "approved": 12 + }, + "phrases": { + "total": 24685, + "translated": 129, + "preTranslateAppliedTo": 55, + "approved": 7 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "lb", + "words": { + "total": 336489, + "translated": 257, + "preTranslateAppliedTo": 81, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 29, + "preTranslateAppliedTo": 11, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "lt", + "words": { + "total": 336489, + "translated": 4171, + "preTranslateAppliedTo": 1794, + "approved": 1567 + }, + "phrases": { + "total": 24685, + "translated": 790, + "preTranslateAppliedTo": 398, + "approved": 257 + }, "translationProgress": 1, "approvalProgress": 0 }, { "languageId": "mai", + "words": { + "total": 336489, + "translated": 1, + "preTranslateAppliedTo": 1, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 1, + "preTranslateAppliedTo": 1, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "mk", + "words": { + "total": 336489, + "translated": 422, + "preTranslateAppliedTo": 245, + "approved": 88 + }, + "phrases": { + "total": 24685, + "translated": 164, + "preTranslateAppliedTo": 88, + "approved": 16 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "ml-IN", + "words": { + "total": 336489, + "translated": 18507, + "preTranslateAppliedTo": 6285, + "approved": 11452 + }, + "phrases": { + "total": 24685, + "translated": 2119, + "preTranslateAppliedTo": 750, + "approved": 1281 + }, "translationProgress": 5, "approvalProgress": 3 }, { "languageId": "mn", + "words": { + "total": 336489, + "translated": 142, + "preTranslateAppliedTo": 131, + "approved": 64 + }, + "phrases": { + "total": 24685, + "translated": 19, + "preTranslateAppliedTo": 17, + "approved": 4 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "mr", + "words": { + "total": 336489, + "translated": 33873, + "preTranslateAppliedTo": 1592, + "approved": 26062 + }, + "phrases": { + "total": 24685, + "translated": 2914, + "preTranslateAppliedTo": 269, + "approved": 2346 + }, "translationProgress": 10, "approvalProgress": 7 }, { "languageId": "ms", + "words": { + "total": 336489, + "translated": 74157, + "preTranslateAppliedTo": 4802, + "approved": 37271 + }, + "phrases": { + "total": 24685, + "translated": 6231, + "preTranslateAppliedTo": 619, + "approved": 2879 + }, "translationProgress": 22, "approvalProgress": 11 }, { "languageId": "my", + "words": { + "total": 336489, + "translated": 1568, + "preTranslateAppliedTo": 914, + "approved": 706 + }, + "phrases": { + "total": 24685, + "translated": 188, + "preTranslateAppliedTo": 99, + "approved": 58 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "ne-NP", + "words": { + "total": 336489, + "translated": 1887, + "preTranslateAppliedTo": 200, + "approved": 1434 + }, + "phrases": { + "total": 24685, + "translated": 317, + "preTranslateAppliedTo": 45, + "approved": 248 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "nl", + "words": { + "total": 336489, + "translated": 71400, + "preTranslateAppliedTo": 17112, + "approved": 37568 + }, + "phrases": { + "total": 24685, + "translated": 6480, + "preTranslateAppliedTo": 1791, + "approved": 3380 + }, "translationProgress": 21, "approvalProgress": 11 }, { "languageId": "no", + "words": { + "total": 336489, + "translated": 6743, + "preTranslateAppliedTo": 1939, + "approved": 1717 + }, + "phrases": { + "total": 24685, + "translated": 1319, + "preTranslateAppliedTo": 414, + "approved": 306 + }, "translationProgress": 2, "approvalProgress": 0 }, { "languageId": "or", + "words": { + "total": 336489, + "translated": 146, + "preTranslateAppliedTo": 42, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 79, + "preTranslateAppliedTo": 31, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "pa-IN", + "words": { + "total": 336489, + "translated": 3977, + "preTranslateAppliedTo": 458, + "approved": 6 + }, + "phrases": { + "total": 24685, + "translated": 365, + "preTranslateAppliedTo": 44, + "approved": 2 + }, "translationProgress": 1, "approvalProgress": 0 }, { "languageId": "pcm", + "words": { + "total": 336489, + "translated": 28626, + "preTranslateAppliedTo": 2714, + "approved": 17267 + }, + "phrases": { + "total": 24685, + "translated": 2637, + "preTranslateAppliedTo": 350, + "approved": 1686 + }, "translationProgress": 8, "approvalProgress": 5 }, { "languageId": "pl", + "words": { + "total": 336489, + "translated": 158045, + "preTranslateAppliedTo": 23871, + "approved": 94469 + }, + "phrases": { + "total": 24685, + "translated": 12909, + "preTranslateAppliedTo": 2437, + "approved": 7963 + }, "translationProgress": 46, "approvalProgress": 28 }, { "languageId": "pt-BR", + "words": { + "total": 336489, + "translated": 326075, + "preTranslateAppliedTo": 53214, + "approved": 319354 + }, + "phrases": { + "total": 24685, + "translated": 24198, + "preTranslateAppliedTo": 4787, + "approved": 23630 + }, "translationProgress": 96, "approvalProgress": 94 }, { "languageId": "pt-PT", + "words": { + "total": 336489, + "translated": 39477, + "preTranslateAppliedTo": 4918, + "approved": 26172 + }, + "phrases": { + "total": 24685, + "translated": 3712, + "preTranslateAppliedTo": 775, + "approved": 2376 + }, "translationProgress": 11, "approvalProgress": 7 }, { "languageId": "ro", + "words": { + "total": 336489, + "translated": 103193, + "preTranslateAppliedTo": 28227, + "approved": 78311 + }, + "phrases": { + "total": 24685, + "translated": 9188, + "preTranslateAppliedTo": 2632, + "approved": 6983 + }, "translationProgress": 30, "approvalProgress": 23 }, { "languageId": "ru", + "words": { + "total": 336489, + "translated": 172802, + "preTranslateAppliedTo": 35985, + "approved": 96860 + }, + "phrases": { + "total": 24685, + "translated": 14092, + "preTranslateAppliedTo": 3599, + "approved": 7842 + }, "translationProgress": 51, "approvalProgress": 28 }, { "languageId": "sat", + "words": { + "total": 336489, + "translated": 69, + "preTranslateAppliedTo": 66, + "approved": 57 + }, + "phrases": { + "total": 24685, + "translated": 26, + "preTranslateAppliedTo": 25, + "approved": 20 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "si-LK", + "words": { + "total": 336489, + "translated": 978, + "preTranslateAppliedTo": 886, + "approved": 706 + }, + "phrases": { + "total": 24685, + "translated": 134, + "preTranslateAppliedTo": 98, + "approved": 58 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "sk", + "words": { + "total": 336489, + "translated": 14738, + "preTranslateAppliedTo": 2629, + "approved": 6377 + }, + "phrases": { + "total": 24685, + "translated": 1683, + "preTranslateAppliedTo": 439, + "approved": 700 + }, "translationProgress": 4, "approvalProgress": 1 }, { "languageId": "sl", + "words": { + "total": 336489, + "translated": 54938, + "preTranslateAppliedTo": 20007, + "approved": 26540 + }, + "phrases": { + "total": 24685, + "translated": 5175, + "preTranslateAppliedTo": 2068, + "approved": 2537 + }, "translationProgress": 16, "approvalProgress": 7 }, { "languageId": "sn", + "words": { + "total": 336489, + "translated": 557, + "preTranslateAppliedTo": 557, + "approved": 465 + }, + "phrases": { + "total": 24685, + "translated": 53, + "preTranslateAppliedTo": 53, + "approved": 40 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "so", + "words": { + "total": 336489, + "translated": 1238, + "preTranslateAppliedTo": 797, + "approved": 493 + }, + "phrases": { + "total": 24685, + "translated": 252, + "preTranslateAppliedTo": 156, + "approved": 42 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "sq", + "words": { + "total": 336489, + "translated": 8532, + "preTranslateAppliedTo": 6014, + "approved": 693 + }, + "phrases": { + "total": 24685, + "translated": 1115, + "preTranslateAppliedTo": 741, + "approved": 58 + }, "translationProgress": 2, "approvalProgress": 0 }, { "languageId": "sr-CS", + "words": { + "total": 336489, + "translated": 41464, + "preTranslateAppliedTo": 3636, + "approved": 26313 + }, + "phrases": { + "total": 24685, + "translated": 3837, + "preTranslateAppliedTo": 504, + "approved": 2374 + }, "translationProgress": 12, "approvalProgress": 7 }, { "languageId": "sv-SE", + "words": { + "total": 336489, + "translated": 28083, + "preTranslateAppliedTo": 8024, + "approved": 10006 + }, + "phrases": { + "total": 24685, + "translated": 3150, + "preTranslateAppliedTo": 1096, + "approved": 1087 + }, "translationProgress": 8, "approvalProgress": 2 }, { "languageId": "sw", + "words": { + "total": 336489, + "translated": 24971, + "preTranslateAppliedTo": 6832, + "approved": 16569 + }, + "phrases": { + "total": 24685, + "translated": 2729, + "preTranslateAppliedTo": 883, + "approved": 1784 + }, "translationProgress": 7, "approvalProgress": 4 }, { "languageId": "ta", + "words": { + "total": 336489, + "translated": 8030, + "preTranslateAppliedTo": 1738, + "approved": 1453 + }, + "phrases": { + "total": 24685, + "translated": 1041, + "preTranslateAppliedTo": 335, + "approved": 255 + }, "translationProgress": 2, "approvalProgress": 0 }, { "languageId": "te", + "words": { + "total": 336489, + "translated": 13832, + "preTranslateAppliedTo": 1291, + "approved": 694 + }, + "phrases": { + "total": 24685, + "translated": 1401, + "preTranslateAppliedTo": 153, + "approved": 59 + }, "translationProgress": 4, "approvalProgress": 0 }, { "languageId": "tg", + "words": { + "total": 336489, + "translated": 169, + "preTranslateAppliedTo": 87, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 52, + "preTranslateAppliedTo": 44, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "th", + "words": { + "total": 336489, + "translated": 12941, + "preTranslateAppliedTo": 2660, + "approved": 5951 + }, + "phrases": { + "total": 24685, + "translated": 1728, + "preTranslateAppliedTo": 498, + "approved": 630 + }, "translationProgress": 3, "approvalProgress": 1 }, { "languageId": "ti", + "words": { + "total": 336489, + "translated": 160, + "preTranslateAppliedTo": 14, + "approved": 0 + }, + "phrases": { + "total": 24685, + "translated": 17, + "preTranslateAppliedTo": 1, + "approved": 0 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "tk", + "words": { + "total": 336489, + "translated": 6361, + "preTranslateAppliedTo": 739, + "approved": 5881 + }, + "phrases": { + "total": 24685, + "translated": 709, + "preTranslateAppliedTo": 131, + "approved": 604 + }, "translationProgress": 1, "approvalProgress": 1 }, { "languageId": "tl", + "words": { + "total": 336489, + "translated": 2844, + "preTranslateAppliedTo": 811, + "approved": 86 + }, + "phrases": { + "total": 24685, + "translated": 264, + "preTranslateAppliedTo": 93, + "approved": 8 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "tr", + "words": { + "total": 336489, + "translated": 326807, + "preTranslateAppliedTo": 44723, + "approved": 321705 + }, + "phrases": { + "total": 24685, + "translated": 24288, + "preTranslateAppliedTo": 4221, + "approved": 23859 + }, "translationProgress": 97, "approvalProgress": 95 }, { "languageId": "uk", + "words": { + "total": 336489, + "translated": 191008, + "preTranslateAppliedTo": 34741, + "approved": 64755 + }, + "phrases": { + "total": 24685, + "translated": 15442, + "preTranslateAppliedTo": 3316, + "approved": 5426 + }, "translationProgress": 56, "approvalProgress": 19 }, { "languageId": "ur-IN", + "words": { + "total": 336489, + "translated": 1998, + "preTranslateAppliedTo": 367, + "approved": 1214 + }, + "phrases": { + "total": 24685, + "translated": 437, + "preTranslateAppliedTo": 162, + "approved": 200 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "ur-PK", + "words": { + "total": 336489, + "translated": 2766, + "preTranslateAppliedTo": 1441, + "approved": 725 + }, + "phrases": { + "total": 24685, + "translated": 451, + "preTranslateAppliedTo": 191, + "approved": 60 + }, "translationProgress": 0, "approvalProgress": 0 }, { "languageId": "uz", + "words": { + "total": 336489, + "translated": 22487, + "preTranslateAppliedTo": 4383, + "approved": 1878 + }, + "phrases": { + "total": 24685, + "translated": 2310, + "preTranslateAppliedTo": 640, + "approved": 339 + }, "translationProgress": 6, "approvalProgress": 0 }, { "languageId": "vi", + "words": { + "total": 336489, + "translated": 62946, + "preTranslateAppliedTo": 12751, + "approved": 16174 + }, + "phrases": { + "total": 24685, + "translated": 5744, + "preTranslateAppliedTo": 1399, + "approved": 1635 + }, "translationProgress": 18, "approvalProgress": 4 }, { "languageId": "yo", + "words": { + "total": 336489, + "translated": 3820, + "preTranslateAppliedTo": 930, + "approved": 687 + }, + "phrases": { + "total": 24685, + "translated": 494, + "preTranslateAppliedTo": 117, + "approved": 55 + }, "translationProgress": 1, "approvalProgress": 0 }, { "languageId": "zh-CN", - "translationProgress": 95, + "words": { + "total": 336489, + "translated": 323069, + "preTranslateAppliedTo": 56826, + "approved": 305017 + }, + "phrases": { + "total": 24685, + "translated": 23991, + "preTranslateAppliedTo": 5128, + "approved": 22626 + }, + "translationProgress": 96, "approvalProgress": 90 }, { "languageId": "zh-TW", + "words": { + "total": 336489, + "translated": 214786, + "preTranslateAppliedTo": 37224, + "approved": 111257 + }, + "phrases": { + "total": 24685, + "translated": 17351, + "preTranslateAppliedTo": 3689, + "approved": 8893 + }, "translationProgress": 63, "approvalProgress": 33 }, { "languageId": "zu", + "words": { + "total": 336489, + "translated": 164, + "preTranslateAppliedTo": 164, + "approved": 109 + }, + "phrases": { + "total": 24685, + "translated": 17, + "preTranslateAppliedTo": 17, + "approved": 9 + }, "translationProgress": 0, "approvalProgress": 0 } diff --git a/src/lib/types.ts b/src/lib/types.ts index e6c2cc631d4..30a05ac2ce5 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -187,6 +187,40 @@ export type LocaleContributions = { data: FileContributorData[] } +// Crowdin translation progress +type Language = { + id: string + name: string + editorCode: string + twoLettersCode: string + threeLettersCode: string + locale: string + androidCode: string + osxCode: string + osxLocale: string + pluralCategoryNames: string[] + pluralRules: string + pluralExamples: string[] + textDirection: string + dialectOf: unknown +} + +type CountSummary = { + total: number + translated: number + preTranslateAppliedTo: number + approved: number +} + +export type ProjectProgressData = { + languageId: string, + language?: Language, + words: CountSummary, + phrases: CountSummary, + translationProgress: number + approvalProgress: number +} + // GitHub contributors export type Commit = { commit: { @@ -225,8 +259,8 @@ export type ToCNodeEntry = { export type TocNodeType = | ToCNodeEntry | { - items: TocNodeType[] - } + items: TocNodeType[] + } export type ToCItem = { title: string @@ -292,12 +326,12 @@ export type TimestampedData = { export type MetricDataValue = | { - error: string - } + error: string + } | { - data: Data - value: Value - } + data: Data + value: Value + } export type EtherscanNodeResponse = { result: { diff --git a/src/scripts/crowdin/getTranslationProgress.ts b/src/scripts/crowdin/getTranslationProgress.ts index 22e3963505e..bb654f6ce33 100644 --- a/src/scripts/crowdin/getTranslationProgress.ts +++ b/src/scripts/crowdin/getTranslationProgress.ts @@ -1,5 +1,7 @@ import fs from 'fs' +import type { ProjectProgressData } from "../../lib/types" + import crowdin from "./api-client/crowdinClient" import "dotenv/config" @@ -8,19 +10,15 @@ async function main() { const projectId = Number(process.env.CROWDIN_PROJECT_ID) || 363359 try { - const progress = await crowdin.translationStatusApi.getProjectProgress(projectId, { + const response = await crowdin.translationStatusApi.getProjectProgress(projectId, { limit: 200, }) - if (!progress) throw new Error("Error fetching Crowdin translation progress. Check your environment variables for a working API key.") + if (!response) throw new Error("Error fetching Crowdin translation progress. Check your environment variables for a working API key.") - const results = progress.data.map(({ data: { languageId, translationProgress, approvalProgress } }) => ({ - languageId, - translationProgress, - approvalProgress, - })) + const progress = response.data.map(({ data }) => ({ ...data, language: undefined } satisfies ProjectProgressData)) - fs.writeFileSync("src/data/translationProgress.json", JSON.stringify(results, null, 2)) + fs.writeFileSync("src/data/translationProgress.json", JSON.stringify(progress, null, 2)) } catch (error: unknown) { console.error((error as Error).message) From e1c2c6fd99968b5916aff3d2aaf2bdc393030bd9 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 24 Jan 2024 10:16:49 -0800 Subject: [PATCH 081/478] style: limit desktop menu height to 75vh --- src/components/Nav/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 9b01a0445e6..553e2e3a9cc 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -116,7 +116,7 @@ const Nav: FC = ({ path }) => { Date: Wed, 24 Jan 2024 10:20:17 -0800 Subject: [PATCH 082/478] refactor: improve nomenclature, extract type --- src/components/LanguagePicker.tsx | 108 +++++++++++++++--------------- src/lib/types.ts | 8 +++ 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index 41c36ab17c0..5bad70a1e1e 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -18,7 +18,7 @@ import { Text, } from "@chakra-ui/react" -import type { Lang } from "@/lib/types" +import type { Lang, LocaleDisplayInfo } from "@/lib/types" import { BaseLink, type LinkProps } from "@/components/Link" @@ -30,13 +30,6 @@ import { Button } from "./Buttons" import i18nConfig from "@/../i18n.config.json" -type LocaleDisplayInfo = { - localeChoice: string - source: string - target: string - approvalProgress: number -} - type ItemProps = MenuItemProps & Pick const Item = forwardRef(({ onClick, ...props }: ItemProps, ref) => ( @@ -100,53 +93,58 @@ const LanguagePicker = ({ const firstItemRef = useRef(null) const [filterValue, setFilterValue] = useState("") - const displayNames: LocaleDisplayInfo[] = - locales - ?.map((localeChoice): LocaleDisplayInfo => { - const i18nConfigItem = i18nConfig.find( - ({ code }) => localeChoice === code - ) - if (!i18nConfigItem) - throw new Error("Missing i18n config for " + localeChoice) + const localeToDisplayInfo = (localeOption: string): LocaleDisplayInfo => { + const i18nConfigItem = i18nConfig.find(({ code }) => localeOption === code) + if (!i18nConfigItem) + throw new Error("Missing i18n config for " + localeOption) - // Get "source" display name (Language choice displayed in language of current locale) - const intlSource = new Intl.DisplayNames([locale!], { - type: "language", - }).of(localeChoice) - // For languages that do not have an Intl display name, use English name as fallback - const fallbackSource = - intlSource !== localeChoice ? intlSource : i18nConfigItem.name - const i18nKey = "language-" + localeChoice.toLowerCase() - const i18nSource = t(i18nKey) - const source = i18nSource === i18nKey ? fallbackSource : i18nSource + const englishName = i18nConfigItem.name - // Get "target" display name (Language choice displayed in that language) - const fallbackTarget = new Intl.DisplayNames([localeChoice], { - type: "language", - }).of(localeChoice) - const i18nConfigTarget = i18nConfigItem?.localName - const target = i18nConfigTarget || fallbackTarget + // Get "source" display name (Language choice displayed in language of current locale) + const intlSource = new Intl.DisplayNames([locale!], { + type: "language", + }).of(localeOption) + // For languages that do not have an Intl display name, use English name as fallback + const fallbackSource = + intlSource !== localeOption ? intlSource : englishName + const i18nKey = "language-" + localeOption.toLowerCase() + const i18nSource = t(i18nKey) + const sourceName = i18nSource === i18nKey ? fallbackSource : i18nSource - if (!source || !target) { - throw new Error( - "Missing language display name, locale: " + localeChoice - ) - } + // Get "target" display name (Language choice displayed in that language) + const fallbackTarget = new Intl.DisplayNames([localeOption], { + type: "language", + }).of(localeOption) + const i18nConfigTarget = i18nConfigItem?.localName + const targetName = i18nConfigTarget || fallbackTarget - const dataItem = progressData.find( - ({ languageId }) => i18nConfigItem.crowdinCode === languageId - ) - const approvalProgress = - dataItem?.approvalProgress || - (localeChoice === DEFAULT_LOCALE ? 100 : 0) + if (!sourceName || !targetName) { + throw new Error("Missing language display name, locale: " + localeOption) + } + + const dataItem = progressData.find( + ({ languageId }) => i18nConfigItem.crowdinCode === languageId + ) + const approvalProgress = + dataItem?.approvalProgress || (localeOption === DEFAULT_LOCALE ? 100 : 0) + + return { + localeOption, + approvalProgress, + sourceName, + targetName, + englishName, + } + } - return { localeChoice, source, target, approvalProgress } - }) + const displayNames: LocaleDisplayInfo[] = + locales + ?.map(localeToDisplayInfo) .sort((a, b) => b.approvalProgress - a.approvalProgress) || [] const filteredNames = displayNames.filter( - ({ localeChoice, source, target }) => - (localeChoice + source + target) + ({ localeOption, sourceName, targetName, englishName }) => + (localeOption + sourceName + targetName + englishName) .toLowerCase() .includes(filterValue.toLowerCase()) ) @@ -162,7 +160,7 @@ const LanguagePicker = ({ return acc }, "") const browserLocaleInfo = displayNames.find( - ({ localeChoice }) => localeChoice === browserLocale + ({ localeOption }) => localeOption === browserLocale ) return ( @@ -219,14 +217,14 @@ const LanguagePicker = ({ onClick={onMenuClose} > - {browserLocaleInfo.target} + {browserLocaleInfo.targetName} - {browserLocaleInfo.source} + {browserLocaleInfo.sourceName} @@ -278,7 +276,7 @@ const LanguagePicker = ({ {filteredNames.map( ( - { localeChoice, source, target, approvalProgress }, + { localeOption, sourceName, targetName, approvalProgress }, index ) => { const firstResult = index === 0 @@ -291,14 +289,14 @@ const LanguagePicker = ({ : percentage return ( - {target} + {targetName} - {source} ·{" "} + {sourceName} ·{" "} Date: Wed, 24 Jan 2024 10:51:37 -0800 Subject: [PATCH 083/478] feat: add NoResultsCallout --- src/components/LanguagePicker.tsx | 26 +++++++++++++++++++++++++- src/intl/en/page-languages.json | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index 5bad70a1e1e..907068697d6 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -75,6 +75,27 @@ const Progress = ({ value }: Pick) => ( /> ) +type NoResultsCalloutProps = { onMenuClose: () => void } +const NoResultsCallout = ({ onMenuClose }: NoResultsCalloutProps) => { + const { t } = useTranslation("page-languages") + return ( + + + {t("page-languages-want-more-header")} + + {t("page-languages-want-more-paragraph")}{" "} + + {t("page-languages-want-more-link")} + + + ) +} + type LanguagePickerProps = Omit & { children: React.ReactNode placement: MenuProps["placement"] @@ -190,7 +211,7 @@ const LanguagePicker = ({ p="4" variant="ghost" alignSelf="end" - onClick={onClose} + onClick={onMenuClose} textTransform="uppercase" fontSize="xs" > @@ -322,6 +343,9 @@ const LanguagePicker = ({ ) } )} + {filteredNames.length === 0 && ( + + )} diff --git a/src/intl/en/page-languages.json b/src/intl/en/page-languages.json index 53d97878c77..fe9bb5d7a7c 100644 --- a/src/intl/en/page-languages.json +++ b/src/intl/en/page-languages.json @@ -11,6 +11,7 @@ "page-languages-want-more-header": "Want to see ethereum.org in a different language?", "page-languages-want-more-link": "Translation Program", "page-languages-want-more-paragraph": "ethereum.org translators are always translating pages in as many languages as possible. To see what they're working on right now or to sign up to join them, read about our", + "page-languages-want-more-content": "ethereum.org translators are always translating pages in as many languages as possible. To see what they're working on right now or to sign up to join them, read about our Translation Program.", "page-languages-filter-placeholder": "Filter", "langauge-am": "Amharic", "language-ar": "Arabic", From 956baf409840eb8bd6308d06a746b1a1261f6917 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 24 Jan 2024 12:10:10 -0800 Subject: [PATCH 084/478] refactor: use closeOnSelect to keep menu open --- src/components/LanguagePicker.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index 907068697d6..665d6c9cdc6 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -261,16 +261,8 @@ const LanguagePicker = ({ p="0" bg="transparent" position="relative" - pointerEvents="none" + closeOnSelect={false} > - e.stopPropagation()} - /> Date: Wed, 24 Jan 2024 12:24:32 -0800 Subject: [PATCH 085/478] feat: kbd shortcut for language menu / color mode --- src/components/Nav/index.tsx | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 553e2e3a9cc..4856cbe0945 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -11,6 +11,7 @@ import { Icon, MenuButton, useDisclosure, + useEventListener, } from "@chakra-ui/react" import { IconButton } from "@/components/Buttons" @@ -31,17 +32,31 @@ export interface IProps { const Nav: FC = ({ path }) => { const { ednLinks, - fromPageParameter, isDarkTheme, shouldShowSubNav, toggleColorMode, linkSections, mobileNavProps, } = useNav({ path }) - const { asPath, locale, locales } = useRouter() + const { locale } = useRouter() const { t } = useTranslation("common") const searchModalDisclosure = useDisclosure() const navWrapperRef = useRef(null) + const languagePickerRef = useRef(null) + /** + * Adds a keydown event listener to toggle color mode (ctrl|cmd + \) + * or open the language picker (\). + * @param {string} event - The keydown event. + */ + useEventListener("keydown", (e) => { + if (e.key !== "\\") return + e.preventDefault() + if (e.metaKey) { + toggleColorMode() + } else { + languagePickerRef.current?.click() + } + }) return ( @@ -123,6 +138,7 @@ const Nav: FC = ({ path }) => { > Date: Thu, 25 Jan 2024 13:31:10 +0530 Subject: [PATCH 086/478] feat:Add new words to glossary list --- public/content/glossary/index.md | 12 ++++++++++++ src/intl/en/glossary.json | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/public/content/glossary/index.md b/public/content/glossary/index.md index fb560a677a9..23730eef6e3 100644 --- a/public/content/glossary/index.md +++ b/public/content/glossary/index.md @@ -244,12 +244,16 @@ lang: en ## L {#section-l} + + + + @@ -258,8 +262,12 @@ lang: en + + + + @@ -288,8 +296,12 @@ lang: en ## O {#section-o} + + + + diff --git a/src/intl/en/glossary.json b/src/intl/en/glossary.json index 5e2d2a9a58f..be20e714e91 100644 --- a/src/intl/en/glossary.json +++ b/src/intl/en/glossary.json @@ -193,18 +193,26 @@ "keystore-definition": "Every account’s private key/address pair exists as a single keyfile in an Ethereum client. These are JSON text files which contains the encrypted private key of the account, which can only be decrypted with the password entered during account creation.", "keccak-256-term": "Keccak-256", "keccak-256-definition": "Cryptographic hash function used in Ethereum. Keccak-256 was standardized as SHA-3.", + "layer-1-term": "Layer 1", + "layer-1-definition": "Layer 1 refers to the main blockchain in a multi-level blockchain network. For example, Ethereum and Bitcoin are layer one blockchains. Many layer two blockchain offload resource-intense transactions to their separate blockchain, while continuing to use Ethereum's or Bitcoin's layer one blockchain for security purposes.", "layer-2-term": "Layer 2", "layer-2-definition": "An area of development focused on layering improvements on top of the Ethereum protocol. These improvements are related to transaction speeds, cheaper transaction fees, and transaction privacy. More on layer 2.", "library-term": "Library", "library-definition": "A special type of contract that has no payable functions, no fallback function, and no data storage. Therefore, it cannot receive or hold ether, or store data. A library serves as previously deployed code that other contracts can call for read-only computation. More on smart contract libraries.", "light-client-term": "Light client", "light-client-definition": "An Ethereum client that does not store a local copy of the blockchain, or validate blocks and transactions. It offers the functions of a wallet and can create and broadcast transactions.", + "liquidity-term": "Liquidity", + "liquidity-definition": "Liquidity is how quickly and easily an asset can be converted into cash or another asset. Decentralized exchanges like Uniswap have multiple liquidity pools where asset holders can deposit their assets where traders can buy and sell them in a decentralized way in exchange for rewards.", "lmd-ghost-term": "LMD-GHOST", "lmd-ghost-definition": "The fork-choice algorithm used by Ethereum's consensus clients to identify the head of the chain. LMD-GHOST is an acronym standing for \"Latest Message Driven Greediest Heaviest Observed SubTree\" which means that the head of the chain is the block with the greatest accumulation of attestations in its history.", "mainnet-term": "Mainnet", "mainnet-definition": "Short for \"main network,\" this is the main public Ethereum blockchain.", + "max-fee-per-gas-term": "Max Fee Per Gas", + "max-fee-per-gas-definition": "The Max Fee is the absolute maximum amount a user is willing to pay per unit of gas (gwei) to get a transaction included in a block.", "merkle-patricia-tree-term": "Merkle Patricia Tree (MPT)", "merkle-patricia-tree-definition": "A data structure used in Ethereum to efficiently store key-value pairs.", + "merkle-root-term": "Merkle Root", + "merkle-root-definition": "A Merkle root is the single top hash of a Merkle tree. It verifies all transactions within a block.", "message-term": "Message", "message-definition": "An internal transaction that is never serialized and only sent within the EVM.", "message-call-term": "Message call", @@ -225,8 +233,12 @@ "node-definition": "A software client that participates in the network. More on nodes and clients.", "nonce-term": "Nonce", "nonce-definition": "In cryptography, a value that can only be used once. An account nonce is a transaction counter in each account, which is used to prevent replay attacks.", + "off-chain-term": "Off-Chain", + "off-chain-definition": "Off-chain means any transaction or data that exists outside the blockchain. Because committing every transaction on-chain can be expensive and inefficient, third-party tools like oracles that handle pricing data, or layer 2 solutions that execute a higher throughput of transactions, handle a bulk of the processing work off-chain, and will submit information on-chain at less frequent intervals.", "ommer-term": "Ommer (uncle) block", "ommer-definition": "When a proof-of-work miner finds a valid block, another miner may have published a competing block which is added to the tip of the blockchain first. This valid, but stale, block can be included by newer blocks as ommers and receive a partial block reward. The term \"ommer\" is the preferred gender-neutral term for the sibling of a parent block, but this is also sometimes referred to as an \"uncle\". This was relevant for Ethereum when it was a proof-of-work network, but ommers are not a feature of proof-of-stake Ethereum because precisely one block proposer is selected in each slot.", + "on-chain-term": "On-Chain", + "on-chain-definition": "On-chain is an umbrella term that includes any transaction or data that is available on the blockchain and visible to all nodes on the blockchain network such as mempool data, historical transactions, and account information.", "optimistic-rollup-term": "Optimistic rollup", "optimistic-rollup-definition": "A rollup of transactions that use fraud proofs to offer increased layer 2 transaction throughput while using the security provided by Mainnet (layer 1). Unlike Plasma, a similar layer 2 solution, Optimistic rollups can handle more complex transaction types – anything possible in the EVM. They do have latency issues compared to Zero-knowledge rollups because a transaction can be challenged via the fraud proof. More on Optimistic rollups.", "oracle-term": "Oracle", From 1e926d45e84f9d7f3f10ad5fa3788dee3da76562 Mon Sep 17 00:00:00 2001 From: Crostons Date: Thu, 25 Jan 2024 19:16:12 +0530 Subject: [PATCH 087/478] Updates in style-guide and date format --- .../style-guide/content-standardization/index.md | 15 +++++++++++++++ .../nodes-and-clients/client-diversity/index.md | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/public/content/contributing/style-guide/content-standardization/index.md b/public/content/contributing/style-guide/content-standardization/index.md index aaa30266316..fb92e55c25f 100644 --- a/public/content/contributing/style-guide/content-standardization/index.md +++ b/public/content/contributing/style-guide/content-standardization/index.md @@ -155,6 +155,21 @@ Sentences using active voice are more concise and efficient, making your writing _This isn't an easy one, especially for non-native English speakers. If you aren't sure, don't worry. We'll help with any of these._ +### Date Format {#date-format} + +When including dates in markdown content across Ethereum documentation, it is essential to maintain a consistent and clear presentation. In order to achieve this, we recommend the following guidelines: + +**Format:** + +Use the "D-Mon-YYYY" format for dates. This format eliminates ambiguity between the month and day, providing a standardized and easily understandable representation. + +**Examples:** + +- Preferred: 2-Nov-2023, 11-Feb-2023 +- Avoid: Nov-2-2023, 2/11/2023, 11/2/2023 + +By adhering to these guidelines, we create a unified approach to presenting dates, fostering clarity and comprehension throughout Ethereum documentation. + ### Linking to internal pages {#internal-links} When linking to another page on Ethereum.org, use the relative path over the absolute path. Do not hard-code the language path (i.e. `/en/`) in any links. This maintains consistent functionality across different language versions of the site. diff --git a/public/content/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/developers/docs/nodes-and-clients/client-diversity/index.md index 1a925d6a02c..6a0971d7ebe 100644 --- a/public/content/developers/docs/nodes-and-clients/client-diversity/index.md +++ b/public/content/developers/docs/nodes-and-clients/client-diversity/index.md @@ -46,7 +46,7 @@ _Diagram data from [ethernodes.org](https://ethernodes.org) and [clientdiversity The two pie charts above show snapshots of the current client diversity for the execution and consensus layers (at time of writing in January 2022). The execution layer is overwhelmingly dominated by [Geth](https://geth.ethereum.org/), with [Open Ethereum](https://openethereum.github.io/) a distant second, [Erigon](https://github.com/ledgerwatch/erigon) third and [Nethermind](https://nethermind.io/) fourth, with other clients comprising less than 1 % of the network. The most commonly used client on the consensus layer - [Prysm](https://prysmaticlabs.com/#projects) - is not as dominant as Geth but still represents over 60% of the network. [Lighthouse](https://lighthouse.sigmaprime.io/) and [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) make up ~20% and ~14% respectively, and other clients are rarely used. -The execution layer data were obtained from [Ethernodes](https://ethernodes.org) on 23/01/2022. Data for consensus clients was obtained from [Michael Sproul](https://github.com/sigp/blockprint). Consensus client data is more difficult to obtain because the consensus layer clients do not always have unambiguous traces that can be used to identify them. The data was generated using a classification algorithm that sometimes confuses some of the minority clients (see [here](https://twitter.com/sproulM_/status/1440512518242197516) for more details). In the diagram above, these ambiguous classifications are treated with an either/or label (e.g. Nimbus/Teku). Nevertheless, it is clear that the majority of the network is running Prysm. The data is a snapshot over a fixed set of blocks (in this case Beacon blocks in slots 2048001 to 2164916) and Prysm's dominance has sometimes been higher, exceeding 68%. Despite only being snapshots, the values in the diagram provide a good general sense of the current state of client diversity. +The execution layer data were obtained from [Ethernodes](https://ethernodes.org) on 23-Jan-2022. Data for consensus clients was obtained from [Michael Sproul](https://github.com/sigp/blockprint). Consensus client data is more difficult to obtain because the consensus layer clients do not always have unambiguous traces that can be used to identify them. The data was generated using a classification algorithm that sometimes confuses some of the minority clients (see [here](https://twitter.com/sproulM_/status/1440512518242197516) for more details). In the diagram above, these ambiguous classifications are treated with an either/or label (e.g. Nimbus/Teku). Nevertheless, it is clear that the majority of the network is running Prysm. The data is a snapshot over a fixed set of blocks (in this case Beacon blocks in slots 2048001 to 2164916) and Prysm's dominance has sometimes been higher, exceeding 68%. Despite only being snapshots, the values in the diagram provide a good general sense of the current state of client diversity. Up to date client diversity data for the consensus layer is now available at [clientdiversity.org](https://clientdiversity.org/). From 3bc4aa3b63346773b79ce3de3178e876584be2dc Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:47:47 +0000 Subject: [PATCH 088/478] Apply suggestions from code review --- public/content/translations/de/desci/index.md | 2 +- public/content/translations/de/roadmap/beacon-chain/index.md | 2 +- public/content/translations/de/roadmap/merge/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/de/desci/index.md b/public/content/translations/de/desci/index.md index 17d1c029ac3..7b53cb7d20f 100644 --- a/public/content/translations/de/desci/index.md +++ b/public/content/translations/de/desci/index.md @@ -18,7 +18,7 @@ Dezentralisierte Wissenschaft (DeSci) ist eine Bewegung, die darauf abzielt, ein 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. -Decentralized science allows for more diverse funding sources (from [DAOs](/dao/), [quadratic donations](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) to crowdfunding and more), more accessible data and methods, and by providing incentives for reproducibility. +Dezentralisierte Wissenschaft ermöglicht eine Vielzahl von Finanzierungsmöglichkeiten (von [DAOs](/dao/), [quadratischen 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 Reproduzierbarkeit. ### Juan Benet - Die DeSci-Bewegung diff --git a/public/content/translations/de/roadmap/beacon-chain/index.md b/public/content/translations/de/roadmap/beacon-chain/index.md index a18f823d013..4367cdeca0f 100644 --- a/public/content/translations/de/roadmap/beacon-chain/index.md +++ b/public/content/translations/de/roadmap/beacon-chain/index.md @@ -9,7 +9,7 @@ summaryPoint2: Sie wurde 2022 mit der ursprünglichen Ethereum Proof-of-Work Blo summaryPoint3: Die Beacon Chain führte die Konsenslogik und das Block-Gossip-Protokoll ein, das nun Ethereum sichert. --- - + Die Beacon Chain, die am 1. Dezember 2020 an den Start ging, formalisierte Proof-of-Stake als Konsensmechanismus von Ethereum mit dem Merge Upgrade am 15. September 2022. diff --git a/public/content/translations/de/roadmap/merge/index.md b/public/content/translations/de/roadmap/merge/index.md index ec3f194b40a..4a3e3794535 100644 --- a/public/content/translations/de/roadmap/merge/index.md +++ b/public/content/translations/de/roadmap/merge/index.md @@ -10,7 +10,7 @@ summaryPoint3: Die Zusammenführung bezieht sich auf das ursprüngliche Ethereum summaryPoint4: Die Zusammenführung reduzierte Ethereums Energieverbrauch um ca. 99,95 %. --- - + Die Zusammenführung wurde am 15. September 2022 durchgeführt. Dies vervollständigte Ethereums Übergang zu Proof-of-Stake, was Proof-of-Work offiziell abschaffte und den Energieverbrauch um ~99,95 % verringert hat. From da6c3cc9fc6fc1c236316d1e5acd4c7e254aa981 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:49:41 +0000 Subject: [PATCH 089/478] Delete gas JSON file --- src/intl/de/page-gas.json | 64 --------------------------------------- 1 file changed, 64 deletions(-) delete mode 100644 src/intl/de/page-gas.json diff --git a/src/intl/de/page-gas.json b/src/intl/de/page-gas.json deleted file mode 100644 index 6094b67351b..00000000000 --- a/src/intl/de/page-gas.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "page-gas-meta-title": "Gas fees on Ethereum: how do they work?", - "page-gas-meta-description": "Learn about gas on Ethereum: how they work and how to pay less in gas fees", - "page-gas-hero-title": "Gas fees", - "page-gas-hero-header": "Network fees", - "page-gas-hero-button-1-content": "Was ist Gas?", - "page-gas-hero-subtitle-1": "Network fees on Ethereum are called gas.", - "page-gas-hero-subtitle-2": "Gas is the fuel that powers Ethereum.", - "page-gas-summary-title": "Zusammenfassung", - "page-gas-summary-item-1": "Every transaction on Ethereum requires a small form of payment to process", - "page-gas-summary-item-2": "These fees are known as ‘gas’ fee", - "page-gas-summary-item-3": "Gas fees change based on network congestion", - "page-gas-what-are-gas-fees-header": "What are gas fees?", - "page-gas-what-are-gas-fees-text-1": "Think of Ethereum as a large computer network where people can do tasks like sending messages or running programs. Just like in the real world, these tasks require energy to get done.", - "page-gas-what-are-gas-fees-text-2": "In Ethereum, each computational action has a set \"gas\" price. Your gas fees are the total cost of the actions in your transaction. When you send a transaction or run a smart contract, you pay in gas fees to process it.", - "page-gas-how-do-i-pay-less-gas-header": "How do I pay less gas?", - "page-gas-how-do-i-pay-less-gas-text": "While higher fees on Ethereum are sometimes inevitable, there are strategies you can use to reduce the cost:", - "page-gas-how-do-i-pay-less-gas-card-1-title": "Time your transactions", - "page-gas-how-do-i-pay-less-gas-card-1-description": "Just like travelling off-peak is less crowded and more affordable, Ethereum is generally cheaper to use when North America is asleep.", - "page-gas-how-do-i-pay-less-gas-card-2-title": "Wait for gas to go down", - "page-gas-how-do-i-pay-less-gas-card-2-description": "Gas prices go up and down every twelve seconds based on how congested Ethereum is. When gas prices are high, waiting just a few minutes before making a transaction could see a significant drop in what you pay.", - "page-gas-how-do-i-pay-less-gas-card-3-title": "Ebene 2 verwenden", - "page-gas-how-do-i-pay-less-gas-card-3-description": "Layer-2 chains are built atop Ethereum, offering lower fees and handling more transactions. They're a good choice to save on fees for transactions that don't need to happen on the main Ethereum network.", - "page-gas-try-layer-2": "Try layer 2", - "page-gas-what-causes-high-gas-fees-header": "What causes high gas fees?", - "page-gas-what-causes-high-gas-fees-text-1": "Whenever the amount of computation (gas) on Ethereum exceeds a certain threshold, gas fees begin to rise. The more the gas exceeds this threshold, the quicker gas fees increase.", - "page-gas-what-causes-high-gas-fees-text-2": "Higher fees could be caused by things like popular dapps or NFTs, periodically increased trading on DEXs, or an overwhelming number of user activity at peak times.", - "page-gas-what-causes-high-gas-fees-text-3": "Developers on Ethereum should take care to optimise their smart contracts usage before deploying. If lots of people are using a poorly written smart contract, it will consume more gas and could inadvertently cause network congestion.", - "page-gas-want-to-dive-deeper": "Du möchtest noch mehr erfahren?", - "page-gas-check-out-the-developer-docs": "Check out the developer docs.", - "page-gas-attack-of-the-cryptokitties-header": "Attack of the Cryptokitties", - "page-gas-attack-of-the-cryptokitties-text": "In November 2017, the popular CryptoKitties project was launched. Its rapid spike in popularity caused significant network congestion and extremely high gas fees. The challenges posed by CryptoKitties accelerated the urgency of finding solutions for scaling Ethereum.", - "page-gas-why-do-we-need-gas-header": "Why do we need gas?", - "page-gas-why-do-we-need-gas-text": "Gas is a critical element in keeping Ethereum secure and processing transactions. Gas helps in many ways:", - "page-gas-benefits-1-description": "Gas keeps Ethereum sybil-resistant by preventing malicious actors from overwhelming the network with fraudulent activities.", - "page-gas-benefits-2-description": "Because computation costs gas, spamming Ethereum with expensive transactions, either accidentally and maliciously, is financially disencentivised.", - "page-gas-benefits-3-description": "A hard-limit on the amount of computation that can be done at any one time prevents Ethereum from being overwhelmed, helping to ensure the network is always accessible.", - "page-gas-how-is-gas-calculated-header": "How is gas calculated?", - "page-gas-advanced": "Fortgeschritten", - "page-gas-how-is-gas-calculated-text-1": "The total gas fee you pay is made up of a few parts:", - "page-gas-how-is-gas-calculated-item-1": "Base fee: a fee set by the network that has to be paid for a transaction", - "page-gas-how-is-gas-calculated-item-2": "Priority fee: an optional tip to incentivise node operators to include your transaction", - "page-gas-how-is-gas-calculated-item-3": "Units of gas used*: remember we said gas represented computation? More complex actions, like interacting with a smart contract, use more gas than simple ones, such as sending a transaction.", - "page-gas-how-is-gas-calculated-list-item-1": "* See Figure 1 to see how much gas different types of transactions use", - "page-gas-how-is-gas-calculated-text-2": "The formula for calculating a gas fee is units of gas used * (base fee + priority fee). Most wallets will calculate gas usage and display it in a more straight-forward way.", - "page-gas-table-figure": "Figure 1: Gas used by transaction type", - "page-gas-table-header-1": "Transaction type", - "page-gas-table-header-2": "Units of gas used", - "page-gas-table-item-1-transaction-type": "Sending ETH", - "page-gas-table-item-2-transaction-type": "Sending ERC-20 tokens", - "page-gas-table-item-3-transaction-type": "Transferring and NFT", - "page-gas-table-item-4-transaction-type": "Swapping on Uniswap", - "page-gas-faq-header": "Frequency asked questions", - "page-gas-faq-question-1-q": "Who gets paid the gas fee in my transaction?", - "page-gas-faq-question-1-a-1": "The majority is gas fee—the base fee— is destroyed by the protocol (burned). The priority fee, if included in your transaction, will be given to the validator who proposed your transaction.", - "page-gas-faq-question-1-a-2": "You can read a detailed description of the process in the gas developer docs.", - "page-gas-faq-question-2-q": "Do I need to pay gas in ETH?", - "page-gas-faq-question-2-a-1": "Yes. All gas fees on Ethereum must be paid in the native ETH currency.", - "page-gas-faq-question-2-a-2": "Mehr zu ETH", - "page-gas-faq-question-3-q": "What is gwei?", - "page-gas-faq-question-3-a-1": "In most wallets or gas trackers, you will see gas prices denominated as ‘gwei’.", - "page-gas-faq-question-3-a-2": "Gwei is just a smaller unit of ETH, just as pennies are to dollars, with the difference being that 1 ETH equals 1 billion gwei. Gwei is useful when talking about very small amounts of ETH.", - "page-gas-use-layer-2": "Ebene 2 verwenden" -} From ecbcd1e8ed8dd5240f8da5bf030a3de69ac11ba3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:20:57 -0800 Subject: [PATCH 090/478] style: update styling per design add words approved --- src/components/LanguagePicker.tsx | 75 ++++++++++++++++++------------- src/lib/types.ts | 1 + 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index 665d6c9cdc6..66ad8b72842 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -38,6 +38,7 @@ const Item = forwardRef(({ onClick, ...props }: ItemProps, ref) => ( ref={ref} flexDir="column" w="full" + mb="1" onClick={onClick} alignItems="start" borderRadius="base" @@ -45,8 +46,8 @@ const Item = forwardRef(({ onClick, ...props }: ItemProps, ref) => ( color="body.base" textDecoration="none" data-group - _hover={{ bg: "background.base", textDecoration: "none" }} - _focus={{ bg: "background.base" }} + _hover={{ bg: "primary.lowContrast", textDecoration: "none" }} + _focus={{ bg: "primary.lowContrast" }} sx={{ p: { textDecoration: "none", @@ -63,10 +64,8 @@ const Progress = ({ value }: Pick) => ( (null) const [filterValue, setFilterValue] = useState("") + if (!(progressData?.length > 0)) throw new Error("Missing translation progress data; check GitHub action") + + const totalWords = progressData[0].words.total + const localeToDisplayInfo = (localeOption: string): LocaleDisplayInfo => { const i18nConfigItem = i18nConfig.find(({ code }) => localeOption === code) if (!i18nConfigItem) @@ -143,11 +146,14 @@ const LanguagePicker = ({ throw new Error("Missing language display name, locale: " + localeOption) } + // English will not have a dataItem const dataItem = progressData.find( ({ languageId }) => i18nConfigItem.crowdinCode === languageId ) - const approvalProgress = - dataItem?.approvalProgress || (localeOption === DEFAULT_LOCALE ? 100 : 0) + + const approvalProgress = localeOption === DEFAULT_LOCALE ? 100 : (dataItem?.approvalProgress || 0) + + const wordsApproved = localeOption === DEFAULT_LOCALE ? (totalWords || 0) : (dataItem?.words.approved || 0) return { localeOption, @@ -155,6 +161,7 @@ const LanguagePicker = ({ sourceName, targetName, englishName, + wordsApproved, } } @@ -223,13 +230,13 @@ const LanguagePicker = ({ w="100%" minH="calc(100% - 53px)" // Fill height with space for close button on mobile p="4" - bg="primary.lowContrast" - sx={{ "[role=menuitem]": { p: "2" } }} + bg="background.highlight" + sx={{ "[role=menuitem]": { py: "3", px: "2" } }} > {browserLocaleInfo && ( <> - Browser default + Browser language - + )} @@ -289,7 +296,13 @@ const LanguagePicker = ({ {filteredNames.map( ( - { localeOption, sourceName, targetName, approvalProgress }, + { + localeOption, + sourceName, + targetName, + approvalProgress, + wordsApproved, + }, index ) => { const firstResult = index === 0 @@ -300,6 +313,7 @@ const LanguagePicker = ({ approvalProgress === 0 ? "<" + percentage.replace("0", "1") : percentage + const words = new Intl.NumberFormat(locale!).format(wordsApproved) return ( - + {targetName} - - - {sourceName} ·{" "} - - {progress} translated - - - + + {sourceName} + + + {progress} translated • {words} words + ) diff --git a/src/lib/types.ts b/src/lib/types.ts index 5bd278f9519..601e1749336 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -227,6 +227,7 @@ export type LocaleDisplayInfo = { targetName: string englishName: string approvalProgress: number + wordsApproved: number } // GitHub contributors From 43f2f57a5ceebf43435726bbe5892aeffb5fd7d1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 25 Jan 2024 14:41:43 -0800 Subject: [PATCH 091/478] feat: add footer callout, sticky positioning --- src/components/LanguagePicker.tsx | 49 +++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index 66ad8b72842..01781aacdc7 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -113,7 +113,8 @@ const LanguagePicker = ({ const firstItemRef = useRef(null) const [filterValue, setFilterValue] = useState("") - if (!(progressData?.length > 0)) throw new Error("Missing translation progress data; check GitHub action") + if (!(progressData?.length > 0)) + throw new Error("Missing translation progress data; check GitHub action") const totalWords = progressData[0].words.total @@ -151,9 +152,13 @@ const LanguagePicker = ({ ({ languageId }) => i18nConfigItem.crowdinCode === languageId ) - const approvalProgress = localeOption === DEFAULT_LOCALE ? 100 : (dataItem?.approvalProgress || 0) + const approvalProgress = + localeOption === DEFAULT_LOCALE ? 100 : dataItem?.approvalProgress || 0 - const wordsApproved = localeOption === DEFAULT_LOCALE ? (totalWords || 0) : (dataItem?.words.approved || 0) + const wordsApproved = + localeOption === DEFAULT_LOCALE + ? totalWords || 0 + : dataItem?.words.approved || 0 return { localeOption, @@ -209,11 +214,19 @@ const LanguagePicker = ({ - + {/* Mobile Close bar */} + + +

      Current Message:

      +

      {message}

      + +

      New Message:

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

      {status}

      + + +
      +
    +) +``` + + +Si vous examinez attentivement ce code, vous remarquerez où nous utilisons nos différentes variables d'état dans notre interface : + +- Aux lignes 6-12, si le portefeuille de l'utilisateur est connecté \(c'est-à-dire si `walletAddress.length > 0`\), nous affichons une version tronquée de `walletAddress` de l'utilisateur dans le bouton avec l'ID « walletButton » ; sinon, il indique simplement « Connecter le portefeuille. » +- À la ligne 17, nous affichons le message actuel stocké dans le contrat intelligent, qui est inclus dans la chaîne de caractères `message`. +- Aux lignes 23-26, nous utilisons un [composant contrôlé](https://reactjs.org/docs/forms.html#controlled-components) pour mettre à jour notre variable d'état `newMessage` lorsque l'entrée dans le champ de texte change. + +En plus de nos variables d'état, vous verrez également que les fonctions `connectWalletPressed` et `onUpdatePressed` sont appelées lorsque les boutons avec les ID `publishButton` et `walletButton` sont cliqués respectivement. + +Enfin, regardons où ce composant `HelloWorld.js` est ajouté. + +Si vous allez au fichier `App.js`, qui est le composant principal dans React qui sert de conteneur pour tous les autres composants, vous verrez que notre composant `HelloWorld.js` est injecté à la ligne 7. + +En dernier lieu, vérifions un autre fichier fourni pour vous, le fichier `interact.js`. + + + +#### Le fichier `interact.js` {#the-interact-js-file} + +Pour respecter le paradigme [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) , nous voulons un fichier séparé qui contient toutes nos fonctions pour gérer la logique, les données, et les règles de notre DApp, puis nous pourrons passer ces fonctions à notre interface \(notre composant `HelloWorld.js` \). + +👆🏽C'est exactement le but de notre fichier `interact.js` ! + +Naviguez vers le dossier `util` dans votre répertoire `src`, et vous remarquerez que nous avons inclus un fichier appelé `interact.js` qui contiendra toutes nos fonctions et variables d'interaction avec le contrat intelligent et le portefeuille. + + + +```javascript +// interact.js + +//export const helloWorldContract; + +export const loadCurrentMessage = async () => {} + +export const connectWallet = async () => {} + +const getCurrentWalletConnected = async () => {} + +export const updateMessage = async (message) => {} +``` + + +Vous remarquerez en haut du fichier que nous avons commenté l'objet `helloWorldContract`. Plus tard dans ce tutoriel, nous décommenterons cet objet et instancierons notre contrat intelligent dans cette variable, que nous exporterons ensuite dans notre composant `HelloWorld.js`. + +Les quatre fonctions non implémentées après notre objet `helloWorldContract` font ce qui suit : + +- `loadCurrentMessage` - cette fonction gère la logique du chargement du message actuel stocké dans le contrat intelligent. Elle effectuera un appel en _lecture_ au contrat intelligent Hello World en utilisant [l'API Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3). +- `connectWallet` - cette fonction connectera le portefeuille MetaMask de l'utilisateur à notre DApp. +- `getCurrentWalletConnected` - cette fonction vérifiera si un compte Ethereum est déjà connecté à notre DApp lors du chargement de la page et mettra à jour notre interface en conséquence. +- `updateMessage` - cette fonction mettra à jour le message stocké dans le contrat intelligent. Elle effectuera un appel en _écriture_ au contrat intelligent Hello World, donc le portefeuille MetaMask de l'utilisateur devra signer une transaction Ethereum pour mettre à jour le message. + +Maintenant que nous comprenons avec quoi nous travaillons, voyons comment lire notre contrat intelligent ! + + + +### Étape 3 : Lire à partir de votre contrat intelligent {#step-3-read-from-your-smart-contract} + +Pour lire à partir de votre contrat intelligent, vous devrez configurer correctement : + +- Une connexion API à la chaîne Ethereum +- Une instance chargée de votre contrat intelligent +- Une fonction pour appeler votre fonction de contrat intelligent +- Un écouteur pour surveiller les mises à jour lorsque les données que vous lisez du contrat intelligent changent + +Cela peut sembler beaucoup d'étapes, mais ne vous inquiétez pas ! Nous allons vous guider étape par étape ! :\) + + + +#### Établir une connexion API à la chaîne Ethereum {#establish-an-api-connection-to-the-ethereum-chain} + +Rappelez-vous, dans la Partie 2 de ce tutoriel, comment nous avons utilisé notre clé [Web3 Alchemy pour lire à partir de notre contrat intelligent](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library) ? Vous aurez également besoin d'une clé Web3 Alchemy dans votre DApp pour lire à partir de la chaîne. + +Si vous ne l'avez pas déjà fait, installez d'abord [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) en naviguant vers le répertoire racine de vos `starter-files` et en exécutant la commande suivante dans votre terminal : + + + +```text +npm install @alch/alchemy-web3 +``` + + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) est un wrapper autour de [Web3.js](https://docs.web3js.org/), fournissant des méthodes API améliorées et d'autres avantages pour faciliter votre vie en tant que développeur Web3. Il est conçu pour nécessiter une configuration minimale afin que vous puissiez commencer à l'utiliser immédiatement dans votre application ! + +Ensuite, installez le paquet [dotenv](https://www.npmjs.com/package/dotenv) dans le répertoire de votre projet, afin d'avoir un endroit sécurisé pour stocker notre clé API après l'avoir récupérée. + + + +```text +npm install dotenv --save +``` + + +Pour notre dapp, **nous utiliserons notre clé API Websockets** au lieu de notre clé API HTTP, car elle nous permettra d'écouteur pour détecter lorsque le message stocké dans le contrat intelligent change. + +Une fois que vous avez votre clé API, créez un fichier `.env` dans votre répertoire racine et ajoutez-y votre URL Websockets Alchemy. Ensuite, votre fichier `.env` devrait ressembler à cela : + + + +```javascript +REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/ +``` + + +Maintenant, nous sommes prêts à configurer notre point de terminaison Web3 Alchemy dans notre DApp ! Retournons à notre `interact.js`, qui est niché à l'intérieur de notre dossier `util` et ajoutons le code suivant en haut du fichier : + + + +```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; +``` + + +Ci-dessus, nous avons d'abord importé la clé Alchemy de notre fichier `.env`, puis nous avons passé notre `alchemyKey` à `createAlchemyWeb3` pour établir notre point de terminaison Web3 Alchemy. + +Avec ce point de terminaison prêt, il est temps de charger notre contrat intelligent Hello World ! + + + +#### Chargement de votre contrat intelligent Hello World {#loading-your-hello-world-smart-contract} + +Pour charger votre contrat intelligent Hello World, vous aurez besoin de son adresse de contrat et de son ABI, tous deux disponibles sur Etherscan si vous avez terminé [la Partie 3 de ce tutoriel.](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan) + + + +#### Comment obtenir votre ABI de contrat depuis Etherscan {#how-to-get-your-contract-abi-from-etherscan} + +Si vous avez ignoré la Partie 3 de ce tutoriel, vous pouvez utiliser le contrat HelloWorld avec l'adresse [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). Son ABI se trouve [ici](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). + +Un ABI de contrat est nécessaire pour spécifier quelle fonction un contrat invoquera et pour garantir que la fonction renverra des données dans le format que vous attendez. Une fois que nous avons copié notre ABI de contrat, sauvegardons-le en tant que fichier JSON appelé `contract-abi.json` dans votre répertoire `src`. + +Votre contract-abi.json doit être stocké dans votre dossier src. + +Armé de notre adresse de contrat, de notre ABI, et de notre point de terminaison Web3 Alchemy, nous pouvons utiliser [la méthode de contrat](https://docs.web3js.org/api/web3-eth-contract/class/Contract) pour charger une instance de notre contrat intelligent. Importez votre ABI de contrat dans le fichier `interact.js` et ajoutez votre adresse de contrat. + + + +```javascript +// interact.js + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" +``` + + +Nous pouvons maintenant enfin décommenter notre variable `helloWorldContract` et charger le contrat intelligent en utilisant notre point de terminaison AlchemyWeb3 : + + + +```javascript +// interact.js +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + + +Pour récapituler, les 12 premières lignes de votre `interact.js` devraient maintenant ressembler à ceci : + + + +```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 +) +``` + + +Maintenant que nous avons notre contrat chargé, nous pouvons implémenter notre fonction `loadCurrentMessage` ! + + + +#### Implémenter `loadCurrentMessage` dans votre fichier `interact.js` {#implementing-loadCurrentMessage-in-your-interact-js-file} + +Cette fonction est très simple. Nous allons effectuer un simple appel web3 asynchrone pour lire notre contrat. Notre fonction renverra le message stocké dans le contrat intelligent : + +Mettez à jour la fonction `loadCurrentMessage` dans votre fichier `interact.js` comme suit : + + + +```javascript +// interact.js + +export const loadCurrentMessage = async () => { + const message = await helloWorldContract.methods.message().call() + return message +} +``` + + +Puisque nous voulons afficher ce contrat intelligent dans notre interface utilisateur, mettons à jour la fonction `useEffect` dans notre composant `HelloWorld.js` comme suit : + + + +```javascript +// HelloWorld.js + +//called Orly once +useEffect(async () => { + const message = await loadCurrentMessage() + sertissage(message) +}, []) +``` + + +Notez que nous voulons que notre `loadCurrentMessage` soit appelé une seule fois lors du premier rendu du composant. Nous allons bientôt implémenter `addSmartContractListener` pour mettre à jour automatiquement l'interface utilisateur après la modification du message dans le contrat intelligent. + +Avant de plonger dans notre système d'écoute, voyons ce que nous avons jusqu'à présent ! Sauvegardez vos fichiers `HelloWorld.js` et `interact.js`, puis allez sur [http://localhost:3000/](http://localhost:3000/) + +Vous remarquerez que le message actuel ne dit plus « Pas de connexion au réseau. » Au lieu de cela, il reflète le message stocké dans le contrat intelligent. C'est fou ! + + + +#### Votre interface utilisateur devrait maintenant refléter le message stocké dans le contrat intelligent {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract} + +Maintenant, parlons de cet écouteur... + + + +#### Mettre en œuvre `addSmartContractListener` {#implement-addsmartcontractlistener} + +Si vous repensez au fichier `HelloWorld.sol` que nous avons écrit dans [la première partie de cette série de tutoriels](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract), vous vous souviendrez qu'il y a un événement de contrat intelligent appelé `UpdatedMessages` qui est émis après que la fonction `update` de notre contrat intelligent soit invoquée \(voir les lignes 9 et 27\) : + + + +```javascript +// HelloWorld.sol + +// Specifies the version of Solidity, using semantic versioning. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.3; + +// Defines a contract named `HelloWorld`. +// A contract is a collection of functions and data (its state). Once deployed, a contract resides at a specific address on the Ethereum blockchain. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Emitted when update function is called + //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. + event UpdatedMessages(string oldStr, string newStr); + + // Declares a state variable `message` of type `string`. + // State variables are variables whose values are permanently stored in contract storage. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + string public message; + + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Constructors are used to initialize the contract's data. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + message = initMessage; + } + + // A public function that accepts a string argument and updates the `message` storage variable. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + + +Les événements de contrat intelligent sont un moyen pour votre contrat d'indiquer qu'un événement s'est produit (c'est-à-dire qu'il y a eu un _événement_) sur la blockchain à votre application front-end, qui peut « écouter » des événements spécifiques et agir lorsqu'ils se produisent. + +La fonction `addSmartContractListener` va spécifiquement écouter l'événement `UpdatedMessages` de notre contrat intelligent Hello World et mettre à jour notre interface utilisateur pour afficher le nouveau message. + +Modifiez `addSmartContractListener` de la manière suivante : + + + +```javascript +// HelloWorld.js + +function addSmartContractListener() { + helloWorldContract.events.UpdatedMessages({}, (error, data) => { + if (error) { + setStatus("😥 " + error.message) + } else { + setMessage(data.returnValues[1]) + setNewMessage("") + setStatus("🎉 Your message has been updated!") + } + }) +} +``` + + +Décortiquons ce qui se passe lorsque l'écouteur détecte un événement : + +- Si une erreur se produit lorsque l'événement est émis, elle sera reflétée dans l'interface utilisateur via notre variable d'état `status`. +- Sinon, nous utiliserons l'objet `data` renvoyé. Le `data.returnValues` est un tableau indexé à zéro où le premier élément du tableau stocke le message précédent et le deuxième élément stocke le message mis à jour. En somme, lors d'un événement réussi, nous définirons notre chaîne de `message` sur le message mis à jour, effacerons la chaîne `newMessage` et mettrons à jour notre variable d'état `status` pour indiquer qu'un nouveau message a été publié sur notre contrat intelligent. + +Enfin, appelons notre écouteur dans notre fonction `useEffect` afin qu'il soit initialisé lors du premier rendu du composant `HelloWorld.js`. Dans l'ensemble, votre fonction `useEffect` devrait ressembler à ceci : + + + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() +}, []) +``` + + +Maintenant que nous sommes capables de lire notre contrat intelligent, il serait bien de savoir comment y écrire aussi ! Cependant, pour écrire sur notre dapp, nous devons d'abord avoir un portefeuille Ethereum connecté à celle-ci. + +Alors, ensuite, nous aborderons la configuration de notre portefeuille Ethereum (MetaMask) et sa connexion à notre dapp ! + + + +### Étape 4 : Configurez votre portefeuille Ethereum {#step-4-set-up-your-ethereum-wallet} + +Pour écrire quoi que ce soit sur la chaîne Ethereum, les utilisateurs doivent signer des transactions à l'aide des clés privées de leur portefeuille virtuel. Pour ce tutoriel, nous utiliserons [MetaMask](https://metamask.io/), un portefeuille virtuel dans le navigateur utilisé pour gérer votre adresse de compte Ethereum, car il rend cette signature de transaction très facile pour l'utilisateur final. + +Si vous voulez en savoir plus sur le fonctionnement des transactions sur Ethereum, consultez [cette page](/developers/docs/transactions/) de la fondation Ethereum. + + + +#### Téléchargez MetaMask {#download-metamask} + +Vous pouvez télécharger et créer un compte MetaMask gratuitement [ici](https://metamask.io/download.html). Lorsque vous créez un compte, ou si vous en avez déjà un, assurez-vous de basculer vers le « Goerli Test Network » en haut à droite \(afin que nous ne traitions pas avec de l'argent réel\). + + + +#### Ajoutez de l'ether depuis un Robinet {#add-ether-from-a-faucet} + +Pour signer une transaction sur la blockchain Ethereum, nous aurons besoin de faux Eth. Pour obtenir de l'Eth, vous pouvez aller sur [FaucETH](https://fauceth.komputing.org) et entrer votre adresse de compte Goerli, cliquer sur « Demander des fonds », puis sélectionner « Ethereum Testnet Goerli » dans le menu déroulant et enfin cliquer à nouveau sur le bouton « Demander des fonds ». Vous devriez voir les ETH dans votre compte MetaMask peu de temps après ! + + + +#### Vérifiez votre solde {#check-your-balance} + +Pour revérifier que votre solde est correct, faisons une requête [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) en utilisant [l'outil Alchemy Composer](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). Cela va retourner la quantité d'ETH que contient votre portefeuille. Après avoir entré l'adresse de votre compte MetaMask et cliqué sur « Send Request », vous devriez voir une réponse comme celle-ci : + + + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + + +**REMARQUE :** Ce résultat est en wei et non pas en ETH. Le wei est utilisé comme la plus petite dénomination d'ether. La conversion de wei vers eth est : 1 eth = 10¹⁸ wei. Donc si on convertit 0xde0b6b3a7640000 en nombre décimal, nous obtenons 1\*10¹⁸ ce qui correspond à 1 eth. + +Ouf ! Notre faux argent est bien là ! 🤑 + + + +### Étape 5 : Connectez MetaMask à votre interface utilisateur {#step-5-connect-metamask-to-your-UI} + +Maintenant que notre portefeuille MetaMask est configuré, connectons-y notre dApp ! + + + +#### La fonction `connectWallet` {#the-connectWallet-function} + +Dans notre fichier `interact.js`, implémentons la fonction `connectWallet`, que nous pourrons ensuite appeler dans notre composant `HelloWorld.js`. + +Modifions `connectWallet` comme suit : + + + +```javascript +// interact.js + +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Write a message in the text-field above.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

    +
    + ), + } + } +} +``` + + +Qu'est-ce que cet immense bloc de code fait exactement ? + +Eh bien, premièrement, il vérifie si `window.ethereum` est activé dans votre navigateur. + +`window.ethereum` est une API globale injectée par MetaMask et d'autres fournisseurs de portefeuille qui permet aux sites web de faire des requêtes vers les comptes Ethereum des utilisateurs. Si approuvé, il peut lire des données des blockchains auxquelles l'utilisateur est connecté et suggérer que l'utilisateur signe des messages et des transactions. Consultez la [documentation MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) pour plus d'infos ! + +Si `window.ethereum` _n'est pas_ présent, alors cela signifie que Metamask n'est pas installé. Cela se traduit par un objet JSON retourné, où l'attribut `adresse` retourné est une chaîne vide, et le `status` de l'objet JSX indique que l'utilisateur doit installer MetaMask. + +Maintenant, si `window.ethereum` _est présent_, alors c'est là que les choses deviennent intéressantes. + +À l'aide d'une boucle try/catch, nous essaierons de nous connecter à MetaMask en appelant[`window.ethereum.request({ method: "eth_requestAccounts" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts). L'appel de cette fonction ouvrira MetaMask dans le navigateur, où l'utilisateur sera invité à connecter son portefeuille à votre dApp. + +- Si l'utilisateur choisit de se connecter, `method: "eth_requestAccounts"` retournera un tableau contenant toutes les adresses de compte de l'utilisateur qui sont connectées à la DApp. Au final, notre fonction `connectWallet` retourne un objet JSON qui contient la _première_ `address` dans cette table \(voir ligne 9\\) et un message `status` qui invite l'utilisateur à écrire un message sur le contrat intelligent. +- Si l'utilisateur rejette la connexion, alors l'objet JSON contiendra une chaîne vide pour l'`address` retournée et un message `status` qui indique que l'utilisateur a rejeté la connexion. + +Maintenant que nous avons écrit cette fonction `connectWallet`, la prochaine étape est de l'appeler dans notre composant `HelloWorld.js`. + + + +#### Ajoutez la fonction `connectWallet` à votre composant UI `HelloWorld.js` {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component} + +Naviguez vers la fonction `connectWalletPressed` dans `HelloWorld.js`, et mettez-la à jour comme suit : + + + +```javascript +// HelloWorld.js + +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + + +Remarquez comment la plupart de nos fonctionnalités sont abstraites de notre composant `HelloWorld.js` à partir du fichier `interact.js` ? C'est ainsi que nous respectons le paradigme M-V-C ! + +Dans `connectWalletPressed`, nous faisons simplement un appel await à notre fonction importée `connectWallet`, et en utilisant sa réponse, nous mettons à jour nos variables `status` et `walletAddress` via leurs hooks d'états. + +Maintenant, sauvegardez les deux fichiers \(`HelloWorld.js` et `interact.js`\) et testez notre interface jusqu'à présent. + +Ouvrez votre navigateur sur la page [http://localhost:3000/](http://localhost:3000/), et appuyez sur le bouton « Connecter le portefeuille » en haut à droite de la page. + +Si MetaMask est installé, vous devriez être invité à connecter votre portefeuille à votre dApp. Accepter l'invitation à se connecter. + +Vous devriez voir que le bouton du portefeuille reflète maintenant le fait que votre adresse est connectée ! Incroyable 🔥 + +Ensuite, essayez de rafraîchir la page... c'est étrange. Notre bouton de portefeuille nous invite à connecter MetaMask bien qu'il soit déjà connecté... + +Mais n'ayez crainte ! Nous pouvons facilement résoudre cela (compris ?) en implémentant la fonction `getCurrentWalletConnected`, qui vérifiera si une adresse est déjà connectée à notre dapp et mettra à jour notre interface en conséquence ! + + + +#### La fonction `getCurrentWalletConnected` {#the-getcurrentwalletconnected-function} + +Mettez à jour votre fonction `getCurrentWalletConnected` dans le fichier `interact.js` comme suit : + + + +```javascript +// interact.js + +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 Write a message in the text-field above.", + } + } else { + return { + address: "", + status: "🦊 Connect to MetaMask using the top right button.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

    +
    + ), + } + } +} +``` + + +Ce code est _très_ similaire à la fonction `connectWallet` que nous venons d'écrire à l'étape précédente. + +La différence principale est qu'au lieu d'appeler la méthode `eth_requestAccounts`, qui ouvre MetaMask pour que l'utilisateur puisse connecter son portefeuille, ici nous appelons la méthode `eth_accounts`, qui renvoie simplement un tableau contenant les adresses MetaMask actuellement connectées à notre dApp. + +Pour voir cette fonction en action, appelons-la dans notre fonction `useEffect` de notre composant `HelloWorld.js` : + + + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + + +Remarquez que nous utilisons la réponse de notre appel à `getCurrentWalletConnected` pour mettre à jour nos variables d'état `walletAddress` et `status`. + +Maintenant que vous avez ajouté ce code, essayons de rafraîchir la fenêtre de notre navigateur. + +Magnifique ! Le bouton devrait indiquer que vous êtes connecté et afficher un aperçu de l'adresse de votre portefeuille connecté, même après avoir été actualisé ! + + + +#### Mettre en œuvre `addWalletListener` {#implement-addwalletlistener} + +La dernière étape de la configuration de notre dApp de portefeuille consiste à mettre en place le listener de portefeuille afin que notre interface utilisateur soit mise à jour lorsque l'état de notre portefeuille change, par exemple lorsque l'utilisateur se déconnecte ou change de compte. + +Dans votre fichier `HelloWorld.js`, modifiez votre fonction `addWalletListener` comme suit : + + + +```javascript +// HelloWorld.js + +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Write a message in the text-field above.") + } else { + setWallet("") + setStatus("🦊 Connect to MetaMask using the top right button.") + } + }) + } else { + setStatus( +

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

    + ) + } +} +``` + + +Je parie que vous n'avez même pas besoin de notre aide pour comprendre ce qui se passe ici à ce stade, mais pour des raisons de rigueur, décomposons rapidement : + +- Premièrement, notre fonction vérifie si `window.ethereum` est activé \(ex. : MetaMask est installé\). + - Si ce n'est pas le cas, nous fixons simplement notre variable d'état `status` à une chaîne de caractères JSX qui invite l'utilisateur à installer MetaMask. + - S'il est activé, nous configurons le listener `window.ethereum.on("accountsChanged")` à la ligne 3 qui écoute les changements d'état dans le portefeuille MetaMask, qui les incluent lorsque l'utilisateur connecte un compte additionnel à la dApp, change de compte ou déconnecte un compte. S'il existe au moins un compte connecté, la variable d'état `walletAddress` est mise à jour comme premier compte dans le tableau des comptes `accounts` retourné par l'écouteur. Sinon, `walletAdresse` est défini comme une chaîne de caractères vide. + +Enfin et surtout, nous devons l'appeler dans notre fonction `useEffect` : + + + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + + +Et voilà ! Nous avons réussi à programmer toute notre fonctionnalité de portefeuille ! Passons maintenant à notre dernière tâche : mettre à jour le message stocké dans notre contrat intelligent ! + + + +### Étape 6 : Implémentez la fonction `updateMessage` {#step-6-implement-the-updateMessage-function} + +Alright, nous sommes dans la dernière ligne droite ! Dans la fonction `updateMessage` de votre fichier `interact.js`, nous allons faire ce qui suit : + +1. Vérifiez que le message que nous souhaitons publier dans notre contrat intelligent est valide +2. Signez notre transaction à l'aide de MetaMask +3. Appelez cette fonction depuis notre composant d'interface `HelloWorld.js` + +Cela ne prendra pas très longtemps ; terminons cette dapp ! + + + +#### Gestion des erreurs d'entrée {#input-error-handling} + +Naturellement, il est logique de disposer d'une sorte de gestion des erreurs d'entrée au début de la fonction. + +Nous souhaitons que notre fonction se termine rapidement s'il n'y a pas d'extension MetaMask installée, si aucun portefeuille n'est connecté \(c'est-à-dire si l'`adresse` transmise est une chaîne vide) ou si le `message` est une chaîne vide. Ajoutons la gestion des erreurs suivante à `updateMessage` : + + + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + if (!window.ethereum || address === null) { + return { + status: + "💡 Connecter votre portefeuille MetaMask pour mettre à jour le message sur la blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Votre message ne peut pas être vide.", + } + } +} +``` + + +Maintenant que nous avons une gestion d'erreur d'entrée appropriée, il est temps de signer la transaction via MetaMask ! + + + +#### Signer notre transaction {#signing-our-transaction} + +Si vous êtes déjà à l'aise avec les transactions Ethereum web3 traditionnelles, le code que nous écrirons ensuite vous sera très familier. Sous votre code de gestion d'erreur d'entrée, ajoutez ce qui suit à `updateMessage` : + + + +```javascript +// interact.js + +//set up transaction parameters +const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: address, // must match user's active address. + data: helloWorldContract.methods.update(message).encodeABI(), +} + +//sign the transaction +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
    + ℹ️ Once the transaction is verified by the network, the message will be + updated automatically. +
    + ), + } +} catch (error) { + return { + status: "😥 " + error.message, + } +} +``` + + +Décortiquons ce qui se passe. Premièrement, nous configurons les paramètres de notre transaction, où : + +- `to` spécifie l'adresse du destinataire \(notre contrat intelligent) +- `from` spécifie le signataire de la transaction, la variable `adresse` que nous avons passée à notre fonction +- `data` contient l'appel à la méthode `update` de notre contrat Hello World, recevant notre variable de chaîne `message` en entrée + +Ensuite, nous faisons un appel en attente, `window.ethereum.request`, où nous demandons à MetaMask de signer la transaction. Remarquez que, aux lignes 11 et 12, nous spécifions notre méthode eth, `eth_sendTransaction` et passons nos `transactionParameters`. + +À ce stade, MetaMask s'ouvrira dans le navigateur, et demandera à l'utilisateur de signer ou rejeter la transaction. + +- Si la transaction réussit, la fonction renverra un objet JSON où la chaîne `status` du JSX invite l'utilisateur à consulter Etherscan pour plus d'informations sur sa transaction. +- Si la transaction échoue, la fonction renverra un objet JSON où la chaîne `status` relaie le message d'erreur. + +Dans l'ensemble, notre fonction `updateMessage` devrait ressembler à cela : + + + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + //input error handling + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } + + //set up transaction parameters + const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: address, // must match user's active address. + data: helloWorldContract.methods.update(message).encodeABI(), + } + + //sign the transaction + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
    + ℹ️ Once the transaction is verified by the network, the message will + be updated automatically. +
    + ), + } + } catch (error) { + return { + status: "😥 " + error.message, + } + } +} +``` + + +Enfin, nous devons connecter notre fonction `updateMessage` à notre composant `HelloWorld.js`. + + + +#### Connectez `updateMessage` à l'interface de `HelloWorld.js` {#connect-updatemessage-to-the-helloworld-js-frontend} + +Notre fonction `onUpdatePressed` devrait émettre un appel en attente à la fonction importée `updateMessage` et modifier la variable d'état `status` pour refléter si notre transaction a réussi ou échoué : + + + +```javascript +// HelloWorld.js + +const onUpdatePressed = async () => { + const { status } = await updateMessage(walletAddress, newMessage) + setStatus(status) +} +``` + + +C'est super propre et simple. Et devinez quoi... VOTRE DAPP EST TERMINÉE !!! + +Allez-y et testez le bouton **Update** ! + + + +### Créez votre propre DApp personnalisée {#make-your-own-custom-dapp} + +Wooooo, vous êtes arrivé à la fin du tutoriel ! Pour récapituler, vous avez appris à : + +- Connecter un portefeuille MetaMask à votre projet de dapp +- Lire les données de votre contrat intelligent en utilisant l'API [Web3 d'Alchemy](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) +- Signer des transactions Ethereum en utilisant MetaMask + +Maintenant, vous êtes pleinement équipé pour appliquer les compétences de ce tutoriel à la construction de votre propre projet de DApp personnalisé ! Comme toujours, si vous avez des questions, n'hésitez pas à nous demander de l'aide dans le [Discord d'Alchemy](https://discord.gg/gWuC7zB). 🧙‍♂️ + +Une fois ce tutoriel terminé, faites-nous savoir comment s'est passée votre expérience ou si vous avez des commentaires en nous identifiant sur Twitter [@alchemyplatform](https://twitter.com/AlchemyPlatform) ! diff --git a/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md index eb12a9c4d2e..8d0d61367d9 100644 --- a/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/hello-world-smart-contract/index.md @@ -15,6 +15,14 @@ published: 2021-03-31 Si vous débutez dans le développement de blockchain et ne savez pas par où commencer, ou si vous souhaitez uniquement comprendre comment déployer et interagir avec les contrats intelligents, ce guide est fait pour vous. Nous allons parcourir la création et le déploiement d'un contrat intelligent simple sur le réseau de test de Goerli à l'aide d'un portefeuille virtuel [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), et [Alchemy](https://alchemyapi.io/eth) (ne vous inquiétez pas si vous ne comprenez pas à ce stade ce que cela signifie, nous allons l'expliquer). +> **Avertissement ** +> +> 🚧 Avis de fin de support +> +> Tout au long de ce guide, le réseau de test Goerli est utilisé pour créer et déployer un contrat intelligent. Cependant, veuillez noter que l'Ethereum Foundation a annoncé que [Goerli sera bientôt obsolète](https://www.alchemy.com/blog/goerli-faucet-deprecation). +> +> Nous vous recommandons d'utiliser le [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) et le [distributeur sur Sepolia](https://sepoliafaucet.com/) pour ce tutoriel. + Dans la [partie 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) de ce tutoriel, nous allons voir comment nous pouvons interagir avec notre contrat intelligent une fois qu'il sera déployé ici, et dans la [partie 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) nous couvrirons comment le publier sur Etherscan. Si vous avez des questions à un moment ou à un autre, n'hésitez pas à en discuter sur le [Discord Alchemy](https://discord.gg/gWuC7zB)! @@ -58,8 +66,8 @@ Pour vérifier notre solde, faisons une requête [eth_getBalance](https://docs.a ``` > **REMARQUE :** Ce résultat est en wei et non pas en ETH. Le wei est utilisé comme la plus petite dénomination d'ether. La conversion de wei en ETH est : 1 eth = 1018 wei. Donc si nous convertissons 0x2B5E3AF16B1880000 en décimales, nous obtenons 5\*10¹⁸, ce qui équivaut à 5 ETH. -> -> Ouf ! Notre fausse monnaie est bien là . +> +> Ouf ! Notre fausse monnaie est bien là . ## Étape 6 : Initialisez notre projet {#step-6} @@ -230,7 +238,7 @@ PRIVATE_KEY = "your-metamask-private-key" Pour les relier à notre code, nous ferons référence à ces variables dans notre fichier `hardhat.config.js` à l'étape 13. - + Ne propagez pas le fichier .env ! Veillez à ne jamais partager ou exposer votre fichier .env avec quiconque car vous compromettez vos secrets en le faisant. Si vous utilisez le contrôle de version, ajoutez votre .env à un fichier gitignore. diff --git a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md new file mode 100644 index 00000000000..b756c45d627 --- /dev/null +++ b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -0,0 +1,110 @@ +--- +title: Démarrer le développement de votre interface dApp avec create-eth-app +description: Aperçu de l'utilisation de create-eth-app et de ses fonctionnalités +author: "Markus Waas" +tags: + - "create-eth-app" + - "frontend" + - "javascript" + - "ethers.js" + - "the graph" + - "DeFi" +skill: beginner +lang: fr +published: 2020-04-27 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/create-eth-app +--- + +La dernière fois nous nous sommes intéressés à [Solidity](https://soliditydeveloper.com/solidity-overview-2020) et avons mentionné [create-eth-app](https://github.com/PaulRBerg/create-eth-app). Vous allez maintenant découvrir comment l'utiliser, quelles fonctionnalités y sont intégrées et comment l'étendre encore. Initiée par Paul Razvan Berg, fondateur de [Sablier](http://sablier.com/), cette application livrée avec plusieurs intégrations facultatives au choix va vous permettre de débuter le développement de votre interface. + +## Installation {#installation} + +L'installation nécessite au minimum Yarn 0.25 (`npm install yarn --global`). L'installation est aussi simple que l'exécution : + +```bash +yarn create eth-app my-eth-app +cd my-eth-app +yarn react-app:start +``` + +Elle s'appuie sur [create-react-app](https://github.com/facebook/create-react-app). Pour voir votre application, ouvrez `http://localhost:3000/`. Lorsque vous êtes prêt à déployer en production, créez un paquet minifié avec le constructeur yarn. Un moyen simple de l'héberger est [Netlify](https://www.netlify.com/). Vous pouvez créer un dépôt GitHub, l'ajouter à Netlify, configurer la commande de construction et le tour est joué ! Votre application sera hébergée et utilisable par tout le monde. Et tout ceci gratuitement. + +## Fonctionnalités {#features} + +### React & create-react-app {#react--create-react-app} + +Premièrement, le coeur de l'application : React et toutes les fonctionnalités additionnelles livrées avec _create-react-app_. Utiliser cette seule application est une excellente option si vous ne souhaitez pas intégrer Ethereum. [React](https://reactjs.org/) rend la construction d'interfaces utilisateur interactives très facile. La prise en main n'est peut-être pas aussi facile qu'avec [Vue](https://vuejs.org/), mais l'application est encore largement utilisée, possède plus de fonctionnalités et surtout offre un choix de plusieurs milliers de bibliothèques supplémentaires. Avec _create-react-app_, le démarrage est très simple. L'application inclut : + +- React, JSX, ES6, TypeScript et le support pour Flow syntax. +- Langages complémentaires à ES6 comme l'opérateur de propagation d'objet. +- CSS auto-préfixé, pour se passer de -webkit- ou d'autres préfixes. +- Un exécuteur de test unitaire interactif rapide avec une prise en charge intégrée pour les rapports de couverture. +- Un serveur de développement en direct qui signale les erreurs courantes. +- Un script de construction pour associer du JS, du CSS et des images en vue de la mise en production, avec des hachages et une cartographie du code source. + +_create-react-app_, en particulier, fait usage des nouveaux [effets hooks](https://reactjs.org/docs/hooks-effect.html). Une méthode pour écrire de puissants mais très petits composants, dits fonctionnels. Voir ci-dessous la section sur Apollo pour savoir comment ils sont utilisés dans _create-react-app_. + +### Espaces de travail Yarn {#yarn-workspaces} + +[Les espaces de travail Yarn](https://classic.yarnpkg.com/en/docs/workspaces/) vous permettent de disposer de plusieurs paquets, mais également d'être en mesure de tous les gérer à partir du dossier racine et d'installer toutes leurs dépendances en une fois en utilisant `yarn install`. Ceci est particulièrement adapté pour les petits packs additionnels, tels que les adresses de contrats intelligents/la gestion ABI (les informations sur l'endroit où vous avez déployé tels contrats intelligents et comment communiquer avec eux) ou l'intégration de graphes, les deux parties de `create-eth-app`. + +### ethers.js {#ethersjs} + +Si [Web3](https://docs.web3js.org/) est encore largement utilisé, [ethers.js](https://docs.ethers.io/) a davantage été employé comme alternative l'année dernière et est intégré à _create-eth-app_. Vous pouvez travailler avec celui-ci, le faire évoluer vers Web3 ou envisager une mise à niveau pour passer à [ethers.js v5](https://docs-beta.ethers.io/) qui n'est pratiquement plus en version bêta. + +### Le réseau Graph {#the-graph} + +[GraphQL](https://graphql.org/) est un moyen alternatif de gérer les données par rapport à une [API Restful](https://restfulapi.net/). Il offre plusieurs avantages par rapport aux APIs REST, en particulier pour les données décentralisées de la blockchain. Si vous êtes intéressé par le raisonnement qui le sous-tend, jetez un œil à [GraphQL va propulser le Web décentralisé](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). + +Vous récupérez normalement directement les données de votre contrat intelligent. Vous souhaitez connaître l'instant précis de la dernière transaction ? Appelez simplement `MyContract.methods.latestTradeTime().call()` qui récupère les données d'un nœud Ethereum comme Infura dans votre dApp. Mais que faire si vous avez besoin de centaines de points de données différents ? Il en résulterait des centaines d'extractions de données vers le nœud, nécessitant à chaque fois un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) qui ralentirait votre dApp et lui ferait perdre son efficacité. Pour éviter cela, une solution pourrait être d'utiliser une fonction d'appel de récupération dans votre contrat qui restitue plusieurs données à la fois. Ce n'est cependant pas toujours idéal. + +Vous pourriez également être intéressé par les données historiques. Vous souhaitez peut-être connaître non seulement le moment de la dernière transaction mais également le moment de chacune des transactions que vous avez réalisées vous-même. Utilisez le paquet subgraph de _create-eth-app_, lisez la [documentation](https://thegraph.com/docs/define-a-subgraph) et adaptez-la à vos propres contrats. Si vous êtes à la recherche de contrats intelligents populaires, il se peut même qu'il en existe déjà un avec subgraph. Jetez un œil à [l'explorateur de sous-graphes](https://thegraph.com/explorer/). + +Une fois que vous disposez d'un subgraph, vous pouvez écrire une simple requête dans votre dApp afin de récupérer toutes les données importantes de la blockchain, y compris les données historiques dont vous avez besoin. Une seule demande de récupération suffit. + +### Apollo {#apollo} + +Grâce à l'intégration d'[Apollo Boost](https://www.apollographql.com/docs/react/get-started/), vous pouvez facilement intégrer Graph dans votre dApp React. Surtout lorsque vous utilisez [des hooks React et Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), récupérer des données est aussi simple que d'écrire une requête GraphQl dans votre composant: + +```js +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +## Modèles (Templates) {#templates} + +En haut, il est possible de choisir parmi différents modèles. À ce jour, vous pouvez utiliser une intégration Aave, Compound, UniSwap ou Sablier. Ces modèles ajoutent tous des adresses importantes de contrats intelligents de service ainsi que des intégrations pré-construites de subgraph. Il suffit d'ajouter le modèle à la commande de création comme `yarn create eth-app my-eth-app --with-template aav`. + +### Aave {#aave} + +[Aave](https://aave.com/) est un marché décentralisé de prêt d'argent. Les déposants fournissent des liquidités au marché pour gagner un revenu passif, tandis que les emprunteurs peuvent emprunter avec des garanties. Une fonctionnalité exclusive d'Aave réside dans ces [prêts flash](https://docs.aave.com/developers/guides/flash-loans) qui vous permettent d'emprunter de l'argent sans aucune garantie, pour autant que vous remboursiez le prêt en une seule transaction. Cela peut être utile par exemple pour vous donner de l'argent supplémentaire sur l'arbitrage d'échange. + +Les jetons échangés qui vous rapportent des intérêts sont appelés _aTokens_. + +Si vous choisissez d'intégrer Aave avec _create-eth-app_, vous obtiendrez une [intégration subgraph](https://docs.aave.com/developers/getting-started/using-graphql). Aave utilise The Graph et vous fournit déjà plusieurs Subgraphs prêts à l'emploi sur [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) et [le réseau principal](https://thegraph.com/explorer/subgraph/aave/protocol) en formulaire [brut](https://thegraph.com/explorer/subgraph/aave/protocol-raw) ou [formaté](https://thegraph.com/explorer/subgraph/aave/protocol). + +![Aave Flash Loan meme - "Ouah, si je pouvais garder mon prêt flash plus longtemps qu'une transaction, ce serait génial" ;](./flashloan-meme.png) + +### Compound {#compound} + +[Compound](https://compound.finance/) est similaire à Aave. L'intégration inclut déjà le nouveau [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Les intérêts gagnés des jetons sont ici étonnamment appelés _cTokens_. + +### Uniswap {#uniswap} + +[Uniswap](https://uniswap.exchange/) est un système d'échange décentralisé (DEX). Les fournisseurs de liquidités peuvent percevoir des commissions en fournissant les jetons ou l'éther requis pour les deux parties d'une transaction. Le protocole est largement utilisé et dispose donc de liquidités très nombreuses pour une très large gamme de jetons. Vous pouvez facilement l'intégrer dans votre dApp pour permettre, par exemple, aux utilisateurs d'échanger leur ETH contre du DAI. + +Malheureusement, à l'heure où ces lignes sont écrites, l'intégration est uniquement proposée pour Uniswap v1 et non pour la toute nouvelle version [v2](https://uniswap.org/blog/uniswap-v2/). + +### Sablier {#sablier} + +[Sablier](https://sablier.com/) permet aux utilisateurs d'effectuer des paiements en continu. Au lieu d'un seul versement, vous recevez en fait votre argent en continu sans avoir rien d'autre à faire après la mise en place initiale. L'intégration inclut son [propre sous-graphe](https://thegraph.com/explorer/subgraph/sablierhq/sablier). + +## Et après ? {#whats-next} + +Si vous avez des questions sur _create-eth-app_, allez sur le [serveur de la Communauté Sablier](https://discord.gg/bsS8T47), où vous pouvez entrer en contact avec les auteurs de _create-eth-app_. Dans un premier temps, vous pourriez vouloir intégrer un framework d'interface utilisateur comme [Material UI](https://material-ui.com/), écrire des requêtes GraphQL pour les données dont vous avez réellement besoin et configurer le déploiement. diff --git a/public/content/translations/fr/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/fr/developers/tutorials/logging-events-smart-contracts/index.md index 6f8a89afd02..63b9adf9e2d 100644 --- a/public/content/translations/fr/developers/tutorials/logging-events-smart-contracts/index.md +++ b/public/content/translations/fr/developers/tutorials/logging-events-smart-contracts/index.md @@ -7,7 +7,7 @@ tags: - "remix" - "solidity" - "événements" -skill: intermediate +skill: advanced lang: fr published: 2020-04-03 source: EthereumDev diff --git a/public/content/translations/fr/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/fr/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md new file mode 100644 index 00000000000..488ee1be62a --- /dev/null +++ b/public/content/translations/fr/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -0,0 +1,241 @@ +--- +title: Preuves de Merkle relatives à l'intégrité des données hors ligne +description: Assurer l'intégrité des données en chaîne pour les données stockées, principalement, hors chaîne +author: Ori Pomerantz +tags: + - "stockage" +skill: advanced +lang: fr +published: 2021-12-30 +--- + +## Introduction {#introduction} + +Idéalement, nous souhaiterions tout conserver dans le stockage Ethereum, qui est lui-même stocké sur des milliers d'ordinateurs et bénéficie ainsi d'une disponibilité extrêmement élevée (les données ne peuvent pas être censurées) et d'une grande intégrité (les données ne peuvent pas être modifiées de manière non autorisée) sachant, cependant, que stocker un mot de 32 octets coûte normalement 20 000 gaz. Ce que je vais écrire ici aurait un coût équivalent à 6,60 $. À 21 cents par octet, c'est trop cher pour beaucoup d'utilisations. + +Pour résoudre ce problème, l'écosystème Ethereum a développé [de nombreuses façons alternatives de stocker des données d'une manière décentralisée](/developers/docs/storage/). Habituellement, elles impliquent un compromis entre disponibilité et prix. Toutefois, l’intégrité est généralement assurée. + +Dans cet article, vous apprendrez **comment** assurer l'intégrité des données sans avoir à les stocker sur la blockchain, en utilisant [les preuves de Merkle](https://computersciencewiki.org/index.php/Merkle_proof). + +## Comment ça marche ? {#how-does-it-work} + +En théorie, nous pourrions simplement stocker le hachage des données de la chaîne et envoyer toutes les données dans les transactions qui en ont besoin. Cependant, cela reste encore trop cher. Un octet de données lors d'une transaction a un coût d'environ 16 gaz, soit environ un demi-cent actuellement ou environ 5 $ par kilo-octets. À 5 000 $ le mégaoctet, c'est encore trop cher pour de nombreuses utilisations même sans le coût supplémentaire de hachage des données. + +La solution est de hacher de façon répétée différents sous-ensembles de données. Pour les données que vous n'avez pas besoin d'envoyer, vous pouvez ainsi juste envoyer un hachage. Vous pouvez le faire en utilisant un arbre de Merkle, une structure de données en arborescence où chaque nœud est un hachage des nœuds en dessous : + +![Arbre de Merkle](tree.png) + +Le hachage racine est la seule partie qui doit être stockée dans la chaîne. Pour prouver une certaine valeur, vous fournissez tous les hachages qui doivent être combinés avec elle pour obtenir la racine. Par exemple, pour prouver `C` vous fournissez `D`, `H(A-B)`, et `H(E-H)`. + +![Preuve de la valeur de C](proof-c.png) + +## Implémentation {#implementation} + +[Le code échantillon est fourni ici](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). + +### Code hors chaîne {#off-chain-code} + +Dans cet article, nous utilisons JavaScript pour les calculs hors chaîne. La plupart des applications décentralisées ont leur composant hors chaîne en JavaScript. + +#### Création de la racine Merkle {#creating-the-merkle-root} + +Premièrement, nous devons apporter la racine Merkle à la chaîne. + +```javascript +const ethers = require("ethers") +``` + +[Nous utilisons la fonction de hachage du paquet ethers](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). + +```javascript +// The raw data whose integrity we have to verify. The first two bytes a +// are a user identifier, and the last two bytes the amount of tokens the +// user owns at present. +const dataArray = [ + 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, + 0xface0070, 0xbad00080, 0x060d0091, +] +``` + +Encoder chaque entrée sur un seul entier de 256 bits donne un code moins lisible que JSON, par exemple. Cependant, cela signifie un traitement beaucoup moins important pour récupérer les données contenues dans le contrat et ainsi, des frais de gaz moins élevés. [Vous pouvez lire le JSON sur la chaîne](https://github.com/chrisdotn/jsmnSol), c'est juste une mauvaise idée si celà peut-être évité. + +```javascript +// The array of hash values, as BigInts +const hashArray = dataArray +``` + +Dans notre cas et pour commencer, nos données ont une valeur de 256 bits. Ainsi, aucun traitement n'est nécessaire. Si nous utilisons une structure de données plus compliquée, comme des chaînes de caractères, nous devons nous assurer de d'abord hacher les données pour obtenir un tableau de hachages. Notez que c'est aussi parce que nous ne nous soucions pas de savoir que les utilisateurs connaissent les informations des autres utilisateurs. Sinon, nous aurions dû réaliser un hachage de sorte que l'utilisateur 1 ne connaisse pas la valeur pour l'utilisateur 0, que l'utilisateur 2 ne connaisse pas la valeur pour l'utilisateur 3, etc. + +```javascript +// Convert between the string the hash function expects and the +// BigInt we use everywhere else. +const hash = (x) => + BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) +``` + +La fonction de hachage des ethers s'attend à recevoir une chaîne JavaScript avec un nombre hexadécimal, tel que `0x60A7` et renvoie une autre chaîne de structure identique. Cependant, pour le reste du code, il est plus facile d'utiliser `BigInt` ainsi, nous convertissons en une chaîne hexadécimale et inversement. + +```javascript +// Symmetrical hash of a pair so we won't care if the order is reversed. +const pairHash = (a, b) => hash(hash(a) ^ hash(b)) +``` + +Cette fonction est symétrique (hachage d'un [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Cela signifie que lorsque nous vérifions la preuve de Merkle, nous n'avons pas à nous soucier de savoir s'il faut mettre la valeur de la preuve avant ou après la valeur calculée. C'est ainsi que l'on vérifie la preuve de Merkle, donc moins nous devons le faire, mieux ce sera. + +Attention : La cryptographie est plus complexe qu'il n'y paraît. La version initiale de cet article avait la fonction de hachage `hash(a^b)`. C'était une **mauvaise** idée car cela signifiait que si vous connaissiez les valeurs légitimes de `a` et `b` vous pouviez utiliser `b' = a^b^a` pour prouver la valeur désirée `a'`. Avec cette fonction, vous devriez calculer `b'` de telle sorte que `hash(a') ^ hash(b')` soit égal à une valeur connue (la prochaine branche sur le chemin vers la racine), ce qui est beaucoup plus difficile. + +```javascript +// The value to denote that a certain branch is empty, doesn't +// have a value +const empty = 0n +``` + +Lorsque le nombre de valeurs n'est pas un nombre entier à deux chiffres, nous devons gérer les branches vides. Pour ce faire, le programme va mettre un zéro à la place. + +![Arbre de Merkle avec branches manquantes](merkle-empty-hash.png) + +```javascript +// Calculate one level up the tree of a hash array by taking the hash of +// each pair in sequence +const oneLevelUp = (inputArray) => { + var result = [] + var inp = [...inputArray] // To avoid over writing the input // Add an empty value if necessary (we need all the leaves to be // paired) + + 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 +``` + +Cette fonction « escalade » un niveau dans l'arbre de Merkle en hachant les paires de valeurs de la couche actuelle. Notez que ce n'est pas l'implémentation la plus efficace, nous aurions pu éviter de copier l'entrée et juste ajouter `hashEmpty` lorsque cela est approprié dans la boucle, mais ce code est optimisé pour être plus lisible. + +```javascript +const getMerkleRoot = (inputArray) => { + var result + + result = [...inputArray] // Climb up the tree until there is only one value, that is the // root. // // If a layer has an odd number of entries the // code in oneLevelUp adds an empty value, so if we have, for example, // 10 leaves we'll have 5 branches in the second layer, 3 // branches in the third, 2 in the fourth and the root is the fifth + + while (result.length > 1) result = oneLevelUp(result) + + return result[0] +} +``` + +Pour obtenir la racine, escaladez jusqu'à ce qu'il ne reste qu'une seule valeur. + +#### Créer une preuve de Merkle {#creating-a-merkle-proof} + +Une preuve de Merkle est l'ensemble des valeurs à hacher ensemble avec la valeur prouvée pour récupérer la racine de Merkle. La valeur à prouver est souvent disponible à partir d'autres données. Je préfère ainsi la fournir séparément plutôt que dans le cadre du code. + +```javascript +// A merkle proof consists of the value of the list of entries to +// hash with. Because we use a symmetrical hash function, we don't +// need the item's location to verify the proof, only to create it +const getMerkleProof = (inputArray, n) => { +    var result = [], currentLayer = [...inputArray], currentN = n + +    // Until we reach the top +    while (currentLayer.length > 1) { +        // No odd length layers +        if (currentLayer.length % 2) +            currentLayer.push(empty) + +        result.push(currentN % 2 +               // If currentN is odd, add with the value before it to the proof +            ? currentLayer[currentN-1] +               // If it is even, add the value after it +            : currentLayer[currentN+1]) + +``` + +Nous hachons `(v[0],v[1])`, `(v[2],v[3])`, etc. Ainsi, pour les valeurs uniques, nous avons besoin de la suivante, pour les valeurs impaires de la précédente. + +```javascript +        // Move to the next layer up +        currentN = Math.floor(currentN/2) +        currentLayer = oneLevelUp(currentLayer) +    }   // while currentLayer.length > 1 + +    return result +}   // getMerkleProof +``` + +### Code en chaîne {#on-chain-code} + +Enfin, nous avons le code qui vérifie la preuve. Le code en chaîne est écrit en [Solidity](https://docs.soliditylang.org/en/v0.8.11/). L'optimisation est beaucoup plus importante ici parce que les frais en gaz sont relativement élevés. + +```solidity +//SPDX-License-Identifier: Public Domain +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; +``` + +J'ai écrit ceci en utilisant l'environnement de développement [Hardhat](https://hardhat.org/) qui nous permet d'avoir [une sortie console de Solidity](https://hardhat.org/tutorial/debugging-with-hardhat-network.html) durant le développement. + +```solidity + +contract MerkleProof { +    uint merkleRoot; + +    function getRoot() public view returns (uint) { +      return merkleRoot; +    } + +    // Extremely insecure, in production code access to +    // this function MUST BE strictly limited, probably to an +    // owner +    function setRoot(uint _merkleRoot) external { +      merkleRoot = _merkleRoot; +    }   // setRoot +``` + +Définissez et obtenez des fonctions pour la racine de Merkle. Laisser tout le monde mettre à jour la racine de Merkle est une _très mauvaise idée_ dans un système en production. Je le fais ici par souci de simplicité pour l'exemple de code. **Ne le faites pas sur un système où l'intégrité des données importe réellement**. + +```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)); +    } +``` + +Cette fonction génère un hachage de la paire. Il s'agit juste de la traduction en Solidity du code JavaScript pour `hash` et `pairHash`. + +**Remarque :** Ceci est un autre exemple d'optimisation pour une meilleure lisibilité. Si l'on s'en tient à [la définition de la fonction](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm), il est possible de stocker les données sous la forme d'une valeur [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) et d'éviter les conversions. + +```solidity +    // Verify a Merkle proof +    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 +``` + +En notation mathématique, la vérification par la preuve de Merkle ressemble à ceci : `H(proof_n, H(proof_n-1, H(proof_n-2, ... H(proof_1, H(proof_0, value))...)))`. Ce code l'implémente. + +## Les preuves de Merkle et les rollups ne font pas bon ménage {#merkle-proofs-and-rollups} + +Les preuves de Merkle ne fonctionnent pas bien avec les [rollups](/developers/docs/scaling/#rollups). La raison en est que les rollups écrivent toutes les données de transaction sur L1, mais le processus sur L2. Le coût d'envoi d'une preuve Merkle avec une transaction est en moyenne de 638 gaz par couche (actuellement, un octet de données d'appel coûte 16 gaz s'il n'est pas nul, et 4 s'il est nul). Si nous avons 1 024 mots de données, une preuve de Merkle nécessite dix couches, soit un total de 6 380 gaz. + +En cherchant un exemple avec [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m), écrire du gaz en L1 coûte environ 100 gwei et le gaz en L2 coûte 0,001 gwei (c'est le prix normal, il peut augmenter s'il y a congestion). Ainsi, pour le coût d'un gaz L1, nous pouvons dépenser cent mille gaz pour le traitement L2. En supposant que nous n'ayons pas écrasé le stockage, cela signifie que nous pouvons écrire environ cinq mots à stocker sur L2 pour le prix d'un gaz L1. Pour une seule preuve de Merkle, nous pouvons écrire l'intégralité des 1 024 mots sur le stockage (en supposant qu'ils peuvent être calculés sur la chaîne pour commencer, au lieu d'être fourni dans une transaction) et disposons toujours de la majeure partie du gaz restant. + +## Conclusion {#conclusion} + +Dans la vie réelle, il se peut que vous n'ayez jamais à implémenter d'arbres de Merkle par vous-même. Il existe des bibliothèques bien connues et auditées que vous pouvez utiliser et, en général, il est préférable de ne pas implémenter des primitives cryptographiques par vous-même. Cependant, j'espère que, maintenant, vous comprendrez mieux les preuves de Merkle et que vous pourrez décider quand elles valent la peine d'être utilisées. + +Notez que bien que les preuves de Merkle préservent _l'intégrité_, elles ne préservent pas _la disponibilité_. Savoir que personne d'autre ne peut se saisir de vos actifs est une petite consolation si le stockage de données décide d'en interdire l'accès et que vous ne pouvez pas non plus construire un arbre de Merkle pour y accéder. Ainsi, les arbres de Merkle sont mieux utilisés avec un type de stockage décentralisé, comme IPFS. diff --git a/public/content/translations/fr/developers/tutorials/nft-minter/index.md b/public/content/translations/fr/developers/tutorials/nft-minter/index.md index 09301561212..f343496b542 100644 --- a/public/content/translations/fr/developers/tutorials/nft-minter/index.md +++ b/public/content/translations/fr/developers/tutorials/nft-minter/index.md @@ -477,7 +477,7 @@ Le texte des champs « Lien vers l'actif », « Nom » et « Description » comp Pour stocker nos métadonnées sur IPFS, nous allons utiliser [Pinata](https://pinata.cloud/), une API et une boîte à outils IPFS très pratique. Dans l'étape suivante, nous vous expliquerons exactement comment faire ! -## Utiliser Pintata pour épingler vos métadonnées sur IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} +## Utiliser Pinata pour épingler vos métadonnées sur IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} Si vous n'avez pas de compte [Pinata](https://pinata.cloud/), créez-vous un compte gratuit [ici](https://pinata.cloud/signup) et suivez les étapes pour vérifier votre mail et votre compte. diff --git a/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md index c9a364ed833..d2035627a96 100644 --- a/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/reverse-engineering-a-contract/index.md @@ -47,7 +47,7 @@ Nous avons besoin de cette fonction pour nous donner la valeur hexadécimale car Les contrats sont toujours exécutés à partir du premier octet. Ceci est la première partie du code : | Décalage | Opcode | Pile (après le code d'opération) | -| -------: | ------------ | -------------------------------- | +| --------:| ------------ | -------------------------------- | | 0 | PUSH1 0x80 | 0x80 | | 2 | PUSH1 0x40 | 0x40, 0x80 | | 4 | MSTORE | Vide | @@ -67,7 +67,7 @@ Ce code fait deux choses : ### Le Gestionnaire à 0x5E (pour les données d'appel non-ABI) {#the-handler-at-0x5e-for-non-abi-call-data} | Décalage | Opcode | -| -------: | ------------ | +| --------:| ------------ | | 5E | JUMPDEST | | 5F | CALLDATASIZE | | 60 | PUSH2 0x007c | @@ -75,14 +75,14 @@ Ce code fait deux choses : Ce snippet commence avec un `JUMPDEST`. Les programmes EVM (machine virtuelle Ethereum) lèvent une exception si l'on saute à un code d'opération qui n'est pas `JUMPDEST`. Puis, il vérifie le CALLDATASIZE et si c'est « true » (c'est-à-dire, si ce n'est pas zéro), il saute à 0x7C. Nous verrons ça ci-dessous. -| Décalage | Opcode | Pile (après l'opcode) | -| -------: | ---------- | -------------------------------------------------------------------------------------------------- | -| 64 | CALLVALUE | [Wei](https://ethereum.org/fr/glossary/#weii) fourni par l'appel. Appelé `msg.value` dans Solidity | -| 65 | PUSH1 0x06 | 6 CALLVALUE | -| 67 | PUSH1 0x00 | 0 6 CALLVALUE | -| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | -| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | -| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | +| Décalage | Opcode | Pile (après l'opcode) | +| --------:| ---------- | -------------------------------------------------------------------------- | +| 64 | CALLVALUE | [Wei](/glossary/#wei) fourni par l'appel. Appelé `msg.value` dans Solidity | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | Ainsi, lorsqu'il n'y a pas de données d'appel, nous lisons la valeur de Stockage[6]. Nous ne savons pas encore quelle est cette valeur, mais nous pouvons rechercher les transactions que le contrat a reçues sans aucune donnée d'appel. Les transactions qui transfèrent juste de l'ETH sans aucune donnée d'appel (et donc aucune méthode) disposent de la méthode `Transfer` dans Etherscan. En fait, [la toute première transaction reçue par le contrat](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) est un transfert. @@ -94,20 +94,20 @@ Ensuite, cliquez sur l'onglet **State** et développez le contrat que nous rétr ![Le changement dans Stockage[6]](storage6.png) -Si nous regardons dans les changements d'état causés par [d'autres transactions `Transfer` de la même période](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) nous voyons que `Storage[6]` a suivi la valeur du contrat pendant un certain temps. Pour le moment, nous l'appellerons `Valeur*`. L'astérisque (`*`) nous rappelle que nous ne _savons_ pas ce que cette variable fait pour le moment, mais ça ne peut pas être simplement de tracer la valeur du contrat parce qu'il n'y a pas besoin d'utiliser le stockage, qui est très cher, quand vous pouvez obtenir le solde de vos comptes à l'aide de `ADDRESS BALANCE`. Le premier code d'opérations dévoile la propre adresse du contrat. Le deuxième lit l'adresse en haut de la pile et la remplace par le solde de cette adresse. +Si nous regardons dans les changements d'état causés par [d'autres transactions `Transfer` de la même période](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) nous voyons que `Storage[6]` a suivi la valeur du contrat pendant un certain temps. Pour le moment, nous l'appellerons `Valeur*`. L'astérisque (`*`) nous rappelle que nous ne _savons_ pas ce que cette variable fait pour le moment, mais ça ne peut pas être simplement de tracer la valeur du contrat parce qu'il n'y a pas besoin d'utiliser le stockage, qui est très cher, quand vous pouvez obtenir le solde de vos comptes à l'aide de `ADDRESS BALANCE`. Le premier code d'opérations dévoile la propre adresse du contrat. Le deuxième lit l'adresse en haut de la pile et la remplace par le solde de cette adresse. -| Décalage | Opcode | Pile | -| -------: | ------------ | ------------------------------------------- | +| Décalage | Opcode | Pile | +| --------:| ------------ | --------------------------------------------- | | 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE | | 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE | | 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE | -| 74 | JUMP | | +| 74 | JUMP | | Nous continuerons à tracer ce code à la destination du saut. -| Décalage | Opcode | Pile | -| -------: | ---------- | ----------------------------------------------------------- | +| Décalage | Opcode | Pile | +| --------:| ---------- | ------------------------------------------------------------- | | 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | @@ -115,39 +115,39 @@ Nous continuerons à tracer ce code à la destination du saut. Le `NOT` est au niveau des bits donc il inverse la valeur de chaque bit dans la valeur d'appel. -| Décalage | Opcode | Pile | -| -------: | ------------ | --------------------------------------------------------------------------- | +| Décalage | Opcode | Pile | +| --------:| ------------ | ------------------------------------------------------------------------------- | | 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AE | ISZERO | Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1AF | PUSH2 0x01df | 0x01DF Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | -| 1B2 | JUMPI | | +| 1B2 | JUMPI | | On saute si `Value*` est inférieure à 2^256-CALLVALUE-1 ou égale à celle-ci. Cela ressemble à une logique pour éviter les dépassements. Et en effet, nous voyons qu'après quelques opérations absurdes (écrire en mémoire est sur le point d'être supprimé, par exemple) au décalage 0x01DE, le contrat annule si le dépassement est détecté, ce qui est le comportement normal. Notez qu'un tel dépassement est extrêmement improbable, parce qu'il nécessiterait une valeur d'appel et `Value*` d'être d'un ordre de grandeur de 2^256 wei, environ 10^59 ETH. [L'offre d'ETH total, au moment ou l'on écrit ceci, est inférieur à deux cents millions](https://etherscan.io/stat/supply). -| Décalage | Opcode | Pile | -| -------: | -------- | ----------------------------------------- | +| Décalage | Opcode | Pile | +| --------:| -------- | ------------------------------------------- | | 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE | | 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE | | 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE | -| 1E3 | JUMP | | +| 1E3 | JUMP | | Si nous sommes arrivés ici, obtenons `Value* + CALLVALUE` et sautons au décalage 0x75. -| Décalage | Opcode | Pile | -| -------: | -------- | ------------------------------- | +| Décalage | Opcode | Pile | +| --------:| -------- | --------------------------------- | | 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE | | 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE | | 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE | -| 78 | SSTORE | 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | Si nous arrivons ici (ce qui nécessite que les données d'appel soient vides), nous ajoutons à `Value*` la valeur d'appel. Ceci est cohérent avec ce que nous disons sur ce que les transactions `Transfer` font. | Décalage | Opcode | -| -------: | ------ | +| --------:| ------ | | 79 | POP | | 7A | POP | | 7B | STOP | @@ -168,7 +168,7 @@ Nous arrivons ici de plusieurs façons : - Si la signature de la méthode est inconnue (à partir des décalages 0x42 et 0x5D) | Décalage | Opcode | Pile | -| -------: | ------------ | -------------------- | +| --------:| ------------ | -------------------- | | 7C | JUMPDEST | | | 7D | PUSH1 0x00 | 0x00 | | 7F | PUSH2 0x009d | 0x9D 0x00 | @@ -178,21 +178,21 @@ Nous arrivons ici de plusieurs façons : Il s'agit d'une autre cellule de stockage, une cellule que je n'ai pas trouvée dans aucune transaction, donc il est plus difficile de savoir ce que cela signifie. Le code ci-dessous clarifiera la question. | Décalage | Opcode | Pile | -| -------: | ------------------------------------------------- | ------------------------------- | +| --------:| ------------------------------------------------- | ------------------------------- | | 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | | 9A | AND | Storage[3]-as-address 0x9D 0x00 | Ces codes d'opération tronquent la valeur que nous lisons de Stockage[3] à 160 bits, la longueur d'une adresse Ethereum. | Décalage | Opcode | Pile | -| -------: | ------ | ------------------------------- | +| --------:| ------ | ------------------------------- | | 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | | 9C | JUMP | Storage[3]-as-address 0x00 | Ce saut est superflu puisque nous allons au prochain code d'opérations. Ce code n'est pas aussi efficace en gaz qu'il pourrait l'être. | Décalage | Opcode | Pile | -| -------: | ---------- | ------------------------------- | +| --------:| ---------- | ------------------------------- | | 9D | JUMPDEST | Storage[3]-as-address 0x00 | | 9E | SWAP1 | 0x00 Storage[3]-as-address | | 9F | POP | Storage[3]-as-address | @@ -202,7 +202,7 @@ Ce saut est superflu puisque nous allons au prochain code d'opérations. Ce code Au tout début du code, nous définissons Mem[0x40] à 0x80. Si nous cherchons 0x40 plus tard, nous voyons que nous ne le changeons pas - nous pouvons donc supposer qu'il est 0x80. | Décalage | Opcode | Pile | -| -------: | ------------ | ------------------------------------------------- | +| --------:| ------------ | ------------------------------------------------- | | A3 | CALLDATASIZE | CALLDATASIZE 0x80 Storage[3]-as-address | | A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | | A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | @@ -211,7 +211,7 @@ Au tout début du code, nous définissons Mem[0x40] à 0x80. Si nous cherchons 0 Copiez toutes les données d'appel en mémoire, à partir de 0x80. | Décalage | Opcode | Pile | -| -------: | ------------- | -------------------------------------------------------------------------------- | +| --------:| ------------- | -------------------------------------------------------------------------------- | | A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address | | AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address | | AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | @@ -228,7 +228,7 @@ Les choses sont maintenant beaucoup plus claires. Ce contrat peut agir comme un - _Données de retour_ : Aucune (0x00 - 0x00), nous allons obtenir les données de retour par d'autres moyens (voir ci-dessous) | Décalage | Opcode | Pile | -| -------: | -------------- | --------------------------------------------------------------------------------------------- | +| --------:| -------------- | --------------------------------------------------------------------------------------------- | | B0 | RETURNDATASIZE | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | | B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | | B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | @@ -238,7 +238,7 @@ Les choses sont maintenant beaucoup plus claires. Ce contrat peut agir comme un Ici, nous copions toutes les données retournées dans le tampon de mémoire à partir de 0x80. | Décalage | Opcode | Pile | -| -------: | ------------ | ---------------------------------------------------------------------------------------------------------------------------- | +| --------:| ------------ | ---------------------------------------------------------------------------------------------------------------------------- | | B6 | DUP2 | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | | B7 | DUP1 | (((call success/failure))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | | B8 | ISZERO | (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | @@ -255,7 +255,7 @@ Donc, après l'appel, nous copions les données retournées dans le tampon 0x80 Si nous arrivons ici, à 0xC0, cela signifie que le contrat que nous avons appelé a annulé son exécution. Étant donné que nous ne sommes qu'un proxy pour ce contrat, nous voulons retourner les mêmes données et annuler également. | Décalage | Opcode | Pile | -| -------: | -------- | ------------------------------------------------------------------------------------------------------------------- | +| --------:| -------- | ------------------------------------------------------------------------------------------------------------------- | | C0 | JUMPDEST | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | | C1 | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | | C2 | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | @@ -270,7 +270,7 @@ Donc nous annulons `REVERT` avec le même tampon que nous avons utilisé pour `R Si la taille des données de l'appel est de quatre octets ou plus, il peut s'agir d'un appel ABI valide. | Décalage | Opcode | Pile | -| -------: | ------------ | ------------------------------------------------- | +| --------:| ------------ | ------------------------------------------------- | | D | PUSH1 0x00 | 0x00 | | F | CALLDATALOAD | (((First word (256 bits) of the call data))) | | 10 | PUSH1 0xe0 | 0xE0 (((First word (256 bits) of the call data))) | @@ -279,7 +279,7 @@ Si la taille des données de l'appel est de quatre octets ou plus, il peut s'agi Etherscan nous dit que `1C` est un code d'opération inconnu, parce qu'[il a été ajouté après que Etherscan ait écrit cette fonctionnalité](https://eips.ethereum.org/EIPS/eip-145) et qu'ils ne l'ont pas mise à jour. Un [tableau d'opcode à jour](https://github.com/wolflo/evm-opcodes) nous montre que c'est un décalage à droite | Décalage | Opcode | Pile | -| -------: | ---------------- | -------------------------------------------------------------------------------------------------------- | +| --------:| ---------------- | -------------------------------------------------------------------------------------------------------- | | 13 | DUP1 | (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | | 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | | 19 | GT | 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | @@ -303,7 +303,7 @@ Si aucune correspondance n'est trouvée, le code saute vers [le gestionnaire de ## splitter() {#splitter} | Décalage | Opcode | Pile | -| -------: | ------------ | ----------------------------- | +| --------:| ------------ | ----------------------------- | | 103 | JUMPDEST | | | 104 | CALLVALUE | CALLVALUE | | 105 | DUP1 | CALLVALUE CALLVALUE | @@ -317,7 +317,7 @@ Si aucune correspondance n'est trouvée, le code saute vers [le gestionnaire de La première chose que fait cette fonction est de vérifier que l'appel n'a pas envoyé d'ETH. Cette fonction n'est pas [`payable`](https://solidity-by-example.org/payable/). Si quelqu'un nous a envoyé des ETH, cela doit être une erreur et nous voulons `REVERT` pour éviter d'avoir cet ETH où il ne peut le récupérer. | Décalage | Opcode | Pile | -| -------: | ------------------------------------------------- | --------------------------------------------------------------------------- | +| --------:| ------------------------------------------------- | --------------------------------------------------------------------------- | | 10F | JUMPDEST | | | 110 | POP | | | 111 | PUSH1 0x03 | 0x03 | @@ -334,7 +334,7 @@ La première chose que fait cette fonction est de vérifier que l'appel n'a pas Et 0x80 contient maintenant l'adresse du proxy | Décalage | Opcode | Pile | -| -------: | ------------ | --------- | +| --------:| ------------ | --------- | | 131 | PUSH1 0x20 | 0x20 0x80 | | 133 | ADD | 0xA0 | | 134 | PUSH2 0x00e4 | 0xE4 0xA0 | @@ -345,7 +345,7 @@ Et 0x80 contient maintenant l'adresse du proxy C'est la première fois que nous voyons ces lignes, mais elles sont partagées avec d'autres méthodes (voir ci-dessous). Nous allons donc appeler la valeur dans la pile X, et n'oubliez pas que dans la fonction `splitter()` la valeur de ce X est 0xA0. | Décalage | Opcode | Pile | -| -------: | ---------- | ----------- | +| --------:| ---------- | ----------- | | E4 | JUMPDEST | X | | E5 | PUSH1 0x40 | 0x40 X | | E7 | MLOAD | 0x80 X | @@ -364,7 +364,7 @@ Dans le cas de `splitter()`, ceci retourne l'adresse pour laquelle nous sommes u Le code aux décalages 0x158-0x163 est identique à ce que nous avons vu en 0x103-0x10E dans `splitter()` (autre que la destination `JUMPI`), donc nous savons que `currentWindow()` n'est pas `payable` non plus. | Décalage | Opcode | Pile | -| -------: | ------------ | -------------------- | +| --------:| ------------ | -------------------- | | 164 | JUMPDEST | | | 165 | POP | | | 166 | PUSH2 0x00da | 0xDA | @@ -378,7 +378,7 @@ Le code aux décalages 0x158-0x163 est identique à ce que nous avons vu en 0x10 Ce code est aussi partagé avec d'autres méthodes. Nous allons donc appeler la valeur dans la pile Y, et n'oubliez pas que dans la fonction `currentWindow()` la valeur de ce Y est Stockage[1]. | Décalage | Opcode | Pile | -| -------: | ---------- | ---------------- | +| --------:| ---------- | ---------------- | | DA | JUMPDEST | Y 0xDA | | DB | PUSH1 0x40 | 0x40 Y 0xDA | | DD | MLOAD | 0x80 Y 0xDA | @@ -389,7 +389,7 @@ Ce code est aussi partagé avec d'autres méthodes. Nous allons donc appeler la Écrire Y à 0x80-0x9F. | Décalage | Opcode | Pile | -| -------: | ---------- | -------------- | +| --------:| ---------- | -------------- | | E1 | PUSH1 0x20 | 0x20 0x80 0xDA | | E3 | ADD | 0xA0 0xDA | @@ -400,7 +400,7 @@ Et le reste est déjà expliqué [au-dessus](#the-e4-code). Donc les sauts à 0x Le code aux décalages 0xED-0xF8 est identique à ce que nous avons vu en 0x103-0x10E dans `splitter()` (autre que la destination `JUMPI`), donc nous savons que `merkleRoot()` n'est pas `payable` non plus. | Décalage | Opcode | Pile | -| -------: | ------------ | -------------------- | +| --------:| ------------ | -------------------- | | F9 | JUMPDEST | | | FA | POP | | | FB | PUSH2 0x00da | 0xDA | @@ -416,7 +416,7 @@ Le code aux décalages 0xED-0xF8 est identique à ce que nous avons vu en 0x103- Le code aux décalages 0x138-0x143 est identique à ce que nous avons vu en 0x103-0x10E dans `splitter()` (autre que la destination `JUMPI`), donc nous savons que cette fonction n'est pas `payable` non plus. | Décalage | Opcode | Pile | -| -------: | ------------ | ------------------------------------------------------------ | +| --------:| ------------ | ------------------------------------------------------------ | | 144 | JUMPDEST | | | 145 | POP | | | 146 | PUSH2 0x00da | 0xDA | @@ -439,7 +439,7 @@ Le code aux décalages 0x138-0x143 est identique à ce que nous avons vu en 0x10 Il semblerait que cette fonction prenne au moins 32 octets (un mot) de données d'appel. | Décalage | Opcode | Pile | -| -------: | ------ | -------------------------------------------- | +| --------:| ------ | -------------------------------------------- | | 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 19F | REVERT | | @@ -449,7 +449,7 @@ Si elle ne récupère pas les données d'appel, la transaction est annulée sans Voyons ce qui se passe si la fonction _obtient_ les données d'appel dont elle a besoin. | Décalage | Opcode | Pile | -| -------: | ------------ | ---------------------------------------- | +| --------:| ------------ | ---------------------------------------- | | 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | | 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | | 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | @@ -457,7 +457,7 @@ Voyons ce qui se passe si la fonction _obtient_ les données d'appel dont elle a `calldataload(4)` est le premier mot des données d'appel _après_ la signature de la méthode | Décalage | Opcode | Pile | -| -------: | ------------ | ---------------------------------------------------------------------------- | +| --------:| ------------ | ---------------------------------------------------------------------------- | | 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA | | 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA | | 1A5 | POP | 0x0153 calldataload(4) 0xDA | @@ -478,7 +478,7 @@ Voyons ce qui se passe si la fonction _obtient_ les données d'appel dont elle a Si le premier mot n'est pas inférieur à Stockage[4], la fonction échoue. Elle s'annule sans valeur retournée : | Décalage | Opcode | Pile | -| -------: | ---------- | ------------- | +| --------:| ---------- | ------------- | | 17A | PUSH1 0x00 | 0x00 ... | | 17C | DUP1 | 0x00 0x00 ... | | 17D | REVERT | | @@ -486,7 +486,7 @@ Si le premier mot n'est pas inférieur à Stockage[4], la fonction échoue. Elle Si le calldataload(4) est inférieur au Stockage[4], nous obtenons ce code : | Décalage | Opcode | Pile | -| -------: | ---------- | --------------------------------------------------- | +| --------:| ---------- | --------------------------------------------------- | | 17E | JUMPDEST | calldataload(4) 0x04 calldataload(4) 0xDA | | 17F | PUSH1 0x00 | 0x00 calldataload(4) 0x04 calldataload(4) 0xDA | | 181 | SWAP2 | 0x04 calldataload(4) 0x00 calldataload(4) 0xDA | @@ -496,7 +496,7 @@ Si le calldataload(4) est inférieur au Stockage[4], nous obtenons ce code : Et les emplacements mémoire 0x00-0x1F contiennent maintenant les données 0x04 (0x00-0x1E sont tous des zéros, 0x1F est quatre) | Décalage | Opcode | Pile | -| -------: | ---------- | ----------------------------------------------------------------------- | +| --------:| ---------- | ----------------------------------------------------------------------- | | 184 | PUSH1 0x20 | 0x20 calldataload(4) 0x00 calldataload(4) 0xDA | | 186 | SWAP1 | calldataload(4) 0x20 0x00 calldataload(4) 0xDA | | 187 | SWAP2 | 0x00 0x20 calldataload(4) calldataload(4) 0xDA | @@ -507,7 +507,7 @@ Et les emplacements mémoire 0x00-0x1F contiennent maintenant les données 0x04 Il y a une table de recherche dans le stockage, qui commence à SHA3 de 0x000... 004 et a une entrée pour chaque valeur légitime de données d'appel (valeur au-dessous de Stockage[4]). | Décalage | Opcode | Pile | -| -------: | ------ | ----------------------------------------------------------------------- | +| --------:| ------ | ----------------------------------------------------------------------- | | 18B | SWAP1 | calldataload(4) Storage[(((SHA3 of 0x00-0x1F))) + calldataload(4)] 0xDA | | 18C | POP | Storage[(((SHA3 of 0x00-0x1F))) + calldataload(4)] 0xDA | | 18D | DUP2 | 0xDA Storage[(((SHA3 of 0x00-0x1F))) + calldataload(4)] 0xDA | @@ -519,12 +519,12 @@ Nous savons déjà ce que fait [le code à la valeur décalée 0xDA](#the-da-cod Le code aux décalages 0xC4-0xCF est identique à ce que nous avons vu en 0x103-0x10E dans `splitter()` (autre que la destination `JUMPI`), donc nous savons que cette fonction n'est pas `payable` non plus. -| Décalage | Opcode | Pile | -| -------: | ------------ | ----------------- | -| D0 | JUMPDEST | | -| D1 | POP | | -| D2 | PUSH2 0x00da | 0xDA | -| D5 | PUSH1 0x06 | 0x06 0xDA | +| Décalage | Opcode | Pile | +| --------:| ------------ | ------------------- | +| D0 | JUMPDEST | | +| D1 | POP | | +| D2 | PUSH2 0x00da | 0xDA | +| D5 | PUSH1 0x06 | 0x06 0xDA | | D7 | SLOAD | Value\* 0xDA | | D8 | DUP2 | 0xDA Value\* 0xDA | | D9 | JUMP | Value\* 0xDA | @@ -542,7 +542,7 @@ Avez-vous l'impression de comprendre le contrat à ce stade ? Non. Jusqu'à pré | [currentWindow()](#currentwindow) | Return Storage[1] | | [merkleRoot()](#merkeroot) | Return Storage[0] | | [0x81e580d3](#0x81e580d3) | Retourne la valeur d'une table de recherche, à condition que le paramètre soit inférieur à Stockage[4] | -| [0x1f135823](#0x1f135823) | Return Storage[6], a.k.a. Value\* | +| [0x1f135823](#0x1f135823) | Return Storage[6], a.k.a. Value\* | Mais nous savons que toute autre fonctionnalité est fournie par le contrat dans Stockage[3]. Peut-être que si nous savions quel est ce contrat, cela nous donnerait un indice. Heureusement, ceci est la blockchain et tout est connu, du moins en théorie. Nous n'avons pas vu de méthode qui définisse Stockage[3], donc il doit avoir été défini par le constructeur. diff --git a/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md new file mode 100644 index 00000000000..8352a365b03 --- /dev/null +++ b/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md @@ -0,0 +1,212 @@ +--- +title: Envoyer des jetons avec ethers.js +description: Guide à l'intention des débutants sur l'envoi de jetons à l'aide d'ether.js. +author: Kim YongJun +tags: + - "ETHERS.JS" + - "ERC-20" + - "JETONS" +skill: beginner +lang: fr +published: 2021-04-06 +--- + +## Envoyer un jeton avec ethers.js (5.0) {#send-token} + +### Dans ce tutoriel, vous allez apprendre à {#you-learn-about} + +- Importer ethers.js +- Transférer un jeton +- Définir le prix du gaz en fonction de l'état du trafic réseau + +### Pour commencer {#to-get-started} + +Pour commencer, nous devons d'abord importer la bibliothèque ethers.js dans notre JavaScript en intégrant ethers.js (5.0) + +### Installation {#install-ethersjs} + +```shell +/home/ricmoo> npm install --save ethers +``` + +ES6 dans le navigateur : + +```html + +``` + +ES3 (UMD) dans le navigateur : + +```html + +``` + +### Paramètres {#param} + +1. **`contract_address`** : l'adresse du contrat du jeton (l'adresse du contrat est nécessaire lorsque le jeton que vous voulez transférer n'est pas de l'ether) +2. **`send_token_amount`** : le montant que vous désirez envoyer au destinataire +3. **`to_address`** : l'adresse du destinataire +4. **`send_account`** : l'adresse de l'expéditeur +5. **`private_key`** : clé privée de l'expéditeur afin de signer la transaction et de transférer véritablement les jetons + +## Remarque {#notice} + +`signTransaction(tx)` est retiré car `sendTransaction()` le fait en interne. + +## Procédure d'envoi {#procedure} + +### 1. Se connecter au réseau (testnet) {#connect-to-network} + +#### Définir le fournisseur (Infura) {#set-provider} + +Se connecter au réseau de test Ropsten + +```javascript +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") +``` + +### 2. Créer un portefeuille {#create-wallet} + +```javascript +let wallet = new ethers.Wallet(private_key) +``` + +### 3. Connecter le portefeuille au réseau {#connect-wallet-to-net} + +```javascript +let walletSigner = wallet.connect(window.ethersProvider) +``` + +### 4. Obtenir le prix actuel du gaz {#get-gas} + +```javascript +window.ethersProvider.getGasPrice() // gasPrice +``` + +### 5. Définir la transaction {#define-transaction} + +Les variables définies ci-dessous sont dépendantes de `send_token()` + +### Paramètres de la transaction {#transaction-params} + +1. **`send_account`** : adresse de l'expéditeur du jeton +2. **`to_address`** : adresse du destinataire du jeton +3. **`send_token_amount`** : nombre de jetons à envoyer +4. **`gas_limit`** : limite de gaz +5. **`gas_price`** : prix du gaz + +[Voir ci-dessous pour savoir comment les utiliser](#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. Transférer {#transfer} + +```javascript +walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("Send finished!") +}) +``` + +## Comment l’utiliser  {#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 +) +``` + +### Réussi ! {#success} + +![image de la transaction effectuée avec succès](./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) { + // general token send + let contract = new ethers.Contract( + contract_address, + send_abi, + walletSigner + ) + + // How many tokens? + let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) + console.log(`numberOfTokens: ${numberOfTokens}`) + + // Send tokens + contract.transfer(to_address, numberOfTokens).then((transferResult) => { + console.dir(transferResult) + alert("sent token") + }) + } // ether send + 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("Send finished!") + }) + } catch (error) { + alert("failed to send!!") + } + } + }) +} +``` diff --git a/public/content/translations/fr/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/fr/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md index 1dac17a9f10..4a6cbf232c6 100644 --- a/public/content/translations/fr/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md +++ b/public/content/translations/fr/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -23,7 +23,7 @@ Comme la plupart des développeurs blockchain débutants, vous avez peut-être f ### 1\. Alchemy ne stocke pas vos clés privées {#alchemy-does-not-store-your-private-keys} -- Cela signifie qu'Alchemy ne peut pas signer et envoyer des transactions en votre nom. Ceci pour des raisons de sécurité. Alchemy ne vous demandera jamais de partager votre clé privée, et vous ne devriez jamais partager votre clé privée avec un nœud hébergé (ni avec quiconque d'ailleurs). +- Cela signifie qu'Alchemy ne peut pas signer et envoyer des transactions en votre nom. Ceci pour des raisons de sécurité. Alchemy ne vous demandera jamais de partager votre clé privée, et vous ne devriez jamais partager votre clé privée avec un nœud hébergé (ni avec quiconque d'ailleurs). - Vous pouvez lire sur la blockchain en utilisant l'API Alchemy, mais pour y écrire vous devrez utiliser quelque chose d'autre afin de signer vos transactions par le biais d'Alchemy (c'est le cas pour tous les [services d'accès à la blockchain](/developers/docs/nodes-and-clients/nodes-as-a-service/)). ### 2\. Qu'est-ce qu'un « signataire » ? {#what-is-a-signer} @@ -33,7 +33,7 @@ Comme la plupart des développeurs blockchain débutants, vous avez peut-être f ### 3\. Pourquoi dois-je signer mes transactions? {#why-do-i-need-to-sign-my-transactions} -- Chaque utilisateur qui veut envoyer une transaction sur le réseau Ethereum doit signer la transaction (en utilisant sa clé privée), afin de valider l'origine de la transaction. +- Chaque utilisateur souhaitant envoyer une transaction sur le réseau Ethereum doit signer la transaction (à l'aide de sa clé privée), afin de valider que l'origine de la transaction est bien celle qu'elle prétend être. - Il est très important de protéger cette clé privée, car le fait d'y avoir accès vous donne le contrôle total de votre compte Ethereum, ce qui vous permet (ou à quiconque y ayant accès) d'effectuer des transactions en votre nom. ### 4\. Comment protéger ma clé privée ? {#how-do-i-protect-my-private-key} @@ -54,10 +54,15 @@ C'est ce que nous utiliserons dans notre tutoriel. ### 6\. Qu'est-ce que la bibliothèque web3 ? {#what-is-the-web3-library} - Web3.js est une bibliothèque de wrapper autour des appels standard JSON-RPC qui est couramment utilisée dans le développement Ethereum. -- Il existe de nombreuses bibliothèques web3 pour différents langages de programmation. Dans ce tutoriel, nous utiliserons [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), écrit en JavaScript. Vous trouverez d'autres alternatives [ici](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries). +- Il existe de nombreuses bibliothèques web3 pour différents langages de programmation. Dans ce tutoriel, nous utiliserons [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), écrit en JavaScript. Vous pouvez explorer d'autres options [ici](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries), telles que [ethers.js](https://docs.ethers.org/v5/). Bon, maintenant que nous avons clarifié ces points, passons au tutoriel. N'hésitez pas à poser des questions à tout moment sur le [discord](https://discord.gg/gWuC7zB) d'Alchemy ! +### 7\. Comment envoyer des transactions sécurisées, optimisées en termes de gaz et privées ? {how-to-send-secure-gas-optimized-and-private-transactions} + +- [Alchemy propose une suite d'APIs de transaction.](https://docs.alchemy.com/reference/transact-api-quickstart). Vous pouvez les utiliser pour envoyer des transactions renforcées, simuler des transactions avant qu'elles ne se produisent, envoyer des transactions privées et d'autres optimisées en termes de gaz +- Vous pouvez également utiliser l'[API Notify](https://docs.alchemy.com/docs/alchemy-notify) pour être alerté lorsque votre transaction est retirée du mempool et ajoutée à la chaîne + **NOTE :** Ce guide nécessite un compte Alchemy, une adresse Ethereum ou un portefeuille MetaMask, ainsi que l'installation de NodeJs et npm. Si ce n’est pas le cas, procédez comme suit : 1. [Créez un compte Alchemy gratuitement](https://auth.alchemyapi.io/signup) @@ -66,15 +71,15 @@ Bon, maintenant que nous avons clarifié ces points, passons au tutoriel. N'hés ## Étapes pour envoyer votre transaction {#steps-to-sending-your-transaction} -### 1\. Créer une application Alchemy sur le réseau de test Rinkeby {#create-an-alchemy-app-on-the-rinkeby-testnet} +### 1\. Créer une application Alchemy sur le réseau de test Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet} -Naviguez vers votre [tableau de bord d'Alchemy](https://dashboard.alchemyapi.io/) et créez une nouvelle application, en choisissant Rinkeby (ou tout autre réseau de test) comme réseau. +Naviguez vers votre [tableau de bord d'Alchemy](https://dashboard.alchemyapi.io/) et créez une nouvelle application, en choisissant Sepolia (ou tout autre réseau de test) comme réseau. -### 2\. Demander de l'ETH via le réseau Rinkeby {#request-eth-from-rinkeby-faucet} +### 2\. Demander de l'ETH via le robinet Sepolia {#request-eth-from-sepolia-faucet} -Suivez les instructions sur le réseau [Rinkeby](https://www.rinkebyfaucet.com/) pour recevoir de l'ETH. Veillez à bien d'inclure votre adresse Ethereum **Rinkeby** (depuis Metamask) et pas d'un autre réseau. Après avoir suivi les instructions, vérifiez que vous avez reçu l'ETH dans votre portefeuille. +Suivez les instructions sur le robinet [Alchemy Sepolia](https://www.sepoliafaucet.com/) pour recevoir de l'ETH. Assurez-vous d'inclure votre adresse Ethereum **Sepolia** (depuis MetaMask) et non celle d'un autre réseau. Après avoir suivi les instructions, vérifiez que vous avez reçu l'ETH dans votre portefeuille. -### 3\. Créer un nouveau dossier projet et `cd`("change directory" en ligne de commande) dans celui-ci {#create-a-new-project-direction} +### 3\. Créez un nouveau répertoire de projet et placez-y un `cd` {#create-a-new-project-direction} Créez un nouveau répertoire de projet à partir de la ligne de commande (terminal pour macs) et naviguez dans celui-ci : @@ -87,6 +92,8 @@ cd sendtx-example Exécutez la commande suivante dans votre dossier projet pour installer [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) : +Notez que si vous souhaitez utiliser la bibliothèque ethers.js, [suivez les instructions ici](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). + ``` npm install @alch/alchemy-web3 ``` @@ -101,7 +108,7 @@ npm install dotenv --save ### 6\. Créer le fichier `.env` {#create-the-dotenv-file} -Créez un fichier `.env` dans votre répertoire de projet et ajoutez les éléments suivants (en remplaçant «`your-api-url`» et «`your-private-key`») +Créez un fichier `.env` dans votre répertoire de projet et ajoutez les éléments suivants (en remplaçant «` your-api-URL `» et « `your-private-key` ») - Pour trouver l’URL de votre API Alchemy, accédez à la page des détails de l’application que vous venez de créer sur votre tableau de bord, cliquez sur « View Key » (Voir clé) dans le coin supérieur droit et saisissez l’URL HTTP. - Pour trouver votre clé privée sur MetaMask, consultez ce [guide](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key). @@ -111,13 +118,13 @@ API_URL = "your-api-url" PRIVATE_KEY = "your-private-key" ``` - + Ne propagez pas le fichier .env ! Assurez-vous de ne jamais partager ou exposer votre fichier .env avec quiconque, car vous compromettez vos secrets en le faisant. Si vous utilisez le contrôle de version, ajoutez votre .env à un fichier gitignore. ### 7\. Créer le fichier `sendTx.js` {#create-sendtx-js} -Super, maintenant que nous avons protégé nos données sensibles dans un fichier `.env`, commençons à coder. Pour notre exemple d'envoi de transaction, nous renverrons l'ETH via le réseau Rinkeby. +Super, maintenant que nous avons protégé nos données sensibles dans un fichier `.env`, commençons à coder. Pour notre exemple d'envoi de transaction, nous renverrons l'ETH via le robinet Sepolia. Créez un fichier `sendTx.js`, dans lequel nous allons configurer et envoyer notre exemple de transaction et ajoutez-y les lignes de code suivantes : @@ -158,11 +165,11 @@ Veillez à remplacer l'adresse sur la **ligne 6** par votre propre adresse publi Avant de nous lancer dans l’exécution de ce code, parlons ici de certains de ses composants. - `nonce` : La spécification nonce est utilisée pour garder une trace du nombre de transactions envoyées depuis votre adresse. Nous en avons besoin pour des raisons de sécurité et pour éviter [les attaques par répétition](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Pour obtenir le nombre de transactions envoyées à partir de votre adresse, nous utilisons [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). -- `transaction` : L'objet transaction intègre certains aspects que nous avons besoin de spécifier. - - `to` : C'est l'adresse à laquelle nous voulons envoyer l'ETH. Dans notre cas, nous renvoyons l'ETH au faucet [Rinkeby](https://faucet.rinkeby.io/) auquel nous avons initialement fait la demande. +- `transaction` : L'objet de la transaction présente quelques aspects que nous devons spécifier + - `to` : C'est l'adresse à laquelle nous voulons envoyer l'ETH. Dans notre cas, nous renvoyons l'ETH au robinet [Sepolia](https://sepoliafaucet.com/) auquel nous avons initialement fait la demande. - `value` : C'est le montant que nous souhaitons envoyer, spécifié en Wei où 10^18 Wei = 1 ETH. - - `gas` : Il existe plusieurs façons de déterminer la bonne quantité de gaz à inclure dans votre transaction. Alchemy dispose même d'un [webhook du prix du gaz](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) pour vous avertir lorsque le prix du gaz tombe sous un certain seuil. Pour les transactions sur le réseau principal, il est bon dee recourir à un estimateur de gaz comme [ETH Gas Station](https://ethgasstation.info/) pour déterminer la bonne quantité de gaz à intégrer. 21 000 est la quantité minimale de gaz qu'une opération sur Ethereum va utiliser, ainsi pour s'assurer que notre transaction sera exécutée, nous utiliserons ici 30 000 unités. - - `nonce` : voir la définition ci-dessus. Nonce commence à compter à partir de zéro. + - `gas` : Il existe plusieurs façons de déterminer la bonne quantité de gaz à inclure dans votre transaction. Alchemy dispose même d'un [lien de rappel du prix du gaz](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) pour vous avertir lorsque le prix du gaz tombe sous un certain seuil. Pour les transactions sur le réseau principal, il est bon de recourir à un estimateur de gaz comme [ETH Gas Station](https://ethgasstation.info/) pour déterminer la bonne quantité de gaz à intégrer. 21 000 est la quantité minimale de gaz qu'une opération sur Ethereum va utiliser. Ainsi, pour s'assurer que notre transaction sera exécutée, nous utiliserons ici 30 000 unités. + - `nonce` : voir la définition de nonce ci-dessus. Nonce commence à compter à partir de zéro. - [OPTIONAL] données : Utilisé pour envoyer des informations supplémentaires avec votre transfert ou pour appeler un contrat intelligent. Non requis pour les transferts de solde. Consultez la note ci-dessous. - `signedTx` : Pour signer l'objet de notre transaction nous utiliserons la méthode `signTransaction` avec notre `PRIVATE_KEY` - `sendSignedTransaction` : Une fois que nous disposons d'une transaction signée, nous pouvons l'envoyer pour être intégrée dans un bloc ultérieur en utilisant `sendSignedTransaction`. @@ -186,7 +193,7 @@ node sendTx.js Ouvrez la page [Mempool](https://dashboard.alchemyapi.io/mempool) dans votre tableau de bord Alchemy et filtrez avec l'application que vous avez créée pour trouver votre transaction. C'est là que nous pouvons observer le passage de l'état de notre transaction de l'état en attente à l'état miné (si la transaction a abouti) ou à l'état abandonné en cas d'échec. Veillez à opter pour « All » (Tous) afin de visualiser les transactions « mined » (minées), « pending » (en attente) et « dropped » (abandonnées). Vous pouvez également trouver votre transaction en recherchant les transactions envoyées à l'adresse `0x31b98d14007bdee637298086988a0bbd31184523`. -Pour voir les détails de votre transaction une fois que vous l'avez trouvée, sélectionnez le tx, hash qui devrait vous amener à une vue qui ressemble à ceci : +Pour afficher les détails de votre transaction une fois que vous l'avez trouvée, sélectionnez le hachage tx, qui devrait vous amener à une vue qui ressemble à ceci : ![Capture d'écran Mempool watcher](./mempool.png) diff --git a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md index 1ccce5a321c..4803160999b 100644 --- a/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md +++ b/public/content/translations/fr/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -124,7 +124,7 @@ Ici, vous pouvez définir plusieurs contrats et handlers. Une configuration typi Pour des raisons de commodité, vous pouvez également utiliser un outil de template comme Mustache. Ensuite, vous allez créer un template `subgraph.template.yaml` et y insérez les adresses basées sur les derniers déploiements. Pour un exemple plus avancé, vous pouvez consulter le [répertoire de subgraphs Aave](https://github.com/aave/aave-protocol/tree/master/thegraph). -Et la documentation complète peut être consultée ici : https://thegraph.com/docs/define-a-subgraph#the-subgraph-manifest. +Et la documentation complète peut être consultée [ici](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest). ```yaml specVersion: 0.0.1 @@ -167,7 +167,7 @@ Le schéma est la définition des données GraphQL. Il vous permettra de défini - BigInt - BigDecimal -Vous pouvez également utiliser des entités comme type pour définir des relations. Dans notre exemple, nous définissons une relation « un à plusieurs » pour les paris d'un joueur. Le ! signifie que la valeur ne peut pas être vide. La documentation complète est disponible ici : https://thegraph.com/docs/define-a-subgraph#the-graphql-schema. +Vous pouvez également utiliser des entités comme type pour définir des relations. Dans notre exemple, nous définissons une relation « un à plusieurs » pour les paris d'un joueur. Le ! signifie que la valeur ne peut pas être vide. La documentation complète peut être consultée [ici](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest). ```graphql type Bet @entity { @@ -196,7 +196,7 @@ Puis nous créons une nouvelle entité Bet. L'ID pour cela sera `event.transacti Enfin, nous pouvons mettre à jour l'entité du Player avec toutes les données. Les tableaux ne peuvent pas être poussés directement, mais doivent être mis à jour comme indiqué ici. Nous utilisons l'ID pour référencer le pari. Et `.save()` est requis à la fin pour stocker une entité. -La documentation complète est disponible ici : https://thegraph.com/docs/define-a-subgraph#writing-mappings. Vous pouvez également ajouter une sortie de journalisation au fichier de mapping, voir [ici](https://thegraph.com/docs/assemblyscript-api#api-reference). +La documentation complète est disponible ici : https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. Vous pouvez également ajouter une sortie de journalisation au fichier de mapping, voir [ici](https://thegraph.com/docs/assemblyscript-api#api-reference). ```typescript import { Bet, Player } from "../generated/schema" @@ -293,24 +293,21 @@ Mais il nous manque une dernière pièce du puzzle et c'est le serveur. Vous pou ### Graph Explorer : le service hébergé {#graph-explorer-the-hosted-service} -Le moyen le plus simple est d'utiliser le service hébergé. Suivez les instructions [ici](https://thegraph.com/docs/deploy-a-subgraph) pour déployer un subgraph. Pour de nombreux projets, vous pouvez trouver des subgraphs existants dans l'explorateur sur https://thegraph.com/explorer/. +Le moyen le plus simple est d'utiliser le service hébergé. Suivez les instructions [ici](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/) pour déployer un subgraph. Pour de nombreux projets, vous pouvez trouver des subgraphs existants dans [l'explorateur](https://thegraph.com/explorer/). ![Le Graph-Explorer](./thegraph-explorer.png) ### Exécuter votre propre nœud {#running-your-own-node} -Vous pouvez également exécuter votre propre nœud : https://github.com/graphprotocol/graph-node#quick-start. Une raison d'agir de la sorte peut être d'utiliser un réseau qui n'est pas pris en charge par le service hébergé. Actuellement supportés : Mainnet, Kovan, Rinkeby, Ropsten, Goerli, PoA-Core, xDAI et Sokol. +Sinon, vous pouvez faire tourner votre propre nœud. Documentation [ici](https://github.com/graphprotocol/graph-node#quick-start). Une raison d'agir de la sorte peut être d'utiliser un réseau qui n'est pas pris en charge par le service hébergé. Les réseaux actuellement pris en charge [sont disponibles ici](https://thegraph.com/docs/en/developing/supported-networks/). ## Un avenir décentralisé {#the-decentralized-future} -GraphQL prend également en charge les flux pour les nouveaux événements à venir. Ce n'est pas encore entièrement supporté par The Graph, mais la sortie est imminente. +GraphQL prend également en charge les flux pour les nouveaux événements à venir. Ceux-ci sont pris en charge par The Graph par le biais de [Substreams](https://thegraph.com/docs/en/substreams/) qui est actuellement en version bêta ouverte. -Un aspect manquant reste toutefois la décentralisation. The Graph envisage des projets futurs pour devenir un protocole entièrement décentralisé. Voici deux excellents articles expliquant le plan plus en détail : - -- https://thegraph.com/blog/the-graph-network-in-depth-part-1 -- https://thegraph.com/blog/the-graph-network-in-depth-part-2 +En [2021](https://thegraph.com/blog/mainnet-migration/), The Graph a commencé sa transition vers un réseau d'indexation décentralisé. Vous pouvez en savoir plus sur l'architecture de ce réseau d'indexation décentralisé [ici](https://thegraph.com/docs/en/network/explorer/). Les deux aspects clés sont : -1. Les utilisateurs paieront les indexeurs pour les requêtes. -2. Les indexeurs mettront en jeu des jetons Graph (GRT). +1. Les utilisateurs paient les indexeurs pour les requêtes. +2. Les indexeurs mettront en jeu des jetons The Graph (GRT). diff --git a/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md index dbee8df57cb..fed3fe3d9ac 100644 --- a/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md @@ -17,7 +17,7 @@ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" Dans le tutoriel précédent, nous avons étudié [l'anatomie d'un jeton ERC-20 dans Solidity](/developers/tutorials/understand-the-erc-20-token-smart-contract/) sur la blockchain Ethereum. Dans cet article, nous allons voir comment nous pouvons utiliser un contrat intelligent pour interagir avec un jeton en utilisant le langage Solidity. -Pour ce contrat intelligent, nous allons créer un échange décentralisé vraiment factice où un utilisateur peut échanger de l'Ethereum contre notre jeton [ERC-20](/developers/docs/standards/tokens/erc-20/) nouvellement déployé. +Pour ce contrat intelligent, nous allons créer un échange décentralisé très rudimentaire où un utilisateur pourra échanger de l'Ether contre notre nouveau [jeton ERC-20](/developers/docs/standards/tokens/erc-20/) récemment déployé. Pour ce tutoriel, nous utiliserons le code que nous avons écrit dans le tutoriel précédent comme base. Notre DEX instanciera une instance du contrat dans son constructeur et effectuera les opérations de : @@ -196,7 +196,7 @@ function sell(uint256 amount) public { } ``` -Si tout fonctionne, vous devriez voir 2 événements (un `Transfer` et `Sold`) dans la transaction et votre solde de jetons et Ethereum mis à jour. +Si tout fonctionne correctement, vous devriez voir 2 événements (un `Transfer` et `Sold`) dans la transaction, ainsi que la mise à jour de votre solde de jetons et de votre solde d'Ether. ![Deux événements dans la transaction : le transfert et la vente](./transfer-and-sold-events.png) diff --git a/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md index ef223edc3c9..dfec15096da 100644 --- a/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -27,7 +27,7 @@ published: 2021-02-26 # Premiers pas {#getting-started} -Le tutoriel décrit l'installation et l'exécution du test en utilisant yarn, mais il n'y a pas de problème si vous préférez npm - je fournirai les références appropriées à la [documentation officielle de Waffle](https://ethereum-waffle.readthedocs.io/en/latest/index.html). +Le tutoriel décrit l'installation et l'exécution du test en utilisant yarn, mais il n'y a pas de problème si vous préférez npm - je fournirai les références appropriées à la documentation officielle de Waffle.[](https://ethereum-waffle.readthedocs.io/en/latest/index.html) ## Installer les dépendances {#install-dependencies} @@ -39,7 +39,7 @@ yarn add --dev ethereum-waffle ts-node typescript @types/jest ## Exemple de contrat intelligent {#example-smart-contract} -Au cours du tutoriel, nous allons travailler sur un exemple de contrat intelligent simple - EtherSplitter. Il ne fait pas grand-chose à part permettre à quelqu'un d'envoyer des wei et de les répartir équitablement entre deux destinataires prédéfinis. La fonction de séparation nécessite que le nombre de wei soit pair, sinon elle s'inverse. Pour les deux destinataires, il effectue un transfert wei suivi de l'émission de l'événement Transfert. +Au cours du tutoriel, nous allons travailler sur un exemple de contrat intelligent simple - EtherSplitter. Il ne fait pas grand-chose à part permettre à quelqu'un d'envoyer des wei et de les répartir équitablement entre deux destinataires prédéfinis. La fonction de séparation nécessite que le nombre de wei soit pair, sinon elle s'inverse. Pour les deux destinataires, il effectue un transfert de wei suivi de l'émission de l'événement Transfert. Placez le fragment de code EtherSplitter dans `src/EtherSplitter.sol`. @@ -92,7 +92,7 @@ Exécutez `yarn build`. Cela fera apparaître le dossier `build` avec le contrat ## Configuration du test {#test-setup} -Tester avec Waffle nécessite d'utiliser des correspondances Chai et Mocha, vous devez donc [les ajouter](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) à votre projet. Lancez la mise à jour de votre paquet package.json, et ajoutez le `texte`d'entrée, dans la partie modèle : +Tester avec Waffle nécessite d'utiliser des correspondances Chai et Mocha, vous devez donc [les ajouter](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) à votre projet. Lancez la mise à jour de votre paquet package.json, et ajoutez le `texte`d'entrée, dans la partie modèle: ```json "scripts": { @@ -178,7 +178,7 @@ it("Emits event on the transfer to the second receiver", async () => { }) ``` -La correspondance `emit` nous permet de vérifier si un contrat a émis un événement en appelant une méthode. En tant que paramètres pour le `emit` correspondant, nous fournissons le contrat fictif que nous prévoyons pour émettre l'événement, ainsi que le nom de cet événement. Dans notre cas, le contrat fictif est `splitter` et le nom de l'événement `Transfer`. Nous pouvons également vérifier les valeurs précises des arguments avec lesquels l'événement a été émis - nous transmettons autant d'arguments au `withArgs` correspondant, comme le prévoit notre déclaration d'événement. Dans le cas du contrat EtherSpliter, nous passons les adresses de l'expéditeur et du destinataire avec le montant en wei transféré. +La correspondance `emit` nous permet de vérifier si un contrat a émis un événement en appelant une méthode. En tant que paramètres pour la corrrespondance `emit`, nous fournissons le contrat fictif que nous prévoyons pour émettre l'événement, ainsi que le nom de cet événement. Dans notre cas, le contrat fictif est `splitter` et le nom de l'événement `Transfer`. Nous pouvons également vérifier les valeurs précises des arguments avec lesquels l'événement a été émis - nous transmettons autant d'arguments au `withArgs` correspondant, comme le prévoit notre déclaration d'événement. Dans le cas du contrat EtherSpliter, nous passons les adresses de l'expéditeur et du destinataire avec le montant en wei transféré. ## revertedWith {#revertedwith} diff --git a/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md new file mode 100644 index 00000000000..667696cc673 --- /dev/null +++ b/public/content/translations/fr/developers/tutorials/yellow-paper-evm/index.md @@ -0,0 +1,264 @@ +--- +title: Comprendre le livre Jaune des spécifications d'EVM +description: Comprendre la partie du Livre Jaune, les spécifications formelles pour Ethereum, qui explique la machine virtuelle Ethereum (EVM). +author: "qbzzt" +tags: + - "evm" +skill: intermediate +lang: fr +published: 2022-05-15 +--- + +[Le Livre Jaune](https://ethereum.github.io/yellowpaper/paper.pdf) est la spécification formelle d'Ethereum. Sauf là où il a été modifié par [le processus d'EIP](/eips/), il contient la description exacte du fonctionnement de tout. Il est rédigé sous forme de document mathématique, qui inclut une terminologie que les programmeurs pourraient ne pas connaître. Dans ce document, vous apprendrez comment le lire, et par extension, d'autres documents mathématiques liés. + +## Quel Livre Jaune ? {#which-yellow-paper} + +Comme presque tout le reste dans Ethereum, le Livre Jaune évolue avec le temps. Afin de pouvoir se référer à une version spécifique, j'ai [téléchargé la version actuelle au moment de la rédaction](yellow-paper-berlin.pdf). Les numéros de section, de page et d'équation que j'utilise se référeront à cette version. Il est recommandé de l'avoir ouvert dans une autre fenêtre pendant la lecture de ce document. + +### Pourquoi l'EVM ? {#why-the-evm} + +Le livre jaune original a été rédigé dès le début du développement d'Ethereum. Il décrit le mécanisme de consensus original basé sur la preuve de travail qui était initialement utilisé pour sécuriser le réseau. Cependant, Ethereum a abandonné la preuve de travail et a commencé à utiliser un consensus basé sur la preuve d'enjeu en septembre 2022. Ce tutoriel se concentrera sur les parties du livre jaune définissant la Machine Virtuelle Ethereum. L'EVM n'a pas été modifié par la transition vers la preuve d'enjeu (à l'exception de la valeur de réponse de l'opcode DIFFICULTY). + +## 9 Modèle d'exécution {#9-execution-model} + +Cette section (p. 12-14) comprend la majeure partie de la définition de l'EVM. + +Le terme _état du système_ comprend tout ce que vous devez savoir sur le système pour le faire fonctionner. Dans un ordinateur classique, cela signifie la mémoire, le contenu des registres, etc. + +Une [machine de Turing](https://en.wikipedia.org/wiki/Turing_machine) est un modèle de calcul. En substance, c'est une version simplifiée d'un ordinateur, qui s’est avéré avoir la même capacité d'exécuter des calculs qu'un ordinateur normal (tout ce qu'un ordinateur peut calculer, une machine de Turing peut le calculer et vice versa). Ce modèle facilite la preuve de divers théorèmes sur ce qui est et n'est pas calculable. + +Le terme [Turing-complet](https://en.wikipedia.org/wiki/Turing_completeness) désigne un ordinateur qui peut exécuter les mêmes calculs qu'une machine de Turing. Les machines de Turing peuvent entrer dans des boucles infinies, et l'EVM ne le peut pas car elle manquerait de gaz, elle est donc seulement quasi-Turing-complète. + +## 9.1 Les bases {#91-basics} + +Cette section présente les bases de l'EVM et comment il se compare à d'autres modèles computationnels. + +Une [machine pile](https://en.wikipedia.org/wiki/Stack_machine) est un ordinateur qui stocke les données intermédiaires non pas dans des registres, mais dans une [**pile**](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). C'est l'architecture privilégiée pour les machines virtuelles car elle est facile à mettre en œuvre, ce qui signifie que les bugs et les vulnérabilités de sécurité sont beaucoup moins probables. La mémoire dans la pile est divisée en mots de 256 bits. Ce choix a été fait car il est pratique pour les opérations cryptographiques centrales d'Ethereum telles que le hachage Keccak-256 et les calculs de courbes elliptiques. La taille maximale de la pile est de 1024 octets. Lorsque les opcodes sont exécutés, ils prennent généralement leurs paramètres depuis la pile. Il existe des opcodes spécifiquement pour réorganiser les éléments dans la pile, tels que `POP` (retire l'élément du haut de la pile), `DUP_N` (duplique le N-ième élément dans la pile), etc. + +L'EVM possède également un espace volatile appelé **mémoire**, qui est utilisé pour stocker des données pendant l'exécution. Cette mémoire est organisée en mots de 32 octets. Tous les emplacements mémoire sont initialisés à zéro. Si vous exécutez ce code [Yul](https://docs.soliditylang.org/en/latest/yul.html) pour ajouter un mot à la mémoire, il remplira 32 octets de mémoire en remplissant l'espace vide du mot avec des zéros, c'est-à-dire qu'il crée un mot - avec des zéros aux emplacements 0-29, 0x60 à 30, et 0xA7 à 31. + +```yul +mstore(0, 0x60A7) +``` + +`mstore` est l'un des trois opcodes que l'EVM fournit pour interagir avec la mémoire - il charge un mot en mémoire. Les deux autres sont `mstore8`, qui charge un seul octet en mémoire, et `mload`, qui déplace un mot de la mémoire à la pile. + +L'EVM a également un modèle de **stockage** non volatile séparé qui est maintenu dans le système - cette mémoire est organisée en tableaux de mots (par opposition aux tableaux d'octets adressables par mots dans la pile). Ce stockage est l'endroit où les contrats conservent des données persistantes - un contrat ne peut interagir qu'avec son propre stockage. Le stockage est organisé en mappages clé-valeur. + +Bien qu'il ne soit pas mentionné dans cette section du Livre Jaune, il est également utile de savoir qu'il existe un quatrième type de mémoire. **Calldata** est une mémoire en lecture seule adressable par octets utilisée pour stocker la valeur passée avec le paramètre de `données` d'une transaction. L'EVM dispose d'opcodes spécifiques pour gérer `calldata`. `calldatasize` renvoie la taille des données. `calldataload` charge les données dans la pile. `calldatacopy` copie les données en mémoire. + +L'architecture standard [Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) stocke le code et les données dans la même mémoire. L'EVM ne suit pas cette norme pour des raisons de sécurité - le partage de mémoire volatile rend possible la modification du code programme. Au lieu de cela, le code est sauvegardé dans le stockage. + +Il n'y a que deux cas où le code est exécuté à partir de la mémoire : + +- Lorsqu'un contrat crée un autre contrat (en utilisant [`CREATE`](https://www.evm.codes/#f0) ou [`CREATE2`](https://www.evm.codes/#f5)), le code pour le constructeur de contrat provient de la mémoire. +- Lors de la création d'un contrat, le code du constructeur s'exécute puis renvoie avec le code du contrat réel, également à partir de la mémoire. + +Le terme exécution exceptionnelle signifie une exception qui provoque l'arrêt de l'exécution du contrat en cours. + +## 9.2 Aperçu des frais {#92-fees-overview} + +Cette section explique comment les frais de gaz sont calculés. Il y a trois coûts : + +### Coût des opcodes {#opcode-cost} + +Le coût inhérent à l'opcode spécifique. Pour obtenir cette valeur, trouvez le coût de l'opcode dans l'Annexe H (p. 28, sous l'équation (327)), et trouvez le coût dans l'équation (324). Cela vous donne une fonction de coût, qui dans la plupart des cas utilise des paramètres de l'Annexe G (p. 27). + +Par exemple, l'opcode [`CALLDATACOPY`](https://www.evm.codes/#37) fait partie du groupe _Wcopy_. Le coût de l'opcode pour ce groupe est _Gverylow+Gcopy×⌈μs[2]÷32⌉_. En regardant l'Annexe G, nous voyons que les deux constantes sont 3, ce qui nous donne _3+3×⌈μs[2]÷32⌉_. + +Nous devons encore décrypter l'expression _⌈μs[2]÷32⌉_. La partie la plus externe, _⌈ \ ⌉_, est la fonction plafond, une fonction qui, étant donnée une valeur, retourne le plus petit entier qui n'est pas inférieur à cette valeur. Par exemple, _⌈2.5⌉ = ⌈3⌉ = 3_. La partie interne est _μs[2]÷32_. En consultant la section 3 (Conventions) à la p. 3, _μ_ représente l'état de la machine. L'état de la machine est défini dans la section 9.4.1 à la p. 13. Selon cette section, l'un des paramètres de l'état de la machine est _s_ pour la pile. En regroupant tout cela, il semble que _μs[2]_ soit l'emplacement n°2 dans la pile. En examinant [l'opcode](https://www.evm.codes/#37), l'emplacement n°2 dans la pile est la taille des données en octets. En regardant les autres opcodes du groupe Wcopy, comme [`CODECOPY`](https://www.evm.codes/#39) et [`RETURNDATACOPY`](https://www.evm.codes/#3e), ils ont également une taille de données au même endroit. Ainsi, _⌈μs[2]÷32⌉_ représente le nombre de mots de 32 octets nécessaires pour stocker les données copiées. En résumé, le coût inhérent de [`CALLDATACOPY`](https://www.evm.codes/#37) est de 3 gas plus 3 par mot de données copiées. + +### Coût d'exécution {#running-cost} + +Il s'agit du coût d'exécution du code que nous appelons. + +- Dans le cas de [`CREATE`](https://www.evm.codes/#f0) et [`CREATE2`](https://www.evm.codes/#f5), il s'agit du constructeur du nouveau contrat. +- Dans le cas de [`CALL`](https://www.evm.codes/#f1), [`CALLCODE`](https://www.evm.codes/#f2), [`STATICCALL`](https://www.evm.codes/#fa), ou [`DELEGATECALL`](https://www.evm.codes/#f4), il s'agit du contrat que nous appelons. + +### Coût d'expansion de la mémoire {#expanding-memory-cost} + +Il s'agit du coût de l'expansion de la mémoire (si nécessaire). + +Dans l'équation 324, cette valeur est notée _Cmemi')-Cmemi)_. En consultant à nouveau la section 9.4.1, nous voyons que _μi_ représente le nombre de mots en mémoire. Ainsi, _μi_ est le nombre de mots en mémoire avant le opcode et _μi'_ est le nombre de mots en mémoire après l'opcode. + +La fonction _Cmem_ est définie dans l'équation 326 : _Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋_. _⌊x⌋_ est la fonction plancher, une fonction qui, étant donné une valeur, retourne le plus grand entier qui n'est toujours pas supérieur à cette valeur. Par exemple, _⌊2.5⌋ = ⌊2⌋ = 2_. Lorsque _a < √512_, _a2 < 512_, et le résultat de la fonction plancher est zéro. Ainsi, pour les 22 premiers mots (704 octets), le coût augmente linéairement avec le nombre de mots mémoire requis. Au-delà de ce point, _⌊a2 ÷ 512⌋_ est positif. Lorsque la mémoire requise est suffisamment élevée, le coût en gas est proportionnel au carré de la quantité de mémoire. + +**Note** : ces facteurs n'influencent que le coût en gas _inhérent_ - cela ne prend pas en compte le marché des frais ou les pourboires aux validateurs qui déterminent combien un utilisateur final doit payer - il s'agit simplement du coût brut d'exécution d'une opération particulière sur l'EVM. + +[Plus d'information sur le gaz](/developers/docs/gas/). + +## 9.3 Environnement d'exécution {#93-execution-env} + +L'environnement d'exécution est un tuple, _I_, qui inclut des informations qui ne font pas partie de l'état de la blockchain ou de l'EVM. + +| Paramètre | Opcode pour accéder aux données | Code Solidity pour accéder aux données | +| --------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- | +| _Ia_ | [`ADDRESS`](https://www.evm.codes/#30) | `address(this)` | +| _Io_ | [`ORIGIN`](https://www.evm.codes/#32) | `tx.origin` | +| _Ip_ | [`GASPRICE`](https://www.evm.codes/#3a) | `tx.gasprice` | +| _Id_ | [`CALLDATALOAD`](https://www.evm.codes/#35), etc. | `msg.data` | +| _Is_ | [`CALLER`](https://www.evm.codes/#33) | `msg.sender` | +| _Iv_ | [`CALLVALUE`](https://www.evm.codes/#34) | `msg.value` | +| _Ib_ | [`CODECOPY`](https://www.evm.codes/#39) | `address(this).code` | +| _IH_ | Champs de l'en-tête de bloc, tels que [`NUMBER`](https://www.evm.codes/#43) et [`DIFFICULTY`](https://www.evm.codes/#44) | `block.number`, `block.difficulty`, etc. | +| _Ie_ | Profondeur de la pile d'appels pour les appels entre contrats (y compris la création de contrat) | | +| _Iw_ | L'EVM est-il autorisé à modifier l'état ou s'exécute-t-il de manière statique | | + +Quelques autres paramètres sont nécessaires pour comprendre le reste de la section 9 : + +| Paramètre | Défini dans la section | Signification | +| --------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| _σ_ | 2 (p. 2, équation 1) | L'état de la blockchain | +| _g_ | 9.3 (p. 13) | Gaz restant | +| _A_ | 6.1 (p. 8) | Sous-état accumulé (modifications prévues pour la fin de la transaction) | +| _o_ | 9.3 (p. 13) | Sortie - le résultat retourné dans le cas d'une transaction interne (quand un contrat en appelle un autre) et des appels à des fonctions d'affichage (quand on demande simplement des informations, il n'est donc pas nécessaire d'attendre une transaction) | + +## 9.4 Aperçu de l'exécution {#94-execution-overview} + +Maintenant que nous avons tous les préliminaires, nous pouvons enfin commencer à travailler sur le fonctionnement de l'EVM. + +Les équations 137-142 nous donnent les conditions initiales pour faire fonctionner l'EVM : + +| Symbole | Valeur initiale | Signification | +| ---------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| _μg_ | _g_ | Gaz restant | +| _μpc_ | _0_ | Compteur de programme, l'adresse de la prochaine instruction à exécuter | +| _μm_ | _(0, 0, ...)_ | Mémoire, initialisée à zéro | +| _μi_ | _0_ | Emplacement mémoire le plus élevé utilisé | +| _μs_ | _()_ | La pile, initialement vide | +| _μo_ | _∅_ | La sortie, un ensemble vide jusqu'à ce que nous nous arrêtions soit avec des données de retour ([`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)) soit sans elle ([`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)). | + +L'équation 143 nous indique qu'il existe quatre conditions possibles à chaque instant lors de l'exécution, et ce qu'il faut faire avec elles : + +1. `Z(σ,μ,A,I)`. Z représente une fonction qui teste si une opération crée une transition d'état invalide (voir [l'arrêt exceptionnel](#942-exceptional-halting)). Si elle est évaluée à True, le nouvel état est identique à l'ancien (à l'exception du gaz brûlé) car les changements n'ont pas été mis en œuvre. +2. Si l'opcode exécuté est [`REVERT`](https://www.evm.codes/#fd), le nouvel état est le même que l'ancien, et une partie du gaz est perdue. +3. Si la séquence d'opérations est terminée, comme signifié par un [`RETURN`](https://www.evm.codes/#f3), l'état est mis à jour avec le nouvel état. +4. Si nous ne sommes pas à l'une des conditions de fin 1-3, continuer l'exécution. + +## 9.4.1 Machine à états {#941-machine-state} + +Cette section explique la machine à états en détail. Elle spécifie que _w_ est l'opcode actuel. Si _μpc_ est inférieur à _||Ib||_, la longueur du code, alors ce byte (_Ibpc]_) est l'opcode. Sinon, l'opcode est défini comme [`STOP`](https://www.evm.codes/#00). + +Comme il s'agit [d'une machine à pile](https://en.wikipedia.org/wiki/Stack_machine), nous devons suivre le nombre d'éléments retirés (_δ_) et insérés (_α_) par chaque opcode. + +## 9.4.2 Arrêt Exceptionnel {#942-exceptional-halt} + +Cette section définit la fonction _Z_, qui spécifie quand nous avons une terminaison anormale. Il s'agit d'une fonction [booléenne](https://en.wikipedia.org/wiki/Boolean_data_type), donc elle utilise [_∨_ pour un « ou » logique](https://en.wikipedia.org/wiki/Logical_disjunction) et [_∧_ pour un « et » logique](https://en.wikipedia.org/wiki/Logical_conjunction). + +Nous avons un arrêt exceptionnel si l'une de ces conditions est vraie : + +- **_μg < C(σ,μ,A,I)_** Comme nous l'avons vu à la section 9.2, _C_ est la fonction qui spécifie le coût en gaz. Il ne reste pas assez de gaz pour couvrir le prochain opcode. + +- **_δw=∅_** Si le nombre d'éléments extraits pour un opcode est indéfini, alors l'opcode lui-même est indéfini. + +- **_|| μs || < δw_** Sous-alimentation de la pile, pas assez d'éléments dans la pile pour l'opcode actuel. + +- **_w = JUMP ∧ μs[0]∉D(Ib)_** L'opcode est [`JUMP`](https://www.evm.codes/#56) et l'adresse n'est pas une [`JUMPDEST`](https://www.evm.codes/#5b). Les sauts ne sont valides _que_ lorsque la destination est une [`JUMPDEST`](https://www.evm.codes/#5b). + +- **_w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib)_** L'opcode est [`JUMPI`](https://www.evm.codes/#57), la condition est vraie (non nulle) donc le saut devrait se produire, et l'adresse n'est pas une [`JUMPDEST`](https://www.evm.codes/#5b). Les sauts ne sont valides _que_ lorsque la destination est une [`JUMPDEST`](https://www.evm.codes/#5b). + +- **_w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo ||_** L'opcode est [`RETURNDATACOPY`](https://www.evm.codes/#3e). Dans cet opcode, l'élément de pile _μs[1]_ est le décalage pour lire dans le tampon de données retournées, et l'élément de pile _μs[2]_ est la longueur des données. Cette condition se produit lorsque vous essayez de lire au-delà de la fin du tampon de données retournées. Notez qu'il n'y a pas de condition similaire pour les données d'appel ou pour le code lui-même. Lorsque vous essayez de lire au-delà de la fin de ces tampons, vous obtenez simplement des zéros. + +- **_|| μs || - δw + αw > 1024_** + + Débordement de la pile. Si l'exécution de l'opcode entraîne une pile de plus de 1024 éléments, abandonnez. + +- **_¬Iw ∧ W(w,μ)_** Exécutons-nous de manière statique ([¬ est une négation](https://en.wikipedia.org/wiki/Negation) et _Iw_ est vrai lorsque nous sommes autorisés à modifier l'état de la blockchain) ? Si c'est le cas et que nous essayons une opération qui change l'état, cela ne peut pas se produire. + + La fonction _W(w,μ)_ est définie plus tard dans l'équation 150. _W(w,μ)_ est vraie si l'une de ces conditions est vraie : + + - **_w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT}_** Ces opcodes modifient l'état, soit en créant un nouveau contrat, soit en stockant une valeur, soit en détruisant le contrat actuel. + + - **_LOG0≤w ∧ w≤LOG4_** Si nous sommes appelés de manière statique, nous ne pouvons pas émettre d'entrées de journal. Les opcodes de journal sont tous dans la plage entre [`LOG0` (A0)](https://www.evm.codes/#a0) et [`LOG4` (A4)](https://www.evm.codes/#a4). Le nombre après l'opcode de journal spécifie combien de sujets l'entrée de journal contient. + - **_w=CALL ∧ μs[2]≠0_** Vous pouvez appeler un autre contrat lorsque vous êtes statique, mais si vous le faites, vous ne pouvez pas lui transférer de l'ETH. + +- **_w = SSTORE ∧ μg ≤ Gcallstipend_** Vous ne pouvez pas exécuter [`SSTORE`](https://www.evm.codes/#55) à moins d'avoir plus de Gcallstipend (défini à 2300 dans l'Annexe G) de gaz. + +## 9.4.3 Validité de la Destination de Saut {#943-jump-dest-valid} + +Ici, nous définissons formellement ce que sont les opcodes [`JUMPDEST`](https://www.evm.codes/#5b). Nous ne pouvons pas simplement chercher la valeur de byte 0x5B, car elle pourrait se trouver à l'intérieur d'un PUSH (et donc être une donnée et non un opcode). + +Dans l'équation (153), nous définissons une fonction, _N(i,w)_. Le premier paramètre, _i_, est la position de l'opcode. Le second, _w_, est l'opcode lui-même. Si _w∈[PUSH1, PUSH32]_, cela signifie que l'opcode est un PUSH (les crochets définissent une plage qui inclut les points d'extrémité). Dans ce cas, le prochain opcode est à _i+2+(w−PUSH1)_. Pour [`PUSH1`](https://www.evm.codes/#60), nous devons avancer de deux bytes (le PUSH lui-même et la valeur d'un byte), pour [`PUSH2`](https://www.evm.codes/#61) nous devons avancer de trois bytes car c'est une valeur de deux bytes, etc. Tous les autres opcodes EVM ont une longueur d'un byte, donc dans tous les autres cas _N(i,w)=i+1_. + +Cette fonction est utilisée dans l'équation (152) pour définir _DJ(c,i)_, qui est [l'ensemble](https://en.wikipedia.org/wiki/Set_(mathematics)) de toutes les destinations de saut valides dans le code _c_, à partir de la position de l'opcode _i_. Cette fonction est définie de manière récursive. Si _i≥||c||_, cela signifie que nous sommes à la fin ou après la fin du code. Nous ne trouverons plus d'autres destinations de saut, donc retournez simplement l'ensemble vide. + +Dans tous les autres cas, nous examinons le reste du code en passant à l'opcode suivant et en obtenant l'ensemble à partir de celui-ci. _c[i]_ est l'opcode actuel, donc _N(i,c[i])_ est la position du prochain opcode. _DJ(c,N(i,c[i]))_ est donc l'ensemble des destinations de saut valides qui commence au prochain opcode. Si l'opcode actuel n'est pas un `JUMPDEST`, retournez simplement cet ensemble. Si c'est un `JUMPDEST`, incluez-le dans l'ensemble résultant et retournez-le. + +## 9.4.4 Arrêt normal {#944-normal-halt} + +La fonction d'arrêt _H_ peut retourner trois types de valeurs. + +- Si nous ne sommes pas dans un opcode d'arrêt, retournez _∅_, l'ensemble vide. Par convention, cette valeur est interprétée comme un booléen faux. +- Si nous avons un opcode d'arrêt qui ne produit pas de sortie (soit [`STOP`](https://www.evm.codes/#00) ou [`SELFDESTRUCT`](https://www.evm.codes/#ff)), retournez une séquence de bytes de taille zéro comme valeur de retour. Notez que ceci est très différent de l'ensemble vide. Cette valeur signifie que l'EVM s'est vraiment arrêté, il n'y a juste aucune donnée de retour à lire. +- Si nous avons un opcode d'arrêt qui produit une sortie (soit [`RETURN`](https://www.evm.codes/#f3) ou [`REVERT`](https://www.evm.codes/#fd)), retournez la séquence de bytes spécifiée par cet opcode. Cette séquence est prise de la mémoire, la valeur en haut de la pile (_μs[0]_) est le premier byte, et la valeur après elle (_μs[1]_) est la longueur. + +## H.2 Ensemble d'instructions {#h2-instruction-set} + +Avant de passer à la sous-section finale de l'EVM, 9.5, examinons les instructions elles-mêmes. Elles sont définies dans l'Annexe H.2 qui commence à la page 29. Tout ce qui n'est pas spécifié comme changeant avec cet opcode spécifique est censé rester identique. Les variables qui changent sont spécifiées comme \′. + +Par exemple, examinons l'opcode [`ADD`](https://www.evm.codes/#01). + +| Valeur | Mnemonic | δ | α | Description | +| ------:| -------- | - | - | --------------------------------------------------------- | +| 0x01 | ADD | 2 | 1 | Opération d'addition. | +| | | | | _μ′s[0] ≡ μs[0] + μs[1]_ | + +_δ_ est le nombre de valeurs que nous retirons de la pile. Dans ce cas deux, car nous additionnons les deux premières valeurs. + +_α_ est le nombre de valeurs que nous remettons. Dans ce cas une, la somme. + +Ainsi, le nouveau sommet de la pile (_μ′s[0]_) est la somme de l'ancien sommet de la pile (_μs[0]_) et de l'ancienne valeur en dessous (_μs[1]_). + +Au lieu de passer en revue tous les opcodes avec une « liste ennuyeuse », cet article n'explique que les opcodes qui introduisent quelque chose de nouveau. + +| Valeur | Mnemonic | δ | α | Description | +| ------:| --------- | - | - | ---------------------------------------------------------------------------------------------------------- | +| 0x20 | KECCAK256 | 2 | 1 | Calculez le hash Keccak-256. | +| | | | | _μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])_ | +| | | | | _μ′i ≡ M(μis[0],μs[1])_ | + +Il s'agit du premier opcode qui accède à la mémoire (dans ce cas, en lecture seule). Cependant, il pourrait dépasser les limites actuelles de la mémoire, nous devons donc mettre à jour _μi._ Nous faisons cela en utilisant la fonction _M_ définie dans l'équation 328 à la page 29. + +| Valeur | Mnemonic | δ | α | Description | +| ------:| -------- | - | - | --------------------------------- | +| 0x31 | BALANCE | 1 | 1 | Obtenez le solde du compte donné. | +| | | | | ... | + +L'adresse dont nous avons besoin pour trouver le solde est _μs[0] mod 2160_. Le sommet de la pile est l'adresse, mais comme les adresses ne font que 160 bits, nous calculons la valeur [modulo](https://en.wikipedia.org/wiki/Modulo_operation) 2160. + +Si _σ[μs[0] mod 2160] ≠ ∅_, cela signifie qu'il y a des informations sur cette adresse. Dans ce cas, _σ[μs[0] mod 2160]b_ est le solde de cette adresse. Si _σ[μs[0] mod 2160] = ∅_, cela signifie que cette adresse n'est pas initialisée et le solde est zéro. Vous pouvez voir la liste des champs d'information du compte dans la section 4.1 à la page 4. + +La deuxième équation, _A'a ≡ Aa ∪ {μs[0] mod 2160}_, est liée à la différence de coût entre l'accès au stockage chaud (stockage qui a récemment été accédé et est susceptible d'être mis en cache) et le stockage froid (stockage qui n'a pas été accédé et est susceptible de se trouver dans un stockage plus lent qui est plus coûteux à récupérer). _Aa_ est la liste des adresses précédemment accédées par la transaction, qui devraient donc être moins chères à accéder, comme défini dans la section 6.1 à la page 8. Vous pouvez en savoir plus sur ce sujet dans [l'EIP-2929](https://eips.ethereum.org/EIPS/eip-2929). + +| Valeur | Mnemonic | δ | α | Description | +| ------:| -------- | -- | -- | --------------------------------------- | +| 0x8F | DUP16 | 16 | 17 | Duplique le 16e élément de la pile. | +| | | | | _μ′s[0] ≡ μs[15]_ | + +Notez que pour utiliser un élément de la pile, nous devons le retirer, ce qui signifie que nous devons également retirer tous les éléments de la pile au-dessus de lui. Dans le cas de [`DUP`](https://www.evm.codes/#8f) et [`SWAP`](https://www.evm.codes/#9f), cela signifie devoir retirer puis remettre jusqu'à seize valeurs. + +## 9.5 Le cycle d'exécution {#95-exec-cycle} + +Maintenant que nous avons toutes les parties, nous pouvons enfin comprendre comment le cycle d'exécution de l'EVM est documenté. + +L'équation (155) dit qu'étant donné l'état : + +- _σ_ (état global de la blockchain) +- _μ_ (état de l'EVM) +- _A_ (sous-état, changements à effectuer lorsque la transaction se termine) +- _I_ (environnement d'exécution) + +Le nouvel état est _(σ', μ', A', I')_. + +Les équations (156)-(158) définissent la pile et le changement en elle en raison d'un opcode (_μs_). L'équation (159) est le changement de gaz (_μg_). L'équation (160) est le changement dans le compteur de programme (_μpc_). Enfin, les équations (161)-(164) spécifient que les autres paramètres restent les mêmes, sauf s'ils sont explicitement modifiés par l'opcode. + +Avec cela, l'EVM est entièrement défini. + +## Conclusion {#conclusion} + +La notation mathématique est précise et a permis au Livre Jaune de spécifier chaque détail d'Ethereum. Cependant, elle présente quelques inconvénients : + +- Elle ne peut être comprise que par les humains, ce qui signifie que [les tests](https://github.com/ethereum/tests) de conformité doivent être écrits manuellement. +- Les programmeurs comprennent le code informatique. Ils peuvent ou non comprendre la notation mathématique. + +Peut-être pour ces raisons, les nouvelles [spécifications de la couche de consensus](https://github.com/ethereum/consensus-specs/blob/dev/tests/core/pyspec/README.md) sont écrites en Python. Il existe des [spécifications de la couche d'exécution en Python](https://ethereum.github.io/execution-specs), mais elles ne sont pas complètes. Jusqu'à ce que le Livre Jaune soit également traduit en Python ou dans un langage similaire, le Livre Jaune continuera d'être utilisé, et il est utile de pouvoir le lire. diff --git a/public/content/translations/fr/eips/index.md b/public/content/translations/fr/eips/index.md index 017aef3acd4..99d4f42918e 100644 --- a/public/content/translations/fr/eips/index.md +++ b/public/content/translations/fr/eips/index.md @@ -26,7 +26,7 @@ Le dépôt [GitHub des EIP](https://github.com/ethereum/EIPs) a été créé en Les éditeurs d'EIP ont pour tâche de passer en revue les EIP pour en vérifier la solidité technique, les problèmes de formatage et corriger l'orthographe, la grammaire et le style de code. Martin Becze, Vitalik Buterin, Gavin Wood et quelques autres ont été les éditeurs d'origine des EIP de 2015 à fin 2016. -Les éditeurs d'EIP actuels sont +Les éditeurs d'EIP actuels sont  - Alex Beregszaszi (@axic) - Gavin John (@Pandapip1) @@ -46,7 +46,7 @@ Les éditeurs Emeritus EIP sont Si vous souhaitez devenir un éditeur EIP, veuillez consulter [EIP-5069](https://eips.ethereum.org/EIPS/eip-5069). -Les éditeurs d'EIP décident du moment où une proposition peut devenir une EIP, et aident les auteurs d'EIP à faire avancer leurs propositions. [Les Ethereum Cat Herders](https://ethereumcatherders.com/) aident à organiser des réunions entre les éditeurs d'EIP et la communauté (voir [EIPIP](https://github.com/ethereum-cat-herders/EIPIP)). +Les éditeurs d'EIP décident du moment où une proposition peut devenir une EIP, et aident les auteurs d'EIP à faire avancer leurs propositions. [Les Ethereum Cat Herders](https://www.ethereumcatherders.com/) aident à organiser des réunions entre les éditeurs d'EIP et la communauté (voir [EIPIP](https://github.com/ethereum-cat-herders/EIPIP)). Le processus complet de normalisation ainsi que la charte sont détaillés dans le document [EIP-1](https://eips.ethereum.org/EIPS/eip-1) diff --git a/public/content/translations/fr/energy-consumption/index.md b/public/content/translations/fr/energy-consumption/index.md index f8d4be8680c..f6513279d77 100644 --- a/public/content/translations/fr/energy-consumption/index.md +++ b/public/content/translations/fr/energy-consumption/index.md @@ -8,32 +8,34 @@ lang: fr Ethereum est une blockchain verte. Le mécanisme de consensus par [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) d'Ethereum utilise de l'ETH au lieu [d'énergie pour sécuriser le réseau](/developers/docs/consensus-mechanisms/pow). La consommation énergétique d'Ethereum est approximativement [0.0026 TWh/an](https://carbon-ratings.com/eth-report-2022) pour l'ensemble du réseau. -L'estimation de la consommation énergétique d'Ethereum se base sur une étude réalisée par le [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com). Ils ont généré des estimations détaillées de la consommation d'électricité et de l'empreinte carbone du réseau Ethereum ([voir le rapport](https://carbon-ratings.com/eth-report-2022)). Ils ont mesuré la consommation d'électricité de différents nœuds avec différentes configurations matérielles et différents logiciels clients. Ils ont estimé que les **2,601 MWh** (0.0026 TWh) d'électricité consommés annuellement par le réseau correspond à **870 tonnes CO2e** annuelles en appliquant des facteur régionaux d'ntensité de carbone. Cette valeur change au fur et à mesure que des nœuds entrent et sortent du réseau. Vous pouvez suivre ces variations grâce à l'Indice de Durabilité du Réseau Blockchain de Cambridge qui offre une estimation moyenne sur 7 jours (notez qu'ils utilisent une méthode légèrement différente pour leurs estimations - plus de détails sont disponibles sur leur site). +L'estimation de la consommation énergétique d'Ethereum se base sur une étude réalisée par le [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com). Ils ont généré des estimations détaillées de la consommation d'électricité et de l'empreinte carbone du réseau Ethereum ([voir le rapport](https://carbon-ratings.com/eth-report-2022)). Ils ont mesuré la consommation d'électricité de différents nœuds avec différentes configurations matérielles et différents logiciels clients. Ils ont estimé que les **2,601 MWh** (0.0026 TWh) d'électricité consommés annuellement par le réseau correspond à **870 tonnes CO2e** annuelles en appliquant des facteur régionaux d'ntensité de carbone. Cette valeur change au fur et à mesure que des nœuds entrent et sortent du réseau. Vous pouvez suivre ces variations grâce à [l'Indice de Durabilité du Réseau Blockchain de Cambridge](https://ccaf.io/cbnsi/ethereum) qui offre une estimation moyenne sur 7 jours (notez qu'ils utilisent une méthode légèrement différente pour leurs estimations - plus de détails sont disponibles sur leur site). -Pour replacer la consommation énergétique d'Ethereum dans son contexte, nous pouvons comparer les estimations annualisées d'autres secteurs industriels. Cela nous aide à mieux comprendre si l'estimation pour Ethereum est élevée ou faible. +Pour replacer la consommation énergétique d'Ethereum dans son contexte, nous pouvons comparer les estimations annualisées d'autres biens et secteurs industriels. Cela nous aide à mieux comprendre si l'estimation pour Ethereum est élevée ou faible. -Le tableau ci-dessous montre la consommation énergétique estimée annuellement en TWh/an pour Ethereum, comparée à plusieurs autres secteurs. Les estimations fournies proviennent d'informations publiquement disponibles (consultées en mai 2023). Les liens vers les sources sont disponibles dans le tableau ci-dessous : +Le tableau ci-dessous montre la consommation énergétique estimée en TWh/an pour Ethereum, comparée à plusieurs autres biens et secteurs. Les estimations fournies proviennent d'informations publiquement disponibles, consultées en juillet 2023, les liens vers les sources sont disponibles dans le tableau ci-dessous. -| | Consommation d’énergie annualisée (TWh) | Comparaison avec Ethereum PoS | Source | -| :------------------------- | :-------------------------------------: | :---------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Centres de données globaux | 200 | 77,000x | [source](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | -| Extraction d'or | 131 | 50 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) | -| Bitcoin | 131 | 50 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) | -| Ethereum PoW | 78 | 30 000 x | [source](https://digiconomist.net/ethereum-energy-consumption) | -| Youtube (direct seulement) | 12 | 4600x | [source](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf) | -| Jeux vidéos aux États-Unis | 34 | 13 000 x | [source](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | -| Netflix | 0,451 | 173 x | [source](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | -| PayPal | 0,26 | 100 x | [source](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261) | -| Airbnb | 0,02 | 8x | [source]() | -| Ethereum PoS | 0,0026 | 1 x | [source](https://carbon-ratings.com/eth-report-2022) | +| | Consommation d’énergie annualisée (TWh) | Comparaison avec Ethereum PoS | Source | +|:------------------------------ |:---------------------------------------:|:-----------------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| Centres de données globaux | 190 | 73 000 x | [source](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | +| Bitcoin | 149 | 53 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) | +| Extraction d'or | 131 | 50 000 x | [source](https://ccaf.io/cbnsi/cbeci/comparisons) | +| Jeux vidéos aux États-Unis\* | 34 | 13 000 x | [source](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | +| Ethereum PoW | 21 | 8 100 x | [source](https://ccaf.io/cbnsi/ethereum/1) | +| Google | 19 | 7 300 x | [source](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) | +| Netflix | 0,457 | 176 x | [source](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | +| PayPal | 0,26 | 100 x | [source](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-(1).pdf) | +| Airbnb | 0,02 | 8 x | [source](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-(Final).pdf) | +| **Ethereum PoS** | **0,0026** | **1 x** | [source](https://carbon-ratings.com/eth-report-2022) | -Il est difficile d'obtenir des estimations précises de la consommation d'énergie, en particulier lorsque ce qui est mesuré a une chaîne d'approvisionnement complexe ou des caractéristiques de déploiement qui influencent son efficacité. Prenons Netflix ou Youtube comme exemples. Les estimations de leur consommation d'énergie varient selon qu'elles incluent uniquement l'énergie utilisée pour entretenir leurs systèmes et fournir du contenu aux utilisateurs (_dépenses directes_) ou qu'elles incluent les dépenses nécessaires pour produire du contenu, gérer les bureaux de l'entreprise, faire de la publicité, etc (_dépenses indirectes_). L'utilisation indirecte pourrait également inclure l'énergie nécessaire à la consommation de contenu sur les appareils des utilisateurs finaux tels que les téléviseurs, les ordinateurs et les téléphones portables, ce qui dépend également des appareils utilisés. +\*Comprend les appareils des utilisateurs finaux tels que les PC, les ordinateurs portables et les consoles de jeu. -Cette question est abordée sur [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix). Dans le tableau ci-dessus, la valeur déclarée pour Netflix comprend l'utilisation _directe_ et _indirecte_ déclarée par l'entreprise. Youtube ne fournit qu'une estimation de sa propre _dépense énergétique directe_, qui est d'environ [12 TWh/an](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf). +Obtenir des estimations précises de la consommation d'énergie est difficile, en particulier lorsque ce qui est mesuré a une chaîne d'approvisionnement complexe ou des caractéristiques de déploiement qui influencent son efficacité. Par exemples : les estimations de consommation d'énergie de Netflix et Google varient selon qu'elles incluent uniquement l'énergie utilisée pour entretenir leurs systèmes et fournir du contenu aux utilisateurs (_dépenses directes_) ou qu'elles incluent les dépenses nécessaires pour produire du contenu, gérer les bureaux de l'entreprise, faire de la publicité, etc (_dépenses indirectes_). Les dépenses indirectes pourraient également inclure l'énergie nécessaire à la consommation de contenu sur les appareils des utilisateurs finaux tels que les téléviseurs, les ordinateurs et les téléphones portables. -Le tableau et le graphique ci-dessus comprennent également des comparaisons avec Bitcoin et Ethereum proof-of-work. Il est important de noter que la consommation d'énergie des réseaux de preuve de travail n'est pas statique - elle évolue au jour le jour. La valeur utilisée pour Ethereum proof-of-work est celle juste avant [La Fusion](/roadmap/merge/), comme prédit par [Digiconomist](https://digiconomist.net/ethereum-energy-consumption). D'autres sources, telles que le [Cambridge Blockchain Network Sustainability Index](https://ccaf.io/cbnsi/ethereum/1) estiment que la consommation d'énergie a été beaucoup plus faible (plus proche de 20 TWh/an). Les estimations de la consommation d'énergie de Bitcoin varient également considérablement d'une source à l'autre et c'est un sujet qui suscite de nombreux [débats](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) nuancés non seulement sur la quantité d'énergie consommée, mais aussi sur les sources de cette énergie et l'éthique qui s'y rattache. La consommation d'énergie ne correspond pas nécessairement à l'empreinte environnementale, car différents projets peuvent utiliser différentes sources d'énergie, par exemple une proportion plus ou moins grande d'énergies renouvelables. Par exemple, le [Cambridge Bitcoin Electricity Consumption Index](https://ccaf.io/cbnsi/cbeci/comparisons) indique que la demande du réseau Bitcoin pourrait théoriquement être alimentée par le brûlage de gaz ou par de l'électricité qui serait autrement perdue lors de la transmission et de la distribution. La voie de la durabilité empruntée par Ethereum a consisté à remplacer la partie du réseau gourmande en énergie par une alternative verte. +Les estimations ci-dessus ne sont pas des comparaisons parfaites. Le montant des dépenses indirectes prises en compte varie selon la source et inclut rarement l'énergie provenant des appareils des utilisateurs finaux. Chaque source sous-jacente contient plus de détails sur ce qui est mesuré. + +Le tableau et le graphique ci-dessus comprennent également des comparaisons avec Bitcoin et Ethereum proof-of-work. Il est important de noter que la consommation d'énergie des réseaux de preuve de travail n'est pas statique et elle évolue au jour le jour. Les estimations peuvent également varier considérablement d'une source à l'autre. Le sujet suscite un [débat](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) nuancé, non seulement sur la quantité d'énergie consommée, mais aussi sur les sources de cette énergie et l'éthique qui s'y rattache. La consommation d'énergie ne correspond pas nécessairement à l'empreinte environnementale, car différents projets peuvent utiliser différentes sources d'énergie, avec une proportion plus ou moins grande d'énergies renouvelables. Par exemple, le [Cambridge Bitcoin Electricity Consumption Index](https://ccaf.io/cbnsi/cbeci/comparisons) indique que la demande du réseau Bitcoin pourrait théoriquement être alimentée par le brûlage de gaz ou par de l'électricité qui serait autrement perdue lors de la transmission et de la distribution. La voie de la durabilité empruntée par Ethereum a consisté à remplacer la partie du réseau gourmande en énergie par une alternative verte. Vous pouvez consulter les estimations de la consommation d'énergie et des émissions de carbone pour de nombreuses industries sur le site [Cambridge Blockchain Network Sustainability Index](https://ccaf.io/cbnsi/ethereum). @@ -41,21 +43,21 @@ Vous pouvez consulter les estimations de la consommation d'énergie et des émis De nombreux articles estiment les dépenses énergétiques pour les blockchains « par transaction ». Cela peut être trompeur dans la mesure où l'énergie nécessaire pour proposer et valider un bloc est indépendante du nombre de transactions qu'il contient. Une unité de dépense énergétique par transaction implique qu'un nombre moins élevé de transactions entraînerait une moindre dépense énergétique et vice-versa, ce qui n'est pas le cas. En outre, l'estimation par transaction dépend fortement de la façon dont le débit de transaction d'une blockchain est défini, sachant qu'il est possible de jouer avec cette définition pour que la valeur semble plus ou moins grande. -Par exemple, sur Ethereum, le débit de transaction n'est pas seulement celui de la couche de base - c'est aussi la somme du débit de transaction de tous ses rollups de « [couche 2](/layer-2/) ». Les couches 2 ne sont généralement pas incluses dans les calculs, mais la prise en compte de l'énergie supplémentaire consommée par les séquenceurs (faible) et du nombre de transactions qu'ils traitent (élevé) réduirait probablement considérablement les estimations par transaction. C'est l'une des raisons pour lesquelles les comparaisons de consommation d'énergie par transaction entre plateformes peuvent être trompeuses. +Sur Ethereum par exemple, le débit de transaction n'est pas seulement celui de la couche de base - c'est aussi la somme du débit de transaction de tous ses rollups de « [couche 2](/layer-2/) ». Les couches 2 ne sont généralement pas incluses dans les calculs, mais la prise en compte de l'énergie supplémentaire consommée par les séquenceurs (faible) et du nombre de transactions qu'ils traitent (élevé) réduirait probablement considérablement les estimations par transaction. C'est l'une des raisons pour lesquelles les comparaisons de consommation d'énergie par transaction entre plateformes peuvent être trompeuses. ## La dette carbone d'Ethereum {#carbon-debt} Les dépenses énergétiques d'Ethereum sont très faibles, mais cela n'a pas toujours été le cas. Ethereum utilisait à l'origine la preuve de travail : celle-ci avait un coût environnemental bien plus élevé que le mécanisme actuel de preuve d'enjeu. -Depuis le tout début, Ethereum prévoyait d'implémenter un mécanisme de consensus par preuve d'enjeu, mais il aura fallu des années de recherches et de développement ciblés pour y parvenir sans sacrifier la sécurité et la décentralisation. Par conséquent, un mécanisme de preuve de travail a été utilisé pour faire démarrer le réseau. Un consensus de preuve de travail exige que les mineurs utilisent leur matériel informatique pour calculer une valeur, en dépensant de l'énergie pendant le processus. +Depuis le tout début, Ethereum prévoyait d'implémenter un mécanisme de consensus par preuve d'enjeu, mais il aura fallu des années de recherches et de développement ciblés pour y parvenir sans sacrifier la sécurité et la décentralisation. C'est pourquoi un mécanisme de preuve de travail a été utilisé pour faire démarrer le réseau. Un consensus de preuve de travail exige que les mineurs utilisent leur matériel informatique pour calculer une valeur, en dépensant de l'énergie pendant le processus. ![Comparaison de la consommation d'énergie d'Ethereum avant et après La Fusion, en utilisant la tour Eiffel (300 mètres de haut) sur la gauche pour symboliser la grande consommation d'énergie avant La Fusion, et une petite figurine Lego de 4 cm de haut sur la droite pour représenter la réduction drastique de consommation d'énergie après La Fusion](energy_consumption_pre_post_merge.png) -Le CCRI estime que The Merge a réduit la consommation d'électricité annualisée d'Ethereum de plus de **99,988%**. De même, l'empreinte carbone d'Ethereum a été réduite d'environ **99,992%** (de 11 016 000 à 870 tonnes de CO2e). Pour mettre les choses en perspective, la réduction des émissions équivaut à passer de la hauteur de la Tour Eiffel à celle d'une petite figurine en plastique, comme l'illustre la figure ci-dessus. Par conséquent, le coût environnemental de la sécurisation du réseau est considérablement réduit. Dans le même temps, la sécurité du réseau est présumée s'être améliorée. +Le CCRI évalue que La Fusion a réduit la consommation d'électricité annualisée d'Ethereum de plus de **99.988%**. De même, l'empreinte carbone d'Ethereum a été réduite d'environ **99,992%** (de 11 016 000 à 870 tonnes de CO2e). Pour mettre les choses en perspective, la réduction des émissions équivaut à passer de la hauteur de la Tour Eiffel à celle d'une petite figurine en plastique, comme l'illustre la figure ci-dessus. Par conséquent, le coût environnemental de la sécurisation du réseau est considérablement réduit. Dans le même temps, la sécurité du réseau est présumée s'être améliorée. ## Une couche d'application verte {#green-applications} -Bien que la consommation d'énergie d'Ethereum soit très faible, il existe également une communauté de [**finance régénérative (ReFi)**](/refi/) substantielle, croissante et très active qui construit sur Ethereum. Les applications ReFi utilisent les composants DeFi pour construire des applications financières présentant des externalités positives bénéfiques pour l'environnement. La ReFi fait partie d'un plus large mouvement [« solarpunk »](https://en.wikipedia.org/wiki/Solarpunk) qui est étroitement aligné avec Ethereum et vise à associer progrès technologiques et gérance environnementale. La nature décentralisée, sans permission et composable d'Ethereum en fait la couche de base idéale pour les communautés ReFi et solarpunk. +Bien que la consommation d'énergie d'Ethereum soit très faible, il existe également une communauté de [**finance régénérative (ReFi)**](/refi/) substantielle, croissante et très active qui construit sur Ethereum. Les applications ReFi utilisent les composants DeFi pour construire des applications financières qui ont des externalités positives au bénéfice de l'environnement. La ReFi fait partie d'un plus large mouvement [« solarpunk »](https://en.wikipedia.org/wiki/Solarpunk) qui est étroitement aligné avec Ethereum et vise à associer progrès technologiques et gérance environnementale. La nature décentralisée, sans permission et composable d'Ethereum en fait la couche de base idéale pour les communautés ReFi et solarpunk. Les plateformes de financement de biens publics natifs Web3 telles que [Gitcoin](https://gitcoin.co) exécutent des rondes climatiques pour stimuler la construction écologique sur la couche d'application d'Ethereum. Grâce au développement de ces initiatives (et d'autres comme par exemple [DeSci](/desci/)), Ethereum est en train de devenir une technologie positive sur le plan environnemental et social. diff --git a/public/content/translations/fr/governance/index.md b/public/content/translations/fr/governance/index.md index 43da462401c..12e70f9602c 100644 --- a/public/content/translations/fr/governance/index.md +++ b/public/content/translations/fr/governance/index.md @@ -175,9 +175,9 @@ Lorsque la Chaîne Phare a fusionné avec la couche d'exécution Ethereum le 15 La gouvernance d'Ethereum n'est pas rigoureusement définie. Divers participants de la communauté ont des points de vue différents à ce sujet. Voici quelques-unes d'entre elles : -- [Notes on Blockchain Governance](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Notes on Blockchain Governance](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Comment fonctionne la gouvernance Ethereum ?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [Comment fonctionne la gouvernance Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Qu'est-ce qu'un développeur de base Ethereum ?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [Gouvernance, Partie 2 : La Ploutocratie est encore nuisible](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [Dépasser la gouvernance du vote par pièce](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [Gouvernance, Partie 2 : La Ploutocratie est encore nuisible](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [Dépasser la gouvernance du vote par pièce](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/fr/nft/index.md b/public/content/translations/fr/nft/index.md index 3dd6d79c31f..63efac236b7 100644 --- a/public/content/translations/fr/nft/index.md +++ b/public/content/translations/fr/nft/index.md @@ -14,15 +14,15 @@ summaryPoint3: Propulsés par des contrats intelligents sur la blockchain Ethere ## Que sont les NFT ? {#what-are-nfts} -Les NFT sont des jetons qui sont individuellement uniques. Chaque NFT a des propriétés différentes (non fongibles) et sa rareté est prouvée. Cela diffère des jetons tels que les ERC-20, pour lesquels chaque jeton d'un ensemble est identique et possède les mêmes propriétés ("fongible"). Vous ne vous souciez pas de savoir quel billet de banque vous avez dans votre portefeuille, parce qu'ils sont tous identiques et valent tous la même chose. Cependant, vous vous souciez de savoir quel NFT spécifique vous possédez, car ils ont tous des propriétés individuelles qui les distinguent des autres ("non fongibles"). +Les NFT sont des jetons qui sont individuellement uniques. Chaque NFT a des propriétés différentes (non fongibles) et sa rareté est prouvée. Il diffère des jetons tels que l'ETH ou d'autres jetons basés sur Ethereum comme l'USDC, où chaque jeton est identique et possède les mêmes propriétés ("fongibles"). Vous ne vous souciez pas de savoir quel type de billet (ou d'ETH) vous possédez dans votre portefeuille, parce qu'ils sont tous identiques et valent tous la même chose. Cependant, vous vous souciez de savoir quel NFT spécifique vous possédez, car ils ont tous des propriétés individuelles qui les distinguent des autres ("non fongibles"). -Le caractère unique de chaque NFT permet la tokenisation de choses telles que l'art, les objets de collection ou même l'immobilier, où un NFT unique et spécifique représente un objet numérique ou réel unique et spécifique. La propriété d'un actif est sécurisée par la blockchain Ethereum – personne ne peut modifier le dossier de propriété ou copier/coller un nouveau NFT dans l'existence. +Le caractère unique de chaque NFT permet la tokenisation de choses telles que l'art, les objets de collection ou même l'immobilier, où un NFT unique et spécifique représente un objet numérique ou réel unique et spécifique. La propriété d'un actif est publiquement vérifiable sur la blockchain Ethereum. ## L'internet des ressources {#internet-of-assets} -Les NFT et Ethereum résolvent certains des problèmes qui se posent aujourd'hui sur l'internet. Comme tout se digitalise de plus en plus, il est nécessaire de reproduire les propriétés des objets physiques comme la rareté, l'unicité et la preuve de propriété. Et cela d'une manière qui n'est pas contrôlée par une organisation centrale. Par exemple, avec les NFT, vous pouvez posséder un mp3 musical qui n'est pas spécifique à l'application musicale d'une entreprise, ou vous pouvez posséder un identifiant de média social que vous pouvez vendre ou échanger, mais qui ne peut pas vous être retiré arbitrairement par un fournisseur de plateforme. +Les NFT et Ethereum résolvent certains des problèmes qui se posent aujourd'hui sur l'internet. Alors que tout devient de plus en plus numérique, il y a un besoin de reproduire les propriétés des objets physiques tels que la rareté, l'unicité et la preuve de propriété d'une manière qui n'est pas contrôlée par une entité centralisée. Par exemple, avec les NFT, vous pouvez posséder un fichier mp3 de musique dans toutes les applications basées sur Ethereum et ne pas être lié à l'application musicale spécifique d'une société comme Spotify ou Apple Music. Vous pouvez posséder un identifiant de média social que vous pouvez vendre ou échanger, mais qui ne peut pas vous être retiré arbitrairement par un fournisseur de plateforme. Voici à quoi ressemble un internet de NFT par rapport à l'internet que la plupart d'entre nous utilisons aujourd'hui... @@ -30,20 +30,14 @@ Voici à quoi ressemble un internet de NFT par rapport à l'internet que la plup | Un internet NFT | Internet aujourd'hui | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Vous êtes propriétaire de vos biens ! Vous seul pouvez les vendre ou les échanger. | Vous louez un bien à une organisation. | +| Vous êtes propriétaire de vos biens ! Vous seul pouvez les vendre ou les échanger. | Vous louez un actif à une organisation et il peut vous être retiré. | | Les NFT sont uniques sur le plan numérique ; il n'y aura jamais deux NFT identiques. | Une copie d'une entité ne peut souvent pas être distinguée de l'original. | | La propriété d'un NFT est stockée sur la blockchain et peut être vérifiée par n'importe qui. | L'historique de propriété des articles numériques sont stockés sur des serveurs contrôlés par des institutions – vous devez les croire sur parole. | | Les NFT sont des contrats intelligents sur Ethereum. Cela signifie qu'ils peuvent facilement être utilisés dans d'autres contrats intelligents et applications sur Ethereum ! | Les entreprises qui possèdent des produits numériques ont généralement besoin de leur propre infrastructure de type "jardin fermé". | | Les créateurs de contenu peuvent vendre leur travail n'importe où et accéder à un marché mondial. | Les créateurs dépendent de l'infrastructure et de la distribution des plates-formes qu'ils utilisent. Celles-ci sont souvent soumises à des conditions d'utilisation et à des restrictions géographiques. | | Les créateurs de NFT peuvent conserver les droits de propriété sur leur propre travail et programmer les redevances directement dans le contrat NFT. | Les plateformes, telles que les services de diffusion de musique en streaming, conservent la majorité des bénéfices tirés des ventes. | -## Comment fonctionnent les NFT ? {#how-nfts-work} - -Comme tout jeton émis sur Ethereum, les NFT sont émis par un contrat intelligent. Le contrat intelligent est conforme à l'une des normes NFT (généralement ERC-721 ou ERC-1155) qui définissent les fonctions du contrat. Le contrat peut créer ("frapper") des NFT et les attribuer à un propriétaire spécifique. La propriété est définie dans le contrat en associant des NFT spécifiques à des adresses spécifiques. Le NFT possède un identifiant et, généralement, des métadonnées qui lui sont associées et qui rendent le jeton spécifique unique. - -Quand quelqu'un crée ou frappe un NFT, il exécute en réalité une fonction du contrat intelligent qui attribue un NFT spécifique à son adresse. Cette information est stockée dans la mémoire du contrat, qui fait partie de la blockchain. Le créateur du contrat peut intégrer une logique supplémentaire dans le contrat, par exemple en limitant l'offre totale ou en définissant une redevance à verser au créateur chaque fois qu'un jeton est transféré. - -## Comment les NFTs sont-ils utilisés ? {#nft-use-cases} +## Comment les NFT sont-ils utilisés ? {#nft-use-cases} Les NFT sont utilisés pour de nombreuses choses, notamment : @@ -58,11 +52,11 @@ Les NFT sont utilisés pour de nombreuses choses, notamment : - noms de domaines Internet décentralisés - collatéral en DeFi -Vous êtes peut-être un artiste qui souhaite partager ses œuvres à l'aide de NFT, sans en perdre le contrôle et sans sacrifier ses bénéfices à des intermédiaires. Vous pouvez créer un nouveau contrat et spécifier le nombre de NFT, leurs propriétés et un lien vers une œuvre d'art spécifique. En tant qu'artiste, vous pouvez programmer dans le contrat intelligent les redevances qui doivent vous être versées (par exemple, transférer 5 % du prix de vente au propriétaire du contrat à chaque fois qu'un NFT est transféré). Vous pouvez également toujours prouver que vous avez créé les NFT parce que vous possédez le portefeuille qui a déployé le contrat. Vos acheteurs peuvent facilement prouver qu'ils possèdent un authentique NFT de votre collection car leur adresse de portefeuille est associée à un jeton dans votre contrat intelligent. Ils peuvent l'utiliser dans l'écosystème Ethereum en ayant confiance dans leur authenticité. +Vous êtes peut-être un artiste qui souhaite partager ses œuvres à l'aide de NFT, sans en perdre le contrôle et sans sacrifier ses bénéfices à des intermédiaires. Vous pouvez créer un nouveau contrat et spécifier le nombre de NFT, leurs propriétés et un lien vers une œuvre d'art spécifique. En tant qu'artiste, vous pouvez programmer dans le contrat intelligent les redevances qui doivent vous être versées (par exemple, transférer 5 % du prix de vente au propriétaire du contrat à chaque fois qu'un NFT est transféré). Vous pouvez également toujours prouver que vous avez créé les NFT parce que vous possédez le portefeuille qui a déployé le contrat. Vos acheteurs peuvent facilement prouver qu'ils possèdent un authentique NFT de votre collection car leur adresse de portefeuille est associée à un jeton dans votre contrat intelligent. Ils peuvent l'utiliser dans l'écosystème Ethereum, sûrs de son authenticité. -Par exemple, pensez à un billet pour un événement sportif. Tout comme l'organisateur d'un événement peut décider du nombre de billets à vendre, le créateur d'un NFT peut décider du nombre de répliques existantes. Il s'agit parfois de répliques exactes telles que 5 000 billets d'admission générale. Parfois, plusieurs très similaires sont créés, chacun légèrement différent, comme un billet avec un siège assigné. Ils peuvent être achetés et vendus de pair à pair sans avoir à payer de frais de billetterie et l'acheteur peut toujours s'assurer de l'authenticité du billet en vérifiant l'adresse du contrat. +Par exemple, pensez à un billet pour un événement sportif. Tout comme l'organisateur d'un événement peut décider du nombre de billets à vendre, le créateur d'un NFT peut décider du nombre de répliques existantes. Il s'agit parfois de répliques exactes telles que 5 000 billets d'entrée générale. Parfois, plusieurs très similaires sont créés, chacun légèrement différent, comme un billet avec un siège assigné. Ils peuvent être achetés et vendus de pair à pair sans avoir à payer de frais de billetterie et l'acheteur peut toujours s'assurer de l'authenticité du billet en vérifiant l'adresse du contrat. -Sur ethereum.org, les NFT sont utilisés pour montrer que des personnes ont contribué à notre dépôt GitHub ou assisté à des appels, et nous avons même notre propre nom de domaine NFT. Si vous contribuez à ethereum.org, vous pouvez demander un POAP NFT. Certains rassemblements crypto ont utilisé des POAP comme billets. [Plus d'infos sur la contribution](/contributing/#poap). +Sur ethereum.org, les NFT sont utilisés pour démontrer que des personnes ont contribué de manière significative à notre dépôt Github (programmation du site web, rédaction ou modification d'un article...), ont traduit notre contenu, ou ont participé à nos appels à la communauté, et nous avons même notre propre nom de domaine NFT. Si vous contribuez à ethereum.org, vous pouvez demander un POAP NFT. Certains rassemblements crypto ont utilisé des POAP comme billets. [Plus d'infos sur la contribution](/contributing/#poap). ![POAP ethereum.org](./poap.png) @@ -72,6 +66,20 @@ Ce site web dispose également d'un nom de domaine alternatif NFT, **ethereum.et +## Comment fonctionnent les NFT ? {#how-nfts-work} + +Les NFT, comme tous les objets numériques de la blockchain Ethereum, sont créés par un programme informatique spécial basé sur Ethereum appelé "contrat intelligent". Ces contrats suivent certaines règles, comme les normes ERC-721 ou ERC-1155, qui déterminent ce que le contrat peut faire. + +Le contrat intelligent NFT peut accomplir quelques tâches essentielles : + +- **Création de NFT :** Il peut créer de nouveaux NFT. +- **Attribution de la propriété :** Il permet de savoir qui possède quels NFT en les reliant à des adresses Ethereum spécifiques. +- **Attribution d'un identifiant à chaque NFT :** Chaque NFT possède un numéro qui le rend unique. En outre, il est généralement accompagné d'informations (métadonnées) décrivant ce qu'il représente. + +Lorsque quelqu'un "crée" ou "frappe" un NFT, il demande au contrat intelligent de lui donner la propriété d'un NFT particulier. Cette information est stockée publiquement et en toute sécurité dans la blockchain. + +En outre, le créateur du contrat peut ajouter des règles supplémentaires. Elles peuvent limiter le nombre d'exemplaires d'un certain NFT ou décider qu'ils recevront une petite redevance chaque fois que le NFT changera de mains. + ### Sécurité NFT {#nft-security} La sécurité d'Ethereum émane de la preuve d'enjeu. Le système est conçu pour décourager économiquement les actions malveillantes, ce qui rend Ethereum infalsifiable. C'est ce qui rend les NFT possibles. Une fois le bloc contenant votre transaction NFT finalisé, un attaquant devrait dépenser des millions d'ETH pour le modifier. Quiconque exécute un logiciel Ethereum serait immédiatement capable de détecter des manipulations malhonnêtes avec un NFT, et la personne malveillante serait économiquement pénalisée et rejetée. diff --git a/public/content/translations/fr/roadmap/account-abstraction/index.md b/public/content/translations/fr/roadmap/account-abstraction/index.md new file mode 100644 index 00000000000..6459b5659ee --- /dev/null +++ b/public/content/translations/fr/roadmap/account-abstraction/index.md @@ -0,0 +1,126 @@ +--- +title: Abstraction de comptes +description: Un aperçu des plans d'Ethereum pour simplifier et sécuriser les comptes utilisateurs +lang: fr +summaryPoints: + - L'abstraction du compte facilite de manière significative la création de portefeuilles de contrats intelligents + - Les portefeuilles de contrats intelligents facilitent la gestion de l'accès aux comptes Ethereum + - Les clés perdues ou exposées peuvent être récupérées en faisant plusieurs sauvegardes +--- + +# Abstraction de comptes {#account-abstraction} + +Les utilisateurs interagissent sur Ethereum en utilisant des **[ comptes détenus en externe (EOA)](/glossary/#eoa)**. C'est la seule façon de démarrer une transaction ou d'exécuter un contrat intelligent. Ce qui restreint la façon dont les utilisateurs peuvent interagir sur Ethereum. Par exemple, il est difficile d'exécuter des lots de transactions si les utilisateurs ne disposent pas d'un solde d'ETH suffisant pour couvrir les frais de gaz. + +L'abstraction de compte est un moyen de résoudre ces problèmes car elle offre aux utilisateurs plus de flexibilité et donc plus de sécurité pour une meilleure expérience avec leur compte. Cela peut se produire en [mettant à niveau les EOA](https://eips.ethereum.org/EIPS/eip-3074) afin qu'ils puissent être contrôlés par des contrats intelligents, ou en [ mettant à niveau les contrats intelligents](https://eips.ethereum.org/EIPS/eip-2938) pour qu'ils puissent initier des transactions. Ces deux options nécessitent des modifications du protocole Ethereum. Il existe également une troisième voie qui consiste à ajouter un [second système de transaction distinct](https://eips.ethereum.org/EIPS/eip-4337) fonctionnant parallèlement au protocole existant. Indépendamment du procédé, le résultat est l'accès à Ethereum via des portefeuilles de contrats intelligents, soit nativement pris en charge par le protocole existant, soit par l'intermédiaire d'un réseau de transactions complémentaires. + +Les portefeuilles de contrats intelligents offrent de nombreux avantages à l'utilisateur, notamment : + +- définir ses propres règles de sécurité flexibles +- restaurer son compte en cas de perte des clés +- partager la sécurité de son compte sur des appareils ou avec des personnes de confiance +- payer les frais de gaz pour quelqu'un d'autre, ou faire payer les vôtres par quelqu'un d'autre +- faire des lots de transaction (par exemple, approuver et exécuter un swap en une seule fois) +- plus de possibilités pour les dApps et les développeurs de portefeuilles d'innover en matière d'expérience utilisateur + +Ces avantages ne sont pas pris en charge de manière native aujourd'hui, car seuls les comptes externes ([EOA](/glossary/#eoa)) peuvent initier des transactions. Les EOA sont simplement des paires de clés publiques-privées. Ils fonctionnent comme ceci : + +- si vous avez la clé privée, vous pouvez faire _tout ce que vous voulez_ dans le respect des règles de la Machine virtuelle Ethereum (EVM) +- si vous n'avez pas la clé privée, vous ne pouvez _rien_ faire. + +Si vous perdez vos clés, il sera impossible de les récupérer. Par ailleurs, les clés volées permettent aux voleurs d'accéder instantanément à tous les fonds disponibles sur un compte. + +Les portefeuilles de contrats intelligents sont la solution à ces problèmes, mais ils sont aujourd'hui difficiles à programmer car, en fin de compte, toute logique qu'ils implémentent doit être traduite en un ensemble de transactions EOA avant de pouvoir être traitée par Ethereum. L'abstraction de compte permet aux contrats intelligents d'initier eux-mêmes des transactions, de sorte que toute logique que l'utilisateur souhaite mettre en œuvre peut être codée dans le portefeuille du contrat intelligent lui-même et exécutée sur Ethereum. + +Finalement, l'abstraction de compte améliore le support des portefeuilles de contrats intelligents, les rendant plus faciles à développer et plus sûrs à utiliser. En fin de compte, avec l'abstraction de compte, les utilisateurs peuvent profiter de tous les avantages d'Ethereum sans avoir besoin de connaître ou de se soucier de la technologie sous-jacente. + +## En finir avec les phrases de récupération {#beyond-seed-phrases} + +Les comptes d'aujourd'hui sont sécurisés en utilisant des clés privées calculées à partir de phrases de récupération. Toute personne ayant accès à une phrase de récupération peut facilement découvrir la clé privée protégeant un compte et gagner l'accès à tous les actifs qu'il contient. Si une clé privée et une phrase de récupération sont perdues, elles ne pourront jamais être récupérées et les actifs qu'elles contrôlent seront figés à jamais. La sécurisation de ces phrases de récupération est compliquée, même pour les utilisateurs expérimentés, et l'hameçonnage de phrases de récupération est l'une des méthodes les plus courantes utilisées pour arnaquer les utilisateurs. + +L'abstraction de compte résoudra ce problème en utilisant un contrat intelligent pour détenir les actifs et autoriser les transactions. Ces contrats intelligents peuvent ensuite être agrémentés de logiques personnalisées pour les rendre aussi sécurisés et adaptés à l'utilisateur que possible. Au bout du compte, vous utiliserez toujours des clés privées pour contrôler l'accès à votre compte, mais avec des filets de sécurité qui les rendront plus faciles et plus sûres à gérer. + +Par exemple, des clés de secours peuvent être ajoutées à un portefeuille afin que si vous perdiez ou exposiez accidentellement votre clé principale, elle puisse être remplacée par une nouvelle clé sécurisée de secours. Vous pourriez sécuriser chacune de ces clés différemment ou les répartir entre des gardiens de confiance. Cela rend beaucoup plus difficile pour un voleur de prendre le contrôle total de vos fonds. De même, vous pouvez ajouter des règles au portefeuille pour réduire l'impact en cas de compromission de votre clé principale, par exemple vous pourriez autoriser les transactions de faible valeur à être vérifiées par une seule signature, tandis que les transactions de plus grande valeur nécessitent l'approbation de plusieurs signataires authentifiés. Il existe d'autres moyens par lesquels les portefeuilles de contrats intelligents peuvent vous aider à contrecarrer les voleurs, par exemple, une liste blanche peut être utilisée pour bloquer toutes les transactions à moins qu'elles ne soient destinées à une adresse de confiance ou vérifiées par plusieurs de vos clés pré-approuvées. + +### Exemples de logiques de sécurité pouvant être intégrées dans un portefeuille de contrat intelligent : + +- **Autorisation multi-signatures**: vous pouvez partager les identifiants d'autorisation entre plusieurs personnes ou appareils de confiance. Alors, le contrat peut être configuré de telle sorte que les transactions d'une valeur supérieure à une certaine valeur prédéfinie nécessitent l'autorisation d'une certaine proportion (par exemple 3/5) des parties de confiance. Par exemple, les transactions de valeur élevée pourraient nécessiter l'approbation à la fois d'un appareil mobile et d'un portefeuille matériel, ou les signatures de comptes distribués à des membres de la famille de confiance. +- **Gel de compte** : si un appareil est perdu ou compromis, le compte peut être verrouillé depuis un autre appareil autorisé, protégeant ainsi les actifs de l'utilisateur. +- **Récupération de compte** : vous avez perdu un appareil ou oublié un mot de passe ? Dans le paradigme actuel, cela signifie que vos actifs pourraient être gelés à jamais. Avec un portefeuille de contrat intelligent, vous pouvez définir des comptes pré-approuvés pouvant autoriser de nouveaux appareils et réinitialiser l'accès. +- **Définir des limites de transaction**: Spécifiez des seuils quotidiens pour la valeur maximale pouvant être transférée depuis le compte par jour/semaine/mois. Cela signifie que si un attaquant prend le contrôle de votre compte, il ne pourra pas tout vider d'un coup, et vous aurez l'occasion de geler et de réinitialiser l'accès. +- **Créer des listes blanches** : n'autorisez que les transactions vers certaines adresses que vous savez être sûres. Cela signifie que _même si_ votre clé privée était volée, l'attaquant ne pourrait pas envoyer de fonds vers des comptes de destination qui ne sont pas sur la liste blanche. Ces listes blanches nécessiteraient plusieurs signatures pour être modifiées, de sorte qu'un attaquant ne pourrait pas ajouter sa propre adresse à la liste à moins d'avoir accès à plusieurs de vos clés de sauvegarde. + +## Meilleure expérience utilisateur {#better-user-experience} + +L'abstraction de compte permet une **meilleure expérience utilisateur globale** ainsi qu'une **sécurité améliorée** car elle ajoute la prise en charge des portefeuilles de contrats intelligents. au niveau du protocole. La raison la plus importante est que cela offrira aux développeurs de contrats intelligents, de portefeuilles et d’applications beaucoup plus de liberté pour innover en matière d’expérience utilisateur d’une manière que nous ne pouvons peut-être pas encore anticiper. Quelques améliorations évidentes qui accompagneront l'abstraction de compte incluent le regroupement des transactions pour plus de rapidité et d'efficacité. Par exemple, un simple échange devrait être une opération en un clic, mais aujourd'hui, il faut signer plusieurs transactions pour approuver les dépenses de chaque jeton individuellement avant que l'échange ne soit exécuté. L'abstraction de compte élimine cette friction en autorisant le regroupement des transactions. De plus, la transaction groupée pourrait approuver précisément la bonne valeur de jetons requise pour chaque transaction, puis révoquer les approbations après la finalisation de la transaction, offrant ainsi une sécurité supplémentaire. + +La gestion du gaz est également nettement améliorée grâce à l'abstraction de comptes. Non seulement les applications peuvent proposer de payer les frais de gaz de leurs utilisateurs, mais les frais de gaz peuvent être payés en jetons autres que l'ETH, ce qui évite aux utilisateurs d'avoir à maintenir un solde d'ETH pour financer les transactions. Cela fonctionnerait en échangeant les jetons de l'utilisateur contre de l'ETH à l'intérieur du contrat, puis en utilisant l'ETH pour payer le gaz. + + + +La gestion du gaz est l'une des principales frictions pour les utilisateurs d'Ethereum, principalement parce que l'ETH est le seul actif qui peut être utilisé pour payer les transactions. Imaginez que vous ayez un portefeuille avec un solde d'USDC, mais pas d'ETH. Vous ne pouvez pas déplacer ou échanger ces jetons USDC parce que vous ne pouvez pas payer le gaz. Vous ne pouvez pas non plus échanger l'USDC contre de l'ETH, car cela coûte du gaz. Pour résoudre le problème, vous devez envoyer plus d'ETH sur votre compte à partir d'un échange ou d'une autre adresse. Avec les portefeuilles de contrats intelligents, vous pouvez simplement payer le gaz en USDC à la place, libérant ainsi votre compte. Vous n'avez plus besoin de conserver un solde d'ETH sur tous vos comptes. + +L'abstraction de comptes permet également aux développeurs de DApp de faire preuve de créativité en matière de gestion du gaz. Par exemple, vous pourriez commencer à payer à votre DEX préféré un montant fixe chaque mois pour un nombre illimité de transactions. Les DApps peuvent vous proposer de payer tous vos frais de gaz en votre nom en guise de récompense pour l'utilisation de leur plateforme, ou en tant qu'offre de démarrage. Il sera beaucoup plus facile pour les développeurs d'innover dans le domaine du gaz lorsque les portefeuilles de contrats intelligents seront pris en charge au niveau du protocole. + + + +Les sessions de confiance sont aussi susceptibles de transformer l'expérience utilisateur, en particulier pour des applications comme les jeux, où un grand nombre de petites transactions doivent être approuvées dans un court laps de temps. L'approbation individuelle de chaque transaction perturberait l'expérience du jeu, mais l'approbation permanente n'est pas sécurisée. Un portefeuille de contrats intelligents, pourrait approuver certaines transactions lors d'un temps fixe jusqu'à une certaine valeur spécifique, ou seulement vers certaines adresses. + +Il est également intéressant de réfléchir à la manière, dont les achats pourraient évoluer avec l’abstraction du compte. Aujourd'hui, chaque transaction doit être approuvée et exécutée depuis un portefeuille préfinancé avec une quantité suffisante du bon jeton. Grâce à l'abstraction des comptes, l'expérience pourrait ressembler davantage aux achats en ligne habituels, où l'utilisateur remplit un « panier » d'articles et clique une seule fois pour les acheter en même temps, avec toute la logique requise étant assurée par le contrat, non par l'utilisateur. + +Ce ne sont là que quelques exemples, de la manière dont l’expérience utilisateur pourrait être améliorée grâce à l’abstraction des comptes, mais il y en a bien d’autres que nous n’avons pas encore imaginés. L'abstraction de compte libère les développeurs des contraintes des EOA actuels, leur permet d'intégrer les bons aspects du web2 dans le web3 sans sacrifier leur propre sécurité, et pirater de manière créative de nouvelles expériences utilisateur inventives. + +## Comment l'abstraction des comptes sera-t-elle mise en œuvre ? {#how-will-aa-be-implemented} + +Aujourd'hui, les portefeuilles de contrats intelligents existent mais sont difficiles à mettre en œuvre car l'EVM ne les prend pas en charge. À la place, ils s’appuient sur un code relativement complexe autour des transactions standard d'Ethereum. Ethereum peut changer cela en permettant aux contrats intelligents d'initier des transactions, adoptant une logique nécessaire dans les contrats intelligents d'Ethereum plutôt que hors chaîne. L'addition de logique dans les contrats intelligents augmente également la décentralisation d'Ethereum, car elle élimine le besoin de « relais » gérés par les développeurs de portefeuilles, pour traduire les messages signés par l'utilisateur lors des transactions régulières Ethereum. + + + +L'EIP-2771 introduit le concept de méta-transactions qui permettent à des tiers de payer les frais de gaz d'un utilisateur sans modifier le protocole Ethereum. L'idée est que les transactions signées par un utilisateur sont envoyées à un contrat "Forwarder". Le forwarder est une entité de confiance qui vérifie que les transactions sont valides avant de les transmettre à un relais de gaz. C'est fait hors chaîne, ce qui évite d'avoir à payer du gaz. Le relais de gaz transmet la transaction à un contrat « Destinataire », qui paie le gaz nécessaire pour que la transaction puisse être exécutée sur Ethereum. La transaction est exécutée si le « Forwarder » est connu du « Destinataire » et lui fait confiance. Ce modèle facilite la mise en œuvre par les développeurs de transactions sans gaz pour les utilisateurs. + + + + + +L'EIP-4337 est la première étape vers la prise en charge native des portefeuilles de contrats intelligents de manière décentralisée sans nécessiter de modifications du protocole Ethereum. Au lieu de modifier la couche de consensus pour prendre en charge les portefeuilles de contrats intelligents, un nouveau système est ajouté séparément à la transaction normale du « gossip protocol ». Ce système de haut niveau s'articule autour d'un nouvel objet appelé UserOperation qui regroupe les actions d'un utilisateur et les signatures correspondantes. Ces UserOperation soulèvent une objection puis sont diffusés dans un pool de mémoire dédié, où les validateurs peuvent les collecter dans une « transaction groupée ». La transaction groupée représente une séquence de nombreuses UserOperations individuelles, et peut être incluse dans les blocs d'Ethereum tout comme une transaction normale, et serait récupérée par les validateurs en utilisant un modèle de sélection similaire maximisant les frais. + +Le fonctionnement des portefeuilles changerait également avec l'EIP-4337. Au lieu que chaque portefeuille réimplémente une logique de sécurité commune mais complexe, ces fonctions seraient externalisées vers un contrat de portefeuille global, plus connu sous le nom de "point d'entrée". Cela permettrait de gérer des opérations telles que le paiement des frais et l'exécution du code EVM, afin que les développeurs de portefeuilles puissent se concentrer sur la fourniture d'excellentes expériences utilisateurs. + +Il est à noter que le contrat de point d'entrée EIP 4337, a été déployé sur le réseau principal Ethereum le 1er mars 2023. Vous pouvez voir le contrat surEtherscan. + + + + + +EIP-2938 vise à mettre à jour le protocole Ethereum en introduisant un nouveau type de transaction : AA_TX_TYPE qui comprend trois champs : nonce, cible et data, où nonce est un compteur de transactions, cible est l'adresse du contrat du point d'entrée et données est le bytecode EVM. Pour exécuter ces transactions, deux nouvelles instructions (appelées opcodes) doivent être ajoutées à l'EVM : NONCE et PAYGAS. L'opcode NONCE suit la séquence de transaction et PAYGAS calcule puis retire le gaz nécessaire à l'exécution de la transaction du 's solde du contrat. Ces nouvelles fonctionnalités permettent à Ethereum de prendre en charge les portefeuilles de contrats intelligents de manière native, car l’infrastructure nécessaire est intégrée au protocole Ethereum.'. + +Notez qu'EIP-2938 n'est actuellement pas actif. La communauté favorise actuellement EIP-4337 car il ne nécessite pas de modification du protocole. + + + + + +L'EIP-3074 vise à mettre à jour les comptes externes d'Ethereum's en leur permettant de déléguer le contrôle à un contrat intelligent. Cela signifie que la logique des contrats intelligents pourrait approuver les transactions provenant d’un EOA. Cela permettrait des fonctionnalités telles que le parrainage du gaz et les transactions groupées. Pour que cela fonctionne, deux nouveaux opcodes doivent être ajoutés à l'EVM : AUTH et AUTHCALL. Avec EIP-3074, les avantages d'un portefeuille de contrats intelligents sont rendus disponibles sans avoir besoin de contrat - à la place, un type spécifique de contrat sans état, dénoué de confiance et non-évolutif, aussi connu sous le nom « d'appelant », gère les transactions. + +Notez qu'EIP-3074 n'est pas actif actuellement. La communauté favorise actuellement EIP-4337 car il ne nécessite pas de modification du protocole. + + + +## Progrès actuels {#current-progress} + +Des portefeuilles de contrats intelligents sont déjà disponibles, mais d'autres améliorations sont nécessaires pour les rendre aussi décentralisés et sans autorisation que possible. L'EIP-4337 est une proposition mûre qui ne nécessite aucune modification du protocole Ethereum, il est donc possible qu'elle soit mise en œuvre rapidement. Toutefois, les mises à jour qui modifient le protocole d'Ethereum ne sont actuellement pas en cours de développement actif, de sorte que ces changements peuvent prendre beaucoup plus de temps à être déployés. Il est également possible que l'abstraction des comptes soit suffisamment bien réalisée par l'EIP-4337 pour qu'aucun changement de protocole ne soit jamais nécessaire. + +## Complément d'information {#further-reading} + +- [erc4337.io](https://www.erc4337.io/) +- [Débat sur l'abstraction des comptes à Devcon Bogota](https://www.youtube.com/watch?app=desktop&v=WsZBymiyT-8) +- ["Pourquoi l'abstraction de compte est une innovation majeure pour les dapps" - Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) +- [« L'abstraction de compte, ELI5 » - Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) +- [Les notes de Vitalik sur la « Route vers l'abstraction de comptes »](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) +- [Article de blog de Vitalik sur les portefeuilles à récupération sociale](https://vitalik.eth.limo/general/2021/01/11/recovery.html) +- [Notes EIP-2938](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) +- [Documentation EIP-2938](https://eips.ethereum.org/EIPS/eip-2938) +- [Notes EIP-4337](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) +- [Documentation EIP-4337](https://eips.ethereum.org/EIPS/eip-4337) +- [Documentation EIP-2771](https://eips.ethereum.org/EIPS/eip-2771) +- [« Les bases de l'abstraction de comptes » -- Qu'est-ce que l'abstraction de comptes ? Partie 1](https://www.alchemy.com/blog/account-abstraction) diff --git a/public/content/translations/fr/roadmap/beacon-chain/index.md b/public/content/translations/fr/roadmap/beacon-chain/index.md index 26052aa2f1a..9f1b49cb8c2 100644 --- a/public/content/translations/fr/roadmap/beacon-chain/index.md +++ b/public/content/translations/fr/roadmap/beacon-chain/index.md @@ -4,7 +4,6 @@ description: En savoir plus sur la chaîne phare - la mise à niveau qui a intro lang: fr template: upgrade image: /upgrades/core.png -alt: summaryPoint1: La Chaîne phare a introduit la preuve d'enjeu dans l'écosystème Ethereum. summaryPoint2: Elle a été fusionnée avec la chaîne originale de preuve de travail Ethereum en septembre 2022. summaryPoint3: La Chaîne phare a introduit la logique de consensus et le protocole de commutation de bloc qui sécurise désormais Ethereum. @@ -14,17 +13,13 @@ summaryPoint3: La Chaîne phare a introduit la logique de consensus et le protoc La Chaîne phare a été présentée le 1er décembre 2020 et a formalisé la preuve d'enjeu comme mécanisme de consensus d'Ethereum avec La Fusion du 15 septembre 2022. -## Qu'est-ce que fut la Chaîne phare ? {#what-is-the-beacon-chain} +## Qu'est-ce que la chaîne phare Beacon ? {#what-is-the-beacon-chain} -La Chaîne phare était le nom de la blockchain originale par preuve d'enjeu qui a été lancée en 2020. Elle a été créé pour s'assurer que la logique de consensus par preuve d'enjeu était saine et durable avant de l'activer sur le réseau principal Ethereum. Par conséquent, elle a fonctionné aux côtés de l'Ethereum original de preuve de travail. La désactivation de la preuve de travail au profit de la preuve d'enjeu sur Ethereum nécessite d'indiquer à la Chaîne phare d'accepter les transactions de la chaîne Ethereum d'origine, de les regrouper en blocs, puis les organiser en blockchain en utilisant un mécanisme de consensus basé sur la preuve d'enjeu. Au même moment, les clients originaux d'Ethereum ont arrêté leur minage, la propagation du bloc et la logique de consensus, regroupant tout ceci sur la Chaîne phare. Cet événement était connu sous le nom de [La Fusion](/roadmap/merge/). Une fois la Fusion réalisée, il n'y avait plus deux blockchains mais une chaîne unique Ethereum de preuve d'enjeu. +La chaîne phare Beacon est le nom donné à la chaîne originelle à preuve d'enjeu, lancée en 2020. Elle a été créé pour s'assurer que la logique de consensus par preuve d'enjeu était saine et durable avant de l'activer sur le réseau principal Ethereum. Par conséquent, elle a fonctionné aux côtés de l'Ethereum original de preuve de travail. La chaîne Beacon était une chaîne de blocs « vides », mais désactiver la preuve de travail et activer la preuve d'enjeu sur Ethereum nécessitait de demander à la Beacon Chain d'accepter les données de transaction des clients d'exécution, de les regrouper en blocs, puis de les organiser dans une blockchain en utilisant un mécanisme de consensus basé sur la preuve d'enjeu. Au même moment, les clients originaux d'Ethereum ont arrêté leur minage, la propagation du bloc et la logique de consensus, regroupant tout ceci sur la Chaîne phare. Cet événement était connu sous le nom de [La Fusion](/roadmap/merge/). Une fois que La Fusion a eu lieu, il n’y avait plus deux blockchains. Au lieu de cela, il n’y avait qu’une seule preuve d'enjeu Ethereum, qui nécessite désormais deux clients différents par nœud. La chaîne Beacon est désormais la couche de consensus, un réseau de pair à pair de clients de consensus qui gère le gossip des blocs et la logique de consensus, tandis que les clients d'origine forment la couche d'exécution, qui est responsable de l'échange d'informations et de l'exécution des transactions, ainsi que de la gestion de l'état d'Ethereum. Les deux couches peuvent communiquer entre elles en utilisant l'API Engine. -## Que fait la Chaîne phare ? {#what-does-the-beacon-chain-do} +## Que fait la chaîne Beacon ? {#what-does-the-beacon-chain-do} -La Chaîne phare était le nom donné à un registre de comptes qui a mené et coordonné le réseau des [validateurs Ethereum](/staking/) avant que ces mêmes validateurs ne commencent à valider de véritables transactions Ethereum. Elle ne traitait pas les transactions ou ne gérait pas les interactions entre les contrats intelligents. - -Elle a introduit le moteur de consensus (ou « couche de consensus ») qui a pris la place du minage par preuve de travail sur Ethereum et a apporté de nombreuses améliorations significatives. - -La Chaîne phare était un composant fondamental pour [la sécurisation, le respect environnemental et l'évolutivité d'Ethereum](/roadmap/vision/). +La chaîne Beacon est le nom donné au registre de comptes utilisé pour la conduite et la coordination du réseau d'Ethereum de [validateurs](/staking/) avant que ces mêmes validateurs commencent réellement la validation des blocs Ethereum. Elle n'exécute pas les transactions ou gère les interactions des contrats intelligents puisque cela est assuré au niveau de la couche d'exécution. La chaîne Beacon est responsable des éléments comme la gestion des blocs et de leur attestation, en accord avec l'algorithme de choix de fourche, tout en gérant les récompenses et les pénalités. Pour en savoir plus, veuillez vous reporter à notre [page d'architecture des noeuds](/developers/docs/nodes-and-clients/node-architecture/#node-comparison). ## Impact de la Chaîne phare {#beacon-chain-features} @@ -34,7 +29,9 @@ La Chaîne phare introduit la [preuve d'enjeu](/developers/docs/consensus-mechan La mise en jeu a un objectif similaire au [minage](/developers/docs/mining/), mais diffère à plusieurs titres. Le minage nécessitait d’importantes dépenses initiales sous la forme d’une puissante consommation en matériel et énergie, entraînant des économies d’échelle et promouvant la centralisation. Le minage n'impliquait pas non plus l'obligation de bloquer les actifs en tant que garantie, ce qui limite la capacité du protocole à punir les mauvais acteurs après une attaque. -La transition vers la preuve d'enjeu rend Ethereum nettement plus sûr et décentralisé par comparaison. Plus le nombre de participants sera élevé sur le réseau, plus celui-ci sera décentralisé et à l'abri des attaques. +La transition vers la preuve d'enjeu a rendu Ethereum nettement plus sûr et décentralisé par comparaison avec la preuve de travail. Plus le nombre de participants sera élevé sur le réseau, plus celui-ci sera décentralisé et à l'abri des attaques. + +De plus, l'utilisation de la preuve d'enjeu comme mécanisme de consensus est un composant fondamental pour un [Ethereum sécurisé, respectueux de l'environnement et évolutif tel que nous le connaissons maintenant](/roadmap/vision/). Si vous souhaitez devenir validateur et aider à sécuriser Ethereum, familiarisez-vous avec le concept de mise en jeu. @@ -52,11 +49,11 @@ Cette responsabilité contraste avec la preuve de travail, où les mineurs n'ont ## Relation entre les mises à niveau {#relationship-between-upgrades} -Les mises à niveau Ethereum sont plus ou moins interdépendantes. Récapitulons donc comment la chaîne phare affecte les autres mises à niveau. +Les mises à niveau d'Ethereum sont plus ou moins interdépendantes. Récapitulons donc comment la chaîne phare affecte les autres mises à niveau. ### La Chaîne phare et La Fusion {#merge-and-beacon-chain} -Au début, La Chaîne phare existait séparément du réseau principal Ethereum, mais ils ont été fusionnés en 2022. +Au début, la Chaîne phare existait séparément du réseau principal Ethereum, mais ils ont été fusionnés en 2022. La Fusion @@ -64,7 +61,7 @@ Au début, La Chaîne phare existait séparément du réseau principal Ethereum, ### Fragments et chaîne phare {#shards-and-beacon-chain} -La fragmentation ne peut s'ajouter en toute sécurité dans l'écosystème Ethereum que s'il existe un mécanisme de consensus sur la preuve d'enjeu. La Chaîne phare a introduit la notion de mise en jeu qui a « fusionnée » avec le réseau principal et a ouvert la voie à la fragmentation pour favoriser une plus grande évolutivité d'Ethereum. +La fragmentation ne peut s'ajouter en toute sécurité dans l'écosystème Ethereum que s'il existe un mécanisme de consensus sur la preuve d'enjeu. La Chaîne phare a introduit la mise en jeu qui a « fusionné » avec le réseau principal et a ouvert la voie à la fragmentation pour favoriser une plus grande évolutivité d'Ethereum. Chaînes de fragments @@ -73,4 +70,5 @@ La fragmentation ne peut s'ajouter en toute sécurité dans l'écosystème Ether ## Complément d'information - [En savoir plus sur les futures mises à jour d'Ethereum](/roadmap/vision) +- [En savoir plus sur l'architecture d'un noeud](/developers/docs/nodes-and-clients/node-architecture) - [En savoir plus sur la preuve d'enjeu](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/fr/roadmap/danksharding/index.md b/public/content/translations/fr/roadmap/danksharding/index.md new file mode 100644 index 00000000000..f868614f064 --- /dev/null +++ b/public/content/translations/fr/roadmap/danksharding/index.md @@ -0,0 +1,91 @@ +--- +title: Danksharding +description: Découvrez le Proto-Danksharding et le Danksharding, deux mises à jour consécutives pour passer à l’échelle Ethereum. +lang: fr +summaryPoints: + - Le Danksharding est une mise à jour en plusieurs phases visant à améliorer le passage à l’échelle et les capacités d'Ethereum. + - La première étape, le Proto-Danksharding, ajoute les « blobs » de données aux blocs + - Les « blobs » de données offrent une solution moins coûteuse pour que les rollups puissent publier des données sur Ethereum, et ces coûts peuvent être répercutés sur les utilisateurs sous forme de frais de transaction réduits. + - Plus tard, le Danksharding complet répartira la responsabilité de la vérification des blobs de données sur des sous-ensembles de nœuds, augmentant ainsi Ethereum à plus de 100 000 transactions par seconde. +--- + +# Danksharding {#danksharding} + +Le **Danksharding** est la façon dont Ethereum devient une blockchain à grande échelle, mais plusieurs mises à jour de protocole sont nécessaires pour y parvenir. Le **Proto-Danksharding** est une étape intermédiaire sur ce chemin. Les deux visent à rendre les transactions sur les secondes couches aussi économiques que possible pour les utilisateurs et devraient permettre à Ethereum de traiter plus de >100 000 transactions par seconde. + +## Qu'est-ce que le Proto-Danksharding ? {#what-is-protodanksharding} + +Le Proto-Danksharding, également connu sous le nom d'[EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), est une manière pour les [rollups](/layer2/#rollups) d'ajouter des données aux blocs, à moindre frais. Le nom provient des deux chercheurs qui ont proposé l'idée : Protolambda et Dankrad Feist. À l'heure actuelle, les rollups sont limités dans la mesure où ils peuvent effectuer des transactions utilisateur à moindre coût du fait qu'ils publient leurs transactions dans `CALDATA`. Cette solution est onéreuse car ces données sont traitées par l’ensemble des nœuds d’Ethereum et restent sur la blockchain pour toujours, même si les rollups n'ont besoin des données que pendant une courte période. Le Proto-Danksharding introduit des « blobs » de données qui peuvent être envoyés et ajoutés aux blocs. Les données dans ces « blobs » ne sont pas accessibles par l'EVM et sont automatiquement supprimées après une période fixe (de 1 à 3 mois). Cela signifie que les rollups peuvent envoyer leurs données à moindre frais et répercuter ces économies aux utilisateurs finaux sous forme de transactions moins onéreuses. + + + +Les rollups sont une méthode pour faire passer Ethereum à l'échelle en regroupant les transactions hors chaîne, puis en publiant les résultats sur Ethereum. Un rollup est essentiellement composé de deux parties : les données et la vérification de l'exécution. Les données représentent la séquence complète de transactions traitées par un rollup pour générer le changement d'état publié sur Ethereum. La vérification de l'exécution consiste à faire réexécuter ces transactions par un acteur honnête (un « démonstrateur ») pour garantir que le changement d'état proposé est correct. Pour que la vérification de l'exécution soit possible, les données de transaction doivent être disponibles suffisamment longtemps afin que quiconque puisse les télécharger et les vérifier. Cela signifie que tout comportement malhonnête de la part du séquenceur de rollup peut être identifié et contesté par le démonstrateur. Cependant, ces données n'ont pas besoin d'être disponibles indéfiniment. + + + + + +Les rollups publient des engagements liés à leurs données de transaction en chaîne et rendent également les données réelles accessibles sous forme de « blobs » de données. Cela signifie que les démonstrateurs peuvent vérifier la validité des engagements ou contester les données qu'ils estiment incorrectes. Au niveau des nœuds, les « blobs » de données sont stockés dans le client de consensus. Les clients de consensus attestent qu'ils ont vu les données et qu'elles se sont propagées sur le réseau. Si les données étaient conservées indéfiniment, ces clients deviendraient trop encombrés et cela augmenterait les besoins matériels pour faire fonctionner les nœuds. Au lieu de cela, les données sont automatiquement supprimées du nœud tous les 1 à 3 mois. Les attestations des clients de consensus démontrent qu'il y a eu suffisamment de possibilités pour que les démonstrateurs vérifient les données. Les données réelles peuvent être stockées en dehors de la blockchain par les opérateurs de rollup, les utilisateurs ou d'autres parties. + + + +### Comment les données des blobs sont-elles vérifiées ? {#how-are-blobs-verified} + +Les rollups publient les transactions qu'ils exécutent dans des blobs de données. Ils publient également un « engagement » envers ces données. Ils font cela en appliquant une fonction polynomiale aux données. Cette fonction peut ensuite être évaluée à différents points. Par exemple, si nous définissons une fonction extrêmement simple `f(x) = 2x-1`, alors nous pouvons évaluer cette fonction pour `x = 1`, `x = 2`, `x = 3`, ce qui donne les résultats `1, 3, 5`. Un démonstrateur applique la même fonction aux données et l'évalue aux mêmes points. Si les données d'origine sont modifiées, la fonction ne sera pas identique, et par conséquent, les valeurs évaluées à chaque point ne le seront pas non plus. En réalité, l'engagement et la preuve sont plus complexes car elles contiennent une couche de fonctions cryptographiques. + +### Qu'est-ce que KZG ? {#what-is-kzg} + +KZG signifie Kate-Zaverucha-Goldberg - les noms des trois [auteurs originaux](https://link.springer.com/chapter/10.1007/978-3-642-17373-8_11) d'un schéma qui réduit un blob de données à un petit ["engagement" cryptographique](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html). Le blob de données soumis par un rollup doit être vérifié pour s'assurer que le rollup ne se comporte pas de manière incorrecte. Cela implique qu'un démonstrateur exécute à nouveau les transactions dans le blob pour vérifier que l'engagement était valide. Conceptuellement, cela correspond à la manière dont les clients d'exécution vérifient la validité des transactions Ethereum sur la couche principale à l'aide de preuves de Merkle. KZG est une preuve alternative qui applique une équation polynomiale aux données. L'engagement évalue le polynôme à des points de données tenus secrets. Un démonstrateur applique le même polynôme aux données et l'évalue aux mêmes valeurs, vérifiant que le résultat est bien identique. C'est une manière de vérifier que les données sont compatibles avec les techniques de zero-knowledge (Zk) utilisées par certains rollups et éventuellement d'autres parties du protocole Ethereum. + +### Qu'est-ce que la Cérémonie KZG ? {#what-is-a-kzg-ceremony} + +Une cérémonie KZG permet à de nombreuses personnes de la communauté Ethereum de générer ensemble une suite secrète de nombres aléatoires qui peut être utilisée pour vérifier certaines données. Il est très important que cette suite de nombres ne soit pas connue et ne puisse pas être recréée par qui que ce soit. Pour garantir cela, chaque personne qui participe à la cérémonie reçoit une chaine de caractères en provenance du participant précédent. Ensuite, ils créent de nouvelles valeurs aléatoires (par exemple, en mesurant les mouvements de leur souris par leur navigateur) et les mélangent avec la valeur de la chaine précédente. Ils envoient ensuite la valeur au participant suivant et la détruisent de leur machine locale. Tant qu'au moins une personne durant la cérémonie agit honnêtement, la valeur finale sera introuvable pour un attaquant. La cérémonie KZG de l'EIP-4844 était ouverte au public et des dizaines de milliers de personnes y ont participé pour ajouter leur propre entropie. Pour que la cérémonie soit compromise, il aurait fallu que 100 % de ses participants soient volontairement malhonnêtes. Du point de vue des participants, s'ils savent qu'ils ont agi honnêtement, il n'est pas nécessaire de faire confiance à quelqu'un d'autre car ils savent qu'ils ont sécurisé la cérémonie (ils ont individuellement satisfait à l'exigence d'au moins 1 participant honnête parmi N). + + + +Lorsqu'un rollup publie des données dans un blob, il fournit un « engagement » qu'il publie sur la chaîne. Cet engagement est le résultat de l'évaluation d'une fonction polynomiale appliquée aux données à certains points. Ces points sont définis par les nombres aléatoires générés lors de la cérémonie KZG. Les démonstrateurs peuvent ensuite évaluer le polynôme aux mêmes points afin de vérifier les données - si les valeurs sont identiques, alors les données sont correctes. + + + + + +Si quelqu'un connaissait les points aléatoires utilisés pour l'engagement, il pourrait facilement générer un nouveau polynôme qui s'adapterait à ces points spécifiques (c'est-à-dire une « collision »). Cela signifie qu'il pourrait ajouter ou supprimer des données du « blob » tout en fournissant une preuve valide. Pour empêcher cela, au lieu de donner directement aux démonstrateurs les emplacements des points secrets , ils reçoivent en réalité les emplacements masqués dans une « boîte noire » cryptée à l'aide de courbes elliptiques. Cela brouille les valeurs de telle manière que les valeurs originales ne peuvent pas être déchiffrées, mais avec un peu d'algèbre, les démonstrateurs et les vérificateurs peuvent toujours évaluer les polynômes aux points qu'ils représentent. + + + + + Ni le Danksharding ni le Proto-Danksharding ne suivent le modèle traditionnel de « fragmentation » qui visait à diviser la blockchain en plusieurs fragments. La fragmentation de la chaîne ne fait plus partie de la feuille de route. Au lieu de cela, le Danksharding utilise un échantillonnage de données distribué à travers les blobs pour faire passer Ethereum à l'échelle. Ceci est beaucoup plus simple à mettre en œuvre. Ce modèle est parfois désigné sous le nom de « data-sharding » ou « fragmentation de données ». + + +## Qu'est-ce que le Danksharding ? {#what-is-danksharding} + +Le Danksharding est la réalisation complète du passage à l'échelle des rollups commencé avec le Proto-Danksharding. Le Danksharding apportera une grande quantité de stockage sur Ethereum pour que les rollups puissent publier leurs données de transaction compressées. Cela signifie qu'Ethereum pourra facilement accueillir des centaines de rollups individuels et rendra ainsi possible des millions de transactions par seconde. + +Cela fonctionne en étendant le nombre de blobs attachés aux blocs de 1 dans le Proto-Danksharding à 64 dans le Danksharding complet. Le reste des changements requis concerne des mises à jour du fonctionnement des clients de consensus pour leur permettre de gérer les nouveaux blobs de grande taille. Plusieurs de ces modifications sont déjà prévues dans la feuille de route à d'autres fins, indépendamment du Danksharding. Par exemple, le Danksharding nécessite la mise en œuvre de la séparation entre le validateur et le constructeur de blocs. Il s'agit d'une mise à jour qui sépare les tâches de construction de blocs et de proposition de blocs entre différents validateurs. De même, l'échantillonnage de la disponibilité des données est requis pour le Danksharding, mais il est également nécessaire pour le développement de clients plus légers qui ne stockent pas toutes les données historiques (clients « sans état »). + + + +La séparation entre les validateurs et les constructeurs de blocs est nécessaire pour éviter que chaque validateur ait à générer des engagements trop volumineux et des preuves pour 32 Mo de données de blobs. Cela mettrait trop de pression sur les validateurs à domicile et les obligerait à investir dans du matériel plus puissant, ce qui nuirait à la décentralisation. Au lieu de cela, des constructeurs de blocs spécialisés prennent en charge ce travail de calcul coûteux. Ensuite, ils mettent leurs blocs à disposition des proposeurs pour qu'ils les diffusent. Le proposeur de bloc choisit simplement le bloc le plus rentable. Tout le monde peut vérifier les blobs de manière simple et rapide, ce qui signifie que n'importe quel validateur normal peut vérifier si les constructeurs de blocs se comportent honnêtement. Cela permet de traiter les blobs de grande taille sans sacrifier la décentralisation. Les constructeurs de blocs qui se comportent mal pourraient simplement être expulsés du réseau et sanctionnés - d'autres prendront leur place car la construction de blocs est une activité profitable. + + + + + +L'échantillonnage de la disponibilité des données est nécessaire pour que les validateurs puissent vérifier rapidement et efficacement les données de blobs. En utilisant l'échantillonnage de la disponibilité des données, les validateurs peuvent être tout à fait certains que les données de blobs étaient disponibles et que les engagements étaient corrects. Chaque validateur peut échantillonner au hasard quelques points de données et en créer une preuve, ce qui signifie qu'aucun validateur n'a à vérifier l'intégralité du blob. Si des données sont manquantes, elles seront rapidement identifiées et le blob sera rejeté. + + + +### Progrès actuels {#current-progress} + +L'implémentation complète du Danksharding prendra encore plusieurs années. Cependant, le Proto-Danksharding devrait arriver bientôt. Au moment où sont écrites ces lignes (février 2023), la cérémonie KZG est toujours ouverte et a jusqu'à présent attiré plus de 50 000 contributeurs. L'[EIP](https://eips.ethereum.org/EIPS/eip-4844) pour Proto-Danksharding est mature, la spécification est convenue et les clients ont implémenté des prototypes qui sont actuellement en cours de test et rendu prêt pour la production. La prochaine étape consiste à mettre en œuvre ces changements sur un réseau de test public. Vous pouvez rester informé en suivant [l'avancement de l'EIP 4844](https://github.com/ethereum/pm/blob/master/Breakout-Room/4844-readiness-checklist.md#client-implementation-status). + +### Complément d'information {#further-reading} + +- [Notes sur le Proto-Danksharding](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) - _Vitalik Buterin_ +- [Notes de Dankrad sur le Danksharding](https://notes.ethereum.org/@dankrad/new_sharding) +- [Discussion de Dankrad, Proto et Vitalik sur le Danksharding](https://www.youtube.com/watch?v=N5p0TB77flM) +- [La cérémonie KZG](https://ceremony.ethereum.org/) +- [Conférence de Carl Beekhuizen à la Devcon sur les configurations de confiance](https://archive.devcon.org/archive/watch/6/the-kzg-ceremony-or-how-i-learnt-to-stop-worrying-and-love-trusted-setups/?tab=YouTube) +- [Plus d'informations sur l'échantillonnage de disponibilité des données pour les blobs](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [Dankrad Feist sur les engagements et les preuves KZG](https://youtu.be/8L2C6RDMV9Q) +- [Engagements polynomiaux KZG](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) diff --git a/public/content/translations/fr/roadmap/future-proofing/index.md b/public/content/translations/fr/roadmap/future-proofing/index.md new file mode 100644 index 00000000000..6f0bf5793e3 --- /dev/null +++ b/public/content/translations/fr/roadmap/future-proofing/index.md @@ -0,0 +1,38 @@ +--- +title: Ethereum à l’épreuve du temps +description: Ces mises à niveau consolident Ethereum en tant que couche de base résiliente et décentralisée pour l’avenir, quoi qu’elle réserve. +lang: fr +image: /roadmap/roadmap-future.png +alt: "Feuille de route d'Ethereum" +template: roadmap +--- + +Certaines parties de la feuille de route ne sont pas nécessairement requises pour faire évoluer ou sécuriser Ethereum à court terme, mais permettent à Ethereum d’assurer sa stabilité et sa fiabilité à long terme. + +## Résistance quantique {#quantum-resistance} + +Une partie de la sécurisation de la cryptographie actuelle d'Ethereum sera compromise lorsque le calcul quantique deviendra une réalité. Bien que les ordinateurs quantiques soient probablement à des décennies de constituer une véritable menace pour la cryptographie moderne, Ethereum est construit pour être sécurisé pour les siècles à venir. Cela signifie rendre [Ethereum quantique résistant](https://consensys.net/blog/developers/how-will-quantum-supremacy-affect-blockchain/) dès que possible. + +Le défi auquel sont confrontés les développeurs d'Ethereum est que le protocole actuel de preuve de mise en jeu repose sur un système de signature très efficace connu sous le nom de BLS pour regrouper les votes sur les blocs valides. Ce schéma de signature est rompu par les ordinateurs quantiques, mais les alternatives de résistance quantique ne sont pas aussi efficaces. + +Les [schémas d'engagement « KZG»](/roadmap/danksharding/#what-is-kzg) utilisés à plusieurs endroits à travers Ethereum pour générer des secrets cryptographiques sont connus pour être vulnérables. Actuellement, cela est contourné en utilisant des « configurations de confiance » où de nombreux utilisateurs génèrent un aléa qui ne peut pas être inversé par un ordinateur quantique. Cependant, la solution idéale serait simplement d'intégrer la cryptographie quantique sûre. Il y a deux approches principales qui pourraient devenir des remplacements efficaces pour le schéma BLS : la signature [basée sur le STARK](https://hackmd.io/@vbuterin/stark_aggregation) et la signature [basée sur le treillis](https://medium.com/asecuritysite-when-bob-met-alice/so-what-is-lattice-encryption-326ac66e3175). Ils sont encore en cours de recherche et de prototype. + + En savoir plus sur KZG et les configurations fiables + +## Ethereum plus simple et plus efficace {#simpler-more-efficient-ethereum} + +La complexité crée des opportunités pour les bogues ou les vulnérabilités que des assaillants peuvent exploiter. Par conséquent, une partie de la feuille de route simplifie Ethereum et supprime le code qui a été mis à jour par diverses mises à jour, mais qui n'est plus nécessaire ou peut maintenant être amélioré. Une base de code plus souple et plus simple est plus facile à maintenir et à raisonner pour les développeurs. + +Il y a plusieurs mises à jour qui seront faites sur la [machine virtuelle Ethereum (EVM)](/developers/docs/evm) pour la rendre plus simple et plus efficace. Celles-ci incluent [la suppression de l'opcode SELFDESTRUCT](https://hackmd.io/@vbuterin/selfdestruct) - une commande rarement utilisée qui n'est plus nécessaire et dans certaines circonstances peut être dangereuse à utiliser, surtout lorsqu’elle est combinée à d’autres mises à jour futures vers le modèle de stockage Ethereum. Les clients Ethereum supportent également certains vieux types de transactions qui peuvent maintenant être complètement supprimés. La façon dont le gaz est calculé peut également être amélioré et des méthodes plus efficaces pour l'arithmétique qui sous-tendent certaines opérations cryptographiques peuvent être introduites. + +De même, il y a des mises à jour qui peuvent être faites à d'autres parties des clients actuels d'Ethereum. Un exemple est que l'exécution courante et les clients de consensus utilisent un autre type de compression de données. Il sera beaucoup plus facile et plus intuitif de partager des données entre les clients lorsque le système de compression sera unifié sur l'ensemble du réseau. + +## Progrès actuels {#current-progress} + +La plupart des mises à niveau nécessaires à la pérennité d’Ethereum sont encore en phase de recherche et il faudra peut-être plusieurs années avant qu’elles soient mises en œuvre. Les mises à jour telles que la suppression de SELF-DESTRUCT et l'harmonisation du système de compression utilisé dans l'exécution et les clients de consensus sont susceptibles d'advenir plus tôt que la cryptographie résistante quantique. + +**Complément d'information** + +- [Gaz](/developers/docs/gas) +- [EVM](/developers/docs/evm) +- [Structures des données](/developers/docs/data-structures-and-encoding) diff --git a/public/content/translations/fr/roadmap/index.md b/public/content/translations/fr/roadmap/index.md new file mode 100644 index 00000000000..c8218e0eb1e --- /dev/null +++ b/public/content/translations/fr/roadmap/index.md @@ -0,0 +1,119 @@ +--- +title: Feuille de route d'Ethereum +description: La voie vers davantage d'évolutivité, de sécurité et de durabilité pour Ethereum. +lang: fr +template: roadmap +image: /heroes/roadmap-hub-hero.jpg +alt: "Feuille de route d'Ethereum" +summaryPoints: +buttons: + - + label: Améliorations ultérieures + toId: what-changes-are-coming + - + label: Améliorations antérieures + to: /history/ + variant: outline +--- + +Ethereum est déjà une plateforme puissante pour la coordination mondiale, mais elle est encore en cours d'amélioration. Un ensemble ambitieux d'améliorations permettra à Ethereum de passer de sa forme actuelle à une plateforme entièrement mise à l'échelle et d'une résilience maximale. Ces améliorations sont décrites dans la feuille de route d'Ethereum. + +**Pour en savoir plus sur les précédentes mises à jour d'Ethereum, veuillez consulter notre page [Historique d'Ethereum](/history/)** + +## Quels sont les changements à venir pour Ethereum ? {#what-changes-are-coming} + +La feuille de route d'Ethereum décrit les améliorations spécifiques qui seront apportées au protocole à l'avenir. Globalement, la feuille de route apportera les avantages suivants aux utilisateurs d'Ethereum : + + + + + + + + +## Pourquoi Ethereum a-t-il besoin d'une feuille de route ? {#why-does-ethereum-need-a-roadmap} + +Ethereum fait régulièrement l'objet de mises à jour qui améliorent son évolutivité, sa sécurité ou sa durabilité. L'une des principales forces d'Ethereum est de s'adapter aux nouvelles idées issues de la recherche et du développement. L'adaptabilité donne à Ethereum la flexibilité nécessaire pour relever les nouveaux défis et suivre les avancées technologiques les plus récentes. + + + +La feuille de route est principalement le résultat d'années de travail des chercheurs et des développeurs - car le protocole est très technique - mais toute personne motivée peut y participer. Les idées commencent généralement par des discussions sur un forum tel que [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://ethereum-magicians.org/) ou le serveur discord Eth R&D. Il peut s'agir de réponses à de nouvelles vulnérabilités découvertes, de suggestions émanant d'organisations travaillant dans la couche applicative (telles que les DApps et les échanges) ou de frictions connues pour les utilisateurs finaux (telles que les coûts ou les vitesses de transaction). Lorsque ces idées arrivent à maturité, elles peuvent être proposées en tant que [propositions d'amélioration Ethereum] (https://eips.ethereum.org/). Tout cela se fait en public, de sorte que n'importe quel membre de la communauté peut intervenir à tout moment. + +[En savoir plus sur la gouvernance d'Ethereum] (/governance/) + + + + +

    Que fut l'ETH2 ?

    + +

    Le terme « Eth2 » était couramment utilisé pour décrire l'avenir d'Ethereum avant le passage à la preuve d'enjeu, mais il a été supprimé en faveur d'une terminologie plus précise. Il était à l'origine utilisé pour différencier le réseau Ethereum avant le passage à la preuve d'enjeu et le réseau après, ou parfois pour se référer aux différents clients Ethereum (les clients d'exécution étaient parfois appelés clients ETH1 et les clients de consensus étaient parfois appelés clients ETH2).

    + +
    + +## La feuille de route d'Ethereum évoluera-t-elle au fil du temps ? {#will-ethereums-roadmap-change-over-time} + +Oui, presque sans aucun doute. La feuille de route est le plan actuel de mise à niveau d'Ethereum, couvrant à la fois les plans à court terme et les plans futurs. Nous nous attendons à ce que la feuille de route soit modifiée au fur et à mesure que de nouvelles informations et technologies seront disponibles. + +La feuille de route d'Ethereum est un ensemble d'intentions visant à améliorer Ethereum ; il s'agit de la meilleure hypothèse des chercheurs et des développeurs sur la voie optimale à suivre pour Ethereum. + +## Quand la feuille de route sera-t-elle terminée ? {#when-will-the-roadmap-be-finished} + +Ethereum mettra en œuvre certaines améliorations au cours des six prochains mois (par exemple, les retraits de staking) ; d'autres sont moins prioritaires et ne seront probablement pas mises en œuvre avant 5 à 10 ans (par exemple, la résistance quantique). Il est difficile de prévoir le calendrier précis de chaque mise à niveau, car de nombreux éléments de la feuille de route sont travaillés en parallèle et développés à des rythmes différents. L'urgence d'une mise à niveau peut également évoluer dans le temps en fonction de facteurs externes (par exemple, un bond soudain dans les performances et la disponibilité des ordinateurs quantiques peut rendre plus urgente la cryptographie avec résistance quantique). + +L'une des façons d'envisager le développement d'Ethereum est de faire une analogie avec l'évolution biologique. Un réseau capable de s'adapter à de nouveaux défis et de rester sain a plus de chances de réussir qu'un réseau réfractaire au changement, même si au fur et à mesure que le réseau devient de plus en plus performant, évolutif et sûr, il sera de moins en moins nécessaire d'apporter des modifications au protocole. + +## Dois-je faire quelque chose lors d'une mise à jour ? {#do-i-have-to-do-anything-when-there-is-an-upgrade} + +Les mises à niveau n'ont généralement pas d'impact sur les utilisateurs finaux, si ce n'est qu'elles offrent une meilleure expérience utilisateur, un protocole plus sûr et peut-être plus d'options pour interagir avec Ethereum. Les utilisateurs finaux ne sont pas tenus de participer activement à une mise à niveau, ni de faire quoi que ce soit pour sécuriser leurs actifs. Les opérateurs de nœuds devront mettre à jour leurs clients pour se préparer à une mise à niveau. Certaines mises à niveau peuvent entraîner des changements pour les développeurs d'applications. Par exemple, les mises à niveau de l'expiration de l'historique peuvent amener les développeurs d'applications à obtenir des données historiques à partir de nouvelles sources. + +## Qu'en est-il de The Verge, The Splurge… ? {#what-about-the-verge-splurge-etc} + +[Vitalik Buterin a proposé une vision de la feuille de route d'Ethereum](https://twitter.com/VitalikButerin/status/1588669782471368704) organisée en plusieurs catégories liées par leurs effets sur l'architecture d'Ethereum. Elle comprenait : + +- La Fusion : améliorations liées au passage de la preuve de travail à la preuve d'enjeu +- The Surge : mises à niveau liées à l'évolutivité grâce aux rollups et à la fragmentation des données +- The Scourge : mises à niveau liées à la résistance à la censure, la décentralisation et les risques de la MEV pour le protocole +- The Verge : mises à niveau liées à la vérification des blocks facilitée +- The Purge : mises à niveau liées à la réduction des coûts de calcul pour faire fonctionner les noeuds et simplifier le protocole +- The Splurge : autres mises à niveau qui ne rentrent pas bien dans les catégories précédentes. + +Nous avons décidé de ne pas utiliser cette terminologie parce que nous voulions utiliser un modèle plus simple et plus centré sur l'utilisateur. Bien que nous utilisions un langage centré sur l'utilisateur, la vision reste la même que celle proposée par Vitalik. + +## Qu'en est-il de la fragmentation ? {#what-about-sharding} + +La fragmentation consiste à découper la blockchain Ethereum afin que des sous-ensembles de validateurs soient seulement responsables d'une fraction des données complètes. C'était originellement de cette manière qu'Ethereum devait passer à l'échelle. Néanmoins, les rollups (couche 2) se sont développés bien plus rapidement que prévu et ont fournit une grande capacité à monter en charge, et en fourniront encore plus après que le Proto-Danksharding sera mis en œuvre. Cela signifie que les « chaînes de fragments » ne sont plus nécessaires et ont été supprimées de la feuille de route. + +## Vous recherchez des mises à niveau techniques spécifiques ? {#looking-for-specific-technical-upgrades} + +- [Danksharding](/roadmap/danksharding) - Le Danksharding rend les rollups de couche 2 bien plus abordables pour les utilisateurs en ajoutant des « blob » de données aux blocs d'Ethereum. +- [Retraits de Staking](/staking/withdrawals) - La mise à niveau Shanghai/Capella a activé les retraits de staking sur Ethereum, permettant aux gens de déverrouiller leurs ETH mis en jeu. +- [Finalité à un seul créneau](/roadmap/single-slot-finality) - Au lieu d'attendre pendant 15 minutes, les blocks pourraient être proposés et finalisés dans le même créneau. Ceci est plus pratique pour les applications et bien plus difficilement attaquable. +- [Séparation Proposeur et Constructeur](/roadmap/pbs) - Découper les tâches de construction et de proposition de blocs entre plusieurs validateurs distincts crée une manière plus équitable, plus résistante à la censure, et plus efficace pour Ethereum d'atteindre le consensus. +- [Élection secrète du leader](/roadmap/secret-leader-election) - Utilisation astucieuse de la cryptographie pour s'assurer que l'identité du proposeur du bloc courant ne peut pas être rendue publique, le protégeant de certains types d'attaques. +- [Abstraction de compte](/roadmap/account-abstraction) - L'abstraction de compte est une gamme de mises à niveau qui permettent aux contrats de portefeuilles intelligents d'être nativement supportés sur Ethereum, plutôt que de devoir utiliser un intergiciel complexe. +- [Arbres Verkle](/roadmap/verkle-trees) - Les arbres Verkle sont des structures de données qui peuvent être utilisés pour permettre des clients sans état sur Ethereum. Ces clients « sans état » nécessiteront de faibles espaces de stockage mais seront toujours capables de vérifier les nouveaux blocks. +- [Statelessness](/roadmap/statelessness) - les clients sans état seront capables de vérifier de nouveaux blocs sans devoir stocker de vastes quantités de données. Cela offrira tous les avantages de l’exploitation d’un nœud avec seulement une infime fraction des coûts actuels. diff --git a/public/content/translations/fr/roadmap/merge/index.md b/public/content/translations/fr/roadmap/merge/index.md index c6df1da0732..af7a43ef44e 100644 --- a/public/content/translations/fr/roadmap/merge/index.md +++ b/public/content/translations/fr/roadmap/merge/index.md @@ -4,7 +4,6 @@ description: En savoir plus sur La Fusion - quand le réseau principal Ethereum lang: fr template: upgrade image: /upgrades/merge.png -alt: summaryPoint1: Le réseau principal Ethereum utilise la preuve d'enjeu, mais cela n'a pas toujours été le cas. summaryPoint2: La mise à niveau du mécanisme original de preuve de travail à celui de la preuve d'enjeu s'appelle La Fusion. summaryPoint3: La Fusion fait référence à la fusion du réseau principal original Ethereum avec une blockchain distincte de preuve d'enjeu appelée la Chaîne phare, qui existe maintenant sous la forme d'une chaîne unique. @@ -92,15 +91,18 @@ title="Développeurs de dApps et de contrats intelligents" contentPreview="The Merge was designed to have minimal impact on smart contract and dapp developers." id="developers"> -La Fusion a été réalisée avec des changements de consensus, qui impliquent également les changements liés à : +La Fusion s'est accompagnée de changements apportés au consensus, qui incluent également des changements liés à :< -- La structure de bloc -- Le slot/timing de bloc -- Les changements d'opcode -- Les sources en chaîne aléatoire -- Les concepts de _tête sécurisée_ et de _blocs finalisés_ +
      +
    • la structure d'un bloc
    • +
    • synchronisation des créneaux/blocs
    • +
    • changements de codes opératoires
    • +
    • sources d'erreurs aléatoires en chaîne
    • +
    • concept de safe head et de blocs finalisés
    • +
    + +Pour plus d'informations, consultez ce billet de blog de Tim Beiko sur Comment La Fusion a un impact sur la couche d'application d'Ethereum. -Pour plus d'informations, veuillez consulter cet article de blog de Tim Beiko sur [Comment la Fusion impacte la couche d'application d'Ethereum](https://blog.ethereum.org/2021/11/29/how-the-merge-impacts-app-layer/). ## La Fusion et la consommation énergétique {#merge-and-energy} @@ -109,33 +111,36 @@ La Fusion marque la fin de la preuve de travail pour Ethereum, et le début de l ## La Fusion et la fragmentation {#merge-and-scaling} -La Fusion permet également de préparer le terrain pour d'autres améliorations des mises à niveau non envisageables avec la preuve de travail, en rapprochant Ethereum d'une étape de la réalisation d'évolutivité, de sécurité et de durabilité décrite dans le [plan de développement d'Ethereum](/roadmap/vision/). +La Fusion permet également de préparer le terrain pour d'autres améliorations des mises à niveau non envisageables avec la preuve de travail, en rapprochant Ethereum d'une étape de la réalisation d'évolutivité, de sécurité et de durabilité décrite dans la [vision d'Ethereum](/roadmap/vision/). ## Les idées fausses sur La Fusion {#misconceptions} + Il existe deux types de nœuds sur Ethereum : ceux qui peuvent proposer de nouveaux blocs, et ceux qui ne le peuvent pas. Les nœuds qui peuvent proposer des blocs représentent une petite fraction du nombre total de nœuds existants. Cette catégorie inclut les nœuds de minage sous preuve de travail (PoW) et les nœuds des validateurs sous preuve d'enjeu (PoS). Cette catégorie nécessite d'engager des ressources économiques (que ce soient le pouvoir d'hachage des GPU pour la preuve de travail ou des ETH mis en jeu par les validateurs en preuve d'enjeu) afin de pouvoir, occasionnellement, proposer un nouveau bloc et gagner les récompenses offertes par le protocole. Les autres nœuds sur le réseau (la majorité en fait) ne nécessitent pas d'engager des ressources économiques, exception faite d'un ordinateur grand public bénéficiant d'un ou deux TO de stockage disponible et d'une connexion internet. Ces nœuds ne proposent pas de blocs mais ils jouent quand même un rôle critique dans la sécurité du réseau, en tenant tous les promoteurs responsables de l'énumération des blocs déjà existants et de la vérification de la validité des nouveaux blocs, conformément aux règles de consensus du réseau. Si le bloc est valide, le noeud permettra sa diffusion sur le réseau. Si le bloc n'est pas valable pour une raison quelconque, le logiciel ne le considérera pas valable et empêchera sa propagation. -Exécuter un noeud ne produisant pas de bloc est possible pour quiconque et ce, quel que soit le mécanisme de consensus (preuve de travail ou preuve d'enjeu). C'est même fortement encouragé pour l'ensemble des utilisateurs qui en ont les moyens. L'exécution d'un noeud est extrêmement précieuse pour Ethereum et permet à chaque personne qui opère son propre noeud de bénéficier d'avantages supplémentaires en matière de sécurité, de vie privée, et de résistance à la censure améliorées. +L’exécution d’un nœud non producteur de blocs est possible pour toute personne sous l’un ou l’autre mécanisme de consensus (preuve de travail ou preuve d'enjeu) ; c'est fortement encouragé pour tous les utilisateurs s'ils en ont les moyens. L'exécution d'un noeud est extrêmement précieuse pour Ethereum et permet à chaque personne qui opère son propre noeud de bénéficier d'avantages supplémentaires en matière de sécurité, de vie privée, et de résistance à la censure améliorées. -La possibilité pour quiconque de pouvoir exécuter son propre noeud est absolument essentiel afin de maintenir la décentralisation du réseau Ethereum. +La possibilité pour quiconque de pouvoir exécuter son propre noeud est absolument essentielle afin de maintenir la décentralisation du réseau Ethereum. -[En savoir plus sur l'exécution de votre propre noeud](/run-a-node/) +En savoir plus sur l'exécution de son propre nœud + Les frais de gaz sont le produit des demandes envoyées au réseau par rapport à sa capacité. La Fusion a rendu obsolète l'utilisation de la preuve de travail pour une transition vers le consensus par la preuve d'enjeu, mais elle n'a pas modifié de manière significative les paramètres qui influencent directement la capacité ou le débit du réseau. -Avec une feuille de route axée sur les rollups, les efforts sont concentrés sur la mise à l'échelle de l'activité des utilisateurs sur la couche 2, tout en activant le réseau principal de couche 1 en tant que couche de règlement décentralisée, sécurisée et optimisée pour le stockage de données cumulatives afin de rendre les transactions rollups exponentiellement moins chères. La transition vers la preuve d'enjeu est une étape préalable essentielle afin de réaliser cela. [En savoir plus sur le gaz et les frais.](/developers/docs/gas/) +Avec une feuille de route axée sur les rollups, les efforts sont concentrés sur la mise à l'échelle de l'activité des utilisateurs sur la couche 2, tout en activant le réseau principal de couche 1 en tant que couche de règlement décentralisée, sécurisée et optimisée pour le stockage de données cumulatives afin de rendre les transactions rollups exponentiellement moins chères. La transition vers la preuve d'enjeu est une étape préalable essentielle afin de réaliser cela. Plus d'infos sur le gaz et les frais + -Les récompenses d'ETH et de mise en jeu continuent d'être verrouillées sans possibilité d'être retirées. Les retraits sont prévus pour la prochaine mise à niveau Shanghai. - +contentPreview="False, but staking withdrawals have since been enabled via the Shanghai/Capella upgrade."> - -Cela peut sembler contre-intuitif, au regard des éléments ci-dessus, dans la mesure où les retraits ne sont pas activés jusqu'à la mise à niveau Shanghai, mais les validateurs DOIVENT avoir un accès immédiat aux récompenses de frais/MEV gagnés lors des propositions de bloc. +Initialement après La Fusion, les stakers ne pouvaient accéder qu'à des frais de priorité et MEV qui ont été gagnés à la suite de propositions de blocs. Ces récompenses sont créditées sur un compte non-staking contrôlé par le validateur (connu sous le nom de bénéficiaire de frais) et sont disponibles immédiatement. Ces récompenses sont séparées des récompenses de protocole pour l'exercice de fonctions de validateur. -Le protocole émet l'ETH comme récompense à destination des validateurs pour avoir contribué au consensus. La couche de consensus représente l'ETH nouvellement émis, où un validateur a une adresse unique qui contient son ETH mis en jeu ainsi que ses récompenses de protocole. Ces ETH sont bloqués jusqu'à la mise à niveau Shanghai. +Depuis la mise à niveau du réseau Shanghai/Capella, les validateurs peuvent maintenant désigner une adresse de retrait pour commencer à recevoir des paiements automatiques de tout solde excédentaire de mise en jeu (plus de 32 ETH à partir de récompenses de protocole). Cette mise à jour a également permis à un validateur de déverrouiller et de récupérer tout son solde en quittant le réseau. + +En savoir plus sur les retraits de mise en jeu -L'ETH pour la couche d'exécution est comptabilisé séparément de la couche de consensus. Lorsque les utilisateurs exécutent des transactions sur le réseau principal Ethereum, ils doivent s'acquitter des frais de gaz en ETH, y compris une commission pour le validateur. Cet ETH se trouve déjà sur la couche d'exécution, n'est PAS nouvellement émis par le protocole, et est disponible immédiatement pour le validateur (étant donné qu'une adresse appropriée de « destinataire de frais » est fournie au logiciel client). -Depuis que les retraits ont été activés suite à la mise à niveau Shanghai, tous les validateurs seront incités à retirer leur solde d'ETH si celui-ci est supérieur à 32, ces fonds ne permettant pas de générer un rendement complémentaire et qu'ils seront par ailleurs, verrouillés. En fonction de l'APR (déterminé par l'ETH total mis en jeu), ils peuvent être encouragés à quitter leur(s) validateur(s) pour récupérer leur solde en entier ou potentiellement en miser encore plus en utilisant leurs récompenses pour obtenir plus de rendement. +Depuis que les retraits ont été activés à la suite de la mise à jour Shanghai/Capella, tous les validateurs seront incités à retirer leur solde d'ETH si celui-ci est supérieur à 32 car ces fonds n'augmentent pas le rendement et sont par ailleurs bloqués. En fonction de l'APR (déterminé par l'ETH total mis en jeu), ils peuvent être encouragés à quitter leur(s) validateur(s) pour récupérer leur solde en entier ou potentiellement en miser encore plus en utilisant leurs récompenses pour obtenir plus de rendement. + +Une mise en garde importante ici : les sorties complètes des validateurs sont limitées par le protocole, et seul un nombre limité de validateurs peuvent sortir par période (toutes les 6,4 minutes). Cette limite fluctue en fonction du nombre de validateurs actifs, mais passe à environ 0,33 % du total des ETH stakés qui peuvent être sortis du réseau en une seule journée. -Une mise en garde importante et nécessaire ici, les sorties complètes de validateur sont limitées par le protocole. Ainsi, uniquement six validateurs peuvent sortir par période (chaques 6,4 minutes, et ainsi 1 350 fois par jour, ou seulement environ 43 200 ETH par jour sur plus de 10 millions d'ETH misés). Cette limite de taux s’ajuste en fonction du total d'ETH mis en jeu et empêche un exode massif des fonds. De plus, il empêche un attaquant potentiel d'utiliser ses ETH mis en jeu pour commettre une attaque normalement punissable tout en retirant sa mise avant que le protocole ne puisse appliquer la sanction. +Cela empêche un exode massif de fonds misés. En outre, cela empêche un attaquant potentiel ayant accès à une grande partie du total d'ETH mis en jeu de commettre une infraction « slashable » et de quitter/retirer tous les soldes de validateur incriminés au cours de la même époque avant que le protocole puisse appliquer la pénalité de réduction. -L'APR a été rendue dynamique intentionnellement, afin de permettre aux stakers de trouver un équilibre concernant le montant de la rémunération qu'ils souhaitent percevoir pour aider à sécuriser le réseau. Lorsque les retraits seront activés et si le taux est trop bas, les validateurs se retireront à un taux limité par le protocole. Peu à peu, cela permettra d'élever l'APR pour tous ceux qui restent, attirant encore une fois de nouveaux stakers ou en permettant le retour d'anciens validateurs. +L'APR a été rendue dynamique intentionnellement, afin de permettre aux stakers de trouver un équilibre concernant le montant de la rémunération qu'ils souhaitent percevoir pour aider à sécuriser le réseau. Si le taux est trop bas, alors les validateurs pourront se retirer en suivant un taux limité par le protocole. Peu à peu, cela permettra d'élever l'APR pour tous ceux qui restent, attirant encore une fois de nouveaux stakers ou en permettant le retour d'anciens validateurs. ## Que devient « Eth2 » ? {#eth2} @@ -204,9 +207,9 @@ Les blocs sont dès lors proposés par validation des nœuds qui ont misés l'ET ### La Fusion et la mise à niveau de Shanghai {#merge-and-shanghai} -Afin de simplifier et de permettre une transition aussi rapide et réussie que possible vers le système de preuve d'enjeu, la mise à jour vers La Fusion n'intègre pas certaines fonctionnalités anticipées telles que, par exemple, la possibilité de retirer les ETH bloqués sur la chaîne phare. La prochaine mise à niveau de Shanghai qui suivra la Fusion intégrera la possibilité de retirer les ETH bloqués sur chaîne phare. +Afin de simplifier et de permettre une transition aussi rapide et réussie que possible vers le système de preuve d'enjeu, la mise à jour vers La Fusion n'intègre pas certaines fonctionnalités anticipées telles que, par exemple, la possibilité de retirer les ETH bloqués sur la chaîne phare. Cette fonctionnalité a été activée séparément avec la mise à niveau Shanghai/Capella. -Restez à jour avec [la question de la planification de la mise à jour Shanghai sur GitHub](https://github.com/ethereum/pm/issues/450) ou le [Blog EF Recherche et Développement](https://blog.ethereum.org/category/research-and-development/). Pour ceux qui sont curieux, apprenez-en plus sur [Ce qui se passe après la fusion](https://youtu.be/7ggwLccuN5s?t=101), une présentation par Vitalik lors de l'événement ETHGlobal d'avril 2021. +Pour ceux qui sont curieux, apprenez-en plus sur [Ce qui se passe après la fusion](https://youtu.be/7ggwLccuN5s?t=101), une présentation par Vitalik lors de l'événement ETHGlobal d'avril 2021. ### La Fusion et la fragmentation {#merge-and-data-sharding} diff --git a/public/content/translations/fr/roadmap/merge/issuance/index.md b/public/content/translations/fr/roadmap/merge/issuance/index.md new file mode 100644 index 00000000000..dc3c950b6e1 --- /dev/null +++ b/public/content/translations/fr/roadmap/merge/issuance/index.md @@ -0,0 +1,134 @@ +--- +title: Impact de La Fusion sur l'offre d'ETH +description: Analyse de l'impact de La Fusion sur l'offre d'ETH +lang: fr +--- + +# Impact de La Fusion sur l'offre d'ETH {#how-the-merge-impacts-ETH-supply} + +La Fusion a marqué la transition du réseau Ethereum de la preuve de travail à la preuve d'enjeu, qui a eu lieu en septembre 2022. La manière dont l'ETH est émis a subi des changements lors de cette transition. Auparavant, de nouveaux ETH étaient émis à partir de deux sources : la couche d'exécution (c'est-à-dire Réseau principal) et la couche de consensus (c'est-à-dire la chaîne phare). Depuis La Fusion, l'émission sur la couche d'exécution est désormais nulle. Analysons cela en détail. + +## La répartition de l'émission d'ETH {#components-of-eth-issuance} + +Nous pouvons diviser l'offre d'ETH en deux composantes principales : l'émission et la destruction en le brulant. + +**L'émission** d'ETH est le processus de création d'ETH qui n'existait pas auparavant. Le **brûlage** de l'ETH se produit lorsque l'ETH existant est détruit, le retirant de la circulation. Le taux d'émission et de destruction est calculé par plusieurs paramètres, et l'équilibre entre eux détermine le taux d'inflation/déflation résultant de l'éther. + + + +- Avant la transition vers la preuve d'enjeu, les mineurs recevaient environ 13 000 ETH/jour +- Les validateurs reçoivent environ 1 700 ETH/jour, basés sur un total d'environ 14 millions d'ETH mis en jeu +- L'émission exacte liée à la preuve d'enjeu fluctue en fonction du montant total d'ETH mis en jeu +- **Depuis La Fusion, seul le ~1 700 ETH/jour subsiste, réduisant l'émission totale d'ETH neuf de ~88 %** +- La destruction en brûlant : celle-ci varie en fonction de la demande du réseau. _Si_ un prix moyen du gaz d'au moins 16 gwei est observé pour une journée donnée, cela compense totalement les ~1 700 ETH émis pour les validateurs et ramène l'inflation nette d'ETH à zéro ou moins pour cette journée. + + + +## Avant la fusion (historique) {#pre-merge} + +### Émission de la couche d'exécution {#el-issuance-pre-merge} + +En preuve de travail, les mineurs n'interagissaient qu'avec la couche d'exécution et étaient récompensés par des récompenses de bloc, si et seulement s'ils étaient les premiers mineurs à résoudre le nouveau bloc. Depuis [la mise à jour Constantinople](/history/#constantinople) en 2019, cette récompense était de 2 ETH par bloc. Les mineurs étaient également récompensés pour la publication de blocs [oncle](/glossary/#ommer), qui étaient des blocs valides mais qui n'avaient pas abouti à la chaîne la plus longue/canonique. Ces récompenses étaient plafonnées à 1,75 ETH par bloc oncle et _s'ajoutaient à_ la récompense émise à partir du bloc canonique. Le processus de minage était une activité économiquement intensive, qui nécessitait historiquement des niveaux élevés d'émission d'ETH pour être soutenu. + +### Émission de la couche de consensus {#cl-issuance-pre-merge} + +La [Chaîne phare](/history/#beacon-chain-genesis) est entrée en service en 2020. Au lieu de mineurs, elle est sécurisée par des validateurs utilisant la preuve d'enjeu. Cette chaîne a été lancée grâce aux utilisateurs d'Ethereum qui déposaient de l'ETH de manière unidirectionnelle dans un contrat intelligent sur le réseau principal (la couche d'exécution), que la Chaîne phare écoute, en créditant l'utilisateur d'une quantité égale d'ETH sur la nouvelle chaîne. Jusqu'à ce que La Fusion ait lieu, les validateurs de la Chaîne phare ne traitaient pas les transactions et avaient seulement comme mission d'établir un consensus sur l'état du groupe de validateurs lui-même. + +Les validateurs de la Chaîne phare sont récompensés en ETH pour attester de l'état de la chaîne et proposer des blocs. Les récompenses (ou les pénalités) sont calculées et distribuées à chaque période (toutes les 6,4 minutes) en fonction des performances des validateurs. Les récompenses des validateurs sont **nettement** moins élevées que les récompenses de minage qui étaient précédemment émises sous la preuve de travail (2 ETH toutes les ~13,5 secondes), car l'exploitation d'un nœud de validation n'est pas aussi économiquement intense et ne nécessite donc ni ne garantit une récompense aussi élevée. + +### Répartition de l'émission avant la fusion {#pre-merge-issuance-breakdown} + +Offre totale d'ETH : **~120 520 000 ETH** (au moment de La Fusion en septembre 2022) + +**Émission de la couche d'exécution :** + +- Était estimée à 2,08 ETH par période de 13,3 secondes\* : **~4 930 000** ETH émis en un an +- Entraînant un taux d'inflation **d'environ 4,09 %** (4,93 millions par an / 120,5 millions au total) +- \*Cela comprend les 2 ETH par bloc canonique, ainsi qu'une moyenne de 0,08 ETH sur la durée provenant des blocs oncles. En utilisant également 13,3 secondes, le temps cible de base pour un bloc sans aucune influence de la [bombe de difficulté](/glossary/#difficulty-bomb). ([Voir la source](https://bitinfocharts.com/ethereum/)) + +**Émission de la couche de consensus :** + +- En utilisant un total de 14 000 000 d'ETH en jeu, le taux d'émission d'ETH est d'environ 1 700 ETH par jour ([Voir la source](https://ultrasound.money/)) +- Cela résulte en **~620 500** ETH émis en un an +- Cela a entraîné un taux d'inflation **d'environ 0,52 %** (620,5 K par an / 119,3 M au total) + + +Taux d'émission annuel totalisé (avant la fusion) : ~4,61 % (4,09 % + 0,52 %)

    +~88,7 % de l'émission allaient aux mineurs de la couche d'exécution (4,09 / 4,61 * 100)

    +~11,3 % étaient émis aux validateurs de la couche de consensus (0,52 / 4,61 * 100) +
    + +## Après la fusion (à présent) {#post-merge} + +### Émission de la couche d'exécution {#el-issuance-post-merge} + +L'émission de la couche d'exécution depuis La Fusion est nulle. La preuve de travail n'est plus un moyen valide de production de blocs selon les nouvelles règles de consensus. Toute l'activité de la couche d'exécution est regroupée dans des « blocs de phare », qui sont publiés et attestés par les validateurs de la preuve d'enjeu. Les récompenses pour l'attestation et la publication des blocs de phare sont comptabilisées séparément sur la couche de consensus. + +### Émission de la couche de consensus {#cl-issuance-post-merge} + +L'émission de la couche de consensus se poursuit aujourd'hui comme avant La Fusion, avec des récompenses pour les validateurs qui attestent et proposent des blocs. Les récompenses des validateurs continuent de s'accumuler sur _les soldes des validateurs_ qui sont gérés au sein de la couche de consensus. Contrairement aux comptes actuels (« comptes d'exécution »), qui peuvent effectuer des transactions sur le réseau principal, ces comptes Ethereum séparés ne peuvent pas effectuer librement des transactions avec d'autres comptes Ethereum. Les fonds de ces comptes ne peuvent être retirés que vers une seule adresse d'exécution préalablement spécifiée. + +Depuis la mise à jour de Shanghai/Capella qui a eu lieu en avril 2023, ces retraits ont été activés pour les validateurs. Les stakers sont incités à retirer leurs _gains/récompenses (solde supérieur à 32 ETH)_ car ces fonds ne contribuent pas plus à leur poids d'enjeu (qui atteint un maximum à 32). + +Les validateurs peuvent également choisir de sortir et de retirer l'intégralité de leur solde de validateur. Pour garantir la stabilité d'Ethereum, le nombre de validateurs quittant simultanément est plafonné. + +Environ 0,33 % du nombre total de validateurs peuvent sortir en une journée donnée. Par défaut, quatre (4) validateurs peuvent sortir par période (toutes les 6,4 minutes, soit 900 par jour). Un (1) validateur supplémentaire est autorisé à sortir pour chaque 65 536 (216) validateurs supplémentaires au-delà de 262 144 (218). Par exemple, avec plus de 327 680 validateurs, cinq (5) peuvent sortir par période (1 125 par jour). Six (6) seront autorisés avec un nombre total de validateurs actifs supérieur à 393 216, et ainsi de suite. + +À mesure que davantage de validateurs se retirent, le nombre maximum de validateurs sortants sera progressivement réduit à un minimum de quatre pour empêcher intentionnellement de grandes quantités d'ETH en jeu d'être retirées simultanément, ce qui pourrait provoquer des perturbations majeures. + +### Répartition de l'inflation après la fusion {#post-merge-inflation-breakdown} + +- Offre totale d'ETH : **~120 520 000 ETH** (au moment de La Fusion en septembre 2022) +- Émission de la couche d'exécution : **0** +- Émission de la couche de consensus : Identique à ce qui précède, taux d'émission annualisé d'environ **0,52 %** (avec un total de 14 millions d'ETH en jeu) + + +Taux d'émission annualisé total : ~0,52 %

    +Réduction nette de l'émission annuelle d'ETH : ~88,7 % ((4,61 % - 0,52 %) / 4,61 % * 100) +
    + +## La destruction par brûlage {#the-burn} + +La force opposée à l'émission d'ETH est le taux auquel l'ETH est brûlé. Pour qu'une transaction soit exécutée sur Ethereum, des frais minimum (appelés « frais de base ») doivent être payés, qui fluctuent continuellement (de bloc à bloc) en fonction de l'activité du réseau. Les frais sont payés en ETH et sont _nécessaires_ pour que la transaction soit considérée comme valide. Ces frais sont _brûlés_ pendant le processus de transaction, les retirant ainsi de la circulation. + + +La combustion des frais a été mise en place avec la mise à jour London en août 2021 et est restée inchangée depuis la Fusion. + + +En plus de la combustion des frais mise en œuvre par la mise à niveau London, les validateurs peuvent également subir des pénalités s'ils sont hors ligne, ou pire, ils peuvent être sanctionnés pour avoir enfreint des règles spécifiques qui menacent la sécurité du réseau. Ces pénalités entraînent une réduction d'ETH du solde du validateur, qui n'est alors pas directement donné à un autre compte, ce qui équivaut à le brûler/le retirer de la circulation. + +### Calcul de la moyenne du prix du gaz pour être déflationniste {#calculating-average-gas-price-for-deflation} + +Comme discuté précédemment, la quantité d'ETH émise en une journée donnée dépend de la totalité des ETH mis en jeu. Au moment de l'écriture de ses lignes, cela représente environ 1 700 ETH/jour. + +Pour déterminer le prix moyen du gaz nécessaire pour compenser complètement cette émission au cours d'une période de 24 heures, nous commencerons par calculer le nombre total de blocs en une journée, en supposant un temps de bloc de 12 secondes : + +- `(1 bloc / 12 secondes) * (60 secondes/minute) = 5 blocs/minute` +- `(5 blocs/minute) * (60 minutes/heure) = 300 blocs/heure` +- `(300 blocs/heure) * (24 heures/jour) = 7 200 blocs/jour` + +Chaque bloc cible `15x10^6 gaz/bloc` ([plus d'informations sur le gaz](/developers/docs/gas/)). En utilisant cela, nous pouvons en déduire le prix moyen du gaz (en unités de gwei/gaz) nécessaire pour compenser l'émission, étant donné une émission quotidienne totale d'ETH de 1 700 : + +- `7 200 blocs/jour * 15x10^6 gaz/bloc *`**` Y gwei/gaz`**`* 1 ETH/ 10^9 gwei = 1 700 ETH/jour` + +En cherchant `Y` : + +- `Y = (1 700(10^9))/(7 200 * 15(10^6)) = (17x10^3)/(72 * 15) = 16 gwei` (arrondi à seulement deux chiffres significatifs) + +Une autre façon de réarranger cette dernière étape serait de remplacer `1 700` par une variable `X` qui représente l'émission quotidienne d'ETH, et de simplifier le reste en : + +- `Y = (X(10^3)/(7200 * 15)) = X/108` + +Nous pouvons simplifier et écrire ceci comme une fonction de `X` : + +- `F(X) = X/108` où `X` représente l'émission quotidienne d'ETH et `F(X)` représente le prix en gwei requis pour compenser entièrement la nouvelle émission d'ETH. + +Ainsi, par exemple, si `X` (l'émission quotidienne d'ETH) augmente à 1 800 en fonction de la totalité des ETH mis en jeu, `f(X)` (le gwei requis pour compenser toute l'émission) serait alors de `17 gwei` (en utilisant 2 chiffres significatifs) + +## Complément d'information {#further-reading} + +- [La Fusion](/roadmap/merge/) +- [Ultrasound.money](https://ultrasound.money/) - _Tableaux de bord disponibles pour visualiser l'émission et la destruction d'ETH en temps réel_ +- [Graphique de l'émission Ethereum](https://www.attestant.io/posts/charting-ethereum-issuance/) - _Jim McDonald 2020_ diff --git a/public/content/translations/fr/roadmap/pbs/index.md b/public/content/translations/fr/roadmap/pbs/index.md new file mode 100644 index 00000000000..e6c8ca3ac20 --- /dev/null +++ b/public/content/translations/fr/roadmap/pbs/index.md @@ -0,0 +1,51 @@ +--- +title: Séparation entre le validateur et le constructeur de blocs +description: Découvrez la raison, mais aussi de quelle manière, les validateurs d'Ethereum vont séparer leurs responsabilités concernant la construction et la diffusion de blocs. +lang: fr +--- + +# Séparation entre le validateur et le constructeur de blocs {#proposer-builder-separation} + +Actuellement, les validateurs d'Ethereum produisent _et_ diffusent les blocs. Ils regroupent les transactions dont ils ont entendu parler via le réseau d'informations et les regroupent dans un bloc qui est envoyé aux pairs du réseau Ethereum. La **séparation proposant-constructeur (PBS)** répartit ces tâches entre plusieurs validateurs. Les constructeurs de blocs deviennent ainsi responsables de la création des blocs et les remettent au proposant de blocs, lors de chaque intervalle. Le proposant de bloc ne peut voir le contenu d'un bloc, mais se dirige simplement vers le plus rentable, en payant une commission au constructeur de bloc avant d'envoyer celui-ci vers ses pairs. + +C'est une mise à jour qui s'avère très importante, et ce pour plusieurs raisons. Premièrement, cela crée des opportunités afin de prévenir toute censure de transaction au niveau du protocole. Deuxièmement, cela évite que les validateurs amateurs ne soient concurrencés par des acteurs institutionnels capables de mieux optimiser la rentabilité de leur construction de blocs. Troisièmement, cela aide à faire évoluer Ethereum en permettant les mises à niveau de Danksharding. + +## PBS et la résistance à la censure {#pbs-and-censorship-resistance} + +La séparation entre constructeurs et proposants de blocs, rend bien plus ardue la censure des transactions par les constructeurs de blocs. En effet, des critères d'inclusion relativement complexes peuvent être ajoutés pour garantir qu'aucune censure n'a eu lieu avant que le blocage ne soit proposé. Comme le proposant du bloc est une entité distincte du constructeur du bloc, il peut assumer le rôle de protecteur contre la censure des constructeurs de blocs. + +Par exemple, des listes d'inclusion peuvent être introduites. Ainsi, quand les validateurs prennent connaissance des transactions mais ne les voient point incluses dans les blocs, celles-ci peuvent alors êtres rendues indispensables dans le bloc suivant. La liste d'inclusion est générée depuis le « mempool » local des proposants de blocs (liste des transactions dont ils ont connaissance), puis adressée à leurs homologues juste avant la proposition d'un bloc. Si certaines transactions de la liste d'inclusion sont manquantes, le proposant de bloc peut soit rejeter le bloc, ajouter les transactions manquantes avant de soumettre celui-ci, soit le proposer et le laisser être rejeté une fois reçu par les autres validateurs. Potentiellement, il existe aussi une version bien plus efficace de ce concept, stipulant que les constructeurs de blocs se doivent pleinement d'utiliser le bloc disponible ; en cas contraire, les transactions sont de facto ajoutées à partir de la liste d'inclusion du proposant de bloc. Il s'agit encore d'un domaine de recherche active et la configuration optimale des listes d'inclusion, n'est encore pas à ce jour, pleinement définie. + +[Les mempools encryptés](https://www.youtube.com/watch?v=fHDjgFcha0M&list=PLpktWkixc1gUqkyc1-iE6TT0RWQTBJELe&index=3) peuvent aussi empêcher les proposants et constructeurs de blocs de connaître quelles transactions ils incluent dans un bloc, mais seulement après que ledit bloc ait été déjà émis. + + + +Des organisations puissantes peuvent aussi faire pression sur les validateurs pour qu'ils censurent des transactions issues ou à destination de certaines adresses. Ces derniers se plient à cette exigence en détectant les adresses blacklistées au sein de leur pool de transaction puis en les excluant de leurs propositions de blocs. Après la séparation proposants et constructeurs de blocs (PBS), cette action ne sera plus possible car les proposants de blocs ne sauront pas quelles transactions ils diffusent dans leurs blocs. Il peut être important que certaines personnes ou applications se conforment aux règles de censure, par exemple lorsqu'elles sont adoptées dans leur région. Dans ces cas, la conformité se produit au niveau de l’application, tandis que le protocole reste sans autorisation et sans censure. + + + +## PBS et MEV {#pbs-and-mev} + +**Maximum Extractable Value ou Valeur Maximale Extractible (MEV)** fait référence aux validateurs maximisant leur rentabilité en ordonnant des transactions de manière profitable. Des situations courantes incluent des manipulations d'arbitrage sur les échanges décentralisés (p. ex. anticiper un achat ou une vente conséquents) ou encore identifier des opportunités de liquidation de positions DeFi. Maximiser la MEV nécessite un savoir-faire technique sophistiqué et des logiciels personnalisés ajoutés aux validateurs normaux, ce qui rend beaucoup plus probable le fait que les opérateurs institutionnels surpassent les particuliers et les validateurs amateurs au niveau des applications d'extraction MEV. Cela signifie que les rendements du stacking sont susceptibles d'être plus élevés via des opérateurs centralisés, créant ainsi un pouvoir de centralisation amené à décourager le stacking à domicile. + +La séparation entre le constructeur et le proposant de bloc (PBS) résout ce dilemme en repensant les critères économiques de la valeur maximale extractible (MEV). Pour éviter au proposant de bloc d'effectuer ses propres recherches sur la Valeur maximale extractible (MEV), celui-ci choisit simplement un bloc parmi tous ceux soumis par les constructeurs de blocs. Les constructeurs de blocs ont peut-être effectué une extraction MEV sophistiquée, mais la récompense revient au proposant du bloc. Cela signifie que même si un petit groupe de constructeurs de blocs spécialisés dominent l’extraction de MEV, la récompense pourrait revenir à n’importe quel validateur du réseau, y compris les parieurs individuels. + + + +Les individus pourraient être incités à miser dans des pools plutôt que seuls en raison des récompenses améliorées offertes par les stratégies MEV sophistiquées. Séparer la construction de blocs de la proposition de bloc signifie que la MEV extraite sera distribuée entre davantage de validateurs plutôt que d'être centralisée avec le chercheur de MEV le plus efficace. Dans le même temps, permettre à des constructeurs de blocs spécialisés d'exister soulage les individus du fardeau de la construction de blocs et empêche également les individus de voler la MEV pour eux-mêmes, tout en maximisant le nombre de validateurs individuels et indépendants qui peuvent vérifier que les blocs sont honnêtes. Le concept important est « l'asymétrie prouveur-vérificateur », qui fait référence à l'idée selon laquelle la production centralisée de blocs est acceptable tant qu'il existe un réseau robuste et décentralisé au maximum de validateurs capables de prouver que les blocs sont honnêtes. La décentralisation reste un moyen, non un but final en soi. Nous désirons simplement des blocs intègres. + + +## PBS et Danksharding {#pbs-and-danksharding} + +Danksharding est la solution qu'Ethereum adoptera pour atteindre une échelle de >100,000 transactions par seconde tout en réduisant les frais des utilisateurs rollup. Celle-ci s'appuie sur la séparation entre constructeurs et proposants de blocs (PBS), car elle ajoute une charge de travail supplémentaire pour les constructeurs de blocs, qui devront générer des validations allant jusqu'à 64 MB de données rollup, le tout en moins d'une seconde. Cela nécessitera probablement des constructeurs spécialisés capables de consacrer du matériel assez conséquent à cette tâche. Or, dans la situation actuelle, la construction des blocs pourrait devenir de plus en plus centralisée autour d'opérateurs plus exigeants et puissants en raison de l'extraction de MEV. La séparation entre le proposant et le constructeur de blocs est une façon d'embrasser cette réalité et d'éviter qu'elle n'exerce une force centralisatrice sur la validation des blocs (la partie importante) ou sur la distribution des récompenses issues du stacking. Un grand avantage secondaire est que les constructeurs de blocs spécialisés sont également disposés et capables de calculer les preuves de données nécessaires pour Danksharding. + +## Progrès actuels {#current-progress} + +La séparation entre le constructeur de blocs et le proposant de blocs (PBS) est maintenant à un stade avancé de recherche, mais il reste encore quelques interrogations importantes de conception à résoudre, avant que celles-ci puissent être prototypées chez les clients d'Ethereum. Il n’y a pas encore de spécifications finalisées. Cela signifie que le délai de réalisation de la séparation entre le constructeur et le proposant de blocs (PBS) s'étale sur un délai d'un an, voire plus. Vérifier le dernier [état de recherche](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance). + +## Complément d'information {#further-reading} + +- [État de la recherche : résistance à la censure sous PBS](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) +- [Conceptions de marchés de frais compatibles avec PBS](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) +- [PBS et la résistance à la censure](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Secondary-auctions) +- [Listes d'inclusion](https://notes.ethereum.org/@fradamt/H1ZqdtrBF) diff --git a/public/content/translations/fr/roadmap/scaling/index.md b/public/content/translations/fr/roadmap/scaling/index.md new file mode 100644 index 00000000000..16fa4521397 --- /dev/null +++ b/public/content/translations/fr/roadmap/scaling/index.md @@ -0,0 +1,47 @@ +--- +title: Permettre l'évolutivité d'Ethereum +description: Les rollups regroupent des transactions hors chaîne, ce qui réduit les coûts pour l'utilisateur. Cependant, la manière dont les rollups utilisent actuellement les données est pour l'heure trop coûteuse, ce qui limite le coût des transactions. La solution Proto-Danksharding règle ce problème. +lang: fr +image: /roadmap/roadmap-transactions.png +alt: "Feuille de route d'Ethereum" +template: roadmap +--- + +Ethereum est mis à l'échelle à l'aide de [couches 2](/layer-2/#rollups) (également appelées rollups), qui regroupent les transactions et envoient le résultat à Ethereum. Bien que les rollups soient jusqu'à huit fois moins chers que le réseau principal d'Ethereum, il est possible d'optimiser davantage ces derniers, et réduire ainsi les coûts des utilisateurs finaux. Les rollups reposent également sur certains composants centralisés, que les développeurs peuvent supprimer à mesure que les rollups évoluent. + + +
      +
    • Aujourd'hui, les rollups sont 3 à 8 fois moins coûteux que la couche 1 d'Ethereum.
    • +
    • Les rollups ZK réduiront bientôt de 40 à 100 fois moins ces coûts
    • +
    • Les changements à venir apportés à Ethereum fourniront une mise à l'échelle ~100-1000x supplémentaire
    • +
    • Les utilisateurs bénéficieront de transactions à moins de 0,001 USD
    • +
    +
    + +## Rendre les données moins onéreuses {#making-data-cheaper} + +Les rollups collectent un grand nombre de transactions, les exécutent et soumettent les résultats à Ethereum. Ceci génère un maximum de données qui doivent être publiquement disponibles, pour que quiconque puisse exécuter les transactions et vérifier que l'opérateur du rollup soit intègre. Si une personne constate une divergence, cette dernière peut être contestée. + +### Proto-Danksharding {#proto-danksharding} + +Les données rollup sont stockées en permanence sur Ethereum, ce qui est coûteux. Plus de 90 % des frais de transaction assumés par les utilisateurs sur les rollups sont dus à ce stockage de données. Pour réduire les coûts de transaction, il est possible de déplacer les données vers un nouveau stockage temporaire appelé « blob » - Binary Large Object/Large Objet Binaire. Les blobs sont moins chers car temporaires ; ils sont supprimés d'Ethereum une fois leur nécessité devenue obsolète. Le stockage des données rollup à long terme devient la responsabilité des personnes qui en ont besoin, telles que les opérateurs rollup, les bourses, les services d'indexation, etc. L'ajout de transactions blob à Ethereum fait partie d'une mise à niveau connue sous le terme « Proto-Danksharding ». Solution prévue d'être déployée dans un avenir très proche, peut-être vers la fin de l'année 2023. + +Une fois que les transactions blob seront devenues partie intégrante du protocole Ethereum via Proto-Danksharding, il sera possible d'ajouter de nombreux blobs aux blocs Ethereum. Il s’agira d’une autre augmentation substantielle (>100x) du débit d’Ethereum et d’une réduction des coûts de transaction. + +### Danksharding {#danksharding} + +La deuxième étape de l'expansion des données blob est compliquée car elle nécessite de nouvelles méthodes pour vérifier que les données rollup sont disponibles sur le réseau et repose sur des validateurs séparant leurs responsabilités de création de blocs et de proposition de blocs. Cela nécessite également un moyen de prouver cryptographiquement que les validateurs ont vérifié de petits sous-ensembles de données blob. + +Cette seconde étape est nommée [« Danksharding »](/roadmap/danksharding/). Il est probable que cette dernière prenne plusieurs années avant d'être pleinement mise en œuvre. La solution Danksharding repose sur d'autres développements tels que [la séparation entre la construction et la proposition de blocs](/roadmap/pbs) et de nouveaux modèles de réseau qui permettent à celui-ci de confirmer avec efficacité, que les données sont disponibles en échantillonnant de manière aléatoire quelques kilo-octets à la fois, aussi appelé [Échantillonnage de disponibilité des données (DAS)](/developers/docs/data-availability). + +En savoir plus sur la fragmentation + +## Décentraliser les rollups {#decentralizing-rollups} + +[Les rollups](/layer-2) permettent déjà la mise à l'échelle d'Ethereum. Un[ riche écosystème de projets rollups](https://l2beat.com/scaling/tvl) permet aux utilisateurs d'effectuer des transactions rapidement et à moindre coût, avec divers niveaux de garantie de sécurité. Cependant, les rollups ont été initiés en utilisant des séquenceurs centralisés (ordinateurs qui effectuent l'ensemble du traitement et l'agrégation des transactions avant de les soumettre à Ethereum). Cette approche est vulnérable à la censure car, en d'autres termes, les opérateurs-séquenceurs peuvent être sanctionnés, soudoyés ou corrompus. Parallèlement,[ les rollups fluctuent](https://l2beat.com) de la façon dont ils valident les données entrantes. La meilleure voie possible, consiste à ce que les « provers/ceux qui prouvent » soumettent des preuves de fraude ou de validité, mais tous les rollups n'ont pas encore atteint ce niveau. Même ceux qui utilisent des preuves de validité/fraude font appel à un petit groupe de « provers » réputés. Par conséquent, la prochaine étape cruciale dans la mise à l'échelle d'Ethereum consiste à répartir la responsabilité de l'exécution des séquenceurs et des provers, parmi davantage de personnes. + +Plus d'infos sur les rollups + +## Progrès actuels {#current-progress} + +La solution Proto-Danksharding sera probablement l’un des premiers éléments de la feuille de route à mettre en œuvre. Les étapes de calcul décentralisé nécessaires à sa mise en place sont déjà entamées, et plusieurs clients ont établi des prototypes qui gèrent les données blob. Or, la mise en œuvre complète de la solution Danksharding reste peu évidente avant plusieurs années, tant celle-ci dépend de la réalisation de plusieurs autres éléments de la feuille de route devant être concrétisés en première instance. La décentralisation de l'infrastructure de rollup sera probablement un processus progressif : il existe de nombreux rollups différents qui construisent des systèmes légèrement différents et seront entièrement décentralisés à des rythmes différents. diff --git a/public/content/translations/fr/roadmap/secret-leader-election/index.md b/public/content/translations/fr/roadmap/secret-leader-election/index.md new file mode 100644 index 00000000000..20929b8e0fd --- /dev/null +++ b/public/content/translations/fr/roadmap/secret-leader-election/index.md @@ -0,0 +1,44 @@ +--- +title: Élection d'un chef secret +description: Explication sur la manière dont l'élection du leader secret peut aider à protéger les validateurs contre certaines attaques +lang: fr +summaryPoints: + - L'adresse IP des proposeurs de blocs peut être connue à l'avance, les rendant vulnérables aux attaques. + - L'élection d'un leader secret dissimule l'identité des validateurs de sorte qu'ils ne peuvent pas être connus à l'avance. + - Une extension de cette idée est de rendre la sélection des validateurs aléatoire pour chaque créneau. +--- + +# Élection d'un chef secret {#single-secret-leader-election} + +Dans le mécanisme de consensus actuel basé sur la [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos), la liste des futurs proposeurs de blocs est publique et il est possible de cartographier leurs adresses IP. Cela signifie que les attaquants pourraient identifier les validateurs censés proposer un bloc et cibler ces derniers via une attaque par déni de service (DOS) les rendant incapables de proposer leur bloc dans le temps imparti. + +Cela pourrait créer des opportunités de profit pour un attaquant. Ainsi, un proposeur de bloc sélectionné pour un créneau `n+1` pourrait attaquer par Déni de service (DOS) un autre proposant lors du même créneau `n`, l'empêchant de proposer un bloc. Ceci permettrait au proposeur de bloc attaquant d'extraire la MEV (Valeur Maximale Extractible) des deux créneaux, ou de rassembler toutes les transactions qui auraient dû être réparties sur deux blocs et de les inclure toutes dans un seul bloc, et ainsi percevoir l'ensemble des frais associés. Ceci affecterait probablement plutôt les validateurs particuliers que les validateurs institutionnels aguerris qui peuvent utiliser des méthodes plus sophistiquées pour se protéger des attaques DOS, et ainsi former une force centralisatrice. + +Il y a plusieurs solutions à ce problème. L'une est la [Technologie des Validateurs Distribués](https://github.com/ethereum/distributed-validator-specs) qui vise à répartir plusieurs tâches nécessaires pour faire fonctionner un validateur sur plusieurs machines, avec de la redondance, de sorte qu'il soit bien plus difficile pour un attaquant d'empêcher un bloc d'être proposé sur un créneau particulier. Toutefois, la solution la plus robuste est **L'Élection d'un Leader Secret Unique (SSLE)**. + +## Élection d'un leader secret unique {#secret-leader-election} + +Dans le SSLE, la cryptographie est utilisée de manière astucieuse pour assurer que seul le validateur sélectionné sache qu'il a été sélectionné. Pour que cela fonctionne, chaque validateur doit soumettre un engagement pour un secret qu'ils partagent tous. Les engagements sont mélangés et reconfigurés de sorte que personne ne puisse remonter aux validateurs à partir des engagements mais chaque validateur sait quel engagement lui appartient. Un engagement est alors choisi au hasard. Si un validateur détecte que leur engagement a été choisi, il sait que c'est à son tour de proposer un bloc. + +L'implémentation dominante de cette idée s'appelle [Whisk](https://ethresear.ch/t/whisk-a-practical-shuffle-based-ssle-protocol-for-ethereum/11763). Elle fonctionne comme ceci : + +1. Les validateurs s'engagent sur un secret partagé. Le schéma d'engagement est conçu de telle sorte qu'il peut être attaché à l'identité d'un validateur mais il peut aussi être soumis à un aléa afin qu'aucun tiers ne puisse retrouver par ingénierie inversée l'association et relier un engagement particulier à un validateur particulier. +2. Au début d'une période, un ensemble aléatoire de validateurs est choisi pour échantillonner les engagements de 16 384 validateurs en utilisant RANDAO. +3. Pour les 8 182 créneaux suivants (1 jour), les proposeurs de bloc mélangent aléatoirement un sous-ensemble d'engagements en utilisant leur propre entropie personnelle. +4. À la fin du mélange, RANDAO est utilisé pour créer une liste ordonnée des engagements. Cette liste est cartographiée sur les emplacements Ethereum. +5. Les validateurs voient que leur engagement est attaché à un créneau particulier, et lorsque le créneau arrive, ils proposent un bloc. +6. Ces étapes sont répétées de sorte que l'affectation des engagements aux créneaux est toujours en avance sur le créneau suivant. + +Cela empêche les attaquants de connaître à l'avance quel validateur spécifique proposera le bloc suivant, écartant ainsi la possibilité d'attaques DOS. + +## Élection secrète d'un leader non-unique (SnSLE) {#secret-non-single-leader-election} + +Il existe également une proposition distincte visant à créer un scénario, dans lequel les validateurs possèdent chacun une chance aléatoire de proposer un bloc pour chaque créneau de manière similaire à la façon de proposer un bloc dans le cadre de la preuve de travail, plus connue sous l'appellation d'**élection secrète d'un leader non-unique (SnSLE)**. Une façon assez simple d'agir ainsi est d'utiliser la fonction RANDAO destinée à sélectionner des validateurs de manière aléatoire, au sein du protocole du jour. Le principe de RANDAO est qu'un nombre suffisamment aléatoire est généré en mixant les empreintes soumises par de multiples validateurs indépendants. Avec le protocole SnSLE, ces empreintes peuvent être exploitées pour choisir le proposeur du bloc suivant, par exemple en optant pour l'empreinte de valeur la plus faible. L'éventail des empreintes valides peut être limité, afin d'ajuster l'éventualité de la sélection de validateurs individuels dans chaque créneau. Ainsi, en affirmant que le hachage se doit d'être inférieur à` 2^256 * 5 / N`, où` N` = nombre de validateurs actifs, la probabilité qu'un validateur individuel soit sélectionné dans chaque créneau serait de` 5/N`. Dans cet exemple, il y aurait 99,3 % de chances qu'au moins un proposant génère un hachage valide dans chaque créneau. + +## Progrès actuels {#current-progress} + +Les protocoles SSLE et SnSLE sont tous deux en phase de recherche. À ce jour, il n'existe pas encore de spécification finalisée pour l'une ou l'autre de ces idées. SSLE et SnSLE sont des propositions concurrentes qui ne peuvent être toutes deux mises en œuvre. Avant d'être déployés, ces derniers doivent faire l'objet d'une recherche et d'un développement plus approfondis, d'un prototypage et d'une mise en œuvre sur des réseaux de test publics. + +## Complément d'information {#further-reading} + +- [SnSLE](https://ethresear.ch/t/secret-non-single-leader-election/11789) diff --git a/public/content/translations/fr/roadmap/security/index.md b/public/content/translations/fr/roadmap/security/index.md new file mode 100644 index 00000000000..d1a9028e7e2 --- /dev/null +++ b/public/content/translations/fr/roadmap/security/index.md @@ -0,0 +1,48 @@ +--- +title: Un Ethereum plus sûr +description: Ethereum est la plateforme de contrats intelligents la plus sûre et la plus décentralisée qui existe. Cependant, des améliorations peuvent encore être apportées pour qu'Ethereum reste résistant à tout niveau d'attaque à l'avenir. +lang: fr +image: /roadmap/roadmap-security.png +alt: "Feuille de route d'Ethereum" +template: roadmap +--- + +Ethereum est déjà une plateforme de contrats intelligents décentralisée et très sûre. Néanmoins, des améliorations peuvent encore être apportées pour qu'Ethereum reste résistant à tous les types d'attaques à l'avenir. Il s'agit notamment de modifications subtiles de la manière dont les clients Ethereum traitent les blocs concurrents, ainsi que de l'augmentation de la vitesse à laquelle le réseau considère que les blocs sont [« finalisés »](/developers/docs/consensus-mechanisms/pos/#finality) (ce qui signifie qu'ils ne peuvent pas être modifiés sans entraîner des pertes économiques considérables pour un attaquant). + +Il existe également des améliorations qui rendent la censure des transactions beaucoup plus difficile en rendant les auteurs de propositions de blocs aveugles au contenu réel de leurs blocs, ainsi que de nouveaux moyens d'identifier lorsqu'un client censure. L'ensemble de ces améliorations permettra d'améliorer le protocole de preuve d'enjeu afin que les utilisateurs - qu'il s'agisse de particuliers ou d'entreprises - aient une confiance instantanée dans leurs applications, leurs données et leurs actifs sur Ethereum. + +## Retraits de la mise en jeu {#staking-withdrawals} + +La transition de la preuve de travail à la preuve d'enjeu a commencé avec les pionniers d'Ethereum qui ont « mis en jeu » leur ETH dans un contrat de dépôt. Cet ETH est utilisé pour protéger le réseau. Cependant, cet ETH ne peut pas encore être débloqué et rendu aux utilisateurs. Permettre le retrait d'ETH est un élément essentiel de la mise à niveau de la preuve d'enjeu. En plus d'être un élément essentiel d'un protocole de preuve d'enjeu pleinement fonctionnel, l'autorisation des retraits est également bénéfique pour la sécurité d'Ethereum, car elle permet aux stakers d'utiliser leurs récompenses ETH à d'autres fins que l'enjeu. Cela signifie que les utilisateurs qui veulent de la liquidité n'ont pas besoin de s'appuyer sur les « liquid staking derivatives » (LSD) qui peuvent être une force centralisatrice sur Ethereum. Cette mise à niveau est prévue pour être achevée le 12 avril 2023. + +À propos des retraits + +## Se défendre contre les attaques {#defending-against-attacks} + +Même après l'activation des retraits, des améliorations peuvent être apportées au protocole de [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos/) d'Ethereum. L'une est connue sous le nom de [agrégation de points de vue](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739) - un algorithme de choix de bifurcation plus sécurisé qui rend certains types d'attaques sophistiquées plus difficiles. + +Réduire le temps que prend Ethereum pour finaliser les blocs offrirait une meilleure expérience utilisateur et empêcherait les attaques sophistiquées de « reorg » où les attaquants essaient de réorganiser les blocs très récents pour en tirer profit ou censurer certaines transactions. [**Finalité à créneau unique - Single slot finality (SSF)**](/roadmap/single-slot-finality/) est un moyen de minimiser le délai de finalisation. Actuellement, il y a l'équivalent de 15 minutes de blocs qu'un attaquant pourrait théoriquement convaincre d'autres validateurs de reconfigurer. Avec SSF, il y en aurait 0. Les utilisateurs, des individus aux applications jusqu'aux échanges, bénéficient d'une assurance rapide que leurs transactions ne seront pas annulées, et le réseau bénéficie lui de l'élimination d'une catégorie entière d'attaques. + +En apprendre plus à propos de la finalité à créneau unique + +## Se défendre contre la censure {#defending-against-censorship} + +La décentralisation empêche les individus ou les petits groupes de validateurs de devenir trop influents. Les nouvelles technologies de mise en jeu peuvent aider à garantir que les validateurs d'Ethereum restent aussi décentralisés que possible tout en les protégeant contre les pannes matérielles, logicielles et de réseau. Cela inclut un logiciel qui partage les responsabilités du validateur sur plusieurs nœuds. C'est ce qu'on appelle la **technologie de validation distribuée (DVT)**. Les pools de mise en jeu sont incités à utiliser le DVT car il permet à plusieurs ordinateurs de participer collectivement à la validation, ajoutant ainsi une redondance et une tolérance aux pannes. Cela divise également les clés du validateur entre plusieurs systèmes, plutôt que d'avoir des opérateurs individuels exécutant plusieurs validateurs. Cela rend plus difficile pour les opérateurs malhonnêtes de coordonner des attaques sur Ethereum. Globalement, l'idée est de gagner en matière de sécurité en faisant fonctionner les validateurs en tant que _communautés_ plutôt qu'en tant qu'individus. + +En apprendre plus à propos de la technologie de validation distribuée + +La mise en œuvre de la **séparation proposeur-constructeur (PBS)** améliorera considérablement les défenses intégrées d'Ethereum contre la censure. PBS permet à un validateur de créer un bloc et à un autre de le diffuser à travers le réseau Ethereum. Cela garantit que les gains provenant des algorithmes de construction de blocs axés sur la maximisation des profits sont partagés plus équitablement à travers le réseau, **empêchant la concentration ** chez les stakers institutionnels les plus performants au fil du temps. Le proposeur de bloc a la possibilité de sélectionner le bloc le plus rentable qui lui est proposé par un marché de constructeurs de blocs. Pour censurer, un proposeur de bloc devrait souvent choisir un bloc moins rentable, ce qui serait **économiquement irrationnel et également évident pour le reste des validateurs** sur le réseau. + +Il existe des ajouts potentiels à PBS, tels que les transactions chiffrées et les listes d'inclusion, qui pourraient améliorer davantage la résistance à la censure d'Ethereum. Ces éléments rendent le constructeur de blocs et le proposeur ignorants des transactions réelles incluses dans leurs blocs. + +En apprendre plus à propos de la séparation entre le constructeur et le proposeur + +## Protéger les validateurs {#protecting-validators} + +Il est possible qu'un attaquant sophistiqué puisse identifier les validateurs imminents et les spammer pour les empêcher de proposer des blocs ; cela s'appelle une **attaque par déni de service (DoS)**. Implémenter [**l'élection secrète du leader (SLE)**](/roadmap/secret-leader-election) protégera contre ce type d'attaque en empêchant les proposants de bloc d'être connus à l'avance. Cela fonctionne en mélangeant continuellement un ensemble d'engagements cryptographiques représentant les candidats proposeurs de blocs et en utilisant leur ordre pour déterminer quel validateur est sélectionné de telle manière que seuls les validateurs eux-mêmes connaissent leur ordre à l'avance. + +En apprendre plus à propos de l'élection d'un leader secret + +## Progrès actuels {#current-progress} + +Les mises à jour de sécurité figurant sur la feuille de route sont à des stades de recherche avancés, mais leur mise en œuvre n'est pas prévue avant un certain temps. Les prochaines étapes pour view-merge, PBS, SSF et SLE consistent à finaliser une spécification et à commencer à construire des prototypes. diff --git a/public/content/translations/fr/roadmap/single-slot-finality/index.md b/public/content/translations/fr/roadmap/single-slot-finality/index.md new file mode 100644 index 00000000000..c4ee30c87fd --- /dev/null +++ b/public/content/translations/fr/roadmap/single-slot-finality/index.md @@ -0,0 +1,66 @@ +--- +title: Finalité à créneau unique +description: Tout savoir sur le protocole de Finalité à créneau unique +lang: fr +--- + +# Finalité à créneau unique {#single-slot-finality} + +Cela demande à peu près 15 minutes pour qu’un bloc Ethereum soit finalisé. Cependant, nous pouvons faire en sorte que le mécanisme de consensus d'Ethereum valide les blocs plus efficacement et réduise considérablement le délai de finalisation. Plutôt que d'attendre quinze minutes, les blocs pourraient être proposés et finalisés dans le même créneau. Ce concept est connu** sous l'appellation de Single Slot Finality (SSF) ou Finalité à créneau unique.** + +## Qu’est-ce que la finalité ? {#what-is-finality} + +Dans le mécanisme de consensus basé sur la preuve d'enjeu d'Ethereum, la finalité fait référence à la garantie qu'un bloc ne peut pas être modifié ou supprimé de la blockchain sans que cela n'entraîne de l'action brûler (destruction) au moins 33 % de l'ETH total mis en jeu. Il s'agit d'une sécurité « crypto-économique » car la confiance provient du coût extrêmement élevé, associé à la modification de l'ordre ou du contenu de la chaîne, ce qui empêcherait tout acteur économique rationnel de tenter d'effectuer ce genre d'action. + +## Pourquoi viser une finalité plus rapide ? {#why-aim-for-quicker-finality} + +La durée actuelle de la finalité s'est avéré être trop longue. La plupart des utilisateurs ne désirent pas attendre 15 minutes pour le processus de finalité. C'est plutôt gênant pour les applications et autres plateformes d'échange qui ont plutôt besoin d'un débit de transaction élevé, mais doivent patienter tout ce temps afin d'être assurés que leurs transactions soient permanentes. Le délai entre la proposition d'un bloc et sa finalisation crée également une opportunité de courtes réorganisations qu'un attaquant pourrait utiliser pour censurer certains blocs ou extraire la Valeur maximale extractible (MEV). Le mécanisme qui gère la mise à niveau des blocs par étapes est également assez complexe et a été corrigé à plusieurs reprises pour corriger les vulnérabilités de sécurité, ce qui en fait l'une des parties de la base de code Ethereum où des bogues subtils sont les plus susceptibles de survenir. Ces dilemmes pourraient tous être éradiqués en réduisant le temps de finalité à un seul créneau. + +## Le compromis décentralisation/temps/frais généraux {#the-decentralization-time-overhead-tradeoff} + +La garantie de finalité n'est pas une propriété immédiate d'un nouveau bloc ; il faut du temps pour qu'un nouveau bloc se finalise. La raison en est que les validateurs représentant au moins 2/3 du total des ETH mis en jeu sur le réseau doivent voter pour le bloc (« attester ») afin qu'il soit considéré comme finalisé. Chaque nœud de validation du réseau doit traiter les attestations d'autres nœuds, dans le but de savoir si un bloc a ou n'a pas atteint ce fameux seuil des 2/3. + +Plus le temps imparti pour atteindre la finalisation est court, plus la puissance de calcul est importante sur chaque nœud car le traitement de l'attestation doit être effectué plus rapidement. De plus, plus il y a de nœuds de validation sur le réseau, plus d'attestations doivent être traitées pour chaque bloc, ce qui augmente également la puissance de traitement requise. Plus la puissance de traitement requise est élevée, moins le nombre de personnes pouvant participer est élevé, car un matériel plus coûteux est nécessaire pour exécuter chaque nœud de validation. L'augmentation du temps entre les blocs réduit la puissance de calcul requise sur chaque nœud, mais allonge également le délai de finalisation, car les attestations sont traitées plus lentement. + +Ainsi, il existe un compromis entre la surcharge (puissance de calcul), la décentralisation (nombre de nœuds pouvant participer à la validation de la chaîne) et le délai conduisant à la finalité. Ainsi, le système idéal équilibre la puissance de calcul minimale, la décentralisation maximale et le temps minimum menant à la finalité. + +L'actuel mécanisme de consensus d'Ethereum a équilibré ces trois paramètres en : + +- **Fixant la participation minimale à 32 ETH**. Cela fixe une limite supérieure au nombre d'attestations de validateurs qui doivent être traitées par des nœuds individuels, et donc une limite supérieure aux exigences de calcul pour chaque nœud. +- **Fixant le délai à la finalité à 15 minutes environ**. Cela donne suffisamment de temps aux validateurs exécutés sur des ordinateurs personnels normaux pour traiter en toute sécurité les attestations pour chaque bloc. + +Avec l'actuelle conception du mécanisme, et dans l'espoir de réduire le délai à la finalité, il est donc impératif de réduire le nombre de validateurs sur le réseau, ou bien d'augmenter les exigences matérielles (hardware) pour chaque nœud. Cependant, des améliorations peuvent être apportées à la manière dont les attestations sont traitées, ce qui pourrait permettre de compter davantage d'attestations sans ajouter de surcharge à chaque nœud. C'est pourquoi le traitement le plus efficace permettra de déterminer la finalité à l'intérieur d'un seul créneau, plutôt qu'à travers deux périodes distinctes. + +## Routes vers la finalité à créneau unique ou Single Slot Finality (SSF) {#routes-to-ssf} + + + +Le mécanisme de consensus actuel combine les attestations de plusieurs validateurs, aussi appelés comités, et ce, pour réduire le nombre de messages que chaque validateur doit traiter pour valider un bloc. Chaque validateur a la possibilité d'attester à chaque période (32 créneaux), cependant, dans chaque créneau, seul un sous-ensemble de validateurs, appelé « comité », a le pouvoir d'attester. Ils agissent ainsi en se divisant en sous-réseaux parmi lesquels quelques validateurs sont sélectionnés pour devenir « agrégateurs ». Ces agrégateurs combinent chacun toutes les signatures qu'ils voient provenant d'autres validateurs de leur sous-réseau en une seule signature globale. L'agrégateur qui comprend le plus grand nombre de contributions individuelles transmet sa signature globale à l'auteur du bloc (proposant), et ce dernier l'inclut dans le bloc avec la signature agrégée des autres comités. + +Ce processus procure une capacité suffisante pour que chaque validateur puisse voter à chaque période car : « 32 créneaux * 64 commités * 256 validateurs par comité = 524 288 validateurs par période ». Au moment de la rédaction du présent document (février 2023), il y a environ 513 000 validateurs actifs. + +Concernant ce schéma, chaque validateur n'a la possibilité de voter sur un bloc, qu'en répartissant ses attestations sur l'ensemble de la période. Toutefois, il est possible d'améliorer le mécanisme de manière à ce que _chaque validateur, ait la possibilité d'attester dans chaque créneau_. + + +Depuis la conception du mécanisme de consensus Ethereum, le système d'agrégation des signatures (BLS) s'est révélé beaucoup plus évolutif qu'on n'eût pu l'imaginer au départ, tandis que la capacité des clients à traiter et vérifier les signatures s'est également améliorée. Il s'avère que le traitement des attestations d'un grand nombre de validateurs est en fait rendu possible à l'intérieur d'un seul et même créneau. Exemple : avec un million de validateurs votant chacun deux fois dans chaque créneau, et des créneaux horaires calibrés à 16 secondes, les nœuds seraient poussés à vérifier les signatures lors d'un rythme minimum de 125 000 agrégations par seconde, afin de traiter l'ensemble du million d'attestations à l'intérieur dudit créneau. En réalité, il faut environ 500 nanosecondes à un ordinateur normal pour vérifier une signature, entendant le fait que 125 000 signatures peuvent être vérifiées en environ 62,5 ms, soit bien en deçà du seuil d'une seconde. + +Des gains d'efficacité supplémentaires pourraient être accomplis en créant des super-comités composés, par exemple, de 125 000 validateurs par créneau sélectionnés de manière aléatoire. Seuls ces validateurs pourraient voter sur un bloc et, par conséquent, uniquement ce sous-ensemble de validateurs déciderait, ou non, de la finalisation d'un bloc. Que ce soit une bonne idée ou non dépend du coût que la communauté préférerait pour une attaque réussie contre Ethereum. En effet, au lieu d'exiger 2/3 du total de l'ether mis en jeu, un attaquant pourrait finaliser un bloc illégitime avec 2/3 des Ethers (ETH) mis en jeu _parmi ce super-comité_. À l'heure actuelle, il s'agit encore d'un domaine de recherche actif, mais il semble plausible au premier abord, que pour un ensemble de validateurs suffisamment important pour nécessiter des super-comités, le coût de l'attaque d'un de ces sous-comités soit extrêmement élevé (p. ex. le coût de l'attaque exprimée en ETH serait de `2/3 * 125 000 * 32 = 2,6 millions d'ETH`). Le coût de l'attaque peut être ajusté en augmentant la taille de l'ensemble des validateurs (par exemple, ajuster la taille du validateur pour que le coût de l'attaque soit égal à 1 million d'éther, 4 millions d'éther, 10 millions d'éther, etc.). [Les sondages préliminaires](https://youtu.be/ojBgyFl6-v4?t=755) de la communauté semblent indiquer qu'un coût d'attaque de 1 à 2 millions d'éthers s'avère acceptable, ce qui implique entre 65 536 et 97 152 validateurs par super-comité. + +Toutefois, la vérification n'est pas le véritable point d'engorgement - c'est bien l'agrégation des signatures qui constitue un véritable défi pour les nœuds de validation. Pour faire évoluer l'agrégation des signatures, il faudra probablement augmenter le nombre de validateurs à l'intérieur de chaque sous-réseau, accroître le nombre de sous-réseaux ou encore ajouter des couches supplémentaires d'agrégation (c'est-à-dire mettre en place des comités de comités). Une partie de la solution consisterait à autoriser des agrégateurs experts - similaire à la manière dont la construction de blocs et la génération d'engagements pour les données rollup seront sous-traitées à des constructeurs de blocs spécialisés dans le cadre de la séparation entre le proposant et le constructeur de bloc (PBS), ainsi que de la méthode Danksharding (technique qui permet de partitioner un ensemble de données venant d'une même base de données). + +## Quel est le rôle de la règle de choix de fourche dans le cadre SSF (Finalité à créneau unique) ? {#role-of-the-fork-choice-rule} + +Le mécanisme de consensus actuel repose sur un couplage étroit entre le dispositif de finalité (l'algorithme qui détermine si 2/3 des validateurs ont attesté d'une certaine chaîne) et la règle du choix de fourche (l'algorithme qui décide quelle chaîne est la plus appropriée lorsque plusieurs options sont possibles). L'algorithme de choix de fourche ne prend en compte que les blocs _depuis_ le dernier bloc finalisé. À l'intérieur du cadre de la Finalité à créneau unique (SSF), il n'y aurait aucun bloc à prendre en compte pour la règle de choix de fourche, car la finalité se produit dans le même créneau que celui où le bloc est proposé. Cela signifie qu'en vertu de la SSF, _soit_ l'algorithme de choix de fourche _soit_ le dispositif de finalité serait opérationnel à tout moment. Le dispositif de finalité finaliserait les blocs pour lesquels les deux tiers des validateurs étaient en ligne et attestaient honnêtement. Si un bloc n'est pas en mesure de surpasser le seuil des deux tiers, la règle du choix de fourche intervient pour déterminer la chaîne à suivre. Cela crée également une opportunité de maintenir le mécanisme de brèche d'inactivité qui rétablit une chaîne où >1/3 des validateurs sont hors-ligne, nonobstant quelques nuances supplémentaires. + +## Questions non résolues {#outstanding-issues} + +Le problème avec l'évolutivité de l'agrégation en augmentant le nombre de validateurs par sous-réseau, c'est que cette dernière induit une charge beaucoup plus conséquente sur le réseau peer-to-peer. Le problème avec l'ajout de couches d'agrégations est qu'il est assez complexe à concevoir et ajoute de la latence (c'est-à-dire que cela pourrait prendre plus de temps avant que le proposant de bloc ne reçoive les informations de tous les agrégateurs de sous-réseaux). Aussi, la façon d'aborder le cas n'est pas encore très claire lorsqu'il y a bien plus de validateurs actifs sur le réseau, qu'il n'est possible d'en traiter dans chaque créneau, et ce, même avec l'agrégation des signatures BLS. Une solution envisageable : étant donné que tous les validateurs attestent dans chaque créneau et qu'il n'y a pas de comités sous le régime de Finalité à créneau unique (SSF), le plafond de 32 ETH du solde effectif pourrait être entièrement supprimé, signifiant ainsi que les opérateurs gérant de nombreux validateurs, pourraient consolider leurs enjeux et en exploiter une quantité moindre, réduisant de facto le volume de messages que les nœuds de validation doivent traiter pour tenir compte de l'ensemble des validateurs. Cela repose sur l’acceptation par les grands stakers de consolider leurs validateurs. Il est également possible d'imposer à tout moment un seuil fixe au nombre de validateurs ou au montant d'ETH mis en jeu. Cependant, cela requiert un certain mécanisme pour décider quels validateurs sont autorisés à participer et ceux déboutés de cette possibilité, ce qui est susceptible d'engendrer des effets secondaires indésirables. + +## Progrès actuels {#current-progress} + +La Finalité à créneau unique (SSF) est en phase d'études. Celle-ci ne devrait pas être opérationnelle avant plusieurs années, probablement après que d'autres avancées substantielles aient été réalisées, telles que [l'Arbre de Verkle](/roadmap/verkle-trees/) et la [solution Danksharding](/roadmap/danksharding]). + +## Complément d'information {#further-reading} + +- [Vitalik sur la Finalité à créneau unique (SSF) au EDCON 2022](https://www.youtube.com/watch?v=nPgUKNPWXNI) +- [Notes de Vitalik : Chemins menant à la Finalité à créneau unique (SSF)](https://notes.ethereum.org/@vbuterin/single_slot_finality) diff --git a/public/content/translations/fr/roadmap/statelessness/index.md b/public/content/translations/fr/roadmap/statelessness/index.md new file mode 100644 index 00000000000..83cc5e385e0 --- /dev/null +++ b/public/content/translations/fr/roadmap/statelessness/index.md @@ -0,0 +1,103 @@ +--- +title: Absence d'état, expiration d'état et expiration de l'historique +description: Explication de l'expiration d'historique et d'Ethereum sans état +lang: fr +--- + +# Absence d'état, expiration d'état et expiration de l'historique {#statelessness} + +La possibilité d'exécuter des nœuds Ethereum sur du matériel modeste est critique pour une véritable décentralisation. En effet, l'exécution d'un nœud donne aux utilisateurs la possibilité de vérifier les informations en effectuant des vérifications cryptographiques de manière indépendante plutôt que de faire confiance à un tiers pour leur fournir les données. Le fait d'exécuter un nœud permet aux utilisateurs de soumettre des transactions directement au réseau pair-à-pair Ethereum plutôt que de devoir faire confiance à un intermédiaire. La décentralisation n'est pas possible si ces avantages ne sont disponibles qu'aux utilisateurs possesseurs de matériel coûteux. Au contraire, les nœuds devraient pouvoir s'exécuter avec des exigences de calcul et de mémoire très modestes, afin qu'ils puissent fonctionner sur des téléphones portables, de petits ordinateurs, ou sans effet notable sur un ordinateur personnel. + +Aujourd'hui, la grande demande d'espace disque est la principale barrière à l'accès universel aux noeuds. Celle-ci est principalement causée par le besoin de stocker de larges morceaux des données d'état d'Ethereum. Ces données d'état contiennent des informations critiques requises pour traiter correctement les nouveaux blocs et les nouvelles transactions. Au moment de la rédaction, un SSD rapide de 2 To est recommandé pour exécuter un nœud Ethereum complet. Pour un nœud qui n'élague aucune donnée plus ancienne, les besoins en stockage augmentent d'environ 14 Go/semaine, et les nœuds d'archivage qui stockent toutes les données depuis la genèse approchent les 12 To (au moment de la rédaction, en février 2023). + +Des disques durs moins coûteux peuvent être utilisés pour stocker les données plus anciennes, mais ils sont trop lents pour suivre le rythme des nouveaux blocs qui arrivent. Conserver les modèles de stockage actuels pour les clients tout en rendant les données moins chères et plus faciles à stocker n'est qu'une solution temporaire et partielle au problème car la croissance de l'état d'Ethereum est 'sans bornes', ce qui signifie que les besoins de stockage ne peuvent qu'augmenter, et les améliorations technologiques devront toujours suivre le rythme de la croissance continue de l'état. Les clients doivent plutôt trouver de nouveaux moyens de vérifier les blocks et les transactions qui ne reposent pas sur la recherche des données dans des bases de données locales. + +## Réduction du stockage pour les nœuds {#reducing-storage-for-nodes} + +Il y a plusieurs façons de réduire la quantité de données que chaque nœud doit stocker, chacune nécessitant que le protocole au cœur d'Ethereum soit mis à jour à des degrés différents : + +- **Expiration de l'historique** : permet aux noeuds de se débarrasser des données d'état plus anciennes que X blocs, mais ne change pas la manière dont les clients Ethereum gèrent les données d'état +- **Expiration d'état** : permet aux données d'état qui ne sont pas utilisées fréquemment de devenir inactives. Les données inactives peuvent être ignorées par les clients jusqu'à ce qu'elles soient ressuscitées. +- **Absence d'état faible** : seuls les producteurs de blocs ont besoin d'accéder aux données d'état complètes, les autres noeuds peuvent vérifier les blocs sans base de données locale. +- **Absence d'état forte** : aucun noeud n'a besoin d'accéder aux données d'état complètes. + +## Expiration des données {#data-expiry} + +### Expiration de l'historique {#history-expiry} + +L'expiration de l'historique fait référence aux clients qui élaguent les données plus anciennes dont ils n'auront probablement pas besoin, de sorte qu'ils ne stockent qu'une petite quantité de données historiques, laissant tomber les données plus anciennes lorsque de nouvelles données arrivent. Il y a deux raisons pour lesquelles les clients ont besoin des données historiques : la synchronisation et la réponse aux requêtes de données. Autrefois, les clients devaient synchroniser depuis le bloc d'origine, en vérifiant que chaque bloc successif est correct tout du long jusqu'à la tête de la chaine. Aujourd'hui, les clients utilisent des « points de contrôle de la faible subjectivité » pour amorcer leur parcours vers la tête de la chaîne. Ces points de contrôle sont des points de départ approuvés, comme un bloc d'origine proche du présent plutôt qu'au tout début d'Ethereum. Cela veut dire que les clients peuvent écarter toutes les informations antérieures au point de contrôle le plus récent de la faible subjectivité sans perdre la possibilité de se synchroniser avec la tête de la chaîne. Les clients traitent actuellement les demandes (arrivant via JSON-RPC) pour les données historiques en les récupérant depuis leurs bases de données locales. Cependant, avec l'expiration de l'historique, cela ne sera plus possible si les données requises ont été écartées. Des solutions innovantes sont nécessaires pour traiter ces données historiques. + +Une possibilité est que les clients demandent les données historiques à des pairs en utilisant une solution comme le Réseau du Portail. Le Portail du Réseau est un réseau pair-à-pair en développement pour fournir des données historiques où chaque noeud stocke une petite partie de l'historique d'Ethereum de telle façon que l'historique complet existe de manière distribuée sur le réseau. Les requêtes sont servies en recherchant des pairs stockant les données pertinentes et en les leur demandant. Alternativement, comme ce sont généralement les applications qui nécessitent l'accès aux données historiques, cela peut devenir leur responsabilité de les stocker. Il pourrait également y avoir suffisamment d'acteurs altruistes dans l'espace Ethereum qui seraient disposés à conserver des archives historiques. Il pourrait s'agir d'un DAO qui se constitue pour gérer le stockage des données historiques, ou idéalement, ce sera une combinaison de toutes ces options. Ces fournisseurs pourraient fournir les données de nombreuses manières, comme avec un torrent, FTP, Filecoin ou IPFS. + +L'expiration de l'historique est dans une certaine mesure controversée parce que, pour l'instant, Ethereum a toujours implicitement garanti la disponibilité de toutes les données historiques. Une synchronisation complète depuis l'origine a toujours été possible en tant que standard, même si elle repose sur la reconstruction de certaines données plus anciennes à partir d'instantanés. L'expiration de l'historique déplace la responsabilité de fournir cette garantie en dehors du cœur du protocole Ethereum. Cela pourrait introduire de nouveaux risques de censure si ce sont des organisations centralisées qui finissent par assumer le rôle de fournisseur des données historiques. + +EIP-4444 n'est pas encore prêt à être lancé, mais fait l'objet de discussions actives. De façon intéressante, les défis d'EIP-4444 ne sont pas tant techniques que de l'ordre de la gestion communautaire. Pour que cette proposition soit lancée, il doit y avoir une adhésion de la communauté qui comprend non seulement un accord, mais également des engagements à stocker et à fournir les données historiques de la part d'entités dignes de confiance. + +Cette mise à niveau ne modifie pas fondamentalement comment les noeuds Ethereum traitent les données d'état, elle change juste la façon dont les données historiques sont disponibles. + +### Expiration de l'état {#state-expiry} + +L'expiration de l'état fait référence à la suppression de l'état sur les nœuds individuels si cet état n'a pas été accédé récemment. Ceci pourrait être implémenté de plusieurs manières, notamment : + +- **Expiration par le loyer** : faire payer un « loyer » aux comptes et les laisser expirer quand leur loyer atteint zéro +- **Expiration par le temps** : rendre les comptes inactifs s'il n'y a pas de lecture/écriture sur ce compte pendant un certain temps + +L'expiration par le loyer pourrait être un loyer direct facturé aux comptes pour les garder dans la base de données des états actifs. L'expiration par le temps pourrait être un compte à rebours depuis la dernière interaction sur le compte, ou elle pourrait être une expiration périodique de tous les comptes. Il pourrait également y avoir des mécanismes qui combinent des éléments des deux modèles basés sur le temps et sur le loyer, par exemple que les comptes individuels persistent dans l'état actif s'ils paient des frais minimes avant l'expiration basée sur le temps. Avec l'expiration d'état, il est important de noter que les états inactifs ne sont **pas effacés**, ils sont simplement stockés séparément des états actifs. Les états inactifs peuvent être ressuscités vers les états actifs. + +La façon dont cela fonctionnerait serait probablement d'avoir un arbre d'état pour des périodes de temps spécifiques (peut-être ~1 an). À chaque fois qu'une nouvelle période commence, un arbre d'état entièrement neuf voit le jour. Seul l'arbre d'état actuel peut être modifié, tous les autres sont immuables. Les nœuds Ethereum ne seraient obligés de contenir que l'arbre d'état actuel et le suivant le plus récent. Cela nécessiterait un moyen d'associer une adresse avec la période de temps dans laquelle elle existe. Il y a [plusieurs façons possibles](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607) de le faire, mais la favorite nécessite que [les adresses soient allongées](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485) pour accommoder les informations supplémentaires, avec l'avantage additionnel que les adresses plus longues sont plus sûres. La feuille de route qui fait cela est appelée [extension de l'espace d'adressage](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485). + +De même que pour l'expiration de l'historique, sous l'expiration de l'état, la responsabilité du stockage des anciennes données d'état est retirée des utilisateurs individuels et transférée à d'autres entités telles que des fournisseurs centralisés, des membres altruistes de la communauté ou des solutions décentralisées plus futuristes telles que le Réseau du Portail. + +L'expiration de l'état est encore en phase de recherche et n'est pas encore prête à être expédiée. L'expiration de l'état pourrait bien se produire après les clients sans état et l'expiration de l'historique, car ces mises à niveau rendent les grandes tailles d'état facilement gérables pour la majorité des validateurs. + +## Le principe de non-vérification de l'état de la blockchain {#statelessness} + +L'absence d'état est un peu un abus de langage car cela ne signifie pas que le concept d'« état » est éliminé, mais cela implique des changements dans la façon dont les nœuds Ethereum traitent les données d'état. L'absence d'état elle-même se présente sous deux formes : l'absence d'état faible et l'absence d'état forte. L'absence d'état faible permet à la plupart des nœuds de devenir sans état en plaçant la responsabilité du stockage de l'état sur quelques-uns. L'absence d'état forte retire entièrement le besoin pour tous les nœuds de stocker les données d'état complètes. Les absences d'état faibles et fortes offrent toutes les deux les avantages suivants aux validateurs normaux : + +- synchronisation presque instantanée +- possibilité de valider les blocs dans le désordre +- les nœuds sont capables de s'exécuter avec des exigences sur le matériel très faibles (par exemple sur des téléphones portables) +- les nœuds peuvent s'exécuter sur des disques durs bon marché parce qu'aucune lecture/écriture sur le disque n'est nécessaire +- compatibles avec les mises à niveau futures de la cryptographie d'Ethereum + +### Absence d'état faible {#weak-statelessness} + +L'absence d'était faible implique des changements dans la façon dont les nœuds Ethereum vérifient les changements d'état, mais elle n'élimine pas complètement le besoin de stockage d'état dans tous les nœuds du réseau. Au lieu de cela, l'absence d'était faible met la responsabilité du stockage de l'état sur les proposants de blocs, alors que tous les autres nœuds du réseau vérifient les blocs sans stocker les données d'état complètes. + +**Avec l'absence d'état faible, proposer des blocs requiert l'accès à l'intégralité des données d'état, mais vérifier les blocs ne requiert aucune donnée d'état** + +Pour que cela soit possible, les [arbres de Verkle](/roadmap/verkle-trees/) doivent déjà avoir été implémentés dans les clients Ethereum. Les arbres de Verkle sont une structure de données de remplacement pour stocker les données d'état d'Ethereum qui permettent à de petits « témoins des données » de taille fixe d'être transmis entre pairs et d'être utilisés pour vérifier les blocs au lieu de vérifier les blocs par rapport aux bases de données locales. La [séparation proposant-constructeur](/roadmap/pbs/) est également requise car elle permet aux constructeurs de blocs d'être des nœuds spécialisés avec un matériel plus puissant, et ce sont eux qui ont besoin d'un accès aux données d'état complètes. + + + +L'absence d'état requiert que les constructeurs de blocs conservent une copie des données d'état complètes afin qu'ils puissent générer des témoins pouvant être utilisés pour vérifier le bloc. Les autres nœuds n'ont pas besoin d'accéder aux données d'état, toute l'information requise pour vérifier le bloc est disponible dans le témoin. Cela crée une situation où proposer un bloc est coûteux, mais vérifier le bloc est bon marché, ce qui implique que moins d'opérateurs vont faire fonctionner un bloc proposant des noeuds. Cependant, la décentralisation des proposants de blocs n'est pas critique tant qu'autant de participants que possible peuvent vérifier que les blocs qu'ils proposent sont valides. + +En lire plus dans les notes de Dankrad + + +Les proposants de bloc utilisent les données d'état pour créer des « témoins » - l'ensemble minimal de données qui prouvent les valeurs de l'état qui sont modifiées par les transactions dans un bloc. Les autres validateurs ne détiennent pas l'état, ils ne stockent que la racine de l'état (une empreinte numérique de l'état complet). Ils reçoivent un bloc et un témoin et les utilisent pour mettre à jour leur racine de l'état. Cela rend un nœud validant extrêmement léger. + +L'absence d'état faible est à un stade de recherche avancé, mais elle repose sur l'implémentation de la séparation proposant-constructeur et les Arbres de Verkle, afin que de petits témoins puissent être transférés entre les pairs. Cela veut dire que l'absence d'était faible prendra probablement quelques années avant d'être introduite dans le réseau principal d'Ethereum. + +### Absence d'état forte {#strong-statelessness} + +L'absence d'état forte élimine le besoin pour tout bloc de stocker des données d'état. Au lieu de cela, les transactions sont envoyées avec des témoins qui peuvent être agrégés par les producteurs de blocs. Les producteurs de blocs sont alors chargés de stocker uniquement l'état nécessaire à la génération de témoins pour les comptes concernés. La responsabilité de l'état est presque entièrement transférée aux utilisateurs, car ils envoient des témoins et des « listes d'accès » pour déclarer avec quels comptes et clés de stockage ils interagissent. Cela permettrait de disposer de nœuds extrêmement légers, mais il y a des compromis, notamment la difficulté accrue de réaliser des transactions avec des contrats intelligents. + +L'absence d'état forte a été étudiée par les chercheurs mais on ne s'attend actuellement pas à ce qu'elle fasse partie de la feuille de route d'Ethereum - il est plus probable que l'absence d'état faible soit suffisante pour les besoins de mise à l'échelle d'Ethereum. + +## Progrès actuels {#current-progress} + +Absence d'état faible, l'expiration de l'historique et l'expiration de l'état sont tous en phase de recherche et devraient être prêts dans plusieurs années. Il n'y a aucune garantie que toutes ces propositions seront mises en œuvre, par exemple, si l'expiration de l'état est mise en œuvre en premier, il se peut qu'il ne soit pas nécessaire de mettre en œuvre également l'expiration de l'historique. Il existe également d'autres éléments de la feuille de route, tels que les [Arbres de Verkle](/roadmap/verkle-trees) et la [Séparation proposeur-constructeur](/roadmap/pbs) qui doivent être achevés en premier. + +## Complément d'information {#further-reading} + +- [AMA de Vitalik sur l'absence d'état](https://www.reddit.com/r/ethereum/comments/o9s15i/impromptu_technical_ama_on_statelessness_and/) +- [Une théorie de la gestion de la taille de l'état](https://hackmd.io/@vbuterin/state_size_management) +- [Limiter la taille de l'état en minimisant les conflits de résurrection](https://ethresear.ch/t/resurrection-conflict-minimized-state-bounding-take-2/8739) +- [Vers l'absence d'état et l'expiration de l'état](https://hackmd.io/@vbuterin/state_expiry_paths) +- [Spécification de l'EIP-4444](https://eips.ethereum.org/EIPS/eip-4444) +- [Alex Stokes à propos de l'EIP-4444](https://youtu.be/SfDC_qUZaos) +- [Pourquoi il est si important de devenir sans état](https://dankradfeist.de/ethereum/2021/02/14/why-stateless.html) +- [Les notes conceptuelles originales du client sans état](https://ethresear.ch/t/the-stateless-client-concept/172) +- [Plus d'informations sur l'expiration de l'état](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) +- [Encore plus sur l'expiration de l'état](https://hackmd.io/@vbuterin/state_expiry_paths#Option-2-per-epoch-state-expiry) diff --git a/public/content/translations/fr/roadmap/user-experience/index.md b/public/content/translations/fr/roadmap/user-experience/index.md new file mode 100644 index 00000000000..11be67f9034 --- /dev/null +++ b/public/content/translations/fr/roadmap/user-experience/index.md @@ -0,0 +1,36 @@ +--- +title: Amélioration de l'expérience utilisateur +description: Utiliser Ethereum reste encore trop compliqué pour la plupart des gens. Pour encourager l'adoption massive, Ethereum doit réduire considérablement les obstacles initiaux - les utilisateurs doivent bénéficier d'un accès décentralisé, sans autorisation et résistant à la censure à Ethereum, mais cela doit rester aussi fluide que l'utilisation d'une application Web2 traditionnelle. +lang: fr +image: /roadmap/roadmap-ux.png +alt: "Feuille de route d'Ethereum" +template: roadmap +--- + +L'utilisation d'Ethereum doit être simplifiée, de la gestion des clés et des portefeuilles à la réalisation des transactions. Pour faciliter l'adoption de masse, Ethereum doit considérablement augmenter la facilité d'utilisation, permettant aux utilisateurs de profiter d'un accès sans autorisation et résistant à la censure à Ethereum avec l'expérience sans friction de l'utilisation des applications Web2. + +## En finir avec les phrases de récupération {#no-more-seed-phrases} + +Les comptes sur Ethereum sont protégés par une paire de clés utilisées pour identifier ces comptes (clé publique) et signer les messages (clé privée). Une clé privée est comme un mot de passe principal ; elle permet un accès total à un compte Ethereum. Il s'agit d'une manière différente de fonctionner pour les personnes plus familières avec les banques et les applications Web2 qui gèrent les comptes au nom de l'utilisateur. Pour qu'Ethereum atteigne une l'adoption de masse sans dépendre de tiers centralisés, il doit exister un moyen simple et sans complication pour qu'un utilisateur prenne en charge ses actifs et garde le contrôle de ses données sans avoir à comprendre la cryptographie à clé publique/privée et la gestion de ces clés. + +La solution à cela consiste à utiliser des portefeuilles intelligents pour interagir avec Ethereum. Les portefeuilles de contrats intelligents permettent de protéger les comptes si les clés sont perdues ou volées, offrent une meilleure détection et défense contre les fraudes, et permettent aux portefeuilles de fournir de nouvelles fonctionnalités. Bien que les portefeuilles de contrats intelligents existent déjà aujourd'hui, ils sont difficiles à implémenter car le protocole Ethereum doit mieux les prendre en charge. Ce support supplémentaire est ce que l'on appelle l'abstraction de compte. + +En savoir plus sur l'abstraction de compte + +## Des nœuds pour tous + +Les utilisateurs qui possèdent des nœuds n'ont pas besoin de faire confiance à des tiers pour leur fournir des informations, et ils peuvent interagir rapidement, en toute confidentialité et sans autorisation avec la blockchain Ethereum. Cependant, exécuter un nœud nécessite actuellement des connaissances techniques et un espace disque important, ce qui signifie que de nombreuses personnes doivent faire confiance à des intermédiaires. + +Plusieurs mises à jour faciliteront l'exécution des nœuds et réduiront considérablement les ressources nécessaires. La manière dont les données sont stockées sera modifiée pour utiliser une structure plus efficace en termes d'espace, appelée **arbre Verkle**. De plus, grâce au [principe de non-vérification de l'état](/roadmap/statelessness) ou à [l'expiration des données](/roadmap/statelessness/#data-expiry), les nœuds Ethereum n'auront pas besoin de stocker une copie de l'intégralité des données d'état de la blockchain, ce qui réduira considérablement les besoin d'espace sur le disque dur. [Les nœuds légers](/developers/docs/nodes-and-clients/light-clients/) offriront de nombreux avantages de l'exécution d'un nœud complet, mais pourront fonctionner facilement sur les téléphones mobiles ou à l'intérieur de simples applications de navigateur. + +En savoir plus sur les arbres Verkle + +Avec ces mises à jour, les freins à l'exécution d'un nœud sont réduites à pratiquement rien. Les utilisateurs bénéficieront d'un accès sécurisé et sans demande d'autorisation à Ethereum sans avoir à sacrifier du stockage ou de la puissance de calcul CPU sur leur ordinateur ou leur téléphone portable, et ils n'auront pas à dépendre de tiers pour les données ou l'accès au réseau lorsqu'ils utilisent des applications. + +## Progrès actuels {#current-progress} + +Des portefeuilles de contrats intelligents sont déjà disponibles, mais d'autres améliorations sont nécessaires pour les rendre aussi décentralisés et sans autorisation que possible. L'EIP-4337 est une proposition finalisée qui ne nécessite aucune modification du protocole d'Ethereum. Le principal contrat intelligent pour l'EIP-4337 a été déployé en mars 2023. + +Le principe de non-vérification de l'état est toujours en phase de recherche et il faudra probablement encore plusieurs années avant qu'il ne soit mise en œuvre. Il existe plusieurs étapes clés sur la voie du principe de non-vérification de l'état, notamment l'expiration des données, qui pourraient être mises en œuvre plus rapidement. D'autres éléments de la feuille de route, tels que les [arbres Verkle](/roadmap/verkle-trees/) et [la séparation des constructeurs de bloc et les validateurs](/roadmap/pbs/), doivent être achevés en premier. + +Les réseaux de test des arbres Verkle sont déjà opérationnels, et la prochaine étape consiste à exécuter des clients compatibles avec les arbres Verkle sur des réseaux de test privés, puis publics. Vous pouvez contribuer à accélérer les progrès en déployant des contrats sur les réseaux de test ou en exécutant des clients de réseau de test. diff --git a/public/content/translations/fr/roadmap/verkle-trees/index.md b/public/content/translations/fr/roadmap/verkle-trees/index.md new file mode 100644 index 00000000000..ac38c5bde09 --- /dev/null +++ b/public/content/translations/fr/roadmap/verkle-trees/index.md @@ -0,0 +1,67 @@ +--- +title: Les arbres de Verkle +description: Une description précise des arbres de Verkle et de la manière dont ceux-ci seront utilisés pour mettre à niveau Ethereum. +lang: fr +summaryPoints: + - Découvrir ce que sont les arbres de Verkle + - Prenez connaissance de l'amélioration utile que sont les arbres de Verkle pour Ethereum +--- + +# Les arbres de Verkle {#verkle-trees} + +Les arbres de Verkle (porte-manteau de « Vector commitment » et « Merkle Trees ») sont une structure de données qui peut être utilisée pour mettre à niveau les nœuds d'Ethereum, afin qu'ils puissent cesser de stocker de grandes quantités de données d'état, sans perdre la capacité à valider les blocs. + +## Le principe de non-vérification de l'état de la blockchain {#statelessness} + +Les arbres de Verkle constituent une étape cruciale sur la voie des clients Ethereum sans état. Les clients sans état sont ceux qui n'ont nul besoin de stocker l'ensemble de la base de données d'état, afin de valider les blocs entrants. Au lieu d'utiliser leur propre copie locale de l'état d'Ethereum pour vérifier les blocs, les clients sans état ont recours à un « témoin » pour les données d'état qui arrivent avec le bloc. Un témoin est un ensemble d'éléments individuels des données d'état, nécessaires à l'exécution d'un groupe particulier de transactions, accompagné d'une preuve cryptographique que le témoin fait réellement partie de la totalité des données. Le témoin est utilisé _au lieu_ de la base de données d'état. Pour que cela fonctionne, les témoins doivent être très petits, de sorte qu'ils puissent être diffusés en toute sécurité dans le temps imparti sur le réseau, et que les validateurs puissent les traiter dans un créneau de 12 secondes. La structure actuelle des données d'état n'est pas adaptée car les témoins sont bien trop volumineux. Les arbres de Verkle résolvent ce problème en permettant l'utilisation de petits témoins, éliminant ainsi l'un des principaux obstacles à l'utilisation de clients sans état. + + + +Actuellement, les clients Ethereum utilisent une structure de données connue sous le nom de "*Patricia Merkle Trie**" ou "Arbre de Merkle Patricia" pour stocker leurs données d'état. +*Un « Patricia Merkle Trie » ou Arbre de Merkle Patricia produit une structure des données cryptographiquement authentifiée pouvant être utilisée pour sauvegarder toutes les paires (clé, valeur). +**Le terme « trie » est une abréviation de « retrieval » (récupération en anglais). Il est utilisé pour désigner spécifiquement une structure de données arborescente dans laquelle les éléments sont indexés par une séquence de caractères. Les informations concernant les comptes individuels sont conservées sous forme de feuilles sur le « trie », et les paires de feuilles sont hachées en séquence répétée jusqu'à ce qu'il ne reste qu'un seul hachage. Cet ultime hachage est connu sous le nom de « racine ». Quant à la vérification des blocs, les clients d'Ethereum exécutent l'ensemble des transactions présentes dans un bloc et mettent à jour leur arbre d'état local. Le bloc est considéré comme valide si la racine de l'arbre local est identique à celle délivrée par le proposant de bloc, car toute différence dans le calcul orchestrée par le proposant de bloc et le nœud de validation, entraînerait une divergence totale dans le hachage de la racine. Le problème de ce principe, c'est que la vérification de la blockchain requiert que chaque client stocke l'ensemble de l'arbre d'état pour le bloc principal et divers blocs historiques (par défaut, Geth conserve les données d'état pour 128 blocs situés à l'arrière du bloc principal). Cela nécessite que les clients aient accès à une grande quantité d'espace disque, ce qui constitue un obstacle à l'exécution de nœuds complets sur du matériel bon marché et à faible consommation. Une solution consiste à mettre à jour l'arbre d'état (trie) vers une structure plus efficace (l'arbre de Verkle), qui peut être synthétisée via l'utilisation d'un petit « témoin » aux données ; celui-ci pouvant être partagé en lieu et place de l'ensemble des données d'état. Le reformatage des données d'état au sein d'un arbre de Verkle est un tremplin pour passer aux clients sans état. + + + +## Qu'est-ce qu'un témoin et pourquoi en avons-nous besoin ? {#what-is-a-witness} + +Vérifier un bloc signifie ré-exécuter les transactions contenues dans le bloc, appliquer les modifications à l'arbre d'état (trie) d'Ethereum et calculer le nouveau hachage racine. Un bloc vérifié est un bloc dont le hachage racine d'état calculé est identique à celui fourni avec le bloc (signifiant que le proposant du bloc a vraiment effectué le calcul qu'il prétend avoir fait). Parmi les clients Ethereum actuels, mettre à jour l'état nécessite l'accès à l'intégralité de l'arbre d'état (Trie), qui est une vaste structure de données devant être stockée localement. Un témoin ne contient que les fragments des données d'état, nécessaires à l'exécution des transactions dans le bloc. Un validateur ne peut alors utiliser ces fragments que pour vérifier que le proposant du bloc a exécuté les transactions de bloc et mis à jour l'état de manière adéquate. Cependant, ceci veut dire que le témoin doit être transféré assez rapidement entre les pairs du réseau Ethereum, pour être réceptionné et traité en toute sécurité par chaque nœud, lors d'un créneau de 12 secondes. Si le témoin est trop volumineux, certains nœuds prendront bien trop de temps à télécharger celui-ci et être raccord avec la chaîne. Il s'agit d'une force centralisatrice, ce qui signifie qu'uniquement les nœuds dotés de connexions Internet haut débit peuvent participer à la validation des blocs. Avec les arbres de Verkle, nulle nécessité d'avoir l'état stocké sur votre disque dur ; _tout_ ce dont vous avez besoin pour vérifier un bloc est inclus dans le bloc lui-même. Malheureusement, les témoins qui peuvent être produits à partir des arbres de Merkle sont trop volumineux pour prendre en charge les clients sans état. + +## Pourquoi les arbres de Verkle permettent-ils des témoins plus petits ? {#why-do-verkle-trees-enable-smaller-witnesses} + +La structure d'un arbre de Merkle rend la taille des témoins très grande - trop grande pour diffuser en toute sécurité entre pairs dans un créneau de 12 secondes.. En effet, le témoin est un chemin reliant les données contenues dans les feuilles au hachage racine. Pour vérifier les données, il est nécessaire d'avoir non seulement tous les hachages intermédiaires qui relient chaque feuille à la racine, mais également tous les nœuds « frères ». Chaque nœud de la preuve a un lien relationnel avec lequel il est haché, ayant pour but de créer le hachage suivant dans l'arbre (Trie). Cela représente énormément de données. Les arbres de Verkle réduisent la taille du témoin en raccourcissant la distance entre les feuilles de l'arbre et sa racine, puis en éliminant également le besoin de fournir des nœuds frères pour vérifier le hachage racine. L'utilisation d'un puissant schéma d'engagement polynomial, en substitution à l'engagement vectoriel de type hachage, augmentera son efficacité en gain d'espace. L'engagement polynomial permet au témoin d'avoir une taille fixe, quel que soit le nombre de feuilles qu'il fasse valoir. + +Dans le cadre du schéma d'engagement polynomial, les témoins ont des tailles gérables qui peuvent être facilement transférées sur le réseau pair à pair (P2P). Cela permet aux clients de vérifier les changements d'état à l'intérieur de chaque bloc, avec une quantité minimale de données. + + + +La taille du témoin varie en fonction du nombre de feuilles qu'il comprend. Supposant que le témoin couvre 1000 feuilles, un témoin pour un arbre de Merkle (trie) serait d'environ 3,5 MB (en supposant 7 niveaux dudit arbre de Merkle) Un témoin pour le même genre de données au sein d'un arbre de Verkle (en supposant 4 niveaux dans l'arborescence) ferait environ 150 Ko - **environ 23 fois plus petit**. Cette diminution dans la taille des témoins permettra aux témoins clients sans état d'être d'une petite taille suffisamment acceptable. Les témoins polynomiaux font entre 0,128 et 1 ko, en fonction de l'engagement polynomial spécifique utilisé. + + + +## Quelle est la structure d'un arbre de Verkle ? {#what-is-the-structure-of-a-verkle-tree} + +Les arbres de Verkle sont des paires `(clé, valeur)` où les clés sont des éléments de 32 octets, composés d'une _tige_ de 31 octets et d'un seul octet _suffix_. Ces clés sont organisées en nœuds _d'extension_ et en nœuds _internes_. Les nœuds d'extension représentent une seule tige pour 256 *enfants aux suffixes différents. *un « enfant » fait référence à un nœud ou une feuille située sous un nœud parent donné. Les nœuds internes ont également 256 enfants, mais ils peuvent être d'autres nœuds d'extension. La principale différence entre la structure de l'arbre de Verkle et celle de l'arbre de Merkle réside dans le fait que Verkle est beaucoup plus plat, signifiant qu'il y a moins de nœuds intermédiaires reliant une feuille à la racine, et donc, moins de données requises pour générer une preuve. + +![](./verkle.png) + +[En savoir plus sur la structure des arbres de Merkle](https://blog.ethereum.org/2021/12/02/verkle-tree-structure) + +## Progrès actuels {#current-progress} + +Les réseaux de test des arbres Verkle sont déjà opérationnels, mais il reste encore d'importantes mises à jour en attente pour les logiciels clients qui sont nécessaires pour prendre en charge les arbres de Verkle. Vous pouvez contribuer à accélérer les progrès en déployant des contrats sur les réseaux de test ou en exécutant des clients de réseau de test. + +[Explorez le réseau de test Verkle Beverly Hills](https://beverlyhills.ethpandaops.io) + +[Regardez Guillaume Ballet expliquer le réseau de test Condrieu Verkle](https://www.youtube.com/watch?v=cPLHFBeC0Vg) (notez que le réseau de test Condrieu était une preuve de travail et a maintenant été remplacé par le [réseau de test Kaustinen](https://kaustinen.ethdevops.io)). + +## Complément d'information {#further-reading} + +- [Dankrad Feist décrypte les arbres de Verkle sur PEEPanEIP](https://www.youtube.com/watch?v=RGJOQHzg3UQ) +- [Guillaume Ballet présente les arbres de Verkle à l'ETHGlobal](https://www.youtube.com/watch?v=f7bEtX3Z57o) +- [« Comment les arbres de Verkle rendent Ethereum léger et agressif » par Guillaume Ballet à Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) +- [Piper Merriam sur les clients sans état depuis l'ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) +- [Dankrad Fiest nous parle des arbres de Verkle et du « Statelessness » dans le podcast Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Vitalik Buterin sur les arbres de Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) +- [Dankrad Feist sur les arbres de Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) +- [Documentation EIP sur l'Arbre de Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/fr/security/index.md b/public/content/translations/fr/security/index.md index 0835d907dea..2e9acd71b3e 100644 --- a/public/content/translations/fr/security/index.md +++ b/public/content/translations/fr/security/index.md @@ -24,7 +24,7 @@ Exemple de mot de passe faible : CuteFluffyKittens! Exemple de mot de passe fort : ymv\*azu.EAC8eyp8umf ``` -Une autre erreur courante est d'utiliser des mots de passe qui peuvent être facilement devinés par le biais de l'[ingénierie sociale](). Par exemple, le fait d'inclure le nom de jeune fille de votre mère, le nom de vos enfants ou de votre animal de compagnie, ou encore des dates d'anniversaire dans votre mot de passe n'est pas sécurisé et augmente le risque que votre mot de passe soit compromis. +Une autre erreur courante est d'utiliser des mots de passe qui peuvent être facilement devinés par le biais de l'[ingénierie sociale](https://wikipedia.org/wiki/Social_engineering_(security)). Par exemple, le fait d'inclure le nom de jeune fille de votre mère, le nom de vos enfants ou de votre animal de compagnie, ou encore des dates d'anniversaire dans votre mot de passe n'est pas sécurisé et augmente le risque que votre mot de passe soit compromis. #### Bonnes pratiques pour des mots de passe forts : {#good-password-practices} @@ -263,7 +263,6 @@ Les arnaques au airdrop : il s'agit d'un projet factice de distribution d'actif ### Sécurité sur le Web {#reading-web-security} -- [This is why you shouldn't use texts for two-factor authentication](https://www.theverge.com/2017/9/18/16328172/sms-two-factor-authentication-hack-password-bitcoin) - _The Verge_ - [Up to 3 million devices infected by malware-laced Chrome and Edge add-ons](https://arstechnica.com/information-technology/2020/12/up-to-3-million-devices-infected-by-malware-laced-chrome-and-edge-add-ons/) - _Dan Goodin_ - [How to Create a Strong Password — That You Won’t Forget](https://www.avg.com/en/signal/how-to-create-a-strong-password-that-you-wont-forget) - _AVG_ - [What is a security key?](https://help.coinbase.com/en/coinbase/getting-started/verify-my-account/security-keys-faq) - _Coinbase_ @@ -271,7 +270,7 @@ Les arnaques au airdrop : il s'agit d'un projet factice de distribution d'actif ### Sécurité des cryptomonnaies {#reading-crypto-security} - [Protecting Yourself and Your Funds](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [4 Ways to Stay Safe in Crypto](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [Security issues in common crypto communication software](https://docs.salusec.io/untitled/web3-penetration-test/risks-in-social-media) - _Salus_ - [Security Guide For Dummies And Smart People Too](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [Crypto Security: Passwords and Authentication](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/fr/zero-knowledge-proofs/index.md b/public/content/translations/fr/zero-knowledge-proofs/index.md index 8977565ea62..faf22b6fd6f 100644 --- a/public/content/translations/fr/zero-knowledge-proofs/index.md +++ b/public/content/translations/fr/zero-knowledge-proofs/index.md @@ -88,7 +88,7 @@ ZK-STARK est un acronyme pour **Zero-Knowledge Scalable Transparent Argument of - **Évolutifs** : ZK-STARK est plus rapide que ZK-SNARK pour générer et vérifier des preuves avec un témoin de taille plus importante. Avec les preuves STARK, les temps de preuve et de vérification n'augmentent que légèrement lorsque le témoin (witness) augmente (tandis que pour les SNARK ils augmentent linéairement selon la taille du témoin). -- **Transparents**: Contrairement à ZK-SNARK (qui se base sur une configuration de confiance), ZK-STARK repose sur un aléa publiquement vérifiable pour générer les paramètres publics de preuve et de vérification. Ainsi, ils sont plus transparents que les ZK-SNARKs. +- **Transparents**: Contrairement à ZK-SNARK (qui se base sur une configuration de confiance), ZK-STARK repose sur un aléa publiquement vérifiable pour générer les paramètres publics de preuve et de vérification. Ainsi, ils sont plus transparents que les ZK-SNARKs. Les ZK-STARKs produisent des preuves plus volumineuses que les ZK-SNARKs, engendrant des frais de vérification généralement plus élevés. Cependant, il y a des cas (comme la preuve de grands ensembles de données) où les ZK-STARKs peuvent être plus intéressants que les ZK-SNARKs. @@ -176,7 +176,7 @@ L'utilisation de MACI _nécessite_ de faire confiance au coordinateur pour ne pa Mais dans les cas où le coordinateur reste honnête, MACI représente un outil puissant pour garantir le caractère inviolable du vote en chaîne. Ceci explique sa popularité parmi les demandes de financement quadratiques (par exemple, [clr.fund](https://clr.fund/#/about/maci)) qui dépendent fortement de l'intégrité des choix de vote de chaque individu. -[En savoir plus sur MACI](https://github.com/privacy-scaling-explorations/maci/blob/master/specs/01_introduction.md). +[En savoir plus sur MACI](https://privacy-scaling-explorations.github.io/maci/). ## Inconvénients à utiliser des preuves à divulgation nulle {#drawbacks-of-using-zero-knowledge-proofs} @@ -208,5 +208,5 @@ Le ZK-STARK est considéré comme immunisé contre la menace de l'informatique q - [Une preuve à divulgation nulle : Améliorer la confidentialité sur une Blockchain](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARKs — Un exemple de preuve à divulgation nulle réaliste et une plongée en profondeur](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARKs – Créez une confiance vérifiable, même contre Quantum Computers](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [Une introduction approximative à la possibilité des zk-SNARKs](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [Une introduction approximative à la possibilité des zk-SNARKs](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [Qu'est-ce que la preuve à divulgation nulle de connaissance et quel est son rôle dans la Blockchain ?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/hi/dao/index.md b/public/content/translations/hi/dao/index.md index d97ba9bbd41..0181de430d4 100644 --- a/public/content/translations/hi/dao/index.md +++ b/public/content/translations/hi/dao/index.md @@ -156,7 +156,7 @@ _आम तौर पर विकेन्द्रीकृत विकास - [DAO-संचालित डिजिटल समुदाय कैसे शुरू करें](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [DAO क्या है?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [कॉइनमार्केटकैप](https://coinmarketcap.com) - [क्या है होलोग्राफिक सहमति?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO निगम नहीं हैं: जहां विटालिक द्वारा स्वायत्त संगठनों में विकेंद्रीकरण मायने रखता है](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO निगम नहीं हैं: जहां विटालिक द्वारा स्वायत्त संगठनों में विकेंद्रीकरण मायने रखता है](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA और बहुत कुछ: एक अधूरी शब्दावली गाइड](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [इथेरियम ब्लॉग](https://blog.ethereum.org) ### वीडियो {#videos} diff --git a/public/content/translations/hi/decentralized-identity/index.md b/public/content/translations/hi/decentralized-identity/index.md index 5a02cf0e570..12e5ff7b4dc 100644 --- a/public/content/translations/hi/decentralized-identity/index.md +++ b/public/content/translations/hi/decentralized-identity/index.md @@ -109,7 +109,7 @@ summaryPoint3: क्रिप्टो को धन्यवाद, उपय ### आत्मा-बंधित टोकन और पहचान {#soulbound} -[आत्मा-बंधित टोकन](https://vitalik.ca/general/2022/01/26/soulbound.html) (अस्ठांतरित NFT) विशेष वॉलेट के लिए अद्वितीय जानकारी इकट्ठा करने के लिए प्रयुक्त किए जा सकते हैं। यह प्रभावी रूप से एक विशेष इथेरियम पते से बंधी एक अद्वितीय ऑन-चेन पहचान बनाता है जिसमें उपलब्धियों का प्रतिनिधित्व करने वाले टोकन शामिल हो सकते हैं (जैसे कि किसी विशेष ऑनलाइन पाठ्यक्रम को समाप्त करना या एक खेल में एक थ्रेशोल्ड स्कोर पास करना) या समुदाय में भागीदारी। +[आत्मा-बंधित टोकन](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (अस्ठांतरित NFT) विशेष वॉलेट के लिए अद्वितीय जानकारी इकट्ठा करने के लिए प्रयुक्त किए जा सकते हैं। यह प्रभावी रूप से एक विशेष इथेरियम पते से बंधी एक अद्वितीय ऑन-चेन पहचान बनाता है जिसमें उपलब्धियों का प्रतिनिधित्व करने वाले टोकन शामिल हो सकते हैं (जैसे कि किसी विशेष ऑनलाइन पाठ्यक्रम को समाप्त करना या एक खेल में एक थ्रेशोल्ड स्कोर पास करना) या समुदाय में भागीदारी। ## विकेन्द्रीकृत पहचान के लाभ {#benefits-of-decentralized-identity} diff --git a/public/content/translations/hi/desci/index.md b/public/content/translations/hi/desci/index.md index 08918944cde..2051987d80b 100644 --- a/public/content/translations/hi/desci/index.md +++ b/public/content/translations/hi/desci/index.md @@ -76,7 +76,7 @@ Web3 में DAO और Web3 द्वारा विकसित विभ जिस तरह से NFT भविष्य के लेनदेन के लिए राजस्व को मूल निर्माता को वापस भेज सकता है, उसी तरह आप शोधकर्ताओं, शासी निकायों (जैसे DAO), या यहां तक ​​कि उन विषयों को पुरस्कृत करने के लिए पारदर्शी मूल्य अनुदान श्रृंखला स्थापित कर सकते हैं जिनका डेटा एकत्र किया गया है। -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) किए जा रहे अनुसंधान प्रयोगों के विकेन्द्रीकृत डेटा भंडार की कुंजी के रूप में भी कार्य कर सकता है, और NFT और [DeFi](/defi/) वित्तीयकरण (विभाजन से ऋण पूल और मूल्य मूल्यांकन तक) में प्लग कर सकता है। यह मूल रूप से ऑन-चेन संस्थाओं जैसे DAO जैसे [VitaDAO](https://www.vitadao.com/) को सीधे ऑन-चेन अनुसंधान करने की अनुमति देता है। गैर-हस्तांतरणीय ["सोलबाउंड" टोकन](https://vitalik.ca/general/2022/01/26/soulound.html) का आगमन भी अनुमति देकर DeSci में एक महत्वपूर्ण भूमिका निभा सकता है, व्यक्तियों को अपने इथेरियम पते से जुड़े अपने अनुभव और साख को प्रमाणित करने की अनुमति मिल सकती है। +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) किए जा रहे अनुसंधान प्रयोगों के विकेन्द्रीकृत डेटा भंडार की कुंजी के रूप में भी कार्य कर सकता है, और NFT और [DeFi](/defi/) वित्तीयकरण (विभाजन से ऋण पूल और मूल्य मूल्यांकन तक) में प्लग कर सकता है। यह मूल रूप से ऑन-चेन संस्थाओं जैसे DAO जैसे [VitaDAO](https://www.vitadao.com/) को सीधे ऑन-चेन अनुसंधान करने की अनुमति देता है। गैर-हस्तांतरणीय ["सोलबाउंड" टोकन](https://vitalik.eth.limo/general/2022/01/26/soulound.html) का आगमन भी अनुमति देकर DeSci में एक महत्वपूर्ण भूमिका निभा सकता है, व्यक्तियों को अपने इथेरियम पते से जुड़े अपने अनुभव और साख को प्रमाणित करने की अनुमति मिल सकती है। ### डेटा भंडारण, पहुंच और वास्तुकला {#data-storage} diff --git a/public/content/translations/hi/governance/index.md b/public/content/translations/hi/governance/index.md index e811f028605..185c4bee151 100644 --- a/public/content/translations/hi/governance/index.md +++ b/public/content/translations/hi/governance/index.md @@ -175,9 +175,9 @@ DAO हैक पर और देखें: इथेरियम में शासन को सटीक तरह से परिभाषित नहीं किया गया है। विभिन्न समुदाय प्रतिभागियों के इस पर विविध दृष्टिकोण हैं। यहां उनमें से कुछ हैं: -- [ब्लॉकचेन शासन पर नोट्स](https://vitalik.ca/general/2017/12/17/voting.html) - _विटालिक ब्यूटेरिन_ +- [ब्लॉकचेन शासन पर नोट्स](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _विटालिक ब्यूटेरिन_ - [इथेरियम शासन कैसे काम करता है?](https://cryptotesters.com/blog/ethereum-governance) – _क्रिप्टोटेस्टर_ - [इथेरियम शासन कैसे काम करता है](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _मीका ज़ोलटू_ - [इथेरियम कोर डेवलपर क्या है?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _हडसन जेमिसन_ -- [शासन, भाग 2: धनतंत्र अभी भी खराब है](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _विटालिक ब्यूटेरिन_ -- [सिक्का मतदान शासन से आगे बढ़ना](https://vitalik.ca/general/2021/08/16/voting3.html) - _विटालिक ब्यूटेरिन_ +- [शासन, भाग 2: धनतंत्र अभी भी खराब है](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _विटालिक ब्यूटेरिन_ +- [सिक्का मतदान शासन से आगे बढ़ना](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _विटालिक ब्यूटेरिन_ diff --git a/public/content/translations/hi/zero-knowledge-proofs/index.md b/public/content/translations/hi/zero-knowledge-proofs/index.md index 73c7e5bfedf..9c03b14abf8 100644 --- a/public/content/translations/hi/zero-knowledge-proofs/index.md +++ b/public/content/translations/hi/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK को क्वांटम कंप्यूटिंग के ख - [एक शून्य-ज्ञान प्रमाण: ब्लॉकचेन पर गोपनीयता में सुधार](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) - _मित्री लावरेनोव_ - [zk-SNARKs - एक यथार्थवादी शून्य-ज्ञान उदाहरण](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _एडेम ल्यूसियानो_ - [ZK-STARKs - क्वांटम कंप्यूटर के खिलाफ भी सत्यापन योग्य विश्वास बनाएं](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _एडेम ल्यूसियानो_ -- [zk-SNARKs कैसे संभव हैं, इसका एक अनुमानित परिचय](https://vitalik.ca/general/2021/01/26/snarks.html) — _विटालिक ब्यूटेरिन_ +- [zk-SNARKs कैसे संभव हैं, इसका एक अनुमानित परिचय](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _विटालिक ब्यूटेरिन_ - [शून्य-ज्ञान प्रमाण और ब्लॉकचेन में इसकी भूमिका क्या है?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/hu/bridges/index.md b/public/content/translations/hu/bridges/index.md index bd61edc97c0..2c6807f594e 100644 --- a/public/content/translations/hu/bridges/index.md +++ b/public/content/translations/hu/bridges/index.md @@ -6,7 +6,7 @@ lang: hu # Blokkláncösszekötők {#prerequisites} -_A Web3 egy olyan ökoszisztémává fejlődött, ahol L1 blokkláncok és L2 skálázási megoldások találhatók, mind egyedi képességekkel és kompromisszumokkal. Ahogy növekszik a blokkláncprotokollok száma, úgy nő [a kereslet is, hogy az eszközöket láncok között lehessen mozgatni](). Az igény kielégítéséhez összekötőkre vagy hidakra van szükségünk._ +_A Web3 egy olyan ökoszisztémává fejlődött, ahol L1 blokkláncok és L2 skálázási megoldások találhatók, mind egyedi képességekkel és kompromisszumokkal. Ahogy növekszik a blokkláncprotokollok száma, úgy nő [a kereslet is, hogy az eszközöket láncok között lehessen mozgatni](https://dune.xyz/eliasimos/Bridge-Away-(from-Ethereum)). Az igény kielégítéséhez összekötőkre vagy hidakra van szükségünk._ @@ -30,7 +30,7 @@ A hidak kötik össze a blokkláncokat, lehetővé téve az információ és a t A hidak lehetőséget adnak arra, hogy: -- az eszközök és az információk a láncok között mozogjanak +- az eszközök és az információk a láncok között mozogjanak. - a decentralizált alkalmazások hozzáférjenek a különféle blokkláncok erősségeihez – így azok képességeit fejleszteni tudják (mivel a protokollok esetében manapság több tér van az innovációra). - a felhasználók új platformokat érjenek el és hasznosítsák a különböző láncok előnyeit. - a fejlesztők a különböző blokklánc-ökoszisztémákon együttműködjenek és új platformokat építsenek a felhasználók számára. diff --git a/public/content/translations/hu/community/code-of-conduct/index.md b/public/content/translations/hu/community/code-of-conduct/index.md index f651b5b2f2e..064d6c5f54b 100644 --- a/public/content/translations/hu/community/code-of-conduct/index.md +++ b/public/content/translations/hu/community/code-of-conduct/index.md @@ -52,7 +52,7 @@ Az elfogadhatatlan viselkedések például: - Fizikai erőszak, azzal való fenyegetés vagy támogatása bármilyen formában - Szexualitással kapcsolatos beszéd vagy kép használata, illetve ilyen jellegű közeledés -- Egy másik személy eljátszása, vagy rosszhiszeműen azt állítani, hogy egy személlyel vagy szervezettel kapcsolatban áll valaki. +- Egy másik ember megszemélyesítése, vagy rosszhiszeműen azt állítani, hogy egy személlyel vagy szervezettel kapcsolatban áll valaki - Zavaró, derogáló kommentek, személyes vagy politikai támadások - Más tag zaklatása nyilvános vagy privát csatornákon - Mások privát információinak nyilvánossá tétele, mint fizikai vagy elektronikus cím, kifejezett kérése nélkül diff --git a/public/content/translations/hu/community/get-involved/index.md b/public/content/translations/hu/community/get-involved/index.md index 1073907af8f..8e506b50d95 100644 --- a/public/content/translations/hu/community/get-involved/index.md +++ b/public/content/translations/hu/community/get-involved/index.md @@ -28,7 +28,7 @@ Kezdje azzal, hogy elolvassa az ethereum.org misszióját és értékeit a [maga - Írjon vagy véleményezzen egy Ethereum fejlesztési javaslatot (EIP) - Írjon EIP-t 1. Adja be ötletét az [Ethereum Magicians csoportnak](https://ethereum-magicians.org) - 2. Olvassa el az [EIP-1-et](https://eip.ethereum.org/EIPS/eip-1) – **Igen, ez a _teljes_ dokumentum.** + 2. Olvassa el az [EIP-1-et](https://eips.ethereum.org/EIPS/eip-1) – **Igen, ez a _teljes_ dokumentum.** 3. Kövesse az EIP-1 iránymutatásait. Hivatkozzon rá, ahogy a vázlatot készíti. - Tudja meg, hogyan lehet [EIP-szerkesztő](https://eips.ethereum.org/EIPS/eip-5069) - Ön is véleményezheti az EIP-ket már most! Nézze meg a [nyitott PR-okat az `e-review` címkét](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review) használva. Adjon technikai visszajelzést a `discussion-to` hivatkozáson. diff --git a/public/content/translations/hu/community/grants/index.md b/public/content/translations/hu/community/grants/index.md index ebfbecf2baf..5f9cf04857b 100644 --- a/public/content/translations/hu/community/grants/index.md +++ b/public/content/translations/hu/community/grants/index.md @@ -15,30 +15,26 @@ A listát a közösség tartja karban. Ha bármit hiányol vagy nem talál helye Ezek a programok a kiterjed Ethereum-ökoszisztémát támogatják és a projektek széles körének ajánlanak finanszírozást. Mint a skálázási megoldások, közösségépítés, biztonság, adatvédelem és még sok más. Nem kötődnek valamelyik platformhoz, és mindig jó kiindulópont, ha valamiért Ön bizonytalan a támogatások témájában. - [EF Ecosystem Support Program](https://esp.ethereum.foundation) – _Nyílt forráskódú projektek finanszírozása: fókuszban az egyetemes eszközök, infrastruktúra, kutatás és közjavak_ -- [Ethereum RFPs](https://github.com/ethereum/requests-for-proposals) – _Javaslatok kérése az Ethereum Alapítvány által az ökoszisztémában való munkavégzés és projektek kapcsán_ - [MetaCartel](https://www.metacartel.org/grants/) – _Dapp fejlesztése, DAO létrehozása_ - [Moloch DAO](https://www.molochdao.com/) – _Adatvédelem, L2 skálázás, kliensbiztonság és más területek_ -- [Open Grants](https://opengrants.com/explore) -- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _A támogatást ajánló szervezetek listája Google-táblázatban_ +- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) – _A támogatást ajánló szervezetek listája Google-táblázatban_ - [Crunchbase for Web3 Grants](https://www.cryptoneur.xyz/web3-grants) – _Támogatások szűrése és keresése kategória, alkalmazási terület, összeg és egyéb alapján. Segítsen, hogy mások is megtalálják a megfelelő támogatást._ - [Academic Grants](https://esp.ethereum.foundation/academic-grants) – _Az Ethereummal kapcsolatos akadémiai munkák támogatása_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) – _A Blockworks egy átfogó jegyzéket hozott létre, lefedve az összes támogatást, változtatási javaslatot (RFP) és hibavadászatot._ ## Projektspecifikus {#project-specific} Projektek által adott támogatás olyanoknak, akik az adott technológiát fejlesztenék vagy kísérleteznének vele. - [Aave Grants Program](https://aavegrants.org/) – _[Aave](https://aave.com/) támogatási DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ökoszisztéma finanszírozási alapja_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[A Balancer](https://balancer.fi/) ökoszisztéma finanszírozási alapja_ - [Chainlink Grants Program](https://chain.link/community/grants) – _[Chainlink](https://chain.link/) közösségi támogatások_ -- [Compound Grants Program](https://compoundgrants.org/) – _[Compound](https://compound.finance/) pénzügyi ökoszisztéma_ - [Decentraland Grants Program](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverzum_ -- [Lido Ecosystem Grants Organisation (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) pénzügyi ökoszisztéma_ +- [Lido Ecosystem Grants Organisation (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) pénzügyi ökoszisztéma_ - [MetaMask Program](https://metamaskgrants.org/) – _[MetaMask](https://metamask.io/) munkavállalók által vezetett támogatási DAO_ -- [mStable Grants Program](https://docs.mstable.org/advanced/grants-program) – _[mStable](https://mstable.org/) közösség_ - [SKALE Network Grants Program](https://skale.space/developers#grants) – _[SKALE Network](https://skale.space/) ökoszisztéma_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) ökoszisztéma_ -- [UMA Grants Program](https://grants.umaproject.org/) – _[UMA](https://umaproject.org/) fejlesztői támogatás_ -- [Uniswap Grants Program](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) közösség_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/apply-for-a-grant) – _[Uniswap](https://uniswap.org/) közösség_ - [Web3-támogatások](https://web3grants.net) – _A web3/kripto területén futó támogatási programok kimerítő listája_ ## Kvadratikus finanszírozás {#quadratic-funding} diff --git a/public/content/translations/hu/community/language-resources/index.md b/public/content/translations/hu/community/language-resources/index.md index 1eca7a08156..e0b31101c7a 100644 --- a/public/content/translations/hu/community/language-resources/index.md +++ b/public/content/translations/hu/community/language-resources/index.md @@ -72,7 +72,7 @@ Ha Ön kétnyelvű és segítene nekünk, hogy több embert érjünk el, akkor k - [Gwei.cz](https://gwei.cz) – helyi közösség a web3 körül, amely oktatási anyagokat készít, online és személyes találkozókat szervez - [Gwei.cz Příručka](https://prirucka.gwei.cz/) – Ethereum útmutató kezdőknek - [DAO Příručka](https://dao.gwei.cz/) – útmutató kezdőknek a DAO-okról -- [Mastering Ethereum](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Az Ethereum elsajátítása, cseh verzió +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) – Az Ethereum elsajátítása, cseh verzió ### Francia {#fr} diff --git a/public/content/translations/hu/community/online/index.md b/public/content/translations/hu/community/online/index.md index d5d3ae8aa82..f3e3844b977 100644 --- a/public/content/translations/hu/community/online/index.md +++ b/public/content/translations/hu/community/online/index.md @@ -24,13 +24,13 @@ Ethereum rajongók százezrei gyűlnek össze ezeken az online fórumokon, hogy Ethereum Cat Herders – projektmanagement-támogatás az Ethereum-fejlesztésekhez Ethereum Hackers – az ETHGlobal által üzemeltetett Discord chat: online közösség az Ethereum hackereknek világszinten CryptoDevs – Ethereum-fejlesztésre fókuszáló Discord-közösség -EthStaker Discord – közösségi vezetésű útmutatás, oktatás, támogatás és források a meglévő és lehetséges letéteseknek -Ethereum.org website team – beszélgessen az ethereum.org web fejlesztésről és dizájnról a közösség tagjaival +EthStaker Discord – közösségi vezetésű útmutatás, oktatás, támogatás és források a meglévő és lehetséges letéteseknek +Ethereum.org website team – beszélgessen az ethereum.org web fejlesztésről és dizájnról a közösség tagjaival Matos Discord – web3 alkotói közösség, ahol a fejlesztők, az iparági vezetők és az Ethereum rajongók találkoznak. Szenvedélyünk a web3 fejlesztés, a dizájn és a kultúra. Jöjjön és építsen velünk. -Solidity Gitter – solidity fejlesztésről (Gitter) szóló csevegés +Solidity Gitter – solidity fejlesztésről (Gitter) szóló csevegés Solidity Matrix – solidity fejlesztősről (Matrix) szóló csevegés -Ethereum Stack Exchange _–kérdések és válaszok fóruma_ -Peeranha _– decentralizált kérdések és válaszok fóruma_ +Ethereum Stack Exchange *–kérdések és válaszok fóruma* +Peeranha *– decentralizált kérdések és válaszok fóruma* ## YouTube és Twitter {#youtube-and-twitter} diff --git a/public/content/translations/hu/community/research/index.md b/public/content/translations/hu/community/research/index.md index 24b92d10a0f..11aa5490315 100644 --- a/public/content/translations/hu/community/research/index.md +++ b/public/content/translations/hu/community/research/index.md @@ -26,7 +26,7 @@ Ez a riport 2022. májusában készült, melyben a [DelphiDigital](https://membe A protokollkutatás az Ethereum alaprétegével foglalkozik – szabályok összessége, hogy a csomópontok hogyan kapcsolódnak, kommunikálnak, cserélik és tárolják az adatot, és hogyan jutnak konszenzusra a blokklánc státuszát illetően. A protokollkutatás két fő kategóriára oszlik: konszenzus és végrehajtási. -### Consensus {#consensus} +### Konszenzus {#consensus} A konszenzuskutatás az [Ethereum proof-of-stake mechanizmusával](/developers/docs/consensus-mechanisms/pos/) foglalkozik. Néhány példa: @@ -39,16 +39,16 @@ Emellett a jövőbe előretekintő kutatások, a protokoll alapvető újratervez #### Háttér olvasmányok {#background-reading} -- [Introduction to proof-of-stake](/developers/docs/consensus-mechanisms/pos/) -- [Casper-FFG paper](https://arxiv.org/abs/1710.09437) +- [Bevezetés a proof-of-stake mechanizmusba](/developers/docs/consensus-mechanisms/pos/) +- [Casper-FFG leírás](https://arxiv.org/abs/1710.09437) - [Casper-FFG magyarázat](https://arxiv.org/abs/1710.09437) -- [Gasper paper](https://arxiv.org/abs/2003.03052) +- [Gasper leírás](https://arxiv.org/abs/2003.03052) #### Jelenlegi kutatás {#recent-research} - [Ethresear.ch konszenzus](https://ethresear.ch/c/consensus/29) - [Elérhetőség/Véglegesség dilemma](https://arxiv.org/abs/2009.04987) -- [Single slot finality](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) +- [Egy sloton belüli véglegesség](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) - [Javaslattevő-építő szétválasztása](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) ### Végrehajtási {#execution} @@ -67,11 +67,11 @@ A végrehajtási réteg a tranzakciók feldolgozását végzi, az [Ethereum virt #### Jelenlegi kutatás {#recent-research-1} - [Adatbázis optimalizáció](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) -- [State expiry](https://notes.ethereum.org/@vbuterin/state_expiry_eip) +- [A státusz lejárata](https://notes.ethereum.org/@vbuterin/state_expiry_eip) - [Utak a státusz lejáratának beállításához](https://hackmd.io/@vbuterin/state_expiry_paths) - [Verkle és státusz lejáratának beállítása](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) - [Előzmények kezelése](https://eips.ethereum.org/EIPS/eip-4444) -- [Verkle-fák](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Verkle-fák](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Adatelérhetőség mintavétele](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## Kliensfejlesztés {#client-development} @@ -124,7 +124,7 @@ Az L2 az egyik területe még több kutatást és fejlesztést igényel – ez p - [Bevezetés a blokklánchidak működésébe](/bridges/) - [Vitalik a hidakról](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [A blokklánchidakról szóló cikk](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [A hidakba ragadt érték]() +- [A hidakba ragadt érték](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Jelenlegi kutatás {#recent-research-3} @@ -156,7 +156,7 @@ A [csomópontok futtatása](/developers/docs/nodes-and-clients/run-a-node/) szer #### Jelenlegi kutatás {#recent-research-5} -- [ecdsa a FGPA-król](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [ecdsa a FPGA-król](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Biztonság {#security} @@ -346,7 +346,6 @@ Az Ethereum fejlesztők eszközei gyorsan fejlődnek. Ezen a területen is sok a - [Fejlesztői keretrendszerek](/developers/docs/frameworks/) - [Konszenzusfejlesztői eszközök listája](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Token szabványok](/developers/docs/standards/tokens/) -- [Biastek: Ethereum-eszközök](https://biastek.com/ethereum-tools/) - [CryptoDevHub: EVM-eszközök](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Jelenlegi kutatás {#recent-research-17} diff --git a/public/content/translations/hu/community/support/index.md b/public/content/translations/hu/community/support/index.md index efc25e4f4cb..2a3add460b3 100644 --- a/public/content/translations/hu/community/support/index.md +++ b/public/content/translations/hu/community/support/index.md @@ -30,7 +30,7 @@ Gondjai vannak a tárcájával? A legtöbb tárcának van dedikált támogatói - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Ez nem egy teljes lista. Segítségre van szüksége, hogy megtalálja az adott tárca támogatói csapatát? Csatlakozzon az [ethereum.org Discord](https://discord.gg/ethereum-org) csatornához, és megpróbálunk segíteni._ +_Ez nem egy teljes lista. Segítségre van szüksége, hogy megtalálja az adott tárca támogatói csapatát? Csatlakozzon az [ethereum.org Discord](https://discord.gg/rZz26QWfCg) csatornához, és megpróbálunk segíteni._ Ethereum-tárcát keres? [Fedezze fel az Ethereum-tárcák teljes választékát](/wallets/find-wallet/). @@ -39,7 +39,7 @@ Ethereum-tárcát keres? [Fedezze fel az Ethereum-tárcák teljes választékát A fejlesztés tele van kihívásokkal. Alább található néhány fejlesztőket támogató platform, tapasztalt Ethereum-fejlesztőkkel. - [Alchemy University](https://university.alchemy.com/#starter_code) -- [CryptoDevs discord](https://discord.gg/Z9TA39m8Yu) +- [CryptoDevs discord](https://discord.com/invite/5W5tVb3) - [Ethereum StackExchange](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Web3 University](https://www.web3.university/) @@ -53,7 +53,7 @@ A kérdése egy bizonyos eszközhöz, projekthez vagy könyvtárhoz kapcsolódik Néhány népszerű példa: -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [Hardhat](https://discord.gg/xtrMGhmbfZ) @@ -65,7 +65,7 @@ Néhány népszerű példa: Ha Ön csomópontot vagy validátort futtat, a következő közösségek segítenek belevágni. -- [EthStaker discord](https://discord.io/ethstaker) +- [EthStaker discord](https://discord.gg/ethstaker) - [EthStaker reddit](https://www.reddit.com/r/ethstaker) Az Ethereum klienseket építő csapatok is dedikált, nyilvános fórumokkal rendelkeznek, ahol kérdezni lehet. diff --git a/public/content/translations/hu/dao/index.md b/public/content/translations/hu/dao/index.md index de3746f14e2..cf35ddfeea6 100644 --- a/public/content/translations/hu/dao/index.md +++ b/public/content/translations/hu/dao/index.md @@ -156,7 +156,7 @@ _Főleg a protokollok és decentralizált alkalmazások (dapp) decentralizált f - [Hogyan lehet létrehozni egy DAO által működtetett digitális közösséget](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Mi az a DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Mi az a holografikus konszenzus?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) – [DAOstack](https://daostack.io/) -- [A DAO-k nem vállalatok: hol van a legnagyobb jelentősége a decentralizációnak az autonóm szervezetekben – Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [A DAO-k nem vállalatok: hol van a legnagyobb jelentősége a decentralizációnak az autonóm szervezetekben – Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA és mások: egy nem teljes terminológiai útmutató](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) – [Ethereum Blog](https://blog.ethereum.org) ### Videók {#videos} diff --git a/public/content/translations/hu/decentralized-identity/index.md b/public/content/translations/hu/decentralized-identity/index.md index 2f5e810a0df..9e06dd210fc 100644 --- a/public/content/translations/hu/decentralized-identity/index.md +++ b/public/content/translations/hu/decentralized-identity/index.md @@ -109,7 +109,7 @@ A következő példa bemutatja, hogyan működik a láncon belüli tanúsítás ### Egyénhez kötött tokenek és identitás {#soulbound} -Az [egyénhez kötött tokeneket](https://vitalik.ca/general/2022/01/26/soulbound.html) (nem átadható NFT-k) arra lehet használni, hogy egy adott tárcához tartozó egyedi információkat gyűjtsenek. Ez gyakorlatilag létrehoz egy egyedi, láncon belüli identitást, amely egy adott Ethereum-címhez kötődik, és eredményeket (mint egy online tanfolyam elvégzése vagy egy játékban elért szint) vagy közösségi részvételt jelentő tokeneket foglal magába. +Az [egyénhez kötött tokeneket](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (nem átadható NFT-k) arra lehet használni, hogy egy adott tárcához tartozó egyedi információkat gyűjtsenek. Ez gyakorlatilag létrehoz egy egyedi, láncon belüli identitást, amely egy adott Ethereum-címhez kötődik, és eredményeket (mint egy online tanfolyam elvégzése vagy egy játékban elért szint) vagy közösségi részvételt jelentő tokeneket foglal magába. ## A decentralizált identitás előnyei {#benefits-of-decentralized-identity} @@ -161,6 +161,7 @@ Számtalan ambiciózus projekt használja az Ethereumot a decentralizált identi - **[Proof of Humanity](https://www.proofofhumanity.id)** – _Az emberség igazolása (PoH) egy közösségi identitás igazolására készült rendszer, mely az Ethereumra épül._ - **[BrightID](https://www.brightid.org/)** – _Egy decentralizált, nyílt forráskódú, közösségi identitási hálózat, amely új módot keres az azonosításra egy közösségi gráf megalkotásával és elemzésével._ - **[Proof-of-personhood Passport](https://proofofpersonhood.com/)** - _Egy decentralizált, digitális identitásgyűjtemény._ +- **[walt.id](https://walt.id)** – _Nyílt forráskódú, decentralizált identitás- és tárcainfrastruktúra, amely lehetővé teszi a fejlesztőknek és szervezeteknek, hogy kihasználják a szuverén identitást, valamint az NFT-ket/SBT-ket._ ## További olvasnivaló {#further-reading} @@ -170,6 +171,7 @@ Számtalan ambiciózus projekt használja az Ethereumot a decentralizált identi - [Mi az az Ethereum ERC725? Független identitáskezelés a blokkláncon](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ - [Hogyan tudja a blokklánc megoldani a digitális identitás problémáját](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ - [Mi az a decentralizált identitás és miért érdemes figyelembe venni?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- [Bevezetés a decentralizált identitás világába](https://walt.id/white-paper/digital-identity) – _Dominik Beron_ ### Videók {#videos} @@ -177,9 +179,11 @@ Számtalan ambiciózus projekt használja az Ethereumot a decentralizált identi - [Az Ethereumba való bejelentkezés és a decentralizált identitás témája a Ceramic, IDX, React és 3ID Connect használatával](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _YouTube útmutató a személyazonosítási rendszer kiépítéséről, mely az Ethereum-tárca alapján létrehozza, kiolvassa és frissíti a felhasználó profilját – Nader Dabit_ - [BrightID – Decentralizált identitás az Ethereumon](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Bankless podcast epizód a BrightID-ról, ami egy decentralizált identitási megoldás az Ethereumon_ - [A láncon kívüli internet: decentralizált identitás és igazolható bizonyítványok (VC)](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — EthDenver 2022 Evin McMullen prezentációja +- [A hitelesítő adatok bemutatása](https://www.youtube.com/watch?v=ce1IdSr-Kig) – YouTube magyarázó videó példával Tamino Baumanntól ### Közösségek {#communities} - [ERC-725 szövetség a GitHubon](https://github.com/erc725alliance) — _Az ERC725 szabvány támogatói, mely az Ethereum-blokkláncon való identitáskezelést célozza_ - [SpruceID Discord-szerver](https://discord.com/invite/Sf9tSFzrnt) — _Rajongók és fejlesztők közössége, akik az Ethereumba való bejelentkezés funkcióján dolgoznak_ - [Veramo Labs](https://discord.gg/sYBUXpACh4) — _Fejlesztői közösség, melynek célja az alkalmazásokhoz szükséges igazolható adatok keretrendszerének kidolgozása_ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) – _Fejlesztők és építők közössége, akik a decentralizált identitás számtalan iparágban való felhasználási területeivel foglalkoznak_ diff --git a/public/content/translations/hu/desci/index.md b/public/content/translations/hu/desci/index.md index a0797e6f91d..fcd2ead7e1e 100644 --- a/public/content/translations/hu/desci/index.md +++ b/public/content/translations/hu/desci/index.md @@ -76,7 +76,7 @@ A szellemi tulajdon (IP) nagy probléma a hagyományos tudomány területén: on Ugyanazon a módon, ahogy az NFT-k képesek a jövőbeli tranzakciók után is fizetni az eredeti alkotónak, lehetséges transzparens értékteremtő láncokat meghatározni arra, hogy a kutatókat, az irányító szerveket (mint a DAO) vagy akár a kutatási adatokat biztosító személyeket díjazzák. -[Az IP-NFT-k](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) arra is használhatók, hogy a kutatási kísérletek decentralizált adattárháza jöjjön létre, és bekerüljön az NFT- és [DeFi](/defi/)-alapú finanszírozásba (a töredékes forrásoktól a kölcsönalapok és az értékfelmérés felé mozdulva). Az eredetileg is láncon belül létező entitások, mint a DAO-k, például a [VitaDAO](https://www.vitadao.com/), végezhet kutatást közvetlenül a láncon. A nem átadható, [egyénhez kötött (soulbound) tokenek](https://vitalik.ca/general/2022/01/26/soulbound.html) kifejlődése szintén fontos lehet a DeSci számára, hogy a tudósok az Ethereum-címükhöz kapcsoltan bizonyítani tudják tapasztalataikat és hitelesítő adataikat. +[Az IP-NFT-k](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) arra is használhatók, hogy a kutatási kísérletek decentralizált adattárháza jöjjön létre, és bekerüljön az NFT- és [DeFi](/defi/)-alapú finanszírozásba (a töredékes forrásoktól a kölcsönalapok és az értékfelmérés felé mozdulva). Az eredetileg is láncon belül létező entitások, mint a DAO-k, például a [VitaDAO](https://www.vitadao.com/), végezhet kutatást közvetlenül a láncon. A nem átadható, [egyénhez kötött (soulbound) tokenek](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) kifejlődése szintén fontos lehet a DeSci számára, hogy a tudósok az Ethereum-címükhöz kapcsoltan bizonyítani tudják tapasztalataikat és hitelesítő adataikat. ### Adattárolás, adatelérés és architektúra {#data-storage} @@ -103,7 +103,7 @@ Fedezze fel a projekteket és csatlakozzon a DeSci közösségéhez. - [OceanDAO: az adattal kapcsolatos tudományok DAO által irányított finanszírozása](https://oceanprotocol.com/dao) - [Opscientia: nyílt, decentralizált, tudományos munkafolyamatok](https://opsci.io/research/) - [LabDAO: fehérjék számítógépes szimulációja](https://alphafodl.vercel.app/) -- [Bio.xyz: finanszírozás szerzése a biotechnológiai DAO-jához vagy decentralizált tudományos projektjéhez](https://www.molecule.to/) +- [Bio.xyz: finanszírozás szerzése a biotechnológiai DAO-jához vagy decentralizált tudományos projektjéhez](https://www.bio.xyz/) - [ResearchHub: tudományos eredmények publikálása és azok megvitatása munkatársaival](https://www.researchhub.com/) - [VitaDAO: hosszútávú kutatások finanszírozása a szponzorált kutatási megállapodások alapján](https://www.vitadao.com/) - [Fleming Protocol: nyílt forráskódú adatgazdaság, amely fűti a kollaboratív orvosbiológiai felfedezéseket](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/hu/developers/docs/accounts/index.md b/public/content/translations/hu/developers/docs/accounts/index.md index 0f76a61e5b8..8b7ef20585f 100644 --- a/public/content/translations/hu/developers/docs/accounts/index.md +++ b/public/content/translations/hu/developers/docs/accounts/index.md @@ -2,21 +2,20 @@ title: Ethereum számlák description: Az Ethereum számlák magyarázata – az adatstruktúrájuk és a kapcsolatuk a kulcspár kriptográfiával. lang: hu -isOutdated: true --- Egy Ethereum számla egy olyan entitás, mely ether (ETH) egyenleggel rendelkezik és tranzakciókat tud indítani az Ethereumon. A számlák lehetnek felhasználók által irányítottak, vagy okos szerződésként telepítettek. ## Előfeltételek {#prerequisites} -A számlák téma könnyen feldolgozható még a legkezdőbb felhasználóknak is. De ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvasd el a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) oldalunkat. +Ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvassa el a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) oldalunkat. ## Számlatípusok {#types-of-account} Az Ethereum két számlatípust kínál: -- Külső tulajdonú - bárki irányíthatja a privát kulcsokkal -- Szerződés - egy okosszerződés, melyet a hálózatra telepítettek és kód irányítja. Tudj meg többet az [okosszerződésekről](/developers/docs/smart-contracts/) +- Externally owned account (EOA) – bárki irányíthatja a privát kulcsokkal +- Szerződéses számla – egy okosszerződés, amelyet a hálózatra telepítettek és kód irányítja. Tudjon meg többet az [okosszerződésekről](/developers/docs/smart-contracts/) Mindkét számlatípus képes: @@ -29,22 +28,24 @@ Mindkét számlatípus képes: - Egy számla létrehozása nem kerül semmibe - Tranzakciókat indíthatsz -- A külső tulajdonú számlák közötti tranzakciók csak ETH átutalások lehetnek +- A külső tulajdonú számlák közötti tranzakciók csak ETH/token átutalások lehetnek +- Egy kriptográfiai kulcspárból állnak: a nyilvános és a privát kulcs kontrollálja a számlával kapcsolatos ügyleteket **Szerződés** -- Egy számla létrehozás költséggel jár, mivel a hálózati tárhelyet használod +- Egy számla létrehozása költséggel jár, mivel a hálózati tárhelyet használja - Csak úgy küldhet tranzakciókat ha az egy válasz egy bejövő tranzakcióra -- Külső tulajdonú számláról küldött tranzakciók beindíthat egy programkódot, mely parancsokat hajt végre, mint például token átutalásokat vagy akár új szerződés létrehozásokat +- A külső tulajdonú számláról szerződéses számlára küldött tranzakciók egy programkódot indítanak, amely sokféle parancsot tud végrehajtani, mint például token átutalása vagy akár új szerződés létrehozása +- A szerződéses számláknak nincs privát kulcsuk. Ehelyett az okosszerződés logikája kontrollálja azokat ## Egy számla közelebbről {#an-account-examined} Az Ethereum számláknak négy mezőjük van: -- `nonce` – egy számláló, mely a számláról küldött tranzakciók számát jelzi. Ez biztosítja, hogy minden tranzakciót csak egyszer dolgozzanak fel. Szerződéses számlák esetében ez a szám jelzi a számla által létrehozott szerződéseket -- `balance` – A cím által birtokolt Wei-k száma. A Wei az ETH egysége és 1e+18 Wei van egy ETH-ben. -- `codeHash` – Az összes ilyen kódrészletet az állapot adatbázis tartalmazza a megfelelő hashek alatt későbbi visszakeresés céljából. Szerződéses számláknál ez az a kód, ami hashelődik és codeHashként tárolódik. Külső tulajdonú számláknál a codeHash mező egy üres sztring hash-e. -- `storageRoot` – Néha úgy is hivatkoznak rá, mint tárhely hash. Egy Merkle Patricia fa gyökér csomópontjának 256-bites hash-e, mely kódolja a számla tárhelyének tartalmát (egy mapping 256-bites integer értékek között), a fába kódolva, mint egy 256-bites integer kulcsok 256-bites Keccak hash-e és az RLP kódolású 256-bites integer értékek közötti leképzés. Ez a fa a számla tárolótartalmának hash-ét kódolja, és alapértelmezés szerint üres. +- `nonce` – Egy számláló, amely az elküldött tranzakciók számát (külső tulajdonú számla) vagy a létrehozott szerződések számát (szerződéses számla) mutatja. Egy adott nonce segítségével csak egy tranzakció hajtható végre az adott számlára, így nem lehet újrajátszani a tranzakciót, így védve van az ilyen jellegű támadásoktól. +- `balance` – A cím által birtokolt Wei-k száma. A Wei az ETH denominált egysége és 1e+18 Wei van egy ETH-ben. +- `codeHash` – Ez a hash egy számla _kódjára_ hivatkozik az Ethereum Virtuális Gépen (EVM). A szerződéses számlák olyan kódrészleteket tartalmaznak, amelyek különféle műveleteket tudnak végrehajtani. Ez az EVM-kód kerül végrehajtásra, ha a számla egy üzenethívást kap. A többi számlamezővel ellentétben ezt nem lehet megváltoztatni. Az összes ilyen kódrészletet az státuszadatbázis tartalmazza a megfelelő hashek alatt későbbi visszakeresés céljából. Ezt a hash-értéket nevezik codeHash-nek. Külső tulajdonú számláknál a codeHash mező egy üres sztring hash-e. +- `storageRoot` – Néha úgy is hivatkoznak rá, mint tárhely-hash. Egy Merkle Patricia trie gyökér csomópontjához tartozó 256 bites hash, amely a számla tárhelyének tartalmát kódolja (256 bites integer értékek közötti leképzés), a fába kódolva, mint egy 256 bites integer kulcsok 256 bites Keccak hash-e és az RLP kódolású 256 bites integer értékek közötti leképzés. Ez a fa a számla tárolótartalmának hash-ét kódolja, és alapértelmezés szerint üres. ![Egy diagram mely egy számla felépítését mutatja be](./accounts.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból @@ -66,21 +67,24 @@ Példa: `fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f` -A publikus kulcs a privátkulcsból generálódik az elliptikus görbe digitális aláírás algoritmussal (ECDSA). A számlád publikus címét úgy kaphatod meg, ha elveszed a legutolsó 20 bájtot a publikus kulcsból és hozzáadsz egy `0x` előtagot az elejére. +A nyilvános kulcsot a privát kulcsból generálják az [Elliptic Curve Digital Signature Algorithm](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) segítségével. A számla publikus címét úgy lehet megkapni, ha elvesszük a legutolsó 20 bájtot a Keccak-256 hash nyilvános kulcsából és hozzáadunk egy `0x` előtagot az elejére. -Itt egy példa számla létrehozásra a konzolban a GETH `personal_newAccount` függvény használatával +A következő példa megmutatja, hogyan lehet a [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) nevű aláíró eszközzel egy új számlát létrehozni. A Clef egy számlakezelő és -aláíró eszköz, amely az Ethereum klienssel, a [Geth-szel](https://geth.ethereum.org) van egybecsomagolva. A `clef newaccount` parancs egy új kulcspárt hoz létre, és egy titkosított kulcstárolóba menti el. -```go -> personal.newAccount() -Passphrase: -Repeat passphrase: -"0x5e97870f263700f46aa00d967821199b9bc5a120" +``` +> clef newaccount --keystore + +Please enter a password for the new account to be created: +> -> personal.newAccount("h4ck3r") -"0x3d80b31a78c30fc628f20b2c89d7ddbf6e53cedc" +------------ +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 ``` -[GETH dokumentáció](https://geth.ethereum.org/docs) +[Geth-dokumentáció](https://geth.ethereum.org/docs) Lehetséges új publikus kulcsokat származtatni a privát kulcsodból, de nem tudsz publikus kulcsokból privát kulcsot származtatni. Ez azt jelenti, hogy létfontosságú a privát kulcs biztonságban tartása, és ahogy a neve is sugallja: **PRIVÁT**. @@ -94,14 +98,30 @@ Példa: `0x06012c8cf97bead5deae237070f9587f8e7a266d` -Ez a szerződés cím általában akkor jön létre, amikor egy szerződést feltelepítenek az Ethereum Blokkláncra. A cím a készítő címéből és ebből a címről küldött tranzakciók számából (a “nonce”) származik. +Ez a szerződés cím általában akkor jön létre, amikor egy szerződést feltelepítenek az Ethereum blokkláncra. A cím a készítő címéből és az erről a címről küldött tranzakciók számából („nonce”) származik. + +## Validátorkulcsok {#validators-keys} + +Az Ethereumon létezik egy másik típusú kulcs is, amelyet a proof-of-work-alapú konszenzusról a proof-of-stake-alapúra való átálláskor vezettek be. Ezek a BLS kulcsok, amelyek a validátorokat azonosítják. Hatékonyan aggregálhatók, hogy a hálózatnak kevesebb sávszélességre legyen szüksége a konszenzus elérésekor. Ezen kulcsaggregáció nélkül a validátor minimális letétének sokkal nagyobbnak kellene lennie. + +[Bővebben a validátorkulcsokról](/developers/docs/consensus-mechanisms/pos/keys/). -## Egy megjegyzés a tárcákkal kapcsolatban {#a-note-on-wallets} +## Megjegyzés a tárcákkal kapcsolatban {#a-note-on-wallets} -Egy számla nem egy tárca. Egy tárca az a kulcspár, mely hozzá van rendelve a felhasználó által birtokolt számlához, mely lehetővé teszi a felhasználó számára, hogy tranzakciókat indítson vagy kezelje a számlát. +A számla nem egyenlő a tárcával. A számla az a kulcspár, amely a felhasználó Ethereum számlájához tartozik. A tárca egy olyan interfész vagy alkalmazás, amely lehetővé teszi az Ethereum számlával való interakciót. + +## Egy vizuális bemutató {#a-visual-demo} + +Nézze meg, ahogy Austin elmagyarázza a hash funkciót és a kulcspárokat. + + + + ## További olvasnivaló {#further-reading} +- [Az Ethereum-számlák megértése](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan + _Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ ## Kapcsolódó témák {#related-topics} diff --git a/public/content/translations/hu/developers/docs/apis/backend/index.md b/public/content/translations/hu/developers/docs/apis/backend/index.md index 9c48bf0ef74..f7c5a9577d2 100644 --- a/public/content/translations/hu/developers/docs/apis/backend/index.md +++ b/public/content/translations/hu/developers/docs/apis/backend/index.md @@ -6,13 +6,13 @@ lang: hu Ahhoz, hogy egy szoftver alkalmazás interakcióba lépjen az Ethereum blokklánccal (vagyis képes legyen blokklánc adatok olvasására és/vagy tranzakció küldésre a hálózatra), rá kell csatlakoznia egy Ethereum csomópontra. -Erre a célra minden Ethereum kliens implementálja a JSON-RPC specifikációt, így egy egységes végpontkészlet áll rendelkezésre, amelyekre az alkalmazások támaszkodhatnak. +Erre a célra minden Ethereum-kliens implementálja a [JSON-RPC](/developers/docs/apis/json-rpc/) specifikációt, így egységes [módszerek](/developers/docs/apis/json-rpc/#json-rpc-methods) állnak rendelkezésre, amelyekre az alkalmazások támaszkodhatnak. Ha egy bizonyos programnyelvet szeretnél használni, hogy csatlakozz egy Ethereum csomóponttal, akkor fejleszd ki a saját megoldásodat, de ugyanakkor számos kényelmes könyvtár létezik az ökoszisztémán belül, melyek megkönnyítik ezt. Ezekkel a könyvtárakkal a fejlesztők intuitív, egysoros metódusokat írhatnak, hogy kezdeményezzenek egy JSON RPC kérést (a háttérben), mely interakcióba lép az Ethereummal. ## Előfeltételek {#prerequisites} -Lehet, hogy érdemes megérteni az [Ethereum stacket](/developers/docs/ethereum-stack/) és az[Ethereum klienseket](/docs/nodes-and-clients/). +Érdemes lehet előbb alaposan megismerni az [Ethereum stacket](/developers/docs/ethereum-stack/) és az [Ethereum-klienseket](/developers/docs/nodes-and-clients/). ## Miért használj egy könyvtárat? {#why-use-a-library} @@ -22,16 +22,22 @@ Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóp **Alchemy -** **_Ethereum Fejlesztési Platform._** -- [alchemyapi.io](https://alchemyapi.io) +- [alchemy.com](https://www.alchemy.com/) - [Dokumentáció](https://docs.alchemyapi.io/) - [GitHub](https://github.com/alchemyplatform) -- [Discord](https://discord.gg/kwqVnrA) +- [Discord](https://discord.com/invite/A39JVCM) -**BlockCypher -** **_Ethereum Web API-ok_** +**BlockCypher -** **_Ethereum Web API-k._** - [blockcypher.com](https://www.blockcypher.com/) - [Dokumentáció](https://www.blockcypher.com/dev/ethereum/) +**Blast by Bware Labs -** **_Decentralizált API-k az Ethereum főhálózatra és teszthálózatokra._** + +- [blastapi.io](https://blastapi.io/) +- [Dokumentáció](https://docs.blastapi.io) +- [Discord](https://discord.com/invite/VPkWESgtvV) + **Infura -** **_Az Ethereum API, mint szolgáltatás._** - [infura.io](https://infura.io) @@ -42,37 +48,57 @@ Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóp - [cloudflare-eth.com](https://cloudflare-eth.com) -**Nodesmith -** **_JSON-RPC API hozzáférés az Ethereum mainnet-hez és testnet-ekhez._** +**Coinbase Cloud Node -** **_Blokklánc-infrastruktúra API._** + +- [Coinbase Cloud Node](https://www.coinbase.com/cloud/products/node) +- [Dokumentáció](https://docs.cloud.coinbase.com/node/reference/welcome-to-node) + +**DataHub by Figment -** **_Web3 API szolgáltatások az Ethereum főhálózattal és teszthálózatokkal._** + +- [DataHub](https://www.figment.io/datahub) +- [Dokumentáció](https://docs.figment.io/introduction/what-is-datahub) + +**NFTPort -** **_Ethereum-adatok és Mint API-k._** + +- [nftport.xyz](https://www.nftport.xyz/) +- [Dokumentáció](https://docs.nftport.xyz/) +- [GitHub](https://github.com/nftport/) +- [Discord](https://discord.com/invite/K8nNrEgqhE) + +**Nodesmith -** **_JSON-RPC API-hozzáférés az Ethereum főhálózathoz és teszthálózatokhoz._** - [nodesmith.io](https://nodesmith.io/network/ethereum/) - [Dokumentáció](https://nodesmith.io/docs/#/ethereum/apiRef) -**Ethercluster -** **_Futtasd a saját Ethereum API szolgáltatásodat, mely támogatja az ETH-et és ETC-t is._** +**Ethercluster -** **_Futtasson saját, ETH-et és ETC-t is támogató Ethereum API szolgáltatásokat._** - [ethercluster.com](https://www.ethercluster.com/) -**Chainstack -** **_Elosztott és dedikált Ethereum csomópontok, mint szolgáltatás._** +**Chainstack -** **_Osztott és dedikált Ethereum-csomópontok mint szolgáltatás._** - [chainstack.com](https://chainstack.com) - [Dokumentáció](https://docs.chainstack.com) +- [Ethereum API reference](https://docs.chainstack.com/api/ethereum/ethereum-api-reference) -**QuikNode -** **_Blokklánc fejlesztési platform._** +**QuickNode -** **_Blokklánc-infrastruktúra mint szolgáltatás._** -- [quiknode.io](https://quiknode.io) +- [quicknode.com](https://quicknode.com) +- [Dokumentáció](https://www.quicknode.com/docs) +- [Discord](https://discord.gg/NaR7TtpvJq) -**Python Tooling -** **_Különféle Ethereum library-k Python-nal való interakciókhoz_** +**Python Tooling -** **_Különféle Ethereum-könyvtárak Python-nal való interakciókhoz_** - [py.ethereum.org](http://python.ethereum.org/) - [web3.py GitHub](https://github.com/ethereum/web3.py) - [web3.py Chat](https://gitter.im/ethereum/web3.py) -**web3j -** **_Egy Java/Android/Kotlin/Scala integráció library Ethereum-ra._** +**web3j -** **_Java/Android/Kotlin/Scala integrációs könyvtár Ethereumra._** - [GitHub](https://github.com/web3j/web3j) - [Dokumentáció](https://docs.web3j.io/) - [Gitter](https://gitter.im/web3j/web3j) -**Rivet -** **_Ethereum és Ethereum Classic API-ok mint szolgáltatás, melyet nyílt forráskódú szoftver működtet._** +**Rivet -** **_Ethereum és Ethereum Classic API-k mint szolgáltatás, amelyeket nyílt forráskódú szoftver működtet._** - [rivet.cloud](https://rivet.cloud) - [Dokumentáció](https://rivet.cloud/docs/) @@ -84,16 +110,73 @@ Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóp - [Dokumentáció](http://docs.nethereum.com/en/latest/) - [Discord](https://discord.com/invite/jQPrR58FxX) +**Tatum -** **_A végső blokklánc-fejlesztési platform._** + +- [Tatum](https://tatum.io/) +- [GitHub](https://github.com/tatumio/) +- [Dokumentáció](https://docs.tatum.io/) +- [Discord](https://discord.gg/EDmW3kjTC9) + +**Watchdata -** **_Egyszerű és megbízható API-hozzáférés az Ethereum-blokklánchoz._** + +- [Watchdata](https://watchdata.io/) +- [Dokumentáció](https://docs.watchdata.io/) +- [Discord](https://discord.com/invite/TZRJbZ6bdn) + +**Zmok -** **_Sebességorientált Ethereum-csomópontok mint JSON-RPC/WebSockets API._** + +- [zmok.io](https://zmok.io/) +- [GitHub](https://github.com/zmok-io) +- [Dokumentáció](https://docs.zmok.io/) +- [Discord](https://discord.gg/fAHeh3ka6s) + +**NOWNodes – _Teljes csomópontok és blokkfelfedezők._** + +- [NOWNodes.io](https://nownodes.io/) +- [Dokumentáció](https://documenter.getpostman.com/view/13630829/TVmFkLwy#intro) + +**Moralis -** **_Vállalati szintű EVM API-szolgáltató._** + +- [moralis.io](http://moralis.io) +- [Dokumentáció](https://docs.moralis.io/) +- [GitHub](https://github.com/MoralisWeb3) +- [Discord](https://discord.com/invite/KYswaxwEtg) +- [Fórum](https://forum.moralis.io/) + +**Chainbase -** **_Teljes web3-adatinfrastruktúra az Ethereumra._** + +- [chainbase.com](https://chainbase.com/) +- [Dokumentáció](https://docs.chainbase.com/) +- [Discord](https://discord.gg/Wx6qpqz4AF) + +**GetBlock-** **_Blokklánc mint szolgáltatás a Web3 fejlesztéshez_** + +- [GetBlock.io](https://getblock.io/) +- [Dokumentáció](https://getblock.io/docs/) + +**BlockPi -** **_Hatékonyabb és gyorsabb RPC-szolgáltatások_** + +- [blockpi.io](https://blockpi.io/) +- [Dokumentáció](https://docs.blockpi.io/) +- [GitHub](https://github.com/BlockPILabs) +- [Discord](https://discord.com/invite/xTvGVrGVZv) + +**Tokenview -** **_Az általános multikripto blokklánc API-k platformja._** + +- [services.tokenview.io](https://services.tokenview.io/) +- [Dokumentáció](https://services.tokenview.io/docs?type=api) +- [GitHub](https://github.com/Tokenview) + ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} -- [Csomópontok és kliensek](/developers/docs/nodes-and-clients/) +- [ Csomópontok és kliensek](/developers/docs/nodes-and-clients/) - [Fejlesztői keretrendszerek](/developers/docs/frameworks/) ## Kapcsolódó útmutatók {#related-tutorials} -- [Állítsd be a Web3js, hogy JavaScriptben használd az Ethereum blokkláncot](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Intrukciók arról, hogyan állítsd be a web3.js-t a projektedben._ -- [Okosszerződés hívása JavaScriptből](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– A DAI token használata, hogy lásd hogyan lehet szerződés függvényeket meghívni JavaScript használatával._ +- [Web3js beállítása az Ethereum-blokklánc használatához JavaScriptben](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Útmutató a web3.js projektben való beállításához.._ +- [Okosszerződés hívása JavaScriptből](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– A DAI token használatával tekintse meg, hogyan hívhat be szerződéseket a JavaScript segítségével._ diff --git a/public/content/translations/hu/developers/docs/apis/javascript/index.md b/public/content/translations/hu/developers/docs/apis/javascript/index.md index cddb5f1737f..804bcb31653 100644 --- a/public/content/translations/hu/developers/docs/apis/javascript/index.md +++ b/public/content/translations/hu/developers/docs/apis/javascript/index.md @@ -6,38 +6,40 @@ lang: hu Ahhoz, hogy egy web alkalmazás interakcióba lépjen az Ethereum blokklánccal (vagyis képes legyen blokklánc adatok olvasására és/vagy tranzakció küldésre a hálózatra), rá kell csatlakoznia egy Ethereum csomópontra. -Erre a célra minden Ethereum kliens implementálja a JSON-RPC specifikációt, így egy egységes végpontkészlet áll rendelkezésre, amelyekre az alkalmazások támaszkodhatnak. +Erre a célra minden Ethereum-kliens implementálja a [JSON-RPC](/developers/docs/apis/json-rpc/) specifikációt, így egységes [módszerek](/developers/docs/apis/json-rpc/#json-rpc-methods) állnak rendelkezésre, amelyekre az alkalmazások támaszkodhatnak. Ha JavaScript programnyelvet szeretnél használni, hogy csatlakozz egy Ethereum csomóponttal, lehetőséged van vanilla JavaScriptet használni, de ugyanakkor számos kényelmes könyvtár létezik az ökoszisztémán belül, melyek megkönnyítik ezt. Ezekkel a könyvtárakkal a fejlesztők intuitív, egysoros metódusokat írhatnak, hogy kezdeményezzenek egy JSON RPC kérést (a háttérben), mely interakcióba lép az Ethereummal. +Az [egyesítés (Merge)](/roadmap/merge/) után, az Ethereum szoftver két kapcsolódó darabja – egy végrehajtó kliens és egy konszenzus kliens – kell a csomópont futtatásához. Gondoskodjon arról, hogy a csomópont mindkét kliens benne legyen. Ha a csomópont nem a helyi gépen van (pl. egy AWS-en fut), akkor az IP-címet frissíteni kell az útmutatóban. Bővebb információért érdemes felkeresni a [csomópont futtatása](/developers/docs/nodes-and-clients/run-a-node/) oldalt. + ## Előfeltételek {#prerequisites} -A JavaScript megértése mellett lehet, hogy érdemes megérteni az [Ethereum stacket](/developers/docs/ethereum-stack/) és az [Ethereum klienseket](/developers/docs/nodes-and-clients/). +A JavaScript megértése mellett lehet érdemes lehet előbb alaposan megismerni az [Ethereum stacket](/developers/docs/ethereum-stack/) és az [Ethereum-klienseket](/developers/docs/nodes-and-clients/). ## Miért használj könyvtárat? {#why-use-a-library} -Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóponthoz történő közvetlen csatlakozással jár. Ezenkívül használati függvényeket is szolgáltatnak (pl.: ETH konvertálása Gwei-be), így fejlesztőként kevesebb időt kell az Ethereum kliensek bonyodalmaival foglalkoznod és több időd jut egyedi funkcionalitást kialakítani az alkalmazásodnak. +Ezek a könyvtárak elveszik a komplexitás nagy részét, mely Ethereum csomóponthoz történő közvetlen csatlakozással jár. Ezen kívül használati függvényeket is szolgáltatnak (pl.: ETH konvertálása Gwei-be), így fejlesztőként kevesebb időt kell az Ethereum kliensek bonyodalmaival foglalkoznod és több időd jut egyedi funkcionalitást kialakítani az alkalmazásodnak. ## Könyvtár tulajdonságok {#library-features} ### Csatlakozás Ethereum csomóponthoz {#connect-to-ethereum-nodes} -Szolgáltatók használatakor ezen könyvtárak használatával rácsatlakozhatsz az Ethereumra és olvashatod az adatait, legyen az JSON-RPC-n, INFURA-n, Etherscan-en, Alchemy-n vagy MetaMaskon keresztül. +Szolgáltatók használatakor ezen könyvtárak használatával rácsatlakozhat az Ethereumra és kiolvashatja az adatait, függetlenül attól, hogy JSON-RPC, INFURA, Etherscan, Alchemy vagy MetaMask rendszeren keresztül történik. -**Ethers példa** +**Példa az Ethers-re** ```js -// Egy Web3Provider bewrappol egy standard Web3 szolgáltatót, ez az -// amit a MetaMask beinjektál minden oldalra úgy mint, window.ethereum +// A Web3Provider wraps a standard Web3 provider, which is +// what MetaMask injects as window.ethereum into each page const provider = new ethers.providers.Web3Provider(window.ethereum) -// A MetaMask plugin továbbá lehetővé teszi tranzakciók aláírását -// ether küldésekor és hogy kifizessük az állapotváltást a blokkláncon. +// The MetaMask plugin also allows signing transactions to +// send ether and pay to change state within the blockchain. // Ehhez kell egy számla aláíró (account signer)... const signer = provider.getSigner() ``` -**Web3js példa** +**Példa a Web3js-re** ```js var web3 = new Web3("http://localhost:8545") @@ -60,7 +62,7 @@ var web3 = new Web3( // linux rendszerben az elérési út: "/users/myuser/.ethereum/geth.ipc" ``` -Amint be van állítva, lekérdezéseket indíthatsz a blokkláncon a következőkre: +Amint be van állítva, lekérdezéseket indíthat a blokkláncon a következőkre: - blokkszámok - gas becslések @@ -70,9 +72,9 @@ Amint be van állítva, lekérdezéseket indíthatsz a blokkláncon a következ ### Tárca funkcionalitás {#wallet-functionality} -Ezek a könyvtárak funkcionalitást adnak, hogy tárcákat hozz létre, kulcsokat kezelj és tranzakciókat írj alá. +Ezek a könyvtárak funkcionalitást adnak, hogy tárcákat hozzon létre, kulcsokat kezeljen és tranzakciókat írjon alá. -Itt egy Ethers példa +Íme egy példa az Ethers-re ```js //Tárca instance létrehozása emlékeztető erősítőből... @@ -140,9 +142,9 @@ wallet.getTransactionCount() wallet.sendTransaction(tx) ``` -[Olvasd el a teljes dokumentációt](https://docs.ethers.io/v5/api/signer/#Wallet) +[Olvassa el a teljes dokumentációt](https://docs.ethers.io/v5/api/signer/#Wallet) -Ha be van állítva, akkor már tudsz: +Amint be van állítva, a következőket teheti: - számlákat létrehozni - tranzakciókat küldeni @@ -151,9 +153,9 @@ Ha be van állítva, akkor már tudsz: ### Interakció okosszerződés függvényekkel {#interact-with-smart-contract-functions} -A JavaScript kliens könyvtárak lehetővé teszik az alkalmazásod számára, hogy okosszerződés függvényeket hívjanak meg egy befordított szerződés Application Binary Interface-ének (ABI) olvasásával. +A Javascript-kliens könyvtárai lehetővé teszik az alkalmazás számára, hogy okosszerződés-függvényeket hívjanak meg egy befordított szerződés Application Binary Interface-ének (ABI) olvasásával. -Az ABI lényegében elmagyarázza a szerződés függvényeit egy JSON formátumban és lehetővé teszi, hogy normáls JavaScript objectként használd. +Az ABI lényegében elmagyarázza a szerződés függvényeit egy JSON formátumban és lehetővé teszi, hogy normális Javascript-objektumként használja. A következő Solidity szerződés tehát: @@ -215,7 +217,7 @@ Ez azt jelenti, hogy: A használati függvények praktikus könnyítéseke adnak, hogy egyszerűbb legyen az Ethereumon való építés. -Az ETH értékei alapvetően Wei-ben vannak megadva. 1 ETH = 1,000,000,000,000,000,000 WEI – ez azt jelenti, hogy sok számmal kell foglalkoznod! `web3.utils.toWei` átkonvertálja az ethert Wei-re neked. +Az ETH értékei alapvetően Wei-ben vannak megadva. 1 ETH = 1,000,000,000,000,000,000 WEI – ez azt jelenti, hogy sok számmal kell foglalkoznia! `web3.utils.toWei` átkonvertálja az ethert Wei-re. Az ethers-ben így néz ki: @@ -240,12 +242,12 @@ ethers.utils.formatEther(balance) - [Dokumentáció](https://docs.web3js.org/) - [GitHub](https://github.com/ethereum/web3.js/) -**Ethers.js -** **_Teljes Ethereum tárca implementáció és segédprogramok JavaScript-ben és TypeScript-ben._** +**Ethers.js -** **_Teljes Ethereum-tárcaimplementáció és segédprogramok JavaScript-ben és TypeScript-ben._** -- [Dokumentáció](https://docs.ethers.io/ethers.js/html/) +- [Dokumentáció](https://docs.ethers.io/) - [GitHub](https://github.com/ethers-io/ethers.js/) -**The Graph -** **_Egy Ethereum és IPFS adat indexelés és lekérdezés protokoll a GraphQL használatával.._** +**The Graph -** **_Egy Ethereum- és IPFS-adatindexelési és -lekérdezési protokoll a GraphQL használatával._** - [The Graph](https://thegraph.com/) - [Graph Explorer](https://thegraph.com/explorer/) @@ -253,31 +255,41 @@ ethers.utils.formatEther(balance) - [GitHub](https://github.com/graphprotocol/) - [Discord](https://thegraph.com/discord) -**light.js -** **_Egy magas szintű, reaktív JS könyvtár light client-ekre optimalizálva._** +**light.js -** **_Egy magas szintű, reaktív JS könyvtár könnyű kliensekre optimalizálva._** - [GitHub](https://github.com/openethereum/js-libs/tree/master/packages/light.js) -**Web3-wrapper -** **_Typescript Web3.js alternatíva._** +**Web3-wrapper -** **_A Typescript Web3.js alternatíva._** - [Dokumentáció](https://0x.org/docs/web3-wrapper#introduction) - [GitHub](https://github.com/0xProject/0x-monorepo/tree/development/packages/web3-wrapper) -**Alchemyweb3 -** **_Egy Web3.js wrapper automatikus újrapróbálkozásokkal és fejlesztett API-okkal._** +**Alchemyweb3 -** **_Egy Web3.js wrapper automatikus újrapróbálkozásokkal és továbbfejlesztett API-kkal._** - [Dokumentáció](https://docs.alchemy.com/reference/api-overview) - [GitHub](https://github.com/alchemyplatform/alchemy-web3) +**Alchemy NFT API -** **_API az NFT adat megszerzésére, beleértve a tulajdonjogot, metaadatok attribútumait stb._** + +- [Dokumentáció](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api) +- [GitHub](https://github.com/alchemyplatform/alchemy-web3) + +**viem -** **_TypeScript-interfész az Ethereumra._** + +- [Dokumentáció](https://viem.sh) +- [GitHub](https://github.com/wagmi-dev/viem) + ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} -- [Csomópontok és kliensek](/developers/docs/nodes-and-clients/) +- [ Csomópontok és kliensek](/developers/docs/nodes-and-clients/) - [Fejlesztői keretrendszerek](/developers/docs/frameworks/) ## Kapcsolódó útmutatók {#related-tutorials} -- [Állítsd be a Web3js, hogy JavaScriptben használd az Ethereum blokkláncot](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Instrukciók arról, hogyan állítsd be a web3.js-t a projektedben._ -- [Okosszerződés hívása JavaScriptből](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– A DAI token használata, hogy lásd hogyan lehet szerződés függvényeket meghívni JavaScript használatával._ -- [Tranzakció küldés web3-mal és Alchemy-vel](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Egy step-by-step útmutató arról, hogyan lehet tranzakciókat küldeni a backendből._ +- [Web3js beállítása az Ethereum-blokklánc használatához JavaScriptben](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– Útmutató a web3.js projektben való beállításához.._ +- [Okosszerződés hívása JavaScriptből](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– A DAI token használatával tekintse meg, hogyan hívhat be szerződéseket a JavaScript segítségével._ +- [Tranzakció küldése web3-mal és Alchemy-vel](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– Egy részletes útmutató arról, hogyan lehet tranzakciókat küldeni a backendből._ diff --git a/public/content/translations/hu/developers/docs/apis/json-rpc/index.md b/public/content/translations/hu/developers/docs/apis/json-rpc/index.md new file mode 100644 index 00000000000..23402c798ab --- /dev/null +++ b/public/content/translations/hu/developers/docs/apis/json-rpc/index.md @@ -0,0 +1,1767 @@ +--- +title: JSON-RPC API +description: Egy státuszmentes, könnyű remote procedure call (RPC) protokoll az Ethereum-kliensekhez. +lang: hu +--- + +Ahhoz, hogy egy szoftveralkalmazás interakcióba lépjen az Ethereum blokklánccal –a blokkláncadatokat olvasva vagy tranzakciókat küldve a hálózatra –, rá kell csatlakoznia egy Ethereum-csomópontra. + +Ebből a célból minden [Ethereum-kliens](/developers/docs/nodes-and-clients/#execution-clients) implementálja a [JSON-RPC specifikációt](https://github.com/ethereum/execution-apis), így az alkalmazások egységesen egyféle metóduscsomagra támaszkodhatnak, függetlenül az adott csomópont vagy kliens fajtájától. + +A [JSON-RPC](https://www.jsonrpc.org/specification) egy státuszmentes, könnyű remote procedure call (RPC) protokoll. Számos adatstruktúrát, valamint ezek feldolgozásának szabályait is meghatározza. Ez a megoldás nem függ az átadási módoktól, mivel a koncepciókat használni lehet ugyanabban a folyamatban, socketeknél, HTTP-vel és számos más üzenetküldő környezetben. Az adatformátum JSON (RFC 4627). + +## Kliensimplementációk {#client-implementations} + +Az Ethereum-kliensek mindegyike használhat különböző programozási nyelveket, amikor a JSON-RPC specifikációt implementálja. Tekintse meg az egyéni [kliensdokumentációt](/developers/docs/nodes-and-clients/#execution-clients) további részletekért a specifikus programozási nyelvekről. Érdemes megnézni a kliensdokumentációt a legutóbbi API-támogatási információ miatt is. + +## Kényelmi könyvtárak {#convenience-libraries} + +Választhatja, hogy az Ethereum-kliensekkel közvetlenül kapcsolódik a JSON-RPC API révén, de az alkalmazásfejlesztők rendelkezésére állnak egyszerűbb opciók is. Számos [JavaScript](/developers/docs/apis/javascript/#available-libraries) és [backend API](/developers/docs/apis/backend/#available-libraries) könyvtár létezik, hogy a JSON-RPC API tetejére egy wrappert (burkoló réteget) adjon. Ezekkel a könyvtárakkal a fejlesztők intuitív, egysoros metódusokat írhatnak, hogy JSON-RPC-kérést kezdeményezzenek (a háttérben), amely interakcióba lép az Ethereummal. + +## Konszenzusos kliens API-k {#consensus-clients} + +Ez az írás főleg a JSON-RPC API-val foglalkozik, melyet az Ethereum végrehajtási kliensei használnak. Ugyanakkor a konszenzusos klienseknek is van egy RPC API-ja, amellyel a felhasználók lekérhetnek információkat a csomópontról, Beacon-blokkokról, Beacon-státuszokról és más konszenzussal kapcsolatos adatokról közvetlenül a csomópontról. Ez az API a [Beacon API honlapon](https://ethereum.github.io/beacon-APIs/#/) van dokumentálva. + +Egy belső API-t használnak a kliensek közötti kommunikációra a csomóponton belül, így a konszenzusos kliens és a végrehajtási kliens képes adatot cserélni. Ezt nevezik Motor API-nak, amelynek specifikációja a [GitHubon](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) érhető el. + +## Végrehajtási kliens specifikációi {#spec} + +[Tekintse meg a teljes JSON-RPC API specifikációt a GitHubon](https://github.com/ethereum/execution-apis). + +## Egyezmények {#conventions} + +### Hexadecimális értékű kódolás {#hex-encoding} + +Két fontos adattípus megy át a JSON-ön: formázatlan bájttömbök és mennyiségek. Mindkettő hexadecimális kódolásban van elküldve, de más a formázási követelmény. + +#### Mennyiségek {#quantities-encoding} + +A mennyiségek (egész számok, számok) kódolásánál: hexadecimálisban, „0x” előtaggal, a legtömörebb kifejeződésben kell kódolni (kivéve a nullát, mert az „0x0” lesz). + +Néhány példa: + +- 0x41 (65 decimálisban) +- 0x400 (1024 decimálisban) +- HELYTELEN: 0x (legalább egy számjegy még szükséges, a nulla írása „0x0”) +- HELYTELEN: 0x0400 (nem kezdődhet nullával a szám) +- HELYTELEN: ff (a 0x előtagot ki kell tenni) + +### Formázatlan adat {#unformatted-data-encoding} + +Amikor formázatlan adatot (bájtsorok, számlacímek, hashek, bájtkódtömbök) kell kódolni: hexadecimálisban, „0x” előtaggal, két hex számjegy bájtonként. + +Néhány példa: + +- 0x41 (1-es méret, „A”) +- 0x004200 (3-as méret, "\0B\0") +- 0x (size 0, "") +- HELYTELEN: 0xf0f0f (páros számú kell legyen) +- HELYTELEN: 004200 (a 0x előtagot ki kell tenni) + +### Az alapértelmezett blokkparaméter {#default-block} + +A következő metódusok egy extra alapértelmezett blokkparaméterrel rendelkeznek: + +- [eth_getBalance](#eth_getbalance) +- [eth_getCode](#eth_getcode) +- [eth_getTransactionCount](#eth_gettransactioncount) +- [eth_getStorageAt](#eth_getstorageat) +- [eth_call](#eth_call) + +Amikor az Ethereum státuszát érintő kérések érkeznek, akkor a legutolsó alapértelmezett blokkparaméter határozza meg a blokk méretét. + +A defaultBlock paraméter a következők lehetnek: + +- `HEX String` – egy egész szám mint blokkszám +- `String "earliest"` – a legkorábbi/genezis blokk +- `String "latest"` – a legutóbb kibányászott blokk +- `String "safe"` – a blokk legutóbbi biztonságos feje +- `String "finalized"` – a legutóbbi véglegesedett blokk +- `String "pending"` – a függőben lévő státusz/tranzakciók esetében + +## Példák + +Ebben a leírásban példákat mutatunk be, hogyan lehet használni az egyéni JSON_RPC API végpontokat a parancssoreszközzel, ami a [curl](https://curl.se). Ezek az egyéni végpontpéldák a [Curl példák](#curl-examples) szekciókban találhatók alább. Ezek után bemutatunk egy [példát az elejétől a végéig](#usage-example) egy okosszerződés átfordítására és telepítésére egy Geth csomópont, a JSON_RPC API és a curl használatával. + +## Példák a curlre {#curl-examples} + +Alább láthatók azok a példák, amikor a JSON_RPC API-t használjuk egy [curl](https://curl.se) kérést létrehozva egy Ethereum-csomópontnak. Minden példa tartalmazza az adott végpont specifikációit, paramétereit, visszatérési típusát és egy működő példát arról, hogyan kell használni. + +A curl-kérések hibát adhatnak vissza a tartalom típusa miatt. Ennek az az oka, hogy a `--data` opció beállítja a tartalomtípust `application/x-www-form-urlencoded` értékre. Ha az Ön által használt csomópontnak ez nem tetszik, akkor manuálisa állítsa át a fejlécet, hogy a `-H "Content-Type: application/json"` a hívás elején legyen. A példák nem tartalmazzák az URL/IP és port kombinációját, amit a curl utolsó változójaként kell megadni (például `127.0.0.1:8545`). Egy komplett curl-kérés, amely ezeket a plusz adatokat is tartalmazza, így néz ki: + +```shell +curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545 +``` + +## Pletyka, státusz, előzményadatok {#gossip-state-history} + +Néhány központi JSON-RPC metódushoz szükség van az Ethereum hálózati adataira, amelyek általában háromfélék lehetnek: _Pletyka, státusz és előzményadatok_. Az ebben a részben található hivatkozások segítségével az adott metódusra tud lépni, de a tartalomjegyzéket is használhatja a metódusok teljes listájának megtekintéséhez. + +### Pletyka metódusok {#gossip-methods} + +> Ezek a metódusok a lánc fejét követik nyomon. Így kerülnek be tranzakciók a hálózatra, találják meg az útjukat a blokkokba, és az, a kliensek így szereznek tudomást az új blokkokról. + +- [eth_blockNumber](#eth_blocknumber) +- [eth_sendRawTransaction](#eth_sendrawtransaction) + +### Státusz metódusok {#state_methods} + +> Olyan metódusok, melyek az összes tárolt adat jelenlegi státuszát riportálják. A „státusz” olyan, akár egy nagy, megosztott RAM rész, ami számlaegyenlegeket, szerződésadatokat és gázbecsléseket tartalmaz. + +- [eth_getBalance](#eth_getbalance) +- [eth_getStorageAt](#eth_getstorageat) +- [eth_getTransactionCount](#eth_gettransactioncount) +- [eth_getCode](#eth_getcode) +- [eth_call](#eth_call) +- [eth_estimateGas](#eth_estimategas) + +### Előzményadatok metódusok {#history_methods} + +> Minden egyes blokkból képes előzményadatokat lekérni egészen a genezisig. Olyan mint egy hatalmas, egyre bővülő fájl, amely tartalmazza az összes blokkfejlécet, blokkadatot, a szülőblokk testvérblokkjait (ommer/uncle) és a tranzakció-visszaigazolásokat. + +- [eth_getBlockTransactionCountByHash](#eth_getblocktransactioncountbyhash) +- [eth_getBlockTransactionCountByNumber](#eth_getblocktransactioncountbynumber) +- [eth_getUncleCountByBlockHash](#eth_getunclecountbyblockhash) +- [eth_getUncleCountByBlockNumber](#eth_getunclecountbyblocknumber) +- [eth_getBlockByHash](#eth_getblockbyhash) +- [eth_getBlockByNumber](#eth_getblockbynumber) +- [eth_getTransactionByHash](#eth_gettransactionbyhash) +- [eth_getTransactionByBlockHashAndIndex](#eth_gettransactionbyblockhashandindex) +- [eth_getTransactionByBlockNumberAndIndex](#eth_gettransactionbyblocknumberandindex) +- [eth_getTransactionReceipt](#eth_gettransactionreceipt) +- [eth_getUncleByBlockHashAndIndex](#eth_getunclebyblockhashandindex) +- [eth_getUncleByBlockNumberAndIndex](#eth_getunclebyblocknumberandindex) + +## JSON-RPC API metódusok {#json-rpc-methods} + +### web3_clientVersion {#web3_clientversion} + +Visszaadja a jelenlegi kliensverziót. + +**Parameters** + +Egyik sem + +**Returns** + +`String` – A jelenlegi kliensverzió + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc":"2.0", + "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1" +} +``` + +### web3_sha3 {#web3_sha3} + +Visszaadja az adott adat keccak-256 szerinti értékét (_nem_ a szabványosított SHA3-256 szerintit). + +**Parameters** + +1. `DATA` – Az adatok átkonvertálva SHA3 hash formátumba + +```js +params: ["0x68656c6c6f20776f726c64"] +``` + +**Returns** + +`DATA` – Az adott sztring SHA3-eredménye. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}' +// Result +{ + "id":64, + "jsonrpc": "2.0", + "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad" +} +``` + +### net_version {#net_version} + +Visszaadja a jelenlegi hálózati azonosítót. + +**Parameters** + +Egyik sem + +**Returns** + +`String` – Jelenlegi hálózati azonosító. + +A jelenlegi hálózati azonosítók teljes listája a [chainlist.org](https://chainlist.org) oldalon érhető el. Néhány jellemző példa: + +- `1`: Ethereum főhálózata +- `5`: Goerli teszthálózat +- `11155111`: Sepolia teszthálózat + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc": "2.0", + "result": "3" +} +``` + +### net_listening {#net_listening} + +A `true` értéket adja vissza, ha a kliens aktívan hallgatja a hálózati kapcsolatokat. + +**Parameters** + +Egyik sem + +**Returns** + +`Boolean` – `true`, amikor hallgatja, máskülönben `false`. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc":"2.0", + "result":true +} +``` + +### net_peerCount {#net_peercount} + +Visszaadja a társak számát, amelyek jelenleg a klienshez kapcsolódnak. + +**Parameters** + +Egyik sem + +**Returns** + +`QUANTITY` – a kapcsolódó társak száma egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' +// Result +{ + "id":74, + "jsonrpc": "2.0", + "result": "0x2" // 2 +} +``` + +### eth_protocolVersion {#eth_protocolversion} + +A jelenlegi Ethereum-protokollverziót adja vissza. Vegye figyelembe, hogy ez a metódus [a Geth-ben nem érhető el](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924). + +**Parameters** + +Egyik sem + +**Returns** + +`String` – Az Ethereum jelenlegi protokollverziója + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc": "2.0", + "result": "54" +} +``` + +### eth_syncing {#eth_syncing} + +Egy objektumot ad vissza a szinkronizálási státuszról szóló adattal vagy `false`. + +**Parameters** + +Egyik sem + +**Returns** + +A pontos visszakapott adat a kliensimplementációk szerint változik. Minden kliens `false` értéket küld, amikor a csomópont nem szinkronizál, és mindegyik elküldi a következő mezőket. + +`Object|Boolean`, egy objektum a szinkronizálási státuszról szóló adattal vagy `false`, amikor nem szinkronizál: + +- `startingBlock`: `QUANTITY` – Az a blokk, amelynél az importálása kezdődött (csak akkor lesz visszaállítva, miután a szinkronizálás elérte a fejet) +- `currentBlock`: `QUANTITY` – A jelenlegi blokk, azonos az eth_blockNumber mezővel +- `highestBlock`: `QUANTITY` – A becsült legnagyobb számú blokk + +Ugyanakkor az egyéni kliensek további adatokat is adhatnak. A Geth például ezt küldi vissza: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "currentBlock": "0x3cf522", + "healedBytecodeBytes": "0x0", + "healedBytecodes": "0x0", + "healedTrienodes": "0x0", + "healingBytecode": "0x0", + "healingTrienodes": "0x0", + "highestBlock": "0x3e0e41", + "startingBlock": "0x3cbed5", + "syncedAccountBytes": "0x0", + "syncedAccounts": "0x0", + "syncedBytecodeBytes": "0x0", + "syncedBytecodes": "0x0", + "syncedStorage": "0x0", + "syncedStorageBytes": "0x0" + } +} +``` + +Amíg a Besu ezt küldi vissza: + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` + +Tekintse meg az adott kliens dokumentációját a további adatokért. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": { + startingBlock: '0x384', + currentBlock: '0x386', + highestBlock: '0x454' + } +} +// Or when not syncing +{ + "id":1, + "jsonrpc": "2.0", + "result": false +} +``` + +### eth_coinbase {#eth_coinbase} + +A kliens coinbase-címét adja vissza. + +**Parameters** + +Egyik sem + +**Returns** + +`DATA`, 20 bájt – a jelenlegi coinbase címe. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}' +// Result +{ + "id":64, + "jsonrpc": "2.0", + "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1" +} +``` + +### eth_chainId {#eth_chainId} + +Visszaadja a láncazonosítót, amellyel az újrajátszástól védett tranzakciókat írják alá. + +**Parameters** + +Egyik sem + +**Returns** + +`chainId`, hexadecimális érték mint sztring, amely a jelenlegi láncazonosítót mutatja egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc": "2.0", + "result": "0x1" +} +``` + +### eth_mining {#eth_mining} + +A visszaadott érték `true`, ha a kliens aktívan bányászik új blokkokat. Ez csak proof-of-work hálózatok esetén küld vissza `true` értéket, és talán a [egyesítés (Merge)](/roadmap/merge/) óta nincs is benne minden kliensben. + +**Parameters** + +Egyik sem + +**Returns** + +`Boolean` – `true` értéket ad vissza, ha a kliens bányászik, különben `false`. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}' +// +{ + "id":71, + "jsonrpc": "2.0", + "result": true +} +``` + +### eth_hashrate {#eth_hashrate} + +Visszaadja a hashek számát másodpercenként, amellyel a csomópont a bányászatot végzi. Ez csak proof-of-work hálózatok esetén küld vissza `true` értéket, és talán a [egyesítés (Merge)](/roadmap/merge/) óta nincs is benne minden kliensben. + +**Parameters** + +Egyik sem + +**Returns** + +`QUANTITY` – hashek száma másodpercenként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}' +// Result +{ + "id":71, + "jsonrpc": "2.0", + "result": "0x38a" +} +``` + +### eth_gasPrice {#eth_gasprice} + +Visszaadja a jelenlegi becsült gázárat wei-ben. Például a Besu kliens megvizsgálja az utolsó 100 blokkot, és a gáz egységárának mediánját küldi vissza alapból. + +**Parameters** + +Egyik sem + +**Returns** + +`QUANTITY` – a jelenlegi gázár wei-ben egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' +// Result +{ + "id":73, + "jsonrpc": "2.0", + "result": "0x1dfd14000" // 8049999872 Wei +} +``` + +### eth_accounts {#eth_accounts} + +A kliens által birtokolt címek listáját adja vissza. + +**Parameters** + +Egyik sem + +**Returns** + +`Array of DATA`, 20 bájt – a kliens által birtokolt címek. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"] +} +``` + +### eth_blockNumber {#eth_blocknumber} + +A legutóbbi blokk számát adja vissza. + +**Parameters** + +Egyik sem + +**Returns** + +`QUANTITY` – a legutóbbi blokk száma egész számként, amelynél a kliens tart. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' +// Result +{ + "id":83, + "jsonrpc": "2.0", + "result": "0x4b7" // 1207 +} +``` + +### eth_getBalance {#eth_getbalance} + +Az adott cím számlaegyenlegét adja vissza. + +**Parameters** + +1. `DATA`, 20 bájt – cím, melynek az egyenlegét ellenőrizzük. +2. `QUANTITY|TAG` – a blokk száma egész számként, vagy a `"latest"`, `"earliest"` vagy `"pending"` sztringek – nézze meg az [alapértelmezett blokkparamétereket](/developers/docs/apis/json-rpc/#default-block) + +```js +params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] +``` + +**Returns** + +`QUANTITY` – a jelenlegi egyenleg wei-ben egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x0234c8a3397aab58" // 158972490234375000 +} +``` + +### eth_getStorageAt {#eth_getstorageat} + +Egy adott címen lévő tárhely pozícióját adja vissza. + +**Parameters** + +1. `DATA`, 20 bájt – a tárhely címe. +2. `QUANTITY` – a tárhelyben lévő pozíció egész számként. +3. `QUANTITY|TAG` – a blokk száma egész számként, vagy a `"latest"`, `"earliest"` vagy `"pending"` sztringek – nézze meg az [alapértelmezett blokkparamétereket](/developers/docs/apis/json-rpc/#default-block) + +**Returns** + +`DATA` – az adott tárhelypozíció értéke. + +**Példa** Kiszámolja a pontos pozíciót, a visszakapott tárhely függvényében. Vegyük a következő szerződést, ami itt van telepítve: `0x295a70b2de5e3953354a6a8344e616ed314d7251`, ezzel a címmel:`0x391694e7e0b0cce554cb130d723a9d27458f9298`. + +``` +contract Storage { + uint pos0; + mapping(address => uint) pos1; + function Storage() { + pos0 = 1234; + pos1[msg.sender] = 5678; + } +} +``` + +A pos0 érték megszerzése egyértelmű: + +```js +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 +{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} +``` + +A térkép egyik elemének megszerzése már nehezebb. A térképen egy elem pozícióját így kalkuláljuk: + +```js +keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +``` + +Ahhoz, hogy megszerezzük a tárhelyet a pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] tekintetében, a pozíciót így kell kalkulálni: + +```js +keccak( + decodeHex( + "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + + "0000000000000000000000000000000000000000000000000000000000000001" + ) +) +``` + +A web3-könyvtárban található Geth konzolt lehet használni a kalkulációhoz: + +```js +> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" +undefined +> web3.sha3(key, {"encoding": "hex"}) +"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" +``` + +Most pedig a tárhely megszerzése: + +```js +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"} +``` + +### eth_getTransactionCount {#eth_gettransactioncount} + +Visszaadja a tranzakciók számát, amelyeket egy adott címről _küldtek_. + +**Parameters** + +1. `DATA`, 20 bájt – cím. +2. `QUANTITY|TAG` – a blokk száma egész számként, vagy a `"latest"`, `"earliest"` vagy `"pending"` sztringek – nézze meg az [alapértelmezett blokkparamétereket](/developers/docs/apis/json-rpc/#default-block) + +```js +params: [ + "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "latest", // state at the latest block +] +``` + +**Returns** + +`QUANTITY` – a tranzakciók száma egész számként, amit erről a címről küldtek. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_getBlockTransactionCountByHash {#eth_getblocktransactioncountbyhash} + +Visszaadja a tranzakciók számát egy blokkban, egy olyan blokkból, mely egyezik a megadott blokkhashsel. + +**Parameters** + +1. `DATA`, 32 bájt – blokkhash + +```js +params: ["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"] +``` + +**Returns** + +`QUANTITY` – ebben a blokkban lévő tranzakciók száma egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xb" // 11 +} +``` + +### eth_getBlockTransactionCountByNumber {#eth_getblocktransactioncountbynumber} + +Visszaadja a tranzakciók számát egy blokkban, amely az adott blokkszámnak felel meg. + +**Parameters** + +1. `QUANTITY|TAG` – a blokkszáma egész számként, vagy a `"earliest"`, `"latest"` vagy `"pending"` sztringek, az [alapértelmezett blokkparaméterek](/developers/docs/apis/json-rpc/#default-block) szerint. + +```js +params: [ + "0xe8", // 232 +] +``` + +**Returns** + +`QUANTITY` – ebben a blokkban lévő tranzakciók száma egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0xe8"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xa" // 10 +} +``` + +### eth_getUncleCountByBlockHash {#eth_getunclecountbyblockhash} + +Visszaadja az uncle-blokkok számát egy olyan blokkból, ami a blokkhashnek megfelel. + +**Parameters** + +1. `DATA`, 32 bájt – blokkhash + +```js +params: ["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"] +``` + +**Returns** + +`QUANTITY` – ebben a blokkban az uncle-blokkok száma egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_getUncleCountByBlockNumber {#eth_getunclecountbyblocknumber} + +Visszaadja az uncle-blokkok számát egy olyan blokkból, ami egy adott blokkszámnak megfelel. + +**Parameters** + +1. `QUANTITY|TAG` – a blokkszáma egész számként, vagy a "latest", "earliest" vagy "pending" sztringek, nézze meg az [alapértelmezett blokkparamétereket](/developers/docs/apis/json-rpc/#default-block) + +```js +params: [ + "0xe8", // 232 +] +``` + +**Returns** + +`QUANTITY` – ebben a blokkban az uncle-blokkok száma egész számként. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_getCode {#eth_getcode} + +Visszaadja az adott címen lévő kódot. + +**Parameters** + +1. `DATA`, 20 bájt – cím +2. `QUANTITY|TAG` – a blokk száma egész számként, vagy a `"latest"`, `"earliest"` vagy `"pending"` sztringek – nézze meg az [alapértelmezett blokkparamétereket](/developers/docs/apis/json-rpc/#default-block) + +```js +params: [ + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x2", // 2 +] +``` + +**Returns** + +`DATA` – a kód az adott címről. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b", "0x2"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x600160008035811a818181146012578301005b601b6001356025565b8060005260206000f25b600060078202905091905056" +} +``` + +### eth_sign {#eth_sign} + +Az aláírás metódus kikalkulál egy Ethereum-specifikus aláírást a következővel: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`. + +Ha az üzenethez egy előtagot adunk, akkor a kikalkulált aláírást úgy ismeri fel, mint Ethereum-specifikus aláírás. Ez megakadályozza a rosszhiszemű felhasználást, amikor egy támadó alkalmazás tetszőleges adatokat (például tranzakciókat) ír alá, és arra használja az aláírást, hogy megszemélyesítse áldozatát. + +Megjegyzés: az aláíráshoz olyan cím kell, amely nincs zárolva. + +**Parameters** + +1. `DATA`, 20 bájt – cím +2. `DATA`, N bájt – az aláírandó üzenet + +**Returns** + +`DATA`: Aláírás + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b" +} +``` + +### eth_signTransaction {#eth_signtransaction} + +Aláír egy olyan tranzakciót, amelyet egy későbbi időpontban be lehet küldeni a hálózatra az [eth_sendRawTransaction](#eth_sendrawtransaction) segítségével. + +**Parameters** + +1. `Object` – A tranzakcióobjektum + +- `type`: +- `from`: `DATA`, 20 bájt – A cím, amelyről a tranzakció érkezett. +- `to`: `DATA`, 20 bájt – (opcionális új szerződés létrehozásakor) A tranzakció címzettjének címe. +- `gas`: `QUANTITY` – (opcionális, alapértelmezett: 90 000) A tranzakció végrehajtásához biztosított gáz egész számban megadva. Visszaküldi a fel nem használt gázt. +- `gasPrice`: `QUANTITY` – (opcionális, alapértelmezett: To-Be-Determined) a gasPrice (gázár) egész számként, ami a wei-ben fizetendő gázra vonatkozik. +- `value`: `QUANTITY` – (opcionális) a tranzakcióban küldött érték egész számként, wei-ben. +- `data`: `DATA` – A szerződés kódjának átfordítása VAGY a meghívott metódus aláírásának és kódolt paramétereinek a hashe. +- `nonce`: `QUANTITY` – (opcionális) A nonce egész számmal megadva. Ez lehetővé teszi a saját függőben lévő tranzakciók felülírását, amelyek ugyanazt a nonce-t használják. + +**Returns** + +`DATA`, Az RLP-kódolású tranzakcióobjektum, melyet a specifikus számla aláírt. + +**Példa** + +```js +// Request +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 +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b" +} +``` + +### eth_sendTransaction {#eth_sendtransaction} + +Készít egy új üzenetküldési tranzakciót vagy szerződéslétrehozást, ha az adatmezőben kód van, és aláírja a `from` mezőben definiált számlával. + +**Parameters** + +1. `Object` – A tranzakcióobjektum + +- `from`: `DATA`, 20 bájt – A cím, amelyről a tranzakció érkezett. +- `to`: `DATA`, 20 bájt – (opcionális új szerződés létrehozásakor) A tranzakció címzettjének címe. +- `gas`: `QUANTITY` – (opcionális, alapértelmezett: 90 000) A tranzakció végrehajtásához biztosított gáz egész számban megadva. Visszaküldi a fel nem használt gázt. +- `gasPrice`: `QUANTITY` – (opcionális, alapértelmezett: To-Be-Determined) a gasPrice (gázár) egész számként, ami a fizetendő gázra vonatkozik. +- `value`: `QUANTITY` – (opcionális) a tranzakcióban küldött érték egész számként. +- `input`: `DATA` – A szerződés kódjának átfordítása VAGY a meghívott metódus aláírásának és kódolt paramétereinek a hashe. +- `nonce`: `QUANTITY` – (opcionális) A nonce egész számmal megadva. Ez lehetővé teszi a saját függőben lévő tranzakciók felülírását, amelyek ugyanazt a nonce-t használják. + +```js +params: [ + { + from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155", + to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567", + gas: "0x76c0", // 30400 + gasPrice: "0x9184e72a000", // 10000000000000 + value: "0x9184e72a", // 2441406250 + input: + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + }, +] +``` + +**Returns** + +`DATA`, 32 bájt – a tranzakció hashe vagy a nulla hash, ha a tranzakció még nem elérhető. + +Használja az [eth_getTransactionReceipt](#eth_gettransactionreceipt) parancsot, hogy megszerezze a szerződéscímet, miután a tranzakciót kibányászták, és amikor létrehozta a szerződést. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +### eth_sendRawTransaction {#eth_sendrawtransaction} + +Egy új üzenetküldési tranzakciót vagy szerződéslétrehozást hoz létre az aláírt tranzakciókhoz. + +**Parameters** + +1. `DATA`, az aláírt tranzakciós adatok. + +```js +params: [ + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", +] +``` + +**Returns** + +`DATA`, 32 bájt – a tranzakció hashe vagy a nulla hash, ha a tranzakció még nem elérhető. + +Használja az [eth_getTransactionReceipt](#eth_gettransactionreceipt) parancsot, hogy megszerezze a szerződéscímet, miután a tranzakciót kibányászták, és amikor létrehozta a szerződést. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +### eth_call {#eth_call} + +Azonnal végrehajt egy új üzenethívást anélkül, hogy létrehozna egy tranzakciót a blokkláncon. Gyakran használják arra, hogy csak olvasási (read-only) okosszerződés-függvényeket hajtsanak végre, például a `balanceOf` kód egy ERC-20-as szerződésnél. + +**Parameters** + +1. `Object` – A tranzakcióhívás objektuma + +- `from`: `DATA`, 20 bájt – (opcionális) A tranzakció küldőjének címe. +- `to`: `DATA`, 20 bájt – A tranzakció címzettjének címe. +- `gas`: `QUANTITY` – (opcionális) A tranzakció végrehajtásához adott gáz egész számként. Az eth_call nulla gázt fogyaszt, de néhány végrehajtásnak szüksége lehet rá. +- `gasPrice`: `QUANTITY` – (opcionális) a gasPrice (gázár) egész számként, ami a fizetendő gázra vonatkozik +- `value`: `QUANTITY` – (opcionális) a tranzakcióban küldött érték egész számként +- `input`: `DATA` – (opcionális) a metódus aláírásának és kódolt paramétereinek a hashe. A részletekért tekintse meg az [Ethereum-szerződés ABI-ját a Solidity dokumentációban](https://docs.soliditylang.org/en/latest/abi-spec.html). + +2. `QUANTITY|TAG` – a blokk száma egész számként, vagy a `"latest"`, `"earliest"` vagy `"pending"` sztringek – nézze meg az [alapértelmezett blokkparamétereket](/developers/docs/apis/json-rpc/#default-block) + +**Returns** + +`DATA` – a végrehajtott szerződés visszatérési értéke. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x" +} +``` + +### eth_estimateGas {#eth_estimategas} + +Megbecsüli, hogy egy tranzakció végrehajtásához mennyi gázra lesz szükség. A tranzakció nem kerül hozzáadásra a blokklánchoz. Vegye figyelembe, hogy a becslés szignifikánsan több is lehet, mint amennyit elhasznál a tranzakció, melynek számos oka van, beleértve az EVM működési módját és a csomópontok teljesítményét. + +**Parameters** + +Nézze meg az [eth_call](#eth_call) paramétereit az összes opcionális paraméter kivételével. Ha nincs megadva gázkorlátozás, akkor a Geth a függőben lévő blokk gázkorlátozását használja felső értékként. Ennek eredményeként a visszakapott becslés talán nem elég a hívás/tranzakció végrehajtásához, amikor a gáz mennyisége magasabb, mint a függőben lévő blokk gázkorlátozása. + +**Returns** + +`QUANTITY` – a felhasznált gáz mennyisége. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x5208" // 21000 +} +``` + +### eth_getBlockByHash {#eth_getblockbyhash} + +Egy blokkról ad információt hash alapján. + +**Parameters** + +1. `DATA`, 32 bájt – egy blokk hashe. +2. `Boolean` – Ha `true`, akkor visszaadja a teljes tranzakcióobjektumot, ha `false`, akkor csak a tranzakciók hashét. + +```js +params: [ + "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", + false, +] +``` + +**Returns** + +`Object` – Egy blokkobjektum, vagy `null`, amikor nem talál blokkot: + +- `number`: `QUANTITY` – a blokkszám. `null`, amikor a blokk függőben van. +- `hash`: `DATA`, 32 bájt – a blokk hashe. `null`, amikor a blokk függőben van. +- `parentHash`: `DATA`, 32 bájt – a szülőblokk hashe. +- `nonce`: `DATA`, 8 bájt – a létrehozott proof-of-work hashe. `null`, amikor a blokk függőben van. +- `sha3Uncles`: `DATA`, 32 bájt – a blokkban lévő uncle blokkok SHA3-ja. +- `logsBloom`: `DATA`, 256 bájt – a bloom-szűrés a blokkok naplózására. `null`, amikor a blokk függőben van. +- `transactionsRoot`: `DATA`, 32 bájt – a blokk tranzakciós fájának a gyökere. +- `stateRoot`: `DATA`, 32 bájt – a blokk végső státuszfájának a gyökere. +- `receiptsRoot`: `DATA`, 32 bájt – a blokk visszaigazolás-fájának a gyökere. +- `miner`: `DATA`, 20 bájt – annak a címe, akinek a bányászati jutalom jár. +- `difficulty`: `QUANTITY` – erre a blokkra vonatkozó nehézség egész számként. +- `totalDifficulty`: `QUANTITY` – a lánc teljes nehézsége eddig a blokkig, egész számként. +- `extraData`: `DATA` – ennek a blokknak a „további adatok” mezője. +- `size`: `QUANTITY` – a blokk mérete bájtban, egész számként. +- `gasLimit`: `QUANTITY` – a maximálisan megengedett gáz ebben a blokkban. +- `gasUsed`: `QUANTITY` – a tranzakciók által elhasznált összes gáz ebben a blokkban. +- `timestamp`: `QUANTITY` – a unix időbélyege, amikor a blokkot összeállították. +- `transactions`: `Array` – Tranzakcióobjektumok tömbje, vagy 32 bájtos tranzakcióhashek az utolsó megadott paraméter alapján. +- `uncles`: `Array` – Az uncle hashek sora. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}' +// Result +{ +{ +"jsonrpc": "2.0", +"id": 1, +"result": { + "difficulty": "0x4ea3f27bc", + "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32", + "gasLimit": "0x1388", + "gasUsed": "0x0", + "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171", + "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843", + "nonce": "0x689056015818adbe", + "number": "0x1b4", + "parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x220", + "stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d", + "timestamp": "0x55ba467c", + "totalDifficulty": "0x78ed983323d", + "transactions": [ + ], + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncles": [ + ] +} +} +``` + +### eth_getBlockByNumber {#eth_getblockbynumber} + +Egy blokkról ad információt a blokkszám alapján. + +**Parameters** + +1. `QUANTITY|TAG` – a blokkszáma egész számként, vagy a `"earliest"`, `"latest"` vagy `"pending"` sztringek, az [alapértelmezett blokkparaméterek](/developers/docs/apis/json-rpc/#default-block) szerint. +2. `Boolean` – Ha `true`, akkor visszaadja a teljes tranzakcióobjektumot, ha `false`, akkor csak a tranzakciók hashét. + +```js +params: [ + "0x1b4", // 436 + true, +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getBlockByHash](#eth_getblockbyhash) résznél + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}' +``` + +Az eredményeket nézze meg az [eth_getBlockByHash](#eth_getblockbyhash) résznél + +### eth_getTransactionByHash {#eth_gettransactionbyhash} + +Információt ad egy tranzakcióról a tranzakció hashe alapján. + +**Parameters** + +1. `DATA`, 32 bájt – tranzakció-hash + +```js +params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] +``` + +**Returns** + +`Object` – Egy tranzakcióobjektum, vagy `null`, amikor nem talál tranzakciót: + +- `blockHash`: `DATA`, 32 bájt – a blokk-hash, amelyben ez a tranzakció volt. `null`, amikor függőben van. +- `blockNumber`: `QUANTITY` – a blokkszám, amelyben ez a tranzakció volt. `null`, amikor függőben van. +- `from`: `DATA`, 20 bájt – a küldő címe. +- `gas`: `QUANTITY` – a küldő által adott gáz. +- `gasPrice`: `QUANTITY` – a küldő által megadott gázár wei-ben. +- `hash`: `DATA`, 32 bájt – a tranzakció hashe. +- `input`: `DATA` – a tranzakcióval együtt küldött adatok. +- `nonce`: `QUANTITY` – a tranzakciók száma, melyet a küldő az adott tranzakció előtt végzett. +- `to`: `DATA`, 20 bájt – a fogadó címe. `null`, amikor ez egy szerződéslétrehozó tranzakció. +- `transactionIndex`: `QUANTITY` – a tranzakcióindex pozíciója a blokkban, egész számként. `null`, amikor függőben van. +- `value`: `QUANTITY` – a küldött érték wei-ben. +- `v`: `QUANTITY` – ECDSA visszaállítási azonosító +- `r`: `QUANTITY` – ECDSA aláírás r +- `s`: `QUANTITY` – ECDSA aláírás s + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}' +// Result +{ + "jsonrpc":"2.0", + "id":1, + "result":{ + "blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", + "blockNumber":"0x5daf3b", // 6139707 + "from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d", + "gas":"0xc350", // 50000 + "gasPrice":"0x4a817c800", // 20000000000 + "hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", + "input":"0x68656c6c6f21", + "nonce":"0x15", // 21 + "to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb", + "transactionIndex":"0x41", // 65 + "value":"0xf3dbb76162000", // 4290000000000000 + "v":"0x25", // 37 + "r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea", + "s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c" + } +} +``` + +### eth_getTransactionByBlockHashAndIndex {#eth_gettransactionbyblockhashandindex} + +Egy tranzakcióról ad információt a blokk-hash és a tranzakcióindex pozíciója alapján. + +**Parameters** + +1. `DATA`, 32 bájt – egy blokk hashe. +2. `QUANTITY` – a tranzakcióindex pozíciója egész számként. + +```js +params: [ + "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331", + "0x0", // 0 +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getTransactionByHash](#eth_gettransactionbyhash) résznél + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x0"],"id":1}' +``` + +Az eredményeket nézze meg az [eth_getTransactionByHash](#eth_gettransactionbyhash) résznél + +### eth_getTransactionByBlockNumberAndIndex {#eth_gettransactionbyblocknumberandindex} + +Egy tranzakcióról ad információt a blokkszám és a tranzakcióindex pozíciója alapján. + +**Parameters** + +1. `QUANTITY|TAG` – a blokkszáma, vagy a `"earliest"`, `"latest"` vagy `"pending"` sztringek, az [alapértelmezett blokkparaméterek](/developers/docs/apis/json-rpc/#default-block) szerint. +2. `QUANTITY` – a tranzakcióindex pozíciója. + +```js +params: [ + "0x29c", // 668 + "0x0", // 0 +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getTransactionByHash](#eth_gettransactionbyhash) résznél + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}' +``` + +Az eredményeket nézze meg az [eth_getTransactionByHash](#eth_gettransactionbyhash) résznél + +### eth_getTransactionReceipt {#eth_gettransactionreceipt} + +Egy tranzakció visszaigazolását adja meg a tranzakció-hash alapján. + +**Megjegyzés:** A visszaigazolás nem érthető el függőben lévő tranzakciók esetében. + +**Parameters** + +1. `DATA`, 32 bájt – tranzakció-hash + +```js +params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"] +``` + +**Visszaküldött információk** `Object` – Egy tranzakció visszaigazolási objektuma, vagy `null`, amikor a visszaigazolást nem találja: + +- `transactionHash`: `DATA`, 32 bájt – a tranzakció hashe. +- `transactionIndex`: `QUANTITY` – a tranzakcióindex pozíciója a blokkban, egész számként. +- `blockHash`: `DATA`, 32 bájt – a blokk-hash, amelyben ez a tranzakció volt. +- `blockNumber`: `QUANTITY` – a blokkszám, amelyben ez a tranzakció volt. +- `from`: `DATA`, 20 bájt – a küldő címe. +- `to`: `DATA`, 20 bájt – a fogadó címe. null, amikor ez egy szerződéslétrehozó tranzakció. +- `cumulativeGasUsed` : `QUANTITY` – A gáz teljes mennyisége, amikor ez a tranzakció végrehajtásra került a blokkban. +- `effectiveGasPrice` : `QUANTITY` – Az alapdíj és a borravaló összege a gáz egységére vonatkozóan. +- `gasUsed`: `QUANTITY` – A felhasznált gáz mennyisége erre az adott tranzakcióra vonatkozóan. +- `contractAddress`: `DATA`, 20 bájt – A létrehozott szerződéscím, ha ez a tranzakció szerződéslétrehozásról szól, máskülönben `null`. +- `logs`: `Array` – A naplózási objektumok tömbje, amelyet ez a tranzakció generált. +- `logsBloom`: `DATA`, 256 bájt – Bloom-szűrés a könnyű kliensekhez, hogy gyorsan elérjék a kapcsolódó naplóbejegyzéseket. +- `type`: `QUANTITY` – a tranzakciótípus egész számként, `0x0` a korábbi tranzakciókért, `0x1` a hozzáférési lista típusért, `0x2` a dinamikus díjakért. + +Emellett megadja _a kettő közül az egyiket_ : + +- `root` : `DATA` 32 bájt tranzakció utáni státuszgyökér (pre Byzantium) +- `status`: `QUANTITY` vagy `1` (sikeres), vagy `0` (sikertelen) + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}' +// Result +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": + "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3", + "blockNumber": "0xeff35f", + "contractAddress": null, // string of the address if it was created + "cumulativeGasUsed": "0xa12515", + "effectiveGasPrice": "0x5a9c688d4", + "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7", + "gasUsed": "0xb4c8", + "logs": [{ + // logs as returned by getFilterLogs, etc. + }], + "logsBloom": "0x00...0", // 256 byte bloom filter + "status": "0x1", + "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "transactionHash": + "0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5", + "transactionIndex": "0x66", + "type": "0x2" + } +} +``` + +### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex} + +Egy blokk uncle-blokkjáról ad információt a hash és az uncle-index pozíciója alapján. + +**Parameters** + +1. `DATA`, 32 bájt – egy blokk hashe. +2. `QUANTITY` – az uncle-index pozíciója. + +```js +params: [ + "0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", + "0x0", // 0 +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getBlockByHash](#eth_getblockbyhash) résznél + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b", "0x0"],"id":1}' +``` + +Az eredményeket nézze meg az [eth_getBlockByHash](#eth_getblockbyhash) résznél + +**Megjegyzés**: A nagybácsi nem tartalmaz egyedi tranzakciókat. + +### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex} + +Egy blokk uncle-blokkjáról ad információt a blokkszám és az uncle-index pozíciója alapján. + +**Parameters** + +1. `QUANTITY|TAG` – a blokkszáma, vagy a `"earliest"`, `"latest"` vagy `"pending"` sztringek, az [alapértelmezett blokkparaméterek](/developers/docs/apis/json-rpc/#default-block) szerint. +2. `QUANTITY` – az uncle-index pozíciója. + +```js +params: [ + "0x29c", // 668 + "0x0", // 0 +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getBlockByHash](#eth_getblockbyhash) résznél + +**Megjegyzés**: A nagybácsi nem tartalmaz egyedi tranzakciókat. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}' +``` + +Az eredményeket nézze meg az [eth_getBlockByHash](#eth_getblockbyhash) résznél + +### eth_newFilter {#eth_newfilter} + +Egy szűrőobjektumot hoz létre a szűrőopciók alapján, hogy értesítsen, amikor a státusz változik (a naplóban). A státusz megváltozásának ellenőrzéséhez az [eth_getFilterChanges](#eth_getfilterchanges) metódust kell meghívni. + +**Megjegyzés a témaszűrők meghatározásához:** A témák sorrendfüggők. Egy tranzakció egy olyan naplóval, melyben [A, B] téma (topic) van, a következő témaszűrőkhöz lesz hozzáillesztve: + +- `[]` „bármi” +- `[A]` „A az első helyen (utána bármi)” +- `[null, B]` „bármi az első helyen ÉS B a második helyen (és utána bármi)” +- `[A, B]` „A az első helyen ÉS B a második helyen (és utána bármi)” +- `[[A, B], [A, B]]` „(A VAGY B) az első helyen ÉS (A VAGY B) a második helyen (és utána bármi)” +- **Parameters** + +1. `Object` – A szűrőopciók: + +- `fromBlock`: `QUANTITY|TAG` – (opcionális, alapértelmezett: `"latest"`) blokkszám egész számként, vagy `"latest"` az utolsó kibányászott blokkra vagy `"pending"`, `"earliest"` a még ki nem bányászott tranzakciókra. +- `toBlock`: `QUANTITY|TAG` – (opcionális, alapértelmezett: `"latest"`) blokkszám egész számként, vagy `"latest"` az utolsó kibányászott blokkra vagy `"pending"`, `"earliest"` a még ki nem bányászott tranzakciókra. +- `address`: `DATA|Array`, 20 bájt – (opcionális) A szerződéscím vagy címek listája, amelyekről a naplók származnak. +- `topics`: `Array of DATA`, – (opcionális) a `DATA` témák (topics) 32 bájtos tömbje. A témák sorrendfüggők. Minden téma egy DATA tömb lehet „vagy” opciókkal. + +```js +params: [ + { + fromBlock: "0x1", + toBlock: "0x2", + address: "0x8888f1f195afa192cfee860698584c030f4c9db1", + topics: [ + "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + null, + [ + "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc", + ], + ], + }, +] +``` + +**Visszaküldött információk** `QUANTITY` – Egy szűrő id. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_newBlockFilter {#eth_newblockfilter} + +Létrehoz egy szűrőt a csomópontban, hogy értesítsen az új blokk érkezéséről. A státusz megváltozásának ellenőrzéséhez az [eth_getFilterChanges](#eth_getfilterchanges) metódust kell meghívni. + +**Paraméterek** Egyik sem + +**Visszaküldött információk** `QUANTITY` – Egy szűrő id. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter} + +Létrehoz egy szűrőt a csomópontban, hogy értesítsen új függőben lévő tranzakciók érkezéséről. A státusz megváltozásának ellenőrzéséhez az [eth_getFilterChanges](#eth_getfilterchanges) metódust kell meghívni. + +**Paraméterek** Egyik sem + +**Visszaküldött információk** `QUANTITY` – Egy szűrő id. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_uninstallFilter {#eth_uninstallfilter} + +Egy adott azonosító alatti szűrő eltávolítása. Mindig érdemes meghívni, ha már nincs szükség az adott ellenőrzésre. Emellett a szűrőket ideiglenesen leállíthatja, amikor egy időszakban nincs azokra szükség az [eth_getFilterChanges](#eth_getfilterchanges) metódussal. + +**Parameters** + +1. `QUANTITY` – A szűrő azonosítója. + +```js +params: [ + "0xb", // 11 +] +``` + +**Visszaküldött információk** `Boolean` – `true`, ha a szűrőt sikeresen eltávolította, máskülönben `false`. + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": true +} +``` + +### eth_getFilterChanges {#eth_getfilterchanges} + +Egy szűrőre vonatkozó szelektív hívás, ami a naplótömböt adja vissza, amely az utolsó szelektív hívás óta történteket foglalja magában. + +**Parameters** + +1. `QUANTITY` – A szűrő azonosítója. + +```js +params: [ + "0x16", // 22 +] +``` + +**Visszaküldött információk** `Array` – Naplóobjektumok tömbje, vagy egy üres tömb, ha semmi sem változott a legutóbbi szelektív hívás óta. + +- Az `eth_newBlockFilter` által létrehozott szűrőkre a visszakapott értékek a blokkhashek (`DATA`, 32 bájt), például `["0x3454645634534..."]`. +- Az `eth_newPendingTransactionFilter` által létrehozott szűrőkre a visszakapott értékek a tranzakcióhashek (`DATA`, 32 bájt), például `["0x6345343454645..."]`. +- Az `eth_newFilter` által készített szűrőkre a naplók olyan objektumok lesznek, melyek a következő paraméterekkel rendelkeznek: + - `removed`: `TAG` – `true`, amikor a naplót törölték a lánc újrarendezése miatt. `false`, ha ez egy érvényes napló. + - `logIndex`: `QUANTITY` – a naplóindex pozíciója a blokkban, egész számként. `null`, amikor a napló függőben van. + - `transactionIndex`: `QUANTITY` – a tranzakcióindex pozíciója, amelyből a napló készült, egész számként. `null`, amikor a napló függőben van. + - `transactionHash`: `DATA`, 32 bájt – a tranzakció hashe, amelyből ez a napló készült. `null`, amikor a napló függőben van. + - `blockHash`: `DATA`, 32 bájt – a blokk-hash, amelyben ez a napló volt. `null`, amikor függőben van. `null`, amikor a napló függőben van. + - `blockNumber`: `QUANTITY` – a blokkszám, ahol ez a napló volt. `null`, amikor függőben van. `null`, amikor a napló függőben van. + - `address`: `DATA`, 20 bájt – a cím, ahonnan ez a napló származik. + - `data`: `DATA` – nullát vagy a napló több 32 bájtos nem indexált argumentumát tartalmazza. + - `topics`: `Array of DATA` – 0-tól 4-ig tartó tömbje a 32 bájtos, indexált naplóargumentumok `DATA` részleteinek. (A _Solidity-ben_: Az első téma (topic) az esemény aláírásának a _hashe_ (például `Deposit(address,bytes32,uint256)`), kivéve ha az eseményt az `anonymous` specifikációval deklarálták.) +- **Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}' +// Result +{ + "id":1, + "jsonrpc":"2.0", + "result": [{ + "logIndex": "0x1", // 1 + "blockNumber":"0x1b4", // 436 + "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d", + "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf", + "transactionIndex": "0x0", // 0 + "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d", + "data":"0x0000000000000000000000000000000000000000000000000000000000000000", + "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"] + },{ + ... + }] +} +``` + +### eth_getFilterLogs {#eth_getfilterlogs} + +Visszaadja a megadott azonosítóval rendelkező szűrőnek megfelelő összes napló tömbjét. + +**Parameters** + +1. `QUANTITY` – A szűrő azonosítója. + +```js +params: [ + "0x16", // 22 +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getFilterChanges](#eth_getfilterchanges) résznél + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}' +``` + +Az eredményeket nézze meg az [eth_getFilterChanges](#eth_getfilterchanges) résznél + +### eth_getLogs {#eth_getlogs} + +Visszaadja az adott szűrőobjektumnak megfelelő összes naplótömböt. + +**Parameters** + +1. `Object` – A szűrőopciók: + +- `fromBlock`: `QUANTITY|TAG` – (opcionális, alapértelmezett: `"latest"`) blokkszám egész számként, vagy `"latest"` az utolsó kibányászott blokkra vagy `"pending"`, `"earliest"` a még ki nem bányászott tranzakciókra. +- `toBlock`: `QUANTITY|TAG` – (opcionális, alapértelmezett: `"latest"`) blokkszám egész számként, vagy `"latest"` az utolsó kibányászott blokkra vagy `"pending"`, `"earliest"` a még ki nem bányászott tranzakciókra. +- `address`: `DATA|Array`, 20 bájt – (opcionális) A szerződéscím vagy címek listája, amelyekről a naplók származnak. +- `topics`: `Array of DATA`, – (opcionális) a `DATA` témák (topics) 32 bájtos tömbje. A témák sorrendfüggők. Minden téma egy DATA tömb lehet „vagy” opciókkal. +- `blockhash`: `DATA`, 32 bájt – (opcionális, **jövő**) Az EIP-234 bevezetésével a `blockHash` egy új szűrőopció lesz, amely egyetlen blokkra redukálja a visszakapott naplókat egy 32-bájtos hashsel rendelkező `blockHash` segítségével. A `blockHash` használata azonos a `fromBlock` = `toBlock` = blokkszám hashsel (`blockHash`). Ha a `blockHash` benne van a szűrőkritériumban, akkor nem engedélyezett se a `fromBlock`, se a `toBlock`. + +```js +params: [ + { + topics: [ + "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + ], + }, +] +``` + +**Visszaküldött információk** Nézze meg az [eth_getFilterChanges](#eth_getfilterchanges) résznél + +**Példa** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}' +``` + +Az eredményeket nézze meg az [eth_getFilterChanges](#eth_getfilterchanges) résznél + +## Használati példa {#usage-example} + +### Egy szerződés telepítése JSON_RPC-vel {#deploying-contract} + +Ez a rész azt mutatja be, hogyan lehet egy szerződést telepíteni kizárólag az RPC-interfésszel. Alternatív utak állnak rendelkezésre a szerződéstelepítéshez, ahol ez a komplexitás csökken, például az RPC-interfészre épített könyvtárak segítségével, mint amilyen a [web3.js](https://web3js.readthedocs.io/) és a [web3.py](https://github.com/ethereum/web3.py). Ezek az absztrakciók általában könnyebben érthetők és nem annyira hajlamosak a hibára, de akkor is érdemes megérteni, hogy mi is zajlik a háttérben. + +A következő egy egyszerű, `Multiply7` nevű okosszerződés, amelyet a JSON-RPC-interfésszel telepítünk egy Ethereum-csomópontra. Ez az útmutató azt feltételezi, hogy Ön már futtat egy Geth-csomópontot. A csomópontokról és a kliensekről bővebben [itt](/developers/docs/nodes-and-clients/run-a-node) olvashat. Tekintse meg az egyéni [kliensdokumentációt](/developers/docs/nodes-and-clients/), hogy hogyan lehet HTTP JSON-RPC-t indítani nem Geth-klienseken. A legtöbb kliens alapértelmezés szerint a `localhost:8545` kódon működik. + +```javascript +contract Multiply7 { + event Print(uint); + function multiply(uint input) returns (uint) { + Print(input * 7); + return input * 7; + } +} +``` + +Az első dolog, hogy a HTTP RPC-interfész engedélyezve legyen. Ez azt jelenti, hogy a Geth-nek a beállításkor megadjuk a `--http` jelölőt (flag). Ebben a példában egy Geth-csomópontot használunk egy privát fejlesztési láncon. Ehhez a megközelítéshez nincs szükség etherre, mint egy valódi hálózaton. + +```bash +geth --http --dev console 2>>geth.log +``` + +Ez elindítja a HTTP RPC interfészt a `http://localhost:8545` kódon. + +A [curl](https://curl.se) segítségével a Coinbase-címet és egyenleget lekérve ellenőrizhetjük, hogy az interfész fut-e. Vegye figyelembe, hogy e példában az adatok mások, mint az Ön lokális csomópontján. Ha ki szeretné próbálni ezeket a parancsokat, akkor a lekérdezés paramétereit a második curl kérésben cserélje le az első kérésre kapott eredményekre. + +```bash +curl --data '{"jsonrpc":"2.0","method":"eth_coinbase", "id":1}' -H "Content-Type: application/json" localhost:8545 +{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]} + +curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545 +{"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"} +``` + +Mivel a számok hexadecimálisan vannak kódolva, ezért a visszakapott egyenleg wei-ben egy hexadecimális sztring. Ha az egyenleget etherben, számként szeretnénk megkapni, akkor használhatjuk a web3-at a Geth-konzolból. + +```javascript +web3.fromWei("0x1639e49bba16280000", "ether") +// "410" +``` + +Most, hogy ethert tettünk a privát fejlesztési láncra, telepíthetjük a szerződést. Az első lépés, hogy a Multiply7 szerződést át kell fordítani bájtkódra, hogy el lehessen küldeni az EVM-nek. A solc, a Solidity átfordító telepítéséhez kövesse a [Solidity dokumentációt](https://docs.soliditylang.org/en/latest/installing-solidity.html). (Előfordulhat, hogy egy régebbi `solc` kiadást szeretne használni, hogy az illeszkedjen [a példában szereplő átfordító verziójához](https://github.com/ethereum/solidity/releases/tag/v0.4.20).) + +Most tehát átfordíthatjuk a Multiply7 szerződést bájtkódra, hogy el lehessen küldeni az EVM-nek. + +```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: +6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029 +``` + +Megvan az átfordított kód, úgyhogy most meghatározzunk, mennyi gázköltséget igényel a telepítése. Az RPC-interfésznek van egy `eth_estimateGas` metódusa, ami megadja a becsült értéket. + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545 +{"jsonrpc":"2.0","id":5,"result":"0x1c31e"} +``` + +Végül telepítjük a szerződést. + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545 +{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"} +``` + +A tranzakciót elfogadta a csomópont, és visszaküldte a tranzakcióhasht. Ezzel a hashsel lehet nyomon követni a tranzakciót. A következő lépés, hogy meghatározzuk a címet, ahová a szerződés telepítésre került. Minden végrehajtott tranzakció egy visszaigazolást ad. Ez a visszaigazolás számos információt tartalmaz a tranzakcióról, például melyik blokkba került be és mennyi gázt használt fel az EVM. Ha egy tranzakció létrehoz egy szerződést, akkor a szerződés címe is benne lesz a visszaigazolásban. A visszaigazolást megszerezhetjük az `eth_getTransactionReceipt` RPC metódussal. + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545 +{"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}} +``` + +A szerződést a `0x4d03d617d700cf81935d7f797f4e2ae719648262` címen hozta létre. Ha nullát kapunk eredményül, akkor a tranzakció még nem került be a blokkba. Várjon egy kicsit, ellenőrizze, hogy a bányász fut-e, és próbálja meg újra. + +#### Interakció okosszerződésekkel {#interacting-with-smart-contract} + +Ebben a példában elküldünk egy tranzakciót az `eth_sendTransaction` metódussal a szerződés `multiply` metódusának. + +Az `eth_sendTransaction` számos argumentumot igényel, mint a `from`, `to` és `data`. `From` a számla nyilvános címe, a `to` pedig a szerződés címe. A `data` tartalmazza a csomagot, hogy melyik metódust milyen argumentumokkal kell meghívni. Itt jön képbe az [ABI (application binary interface)](https://docs.soliditylang.org/en/latest/abi-spec.html). Az ABI egy JSON-fájl, amely meghatározza, hogyan kell az EVM számára megadni és kódolni az adatokat. + +Az adattörzs bájtjai határozzák meg, hogy a szerződés melyik metódusát hívják meg. Ez a Kessak-hash első 4 bájtja a függvénynév és az argumentumtípusok felett, hexadecimálisan kódolva. A szorzás függvény uint-et fogad el, ami azonos az uint256-tal. Ez a következőt jelenti: + +```javascript +web3.sha3("multiply(uint256)").substring(0, 10) +// "0xc6888fa1" +``` + +A következő lépés az argumentumok kódolása. Egyetlen uint256 van csak, amelynek értéke legyen 6. Az ABI egyik része azt mutatja be, hogy miként kell kódolni az uint256 típusokat. + +`int: enc(X)` az X két kiegészítős big-endian kódolása, a magasabb rendű (bal) oldalon 0xff-el feltöltve negatív X esetén és nulla > bájttal pozitív X esetén úgy, hogy a hossza a 32 bájt többszöröse legyen. + +Ennek a kódolása a következő: `0000000000000000000000000000000000000000000000000000000000000006`. + +A függvényválasztót és a kódolt argumentumot kombinálva az adatunk a következő: `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`. + +Ezt el lehet küldeni a csomópontnak: + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545 +{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"} +``` + +Mivel egy tranzakciót küldtünk, ezért egy hasht kapunk vissza. A visszaigazolás megérkezésekor a következőt látjuk: + +```javascript +{ + blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55", + blockNumber: 268, + contractAddress: null, + cumulativeGasUsed: 22631, + gasUsed: 22631, + logs: [{ + address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", + blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55", + blockNumber: 268, + data: "0x000000000000000000000000000000000000000000000000000000000000002a", + logIndex: 0, + topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"], + transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74", + transactionIndex: 0 + }], + transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74", + transactionIndex: 0 +} +``` + +A visszaigazolás tartalmaz egy naplót. Ezt a naplót az EVM generálta a tranzakció-végrehajtáskor és beletette a visszaigazolásba. A `multiply` függvény azt mutatja, hogy a `Print` eseményt a bemeneti érték 7-szeresével indította el. Mivel a `Print` eseményre az argumentum egy uint256 volt, kódolhatjuk az ABI szabályai szerint, ami a várt 42-es decimális értéket adja. Az adat mellett érdemes megjegyezni, hogy a témák (topics) révén meghatározható, hogy melyik esemény hozta létre a naplót: + +```javascript +web3.sha3("Print(uint256)") +// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da" +``` + +Ez csak egy rövid bevezető volt a leggyakoribb feladatokba, a JSON-RPC közvetlen használatát demonstrálandó. + +## Kapcsolódó témák {#related-topics} + +- [JSON-RPC specifikáció](http://www.jsonrpc.org/specification) +- [ Csomópontok és kliensek](/developers/docs/nodes-and-clients/) +- [JavaScript API-ok](/developers/docs/apis/javascript/) +- [Backend API-ok](/developers/docs/apis/backend/) +- [Végrehajtási kliensek](/developers/docs/nodes-and-clients/#execution-clients) diff --git a/public/content/translations/hu/developers/docs/blocks/index.md b/public/content/translations/hu/developers/docs/blocks/index.md index 9aed9314fb8..da2ee088349 100644 --- a/public/content/translations/hu/developers/docs/blocks/index.md +++ b/public/content/translations/hu/developers/docs/blocks/index.md @@ -8,57 +8,145 @@ A blokkok tranzakciókból álló csoportosítások a láncban lévő előző bl ## Előfeltételek {#prerequisites} -A blokkok könnyen feldolgozhatók még a legkezdőbb felhasználóknak is. De ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvasd el a [Számlák](/developers/docs/accounts/), [Tranzakciók](/developers/docs/transactions/), és a [Bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) cikkeinket. +A blokkok könnyen feldolgozhatók még a legkezdőbb felhasználóknak is. De ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvassa el a [Számlák](/developers/docs/accounts/), a [Tranzakciók](/developers/docs/transactions/) és a [Bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) című cikkeinket. ## Miért kellenek a blokkok? {#why-blocks} -Hogy biztosítsuk azt, hogy az Ethereum hálózat minden résztvevője egy szinkronizált állapotot tart fenn és megegyezik a pontos tranzakciós történetben, a tranzakciókat blokkokba rendezzük. Ez azt jelenti, hogy tucatnyi (vagy több száz) tranzakció felett van elköteleződés, egyetértés és szinkronizáció egyszerre. +Annak biztosítása érdekében, hogy az Ethereum-hálózat minden résztvevője egy szinkronizált állapotot tart fenn és megegyezik a pontos tranzakciós történetben, a tranzakciókat blokkokba rendezzük. Ez azt jelenti, hogy több tucatnyi (vagy több száz) tranzakció felett van elköteleződés, egyetértés és szinkronizáció egyszerre. -![Egy diagram, mely egy tranzakciót mutat egy blokkban ahogy az állapotot változatja](./tx-block.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból +![Diagram, amely egy státuszt módosító blokkban lévő tranzakciót mutat](./tx-block.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból -Az elkötelezettségek elosztásával elegendő időt adunk az összes hálózati résztvevőnek konszenzusra jutni: annak ellenére, hogy a tranzakciós kérelmek másodpercenként több tucatszor fordulnak elő, az Ethereum blokkjai körülbelül tizenöt másodpercenként köteleződnek el. +Az elkötelezettségek elosztásával elegendő időt adunk az összes hálózati résztvevőnek arra, hogy konszenzusra tudjanak jutni: annak ellenére, hogy a tranzakciós kérelmek másodpercenként több tucatszor fordulnak elő, az Ethereum blokkjai tizenkét másodpercenként köteleződnek el. ## Hogy működnek a blokkok {#how-blocks-work} Hogy megőrizzük a tranzakciós történetet, a blokkoknak szigorú sorrendet kell betartaniuk (minden létrejövő új blokk tartalmaz egy referenciát a szülő blokkjára), és a blokkokban lévő tranzakciók is szigorú sorrendet követnek. Ritka esetek kivételével bármikor amikor a hálózat összes résztvevője egyetért a blokkok pontos számában és előzményeiben, és azon dolgozik, hogy az aktuális élő tranzakciós kérelmeket a következő blokkba csomagolja. -Amint egy blokk össze van állítva (ki van bányászva) egy bányász által a hálózaton, tovább terjed a hálózat többi része számára; az összes csomópont hozzáfűzi ezt a blokkot a blokkláncukra és folytatódik a bányászat. A pontos blokk összeállítási (bányászati) folyamatot és az elköteleződés/konszenzus folyamatot jelenleg az Ethereum “proof-of-work” protokollja specifikálja. +Amint egy blokkot egy véletlenszerűen választott validátor összeállít által a hálózaton, az továbbterjed a hálózat többi részére; az összes csomópont hozzáfűzi ezt a blokkot a blokkláncukra, majd egy új validátort választanak a következő blokk összeállításához. A pontos blokk-összeállítási folyamatot és az elköteleződés/konszenzus folyamatot jelenleg az Ethereum „proof-of-stake” protokollja specifikálja. -### Egy vizuális bemutató {#a-visual-demo} +## Proof-of-stake protokoll {#proof-of-work-protocol} - +A proof-of-stake a következőket jelenti: -## A proof-of-work protokoll {#proof-of-work-protocol} +- A validációt végző csomópontoknak letétbe kell helyezniük 32 ETH-t egy letéti szerződésbe fedezetként, hogy elkerülhető legyen a rosszhiszemű viselkedés. Ez segít megvédeni a hálózatot, mert a rosszhiszemű viselkedés következtében a letét egy része vagy egésze megsemmisül. +- Minden slotban (tizenkét másodpercben) a validátort véletlenszerűen választják ki, hogy javasoljon egy blokkot. Tranzakciókat gyűjt össze, végrehajtja azokat és meghatározza a blokklánc új státuszát. Ezt az információt egy blokkba csomagolja és elküldi a többi validátornak. +- A többi validátor megtudja, hogy van egy új blokk, újra végrehajtja a tranzakciókat, hogy azok megegyeznek-e a javasolt új státusszal. Feltéve a blokk érvényes, hozzáteszik a saját adatbázisukhoz. +- Ha egy validátor két ütköző blokkot talál ugyanarra a slotra, akkor az elágazást választó algoritmussal azt választják, amelyet a legtöbb letétbe helyezett ETH támogat. -A proof-of-work a következőket jelenti: - -- A bányászó csomópontoknak változó, de jelentős mértékű energiát, időt és számítási kapacitást kell fordítaniuk, hogy előállítsanak egy "törvényességi igazolást" egy adott blokkra, melyet a hálózatra terjesztenek. Ez segít megvédeni a hálózatot többek között \* a spam/szolgáltatás megtagadási támadásoktól, mivel az igazolásokat drága előállítani. -- A többi bányásznak, aki hall az érvényes igazolással rendelkező új blokkról, muszáj elfogadni az új blokkot, mint egy kanonikus következő blokkot a blokkláncon. -- A pontos idő, mely egy adott bányász számára szükséges, hogy előteremtse az igazolást, egy random változó nagy varianciával. Ez biztosítja azt, hogy valószínűtlen*, hogy két bányász egyszerre teremti meg az igazolást a következő felterjesztett blokkra; amikor egy bányász elkészít és tovább terjeszt egy igazolt blokkot, szinte teljesen biztosak lehetnek abban, hogy a hálózat elfogadja ezt a blokkot, mint egy következő kanonikus blokkok a blokkláncban, konfliktus nélkül* (habár van egy protokoll a nézeteltérések megoldására, arra az esetre amikor két igazolt blokkokból álló lánc egy időben elkészül). - -[Többet a bányászatról](/developers/docs/consensus-mechanisms/pow/mining/) +[A proof-of-stake-ről bővebben](/developers/docs/consensus-mechanisms/pos) ## Mi van egy blokkban? {#block-anatomy} -- Időbélyeg – a blokk kibányászásának ideje. -- Blokkszám – blokklánc hossza blokkokban. -- Nehézség – a blokk kibányászásához szükséges erőfeszítés. -- mixHash – a blokk egyedi azonosítója. -- Egy szülő hash – az előző blokk egyedi azonosítója (így kapcsolódnak össze a blokkok egy lánccá). -- Tranzakciós lista – a blokkban lévő tranzakciók listája. -- Állapot gyökér – a rendszer teljes állapota: számla egyenlegek, szerződés tárhely, szerződés kód és számla nonce-ok vannak benne. -- Nonce – egy hash, melyet ha kombinálunk a mixHash-sel, akkor be tudjuk bizonyítani, hogy végig ment a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) folyamaton. +A blokkban rengeteg információ van. A legmagasabb szinten a következő mezőket tartalmazza: + +| Mező | Leírás | +|:---------------- |:----------------------------------------------------------------------------- | +| `slot` | az a slot, amelyhez a blokk tartozik | +| `proposer_index` | a validátor azonosítója, aki a blokkot javasolta | +| `parent_root` | az előző blokk hash-e | +| `state_root` | a státusz objektum gyökér hash-e | +| `törzs` | egy olyan objektum, amely számos mezőt tartalmaz, ahogy azt alább definiáljuk | + +A blokk `body` számos mezőt tartalmaz: + +| Mező | Leírás | +|:-------------------- |:------------------------------------------------------------------- | +| `randao_reveal` | egy érték, amely a következő blokkjavaslót választja ki | +| `eth1_data` | információ a letéti szerződésről | +| `graffiti` | tetszőleges adat a blokkok taggelésére | +| `proposer_slashings` | a validátorok listája, akiket slashelni kell | +| `attester_slashings` | a validátorok listája, akiket slashelni kell | +| `tanúsítások` | a tanúsítók listája, akik ezt a blokkot támogatják | +| `behelyezés` | az új letétek listája a letéti szerződésbe | +| `voluntary_exits` | a validátorok listája, akik kilépnek a hálózatból | +| `sync_aggregate` | a validátorok egy csoportja, akik a könnyű klienseket szolgálják ki | +| `execution_payload` | a végrehajtási klienstől jövő tranzakciók | + +A `attestations` (tanúsítások) mező tartalmazza a blokkban lévő az összes tanúsítást. A tanúsítások saját adattípussal rendelkezik, amelyben számos adat megtalálható. A tanúsítások a következőket tartalmazzák: + +| Mező | Leírás | +|:------------------ |:------------------------------------------------------------ | +| `aggregation_bits` | a validátorok listája, akik részt vettek a tanúsításban | +| `adat` | konténer számos almezővel | +| `aláírás` | az összes tanúsítást végző validátor aláírásának aggregátuma | + +A `data` mező a `tanúsítás` részen belül tartalmazza: + +| Mező | Leírás | +|:------------------- |:----------------------------------------------------------------- | +| `slot` | a slot, amelyhez a tanúsítás kapcsolódik | +| `index` | a tanúsítást végző validátorok indexei | +| `beacon_block_root` | a Beacon blokk gyökér hash-e, amely ezt az objektumot tartalmazza | +| `forrás` | az utolsó igazolt ellenőrzési pont | +| `target` | a legutolsó korszak határoló blokkja | + +A tranzakciók végrehajtása az `execution_payload` paraméterben frissíti a globális állapotot. Minden kliens újra végrehajtja a tranzakciókat, amelyek a `execution_payload` paraméterben vannak, hogy biztosítsa, az új állapot egyezik az új blokk `state_root` mezőjében lévőjével. Így tudják a kliensek megmondani, hogy az új blokkot érvényes és biztonságos-e hozzáadni a saját blokkláncukhoz. Az `execution payload` maga egy objektum, amely számos mezővel rendelkezik. Van egy `execution_payload_header` is, ami fontos összegzőinformációkat tartalmaz a végrehajtási adatokról. Ezek az adatstruktúrák a következőképpen vannak rendezve: + +Az `execution_payload_header` a következő mezőket tartalmazza: + +| Mező | Leírás | +|:------------------- |:------------------------------------------------------------------------ | +| `parent_hash` | a jelenlegi blokk elődjének a hash-e | +| `fee_recipient` | a számla címe, amelyre a tranzakciós díjakat fizették | +| `state_root` | a globális állapot gyökér hash-e, miután a változások bementek a blokkba | +| `receipts_root` | a tranzakció fogadói fájának hash-e | +| `logs_bloom` | eseménynaplókat tartalmazó adatstruktúra | +| `prev_randao` | egy érték, amit a véletlenszerű validátor kiválasztásnál használnak | +| `block_number` | a jelenlegi blokk száma | +| `gas_limit` | a jelenlegi blokkban megengedett maximális gáz | +| `gas_used` | a jelenlegi blokkban elhasznált gáz aktuális összege | +| `timestamp` | a blokk ideje | +| `extra_data` | tetszőleges hozzáadott adat, mint nyers bájt | +| `base_fee_per_gas` | az alapdíj értéke | +| `block_hash` | a végrehajtó blokk hash-e | +| `transactions_root` | a végrehajtási csomagban lévő tranzakciók gyökér hash-e | +| `withdrawal_root` | a végrehajtási csomagban lévő visszavonások gyökér hash-e | + +Az `execution_payload` maga a következőket tartalmazza (ami azonos a fejléccel, kivéve, hogy a gyökér hash-ek helyett a tranzakciók és visszavonások aktuális listáját tartalmazza): + +| Mező | Leírás | +|:------------------ |:------------------------------------------------------------------------ | +| `parent_hash` | a jelenlegi blokk elődjének a hash-e | +| `fee_recipient` | a számla címe, amelyre a tranzakciós díjakat fizették | +| `state_root` | a globális állapot gyökér hash-e, miután a változások bementek a blokkba | +| `receipts_root` | a tranzakció fogadói fájának hash-e | +| `logs_bloom` | eseménynaplókat tartalmazó adatstruktúra | +| `prev_randao` | egy érték, amit a véletlenszerű validátor kiválasztásnál használnak | +| `block_number` | a jelenlegi blokk száma | +| `gas_limit` | a jelenlegi blokkban megengedett maximális gáz | +| `gas_used` | a jelenlegi blokkban elhasznált gáz aktuális összege | +| `timestamp` | a blokk ideje | +| `extra_data` | tetszőleges hozzáadott adat, mint nyers bájt | +| `base_fee_per_gas` | az alapdíj értéke | +| `block_hash` | a végrehajtó blokk hash-e | +| `tranzakciók` | a tranzakciók listája, amit végre kell hajtani | +| `kivételek` | a visszavonásra kerülő objektumok listája | + +A `withdrawals` (visszavonások) listája tartalmazza a `withdrawal` (visszavonási) objektumokat, amelyek a következőképpen vannak strukturálva: + +| Mező | Leírás | +|:---------------- |:---------------------------------- | +| `address` | a visszavonásra került számla címe | +| `amount` | a visszavonás összege | +| `index` | a visszavonás index értéke | +| `validatorIndex` | a validátor index értéke | + +## Blokk idő {#block-time} + +A blokk ideje arra utal, hogy mennyi idő választja el a blokkokat. Az Ethereumban az időt tizenkét másodperces egységekre bontják, amelyet slotnak neveznek. Minden slotban egy validátort választanak, hogy javasoljon blokkot. Feltéve, hogy minden validátor online van és teljesen működőképes, minden slotban lesz egy blokk, tehát a blokk idő 12 másodperc. Azonban a validátorok lehetnek néha offline is, amikor felkérik őket blokkjavaslatra, tehát a slot néha üresen megy. + +Ez különbözik a proof-of-work alapú rendszerektől, ahol a blokk ideje valószínű érték és a protokoll céljának kibányászási nehézsége állítja be. Az Ethereum [átlagos blokkideje](https://etherscan.io/chart/blocktime) egy tökéletes példa erre, ahol az átállás a proof-of-work mechanizmusról a proof-of-stake-re egyértelműen kikövetkeztethető az új 12 másodperces blokkidő konzisztens voltából. ## Blokkméret {#block-size} -Utolsó fontos megjegyzés, hogy a blokkok maguk is korlátozott méretűek. Minden blokknak van egy blokk gáz limite, melyet a hálózat és a bányászok állítanak be közösen: az összes tranzakció által teljesen felhasznált gáznak a blokkban kevesebbnek kell lennie, mint a gáz limitnek. Ez fontos, mert ez azt jelenti, hogy a blokkok nem lehetnek tetszőlegesen nagyok. Ha a blokkok tetszőlegesen nagyok lehetnének, akkor a kevésbé teljesítőképes teljes csomópontok egyre kevésbé tudnának lépést tartani a hálózattal a tárhely és sebesség igények miatt. A blokk gáz limit a nulladik blokkban (block 0) 5,000-ről indult; bármely új blokkot bányászó bányász módosíthatja a gáz limitet 0,1%-ig bármely irányba a szülő blokk gáz limitétől. A gáz limit jelenleg 2018 Novemberében 8,000,000 körül mozog. +Utolsó fontos megjegyzés, hogy a blokkok maguk is korlátozott méretűek. Minden blokk 15 millió gáz célmérettel rendelkezik, de a blokk mérete a hálózati kereslet függvényében, egészen a 30 millió gáz határig (ami a célméret kétszerese) változik. A blokkban lévő tranzakciók által elköltött teljes gáz mennyisége kevesebb kell legyen, mint a blokk gázkorlátozása. Ez fontos, mert ez azt jelenti, hogy a blokkok nem lehetnek tetszőlegesen nagyok. Ha a blokkok tetszőlegesen nagyok lehetnének, akkor a kevésbé teljesítőképes teljes csomópontok egyre kevésbé tudnának lépést tartani a hálózattal a tárhely- és sebességigények miatt. Minél nagyobb a blokk, annál nagyobb számítási erő kell ahhoz, hogy időben fel legyen dolgozva a következő slotra. Ez egy centralizáló erő, amelynek úgy áll ellen, hogy határt szab a méretnek. ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} -- [Bányászat](/developers/docs/consensus-mechanisms/pow/mining/) - [Tranzakciók](/developers/docs/transactions/) - [Gáz](/developers/docs/gas/) +- [Proof-of-stake](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/index.md index 28f1afbc34a..8b824a1a854 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/index.md @@ -1,58 +1,89 @@ --- title: Konszenzus mechanizmusok -description: Egy magyarázat az elosztott rendszerek konszenzus protokolljairól és szerepükről az Ethereumban. +description: Az elosztott rendszerek konszenzusprotokolljainak és szerepeiknek bemutatása az Ethereumban. lang: hu -incomplete: true --- -Az Ethereumhoz hasonló blokkláncok esetében, melyek lényegében elosztott adatbázisok, a hálózat csomópontjainak el kell tudni érniük az egyetértést a rendszer jelenlegi állapota felett. Ezt konszenzus mechanizmusokkal lehet elérni. - -Habár nem tartozik a dapp fejlesztés témakörébe, a konszenzus mechanizmusok megértése segít megmagyarázni olyan dolgokat, melyek relevánsak számodra és a felhasználóid számára, mint például a gáz árak vagy a tranzakciós idők. +A konszenzusmechanizmust gyakran használják arra, hogy proof-of-stake (letéti igazolás), proof-of-work (munkaigazolás) vagy proof-of-authority (jogosultságigazolás) protokollokra hivatkoznak. Ugyanakkor ezek csak a konszenzusmechanizmus elemei, amelyek megvédik azt a Sybil-támadásoktól (amikor valaki több személynek adja ki magát). A konszenzusmechanizmus elképzelések, protokollok és ösztönzők teljes halmaza, amely lehetővé teszi, hogy csomópontok elosztott kötege meg tudjon egyezni a blokklánc státuszáról. ## Előfeltételek {#prerequisites} -Ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvasd el a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) oldalunkat. +Ennek az oldalnak a könnyebb megértése érdekében javasoljuk, hogy először olvassa el a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) oldalunkat. + +## Mi az a konszenzus? {#what-is-consensus} + +A konszenzus azt jelenti, hogy általános megegyezés történik. Tegyük fel, hogy egy csapat ember moziba megy. Ha a választott film kapcsán nincs nézeltérés, akkor konszenzus van. Ha nézeteltérés van, akkor a csoportnak el kell döntenie, hogy mit nézzen. Szélsőséges esetben a csoport több felé fog válni. + +Az Ethereum blokkláncon ez a folyamat formális, a konszenzus eléréséhez a hálózaton lévő csomópontok 66%-ának egyet kell értenie a hálózat globális státuszát illetően. ## Mi az a konszenzus mechanizmus? {#what-is-a-consensus-mechanism} -A konszenzus mechanizmusok (más néven konszenzus protokollok vagy konszenzus algoritmusok) lehetővé teszik az elosztott rendszerek (számítógépes hálózatok) számára, hogy együtt dolgozzanak és biztonságosak maradjanak. +A konszenzusmechanizmus kifejezés a protokollok, ösztönzők és elképzelések egész halmazára utal, amelyek lehetővé teszik, hogy a csomópontok hálózata megegyezzen a blokklánc státuszáról. -Évtizedekig használták ezeket a mechanizmusokat, hogy elérjék az adatbázis csomópontok, alkalmazás szerverek és más vállalati infrastruktúrák közötti konszenzust. Az elmúlt években újfajta konszenzus protokollokat találtak fel, melyek lehetővé teszik az Ethereumhoz hasonló kriptoökonómiai rendszerek számára, hogy egyet tudjanak érteni a hálózat állapota felett. +Az Ethereum egy proof-of-stake-alapú konszenzusmechanizmust használ, amelynek kriptogazdasági biztonsága abból ered, hogy a letétesek által zárolt tőkéhez jutalmak és büntetések kapcsolódnak. Ez az ösztönző struktúra arra ösztönzi az egyes letéteseket, hogy becsületes validátorokat működtessenek, bünteti azokat, akik nem így tesznek, és rendkívül magas költséget teremt a hálózat megtámadásához. -Emellett egy konszenzus mechanizmus egy kriptoökonómiai rendszerben segít kivédeni bizonyos gazdasági támadásokat. Elméletben egy támadó képes megdönteni a konszenzust, ha a hálózat 51%-át irányítja. A konszenzus mechanizmusokat arra tervezték, hogy ellehetetlenítsék ezeket az "51%-os támadásokat". Különböző mechanizmusok különböző módon próbálják megoldani ezt a biztonsági problémát. +Ezután van egy protokoll, amely szabályozza, hogyan választják ki a becsületes validátorokat, hogy blokkokat javasoljanak vagy validáljanak, tranzakciókat dolgozzanak fel és szavazzanak a lánc fejéről. Azokban a ritka helyzetekben, amikor több blokk is ugyanabban a pozícióban van a lánc élén, van egy elágazásválasztó-mechanizmus, amely kiválasztja a „legnehezebb” láncot alkotó blokkokat, a blokkokra szavazó validátorok száma alapján, a letétbe helyezett ether-egyenlegükkel súlyozva. + +A konszenzus szempontjából fontosak a kódon kívüli koncepciók is, mint a megszokotton kívüli társadalmi koordináció biztonsága, mely a hálózat elleni támadások elleni védelmi vonal. + +Ezek az elemeket együttesen adják ki a konszenzusmechanizmust. ## A konszenzus mechanizmusok fajtái {#types-of-consensus-mechanisms} -### Proof-of-work {#proof-of-work} +### Proof-of-work alapú {#proof-of-work} -Az Ethereum, a Bitcoinhoz hasonlóan, jelenleg a proof-of-work (PoW) konszenzus protokollt használja. +Ahogy a Bitcoin, korábban Ethereum is a **proof-of-work (PoW)** alapú konszenzusprotokollt használta. #### Blokk létrehozás {#pow-block-creation} -A proof-of-work-öt a [bányászok](/developers/docs/consensus-mechanisms/pow/mining/) végzik, akik azért versenyeznek, hogy feldolgozott tranzakciókkal teli blokkokat hozhassanak létre. A győztes megosztja az új blokkot a hálózat többi részével és valamennyi újonnan kibocsájtott ETH-et kap jutalmul. A versenyt az nyeri, akinek a számítógépe a leggyorsabban tud megoldani egy matematikai feladványt - ez teremti meg a kapcsolatot a jelenlegi blokk és az előző blokk között. Ennek a feladványnak a megoldása jelenti a munkát a "proof-of-work-ben". +A bányászok versenyeznek, hogy új blokkokat hozzanak létre, amelyek tele vannak feldolgozott tranzakciókkal. A győztes megosztja az új blokkot a hálózat többi részével és valamennyi újonnan kibocsátott ETH-t kap jutalmul. A versenyt az a számítógép nyeri, amelyik a leggyorsabban meg tud oldani egy matematikai feladványt. Ez hozza létre a kriptográfiai kapcsolatot az aktuális és az azt megelőző blokk között. Ennek a feladványnak a megoldása jelenti a munkát a „proof-of-work-ben”. A kanonikus láncot ezután egy elágazásválasztási szabály határozza meg, amely kiválasztja azon blokkok halmazát, amelyek bányászatával a legtöbb munkát végezték. #### Biztonság {#pow-security} -A hálózatot az tartja biztonságban, hogy a hálózat számítási erejének több mint 51%-ára van szükséged, hogy átverd a láncot. Ez olyan nagy befektetést igényelne a felszerelésben és energiában, hogy valószínűleg többet költenél, mint amennyit nyernél vele. +A hálózatot az tartja biztonságban, hogy a számítási kapacitás több mint 51%-ára van szükség a lánc meghamisításához. Ez olyan nagy befektetést igényelne a felszerelésben és energiában, hogy a támadó valószínűleg többet költene, mint amennyit nyerne vele. -Többet a [proof-of-work-ről (PoW)](/developers/docs/consensus-mechanisms/pow/) +Bővebben a [proof-of-work-ről (PoW)](/developers/docs/consensus-mechanisms/pow/) -### Proof-of-stake {#proof-of-stake} +### Proof-of-stake alapú {#proof-of-stake} -Az Ethereum a tervek szerint átvált a [proof-of-stake (PoS)](/developers/docs/consensus-mechanisms/pos/) konszenzus protokollra. +Az Ethereum jelenleg **proof-of-stake (PoS)** alapú konszenzusprotokollt használ. #### Blokk létrehozás {#pos-block-creation} -A proof-of-stake-t validátorok végzik, akik letétbe helyezték az ETH-jüket, hogy részt vegyenek a rendszerben. Egy adott validátort véletlenszerűen választanak ki, hogy új blokkot hozzon létre és megossza a hálózattal, valamint jutalmat kapjon. Ahelyett, hogy intenzív számítási munkát kelljen végezned, csak az ETH-edet szükséges letenned a hálózatba. Ez az ami ösztönzi az egészséges hálózati viselkedést. +A validátorok blokkokat hoznak létre. Minden slotban véletlenszerűen kiválasztanak egy blokkelőterjesztőt. A kiválasztott konszenzuskliense egy adat tranzakciót kér végrehajtási csomagként a végrehajtási klienstől. Ezt konszenzusadatokba csomagolják, hogy egy blokkot alkossanak, melyet az Ethereum hálózat többi csomópontjának továbbítanak. Ezért a blokkkészítésért ETH-t kapnak. Ritka esetekben, amikor egy slothoz több blokk is létezik, vagy a csomópontok különböző időpontokban értesülnek a blokkokról, az elágazásválasztó-algoritmus azt a blokkot választja ki, amely a legnagyobb súlyú tanúsítással alkotja a láncot (ahol a tanúsítást végező validátorok számát azok ETH-egyenlegével súlyozzák). #### Biztonság {#pos-security} -A proof-of-stake rendszert az tartja biztonságban, hogy az összes letétbe helyezett ETH-nek az 51%-át kell birtokolnod, hogy átverd a láncot. És az, hogy a letétedet megvágják ha rosszindulatúan viselkedsz. +A proof-of-stake rendszer kriptogazdasági szempontból biztonságos, mivel egy támadónak, aki megpróbálja átvenni az irányítást a lánc felett, hatalmas mennyiségű ETH-t kell feláldoznia. A jutalmak rendszere arra ösztönzi az egyes letétbe helyezőket, hogy tisztességesen viselkedjenek, a büntetések pedig visszatartják őket attól, hogy rosszhiszeműen cselekedjenek. + +Bővebben a [proof-of-stake-ről](/developers/docs/consensus-mechanisms/pos/) + +### Vizuális áttekintés {#types-of-consensus-video} -Többet a [proof-of-stake-ről (PoS)](/developers/docs/consensus-mechanisms/pos/) +Tekintse meg az Ethereumon használt különféle konszenzusmechanizmusokat: + + + +### Ellenállás a Sybil-támadásnak & láncválasztás {#sybil-chain} + +A proof-of-work és proof-of-stake önmagukban nem konszenzusprotokollok, de az egyszerűség kedvéért gyakran így hivatkoznak rájuk. Ezek Sybil-ellenálló mechanizmusok és a blokkok létrehozójának kiválasztói; ezek segítségével lehet eldönteni, hogy ki a legutóbbi blokk kreálója. Egy másik fontos összetevő a láncválasztó (elágazásválasztó) algoritmus, amely lehetővé teszi a csomópontok számára, hogy egyetlen helyes blokkot válasszanak a lánc élére olyan esetekben, amikor több blokk van ugyanabban a pozícióban. + +A **Sybil-rezisztencia** azt méri, hogy egy protokoll hogyan viselkedik egy [Sybil-támadással](https://wikipedia.org/wiki/Sybil_attack) szemben. Sybil-támadás esetén egy felhasználó vagy csoport több felhasználónak adja ki magát. Az ilyen típusú támadásokkal szembeni ellenállás lényeges egy decentralizált blokkláncnál, és lehetővé teszi, hogy a bányászok és a validálók a befektetett erőforrások alapján egyenlő mértékben részesüljenek jutalomban. A proof-of-work és proof-of-stake mechanizmusok úgy védekeznek, hogy a felhasználóknak sok energiát kell ráfordítaniuk vagy sok biztosítékot kell nyújtaniuk. Ezek a védelmek gazdaságilag elrettentőek a Sybil-támadásokkal szemben. + +A **láncválasztási szabály** dönti el, hogy melyik lánc a „helyes”. A Bitcoin a „leghosszabb lánc” szabályt alkalmazza, ami azt jelenti, hogy amelyik blokklánc a leghosszabb, azt a többi csomópont is elfogadja érvényesnek, és azzal dolgozik. A proof-of-work láncok esetében a leghosszabb láncot a lánc összesített proof-of-work nehézsége határozza meg. Korábban az Ethereum is a leghosszabb lánc szabályát használta; most a proof-of-stake mechanizmussal működik, egy frissített elágazásválasztó algoritmust fogadott el, amely a lánc „súlyát” méri. A súly a validátorok szavazatainak összege, súlyozva a validátorok letétbe helyezett ether-egyenlegével. + +Az Ethereum a [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) nevű konszenzusmechanizmust használja, ami kombinálja a [Casper FFG proof-of-stake](https://arxiv.org/abs/1710.09437) módszert a [GHOST elágazásválasztási szabállyale](https://arxiv.org/abs/2003.03052). ## További olvasnivaló {#further-reading} +- [Mi az a blokklánc konszenzusalgoritmus?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) +- [Mit jelent a Nakamoto-konszenzus? Útmutató kezdőknek](https://blockonomi.com/nakamoto-consensus/) +- [Hogyan működik a Casper?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) +- [A proof-of-work blokkláncok biztonságáról és teljesítményéről](https://eprint.iacr.org/2016/555.pdf) +- [Bizánci hiba](https://en.wikipedia.org/wiki/Byzantine_fault) + +_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ + ## Kapcsolódó témák {#related-topics} - [Proof-of-work](/developers/docs/consensus-mechanisms/pow/) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md new file mode 100644 index 00000000000..2eb0c36a410 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md @@ -0,0 +1,163 @@ +--- +title: Az Ethereum proof-of-stake rendszerére vonatkozó támadás és védekezés +description: Ismerje meg a proof-of-stake Ethereum elleni ismert támadási vektorokat és azok elleni védelmet. +lang: hu +--- + +A tolvajok és szabotőrök folyamatosan keresik a lehetőséget, hogy megtámadják az Ethereum kliensszoftverét. Ez az oldal ismerteti az Ethereum konszenzusrétegét érő ismert támadási vektorokat, és felvázolja, hogyan lehet ezeket a támadásokat kivédeni. Az ezen az oldalon található információk egy [hosszabb változatból](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) származnak. + +## Előfeltételek {#prerequisites} + +A [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) alapszintű ismerete szükséges. Hasznos lesz továbbá, ha alapszintű ismeretekkel rendelkezel az Ethereum [ösztönzési réteg](/developers/docs/docs/consensus-mechanisms/pos/rewards-and-penalties) és az elágazásválasztási algoritmus, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper) működéséről. + +## Mit akarnak a támadók? {#what-do-attackers-want} + +Gyakori tévhit, hogy egy sikeres támadó képes új ethert generálni, vagy tetszőleges számlákról ethert lehívni. Egyik sem lehetséges, mivel minden tranzakciót a hálózat összes végrehajtási kliense hajtja végre. A tranzakcióknak meg kell felelniük az érvényesség alapvető feltételeinek (például a tranzakciókat a feladó privát kulcsa írja alá, a feladónak elegendő egyenleggel kell rendelkeznie stb. Az eredménynek három osztálya van, amelyet egy támadó reálisan megcélozhat: átszervezés, dupla véglegesség vagy a véglegesség késleltetése. + +Az **átszervezés** a blokkok új sorrendbe rendezése, esetleg a kanonikus láncban lévő blokkok hozzáadásával vagy kivonásával. Egy rosszindulatú átszervezés biztosíthatja, hogy bizonyos blokkok bekerüljenek vagy kikerüljenek, lehetővé téve a dupla költést vagy az értékkivonást előre és hátra futó tranzakciókkal (MEV). Az átszervezés arra is felhasználható, hogy bizonyos tranzakciókat ne lehessen felvenni a kanonikus láncba, ami a cenzúra egy formája. Az átszervezés legszélsőségesebb formája a „véglegesítés visszaállítása”, amely eltávolítja vagy helyettesíti a korábban véglegesített blokkokat. Ez csak akkor lehetséges, ha a támadó a teljes feltett éter több mint ⅓-át megsemmisíti – ez a garancia az úgynevezett „gazdasági véglegesség” (erről később még lesz szó). + +**Kettős véglegesség** az a valószínűtlen, de súlyos állapot, amikor két elágazás képes egyszerre véglegesedni, ami tartós szakadást okoz a láncban. Ez elméletileg lehetséges egy olyan támadó számára, aki hajlandó a teljes feltett éter 34%-át kockáztatni. A közösség kénytelen lenne a láncon kívül koordinálni és megegyezni arról, hogy melyik láncot kövesse, amihez a társadalmi réteg erejére lenne szükség. + +A **végleges késleltetése** megakadályozza, hogy a hálózat elérje a szükséges feltételeket a lánc szakaszainak véglegesítéséhez. Véglegesség nélkül nehéz megbízni az Ethereumra épülő pénzügyi alkalmazásokban. A végső késleltetéses támadás célja valószínűleg egyszerűen az Ethereum megzavarása, nem pedig a közvetlen haszonszerzés, kivéve, ha a támadónak stratégiai short pozíciója(i) van(nak). + +A szociális réteg elleni támadás célja lehet az Ethereumba vetett közbizalom aláásása, az ether leértékelése, az elfogadás csökkentése vagy az Ethereum közösség gyengítése, hogy megnehezítse a sávon kívüli koordinációt. + +Miután megállapítottuk, hogy egy ellenfél miért támadhatja meg az Ethereumot, a következő szakaszok azt vizsgálják meg, hogy _hogyan_ lehet ezt megtenni. + +## Támadási módszerek {#methods-of-attack} + +### Nulladik rétegbeli támadások {#layer-0} + +Először is, azok a személyek, akik nem vesznek részt aktívan az Ethereumban (a kliensszoftver futtatásával), a társadalmi réteget (nulladik réteg) célozva támadhatnak. A nulladik réteg az alap, amelyre az Ethereum épül, és mint ilyen, potenciális támadási felületet jelent, amelynek következményei a stack többi részére is kihatnak. Néhány példa: + +- Egy félretájékoztató kampány alááshatja a közösség bizalmát az Ethereum ütemtervét, fejlesztőcsapatokat, alkalmazásokba stb. illetően. Ez pedig csökkentheti a hálózat biztosításában résztvevők számát, ami rontja a decentralizációt és a kriptogazdasági biztonságot. +- Célzott támadások és/vagy fenyegetés a fejlesztői közösség ellen. Ez a fejlesztők önkéntes kilépéséhez vezethet, és lelassíthatja az Ethereum fejlődését. + +- A túlbuzgó szabályozás a nulladik réteg elleni támadásnak is tekinthető, mivel gyorsan visszavetheti a részvételt és az elfogadást. +- Hozzáértő, de rosszindulatú szereplők beszivárgása a fejlesztői közösségbe, akiknek célja a fejlődés lelassítása a megbeszélések megzavarásával, a fontos döntések késleltetésével, szemeteléssel (sapm) stb. +- Az Ethereum ökoszisztéma kulcsszereplőinek adott kenőpénzek, hogy ezzel befolyásolják a döntéshozatalt. + +Ezeket a támadásokat az teszi különösen veszélyessé, hogy sok esetben nagyon kevés tőkére vagy technikai tudásra van szükség. Egy nulladik rétegű támadás egy kriptogazdasági támadás multiplikátora lehet. Ha például a cenzúrát vagy a véglegesség visszaállítását egy rosszindulatú többségi érdekelt fél érné el, a társadalmi réteg aláásása megnehezíthetné a sávon kívüli közösségi válaszlépések koordinálását. + +A nulladik rétegbeli támadások elleni védekezés valószínűleg nem egyszerű, de néhány alapelvet fel lehet állítani. Az egyik az Ethereummal kapcsolatos nyilvános információk magas jel-zaj arányának fenntartása, amelyeket a közösség becsületes tagjai hoznak létre és terjesztenek blogokon, discord szervereken, kommentált specifikációkon, könyveken, podcastokon és a Youtube-on keresztül. Itt az ethereum.org-on igyekszünk pontos információkat fenntartani és a lehető legtöbb nyelvre lefordítani. A tér minőségi információkkal és mémekkel való elárasztása hatékony védekezés a félretájékoztatás ellen. + +Egy másik fontos megerősítés a társadalmi réteg támadásaival szemben az egyértelmű küldetésnyilatkozat és az irányítási protokoll. Az Ethereum a decentralizáció és a biztonság bajnokaként pozicionálta magát az L1-es okosszerződések között, miközben nagyra értékeli a skálázhatóságot és a fenntarthatóságot is. Bármilyen nézeteltérések merülnek fel az Ethereum közösségben, ezek az alapelvek minimálisan sérülnek. A narratíva értékelése ezen alapelvek alapján, és a felülvizsgálat egymást követő fordulóin keresztül az EIP (Ethereum Fejlesztési Javaslatok) folyamatában segíthet a közösségnek megkülönböztetni a jó és a rossz szereplőket, és korlátozhatja a rosszindulatú szereplők lehetőségét az Ethereum jövőbeli irányának befolyásolására. + +Végezetül fontos, hogy az Ethereum közösség nyitott és befogadó maradjon minden résztvevő számára. A zártkörű közösségek különösen sebezhetőek a társadalmi támadásokkal szemben, mivel könnyű „mi és ők” narratívákat építeni. A törzsiség és a mérgező maximalizmus árt a közösségnek és aláássa a nulladik réteg biztonságát. A hálózat biztonságában érdekelt ether-tagok úgy tekintsék az online és személyes találkozásokat, mint ami közvetlenül hozzájárul az Ethereum nulladik rétegének biztonságához. + +### A protokoll megtámadása {#attacking-the-protocol} + +Bárki futtathatja az Ethereum kliensszoftverét. Ahhoz, hogy egy validátor hozzáadjon egy klienshez, a felhasználónak 32 ethert kell betennie a letéti szerződésbe. A validátor lehetővé teszi a felhasználó számára, hogy aktívan részt vegyen az Ethereum hálózatának biztonságában azáltal, hogy új blokkokat javasol és tanúsít. A validátornak mostantól van egy olyan hangja, amellyel befolyásolhatja a blokklánc jövőbeli tartalmát – teheti ezt becsületesen, és a jutalmak révén növelheti az ether egyenlegét, vagy megpróbálhatja a folyamatot a saját előnyére manipulálni, kockáztatva a letétjét. A támadás egyik módja az, hogy a teljes letét nagyobb hányadát halmozzák fel, majd ezt arra használják, hogy a becsületes validálókat túlszavazzák. Minél nagyobb a támadó által ellenőrzött letét aránya, annál nagyobb a szavazóereje, különösen bizonyos gazdasági mérföldköveknél, amelyeket később megvizsgálunk. A legtöbb támadó azonban nem lesz képes elegendő ethert felhalmozni ahhoz, hogy ilyen módon támadjon, így ehelyett finom technikákat kell alkalmazniuk, hogy manipulálják a becsületes többséget, hogy egy bizonyos módon cselekedjen. + +Alapvetően minden kis letétes támadás a validátor kétféle hibás viselkedésének variációja: az alulaktivitás (nem vagy későn tesznek javaslatot) vagy a túlaktivitás (túl sokszor tesznek javaslatot egy sloton belül). Legegyszerűbb formájukban ezeket a műveleteket az elágazásválasztó algoritmus és az ösztönző réteg könnyen kezeli, de vannak okos módszerek arra, hogy a támadók előnyére játszhassák ki a rendszert. + +### Kis mennyiségű ETH-t használó támadások {#attacks-by-small-stakeholders} + +#### Átszervezések (reorg) {#reorgs} + +Több cikk is ismertette az Ethereum elleni olyan támadásokat, amelyek a teljes feltett ether csak kis hányadával érnek el reorgokat vagy végleges késleltetést. Ezek a támadások általában arra épülnek, hogy a támadó visszatart valamilyen információt a többi validátor elől, majd valamilyen árnyalt módon és/vagy egy alkalmas pillanatban kiadja azt. Céljuk általában az, hogy kiszorítsanak egy vagy több becsületes blokkot a kanonikus láncból. Egy tanulmány, [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf), megmutatta, hogy egy támadó validátor hogyan hozhat létre és tanúsíthat egy blokkot (`B`) egy adott `n+1` slothoz, de tartózkodhat attól, hogy azt a hálózat más csomópontjainak továbbítsa. Ehelyett a következő `n+2` slotig megtartják az igazolt blokkot. Egy becsületes validátor egy blokkot (`C`) javasol a `n+2` slotba. Ezzel szinte egyidejűleg a támadó kiadhatja a visszatartott blokkját (`B`) és az arra vonatkozó visszatartott tanúsítványait, és a `n+2` slotra leadott szavazataival azt is tanúsíthatja, hogy `B` a lánc feje, ezzel gyakorlatilag tagadva a becsületes `C` blokk létezését. Amikor az őszinte `D` blokk felszabadul, az elágazásválasztó algoritmus úgy látja, hogy a `B` tetejére épülő `D` nehezebb, mint a `C`-re épülő `D`. A támadónak tehát sikerült eltávolítania a `n+2` slotban lévő becsületes `C` blokkot a kanonikus láncból egy 1 blokkos ex ante reorg segítségével. [Egy támadónak a tét 34%-ával](https://www.youtube.com/watch?v=6vzXwwk12ZE) nagyon jó esélye van arra, hogy sikerrel járjon ebben a támadásban, amint azt [ebben a jegyzetben](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) kifejtettük. Elméletileg azonban ezt a támadást kisebb letétekkel is meg lehetne kísérelni. [Neuder et al 2020](https://arxiv.org/pdf/2102.02247.pdf) leírta, hogy ez a támadás 30%-os letét mellett is működik, de később kimutatták, hogy [2%-os letét mellett is életképes](https://arxiv.org/pdf/2009.04987.pdf), majd [egyetlen validátor](https://arxiv.org/abs/2110.10086#) esetén is, a következő fejezetben vizsgált kiegyensúlyozási technikák segítségével. + +![ex-ante reorg](reorg-schematic.png) + +A fent leírt egyblokkos átszervezési támadás koncepcionális ábrája (a https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair oldalról átvéve) + +Egy kifinomultabb támadás a becsületes validátorok halmazát különálló csoportokra oszthatja, amelyeknek különböző nézeteik vannak a lánc fejéről. Ezt nevezik **kiegyenlítő támadásnak**. A támadó megvárja az esélyt, hogy egy blokkot javasoljon, és amikor az megérkezik, kétértelművé válik, és kettőt javasol. Az egyik blokkot a becsületes validátorok felének, a másik blokkot pedig a másik felének küldik. Az elágazásválasztó algoritmus észlelné a kétértelműséget, és a blokkot javaslót megbüntetné és kidobná a hálózatból, de a két blokk továbbra is létezne, és a validátorok körülbelül fele tanúsítaná mindkét elágazást. Eközben a fennmaradó rosszindulatú validátorok visszatartják tanúsításaikat. Ezután az egyik vagy másik elágazást előnyben részesítő tanúsítások szelektív felszabadításával éppen elég validátornak adják át a tanúsítások felhalmozott súlyát az egyik vagy másik elágazás javára, amint az elágazásválasztó algoritmus lefut, így a tanúsítások felhalmozott súlyát az egyik vagy másik elágazás javára billentik. Ez a végtelenségig folytatódhat, a támadó validátorok pedig fenntartják a validátorok egyenletes elosztását a két elágazás között. Mivel egyik elágazás sem tud 2/3-os szupertöbbséget szerezni, a hálózat nem kerülne véglegesítésre. + +**A pattogó (bouncing) támadások** hasonlóak. A szavazatokat a támadó validátorok ismét visszatartják. Ahelyett, hogy a szavazatokat úgy adnák le, hogy a két elágazás között egyenletes legyen a felosztás, a megfelelő pillanatokban arra használják a szavazataikat, hogy olyan ellenőrzőpontokat igazoljanak, amelyek felváltva váltakoznak az A és a B elágazás között. A tanúsításnak ez a két elágazás közötti felcserélése megakadályozza, hogy olyan igazolt forrás- és célellenőrzési pontok párjai legyenek, amelyek bármelyik láncban véglegesíthetők, ami megállítja a véglegesítést. + + + +Mind a pattogó (bouncing), mind a kiegyenlítő (balancing) támadás arra épül, hogy a támadónak kifinomult kontrollja van az üzenetek időzítése felett a hálózaton keresztül, ami nem valószínű. Mindazonáltal a protokollba védelmet építettek be a gyors üzeneteknek a lassú üzenetekkel szemben adott többletsúlyozás formájában. Ez az úgynevezett [javaslattevő-súlynövelés (proposer-weight boosting)](https://github.com/ethereum/consensus-specs/pull/2730). A pattogó támadások elleni védekezés érdekében az elágazásválasztó algoritmust úgy frissítették, hogy a legutóbbi igazolt ellenőrzőpont csak [az adott korszak slotjainak első 1/3-ában](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) válthat át egy alternatív láncra. Ez a feltétel megakadályozza, hogy a támadó szavazatokat gyűjtsön a későbbi használatra – az elágazásválasztó algoritmus egyszerűen hű marad ahhoz az ellenőrzőponthoz, amelyet a korszak első 1/3-ában választott, amely idő alatt a legtöbb becsületes validátor szavazott volna. + +Együttesen ezek az intézkedések olyan forgatókönyvet hoznak létre, amelyben egy becsületes blokkajánló nagyon gyorsan kibocsátja blokkját a slot kezdete után, majd van egy kb. 1/3 slotnyi (4 másodperc) időszak, amikor az új blokk miatt az elágazásválasztó algoritmus egy másik láncra válthat. Ugyanezen határidő után a lassú validátoroktól érkező tanúsításokat a korábban érkezett tanúsításokhoz képest lefelé súlyozzák. Ez nagymértékben kedvez a gyors ajánlattevőknek és a validátoroknak a lánc fejének meghatározásakor, és jelentősen csökkenti a sikeres kiegyenlítő (balancing) vagy pattogó (bouncing) támadás valószínűségét. + +Érdemes megjegyezni, hogy a javaslattevő erősítése önmagában csak az „olcsó reorgok” ellen véd, vagyis kis letétellel rendelkező támadó esetén. Valójában a előterjesztő-erősítés önmagában is kijátszható a nagyobb érdekeltek által. E [bejegyzés](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) szerzői leírják, hogy egy támadó, aki a letét 7%-ával rendelkezik, hogyan vetheti be a szavazatait stratégiailag, hogy becsületes validálók becsapásával a saját elágazásákra építsen, és egy becsületes blokkot átszervezzen. Ezt a támadást ideális késleltetési feltételeket feltételezve dolgozták ki, ami nagyon valószínűtlen. A támadónak kedveznek az esélyek, de a nagyobb letét nagyobb tőkekockázatot és erősebb gazdasági visszatartó erőt is jelent. + +Javasoltak egy [kiegyenlítő támadást is, amely kifejezetten az LMD-szabályt célozza](https://ethresear.ch/t/balancing-attack-lmd-edition/11853), és amely a előterjesztő-erősítés ellenére is életképesnek bizonyult. Egy támadó két versengő láncot hoz létre úgy, hogy a blokkjavaslatát egyenlővé teszi, és minden egyes blokkot a hálózat egy-egy felére terjeszti el, így közelítőleg egyensúlyt hoz létre az elágazások között. Ezután az összejátszó validátorok kiegyenlítik a szavazataikat, úgy időzítve, hogy a hálózat fele a `A` elágazásra kapja meg először a szavazatát, a másik fele pedig a `B` elágazásra. Mivel az LMD-szabály elveti a második igazolást, és csak az elsőt tartja meg minden egyes validátor számára, a hálózat egyik fele csak az `A`-ra adott szavazatokat látja, a másik fele csak a `B`-re adottakat. A szerzők leírják, hogy az LMD-szabály "figyelemre méltó hatalmat" ad az ellenfélnek a kiegyenlítő támadáshoz. + +Ezt az LMD támadási vektort a [az elágazásválasztó algoritmus frissítésével](https://github.com/ethereum/consensus-specs/pull/2845) zártuk le úgy, hogy az elágazásválasztásnál az egyenlőtlen validátorokat teljesen kizárja a megfontolásból. Az egyenlőtlen validátorok jövőbeli befolyását az elágazásválasztó algoritmus kihagyja a számításból. Ez megakadályozza a fent vázolt kiegyenlítő támadást, miközben a lavinatámadásokkal szembeni ellenállóképességet is fenntartja. + +A támadások egy másik osztályát, az úgynevezett [**lavinatámadásokat**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3) egy [2022 márciusában megjelent tanulmányban](https://arxiv.org/pdf/2203.01315.pdf) írták le. A lavinatámadáshoz a támadónak több egymást követő blokkajánlót kell irányítania. A támadó minden egyes blokkjavaslati slotban visszatartja a blokkját, és addig gyűjti azokat, amíg az őszinte lánc el nem éri a visszatartott blokkokkal azonos részfa súlyát. Ezután a visszatartott blokkok felszabadulnak úgy, hogy maximálisan kiegyenlítődnek. A szerzők szerint a előterjesztő-erősítés – az elsődleges védelem a kiegyenlítő és pattogó támadások ellen – nem véd a lavinatámadás egyes változatai ellen. A szerzők azonban a támadást csak az Ethereum elágazásválasztó algoritmusának egy erősen idealizált változatán mutatták be (a GHOST-ot használták LMD nélkül). + +A lavinatámadást az LMD-GHOST elágazásválasztó algoritmus LMD része enyhíti. Az LMD jelentése a „legutolsó üzenet által vezérelt” (latest-message-driven), és az egyes validátorok által vezetett táblázatra utal, amely a többi validátortól kapott legfrissebb üzenetet tartalmazza. Ez a mező csak akkor frissül, ha az új üzenet egy későbbi időpontból származik, mint a táblázatban egy adott validátort illetően már szereplő üzenet. A gyakorlatban ez azt jelenti, hogy minden egyes slotban az első fogadott üzenet az, amelyet a rendszer elfogadott, és minden további üzenet kétértelműség, amelyet figyelmen kívül kell hagyni. Másképpen fogalmazva, a konszenzuskliensek nem veszik figyelembe a kétértelműséget – a validátoroktól elsőként érkező üzenetet használják, a kétértelműséget elvetik, megelőzve ezzel a lavinatámadásokat. + +Az elágazásválasztási szabály számos más lehetséges jövőbeli frissítése is létezik, amelyek növelhetik a előterjesztő-erősítés által nyújtott biztonságot. Az egyik a [nézetösszevonás](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), ahol a tanúsítók `n` másodperccel egy slot kezdete előtt befagyasztják az elágazásválasztásról alkotott nézetüket, és a javaslattevő ezután segít szinkronizálni a lánc nézetét a hálózaton. Egy másik lehetséges fejlesztés az [ egy sloton belüli véglegesség (single-slot finality)](https://notes.ethereum.org/@vbuterin/single_slot_finality), amely az üzenet időzítésén alapuló támadások ellen véd azáltal, hogy a láncot egyetlen slot után véglegesíti. + +#### Véglegesség késleltetése {#finality-delay} + +[Az a cikk](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf), amely először írta le az alacsony költségű, egyetlen blokkot érintő reorg támadást, leírt egy végső késleltetés (liveness failure) nevű támadást is, amely arra támaszkodik, hogy a támadó egy korszakkal határos blokk javaslattevője. Ez azért kritikus, mert ezek a korszakhatár blokkok lesznek az ellenőrző pontok, amelyeket a Casper FFG a lánc egyes részeinek véglegesítéséhez használ. A támadó egyszerűen visszatartja a blokkját, amíg elegendő becsületes validátor nem használja FFG-szavazatát az előző korszakhatárblokk javára, mint az aktuális véglegesítési cél. Ezután kiadja a visszatartott blokkot. Ők tanúsítják a blokkjukat, és a fennmaradó becsületes validátorok is ezt teszik, különböző célellenőrzési pontokkal rendelkező elágazásokat hozva létre. Ha jól időzítették, akkor megakadályozzák a véglegességet, mert nem lesz 2/3-os szupertöbbség, amely bármelyik elágazást tanúsítja. Minél kisebb a letét, annál pontosabb időzítésre van szükség, mivel a támadó kevesebb tanúsítást ellenőriz közvetlenül, és annál kisebb az esélye annak, hogy a támadó ellenőrzi a validátort, amely a korszakhatárblokkot javasolja. + +#### Nagy hatótávolságú támadások {#long-range-attacks} + +Létezik egy, a proof-of-stake blokkláncokra jellemző támadási osztály is, amelynek lényege, hogy a genezisblokkban részt vevő validátor fenntartja a blokklánc egy különálló elágazását a helyes blokklánc mellett, és végül meggyőzi az őszinte validátorhalmazt, hogy később egy alkalmas időpontban váltson át rá. Ez a fajta támadás nem lehetséges az Ethereumon, mivel a véglegességi eszköz (finality gadget) biztosítja, hogy az összes validátor rendszeres időközönként (ellenőrzőpontok) megegyezzen a becsületes lánc állapotáról. Ez az egyszerű mechanizmus semlegesíti a nagy hatótávolságú támadókat, mivel az Ethereum kliensei egyszerűen nem fogják a véglegesített blokkokat újraszervezni. A hálózathoz csatlakozó új csomópontok úgy teszik ezt, hogy keresnek egy megbízható legutóbbi állapot hash-t (egy [gyenge szubjektivitás](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) ellenőrzőpontot), és azt használják pszeudo-genezis blokkként, amelyre építkeznek. Ez egy „bizalmi bejáratot” hoz létre a hálózatba belépő új csomópont számára, mielőtt az elkezdené ellenőrizni az információkat saját maga számára. + +#### Szolgáltatásmegtagadás (DoS) {#denial-of-service} + +Az Ethereum proof-of-stake mechanizmusa minden egyes slotban egyetlen validátort választ ki a teljes validátorkészletből, aki blokkajánló lesz. Ezt egy nyilvánosan ismert függvény segítségével lehet kiszámítani, és egy támadó számára lehetséges, hogy a következő blokkelőterjesztőt beazonosítsa. Ezután a támadó eláraszthatja szeméttel (spam) a blokkelőterjesztőt, hogy megakadályozza, hogy információt cseréljen a társaival. A hálózat többi része számára úgy tűnne, hogy a blokkelőterjesztő offline, és a slot egyszerűen üresen marad. Ez egyfajta cenzúra lehet bizonyos validátorokkal szemben, megakadályozva őket abban, hogy információt adjanak hozzá a blokklánchoz. Az egyetlen, titkos vezető kiválasztás (SSLE) vagy az egynél több titkos vezető kiválasztás megvalósítása csökkenti a szolgáltatásmegtagadás (DoS) kockázatát, mivel mindig csak a blokkelőterjesztő tudja, hogy kiválasztották, és nem ismerhető meg előre. Ez még nem valósult meg, de aktív [kutatás-fejlesztési](https://ethresear.ch/t/secret-non-single-leader-election/11789) terület. + +Mindezek alapján elmondható, hogy kis letétekkel nehéz sikeresen megtámadni az Ethereumot. Az itt leírt életképes támadásokhoz idealizált elágasztásválasztó algoritmusra, valószínűtlen hálózati körülményekre van szükség, vagy a támadási vektorokat már lezárták az kliensszoftver javításokkal. Ez nem zárja ki a lehetőséget, de a kisebbségi letéttel rendelkező támadó hatékonyságát meghatározza az, hogy milyen szintű technikai képességekkel bír, a konszenzusréteg ismerete és a szerencse. A támadó szempontjából az lehet a legjobb megoldás, ha minél több ethert halmoz fel, és a teljes letét többségi hányadával próbál elérni valamit. + +### A támadók a teljes letét >=33%-át használják {#attackers-with-33-stake} + +Az eddig említett összes támadás sikerének valószínűsége megnő, ha a támadónak több letétbe helyezett ether áll rendelkezésére, amivel szavazhat, és több validálót választhat, akik blokkokat javasolhatnak az egyes slotokban. Egy rosszindulatú validátor ezért arra törekedhet, hogy minél több letétbe helyezett ether irányítson. + +A feltett ether 33%-a egy támadó számára viszonyítási alap, mivel egy ennél nagyobb összeggel képesek megakadályozni a lánc véglegesítését anélkül, hogy a többi validáló tevékenységét irányítaniuk kellene. Egyszerűen mindannyian együtt eltűnhetnek. Ha a letétbe helyezett ether 1/3-a vagy több mint 1/3-a rosszindulatúan vagy nem tanúsít, akkor a 2/3-os szupertöbbség nem állhat fenn, és a lánc nem véglegesíthető. Ez ellen az inaktivitás elszivárgással védekeznek. Az inaktivitás elszivárgás azonosítja azokat a validátorokat, akik nem vagy a többséggel ellentétesen tanúsítanak. A nem tanúsító validátorok által birtokolt letétbe helyezett ether fokozatosan elvezetésre kerül, míg végül együttesen a teljes mennyiség kevesebb mint 1/3-át képviselik, így a lánc újra véglegesedhet. + +Az inaktivitási elszivárgás célja, hogy a lánc ismét véglegesedjen. A támadó azonban a letétbe helyezett ether egy részét is elveszíti. A teljes letétbe helyezett ether 33%-át kitevő validátorok tartós inaktivitása nagyon drága, még akkor is, ha nem is kapnak súlyos és kizárással járó büntetést. + +Feltételezve, hogy az Ethereum-hálózat aszinkron (az üzenetek küldése és fogadása között késések vannak), egy támadó, aki a teljes letét 34%-át ellenőrzi, kétszeres véglegesítést okozhat. Ez azért van, mert a támadó kétértelművé teheti, ha őt választják blokkelőterjesztőnek, majd duplán szavazhat az összes validátorával. Ez olyan helyzetet teremt, amelyben a blokkláncnak egy olyan elágazása létezik, amely mellett a letétbe helyezett ether 34%-a szavazott. Mindkét elágazásra csak a fennmaradó validátorok 50%-ának kell szavaznia, hogy mindkét elágazást szupertöbbség támogassa, és így mindkét lánc véglegesíthető (mivel a támadó validátorok 34%-a + a fennmaradó 66% fele = 67% mindkét elágazásnál). Az egymással versengő blokkokat a becsületes validátorok kb. 50%-ának kellene megkapnia, így ez a támadás csak akkor életképes, ha a támadónak bizonyos fokú ellenőrzése van a hálózaton terjedő üzenetek időzítése felett, így a becsületes validátorok felét rá tudja kényszeríteni az egyes láncokra. A támadónak szükségszerűen el kellene pusztítania a teljes letétjét (kb. 10 millió ether 34%-a a mai validátor halmazt figyelembe véve), hogy elérje ezt a kettős véglegességet, mivel a validátorok 34%-a egyszerre kétszer szavazna – ez egy súlyos és kizárással járó büntetés maximális korrelációval. Ezzel a támadással szemben az a magas költség áll, hogy a teljes letétbe helyezett ether 34%-át el kell pusztítani. A támadásból való kilábaláshoz az Ethereum közösségnek „sávon kívül” kell koordinálnia, és meg kellene állapodnia abban, hogy az egyik elágazást követi, a másikat pedig figyelmen kívül hagyja. + +### A támadók a teljes letét kb. 50%-át használják {#attackers-with-50-stake} + +A letétbe helyezett ether 50%-ánál a validátorok egy rosszindulatú csoportja elméletileg két egyforma méretű elágazásra oszthatná a láncot, majd egyszerűen felhasználhatná a teljes 50%-os letétjét arra, hogy a becsületes validátorok csoportjával ellentétesen szavazzon, így fenntartva a két elágazást és megakadályozva a véglegesítést. A két elágazáson az inaktivitási elszivárgása végül mindkét lánc véglegesítéséhez vezet. Ezen a ponton az egyetlen lehetőség a közösségi helyreállítás. + +Nagyon valószínűtlen, hogy a validátorok egy ellenséges csoportja következetesen ellenőrizni tudná a teljes letét pontosan 50%-át, mivel a becsületes validátorok száma, a hálózati késleltetés stb. változó mértékű – egy racionális támadó számára a támadás hatalmas költsége és a siker alacsony valószínűsége erős visszatartó erőnek tűnik, különösen ha a _több mint_ 50% megszerzése nagyobb hatalmat szabadít fel. + +A teljes letét >50%-ánál a támadó uralni tudta az elágazásválasztó algoritmust. Ebben az esetben a támadó képes lenne a többségi szavazattal tanúsítani, ami elegendő kontrollt adna neki ahhoz, hogy rövid átrendeződéseket hajtson végre anélkül, hogy becsületes klienseket kellene becsapnia. A becsületes validálók követnék ezt a példát, mivel az ő elágazásválasztó algoritmusuk is a támadó által preferált láncot látná a legnehezebbnek, így a lánc véglegesedhetne. Ez lehetővé teszi a támadó számára, hogy bizonyos tranzakciókat cenzúrázzon, rövidtávú átszervezéseket végezzen, és a blokkok önérdekű átrendezésével profitot (MEV) szerezzen. Ez ellen a többségi részesedés hatalmas költsége (az írás idején ez kb. 19 milliárd dollár) ad védelmet, amelyet egy támadó kockáztat, mivel a társadalmi réteg közbeléphet, és elfogadhat egy becsületes kisebbségi elágazást, ami drámaian leértékeli a támadó részesedését. + +### A támadók a teljes letét >=66%-át használják {#attackers-with-66-stake} + +Egy támadó, aki az összes letétbe helyezett ether 66%-ával vagy többel rendelkezik, véglegesítheti a preferált láncot anélkül, hogy a becsületes validálókat kényszerítenie kellene. A támadók egyszerűen megszavazhatják a preferált elágazást, majd véglegesíthetik azt, mert tisztességtelen szupertöbbséggel szavazhatnak. A szupertöbbség birtokosaként a támadó irányítaná a véglegesített blokkok tartalmát, hatalmában állna költeni, visszatekerni és újrakölteni, cenzúrázni bizonyos tranzakciókat és tetszés szerint átszervezni a láncot. Azzal, hogy a támadó további ethert vásárol, hogy 51% helyett 66%-ot ellenőrizzen, megszerzi a képességet, hogy utólagos reorgokat és végleges visszafordításokat hajtson végre (azaz megváltoztassa a múltat és ellenőrizze a jövőt is). Az egyetlen igazi védekezés a hatalmas költség, a teljes letétbe helyezett ether 66%-a, és a közösségi rétegre támaszkodva egy alternatív elágazás elfogadásának koordinálása. Ezt a következő részben részletesebben is megvizsgáljuk. + +## Emberek: az utolsó védelmi vonal {#people-the-last-line-of-defense} + +Ha a tisztességtelen validátoroknak sikerül véglegesíteniük a lánc általuk preferált verzióját, az Ethereum közösség nehéz helyzetbe kerül. A kanonikus lánc tartalmaz egy tisztességtelen szakaszt a történetébe beépítve, míg a becsületes validátorok büntetést kaphatnak, ha egy alternatív (becsületes) láncot tanúsítanak. Vegye figyelembe, hogy egy véglegesített, de hibás lánc a többségi kliens hibájából is adódhat. Végül a végső megoldás az, hogy a közösségi (nulladik) rétegre hagyatkozunk. + +Az Ethereum proof-of-stake konszenzusának egyik erőssége, hogy a közösség számos [védekező stratégiát](https://youtu.be/1m12zgJ42dI?t=1712) alkalmazhat egy támadás esetén. A minimális válasz lehet a támadók validátorainak a hálózatból való kizárása további szankció nélkül. A hálózatba való újbóli belépéshez a támadó egy aktiválási sorba kerül, amely biztosítja, hogy a validátorok halmaza fokozatosan növekedjen. Például elegendő validátor hozzáadása ahhoz, hogy megduplázza a letétbe helyezett ether mennyiségét, körülbelül 200 napot vesz igénybe, így a becsületes validátorok ennyi időt nyerhetnek, mielőtt a támadó újabb 51%-os támadást kísérelhet meg. A közösség azonban dönthet úgy is, hogy szigorúbban bünteti a támadót, visszavonva a korábbi jutalmakat, vagy elégetve a letéti tőke egy részét (vagy akár 100%-át). + +A támadóra kiszabott büntetéstől függetlenül a közösségnek közösen kell döntenie arról is, hogy a tisztességtelen lánc – annak ellenére, hogy az Ethereum-kliensekbe kódolt elágazásválasztó algoritmus előnyben részesíti – valójában érvénytelen, és a közösségnek inkább a tisztességes láncra kellene építenie. A becsületes validátorok megállapodhatnak, hogy az Ethereum blokklánc közösség által elfogadott elágazására építenek, amely például a támadás megkezdése előtt elágazhatott a kanonikus láncról, vagy a támadók validátorait eltávolíthatják. A becsületes validátorok ösztönzést kapnának arra, hogy erre a láncra építsenek, mert elkerülhetnék a büntetést, amit azért kapnának, ha (jogosan) nem tanúsítanák a támadó láncát. Az Ethereumra épülő tőzsdék, on-rampok és alkalmazások inkább a helyes láncon szeretnének lenni, és követnék a becsületes validálókat a helyes blokkláncra. + +Ez azonban jelentős vezetési kihívást jelentene. Néhány felhasználó és validáló kétségtelenül veszítene a helyes láncra való visszaváltás következtében, a támadás után validált blokkokban lévő tranzakciókat potenciálisan visszavonnák, megzavarva az alkalmazási réteget, és ez aláássa egyes felhasználók etikai elképzeléseit, akik hajlamosak azt hinni, hogy „a kód a törvény”. A tőzsdék és az alkalmazások valószínűleg összekapcsolták a láncon kívüli műveleteket a láncon belüli tranzakciókkal, amelyeket most vissza lehet göngyölíteni, elindítva a visszavonások és felülvizsgálatok tömkelegét, amelyet nehéz lenne tisztességesen kibogozni, különösen, ha a jogtalanul szerzett nyereségeket összekeverték, DeFi-ba vagy más származékos termékekbe helyezték, amelyek másodlagos hatásokkal járnak a tisztességes felhasználók számára. Kétségtelen, hogy néhány felhasználó, talán még az intézményiek is, hasznot húztak volna a tisztességtelen láncból, ravaszságból vagy szerencsés véletlenből, és elleneznék az elágazást, hogy megvédjék a hasznukat. Elpróbálták a >51%-os támadásokra adott közösségi válaszlépéseket, hogy egy ésszerű, összehangolt választ gyorsan végre lehessen hajtani. A témáról tekintse meg Vitalik hasznos eszmecseréit az ethresear.ch-n [itt](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) és [itt](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363), valamint a Twitteren [itt](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw). Az összehangolt társadalmi reakció célja a támadó megbüntetése és a többi felhasználóra gyakorolt hatások minimalizálása kell, hogy legyen. + +A vezetés már önmagában is bonyolult téma. Egy tisztességtelen véglegesítő láncra adott nulladik réteg vészreakció kezelése kihívást jelentene az Ethereum közösség számára, de ez már [megtörtént](/history/#dao-fork-summary) – [kétszer](/history/#tangerine-whistle) – az Ethereum történetében. + +Mindazonáltal van valami kielégítő abban, hogy a végső megoldás a való világban található. Végső soron, még e fenomenális technológiai rendszer ellenére is, ha a legrosszabb valaha is bekövetkezne, a valódi embereknek kellene koordinálniuk a kiutat. + +## Összegzés {#summary} + +Ez az oldal azt vizsgálta, hogy a támadók milyen módon próbálhatják meg kihasználni az Ethereum proof-of-stake konszenzus protokollját. A reorgokat és a véglegesítés késleltetését a teljes letétbe helyezett ether növekvő arányú támadók esetében vizsgáltuk. Összességében a gazdagabb támadóknak nagyobb esélyük van a sikerre, mivel a letétjük szavazati joggal jár, amellyel befolyásolni tudják a jövőbeli blokkok tartalmát. Bizonyos küszöbértékeknél a támadó ereje növekszik: + +33%: késleltetett véglegesség + +34%: késleltetett véglegesség, kettős véglegesség + +51%: késleltetett véglegesség, kettős véglegesség, cenzúra, a blokklánc jövőjének ellenőrzése + +66%: késleltetett véglegesség, kettős véglegesség, cenzúra, a blokklánc jövőjének és múltjának ellenőrzése + +Létezik egy sor kifinomultabb támadás is, amelyekhez kis mennyiségű letétbe helyezett ether is elég, de egy kifinomult támadó kell hozzá, aki az üzenet időzítése felett kontrollt gyakorol, hogy a saját javára befolyásolja a becsületes validátorok halmazát. + +Összességében, e potenciális támadási vektorok ellenére a sikeres támadás kockázata alacsony, minden bizonnyal alacsonyabb, mint a proof-of-work-nél. Mival a támadó, aki a becsületes validátorok szavazati erejével elnyomja a becsületes validátorokat, a letétbe helyezett ether költségét kockáztatja. A beépített „jutalmazás-büntetés” ösztönző réteg megvéd a legtöbb visszaéléstől, különösen az alacsony letéttel rendelkező támadóktól. A kifinomultabb pattogó és kiegyenlítő támadások szintén nem valószínű, hogy sikerrel járnak, mivel a valós hálózati feltételek miatt nehéz elérni az üzenetek kézbesítésének szabályozását a validálók meghatározott részhalmazaihoz, és a klienscsapatok egyszerű javításokkal lezárták az ismert pattogó, kiegyenlítő és lavina támadási vektorokat. + +A 34%-os, 51%-os vagy 66%-os támadások sávon kívüli társadalmi koordinációt igényelnek a megoldásához. Bár ez valószínűleg fájdalmas lenne a közösség számára, a sávon kívüli válaszadás képessége erős visszatartó erőt jelent a támadóknak. Az Ethereum közösségi rétege a végső biztosíték – egy technikailag sikeres támadást még mindig ki lehet iktatni azzal, hogy a közösség elfogad egy becsületes elágazást. A támadó és az Ethereum közösség versenyt futna – a 66%-os támadásra költött dollármilliárdokat egy sikeres közösségi koordináció eltörölné, ha elég gyorsan végzik, így a támadó rengeteg nem likvid etherrel egy tisztességtelen láncon, amelyet az Ethereum közösség figyelmen kívül hagy. Alacsony a valószínűsége, hogy ez a támadónak végül nyereséget hoz, ezért hatékony visszatartóerőt jelent. Ezért olyan fontos a szorosan összehangolt értékekkel rendelkező, összetartó közösségi réteg fenntartása. + +## További olvasnivaló {#further-reading} + +- [A jelen írás részletesebb verziója](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [Vitalik az elszámolási véglegességről](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) +- [LMD GHOST leírás](https://arxiv.org/abs/2003.03052) +- [Casper-FFG leírás](https://arxiv.org/abs/1710.09437) +- [Gasper leírás](https://arxiv.org/pdf/2003.03052.pdf) +- [A javaslattevő erősítés konszenzus specifikációi](https://github.com/ethereum/consensus-specs/pull/2730) +- [Pattogó támadások az ethresear.ch oldalon](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) +- [SSLE kutatás](https://ethresear.ch/t/secret-non-single-leader-election/11789) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attestations/index.md new file mode 100644 index 00000000000..2f3e4ff23ed --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attestations/index.md @@ -0,0 +1,86 @@ +--- +title: Tanúsítások +description: A tanúsítások menete az Ethereum proof-of-stake (letéti igazolás) mechanizmusában. +lang: hu +--- + +A validátornak minden korszakban (epoch) tanusítást kell készítenie, aláírnia és szétküldenie. Ez a leírás bemutatja, hogyan néznek ki ezek a tanúsítások, hogyan kezelik azokat és kommunikálják a konszenzuskliensek között. + +## Mi az a tanúsítás? {#what-is-an-attestation} + +Minden [korszakban (epoch)](/glossary/#epoch) (6,4 perc) a validátor tanúsítást készít a hálózatnak. A tanúsítás a korszak egy megadott slotjára történik. A tanúsítás célja az, hogy szavazzon amellett, ahogyan ő maga látja a láncot, különösképpen a legutóbbi ellenőrzött blokk és a jelen korszak első blokkja tekintetében (melyeket `source` (eredet) és `target` (cél) ellenőrzési pontoknak neveznek). Az információt összekombinálják az összes résztvevő validátorra, így a hálózat konszenzust tud elérni a blokklánc státuszát illetően. + +A tanúsítás a következő elemekből áll: + +- `aggregation_bits`: a validátorok bitlistája, ahol a pozíció a validátornak a bizottságbeli indexéhez kapcsolódik; az érték (0/1) azt mutatja, hogy a validátor aláírta a `data` mezőt (tehát aktív és egyetért a blokkelőterjesztővel) +- `data`: a tanúsításhoz kapcsolódó részletek, ahogy az alább látszik +- `signature`: egy BLS aláírás, ami aggregálja az egyéni validátorok aláírásait + +A tanúsítást végző validátor első feladata az, hogy felépítse a `data` mezőit. A `data` a következő információkat tartalmazza: + +- `slot`: A slot száma, melyre a tanúsítás vonatkozik +- `index`: Egy szám, ami beazonosítja, hogy a validátor melyik bizottsághoz tartozik egy adott slotban +- `beacon_block_root`: A blokk gyökérhash-e, amit a validátor lát a lánc fejeként (az elágazásválasztási algoritmus alkalmazásának eredménye) +- `source`: A véglegesedési szavazás része, mely azt mutatja, hogy a validátorok melyik blokkot látják a legutolsó igazoltnak +- `target`: A véglegesedési szavazás része, mely azt mutatja, hogy a validátorok melyik blokkot látják a jelen korszak első blokkjának + +Amint a `data` felépül, a validátor átválthatja a bitet az `aggregation_bits` mezőben 0-ról 1-re, amely a saját validátor indexéhez kapcsolódik, így mutatja, hogy részt vett. + +Végül a valdátor aláírja a tanusítást és elküldi azt a hálózaton. + +### Aggregált tanúsítás {#aggregated-attestation} + +Az adat elterjesztése a hálózaton minden validátor esetében jelentős költséggel jár. Ezért az egyéni validátorok tanúsításait aggregálják az alhálókon belül, mielőtt szélesebb körben szétküldenék azt. Ennek része az aláírások aggregálása, így a kiküldött tanúsítás tartalmazza a konszenzus `data` mezőit és egyetlen aláírást, melyet az összes validátor aláírásából készítenek, aki egyetértett a `data` tartalmával. Ezt le lehet ellenőrizni az `aggregation_bits` mezővel, mert ez adja meg a bizottságban lévő validátorok indexeit (akiknek az ID-ja része a `data` mezőinek), amellyel le lehet kérdezni az egyéni aláírásokat. + +Minden korszakban minden alhálóban egy validátort kiválasztanak, hogy `aggregator` legyen. Az aggregátor összegyűjti az összes tanúsítást, amelyről hall a pletykahálózaton, s melyeknek ugyanolyan `data` áll rendelkezésre, mint neki. Minden egyező tanúsítás küldője feljegyződik az `aggregation_bits` mezőben. Ezután az aggregátor szétküldi az aggregált tanúsítást a szélesebb hálózaton. + +Amikor a validátort választják blokkelőterjesztőnek, akkor az új blokkba beteszi az aggregált tanúsításokat az alhálózatoktól egészen az utolsó slotig. + +### A tanúsítások belefoglalásának életciklusa {#attestation-inclusion-lifecycle} + +1. Létrehozás +2. Elterjesztés +3. Aggregálás +4. Elterjesztés +5. Belefoglalás + +A tanúsítás életciklusát a következő ábra is bemutatja: + +![a tanúsítás életciklusa](./attestation_schematic.png) + +## Jutalmak {#rewards} + +A validátorok jutalmat kapnak az elküldött tanúsításokért. A tanúsítás jutalma két dologtól függ: a `base reward` (alapjutalom) és az `inclusion delay` (belefoglalási késés). A belefoglalási késés a legjobb esetben 1. + +`attestation reward = 7/8 x base reward x (1/inclusion delay)` + +### Alapjutalom {#base-reward} + +Az alapjutalom számítása a tanúsításban részt vevő validátorok számától és az általuk letétbe helyezett ether egyenlegétől függ: + +`base reward = validator effective balance x 2^6 / SQRT(Effective balance of all active validators)` + +#### Belefoglalási késés {#inclusion-delay} + +Aikor a validátorok szavaztak a lánc fejére (`block n`), akkor a `block n+1` még nem volt előterjesztve. Ezért a tanúsítások természetes módon **one block later** (egy blokkal később) kerülnek be, így minden tanúsítás, amelyik azt mondta, hogy a `block n` a lánc feje, az bekerül a `block n+1`-be, és az **inclusion delay** (belefoglalási késés) értéke 1. Ha a belefoglalási késés két slotnyi lesz, akkor a tanúsítási jutalom feleződik, mert a jutalom kiszámításához az alapjutalom szorozva van a belefoglalási késés reciprokával. + +### Tanúsítási esetek {#attestation-scenarios} + +#### Hiányzó validátor, aki szavaz {#missing-voting-validator} + +A validátoroknak legfeljebb 1 korszak áll rendelkezésre, hogy elküldjék a tanúsításukat. Ha a tanúsítás lekési a 0. korszakot, akkor belefoglalási késéssel be tudják még küldeni az 1. korszakban. + +#### Hiányzó aggregátor {#missing-aggregator} + +Összesen 16 aggregátor van minden korszakban. Emellett véletlenszerű validátorok be vannak jegyezve **két alhálózatra 256 korszakra**, és ők helyettesítik az aggregátorokat, ha bárki hiányzik. + +#### Hiányzó blokkelőterjesztő {#missing-block-proposer} + +Néhány esetben a szerencsés aggregátor blokkelőterjesztővé válhat. Ha a tanúsítás nem került be, mert a blokkelőterjesztő hiányzik, akkor a következő előterjesztő felkapja az aggregált tanúsítást és beteszi a következő blokkba. Ugyanakkor az **inclusion delay** megnövekszik eggyel. + +## További olvasnivaló {#further-reading} + +- [Tanúsítások Vitalik által kommentált konszenzusspecifikációban](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) +- [Tanúsítások az eth2book.info oldalon](https://eth2book.info/altair/part3/containers/dependencies#attestationdata) + +_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/block-proposal/index.md new file mode 100644 index 00000000000..1b60ca77048 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -0,0 +1,69 @@ +--- +title: Blokkjavaslat +description: Magyarázat a blokkok előterjesztéséről a proof-of-stake Ethereumban. +lang: hu +--- + +A blokkok a blokklánc alapvető egységei. A blokkok az információ különálló egységei, melyeket a csomópontok elterjesztik egymás között, megegyeznek felőle és hozzáadják a saját adatbázisukhoz. Ez az oldal feltárja, hogyan jönnek létre a blokkok. + +## Előfeltételek {#prerequisites} + +A blokkelőterjesztés része a proof-of-stake (letéti igazolás) protokollnak. Ahhoz, hogy könnyebben átlássa a folyamatot, tekintse meg a [proof-of-stake-ről](/developers/docs/consensus-mechanisms/pos/) és a [blokk architektúráról](/developers/docs/blocks/) szóló anyagokat. + +## Ki hozza létre a blokkot? {#who-produces-blocks} + +A validátorszámlák javasolják a blokkokat. A validátorszámlákat azok a csomópontműködtetők kezelik, akik validátorszoftvert futtatnak a végrehajtási és konszenzusklienseik részeként, s letétbe helyeztek 32 ETH-t a letéti szerződésbe. Ugyanakkor egy adott validátor csak esetenként felel azért, hogy blokkot javasoljon. Az Ethereum az időt slotokra és korszakokra (epoch) osztja fel. Minden slot 12 másodperc, és 32 slot (6,4 perc) tesz ki egy korszakot. Minden slotban lehetőség van arra, hogy az Ethereumon egy új blokkot hozzanak létre. + +### Véletlenszerű kiválasztás {#random-selection} + +A kijelölt validátort ál-véletlenszerűen választják, hogy javasoljon blokkot egy adott slotban. A blokkláncban nincs olyan, hogy valódi véletlenszerűség, mert ha minden csomópont valóban véletlen számokat generálna, akkor sose lenne konszenzus. Ehelyett az a lényeg, hogy a validátorkiválasztás megjósolhatatlan legyen. A véletlenszerűséget az Ethereumon egy RANDAO-nak nevezett algoritmussal érik el, ami összekeveri a blokkelőterjesztőtől jövő hash-t egy seed-del, ami minden blokkban frissítve van. Ezt az értéket használják, hogy kiválasszanak egy adott validátort a teljes szettből. A validátorkiválasztás két korszakra előre adott, hogy ezzel védekezzenek a seed manipuláció ellen. + +Habár a validátorokat hozzáadják a RANDAO-hoz minden slotban, de a globális RANDAO értéke csak egyszer frissül minden korszakban. Ahhoz, hogy a következő blokkelőterjesztő indexét kiszámolja, a RANDAO értéket összekeveri a slotszámmal, hogy minden slotnak egyedi értéke legyen. A valószínűség, hogy egy adott validátor kiválasztásra kerül, nem egyszerűen `1/N` (ahol `N` = teljes aktív validátorok). Ehelyett ezt súlyozzák minden validátor aktuális ETH egyenlegével. A maximum egyenleg (balance) az 32 ETH (tehát `balance < 32 ETH` kevesebb súlyt jelent, mint `balance == 32 ETH`, de `balance > 32 ETH` nem jelent nagyobb súlyt, mint `balance == 32 ETH`). + +Minden slotban egy blokkelőterjesztőt választanak. Normális esetben a dedikált slotbn egy blokkelőterjesztő létrehoz és elküld egyetlen blokkot. Két blokk létrehozása ugyanarra a slotra egy súlyos és kizárással járó büntetés, más néven kétértelműség. + +## Hogyan jön létre a blokk? {#how-is-a-block-created} + +A blokkelőterjesztőnek egy aláírt beacon blokkot kell szétküldeni, amely a lánc aktuális fejére épül, ahogy azt a lokálisan futtatott elágazásválasztási algoritmusuk mutatja. Az elágazásválasztás algoritmusa először érvényesíti az előző slotból származó tanúsításokat, majd megkeresi azt a blokkot, melynek összességében a legtöbb tanúsítása van. Ez a blokk lesz a szülője annak az új blokknak, melyet a javaslattevő készít. + +A blokkelőterjesztője összegyűjti az adatokat a saját lokális adatbázisából és a láncról, s ebből állít össze blokkot. A blokk tartalma alább látszik: + +```rust +class BeaconBlockBody(Container): + randao_reveal: BLSSignature + eth1_data: Eth1Data + graffiti: Bytes32 + proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS] + attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS] + attestations: List[Attestation, MAX_ATTESTATIONS] + deposits: List[Deposit, MAX_DEPOSITS] + voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS] + sync_aggregate: SyncAggregate + execution_payload: ExecutionPayload +``` + +A `randao_reveal` mező egy igazolható, véletlenszerű értéket vesz fel, melyet a blokkelőterjesztő hoz létre azzal, hogy aláírja a jelenlegi korszak számát. Az `eth1_data` egy szavazat arra, ahogy a blokkelőterjesztő a letéti szerződést látja, beleértve a letéti Merkle-fa gyökerét és a letétek teljes számát, mely lehetővé teszi az új letétek ellenőrzését. A `graffiti` egy opcionális mező, mellyel üzenetet lehet adni a blokkhoz. A `proposer_slashings` és az `attester_slashings` olyan mezők, melyek bizonyítják, hogy adott validátorok súlyos büntetést érdemelnek aszerint, ahogy az előterjesztő látja a láncot. A `deposits` az új validátorletétek listája, melyről az előterjesztő tudomással bír, a `voluntary_exits` pedig azok a validátorok, akikről a konszenzusréteg pletykahálózatán hallott, hogy ki akarnak lépni. A `sync_aggregate` egy olyan vektor, mely megmutatja, melyik validátorok voltak korábban a szinkronizálási bizottság tagjai (a validátorok alcsoportja, melyek a könnyű klienseknek biztosítanak adatot) és vettek részt az adatok aláírásában. + +Az `execution_payload` információt ad a végrehajtási és a konszenzus kliensek közötti átadott tranzakciókról. Az `execution_payload` a végrehajtandó adatok egy csomagja, melyet beágyaznak egy beacon blokkba. Az `execution_payload` mezői a blokkstruktúrát mutatják, ahogy azt az Ethereum Sárgakönyv felvázolja, kivéve, hogy nincsenek ommerek és `prev_randao` van a `difficulty` helyett. A végrehajtási kliens a tranzakciók egy helyi gyűjtőjéhez fér hozzá, melyről a saját pletykahálózatán hallott. Ezeket a tranzakciókat helyben végrehajtja, hogy egy friss státuszfát kapjon (post-state). A tranzakciók bekürülnek az `execution_payload` mezőbe egy listaként, mint `transactions`, az új státuszfa (post-state) pedig a `state-root` mezőbe kerül. + +Ezeket az adatokat egy beacon blokkba gyűjtik, melyet aláírnak és szétküldenek az előterjesztő társainak, akik továbbküldik a saját társaiknak, és így tovább. + +Bővebben a [a blokkok anatomiájáról](/developers/docs/blocks). + +## Mi történik a blokkal? {#what-happens-to-blocks} + +A blokk bekerül az előterjesztő helyi adatbázisába és elküldi azt a társaknak a konszenzusréteg pletykahálózatán keresztül. Amikor egy validátor megkap egy blokkot, ellenőrzi a benne lévő adatokat, beleértve, hogy a megfelelő szülővel rendelkezik-e, a megfelelő slotra vonatkozik, az előterjesztő indexe megfelel-e, a RANDAO nyilatkozat érvénye és az előterjesztőt nem büntették-e meg. Az `execution_payload` kicsomagolásra kerül, és a validátor végrehajtási kliense újra lefuttatja a tranzakciókat, hogy ellenőrizze a javasolt státuszváltozást. Ha a blokk átmegy minden ellenőrzésen, akkor az összes validátor hozzáadja a blokkot a saját kanonikus láncához. Majd a folyamat kezdődik előlről a következő slotban. + +## Blokkjutalmak {#block-rewards} + +A blokkelőterjesztő fizetséget kap a munkájáért. Van egy `base_reward` (alapdíj), melyet az aktív validátorok számából és az ő aktuális egyenlegeikből kalkulálnak ki. A blokkelőterjesztő ezután megkapja a `base_reward` egy töredékét minden érvényes tanúsításért, mely a blokkba került; minél több validátor tanúsítja a blokkot, annál nagyobb ez a jutalom. Azért is jutalom jár, ha valaki bejelent egy validátort, akit meg kell büntetni. Ez `1/512 * aktuális egyenleg` minden súlyosan megbüntetett validátor után. + +[Bővebben a jutalmakról és büntetésekről](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) + +## További olvasnivaló {#further-reading} + +- [Bevezetés a blokkokba](/developers/docs/blocks/) +- [Bevezetés a proof-of-stake mechanizmusba](/developers/docs/consensus-mechanisms/pos/) +- [Az Ethereum konszenzusspecifikációi](https://github.com/ethereum/consensus-specs) +- [Bevezetés a Gasperbe](/developers/docs/consensus-mechanisms/pos/) +- [Az Ethereum frissítése](https://eth2book.info/) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/faqs/index.md new file mode 100644 index 00000000000..f51dfd5809a --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -0,0 +1,172 @@ +--- +title: Gyakran ismételt kérdések +description: Gyakran ismételt kérdések az Ethereum proof-of-stake (letéti igazolás) mechanizmusáról. +lang: hu +--- + +## Mi az a proof-of-stake? {#what-is-proof-of-stake} + +A proof-of-stake (letéti igazolás) egy algoritmusfajta, ami biztonságot tud adni a blokkláncoknak azáltal, hogy a támadók elveszítik az értékeiket, amint rosszhiszeműen viselkednek. A proof-of-stake rendszereknél szükség van egy validátorszettre, amely eszközöket biztosít, s ezeket lehet megsemmisíteni, ha bizonyítottan rosszindulatúan cselekszenek. Az Ethereum proof-of-stake mechanizmust használ arra, hogy biztosítsa a blokkláncot. + +## Hogyan viszonyul a proof-of-stake a proof-of-work mechanizmushoz? {#comparison-to-proof-of-work} + +A proof-of-work (munkaigazolás) és a proof-of-stake (letéti igazolás) egyaránt olyan mechanizmus, mely elrettenti a rosszhiszemű szereplőket attól, hogy teleszemeteljék vagy becsapják a hálózatot. Mindkettőnél azok a csomópontok, melyek aktívan részt vesznek a konszenzusban, valamennyi eszközt „tesznek be a hálózatba”, melyet elveszítenek, ha nem viselkednek megfelelően. + +A proof-of-work esetében ez az eszköz az energia. A bányászként ismert csomópont egy olyan algoritmust futtat, melynek célja, hogy egy értéket gyorsabban számoljon ki, mint az összes többi csomópont. A leggyorsabb csomópont javasolhat blokkot a láncra. Ahhoz, hogy a lánc történetét megváltoztassa vagy dominálja a blokkelőterjesztést, a bányásznak olyan hatalmas számítási kapacitással kell bírnia, hogy minden megnyerje a versenyt. Ez olyan szinten drága és nehezen kivitelezhető, hogy ez megvédi a láncot a támadásoktól. A proof-of-work alapú bányászathoz szükséges energia egy valódi eszköz, amiért a bányászok fizetnek. + +A proof-of-stake-hez validátor szerepű csomópontokra van szükség, amelyek egyértelműen kriptoeszközt adnak át egy okosszerződésnek. Ha egy validátor nem megfelelően viselkedik, ezt a kriptót megsemmisíthetik, mivel ezt közvetlen módon letétbe helyezték a láncon, nem pedig közvetett módon, az energiakiadáson keresztül. + +A proof-of-work sokkal eneriaigényesebb, mert a bányászati folyamatban elektromosságot égetnek el. A proof-of-stake ezzel szemben csak nagyon kevés energiát igényel – az Ethereum validátorokat igen alacsony kapacitású eszközön is futtathatják, mint amilyen a Raspberry Pi. Az Ethereum proof-of-stake mechanizmusát sokkal biztonságosabbnak vélik, mint a proof-of-work metódust, mert a támadás költsége sokkal nagyobb, a támadót pedig sokkal súlyosabb következmények sújtják. + +A proof-of-work versus proof-of-stake egy állandó téma. [Vitalik Buterin blogja](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), valamint a Justin Drake és Lyn Alden közötti vita remekül összefoglalja az érveket. + + + +## Energiatakarékos a proof-of-stake? {#is-pos-energy-efficient} + +Igen. A proof-of-stake hálózat csomópontjai kis mennyiségű energiát használnak. Egy harmadik fél által készített tanulmány szerint az Ethereum teljes proof-of-stake hálózatának fogyasztása kb. 0,0026 TWh/év, ami nagyjából 13.000-szer kevesebb, mint a játék csak az Egyesült Államokban. + +[Bővebben az Ethereum energiafelhasználásáról](/energy-consumption/). + +## Biztonságos a proof-of-stake? {#is-pos-secure} + +Az Ethereum proof-of-stake mechanizmusa nagyon biztonságos. A mechanizmust nyolc éven át kutatták, fejlesztették és alaposan tesztelték, mielőtt életbe lépett volna. A biztonsági garanciák eltérnek a proof-of-work-alapú blokkláncoktól. A proof-of-stake-ben a rosszindulatú validátorokat aktívan meg lehet büntetni (slash) és ki lehet dobni a validátorok közül, ami nekik jelentős összegű ETH-be kerül. A proof-of-work esetében a támadó megismételheti a támadását, amíg elegendő hash-kapacitással rendelkezik. Az Ethereum proof-of-stake-nél egy ugyanolyan jellegű támadás költségesebb, mint proof-of-work esetén. A lánc elérhetőségének befolyásolásához a hálózaton lévő összes letétbe helyezett ether legalább 33%-ára van szükség (kivéve a nagyon kifinomult, rendkívül valószínűtlen sikerű támadások esetén). A jövőbeli blokkok tartalmának ellenőrzéséhez a teljes letétbe helyezett ETH legalább 51%-a szükséges, a historikus adatok átírásához pedig a teljes letét több mint 66%-a kell. Az Ethereum protokollja a 33%-os vagy 51%-os támadásoknál megsemmisítené ezeket az eszközöket, a 66%-os támadásnál pedig társadalmi konszenzussal oldaná meg. + +- [Bővebben az Ethereum proof-of-stake támadás elleni védelméről](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +- [Bővebben a proof-of-stake dizájnról](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) + +## Olcsóbbá teszi az Ethereumot a proof-of-stake? {#does-pos-make-ethereum-cheaper} + +Nem. A tranzakció elküldésének költségét (gázdíj) egy dinamikus díjpiac határozza meg, amely a hálózati kereslet növekedésével nő. A konszenzusmechanizmus ezt közvetlenül nem befolyásolja. + +[Bővebben a gázról](/developers/docs/gas). + +## Mik azok a csomópontok, kliensek és validátorok? {#what-are-nodes-clients-and-validators} + +A csomópontok az Ethereum-hálózathoz csatlakozó számítógépek. A kliensek az általuk futtatott szoftverek, amelyek a számítógépet csomóponttá alakítják. A klienseknek két típusa van: a végrehajtási és a konszenzuskliensek. Mindkettőre szükség van egy csomópont létrehozásához. A validátor a konszenzuskliens opcionális kiegészítője, amely lehetővé teszi a csomópont számára, hogy részt vegyen a proof-of-stake konszenzusban. Ez azt jelenti, hogy blokkokat hoz létre és javasol, amikor kiválasztják, és igazolja azokat a blokkokat, amelyekről a hálózaton hall. Egy validátor futtatásához a csomópont üzemeltetőjének 32 ETH-t kell befizetnie a letéti szerződésbe. + +- [Bővebben a csomópontokról és kliensekről](/developers/docs/nodes-and-clients) +- [Többet a letétbe helyezésről](/staking) + +## A proof-of-stake egy új ötlet? {#is-pos-new} + +Nem. A BitcoinTalk egyik felhasználója 2011-ben [javasolta a proof-of-stake alapötletét](https://bitcointalk.org/index.php?topic=27787.0) a Bitcoin továbbfejlesztéseként. Tizenegy év telt el, mire készen állt a megvalósításra az Ethereum főhálózaton. Néhány más lánc már korábban megvalósította a proof-of-stake-et, de nem az Ethereum sajátos mechanizmusát (ami Gasper néven ismert). + +## Mi a különleges az Ethereum proof-of-stake mechanizmusában? {#why-is-ethereum-pos-special} + +Az Ethereum proof-of-stake mechanizmusa teljesen egyedi. Nem ez volt az első proof-of-stake mechanizmus, amelyet megterveztek és megvalósítottak, de ez a legstabilabb. A proof-of-stake mechanizmusát Casper-nek nevezik. A Casper határozza meg, hogyan választják ki a validátorokat a blokkelőterjesztésre, hogyan és mikor tanúsítanak, hogyan számolják a tanúsításokat, milyen jutalmakat és büntetéseket kapnak a validátorok, a súlyos büntetések feltételeit, a hibabiztos mechanizmusokat, mint például az inaktivitás elszivárgás, és a „véglegesség” feltételeit. A véglegesség egy feltétel, hogy egy blokk a kanonikus lánc állandó része legyen, a hálózaton lévő összes letétbe helyezett ETH legalább 66%-ának szavazatával kell bírnia. A kutatók a Caspert kifejezetten az Ethereum számára fejlesztették ki, így ez az első és egyetlen blokklánc, amely megvalósította. + +A Casper mellett az Ethereum proof-of-stake-je egy LMD-GHOST nevű elágazásválasztó-algoritmust használ. Erre abban az esetben van szükség, ha két blokk létezik ugyanarra a slotra. Ezáltal a blokklánc két elágazást hoz létre. Az LMD-GHOST azt választja ki, amelyiknél a tanúsítások „súlya” a legnagyobb. A súly a tanúsítások száma súlyozva a validátorok tényleges egyenlegével. Az LMD-GHOST egyedülálló az Ethereumban. + +A Casper és az LMD_GHOST kombinációja Gasper néven ismert. + +[Bővebben a Gasperről](/developers/docs/consensus-mechanisms/pos/gasper/) + +## Mi az a súlyos büntetés (slashing)? {#what-is-slashing} + +Súlyos büntetésnek nevezzük a validáló letétjének megsemmisítését és a validálónak a hálózatból való kizárását. A súlyos büntetés során elveszített ETH mennyisége a megbüntetett validátorok számával arányos – ez azt jelenti, hogy az összejátszó validátorok súlyosabb büntetést kapnak, mint az egyének. + +[Bővebben a súlyos büntetésről (slashing)](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) + +## Miért kell a validátoroknak 32 ETH? {#why-32-eth} + +A validátoroknak ETH-t kell letétbe helyezniük, hogy legyen mit veszíteniük, ha rosszhiszeműen viselkednek. Azért is kell 32 ETH-t feltölteniük, hogy a csomópontok egyszerűbb hardveren is működhessenek. Ha az egy validátorra jutó minimális ETH alacsonyabb lenne, akkor a validátorok száma, és így az egyes slotokban feldolgozandó üzenetek száma is növekedne, ezért nagyobb teljesítményű hardverre lenne szükség egy csomóponthoz. + +## Hogyan választják ki a validátorokat? {#how-are-validators-selected} + +Egy adott validátor álvéletlenszerűen kerül kiválasztásra a RANDAO nevű algoritmus segítségével, hogy egy adott slotban blokkot javasoljon; ez a blokkotelőterjesztőtől származó hash-t keveri egy seed-del, amely minden blokkban frissül. Ezt az értéket használják, hogy kiválasszanak egy adott validátort a teljes szettből. A validátor kiválasztását négy korszakra előre elvégzik. + +[Bővebben a validátorkiválasztásról](/developers/docs/consensus-mechanisms/pos/block-proposal) + +## Mi az a letét grinding? {#what-is-stake-grinding} + +A letét grinding egy proof-of-stake hálózat elleni támadás, ahol a támadó megpróbálja a validátor kiválasztási algoritmust a saját validátorai javára torzítani. A RANDAO letéti grinding támadásához a teljes lekötött ETH-mennyiség felére van szükség. + +[Bővebben a letéti grindingről](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) + +## Mi az a közösségi slashing? {#what-is-social-slashing} + +A közösségi slashing a közösség azon lehetősége, hogy egy támadás esetén eldöntse a blokklánc elágazását. Ez lehetővé teszi a közösség számára, hogy helyreálljon egy helytelen láncot véglegesítő támadás esetén. A közösségi slashing a cenzoráló támadások ellen is használható. + +- [Bővebben a közösségi slashingről](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) +- [Vitalik Buterin a közösségi slashingről](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) + +## Engem is érhet súlyos büntetés (slashing)? {#will-i-get-slashed} + +Validátorként nehéz súlyos büntetést szerezni, hacsak nem valaki szándékosan rosszindulatúan viselkedik. A súlyos büntetést speciális esetekben alkalmazzák, amikor a validátorok több blokkot javasolnak ugyanabban a slotban, vagy ellentmondanak önmaguknak a tanúsításaikkal – ezek nem valószínű, hogy véletlenül előfordulnak. + +[Bővebben a súlyos büntetés feltételeiről](https://eth2book.info/altair/part2/incentives/slashing) + +## Mit jelent a nincs kockázat probléma? {#what-is-nothing-at-stake-problem} + +A nincs kockázat probléma egy koncepcionális hiányosság néhány proof-of-stake mechanizmus esetén, ahol csak jutalmak vannak, s nincsenek büntetések. Ha nincs kockázat, tehát nem lehet a letétet elveszíteni, akkor a gyakorlatias validátor ugyanúgy tanúsítja bármelyik vagy akár több elágazását is a blokkláncnak, mert ebből több jutalmat kap. Az Ethereum ezt úgy kezeli, hogy véglegességi feltételeket szab és létezik súlyos büntetés, így biztosítható a kanonikus lánc. + +[Bővebben a nincs kockázat problémáról](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) + +## Mi az az elágazásválasztó-algoritmus? {#what-is-a-fork-choice-algorithm} + +Az elágazásválasztó-algoritmus olyan szabályokat alkalmaz, amelyek meghatározzák, hogy melyik lánc a kanonikus. Optimális körülmények között nincs szükség elágazásválasztási szabályra, mivel slotonként csak egy blokkelőterjesztő van, és csak egy blokk jön létre. Alkalmanként lehetséges, hogy több blokk keletkezik ugyanarra a slotra vagy későn érkező információ miatt több lehetőség van a lánc fejéhez közeli blokkok szerveződésére. Ezekben az esetekben minden kliensnek azonos módon kell végrehajtania néhány szabályt, hogy biztosítsa, hogy a blokkok helyes sorrendjét válasszák. Az elágazásválasztó-algoritmus kódolja ezeket a szabályokat. + +Az Ethereum elágazásválasztási-algoritmusának neve LMD-GHOST. Azt az elágazást választja, amelyiknek a legnagyobb a tanúsítási súlya, vagyis amelyikre a legtöbb letétbe helyezett ETH szavazott. + +[Bővebben az LMD-GHOST-ról](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice) + +## Mit jelent a véglegesség a proof-of-stake-ben? {#what-is-finality} + +A véglegesség a proof-of-stake-ben az a garancia, hogy egy adott blokk stabil része a kanonikus láncnak, és nem lehet azt visszafordítani, kivéve, ha a konszenzus meghiúsul, és a támadó a teljes letétbe helyezett ether 33%-át elégeti. Ez egy kriptogazdasági véglegesség, szemben a „valószínűségi véglegességgel”, amely a proof-of-work blokkláncokra releváns. A valószínűségi véglegességben nincsenek explicit véglegesített/nem véglegesített státuszok a blokkok számára – egyszerűen egyre kevésbé valószínű, hogy egy blokkot el lehet távolítani a láncból, ahogy telik az idő, és a felhasználók maguk határozzák meg, hogy mikor eléggé biztosak abban, hogy egy blokk helyzete „biztonságos”. A kriptogazdasági véglegesítésnél az ellenőrzőpont blokkpárjait a letétbe helyezett ether 66%-ának kell megszavaznia. Ha ez a feltétel teljesül, akkor az ellenőrzőpontok közötti blokkok egyértelműen véglegesek. + +[Bővebben a véglegességről](/developers/docs/consensus-mechanisms/pos/#finality) + +## Mi az a „gyenge szubjektivitás”? {#what-is-weak-subjectivity} + +A gyenge szubjektivitás a proof-of-stake hálózatok egyik jellemzője, ahol a társadalmi információkat használják a blokklánc aktuális státuszának megerősítésére. Az új csomópontok vagy a hálózathoz egy hosszabb offline állapot után csatlakozó csomópontok kaphatnak egy friss állapotot, így azonnal láthatják, hogy a megfelelő láncon vannak-e. Ezeket a státuszokat a gyenge szubjektivitás ellenőrzési pontjainak nevezik, és más csomópontok üzemeltetőitől kaphatók, blokkfelfedezőktől vagy több nyilvános végponttól. + +[Bővebben a gyenge szubjektivitásról](/developers/docs/consensus-mechanisms/pos/weak-subjectivity) + +## Ellenáll a proof-of-stake a cenzúrának? {#is-pos-censorship-resistant} + +A cenzúrának való ellenállását jelenleg nehéz bizonyítani. A proof-of-work-től eltérően azonban a proof-of-stake lehetőséget ad a cenzúrázó validátorok megbüntetésére. A protokollban hamarosan szétválasztják a blokképítőket a blokkelőterjesztőktől, és bevezetik azon tranzakciók listáját, amelyeket a blokképítőknek bele kell foglalniuk a blokkba. Ez a javaslattevő-építő szétválasztás, mely segít megakadályozni, hogy a validátorok cenzúrázzák a tranzakciókat. + +[Bővebben a javaslattevő-építő szétválasztásról (PBS)](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) + +## Az Ethereum proof-of-stake rendszerét érheti 51%-os támadás? {#pos-51-attack} + +Igen. A proof-of-stake rendszer ugyanúgy ki van téve az 51%-os támadásnak, mint a proof-of-work. Ahelyett, hogy a támadónak a hálózat hash teljesítményének 51%-ára lenne szüksége, az összes letétbe helyezett ETH 51%-a kell. Az a támadó, aki a teljes letét 51%-át összegyűjti, átveszi az irányítást az elágazásválasztó-algoritmus felett. Ez lehetővé teszi a támadó számára, hogy bizonyos tranzakciókat cenzúrázzon, rövidtávú átszervezéseket végezzen, és a blokkok önérdekű átrendezésével profitot (MEV) szerezzen. + +[Bővebben a proof-of-stake-re irányuló támadásokról](/developers/docs/consensus-mechanisms/pos/attack-and-defense) + +## Mi a közösségi koordináció, és miért van rá szükség? {#what-is-social-coordination} + +A közösségi koordináció az Ethereum utolsó védelmi vonala, amely lehetővé teszi, hogy egy helyes láncot helyreállítsanak egy olyan támadásból, amely helytelen blokkokat véglegesített. Ebben az esetben az Ethereum közösségnek „sávon kívül” kellene koordinálnia és megállapodnia egy helyes kisebbségi elágazás használatában, és ezzel a támadó validálóit kizárni (slashing). Ehhez az alkalmazásokra és a tőzsdékre is szükség lenne, hogy felismerjék a helyes elágazást. + +[Bővebben a közösségi koordinációról](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) + +## A proof-of-stake-ben a gazdagok gazdagabbak lesznek? {#do-rich-get-richer} + +Minél több ETH-t tesz letétbe valaki, annál több validátort tud futtatni, és annál több jutalmat tud felhalmozni. A jutalmak lineárisan skálázódnak a letétbe helyezett ETH összegével, és mindenki ugyanannyi százalékos hozamot kap. A proof-of-work jobban gazdagítja a gazdagokat, mint a proof-of-stake, mivel a gazdagabb bányászok, akik hardvereket vásárolnak, a méretgazdaságosság előnyeit élvezik, tehát a vagyon és a jutalom közötti kapcsolat nem lineáris. + +## A proof-of-stake centralizáltabb, mint a proof-of-work? {#is-pos-decentralized} + +Nem, a proof-of-work a centralizáció felé hajlik, mivel a bányászati költségek növekednek és kiszorítják a magánszemélyeket, majd a kisebb vállalatokat, és így tovább. A proof-of-stake jelenlegi problémája a likvid letéti derivatívák (LSD) hatása. Ezek olyan tokenek, amelyek valamilyen letétbe helyezett ETH-t képviselnek, és amelyeket bárki elcserélhet a másodlagos piacokon anélkül, hogy a tényleges ETH letétet felbontanák. Az LSD-k lehetővé teszik a felhasználók számára, hogy 32 ETH-nél kevesebb letétet tegyenek, de egyúttal centralizációs kockázatot is teremtenek, ahol néhány nagy szervezet végül a letét nagy részét ellenőrizheti. Ezért az [önálló letétbe helyezés](/staking/solo) a legjobb megoldás az Ethereum számára. + +[Bővebben a letétcentralizációról az LSD-kben](https://notes.ethereum.org/@djrtwo/risks-of-lsd) + +## Miért csak ETH-t lehet letétbe helyezni? {#why-can-i-only-stake-eth} + +Az ETH az Ethereum natív valutája. Elengedhetetlen, hogy minden letét egyetlen valutában legyen, mert így lehet a súlyozott szavazatokhoz szükséges aktuális egyenlegeket venni és ez kell a biztonsághoz is. Az ETH az Ethereum alapvető összetevője, nem egy okosszerződés. Más valuták beépítése jelentősen megnövelné a bonyolultságot és csökkentené a letétek biztonságát. + +## Az Ethereum az egyetlen proof-of-stake blokklánc? {#is-ethereum-the-only-pos-blockchain} + +Nem, több proof-of-stake blokklánc létezik. Egyik sem azonos az Ethereummal, mert annak proof-of-stake mechanizmusa egyedülálló. + +## Mi az a Merge? {#what-is-the-merge} + +A Merge volt az a pillanat, amikor az Ethereum kikapcsolta a proof-of-work alapú konszenzusmechanizmusát, és bekapcsolta a proof-of-stake alapút. A Merge 2022. szeptember 15-én történt. + +[A beolvadásról bővebben](/roadmap/merge) + +## Mi az elérhetőség és a biztonság? {#what-are-liveness-and-safety} + +Az elérhetőség és a biztonság a blokklánc két alapvető biztonsági szempontja. Az elérhetőség azt jelenti, hogy a lánc véglegesedni tud. Ha a lánc véglegesedése leáll, vagy a felhasználók nem tudnak könnyen hozzáférni, akkor nem elérhető a lánc. A hozzáférés rendkívül magas költségei is elérhetőségi hibák. A biztonság arra utal, hogy mennyire nehéz a láncot megtámadni, vagyis egymásnak ellentmondó ellenőrzőpontokat véglegesíteni. + +[Bővebb információkat talál a Casper dokumentációban](https://arxiv.org/pdf/1710.09437.pdf) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/gasper/index.md new file mode 100644 index 00000000000..ffed7011082 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/gasper/index.md @@ -0,0 +1,52 @@ +--- +title: Gasper +description: A Gasper proof-of-stake mechanizmusának magyarázata. +lang: hu +--- + +A Gasper a Casper, a baráti véglegességi eszköz (Casper-FFG), és az LMD-GHOST elágazásválasztó-algoritmus kombinációja. Ezek az összetevők együttesen alkotják az Ethereum proof-of-stake-et biztosító konszenzusmechanizmust. A Casper az a mechanizmus, amely bizonyos blokkokat „véglegesre” frissít, hogy a hálózatba újonnan belépők biztosak lehessenek abban, hogy a kanonikus láncot szinkronizálják. Az elágazásválasztó-algoritmus felhalmozott szavazatokat használ, hogy a csomópontok könnyen kiválaszthassák a helyeset, amikor elágazások keletkeznek a blokkláncban. + +**Érdemes megjegyezni**, hogy a Casper-FFG eredeti definíciója kissé megváltozott a Gasperbe való beépítéshez. Ezen az oldalon a frissített változatot tekintjük át. + +## Előfeltételek + +A jelen téma könnyebb megértéséhez tekintse meg a [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) alapjairól szóló oldalt. + +## Gasper szerepe {#role-of-gasper} + +A Gasper egy proof-of-stake blokklánc tetején helyezkedik el, ahol a csomópontok biztonsági letétként ethert biztosítanak, amely megsemmisíthető, ha lusták vagy rosszhiszeműek a blokkok javaslata vagy validálása során. A Gasper az a mechanizmus, amely meghatározza, hogyan jutalmazzák és büntetik a validálókat, hogyan döntenek arról, hogy mely blokkokat fogadják el és melyeket utasítják el, és hogy a blokklánc melyik elágazására építsenek. + +## Mi az a véglegesség? {#what-is-finality} + +A véglegesség bizonyos blokkok tulajdonsága, ami azt jelenti, hogy nem lehet visszafordítani azokat, kivéve, ha kritikus konszenzushiba történt, és a támadó a teljes letétbe helyezett ether legalább 1/3-át megsemmisítette. A véglegesített blokkok olyan információt jelentenek, amelyekkel kapcsolatban a blokklánc biztos. Egy blokknak kétlépcsős frissítési eljáráson kell átesnie ahhoz, hogy véglegesítésre kerüljön: + +1. Az összes feltett ether kétharmadának kell megszavaznia, hogy az adott blokk bekerüljön a kanonikus láncba. Ez a feltétel a blokkot „érvényesített” kategóriába emeli. Az érvényesített blokkokat nem valószínű, hogy visszafordítják, de bizonyos feltételek mellett megtörténhet. +2. Ha egy másik blokkot érvényesítenek egy érvényesített blokk tetején, akkor az „véglegesített” állapotba kerül. Egy blokk véglegesítése az adott blokknak a kanonikus láncba való felvételére iránti elköteleződés. Nem lehet visszaállítani, kivéve, ha egy támadó több millió ethert (több milliárd $USD) semmisít meg. + +Ezek a blokkfrissítések nem minden slotban történnek meg. Ehelyett csak a korszakhatárhoz tartozó blokkok érvényesíthetők és véglegesíthetők. Ezeket a blokkokat ellenőrzőpontoknak nevezzük. A frissítés az ellenőrzőpontpárokat veszi figyelembe. Két egymást követő ellenőrzőpont között „szupertöbbségi kapcsolatnak” kell fennállnia (az összes letétbe helyezett ether kétharmada szavaz arra, hogy a B ellenőrzőpont az A ellenőrzőpont helyes leszármazottja) ahhoz, hogy a korábbi ellenőrzőpontot véglegesítettre, a frissebbet pedig érvényesítettre lehessen állítani. + +Mivel a véglegesítéshez kétharmados egyetértés kell a blokk kanonikus voltát illetően, egy támadó nem tud a következők nélkül alternatív véglegesített láncot létrehozni: + +1. A teljes letétbe helyezett ether kétharmadának birtoklása vagy manipulálása nélkül. +2. A letétbe helyezett ether legalább egyharmadának elpusztítása nélkül. + +Az első feltétel azért merül fel, mert egy lánc véglegesítéséhez a letétbe helyezett ether kétharmadára van szükség. A második feltétel azért van, mert ha a teljes letét kétharmada mindkét elágazás mellett szavazott, akkor egyharmadának mindkettőre szavaznia kellett. A kettős szavazás súlyos büntetést és kizárást von maga után, amelyet maximálisan büntetnének, és a teljes letét egyharmada megsemmisülne. 2022 májusától ezért egy támadónek körülbelül 10 milliárd dollár értékű ethert kellene elégetnie. A Gasperben a blokkokat érvényesítő és véglegesítő algoritmus a [Casper-FFG](https://arxiv.org/pdf/1710.09437.pdf) kissé módosított formája. + +### Ösztönzők és súlyos büntetés (slashing) {#incentives-and-slashing} + +A validátorok jutalmat kapnak a blokkok jóhiszemű előterjesztéséért és validálásáért. Ethert kapnak jutalomként, mely hozzáadódik a letétjükhöz. Másrészt, azok a validátorok, akik nem cselekszenek, amikor felszólítják őket, lemaradnak ezekről a jutalmakról, és bizonyos esetekben elveszítik meglévő letétjük egy kis részét. A távolmaradásért járó büntetések csekélyek, és a legtöbb esetben csak a jutalmak elmaradását jelentik. Ugyanakkor vannak olyan validátori műveletek, amelyeket nehéz lenne véletlenül megtenni, ezért valamilyen rosszindulatú szándékot jeleznek, például több blokkot javasolni vagy tanúsítani ugyanarra a slotra, vagy ellentmondani a korábbi ellenőrzési pontra vonatkozó szavazásnak. Ezek a viselkedésmódok súlyos büntetést vonnak maguk után komoly következményekkel: a slashing eredményeként a validátor letétjének egy része megsemmisül, a validátort pedig eltávolítják a hálózatból. Ez a folyamat 36 napig tart. Az 1. napon legfeljebb 1 ETH összegű kezdeti büntetés jár. A súlyos büntetést kapott validátor ether egyenlege lassan fogy a kilépési időszak alatt, de a 18. napon „korrelációs büntetést” kap, amely nagyobb, ha több validátor egy időben kerül kizárásra. A maximális büntetés a teljes letét. Ezek a jutalmak és büntetések arra szolgálnak, hogy ösztönözzék a becsületes validátorokat, és visszatartsák a hálózat elleni támadásokat. + +### Inaktivitási elszivárgás {#inactivity-leak} + +A biztonság mellett a Gasper „elfogadható elérhetőséget” is biztosít. Ez az a feltétel, hogy amíg az összes letétbe helyezett ether kétharmada becsületesen és a protokollt követve szavaz, a lánc képes lesz a véglegesítésre, függetlenül bármilyen más tevékenységtől (például támadások, késleltetés vagy súlyos büntetések). Másképp fogalmazva, a teljes letétbe helyezett ether egyharmadának veszélyeztetettnek kell lennie ahhoz, hogy a lánc ne tudjon véglegesedni. A Gasperben van egy további védelmi vonal az elérhetőség sérülése ellen, amelyet „inaktivitási elszivárgásként” ismerünk. Ez a mechanizmus akkor aktiválódik, amikor a blokklánc véglegesítése több mint négy korszakon keresztül meghiúsul. Azoknak a validátoroknak, akik nem tanúsítják aktívan a többségi láncot, a letétjük fokozatosan elszivárog, amíg a többség vissza nem nyeri a teljes letét kétharmadát, így az elérhetőség sérülése csak átmeneti. + +### Elágazásválasztás {#fork-choice} + +A Casper-FFG eredeti definíciója tartalmazott egy elágazásválasztó algoritmust a szabállyal: `kövesse azt a láncot, amely a legnagyobb magasságú érvényesített ellenőrzőpontot tartalmazza`, ahol a magasságot a genezisblokktól való távolságként határozzuk meg. A Gasperben az eredeti elágazásválasztási szabályt lecserélték egy kifinomultabb, LMD-GHOST nevű algoritmusra. Fontos megérteni, hogy normális körülmények között az elágazásválasztási szabály szükségtelen, mert minden slothoz egyetlen blokkajánló tartozik, és ezt a jóhiszemű validátorok tanúsítják. Csak nagy hálózati aszinkronitás esetén, vagy ha egy rosszhiszemű blokkajánló kétértelműen nyilatkozott, van szükség elágazásválasztó algoritmusra. Ha azonban ezek az esetek mégis bekövetkeznek, ez az algoritmus kritikus védelmet jelent, s biztosítja a helyes láncot. + +Az LMD-GHOST a következő kifejezés rövidítése: latest message-driven greedy greedy heaviest observed sub-tree (a legutolsó üzenet által vezérelt, mohó, legsúlyosabb részfa). Ez egy nehézkes meghatározása annak, hogy a tanúsítások legnagyobb összesített súlyával rendelkező elágazást választja ki kanonikusnak (mohó legsúlyosabb részfa), és ha több üzenet érkezik egy validátortól, csak a legutolsót veszi figyelembe (legutolsó üzenet által vezérelt). Mielőtt a legnehezebb blokkot hozzáadná a kanonikus láncához, minden validátor minden blokkot e szabály alapján értékel. + +## További olvasnivaló {#further-reading} + +- [Gasper: A GHOST és a Casper kombinációja](https://arxiv.org/pdf/2003.03052.pdf) +- [Casper, a baráti véglegességi eszköz (Friendly Finality Gadget)](https://arxiv.org/pdf/1710.09437.pdf) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/index.md index a72ec0f7e8d..b1e58f4296d 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/index.md @@ -1,91 +1,92 @@ --- title: Proof-of-stake (PoS) -description: Egy magyarázat a proof-of-stake konszenzus protokollról és az Ethereumban betöltött szerepéről. +description: A proof-of-stake konszenzusprotokoll és az Ethereumban betöltött szerepének bemutatása. lang: hu -incomplete: true --- -Az Ethereum átmegy a [proof-of-work-ről (PoW)](/developers/docs/consensus-mechanisms/pow/) egy másik konszenzus mechanizmusba, melyet proof-of-stake-nek hívunk. Mindig is ez volt a terv, mivel ez egy kulcs eleme a közösség stratégiájának az Ethereum skálázására vonatkozóan [az Eth2 fejlesztések](/roadmap/) által. Azonban a PoS megfelelő bevezetése egy nagy technikai kihívás és nem annyira egyértelmű, mint a PoW használata, hogy elérjük a konszenzust a teljes hálózaton. +Az Ethereum [konszenzusmechanizmusa](/developers/docs/consensus-mechanisms/) a proof-of-stake (PoS) koncepción alapul. Az Ethereum 2022-ben váltott a proof-of-stake mechanizmusra, mivel biztonságosabb, kevésbé energiaintenzív és jobban megfelel az új méretezési megoldások bevezetéséhez, mint a korábbi [proof-of-work](/developers/docs/consensus-mechanisms/pow) architektúra. ## Előfeltételek {#prerequisites} -Hogy jobban megértsd az oldal anyagát, javasoljuk, hogy előbb olvasd el a [konszenzus mechanizmusok](/developers/docs/consensus-mechanisms/) cikket. +Az oldal könnyebben megértéséhez javasoljuk, hogy tekintse meg a [konszenzusmechanizmusok](/developers/docs/consensus-mechanisms/) cikket. -## Mi az a proof-of-stake (Pos)? {#what-is-pos} +## Mi az a proof-of-stake (PoS)? {#what-is-pos} -A proof-of-stake a [konszenzus mechanizmusok](/developers/docs/consensus-mechanisms/) egy típusa, melyet arra használunk, hogy elérjük az megosztott konszenzust egy blokklánc hálózaton. +A proof-of-stake (letéti igazolás) egy módja annak bizonyítására, hogy a validátorok valamilyen értéket helyeztek a hálózatba, amely tisztességtelen cselekedet esetén megsemmisíthető. Az Ethereum proof-of-stake mechanizmusánál a validátorok ETH formájában zárolják tőkéjüket az Ethereumon található okosszerződésben. A validátor feladata annak ellenőrzése, hogy a hálózaton keresztül terjesztett új blokkok érvényesek, és adott esetben ő maga is új blokkokat hoz létre és terjeszt elő. Ha megpróbálják meghamisítani a hálózatot (például egy helyett több blokkot javasolnak, vagy egymásnak ellentmondó tanúsításokat küldenek), a letétbe helyezett ETH egy része vagy egésze megsemmisülhet. -Az ETH letétbe helyezését igényli a felhasználók részéről, akik validátorrá válnak a hálózaton. A validátorok ugyanazért felelősek, mint a bányászok a [proof-of-work-ben](/developers/docs/consensus-mechanisms/pow/): tranzakciókat rendeznek és új blokkokat hoznak létre, így az összes csomópont egyetérthet a hálózat állapota felett. +## Validátorok {#validators} -A proof-of-stake rendszer számos javulást kínál a proof-of-work rendszerrel szemben: +A validátorként való részvételhez a felhasználónak 32 ETH-t kell egy letéti szerződésben zárolnia, és három különböző szoftvert kell futtatnia: egy végrehajtási klienst, egy konszenzusklienst és egy validátorklienst. Az ETH letétbe helyezésével a felhasználó beáll egy aktiválási sorba, amely korlátozza az új validátorok hálózathoz való csatlakozásának ütemét. Az aktiválást követően a validátorok új blokkokat kapnak a társaiktól az Ethereum-hálózaton. A blokkban szállított tranzakciókat újra végrehajtják, hogy ellenőrizzék, hogy az Ethereum státuszában javasolt változások érvényesek-e, és ellenőrzik a blokk aláírását. A validátor ezután szavazatot (ún. tanúsítást) ad le az adott blokkra a hálózaton keresztül. -- nagyobb energia hatékonyság – nem kell sok energiát blokkok bányászatára áldozni -- alacsonyabb belépési korlátok, csökkentett hardver követelmények – nem kell elit hardverrel rendelkezned, hogy esélyed legyen új blokkok létrehozására -- erősebb ellenálló képesség a centralizáltság ellen – a proof-of-stake több csomópont létrejöttéhez vezethet a hálózatban -- a shard láncok nagyobb fokú támogatása – egy fontos fejlesztés az Ethereum hálózat skálázásában +Amíg a proof-of-work esetében a blokkidőt a bányászati nehézség határozza meg, addig a proof-of-stake esetén a tempó rögzített. A proof-of-stake Ethereum esetén az idő (12 másodperces) slotokra és korszakokra (1 korszak = 32 slot) oszlik. A rendszer minden slotban véletlenszerűen kiválaszt egy validátort a blokk előterjesztésére. Ez a validátor felel az új blokk létrehozásáért és elküldéséért a hálózat többi csomópontja felé. Emellett a rendszer minden slotban véletlenszerűen megválaszt egy validátorbizottságot, amelynek a szavazatai döntenek az előterjesztett blokk érvényességéről. A validátorok bizottságokra való felosztása fontos a hálózati terhelés kezelhetősége szempontjából. A bizottságok úgy osztják fel a validátorhalmazt, hogy minden aktív validátor minden korszakban tanúsít, de nem minden slotban. -## Proof-of-stake, letétbe helyezés, és a validátorok {#pos-staking-validators} +## Hogyan kerülnek végrehajtásra a tranzakciók az Ethereum proof-of-stake mechanizmusban {#transaction-execution-ethereum-pos} -Proof-of-stake a mögöttes mechanizmus, mely aktiválja a validátorokat, amint megfelelő mennyiségű tőke került letétbe. Az Ethereum felhasználóknak 32 ETH-et kell letenni, hogy validátorok lehessenek. A validátorok véletlenszerűen kerülnek kiválasztásra, hogy blokkokat hozzanak létre, továbbá felelősek azon blokkok ellenőrzéséért és megerősítéséért, melyeket nem ők hoznak létre. A felhasználó letéte oly módon kerül felhasználásra, hogy ösztönözze a jó viselkedést. Például egy felhasználó elveszítheti a letéte egy részét az olyan dolgokért, ha például offline állapotba (nem validál) kerül, vagy a teljes letétet szándékos összejátszásért. +Az alábbiakban egy teljes magyarázatot adunk arról, hogyan hajtanak végre egy tranzakciót az Ethereum proof-of-stake-ben. -## Hogyan működik az Ethereum proof-of-stake? {#how-does-pos-work} +1. A felhasználó létrehoz és aláír egy [tranzakciót](/developers/docs/transactions/) a privát kulcsával. Ezt általában egy tárca vagy egy könyvtár, például [ether.js](https://docs.ethers.io/v5/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) stb. kezeli, eközben a háttérben a felhasználó az Ethereum [JSON-RPC API](/developers/docs/apis/json-rpc/) segítségével kérést intéz egy csomóponthoz. A felhasználó meghatározza, hogymennyi gázt fizet borravalóként a validátornak, hogy az felkapja az adott tranzakciót és betegye egy blokkba. A [borravalót](/developers/docs/gas/#priority-fee) megkapja a validátor, az [alapdíjat](/developers/docs/gas/#base-fee) pedig elégeti a rendszer. +2. A tranzakciót beküldik az Ethereum [végrehajtási klienshez](/developers/docs/nodes-and-clients/#execution-client), hogy ellenőrizze az érvényességét. Ennek része, hogy a küldőnek van elég ETH összege, hogy végre legyen hajtva a tranzakció és a megfelelő kulccsal írta azt alá. +3. Ha a tranzakció érvényes, a végrehajtási kliens a helyi tranzakciógyűjtőjéhez (mempool, a függő tranzakciók listája) adja és elterjeszti a többi csomópontnak a végrehajtási réteg pletykahálózatán. Amikor a többi csomópont hall a tranzakcióról, akkor azok is beteszik a helyi tranzakciógyűjtőjükbe. A haladó felhasználók úgy is dönthetnek, hogy nem a hálózaton terjesztik el a tranzakciójukat, hanem továbbíthatják azt speciális blokképítőknek, mint a [Flashbots aukció](https://docs.flashbots.net/flashbots-auction/overview). Ez lehetővé teszi számukra, hogy a tranzakciókat a következő blokkokba szervezzék a maximális profit érdekében ([MEV](/developers/docs/mev/#mev-extraction)). +4. A hálózat egyik csomópontja az aktuális slot blokkelőterjesztője, amelyet előzőleg a RANDAO segítségével álvéletlenszerűen kiválasztottak. Ez a csomópont felelős az Ethereum blokklánchoz hozzáadandó következő blokk létrehozásáért és továbbításáért, valamint a globális státusz frissítéséért. A csomópont három részből áll: végrehajtási kliens, konszenzuskliens és validátorkliens. A végrehajtási kliens a tranzakciókat a helyi mempoolból egy végrehajtási csomagba rendezi, és helyben végrehajtja őket, hogy státusztváltozást generáljon. Ezt az információt továbbítják a konszenzuskliensnek, ahol a végrehajtási csomagot egy Beacon-blokk részeként csomagolják be, amely a jutalmakra, büntetésekre, súlyos büntetésekre, tanúsításokra stb. vonatkozó információkat is tartalmaz, amelyek lehetővé teszik a hálózat számára, hogy megállapodjon a lánc élén álló blokkok sorrendjében. A végrehajtási és a konszenzuskliensek közötti kommunikáció részletesebb leírása a [A konszenzus és a végrehajtási kliensek összekapcsolása](/developers/docs/networking-layer/#connecting-clients) című cikkben található. +5. A többi csomópont az új Beacon-blokkot a konszenzusréteg pletykahálózatán keresztül kapja meg. Átadják azt a saját végrehajtási kliensüknek, ami a tranzakciókat helyben újra végrehajtja, így megbizonyosodnak arról, hogy érvényes a javasolt státuszváltozás. A validátorkliens ezután tanúsítja, hogy a blokk érvényes, és logikailag ez a következő blokk a láncban (vagyis az [elágazásválasztási szabályok](/developers/docs/consensus-mechanisms/pos/#fork-choice) szerint a legnagyobb tanúsítási súllyal bíró láncra épül). A blokk hozzáadódik a helyi adatbázishoz minden olyan csomópontban, amely tanúsítja azt. +6. A tranzakció akkor tekinthető „véglegesítettnek”, ha egy olyan lánc részévé vált, amelyben két ellenőrzőpont között „szupertöbbségi kapcsolat” van. Az ellenőrzési pontok minden korszak kezdetén fordulnak elő, és azért vannak, mert az aktív tanúsítóknak csak egy részhalmaza tanúsít minden slotban, de az összes aktív tanúsító minden korszakban tanúsít. Ezért csak a korszakok között lehet „szupertöbbségi kapcsolat” (mikor a hálózaton lévő összes letétbe helyezett ETH 66%-a egyetért két ellenőrzőponton). -Ellentétben a proof-of-work-kel, a validátoroknak nem kell jelentős mennyiségű számítási erőt felhasználniuk, mivel véletlenszerűen kerülnek kiválasztásra és nem kell versenyezniük. Nem kell blokkokat bányászniuk, csak blokkokat kell létrehozniuk, amikor kiválasztásra kerülnek, és validálni a javasolt blokkokat, amikor nem. Ezt a validálást tanúsításnak hívjuk. Gondolj a tanúsításra úgy, mintha azt mondanánk "ez a blokk nekem jónak tűnik". A validátorok jutalmat kapnak új blokkok felterjesztéséért és azon blokkok tanúsításáért, amiket láttak. +A véglegesedésről a következő szekcióban bővebb információkat találhat. -Ha tanúsítasz egy rosszindulatú blokkot, akkor elveszted a letéted. +## Véglegesség {#finality} -### A Beacon Chain {#the-beacon-chain} +Az elosztott hálózatokban egy tranzakció „véglegessé” válik, amikor egy olyan blokk része lesz, amelyet csak jelentős mennyiségű ETH elégetésével lehet megváltoztatni. A proof-of-stake Ethereum-hálózata ezt az úgynevezett „ellenőrző pont” blokkokkal éri el. Minden korszak első blokkja egy ellenőrzőpont. A validátorok szavaznak az általuk érvényesek tartott ellenőrzőpontpárokra. Ha egy ellenőrzőpontpár megkapja legalább az összes letétbe helyezett ETH kétharmadát képviselő szavazatmennyiséget, akkor a ellenőrzőpontok frissülnek. A kettő közül a későbbi (célblokk) „igazolt” állapotba kerül. A kettő közül a korábbi már igazolt állapotú, mivel az előző korszak „célblokkja” volt. Ez a blokk „véglegesített” állapotba kerül. -Amikor az Ethereum leváltja a proof-of-work-öt a proof-of-stake-kel, hozzáadott komplexitás fog életbe lépni a [shard láncok](/roadmap/danksharding/) által. Ezek különálló blokkláncok, melynek szükségük van validátorokra, hogy tranzakciókat dolgozzanak fel és új blokkokat hozzanak létre. A terv az, hogy 64 shard láncot fogunk létrehozni, melyeknek megosztottan egyet kell érteniük a hálózat állapotára vonatkozóan. Így további koordináció szükségeltetik, ezt pedig [a beacon chain](/roadmap/beacon-chain/) fogja biztosítani. +Egy véglegesített blokk visszaalakításához egy támadónak legalább a letétbe helyezett összes ETH egyharmadát fel kellene áldoznia. Ennek pontos okát az [Ethereum Alapítvány blogposztja](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) részletesen ismerteti. Mivel a véglegességhez kétharmados többség szükséges, egy támadó a teljes ETH-letét egyharmadával szavazva akadályozhatja meg, hogy a hálózat véglegesítse a blokkot. Létezik egy mechanizmus, amellyel védekezni lehet ez ellen: ez az [inaktivitási elszivárgás](https://eth2book.info/bellatrix/part2/incentives/inactivity). Akkor aktiválódik, amikor a blokklánc véglegesítése több mint négy korszakon keresztül meghiúsul. Az inaktivitási elszivárgás elfolyatja a többség ellen szavazó validátorok ETH-letétjét, ezzel lehetővé teszi, hogy a többség visszaszerezze a kétharmados többséget és véglegesítse a láncot. -A Beacon Chain állapot információkat kap a shardoktól, melyet elérhetővé tesz a többi shard számára, hogy azok szinkronban tudjanak maradni. A Beacon Chain fogja kezelni a validátorokat is a letétbetételtől egészen a jutalmak és büntetések kiosztásáig. +## Kriptogazdasági védelem {#crypto-economic-security} -Így működik ez a folyamat. +Egy validátor futtatása elkötelezettséget jelent. A validátortól elvárják, hogy megfelelő hardvert és internetkapcsolatot tartson fenn a blokkvalidálásban és előterjesztésben való részvételhez. Cserébe a validátor ETH-kifizetést kap (növekszik a letéti egyenlege). Ugyanakkor a validátorként való részvétel új lehetőségeket kínál a felhasználóknak, hogy megtámadják a hálózatot személyes haszon vagy szabotázs céljából. Ez ellen hat, hogy a validátorok elveszítik az ETH-jutalmakat, ha nem vesznek részt a folyamatban, és a meglévő letétjük is megsemmisülhet, ha rosszhiszeműen viselkednek. Két fő rosszhiszemű viselkedési mód van: egy sloton belül több blokk előterjesztése (kétértelműsítés), valamint az ellentmondásos tanúsítások elküldése. -### Hogyan működik a validálás {#how-does-validation-work} +A megvágott ETH-mennyiség azon múlik, hogy ugyanabban az időben hány másik validátor ETH-letétjét vágja még meg a rendszer. Ez az úgynevezett [„korrelációs bírság”](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty), amelynek mértéke lehet csekély (a letét ~1%-a az egyedülálló validátornál), de eredményezheti akár a validátori letét 100%-ának elvesztését (tömeges megvágási esemény). Egy kényszerített kilépési periódus felénél szabja ki a rendszer, amely egy azonnali bírsággal (legfeljebb 1 ETH) kezdődik az 1. napon, majd korrelációs bírsággal folytatódik a 18. napon, végül a hálózatból való kivetéssel fejeződik be a 36. napon. Kis összegű tanúsítási bírságot kapnak minden nap, mert jelen vannak a hálózaton, de nem adnak le szavazatot. Ez mind azt jelenti, hogy egy koordinált támadás nagyon költséges lenne a támadó számára. -Amikor elindítasz egy tranzakciót egy shardon, egy validátornak lesz a felelősége, hogy a tranzakciót egy shard blokkba foglalja. A validátorokat algoritmikusan választja a ki a beacon chain új blokkok javaslatára. +## Elágazásválasztás {#fork-choice} -#### Tanúsítás {#attestation} +Amikor a hálózat optimálisan és becsületesen működik, akkor mindig csak egy blokk van a lánc elején, és minden validátor tanúsítja azt. Mindazonáltal lehetséges, hogy hálózati látencia vagy a blokkelőterjesztő kétértelmű javaslata miatt a validátorok eltérően látják a lánc elejét. Ezért a konszenzusklienseknek egy algoritmusra van szükségük, hogy eldöntsék, melyiket részesítsék előnyben. A proof-of-stake Ethereum által használt algoritmus az [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf), és úgy működik, hogy azonosítja az előzmények szerint a tanúsítások legnagyobb többségét magáénak tudó elágazást (fork). -Ha a validátort nem választják ki, hogy új shard blokkot javasoljon, akkor tanúsítania kell egy másik validátor által javasolt blokkot, és meg kell erősítenie, hogy minden úgy van, ahogy lennie kell. A tanúsítás az, ami feljegyzésre kerül a beacon chainen, nem pedig maga a tranzakció. +## Proof-of-stake és biztonság {#pos-and-security} -Legalább 128 validátorra van szükség minden egyes shard blokk tanúsítására – ezt úgy hívjuk, hogy "bizottság". +Egy [51%-os támadás](https://www.investopedia.com/terms/1/51-attack.asp) veszélye a proof-of-work architektúrához hasonlóan a proof-of-stake konszenzusnál is fennáll, ám itt még kockázatosabb a támadók számára. A támadónak a letétbe helyezett ETH-mennyiség 51%-ára volna szüksége. Így a saját tanúsításai segítségével biztosíthatná, hogy az általa előnyben részesített elágazás (fork) szerezze meg a legtöbb tanúsítást. A felhalmozott tanúsítások „súlya” az, amit a konszenzuskliensek a helyes lánc meghatározásához használnak, tehát ez a támadó képes volna általánosan elfogadottá tenni a saját elágazását. Ugyanakkor a proof-of-work konszenzussal szemben a proof-of-stake erőssége az ellentámadás rugalmas bevezetésében rejlik. Például a becsületes validátorok dönthetnek úgy, hogy tovább építik a kisebbségi láncot, és figyelmen kívül hagyják a támadó elágazását, és ugyanerre biztatják az alkalmazásokat, a tőzsdéket és az alapokat is. Úgy is határozhatnak, hogy erőszakkal eltávolítják a támadót a hálózatról, és megsemmisítik az ETH-letétjét. Ezek erős gazdaságvédelmet jelentenek az 51%-os támadások ellen. -A bizottság számára rendelkezésre áll egy időkeret, melyben javasolnak és validálnak egy shard blokkot. Ezt úgy hívjuk, hogy "slot". Csak egy érvényes blokk jön létre egy slotban. 32 slot van egy "korszakban (epoch)". Minden egyes korszak után a bizottság feloszlik és újra alakul más, random résztvevőkkel. Ez megóvja a shardokat az ártalmas bizottságoktól. +Az 51%-os támadás csak egyetlen típusa a rosszindulatú tevékenységeknek. A rosszindulatú szereplők próbálkozhatnak nagy hatóidejű támadással (habár ezt a véglegesítési procedúra kiküszöböli), rövid hatóidejű átszervezésekkel (az előterjesztő megerősítése és a tanúsítási határidők semlegesítik ezt a kockázatot), bouncing (pattogó) és balancing (egyensúlyozó) támadásokkal (az előterjesztő megerősítése ezeket is kezeli, és ilyet eddig csak ideális hálózati feltételek mellett indítottak), illetve lavina támadásokkal (amelyeket az elágazásválasztó algoritmusok azon szabálya semlegesít, hogy kizárólag a legutolsó üzenetet veszik figyelembe). -#### Kereszt kapcsolatok (crosslinks) {#rewards-and-penalties} +Összességében a proof-of-stake – ahogy azt az Ethereum megvalósította – gazdasági szempontból bizonyítottan védettebb, mint proof-of-work. -Ha egy shard blokk javaslatnak elég tanúsítása van, egy "kereszt kapcsolat" jön létre, mely megerősíti a blokk befoglaltságát és a tranzakciódat a beacon chainen. - -Amint létrejön a kereszt kapcsolat, a validátor aki a blokkot javasolta megkapja a jutalmát. - -#### Véglegesség {#finality} - -Az elosztott hálózatoknál egy tranzakciónak "véglegessége" van, amikor egy olyan blokkban van, ami nem tud megváltozni. - -Hogy ez működjön a proof-of-stake-ben, Casper, egy véglegesítő protokoll ráveszi a validátorokat, hogy értsenek egyet egy adott blokk állapota felett bizonyos ellenőrzési pontokon. Amint a validátorok 2/3-a egyetért, a blokk véglegesítődik. A validátorok elvesztik a teljes letétüket, ha megpróbálják ezt visszaállítani egy 51%-os támadás keretében. - -Ahogy Vlad Zamfir fogalmaz: ez olyan, mintha egy bányász részt venne egy 51%-os támadásban, ami miatt a bányászati hardvere azonnal megsemmisülne. - -## Proof-of-stake és biztonság +## Előnyök és hátrányok {#pros-and-cons} -Egy [51%-os támadás](https://www.investopedia.com/terms/1/51-attack.asp) veszélye még így is fennáll a proof-of-stake-ben, de még kockázatosabb a támadók számára. A támadáshoz irányítanod kell a letétbe helyezett ETH 51%-át. Ez nem csak hogy rengeteg pénz, de valószínűleg az ETH árfolyam esését váltaná ki. Nagyon kicsi ösztönző van arra, hogy elpusztítsd a valuta értékét, melyben többségi tulajdonrészed van. Vannak erősebb ösztönzők arra, hogy a hálózatot biztonságban és egészségben tartsuk. +| Előnyök | Hátrányok | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | +| A letétbe helyezés az egyének számára megkönnyíti a részvételt a hálózat biztosításában, ezzel elősegíti a decentralizációt. Validátor-csomópont egy átlagos laptopon is futtatható. A letéti alapok lehetővé teszik, hogy a felhasználók akkor is részt vegyenek, ha nincs 32 ETH-jük. | A proof-of-stake fiatalabb és még kevésbé tesztelt, mint a proof-of-work. | +| A letétbe helyezés decentralizáltabb. A méretgazdaságosság nem úgy érvényesül, mint a PoW-bányászat esetén. | A proof-of-stake esetén a megvalósítás bonyolultabb, mint a proof-of-work konszenzusnál. | +| A proof-of-stake erősebb kriptogazdasági védelmet kínál, mint a proof-of-work. | A felhasználóknak három szoftvert kell futtatniuk, hogy részt vehessenek az Ethereum proof-of-stake konszenzusában. | +| Kevesebb új ETH-t kell kibocsátani a hálózati résztvevők ösztönzéséhez. | | -Letét megvágások, kidobások és több más büntetés, melyet a beacon chain koordinál, fogja megakadályozni az ártalmas cselekedeteket. A validátorok felelőssége lesz ezen incidensek megjelölése is. +### Összehasonlítása a proof-of-work mechanizmussal {#comparison-to-proof-of-work} -## Előnyök és hátrányok {#pros-and-cons} +Az Ethereum korábban nem proof-of-stake alapú hálózat volt. Kezdetben proof-of-work mechanizmust használt. A váltás 2022 szeptemberében történt. A proof-of-stake a következő előnyöket hozta a korábbihoz képest: -| Előnyök | Hátrányok | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| A staking egyszerűbbé teszi, hogy egy csomópontot működtess. Nem igényel nagy hardver vagy energia befektetést. És ha nincs elég ETH-ed, amit letétbe tudnál helyezni, akkor csatlakozhatsz letéti alapokhoz. | A proof-of-stake még mindig korai fázisában van és kevésbé van kipróbálva összehasonlítva a proof-of-work-kel | -| A staking decentralizáltabb. Nagyobb részvételi arányt tesz lehetővé, és a nagyobb csomópont mennyiség nem jelent megnövekedett százalékos hozamot, mint a bányászatnál. | | -| A staking lehetővé teszi a biztonságos shardingot. A shard láncok lehetővé teszik az Ethereum számára, hogy egyszerre több blokk jöjjön létre, mely megnöveli a tranzakciók mennyiségét. Ha egy proof-of-work rendszerbe szeretnénk shardingot bevezetni az azt jelentené, hogy lecsökkentjük a hálózat egy részének szétbomlasztásához szükséges energiát. | | +- nagyobb energiahatékonyság – nincs szükség sok energia felhasználására a proof-of-work számításokhoz; +- alacsonyabb belépési korlát, csökkentett hardverkövetelmények – nincs szükség csúcstechnológiás hardverre ahhoz, hogy esélyünk legyen új blokkot létrehozni; +- kisebb centralizációs kockázat – a proof-of-stake architektúra több csomópont részvételét eredményezi a hálózat biztosításában; +- az alacsony energiaszükséglet miatt kevesebb ETH-t kell kibocsátani a részvételre ösztönzéshez; +- a szabálytalan viselkedés gazdasági büntetése miatt a proof-of-work architektúrához képest magasabb költséggel jár az 51%-os típusú támadás a támadó számára; +- ha egy 51%-os támadás legyűri a kriptogazdasági védelmi rendszert, a közösség dönthet egy becsületes blokklánc közösségi visszaállítása mellett. ## További olvasnivaló {#further-reading} -- [What is Proof of Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ -- [The Beacon Chain Ethereum 2.0 explainer you need to read first](https://ethos.dev/beacon-chain/) _Ethos.dev_ +- [Proof-of-Stake GYIK](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Mi az a Proof-of-Stake?](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ +- [Mi az a Proof-of-Stake és miért fontos?](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ +- [Miért a Proof-of-Stake? (2020. november)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Proof-of-Stake: Hogyan tanultam meg szeretni a gyenge szubjektivitást](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ +- [Proof-of-stake Ethereum – támadás és védekezés](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [A proof-of-stake tervezési filozófiája](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ +- [Videó: Vitalik Buterin elmagyarázza a proof-of-stake mechanizmust Lex Fridmannak](https://www.youtube.com/watch?v=3yrqBG-7EVE) ## Kapcsolódó témák {#related-topics} diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/keys/index.md new file mode 100644 index 00000000000..546cc91ff69 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -0,0 +1,96 @@ +--- +title: A kulcsok a proof-of-stake Ethereumban +description: Magyarázat az Ethereum proof-of-stake konszenzusmechanizmusában használt kulcsokról +lang: hu +--- + +Az Ethereum a publikus-privát kulcspáron alapuló kriptográfia segítségével biztosítja a felhasználói eszközöket. A publikus kulcs az Ethereum-cím alapjául szolgál, tehát látható, és egyedi azonosítóként használják. A privát (vagy titkos) kulcshoz mindig csak a számla tulajdonosa férhet hozzá. A privát kulcsot tranzakciók és adatok aláírására használják, hogy a kriptográfia bizonyítani tudja, hogy a tulajdonos jóváhagyja az adott privát kulcs műveletét. + +Az Ethereum kulcsait [elliptikus görbe kriptográfiával](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography) generálják. + +Amikor azonban az Ethereum [proof-of-work](/developers/docs/consensus-mechanisms/pow) mechanizmusról [proof-of-stake-re](/developers/docs/consensus-mechanisms/pos) váltott, egy új típusú kulcs került az Ethereumba. Az eredeti kulcsok továbbra is pontosan ugyanúgy működnek, mint korábban – a számlákat biztosító elliptikus görbén alapuló kulcsok nem változtak. A felhasználóknak azonban új típusú kulcsra volt szükségük ahhoz, hogy részt vehessenek a proof-of-stake-ben az ETH letétbe helyezésével és a validátorok futtatásával. Ez az igény a skálázhatóság miatt érdekes, hogy a nagyszámú validátorok közötti üzenetekhez olyan kriptográfiai módszer legyen, amely könnyen aggregálható, így csökkenti a hálózati konszenzus kommunikációs igényét. + +Ez az új típusú kulcs a [**Boneh-Lyn-Shacham (BLS)** aláírási sémát használja](https://wikipedia.org/wiki/BLS_digital_signature). A BLS lehetővé teszi az aláírások nagyon hatékony aggregálását, ugyanakkor az aggregált egyedi validátorkulcsok visszafejtését is, és ideális a validátorok közötti műveletek kezelésére. + +## A validátorkulcsok két típusa {#two-types-of-keys} + +A proof-of-stake-re való átállás előtt az Ethereum-felhasználóknak csak egyetlen elliptikus görbén alapuló privát kulccsal volt hozzáférésük a pénzükhöz. A proof-of-stake bevezetésével az önálló letétbe helyezőknek szükségük volt egy **validátorkulcsra** és egy **kivételi kulcsra** is. + +### A validátorkulcs {#validator-key} + +A validátor aláírókulcs két elemből áll: + +- Validátor **privát** kulcs +- Validátor **publikus** kulcs + +A validátor privát kulcsának célja a láncban végrehajtott műveletek, például a blokkjavaslatok és a tanúsítások aláírása. Emiatt ezeket a kulcsokat egy „forró” tárcában kell tartani (mindig online elérhető legyen). + +Ennek a rugalmasságnak az az előnye, hogy a validátor aláírókulcsok gyorsan mozgathatók egyik eszközről a másikra, azonban ha elvesznek vagy ellopják azokat, a tolvaj többféleképpen is képes lehet **visszaélni** azokkal: + +- A validátort súlyos és kizárással járó büntetés éri: + - Amikor blokkelőterjesztő, akkor két különböző Beacon blokkot jvasol és ír alá ugyanarra a slotra + - Tanúsítóként olyan tanúsítást hagy jóvá, ami „körbeölel” egy másikat + - Tanúsítóként két eltérő tanúsítást ír alá ugyanarra a dologra +- Önkéntes kilépésre kényszeríti, amely a validáló letétjét feloldja és a kivételi kulcs tulajdonosa hozzáfér az ETH egyenleghez + +A **validátor publikus kulcsa** szerepel a tranzakció adataiban, amikor egy felhasználó ETH-t fizet be a letéti szerződésbe. Ez az úgynevezett _letéti adat_, amely lehetővé teszi az Ethereum számára a validátor azonosítását. + +### Kivételi hitelesítő adatok {#withdrawal-credentials} + +Minden validátor rendelkezik egy tulajdonsággal, amelyet _visszavonási hitelesítő adatoknak_ neveznek. Ez a 32 bájtos mező vagy `0x00`-val kezdődik, ami a BLS kivonási hitelesítő adatokat jelenti, vagy` 0x01`-gyel, ami a végrehajtási címre mutató hitelesítő adatokat jelenti. + +A `0x00` BLS kulcsokkal rendelkező validátoroknak frissíteniük kell ezeket a hitelesítő adatokat, hogy azok egy végrehajtási címre mutassanak a többletegyenleg kifizetéséhez vagy a letétkivonáshoz. Ezt úgy lehet megtenni, hogy a kezdeti kulcsgenerálás során a letétbe helyezési adatokban megadunk egy végrehajtási címet, _VAGY_ úgy, hogy a kivételi kulcsot egy későbbi időpontban felhasználjuk egy `BLSToExecutionChange` üzenet aláírására és továbbítására. + +### A kivételi kulcs {#withdrawal-key} + +A kivételi kulcsra a kivételi hitelesítő adatok frissítéséhez van szükség, hogy azok egy végrehajtási címre mutassanak, ha a kezdeti befizetés során ezt nem állították be. Ez lehetővé teszi a felhasználók számára a többletegyenleg kifizetését, és a letétbe helyezett ETH teljes kivételét is. + +Ahogy a validátorkulcsok, a kivételi kulcsok is két elemből állnak: + +- Kivételi **privát** kulcs +- Kivételi **publikus** kulcs + +Ennek a kulcsnak az elvesztése a kivételi hitelesítő adatok `0x01` típusra történő frissítése előtt a validátoregyenleghez való hozzáférés elvesztését jelenti. A validátor továbbra is aláírhatja a tanúsításokat és a blokkokat, mivel ezekhez a műveletekhez a validátor privát kulcsa szükséges, azonban a kivételi kulcsok elvesztése miatt erre igen kevés a motivációja. + +A validátorkulcsok és az Ethereum számlakulcsok szétválasztása lehetővé teszi, hogy egyetlen felhasználó több validátort is futtasson. + +![validátorkulcs ábra](validator-key-schematic.png) + +## Kulcsok származtatása egy kulcsmondatból {#deriving-keys-from-seed} + +Ha minden 32 ETH feltöltéséhez 2 független kulcsból álló új készletre lenne szükség, a kulcskezelés nehézkessé válna, különösen a több validátort futtató felhasználók számára. Ehelyett több validátorkulcsot lehet egyetlen titokból levezetni, és ennek a titoknak a tárolása lehetővé teszi a hozzáférést több validátorkulcshoz. + +[A mnemotechnika](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) és az útvonalak olyan kiemelkedő jellemzők, amelyekkel a felhasználók gyakran találkoznak, amikor [hozzáférnek](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) a tárcájukhoz. A mnemonika egy szavakból álló sorozat, amely a privát kulcs kezdeti magjaként szolgál. További adatokkal kombinálva a mnemonika egy „mesterkulcs” néven ismert hash-t generál. Ezt úgy lehet elképzelni, mint egy fa gyökerét. Ebből a gyökérből hierarchikus útvonal segítségével elágazások vezethetők le, így a gyermek csomópontok a szülői csomópont hash-jének és a fán belüli indexének kombinációjaként létezhetnek. Tekintse meg a [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) és [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) szabványokat a mnemonikus alapú kulcsgeneráláshoz. + +Ezek az útvonalak a következőképpen néznek ki, ami ismerős lehet azoknak, akik már dolgoztak hardvertárcákkal: + +``` +m/44'/60'/0'/0` +``` + +Az ebben az elérési útvonalban lévő perjelek a következőképpen választják el a privát kulcs összetevőit: + +``` +master_key / purpose / coin_type / account / change / address_index +``` + +Ez a logika lehetővé teszi a felhasználók számára, hogy egyetlen **mnemonikus kifejezéshez** a lehető legtöbb validátort csatolják, mivel a fa gyökere közös lehet, és a differenciálás az elágazásokban történhet. A felhasználó **a mnemonikus kifejezésből tetszőleges számú kulcsot** származtathat. + +``` + [m / 0] + / + / +[m] - [m / 1] + \ + \ + [m / 2] +``` + +Az egyes ágakat `/` választja el egymástól, így `m/2` azt jelenti, hogy a mesterkulccsal kezdjük, és a 2. ágat követjük. Az alábbi ábrán egyetlen mnemonikus kifejezést használunk három kivételi kulcs tárolására, mindegyikhez két validátor tartozik. + +![validátorkulcs logika](multiple-keys.png) + +## További olvasnivaló {#further-reading} + +- [Ethereum Alapítvány blogbejegyzés Carl Beekhuizentől](https://blog.ethereum.org/2020/05/21/keys/) +- [EIP-2333 BLS12-381 kulcsgenerálás](https://eips.ethereum.org/EIPS/eip-2333) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md new file mode 100644 index 00000000000..14451d932a0 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -0,0 +1,69 @@ +--- +title: A proof-of-stake és a proof-of-work összehasonlítása +description: Az Ethereum proof-of-stake és proof-of-work alapú konszenzusmechanizmusának összehasonlítása +lang: hu +--- + +Amikor az Ethereumot bevezették, a proof-of-stake (letéti igazolás) még sok kutatást és fejlesztést igényelt, mielőtt erre alapozhatták volna az Ethereum biztosítását. A proof-of-work (munkaigazolás) egy egyszerűbb mechanizmus volt, ami már működött a Bitcoinnál, így a központi fejlesztők egyszerűen implementálni tudták, hogy elindulhasson az Ethereum. Ezután a proof-of-stake mechanizmusát még nyolc évig fejlesztették, mielőtt áttérek volna rá. + +Ez az oldal elmagyarázza az Ethereum proof-of-work-ről proof-of-stake-ra való áttérésének okait és a szükséges kompromisszumokat. + +## Biztonság {#security} + +Az Ethereum kutatói biztonságosabbnak tartják a proof-of-stake-et, mint a proof-of-work-öt. Ez nemrég került bevezetésre a valódi Ethereum főhálózatra, és kevésbé bizonyított, mint a proof-of-work. A következő részben a proof-of-stake biztonsági modelljének előnyeit és hátrányait tárgyaljuk a proof-of-work-höz képest. + +### A támadás költsége {#cost-to-attack} + +A proof-of-stake-ben a validátoroknak letétbe kell helyezniük 32 ETH-t egy okosszerződésben. Az Ethereum a rosszhiszemű validátorokat büntetheti azzal, hogy megsemmisíti a letétbe helyezett ethert. A konszenzushoz a teljes letétbe helyezett ether legalább 66%-a kell szavazzon a blokkok egy bizonyos halmazára. A letét >=66%-a által megszavazott blokkok „véglegesítetté” válnak, ami azt jelenti, hogy nem lehet őket eltávolítani vagy átszervezni. + +A hálózat elleni támadása lehet az, hogy megakadályozzák a lánc véglegesítését, vagy a blokkokat a támadó számára előnyös sorrendbe teszik a kanonikus láncban. Ehhez a támadónak el kell térítenie a helyes konszenzus útját azzal, hogy nagy mennyiségű ethert halmoz fel, és közvetlenül azzal szavaz, vagy úgy, hogy becsapja az őszinte validálókat, hogy egy bizonyos módon szavazzanak. A kifinomult, kis valószínűséggel bíró támadások során a jóhiszemű validátorokat eltérítik, ekkor az Ethereum megtámadásának költsége azonos a letéttel, amelyet a támadónak fel kell halmoznia ahhoz, hogy a konszenzust a maga javára befolyásolja. + +A legalacsonyabb támadási költség a teljes letét >33%-a. A teljes letét >33%-át birtokló támadó egyszerűen offline állapotba kerülve késleltetheti a véglegesítést. Ez viszonylag kisebb probléma a hálózat számára, mivel létezik egy „inaktivitási elszivárgás” mechanizmus, amely addig redukálja a letéteket az offline validátoroktól, amíg az online többség a letét 66%-át képviseli, és újra véglegesíteni tudja a láncot. Elméletileg az is lehetséges, hogy egy támadó a teljes letét valamivel több mint 33%-ával kettős véglegesítést idézzen elő azáltal, hogy egy helyett két blokkot hoz létre, amikor felkérik, hogy legyen blokkelőterjesztő, majd az összes validátorral együtt kétszeresen szavazzon. Mindkét elágazáshoz csak a megmaradt becsületes validátorok 50%-ának kell először látni az egyes blokkokat, így ha sikerül pontosan időzíteniük az üzeneteiket, akkor képesek lehetnek mindkét elágazást véglegesíteni. Ennek kicsi a valószínűsége, de ha egy támadó képes lenne kettős véglegesítést előidézni, akkor az Ethereum közösségnek úgy kellene döntenie, hogy az egyik elágazást követi, és ebben az esetben a támadó validátorait a másik elágazáson súlyosan megbüntetnék és kizárnák. + +A teljes letét >33%-ával egy támadónak esélye van arra, hogy kisebb (véglegesítés késleltetése) vagy komolyabb (dupla véglegesítés) hatást gyakoroljon az Ethereum-hálózatra. Több mint 14.000.000 ETH lttétje van a hálózaton és egy reprezentatív 1000 dollár/ETH árral, az ilyen támadások minimális költsége `1000 x 14.000.000 x 0,33 = 4.620.000.000 dollár`. A támadó ezt a pénzt elveszítené a súlyos büntetés következtében, és kiesne a hálózatból. Az újbóli támadáshoz a letét >33%-át kellene (újra) felhalmozniuk és (újra) elégetniük. Minden egyes támadási kísérlet a hálózat megtámadására >4,6 milliárd dollárba kerülne (1000 dollár/ETH és 14 millió ETH letét mellett). A támadót kidobják a hálózatból a súlyos büntetés következtében, és egy aktiválási sorba kell beállnia, hogy újra csatlakozhasson. Ez azt jelenti, hogy az ismételt támadás mértéke nemcsak arra az arányra korlátozódik, amivel a támadó a teljes letét >33%-át fel tudja halmozni, hanem arra az időre is, amíg az összes validátorát fel tudja venni a hálózatra. Minden egyes támadással a támadó sokkal szegényebbé válik, a közösség többi tagja pedig gazdagabb lesz az ebből eredő drasztikus kínálati változásnak köszönhetően. + +Más támadások, mint például az 51%-os támadás vagy a teljes letét 66%-ával történő véglegesség visszafordítása, lényegesen több ETH-t igényelnek, és sokkal költségesebbek a támadó számára. + +Összehasonlítjuk a proof-of-work mechanizmussal. A proof-of-work Ethereum elleni támadás indításának költsége az volt, hogy a teljes hálózati hash-ráta >50%-át folyamatosan birtokolni kellett. Ez az elegendő számítási teljesítmény hardver- és üzemeltetési költségét jelentette ahhoz, hogy a proof-of-work megoldások kiszámításában lehagyja a többi bányászt. Az Ethereumon többnyire GPU-t használtak a bányászathoz, nem ASIC-et, ami alacsonyan tartotta a költségeket (ha a proof-of-work rendszer fennmaradt volna, az ASIC-alapú bányászat népszerűbb lehetett volna). Egy támadónak sok hardverre lett volna szüksége, illetve fizethette volna a működtetés költségeit, hogy megtámadhasson egy proof-of-work Ethereum-hálózatot, de ez kevesebb, mint a támadáshoz szükséges ETH felhalmozása. Egy 51%-os támadás a proof-of-work esetében [kb. 20x olcsóbb](https://youtu.be/1m12zgJ42dI?t=1562), mint a proof-of-stake esetében. Ha a támadást észlelték, és a lánc elágazott (hard fork), hogy eltávolítsák a támadó hatását, a támadó ismételten ugyanazt a hardvert használhatná az új elágazás megtámadásához. + +### Bonyolultság {#complexity} + +A proof-of-stake kivitelezése a proof-of-workhöz képest sokkal bonyolultabb. Ez a proof-of-work mellett szólhat, mivel az egyszerűbb protokollokba sokkal nehezebb véletlen hibákat vagy nem kívánt hatásokat bevinni. Habár a komplexitást sikerült megszelídíteni több éves kutatás/fejlesztés, szimulációk és teszthálózati megvalósítások révén. A proof-of-stake protokollt öt független csapat (a végrehajtási és konszenzusrétegen is), öt programozási nyelven valósította meg, ami ellenállást biztosít a klienshibákkal szemben. + +A proof-of-stake konszenzus logikájának biztonságos fejlesztése és tesztelése érdekében a Beacon lánc két évvel azelőtt indult el, hogy a proof-of-stake-et az Ethereum főhálózatra bevezették volna. A Beacon lánc a proof-of-stake tesztelési helyeként működött, mivel élő blokklánc volt proof-of-stake konszenzuslogikával, de nem kezelt valódi Ethereum tranzakciókat, gyakorlatilag csak önmagában jutott konszenzusra. Amint ez kellő ideig stabil és hibamentes volt, a Beacon láncot „beolvasztották” az Ethereum főhálózatba. Mindez hozzájárult ahhoz, hogy a proof-of-stake összetettsége kezelhetővé váljon, s a nem kívánt következmények vagy a klienshibák kockázata alacsony legyen. + +### Támadási felület {#attack-surface} + +A proof-of-stake összetettebb, mint a proof-of-work, ami azt jelenti, hogy több potenciális támadási vektorral kell megbirkózni. A klienseket összekötő peer-to-peer hálózatból kettő van, külön protokollal. Mivel előre kiválasztanak egy validátort, hogy egy adott slotban blokkot javasoljon, így lehetőség nyílik a szolgáltatásmegtagadásra, amikor az adott validátort annyi feladattal árasztják el, hogy nem tudja végrehajtani a fő funkcióját. + +Vannak olyan módszerek is, amelyekkel a támadók gondosan időzíthetik blokkjaik vagy tanúsításaik közzétételét, hogy azokat a becsületes hálózat egy bizonyos hányada megkapja, és így bizonyos módon szavaznak. Végül egy támadó egyszerűen elegendő ETH letétet képezhet ahhoz, hogy uralja a konszenzusmechanizmust. E [támadási vektorok mindegyikének vannak kapcsolódó védekezési lehetőségei](/developers/docs/consensus-mechanisms/pos/attack-and-defense), ugyanakkor ezek nem léteznek a proof-of-work mechanizmusban. + +## Decentralizáció {#decentralization} + +A proof-of-stake decentralizáltabb, mint a proof-of-work, mivel a bányászhardverek versenyében a magánszemélyek és a kis szervezetek kiszorulnak a versenyből. Bár technikailag bárki elkezdheti a bányászatot szerény hardverrel, annak a valószínűsége, hogy jutalmat kap, elenyészően kicsi az intézményes bányászathoz képest. A proof-of-stake esetében a letét költsége és százalékos megtérülése mindenki számára azonos. Jelenleg 32 ETH-be kerül egy validátor működtetése. + +Másrészt a likvid letéti derivatívák centralizációs aggályokhoz vezettek, mivel néhány nagy szolgáltató nagy mennyiségű letétbe helyezett ETH-t kezel. Ez problémás, és minél előbb korrigálni kell, de árnyaltabb is, mint amilyennek látszik. A központosított letéti alapok nem feltétlenül központosítják a validátorok irányítását – gyakran ez egy módja annak, hogy egy központi ETH-állományt sok független csomópont-üzemeltető adjon összei anélkül, hogy minden résztvevőnek 32 saját ETH-re lenne szüksége. + +Az Ethereum számára a legjobb megoldás az, ha a validátorokat helyben, otthoni számítógépeken futtatják, maximalizálva a decentralizációt. Ezért ellenzi az Ethereum azokat a változtatásokat, amelyek növelik a csomópont és a validátor futtatásának hardverigényét. + +## Fenntarthatóság {#sustainability} + +A proof-of-stake energiafogyasztása miatt ez gazdaságos módja a blokklánc biztosításának. A proof-of-work rendszerben a bányászok versenyeznek a blokkbányászat jogáért. A bányászok sikeresebbek, ha gyorsabban tudják elvégezni a számításokat, ami miatt többet fektetnek hardverbe és nagyobb az energiafogyasztás. Ez jellemezte az Ethereumot, mielőtt átállt volna a proof-of-stake-re. Nem sokkal a proof-of-stake-re való áttérés előtt az Ethereum körülbelül 78 TWh/év mennyiséget fogyasztott, akár egy kisebb ország. A proof-of-stake-re való áttérés azonban kb. 99,98%-kal csökkentette ezt az energiafelhasználást. Ez tehát az Ethereumot egy energiahatékony, alacsony szén-dioxid-kibocsátású platformmá tette. + +[Bővebben az Ethereum energiafogyasztásáról](/energy-consumption) + +## Kibocsátás {#issuance} + +A proof-of-stake Ethereum kevesebb érmekibocsátással tudja fenntartani a biztonságát, mint a proof-of-work rendszerben, mivel a validátoroknak nem kell magas áramköltséget fizetniük. Ennek eredményeképpen az ETH inflációja csökkenhet, vagy akár meg is fordult és deflálttá válhat, ha nagy mennyiségű ETH-t égetnek el. Az alacsonyabb inflációs szintek azt jelentik, hogy az Ethereum biztonsága olcsóbb, mint a proof-of-work esetében. + +## Ön inkább vizuális típus? {#visual-learner} + +Tekintse meg Justin Drake magyarázatát a proof-of-stake előnyeiről a proof-of-work-höz képest: + + + +## További olvasnivaló {#further-reading} + +- [Vitalik proof-of-stake tervezési filozófiája](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [Vitalik proof-of-stake GYIK](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [„Simply Explained” (egyszerű magyarázat) videó a proof-of-stake és a proof-of-woork mechanizmusokról](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md new file mode 100644 index 00000000000..e967b0b5674 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md @@ -0,0 +1,90 @@ +--- +title: Proof-of-stake jutalmak és büntetések +description: Ismerje meg a protokollon belüli ösztönzőket a proof-of-stake Ethereumban. +lang: hu +--- + +Az Ethereumot a natív kriptovaluta, az ether (ETH) biztosítja. Azok a csomópont-üzemeltetők, akik részt kívánnak venni a blokkok validálásában és a lánc fejének azonosításában, ethert helyeznek el az Ethereumon egy okosszerződésben. Ezután etherben fizetnek nekik a validátorszoftver futtatásáért, amely ellenőrzi a peer-to-peer hálózaton keresztül érkező új blokkok érvényességét, és a lánc fejének azonosítására az elágazásválasztó-algoritmust alkalmazza. + +A validátornak két fő szerepe van: 1) az új blokkok ellenőrzése és „tanúsítása”, hogy érvényesek-e, 2) új blokk előterjesztése, amikor véletlenszerűen kiválasztják a validátorállományból. Ha a validátor nem végzi el e feladatok egyikét sem, amikor erre felkérik, akkor lemarad az ether kifizetéséről. A validátorokat felkérhetik az aláírások összesítésére és a szinkronizáló bizottságokban való részvételre is. + +Vannak olyan műveletek, amelyeket nehéz lenne véletlenül megtenni, ezért valamilyen rosszindulatú szándékot jeleznek, például több blokkot javasolni vagy tanúsítani ugyanarra a slotra. Ezek súlyos büntetést vonnak maguk után, amelyek azt eredményezik, hogy a validátor egyenlegéből bizonyos mennyiségű ethert (legfeljebb 1 ETH-t) elégetnek, mielőtt eltávolításra kerül a hálózatból, ami 36 napot vesz igénybe. A súlyos büntetést kapott validátor ether egyenlege lassan fogy a kilépési időszak alatt, de a 18. napon „korrelációs büntetést” kap, amely nagyobb, ha több validátor egy időben kerül kizárásra. A konszenzusmechanizmus ösztönző struktúrája tehát a helyes viselkedésért jutalmat fizet, a rossz szereplőket pedig bünteti. + +Minden jutalom és büntetés korszakonként egyszer kerül alkalmazásra. + +Tekintse meg a további részleteket + +## Jutalmak és büntetések {#rewards} + +### Jutalmak {#rewards} + +A validátorok jutalomban részesülnek, ha a többi validátorral összhangban adnak szavazatokat, ha blokkokat javasolnak, és ha részt vesznek a szinkronizáló bizottságokban. A jutalmak értékét minden egyes korszakban egy `base_reward` (alapjutalom) alapján számítják ki. Ez az alapegység, amelyből a többi jutalmat számolják. A `base_reward` az egy validátor által optimális körülmények között kapott átlagos jutalom korszakonként. Ezt a validátor tényleges egyenlegéből és az aktív validátorok teljes számából számítják ki: + +``` +base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance)))) +``` + +ahol `base_reward_factor` 64, `base_rewards_per_epoch` 4 és `sum(active balance)` az összes aktív validátor letétbe helyezett ether egyenlege. + +Ez azt jelenti, hogy az alapjutalom arányos a validátor tényleges egyenlegével és fordítottan arányos a hálózaton lévő validátorok számával. Minél több validátor van, annál nagyobb a teljes kibocsátás (mint `sqrt(N)`, de annál kisebb az egy validátorra jutó `base_reward` alapjutalom (mint `1/sqrt(N)`). Ezek a tényezők befolyásolják a letétbe helyező csomópontra vonatkozó APR-t (éves ráta). Tekintse meg ennek indoklását [Vitalik jegyzeteiben](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards). + +A teljes jutalmat ezután öt összetevő összegeként számítják ki, amelyek mindegyike súlyozással rendelkezik, amely meghatározza, hogy az egyes összetevők mennyivel járulnak hozzá a teljes jutalomhoz. Az összetevők a következők: + +``` +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 +``` + +A komponensek súlyozása a következő: + +``` +TIMELY_SOURCE_WEIGHT uint64(14) +TIMELY_TARGET_WEIGHT uint64(26) +TIMELY_HEAD_WEIGHT uint64(14) +SYNC_REWARD_WEIGHT uint64(2) +PROPOSER_WEIGHT uint64(8) +``` + +A súlyok összege 64. A jutalom kiszámítása az alkalmazandó súlyok összege osztva 64-gyel. Az a validátor, aki időben leadta a forrás-, cél- és fejszavazatokat, blokkot javasolt és részt vett a szinkronizáló bizottságban az a következőt kaphatja: `64/64 * base_reward == base_reward`. Egy validátor azonban általában nem szokott blokkot javasolni, így a maximális jutalma: `64-8 /64 * base_reward == 7/8 * base_reward`. Azok a validátorok, akik nem blokkelőterjesztők és nem is tagjai szinkronizáló bizottságnak, a következőképpen kaphatnak: ` 64-8-2 / 64 * base_reward == 6,75/8 * base_reward`. + +A gyors tanúsítások ösztönzésére további jutalom jár. Ez az `inclusion_delay_reward`. Ennek értéke megegyezik a `base_reward` és `1/delay` szorzatával, ahol a `delay` a blokkjavaslat és a tanúsítás között eltelt slotok száma. Például, ha a tanúsítás a blokkjavaslat slotján belül kerül benyújtásra, a tanúsító `base_reward * 1/1 == base_reward` jutalmat kap. Ha a tanúsítás a következő slotban érkezik, akkor az igazoló `base_reward * 1/2` és így tovább. + +A blokkot javaslók `8 / 64 * base_reward` jutalmat kapnak **minden egyes, a blokkban szereplő érvényes tanúsításért **, így a jutalom tényleges értéke a tanúsító validátorok számával növekszik. A blokkot javaslók növelhetik jutalmukat azáltal is, hogy a javasolt blokkjukba más validátorok helytelen viselkedésére vonatkozó bizonyítékokat is beillesztenek. Ezek azok az ösztönzők, amelyek a validátorokat őszinteségre motiválják. A súlyos büntetést tartalmazó blokkelőterjesztő a `slashed_validators_effective_balance / 512` értékkel jutalmazzák. + +### Büntetések {#penalties} + +Eddig a jól viselkedő validátorokat vettük figyelembe, de mi a helyzet azokkal, akik nem vagy csak lassan teszik meg a fej-, forrás- és célszavazatokat? + +A cél- és forrásszavazatok elmaradásáért járó büntetés megegyezik azzal a jutalommal, amelyet az igazoló kapott volna, ha leadja azokat. Ez azt jelenti, hogy ahelyett, hogy a jutalom hozzáadódna az egyenlegükhöz, ugyanekkora értéket vonnak el abból. A fejszavazás elmulasztásáért nincs büntetés (azt csak jutalmazzák, nem büntetik). Az `inclusion_delay` kapcsán nincs büntetés, a jutalom egyszerűen nem kerül hozzá a validátor egyenlegéhez. Nincs büntetés azért sem, ha valaki nem javasol blokkot. + +Tudjon meg többet a jutalmakról és büntetésekről a [konszenzusspecifikációból](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md). A jutalmakat és büntetéseket a Bellatrix frissítéssel módosították – nézze meg Danny Ryan és Vitalik beszélgetését erről ebben a [Peep an EIP videóban](https://www.youtube.com/watch?v=iaAEGs1DMgQ). + +## Súlyos büntetés (slashing) {#slashing} + +A súlyos büntetés (slash) egy komoly akció, amely eltávolítja a validátort a hálózatból, s a letétbe helyezett ethert is elveszti. Három oka lehet egy validátor súlyos megbüntetésének, amelyek mindegyike a blokkok rosszhiszemű felajánlását vagy tanúsítását jelenti: + +- Két különböző blokk előterjesztése és aláírása ugyanarra a slotra +- Egy olyan blokk tanúsítása, amely „magába foglal” egy másikat (gyakorlatilag megváltoztatva a historikus adatokat) +- „Kettős szavazással”, amikor két jelöltet tanúsítanak ugyanarra a blokkra + +Ha ezeket a műveleteket észlelik, a validátort súlyosan megbüntetik. Ez azt jelenti, hogy a letétbe helyezett etherük 1/32-ét (maximum 1 etherig) azonnal elégetik, majd egy 36 napos eltávolítási időszak kezdődik. Ezen eltávolítási időszak alatt a validátor letétje fokozatosan elszivárog. Félidőben (18. nap) további büntetést kap, amelynek nagysága a büntetés előtti 36 napban az összes megbüntetett (slashed) validátor összes letétbe helyezett etherének nagyságával arányos. Ez azt jelenti, hogy ha több validátor kap súlyos büntetést és kizárást, akkor a büntetés mértéke növekszik. A maximális büntetés az összes megbüntetett validátor teljes tényleges egyenlege (ha sok validátor kap súlyos büntetést, akkor elveszíthetik a teljes letétjüket). Másrészt egyetlen, elszigetelt súlyos büntetés a validátor letétjének csak kis részét égeti el. Ezt a középtájt kiszabott extra büntetést, amely a megbüntetett validátorok számával skálázódik, korrelációs büntetésnek nevezzük. + +## Inaktivitási elszivárgás {#inactivity-leak} + +Ha a konszenzusréteg több mint négy korszakot tölt el véglegesítés nélkül, akkor egy „inaktivitási szivárgás” vészhelyzeti protokoll aktiválódik. Az inaktivitási elszivárgás célja, hogy megteremtse a lánc véglegessé válásához szükséges feltételeket. A véglegességhez a teljes feltett ether 2/3-os többsége szükséges ahhoz, hogy a forrás- és célellenőrzési pontok megegyezzenek. Ha a validátorok több mint 1/3-a offline állapotba kerül, vagy nem küld helyes tanúsításokat, akkor nem lehetséges, hogy a 2/3-os szupertöbbség véglegesítse az ellenőrzési pontokat. Az inaktivitási kiszivárgás lehetővé teszi, hogy az inaktív validátorok letétje fokozatosan elszivárogjon addig, amíg a hozzájuk tartozó letét 1/3 alá csökkent, így a megmaradt aktív validátorok véglegesíthetik a láncot. Bármilyen nagy legyen inaktív validátorok csoportja, a megmaradó aktív validátorok végül a letét >2/3-át birtokolják. A letét elvesztése erősen ösztönzi az inaktív érvényesítőket arra, hogy minél hamarabb újra aktiválódjanak. A Medalla teszthálózaton életbe lépett már az inaktivitási elszivárgás, amikor is az aktív validátorok < 66%-a képes volt konszenzusra jutni a blokklánc aktuális fejével kapcsolatban. Az inaktivitási elszivárgás aktiválódott, és a véglegesség végül helyreállt. + +A konszenzusmechanizmus jutalom-, büntetés- és súlyos büntetési konstrukciója arra ösztönzi a validálókat, hogy jóhiszeműen viselkedjenek. Ezekből a tervezési döntésekből következik, hogy a rendszer érdekében a validátoroknak egyenlően kell eloszlaniuk a kliens között, és fel kell oldani az egyetlen kliens dominanciáját. + +## További olvasnivaló {#further-reading} + +- [Ethereum frissítés: Az ösztönzési réteg](https://eth2book.info/altair/part2/incentives) +- [Ösztönzők az Ethereum hibrid Casper-protokolljában](https://arxiv.org/pdf/1903.04205.pdf) +- [Vitalik jegyzetekkel ellátott specifikációja](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1) +- [Eth2 súlyos büntetés elkerülésének módjai](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) + +_Források_ + +- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_ diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md new file mode 100644 index 00000000000..9d5ac720e72 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md @@ -0,0 +1,39 @@ +--- +title: Gyenge szubjektivitás +description: A gyenge szubjektivitásnak és a proof-of-stake Ethereumban elfoglalt szerepének bemutatása. +lang: hu +--- + +A szubjektivitás a blokkláncban arra utal, hogy a jelenlegi státuszról való megegyezés közösségi információkon alapszik. Több érvényes elágazás is létezhet, amelyek közül a hálózati társaktól gyűjtött információk alapján választanak. Ennek ellentéte az objektivitás, amely olyan láncokra vonatkozik, ahol csak egy lehetséges érvényes lánc van, amelyben minden csomópont egyetért a kódolt szabályok alkalmazásával. A harmadik helyzet a gyenge szubjektivitás. Ez egy olyan lánc, amely objektíven haladhat előre, miután bizonyos kezdeti információt közösségileg megszerzett. + +## Előfeltételek {#prerequisites} + +A jelen téma könnyebb megértéséhez tekintse meg a [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) alapjairól szóló oldalt. + +## Milyen problémákat old meg a gyenge szubjektivitás? {#problems-ws-solves} + +A szubjektivitás a proof-of-stake blokkláncok velejárója, mivel a helyes lánc kiválasztása több elágazás közül a korábbi szavazatok számolásával történik. Ez számos támadási vektornak teszi ki a blokkláncot, beleértve a hosszú távú támadásokat, amelyek során a láncban nagyon korán részt vevő csomópontok fenntartanak egy alternatív elágazást, amelyet később saját érdekükből kifolyólag kiadnak. Alternatív megoldásként, ha a validátorok 33%-a visszavonja a letétjét, de továbbra is tanúsít és blokkokat állít elő, akkor létrehozhatnak egy alternatív elágazást, amely ütközik a kanonikus lánccal. Az új vagy a hosszú ideje offline csomópontok nem biztos, hogy tudják, hogy ezek a támadó validátorok visszavonták a letétüket, így rávehetik őket, hogy egy helytelen láncot kövessenek. Az Ethereum olyan korlátozásokkal tudja megoldani a támadási vektorokat, amelyek a mechanizmus szubjektív aspektusait, beleértve a bizalmi feltételezéseket is, a minimálisra csökkenti. + +## A gyenge szubjektivitás ellenőrzőpontjai {#ws-checkpoints} + +A gyenge szubjektivitás a proof-of-stake Ethereumban az erre vonatkozó ellenőrzőpontokkal valósul meg. Ezek olyan státuszgyökerek, amelyek a hálózat összes csomópontja szerint a kanonikus láncba tartoznak. Ezek is az „egyetemes igazság” célját szolgálják, mint a genezis blokkok, azzal a különbséggel, hogy nem a genezis pozícióban helyezkednek el a blokkláncban. Az elágazásválasztó-algoritmus bízik abban, hogy az adott ellenőrzőpontban meghatározott blokkláncstátusz helyes, és hogy ettől a ponttól kezdve függetlenül és objektíven ellenőrzi a láncot. Az ellenőrzési pontok adják az adott blokk visszafordíthatóságának korlátját, mivel a gyenge szubjektivitás ellenőrzési pontjai előtti blokkok nem módosíthatók. Ez aláássa a nagy hatótávolságú támadásokat azzal, hogy a mechanizmus érvénytelennek minősíti a nagy hatótávolságú elágazásokat. Azzal, hogy a gyenge szubjektivitás ellenőrzési pontjai közelebb vannak, mint a validátor letétkivételi ideje, az elágazást készítő validátort meg tudja bünteti valamekkora összegig, mielőtt kivehetné a letétet, és így az új belépőket nem tudja eltéríteni a téves elágazásokra. + +## A gyenge szubjektivitás ellenőrzési pontjai és a véglegesített blokkok közötti különbség {#difference-between-ws-and-finalized-blocks} + +Az Ethereum-csomópontok másképp kezelik a véglegesített blokkokat és a gyenge szubjektivitás ellenőrzési pontjait. Ha egy csomópont két egymással versengő véglegesített blokkról szerez tudomást, akkor a kettő között vacilál – nem tudja automatikusan azonosítani, hogy melyik a kanonikus elágazás. Ez a konszenzuskudarc tünete. Ezzel szemben egy csomópont egyszerűen elutasít minden olyan blokkot, amely ütközik a gyenge szubjektivitás ellenőrzési pontjával. A csomópont szempontjából a gyenge szubjektivitás ellenőrzési pontja olyan abszolút igazságot képvisel, amelyet nem lehet aláásni a társaktól jövő információkkal. + +## Mennyire gyenge a gyenge? {#how-weak-is-weak} + +Az Ethereum proof-of-stake szubjektív aspektusa az, hogy a szinkronizáláshoz egy megbízható forrásból származó friss státuszra van szükség (ez a gyenge szubjektivitás ellenőrzési pontja). Annak kockázata, hogy a gyenge szubjektivitás ellenőrzési pontja rossz, nagyon alacsony, mivel több független nyilvános forrással is ellenőrizhetők, mint amilyenek a blokkfelfedezők vagy más csomópontok. Egy szoftver futtatásához azonban szükség van bizonyos fokú bizalomra, például bíznunk kell abban, hogy a fejlesztők tisztességes szoftvert készítettek. + +A gyenge szubjektivitás ellenőrzési pontja az kliensszoftver részeként is megjelenhet. Vitatható, hogy egy támadó megrongálhatja a szoftverben lévő ellenőrzőpontot, és ugyanilyen könnyen magát a szoftvert is. Nincs kriptogazdasági megoldás ennek a problémának a megkerülésére, de a megbízhatatlan fejlesztők hatása az Ethereumban minimálisra csökkenthető azáltal, hogy több független klienscsapat van, amelyek különböző nyelveken készítenek egyenértékű szoftvert, és érdekeltek a tisztességes lánc fenntartásában. A blokkfelfedezők gyenge szubjektivitás ellenőrzési pontokat is biztosíthatnak, vagy a kapott ellenőrzési pontokat további forrással is össze lehet vetni. + +Végül, ellenőrzőpontokat lehet kérni más csomópontoktól; másik Ethereum-felhasználó, aki teljes csomópontot futtat, adhat egy ellenőrzőpontot, amelyet a validátorok ellenőrizhetnek a blokkfelfedezőből származó adatokkal. Összességében a gyenge szubjektivitás ellenőrzési pontjának szolgáltatójában való bizalom csak annyira problémás, mint megbízni a kliensfejlesztőkben. A szükséges bizalom alacsony szintű. Fontos megjegyezni, hogy ezek a megfontolások abban a valószínűtlen esetben válnak fontossá, ha a validálók többsége összeesküvést sző, hogy létrehozza a blokkláncnak egy alternatív elágazását. Bármilyen más körülmények között nem létezik több Ethereum-lánc, amelyek közül választani kellene. + +## További olvasnivaló {#further-reading} + +- [Gyenge szubjektivitás az Eth2-ben](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) +- [Vitalik: Hogyan tanultam meg szeretni a gyenge szubjektivitást](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) +- [Gyenge szubjektivitás (Teku dokumentációk)](https://docs.teku.consensys.net/en/latest/Concepts/Weak-Subjectivity/) +- [Nulladik fázisú gyenge szubjektivitási útmutató](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md) +- [A gyenge szubjektivitás elemzése az Ethereum 2.0-n](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/index.md index 8f23ddd8ef4..41a95845e77 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/index.md @@ -1,96 +1,107 @@ --- title: Proof-of-work (PoW) -description: Egy magyarázat a proof-of-work konszenzus protokollról és az Ethereumban betöltött szerepéről. +description: A proof-of-work (munkaigazolás) konszenzusprotokoll bemutatása és az Ethereumban betöltött szerepe. lang: hu -incomplete: true --- -Az Ethereum a Bitcoinhoz hasonlóan egy konszenzus protokollt használ, melyet úgy hívnak, hogy [proof-of-work (PoW)](https://wikipedia.org/wiki/Proof_of_work). Ez lehetővé teszi, hogy az Ethereum hálózat csomópontjainak, hogy az összes Ethereum blokkláncra feljegyzett információ állapotáról egyet tudjanak érteni és bizonyos gazdasági támadásokat meg tudjanak akadályozni. +Az Ethereum-hálózat kezdetben egy olyan konszenzusmechanizmust használt, amely a **[proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow)** koncepciót használta. Ez lehetővé tette az Ethereum-hálózat csomópontjai számára, hogy az összes Ethereum-blokkláncra feljegyzett információ állapotáról megegyezzenek és kivédjenek bizonyos gazdasági támadásokat. Ugyanakkor az Ethereum 2022-ben leváltotta a proof-of-work mechanizmust, és helyette a [proof-of-stake (letéti igazolás)](/developers/docs/consensus-mechanisms/pos) koncepcióját vezette be. + + + A proof-of-work ezzel kivezetésre került. A konszenzusmechanizmusnak többé nem része a proof-of-work az Ethereumon. Ehelyett a proof-of-stake mechanizmus működik. Tudjon meg többet a proof-of-stake-ről és a letétbe helyezésről. + ## Előfeltételek {#prerequisites} -Hogy jobban megértsd ezt az oldalt, javasoljuk, hogy előbb olvasd el a [tranzakciókról](/developers/docs/transactions/) és a [blokkokról](/developers/docs/blocks/) szóló oldalakat. +A jelen téma könnyebb megértéséhez érdemes áttekinteni a [tranzakciók](/developers/docs/transactions/), [blokkok](/developers/docs/blocks/) és a [konszenzusmechanizmus](/developers/docs/consensus-mechanisms/) oldalakat. ## Mi az a proof-of-work (PoW)? {#what-is-pow} -A proof-of-work (PoW) egy olyam mechanizmus, mely lehetővé teszi a decentralizált Ethereum hálózat számára, hogy konszenzusra jusson, vagy egyet értsen olyanok felett, mint a számla egyenlegek vagy a tranzakciók rendje. Ez megakadályozza, hogy a felhasználók "duplán elköltsék" az érméiket és biztosítja azt, hogy az Ethereum láncot hihetetlenül nehéz megtámadni vagy átírni. +A Nakamoto konszenzus, amely a proof-of-work (PoW) mechanizmust használja, egykor lehetővé tette a decentralizált Ethereum-hálózat számára, hogy konszenzusra jusson (tehát minden csomópont egyetértsen) olyanok felett, mint a számlaegyenlegek vagy a tranzakciók sorrendje. Ez megakadályozta, hogy a felhasználók „duplán elköltsék” a coinokat és biztosította azt, hogy az Ethereum-láncot hihetetlenül nehéz volt megtámadni vagy átírni. Ezek a biztonsági jellemzők most a proof-of-stake mechanizmusból erednek, amely a [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) nevű konszenzust használja. ## Proof-of-work és bányászat {#pow-and-mining} -Proof-of-work a mögöttes algoritmus, mely beállítja a nehézséget és szabályokat a munkához, melyet a bányászok végeznek. A bányászat maga a "munka". Érvényes blokkok hozzáadását jelenti a lánchoz. Ez fontos, mivel a lánc hossza segít a hálózatnak, hogy meglássa a valós láncot és megértse az Ethereum jelenlegi állapotát. Minél több "munka" van elvégezve, annál hosszabb a lánc és minél magasabb a blokkszám, annál inkább biztosabb lehet a hálózat a dolgok jelenlegi állapotában. +A proof-of-work a mögöttes algoritmus, amely a nehézséget és a szabályokat határozza meg a munkához, amelyet a bányászok végeznek proof-of-work blokkláncokon. A bányászat maga a „munka”. Érvényes blokkok hozzáadását jelenti a lánchoz. Ez azért fontos, mert a lánc hossza segíti a hálózatot abban, hogy kövesse a blokklánc megfelelő elágazását. Minél több „munka” van elvégezve, annál hosszabb a lánc, és minél magasabb a blokkszám, annál inkább biztosabb lehet a hálózat a dolgok jelenlegi állapotában. [Többet a bányászatról](/developers/docs/consensus-mechanisms/pow/mining/) -## Hogyan működik az Ethereum proof-of-work? {#how-it-works} +## Hogyan működött az Ethereum proof-of-work mechanizmusa? {#how-it-works} -Az Ethereum tranzakciókat blokkokba dolgozzák fel. Minden egyes blokknak van: +Az Ethereum-tranzakciókat blokkokba dolgozzák fel. A már kivezetett proof-of-work-alapú Ethereumon minden blokkban volt: - blokk nehézsége – például: 3,324,092,183,262,715 - mixHash-e – például: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` - nonce-a – például: `0xd3ee432b4fb3d26b` -Ez a blokk adat közvetlen kapcsolatban áll a PoW-kel. +Ezek a blokkadatok közvetlen kapcsolatban álltak a proof-of-work mechanizmussal. ### A munka a proof-of-work-ben {#the-work} -A proof-of-work protokoll, melyet Ethhash-nek hívnak, arra ösztönzi a bányászokat, hogy egy intenzív verseny keretében próba szerencse alapon megtalálják a nonce-ot egy blokkra. Csak érvényes nonce-szal rendelkező blokkok adhatók hozzá a lánchoz. +A proof-of-work protokoll, melyet Ethashnek hívnak, arra ösztönözte a bányászokat, hogy egy intenzív verseny keretében próba szerencse alapon megtalálják a nonce-t egy blokkhoz. Csak érvényes nonce-szal rendelkező blokkokat lehetett hozzáadni a lánchoz. -Amikor a blokk létrehozásáért versenyeznek, egy adott bányász több alkalommal is betesz egy adathalmazt egy matematikai függvénybe, melyet csak a teljes lánc letöltésével és futtatásával (ahogy a bányászok csinálják) lehet megszerezni. Így generálódik a mixHash, mely a cél nonce alatt van, ahogy a blokk nehézség előírja. Ezt a legjobb próba és hiba módszerrel kiszámítani. +Amikor a blokk létrehozásáért versenyeztek, egy adott bányász ismételten betett egy adathalmazt, melyet csak a teljes lánc letöltésével és futtatásával (ahogy a bányászok csinálják) lehetett megszerezni, egy matematikai függvényen keresztül. Az adathalmazt arra használták, hogy készítsenek egy mixHasht, ami a blokk nehézsége által megadott tartományon belül marad. Ezt a legjobban a próba és hiba módszerrel kiszámítani. -A nehézség meghatározza a hash célját. Minél alacsonyabb a cél, annál kisebb az érvényes hash-ek halmaza. Amint legenerálja valaki, onnantól már rendkívül egyszerű a többi bányász és kliens számára hitelesíteni. Ha akár egy tranzakció is megváltozna, akkor a hash teljesen más lenne, mely csalást jelentene. +A nehézség határozta meg a hash célját. Minél alacsonyabb a cél, annál kisebb az érvényes hashek halmaza. Amint legenerálta valaki, onnantól már rendkívül egyszerű a többi bányász és kliens számára hitelesíteni. Ha akár egy tranzakciót is megváltoztattak volna, akkor a hash teljesen más lett volna, ami egyértelműen jelzi a csalást. -A hashing egyszerűvé teszi, hogy észrevegyük a csalásokat. De a PoW, mint folyamat elrettentő erővel bír a lánc megtámadásával szemben. +A hashing egyszerűvé teszi, hogy észrevegyük a csalásokat. Emellett a proof-of-work folyamata elrettentő erővel bírt a lánc megtámadásával szemben. ### Proof-of-work és biztonság {#security} -A bányászok ösztönözve vannak, hogy elvégezzék ezt a munkát az Ethereum láncon. A bányászok egy részhalmaza számára kicsi az ösztönző, hogy elindítsák a saját láncukat - ez aláássa a rendszert. A blokkláncok egy állapotra hagyatkoznak, mint az igazság forrása. A felhasználók pedig mindig a hosszabb vagy "nehezebb" láncokat fogják választani. +A bányászokat ösztönözték, hogy elvégezzék ezt a munkát az Ethereum láncon. A bányászok számára nem volt mérvadó az a motiváció, hogy saját láncot indítsanak, és ezzel aláássák a rendszert. A blokkláncok egy állapotra hagyatkoznak az igazság forrásaként. -A PoW célkitűzése a lánc kiterjesztése. A leghosszabb lánc a leghihetőbb érvényes lánc, mivel itt végezték el a legtöbb számítási munkát. Az Ethereum PoW rendszerén belül szinte lehetetlen olyan új blokkokat létrehozni, melyek korábbi tranzakciókat törölnének ki vagy hamis tranzakciókat tartalmaznának, vagy egy másik láncok építenének. Ennek az az oka, hogy egy rosszindulatú bányásznak mindig gyorsabban kéne megoldania a blokk nonce-ot, mint bárki másnak. +A proof-of-work célkitűzése a lánc kiterjesztése volt. A leghosszabb lánc a leghihetőbb érvényes lánc volt, mivel itt végezték el a legtöbb számítási munkát ahhoz, hogy létrehozzák. Az Ethereum proof-of-work rendszerén belül szinte lehetetlen volt olyan új blokkokat létrehozni, melyek korábbi tranzakciókat törölnének ki vagy hamis tranzakciókat tartalmaznának, vagy egy másik láncok építenének. Ennek az az oka, hogy egy rosszindulatú bányásznak mindig gyorsabban kéne megoldania a blokk nonce-ot, mint bárki másnak. -Ahhoz, hogy konzisztensen rosszindulatú, de mégis érvényes blokkokat hozhass létre, a hálózat bányászati erejének több mint az 51%-val rendelkezned kell. Rengeteg számítógépre lenne szükséged, hogy elvégezhesd ezt a mennyiségű "munkát". És az is lehet, hogy a ráfordított energia meghaladja a támadás során szerzett hozamot. +Ahhoz, hogy valaki konzisztensen rosszindulatú, de mégis érvényes blokkokat hozhasson létre, a hálózat bányászati erejének több mint az 51%-ával rendelkeznie kellett volna. Ez a mennyiségű „munka” rengeteg, drága számítási kapacitást igényel, és az erre költött ráfordítás talán meg is haladja a támadással járó előnyöket. -### Proof-of-work közgazdaságtan {#economics} +### A proof-of-work gazdaságtana {#economics} -A PoW másik feladata, hogy új érméket bocsájtson ki a rendszerbe és ezzel ösztönözze a bányászokat a munka elvégzésére. +A proof-of-work másik feladata az volt, hogy új coinokat bocsásson ki a rendszerbe és ezzel ösztönözze a bányászokat a munka elvégzésére. -Azok a bányászok, akik sikeresen létrehoznak egy blokkok 2 újonnan létrehozott ETH kapnak jutalmul, valamint a blokkban lévő összes tranzakciónak a díját. A bányász ugyanakkor 1,75 ETH jutalmat kaphat az uncle blokkokért. Ez egy érvényes blokk, melyet egy időben készítettek egy másik bányász által létrehozott sikeres blokkal. Ez általában hálózati késeltetéskor fordul elő. +A [Constantinople-frissítés](/history/#constantinople) után a bányászok, akik sikeresen létrehoztak egy blokkot, két frissen kibocsátott ETH-t kaptak, valamint a tranzakciós díjak egy része is az övék lett. Az ommer blokkokért is járt 1,75 ETH. Az ommerek olyan érvényes blokkok, melyeket ugyanabban az időben készítenek, mint a kanonikus blokkot, ami végül a lánc folytatása lesz. Ezek általában hálózati késedelemkor fordultak elő. ## Véglegesség {#finality} -Az elosztott hálózatoknál egy tranzakciónak "véglegessége" van, amikor egy olyan blokkban van, ami nem tud megváltozni. +A tranzakció végleges az Ethereumon, amikor egy olyan blokk része, amit már nem lehet megváltoztatni. -Mivel a bányászok decentralizáltan dolgoznak, lehetséges, hogy egyszerre két érvényes blokk jön létre. Ez egy átmeneti elágazást (forkot) eredményez. Végül az egyik lánc lesz az elfogadott lánc, amint egy későbbi blokkot kibányásznak és hozzáfűznek, ami miatt hosszabbá válik. +Mivel a bányászok decentralizáltan dolgoztak, lehetséges volt, hogy egyszerre két érvényes blokk jöjjön létre. Ez egy átmeneti elágazást (fork) eredményez. Végül az egyik lánc lett az elfogadott, amint egy későbbi blokkot kibányásztak és hozzáfűztek, ami miatt hosszabbá vált. -De hogy tovább bonyolítsuk a dolgokat, a tranzakciók, melyek el lettek utasítva az átmeneti elágazásban, belekerülhettek az elfogadott láncba. Ez azt jelenti, hogy vissza lehet őket állítani. A véglegesség tehát arra az időre utal, amennyit várnod kellene, hogy a tranzakciót visszafordíthatatlannak tekintsük. Az Ethereum esetében az ajánlott idő 6 blokk vagy éppen több mint 1 perc. Ezután relatív konfidenciával azt mondhatod, hogy a tranzakció sikeres volt. Természetesen több ideig is várhatsz a nagyobb bizonyosság érdekében. +Tovább bonyolította, hogy a tranzakciók, melyek el lettek utasítva az átmeneti elágazásban, nem feltétlenül kerültek be az elfogadott láncba. Ez azt jelentette, hogy vissza lehetett azokat fordítani. A véglegesség tehát arra az időre utal, amennyit a felhasználónak várnia kell, hogy a tranzakciót visszafordíthatatlannak tekintsük. A korábbi proof-of-work-alapú Ethereumon minél több blokkot bányásztak egy adott `N` blokk tetejére, annál inkább meg lehetett bízni abban, hogy az `N` blokk tranzakciói sikeresek és nem lehet azokat visszafordítani. A jelenlegi proof-of-stake rendszerben a véglegesség a blokk kifejezett jellemzője, nem annyira valószínűségi. -Ezt figyelembe kell venni a dappok tervezésénél, mivel silány felhasználói élményt eredményezhet, ha félretájékoztatjuk a felhasználókat a tranzakciós információkról. Különösen ha a tranzakciónak nagy az értéke. +## A proof-of-work energiafelhasználása {#energy} -Ne feledd, hogy ebbe az időbe nem számítjuk bele a várakozási időt, mialatt egy bányász felveszi a tranzakciót. +A proof-of-work egyik legnagyobb hibája az energiamennyiség volt, melyet a hálózat biztonságosságáért el kellett fogyasztani. Az Ethereum proof-of-work rendszere sok energiát igényelt ahhoz, hogy biztonságos és decentralizált legyen. Röviddel a proof-of-stake-re való áttérés előtt az Ethereum-bányászok együttesen kb. 70 TWh/év energiát fogyasztottak (akár a Cseh Köztársaság a [digiconomist](https://digiconomist.net/) szerint, melyet 2022. július 18-án publikáltak). ## Előnyök és hátrányok {#pros-and-cons} -| Előnyök | Hátrányok | -| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| A PoW neutrális. Nincs szükséged ETH-re, hogy elkezd, és a blokk jutalmaknak köszönhetően 0 ETH-ről pozitívba mehet át az egyenleged. A [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) esetében ETH-re van szükséged, hogy belekezdj. | A PoW olyan sok energiát használ fel, ami káros a környezetnek. | -| A PoW egy kipróbált és letesztelt konszenzus mechanizmus, mely éveken keresztül biztonságban tartotta a Bitcoint és az Ethereumot. | Ha bányászni szeretnél, akkor speciális felszerelésre lesz szükséged, mely kezdetnek nagy befektetés. | -| A proof-of-stake-kel szemben viszonylag egyszerűbb implementálni. | A folyamatosan növekvő számítási igény miatt, a bányász poolok potenciálisan dominálhatják a bányász világot, mely centralizációhoz és biztonsági kockázatokhoz vezet. | +| Előnyök | Hátrányok | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| A proof-of-work egy semleges rendszer. Nincs szükség ETH-re, hogy valaki elkezdje, és a blokk jutalmaknak köszönhetően 0 ETH-ről pozitívba mehet át az egyenlege. A [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) esetében ETH-re van szükség, hogy valaki belekezdjen. | A proof-of-work sok energiát használ fel, ami káros a környezetnek. | +| A proof-of-work egy kipróbált és letesztelt konszenzusos mechanizmus, amely éveken keresztül biztonságban és decentralizáltan tartotta a Bitcoint és az Ethereumot. | Ha valaki bányászni szeretne, akkor speciális felszerelésre van szüksége, mely kezdetnek nagy befektetés. | +| A proof-of-stake-kel szemben viszonylag egyszerűbb implementálni. | A folyamatosan növekvő számítási igény miatt, a bányászati alapok potenciálisan dominálhatják a bányászvilágot, mely centralizációhoz és biztonsági kockázatokhoz vezet. | -## A proof-of-stake-kel összehasonlítva {#compared-to-pos} +## Összehasonlítás a proof-of-stake megoldással {#compared-to-pos} -Fölülről nézve a proof-of-stakenek ugyanaz a végcélja, mint a proof-of-worknek: hogy biztonságosan segítse elérni a konszenzust a decentralizált hálózaton. De van egy pár különbség a folyamatban és a személyekben: +Nagy vonalakban a proof-of-stake-nek ugyanaz a végcélja, mint a proof-of-work-nek: biztonságosan segítse elérni a konszenzust a decentralizált hálózaton. De van egy pár különbség a folyamatban és a személyekben: -- A PoS leváltja a számítási erő fontosságát a letétbe helyezett ETH-re -- A PoS lecseréli a bányászokat validátorokra. A validátorok letétbe helyezik az ETH-jüket, hogy aktiválják a képességüket új blokkok létrehozására. +- A proof-of-stake leváltja a számítási kapacitás fontosságát a letétbe helyezett ETH-re. +- A proof-of-stake lecseréli a bányászokat validátorokra. A validátorok letétbe helyezik az ETH-jüket, hogy aktiválják a képességüket új blokkok létrehozására. - A validátorok nem versenyeznek a blokk létrehozásért, ehelyett egy algoritmus választja ki őket véletlenszerűen. -- A véglegesség tisztább: bizonyos ellenőrzési pontokon, ha a validátorok 2/3 része egyetért a blokk állapotán, akkor a blokkot véglegesnek tekintjük. A validátorok a tejles letétüket felteszik erre, így ha megpróbálnak összejátszani, akkor a teljes letétüket elveszítik. +- A véglegesség tisztább: ha bizonyos ellenőrzési pontokon a validátorok 2/3 része egyetért a blokk állapotát illetően, akkor a blokkot véglegesnek tekintjük. A validátorok a tejles letétüket felteszik erre, így ha megpróbálnak összejátszani, akkor a teljes letétüket elveszítik. + +[A proof-of-stake-ről bővebben](/developers/docs/consensus-mechanisms/pos/) + +## Ön inkább vizuális típus? {#visual-learner} -[Többet a proof-of-stake-ről](/developers/docs/consensus-mechanisms/pos/) + ## További olvasnivaló {#further-reading} - [Többségi támadás](https://en.bitcoin.it/wiki/Majority_attack) - [Az elszámolási véglegességről](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) +### Videók {#videos} + +- [A proof-of-work protokollok technikai magyarázata](https://youtu.be/9V1bipPkCTU) + ## Kapcsolódó témák {#related-topics} - [Bányászat](/developers/docs/consensus-mechanisms/pow/mining/) diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/index.md index 75613329b12..a99e02880f4 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -1,53 +1,78 @@ --- title: Bányászat -description: Egy magyarázat arról, hogyan működik a bányászat az Ethereumon és hogyan segíti az Ethereum biztonságát és decentralizáltságát. +description: Áttekintés – hogyan működött a bányászat az Ethereumon. lang: hu -incomplete: true --- + +A proof-of-work (munkaigazolás) már nem az Ethereum konszenzusmechanizmus alapja, tehát a bányászatot kikapcsolták. Ehelyett az Ethereumot úgy biztosítják a validátorok, hogy letétbe helyeznek ETH-t. Ön is letétbe helyezheti a rendelkezésére álló ETH-t. Tudjon meg többet a egyesítés (Merge), proof-of-stake (letéti igazolás) és letétbe helyezés témákról. Ez az oldal csak elavult témákat tartalmaz. + + ## Előfeltételek {#prerequisites} -Hogy jobban megértsd ezt az oldalt, javasoljuk, hogy előbb olvasd el a [tranzakciók](/developers/docs/transactions/), [blokkok](/developers/docs/blocks/) és a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) oldalakat. +Javasoljuk, hogy olvassa el a [tranzakciók](/developers/docs/transactions/), [blokkok](/developers/docs/blocks/) és a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) oldalakat is. ## Mi az az Ethereum bányászat? {#what-is-ethereum-mining} -A bányászat az a folyamat, melynek során új, tranzakciókból álló blokkok jönnek létre és adódnak hozzá az Ethereum blokklánchoz. +A bányászat az a tevékenység, amikor tranzakciókból álló blokkokat hoznak létre, hogy azokat hozzáadják az Ethereum-blokklánchoz abban a proof-of-work architektúrában, melyet már kivezettek az Ethereumból. + +A bányászat kifejezés a kriptovaluták aranyhoz hasonló kinyerésére vonatkozott. Az arany vagy más nemesfémek ritkák, ahogy a digitális tokenek is, ezért a mennyiséget egy proof-of-work-alapú rendszerben a bányászattal lehetett növelni. A proof-of-work-alapú Ethereumban a kibocsátás egyetlen módja a bányászat volt. Az arany és más bányászatához képest ugyanakkor az Ethereumban ez volt a hálózat biztosításának módja a blokkláncba létrehozott, ellenőrzött, publikált és elterjesztett blokkok révén. + +Ether bányászata = A hálózat biztosítása -Az Ethereum, a Bitcoinhoz hasonlóan, a [proof-of-work (PoW)](/developers/docs/consensus-mechanisms/pow/) konszenzus algoritmust használja. A bányászat a proof-of-work lényege. Az Ethereum bányászok - szoftvert futtató számítógépek - az idejüket és számítási kapacitásukat fordítják tranzakciók feldolgozására és blokkok létrehozására. +A bányászat a proof-of-work blokkláncok lényege. Az Ethereum-bányászok – szoftvert futtató számítógépek – az idejüket és számítási kapacitásukat fordították a tranzakciók feldolgozására és blokkok létrehozására a proof-of-stake mechanizmus bevezetése előtt. ## Miért léteznek a bányászok? {#why-do-miners-exist} -Az Ethereumhoz hasonló decentralizált rendszerek esetében biztosítanunk kell, hogy mindenki megegyezik a tranzakciók rendjében. A bányászok segítenek, hogy ez megtörténjen úgy, hogy számítás szempontjából nehéz rejtvényeket oldanak meg azért, hogy blokkokat hozhassanak létre, mely így a megvédi a hálózatot a támadásoktól. +Az Ethereumhoz hasonló decentralizált rendszerek esetében biztosítanunk kell, hogy mindenki egyetért a tranzakciók sorrendjében. A bányászok segítettek, hogy ez megtörténjen úgy, hogy számítás szempontjából nehéz rejtvényeket oldottak meg azért, hogy blokkokat hozhassanak létre, amely így megvédte a hálózatot a támadásoktól. + +[Bővebben a proof-of-work mechanizmusról](/developers/docs/consensus-mechanisms/pow/) + +Korábban bárki bányászhatott az Ethereum hálózaton a számítógépét használva. Ugyanakkor nem mindenkit tudott nyereségesen bányászni ethert (ETH). A legtöbb esetben a bányászoknak dedikált számítógépes hardvereket kellett szerezniük, és hozzá kellett férniük az energiaforrásokhoz. Egy átlagos számítógép nem valószínű, hogy elég blokkjutalmat tudott szerezni, hogy fedezze a bányászat költségeit. + +### A bányászat költsége {#cost-of-mining} -[Többet a proof-of-work-ről](/developers/docs/consensus-mechanisms/pow/) +- Annak a hardvernek a valószínű költsége, mely a bányászati eszköz felépítéséhez és fenntartásához szükséges +- A bányászati eszközt működtető elektromosság költsége +- Ha egy bányászati alapban vett részt valaki, akkor az alap általában egy %-os általánydíjat számolt fel minden létrehozott blokk után +- A bányászati eszköz támogatásához szükséges dolgok költségei (szellőztető, energiamonitorozás, elektromos vezetékek stb.) -## Hogyan bányásszák ki az Ethereum tranzakciókat {#how-ethereum-transactions-are-mined} +A bányászat nyereségességét olyan bányászati kalkulátor segítségével ellenőrizheti, mint amilyen az [Etherscan](https://etherscan.io/ether-mining-calculator) oldalon is található. -1. A felhasználó létrehoz és aláír egy [tranzakció](/developers/docs/transactions/) kérvényt valamely [számla](/developers/docs/accounts/) privát kulcsával. +## Hogyan bányászták ki az Ethereum-tranzakciókat {#how-ethereum-transactions-were-mined} + +A következőkben a tranzakciók bányászatáról olvashat egy áttekintés az Ethereum proof-of-work mechanizmusa idejéből. Az Ethereum proof-of-stake mechanizmusára vonatkozó leírást [itt](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos) találja. + +1. A felhasználó létrehoz és aláír egy [tranzakciós](/developers/docs/transactions/) kérvényt valamely [számla](/developers/docs/accounts/) privát kulcsával. 2. A felhasználó közvetíti a tranzakciós kérelmet a teljes hálózat számára valamilyen [csomópontról](/developers/docs/nodes-and-clients/). 3. Amint tudomást szereznek a tranzakció kérvényről, az Ethereum hálózat valamennyi csomópontja hozzáadja a kérvényt a lokális mempooljához, ami azokat a tranzakciós kérvényeket tartalmazza, amikről már tudomást szereztek, de még nem adták hozzá a blokklánchoz egy blokkban. -4. Egy bizonyos ponton egy bányász csomópont több tucat vagy több száz tranzakció kérvényt összesít egy potenciális [blokkba](/developers/docs/blocks/) úgy, hogy a begyűjtött [tranzakciós díj](/developers/docs/gas/) maximális legyen, de ne lépje túl a blokk gáz limitet. Ezután a bányász csomópont: - 1. Ellenőrzi az egyes tranzakciós kérelmek érvényességét (azaz senki nem próbál ethert átutalni olyan számláról, amelyhez nem készített aláírást, a kérés nem hibás, stb.), majd végrehajtja a kérés kódját, megváltoztatva az EVM helyi másolatának állapotát. A bányász jutalmul megkapja a tranzakciós díjat minden ilyen tranzakciós kérvényért a saját számlájára. +4. Egy bizonyos ponton egy bányászcsomópont több tucat vagy több száz tranzakciós kérvényt összesít egy potenciális [blokkba](/developers/docs/blocks/) úgy, hogy a begyűjtött [tranzakciós díj](/developers/docs/gas/) maximális legyen, de ne lépje túl a blokk gázkorlátozását. Ezután a bányász csomópont: + 1. Ellenőrzi az egyes tranzakciós kérelmek érvényességét (azaz senki nem próbál ethert átutalni olyan számláról, amelyhez nem készített aláírást, a kérés nem hibás, stb.), majd végrehajtja a kérés kódját, megváltoztatva az EVM helyi másolatának állapotát. A bányász a tranzakciós díjat minden ilyen tranzakciós kérvényért a saját számlájára teszi. 2. Elindítja a proof-of-work “megbízhatósági bizonyítvány” előállításának folyamatát a potenciális blokkra, amint az összes tranzakciós kérelmet érvényesítette és végrehajtotta a helyi EVM másolaton. -5. Végül egy bányász befejezi a bizonyítvány elkészítését egy blokkra, mely tartalmazza a mi specifikus tranzakciós kérelmünket. A bányász ezután közvetíti a kész blokkot, mely tartalmazza a bizonyítványt és egy checksumot az új, kiállított EVM állapotról. -6. A többi csomópont is tudomást szerez a blokkról. Érvényesítik a bizonyítványt, saját maguk is végrehajtják a blokk összes tranzakcióját (beleértve azt is amit eredetileg a felhasználónk közvetített), és megbizonyosodnak arról, hogy az új tranzakciók végrehajtása utáni EVM állapotuk checksumja megegyezik a bányász által kiállított blokk állapotának checksumjával. Csak ezután fűzik hozzá ezek a csomópontok ezt a blokkok a blokkláncuk végére és fogadják el az új EVM állapotot, mint kanonikus új állapot. +5. Végül egy bányász befejezi a bizonyítvány elkészítését egy blokkra, mely tartalmazza a mi specifikus tranzakciós kérelmünket. A bányász ezután közvetíti a kész blokkot, mely tartalmazza a bizonyítványt és az ellenőrző összeget az új, kiállított EVM állapotról. +6. A többi csomópont is tudomást szerez a blokkról. Érvényesítik a bizonyítványt, saját maguk is végrehajtják a blokk összes tranzakcióját (beleértve azt is, amit eredetileg a felhasználónk közvetített), és megbizonyosodnak arról, hogy az új tranzakciók végrehajtása utáni EVM állapotuk ellenőrző összege megegyezik a bányász által kiállított blokk állapotának összegével. Csak ezután fűzik hozzá ezek a csomópontok ezt a blokkot a blokkláncuk végére, és fogadják el az új EVM állapotot, mint kanonikus új állapot. 7. Minden csomópont eltávolítja az új blokkban lévő összes tranzakciót a teljesítetlen tranzakciós kérvényeket tartalmazó helyi mempooljából. -8. A hálózatba újonnan becsatlakozó csomópontok letöltik az összes blokkot a sorrendet betartva beleértve azt a blokkot is, mely a szóban forgó tranzakciónkat tartalmazza. Inicializálnak egy helyi EVM másolatot (mely egy üres állapotú EVM-ként indul), ezután végig mennek az összes blokkban található összes tranzakció végrehajtásának folyamatán a helyi EVM másolatukon miközben érvényesítik a blokkok állapot checksumjait. +8. A hálózatba újonnan becsatlakozó csomópontok letöltik az összes blokkot a sorrendet betartva, beleértve azt a blokkot is, mely a szóban forgó tranzakciónkat tartalmazza. Inicializálnak egy helyi EVM másolatot (mely egy üres állapotú EVM-ként indul), ezután végig mennek az összes blokkban található összes tranzakció végrehajtásának folyamatán a helyi EVM másolatukon, miközben érvényesítik a blokkok állapotainak ellenőrző összegeit. + +Minden tranzakciót egyszer bányásznak ki (blokkba foglalják és első alkalommal közvetítik), de minden résztvevő végrehajtja és érvényesíti azokat a kanonikus EVM-állapot előrevitelének folyamatában. Ez kiemeli a blokklánc egyik központi mantráját: **Nem kell megbíznia senkiben. Csak ellenőrizni.**. + +## Ommer (nagybácsi) blokkok {#ommer-blocks} + +A proof-of-work mechanizmusban végzett blokkbányászat valószínűségen alapult, tehát néha a hálózati késedelem miatt két érvényes blokkot is publikáltak egyszerre. Ebben az esetben a protokoll kiválasztotta a leghosszabb láncot (amelyik érvényesebb volt), miközben díjazta azt a bányászt is egy részleges jutalommal, akinek nem került be a javasolt blokkja. Ez bátorította a hálózat decentralizációját, mert a kisebb bányászok, akiknél nagyobb volt a csúszás, még mindig tudtak nyereséget szerezni az [ommer](/glossary/#ommer) blokkok jutalmából. -Minden tranzakciót egyszer bányásznak ki (blokkba foglalják és első alkalommal közvetítik), de minden résztvevő végrehajtja és érvényesíti őket a kanonikus EVM állapot előre vitelének folyamatában. Ez kiemeli a blokklánc egyik központi mantráját: **Ne bízz meg benne, hanem ellenőrizd.**. +Az „ommer” kifejezés a szülőblokk testvérblokkjának semleges formája, de néha nagybácsi/uncle formában is hivatkoznak rá. **Mióta az Ethereum átállt a proof-of-stake mechanizmusra, többé nincsenek ommer blokkok**, mivel csak egy előterjesztő van minden slotban. Ezt a változást megtekintheti a kibányászott ommer blokkok [előzményábráján](https://ycharts.com/indicators/ethereum_uncle_rate) is. ## Egy vizuális bemutató {#a-visual-demo} -Nézd meg ahogy Austin végig kísér a bányászaton és a proof-of-work blokkláncon. +Tekintse meg, ahogy Austin elmagyarázza a bányászatot és a proof-of-work blokkláncot. -## További olvasnivaló {#further-reading} +## A bányászati algoritmus {#mining-algorithm} -## Kapcsolódó eszközök {#related-tools} +Az Ethereum főhálózat csak egy bányászati algoritmust használt: [Ethash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/). Az Ethash volt az utódja az eredeti kutatási-fejlesztési algoritmusnak, melyet [Dagger-Hashimoto-nak](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/) neveztek. -- [Legnagyobb Ethereum bányászok](https://etherscan.io/stat/miner?range=7&blocktype=blocks) -- [Ethereum bányászat kalkulátor](https://minerstat.com/coin/ETH) +[Bővebben a bányászati algoritmusokról](/developers/docs/consensus-mechanisms/pow/mining-algorithms/). ## Kapcsolódó témák {#related-topics} diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md new file mode 100644 index 00000000000..90bd1a8137d --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -0,0 +1,334 @@ +--- +title: Dagger-Hashimoto +description: A Dagger-Hashimoto algoritmus részletes áttekintése. +lang: hu +--- + +A Dagger-Hashimoto volt az Ethereum bányászati algoritmusának eredeti fejlesztési implementációja és specifikációja. A Dagger-Hashimoto algoritmust az [Ethash](#ethash) váltotta le. A bányászatot teljesen kikapcsolták az [egyesítés (Merge)](/updates/merge) frissítés életbe lépésekor, 2022. szeptember 15-én. Azóta az Ethereumot a [proof-of-stake (letéti igazolás)](/developers/docs/consensus-mechanisms/pos) mechanizmusa biztosítja. Ez az oldal elavult témákat tartalmaz, amelyek többé már nem relevánsak az egyesítés (Merge) utáni Ethereummal kapcsolatban. + +## Előfeltételek {#prerequisites} + +A jelen téma könnyebb megértéséhez javasoljuk, hogy tekintse meg a [proof-of-work konszenzus](/developers/docs/consensus-mechanisms/pow), a [bányászat](/developers/docs/consensus-mechanisms/pow/mining), és a [bányászati algoritmusok](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms) témáit. + +## Dagger-Hashimoto {#dagger-hashimoto} + +A Dagger-Hashimoto két célt szolgál: + +1. **ASIC-ellenálló**: az algoritmus futtatásához a specializált hardver kialakításából adódó előny a lehető legkisebb legyen +2. **Könnyű kliens általi ellenőrizhetőség**: a blokkot egy könnyű kliens is le tudja ellenőrizni hatékonyan. + +Egy újabb módosítással meghatározhatjuk, hogyan tud egy harmadik célt is kielégíteni, de ez a komplexitás növekedésével jár: + +**A teljes lánc tárolása**: a bányászathoz a teljes blokklánc státuszát le kell tárolni (az Ethereum státuszfa szabálytalan struktúrája miatt talán lehetséges ennek megrövidítése, főleg a gyakori szerződéseknél, de ezt minimalizálni szeretnénk). + +## DAG létrehozása {#dag-generation} + +Az algoritmus kódját pythonban alább találja. Először az `encode_int` kódot adjuk meg, hogy a megadott pontosságú nem aláírt egész számokat sztringekké alakítsa. Ennek fordítottja is megadásra kerül: + +```python +NUM_BITS = 512 + +def encode_int(x): + "Encode an integer x as a string of 64 characters using a big-endian scheme" + o = '' + for _ in range(NUM_BITS / 8): + o = chr(x % 256) + o + x //= 256 + return o + +def decode_int(s): + "Unencode an integer x from a string using a big-endian scheme" + x = 0 + for c in s: + x *= 256 + x += ord(c) + return x +``` + +Ezután, feltételezve, hogy az `sha3` egy olyan függvény, ami egész számot kap és azt is ad ki eredményként, továbbá a `dbl_sha3` egy dupla sha3 függvény; ha ezt a referenciakódot implementációvá alakítjuk: + +```python +from pyethereum import utils +def sha3(x): + if isinstance(x, (int, long)): + x = encode_int(x) + return decode_int(utils.sha3(x)) + +def dbl_sha3(x): + if isinstance(x, (int, long)): + x = encode_int(x) + return decode_int(utils.sha3(utils.sha3(x))) +``` + +### Parameters {#parameters} + +Az algoritmushoz a következő paramétereket használjuk: + +```python +SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 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 +} +``` + +A `P` ebben az esetben egy olyan prímszám, hogy a `log₂(P)` éppen csak kisebb legyen, mint 512, ami az 512 bithez kapcsolódik, amit a számok reprezentálására használunk. Érdemes megjegyezni, hogy a DAG-nek csak a második felét kell eltárolni, így a RAM-igény 1 GB-tól indul és 441 MB-tal növekszik évente. + +### Dagger-gráfépítés {#dagger-graph-building} + +A dagger-gráfépítési függvényt a következőképpen definiáljuk: + +```python +def produce_dag(params, seed, length): + P = params["P"] + picker = init = pow(sha3(seed), params["w"], P) + o = [init] + for i in range(1, length): + x = picker = (picker * init) % P + for _ in range(params["k"]): + x ^= o[x % i] + o.append(pow(x, params["w"], P)) + return o +``` + +Lényegében a gráfot egy egyszerű csomópontként kezdi (`sha3(seed)`), és innen ad hozzá szekvenciálisan újabb csomópontokat a véletlenszerű előzők csomópontok alapján. Egy új csomópont létrehozásakor a mag moduláris hatványát kiszámítjuk, hogy véletlenszerűen kiválasszunk néhány `i`-nél kisebb indexet (a fenti `x % i` használatával), és az ezeknél az indexeknél lévő csomópontok értékeit egy számításban felhasználjuk az `x` új értékének létrehozásához, amelyet aztán egy kis (XOR-alapú) proof-of-work függvénybe táplálunk, hogy végül az `i` indexnél lévő gráf értékét generáljuk. E sajátos kialakítás értelme az, hogy a DAG-hoz szekvenciális hozzáférést biztosítson; a DAG következő értékét nem lehet meghatározni addig, amíg a jelenlegi nem ismert. Végül a moduláris exponenciálás hasheli tovább az eredményt. + +Ez az algoritmus a számelmélet számos eredményén alapszik. Az alábbi függelékben megtalálhatja az erről szóló beszélgetést. + +## Könnyű kliens általi értékelés {#light-client-evaluation} + +Ez a gráfkonstrukció arra való, hogy a gráf minden csomópontja újraépíthető legyen egy kis számú csomópontból álló alfa segítségével, és csak kevés kiegészítő memória kelljen hozzá. Vegye figyelembe, hogy ha k=1, akkor az alfastruktúra csak az értékek egy olyan lánca, ami a DAG első eleméig tart. + +A DAG-re a következőképpen működik a könnyű kliens számítási függvénye: + +```python +def quick_calc(params, seed, p): + w, P = params["w"], params["P"] + cache = {} + + def quick_calc_cached(p): + if p in cache: + pass + elif p == 0: + cache[p] = pow(sha3(seed), w, P) + else: + x = pow(sha3(seed), (p + 1) * w, P) + for _ in range(params["k"]): + x ^= quick_calc_cached(x % p) + cache[p] = pow(x, w, P) + return cache[p] + + return quick_calc_cached(p) +``` + +Lényegében ez a fenti algoritmus átirata, ami kiveszi a teljes DAG számítási ciklusát, és a korábbi csomópontkereső függvényt cseréli le egy rekurzív hívásra vagy egy cache-keresőre. Érdemes megjegyezni, hogy `k=1` esetén a cache szükségtelen, bár egy további optimalizálással a DAG első néhány ezer értékét előre kiszámítja, és statikus cache-ként tárolja a számításokhoz; ennek kódmegvalósítását tekintse meg a függelékben. + +## A DAG-ek dupla puffere {#double-buffer} + +Egy teljes kliensben 2 DAG [_dupla pufferét_](https://wikipedia.org/wiki/Multiple_buffering) használják, melyet a fenti képlet ad meg. Az elképzelés szerint a DAG-eket minden `epochtime` (korszakban) blokkszámonként készítik a fenti paramétereknek megfelelően. Ahelyett, hogy a kliens a legutóbbi DAG-et használná, az eggyel korábbit veszi figyelembe. Ennek előnye az, hogy a DAG-eket le lehet cserélni idővel anélkül, hogy a bányászoknak hirtelen az összes adatot újra kellene számolniuk. Máskülönben felmerül egy hirtelen, átmeneti lelassulás esélye a láncfeldolgozásnak, ami drasztikusan növeli a centralizációt. Így megnő az 51%-os támadás kockázata is az adat újraszámítása előtti percekben. + +A blokkhoz szükséges munka kiszámításához használt DAG-ek halmazának létrehozására használt algoritmus a következő: + +```python +def get_prevhash(n): + from pyethereum.blocks import GENESIS_PREVHASH + from pyethereum import chain_manager + if num <= 0: + return hash_to_int(GENESIS_PREVHASH) + else: + prevhash = chain_manager.index.get_block_by_number(n - 1) + return decode_int(prevhash) + +def get_seedset(params, block): + seedset = {} + seedset["back_number"] = block.number - (block.number % params["epochtime"]) + seedset["back_hash"] = get_prevhash(seedset["back_number"]) + seedset["front_number"] = max(seedset["back_number"] - params["epochtime"], 0) + seedset["front_hash"] = get_prevhash(seedset["front_number"]) + return seedset + +def get_dagsize(params, block): + return params["n"] + (block.number // params["epochtime"]) * params["n_inc"] + +def get_daggerset(params, block): + dagsz = get_dagsize(params, block) + seedset = get_seedset(params, block) + if seedset["front_hash"] <= 0: + # No back buffer is possible, just make front buffer + return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), + "block_number": 0}} + else: + return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), + "block_number": seedset["front_number"]}, + "back": {"dag": produce_dag(params, seedset["back_hash"], dagsz), + "block_number": seedset["back_number"]}} +``` + +## Hashimoto {#hashimoto} + +Az eredeti Hashimoto lényege, hogy a blokkláncot adathalmazként használja, és olyan számítást végez, amely kiválaszt N indexet a blokkláncból, összegyűjti a tranzakciókat ezeken az indexeken, elvégzi a XOR-t ezekre az adatokra, és visszaadja az eredmény hashét. Thaddeus Dryja eredeti algoritmusa, Pythonra átfordítva a konzisztencia érdekében, így néz ki: + +```python +def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): + hash_output_A = sha256(prev_hash + merkle_root + nonce) + txid_mix = 0 + for i in range(64): + shifted_A = hash_output_A >> i + transaction = shifted_A % len(list_of_transactions) + txid_mix ^= list_of_transactions[transaction] << i + return txid_max ^ (nonce << 192) +``` + +Sajnálatos módon, miközben a Hashimoto nagy RAM-igényű, 256 bites aritmetikán alapszik, ami jelentős számítási többletköltséggel jár. Ugyanakkor a Dagger-Hashimoto csak a legkevésbé szignifikáns 64 bitet használja az adathalmaz indexálására, hogy ezt a problémát kezelje. + +```python +def hashimoto(dag, dagsize, params, header, nonce): + m = dagsize / 2 + mix = sha3(encode_int(nonce) + header) + for _ in range(params["accesses"]): + mix ^= dag[m + (mix % 2**64) % m] + return dbl_sha3(mix) +``` + +A dupla SHA3 használata lehetővé teszi a nulla adatot tartalmazó, szinte azonnali előzetes ellenőrzést, amely csak azt ellenőrzi, hogy a helyes közbenső értéket adták meg. A proof-of-worknek ez a külső rétege rendkívül ASIC-barát és meglehetősen gyenge, de azért létezik, hogy még nehezebbé tegye a DDoS-t, mivel ezt a kis mennyiségű munkát kell elvégezni ahhoz, hogy egy olyan blokkot hozzanak létre, amelyet nem utasítanak el azonnal. Ez a könnyű kliens verziója: + +```python +def quick_hashimoto(seed, dagsize, params, header, nonce): + m = dagsize // 2 + mix = sha3(nonce + header) + for _ in range(params["accesses"]): + mix ^= quick_calc(params, seed, m + (mix % 2**64) % m) + return dbl_sha3(mix) +``` + +## Bányászat és ellenőrzés {#mining-and-verifying} + +Most vezessük be mindezt a bányászati algoritmusba: + +```python +def mine(daggerset, params, block): + from random import randint + nonce = randint(0, 2**64) + while 1: + result = hashimoto(daggerset, get_dagsize(params, block), + params, decode_int(block.prevhash), nonce) + if result * params["diff"] < 2**256: + break + nonce += 1 + if nonce >= 2**64: + nonce = 0 + return nonce +``` + +Ez az ellenőrzési algoritmus: + +```python +def verify(daggerset, params, block, nonce): + result = hashimoto(daggerset, get_dagsize(params, block), + params, decode_int(block.prevhash), nonce) + return result * params["diff"] < 2**256 +``` + +Ez a könnyű kliens általi barátságos ellenőrzés: + +```python +def light_verify(params, header, nonce): + seedset = get_seedset(params, block) + result = quick_hashimoto(seedset["front_hash"], get_dagsize(params, block), + params, decode_int(block.prevhash), nonce) + return result * params["diff"] < 2**256 +``` + +Emellett érdemes megjegyezni, hogy a Dagger-Hashimoto a blokkfejlécre egyéb követelményeket is megfogalmazott: + +- A kétszintű ellenőrzéshez a blokkfejlécnek tartalmaznia kell a nonce-t és az sha3 előtti köztes értéket +- Valahol a blokkfejlécnek tárolnia kell a jelenlegi seed-halmaz sha3-ját + +## További olvasnivaló {#further-reading} + +_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ + +## Függelék {#appendix} + +Mint fentebb említettük, a DAG generálásához használt RNG a számelmélet néhány eredményére támaszkodik. Először is biztosítjuk, hogy a `picker` változó alapjául szolgáló Lehmer RNG széles periódussal rendelkezik. Másodszor, megmutatjuk, hogy a `pow(x,3,P)` nem fogja `x` kódot `1` vagy `P-1` értékre leképezni, feltéve, hogy `x ∈ [2,P-2]`. Végül megmutatjuk, hogy a `pow(x,3,P)` alacsony ütközési rátával rendelkezik, ha hash függvényként kezeljük. + +### Lehmer véletlenszám-generátor {#lehmer-random-number} + +Bár a `produce_dag` függvénynek nem kell torzítatlan véletlen számokat produkálnia, és potenciális veszélyt jelent, hogy a `seed**i % P` csak néhány értéket vesz fel. Ez előnyt jelenthet azoknak a bányászoknak, akik felismerik a mintát, miközben mások nem. + +Ennek elkerülése érdekében egy számelméleti eredményre hivatkozunk. A [_biztonságos prímszám_](https://en.wikipedia.org/wiki/Safe_prime) egy olyan prím `P`, amelynél a `(P-1)/2` szintén prímszám. A [multiplikatív csoport](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) egy `x` tagjának _rendje_ a `ℤ/nℤ` meghatározása szerint a minimális `m` úgy, hogy
    xᵐ mod P ≡ 1
    +Ezen definíciók szerint: + +> 1. megfigyelés. Legyen `x` a `ℤ/Pℤ` multiplikatív csoport tagja egy biztonságos `P` prímszámhoz. Ha `x mod P ≠ 1 mod P` és `x mod P ≠ P-1 mod P`, akkor `x` rendje vagy `P-1` vagy `(P-1)/2`. + +_Bizonyítás_. Mivel `P` egy biztonságos prímszám, akkor a \[Lagrange-tétel\]\[lagrange\] alapján azt kell mondanunk, hogy `x` rendje vagy `1`, `2`, `(P-1)/2` vagy `P-1`. + +A `x` sorrendje nem lehet `1` Fermat kis tételéből következően: + +
    xP-1 mod P ≡ 1
    + +Ezért `x` a `ℤ/nℤ` multiplikatív azonosságának kell lennie, ami egyedi. Mivel feltételezésünk szerint `x ≠ 1`, ez nem lehetséges. + +Az `x` sorrendje nem lehet `2`, kivéve, ha `x = P-1`, mivel ez sértené, hogy `P` prímszám. + +A fenti tételből felismerhetjük, hogy a `(picker * init) % P` ismétlése legalább `(P-1)/2` ciklushosszúságú lesz. Ennek az az oka, hogy a `P` értékének egy biztonságos prímszámot választottunk, amely megközelítőleg egyenlő a kettő nagyobb hatványával, és `init` a `[2,2**256+1]` intervallumban van. A `P` nagyságát tekintve a moduláris exponenciálástól nem várhatunk ciklust. + +A DAG első cellájának (az `init` feliratú változó) hozzárendelésekor kiszámítjuk a `pow(sha3(seed) + 2, 3, P)` értékét. Első pillantásra ez nem garantálja, hogy az eredmény nem `1` és nem `P-1`. Mivel azonban `P-1` egy biztonságos prímszám, a következő további bizonyosságunk van, amely az 1. megfigyelés következménye: + +> 2. megfigyelés. Legyen `x` a `ℤ/Pℤ` multiplikatív csoport tagja egy biztonságos `P` prímszámhoz, és legyen `w` egy természetes szám. Ha `x mod P ≠ 1 mod P` és `x mod P ≠ P-1 mod P`, valamint `w mod P ≠ P-1 mod P` és `w mod P ≠ 0 mod P`, akkor `xʷ mod P ≠ 1 mod P` és `xʷ mod P ≠ P-1 mod P` + +### Moduláris exponenciálás hashfüggvényként {#modular-exponentiation} + +A `P` és `w` bizonyos értékei esetén a `pow(x, w, P)` függvénynek sok ütközése lehet. Például a `pow(x,9,19)` csak `{1,18}` értékeket vesz fel. + +Adott, hogy `P` prímszám, akkor egy megfelelő `w` moduláris exponenciálási hashfüggvényhez a következő eredmény segítségével választható ki: + +> 3. megfigyelés. Legyen `P` egy prímszám; `w` és `P-1` akkor, és csak akkor relatív prímszámok, ha minden `a` és `b` esetén `ℤ/Pℤ`: +> +>
    +> `aʷ mod P ≡ bʷ mod P`, ha és csak ha `a mod P ≡ b mod P` +>
    + +Így, feltéve, hogy `P` prím és `w` relatíve prím `P-1`-hez, akkor `|{pow(x, w, P) : x ∈ ℤ}| = P`, ami azt jelenti, hogy a hashfüggvény a lehető legkisebb ütközési rátával rendelkezik. + +Abban a speciális esetben, ha `P` egy biztonságos prímszám, ahogyan azt választottuk, akkor `P-1` csak 1, 2, `(P-1)/2` és `P-1` faktorokkal rendelkezik. Mivel `P` > 7, tudjuk, hogy 3 relatív prím a `P-1`-hez, ezért `w=3` kielégíti a fenti tételt. + +## Hatékonyabb cache-alapú kiértékelő algoritmus {#cache-based-evaluation} + +```python +def quick_calc(params, seed, p): + cache = produce_dag(params, seed, params["cache_size"]) + return quick_calc_cached(cache, params, p) + +def quick_calc_cached(cache, params, p): + P = params["P"] + if p < len(cache): + return cache[p] + else: + x = pow(cache[0], p + 1, P) + for _ in range(params["k"]): + x ^= quick_calc_cached(cache, params, x % p) + return pow(x, params["w"], P) + +def quick_hashimoto(seed, dagsize, params, header, nonce): + cache = produce_dag(params, seed, params["cache_size"]) + return quick_hashimoto_cached(cache, dagsize, params, header, nonce) + +def quick_hashimoto_cached(cache, dagsize, params, header, nonce): + m = dagsize // 2 + mask = 2**64 - 1 + mix = sha3(encode_int(nonce) + header) + for _ in range(params["accesses"]): + mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) + return dbl_sha3(mix) +``` diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md new file mode 100644 index 00000000000..b14af01c475 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -0,0 +1,1014 @@ +--- +title: Ethash +description: Az Ethash algoritmus részletes bemutatása. +lang: hu +--- + + + Az Ethash volt az Ethereum proof-of-work (munkaigazolás) bányászati algoritmusa. A proof-of-work jelenleg **teljesen ki van kapcsolva**, az Ethereumot pedig a proof-of-stake mechanizmus biztosítja. Tudjon meg többet az egyesítés (Merge), proof-of-stake (letéti igazolás) és letétbe helyezés témákról. Ez az oldal elavult témákat tartalmaz! + + +Az [Ethash](https://github.com/ethereum/wiki/wiki/Ethash) a [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto) algoritmus egy módosított változata. Az Ethash proof-of-work egy [ memóriaigényes (memory hard)](https://wikipedia.org/wiki/Memory-hard_function) működés, ami miatt ez az algoritmus ASIC-ellenálló. Az Ethash ASIC-t végül kifejlesztették, de a GPU-bányászat még mindig működő opció volt addig, amíg a proof-of-work metódust ki nem kapcsolták. Az Ethasht még használják más érmék bányászatánál, nem Ethereumon és nem proof-of-work hálózatokon. + +## Hogyan működik az Ethash? {#how-does-ethash-work} + +A memóriaigényt (memory hardness) egy proof-of-work algoritmussal lehet elérni, amelynek egy rögzített erőforrás részhalmazait kell kiválasztania a nonce és a blokkfejléc alapján. Ezt az erőforrást (ami néhány gigabájt nagyságú) DAG-nek (irányított aciklikus gráf/Directed Acyclic Graph) nevezik. A DAG minden 30 000. blokknál megváltozik, ami nagyjából 125 órás időtartamnak felel meg – ezt korszaknak nevezik (kb. 5,2 nap) és időbe telik, amíg létrejön. Mivel a DAG csak a blokk magasságán múlik, ezért előre el lehet készíteni, de ha nincs, akkor a kliensnek meg kell várnia a folyamat végét ahhoz, hogy blokkot készítsen. Ha a kliensek nem hozzák létre és cache-elik a DAG-eket korábban, akkor a hálózat komoly blokk-késedelmet szenved el minden korszakváltásnál (epoch). Fontos megjegyezni, hogy a DAG nem szükséges a proof-of-work ellenőrzéséhez, így ezt a folyamatot alacsony CPU-val és kevés memóriával is lehet végezni. + +Az algoritmus a következő általános utat teszi meg: + +1. Létezik egy **mag (seed)**, amelyet ki lehet számolni minden blokkra úgy, hogy a blokkfejléceket addig a pontig végigszkennelik. +2. Ebből a magból ki lehet számolni egy **16 MB álvéletlenszerű cache-t**. A könnyű kliensek tárolják a cache-t. +3. A gyorsítótárból egy **1 GB adathalmazt** lehet létrehozni, amelyben minden elem csak kevés gyorsítótár elemtől függ. A teljes kliensek és bányászok tárolják az adathalmazt. Az adathalmaz az idővel egyre növekszik. +4. A bányászat során az adathalmaz véletlenszerű szeleteit felkapják és összehashelik. Az ellenőrzést alacsony memóriával is lehet végezni, a cache-t használva arra, hogy újragenerálja az adathalmaz szükséges részeit, ezért csak a cache-t kell tárolni. + +A nagy adathalmaz minden 30 000. blokk után frissül, ezért a bányászok erőfeszítéseinek legjava az adatkészlet olvasására összpontosít, nem pedig a változtatására. + +## Definíciók {#definitions} + +A következő definíciókat használjuk: + +``` +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 +``` + +### Az SHA3 használata {#sha3} + +Az Ethereum fejlesztése egybe esett az SHA3 szabvány kifejlesztésével, és a standard folyamat egy változtatást vitt véghez a végső hashalgoritmussal kapcsolatban, így az Ethereum „sha3_256” és „sha3_512” hashek nem szabványos sha3 hashek, hanem variánsok, melyre gyakran „Keccak-256” és „Keccak-512” néven hivatkoznak más kontextusban. A kapcsolódó beszélgetéseket [itt](https://eips.ethereum.org/EIPS-1803), [itt](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) vagy [itt](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057) találja. + +Vegye figyelembe, hogy az alábbi leírás SHA3-hashekre hivatkozik az algoritmus tekintetében. + +## Parameters {#parameters} + +Az Ethash-cache és adathalmaz paraméterei a blokkszámtól függenek. A cache és az adathalmaz mérete egyenes arányosságban növekszik; ugyanakkor mindig a legnagyobb prímszámot választjuk a lineárisan növekvő határ alatt, hogy kevesebb kockázata legyen valamilyen szokatlan dolognak, ami ciklikus viselkedéshez vezet. + +```python +def get_cache_size(block_number): + sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (block_number // EPOCH_LENGTH) + sz -= HASH_BYTES + while not isprime(sz / HASH_BYTES): + sz -= 2 * HASH_BYTES + return sz + +def get_full_size(block_number): + sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH) + sz -= MIX_BYTES + while not isprime(sz / MIX_BYTES): + sz -= 2 * MIX_BYTES + return sz +``` + +Az adathalmaznak és a cache-méret értékeinek táblázatát a függelékben találja. + +## Cache létrehozása {#cache-generation} + +Most meghatározzuk a cache létrehozásának függvényét: + +```python +def mkcache(cache_size, seed): + n = cache_size // HASH_BYTES + + # Sequentially produce the initial dataset + o = [sha3_512(seed)] + for i in range(1, n): + o.append(sha3_512(o[-1])) + + # Use a low-round version of randmemohash + for _ in range(CACHE_ROUNDS): + for i in range(n): + v = o[i][0] % n + o[i] = sha3_512(map(xor, o[(i-1+n) % n], o[v])) + + return o +``` + +A cache létrehozása először 32 MB-nyi memória szekvenciális feltöltését igényli, majd Sergio Demian Lerner _RandMemoHash_ algoritmusának két végrehajtását a [_Strict Memory Hard Hashing Functions-ből_ (2014)](http://www.hashcash.org/papers/memohash.pdf). Az eredmény egy 524 288 db 64-bájtos elemből álló készlet. + +## Adataggregálási függvény {#date-aggregation-function} + +Olyan algoritmust használunk, amit az [FNV hash](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) inspirált néhány esetben, mint a XOR nem-asszociatív helyettesítője. Vegye figyelembe, hogy a prímszámot a teljes 32 bites bemeneti adattal megszorozzuk, ellentétben az FNV-1 specifikációval, ami a prímszámot egy bájttal (octet) szorozza. + +```python +FNV_PRIME = 0x01000193 + +def fnv(v1, v2): + return ((v1 * FNV_PRIME) ^ v2) % 2**32 +``` + +Vegye figyelembe, hogy még a Sárgakönyv is úgy határozza meg az fnv-t, mint v1\*(FNV_PRIME ^ v2), és minden jelenlegi implementáció konzisztensen ezt használja. + +## Teljes adathalmaz kiszámítása {#full-dataset-calculation} + +Minden 64 bájtos elem a teljes 1 GB-nyi adathalmazban a következőképpen kerül kiszámolásra: + +```python +def calc_dataset_item(cache, i): + n = len(cache) + r = HASH_BYTES // WORD_BYTES + # initialize the mix + 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 + for j in range(DATASET_PARENTS): + cache_index = fnv(i ^ j, mix[j % r]) + mix = map(fnv, mix, cache[cache_index % n]) + return sha3_512(mix) +``` + +Lényegében a 256 álvéletlenszerűen kiválasztott cache-csomópontokból származó adatot kombináljuk, és ezeket hasheljük, hogy kiszámoljuk az adathalmaz csomópontját. Ezután a teljes adathalmazt létrehozzuk: + +```python +def calc_dataset(full_size, cache): + return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)] +``` + +## Fő ciklus {#main-loop} + +Most meghatározzuk a fő „hashimoto”-szerű ciklust, ahol aggregáljuk a teljes adathalmazból vett adatokat azért, hogy egy bizonyos fejléchez és nonce-hoz végső értéket rendeljünk. A lenti kódban a `header` (fejléc) az SHA3-256 _hasht_ képviseli, ami az RLP reprezentációja egy _csonka_ blokkfejlécnek, tehát olyan fejléc, amiben nincs benne a **mixHash** és a **nonce**. A `nonce` egy 64 bites, nem aláírt egész szám nyolc bájtja big-endian sorban. Tehát a `nonce[::-1]` a nyolc bájtos kis-endian reprezentációja ennek az értéknek: + +```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 + s = sha3_512(header + nonce[::-1]) + # start the mix with replicated s + mix = [] + for _ in range(MIX_BYTES / HASH_BYTES): + mix.extend(s) + # mix in random dataset nodes + 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 + 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])) + return { + "mix digest": serialize_hash(cmix), + "result": serialize_hash(sha3_256(s+cmix)) + } + +def hashimoto_light(full_size, cache, header, nonce): + return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x)) + +def hashimoto_full(full_size, dataset, header, nonce): + return hashimoto(header, nonce, full_size, lambda x: dataset[x]) +``` + +Lényegében egy 128 bájt széles „mixet” készítünk, és ismétlődő módon, szekvenciálisan felkapunk 128 bájtot a teljes adathalmazból, és az `fnv` függvénnyel összekombináljuk a mix-szel. Azért 128 bájtnyi szekvenciális bemenetet használunk, hogy az algoritmus minden egyes köre a RAM egy teljes oldalát felkapja, így minimalizálva az átfordítás hibáit, melyeket az ASIC elméletileg el tudna kerülni. + +Ha az algoritmus kimenete a várt eredményt adja, akkor a nonce érvényes. Fontos megjegyezni, hogy az `sha3_256` extra alkalmazása a végén azt biztosítja, hogy létezik egy köztes nonce, ami bizonyítja, hogy legalább egy kis munkavégzés történt; ezt a gyors, külső proof-of-work-ellenőrzést DDoS elleni célokra lehet használni. Emellett statisztikai biztosítást is ad, hogy az eredmény egy helyes 256 bites szám. + +## Bányászat {#mining} + +A bányászati algoritmust a következőképpen definiáljuk: + +```python +def mine(full_size, dataset, header, difficulty): + # zero-pad target to compare with hash on the same digit + target = zpad(encode_int(2**256 // difficulty), 64)[::-1] + from random import randint + nonce = randint(0, 2**64) + while hashimoto_full(full_size, dataset, header, nonce) > target: + nonce = (nonce + 1) % 2**64 + return nonce +``` + +## A seed hash meghatározása {#seed-hash} + +A seed hash kiszámolásához, amellyel egy adott blokk tetején lehet bányászni, a következő algoritmust használjuk: + +```python + def get_seedhash(block): + s = '\x00' * 32 + for i in range(block.number // EPOCH_LENGTH): + s = serialize_hash(sha3_256(s)) + return s +``` + +Vegye figyelembe, hogy a zavartalan bányászat és ellenőrzés érdekében érdemes előre kiszámolni a jövőbeli seed hasheket és adathalmazokat egy másik helyen. + +## További olvasnivaló {#further-reading} + +_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ + +## Függelék {#appendix} + +A következő kódot kell beilleszteni, ha Ön a fenti python-specifikációt akarja futtatni kódként. + +```python +import sha3, copy + +# Assumes little endian bit ordering (same as Intel architectures) +def decode_int(s): + return int(s[::-1].encode('hex'), 16) if s else 0 + +def encode_int(s): + a = "%x" % s + return '' if s == 0 else ('0' * (len(a) % 2) + a).decode('hex')[::-1] + +def zpad(s, length): + return s + '\x00' * max(0, length - len(s)) + +def serialize_hash(h): + return ''.join([zpad(encode_int(x), 4) for x in h]) + +def deserialize_hash(h): + return [decode_int(h[i:i+WORD_BYTES]) for i in range(0, len(h), WORD_BYTES)] + +def hash_words(h, sz, x): + if isinstance(x, list): + x = serialize_hash(x) + y = h(x) + return deserialize_hash(y) + +def serialize_cache(ds): + return ''.join([serialize_hash(h) for h in ds]) + +serialize_dataset = serialize_cache + +# sha3 hash function, outputs 64 bytes +def sha3_512(x): + return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) + +def sha3_256(x): + return hash_words(lambda v: sha3.sha3_256(v).digest(), 32, x) + +def xor(a, b): + return a ^ b + +def isprime(x): + for i in range(2, int(x**0.5)): + if x % i == 0: + return False + return True +``` + +### Adatméretek {#data-sizes} + +A következő tábla kb. 2048 korszak adat- és cache-méreteit mutatja meg. + +```python +def get_datasize(block_number): + return data_sizes[block_number // EPOCH_LENGTH] + +def get_cachesize(block_number): + return cache_sizes[block_number // EPOCH_LENGTH] + +data_sizes = [ +1073739904, 1082130304, 1090514816, 1098906752, 1107293056, +1115684224, 1124070016, 1132461952, 1140849536, 1149232768, +1157627776, 1166013824, 1174404736, 1182786944, 1191180416, +1199568512, 1207958912, 1216345216, 1224732032, 1233124736, +1241513344, 1249902464, 1258290304, 1266673792, 1275067264, +1283453312, 1291844992, 1300234112, 1308619904, 1317010048, +1325397376, 1333787776, 1342176128, 1350561664, 1358954368, +1367339392, 1375731584, 1384118144, 1392507008, 1400897408, +1409284736, 1417673344, 1426062464, 1434451072, 1442839168, +1451229056, 1459615616, 1468006016, 1476394112, 1484782976, +1493171584, 1501559168, 1509948032, 1518337664, 1526726528, +1535114624, 1543503488, 1551892096, 1560278656, 1568669056, +1577056384, 1585446272, 1593831296, 1602219392, 1610610304, +1619000192, 1627386752, 1635773824, 1644164224, 1652555648, +1660943488, 1669332608, 1677721216, 1686109312, 1694497664, +1702886272, 1711274624, 1719661184, 1728047744, 1736434816, +1744829056, 1753218944, 1761606272, 1769995904, 1778382464, +1786772864, 1795157888, 1803550592, 1811937664, 1820327552, +1828711552, 1837102976, 1845488768, 1853879936, 1862269312, +1870656896, 1879048064, 1887431552, 1895825024, 1904212096, +1912601216, 1920988544, 1929379456, 1937765504, 1946156672, +1954543232, 1962932096, 1971321728, 1979707264, 1988093056, +1996487552, 2004874624, 2013262208, 2021653888, 2030039936, +2038430848, 2046819968, 2055208576, 2063596672, 2071981952, +2080373632, 2088762752, 2097149056, 2105539712, 2113928576, +2122315136, 2130700672, 2139092608, 2147483264, 2155872128, +2164257664, 2172642176, 2181035392, 2189426048, 2197814912, +2206203008, 2214587264, 2222979712, 2231367808, 2239758208, +2248145024, 2256527744, 2264922752, 2273312128, 2281701248, +2290086272, 2298476672, 2306867072, 2315251072, 2323639168, +2332032128, 2340420224, 2348808064, 2357196416, 2365580416, +2373966976, 2382363008, 2390748544, 2399139968, 2407530368, +2415918976, 2424307328, 2432695424, 2441084288, 2449472384, +2457861248, 2466247808, 2474637184, 2483026816, 2491414144, +2499803776, 2508191872, 2516582272, 2524970368, 2533359232, +2541743488, 2550134144, 2558525056, 2566913408, 2575301504, +2583686528, 2592073856, 2600467328, 2608856192, 2617240448, +2625631616, 2634022016, 2642407552, 2650796416, 2659188352, +2667574912, 2675965312, 2684352896, 2692738688, 2701130624, +2709518464, 2717907328, 2726293376, 2734685056, 2743073152, +2751462016, 2759851648, 2768232832, 2776625536, 2785017728, +2793401984, 2801794432, 2810182016, 2818571648, 2826959488, +2835349376, 2843734144, 2852121472, 2860514432, 2868900992, +2877286784, 2885676928, 2894069632, 2902451584, 2910843008, +2919234688, 2927622784, 2936011648, 2944400768, 2952789376, +2961177728, 2969565568, 2977951616, 2986338944, 2994731392, +3003120256, 3011508352, 3019895936, 3028287104, 3036675968, +3045063808, 3053452928, 3061837696, 3070228352, 3078615424, +3087003776, 3095394944, 3103782272, 3112173184, 3120562048, +3128944768, 3137339264, 3145725056, 3154109312, 3162505088, +3170893184, 3179280256, 3187669376, 3196056704, 3204445568, +3212836736, 3221224064, 3229612928, 3238002304, 3246391168, +3254778496, 3263165824, 3271556224, 3279944576, 3288332416, +3296719232, 3305110912, 3313500032, 3321887104, 3330273152, +3338658944, 3347053184, 3355440512, 3363827072, 3372220288, +3380608384, 3388997504, 3397384576, 3405774208, 3414163072, +3422551936, 3430937984, 3439328384, 3447714176, 3456104576, +3464493952, 3472883584, 3481268864, 3489655168, 3498048896, +3506434432, 3514826368, 3523213952, 3531603584, 3539987072, +3548380288, 3556763264, 3565157248, 3573545344, 3581934464, +3590324096, 3598712704, 3607098752, 3615488384, 3623877248, +3632265856, 3640646528, 3649043584, 3657430144, 3665821568, +3674207872, 3682597504, 3690984832, 3699367808, 3707764352, +3716152448, 3724541056, 3732925568, 3741318016, 3749706368, +3758091136, 3766481536, 3774872704, 3783260032, 3791650432, +3800036224, 3808427648, 3816815488, 3825204608, 3833592704, +3841981568, 3850370432, 3858755968, 3867147904, 3875536256, +3883920512, 3892313728, 3900702592, 3909087872, 3917478784, +3925868416, 3934256512, 3942645376, 3951032192, 3959422336, +3967809152, 3976200064, 3984588416, 3992974976, 4001363584, +4009751168, 4018141312, 4026530432, 4034911616, 4043308928, +4051695488, 4060084352, 4068472448, 4076862848, 4085249408, +4093640576, 4102028416, 4110413696, 4118805632, 4127194496, +4135583104, 4143971968, 4152360832, 4160746112, 4169135744, +4177525888, 4185912704, 4194303616, 4202691968, 4211076736, +4219463552, 4227855488, 4236246656, 4244633728, 4253022848, +4261412224, 4269799808, 4278184832, 4286578048, 4294962304, +4303349632, 4311743104, 4320130432, 4328521088, 4336909184, +4345295488, 4353687424, 4362073472, 4370458496, 4378852736, +4387238528, 4395630208, 4404019072, 4412407424, 4420790656, +4429182848, 4437571456, 4445962112, 4454344064, 4462738048, +4471119232, 4479516544, 4487904128, 4496289664, 4504682368, +4513068416, 4521459584, 4529846144, 4538232704, 4546619776, +4555010176, 4563402112, 4571790208, 4580174464, 4588567936, +4596957056, 4605344896, 4613734016, 4622119808, 4630511488, +4638898816, 4647287936, 4655675264, 4664065664, 4672451968, +4680842624, 4689231488, 4697620352, 4706007424, 4714397056, +4722786176, 4731173248, 4739562368, 4747951744, 4756340608, +4764727936, 4773114496, 4781504384, 4789894784, 4798283648, +4806667648, 4815059584, 4823449472, 4831835776, 4840226176, +4848612224, 4857003392, 4865391488, 4873780096, 4882169728, +4890557312, 4898946944, 4907333248, 4915722368, 4924110976, +4932499328, 4940889728, 4949276032, 4957666432, 4966054784, +4974438016, 4982831488, 4991221376, 4999607168, 5007998848, +5016386432, 5024763776, 5033164672, 5041544576, 5049941888, +5058329728, 5066717056, 5075107456, 5083494272, 5091883904, +5100273536, 5108662144, 5117048192, 5125436032, 5133827456, +5142215296, 5150605184, 5158993024, 5167382144, 5175769472, +5184157568, 5192543872, 5200936064, 5209324928, 5217711232, +5226102656, 5234490496, 5242877312, 5251263872, 5259654016, +5268040832, 5276434304, 5284819328, 5293209728, 5301598592, +5309986688, 5318374784, 5326764416, 5335151488, 5343542144, +5351929472, 5360319872, 5368706944, 5377096576, 5385484928, +5393871232, 5402263424, 5410650496, 5419040384, 5427426944, +5435816576, 5444205952, 5452594816, 5460981376, 5469367936, +5477760896, 5486148736, 5494536832, 5502925952, 5511315328, +5519703424, 5528089984, 5536481152, 5544869504, 5553256064, +5561645696, 5570032768, 5578423936, 5586811264, 5595193216, +5603585408, 5611972736, 5620366208, 5628750464, 5637143936, +5645528192, 5653921408, 5662310272, 5670694784, 5679082624, +5687474048, 5695864448, 5704251008, 5712641408, 5721030272, +5729416832, 5737806208, 5746194304, 5754583936, 5762969984, +5771358592, 5779748224, 5788137856, 5796527488, 5804911232, +5813300608, 5821692544, 5830082176, 5838468992, 5846855552, +5855247488, 5863636096, 5872024448, 5880411008, 5888799872, +5897186432, 5905576832, 5913966976, 5922352768, 5930744704, +5939132288, 5947522432, 5955911296, 5964299392, 5972688256, +5981074304, 5989465472, 5997851008, 6006241408, 6014627968, +6023015552, 6031408256, 6039796096, 6048185216, 6056574848, +6064963456, 6073351808, 6081736064, 6090128768, 6098517632, +6106906496, 6115289216, 6123680896, 6132070016, 6140459648, +6148849024, 6157237376, 6165624704, 6174009728, 6182403712, +6190792064, 6199176064, 6207569792, 6215952256, 6224345216, +6232732544, 6241124224, 6249510272, 6257899136, 6266287744, +6274676864, 6283065728, 6291454336, 6299843456, 6308232064, +6316620928, 6325006208, 6333395584, 6341784704, 6350174848, +6358562176, 6366951296, 6375337856, 6383729536, 6392119168, +6400504192, 6408895616, 6417283456, 6425673344, 6434059136, +6442444672, 6450837376, 6459223424, 6467613056, 6476004224, +6484393088, 6492781952, 6501170048, 6509555072, 6517947008, +6526336384, 6534725504, 6543112832, 6551500672, 6559888768, +6568278656, 6576662912, 6585055616, 6593443456, 6601834112, +6610219648, 6618610304, 6626999168, 6635385472, 6643777408, +6652164224, 6660552832, 6668941952, 6677330048, 6685719424, +6694107776, 6702493568, 6710882176, 6719274112, 6727662976, +6736052096, 6744437632, 6752825984, 6761213824, 6769604224, +6777993856, 6786383488, 6794770816, 6803158144, 6811549312, +6819937664, 6828326528, 6836706176, 6845101696, 6853491328, +6861880448, 6870269312, 6878655104, 6887046272, 6895433344, +6903822208, 6912212864, 6920596864, 6928988288, 6937377152, +6945764992, 6954149248, 6962544256, 6970928768, 6979317376, +6987709312, 6996093824, 7004487296, 7012875392, 7021258624, +7029652352, 7038038912, 7046427776, 7054818944, 7063207808, +7071595136, 7079980928, 7088372608, 7096759424, 7105149824, +7113536896, 7121928064, 7130315392, 7138699648, 7147092352, +7155479168, 7163865728, 7172249984, 7180648064, 7189036672, +7197424768, 7205810816, 7214196608, 7222589824, 7230975104, +7239367552, 7247755904, 7256145536, 7264533376, 7272921472, +7281308032, 7289694848, 7298088832, 7306471808, 7314864512, +7323253888, 7331643008, 7340029568, 7348419712, 7356808832, +7365196672, 7373585792, 7381973888, 7390362752, 7398750592, +7407138944, 7415528576, 7423915648, 7432302208, 7440690304, +7449080192, 7457472128, 7465860992, 7474249088, 7482635648, +7491023744, 7499412608, 7507803008, 7516192384, 7524579968, +7532967296, 7541358464, 7549745792, 7558134656, 7566524032, +7574912896, 7583300992, 7591690112, 7600075136, 7608466816, +7616854912, 7625244544, 7633629824, 7642020992, 7650410368, +7658794112, 7667187328, 7675574912, 7683961984, 7692349568, +7700739712, 7709130368, 7717519232, 7725905536, 7734295424, +7742683264, 7751069056, 7759457408, 7767849088, 7776238208, +7784626816, 7793014912, 7801405312, 7809792128, 7818179968, +7826571136, 7834957184, 7843347328, 7851732352, 7860124544, +7868512384, 7876902016, 7885287808, 7893679744, 7902067072, +7910455936, 7918844288, 7927230848, 7935622784, 7944009344, +7952400256, 7960786048, 7969176704, 7977565312, 7985953408, +7994339968, 8002730368, 8011119488, 8019508096, 8027896192, +8036285056, 8044674688, 8053062272, 8061448832, 8069838464, +8078227328, 8086616704, 8095006592, 8103393664, 8111783552, +8120171392, 8128560256, 8136949376, 8145336704, 8153726848, +8162114944, 8170503296, 8178891904, 8187280768, 8195669632, +8204058496, 8212444544, 8220834176, 8229222272, 8237612672, +8246000768, 8254389376, 8262775168, 8271167104, 8279553664, +8287944064, 8296333184, 8304715136, 8313108352, 8321497984, +8329885568, 8338274432, 8346663296, 8355052928, 8363441536, +8371828352, 8380217984, 8388606592, 8396996224, 8405384576, +8413772672, 8422161536, 8430549376, 8438939008, 8447326592, +8455715456, 8464104832, 8472492928, 8480882048, 8489270656, +8497659776, 8506045312, 8514434944, 8522823808, 8531208832, +8539602304, 8547990656, 8556378752, 8564768384, 8573154176, +8581542784, 8589933952, 8598322816, 8606705024, 8615099264, +8623487872, 8631876992, 8640264064, 8648653952, 8657040256, +8665430656, 8673820544, 8682209152, 8690592128, 8698977152, +8707374464, 8715763328, 8724151424, 8732540032, 8740928384, +8749315712, 8757704576, 8766089344, 8774480768, 8782871936, +8791260032, 8799645824, 8808034432, 8816426368, 8824812928, +8833199488, 8841591424, 8849976448, 8858366336, 8866757248, +8875147136, 8883532928, 8891923328, 8900306816, 8908700288, +8917088384, 8925478784, 8933867392, 8942250368, 8950644608, +8959032704, 8967420544, 8975809664, 8984197504, 8992584064, +9000976256, 9009362048, 9017752448, 9026141312, 9034530688, +9042917504, 9051307904, 9059694208, 9068084864, 9076471424, +9084861824, 9093250688, 9101638528, 9110027648, 9118416512, +9126803584, 9135188096, 9143581312, 9151969664, 9160356224, +9168747136, 9177134464, 9185525632, 9193910144, 9202302848, +9210690688, 9219079552, 9227465344, 9235854464, 9244244864, +9252633472, 9261021824, 9269411456, 9277799296, 9286188928, +9294574208, 9302965888, 9311351936, 9319740032, 9328131968, +9336516736, 9344907392, 9353296768, 9361685888, 9370074752, +9378463616, 9386849408, 9395239808, 9403629184, 9412016512, +9420405376, 9428795008, 9437181568, 9445570688, 9453960832, +9462346624, 9470738048, 9479121536, 9487515008, 9495903616, +9504289664, 9512678528, 9521067904, 9529456256, 9537843584, +9546233728, 9554621312, 9563011456, 9571398784, 9579788672, +9588178304, 9596567168, 9604954496, 9613343104, 9621732992, +9630121856, 9638508416, 9646898816, 9655283584, 9663675776, +9672061312, 9680449664, 9688840064, 9697230464, 9705617536, +9714003584, 9722393984, 9730772608, 9739172224, 9747561088, +9755945344, 9764338816, 9772726144, 9781116544, 9789503872, +9797892992, 9806282624, 9814670464, 9823056512, 9831439232, +9839833984, 9848224384, 9856613504, 9865000576, 9873391232, +9881772416, 9890162816, 9898556288, 9906940544, 9915333248, +9923721088, 9932108672, 9940496512, 9948888448, 9957276544, +9965666176, 9974048384, 9982441088, 9990830464, 9999219584, +10007602816, 10015996544, 10024385152, 10032774016, 10041163648, +10049548928, 10057940096, 10066329472, 10074717824, 10083105152, +10091495296, 10099878784, 10108272256, 10116660608, 10125049216, +10133437312, 10141825664, 10150213504, 10158601088, 10166991232, +10175378816, 10183766144, 10192157312, 10200545408, 10208935552, +10217322112, 10225712768, 10234099328, 10242489472, 10250876032, +10259264896, 10267656064, 10276042624, 10284429184, 10292820352, +10301209472, 10309598848, 10317987712, 10326375296, 10334763392, +10343153536, 10351541632, 10359930752, 10368318592, 10376707456, +10385096576, 10393484672, 10401867136, 10410262144, 10418647424, +10427039104, 10435425664, 10443810176, 10452203648, 10460589952, +10468982144, 10477369472, 10485759104, 10494147712, 10502533504, +10510923392, 10519313536, 10527702656, 10536091264, 10544478592, +10552867712, 10561255808, 10569642368, 10578032768, 10586423168, +10594805632, 10603200128, 10611588992, 10619976064, 10628361344, +10636754048, 10645143424, 10653531776, 10661920384, 10670307968, +10678696832, 10687086464, 10695475072, 10703863168, 10712246144, +10720639616, 10729026688, 10737414784, 10745806208, 10754190976, +10762581376, 10770971264, 10779356288, 10787747456, 10796135552, +10804525184, 10812915584, 10821301888, 10829692288, 10838078336, +10846469248, 10854858368, 10863247232, 10871631488, 10880023424, +10888412032, 10896799616, 10905188992, 10913574016, 10921964672, +10930352768, 10938742912, 10947132544, 10955518592, 10963909504, +10972298368, 10980687488, 10989074816, 10997462912, 11005851776, +11014241152, 11022627712, 11031017344, 11039403904, 11047793024, +11056184704, 11064570752, 11072960896, 11081343872, 11089737856, +11098128256, 11106514816, 11114904448, 11123293568, 11131680128, +11140065152, 11148458368, 11156845696, 11165236864, 11173624192, +11182013824, 11190402688, 11198790784, 11207179136, 11215568768, +11223957376, 11232345728, 11240734592, 11249122688, 11257511296, +11265899648, 11274285952, 11282675584, 11291065472, 11299452544, +11307842432, 11316231296, 11324616832, 11333009024, 11341395584, +11349782656, 11358172288, 11366560384, 11374950016, 11383339648, +11391721856, 11400117376, 11408504192, 11416893568, 11425283456, +11433671552, 11442061184, 11450444672, 11458837888, 11467226752, +11475611776, 11484003968, 11492392064, 11500780672, 11509169024, +11517550976, 11525944448, 11534335616, 11542724224, 11551111808, +11559500672, 11567890304, 11576277376, 11584667008, 11593056128, +11601443456, 11609830016, 11618221952, 11626607488, 11634995072, +11643387776, 11651775104, 11660161664, 11668552576, 11676940928, +11685330304, 11693718656, 11702106496, 11710496128, 11718882688, +11727273088, 11735660416, 11744050048, 11752437376, 11760824704, +11769216128, 11777604736, 11785991296, 11794381952, 11802770048, +11811157888, 11819548544, 11827932544, 11836324736, 11844713344, +11853100928, 11861486464, 11869879936, 11878268032, 11886656896, +11895044992, 11903433088, 11911822976, 11920210816, 11928600448, +11936987264, 11945375872, 11953761152, 11962151296, 11970543488, +11978928512, 11987320448, 11995708288, 12004095104, 12012486272, +12020875136, 12029255552, 12037652096, 12046039168, 12054429568, +12062813824, 12071206528, 12079594624, 12087983744, 12096371072, +12104759936, 12113147264, 12121534592, 12129924992, 12138314624, +12146703232, 12155091584, 12163481216, 12171864704, 12180255872, +12188643968, 12197034112, 12205424512, 12213811328, 12222199424, +12230590336, 12238977664, 12247365248, 12255755392, 12264143488, +12272531584, 12280920448, 12289309568, 12297694592, 12306086528, +12314475392, 12322865024, 12331253632, 12339640448, 12348029312, +12356418944, 12364805248, 12373196672, 12381580928, 12389969024, +12398357632, 12406750592, 12415138432, 12423527552, 12431916416, +12440304512, 12448692352, 12457081216, 12465467776, 12473859968, +12482245504, 12490636672, 12499025536, 12507411584, 12515801728, +12524190592, 12532577152, 12540966272, 12549354368, 12557743232, +12566129536, 12574523264, 12582911872, 12591299456, 12599688064, +12608074624, 12616463488, 12624845696, 12633239936, 12641631616, +12650019968, 12658407296, 12666795136, 12675183232, 12683574656, +12691960192, 12700350592, 12708740224, 12717128576, 12725515904, +12733906816, 12742295168, 12750680192, 12759071872, 12767460736, +12775848832, 12784236928, 12792626816, 12801014656, 12809404288, +12817789312, 12826181504, 12834568832, 12842954624, 12851345792, +12859732352, 12868122496, 12876512128, 12884901248, 12893289088, +12901672832, 12910067584, 12918455168, 12926842496, 12935232896, +12943620736, 12952009856, 12960396928, 12968786816, 12977176192, +12985563776, 12993951104, 13002341504, 13010730368, 13019115392, +13027506304, 13035895168, 13044272512, 13052673152, 13061062528, +13069446272, 13077838976, 13086227072, 13094613632, 13103000192, +13111393664, 13119782528, 13128157568, 13136559232, 13144945024, +13153329536, 13161724288, 13170111872, 13178502784, 13186884736, +13195279744, 13203667072, 13212057472, 13220445824, 13228832128, +13237221248, 13245610624, 13254000512, 13262388352, 13270777472, +13279166336, 13287553408, 13295943296, 13304331904, 13312719488, +13321108096, 13329494656, 13337885824, 13346274944, 13354663808, +13363051136, 13371439232, 13379825024, 13388210816, 13396605056, +13404995456, 13413380224, 13421771392, 13430159744, 13438546048, +13446937216, 13455326848, 13463708288, 13472103808, 13480492672, +13488875648, 13497269888, 13505657728, 13514045312, 13522435712, +13530824576, 13539210112, 13547599232, 13555989376, 13564379008, +13572766336, 13581154432, 13589544832, 13597932928, 13606320512, +13614710656, 13623097472, 13631477632, 13639874944, 13648264064, +13656652928, 13665041792, 13673430656, 13681818496, 13690207616, +13698595712, 13706982272, 13715373184, 13723762048, 13732150144, +13740536704, 13748926592, 13757316224, 13765700992, 13774090112, +13782477952, 13790869376, 13799259008, 13807647872, 13816036736, +13824425344, 13832814208, 13841202304, 13849591424, 13857978752, +13866368896, 13874754688, 13883145344, 13891533184, 13899919232, +13908311168, 13916692096, 13925085056, 13933473152, 13941866368, +13950253696, 13958643584, 13967032192, 13975417216, 13983807616, +13992197504, 14000582272, 14008973696, 14017363072, 14025752192, +14034137984, 14042528384, 14050918016, 14059301504, 14067691648, +14076083584, 14084470144, 14092852352, 14101249664, 14109635968, +14118024832, 14126407552, 14134804352, 14143188608, 14151577984, +14159968384, 14168357248, 14176741504, 14185127296, 14193521024, +14201911424, 14210301824, 14218685056, 14227067264, 14235467392, +14243855488, 14252243072, 14260630144, 14269021568, 14277409408, +14285799296, 14294187904, 14302571392, 14310961792, 14319353728, +14327738752, 14336130944, 14344518784, 14352906368, 14361296512, +14369685376, 14378071424, 14386462592, 14394848128, 14403230848, +14411627392, 14420013952, 14428402304, 14436793472, 14445181568, +14453569664, 14461959808, 14470347904, 14478737024, 14487122816, +14495511424, 14503901824, 14512291712, 14520677504, 14529064832, +14537456768, 14545845632, 14554234496, 14562618496, 14571011456, +14579398784, 14587789184, 14596172672, 14604564608, 14612953984, +14621341312, 14629724288, 14638120832, 14646503296, 14654897536, +14663284864, 14671675264, 14680061056, 14688447616, 14696835968, +14705228416, 14713616768, 14722003328, 14730392192, 14738784128, +14747172736, 14755561088, 14763947648, 14772336512, 14780725376, +14789110144, 14797499776, 14805892736, 14814276992, 14822670208, +14831056256, 14839444352, 14847836032, 14856222848, 14864612992, +14872997504, 14881388672, 14889775744, 14898165376, 14906553472, +14914944896, 14923329664, 14931721856, 14940109696, 14948497024, +14956887424, 14965276544, 14973663616, 14982053248, 14990439808, +14998830976, 15007216768, 15015605888, 15023995264, 15032385152, +15040768384, 15049154944, 15057549184, 15065939072, 15074328448, +15082715008, 15091104128, 15099493504, 15107879296, 15116269184, +15124659584, 15133042304, 15141431936, 15149824384, 15158214272, +15166602368, 15174991232, 15183378304, 15191760512, 15200154496, +15208542592, 15216931712, 15225323392, 15233708416, 15242098048, +15250489216, 15258875264, 15267265408, 15275654528, 15284043136, +15292431488, 15300819584, 15309208192, 15317596544, 15325986176, +15334374784, 15342763648, 15351151744, 15359540608, 15367929728, +15376318336, 15384706432, 15393092992, 15401481856, 15409869952, +15418258816, 15426649984, 15435037568, 15443425664, 15451815296, +15460203392, 15468589184, 15476979328, 15485369216, 15493755776, +15502146944, 15510534272, 15518924416, 15527311232, 15535699072, +15544089472, 15552478336, 15560866688, 15569254528, 15577642624, +15586031488, 15594419072, 15602809472, 15611199104, 15619586432, +15627975296, 15636364928, 15644753792, 15653141888, 15661529216, +15669918848, 15678305152, 15686696576, 15695083136, 15703474048, +15711861632, 15720251264, 15728636288, 15737027456, 15745417088, +15753804928, 15762194048, 15770582656, 15778971008, 15787358336, +15795747712, 15804132224, 15812523392, 15820909696, 15829300096, +15837691264, 15846071936, 15854466944, 15862855808, 15871244672, +15879634816, 15888020608, 15896409728, 15904799104, 15913185152, +15921577088, 15929966464, 15938354816, 15946743424, 15955129472, +15963519872, 15971907968, 15980296064, 15988684928, 15997073024, +16005460864, 16013851264, 16022241152, 16030629248, 16039012736, +16047406976, 16055794816, 16064181376, 16072571264, 16080957824, +16089346688, 16097737856, 16106125184, 16114514816, 16122904192, +16131292544, 16139678848, 16148066944, 16156453504, 16164839552, +16173236096, 16181623424, 16190012032, 16198401152, 16206790528, +16215177344, 16223567744, 16231956352, 16240344704, 16248731008, +16257117824, 16265504384, 16273898624, 16282281856, 16290668672, +16299064192, 16307449216, 16315842176, 16324230016, 16332613504, +16341006464, 16349394304, 16357783168, 16366172288, 16374561664, +16382951296, 16391337856, 16399726208, 16408116352, 16416505472, +16424892032, 16433282176, 16441668224, 16450058624, 16458448768, +16466836864, 16475224448, 16483613056, 16492001408, 16500391808, +16508779648, 16517166976, 16525555328, 16533944192, 16542330752, +16550719616, 16559110528, 16567497088, 16575888512, 16584274816, +16592665472, 16601051008, 16609442944, 16617832064, 16626218624, +16634607488, 16642996096, 16651385728, 16659773824, 16668163712, +16676552576, 16684938112, 16693328768, 16701718144, 16710095488, +16718492288, 16726883968, 16735272832, 16743661184, 16752049792, +16760436608, 16768827008, 16777214336, 16785599104, 16793992832, +16802381696, 16810768768, 16819151744, 16827542656, 16835934848, +16844323712, 16852711552, 16861101952, 16869489536, 16877876864, +16886265728, 16894653056, 16903044736, 16911431296, 16919821696, +16928207488, 16936592768, 16944987776, 16953375616, 16961763968, +16970152832, 16978540928, 16986929536, 16995319168, 17003704448, +17012096896, 17020481152, 17028870784, 17037262208, 17045649536, +17054039936, 17062426496, 17070814336, 17079205504, 17087592064, +17095978112, 17104369024, 17112759424, 17121147776, 17129536384, +17137926016, 17146314368, 17154700928, 17163089792, 17171480192, +17179864192, 17188256896, 17196644992, 17205033856, 17213423488, +17221811072, 17230198912, 17238588032, 17246976896, 17255360384, +17263754624, 17272143232, 17280530048, 17288918912, 17297309312, +17305696384, 17314085504, 17322475136, 17330863744, 17339252096, +17347640192, 17356026496, 17364413824, 17372796544, 17381190016, +17389583488, 17397972608, 17406360704, 17414748544, 17423135872, +17431527296, 17439915904, 17448303232, 17456691584, 17465081728, +17473468288, 17481857408, 17490247552, 17498635904, 17507022464, +17515409024, 17523801728, 17532189824, 17540577664, 17548966016, +17557353344, 17565741184, 17574131584, 17582519168, 17590907008, +17599296128, 17607687808, 17616076672, 17624455808, 17632852352, +17641238656, 17649630848, 17658018944, 17666403968, 17674794112, +17683178368, 17691573376, 17699962496, 17708350592, 17716739968, +17725126528, 17733517184, 17741898112, 17750293888, 17758673024, +17767070336, 17775458432, 17783848832, 17792236928, 17800625536, +17809012352, 17817402752, 17825785984, 17834178944, 17842563968, +17850955648, 17859344512, 17867732864, 17876119424, 17884511872, +17892900224, 17901287296, 17909677696, 17918058112, 17926451072, +17934843776, 17943230848, 17951609216, 17960008576, 17968397696, +17976784256, 17985175424, 17993564032, 18001952128, 18010339712, +18018728576, 18027116672, 18035503232, 18043894144, 18052283264, +18060672128, 18069056384, 18077449856, 18085837184, 18094225792, +18102613376, 18111004544, 18119388544, 18127781248, 18136170368, +18144558976, 18152947328, 18161336192, 18169724288, 18178108544, +18186498944, 18194886784, 18203275648, 18211666048, 18220048768, +18228444544, 18236833408, 18245220736] + +cache_sizes = [ +16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, +17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, +18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, +19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, +20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, +21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, +22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, +23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, +24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, +25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, +25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, +26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, +27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, +28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, +29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, +30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, +31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, +32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, +33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, +34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, +35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, +36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, +36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, +37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, +38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, +39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, +40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, +41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, +42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, +43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, +44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, +45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, +46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, +47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, +47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, +48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, +49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, +50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, +51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, +52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, +53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, +54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, +55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, +56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, +57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, +58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, +58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, +59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, +60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, +61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, +62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, +63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, +64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, +65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, +66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, +67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, +68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, +69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, +69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, +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] +``` diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md new file mode 100644 index 00000000000..bcba3173e15 --- /dev/null +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md @@ -0,0 +1,37 @@ +--- +title: Bányászati algoritmusok +description: Az Ethereum-bányászat algoritmusainak bemutatása. +lang: hu +--- + + +A proof-of-work (munkaigazolás) már nem az Ethereum konszenzusmechanizmus alapja, tehát a bányászatot kikapcsolták. Ehelyett az Ethereumot úgy biztosítják a validátorok, hogy letétbe helyeznek ETH-t. Ön is letétbe helyezheti a rendelkezésére álló ETH-t. Tudjon meg többet a egyesítés (Merge), proof-of-stake (letéti igazolás) és letétbe helyezés témákról. Ez az oldal csak elavult témákat tartalmaz. + + +Az Ethereum-bányászat egy Ethash nevű algoritmust használt. k az algoritmusnak az a lényege, hogy a bányász megpróbál egy nonce értéket találni nagy számítási kapacitás révén, hogy a létrejövő hash kisebb legyen, mint a kiszámolt nehézség határértéke. Ez a nehézségi szint dinamikusan változtatható, így a blokkok létrehozása rendszeresen meg tud történni. + +## Előfeltételek {#prerequisites} + +A jelen téma könnyebb megértéséhez javasoljuk, hogy előbb tekintse meg a [proof-of-work konszenzusról](/developers/docs/consensus-mechanisms/pow) és a [bányászatról](/developers/docs/consensus-mechanisms/pow/mining) szóló oldalakat. + +## Dagger Hashimoto {#dagger-hashimoto} + +A Dagger Hashimoto az Ethereum-bányászat korábbi algoritmusa volt a fejlesztés idején, melyet az Ethash váltott le. Ez két különböző algoritmus, a Dagger és a Hashimoto, összeolvadása volt. Ezt a fejlesztés idején használták, és az Ethereum főhálózat bevezetésekor már az Ethash működött. + +A [Dagger](http://www.hashcash.org/papers/dagger.html) bevezette az [irányított aciklikus gráf (Directed Acyclic Graph)](https://en.wikipedia.org/wiki/Directed_acyclic_graph) generációját, melyeknek véletlenszerű szeleteit hashelik össze. A lényegi elve az, hogy a nonce a nagy adatfából csak egy kis részt igényel. A bányászatnál nem lehet újrakalkulálni a nonce-hoz az alfát – tehát tárolni kell a fát –, de az egy nonce értékű ellenőrzésnél ez rendben van. A Dagger a létező algoritmusok, mint a Scrypt, alternatívája volt, ami sok memóriát igényelt (memory hard), de nehéz volt ellenőrizni, hogy a memóriahasználat mikor éri el a valóban biztonságos szintet. A Dagger ugyanakkor sebezhető volt a megosztott memóriaalapú hardver-gyorsítás esetén, ezért a kutatás során elvetették. + +A [Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) egy olyan algoritmus, amely ASIC-ellenállást biztosít az I/O bound révén (mivel a memóriaolvasások a bányászat behatároló tényezői). A lényeg az, hogy a RAM elérhetőbb, mint a számítási kapacitás; sok milliárd dollárnyi kutatás már optimalizálta a RAM használatot különféle esetekre, ami gyakran szinte véletlenszerű elérési mintákat (tehát a véletlenszerű memóriaelérést is) foglal magában. Ennek eredményeként a meglévő RAM elég közel van az optimálishoz, hogy értékelje az algoritmust. A Hashimoto a blokkláncot adatforrásnak használta, így megfelelt a fenti (1) és (3) pontoknak. + +A Dagger-Hashimoto a Dagger és a Hashimoto algoritmusok módosított változatát használta. A Dagger-Hashimoto és a Hashimoto között az a különbség, hogy nem blokkláncot használ adatforrásként, hanem egy személyre szabott adathalmazt, amely a blokkadatokból frissül minden N-edik blokknál. Az adathalmaz a Dagger-algoritmussal készült, amellyel hatékonyan lehetett minden nonce-ra egy alhalmazt kikalkulálni a könnyű kliens ellenőrzéshez. A Dagger-Hashimoto és a Dagger közötti különbség az, hogy a blokklekérdezéshez használt adathalmaz félig állandó, és esetileg frissítik (például hetente). Így az adathalmaz létrehozásának erőfeszítése nullához közelít, így a megosztott memória felgyorsításával kapcsolatos problémák (lásd Sergio Lerner) elhanyagolhatóvá váltak. + +Bővebben a [Dagger-Hashimoto-ról](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto). + +## Ethash {#ethash} + +Az Ethash az a bányászati algoritmus, melyet az Ethereum főhálózaton használtak a ma már kivezetett proof-of-work architektúrában. Az Ethash az új neve a Dagger-Hashimoto egy specifikus verziójának, mivel azt jelentősen megváltoztatták, de mégis megmaradtak az alapvető elvei az elődjének. Az Ethereum-főhálózat csak az Ethasht használta, mivel Dagger-Hashimoto a kutatás-fejlesztés idején működött, és még a bányászat megkezdése előtt lecserélték. + +[Bővebben az Ethashről](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash). + +## További olvasnivaló {#further-reading} + +_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ diff --git a/public/content/translations/hu/developers/docs/dapps/index.md b/public/content/translations/hu/developers/docs/dapps/index.md index e6f46467295..6a41dc7aae7 100644 --- a/public/content/translations/hu/developers/docs/dapps/index.md +++ b/public/content/translations/hu/developers/docs/dapps/index.md @@ -4,7 +4,7 @@ description: lang: hu --- -Egy decentralizált applikáció (dapp) olyan applikáció, mely egy olyan decentralizált hálózatra épült, ami egyesít egy [okosszerződést](/developers/docs/smart-contracts/) és egy frontend felhasználói felületet. Megjegyzésül: az Ethereum okosszerződések elérhetőek és transzparensek - mint a nyílt API-ok - így a dappod tartalmazhat olyan okosszerződést, melyet másvalaki írt. +A decentralizált alkalmazás (dapp) egy olyan applikáció, amely olyan decentralizált hálózatra épült, ami egy [okosszerződést](/developers/docs/smart-contracts/) és egy frontend felhasználói felületet egyesít magában. Megjegyzésül: az Ethereum okosszerződések elérhetőek és transzparensek - mint a nyílt API-ok - így a dappod tartalmazhat olyan okosszerződést, melyet másvalaki írt. ## Előfeltételek {#prerequisites} @@ -16,48 +16,73 @@ A dapp egy olyan backend kód, mely egy decentralizált peer-to-peer hálózaton Egy dappnak bármely nyelven íródott frontend kódja vagy felhasználói felülete lehet (akárcsak az appoknak), mely hívásokat indíthat a backend felé. Továbbá a frontendje olyan decentralizált tárhelyeken lehet, mint az [IPFS](https://ipfs.io/). -- **Decentalizáltak**, mely függetlenné teszi őket, és senki sem irányítja őket. +- **Decentralizált** – a dapp-ok az Ethereumon működnek, azaz egy nyitott, nyilvános, decentralizált platformon, ahol egyetlen személy vagy csoportnak sem irányít - **Determinisztikusak** vagyis ugyanazt a függvényt hajtják végre a végrehajtási környezettől függetlenül. -- **Turing kompatibilisek**, ami azt jelenti, hogy ha adottak az erőforrások, akkor a dapp bármilyen parancsot végre tud hajtani. -- **Izoláltak**, ami azt jelenti, hogy egy virtuális környezetben futnak le, melyek Ethereum Virtuális Gépként (EVM) ismerünk, így ha az okosszerződésnek van egy bugja, nem fogja az akadályozni a blokklánc hálózat működését. +- **Turing-teljes** – a dappok képesek végrehajtani bármilyen akciót, ha a megfelelő erőforrások rendelkezésre állnak +- **Izolált** – a dappok egy virtuális környezetben, az Ethereum Virtuális Gépen futnak, így ha az okosszerződésben hiba van, az nem érinti a blokklánchálózat normál működését ### Az okosszerződésekről {#on-smart-contracts} -Hogy bevezessük a dappokat, először be kell vezetnünk az okosszerződéseket – a dapp backendjét jobb kifejezés híján. Részletes áttekintésért keresd fel az [okosszerződések](/developers/docs/smart-contracts/) oldalt. +Hogy bevezessük a dappokat, először be kell vezetnünk az okosszerződéseket – a dapp backendjét jobb kifejezés híján. A részletes áttekintéshez keresse fel az [okosszerződések](/developers/docs/smart-contracts/) oldalt. -Az okosszerződés olyan kód, mely az Ethereum blokkláncon fut és pontosan úgy, ahogyan programozták. Amint feltelepíted őket a hálózatra, nem tudod megváltoztatni őket. A dappok decentralizáltak lehetnek, mivel a szerződésbe írt logika irányítja őket, nem pedig egy egyén vagy egy vállalat. Ez azt is jelenti, hogy nagyon óvatosan kell megtervezned a szerződéseidet és alaposan le kell tesztelned őket. +Az okosszerződés olyan kód, mely az Ethereum blokkláncon fut és pontosan úgy, ahogyan programozták. Amint az okosszerződések feltelepültek a hálózatra, azok többé nem módosíthatók. A dappok decentralizáltak lehetnek, mivel a szerződésbe írt logika irányítja őket, nem pedig egy egyén vagy egy vállalat. Ez azt is jelenti, hogy nagyon óvatosan kell megtervezned a szerződéseidet és alaposan le kell tesztelned őket. ## A dapp fejlesztés előnyei {#benefits-of-dapp-development} -- **Nulla állásidő** – amint az alkalmazás alapjául szolgáló okosszerződés telepítésre és a blokkláncra kerül, a hálózat egésze mindig képes lesz kiszolgálni a szerződéssel interakcióba lépő klienseket. Rosszindulatú szereplők emiatt nem tudnak szolgáltatásmegtagadási támadásokat indítani az egyes dappok ellen. +- **Nulla állásidő** – amint az alkalmazás alapjául szolgáló okosszerződés telepítésre kerül a blokkláncon, a hálózat állandóan készen áll kiszolgálni a szerződéssel interakcióba lépő klienseket. Rosszindulatú szereplők emiatt nem tudnak szolgáltatásmegtagadási támadásokat indítani az egyes dappok ellen. - **Adatvédelem** – nem kell igazolnod a valódi személyazonosságodat, hogy interakcióba lépj egy dappal. - **Cenzúra rezisztancia** – nincs olyan egyedüli entitás a hálózaton, mely megakadályozhatná a felhasználókat abban, hogy tranzakciókat indítsanak, dappokat telepítsenek vagy adatot olvassanak a blokkláncról. - **Teljes adat integritás** – a blokkláncon tárolt adatot nem megváltoztatható és nem megkérdőjelezhető a kriptográfiai primitíveknek köszönhetően. Rosszindulatú szereplők nem tudnak tranzakciókat vagy egyéb más adatot hamaisítni, amelyet publikáltak. -- **Bizalommentes számítás/hitelesíthető viselkedés** – az okosszerződéseket lehet analizálni és garantált, hogy megjósolható módon fognak végbe menni anélkül, hogy meg kellene bízni egy központi hatóságban. Ez nem igaz a hagyományos modellek esetében; ha például online bankolást használunk, meg kell bíznunk a pénzintézetekben, hogy nem fognak visszaélni a pénzügyi adatainkkal, megmásítani a feljegyzéseket vagy hacker támadást elszenvedni. +- **Bizalommentes számítás/hitelesíthető viselkedés** – az okosszerződéseket lehet elemezni és garantált, hogy megjósolható módon fognak végbe menni anélkül, hogy meg kellene bízni egy központi hatóságban. Ez nem igaz a hagyományos modellek esetében; ha például online bankolást használunk, meg kell bíznunk a pénzintézetekben, hogy nem fognak visszaélni a pénzügyi adatainkkal, megmásítani a feljegyzéseket vagy hacker támadást elszenvedni. -## A dapp fejlesztés visszáságai {#implications-of-dapp-development} +## A dapp-fejlesztés hátrányai {#drawbacks-of-dapp-development} -- **Karbantartás** – a dappokat nehezebb karbantartani, mivel a blokkláncra publikált kódot és az adatot nehezebb módosítani. A fejlesztők számára nehézkes frissíteni a dappjukat (vagy a dapp által tárolt mögöttes adatot), amint felkerültek a blokkláncra - még akkor is ha bugokat vagy biztonsági kockázatokat fedeztek fel a régi verzióban. -- **Teljesítmény költség** – nagy a teljesítmény költség és a skálázás nagyon nehéz. Ahhoz, hogy azt a biztonsági, integritási, átláthatósági és megbízhatósági szintet elérjük, melyre az Ethereum törekszik, minden egyes csomópont lefuttatja és eltárolja az összes tranzakciót. Ezen felül a proof-of-work is időbe telik. Egy egyszerű számolgatás ezt a költséget körülbelül az 1,000,000 szorosára becsüli, mintha az egy általános számítás lett volna. -- **Hálózati torlódás** – legalábbis a jelenlegi modell szerint, ha egy dapp túl sok számítási kapacitást használ fel, akkor a teljes hálózat feltorlódik. Jelenleg a hálózat körülbelül 10 tranzakciót tud feldolgozni egy másodperc alatt; ha ennél gyorsabban küldenek be tranzakciókat, akkor a feldolgozatlan tranzakciók száma gyorsan felfújódhat. -- **Felhasználói élmény** – nehezebb felhasználóbarát élményeket megalkotni: Az átlag végfelhasználó túl nehéznek találhatja az eszközkészlet felállítását ahhoz, hogy a blokklánccal valóban biztonságos módon interakcióba léphessen. -- **Centralizáció** – Felhasználóbarát és fejlesztőbarát megoldások, melyek az Ethereum alaprétegére épültek, végül mégis úgy nézhetnek ki, mint a centralizált szolgáltatások: például az ilyen szolgáltatások a kulcsokat és más érzékeny információkat a szerver oldalon tárolhatják, a frontendnek egy centralizált szerver szolgálhatja ki, vagy a fontos üzleti logikát egy centralizált szerver végzi, mielőtt felkerült volna a blokkláncra. Ez kizárja rengeteg (ha nem az összes) előnyét a blokkláncnak a hagyományos modellel szemben. +- **Karbantartás** – a dappokat nehezebb karbantartani, mivel a blokkláncra publikált kódot és az adatot nehezebb módosítani. A fejlesztők számára nehézkes frissíteni a dappjukat (vagy a dapp által tárolt mögöttes adatot), amint felkerültek a blokkláncra – még akkor is ha hibákat vagy biztonsági kockázatokat fedeztek fel a régi verzióban. +- **Végrehajtási költség** – magas a végrehajtási költség, a skálázás pedig nagyon nehéz. Ahhoz, hogy azt a biztonsági, integritási, átláthatósági és megbízhatósági szintet elérjük, melyre az Ethereum törekszik, minden egyes csomópont lefuttatja és eltárolja az összes tranzakciót. Ezen felül a proof-of-work konszenzus is időbe telik. +- **Hálózati torlódás** – ha egy dapp túl sok számítási kapacitást használ fel, akkor a teljes hálózat feltorlódik. Jelenleg a hálózat körülbelül 10 tranzakciót tud feldolgozni egy másodperc alatt; ha ennél gyorsabban küldenek be tranzakciókat, akkor a feldolgozatlan tranzakciók száma gyorsan felfújódhat. +- **Felhasználói élmény** – nehezebb felhasználóbarát élményeket adni, mivel az átlagos felhasználók túl nehéznek találhatják az eszközkészlet felállítását ahhoz, hogy a blokklánccal valóban biztonságos módon interakcióba léphessenek. +- **Centralizálás** – előfordulhat, hogy a felhasználó- és fejlesztőbarát megoldások, amelyek az Ethereum alaprétegére épülnek, végül centralizált szolgáltatásként fognak működni. Például az ilyen szolgáltatások kulcsokat vagy más bizalmas információkat tárolnak a szerveroldalon, centralizált szervert használnak a frontend kiszolgálására, vagy fontos üzleti logikákat futtatnak egy centralizált szerveren, mielőtt a blokkláncra írnának. Ez kizárja rengeteg (ha nem az összes) előnyét a blokkláncnak a hagyományos modellel szemben. -## Dapp eszközök {#dapp-tools} +## Ön inkább vizuális típus? {#visual-learner} -**One Click Dapp** **_- FOSS eszköz, mely egy dapp frontendet generál egy ABI-ból._** + + +## Eszközök a dappok létrehozásához {#dapp-tools} + +**Scaffold-ETH _– Próbálja ki a Solidity megoldást olyan frontenddel, amely illeszkedik az Ön okosszerződéséhez._** + +- [GitHub](https://github.com/austintgriffith/scaffold-eth) +- [Példa egy dappra](https://punkwallet.io/) + +**Create Eth App _– Hozzon létre Ethereum-alapú alkalmazásokat egy paranccsal._** + +- [GitHub](https://github.com/paulrberg/create-eth-app) + +**One Click Dapp _- FOSS-eszköz dapp-frontendek készítéshez egy [ABI-ból](/glossary/#abi)._** - [oneclickdapp.com](https://oneclickdapp.com) - [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1) -**Etherflow** **_- FOSS leteszteljék a csomópontjukat & összeálítsanak valamint debugoljanak RPC hívásokat a böngészőből._** +**Etherflow _– FOSS-eszköz az Ethereum fejlesztők számára, amellyel tesztelheti csomópontjukat, illetve RPC-hívásokat állíthatnak össze és debuggolhatnak a böngészőből._** - [etherflow.quiknode.io](https://etherflow.quiknode.io/) - [GitHub](https://github.com/abunsen/etherflow) +**thirdweb _– SDK-k minden nyelven, okosszerződések, eszközök és infrastruktúra a web3 fejlesztéshez._** + +- [Honlap](https://thirdweb.com/) +- [Dokumentáció](https://portal.thirdweb.com/) +- [GitHub](https://github.com/thirdweb-dev/) + ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +- [Fedezze fel a dappokat](/dapps) +- [A web 3.0 alkalmazások architektúrája](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ +- [Egy 2021-es útmutató a decentralizált alkalmazásokról](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) – _LimeChain_ +- [Mik azok decentralizált alkalmazások?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) – _Gemini_ +- [Népszerű dapp-ok](https://www.alchemy.com/dapps) - _Alchemy_ + +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} diff --git a/public/content/translations/hu/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/hu/developers/docs/data-and-analytics/block-explorers/index.md index f18d85f9543..d6fa4c2cb17 100644 --- a/public/content/translations/hu/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/translations/hu/developers/docs/data-and-analytics/block-explorers/index.md @@ -9,265 +9,241 @@ A blokkfelfedezők a portálod az Ethereum adataihoz. Használatukkal valós ide ## Előfeltételek {#prerequisites} -Először meg kellene értened az Ethereum alapvető fogalmait ahhoz, hogy értelmezni tudd az adatokat, melyet egy blokkfelfedező biztosít neked. Kezdj itt: [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/). +Először meg kellene értened az Ethereum alapvető fogalmait ahhoz, hogy értelmezni tudd az adatokat, melyet egy blokkfelfedező biztosít neked. Kezdjen itt: [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/). ## Szolgáltatások {#services} -- [Etherscan](https://etherscan.io/) –_Elérhető kínaiul, koreaiul, oroszul és japánul_ -- [Etherchain](https://www.etherchain.org/) -- [Ethplorer](https://ethplorer.io/) -- [Blockchair](https://blockchair.com/ethereum) –_Elérhető spanyolul, franciául, olaszul, hollandul, portugálul, oroszul, kínaiul és újperzsa nyelven_ +- [Etherscan](https://etherscan.io/) –_ elérhető kínai, koreai, orosz és japán nyelven is_ +- [Beaconcha.in](https://beaconcha.in/) +- [Blockchair](https://blockchair.com/ethereum) –_ Spanyol, francia, olasz, holland, portugál, orosz, kínai és fárszi nyelven is elérhető_ - [Blockscout](https://blockscout.com/) +- [Etherchain](https://www.etherchain.org/) +- [Ethplorer](https://ethplorer.io/) –_Kínai, spanyol, francia, török, orosz, koreai és vietnámi nyelven is elérhető_ - [OKLink](https://www.oklink.com/eth) +- [Otterscan](https://otterscan.io/) +- [Rantom](https://rantom.app/) +- [Sirato](https://www.web3labs.com/sirato) +- [EthVM](https://www.ethvm.com/) +- [DexGuru Block Explorer](https://ethereum.dex.guru/) ## Adat {#data} -Az Ethereum tervezése folytán transzparens, így minden ellenőrizhető. A blokkfelfedezők egy felületet biztosítanak, hogy ez az információ elérhető legyen. És ez igaz az Ethereum főhálózatára és a teszt hálózatokra, ha szükséged van az adatokra. +Az Ethereum tervezése folytán transzparens, így minden ellenőrizhető. A blokkfelfedezők egy felületet biztosítanak, hogy ez az információ elérhető legyen. És ez igaz az Ethereum főhálózatára és a teszt hálózatokra, ha szükséged van az adatokra. Az adatok végrehajtási adatokra és konszenzusadatokra oszthatók. A „végrehajtási adatok” megnevezés egy konkrét blokkban végrehajtott tranzakciókra vonatkoznak. A „konszenzusadatok” megnevezés magukra a blokkokra és a blokkokat előterjesztő validátorokra vonatkozik. Itt egy összefoglaló azokról az adatokról, melyet egy blokkfelfedezőről megszerezhetsz. -### Blokkok {#blocks} +### Végrehajtási adatok {#execution-data} -Új blokkok adódnak hozzá az Ethereumhoz minden ~12 másodpercben (ez változhat) így van egy közel állandó adatfolyam, mely hozzáadódik a blokkfelfedezőkhöz. A blokkok sok fontos adatot tartalmaznak, melyeket hasznosnak találhatsz: +Az Ethereum hálózata minden 12 másodpercben új blokkal bővül (kivéve, ha a blokkelőterjesztő elszalasztja a lehetőségét), így van egy közel állandó adatfolyam, amely hozzáadódik a blokkfelfedezőkhöz. A blokkok sok fontos adatot tartalmaznak, melyeket hasznosnak találhatsz: **Standard adat** -- Blokk magasság - A blokk szám és a blokklánc hossza (blokkokban) a jelenlegi blokk létrehozásánál. -- Időbélyeg – Az időpont, amikor egy bányász kibányászta a blokkot. -- Tranzakciók – a blokkban lévő tranzakciók száma. -- Bányász – A bányász címe, aki kibányászta a blokkot. -- Jutalom – Az ETH mennyiség, melyet a bányász kap jutalmul, hogy hozzáadta a blokkot (alap 2ETH díj + minden tranzakció díja, mely a blokkban szerepelt). -- Nehézség – A blokk kibányászásához rendelt nehézség. -- Méret – A blokkban lévő adat mérete (bájtban mérve). -- Felhasznált gáz – A teljes gáz egység, melyet a tranzakciók felhasználtak a blokkban. -- Gáz limit – A teljes gáz limit, melyet a tranzakciók beállítottak a blokkban. -- Extra adat – Bármely extra adat, melyet a bányász belefoglalt a blokkba. +- Blokkmagasság – a blokklánc hossza és a benne foglalt blokkok száma (blokkokban kifejezve) az aktuális blokk létrehozásakor. +- Időbélyegző – a blokkjavaslat megjelenésének időpontja. +- Tranzakciók – a blokkban foglalt tranzakciók száma. +- Díj címzettje – az a cím, amely a tranzakciókból származó gasdíjtételeket megkapta. +- Blokkjutalom – a blokkot előterjesztő validátornak megítélt ETH-összeg. +- Méret – a blokkban foglalt adat mérete (bájtban kifejezve). +- Felhasznált gas – a teljes gasmennyiség, amelyet a blokkban foglalt tranzakciók felhasználtak. +- Gaskorlátozás – a blokkban foglalt tranzakciók által beállított teljes gaskorlátozás. +- Alapdíj/gas – az a minimumszorzó, amely egy tranzakció felvételéhez szükséges az adott blokkba. +- Elégetett díjak – a blokkban elégetett ETH mennyisége. +- Extra adat – Bármely extra adat, amelyet a bányász belefoglalt a blokkba. **Haladó adat** -- Hash – A kriptográfiai hash, mely a blokk fejlécét reprezentálja (a blokk egyedi azonosítója). -- Szülő hash – Annak a blokknak a hash-e, mely a jelenlegi blokk előtt jött. -- Sha3Uncles – Az adott szülőhöz tartozó összes uncle kombinált hash-e. -- StateRoot – A Merkle fa gyökér hash-e, mely a rendszer teljes állapotát tárolja. -- Nonce – Egy érték, mely demonstrálja a proof-of-work-öt egy blokkra a bányász által. - -**Uncle blokkok** - -Az uncle blokkok akkor jönnek létre, amikor két bányász közel azonos időben hoz létre két blokkot - csak egy blokkot lehet érvényesíteni a csomópontokon keresztül. Nem tartoznak a lánchoz, de így is jutalom jár értük a munkáért. - -A blokkfelfedezők információkat szolgáltatnak az uncle blokkokról úgy, mint: - -- Az uncle blokk száma. -- Az előfordulás időpontja. -- A blokk magasság, ahol létrejött. -- Ki bányászta ki. -- Az ETH jutalom. +- Hash – a kriptográfiai hash, amely a blokkfejlécét adja (a blokk egyedi azonosítója). +- Anyahash – az aktuális blokk előtt kiadott blokk hashértéke. +- StateRoot – A Merkle-fa gyökérhash-értéke, amely a rendszer teljes állapotát tárolja. ### Üzemanyag {#gas} -A blokkfelfedezők nem csak a tranzakciók és blokkok gáz felhasználásáról adnak információt, hanem némelyik a hálózat aktuális gázárairól is tájékoztat. Ez segít megérteni a hálózati kihasználtságot, biztonságos tranzakciókat indítani, és nem túlköltekezni az gázból. Keress olyan API-okat, melyek segítenek megadni ezt az információt a terméket felületére. A gáz-specifikus adat a következőket fedi le: +A blokkfelfedezők nemcsak a tranzakciók és blokkok gasfelhasználásáról adnak információt, hanem némelyik a hálózat aktuális gasárairól is tájékoztat. Ez segít megérteni a hálózathasználatot, biztonságos tranzakciókat indítani, és nem túlkölteni a gast. Keressen olyan API-kat, amelyek segítenek felvinni ezt az információt a terméke felületére. A gasspecifikus adat a következőket fedi le: -- A biztonságos, de lassú tranzakcióhoz szükséges gázegység becslése (+ becsült ár és idő). -- Az átlagos idejű tranzakcióhoz szükséges gázegység becslése (+ becsült ár és idő). -- Az gyors tranzakcióhoz szükséges gázegység becslése (+ becsült ár és idő). -- Az átlagos megerősítési idő a gáz ár alapján. -- Gázt fogyasztó szerződések – máshogy megfogalmazva, olyan népszerű termékek, melyeknek használata számottevő a hálózaton. -- Gázt költő számlák – vagyis, gyakori hálózati felhasználók. +- A biztonságos, de lassú tranzakcióhoz szükséges gasmennyiség becslése (+ becsült ár és idő) +- Az átlagos tranzakcióhoz szükséges gasmennyiség becslése (+ becsült ár és idő) +- A gyors tranzakcióhoz szükséges gasmennyiség becslése (+ becsült ár és idő) +- Átlagos megerősítési idő a gasár alapján +- gasfogyasztó szerződések – más szóval olyan népszerű termékek, amelyeket sokat használnak a hálózaton. +- gasköltő számlák – más szóval a rendszeres hálózathasználók. ### Tranzakciók {#transactions} -A blokkfelfedezők lettek a leggyakoribb hely az emberek számára, hogy nyomon kövessék a tranzakcióik folyamatát. Ennek az az oka, hogy a részletesség, amiben részesülhetsz, extra bizonyossággal bír. A tranzakció adat a következőket tartalmazza: +A blokkfelfedezők bevett eszközzé váltak az emberek kezében, hogy nyomon kövessék a tranzakcióik alakulását. Ennek az az oka, hogy az elérhető részletesség extra bizonyosságot nyújt. A tranzakcióadatok a következőket tartalmazzák: -**Standard adat** +**Standard adatok** -- Tranzakció hash – A tranzakció elküldésekor egy hash generálódik. -- Státusz – Egy jelzés arról, hogy a tranzakció függőben van-e, meghiúsult vagy sikeres volt-e. -- Blokk – A blokk, mely a tranzakciót tartalmazza. -- Időbélyeg – Az időpont, amikor egy bányász kibányászta a tranzakciót. -- Kitől (from) – A számla címe, amelyik elküldte a tranzakciót. -- Kinek (To)– A címzett vagy az okosszerződés címe, amivel a tranzakció interakcióba lép. -- Átutalt tokenek – Egy tokenekből álló lista, melyek át lettek utalva a tranzakcióban. +- Tranzakcióhash – a tranzakció elküldésekor a rendszer által generált hashérték. +- Állapot – jelzés arról, hogy a tranzakció függőben van, meghiúsult vagy sikeres volt. +- Blokk – a blokk, amely a tranzakciót tartalmazza. +- Időbélyegző – az időpont, amikor egy bányász kibányászta a tranzakciót. +- Feladó (From) – a tranzakciót elküldő számla címe. +- Címzett (To) – a fogadó fél vagy az okosszerződés címe, amellyel a tranzakció interakcióba lép. +- Átutalt tokenek – olyan tokenekből álló lista, amelyek át lettek utalva a tranzakcióban. - Érték – Az átutalt ETH összértéke. -- Tranzakciós díj – A bányásznak fizetett összeg, hogy feldolgozza a tranzakciót (a gáz ár\* felhasznált gázból számolva). +- Tranzakciós illeték – A bányásznak fizetett összeg, hogy feldolgozza a tranzakciót (számítása: gasár × felhasznált gas). -**Haladó adat** +**Részletes adatok** -- Gáz limit – A maximális gáz egység, melyet ez a tranzakció elfogyaszthat. -- Felhasznált gáz – A tényleges mennyiség, melyet ez a tranzakció elfogyasztott. -- Gáz ár – Egy gáz egységre beállított ár. -- Nonce – A `from` cím tranzakciós száma (ne feledd, hogy nullával kezdődik, így `100`-as nonce valójában a 101.-edik tranzakciót jelenteni, melyet a erről a számláról küldtek.) -- Input adat– Bármely extra információ a tranzakcióban. +- Gaskorlátozás – a gasegységek maximális száma, amelyet ez a tranzakció elfogyaszthat. +- Felhasznált gas – a tényleges gasmennyiség, amelyet ez a tranzakció elfogyasztott. +- Gasár – egy gasegységre beállított ár. +- Nonce – a `from` cím tranzakciószáma (ne feledje, hogy a számozás nullánál kezdődik, így a `100`-as nonce valójában az adott számláról küldött 101. tranzakciót jelenteni). +- Bemeneti adat – a tranzakció által megkövetelt bármely extra adat. ### Számlák {#accounts} -Rengeteg adatot tudsz egy számláról elérni. Ezért ajánlott, hogy több számlát használj, így a vagyonod és az értéke nehezebben lekövethető. Vannak azonban fejlesztés alatt álló megoldások, melyek a tranzakciókat és a számlákat privátabbá teszik. De itt van az adat, melyet elérhetsz a számlákról: +Egy adott számláról rengeteg adat elérhető. Ezért gyakran javasoljuk több számla használatát, hogy az eszközök és az érték ne legyen könnyen követhető. Vannak azonban fejlesztés alatt álló megoldások, amelyek nagyobb védelmet nyújtanak a tranzakció- és számlaadatoknak. De most nézzük meg a számlákról elérhető adatokat: **Felhasználói számlák** -- Számla cím – A nyilvános cím, melyre pénzt küldhetsz. -- ETH egyenleg – A számlához tartozó ETH mennyisége. -- Teljes ETH érték – Az ETH értéke. -- Tokenek – A számlához tartozó tokenek és az értékeik. -- Tranzakció történet – Az összes tranzakciót tartalmazó lista, ahol a számla vagy a küldő volt vagy a címzett. +- Számlacím – a nyilvános cím, amelyre pénzt küldhet. +- ETH egyenleg – a számlához tartozó ETH mennyisége. +- Teljes ETH érték – az ETH értéke. +- Tokenek – a számlához tartozó tokenek és értékeik. +- Tranzakciótörténet – az összes tranzakciót tartalmazó lista, ahol a számla volt a küldő vagy a címzett. **Okosszerződések** -Az okosszerződés számlák rendelkeznek az összes adattal, amivel a felhasználói számlák is, de némelyik blokkfelfedező valamennyi kód információt is szolgáltat. Úgy, mint: +Az okosszerződés-számlák rendelkeznek az összes adattal, amivel a felhasználói számlák is, de némelyik blokkfelfedező némi kódinformációt is szolgáltat. Többek között például: -- Szerződés létrehozó – A cím, amelyik feltöltötte a szerződést a főhálózatra. -- Létrehozó tranzakció – A tranzakció, mely tartalmazta a telepítést a főhálózatra. -- Forráskód – Az okosszerződés solidity vagy vyper kódja. -- Szerződés ABI – A szerződés Application Binary Interface – a szerződés általi hívásokat tartalmazza és a kapott adatokat. -- Szerződés létrehozás kód – Az okosszerződés lefordított bájtkódja – akkor jön létre, amikor Solidity-ben vagy Vyper-ben írt okosszerződést fordítasz. -- Szerződés események – Az okosszerződés által meghívott metódusok története. Lényegében egy mód arra, hogy lássuk hogyan használják a szerződést és milyen gyakran. +- Szerződés létrehozója – a cím, amelyik feltöltötte a szerződést a fő hálózatra. +- Létrehozó tranzakció – a tranzakció, amely tartalmazta a telepítést a fő hálózatra. +- Forráskód – az okosszerződés solidity vagy vyper kódja. +- Szerződés ABI – a szerződés Application Binary Interface-e (alkalmazásprogramozói interfésze) – a szerződés általi hívásokat és a kapott adatokat tartalmazza. +- Szerződés létrehozási kódja – az okosszerződés lefordított bájtkódja – akkor jön létre, amikor Ön Solidityben vagy Vyperben stb. írt okosszerződést fordít. +- Szerződésesemények – az okosszerződésben lehívott módszerek előzményei. Alapvetően azt mutatja meg, hogyan és milyen gyakran használják a szerződést. ### Tokenek {#tokens} -A token egy szerződés típus, így az okosszerződésekhez hasonló adatokkal rendelkezik. De mivel van értéke és lehet vele kereskedni, ezért további adatpontjai is vannak: +A token egy szerződéstípus, így az okosszerződésekhez hasonló adatokkal rendelkezik. De mivel van értéke és lehet vele kereskedni, ezért további adatpontjai is vannak: -- Típus – Lehet ERC-20, ERC-721 vagy más tokenszabvány. -- Árfolyam – Ha egy ERC-20, akkor van jelenlegi piaci értéke. -- Piaci kapitalizáció – Ha ERC-20, akkor van egy piaci kapitalizációja (az árfolyam \* teljes készletből számolva). -- Teljes készlet– A forgalomban lévő tokenek száma. -- Tartók – A tokent tartó címek száma. -- Átutalások – A számlák közötti átutalások száma. -- Tranzakciós történet – Az összes tokent tartalmazó tranzakció előzménye. -- Szerződés cím – A token címe, melyet feltelepítettek a főhálózatra. -- Tizedesjegyek – Az ERC-20 tokenek oszthatóak és vannak tizedes helyeik. +- Típus – lehet ERC-20, ERC-721 vagy más tokenszabvány. +- Árfolyam – ha egy ERC-20, akkor van aktuális piaci értéke. +- Piaci kapitalizáció – ha ERC-20, akkor van piaci kapitalizációja (számítása: árfolyam × teljes kínálat). +- Teljes kínálat – a forgalomban lévő tokenek száma. +- Tulajdonosok – a tokent birtokló címek száma. +- Átutalások – a számlák közötti tokenátutalások esetszáma. +- Tranzakciótörténet – az adott tokent tartalmazó összes korábbi tranzakció. +- Szerződéscím – a fő hálózatra feltelepített token címe. +- Tizedesjegyek – az ERC-20 tokenek oszthatók és vannak tizedes helyeik. ### Hálózat {#network} -Természetesen olyan adat is rendelkezésünkre áll, mely a hálózat egészségéről árulkodik. Ezek elég specifikusak az Ethereum proof-of-work konszenzus mechanizmusára nézve. Amikor az Ethereum áttér az Eth2-re néhány adat redundánssá válik majd - -- Nehézség – A jelenlegi bányászati nehézség. -- Hash ráta – Egy becslés arról, hogy mennyi hash-t generálnak az Ethereum bányászok, akik a jelenlegi Ethereum blokkot vagy bármely adott blokkot próbálják megoldani. -- Összes tranzakció – Az Ethereum létrehozása óta történt összes tranzakciók száma. -- Tranzakció per másodperc – Egy másodperc alatt feldolgozható tranzakciók száma. -- ETH árfolyam – 1 ETH jelenlegi értéke. -- Teljes ETH készlet – Forgalomban lévő ETH mennyiség – ne feledd, hogy új ETH jön létre minden egyes blokk létrejötte után blokkjutalom formájában. -- Piaci kapitalizáció – Az árfolyam \* készletből számolva. +Egyes blokkadatok holisztikusabb módon foglalkoznak az Ethereum-hálózat egészségével. -## Eth2 adat {#consensus-layer-data} +- Összes tranzakció – az Ethereum létrehozása óta végbement összes tranzakció száma. +- Tranzakció/másodperc – az egy másodperc alatt feldolgozható tranzakciók száma. +- ETH-árfolyam – 1 ETH aktuális értéke. +- Teljes ETH-kínálat – a forgalomban lévő ETH-mennyiség – ne feledje, hogy minden egyes blokk létrejöttével új ETH jön létre blokkjutalom formájában. +- Piaci kapitalizáció – számítása: árfolyam × kínálat. -Az Eth2 frissítések még fejlesztés alatt állnak, de érdemes megemlíteni az adatokat, melyet a felfedezők biztosítanak majd számodra. Valójában az összes adat elérhető a tesztneteken jelenleg. - -Ha nem ismered az Eth2-t, akkor tekintsd meg az [összefoglalónkat az Eth2 fejlesztésekről](/roadmap/). +## Konszenzusréteg-adatok {#consensus-layer-data} ### Korszak {#epoch} -Az első Eth2 fejlesztés, a beacon chain, fogja létrehozni a validátorokból álló bizottságokat, melyek biztonsági okokból véletlenszerűen állnak össze minden korszak (epoch) végén (minden 6.4 percben). A korszak adat a következőket tartalmazza: +Biztonsági okokból minden korszak végén (vagyis 6,4 percenként) véletlenszerűen összeállított validátorbizottságok jönnek létre. A korszakadatok a következőket tartalmazzák: -- Korszak szám. -- Véglegesített státusz – Véglegesült-e egy korszak (Igen/Nem). -- Idő – Az idő, amikor véget ért egy korszak. -- Tanúsítások – A korszakon belüli tanúsítások száma (blokkokra történő szavazás a slotokon belül). -- Letétek – A korszakban lévő ETH letétek száma (a validátoroknak ETH-et kell letenniük, hogy validátorok legyenek). -- Megvágás – A blokk javaslattevők és tanúsítók számára kirótt büntetések száma. -- Szavazati részvétel – A letétbe helyezett ETH mennyisége, melyet blokk tanúsításra használtak. -- Validátorok – A korszakban lévő aktív validátorok száma. -- Átlagos validátor egyenleg – Aktív validátorok átlagos egyenlege. -- Slotok – A korszakban lévő szlotok száma (egy slot egy érvényes blokkot tartalmaz). +- Korszak száma +- Véglegesített állapot – véglegessé vált-e a korszak (Igen/Nem). +- Idő – az idő, amikor véget ért a korszak. +- Tanúsítások – a korszakon belüli tanúsítások száma (szavazás blokkokra a slotokon belül). +- Letétek – a korszakban foglalt ETH-letétek száma (a validátoroknak ETH-t kell letenniük, hogy validátorok lehessenek). +- Megvágások – a blokkelőterjesztőknek és tanúsítóknak kirótt büntetések száma. +- Szavazási részvétel – a letétbe helyezett ETH-mennyiség, amelyet blokktanúsításra használtak. +- Validátorok – a korszakban aktív validátorok száma. +- Átlagos validátoregyenleg – az aktív validátorok átlagos egyenlege. +- Slotok – a korszakban lévő slotok száma (a slotok egy érvényes blokkot tartalmaznak). ### Slot {#slot} -A slotok blokk létrehozási lehetőségek, az egyes slotokra elérhető adat a következőket tartalmazza: - -- Korszak – A korszak, amiben érvényes a slot. -- Slot szám. -- Státusz – A slot státusza (Javasolt/Kihagyott). -- Idő – A slot időbélyege. -- Javaslattevő– A validátor, aki javasolta a blokkot a slotba. -- Blokk gyökér – A BeaconBlock hash-fa-gyökere. -- Szülő gyökér – Az előző blokk hash-e. -- Állapot gyökér – A BeaconState hash-fa-gyökere. -- Aláírás. -- Randao megjelenítés. -- Graffiti – A blokk javaslattevő bele tehet egy 32 bájt hosszú üzenetet a blokk javaslatába. -- ETH1 adat. - - Blokk hash. - - Letét méret. - - Letét gyökér. -- Tanúsítások – A tanúsítások száma ebben a slotban erre a blokkra. -- Letétek – A letétek száma a slot alatt. -- Önkéntes kilépők – A kilépő validátorok száma slot alatt. -- Megvágás – A blokk javaslattevők és tanúsítók számára kirótt büntetések száma. -- Szavazatok – A validátorok, akik a blokkra szavaztak ebben a slotban. +A slotok blokklétrehozási lehetőségek. Az egyes slotokra elérhető adat a következőket tartalmazza: + +- Korszak – a korszak, amelyben érvényes a slot. +- Slot száma +- Állapot – a slot állapota (javasolt/kihagyott). +- Idő – a slot időbélyegzője. +- Előterjesztő – a validátor, aki javasolta a blokkot a slotba. +- Blokkgyökér – a BeaconBlock hash-fa-gyökere. +- Anyagyökér – a megelőző blokk hashértéke. +- Állapotgyökér – a BeaconState hash-fa-gyökere. +- Aláírás +- Randao megjelenítés +- Graffiti – a blokkelőterjesztő belefoglalhat egy 32 bájt hosszú üzenetet a blokkjavaslatába. +- Végrehajtási adatok + - Blokkhash + - Letétszám + - Letétgyökér +- Tanúsítások – a tanúsítások száma a slotban erre a blokkra. +- Letétek – a letétek száma a slot alatt. +- Önkéntes kilépők – a kilépő validátorok száma a slot alatt. +- Megvágások – a blokkelőterjesztőknek és tanúsítóknak kirótt büntetések száma. +- Szavazatok – a validátorok, akik a blokkra szavaztak ebben a slotban. ### Blokkok {#blocks-1} -Az Eth2-ben a blokkok máshogy működnek, mivel a bányászokat felváltják a validátorok, valamint a beacon chain bevezeti a slotokat és a korszakokat az Ethereumba. Ez több adatot jelent! +A proof-of-stake mechanizmus az időt slotokra és korszakokra osztja. Tehát ez új adatokat jelent! -- Javaslattevő – A validátor, akit véletlenszerűen választottak ki, hogy javasoljon egy új blokkot. -- Korszak– A korszak, amiben a blokkot javasolták. -- Slot– A slot, amiben a blokkot javasolták. -- Tanúsítások – A slotban lévő tanúsítások száma. A tanúsítások olyanok, mint a szavazatok, melyek azt jelzik, hogy a blokk készen áll, hogy beacon chainhez adódjon. +- Előterjesztő – az a validátor, akit algoritmussal választott ki a rendszer, hogy új blokkra tegyen javaslatot. +- Korszak – a korszak, amelyben a blokkot előterjesztették. +- Slot – a slot, amelyben a blokkot előterjesztették. +- Tanúsítások – a slotban foglalt tanúsítások száma. A tanúsítások olyanok, mint a szavazatok, amelyek azt jelzik, hogy a blokk már továbbítható a Beacon láncra. ### Validátorok {#validators} -A validátorok felelősek új blokkok felterjesztéséért és tanúsításáért a slotokon belül. +A validátorok felelnek a blokkok előterjesztéséért és tanúsításáért a slotokon belül. -- Validátor szám– Egyedi szám, mely a validátort reprezentálja. -- Jelenlegi egyenleg – A validátor egyenlege a jutalmakkal együtt. -- Effektív egyenleg – A validátor egyenlege, mely letétbe helyezéshez van felhasználva. -- Bevétel – A jutalmak vagy büntetések, melyet a validátor kapott. -- Státusz – Aktív-e a validátor jelenleg vagy nem. -- Tanúsítási hatékonyság – Az átlagos idő, mely a validátor tanúsításának a lánchoz történő hozzáadásához szükséges. -- Aktiválási jogosultság – Dátum (és korszak), amikor a validátor elérhetővé vált a validálásra. -- Aktív ettől – Dátum (és korszak), amikor a validátor aktívvá vált. -- Javasolt blokkok – A blokk, melyet a validátor javasolt. -- Tanúsítások – A validátor által biztosított tanúsítások. -- Letétek – A küldő címe, tranzakció hash-e, blokk száma, időbélyege, mennyisége és a státusza a validátor által elhelyezett letétnek. +- Validátorszám – egyedi szám, amely a validátort jelöli. +- Aktuális egyenleg – a validátor egyenlege a jutalmakkal együtt. +- Tényleges egyenleg – a validátor letéthez használt egyenlege. +- Bevétel – a validátor által kapott jutalmak vagy büntetések. +- Állapot – éppen online és aktív a validátor, vagy sem. +- Tanúsítási hatékonyság – az átlagos idő, amely a validátor tanúsításának lánchoz adásához szükséges. +- Aktiválási jogosultság – dátum (és korszak), amikor a validátor számára elérhetővé vált a validálás. +- Aktív ettől – dátum (és korszak), amikor a validátor aktívvá vált. +- Javasolt blokkok – a validátor által előterjesztett blokkok. +- Tanúsítások – a validátor által biztosított tanúsítások. +- Letétek – a küldő címe, a tranzakció hashértéke, a blokk száma, időbélyegzője, a validátori letét összege és állapota. ### Tanúsítások {#attestations} -A tanúsítások "igen" szavazatok arra, hogy a blokkot a lánchoz adják. Az adataik kapcsolódnak a tanúsítások bejegyzéseihez és a tanúsító validátorokhoz +A tanúsítások „igen” szavazatok arra, hogy a blokkot a lánchoz adják. Az adataik kapcsolódnak a tanúsítások nyilvántartásához és a tanúsító validátorokhoz. -- Slot – A slot, ahol a tanúsítás megtörtént. -- Bizottság index – A bizottság indexe az adott slotban. -- Összesítő bitek – Az aggregált tanúsítást reprezentálja minden résztvevő validátorra a tanúsításban. -- Validátorok– A validátorok, akik tanúsításokat szolgáltattak. -- Beacon blokk gyökér – Arra a blokkra mutat, amelyet a validátorok tanúsítanak. -- Forrás – A legutolsó igazolt korszakra mutat. -- Cél – A legutolsó korszak határra mutat. -- Aláírás. +- Slot – a slot, amelyben a tanúsítás történt. +- Bizottságindex – a bizottság indexe az adott slotban. +- Összesítő bitek – az aggregált tanúsítást mutatja a tanúsításban részt vevő minden validátorra. +- Validátorok – a tanúsításokat szolgáltató validátorok. +- Beacon-blokkgyökér – arra a blokkra mutat, amelyet a validátorok tanúsítanak. +- Forrás – a legutolsó igazolt korszakra mutat. +- Cél – a legutolsó korszakhatárra mutat. +- Aláírás ### Hálózat {#network-1} -Az Eth2 felső szintű adat a következőket tartalmazza: +A konszenzusréteg felső szintű adatai a következők: -- Jelenlegi korszak. -- Jelenlegi slot. -- Aktív validátorok – Aktív validátorok száma. -- Függőben lévő validátorok – A validátorok száma, akik az aktiválásra várnak. -- Letett ETH – A hálózatba letétbe helyezett ETH mennyisége. -- Átlag egyenleg – A validátorok átlagos ETH egyenlege. +- Aktuális korszak +- Aktuális slot +- Aktív validátorok – aktív validátorok száma. +- Függőben lévő validátorok – az aktiválásra váró validátorok száma. +- Letétbe helyezett ETH – a hálózaton letétbe helyezett ETH-mennyiség. +- Átlagos egyenleg – a validátorok átlagos ETH-egyenlege. ## Blokk felfedezők {#block-explorers} -- [Etherscan](https://etherscan.io/) – egy blokkfelfedező, ahol adatokat kérhetsz le az Ethereum főhálózatról, Ropsten tesztnetről, Kovan tesztnetről, Rinkeby tesztnetről, és a Goerli tesztnetről. -- [Blockscout](https://blockscout.com/) – a következő hálózatokra fókuszál: - - xDai – a MakerDAO DAI stablecoinja és a POA mellékláncánal okos kombinációja, valamint tokenbridge technológia. - - POA – Egy melléklánc és autonóm hálózat, melyet egy megbízható validátorokból álló csoport tart biztonságban. A hálózat összes validátora az Egyesült Államokban van bejegyezve és a információik nyilvánosan elérhetőek. - - POA Sokol Tesztnet. - - ARTIS – egy Ethereum kompatibilis blokklánc. - - [LUKSO L14](https://blockscout.com/lukso/l14) – az L14 az első teszt hálózatként működik, hogy a LUKSO közösség egy közös infrastruktúrán építhessen és tesztelhessen. - - qDai. -- [Etherchain](https://www.etherchain.org/) – egy Ethereum főhálózati blokkfelfedező. -- [Ethplorer](https://ethplorer.io/) – egy blokkfelfedező, mely az Ethereumon és a Kovan tesztneten található tokenekre fókuszál. -- [Blockchair](https://blockchair.com/ethereum) - a legprivátabb Ethereum felfedező. Alkalmas (mempool) adatok szűrésére és válogatására is. - -## Eth2 blokk felfedezők {#beacon-chain-block-explorers} - -- [https://beaconcha.in/](https://beaconcha.in/) -- [https://beaconscan.com/](https://beaconscan.com/) +- [Etherscan](https://etherscan.io/) – egy blokkfelfedező, amelyben adatokat kérhet le az Ethereum-főhálózatról és a Goerli tesztelőhálózatról. +- [Beaconcha.in](https://beaconcha.in/) – egy nyílt forráskódú blokkfelfedező az Ethereum főhálózatra és a Goerli teszthálózatra +- [Blockchair](https://blockchair.com/ethereum) – a legdiszkrétebb Ethereum-felfedező. Alkalmas (memóriakészlet) adatok szűrésére és válogatására is +- [Etherchain](https://www.etherchain.org/) – egy Ethereum-főhálózati blokkfelfedező +- [Ethplorer](https://ethplorer.io/) – egy blokkfelfedező, amely az Ethereum-főhálózaton és a Kovan tesztelőhálózaton található tokenekre fókuszál +- [Rantom](https://rantom.app/) – egy felhasználóbarát, nyílt forráskódú DeFi- és NFT-tranzakciómegtekintő a részletesebb betekintéshez ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +_Ismer olyan közösségi információforrást, amely a hasznára vált? Módosítsa az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} -- [Bányászat](/developers/docs/consensus-mechanisms/pow/mining/) - [Tranzakciók](/developers/docs/transactions/) -- [Számlák](/developers/docs/accounts/) +- [Fiókok](/developers/docs/accounts/) - [Hálózatok](/developers/docs/networks/) diff --git a/public/content/translations/hu/developers/docs/data-and-analytics/index.md b/public/content/translations/hu/developers/docs/data-and-analytics/index.md new file mode 100644 index 00000000000..5620c2063fc --- /dev/null +++ b/public/content/translations/hu/developers/docs/data-and-analytics/index.md @@ -0,0 +1,45 @@ +--- +title: Adat és elemzések +description: Hogyan használjon on-chain elemzéseket és adatokat a dappjában +lang: hu +--- + +## Bevezetés {#Introduction} + +Ahogy a hálózat használata tovább fejlődik, a láncon belüli adatokban egyre növekszik az értékes információk mennyisége. Az adatok mennyiségének gyors növekedésével sok idő és kapacitás kell ahhoz, hogy ezeket az információkat kalkulálni és aggregálni tudjuk, hogy riportálható legyen vagy egy alkalmazást vezéreljen. + +A jelenlegi adatszolgáltatók használata előmozdíthatja a fejlesztést, sokkal pontosabb eredményeket adhat és csökkentheti a fenntartáshoz szükséges erőfeszítéseket. Ezáltal a fejlesztők koncentrálhatnak a projektjük fő funkcionalitására, melyet elérhetővé szeretnének tenni. + +## Előfeltételek {#prerequisites} + +Érdemes áttekinteni a [blokkfelfedezők](/developers/docs/data-and-analytics/block-explorers/) alapkoncepcióját, hogy hogyan használhatók adatelemzési területen. Emellett az [index](/glossary/#index) koncepciójának megértése is fontos, hogy egyértelművé váljon, a rendszerterv részeként milyen előnyöket hozhat. + +Az architektúra alapjaiból fontos ismerni, mi az az [API](https://www.wikipedia.org/wiki/API) és a [REST](https://www.wikipedia.org/wiki/Representational_state_transfer), akár csak elméletben. + +## Blokk felfedezők {#block-explorers} + +Néhány [blokkfelfedező](/developers/docs/data-and-analytics/block-explorers/) [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer) [API](https://www.wikipedia.org/wiki/API) kapcsolatokat ajánl, hogy a fejlesztőknek rálátásuk legyen az aktuális adatokról a blokkok, tranzakciók, bányászok, számlák és más láncon folyó tevékenységek tekintetében. + +A fejlesztők ezáltal ezeket az adatokat feldolgozzák és átalakítják, hogy a felhasználóiknak egyedi rálátásuk legyen a [blokkláncra](/glossary/#blockchain) és interakcióba léphessenek vele. Például az [Etherscan](https://etherscan.io) végrehajtási és konszenzusok adatokat biztosít minden 12 másodperces slotról. + +## The Graph {#the-graph} + +A [Graph Network](https://thegraph.com/) egy decentralizált indexáló protokoll a blokkláncadatok összerendezésére. Ahelyett, hogy láncon kívüli és centralizált adattárházakat építenének és menedzselnének a láncon belüli adatok aggregálására, a The Graph révén a fejlesztők szerver nélküli alkalmazásokat építhetnek, melyek teljes mértékben nyilvános infrastruktúrán működnek. + +A [GraphQL](https://graphql.org/) lekérdezési nyelv használatával a fejlesztők lekérdezhetik bármelyik gondozott, nyílt API-t, más néven algráfot (subgraph), hogy megszerezzék az alkalmazás működéséhez szükséges információkat. Az indexált algráfok lekérdezésével a riportok és alkalmazások nemcsak teljesítmény- és skálázási előnyhöz jutnak, hanem a hálózati konszenzus által biztosított adathelyességet is élvezhetik. A hálózatba kerülő új fejlesztésekkel és algráfokkal az Ön projektje is gyorsan előnyt kovácsolhat ezekből az újdonságokból. + +## Kliensdiverzitás + +A [kliensdiverzitás](/developers/docs/nodes-and-clients/client-diversity/) rendkívül fontos az egész Ethereum-hálózat átfogó egészsége szempontjából, mivel védelmet biztosít a hibák és támadások ellen. Számos kliensdiverzitásról szóló kimutatás elérhető, mint a [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [execution-diversity.info](https://execution-diversity.info/) és az [Ethernodes](https://ethernodes.org/). + +## Dune Analytics {#dune-analytics} + +A [Dune-elemzések](https://dune.com/) előre feldolgozzák a blokkláncadatokat relációs adatbázistáblákba (PostgreSQL és DatabricksSQL), hogy a felhasználók lekérdezhessék a blokklánc adatait SQL segítségével és ennek eredményéből további kimutatásokat építhessenek. A láncon lévő adatok 4 nyerstáblába rendeződnek: `blocks` (blokkok), `transactions` (tranzakciók), `logs` (eseménynaplózás) és `traces` (meghívások nyomai). A népszerű szerződéseket és protokollokat dekódolják, és mindegyik rendelkezik a maga eseményeket és meghívásokat tartalmazó tábláival. Ezeket az esemény- és hívástáblákat tovább dolgozzák és absztrakciós táblákba szervezik a protokollok típusa szerint, mint amilyen a DEX, kölcsönzés, stabilérmék stb. + +## További olvasnivaló {#further-reading} + +- [A gráfhálózat áttekintése](https://thegraph.com/docs/en/about/network/) +- [Gráflekérdezési próbafelület (playground)](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) +- [API-kódpéldák az EtherScan oldalon](https://etherscan.io/apis#contracts) +- [Beaconcha.in – Beaconlánc-felfedező](https://beaconcha.in) +- [A Dune alapjai](https://docs.dune.com/#dune-basics) diff --git a/public/content/translations/hu/developers/docs/development-networks/index.md b/public/content/translations/hu/developers/docs/development-networks/index.md index 17f26b92928..86c68433404 100644 --- a/public/content/translations/hu/developers/docs/development-networks/index.md +++ b/public/content/translations/hu/developers/docs/development-networks/index.md @@ -4,13 +4,13 @@ description: Áttekintés az fejlesztői hálózatokról és az eszközökről, lang: hu --- -Az okosszerződésekkel történő Ethereum alkalmazások fejlesztésekor fontos, hogy egy lokális hálózaton futtasd, hogy megnézd hogyan működik telepítés előtt. +Amikor okosszerződéseket tartalmazó Ethereum alkalmazást épít, fontos, hogy egy lokális hálózaton lefuttassa azt, hogy megnézze hogyan működik telepítés előtt. -Hasonlóan ahhoz, amikor egy lokális szervert futtatsz a számítógépeden webfejlesztés céljából, használhatsz fejlesztői hálózatokat egy lokális blokklánc példány létrehozásához, ahol tesztelheted a dappodat. Ezek az Ethereum fejlesztői hálózatok olyan tulajdonságokkal rendelkeznek, melyek lehetővé teszik a gyorsabb iterációt, mint egy nyilvános tesztnet (például nem kell azzal bajlódnod, hogy ETH-et szerezz egy tesztnet csapból). +Hasonlóan ahhoz, amikor egy lokális szervert futtat a számítógépén webfejlesztés céljából, használhat fejlesztői hálózatokat egy lokális blokkláncpéldány létrehozásához, ahol tesztelheti a dappot. Ezek az Ethereum fejlesztői hálózatok olyan tulajdonságokkal rendelkeznek, melyek lehetővé teszik a gyorsabb iterációt, mint egy nyilvános teszthálózat (például nem kell azzal bajlódnia, hogy ETH-t szerezz egy teszthálózati csapból). ## Előfeltételek {#prerequisites} -Először meg kell értened az [Ethereum stack alapjait](/developers/docs/ethereum-stack/) és az [Ethereum hálózatokat](/developers/docs/networks/) mielőtt belevágnál a fejlesztői hálózatokba. +Először meg kell értenie az [Ethereum stack alapjait](/developers/docs/ethereum-stack/) és az [Ethereum hálózatokat](/developers/docs/networks/) mielőtt elmélyedne a fejlesztői hálózatokban. ## Mi a fejlesztői hálózat? {#what-is-a-development-network} @@ -18,19 +18,19 @@ A fejlesztői hálózatok lényegében olyan Ethereum kliensek (Ethereum impleme **Miért ne futtassunk standard Ethereum csomópontot lokálisan?** -_Akár _ [futtathatsz saját csomópontot](/developers/docs/nodes-and-clients/#running-your-own-node) (mint a Geth, OpenEthereum vagy a Nethermind), de mivel a fejlesztői hálózatok célzottan a fejlesztésre vannak létrehozva, olyan kényelmi funkciók is be vannak építve, mint például: +_Akár _ [saját csomópontot is futtathat](/developers/docs/nodes-and-clients/#running-your-own-node), de mivel a fejlesztői hálózatok célzottan a fejlesztésre vannak létrehozva, olyan kényelmi funkciók is be vannak építve, mint például: -- A lokális blokklánc feltöltése adatokkal determinisztikusan (pl. pénztárcák ETH tartalommal) -- Azonnali blokk bányászat minden egyes megkapott tranzakciónál, sorrendben és késés nélkül -- Fejlett debuggolás és loggolási funkciók +- A lokális blokklánc determinisztikus feltöltése adatokkal (például számlák ETH egyenleggel) +- Azonnali blokklétrehozás minden egyes megkapott tranzakciónál, sorrendben és késés nélkül +- Fejlett hibakeresés és naplózási funkciók ## Elérhető eszközök {#available-projects} -**Megjegyzés**: A legtöbb [fejlesztői keretrendszer](/developers/docs/frameworks/) egy beépített fejlesztői hálózatot tartalmaz. Ajánljuk, hogy egy keretrendszer segítségével [állítsd be a helyi fejlesztési környezetedet](/developers/local-environment/). +**Megjegyzés**: A legtöbb [fejlesztői keretrendszer](/developers/docs/frameworks/) egy beépített fejlesztői hálózatot tartalmaz. Ajánljuk, hogy egy keretrendszer segítségével [állítsa be a helyi fejlesztési környezetét](/developers/local-environment/). ### Ganache {#ganache} -Indítsd be gyorsan egy személyes Ethereum blokkláncot, melyet tesztek futtatására, parancsok végrehajtására és az állapot megtekintésére használhatsz, mialatt a lánc működését irányítod. +Indítson be gyorsan egy személyes Ethereum blokkláncot, melyet tesztek futtatására, parancsok végrehajtására és az állapot megtekintésére használhat, mialatt a lánc működését irányítja. A Ganache-nak van asztali alkalmazása (Ganache UI) és parancssori alkalmazása is (`ganache-cli`). A Truffle eszközsorozat része. @@ -40,18 +40,44 @@ A Ganache-nak van asztali alkalmazása (Ganache UI) és parancssori alkalmazása ### Hardhat Network {#hardhat-network} -Egy helyi Ethereum hálózat fejlesztésre tervezve. Szerződéseket telepíthetsz, teszteket futtathatsz és debuggolhatod a kódodat +Egy helyi Ethereum hálózat fejlesztésre tervezve. Szerződéseket telepíthet, teszteket futtathat, hibakeresést és javítást végezhet a kódján. A Hardhat Network a beépített Hardhat-tel jön, ami egy Ethereum fejlesztői környezet szakembereknek. - [Honlap](https://hardhat.org/) - [GitHub](https://github.com/nomiclabs/hardhat) +### Helyi Beacon láncok {#local-beacon-chains} + +Néhány konszenzusos kliens rendelkezik olyan beépített eszközökkel, amellyel fel lehet állítani helyi Beacon láncokat a teszteléshez. Elérhető instrukciók a Lighthouse, Nimbus és Lodestar kliensekhez: + +- [Helyi teszthálózat a Lodestarhoz](https://chainsafe.github.io/lodestar/usage/local/) +- [Helyi teszthálózat a Lighthouse-hoz](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) +- [Helyi teszthálózat a Nimbushoz](https://github.com/status-im/nimbus-eth1/blob/master/fluffy/docs/local_testnet.md) + +### Nyilvános Ethereum-tesztláncok {#public-beacon-testchains} + +Az Ethereum két karbantartott, nyilvános tesztimplementációval is rendelkezik: Goerli és Sepolia. A Goerli a javasolt teszthálózat, mely hosszú távú támogatással bír, és mindenkinek ingyenesen használható validálásra. A Sepolia egy újabb, kisebb lánc, melyet szintén fenn akarnak tartani a jövőben, és amelynek része egy engedélyhez kötött validátorszett (nem működhet bárki validátorként). A Ropsten lánc 2022. 4. negyedévében, a Rinkeby lánc pedig 2023. 2./3. negyedévében kerül lezárásra. + +- [Goerli letétbe helyezési indítópult](https://goerli.launchpad.ethereum.org/) +- [Ropsten, Rinkeby és Kiln kivezetési bejelentés](https://blog.ethereum.org/2022/06/21/testnet-deprecation) + +### Kurtosis Ethereum csomag {#kurtosis} + +A Kurtosis egy felépített rendszer a több konténeres tesztkörnyezetekhez, amellyel a fejlesztők lokálisan felállíthatják a reprodukálható példányait a blokklánchálózatoknak. + +Az Ethereum Kurtosis csomag lokálisan példányosítja a konténerezett és paraméterezett Ethereum-teszthálózatot, amely több különböző végrehajtásiréteg- (EL) és konszenzusréteg- (CL) klienst és n-számú csomópontot támogat. A Kurtosis kezeli az összes lokális portbeállítást és szolgáltatási kapcsolatokat, hogy könnyebb legyen prototípusokat készíteni az alkalmazásokhoz és okosszerződésekhez, valamint tesztelni azokat. + +- [Ethereum hálózati csomag](https://github.com/kurtosis-tech/eth-network-package) +- [Honlap](https://www.kurtosis.com/) +- [GitHub](https://github.com/kurtosis-tech/kurtosis) +- [Dokumentáció](https://docs.kurtosis.com/) + ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} - [Fejlesztői keretrendszerek](/developers/docs/frameworks/) -- [Állítsd fel a helyi fejlesztői környezetedet](/developers/local-environment/) +- [Helyi fejlesztői környezet felállítása](/developers/local-environment/) diff --git a/public/content/translations/hu/developers/docs/ethereum-stack/index.md b/public/content/translations/hu/developers/docs/ethereum-stack/index.md index 6167ba13297..443d3a61849 100644 --- a/public/content/translations/hu/developers/docs/ethereum-stack/index.md +++ b/public/content/translations/hu/developers/docs/ethereum-stack/index.md @@ -4,17 +4,17 @@ description: Egy áttekintő az Ethereum stack különböző rétegeiről és ar lang: hu --- -Mint bármely szoftver stack az "Ethereum stack" változni fog projektről projektre az üzleti céljaidtól függően. +Mint bármely szoftverstack, az „Ethereum-stack” is változni fog projektről projektre az Ön céljaitól függően. Vannak azonban alap Ethereum technológiák, melyek segítenek egy mentális modellt szolgáltatni arról, hogy a szoftver alkalmazások hogyan lépnek interakcióba az Ethereum blokklánccal. A stack rétegeinek megértése segíteni fog megérteni az Ethereum szoftver projektekbe történő integrálásának különböző módjait. ## Első szint: Ethereum Virtuális Gép {#ethereum-virtual-machine} -Az [Ethereum Virtuális Gép (EVM)](/developers/docs/evm/) egy futtatókörnyezet az Ethereumon okosszerződések számára. Az Ethereum blokkláncon minden okosszerződést és állapot változást [tranzakciók](/developers/docs/transactions/) hajtanak végre. Az EVM kezeli az összes tranzakció feldolgozását az Ethereum hálózaton. +Az [Ethereum virtuális gép (EVM)](/developers/docs/evm/) egy futtatókörnyezet az Ethereumon az okosszerződések számára. Az Ethereum blokkláncon minden okosszerződést és állapot változást [tranzakciók](/developers/docs/transactions/) hajtanak végre. Az EVM kezeli az összes tranzakció feldolgozását az Ethereum hálózaton. Mint bármilyen virtuális gép esetében, az EVM egy absztrakciós szintet hoz létre a kód végrehajtás és a végrehajtó gép (egy Ethereum csomópont) között. Az EVM jelenleg több ezer csomóponton fut szerte a világban. -A háttérben az EVM opcode utasítások sorozatát használja meghatározott feladatok végrehajtásához. Ez a (140 egyedi) opcode teszi Turing-teljessé az EVM-et, mely azt jelenti, hogy az EVM szinte bármit ki tud számítani, ha elegendő erőforrással rendelkezik. +A háttérben az EVM opcode utasítások sorozatát használja meghatározott feladatok végrehajtásához. Ez a (140 egyedi) operációs kód lehetővé teszi az EVM számára, hogy [Turing-teljes](https://en.wikipedia.org/wiki/Turing_completeness) legyen, tehát az EVM bármit ki tud számolni, ha elég erőforrás áll rendelkezésre. Dapp fejlesztőként nem kell sokat tudnod az EVM-ről azon kívül, hogy létezik és megbízhatóan működteti az összes Ethereum alkalmazást állásidő nélkül. @@ -24,17 +24,17 @@ Az [okosszerződések](/developers/docs/smart-contracts/) olyan futtatható prog Az okosszerződéseket specifikus [programozási nyelveken](/developers/docs/smart-contracts/languages/) írják, melyek EVM bájtkódra fordítódnak (alacsony szintű gépi instrukciók, melyeket opcode-nak nevezünk). -Az okosszerződések nem csak nyílt forráskódú könyvtáraknak felelnek meg, hanem lényegében nyílt API szolgáltatásokként működnek, melyek 24/7-ben futnak és nem lehet őket leállítani. Az okosszerződések nyilvános függvényeket szolgáltatnak, melyeket az alkalmazások ([dappok](/developers/docs/dapps/)) engedély nélkül meghívhatnak. Bármely alkalmazás integrálhatja a telepített okosszerződéseket, hogy funkciókat illesszen össze (mint például adat feedek vagy decentralizált tőzsdék). Bárki telepíthet új okosszerződéseket az Ethereumra, hogy tetszőleges funkcionalitást adjon, mely egyezik az alkalmazás szükségleteivel. +Az okosszerződések nem csak nyílt forráskódú könyvtáraknak felelnek meg, hanem lényegében nyílt API szolgáltatásokként működnek, melyek 24/7-ben futnak és nem lehet őket leállítani. Az okosszerződések nyilvános függvényeket szolgáltatnak, amelyeket a felhasználók és az alkalmazások ([dappok](/developers/docs/dapps/)) engedély nélkül meghívhatnak. Bármelyik alkalmazás összekapcsolható a működő okosszerződésekkel, hogy valamilyen funkcionalitást alkosson, mint például [adatok használata](/developers/docs/oracles/), illetve támogassa a tokenek átváltását. Bárki telepíthet új okosszerződéseket az Ethereumra, hogy tetszőleges funkcionalitást adjon, mely egyezik az alkalmazás szükségleteivel. Dapp fejlesztőként csak akkor kell okosszerződéseket írnod, ha szeretnél egyedi funkciókat hozzáadni az Ethereum blokklánchoz. Hamar rájöhetsz, hogy a projekted legtöbb célját elérheted csupán a létező okosszerződések integrálásával, például ha szeretnéd használni a stablecoin fizetéseket vagy lehetővé tenni a tokenek decentralizált cseréjét. ## Harmadik szint: Ethereum csomópontok {#ethereum-nodes} -Ahhoz, hogy egy alkalmazás interakcióba lépjen az Ethereum blokklánccal (vagyis képes legyen blokklánc adatok olvasására és/vagy tranzakció küldésre a hálózatra), rá kell csatlakoznia egy [Ethereum csomópontra](/developers/docs/nodes-and-clients/). +Ahhoz, hogy az alkalmazás az Ethereum-blokklánccal működni tudjon, egy [Ethereum-csomóponthoz](/developers/docs/nodes-and-clients/) kell kapcsolódnia. Egy ilyen csomópont lehetővé teszi, hogy elérje a blokkláncon lévő adatokat és/vagy tranzakciókat küldjön a hálózatnak. -Az Ethereum csomópontok egy szoftvert - Ethereum klienst - futtató számítógépek. Egy kliens egy Ethereum implementáció, mely hitelesíti az összes tranzakciót az egyes blokkokban, így a hálózat biztonságos marad az adatok pedig pontosak. Az Ethereum csomópontok MAGUK az Ethereum blokklánc. Kollektívan tárolják az Ethereum blokklánc állapotát és konszenzust érnek el a tranzakciókon, melyek a blokklánc állapotot megváltoztatják. +Az Ethereum csomópontok egy szoftvert - Ethereum klienst - futtató számítógépek. Egy kliens egy Ethereum implementáció, mely hitelesíti az összes tranzakciót az egyes blokkokban, így a hálózat biztonságos marad az adatok pedig pontosak. **Az Ethereum-csomópontok összessége az Ethereum-blokklánc**. Kollektívan tárolják az Ethereum blokklánc állapotát és konszenzust érnek el a tranzakciókon, melyek a blokklánc állapotot megváltoztatják. -Hogyha összekapcsolod az alkalmazásodat egy Ethereum csomóponttal (JSON RPC-n keresztül), akkor az alkalmazásod képes lesz adatokat leolvasni a blokkláncról (például felhasználói számla egyenlegek), illetve új tranzakciókat közvetíteni a hálózatra (például ETH átutalás felhasználói számlák között vagy okosszerződés függvények futtatása). +Hogyha összekapcsolja az alkalmazást egy Ethereum-csomóponttal ([JSON RPC-n](/developers/docs/apis/json-rpc/) keresztül), akkor az alkalmazás képes lesz adatokat leolvasni a blokkláncról (például felhasználóiszámla-egyenlegek), illetve új tranzakciókat közvetíteni a hálózatra (például ETH-átutalás felhasználói számlák között, illetve okosszerződés-függvények futtatása). ## Négyes szint: Ethereum kliens API-ok {#ethereum-client-apis} @@ -56,4 +56,6 @@ Nézd meg az útmutatónkat, hogy[felállítsd egy helyi fejlesztői környezete ## További olvasnivaló {#further-reading} +- [A web 3.0 alkalmazások architektúrája](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ + _Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ diff --git a/public/content/translations/hu/developers/docs/evm/index.md b/public/content/translations/hu/developers/docs/evm/index.md index 34c0fb98160..0c47bfc0de2 100644 --- a/public/content/translations/hu/developers/docs/evm/index.md +++ b/public/content/translations/hu/developers/docs/evm/index.md @@ -6,17 +6,17 @@ lang: hu Az EVM fizikai megtestesülését nem lehet úgy leírni, mint ahogy azt egy felhő vagy egy óceáni hullám esetében tennénk, de attól még _létezik_ egy egyedüli entitásként több ezer összekapcsolt számítógép által, melyek egy Ethereum klienst futtatnak. -Az Ethereum protokoll létezésének kizárólagos célja, hogy ennek a speciális állapot gépnek biztosítsa a folyamatos, megszakítások nélküli és megváltoztathatatlan működését; ez az a környezet, amiben az össze Ethereum számla és okosszerződés él. A lánc bármely adott blokkján az Ethereumnak egy és csak egy 'kanonikus' állapota van, és az EVM határozza meg a szabályokat egy új érvényes állapot létrehozására blokkról blokkra. +Az Ethereum protokoll maga egyedül azért létezik, hogy fenntartsa a folyamatos, zavartalan és változatlan működését ennek a speciális státuszú gépnek. Ez egy olyan környezet, amelyben az összes Ethereum számla és okosszerződés él. A lánc bármely adott blokkján az Ethereumnak egy és csak egy „kanonikus” állapota van, és az EVM határozza meg a szabályokat egy új érvényes állapot létrehozására blokkról blokkra. ## Előfeltételek {#prerequisites} -Alapvető számítástudományi fogalmak ismerete, mint például a [bájtok](https://wikipedia.org/wiki/Byte), [memória](https://wikipedia.org/wiki/Computer_memory), és a [stack]() szükségesek, hogy megértsd az EVM-et. Érdemes tisztában lenni egy pár kriptográfiai/blokklánc fogalommal úgy, mint a [hash függvények](https://wikipedia.org/wiki/Cryptographic_hash_function), [Proof-of-Work](https://wikipedia.org/wiki/Proof_of_work) és a [Merkle Fa](https://wikipedia.org/wiki/Merkle_tree). +Alapvető számítástudományi fogalmak ismerete, mint például a [bájtok](https://wikipedia.org/wiki/Byte), [memória](https://wikipedia.org/wiki/Computer_memory), és a [stack](https://wikipedia.org/wiki/Stack_(abstract_data_type)) szükségesek ahhoz, hogy megértse az EVM-et. Érdemes tisztában lenni egy pár kriptográfiai/blokklánc fogalommal úgy, mint a [hash függvények](https://wikipedia.org/wiki/Cryptographic_hash_function) és a [Merkle-fa](https://wikipedia.org/wiki/Merkle_tree). ## Főkönyvtől az állapot gépig {#from-ledger-to-state-machine} -Az 'elosztott főkönyv' analógiáját gyakran használjuk olyan blokkláncok jellemzésére, mint a Bitcoin, mely lehetővé egy decentralizált valuta létrehozását alapvető kriptográfiai eszközök használatával. Egy kriptovaluta úgy viselkedik, mint egy 'normál' valuta a szabályok miatt, melyek meghatározzák, hogy az adott illető mit vagy mit nem tehet, hogy megváltoztassa a főkönyvet. Például egy Bitcoin cím nem költhet el több bitcoint, mint amennyit előzőleg megkapott. Ezek a szabályok támasztják alá az összes Bitcoin tranzakciót és sok más blokkláncot is. +Az 'elosztott főkönyv' analógiáját gyakran használjuk olyan blokkláncok jellemzésére, mint a Bitcoin, mely lehetővé egy decentralizált valuta létrehozását alapvető kriptográfiai eszközök használatával. A főkönyv tartalmazza a történések rekordjait, amelynek meg kell felelnie bizonyos szabályoknak, ami azt irányítja, hogy mit tehet meg és mit nem tehet meg valaki a főkönyv módosításához. Például egy Bitcoin cím nem költhet el több bitcoint, mint amennyit előzőleg megkapott. Ezek a szabályok támasztják alá az összes Bitcoin tranzakciót és sok más blokkláncot is. -Amíg az Ethereumnak megvan a saját natív kriptovalutája (Ether), mely ugyanazokat az intuitív szabályokat követi, emellett lehetőséget ad egy másik hathatós funkciónak: [az okosszerződéseknek](/developers/docs/smart-contracts/). Ehhez a bonyolultabb funkcióhoz egy szofisztikáltabb analógia szükségeltetik. Egy elosztott főkönyv helyett az Ethereum egy elosztott [állapot gép](https://wikipedia.org/wiki/Finite-state_machine). Az Ethereum állapota egy nagy adatstruktúra, mely nem csak a számlákat és az egyenlegeket tárolja, de egy _állapot gépet_ is, mely blokkról blokkra változhat egy előre meghatározott szabályrendszer szerint és tetszőleges gépi kódot tud végrehajtani. Az állatot blokkról blokkra történő megváltozásának specifikus szabályait az EVM rögzíti. +Míg az Ethereumnak megvan a saját natív kriptovalutája (Ether), amely ugyanazokat az intuitív szabályokat követi, emellett lehetőséget ad egy másik hathatós funkciónak is: [az okosszerződéseknek](/developers/docs/smart-contracts/). Ehhez a bonyolultabb funkcióhoz egy szofisztikáltabb analógia szükségeltetik. Egy elosztott főkönyv helyett az Ethereum egy elosztott [állapot gép](https://wikipedia.org/wiki/Finite-state_machine). Az Ethereum állapota egy nagy adatstruktúra, mely nem csak a számlákat és az egyenlegeket tárolja, de egy _állapot gépet_ is, mely blokkról blokkra változhat egy előre meghatározott szabályrendszer szerint és tetszőleges gépi kódot tud végrehajtani. Az állatot blokkról blokkra történő megváltozásának specifikus szabályait az EVM rögzíti. ![Egy diagram mely az EVM felépítését mutatja be](./evm.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból @@ -32,7 +32,7 @@ Adott egy régebbi érvényes állapot `(S)` és egy új érvényes tranzakciók ### Állapot {#state} -Az Ethereum kontextusában az állapot egy hatalmas adatstruktúra, melyet úgy hívnak, hogy [módosított Merkle Patricia-fa](https://eth.wiki/en/fundamentals/patricia-tree), mely az összes [számlát](/developers/docs/accounts/) hashekkel köti össze és redukálja egy gyökér hash-é, melyet a blokklánc tárol. +Az Ethereum kontextusában az állapot egy hatalmas adatstruktúra, amelyet úgy hívnak, hogy [módosított Merkle Patricia-fa](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/), amely az összes [számlát](/developers/docs/accounts/) hashekkel köti össze és redukálja egy gyökér hash-é, amelyet a blokklánc tárol. ### Tranzakciók {#transactions} @@ -42,34 +42,38 @@ A szerződés létrehozás egy új szerződéses számla létrehozásával jár, ## EVM Utasítások {#evm-instructions} -Az EVM egy [verem gépként](https://wikipedia.org/wiki/Stack_machine) fut 1024 elemes mélységgel. Minden egyes elem egy 256 bites szó, melyek a maximális kompatibilitásért lettek kiválasztva az SHA-3-256 hash rendszerrel. +Az EVM egy [veremgépként](https://wikipedia.org/wiki/Stack_machine) fut 1024 elemes mélységgel. Mindegyik tétel egy 256 bites szó, amelyet a 256 bitet kriptográfia használata miatt választottak (mint amilyen a Keccak-256 hash-e vagy secp256k1 aláírások). -A végrehajtás alatt az EVM egy tranziens _memóriát_ tart fenn (mint egy szócímzett bájttömböt), mely nem folytatólagos a tranzakciók között. +A végrehajtás alatt az EVM egy tranziens _memóriát_ tart fenn (mint egy szócímzett bájttömböt), amely nem folytatólagos a tranzakciók között. -A szerződések azonban tartalmaznak egy Merkle Patricia _tárhely_ fát (mint egy szócímezhető szó tömböt), mely hozzá van rendelve a kérdéses számlához és része a globális állapotnak. +A szerződések azonban tartalmaznak egy Merkle Patricia _tároló_ fát (mint egy szócímezhető szótömböt), amely hozzá van rendelve a kérdéses számlához és része a globális státusznak. -A befordított okosszerződés bájtkód EVM [opcode-ként](https://www.ethervm.io/) fut le, melyek standard stack műveletek, mint a `XOR`, `AND`, `ADD`, `SUB`, stb. Az EVM egy pár blokklánc specifikus stack műveletet is implementál, mint az `ADDRESS`, `BALANCE`, `SHA3`, `BLOCKHASH`, stb. +A befordított okosszerződés bájtkódja EVM-[opcode-ként](/developers/docs/evm/opcodes) fut le, amely standard stack művelet, mint a `XOR`, `AND`, `ADD`, `SUB` stb. Az EVM egy pár blokklánc-specifikus stack-műveletet is implementál, mint az `ADDRESS`, `BALANCE`, `BLOCKHASH` stb. -![Egy diagram, mely azt mutatja, hogy hol van szükség gázra az EVM műveleteknél](../gas/gas.png) _Diagramok átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból +![Egy diagram, amely azt mutatja, hogy hol van szükség gázra az EVM-műveleteknél](../gas/gas.png) _Diagramok átvéve az [Illusztrált Ethereum EVM](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból ## EVM Implementációk {#evm-implementations} -Az összes EVM implementációnak meg kell felelnie az Ethereum sárgakönyvben megfogalmazott specifikációnak. +Az összes EVM-implementációnak meg kell felelnie az Ethereum sárgakönyvben megfogalmazott specifikációnak. -Az Ethereum 5 éves története alatt az EVM több revízió alatt átesett és számos EVM implementáció létezik különböző programozási nyelveken. +Az Ethereum kilenc éves története alatt az EVM több revízión átesett és számos EVM-implementáció létezik különböző programozási nyelveken. -Az összes [Ethereum kliens](/developers/docs/nodes-and-clients/#execution-clients) tartalmaz egy EVM implementációt. Továbbá több önálló implementáció létezik, többek között: +Az [Ethereum végrehajtási kliensek](/developers/docs/nodes-and-clients/#execution-clients) tartalmaznak egy EVM-implementációt. Továbbá több önálló implementáció létezik, ilyen például: - [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_ - [eEVM](https://github.com/microsoft/eevm) - _C++_ +- [revm](https://github.com/bluealloy/revm) - _Rust_ ## További olvasnivaló {#further-reading} -- [Ethereum Sárgakönyv](https://ethereum.github.io/yellowpaper/paper.pdf). +- [Ethereum sárga könyv](https://ethereum.github.io/yellowpaper/paper.pdf) +- [Jello könyv, vagyis a KEVM: az EVM szemantikái K-ban](https://jellopaper.org/) - [The Beigepaper](https://github.com/chronaeon/beigepaper) - [Ethereum Virtuális Gép Opcode-ok](https://www.ethervm.io/) +- [Ethereum Virtuális Gép operációskódjainak interaktív referenciája](https://www.evm.codes/) +- [Rövid bevezetés a Solidity dokumentációjába](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) ## Kapcsolódó témák {#related-topics} diff --git a/public/content/translations/hu/developers/docs/evm/opcodes/index.md b/public/content/translations/hu/developers/docs/evm/opcodes/index.md new file mode 100644 index 00000000000..ab216ed7234 --- /dev/null +++ b/public/content/translations/hu/developers/docs/evm/opcodes/index.md @@ -0,0 +1,170 @@ +--- +title: Az EVM operációs kódjai +description: Az Ethereum Virtuális Gép összes elérhető operációs kódja. +lang: hu +--- + +## Áttekintés {#overview} + +Ez az EVM referenciaoldalának [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes) frissített változata. A [Sárga könyvből](https://ethereum.github.io/yellowpaper/paper.pdf), a [Jello könyvből](https://jellopaper.org/evm/) és a [geth](https://github.com/ethereum/go-ethereum) implementációból származik. Ez egy mindenki számára elérhető referencia, de nem feltétlen szigorú. Ha biztosra szeretne menni, akkor használja a Jello könyvet vagy egy kliens implementációját. + +Interaktív referenciát keres? Tekintse meg az [evm.codes](https://www.evm.codes/) oldalt. + +A dinamikus gázköltséggel működő műveletekhez nézze meg a következőt: [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md). + +Tipp: a teljes sorokhoz használja a `[shift] + scroll` funkciót, hogy vízszintesen tudjon mozogni. + +| Stack | Név | Gáz | Kezdő stack | Eredmény stack | Memória / Tárhely | Megjegyzések | +|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 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` | | address of miner of current 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-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-5E | _invalid_ | | | | | | +| 5F | PUSH0 | 2 | `.` | `uint8` | | az állandó 0 érték áttolása a stackre | +| 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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | LOG1(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` | `.` | | | destroy contract and sends all funds to `addr` | diff --git a/public/content/translations/hu/developers/docs/frameworks/index.md b/public/content/translations/hu/developers/docs/frameworks/index.md index 53532d0dc26..d5d41424dfd 100644 --- a/public/content/translations/hu/developers/docs/frameworks/index.md +++ b/public/content/translations/hu/developers/docs/frameworks/index.md @@ -18,61 +18,98 @@ A keretrendszerek olyan dobozon-kívüli funkciókat kínálnak, melyekkel: ## Előfeltételek {#prerequisites} -Mielőtt elmerülnél a keretrendszerekben, javasoljuk, hogy olvasd át a bevezetés a [dappokba](/developers/docs/dapps/) és a [Ethereum stack](/developers/docs/ethereum-stack/) cikkeket. +Mielőtt elmerülne a keretrendszerekben, javasoljuk, hogy olvassa át a bevezetés a [dappokba](/developers/docs/dapps/) és a [Ethereum stack](/developers/docs/ethereum-stack/) cikkeket. ## Elérhető keretrendszerek {#available-frameworks} -**Truffle -** **_Egy fejlesztői környezet, testing keretrendszer, build pipeline, és további eszközök tartoznak bele._** +**Foundry** – **_A Foundry egy gyors, hordozható és moduláris eszközrendszer az Ethereum alkalmazásfejlesztésre._** -- [trufflesuite.com](https://www.trufflesuite.com/) -- [GitHub](https://github.com/trufflesuite/truffle) - -**Epirus -** **_Egy platform blokklánc alkalmazások fejlesztésére, telepítésére és monitorozására a JVM-en_** - -- [Honlap](https://www.web3labs.com/epirus) -- [Dokumentáció](https://docs.epirus.io) -- [GitHub](https://github.com/epirus-io/epirus-cli) +- [Foundry telepítése](https://book.getfoundry.sh/) +- [Foundry könyv](https://book.getfoundry.sh/) +- [Foundry közösségi csevegés Telegramon](https://t.me/foundry_support) +- [Lenyűgöző Foundry](https://github.com/crisgarner/awesome-foundry) -**Hardhat -** **_Ethereum fejlesztői környezet profiknak_** +**Hardhat -** **_Ethereum fejlesztői környezet profiknak._** - [hardhat.org](https://hardhat.org) - [GitHub](https://github.com/nomiclabs/hardhat) -**OpenZeppelin SDK -** **_The Ultimate Smart Contract Toolkit: Egy eszköztár okosszerződések fejlesztéséhez, összeállításához, továbbfejlesztéséhez, telepítéséhez és az okosszerződésekkel való interakciókhoz._** +**Ape -** **_Az okosszerződés-fejlesztői eszköz a pythonisták, adattudósok és biztonsági szakértők számára._** -- [OpenZeppelin SDK](https://openzeppelin.com/sdk/) -- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) -- [Közösségi Fórum](https://forum.openzeppelin.com/c/support/17) +- [Dokumentáció](https://docs.apeworx.io/ape/stable/) +- [GitHub](https://github.com/ApeWorX/ape) -**Brownie -** **_Python alapú fejlesztői környezet és testing keretrendszer._** +**Web3j -** **_Platform a blokklánc alkalmazások fejlesztésére a JVM-n._** -- [Dokumentáció](https://eth-brownie.readthedocs.io/en/latest/) -- [GitHub](https://github.com/eth-brownie/brownie) +- [Honlap](https://www.web3labs.com/web3j-sdk) +- [Dokumentáció](https://docs.web3j.io) +- [GitHub](https://github.com/web3j/web3j) -**Create Eth App -** **_Készíts Ethereum alapú appokat egy paranccsal. UI keretek és DeFi sablonok széles választékával rendelkezik, amelyek közül választhatsz._** +**Create Eth App -** **_Készítsen Ethereum-alapú appokat egy paranccsal. UI-keretrendszerek és DeFi-sablonok széles választék._** - [GitHub](https://github.com/paulrberg/create-eth-app) - [Sablonok](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates) -**scaffold-eth -** **_Hardhat + Create Eth App: minden, amire szükséged van, hogy elkezdj okosszerződések által működtetett decentralizált alkalmazásokat fejleszteni._** +**Scaffold-Eth -** **_Ethers.js + Hardhat + React komponensek és hook-ok web3-hoz: minden, amire szükség van, hogy el tudjon kezdeni okosszerződések által működtetett decentralizált alkalmazásokat fejleszteni._** - [GitHub](https://github.com/austintgriffith/scaffold-eth) -**The Graph -** **_Blokklánc adatok hatékony lekérdezése a The Graph-fal_** +**Tenderly -** **_Web3 fejlesztői platform, amely lehetővé teszi a blokklánc-fejlesztőknek, hogy okosszerződéseket építsenek, teszteljenek, debuggoljanak, felügyeljenek és üzemeltessenek, illetve fejlesszék a dapp UX-t._** + +- [Honlap](https://tenderly.co/) +- [Dokumentáció](https://docs.tenderly.co/ethereum-development-practices) + +**The Graph -** **_Blokkláncadatok hatékony lekérdezése a The Graph segítségével._** - [Honlap](https://thegraph.com/) - [Útmutató](/developers/tutorials/the-graph-fixing-web3-data-querying/) **Alchemy -** **_Ethereum Fejlesztési Platform._** -- [alchemyapi.io](https://alchemyapi.io/) +- [alchemy.com](https://www.alchemy.com/) - [GitHub](https://github.com/alchemyplatform) -- [Discord](https://discord.gg/kwqVnrA) +- [Discord](https://discord.com/invite/A39JVCM) + +**NodeReal -** **_Ethereum fejlesztői platform._** + +- [Nodereal.io](https://nodereal.io/) +- [GitHub](https://github.com/node-real) +- [Discord](https://discord.gg/V5k5gsuE) + +**thirdweb SDK -** **_Építsen web3 alkalmazásokat, amelyek interakcióba lépnek az okosszerződésével az erőteljes SDK-kat és CLI-t használva._** + +- [Dokumentáció](https://portal.thirdweb.com/sdk/) +- [GitHub](https://github.com/thirdweb-dev/) + +**Chainstack -** **_Web3 (Ethereum és egyéb) fejlesztői platform._** + +- [chainstack.com](https://www.chainstack.com/) +- [GitHub](https://github.com/chainstack) +- [Discord](https://discord.gg/BSb5zfp9AT) + +**Brownie -** **_Python-alapú fejlesztői környezet és tesztelési keretrendszer._** + +- [Dokumentáció](https://eth-brownie.readthedocs.io/en/latest/) +- [GitHub](https://github.com/eth-brownie/brownie) +- **A Brownie karbantartása jelenleg szünetel** + +**Truffle -** **_Fejlesztői környezet, tesztelési keretrendszer, folyamatépítő és további eszközök._** + +- [trufflesuite.com](https://www.trufflesuite.com/) +- [GitHub](https://github.com/trufflesuite/truffle) +- **A Truffle fejlesztése befejeződött** – [további információk](https://twitter.com/trufflesuite/status/1704946902393860589?t=NlIWeLTbBSAaJmS5uUAhSA&s=19) + +**OpenZeppelin SDK -** **_The Ultimate Smart Contract Toolkit: egy eszköztár okosszerződések fejlesztéséhez, összeállításához, továbbfejlesztéséhez, telepítéséhez és az okosszerződésekkel való interakciókhoz._** + +- [OpenZeppelin SDK](https://openzeppelin.com/sdk/) +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) +- [Közösségi Fórum](https://forum.openzeppelin.com/c/support/17) +- **Az OpenZeppelin SDK fejlesztése befejeződött** ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} -- [Állíts fel egy helyi fejlesztői környezetet](/developers/local-environment/) +- [Helyi fejlesztői környezet felállítása](/developers/local-environment/) diff --git a/public/content/translations/hu/developers/docs/gas/index.md b/public/content/translations/hu/developers/docs/gas/index.md index 5aef192db85..e498b023069 100644 --- a/public/content/translations/hu/developers/docs/gas/index.md +++ b/public/content/translations/hu/developers/docs/gas/index.md @@ -2,49 +2,154 @@ title: Gáz és tranzakciós díjak description: lang: hu -incomplete: true -isOutdated: true --- Az gáz (Gas) nélkülözhetetlen az Ethereum hálózaton. Ez az üzemanyag, amitől működik, ahogyan az autóknak is szükségük van benzinre, hogy menjenek. ## Előfeltételek {#prerequisites} -Hogy jobban megértsd ezt az oldalt, javasoljuk, hogy előbb olvasd el a [tranzakciókról](/developers/docs/transactions/) és az [EVM-ről](/developers/docs/evm/) szóló oldalakat. +Hogy jobban megértse ezt az oldalt, javasoljuk, hogy olvassa el a [tranzakciókról](/developers/docs/transactions/) és az [EVM-ről](/developers/docs/evm/) szóló oldalakat. ## Mi az a gáz? {#what-is-gas} A gáz a számítási erőfeszítés mértékegységét jelenti, mely bizonyos műveletek végrehajtásához szükséges az Ethereum hálózaton. -Mivel minden egyes utalás az Ethereum hálózaton számítási erőforrást igényel, minden tranzakciónak van egy díja. A gáz a tranzakciós díj, ami szükséges a tranzakció sikeres lebonyolításához. +Mivel az Ethereum-tranzakciók számítási kapacitást igényelnek a végrehajtáshoz, ezeket ki kell fizetni, hogy a hálózat ne legyen sebezhető a szemeteléssel vagy a végtelen ciklusokat indító logikákkal szemben. A számításokért gázdíj formájában kell fizetni. -![Egy diagram, mely azt mutatja, hogy hol van szükség gázra az EVM műveleteknél](./gas.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból +A gázdíj **a művelet végrehajtásához szükséges gáz mennyisége, szorozva a gázegység költségével**. A díjat a tranzakció sikerességétől függetlenül is ki kell fizetni. -Lényegében a gáz díjakat az Ethereum natív valutájában, Etherben (ETH) lehet kifizetni. A gáz árak Gwei-ben vannak feltüntetve, mely az ETH-nek egy egysége - minden Gwei 0.000000001 ETH-tel egyenlő (10-9 ETH). Például ahelyett, hogy azt mondanánk, hogy a gáz 0.000000001 Ether-be kerül, azt mondjuk, hogy a gáz ára 1 Gwei. +![Egy diagram, amely azt mutatja, hogy hol van szükség gázra az EVM-műveleteknél](./gas.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból -Az alábbi videó jó áttekintés ad, hogy miért van szükségünk a gázra: +A gázdíjakat az Ethereum saját valutájában, etherben (ETH) kell kifizetni. A gázdíjakat általában gwei-ben adják meg, ami az ETH címlete. Egy gwei az ETH egymilliárdnyi részével (0,000000001 ETH vagy 10-9 ETH) egyenlő. - +Például ahelyett, hogy azt mondanánk, hogy a gáz 0,000000001 ether-be kerül, azt mondjuk, hogy a gáz ára 1 gwei. -## Miért létezik az gáz? {#why-do-gas-fees-exist} +A gwei a giga-wei-ből ered, ami milliárd weit jelent. Egy gwei az egy milliárd wei. A wei (amit [Wei Dai](https://wikipedia.org/wiki/Wei_Dai) után neveztek el, aki a [b-pénz feltalálója](https://www.investopedia.com/terms/b/bmoney.asp)) az ETH legkisebb egysége. -Röviden, a gáz tartja biztonságban az Ethereum hálózatot. Azzal, hogy minden hálózaton végrehajtott számítás egy díjat von maga után, megelőzzük, hogy ártó személyek túlterheljék a hálózatot. Azért, hogy megelőzzük a véletlen vagy ártó szándékú végtelen ciklusokat vagy más számítási pazarlással járó kódot, minden egyes tranzakciónak be kell állítani egy határt, hogy mennyi számítási lépést hajthat végre a kódlefutás. A számítás alap mértékegysége a "gáz". +## Hogyan kerül kiszámításra a gázdíj? {#how-are-gas-fees-calculated} -Annak ellenére, hogy a tranzakciós díjak limitálva vannak, a nem felhasznált üzemanyag visszajut az utaló félhez. +Amikor a felhasználó egy tranzakciót indít, akkor ki tudja választani, hogy mennyi gázdíjat hajlandó fizetni a végrehajtásért. Bizonyos gázmennyiség felajánlásával ajánlatot tesz, hogy az adott tranzakció bekerüljön a következő blokkba. Ha túl kicsi az összeg, akkor a validátorok kisebb valószínűséggel kapják fel a tranzakciót, így az később vagy esetleg egyáltalán nem kerül feldolgozásra. Ha túl sokat ajánl valaki, akkor talán elveszíti az ETH-összeg egy részét. Hogyan érdemes meghatározni a fizetendő díjat? -![Egy diagram, mely a fel nem használt gáz visszatérítését ábrázolja](../transactions/gas-tx.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból +A teljes gázdíj két komponensből áll: az `alapdíj` és az `elsőbbségi díj` (borravaló). -## További olvasnivaló {#further-reading} +Az `alapdíjat` a protokoll állapítja meg – ahhoz, hogy a tranzakció érvényes legyen, legalább ennyit ki kell érte fizetni. Az `elsőbbségi díj` egy borravaló az alapdíjon felül, amely miatt a tranzakció vonzóvá válhat a validátorok szemében, ezért felveszik azt a következő blokkba. + +Az a tranzakció, amely csak az `alapdíjat` fizeti meg, technikailag érvényes, de kevéssé valószínű, hogy bekerül, mert nem jelent motivációt a validátoroknak, hogy egy másik tranzakció helyett ezt válasszák. A „megfelelő” `elsőbbségi díjat` a hálózat használata határozza meg abban az időpontban, amikor a felhasználó a tranzakciót elküldi – ha nagy a kereslet, akkor magasabb `elsőbbségi díjat` kell fizetni, kisebb keresletnél pedig kevesebb is elég lehet. + +Például Jordannek ki kell fizetnie 1 ETH-t Taylornak. Az ETH transzferhez 21 000 egységnyi gázra van szükség, az alapdíj pedig 10 gwei. Jordan 2 gwei borravalót ad hozzá. + +A teljes díj így néz ki: + +`a felhasznált gáz mennyisége * (alapdíj + elsőbbségi díj)` + +ahol az `alapdíjat` a protokoll határozza meg, az `elsőbbségi díjat` pedig a felhasználó adja, hogy a validátort díjazza. + +pl. `21 000 * (10 + 2) = 252 000 gwei` (0,000252 ETH). + +Amikor Jordan elküldi a pénzt, akkor a számlájáról 1,000252 ETH-t fognak levonni. Taylornak pedig jóváírnak 1,0000 ETH-t. A validátor megkapja 0,000042 ETH borravalót. A 0,00021 ETH `alapdíjat` elégetik. + +### Alapdíj {#base-fee} + +Minden blokk rendelkezik alapdíjjal, ami egyfajta foglalási díjként működik. A blokkba csak úgy lehet bekerülni, hogy a gázért felajánlott ár eléri az alapdíjat. Az alapdíj az aktuális blokktól függetlenül kerül kiszámításra, inkább az előző blokk határozza meg, hogy a tranzakciós illeték kiszámíthatóbb legyen a felhasználók számára. Amikor a blokk létrejön, akkor ez az **alapdíj „elég”**, vagyis kivonják a körforgásból. + +Az alapdíj egy olyan képlettel kerül kiszámításra, amely összeveti az előző blokk méretét (a benne lévő tranzakciók által felhasznált gáz mennyisége) a célmérettel. Ha a blokk meghaladja a célméretet, akkor az alapdíj legfeljebb 12,5%-kal emelkedik blokkonként. Ez az exponenciális növekedés gazdasági szempontból eléri, hogy a blokkméret ne maradhasson ilyen nagy a végtelenségig. + +| Blokkszám | Benne lévő gáz | Díjnövekedés | Jelenlegi alapdíj | +| --------- | --------------:| ------------:| -----------------:| +| 1 | 15M | 0% | 100 gwei | +| 2 | 30M | 0% | 100 gwei | +| 3 | 30M | 12,5% | 112,5 gwei | +| 4 | 30M | 12,5% | 126,6 gwei | +| 5 | 30M | 12,5% | 142,4 gwei | +| 6 | 30M | 12,5% | 160,2 gwei | +| 7 | 30M | 12,5% | 180,2 gwei | +| 8 | 30M | 12,5% | 202,7 gwei | + +A táblázatot folytatva a 9. blokkba kerülő tranzakcióra a tárca megadja a felhasználónak, hogy a **maximális alapdíj**, amivel bekerülhet a következő blokkba, az `a jelenlegi alapdíj * 112,5%` vagy `202,7 gwei * 112,5% = 228,1 gwei`. + +Fontos megjegyezni, hogy nem valószínű, hogy egymás után sok teljes blokk készül, mert az alapdíj gyorsan növekszik a teljes blokk előtt. + +| Blokkszám | Benne lévő gáz | Díjnövekedés | Jelenlegi alapdíj | +| --------- | --------------:| ------------:| -----------------:| +| 30 | 30M | 12,5% | 2705,6 gwei | +| ... | ... | 12,5% | ... | +| 50 | 30M | 12,5% | 28 531,3 gwei | +| ... | ... | 12,5% | ... | +| 100 | 30M | 12,5% | 10 302 608,6 gwei | + +### Elsőbbségi díj (borravaló) {#priority-fee} + +Az elsőbbségi díj (borravaló) motiválja a validátorokat, hogy bevegyék a tranzakciót a blokkba. A borravaló nélkül a validátoroknak gazdaságilag ugyanolyan értékű, ha üresen marad a blokk, mint ha felvesznek bele tranzakciókat, mert a blokkért megkapják a díjazásukat. A kis értékű borravaló egy minimális ösztönzést ad a validátoroknak, hogy felvegyenek egy tranzakciót. Azokért a tételekért, amelyeket ugyanabban a blokkban, de a többi tétel előtt szeretnénk végrehajtatni, magasabb borravalót érdemes fizetni, hogy lekörözze a többi tranzakció ajánlatát. + +### Maximális díj {#maxfee} + +Ahhoz, hogy a hálózaton végre legyen hajtva egy tranzakció, a felhasználók meghatározhatnak egy maximális határt, amit még hajlandók kifizetni érte. Ennek az opcionális paraméternek a neve `maxFeePerGas`. A tranzakció végrehajtásához a maximális díjnak meg kell haladnia az alapdíj és a borravaló összegét. A tranzakció küldője visszakapja azt a különbözetet, ami a maximális díj, valamint az alapdíj és a borravaló összege között van. + +### Blokkméret {#block-size} + +Minden blokk 15 millió gáz célmérettel rendelkezik, de a blokk mérete a hálózati kereslet függvényében, egészen a 30 millió gáz határig (amely a célméret kétszerese) változik. A protokoll úgy éri el az egyensúlyi, átlagos 15 milliós blokkméretet, hogy a _tâtonnement_, vagyis a közelítés módszerét alkalmazza. Tehát, ha a blokkméret meghaladja a célértéket, akkor a protokoll megnöveli az alapdíjat a következő blokknál. Ugyanígy csökkenti az alapdíjat, ha a blokkméret kisebb, mint a célérték. Az alapdíj mértéke arányosan változik annak függvényében, hogy a jelenlegi blokkméret hogyan viszonyul a célmérethez. [Bővebben a blokkokról](/developers/docs/blocks/). + +### A gázdíjak kiszámítása a gyakorlatban {#calculating-fees-in-practice} + +A felhasználó egyértelműen kijelentheti, hogy mennyit hajlandó fizetni azért, hogy a tranzakciót végrehajtsák. Emellett a legtöbb tárcaszolgáltató automatikusan beállít egy javasolt tranzakciós illetéket (alapdíj + a javasolt elsőbbségi díj), hogy csökkentse a használat komplexitását. -- [Ethereum gáz, blokkok és a tranzakciós díjpiac megértése](https://medium.com/@eric.conner/understanding-ethereum-gas-blocks-and-the-fee-market-d5e268bf0a0e) -- [Ethereum gáz oktató anyag](https://defiprime.com/gas) +## Miért léteznek a gázdíjak? {#why-do-gas-fees-exist} + +Röviden, a gázdíjak tartják fenn a Ethereum hálózat biztonságát. Azzal, hogy a hálózaton végrehajtott minden számítás egy díjat von maga után, megelőzzük, hogy rosszhiszemű személyek túlterheljék a hálózatot. Azért, hogy megelőzzük a véletlen vagy ártó szándékú végtelen ciklusokat vagy más számítási pazarlással járó kódot, minden egyes tranzakciónak be kell állítani egy határt, hogy mennyi számítási lépést hajthat végre a kód futtatása. A számítás alapmértékegysége a „gáz”. + +Habár a tranzakció tartalmaz egy határt, a fel nem használt gázdíj visszakerül a felhasználóhoz. Például a `maximális díj – (alapdíj + borravaló)` visszatérítésre kerül. + +![Egy diagram, amely a fel nem használt gáz visszatérítését ábrázolja](../transactions/gas-tx.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból + +## Mit jelent a gázkorlátozás? {#what-is-gas-limit} + +A gázkorlátozás arra utal, hogy egy tranzakció során legfeljebb mennyi gázra lesz szükség. A bonyolultabb tranzakciók, mint az [okosszerződések](/developers/docs/smart-contracts/), több számítási kapacitást igényelnek, ezért magasabb gázkorlátozásra van szükségük, mint egy egyszerű átutalásnál. Egy általános ETH-transzfer 21 000 egységi gázkorlátozást igényel. + +Például, ha egy egyszerű ETH transzferre azt állítjuk be, hogy a gázkorlátozás 50 000 legyen, az EVM felhasznál 21 000-et, a felhasználó pedig visszakapja a maradék 29 000-et. Ha viszont túl kevés gázt határozunk meg, például a gázkorlátozás 20 000 lesz egy egyszerű ETH transzferhez, akkor az EVM elfogyasztja a 20 000 egységet, és megpróbálja végrehajtani a tranzakciót, de nem tudja azt teljesíteni. Ekkor az EVM visszaforgatja a változtatásokat, de mivel a validátor már elvégzett 20 000 gáz mennyiségű munkát, ezért ez el lett fogyasztva. + +## Miért lehetnek olyan magasak a gázdíjak? {#why-can-gas-fees-get-so-high} + +A magas gázdíjak oka az Ethereum népszerűsége. Amikor nagy a kereslet, akkor a felhasználóknak magasabb borravalót kell ajánlaniuk, hogy lekörözzék a többi tranzakciót. A magasabb borravaló miatt az adott tranzakció valószínűleg bekerül a következő blokkba. Emellett a sokkal összetettebb okosszerződéses alkalmazások sok műveletet végezhetnek funkcióik támogatása érdekében, amivel sok gázt fogyasztanak el. + +## Kezdeményezések a gázköltségek csökkentésére {#initiatives-to-reduce-gas-costs} + +Az Ethereum [skálázhatósági fejlesztései](/roadmap/) meg fogják oldani a gázdíjak körüli problémák egy részét, így lehetővé teszik, hogy a platform ezernyi tranzakciót dolgozzon fel másodpercenként és globálisan skálázható legyen. + +A második blokkláncréteggel (L2) kialakított skálázás a fő kezdeményezés arra, hogy nagy mértékben javuljanak a gázköltségek, a felhasználói élmény és a skálázhatóság. [Bővebben az L2 skálázásról](/developers/docs/scaling/#layer-2-scaling). + +## Mi volt a London-frissítés (EIP-1559) lényege? {#what-was-the-london-upgrade-eip-1559} + +A London-frissítés előtt az Ethereum fix méretű blokkokkal működött. A magas hálózati kereslet idején ezek a blokkok teljes kapacitással működtek. Ennek eredményeképp a felhasználóknak sokszor várni kellett a kereslet csökkenésére, hogy bekerülhessenek egy blokkba, ami rontott a felhasználói élményen. A London-frissítés bevezette a változó méretű blokkokat az Ethereumon. + +A tranzakciós díjak számításának módja 2021. augusztusában megváltozott [a London-frissítéssel](/history/#london) az Ethereum hálózatán. A London Upgrade előtt a díjakat úgy kalkulálták, hogy elkülönítették az `alapdíjat` és az `elsőbbségi díjat`: + +Tegyük fel, hogy Alice-nek fizetnie kell Bobnak 1 ETH-t. A tranzakcióban a gázkorlátozás 21 000 egység, a gázdíj pedig 200 gwei. + +A teljes díj: `gáz mennyisége (határ) * egységenkénti gázdíj `, vagyis `21 000 * 200 = 4 200 000 gwei` vagy 0,0042 ETH + +Az [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) bevezetése a London-frissítés során bonyolultabbá tette a tranzakciós illetékek működését, de megjósolhatóbb lett a gázdíj, ami egy sokkal hatékonyabb tranzakciósilleték-piacot eredményezett. A felhasználók megadhatják a `maxFeePerGas` értékét, vagyis azt, hogy legfeljebb mennyit hajlandók fizetni a tranzakció végrehajtásáért, annak tudatában, hogy nem fognak többet fizetni érte, mint a gáz piaci ára (`baseFeePerGas`), és a borravalót leszámítva visszakapják a különbözetet. + +Az alábbi videó elmagyarázza az EIP-1559 lényegét és előnyeit: + + + +## A gázdíjak felügyelete {#moitoring-gas-fees} + +Ha Ön szeretné felügyelni a gázdíjakat azért, hogy kevesebbet kelljen fizetnie az ETH-tranzakciókért, akkor számos eszköz áll rendelkezésre: + +- [Etherscan](https://etherscan.io/gastracker) _ Tranzakció gázdíjának becslése_ +- [Blocknative ETH gázbecslés](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _Gázbecslő Chrome-kiterjesztés, amely támogatja az eredeti (0. típusú) és az EIP-1559 (2. típusú) tranzakciókat._ +- [Cryptoneur gázdíjkalkulátor](https://www.cryptoneur.xyz/gas-fees-calculator) _Számolja ki a gázdíjat a saját pénznemében a különféle tranzakciókra az Ethereum főhálózatán, az Arbitrumon és a Polygonon._ ## Kapcsolódó eszközök {#related-tools} -- [ETH üzemanyag állomás](https://ethgasstation.info/) _Vevő orientált metrikák az Ethereum gáz piacáról_ -- [Etherscan gáz követő felület](https://etherscan.io/gastracker) _Tranzakciós díj becslés_ -- [Bloxy gáz analitikája](https://stat.bloxy.info/superset/dashboard/gas/?standalone=true) _Ethereum gáz statisztikák_ +- [Blocknative gázplatform](https://www.blocknative.com/gas) _Gázbecslő API, amelyet a Blocknative globális memóriakészlet adatplatformja támogat_ -## Kapcsolódó témák {#related-topics} +## További olvasnivaló {#further-reading} -- [Bányászat](/developers/docs/consensus-mechanisms/pow/mining/) +- [Az Ethereum gázdíjról részletesen](https://defiprime.com/gas) +- [Csökkentse az okosszerződésének gázfogyasztását](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) +- [A proof-of-stake és a proof-of-work összehasonlítása](https://blockgeeks.com/guides/proof-of-work-vs-proof-of-stake/) +- [Gázoptimalizáló stratégiák fejlesztők számára](https://www.alchemy.com/overviews/solidity-gas-optimization) +- [EIP-1559-dokumentumok](https://eips.ethereum.org/EIPS/eip-1559). +- [Tim Beiko EIP-1559 anyagai](https://hackmd.io/@timbeiko/1559-resources). diff --git a/public/content/translations/hu/developers/docs/ides/index.md b/public/content/translations/hu/developers/docs/ides/index.md index 036d9735fa8..c9cef844805 100644 --- a/public/content/translations/hu/developers/docs/ides/index.md +++ b/public/content/translations/hu/developers/docs/ides/index.md @@ -4,38 +4,68 @@ description: lang: hu --- -Amikor egy [integrált fejlesztői környezet (IDE)](https://wikipedia.org/wiki/Integrated_development_environment) felállításáról van szó, az Ethereumon történő fejlesztés hasonló bármely más szoftver projekthez. Sok lehetőség közül lehet választani, így végül válaszd azt, mely a legjobban megfelel a preferenciáidnak. +Amikor egy [integrált fejlesztői környezet (IDE)](https://wikipedia.org/wiki/Integrated_development_environment) felállításáról van szó, az Ethereumon történő fejlesztés hasonló bármely más szoftveres projekthez. Sok lehetőség közül lehet választani, ezért azt az IDE-t vagy kódszerkesztőt válassza, amely a legjobban megfelel a preferenciáinak. Nagy valószínűséggel a legjobb IDE az Ethereum fejlesztéséhez éppen az, amit a hagyományos szoftverfejlesztéshez is használ. ## Web alapú IDE-k {#web-based-ides} Ha szeretnél eljátszadozni a kóddal, mielőtt [felállítanál egy helyi fejlesztői környezetet](/developers/local-environment/), ezek a webes alkalmazások egyénre szabottak az Ethereum okosszerződések fejlesztésére. -**Remix -** **_Web alapú IDE beépített statikus analízissel, és egy teszt blokklánc virtuális géppel._** +**[Remix](https://remix.ethereum.org/)** – **_Webalapú IDE beépített statikus analízissel, és egy teszt blokklánc virtuális géppel._** -- [remix.ethereum.org](https://remix.ethereum.org/) +- [Dokumentáció](https://remix-ide.readthedocs.io/en/latest/#) +- [Gitter](https://gitter.im/ethereum/remix) -**EthFiddle -** **_Web alapú IDE, amivel megírhatod, összeállíthatod és debuggolhatod az okosszerződéseidet._** +**[ChainIDE](https://chainide.com/)** – **_Egy felhőalapú, többláncos IDE_** + +- [Dokumentáció](https://chainide.gitbook.io/chainide-english-1/) +- [Súgófórum](https://forum.chainide.com/) + +**[Replit (Solidity Starter – Beta)](https://replit.com/@replit/Solidity-starter-beta)** – **_Testre szabható fejlesztői környezet az Ethereum számára, gyors újratöltéssel, hibaellenőrzéssel és első osztályú testnet-támogatással_** + +- [Dokumentáció](https://docs.replit.com/) + +**[Tenderly Sandbox](https://sandbox.tenderly.co/)** – **_Gyors prototípus-készítő környezet, ahol okosszerződéseket tud írni, elindítani és debuggolni a böngészőben Solidity-t és JavaScriptet használva_** + +**[EthFiddle](https://ethfiddle.com/)** – **_Webalapú IDE, amivel megírhatja, összeállíthatja és debuggolhatja okosszerződéseit_** -- [ethfiddle.com](https://ethfiddle.com/) - [Gitter](https://gitter.im/loomnetwork/ethfiddle) ## Asztali IDE-k {#desktop-ides} -A legtöbb megalapozott IDE-nek vannak beépített pluginjai, melyek elősegítik az Ethereum fejlesztői élményt. Legalább egy syntax kijelölést biztosítanak az [okosszerződés nyelveknek](/developers/docs/smart-contracts/languages/). +A legtöbb megalapozott IDE-nek vannak beépített pluginjai, amelyek tovább fokozzák az Ethereum fejlesztői élményt. Legalább egy syntax kijelölést biztosítanak az [okosszerződés nyelveknek](/developers/docs/smart-contracts/languages/). -**Visual Studio Code -** **_Professzionális cross-platform IDE hivatalos Ethereum támogatással._** +**Visual Studio Code -** **_Professzionális keresztplatformos IDE hivatalos Ethereum-támogatással_** - [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) -- [Kód minták](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) +- [Kódminták](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) - [GitHub](https://github.com/microsoft/vscode) -**Atom -** **_Egy hackelhető szövegszerkesztő a 21.-dik századra_** +**Atom -** **_Egy hackelhető szövegszerkesztő a 21. századra_** - [Atom](https://atom.io/) - [GitHub](https://github.com/atom) -- [Ethereum csomagok](https://atom.io/packages/search?utf8=%E2%9C%93&q=keyword%3Aethereum&commit=Search) +- [Ethereum-csomagok](https://atom.io/packages/search?utf8=%E2%9C%93&q=keyword%3Aethereum&commit=Search) + +**JetBrains IDE-k (IntelliJ IDEA, etc.) –** **_Elengedhetetlen eszközök szoftverfejlesztőknek és csapatoknak_** + +- [JetBrains](https://www.jetbrains.com/) +- [GitHub](https://github.com/JetBrains) +- [IntelliJ Solidity](https://github.com/intellij-solidity/intellij-solidity/) + +**Remix Desktop – ** **_Próbálja ki a Remix IDE-t a saját gépén_** + +- [Letöltés](https://github.com/ethereum/remix-desktop/releases) +- [GitHub](https://github.com/ethereum/remix-desktop) + +## Plugin-ok és kiterjesztések {#plugins-extensions} + +- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) – Ethereum Solidity nyelv a Visual Studio-kódhoz +- [Solidity + Hardhat for VS Code](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) – Solidity és Hardhat a Hardhat csapat által támogatva +- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) – Kódformázó használata ## További olvasnivaló {#further-reading} +- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _ – Alchemy listája az Ethereum IDE-okról_ + _Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ diff --git a/public/content/translations/hu/developers/docs/index.md b/public/content/translations/hu/developers/docs/index.md index bf0fe146be2..5b5b808dd9e 100644 --- a/public/content/translations/hu/developers/docs/index.md +++ b/public/content/translations/hu/developers/docs/index.md @@ -1,45 +1,25 @@ --- -title: Ethereum fejlesztési dokumentáció -description: Bevezetés az Ethereum fejlesztési hálózat dokumentációba. +title: Ethereum-fejlesztési dokumentáció +description: Bevezetés az ethereum.org fejlesztői dokumentációjába. lang: hu --- -Ezt a dokumentációt arra tervezték, hogy segítsen az Ethereumon való fejlesztésben. Lefedi az Ethereumot, mint koncepciót, elmagyarázza az Ethereum tech stack-et, és dokumentálja a haladó témákat és a komplexebb alkalmazásokat és használati eseteket. +Ezt a dokumentációt arra tervezték, hogy segítsen az Ethereumon való fejlesztésben. Bemutatja az Ethereumot, mint koncepciót, elmagyarázza az Ethereum tech stacket, és áttekintést nyújt a haladó témákról és a komplexebb alkalmazásokról használati esetek segítségével. -Ez egy nyílt forráskódú közösségi kezdeményezés, vagy nyugodtan javasolhatsz új témákat, hozzáadhatsz új tartalmat és példákat adhatsz meg, ahol úgy érzed, hogy hasznos lehet. Az összes dokumentáció módosítható GitHubon keresztül – ha nem vagy biztos a dolgodban, akkor [kövesd ezeket az instrukciókat](https://github.com/ethereum/ethereum-org-website/blob/dev/README.md). +Ez egy nyílt forráskódú közösségi kezdeményezés, így nyugodtan javasolhat új témákat, hozzáadhat új tartalmat és példákat adhat meg, ahol úgy érzi, hogy hasznos lehet. Az összes dokumentáció szerkeszthető a GitHub-on – csak [kövesse az instrukciókat](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md). ## Fejlesztési modulok {#development-modules} -Ha ez az első próbálkozásod az Ethereum fejlesztéssel kapcsolatban, akkor azt javasoljuk, hogy kezdd el az elején, és olvasd végig, mint egy könyvet. - -### Alapvető témák {#fundamental-topics} - -- [Bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) _– Egy gyors áttekintő az Ethereumról_ -- [Web2 vs Web3](/developers/docs/web2-vs-web3/) _– Az alapvető különbségek, melyeket a blokklánc-alapú alkalmazások nyújtanak_ -- [Bevezetés a dappokba](/developers/docs/dapps/) _– Bevezetés a decentralizált alkalmazásokba_ -- [Az Ethereum Virtuális Gép (EVM)](/developers/docs/evm/) _– Az EVM kezeli az összes számítást az Ethereum hálózaton_ -- [Blokkok](/developers/docs/blocks/) _– A tranzakciók csoportosításának módja, hogy biztosítsuk az állapot szinkronizáltságát az összes szereplő között_ -- [Számlák](/developers/docs/accounts/) _– A hálózati entitások, melyeknek van egy egyenlegük és tranzakciókat tudnak küldeni_ -- [Tranzakciók](/developers/docs/transactions/) _– Átutalások és más akciók, melyek az Ethereum állapotváltozását okozzák_ -- [Blokk felfedezők](/developers/docs/data-and-analytics/block-explorers/) _–Tranzakciókról, blokkokról, számlákról és a hálózatról szóló adatok olvasásának módja_ -- [Gáz](/developers/docs/gas/) _– Számítási kapacitást igényel a tranzakciók feldolgozása, melyet a küldők fizetnek ki ETH-ben_ -- [Bányászat](/developers/docs/consensus-mechanisms/pow/mining/) _– A tranzakciók feldolgozásának és a blokkok létrehozásának módja_ -- [Hálózatok](/developers/docs/networks/) _– Ethereum implementációk beleértve a teszt hálózatokat is_ -- [Csomópontok és kliensek](/developers/docs/nodes-and-clients/) _– A hálózatban résztvevő egyének és a szofvter, melyet a tranzakciók hitelesítéséhez futtatnak_ - -### Az Ethereum stack {#the-ethereum-stack} - -- [Bevezetés a stack-be](/developers/docs/ethereum-stack/) _– Áttekintő az Ethereum/web3 stack-ről_ -- [Okosszerződések](/developers/docs/smart-contracts/) _– Programok, melyek egy Ethereum címen élnek és funkciókat futtatnak, melyeket tranzakciók váltanak ki_ -- [Programozási nyelvek](/developers/docs/programming-languages/) _– Hogyan kezdj az Ethereum fejlesztéshez olyan nyelvekkel, melyeket már ismerhetsz_ -- [JavaScript kliens könyvtárak](/developers/docs/apis/javascript/) _– Kényelmi könyvtárak, melyek lehetővé teszik, hogy a web alkalmazásod interakcióba lépjen az Ethereummal és az okosszerződésekkel_ -- [Biztonság](/developers/docs/smart-contracts/security/) -- [Tárhely](/developers/docs/storage/) -- [Fejlesztői keretrendszerek](/developers/docs/frameworks/) _– Eszközök, melyek egyszerűbbé teszik az Ethereum fejlesztést_ -- [Fejlesztői környezetek](/developers/docs/ides/) _– A legjobb környezetek ahol dapp kódot lehet írni_ +Ha most először fejleszt az Ethereumon, akkor azt javasoljuk, hogy kezdje a legelején, és olvassa végig, mint egy könyvet. + +### Alapvető témák {#foundational-topics} + + + +### Ethereum stack {#ethereum-stack} + + ### Speciális {#advanced} -- [Token szabványok](/developers/docs/standards/tokens/) -- [Orákulumok](/developers/docs/oracles/) -- [Méretezés](/developers/docs/layer-2-scaling/) + diff --git a/public/content/translations/hu/developers/docs/intro-to-ether/index.md b/public/content/translations/hu/developers/docs/intro-to-ether/index.md new file mode 100644 index 00000000000..2d9e3eaf271 --- /dev/null +++ b/public/content/translations/hu/developers/docs/intro-to-ether/index.md @@ -0,0 +1,78 @@ +--- +title: Bevezetés az ether világába +description: Bevezetés fejlesztőknek az ether kriptovalutába. +lang: hu +--- + +## Előfeltételek {#prerequisites} + +Ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvassa el a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) oldalunkat. + +## Mi az a kriptovaluta? {#what-is-a-cryptocurrency} + +A kriptovaluta a csere eszköze, amelyet egy blokkláncalapú főkönyv biztosít. + +A csere eszköze bármi lehet, amit széles körben elfogadnak az áruk és szolgáltatások kifizetésére, a főkönyv pedig egy adattároló, ahol a tranzakciókat követik. A blokklánc-technológia lehetővé teszi a felhasználóknak, hogy tranzakciókat végezzenek a főkönyvön, anélkül hogy egy harmadik félben kellene megbízniuk, aki a főkönyvet kezeli. + +Az első kriptovaluta a Bitcoin volt, amelyet Satoshi Nakamoto hozott létre. A Bitcoin 2009-es elindulása óta az emberek ezernyi kriptovalutát hoztak létre számos különféle blokkláncon. + +## Mi az ether? {#what-is-ether} + +**Ether (ETH)** a kriptovaluta, amelyet számtalan dologra használnak az Ethereum hálózaton. Alapvetően ez az egyetlen elfogadott fizetési eszköz a tranzakciódíjakhoz, és a [Beolvadás](/roadmap/merge) után ether kell ahhoz, hogy blokkot javasoljanak és validáljanak a főhálózaton. Az ether emellett az elsődleges fedezet a [decentralizált pénzügyek (DeFi)](/defi) kölcsönzési piacain, az NFT (nem helyettesíthető token) piactereken könyvelési egység, fizetség a szolgáltatások nyújtásakor vagy termékeladáskor és még sok más esetben. + +Az Ethereum lehetővé teszi a fejlesztők számára, hogy [**decentralizált alkalmazásokat (dapp)**](/developers/docs/dapps) hozzanak létre, amely ugyanazt a számítási kapacitást használja. Ez egy véges kapacitás, ezért az Ethereumnak szüksége van egy olyan mechanizmusra, amellyel megállapítható, hogy ki használja fel azt. Máskülönben egy alkalmazás véletlenül vagy rosszhiszeműen fel tudná használni a hálózat összes erőforrását, így mások nem férnének ahhoz hozzá. + +Az ether kriptovaluta segíti az árazási mechanizmust az Ethereum számítógépes kapacitására vonatkozóan. Amikor a felhasználó tranzakciót akar indítani, ethert kell fizetnie, hogy ez a tranzakció bekerülhessen a blokkláncra. Ezt a felhasználói költséget [gázdíjnak (tranzakciós díj)](/developers/docs/gas/) nevezik, ami pedig attól függ, hogy az adott tranzakció végrehajtásához mennyi kapacitásra van szükség, illetve ugyanabban az időben mennyire van kereslet. + +Ezért még ha egy rosszindulatú dapp egy végtelen körforgást indítana is el, a tranzakció végül kifogyna az etherből és leállna, így a hálózat visszatér a normális állapotba. + +[Gyakori](https://www.reuters.com/article/us-crypto-currencies-lending-insight-idUSKBN25M0GP#:~:text=price%20of%20ethereum) [az, hogy](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845#:~:text=cryptocurrencies%20including%20ethereum) [összekapcsolják](https://www.cnn.com/2021/03/14/tech/nft-art-buying/index.html#:~:text=price%20of%20ethereum) az Ethereumot és az ethert – amikor az emberek az Ethereum árára gondolnak, akkor az ethernek az árát értik rajta. + +## Az ether létrehozása (minting) {#minting-ether} + +A minting az a folyamat, amikor új ethert hoznak létre az Ethereum főkönyvön. A mögöttes Ethereum protokoll kreálja az új ethert, a felhasználók nem tudnak ilyet tenni. + +Az ether minden javasolt blokk jutalmaként keletkezik, illetve minden korszakban azért a validátori tevékenységért jár, ami a konszenzus létrehozását adja. A teljes kiadott összeg függ a validátorok számától, és hogy ők mennyi ethert helyeztek letétbe. Ez a teljes kiadás ideális esetben egyenlően oszlik el a validátorok között az, mivel minden validátor jóhiszemű és online van, de a valóságban változik a validátor teljesítménye alapján. A blokkjavasló a kiadott összeg 1/8-át kapja meg, a többi eloszlik a többi validátor között. A blokkjavasló emellett még borravalót kap a tranzakciós díjból és MEV-hez (maximálisan kinyerhető érték) kapcsolódó bevételt, ez azonban az újrahasznált etherből ered, nem az újból. + +## Az ether elégetése {#burning-ether} + +Ahogy új ether keletkezik a blokkhoz kapcsolódó jutalmak következtében, úgy meg is szűnik, amit elégetésnek nevezünk. Amikor az ethert elégetik, az örökre kivonódik a körforgásból. + +Ez minden tranzakciónál megtörténik az Ethereumon. Amikor a felhasználó fizet a tranzakcióért, akkor az alap gázdíj, amit a kereslet alapján állapít meg a rendszer, megsemmisül. Ez megkönnyíti a tranzakciós illeték becslését az Ethereumon, tekintve, hogy a blokkméretek változóak és van egy maximális gázdíj. Amikor nagy a kereslet a hálózaton, akkor a [blokkok](https://etherscan.io/block/12965263) több ethert égetnek el, mint amennyit létrehoznak, tehát ellentételezik a kibocsátást. + +Az alapdíj elégetése megakadályozza, hogy a blokk-készítők manipulálják a tranzakciókat. Például, ha egy blokk-készítő megkapná az alapdíjat, akkor a saját tranzakcióit ingyen tehetné be, míg a többiek díját megemelné. Alternatívaként vissza lehetne adni az alapdíjat a felhasználóknak láncon kívül, ami egy homályosabb és komplexebb tranzakciósilleték-piachoz vezetne. + +## Az ether címletei {#denominations} + +Mivel számos tranzakció értéke az Ethereumon viszonylag kicsi, ezért az ether számos címlettel bír, amelyek kisebb egységek. Ezekből a wei és a gwei a legfontosabbak. + +Wei a legkisebb címlet, ezért sok technikai bevezetés, mint az [Ethereum Sárga könyv](https://ethereum.github.io/yellowpaper/paper.pdf) minden kalkulációt ebben végez. + +Gwei vagyis giga wei általában a gázdíj meghatározásában jelenik meg az Ethereumon. + +| Címlet | Érték etherben | Gyakori használat | +| ------ | ---------------- | ---------------------------------- | +| Wei | 10-18 | Technikai implementáció | +| Gwei | 10-9 | A felhasználóknak érthető gázdíjak | + +## Az ether küldése {#transferring-ether} + +Az Ethereumon minden tranzakció tartalmaz egy `value` (érték) mezőt, ami az elküldendő ether összegét mutatja wei címletben, hogy a küldő címéről a fogadó címére érkezzen. + +Amikor a fogadó címe egy [okosszerződés](/developers/docs/smart-contracts/), akkor ezt az elküldött ethert a gázdíjak fizetésére is használhatják, amikor az okosszerződés végrehajtja a programkódját. + +[Bővebben a tranzakciókról](/developers/docs/transactions/) + +## Az ether-egyenleg lekérdezése {#querying-ether} + +A felhasználók bármelyik [számla](/developers/docs/accounts/) egyenlegét meg tudják nézni az adott számla `balance` (egyenleg) mezőjében, ami az ott lévő ethert weiben mutatja. + +Az [Etherscan](https://etherscan.io) egy népszerű eszköz arra, hogy egy webalapú alkalmazásban megnézhessék egy adott cím egyenlegét. Például [ez az Etherscan oldal](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae) megmutatja az Ethereum Alapítvány egyenlegét. A számlaegyenlegeket a tárcák lekérdezésével vagy a csomópontokon közvetlenül is meg lehet nézni. + +## További olvasnivaló {#further-reading} + +- [Az Ether és az Ethereum meghatározása](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_ +- [Ethereum fehérkönyv](/whitepaper/): Az eredeti javaslat az Ethereum megalkotására. A jelen dokumentum az ether lényegét és a kialakításának célját írja le. +- [Gwei-kalkulátor](https://www.alchemy.com/gwei-calculator): Használja ezt a gwei-kalkulátort, hogy könnyedén váltson wei, gwei és ether címleteket. Egyszerűen adja meg az összeget weiben, gweiben vagy ETH-ban, és automatikusan kiszámolja az átváltást. + +_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ diff --git a/public/content/translations/hu/developers/docs/intro-to-ethereum/index.md b/public/content/translations/hu/developers/docs/intro-to-ethereum/index.md index 475e6e49c59..b15bfe2c3ee 100644 --- a/public/content/translations/hu/developers/docs/intro-to-ethereum/index.md +++ b/public/content/translations/hu/developers/docs/intro-to-ethereum/index.md @@ -10,100 +10,107 @@ A blokkláncot legjobban úgy lehet leírni, mint egy nyilvános adatbázist, me A "blokk" arra utal, hogy az adat és az állapot szekvenciális adagokban vagy "blokkokban" van tárolva. Ha ETH-et küldesz valaki másnak, akkor a tranzakciós adatot hozzá kell adni egy blokkhoz, hogy sikeres legyen. -A "lánc" arra a tényre utal, hogy minden egyes blokk kriptográfiailag hozzá van rendelve a szülő blokkjához. Egy blokk adatát nem lehet megváltoztatni anélkül, hogy megváltoztatnánk az összes későbbi blokkot, mely a teljes hálózat konszenzusát igényelné. +A "lánc" arra a tényre utal, hogy minden egyes blokk kriptográfiailag hozzá van rendelve a szülő blokkjához. Tehát a blokkok össze vannak kötve. Egy blokk adatát nem lehet megváltoztatni anélkül, hogy megváltoztatnánk az összes későbbi blokkot, amely a teljes hálózat konszenzusát igényelné. -Minden új blokk és a teljes lánc felett egyet kell érteniük a hálózat összes csomópontjának. Így mindenki ugyanazzal az adattal rendelkezik. Ahhoz, hogy ez működjön, a blokkláncoknak kell egy konszenzus mechanizmus. +A hálózat minden számítógépének meg kell egyeznie minden új blokkon és az egész láncon. Ezeket a számítógépeket úgy ismerjük, mint csomópontok. A csomópontok biztosítják, hogy mindenki számára ugyanaz az adat. Ahhoz, hogy ezt az elosztott megegyezést teljesítse, a blokkláncoknak szükségük van konszenzusmechanizmusra. -Az Ethereum jelenleg a proof-of-work konszenzus mechanizmust használja. Ez azt jelenti, hogyha bárki új blokkokat szeretne hozzáadni a lánchoz, először egy nehéz puzzle-t kell megoldania, melyhez rengeteg számítási erő kell. Ennek a puzzle-nek a megoldása "bizonyítja", hogy elköltötted a számítási erőforrásaidat. Ezt a tevékenységet [bányászatnak](/developers/docs/consensus-mechanisms/pow/mining/) hívjuk. A bányászat próba szerencse alapon történik, de egy sikeres blokk hozzáadásért ETH jár jutalmul. Mindazonáltal csaló blokkok hozzáadása nem egy vonzó lehetőség figyelembe véve az erőforrásokat, melyek elköltöttél, hogy létrehozd a blokkot. +Az Ethereum [proof-of-stake alapú konszenzusmechanizmust](/developers/docs/consensus-mechanisms/pos/) használ. Aki új blokkot akar adni a lánchoz, annak le kell kötnie ETH-t – az Ethereum saját valutáját – fedezetként, és futtatniuk kell a validátor szoftvert. Ezen validátorok közül véletlenszerűen választják ki a blokkot javaslót, amelyet a többi validátor ellenőriz és hozzáad a lánchoz. Jutalmak és büntetések rendszere ösztönzi a résztvevőket a jóhiszemű viselkedésre és arra, hogy online legyenek. -Az új blokkokat közvetítik a hálózat csomópontjainak, melyek leellenőrzik és hitelesítik, majd frissítik az állapotot mindenki számára. +Ha szeretné látni, hogy a blokklánc adat hogyan hashelődik és azután hogyan adódik hozzá a blokkreferenciák történetéhez, akkor nézze meg [ezt a bemutatót](https://andersbrownworth.com/blockchain/blockchain) Anders Brownworth narrálásával, illetve az alábbi videót. -Összefoglalásként, amikor ETH-et küldesz valakinek, a tranzakciót ki kell bányászni és belefoglalni egy új blokkba. A frissített állapot ezután megosztásra kerül a teljes hálózattal. Lent több részletet találsz. +Nézze meg, ahogy Anders elmagyarázza a hasheket a blokkláncban: -Nézd meg ahogy Austin végig vezet a blokkláncokon: - - + ## Mi az Ethereum? {#what-is-ethereum} -Az Ethereum univerzumban van egy kanonikus számítógép (melyet Ethereum Virtuális Gépnek vagy EVM-nek hívnak), melynek állapota felett mindenki egyetért a hálózaton. Mindenki, aki részt vesz az Ethereum hálózatban (minden Ethereum csomópont) egy másolattal rendelkezik ennek a számítógépnek az állapotáról. Ezen kívül bármely résztvevő közvetíthet kéréseket ehhez a számítógéphez, hogy tetszőleges számításokat hajtsanak végre. Amikor egy ilyen kérést közvetítenek, a többi résztvevő a hálózaton hitelesíti, validálja és véghez viszi ("lefuttatja") a számítást. Ez állapotváltozást okoz az EVM-ben, amelyet a teljes hálózatban elköteleznek és tovább terjesztenek. +Az Ethereum egy blokklánc egy beágyazott számítógéppel. Alapot szolgáltat alkalmazások és szervezetek számára egy decentralizált, engedélymentes és cenzúrának ellenálló módon. + +Az Ethereum univerzumban van egy kanonikus számítógép (melyet Ethereum Virtuális Gépnek vagy EVM-nek hívnak), amelynek állapota felett mindenki egyetért a hálózaton. Mindenki, aki részt vesz az Ethereum hálózatban (minden Ethereum-csomópont) egy másolattal rendelkezik ennek a számítógépnek az állapotáról. Ezen kívül bármely résztvevő közvetíthet kéréseket ehhez a számítógéphez, hogy tetszőleges számításokat hajtsanak végre. Amikor egy ilyen kérést közvetítenek, a többi résztvevő a hálózaton hitelesíti, validálja és véghez viszi (lefuttatja) a számítást. Ez állapotváltozást okoz az EVM-ben, amelyet a teljes hálózatban elköteleznek és tovább terjesztenek. A számítási kérelmeket tranzakciós kérelmeknek nevezzük; az összes tranzakció bejegyzését, valamint az EVM jelenlegi állapotát a blokklánc tárolja, amelyet viszont minden csomópont tárol és elfogad. -A kriptográfiai mechanizmusok biztosítják, hogy amint a tranzakciókat érvényesnek igazolják és hozzáadják a blokklánchoz, később nem lehet őket megváltoztatni; ugyanazok a mechanizmusok biztosítják azt is, hogy az összes tranzakciót megfelelő „engedélyekkel” írják alá és hajtják végre (senki ne legyen képes digitális eszközök küldésére Alice számlájáról, kivéve magát Alice-t). +A kriptográfiai mechanizmusok biztosítják, hogy az ellenőrzött és a blokklánchoz hozzáadott tranzakciók később nem változtathatók meg. Ugyanazok a mechanizmusok biztosítják azt is, hogy az összes tranzakciót megfelelő engedélyekkel írják alá és hajtják végre (senki ne legyen képes digitális eszközök küldésére Alice számlájáról, kivéve magát Alice-t). ## Mi az ether? {#what-is-ether} -Az Ether kriptovaluta célja, hogy lehetővé tegye egy piac létezését a számításnak. Egy ilyen piac gazdasági ösztönzőt biztosít a résztvevőknek, hogy hitelesítsék/végrehajtsák a tranzakciós kérelmeket és, hogy számítási kapacitást szolgáltassanak a hálózatnak. +**Ether (ETH)** az Ethereum saját kriptovalutája. Az ETH célja, hogy a számítási kapacitásért fizetni lehessen. Egy ilyen piac gazdasági ösztönzőt biztosít a résztvevőknek, hogy hitelesítsék/végrehajtsák a tranzakciós kérelmeket és, hogy számítási kapacitást szolgáltassanak a hálózatnak. + +A résztvevők a tranzakcióért jutalomként felajánlanak ETH-t a hálózatnak. A hálózat jutalmat ad annak, aki végül elvégzi a tranzakció ellenőrzését, végrehajtását, a blokkláncba való bekerülését és a hálózatba történő közvetítését. -Bármely résztvevőnek, aki tranzakciós kérelmet közvetít, bizonyos mennyiségű ethert is fel kell ajánlania a hálózatnak, mivel jutalmat kell odaítélni annak, aki végül elvégzi a tranzakció ellenőrzésének, végrehajtásának, a blokklánc felé történő elkötelezettségének és a hálózatba történő közvetítésének a munkáját. +Az ETH összege a számítási kapacitáshoz kapcsolódik. Ezek a jutalmak megakadályozzák a rosszindulatú résztvevőket is abban, hogy szándékosan eltömítsék a hálózatot azzal, hogy végtelen ciklusokat vagy erőforrásigényes szkriptek végrehajtását kérik, mivel ezeknek a szereplőknek fizetni kell a kalkulációért. -A fizetett ether mennyiség a számítási hossz függvénye. Ez megakadályozza a rosszindulatú résztvevőket is abban, hogy szándékosan eltömítsék a hálózatot azzal, hogy végtelen ciklusokat vagy erőforrás-igényes szkriptek végrehajtását kérik, mivel ezeket a szereplőket folyamatosan terhelni fogják. +Az ETH-t arra is használják, hogy kriptogazdasági biztonságot adjon a hálózatnak három módon: 1) a validátorok jutalmat kapnak, hogy blokkot javasolnak vagy kiszűrik a rosszhiszemű viselkedést; 2) a validátorok letétbe helyezik fedezetként a rosszhiszemű viselkedés elkerülése érdekében (csalás esetén az ETH megsemmisül); 3) a szavazatok súlyozására használják az újonnan javasolt blokkoknál, a konszenzusmechanizmus elágazási pontjához kapcsolódóan. -## Mik azok a dappok? {#what-are-dapps} +## Mi az az okosszerződés? {#what-are-smart-contracts} -A gyakorlatban a résztvevők nem írnak minden alkalommal új kódot, amikor számítást kérelmeznek az EVM-től. Ehelyett az alkalmazásfejlesztők programokat (újra felhasználható kódrészleteket) töltenek fel az EVM tárhelyére, majd a felhasználók kéréseket tesznek ezeknek a kódrészleteknek a végrehajtására változó paraméterekkel. A feltöltött és a hálózat által végrehajtott programokat okosszerződéseknek hívjuk. +A gyakorlatban a résztvevők nem írnak minden alkalommal új kódot, amikor számítást kérelmeznek az EVM-től. Ehelyett az alkalmazásfejlesztők programokat (újrafelhasználható kódrészleteket) töltenek fel az EVM tárhelyére, majd a felhasználók kérik, hogy ezeket a kódrészleteket lefuttassák változó paraméterekkel. A feltöltött és a hálózat által végrehajtott programokat okosszerződéseknek hívjuk. -Egy nagyon alap szinten úgy gondolhatsz az okosszerződésekre, mint egyfajta kajaautomatára: egy szkript, melyet ha meghívnak bizonyos paraméterekkel, végrehajt valamilyen akciót vagy számítást, ha bizonyos feltételek teljesülnek. Például egy egyszerű árusító okosszerződés létrehozhatná és átruházhatná egy digitális eszköz tulajdonjogát, ha a hívó fél ether-t küld egy bizonyos címzettnek. +Úgy is elképzelheti ezeket az okosszerződéseket, mint egyfajta ételautomata: egy szkript, amelyet ha meghívnak bizonyos paraméterekkel, végrehajt valamilyen akciót vagy számítást, ha bizonyos feltételek teljesülnek. Például egy egyszerű árusító okosszerződés létrehozhatná és átruházhatná egy digitális eszköz tulajdonjogát, ha a hívó fél ETH-t küld egy bizonyos címzettnek. Bármely fejlesztő írhat egy okosszerződést és teheti nyilvánossá a hálózat számára úgy, hogy a blokkláncot egy adat rétegként használja a hálózatnak fizetett díj ellenében. Bármely felhasználó meghívhatja az okosszerződést és végrehajthatja a kódját szintén valamekkora díj ellenében. -Ezáltal az okosszerződésekkel a fejlesztők tetszőlegesen bonyolult felhasználó oldali appokat és szolgáltatásokat fejleszthetnek és telepíthetnek: piactereket, pénzügyi eszközöket, játékokat stb. +Ezáltal az okosszerződésekkel a fejlesztők tetszőlegesen bonyolult felhasználó oldali alkalmazásokat és szolgáltatásokat fejleszthetnek és telepíthetnek: piactereket, pénzügyi eszközöket, játékokat stb. ## Terminológia {#terminology} ### Blokklánc {#blockchain} -Az össze blokk sorozata, mely elköteleződött az Ethereum hálózaton a hálózati történetben. A név onnan származik, hogy minden egyes blokk tartalmaz egy referenciát az előző blokkra, mely segít fenntartani egy sorrendet a összes blokk között (így egy pontos történetet is). +Az összes blokk sorozata, amely elköteleződött az Ethereum hálózaton a hálózati történetben. A név onnan származik, hogy minden egyes blokk tartalmaz egy referenciát az előző blokkra, amely segít fenntartani egy sorrendet a összes blokk között (így egy pontos történetet is). ### ETH {#eth} -Az Ethereum natív kriptovalutája. A felhasználók más felhasználóknak fizetnek, hogy teljesítsék a kód végrehajtási kérelmeiket. +**Ether (ETH)** az Ethereum saját kriptovalutája. A felhasználók más felhasználóknak ETH-t fizetnek, hogy teljesítsék a kód végrehajtási kérelmeiket. + +[Többet az ETH-ről](/developers/docs/intro-to-ether/) ### EVM {#evm} -Az Ethereum Virtuális Gép egy globális számítógép, melynek állapota felett az Ethereum hálózat minden résztvevője egyet ért. Bármely résztvevő kérelmezheti valamilyen tetszőleges kód végrehajtását az EVM-en; a kód végrehajtás megváltoztatja az EVM állapotát. +Az Ethereum Virtuális Gép egy globális számítógép, amelynek állapota felett az Ethereum-hálózat minden résztvevője tárol és egyet ért. Bármely résztvevő kérelmezheti valamilyen tetszőleges kód végrehajtását az EVM-en; a kód végrehajtás megváltoztatja az EVM állapotát. -[Többet az EVM-ről](/developers/docs/evm/) +[További tudnivalók az EVM-ről](/developers/docs/evm/) ### Csomópontok {#nodes} -A valódi gépek, melyek az EVM állapotot tárolják. A csomópontok kommunikálnak egymással, hogy információkat terjesszenek az EVM állapotáról és az új állapotváltozásokról. Bármely felhasználó kérheti a kód végrehajtását azáltal is, hogy kód végrehajtási kérelmet közvetít egy csomópontból. Az Ethereum hálózat az összes Ethereum csomópont és a kommunikációjuk összessége. +A valódi gépek, amelyek az EVM állapotot tárolják. A csomópontok kommunikálnak egymással, hogy információkat terjesszenek az EVM állapotáról és az új állapotváltozásokról. Bármely felhasználó kérheti a kód végrehajtását azáltal is, hogy kód végrehajtási kérelmet közvetít egy csomópontból. Az Ethereum hálózat az összes Ethereum csomópont és a kommunikációjuk összessége. [Többet a csomópontokról](/developers/docs/nodes-and-clients/) ### Számlák {#accounts} -Ahol az ether tárolódik. A felhasználók indíthatnak számlákat, ethert helyezhetnek el a számlákon, és ethert utalhatnak át a számlájukról más felhasználóknak. A számlák és a számla egyenlegek egy nagy táblában vannak eltárolva az EVM-ben; a teljes EVM állapot részei. +Ahol az ETH tárolódik. A felhasználók indíthatnak számlákat, ETH-t helyezhetnek el a számlákon, és utalhatnak át a számlájukról más felhasználóknak. A számlák és a számla egyenlegek egy nagy táblában vannak eltárolva az EVM-ben; a teljes EVM állapot részei. -[Többet a számlákról](/developers/docs/accounts/) +[További tudnivalók a számlákról](/developers/docs/accounts/) ### Tranzakciók {#transactions} -A "tranzakciós kérelem" egy formális kifejezés a kód végrehajtási kérelemre az EVM-en és a "tranzakció" egy teljesített tranzakciós kérelem és a hozzárendelt változás az EVM állapotában. Bármely felhasználó közvetíthet tranzakciós kérelmet a hálózatra egy csomópontból. Ahhoz, hogy a tranzakció kérelemnek valóban legyen hatása az elfogadott EVM állapot felett, először validálni, végrehajtani és "elkötelezni kell a hálózatra" más csomópontok által. Bármely kód végrehajtása állapotváltozást okoz az EVM-ben; elkötelezettséggel ez az állapotváltozás a hálózat minden csomópontjához eljut. Néhány tranzakció példa: +A tranzakciós kérelem egy formális kifejezés a kód végrehajtási kérelemre az EVM-en, a tranzakció pedig egy teljesített tranzakciós kérelem és a hozzárendelt változás az EVM állapotában. Bármely felhasználó közvetíthet tranzakciós kérelmet a hálózatra egy csomópontból. Ahhoz, hogy a tranzakciókérelemnek valóban legyen hatása az elfogadott EVM-állapot felett, először validálni kell, végre kell hajtani és komittálni kell a hálózatra egy másik csomópont által. Bármely kód végrehajtása állapotváltozást okoz az EVM-ben; elkötelezettséggel ez az állapotváltozás a hálózat minden csomópontjához eljut. Néhány tranzakció példa: -- Küldj X ethert a számlámról Alice számlájára. -- Publikálj valamilyen okosszerződés kódot az EVM memóriába. +- Küldjön X ETH-t a számlámról Alice számlájára. +- Publikáljon egy okosszerződéses kódot az EVM státuszba. - Hajtsd végre az okosszerződés kódot az X címen az EVM-ben Y paraméterekkel. [Többet a tranzakciókról](/developers/docs/transactions/) ### Blokkok {#blocks} -A tranzakciók mennyisége nagyon magas, így a tranzakciókat adagokban vagy blokkokban "kötelezzük el". A blokkok általában több tucat vagy több száz tranzakciót tartalmaznak. +A tranzakciók száma nagyon magas, így a tranzakciókat adagokban vagy blokkokban „kötelezzük el”. A blokkok általában több tucat vagy több száz tranzakciót tartalmaznak. -[Többet a blokkokról](/developers/docs/blocks/) +[További tudnivalók a blokkokról](/developers/docs/blocks/) ### Okosszerződések {#smart-contracts} -Egy újra felhasználható kódrészlet (egy program), melyet egy fejlesztő publikál az EVM memóriába. Bárki kérheti az okosszerződés kód végrehajtását egy tranzakciós kérelemmel. Mivel a fejlesztők tetszőlegesen végrehajtható alkalmazásokat írhatnak az EVM-be (játékokat, piactereket, pénzügyi eszközöket stb.) okosszerződések publikálásával, ezért gyakran hívjuk ezeket [dappoknak, vagy decentralizált alkalmazásoknak](/developers/docs/dapps/). +Egy újra felhasználható kódrészlet (egy program), amelyet egy fejlesztő publikál az EVM státuszba. Bárki kérheti az okosszerződéses kód végrehajtását egy tranzakciós kérelemmel. Mivel a fejlesztők tetszőlegesen végrehajtható alkalmazásokat írhatnak az EVM-be (játékokat, piactereket, pénzügyi eszközöket stb.) okosszerződések publikálásával, ezért gyakran hívjuk ezeket [dappoknak, vagy decentralizált alkalmazásoknak](/developers/docs/dapps/). [Többet az okos szerződésekről](/developers/docs/smart-contracts/) ## További olvasnivaló {#further-reading} - [Ethereum fehérkönyv](/whitepaper/) +- [Amúgy hogyan működik az Ethereum?](https://www.preethikasireddy.com/post/how-does-ethereum-work-anyway) - _Preethi Kasireddy_ (**Megjegyzés:** bár ez a forrás még mindig értékes, de a [Beolvadás](/roadmap/merge) előtti, és ezért az említett proof-of-work mechanizmus helyett az Ethereum már [proof-of-stake](/developers/docs/consensus-mechanisms/pos)-et használ) + +_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ ## Kapcsolódó útmutatók {#related-tutorials} -- [Egy fejlesztő útmutatása az Ethereumba, első rész](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Az Ethereum nagyon kezdőbarát felfedezése Python és web3.py használatával_ +- [Egy fejlesztő útmutatása az Ethereumba 1. rész](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Az Ethereum nagyon kezdőbarát felfedezése Python és web3.py használatával_ diff --git a/public/content/translations/hu/developers/docs/networks/index.md b/public/content/translations/hu/developers/docs/networks/index.md index ba0ebd69c27..c2d3a960b3c 100644 --- a/public/content/translations/hu/developers/docs/networks/index.md +++ b/public/content/translations/hu/developers/docs/networks/index.md @@ -4,72 +4,144 @@ description: Egy áttekintő az Ethereum hálózatairól és hogy hol lehet tesz lang: hu --- -Mivel az Ethereum egy protokoll, ami azt jelenti, hogy több, a protokollnak megfelelő "hálózat" létezhet, amelyek nem lépnek kölcsönhatásba egymással. +Az Ethereum-hálózatok olyan összekapcsolt számítógépek csoportjai, amelyek az Ethereum-protokoll segítségével kommunikálnak. Egyetlen Ethereum főhálózat létezik, de ugyanazt a protokollt használó, független hálózatokat is létre lehet hozni tesztelési és fejlesztési célból. Számos ilyen független hálózat létezik, amelyek a protokollt követik, de nem kommunikálnak egymással. Akár a saját számítógépén is létrehozhat egyet, hogy egy okosszerződést vagy egy web3 alkalmazást teszteljen. -A hálózatok különböző Ethereum környezetek, amelyekhez hozzáférhetsz fejlesztési, tesztelési vagy gyártási felhasználási esetek céljából. Ethereum számlád fog működni a különböző hálózatokon, de a számlaegyenleged és a tranzakcióid előzményei nem kerülnek át az Ethereum fő hálózatából. Tesztelési célból hasznos tudni, hogy mely hálózatok állnak rendelkezésre, és hogy hogyan szerezhetsz tesztnet ETH-t, amivel játszhatsz. +Ethereum-számlája működni fog a különböző hálózatokon, de a számlaegyenlege és a tranzakciós előzmények nem kerülnek át az Ethereum fő hálózatából. Tesztelési célból hasznos tudni, hogy amely hálózatok állnak rendelkezésre, és hogy hogyan szerezhet egy teszthálózat ETH-t, amivel kipróbálhat dolgokat. Biztonsági okokból nem javasolt olyan számla használata a teszthálózaton, amely a főhálózathoz tartozik és fordítva. ## Előfeltételek {#prerequisites} -Érdemes tisztában lenned az Ethereum alapjaival, mielőtt a különböző hálózatokról olvasol, mivel ezek a hálózatok az Ethereum olcsó és biztonságos verziói, amivel el játszogathatsz. Nézd meg ezt: [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/). +Érdemes tisztában lennie az [Ethereum alapjaival](/developers/docs/intro-to-ethereum/), mielőtt a különböző hálózatokról olvas, mivel ezek a teszthálózatok az Ethereum olcsó és biztonságos verziói, amelyekkel ki lehet próbálni dolgokat. ## Nyilvános hálózatok {#public-networks} -A nyilvános hálózatokat bárki elérheti szerte a világban egy internetkapcsolattal. Bárki olvashat és indíthat tranzakciókat egy nyilvános blokkláncon és hitelesítheti a tranzakciók végrehajtását. A tranzakciókról és a hálózat állapotáról való megállapodást a peerek konszenzusa hozza meg. +A nyilvános hálózatokat bárki elérheti szerte a világban egy internetkapcsolattal. Bárki olvashat és indíthat tranzakciókat egy nyilvános blokkláncon és hitelesítheti a tranzakciók végrehajtását. A tagok közötti konszenzus dönti el az új tranzakciók bedolgozását és a hálózat státuszát. -### Főhálózat {#mainnet} +### Ethereum-főhálózat {#ethereum-mainnet} A főhálózat az elsődleges nyilvános Ethereum produkciós blokklánc, ahol valós értékű tranzakciók történnek az elosztott főkönyvön. Amikor az emberek és tőzsdék az ETH árfolyamon vitatkoznak, akkor a főhálózati ETH-ről beszélnek. -### Tesztnetek {#testnets} +### Ethereum-teszthálózatok {#ethereum-testnets} A főhálózat mellett vannak nyilvános tesztnetek. Ezeket a hálózatokat a protokoll fejlesztők vagy az okosszerződések fejlesztői használják, hogy teszteljék mind a protokoll frissítéseket, és a lehetséges okosszerződéseket egy produkciószerű környezetben a főhálózatba történő telepítés előtt. Úgy is gondolhatsz rá, mint a produkciós és a staging szerver analógiájára. -Általában fontos, hogy le legyen tesztelve egy tesztnetre írt szerződéses kód, mielőtt a főhálózatra telepítenénk. Ha egy dappot fejlesztesz, mely meglévő okosszerződéseket integrál, akkor a legtöbb projekt másolatát megtalálhatod a tesztneteken, amikkel interakcióba léphetsz. +Általában fontos, hogy le legyen tesztelve egy teszthálózatra írt szerződéses kód, mielőtt a főhálózatra telepítenénk. Azoknál az alkalmazásoknál, ahol már meglévő okosszerződéssel kell kapcsolódni, a legtöbb projekt ezeknek a másolatát átteszi a teszthálózatra. -A legtöbb tesztnet egy proof-of-authority konszenzus mechanizmust használ. Ez azt jelenti, hogy a csomópontok egy kis csoportja van kiválasztva a tranzakciók validálására és új blokkok létrehozására - az identitásukat helyezik letétbe a folyamat alatt. Nehéz ösztönözni a bányászatot egy proof-of-work tesztneten, mely így sérülékeny maradhat. +A legtöbb teszthálózat úgy indul, hogy egy engedélyezett proof-of-authority konszenzusmechanizmust használ. Ez azt jelenti, hogy a csomópontok egy kis csoportja van kiválasztva a tranzakciók validálására és új blokkok létrehozására - az identitásukat helyezik letétbe a folyamat alatt. Alternatívaként néhány teszthálózat egy nyitott proof-of-stake konszenzusmechanizmust vezet be, ahol mindenki futtathat validátort, ahogy az Ethereum főhálózaton is működik. -#### Görli {#goerli} +A teszthálózathoz tartozó ETH-nak elvileg nincs valós értéke. Ugyanakkor a ritka vagy nehezen megszerezhető teszthálózati ETH-nek mégis kialakulhat valamilyen piaca. Mivel ETH-re van szükség, hogy ténylegesen interakcióba lépjen az Ethereummal (még a teszthálózaton is), a legtöbb ember csapokból szerzi a teszthálózati ETH-t. A legtöbb csap egy web app, ahol beírhatja a címét, amire ETH-et szeretne kapni. -Egy proof-of-authority tesztnet, mely a több klienssel is működik. +#### Melyik teszthálózatot használja? -#### Kovan {#kovan} +A két nyilvános teszthálózat, amelyet a kliens fejlesztők jelenleg fenntartanak a Sepolia és a Goerli. Sepolia egy hálózat a szerződés- és alkalmazásfejlesztők számára, ahol az alkalmazásaikat tesztelhetik. A Goerli-hálózat a protokollfejlesztőknek biztosít teret frissítéseik teszteléséhez, illetve a letétbe helyezőknek a validátorok futtatásához. -Egy proof-of-authority tesztnet az OpenEthereum kliensek számára. +#### Sepolia {#sepolia} -#### Rinkeby {#rinkeby} +**a Sepolia az ajánlott teszthálózat az alkalmazásfejlesztők számára.**. A Sepolia-hálózat egy engedélyezett validátorszettet használ. Viszonylag új, tehát kevés státusz és előzmény található rajta. Ezért gyorsan tud szinkronizálni, a csomópont futtatása pedig kevesebb tárhelyet igényel. Ez hasznos azoknak, akik gyorsan fel akarnak állítani egy csomópontot és közvetlenül kapcsolódni a hálózattal. -Egy proof-of-authority tesztnet a Geth kliensek számára. +- Zárt validátorszett, amelyet a kliensek és a tesztelő csapatok irányítanak +- Új teszthálózat, amelyre kevesebb alkalmazás van telepítve +- Gyorsan szinkronizál és kevesebb tárhely kell a csomópont futtatáshoz -#### Ropsten {#ropsten} +##### Források -Egy proof-of-work tesztnet. Ez azt jelenti, hogy ez reprezentálja leginkább az Ethereumot. +- [Honlap](https://sepolia.dev/) +- [GitHub](https://github.com/eth-clients/sepolia) +- [Otterscan](https://sepolia.otterscan.io/) +- [Etherscan](https://sepolia.etherscan.io) -### Tesztnet csapok {#testnet-faucets} +##### Csapok -Az ETH-nek a tesztneteken nincs valós értéke; így nincsen piaca sem a tesztnet ETH-nek. Mivel ETH-re van szükséged, hogy ténylegesen interakcióba lépj az Ethereummal, a legtöbb ember csapokból szerzi a tesztnet ETH-et. A legtöbb csap egy web app, ahol beírhatod a címedet, amire ETH-et szeretnél kapni. +- [QuickNode Sepolia csap](https://faucet.quicknode.com/drip) +- [Grabteeth](https://grabteeth.xyz/) +- [PoW csap](https://sepolia-faucet.pk910.de/) +- [Coinbase Wallet csap | Sepolia](https://coinbase.com/faucets/ethereum-sepolia-faucet) +- [Alchemy Sepolia csap](https://sepoliafaucet.com/) +- [Infura Sepolia csap](https://www.infura.io/faucet) +- [Chainstack Sepolia csap](https://faucet.chainstack.com/sepolia-faucet) +- [Testnet csap | Sepolia](https://testnet-faucet.com/sepolia/) -- [Görli csap](https://faucet.goerli.mudit.blog/) -- [Kovan csap](https://faucet.kovan.network/) -- [Rinkeby csap](https://faucet.rinkeby.io/) +#### Goerli _(hosszútávú támogatás)_ {#goerli} + +_Megjegyzés: [a Goerli teszthálózat lezárásra kerül](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) és a [Holesovice](https://github.com/eth-clients/holesovice) veszi át a helyét 2023-ban. Kérjük, hogy vigye át az alkalmazásait a Sepolia hálózatra._ + +A Goerli egy olyan teszthálózat, ahol a validálást és a letétbe helyezést lehet tesztelni. A Goerli hálózat minden olyan felhasználók számára elérhető, aki teszthálózati validátort szeretne futtatni. Ezt használhatják azok a letétesek is, akik tesztelni akarják a protokollfrissítéseket, mielőtt azok a főhálózatra kerülnének. + +- Nyitott validátorszett, a letétesek tesztelhetik a hálózati frissítéseket +- Sok státusz elérhető, ezért alkalmas az okosszerződések komplex interakcióit letesztelni +- Hosszabb ideig tart a szinkronizálás és több tárhely kell a csomópont futtatáshoz + +##### Erőforrások + +- [Honlap](https://goerli.net/) +- [GitHub](https://github.com/eth-clients/goerli) +- [Etherscan](https://goerli.etherscan.io) + +##### Csapok + +- [QuickNode Goerli csap](https://faucet.quicknode.com/drip) +- [Grabteeth](https://grabteeth.xyz/) +- [PoW csap](https://goerli-faucet.pk910.de/) +- [Paradigm csap](https://faucet.paradigm.xyz/) +- [Alchemy Goerli csap](https://goerlifaucet.com/) +- [All That Node Goerli csap](https://www.allthatnode.com/faucet/ethereum.dsrv) +- [Coinbase Wallet csap | Goerli](https://coinbase.com/faucets/ethereum-goerli-faucet) +- [Chainstack Goerli csap](https://faucet.chainstack.com/goerli-faucet) + +Ha szeretne egy validátort indítani a Goerli teszthálózaton, akkor használja az ethstaker [olcsó goerli validátor launchpad-et](https://goerli.launchpad.ethstaker.cc/en/). + +### Második blokkláncréteg (L2) teszthálózatok {#layer-2-testnets} + +[A második blokkláncréteg (L2)](/layer-2/) az Ethereum skálázási megoldásait takarja. Az L2 egy elkülönült blokklánc, ami kiterjeszti az Ethereumot, örökölve annak biztonsági garanciáit. Az L2 teszthálózatok szorosan kapcsolódnak a nyilvános Ethereum teszthálózatokhoz. + +#### Arbitrum Goerli {#arbitrum-goerli} + +Teszthálózat az [Arbitrum-hoz](https://arbitrum.io/). + +##### Csapok + +- [Chainlink csap](https://faucets.chain.link/) + +#### Optimistic Goerli {#optimistic-goerli} + +Teszthálózat az [Optimism-hoz](https://www.optimism.io/). + +##### Csapok + +- [Paradigm csap](https://faucet.paradigm.xyz/) +- [Coinbase Wallet csap | Optimism Goerli](https://coinbase.com/faucets/optimism-goerli-faucet) + +#### Starknet Goerli {#starknet-goerli} + +Teszthálózat a [Starknethez](https://www.starknet.io). + +##### Csapok + +- [Starknet csap](https://faucet.goerli.starknet.io) ## Privát hálózatok {#private-networks} -Egy Ethereum hálózat privát hálózat, ha a csomópontok nem kapcsolódnak egy nyilvános hálózathoz (vagyis a főhálózathoz vagy egy tesztnethez). Ebben a kontextusban a privát azt jelenti, hogy elszigetelt és fenntartott, nem pedig azt, hogy védett vagy biztonságos. +Egy Ethereum hálózat privát, ha a csomópontok nem kapcsolódnak egy nyilvános hálózathoz (vagyis a főhálózathoz vagy egy teszthálózathoz). Ebben a kontextusban a privát azt jelenti, hogy elszigetelt és fenntartott, nem pedig azt, hogy védett vagy biztonságos. ### Fejlesztői hálózatok {#development-networks} -Egy Ethereum alkalmazás fejlesztésekor fontos, hogy egy privát hálózaton futtasd, hogy megnézd hogyan működik telepítés előtt. Hasonlóan ahhoz, amikor egy lokális szervert futtatsz a számítógépeden webfejlesztés céljából, futtathatsz egy lokális blokklánc példányt, ahol tesztelheted a dappodat. Ez gyorsabb iterációt tesz lehetővé, mint egy nyilvános tesztnet. +Egy Ethereum alkalmazás fejlesztésekor fontos, hogy egy privát hálózaton futtassa, hogy megnézze, hogyan működik telepítés előtt. Hasonlóan ahhoz, amikor egy lokális szervert futtat a számítógépén webfejlesztés céljából, egy lokális blokklánc-példányt is futtathat, ahol tesztelheti a dappot. Ez gyorsabb iterációt tesz lehetővé, mint egy nyilvános tesztnet. -Vannak olyan projektek és eszközök, melyek ebben segítenek. Tudj meg többet a [fejlesztői hálózatokról](/developers/docs/development-networks/). +Vannak olyan projektek és eszközök, amelyek ebben segítenek. Tudjon meg többet a [fejlesztői hálózatokról](/developers/docs/development-networks/). -### Konzorcium hálózatok {#consortium-networks} +### Konzorciumhálózatok {#consortium-networks} Egy konszenzus folyamatot néhány előre meghatározott megbízható csomópont végzi. Például egy ismert tudományos intézmények magánhálózata, amelyek mindegyike egyetlen csomópontot irányít, és a blokkokat az aláírók küszöbértéke érvényesíti a hálózaton belül. -Ha egy nyilvános Ethereum hálózat olyan, mint a nyilvános internet, akkor úgy gondolhatsz a konzorcium hálózatra, mint egy privát intranetre. +Ha egy nyilvános Ethereum hálózat olyan, mint a nyilvános internet, akkor úgy gondoljon a konzorcium hálózatra, mint egy privát intranetre. + +## Kapcsolódó eszközök {#related-tools} + +- [Chainlist](https://chainlist.org/) _– az EVM-hálózatok listája, hogy a tárcákat és a szolgáltatókat a megfelelő Chain ID és Network ID segítségével kapcsolják be_ +- [EVM-alapú láncok](https://github.com/ethereum-lists/chains) _– GitHub könyvtár a lánc metaadatokból, amelyek a Chainlisten megjelennek_ ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +- [Javaslat: kiszámítható Ethereum teszthálózati életciklus](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) +- [Az Ethereum teszthálózatok evolúciója](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) diff --git a/public/content/translations/hu/developers/docs/programming-languages/dart/index.md b/public/content/translations/hu/developers/docs/programming-languages/dart/index.md new file mode 100644 index 00000000000..6bcfa5e2dc4 --- /dev/null +++ b/public/content/translations/hu/developers/docs/programming-languages/dart/index.md @@ -0,0 +1,28 @@ +--- +title: Ethereum Dart-fejlesztők számára +description: Sajátítsa el az Ethereum-fejlesztést a Dart programozási nyelv használatával +lang: hu +incomplete: true +--- + +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} + +## Oktatóanyagok {#tutorials} + +- [Flutter és blokklánc – Hello World Dapp](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) átvezeti Önt a kezdeti lépéseken: + 1. A [Truffle fejlesztői környezet](https://www.trufflesuite.com/) telepítése + 2. Okosszerződés megírása [Solidity](https://soliditylang.org/) nyelven + 3. Felhasználói felület megírása Dart nyelven +- A [mobilalkalmazások építése a Flutterrel](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) sokkal rövidebb, amely jobb lehet, ha már ismeri az alapokat +- Ha videók segítségével jobban szeret tanulni, akkor nézze meg az [Építse meg első blokkláncos Flutter alkalmazását](https://www.youtube.com/watch?v=3Eeh3pJ6PeA) videót, amely nagyjából egy óra hosszú +- Ha ennél kevesebb ideje van, akkor talán tetszeni fog az [Egy blokklánc decentralizált alkalmazás építése a Flutterrel és a Darttal az Ethereumon](https://www.youtube.com/watch?v=jaMFEOCq_1s) videó, amely csak húsz percet veszi igénybe +- [A MetaMask integrációja a Flutter alkalmazásban](https://youtu.be/8qzVDje3IWk) – ez a rövid videó bemutatja, hogyan kell a MetaMaskot beintegrálni a Flutter alkalmazásokba + +## Munka Ethereum kliensekkel {#working-with-ethereum-clients} + +Az Ethereumot decentralizált alkalmazások (dappok) fejlesztésére használhatja, amelyek a kriptovaluták és a blokklánc-technológia nyújtotta összes előnyét kiélvezhetik. A Darthoz legalább két könyvtárat tartanak karban, hogy a [JSON RPC API-t](/developers/docs/apis/json-rpc/) használja az Ethereumra. + +1. [Web3dart a simonbutler.eu forrásból](https://pub.dev/packages/web3dart) +1. [Ethereum 5.0.0 a darticulate.com forrásból](https://pub.dev/packages/ethereum) + +Vannak még emellett olyan könyvtárak is, amelyekkel bizonyos Ethereum címeket lehet kezelni, vagy különféle kriptovaluták árait lehet lekérdezni. [Ezek teljes listája itt látható](https://pub.dev/dart/packages?q=ethereum). diff --git a/public/content/translations/hu/developers/docs/programming-languages/delphi/index.md b/public/content/translations/hu/developers/docs/programming-languages/delphi/index.md index c51011ced01..af6c2bfe535 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/delphi/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/delphi/index.md @@ -1,32 +1,32 @@ --- -title: Ethereum Delphi fejlesztőknek -description: Tanuld meg az Ethereum fejlesztést a Delphi programozási nyelv használatával +title: Ethereum Delphi-fejlesztők számára +description: Tanulja meg az Ethereum fejlesztést a Delphi programozási nyelv használatával lang: hu incomplete: true --- - + Használj Ethereumot decentralizált alkalmazások (avagy "dappok") fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel újfajta pénzügyi alkalmazások létrejöveteléhez. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. -Fejlessz decentralizált alkalmazásokat Ethereumra, és lépj interakcióba okosszerződésekkel a Delphi programozási nyelv használatával! +Fejlesszen decentralizált alkalmazásokat Ethereumra, és lépjen interakcióba okosszerződésekkel a Delphi programozási nyelv használatával! -## Első lépések az Okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-the-solidity-language} +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-the-solidity-language} -**Tedd meg az első lépést, hogy integráld a Delphi-t Ethereummal** +**Tegye meg az első lépést, hogy integrálja a Delphi-t az Ethereummal** -Szükséged van egy még kezdetlegesebb alapozóra? Tekintsd meg a [ethereum.org/learn](/learn/) oldalt vagy a [ethereum.org/developers](/developers/) oldalt. +Szükséged van egy még kezdetlegesebb alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy az [ethereum.org/developers](/developers/) oldalt. - [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Okosszerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Írd meg az első Okosszerződésed](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [Tanuld meg a Solidity fordítását és telepítését](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Linkek és referenciák kezdőknek {#beginner-references-and-links} +## Referenciák és hivatkozások kezdők számára {#beginner-references-and-links} **Bevezetés a Delphereum könyvtárba** @@ -35,20 +35,22 @@ Szükséged van egy még kezdetlegesebb alapozóra? Tekintsd meg a [ethereum.org - [Delphi összekapcsolása az Ethereum főhálózattal](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) - [Delphi összekapcsolása okosszerződésekkel](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) -**Szeretnéd kihagyni a telepítést, és egyenesen a mintákra ugrani?** +**Szeretné kihagyni a telepítést, és egyenesen a mintákra ugrani?** - [3 perces okosszerződés és Delphi - Első rész](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) - [3 perces okosszerződés és Delphi - Második rész](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) -## Középhaladó cikkek {#intermediate-articles} +## Köztes cikkek {#intermediate-articles} - [Egy Ethereumon aláírt üzenetaláírás generálása Delphi-ben](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) - [Ether átutalás Delphi-vel](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) - [ERC-20 token átutalás Delphi-vel](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) -## Fejlett használati minták {#advanced-use-patterns} +## Speciális használati minták {#advanced-use-patterns} - [Delphi és az Ethereum Name Service (ENS)](https://medium.com/@svanas/delphi-and-ethereum-name-service-ens-4443cd278af7) - [QuikNode, Ethereum és Delphi](https://medium.com/@svanas/quiknode-ethereum-and-delphi-f7bfc9671c23) +- [Delphi és az Ethereumi sötét erdő](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93) +- [Tokenátváltás a Delphiben](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt. diff --git a/public/content/translations/hu/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/hu/developers/docs/programming-languages/dot-net/index.md index dc5cb5d250e..91a366b6cdf 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/dot-net/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/dot-net/index.md @@ -1,86 +1,86 @@ --- -title: Ethereum .NET fejlesztőknek -description: Tanulj meg Ethereumon fejleszteni .NET-alapú projektek és eszközök használatával +title: Ethereum .NET-fejlesztők számára +description: Tanuljon meg Ethereumon fejleszteni .NET-alapú projektek és eszközök használatával lang: hu incomplete: true --- -Tanulj meg Ethereumon fejleszteni .NET-alapú projektek és eszközök használatával + Használj Ethereumot decentralizált alkalmazások (avagy "dappok") fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel újfajta pénzügyi alkalmazások létrejöveteléhez. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. -Építs decentralizált alkalmazásokat Ethereumra és lépj kapcsolatba okosszerződésekkel a Microsoft tech stack használatával, mely támogatja a C#, # Visual Basic .NET, F# nyelveket VSCode és Visual Studio eszközökkel a .NET Framework/.NET Core/.NET Standard-on keresztül. Telepíts percek alatt egy Ethereum blokkláncot Azure-ra a Microsoft Azure Blockchain használatával. Hozd el a .NET szeretetét Ethereumra! +Építsen decentralizált alkalmazásokat Ethereumra és lépjen kapcsolatba okosszerződésekkel a Microsoft tech stack használatával, mely támogatja a C#, # Visual Basic .NET, F# nyelveket VSCode és Visual Studio eszközökkel a .NET Framework/.NET Core/.NET Standard-on keresztül. Telepítsen percek alatt egy Ethereum blokkláncot Azure-ra a Microsoft Azure Blockchain használatával. Hozza el a .NET szeretetét az Ethereumra! -## Első lépések az Okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-the-solidity-language} +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-the-solidity-language} -**Tedd meg az első lépést, hogy integráld a .NET-et Ethereummal** +**Tegye meg az első lépést, hogy integrálja a .NET-et az Ethereummal** -Szükséged van egy még kezdetlegesebb alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy a [ethereum.org/developers](/developers/) oldalt. +Szükséged van egy még kezdetlegesebb alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy az [ethereum.org/developers](/developers/) oldalt. - [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Okosszerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Írd meg az első Okosszerződésed](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [Tanuld meg a Solidity fordítását és telepítését](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Linkek és referenciák kezdőknek {#beginner-references-and-links} +## Referenciák és hivatkozások kezdők számára {#beginner-references-and-links} -**Bemutatjuk a Nethereum library-t és a VS Code Solidity-t** +**Bemutatjuk a Nethereum könyvtárat és a VS Code Solidity-t** - [Nethereum, Első Lépések](https://docs.nethereum.com/en/latest/getting-started/) - [VS Code Solidity Telepítése](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - [Egy .NET fejlesztő workflow-ja Ethereum Okosszerződések írására és hívására](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) -- [Okosszerződés integráció Nethereummal](https://kauri.io/#collections/getting%20started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereum) -- [Interfacing .NET and Ethereum Blockchain Smart Contracts with Nethereum](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), also 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 - Egy nyílt forráskódú .NET integráció library blokkláncra](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) +- [Okosszerződés integráció Nethereummal](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm) +- [A .NET és az Ethereum blokklánc okosszerződések interfészelése a Nethereummal](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), elérhető kínai verzió: [中文版](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 – Egy nyílt forráskódú .NET integrációs könyvtár blokkláncra](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) - [Ethereum tranzakciók írása SQL adatbázisba Nethereum használatával](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) -- [Nézd meg, hogy lehet egyszerűen Ethereum okosszerződéseket telepíteni C# és VisualStudio használatával](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) +- [Nézze meg, hogy lehet egyszerűen Ethereum okosszerződéseket telepíteni C# és VisualStudio használatával](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) **Szeretnéd kihagyni a telepítést és egyenesen a mintákra ugrani?** -- [Playground](http://playground.nethereum.com/) - Lépj kapcsolatba az Ethereummal, és tanuld meg a Nethereum használatát a böngészőn keresztül. +- [Playground](http://playground.nethereum.com/) - Lépjen kapcsolatba az Ethereummal, és tanulja meg a Nethereum használatát a böngészőn keresztül. - Számlaegyenleg Lekérdezés [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001) - ERC20 Okosszerződés Egyenleglekérdezés [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) - Ether utalása egy számlára [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) - ... És még sok más! -## Középhaladó cikkek {#intermediate-articles} +## Köztes cikkek {#intermediate-articles} - [Nethereum Munkafüzet/Minta Lista](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) -- [Telepítsd le a saját fejlesztői tesztláncaidat](https://github.com/Nethereum/Testchains) +- [Telepítse saját fejlesztői tesztláncait](https://github.com/Nethereum/Testchains) - [VSCode Codegen Plugin Solidity-re](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) - [Unity és Ethereum: Miért és hogyan](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) -- [Készíts ASP.NET Core Web API-t Ethereum dappokra](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) +- [Készítsen ASP.NET Core Web API-t Ethereum dappokra](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) - [A Nethereum Web3 használata egy ellátási lánc nyomon követési rendszer implementálására](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) -- [Nethereum blokk feldolgozás](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), egy [C# Playground mintával](http://playground.nethereum.com/csharp/id/1025) +- [Nethereum blokk feldolgozás](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), egy[ C# Playground mintával](http://playground.nethereum.com/csharp/id/1025) - [Nethereum Websocket Streaming](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) - [Kaleido és Nethereum](https://kaleido.io/kaleido-and-nethereum/) - [Quorum és Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md) -## Fejlett használati minták {#advanced-use-patterns} +## Speciális használati minták {#advanced-use-patterns} - [Azure Key Vault és Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum) - [Nethereum.DappHybrid](https://github.com/Nethereum/Nethereum.DappHybrid) - [Ujo Nethereum backend referencia architektúra](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) -## .NET Projektek, eszközök és más mókás dolog {#dot-net-projects-tools-and-other-fun-stuff} +## .NET projektek, eszközök és más érdekes dolgok {#dot-net-projects-tools-and-other-fun-stuff} -- [Nethereum Playground](http://playground.nethereum.com/) - _Fordíts, készíts és futtass Nethereum kódrészleteket böngészőben_ +- [Nethereum Playground](http://playground.nethereum.com/) - _Fordítson, készítsen és futtasson Nethereum kódrészleteket böngészőben_ - [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) - _Nethereum kódgenerátor UI-jal Blazor-ben_ - [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) - _A .NET Wasm SPA könnyű blokklánc felfedező és egyszerű tárca_ -- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) - _Egy business-rule-engine (a .NET és az Ethereum plaforma is), mely örökletesen meta-adat vezérelt._ -- [Nethermind](https://github.com/NethermindEth/nethermind) - _A .NET Core Ethereum kliens Linux-ra, Windows-ra, MacOs-re_ +- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) - _Egy üzleti szabályokat alkalmazó program (a .NET és az Ethereum platformra is), mely örökletesen metaadat vezérelt._ +- [Nethermind](https://github.com/NethermindEth/nethermind) – _A .NET Core Ethereum-kliens Linux, Windows, macOS rendszerhez_ - [eth-utils](https://github.com/ethereum/eth-utils/) - _használati funkciók Ethereumhoz kapcsolódó kódbázisokkal való munkához_ - [TestChains](https://github.com/Nethereum/TestChains) - _Előre konfigurált .NET fejlesztői láncok gyors válaszra (PoA)_ Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt. -## .NET közösségi hozzájárulók {#dot-net-community-contributors} +## .NET közösségi közreműködők {#dot-net-community-contributors} -Mi a Nethereumon főleg a [Gitteren](https://gitter.im/Nethereum/Nethereum) lógunk, ahol bárki nyugodtan kérdezhet/válaszolhat, segítséget kaphat vagy csak pihenhet. Nyugodtan csinálj egy PR-et vagy nyiss egy ticketet a [Nethereum GitHub repository-ban](https://github.com/Nethereum), vagy csak böngéssz a rengeteg mellék/minta projektjeink között. Megtalálsz minket [Discord-on](https://discord.gg/jQPrR58FxX) is! +Mi a Nethereumon főleg a [Gitteren](https://gitter.im/Nethereum/Nethereum) kommunikálunk, ahol bárki nyugodtan kérdezhet/válaszolhat, segítséget kaphat vagy csak velünk lehet. Bátran készítsen egy PR-t vagy nyisson egy „problémát” (issue) a [Nethereum Github mappában](https://github.com/Nethereum), vagy csak böngésszen a rengeteg mellék-/mintaprojektjeink között. Megtalál minket [Discord-on](https://discord.gg/jQPrR58FxX) is! -Mi a Nethermind-nál a [Gittert](https://gitter.im/nethermindeth/nethermind) használjuk kapcsolattartásra. PR-ekért vagy ticketekért, tekintsd meg a [Nethermind GitHub repository-t](https://github.com/NethermindEth/nethermind). +Ha Önnek új a Nethermind és segítségre van szüksége a kezdéshez, akkor csatlakozzon a [Discord](http://discord.gg/PaCMRFdvWT) csatornánkhoz. Fejlesztőink készséggel válaszolnak a kérdéseire. PR-okért vagy issue-kért tekintse meg a [Nethermind Github mappát](https://github.com/NethermindEth/nethermind). -## Egyéb összesített lista {#other-aggregated-lists} +## Egyéb összesített listák {#other-aggregated-lists} [Hivatalos Nethereum Oldal](https://nethereum.com/) [Hivatalos Nethermind Oldal](https://nethermind.io/) diff --git a/public/content/translations/hu/developers/docs/programming-languages/golang/index.md b/public/content/translations/hu/developers/docs/programming-languages/golang/index.md index 957dd03443d..0fed22c90be 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/golang/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/golang/index.md @@ -1,25 +1,25 @@ --- title: Ethereum Go fejlesztőknek -description: Tanulj meg Ethereumra fejleszteni Go-alapú projektek és eszközök használatával +description: Tanuljon meg Ethereumra fejleszteni Go-alapú projektek és eszközök használatával lang: hu incomplete: true --- -Tanulj meg Ethereumra fejleszteni Go-alapú projektek és eszközök használatával + -Használd az Ethereumot decentraizált alkalmazások (avagy "dappok") fejlesztésére. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Decentralizáltak, ami azt jelenti, hogy egy peer-to-peer hálózaton futnak és nincs lehetőség egyetlen hiba miatti leállásra (single point of failure). Nincs olyan entitás vagy személy, ami irányítaná őket és szinte lehetetlen őket cenzúrázni. Digitális eszközöket irányíthatnak, lehetőséget teremtve ezzel újfajta alkalmazások létrejöveteléhez. +Használja az Ethereumot decentralizált alkalmazások (dappok) fejlesztésére. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Decentralizáltak, ami azt jelenti, hogy egy peer-to-peer hálózaton futnak és nincs lehetőség egyetlen hiba miatti leállásra (single point of failure). Nincs olyan entitás vagy személy, ami irányítaná őket és szinte lehetetlen őket cenzúrázni. Digitális eszközöket irányíthatnak, lehetőséget teremtve ezzel újfajta alkalmazások létrejöveteléhez. -## Első lépések az Okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} -**Tedd meg az első lépést, hogy integráld a Go-t Ethereummal** +**Tegye meg az első lépést, hogy integrálja a Go-t az Ethereummal** -Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy a [ethereum.org/developers](/developers/) oldalt. +Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy az [ethereum.org/developers](/developers/) oldalt. - [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Okosszerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) - [Írd meg az első Okosszerződésed](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [Tanuld meg a Solidity fordítását és telepítését](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -- [Szerződés útmutató](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) +- [Szerződésútmutató](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) ## Cikkek és könyvek kezdőknek {#beginner-articles-and-books} @@ -28,44 +28,45 @@ Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ - [Golang használata Ethereumra való kapcsolódásra](https://www.youtube.com/watch?v=-7uChuO_VzM) - [Ethereum okosszerződések telepítése Golang használatával](https://www.youtube.com/watch?v=pytGqQmDslE) - [Egy útmutató, arról, hogy hogyan kell Ethereum okosszerződéseket tesztelni és telepíteni lépésről lépésre](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) -- [eBook: Ethereum Development with Go](https://goethereumbook.org/) - _Ethereum alkalmazások fejlesztése Go-val_ +- [eBook: Ethereum fejlesztése a Go-val](https://goethereumbook.org/) – _Ethereum alkalmazások fejlesztése Go-val_ -## Haladó cikkek és dokumentációk {#intermediate-articles-and-docs} +## Cikkek és dokumentációk haladóknak {#intermediate-articles-and-docs} -- [Go Ethereum Documentation](https://geth.ethereum.org/docs/) - _A hivatalos Ethereum Golang dokumentáció_ -- [Erigon Programmer's Guide](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _Illusztrált útmutató, mely bemutatja az állapot fát, többszöri bizonyítékokat és a tranzakció feldolgozást_ -- [Erigon és az állapot nélküli Ethereum](https://youtu.be/3-Mn7OckSus?t=394) - _2020 Ethereum Közösségi Konferenica (EthCC 3)_ -- [Erigon: Ethereum kliensek optimalizálása](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _2018 Devcon 4_ +- [Go Ethereum dokumentácó](https://geth.ethereum.org/docs/) – _A hivatalos Ethereum Golang dokumentáció_ +- [Erigon útmutató programozóknak](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) – _Illusztrált útmutató, amely bemutatja az állapotfát, többszöri bizonyítékokat és a tranzakciófeldolgozást_ +- [Erigon és a státuszmentes Ethereum](https://youtu.be/3-Mn7OckSus?t=394) – _2020-as Ethereum Közösségi Konferencia (EthCC 3)_ +- [Erigon: Ethereum-kliensek optimalizálása](https://www.youtube.com/watch?v=CSpc1vZQW2Q) – _2018. Devcon 4_ - [Go Ethereum GoDoc](https://godoc.org/github.com/ethereum/go-ethereum) -- [Egy dapp készítése Go-ban Geth-tel](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) -- [Munka Ethereum Privát Hálózaton Golang-gel és Geth-tel](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) -- [Solidity szerződések unit test-je Ethereumon Go-val](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) -- [Gyors referencia a Geth könyvtárként való használatára](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) +- [Egy dapp készítése Go-ban a Geth segítségével](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) +- [Dolgozzon az Ethereum privát hálózaton a Golanggal és Geth-tel](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) +- [Solidity szerződések egységtesztje az Ethereumon a Go-val](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) +- [Gyors hivatkozás, hogyan használja a Geth-t könyvtárként](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) -## Fejlett használati minták {#advanced-use-patterns} +## Speciális használati minták {#advanced-use-patterns} - [A GETH szimulált Backend](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) -- [Blockchain-as-a-Service appok Ethereum és Quorum használatával](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) -- [Elosztott tárhely IPDS és Swarm Ethereum blokklánc alkalmazásokban](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) -- [Mobile Clients: Library-k és Inproc Ethereum csomópontok](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) -- [Native DApps: Go megkötések Ethereum szerződésekre](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) +- [A blokklánc mint szolgáltatás alkalmazások az Ethereum és a Quorum használatával](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) +- [Elosztott tárhely IPFS és Swarm az Ethereum blokklánc alkalmazásokban](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) +- [Mobilkliensek: könyvtárak és inproc Ethereum csomópontok](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) +- [Natív dappok: Go-megkötések az Ethereum szerződésekre](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) -## Go projektek és eszközök {#go-projects-and-tools} +## Go-projektek és -eszközök {#go-projects-and-tools} - [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) - _Az Ethereum protokoll hivatalos Go implementációja_ - [Go Ethereum Code Analysis](https://github.com/ZtesoftCS/go-ethereum-code-analysis) - _Go Ethereum forráskód áttekintése és elemzése_ -- [Erigon](https://github.com/ledgerwatch/erigon) - _A Go Ethereum gyorsabb származéka_ +- [Erigon](https://github.com/ledgerwatch/erigon) – _A Go Ethereum gyorsabb változata, mely az archív csomópontokra fókuszál_ - [Golem](https://github.com/golemfactory/golem) - _A Golem egy globális piacot teremt a számítási teljesítmény számára_ - [Quorum](https://github.com/jpmorganchase/quorum) - _Egy engedélyköteles Ethereum implementáció, mely támogatja az adatvédelmet_ - [Prysm](https://github.com/prysmaticlabs/prysm) - _Ethereum 'Serenity' 2.0 Go implementáció_ -- [Eth Tweet](https://github.com/yep/eth-tweet) - _Decentralizált Twitter: Egy microblogging szolgáltatás, mely az Ethereum blokkláncon fut_ +- [Eth Tweet](https://github.com/yep/eth-tweet) - _Decentralizált Twitter: Egy mikroblogolási szolgáltatás, mely az Ethereum blokkláncon fut_ - [Plasma MVP Golang](https://github.com/kyokan/plasma) — _A Minimum Viable Plasma specifikációjának Golang implementációja és kiterjesztése_ -- [Open Ethereum Mining Pool](https://github.com/sammy007/open-ethereum-pool) - _Egy nyílt forráskódú Ethereum bányász pool_ +- [Open Ethereum Mining Pool](https://github.com/sammy007/open-ethereum-pool) - _Egy nyílt forráskódú Ethereum bányászalap_ - [Ethereum HD Wallet](https://github.com/miguelmota/go-ethereum-hdwallet) - _Ethereum HD Wallet levezetések Go-ban_ - [Multi Geth](https://github.com/multi-geth/multi-geth) - _Az Ethereum hálózatok több fajtáját támogatja_ - [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _Light Ethereum Subprotocol Geth implementációja_ +- [Ethereum Golang SDK](https://github.com/everFinance/goether) – _Egy egyszerű Ethereum-tárcaimplementáció és eszközök Golangban_ -Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt +Még több anyagot keresel? Tekintse meg az [ethereum.org/developers](/developers/) oldalt ## Go közösségi hozzájárulók {#go-community-contributors} @@ -77,7 +78,7 @@ Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developer - [Ethereum Gitter](https://gitter.im/ethereum/home) - [Geth light Client Gitter](https://gitter.im/ethereum/light-client) -## Egyéb összesített lista {#other-aggregated-lists} +## Egyéb összesített listák {#other-aggregated-lists} - [Awesome Ethereum](https://github.com/btomashvili/awesome-ethereum) -- [Consensys: A Definitive List of Ethereum Developer Tools](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub source](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [Consensys: Az Ethereum fejlesztői eszközök döntő listája](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub forrás](https://github.com/ConsenSys/ethereum-developer-tools-list) diff --git a/public/content/translations/hu/developers/docs/programming-languages/index.md b/public/content/translations/hu/developers/docs/programming-languages/index.md index ba97daa8076..fc87e678fdc 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/index.md @@ -4,20 +4,26 @@ description: lang: hu --- -Általános tévhit, hogy a fejlesztőknek okosszerződéseket kell írniuk az Ethereumra történő fejlesztéshez. Ez nem igaz. Az Ethereum hálózat és közösség egyik szépsége, hogy szinte bármiyen programozási nyelvvel [részt tudsz venni](/community/). +Egy általános félreértés az, hogy a fejlesztőknek [okosszerződéseket](/developers/docs/smart-contracts/) kell írniuk ahhoz, hogy az Ethereumra építhessenek. Ez nem igaz. Az Ethereum hálózat és közösség egyik szépsége, hogy szinte bármiyen programozási nyelvvel [részt lehet venni](/community/). -Az Ethereum és a közössége befogadja az nyílt forráskódot. Közösségi projekteket - kliens implementációkat, API-okat, fejlesztési keretrendszereket, tesztelő eszközöket - sokféle különböző nyelven is megtalálhatsz. +Az Ethereum és a közössége befogadja az nyílt forráskódot. Közösségi projekteket – kliens implementációkat, API-okat, fejlesztési keretrendszereket, tesztelő eszközöket – sokféle különböző nyelven is megtalálhat. -## Válaszd ki a nyelvedet {#data} +## Válasszon nyelvet {#data} -Válaszd ki a nyelvedet, hogy megtaláld a projekteket, anyagokat és a virtuális közösségeket: +Válasszon nyelvet, hogy megtalálja a kapcsolódó projekteket, anyagokat és a virtuális közösségeket: +- [Ethereum Dart-fejlesztők számára](/developers/docs/programming-languages/dart/) +- [Ethereum Delphi fejlesztőknek](/developers/docs/programming-languages/delphi/) +- [Ethereum .NET fejlesztőknek](/developers/docs/programming-languages/dot-net/) +- [Ethereum Go fejlesztőknek](/developers/docs/programming-languages/golang/) - [Ethereum Java fejlesztőknek](/developers/docs/programming-languages/java/) -- [Ethereum Python fejlesztőknek](/developers/docs/programming-languages/python/) - [Ethereum JavaScript fejlesztőknek](/developers/docs/programming-languages/javascript/) -- [Ethereum Go fejlesztőknek](/developers/docs/programming-languages/golang/) +- [Ethereum Python-fejlesztők számára](/developers/docs/programming-languages/python/) +- [Ethereum Ruby-fejlesztők számára](/developers/docs/programming-languages/ruby/) - [Ethereum Rust fejlesztőknek](/developers/docs/programming-languages/rust/) -- [Ethereum .NET fejlesztőknek](/developers/docs/programming-languages/dot-net/) -- [Ethereum Delphi fejlesztőknek](/developers/docs/programming-languages/delphi/) -Nem látod itt a nyelvedet? Kérvényezz egy új oldalt [egy ticket feladásával](https://github.com/ethereum/ethereum-org-website/issues/new/choose) +### Mi a helyzet, ha az én nyelvem nem támogatott {#other-lang} + +Ha egy másik programozói nyelvhez szeretne forrásokat megjeleníteni vagy egy virtuális közösséget feltüntetni, akkor úgy kérhet új oldalt, hogy [egy „problémát” (issue) nyit](https://github.com/ethereum/ethereum-org-website/issues/new/choose). + +Ha csak kódot szeretne írni, hogy a blokklánccal kapcsolatba lépjen, és egy jelenleg nem támogatott nyelvet használ erre, akkor a [JSON-RPC interfésszel](/developers/docs/apis/json-rpc/) tud az Ethereum hálózatához kapcsolódni. Minden olyan nyelv alkalmas erre, amelyik képes TCP/IP használatra. diff --git a/public/content/translations/hu/developers/docs/programming-languages/java/index.md b/public/content/translations/hu/developers/docs/programming-languages/java/index.md index 0d84d710d7e..19557480536 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/java/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/java/index.md @@ -1,56 +1,56 @@ --- -title: Ethereum Java fejlesztőknek -description: Tanulj meg Ethereumon fejleszteni Java alapú projektek és eszközök használatával +title: Ethereum Java-fejlesztők számára +description: Tanuljon meg Ethereumon fejleszteni Java alapú projektek és eszközök használatával lang: hu incomplete: true --- -Tanulj meg Ethereumon fejleszteni Java alapú projektek és eszközök használatával + -Használj Ethereumot decentralizált alkalmazások (avagy "dappok") fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel újfajta pénzügyi alkalmazások létrejöveteléhez. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. +Használjon Ethereumot decentralizált alkalmazások (dappok) fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel újfajta pénzügyi alkalmazások létrejöveteléhez. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. -## Első lépések az Okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} -**Tedd meg az első lépést a Java - Ethereum integrálás útján** +**Tegye meg az első lépést, hogy a Java-t integrálja az Ethereummal** -Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg a [ethereum.org/learn](/learn/) oldalt vagy a [ethereum.org/developers](/developers/) oldalt +Szüksége van egy kezdőknek szóló bevezetőre? Tekintse meg az [ethereum.org/learn](/learn/) vagy az [ethereum.org/developers](/developers/) oldalt. - [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Okosszerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [Írd meg az első Okosszerződésed](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) -- [Tanuld meg a Solidity fordítását és telepítését](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [Írja meg az első okosszerződését](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Tanulja meg a Solidity fordítását és telepítését](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) -## Munka Ethereum kliensekkel +## Az Ethereum-kliensek használata {#working-with-ethereum-clients} -Tanuld meg a [Web3J](https://github.com/web3j/web3j) és a Hyperledger Besu, a két vezető Java Ethereum kliens használatát +Tanulja meg a [Web3J](https://github.com/web3j/web3j) és a Hyperledger Besu, a két vezető Java Ethereum kliens használatát - [Csatlakozás Ethereum klienshez Java-val, Eclipse-szel és Web3J-vel](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) - [Egy Ethereum számla kezelése Java-val és Web3J-vel](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) -- [Generálj egy Java Wrappert az okosszerződésedből](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) +- [Generáljon egy Java Wrappert az okosszerződéséből](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) - [Kapcsolódás egy Ethereum okosszerződéshez](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) -- [Ethereum okosszerződés esemyények hallgatása](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) -- [Besu (Pantheon) használata, a Java Ethereum kliens Linux-szal](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) +- [Ethereum okosszerződés események hallgatása](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) +- [Besu (Pantheon), a Java Ethereum kliens használata Linux-szal](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) - [Egy Hyperledger Besu (Pantheon) csomópont futtatása Java integrációs teszteken](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) -- [Web3j Puska]() +- [Web3j Puska](https://kauri.io/web3j-cheat-sheet-(java-ethereum)/5dfa1ea941ac3d0001ce1d90/c) -## Középhaladó cikkek {#intermediate-articles} +## Köztes cikkek {#intermediate-articles} -- [Tárhely kezelés Java alkalmazásokban IPFS-szel](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) +- [Tárhelykezelés Java alkalmazásokban IPFS-szel](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) - [ERC20 tokenek kezelése Java-ban Web3j-vel](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) -- [Web3j tranzakció kezelők](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) +- [Web3j tranzakciókezelők](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) -## Fejlett használati minták {#advanced-use-patterns} +## Speciális használati minták {#advanced-use-patterns} - [Ethereum használata Java okosszerződés adat cache építésére](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache) -## Java projektek és eszközök {#java-projects-and-tools} +## Java-projektek és -eszközök {#java-projects-and-tools} - [Hyperledger Besu (Pantheon) (Ethereum kliens)](https://docs.pantheon.pegasys.tech/en/stable/) -- [Web3J (Library Ethereum kliensekkel való interakcióhoz)](https://github.com/web3j/web3j) +- [Web3J (könyvtár az Ethereum kliensekkel való interakcióhoz)](https://github.com/web3j/web3j) - [Eventeum (Event Listener)](https://github.com/ConsenSys/eventeum) - [Mahuta (IPFS Fejlesztői Eszközök)](https://github.com/ConsenSys/mahuta) -Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt +Több anyagra lenne szüksége? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt ## Java közösségi hozzájárulók {#java-community-contributors} diff --git a/public/content/translations/hu/developers/docs/programming-languages/javascript/index.md b/public/content/translations/hu/developers/docs/programming-languages/javascript/index.md index 9b91fe01beb..bca0b0fc20e 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/javascript/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/javascript/index.md @@ -1,10 +1,10 @@ --- title: Ethereum JavaScript fejlesztőknek -description: Tanulj meg Ethereumon fejleszteni JavaScript alapú projektek és eszközök használatával. +description: Tanuljon meg Ethereumon fejleszteni JavaScript alapú projektek és eszközök használatával. lang: hu --- -A JavaScript a legnépszerűbb nyelvek között van az Ethereum ökoszisztémában. Valójában van egy [csapat](https://github.com/ethereumjs), mely célul tűzte ki, hogy a lehető legtöbb Ethereumot vigye be a JavaScriptbe. +A Javascript a legnépszerűbb nyelvek között van az Ethereum ökoszisztémában. Valójában van egy [csapat](https://github.com/ethereumjs), mely célul tűzte ki, hogy a lehető legtöbb Ethereumot vigye be a JavaScriptbe. Lehetőség van JavaScriptet írni (vagy valami hasonlót) a [stack összes szintjén](/developers/docs/ethereum-stack/). @@ -12,28 +12,29 @@ Lehetőség van JavaScriptet írni (vagy valami hasonlót) a [stack összes szin ### JavaScript API könyvtárak {#javascript-api-libraries} -Ha JavaScriptet szeretnél írni a blokklánc lekérdezéséhez, tranzakció küldéshez vagy más egyébhez, akkor ennek a legkézenfekvőbb módja egy [JavaScript API könyvtár](/developers/docs/apis/javascript/) használata. Ezek az API-ok lehetővé teszik a fejlesztőknek, hogy interakcióba lépjenek az [Ethereum hálózat csomópontjaival](/developers/docs/nodes-and-clients/). +Ha JavaScriptet szeretne írni a blokklánc lekérdezéséhez, tranzakció küldéséhez vagy máshoz, akkor ennek a legkézenfekvőbb módja egy [JavaScript API könyvtár](/developers/docs/apis/javascript/) használata. Ezek az API-k lehetővé teszik a fejlesztőknek, hogy interakcióba lépjenek az [Ethereum-hálózat csomópontjaival](/developers/docs/nodes-and-clients/). -Ezekkel a könyvtárakkal okosszerződésekkel léphetsz kapcsolatba az Ethereumon, így létre lehet hozni egy dappot, ahol elég csak a JavaScriptet használni már létező okosszerződésekkel történő interakcióhoz. +Ezekkel a könyvtárakkal okosszerződésekkel léphet kapcsolatba az Ethereumon, így létre lehet hozni egy dappot, ahol elég csak a JavaScriptet használni már létező okosszerződésekkel történő interakcióhoz. -**Nézd meg** +**Nézze meg** - [Web3.js](https://web3js.readthedocs.io/) - [Ethers.js](https://docs.ethers.io/) _– tartalmaz egy Ethereum tárca implementációt és más segédprogramokat JavaScriptben és TypeScriptben._ +- [viem](https://viem.sh) – egy TypeScript interfész az Ethereumhoz, amely alacsony szintű, státuszmentes alapokat biztosít az Ethereummal való interakcióhoz. ### Okosszerződések {#smart-contracts} -Ha egy JavaScript fejlesztő vagy és szeretnéd megírni a saját okosszerződéseidet, akkor érdemes megismerkedned a [Solidity-vel](https://solidity.readthedocs.io). Ez a legnépszerűbb okosszerződés nyelv és nagyrészt a JavaScript inspirálta. +Ha Ön Javascript-fejlesztő, és szeretné megírni saját okosszerződését, akkor érdemes megismerkednie a [Solidity-vel](https://solidity.readthedocs.io). Ez a legnépszerűbb okosszerződésnyelv, és szintaktikailag hasonló a JavaScript-hez, ami miatt könnyebb lehet elsajátítani azt. Többet az [okosszerződésekről](/developers/docs/smart-contracts/). -## Értsd meg a protokollt {#understand-the-protocol} +## Értse meg a protokollt {#understand-the-protocol} ### Az Ethereum virtuális gép (EVM) {#the-ethereum-virtual-machine} -Van az [Ethereum virtuális gépnek](/developers/docs/evm/) egy JavaScript implementációja. Támogatja a legfrissebb elágazási (fork) szabályokat. Az elágazási szabályok az EVM-en végzett tervezett frissítésekből adódó szabályok. +Az [Ethereum virtuális géphez](/developers/docs/evm/) létezik egy JavaScript-implementáció is. Támogatja a legfrissebb elágazási (fork) szabályokat. Az elágazási szabályok az EVM-en végzett tervezett frissítésekből adódó szabályok. -Különböző JavaScript csomagokra oszlik, amelyeket áttekinthetsz a jobb megértés érdekében: +Különböző JavaScript csomagokra oszlik, amelyeket áttekinthet a jobb megértés érdekében: - Számlák - Blokkok @@ -41,30 +42,32 @@ Különböző JavaScript csomagokra oszlik, amelyeket áttekinthetsz a jobb meg - Tranzakciók - És még sok más... -Ez segíteni fog megérteni olyan dolgokat, mint "mi a számlának az adatstruktúrája?". +Ez segít megérteni olyan dolgokat, mint például, „mi a számla adatstruktúrája”. -Ha inkább el szeretnéd olvasni a kódot, ez a JavaScript nagyszerű alternatíva lehet a dokumentumaink átolvasásához. +Ha inkább el szeretné olvasni a kódot, ez a JavaScript nagyszerű alternatíva lehet a dokumentumaink áttekintéséhez. -**Nézd meg a monorepot** +**Nézze meg a kapcsolódó mappát** [`ethereumjs`](https://github.com/ethereumjs/ethereumjs-vm) ### Csomópontok és kliensek {#nodes-and-clients} -Van egy fejlesztés alatt álló Ethereumjs kliens. Ez lehetővé teszi, hogy a mélyére áss, hogyan működnek az Ethereum kliensei egy általad ismert nyelven. +Az Ethereumjs kliens aktív fejlesztés alatt áll, így Önnek lehetősége van elmélyedni abban, hogyan működnek az Ethereum-kliensek az Ön által ismert nyelven: JavaScript-ben! -**Nézd meg a klienst** -[`ethereumjs-client`](https://github.com/ethereumjs/ethereumjs-client) +Korábban egy különálló [`mappában`](https://github.com/ethereumjs/ethereumjs-client) tárolták, de azután beolvadt az EthereumVM monorepóba egy csomagként. + +**Nézze meg a klienst** +[`ethereumjs-client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) ## Egyéb projektek {#other-projects} -Rengeteg más dolog is zajlik az Ethereum JavaScript világában, beleértve: +Rengeteg más dolog is zajlik az Ethereum JavaScript világában, mint például: -- könyvtárak és tárca eszközök. +- könyvtárak és tárcaeszközök. - eszközök Ethereum kulcsok generálására, importálására és exportálására. -- a `merkle-patricia-fa` implementációja – egy adatstruktúra, melyet az Ethereum sárga könyv részletez. +- a `merkle-patricia-tree` (Merkle Patricia-fa) implementációja – egy adatstruktúra, melyet az Ethereum Sárgakönyv részletez. -Mélyedj bele abba, ami érdekel a [EthereumJS repoban](https://github.com/ethereumjs) +Mélyedjen bele abba, ami a leginkább érdekli a [EthereumJS mappában](https://github.com/ethereumjs) ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ diff --git a/public/content/translations/hu/developers/docs/programming-languages/python/index.md b/public/content/translations/hu/developers/docs/programming-languages/python/index.md index b403da1bb33..07472b1836b 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/python/index.md @@ -1,19 +1,19 @@ --- title: Ethereum Python fejlesztőknek -description: Tanulj meg Ethereumra fejleszteni Python alapú projektek és eszközök használatával +description: Tanuljon meg Ethereumra fejleszteni Python alapú projektek és eszközök használatával lang: hu incomplete: true --- -Tanulj meg Ethereumra fejleszteni Python alapú projektek és eszközök használatával + Használj Ethereumot decentralizált alkalmazások (avagy "dappok") fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel újfajta pénzügyi alkalmazások létrejöveteléhez. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. -## Első lépések az Okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} -**Tedd meg az első lépést, hogy integráld a Python-t Ethereummal** +**Tegye meg az első lépést, hogy integrálja a Pythont az Ethereummal** -Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy a [ethereum.org/developers](/developers/) oldalt. +Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy az [ethereum.org/developers](/developers/) oldalt. - [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Okosszerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) @@ -22,47 +22,68 @@ Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ ## Cikkek kezdőknek {#beginner-articles} +- [Egy (Python) fejlesztői útmutató az Ethereumra](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) +- [A Python helyzete a 2023-as blokklánc riportban](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) - [Bevezetés az okosszerződésekbe Vyper-rel](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) +- [Telepítse a saját ERC20-as tokenjét Pythonnal és Brownie-val](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) - [Hogyan kell Ethereum szerződést fejleszteni Python Flask használatával?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) - [Bevezetés Web3.py-ba · Ethereum Python fejlesztőknek](https://www.dappuniversity.com/articles/web3-py-intro) - [Hogyan kell egy okosszerződés függvényt meghívni Python és web3.py használatával](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py) -## Középhaladó cikkek {#intermediate-articles} +## Köztes cikkek {#intermediate-articles} - [Dapp fejlesztés Python programozóknak](https://levelup.gitconnected.com/dapps-development-for-python-developers-f52b32b54f28) - [Python Ethereum felület létrehozása: Első rész](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) -- [Ethereum okosszerződések Python-ban: egy átfogó útmutató](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) -- [Minden, amit a Trinity Ethereum kliensről tudnod kell](https://medium.com/@pipermerriam/everything-you-need-to-know-about-the-trinity-ethereum-client-b093c756d1de) +- [Ethereum okosszerződések Pythonban: egy átfogó útmutató](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) +- [Okosszerződések telepítése Brownie-val és Pythonnal](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) +- [NFT-k létrehozása az OpenSea piactérre a Brownie-val](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) -## Fejlett használati minták {#advanced-use-patterns} +## Speciális használati minták {#advanced-use-patterns} -- [Ethereum okosszerződések fordítása, telepítése és hívása Python használatával](https://yohanes.gultom.me/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) -- [Solidity okosszerződések elemzése Slitherrel](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/) +- [Ethereum okosszerződések fordítása, telepítése és hívása Python használatával](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) +- [Solidity okosszerződések elemzése Slitherrel](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) +- [Blokklánc pénzügyi technológiai (fintech) útmutató: kölcsönadás és kölcsönvétel Pythonnal](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) ## Python projektek és eszközök {#python-projects-and-tools} -- [Brownie](https://github.com/eth-brownie/brownie) - _Python keretrendszer Ethereum okosszerződések telepítésére, tesztelésére és alkalmazására_ +### Aktív: {#active} + +- [Web3.py](https://github.com/ethereum/web3.py) – _Python könyvtár az Ethereummal történő interakciókra_ +- [Vyper](https://github.com/ethereum/vyper/) – _Pythonikus okosszerződés nyelv az EVM-re_ +- [Ape](https://github.com/ApeWorX/ape) – _ Az okosszerződés fejlesztői eszköz a pythonisták, adatkutatók és biztonsági szakértők számára._ +- [Brownie](https://github.com/eth-brownie/brownie) – _Python keretrendszer Ethereum okosszerződések telepítésére, tesztelésére és alkalmazására_ +- [py-evm](https://github.com/ethereum/py-evm) – _Az Ethereum virtuális gép implementációja_ +- [eth-tester](https://github.com/ethereum/eth-tester) – _Eszközök az Ethereum-alapú alkalmazások teszteléséhez_ - [eth-utils](https://github.com/ethereum/eth-utils/) - _használati funkciók Ethereumhoz kapcsolódó kódbázisokkal való munkához_ -- [py-evm](https://github.com/ethereum/py-evm) - _az Ethereum virtuális gép implementációja_ -- [py-solc-x](https://pypi.org/project/py-solc-x/) - _Python wrapper a solc solidity fordító köré 0.5.x támogatással_ -- [py-wasm](https://github.com/ethereum/py-wasm) - _a web assembly interpreter Python implementációja_ -- [pydevp2p](https://github.com/ethereum/pydevp2p) - _Az Ethereum P2P stack implementációjak_ -- [pymaker](https://github.com/makerdao/pymaker) - _Python API Maker szerződésekre_ -- [Mamba](https://github.com/arjunaskykok/mamba) - _keretrendszer Vyper nyelven írt okos szerződések írására, fordítására és telepítésére_ -- [Trinity](https://github.com/ethereum/trinity) - _Ethereum Python kliens_ -- [Vyper](https://github.com/ethereum/vyper/) - _Pythonikus okosszerződés nyelv az EVM-re_ -- [Web3.py](https://github.com/ethereum/web3.py) - _Python library Ethereummal történő interakciókra_ +- [py-solc-x](https://pypi.org/project/py-solc-x/) – _Python wrapper a solc solidity fordító köré 0.5.x támogatással_ +- [py-wasm](https://github.com/ethereum/py-wasm) – _A web assembly interpreter Python-implementációja_ +- [pydevp2p](https://github.com/ethereum/pydevp2p) – _Az Ethereum P2P stack implementációja_ +- [pymaker](https://github.com/makerdao/pymaker) – _Python API Maker szerződésekre_ +- [siwe](https://github.com/spruceid/siwe-py) – _Bejelentkezés az Ethereummal (siwe) Pythonra_ +- [Web3 decentralizált pénzügyek (DeFi) Ethereum integrációhoz](https://github.com/tradingstrategy-ai/web3-ethereum-defi) – _Egy Python csomag, mely készen áll az ERC-20, Uniswap és más népszerű projektekkel való integrációra_ + +### Archivált / a karbantartás megszűnt: {#archived--no-longer-maintained} + +- [Trinity](https://github.com/ethereum/trinity) – _Ethereum Python-kliens_ +- [Mamba](https://github.com/arjunaskykok/mamba) – _Keretrendszer Vyper nyelven írt okosszerződések írására, fordítására és telepítésére_ + +Még több anyagot keresel? Tekintse meg az [ethereum.org/developers](/developers/) oldalt. + +## Python-eszközöket használó projektek {#projects-using-python-tooling} + +A következő Ethereum-alapú projektek a fent említett eszközöket használják. A kapcsolódó mappák jó referenciaként szolgálnak például a kódok és a bevált gyakorlatok tekintetében. -Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt +- [Yearn Finance](https://yearn.finance/) és [Yearn Vault Contracts mappa](https://github.com/yearn/yearn-vaults) +- [Curve](https://curve.fi/) és [Curve okosszerződések mappa](https://github.com/curvefi/curve-contract) +- [BadgerDAO](https://badger.com/) és [Brownie eszközkészletet használó okosszerződések](https://github.com/Badger-Finance/badger-system) +- [Sushi](https://sushi.com/) [Pythont használ arra, hogy a megbízási szerződéseket kezelje és telepítse](https://github.com/sushiswap/sushi-vesting-protocols) +- [Alpha Finance](https://alphafinance.io/), amelyet az Alpha Homora révén ismerünk, [Brownie-t használ, hogy az okosszerződéseket tesztelje és telepítse](https://github.com/AlphaFinanceLab/alpha-staking-contract) -## Python közösségi hozzájárulók {#python-community-contributors} +## Python közösségi egyeztetések {#python-community-contributors} -- [Py-EVM Gitter](https://gitter.im/ethereum/py-evm) -- [Trinity Gitter](https://gitter.im/ethereum/trinity) -- [Vyper Gitter](https://gitter.im/ethereum/vyper) -- [Webpy Gitter](https://gitter.im/ethereum/web3.py) +- [Ethereum Python közösségi Discord csatorna](https://discord.gg/9zk7snTfWe) a Web3.py és más Python keretrendszerhez kapcsolódó beszélgetésekhez +- [Vyper Discord csatorna](https://discord.gg/SdvKC79cJk) a Vyper okosszerződések programozásáról szóló beszélgetésekhez -## Egyéb összesített lista {#other-aggregated-lists} +## Egyéb összesített listák {#other-aggregated-lists} -A Vyper wikinek [elképesztő anyaglistája van Vyper-re.](https://github.com/ethereum/vyper/wiki/Vyper-tools-and-resources) -Python eszközökkel kapcsolatos összesített tartalomért látogasd meg a [py-eth.com](http://py-eth.com/) oldalt. +A Vyper wikinek [elképesztő anyaglistája van Vyperrel kapcsolatban.](https://github.com/ethereum/vyper/wiki/Vyper-tools-and-resources) diff --git a/public/content/translations/hu/developers/docs/programming-languages/ruby/index.md b/public/content/translations/hu/developers/docs/programming-languages/ruby/index.md new file mode 100644 index 00000000000..ef6bbb4fcb6 --- /dev/null +++ b/public/content/translations/hu/developers/docs/programming-languages/ruby/index.md @@ -0,0 +1,61 @@ +--- +title: Ethereum Ruby-fejlesztők számára +description: Tanuljon meg Ethereumra fejleszteni Ruby-alapú projektek és eszközök használatával. +lang: hu +incomplete: false +--- + + + +Használj Ethereumot decentralizált alkalmazások (avagy "dappok") fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok nem igényelnek bizalmat a felhasználó oldaláról, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel az újfajta pénzügyi alkalmazások számra. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. + +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} + +**Tegye meg az első lépést a Ruby Ethereumra való integrálásához** + +Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy az [ethereum.org/developers](/developers/) oldalt. + +- [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [Okos Szerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [Írd meg az első Okosszerződésed](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [Tanuld meg a Solidity fordítását és telepítését](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## Cikkek kezdőknek {#beginner-articles} + +- [Az Ethereum-számlák megértése](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Rails-felhasználók hitelesítése a MetaMask használatával](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) +- [Bejelentkezés az Ethereummal – Ruby-könyvtár és Rails-példák kiadása](https://blog.spruceid.com/sign-in-with-ethereum-ruby-library-release-and-rails-examples/) +- [Hogyan lehet az Ethereum-hálózathoz kapcsolódni a Ruby-val](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby) +- [Hogyan lehet új Ethereum-címet létrehozni a Ruby-val](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) + +## Köztes cikkek {#intermediate-articles} + +- [Blokkláncalkalmazás a Ruby-val](https://www.nopio.com/blog/blockchain-app-ruby/) +- [A Ruby használata az Ethereumon az okosszerződés végrehajtására](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) + +## Ruby-projektek és -eszközök {#ruby-projects-and-tools} + +### Aktív {#active} + +- [eth.rb](https://github.com/q9f/eth.rb) – _Ruby könyvtár és RPC-kliens az Ethereum-számlák, üzenetek és tranzakciók kezelésére_ +- [keccak.rb](https://github.com/q9f/keccak.rb) – _Az Ethereum által használt keccak (SHA3) hash_ +- [siwe-ruby](https://github.com/spruceid/siwe-ruby) – _Ruby általi implementáció az Ethereummal való bejelentkezéshez_ +- [siwe_rails](https://github.com/spruceid/siwe_rails) – _SIWE lokális bejelentkezési utakat adó Rails gem_ +- [siwe-rails-examples](https://github.com/spruceid/siwe-rails-examples) – _SIWE-példa Ruby használatával a Railsen személyre szabott irányítóval_ +- [omniauth-siwe](https://github.com/spruceid/omniauth-siwe) – _OmniAuth-stratégia az Ethereummal (SIWE) való bejelentkezéshez_ +- [omniauth-nft](https://github.com/valthon/omniauth-nft) – _OmniAuth stratégia az NFT tulajdonjogon keresztüli hitelesítésre_ +- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) – _Ethereum a Rails-en sablon, mellyel a MetaMaskot a Ruby-hoz lehet kapcsolni a Rails-en_ + +### Archivált / a karbantartás megszűnt {#archived--no-longer-maintained} + +- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) – _Az Ethereum-csomópontok RPC metódusainak meghívása Ruby-val_ +- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) – _Ruby könyvtár az ETH-címek létrehozására egy hierarchikusan determinált tárcából a BIP32 szabvány szerint_ +- [etherlite](https://github.com/budacom/etherlite) – _Ethereum integráció Ruby-ra a Rails-en_ +- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) – _Ruby Ethereum-kliens, amely JSON-RPC interfészt használ a tranzakciók küldésére, a szerződések létrehozására és az azokkal való interakcióra, valamint hasznos eszközkészlet az Ethereum-csomópontokkal való együttműködéshez_ +- [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) – _Az Ethereum-szolgáltatóstratégia bevezetése az OmniAuth-ra_ + +Még több anyagot keresel? Tekintse meg [Fejlesztőink](/developers/) oldalait. + +## Ruby közösségi hozzájárulók {#ruby-community-contributors} + +Az [Ethereum Ruby Telegram csoport](https://t.me/ruby_eth) egy gyorsan növekvő közösség szervezője, egy dedikált erőforrás a fenti projektek és kapcsolódó témák megvitatására. diff --git a/public/content/translations/hu/developers/docs/programming-languages/rust/index.md b/public/content/translations/hu/developers/docs/programming-languages/rust/index.md index a95f56512c4..8f2c23e0f7b 100644 --- a/public/content/translations/hu/developers/docs/programming-languages/rust/index.md +++ b/public/content/translations/hu/developers/docs/programming-languages/rust/index.md @@ -1,19 +1,19 @@ --- -title: Ethereum Rust fejlesztőknek -description: Tanulj meg Ethereumra fejleszteni Rust alapú projektek és eszközök használatával +title: Ethereum Rust-fejlesztők számára +description: Tanuljon meg Ethereumra fejleszteni Rust alapú projektek és eszközök használatával lang: hu incomplete: true --- -Tanulj meg Ethereumra fejleszteni Rust alapú projektek és eszközök használatával + Használj Ethereumot decentralizált alkalmazások (avagy "dappok") fejlesztésére, melyek kihasználják a kriptovaluta és a blokklánc technológia nyújtotta előnyöket. Ezek a dappok megbízhatóak, ami azt jelenti, hogyha egyszer telepítették az Ethereumba, akkor mindig úgy fognak futni, ahogy programozták őket. Digitális vagyontárgyakat irányíthatnak, lehetőséget teremtve ezzel újfajta pénzügyi alkalmazások létrejöveteléhez. Decentralizáltak lehetnek, mely azt jelenti, hogy semmilyen entitás vagy személy nem irányítja őket és közel lehetetlen őket cenzúrázni. -## Első lépések az Okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} +## Kezdő lépések az okosszerződésekkel és a Solidity nyelvvel {#getting-started-with-smart-contracts-and-solidity} -**Tedd meg az első lépést, hogy integráld a Rust-ot Ethereummal** +**Tegye meg az első lépést, hogy integrálja a Rust-ot az Ethereummal** -Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ethereum.org/learn](/learn/) oldalt vagy a [ethereum.org/developers](/developers/) oldalt. +Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintse meg az [ethereum.org/learn](/learn/) vagy az [ethereum.org/developers](/developers/) oldalt. - [Blokklánc ismertetése](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [Okosszerződések értelmezése](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) @@ -23,32 +23,36 @@ Szükséged van egy méginkább kezdőknek szóló alapozóra? Tekintsd meg az [ ## Cikkek kezdőknek {#beginner-articles} - [Ethereum kliens kiválasztása](https://www.trufflesuite.com/docs/truffle/reference/choosing-an-ethereum-client) -- [A Rust Ethereum kliens](https://wiki.parity.io/Setup) +- [A Rust Ethereum-kliens](https://openethereum.github.io/) \* **Felhívjuk figyelmét, hogy az OpenEthereum [támogatása megszűnt](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd), karbantartása nem biztosított.** Használja körültekintően, és inkább térjen át másik kliensimplementációra. - [Tranzakció küldése Ethereumra Rust használatával](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) -- [Bevezetés az okosszerződésekbe a Parity Ethereum klienssel](https://wiki.parity.io/Smart-Contracts) -- [Útmutató arról, hogyan lehet szerződéseket írni Rust Wasm-ben Kovanra, lépésről lépésre](https://github.com/paritytech/pwasm-tutorial) +- [Részletes útmutató arról, hogyan lehet szerződéseket írni Rust Wasm nyelven Kovanra](https://github.com/paritytech/pwasm-tutorial) -## Középhaladó cikkek {#intermediate-articles} +## Köztes cikkek {#intermediate-articles} -## Fejlett használati minták {#advanced-use-patterns} +## Speciális használati minták {#advanced-use-patterns} -- [pwasm_ethereum externs library Ethereum-szerű hálózatokkal való interakciókhoz](https://github.com/openethereum/pwasm-ethereum) -- [Építs egy decentralizált chat-et JavaScript és Rust használatával](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) -- [Építs egy decentralizált To-Do alkalmazást Vue.js-szel & Rust-tal](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) -- [Enigma első lépések - Rust programozási nyelven](https://blog.enigma.co/getting-started-with-discovery-the-rust-programming-language-4d1e0b06de15) -- [Bevezetés a titkos szerződésekbe](https://blog.enigma.co/getting-started-with-enigma-an-intro-to-secret-contracts-cdba4fe501c2) +- [pwasm_ethereum externs könyvtár Ethereum-szerű hálózatokkal való interakciókhoz](https://github.com/openethereum/pwasm-ethereum) +- [Építsen egy decentralizált csevegőprogramot JavaScript és Rust használatával](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) +- [Építsen egy decentralizált teendők listája alkalmazást Vue.js-szel & Rust-tal](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) -## Rust projektek és eszközök {#rust-projects-and-tools} +- [Blokklánc építése Rust nyelven](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) -- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) - _Külső elemek gyűjteménye az ethereum-szerű hálózattal való interakcióhoz._ -- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) -- [oasis_std](https://docs.rs/oasis-std/0.2.7/oasis_std/) - _OASIS API hivatkozás_ -- [Solaris](https://github.com/paritytech/sol-rs) -- [SputnikVM](https://github.com/sorpaas/rust-evm) - _Rust Ethereum virtuális gép implementáció_ -- [Parity](https://github.com/paritytech/parity-ethereum) - _Ethereum Rust kliens_ -- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _Wavelet okos szerződés Rust-ban_ +## Rust-projektek és -eszközök {#rust-projects-and-tools} -Még több anyagot keresel? Tekintsd meg az [ethereum.org/developers](/developers/) oldalt +- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) – _Külső elemek gyűjteménye az Ethereum-szerű hálózattal való interakcióhoz_ +- [Lighthouse](https://github.com/sigp/lighthouse) – _Gyors Ethereum-konszenzusrétegkliens_ +- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) – _Az Ethereum okosszerződés végrehajtási rétegének javasolt újratervezése a WebAssembly egy determinisztikus részét használva_ +- [oasis_std](https://docs.rs/oasis-std/0.2.7/oasis_std/) - _OASIS API hivatkozás_ +- [Solaris](https://github.com/paritytech/sol-rs) – _Solidity okosszerződések egységtesztelésének irányítása a natív Parity kliens EVM használatával._ +- [SputnikVM](https://github.com/rust-blockchain/evm) – _Rust Ethereum virtuálisgép-implementáció_ +- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) – _Wavelet okosszerződés Rust-ban_ +- [Foundry](https://github.com/gakonst/foundry) – _Eszközkészlet az Ethereum alkalmazások fejlesztéséhez_ +- [Ethers_rs](https://github.com/gakonst/ethers-rs) – _Ethereum könyvtár- és tárcaimplementáció_ +- [SewUp](https://github.com/second-state/SewUp) – _Egy könyvtár, amely segít az Ethereum webassembly szerződés Rust-ban való megépítésében, mintha egy általános backend lenne_ +- [Substreams](https://github.com/streamingfast/substreams) – _Párhuzamos blokkláncadat-indexálási technológia_ +- [Reth](https://github.com/paradigmxyz/reth) A Rust Ethereum rövidítése, ami egy új teljescsomópont-implementáció az Ethereumon + +Még több anyagot keresel? Tekintse meg az [ethereum.org/developers](/developers/) oldalt. ## Rust közösségi hozzájárulók {#rust-community-contributors} diff --git a/public/content/translations/hu/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/hu/developers/docs/smart-contracts/anatomy/index.md new file mode 100644 index 00000000000..af67522fb14 --- /dev/null +++ b/public/content/translations/hu/developers/docs/smart-contracts/anatomy/index.md @@ -0,0 +1,658 @@ +--- +title: A okosszerződések anatómiája +description: Egy részletes betekintés az okosszerződések felépítésébe, beleértve a függvényeket, adatokat és változókat. +lang: hu +--- + +Az okosszerződés egy olyan program, mely egy cím alatt fut az Ethereumon. Adatokból és függvényekből állnak, melyeket végre lehet hajtani bemenő tranzakciók által. Ez az áttekintés az okosszerződések felépítéséről szól. + +## Előfeltételek {#prerequisites} + +Először tekintse meg az [okosszerződésekről](/developers/docs/smart-contracts/) szóló cikket. Ez a dokumentum feltételezi, hogy már jártas a programozási nyelvekben, mint a JavaScript vagy a Python. + +## Adat {#data} + +Minden szerződésadatot hozzá kell rendelni egy lokációhoz, mely lehet a `storage` vagy a `memory`. Költséges a tárhelyet módosítani egy okosszerződésben, tehát érdemes fontolóra venni, hogy hol legyen az adat. + +### Tárhely {#storage} + +Az állandó adatokat tárolásnak nevezzük, és állapotváltozók reprezentálják őket. Ezeket az értékeket permanensen a blokkláncon tároljuk. Deklarálnia kell a típust, hogy a szerződés számon tudja tartani, hogy mekkora tárhelyre lesz szüksége a blokkláncon az átfordításkor. + +```solidity +// Solidity példa +contract SimpleStorage { + uint storedData; // Állapotváltozó + // ... +} +``` + +```python +# Vyper példa +storedData: int128 +``` + +Ha Ön programozott már objektumorientált nyelven, akkor a legtöbb típus valószínűleg ismerős lesz. Ugyanakkor az `address` típus új lesz, ha még csak most ismerkedik az Ethereum fejlesztéssel. + +Az `address` típus egy Ethereum címet tud tárolni, mely 20 bájttal vagy 160 bittel egyenlő. Hexadecimális értéket ad vissza vezető 0x-szel. + +A többi típus: + +- boolean +- egész (integer) +- fixpontos szám +- fix méretű bájttömb +- dinamikus méretű bájttömb +- Racionális és egész szám literálok +- String literálok +- Hexadecimális literálok +- Enum + +További magyarázatért tekintse meg az alábbi dokumentumokat: + +- [Vyper típusok megtekintése](https://vyper.readthedocs.io/en/v0.1.0-beta.6/types.html#value-types) +- [Solidity típusok megtekintése](https://solidity.readthedocs.io/en/latest/types.html#value-types) + +### Memória {#memory} + +Memóriaváltozóknak nevezzük azokat az értékeket, melyek csak a szerződésfunkció végrehajtása alatt tárolódnak. Mivel nem kell őket permanensen a blokkláncon tárolni, így sokkal olcsóbb a használatuk. + +Tudjon meg többet az EVM adattárolási módszeréről a [Solidity dokumentációból](https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html?highlight=memory#storage-memory-and-the-stack) (a „Storage, Memory and the Stack” szekcióból). + +### Környezeti változók {#environment-variables} + +A szerződésben meghatározott változók mellett van néhány speciális globális változó is. Elsősorban a blokklánccal vagy az aktuális tranzakcióval kapcsolatos információk nyújtására szolgálnak. + +Példák: + +| **Tul.** | **Állapotváltozó** | **Leírás** | +| ----------------- | ------------------ | ----------------------------------- | +| `block.timestamp` | uint256 | Jelenlegi blokk korszak időbélyege | +| `msg.sender` | address | Az üzenet küldője (jelenlegi hívás) | + +## Függvények {#functions} + +A legegyszerűbben megfogalmazva, a függvények információkat kaphatnak vagy információkat állíthatnak be válaszul a bejövő tranzakciókra. + +Kétfajta függvényhívás létezik: + +- `internal` – ezek nem okoznak EVM hívást + - A belső (internal) függvényeket és állapotváltozókat csak belülről lehet elérni (vagyis a jelenlegi szerződésből vagy a származtatott szerződésekből) +- `external` – ezek EVM hívást okoznak + - A külső (external) függvények a szerződés felületének részei, mely azt jelenti, hogy meg lehet őket hívni más szerződésekből vagy tranzakciókon keresztül. Egy külső függvény `f` kódját nem lehet belülről meghívni (vagyis az `f()` nem működik, de a `this.f()` igen). + +Ezenkívül lehetnek `public` vagy `private` típusúak is + +- a `public` függvényeket belülről lehet meghívni vagy kívülről üzenetek által +- a `private` függvények csak abban a szerződésben láthatóak, amiben definiálták őket, a származtatott szerződésekben nem + +A függvények és az állapotváltozók is lehetnek publikusak vagy privátak + +Íme egy függvény, mely egy állapotváltozó értékét állítja be egy szerződésben: + +```solidity +// Solidity példa +function update_name(string value) public { + dapp_name = value; +} +``` + +- A `string` típusú `value` paraméter kerül be a függvénybe: `update_name` +- Ez `public` módon lett deklarálva, így mindenki hozzáfér +- Nem `view` módon lett deklarálva, így módosíthatja a szerződésállapotot + +### Nézet (view) függvények {#view-functions} + +Ezek a függvények azt ígérik, hogy nem módosítják a szerződés adatainak állapotát. Általános példák a „getter” függvények – ezeket használhatja például egy felhasználó egyenlegének lekérdezésére. + +```solidity +// Solidity példa +function balanceOf(address _owner) public view returns (uint256 _balance) { + return ownerPizzaCount[_owner]; +} +``` + +```python +dappName: public(string) + +@view +@public +def readName() -> string: + return dappName +``` + +Mi számít állapotmódosításnak: + +1. Állapotváltozókba írás. +2. [Események kibocsátása](https://solidity.readthedocs.io/en/v0.7.0/contracts.html#events). +3. [Másik szerződés létrehozás](https://solidity.readthedocs.io/en/v0.7.0/control-structures.html#creating-contracts). +4. A `selfdestruct` használata. +5. Ether küldése hívásokkal. +6. Bármely függvény meghívása, mely nincs `view` vagy `pure` jelöléssel ellátva. +7. Alacsony szintű hívások. +8. Egysoros assembly használata, mely bizonyos opkódot tartalmaz. + +### Konstruktor függvények {#constructor-functions} + +A `constructor` csak egyszer fut le, amikor a szerződést először telepítik. Mint a `constructor` számos osztályalapú programozási nyelv esetében, ezek a függvények gyakran inicializálják az állapotváltozókat a meghatározott értékeikre. + +```solidity +// Solidity példa +// Inicializálja a szerződés adatait, beállítja az 'owner-t' +// a szerződés létrehozó címére. +constructor() public { + // Minden okosszerződés külső tranzakciókra hagyatkozik a függvényeik végrehajtására. + // az `msg` globális változó, mely az adott tranzakcióhoz tartozó adatot tartalmaz, + // mint a küldő címe és az ETH mennyisége a tranzakcióban. + // Több infó: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + owner = msg.sender; +} +``` + +```python +# Vyper példa + +@external +def __init__(_beneficiary: address, _bidding_time: uint256): + self.beneficiary = _beneficiary + self.auctionStart = block.timestamp + self.auctionEnd = self.auctionStart + _bidding_time +``` + +### Beépített függvények {#built-in-functions} + +A szerződésben meghatározott függvények és változók mellett van néhány speciális beépített függvény is. A legnyilvánvalóbb példák: + +- `address.send()` – Solidity +- `send(address)` – Vyper + +Ez lehetőséget ad a szerződéseknek, hogy ETH-t küldjenek más számláknak. + +## Függvények írása {#writing-functions} + +A függvénynek szüksége van: + +- egy paraméterváltozóra és egy típusra (ha elfogad paramétereket) +- a belső/külső deklarációra +- a pure/view/payable deklarációra +- a visszatérítési érték típusára (ha van visszatérítési értéke) + +```solidity +pragma solidity >=0.4.0 <=0.6.0; + +contract ExampleDapp { + string dapp_name; // state variable + + // Called when the contract is deployed and initializes the value + constructor() public { + dapp_name = "My Example dapp"; + } + + // Get Function + function read_name() public view returns(string) { + return dapp_name; + } + + // Set Function + function update_name(string value) public { + dapp_name = value; + } +} +``` + +Egy kész szerződés nagyjából így nézne ki. Itt a `constructor` függvény biztosítja a `dapp_name` változó kezdeti értékét. + +## Események és naplózások {#events-and-logs} + +Az eseményeken keresztül tud kommunikálni az okosszerződés és a frontend vagy más feliratkozó alkalmazás. Amikor egy tranzakciót kibányásztak, az okosszerződések eseményeket bocsáthatnak ki és naplófájlokat írhatnak a blokkláncra, melyet a frontend fel tud dolgozni. + +## Jegyzetekkel ellátott példák {#annotated-examples} + +Íme néhány példa, amelyet Solidity-ben írtak. Ha szeretne megismerkedni a kóddal, akkor kipróbálhatja a [Remixben](http://remix.ethereum.org). + +### Hello world {#hello-world} + +```solidity +// A Solidity verziószámát írja elő szemantikailag. +// Több információ: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.5.10; + +// Egy `HelloWorld` nevű szerződés definiálása. +// A szerződés egy függvények és adatok (az állapota) gyűjteménye. +// Telepítés után a szerződés egy bizonyos címen él az Ethereum blokkláncon. +//További információ: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + // Deklarálja a `string` típusú `message` állapotváltozót. + // Az állapotváltozók olyan változók, melyeknek értékei permanensen tárolódnak a szerződés tárhelyén. + // A `public` kulcsszó lehetővé teszi a változó szerződésen kívüli elérését + // és függvényt hoz létre, mellyel más szerződések vagy kliensek le tudják kérdezni az értéket. + string public message; + + // Más osztály alapú nyelvhez hasonlóan a konstruktor egy + // speciális függvény, mely csak egyszer fut le a szerződés létrehozáskor. + // A konstruktorokat az szerződés adatainak inicializálásra lehet használni. + // További információ: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) public { + // Az `initMessage` string paramétert fogadja el és beállítja + // a szerződés `message` tárhely változójába). + message = initMessage; + } + + // Egy publikus függvény, mely egy string paramétert fogad el + // és frissíti a `message` tárhely változót. + function update(string memory newMessage) public { + message = newMessage; + } +} +``` + +### Token {#token} + +```solidity +pragma solidity ^0.5.10; + +contract Token { + // Egy `address` olyan, mint egy email cím - az Ethereum számlák beazonosítására szolgál. + // A címek okosszerződéseket vagy külső (felhasználói) számlákat jelölnek. + // Learn more: https://solidity.readthedocs.io/en/v0.5.10/types.html#address + address public owner; + + // A `mapping` lényegében egy hash tábla adatszerkezet. + // Ez a `mapping` egy unsigned integert (a token egyenleget) rendel hozzá egy címhez (a token tartóhoz). + // További információ: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types + mapping (address => uint) public balances; + + // Az eseményekkel lehet tevékenységet logolni a blokkláncon. + // Az Ethereum kliensek figyelhetik az eseményeket, hogy reagáljanak az szerződés állapotváltozásokra. + // További információ: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events + event Transfer(address from, address to, uint amount); + + // Inicializálja a szerződés adatot, beállítja az `owner` + // változót a szerződés létrehozó címére. + constructor() public { + // Minden okosszerződés külső tranzakciókra hagyatkozik a függvényeik végrehajtására. + // az `msg` globális változó, mely az adott tranzakcióhoz tartozó adatot tartalmaz, + // mint a küldő címe és az ETH mennyisége a tranzakcióban. + //További információ: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + owner = msg.sender; + } + + // Új tokeneket hoz létre és elküldi egy címre. + function mint(address receiver, uint amount) public { + // A `require` egy kontrol struktúra, mely bizonyos feltételek betartatására szolgál. + // Ha a `require` állítás `false` értéket ad, egy kivétel triggerelődik, + // mely visszaállít minden állapotváltozást a jelenlegi hívás alatt. + // Learn more: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + + // Only the contract owner can call this function + require(msg.sender == owner, "You are not the owner."); + + // Enforces a maximum amount of tokens + require(amount < 1e60, "Maximum issuance exceeded"); + + // Increases the balance of `receiver` by `amount` + balances[receiver] += amount; + } + + // Sends an amount of existing tokens from any caller to an address. + function transfer(address receiver, uint amount) public { + // A küldőnek elég tokennel kell rendelkeznie + require(amount <= balances[msg.sender], "Insufficient balance."); + + // Beállítja a token a két cím token mennyiségét + balances[msg.sender] -= amount; + balances[receiver] += amount; + + // Kibocsájtja a korábban definiált eseményt + emit Transfer(msg.sender, receiver, amount); + } +} +``` + +### Egyedi digitális eszköz {#unique-digital-asset} + +```solidity +pragma solidity ^0.5.10; + +// Szimbólumokat importál be más fájlokból a jelenlegi szerződésbe. +// Ebben az esetben egy pár segítő szerződést az OpenZeppelinről. +// További információ: 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.sol"; +import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol"; +import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol"; + +// Az `is` kulcsszót használjuk, hogy külső szerződések függvényeit és kulcsszavait örököltessük. +// Ebben az esetben, `CryptoPizza` örököl az `IERC721` és az `ERC165` szerződésekből. +// További információ: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance +contract CryptoPizza is IERC721, ERC165 { + // Az OpenZeppelin SafeMath könyvtárát használja aritmetikai számítások biztonságos elvégzésére. + // További információ: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath + using SafeMath for uint256; + + // A konstans állapotváltozók a Solidity-ben hasonlóak más nyelvekhez + // de a fordítás ideje alatt konstans kifejezésből kell hozzárendelni. + // Learn more: 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 + struct Pizza { + string name; + uint256 dna; + } + + // Creates an empty array of Pizza structs + Pizza[] public pizzas; + + // Mapping from pizza ID to its owner's address + mapping(uint256 => address) public pizzaToOwner; + + // Mapping from owner's address to number of owned token + mapping(address => uint256) public ownerPizzaCount; + + // Mapping from token ID to approved address + mapping(uint256 => address) pizzaApprovals; + + // You can nest mappings, this example maps owner to operator approvals + mapping(address => mapping(address => bool)) private operatorApprovals; + + // Internal function to create a random Pizza from string (name) and 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 + 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(_name, _dna) + { + // Adds Pizza to array of Pizzas and get 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 + + // note that address(0) is the zero address, + // indicating that pizza[id] is not yet allocated to a particular user. + + assert(pizzaToOwner[id] == address(0)); + + // Maps the Pizza to the owner + pizzaToOwner[id] = msg.sender; + ownerPizzaCount[msg.sender] = SafeMath.add( + ownerPizzaCount[msg.sender], + 1 + ); + } + + // Creates a random Pizza from string (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) + 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 + pure + returns (uint256) + { + // Generates random uint from string (name) + address (owner) + uint256 rand = uint256(keccak256(abi.encodePacked(_str))) + + uint256(_owner); + rand = rand % dnaModulus; + return rand; + } + + // Returns array of Pizzas found by owner + 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 + view + returns (uint256[] memory) + { + // Uses the `memory` storage location to store values only for the + // lifecycle of this function call. + // További info: 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++) { + if (pizzaToOwner[i] == _owner) { + result[counter] = i; + counter++; + } + } + return result; + } + + // Átadja a Pizza tulajdonjogot és másik címnek + 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."); + + ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1); + ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1); + pizzaToOwner[_pizzaId] = _to; + + // Kibocsájt egy eseményt, mely az importált IERC721 szerződésben van definiálva + emit Transfer(_from, _to, _pizzaId); + _clearApproval(_to, _pizzaId); + } + + /** + * Biztonságosan átadja a egy adott token ID tulajdonjogát egy másik címnek + * Ha a cél cím egy szerződés, akkor az `onERC721Received`-nek implementálva kell lennie, + * mely egy biztonságos átadáskor meghívódik és visszaadja a bűvös értéket + * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; + * ellenkező esetben a transfer visszafordul. + */ + function safeTransferFrom(address from, address to, uint256 pizzaId) + public + { + // solium-disable-next-line arg-overflow + this.safeTransferFrom(from, to, pizzaId, ""); + } + + /** + * Biztonságosan átadja a egy adott token ID tulajdonjogát egy másik címnek + * Ha a cél cím egy szerződés, akkor az `onERC721Received`-nek implementálva kell lennie, + * mely egy biztonságos átadáskor meghívódik és visszaadja a bűvös értéket + * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; + * ellenkező esetben a transfer visszafordul. + */ + function safeTransferFrom( + address from, + address to, + uint256 pizzaId, + bytes memory _data + ) public { + this.transferFrom(from, to, pizzaId); + require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received."); + } + + /** + * Internal function to invoke `onERC721Received` on a target address + * The call is not executed if the target address is not a contract + */ + function _checkOnERC721Received( + address from, + address to, + uint256 pizzaId, + bytes memory _data + ) internal returns (bool) { + if (!isContract(to)) { + return true; + } + + bytes4 retval = IERC721Receiver(to).onERC721Received( + msg.sender, + from, + pizzaId, + _data + ); + 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 + 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."); + + ownerPizzaCount[msg.sender] = SafeMath.sub( + ownerPizzaCount[msg.sender], + 1 + ); + pizzaToOwner[_pizzaId] = address(0); + } + + // Returns count of Pizzas by address + function balanceOf(address _owner) public view returns (uint256 _balance) { + return ownerPizzaCount[_owner]; + } + + // Returns owner of the Pizza found by id + function ownerOf(uint256 _pizzaId) public view returns (address _owner) { + address owner = pizzaToOwner[_pizzaId]; + require(owner != address(0), "Invalid Pizza ID."); + return owner; + } + + // Approves other address to transfer ownership of Pizza + function approve(address _to, uint256 _pizzaId) public { + require(msg.sender == pizzaToOwner[_pizzaId], "Must be the Pizza owner."); + pizzaApprovals[_pizzaId] = _to; + emit Approval(msg.sender, _to, _pizzaId); + } + + // Returns approved address for specific Pizza + function getApproved(uint256 _pizzaId) + public + view + returns (address operator) + { + require(_exists(_pizzaId), "Pizza does not exist."); + 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 + */ + function _clearApproval(address owner, uint256 _pizzaId) private { + require(pizzaToOwner[_pizzaId] == owner, "Must be pizza owner."); + require(_exists(_pizzaId), "Pizza does not exist."); + 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 + */ + function setApprovalForAll(address to, bool approved) public { + require(to != msg.sender, "Cannot approve own address"); + operatorApprovals[msg.sender][to] = approved; + emit ApprovalForAll(msg.sender, to, approved); + } + + // Tells whether an operator is approved by a given owner + function isApprovedForAll(address owner, address operator) + public + view + returns (bool) + { + return operatorApprovals[owner][operator]; + } + + // Takes ownership of Pizza - only for approved users + function takeOwnership(uint256 _pizzaId) public { + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); + address owner = this.ownerOf(_pizzaId); + this.transferFrom(owner, msg.sender, _pizzaId); + } + + // Checks if Pizza exists + 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 + function _isApprovedOrOwner(address spender, uint256 pizzaId) + internal + view + returns (bool) + { + address owner = pizzaToOwner[pizzaId]; + // Disable solium check because of + // https://github.com/duaraghav8/Solium/issues/175 + // solium-disable-next-line operator-whitespace + return (spender == owner || + this.getApproved(pizzaId) == spender || + this.isApprovedForAll(owner, spender)); + } + + // Check if Pizza is unique and doesn't exist yet + modifier isUnique(string memory _name, uint256 _dna) { + bool result = true; + for (uint256 i = 0; i < pizzas.length; i++) { + if ( + keccak256(abi.encodePacked(pizzas[i].name)) == + keccak256(abi.encodePacked(_name)) && + pizzas[i].dna == _dna + ) { + result = false; + } + } + require(result, "Pizza with such name already exists."); + _; + } + + // Returns whether the target address is a contract + 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. + // Lásd https://ethereum.stackexchange.com/a/14016/36603 + // hogy hogyan működik ez. + // TODO A Serenity release előtt ellenőrizni, mivel azután minden cím + // szerződés lesz. + // solium-disable-next-line security/no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } +} +``` + +## További olvasnivaló {#further-reading} + +Tekintse meg a Solidity és a Vyper dokumentációit az okosszerződések teljesebb áttekintésért: + +- [Solidity](https://solidity.readthedocs.io/) +- [Vyper](https://vyper.readthedocs.io/) + +## Kapcsolódó témák {#related-topics} + +- [Okosszerződések](/developers/docs/smart-contracts/) +- [Ethereum virtuális gép](/developers/docs/evm/) + +## Kapcsolódó útmutatók {#related-tutorials} + +- [A szerződések méretének csökkentése, hogy ne okozzon gondot a méretkorlát](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Gyakorlati tanácsok az okosszerződés méretének redukálására._ +- [Okosszerződések adatnaplózása az események mentén](/developers/tutorials/logging-events-smart-contracts/) _– Bevezetés az okossszerződések eseményeibe, s azok használata az adatnaplózáshoz._ +- [Más szerződésekkel való interakció a Solidity által](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Hogyan telepítsen okosszerződést egy létező szerződésből és kapcsolódjon azzal._ diff --git a/public/content/translations/hu/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/hu/developers/docs/smart-contracts/compiling/index.md index 35a99a28d5c..f901768fe02 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/compiling/index.md @@ -1,19 +1,19 @@ --- title: Okos szerződések fordítása -description: Egy magyarázat arról, hogy miért kell az okosszerződéseket fordítani és hogy pontosan mit csinál a fordítás. +description: Magyarázat arról, hogy miért kell az okosszerződéseket átfordítani, és hogy pontosan mit csinál az átfordítás. lang: hu incomplete: true --- -Be kell fordítanod a szerződéseidet, hogy a web alkalmazásod és az Ethereum virtuális gép (EVM) meg tudja érteni őket. +Át kell fordítani a szerződéseket, hogy a webalkalmazás és az Ethereum virtuális gép (EVM) meg tudja érteni azokat. ## Előfeltételek {#prerequisites} -Segítségedre lehet, ha átolvasod az [okosszerződések](/developers/docs/smart-contracts/) és az [Ethereum virtuális gép](/developers/docs/evm/) cikkeket, mielőtt belekezdesz a fordításba. +Segítségére lehetnek az [okosszerződésekről](/developers/docs/smart-contracts/) és az [Ethereum virtuális gépről](/developers/docs/evm/) szóló cikkek, mielőtt belekezdene az átfordításba. ## Az EVM {#the-evm} -Ahhoz, hogy az [EVM](/developers/docs/evm/) le tudja futtatni a szerződésedet, **bytecode-ban** kell lennie. A fordítás ezt: +Ahhoz, hogy az [EVM](/developers/docs/evm/) le tudja futtatni a szerződésedet, **bytecode-ban** kell lennie. Az átfordítás során ebből: ```solidity pragma solidity 0.4.24; @@ -27,21 +27,21 @@ contract Greeter { } ``` -**ezzé alakítja:** +**ez lesz:** ``` 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 ``` -## Web alkalmazások {#web-applications} +## Webalkalmazások {#web-applications} -A fordító ezenkívül létrehozza az **Application Binary Interface-t (ABI)**, amire szükséged lesz, hogy az alkalmazásod megértse a szerződést és meg tudja hívni a szerződés függvényeit. +Az átfordító ezenkívül létrehozza az **Application Binary Interface-t (ABI)**, amire szüksége lesz, hogy az Ön alkalmazása megértse a szerződést, és meg tudja hívni a szerződés függvényeit. -Az ABI egy JSON fáj, mely leírja a telepített szerződést és az okosszerződés függvényeit. Ez segít áthidalni a szakadékot a web2 és a web3 között +Az ABI egy JSON fáj, mely leírja a telepített szerződést és az okosszerződés függvényeit. Ez segít áthidalni a szakadékot a web2 és a web3 között. -Egy [JavaScript kliens könyvtár](/developers/docs/apis/javascript/) fogja az **ABI-t** olvasni, hogy meghívhasd az okosszerződésedet a web alkalmazásod felületén. +Egy [Javascript klienskönyvtár](/developers/docs/apis/javascript/) fogja az **ABI-t** olvasni, hogy Ön meghívhassa az okosszerződését a webalkalmazás felületén. -Lentebb van az ERC-20 token szerződés ABI-ja. Az ERC-20 egy token, mellyel az Ethereumon kereskedhetsz. +Alább látható az ERC-20 tokenszerződés ABI-ja. Az ERC-20 egy token, mellyel az Ethereumon kereskedhetsz. ```json [ @@ -270,9 +270,9 @@ Lentebb van az ERC-20 token szerződés ABI-ja. Az ERC-20 egy token, mellyel az ## További olvasnivaló {#further-reading} -- [ABI spec](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ +- [ABI specifikáció](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ ## Kapcsolódó témák {#related-topics} -- [JavaScript kliens könyvtárak](/developers/docs/apis/javascript/) +- [Javascript klienskönyvtárak](/developers/docs/apis/javascript/) - [Ethereum virtuális gép](/developers/docs/evm/) diff --git a/public/content/translations/hu/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/hu/developers/docs/smart-contracts/deploying/index.md index 166ecb99b70..fa3dffa7e47 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/deploying/index.md @@ -2,56 +2,73 @@ title: Okos szerződések telepítése description: lang: hu -incomplete: true --- -Telepítened kell az okosszerződésedet azért, hogy az Ethereum hálózat felhasználói számára elérhető legyen. +Telepítenie kell az okosszerződését azért, hogy az Ethereum hálózat felhasználói számára elérhető legyen. -Egy okosszerződés telepítéséhez, csak el kell küldened egy Ethereum tranzakciót, mely tartalmazza a befordított kódot címzett megadása nélkül. +Egy okosszerződés telepítéséhez csak el kell küldenie egy Ethereum-tranzakciót, mely tartalmazza az átfordított kódot címzett megadása nélkül. ## Előfeltételek {#prerequisites} -Érdemes tisztában lenned az [Ethereum hálózatokkal](/developers/docs/networks/), [tranzakciókkal](/developers/docs/transactions/) és az [okosszerződések anatómiájával](/developers/docs/smart-contracts/anatomy/) mielőtt belefogsz az okosszerződés telepítésbe. +Érdemes tisztában lennie az [Ethereum hálózatokkal](/developers/docs/networks/), a [tranzakciókkal](/developers/docs/transactions/) és az [okosszerződések anatómiájával](/developers/docs/smart-contracts/anatomy/) mielőtt belefog az okosszerződéstelepítésbe. -Egy szerződés telepítéséért ETH-et kell fizetni, így érdemes ismerned a [gázt és a díjakat](/developers/docs/gas/) az Ethereumon. +A szerződés telepítéséért ETH-t kell fizetni, így érdemes ismernie a [gázt és a díjakat](/developers/docs/gas/) az Ethereumon. -Végül be kell fordítanod a szerződésedet telepítés előtt, ezért olvasd el előtte a [okosszerződések telepítése](/developers/docs/smart-contracts/compiling/) cikket. +Végül át kell fordítani a szerződést telepítés előtt, ezért előtte tekintse meg az [okosszerződések telepítése](/developers/docs/smart-contracts/compiling/) című cikket. -## Hogyan lehet okosszerződést telepíteni - -Ez azt jelenti, hogy egy tranzakciós díjat kell fizetned, így biztosítsd számodra valamennyi ETH-et. +## Hogyan telepítse az okosszerződését {#how-to-deploy-a-smart-contract} ### Mire lesz szükséged {#what-youll-need} -- a szerződésed bájtkódjára – ez a [fordítás](/developers/docs/smart-contracts/compiling/) alatt generálódik. -- Ether a gázra – be kell majd állítanod a gáz limitet, mint bármely más tranzakciónál, de figyelj arra, hogy a szerződés telepítés sokkal több gázt igényel, mint egy egyszerű ETH átutalás. -- egy telepítő szkript vagy plugin. -- hozzáférés egy [Ethereum csomóponthoz](/developers/docs/nodes-and-clients/), vagy a sajátod futtatásával, egy nyilvános csomóponthoz történő csatlakozással vagy egy API kulcson keresztül egy szolgáltatás használatával, mint az Infura vagy az Alchemy +- A szerződés bájtkódjára – ez az [átfordítás](/developers/docs/smart-contracts/compiling/) alatt generálódik +- ETH a gázra – meg kell adni a gázlimitet, mint bármely más tranzakciónál, de fontos tudni, hogy a szerződéstelepítés sokkal több gázt igényel, mint egy egyszerű ETH átutalás +- egy telepítőszkript vagy plugin +- hozzáférés egy [Ethereum-csomóponthoz](/developers/docs/nodes-and-clients/) a sajátja futtatásával, egy nyilvános csomóponthoz történő csatlakozással vagy egy API-kulcson keresztül egy [csomópontszolgáltatás](/developers/docs/nodes-and-clients/nodes-as-a-service/) használatával + +### Az okosszerződés telepítésének lépései {#steps-to-deploy} -A telepítés befejeztével a szerződésednek lesz egy Ethereum címe, mint bármely más [számlának](/developers/docs/accounts/). +A konkrét lépések az adott fejlesztői keretrendszertől függenek. Például megtekintheti a [Hardhat dokumentációt a szerződéstelepítésről](https://hardhat.org/guides/deploying.html) vagy a [Foundry dokumentációt az okosszerződések telepítéséről és ellenőrzéséről](https://book.getfoundry.sh/forge/deploying). A telepítés után a szerződésének lesz egy Ethereum-címe, ahogy a többi [számlának](/developers/docs/accounts/) is, és ez a [forráskód-ellenőrző eszközök](/developers/docs/smart-contracts/verifying/#source-code-verification-tools) segítségével lesz ellenőrizhető. ## Kapcsolódó eszközök {#related-tools} -**Remix -** **_A Remix IDE lehetővé teszi az okosszerződések fejlesztését, telepítését és kezelését az Ethereumhoz hasonló blokkláncokon._** +**Remix – _A Remix IDE lehetővé teszi az okosszerződések fejlesztését, telepítését és kezelését az Ethereumhoz hasonló blokkláncokon_** - [Remix](https://remix.ethereum.org) -**Tenderly -** **_Egy platform, ahol könnyen monitorozhatod az okosszerződéseidet hiba nyomon követéssel, riasztással, teljesítmény mutatókkal és részletes szerződés analízissel_** +**Tenderly – _Web3-fejlesztői platform, amely okosszerződés fejlesztéséhez, teszteléséhez, felügyeletéhez és működtetéséhez biztosít hibakeresési, megfigyelési és infrastruktúrához kapcsolódó építőelemeket_** - [tenderly.co](https://tenderly.co/) +- [Dokumentáció](https://docs.tenderly.co/) - [GitHub](https://github.com/Tenderly) - [Discord](https://discord.gg/eCWjuvt) +**Hardhat – _Fejlesztői környezet Ethereum-szoftverek átfordításához, telepítéséhez, teszteléséhez és a hibakereséshez_** + +- [hardhat.org](https://hardhat.org/getting-started/) +- [Dokumentáció a szerződéstelepítésről](https://hardhat.org/guides/deploying.html) +- [GitHub](https://github.com/nomiclabs/hardhat) +- [Discord](https://discord.com/invite/TETZs2KK4k) + +**thirdweb – _Könnyű telepítés bármely szerződés esetében bármelyik EVM-kompatibilis láncra egyetlen parancssorral_** + +- [Dokumentáció](https://portal.thirdweb.com/deploy/) + ## Kapcsolódó útmutatók {#related-tutorials} -- [Az első okosszerződésed telepítése](/developers/tutorials/deploying-your-first-smart-contract/) _– Bevezetés az első okosszerződésed telepítésébe egy Ethereum teszt hálózaton._ -- [Interakció más okosszerződésekkel Solidity-ben](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Hogyan telepítsünk egy okosszerződést egy meglévő szerződésből és lépjünk vele interakcióba_ -- [Hogyan csökkentsük a szerződés méretét](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _- Hogyan csökkentsd a szerződésed méretét, hogy a határ alatt legyen és gázt spórolj meg_ +- [Az első okosszerződés telepítése](/developers/tutorials/deploying-your-first-smart-contract/) _– Bevezetés az első okosszerződés telepítésébe egy Ethereum-teszthálózaton._ +- [Hello World | okosszerződés-útmutató](/developers/tutorials/hello-world-smart-contract/) _– Egyszerűen követhető útmutató egy alap okosszerződés létrehozásához és telepítéséhez az Ethereumon._ +- [Más szerződésekkel való interakció a Solidity által](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– Hogyan telepítsen okosszerződést egy létező szerződésből és kapcsolódjon azzal._ +- [Hogyan csökkenthető a szerződés mérete](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– Hogyan csökkentheti a szerződés méretét, hogy a határ alatt legyen és gázt takarítson meg_ ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +- [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) – _OpenZeppelin_ +- [Telepítse szerződéseit a Hardhat segítségével](https://hardhat.org/guides/deploying.html) – _Nomic Labs_ + +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ -## Kapcsolódó témák +## Kapcsolódó témák {#related-topics} - [Fejlesztői keretrendszerek](/developers/docs/frameworks/) +- [Ethereum-csomópont futtatása](/developers/docs/nodes-and-clients/run-a-node/) +- [Csomópont, mint szolgáltatás](/developers/docs/nodes-and-clients/nodes-as-a-service) diff --git a/public/content/translations/hu/developers/docs/smart-contracts/index.md b/public/content/translations/hu/developers/docs/smart-contracts/index.md index 072cbad68f3..c65a7e409b7 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/index.md @@ -1,24 +1,26 @@ --- title: Bevezetés az okosszerződésekbe -description: Egy áttekintő az okosszerződésekről kiemelve az egyedi karakterisztikájukat és a határaikat. +description: Áttekintés az okosszerződésekről, kiemelve az egyedi jellemzőiket és korlátaikat. lang: hu --- -## Mi az az okosszerződés? +## Mi az az okosszerződés? {#what-is-a-smart-contract} -Az "okosszerződés" egy program, mely az Ethereum blokkláncon fut. Kód (a függvényei) és adat (az állapota) gyűjteménye, mely egy bizonyos címen létezik az Ethereum blokkláncon. +Az „okosszerződés” egy program, mely az Ethereum blokkláncon fut. Kód (a függvényei) és adat (az állapota/státusza) gyűjteménye, mely egy bizonyos címen létezik az Ethereum blokkláncon. -Az okosszerződés egy [Ethereum számla](/developers/docs/accounts/) típus. Ez azt jelenti, hogy van egy egyenlegük és tranzakciókat tudnak indítani a hálózaton. Azonban nem egy felhasználó kezeli őket, ehelyett telepítve vannak a hálózatra és úgy futnak, ahogy programozták őket. A felhasználói számlák interakcióba léphetnek az okosszerződésekkel tranzakciók indításával, melyek egy függvényt hajtanak végre az okosszerződésen. Az okosszerződések szabályokat fektethetnek le, mint egy rendes szerződés, és automatikusan betartatják azokat a kód által. +Az okosszerződés egyfajta [Ethereum-számla](/developers/docs/accounts/). Ennélfogva egyenlegük van és tranzakciók irányulhatnak feléjük. Azonban nem egy felhasználó kezeli őket, ehelyett telepítve vannak a hálózatra, és a programjuk szerint futnak. A felhasználói számlák interakcióba léphetnek az okosszerződésekkel tranzakciók indításával, melyek egy függvényt hajtanak végre az okosszerződésen. Az okosszerződések szabályokat fektethetnek le, mint egy rendes szerződés, és automatikusan betartatják azokat a kód által. Az okosszerződéseket nem lehet törölni, és a velük való interakció visszafordíthatatlan. ## Előfeltételek {#prerequisites} -Olvasd el a [számlákról](/developers/docs/accounts/), [tranzakciókról](/developers/docs/transactions/) és az [Ethereum virtuális gépről szóló cikkeket](/developers/docs/evm/), mielőtt beleugranál az okosszerződések világába. +Ha Ön most ismerkedik a témával vagy egy kevésbé technikai bevezetést keres, akkor tekintse meg a [bevezetés az okosszerződésekbe](/smart-contracts/) című cikket. + +Olvassa el a [számlákról](/developers/docs/accounts/), [tranzakciókról](/developers/docs/transactions/) és az [Ethereum virtuális gépről szóló cikkeket](/developers/docs/evm/) mielőtt belevetné magát az okosszerződések világába. ## Egy digitális ételautomata {#a-digital-vending-machine} -Talán a legjobb okosszerződés metafora az ételautomata, ahogy Nick Szabo fogalmazta meg. A megfelelő bemenetekkel, egy bizonyos kimenet jön létre. +Talán a legjobb metafora az okosszerződésre egy ételautomata, ahogy azt [Nick Szabo](https://unenumerated.blogspot.com/) bemutatta. A megfelelő bemenetekkel egy bizonyos kimenet jön létre. -Hogy megkapd a nasit az ételautomatából: +Ahhoz, hogy megkapja az ételt az automatából: ``` pénz + nasi választás = kiadott nasi @@ -26,10 +28,10 @@ pénz + nasi választás = kiadott nasi Ez a logika be van programozva az ételautomatába. -Az okosszerződésbe logika van beprogramozva, mint egy ételautomatába. Az alábbi példában bemutatjuk, hogy hogy nézne ki ez az ételautomata egy okosszerződés formájában: +Az okosszerződésbe logika van programozva, akár egy ételautomatába. Egy egyszerű példa, hogyan nézne ki ez az ételautomata, ha egy okosszerződés lenne Solidity nyelven: ```solidity -pragma solidity 0.6.11; +pragma solidity 0.8.7; contract VendingMachine { @@ -39,19 +41,19 @@ contract VendingMachine { // Amikor a 'VendingMachine' szerződést telepítik: // 1. beállítja a telepítő címet a szerződés tulajdonosaként - // 2. beállítja a telepített okosszerződés egyenlegét 100 muffinra - constructor() public { + // 2. set the deployed smart contract's cupcake balance to 100 + constructor() { owner = msg.sender; cupcakeBalances[address(this)] = 100; } - // A tulajdonos növelheti az okosszerződés muffin egyenlegét + // Allow the owner to increase the smart contract's cupcake balance function refill(uint amount) public { require(msg.sender == owner, "Only the owner can refill."); cupcakeBalances[address(this)] += amount; } - // Bárki vásárolhat muffint + // Allow anyone to purchase cupcakes 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"); @@ -65,43 +67,45 @@ Mint ahogy az ételautomaták szükségtelenné teszik az árusító alkalmazott ## Nem engedélyköteles {#permissionless} -Bárki írhat okosszerződést és telepítheti a hálózatra. Csak meg kell tanulnod egy [okosszerződés nyelven](/developers/docs/smart-contracts/languages/) programoznod és elegendő ETH-tel rendelkezned, hogy telepítsd a szerződést. Egy okosszerződés telepítés lényegében egy tranzakció, így ki kell fizetned a [gázt](/developers/docs/gas/), ahogy kifizetnéd egy egyszerű ETH átutalás esetében is. A gáz költségek azonban sokkal magasabbak a szerződés telepítés esetében. +Bárki írhat okosszerződést és telepítheti azt a hálózatra. A szerződés telepítéséhez elég csak megtanulnia egy [okosszerződésnyelven](/developers/docs/smart-contracts/languages/) programozni, illetve a szükséges ETH-val kell rendelkeznie. Az okosszerződés telepítése lényegében egy tranzakció, így ugyanúgy ki kell fizetnie a [gázt](/developers/docs/gas/), mint egy egyszerű ETH-átutalás esetében. Ugyanakkor a szerződéstelepítés gázköltsége magasabb. -Az Ethereum fejlesztőbarát okosszerződés nyelvekkel rendelkezik: +Az Ethereum fejlesztőbarát okosszerződésnyelvekkel rendelkezik: - Solidity - Vyper [Többet a nyelvekről](/developers/docs/smart-contracts/languages/) -Azonban be kell őket fordítani telepítés előtt, hogy az Ethereum virtuális gép értelmezni és tárolni tudja majd a szerződést. [Többet a fordításról](/developers/docs/smart-contracts/compiling/) +Azonban be kell őket fordítani telepítés előtt, hogy az Ethereum virtuális gép értelmezni és tárolni tudja majd a szerződést. [Többet a befordításról](/developers/docs/smart-contracts/compiling/) ## Összeilleszthetőség {#composability} -Az okosszerződések nyilvánosak az Ethereumon, így nyílt API-ként is tekinthetünk rájuk. Ez azt jelenti, hogy meghívhatsz más okosszerződéseket a te szerződésedben, hogy nagymértékben kiterjeszthesd a lehetőségeket. A szerződések még más szerződéseket is telepíteni tudnak. +Az okosszerződések nyilvánosak az Ethereumon, így nyílt API-ként is tekinthetünk rájuk. Ez azt jelenti, hogy meghívhat más okosszerződéseket az Ön szerződésében, hogy nagymértékben kiterjeszthesse a lehetőségeket. A szerződések még más szerződéseket is tudnak telepíteni. -Tudj meg többet az [okosszerződés összeilleszthetőségről](/developers/docs/smart-contracts/composability/). +Tudjon meg többet az [okosszerződések összeilleszthetőségről](/developers/docs/smart-contracts/composability/). ## Korlátok {#limitations} -Az okosszerződések önmagukban nem képesek információt lekérni a "külvilági" eseményekről, mivel nem tudnak HTTP kérvényeket küldeni. Ez a design szerinti külső információkra való támaszkodás veszélyeztetheti a biztonság és a decentralizáció szempontjából fontos konszenzust. +Az okosszerződések önmagukban nem képesek információt lekérni a „külvilági” eseményekről, mivel nem tudnak adatot szerezni a láncon kívüli forrásokból. Tehát nem tudnak válaszolni a világ történéseire. Ez a tervezett logikájuk. A külső információkra való támaszkodás veszélyeztetheti a biztonság és a decentralizáció szempontjából fontos konszenzust. + +Ugyanakkor fontos a blokklánchoz tartozó alkalmazásoknak, hogy láncon kívüli adatokat használhassanak. A megoldás az [orákulum](/developers/docs/oracles/), amely egy olyan eszköz, ami láncon kívüli adatokat kap fel és tesz elérhetővé az okosszerződések számára. + +Az okosszerződések másik korlátja a maximális méret. Legfeljebb 24 KB méretű lehet egy okosszerződés, különben nem lesz elegendő gáz a működéséhez. Ezt meg lehet kerülni a [gyémántminta](https://eips.ethereum.org/EIPS/eip-2535) használatával. -Az [orákulumok](/developers/docs/oracles/) használata megoldást nyújt ezen probléma megoldására. +## Több aláírásos szerződések {#multisig} -## Okosszerződés anyagok {#smart-contract-resources} +A több aláírásos szerződések olyan okosszerződésszámlák, amelyeknek több érvényes aláírás kell, hogy egy tranzakciót végrehajtsanak. Ez nagyon hasznos az egyetlen meghibásodási pont elkerülésére az olyan szerződéseknél, amelyek jelentős mennyiségű ethert vagy más tokent tartanak. A több aláírásos szerződések megosztják a szerződés­-végrehajtási és kulcskezelési felelősséget több fél között, és így nem kell attól tartani, hogy az egyetlen privát kulcs elveszik, és így a pénzeszközök elérhetetlenné válnak. Ebből az okból kifolyólag a több aláírásos szerződéseket egyszerű DAO irányításra is lehet használni. A több aláírásos szerződés N aláírást igényel M lehetséges elfogadható aláírásból (ahol N ≤ M, és M > 1) ahhoz, hogy végrehajtsa a tranzakciót. Gyakran használják a következő kombinációkat: `N = 3, M = 5` és `N = 4, M = 7`. A 4/7 több aláírásos szerződés négyet igényel a hét lehetséges érvényes aláírásból. Tehát a pénzeszközökhöz akkor is hozzáférnek, ha három aláírás elveszik. Ebben az esetben a kulcsokbirtokosok többségének egyet kell értenie és alá kell írnia ahhoz, hogy a szerződés végrehajtható legyen. -**OpenZeppelin Contracts -** **_Library biztonságos okosszerződés fejlesztéshez._** +## Okosszerződés-erőforrások {#smart-contract-resources} + +**OpenZeppelin Contracts –** **_Könyvtár a biztonságos okosszerződésfejlesztéshez._** - [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) - [Közösségi Fórum](https://forum.openzeppelin.com/c/general/16) -**DappSys -** **_Biztonságos, egyszerű, flexibilis okosszerződés építőelemek._** - -- [Dappsys](https://dappsys.readthedocs.io/) -- [GitHub](https://github.com/dapphub/dappsys) - ## További olvasnivaló {#further-reading} -- [Okosszerződések: A blokklánc technológia, mely leváltja az ügyvédeket](https://blockgeeks.com/guides/smart-contracts/) _– Blockgeeks_ -- [Okosszerződés fejlesztés bevált gyakorlatai](https://yos.io/2019/11/10/smart-contract-development-best-practices/) _– Nov 10, 2019 - Yos Riady_ +- [Coinbase: Mi az az okosszerződés?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) +- [Chainlink: Mi az az okosszerződés?](https://chain.link/education/smart-contracts) +- [Video: Egyszerű magyarázat: Okosszerződések](https://youtu.be/ZE2HxTmxfrI) diff --git a/public/content/translations/hu/developers/docs/smart-contracts/languages/index.md b/public/content/translations/hu/developers/docs/smart-contracts/languages/index.md index a6614fba75f..7b1f8344dbf 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/languages/index.md @@ -1,42 +1,46 @@ --- -title: Okos szerződés nyelvek -description: Egy áttekintő és összehasonlítás a két fő okosszerződés nyelvről - Solidity és Vyper. +title: Okosszerződés nyelvek +description: Áttekintjük és összehasonlítjuk a két fő nyelvet, a Solidity-t és a Vypert, melyen az okosszerződések készülnek. lang: hu --- -Az Ethereum egyik nagyszerű szempontja, hogy az okosszerződéseket viszonylag fejlesztőbarát nyelveken lehet programozni. Ha már jártas vagy a Python vagy a JavaScript használatában, akkor találhatsz hasonló szintaxisú nyelvet. +Az Ethereum egyik kiváló jellemzője, hogy az okosszerződéseket viszonylag fejlesztőbarát nyelveken lehet programozni. Ha Ön járatos a Pythonban vagy bármilyen [kerek zárójeles nyelvben](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages), akkor találhat olyan nyelvet, melynek a szintaxisa ismerős lesz. A két legaktívabb és leginkább karbantartott nyelv: - Solidity - Vyper -A tapasztaltabb fejlesztők kipróbálhatják a Yul nyelvet, mely egy haladó nyelv az [Ethereum Virtuális Gépre](/developers/docs/evm/), vagy a Yul+-t, mely a Yul kiterjesztése. +A tapasztaltabb fejlesztők kipróbálhatják a Yul nyelvet, mely egy haladó nyelv az [Ethereum virtuális gépre](/developers/docs/evm/), vagy ennek kiterjesztését, melynek neve Yul+. + +Amennyiben Ön kíváncsi típus, és szeret olyan új nyelvek tesztelésében segíteni, amelyek még komoly fejlesztés előtt állnak, akkor fedezze fel a Fe-t, egy kialakulóban lévő okosszerződésnyelvet, amely még gyerekcipőben jár. ## Előfeltételek {#prerequisites} -A programozási nyelvek, különösen a JavaScript vagy a Python korábbi ismerete segíthet az okosszerződés nyelvekben mutatkozó különbségek értelmezésében. Azt is javasoljuk, hogy értsd meg az okosszerződést, mint fogalmat, mielőtt túl mélyre ásnál a nyelvi összehasonlításokban. [Bevezetés az okosszerződésekbe](/developers/docs/smart-contracts/). +A programozási nyelvek, különösen a JavaScript vagy a Python korábbi ismerete segíthet az okosszerződés nyelvekben mutatkozó különbségek értelmezésében. Javasoljuk, hogy először értse meg az okosszerződést, mint koncepciót, mielőtt túl mélyre ásna a nyelvi összehasonlításokban. [Bevezetés az okosszerződésekbe](/developers/docs/smart-contracts/). ## Solidity {#solidity} -- A C++, Python és a JavaScript gyakorolt rá hatást. -- Statikusan típusos (a változó típusa ismert a fordítási időben). -- Támogatja: - - Öröklődés (kiterjeszthetsz más szerződéseket). - - Könyvtárak (újrafelhasználható kódot írhatsz, melyet meghívhatsz különböző szerződésekből – mint a statikus függvényeket statikus osztályokban más objektumorientált programozási nyelveken). - - Komplex felhasználó által definiált típusok. +- Objektumorientált, magas szintű nyelv az okosszerződések telepítésére. +- Kerek zárójeles nyelv, amelyet a leginkább a C++ befolyásolt. +- Statikusan típusos (a változó típusa ismert az átfordítási időben). +- A következőket támogatja: + - Öröklődés (kiterjeszthet más szerződéseket). + - Könyvtárak (újrafelhasználható kódot írhat, melyet meghívhat különböző szerződésekből – mint a statikus függvényeket statikus osztályokban más objektumorientált programozási nyelveken). + - Komplex, felhasználó által definiált típusok. ### Fontos linkek {#important-links} - [Dokumentáció](https://docs.soliditylang.org/en/latest/) -- [Solidity Nyelv Portál](https://soliditylang.org/) -- [Solidity egy példa alapján](https://docs.soliditylang.org/en/latest/solidity-by-example.html) +- [Solidity Nyelvportál](https://soliditylang.org/) +- [Solidity példák alapján](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Gitter Chatszoba](https://gitter.im/ethereum/solidity) -- [Cheat Sheet](https://reference.auditless.com/cheatsheet) +- [Solidity Gitter csevegőszoba](https://gitter.im/ethereum/solidity/), amely átirányít a [Solidity Matrix csevegőszobába](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Puska](https://reference.auditless.com/cheatsheet) - [Solidity Blog](https://blog.soliditylang.org/) +- [Solidity Twitter](https://twitter.com/solidity_lang) -### Példa szerződés {#example-contract} +### Példaszerződés {#example-contract} ```solidity // SPDX-License-Identifier: GPL-3.0 @@ -77,33 +81,40 @@ contract Coin { } ``` -Ez a példa adhat egy benyomást arról, hogyan néz ki a Solidity szerződés szintaxis. A függvények és a változók részletesebb leírásáért, [nézd meg a dokumentációt](https://docs.soliditylang.org/en/latest/contracts.html). +Ez a példa azt mutathatja meg Önnek, hogyan néz ki a Solidity szerződés szintaxisa. A függvények és a változók részletesebb leírásáért [tekintse meg a dokumentációt](https://docs.soliditylang.org/en/latest/contracts.html). ## Vyper {#vyper} - Pythonikus programozási nyelv - Erősen típusos - Kicsi és érthető fordító kód -- Szándékosan kevesebb elemmel rendelkezik, mint a Solidity azzal a céllal, hogy a szerződések biztonságosabbak és könnyebben auditálhatóak legyenek. A Vyper nem támogatja a: +- Hatékony bájtkód-generálás +- Szándékosan kevesebb elemmel rendelkezik, mint a Solidity, azzal a céllal, hogy a szerződések biztonságosabbak és könnyebben auditálhatóak legyenek. A Vyper nem támogatja a következőket: - Módosítókat (modifier) - Öröklést - - Soron belüli assembly-t - - Függvény overloading-ot - - Operátor overloading-ot - - Rekurzív hívást - - Végtelen hosszú ciklusokat - - Bináris fix pontokat + - Soron belüli assembly + - Függvénytúlterhelés + - Operátortúlterhelés + - Rekurzív hívás + - Végtelen hosszú ciklusok + - Bináris fix pontok -További információért, [olvasd el a Vyper indoklást](https://vyper.readthedocs.io/en/latest/index.html). +További információkért [tekintse meg a Vyper magyarázatát](https://vyper.readthedocs.io/en/latest/index.html). ### Fontos linkek {#important-links-1} - [Dokumentáció](https://vyper.readthedocs.io) -- [Vyper egy példa alapján](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) +- [Vyper példa alapján](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) +- [Még több Vyper példák alapján](https://vyper-by-example.org/) - [GitHub](https://github.com/vyperlang/vyper) -- [Vyper Gitter Chatszoba](https://gitter.im/vyperlang/community) +- [A Vyper-közösség Discord-csevegése](https://discord.gg/SdvKC79cJk) - [Cheat Sheet](https://reference.auditless.com/cheatsheet) -- [2020. Január 8. frissítés](https://blog.ethereum.org/2020/01/08/update-on-the-vyper-compiler) +- [Okosszerződés-fejlesztési keretrendszerek és eszközök Vyperre](/developers/docs/programming-languages/python/) +- [VyperPunk – tanulja meg a Vyper okosszerződéseket biztosítását és meghackelését](https://github.com/SupremacyTeam/VyperPunk) +- [VyperExamples – Példák a Vyper sebezhetőségére](https://www.vyperexamples.com/reentrancy) +- [Vyper Hub fejlesztéshez](https://github.com/zcor/vyper-dev) +- [Példák a Vyper legjobb okosszerződéseire](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) +- [A Vyper által gondozott kiváló források](https://github.com/spadebuilders/awesome-vyper) ### Példa {#example} @@ -166,9 +177,9 @@ def withdraw(): # a kedvezményezettnek. @external def endAuction(): - # Jó gyakorlat a szerződéssel interakcióba lépő függvényeket - # (vagyis függvény hívásokat, vagy küldést végző függvények) - # három fázisra osztani: + # It is a good guideline to structure functions that interact + # with other contracts (i.e. they call functions or send ether) + # into three phases: # 1. feltételek ellenőrzése # 2. akció végrehajtás (potenciálisan megváltoztatja a feltételeket) # 3. interakció más szerződésekkel @@ -192,23 +203,23 @@ def endAuction(): send(self.beneficiary, self.highestBid) ``` -Ez a példa adhat egy benyomást arról, hogyan néz ki a Vyper szerződés szintaxis. A függvények és a változók részletesebb leírásáért, [nézd meg a dokumentációt](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). +Ez a példa megmutathatja Önnek, hogyan néz ki a Vyper szerződés szintaxisa. A függvények és a változók részletesebb leírásáért [tekintse meg a dokumentációt](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction). ## Yul és Yul+ {#yul} -Ha neked még új az Ethereum és nem programoztál okosszerződés nyelveken, akkor azt javasoljuk, hogy kezdj először a Solidity-vel és a Vyper-rel. Csak akkor kezdj bele a Yul-ba vagy a Yul+-ba, ha már ismered az okosszerződés biztonsági praktikákat és az EVM-mel kapcsolatos munka részleteit. +Ha Önnek új az Ethereum és nem programozott okosszerződésnyelveken, akkor azt javasoljuk, hogy kezdjen először a Solidity-vel és a Vyperrel. Csak akkor kezdjen bele a Yul vagy Yul+ nyelvekbe, ha már ismeri az okosszerződésre vonatkozó biztonsági gyakorlatokat és az EVM-mel kapcsolatos munka részleteit. **Yul** - Haladó nyelv Ethereumra. -- Támogatja az [EVM-et](/developers/docs/evm) és az [eWASM-t](https://github.com/ewasm), ami egy Ethereummal fűszerezett WebAssembly, amit a két platform közös nevezőjének terveztek. -- Jó cél a magas szintű optimizációs szinteknek, melyek az EVM-ből és az eWASM-ból is tudnak profitálni. +- Támogatja az [EVM-et](/developers/docs/evm) és az [Ewasm-ot](https://github.com/ewasm), amely egy Ethereummal fűszerezett WebAssembly, és amelyet a két platform közös nevezőjének terveztek. +- Jó cél a magas szintű optimizációs szinteknek, melyek az EVM és Ewasm platformokból egyaránt tudnak profitálni. **Yul+** -- A Yul egy alacsony szintű, nagy hatékonyságú kiterjesztése. -- Eredetileg az [optimista összegző](/developers/docs/layer-2-scaling/#rollups-and-sidechains) szerződésre lett kifejlesztve. -- A Yul+-ra úgy is tekinthetünk, mint a Yul-nak egy kísérleti fejlesztési javaslatára, melyhez új funkciók tartoznak. +- A Yul alacsony szintű, nagy hatékonyságú kiterjesztése. +- Eredetileg az [optimista összesítéses](/developers/docs/scaling/optimistic-rollups/) szerződésként fejlesztették ki. +- A Yul+ egy kísérleti fejlesztési javaslatként is tekinthető, melyhez új funkciók tartoznak. ### Fontos linkek {#important-links-2} @@ -219,7 +230,7 @@ Ha neked még új az Ethereum és nem programoztál okosszerződés nyelveken, a ### Példa szerződés {#example-contract-2} -Az alábbi egyszerű példa egy hatvány függvényt implementál. A `solc --strict-assembly --bin input.yul` használatával lehet befordítani. Ezt a példát az input.yul fájlnak kell tartalmaznia. +Az alábbi egyszerű példa egy hatványfüggvényt implementál. A `solc --strict-assembly --bin input.yul` használatával lehet befordítani. Ezt a példát az input.yul fájlnak kell tartalmaznia. ``` { @@ -240,36 +251,74 @@ Az alábbi egyszerű példa egy hatvány függvényt implementál. A `solc --str } ``` -Ha már sok tapasztalatod van az okosszerződésekkel, akkor a teljes ERC20 implementáció a Yul-ban [itt érhető el](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example). +Ha már nagy tapasztalatra tett szert az okosszerződésekkel kapcsolatban, akkor a teljes ERC20 implementáció Yul-ban [itt érhető el](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example). + +## Fe {#fe} + +- Statikusan típusos nyelv az Ethereum virtuális géphez (EVM). +- A Python és a Rust inspirálta. +- Lényege, hogy könnyen tanulható, még azoknak a fejlesztőknek is, akiknek új az Ethereum ökoszisztémája. +- A Fe fejlesztése még nagyon korai szakaszban tart, az alfa kiadása 2021. januárban történt. + +### Fontos linkek {#important-links-3} + +- [GitHub](https://github.com/ethereum/fe) +- [Fe bejelentés](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) +- [Fe 2021-es útiterv](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [Fe Discord-csevegés](https://discord.com/invite/ywpkAXFjZH) +- [Fe Twitter](https://twitter.com/official_fe) + +### Példa szerződés {#example-contract-3} + +Ez a példa egy egyszerű szerződés Fe nyelven telepítve. + +``` +type BookMsg = bytes[100] + +contract GuestBook: + pub guest_book: map + + event Signed: + book_msg: BookMsg + + pub def sign(book_msg: BookMsg): + self.guest_book[msg.sender] = book_msg + + emit Signed(book_msg=book_msg) + + pub def get_msg(addr: address) -> BookMsg: + return self.guest_book[addr].to_mem() + +``` ## Hogyan válasszunk {#how-to-choose} Mint minden más programozási nyelvnél, itt is leginkább a megfelelő eszköz kiválasztása a megfelelő munkához, valamint a személyes preferenciák döntenek. -Íme néhány szempont, amelyet érdemes figyelembe venni, ha még nem próbáltad meg egyik nyelvet sem: +Íme néhány szempont, amelyet érdemes figyelembe venni, ha még nem próbálta egyik nyelvet sem: ### Mi a jó a Solidity-ben? {#solidity-advantages} -- Ha kezdő vagy, akkor sok útmutató és tanulási anyag áll rendelkezésedre. További anyagért látogasd meg [Tanulás kódolással](/developers/learning-tools/) szekciót. -- Jó fejlesztői eszközök érhetők el. -- A Solidity-nek nagy a fejlesztői közössége, ami azt jelenti, hogy nagy valószínűséggel gyorsan választ kapsz majd a kérdéseidre. +- A kezdőknek sok útmutató és tanulási anyag áll rendelkezésükre. További anyagért látogasson el a [Tanulás kódolással](/developers/learning-tools/) című részhez. +- Remek fejlesztői eszközök érhetők el. +- A Solidity-nek kiterjedt a fejlesztői közössége, ami azt jelenti, hogy nagy valószínűséggel gyorsan választ kap a kérdéseire. -### Mi a jó a Vyper-ben? {#vyper-advatages} +### Mi a jó a Vyperben? {#vyper-advatages} -- Nagyszerű módszer az okosszerződéseket írni kívánó Python fejlesztők számára. -- A Vyper kevesebb funkcióval rendelkezik, így nagyszerűen lehet az ötleteidből gyorsan prototípust készíteni. -- A Vyper célja, hogy könnyen auditálható és emberek számára olvasható legyen. +- Nagyszerű módszer a Python fejlesztők számára az első okosszerződések megírására. +- A Vyper kevesebb funkcióval rendelkezik, így kiválóan alkalmas arra, hogy az ötleteiből gyorsan prototípust készítsen. +- A Vyper célja, hogy könnyen auditálható és az emberek számára olvasható legyen. -### Mi a jó a Yul-ban és a Yul+-ban? {#yul-advantages} +### Mi a jó a Yul és a Yul+ nyelvekben? {#yul-advantages} - Egyszerűsített és funkcionális alacsony szintű nyelv. -- Közelebb enged a nyers EVM-hez, így könnyebben tudod a szerződéseid gáz felhasználását optimálni. +- Közelebb enged a nyers EVM-hez, így Ön könnyebben tudja a szerződések gázfelhasználását optimalizálni. -## Nyelv összehasonlítások {#language-comparisons} +## Nyelv-összehasonlítások {#language-comparisons} -Az alapvető szintaxis, szerződés életciklus, interfészek, operátorok, adatszerkezetek, függvények, control flow és további szempontok alapján történő összehasonlításért olvasd el a [cheatsheet by Auditless](https://reference.auditless.com/cheatsheet/) cikket +Az alapvető szintaxis, szerződés-életciklus, interfészek, operátorok, adatszerkezetek, függvények, control flow és további szempontok alapján történő összehasonlításért olvassa el a [Puska az Auditless-től](https://reference.auditless.com/cheatsheet/) című cikket ## További olvasnivaló {#further-reading} -- [Solidity szerződés könyvtár az OpenZeppelintől](https://docs.openzeppelin.com/contracts) +- [Solidity szerződéskönyvtár az OpenZeppelintől](https://docs.openzeppelin.com/contracts) - [Solidity egy példa alapján](https://solidity-by-example.org) diff --git a/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md index 74de0385114..6fb27ebd36b 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/libraries/index.md @@ -56,7 +56,7 @@ Egy másik népszerű példa a [SafeMath](https://docs.openzeppelin.com/contract Hogy elősegítsük az [összeilleszthetőséget és az interoperabilitást](/developers/docs/smart-contracts/composability/), az Ethereum közösség számos szabványt vezetett be **ERC-k** formájában. Többet olvashatsz róluk a [szabványok](/developers/docs/standards/) részben. -Amikor egy ERC-t szeretnél betenni a szerződésedbe, célszerű a standard megvalósításokat keresni, ahelyett, hogy megpróbálnád a sajátodat bevezetni. Számos okosszerződés könyvtár tartalmazza a legnépszerűbb ERC-k megvalósításait. Például a mindenütt jelen levő [ERC20 felcserélhető token szabvány](/developers/tutorials/understand-the-erc-20-token-smart-contract/) megtalálható a [HQ20-ben](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys-ben](https://github.com/dapphub/ds-token/) és az [OpenZeppelinen](https://docs.openzeppelin.com/contracts/3.x/erc20). Ezenkívül, egyes ERC-k kanonikus megvalósításokat is biztosítanak az ERC részeként. +Amikor egy ERC-t szeretnél betenni a szerződésedbe, célszerű a standard megvalósításokat keresni, ahelyett, hogy megpróbálnád a sajátodat bevezetni. Számos okosszerződés könyvtár tartalmazza a legnépszerűbb ERC-k megvalósításait. Például a mindenütt jelen levő [ERC20 felcserélhető tokenszabvány](/developers/tutorials/understand-the-erc-20-token-smart-contract/) megtalálható a [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) és [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20) platformon. Ezenkívül, egyes ERC-k kanonikus megvalósításokat is biztosítanak az ERC részeként. Érdemes megemlíteni, hogy egyes ERC-k nem önállóak, hanem kiegészítenek más ERC-ket. Például az [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) kiterjeszti az ERC20-as szabványt a használhatóság javítása érdekében. @@ -102,11 +102,16 @@ Végül, amikor eldöntöd, hogy felveszel-e egy könyvtárat, vedd figyelembe a - [GitHub](https://github.com/HQ20/contracts) +**thirdweb Solidity SDK –** **_Olyan eszközöket biztosít, melyekkel hatékonyan lehet személyre szabott okosszerződéseket létrehozni_** + +- [Dokumentáció](https://portal.thirdweb.com/solidity/) +- [GitHub](https://github.com/thirdweb-dev/contracts) + ## Kapcsolódó útmutatók {#related-tutorials} -- [Biztonsági megfontolások Ethereum fejlesztőknek](/developers/docs/smart-contracts/security/) _– Egy biztonsági megfontolásokról szóló útmutató okosszerződés fejlesztéshez könyvtár használattal._ -- [Az ERC-20 token okosszerződés megértése](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _-Útmutató az ERC20 szabványról több könyvtáron keresztül._ +- [Security considerations for Ethereum developers](/developers/docs/smart-contracts/security/) _– Egy biztonsági megfontolásokról szóló útmutató okosszerződés-fejlesztéshez könyvtárhasználattal._ +- [Az ERC-20 tokenes okosszerződés megértése](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _-Útmutató az ERC20 szabványról több könyvtáron keresztül._ ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +_Van olyan közösségi erőforrása, amely segített Önnek? Szerkessze ezt az oldalt, és adja hozzá!_ diff --git a/public/content/translations/hu/developers/docs/smart-contracts/security/index.md b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md new file mode 100644 index 00000000000..37c84656cdb --- /dev/null +++ b/public/content/translations/hu/developers/docs/smart-contracts/security/index.md @@ -0,0 +1,555 @@ +--- +title: Okosszerződés biztonság +description: Útmutató a biztonságos Ethereum-okosszerződések építéséhez +lang: hu +--- + +Az okosszerződések rendkívüli módon rugalmasak és képesek nagy mennyiségű értéket és adatot irányítani, miközben egy megváltoztathatatlan logika alapján, a blokkláncra telepített kód szerint futnak. Ezáltal létrejött a bizalmat nem igénylő és decentralizált alkalmazások élénk ökoszisztémája, mely számos előnyt kínál a hagyományos rendszerekkel szemben. Emellett lehetőséget is jelentenek a támadók számára, akik abból akarnak nyereséget szerezni, hogy kihasználják az okosszerződések gyenge pontjait. + +A nyilvános blokkláncok, mint az Ethereum, tovább bonyolítják az okosszerződések biztosításának problémáját. A telepített szerződéskód _általában_ nem módosítható, hogy ezzel a biztonsági kockázatokat elkerüljék, eközben az okosszerződésekből ellopott eszközöket rendkívül nehéz lekövetni és a legtöbb esetben visszaszerezhetetlenek a megváltoztathatatlanság miatt. + +Bár a számok változnak, de úgy becsülik, hogy a biztonsági hibák miatt az okosszerződésből ellopott vagy onnan elvesztett értékek teljes összege könnyen meghaladhatja az 1 milliárd dollárt is. Ez magába foglal olyan nagy horderejű incidenseket is, mint amilyen a [DAO-hackelés volt](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3,6 millió ETH-t loptak, ami meghaladja az 1 milliárd dollárt mai áron), [Parity több aláírásos tárca hackelését](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach) (30 millió USD-t veszett el), és a [Parity befagyasztott tárcaproblémát](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (300 millió USD-nyi ETH örökre elérhetetlenné vált). + +Ezek az esetek kötelezővé teszik a fejlesztők számára, hogy folyamatosan azon dolgozzanak, hogy az okosszerződések biztonságosak, robusztusak és ellenállók legyenek. Az okosszerződésbiztonság komoly téma, melyet minden fejlesztőnek a maga érdekében meg kell ismerni. Ez az útmutató lefedi azokat a biztonsági megfontolásokat, amelyek az Ethereum-fejlesztőknek fontosak, és forrásokat tár fel az okosszerződésbiztonság továbbfejlesztésére. + +## Előfeltételek {#prerequisites} + +Tisztában kell lennie az [okosszerződés-fejlesztés alapjaival](/developers/docs/smart-contracts/), mielőtt a biztonsági kérdésekkel foglalkozna. + +## Iránymutatások a biztonságos Ethereum-okosszerződések építéséhez {#smart-contract-security-guidelines} + +### 1. Tervezzen megfelelő hozzáférés-szabályozást {#design-proper-access-controls} + +Az okosszerződésekben a `public` (publikus) vagy `external` (külső) jelölésű függvényeket bármelyik külső tulajdonú számla (EOA) vagy szerződésszámla meghívhatja. A függvényeket szükséges nyilvánossá tenni, ha Ön azt akarja, hogy mások interakcióba lépjenek a szerződésével. A `private` (privát) jelölésű függvényeket csak az okosszerződésen belüli függvények hívhatják meg, külső számlák nem. Problémás lehet az összes hálózati résztvevőnek hozzáférést adni bizonyos szerződésfüggvényekhez, főleg ha így bárki végrehajthat fontos műveleteket (pl. új tokenek kibocsátása). + +Ahhoz, hogy megakadályozzuk az okosszerződés függvényeinek nem hitelesített használatát, biztonságos hozzáférés-szabályozásra van szükség. A hozzáférés-szabályozás mechanizmusai az okosszerződés bizonyos függvényeinek használatát a jóváhagyott entitások csoportjára, például a szerződés kezeléséért felelős számlákra korlátozzák. A **tulajdonosi minta** és a **szerepalapú irányítás** két hasznos minta az okosszerződésben beállítható hozzáférés-szabályozásra: + +#### Tulajdonosi minta (ownable pattern) {#ownable-pattern} + +A tulajdonosi mintában beállítható egy cím, mint a szerződés „tulajdonosa” a szerződés létrehozása folyamán. A védett függvényekhez hozzárendelnek egy `OnlyOwner`-módosítót, így a szerződés azonosítani fogja az identitását a hívást végző címnek, mielőtt végrehajtaná a függvényt. A védett függvények meghívását csak akkor engedi, ha az a szerződés tulajdonosának címéről érkezik, különben elveti azt, megakadályozva az akaratlan hozzáférést. + +#### Szerepalapú hozzáférés-szabályozás {#role-based-access-control} + +Ha az okosszerződésben egyetlen címet regisztrálnak, mint `Owner` (tulajdonos), az a centralizáció kockázatát hordozza és felmerül az egyetlen meghibásodási pont lehetősége. Ha a tulajdonos számlakulcsa nyilvánossá válik, akkor a támadók hozzáférhetnek ehhez a tulajdonolt szerződéshez. Emiatt jobb opció lehet a szerepalapú hozzáférés-szabályozás mintája, ahol több adminisztratív számla van. + +A szerepalapú hozzáférés-szabályozásban a fontos függvényekhez való hozzáférést elosztják a megbízott résztvevők között. Például az egyik számla felel a tokenek kibocsátásáért, miközben egy másik számla frissítéseket végez vagy megállítja a szerződést. A decentralizált hozzáférés-szabályozás ily módon kivédi az egyetlen meghibásodási pont lehetőségét és csökkenti a felhasználók részéről igényelt bizalmat. + +##### Több aláírásos tárca használata + +A biztonságos hozzáférés-szabályozásra egy másik megközelítés a [több aláírásos számla](/developers/docs/smart-contracts/#multisig) használata, ami a szerződést kezeli. Az általános külső tulajdonú számlához (EOA) képest a több aláírásos számlákat több entitás birtokolja, és a tranzakciók végrehajtásához egy adott számú aláírásra van szükség, például 5-ből 3-ra. + +Ennek használata egy újabb biztonsági réteget vezet be, mivel a szerződésen végrehajtandó akciókba több félnek is bele kell egyeznie. Ez különösen hasznos, ha a tulajdonosi mintát (ownable pattern) kell használni, mert még nehezebb a támadó vagy egy rosszhiszemű belső fél számára, hogy rossz célokra használja fel a fontos szerződésfüggvényeket. + +### 2. Használja a require(), assert() és revert() parancsokat, hogy óvja a szerződés működését {#use-require-assert-revert} + +Amint az okosszerződés telepítésre kerül a blokkláncon, bárki meg tudja hívni a benne lévő publikus függvényeket. Mivel nem lehet tudni előre, hogy a külső tulajdonú számlák hogyan fognak interakciókat folytatni a szerződéssel, ezért ideális esetben belső óvintézkedéseket kell tenni a problémás működésekkel kapcsolatban a telepítés előtt. Az okosszerződésben elő lehet írni a megfelelő viselkedést a `require()`, `assert()` és `revert()` parancsokkal, hogy ha bizonyos feltételek nem teljesülnek, akkor leálljon és visszaforgassa a változásokat. + +**`require()`**: a `require` (szükséges) parancsot a függvények elején kell meghatározni, és biztosítja, hogy a megadott feltételek teljesülnek, mielőtt a függvény végrehajtásra kerül. A `require` parancs révén validálni lehet a felhasználó által adott adatokat, ellenőrizhetők az állapotváltozók, vagy hitelesíteni lehet a meghívó számla identitását, mielőtt a függvény elindulna. + +**`assert()`**: az `assert()` (állítás) parancsot a belső hibák felderítésére használják, illetve a kódban lévő „konstansok” megsértését ellenőrzik ezáltal. A konstans egy logikai állítás a szerződés státuszáról, amelynek teljesülnie kell minden függvénymeghívás esetén. Például egy tokenszerződés maximális teljes kínálata vagy egyenlege. Az `assert()` használata biztosítja, hogy a szerződés nem kerül sebezhető státuszba, és ha mégis, akkor az állapotváltozók visszaállnak a korábbi értékekre. + +**`revert()`**: a `revert()` (visszatér) kódot egy if-else parancsban használhatjuk, ami egy kivételt ad, ha a szükséges feltételek nem teljesülnek. Az alábbi példaszerződés a `revert()` kódot arra használja, hogy védje a függvények végrehajtását: + +``` +pragma solidity ^0.8.4; + +contract VendingMachine { + address owner; + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("Not enough Ether provided."); + // Perform the purchase. + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); + + payable(msg.sender).transfer(address(this).balance); + } +} +``` + +### 3. Tesztelje az okosszerződéseket és ellenőrizze a kód helyességét {#test-smart-contracts-and-verify-code-correctness} + +Az [Ethereum virtuális gépen](/developers/docs/evm/) érvényes kódváltoztathatatlanság miatt az okosszerződéseknél jelentős minőség-ellenőrzésre van szükség a fejlesztési időszakban. Tesztelje szerződését kiterjedt módon, és figyelje meg, hogy kap-e váratlan eredményeket, így fejlesztheti a biztonságot és megvédheti a felhasználókat hosszú távon is. + +Ennek megszokott módja, hogy kicsi egységteszteket ír tesztadattal, melyet a szerződés a felhasználóktól kapna. Az [egységtesztelés](/developers/docs/smart-contracts/testing/#unit-testing) arra jó, hogy bizonyos függvények működését kipróbálja, és így biztosítja, hogy az okosszerződés az elvárt módon működik. + +Sajnos az egységtesztelés minimálisan növeli az okosszerződés biztonságát, ha azt izolációban használják. Az egységteszt megmutathatja, hogy egy függvény megfelelően működik-e a tesztadatokra, de csak annyira hatásos, amennyire jó tesztet írnak hozzá. Nehéz beazonosítani a kimaradt eseteket és sebezhetőségeket, amelyek kompromittálhatják az okosszerződés biztonságát. + +Jobb megközelítés az egységtesztelés tulajdonságalapú teszteléssel (property-based testing) való kombinálása, amely [statikus és dinamikus elemzést](/developers/docs/smart-contracts/testing/#static-dynamic-analysis) használ. A statikus elemzés olyan alacsony szintű reprezentációkon alapul, mint amilyen a [kontrollfolyamat-grafikon](https://en.wikipedia.org/wiki/Control-flow_graph) és az [absztrakt szintaxisfák](https://deepsource.io/glossary/ast/), hogy elemezze az elérhető programstátuszokat és végrehajtási utakat. A dinamikus elemzési technikák, mint a fuzzing, a szerződéskódot véletlenszerű értékekkel hajtják végre, hogy feltárják azokat a működéseket, amelyek nem felelnek meg a biztonsági tulajdonságoknak. + +A [formális ellenőrzés (formal verification)](/developers/docs/smart-contracts/formal-verification) egy másik technika az okosszerződések biztonsági tulajdonságainak igazolására. A megszokott teszteléshez képest a formális ellenőrzés képes egyértelműen bizonyítani, hogy nincsenek hibák az okosszerződésben. Ezt úgy éri el, hogy egy formális specifikációt hoz létre, amely a kívánt biztonsági tulajdonságokat rögzíti, majd bizonyítja, hogy a szerződések formális modellje megfelel ennek a specifikációnak. + +### 4. Kérjen egy független átvizsgálást a kódjára {#get-independent-code-reviews} + +Miután tesztelte a szerződését, kérjen meg másokat is, hogy ellenőrizzék le a kódot a lehetséges biztonsági problémák szempontjából. A tesztelés nem tárja fel az okosszerződés minden hibáját, de egy független vizsgálat megnöveli annak valószínűségét, hogy kiderülnek a sebezhető pontok. + +#### Auditok {#audits} + +Az okosszerződés auditálása az egyik módja a független kódvizsgálatnak. Az auditorok fontos szerepet játszanak abban, hogy az okosszerződések biztonságosak legyenek és ne legyenek bennük minőségi és tervezési hibák. + +Mindazonáltal fontos megjegyezni, hogy az audit nem old meg minden problémát. Az okosszerződés-auditok nem tárnak fel minden egyes hibát, és a terv általában egy második körös ellenőrzés, hogy azokat a problémákat kiszúrja, ami a fejlesztőknek nem vált világossá a fejlesztés és tesztelés során. Kövesse a [bevált gyakorlatokat az auditorokkal való munka kapcsán](https://twitter.com/tinchoabbate/status/1400170232904400897), mint amilyen a kód megfelelő dokumentálása és a sorokhoz kapcsolt kommentek, amelyek révén az okosszerződés-auditból a lehető legtöbb előnyt ki lehet hozni. + +#### Hibavadászatok {#bug-bounties} + +Egy másik megoldás lehet a hibavadászat-program felállítása, amellyel külsődleges kódvizsgálatot lehet végezni. A hibavadászat pénzügyi jutalommal jár olyan egyéneknek (általában fehérkalapos hackereknek), akik sebezhető pontokat fedeznek fel az alkalmazásban. + +Ez a jutalom a hibavadászatért, ha megfelelően használják, kellő motivációt jelenthet a hackerközösség bizonyos tagjai számára, hogy átnézzék az Ön kódját is kritikus hibákat keresve. Valós példa lehet a „végtelen mennyiségű pénz hiba”, ami egy támadónak lehetővé teszi, hogy határtalan mennyiségű ethert hozzon létre az [Optimism-mal](https://www.optimism.io/), egy [második blokkláncréteg (L2)](/layer-2/) protokollal az Ethereumon. Szerencsére egy fehérkalapos hacker [felfedezte a hibát](https://www.saurik.com/optimism.html) és értesítette a csapatot, [amelyet jelentős pénzösszeggel jutalmaztak](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/). + +Hasznos stratégia lehet, ha a kifizetés összegét arányosan kezelik a hiba által veszélybe kerülő pénzeszközök értékével. Ezt „[skálázódó hibavadászatnak](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)” is nevezhetjük, ami pénzügyi motivációt ad az egyéneknek, hogy inkább feltárják a gyenge pontokat és ne kihasználják azokat. + +### 5. Kövesse a bevált gyakorlatokat az okosszerződésfejlesztés során {#follow-smart-contract-development-best-practices} + +Az auditok és hibavadászatok nem csökkentik az Ön felelősségét, hogy jó minőségű kódot írjon. A megfelelő okosszerződés-biztonság azzal kezdődik, hogy megfelelő tervezési és fejlesztési folyamatokat követ: + +- Tárolja az összes kódot egy verziókövető rendszerben, mint amilyen a git + +- Minden kódmódosítást pull requesteken (változtatási kérelem) keresztül végezzen + +- A pull requesteknek legalább egy független ellenőrzője legyen – ha Ön egyedül dolgozik egy projekten, akkor fontolja meg, hogy más fejlesztőkkel összefogva elvégzik egymás számára a kódellenőrzéseket + +- Használjon [fejlesztői környezetet](/developers/docs/frameworks/) az okosszerződések tesztelésére, átfordítására és telepítésére + +- Futtassa le a kódját olyan alapvető kódelemző eszközökön, mint a Mythril és a Slither. Ideális esetben ezt minden egyes pullrequest-beolvasztás előtt meg kell tenni, majd összehasonlítani az eredmények különbségeit + +- Biztosítsa, hogy a kód hibák nélkül kerül átfordításra, és a Solidity átfordító nem ad figyelmeztetéseket + +- Dokumentálja megfelelően a kódot (a [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html) használatában), és magyarázza el a részleteket a szerződés architektúrájáról egyszerű nyelven. Ezáltal könnyebb lesz másoknak auditálni és ellenőrizni a kódot. + +### 6. Vezessen be komoly leállást követő helyreállítási tervet {#implement-disaster-recovery-plans} + +A biztonságos hozzáférés-szabályozási terv, a függvénymódosítók bevezetése és más javaslatok fejlesztik az okosszerződés biztonságát, de nem zárhatják ki a lehetőségét egy ártó szándékú támadásnak. A biztonságos okosszerződés építése megkívánja azt is, hogy „felkészüljön a hibára”, és kidolgozzon egy tervet, amely alapján hatásosan tud reagálni egy támadásra. Egy megfelelő hibát vagy leállást követő helyreállítási terv (disaster recovery plan) a következő komponensek néhány vagy összes elemét tartalmazza: + +#### Szerződésfrissítések {#contract-upgrades} + +Miközben az Ethereum-okosszerződések alapvetően megváltozhatatlanok, mégis el lehet érni egy bizonyos fokú változtathatóságot a frissítési minták alkalmazásával. A szerződések frissítése elkerülhetetlen ha egy kritikus hiba miatt a régi szerződés használhatatlan lesz, és az új logika bevezetése a legjobb megoldás. + +A szerződésfrissítési mechanizmusok másképp működnek, de a „proxyminta” az egyik legnépszerűbb megközelítés az okosszerződések frissítésére. A proxyminta _két_ szerződésre választja szét az alkalmazás státuszát és logikáját. Az első szerződés (a proxyszerződés) tárolja az állapotváltozókat (például a felhasználó egyenlegét), miközben a második szerződés (a logikaszerződés) tartalmazza a szerződés függvényeinek végrehajtási kódját. + +A számlák a proxyszerződéssel kerülnek interakcióba, amely elküldi a függvénymeghívásokat a logikaszerződésbe a [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) kódot, egy alacsony szintű meghívást használva. A `delegatecall()` a megszokott üzenethíváshoz képest biztosítja, hogy a kód a logikaszerződés címén lefut a meghívó szerződés kontextusában. Tehát a logikaszerződés mindig a proxy tárhelyére ír (nem a sajátjába) és megőrzi a `msg.sender` és `msg.value` eredeti értékeit. + +Ahhoz, hogy hívást lehessen delegálni a logikai szerződésnek, a címét el kell tárolni a proxyszerződés tárhelyén. Tehát a szerződés logikáját úgy lehet frissíteni, hogy egy új logikai szerződést kell telepíteni és eltárolni az új címet a proxyszerződésben. Mivel az ezt követő hívások a proxyszerződés felől automatikusan az új logikaszerződéshez kerülnek átirányításra, a kód változtatása nélkül végülis „frissítésre” kerül a szerződés. + +[Bővebben a szerződések frissítéséről](/developers/docs/smart-contracts/upgrading/). + +#### Vészleállítások {#emergency-stops} + +Ahogy már említettük, sem a kiterjedt audit, sem a tesztelés nem képes felfedezni az okosszerződés összes hibáját. Ha a telepítés után sebezhető pont jelenik meg a kódjában, akkor azt nem lehet kijavítani, mert a szerződés címén futó kód megváltoztathatatlan. Emellett a frissítési mechanizmust (például a proxymintákat) időbe telik bevezetni (gyakran több jóváhagyást is igényelnek), ami csak időt ad a támadóknak, hogy több kárt okozzanak. + +A radikális megoldás egy „vészleállítás” bevezetése, ami blokkolja azokat a hívásokat, melyek a szerződés sérülékeny függvényeire vonatkoznak. A vészleállítás általában a következő komponensekből áll: + +1. Egy globális boolean változó, mely jelzi, ha az okosszerződés leállított állapotban van vagy nem. Ezt a változót `false` értékre állítják a szerződés telepítésekor, de átvált `true` értékre, amint a szerződés leáll. + +2. Függvények, melyek a boolean-változóra hivatkoznak a végrehajtásuk során. Ezek a függvények akkor érhetők el, amikor az okosszerződés nincs leállítva, és elérhetetlenné válnak, amikor a vészleállítás megtörténik. + +3. Egy entitás, amelynek hozzáférése van a vészleállítási funkcióhoz, és a boolean változót `true` értékre állítja. Az esetleges visszaélés miatt ezt a funkciót csak egy megbízott cím hívhatja meg (például a szerződés tulajdonosa). + +Amint a szerződés aktiválja a vészleállást, bizonyos függvényeket nem lehet meghívni. Ezt úgy érik el, hogy a select függvényeket becsomagolják egy módosítóba, amely a globális változóra hivatkozik. Alább [egy példa](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol) látható, amely ennek a mintának a szerződésbe való bevezetését mutatja be: + +```solidity +// This code has not been professionally audited and makes no promises about safety or correctness. Use at your own risk. + +contract EmergencyStop { + + bool isStopped = false; + + modifier stoppedInEmergency { + require(!isStopped); + _; + } + + modifier onlyWhenStopped { + require(isStopped); + _; + } + + modifier onlyAuthorized { + // Check for authorization of msg.sender here + _; + } + + function stopContract() public onlyAuthorized { + isStopped = true; + } + + function resumeContract() public onlyAuthorized { + isStopped = false; + } + + function deposit() public payable stoppedInEmergency { + // Deposit logic happening here + } + + function emergencyWithdraw() public onlyWhenStopped { + // Emergency withdraw happening here + } +} +``` + +Ez a példa a vészleállás alapvető jellemzőit ismerteti: + +- Az `isStopped` egy boolean, melynek értéke `false` az elején és `true`, amikor a szerződés vészmódba lép. + +- Az `onlyWhenStopped` és `stoppedInEmergency` függvénymódosítók ellenőrzik az `isStopped` változót. A `stoppedInEmergency` azokat a függvényeket kontrollálja, amelyeknek elérhetetlennek kell maradniuk, amikor a szerződés sebezhető (például a `deposit()`). Az ezekre a függvényekre vonatkozó hívások egyszerűen visszafordulnak. + +Az `onlyWhenStopped` azokhoz a függvényekhez használandó, amelyek vészhelyzetben is elérhetők (például az `emergencyWithdraw()`). Ezek a függvények segíthetnek megoldani a helyzetet, ezért nem részei a „korlátozott függvények” listájának. + +A vészleállítási lehetőség egy hatásos hézagpótlás ahhoz, hogy a fejlesztő a komoly sebezhetőségeket kezelni tudja az okosszerződésében. Ugyanakkor a felhasználóktól több bizalmat igényel a fejlesztők felé, hogy nem használják ki ezt a funkciót önös érdekeikre. Erre lehetséges megoldást jelenthet a vészleállítás decentralizált kontrollja, mint például egy láncon belüli szavazás, időzár alkalmazása vagy egy több aláírásos tárca általi jóváhagyás. + +#### Eseményfigyelés {#event-monitoring} + +Az [események](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) lehetővé teszik az okosszerződéshez érkező hívások trekkelését és az állapotváltozók változásának felügyeletét. Bevált gyakorlatnak számít, ha az okosszerződés mindig kiad eseményt, amikor valaki egy biztonságkritikus tevékenységet végez (például kiveszi a pénzeszközöket). + +Az események naplózása és felügyelete láncon kívül betekintést enged a szerződés működésébe, valamint az ártalmas tetteket hamarabb fel lehet fedezni általuk. Így a csapat gyorsabban tud reagálni a hackelésre, és azonnal cselekedni tud, hogy a felhasználókat ez ne érintse negatívan, például leállíthatják a függvényeket vagy frissítést indíthatnak el. + +Választhat egy előre összeállított felügyeleti eszközt, amely automatikusan figyelmeztetéseket küld, amikor valaki interakcióba lép az Ön szerződéseivel. Ezek az eszközök segítenek személyre szabott figyelmeztetéseket is létrehozni különféle paraméterek alapján, mint amilyen a tranzakciómennyiség, a függvénymeghívások gyakorisága vagy az érintett függvények. Például beállíthat egy figyelmeztetést, ha a kivett pénzmennyiség egy tranzakcióban egy bizonyos határ felett van. + +### 7. Tervezzen biztonságos irányítási rendszert {#design-secure-governance-systems} + +Talán szeretné, hogy az alkalmazása decentralizált legyen, így a központi okosszerződések kontrollját a közösségi tagoknak adná. Ebben az esetben az okosszerződés rendszere felölel egy irányítási modult is – egy olyan mechanizmust, amellyel a közösségi tagok jóváhagyhatnak adminisztratív változásokat egy láncon belüli irányítási rendszer segítségével. Például azt a javaslatot, hogy a proxyszerződést egy új verzióra frissítsék, megszavaztathatja a tokennel rendelkező felhasználókkal. + +A decentralizált irányítás előnyös lehet, főleg mivel összeegyezteti a fejlesztők és a felhasználók érdekeit. Mindazonáltal az okosszerződés irányításimechanizmusa új kockázatokat is jelenthet, ha nem megfelelően vezetik be. Kézenfekvő probléma, ha egy támadó nagyon magas szavazatierőt szerez (amit az általa birtokolt tokenek száma ad) azáltal, hogy [villámhitelt](/defi/#flash-loans) vesz fel, majd egy ártó változásra tesz javaslatot. + +A láncon működő irányítási modell problémáit meg lehet oldani az [időzár használatával](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/) is. Az időzár megakadályozza, hogy az okosszerződés végrehajtson bizonyos műveleteket addig, amíg nem telt el egy adott idő. Más stratégia lehet a tokenekhez rendelt „szavazati súly” az alapján, hogy azt mennyi időre kötötték le, vagy egy adott cím szavazati erejét hosszabb periódusra is nézhetik (például 2–3 korábbi blokkra) a jelenlegi blokk helyett. Ezek csökkentik a lehetőségét annak, hogy valaki gyorsan jelentős szavazati erőre tegyen szert, hogy a láncon zajló szavazást eltérítse. + +Bővebben a [biztonságos irányítási rendszerek tervezése](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/) és a [különféle szavazási mechanizmusok a DAO-knál](https://hackernoon.com/governance-is-the-holy-grail-for-daos) témákról. + +### 8. Csökkentse a kód komplexitását a minimumra {#reduce-code-complexity} + +A hagyományos szoftverfejlesztők elve az, hogy a lehető legegyszerűbb legyen a kód (KISS-elv), és így nem vezetnek be fölösleges bonyolításokat a tervben. Ennek alapja az az elgondolás, hogy az „összetett rendszerek összetett módokon vallhatnak kudarcot”, és sokkal hajlamosabbak a költséges hibákra. + +A minél egyszerűbb megközelítés kiemelten fontos az okosszerződések írásánál is, mivel ezek nagy értékeket is kontrollálhatnak. Ennek eléréséhez érdemes létező könyvtárakat használni, mint amilyen az [OpenZeppelin szerződések](https://docs.openzeppelin.com/contracts/4.x/), amikor ez lehetséges. Mivel ezeket a könyvtárakat a fejlesztők már alaposan tesztelték, auditálták, így kisebb a hiba valószínűsége, mintha a nulláról kell megírni egy új funkcionalitást. + +Másik követendő tanács az, hogy rövid függvényeket kell írni és a szerződést modulárisan kell felállítani, az üzleti logikát több szerződés között felosztva. Az egyszerű kódok írása kevesebb teret ad a támadásra, emellett a teljes rendszer helyességét is jobban lehet igazolni, és a lehetséges tervezési hibák is korán kiderülhetnek. + +### 9. Védekezzen az okosszerződés általános sebezhetőségei ellen {#mitigate-common-smart-contract-vulnerabilities} + +#### Újrabelépés {#reentrancy} + +Az EVM nem engedi a párhuzamosságot, tehát két szerződés egy üzenethívásban nem futhat egyszerre. Egy külső hívás megállítja a meghívó szerződés végrehajtását és memóriáját addig, amíg a hívás vissza nem tér, amikor is a végrehajtás normálisan megtörténik. Ezt a folyamatot hivatalosan úgy nevezik, hogy a [kontrollfolyamat](https://www.computerhope.com/jargon/c/contflow.htm) átadása egy másik szerződésnek. + +Habár általában nem jelent problémát, a kontrollfolyamat nem megbízható szerződéseknek való átadása okozhat némi gondot, például az újrabelépés lehetőségét. Újrabelépéses támadás akkor történik, amikor egy ártó szerződés visszahívást csinál egy sebezhető szerződésbe mielőtt az eredeti függvény meghívása lezárulna. Ezt a támadási fajtát a következő példával jobban elmagyarázzuk. + +Vegyünk egy egyszerű okosszerződést („áldozat/victim”), ami megengedi, hogy bárki ethert helyezzen letétbe és vegyen ki: + +```solidity +// This contract is vulnerable. Do not use in production + +contract Victim { + mapping (address => uint256) public balances; + + function deposit() external payable { + balances[msg.sender] += msg.value; + } + + function withdraw() external { + uint256 amount = balances[msg.sender]; + (bool success, ) = msg.sender.call.value(amount)(""); + require(success); + balances[msg.sender] = 0; + } +} +``` + +Ez a szerződés elérhetővé teszi a `withdraw()` (kivétel) függvényt a felhasználóknak, hogy a korábban letétbe helyezett ETH-t ki tudják venni. Amikor egy ilyen kivétel történik, a szerződés a következő műveleteket hajtja végre: + +1. Ellenőrzi a felhasználó ETH-egyenlegét +2. Pénzeszközt küld a meghívó címére +3. Átállítja az egyenleget 0-ra, hogy ne lehessen kivenni innen pénzt + +A `withdraw()` függvény az `victim` (áldozat) szerződésében tehát egy „ellenőrzés-interakciók-eredmény” mintát követ. _Ellenőrzi_, hogy a végrehajtáshoz szükséges feltételek teljesülnek-e (a felhasználónak pozitív ETH-egyenlege van) és elvégzi az _interakciót_ azáltal, hogy ETH-t küld a meghívó címére, majd a tranzakció _eredményeit_ alkalmazza (lecsökkenti a felhasználó egyenlegét). + +Ha a `withdraw()` kódot egy külső tulajdonú számláról (EOA) hívják meg, akkor a vártnak megfelelően megy végbe: `msg.sender.call.value()` ETH-t küld a meghívónak. Azonban, ha a `msg.sender` egy okosszerződéses számla, ami meghívja a `withdraw()` kódot, akkor a `msg.sender.call.value()` révén indított pénzküldés szintén beindítja a címen tárolt programkódot. + +Tegyük fel, hogy a szerződéscímen ez a kód van telepítve: + +```solidity + contract Attacker { + function beginAttack() external payable { + Victim(victim_address).deposit.value(1 ether)(); + Victim(victim_address).withdraw(); + } + + function() external payable { + if (gasleft() > 40000) { + Victim(victim_address).withdraw(); + } + } +} +``` + +Ez a szerződés három dolgot csinál: + +1. Letétet fogad el egy másik számlától (valószínűleg a támadó/attacker EOA-ja) +2. Letétbe helyez 1 ETH-t az áldozat szerződésében +3. Kivesz 1 ETH-t, amelyet az okosszerződés tárol + +Ebben még nincs semmi rossz, viszont a `attacker` (támadó) szerződésben van egy másik függvény is, amely meghívja a `withdraw()` kódot a `victim` (áldozat) esetében újra, ha a maradék gáz a bejövő `msg.sender.call.value` esetén több mint 40 000. Ezáltal a `attacker` újra beléphet az `victim` szerződésbe és kivehet több pénzt _mielőtt_ a `withdraw` (kivétel) első meghívása lezárulna. A ciklus így néz ki: + +```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 +``` + +Összességében, mivel a meghívó egyenlege nem lesz 0 mindaddig, amíg a függvényvégrehajtás nem zárul le, a rákövetkező meghívások sikeresek lesznek, és megengedik a meghívónak, hogy kivegye az egyenlegét többször is. Ez a támadás alkalmas arra, hogy egy okosszerződés pénzeszközeit kifolyassák, ahogy az a [2016-os DAO hackelésnél](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/) megtörtént. Az újrabelépéses támadás még mindig kritikus probléma az okosszerződéseknél, ahogy azt az [újrabelépéses támadások nyilvános listája](https://github.com/pcaversaccio/reentrancy-attacks) mutatja. + +##### Hogyan lehet megakadályozni egy újrabelépéses támadást + +Az újrabelépés ellen az [ellenőrzés-eredmények-interakciók mintát](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern) lehet alkalmazni. Ez a minta a függvények végrehajtását úgy rendezi, hogy az a kód jön először, amely a szükséges ellenőrzéseket végzi, azután a szerződés státuszát változtatják meg, végül a más szerződésekkel vagy külső tulajdonú számlákkal (EOA) való interakció következik. + +Az ellenőrzés-eredmények-interakciók minta a következőképpen néz ki a `victim` (áldozat) szerződésének új verziójában: + +```solidity +contract NoLongerAVictim { + function withdraw() external { + uint256 amount = balances[msg.sender]; + balances[msg.sender] = 0; + (bool success, ) = msg.sender.call.value(amount)(""); + require(success); + } +} +``` + +Ez a szerződés _ellenőrzi_ a felhasználó egyenlegét, érvényesíti a `withdraw()` függvény _eredményét_ (azáltal, hogy az egyenleget 0-ra állítja), és végül elvégzi az _interakciót_ (ETH-t küld a felhasználó címére). Ezáltal a szerződés először befrissíti a tárolt adatot, és csak utána végzi a külső hívást, így nincs lehetőség az újrabelépésre, mint korábban. Az `attacker` szerződés még mindig vissza tudja hívni a `NoLongerAVictim` (nem áldozat) szerződést, de mivel a `balances[msg.sender]` (egyenlege) már 0, a többi kivétel hibára fut. + +Másik lehetőség egy kölcsönös kizárás (más néven mutex), amely lezárja a szerződés státuszának egy részét addig, amíg a függvénymeghívás teljesül. Ezt egy boolean változóval lehet bevezetni, ami először `true` (igaz) a függvényvégrehajtás előtt, majd `false` (hamis) lesz a meghívás befejeztével. Ahogy az alábbi példából látszik, a mutex használata megvédi a függvényt attól, hogy újra meghívják, miközben az eredeti meghívás még zajlik, így hatásosan kivédi az újrabelépést. + +```solidity +pragma solidity ^0.7.0; + +contract MutexPattern { + bool locked = false; + mapping(address => uint256) public balances; + + modifier noReentrancy() { + require(!locked, "Blocked from reentrancy."); + 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 + function withdraw(uint _amount) public payable noReentrancy returns(bool) { + require(balances[msg.sender] >= _amount, "No balance to withdraw."); + + balances[msg.sender] -= _amount; + bool (success, ) = msg.sender.call{value: _amount}(""); + require(success); + + return true; + } +} +``` + +Továbbá a [„fizetéskérés”](https://docs.openzeppelin.com/contracts/4.x/api/security#PullPayment) rendszere is használható, amelynél a felhasználó vesz ki pénzt az okosszerződésből ahelyett, hogy a szerződés „fizetésküldést” végezne a számlák felé. Így nem lehet véletlenül elindítani egy kódot ismeretlen címeken (és bizonyos szolgálatmegtagadási támadásokat is ki tud védeni). + +#### Egész szám túlfolyása lefelé vagy felfelé {#integer-underflows-and-overflows} + +Egy egész szám akkor folyik túl felfelé, amikor egy aritmetikai művelet eredménye kívül esik az elfogadható tartományon, így az „tovább gördül” a legalacsonyabb megjeleníthető értékre. Például egy `uint8` csak 2^8-1=255 értéket tud tárolni. Az aritmetikai művelet, amelynek eredménye nagyobb mint `255`, túlfolyik és visszaállítja az `uint` kódot `0` értékre, ahhoz hasonlóan, ahogy egy autóban a megtett távolságot mérő óra is 0-ra fordul át, ha elérte a maximális értékét (999 999). + +Az egész szám lefelé való túlfolyása hasonló okokból következik be: az aritmetikai művelet eredménye az elfogadható tartomány alá esik. Tegyük fel, Ön szeretné lecsökkenteni a `0` értéket egy `uint8` típusú mezőben, így az egyszerűen átfordul a maximális megjeleníthető értékre (`255`). + +Mindkét irányú túlfolyás a szerződés állapotváltozóiban váratlan változásokat eredményezhet, így nem tervezett végrehajtást okozhat. Az alábbi példa bemutatja, hogyan tudja egy támadó kihasználni az aritmetikai túlfolyást egy okosszerződésben, hogy érvénytelen műveletet hajtson végre: + +``` +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. + +/* +1. Deploy TimeLock +2. Deploy Attack with address of TimeLock +3. Call Attack.attack sending 1 ether. You will immediately be able to + withdraw your ether. + +What happened? +Attack caused the TimeLock.lockTime to overflow and was able to withdraw +before the 1 week waiting period. +*/ + +contract TimeLock { + mapping(address => uint) public balances; + mapping(address => uint) public lockTime; + + function deposit() external payable { + balances[msg.sender] += msg.value; + lockTime[msg.sender] = block.timestamp + 1 weeks; + } + + function increaseLockTime(uint _secondsToIncrease) public { + lockTime[msg.sender] += _secondsToIncrease; + } + + function withdraw() public { + require(balances[msg.sender] > 0, "Insufficient funds"); + require(block.timestamp > lockTime[msg.sender], "Lock time not expired"); + + uint amount = balances[msg.sender]; + balances[msg.sender] = 0; + + (bool sent, ) = msg.sender.call{value: amount}(""); + require(sent, "Failed to send Ether"); + } +} + +contract Attack { + TimeLock timeLock; + + constructor(TimeLock _timeLock) { + timeLock = TimeLock(_timeLock); + } + + fallback() external payable {} + + function attack() public payable { + timeLock.deposit{value: msg.value}(); + /* + if t = current lock time then we need to find x such that + x + t = 2**256 = 0 + so x = -t + 2**256 = type(uint).max + 1 + so x = type(uint).max + 1 - t + */ + timeLock.increaseLockTime( + type(uint).max + 1 - timeLock.lockTime(address(this)) + ); + timeLock.withdraw(); + } +} +``` + +##### Hogyan akadályozható meg egy egész szám túlfolyása lefelé vagy felfelé + +A 0.8.0 verzió szerint a Solidity átfordító elutasítja azokat a kódokat, amelyek az egész szám túlfolyását eredményezik. Ugyanakkor az alacsonyabb verziójú átfordítóval készült szerződések esetén ellenőrizni kell azokat a függvényeket, amelyek aritmetikai műveleteket hajtanak végre, vagy egy olyan könyvtárat lehet használni (például [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)), amely ellenőrzi a túlfolyásokat. + +#### Orákulum manipulációja {#oracle-manipulation} + +Az [orákulumok](/developers/docs/oracles/) láncon kívüli információkat gyűjtenek és beküldik azokat a láncra, hogy az okosszerződések használhassák. Az orákulumok révén Ön olyan okosszerződéseket tervezhet, amelyek együtt tudnak működni láncon kívüli rendszerekkel, mint a tőkepiacok, ezzel nagy mértékben kiterjesztve az alkalmazási körüket. + +Ha viszont az orákulum korrupttá válik és nem helyes információkat küld a láncra, az okosszerződések hibás bejövő adatok alapján fognak működni, ez pedig problémákat okoz. Ez az „orákulumprobléma” alapja, amely miatt biztosítani kell, hogy a blokklánc-orákulum által adott információ pontos, friss és időben elérhető legyen. + +Az ehhez kapcsolódó biztonsági probléma az, amikor például egy decentralizált tőzsde a láncon belüli orákulumot használja arra, hogy megszerezze egy eszköz azonnali (spot) árát. A kölcsönző platformok a [decentralizált pénzügyek (DeFi)](/defi/) iparágában gyakran csinálják ezt, hogy meghatározzák a felhasználó fedezetének értékét, és ezáltal a kölcsön mértékét. + +A DEX árak gyakran igen pontosak, akár nagy mértékben is, mivel az arbitrázst kihasználók helyreállítják a piacokon az egyensúlyt. Ugyanakkor teret adnak a manipulációra, főleg ha a láncon futó orákulum az eszköz árát a korábbi kereskedelmi minták alapján számolja (ami általában igaz). + +Például egy támadó mesterségesen fel tudja pumpálni egy eszköz azonnali árát azáltal, hogy egy villámkölcsönt vesz fel éppen a kölcsönszerződés megkötése előtt. Ekkor a DEX lekérdezés az eszköz áráról egy magasabb értéket fog mutatni (mivel a támadó nagy összegű vételi igénye elmozdította az eszköz keresletét), így magasabb kölcsönt vehetnek fel, mint amit lehetne. Az ilyen „villámkölcsön-támadások” kihasználták azt, hogy a DeFi alkalmazások az orákulumokra támaszkodnak az árakat tekintve, és így sok milliónyi elveszett pénzeszközt eredményeztek a protokolloknak. + +##### Hogyan lehet elkerülni az orákulummanipulációt + +A minimum követelmény az, hogy decentralizált orákulumhálózatokat kell használni, amelyek több forrásból szerzik be az információkat, így elkerülhető az egyetlen meghibásodási pont lehetősége. A legtöbb esetben a decentralizált orákulumoknak beépített kriptogazdasági ösztönzőik vannak, hogy az orákulum-csomópontok a helyes információt jelentsék, így sokkal biztonságosabbak, mint a centralizált társaik. + +Ha Ön azt tervezi, hogy egy láncon lévő orákulumot kérdez le eszközárakért, akkor használjon olyat, amely idővel súlyozott átlagárat (TWAP) számol. A [TWAP-orákulum](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) egy adott eszköz árát két különböző időpontban (ami módosítható) kérdezi le, és a megszerzett átlaga alapján kalkulálja az azonnali árat. A hosszabb időtartomány használata megvédi a protokollt az ármanipulációtól, mert a közelmúltban végrehajtott nagy rendelések nem befolyásolják az árat. + +## Okosszerződés-biztonsággal kapcsolatos anyagok fejlesztők számára {#smart-contract-security-resources-for-developers} + +### Eszközök az okosszerződések elemzéséhez és a kód helyességének ellenőrzéséhez {#code-analysis-tools} + +- **[Tesztelő eszközök és könyvtárak](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** – _Iparági standard eszközök és könyvtárak gyűjteménye az okosszerződések egységteszteléséhez, valamint a statikus és dinamikus elemzéséhez._ + +- **[Formális ellenőrzési (formal verification) eszközök](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** – _Eszközök arra, hogy ellenőrizzék az okosszerződések funkcionális helyességét és az állandókat._ + +- **[Okosszerződés auditálásra vonatkozó szolgáltatások](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** – _Szervezetek listája, amelyek auditszolgáltatást kínálnak okosszerződésekre az Ethereum fejlesztési projektek számára._ + +- **[Hibavadász platformok](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** – _Platformok a hibavadászatok és a jutalmak koordinálására, hogy azok feltárják az okosszerződésekben lévő kritikus sebezhetőségeket._ + +- **[Fork Checker](https://forkchecker.hashex.org/)** – _Egy ingyenes online eszköz arra, hogy információt kapjon egy elágaztatott szerződésről._ + +- **[ABI Encoder](https://abi.hashex.org/)** – _Egy ingyenes online szolgáltatás a Solidity szerződés függvényeinek és constructor parancsainak kódolására._ + +### Eszközök az okosszerződések felügyeletére {#smart-contract-monitoring-tools} + +- **[OpenZeppelin Defender Sentinels](https://docs.openzeppelin.com/defender/v1/sentinel)** – _Egy eszköz az okosszerződés automatikus felügyeletére, valamint az eseményekre, függvényekre és tranzakcióparaméterekre való válaszadásra._ + +- **[Tenderly Real-Time Alerting](https://tenderly.co/alerting/)** – _Egy eszköz, amellyel valós idejű értesítést kaphat, amikor az okosszerződésén vagy tárcáján szokatlan vagy váratlan események történnek._ + +### Eszközök az okosszerződések biztonságos adminisztrálásához {#smart-contract-administration-tools} + +- **[OpenZeppelin Defender Admin](https://docs.openzeppelin.com/defender/v1/admin)** – _Interfész az okosszerződések adminisztrációjának kezeléséhez, beleértve a hozzáférés-kezelést, frissítéseket és leállítást is._ + +- **[Safe](https://safe.global/)** – _Egy okosszerződéses tárca az Ethereumon, amelynél adott számú embernek jóvá kell hagynia a tranzakciót, mielőtt az megtörténhetne (N számú tagból M-nek)._ + +- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/4.x/)** – _Szerződéskönyvtárak az adminisztrációs jellemzők bevezetésére, beleértve a szerződés tulajdonlását, frissítéseket, hozzáférés-kezelést, irányítást, leállíthatóság és még sok mást._ + +### Okosszerződés auditálására kínált szolgáltatások {#smart-contract-auditing-services} + +- **[ConsenSys Diligence](https://consensys.net/diligence/)** – _Okosszerződés auditálására kínált szolgáltatások, amelyek támogatják a blokklánc-ökoszisztéma projektjeit, hogy a protokolljaik készen állnak-e a bevezetésre és úgy épültek-e meg, hogy védik a felhasználókat._ + +- **[CertiK](https://www.certik.com/)** – _Egy blokkláncbiztonsággal foglalkozó cég, amely úttörőként használja az élvonalbeli formális ellenőrzés technológiáját az okosszerződésekre és a blokklánchálózatokra._ + +- **[Trail of Bits](https://www.trailofbits.com/)** – _Kiberbiztonsági cég, amely kombinálja a biztonsági kutatást és a támadói mentalitást, hogy csökkentse a kockázatot és megerősítse a kódot._ + +- **[PeckShield](https://peckshield.com/)** – _Blokkláncbiztonsággal foglalkozó cég, amely a teljes blokklánc-ökoszisztémához kínál termékeket és szolgáltatásokat a biztonság, adatvédelem és használhatóság területein._ + +- **[QuantStamp](https://quantstamp.com/)** – _Auditszolgáltatás, amely elősegíti a blokklánctechnológia kiterjedt használatát a biztonsági és kockázatelemzési szolgáltatásokkal._ + +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** – _Okosszerződés-biztonsággal foglalkozó cég, amely a megosztott rendszerek számára biztosít biztonsági auditokat._ + +- **[Runtime Verification](https://runtimeverification.com/)** – _Biztonsági cég, amely az okosszerződések formális modellezésére és ellenőrzésére specializálódott._ + +- **[Hacken](https://hacken.io)** – _Web3 kiberbiztonsági auditor, amely 360 fokos megközelítést alkalmaz a blokkláncbiztonságban._ + +- **[Nethermind](https://nethermind.io/smart-contracts-audits)** – _Solidity és Cairo auditszolgáltatások, amelyekkel az okosszerződések integritása, valamint a felhasználók biztonsága is biztosíthat az Ethereumon és a Starkneten._ + +- **[HashEx](https://hashex.org/)** – _A HashEx a blokkláncok és okosszerződések auditálásra szakosodott a kriptovaluták biztonságának biztosítása céljából, illetve olyan szolgáltatásokat nyújt, mint az okosszerződés-fejlesztés, sérülékenység-vizsgálat, blokklánctanácsadás._ + +- **[Code4rena](https://code4rena.com/)** – _Versenyképes auditplatform, amely arra ösztönzi az okosszerződés-biztonsági szakértőket, hogy sebezhetőséget találjanak és segítsenek a web3-at biztonságosabbá tenni._ + +### Hibavadászplatformok {#bug-bounty-platforms} + +- **[Immunefi](https://immunefi.com/)** – _Hibavadászplatform okosszerződésekhez és DeFi-projektekhez, ahol a biztonsági kutatók átnézik a kódot, kizárják a sebezhetőségeket, ezért jutalmat kapnak, és biztonságosabbá teszik a kripto világát._ + +- **[HackerOne](https://www.hackerone.com/)** – _Sebezhetőségi koordináció és hibavadászplatform, amely összeköti a vállalkozásokat a sebezhetőségi tesztelőkkel és kiberbiztonsági kutatókkal._ + +- **[HackenProof](https://hackenproof.com/)** – _Szakértői hibavadászplatform kriptoprojektek (DeFi, okosszerződések, tárcák, CEX stb.) számára, ahol a biztonsági szakértők prioritási sorrendszolgáltatást nyújtanak, a kutatók pedig jutalmat kapnak a releváns, igazolt hibák jelentéséért._ + +### Publikációk az okosszerződések ismert sebezhetőségeiről és azok kihasználásáról {#common-smart-contract-vulnerabilities-and-exploits} + +- **[Consensys: az okosszerződéseket ért ismert támadások](https://consensys.github.io/smart-contract-best-practices/attacks/)** – _Egyszerűen megfogalmazott magyarázat a legkomolyabb sérülékenységekről a szerződésekben, a legtöbb esetben mintakódokkal együtt._ + +- **[SWC Registry](https://swcregistry.io/)** – _A Közös gyengeségek felsorolásának (CWE) gondozott listája, amelyen az Ethereum okosszerződésekre vonatkozó tételek szerepelnek._ + +- **[Rekt](https://rekt.news/)** – _Rendszeresen frissített publikáció a nagy jelentőségű kriptohackelésekről és támadásokról, az esemény után készült részletes riportokkal._ + +### Kihívások az okosszerződés-biztonság elsajátításában {#challenges-for-learning-smart-contract-security} + +- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** – _Blokkláncbiztonsági háborús játékok, kihívások és [szerezd meg a zászlót (Capture The Flag)](https://www.webopedia.com/definitions/ctf-event/amp/) versenyek és megoldások gondozott listája._ + +- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** – _Háborús játék a DeFi okosszerződések támadó biztonságának elsajátításához, valamint készségek fejlesztéséhez a hibavadászatban és a biztonsági auditban._ + +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** – _Web3/Solidity-alapú háborús játék, ahol minden szint egy okosszerződés, amelyet meg kell „hackelni”._ + +### Bevált gyakorlatok az okosszerződések biztonságossá tételére {#smart-contract-security-best-practices} + +- **[ConsenSys: az Ethereum okosszerződés-biztonság bevált gyakorlatai](https://consensys.github.io/smart-contract-best-practices/)** – _Részletes útmutatók az Ethereum-okosszerződések biztonságossá tételére._ + +- **[Nascent: Egyszerű biztonsági eszközrendszer](https://github.com/nascentxyz/simple-security-toolkit)** – _Hasznos biztonságközpontú útmutatók és ellenőrző listák gyűjteménye okosszerződés-fejlesztéshez._ + +- **[Solidity Patterns](https://fravoll.github.io/solidity-patterns/)** – _Biztonsági minták és bevált gyakorlatok hasznos gyűjteménye Solidity programnyelven írt okosszerződésekhez._ + +- **[Solidity Docs: Biztonsági megfontolások](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** – _Útmutatók a biztonságos okosszerződések írásához Solidity nyelven._ + +- **[Smart Contract Security Verification Standard](https://github.com/securing/SCSVS)** – _Egy tizennégy részes ellenőrző lista fejlesztők, architektúrával foglalkozók, biztonság-ellenőrzők és beszállítók számára az okosszerződések biztonságának szabványosításához._ + +### Útmutatók az okosszerződés-biztonságról {#tutorials-on-smart-contract-security} + +- [Hogyan lehet biztonságosabb okosszerződéskódot írni](/developers/tutorials/secure-development-workflow/) + +- [A Slither használata okosszerződés bugok felderítésére](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) + +- [A Manticore használata okosszerződés bugok felderítésére](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) + +- [Smart contract security guidelines](/developers/tutorials/smart-contract-security-guidelines/) + +- [Hogyan lehet biztonságosan integrálni a tokenszerződést tetszőleges tokenekkel](/developers/tutorials/token-integration-checklist/) diff --git a/public/content/translations/hu/developers/docs/storage/index.md b/public/content/translations/hu/developers/docs/storage/index.md index 9e292ea2cee..0d1eda27eee 100644 --- a/public/content/translations/hu/developers/docs/storage/index.md +++ b/public/content/translations/hu/developers/docs/storage/index.md @@ -1,34 +1,209 @@ --- -title: Decentralized Tárhely -description: Áttekintő arról, hogy mi is az a decentralizált tárhely és az elérhető eszközökről, amivel integrálhatod a dappodba. +title: Decentralizált tárhely +description: Áttekintés a decentralizált tárhelyről és az elérhető eszközökről, amellyekkel integrálhatóak a dappokba. lang: hu -incomplete: true -isOutdated: true --- -A központilag elhelyezett, egyetlen vállalat vagy szervezet által működtetett szerverrel szemben a decentralizált tárolórendszerek a felhasználói operátorok peer-to-peer hálózatából állnak, akik az összes adat egy részét tárolják, így egy rugalmas fájltárolási és megosztási rendszert hozva létre. +A központilag elhelyezett, egyetlen vállalat vagy szervezet által működtetett szerverrel szemben a decentralizált tárolórendszerek a felhasználói operátorok peer-to-peer hálózatából állnak, akik az összes adat egy részét tárolják egy rugalmas fájltárolási és -megosztási rendszert létrehozva. Ezek lehetnek blokklánc-alapú alkalmazásokban vagy bármilyen, közvetítő nélküli hálózatokban. + +Magát az Ethereumot is lehet decentralizált tárolórendszerként használni, és úgy is működik, amikor az okosszerződések kódjait kell tárolni. Ugyanakkor az Ethereumot nem arra tervezték, hogy nagy adathalmazokat tároljon. A lánc stabilan növekszik, a jelen írás idején az Ethereum lánc kb. 500 GB – 1TB méretű ([a klienstől függően](https://etherscan.io/chartsync/chaindefault)), és a hálózat minden csomópontjának tárolnia kell ezt az adatmennyiséget. Ha a lánc nagy adatmennyiségre növekedne meg (mondjuk 5 TB méretre), akkor már nem minden csomópont tudna működni. Ezen túl ennyi adat bevitele a főhálózatra is ellehetetlenítő módon drága lenne a [gázdíjak](/developers/docs/gas) miatt. + +Ezen megszorítások miatt egy másik láncra vagy módszerre van szükség, hogy az adatok nagy tömegét decentralizált módon tároljuk. + +Amikor decentralizált tárhely (dStorage) opcióról beszélünk, akkor a felhasználónak néhány dolgot fontos figyelembe vennie. + +- Megtartási mechanizmus / ösztönzési struktúra +- Adatmegtartás kényszere +- Decentralitás +- Konszenzus + +## Megtartási mechanizmus / ösztönzési struktúra {#persistence-mechanism} + +### Blokkláncalapú {#blockchain-based} + +Ahhoz, hogy egy adat örökké létezzen, valamilyen megtartási mechanizmusra van szükség. Például az Ethereumon az a megtartási mechanizmus, hogy a csomópont futtatásánál az egész láncra szükség van. Az új adat a lánchoz kerül, és így az folyamatosan növekszik – az összes csomópontnak replikálnia kell az összes beágyazott adatot. + +Ezt úgy nevezik, hogy **blokkláncalapú** megtartás. + +A blokkláncalapú megtartással az a gond, hogy a lánc túl nagyra nőket, hogy fenntartsa és tárolja az összes adatot (például [számos forrás](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/) úgy becsli, hogy az Internet több mint 40 zettabájt tárhelyet igényel). + +A blokkláncnak emellett valamilyen ösztönzési struktúrát kell alkalmaznia. A blokkláncalapú megtartáshoz a validátorok fizetséget kapnak. Amikor az adat hozzákerül a lánchoz, a validátorok jutalmat kapnak a bekerülés intézéséért. + +Blokkláncalapú megtartással működő platformok: + +- Ethereum +- [Arweave](https://www.arweave.org/) + +### Szerződésalapú {#contract-based} + +A **szerződésalapú** megtartás úgy véli, hogy az adatot nem replikálhatja és tárolhatja örökké minden csomópont, ehelyett inkább szerződéses megállapodással kell azt fenntartani. Ezeket a megállapodásokat számos csomóponttal kötik, amelyek megígérik, hogy egy adott időszakra megtartják az adatot. Ezt vissza kell fizetni vagy meg kell újítani, amikor már nem tartják meg az adatot. + +A legtöbb esetben nem az adatot tárolják a láncon, hanem azt a hasht, ami az adat tárolási helyét mutatja. Így a teljes láncot nem kell skálázni, hogy minden adat elférjen. + +Szerződésalapú megtartással működő platformok: + +- [Filecoin](https://docs.filecoin.io/about-filecoin/what-is-filecoin/) +- [Skynet](https://siasky.net/) +- [Storj](https://storj.io/) +- [0Chain](https://0chain.net/) +- [Crust Network](https://crust.network) +- [Swarm](https://www.ethswarm.org/) +- [4EVERLAND](https://www.4everland.org/) + +### További megfontolások {#additional-consideration} + +Az IPFS (InterPlanetary File System) egy elosztott rendszer fájlok, honlapok, alkalmazások és adatok tárolására és elérésére. Nincs beépített ösztönzési sémája, de használható bármelyik szerződésalapú ösztönzési megoldással a hosszú távú megtartásért. Egy másik módja annak, hogy az IPFS-en megmaradjon az adat, az az odatűzési (pinning) szolgáltatás, mely rögzíti az Önnek fontos adatokat, hogy Ön elérje azokat. Ön is futtathat saját IPFS csomópontot és hozzájárulhat a hálózathoz, hogy fenntartja a saját és más adatait ingyen! + +- [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)_ + +A SWARM egy decentralizáld adattárhely és elosztási technológia, mely tárolási ösztönzőrendszerrel és egy tárhelybérleti-költséges orákulummal működik. + +## Adatmegőrzés {#data-retention} + +Az adat megtartásához a rendszereknek valamilyen mechanizmusra van szükségük, hogy ezt biztosítsák. + +### Kihívásalapú mechanizmus {#challenge-mechanism} + +Az egyik legnépszerűbb módszer az adatmegtartásra, hogy valamilyen kriptográfiai kihívást használnak, amelyet a csomópontokhoz küldenek annak ellenőrzésére, hogy azok tényleg rendelkeznek-e az adattal. Egy egyszerű példa az Arweave hozzáférés-bizonyítása. Egy kihívást küldenek a csomópontoknak, hogy azoknál megvan-e a legutóbbi blokk és egy tetszőleges korábbi blokk. Ha a csomópont nem tud válaszolni, akkor megbüntetik. + +A kihívásmechanizmussal rendelkező decentralizált tárhelyek típusai: + +- 0Chain +- Skynet +- Arweave +- Filecoin +- Crust Network +- 4EVERLAND + +### Decentralitás {#decentrality} + +A platformok decentralitását nem lehet könnyen mérni, de általában olyan eszközt válasszon, amelyik nem valamilyen KYC-féle (ismerje meg ügyfelét) dolgot használ arra, hogy bizonyítékot adjon a decentralitásáról. + +Decentralizált eszközök KYC nélkül: + +- 0Chain (egy KYC nélküli kiadást implementál) +- Skynet +- Arweave +- Filecoin +- IPFS +- Ethereum +- Crust Network +- 4EVERLAND + +### Konszenzus {#consensus} + +A legtöbb eszköz rendelkezik valamilyen [konszenzusmechanizmussal](/developers/docs/consensus-mechanisms/), általában [**proof-of-work (PoW)**](/developers/docs/consensus-mechanisms/pow/) vagy [**proof-of-stake (PoS)** mechanizmust használnak](/developers/docs/consensus-mechanisms/pos/). + +Proof-of-work-alapú: + +- Skynet +- Arweave + +Proof-of-stake-alapú: + +- Ethereum +- Filecoin +- 0Chain +- Crust Network ## Kapcsolódó eszközök {#related-tools} -**IPFS -** **_InterPlanetary File System egy decentralizált tárhely és fájl referencia rendszer Ethereum-ra._** +**IPFS – _InterPlanetary File System egy decentralizált tárhely és fájlreferencia-rendszer Ethereumra._** -- [ipfs.io](https://ipfs.io/) +- [Ipfs.io](https://ipfs.io/) - [Dokumentáció](https://docs.ipfs.io/) - [GitHub](https://github.com/ipfs/ipfs) -**Swarm -** **_Egy elosztott tárhely platform és tartalom elosztó szolgáltatás az Ethereum web3 stack-hez._** +**Storj DCS – _Biztonságos, privát és S3-kompatibilis, decentralizált felhőobjektum-tárhely fejlesztőknek._** + +- [Storj.io](https://storj.io/) +- [Dokumentáció](https://docs.storj.io/) +- [GitHub](https://github.com/storj/storj) + +**Skynet – _A Skynet egy decentralizált PoW lánc, ami a decentralizált web felé elkötelezett._** + +- [Skynet.net](https://siasky.net/) +- [Dokumentáció](https://siasky.net/docs/) +- [GitHub](https://github.com/SkynetLabs/) + +**Filecoin – _Filecoint az IPFS mögötti csapat hozta létre. Ez egy ösztönzőréteg az IPFS ideálok tetején._** + +- [Filecoin.io](https://filecoin.io/) +- [Dokumentáció](https://docs.filecoin.io/) +- [GitHub](https://github.com/filecoin-project/) + +**Arweave – _Az Arweave egy dStorage platform adattárolásra._** + +- [Arweave.org](https://www.arweave.org/) +- [Dokumentáció](https://docs.arweave.org/info/) +- [Arweave](https://github.com/ArweaveTeam/arweave/) + +**0chain – _A 0Chain egy proof-of-stake dStorage platform shardinggal és blobberekkel._** -- [Swarm](https://ethersphere.github.io/swarm-home/) -- [GitHub](https://github.com/ethersphere/swarm) +- [0Chain.net](https://0chain.net/) +- [Dokumentáció](https://docs.0chain.net/0chain/) +- [GitHub](https://github.com/0chain/) -**OrbitDB -** **_Egy decentralizált peer-to-peer adatbázis IPFS-re építve._** +**Crust Network – _Crust egy dStorage platform az IPFS tetején._** -- [Dokumentáció](https://github.com/orbitdb/field-manual) -- [GitHub](https://github.com/orbitdb/orbit-db) +- [Crust.network](https://crust.network) +- [Dokumentáció](https://wiki.crust.network) +- [GitHub](https://github.com/crustio) + +**Swarm – _Egy elosztott tárhely platform és tartalom elosztó szolgáltatás az Ethereum web3-stackhez._** + +- [EthSwarm.org](https://www.ethswarm.org/) +- [Dokumentáció](https://docs.ethswarm.org/docs/) +- [GitHub](https://github.com/ethersphere/) + +**OrbitDB – _Egy decentralizált peer-to-peer adatbázis az IPFS tetején._** + +- [OrbitDB.org](https://orbitdb.org/) +- [Dokumentáció](https://github.com/orbitdb/field-manual/) +- [GitHub](https://github.com/orbitdb/orbit-db/) + +**Aleph.im – _Decentralizált felhőprojekt (adatbázis, fájltárolás, számítás és DID). A láncon kívüli és belüli, közvetítőmentes (peer-to-peer) technológia egyedi keveréke. IPFS-sel és többféle lánccal kompatibilis._** + +- [Aleph.im](https://aleph.im/) +- [Dokumentáció](https://aleph.im/#/developers/) +- [GitHub](https://github.com/aleph-im/) + +**Ceramic – _Felhasználó által kontrollált IPFS-adatbázis az adatgazdag alkalmazásokért._** + +- [Ceramic.network](https://ceramic.network/) +- [Dokumentáció](https://developers.ceramic.network/learn/welcome/) +- [GitHub](https://github.com/ceramicnetwork/js-ceramic/) + +**Filebase – _S3-kompatibilis decentralizált tárhely és georedundáns IPFS pinning szolgáltatás. Az IPFS-re a Filebase-en keresztül feltöltött összes fájlt automatikusan hozzátűzi a Filebase infrastruktúrához 3-szoros replikációval világszerte._** + +- [Filebase.com](https://filebase.com/) +- [Dokumentáció](https://docs.filebase.com/) +- [GitHub](https://github.com/filebase) + +**4EVERLAND – _Egy Web 3.0 felhőszámítási platform, ami integrálja a tárolás, számítás és hálózatépítés lényegi képességeit, S3-kompatibilis és szinkron adattárolást kínál olyan decentralizált tárolóhálózatokon, mint amilyen az IPFS és az Arweave._** + +- [4everland.org](https://www.4everland.org/) +- [Dokumentáció](https://docs.4everland.org/) +- [GitHub](https://github.com/4everland) + +**Kaleido – _Egy blokklánc mint szolgáltatás platform gombnyomásos IPFS csomópontokkal_** + +- [Kaleido](https://kaleido.io/) +- [Dokumentáció](https://docs.kaleido.io/kaleido-services/ipfs/) +- [GitHub](https://github.com/kaleido-io) ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +- [Mi az a decentralizált tárhely?](https://coinmarketcap.com/alexandria/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) – _CoinMarketCap_ +- [Öt gyakori mítosz lerombolása a decentralizált tárhelyről](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) – _Storj_ + +_Ismer olyan közösségi információforrást, amely a hasznára vált? Módosítsa az oldalt, és adja hozzá!_ ## Kapcsolódó témák {#related-topics} diff --git a/public/content/translations/hu/developers/docs/transactions/index.md b/public/content/translations/hu/developers/docs/transactions/index.md index 3bfaf25fc47..fd1ba639b1b 100644 --- a/public/content/translations/hu/developers/docs/transactions/index.md +++ b/public/content/translations/hu/developers/docs/transactions/index.md @@ -2,54 +2,57 @@ title: Tranzakciók description: Egy áttekintő az Ethereum tranzakciókról – hogyan működnek, az adatszerkezetük és hogyan lehet őket elküldeni egy alkalmazáson keresztül. lang: hu -isOutdated: true --- A tranzakciók számlákból származó kriptográfiailag aláírt instrukciók. Egy számla tranzakciót indíthat, hogy frissítse az Ethereum hálózat állapotát. A legegyszerűbb tranzakció az ETH átutalása egyik számláról a másikra. ## Előfeltételek {#prerequisites} -Ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először olvasd el a [Számlák](/developers/docs/accounts/) és a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) című cikkeinket. +Ennek az oldalnak a jobb megértése érdekében javasoljuk, hogy először a [Számlák](/developers/docs/accounts/) és a [bevezetés az Ethereumba](/developers/docs/intro-to-ethereum/) című cikkeinket olvassa el. ## Mi az a tranzakció? {#whats-a-transaction} -Az Ethereum tranzakció egy külső tulajdonú számla által kezdeményezett tevékenységre utal, más szóval egy számla, melyet egy ember kezel, nem pedig egy szerződés. Például ha Bob elküld Alice-nek 1 ETH-et, akkor Bob számláját terhelni kell, Alice számlájára pedig jóvá kell írni az összeget. Ez az állapotot megváltoztató művelet egy tranzakción belül történik. +Az Ethereum-tranzakció egy külső tulajdonú számla által kezdeményezett tevékenységre utal, más szóval egy számla, amelyet egy ember, nem pedig egy szerződés kezel. Például, ha Bob elküld Alice-nek 1 ETH-et, akkor Bob számláját terhelni kell, Alice számlájára pedig jóvá kell írni az összeget. Ez az állapotot megváltoztató művelet egy tranzakción belül történik. -![Egy diagram, mely egy tranzakciót ábrázol, ahogy az megváltoztatja az állapotot](./tx.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból +![Diagram, amely egy állapotot módosító tranzakciót ábrázol](./tx.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból -A tranzakciókat, melyek megváltoztatják az EVM állapotát, a teljes hálózat számára közvetíteni kell. Bármely csomópont kérvényezheti egy tranzakció végrehajtását az EVM-en; miután ez megtörténik, egy bányász végrehajtja a tranzakciót és továbbterjeszti az eredményül kapott állapotot a hálózat többi része számára. +Az EVM állapotát megváltoztató tranzakciókat a teljes hálózat számára közvetíteni kell. Bármely csomópont kérvényezheti egy tranzakció végrehajtását az EVM-en; miután ez megtörténik, egy validátor végrehajtja a tranzakciót és továbbterjeszti az eredményül kapott állapotot a hálózat többi része számára. -A tranzakcióknak van egy díja, és ki kell bányászni őket, hogy érvényessé váljanak. Hogy egyszerűbb legyen ez az áttekintő, a gáz díjak és a bányászat témaköröket máshol taglaljuk. +A tranzakciókért fizetni kell, és be kell kerüljenek egy validált blokkba. Hogy egyszerűbb legyen ez az áttekintés, a gázdíjak és a validáció témaköröket máshol taglaljuk. Az elküldött tranzakció a következő információkat tartalmazza: -- `recipient` – a fogadó cím (ha egy külső tulajdonú számla, akkor a tranzakció értéket továbbít. Ha egy szerződéses számla, akkor a tranzakció szerződés kódot fog végrehajtani) +- `from` – a küldő címe, aki aláírja a tranzakciót. Ez egy külső tulajdonú számla, mivel a szerződéses számlák nem küldenek tranzakciót. +- `recipient` – a fogadó címe (ha egy külső tulajdonú számla, akkor a tranzakció értéket továbbít. Ha egy szerződéses számla, akkor a tranzakció szerződéskódot fog végrehajtani) - `signature` – a küldő azonosítója. Ez akkor jön létre, amikor a feladó privát kulcsa aláírja a tranzakciót, és megerősíti, hogy a küldő engedélyezte ezt a tranzakciót -- `value` – az átküldendő ETH mennyiség a küldőtől a címzettnek (WEI-ben, az ETH egységében megadva) -- `data` – opcionális mező tetszőleges adat megadására -- `gasLimit` – a maximális gáz egység, melyet a tranzakció elfogyaszthat. A gáz egységek számítási lépéseket reprezentálnak -- `gasPrice` – a díj, melyet a küldő fizet gáz egységenként +- `nonce` – egy növekvő számláló, amely a számláról küldött tranzakciók számát mutatja +- `value` – az átküldendő ETH mennyisége a küldőtől a címzettnek (WEI-ben, ahol 1 ETH 1e+18 wei-nek felel meg) +- `input data` – opcionális mező tetszőleges adatok megadására +- `gasLimit` – a maximális gáz mennyisége, amelyet a tranzakció elfogyaszthat. Az [EVM](/developers/docs/evm/opcodes) határozza meg a számítási lépésekhez szükséges gázmennyiségét +- `maxPriorityFeePerGas` – az elfogyasztott gáz maximális ára, amely a validátor által kapott borravaló részét képezi +- `maxFeePerGas` – a gázegységért fizethető maximális díj, amit a tranzakcióért kifizetnek (beleértve a `baseFeePerGas` és a `maxPriorityFeePerGas` értékét is) -A gáz a bányász által a tranzakció feldolgozásához szükséges számításra utal. A felhasználóknak egy díjat kell fizetniük ezért a számításért. A `gasLimit` és a `gasPrice` meghatározza a bányásznak fizetett maximális tranzakciós díjat. [Többet a gázról](/developers/docs/gas/). +A gáz a tranzakció feldolgozásához szükséges számításért jár, amelyet a validátor feldolgoz. A felhasználóknak díjat kell fizetniük ezért a számításért. A `gasLimit` és a `maxPriorityFeePerGas` meghatározza a validátornak fizetett maximális tranzakciós illetéket. [Bővebben a gázról](/developers/docs/gas/). -A tranzakció objektum nagyjából így néz ki: +A tranzakcióobjektum nagyjából így néz ki: ```js { from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8", to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a", gasLimit: "21000", - gasPrice: "200", + maxFeePerGas: "300", + maxPriorityFeePerGas: "10", nonce: "0", - value: "10000000000", + value: "10000000000" } ``` -De a tranzakció objektumot alá kell írni a küldő privát kulcsával. Ez bizonyítja, hogy a tranzakció kizárólag a küldőtől jöhetett és nem történt csalás. +De a tranzakcióobjektumot alá kell írni a küldő privát kulcsával. Ez bizonyítja, hogy a tranzakció kizárólag a küldőtől jöhetett, és nem történt csalás. -Egy Ethereum kliens, mint a Geth, fogja kezelni az aláírási folyamatot. +Egy Ethereum-kliens, mint a Geth, fogja kezelni az aláírási folyamatot. -Példa [JSON-RPC](https://eth.wiki/json-rpc/API) hívás: +Példa egy [JSON-RPC](/developers/docs/apis/json-rpc)-hívásra: ```json { @@ -60,7 +63,8 @@ Példa [JSON-RPC](https://eth.wiki/json-rpc/API) hívás: { "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db", "gas": "0x55555", - "gasPrice": "0x1234", + "maxFeePerGas": "0x1234", + "maxPriorityFeePerGas": "0x1234", "input": "0xabcd", "nonce": "0x0", "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0", @@ -80,7 +84,8 @@ Példa válasz: "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663", "tx": { "nonce": "0x0", - "gasPrice": "0x1234", + "maxFeePerGas": "0x1234", + "maxPriorityFeePerGas": "0x1234", "gas": "0x55555", "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value": "0x1234", @@ -94,59 +99,106 @@ Példa válasz: } ``` -- a `raw` az aláírt tranzakció rekurzív hosszúságú prefixumban (RLP) enkódolva +- a `raw` az aláírt tranzakció a [Recursive Length Prefix (RLP)](/developers/docs/data-structures-and-encoding/rlp) által kódolt formában - a `tx` az aláírt tranzakció JSON-ban -A szignatúra hash-sel a tranzakcióról kriptográfiailag be lehet bizonyítani, hogy a küldőtől jött és továbbították a hálózatra. +Az aláírás hash-sel a tranzakcióról kriptográfiailag be lehet bizonyítani, hogy a küldőtől jött és így továbbították a hálózatra. + +### Az adatmező {#the-data-field} + +A tranzakciók többsége egy szerződést ér el egy külső tulajdonú számláról. A legtöbb szerződést Solidity nyelven írják, az adatmezőt az [alkalmazás bináris interfész (ABI)](/glossary/#abi) alapján lehet értelmezni. + +Az első négy bájt adja meg a funkciót a híváshoz, a funkció nevének és argumentumok hash-ét használva. A funkció néha beazonosítható ebből az [adatbázisból](https://www.4byte.directory/signatures/). + +A hívási adat többi része az argumentumok, [az ABI-specifikáció szerint kódolva](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). + +Nézzük meg ezt a [tranzakciót](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1). **Kattintson a részletekért** a hívási adatok megtekintéséért. + +A funkcióválasztó a `0xa9059cbb`. Számos [ismert funkció létezik ezzel az aláírással](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb). Ebben az esetben [a szerződés forráskódját](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) feltöltöttük az Etherscan-be, így tudjuk, hogy a funkció a `transfer(address,uint256)`. + +Az adat többi része: + +``` +0000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279 +000000000000000000000000000000000000000000000000000000003b0559f4 +``` + +Az ABI specifikáció szerint az integer értékek (mint a címek, amelyek 20 bájt hosszú integerek) az ABI-ban 32 bájt hosszan jelennek meg, nullákkal az elején. Így tudjuk, hogy a `to` (fogadó) cím a [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279). Az `value` (érték) pedig 0x3b0559f4 = 990206452. + +## Tranzakciótípusok {#types-of-transactions} + +Az Ethereumon található néhány tranzakciótípus: + +- Általános tranzakciók: egyik számláról a másikra. +- Szerződést telepítő tranzakciók: ahol nincs „to” vagyis fogadó cím, és az adatmezőket a szerződéskódra használják. +- A szerződés végrehajtása: olyan tranzakció, amely egy telepített okosszerződéssel kapcsolódik. Ekkor a „to” vagyis fogadó cím az okosszerződés címe. ### A gázról {#on-gas} -Ahogy korábban említettük, a tranzakciók [gáz](/developers/docs/gas/) költséget igényelnek a lefutáshoz. Egy egyszerű átutalás 21000 gáz egységet igényel. +Ahogy korábban említettük, a tranzakciók [gáz](/developers/docs/gas/)költséget igényelnek a lefutáshoz. Egy egyszerű átutalás 21 000 gázegységet igényel. -Így ahhoz, hogy Bob 1 ETH-et küldjön Alice-nek 200 Gwei `gasPrice` értékkel, a következő díjat kell kifizetnie: +Bob 1 ETH-t küld Alice-nek, ahol a `baseFeePerGas` 190 gwei és a `maxPriorityFeePerGas` 10 gwei, így Bobnak a következő díjat kell kifizetnie: ``` -200*21000 = 4,200,000 GWEI ---vagy-- -0.0042 ETH +(190 + 10) * 21 000 = 4 200 000 gwei +--vagyis-- +0,0042 ETH ``` -Bob számláját **-1.0042 ETH** terhelés éri +Bob számlája **-1,0042 ETH-val** csökken (1 ETH Alice-nek + 0,0042 ETH gázdíjakra) + +Alice számlájára **+1,0 ETH** érkezik -Alice számlájára **+1.0 ETH**-et írnak jóvá +Az elégetendő alapdíj **-0,00399 ETH** -A bányász, aki feldolgozta a tranzakciót **+0.0042 ETH**-et fog kapni +A validátor megtartja a borravalót, ami **+0,000210 ETH** -Az okosszerződés interakciók is gázt igényelnek. +Az okosszerződéses interakciók is gázt igényelnek. -![Egy diagram, mely a fel nem használt gáz visszatérítését ábrázolja](./gas-tx.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból +![Egy diagram, amely a fel nem használt gáz visszatérítését ábrázolja](./gas-tx.png) _Diagram átvéve az [Ethereum EVM illusztrálva](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ anyagból -Minden fel nem használt gáz visszakerül a felhasználó számlájára. +A tranzakcióban fel nem használt összes gáz visszakerül a felhasználó számlájára. -## Tranzakció életciklus {#transaction-lifecycle} +## Tranzakció-életciklus {#transaction-lifecycle} -Amikor elküld valaki egy tranzakciót, a következő történik: +Amikor valaki elküld egy tranzakciót, a következő történik: -1. Amikor elküldesz egy tranzakciót, egy kriptográfiai hash jön létre: `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` -2. A tranzakciót ezután közvetítik a hálózatra, és sok más tranzakcióval rendelkező készletbe foglalják. -3. Egy bányásznak ki kell választania a tranzakciódat és belefoglalnia egy blokkba, hogy hitelesítse és "sikeresnek" minősítse. - - Lehet, hogy ennél a résznél várnod kell, ha a hálózaton nagy a forgalom és a bányászok nem tudnak lépést tartani. A bányászok, mindig a nagyobb `GASPRICE` értékű tranzakciót veszik előre, mivel megtarthatják a tranzakciós díjakat. -4. A tranzakciód kap egy blokk megerősítési számot is. Ez azoknak a blokkoknak a mennyisége, melyek azután jöttek létre, miután te tranzakciódat blokkba foglalták. Minél nagyobb ez a szám, annál nagyobb bizonyossággal lehet kimondani, hogy a tranzakciót feldolgozták és a hálózat elismeri. Ez azért van, mert néha a blokk, mely befoglalja a tranzakciódat, nem mindig jut el a láncig. - - Minél nagyobb a blokk megerősítési szám, annál nehezebb megváltoztatni a tranzakciót. Így nagyobb értékű tranzakcióknál, nagyobb blokk megerősítési szám az elvárt. +1. A tranzakciós hash kriptográfiailag generálódik: `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` +2. A tranzakció ezután elterjed a hálózaton, bekerül a tranzakció gyűjtőmedencébe, ami az összes függő tranzakciót tartalmazza. +3. A validátornak ki kell választania a tranzakciót és bele kell foglalnia egy blokkba, hogy hitelesítse és „sikeresnek” minősítse. +4. Az idő múlásával a tranzakciót tartalmazó adott blokk a hitelesítettből a véglegesített állapotba jut. Ezek a frissítések biztossá teszik, hogy a tranzakció sikeres és többé nem lehet megváltoztatni. Amint a blokk végleges lesz, csak egy hálózatszintű támadás tudja megváltoztatni, ami sok milliárd dollárba kerülne a támadó részéről. -## Egy vizuális bemutató {#a-visual-demo} +## Vizuális bemutató {#a-visual-demo} -Nézd meg, ahogy Austin átvezet a tranzakciókon, a gázon és a bányászaton. +Kövesse végig, ahogy Austin bemutatja a tranzakciókat, a gázt és a bányászatot. +## Beírt tranzakciógöngyöleg {#typed-transaction-envelope} + +Az Ethereum eredetileg egyetlen formátummal rendelkezett a tranzakciókat illetően. Minden tranzakcióban a következő értékek voltak jelen: nonce, gázdíj, gázkorlátozás, a fogadó címe, az érték, adatok, v, r és s. Ezek a mezők [RLP-kódolásúak](/developers/docs/data-structures-and-encoding/rlp/), hogy így nézzenek ki: + +`RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` + +Az Ethereum tovább fejlődött, hogy többféle tranzakciót is támogatni tudjon olyan funkciók lehetővé tételéhez, mint a hozzáférési listák és a [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), és úgy tudja ezeket bevezetni, hogy ne érintsék az eredeti tranzakció formátumát. + +Az [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) teszi ezt lehetővé. A tranzakciókat így interpretálják: + +`TransactionType || TransactionPayload` + +Ahol a mezők jelentése: + +- `TransactionType` – egy szám 0 és 0x7f között, összesen 128 lehetséges tranzakciótípusra. +- `TransactionPayload` – tetszőleges bájtsor, amelyet a tranzakció típusa határoz meg. + ## További olvasnivaló {#further-reading} -_Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldalt és add hozzá!_ +- [EIP-2718: Tranzakciógöngyöleg](https://eips.ethereum.org/EIPS/eip-2718) + +_Ismersz olyan közösségi anyagot, mely segített neked? Módosítsd az oldalt és add hozzá!_ ## Kapcsolódó témák {#related-topics} - [Számlák](/developers/docs/accounts/) - [Ethereum virtuális gép (EVM)](/developers/docs/evm/) - [Üzemanyag](/developers/docs/gas/) -- [Bányászat](/developers/docs/consensus-mechanisms/pow/mining/) diff --git a/public/content/translations/hu/developers/docs/web2-vs-web3/index.md b/public/content/translations/hu/developers/docs/web2-vs-web3/index.md index dd367ac3617..0561b0b2d6a 100644 --- a/public/content/translations/hu/developers/docs/web2-vs-web3/index.md +++ b/public/content/translations/hu/developers/docs/web2-vs-web3/index.md @@ -6,14 +6,16 @@ lang: hu A web2 arra az internetre utal, melyet ma legtöbbünk ismer. Egy internet, melyet olyan cégek dominálnak, melyek szolgáltatásokat nyújtanak a személyes adataidért cserébe. A web3 az Ethereum kontextusában decentralizált alkalmazásokra utal, melyek a blokkláncon futnak. Ezek olyan alkalmazások, amelyek lehetővé teszik, hogy bárki részt vegyen anélkül, hogy monetizálná a személyes adatait. +Egy sokkal inkább kezdőknek szóló áttekintést szeretne? Tekintse meg a [bevezetés a web3-ba](/web3/) oldalt. + ## Web3 előnyök {#web3-benefits} -Sok web3 fejlesztő választotta a dappok fejlesztését az Ethereum örökletes decentralizációja miatt: +Sok web3-fejlesztő választotta a dappok fejlesztését az Ethereum örökletes decentralizációja miatt: - A hálózaton mindenkinek hozzáférése van, hogy használja a szolgáltatást - máshogy megfogalmazva, nincs engedélyhez kötve. - Senki sem blokkolhatja és nem tagadhatja meg a szolgáltatáshoz való hozzáférést. - A fizetések be vannak építve a natív tokennel, Etherrel (ETH). -- Az Ethereum Turing-teljes, vagyis lényegében bármit leprogramozhatsz. +- Az Ethereum Turing-kompatibilis, vagyis lényegében bármi leprogramozható a számára. ## Gyakorlati összehasonlítás {#practical-comparisons} @@ -23,15 +25,16 @@ Sok web3 fejlesztő választotta a dappok fejlesztését az Ethereum örökletes | A fizetési szolgáltatás úgy dönthet, hogy bizonyos munkákért nem engedélyezi a kifizetéseket | A web3 fizetési alkalmazások nem igényelnek személyes adatot és nem tudnak fizetéseket megakadályozni | | A maszek gazdaságot kiszolgáló alkalmazások leállhatnak és ez hatással lehet a dolgozó bevételére | A web3 szerverek nem állhatnak le – az Ethereumot használják backendként, mely egy több ezer számítógépből álló decentralizált hálózat | -Ez nem jeleni azt, hogy minden szolgáltatást dappá kell alakítani. Ezek a példák illusztrisak, hogy kiemeljék a legfontosabb különbségeket a web2 és a web3 szolgáltatások között. +Ez nem jeleni azt, hogy minden szolgáltatást dappá kell alakítani. Ezek a példák a web2 és a web3 szolgáltatások közötti fő különbségeket hivatottak bemutatni. ## Web3 korlátok {#web3-limitations} -A web3-nak jelenleg van egy pár korlátja: +A web3-at jelenleg több dolog is korlátozza: -- Méretezhetőség – a tranzakciók lassabbak a web3-on, mivel decentralizált. A fizetéshez hasonló állapotváltozásokat bányászoknak kell feldolgozniuk és közvetíteniük a hálózaton keresztül. +- Méretezhetőség – a tranzakciók lassabbak a web3-on, mivel decentralizált. Az olyan státuszváltozásokat, mint amilyen a fizetés is, egy csomópontnak kell feldolgoznia és közvetíteni azt a hálózaton keresztül. - UX – a web3 alkalmazásokkal történő interakció extra lépéseket, szoftvert és oktatást igényelhet. Ez akadályozza az elterjedését. -- Költség – a legtöbb sikeres dapp csak a kódjuknak egy kis hányadát teszik fel a blokkláncra, mivel ez elég költséges. +- Elérhetőség – a modern webböngészők nem elég integráltak ahhoz, hogy a web3-at a legtöbb felhasználó elérhesse. +- Költség – a legtöbb sikeres dapp csak a kódjának csak egy kis hányadát teszi fel a blokkláncra, mivel ez elég költséges. ## Centralizáció vs decentralizáció {#centralization-vs-decentralization} @@ -47,9 +50,13 @@ Az alábbi táblázatban felsoroljuk a centralizált és decentralizált digitá | A központi hatóság cenzúrázhatja az adatokat, potenciálisan elvágva a hálózat egyes részeit a hálózat többi részével való interakciótól. | A cenzúra sokkal nehezebb, mivel az információ sokféleképpen terjedhet a hálózaton keresztül. | | A hálózatban való részvételt a központi hatóság ellenőrzi. | Bárki részt vehet a hálózatban; nincsenek "kapuőrök." Ideális esetben a részvétel költsége nagyon alacsony. | -Azt meg kell jegyezni, hogy ezek a minták nem biztos, hogy minden hálózatra igazak. Továbbá a valóságban egy hálózat centralizáltsága/decentralizáltsága egy skálán helyezkedik el; nincsen teljesen centralizált vagy teljesen decentralizált hálózat. +Azt meg kell jegyezni, hogy ezek a minták nem biztos, hogy minden hálózatra igazak. Továbbá a valóságban egy hálózat centralizáltsága/decentralizáltsága skálán mérhető; nincsen teljesen centralizált vagy teljesen decentralizált hálózat. ## További olvasnivaló {#further-reading} +- [Mi az a web3?](/web3/) – _ethereum.org_ +- [A web 3.0 alkalmazások architektúrája](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) – _Preethi Kasireddy_ - [A decentralizáció jelentése](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_ +- [Mi az a web 3.0 és miért fontos?](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _2019. december 31. – Max Mersch and Richard Muirhead_ +- [Miért van szükség a web 3.0-ra?](https://medium.com/@gavofyork/why-we-need-web-3-0-5da4f2bf95ab) _2018. szeptember 12. – Gavin Wood_ diff --git a/public/content/translations/hu/eips/index.md b/public/content/translations/hu/eips/index.md index 823708ef209..032e9567237 100644 --- a/public/content/translations/hu/eips/index.md +++ b/public/content/translations/hu/eips/index.md @@ -1,53 +1,66 @@ --- title: Ethereum Fejlesztési Javaslatok (EIP-k) -description: Az alapvető információk, melyek az Ethereum fejlesztési javaslatok (EIP-k) megértéséhez szükségesek. +description: Az EIP megértéséhez szükséges alapinformációk lang: hu --- -# Bevezetés az Ethereum Fejlesztési Javaslatokba (EIP-k) {#introduction-to-ethereum-improvement-proposals-eips} +# Bevezetés az Ethereum Fejlesztési Javaslatokba (EIP-k) {#introduction-to-ethereum-improvement-proposals} ## Mik azok az EIP-k? {#what-are-eips} [Az Ethereum Fejlesztési Javaslatok (EIP-k)](https://eips.ethereum.org/) olyan sztenderdek, melyek potenciális új funkciókat és folyamatokat specifikálnak az Ethereumra. Az EIP-k tartalmazzák a javasolt változtatások műszaki előírásait, és a közösség „igazságforrásaként” működnek. Az Ethereum hálózati frissítéseit és alkalmazási szabványait az EIP folyamaton keresztül tárgyalják és fejlesztik. -Az Ethereum közösségben bárki létrehozhat egy EIP-t. Az EIP írás irányelveit az [EIP 1](https://eips.ethereum.org/EIPS/eip-1) tartalmazza. Az EIP-nek tömör technikai specifikációt kell tartalmaznia a szolgáltatásról és annak indoklásáról. Az EIP szerzője felelős a közösségen belüli konszenzus kialakításáért és az eltérő vélemények dokumentálásáért. A jól kidolgozott EIP benyújtásának magas technikai elvárásai miatt a legtöbb EIP szerző történelmileg alkalmazás- vagy protokollfejlesztő volt. +Az Ethereum közösségben bárki létrehozhat egy EIP-t. Az EIP-írás irányelveit az [EIP-1](https://eips.ethereum.org/EIPS/eip-1) tartalmazza. Egy EIP elsődleges célja, hogy tömör technikai specifikációt nyújtson némi motivációval együtt. Az EIP szerzője felelős a közösségen belüli konszenzus kialakításáért, valamint az eltérő vélemények dokumentálásáért. A jól kidolgozott EIP benyújtásának magas szakmai követelményei miatt a legtöbb EIP-szerző általában alkalmazás- vagy protokollfejlesztő. ## Miért fontosak az EIP-k? {#why-do-eips-matter} -Az EIP-k központi szerepet játszanak abban, hogy a változások hogyan történnek és dokumentálódnak az Ethereumon. Így lehet az embereknek javaslatot tenni, vitatkozni és elfogadni a változásokat. [Különböző típusú EIP-k](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1.md#eip-types) léteznek, beleértve az alacsony szintű protokoll-változtatásokhoz szükséges alapvető EIP-ket, amelyek befolyásolják a konszenzust és hálózati frissítést igényelnek, valamint az alkalmazási szabványokhoz szükséges ERC-ket. Például a token létrehozás szabványai, mint az [ERC20](https://eips.ethereum.org/EIPS/eip-20) vagy az [ERC721](https://eips.ethereum.org/EIPS/eip-721) lehetővé teszik ezekkel a tokenekkel interakcióba lépő alkalmazásoknak, hogy az összes tokent ugyanazon szabály szerint kezeljék, mely így könnyebbé teszi az interoperábilis alkalmazások létrehozását. +Az EIP-k központi szerepet játszanak abban, hogy a változások hogyan történnek és dokumentálódnak az Ethereumon. Így lehet az embereknek javaslatot tenni, vitatkozni és elfogadni a változásokat. Különböző [EIP-típusok léteznek](https://eips.ethereum.org/EIPS/eip-1#eip-types), például alapvető (core) EIP-k az alacsony szintű protokollmódosításokhoz, amelyek a konszenzust érintik és hálózatfrissítést igényelnek, mint az [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), valamint az alkalmazásstandardokat érintő ERC-k, például az [EIP-20](https://eips.ethereum.org/EIPS/eip-20) és az [EIP-721](https://eips.ethereum.org/EIPS/eip-721). -Minden hálózati frissítés EIP-kből áll, melyeket minden [Ethereum kliensnek](/learn/#clients-and-nodes) implementálnia kell a hálózaton. Ez azt jelenti, hogy az Ethereum főhálózat többi kliensével való konszenzus fenntartása érdekében az kliens fejlesztőknek meg kell győződniük arról, hogy mindannyian implementálták a szükséges EIP-ket. +Minden hálózati frissítés EIP-kből áll, melyeket a hálózaton működő összes [Ethereum-kliensnek](/learn/#clients-and-nodes) implementálnia kell. Ez azt jelenti, hogy az Ethereum-főhálózat többi kliensével való konszenzus fenntartása érdekében a kliensfejlesztőknek meg kell győződniük arról, hogy mindannyian implementálták a szükséges EIP-ket. -A változások technikai specifikációjával együtt az EIP-k egy olyan egységet képeznek, amely körül az irányítás történik az Ethereumban: bárki szabadon javasolhat egyet, ezután a közösség különböző érdekeltjei megvitatják, hogy ezt szabványként kell-e elfogadni, vagy egy hálózati frissítés legyen-e belőle. Mivel a nem belső (non-core) EIP-ket nem kell minden alkalmazásnak bevezetnie (például csinálhatsz egy nem-[ERC20 tokent](https://eips.ethereum.org/EIPS/eip-20)), de a belső (core) EIP-ket széleskörűen be kell vezetni (mivel minden csomópontot frissíteni kell, hogy ugyanahhoz a hálózathoz tartozzanak), a belső EIP-k szélesebb konszenzust igényelnek a közösségen belül, mint a nem belső EIP-k. +A változások technikai specifikációjával együtt az EIP-k egy olyan egységet képeznek, amely körül az irányítás történik az Ethereumban: bárki szabadon javasolhat egyet, ezután a közösség különböző érdekeltjei megvitatják, hogy ezt szabványként kell-e elfogadni, vagy egy hálózati frissítés legyen-e belőle. Mivel a nem alapvető (non-core) EIP-ket nem kell minden alkalmazásnak bevezetnie (például készíthető egy helyettesíthető token, amely nem használja az EIP-20 szabványt), de az alapvető (core) EIP-ket széleskörűen be kell vezetni (mivel minden csomópontot frissíteni kell, hogy ugyanahhoz a hálózathoz tartozzanak), az alapvető EIP-k szélesebb konszenzust igényelnek a közösségen belül, mint a nem alapvető EIP-k. ## EIP-k története {#history-of-eips} -Az [Ethereum Improvement Proposals (EIPs) GitHub gyűjteményt](https://github.com/ethereum/EIPs) 2015 októberében hozták létre. Az EIP folyamat a [Bitcoin Improvement Proposals (BIPs)](https://github.com/bitcoin/bips) folyamaton alapul, ami pedig a [Python Enhancement Proposals (PEPs)](https://www.python.org/dev/peps/) folyamaton alapul. +Az [Ethereum Improvement Proposals (EIPs) Github gyűjteményt](https://github.com/ethereum/EIPs) 2015 októberében hozták létre. Az EIP folyamat a [Bitcoin Improvement Proposals (BIPs)](https://github.com/bitcoin/bips) folyamaton alapul, ami pedig a [Python Enhancement Proposals (PEPs)](https://www.python.org/dev/peps/) folyamaton alapul. -Az EIP szerkesztők feladata a technikai hibátlanság, a helyesírás/nyelvtan és a kód stílus ellenőrzése. Többek között Martin Becze, Vitalik Buterin és Gavin Wood voltak az eredeti EIP szerkesztők 2015-től 2016 végéig. A jelenlegi EIP szerkesztők: +Az EIP-szerkesztők feladata a technikai stabilitás és a formázási kérdések vizsgálata, valamint a helyesírás/nyelvtan és a kódstílus ellenőrzése. Többek között Martin Becze, Vitalik Buterin és Gavin Wood voltak az eredeti EIP szerkesztők 2015-től 2016 végéig. -- Alex Beregszaszi (EWASM/Ethereum Foundation) -- Greg Colvin (Community) -- Casey Detrio (EWASM/Ethereum Foundation) -- Hudson James (Ethereum Foundation) -- Nick Johnson (ENS) -- Nick Savers (Community) +Jelenlegi EIP-szerkesztők: -## Bővebben {#learn-more} +- Alex Beregszaszi (@axic) +- Gavin John (@Pandapip1) +- Greg Colvin (@gcolvin) +- Matt Garnett (@lightclient) +- Sam Wilson (@SamWilsn) -Ha szeretnél többet olvasni az EIP-kről, akkor látogasd meg az [EIP-k weboldalát](https://eips.ethereum.org/), ahogy további információkat találhatsz többek között: +Tiszteletbeli EIP-szerkesztők: -- [A különböző EIP típusokról](https://eips.ethereum.org/) -- [Az EIP-ről, melyek elkészültek](https://eips.ethereum.org/all) -- [Az EIP státuszokról és a jelentésükről](https://eips.ethereum.org/) +- Casey Detrio (@cdetrio) +- Hudson Jameson (@Souptacular) +- Martin Becze (@wanderer) +- Micah Zoltu (@MicahZoltu) +- Nick Johnson (@arachnid) +- Nick Savers (@nicksavers) +- Vitalik Buterin (@vbuterin) -## Részvétel {#participate} +Ha ön is szeretne EIP-szerkesztő lenni, akkor tekintse meg az [EIP-5069](https://eips.ethereum.org/EIPS/eip-5069) frissítést. + +Az EIP-szerkesztők döntik el, hogy egy javaslat mikor áll készen arra, hogy EIP váljon belőle, és segítenek az EIP-szerzőknek kidolgozni javaslataikat. Az [Ethereum macskapásztorok (Cat Herder)](https://www.ethereumcatherders.com/) segítenek az EIP-szerkesztők és a közösség találkozóinak szervezésében (lásd még [EIPIP](https://github.com/ethereum-cat-herders/EIPIP)). + +A teljes szabványosítási folyamat diagrammal együtt megtalálható az [EIP-1](https://eips.ethereum.org/EIPS/eip-1) frissítésben. -Ha szeretnéd követni vagy megosztani a véleményedet az EIP-kről, akkor nézd meg az [Ethereum Magicians fórumot](https://ethereum-magicians.org/), ahol megvitatjuk az EIP-eket a közösséggel. +## Bővebben {#learn-more} + +Ha szeretne többet olvasni az EIP-kről, akkor tekintse meg az [EIP-k weboldalát](https://eips.ethereum.org/) és az [EIP-1](https://eips.ethereum.org/EIPS/eip-1) frissítést. További hasznos linkek: -Továbbá: +- [Az összes EIP listája](https://eips.ethereum.org/all) +- [Az összes EIP-típus leírása](https://eips.ethereum.org/EIPS/eip-1#eip-types) +- [Az összes EIP-állapot leírása](https://eips.ethereum.org/EIPS/eip-1#eip-process) + +## Részvétel {#participate} -- [Hogyan kell EIP-t készíteni](https://eips.ethereum.org/EIPS/eip-1) +Bárki létrehozhat EIP-t. A javaslat beküldése előtt el kell olvasni az [EIP-1](https://eips.ethereum.org/EIPS/eip-1) frissítést, amely leírja az EIP-folyamatot és az EIP megírásának módját, továbbá visszajelzést kell kérni az [Ethereum Mágusok](https://ethereum-magicians.org/) weboldalán, ahol a tervezet benyújtása előtt a közösséggel együtt megvitatják a javaslatokat. ## Hivatkozások {#references} diff --git a/public/content/translations/hu/energy-consumption/index.md b/public/content/translations/hu/energy-consumption/index.md index 6732b0b5467..133be2fd013 100644 --- a/public/content/translations/hu/energy-consumption/index.md +++ b/public/content/translations/hu/energy-consumption/index.md @@ -8,54 +8,56 @@ lang: hu Az Ethereum egy környezetbarát blokklánc. Az Ethereum [proof-of-stake](/developers/docs/consensus-mechanisms/pos) konszenzus mechanizmusa ETH-t használ [az energia helyett, hogy biztosítsa a hálózatot](/developers/docs/consensus-mechanisms/pow). Az Ethereum energiafogyasztása [~0,0026 TWh/év](https://carbon-ratings.com/eth-report-2022) a teljes globális hálózaton. -Az Ethereum energiafogyasztásának becsült adata egy [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com) tanulmányból származik. Ez egy lentről felfelé építkező becslés az Ethereum-hálózat áramfogyasztásáról és karbonlábnyomáról ([nézze meg a reportot](https://carbon-ratings.com/eth-report-2022)). A különféle csomópontok áramfogyasztását mérték, melyek különböző hardverekkel és kliensszoftverekkel működnek. A becsült **2601 MWh** (0,0026 TWh), mint a hálózat teljes éves áramfogyasztása, megfelel **870 tonna CO2e** szén-dioxid kibocsátásnak, regionális tényezőket figyelembe véve. Ez az érték változik, ahogy a csomópontok belépnek a hálózatra és kilépnek a hálózatról – Ön is ellenőrizheti egy gördülő 7 napos átlagbecsléssel: [Cambridge-blokklánchálózat fenntarthatósági index](https://ccaf.io/cbnsi/ethereum) (a módszer kicsit más, nézze meg a részleteket az oldalukon). +Az Ethereum energiafogyasztásának becsült adata egy [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com) tanulmányból származik. Ez egy lentről felfelé építkező becslés az Ethereum-hálózat áramfogyasztásáról és karbonlábnyomáról ([nézze meg a reportot](https://carbon-ratings.com/eth-report-2022)). A különféle csomópontok áramfogyasztását mérték, melyek különböző hardverekkel és kliensszoftverekkel működnek. A becsült **2601 MWh** (0,0026 TWh), mint a hálózat teljes éves áramfogyasztása, megfelel **870 tonna CO2e** szén-dioxid kibocsátásnak, regionális tényezőket figyelembe véve. Ez az érték változik, ahogy a csomópontok belépnek a hálózatra és kilépnek a hálózatról – Ön is ellenőrizheti egy gördülő 7 napos átlagbecsléssel: [Cambridge-blokklánchálózat fenntarthatósági indexe](https://ccaf.io/cbnsi/ethereum) (a módszer kicsit más, nézze meg a részleteket az oldalukon). -Ethereum energiafogyasztását vesszük össze más iparágak éves becsléseivel, hogy kontextusban lássuk azt. Így jobban megértjük, hogy Ethereum fogyasztása magas vagy alacsony. +Az Ethereum energiafogyasztását összevethetjük más termékek és iparágak éves becsléseivel, hogy kontextusban lássuk azt. Így jobban megértjük, hogy Ethereum fogyasztása magas vagy alacsony. -Az ábra a becsült éves fogyasztást mutatja TWh/év formájában. A becslések nyilvános adatokból származnak 2023. májusában, a forrásokat megtalálja a táblázat alatt: +Az ábra az Ethereum becsült fogyasztását mutatja TWh/év formájában, más termékekkel és iparágakkal összevetve. A becslések nyilvános adatokból származnak 2023. júliusából, a forrásokat megtalálja a táblázat alatt. -| | Éves energiafogyasztás (TWh) | Összevetve a PoS Ethereummal | Forrás | -| :------------------------- | :--------------------------: | :--------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Globális adatközpontok | 200 | 77 000x | [forrás](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | -| Aranybányászat | 131 | 50 000x | [forrás](https://ccaf.io/cbnsi/cbeci/comparisons) | -| Bitcoin | 131 | 50 000x | [forrás](https://ccaf.io/cbnsi/cbeci/comparisons) | -| PoW Ethereum | 78 | 30 000x | [forrás](https://digiconomist.net/ethereum-energy-consumption) | -| Youtube (csak a közvetlen) | 12 | 4600x | [forrás](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf) | -| Számítógépes játékok (USA) | 34 | 13 000x | [forrás](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | -| Netflix | 0,451 | 173x | [forrás](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | -| PayPal | 0,26 | 100x | [forrás](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261) | -| AirBnB | 0,02 | 8x | [forrás]() | -| PoS Ethereum | 0,0026 | 1x | [forrás](https://carbon-ratings.com/eth-report-2022) | +| | Éves energiafogyasztás (TWh) | Összevetve a PoS Ethereummal | Forrás | +|:--------------------------- |:----------------------------:|:----------------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| Globális adatközpontok | 190 | 73 000x | [forrás](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | +| Bitcoin | 149 | 53 000x | [forrás](https://ccaf.io/cbnsi/cbeci/comparisons) | +| Aranybányászat | 131 | 50 000x | [forrás](https://ccaf.io/cbnsi/cbeci/comparisons) | +| Számítógépes játékok (USA)* | 34 | 13 000x | [forrás](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | +| PoW Ethereum | 21 | 8100x | [forrás](https://ccaf.io/cbnsi/ethereum/1) | +| Google | 19 | 7300x | [forrás](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) | +| Netflix | 0,457 | 176x | [forrás](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | +| PayPal | 0,26 | 100x | [forrás](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-(1).pdf) | +| AirBnB | 0,02 | 8x | [forrás](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-(Final).pdf) | +| **PoS Ethereum** | **0,0026** | **1x** | [forrás](https://carbon-ratings.com/eth-report-2022) | -Bonyolult pontos becsléseket készíteni az energiafogyasztásról, főleg ha a vizsgált entitás összetett ellátási lánccal bír, ami befolyásolja a hatékonyságát. Vegyük a Netflixet vagy Youtube-ot példaként. A fogyasztásuk becslése attól függően változik, hogy a rendszer fenntartását és a tartalomnak a felhasználóhoz való eljutását nézik (_közvetlen fogyasztás_) vagy beleveszik azt is, amit a tartalom előállítása, irodák fenntartása, reklámozás stb. jelent (_közvetett fogyasztás_). A közvetlen fogyasztás azt is felölelheti, hogy mennyi energia kell a felhasználónak, hogy a tartalmat megnézze a tévében, számítógépen és mobilon, ami ezektől az eszközöktől is nagyban függ. +\*Beleértve a felhasználói eszközök fogyasztását, mint asztali számítógépek, laptopok és játékkonzolok. -Egy erről szóló beszélgetés: [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix). A táblázat a Netflix által közölt _közvetlen_ és _közvetett_ használatot mutatja. A Youtube csak a _közvetlen_ fogyasztást adta meg, ami [12 TWh/év](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf). +Bonyolult pontos becsléseket készíteni az energiafogyasztásról, főleg ha a vizsgált entitás összetett ellátási lánccal bír, ami befolyásolja a hatékonyságát. A Netflix és a Google esetében például a fogyasztás becslése attól függően változik, hogy a rendszer fenntartását és a tartalomnak a felhasználóhoz való eljutását nézik (_közvetlen fogyasztás_), vagy beleveszik azt is, amit a tartalom előállítása, irodák fenntartása, reklámozás stb. jelent (_közvetett fogyasztás_). A közvetett fogyasztásba az is beleszámíthat, hogy mennyi energiát vesz igénybe elfogyasztani a kínált tartalma a felhasználó oldalán, a tévék, számítógépek és mobilok használata során. -Az összehasonlítás a Bitcoint és a proof-of-work Ethereumot feltünteti. Fontos megérteni, hogy a proof-of-work hálózatok fogyasztása nem statikus, napról napra változik. A proof-of-work Ethereumra vonatkozó érték pontosan [az egyesítés (The Merge)](/roadmap/merge/) előtti állapotot mutatja, ami a proof-of-stake mechanizmusra váltotta át a rendszert, és a [Digiconomist](https://digiconomist.net/ethereum-energy-consumption) jelezte. Más források, mint a [Cambridge-blokklánchálózat fenntartási index](https://ccaf.io/cbnsi/ethereum/1) sokkal kevesebbre becsülik (20 TWh/évhez közelebb). A Bitcoin fogyasztása is más a különböző források szerint, ami sok [vitát](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) generál, nemcsak a felhasznált energia mennyiségéről, hanem annak forrásáról és etikájáról. Az energiafogyasztás nem feltétlenül pontosan kapcsolódik a környezeti hatásokhoz, mert különböző projektek különféle energiaforrásokat használnak, például kisebb vagy nagyobb arányú megújuló forrásokat. Például a [Cambridge Bitcoin elektromosáram-fogyasztási index](https://ccaf.io/cbnsi/cbeci/comparisons) azt mutatja, hogy a Bitcoin hálózati igénye elméletileg kielégíthető lenne abból a gázból vagy áramból, ami a szállítás során amúgy is elveszne. Az Ethereum a fenntarthatóság miatt cserélte le a rendszer energiaéhes részét egy környezetbarát alternatívára. +A fenti becslések nem tökéletes összehasonlítások. A közvetett fogyasztás mennyisége, amivel számolnak, különbözik a források szerint és ritkán tartalmazza a felhasználók eszközeit is. Minden mögöttes információforrás több részletet közöl arról, hogy pontosan mit mérnek. + +Az összehasonlítás a Bitcoint és a proof-of-work Ethereumot feltünteti. Fontos megérteni, hogy a proof-of-work hálózatok fogyasztása nem statikus, és napról napra változik. A becslések nagy mértékben eltérhetnek a források szerint is. A téma árnyalt [vitát](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) generál, nemcsak a felhasznált energia mennyiségéről, hanem annak forrásáról és etikájáról is. Az energiafogyasztás nem feltétlenül pontosan kapcsolódik a környezeti hatásokhoz, mert különböző projektek különféle energiaforrásokat használnak, beleértve a kisebb vagy nagyobb arányú megújuló forrásokat is. Például a [Cambridge Bitcoin elektromosáram-fogyasztási index](https://ccaf.io/cbnsi/cbeci/comparisons) azt mutatja, hogy a Bitcoin hálózati igénye elméletileg kielégíthető lenne abból a gázból vagy áramból, ami a szállítás során amúgy is elveszne. Az Ethereum a fenntarthatóság miatt cserélte le a rendszer energiaéhes részét egy környezetbarát alternatívára. Számtalan iparág energiafogyasztását és szén-dioxid-kibocsátását megtekintheti a [Cambridge-blokklánchálózat fenntarthatósági index oldalán](https://ccaf.io/cbnsi/ethereum). ## Tranzakciónkénti becslés {#per-transaction-estimates} -Számos cikk tranzakciónkénti becslésről beszél a blokkláncok esetén. Ez félrevezető, mert a blokkjavaslat és validálás független a benne található tranzakciók számától. A tranzakciónkénti felhasználás azt jelentené, hogy kevesebb tranzakció kevesebb energiát fogyaszt és fordítva, de ez nem igaz. Emellett a tranzakciónkénti becslés érzékeny arra, hogy a blokklánc tranzakcióátvitelét hogyan definiálják, melynek megcsavarásával látszólag nagyobb vagy kisebb érték jön ki. +Számos cikk tranzakciónkénti becslésről beszél a blokkláncok esetén. Ez félrevezető, mert a blokkjavaslat és validálás független a benne található tranzakciók számától. A tranzakciónkénti felhasználás azt jelentené, hogy kevesebb tranzakció kevesebb energiát fogyaszt és fordítva, de ez nem igaz. Emellett a tranzakciónkénti becslés érzékeny arra, hogy a blokklánc tranzakcióátvitelét hogyan definiálják, amelynek megcsavarásával látszólag nagyobb vagy kisebb érték jön ki. -Például az Ethereumon a tranzakcióátvitel nemcsak az alapréteget tartalmazza, hanem a [második blokkláncréteg (L2)](/layer-2/) rollupjait is. Az L2 általában nincs benne a kalkulációkban, de ha hozzávennénk a szekvenszer általi fogyasztást (kevés) és a kezelt tranzakciókat (sok), akkor jelentősen lecsökkenne a tranzakciónkénti becslés. Ez az egyik oka annak, hogy a platformok tranzakciónkénti energiafogyasztásának összehasonlítása félrevezető lehet. +Az Ethereumon például a tranzakcióátvitel nemcsak az alapréteget tartalmazza, hanem a [második blokkláncréteg (L2)](/layer-2/) összevont tranzakcióit is. Az L2 általában nincs benne a kalkulációkban, de ha hozzávennénk a szekvenszer általi fogyasztást (kevés) és a kezelt tranzakciókat (sok), akkor jelentősen lecsökkenne a tranzakciónkénti becslés. Ez az egyik oka annak, hogy a platformok tranzakciónkénti energiafogyasztásának összehasonlítása félrevezető lehet. ## Az Ethereum karbonadóssága {#carbon-debt} -Az Ethereum energiafelhasználása igen alacsony, de nem mindig volt így. Eredetileg a proof-of-work mechanizmust használta, ami nagyobb környezeti költségekkel járt, mint a jelenlegi proof-of-stake. +Az Ethereum energiafelhasználása igen alacsony, de nem mindig volt így. Az Ethereum eredetileg a proof-of-work mechanizmust használta, ami nagyobb környezeti költségekkel járt, mint a jelenlegi proof-of-stake. -Az Ethereum eleve a proof-of-stake alapú konszenzusmechanizmust tervezte, anélkül hogy feláldozná a biztonságot vagy a decentralizálást, és ezért többéves fókuszált kutatás és fejlesztés kellett hozzá. Emiatt a hálózat felállításához a proof-of-work mechanizmusra volt szükség. Ennél a bányászok a számítógépeiket használják az érték kiszámolására, energiát fogyasztva eközben. +Az Ethereum eleve a proof-of-stake-alapú konszenzusmechanizmust tervezte, anélkül hogy feláldozná a biztonságot vagy a decentralizáltságot, ezért többéves fókuszált kutatás és fejlesztés kellett hozzá. Emiatt a hálózat felállításához a proof-of-work mechanizmusra volt szükség. Ennél a bányászok a számítógépeiket használják az érték kiszámolására, energiát fogyasztva eközben. -![Az Ethereum energiafogyasztásának összehasonlítása a Merge előtt és után, ahol az Eiffel torony (330 méter magas) a bal oldalon jeleni a korábbi állapotot, egy 4 cm-es LEGO-figura pedig a jelenlegit](energy_consumption_pre_post_merge.png) +![Az Ethereum energiafogyasztásának összehasonlítása a Beolvadás előtt és után, ahol az Eiffel torony (330 méter magas) a bal oldalon jelenti a korábbi állapotot, vagyis a nagy energiafogyasztást, a jelentős csökkenést pedig a 4 cm-es LEGO-figura képviseli](energy_consumption_pre_post_merge.png) -A CCRI becslése szerint a Merge több mint **99,988%-kal** lecsökkentette az éves áramfogyasztást. Ugyanígy a karbonlábnyoma is csökkent **99,992%-kal** (11 016 000 tonna helyett 870 tonna CO2e lett). Ez a változás olyan, mint az Eiffel torony magaságáról egy kis bábu méretére csökkent fogyasztás, ahogy az ábra illusztrálja. Ennek következtében a hálózat biztosításának környezeti költsége drasztikusan lecsökkent. A hálózat biztonsága pedig növekedett. +A CCRI becslése szerint a Beolvadás több mint **99,988%-kal** lecsökkentette az Ethereum éves áramfogyasztását. Ugyanígy az Ethereum karbonlábnyoma is csökkent **99,992%-kal** (11 016 000 tonna helyett 870 tonna CO2e lett). Ez a változás olyan, mint az Eiffel torony magaságáról egy kis bábu méretére csökkent fogyasztás, ahogy az ábra illusztrálja. Ennek következtében a hálózat biztosításának környezeti költsége drasztikusan lecsökkent. A hálózat biztonsága pedig növekedett. ## Környezetbarát alkalmazási réteg {#green-applications} -Miközben az Ethereum energiafogyasztása nagyon alacsony, egy jelentős, fejlődő és igen aktív [**regeneratív pénzügyek (ReFi)**](/refi/) közösség épült a hálózaton. A ReFi alkalmazások a decentralizált pénzügyek (DeFi) komponenseit használják, hogy olyan pénzügyi alkalmazásokat építsenek, melyek pozitív externáliákat teremtenek. A ReFi része egy kiterjedtebb[„solarpunk”](https://en.wikipedia.org/wiki/Solarpunk) mozgalomnak, ami szorosan kötődik az Ethereumhoz, és a technológiai fejlődést a környezetről való gondoskodással párosítja. Az Ethereum decentralizált, engedélymentes és egymásra építhető jellege miatt ideális alap a ReFi és a solarpunk közösségeknek. +Miközben az Ethereum energiafogyasztása nagyon alacsony, egy jelentős, fejlődő és igen aktív [**regeneratív pénzügyi (ReFi)**](/refi/) közösség épült a hálózaton. A ReFi alkalmazások a decentralizált pénzügyek (DeFi) komponenseit használják, hogy olyan pénzügyi alkalmazásokat építsenek, amelyek pozitív externáliákat teremtenek. A ReFi része egy kiterjedtebb[„solarpunk”](https://en.wikipedia.org/wiki/Solarpunk) mozgalomnak, ami szorosan kötődik az Ethereumhoz, és a technológiai fejlődést a környezetről való gondoskodással párosítja. Az Ethereum decentralizált, engedélymentes és egymásra építhető jellege miatt ideális alap a ReFi és a solarpunk közösségeknek. A web3 közjó-finanszírozási platformjai, mint a [Gitcoin](https://gitcoin.co) klímaköröket működtetnek, hogy elősegítsék az Ethereum alkalmazási rétegének környezettudatos építését. Ezen kezdeményezések (és mások, mint a [decentralizált tudomány / DeSci](/desci/)) kialakulása által az Ethereum egy környezeti és közösségi szempontból pozitív technológia. diff --git a/public/content/translations/hu/governance/index.md b/public/content/translations/hu/governance/index.md index 3ca7094949b..6cc93f75b3b 100644 --- a/public/content/translations/hu/governance/index.md +++ b/public/content/translations/hu/governance/index.md @@ -175,9 +175,9 @@ Amikor a Beacon-lánc egyesült az Ethereum végrehajtási réteggel 2022. szept Az Ethereumban az irányítás nincs szigorúan definiálva. A közösség különféle tagjainak eltérő perspektívái vannak ezzel kapcsolatban. Néhány ezek közül: -- [Megjegyzések a blokkláncirányításról](https://vitalik.ca/general/2017/12/17/voting.html) – _Vitalik Buterin_ +- [Megjegyzések a blokkláncirányításról](https://vitalik.eth.limo/general/2017/12/17/voting.html) – _Vitalik Buterin_ - [Hogyan működik az Ethereum irányítása?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [Hogyan működik az Ethereum irányítása](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Kik az az Ethereum protokollfejlesztői?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) – _Hudson Jameson_ -- [Irányítás – 2. rész: a plutokrácia, vagyis a gazdagok általi irányítás még mindig nem az igazi](https://vitalik.ca/general/2018/03/28/plutocracy.html) – _Vitalik Buterin_ -- [Túllépni az érmealapú szavazáson](https://vitalik.ca/general/2021/08/16/voting3.html) – _Vitalik Buterin_ +- [Irányítás – 2. rész: a plutokrácia, vagyis a gazdagok általi irányítás még mindig nem az igazi](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) – _Vitalik Buterin_ +- [Túllépni az érmealapú szavazáson](https://vitalik.eth.limo/general/2021/08/16/voting3.html) – _Vitalik Buterin_ diff --git a/public/content/translations/hu/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/hu/guides/how-to-create-an-ethereum-account/index.md index 0815a06810e..639df1e616a 100644 --- a/public/content/translations/hu/guides/how-to-create-an-ethereum-account/index.md +++ b/public/content/translations/hu/guides/how-to-create-an-ethereum-account/index.md @@ -20,7 +20,7 @@ A tárca egy olyan alkalmazás, amely segíti az Ethereum-számla kezelését. K Ha Ön most ismerkedik ezzel a területtel, akkor választhatja a „Kezdő a kripto világában” szűrőt a „Tárca keresése” oldalon, hogy olyan termékek közül választhasson, amelyek kifejezetten a kezdők számára fontos funkciókat kínálni. -![szűrés a „Tárca keresése” oldalon](./wallet-box.png) +![Szűrési lehetőségek a „Tárca keresése” oldalon](./wallet-box.png) Egyéb profilszűrők is elérhetők, hogy saját igényeire szabhassa a keresést. Íme néhány példa a leggyakrabban használt tárcák közül – mindig vizsgálja meg Ön is az adott szolgáltatást, mielőtt bármilyen szoftvert kiválaszt. diff --git a/public/content/translations/hu/guides/how-to-swap-tokens/index.md b/public/content/translations/hu/guides/how-to-swap-tokens/index.md index 8f9ff60248d..992d0bf7551 100644 --- a/public/content/translations/hu/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/hu/guides/how-to-swap-tokens/index.md @@ -12,7 +12,7 @@ A tokenváltás két különböző eszköz cseréje, melyek az Ethereum hálóza **Feltételek:** -- rendelkeznie kell egy kriptotárcával – ehhez kövesse a következő útmutatót: [Hogyan lehet létrehozni Ethereum számlát](/guides/how-to-register-an-ethereum-account/) +- rendelkeznie kell egy kriptotárcával – ehhez kövesse a következő útmutatót: [Hogyan lehet létrehozni Ethereum-számlát](/guides/how-to-create-an-ethereum-account/) - lennie kell pénzeszközöknek a tárcájában ## 1. Kapcsolja a tárcáját egy kiválasztott decentralizált tőzsdéhez (DEX) diff --git a/public/content/translations/hu/guides/how-to-use-a-bridge/index.md b/public/content/translations/hu/guides/how-to-use-a-bridge/index.md index 559058bb11c..3443c5f26b6 100644 --- a/public/content/translations/hu/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/hu/guides/how-to-use-a-bridge/index.md @@ -10,7 +10,7 @@ Ha sok tranzakció fut egyszerre az Ethereumon, akkor drágább a hálózatot ha **Feltételek:** -- rendelkeznie kell egy kriptotárcával – ehhez kövesse a következő útmutatót: [Hogyan lehet létrehozni Ethereum számlát](/guides/how-to-register-an-ethereum-account/) +- rendelkeznie kell egy kriptotárcával – ehhez kövesse a következő útmutatót: [Hogyan lehet létrehozni Ethereum-számlát](/guides/how-to-create-an-ethereum-account/) - lennie kell pénzeszközöknek a tárcájában ## 1. Határozza meg, hogy melyik L2 hálózatot szeretné használni diff --git a/public/content/translations/hu/guides/how-to-use-a-wallet/index.md b/public/content/translations/hu/guides/how-to-use-a-wallet/index.md index 8755ded05da..973544b67b1 100644 --- a/public/content/translations/hu/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/hu/guides/how-to-use-a-wallet/index.md @@ -6,7 +6,7 @@ lang: hu # Hogyan használja a tárcát -Ismerje meg, hogyan működnek a tárca alapvető funkciói. Ha Ön még nem rendelkezik tárcával, akkor nézze meg a [Hogyan lehet Ethereum számlát létrehozni](/guides/how-to-create-an-ethereum-account/) című útmutatót. +Ismerje meg, hogyan működnek a tárca alapvető funkciói. Ha még nem rendelkezik tárcával, akkor tekintse meg a [Hogyan lehet Ethereum-számlát létrehozni](/guides/how-to-create-an-ethereum-account/) című útmutatót. ## Nyissa ki tárcáját @@ -51,7 +51,7 @@ Az Ön címe minden Ethereum-projekt esetében azonos. Nem kell regisztrálnia k 1. Látogasson el bármelyik projekt oldalára. 2. Ha a projekt oldala csak egy tájékoztató leírás, akkor kattintson az Alkalmazás megnyitása gombra a menüben, ami elvezeti Önt a valódi alkalmazáshoz. -3. Az alkalmazásban kattintson a „Kapcsolódás” gombra +3. Az alkalmazáson belül kattintson a „Kapcsolódás” gombra. ![Gomb a felhasználó számára, melynek segítségével tárcájával a weboldalhoz kapcsolódhat](./connect1.png) diff --git a/public/content/translations/hu/nft/index.md b/public/content/translations/hu/nft/index.md index 7ffb8eaec6d..58efd3b5a50 100644 --- a/public/content/translations/hu/nft/index.md +++ b/public/content/translations/hu/nft/index.md @@ -12,17 +12,17 @@ summaryPoint2: Az NFT-k minden korábbinál nagyobb hatalmat adnak a tartalomgy summaryPoint3: Az Ethereum blokklánc okosszerződései által működtetve. --- -## Mik azok a nem helyettesíthető tőkenek (NFT)? {#what-are-nfts} +## Mik azok a nem helyettesíthető tokenek (NFT)? {#what-are-nfts} -Az NFT-k olyan tokenek, melyek teljesen egyediek. Minden egyes NFT más jellemzőkkel bír (nem helyettesíthető) és bizonyítottan véges. Különbözik más tokenektől, mint amilyen az ERC-20 is, ahol egy adott tokenszett minden eleme azonos és ugyanolyan jellemzőkkel bír (helyettesíthető). Nem számít, hogy az ember pénztárcájában konkrétan melyik bankjegy található, mert mindegyik azonos és ugyanolyan értékű. Az azonban _valóban_ számít, hogy Ön melyik NFT-t birtokolja, mert egyedi jellemzőik megkülönböztetik azokat egymástól (nem helyettesíthető). +Az NFT-k olyan tokenek, melyek teljesen egyediek. Minden egyes NFT más jellemzőkkel bír (nem helyettesíthető) és bizonyítottan véges. Különbözik más tokenektől, mint amilyen az ETH vagy más Ethereum-alapú tokenek, pl. az USDC, ahol minden token azonos és ugyanolyan jellemzőkkel rendelkezik (helyettesíthető). Nem számít, hogy az ember pénztárcájában konkrétan amelyik bankjegy (vagy ETH) található, mert mindegyik azonos és ugyanolyan értékű. Az azonban _valóban_ számít, hogy Ön melyik NFT-t birtokolja, mert egyedi jellemzőik megkülönböztetik azokat egymástól (nem helyettesíthető). -Az NFT-k egyedisége révén akár műtárgyak, gyűjthető tárgyak vagy ingatlanok is tokenné alakíthatók. Ekkor egy adott egyedi NFT egy specifikus, egyedi, valós vagy digitális tárgyat képvisel. Egy eszköz tulajdonjogát az Ethereum-blokklánc biztosítja – senki sem módosíthatja a tulajdonjog igazolását, vagy hozhat létre új NFT-t másolással és beillesztéssel. +Az NFT-k egyedisége révén akár műtárgyak, gyűjthető tárgyak vagy ingatlanok is tokenné alakíthatók. Ekkor egy adott egyedi NFT egy specifikus, egyedi, valós vagy digitális tárgyat képvisel. Az eszköz tulajdonjoga nyilvánosan ellenőrizhető az Ethereum blokkláncon. ## Az eszközök internete {#internet-of-assets} -Az NFT-k és az Ethereum megoldást jelent néhány, napjainkban az interneten jelen lévő problémára. Ahogy minden egyre digitálisabbá válik, egyre inkább szükség van a fizikai tárgyak bizonyos tulajdonságainak replikálására, mint például a ritkaság, az egyediség és a tulajdonjog bizonyítása. oly módon, hogy azt ne egy központi szervezet irányítsa. Például az NFT révén bárki birtokolhat olyan mp3 zenét, mely nem egy cég specifikus zenei alkalmazásához kötődik, illetve egy olyan oldalt a közösségi médiában, melyet eladhat vagy elcserélhet, de azt nem veheti el önkényesen a platform szolgáltatója. +Az NFT-k és az Ethereum megoldást jelent néhány, napjainkban az interneten jelen lévő problémára. Ahogy minden egyre digitálisabbá válik, egyre inkább szükség van a fizikai tárgyak bizonyos tulajdonságainak replikálására, mint például a ritkaság, az egyediség és a tulajdonjog bizonyítása úgy, hogy azt nem egy központi szervezet irányítja. Az NFT-kkel például bárki birtokolhat egy mp3-formátumú zeneszámot egyszerre minden Ethereum-alapú alkalmazásban, és nincs hozzákötve egy adott vállalat zenei alkalmazásához, mint amilyen a Spotify vagy az Apple Music. Birtokában lehet egy közösségi média profil is, amelyet eladhat vagy elcserélhet, de azt önkényesen nem veheti el Öntől a platform szolgáltatója. Így néz ki az NFT-k internete ahhoz az internethez képest, amelyet a többségünk minden nap használ... @@ -30,19 +30,13 @@ Az NFT-k és az Ethereum megoldást jelent néhány, napjainkban az interneten j | Az NFT-k internete | Az internet ma | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Ön birtokolja az eszközeit! Egyedül Ön adhatja vagy cserélheti el azokat. | Eszközt bérel valamelyik szervezettől. | +| Ön birtokolja az eszközeit! Egyedül Ön adhatja vagy cserélheti el azokat. | Ön kikölcsönöz egy eszközt valamely szervezettől, és azt el is vehetik Öntől. | | Az NFT-k digitálisan egyediek, nincs két azonos NFT. | Egy adott entitás másolatát gyakran nem lehet megkülönböztetni az eredetitől. | | Az NFT tulajdonjogát a blokklánc tárolja, így bárki beazonosíthatja azt. | A digitális javak tulajdonjogi nyilvántartását intézmények által ellenőrzött szervereken tárolják – az ő szavukra kell hagyatkoznunk. | | Az NFT-k okosszerződések az Ethereum hálózatán. Ez azt jelenti, hogy így könnyen fel lehet azokat használni más okosszerződésekben és alkalmazásokban az Ethereumon! | A digitális eszközöket birtokló vállalatoknak általában saját, falakkal védett infrastruktúrát kell kialakítaniuk. | | A tartalomkészítők bárhol eladhatják munkáikat, és hozzáférhetnek a világpiachoz. | Az alkotók csak annak a felületnek a hálózatára és disztribúciójára támaszkodhatnak, amelyet használnak. Ezeknek gyakran felhasználási feltételei és földrajzi korlátai vannak. | | Az NFT létrehozói megtarthatják tulajdonjogaikat saját munkájukat illetően, valamint belefoglalhatják a jogdíjfizetést az NFT szerződésbe. | Az online zeneszolgáltatók és a hasonló platformok megtartják a haszon túlnyomó részét. | -## Hogyan működnek az NFT-k? {#how-nfts-work} - -Ahogy az Ethereumon létrehozott többi tokent, az NFT-ket is okosszerződések kreálják. Az okosszerződés a számos NFT-standard egyikét (általában ERC-721 vagy ERC-1155) alkalmazza, mely meghatározza a szerződés funkcióit. A szerződés létrehozza (minteli) az NFT-t, és egy adott tulajdonoshoz rendeli. A tulajdonjogot úgy határozza meg a szerződés, hogy az adott NFT-t adott címhez köti. Az NFT rendelkezik egy azonosítóval (ID) és jellemzően metaadatok kapcsolódnak hozzá, melyek egyedivé teszik az adott tokent. - -Amikor valaki létrehozza vagy minteli az NFT-t, akkor valójában az okosszerződés egy funkcióját indítja el, mely a címéhez rendeli az adott NFT-t. Ezt az információt a szerződés tárhelye őrzi a blokklánc részeként. A szerződés létrehozója egyéb logikát is belevehet a szerződésbe, mint például a kínálat korlátozása, illetve jogdíjfizetés az alkotónak minden alkalommal, amikor a token tulajdonost vált. - ## Mire használják az NFT-ket? {#nft-use-cases} Az NFT-ket számtalan esetben használják, ilyen például: @@ -58,11 +52,11 @@ Az NFT-ket számtalan esetben használják, ilyen például: - decentralizált internetes domainnevek - fedezet a decentralizált pénzügyekben (DeFi) -Tegyük fel, hogy Ön egy művész, aki szeretné NFT-ként megosztani az alkotását, anélkül hogy elveszítené az ellenőrzést felette és közvetítőkre áldozná a profitját. Létrehozhat egy új szerződést, melyben megadja az NFT-k számát, jellemzőiket, és hozzákapcsolja az adott műalkotást. Beleírhatja az okosszerződésbe az Önnek járó jogdíjakat (pl. az eladási ár 5%-át utalják a szerződés tulajdonosának minden alkalommal, amikor az NFT gazdát cserél). Mindig képes lesz bizonyítani, hogy Ön hozta létre az NFT-ket, mert a birtokában van az a tárca, mely létrehozta a szerződést. A vásárlók is könnyedén bizonyíthatják, hogy eredeti NFT-vel rendelkeznek az Ön kollekciójából, mert a tárcáik címe hozzá van rendelve egy tokenhez az okosszerződésben. Az egész Ethereum-ökoszisztémában használhatják az NFT-t, teljes bizonyossággal az eredetiségét illetően. +Tegyük fel, hogy Ön egy művész, aki szeretné NFT-ként megosztani az alkotását, anélkül hogy elveszítené az ellenőrzést felette és közvetítőkre áldozná a profitját. Létrehozhat egy új szerződést, amelyben megadja az NFT-k számát, jellemzőiket, és hozzákapcsolja az adott műalkotást. Beleírhatja az okosszerződésbe az Önnek járó jogdíjakat (pl. az eladási ár 5%-át utalják a szerződés tulajdonosának minden alkalommal, amikor az NFT gazdát cserél). Mindig képes lesz bizonyítani, hogy Ön hozta létre az NFT-ket, mert a birtokában van az a tárca, amely létrehozta a szerződést. A vásárlók is könnyedén bizonyíthatják, hogy eredeti NFT-vel rendelkeznek az Ön kollekciójából, mert a tárcáik címe hozzá van rendelve egy tokenhez az okosszerződésben. Az egész Ethereum-ökoszisztémában használhatják az NFT-t, teljes bizonyossággal az eredetiségét illetően. -Vagy vegyünk például egy sporteseményre szóló jegyet. Ahogyan egy rendezvény szervezője eldöntheti, hogy hány jegyet ad el, úgy az NFT létrehozója is eldöntheti, hogy hány másolat létezhet. Néha ezek pontos másolatok, mint például 5000 darab nem helyre szóló belépőjegy. Néha több olyan jegyet is kiállítanak, amelyek nagyon hasonlóak, de mindegyik kissé különbözik, mint például kijelölt ülőhelyekre szóló jegyek. Ezeket vehetik és adhatják egymás között (peer-to-peer) anélkül, hogy fizetni kellene a jegyárusoknak, a vevő pedig a szerződés címét ellenőrizve mindig meggyőződhet a jegyek eredetiségéről. +Vagy vegyünk például egy sporteseményre szóló jegyet. Ahogyan egy rendezvény szervezője eldöntheti, hogy hány jegyet ad el, úgy az NFT létrehozója is eldöntheti, hogy hány másolat létezhet. Néha ezek pontos másolatok, mint például 5000 darab nem helyre szóló belépőjegy. Néha több olyan jegyet is kiállítanak, amelyek nagyon hasonlóak, de mindegyik kissé különbözik, mint például kijelölt ülőhelyekre szóló jegyek. Ezeket vehetik és adhatják egymás között (peer-to-peer módon) anélkül, hogy fizetni kellene a jegyárusoknak, a vevő pedig a szerződés címét ellenőrizve mindig meggyőződhet a jegyek eredetiségéről. -Az ethereum.org portálon NFT-t használunk arra, hogy igazoljuk a tagok közreműködését a Github gyűjteményhez (repóhoz) vagy a részvételüket bizonyos konferenciabeszélgetéseken, sőt, saját NFT domainnévvel is rendelkezünk. Ha Ön hozzájárul az ethereum.org felülethez, egy POAP NFT-t igényelhet. Bizonyos kriptotalálkozók POAP-ot (részvételt tanúsító protokollt) használnak jegy gyanánt. [Tudjon meg többet a hozzájárulásról](/contributing/#poap). +Az ethereum.org-on NFT-k bizonyítják azt, hogy valaki hozzájárult a Github könyvtárhoz (programozták a honlapot, cikket írtak vagy módosítottak stb.), más nyelvekre fordított tartalmat, vagy részt vett a közösségi megbeszéléseken, emellett az ethereum.org saját NFT domain névvel is rendelkezik. Ha Ön hozzájárul az ethereum.org felülethez, egy POAP NFT-t igényelhet. Bizonyos kriptotalálkozók POAP-ot (részvételt tanúsító protokollt) használnak jegy gyanánt. [Tudjon meg többet a hozzájárulásról](/contributing/#poap). ![ethereum.org POAP](./poap.png) @@ -72,11 +66,25 @@ Ez a weboldal egy alternatív, NFT-k által működtetett domainnévvel is rende +## Hogyan működnek az NFT-k? {#how-nfts-work} + +Az NFT-k, ahogy az Ethereum blokklánc többi digitális eszköze, egy speciális, Ethereum-alapú számítógépes program révén keletkeznek, amelyet okosszerződésnek neveznek. Ezek a szerződések olyan szabályokat követnek, mint az ERC-721 vagy az ERC-1155 szabványok, amelyek meghatározzák a szerződés működési körét. + +Az NFT-okosszerződésekkel számos fontos dolog végrehajtható: + +- **NFT-k létrehozása:** Új NFT-ket lehet alkotni. +- **Tulajdonjog meghatározása:** Követi, hogy amely NFT-nek ki a birtokosa azáltal, hogy azokat meghatározott Ethereum-címekhez köti. +- **Minden NFT-hez azonosítót rendel:** Az NFT-k egy egyedi számmal is el vannak látva. Emellett általában más információkat (metaadatokat) is hozzákapcsolnak az NFT-khez, amellyel feltárják, hogy mit is képviselnek. + +Amikor valaki létrehoz vagy „mintel” egy NFT-t, akkor gyakorlatilag arra kéri az okosszerződést, hogy adjon neki tulajdonjogot egy bizonyos NFT felett. Ez az információ biztos módon és nyilvánosan van tárolva a blokkláncon. + +Ezenkívül a szerződés létrehozója más szabályokat is megadhat. Meghatározhatja, hogy egy adott NFT-ből mennyit lehet létrehozni vagy megadhatja, hogy amikor az NFT tulajdonost vált, akkor egy kis összegű jogdíj járjon neki. + ### Az NFT-k biztonsága {#nft-security} Az Ethereum biztonságát a letét bizonyítéka (vagyis a proof-of-stake) adja. A rendszert úgy tervezték, hogy gazdaságilag visszatartson a rosszindulatú cselekedetektől, így az Ethereum hamisíthatatlan. Ennek köszönhetően létezhetnek az NFT-k. Ha az NFT-tranzakciót tartalmazó blokk véglegesítetté válik, egy támadónak több millió ETH-ba kerülne megváltoztatni azt. Bárki, aki Ethereum-szoftvert futtat, azonnal képes lenne észlelni az NFT tisztességtelen manipulálását, és a csalárd szereplőt gazdaságilag megbüntetnék és kizárnák. -Az NFT-kel kapcsolatos biztonsági problémák leggyakrabban adathalász csalásokhoz, okosszerződések sebezhetőségéhez vagy felhasználói hibákhoz (például a privát kulcsok véletlen felfedéséhez) kapcsolódnak, így a megfelelő tárcabiztonság kritikus fontosságú az NFT-tulajdonosok számára. +Az NFT-kkel kapcsolatos biztonsági problémák leggyakrabban adathalász csalásokhoz, az okosszerződések sebezhetőségéhez vagy felhasználói hibákhoz (például a privát kulcsok véletlen felfedéséhez) kapcsolódnak, így a megfelelő tárcabiztonság kritikus fontosságú az NFT-tulajdonosok számára. Bővebben a biztonságról diff --git a/public/content/translations/hu/refi/index.md b/public/content/translations/hu/refi/index.md index dce79d906bf..5a4e9d6c8b4 100644 --- a/public/content/translations/hu/refi/index.md +++ b/public/content/translations/hu/refi/index.md @@ -18,7 +18,7 @@ summaryPoint3: Az ökológiailag hasznos eszközök drasztikus skálázási lehe Ehelyett a ReFi arra törekszik, hogy regeneratív ciklusok létrehozásával környezeti, közösségi és szociális problémákat oldjon meg. Ezek a rendszerek egyszerre teremtenek értéket a résztvevőknek, valamint az ökoszisztéma és a közösségek javait szolgálják. -A ReFi egyik alapköve a regeneratív gazdaság koncepciója, melyet John Fullerton fogalmazott meg a [Capital Institute intézettől](https://capitalinstitute.org). Nyolc összefüggő elvet javasolt, melyek megalapozzák a rendszer egészségét: +A ReFi egyik alapköve a regeneratív gazdaság koncepciója, amelyet John Fullerton fogalmazott meg a Capital Institute intézettől. Az ő javaslata [nyolc egymással összefüggő elv,](https://capitalinstitute.org/8-principles-regenerative-economy/) amelyet egy rendszerszintű egészségi állapot támaszt alá: ![A nyolc összefüggő elv](refi-regenerative-economy-diagram.png) diff --git a/public/content/translations/hu/roadmap/account-abstraction/index.md b/public/content/translations/hu/roadmap/account-abstraction/index.md new file mode 100644 index 00000000000..12c4786f6b8 --- /dev/null +++ b/public/content/translations/hu/roadmap/account-abstraction/index.md @@ -0,0 +1,126 @@ +--- +title: Számlaabsztrakció +description: Az Ethereum tervek áttekintése azzal kapcsolatban, hogy a felhasználói számlák egyszerűbbek és biztonságosabbak legyenek +lang: hu +summaryPoints: + - A számlaabsztrakció sokkal egyszerűbbé teszi az okosszerződéses tárcák építését + - Az okosszerződéses tárcák egyszerűbbé teszik az Ethereum számlákhoz való hozzáférés menedzselését + - Az elvesztett vagy nyilvánossá vált kulcsokat többféle biztonsági megoldással is vissza lehet nyerni +--- + +# Számlaabsztrakció {#account-abstraction} + +A felhasználók **[külső tulajdonú számlák (EOA)](/glossary/#eoa)** révén kapcsolódnak az Ethereumhoz. Ez az egyetlen módja, hogy egy tranzakciót kezdeményezzenek vagy elindítsanak egy okosszerződést. Ez behatárolja azt, ahogyan a felhasználók az Ethereummal kapcsolatba léphetnek. Nehézkessé teszi például, hogy tranzakciókötegeket hajtsanak végre és a felhasználóknak mindig tartani kell ETH-t, hogy fedezzék a tranzakciók költségeit (gáz). + +A számlaabsztrakció egy olyan mód, amely megoldást ad ezekre a problémákra azáltal, hogy a felhasználók rugalmasabban adhatnak több biztonságot a számláikhoz, illetve jobb felhasználói élményben lehet részük. Ehhez arra van szükség, hogy [EOA-kat fejleszteni kell](https://eips.ethereum.org/EIPS/eip-3074), hogy okosszerződéssel is lehessen azokat irányítani, vagy [az okosszerződéseket kell fejleszteni](https://eips.ethereum.org/EIPS/eip-2938) úgy, hogy tranzakciókat tudjanak kezdeményezni. Mindkét opcióhoz módosítani kell az Ethereum-protokollt. Egy harmadik megoldás is lehetséges, ahol egy [második, elkülönült tranzakciós rendszert](https://eips.ethereum.org/EIPS/eip-4337) hoznak létre, hogy a meglévő protokollal párhuzamosan működjön. A megoldási módtól függetlenül az eredmény az, hogy az Ethereumot okosszerződéses tárcákkal, a meglévő protokoll támogatásával vagy egy hozzáadott tranzakciós hálózattal is el lehet érni. + +Az okosszerződéses tárcák számos előnnyel járnak a felhasználók számára: + +- beállíthatják a saját rugalmas biztonsági szabályaikat +- a számlát vissza lehet állítani akkor is, ha a kulcsok elvesztek +- a számla biztonságát meg lehet osztani megbízható eszközökkel vagy egyénekkel +- lehet gázt fizetni más helyett, illetve helyettünk is fizethet más +- a tranzakciókat össze lehet kötegelni (pl. az átváltásokat egyszerre jóvá lehet hagyni és végrehajtani) +- az alkalmazás- (dapp) és tárcafejlesztőknek több lehetőségük van, hogy javítsák a felhasználói élményeket + +Jelenleg ezek az előnyök nem érhetők el, mert csak a külső tulajdonú számlák ([EOA](/glossary/#eoa)) indíthatnak tranzakciókat. Az EOA-k lényegileg egy nyilvános-privát kulcspárból állnak. Így működnek: + +- aki rendelkezik egy privát kulccsal, az _bármit_ megtehet az Ethereum Virtuális Gép (EVM) szabályain belül +- aki nem rendelkezik a privát kulccsal, az _semmit_ sem tehet. + +Ha a kulcsok elvesznek, akkor nem lehet azokat visszaszerezni, illetve az ellopott kulcsok azonnali hozzáférést adnak a számlán lévő eszközökhöz. + +Az okosszerződéses tárcák megoldást tudnak ezekre adni, de jelenleg nehéz programozni ezeket, mert minden egyes logikát a végén le kell fordítani egy adag EOA-tranzakcióra, hogy azokat végre lehessen hajtani az Ethereumon. A számlaabsztrakció lehetővé teszi az okosszerződések számára, hogy tranzakciókat indítsanak el, ezért a felhasználó bármilyen általa kívánt logikát be tud kódolni az okosszerződéses tárcába és azt végre tudja hajtatni az Ethereumon. + +Végül a számlaabsztrakció fejleszti az okosszerződéses tárcák támogatását, mivel egyszerűbb lesz azokat megépíteni és biztonságosabb lesz használni. A számlaabsztrakció révén a felhasználók az Ethereum összes előnyét kiélvezhetik, és nem kell tudniuk vagy foglalkozniuk a mögöttes technológiával. + +## A kulcsmondatokon túl {#beyond-seed-phrases} + +Jelenleg a számlákat a privát kulcsok használata védi, amelyet kulcsmondatokból állítanak elő. Aki hozzáfér a kulcsmondathoz, az könnyen fel tudja fedezni a számlát védő privát kulcsot, így hozzáférhet a számla eszközeihez. Ha a privát kulcs és a kulcsmondat elvész, akkor azokat már nem lehet visszanyerni és a számlán tárolt eszközök örökre be lesznek fagyasztva. A kulcsmondatok biztonságos tárolása elég kényelmetlen még a szakértő felhasználók számára is, és az ezekre irányuló adathalászat a fő oka annak, hogy a felhasználókat átverik. + +A számlaabsztrakció esetében az okosszerződés tárolja a eszközöket és hagyja jóvá a tranzakciókat. Ezeket az okosszerződéseket személyre szabott logikával lehet működtetni, hogy a lehető legbiztonságosabbak legyenek és a felhasználóra legyenek szabva. A felhasználó még mindig privát kulcsokat használ ahhoz, hogy a számlát irányítsa, de azt biztonsági hálóval együtt teszi, amely könnyebbé és biztonságosabbá teszi a kezelést. + +Például olyan biztonsági kulcsok adhatók a tárcához, hogy ha valaki elveszíti vagy véletlenül feltárja a fő kulcsát más előtt, akkor azt kicserélheti egy új, biztonságos kulcsra, amelyet a biztonsági kulcs engedélyez. A különféle kulcsot más-más módon biztosíthatja a felhasználó, vagy megbízott őrzők között is feloszthatja azt. Ezáltal sokkal nehezebbé válik a csalóknak, hogy teljes kontrollt szerezzenek az eszközök felett. Ehhez hasonlóan szabályokat lehet hozzáadni a tárcához, amelyek csökkentik a hatását annak, ha a fő kulcsot ellopják. Például az alacsony értékű tranzakciókat egyszerű aláírással is lehet igazolni, míg a magasabb értékűek esetén több felhatalmazott aláíró jóváhagyására van szükség. Más módokon is segít az okosszerződéses tárca a tolvajok elrettentésében, például egy lista segítségével minden olyan tranzakciót blokkolni lehet, amely nem egy biztonságos címzettnek megy, vagy amit nem igazol több előre jóváhagyott kulcs. + +### Néhány példa arra, hogy milyen biztonsági logikákat lehet beépíteni az okosszerződéses tárcába: + +- **Többaláírásos jóváhagyás**: A jóváhagyásra való meghatalmazást meg lehet osztani több megbízható ember vagy eszközök között. Ekkor a szerződést úgy lehet beállítani, hogy egy előre meghatározott érték feletti tranzakció jóváhagyást kérjen a megbízott felek egy adott arányától (pl. 5-ből 3-tól). Egy magas értékű tranzakció például jóváhagyást kérhet egy mobileszköztől és egy hardvertárcától egyszerre, vagy a megbízott családtagok között megosztott számláktól igényelhet aláírást. +- **Számlabefagyasztás**: Ha egy eszköz elveszett vagy más kezébe került, akkor a számlát be lehet fagyasztani egy másik jóváhagyott eszközről, ezzel megvédve a felhasználó eszközeit. +- **Számla-visszaállítás**: Elveszett az eszköz vagy elfelejtette a jelszót? A jelenlegi felállásban ez azt jelenti, hogy a számlán tartott eszközök örökre befagyasztva maradnak. Az okosszerződéses tárcával be lehet állítani néhány előre jóváhagyott számlát, amely képes engedélyezni új eszközöket és visszaállítani a hozzáférést. +- **Tranzakciólimitek beállítása**: Napi határértéket lehet megadni arra vonatkozóan, hogy milyen értéket lehet áttranszferálni az adott számláról egy nap/hét/hónap alatt. Tehát ha egy támadó hozzáférést szerez a számlához, akkor nem tudja egyszerre kiüríteni azt, a tulajdonos pedig be tudja azt fagyasztani és visszaállítani a saját hozzáférést. +- **Engedélyezési lista készítése**: Csak olyan tranzakciókat lehet elindítani, amelyek előre megadott, biztonságos címekre adnak át eszközöket. Ekkor, _még ha_ a privát kulcsot el is lopták, a támadó nem tud pénzügyi eszközöket küldeni olyan számlákra, amelyek nem szerepelnek az engedélyezési listán. Ezek a listák többszörös aláírást igényelnek, így a támadó nem tudja egyszerűen hozzáadni a saját címét a listához, hacsak nem fér hozzá több biztonsági kulcshoz is egyszerre. + +## Jobb felhasználói élmény {#better-user-experience} + +A számlaabsztrakció lehetővé teszi a **jobb felhasználói élményt** és **a magasabb fokú biztonságot**, mert támogatást biztosít az okosszerződéses tárcának a protokoll szintjén. Ez a megoldás az okosszerződések, tárcák és alkalmazások fejlesztőinek olyan szintű szabadságot ad az innovációra a felhasználói élményt illetően, olyan módokon, amiket most még elképzelni sem tudunk. Néhány egyértelmű fejlesztés a számlaabsztrakció mellett többek között az, hogy a tranzakciókat kötegelni lehet a gyorsaság és a hatékonyság érdekében. Például egy egyszerű átváltás egy egykattintásos művelet lehet, míg jelenleg az átváltás előtt a különböző tokenekre külön tranzakciót kell aláírni. A számlaabsztrakcióval megszűnik ez a többszörös jóváhagyás, mert a tranzakciókat össze lehet kötegelni. Emellett a kötegelt tranzakciókat úgy hagyja jóvá a felhasználó, hogy a tokeneknek a megfelelő értéke szerepel benne, majd a végrehajtás után visszavonja a jóváhagyást, ezzel fokozva a biztonságot. + +A gáz, vagyis a tranzakciós díjak kezelése is sokkal fejlettebbé válik a számlaabsztrakcióval. Az alkalmazások felajánlhatják, hogy kifizetik a felhasználók gázdíját, továbbá a gázt más tokenben is lehet rendezni, nem csak ETH-ben, így a felhasználóknak nem kötelező ETH-összeget tartani a számlájukon, hogy a tranzakciókat finanszírozni tudják. Ez úgy valósul meg, hogy a szerződésen belül a felhasználó tokenjeit átváltják ETH-re, és ebben fizetik ki a gázt. + + + +A gázdíjak kezelése az egyik fő gond az Ethereum-felhasználók számára, mert csak ETH-ben lehet azt rendezni. Tegyük fel, hogy van egy tárca USDC-egyenleggel, de nincs benne ETH. Akkor az USDC-tokeneket nem tudja a tulajdonos elküldeni vagy átváltani, mert nem tudja kifizetni a gázdíjat. Nem lehet átváltani az USDC-t ETH-re, mert ez önmagában gázdíjat igényel. Ennek megoldásához ETH-t kell beküldeni a számlára egy tőzsdéről vagy egy másik címről. Az okosszerződéses tárcákkal ki lehet fizetni a gázdíjat a számlán tartott USDC-ből, így szabadon használható a számla. Ennek köszönhetően nem kell ETH-egyenleget tartani az összes számlán. + +A számlaabsztrakció lehetővé teszi a dapp fejlesztőknek azt is, hogy a gázdíj kezelésében kreatívak legyenek. Például a kedvenc tőzsdéjének a felhasználó akár fix díjat is fizethetne havonta korlátlan mennyiségű tranzakcióért. A dappok felajánlhatják, hogy kifizetik az összes gázdíjat a felhasználó helyett, ezzel jutalmazva őket, hogy az adott platformot használják, vagy belépési ajánlat gyanánt. A fejlesztőknek könnyebb lesz innovatív módon hozzáállni a gázhoz, amikor az okosszerződéses tárcákat protokollszinten támogatják. + + + +A megbízható periódus használata is jelentős hatással lehet a felhasználói élményekre, főleg olyan alkalmazásoknál, mint a játékok, ahol sok kis értékű tranzakciót kell rövid időn belül jóváhagyni. Ha egyesével kell a tranzakciókat engedélyezni, akkor az megtöri a játék élményét, de az állandó jóváhagyás nem lenne biztonságos. Az okosszerződéses tárca engedélyezni tudna bizonyos tranzakciókat egy fix időre, egy meghatározott értékig vagy csak egy bizonyos címre. + +Érdekes azt is átgondolni, hogyan alakulnak a váráslások a számlaabsztrakcióval. Jelenleg minden tranzakciót jóvá kell hagyni és végre kell hajtani a tárcából úgy, a megfelelő token kellő összege rendelkezésre áll. A számlaabsztrakcióval ez az élmény inkább olyan lehet, mint egy online vásárlás, ahol a felhasználó beleteszi a tételeket a kosarába, egyszerre fizeti ki az összeset, és a szerződés kezeli azokat a logikákat, amelyek ehhez szükségesek. + +Ez csak néhány példa arra, hogy a felhasználói élmény hogyan fejlődhet a számlaabsztrakcióval, ám ennél sokkal több is lehetségessé válik. A számlaabsztrakció felszabadítja a fejlesztőket a jelenlegi EOA-k kötöttségei alól, behozhatják a web2 jó szempontjait a web3-ba anélkül, hogy feláldoznák az eszközök fölötti saját felügyeletet, illetve kreatív módon javíthatják a felhasználói élményeket. + +## Hogyan kerül bevezetésre a számlaabsztrakció? {#how-will-aa-be-implemented} + +Az okosszerződéses tárcák most is léteznek, de kihívásokkal teli a megvalósításuk, mert az EVM nem támogatja azokat. Ehelyett azon alapulnak, hogy elég összetett kódokba burkolják a standard Ethereum-tranzakciókat. Az Ethereum képes ezt megváltoztatni azáltal, hogy megengedi az okosszerződéseknek a tranzakciókezdeményezést, így az Ethereum okosszerződésbe lehet kódolni a szükséges logikákat, nem pedig a láncon kívül kezelni azokat. Az okosszerződésbe írt logikák növelik az Ethereum decentralizációját is, mivel nem lesz szükség a tárcafejlesztők által működtetett közvetítőkre, hogy lefordítsák a felhasználók által aláírt üzeneteket Ethereum-tranzakciókká. + + + +EIP-2771 a metatranzakció koncepcióját vezeti be, amelynek révén egy harmadik személy kifizetheti a felhasználó gázdíját anélkül, hogy ehhez változtatni kellene az Ethereum protokollon. Eszerint a felhasználó által aláírt tranzakciók egy „továbbító” szerződéshez kerülnek. Ez a továbbító egy megbízott entitás, amely ellenőrzi a tranzakciók érvényességét, mielőtt elküldi azokat egy gázközvetítőnek. Ezt a láncon kívül intézik, így nem kell érte gázdíjat fizetni. A gázközvetítő átadja a tranzakciót egy „fogadó” szerződésnek, és kifizeti a szükséges díjat, hogy a tranzakció végrehajtható legyen az Ethereumon. A tranzakciót végre lehet hajtani, ha a „továbbító” ismert és a „fogadó” bízta meg. Ez a modell megkönnyíti a fejlesztők számára, hogy gázdíj nélküli tranzakciókat tegyenek lehetővé a felhasználók számára. + + + + + +Az EIP-4337 az első lépés az okosszerződéses tárca támogatására decentralizált módon anélkül, hogy az Ethereum-protokollt változtatni kellene hozzá. Ahelyett, hogy a konszenzusréteget módosítanák, hogy támogassa az okosszerződéses tárcákat, egy új rendszert adnak a meglévő tranzakciós pletykaprotokollhoz. Ez a magasabb szintű rendszer egy új objektumra épül, amely a UserOperation nevet kapta, és a felhasználótól érkező tevékenységeket csomagolja össze a megfelelő aláírásokkal együtt. Majd ezeket a UserOperation-objektumokat elküldik egy dedikált memóriakészletbe, ahol a validátorok azokat egy tranzakcióköteggé szedhetik össze. A tranzakcióköteg számos egyéni UserOperations-sorozatot képvisel, és ugyanúgy bekerül egy Ethereum-blokkba, mint bármilyen normál tranzakció. Ezután a validátorok felveszik azt egy díjmaximalizáló kiválasztási modell alapján. + +Az EIP-4337 azt is megváltoztatja, ahogy a tárcák működnek. Ahelyett, hogy minden egyes tárca újraimplementálná a közös, de összetett biztonsági logikát, ezek a funkciók kikerülnének egy globális tárcaszerződésbe, amelyet „ belépési pontnak” neveznek. Ez üzemeltetné az olyan funkciókat, mint a díjak fizetése és az EVM-kód végrehajtása, így a tárcafejlesztők fókuszálhatnak a kiváló felhasználói élményre. + +Megjegyzés: az EIP-4337 által tervezett belépésipont-szerződést az Ethereum-főhálózatra 2023. március 1-én üzemelték be. A szerződés az Etherscan oldalon tekinthető meg. + + + + + +Az EIP-2938 az Ethereum-protokollt fejleszti azzal, hogy bevezet egy új, AA_TX_TYPE nevű tranzakciótípust, amely három mezőt tartalmaz: nonce, target és data, ahol a nonce egy tranzakciószámláló, a target a belépésipont-szerződés címe, a data pedig az EVM-bájtkód. Ezen tranzakciók végrehajtásához két új parancsot (operációs kódot) kell hozzáadni az EVM-hez: NONCE és PAYGAS. A NONCE opkód trekkeli a tranzakciósorrendet, a PAYGAS kalkulálja és levonja a végrehajtáshoz szükséges gázdíjat a szerződés egyenlegéből. Ezek az új funkciók lehetővé teszik az Ethereumnak, hogy támogassa az okosszerződéses tárcákat, mivel a szükséges infrastruktúra az Ethereum-protokollba épül be. + +Jelenleg az EIP-2938 változtatás nem aktív. A közösség az EIP-4337 javaslatot támogatja, mert ahhoz nem szükséges megváltoztatni a protokollt. + + + + + +Az EIP-3074 az Ethereumot úgy fejleszti, hogy a külső tulajdonú számlák képesek legyenek delegálni a kontrollt egy okosszerződésnek. Eszerint az okosszerződés logikája jóváhagyhat olyan tranzakciót, amely egy külső tulajdonú számlától (EOA) származik. Ez lehetővé teszi az olyan funkciók bevezetését, mint a gázdíjak szponzor általi kifizetése és a kötegelt tranzakciók. Ennek működéséhez két új operációs kódot kell hozzáadni az EVM-hez: AUTH és AUTHCALL. Az EIP-3074 révén az okosszerződéses tárca előnyei elérhetővé válnak úgy, hogy nem kell hozzá szerződés – ehelyett egy státuszmentes, bizalomigény-mentes, nem változtatható szerződés, a „hívó” kezeli a tranzakciókat. + +Jelenleg az EIP-3074 változtatás nem aktív. A közösség az EIP-4337 javaslatot támogatja, mert ahhoz nem szükséges megváltoztatni a protokollt. + + + +## Jelenlegi helyzet {#current-progress} + +Az okosszerződéses tárcák már elérhetők, de több fejlesztésre van szükség, hogy még decentralizáltabbak és engedélymentesek legyenek. Az EIP-4337 egy kiforrott javaslat, amely nem igényel változtatást az Ethereum-protokollban, ezért ezt gyorsan be lehet vezetni. Azok a fejlesztések, amelyekhez az Ethereum-protokollt módosítani kell, jelenleg nincsenek aktív állapotban, így ezek a változások hosszabb időt vesznek igénybe. Az is lehetséges, hogy a számlaabsztrakciót kellőképpen el lehet érni az EIP-4337 révén, ezért a protokollt nem is kell hozzá megváltoztatni. + +## További olvasnivaló {#further-reading} + +- [erc4337.io](https://www.erc4337.io/) +- [Panelbeszélgetés a számlaabsztrakcióról a Devcontól, Bogotából](https://www.youtube.com/watch?app=desktop&v=WsZBymiyT-8) +- [„A számlaabsztrakció miért hoz jelentős fejlődést a dappok számára?” – Devcon, Bogota](https://www.youtube.com/watch?v=OwppworJGzs) +- [„Számlaabsztrakció ELI5” – Devcon, Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) +- [Vitalik „Út a számlaabsztrakcióhoz” jegyzetei](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) +- [Vitalik blogbejegyzése a közösségi médiával visszaállítható tárcákról](https://vitalik.eth.limo/general/2021/01/11/recovery.html) +- [EIP-2938 jegyzetek](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) +- [EIP-2938 dokumentáció](https://eips.ethereum.org/EIPS/eip-2938) +- [EIP-4337 jegyzetek](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) +- [EIP-4337 dokumentáció](https://eips.ethereum.org/EIPS/eip-4337) +- [EIP-2771 dokumentáció](https://eips.ethereum.org/EIPS/eip-2771) +- [„A számlaabsztrakció alapjai” – Mi az a számlaabsztrakció, I. rész](https://www.alchemy.com/blog/account-abstraction) diff --git a/public/content/translations/hu/roadmap/beacon-chain/index.md b/public/content/translations/hu/roadmap/beacon-chain/index.md index 30673310789..1624261f221 100644 --- a/public/content/translations/hu/roadmap/beacon-chain/index.md +++ b/public/content/translations/hu/roadmap/beacon-chain/index.md @@ -1,64 +1,74 @@ --- title: A Beacon Chain -description: Tudj meg többet a beacon chainről - az Ethereum első nagy Eth2 fejlesztéséről. +description: Tudjon meg többet Beacon a láncról – arról a frissítésről, amely behozta a proof-of-stake mechanizmust az Ethereum hálózatára. lang: hu template: upgrade image: /upgrades/core.png -alt: -summaryPoint1: A beacon chain nem változtatja meg azt, ahogy az Ethereumot ma használjuk. -summaryPoint2: A hálózatot fogja koordinálni. -summaryPoint3: Bevezeti a proof-of-stake rendszert az Ethereum ökoszisztémába. -summaryPoint4: A technikai ütemtervekben "Fázis 0"-ként is ismerheted. +summaryPoint1: A Beacon lánc vezette be a proof-of-stake konszenzust az Ethereum-ökoszisztémába. +summaryPoint2: Az eredeti proof-of-work Ethereum-lánccal 2022 szeptemberében egyesült. +summaryPoint3: A Beacon lánc vezette be az Ethereumot ma biztosító konszenzuslogikát és block gossip (blokkpletyka) protokollt. --- - - A Beacon Chain december 1.-jén központi idő szerint délben indult el. További információért nézd meg az adatokat. Ha szeretnél segíteni a lánc érvényesítésében, akkor letétbe tudod helyezni az ETH-edet. + + A Beacon lánc 2020. december 1-jén jelent meg, és 2022 szeptember 15-én a beolvadás frissítéssel hivatalosan is az Ethereum konszenzusmechanizmusává tette a proof-of-stake módszert. -## Mit csinál a Beacon Chain? {#what-does-the-beacon-chain-do} +## Mi az a Beacon lánc? {#what-is-the-beacon-chain} -A Beacon Chain fogja koordinálni vagy vezetni a [shardokból](/roadmap/danksharding/) és [stakerekből](/staking/) álló kiterjesztett hálózatot. De nem olyan lesz, mint jelenleg az [Ethereum főhálózat](/glossary/#mainnet). Nem fog tudni számlákat vagy okosszerződéseket kezelni. +A Beacon lánc az eredeti proof-of-stake blokklánc neve, amit 2020-ban vezettek be. Azért hozták létre, hogy meggyőződjenek a proof-of-stake konszenzuslogika stabilitásáról és fenntarthatóságáról, mielőtt az Ethereum fő hálózatára is bevezetnék azt. Éppen ezért az eredeti proof-of-work Ethereum-lánccal párhuzamosan futtatták. A Beacon lánc egy üres blokkokból álló lánc volt, de a proof-of-work leváltásával és a proof-of-stake mechanizmusra való átállásával az Ethereum megkövetelte, hogy a Beacon lánc fogadja a végrehajtói kliensek tranzakcióit, ezután blokkokba, majd egy proof-of-stake alapú konszenzusmechanizmus felhasználásával blokkláncba rendezze azokat. Ugyanebben a pillanatban az eredeti Ethereum-kliensek leállították a bányászatot, a blokk-előterjesztési és konszenzuslogikát, és mindent átadtak a Beacon láncnak. Ez volt az az esemény, amely [A Beolvadás](/roadmap/merge/) nevet kapta. A Beolvadás után nem volt többé két blokklánc. Csak egy proof-of-stake-alapú Ethereum, ami most két különböző klienst igényel minden csomóponthoz. A Beacon lánc most a konszenzusréteg, a konszenzuskliensek peer-to-peer hálózata, amely a blokkpletykát és a konszenzuslogikát kezeli, miközben az eredeti kliensek alkotják a végrehajtási réteget, amely a pletykálásért és a tranzakciók végrehajtásáért felel, illetve az Ethereum státuszát kezeli. A két réteg az Engine API révén kommunikál egymással. -A Beacon Chain szerepe meg fog változni idővel, de egy olyan alapvető összetevője [ a biztonságos, fenntartható és skálázható Ethereumnak, amiért dolgozunk](/roadmap/vision/). +## Mire szolgál a Beacon lánc? {#what-does-the-beacon-chain-do} -## Beacon Chain tulajdonságok {#beacon-chain-features} +Beacon lánc a neve annak a számlafőkönyvek, amely az Ethereum-[letétesek](/staking/) hálózatát működtette és koordinálta, mielőtt ezek a letétesek megkezdték a valódi Ethereum-tranzakciók validálását. Nem kezel tranzakciókat vagy okosszerződés-interakciókat, mert ezt a végrehajtási réteg végzi. A Beacon lánc felel a blokk és tanúsítás kezeléséért, az elágazásválasztás algoritmusát futtatja, valamint a jutalmakat és büntetéseket adja. Bővebben a [csomópont-architektúra oldalon](/developers/docs/nodes-and-clients/node-architecture/#node-comparison). + +## A Beacon lánc hatása {#beacon-chain-features} ### Letétbe helyezés bevezetése {#introducing-staking} -A Beacon Chain bevezeti [proof-of-stake-et](/developers/docs/consensus-mechanisms/pos/) az Ethereum rendszerbe. Ez egy új módja annak, hogy elősegítsd az Ethereum biztonságát. Gondolj rá úgy, mint egy közjóra, ami egészségesebbé teszi az Ethereumot és közben még több ETH-et tudsz szerezni. A gyakorlatban ez úgy néz ki, hogy ETH-ot helyezel letétbe a validátor szoftver aktiválásához. Validátorként tranzakciókat fogsz feldolgozni és új blokkokat hozol létre a láncon. +A Beacon lánc vezette be a [proof-of-stake-et](/developers/docs/consensus-mechanisms/pos/) az Ethereum rendszerébe. Ez tartja fent az Ethereum biztonságát, és a folyamat során a validátorokat több ETH-hoz juttatja. A gyakorlatban a letétbe helyezés úgy néz ki, hogy ETH-t helyez letétbe a validátorszoftver aktiválásához. Letétesként futtatja a szoftvert, amely új blokkokat hoz létre és validál a láncon. + +A letétbe helyezés hasonló célt szolgál, mint korábban a [bányászat](/developers/docs/mining/), de számos tekintetben különbözik attól. A bányászat nagy összegű kezdeti kiadásokkal járt, nagy teljesítményű hardverek beszerzésével és nagy energiafogyasztással, ami a tehetősebbeknek kedvezett, és elősegítette a centralizációt. Emellett a bányászat nem követelte meg a fedezetként szolgáló eszközök zárolását, ezzel korlátozta a protokoll képességét a rosszindulatú szereplők megbüntetésére egy támadás után. + +A proof-of-stake mechanizmusra való áttérés jelentősen fokozta az Ethereum biztonságát és decentralizációját a proof-of-work rendszerhez képest. Minél több ember vesz részt a hálózatban, annál decentralizáltabb és védettebb lesz a támadásokkal szemben. -A letétbe helyezés és a validátorrá válás egyszerűbb, mint a [bányászat](/developers/docs/mining/) (ahogy jelenleg biztosítva van a hálózat). És remélhetőleg hosszútávon még biztonságosabbá teszi majd az Ethereumot. Minél több ember vesz részt a hálózatban, annál inkább decentralizáltabb és biztonságosabb lesz a támadásokkal szemben. +A proof-of-stake használata, mint konszenzusmechanizmus, egy alapvető komponens [a ma használt biztonságos, környezetbarát és skálázható Ethereum számára](/roadmap/vision/). -Ha érdekel a letétbe helyezés és szeretnél segíteni a Beacon Chain biztosításában, akkor tudj meg többet a letétbe helyezésről. + Ha Ön szeretne validátorrá válni és segítene az Ethereum biztosításában, akkor tudjon meg többet a letétbe helyezésről. -Ez a második Eth2 fejlesztésnél is fontos változás: [a shard láncoknál](/roadmap/danksharding/). +### Felkészülés a szilánkolásra {#setting-up-for-sharding} -### Shard láncok előkészítése {#setting-up-for-shard-chains} +Amióta a Beacon lánc egybeolvadt az eredeti Ethereum-főhálózattal, az Ethereum közössége elkezdte keresni a lehetőséget a hálózat méretezésére. -A shard láncok bevezetése lesz a második nagy Eth2 fejlesztés. Növelni fogják a hálózat kapacitását és a tranzakciós sebességet úgy, hogy 64 blokklánccal terjesztik ki a hálózatot. A Beacon Chain egy fontos első lépés a shard láncok bevezetésénél, mivel biztonságos működésükhöz a letétbe helyezés működése szükséges. +A proof-of-stake-nek megvan az az előnye, hogy naprakész nyilvántartása van az összes jóváhagyott blokkelőállítókról, akik mind rendelkeznek ETH-letéttel. Ez a nyilvántartás a konkrét hálózati felelősségi körök megbízható felosztása mellett megalapozza az „oszd meg és uralkodj” ideát. -Végsősoron a Beacon Chain lesz felelős azért, hogy véletlenszerűen kijelöljön letétbe helyezőket (stakereket) a shard láncok validálására. Ez kulcsfontosságú annak érdekében, hogy a letétbe helyezők ne fogjanak össze és ne tudják átvenni a hatalmat egy shard fölött. Nos, ez azt jelenti, hogy [kevesebb, mint 1 a billióhoz az esélye, hogy ez bekövetkezzen](https://medium.com/@chihchengliang/minimum-committee-size-explained-67047111fa20). +Ez a felelősség ellentétben áll a proof-of-work rendszerével, ahol a bányászoknak semmilyen kötelezettségük nem volt a hálózat felé, és bármikor, mindenféle következmény nélkül felhagyhattak a bányászattal, végleg lekapcsolva a csomópontszoftvert. Ebben a rendszerben nyilvántartás sincs az ismert blokkelőterjesztőkről, és nincs megbízható módja a hálózati felelősségi körök biztonságos felosztásának. -## A fejlesztések közötti kapcsolat {#relationship-between-upgrades} +[A szilánkolásról bővebben](/roadmap/danksharding/) -Az Eth2 fejlesztések némileg összefüggnek. Foglaljuk össze tehát, hogy a Beacon Chain hogyan hat a többi fejlesztésre. +## A frissítések közötti kapcsolat {#relationship-between-upgrades} -### Főhálózat és a Beacon Chain {#mainnet-and-beacon-chain} +Az Ethereum-frissítések némileg összefüggnek egymással. Foglaljuk össze, hogyan hat a Beacon lánc a többi frissítésre. -A Beacon Chain eleinte különállóan fog létezni az Ethereum főhálózattól, melyet ma is használunk. De végül össze lesznek kapcsolva. A terv a főhálózat “dokkolása” a proof-of-stake rendszerhez, melyet a Beacon Chain vezérel és koordinál. +### A Beacon lánc és a beolvadás {#merge-and-beacon-chain} -A dokkolás +A Beacon lánc először az Ethereum fő hálózatától különállóan létezett, de 2022-ben egybeolvadtak. -### Shardok és a Beacon Chain {#shards-and-beacon-chain} + + A beolvadás + -A shard láncokat csak a proof-of-stake konszenzus mechnanizmussal lehet biztonságosan bevezetni az Ethereum ökoszisztémába. A Beacon Chain bevezeti a letétbe helyezést (staking) ezzel lekövezve a shard láncok bevezetéséhez szükséges utat. +### Szilánkok és a Beacon lánc {#shards-and-beacon-chain} -Shard láncok +A láncszilánkokat csak működő proof-of-stake konszenzusmechanizmussal lehet biztonságosan bevezetni az Ethereum-ökoszisztémába. A Beacon lánc bevezette a letétbe helyezést, ami „egybeolvadt” a fő hálózattal, egyengetve az utat a szilánkolás előtt, amellyel tovább méretezhető az Ethereum. - + + Láncszilánkok + -## Beacon Chain interakció {#interact-with-beacon-chain} +## További olvasnivaló - +- [Az Ethereum jövőbeni frissítéseiről bővebben](/roadmap/vision) +- [Bővebben a csomópont-architektúráról](/developers/docs/nodes-and-clients/node-architecture) +- [Bővebben a proof-of-stake-ről](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/hu/roadmap/danksharding/index.md b/public/content/translations/hu/roadmap/danksharding/index.md new file mode 100644 index 00000000000..29d4b2211a9 --- /dev/null +++ b/public/content/translations/hu/roadmap/danksharding/index.md @@ -0,0 +1,91 @@ +--- +title: Dank-féle párhuzamos futtatás (Danksharding) +description: Ismerje meg a Proto-Danksharding és a Danksharding egymást követő fejlesztéseit, amelyek az Ethereum-skálázását teszik lehetővé. +lang: hu +summaryPoints: + - A Danksharding egy többfázisú fejlesztés, amely javítja az Ethereum skálázhatóságát és kapacitását. + - Az első fázisban, ami a Proto-Danksharding, a blokkokhoz hozzáadják a blobokat + - Az adatblobok egy olcsóbb megoldást ajánlanak az összevont tranzakcióknak, hogy betegyék az adatokat az Ethereumra, és ez a felhasználóknál alacsonyabb tranzakciós díjként jelenjen meg. + - Ezután a Danksharding elosztja a felelősséget az adatblobok igazolásához a csomópontok csoportjai mentén, ezzel tovább skálázva az Ethereumot másodpercenként több mint 100 000 tranzakcióra. +--- + +# Dank-féle párhuzamos futtatás (Danksharding) {#danksharding} + +A **Danksharding** az a módszer, amivel az Ethereum egy valóban skálázható blokklánc lesz, ehhez azonban számos protokollfejlesztést kell végrehajtani. A **Proto-Danksharding** egy köztes lépés a megvalósításban. Mindkettő célja az, hogy a második blokkláncrétegen (L2) a tranzakciók a lehető legolcsóbbak legyenek a felhasználók számára, az Ethereum pedig több mint 100 000 tranzakciót tudjon feldolgozni másodpercenként. + +## Mi az a Proto-Danksharding? {#what-is-protodanksharding} + +A Proto-Danksharding, vagy más néven [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844), egy olyan módszer a [összevont tranzakciók](/layer2/#rollups) számára, amellyel olcsón tudnak adatokat hozzáadni a blokkokhoz. A név attól a két kutatótól származik, akik ezt a módszert javasolták: Protolambda és Dankrad Feist. Jelenleg az összevont tranzakciókat a tranzakciók költségének csökkentésében behatárolja az a tény, hogy a tranzakciókat a `CALLDATA` mezőbe posztolják. Ez egy drága megoldás, mert az Ethereum-csomópontok dolgozzák fel és a láncon örökre élő adat marad, miközben az összevont tranzakcióknak csak egy rövid időre lenne szükségük ezekre. A Proto-Danksharding az adatblobokat vezeti be, amelyeket el lehet küldeni és hozzá lehet csatolni a blokkokhoz. Az ezekben a blobokban lévő adatok nem elérhetők az EVM számára, és automatikusan törlődnek egy meghatározott idő (1–3 hónap) után. Így az összevont tranzakciók sokkal olcsóbban be tudják küldeni az adatokat, és ez a felhasználóknak olcsóbb tranzakciókat eredményez. + + + +Az összevont tranzakciók az Ethereum skálázási megoldásai azáltal, hogy a tranzakciókat a láncon kívül kötegelik össze, majd azok eredményét posztolják az Ethereumra. összevont tranzakció lényegében két részből áll: adat és végrehajtás-ellenőrzés. Az adat a tranzakciók teljes sora, amelyet az összevont tranzakció dolgoz fel, hogy az Ethereumra beküldve megváltozzon annak státusza. A végrehajtás-ellenőrzés azt jelenti, hogy néhány jóhiszemű szereplő („bizonyító”) újra végrehajtja a tranzakciókat, hogy biztosan korrekt legyen a javasolt státuszváltozás. A végrehajtás-ellenőrzés miatt a tranzakciós adatoknak elérhetőnek kell lenniük annyi időre, hogy azokat bárki letölthesse és ellenőrizni tudja. Így a bizonyító be tudja azonosítani és meg tudja kérdőjelezni az összevont tranzakció szekvenszerének rosszhiszemű viselkedését. Ugyanakkor az adatoknak nem kell örökre elérhetőnek maradniuk. + + + + + +A összevont tranzakciók elköteleződést posztolnak a tranzakciók adatai alapján a láncon belül, és az aktuális adatokat elérhetővé teszik az adatblobokban. Ezáltal a bizonyítók le tudják ellenőrizni az elköteleződések érvényességét, és meg tudják kérdőjelezni az általuk tévesnek tartott adatokat. A csomópont szintjén az adatblobok a konszenzusos kliensben találhatók. A konszenzus kliens tanúsítja, hogy látta az adatot és a elérhetővé vált a hálózaton. Ha az adatot örökre meg kellene tartani, akkor ezek a kliensek megnövekednek, és a csomópontok üzemeltetéséhez komoly hardverigények merülnének fel. Ehelyett az adatok automatikusan törlődnek a csomópontról 1–3 havonta. A konszenzusos kliens tanúsításai bizonyítják, hogy a bizonyítónak elegendő lehetősége volt az adatok ellenőrzésére. Az aktuális adatokat pedig tárolhatják a láncon kívül az összevont tranzakció üzemeltetői, a felhasználók vagy mások. + + + +### Hogyan ellenőrzik a blobadatokat? {#how-are-blobs-verified} + +A összevont tranzakciók az általuk feldolgozott tranzakciókat adatblobokban posztolják. Emellett posztolnak egy „elköteleződést” is. Tehát az adathoz hozzáillesztenek egy polinomiális funkciót. Ezt a funkciót számos ponton meg lehet vizsgálni. Például, ha egy rendkívül egyszerű függvényt definiálunk, `f(x) = 2x-1`, akkor ezt a funkciót megvizsgálhatjuk arra, hogy `x = 1`, `x = 2`, `x = 3`, amelyből az `1, 3, 5` eredmények származnak. A bizonyító ugyanezt a funkciót alkalmazza az adatra, és megvizsgálja azt ugyanazokon a pontokon. Ha az eredeti adat megváltozott, akkor a függvény sem lesz azonos, és az értékek is különbözni fognak minden ponton. Valójában az elköteleződés és a bizonyíték is elég bonyolult, mert kriptográfiai függvényekbe van csomagolva. + +### Mi az a KZG? {#what-is-kzg} + +A KZG a Kate-Zaverucha-Goldberg rövidítése, akik az [eredeti szerzői](https://link.springer.com/chapter/10.1007/978-3-642-17373-8_11) egy olyan sémának, amely képes az adatblobot egy kis méretű [kriptográfiai „elköteleződéssé”](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) redukálni. A összevont tranzakció által beküldött adatblobot ellenőrizni kell, hogy az összevont tranzakció megfelelően működik-e. Ennek lényege, hogy a bizonyító újrafuttatja a blobban lévő tranzakciókat, hogy megvizsgálja az elköteleződés érvényességét. Ez koncepcionálisan ugyanolyan, mint ahogy a végrehajtási kliensek ellenőrizik az Ethereum-tranzakciók érvényességét az első blokkláncrétegen (L1) a Merkle-bizonyítékok alapján. A KZG egy alternatív bizonyíték, ami egy polinomiális egyenletet illeszt az adathoz. Az elköteleződés megvizsgálja a polinomiálist néhány titkos adatponton. A bizonyító ugyanezt a polinomiálist illeszti rá az adatra, megvizsgálja ugyanazon értékeken, és ellenőrzi, hogy az eredmény ugyanaz-e. Ilyen módon lehetséges ellenőrizni az adatot a zero-knowledge technikákkal kompatibilis módon, amelyet néhány összevont tranzakció és az Ethereum-protokoll használ. + +### Mit jelent a KZG-ceremónia? {#what-is-a-kzg-ceremony} + +A KZG-ceremónia egy olyan módszer, mellyel az Ethereum-közösség több tagja együtt létrehozhat egy számokból álló titkos, véletlenszerű sorozatot, amelyet adatvalidálásra tudnak használni. Nagyon fontos, hogy ezt a számsort nem tudja senki és nem is lehessen újraalkotni azt. Ennek biztosításához minden egyes résztvevő az előző tagtól kap egy részletet. Ekkor létrehozhatnak néhány új, véletlenszerű értéket (pl. azzal, hogy a böngésző leköveti az egérmozgást), és ezt összekeverhetik az előző részlettel. Ezután elküldik ezt az értéket a következő tagnak, és megsemmisítik a saját gépükön. Amíg van legalább egy személy, aki jóhiszeműen végzi ezt a folyamatot, addig a támadó számára nem derül ki a végső érték. Az EIP-4844 KZG-ceremónia nyilvános volt és emberek tízezrei vettek benne részt, hogy hozzátegyék a saját entrópiájukat. Ahhoz, hogy a ceremóniát megtámadhassák, ezeknek a résztvevőknek 100%-ban rosszhiszeműnek kell lenniük. A résztvevők szempontjából lényeges, hogy ha ő maguk jóhiszeműen jártak el, akkor nincs szükség arra, hogy megbízzanak másban, mert már maguk is biztosították a ceremóniát (egyénként kielégítették az N-ből 1 résztvevő kritériumot). + + + +Amikor egy összevont tranzakció adatot tesz a blobba, akkor egy „elköteleződést” ad, amit a láncon posztol. Ez az elköteleződés annak a vizsgálatnak az eredménye, ami bizonyos adatpontokon a polinomiális illesztést végzi. Ezeket a pontokat a KZG ceremónia által létrehozott véletlenszerű számok határozzák meg. Ekkor a bizonyítók ellenőrizhetik a polinomiálist ugyanazokon a pontokon, hogy az adat érvényességét igazolják – ha ugyanarra az értékre jutnak, akkor az adat helyes. + + + + + +Ha valaki ismeri az elköteleződéshez használt véletlenszerű helyet, akkor könnyedén kreálhat egy polinomiálist, ami illeszkedik a megadott pontokhoz (pl. egy „ütközés”). Ezt azt jelenti, hogy a blobhoz adhatnak vagy a blobból elvehetnek adatot, és mégis tudnak érvényes bizonyítékot adni róla. Ennek megakadályozására a bizonyítók nem az aktuális, titkos helyet kapják meg, hanem a helyet egy elliptikus görbét használó kriptográfiai „fekete dobozba” csomagolva kapják meg. Ezek gyakorlatilag annyira összetorlasztják az értékeket, hogy az eredetiket nem lehet visszafejteni, miközben néhány okos algebrai bizonyító és igazoló még mindig képes megvizsgálni a polinomiálisokat az általuk képviselt pontokon. + + + + + Se a Danksharding, se a Proto-Danksharding nem követi a hagyományos „sharding” (szilánkosítási) modellt, amelynek célja a blokklánc több részre való felosztása lenne. A shard láncok többé nem szerepelnek az Ethereum útitervében. Ehelyett a Danksharding elosztott adatmintavételt használ a blobokon keresztül, hogy az Ethereumot skálázza. Ezt sokkal egyszerűbb bevezetni. Ezt a modellt néha „adat-shardingnak” is nevezik. + + +## Mi az a Danksharding? {#what-is-danksharding} + +A Danksharding az összevont tranzakciós skálázási megoldás teljes megvalósítása, amely a Proto-Dankshardinggal kezdődik. A Danksharding az Ethereumon hatalmas helyet teremt az összevont tranzakcióknak, hogy az összecsomagolt tranzakciós adataikat beküldjék. Ezzel az Ethereum képes lesz könnyedén támogatni az egyéni összevont tranzakciók százait, és tranzakciók millióit végrehajtani minden másodpercben. + +Ennek az a módja, hogy a blokkokhoz kapcsolt blobokat kiterjeszti a Proto-Danksharding által adott 1-ről 64-re a teljes Danksharding során. A szükséges változások többi része a konszenzus kliensek működését fejleszti, hogy azok képesek legyenek az új, nagy méretű blobokat kezelni. Ezen változások néhány része már benne van az útitervben, függetlenül a Danksharding bevezetéstől. Például a Dankshardinghoz szükséges a javaslattevő-építő szétválasztás (PBS) bevezetése. Ez egy olyan fejlesztés, amely szétválasztja a blokkok építését és azok előterjesztését a különböző validátorok között. Ugyanígy az adatelérhetőség-mintázás szükséges a Dankshardinghoz, de az igazán könnyű kliensek fejlesztéséhez is, amelyek nem tárolnak túl sok előzményadatot („státuszmentes kliensek”). + + + +A javaslattevő-építő szétválasztás (PBS) azért szükséges, hogy az egyéni validátoroknak ne kelljen kiterjedt elköteleződéseket és 32 MB-nyi blobadatra vonatkozó bizonyítékokat generálni. Ez túl nagy terhet jelentene az otthoni letétbe helyezőknek, és erőteljesebb hardvereket kellene beszerezniük a részvételhez, amely sértené a decentralizációt. Ehelyett specializált blokképítők veszik fel a költséges számítási művelet felelősségét. Majd a blokkot elérhetővé teszik a blokk javaslattevőinek, hogy azt elküldhessék. A javaslattevő egyszerűen a legnyereségesebb blokkot választja. Így bárki olcsón és gyorsan tudja ellenőrizni a blobokat, tehát bármelyik validátor megvizsgálhatja, hogy a blokképítők jóhiszeműen viselkednek-e. Így a nagy méretű blobokat úgy lehet feldolgozni, hogy az nem csökkenti a decentralizációt. A rosszhiszemű blokképítőket ki lehet zárni a hálózatból és meg lehet bünteti őket – mások majd a helyükbe lépnek, mert ez egy profitábilis tevékenység. + + + + + +Adatelérhetőség-mintázásra is szükség van, hogy a validátorok gyorsan és hatékonyan tudják ellenőrizni a blobadatokat. Az adatelérhetőség-mintázás segítségével a validátorok meggyőződnek arról, hogy a blobadat elérhető volt és megfelelő elköteleződés történt. Minden validátor véletlenszerűen választhat néhány adatpontot és létrehozhatja a bizonyítékot, így egyik validátornak sem kell az egész blobot ellenőrizni. Ha bármilyen adat hiányzik, azt gyorsan be lehet azonosítani, így a blobot elutasítják. + + + +### Jelenlegi helyzet {#current-progress} + +A teljes Danksharding bevezetéséhez még számos év szükséges. Ugyanakkor a Proto-Danksharding a közeljövőben elérhetővé válhat. A jelen szöveg írásának időpontjában (2023. február) a KZG ceremónia még nyitva volt, és több mint 50 000 résztvevőt számlált. A Proto-Dankshardinghoz tartozó [EIP](https://eips.ethereum.org/EIPS/eip-4844) kellően kidolgozott, a specifikációban megegyeztek, a kliensek továbbfejlesztett prototípusait jelenleg tesztelik és felkészítik az éles működésre. A következő lépésben a változásokat egy nyilvános teszthálózaton teszik elérhetővé. A jelenlegi státuszról az [EIP-4844 készültségének ellenőrzőlistája](https://github.com/ethereum/pm/blob/master/Breakout-Room/4844-readiness-checklist.md#client-implementation-status) nyújt tájékoztatást. + +### További olvasnivaló {#further-reading} + +- [Proto-Danksharding jegyzetek](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) – _Vitalik Buterin_ +- [Dankrad jegyzetei a Dankshardingról](https://notes.ethereum.org/@dankrad/new_sharding) +- [Dankrad, Proto és Vitalik beszélgetése a Dankshardingról](https://www.youtube.com/watch?v=N5p0TB77flM) +- [A KZG-ceremónia](https://ceremony.ethereum.org/) +- [Carl Beekhuizen beszéde a Devconon a megbízható összeállításról](https://archive.devcon.org/archive/watch/6/the-kzg-ceremony-or-how-i-learnt-to-stop-worrying-and-love-trusted-setups/?tab=YouTube) +- [Bővebben az adatelérhetőség-mintázásról a blobokhoz](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [Dankrad Feist a KZG elköteleződésekről és bizonyítékokról](https://youtu.be/8L2C6RDMV9Q) +- [KZG polinomiális elköteleződések](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) diff --git a/public/content/translations/hu/roadmap/future-proofing/index.md b/public/content/translations/hu/roadmap/future-proofing/index.md new file mode 100644 index 00000000000..8a00bcb33fe --- /dev/null +++ b/public/content/translations/hu/roadmap/future-proofing/index.md @@ -0,0 +1,38 @@ +--- +title: Jövőálló Ethereum +description: Ezek a fejlesztések az Ethereumot ellenálló, decentralizált alapréteggé teszik a jövő számára, bármit is hozzon az. +lang: hu +image: /roadmap/roadmap-future.png +alt: "Ethereum-ütemterv" +template: roadmap +--- + +Az útiterv néhány eleme nem feltétlenül a skálázáshoz vagy a biztonsághoz tartozik, hanem stabilizálja és a jövőben is megbízhatóvá teszi az Ethereumot. + +## A kvantumnak való ellenállóság {#quantum-resistance} + +A kriptográfia egy része, amely a jelenlegi Ethereumot biztosítja, veszélybe kerül, ahogy a kvantum számítástechnika valósággá válik. Habár a kvantum számítógépek valószínűleg évtizedekre vannak attól, hogy valódi veszélyt jelentsenek a modern kriptográfiának, az Ethereumot úgy építik, hogy évszázadokig működjön. Tehát az [Ethereumot ellenállóvá kell tenni a kvantummal](https://consensys.net/blog/developers/how-will-quantum-supremacy-affect-blockchain/) szemben, amilyen gyorsan csak lehet. + +Az Ethereum fejlesztői azzal a kihívással néznek szembe, hogy a jelenlegi proof-of-stake protokoll egy nagyon hatékony, BLS-nek nevezett aláírási sémán alapszik, amely aggregálja a szavazatokat a valid blokkokra. Ezt az aláírási sémát a kvantum számítógép fel tudja törni, de a kvantumnak ellenálló verziók nem olyan hatékonyak. + +A [KZG elköteleződési sémák](/roadmap/danksharding/#what-is-kzg) számos helyen megtalálhatók az Ethereumban, hogy kriptográfiai titkokat állítsanak elő, és ezek sebezhetők a kvantummal szemben. Jelenleg ezt úgy kerülik meg, hogy bizalmat igénylő összeállítást használnak, tehát több entitás állítja elő a véletlenszerűséget, amit nem tud a kvantum számítógép visszakövetni. Azonban az ideális megoldás a kvantumbiztos kriptográfia lenne. Két vezető megközelítés létezik, amely képes lenne a BLS-sémát helyettesíteni: a [STARK-alapú](https://hackmd.io/@vbuterin/stark_aggregation) és a [háló alapú](https://medium.com/asecuritysite-when-bob-met-alice/so-what-is-lattice-encryption-326ac66e3175) aláírás. Ezeket még kutatják és prototípusokat készítenek belőlük. + + Tudjon meg többet a KZG-ről és a bizalmat igénylő összeállításról + +## Egyszerűbb és hatékonyabb Ethereum {#simpler-more-efficient-ethereum} + +A komplexitás teret ad a hibáknak vagy a sebezhetőségnek, amit a támadók ki tudnak használni. Ezért a útitervnek része az Ethereum leegyszerűsítése, valamint az olyan kódok eltávolítása, amelyek szükségtelenek vagy amelyeket már most tovább lehet fejleszteni. A jól átlátható, egyszerű kódbázis könnyebb fenntarthatóságot tesz lehetővé a fejlesztők számára. + +Számos fejlesztést fognak eszközölni az [Ethereum Virtuális Géppel (EVM)](/developers/docs/evm) kapcsolatban, hogy egyszerűbb és hatékonyabb legyen. Ezek között megtalálható a [ SELFDESTRUCT operációskód eltávolítása](https://hackmd.io/@vbuterin/selfdestruct) – egy ritkán használt utasítás, amelyre már nincs szükség, és még veszélyes is lehet, főleg más várható fejlesztéseket illetően az Ethereum-tárolási modelljét tekintve. Az Ethereum-kliensek is támogatnak még régi tranzakciótípusokat, amit most már el lehet távolítani. A gázkalkulációt is lehet fejleszteni, hatékonyabb módszerek használhatók a számolásra, így számos kriptográfiai művelet bevonható. + +Hasonlóan, az Ethereum-kliensek más részeit is frissíteni lehet. Például a végrehajtási és konszenzusos kliensek más adattömörítést használnak. Könnyebb és intuitívabb a kliensek közötti adatmegosztás, ha a sémák egységesek az egész hálózaton keresztül. + +## Jelenlegi helyzet {#current-progress} + +Az Ethereum jövőbiztossá tételét szolgáló legtöbb ilyen fejlesztés még kutatási fázisban van, és több év is kellhet a bevezetésükhöz. Az olyan fejlesztések, mint a SELF-DESTRUCT eltávolítása, valamint a végrehajtási és konszenzusos kliensben lévő tömörítési séma egységesítése valószínűleg hamarabb megtörténik, mint a kvantumnak ellenálló kriptográfia megvalósítása. + +**További olvasnivaló** + +- [Üzemanyag](/developers/docs/gas) +- [EVM](/developers/docs/evm) +- [Adatstruktúrák](/developers/docs/data-structures-and-encoding) diff --git a/public/content/translations/hu/roadmap/index.md b/public/content/translations/hu/roadmap/index.md new file mode 100644 index 00000000000..3b8d3d657a2 --- /dev/null +++ b/public/content/translations/hu/roadmap/index.md @@ -0,0 +1,119 @@ +--- +title: Ethereum-ütemterv +description: Az út, amely az Ethereum jobb skálázhatóságához, biztonságához és fenntarthatóságához vezet. +lang: hu +template: roadmap +image: /heroes/roadmap-hub-hero.jpg +alt: "Ethereum-ütemterv" +summaryPoints: +buttons: + - + label: Várható fejlesztések + toId: what-changes-are-coming + - + label: Korábbi fejlesztések + to: /history/ + variant: vázlat +--- + +Az Ethereum jelenleg is a globális koordináció erőteljes platformja, de még mindig szükség van további fejlesztésekre. Az ambiciózus fejlesztéseknek köszönhetően a jelenlegi forma helyett egy teljesen skálázható és maximálisan rugalmas Ethereum-platform fog kibontakozni. Ezeket a fejlesztéseket az Ethereum útiterve ismerteti. + +**A korábbi Ethereum-fejlesztéseket [Az Ethereum története](/history/) oldalon láthatja** + +## Milyen változások várhatók az Ethereumon? {#what-changes-are-coming} + +Az Ethereum útiterve a jövőbeli, protokollt érintő specifikus fejlesztéseket vázolja fel. Összességében ez az útiterv a következő előnyöket hozza el az Ethereum felhasználói számára: + + + + + + + + +## Miért van szüksége az Ethereumnak egy útitervre? {#why-does-ethereum-need-a-roadmap} + +Az Ethereumot folyamatosan fejlesztik, hogy javítsák a skálázhatóságot, a biztonságot vagy a fenntarthatóságot. Az Ethereum egyik fő erőssége az, hogy képes a kutatás és fejlesztés során felmerült új ötleteket bevezetni. Ez az alkalmazkodóképesség adja az Ethereum rugalmasságát, hogy kezelni tudja a felmerülő kihívásokat és lépést tudjon tartani a legfejlettebb technológiai áttörésekkel. + + + +Az útiterv a kutatók és fejlesztők több évnyi munkájának eredménye, mivel a protokoll maga nagyon technikai, de emellett bárki, aki elég elkötelezett, részt vehet benne. Az ötletek általában beszélgetés formájában kezdődnek a fórumokon, mint amilyen az [ethresear.ch](https://ethresear.ch/), [Ethereum varázslói](https://ethereum-magicians.org/) vagy az Eth R&D discord szerver. Ezek lehetnek válaszok az újonnan feltár gyenge pontokra, az alkalmazási rétegen működő szervezetek javaslatai (mint a dappok és tőzsdék), vagy a felhasználók ismert problémái (mint a költségek vagy a tranzakciósebességek). Miután ezeket az ötleteket kellőképpen körüljárták, javaslatot készíthetnek belőlük: [Ethereum-fejlesztési javaslatok (EIP)](https://eips.ethereum.org/). Ez az egész folyamat nyilvános, így a közösség bármelyik tagja mérlegelheti a javaslatokat. + +[Bővebben az Ethereum irányításáról](/governance/) + + + + +

    Mi volt az ETH2?

    + +

    Az „Eth2” kifejezéssel az Ethereum jövőjére hivatkoztak, mielőtt még áttért volna a proof-of-stake mechanizmusra, de elhagyták ezt a kifejezést, hogy sokkal pontosabb terminológiát használjanak helyette. Eredetileg az átállás előtti és utáni állapot megkülönböztetésére használták, vagy néha a különböző Ethereum-kliensekre (a végrehajtási kliensek néha ETH1-kliensként, a konszenzuskliensek pedig ETH2-kliensként jelentek meg).

    + +
    + +## Fog változni az Ethereum útiterve? {#will-ethereums-roadmap-change-over-time} + +Igen, szinte biztosan. Az útiterv az Ethereum jelenlegi fejlesztési tervezete, amely rövid- és hosszútávú újításokat is magában foglal. Az útiterv várhatóan változni fog, amikor új információk és technológiák válnak elérhetővé. + +Az útiterv olyan, mint a fejlesztési szándékok készlete, vagyis a kutatók és a fejlesztők által feltételezett legoptimálisabb út az Ethereum számára. + +## Mikor vezetik be az útiterv összes fejlesztését? {#when-will-the-roadmap-be-finished} + +Az Ethereum több fejlesztést is eszközöl a közeljövőben (pl. a letétek kivonási lehetőségét is); más tervek kisebb prioritással bírnak, és valószínűleg nem kerülnek bevezetésre a következő 5-10 évben (pl. a kvantumszámítógépnek való ellenállás). A fejlesztésekhez nehéz lenne pontos időpontot hozzárendelni, mivel számos útitervelem fejlesztése párhuzamosan folyik és különböző sebességgel valósulnak meg. Egy adott fejlesztés prioritása külső tényezők miatt (pl. a kvantumszámítógépek teljesítményének és elérhetőségének hirtelen fejlődése fontosabbá teszi az ezeknek ellenálló kriptográfiát) is változhat. + +Az Ethereum fejlesztésre úgy is tekinthetünk, mint a biológiai fejlődésre. Az a hálózat sokkal sikeresebb lehet, amelyik alkalmazkodik az új kihívásokhoz és fenntartja fittségét, mint az, amely ellenáll a változásnak, ugyanakkor a jó teljesítmény, skálázhatóság és biztonság elérése után egyre kevesebb protokollváltoztatásra lesz szükség. + +## Van-e bármi teendője a felhasználóknak a fejlesztések bevezetésekor? {#do-i-have-to-do-anything-when-there-is-an-upgrade} + +A fejlesztések általában nem érintik a felhasználókat, kivéve, hogy jobb felhasználói élményt, biztonságosabb protokollt és több opciót biztosítanak az Ethereummal való kapcsolódásra. A felhasználók nem vesznek aktívan részt a fejlesztések bevezetésében, és semmit se kell tenniük az eszközeik biztosításához. A csomópontok működtetőinek frissíteni kell a klienseiket, hogy felkészüljenek a fejlesztés bevezetésére. Néhány fejlesztés az alkalmazásfejlesztők számára is változást jelent. Például az olyan fejlesztések esetében, amelyek a korábbi adatok elérhetőségét érintik, az alkalmazásfejlesztőknek máshonnan kell beszerezniük az előzményadatokat. + +## Mi a helyzet a Verge, Splurge stb. fejlesztésekkel? {#what-about-the-verge-splurge-etc} + +[Vitalik Buterin az Ethereum útitervének egy olyan vízióját javasolta](https://twitter.com/VitalikButerin/status/1588669782471368704), amelyen a fejlesztések kategóriákba vannak sorolva az alapján, hogy miként hatnak az Ethereum architektúrájára. Ennek részei: + +- A Beolvadás: a proof-of-work mechanizmusról a proof-of-stake mechanizmusra való áttérés fejlesztései +- Surge: az összevont tranzakciók által hozott skálázhatóság és az adatsharding fejlesztései +- Scourge: a cenzúrának való ellenálláshoz, a decentralizációhoz és a MEV-ből eredő protokollkockázatokhoz kapcsolódó fejlesztések +- Verge: a könnyebb blokkellenőrzéshez kapcsolódó fejlesztések +- Purge: a csomópontok számításainak költségcsökkentéséről és a protokollegyszerűsítésről szóló fejlesztések +- Splurge: egyéb fejlesztések, amelyek nem illeszkednek az előző kategóriákba. + +Ezen terminológia helyett inkább egyszerűbb és felhasználóközpontú modellt használunk. Ennek ellenére a vízió ugyanaz, amit Vitalik javasolt, csak egyszerűbb szavakkal hivatkozunk rá. + +## Mi a helyzet a shardinggal? {#what-about-sharding} + +A sharding lényege, hogy az Ethereum blokkláncot felosztanák, hogy a validátorok csoportjai csak a teljes adat egy töredékéért lennének felelősek. Ez volt az eredeti elképzelés az Ethereum skálázhatóságára vonatkozóan. Azonban a második blokkláncréteg (L2) összevont tranzakciói sokkal gyorsabban fejlődtek, és már így is komoly skálázást tettek lehetővé, amely tovább fokozódik a Proto-Danksharding bevezetésével. Tehát a shard-láncokra nincs többé szükség, ez a fejlesztés már nem része az útitervnek. + +## Specifikus technikai fejlesztéseket keres? {#looking-for-specific-technical-upgrades} + +- [Danksharding](/roadmap/danksharding) – A Danksharding lehetővé teszi, hogy az L2 összevont tranzakciói sokkal olcsóbbak legyenek, mivel adatblobokat illeszt az Ethereum-blokkokhoz. +- [Letétek kivonása](/staking/withdrawals) – A Shanghai/Capella-frissítésnél jelent meg az Ethereumon a letétek kivonásának lehetősége, így bárki felszabadíthatja a letétbe helyezett ETH-egyenlegét. +- [Egy sloton belüli véglegesítés](/roadmap/single-slot-finality) – Ahelyett, hogy egy blokk javaslásához tizenöt perc kellene, azt ugyanabban a slotban lehessen javasolni és véglegesíteni. Ez kényelmesebb megoldást jelentene az alkalmazások számára, és nehezebb lenne megtámadni. +- [Javaslattevő-építő szétválasztás (PBS)](/roadmap/pbs) – A blokk építésének és előterjesztésének feladata több validátor között oszlik meg, így az Ethereum konszenzus tisztább, cenzúramentesebb és hatékonyabb lesz. +- [Titkos vezetőválasztás](/roadmap/secret-leader-election) – Okos kriptográfia biztosítaná, hogy az aktuális blokkelőterjesztő személye nem kerül nyilvánosságra, így védve lesznek bizonyos támadásoktól. +- [Számlaabsztrakció](/roadmap/account-abstraction) – A számlaabsztrakció a fejlesztések azon csoportja, amely az Ethereum részeként, nem pedig egy összetett közvetítő használatával támogatja az okosszerződéses tárcákat. +- [Verkle-fák](/roadmap/verkle-trees) – A Verkle-fák olyan adatstruktúrák, amelyek lehetővé teszik a státusztalan kliensek használatát az Ethereumon. Ezek a kliensek csak kis tárhelyet igényelnek, de képesek az új blokkok validálására. +- [Státusztalanság](/roadmap/statelessness) – A státusztalan kliensek képesek validálni az új blokkokat anélkül, hogy nagy adatmennyiségeket kellene tárolniuk. Ezzel a csomópontok a mai költség töredékéért működtethetők, az általuk nyújtott előnyök elvesztése nélkül. diff --git a/public/content/translations/hu/roadmap/merge/index.md b/public/content/translations/hu/roadmap/merge/index.md index 00246164471..15d7f6cda91 100644 --- a/public/content/translations/hu/roadmap/merge/index.md +++ b/public/content/translations/hu/roadmap/merge/index.md @@ -1,48 +1,228 @@ --- -title: Főhálózat dokkolása az Eth2-vel -description: Tudj meg többet a dokkolásról - amikor a főhálózati Ethereum csatlakozik a Beacon Chain által koordinált proof-of-stake rendszerhez. +title: A beolvadás +description: További információ a beolvadásról – amikor az Ethereum fő hálózata áttért a proof-of-stake konszenzusra. lang: hu template: upgrade image: /upgrades/merge.png -alt: -summaryPoint1: Végül a jelenlegi Ethereum főhálózat "dokkolni" fog a többi Eth2 fejlesztéssel együtt. -summaryPoint2: A dokkolás egyesíti az "Eth1" főhálózatot a Beacon Chainnel és a sharding rendszerrel. -summaryPoint3: Ez a proof-of-work végét jeleni majd az Ethereumot tekintve, és a teljes átmenetet a proof-of-stake-be. -summaryPoint4: Úgy is ismerheted, mint a Fázis 1.5 a technikai ütemtervek szerint. +summaryPoint1: Az Ethereum fő hálózata proof-of-stake konszenzust használ, ám ez nem mindig volt így. +summaryPoint2: Az áttérés az eredeti proof-of-work mechanizmusról a proof-of-stake mechanizmusa a beolvadás nevet kapta. +summaryPoint3: A beolvadás az eredeti Ethereum-főhálózat összeolvadását jelenti a Beacon lánc nevű különálló proof-of-stake blokklánccal, amelyek most már egy láncként léteznek. +summaryPoint4: A beolvadás nagyjából 99,95%-kal csökkentette az Ethereum energiafogyasztását. --- - - Ezt a fejlesztést a shard láncok eljövetele fogja követni. De ez lesz az a pillanat, amikor az Eth2 vízió teljesen megvalósul – nagyobb skálázhatóság, biztonság és fenntarthatóság valamint letétbe helyezés, mely a teljes hálózatot biztosítja. + + A beolvadás 2022. szeptember 15-én ment végbe. Ezzel lezárult az Ethereum áttérése a proof-of-stake konszenzusra, így hivatalosan is elhagyta a proof-of-work mechanizmust, és nagyjából 99,95%-kal csökkentette az energiafogyasztását. -## Mi az a dokkolás? {#what-is-the-docking} +## Mi volt a beolvadás? {#what-is-the-merge} -Fontos megjegyezni, hogy eredetileg a többi Eth2 fejlesztés a [főhálózattól](/glossary/#mainnet) - azaz a lánctól, amit ma is használunk - külön kerül bevezetésre. Az Ethereum főhálózat biztonságát továbbra is a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) szolgáltatja majd, még akkor is amikor [a Beacon Chain](/roadmap/beacon-chain/) és a [shard láncok](/roadmap/danksharding/) párhuzamosan futnak majd a [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) használatával. A dokkolás az, amikor ez a két rendszer egybeolvad. +A beolvadás az Ethereum eredeti végrehajtási rétegének (a [genezis](/history/#frontier) óta létező fő hálózatnak) az összeolvadása volt az új proof-of-stake konszenzusréteggel, a Beacon lánccal. Ezzel szükségtelenné vált az energiaintenzív bányászat, és megnyílt a hálózat biztosításának lehetősége letétbe helyezett ETH felhasználásával. Igazán izgalmas lépés volt ez az Ethereum jövőképének – nagyobb méretezhetőség, biztonság és fenntarthatóság – megvalósítása felé vezető úton. -Képzeld el, hogy az Ethereum egy űrhajó, ami még nem teljesen áll készen egy csillagközi utazásra. A Beacon Chainnel és a shard láncokkal a közösség egy új hajtóművet és egy erősebb hajótestet épített. Ha eljön az idő, a meglévő hajó dokkol ezzel az új rendszerrel, eggyé válik vele és készen áll arra, hogy néhány fényév alatt meghódítsa az univerzumot. + -## A főhálózat dokkolása {#docking-mainnet} +A [Beacon lánc](/roadmap/beacon-chain/) és a [fő hálózat](/glossary/#mainnet) eredetileg külön működött. Az Ethereum-főhálózat biztonságát – az összes számlájával, egyenlegével, okosszerződésével és blokkláncállapotával együtt – továbbra is a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) konszenzus szolgáltatta, még akkor is amikor a [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) mechanizmust használó Beacon lánc vele párhuzamosan futott. A beolvadás volt az esemény, amikor ez a két rendszer végre egyesült, és a proof-of-work helyét végleg átvette a proof-of-stake. -Amikor minden készen áll, az Ethereum főhálózat "bedokkol" a Beacon Chainnel, a saját shardjává válik, amely proof-of-stake-et használ [proof-of-work](/developers/docs/consensus-mechanisms/pow/) helyett. +Képzeljük el, hogy az Ethereum egy űrhajó, amely még azelőtt felszállt, hogy igazán készen állt volna a csillagközi utazásra. A Beacon lánccal a közösség egy új hajtóművet és egy erősebb hajótestet épített. Jelentős tesztelést követően eljött az ideje, hogy a régi hajtóművet menet közben kicseréljék az újra. Ezzel az új, hatékonyabb hajtómű beolvadt a már meglévő hajóba, megteremtve a lehetőséget, hogy súlyos fényéveket tegyen meg, és nyakába vegye az univerzumot. -A főhálózat lehetővé teszi majd az okosszerződések futtatását a proof-of-stake rendszeren, valamint magával hozza a jelenlegi Ethereum állapotot és történetet, ezzel biztosítva, hogy az összes ETH tulajdonos és felhasználó számára elakadásmentes legyen az átállás. +## Összeolvadás a fő hálózattal {#merging-with-mainnet} -## A dokkolás után {#after-the-docking} +A proof-of-work mechanizmus biztosította az Ethereum-főhálózatot a születésétől a beolvadásig. Ez tette lehetővé, hogy az általunk jól ismert Ethereum-blokklánc 2015 júliusában az összes ismerős funkciójával együtt (tranzakciók, okosszerződések, számlák stb.) létrejöjjön. -Ez a proof-of-work végét és egy fenntarthatóbb, környezetbarátabb korszak kezdetét fogja jelenteni az Ethereum számára. Ettől a ponttól kezdve az Ethereum skálázható, biztonságos és fenntartható lesz, ahogy az az [Eth2 vízió](/roadmap/vision/) szerint körvonalazódott. +A fejlesztők az Ethereum története során végig készültek arra, hogy egyszer majd áttérnek a proof-of-work konszenzusról a proof-of-stake mechanizmusra. 2020. december 1-jén a fő hálózattól elkülönült, vele párhuzamosan működő blokkláncként létrejött a Beacon lánc. -## A fejlesztések közötti kapcsolat {#relationship-between-upgrades} +A Beacon lánc eredetileg nem kezelte a fő hálózat tranzakcióit. Ehelyett a saját állapotát illetően jutott konszenzusra az aktív validátorok számlaegyenlegekre vonatkozó egyetértésén keresztül. Mélyreható tesztelést követően eljött az ideje, hogy a Beacon lánc való világbeli adatokkal kapcsolatban is konszenzusra jusson. A beolvadás után a Beacon lánc lett az összes hálózati adat konszenzusmotorja, beleértve a végrehajtási réteg tranzakcióit és számlaegyenlegeit is. -Az Eth2 fejlesztések némileg összefüggnek. Foglaljuk össze tehát, hogy a dokkolás hogyan hat a többi fejlesztésre. +A beolvadás jelentette a hivatalos váltást, amely után a Beacon lánc tölti be a blokkelőállítás hajtómotorjának szerepét. Az érvényes blokkok előállításának módja többé már nem a bányászat. Ehelyett a proof-of-stake validátorok vették át ezt a szerepet, és most már ők felelnek a tranzakciók validálásának végrehajtásáért és az új blokkok előterjesztéséért. -### Dokkolás és a Beacon Chain {#docking-and-beacon-chain} +Az előzmények nem vesztek el a beolvadással. Ahogy a fő hálózat egyesült a Beacon lánccal, az Ethereum összes tranzakcióelőzményét is magával vitte. -Amint megtörtént a dokkolás, a letétbe helyezőket kijelölik az Ethereum főhálózat validálására. Csakúgy, mint a shard láncoknál. [A bányászat](/developers/docs/consensus-mechanisms/pow/mining/) így feleslegessé válik, tehát a bányászok az új proof-of-stake rendszerben valószínűleg letétbe helyezésbe fektetik majd, amit kerestek. + +A proof-of-stake mechanizmus átvétele megváltoztatta az Ether kibocsátásának módját. Tudjon meg többet: Ether-kibocsátás a beolvadás előtt és után. + -A Beacon Chain +### Felhasználók és tulajdonosok {#users-holders} -### Dokkolás és shard láncok {#docking-and-shard-chains} +**A beolvadás nem hozott változást a tulajdonosok/felhasználók számára.** -Mivel a főhálózat egy sharddá válik, a shard láncok sikeres implementációja kritikus ezen fejlesztési lépés szempontjából. Valószínű, hogy az átmenet egy fontos szerepet fog játszani, hogy a közösség eldöntse szeretne-e egy második sharding fejlesztést. Ez a fejlesztés a többi shardot is a főhálózathoz hasonlóvá teszi: képesek lesznek tranzakciókat és okosszerződéseket feldolgozni, nem csak több adatot biztosítani. +_Erre ráfér az ismétlés_: az ETH vagy az Ethereum hálózatán található bármely egyéb digitális eszköz felhasználójaként vagy tulajdonosaként, valamint nem csomópont-operátor letétesként **semmit sem kell tennie a pénzeszközeivel vagy a tárcájával a beolvadás kapcsán.** Az ETH egyszerűen csak ETH. Nincs olyan, hogy „régi ETH”/„új ETH” vagy olyan, hogy „ETH1”/„ETH2”, és a tárcák a beolvadás után is pontosan ugyanúgy működnek, mint azelőtt. Akik mást állítanak, valószínűleg csalók. -Shard láncok +Annak ellenére, hogy lecserélte a proof-of-work mechanizmust, az Ethereum összes előzménye – a létrejöttéig visszamenőleg – változatlan formában megmaradt a proof-of-stake-re való áttérés során. A beolvadás előtt az Ön tárcájában lévő eszközök a beolvadást követően is elérhetők. **Az ön részéről semmilyen frissítési intézkedés nem szükséges.** + +[Az Ethereum biztonságáról bővebben](/security/#eth2-token-scam) + +### Csomópont-operátorok és dapp-fejlesztők {#node-operators-dapp-developers} + + + +A fő intézkedési elemekhez tartoznak az alábbiak: + +1. Futtasson _egyidejűleg_ egy konszenzusklienst és egy végrehajtási klienst; a harmadik fél végpontok a beolvadás után már nem tudnak végrehajtási adatokat szerezni. +2. A végrehajtási és a konszenzusklienst is egy megosztott JWT titkos kulccsal hitelesítse, hogy biztonságosan tudjanak kommunikálni. +3. Állítson be egy „díj címzettje” címet a kapott tranzakciós illetéktételek/MEV fogadásához. + +Ha a fenti felsorolás első két elemét nem teljesíti, akkor a csomópontja „offline” állapotot mutat majd, amíg mindkét réteg szinkronizálása és hitelesítése be nem fejeződik. + +Ha nem állít be egy „díj címzettje” címet, attól még a validátor a szokásos módon tud működni, de Ön lemarad az el nem égetett díjtételekről/MEV-ről, amelyeket egyébként megkapott volna a validátora által előterjesztett blokkokkal. + + + + +Egészen a beolvadásig egy végrehajtási kliens (például: Geth, Erigon, Besu vagy Nethermind) elég volt ahhoz, hogy valaki fogadja, megfelelően validálja és propagálja a hálózaton terjedő blokkokat. _A beolvadás óta_ egy végrehajtási csomagban található tranzakciók érvényessége az őket tartalmazó „konszenzusblokk” érvényességétől is függ. + +Ennek eredményeképpen egy teljes Ethereum-csomóponthoz most már végrehajtási kliens és egy konszenzuskliens is szükséges. Ez a két kliens egy új motor-API segítségével működik együtt. A motor-API JWT titkos kulcsot használó hitelesítést igényel. A kulcsot mindkét kliens megkapja, ami biztonságos kommunikációt tesz lehetővé. + +A fő intézkedési elemekhez tartoznak az alábbiak: + +– konszenzuskliens telepítése a végrehajtási kliens mellé +– végrehajtási és konszenzuskliens hitelesítése megosztott JWT titkos kulccsal, hogy biztonságosan kommunikálhassanak egymással. + +Ha a fenti felsorolás elemeit nem teljesíti, akkor a csomópontja „offline” állapotúnak tűnik majd, amíg mindkét réteg szinkronizálása és hitelesítése be nem fejeződik. + + + + + +A Beolvadás megváltoztatta a konszenzust, amely a következőkre is hatott:< + +
      +
    • blokkstruktúra
    • +
    • slot-/blokkidőzítés
    • +
    • operációskód-változások
    • +
    • a láncon belüli véletlenszerűség forrása
    • +
    • a biztonságos fejléc és a véglegesített blokkok koncepciója
    • +
    + +További információért nézze meg Tim Beiko blog postját: Hogyan érinti a Beolvadás az Ethereum alkalmazási rétegét. + +
    + +## A beolvadás és az energiafogyasztás {#merge-and-energy} + +A beolvadás a proof-of-work végét jelentette az Ethereum számára, valamint egy fenntarthatóbb, környezetbarátabb Ethereum kezdetét. Az Ethereum energiafogyasztása nagyjából 99,95%-kal csökkent, ezzel az Ethereum zöld blokklánc lett. Tudjon meg többet az [Ethereum energiafogyasztásáról](/energy-consumption/). + +## A beolvadás és a méretezhetőség {#merge-and-scaling} + +A beolvadás a további méretezhetőségi fejlesztések lehetőségét is megteremtette, amelyek a proof-of-work konszenzus mellett lehetetlenek voltak, egy lépéssel közelebb hozva az Ethereumot az [Ethereum-jövőképben](/roadmap/vision/) felvázolt méretezési, biztonsági és fenntarthatósági célok eléréséhez. + +## Téveszmék a beolvadásról {#misconceptions} + + + +Két típusú Ethereum-csomópont létezik: olyanok, amelyek képesek blokkjavaslatot tenni, és olyanok, amelyek nem. + +A blokkot előterjesztő csomópontok csak kis részét adják az Ethereum hálózatán működő csomópontoknak. Ebbe a kategóriába tartoznak a proof-of-work (PoW) mechanizmus bányászcsomópontjai és a proof-of-stake (PoS) mechanizmus validátor-csomópontjai. Ez a kategória megköveteli a gazdasági erőforrások elkülönítését (például GPU hash-teljesítményt a proof-of-work mechanizmus alatt, illetve ETH-letétbe helyezést a proof-of-stake mechanizmus mellett) cserébe azért, hogy az operátor alkalomadtán javaslatot tehessen a következő blokkra, és megkaphassa a protokolljutalmakat. + +A hálózat többi csomópontja (tehát a csomópontok többsége) nem köteles gazdasági erőforrásokat feláldozni egy átlagos személyi számítógépen, 1-2 TB elérhető tárhelyen és egy internetkapcsolaton túl. Ezek a csomópontok nem terjesztenek elő blokkjavaslatokat, mégis kritikus szerepet játszanak a hálózat biztosításában azzal, hogy a blokkelőterjesztőket szemmel tartva vizsgálják az újonnan érkező blokkokat, és hálózat konszenzusszabályaival összhangban ellenőrzik azok érvényességét. Ha a blokk érvényes, akkor a csomópont propagálja azt a hálózaton keresztül. Ha a blokk bármilyen okból kifolyólag érvénytelen, akkor a csomópont szoftverje figyelmen kívül hagyja azt, és nem folytatja a propagálását. + +Egy nem blokk-készítő csomópontot bárki futtathat, működjön bármilyen konszenzusmechanizmus szerint is (proof-of-work vagy proof-of-stake); de aki megteheti, azt erőteljesen bátorítják. Egy csomópont futtatása hihetetlen értékkel bír az Ethereum számára, és előnyöket biztosít a csomópontot futtató egyén számára is, például nagyobb biztonságot, adatvédelmet és ellenálló képességet a cenzúrával szemben. + +Az Ethereum-hálózat decentralizációjának fenntartásához rendkívül lényeges az a képesség, hogy bárki tudjon saját csomópontot működtetni. + +Bővebben a saját csomópont működtetéséről + + + + + +A gasdíjak a hálózati teljesítmény iránti kereslet és a hálózati kapacitás egymáshoz viszonyított változásának eredményeként alakulnak. A beolvadással megszűnt a proof-of-work mechanizmus használata, és áttértünk a proof-of-stake konszenzusra, ám a hálózati kapacitást vagy feldolgozóképességet közvetlenül érintő paraméterekben jelentős változás nem következett be. + +A összevonttranzakció-centrikus fejlesztési tervvel az erőfeszítések oda irányultak, hogy a felhasználói aktivitást az L2-n tegyék skálázhatóvá, miközben lehetővé teszik, hogy az L1 főhálózat egy biztonságos, decentralizált réteg, ami optimális az összevont tranzakciós adatok tárolására, így azok használata exponenciálisan olcsóbb lehet. Ennek eléréséhez az áttérés a proof-of-stake mechanizmusra létfontosságú előfeltétel volt. Bővebben a gázról és a díjakról. + + + + +A tranzakciók „sebessége” több módon is mérhető, például az egy blokkban foglalt idővel és a véglegesítés időigényével. Ezek mindegyike változik kicsit, de a felhasználók számára ez nem észlelhető. + +Korábban, a proof-of-work konszenzus ideje alatt a cél az volt, hogy körülbelül 13,3 másodpercenként létrejöjjön egy új blokk. A proof-of-stake mechanizmussal a slotok pontosan 12 másodpercenként ismétlődnek, mind egy-egy lehetőség, hogy egy validátor közzétegyen egy blokkot. A legtöbb slothoz tartozik blokk is, de nem feltétlenül mindegyikhez (például ha egy validátor offline állapotban van). A proof-of-stake mechanizmus mellett körülbelül 10%-kal gyakrabban jön létre blokk, mint a proof-of-work mellett. Ez egy viszonylag jelentéktelen változás, amely a felhasználóknak valószínűleg nem tűnik fel. + +A proof-of-stake magával hozta a tranzakció véglegességének koncepcióját, amely korábban nem létezett. A proof-of-work rendszerében egy blokk visszafordításának nehézsége az adott tranzakció után kibányászott minden egyes blokkal exponenciálisan növekszik, de valójában sosem válik lehetetlenné. A proof-of-stake mechanizmusban a blokkok úgynevezett korszakokba (epoch) rendeződnek (6,4 perces időintervallumonként, amelyek 32 blokklehetőséget tartalmaznak), amelyekről a validátorok szavaznak. Amikor egy korszak lezárul, a validátorok szavaznak arról, hogy adott korszakot „igazolt” állapotúnak tekintsék. Ha a validátorok megegyeznek, hogy a korszakot igazolt állapotúnak tekintsék, akkor az a következő korszakban végleges állapotba kerül. A véglegesített tranzakciók visszafordítása gazdaságtalan lenne, mivel ehhez a teljes letétbe helyezett ETH-állomány több mint egyharmadát meg kellene szerezni és el kellene égetni. + + + + + +Kezdetben a Beolvadás után a letétesek csak az extra díjakat és a MEV-et kapták meg, amelyet a blokkjavaslások eredményeként nyertek. Ezek a jutalmak egy nem letéti számlára kerültek, amelyet a validátor kontrollál (aki a díjakat kapja), és azonnal elérhetők. Ezek különböznek a protokolljutalmaktól, amelyeket a validátori kötelezettségeikért kapnak. + +A Shanghai/Capella hálózatfrissítés óta a letétesek egy visszavonási számlát jelölnek ki, hogy automatikusan megkapják a letéti összeg feletti részt (32 ETH felett). Ez a fejlesztés lehetővé tette, hogy a validátor kilépjen a hálózatból, és ezzel felszabadítsa és visszakapja a teljes egyenlegét. + +Bővebben a letétek visszavonásáról + + + + +Mióta a Shanghai/Capella frissítés lehetővé tette a letétek visszavonását, minden validátort arra ösztönöznek, hogy lehívja a 32 ETH feletti letéti egyenlegét, mivel ezek a pénzeszközök nem járnak plusz hozammal, de a rendszer zárolja őket. Az APR-értéktől függően (amelyet a teljes letétbe helyezett ETH-mennyiség határoz meg) ez arra ösztönözheti őket, hogy teljesen feladják a validátori pozíciójukat és visszakérjék a teljes egyenlegüket, vagy éppen arra, hogy a jutalmaik felhasználásával növeljék a letétjüket és nagyobb hozamhoz jussanak. + +Egy fontos kikötés, hogy a validátor kilépése egy rátához van kötve, és csak eszerint léphet ki valaki egy adott korszakban (minden 6,4. percben). Ez a határérték az aktív validátorok számától függően változik, de a teljes letétbe helyezett ETH-nak kb. 0,33%-a lehet egy adott napon. + +Így nem lehet tömegesen letéti összeget kivonni. Emellett azt is megakadályozza, hogy egy potenciális támadó a letétjét felhasználva slashing-sértést kövessen el, és egyazon korszakon belül felszámolja a validátor teljes ETH-letéti egyenlegét, mielőtt a protokoll érvényesíthetné a megsemmisítési szankciót. + +Az APR értéke szándékosan dinamikus, segítségével a letétesek által alkotott piac megállapíthatja azt a kifizetési szintet, amely mellett hajlandók gondoskodni a hálózat biztonságáról. Ha ez a szint túl alacsony, akkor a validátorok a protokoll által korlátozott tempóban kilépnek. Ez fokozatosan megemeli az APR értékét a maradók számára, ami új vagy visszatérő letéteseket eredményez majd. + + +## Mi történt az „Eth2”-vel? {#eth2} + +Az „Eth2” kifejezést elhagytuk. Miután az „Eth1” és az „Eth2” egyetlen láncban egyesült, már nincs szükség arra, hogy különbséget tegyünk két Ethereum-hálózat között. Csak egy Ethereum maradt. + +A zavar elkerülése érdekében a közösség frissítette az alábbi kifejezéseket: + +- Az „Eth1” helyett a „végrehajtási réteg” kifejezést használjuk. Ez a réteg kezeli a tranzakciókat és a végrehajtást. +- Az „Eth2” helyett a „konszenzusréteg” kifejezést használjuk. Ez a réteg kezeli a proof-of-stake konszenzust. + +Ezek a terminológiai módosítások csak az elnevezési szabályokat változtatják meg; ez nem változtat az Ethereum céljain vagy útitervén. + +[Tudjon meg többet az „Eth2” átnevezéséről](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) + +## A frissítések közötti kapcsolat {#relationship-between-upgrades} + +Az Ethereum-frissítések némileg összefüggnek egymással. Foglaljuk össze hát, hogy a beolvadás hogyan viszonyul a többi frissítéshez. + +### A beolvadás és a Beacon lánc {#merge-and-beacon-chain} + +A beolvadás a Beacon lánc hivatalos átvételét jelenti az eredeti fő hálózat végrehajtási rétegéhez tartozó új konszenzusrétegként. A beolvadás óta a validátorok feladata az Ethereum-főhálózat biztosítása, és a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) rendszerű bányászat már nem érvényes módszer a blokkok előállítására. + +Ehelyett a blokkokra azok a validáló csomópontok tesznek javaslatot, amelyek ETH-t helyeztek letétbe a konszenzusban való részvétel jogáért. Ezek a frissítések készítik elő a terepet a jövőbeni méretezhetőségi frissítésekhez, többek között a szilánkoláshoz. + + + A Beacon Chain + + +### A beolvadás és a Shanghai frissítés {#merge-and-shanghai} + +Hogy leegyszerűsítsük az áttérést a proof-of-stake mechanizmusra, és maximalizáljuk az összpontosítást erre a feladatra, a beolvadás nem tartalmazott bizonyos várt funkciókat, mint például a letétbe helyezett ETH lehívásának lehetőségét. Ez a funkció külön vált elérhetővé a Shanghai/Capella frissítéssel. + +A kíváncsibbak többet megtudhatnak arról, hogy [Mi történik A Beolvadás után](https://youtu.be/7ggwLccuN5s?t=101), méghozzá Vitalik 2021. áprilisi ETHGlobal eseményen tartott előadásából. + +### A beolvadás és a szilánkolás {#merge-and-data-sharding} + +Az eredeti terv szerint a beolvadás előtt dolgozták volna ki a láncszilánkolást (sharding) a méretezhetőség megoldására. Azonban a [2. rétegű méretezési megoldások](/layer-2/) elterjedésével a prioritás eltolódott afelé, hogy előbb a proof-of-stake leváltsa a proof-of-work rendszert. + +A szilánkolással kapcsolatos tervek gyorsan fejlődnek, ám a 2. rétegű technológiák felemelkedése és sikere kapcsán – amelyet a tranzakció-végrehajtás méretezése terén elértek – a szilánkolásra vonatkozó elképzelések most már arra irányulnak, hogy megtalálják a legoptimálisabb módot a rollupszerződések tömörített lehívási adatainak tárolásával járó teher elosztására, és így lehetővé tegyék a hálózati kapacitás exponenciális növekedését. Ehhez azonban előbb át kell térni a proof-of-stake mechanizmusra. + + + Szilánkolás (sharding) + + +## További olvasnivaló {#further-reading} + + + + diff --git a/public/content/translations/hu/roadmap/merge/issuance/index.md b/public/content/translations/hu/roadmap/merge/issuance/index.md new file mode 100644 index 00000000000..8589d40858b --- /dev/null +++ b/public/content/translations/hu/roadmap/merge/issuance/index.md @@ -0,0 +1,134 @@ +--- +title: Hogyan hatott az ETH kínálatra a Beolvadás +description: Részletes bemutatása annak, hogy a Beolvadás hogyan hatott az ETH kínálatára +lang: hu +--- + +# Hogyan hatott az ETH kínálatra a Beolvadás {#how-the-merge-impacts-ETH-supply} + +A Beolvadás jelenti az Ethereum hálózatok azon változását, amikor 2022. szeptemberében áttértek a proof-of-work mechanizmusról a proof-of-stake mechanizmusra. Akkor az is megváltozott, ahogy az ETH-t kibocsátják. Korábban az új ETH két forrásból származott: a végrehajtási rétegből. (főhálózat) és a konszenzusrétegből (Beacon lánc). A Beolvadás óta a végrehajtási réteg kibocsátása nulla. Nézzük meg ennek részleteit. + +## Az ETH-kibocsátás komponensei {#components-of-eth-issuance} + +A ETH-kínálatot két elsődleges erő irányítja: a kibocsátás és az elégetés. + +Az ETH **kibocsátása** az a folyamat, amikor olyan ETH-t hoznak létre, amely korábban nem létezett. Az ETH **elégetése** az a folyamat, amikor a létező ETH-t megsemmisítik, ezzel kivonva azt a körforgásból. A kibocsátás és elégetés rátája számos paraméter alapján kerül kiszámításra, és az ezek közötti egyensúly határozza meg az ether inflációs/deflációs rátáját. + + + +– A proof-of-stake mechanizmusra való átállás előtt a bányászok kb. 13 000 ETH-t bocsátottak ki naponta +– A letétbe helyezők kb. 1700 ETH-t adnak ki naponta, amelynek alapja 14 millió letétbe helyezett ETH +– A letétbe helyezési kibocsátás a letétbe helyezett ETH összegétől függ +– **A Beolvadás óta a napi kibocsátás 1700 ETH körüli, amely 88%-os csökkenés a korábbihoz képest** +– Az elégetés: a hálózati kereslettől függően változik. Ha egy adott napra az átlagos gázdíj legalább 16 gwei, akkor ez kiegyenlíti a validátoroknak kibocsátott 1700 ETH-t, és a nettó ETH infláció nulla vagy annál kevesebb. + + + +## A Beolvadás előtt (régi szisztéma) {#pre-merge} + +### A végrehajtási réteg kibocsátása {#el-issuance-pre-merge} + +A proof-of-work mechanizmusban a bányászok csak a végrehajtási réteggel kapcsolódtak, és blokkjutalmat kaptak, ha elsőként oldották meg a következő blokkot. A [Constantinople-frissítés](/history/#constantinople) után, 2019-től ez a jutalom 2 ETH volt blokkonként. A bányászok jutalmat szereztek akkor is, ha nem egy valid blokkot hoztak létre, amely nem került be a leghosszabb/hiteles láncba, hanem annak csak [ommer](/glossary/#ommer) vagy testvérblokkja volt. Ezek a jutalmak maximum 1,75 ETH-t értek ommerenként, és az érvényes blokk nyereségén _felül_ kerültek kibocsátásra. A bányászat egy gazdaságilag intenzív tevékenység volt, amelynek fenntartásához magas szintű ETH kibocsátásra volt szükség. + +### A konszenzusréteg kibocsátása {#cl-issuance-pre-merge} + +A [Beacon lánc](/history/#beacon-chain-genesis) 2020-től működik élesben. A bányászok helyett validátorok biztosították a rendszert a proof-of-stake mechanizmussal. Ezt a láncot úgy állították fel, hogy az Ethereum-felhasználók ETH-t helyeztek letétbe egy okosszerződésbe a főhálózaton (a végrehajtási rétegen), amelyet a Beacon lánc felismert és az új láncon ugyanannyit ETH-t adott a felhasználónak. A Beolvadás bevezetéséig a Beacon lánc validátorai nem kezelték a tranzakciókat és lényegében a validátor gyűjtőjének státuszáról hozták meg a konszenzust. + +A Beacon láncon a validátorok ETH jutalmat kaptak azért, hogy tanúsítják a lánc státuszát és blokkokat javasolnak. A validátor teljesítménye alapján jutalmak és büntetések kerülnek kiszabásra minden korszakban (epoch, minden 6,4 percben). A validátorok jutalma **jelentősen** kevesebb, mint a bányászoké volt a proof-of-work mechanizmusban (2 ETH kb. 13,5 másodpercenként), mivel a validáló csomópont üzemeltetése nem annyira intenzív feladat, és így nem jár olyan magas jutalom érte. + +### A Beolvadás előtti kibocsátás részletei {#pre-merge-issuance-breakdown} + +Teljes ETH-kínálat: **~120 520 000 ETH** (a Beolvadás idején, 2022. szeptemberben) + +**A végrehajtási réteg kibocsátása:** + +- A becslések szerint 2,08 ETH 13,3 másodpercenként \*: **kb. 4 930 000** ETH került kibocsátásra egy évben +- Ennek eredményeként egy **hozzávetőleges 4,09%-os** inflációs ráta keletkezett (évi 4,93 millió osztva a teljes 120,5 millióval) +- \*Beleértve a kanonikus blokkokért adott 2 ETH-t, plusz az ommer blokkokért adott átlagos 0,08 ETH-t. Emellett a 13,3 másodperc az alap blokkidő, eltekintve az esetleges [nehézség bombák](/glossary/#difficulty-bomb) hatásaitól. ([Tekintse meg a forrást](https://bitinfocharts.com/ethereum/)) + +**A konszenzusréteg kibocsátása:** + +- A teljes 14 000 000 letétbe helyezett ETH-t figyelembe véve az ETH kibocsátás kb. 1700 ETH/nap ([Tekintse meg a forrást](https://ultrasound.money/)) +- Ennek eredményeként **kb. 620 500** ETH-t bocsátanak ki évente +- Ennek eredménye a **kb. 0,52%-os** inflációs ráta (évi 620,5 ezer osztva a teljes 119,3 millióval) + + +Teljes éves kibocsátási ráta (a Beolvadás előtt): ~4,61% (4,09% + 0,52%)

    +a kibocsátás kb. 88,7%-a ment a bányászoknak a végrehajtási rétegen (4,09 / 4,61 * 100)

    +kb. 11,3%-a a letétesekhez került a konszenzusrétegen (0,52 / 4,61 * 100) +
    + +## A Beolvadás után (jelenlegi szisztéma) {#post-merge} + +### A végrehajtási réteg kibocsátása {#el-issuance-post-merge} + +A Beolvadás óta a végrehajtási réteg kibocsátása nulla. A blokkokat többé nem a proof-of-work mechanizmus alapján hozzák létre a konszenzus megújított szabályai szerint. A végrehajtási réteg tevékenységeit „beacon blokkokba” csomagolják, amelyeket a proof-of-stake validátorok publikálnak és tanúsítanak. A beacon blokk tanúsításért és publikálásért járó jutalmakat a konszenzusrétegen külön kezelik. + +### A konszenzusréteg kibocsátása {#cl-issuance-post-merge} + +A konszenzusréteg kibocsátása ma is ugyanúgy folytatódik, mint a Beolvadás előtt, kis összegű jutalmakat ad a validátoroknak a blokkok tanúsításáért és javaslattevésért. A validátori jutalmak továbbra is _validátoregyenlegként_ gyűlnek, amelyet a konszenzusrétegen kezelnek. Ezek nem általános, a főhálózaton használható („végrehajtási”) számlák, hanem elkülönített Ethereum számlák, amelyek nem léphetnek tranzakcióba más számlákkal. Az itt tárolt pénzeszközöket csak ki lehet vonni egy meghatározott végrehajtási címre. + +Ezt a visszavonási lehetőséget a Shanghai/Capella-frissítés tette lehetővé 2023. áprilisban. A letétbe helyezőket arra ösztönzik, hogy vegyék ki a _jutalmakat (a 32 ETH feletti összeget)_, mivel ezek nem járulnak hozzá a letéthez (ami maximum 32 ETH lehet). + +A letétbe helyezők emellett ki is léphetnek és kivonhatják a teljes validátoregyenlegüket. Az Ethereum stabilitása érdekében az egyszerre távozó validátorok száma korlátozott. + +Egy adott napon kb. a teljes validátoroknak a 0,33%-a távozhat. Alapból 4 validátor léphet ki egy korszakon (6,4 perc) belül, vagyis egy nap alatt 900. Plusz 1 validátor kiléphet akkor, ha 65 536 (216) új validátor jön és a teljes számuk több mint 262 144 (218). Például 327 680 validátor felett minden korszakban 5-en léphetnek ki (1125 naponta). Ha az aktív validátorok száma meghaladja a 393 216-t, akkor már 6-an léphetnek ki, és így tovább. + +Ahogy több validátor vonul ki, a meglévő validátorok száma fokozatosan lecsökken a minimum négy validátorra, így megvédi a rendszert attól, hogy az ETH-letétek egyidejű kivonása miatt labilissá váljon. + +### A Beolvadás utáni infláció részletezése {#post-merge-inflation-breakdown} + +- Teljes ETH-kínálat: **~120 520 000 ETH** (a Beolvadás idején, 2022. szeptemberben) +- A végrehajtási réteg kibocsátása: **0** +- A konszenzusréteg kibocsátása: A fentivel megegyezik, **kb. 0,52%** éves kibocsátási ráta (14 millió letétbe helyezett ETH-szel) + + +Teljes éves kibocsátási ráta: kb. 0,52%

    +Az éves ETH kibocsátás nettó csökkenése: kb. 88,7% ((4,61% – 0,52%) / 4,61% * 100) +
    + +##  Az elégetés {#the-burn} + +Az ETH kibocsátással ellenkező erő az a ráta, ahogy az ETH-t elégetik. Az Ethereumon végrehajtandó tranzakcióért fizetni kell egy minimális díjat (alapdíj), amely állandóan változik, blokkról blokkra, a hálózati működés függvényében. Ezt a díjat ETH-ben fizetik, és _elengedhetetlen_ ahhoz, hogy egy tranzakció érvényes legyen. Ezt a díjat _elégetik_ a tranzakció végrehajtása során, így kikerül a körforgásból. + + +A díj elégetése a London-frissítés óta (2021. augusztus) működik, és a Beolvadás óta változatlan. + + +A bevezetett díj elégetése mellett a validátorok büntetéseket is kaphatnak azért, ha nincsenek online, vagy ami még rosszabb, ha olyan szabályokat hágnak át, amely a hálózat biztonságát veszélyeztetik, akkor az súlyos büntetéssel és kizárással jár. Ezek a büntetések lecsökkentik az ETH-t a validátor számláján, ami utána nem kerül máshova, tehát lényegében kivonják a forgalomból vagy elégetik. + +### A deflációhoz szükséges átlagos gázdíj kiszámítása {#calculating-average-gas-price-for-deflation} + +Az ETH kibocsátása egy adott napon a teljese letétbe helyezett ETH-től függ. A jelen leírás idején ez kb. 1700 ETH/nap. + +Ahhoz, hogy meghatározzuk azt az átlagos gázdíjat, ami ellensúlyozza ezt az ETH-kibocsátást egy 24 órás periódusban, először kiszámoljuk a blokkok számát az adott napon, tekintve, hogy a blokkidő 12 másodperc: + +- `(1 blokk / 12 másodperc) * (60 másodperc/perc) = 5 blokk/perc` +- `(5 blokk/perc) * (60 perc/óra) = 300 blokk/óra` +- `(300 blokk/óra) * (24 óra/nap) = 7200 blokk/nap` + +Minden blokk a `15x10^6 gáz/blokk` összeget célozza ([Bővebben a gázról](/developers/docs/gas/)). Ez alapján kiszámolhatjuk az átlagos gázdíjat (gwei/gáz), ami kiegyensúlyozza az ETH-kibocsátást, a napi kibocsátást 1700 ETH-nek véve: + +- `7200 blokk/nap * 15x10^6 gáz/blokk *`**`Y gwei/gáz`**`* 1 ETH/ 10^9 gwei = 1700 ETH/nap` + +Megoldva az `Y-ra`: + +- `Y = (1700(10^9))/(7200 * 15(10^6)) = (17x10^3)/(72 * 15) = 16 gwei` (két számjegyre kerekítve) + +Egy másik módon rendezve ezt egy `X` változót tehetünk az `1700` helyére, ami a napi ETH-kibocsátás, a többit pedig leegyszerűsítve: + +- `Y = (X(10^3)/(7200 * 15)) = X/108` + +Leegyszerűsíthetjük úgy, hogy az `X` függvényét írjuk fel: + +- `f(X) = X/108`, ahol `X` a napi ETH-kibocsátás, és az `f(X)` jelenti gwei/gáz árat, amely ellensúlyozni tudja az újonnan kibocsátott ETH-t. + +Tehát ha az `X` (napi ETH kibocsátás) megnövekszik 1800-ra a teljes letétbe helyezett ETH alapján, `f(X)` (gwei, amivel kiegyensúlyozható a kibocsátás) ekkor `17 gwei` lesz (2 számjegyre kerekítve) + +## További olvasnivaló {#further-reading} + +- [A beolvadás](/roadmap/merge/) +- [Ultrasound.money](https://ultrasound.money/) – _Dashboardok az ETH-kibocsátás és -elégetés valós idejű vizualizációjára_ +- [Az Ethereum-kibocsátás grafikonos ábrázolása](https://www.attestant.io/posts/charting-ethereum-issuance/) – _Jim McDonald 2020._ diff --git a/public/content/translations/hu/roadmap/pbs/index.md b/public/content/translations/hu/roadmap/pbs/index.md new file mode 100644 index 00000000000..cc32211809a --- /dev/null +++ b/public/content/translations/hu/roadmap/pbs/index.md @@ -0,0 +1,51 @@ +--- +title: Javaslattevő-építő szétválasztása +description: Ismerje meg, hogy az Ethereum-validátorok hogyan és miért osztják fel a blokképítési és -küldési feladatokat. +lang: hu +--- + +# Javaslattevő-építő szétválasztása {#proposer-builder-separation} + +Jelenleg az Ethereum validátorok blokkokat hoznak létre_és_ küldenek. Összecsomagolnak olyan tranzakciókat, amelyekről tudomást szereztek a pletykahálózaton keresztül, blokkot készítenek azokból és elküldik a társaiknak az Ethereum-hálózaton. A **javaslattevő-építő szétválasztás (PBS)** szétosztja ezeket a feladatokat a validátorok között. A blokk építői minden egyes slotban létrehozzák a blokkokat és felajánlják azokat a javaslattevőnek, aki az adott slotban felel az előterjesztésért. A javaslattevő nem láthatja a blokk tartalmát, egyszerűen a legjövedelmezőbbet választja, és megfizeti a blokképítés díját, mielőtt elküldi a blokkot a társainak. + +Ez több szempontból is egy fontos fejlesztés. Először is lehetővé teszi, hogy a tranzakciók cenzúrázása protokoll szinten ne történhessen meg. Másodsorban az egyszerűbb validátorokat nem tudják kirekeszteni a versenyből az intézményes résztvevők, akik jobban tudják optimalizálni a blokképítési profitjukat. Harmadjára az Ethereum-skálázását is támogatja azáltal, hogy lehetővé teszi a Danksharding fejlesztéseket (párhuzamos futtatás). + +## A PBS és a cenzúrának való ellenállás {#pbs-and-censorship-resistance} + +A blokk építésének és előterjesztésének szétválasztása megnehezíti a blokképítők számára, hogy cenzúrázzák a tranzakciókat. Ennek az az alapja, hogy egy viszonylag összetett kritériumokat lehet megadni arra, hogy minek muszáj benne lennie a blokkban, ezért a javaslattevés előtt nem lehet a tranzakciókat cenzúrázni. Mivel a javaslattevő egy másik entitás az építőhöz képest, ezért védekezhet a cenzúrázó blokképítők ellen. + +Például bekerülési listákat tud adni a javaslattevő, hogy a tudomására jutott tranzakciókat, amelyeket mégsem lát az adott blokkban, a következő építésnél kötelezővé tudja tenni. Ezt a bekerülési listát a javaslattevő a saját memóriakészletéből (tranzakciók, amelyekről tudomása van) készíti és küldi el a társainak még mielőtt a blokkjavaslat megtörténne. Ha a bekerülési listáról bármely tranzakció hiányzik, akkor a javaslattevő elutasíthatja az adott blokkot, hozzáteheti a hiányzó tételeket mielőtt javasolja azt, vagy elküldheti a javaslatot és a többi validátorra bízhatja, hogy azok utasítsák el. Ennek az elképzelésnek létezik egy valószínűleg még hatékonyabb verziója, amikor az építőtől azt várjuk, hogy teljesen kihasználja a blokkhelyet, és ha nem teszi, akkor a bekerülési listáról lehet még hozzáadni tranzakciókat a blokkhoz. Ez jelenleg egy aktív kutatási terület, a bekerülési listák optimális konfigurálása még nem dőlt el. + +[A titkosított memóriakészletek](https://www.youtube.com/watch?v=fHDjgFcha0M&list=PLpktWkixc1gUqkyc1-iE6TT0RWQTBJELe&index=3) nem teszik lehetővé az építő és a javaslattevő számára, hogy tisztában legyenek a blokkba foglalt tételekkel, csak miután az már elküldésre került. + + + +A nagyobb hatalommal bíró szervezetek nyomást gyakorolhatnak a validátorokra, hogy zárjanak ki bizonyos címekre menő vagy onnan jövő tranzakciókat. A validátorok ennek megfelelően beazonosíthatják a feketelistás tételeket a tranzakciógyűjtőben és kihagyhatják azokat a javasolt blokkból. A PBS után ez nem lehetséges, mert a javaslattevő nem fogja tudni, hogy milyen tranzakciók szerepelnek az általa elküldött blokkban. Bizonyos egyéneknek vagy alkalmazásoknak talán fontos lehet bizonyos cenzúraszabályoknak megfelelni, amikor az adott régióban azt törvény szabályozza. Ezekben az esetekben a szabálynak való megfelelés az alkalmazás szintjén történik, így a protokoll továbbra is engedélymentes és cenzúramentes marad. + + + +## A PBS és a MEV {#pbs-and-mev} + +A **maximálisan kinyerhető érték (MEV)** arra utal, amikor a validátorok maximalizálják a nyereségüket azzal, hogy kedvezőségi sorrendbe állítják a tranzakciókat. Általános példa az arbitrázs célú átváltás a decentralizált tőzsdéken (pl. egy nagy értékű eladás vagy vétel elé kerülve), vagy annak észlelése, hogy egy pénzügyi (DeFi) pozíciót érdemes lenne likvidálni. A MEV maximalizálása olyan szofisztikált technikai tudást és személyre szabott szoftverkiegészítéseket igényel a normális validátorhoz képest, hogy sokkal valószínűbb, hogy az intézményes működtetők lehagyják az egyéneket vagy egyszerű validátorokat a MEV kinyerése kapcsán. Emiatt a letétbe helyezés díjai valószínűleg magasabbak lesznek a centralizált működtetőknél, ami olyan központosítő erőt hoz létre, amely nem motiválja az otthoni letétbe helyezést. + +A PBS úgy oldja meg ezt a problémát, hogy újrakonfigurálja a MEV gazdasági helyzetét. Ahelyett, hogy a blokk javaslattevője végezne saját MEV keresést, egyszerűen felvesz egy blokkot a neki felajánlottak közül, amelyet a blokképítők készítettek. A blokk építői végezhetnek szofisztikált MEV-kinyerést, de ennek nyeresége a javaslattevőhöz jut. Tehát még ha a MEV kinyerést dominánsan néhány specializált blokképítő végzi, ennek jutalma a hálózat bármelyik validátorához kerülhet, beleértve az egyéni, otthoni letétbe helyezőket. + + + +Az egyéneket arra motiválhatja, hogy egyéni letétbe helyezés helyett inkább készletekbe tegyék a letétet, mert a szofisztikált MEV-stratégiák miatt az nagyobb nyereséget kínál. A blokk építőjének és javaslattevőjének elkülönítése azt jelenti, hogy a kinyert MEV több validátornál kerül elosztásra, nem pedig a leghatékonyabb MEV-kinyerőnél központosul. Emellett a specializált blokképítők levehetik az egyénekről a blokk készítésének terhét, megakadályozhatják, hogy az egyének saját maguknak vegyenek ki MEV-et a validálás során, miközben maximalizálják az egyéni, független validátorok számát, akik jóhiszemű módon képesek ellenőrizni a blokkokat. A fontos koncepció a „bizonyító-ellenőrző aszimmetria”, amelynek lényege, hogy a centralizált blokklétrehozás rendben van addig, amíg robosztus és maximálisan decentralizált validátorhálózat áll rendelkezésre a blokkok jóhiszemű igazolásához. A decentralizáció egy eszköz, nem pedig végcél – valós blokkokat szeretnénk elérni. + + +## A PBS és a Danksharding {#pbs-and-danksharding} + +A Danksharding az a módszer, amivel az Ethereum skálázza a teljesítményt, hogy másodpercenként több mint 100 000 tranzakciót kezeljen és közben minimalizálja az összevont tranzakcióért fizető felhasználók által fizetett díjakat. A PBS-en alapszik, mert a blokképítőknek extra feladatot ad, akiknek bizonyítékot kell készíteniük 64 MB-nyi összevonttranzakció-adatra kevesebb mint 1 másodperc alatt. Ehhez valószínűleg specializált építőkre van szükség, akik elég komoly hardvert tudnak kijelölni ehhez a feladathoz. A nem PBS szerinti helyzetben a blokképítés egyre inkább centralizálódhat a szofisztikáltabb és erőteljesebb működtetők körül a MEV kinyerése miatt is. A javaslattevő-építő szétválasztás (PBS) egy olyan mód, amely felöleli ezt a valóságot és megakadályozza a blokkvalidálás központosítását (ami nagyon fontos), illetve elősegíti a letéti jutalmak elosztását. Remek lehetőség ez arra is, hogy a specializált blokképítők hajlandók és képesek legyenek kiszámolni a Dankshardinghoz szükséges adatbizonyítékokat. + +## Jelenlegi helyzet {#current-progress} + +A PBS a kutatás előrehaladott fázisában tart, bár akadnak még fontos kérdések, mielőtt az Ethereum klienseknél bevezetésre kerül. Nincs még véglegesített specifikáció. Ebből adódhat, hogy akár egy év is szükséges a bevezetésére. Tekintse meg a [kutatás jelenlegi állapotát](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance). + +## További olvasnivaló {#further-reading} + +- [Kutatási állapot: cenzúrának való ellenállás a PBS esetén](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) +- [PBS-barát díjpiac dizájn](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) +- [A PBS és a cenzúrának való ellenállás](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Secondary-auctions) +- [Bekerülési listák](https://notes.ethereum.org/@fradamt/H1ZqdtrBF) diff --git a/public/content/translations/hu/roadmap/scaling/index.md b/public/content/translations/hu/roadmap/scaling/index.md new file mode 100644 index 00000000000..222b05a4119 --- /dev/null +++ b/public/content/translations/hu/roadmap/scaling/index.md @@ -0,0 +1,47 @@ +--- +title: Az Ethereum skálázása +description: A összevont tranzakciók összekötegelik a tranzakciókat a láncon kívül, ezzel csökkentve a felhasználó költségét. Ugyanakkor ahogy az összevont tranzakciók jelenleg használják az adatokat, az túl drága, és behatárolják, hogy milyen alacsony is lehet a tranzakciós díj. Erre a Proto-Danksharding nyújt megoldást. +lang: hu +image: /roadmap/roadmap-transactions.png +alt: "Ethereum-ütemterv" +template: roadmap +--- + +Az Ethereum skálázása a [layer 2s](/layer-2/#rollups) második blokkláncréteg (L2), vagy más néven összevont tranzakciók által történik, ami kötegbe rendezi a tranzakciókat és az eredményt beküldi az Ethereumra. Habár az összevont tranzakciók költsége a nyolcada az Ethereum főhálózaténak, még mindig van hova optimalizálni a működésüket és ezzel csökkenteni a felhasználók költségét. A összevont tranzakciók emellett néhány centralizált komponensre támaszkodnak, amelyet a fejlesztők eltávolíthatnak majd, ahogy az összevont tranzakciók fejlődik. + + +
      +
    • Ma az összevont tranzakciók ~3–8× olcsóbbak, mint az Ethereum L1
    • +
    • A ZK összevont tranzakciók esetében hamarosan ~40–100× alacsonyabb lesz a díj
    • +
    • Az eljövendő Ethereum-módosítások további ~100–1000×-szoros skálázást tesznek lehetővé
    • +
    • A felhasználók számára egy tranzakció kevesebb mint 0,001 $-ba fog kerülni
    • +
    +
    + +## Az adatok olcsóbbá tétele {#making-data-cheaper} + +A összevont tranzakciók sok tranzakciót gyűjtenek össze, végrehajtják azokat és az eredményt az Ethereumra küldik. Ez rengeteg adatot jelent, amelyet nyíltan elérhetővé kell tenni bárki számára, hogy lefuttathassa a tranzakciókat és ellenőrizze, hogy az összevont tranzakció operátora jóhiszeműen járt el. Ha valaki talál egy eltérést, akkor megkérdőjelezheti azt. + +### Proto-Danksharding {#proto-danksharding} + +A összevont tranzakciós adatok tartósan az Ethereumon maradnak, ami drága. Az összevont tranzakciók tranzakciós költségeinek több mint 90%-át az adattárolás teszi ki. A tranzakciós költségek csökkentéséhez az adatot egy új átmeneti blob tárhelyre mozgathatjuk. A blob olcsóbb, mert nem tartós; törölhetők az Ethereumról, amint már nincs rájuk szükség. A összevont tranzakciós adatok hosszú távon azoknak a felelősségébe tartoznak, akiknek szükségük van azokra, mint az összevont tranzakciós operátorok, tőzsdék, indexáló szolgáltatások stb. Az Ethereum blob-tranzakcióval való kiegészítése a „Proto-Danksharding” néven ismert frissítés része. Viszonylag hamar, 2023 végére várható, hogy a frissítés bevezetésre kerül. + +Miután a blob-tranzakció a protokoll részévé válik a Proto-Dankshardingon keresztül, számos blobot lehet majd hozzáadni az Ethereum-blokkokhoz. Ez egy újabb jelentős (több mint 100×) skálázási lehetőség az Ethereum tranzakcióátvitelét illetően és a költségek csökkentésére. + +### Dank-féle párhuzamos futtatás (Danksharding) {#danksharding} + +A blobadatok kiterjesztésének második szintje bonyolult, mert új módszer kell annak ellenőrzésére, hogy az összevont tranzakcióadatok a hálózaton vannak, és arra támaszkodik, hogy a validátor felelősségi körei szétválnak a blokk építésre és javaslattételre. Kell hozzá egy olyan módszer is, amely kriptográfiailag bizonyítja, hogy a validátor igazolta a blobadat egy kis részét. + +Ez a második lépés a [Danksharding](/roadmap/danksharding/). Valószínűleg néhány évnek el kell telnie, mire teljesen kialakul. A Danksharding más fejlesztéseken is múlik, mint a [PBS](/roadmap/pbs) és új hálózati dizájn, hogy a hálózat hatékonyan tudja konfirmálni, hogy az adatok elérhetők, azáltal hogy véletlenszerűen néhány kilobájtos mintát választ egy adott időben, ezt [adat-elérhetőségi mintavételnek (DAS)](/developers/docs/data-availability) nevezzük. + +Bővebben a Dankshardingról + +## Az összevont tranzakciók decentralizálása {#decentralizing-rollups} + +Az [összevont tranzakciók](/layer-2) már most is gondoskodnak az Ethereum méretezhetőségéről. Az [összevont tranzakciós projektek gazdag ökoszisztémája](https://l2beat.com/scaling/tvl) teszi lehetővé, hogy a felhasználó gyorsabban és olcsóbban indítson tranzakciót, a biztonsági garanciák széles körét kiélvezve. Ugyanakkor az összevont tranzakciók centralizált szekvenszert használnak (ami feldolgozza a tranzakciókat és aggregálja azokat, mielőtt az Ethereumra küldené). Ez lehetővé teszi a cenzúrát, mivel a szekvenszeroperátorokat meg lehet büntetni, vesztegetni vagy máshogy veszélyeztetni. Emellett az [összevont tranzakciók eltérnek abban](https://l2beat.com), hogyan validálják a bejövő adatokat. A legjobb az, ha a bizonyítók csalási bizonyítékot vagy érvényességi bizonyítékot adnak be, de nem minden összevont tranzakció tart még itt. Még ahol léteznek is ilyen érvényesítési/csalásbiztos összevont tranzakciók, ott is csak kevés bizonyítót használnak. Ezért a következő fontos lépés az Ethereum skálázásban, hogy elossza a szekvenszer és a bizonyító felelősségét több emberre. + +Bővebben az összevont tranzakciókról + +## Jelenlegi helyzet {#current-progress} + +A Proto-Danksharding valószínűleg az egyik legkorábbi útiterv lesz, ami megvalósul. A felállításához szükséges decentralizált számítási lépések már úton vannak, és számos kliens épített prototípust a blobadatok kezelésére. A teljes Danksharding valószínűleg több év múlva fog megvalósulni, mivel több más útitervelem kifejlesztése is szükséges hozzá. Az összevont tranzakciók infrastruktúrájának decentralizálása egy fokozatos folyamat lesz – több különböző összevont tranzakció létezik, amelyek kicsit más felállásban működnek, és más rátán fogják tudni elvégezni a decentralizálást. diff --git a/public/content/translations/hu/roadmap/secret-leader-election/index.md b/public/content/translations/hu/roadmap/secret-leader-election/index.md new file mode 100644 index 00000000000..893d104f6bc --- /dev/null +++ b/public/content/translations/hu/roadmap/secret-leader-election/index.md @@ -0,0 +1,44 @@ +--- +title: Titkos vezetőválasztás +description: Annak áttekintése, hogyan segíthet a titkos vezetőválasztás a validátorokat megvédeni a támadóktól +lang: hu +summaryPoints: + - A blokkjavaslók IP-címe előre ismert, így sebezhetővé válnak a támadásokkal szemben + - A titkos vezetőválasztás elrejti a validátorok személyazonosságát, így nem tudni előre, hogy kire esik a választás + - Ezen elképzelés egyik további lépése az, hogy minden slotban legyen véletlenszerű a validátorválasztás. +--- + +# Titkos vezetőválasztás {#single-secret-leader-election} + +A jelenlegi [proof-of-stake](/developers/docs/consensus-mechanisms/pos) alapú konszenzusmechanizmusban a következő blokkjavaslók nyilvánosak, és az IP-címüket hozzájuk lehet kapcsolni. Tehát a támadók be tudják azonosítani, hogy melyik validátor fogja a következő blokkot javasolni, megtámadhatják őt egy szolgáltatásmegtagadásos (denial-of-service/DOS) támadással, így nem tudják időben javasolni a blokkot. + +Ez lehetőséget nyújt a támadó számára, hogy profitra tegyen szert. Például a blokkjavasló, akit a slot `n+1`-ra választottak, megtámadja a blokkjavaslót a slot `n`-ben, így az nem tud blokkot javasolni. Így a támadó két slotra vonatkozó MEV-et (maximálisan kinyerhető értéket) tud kivonni, vagy az összes tranzakciót egyben berakja egy blokkba, hogy az összes díjat megszerezze. Ez nagy valószínűséggel jobban érinti az otthoni validálókat, mint a szofisztikált, szervezeti validátorokat, akik fejlettebb módokon tudják védeni magukat, így ennek az egésznek centralizáló hatása van. + +Számos megoldás létezik erre a problémára. Az egyik az [elosztottvalidátor-technológia](https://github.com/ethereum/distributed-validator-specs), ami elosztja a validátorhoz szükséges feladatokat több számítógépen, némi duplikációval (extra kapacitással), így a támadónak sokkal nehezebb megakadályozni a javaslatot egy adott slotban. A legrobusztusabb megoldás a **Single Secret Leader Election (SSLE)**, vagyis az egyetlen, titkos vezető kiválasztása. + +## Egyetlen, titkos vezető kiválasztása {#secret-leader-election} + +Az SSLE-ben okos kriptográfia biztosítja, hogy csak a kiválasztott validátor tudja, hogy őt választották. Minden validátor elköteleződik egy titok mellett, amelyet mind ismernek. Az elköteleződéseket összekeverik és újrakonfigurálják, hogy senki se tudja összekapcsolni azokat a validátorok elköteleződésével, de minden validátor tudja, hogy melyik tartozik őhozzá. Majd a rendszer véletlenszerűen választ egyet. Ha egy validátor azt észleli, hogy az ő elköteleződésére esett a választás, akkor tudja, hogy neki kell javasolnia a blokkot. + +Ennek az elképzelésnek a vezető implementációja a [Whisk](https://ethresear.ch/t/whisk-a-practical-shuffle-based-ssle-protocol-for-ethereum/11763). Ami a következőképpen működik: + +1. A validátorok elköteleződnek egy közös titok mellett. Az elköteleződési séma úgy van kialakítva, hogy bár köthető a validátor személyazonosságához, de egyúttal véletlenszerű is, így egy harmadik fél nem tudja visszafejteni az adott validátor személyazonosságát. +2. A korszak kezdetén a validátorok véletlenszerű csoportja kerül kiválasztásra, hogy mintát vegyenek a 16 384 validátorból a RANDAO használatával. +3. A következő 8182 slotra (1 nap), a blokkjavaslók összekeverik és véletlenszerűsítik az elköteleződések csoportját a saját privát entrópiájukat (véletlenszerűség) használva. +4. Ezután RANDAO készít egy sorba rendezett listát az elköteleződésekből. Ez a lista az Ethereum slotokhoz kapcsolódik. +5. A validátorok látják, hogy az elköteleződésük egy specifikus slothoz kapcsolódik, és annak bekövetkeztével javasolják a blokkot. +6. Ezeket a lépéseket ismétlik, hogy a hozzárendelés előrébb tartson, mint az aktuális slot. + +Ekkor a támadók nem tudják előre, hogy amelyik validátor jön legközelebb, így nem tudják megtámadni DOS módszerrel. + +## Egynél több titkos vezető kiválasztása (SnSLE) {#secret-non-single-leader-election} + +Van egy másik javaslat is, amelynek lényege, hogy a validátorok mindegyikének véletlenszerű esélye legyen a blokkjavaslásra minden slotban, hasonlóan ahhoz, ahogy a proof-of-work működött, ennek a neve a**egynél több titkos vezető kiválasztása (SnSLE)**. Az adott napi protokollban lévő validátorok véletlenszerű kiválasztásához egyszerű módot kínál a RANDAO-funkció. Ennek lényege, hogy egy kellően véletlenszerű szám keletkezik, amelyet több független validátor adat kevert hashekből. Az SnSLE esetében ezeket a hasheket lehetne használni a következő blokkjavasló kiválasztására, például a legkevesebb értékű hasht választva. Az érvényes hashek tartománya behatárolható, hogy finomhangolják a valószínűségét egy adott validátor kiválasztásának minden slotban. Ha a hashnek kevesebbnek kell lennie, mint `2^256 * 5 / N` ahol `N` az aktív validátorok számát jelenti, akkor annak az esélye, hogy valamelyik egyéni validátort kiválasztják a slotban az `5/N`. Ebben a példában 99,3% az esélye, hogy legalább egy blokkjavasló valid hasht készített minden slotban. + +## Jelenlegi helyzet {#current-progress} + +Az SSLE és az SnSLE még kutatási fázisban van. Nincs véglegesített specifikáció egyik elképzelésre sem. Az SSLE és az SnSLE egymással versengő javaslatok, nem lehet mindkettőt bevezetni. A bevezetéshez több kutatásra és fejlesztésre, prototípus-készítésre és a nyilvános teszthálózatokon való telepítésre van szükség. + +## További olvasnivaló {#further-reading} + +- [SnSLE](https://ethresear.ch/t/secret-non-single-leader-election/11789) diff --git a/public/content/translations/hu/roadmap/security/index.md b/public/content/translations/hu/roadmap/security/index.md new file mode 100644 index 00000000000..0824ee0635e --- /dev/null +++ b/public/content/translations/hu/roadmap/security/index.md @@ -0,0 +1,48 @@ +--- +title: Biztonságosabb Ethereum +description: Az Ethereum a legbiztonságosabb és leginkább decentralizált okosszerződés-platform a világon. Azonban még mindig vannak fejlődési lehetőségek, hogy az Ethereum ellenálló maradjon minden szinten a támadásokkal szemben a jövőben is. +lang: hu +image: /roadmap/roadmap-security.png +alt: "Ethereum-ütemterv" +template: roadmap +--- + +Az Ethereum már most is egy nagyon biztonságos, decentralizált okosszerződés-platform. Azonban még mindig vannak fejlődési lehetőségek, hogy az Ethereum ellenálló maradjon mindenféle támadással szemben a jövőben is. Ez olyan apró változtatásokat is magában foglal, hogy az Ethereum-kliensek kezelik a versenyző blokkokat, valamint a sebességmegnövelését, amennyi idő alatt a hálózat azt mondja egy blokkra, hogy [végleges](/developers/docs/consensus-mechanisms/pos/#finality) (így a támadó nem változtathatja meg, csak nagy gazdasági veszteség árán). + +Olyan fejlesztések is folyamatban vannak, amelyek a tranzakciók cenzúrázását nehezítik meg, azáltal hogy a blokkjavasló nem tudja, mit tartalmaz az adott blokk, és új módokat kínál annak megállapítására, hogy egy kliens cenzúráz-e. Ezek együtt fogják továbbfejleszteni a proof-of-stake protokollt, hogy a felhasználóknak, az egyénektől a vállaltokig, azonnali bizalmuk legyen az alkalmazásokban, adatokban és eszközökben az Ethereumon. + +## A letétbe helyezés visszavonása {#staking-withdrawals} + +A proof-of-work mechanizmusról a proof-of-stake-ra való áttérés azzal kezdődött, hogy az Ethereum-úttörők egy letéti szerződésben letétbe helyezték az rendelkezésre álló ETH-jüket. Ez az ETH arra van, hogy megvédje a hálózatot. Ugyanakkor ezt az ETH-t nem lehetett felszabadítani és visszaadni a felhasználóknak. Az ETH-visszavonás lehetősége egy kritikus része a proof-of-stake frissítésnek. Amellett, hogy a pénzkivonás a teljesen működőképes proof-of-stake protokoll kritikus eleme, a kifizetések engedélyezése az Ethereum biztonságának is jót tesz, mivel lehetővé teszi a letétbe helyezők számára, hogy ETH-jutalmaikat más, nem letéttel kapcsolatos célokra is felhasználják. A likviditást igénylő felhasználóknak nem kell a likvid letéti derivatívákat (LSD) használni, ami egy centralizáló erő az Ethereumon. Ez a frissítés várhatóan 2023. április 12-án fog végbemenni. + +Bővebben a visszahívásokról + +## Támadások elleni védelem {#defending-against-attacks} + +A visszahívásokon kívül további fejlesztések tehetők az Ethereum [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) protokollján. Az egyik ilyen a [nézetegyesítés](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), egy biztonságosabb elágazási algoritmus, ami bizonyos szofisztikált támadásokat lehetetlenít el. + +Ha az Ethereum blokkvéglegesítési idejét sikerül csökkenteni, akkor a jobb felhasználói élmény mellett az olyan szofisztikált átrendezési támadásokat is csökkenteni lehet, amikor a támadó extra profitot akar kiszedni vagy cenzúrázza a tranzakciókat. Az [**egy sloton belüli véglegesség (SSF)**](/roadmap/single-slot-finality/) egy remek módszer a véglegesítés késleltetésére. Jelenleg 15 percnyi blokk esetén tudna egy támadó elméletileg meggyőzni egy másik validátort, hogy újrakonfigurálja azokat. Az SSF esetén ez 0 lenne. A felhasználók számára, kezdve az egyénektől egészen az alkalmazásokig és tőzsdékig, mindig hasznos, ha gyorsan lehet biztosítani, hogy a tranzakcióik ne lesznek visszafordítva, a hálózatnak pedig az, hogy a támadások teljes osztályait ki tudja zárni. + +Bővebben az egy sloton belüli véglegességről (SSF) + +## A cenzúra elleni védelem {#defending-against-censorship} + +A decentralizáció megakadályozza, hogy bizonyos egyének vagy validátorok kis csoportja túlzott befolyásra tegyen szert. Az új letéti technológiák segítenek, hogy az Ethereum validátorai decentralizáltak maradjanak, miközben védi őket a hardver-, szoftver- és hálózati hibáktól. Ez olyan szoftvert is felölel, amely megosztja a validátor felelősségét több csomóponton keresztül. Ez az **elosztottvalidátor-technológia (DVT)**. A letéti alapok ez ösztönzi, hogy használják a DVT-t, így több számítógép vehet részt egyszerre a validációban, ezzel redundanciával (extra kapacitás) és hibatoleranciával kiegészítve a működést. A validátorkulcsokat több rendszerre osztja el ahelyett, hogy egy operátor futtatna több validátort. Ezáltal a rosszhiszemű operátoroknak nehezebb támadást indítani az Ethereum ellen. Összességében további biztonsági előnyökkel járhat, ha a validátorok _közösségként_ működnek, nem egyénként. + +Bővebben az elosztottvalidátor-technológiáról (DVT) + +Az **előterjesztő-építő szétválasztás (PBS)** drasztikusan fejleszti az Ethereum beépített, cenzúrának való ellenállást. A PBS lehetővé teszi, hogy egy validátor rakja össze a blokkot, egy másik pedig továbbadja az Ethereum-hálózatnak. Ez biztosítja, hogy a professzionális profitmaximalizáló blokképítő algoritmusokól eredő nyereségek majd egyenletesebben oszoljanak el a hálózaton, **megakadályozva a letétek koncentrációját** a legjobban működő intézményes letéteseknél. A blokk előterjesztője a leginkább profitábilis blokkot választja azok közül, amit a blokképítők piaca ajánl. A cenzúrához a blokk előterjesztőjének gyakran egy kevésbé profitábilis blokkot kellene választania, ami **gazdaságilag irracionális és nyilvánvaló a többi validátor számára is** a hálózaton. + +Olyan potenciális kiegészítések is elérhetők a PBS-hez, mint a titkosított tranzakciók és a bekerülési lista, ami tovább növeli az Ethereum cenzúrának való ellenállást. Ezek következtében a blokk építője és javaslója nem tudja, hogy milyen tranzakciók vannak a blokkban. + +Bővebben a PBS-ről + +## A validátorok védelme {#protecting-validators} + +Lehetséges, hogy egy szofisztikált támadó beazonosítja a következő validátort és megakadályozza őt a javaslattételben; ez a **szolgáltatásmegtagadási, vagy más néven DoS**-támadás. A [**titkos vezetőválasztás (SLE)**](/roadmap/secret-leader-election) bevezetése megvéd ettől a támadási típustól, mivel a blokkjavaslók nem lesznek előre ismertek. Úgy működik, hogy a blokkjavaslókat képviselő kriptográfiai elköteleződéseket állandón keverik, és ezek sorrendje adja meg, hogy amelyik validátor kerül kiválasztásra, amiről csak ő fog tudni. + +Bővebben a titkos vezetőválasztásról + +## Jelenlegi helyzet {#current-progress} + +A tervezett fejlesztések között a biztonsági frissítések igen előrehaladott kutatási állapotban vannak, de még egy ideig nem várható a bevezetésük. A következő lépés a nézetegyesítésre (amelyeket még nem valósítottak meg élesben) a specifikáció véglegesítése és a prototípusok létrehozása. diff --git a/public/content/translations/hu/roadmap/single-slot-finality/index.md b/public/content/translations/hu/roadmap/single-slot-finality/index.md new file mode 100644 index 00000000000..21e774a6bac --- /dev/null +++ b/public/content/translations/hu/roadmap/single-slot-finality/index.md @@ -0,0 +1,66 @@ +--- +title: Egy sloton belüli véglegesség +description: Az egy sloton belüli véglegesség magyarázata +lang: hu +--- + +# Egy sloton belüli véglegesség {#single-slot-finality} + +Jelenleg 15 percet vesz igénybe, hogy egy Ethereum blokk véglegesedjen. Ugyanakkor az Ethereum konszenzusmechanizmusa úgy is fejleszthető, hogy a blokk validálása hatékonyabb legyen, és a véglegességhez szükséges idő drasztikusan csökkenjen. Ahelyett, hogy egy blokk javaslásához tizenöt perc kellene, azt ugyanabban a slotban lehessen javasolni és véglegesíteni. Ezt a koncepciót nevezik **egy sloton belüli véglegességnek (SSF)**. + +## Mi az a véglegesség? {#what-is-finality} + +Az Ethereum proof-of-stake alapú konszenzusmechanizmusában a véglegesítés arra utal, hogy a blokkot nem lehet megváltoztatni vagy eltávolítani a blokkláncból anélkül, hogy legalább 33%-nyi résztvevő vállalná az ezzel járó súlyos büntetést, vagyis az ETH elégetését. Ez egy kriptogazdasági biztonság, mert nagyon nagy költséggel járna, ha valaki meg akarná változtatni a lánc sorrendjét vagy tartalmát, így a racionális gazdasági szereplők nem vállalnák. + +## Miért törekszünk gyorsabb véglegesítésre? {#why-aim-for-quicker-finality} + +A véglegessé válás jelenlegi ideje túl hosszúnak bizonyult. A legtöbb felhasználó nem akar 15 percet várni, hogy végleges legyen a tranzakciója. Továbbá az alkalmazások és tőzsdék számára is kellemetlen, amelyek gyors tranzakcióátvitelt szeretnének, és mégis sokáig kell várniuk, hogy állandónak tekinthessék a változást. A blokk előterjesztése és a véglegesítése közötti idő arra is lehetőséget teremt, hogy egy támadó átrendezze a tartalmat, illetve hogy blokkokat cenzúrázzon vagy MEV-et szerezzen. Az a mechanizmus, amely a várakozó blokkok frissítését intézi, elég összetett és számtalanszor volt már javítva, hogy a gyenge biztonsági pontokat lezárják, így ez az Ethereum kódjának ez az a része, ahol kisebb hibák nagy valószínűséggel fordulnak elő. Ezeket a problémákat mind megoldaná, hogy ha egy slotban véglegessé válna a blokk. + +## A decentralizáció/idő/költség átváltása {#the-decentralization-time-overhead-tradeoff} + +A véglegesség garanciája az új blokknál nem azonnal történik meg; idő kell ahhoz, hogy a blokkot véglegesnek tekintsük. Ennek az az oka, hogy a véglegesítéshez a teljes letétbe helyezett ETH 2/3-át képviselő validátoroknak tanúsítaniuk kell az új blokkot. A hálózat minden validáló csomópontjának a többi csomóponttól érkező tanúsításokat kell feldolgoznia, hogy a blokk elérte a 2/3-os határt vagy nem. + +Minél rövidebb idő alatt kell elérni a véglegesedést, annál komolyabb számítási kapacitásra van szükség a csomópontoknál, mert a tanúsítást gyorsan kell elvégezni. Emellett minél több validáló csomópont van a hálózaton, annál több tanúsításra van szükség blokkonként, ami növeli a feldolgozási kapacitási igényt. Ha nagyobb feldolgozási kapacitás szükséges, akkor kevesebb személy vehet részt benne, mert drága hardvert kell ahhoz használni, hogy a validáló csomópont működjön. Ha a blokkok között több idő telik el, akkor kevesebb számítási kapacitás is elég a csomópontokhoz, de a véglegesedés is később történik meg, mert a tanúsításokat lassan dolgozzák fel. + +Így tehát átváltás van jelen a költség (számítási kapacitás), a decentralizáció (a validációban részt vevő csomópontok száma) és a véglegesítés ideje között. Az ideális rendszer a minimális számítási kapacitás, a maximális decentralizáció és a minimális véglegesítési idő között egyensúlyoz. + +Az Ethereum jelenlegi konszenzusmechanizmusa e három paraméter között a következőképpen egyensúlyoz: + +- **A minimális letétbe helyezést 32 ETH-ben állapítja meg**. Ez meghatároz egy felső határt arra, hogy a validátoroknak mennyi tanúsítást kell végezniük, amelyet az egyéni csomópontok hajtanak végre, és ezáltal egy felső határt határoz meg e csomópontok számítási igényeinek is. +- **A véglegesítés idejét kb. 15 percre teszi**. Ez elegendő időt ad az otthoni számítógépen futó validátoroknak is, hogy biztonsággal elvégezzék minden blokk tanúsítását. + +A jelenlegi mechanizmussal a véglegesítés idejét úgy lehet csökkenteni, ha csökkentjük a validátorok számát a hálózaton vagy növeljük a hardverszükségletet minden csomópont esetében. Ugyanakkor fejleszthető a tanúsítások végzése is, amellyel több tanúsítás lehetséges növekvő költség és az egyes csomópontok túlterhelése nélkül. A hatékonyabb végrehajtás lehetővé teszi, hogy a véglegesítés egy sloton belül, ne két korszak alatt történjen meg. + +## Az egy sloton belüli véglegesítéshez (SSF) vezető út {#routes-to-ssf} + + + +A jelenlegi konszenzusmechanizmus összekombinálja a több validátortól, vagyis a bizottságtól származó tanúsítást, hogy csökkentse az üzenetek számát, amelyet minden validátornak fel kell dolgoznia a validálás során. Minden validátornak lehetősége van tanúsítani egy adott korszakban (32 slot), de egy adott slotban csak a validátorok egy csoportja, a bizottság végzi a tanúsítást. Ehhez alhálózatokra osztódnak, amelyekben néhány validátor aggregátorként működik. Ezek az aggregátorok a saját alhálózatukban lévő validátortól látott összes aláírást összevonják egy aggregált aláírásba. Az aggregátor, aki a legtöbb egyéni hozzájárulást tudta összevonni, átadja az aggregált aláírást a blokk javaslattevőjének, aki azt beleteszi a blokkba a többi bizottságtól kapott aggregált aláírással együtt. + +Ez a folyamat elegendő kapacitást ad minden validátornak, hogy szavazzon minden korszakban, mert ez korszakonként 32 slot × 64 bizottság× 256 validátor bizottságonként = 524 288 validátor. A jelen szöveg írásának időpontjában (2023. február) kb. 513 000 aktív validátor van. + +E séma szerint egy teljes korszak kell ahhoz, hogy minden validátor részt vehessen a tanúsításban egy blokkhoz kapcsolódóan. Ugyanakkor lehetséges ezt a mechanizmust úgy is továbbfejleszteni, hogy minden validátor minden slotban végezhessen tanúsítást. + + +Mióta az Ethereum konszenzusmechanizmusát megtervezték, az aláírásaggregálás sémája (BLS) sokkal skálázhatóbbnak bizonyult, mint azt korábban gondolták, és közben a kliensek is fejlődtek az aláírások feldolgozásában és ellenőrzésében. Kiderült, hogy a nagy számú validátor valójában egyetlen slotban is képes végrehajtani a tanúsításokat. Például egymillió validátorral, akik közül mindenki kétszer szavaz egy slotban, a slot ideje pedig 16 másodperc, a csomópontoknak az aláírások ellenőrzését egy minimális másodpercenként 125 000 aggregációs rátán kellene végrehajtaniuk, hogy egymillió tanúsítást végezzenek a slotban. Valójában egy átlagos számítógépnek 500 nanomásodpercig tart egy aláírás ellenőrzése, tehát 125 000 ellenőrzést nagyjából 62,5 ms alatt végezne el – jóval az egy másodperces határ alatt. + +Még hatékonyabb lenne, ha szuperbizottságokat hoznának létre, pl. 125 000 véletlenszerűen kiválasztott validátort slotonként. Csak ezek a validátorok szavaznának egy adott blokkra, ezért a validátoroknak csak ezen alcsoportja döntene a blokk véglegesítéséről. Hogy vajon ez egy jó ötlet vagy sem, az azon múlik, hogy a közösség számára mennyire drága egy sikeres támadás az Ethereum ellen. Mivel ahelyett, hogy a támadó véglegesíteni tudna egy blokkot, ha a teljes letétbe helyett ethernek a 2/3-t kontrollálja, csak a _szuperbizottságban_ kell a 2/3-nyi lekötött etherrel bírnia egy rosszhiszemű blokk véglegesítéséhez. Ez továbbra is egy aktívan kutatott terület, de valószínű, hogy egy igazán nagy méretű validátorkészlet esetén, amelynél már szuperbizottságokat kell bevezetni, ezen csoportok megtámadásának költsége rendkívül magas lenne (pl. a denominált költség ETH-ben `2/3 × 125 000 × 32 = kb. 2,6 millió ETH`). A támadás költsége igazítható azáltal, hogy a validátorkészlet méretét megnövelik (pl. úgy igazítható a validátorszám, hogy a támadás költsége 1, 4, 10 stb. millió ether legyen). [A kezdeti vélemények](https://youtu.be/ojBgyFl6-v4?t=755) a közösség részéről azt sugallják, hogy az 1-2 millió ether egy elfogadható támadási költség, ami szuperbizottságonként ~65 536–97 152 validátort jelentene. + +Ugyanakkor nem az ellenőrzés a valódi szűk keresztmetszet, hanem az aláírások aggregálása a kihívás a validátor-csomópontok számára. Az aláírásaggregáció skálázásához a validátorok számát valószínűleg meg kell növelni minden alhálózatban, növelni kell az alhálózatok számát, vagy az aggregáció új rétegeit kell bevezetni (pl. a bizottságok bizottságát létrehozni). A megoldás része lehet a specializált aggregátorok létrehozása is, hasonlóan ahhoz, ahogy a javaslattevő-építő szétválasztás (PBS) és a Danksharding bevezetésénél a blokk építését és az összevont tranzakcióhoz tartozó elköteleződés létrehozását kiszervezik specializált építőknek. + +## Mi a szerepe az elágazásválasztásnak az SSF-ben? {#role-of-the-fork-choice-rule} + +A jelenlegi konszenzusmechanizmus a véglegesedési mechanizmus és az elágazásválasztás közötti szoros kapcsolaton alapszik, az első az az algoritmus, amely meghatározza, hogy a validátorok 2/3-a tanúsított-e egy adott láncot, a második pedig az az algoritmus, amelyik eldönti, hogy melyik lánc a megfelelő, amikor több opció is létezik. Az elágazásválasztás algoritmusa csak azokat a blokkokat veszi figyelembe, amelyek az utolsó véglegesített blokk _után_keletkeznek. Az SSF bevezetésével nem lesz olyan blokk, ami az elágazásválaszt határkörébe esik, mert a véglegesítés ugyanabban a slotban történik, mint a blokk előterjesztése. Ennélfogva az SSF bevezetésével _sem_ az elágazásválasztás algoritmusa, _sem_ a véglegességi mechanizmus nem lesz aktív. A véglegességi mechanizmus véglegesítené azokat a blokkokat, ahol a validátorok 2/3-a online volt és jóhiszeműen tanúsított. Ha a blokk nem tudná meghaladni a 2/3-os határt, akkor az elágazásválasztási szabály lépne életbe, hogy meghatározza a követendő láncot. Ez arra is lehetőséget ad, hogy az inaktivitás miatti elszivárgás mechanizmusát fenntartsák, amely visszaállítja a láncot, amikor a validátorok több mint 1/3-a offline, jóllehet némileg továbbfejlesztve azt. + +## Fennálló problémák {#outstanding-issues} + +Ha az aggregáció skálázásához az alhálózatokban megnövelnék a validátorok számát, az azzal a problémával járna, hogy a peer-to-peer hálózatra nagyobb teher nehezedne. Az aggregáció új rétegeinek bevezetése elég összetett programozási feladat és késleltetést okoz (mivel hosszabb időbe telik, mire a blokkot ellenőrző minden alhálózati aggregátortól kap valamit). Az sem egyértelmű, hogyan lehetne kezelni azt, hogy több aktív validátor van a hálózaton, mint amit egy slotban fel lehet dolgozni, még akár BLS aláírásaggregációval is. Mivel minden slotban minden validátor tanúsít és nincsenek bizottságok az SSF koncepcióban, egy lehetséges megoldás lehet az is, hogy az effektív egyenleg maximális 32 ETH határát teljesen eltörölnék, így a több validátort működtetők konszolidálhatnák a letétjeiket és kevesebb validátort futtathatnának, ezzel csökkentve az üzenetek számát, amelyet a validátor-csomópontoknak kell feldolgozniuk a teljes validátorkészletet illetően. A nagyletéteseken múlik, hogy konszolidálják a validátoraikat. Az is lehetséges, hogy bármikor felső határt húznak a validátorok számát vagy a letétbe helyezett ETH összegét illetően. Ugyanakkor ehhez szükséges egy olyan mechanizmus, amely eldönti, hogy melyik validátor vehet részt és amelyik nem, ez pedig nem kívánt másodlagos hatásokat okozhat. + +## Jelenlegi helyzet {#current-progress} + +Az SSF még kutatási fázisban van. Nem várható, hogy a következő években bevezetésre kerül, inkább más lényeges fejlesztések után eszközölése várható, mint például a [Verkle-fák](/roadmap/verkle-trees/) és a [Danksharding](/roadmap/danksharding]). + +## További olvasnivaló {#further-reading} + +- [Vitalik az SSF-ről az EDCON rendezvényen (2022)](https://www.youtube.com/watch?v=nPgUKNPWXNI) +- [Vitalik jegyzetei: az egy sloton belüli véglegességhez vezető út](https://notes.ethereum.org/@vbuterin/single_slot_finality) diff --git a/public/content/translations/hu/roadmap/statelessness/index.md b/public/content/translations/hu/roadmap/statelessness/index.md new file mode 100644 index 00000000000..9f5975cc250 --- /dev/null +++ b/public/content/translations/hu/roadmap/statelessness/index.md @@ -0,0 +1,103 @@ +--- +title: Státuszmentesség, a státusz és az előzményadatok lejárata +description: Az előzményadatok lejáratának és a státuszmentes Ethereumnak a magyarázata +lang: hu +--- + +# Státuszmentesség, a státusz és az előzményadatok lejárata {#statelessness} + +A valódi decentralizácóhoz szükség van arra, hogy az Ethereum-csomópontokat egyszerű hardveren lehessen futtatni. A csomópontok futtatása lehetővé teszi a felhasználónak, hogy független kriptográfiai validálással ellenőrizzék az információkat, és ne kelljen megbízniuk egy harmadik félben, hogy az adatokkal lássa el őket. A csomópont futtatásával a felhasználó közvetlenül küldhet tranzakciót az Ethereum peer-to-peer hálózatára, és nem kell megbíznia egy közvetítőben. A decentralizáció nem lehetséges, ha ezek az előnyök csak a drága hardverrel rendelkező felhasználók számára elérhetők. Ehelyett a csomópontokat rendkívül szerény teljesítményű és memóriaigényű készülékeken is lehessen működtetni, mint amilyenek a mobiltelefonok, a mikroszámítógépek vagy az otthoni számítógépek. + +Jelenleg a nagy tárhelyigény jelenti a legnagyobb akadályt ahhoz, hogy a csomópontokat bárki működtethesse globálisan. Ennek az a fő oka, hogy az Ethereum státuszadatainak nagy halmazait kell eltárolni. Ezek a státuszadatok kritikus információkat tartalmaznak az új blokkok és tranzakciók megfelelő lefuttatásához. A jelen cikk írásának időpontjában egy gyors 2 TB SSD szükséges ahhoz, hogy egy teljes Ethereum csomópontot lehessen futtatni. Ez egy olyan csomópont tárhelyigénye, amely nem törli ki a régebbi adatokat és nagyjából heti 14 GB-tal nő. Az archív csomópontok pedig, amelyek a genezis óta az összes adatot tartalmazzák, már 12 TB-t érnek el (ezen leírás időpontjában, 2023. februárjában). + +A régebbi adatokhoz lehet olcsóbb merevlemezeket használni, de ezek túl lassúak ahhoz, hogy a bejövő blokkokkal lépést tartsanak. Az csak egy átmeneti és részleges megoldás, hogy a kliensek jelenlegi tárolási modelljét megtartva olcsóbbá és könnyebbé tegyük az adattárolást, mivel az Ethereum státusznövekedése határtalan, tehát a tárhelyigény csak növekszik, a technológiai fejlesztéseknek pedig folyamatosan lépést kell tartaniuk ezzel. Ehelyett a klienseknek új módszert kell találni a blokkok és tranzakciók ellenőrzésére, amelyhez az adatokat nem szükséges a lokális adatbázisból kikeresni. + +## A csomópontokhoz szükséges tárhely csökkentése {#reducing-storage-for-nodes} + +Számos módon le lehet csökkenteni a csomópontban tárolt adatmennyiséget, ehhez azonban különféle mértékben, de módosítani kell az Ethereum-protokollon: + +- **Az előzményadatok lejárata**: lehetővé teszi, hogy a csomópont törölje azokat a státuszadatokat, amelyek X blokknál régebbiek, de nem változtatja meg a Ethereum-kliens státuszkezelési módját +- **A státusz lejárata**: lehetővé teszi, hogy inaktívvá válhassanak azok a státuszadatok, amelyeket nem használnak rendszeresen. Az inaktív adatokkal nem kell foglalkoznia a kliensnek mindaddig, amíg az újból be nem hívják őket. +- **Gyenge státusztalanság**: csak a blokk-készítőknek van szükségük a teljes státuszadatra, a többi csomópont a lokális státuszadatbázis nélkül is képes ellenőrizni a blokkokat. +- **Erős státusztalanság**: semelyik csomópontnak nincs szüksége az összes státuszadatra. + +## Az adatok lejárata {#data-expiry} + +### Az előzményadatok lejárata {#history-expiry} + +Az előzményadatok lejárata azt jelenti, hogy a kliensek törlik a régebbi adatokat, amelyekre már valószínűleg nem lesz szükség, így csak kevés előzményadatot tárolnak, és az új adatok felülírják a legrégebbieket. A klienseknek két okból van szükségük előzményadatokra: szinkronizáláshoz és adatlekérdezések teljesítéséhez. Eredetileg a klienseknek a genezisblokkból kellett szinkronizálniuk, ellenőrizve, hogy minden egyes soron következő blokk megfelelő-e egészen a lánc elejéig. Jelenleg a kliensek ezt az utat a lánc elejéig a „gyenge szubjektivitású ellenőrzési pontoktól” kiindulva teszik meg. Ezek az ellenőrzési pontok megbízható kiindulási pontok, vagyis olyan, mintha a genezisblokk közelebb lenne a jelenhez, nem az Ethereum kezdetétől nézné. Tehát a kliensek törölhetnek minden olyan információt, amely a legutóbbi gyenge szubjektivitású ellenőrzési pontnál korábbi, így is képesek szinkronizálni a lánc elejével. A kliensek jelenleg úgy szolgáltatnak előzményadatokat (amelyek JSON-RPC-n keresztül érkeznek), hogy azokat a helyi adatbázisukból kérik le. Ez az előzményadatok lejáratával nem lesz lehetséges, mert az adat egy része nem lesz már elérhető. Az előzményadatok biztosítására egy innovatív megoldásra van szükség. + +Az egyik lehetőség az, hogy a kliensek az előzményadatokat a társaiktól kérik le olyan megoldással, mint amilyen a Portal Network. A Portal Network egy fejlesztés alatt álló peer-to-peer hálózat az előzményadatok biztosítására, ahol minden csomópont az Ethereum előzményadatának egy kis részét tárolja, így a teljes adathalmaz a hálózaton elosztva létezik. Ezek megszerzése úgy működik, hogy megkeresik azokat a peereket, akik tárolja az adott adatokat és lekérik tőlük ezeket. Másik megoldás lehet, hogy mivel általában az alkalmazásoknak van szüksége előzményadatokra, ezért az ő felelősségük lenne ezek tárolása. Talán lenne elég önfeláldozó szereplő az Ethereum világában, akik önkéntesen tárolnának előzményarchívumokat. Lehetne egy decentralizált autonóm szervezet (DAO), ami felvállalja az adattárolást, vagy ideális esetben lehetne ezen opciók kombinációja is. Ezek a szolgáltatók számos módon szolgálhatnának adattal, például torrent, FTP, Filecoin vagy IPFS formájában. + +Az előzményadatok lejárata egy kicsit ellentmondásos téma, mert eddig az Ethereum mindig nyilvánosan vállalta bármilyen adat elérhetőségét. Mindig alapból elérhető volt egy teljes szinkronizáció a genezistől kezdve, még akkor is, ha az újraépítéshez a régi adatok pillanatfelvételét kellett használni. Az előzményadatok lejárata ezt a felelősséget az Ethereum-protokollon kívülre helyezi. Ez akár új cenzúrakockázatot is hordozhat magában, ha végül centralizált szerzetek biztosítják az előzményadatokat. + +Az EIP-4444 még nem áll készen, de aktív egyeztetés folyik róla. Érdekes módon, az EIP-4444-gyel kapcsolatos kihívások jellemzően nem technikaiak, hanem inkább a közösségi kezelésből erednek. A közösségnek bele kell egyeznie az új módszerbe, el kell fogadnia, hogy az előzményadatokat megbízható entitások szolgáltassák. + +Ez a fejlesztés nem változtatja meg alapjaiban az Ethereum-csomópontok státuszadat-kezelését, csak azok elérésére lesz hatással. + +### A státusz lejárata {#state-expiry} + +A státusz lejárata azt jelenti, hogy az egyéni csomópontokból eltávolítják a státuszt, ha azt az utóbbi időben nem használták. Ezt többféle módon is meg lehet valósítani, például: + +- **Lejárat a bérleti díj alapján**: kapcsoljunk a számlákhoz „bérleti díjat”, és amikor ez nullázódik, akkor a számla is lejár +- **Lejárat idő alapján**: a számlák inaktíválódnak, ha egy ideig nem végeznek olvasási/írási műveletet rajtuk + +A bérleti díj alapján vett lejárat lehet egy közvetlen díjkérés a számláktól, hogy azok maradjanak aktív állapotban az adatbázisban. Az idő alapján vett lejárat lehet az utolsó interakció óta eltelt idő, illetve az összes számla periodikus lejárata. Lehetnek olyan mechanizmusok is, amelyek ötvözik az idő- és a bérletidíj-alapú modelleket, például az egyéni számlák aktív státuszban maradnak, ha fizetnek egy kis összeget az időalapú lejárat előtt. Ezzel kapcsolatban fontos megérteni, hogy az inaktív állapot nem jelent **törlést**, csak elkülönítve tárolják a kapcsolódó adatokat az aktív státusztól. Az inaktív státuszt vissza lehet állítani élő állapotra. + +Ez úgy valósulhat meg, hogy például egy státuszfa áll rendelkezésekre bizonyos időperiódusokra (talán 1 évre). Amikor az új periódus elkezdődik, egy teljesen új státuszfa jön létre. Csak a jelenlegi státuszfát lehet módosítani, a többi megváltoztathatatlan. Az Ethereum-csomópontoknak csak a jelenlegi és a legutóbbi státuszfát kellene tárolniuk. Ehhez időbélyeget kell tenni a címekre, hogy melyik periódusban léteznek. [Számos módja van annak](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607), hogy ezt bevezessék, de a legjobb megoldáshoz a [címeket meg kell hosszabbítani](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485), hogy elférjen az új információ, illetve a hosszabb címek biztonságosabbak is. Az útitervben ezt a fejlesztés a [címhely kiterjesztése](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485) címen szerepel. + +Az előzményadatok lejáratához hasonlóan a státuszlejáratnál is az egyéni felhasználók helyett tárolhatják a régi státuszadatokat más entitások, mint központi szolgáltatók, önfeláldozó közösségi tagok vagy olyan jövőbeli, decentralizált megoldások, mint amilyen a Portal Network. + +A státusz lejárata még kutatási fázisban van, a fejlesztés nem áll készen a bevezetésre. A státuszlejárat talán a státuszmentes kliensek és az előzményadatok lejárata után kerül bevezetésre, mert ezek a fejlesztések a legtöbb validátor számára már kezelhetővé teszik a nagy státuszokat. + +## Hontalanság {#statelessness} + +A státusztalanság nem azt jelenti, hogy a státusz megszűnik, hanem megváltozik az Ethereum-csomópontok státuszkezelési módja. A státusztalanság kétféle jelleget ölthet: gyenge és erős státusztalanság. A gyenge státusztalanság a legtöbb csomópont számára megengedi, hogy státusz nélkül állapotban fussanak, mivel csak néhánynak lesz a feladata a tárolás. Az erős státusztalanság megszűnteti azt, hogy bármelyik csomópontnak tárolnia kelljen az összes státuszadatot. Mindkét fajta a következő előnyökkel jár az átlagos validátorok számára: + +- szinte azonnali szinkronizálás +- képesek a blokkokat soron kívül is validálni +- a csomópontokat egyszerű hardverrel is lehet futtatni (pl. telefonnal) +- a csomópontokhoz olcsó merevlemezt is lehet használni, mert nincs szükség írásra/olvasásra +- kompatibilis az Ethereum elkövetkező kriptográfiai fejlesztéseivel + +### Gyenge státusztalanság {#weak-statelessness} + +A gyenge státusztalanság megváltoztatja azt, ahogy az Ethereum-csomópontok ellenőrzik a státuszváltozásokat, de teljesen nem szüntetik meg azt, hogy a hálózaton néhány csomópontnak ne kelljen státuszt tárolni. Ehelyett a státusz tárolásának felelősségét a blokkelőterjesztőknek adja, a hálózat többi csomópontja, amely a blokkokat ellenőrzi, működhet a teljes státuszadat nélkül. + +**Gyenge státusztalanság esetén a blokkelőterjesztőknek szükségük van a teljes státuszadatra, de az ellenőrzőknek nincs** + +Ehhez előbb [Verkle-fákat](/roadmap/verkle-trees/) kell bevezetni az Ethereum-klienseknél. A Verkle-fák adatstruktúrák az Ethereum státuszainak tárolására, amelyek kicsi, fix méretű „tanúkat” készítenek, amelyet meg lehet osztani a társakkal, és a blokkokat ezekhez lehet validálni a lokális adatbázisok helyett. Egy [ javaslattevő-építő szétválasztás (PBS)](/roadmap/pbs/) is szükséges, mert így a blokképítőknek specializált csomópontjaik lehetnek sokkal erőteljesebb hardverrel, és csak nekik kell hozzáférni a teljes státuszadathoz. + + + +A státusztalanság arra épül, hogy a blokképítők tárolják a teljes státuszadatot, így képesek olyan tanúkat készíteni, amit a blokk validálásához használnak. A többi csomópontnak nincs szüksége a státuszadatokra, minden szükséges információ benne van a tanúban. Ez egy olyan helyzet, amelyben a blokképítés drága, viszont a blokkellenőrzés olcsó tevékenység, így kevesebben fognak blokképítő csomópontokat működtetni. Ugyanakkor a blokképítők decentralizációja nem annyira kritikus téma, hogyha a lehető legtöbb résztvevő képes függetlenül részt venni a blokkok ellenőrzésében. + +Tudjon meg többet a témáról Dankrad jegyzeteiből + + +A blokképítők használják a státuszadatot a tanúk létrehozásához – ez egy minimális adathalmaz, mellyel ellenőrizhető a blokkban lévő tranzakciók által okozott státuszváltozás. A többi validátornak nincs szüksége a státuszra, csak a státuszgyökeret (a teljes státusz hashje) tárolják. Megkapják a blokkot és a tanút, és ezeket felhasználva frissítik a saját státuszgyökerüket. Ezáltal a validáló csomópont rendkívül könnyű lesz. + +A gyenge státusztalanság a kutatás előrehaladott állapotában tart, de a bevezetése a javaslattevő-építő szétválasztáson (PBS) és a Verkle-fák bevezetésén múlik, hogy a kis méretű tanúkat el lehessen küldeni a társaknak. Ez alapján a bevezetése talán néhány év múlva történhet meg az Ethereum főhálózatán. + +### Erős státusztalanság {#strong-statelessness} + +Az erős státusztalanság megszűnteti azt, hogy bármelyik csomópontnak tárolnia kelljen a státuszadatot. Ehelyett a tranzakciókat a tanúkkal együtt küldik, amelyet a blokképítők aggregálnak. Így a blokképítők felelősek azért, hogy a szükséges státuszokat tárolják, hogy abból elkészítsék a tanúkat a releváns számlákra. A státuszhoz kapcsolódó felelősség szinte teljesen a felhasználókhoz kerül, mivel tanúkat és hozzáférési listákat küldenek arról, hogy milyen számlákkal és tárhelykulcsokkal kapcsolódnak. Ennek következtében rendkívül könnyű csomópontok működhetnek, viszont az okosszerződésekkel nehezebb lesz az interakciójuk. + +Az erős státusztalanságot vizsgálják a kutatók, de jelenleg nem valószínű, hogy része lesz az Ethereum útitervének – sokkal valószínűbb, hogy a gyenge státusztalanság elegendő az Ethereum skálázási igényekhez. + +## Jelenlegi helyzet {#current-progress} + +A gyenge státusztalanság, az előzményadatok és a státuszadatok lejárata még kutatási fázisban van, és talán évek múlva kerül bevezetésre. Az sem biztos, hogy a javaslatokból mindegyiket be kell vezetni, mert kiderülhet például, hogy a státusz lejárati ideje után már nincs szükség az előzményadat-lejáratot is megvalósítani. Előbb más útitervelemeknek kell megvalósulniuk, mint például a [Verkle-fák](/roadmap/verkle-trees) és a [javaslattevő-építő szétválasztás (PBS)](/roadmap/pbs). + +## További olvasnivaló {#further-reading} + +- [Vitalik a státusztalanságról (AMA)](https://www.reddit.com/r/ethereum/comments/o9s15i/impromptu_technical_ama_on_statelessness_and/) +- [A státuszméret menedzsmentjének elmélete](https://hackmd.io/@vbuterin/state_size_management) +- [Státusz összekapcsolása az élesedés okozta konfliktus minimalizálására](https://ethresear.ch/t/resurrection-conflict-minimized-state-bounding-take-2/8739) +- [A státusztalansághoz és a státuszlejárathoz vezető út](https://hackmd.io/@vbuterin/state_expiry_paths) +- [Az EIP-4444 specifikációi](https://eips.ethereum.org/EIPS/eip-4444) +- [Alex Stokes az EIP-4444 fejlesztéséről](https://youtu.be/SfDC_qUZaos) +- [Miért olyan fontos a státusztalanság](https://dankradfeist.de/ethereum/2021/02/14/why-stateless.html) +- [Ez eredeti státusztalan kliens koncepciójának leírása](https://ethresear.ch/t/the-stateless-client-concept/172) +- [Bővebben a státuszlejáratról](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) +- [Még több tudnivaló a státuszlejáratról](https://hackmd.io/@vbuterin/state_expiry_paths#Option-2-per-epoch-state-expiry) diff --git a/public/content/translations/hu/roadmap/user-experience/index.md b/public/content/translations/hu/roadmap/user-experience/index.md new file mode 100644 index 00000000000..99f7cbda6f3 --- /dev/null +++ b/public/content/translations/hu/roadmap/user-experience/index.md @@ -0,0 +1,36 @@ +--- +title: A felhasználói élmény javítása +description: A legtöbb ember számára még mindig túl bonyolult az Ethereum használata. A tömeges használathoz az Ethereumnak drasztikusan csökkentenie kell ezt az akadályt – mindenki számára előnyösnek kell lennie a decentralizált, engedélymentes és cenzúrának ellenálló Ethereum-hozzáférésnek, ugyanakkor olyan könnyednek kell lennie, mint a hagyományos web2 alkalmazás használata. +lang: hu +image: /roadmap/roadmap-ux.png +alt: "Ethereum-ütemterv" +template: roadmap +--- + +Az Ethereum használatát egyszerűsíteni kell – a kulcsok és tárcák kezelésével kezdve a tranzakciók elindításáig. A tömeges használathoz az Ethereumnak könnyebbé kell tennie a használatot, hogy a felhasználók megtapasztalhassák az engedélymentes és cenzúrának ellenálló hozzáférést az Ethereumhoz, a web2 alkalmazások könnyű használatához hasonlóan. + +## A kulcsmondatokon túl {#no-more-seed-phrases} + +Az Ethereum-számlákat egy kulcspár védi, amelyek a számla azonosítását (nyilvános kulcs) és az üzenetek aláírását (privát kulcs) szolgálják. A privát kulcs olyan, akár egy mesterjelszó; teljes hozzáférést biztosít az Ethereum-számlához. Ez egy más megközelítés, mint amelyet a legtöbb felhasználó ismer, akik a bankokra és web2-alkalmazásokra bízzák a számlák kezelését. Az Ethereum tömeges használatának eléréséhez egyértelmű és könnyed utat kell mutatni a felhasználóknak, hogyan anélkül felügyelhessék eszközeiket és adataikat, hogy érteniük kellene a nyilvános-privát kulcsok kriptográfiájához és a kulcskezeléshez. + +Erre remek megoldás, hogy okosszerződéses tárcákat használjanak az Ethereummal való interakciókhoz. Az okosszerződéses tárcák képesek megvédeni a számlát, ha a kulcsok elvesznek vagy ellopják azokat, jobban ellenállnak a csalásnak és támadásnak, és új funkciók használatát is lehetővé teszik a tárcákban. Habár okosszerződéses tárcák már most is léteznek, de nagyon nehézkes megépíteni azokat, mert az Ethereum-protokollnak jobban kellene azokat támogatni. Ezt az extra támogatást nevezzük számlaabsztrakciónak. + +Bővebben a számlaabsztrakcióról + +## Csomópont mindenkinek + +A csomópont működtetésével a felhasználónak nem kell harmadik felekre bíznia, hogy adatokkal lássák el, így gyorsan, privát módon és engedély nélkül tud az Ethereum blokklánccal interakcióba lépni. Azonban a csomópont jelenlegi működtetése technikai tudást és jelentős merevlemez-kapacitást igényel, így a legtöbb felhasználónak másokhoz kell fordulnia. + +Számos fejlesztés meg fogja könnyíteni a csomópontok működtetését és csökkenti erőforrásigényüket. Az adatok tárolásához egy sokkal kevesebb tárhelyet igénylő struktúrát fognak használni, amit **Verkle fának** neveznek. Emellett a [státusztalanság](/roadmap/statelessness) és az [adatok lejárata](/roadmap/statelessness/#data-expiry) miatt a csomópontoknak nem kell majd a teljes Ethereum-státuszadatát tárolniuk, jelentősen lecsökkentve a merevlemezigényeket. A [könnyű kliensek](/developers/docs/nodes-and-clients/light-clients/) is rengeteg előnyt nyújtanak a teljes csomópontok üzemeltetéséhez, mivel ezeket mobileszközökről vagy egyszerű böngészőalkalmazásokból is futtatni lehet majd. + +Bővebben a Verkle-fákról + +Ezekkel az fejlesztésekkel gyakorlatilag nullára csökken a csomópontfuttatás akadálya. A felhasználók biztonságos, engedélymentes hozzáférést nyernek az Ethereumhoz, anélkül hogy komoly lemezterületet vagy CPU-t áldoznának erre, és nem kell harmadik félhez fordulniuk adatért vagy a hálózat eléréséhez, amikor alkalmazásokat használnak. + +## Jelenlegi helyzet {#current-progress} + +Az okosszerződéses tárcák már elérhetők, de több fejlesztésre van szükség, hogy még decentralizáltabbak és engedélymentesek legyenek. Az EIP-4337 egy olyan javaslat, ami már nem igényli az Ethereum-protokoll komoly módosítását. A fő okosszerződés, ami a EIP-4337-hez kellett, 2023. márciusában jelent meg. + +A teljes státusztalanság még a kutatás fázisában van és valószínűleg több év kell a bevezetéséhez. Ehhez még számos mérföldkövet el kell érni, ilyen például az adatok lejárata is, amelyek hamarabb bevezetésre kerülhetnek. A többi tervezett fejlesztésnek, mint a [Verkle-fáknak](/roadmap/verkle-trees/) és a [javaslattevő-építő szétválasztásnak](/roadmap/pbs/) előbb meg kell valósulnia. + +A Verkle-fás teszthálózatok már használhatók, a következő lépés a Verkle-fákkal működő kliensek privát és nyilvános teszthálózaton való futtatása. Ön is segíthet a fejlesztés meggyorsításában, ha szerződéseket hoz létre a teszthálózaton és klienseket működtet a teszthez. diff --git a/public/content/translations/hu/roadmap/verkle-trees/index.md b/public/content/translations/hu/roadmap/verkle-trees/index.md new file mode 100644 index 00000000000..d04cddecdf3 --- /dev/null +++ b/public/content/translations/hu/roadmap/verkle-trees/index.md @@ -0,0 +1,65 @@ +--- +title: Verkle-fák +description: A Verkle-fák részletes bemutatása, illetve annak leírás, hogy miként használják ezeket az Ethereum fejlesztésére +lang: hu +summaryPoints: + - Fedezze fel, hogy mire valók a Verkle-fák + - Tekintse meg, hogy a Verkle-fák hogyan járulnak hozzá az Ethereum fejlődéséhez +--- + +# Verkle-fák {#verkle-trees} + +A Verkle-fák (a vektor elköteleződés és a „Merkel-fák” összevonásából) olyan adatstruktúrát alkotnak, amely az Ethereum-csomópontokat fejleszti, hogy ne kelljen nagy mennyiségű státuszadat tárolniuk, de mégis validálni tudják a blokkokat. + +## Hontalanság {#statelessness} + +A Verkle-fák kritikus lépést jelentenek a státusztalan Ethereum-kliensekhez vezető úton. A státusztalan kliensek úgy tudják validálni a bejövő blokkokat, hogy ahhoz nem kell tárolniuk a teljes státuszadatbázist. Ahelyett, hogy az Ethereum státuszának saját lokális másolatát használnák, a státusztalan kliensek egy „tanút” használnak a státuszadatokhoz, amely a blokkal együtt érkezik. A tanú a státuszadat egyéni darabjainak halmaza, amely ahhoz szükséges, hogy a tranzakciók egy adott kötegét le lehessen futtatni, illetve egy kriptográfiai bizonyíték arra, hogy a tanú valóban a teljes adat része. Ezt a tanút használják a státuszadatbázis _helyett_. Ehhez arra van szükség, hogy a tanúk nagyon kis méretűek legyenek, így biztosan időben el lehet juttatni őket a hálózaton keresztül a validátorokhoz, hogy azt egy 12 másodperces slotban feldolgozzák. A jelenlegi státuszadatstruktúra nem megfelelő, mert a tanúk túl nagy méretűek. A Verkle-fák megoldják ezt a problémát, mert kis méretű tanúkat tudnak készíteni, így a státusztalan kliensek egyik fő akadályát ki tudják küszöbölni. + + + +Az Ethereum-kliensek jelenleg a Patricia Merkle Trie-adatstruktúrát használják a státuszadatok tárolására. Az egyéni számlákra vonatkozó információk a fa és a digitális fa leveleiként tárolódnak, ahol a levélpárokat addig hashelik, amíg már csak egyetlen hash marad. Ezt a végső hasht hívják gyökérnek. A blokkellenőrzéshez az Ethereum-kliensek végrehajtják az összes tranzakciót a blokkban és frissítik a lokális státuszfájukat. A blokkot akkor tekintik érvényesnek, amikor a lokális fa gyökere azonos lesz azzal, amit a blokkelőterjesztő adott, mivel ha bármilyen különbség lenne az előterjesztő és a validáló csomópont számolása között, akkor a gyökérhash teljesen eltérne. Ezzel az a gond, hogy a blokklánc validálásához minden kliensnek tárolnia kell a vezetőblokk és számos előzményblokk teljes státuszfáját (a Geth-ben alapvető, hogy a vezetőblokk utáni 128 blokkra megtartják a státuszadatokat). Ehhez a klienseknek nagy tárhelyre van szükségük, ami megakadályozza, hogy teljes csomópontokat lehessen olcsón és kisebb kapacitású hardverrel üzemeltetni. Ezt úgy lehet megoldani, hogy a státuszfát egy hatékonyabb struktúrára (Verkle-fa) cserélik, ami képes kis méretű tanúkkal összefoglalni az adatokat, amit a teljes státuszadat helyett meg lehet osztani a validátorokkal. A státuszadat átformázása a Verkle-fa struktúrájába egy mérföldkő a státuszmentes kliensek bevezetéséhez. + + + +## Mi az a tanú és miért van rá szükség? {#what-is-a-witness} + +A blokk ellenőrzése azt jelenti, hogy a benne lévő tranzakciókat újra végrehajtják, megváltoztatják az Ethereum státuszfát, és kiszámolják az új gyökérhasht. Az érvényes blokk az lesz, amelynek a kiszámolt státuszgyökér-hashe ugyanazt, mint amit a blokkal együtt adtak (mert ekkor a blokkot javasló valóban végrehajtotta a számításokat úgy, ahogy mondja). A jelenlegi Ethereum-kliensekben a státusz frissítéséhez hozzá kell férni a teljes státuszfához, ami egy nagyméretű adatstruktúra, és lokálisan kell azt tárolni. A tanú a státuszadatnak csak töredékeit tartalmazza, ami a blokkban lévő tranzakciók lefuttatásához szükségesek. A validátornak tehát csak ezeket a töredékeket kell használnia arra, hogy leellenőrizze, a javaslattevő végrehajtotta-e a blokk tranzakcióit és megfelelő módon frissítette-e a státuszt. Ugyanakkor ez azt is jelenti, hogy a tanút az Ethereum hálózatán olyan gyorsan kell eljuttatni a peereknek, hogy azt biztosan megkapja és feldolgozza minden egyes csomópont a 12 másodperces slotban. Ha a tanú túl nagy méretű, akkor néhány csomópont számára sokáig tart a letöltése, így nehéz lépést tartani a lánccal. Ez egy centralizáló erő, mert csak gyors internetkapcsolattal bíró csomópontok vehetnek részt a blokkvalidálásban. A Verkle-fák révén nem kell a státuszt a merevlemezen tárolni; a blokk validálásához _mindent_ maga a blokk tartalmaz. Sajnos a Merkle-fákból előállítható tanúk túl nagy méretűek ahhoz, hogy lehetővé tegyék a státusztalan klienseket. + +## Hogyan állítható elő a Verkle-fákkal kisebb méretű tanúk? {#why-do-verkle-trees-enable-smaller-witnesses} + +A Merkle-fa struktúrája nagy méretű tanúkat ad – ezeket nem lehet biztonsággal szétküldeni a peerek között a 12 másodperces slotban. Ennek az az oka, hogy a tanú egy olyan útvonal, amely összeköti az adatokat (amelyeket a levelek tartalmaznak) a gyökérhash-sel. Az adatok ellenőrzéséhez nem elég az összes köztes hash, ami összeköti a leveleket és a gyökeret, hanem szükség van testvérpontokra is. A bizonyítékban minden csomópontnak van egy testvére, amivel hashelődik, hogy létrehozza a fa következő hashét. Ez rengeteg adat. A Verkle-fák úgy csökkentik a tanú méretét, hogy megrövidítik a falevelek és a gyökér közötti távolságot, és nem kell a testvérpontokat is megadni ahhoz, hogy a gyökér-hash validálható legyen. Még ennél is több hely nyerhető azzal, hogy egy erőteljes polinomiális elköteleződési sémát használnak a hash-stílusú vektorelköteleződés helyett. A polinomiális elköteleződés lehetővé teszi, hogy a tanú adott méretű legyen, függetlenül az általa bizonyított levelek számától. + +A polinomiális elköteleződési séma alapján a tanú kezelhető méretű lesz, és könnyedén átadható a peer-to-peer hálózaton keresztül. Ez alapján a kliensek minimális adatmennyiséggel képesek minden blokkban ellenőrizni a státuszváltozást. + + + +A tanú mérete a benne lévő levelek száma alapján változik. Feltéve, hogy a tanú 1000 levelet fed le, akkor a Merkle-fához tartozó tanú 3,5 MB lenne (egy 7 szintű fa esetében). Ugyanezen adatok esetében a Verkle-fa tanúja (4 szintű fát feltételezve) 150 kB – **ez nagyjából 23-szor kisebb**. A tanú ilyen szintű méretcsökkenése megengedi, hogy a státusztalan kliensek tanúi elfogadhatóan kicsik maradjanak. A polinomiális tanúk 0,128–1 kB méretűek, attól függően, hogy amelyik polinomiális elköteleződést használják. + + + +## Mi a Verkle-fák struktúrája? {#what-is-the-structure-of-a-verkle-tree} + +A Verkle-fák `key, value` (kulcs, érték) párokból állnak, ahol a kulcsok 32 bájtos elemek, amelyek egy 31 bájtos _tőből_ és egy egyetlen bájtos _toldalékból_ tevődnek össze. Ezek a kulcsok _kiterjesztő_ pontokba és _belső_ pontokba rendeződnek. A kiterjesztőpontok egyetlen tövet képviselnek 256 gyermek számára különböző toldalékokkal. A belső pontoknak is 256 gyermekük van, de ezek lehetnek más kiterjesztőpontok is. A Verkle- és a Merkle-fastruktúra közötti fő különbség az, hogy a Verkle-fa sokkal laposabb, kevesebb köztes pont kapcsolja a levelet a gyökérhez, ezért kevesebb adat kell a bizonyíték legyártásához. + +![](./verkle.png) + +[Tudjon meg többet a Verkle-fák struktúrájáról](https://blog.ethereum.org/2021/12/02/verkle-tree-structure) + +## Jelenlegi helyzet {#current-progress} + +A Verkle-fa teszthálózatai már működnek, de jelentős mértékű kliensfrissítésre van még szükség ahhoz, hogy támogatni tudják ezt az adatstruktúrát. Ön is segíthet a fejlesztés meggyorsításában, ha szerződéseket hoz létre a teszthálózaton és klienseket működtet a teszthez. + +[Fedezze fel a Beverly Hills Verkle-teszthálózatot](https://beverlyhills.ethpandaops.io) + +[Tekintse meg, ahogy Guillaume Ballet bemutatja a Condrieu Verkle-teszthálózatot](https://www.youtube.com/watch?v=cPLHFBeC0Vg) (a Condrieu teszthálózat még a proof-of-work mechanizmus szerint működött, és mára már a [Kaustinen teszthálózat](https://kaustinen.ethdevops.io) váltotta fel). + +## További olvasnivaló {#further-reading} + +- [Dankrad Feist magyarázata a Verkle-fákról a PEEPanEIP csatornán](https://www.youtube.com/watch?v=RGJOQHzg3UQ) +- [Guillaume Ballet magyarázata a Verkle-fákról az ETHGlobal rendezvényen](https://www.youtube.com/watch?v=f7bEtX3Z57o) +- [„Hogyan segítenek a Verkle-fák abban, hogy az Ethereum áttekinthető és egyszerű legyen?” – Guillaume Ballet előadása a Devcon 6 rendezvényen](https://www.youtube.com/watch?v=Q7rStTKwuYs) +- [Piper Merriam előadása a státusztalan kliensekről az ETHDenver 2020-as rendezvényén](https://www.youtube.com/watch?v=0yiZJNciIJ4) +- [Dankrad Fiest Verkle-fákról és státuszmentességről szóló podcastje a Zero Knowledge csatornán](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Vitalik Buterin magyarázata a Verkle-fákról](https://vitalik.eth.limo/general/2021/06/18/verkle.html) +- [Dankrad Feist magyarázata a Verkle-fákról](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) +- [A Verkle-fák EIP-dokumentációja](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/hu/security/index.md b/public/content/translations/hu/security/index.md index 5369c2ee6d6..7a83e9ac510 100644 --- a/public/content/translations/hu/security/index.md +++ b/public/content/translations/hu/security/index.md @@ -24,7 +24,7 @@ Gyenge jelszó például: AranyosBolyhosCicák! Erős jelszó például: ymv\*azu.EAC8eyp8umf ``` -A másik általános hiba az, amikor a [közösségi médiából visszafejthető]() jelszót találnak ki. Beleértve az édesanyja leánykori nevét, a gyerekek vagy háziállatok neveit, születési időpontokat használva nem lesz a jelszó biztonságos, és lehetőséget ad a támadásra. +A másik általános hiba az, amikor a [közösségi médiából visszafejthető](https://wikipedia.org/wiki/Social_engineering_(security)) jelszót találnak ki. Beleértve az édesanyja leánykori nevét, a gyerekek vagy háziállatok neveit, születési időpontokat használva nem lesz a jelszó biztonságos, és lehetőséget ad a támadásra. #### A jó jelszóhoz: {#good-password-practices} @@ -66,7 +66,7 @@ Különböző egyedi bizonyítékok bemutatásával igazolhatja, hogy Ön valób - Valami, ami Öntől származik (mint egy ujjlenyomat vagy írisz-/arcszkenner) - Valami, ami az Ön birtokában van (biztonsági kulcs vagy azonosítási alkalmazás a telefonján) -A **kéttényezős azonosítás (2FA)** egy plusz _biztonsági tényezőt_ ad az online számlákhoz, így a jelszó (amit Ön tud) önmagában nem elég annak eléréséhez. Általában a második tényező egy véletlenszerű hatjegyű kód, ami egy **időzített egyszeri jelszó (TOTP)**, amit egy azonosítási alkalmazással ér el, mint a Google Authenticator vagy Authy. Ez az a tényező, ami az Ön birtokában van, mert a kódot adó mag az Ön eszközén található. +A **kéttényezős azonosítás (2FA)** egy plusz *biztonsági tényezőt* ad az online számlákhoz, így a jelszó (amit Ön tud) önmagában nem elég annak eléréséhez. Általában a második tényező egy véletlenszerű hatjegyű kód, ami egy **időzített egyszeri jelszó (TOTP)**, amit egy azonosítási alkalmazással ér el, mint a Google Authenticator vagy Authy. Ez az a tényező, ami az Ön birtokában van, mert a kódot adó mag az Ön eszközén található.
    @@ -270,15 +270,14 @@ A tokenkiosztási (airdrop) csalások során egy hamis projekt eszközt (NFT, to ### Webbiztonság {#reading-web-security} -- [Ezért ne SMS-t használjon a kéttényezős azonosításhoz](https://www.theverge.com/2017/9/18/16328172/sms-two-factor-authentication-hack-password-bitcoin) – _The Verge_ - [3 millió eszközt érintenek a rosszindulatú Chrome- és Edge-bővítmények](https://arstechnica.com/information-technology/2020/12/up-to-3-million-devices-infected-by-malware-laced-chrome-and-edge-add-ons/) – _Dan Goodin_ -- [Hogyan hozzon létre erős jelszót — amit nem felejt el](https://www.avg.com/en/signal/how-to-create-a-strong-password-that-you-wont-forget) – _AVG_ +- [Hogyan hozzon létre erős jelszót – amit nem felejt el](https://www.avg.com/en/signal/how-to-create-a-strong-password-that-you-wont-forget) – _AVG_ - [Mi az a biztonsági kulcs?](https://help.coinbase.com/en/coinbase/getting-started/verify-my-account/security-keys-faq) – _Coinbase_ ### Kriptobiztonság {#reading-crypto-security} - [Védje magát és a pénzeszközeit](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) – _MyCrypto_ -- [4 mód, hogy biztonságban maradjon a kripto világában](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) – _CoinDesk_ +- [Biztonsági problémák az általános kriptokommunikációs szoftverben](https://docs.salusec.io/untitled/web3-penetration-test/risks-in-social-media) – _Salus_ - [Biztonsági útmutató kezdőknek és haladóknak](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) – _MyCrypto_ - [Kriptobiztonság: jelszavak és azonosítás](https://www.youtube.com/watch?v=m8jlnZuV1i4) – _Andreas M. Antonopoulos_ diff --git a/public/content/translations/hu/staking/pools/index.md b/public/content/translations/hu/staking/pools/index.md index a0ea48f83a1..a05fd2cd989 100644 --- a/public/content/translations/hu/staking/pools/index.md +++ b/public/content/translations/hu/staking/pools/index.md @@ -26,7 +26,7 @@ A [bevezetés a letétbe helyezésbe](/staking/) során elhangzott előnyök mel - + @@ -53,14 +53,14 @@ Számos olyan opció érhető el, amely biztosan kielégíti minden igényét. A -Olyan szolgáltatást válasszon, amely komolyan veszi a [kliensek diverzitását](/developers/docs/nodes-and-clients/client-diversity/), mert ez egyszerre javítja a hálózat biztonságát, és csökkenti az Ön kockázatát. Azok a szolgáltatók, akik korlátozzák a többségi klienseket használatát, a következő jellemzők alapján szűrhetők ki: sokrétű végrehajtás és sokrétű konszenzus +Olyan szolgáltatást válasszon, amely komolyan veszi a [kliensek diverzitását](/developers/docs/nodes-and-clients/client-diversity/), mert ez egyszerre javítja a hálózat biztonságát, és csökkenti az Ön kockázatát. Azok a szolgáltatók, akik korlátozzák a többségi klienseket használatát, a következő jellemzők alapján szűrhetők ki: végrehajtási kliens sokrétűsége és konszenzusos kliens sokrétűgése Hiányolja valamelyik letétbe helyezési eszközt? Ha a [terméklistázó szabályzat](/contributing/adding-staking-products/) alapján úgy véli, hogy egy adott eszköz illeszkedne ide, akkor jelezze felénk. ## Gyakran ismételt kérdések {#faq} -A letétbe helyezők ERC-20 letéti tokeneket kapnak, melyek a letétbe adott ETH-t képviselik, megnövelve azt a jutalmakkal. A különféle alapok a letéti jutalmakat különböző módon adják át a felhasználóknak, a folyamat lényege ugyanakkor közös. +A letétbe helyezők ERC-20 letéti tokeneket kapnak, és ezeket a letétbe adott ETH-t képviselik, megnövelve azt a jutalmakkal. A különféle alapok a letéti jutalmakat különböző módon adják át a felhasználóknak, a folyamat lényege ugyanakkor közös. @@ -81,5 +81,6 @@ Néhány letéti alap sokkal decentralizáltabb, amikor az általuk használt cs ## További olvasnivaló {#further-reading} +- [Ethereum letétbe helyezési jegyzék](https://www.staking.directory/) – _Eridian és Spacesider_ - [Letétbe helyezés a Rocket Poollal – Áttekintés](https://docs.rocketpool.net/guides/staking/overview.html) – _RocketPool docs_ - [Letétbe helyezés az Ethereumon a Lidoval](https://help.lido.fi/en/collections/2947324-staking-ethereum-with-lido) - _Lido help docs_ diff --git a/public/content/translations/hu/staking/saas/index.md b/public/content/translations/hu/staking/saas/index.md index af91ba33e30..efefc45174d 100644 --- a/public/content/translations/hu/staking/saas/index.md +++ b/public/content/translations/hu/staking/saas/index.md @@ -47,7 +47,7 @@ Néhány elérhető SaaS-szolgáltatót soroltunk fel alább. A fenti jellemzők -Olyan szolgáltatót válasszon, aki támogatja a [kisebbségi klienseket](/developers/docs/nodes-and-clients/client-diversity/), mert ez egyszerre javítja a hálózat biztonságát, és csökkenti az Ön kockázatát. Azok a szolgáltatók, akik korlátozzák a többségi klienseket használatát, a következő jellemzők alapján szűrhetők ki: sokrétű végrehajtás és sokrétű konszenzus +Olyan szolgáltatót válasszon, aki támogatja a [kisebbségi klienseket](/developers/docs/nodes-and-clients/client-diversity/), mert ez egyszerre javítja a hálózat biztonságát, és csökkenti az Ön kockázatát. Azok a szolgáltatók, akik korlátozzák a többségi klienseket használatát, a következő jellemzők alapján szűrhetők ki: végrehajtási kliens sokrétűsége és konszenzusos kliens sokrétűgése ### Kulcsgenerátorok @@ -91,4 +91,5 @@ Kérdezze meg az SaaS-szolgáltatóját a lehetséges garanciákról vagy biztos ## További olvasnivaló {#further-reading} +- [Ethereum letétbe helyezési jegyzék](https://www.staking.directory/) – _Eridian és Spacesider_ - [A letétbe helyezési szolgáltatások értékelése](https://www.attestant.io/posts/evaluating-staking-services/) – _Jim McDonald 2020._ diff --git a/public/content/translations/hu/staking/solo/index.md b/public/content/translations/hu/staking/solo/index.md index c49d6817600..d099ad0e6b6 100644 --- a/public/content/translations/hu/staking/solo/index.md +++ b/public/content/translations/hu/staking/solo/index.md @@ -109,7 +109,7 @@ Számos olyan opció érhető el, amely biztosan kielégíti minden igényét. A -Olyan szolgáltatót válasszon, aki komolyan veszi a [kliensek diverzitását](/developers/docs/nodes-and-clients/client-diversity/), mert ez egyszerre javítja a hálózat biztonságát, és csökkenti az Ön kockázatát. Azok az eszközök, melyek a kisebbségi kliens beállítást támogatják, a többklienses jellemzővel vannak jelölve +Olyan szolgáltatót válasszon, aki komolyan veszi a [kliensek diverzitását](/developers/docs/nodes-and-clients/client-diversity/), mert ez egyszerre javítja a hálózat biztonságát, és csökkenti az Ön kockázatát. Azok az eszközök, amelyek a kisebbségi kliens beállítást támogatják, a többklienses jellemzővel vannak jelölve ### Kulcsgenerátorok @@ -195,6 +195,7 @@ A teljes egyenleg visszavonásához végig kell menni a validátorkiléptetési ## További olvasnivaló {#further-reading} +- [Ethereum letétbe helyezési jegyzék](https://www.staking.directory/) – _Eridian és Spacesider_ - [Az Ethereum-kliens diverzitásának problémája](https://hackernoon.com/ethereums-client-diversity-problem) – _@emmanuelawosika 2022._ - [A kliensdiverzitás támogatása](https://www.attestant.io/posts/helping-client-diversity/) – _Jim McDonald 2022._ - [Kliensdiverzitás az Ethereum konszenzus rétegén](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) – _jmcook.eth 2022._ diff --git a/public/content/translations/hu/staking/withdrawals/index.md b/public/content/translations/hu/staking/withdrawals/index.md index 83daa5ed893..53c9d69501f 100644 --- a/public/content/translations/hu/staking/withdrawals/index.md +++ b/public/content/translations/hu/staking/withdrawals/index.md @@ -114,12 +114,12 @@ Ezt a kalkulációt kiterjesztve megbecsülhetjük, hogy egy adott számú vissz | Visszavonások száma | Időszükséglet | -| :-----------------: | :-----------: | -| 400 000 | 3,5 nap | -| 500 000 | 4,3 nap | -| 600 000 | 5,2 nap | -| 700 000 | 6,1 nap | -| 800 000 | 7,0 nap | +| :-------------------: | :--------------: | +| 400 000 | 3,5 nap | +| 500 000 | 4,3 nap | +| 600 000 | 5,2 nap | +| 700 000 | 6,1 nap | +| 800 000 | 7,0 nap | @@ -194,7 +194,7 @@ eventCategory="FAQ" eventAction="I operate a validator. Where can I find more information on enabling withdrawals?" eventName="read more"> -A validátor működtetők látogassanak el a Staking Launchpad Withdrawals oldalra, ahol a validátorok készítéséről további információkat találhatnak. Továbbá hogyan készüljenek fel, mi az események időzítése, pontosan hogyan működik a visszavonási funkció. +Javasoljuk, hogy a validátorműködtetők látogassanak el a Staking Launchpad Withdrawals oldalra, ahol további információkat találhatnak a letét kivonásához kapcsolódó felkészülésről, az események időzítéséről és arról, hogyan működik ez a kivonási funkció. Próbálja ki először a beállításait egy teszthálózaton, látogasson el a Goerli-teszthálózat Staking Launchpad oldalára. @@ -214,5 +214,5 @@ Nem. Miután egy validátor kilépett, és a teljes egyenlegét kivette, az adot - [EIP-4895: Beacon-lánc operációs műveletként intézi a visszavonásokat](https://eips.ethereum.org/EIPS/eip-4895) - [Ethereum Cat Herders – Shanghai](https://www.ethereumcatherders.com/shanghai_upgrade/index.html) - [PEEPanEIP #94: A letétbe helyezett ETH visszavonása (tesztelés) – Potuz & Hsiao-Wei Wang](https://www.youtube.com/watch?v=G8UstwmGtyE) -- [PEEPanEIP#68: EIP-4895: Beacon-lánc operációs műveletként intézi a visszavonásokat – Alex Stokes](https://www.youtube.com/watch?v=CcL9RJBljUs) +- [PEEPanEIP#68: EIP-4895: Beacon lánc operációs műveletként intézi a visszavonásokat – Alex Stokes](https://www.youtube.com/watch?v=CcL9RJBljUs) - [A validátor valós egyenlegének megértése](https://www.attestant.io/posts/understanding-validator-effective-balance/) diff --git a/public/content/translations/hu/whitepaper/index.md b/public/content/translations/hu/whitepaper/index.md index 55c4c8960a0..6ff62f7f28d 100644 --- a/public/content/translations/hu/whitepaper/index.md +++ b/public/content/translations/hu/whitepaper/index.md @@ -23,7 +23,7 @@ A decentralizált digitális valuta, valamint az alternatív alkalmazások, pél A proof-of-work mögötti mechanizmus egy áttörés volt, mivel egyszerre két problémára is megoldást nyújtott. Egyrészt egy olyan egyszerű és mérsékelten hatékony konszenzus algoritmust biztosított, amely lehetővé teszi a hálózat csomópontjainak, vagyis a résztvevő számítógépeknek (node-ok), hogy kollektíven egyetértsenek a Bitcoin főkönyvi állapotának kanonikus frissítéseiről. Másrészt egy olyan mechanizmust biztosított, amely szabad belépést tesz lehetővé abba a konszenzus folyamatba, mely megoldja annak a politikai problémának az eldöntését, hogy ki befolyásolja a konszenzust, emellett a Sybil-támadásokat is megelőzi. Ezt úgy teszi meg, hogy a részvétel formális akadályát - mint például egy adott listán egyedi entitásként való nyilvántartásba vétel követelményét - gazdasági akadályokkal helyettesíti: egy résztvevő csomópont súlya a konszenzusos szavazási folyamatban közvetlenül arányos azzal a számítási erővel, amivel a csomópont rendelkezik. Azóta javaslattétel született egy alternatív megközelítésre, amit _letétbizonyítéknak_ hívnak, mivel a hálózaton résztvevő számítógép, vagy csomópont (node) súlyozását a valuta letétbe helyezésének arányában számítja ki, nem pedig annak számítási kapacitása alapján; a két megközelítés relatív előnyeinek megvitatása meghaladja ennek a cikknek a kereteit, de meg kell jegyezni, hogy mindkét megközelítés felhasználható egy kriptovaluta alapjaként. -Itt egy blog bejegyzés Vitalik Buterintől, az Ethereum alapítójától az [Ethereum előtörténetéről](https://vitalik.ca/general/2017/09/14/prehistory.html). [Itt](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) egy másik blog bejegyzés további történetekkel. +Itt egy blog bejegyzés Vitalik Buterintől, az Ethereum alapítójától az [Ethereum előtörténetéről](https://vitalik.eth.limo/general/2017/09/14/prehistory.html). [Itt](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) egy másik blog bejegyzés további történetekkel. ### Bitcoin, mint egy állapot átmeneti rendszer {#bitcoin-as-a-state-transition-system} diff --git a/public/content/translations/hu/zero-knowledge-proofs/index.md b/public/content/translations/hu/zero-knowledge-proofs/index.md index 39379117775..dead07c9fe6 100644 --- a/public/content/translations/hu/zero-knowledge-proofs/index.md +++ b/public/content/translations/hu/zero-knowledge-proofs/index.md @@ -176,7 +176,7 @@ A MACI használatához ugyanakkor _muszáj_ megbízni a koordinátorban, hogy ne Ha a koordinátor jóhiszeműen jár el, akkor a MACI egy kiváló eszköz arra, hogy garantálja a láncon belüli szavazás szentesítését. Ez megmagyarázza a népszerűségét a kvadratikus finanszírozási alkalmazásokban (mint amilyen a [clr.fund](https://clr.fund/#/about/maci)), ami nagy mértékben függ az egyének szavazásának integritásától. -[Bővebben a MACI-ról](https://github.com/privacy-scaling-explorations/maci/blob/master/specs/01_introduction.md). +[Bővebben a MACI-ról](https://privacy-scaling-explorations.github.io/maci/). ## A zero-knowledge bizonyítékok hátulütői {#drawbacks-of-using-zero-knowledge-proofs} @@ -208,5 +208,5 @@ A ZK-STARK immunis a kvantumszámítógépek fenyegetésére, mert ütközésál - [Zero-Knowledge bizonyíték: az adatbiztonság javítása a blokkláncon](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARK-ok — Egy valós zero-knowledge példa és mélyebb elemzése](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARK-ok — Igazolható bizalom létrehozása, még a kvantumszámítógépekkel szemben is](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [Egy hozzávetőleges áttekintés, hogyan lehetségesek a zk-SNARK-ok](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [Egy hozzávetőleges áttekintés, hogyan lehetségesek a zk-SNARK-ok](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [Mi az a zero-knowledge bizonyíték és mi a szerepe a blokkláncon?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/id/dao/index.md b/public/content/translations/id/dao/index.md index e8f6b038655..ced3cb3a823 100644 --- a/public/content/translations/id/dao/index.md +++ b/public/content/translations/id/dao/index.md @@ -156,7 +156,7 @@ _Umumnya digunakan untuk pengembangan dan pengelolaan protokol yang terdesentral - [Cara Memulai Komunitas Digital yang Didukung oleh DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Apa itu DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Apa itu Konsensus Holografik?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO bukanlah perusahaan: desentralisasi adalah masalah organisasi terotomasi oleh Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO bukanlah perusahaan: desentralisasi adalah masalah organisasi terotomasi oleh Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA dan lainnya: Panduan Terminologi Lengkap](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) ### Video {#videos} diff --git a/public/content/translations/id/decentralized-identity/index.md b/public/content/translations/id/decentralized-identity/index.md index b065a15d453..f74fbd257db 100644 --- a/public/content/translations/id/decentralized-identity/index.md +++ b/public/content/translations/id/decentralized-identity/index.md @@ -109,7 +109,7 @@ Berikut contoh bagaimana cara kerja pengesahan di dalam rantai praktiknya: ### Token dan identitas soulbond {#soulbound} -[Token soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) (NFT yang tidak dapat ditransfer) dapat digunakan untuk mengumpulkan informasi khas untuk dompet tertentu. Hal ini menciptakan identitas di dalam rantai unik secara efektif yang terikat pada alamat Ethereum khusus yang dapat menyertakan token yang mewakili pencapaian (seperti menyelesaikan beberapa kursus daring tertentu atau melewati skor ambang batas dalam permainan) atau partisipasi komunitas. +[Token soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (NFT yang tidak dapat ditransfer) dapat digunakan untuk mengumpulkan informasi khas untuk dompet tertentu. Hal ini menciptakan identitas di dalam rantai unik secara efektif yang terikat pada alamat Ethereum khusus yang dapat menyertakan token yang mewakili pencapaian (seperti menyelesaikan beberapa kursus daring tertentu atau melewati skor ambang batas dalam permainan) atau partisipasi komunitas. ## Manfaat dari identitas yang terdesentralisasi {#benefits-of-decentralized-identity} diff --git a/public/content/translations/id/desci/index.md b/public/content/translations/id/desci/index.md index 1f3eb002ca1..6cf927d6e1a 100644 --- a/public/content/translations/id/desci/index.md +++ b/public/content/translations/id/desci/index.md @@ -76,7 +76,7 @@ Hak Kekayaan Intelektual (HKI) merupakan masalah besar dalam ilmu pengetahuan ko Seperti halnya NFT dapat mengalirkan pendapatan dari transaksi masa depan kembali ke pembuat asli, Anda dapat membentuk rantai atribusi nilai yang transparan untuk memberikan imbalan kepada para peneliti, badan pengatur (seperti DAO), atau bahkan subjek yang datanya dikumpulkan. -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) juga dapat berfungsi sebagai kunci untuk repositori data terdesentralisasi dari eksperimen penelitian yang sedang dilakukan, dan dapat terintegrasi dengan keuangan NFT dan [DeFi](/defi/) (dari fraksionasi hingga pool pemberian pinjaman dan penilaian nilai). Ini juga memungkinkan entitas yang ada di dalam rantai seperti DAO seperti [VitaDAO](https://www.vitadao.com/) untuk melakukan penelitian secara langsung di rantai dalam rantai. Kemunculan [token "soulbound"](https://vitalik.ca/general/2022/01/26/soulbound.html) yang tidak dapat ditransfer juga dapat berperan penting dalam DeSci dengan memungkinkan individu membuktikan pengalaman dan kredensial mereka yang terhubung dengan alamat Ethereum mereka. +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) juga dapat berfungsi sebagai kunci untuk repositori data terdesentralisasi dari eksperimen penelitian yang sedang dilakukan, dan dapat terintegrasi dengan keuangan NFT dan [DeFi](/defi/) (dari fraksionasi hingga pool pemberian pinjaman dan penilaian nilai). Ini juga memungkinkan entitas yang ada di dalam rantai seperti DAO seperti [VitaDAO](https://www.vitadao.com/) untuk melakukan penelitian secara langsung di rantai dalam rantai. Kemunculan [token "soulbound"](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) yang tidak dapat ditransfer juga dapat berperan penting dalam DeSci dengan memungkinkan individu membuktikan pengalaman dan kredensial mereka yang terhubung dengan alamat Ethereum mereka. ### Penyimpanan data, akses, dan arsitektur {#data-storage} diff --git a/public/content/translations/id/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/id/developers/docs/consensus-mechanisms/pos/index.md index cf638a2abc8..09480249516 100644 --- a/public/content/translations/id/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/id/developers/docs/consensus-mechanisms/pos/index.md @@ -84,11 +84,11 @@ Pemotongan penaruhan, pengusiran, dan hukuman lainnya, yang dikoordinasikan oleh ## Bacaan lebih lanjut {#further-reading} -- [Tanya Jawab tentang Bukti Taruhan](https://vitalik.ca/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Tanya Jawab tentang Bukti Taruhan](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [Apa itu Bukti Taruhan](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ - [Apa itu Bukti Taruhan dan Mengapa Ia Penting](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ - [Penjelasan Rantai Suar Ethereum 2.0 yang perlu Anda baca terlebih dahulu](https://ethos.dev/beacon-chain/) _Ethos.dev_ -- [Mengapa Bukti Taruhan (Nov 2020)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Mengapa Bukti Taruhan (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [Bukti Taruhan: Cara Saya Belajar Mencintai Subjektivitas Lemah](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [Filosofi Rancangan Bukti Taruhan](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/id/developers/docs/scaling/index.md b/public/content/translations/id/developers/docs/scaling/index.md index 61ee550bdd6..7cef773e661 100644 --- a/public/content/translations/id/developers/docs/scaling/index.md +++ b/public/content/translations/id/developers/docs/scaling/index.md @@ -85,7 +85,7 @@ _Perhatikan penjelasan dalam video ini menggunakan istilah "Lapisan 2" untuk mer - [Roadmap Ethereum rollup-centric](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [Analitik terbaru tentang solusi penskalaan Lapisan 2 untuk Ethereum](https://www.l2beat.com/) - [Mengevaluasi Solusi Penskalaan lapisan 2 Ethereum: Kerangka Kerja Perbandingan](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Panduan Tidak Lengkap tentang Rollup](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Panduan Tidak Lengkap tentang Rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollup ZK yang digerakkan Ethereum: Yang Terbaik di Kelasnya](https://hackmd.io/@canti/rkUT0BD8K) _Tahu tentang sumber daya komunitas yang membantu Anda? Edit halaman ini dan tambahkan!_ diff --git a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md index 94aa4c26a03..58aa7f8f71c 100644 --- a/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/id/developers/docs/scaling/layer-2-rollups/index.md @@ -129,7 +129,7 @@ Solusi hibrida ada dengan menggabungkan bagian terbaik dari berbagai teknologi l ## Bacaan lebih lanjut {#further-reading} -- [Panduan Tidak Lengkap tentang Rollup](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Panduan Tidak Lengkap tentang Rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollup Optimistic vs Rollup ZK](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [Skalabilitas Blockchain Zero-Knowledge](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Alasan rollup + shard data merupakan satu-satunya solusi berkelanjutan untuk penskalaan tinggi](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) diff --git a/public/content/translations/id/energy-consumption/index.md b/public/content/translations/id/energy-consumption/index.md index 7e180e77650..1bf3ad914f7 100644 --- a/public/content/translations/id/energy-consumption/index.md +++ b/public/content/translations/id/energy-consumption/index.md @@ -24,7 +24,7 @@ Bukti kerja adalah cara yang kuat untuk mengamankan jaringan dan menegakkan peru Masa depan yang lebih ramah lingkungan untuk Ethereum sedang dibangun dalam [bentuk rantai **bukti taruhan (PoS)**](/roadmap/beacon-chain/). Di bawah [bukti taruhan](/developers/docs/consensus-mechanisms/pos/), penyelesaian teka-teki arbitrari tidak diperlukan. Menghilangkan penyelesaian teka-teki secara drastis mengurangi pemakaian energi yang diperlukan untuk mengamankan jaringan. Para penambang digantikan oleh para validator yang melakukan fungsi yang sama, kecuali alih-alih membayarkan aset mereka di muka dalam bentuk daya komputasional, mereka menaruhkan ETH sebagai jaminan terhadap perilaku curang. Jika validator malas (luring ketika mereka seharusnya memenuhi beberapa tugas validator) ETH mereka yang ditaruhkan dapat secara perlahan berkurang, sedangkan perilaku curang yang dapat dibuktikan menyebabkan aset yang ditaruhkan "dipotong". Ini sangat mendorong partisipasi aktif dan jujur dalam mengamankan jaringan. -Sama dengan bukti kerja, entitas yang jahat akan mengharuskan setidaknya 51% total ETH yang ditaruhkan dalam jaringan untuk mengeksekusi [serangan 51%](/glossary/#51-attack). Namun, tidak seperti pada bukti kerja, di mana kerugian potensial dari serangan yang gagal hanya merupakan biaya pembuatan daya hash yang diperlukan untuk menambang, pada bukti taruhan, kerugian yang mungkin dari suatu serangan adalah seluruh jumlah ETH yang digunakan sebagai jaminan. Struktur yang tidak mendukung ini memungkinkan keamanan jaringan dengan bukti taruhan, sekaligus menghapus kebutuhan untuk memakai energi pada komputasi arbitrari. Penjelasan lengkap dari keamanan jaringan di bawah bukti taruhan dapat ditemukan [di sini](/developers/docs/consensus-mechanisms/pos/) dan [di sini](https://vitalik.ca/general/2017/12/31/pos_faq.html). +Sama dengan bukti kerja, entitas yang jahat akan mengharuskan setidaknya 51% total ETH yang ditaruhkan dalam jaringan untuk mengeksekusi [serangan 51%](/glossary/#51-attack). Namun, tidak seperti pada bukti kerja, di mana kerugian potensial dari serangan yang gagal hanya merupakan biaya pembuatan daya hash yang diperlukan untuk menambang, pada bukti taruhan, kerugian yang mungkin dari suatu serangan adalah seluruh jumlah ETH yang digunakan sebagai jaminan. Struktur yang tidak mendukung ini memungkinkan keamanan jaringan dengan bukti taruhan, sekaligus menghapus kebutuhan untuk memakai energi pada komputasi arbitrari. Penjelasan lengkap dari keamanan jaringan di bawah bukti taruhan dapat ditemukan [di sini](/developers/docs/consensus-mechanisms/pos/) dan [di sini](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html). ## Penggabungan {#the-merge} diff --git a/public/content/translations/id/governance/index.md b/public/content/translations/id/governance/index.md index 22d1bbbb8f6..9cfa8bf30de 100644 --- a/public/content/translations/id/governance/index.md +++ b/public/content/translations/id/governance/index.md @@ -174,9 +174,9 @@ Ketika Rantai Suar bergabung dengan lapisan eksekusi Ethereum, proses tata kelol Tata kelola di Ethereum tidaklah didefinisikan dengan kaku. Berbagai peserta komunitas memiliki sudut pandang berbeda mengenai ini. Berikut adalah beberapa di antaranya: -- [Catatan tentang Tata Kelola Blockchain](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Catatan tentang Tata Kelola Blockchain](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Bagaimana cara kerja Tata Kelola Ethereum?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [Bagaimana cara kerja tata kelola Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Apa yang dimaksud dengan pengembang inti Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [Tata Kelola, Bagian 2: Plutokrasi Masih Buruk](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [Bergerak melampaui tata kelola pengambilan suara koin](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [Tata Kelola, Bagian 2: Plutokrasi Masih Buruk](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [Bergerak melampaui tata kelola pengambilan suara koin](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/id/roadmap/account-abstraction/index.md b/public/content/translations/id/roadmap/account-abstraction/index.md index b22d5808ddb..ed7b347040b 100644 --- a/public/content/translations/id/roadmap/account-abstraction/index.md +++ b/public/content/translations/id/roadmap/account-abstraction/index.md @@ -117,7 +117,7 @@ Dompet kontrak pintar sudah tersedia, tetapi lebih banyak peningkatan diperlukan - ["Mengapa abstraksi akun adalah pengubah permainan untuk dapps" dari Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) - ["Abstraksi akun ELI5" dari Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Catatan "Jalan Menuju Abstraksi Akun" dari Vitalik](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Postingan blog Vitalik tentang dompet pemulihan sosial](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Postingan blog Vitalik tentang dompet pemulihan sosial](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [Catatan EIP-2938](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [Dokumentasi EIP-2938](https://eips.ethereum.org/EIPS/eip-2938) - [Catatan EIP-4337](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/id/roadmap/verkle-trees/index.md b/public/content/translations/id/roadmap/verkle-trees/index.md index dab00bc5e9e..ec5ea3da828 100644 --- a/public/content/translations/id/roadmap/verkle-trees/index.md +++ b/public/content/translations/id/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ Jaringan percobaan pohon Verkle sudah aktif dan berjalan, tetapi masih ada pemba - ["Cara pohon Verkle menjadikan Ethereum ramping dan efektif" oleh Guillaume Ballet di Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam tentang klien tanpa keadaan dari ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Dankrad Fiest menjelaskan pohon Verkle dan kondisi tanpa keadaan di podcast Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Vitalik Buterin tentang pohon Verkle](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Vitalik Buterin tentang pohon Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist tentang pohon Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Dokumentasi EIP pohon Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/ig/dao/index.md b/public/content/translations/ig/dao/index.md index c8c0b5f5ecb..e3f53cc2026 100644 --- a/public/content/translations/ig/dao/index.md +++ b/public/content/translations/ig/dao/index.md @@ -155,7 +155,7 @@ _A na-eji ya eme ihe maka mmepe enweghị isi na ọchịchị nke usoro na dapp - [Otu esi amalite Obodo Dijitalụ DAO Kwadoro](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/) - [Kedu ihe bụ DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) - [Coinmarketcap](https://coinmarketcap.com) - [Gịnị bụ Holographic Consensus?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO abụghị ụlọ ọrụ: ebe ntọhapụ na ụlọ ọrụ kwụụrụ onwe ya metụtara Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO abụghị ụlọ ọrụ: ebe ntọhapụ na ụlọ ọrụ kwụụrụ onwe ya metụtara Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAOs, DACs, DAs na Ndị Ọzọ: Ntuziaka Okwu Na-ezughị ezu](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blọọgụ Ethereum](https://blog.ethereum.org) ### Videos {#videos} diff --git a/public/content/translations/it/community/research/index.md b/public/content/translations/it/community/research/index.md index 261318cf6a6..181e0576898 100644 --- a/public/content/translations/it/community/research/index.md +++ b/public/content/translations/it/community/research/index.md @@ -71,7 +71,7 @@ Il livello di esecuzione si occupa dell'esecuzione delle transazioni, dell'esecu - [Percorsi verso la scadenza dello stato](https://hackmd.io/@vbuterin/state_expiry_paths) - [Proposta riguardo Verkle e alla scadenza dello stato](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) - [Gestione della cronologia](https://eips.ethereum.org/EIPS/eip-4444) -- [Alberi di Verkle](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Alberi di Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Campionamento della disponibilità dei dati](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## Sviluppo del client {#client-development} diff --git a/public/content/translations/it/dao/index.md b/public/content/translations/it/dao/index.md index 47f38166d76..d2c51c72f1c 100644 --- a/public/content/translations/it/dao/index.md +++ b/public/content/translations/it/dao/index.md @@ -156,7 +156,7 @@ _Tipicamente usati per lo sviluppo e la governance decentralizzati di protocolli - [Come avviare una comunità digitale basata su DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Che cos'è una DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Cos'è il consenso olografico?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [Le DAO non sono società: dove è importante la decentralizzazione nelle organizzazioni autonome, di Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [Le DAO non sono società: dove è importante la decentralizzazione nelle organizzazioni autonome, di Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA e altro: una guida incompleta alla terminologia](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog di Ethereum](https://blog.ethereum.org) ### Video {#videos} diff --git a/public/content/translations/it/decentralized-identity/index.md b/public/content/translations/it/decentralized-identity/index.md index 58111218ac8..b4465c87025 100644 --- a/public/content/translations/it/decentralized-identity/index.md +++ b/public/content/translations/it/decentralized-identity/index.md @@ -109,7 +109,7 @@ Ecco un esempio per dimostrare il funzionamento in pratica delle attestazioni su ### Token vincolati e identità {#soulbound} -I [token vincolati](https://vitalik.ca/general/2022/01/26/soulbound.html) (NFT non trasferibili), potrebbero essere utilizzati per raccogliere informazioni univoche, relative a un portafoglio specifico. Ciò, effettivamente, crea un'identità univoca sulla catena, vincolata a un indirizzo di Ethereum in particolare, che potrebbe includere i token rappresentanti obiettivi (ad esempio, concludere un certo corso online o superare una soglia di punteggio in un gioco), o la partecipazione della community. +I [token vincolati](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (NFT non trasferibili), potrebbero essere utilizzati per raccogliere informazioni univoche, relative a un portafoglio specifico. Ciò, effettivamente, crea un'identità univoca sulla catena, vincolata a un indirizzo di Ethereum in particolare, che potrebbe includere i token rappresentanti obiettivi (ad esempio, concludere un certo corso online o superare una soglia di punteggio in un gioco), o la partecipazione della community. ## Benefici dell'identità decentralizzata {#benefits-of-decentralized-identity} diff --git a/public/content/translations/it/desci/index.md b/public/content/translations/it/desci/index.md index d0f15d3e6c2..092c70193c9 100644 --- a/public/content/translations/it/desci/index.md +++ b/public/content/translations/it/desci/index.md @@ -76,7 +76,7 @@ La proprietà intellettuale (IP), rappresenta un grosso problema per la scienza Allo stesso modo in cui i NFT possono approvare entrate per le transazioni future al creatore originale, puoi stabilire catene di attribuzione del valore trasparenti, per ricompensare i ricercatori, i corpi governativi (come le DAO), o persino i soggetti di cui sono stati raccolti i dati. -Inoltre, i [IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6), possono funzionare come chiavi a una repository di dati decentralizzati degli esperimenti di ricerca svolti, nonché collegarsi ai NFT e alla finanziarizzazione della [DeFi](/defi/) (dalla frazionalizzazione ai gruppi di erogazione di prestiti, fino alla perizia del valore). Inoltre, consente nativamente alle entità sulla catena, come le DAO (ad esempio, [VitaDAO](https://www.vitadao.com/)), di condurre le ricerche direttamente sulla catena. L'avvento dei [token "vincolati"](https://vitalik.ca/general/2022/01/26/soulbound.html) e non trasferibili, potrebbe ricoprire un importante ruolo anche nella DeSci, consentendo agli individui di dimostrare la propria esperienza e le proprie credenziali, collegate al proprio indirizzo di Ethereum. +Inoltre, i [IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6), possono funzionare come chiavi a una repository di dati decentralizzati degli esperimenti di ricerca svolti, nonché collegarsi ai NFT e alla finanziarizzazione della [DeFi](/defi/) (dalla frazionalizzazione ai gruppi di erogazione di prestiti, fino alla perizia del valore). Inoltre, consente nativamente alle entità sulla catena, come le DAO (ad esempio, [VitaDAO](https://www.vitadao.com/)), di condurre le ricerche direttamente sulla catena. L'avvento dei [token "vincolati"](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) e non trasferibili, potrebbe ricoprire un importante ruolo anche nella DeSci, consentendo agli individui di dimostrare la propria esperienza e le proprie credenziali, collegate al proprio indirizzo di Ethereum. ### Archiviazione, accesso e architettura dei dati {#data-storage} diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md index 1017c67a559..e6763b0c28a 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -18,7 +18,7 @@ Il proof-of-stake richiede che i nodi, noti come validatori, inviino esplicitame Il proof-of-work consuma molta più energia perché il processo di mining consumata elettricità. Il proof-of-stake, d'altra parte, richiede soltanto una piccola quantità di energia: i validatori di Ethereum possono essere eseguiti persino su un dispositivo a bassa potenza, come un Raspberry Pi. Il meccanismo di proof-of-stake di Ethereum è concepito per essere più sicuro del proof-of-work, perché il costo dell'attacco è maggiore e le conseguenze sono più severe. -Il confronto proof-of-work vs. proof-of-stake è un argomento controverso. [Il blog di Vitalik Buterin](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) e il dibattito tra Justin Drake e Lyn Alden hanno dato una buona sintesi delle argomentazioni. +Il confronto proof-of-work vs. proof-of-stake è un argomento controverso. [Il blog di Vitalik Buterin](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) e il dibattito tra Justin Drake e Lyn Alden hanno dato una buona sintesi delle argomentazioni. @@ -89,7 +89,7 @@ La frantumazione dello stake è una categoria di attacco alle reti di proof-of-s Il taglio sociale è l'abilità della community di coordinare una diramazione blockchain in risposta a un attacco. Consente alla community di riprendersi da un utente malevolo che finalizza una catena disonesta. Il taglio sociale è anche utilizzabile contro gli attacchi di censura. - [Maggiori informazioni sul taglio sociale](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin sul taglio sociale](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Vitalik Buterin sul taglio sociale](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## Riceverò un taglio? {#will-i-get-slashed} @@ -101,7 +101,7 @@ Come validatore, è molto difficile essere tagliato a meno che non si adottino d Il problema del "nulla in staking" è un problema concettuale con alcuni meccanismi di proof-of-stake in cui esistono solo ricompense e nessuna sanzione. Se non c'è nulla in staking, un validatore pragmatico è altrettanto felice di attestare qualsiasi, o persino più, diramazioni della blockchain, perché questo aumenta le sue ricompense. Ethereum aggira tale problema utilizzando le condizioni di finalità e il taglio per assicurare una catena canonica. -[Maggiori informazioni sul problema di "nulla in staking"](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[Maggiori informazioni sul problema di "nulla in staking"](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) ## Cos'è un algoritmo di scelta della diramazione? {#what-is-a-fork-choice-algorithm} diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md index c0cfa8a2ca7..3130d86f953 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/index.md @@ -79,10 +79,10 @@ Ethereum non è sempre stata una rete di proof-of-stake. All'inizio Ethereum uti ## Letture consigliate {#further-reading} -- [FAQ Proof of Stake](https://vitalik.ca/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [FAQ Proof of Stake](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [Cos'è il Proof of Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ - [Cos'è il Proof of Stake e perché è importante](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [Perché il Proof of Stake (Nov 2020)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Perché il Proof of Stake (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [Proof of Stake: come ho imparato ad amare la soggettività debole](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [Attacco e difesa del proof-of-stake di Ethereum](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [Una filosofia di progettazione di Proof of Stake](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index 69f131ca730..a493391c5eb 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -65,5 +65,5 @@ Guarda Justin Drake spiegare i benefici del proof-of-stake rispetto al proof-of- ## Letture consigliate {#further-reading} - [Filosofia di design del proof-of-stake di Vitalik](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [FAQ sul proof-of-stake di Vitalik](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [FAQ sul proof-of-stake di Vitalik](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) - [Video di "Spiegazione semplice" su PoS e PoW a confronto](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/it/developers/docs/nodes-and-clients/index.md b/public/content/translations/it/developers/docs/nodes-and-clients/index.md index 1c327eb369c..ff20633a278 100644 --- a/public/content/translations/it/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/it/developers/docs/nodes-and-clients/index.md @@ -20,7 +20,7 @@ Un "nodo" è qualsiasi istanza del software del client di Ethereum connessa ad a - Il client di esecuzione (noto anche come il Motore di Esecuzione, client EL o, precedentemente, client di Eth1) attende le nuove transazioni trasmesse nella rete, le esegue nell'EVM e detiene l'ultimo stato e database di tutti i dati correnti di Ethereum. - Il client di consenso (noto anche come il Nodo Beacon, client CL o, precedentemente, client di Eth2) implementa l'algoritmo di consenso di proof-of-stake, che consente alla rete di raggiungere l'accordo secondo i dati validati dal client di esecuzione. C'è inoltre un terzo pezzo di software, chiamato "validatore" che può essere aggiunto al client di consenso, permettendo al nodo di partecipare alla messa in sicurezza della rete. -I client lavorano assieme per tenere traccia della testa della blockchain Ethereum e permettere agli utenti di interagire con la rete Ethereum. Il design modulare con molteplici pezzi di software che lavorano assieme è chiamato [complessità incapsulata](https://vitalik.ca/general/2022/02/28/complexity.html). Questo approccio ha semplificato l'esecuzione de [La Fusione](/roadmap/merge) senza problemi, permette di mantenere e sviluppare più facilmente il software client, e consente il riutilizzo di client individuali ad esempio nell'[ecosistema di livello 2](/layer-2/). +I client lavorano assieme per tenere traccia della testa della blockchain Ethereum e permettere agli utenti di interagire con la rete Ethereum. Il design modulare con molteplici pezzi di software che lavorano assieme è chiamato [complessità incapsulata](https://vitalik.eth.limo/general/2022/02/28/complexity.html). Questo approccio ha semplificato l'esecuzione de [La Fusione](/roadmap/merge) senza problemi, permette di mantenere e sviluppare più facilmente il software client, e consente il riutilizzo di client individuali ad esempio nell'[ecosistema di livello 2](/layer-2/). ![Client di esecuzione e consenso accoppiati](./eth1eth2client.png) Diagramma semplificato di un client di esecuzione e uno di consenso accoppiati. diff --git a/public/content/translations/it/developers/docs/scaling/index.md b/public/content/translations/it/developers/docs/scaling/index.md index fc52aa73e61..40b0d988bd7 100644 --- a/public/content/translations/it/developers/docs/scaling/index.md +++ b/public/content/translations/it/developers/docs/scaling/index.md @@ -103,11 +103,11 @@ _Si noti che la spiegazione nel video usa il termine "Livello 2" per fare riferi - [A rollup-centric Ethereum roadmap](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [Statistiche aggiornate sulle soluzioni di ridimensionamento del Livello 2 per Ethereum](https://www.l2beat.com/) - [Valutare le soluzioni di scalabilità del Livello 2 di Ethereum: un quadro di confronto](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Una guida incompleta ai rollup](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Una guida incompleta ai rollup](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Rollup ZK basati su Ethereum: fuoriclasse a livello mondiale](https://hackmd.io/@canti/rkUT0BD8K) - [Rollup ottimistici vs Rollup ZK](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [Scalabilità della blockchain a conoscenza zero](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Perché i rollup e i frammenti di dati sono la sola soluzione sostenibile per un'elevata scalabilità](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [Che tipo di Livelli 3 hanno senso?](https://vitalik.ca/general/2022/09/17/layer_3.html) +- [Che tipo di Livelli 3 hanno senso?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) _Conosci una risorsa pubblica che ti è stata utile? Modifica questa pagina e aggiungila!_ diff --git a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md index 78c4f4b7ae3..95e67286f97 100644 --- a/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/it/developers/docs/scaling/optimistic-rollups/index.md @@ -208,7 +208,7 @@ Come spiegato, i rollup ottimistici pubblicano i dati delle transazioni compress La catena principale di Ethereum pone limiti su quanti dati possono esser contenuti dai blocchi, denominati in unità di gas (la [dimensione media del blocco](/developers/docs/blocks/#block-size) è di 15 milioni di gas). Mentre ciò limita quanto gas è utilizzabile da ogni transazione, significa anche che possiamo aumentare le transazioni elaborate per blocco, riducendo i dati relativi alla transazione e migliorando direttamente la scalabilità. -I rollup ottimistici usano diverse tecniche per ottenere la compressione dei dati di transazione e migliorare i tassi TPS. Ad esempio, questo [articolo](https://vitalik.ca/general/2021/01/05/rollup.html) confronta i dati generati da una transazione utente di base (invio di ether) alla Rete principale, rispetto a quanti dati sono generati dalla stessa transazione su un rollup: +I rollup ottimistici usano diverse tecniche per ottenere la compressione dei dati di transazione e migliorare i tassi TPS. Ad esempio, questo [articolo](https://vitalik.eth.limo/general/2021/01/05/rollup.html) confronta i dati generati da una transazione utente di base (invio di ether) alla Rete principale, rispetto a quanti dati sono generati dalla stessa transazione su un rollup: | Parametro | Ethereum (L1) | Rollup (L2) | | ---------- | --------------------- | ------------ | diff --git a/public/content/translations/it/developers/docs/scaling/plasma/index.md b/public/content/translations/it/developers/docs/scaling/plasma/index.md index 7442ffa00cd..5af95e0455c 100644 --- a/public/content/translations/it/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/it/developers/docs/scaling/plasma/index.md @@ -171,7 +171,7 @@ Diversi progetti forniscono implementazioni di Plasma che puoi integrare nelle t - [Scopri plasma](https://www.learnplasma.org/en/) - [Un rapido promemoria su che cos'è la "sicurezza condivisa" e perché è così importante](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [Sidechains vs Plasma vs Sharding](https://vitalik.ca/general/2019/06/12/plasma_vs_sharding.html) +- [Sidechains vs Plasma vs Sharding](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) - [Comprendere Plasma, Parte 1: Fondamenti](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) - [The Life and Death of Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) diff --git a/public/content/translations/it/developers/docs/scaling/sidechains/index.md b/public/content/translations/it/developers/docs/scaling/sidechains/index.md index 5fc9ec9d7ae..235e64a2e9a 100644 --- a/public/content/translations/it/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/it/developers/docs/scaling/sidechains/index.md @@ -7,7 +7,7 @@ sidebarDepth: 3 Una sidechain è una blockchain separata eseguita in modo indipendente da Ethereum ed è connessa alla Rete principale di Ethereum da un ponte bidirezionale. Le sidechain possono avere parametri del blocco e [algoritmi di consenso](/developers/docs/consensus-mechanisms/) separati, spesso progettati per l'elaborazione efficiente delle transazioni. Usare una sidechain comporta compromessi, però, poiché non eredita le proprietà di sicurezza di Ethereum. A differenza dalle [soluzioni di ridimensionamento del livello 2](/layer-2/), le sidechain non ri-pubblicano i cambiamenti di stato e i dati della transazione nella Rete principale di Ethereum. -Inoltre, le sidechain sacrificano alcune misure di decentralizzazione o di sicurezza per ottenere un volume elevato ([trilemma di scalabilità](https://vitalik.ca/general/2021/05/23/scaling.html)). Tuttavia, Ethereum, si impegna nel ridimensionamento senza compromettere la decentralizzazione e la sicurezza come definito nella [dichiarazione della vision](/roadmap/vision/) per gli aggiornamenti. +Inoltre, le sidechain sacrificano alcune misure di decentralizzazione o di sicurezza per ottenere un volume elevato ([trilemma di scalabilità](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Tuttavia, Ethereum, si impegna nel ridimensionamento senza compromettere la decentralizzazione e la sicurezza come definito nella [dichiarazione della vision](/roadmap/vision/) per gli aggiornamenti. ## Come funzionano le sidechain? {#how-do-sidechains-work} diff --git a/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md index 671dc918d72..148bbb485aa 100644 --- a/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/it/developers/docs/scaling/zk-rollups/index.md @@ -238,7 +238,7 @@ I progetti che stanno lavorando alle zkEVM includono: - **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll è un'azienda orientata alla tecnologia che sta lavorando alla creazione di una Soluzione di Livello 2 dello zkEVM nativa per Ethereum._ -- **[Taiko](https://taiko.xyz)** - _Taiko è un rollup ZK decentralizzato ed equivalente a Ethereum (un [Tipo 1 ZK-EVM](https://vitalik.ca/general/2022/08/04/zkevm.html))._ +- **[Taiko](https://taiko.xyz)** - _Taiko è un rollup ZK decentralizzato ed equivalente a Ethereum (un [Tipo 1 ZK-EVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ - **[ZKSync](https://docs.zksync.io/zkevm/)** - _ZkSync 2.0 è un rollup ZK compatibile con l'EVM creato da Matter Labs, basato sulla propria zkEVM._ @@ -250,5 +250,5 @@ I progetti che stanno lavorando alle zkEVM includono: - [What is a zkEVM?](https://www.alchemy.com/overviews/zkevm) - [Intro to zkEVM](https://hackmd.io/@yezhang/S1_KMMbGt) - [Awesome-zkEVM resources](https://github.com/LuozhuZhang/awesome-zkevm) -- [ZK-SNARKS under the hood](https://vitalik.ca/general/2017/02/01/zk_snarks.html) -- [How are SNARKs possible?](https://vitalik.ca/general/2021/01/26/snarks.html) +- [ZK-SNARKS under the hood](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [How are SNARKs possible?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/it/governance/index.md b/public/content/translations/it/governance/index.md index aba8a35e368..0627d9b7611 100644 --- a/public/content/translations/it/governance/index.md +++ b/public/content/translations/it/governance/index.md @@ -175,9 +175,9 @@ Quando la Beacon Chain si è fusa al livello d'esecuzione di Ethereum il 15 sett La governance in Ethereum non è definita rigidamente. I vari partecipanti della comunità hanno diverse prospettive a riguardo. Eccone alcune: -- [Note sulla governance della blockchain](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Note sulla governance della blockchain](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Come funziona la governance di Ethereum?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotester_ - [Come funziona la governance di Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Cos'è uno sviluppatore core di Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [Governance, parte 2: la plutocrazia è ancora una brutta cosa](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [Andare oltre la governance con voto tramite token](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [Governance, parte 2: la plutocrazia è ancora una brutta cosa](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [Andare oltre la governance con voto tramite token](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/it/roadmap/account-abstraction/index.md b/public/content/translations/it/roadmap/account-abstraction/index.md index b411bad5b59..45a4c7b60f7 100644 --- a/public/content/translations/it/roadmap/account-abstraction/index.md +++ b/public/content/translations/it/roadmap/account-abstraction/index.md @@ -117,7 +117,7 @@ I portafogli di contratti intelligenti sono già disponibili, ma sono necessari - ["Perché l'astrazione del conto è una svolta per le dapp" da Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) - ["Astrazione del conto ELI5" da Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Note di "Strada all'Astrazione del Conto" di Vitalik](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Post del blog di Vitalik sui portafogli di recupero sociale](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Post del blog di Vitalik sui portafogli di recupero sociale](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [Note sull'EIP-2938](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [Documentazione sull'EIP-2938](https://eips.ethereum.org/EIPS/eip-2938) - [Note sull'EIP-4337](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/it/roadmap/verkle-trees/index.md b/public/content/translations/it/roadmap/verkle-trees/index.md index a62079a30b9..f947db921dd 100644 --- a/public/content/translations/it/roadmap/verkle-trees/index.md +++ b/public/content/translations/it/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ Le reti di prova dell'albero di Verkle sono già in esecuzione, ma servono ancor - ["Come gli alberi di Verkle rendono Ethereum snello e succinto" di Guillaume Ballet al Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam sui client privi di stato dall'ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Dankrad Fiest spiega gli alberi di Verkle e l'assenza di stato al podcast "Zero Knowledge"](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Vitalik Buterin sugli alberi di Verkle](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Vitalik Buterin sugli alberi di Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist sugli alberi di Verkle](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Documentazione sull'EIP degli alberi di Verkle](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/it/zero-knowledge-proofs/index.md b/public/content/translations/it/zero-knowledge-proofs/index.md index 8fa77f10092..75822492f72 100644 --- a/public/content/translations/it/zero-knowledge-proofs/index.md +++ b/public/content/translations/it/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ Le ZK-STARK sono considerate immuni alla minaccia dei computer quantistici, poic - [Una prova a conoscenza zero: migliorare la privacy su una Blockchain](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/): _Dmitry Lavrenov_ - [zk-SNARK: un esempio e approfondimento realistico sulla conoscenza zero realistica](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARK: creare fiducia verificabile, persino contro i computer quantistici](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [Un'introduzione approssimativa a come sono possibili le ZK-SNARK](https://vitalik.ca/general/2021/01/26/snarks.html).- _Vitalik Buterin_ +- [Un'introduzione approssimativa a come sono possibili le ZK-SNARK](https://vitalik.eth.limo/general/2021/01/26/snarks.html).- _Vitalik Buterin_ - [Cos'è la prova a conoscenza zero e qual è il suo ruolo nella Blockchain?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) - _LeewayHertz_ diff --git a/public/content/translations/ja/dao/index.md b/public/content/translations/ja/dao/index.md index a3f4955b5c2..b9f158fa6bc 100644 --- a/public/content/translations/ja/dao/index.md +++ b/public/content/translations/ja/dao/index.md @@ -156,7 +156,7 @@ _主にプロトコルや分散型アプリ(Dapp)の分散型開発や分散型 - [分散型自律組織(DAO)のデジタルコミュニティの作成方法](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [分散型自律組織(DAO)とは](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [ホログラフィック・コンセンサスとは](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [分散型自律組織(DAO)とは企業ではなく、分散型の自律組織 – Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [分散型自律組織(DAO)とは企業ではなく、分散型の自律組織 – Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [分散型自律組織(DAO)、分散型自律企業(DAC)、分散型アプリケーション(DA)など: 不完全な用語集](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [イーサリアムブログ](https://blog.ethereum.org) ### 動画 {#videos} diff --git a/public/content/translations/ja/decentralized-identity/index.md b/public/content/translations/ja/decentralized-identity/index.md index f9c609ff937..0ddf480960e 100644 --- a/public/content/translations/ja/decentralized-identity/index.md +++ b/public/content/translations/ja/decentralized-identity/index.md @@ -109,7 +109,7 @@ summaryPoint3: 暗号技術により、今や再び自分自身のIDとアテス ### ソウルバウンド・トークンとアイデンティティ {#soulbound} -[ソウルバウンドトークン](https://vitalik.ca/general/2022/01/26/soulbound.html)(譲渡不可の非代替性トークン)は、特定のウォレットに固有の情報の収集に使用される可能性があります。 これは、特定のイーサリアムアドレスに結びついた一意のオンチェーンアイデンティティを効果的に作成し、業績(例えば、特定のオンラインコースの修了や、ゲームで閾値のスコアの通過など)やコミュニティへの参加を表すトークンを含むことができます。 +[ソウルバウンドトークン](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)(譲渡不可の非代替性トークン)は、特定のウォレットに固有の情報の収集に使用される可能性があります。 これは、特定のイーサリアムアドレスに結びついた一意のオンチェーンアイデンティティを効果的に作成し、業績(例えば、特定のオンラインコースの修了や、ゲームで閾値のスコアの通過など)やコミュニティへの参加を表すトークンを含むことができます。 ## 分散型アイデンティティの利点 {#benefits-of-decentralized-identity} diff --git a/public/content/translations/ja/desci/index.md b/public/content/translations/ja/desci/index.md index 5f29b02263d..05622cc0ee3 100644 --- a/public/content/translations/ja/desci/index.md +++ b/public/content/translations/ja/desci/index.md @@ -76,7 +76,7 @@ DAO と Web3 によって培われた各種インセンティブモデルを広 NFT が将来の取引の収益を元の作成者に還元できるように、透明性のある価値の帰属チェーンを確立することができます。これにより、研究者や DAO のような管理団体、そしてデータの収集元となった被験者へも報酬を与えることができます。 -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6)もまた研究実験の分散データレポジトリにアクセスするための鍵として機能し、NFT や[DeFi](/defi/)の金融化(資産の分散、融資プールと価値評価) へとつながります。 また、[VitaDAO](https://www.vitadao.com/)のようなネイティブにチェーン上に存在する DAO を使用することで、研究活動を直接オンチェーンで行うことができます。 譲渡不可の[「ソウルバウンド」トークン](https://vitalik.ca/general/2022/01/26/soulbound.html)の出現により、イーサリアムアドレスにリンクされた経験や経歴を個人が証明できるようになるため、DeSci で重要な役割を果たす可能性があります。 +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6)もまた研究実験の分散データレポジトリにアクセスするための鍵として機能し、NFT や[DeFi](/defi/)の金融化(資産の分散、融資プールと価値評価) へとつながります。 また、[VitaDAO](https://www.vitadao.com/)のようなネイティブにチェーン上に存在する DAO を使用することで、研究活動を直接オンチェーンで行うことができます。 譲渡不可の[「ソウルバウンド」トークン](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)の出現により、イーサリアムアドレスにリンクされた経験や経歴を個人が証明できるようになるため、DeSci で重要な役割を果たす可能性があります。 ### データストレージ、アクセス、アーキテクチャ {#data-storage} diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md index f64bdc320d6..aae98960c82 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -18,7 +18,7 @@ lang: ja プルーフ・オブ・ワークではマイニングにおいて電力が消費されるため、よりエネルギー効率が低いと言えます。 一方、プルーフ・オブ・ステークではエネルギー消費量は非常に少なく抑えることができ、イーサリアムのバリデータは Raspberry Pi などの低電力消費のコンピュータでも作業を実行できます。 イーサリアムが採用したプルーフ・オブ・ステークのメカニズムでは、攻撃者が負担するコストがより大きく、より厳格な制裁が課されるため、プルーフ・オブ・ワークよりも安全性が高いと考えられています。 -プルーフ・オブ・ワークとプルーフ・オブ・ステークのどちらが優れているかについては、現在も論争が続いています。 これについては、[ヴィタリック・ブテリンのブログ](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work)および Justin Drake と Lyn Alden の議論においてよく論点がまとめられています。 +プルーフ・オブ・ワークとプルーフ・オブ・ステークのどちらが優れているかについては、現在も論争が続いています。 これについては、[ヴィタリック・ブテリンのブログ](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)および Justin Drake と Lyn Alden の議論においてよく論点がまとめられています。 @@ -89,7 +89,7 @@ lang: ja ソーシャルスラッシングとは、ネットワークが攻撃を受けた際に、ユーザーコミュニティがブロックチェーンのフォークを調整する能力を指します。 ユーザーコミュニティは、ソーシャルスラッシングを通じて、攻撃者がファイナライズしてしまった不正なチェーンを元に戻すことができます。 ソーシャルスラッシングはさらに、検閲攻撃に対しても活用できます。 - [ソーシャルスラッシングについての詳細](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [ソーシャルスラッシングについてのヴィタリック・ブテリンの意見](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [ソーシャルスラッシングについてのヴィタリック・ブテリンの意見](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## 私もスラッシングの対象になりますか? {#will-i-get-slashed} @@ -101,7 +101,7 @@ lang: ja ステーキング無しの問題とは、報酬のみを伴い、ペナルティが科せられない一部のプルーフ・オブ・ステークのメカニズムにおける概念上の問題です。 ステーキングが要求されない場合、実利を求めるバリデータは、報酬を増やすために、ブロックチェーンのいかなるいかなるフォークに対して、あるいは複数のフォークに対して喜んでアテステーションを行うでしょう。 イーサリアムでは、ファイナリティ条件とスラッシングのメカニズムを採用することで、唯一の正規チェーンを維持できるようにしています。 -[ステーキング無し問題についての詳細](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[ステーキング無し問題についての詳細](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) ## フォーク選択アルゴリズムとは何ですか? {#what-is-a-fork-choice-algorithm} diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md index 56575e63bda..7ee62f276a6 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/index.md @@ -79,10 +79,10 @@ lang: ja ## 参考文献 {#further-reading} -- [プルーフ・オブ・ステークに関するよくある質問](https://vitalik.ca/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [プルーフ・オブ・ステークに関するよくある質問](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [プルーフ・オブ・ステークとは](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ - [プルーフ・オブ・ステークとは何か、またその重要性](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [プルーフ・オブ・ステークの重要性(2020 年 11 月)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [プルーフ・オブ・ステークの重要性(2020 年 11 月)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [プルーフ・オブ・ステーク: 弱い主観性の利点](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [プルーフ・オブ・ステークのイーサリアム対する攻撃と防御](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [プルーフ・オブ・ステークの設計思想](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index d2e2574e8e7..6979521f687 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -65,5 +65,5 @@ Justin Drak が、プルーフ・オブ・ワークよりも優れたプルー ## 参考文献 {#further-reading} - [ヴィタリックによるプルーフ・オブ・ステークの設計哲学](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [ヴィタリックによるプルーフ・オブ・ステークの FAQ](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [ヴィタリックによるプルーフ・オブ・ステークの FAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) - [シンプルに PoS と PoW の比較を説明したビデオ](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/ja/developers/docs/nodes-and-clients/index.md b/public/content/translations/ja/developers/docs/nodes-and-clients/index.md index a9953e1964a..367ef3b41b6 100644 --- a/public/content/translations/ja/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/ja/developers/docs/nodes-and-clients/index.md @@ -28,7 +28,7 @@ sidebarDepth: 2 マージにより、イーサリアムはこれらのネットワークを接続し、プルーフ・オブ・ステークへ移行しました。 イーサリアムの状態を検証するために、実行クライアントとコンセンサスクライアントは、同時に稼働します。 -様々なソフトウェアを組み合わせたモジュラー型設計は、[カプセル化された複雑さ](https://vitalik.ca/general/2022/02/28/complexity.html)と呼ばれます。 このアプローチにより、マージをシームレスに実行でき、[レイヤー 2 エコシステム](/layer-2/)などの個々のクライアントを再利用することができました。 +様々なソフトウェアを組み合わせたモジュラー型設計は、[カプセル化された複雑さ](https://vitalik.eth.limo/general/2022/02/28/complexity.html)と呼ばれます。 このアプローチにより、マージをシームレスに実行でき、[レイヤー 2 エコシステム](/layer-2/)などの個々のクライアントを再利用することができました。 ![実行クライアントとコンセンサスクライアントの連結](./eth1eth2client.png) 実行クライアントとコンセンサスクライアントの統合の簡略図 diff --git a/public/content/translations/ja/developers/docs/scaling/index.md b/public/content/translations/ja/developers/docs/scaling/index.md index 8a86b8793af..3ed3642262a 100644 --- a/public/content/translations/ja/developers/docs/scaling/index.md +++ b/public/content/translations/ja/developers/docs/scaling/index.md @@ -105,11 +105,11 @@ _この動画の説明では、「レイヤー 2」という用語をオフチ - [ロールアップを重視したイーサリアム・ロードマップ](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _ヴィタリック・ブテリン作成。_ - [イーサリアムのレイヤー 2 スケーリング・ソリューションに関する最新のアナリティクス](https://www.l2beat.com/) - [イーサリアムの様々なレイヤー 2 のスケーリングソリューションを評価する:比較のフレームワーク](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [ロールアップに関する不完全ガイド](https://vitalik.ca/general/2021/01/05/rollup.html) +- [ロールアップに関する不完全ガイド](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [イーサリアムを活用したゼロ知識ロールアップ:ワールドビーター](https://hackmd.io/@canti/rkUT0BD8K) - [オプティミスティック・ロールアップ とゼロ知識ロールアップの比較](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [ゼロ知識によるブロックチェーンのスケーラビリティ](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [ロールアップとデータシャードを組み合わせる手段が、高スケーラビリティを実現する唯一のサステナブルなソリューションである理由](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [有意義なレイヤー 3 とはどのようなものか?](https://vitalik.ca/general/2022/09/17/layer_3.html) +- [有意義なレイヤー 3 とはどのようなものか?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) _イーサリアムを学ぶために利用したコミュニティリソースはありますか? このページを編集して追加しましょう!_ diff --git a/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md index 79da0a5be35..48f339a5ae8 100644 --- a/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/ja/developers/docs/scaling/optimistic-rollups/index.md @@ -208,7 +208,7 @@ ii. オプティミスティック・ロールアップを使用するデベロ メインのイーサリアムチェーンは、各ブロックが保持できるデータ量に制限があり、これはガス単位で表示されます([平均のブロックサイズ](/developers/docs/blocks/#block-size)は 1,500 万ガスです)。 これは、各トランザクションにおいて使用できるガスに上限があることを意味すると同時に、トランザクションデータの圧縮によりブロックごとに処理されるトランザクションの数を増やし、直接的にスケーラビリティを向上させられることを意味します。 -オプティミスティック・ロールアップでは、トランザクションデータを圧縮し、TPS レートを向上させる上で、いくつかの手法を用いています。 例えば この[記事](https://vitalik.ca/general/2021/01/05/rollup.html)では、メインネット上の基本的なユーザートランザクション (Ether の送信)で生成されるデータ量と、ロールアップ上で同一のトランザクションが生成するデータ量を比較しています: +オプティミスティック・ロールアップでは、トランザクションデータを圧縮し、TPS レートを向上させる上で、いくつかの手法を用いています。 例えば この[記事](https://vitalik.eth.limo/general/2021/01/05/rollup.html)では、メインネット上の基本的なユーザートランザクション (Ether の送信)で生成されるデータ量と、ロールアップ上で同一のトランザクションが生成するデータ量を比較しています: | パラメータ | イーサリアム (L1) | ロールアップ (L2) | | ---------- | ----------------- | ----------------- | diff --git a/public/content/translations/ja/developers/docs/scaling/plasma/index.md b/public/content/translations/ja/developers/docs/scaling/plasma/index.md index 008ff20966d..8071743b60b 100644 --- a/public/content/translations/ja/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/ja/developers/docs/scaling/plasma/index.md @@ -169,7 +169,7 @@ sidebarDepth: 3 - [プラズマについて学ぶ](https://www.learnplasma.org/en/) - [「共有セキュリティ」の意味と重要性についての簡単な復習](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [サイドチェーン、プラズマ、シャーディングの比較](https://vitalik.ca/general/2019/06/12/plasma_vs_sharding.html) +- [サイドチェーン、プラズマ、シャーディングの比較](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) - [プラズマを理解する(その 1:基本事項)](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) - [プラズマの生と死](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) diff --git a/public/content/translations/ja/developers/docs/scaling/sidechains/index.md b/public/content/translations/ja/developers/docs/scaling/sidechains/index.md index 8a9c55520b9..f251217a98f 100644 --- a/public/content/translations/ja/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/ja/developers/docs/scaling/sidechains/index.md @@ -7,7 +7,7 @@ sidebarDepth: 3 サイドチェーンとは、イーサリアムから独立して実行され、双方向のブリッジによりイーサリアムメインネットに接続されている別個のブロックチェーンです。 サイドチェーンは、メインネットとは異なるブロックのパラメータおよび[コンセンサス・アルゴリズム](/developers/docs/consensus-mechanisms/)を持つことができ、多くの場合トランザクションの効率的な処理のために設計されています。 しかし、イーサリアムのセキュリティ特性を活用できないため、トレードオフが発生します。 [レイヤー 2 のスケーリングソリューション](/layer-2/)とは異なり、サイドチェーンは状態変化やトンラザクションデータをイーサリアムメインネットに送信しません。 -サイドチェーンではさらに、高スループットを実現するために、分散性やセキュリティが低下します([スケーラビリティのトリレンマ](https://vitalik.ca/general/2021/05/23/scaling.html))。 一方イーサリアムは、アップグレードに関する[ビジョン・ステートメント](/roadmap/vision/)で述べられているように、分散性およびセキュリティを犠牲にすることなくスケーリングを実現することを目指しています。 +サイドチェーンではさらに、高スループットを実現するために、分散性やセキュリティが低下します([スケーラビリティのトリレンマ](https://vitalik.eth.limo/general/2021/05/23/scaling.html))。 一方イーサリアムは、アップグレードに関する[ビジョン・ステートメント](/roadmap/vision/)で述べられているように、分散性およびセキュリティを犠牲にすることなくスケーリングを実現することを目指しています。 ## サイドチェーンはどのように機能するのか? {#how-do-sidechains-work} diff --git a/public/content/translations/ja/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/ja/developers/docs/scaling/zk-rollups/index.md index f11d8b0f559..7a2f24d257b 100644 --- a/public/content/translations/ja/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/ja/developers/docs/scaling/zk-rollups/index.md @@ -248,5 +248,5 @@ Finematics による ZK ロールアップの説明動画をご覧ください - [zkEVM とは何か?](https://www.alchemy.com/overviews/zkevm) - [zkEVM のイントロダクション](https://hackmd.io/@yezhang/S1_KMMbGt) - [有益な zkEVM 関連リソース](https://github.com/LuozhuZhang/awesome-zkevm) -- [ZK-SNARK の仕組み](https://vitalik.ca/general/2017/02/01/zk_snarks.html) -- [SNARK はどのように実現されているのか?](https://vitalik.ca/general/2021/01/26/snarks.html) +- [ZK-SNARK の仕組み](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [SNARK はどのように実現されているのか?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/ja/governance/index.md b/public/content/translations/ja/governance/index.md index 4d1b0d198fa..1ad1c7a7a47 100644 --- a/public/content/translations/ja/governance/index.md +++ b/public/content/translations/ja/governance/index.md @@ -175,9 +175,9 @@ The DAO ハッキング事件をもっと見る イーサリアムのガバナンスは厳格には定義されていません。 さまざまなコミュニティ参加者が多様な視点を持っています。 下記にいくつかご紹介します。 -- [ブロックチェーンガバナンスに関するメモ](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [ブロックチェーンガバナンスに関するメモ](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [イーサリアムのガバナンスの仕組み](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [イーサリアムガバナンスの仕組み](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [イーサリアムのコアデベロッパーについて](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [ガバナンス、パート 2: 金権政治はまだ悪質](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [コイン投票ガバナンスを越えて](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [ガバナンス、パート 2: 金権政治はまだ悪質](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [コイン投票ガバナンスを越えて](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/ja/roadmap/account-abstraction/index.md b/public/content/translations/ja/roadmap/account-abstraction/index.md index 998ef74cbc3..eb2fb8d7d30 100644 --- a/public/content/translations/ja/roadmap/account-abstraction/index.md +++ b/public/content/translations/ja/roadmap/account-abstraction/index.md @@ -117,7 +117,7 @@ EIP-4337 では、ウォレットの動作方法も変わります。 各ウォ - [Devcon Bogota「アカウント抽象化が dApp のゲームチェンジャーになる理由」](https://www.youtube.com/watch?v=OwppworJGzs) - [Devcon Bogota「アカウント抽象化 ELI5」](https://www.youtube.com/watch?v=QuYZWJj65AY) - [ヴィタリックの「アカウント抽象化への道」メモ](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [ヴィタリックのソーシャルリカバリウォレットに関するブログ投稿](https://vitalik.ca/general/2021/01/11/recovery.html) +- [ヴィタリックのソーシャルリカバリウォレットに関するブログ投稿](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [EIP-2938 のメモ](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [EIP-2938 のドキュメント](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 のメモ](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/ja/roadmap/verkle-trees/index.md b/public/content/translations/ja/roadmap/verkle-trees/index.md index a869f0f6ed8..906ba2033af 100644 --- a/public/content/translations/ja/roadmap/verkle-trees/index.md +++ b/public/content/translations/ja/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ summaryPoints: - [Devcon6 での Guillaume Ballet による「バークルツリーがイーサリアムを効率的にする仕組み」](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [ETHDenver 2020 での Piper Merriam によるステートレスクライアントに関する説明](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [ゼロ知識ポッドキャストでのダンクラッド・フィーストによるバークルツリーとステートレスに関する説明](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [ヴィタリック・ブテリンによるバークルツリーの説明](https://vitalik.ca/general/2021/06/18/verkle.html) +- [ヴィタリック・ブテリンによるバークルツリーの説明](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [ダンクラッド・フィーストによるバークルツリーの説明](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [バークルツリーの EIP ドキュメント](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/ja/zero-knowledge-proofs/index.md b/public/content/translations/ja/zero-knowledge-proofs/index.md index 421c8b034c9..cb2f09e84d0 100644 --- a/public/content/translations/ja/zero-knowledge-proofs/index.md +++ b/public/content/translations/ja/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK は、暗号化に耐衝突ハッシュを使用するため、量子 - [ゼロ知識証明: ブロックチェーンでのプライバシーの強化](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARKs — ゼロ知識の実例と深掘り](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARK: 検証可能な信頼の創造 量子コンピュータに対する備え](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [zk-SNARK がいかにして実現されるのかについての概要の紹介](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [zk-SNARK がいかにして実現されるのかについての概要の紹介](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [ゼロ知識証明とブロックチェーンにおけるその役割について](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/kn/dao/index.md b/public/content/translations/kn/dao/index.md index c12ab9885cb..f92eb34f302 100644 --- a/public/content/translations/kn/dao/index.md +++ b/public/content/translations/kn/dao/index.md @@ -156,7 +156,7 @@ _ಸಾಮಾನ್ಯವಾಗಿ ಪ್ರೋಟೋಕಾಲ್‍ಗಳು - [DAO-ಚಾಲಿತ ಡಿಜಿಟಲ್ ಸಮುದಾಯವನ್ನು ಹೇಗೆ ಪ್ರಾರಂಭಿಸುವುದು](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [DAO ಎಂದರೇನು?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [ಹೊಲೊಗ್ರಾಫಿಕ್ ಒಮ್ಮತ ಎಂದರೇನು?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO ಗಳು ನಿಗಮಗಳಲ್ಲ: ಅಲ್ಲಿ ಸ್ವಾಯತ್ತ ಸಂಸ್ಥೆಗಳಲ್ಲಿ ವಿಕೇಂದ್ರೀಕರಣವು ವಿಟಾಲಿಕ್‌ನಿಂದ ಮುಖ್ಯವಾಗಿದೆ](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO ಗಳು ನಿಗಮಗಳಲ್ಲ: ಅಲ್ಲಿ ಸ್ವಾಯತ್ತ ಸಂಸ್ಥೆಗಳಲ್ಲಿ ವಿಕೇಂದ್ರೀಕರಣವು ವಿಟಾಲಿಕ್‌ನಿಂದ ಮುಖ್ಯವಾಗಿದೆ](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [ಡಿಎಒಗಳು, ಡಿಎಸಿಗಳು, ಡಿಎಗಳು ಮತ್ತು ಇನ್ನಷ್ಟು: ಅಪೂರ್ಣ ಪರಿಭಾಷೆ ಮಾರ್ಗದರ್ಶಿ](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) ### Videos {#videos} diff --git a/public/content/translations/kn/decentralized-identity/index.md b/public/content/translations/kn/decentralized-identity/index.md index 661cc309e90..56adc56ea8e 100644 --- a/public/content/translations/kn/decentralized-identity/index.md +++ b/public/content/translations/kn/decentralized-identity/index.md @@ -109,7 +109,7 @@ DIDs ಡಿಐಡಿಗಳನ್ನು ಬ್ಲಾಕ್‍ಚೈನ್‍ನ ### ಆತ್ಮಬಂಧಿತ ಸಂಕೇತಗಳು ಮತ್ತು ಗುರುತು {#soulbound} -ನಿರ್ದಿಷ್ಟ ವ್ಯಾಲೆಟ್‍ಗೆ ವಿಶಿಷ್ಟವಾದ ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಲು ಸೋಲ್ [ಬೌಂಡ್ ಟೋಕನ್](https://vitalik.ca/general/2022/01/26/soulbound.html) ಗಳನ್ನು (ವರ್ಗಾವಣೆ ಮಾಡಲಾಗದ NFTಗಳು) ಬಳಸಬಹುದು. ಇದು ಸಾಧನೆಗಳನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಟೋಕನ್‍ಗಳನ್ನು (ಉದಾಹರಣೆಗೆ, ಕೆಲವು ನಿರ್ದಿಷ್ಟ ಆನ್‍ಲೈನ್ ಕೋರ್ಸ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸುವುದು ಅಥವಾ ಆಟದಲ್ಲಿ ಆರಂಭಿಕ ಸ್ಕೋರ್ ಅನ್ನು ಪಾಸ್ ಮಾಡುವುದು) ಅಥವಾ ಸಮುದಾಯದ ಭಾಗವಹಿಸುವಿಕೆಯನ್ನು ಒಳಗೊಂಡಿರುವ ನಿರ್ದಿಷ್ಟ ಇಥಿರಿಯಮ್ ವಿಳಾಸಕ್ಕೆ ಬದ್ಧವಾಗಿರುವ ವಿಶಿಷ್ಟ ಆನ್-ಚೈನ್ ಗುರುತನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಸೃಷ್ಟಿಸುತ್ತದೆ. +ನಿರ್ದಿಷ್ಟ ವ್ಯಾಲೆಟ್‍ಗೆ ವಿಶಿಷ್ಟವಾದ ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಲು ಸೋಲ್ [ಬೌಂಡ್ ಟೋಕನ್](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ಗಳನ್ನು (ವರ್ಗಾವಣೆ ಮಾಡಲಾಗದ NFTಗಳು) ಬಳಸಬಹುದು. ಇದು ಸಾಧನೆಗಳನ್ನು ಪ್ರತಿನಿಧಿಸುವ ಟೋಕನ್‍ಗಳನ್ನು (ಉದಾಹರಣೆಗೆ, ಕೆಲವು ನಿರ್ದಿಷ್ಟ ಆನ್‍ಲೈನ್ ಕೋರ್ಸ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸುವುದು ಅಥವಾ ಆಟದಲ್ಲಿ ಆರಂಭಿಕ ಸ್ಕೋರ್ ಅನ್ನು ಪಾಸ್ ಮಾಡುವುದು) ಅಥವಾ ಸಮುದಾಯದ ಭಾಗವಹಿಸುವಿಕೆಯನ್ನು ಒಳಗೊಂಡಿರುವ ನಿರ್ದಿಷ್ಟ ಇಥಿರಿಯಮ್ ವಿಳಾಸಕ್ಕೆ ಬದ್ಧವಾಗಿರುವ ವಿಶಿಷ್ಟ ಆನ್-ಚೈನ್ ಗುರುತನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಸೃಷ್ಟಿಸುತ್ತದೆ. ## ವಿಕೇಂದ್ರೀಕೃತ ಗುರುತಿನ ಪ್ರಯೋಜನಗಳು {#benefits-of-decentralized-identity} diff --git a/public/content/translations/kn/desci/index.md b/public/content/translations/kn/desci/index.md index b6bac894860..fe6b5d23b3e 100644 --- a/public/content/translations/kn/desci/index.md +++ b/public/content/translations/kn/desci/index.md @@ -76,7 +76,7 @@ DeSci Web2 ಅಕ್ಯಾಡೆಮಿಯನ್ನು ಡಿಜಿಟಲ್ ಪ NFT ಗಳು ಭವಿಷ್ಯದ ವಹಿವಾಟುಗಳಿಗೆ ಆದಾಯವನ್ನು ಮೂಲ ರಚನೆಕಾರರಿಗೆ ಹಿಂದಿರುಗಿಸುವ ರೀತಿಯಲ್ಲಿಯೇ, ಸಂಶೋಧಕರು, ಆಡಳಿತ ಮಂಡಳಿಗಳು (DAO ಗಳಂತಹವು) ಅಥವಾ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸಿದ ವಿಷಯಗಳಿಗೆ ಬಹುಮಾನ ನೀಡಲು ನೀವು ಪಾರದರ್ಶಕ ಮೌಲ್ಯ ಗುಣಲಕ್ಷಣ ಸರಪಳಿಗಳನ್ನು ಸ್ಥಾಪಿಸಬಹುದು. -[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) ಕೈಗೊಳ್ಳಲಾಗುತ್ತಿರುವ ಸಂಶೋಧನಾ ಪ್ರಯೋಗಗಳ ವಿಕೇಂದ್ರೀಕೃತ ದತ್ತಾಂಶ ಭಂಡಾರಕ್ಕೆ ಕೀಲಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು NFT ಮತ್ತು [DeFi](/defi/) ವಾಣಿಜ್ಯೀಕರಣಕ್ಕೆ (ಫ್ರಾಕ್ಷನಲೈಸೇಶನ್‍ನಿಂದ ಸಾಲದ ಕೊಳಗಳು ಮತ್ತು ಮೌಲ್ಯ ಮೌಲ್ಯಮಾಪನದವರೆಗೆ) ಪ್ಲಗ್ ಮಾಡಬಹುದು. ಇದು [VitaDAO](https://www.vitadao.com/)ದಂತಹ DAOsಗಳಂತಹ ಸ್ಥಳೀಯವಾಗಿ ಆನ್-ಚೈನ್ ಘಟಕಗಳಿಗೆ ನೇರವಾಗಿ ಸರಪಳಿಯಲ್ಲಿ ಸಂಶೋಧನೆ ನಡೆಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ವರ್ಗಾವಣೆ ಮಾಡಲಾಗದ [ಸೋಲ್‌ಬೌಂಡ್" ಟೋಕನ್‌ಗಳ](https://vitalik.ca/general/2022/01/26/soulbound.html) ಆಗಮನವು ವ್ಯಕ್ತಿಗಳು ತಮ್ಮ ಅನುಭವ ಮತ್ತು ಅವರ Ethereum ವಿಳಾಸಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಲಾದ ರುಜುವಾತುಗಳನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಅನುಮತಿಸುವ ಮೂಲಕ DeSci ನಲ್ಲಿ ಪ್ರಮುಖ ಪಾತ್ರವನ್ನು ವಹಿಸಬಹುದು. +[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) ಕೈಗೊಳ್ಳಲಾಗುತ್ತಿರುವ ಸಂಶೋಧನಾ ಪ್ರಯೋಗಗಳ ವಿಕೇಂದ್ರೀಕೃತ ದತ್ತಾಂಶ ಭಂಡಾರಕ್ಕೆ ಕೀಲಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು NFT ಮತ್ತು [DeFi](/defi/) ವಾಣಿಜ್ಯೀಕರಣಕ್ಕೆ (ಫ್ರಾಕ್ಷನಲೈಸೇಶನ್‍ನಿಂದ ಸಾಲದ ಕೊಳಗಳು ಮತ್ತು ಮೌಲ್ಯ ಮೌಲ್ಯಮಾಪನದವರೆಗೆ) ಪ್ಲಗ್ ಮಾಡಬಹುದು. ಇದು [VitaDAO](https://www.vitadao.com/)ದಂತಹ DAOsಗಳಂತಹ ಸ್ಥಳೀಯವಾಗಿ ಆನ್-ಚೈನ್ ಘಟಕಗಳಿಗೆ ನೇರವಾಗಿ ಸರಪಳಿಯಲ್ಲಿ ಸಂಶೋಧನೆ ನಡೆಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ವರ್ಗಾವಣೆ ಮಾಡಲಾಗದ [ಸೋಲ್‌ಬೌಂಡ್" ಟೋಕನ್‌ಗಳ](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ಆಗಮನವು ವ್ಯಕ್ತಿಗಳು ತಮ್ಮ ಅನುಭವ ಮತ್ತು ಅವರ Ethereum ವಿಳಾಸಕ್ಕೆ ಲಿಂಕ್ ಮಾಡಲಾದ ರುಜುವಾತುಗಳನ್ನು ಸಾಬೀತುಪಡಿಸಲು ಅನುಮತಿಸುವ ಮೂಲಕ DeSci ನಲ್ಲಿ ಪ್ರಮುಖ ಪಾತ್ರವನ್ನು ವಹಿಸಬಹುದು. ### ಡೇಟಾ ಸಂಗ್ರಹಣೆ, ಪ್ರವೇಶ ಮತ್ತು ವಾಸ್ತುಶಿಲ್ಪ {#data-storage} diff --git a/public/content/translations/ko/dao/index.md b/public/content/translations/ko/dao/index.md index 1a0872058a2..069fe8f2b5b 100644 --- a/public/content/translations/ko/dao/index.md +++ b/public/content/translations/ko/dao/index.md @@ -156,7 +156,7 @@ _보통은 분산형 개발 및 프로토콜, 디앱의 운영 방식에 사용 - [DAO 기반 디지털 커뮤니티를 시작하는 방법](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [DAO란?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [홀로그램 합의란 무엇인가요?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO는 기업이 아닙니다: 비탈릭의 자율적 조직의 탈중앙화가 중요한 이유](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO는 기업이 아닙니다: 비탈릭의 자율적 조직의 탈중앙화가 중요한 이유](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA 그리고...: 완성되지 않은 용어 가이드](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [이더리움 블로그](https://blog.ethereum.org) ### 영상 {#videos} diff --git a/public/content/translations/ko/decentralized-identity/index.md b/public/content/translations/ko/decentralized-identity/index.md index 5d523988dfc..a808540556c 100644 --- a/public/content/translations/ko/decentralized-identity/index.md +++ b/public/content/translations/ko/decentralized-identity/index.md @@ -109,7 +109,7 @@ DID는 블록체인에 저장되기 때문에 누구든지 이더리움에서 ### 소울바운드 토큰과 신원 증명 {#soulbound} -[소울바운드 토큰](https://vitalik.ca/general/2022/01/26/soulbound.html)(양도 불가한 NFT)은 특정 지갑에 국한된 고유한 정보를 수집하는 데 사용될 수 있습니다. 이는 개인적인 성취(특정 온라인 강의 완료 또는 게임에서 높은 점수 획득 등)나 특정 커뮤니티에 참여 등을 증명하기 위한 토큰과 같은 온체인 신원 증명이 특정 이더리움 주소에만 고유하게 소속될 수 있게 만듭니다. +[소울바운드 토큰](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)(양도 불가한 NFT)은 특정 지갑에 국한된 고유한 정보를 수집하는 데 사용될 수 있습니다. 이는 개인적인 성취(특정 온라인 강의 완료 또는 게임에서 높은 점수 획득 등)나 특정 커뮤니티에 참여 등을 증명하기 위한 토큰과 같은 온체인 신원 증명이 특정 이더리움 주소에만 고유하게 소속될 수 있게 만듭니다. ## 분산형 신원 증명의 장점 {#benefits-of-decentralized-identity} diff --git a/public/content/translations/ko/desci/index.md b/public/content/translations/ko/desci/index.md index 42ef5d30f56..9c35bbaa8cf 100644 --- a/public/content/translations/ko/desci/index.md +++ b/public/content/translations/ko/desci/index.md @@ -76,7 +76,7 @@ Web3는 DAO와 Web3가 광범위하게 개발한 다양한 보상 모델을 실 NFT가 향후 거래에 대한 수익을 원래 작성자에게 다시 전달할 수 있는 것과 같은 방식으로 연구자, 관리 기관(예: DAO) 또는 데이터를 수집한 주체에게 보상하기 위해 투명한 가치 귀속 체인을 설정할 수 있습니다. -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6)는 또한 수행 중인 연구 실험의 분산된 데이터 저장소의 열쇠 역할을 할 수 있으며 NFT 및 [DeFi](/defi/) 금융화(금융에서 대출 풀 및 가치 평가까지)에 연결할 수 있습니다. 또한 [VitaDAO](https://www.vitadao.com/)와 같은 DAO와 같은 본질적으로 온체인 단체가 온 체인에서 직접 연구를 수행할 수 있습니다. 양도할 수 없는 ["soulbound" 토큰](https://vitalik.ca/general/2022/01/26/soulbound.html)의 출현은 또한 개인이 이더리움 주소와 연결된 경험과 자격 증명을 증명할 수 있도록 함으로써 DeFi 에서 중요한 역할을 할 수 있습니다. +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6)는 또한 수행 중인 연구 실험의 분산된 데이터 저장소의 열쇠 역할을 할 수 있으며 NFT 및 [DeFi](/defi/) 금융화(금융에서 대출 풀 및 가치 평가까지)에 연결할 수 있습니다. 또한 [VitaDAO](https://www.vitadao.com/)와 같은 DAO와 같은 본질적으로 온체인 단체가 온 체인에서 직접 연구를 수행할 수 있습니다. 양도할 수 없는 ["soulbound" 토큰](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)의 출현은 또한 개인이 이더리움 주소와 연결된 경험과 자격 증명을 증명할 수 있도록 함으로써 DeFi 에서 중요한 역할을 할 수 있습니다. ### 데이터 저장, 액세스 및 아키텍처 {#data-storage} diff --git a/public/content/translations/ko/governance/index.md b/public/content/translations/ko/governance/index.md index 1a1458dc838..a4570d4b01b 100644 --- a/public/content/translations/ko/governance/index.md +++ b/public/content/translations/ko/governance/index.md @@ -174,9 +174,9 @@ DAO 해킹에 대해 자세히 보기: 이더리움의 운영 방식은 엄격하게 정해진 것이 아닙니다. 여러 커뮤니티 참여자들이 이에 대해 다양한 관점을 가지고 있습니다. 다음은 그 중 몇 가지입니다. -- [블록체인 운영 방식에 대한 설명](https://vitalik.ca/general/2017/12/17/voting.html) - _비탈릭 부테린_ +- [블록체인 운영 방식에 대한 설명](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _비탈릭 부테린_ - [이더리움 운영 방식은 어떻게 작동합니까?](https://cryptotesters.com/blog/ethereum-governance) – _크립토테스터스_ - [어떻게 이더리움 운영 방식이 작동하는가](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _미카 졸투_ - [이더리움 코어 개발자란 무엇인가요?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _허드슨 제임슨_ -- [운영 방식, 2부: 금권정치는 아직도 나쁘다](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _비탈릭 부테린_ -- [코인 투표 운영 방식을 넘어서](https://vitalik.ca/general/2021/08/16/voting3.html) - _비탈릭 부테린_ +- [운영 방식, 2부: 금권정치는 아직도 나쁘다](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _비탈릭 부테린_ +- [코인 투표 운영 방식을 넘어서](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _비탈릭 부테린_ diff --git a/public/content/translations/mr/dao/index.md b/public/content/translations/mr/dao/index.md index d5c0667b21a..c199f15b24e 100644 --- a/public/content/translations/mr/dao/index.md +++ b/public/content/translations/mr/dao/index.md @@ -156,7 +156,7 @@ _सामान्यत: प्रोटोकॉल आणि dapps च्य - [DAO-सक्षम डिजिटल समुदाय कसा सुरू करावा](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [DAO म्हणजे काय?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [होलोग्राफिक कॉन्सेन्सस म्हणजे काय?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO कॉर्पोरेशन नाहीत: जेथे विटालिकद्वारे स्वायत्त संस्थांमध्ये विकेंद्रीकरण महत्त्वाचे आहे](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO कॉर्पोरेशन नाहीत: जेथे विटालिकद्वारे स्वायत्त संस्थांमध्ये विकेंद्रीकरण महत्त्वाचे आहे](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA आणि बरेच काही: एक अपूर्ण शब्दावली मार्गदर्शक](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum ब्लॉग](https://blog.ethereum.org) ### Videos {#videos} diff --git a/public/content/translations/mr/decentralized-identity/index.md b/public/content/translations/mr/decentralized-identity/index.md index 98e6792fe95..8d08a9336d9 100644 --- a/public/content/translations/mr/decentralized-identity/index.md +++ b/public/content/translations/mr/decentralized-identity/index.md @@ -109,7 +109,7 @@ Ethereum ब्लॉकचेनवरील [स्मार्ट कॉन ### सोलबाउंड टोकन आणि ओळख {#soulbound} -[सोलबाउंड टोकन](https://vitalik.ca/general/2022/01/26/soulbound.html) (नॉन-हस्तांतरणीय NFT) विशिष्ट वॉलेटसाठी अद्वितीय माहिती गोळा करण्यासाठी वापरली जाऊ शकतात. हे प्रभावीपणे विशिष्ट Ethereum पत्त्याशी बांधील एक अनन्य ऑन-चेन ओळख तयार करते ज्यामध्ये उपलब्धी दर्शविणारे टोकन समाविष्ट असू शकतात (उदा. काही विशिष्ट ऑनलाइन कोर्स पूर्ण करणे किंवा गेममध्ये थ्रेशोल्ड स्कोअर उत्तीर्ण करणे) किंवा समुदाय सहभाग. +[सोलबाउंड टोकन](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (नॉन-हस्तांतरणीय NFT) विशिष्ट वॉलेटसाठी अद्वितीय माहिती गोळा करण्यासाठी वापरली जाऊ शकतात. हे प्रभावीपणे विशिष्ट Ethereum पत्त्याशी बांधील एक अनन्य ऑन-चेन ओळख तयार करते ज्यामध्ये उपलब्धी दर्शविणारे टोकन समाविष्ट असू शकतात (उदा. काही विशिष्ट ऑनलाइन कोर्स पूर्ण करणे किंवा गेममध्ये थ्रेशोल्ड स्कोअर उत्तीर्ण करणे) किंवा समुदाय सहभाग. ## विकेंद्रित ओळखीचे फायदे {#benefits-of-decentralized-identity} diff --git a/public/content/translations/mr/desci/index.md b/public/content/translations/mr/desci/index.md index f785e63b170..dff23dcd1ba 100644 --- a/public/content/translations/mr/desci/index.md +++ b/public/content/translations/mr/desci/index.md @@ -76,7 +76,7 @@ Web3 मध्ये DAO आणि Web3 द्वारे विकसित ज्या प्रकारे NFT भविष्यातील व्यवहारांसाठी महसूल मूळ निर्मात्याकडे पाठवू शकतात, त्याच प्रकारे तुम्ही संशोधक, प्रशासकीय संस्था (DAO सारख्या) किंवा ज्यांचा डेटा संकलित केला आहे अशा विषयांना पुरस्कृत करण्यासाठी पारदर्शक मूल्य विशेषता साखळी स्थापन करू शकता. -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) देखील एक म्हणून कार्य करू शकतात हाती घेतलेल्या संशोधन प्रयोगांच्या विकेंद्रित डेटा भांडाराची गुरुकिल्ली, आणि NFT आणि [DeFi](/defi/) आर्थिककरण (फ्रॅक्शनलायझेशनपासून कर्ज पूल आणि मूल्य मूल्यांकनापर्यंत) प्लग इन करा. हे थेट ऑन-चेन संशोधन करण्यासाठी DAO सारख्या DAO जसे की [VitaDAO](https://www.vitadao.com/) ला देखील अनुमती देते. नॉन-हस्तांतरणीय ["सोलबाउंड" टोकन्स](https://vitalik.ca/general/2022/01/26/soulbound.html)चे आगमन देखील DeSci मध्ये महत्त्वपूर्ण भूमिका बजावू शकते आणि व्यक्तींना त्यांचे अनुभव आणि त्यांच्या Ethereum पत्त्याशी जोडलेले क्रेडेन्शियल्स सिद्ध करू शकतात. +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) देखील एक म्हणून कार्य करू शकतात हाती घेतलेल्या संशोधन प्रयोगांच्या विकेंद्रित डेटा भांडाराची गुरुकिल्ली, आणि NFT आणि [DeFi](/defi/) आर्थिककरण (फ्रॅक्शनलायझेशनपासून कर्ज पूल आणि मूल्य मूल्यांकनापर्यंत) प्लग इन करा. हे थेट ऑन-चेन संशोधन करण्यासाठी DAO सारख्या DAO जसे की [VitaDAO](https://www.vitadao.com/) ला देखील अनुमती देते. नॉन-हस्तांतरणीय ["सोलबाउंड" टोकन्स](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)चे आगमन देखील DeSci मध्ये महत्त्वपूर्ण भूमिका बजावू शकते आणि व्यक्तींना त्यांचे अनुभव आणि त्यांच्या Ethereum पत्त्याशी जोडलेले क्रेडेन्शियल्स सिद्ध करू शकतात. ### डेटा स्टोरेज, ऍक्सेस आणि आर्किटेक्चर {#data-storage} diff --git a/public/content/translations/ms/dao/index.md b/public/content/translations/ms/dao/index.md index 25424b3502c..ee5519ca96d 100644 --- a/public/content/translations/ms/dao/index.md +++ b/public/content/translations/ms/dao/index.md @@ -156,7 +156,7 @@ _Biasanya digunakan untuk pembangunan dan tadbir urus protokol dan dapp yang ter - [Cara Memulakan Komuniti Digital Didayakan DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Apakah itu DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Apakah itu Konsensus Holografi?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO bukan syarikat: penyahpusatan adalah penting dalam organisasi autonomi oleh Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO bukan syarikat: penyahpusatan adalah penting dalam organisasi autonomi oleh Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA dan Lebih Lagi: Panduan Terminologi Tidak Lengkap](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog Ethereum](https://blog.ethereum.org) ### Videos {#videos} diff --git a/public/content/translations/nl/dao/index.md b/public/content/translations/nl/dao/index.md index 64151be1f92..0a04b4bd455 100644 --- a/public/content/translations/nl/dao/index.md +++ b/public/content/translations/nl/dao/index.md @@ -156,7 +156,7 @@ _Meestal gebruikt voor gedecentraliseerde ontwikkeling en governance van protoco - [Hoe een door een DAO mogelijk gemaakte digitale gemeenschap te starten](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/) - [Wat is een DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Wat is holografische consensus?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAOs are not corporations: where decentralization in autonomous organizations matters, van Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAOs are not corporations: where decentralization in autonomous organizations matters, van Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO's, DAC's, DA's en meer: een onvolledige terminologiegids](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) ### Video's {#videos} diff --git a/public/content/translations/nl/decentralized-identity/index.md b/public/content/translations/nl/decentralized-identity/index.md index 450a111c4eb..db82353271d 100644 --- a/public/content/translations/nl/decentralized-identity/index.md +++ b/public/content/translations/nl/decentralized-identity/index.md @@ -109,7 +109,7 @@ Hier is een voorbeeld om te laten zien hoe on-chain attesten in de praktijk zoud ### Zielsgebonden tokens en identiteit {#soulbound} -[Zielsgebonden tokens](https://vitalik.ca/general/2022/01/26/soulbound.html) (niet-overdraagbare NFT's) kunnen worden gebruikt om informatie te verzamelen die uniek is voor een specifieke portemonnee. Dit creëert in feite een unieke on-chain identiteit gekoppeld aan een bepaald Ethereum-adres, dat tokens kan bevatten die prestaties (bijv. het voltooien van een specifieke online cursus of het verbreken van een score in een game) of deelname aan een gemeenschap vertegenwoordigen. +[Zielsgebonden tokens](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (niet-overdraagbare NFT's) kunnen worden gebruikt om informatie te verzamelen die uniek is voor een specifieke portemonnee. Dit creëert in feite een unieke on-chain identiteit gekoppeld aan een bepaald Ethereum-adres, dat tokens kan bevatten die prestaties (bijv. het voltooien van een specifieke online cursus of het verbreken van een score in een game) of deelname aan een gemeenschap vertegenwoordigen. ## Voordelen van gedecentraliseerde identiteit {#benefits-of-decentralized-identity} diff --git a/public/content/translations/nl/desci/index.md b/public/content/translations/nl/desci/index.md index 35e786885fc..ad0dfbdc7e6 100644 --- a/public/content/translations/nl/desci/index.md +++ b/public/content/translations/nl/desci/index.md @@ -76,7 +76,7 @@ Intellectueel eigendom (IP) is een groot probleem in traditionele wetenschap: va Net zoals NFT's de inkomsten van toekomstige transacties terug kunnen doorgeven aan de originele maker, kun je een transparante waardetoekenningsketen vaststellen voor het belonen van onderzoekers, bestuursorganen (zoals DAOs) of zelfs de personen wiens data verzameld worden. -[IP-NFT's](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) kunnen ook dienst doen als de sleutel voor een gedecentraliseerde databank van de onderzoeksexperimenten die worden ondernomen, en aansluiten bij NFT en [DeFi](/defi/) financialisering (van fractionalisatie tot kredietpools en waardebepaling). Het maakt het ook mogelijk voor on-chain entiteiten zoals DAO's, bijvoorbeeld [VitaDAO](https://www.vitadao.com/), om onderzoek direct on-chain uit te voeren. De komst van niet-overdraagbare ["soulbound" tokens](https://vitalik.ca/general/2022/01/26/soulbound.html) speelt mogelijk ook een belangrijke rol in DeSci door personen de kans te geven hun ervaringen en de aan hun Ethereum-adres gekoppelde toegangsgegevens te bewijzen. +[IP-NFT's](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) kunnen ook dienst doen als de sleutel voor een gedecentraliseerde databank van de onderzoeksexperimenten die worden ondernomen, en aansluiten bij NFT en [DeFi](/defi/) financialisering (van fractionalisatie tot kredietpools en waardebepaling). Het maakt het ook mogelijk voor on-chain entiteiten zoals DAO's, bijvoorbeeld [VitaDAO](https://www.vitadao.com/), om onderzoek direct on-chain uit te voeren. De komst van niet-overdraagbare ["soulbound" tokens](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) speelt mogelijk ook een belangrijke rol in DeSci door personen de kans te geven hun ervaringen en de aan hun Ethereum-adres gekoppelde toegangsgegevens te bewijzen. ### Gegevensopslag, toegang en architectuur {#data-storage} diff --git a/public/content/translations/nl/energy-consumption/index.md b/public/content/translations/nl/energy-consumption/index.md index 4ef016307f5..953fc5b772e 100644 --- a/public/content/translations/nl/energy-consumption/index.md +++ b/public/content/translations/nl/energy-consumption/index.md @@ -24,7 +24,7 @@ Proof-of-work is een solide manier om het netwerk te beveiligen en eerlijke vera Een groenere toekomst voor Ethereum wordt al gebouwd in de vorm van een [**proof-of-stake (PoS)** chain](/roadmap/beacon-chain/). Onder [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) is het willekeurig oplossen van puzzels niet nodig. Het verwijderen van puzzeloplossingen vermindert drastisch de energieuitgaven die nodig zijn om het netwerk te beveiligen. Miners worden vervangen door validators die dezelfde functie uitvoeren, behalve dat in plaats van hun activa op voorhand uit te geven in de vorm van computerwerk, gaan ze ETH staken als onderpand tegen oneerlijk gedrag. Als de validator lui is (offline terwijl hij/zij een validatiedienst zou moeten uitvoeren), kan zijn/haar gestakete ETH langzaam verdwijnen, terwijl oneerlijk gedrag er waarschijnlijk toe leidt dat de gestakete activa worden weggenomen. Dit zorgt ervoor dat de validators actief en eerlijk gaan meewerken met het beveiligen van het netwerk. -Op dezelfde manier als bij proof-of-work, zou een kwaadaardige entiteit ten minste 51 procent van de totale hoeveelheid ETH die gestaket is in het netwerk nodig zijn om een [aanval van 51%](/glossary/#51-attack) uit te voeren. Maar anders dan bij proof-of-work, waar het potentiële verlies van een mislukte aanval alleen de kosten is van het genereren van de hash-kracht die nodig is voor het minen, bij proof-of-stake is het mogelijke verlies van een aanval de totale hoeveelheid ETH die wordt gebruikt als onderpand. Deze ontmoedigende structuur maakt netwerkbeveiliging met proof-of-stake mogelijk, terwijl het niet langer nodig is om energie te besteden aan willekeurige berekeningen. Gedetailleerde uitleg van de netwerkbeveiliging onder proof-of-stake kan [hier](/developers/docs/consensus-mechanisms/pos/) en [hier](https://vitalik.ca/general/2017/12/31/pos_faq.html) worden gevonden. +Op dezelfde manier als bij proof-of-work, zou een kwaadaardige entiteit ten minste 51 procent van de totale hoeveelheid ETH die gestaket is in het netwerk nodig zijn om een [aanval van 51%](/glossary/#51-attack) uit te voeren. Maar anders dan bij proof-of-work, waar het potentiële verlies van een mislukte aanval alleen de kosten is van het genereren van de hash-kracht die nodig is voor het minen, bij proof-of-stake is het mogelijke verlies van een aanval de totale hoeveelheid ETH die wordt gebruikt als onderpand. Deze ontmoedigende structuur maakt netwerkbeveiliging met proof-of-stake mogelijk, terwijl het niet langer nodig is om energie te besteden aan willekeurige berekeningen. Gedetailleerde uitleg van de netwerkbeveiliging onder proof-of-stake kan [hier](/developers/docs/consensus-mechanisms/pos/) en [hier](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) worden gevonden. ## De merge {#the-merge} diff --git a/public/content/translations/nl/governance/index.md b/public/content/translations/nl/governance/index.md index 8982a31ae76..43cf3f4df8b 100644 --- a/public/content/translations/nl/governance/index.md +++ b/public/content/translations/nl/governance/index.md @@ -174,9 +174,9 @@ Wanneer de Beacon Chain samenvalt met de uitvoeringslaag van Ethereum, zal het g Governance in Ethereum is niet strikt gedefinieerd. Verschillende deelnemers van de gemeenschap hebben er verschillende perspectieven op. Hier zijn er een paar: -- [Notes on Blockchain Governance](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Notes on Blockchain Governance](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [How does Ethereum Governance work?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [How Ethereum governance works](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [What is an Ethereum core developer?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [Governance, Deel 2: Plutocratie is nog steeds Bad](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [Opmerkingen over Blockchain Governance](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [Governance, Deel 2: Plutocratie is nog steeds Bad](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [Opmerkingen over Blockchain Governance](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/pcm/dao/index.md b/public/content/translations/pcm/dao/index.md index 40858f4af5d..60980792317 100644 --- a/public/content/translations/pcm/dao/index.md +++ b/public/content/translations/pcm/dao/index.md @@ -156,7 +156,7 @@ _Dem dey use am for decentralized development and governance of protocols and da - [ Hau yu fit start DAO-powered Digital Komunity](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/) - [ Wetin be DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) - [Coinmarketcap](https://coinmarketcap.com) - [Wetin be Holographic Consensus?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [ DAOstack](https://daostack.io/) -- [DAOs no be corporations: where decentralization in autonomous organizations matter by vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAOs no be corporations: where decentralization in autonomous organizations matter by vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAOs, DACs, DAs and More: terminology guide wey no complete](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [ Ethereum Blog](https://blog.ethereum.org) ### Videos {#videos} diff --git a/public/content/translations/pl/community/research/index.md b/public/content/translations/pl/community/research/index.md index 19e0eb559eb..67909b2f103 100644 --- a/public/content/translations/pl/community/research/index.md +++ b/public/content/translations/pl/community/research/index.md @@ -71,7 +71,7 @@ Warstwa wykonawcza związana jest z wykonywaniem transakcji, uruchamianiem [wirt - [Ścieżki do wygaśnięcia stanu](https://hackmd.io/@vbuterin/state_expiry_paths) - [Propozycje wygaśnięcia stani i Verkel](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) - [Zarządzanie historią](https://eips.ethereum.org/EIPS/eip-4444) -- [Drzewa Verkle](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Drzewa Verkle](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Próbkowanie dostępności danych](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## Rozwój klientów {#client-development} diff --git a/public/content/translations/pl/dao/index.md b/public/content/translations/pl/dao/index.md index 24a28c8c6d8..e4776ee4725 100644 --- a/public/content/translations/pl/dao/index.md +++ b/public/content/translations/pl/dao/index.md @@ -156,7 +156,7 @@ _Zwykle używane do zdecentralizowanego rozwoju protokołów i aplikacji oraz za - [Jak założyć społeczność cyfrową w oparciu o DAO?](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Co to jest DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Co to jest konsensus holograficzny?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO nie są przedsiębiorstwami, w których decentralizacja w organizacjach autonomicznych ma znaczenie dla Vitalik.](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO nie są przedsiębiorstwami, w których decentralizacja w organizacjach autonomicznych ma znaczenie dla Vitalik.](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA i więcej: Niekompletny przewodnik po terminologii](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) ### Materiały wideo {#videos} diff --git a/public/content/translations/pl/decentralized-identity/index.md b/public/content/translations/pl/decentralized-identity/index.md index 17739bd2286..ed2e85ad6a4 100644 --- a/public/content/translations/pl/decentralized-identity/index.md +++ b/public/content/translations/pl/decentralized-identity/index.md @@ -109,7 +109,7 @@ Oto przykład pokazujący, w jaki sposób poświadczenia mogą działać w prakt ### Tokeny Soulbound i tożsamość {#soulbound} -[Tokeny Soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) (niezbywalne NFT) mogą być używane do zbierania informacji unikatowych dla określonego portfela. W ten sposób tworzy się unikatową w łańcuchu tożsamość związaną z określonym adresem Ethereum, która może obejmować tokeny reprezentujące osiągnięcia (np. ukończenie określonego kursu online lub przekroczenie progowego wyniku w grze) albo zaangażowanie w działania społeczności. +[Tokeny Soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (niezbywalne NFT) mogą być używane do zbierania informacji unikatowych dla określonego portfela. W ten sposób tworzy się unikatową w łańcuchu tożsamość związaną z określonym adresem Ethereum, która może obejmować tokeny reprezentujące osiągnięcia (np. ukończenie określonego kursu online lub przekroczenie progowego wyniku w grze) albo zaangażowanie w działania społeczności. ## Zalety zdecentralizowanej tożsamości {#benefits-of-decentralized-identity} diff --git a/public/content/translations/pl/desci/index.md b/public/content/translations/pl/desci/index.md index ee01b6381cb..59439376328 100644 --- a/public/content/translations/pl/desci/index.md +++ b/public/content/translations/pl/desci/index.md @@ -76,7 +76,7 @@ Własność intelektualna (IP) stanowi duży problem w tradycyjnej nauce: od utk W ten sam sposób, w jaki NFT mogą przekazywać przychody z przyszłych transakcji z powrotem do pierwotnego twórcy, można ustanowić przejrzyste łańcuchy przypisywania wartości, aby nagradzać badaczy, organy zarządzające (jak DAO), a nawet podmioty, których dane są gromadzone. -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) mogą również funkcjonować jako klucz do zdecentralizowanego repozytorium danych o podejmowanych eksperymentach badawczych, a także podłączać się do NFT i [DeFi](/defi/) finansjeryzacji (od frakcjonalizacji po pule pożyczkowe i wycenę wartości). Umożliwia również podmiotom działającym natywnie w łańcuchu, takim jak DAO [VitaDAO](https://www.vitadao.com/), prowadzenie badań bezpośrednio w łańcuchu. Pojawienie się niezbywalnych [tokenów „soulbound”](https://vitalik.ca/general/2022/01/26/soulbound.html) może również odgrywać ważną rolę w DeSci, umożliwiając jednostkom udowodnienie swojego doświadczenia i poświadczeń powiązanych z ich adresem Ethereum. +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) mogą również funkcjonować jako klucz do zdecentralizowanego repozytorium danych o podejmowanych eksperymentach badawczych, a także podłączać się do NFT i [DeFi](/defi/) finansjeryzacji (od frakcjonalizacji po pule pożyczkowe i wycenę wartości). Umożliwia również podmiotom działającym natywnie w łańcuchu, takim jak DAO [VitaDAO](https://www.vitadao.com/), prowadzenie badań bezpośrednio w łańcuchu. Pojawienie się niezbywalnych [tokenów „soulbound”](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) może również odgrywać ważną rolę w DeSci, umożliwiając jednostkom udowodnienie swojego doświadczenia i poświadczeń powiązanych z ich adresem Ethereum. ### Przechowywanie danych, dostęp do nich i ich architektura {#data-storage} diff --git a/public/content/translations/pl/developers/docs/scaling/index.md b/public/content/translations/pl/developers/docs/scaling/index.md index 2739c322411..23a06514561 100644 --- a/public/content/translations/pl/developers/docs/scaling/index.md +++ b/public/content/translations/pl/developers/docs/scaling/index.md @@ -84,6 +84,6 @@ _Zauważ, że w wyjaśnieniu w filmie termin „Warstwa 2” jest używany w odn - [Aktualne analizy dotyczące rozwiązań skalowania warstwy 2 dla Ethereum](https://www.l2beat.com/) - [Ocena rozwiązań skalowania warstwy 2 Ethereum: schemat porównawczy](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Niekompletny przewodnik po pakietach zbiorczych](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Niekompletny przewodnik po pakietach zbiorczych](https://vitalik.eth.limo/general/2021/01/05/rollup.html) _Znasz jakieś zasoby społeczności, które Ci pomogły? Wyedytuj tę stronę i dodaj je!_ diff --git a/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md b/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md index 71ac1a6784d..ff41d504d28 100644 --- a/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md +++ b/public/content/translations/pl/developers/docs/scaling/layer-2-rollups/index.md @@ -117,7 +117,7 @@ Istnieją rozwiązania hybrydowe, które łączą w sobie najlepsze elementy wie ## Dalsza lektura {#further-reading} -- [Niekompletny przewodnik po pakietach zbiorczych](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Niekompletny przewodnik po pakietach zbiorczych](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) **Pakiety zbiorcze ZK** diff --git a/public/content/translations/pl/governance/index.md b/public/content/translations/pl/governance/index.md index 3cb1d6a49c5..2b4927fe19a 100644 --- a/public/content/translations/pl/governance/index.md +++ b/public/content/translations/pl/governance/index.md @@ -175,9 +175,9 @@ Kiedy łańcuch śledzący połączył się z warstwą wykonawczą Ethereum 15 w Zarządzanie w Ethereum nie jest jednoznacznie zdefiniowane. Perspektywy na ten temat różnią się wśród różnych uczestników społeczności. Oto kilka z nich: -- [Uwagi na temat zarządzania blockchainem](https://vitalik.ca/general/2017/12/17/voting.html) — _Vitalik Buterin_ +- [Uwagi na temat zarządzania blockchainem](https://vitalik.eth.limo/general/2017/12/17/voting.html) — _Vitalik Buterin_ - [Jak działa zarządzanie Ethereum?](https://cryptotesters.com/blog/ethereum-governance) — _Cryptotesters_ - [Jak działa zarządzanie Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) — _Micah Zoltu_ - [Czym jest główny deweloper Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) — _Hudson Jameson_ -- [Zarządzanie, część 2: plutokracja wciąż jest zła](https://vitalik.ca/general/2018/03/28/plutocracy.html) — _Vitalik Buterin_ -- [Wyjście poza zarządzanie głosowaniem monetami](https://vitalik.ca/general/2021/08/16/voting3.html) — _Vitalik Buterin_ +- [Zarządzanie, część 2: plutokracja wciąż jest zła](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) — _Vitalik Buterin_ +- [Wyjście poza zarządzanie głosowaniem monetami](https://vitalik.eth.limo/general/2021/08/16/voting3.html) — _Vitalik Buterin_ diff --git a/public/content/translations/pl/whitepaper/index.md b/public/content/translations/pl/whitepaper/index.md index 576deb422b3..4d7d3b46c95 100644 --- a/public/content/translations/pl/whitepaper/index.md +++ b/public/content/translations/pl/whitepaper/index.md @@ -23,7 +23,7 @@ Koncepcja zdecentralizowanej waluty cyfrowej, a także alternatywnych aplikacji, Mechanizm dowodu pracy był przełomem w przestrzeni ponieważ jednocześnie rozwiązał dwa problemy. Po pierwsze, zapewnił prosty i umiarkowanie skuteczny algorytm konsensusu, umożliwiający węzłom w sieci do wspólnego uzgodnienia zestawu kanonicznych aktualizacji do to stanu księgi Bitcoin. Po drugie, zapewnił mechanizm pozwalający na swobodne wejście do procesu konsensusu, rozwiązanie politycznego problemu decydowania o tym, kto ma wpływ na konsensus, przy czym jednocześnie zapobiega atakom sybili. Czyni to, zastępując formalną barierę dla uczestnictwa, np. wymóg rejestracji jako niepowtarzalny podmiot w określonym wykazie, z ekonomiczną barierą - waga pojedynczego węzła w procesie głosowania konsensualnego jest wprost proporcjonalna do mocy obliczeniowej, którą tworzy węzeł. Od tamego czasu zaproponowano alternatywne podejście zwane _dowodem stawki_, obliczanie wagi węzła jako proporcjonalnej do jego waluty i zasobów obliczeniowych; dyskusja nad względnymi zaletami tych dwóch podejść wykracza poza zakres niniejszego dokumentu, ale należy zauważyć, że oba podejścia mogą służyć jako szkielet kryptowaluty. -Oto wpis na blogu od Vitalika Buterina, założyciela Ethereum, na temat [prehistorii Ethereum](https://vitalik.ca/general/2017/09/14/prehistory.html). [Tutaj](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) jest kolejny post przedstawiający więcej informacji o historii. +Oto wpis na blogu od Vitalika Buterina, założyciela Ethereum, na temat [prehistorii Ethereum](https://vitalik.eth.limo/general/2017/09/14/prehistory.html). [Tutaj](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) jest kolejny post przedstawiający więcej informacji o historii. ### Bitcoin jako system przejścia między stanami {#bitcoin-as-a-state-transition-system} diff --git a/public/content/translations/pl/zero-knowledge-proofs/index.md b/public/content/translations/pl/zero-knowledge-proofs/index.md index f6e0c8a1c20..dffae9ed019 100644 --- a/public/content/translations/pl/zero-knowledge-proofs/index.md +++ b/public/content/translations/pl/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK jest uważany za odporny na zagrożenia związane z obliczeniami kwanto - [Dowód wiedzy zerowej: poprawa prywatności w blockchainie](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARK — Realistyczny przykład wiedzy zerowej i dogłębna analiza](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARK — Twórz weryfikowalne zaufanie, nawet względem komputerów kwantowych](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [Przybliżone wprowadzenie do tego, w jaki sposób możliwe są dowody zk-SNARK](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [Przybliżone wprowadzenie do tego, w jaki sposób możliwe są dowody zk-SNARK](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [Czym jest dowód wiedzy zerowej i jaka jest jego rola w blockchainie?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/pt-br/community/research/index.md b/public/content/translations/pt-br/community/research/index.md index af6b9a08775..88436fb1277 100644 --- a/public/content/translations/pt-br/community/research/index.md +++ b/public/content/translations/pt-br/community/research/index.md @@ -71,7 +71,7 @@ A camada de execução se preocupa com a execução de transações, com a execu - [Caminhos para a expiração do estado](https://hackmd.io/@vbuterin/state_expiry_paths) - [Verkel e proposta de expiração de estado](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) - [Gerenciamento de histórico](https://eips.ethereum.org/EIPS/eip-4444) -- [Verkle Trees](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Amostragem da disponibilidade dos dados](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## Desenvolvimento de cliente {#client-development} diff --git a/public/content/translations/pt-br/dao/index.md b/public/content/translations/pt-br/dao/index.md index 8f693649395..b67304c5e2b 100644 --- a/public/content/translations/pt-br/dao/index.md +++ b/public/content/translations/pt-br/dao/index.md @@ -156,7 +156,7 @@ _Normalmente usado para desenvolvimento descentralizado e governança de protoco - [Como começar uma comunidade digital alimentada por DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [O que é uma DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [O que é Consenso Holográfico?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAOs não são corporações: onde a descentralização em organizações autônomas é importante para Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAOs não são corporações: onde a descentralização em organizações autônomas é importante para Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAOs, DACs, DAs e mais: Um Guia Terminológico Incompleto](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog Ethereum](https://blog.ethereum.org) ### Vídeos {#videos} diff --git a/public/content/translations/pt-br/decentralized-identity/index.md b/public/content/translations/pt-br/decentralized-identity/index.md index 546c2733601..ed663dd648f 100644 --- a/public/content/translations/pt-br/decentralized-identity/index.md +++ b/public/content/translations/pt-br/decentralized-identity/index.md @@ -109,7 +109,7 @@ Aqui está um exemplo para mostrar como os atestados on-chain podem funcionar na ### Tokens Soulbound e identidade {#soulbound} -[Tokens Soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) (NFTs não transferíveis) podem ser usados para coletar informações exclusivas de uma carteira específica. Isso cria efetivamente uma identidade única on-chain vinculada a um endereço Ethereum específico que pode incluir tokens que representam conquistas (por exemplo, terminar algum curso on-line específico ou passar uma pontuação mínima em um jogo) ou participação da comunidade. +[Tokens Soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (NFTs não transferíveis) podem ser usados para coletar informações exclusivas de uma carteira específica. Isso cria efetivamente uma identidade única on-chain vinculada a um endereço Ethereum específico que pode incluir tokens que representam conquistas (por exemplo, terminar algum curso on-line específico ou passar uma pontuação mínima em um jogo) ou participação da comunidade. ## Benefícios da identidade descentralizada {#benefits-of-decentralized-identity} diff --git a/public/content/translations/pt-br/desci/index.md b/public/content/translations/pt-br/desci/index.md index a731f4b2302..4c3b119490f 100644 --- a/public/content/translations/pt-br/desci/index.md +++ b/public/content/translations/pt-br/desci/index.md @@ -76,7 +76,7 @@ A propriedade intelectual (IP) é um grande problema na ciência tradicional: de Da mesma forma que os NFTs podem repassar receitas para transações futuras de volta ao criador original, você pode estabelecer cadeias de atribuição de valor transparentes para recompensar pesquisadores, órgãos governamentais (como DAOs) ou até mesmo as pessoas de cujos dados são coletados. -[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) também podem funcionar como uma chave para um repositório descentralizado de dados, de experimentos de pesquisa que estão sendo realizados para conectar o NFT ao financiamento [DeFi](/defi/) (de fracionamento a fundos de empréstimos e avaliação de valor). Ele também permite que entidades nativamente em cadeia, como DAOs do tipo [VitaDAO](https://www.vitadao.com/), conduzam pesquisas diretamente em cadeia. O advento de [tokens "soulbound" intransferíveis](https://vitalik.ca/general/2022/01/26/soulbound.html) também pode desempenhar um papel importante no DeSci, permitindo que indivíduos provem sua experiência e credenciais vinculadas ao seu endereço Ethereum. +[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) também podem funcionar como uma chave para um repositório descentralizado de dados, de experimentos de pesquisa que estão sendo realizados para conectar o NFT ao financiamento [DeFi](/defi/) (de fracionamento a fundos de empréstimos e avaliação de valor). Ele também permite que entidades nativamente em cadeia, como DAOs do tipo [VitaDAO](https://www.vitadao.com/), conduzam pesquisas diretamente em cadeia. O advento de [tokens "soulbound" intransferíveis](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) também pode desempenhar um papel importante no DeSci, permitindo que indivíduos provem sua experiência e credenciais vinculadas ao seu endereço Ethereum. ### Armazenamento de dados, acesso e arquitetura {#data-storage} diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/faqs/index.md index 35ce9fcdfdd..9a8ee3abb31 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -18,7 +18,7 @@ A prova de participação requer nós, conhecidos como validadores, para enviar A prova de trabalho consome muito mais energia porque a eletricidade é consumida no processo de mineração. Por outro lado, a prova de participação requer apenas uma quantidade muito pequena de energia: os validadores do Ethereum podem até ser executados em um dispositivo de baixa potência, como o Raspberry Pi. O mecanismo de prova de participação do Ethereum é considerado mais seguro do que a prova de trabalho, porque o custo do ataque é maior e as consequências para um invasor são mais severas. -A comparação entre prova de trabalho e prova de participação é um tópico controverso. [O blog de Vitalik Buterin](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) e o debate entre Justin Drake e Lyn Alden dão um bom resumo dos argumentos. +A comparação entre prova de trabalho e prova de participação é um tópico controverso. [O blog de Vitalik Buterin](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) e o debate entre Justin Drake e Lyn Alden dão um bom resumo dos argumentos. @@ -89,7 +89,7 @@ O ataque forçado de participação é uma categoria de ataque em redes de prova A remoção social consiste na capacidade de uma comunidade em coordenar uma bifurcação (fork) da blockchain em resposta a um ataque. Ela permite à comunidade se recuperar do ataque de um invasor, finalizando uma cadeia desonesta. O corte social também pode ser utilizado contra ataques de censura. - [Mais a respeito de remoção social](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin sobre remoção social](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Vitalik Buterin sobre remoção social](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## Eu serei removido? {#will-i-get-slashed} @@ -101,7 +101,7 @@ Como validador, é muito difícil ser removido, a menos que você se envolva del O problema do nada em participação (stake) é uma questão conceitual com alguns mecanismos de prova de participação, nos quais há apenas recompensas e nenhuma penalidade. Se não há nada em participação (stake), um validador pragmático poderá sem problemas atestar qualquer uma, ou mesmo várias, bifurcações (forks) da blockchain, pois isso aumenta suas recompensas. O Ethereum contorna isso usando condições de finalidade e remoções para garantir uma cadeia padronizada. -[Mais sobre o problema do “nada em participação”](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[Mais sobre o problema do “nada em participação”](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) ## O que é um algoritmo de escolha de bifurcação (fork)? {#what-is-a-fork-choice-algorithm} diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md index 7b38d05ed66..876cfe76f66 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/index.md @@ -79,10 +79,10 @@ Ethereum nem sempre tem sido uma rede de prova de participação. Quando o Ether ## Leitura adicional {#further-reading} -- [Perguntas frequentes sobre prova de participação](https://vitalik.ca/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Perguntas frequentes sobre prova de participação](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [O que é prova de participação](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ - [O que prova de participação é por que é importante](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [Por que a prova de participação (nov. de 2020)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Por que a prova de participação (nov. de 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [Prova da participação: como aprendi a amar a pouca subjetividade](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [Ataque e defesa da prova de participação do Ethereum](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [A filosofia por trás do design da prova de participação](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index 23b7942c2a7..5f774fa10ab 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -65,5 +65,5 @@ Assista Justin Drake explicando os benefícios da prova de participação em rel ## Leitura adicional {#further-reading} - [Filosofia de design da prova de participação de Vitalik](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [Perguntas frequentes sobre a prova de participação de Vitalik](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Perguntas frequentes sobre a prova de participação de Vitalik](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) - [Vídeo "Simplesmente Explicado" sobre pos vs pow](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md b/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md index 388bf230b61..09d985465fe 100644 --- a/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/pt-br/developers/docs/nodes-and-clients/index.md @@ -20,7 +20,7 @@ Um "nó" é qualquer instância de software do cliente Ethereum que esteja conec - O cliente de execução (também conhecido como Execution Engine, cliente EL ou anteriormente cliente Eth1) ouve novas transações transmitidas na rede, executa-as na EVM e mantém o estado mais recente e o banco de dados de todos os dados atuais do Ethereum. - O cliente de consenso (também conhecido como Beacon Node, cliente CL ou anteriormente cliente Eth2) implementa o algoritmo de consenso de prova de participação, o qual permite que a rede realize um acordo com base nos dados validados do cliente de execução. Há também um terceiro pedaço de software, conhecido como 'validador' que pode ser adicionado ao cliente de consenso, permitindo que um nó participe na segurança da rede. -Estes clientes trabalham juntos para manter rastreabilidade da cabeça da cadeia Ethereum e permitir usuários interagir com a rede Ethereum. O desenho modular com várias peças de software trabalhando em conjunto é chamado de [complexidade encapsulada](https://vitalik.ca/general/2022/02/28/complexity.html). Esta abordagem facilitou executar o [The Merge](/roadmap/merge) perfeitamente, faz softwares clientes mais fáceis de manter e desenvolver, e permite reusar clientes individuais, por exemplo, no [ecossistema camada 2](/layer-2/). +Estes clientes trabalham juntos para manter rastreabilidade da cabeça da cadeia Ethereum e permitir usuários interagir com a rede Ethereum. O desenho modular com várias peças de software trabalhando em conjunto é chamado de [complexidade encapsulada](https://vitalik.eth.limo/general/2022/02/28/complexity.html). Esta abordagem facilitou executar o [The Merge](/roadmap/merge) perfeitamente, faz softwares clientes mais fáceis de manter e desenvolver, e permite reusar clientes individuais, por exemplo, no [ecossistema camada 2](/layer-2/). ![Execução de acoplamento e clientes de consenso](./eth1eth2client.png) Diagrama simplificado de uma execução associada e de um cliente de consenso. diff --git a/public/content/translations/pt-br/developers/docs/scaling/index.md b/public/content/translations/pt-br/developers/docs/scaling/index.md index 93f8d3de54b..81d495a35cb 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/index.md @@ -105,11 +105,11 @@ _Note que a explicação no vídeo usa o termo "Camada 2" para se referir a toda - [Um cronograma do Ethereum centrado em rollups](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [Análises atualizadas sobre o dimensionamento da camada 2 para Ethereum](https://www.l2beat.com/) - [Avaliando as soluções de dimensionamento da camada 2 de Ethereum: um esquema de comparação](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Um guia incompleto sobre rollups](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Um guia incompleto sobre rollups](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum com tecnologia de ZK-Rollups: campeões do mundo](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistic Rollups vs ZK Rollups](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [Dimensionamento blockchain de conhecimento zero](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Por que os rollups, junto com as fragmentações dos dados, são a única solução sustentável para atingir alto dimensionamento](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [Que tipo de camada 3 faz sentido?](https://vitalik.ca/general/2022/09/17/layer_3.html) +- [Que tipo de camada 3 faz sentido?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) _Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ diff --git a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md index 7e03809f057..e1762f53c3a 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/optimistic-rollups/index.md @@ -208,7 +208,7 @@ Conforme explicado, os optimistic rollups publicam dados de transações compact A cadeia principal da Ethereum coloca limites sobre quantos blocos de dados podem conter, denominados em unidades de gás (o [tamanho médio do bloco](/developers/docs/blocks/#block-size) é de 15 milhões de gás). Embora isso restrinja quanto gás cada transação pode usar, também significa que podemos aumentar as transações processadas por bloco reduzindo os dados relacionados à transação, melhorando diretamenteo dimensionamento. -Os optimistic rollups usam várias técnicas para obter a compressão de dados de transação e melhorar as taxas de TPS. Por exemplo, este [artigo](https://vitalik.ca/general/2021/01/05/rollup.html) compara os dados que uma transação básica do usuário (enviando ether) gera na rede principal com a quantidade de dados que a mesma transação gera em um rollup: +Os optimistic rollups usam várias técnicas para obter a compressão de dados de transação e melhorar as taxas de TPS. Por exemplo, este [artigo](https://vitalik.eth.limo/general/2021/01/05/rollup.html) compara os dados que uma transação básica do usuário (enviando ether) gera na rede principal com a quantidade de dados que a mesma transação gera em um rollup: | Parâmetro | Ethereum (L1) | Rollup (L2) | | ---------- | ---------------------------- | ------------- | diff --git a/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md b/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md index 3339bb28c39..c706aaff4a3 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/plasma/index.md @@ -169,7 +169,7 @@ Vários projetos fornecem implementações da cadeia Plasma que você pode integ - [Aprenda sobre a cadeia Plasma](https://www.learnplasma.org/en/) - [Um lembrete rápido do que significa "segurança compartilhada" e por que é tão importante](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [Sidechains vs Plasma vs Sharding](https://vitalik.ca/general/2019/06/12/plasma_vs_sharding.html) +- [Sidechains vs Plasma vs Sharding](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) - [Entenda a cadeia Plasma - parte 1: O básico](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) - [A vida e a morte da cadeia Plasma](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) diff --git a/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md b/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md index b82f9847c5b..d1a7e0a8235 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/sidechains/index.md @@ -7,7 +7,7 @@ sidebarDepth: 3 Uma sidechain é uma blockchain separada que se executa independente do Ethereum e está conectada à rede principal do Ethereum por uma bridge nos dois sentidos. As sidechains podem ter parâmetros de blocos separados e [algoritmos de consenso](/developers/docs/consensus-mechanisms/), que são geralmente projetados para um processamento eficiente de transações. Entretanto, usar uma sidechain tem vantagens e desvantagens, já que elas não herdam as propriedades de segurança do Ethereum. Ao contrário das [soluções de dimensionamento da camada 2](/layer-2/), as sidechains não publicam alterações no estado e dados de transação de volta à rede principal do Ethereum. -As sidechains também sacrificam alguma medida de descentralização ou segurança para alcançar alta vazão de dados ([trilema do dimensionamento](https://vitalik.ca/general/2021/05/23/scaling.html)). O Ethereum, no entanto, comprometeu-se a dimensionar sem comprometer a descentralização e a segurança, conforme descrito na sua [declaração de visão](/roadmap/vision/) relacionada a atualizações. +As sidechains também sacrificam alguma medida de descentralização ou segurança para alcançar alta vazão de dados ([trilema do dimensionamento](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). O Ethereum, no entanto, comprometeu-se a dimensionar sem comprometer a descentralização e a segurança, conforme descrito na sua [declaração de visão](/roadmap/vision/) relacionada a atualizações. ## Como funcionam as sidechains? {#how-do-sidechains-work} diff --git a/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md index 7da116c6973..37733d00f40 100644 --- a/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/pt-br/developers/docs/scaling/zk-rollups/index.md @@ -248,5 +248,5 @@ Os projetos que trabalham em zkEVMs incluem: - [O que é um zkEVM?](https://www.alchemy.com/overviews/zkevm) - [Introdução a zkEVMs](https://hackmd.io/@yezhang/S1_KMMbGt) - [Recursos incríveis para zkEVM](https://github.com/LuozhuZhang/awesome-zkevm) -- [ZK-SNARKS nos bastidores](https://vitalik.ca/general/2017/02/01/zk_snarks.html) -- [SNARKs: como são possíveis?](https://vitalik.ca/general/2021/01/26/snarks.html) +- [ZK-SNARKS nos bastidores](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [SNARKs: como são possíveis?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/pt-br/governance/index.md b/public/content/translations/pt-br/governance/index.md index 45c51170bca..c233a4f2245 100644 --- a/public/content/translations/pt-br/governance/index.md +++ b/public/content/translations/pt-br/governance/index.md @@ -175,9 +175,9 @@ Quando ocorreu a fusão da Beacon Chain com a camada de execução do Ethereum e A governança na Ethereum não está definida de forma rígida. Vários participantes da comunidade têm diversas perspectivas sobre isso. Aqui estão alguns deles: -- [Notas sobre governaça da Blockchain](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Notas sobre governaça da Blockchain](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Como funciona a governança Ethereum?](https://cryptotesters.com/blog/ethereum-governance) – _Criptotesters_ - [Como funciona a governança Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [O que é um desenvolvedor principal Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) – _Hudson Jameson_ -- [Governança, Parte 2: A plutocracia ainda é uma desvantagem](https://vitalik.ca/general/2018/03/28/plutocracy.html) – _Vitalik Buterin_ -- [Indo além da governança por meio da votação com moedas.](https://vitalik.ca/general/2021/08/16/voting3.html) – _Vitalik Buterin_ +- [Governança, Parte 2: A plutocracia ainda é uma desvantagem](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) – _Vitalik Buterin_ +- [Indo além da governança por meio da votação com moedas.](https://vitalik.eth.limo/general/2021/08/16/voting3.html) – _Vitalik Buterin_ diff --git a/public/content/translations/pt-br/roadmap/account-abstraction/index.md b/public/content/translations/pt-br/roadmap/account-abstraction/index.md index 8394e092bb5..88cdc8a6cca 100644 --- a/public/content/translations/pt-br/roadmap/account-abstraction/index.md +++ b/public/content/translations/pt-br/roadmap/account-abstraction/index.md @@ -117,7 +117,7 @@ As carteiras de contratos inteligentes já estão disponíveis, mas são necess - ["Por que a abstração de contas é um agente de mudança para dApps", Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) - ["Abstração de conta ELI5", Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Notas sobre o "Caminho para abstração de contas", Vitalik](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Publicação do blog de Vitalik sobre carteiras de recuperação social](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Publicação do blog de Vitalik sobre carteiras de recuperação social](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [Notas EIP-2938](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [Documentação EIP-2938](https://eips.ethereum.org/EIPS/eip-2938) - [Notas EIP-4337](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/pt-br/roadmap/verkle-trees/index.md b/public/content/translations/pt-br/roadmap/verkle-trees/index.md index dd2201d53ef..45f3c969463 100644 --- a/public/content/translations/pt-br/roadmap/verkle-trees/index.md +++ b/public/content/translations/pt-br/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ As redes de testes de Verkle Trees já estão em execução, mas ainda há atual - ["Como as Verkle Trees tornam o Ethereum simples e eficiente", por Guillaume Ballet na Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam sobre clientes sem estado da ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Dankrad Fiest explica as Verkle Trees e a condição sem estado no podcast Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Vitalik Buterin sobre Verkle Trees](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Vitalik Buterin sobre Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist sobre Verkle Trees](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Documentação de EIO da Verkle Tree](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/pt-br/zero-knowledge-proofs/index.md b/public/content/translations/pt-br/zero-knowledge-proofs/index.md index 86a516ff5a6..6aafda6c72a 100644 --- a/public/content/translations/pt-br/zero-knowledge-proofs/index.md +++ b/public/content/translations/pt-br/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK é considerado imune à ameaça de computação quântica, pois usa has - [Uma prova de conhecimento zero: melhorando a privacidade em uma blockchain](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARKs — Um exemplo realista de conhecimento zero e aprofundamento](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARKs — Crie confiança verificável, mesmo contra computadores quânticos](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adão Luciano_ -- [Uma introdução aproximada de como os zk-SNARKs são possíveis](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [Uma introdução aproximada de como os zk-SNARKs são possíveis](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [O que é prova de conhecimento zero e seu papel na blockchain?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/pt/dao/index.md b/public/content/translations/pt/dao/index.md index 437cf930fbd..78b82525735 100644 --- a/public/content/translations/pt/dao/index.md +++ b/public/content/translations/pt/dao/index.md @@ -156,7 +156,7 @@ _Tipicamente utilizado para o desenvolvimento descentralizado e governação de - [Como iniciar uma comunidade digital potenciada por DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/) - [O que é uma DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) - [Coinmarketcap](https://coinmarketcap.com) - [O que é o Consenso Holográfico?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [As DAO não são empresas: onde é importante a descentralização em organizações autónomas, por Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [As DAO não são empresas: onde é importante a descentralização em organizações autónomas, por Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA e mais: Um Guia de Terminologia Incompleto](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Blog do Ethereum](https://blog.ethereum.org) ### Vídeos {#videos} diff --git a/public/content/translations/pt/decentralized-identity/index.md b/public/content/translations/pt/decentralized-identity/index.md index 2feee6de53f..20efacb5fad 100644 --- a/public/content/translations/pt/decentralized-identity/index.md +++ b/public/content/translations/pt/decentralized-identity/index.md @@ -109,7 +109,7 @@ Segue-se um exemplo para mostrar como os certificados na cadeia podem funcionar ### Tokens Soulbound (de alma) e identidade {#soulbound} -[Tokens Soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) (NFTs não transferíveis) podem ser utilizados para recolher informações exclusivas de uma carteira específica. Isto cria efetivamente uma identidade única na cadeia ligada a um endereço Ethereum específico que pode incluir tokens que representam realizações (por exemplo, terminar um curso online específico ou passar uma pontuação limite num jogo) ou participação na comunidade. +[Tokens Soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (NFTs não transferíveis) podem ser utilizados para recolher informações exclusivas de uma carteira específica. Isto cria efetivamente uma identidade única na cadeia ligada a um endereço Ethereum específico que pode incluir tokens que representam realizações (por exemplo, terminar um curso online específico ou passar uma pontuação limite num jogo) ou participação na comunidade. ## Benefícios da identidade descentralizada {#benefits-of-decentralized-identity} diff --git a/public/content/translations/pt/desci/index.md b/public/content/translations/pt/desci/index.md index 1e8a0f5f8bb..6561239c38b 100644 --- a/public/content/translations/pt/desci/index.md +++ b/public/content/translations/pt/desci/index.md @@ -76,7 +76,7 @@ A propriedade intelectual (PI) é um enorme problema na ciência tradicional: de Da mesma forma que os NFTs podem transferir as receitas de transações futuras para o criador original, é possível estabelecer cadeias de atribuição de valor transparente para recompensar investigadores, organismos governamentais (como os DAOs) ou mesmo os participantes cujos dados são recolhidos. -[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) também podem funcionar como uma chave para um repositório de dados descentralizado das experiências de pesquisa que estão a ser realizadas, e ligar-se à NFT e à financiarização [DeFi](/defi/) (desde a fraccionalização a pools de empréstimos e avaliação de valor). Também permite que entidades nativamente on-chain, como DAOs como [VitaDAO](https://www.vitadao.com/), conduzam pesquisas diretamente on-chain. O surgimento de tokens não transferíveis ["soulbound" tokens](https://vitalik.ca/general/2022/01/26/soulbound.html) também pode desempenhar um papel importante no DeSci, permitindo que os indivíduos comprovem a sua experiência e as credenciais ligadas ao seu endereço Ethereum. +[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) também podem funcionar como uma chave para um repositório de dados descentralizado das experiências de pesquisa que estão a ser realizadas, e ligar-se à NFT e à financiarização [DeFi](/defi/) (desde a fraccionalização a pools de empréstimos e avaliação de valor). Também permite que entidades nativamente on-chain, como DAOs como [VitaDAO](https://www.vitadao.com/), conduzam pesquisas diretamente on-chain. O surgimento de tokens não transferíveis ["soulbound" tokens](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) também pode desempenhar um papel importante no DeSci, permitindo que os indivíduos comprovem a sua experiência e as credenciais ligadas ao seu endereço Ethereum. ### Armazenamento de dados, acesso e arquitetura {#data-storage} diff --git a/public/content/translations/ro/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/ro/developers/docs/consensus-mechanisms/pos/index.md index bea6f3acf0b..dc50bb0c6aa 100644 --- a/public/content/translations/ro/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/ro/developers/docs/consensus-mechanisms/pos/index.md @@ -84,11 +84,11 @@ Penalizările mizei, ejecțiile, și alte sancțiuni, coordonate de lanțul beac ## Referințe suplimentare {#further-reading} -- [Întrebări frecvente despre Dovada-mizei](https://vitalik.ca/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Întrebări frecvente despre Dovada-mizei](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [Ce este Dovada-mizei](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ - [Ce este Dovada-mizei și de ce este importantă](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ - [Explicatorul lanțului Beacon Ethereum 2.0 pe care trebuie să îl citiți mai întâi](https://ethos.dev/beacon-chain/) _Ethos.dev_ -- [De ce Dovada-mizei (Nov 2020)](https://vitalik.ca/general/2020/11/06/pos2020.html) _VitaIik Buterin_ +- [De ce Dovada-mizei (Nov 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _VitaIik Buterin_ - [Dovada-mizei: Cum am învățat să ador subiectivitatea slabă](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [Filosofia conceperii Dovezii-mizei](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/ro/developers/docs/scaling/index.md b/public/content/translations/ro/developers/docs/scaling/index.md index 7f89f6bb705..c2e7baf5bd8 100644 --- a/public/content/translations/ro/developers/docs/scaling/index.md +++ b/public/content/translations/ro/developers/docs/scaling/index.md @@ -103,7 +103,7 @@ _Rețineți că explicația din videoclip folosește termenul "Nivelul 2" pentru - [O foaie de parcurs Ethereum centrată pe rollup-uri](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [Analize actualizate privind soluțiile de scalare de nivel 2 pentru Ethereum](https://www.l2beat.com/) - [Evaluarea soluțiilor de scalare a nivelului 2 pentru Ethereum: Un framework de comparație](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Un ghid incomplet pentru rollup-uri](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Un ghid incomplet pentru rollup-uri](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [ZK-rollup-urile acţionate de Ethereum: campionii lumii](https://hackmd.io/@canti/rkUT0BD8K) - [Rollup-urile Optimistic în comparaţie cu ZK Rollup-urile](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [Zero-Knowledge Blockchain Scalability](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) diff --git a/public/content/translations/ro/energy-consumption/index.md b/public/content/translations/ro/energy-consumption/index.md index 1aa4ae6060a..38c70bf86be 100644 --- a/public/content/translations/ro/energy-consumption/index.md +++ b/public/content/translations/ro/energy-consumption/index.md @@ -24,7 +24,7 @@ Dovada-muncii este o modalitate solidă de a securiza rețeaua și de a impune m Un viitor mai ecologic pentru Ethereum este deja în curs de construcție sub forma unui [lanț bazat pe **dovada-mizei (PoS)**](/roadmap/beacon-chain/). În cadrul [dovezii-mizei](/developers/docs/consensus-mechanisms/pos/), nu mai este necesară rezolvarea de puzzle-uri arbitrare. Eliminarea rezolvării puzzle-urilor scade semnificativ cheltuielile cu energia necesară pentru a securiza rețeaua. Miner-ii sunt înlocuiți cu validatori, care îndeplinesc aceeași funcție, cu deosebirea că, în loc să-și cheltuiască activele în avans sub forma muncii de calcul, aceștia mizează ETH drept garanție față de un comportament necinstit. Dacă validatorul este leneș, (este off-line atunci când acesta ar trebui să îndeplinească o anumită obligație de validator), ETH-ul pe care a mizat se poate scurge încet-încet, în timp ce un comportament necinstit demonstrabil poate duce la o „reducere” a activelor mizate. Aceasta stimulează semnificativ participarea activă și onestă la securizarea rețelei. -În mod asemănător cu dovada-muncii, o entitate rău intenționată ar avea nevoie de cel puțin 51% din totalul ETH-ului mizat pentru un [atac de 51%](/glossary/#51-attack). Însă, spre deosebire de dovada-muncii, unde pierderea potențială în urma unui astfel de atac constă numai din costul generării puterii hash necesare pentru minare, în cazul dovezii-mizei pierderea potențială în urma unui atac este întreaga sumă de ETH folosită ca garanție. Această structură de descurajare permite securitatea rețelei cu ajutorul dovezii-mizei, eliminând în același timp nevoia de a cheltui energie pe calcule aleatorii. Puteți afla explicații amănunțite cu privire la securitatea rețelei prin dovada-mizei [aici](/developers/docs/consensus-mechanisms/pos/) și [aici](https://vitalik.ca/general/2017/12/31/pos_faq.html). +În mod asemănător cu dovada-muncii, o entitate rău intenționată ar avea nevoie de cel puțin 51% din totalul ETH-ului mizat pentru un [atac de 51%](/glossary/#51-attack). Însă, spre deosebire de dovada-muncii, unde pierderea potențială în urma unui astfel de atac constă numai din costul generării puterii hash necesare pentru minare, în cazul dovezii-mizei pierderea potențială în urma unui atac este întreaga sumă de ETH folosită ca garanție. Această structură de descurajare permite securitatea rețelei cu ajutorul dovezii-mizei, eliminând în același timp nevoia de a cheltui energie pe calcule aleatorii. Puteți afla explicații amănunțite cu privire la securitatea rețelei prin dovada-mizei [aici](/developers/docs/consensus-mechanisms/pos/) și [aici](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html). ## Fuziunea {#the-merge} diff --git a/public/content/translations/ro/governance/index.md b/public/content/translations/ro/governance/index.md index aad01e0f3fe..97a9480ee83 100644 --- a/public/content/translations/ro/governance/index.md +++ b/public/content/translations/ro/governance/index.md @@ -174,9 +174,9 @@ Când Lanțul Beacon se va uni cu nivelul execuției în Ethereum, procesul de g Guvernanța în Ethereum nu este definită rigid. Diverși participanți ai comunității au perspective diferite în această privință. Iată câteva dintre acestea: -- [Note cu privire la Guvernanța Blockchain-ului](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Note cu privire la Guvernanța Blockchain-ului](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Cum funcționează guvernanța în Ethereum?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [Cum funcționează guvernarea în Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Ce este un dezvoltator de bază în Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [Guvernanța, Partea a 2-a: Plutocrația este încă gravă](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [Depășirea guvernării prin votul cu monede](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [Guvernanța, Partea a 2-a: Plutocrația este încă gravă](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [Depășirea guvernării prin votul cu monede](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/ro/whitepaper/index.md b/public/content/translations/ro/whitepaper/index.md index b66ffa436fe..17740d45b7b 100644 --- a/public/content/translations/ro/whitepaper/index.md +++ b/public/content/translations/ro/whitepaper/index.md @@ -23,7 +23,7 @@ Conceptul de monedă digitală descentralizată, precum și aplicațiile alterna Mecanismul din spatele dovezii muncii a fost un progres astronomic, deoarece a rezolvat simultan două probleme. În primul rând, a furnizat un algoritm de consens simplu și moderat eficient, permițând nodurilor din rețea să convină în mod colectiv asupra unui set de actualizări canonice ale statului registrului Bitcoin. În al doilea rând, a oferit un mecanism pentru a permite intrarea liberă în procesul de consens, rezolvând problema politică de a decide cine ajunge să influențeze consensul, prevenind simultan atacurile de tip „sybil”. Face acest lucru prin substituirea unei bariere formale în calea participării, cum ar fi cerința de a fi înregistrată ca entitate unică pe o anumită listă, cu o barieră economică - greutatea unui singur nod în procesul de votare consens este direct proporțională cu puterea de calcul pe care o aduce nodul. De atunci, a fost propusă o abordare alternativă numită _dovada mizei_ (PoS), calculând greutatea unui nod ca fiind proporțională cu deținerile sale valutare și nu cu resursele de calcul; discutarea meritelor relative ale celor două abordări depășește scopul lucrării acesteia, dar trebuie remarcat faptul că ambele abordări pot fi utilizate pentru a servi drept coloana vertebrală a unei criptomonede. -Iată o postare de pe blogul lui Vitalik Buterin, fondatorul Ethereum, despre [Preistoria Ethereum](https://vitalik.ca/general/2017/09/14/prehistory.html). [Aici](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) este o altă postare de pe blog cu mai multă istorie. +Iată o postare de pe blogul lui Vitalik Buterin, fondatorul Ethereum, despre [Preistoria Ethereum](https://vitalik.eth.limo/general/2017/09/14/prehistory.html). [Aici](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) este o altă postare de pe blog cu mai multă istorie. ### Bitcoin ca un sistem de tranziție de stare {#bitcoin-as-a-state-transition-system} diff --git a/public/content/translations/ru/community/research/index.md b/public/content/translations/ru/community/research/index.md index 15e9ae7fc23..aa6914a9cbb 100644 --- a/public/content/translations/ru/community/research/index.md +++ b/public/content/translations/ru/community/research/index.md @@ -71,7 +71,7 @@ lang: ru - [Пути к экспирации состояния](https://hackmd.io/@vbuterin/state_expiry_paths) - [Предложения по древам Веркла и экспирации состояния](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) - [Управление историей](https://eips.ethereum.org/EIPS/eip-4444) -- [Древа Веркла](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Древа Веркла](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Выборка доступности данных](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## Разработка клиентов {#client-development} diff --git a/public/content/translations/ru/dao/index.md b/public/content/translations/ru/dao/index.md index 4cf79166518..83125dcf3ac 100644 --- a/public/content/translations/ru/dao/index.md +++ b/public/content/translations/ru/dao/index.md @@ -156,7 +156,7 @@ _Обычно используется для децентрализованно - [Как создать цифровое сообщество на базе DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) — [DAOhaus](https://daohaus.club/) - [Что такое DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) — [Coinmarketcap](https://coinmarketcap.com) - [Что такое голографический консенсус?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) — [DAOstack](https://daostack.io/) -- [DAO — не корпорации: когда децентрализация в автономных организациях имеет значение](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO — не корпорации: когда децентрализация в автономных организациях имеет значение](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA и другие: неполное руководство по терминологии](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) — [блог Ethereum](https://blog.ethereum.org) ### Видео {#videos} diff --git a/public/content/translations/ru/decentralized-identity/index.md b/public/content/translations/ru/decentralized-identity/index.md index b0eb3459a24..b540a1d764e 100644 --- a/public/content/translations/ru/decentralized-identity/index.md +++ b/public/content/translations/ru/decentralized-identity/index.md @@ -109,7 +109,7 @@ summaryPoint3: Благодаря криптовалюте у пользоват ### Токены Soulbound и личность {#soulbound} -[Токены Soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) (непередаваемые NFT) можно использовать для сбора информации, уникальной для конкретного кошелька. Это эффективно создает уникальную идентификацию в сети, привязанную к конкретному адресу Ethereum, которая может включать токены, представляющие достижения (например, окончание определенного онлайн-курса или достижение порогового балла в игре) или участие в сообществе. +[Токены Soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (непередаваемые NFT) можно использовать для сбора информации, уникальной для конкретного кошелька. Это эффективно создает уникальную идентификацию в сети, привязанную к конкретному адресу Ethereum, которая может включать токены, представляющие достижения (например, окончание определенного онлайн-курса или достижение порогового балла в игре) или участие в сообществе. ## Преимущества децентрализованной идентификации {#benefits-of-decentralized-identity} diff --git a/public/content/translations/ru/desci/index.md b/public/content/translations/ru/desci/index.md index 7a6a92477ab..b324d44a6a3 100644 --- a/public/content/translations/ru/desci/index.md +++ b/public/content/translations/ru/desci/index.md @@ -76,7 +76,7 @@ Web3 обладает потенциалом, который позволит р Таким же образом, что и NFT могут передавать доход для будущих транзакций первоначальному создателю, вы можете установить прозрачные цепочки атрибутов ценности для вознаграждения исследователей, руководящих органов (как DAO), или даже тем субъектам, чьи данные собираются. -[Токены IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) также могут функционировать как ключ к децентрализованному хранилищу данных проводимых исследовательских экспериментов и подключаться к NFT и [DeFi](/defi/) (от фракционирования до кредитных пулов и оценки стоимости). Это также позволяет находящимся на цепочке сущностям, таким как DAO (например [VitaDAO](https://www.vitadao.com/)), проводить исследования непосредственно на цепочке. Появление непередаваемых [токенов soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) может также сыграть важную роль в DeSci, позволяя людям подтверждать свой опыт и учетные данные, связанные с их адресом Ethereum. +[Токены IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) также могут функционировать как ключ к децентрализованному хранилищу данных проводимых исследовательских экспериментов и подключаться к NFT и [DeFi](/defi/) (от фракционирования до кредитных пулов и оценки стоимости). Это также позволяет находящимся на цепочке сущностям, таким как DAO (например [VitaDAO](https://www.vitadao.com/)), проводить исследования непосредственно на цепочке. Появление непередаваемых [токенов soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) может также сыграть важную роль в DeSci, позволяя людям подтверждать свой опыт и учетные данные, связанные с их адресом Ethereum. ### Хранение данных, доступ и архитектура {#data-storage} diff --git a/public/content/translations/ru/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/ru/developers/docs/consensus-mechanisms/pos/index.md index 38824ff3d8a..874a35ef4ec 100644 --- a/public/content/translations/ru/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/ru/developers/docs/consensus-mechanisms/pos/index.md @@ -84,11 +84,11 @@ PoS требует от пользователей вкладывать свои ## Дополнительные ресурсы {#further-reading} -- [Доказательство владения: часто задаваемые вопросы](https://vitalik.ca/general/2017/12/31/pos_faq.html) — _Виталик Бутерин_ +- [Доказательство владения: часто задаваемые вопросы](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) — _Виталик Бутерин_ - [Что такое доказательство владения](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) — _ConsenSys_ - [Что такое доказательство владения и почему это важно](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) — _Виталик Бутерин_ - [Объяснение сети Beacon Chain Ethereum 2.0, которое вам нужно прочитать в первую очередь](https://ethos.dev/beacon-chain/) — _Ethos.dev_ -- [Почему именно доказательство владения (ноябрь 2020 г.)](https://vitalik.ca/general/2020/11/06/pos2020.html) — _Виталик Бутерин_ +- [Почему именно доказательство владения (ноябрь 2020 г.)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) — _Виталик Бутерин_ - [Доказательство владения: как я научился любить слабую субъективность (Weak Subjectivity)](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) — _Виталик Бутерин_ - [Философия дизайна доказательства владения](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) — _Виталик Бутерин_ diff --git a/public/content/translations/ru/governance/index.md b/public/content/translations/ru/governance/index.md index 3ee8f5b23c1..d8c5e2e6636 100644 --- a/public/content/translations/ru/governance/index.md +++ b/public/content/translations/ru/governance/index.md @@ -175,9 +175,9 @@ _Примечание. Любой человек может входить в н В Ethereum нет строгой структуры. У разных участников сообщества есть собственные взгляды на развитие системы. Вот некоторые из них: -- [Заметки об управлении блокчейном](https://vitalik.ca/general/2017/12/17/voting.html) _Виталик Бутерин_ +- [Заметки об управлении блокчейном](https://vitalik.eth.limo/general/2017/12/17/voting.html) _Виталик Бутерин_ - [Как работает управление Ethereum?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [Как работает управление Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Кто такой основной разработчик Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) — _Hudson Jameson_ -- [Управление, часть 2. Плутократия — это все еще плохо](https://vitalik.ca/general/2018/03/28/plutocracy.html) — _Виталик Бутерин_ -- [Выход за рамки управления с голосованием монетами](https://vitalik.ca/general/2021/08/16/voting3.html) — _Виталик Бутерин_ +- [Управление, часть 2. Плутократия — это все еще плохо](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) — _Виталик Бутерин_ +- [Выход за рамки управления с голосованием монетами](https://vitalik.eth.limo/general/2021/08/16/voting3.html) — _Виталик Бутерин_ diff --git a/public/content/translations/ru/roadmap/account-abstraction/index.md b/public/content/translations/ru/roadmap/account-abstraction/index.md index 502454c5f94..f5529cf2e8d 100644 --- a/public/content/translations/ru/roadmap/account-abstraction/index.md +++ b/public/content/translations/ru/roadmap/account-abstraction/index.md @@ -117,7 +117,7 @@ EIP-4337 — это первый шаг к поддержке нативных - [«Почему абстрагирование аккаунтов несет радикальные перемены для децентрализованных приложений» от Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) - [«Абстрагирование аккаунтов — ELI5» от Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Заметки Виталика «Дорога к абстрагированию аккаунтов»](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Блог Виталика о кошельках для социального восстановления](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Блог Виталика о кошельках для социального восстановления](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [Примечания к EIP-2938](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [Документация EIP-2938](https://eips.ethereum.org/EIPS/eip-2938) - [Примечания к EIP-4337](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/ru/roadmap/verkle-trees/index.md b/public/content/translations/ru/roadmap/verkle-trees/index.md index f666b766445..62685faba90 100644 --- a/public/content/translations/ru/roadmap/verkle-trees/index.md +++ b/public/content/translations/ru/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ summaryPoints: - [«Как древа Меркла делают Ethereum эффективным и готовым к работе» — Гийом Балле, Devcon 6](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Пайпер Мерриам о клиентах без состояния на ETHDenver 2020](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Данкрад Фейст объясняет деревья Веркла и клиенты без состояния в подкасте Zero Knowledge](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Виталик Бутерин о деревьях Веркла](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Виталик Бутерин о деревьях Веркла](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Данкрад Фейст о деревьях Веркла](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Документация EIP деревьев Веркла](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/ru/zero-knowledge-proofs/index.md b/public/content/translations/ru/zero-knowledge-proofs/index.md index 133ba51adb5..4fa23655a2e 100644 --- a/public/content/translations/ru/zero-knowledge-proofs/index.md +++ b/public/content/translations/ru/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK считается защищенным от угрозы кванто - [Доказательство с нулевым разглашением: улучшение конфиденциальности в блокчейне](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Дмитрий Лавренов_ - [zk-SNARK — реалистичный пример нулевого разглашения и глубокое погружение в него](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Адам Лучиано_ - [ZK-STARK — создание проверяемого доверия, даже несмотря на квантовые компьютеры](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Адам Лучиано_ -- [Примерное введение в работу zk-SNARK](https://vitalik.ca/general/2021/01/26/snarks.html) — _Виталик Бутерин_ +- [Примерное введение в работу zk-SNARK](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Виталик Бутерин_ - [Что такое доказательство с нулевым разглашением и какова его роль в блокчейне?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/translations/sl/developers/docs/scaling/index.md b/public/content/translations/sl/developers/docs/scaling/index.md index 97c8c1139d6..59830be24f7 100644 --- a/public/content/translations/sl/developers/docs/scaling/index.md +++ b/public/content/translations/sl/developers/docs/scaling/index.md @@ -103,7 +103,7 @@ _Upoštevajte, da razlaga v videu izraz "plast 2" uporablja za naslavljanje vseh - [Načrt Ethereum, osredotočen na zvitke](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [Aktualna analiza o rešitvah za širjenje Ethereuma s plastjo 2](https://www.l2beat.com/) - [Ocena rešitev za širjenje Ethereuma s plastjo 2: primerjalni okvir](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Nepopoln vodnik po zvitkih](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Nepopoln vodnik po zvitkih](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [ZK-zvitki, ki jih poganja Ethereum: World Beaters](https://hackmd.io/@canti/rkUT0BD8K) - [Optimistični zvitki proti ZK-zvitkom](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [Razširljivost blokovne verige brez znanja](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) diff --git a/public/content/translations/sr/dao/index.md b/public/content/translations/sr/dao/index.md index 1e2f77d3247..b7e06055afb 100644 --- a/public/content/translations/sr/dao/index.md +++ b/public/content/translations/sr/dao/index.md @@ -156,7 +156,7 @@ _Obično se koristi za decentralizovani razvoj i upravljanje protokolima i decen - [Kako pokrenuti digitalnu zajednicu koja koristi tehnologiju DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Šta je DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) — [Coinmarketcap](https://coinmarketcap.com) - [Šta je holografski konsenzus?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) – [DAOstack](https://daostack.io/) -- [DAO-i nisu korporacije: gde decentralizacija u autonomnim organizacijama ima značaj, autor: Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO-i nisu korporacije: gde decentralizacija u autonomnim organizacijama ima značaj, autor: Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO-i, DAC-i, DA-i i još mnogo toga: nedovršen vodič kroz terminologiju](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) – [Ethereum Blog](https://blog.ethereum.org) ### Videos {#videos} diff --git a/public/content/translations/sr/decentralized-identity/index.md b/public/content/translations/sr/decentralized-identity/index.md index fd4c1b8dd42..18d2c5fcbc5 100644 --- a/public/content/translations/sr/decentralized-identity/index.md +++ b/public/content/translations/sr/decentralized-identity/index.md @@ -109,7 +109,7 @@ Evo jednog primera da pokažemo kako potvrde na lancu funkcionišu u praksi: ### Soulbound tokeni i identitet {#soulbound} -[Soulbound tokeni](https://vitalik.ca/general/2022/01/26/soulbound.html) (NFT-ijevi koji se ne mogu prebacivati) se mogu koristiti kako bi se prikupile informacije koje su jedinstvene za određeni novčanik. Ovo efektivno stvara jedinstvenu identifikaciju na lancu blokova vezanu za određenu Ethereum adresu koja može uključivati tokene koji predstavljaju dostignuća (na primer, završavanje određenog onlajn kursa ili dostizanje određenog rezultata u igri) ili učešće u zajednici. +[Soulbound tokeni](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (NFT-ijevi koji se ne mogu prebacivati) se mogu koristiti kako bi se prikupile informacije koje su jedinstvene za određeni novčanik. Ovo efektivno stvara jedinstvenu identifikaciju na lancu blokova vezanu za određenu Ethereum adresu koja može uključivati tokene koji predstavljaju dostignuća (na primer, završavanje određenog onlajn kursa ili dostizanje određenog rezultata u igri) ili učešće u zajednici. ## Benefiti decentralizovanog identiteta {#benefits-of-decentralized-identity} diff --git a/public/content/translations/sr/desci/index.md b/public/content/translations/sr/desci/index.md index b9b8991b0fe..a5235a7f89c 100644 --- a/public/content/translations/sr/desci/index.md +++ b/public/content/translations/sr/desci/index.md @@ -76,7 +76,7 @@ Intelektualna svojina (IP) predstavlja veliki problem u tradicionalnoj nauci: od Na isti način na koji NFT-jevi mogu omogućiti prenos prihoda za buduće transakcije nazad originalnom tvorcu, isto tako i vi možete uspostaviti transparentne lance za pripisivanje vrednosti kako biste nagrađivali istraživače, upravne organe (kao što su DAO-ovi) ili čak subjekte čiji se podaci prikupljaju. -[NFT-ovi sa intelektualnom svojinom](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) takođe mogu da funkcionišu kao ključ za decentralizovani repozitorijum podataka o istraživačkim eksperimentima koji se sprovode, i integrisati se u NFT i finansiranje [decentralizovanih finansija](/defi/) (od razlaganja do fondova za davanje pozajmica i procene vrednosti). Takođe omogućava da entiteti koji su na lancu kao što su DAO-ovi poput [VitaDAO](https://www.vitadao.com/) direktno sprovode istraživanja na lancu. Dolazak neotuđivih ["soulbound" tokena](https://vitalik.ca/general/2022/01/26/soulbound.html) takođe može odigrati važnu ulogu u DeSci omogućavajući pojedincima da dokažu svoje iskustvo i akademske kvalifikacije povezane sa njihovom Ethereum adresom. +[NFT-ovi sa intelektualnom svojinom](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) takođe mogu da funkcionišu kao ključ za decentralizovani repozitorijum podataka o istraživačkim eksperimentima koji se sprovode, i integrisati se u NFT i finansiranje [decentralizovanih finansija](/defi/) (od razlaganja do fondova za davanje pozajmica i procene vrednosti). Takođe omogućava da entiteti koji su na lancu kao što su DAO-ovi poput [VitaDAO](https://www.vitadao.com/) direktno sprovode istraživanja na lancu. Dolazak neotuđivih ["soulbound" tokena](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) takođe može odigrati važnu ulogu u DeSci omogućavajući pojedincima da dokažu svoje iskustvo i akademske kvalifikacije povezane sa njihovom Ethereum adresom. ### Skladišta podataka, pristup i arhitektura {#data-storage} diff --git a/public/content/translations/tr/bridges/index.md b/public/content/translations/tr/bridges/index.md index 14d3357c2fb..d2a806943d2 100644 --- a/public/content/translations/tr/bridges/index.md +++ b/public/content/translations/tr/bridges/index.md @@ -1,12 +1,12 @@ --- -title: Blok zincir köprülerine giriş +title: Blokzincir köprülerine giriş description: Köprüler, kullanıcıların varlıklarını farklı blok zincirler üstünde taşımalarını sağlar lang: tr --- # Blokzincir köprüleri {#prerequisites} -_Web3 L1 blok zincirler ve L2 ölçeklendirme çözümlerinin her birinin benzersiz yetenek ve ödünlestirmelerle tasarlandığı bir ekosisteme evrilmiştir. Blok zincir protokol sayısı arttıkça, [varlıkları zincirler arasında aktarma talebi]() de artmıştır. Bu talebi karşılamak için köprülere ihtiyacımız var._ +_Web3 L1 blok zincirler ve L2 ölçeklendirme çözümlerinin her birinin benzersiz yetenek ve ödünlestirmelerle tasarlandığı bir ekosisteme evrilmiştir. Blok zincir protokol sayısı arttıkça, [varlıkları zincirler arasında aktarma talebi](https://dune.xyz/eliasimos/Bridge-Away-(from-Ethereum)) de artmıştır. Bu talebi karşılamak için köprülere ihtiyacımız var._ @@ -30,7 +30,7 @@ Köprüler blok zincirleri birbirine bağlamak, aralarında bilgi ve token'ları Köprüler şunu etkinleştirir: -- bilgi ve varlıkların zincirler arasında iletimini +- bilgi ve varlıkların zincirler arası transferi. - dApp'ların birden çok blok zincirin güçlü yanını kullanmalarını - (protokoller şimdi inovasyon için daha fazla tasarım alanına sahipler) böylece kabiliyetlerini geliştirmelerini. - kullanıcıların yeni platformlara erişmelerini ve farklı zincirlerin faydalarını kullanmalarını. - farklı blok zincir ekosistemlerinden geliştiricilerin iş birliği yapmasını ve kullanıcılar için yeni platformlar inşa etmelerini sağlar. diff --git a/public/content/translations/tr/community/code-of-conduct/index.md b/public/content/translations/tr/community/code-of-conduct/index.md index 9e756517c43..8fea828a03b 100644 --- a/public/content/translations/tr/community/code-of-conduct/index.md +++ b/public/content/translations/tr/community/code-of-conduct/index.md @@ -52,7 +52,7 @@ Katılımcılar tarafından gerçekleştirilen kabul edilemez davranışlar: - Fiziksel şiddet, fiziksel şiddet ile tehdit etmek ya da her türlü fiziksel şiddete yatkınlık - Taciz dili veya görselleri kullanmak ya da istenmeyen/tek taraflı fiziksel ilgide bulunmak -- Başka bir bireyin kimliğine bürünmek veya bir kişi ya da kuruluşla dürüst olmayan bir şekilde bağlantı iddia etmek. +- Başka bir bireyin kimliğine bürünmek veya bir kişi ya da kuruluşla dürüst olmayan bir şekilde bağlantı iddia etmek - Dalga geçen, küçümseyen, hakaret içeren yorumlar ve kişisel ya da politik saldırılar - Diğer topluluk üyelerini genel veya özel kanallarda taciz etmek - Açık bir izin söz konusu olmadan diğer insanların kişisel bilgilerini paylaşmak, örneğin elektronik adres ve somut adres diff --git a/public/content/translations/tr/community/get-involved/index.md b/public/content/translations/tr/community/get-involved/index.md index 9a8d5bb934d..b61ecc0171a 100644 --- a/public/content/translations/tr/community/get-involved/index.md +++ b/public/content/translations/tr/community/get-involved/index.md @@ -28,7 +28,7 @@ Matematik, kriptografi ya da ekonomi alanlarında bir geçmişiniz var mı? Ethe - Bir Ethereum Geliştirme Önerisini yazın veya revize edin - Bir EIP yazın 1. Fikrinizi [Ethereum Magicians](https://ethereum-magicians.org)'a gönderin - 2. [EIP-1](https://eip.ethereum.org/EIPS/eip-1)'i okuyun -**Evet, bu dökümanın _tamamı._** + 2. [EIP-1](https://eips.ethereum.org/EIPS/eip-1) sayfasını okuyun. **Evet, bu dökümanın _tamamı._** 3. EIP-1'in yönergelerini takip edin. Taslağınızı hazırlarken, EIP-1 den referans alın. - Nasıl bir [EIP Editörü](https://eips.ethereum.org/EIPS/eip-5069) olacağınızı öğrenin - Siz de şu anda EIP'leri gözden geçirebilirsiniz! [Açılan PR taleplerini `e-inceleme`etikeyiyle görebilirsiniz](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review). Teknik geri bildirimlerinizi `tartışmalar` bağlantısına bırakın. diff --git a/public/content/translations/tr/community/grants/index.md b/public/content/translations/tr/community/grants/index.md index b20d8c0c311..eeb58a257e9 100644 --- a/public/content/translations/tr/community/grants/index.md +++ b/public/content/translations/tr/community/grants/index.md @@ -15,30 +15,26 @@ Bu liste topluluğumuz tarafından hazırlanmıştır. Eksik veya yanlış bir Bu programlar geniş bir proje yelpazesine hibeler sağlayarak geniş Ethereum ekosistemini desteklerler. Bunlar ölçeklenebilirlik, topluluk kurma, güvenlik, gizlilik gibi birçoğu için çözümleri kapsar. Bu hibeler herhangi bir Ethereum platformuna özel değildir ve emin değilseniz başlamak için iyi yerlerdir. - [EF Ekosistem Destek Programı](https://esp.ethereum.foundation) - _Temel odağı evrensel araçlar, altyapı, araştırma ve kamu yararı olmak üzere; Ethereum'a katkı sağlayan açık kaynak projeleri finanse eder_ -- [Ethereum RFP'leri](https://github.com/ethereum/requests-for-proposals) - _Ethereum Vakfı tarafından Ethereum ekosisteminin içerisindeki iş ve projeler için teklif talebi_ - [MetaCartel](https://www.metacartel.org/grants/) - _Dapp geliştirme, DAO oluşturma_ - [Moloch DAO](https://www.molochdao.com/) - _Gizlilik, katman 2 ölçeklendirme, istemci güvenliği ve dahası_ -- [Açık Hibeler](https://opengrants.com/explore) - [DAO Hibeleri](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Hibe sunan organizasyonların Google tablosu_ - [Web3 Hibeleri için Crunchbase](https://www.cryptoneur.xyz/web3-grants) - _Hibeleri kategori, kullanım alanı, miktar ve dahasına göre filtreleyin ve arayın. Diğerlerinin doğru hibeyi bulabilmesine yardımcı olmak için katkı sağlayın._ - [Akademik Hibeler](https://esp.ethereum.foundation/academic-grants) - _Ethereum ile ilgili akademik çalışmaları desteklemek için hibeler_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks, tüm hibelerin, RFP'lerin ve hata ödüllerinin kapsamlı bir dizinini derlemiştir._ ## Projeye özel {#project-specific} Bu projeler kendi teknolojilerini geliştirmeye ve deneyimlemeye yönelik olarak kendi hibelerini oluşturmuşlardır. - [Aave Hibe Programı](https://aavegrants.org/) – _[Aave](https://aave.com/) hibeleri DAO_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) ekosistem fonu_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) ekosistem fonu_ - [Chainlink Hibe Programı](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) toplum hi̇beleri̇_ -- [Compound Hibe Programı](https://compoundgrants.org/) – _[Compound](https://compound.finance/) finans ekosistemi_ - [Decentraland Hibe Programı](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverse_ -- [Lido Ekosistem Hibeleri Organizasyonu (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) finans ekosistemi_ +- [Lido Ekosistem Hibeleri Organizasyonu (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) finans ekosistemi_ - [MetaMask Programı](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) çalışanlar öncülüğünde yönetilen hibe DAO'su_ -- [mStable Hibe Programı](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) topluluğu_ - [SKALE Ağı Hibe Ekosistemi](https://skale.space/developers#grants) - _[SKALE Ağı](https://skale.space/) ekosistemi_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) ekosistemi_ -- [UMA Hibe Programı](https://grants.umaproject.org/) - _[UMA](https://umaproject.org/) geliştirici desteği_ -- [Uniswap Hibe Programı](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) topluluğu_ +- [Uniswap Grants Program](https://www.uniswapfoundation.org/apply-for-a-grant) - _[Uniswap](https://uniswap.org/) topluluğu_ - [Web3 Hibeleri](https://web3grants.net) - _Web3/kripto ile ilgili hibe programlarının geniş bir listesi_ ## İkinci dereceden finansman {#quadratic-funding} diff --git a/public/content/translations/tr/community/language-resources/index.md b/public/content/translations/tr/community/language-resources/index.md index b637b2fce13..c89d3899eed 100644 --- a/public/content/translations/tr/community/language-resources/index.md +++ b/public/content/translations/tr/community/language-resources/index.md @@ -72,7 +72,7 @@ Ethereum.org, [diller sayfamızda](/languages) bulabileceğiniz 40'tan fazla dil - [Gwei.cz](https://gwei.cz) - Web3 etrafında yerel topluluk, eğitim içeriği oluşturur, çevrimiçi ve yüz yüze etkinlikler düzenler - [Gwei.cz Příručka](https://prirucka.gwei.cz/) - yeni başlayanlar için Ethereum rehberi - [DAO Příručka](https://dao.gwei.cz/) - DAO'lara yeni başlayanlar için rehber -- [Ethereum'da Uzmanlaşma](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - Çekçe Ethereum'da Uzmanlaşmak +- [Ethereum'da Uzmanlaşma](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - Çekçe Ethereum'da Uzmanlaşmak ### Fransızca {#fr} diff --git a/public/content/translations/tr/community/online/index.md b/public/content/translations/tr/community/online/index.md index cd5499a1d33..16bde41ae48 100644 --- a/public/content/translations/tr/community/online/index.md +++ b/public/content/translations/tr/community/online/index.md @@ -24,13 +24,13 @@ Yüz binlerce Ethereum meraklısı, haberleri paylaşmak, son gelişmeler hakkı Ethereum Kedi Güdücüler - Ethereum geliştirmeye proje yönetimi desteği sunmaya odaklı topluluk Ethereum Bilgisayar Korsanları - ETHGlobal tarafından yürütülen Discord sohbeti: tüm dünyadaki Ethereum bilgisayar korsanları için çevrimiçi bir topluluk CryptoDevs - Ethereum geliştirme odaklı Discord topluluğu -EthStaker Discord - mevcut ve potansiyel kilitleyiciler için topluluk tarafından yönetilen rehberlik, eğitim, destek ve kaynaklar -Ethereum.org web sitesi ekibi - uğrayın ve ethereum.org web geliştirme ve tasarımı ekibi ile ve topluluktan insanlarla sohbet edin +EthStaker Discord - mevcut ve potansiyel kilitleyiciler için topluluk tarafından yönetilen rehberlik, eğitim, destek ve kaynaklar +Ethereum.org web sitesi ekibi - uğrayın ve ethereum.org web geliştirme ve tasarımı ekibi ile ve topluluktan insanlarla sohbet edin Matos Discord - yaratıcıların, endüstrinin önde gelenlerinin ve Ethereum meraklılarının takıldığı bir web3 yaratıcı topluluğu. Web3 geliştirme, tasarım ve kültürü hakkında tutkuluyuz. Gelin ve bizle beraber inşa edin. -Solidity Gitter - Solidity geliştirme için sohbet (Gitter) +Solidity Gitter - Solidity geliştirme için sohbet (Gitter) Solidity Matrix - Solidity geliştirme için sohbet (Matrix) -Ethereum StackExchange _- soru cevap forumu_ -Peeranha _- merkeziyetsiz soru cevap forumu_ +Ethereum StackExchange *- soru cevap forumu* +Peeranha *- merkeziyetsiz soru cevap forumu* ## YouTube ve Twitter {#youtube-and-twitter} diff --git a/public/content/translations/tr/community/research/index.md b/public/content/translations/tr/community/research/index.md index f7fa9d17480..93f9125f2b9 100644 --- a/public/content/translations/tr/community/research/index.md +++ b/public/content/translations/tr/community/research/index.md @@ -39,7 +39,7 @@ Mutabakat araştırması [Ethereum'un hisse ispatı mekanizması](/developers/do #### Arkaplan okuması {#background-reading} -- [Hisse İspatı'na Giriş](/developers/docs/consensus-mechanisms/pos/) +- [Hisse ispatı'na giriş](/developers/docs/consensus-mechanisms/pos/) - [Casper-FFG belgesi](https://arxiv.org/abs/1710.09437) - [Casper-FFG açıklayıcısı](https://arxiv.org/abs/1710.09437) - [Gasper belgesi](https://arxiv.org/abs/2003.03052) @@ -71,12 +71,12 @@ Yürütüm katmanı, işlemlerin yürütülmesi, [Ethereum sanal makinesinin (EV - [Durum sonlanmasına giden yollar](https://hackmd.io/@vbuterin/state_expiry_paths) - [Verkel ve durum sonlanması teklifleri](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) - [Geçmiş yönetimi](https://eips.ethereum.org/EIPS/eip-4444) -- [Verkle Ağaçları](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Verkle Ağaçları](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Veri kullanılabilirlik örneklendirmesi](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## İstemci Geliştirme {#client-development} -Ethereum istemcileri Ethereum protokolünün uygulamalarıdır. İstemci geliştirme süreci protokol araştırmalarını istemciler içine inşa ederek gerçeğe dönüştürüyor. İstemci geliştirme, spesifik uygulamaları inşa etmekle birlikte istemci özelleştirmelerini de kapsıyor. +Ethereum istemcileri Ethereum protokolünün uygulamalarıdır. İstemci geliştirme süreci protokol araştırmalarını istemciler içine inşa ederek gerçeğe dönüştürüyor. İstemci geliştirme, spesifik uygulamaları inşa etmekle birlikte istemci özelliklerini de kapsıyor. Bir Ethereum düğümü 2 parça yazılım olarak çalışmak zorunda: @@ -93,7 +93,7 @@ Düğümler ve istemciler hakkında daha detaylı bilgi ve güncel istemcilerin ### Fikir Birliği İstemcileri {#consensus-clients} - [Fikir birliği istemcisi özellikleri](https://github.com/ethereum/consensus-specs) -- [İşaret API özellikleri](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) +- [İşaret API'sı özellikleri](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) ## Ölçeklendirme ve performans {#scaling-and-performance} @@ -121,10 +121,10 @@ Katman 2'nin daha çok araştırma ve geliştirme gerektiren spesifik alanların #### Arkaplan okuması {#background-reading-3} -- [Blok zincir köprülerine giriş](/bridges/) +- [Blokzincir köprülerine giriş](/bridges/) - [Köprüler üzerine, Vitalik](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [Blok zincir köprüleri makalesi](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Köprülerde kilitli değer]() +- [Köprülerde kilitli değer](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Güncel araştırma {#recent-research-3} @@ -152,11 +152,11 @@ Ortalama bir donanımda [düğüm çalıştırmak](/developers/docs/nodes-and-cl #### Arkaplan okuması {#background-reading-5} -- [KOL üzerinde Ethereum](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) +- [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) #### Güncel araştırma {#recent-research-5} -- [FGPA'lar üzerine, ecdsa](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [FPGA'lar üzerine ecdsa](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## Güvenlik {#security} @@ -272,7 +272,7 @@ Likit hisseleme 32 ETH'den azına sahip olan kullanıcıların DeFi'da kullanıl #### Güncel araştırma {#recent-research-12} -- [Lido'dan çekimleri halletmek](https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) +- [Lido'dan para çekme işlemlerini yapmak](https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) - [Para çekme kimlik bilgileri](https://ethresear.ch/t/withdrawal-credential-rotation-from-bls-to-eth1/8722) - [Likit Hisseleme Türevlerinin riskleri](https://notes.ethereum.org/@djrtwo/risks-of-lsd) @@ -280,7 +280,7 @@ Likit hisseleme 32 ETH'den azına sahip olan kullanıcıların DeFi'da kullanıl ### Resmî doğrulama {#formal-verification} -Resmi doğrulama Ethereum'un mutabakat özelliklerinin doğru ve hatasız olduğunu doğrulamak için kod yazmaktır. Bu şartnamenin yönetim ve geliştirme gerektiren çalıştırılabilir bir sürümü Phytonda yazılmıştır. Bununla ilgili daha fazla araştırma bu şartnamenin Phyton üzerinde çalıştırılmasına yardımcı olabilir, doğruluğu daha güçlü bir şekilde doğrulayabilir ve sorunları tanımlayabilir. +Resmi doğrulama Ethereum'un mutabakat özelliklerinin doğru ve hatasız olduğunu doğrulamak için kod yazmaktır. Bu özelliklerin yönetim ve geliştirme gerektiren çalıştırılabilir bir sürümü Phytonda yazılmıştır. Bununla ilgili daha fazla araştırma bu özelliklerin Phyton üzerinde çalıştırılmasına yardımcı olabilir, doğruluğu daha güçlü bir şekilde doğrulayabilir ve sorunları tanımlayabilir. #### Arkaplan okuması {#background-reading-13} @@ -290,7 +290,7 @@ Resmi doğrulama Ethereum'un mutabakat özelliklerinin doğru ve hatasız olduğ #### Güncel araştırma {#recent-research-13} - [Depozito Sözleşmesinin resmi doğrulaması](https://github.com/runtimeverification/deposit-contract-verification) -- [İşaret Zinciri şartnamesinin resmi doğrulaması](https://github.com/runtimeverification/deposit-contract-verification) +- [İşaret Zinciri özelliklerinin resmi doğrulaması](https://github.com/runtimeverification/deposit-contract-verification) ## Veri bilimi ve analizler {#data-science-and-analytics} diff --git a/public/content/translations/tr/community/support/index.md b/public/content/translations/tr/community/support/index.md index 16d06d6b498..34f91d62670 100644 --- a/public/content/translations/tr/community/support/index.md +++ b/public/content/translations/tr/community/support/index.md @@ -39,7 +39,7 @@ Ethereum cüzdanı mı arıyorsunuz? [Ethereum cüzdanlarının tam listesini ke Geliştirme zor olabilir. İşte size yardımcı olmaktan mutluluk duyan deneyimli Ethereum geliştiricileri bulunan geliştirme odaklı bazı alanlar. - [Alchemy University](https://university.alchemy.com/#starter_code) -- [CryptoDevs Discord'u](https://discord.gg/Z9TA39m8Yu) +- [CryptoDevs Discord'u](https://discord.com/invite/5W5tVb3) - [Ethereum StackExchange](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Web3 University](https://www.web3.university/) @@ -53,7 +53,7 @@ Sorunuz belirli bir araç, proje veya kütüphane ile mi ilgili? Çoğu projede İşte bazı popüler örnekler: -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [Hardhat](https://discord.gg/xtrMGhmbfZ) @@ -65,7 +65,7 @@ Sorunuz belirli bir araç, proje veya kütüphane ile mi ilgili? Çoğu projede Bir düğüm veya doğrulayıcı çalıştırıyorsanız, başlamanıza yardımcı olmaya adanmış bazı toplulukları burada bulabilirsiniz. -- [EthStaker Discord'u](https://discord.io/ethstaker) +- [EthStaker Discord'u](https://discord.gg/ethstaker) - [EthStaker Reddit'i](https://www.reddit.com/r/ethstaker) Ethereum istemcileri geliştiren ekiplerin çoğu, destek alabileceğiniz ve soru sorabileceğiniz özel, herkese açık alanlara da sahiptir. diff --git a/public/content/translations/tr/dao/index.md b/public/content/translations/tr/dao/index.md index 04aeef5bf71..342e8130a1d 100644 --- a/public/content/translations/tr/dao/index.md +++ b/public/content/translations/tr/dao/index.md @@ -156,7 +156,7 @@ _Protokollerin ve merkeziyetsiz uygulamaların merkeziyetsiz gelişimi ve yönet - [DAO Destekli bir Dijital Topluluk Nasıl Başlatılır](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [Bir DAO nedir?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [Holografik Mutabakat Nedir?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO'lar Vitalik'e göre özerk kuruluşlarda ademi merkeziyetçiliğin önemli olduğu şirketler değildir:](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO'lar Vitalik'e göre özerk kuruluşlarda ademi merkeziyetçiliğin önemli olduğu şirketler değildir:](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO'lar, DAC'ler, DA'lar ve Daha Fazlası: Tamamlanmamış Terminoloji Rehberi](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blogu](https://blog.ethereum.org) ### Videolar {#videos} diff --git a/public/content/translations/tr/decentralized-identity/index.md b/public/content/translations/tr/decentralized-identity/index.md index 74c51c92c7d..21754ce68db 100644 --- a/public/content/translations/tr/decentralized-identity/index.md +++ b/public/content/translations/tr/decentralized-identity/index.md @@ -109,7 +109,7 @@ Burada, zincir üstündeki tasdiklerin uygulamada nasıl çalışabileceğine bi ### Soulbound token'lar ve kimlik {#soulbound} -[Soulbound token'lar](https://vitalik.ca/general/2022/01/26/soulbound.html) (aktarılamaz NFT'ler), belirli bir cüzdana özgü bilgileri toplamak için kullanılabilir. Bu, başarıları (örneğin, belirli bir çevrimiçi kursu bitirme veya bir oyunda bir eşik puanını geçme) veya topluluk katılımını temsil eden tokenleri içerebilen belirli bir Ethereum adresine bağlı benzersiz bir zincir-üstü kimlik oluşturur. +[Soulbound token'lar](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (aktarılamaz NFT'ler), belirli bir cüzdana özgü bilgileri toplamak için kullanılabilir. Bu, başarıları (örneğin, belirli bir çevrimiçi kursu bitirme veya bir oyunda bir eşik puanını geçme) veya topluluk katılımını temsil eden tokenleri içerebilen belirli bir Ethereum adresine bağlı benzersiz bir zincir-üstü kimlik oluşturur. ## Merkeziyetsiz kimliğin avantajları {#benefits-of-decentralized-identity} diff --git a/public/content/translations/tr/desci/index.md b/public/content/translations/tr/desci/index.md index 5ab3870f432..52ae4c9b3fe 100644 --- a/public/content/translations/tr/desci/index.md +++ b/public/content/translations/tr/desci/index.md @@ -76,7 +76,7 @@ Fikri mülkiyet (IP), geleneksel bilimde büyük bir sorundur: üniversitelerde NFT'ler gelecekteki işlem gelirlerini orijinal yaratıcıya aktarabilir. Aynı şekilde şeffaf değer eşleştirme zincirleri ile araştırmacılar, yönetim organları (DAOlar gibi), ve hatta veri toplayan özneler bile ödüllendirilebilir. -Yürütülen araştırma deneylerinin merkeziyetsiz veri depoları için, [IP-NFT'ler](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) bir kilit işlevi görebilir. Ayrıca NFT ve [DeFi](/defi/) finansallaştırılmasına (bölümlere ayırmaktan toplama havuzlarına ve değer biçmeye) bağlanabilir. Bu durum zincir üstündeki varlıkların, örneğin DAO'ların, doğrudan zincir üstünde araştırma yapmasına olanak sağlar. Örnek olarak [VitaDAO](https://www.vitadao.com/) verilebilir. Başkalarına transfer edilemeyen ["soulbound" (ruha bağlı) token'ların](https://vitalik.ca/general/2022/01/26/soulbound.html) ortaya çıkışı DeSci için önemli bir rol oynar çünkü bu token'lar, kişilerin Ethereum adreslerine bağlı deneyim ve referanslarını kanıtlayabilmesini sağlar. +Yürütülen araştırma deneylerinin merkeziyetsiz veri depoları için, [IP-NFT'ler](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) bir kilit işlevi görebilir. Ayrıca NFT ve [DeFi](/defi/) finansallaştırılmasına (bölümlere ayırmaktan toplama havuzlarına ve değer biçmeye) bağlanabilir. Bu durum zincir üstündeki varlıkların, örneğin DAO'ların, doğrudan zincir üstünde araştırma yapmasına olanak sağlar. Örnek olarak [VitaDAO](https://www.vitadao.com/) verilebilir. Başkalarına transfer edilemeyen ["soulbound" (ruha bağlı) token'ların](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ortaya çıkışı DeSci için önemli bir rol oynar çünkü bu token'lar, kişilerin Ethereum adreslerine bağlı deneyim ve referanslarını kanıtlayabilmesini sağlar. ### Veri depolama, erişim ve mimari {#data-storage} diff --git a/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/faqs/index.md index 0f9cd1cbcb6..c2d3ea797bd 100644 --- a/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -18,7 +18,7 @@ Hisse ispatı, doğrulayıcılar olarak bilinen düğümlerin, açıkça bir kri İş ispatı, madencilik sürecinde elektrik tüketildiği için çok daha fazla enerji tüketimine neden olur. Öte yandan, hisse ispatı ise sadece çok az bir enerji miktarı gerektirir - Ethereum doğrulayıcıları, hatta Raspberry Pi gibi düşük güçlü cihazlarda bile çalışabilir. Ethereum'un hisse ispatı mekanizması, iş ispatına göre daha güvenli olarak düşünülmektedir çünkü saldırmak için gerekli maliyet daha yüksektir ve saldırganın karşılaşacağı sonuçlar daha ciddidir. -İş ispatı ile hisse ispatı arasındaki farklılıklar tartışmalı bir konudur. [Vitalik Buterin'in blogu](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) ve Justin Drake ile Lyn Alden arasındaki tartışma, argümanların iyi bir özetini sunmaktadır. +İş ispatı ile hisse ispatı arasındaki farklılıklar tartışmalı bir konudur. [Vitalik Buterin'in blogu](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) ve Justin Drake ile Lyn Alden arasındaki tartışma, argümanların iyi bir özetini sunmaktadır. @@ -89,7 +89,7 @@ Kilit öğütme, saldırganın kendi doğrulayıcılarını lehine seçici algor Sosyal cezalandırma, topluluğun bir saldırıya yanıt olarak blok zincirin bir çatalını yönetme yeteneğidir. Bu, topluluğun, bir saldırının dürüst olmayan bir zinciri kesinleştirmesinin ardından kurtulmasını sağlar. Sosyal cezalandırma, sansür saldırılarına karşı da kullanılabilir. - [Sosyal cezalandırma hakkında daha fazlası](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin'in sosyal cezalandırma hakkındaki görüşleri](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Vitalik Buterin'in sosyal cezalandırma hakkındaki görüşleri](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## Cezalandırılacak mıyım? {#will-i-get-slashed} @@ -101,7 +101,7 @@ Bir doğrulayıcı olarak, kasıtlı olarak kötü niyetli davranışlarda bulun Riske atmama sorunu, bazı hisse ispatı mekanizmalarında yalnızca ödüllerin ve cezaların olmadığı bir kavramsal sorundur. Eğer hiçbir şey riske atılmamışsa, faydacı bir doğrulayıcı, ödüllerini artırdığı için herhangi bir blok zincir çatalına veya hatta birden çok çatala tanıklık etmekten eşit derecede memnun olur. Ethereum, tek bir kanonik zinciri sağlamak için kesinlik koşullarını ve cezalandırmayı kullanarak bunu aşar. -[Riske atmama hakkında daha fazlası](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[Riske atmama hakkında daha fazlası](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) ## Çatal seçim algoritması nedir? {#what-is-a-fork-choice-algorithm} diff --git a/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/index.md index 62d451c0c48..21e02c9954f 100644 --- a/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/index.md @@ -79,10 +79,10 @@ Ethereum hep bir hisse ispat ağı değildi. Ethereum başlatıldığı zaman i ## Daha fazla bilgi {#further-reading} -- [Hisse ispatı SSS](https://vitalik.ca/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ +- [Hisse ispatı SSS](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _Vitalik Buterin_ - [Hisse İspatı Nedir?](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ ConsenSys_ - [Hisse İspatı Nedir ve Neden Önemlidir?](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [Neden Hisse İspatı (Kasım 2020)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [Neden Hisse İspatı (Kasım 2020)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [Hisse İspatı: Zayıf Öznelliği Sevmeyi Nasıl Öğrendim](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [Ethereum hisse ispatının saldırı ve savunması](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [Bir Hisse İspatı Tasarım Felsefesi](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index 2c24f662410..505dd04ba91 100644 --- a/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/tr/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -65,5 +65,5 @@ Justin Drake'in hisse ispatının iş ispatına göre avantajlarını açıklama ## Daha fazla bilgi {#further-reading} - [Vitalik'in hisse ispatı tasarım felsefesi](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [Vitalik'in hisse ispatı SSS'leri](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Vitalik'in hisse ispatı SSS'leri](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) - [Hisse ispatı ve iş ispatının "basitçe açıklanmış" videosu](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/tr/developers/docs/nodes-and-clients/index.md b/public/content/translations/tr/developers/docs/nodes-and-clients/index.md index e9d56232872..09f9d17a2e6 100644 --- a/public/content/translations/tr/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/tr/developers/docs/nodes-and-clients/index.md @@ -20,7 +20,7 @@ Düğüm, Ehereum yazılımını çalıştırmakta olan bilgisayarlara bağlı v - Yürütüm İstemcisi (Yürütüm Motoru, EL istemcisi ya da eski adıyla Eth1 istemcisi olarak da bilinir) ağda yayınlanan yeni işlemleri takip eder, bunları Ethereum Sanal Makinesinde çalıştırır ve son durumlarıyla tüm güncel Ethereum verilerinin veritabanını tutar. - Fikir Birliği İstemcisi (İşaret Düğümü, CL istemcisi ya da eski adıyla Eth2 istemcisi olarak da bilinir), ağın yürütüm istemcisinden gelen doğrulanmış veriler üzerinde anlaşmaya varmasını sağlayan hisse ispatı mutabakat algoritmasını uygular. Ayrıca yazılımın, düğümün ağı güvende tutma sürecine katılmasını sağlayan, fikir birliği istemcisine eklenebilecek ve "doğrulayıcı" olarak bilinen üçüncü bir parçası daha vardır. -Bu istemciler Ethereum zincirinin başını takip ederler ve kullanıcıların Ethereum ağıyla etkileşime geçmelerini sağlarlar. Çoklu yazılım parçalarının birlikte çalışmasıyla oluşan modüler tasarıma [kapsüllenmiş karışıklık](https://vitalik.ca/general/2022/02/28/complexity.html) adı verilir. Bu yaklaşım [Birleşim](/roadmap/merge)'i sorunsuz bir şekilde uygulamaya geçirmeyi kolaylaştırdı, istemci yazılımını yönetmeyi ve geliştirmeyi kolayşatırdı ve de bireysel istemcilerinin tekrar kullanılabilmesini sağladı, örnek olarak [katman 2 ekosistemi](/layer-2/)verilebilir. +Bu istemciler Ethereum zincirinin başını takip ederler ve kullanıcıların Ethereum ağıyla etkileşime geçmelerini sağlarlar. Çoklu yazılım parçalarının birlikte çalışmasıyla oluşan modüler tasarıma [kapsüllenmiş karışıklık](https://vitalik.eth.limo/general/2022/02/28/complexity.html) adı verilir. Bu yaklaşım [Birleşim](/roadmap/merge)'i sorunsuz bir şekilde uygulamaya geçirmeyi kolaylaştırdı, istemci yazılımını yönetmeyi ve geliştirmeyi kolayşatırdı ve de bireysel istemcilerinin tekrar kullanılabilmesini sağladı, örnek olarak [katman 2 ekosistemi](/layer-2/)verilebilir. ![Birleştirilmiş yürütüm ve fikir birliği istemcileri](./eth1eth2client.png) Birleştirilmiş yürütüm ve fikir birliği istemcisinin basitleştirilmiş diyagramı. diff --git a/public/content/translations/tr/developers/docs/scaling/index.md b/public/content/translations/tr/developers/docs/scaling/index.md index 89627753a68..3ba9dcf8848 100644 --- a/public/content/translations/tr/developers/docs/scaling/index.md +++ b/public/content/translations/tr/developers/docs/scaling/index.md @@ -103,11 +103,11 @@ _Videodaki açıklamanın "Katman 2" terimini tüm zincir dışı ölçeklendirm - [Toplama merkezli bir Ethereum yol haritası](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [Ethereum için Katman 2 ölçeklendirme çözümlerinde güncel analitikler](https://www.l2beat.com/) - [Ethereum katman 2 Ölçeklendirme Çözümlerini Değerlendirme: Bir Karşılaştırma Çerçevesi](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [Toplamalar için Tamamlanmamış Bir Kılavuz](https://vitalik.ca/general/2021/01/05/rollup.html) +- [Toplamalar için Tamamlanmamış Bir Kılavuz](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [Ethereum destekli ZK-Toplamaları: Dünya Liderleri](https://hackmd.io/@canti/rkUT0BD8K) - [İyimser Toplamalar ile ZK Toplamalarının Karşılaştırması](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [Sıfır Bilgi Blok Zinciri Ölçeklendirilebilirliği](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [Toplamalar + veri parçalarının, yüksek ölçeklenebilirlik için tek sürdürülebilir çözüm olma nedeni](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [Hangi tür Katman 3'ler kulağa mantıklı geliyor?](https://vitalik.ca/general/2022/09/17/layer_3.html) +- [Hangi tür Katman 3'ler kulağa mantıklı geliyor?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) _Size yardımcı olan bir topluluk kaynağı biliyor musunuz? Bu sayfayı düzenleyin ve ekleyin!_ diff --git a/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md index 51b5c60abe4..949df2ea2a2 100644 --- a/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/tr/developers/docs/scaling/optimistic-rollups/index.md @@ -208,7 +208,7 @@ Açıklandığı gibi, iyimser toplamalar, veri erişilebilirliğini garanti etm Ana Ethereum zinciri, blokların ne kadar veriyi tutabileceğine dair sınırlamalar getirir ve bu, gaz birimleriyle ifade edilir ([ortalama blok boyutu](/developers/docs/blocks/#block-size) 15 milyon gazdır). Bu, her işlemin ne kadar gaz kullanabileceğini kısıtlasa da, aynı zamanda her işlemle ilişkili veriyi azaltarak blok başına işlenen işlem sayısını artırabileceğimiz anlamına gelir ve bu durum ölçeklenebilirliği doğrudan artırır. -İyimser toplamalar, işlem verisi sıkıştırmasını gerçekleştirmek ve TPS oranlarını artırmak için birkaç teknik kullanır. Örneğin [bu makale](https://vitalik.ca/general/2021/01/05/rollup.html), temel bir kullanıcı işleminin (ether gönderme) Ana Ağ'da ürettiği veri miktarı ile aynı işlemin bir toplamada ürettiği veri miktarını karşılaştırıyor: +İyimser toplamalar, işlem verisi sıkıştırmasını gerçekleştirmek ve TPS oranlarını artırmak için birkaç teknik kullanır. Örneğin [bu makale](https://vitalik.eth.limo/general/2021/01/05/rollup.html), temel bir kullanıcı işleminin (ether gönderme) Ana Ağ'da ürettiği veri miktarı ile aynı işlemin bir toplamada ürettiği veri miktarını karşılaştırıyor: | Parametre | Ethereum (L1) | Toplama (L2) | | ---------- | ----------------------- | ------------ | diff --git a/public/content/translations/tr/developers/docs/scaling/plasma/index.md b/public/content/translations/tr/developers/docs/scaling/plasma/index.md index 12898794d3d..7c83fa2e5eb 100644 --- a/public/content/translations/tr/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/tr/developers/docs/scaling/plasma/index.md @@ -171,7 +171,7 @@ Birden çok proje, merkeziyetsiz uygulamalarınıza entegre edebileceğiniz Plaz - [Plazma'yı öğrenin](https://www.learnplasma.org/en/) - ["Paylaşılan güvenliğin" ne anlama geldiğine ve neden bu kadar önemli olduğuna dair kısa bir hatırlatma](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [Yan Zincirler - Plazma - Parçalama](https://vitalik.ca/general/2019/06/12/plasma_vs_sharding.html) +- [Yan Zincirler - Plazma - Parçalama](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) - [Plazma'yı Anlamak, Bölüm 1: Temeller](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) - [Plazma'nın Yaşamı ve Ölümü](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) diff --git a/public/content/translations/tr/developers/docs/scaling/sidechains/index.md b/public/content/translations/tr/developers/docs/scaling/sidechains/index.md index 9fd3c349192..0f823827052 100644 --- a/public/content/translations/tr/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/tr/developers/docs/scaling/sidechains/index.md @@ -7,7 +7,7 @@ sidebarDepth: 3 Yan zincir, Ethereum'dan bağımsız çalışan ve Ethereum Ana Ağı'na bir köprü ile bağlı olan ayrı bir blokzincirdir. Yan zincirler farklı blok parametrelerine ve genellikle işlemlerin verimli işlenmesi için tasarlanmış [mutabakat algoritmalarına](/developers/docs/consensus-mechanisms/) sahip olabilirler. Ethereum'un güvenlik özelliklerini taşımadığı için yan zincir kullanmanın artıları ve eksileri vardır. [Katman 2 ölçeklendirme çözümlerinin](/layer-2/) aksine, yan zincirler işlem bilgilerini ve durum değişikliklerini Ethereum Ana Ağı'na göndermezler. -Yan zincirler daha çok işlem hacmi için merkeziyetsizlikten veya güvenlikten de ödün verirler ([ölçeklendirme üçlü çelişmesi](https://vitalik.ca/general/2021/05/23/scaling.html)). Bununla birlikte, yükseltmeler için [vizyon bildirisinde](/roadmap/vision/) özetlendiği üzere Ethereum, merkeziyetsizlikten ve güvenlikten ödün vermeyen ölçeklendirme amacıyla geliştirilmiştir. +Yan zincirler daha çok işlem hacmi için merkeziyetsizlikten veya güvenlikten de ödün verirler ([ölçeklendirme üçlü çelişmesi](https://vitalik.eth.limo/general/2021/05/23/scaling.html)). Bununla birlikte, yükseltmeler için [vizyon bildirisinde](/roadmap/vision/) özetlendiği üzere Ethereum, merkeziyetsizlikten ve güvenlikten ödün vermeyen ölçeklendirme amacıyla geliştirilmiştir. ## Yan zincirler nasıl çalışır? {#how-do-sidechains-work} diff --git a/public/content/translations/tr/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/tr/developers/docs/scaling/zk-rollups/index.md index db4d4ea7905..406d6481dc0 100644 --- a/public/content/translations/tr/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/tr/developers/docs/scaling/zk-rollups/index.md @@ -238,7 +238,7 @@ Merkeziyetsiz uygulamalarınıza entegre edebileceğiniz birden çok ZK toplamal - **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll, Ethereum için yerel bir zkEVM Katman 2 Çözümü üretmek üzerine çalışan, teknoloji odaklı bir şirkettir._ -- **[Taiko](https://taiko.xyz)** - _Taiko; merkeziyetsiz, Ethereum eşdeğeri bir ZK-toplamasıdır (bir [Tip 1 ZK-EVM](https://vitalik.ca/general/2022/08/04/zkevm.html))._ +- **[Taiko](https://taiko.xyz)** - _Taiko; merkeziyetsiz, Ethereum eşdeğeri bir ZK-toplamasıdır (bir [Tip 1 ZK-EVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))._ - **[ZKSync](https://docs.zksync.io/zkevm/)** - _ZkSync 2.0, Matter Labs tarafından geliştirilen ve kendi zkEVM'si desteklenen EVM uyumlu bir ZK Toplamasıdır._ @@ -250,5 +250,5 @@ Merkeziyetsiz uygulamalarınıza entegre edebileceğiniz birden çok ZK toplamal - [zkEVM nedir?](https://www.alchemy.com/overviews/zkevm) - [zkEVM'ye giriş](https://hackmd.io/@yezhang/S1_KMMbGt) - [Müthiş zkEVM kaynakları](https://github.com/LuozhuZhang/awesome-zkevm) -- [Yakın planda ZK-SNARK'lar](https://vitalik.ca/general/2017/02/01/zk_snarks.html) -- [SNARK'lar nasıl mümkündür?](https://vitalik.ca/general/2021/01/26/snarks.html) +- [Yakın planda ZK-SNARK'lar](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [SNARK'lar nasıl mümkündür?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/tr/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/tr/developers/tutorials/deploying-your-first-smart-contract/index.md index fb125cf602a..e7a8ce5772c 100644 --- a/public/content/translations/tr/developers/tutorials/deploying-your-first-smart-contract/index.md +++ b/public/content/translations/tr/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -7,7 +7,7 @@ tags: - "karışım" - "katılık" - "dağıtma" -skill: advanced +skill: beginner lang: tr published: 2020-04-03 source: EthereumDev diff --git a/public/content/translations/tr/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/tr/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md index ca37c6549d1..106290ff162 100644 --- a/public/content/translations/tr/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md +++ b/public/content/translations/tr/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -9,7 +9,7 @@ tags: - "güvenlik" - "test etmek" - "resmi doğrulama" -skill: advanced +skill: beginner published: 2020-01-13 source: Güvenli sözleşmeler oluşturmak sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore @@ -177,7 +177,7 @@ Manticore, bilgileri bir `mcore_*` dizininde çıkaracaktır. Diğerlerinin yan Burada Manticore, aşağıdakilere karşılık gelen 7 test senaryosu bulur (dosya adı sırası değişebilir): | | İşlem 0 | İşlem 1 | İşlem 2 | Sonuç | -| :------------------: | :----------------: | :-----------------: | ------------------- | :----: | +|:--------------------:|:------------------:|:-------------------:| ------------------- |:------:| | **test_00000000.tx** | Sözleşme oluşturma | f(!=65) | f(!=65) | STOP | | **test_00000001.tx** | Sözleşme oluşturma | fallback fonksiyonu | | REVERT | | **test_00000002.tx** | Sözleşme oluşturma | | | RETURN | diff --git a/public/content/translations/tr/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/tr/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md index b75554be21f..12d001be4f6 100644 --- a/public/content/translations/tr/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md +++ b/public/content/translations/tr/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -7,7 +7,7 @@ tags: - "solidity" - "akıllı kontratlar" - "kâhinler" -skill: beginner +skill: intermediate published: 2021-06-29 source: Tellor Belgeleri sourceUrl: https://docs.tellor.io/tellor/ diff --git a/public/content/translations/tr/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/tr/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md index 9222ff7bffa..cf065f7196a 100644 --- a/public/content/translations/tr/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md +++ b/public/content/translations/tr/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -6,7 +6,7 @@ tags: - "SQL" - "Sorgulama" - "İşlemler" -skill: advanced +skill: beginner lang: tr published: 2021-05-11 source: paulapivat.com diff --git a/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md index d31b3b8a610..bcc987c586d 100644 --- a/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md +++ b/public/content/translations/tr/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -6,7 +6,7 @@ tags: - "solidity" - "köprü" - "katman 2" -skill: intermediate +skill: advanced published: 2022-03-30 lang: tr --- @@ -671,13 +671,13 @@ Etki alanları arası mesajların çalışma şekli, hedef sözleşmenin çağr Buradaki mesaj, şu parametrelerle [`finalizeDeposit` fonksiyonunu](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) çağırmaktır: -| Parametre | Değer | Anlam | -| --------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| \_l1Token | address(0) | K1'de ETH'yi (ERC-20 token'ı değildir) temsil eden özel değer | +| Parametre | Değer | Anlam | +| ----------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| \_l1Token | address(0) | K1'de ETH'yi (ERC-20 token'ı değildir) temsil eden özel değer | | \_l2Token | Lib_PredeployAddresses.OVM_ETH | Optimism'de ETH'yi yöneten K2 sözleşmesi, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (bu sözleşme yalnızca dahili Optimism kullanımı içindir) | | \_from | \_from | ETH'yi gönderen K1 üzerindeki adres | | \_to | \_to | ETH'yi alan K2'deki adres | -| amount | msg.value | Gönderilen wei miktarı (zaten köprüye gönderildi) | +| amount | msg.value | Gönderilen wei miktarı (zaten köprüye gönderildi) | | \_data | \_data | Yatırmaya eklenecek ek tarih | ```solidity diff --git a/public/content/translations/tr/developers/tutorials/short-abi/index.md b/public/content/translations/tr/developers/tutorials/short-abi/index.md index 7fa14c5866f..f12b9e0213b 100644 --- a/public/content/translations/tr/developers/tutorials/short-abi/index.md +++ b/public/content/translations/tr/developers/tutorials/short-abi/index.md @@ -5,7 +5,7 @@ author: Ori Pomerantz lang: tr tags: - "katman 2" -skill: beginner +skill: intermediate published: 2022-04-01 --- @@ -43,7 +43,7 @@ Bunu yazarken, Optimism'de L2 gazının maliyeti 0,001 [Gwei](/developers/docs/g Bununla birlikte ABI, bir çağrı verisi baytının maliyetinin yaklaşık olarak dört aritmetik işlemle aynı olduğu L1 için tasarlanmıştır; bir çağrı verisi baytının bin aritmetik işlemden daha pahalı olduğu L2 için değil. Örneğin, [bir ERC-20 transfer işlemini burada bulabilirsiniz](https://kovan-optimistic.etherscan.io/tx/0x7ce4c144ebfce157b4de99d8ad53a352ae91b57b3fa06d8a1c79439df6bfa998). Çağrı verisi şu şekilde bölünür: | Bölüm | Uzunluk | Baytlar | Harcanan bayt | Harcanan gaz | Gereken bayt | Gereken gaz | -| ---------------- | ------: | ------: | ------------: | -----------: | -----------: | ----------: | +| ---------------- | -------:| -------:| -------------:| ------------:| ------------:| -----------:| | Fonksiyon seçici | 4 | 0-3 | 3 | 48 | 1 | 16 | | Sıfırlar | 12 | 4-15 | 12 | 48 | 0 | 0 | | Varış adresi | 20 | 16-35 | 0 | 0 | 20 | 320 | @@ -228,7 +228,7 @@ Bu spesifik sözleşme için birinin isteyebileceği maksimum jeton sayısının Ortalama olarak bir transfer 35 bayt kadar çağrı verisi kaplar: | Bölüm | Uzunluk | Bayt | -| ---------------- | ------: | ----: | +| ---------------- | -------:| -----:| | Fonksiyon seçici | 1 | 0 | | Varış adresi | 32 | 1-32 | | Miktar | 2 | 33-34 | diff --git a/public/content/translations/tr/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/tr/developers/tutorials/smart-contract-security-guidelines/index.md index bce6b547b9f..d46200742c5 100644 --- a/public/content/translations/tr/developers/tutorials/smart-contract-security-guidelines/index.md +++ b/public/content/translations/tr/developers/tutorials/smart-contract-security-guidelines/index.md @@ -6,7 +6,7 @@ tags: - "solidity" - "akıllı sözleşmeler" - "güvenlik" -skill: beginner +skill: intermediate lang: tr published: 2020-09-06 source: Güvenli sözleşmeler oluşturmak diff --git a/public/content/translations/tr/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md b/public/content/translations/tr/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md index 648651ac737..577f901671a 100644 --- a/public/content/translations/tr/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md +++ b/public/content/translations/tr/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md @@ -9,7 +9,7 @@ tags: - "test etmek" - "truffle" - "ganache" -skill: beginner +skill: intermediate published: 2020-06-05 source: soliditydeveloper.com sourceUrl: https://soliditydeveloper.com/continuous-integration diff --git a/public/content/translations/tr/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/tr/developers/tutorials/token-integration-checklist/index.md index 467fe71bf85..9c53c566daf 100644 --- a/public/content/translations/tr/developers/tutorials/token-integration-checklist/index.md +++ b/public/content/translations/tr/developers/tutorials/token-integration-checklist/index.md @@ -8,7 +8,7 @@ tags: - "akıllı kontratlar" - "güvenlik" - "jetonlar" -skill: beginner +skill: intermediate published: 2020-08-13 source: Güvenli sözleşmeler oluşturmak sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md diff --git a/public/content/translations/tr/developers/tutorials/using-websockets/index.md b/public/content/translations/tr/developers/tutorials/using-websockets/index.md index 846a7dcfba9..2492b138d00 100644 --- a/public/content/translations/tr/developers/tutorials/using-websockets/index.md +++ b/public/content/translations/tr/developers/tutorials/using-websockets/index.md @@ -8,7 +8,7 @@ tags: - "websocket'ler" - "sorgulama" - "javascript" -skill: intermediate +skill: beginner source: Alchemy belgeleri sourceUrl: https://docs.alchemyapi.io/guides/using-websockets published: 2020-12-01 diff --git a/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index da9242b9263..19899d962e8 100644 --- a/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -10,7 +10,7 @@ tags: - "taklit" skill: intermediate lang: tr -published: 2020-11-04 +published: 2020-11-14 --- ## Bu öğretici ne ile ilgili? {#what-is-this-tutorial-about} diff --git a/public/content/translations/tr/eips/index.md b/public/content/translations/tr/eips/index.md index 9d3984aaeaa..135f58322b0 100644 --- a/public/content/translations/tr/eips/index.md +++ b/public/content/translations/tr/eips/index.md @@ -10,7 +10,7 @@ lang: tr [Ethereum İyileştirme Önerileri (EIP'ler)](https://eips.ethereum.org/), Ethereum için potansiyel yeni özellikleri veya süreçleri belirleyen standartlardır. EIP'ler, önerilen değişiklikler için teknik özellikler içerir ve topluluk için "gerçeğin kaynağı" görevi görür. Ethereum için ağ yükseltmeleri ve uygulama standartları, EIP süreci aracılığıyla tartışılır ve geliştirilir. -Ethereum topluluğu içindeki herkes bir EIP oluşturma kabiliyetine sahiptir. EIP'leri yazma yönergeleri, [EIP 1](https://eips.ethereum.org/EIPS/eip-1) içerisinde yer almaktadır. Bir EIP öncelikle az bir motivasyonla birlikte kısa bir şekilde teknik ayrıntıları aktarmalıdır. EIP yazarı, topluluk içinde konsensüs oluşturmaktan ve alternatif görüşleri belgelemekten sorumludur. İyi biçimlendirilmiş bir EIP göndermek için gerekli yüksek teknik beceri göz önüne alındığında, tarihsel olarak çoğu EIP yazarı uygulama veya protokol geliştiricileri olmuştur. +Ethereum topluluğu içindeki herkes bir EIP oluşturma kabiliyetine sahiptir. EIP'leri yazma yönergeleri, [EIP 1](https://eips.ethereum.org/EIPS/eip-1) içerisinde yer almaktadır. Bir EIP öncelikle az bir motivasyonla birlikte kısa bir şekilde teknik özellikleri aktarmalıdır. EIP yazarı, topluluk içinde konsensüs oluşturmaktan ve alternatif görüşleri belgelemekten sorumludur. İyi biçimlendirilmiş bir EIP göndermek için gerekli yüksek teknik beceri göz önüne alındığında, tarihsel olarak çoğu EIP yazarı uygulama veya protokol geliştiricileri olmuştur. ## EIP'ler neden önemlidir? {#why-do-eips-matter} @@ -22,7 +22,7 @@ Değişiklikler için teknik bir şartname sağlamanın yanı sıra EIP'ler, Eth ## EIP'lerin Tarihçesi {#history-of-eips} -[Ethereum İyileştirme Önerileri (EIP'ler) GitHub deposu](https://github.com/ethereum/EIPs) Ekim 2015'te oluşturuldu. EIP işlemi, [Bitcoin İyileştirme Önerileri (BIP'ler)](https://github.com/bitcoin/bips) sürecini; bu süreç de [Python Geliştirme Önerileri (PEP'ler)](https://www.python.org/dev/peps/) sürecini temel alır. +[Ethereum İyileştirme Önerileri (EIP'ler) Github deposu](https://github.com/ethereum/EIPs) Ekim 2015'te oluşturuldu. EIP işlemi, [Bitcoin İyileştirme Önerileri (BIP'ler)](https://github.com/bitcoin/bips) sürecini; bu süreç de [Python Geliştirme Önerileri (PEP'ler)](https://www.python.org/dev/peps/) sürecini temel alır. EIP editörleri; teknik sağlamlık, yazım/dil bilgisi kontrolü, format ve de kod stili için EIP'leri gözden geçirmekle görevlidir. Martin Becze, Vitalik Buterin, Gavin Wood ve diğerleri, 2015'ten 2016'nın sonlarına kadar ilk EIP editörleriydi. diff --git a/public/content/translations/tr/energy-consumption/index.md b/public/content/translations/tr/energy-consumption/index.md index 459f975350a..b26a2965e81 100644 --- a/public/content/translations/tr/energy-consumption/index.md +++ b/public/content/translations/tr/energy-consumption/index.md @@ -10,38 +10,40 @@ Ethereum çevre dostu bir blok zincirdir. Ethereum'un [hisse ispatı mekanizmas Ethereum için enerji tüketim tahmini [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com) çalışmasından geliyor. Ethereum Ağı'nın karbon ayak izi ve elektrik harcamaları hakkında aşağı yukarı tahminlerde bulundular. ([rapora bakabilirsiniz](https://carbon-ratings.com/eth-report-2022)). Farklı düğümlerin elektrik harcamalarını çeşitli biligisayar donanım ve yazılım yapılandırmalarıyla test ettiler. Ağın yıllık tahmin edilen elektrik tüketimi olan **2.601 MWh** (0.0026 TWh) bölgeye özel karbon yoğunluğu faktörleri uygulandığında yıllık **870 tonluk CO2e** karbon emisyonuna denk gelmektedir. Bu değer düğümler ağa girdikçe ve çıktıkça değişir - bunun takibini [Cambridge Blok Zincir Ağ Sürdürülebilirlik Endeksinden](https://ccaf.io/cbnsi/ethereum) yuvarlanan 7 günlük ortalama tahmini kullanarak yapabilirsiniz (tahminleri için biraz farklı bir metot kullandıklarını aklınızda tutun - detaylar sitede mevcuttur). -Ethereum'un enerji tüketimini bağlama oturtmak için, diğer bazı endüstriler için yıllık tahminleri karşılaştırabiliriz. Bu, bize Ethereum için tahminin düşük ya da yüksek olduğunu daha iyi anlamamıza yardım ediyor. +Ethereum'un enerji tüketimini bir bağlama oturtmak için, diğer ürünler ve endüstriler için yıllık yapılan tahminleri karşılaştırabiliriz. Bu, bize Ethereum için tahminin düşük ya da yüksek olduğunu daha iyi anlamamıza yardım ediyor. -Yukarıdaki tablo, diğer bazı endüstrilere kıyasla Ethereum için tahmini yıllık enerji tüketimini TWh/yıl cinsinden göstermektedir. Sunulan tahminler Mayıs 2023'te herkese açık bilgilerden alınmıştır, kaynak bağlantıları aşağıdaki tabloda mevcuttur: +Yukarıdaki tablo, diğer ürün ve endüstrilere kıyasla Ethereum için tahmini yıllık enerji tüketimini TWh/yıl cinsinden göstermektedir. Sunulan tahminler Temmuz 2023'te herkese açık bilgilerden alınmıştır, kaynak bağlantıları aşağıdaki tabloda mevcuttur. -| | Yıllık enerji tüketimi (TWh) | PoS Ethereum ile karşılaştırma | Kaynak | -| :------------------------ | :--------------------------: | :----------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Küresel veri merkezleri | 200 | 77.000x | [kaynak](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | -| Altın madenciliği | 131 | 50.000x | [kaynak](https://ccaf.io/cbnsi/cbeci/comparisons) | -| Bitcoin | 131 | 50.000x | [kaynak](https://ccaf.io/cbnsi/cbeci/comparisons) | -| PoW Ethereum | 78 | 30.000x | [kaynak](https://digiconomist.net/ethereum-energy-consumption) | -| Youtube (sadece doğrudan) | 12 | 4600x | [kaynak](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf) | -| ABD'de oyun | 34 | 13.000x | [kaynak](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | -| Netflix | 0,451 | 173x | [kaynak](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | -| PayPal | 0,26 | 100x | [kaynak](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261) | -| AirBnB | 0,02 | 8x | [kaynak]() | -| PoS Ethereum | 0,0026 | 1x | [kaynak](https://carbon-ratings.com/eth-report-2022) | +| | Yıllık enerji tüketimi (TWh) | PoS Ethereum ile karşılaştırma | Kaynak | +|:----------------------- |:----------------------------:|:------------------------------:|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| Küresel veri merkezleri | 190 | 73,000x | [kaynak](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | +| Bitcoin | 149 | 53,000x | [kaynak](https://ccaf.io/cbnsi/cbeci/comparisons) | +| Altın madenciliği | 131 | 50.000x | [kaynak](https://ccaf.io/cbnsi/cbeci/comparisons) | +| ABD'de oyun\* | 34 | 13.000x | [kaynak](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | +| PoW Ethereum | 21 | 8,100x | [kaynak](https://ccaf.io/cbnsi/ethereum/1) | +| Google | 19 | 7,300x | [kaynak](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) | +| Netflix | 0,457 | 176x | [kaynak](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | +| PayPal | 0,26 | 100x | [kaynak](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-(1).pdf) | +| AirBnB | 0,02 | 8x | [kaynak](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-(Final).pdf) | +| **PoS Ethereum** | **0,0026** | **1x** | [kaynak](https://carbon-ratings.com/eth-report-2022) | -Enerji tüketimine dair isabetli tahminler yapmak karmaşıktır, özellikle söz konusu kalemin tedarik zinciri veya dağıtım detayları, kalemin verimliliğini etkileyecek kadar karmaşıksa. Örneğin Netflix veya YouTube'u düşünün. Onların enerji kullanımıyla ilgili tahminler sadece sistemlerini yönetecek ve kullanıcılara içerik iletecek enerjiyi mi (_doğrudan maliyet_) yoksa içerik üretimi, şirket ofislerinin yönetimi, reklam ve benzeri için gereken maliyeti (_dolaylı maliyet_) ekleyip eklememelerine göre değişir. Dolaylı kullanıma ayrıca TV'ler, bilgisayarlar ve mobiller gibi son kullanıcı cihazlarında hangi cihazların kullanıldığına bağlı olarak içerik tüketimi için gereken enerji de dahil olabilir. +\*PC'ler, dizüstü bilgisayarlar ve oyun konsolları gibi son kullanıcı cihazlarını içerir. -Bu sorun hakkında bir tartışma [Carbon Brief'de](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix) bulunmaktadır. Yukarıdaki tabloda, Netflix için bildirilmiş değer kendi bildirdikleri _doğrudan_ ve _dolaylı_ kullanımı içermektedir. Youtube sadece kendi _direkt_ enerji tüketiminin tahminini sağlamaktadır, bu da [12 TWh/yıl](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf) civarındadır. +Enerji tüketimine ilişkin doğru tahminler almak karmaşıktır; özellikle de ölçülen şeyin karmaşık bir tedarik zinciri veya verimliliğini etkileyen dağıtım ayrıntıları olduğu durumlarda. Örneğin, Netflix ve Google'ın enerji tüketimi tahminleri, yalnızca sistemlerini sürdürmek ve içerikleri kullanıcılara ulaştırmak için harcanan enerjiyi içerip içermediğine bağlı olarak değişebilir (_doğrudan harcama_). Ya da içerik üretme, şirket ofislerini işletme, reklam yapma gibi faktörleri içeren harcamaları da içerip içermediğine bağlı olarak değişebilir (_dolaylı harcama_). Dolaylı harcama, aynı zamanda içerik tüketimi için son kullanıcı cihazlarında, örneğin televizyonlar, bilgisayarlar ve mobil cihazlar gibi, enerji tüketimini de içerebilir. -Yukarıdaki tablo ve grafik ayrıca Bitcoin ve iş kanıtlı Ethereum ile ilgili karşılaştırmalar içermektedir. Şu akılda tutulmalıdır ki iş ispatı ağlarının enerji tüketimi sabit değildir - günden güne değişir. İş ispatlı Ethereum için kullanılan değer hisse ispatına [Birleşim'den](/roadmap/merge/) öncedir, tıpkı [Digiconomist](https://digiconomist.net/ethereum-energy-consumption) tarafından tahmin edildiği gibi. [Cambridge Blok Zincir Ağ Sürdürülebilirlik Endeksi](https://ccaf.io/cbnsi/ethereum/1) gibi diğer kaynaklar ise enerji tüketimini daha düşük (20 TWh/yıl civarı) tahmin etmektedir. Bitcoin'in enerji tüketimi ile ilgili tahminler kaynaklar arası geniş farklılıklar gösterir ve sadece tüketilen enerji değil, ayrıca o enerji ve onunla ilgili ahlaki değerler ile alakalı incelikli [tartışmaları](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) cezbeden bir konudur. Enerji tüketimi muhakkak çevresel ayak iziyle eşleşmez çünkü farklı projeler farklı enerji kaynakları kullanabilir, örnek olarak daha az ya da fazla oranda yenilenebilir enerji gibi. Örneğin, [Cambridge Bitcoin Elektrik Tüketim Endeksi](https://ccaf.io/cbnsi/cbeci/comparisons) teorik olarak Bitcoin ağ talebinin gaz yakımı veya başka durumda aktarım ve dağıtımda kaybedilecek elektrik ile güçlendirebileceğini belirtir. Ethereum'un sürdürülebiliğe yolu ağın enerjiye aç kısmını yeşil bir alternatifle değiştirmekti. +Yukarıdaki tahminler mükemmel karşılaştırmalar değildir. Hesaba katılan dolaylı harcama miktarı kaynağa göre değişir ve nadiren son kullanıcı cihazlarından gelen enerjiyi içerir. Her temel kaynak, neyin ölçüldüğüne dair daha fazla ayrıntı içerir. + +Yukarıdaki tablo ve grafik ayrıca Bitcoin ve iş kanıtlı Ethereum ile ilgili karşılaştırmalar içermektedir. Önemli bir nokta şudur ki, proof-of-work ağlarının enerji tüketimi sabit değildir ve gün geçtikçe değişebilir. Tahminler ayrıca kaynaklar arasında geniş bir şekilde değişebilir. Bu konu, tüketilen enerjinin miktarıyla ilgili olmanın ötesinde, aynı zamanda enerjinin kaynakları ve bu bağlamda etik konuları içeren nüanslı bir [tartışmayı](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/) çeker. Enerji tüketimi, çeşitli projelerin farklı enerji kaynaklarını, yenilenebilir enerjinin daha az veya daha fazla oranını içerebileceği için çevresel etkiyle tam olarak örtüşmeyebilir. Örneğin, [Cambridge Bitcoin Electricity Consumption Index](https://ccaf.io/cbnsi/cbeci/comparisons), Bitcoin ağının teorik olarak gaz yakma veya iletim ve dağıtımda kaybolacak olan elektrikle desteklenebileceğini göstermektedir. Ethereum'un sürdürülebiliğe yolu ağın enerjiye aç kısmını yeşil bir alternatifle değiştirmekti. Birçok endüstri için enerji tüketimi ve karbon emisyonu tahminlerine [Cambridge Blok Zincir Ağ Sürdürülebilirlik Endeksi sitesinden](https://ccaf.io/cbnsi/ethereum) göz atabilirsiniz. ## İşlem başına tahminler {#per-transaction-estimates} -Birçok makale, blok zincirler için "işlem başına" enerji harcamasını öngörüyor. Ancak bu yanıltabilir çünkü bir bloku öne sürmek ve doğrulamak için gereken enerji blokun içindeki işlemlerin sayısından bağımsızdır. İşlem başına enerji harcaması birimi, daha az işlemin daha küçük enerji harcamasına yol açacağı anlamına gelir ve bunun tersi de geçerlidir. Ayrıca, işlem başına tahminler bir blok zincirin işlem girdisinin nasıl tanımlandığına karşı çok hassasstır ve bu tanımlamanın değişimi ile oynanarak değer olduğundan daha büyük veya küçük gösterilebilir. +Birçok makale, blok zincirler için "işlem başına" enerji harcamasını öngörüyor. Ancak bu yanıltabilir çünkü bir bloku öne sürmek ve doğrulamak için gereken enerji blokun içindeki işlemlerin sayısından bağımsızdır. İşlem başına enerji harcaması biriminden yola çıkarak, daha az işlemin daha küçük bir enerji harcamasına ve tam tersine daha fazla işlemin daha büyük bir enerji harcamasına neden olacağı düşünülebilir, ancak bu her zaman geçerli değildir. Ayrıca, işlem başına tahminler bir blok zincirin işlem girdisinin nasıl tanımlandığına karşı çok hassasstır ve bu tanımlamanın değişimi ile oynanarak değer olduğundan daha büyük veya küçük gösterilebilir. -Örneğin, Ethereum'da işlem verimi yalnızca temel katmanınki değildir - aynı zamanda tüm "[katman 2](/layer-2/)" toplamaların işlem veriminin toplamıdır. Katman 2'ler genelde hesaplamalara katılmazlar, ancak sıralayıcılar tarafından harcanan ek enerji (az) ve onların tamamladığı işlem sayısının (çok) göz önüne alınması işlem başına tahminleri büyük oranda düşürürdü. Bu platformlar arasında işlem başına enerji tüketimi karşılaştırmalarının yanıltıcı olmasının sebeplerinden biridir. +Örneğin Ethereum'da işlem geçirgenliği, yalnızca temel katmanın değil, aynı zamanda tüm "[katman 2](/layer-2/)" rollup'ların işlem geçirgenliğinin toplamıdır. Katman 2'ler genelde hesaplamalara katılmazlar, ancak sıralayıcılar tarafından harcanan ek enerji (az) ve onların tamamladığı işlem sayısının (çok) göz önüne alınması işlem başına tahminleri büyük oranda düşürürdü. Bu, platformlar arasında işlem başına enerji tüketimi karşılaştırmalarının yanıltıcı olabileceği nedenlerden biridir. ## Ethereum'un karbon borcu {#carbon-debt} @@ -51,7 +53,7 @@ En başından beri, Ethereum hisse ispatı temelli bir fikir birliği mekanizmas ![Soldaki Eyfel Kulesi'ni (330 metre uzunluğunda) Birleşim öncesi yüksek enerji tüketimini sembolize etmek için, 4 cm uzunluğunda bir Lego figürünü ise Birleşim sonrası enerji tüketiminden dramatik düşüşü temsil etmek için kullanarak Ethereum'un Birleşim öncesi ve sonrası enerji tüketiminin karşılaştırılması](energy_consumption_pre_post_merge.png) -CCRI Birleşim'in Ethereum'un yıllık enerji tüketimini **%99.988** veya daha fazla düşündüğünü tahmin ediyor. Aynı şekilde, Ethereum'un karbon ayak izi de yaklaşık **%99.992** (11.016.000 ila 870 ton arası CO2e) düştü. Bunu daha iyi anlatabilmek için, yukarıdaki figürde gösterildiği gibi, emisyonlardaki düşüş tıpkı Eyfel Kulesi'nin yüksekliğinden bir küçük plastik oyuncak figürün boyuna inmek gibiydi. Sonuç olarak, ağın korunmasının çevresel maliyeti büyük oranda düştü. Aynı zamanda, ağın güvenliğinin geliştiği düşünülüyor. +CCRI'nin tahminine göre, The Merge, Ethereum'un yıllık elektrik tüketimini **%99.988'den** fazla azalttı. Aynı şekilde, Ethereum'un karbon ayak izi de yaklaşık **%99.992** (11.016.000 ila 870 ton arası CO2e) düştü. Bunu daha iyi anlatabilmek için, yukarıdaki figürde gösterildiği gibi, emisyonlardaki düşüş tıpkı Eyfel Kulesi'nin yüksekliğinden bir küçük plastik oyuncak figürün boyuna inmek gibiydi. Sonuç olarak, ağın korunmasının çevresel maliyeti büyük oranda düştü. Aynı zamanda, ağın güvenliğinin geliştiği düşünülüyor. ## Çevre dostu uygulama katmanı {#green-applications} diff --git a/public/content/translations/tr/governance/index.md b/public/content/translations/tr/governance/index.md index 68b280a47c2..fd695e5d6c4 100644 --- a/public/content/translations/tr/governance/index.md +++ b/public/content/translations/tr/governance/index.md @@ -175,9 +175,9 @@ Tanım ve geliştirme uygulamaları her zaman tamamen açık kaynak olsa da, yuk Ethereum'daki yönetişimin katı kuralları yoktur. Çeşitli topluluk katılımcıları bu konuda farklı bakış açılarına sahiptir. İşte bunlardan birkaçı: -- [Blok Zinciri Yönetişimi Üzerine Notlar](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Blok Zinciri Yönetişimi Üzerine Notlar](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Ethereum yönetişimi nasıl çalışır?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [Ethereum yönetişimin çalışması](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [Ethereum çekirdek geliştiricisi nedir?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [Yönetişim, 2. Bölüm: Plütokrasi Hâlâ Kötü](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [Parayla oylama yönetişiminin ötesine geçmek](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [Yönetişim, 2. Bölüm: Plütokrasi Hâlâ Kötü](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [Parayla oylama yönetişiminin ötesine geçmek](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/tr/nft/index.md b/public/content/translations/tr/nft/index.md index 7eedbc24629..47d44070862 100644 --- a/public/content/translations/tr/nft/index.md +++ b/public/content/translations/tr/nft/index.md @@ -14,15 +14,15 @@ summaryPoint3: Ethereum blokzincirindeki akıllı sözleşmelerle desteklenmekte ## NFT'ler nelerdir? {#what-are-nfts} -NFT'ler tekil olarak eşsiz jeton'lardır. Her NFT farklı özelliklere (değiştirilemez) sahiptir ve kanıtlanabilir şekilde nadirdir. Bu, ERC-20'ler gibi ("değiştirilebilir") her token'ın set içinde eşit ve aynı özelliklere sahip olduğu token'lardan farklıdır. Cüzdanınızda hangi spesifik dolar banknotu olduğunu önemsemezsiniz çünkü hepsi aynıdır ve aynı değere sahiptir. Ancak, hangi spesifik NFT'ye sahip olduğunuzu _önemsersiniz_ çünkü hepsinin diğerlerinden ayıran kendine has özellikleri ("değiştirilemez") vardır. +NFT'ler tekil olarak eşsiz jeton'lardır. Her NFT farklı özelliklere (değiştirilemez) sahiptir ve kanıtlanabilir şekilde nadirdir. Bu, Ethereum tabanlı diğer tokenlardan farklıdır, çünkü ETH veya USDC'de her token birbirine benzer ve aynı özelliklere sahiptir.("fungible" ya da Türkçe karşılığıyla "değiştirilebilir"). Cüzdanınızda hangi belirli dolar banknotu (veya ETH) olduğu sizin için önemli değildir, çünkü hepsi aynıdır ve aynı değere sahiptir. Ancak, hangi spesifik NFT'ye sahip olduğunuzu _önemsersiniz_ çünkü hepsinin diğerlerinden ayıran kendine has özellikleri ("değiştirilemez") vardır. -Her NFT'nin eşsizliği, sanat, koleksiyon ürünleri hatta gayrimenkul gibi şeylerin tokenleştirilmesini sağlar; burada belirli bir eşsiz NFT, belli bir eşsiz gerçek veya dijital öğeyi temsil eder. Bir varlığın sahipliği, Ethereum blokzincir'i tarafından güvence altına alınır: böylece hiç kimse sahiplik kaydını değiştiremez ya da kopyala/yapıştır yaparak yeni bir NFT'yi varlık olarak üretemez. +Her NFT'nin eşsizliği, sanat, koleksiyon ürünleri hatta gayrimenkul gibi şeylerin tokenleştirilmesini sağlar; burada belirli bir eşsiz NFT, belli bir eşsiz gerçek veya dijital öğeyi temsil eder. Bir varlığın sahipliği, Ethereum blok zincirinde genel olarak doğrulanabilir. ## Varlıkların interneti {#internet-of-assets} -NFT'ler ve Ethereum, günümüz internetinde mevcut olan bazı problemleri çözmektedir. Her şey daha da dijitalleşirken nadirlik, benzersizlik ve sahiplik kanıtı gibi fiziksel öğelerin özelliklerini kopyalamaya ihtiyaç duyulmaktadır. merkezi bir organizasyon tarafından kontrol edilmeyen şekilde. Örneğin, NFT'ler sayesinde belirli bir şirketin müzik uygulamasına bağlı olmaksızın herhangi bir müzik mp3'üne sahip olabilir ya da satabileceğiniz veya takas edebileceğiniz bir sosyal medya kullanıcı adına sahip olabilirsiniz. Üstelik kullanıcı adınız, platform sağlayıcısı tarafından keyfi olarak sizden alınamaz. +NFT'ler ve Ethereum, günümüz internetinde mevcut olan bazı problemleri çözmektedir. Her şey daha dijital hale geldikçe, nadirlik, benzersizlik ve sahiplik kanıtı gibi fiziksel özelliklerin, merkezi bir kuruluş tarafından kontrol edilmeyen bir şekilde çoğaltılma ihtiyacı ortaya çıkmaktadır. Örneğin, NFT'lerle, bir müzik MP3 dosyasına sahip olabilir ve bunu Spotify veya Apple Music gibi bir şirketin belirli müzik uygulamasına bağlı kalmadan tüm Ethereum tabanlı uygulamalarda kullanabilirsiniz. Bir sosyal medya kullanıcı adına sahip olabilir, bunu satabilir veya değiştirebilirsiniz, ancak platform sağlayıcısı tarafından keyfi olarak sizden alınamaz. Günümüzde çoğumuzun kullandığı internete kıyasla NFT'lerin interneti şu şekilde görünüyor... @@ -30,19 +30,13 @@ Günümüzde çoğumuzun kullandığı internete kıyasla NFT'lerin interneti ş | NFT interneti | Günümüz interneti | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Varlıkların yalnızca sizindir! Bunları yalnızca sizin satma ya da takas etme yetkiniz vardır. | Bir platformdan bir varlık kiralarsınız. | +| Varlıkların yalnızca sizindir! Bunları yalnızca sizin satma ya da takas etme yetkiniz vardır. | Bir varlığı belirli bir kuruluştan kiralarsınız ve bu size ait olabilir, ancak bu sizden alınabilir. | | NFT'ler dijital olarak benzersizdir, herhangi iki NFT aynı değildir. | Bir varlığın kopyası genellikle orjinalinden ayırt edilemez. | | Bir NFT'nin sahipliği, bir kimsenin doğrulayabileceği şekilde blok zincir üzerinde saklanır. | Dijital öğelerin sahiplik kayıtları, kurumlar tarafından kontrol edilen sunucularda saklanır, bu nedenle bunlara güvenmek zorundasınız. | | NFT'ler Ethereum üzerindeki Akıllı sözleşmelerdir. Bu, onların Ethereum üzerindeki diğer akıllı sözleşmeler ve uygulamalarda kolaylıkla kullanılabileceği anlamına gelir! | Dijital öğelere sahip şirketler genellikle kendi "kapalı ekosistem" altyapılarına ihtiyaç duyar. | | İçerik oluşturucular, eserlerini istedikleri her yerde satabilir ve küresel bir pazara erişebilirler. | İçerik oluşturucular, kullandıkları platformların altyapısına ve dağıtımına bağlı kalmak zorundadır. Platformlar genellikle kullanım koşulları ve coğrafi kısıtlamalara tabidir. | | NFT yaratıcıları kendi çalışmaları üzerinde sahiplik haklarını koruyabilir ve telif ücretlerini doğrudan NFT sözleşmesine gömebilirler. | Müzik yayını hizmetleri gibi platformlar, satışlardan elde edilen kârın büyük kısmını ellerinde bulundurur. | -## NFT'ler nasıl çalışır? {#how-nfts-work} - -Ethereum'da yayınlanan diğer token'lar gibi, NFT'ler de bir akıllı sözleşme tarafından verilir. Akıllı sözleşme, sözleşmenin hangi fonksiyonlara sahip olacağını tanımlayan birkaç NFT standardından birine (genellikle ERC-721 veya ERC-1155) uygundur. Sözleşme, NFT'leri oluşturabilir ("basabilir") ve bunları belirli bir sahibe atayabilir. Sahiplik, belirli NFT'leri belirli adreslere sözleşmeyle eşleyerek tanımlanır. NFT'nin bir kimliği ve genellikle bu kimlikle ilişkili spesifik token'ı benzersiz kılan meta verisi vardır. - -Birisi bir NFT yaratır veya basarsa, aslında akıllı sözleşmede, belirli NFT'yi kendi adreslerine atayan bir fonksiyonu yürütüyordur. Bu bilgi, sözleşmenin depolama alanında saklanır, ki bu da blok zincirin bir parçasıdır. Sözleşme oluşturucu, sözleşmeye ek kurallar ekleyebilir; örneğin toplam arzı sınırlamak ya da bir token'ın her aktarılışında oluşturucusuna ödenecek olan telif hakkını tanımlamak gibi. - ## NFT'ler ne için kullanılır? {#nft-use-cases} NFT'ler, şunlar dahil olmak üzere pek çok şey için kullanılabilir: @@ -62,7 +56,7 @@ Belki de eserlerinizi NFT'leri kullanarak paylaşmak isteyen, eserlerinizin kont Yahut bir spor etkinliğine ait bileti düşünün. Bir etkinlik organizatörü kaç bilet satılacağına karar verdiği gibi, bir NFT'nin oluşturucusu da kaç kopya olacağına karar verebilir. Bazen bunlar, 5000 Genel Giriş bileti gibi birebir kopyalardır. Bazen birbirine çok benzer ama her biri biraz farklı olan kopyalar basılır, örneğin sıralı ve sınırlı atanmış koltuk numarası olan bir bilet gibi. Bu biletler, bilet işletmecilerine ödeme yapmadan eşten eşe alınıp satılabilir ve alıcı, sözleşme adresini kontrol ederek biletin özgünlüğünden her zaman emin olabilir. -Ethereum.org'da NFT'ler, GitHub deposuna katkıda bulunan kişileri veya çağrılara katılanları göstermek için kullanılır ve hatta kendi NFT etki alanı adımıza da sahip oluruz. Ethereum.org'a katkıda bulunursanız, bir POAP NFT'si talep edebilirsiniz. Bazı kripto buluşmaları için POAP'lar bilet olarak kullanıldı. [Katkıda bulunma hakkında daha fazla bilgi](/contributing/#poap). +Ethereum.org'da NFT'ler, insanların GitHub deposuna anlamlı bir katkıda bulunduklarını (web sitesini programladılar, bir makale yazdılar veya değiştirdiler...), içeriğimizi çevirdiklerini veya topluluk çağrılarımıza katıldıklarını göstermek için kullanılıyor. Hatta kendi NFT alan adımızı bile edindik. Ethereum.org'a katkıda bulunursanız, bir POAP NFT'si talep edebilirsiniz. Bazı kripto buluşmaları için POAP'lar bilet olarak kullanıldı. [Katkıda bulunma hakkında daha fazla bilgi](/contributing/#poap). ![ethereum.org POAP](./poap.png) @@ -72,9 +66,23 @@ Bu web sitesinin NFT'lerle desteklenen alternatif bir alan adı da bulunmaktadı +## NFT'ler nasıl çalışır? {#how-nfts-work} + +NFT'ler, Ethereum blok zincirindeki diğer dijital öğeler gibi, bir "akıllı kontrat" olarak adlandırılan özel bir Ethereum tabanlı bilgisayar programı aracılığıyla oluşturulur. Bu kontratlar, ERC-721 veya ERC-1155 gibi belirli standartlara uyan kuralları takip eder; bu standartlar, kontratın ne yapabileceğini belirler. + +NFT akıllı kontratı birkaç temel şeyi gerçekleştirebilir: + +- **NFT Yarat:** Yeni NFT'ler oluşturabilir. +- **Sahiplik Atama:** Hangi NFT'nin kime ait olduğunu belirleyerek bunları belirli Ethereum adresleri ile ilişkilendirir. +- **Her NFT'ye Bir Kimlik Atama:** Her NFT, onu benzersiz kılan bir numaraya sahiptir. Ek olarak, genellikle NFT'ye neyi temsil ettiğini açıklayan birkaç bilgi (meta veri) bulunabilir. + +Birisi bir NFT "oluşturursa" veya "bastırırsa", temelde akıllı kontrata belirli bir NFT'nin sahipliğini vermesini talep eder. Bu bilgi, güvenli bir şekilde ve kamuya açık bir şekilde blok zincirinde depolanır. + +Ayrıca, kontratın yaratıcısı ek kurallar ekleyebilir. Belirli bir NFT'den kaç tane yapılabileceğini sınırlayabilir veya NFT el değiştirdiğinde küçük bir telif ücreti alması gerektiğine karar verebilirler. + ### NFT güvenliği {#nft-security} -Ethereum'un güvenliği, hisse ispatından gelir. Sistem, kötü niyetli eylemleri ekonomik olarak caydırmak ve Ethereum'u müdaheleye karşı dirençli hale getirmek için tasarlanmıştır. Bu NFT'leri mümkün kılan şeydir. NFT işleminizi içeren blok kesinleştiğinde, bir saldırganın bunu değiştirmesi milyonlarca ETH'ye mal olacaktır. Ethereum yazılımını çalıştıran herkes, bir NFT ile dürüst olmayan kurcalamayı hemen tespit edebilecek ve kötü aktör ekonomik olarak cezalandırılacak ve ağdan atılacaktır. +Ethereum'un güvenliği, hisse ispatından gelir. Sistem, kötü niyetli eylemleri ekonomik olarak caydırmak ve Ethereum'u müdaheleye karşı dirençli hale getirmek için tasarlanmıştır. Bu, NFT'leri mümkün kılan şeydir. NFT işleminizi içeren blok kesinleştiğinde, bir saldırganın bunu değiştirmesi milyonlarca ETH'ye mal olacaktır. Ethereum yazılımını çalıştıran herkes, bir NFT ile dürüst olmayan kurcalamayı hemen tespit edebilecek ve kötü aktör ekonomik olarak cezalandırılacak ve ağdan atılacaktır. NFT'lerle ilgili güvenlik sorunları çoğunlukla kimlik avı dolandırıcılığı, akıllı sözleşme güvenlik açıkları veya kullanıcı hataları (istenmeden özel anahtarların açığa çıkarılması gibi) ile ilgilidir ve bu da iyi cüzdan güvenliğini NFT sahipleri için kritik hale getirir. diff --git a/public/content/translations/tr/roadmap/account-abstraction/index.md b/public/content/translations/tr/roadmap/account-abstraction/index.md index 4cdbdc6e624..ca6838b2a4a 100644 --- a/public/content/translations/tr/roadmap/account-abstraction/index.md +++ b/public/content/translations/tr/roadmap/account-abstraction/index.md @@ -48,7 +48,7 @@ Mesela bir cüzdana yedek anahtarlar eklenebilir. Böylece hesabın ana anahtarl - **Hesap dondurma**: Bir cihaz kaybolursa veya güvenliği ihlal edilirse, hesap başka bir yetkili cihazdan kilitlenerek kullanıcının varlıkları korunabilir. - **Hesap kurtarma**: Bir cihazınızı kaybettiniz ya da bir şifrenizi mi unuttunuz? Mevcut şartlar altında bu, varlıklarınıza olan erişiminizin sonsuza kadar kaybolması anlamına gelir. Bir akıllı sözleşme cüzdanıyla, yeni cihazlara yetki verebilen ve erişimi sıfırlayabilecek önceden onaylanmış bazı hesaplar ayarlayabilirsiniz. - **İşlem sınırı belirleme**: Hesap içerisinden bir gün, hafta veya ay içinde ne kadar varlık transfer edilebileceğine ilişkin günlük sınırlar belirleyebilirsiniz. Bu, bir saldırgan hesabınıza erişim elde ederse tüm varlıkları tek seferde çalamayacağı ve hırsızın erişimini engelleme ve sıfırlama fırsatınız olduğu anlamına gelir. -- **Güvenilir listeler oluşturmak**: Yalnızca güvenli olduğunu bildiğiniz belirli adreslere yapılan işlemlere izin verin. Bu, özel anahtarınız _çalınsa bile_ saldırganın listede olmayan hesaplara para gönderemeyeceği anlamına gelir. Bu güvenilir listeleri değiştirmek için birden fazla imza gerektirir, böylece bir saldırgan, birkaç yedek anahtarınıza erişimi olmadığı sürece kendi adresini listeye ekleyemez. +- **Güvenilir listeler oluşturma**: Yalnızca güvenli olduğunu bildiğiniz belirli adreslere yapılan işlemlere izin verin. Bu, özel anahtarınız _çalınsa bile_ saldırganın listede olmayan hesaplara para gönderemeyeceği anlamına gelir. Bu güvenilir listeleri değiştirmek için birden fazla imza gerektirir, böylece bir saldırgan, birkaç yedek anahtarınıza erişimi olmadığı sürece kendi adresini listeye ekleyemez. ## Daha iyi kullanıcı deneyimi {#better-user-experience} @@ -92,7 +92,7 @@ EIP-4337'nin giriş noktası sözleşmesinin Ethereum Ana Ağı'nda ilk kez 1 Ma -EIP-2938, Ehereum protokolünü 3 farklı alana sahip yeni bir işlem tipiyleAA_TX_TYPE, güncellemeyi düşünüyor: nonce, target ve data, sıralamasında nonce bir işlem sayıcı,target sözleşme adresinin giriş bölgesi ve data ise Ethereum Sanal Makinesi'nin bayt kodudur. Bu işlemleri uygulamak için, Ethereum Sanal Makinesi'ne iki yeni talimat (işlem kodu olarak da bilinir) eklenmelidir: NONCE ve PAYGAS. NONCE işlem kodu islem sekansını takip eder ve PAYGAS ise çekimleri ve işlemin sözleşme dengesi' ile uygulanabilmesi için gerekli gaz ücretlerini hesaplar. Bu yeni özellikler Ethereum'un akıllı sözleşme cüzdanlarını yerel olarak, altyapı zaten Ethereum''un protokolünde oluşturuldu, desteklemesine izin verir. +EIP-2938, Ehereum protokolünü 3 farklı alana sahip yeni bir işlem tipiyleAA_TX_TYPE, güncellemeyi düşünüyor: nonce, target ve data, sıralamasında nonce bir işlem sayıcı,target sözleşme adresinin giriş bölgesi ve data ise Ethereum Sanal Makinesi'nin bayt kodudur. Bu işlemleri uygulamak için, Ethereum Sanal Makinesi'ne iki yeni talimat (işlem kodu olarak da bilinir) eklenmelidir: NONCE ve PAYGAS. NONCE işlem kodu islem sekansını takip eder ve PAYGAS ise para çekme işlemlerini ve işlemin sözleşme dengesi' ile uygulanabilmesi için gerekli gaz ücretlerini hesaplar. Bu yeni özellikler Ethereum'un akıllı sözleşme cüzdanlarını yerel olarak, altyapı zaten Ethereum''un protokolünde oluşturuldu, desteklemesine izin verir. EIP-2938'in güncel olarak aktif olmadığını göz önünde bulundurun. Topluluk şu anda herhangi bir protokol değişikliğine gerek duymadığı için EIP-4337'ye sıcak bakıyor. @@ -117,7 +117,7 @@ Akıllı sözleşme cüzdanları çoktan beri mevcut, ancak bu cüzdanları olab - ["Hesap soyutlama neden merkeziyetsiz uygulamalar için ezber bozan bir şey?", Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) - ["Hesap soyutlama ELI5", Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Vitalik'in "Hesap Soyutlamaya Doğru" notları](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Vitalik'in sosyal toparlanma cüzdanları hakkındaki blog gönderisi](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Vitalik'in sosyal toparlanma cüzdanları hakkındaki blog gönderisi](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [EIP-2938 notları](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [EIP-2938 belgeleri](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 notları](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/tr/roadmap/danksharding/index.md b/public/content/translations/tr/roadmap/danksharding/index.md index cb3c7591af4..53cd56628a3 100644 --- a/public/content/translations/tr/roadmap/danksharding/index.md +++ b/public/content/translations/tr/roadmap/danksharding/index.md @@ -11,7 +11,7 @@ summaryPoints: # Danksharding {#danksharding} -**Danksharding** Ethereum'un nasıl tamamen ölçeklendirebilir bir blok zincire dönüşebilir sorusunun cevabı, ancak o noktaya gelebilmek için yapılması gereken birkaç protokol yükseltmesi var. **Proto-Danksharding** de bu yolun ortalarında bulunan bir adım. İkisi de Katman 2'deki işlemleri kullanıcılar için mümkün olduğu kadar ucuz tutmaya ve Ethereumu >saniyede 100.000 işleme kadar ölçeklendirebilmeyi hedefliyor. +**Danksharding** Ethereum 'un nasıl tamamen ölçeklendirebilir bir blok zincire dönüşebilir sorusunun cevabı, ancak o noktaya gelebilmek için yapılması gereken birkaç protokol yükseltmesi var. **Proto-Danksharding** de bu yolun ortalarında bulunan bir adım. İkisi de Katman 2'deki işlemleri kullanıcılar için mümkün olduğu kadar ucuz tutmaya ve Ethereumu >saniyede 100.000 işleme kadar ölçeklendirebilmeyi hedefliyor. ## Proto-Danksharding nedir? {#what-is-protodanksharding} @@ -77,7 +77,7 @@ Veri kullanılabilirliği örneklendirmesi, doğrulayıcıların hızlı ve etki ### Güncel ilerleme {#current-progress} -Full Danksharding için birkaç yıl daha beklememiz gerekiyor. Ancak, Proto-Danksharding nispeten daha yakın bir tarihte gelecektir. Yazım zamanında (Şubat 2023) KZG töreni hâlâ açık ve şu ana kadar toplam 50000 kişiyi katkıda bulunacak kadar etkiledi. Proto-Danksharding için [EIP](https://eips.ethereum.org/EIPS/eip-4844)'nin olgunlaştığını söyleyebiliriz, şartnamede anlaşıldı ve müşteriler şu anda yürütülen bazı testleri uygulayıp üretime hazır hale getirdi. Bundan sonraki adım ise, bu değişimleri halka açık bir Test Ağında denemek. [EIP 4844 hazırlık kontrolünü](https://github.com/ethereum/pm/blob/master/Breakout-Room/4844-readiness-checklist.md#client-implementation-status) takip ederek güncel durumdan haberdar kalabilirsiniz. +Full Danksharding için birkaç yıl daha beklememiz gerekiyor. Ancak, Proto-Danksharding nispeten daha yakın bir tarihte gelecektir. Yazım zamanında (Şubat 2023) KZG töreni hâlâ açık ve şu ana kadar toplam 50000 kişiyi katkıda bulunacak kadar etkiledi. Proto-Danksharding için [EIP](https://eips.ethereum.org/EIPS/eip-4844)'nin olgunlaştığını söyleyebiliriz, özellikler konusunda anlaşıldı ve müşteriler şu anda yürütülen bazı testleri uygulayıp üretime hazır hale getirdi. Bundan sonraki adım ise, bu değişimleri halka açık bir Test Ağında denemek. [EIP 4844 hazırlık kontrolünü](https://github.com/ethereum/pm/blob/master/Breakout-Room/4844-readiness-checklist.md#client-implementation-status) takip ederek güncel durumdan haberdar kalabilirsiniz. ### Daha fazla bilgi {#further-reading} diff --git a/public/content/translations/tr/roadmap/future-proofing/index.md b/public/content/translations/tr/roadmap/future-proofing/index.md index 6f201fd61cf..3bccf867f84 100644 --- a/public/content/translations/tr/roadmap/future-proofing/index.md +++ b/public/content/translations/tr/roadmap/future-proofing/index.md @@ -35,4 +35,4 @@ Ethereum gelecek ispatı için gereken bir çok yükseltme hâlâ araştırma a - [Gaz](/developers/docs/gas) - [EVM](/developers/docs/evm) -- [Veri Yapıları](/developers/docs/data-structures-and-encoding) +- [Veri yapıları](/developers/docs/data-structures-and-encoding) diff --git a/public/content/translations/tr/roadmap/index.md b/public/content/translations/tr/roadmap/index.md index 63e4f7e8b6c..0783b9e5311 100644 --- a/public/content/translations/tr/roadmap/index.md +++ b/public/content/translations/tr/roadmap/index.md @@ -59,7 +59,7 @@ Ethereum; ölçeklenebilirliğini, güvenliğini ya da sürdürülebilirliğini -Yol haritası çoğunlukla, araştırmacı ve geliştirmecilerin yıllar süren çalışmasının ürünüdür çünkü protokol oldukça tekniktir, ancak motive olmuş kişiler katılabilir. Fikirler genellikle [ethresear.ch](https://ethresear.ch/), [Ethereum sihirbazları](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) gibi forumlarda veya Eth Ar&Ge discord sunucusunda ortaya atılır. Yeni keşfedilmiş sistem açıklarına karşı tepkiler, uygulama katmanında çalışan organizasyonlardan (merkeziyetsiz uygulama ve borsalar) öneriler ya da son kullanıcılar için bilinen ihtilaflar (ücretler veya işlem hızları gibi) olabilir. Bu fikirler olgunlaştığında [Ethereum İyileştirme Önerileri](https://eips.ethereum.org/) olarak önerilebilirler. Herhangi bir zamanda topluluk içinden fikir sunulması için bu, tümüyle halka açık biçimde yapılır. +Yol haritası çoğunlukla, araştırmacı ve geliştirmecilerin yıllar süren çalışmasının ürünüdür çünkü protokol oldukça tekniktir, ancak motive olmuş kişiler katılabilir. Fikirler genellikle [ethresear.ch](https://ethresear.ch/), [Ethereum sihirbazları](https://ethereum-magicians.org/) gibi forumlarda veya Eth Ar&Ge discord sunucusunda tartışma başlıkları olarak ortaya atılır. Yeni keşfedilmiş sistem açıklarına karşı tepkiler, uygulama katmanında çalışan organizasyonlardan (merkeziyetsiz uygulama ve borsalar) öneriler ya da son kullanıcılar için bilinen ihtilaflar (ücretler veya işlem hızları gibi) olabilir. Bu fikirler olgunlaştığında [Ethereum İyileştirme Önerileri](https://eips.ethereum.org/) olarak önerilebilirler. Herhangi bir zamanda topluluk içinden fikir sunulması için bu, tümüyle halka açık biçimde yapılır. [Ethereum yönetişimi hakkında daha fazlası](/yönetişim/) @@ -114,4 +114,4 @@ Parçalama; doğrulayıcı alt kümeleri tüm verinin yalnızca bir kısmından - [Gizli lider seçimi](/roadmap/secret-leader-election) - Akıllı kriptografi; o andaki blok önerenini açık etmeden, onları belli başlı saldırı çeşitlerinden koruyarak kimliklerini güvence altına almada kullanılabilir. - [Hesap soyutlaması](/roadmap/account-abstraction) - Hesap soyutlaması; akıllı sözleşme cüzdanlarını karmaşık ara katman yazılımı kullanmak zorunda olmadan doğası gereği Ethereum üzerinde destekleyen bir yükseltme sınıfıdır. - [Verkle ağaçları](/roadmap/verkle-trees) - Verkle ağaçları, Ethereum üzerinde durumsuz müşterileri mümkün kılmak için kullanılabilecek bir veri yapısıdır. Bu 'durumsuz'' müşterilerin yalnızca çok az miktarda depo hacmi gereksinimi olacak, ancak onlar yine de yeni blokları doğrulamaya devam edebilecekler. -- [Durumsuzluk](/roadmap/statelessness) - durumsuz müşteriler yeni blokları, çok fazla veriyi depolamak zorunda kalmadan doğrulayabilecekler. Bu sayede, düğüm yürütmenin tüm faydaları yalnızca bugünün masraflarının küçük bir kısmıyla karşılanabilecek. +- [Durumsuzluk](/roadmap/statelessness) - Durumsuz müşteriler, çok fazla veriyi depolamak zorunda kalmadan yeni blokları doğrulayabilecekler. Bu sayede, düğüm yürütmenin tüm faydaları yalnızca bugünün masraflarının küçük bir kısmıyla karşılanabilecek. diff --git a/public/content/translations/tr/roadmap/merge/index.md b/public/content/translations/tr/roadmap/merge/index.md index b2c0af46f04..ab0054d6bc2 100644 --- a/public/content/translations/tr/roadmap/merge/index.md +++ b/public/content/translations/tr/roadmap/merge/index.md @@ -1,6 +1,6 @@ --- title: Birleştirme -description: "Birleşim: Ana Ağ Ethereum'un hisse ispatını kullanmaya başlama zamanı hakkında bilgi edinin." +description: 'Birleşim: Ana Ağ Ethereum''un hisse ispatını kullanmaya başlama zamanı hakkında bilgi edinin.' lang: tr template: upgrade image: /upgrades/merge.png @@ -99,7 +99,7 @@ Birleşim, mutabakata değişikliklerle beraber geldi, bu değişiklikler şunla
  • yuva/blok zamanlaması
  • işlem kodu değişiklikleri
  • zincir üstündeki rastgeleliğin kaynakları
  • -
  • güvenli baş ve sonlandırılmış bloklar konsepti
  • +
  • güvenli baş ve kesinleştirilmiş bloklar konsepti
Daha fazla bilgi için, Tim Beiko tarafından yazılmış Birleşim Ethereum'un Uygulama Katmanını Nasıl Etkiler üzerine blog gönderisine bakın. @@ -168,7 +168,7 @@ Shangai/Capella ağ yükseltmesinden bu yana, paydaşlar herhangi bir hisse baki Shanghai/Capella yükseltmesi çekimleri yapılabilir hale getirdiğinden beri, doğrulayıcılar da 32 Ethereum'dan yüksek olan hisse bakiyelerini çekmeye teşvik edildiler, zaten bunlar getiriye eklenmiyordu ve eğer aksi bir durum varsa da kilitleniyordu. APR'ye (toplam hisselenen ETH tarafından belirlenir) bağlı olarak, tüm bakiyelerini geri almak için doğrulayıcılarından çıkmaya veya daha fazla getiri elde etmek için ödüllerini kullanarak potansiyel olarak daha fazla hisselemeye teşvik edilebilirler. diff --git a/public/content/translations/tr/roadmap/merge/issuance/index.md b/public/content/translations/tr/roadmap/merge/issuance/index.md index 85b4d2d8a57..dbb0dfbb791 100644 --- a/public/content/translations/tr/roadmap/merge/issuance/index.md +++ b/public/content/translations/tr/roadmap/merge/issuance/index.md @@ -72,7 +72,7 @@ Fikir birliği katmanı dağıtımı, Birleşim öncesinde olduğu gibi, blok ö Nisan 2023'te gerçekleşen Shanghai/Capella yükseltmesinden beri bu para çekme işlemleri paydaşlar için etkinleştirilmiştir. Paydaşlar _kazançlarını/ödüllerini (32 ETH üzerindeki bakiye)_ kaldırmak üzere teşvik edilir çünkü bu fonlar hisse ağırlıklarına katkıda bulunmazlar (32 maksimum değerdir). -Paydaşlar aynı zamanda çıkmayı ve tüm doğrulayıcı bakiyelerini geri çekmeyi seçebilir. Ethereum'un stabil olduğundan emin olmak için aynı anda sistemi terk eden doğrulayıcı sayısı sınırlanmıştır. +Paydaşlar aynı zamanda çıkmayı ve tüm doğrulayıcı bakiyelerini çekmeyi seçebilir. Ethereum'un stabil olduğundan emin olmak için aynı anda sistemi terk eden doğrulayıcı sayısı sınırlanmıştır. Toplam doğrulayıcıların nerdeyse %0,33'ü belirli bir gün içerisinde çıkabilir. Varsayım olarak her dönemde dört (4) doğrulayıcı çıkabilir (her 6,4 dakikada bir ya da her gün 900). 262.144 (218) üzerindeki her ek 65.536 (216) doğrulayıcı için fazladan bir (1) doğrulayıcının çıkmasına izin verilir. Örneğin 327.680 doğrulayıcı ile her dönemde beş (5) kişi ayrılabilir (günde 1.125). Bu kurala dayalı olarak doğrulayıcı sayısının 393.216 olması durumunda altı (6) kişinin çıkmasına izin verilir. diff --git a/public/content/translations/tr/roadmap/scaling/index.md b/public/content/translations/tr/roadmap/scaling/index.md index 30cabd68801..782bc78df64 100644 --- a/public/content/translations/tr/roadmap/scaling/index.md +++ b/public/content/translations/tr/roadmap/scaling/index.md @@ -32,7 +32,7 @@ Proto-Danksharding sayesinde, blob işlemlerinin Ethereum'un bir parçası olmas Blob verilerinin genişlemesinin ikinci aşaması karmaşıktır çünkü ağdaki toplama verisinin mevcudiyetini kontrol etmek için yeni metotlar gerektirir ve bu, doğrulayıcıların blok oluşturma ve blok önerme sorumluluklarını ayırmalarına dayanır. Aynı zamanda, doğrulayıcıların blob verisinin küçük alt kümelerini doğruladıklarını kriptografik olarak kanıtlamak için bir yol gerekir. -İkinci adım [“Danksharding”](/roadmap/danksharding/) olarak bilinir. Tam olarak uygulanmasına muhtemelen birkaç yıl var. Danksharding [blok oluşturma ve blok önermenin yanında](/roadmap/pbs), [veri kullanılabilirliği örneklendirmesi (DAS)](/developers/docs/data-availability) şeklinde adlandırılan, her seferinde rastgele birkaç kilobayt örneklendirme ile verilerin kullanılabildiği ve kullanılabilirliği verimli bir şekilde doğrulayan yeni ağ tasarımlarına dayanır. +İkinci adım [“Danksharding”](/roadmap/danksharding/) olarak bilinir. Tam olarak uygulanmasına muhtemelen birkaç yıl var. Danksharding [blok oluşturma ve blok önermenin yanında,](/roadmap/pbs) [veri kullanılabilirliği örneklendirmesi (DAS)](/developers/docs/data-availability) şeklinde adlandırılan, her seferinde rastgele birkaç kilobayt örneklendirme ile verilerin kullanılabildiği ve kullanılabilirliği verimli bir şekilde doğrulayan yeni ağ tasarımlarına dayanır. Danksharding hakkında daha fazlası diff --git a/public/content/translations/tr/roadmap/secret-leader-election/index.md b/public/content/translations/tr/roadmap/secret-leader-election/index.md index 30d93277aa4..fff3a72c7bf 100644 --- a/public/content/translations/tr/roadmap/secret-leader-election/index.md +++ b/public/content/translations/tr/roadmap/secret-leader-election/index.md @@ -37,7 +37,7 @@ Ayrıca, doğrulayıcıların hepsinin her bir kümede bir blok önermek için r ## Güncel ilerleme {#current-progress} -Hem SSLE hem de SnSLE şu anda araştırma aşamasında. Henüz iki fikrin de sonuçlanmış bir tanımlaması yok. SSLE ve SnSLE ikisi de hâlâ uygulanamayan öneriler için rekabet halinde. Uygulamaya geçmeden önce halka açık test ağlarında biraz daha araştırmaya, geliştirmeye, prototiplemeye ve denenmeye ihtiyacı var. +Hem SSLE hem de SnSLE şu anda araştırma aşamasında. Henüz iki fikrin de sonuçlanmış bir özelliği yok. SSLE ve SnSLE ikisi de hâlâ uygulanamayan öneriler için rekabet halinde. Uygulamaya geçmeden önce halka açık test ağlarında biraz daha araştırmaya, geliştirmeye, prototiplemeye ve denenmeye ihtiyacı var. ## Daha fazla bilgi {#further-reading} diff --git a/public/content/translations/tr/roadmap/security/index.md b/public/content/translations/tr/roadmap/security/index.md index d95b5bcdb9c..54a808a970d 100644 --- a/public/content/translations/tr/roadmap/security/index.md +++ b/public/content/translations/tr/roadmap/security/index.md @@ -7,21 +7,21 @@ alt: "Ethereum yol haritası" template: roadmap --- -Ethereum halihazırda çok güvenli, merkeziyetsiz bir akıllı sözleşme platformudur. Bununla birlikte, Ethereum'un gelecekte her türlü saldırıya karşı dayanıklı kalabilmesi için yapılabilecek iyileştirmeler hâlâ var. Bu iyileştirmeler, Ethereum istemcilerinin rakip bloklarla başa çıkma şeklindeki ince değişikliklere ek olarak, ağın blokların [sonlandırılmış](/developers/docs/consensus-mechanisms/pos/#finality) kabul ettiği hız arttırma sürecini de içerir (bu, blokların saldırgana aşırı ekonomik kayıplar vermeden değiştirilemeyeceği anlamına gelir). +Ethereum halihazırda çok güvenli, merkeziyetsiz bir akıllı sözleşme platformudur. Bununla birlikte, Ethereum'un gelecekte her türlü saldırıya karşı dayanıklı kalabilmesi için yapılabilecek iyileştirmeler hâlâ var. Bu iyileştirmeler, Ethereum istemcilerinin rakip bloklarla başa çıkma şeklindeki ince değişikliklere ek olarak, ağın blokların [kesinleştirilmiş](/developers/docs/consensus-mechanisms/pos/#finality) kabul ettiği hız arttırma sürecini de içerir (bu, blokların saldırgana aşırı ekonomik kayıplar vermeden değiştirilemeyeceği anlamına gelir). Ayrıca, bir istemci sansür uyguladığında belirlenmesini sağlayan, blok önericilerini blokların gerçek içeriğine kör ederek işlemleri sansürlemeyi çok daha zor hale getiren yeni iyileştirmeler de var. Bu iyileştirmeler, hisse ispatı protokolünü yükseltecek, böylece kullanıcılar -bireylerden şirketlere- Ethereum'daki uygulama, veri ve varlıklarına anında güven duyacaklar. ## Hisseden ödeme alma {#staking-withdrawals} -İş ispatından hisse ispatına yükseltme, Ethereum öncülerinin ETH'lerini bir mevduat sözleşmesinde "hisselemeleri" ile başladı. Adı geçen ETH, ağı korumak için kullanılıyor ancak bu ETH'nin kilidi henüz açılamıyor ve kullanıcılara iade edilemiyor. Hisse ispatı yükseltmesinin en kritik parçası ETH'nin çekilmesine olanak sağlaması. ETH çekme işlemlerinin, işlevsel bir hisse ispatı protokolünün kritik bir parçası olmasına ek olarak, bu çekme işlemleri paydaşların ETH ödüllerini hisseleme amaçları dışında kullanmalarına izin vererek Ethereum güvenliğine de katkı sağlıyor. Bu, likidite isteyen kullanıcıların, Ethereum üzerinde merkezileştirici bir gücü olabilecek likit hisseleme türevlerine (LSD'ler) bel bağlamak zorunda olmadıkları anlamına geliyor. Bu yükseltmenin 12 Nisan 2023'te tamamlanması planlanıyor. +İş ispatından hisse ispatına yükseltme, Ethereum öncülerinin ETH'lerini bir mevduat sözleşmesinde "hisselemeleri" ile başladı. Adı geçen ETH, ağı korumak için kullanılıyor ancak bu ETH'nin kilidi henüz açılamıyor ve kullanıcılara iade edilemiyor. Hisse ispatı yükseltmesinin en kritik parçası ETH'nin çekilmesine olanak sağlaması. ETH çekme işlemlerinin, işlevsel bir hisse ispatı protokolünün kritik bir parçası olmasına ek olarak, bu para çekme işlemleri paydaşların ETH ödüllerini hisseleme amaçları dışında kullanmalarına izin vererek Ethereum güvenliğine de katkı sağlıyor. Bu, likidite isteyen kullanıcıların, Ethereum üzerinde merkezileştirici bir gücü olabilecek likit hisseleme türevlerine (LSD'ler) bel bağlamak zorunda olmadıkları anlamına geliyor. Bu yükseltmenin 12 Nisan 2023'te tamamlanması planlanıyor. -Para çekme hakkındakileri oku +Para çekme hakkındakileri okuyun ## Saldırılara karşı savunma {#defending-against-attacks} ETH çekimine olanak sağlandığı halde, Ethereum'un [hisse ispatı](/developers/docs/consensus-mechanisms/pos/) protokolünde yapılabilecek iyileştirmeler hâlâ mevcut. Bi̇r tanesi [Görüntü Birleşimi](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739) olarak bilinir- belli komplike atakları zorlaştıran daha güvenli bir çatal seçim algoritmasıdır. -Ethereum'un blokları sonlandırmak için harcadığı süreyi azaltmak, daha iyi bir kullanıcı deneyimi sağlar ve saldırganların kar elde etmek veya belirli işlemleri sansürlemek amacıyla yeni blokları yeniden düzenlemeye çalıştığı karmaşık "reorg" saldırılarını engeller. [**Tek yuva kesinliği (SSF)**](/roadmap/single-slot-finality/) sonlandırma gecikmesini en aza indirgemenin bir yoludur. Şu anda bir saldırganın teorik olarak diğer doğrulayıcıları yeniden yapılandırmaya ikna edebileceği 15 dakika değerinde bloklar var. Bu süre SSF ile birlikte sıfıra iniyor. Bireylerden uygulamalara ve borsalara kadar kullanıcılar, işlemlerinin iptal edilmeyeceğine dair hızlı güvenceden yararlanır, ağ ise bütün bir saldırı grubunu durdurarak fayda sağlar. +Ethereum'un blokları kesinleştirmek için harcadığı süreyi azaltmak, daha iyi bir kullanıcı deneyimi sağlar ve saldırganların kar elde etmek veya belirli işlemleri sansürlemek amacıyla yeni blokları yeniden düzenlemeye çalıştığı karmaşık "reorg" saldırılarını engeller. [**Tek yuva kesinliği (SSF)**](/roadmap/single-slot-finality/) kesinleştirme gecikmesini en aza indirgemenin bir yoludur. Şu anda bir saldırganın teorik olarak diğer doğrulayıcıları yeniden yapılandırmaya ikna edebileceği 15 dakika değerinde bloklar var. Bu süre SSF ile birlikte sıfıra iniyor. Bireylerden uygulamalara ve borsalara kadar kullanıcılar, işlemlerinin iptal edilmeyeceğine dair hızlı güvenceden yararlanır, ağ ise bütün bir saldırı grubunu durdurarak fayda sağlar. Tek yuva kesinliği hakkındakileri oku @@ -45,4 +45,4 @@ Tecrübeli bir saldırganın, yaklaşan doğrulayıcıları saptayıp, blok öne ## Güncel ilerleme {#current-progress} -Yol haritasındaki güvenlik yükseltmeleri, araştırmanın ileri seviyelerinde olsa da, bir süre daha uygulanmaları beklenmiyor. Görüntü birleşiminin sonraki adımları ise PBS, SSF ve SLE'dir, bunlar uzmanlaşmayı kesinleştirip prototip inşa etmeye başlamak içindir. +Yol haritasındaki güvenlik yükseltmeleri, araştırmanın ileri seviyelerinde olsa da, bir süre daha uygulanmaları beklenmiyor. Görüntü birleşiminin sonraki adımları ise PBS, SSF ve SLE'dir, özellikleri kesinleştirip prototip inşa etmeye başlamak içindir. diff --git a/public/content/translations/tr/roadmap/statelessness/index.md b/public/content/translations/tr/roadmap/statelessness/index.md index 5cc6bb4891c..1bc0a4a0f15 100644 --- a/public/content/translations/tr/roadmap/statelessness/index.md +++ b/public/content/translations/tr/roadmap/statelessness/index.md @@ -81,7 +81,7 @@ Zayıf durumsuzluk geliştirilmiş bir araştırma aşamasındadır, ancak öner ### Güçlü durumsuzluk {#strong-statelessness} -Güçlü durumsuzluk herhangi bir blokun durum verisi depolaması ihtiyacını ortadan kaldırır. Bunun yerine, işlemler blok oluşturucular tarafından toplanabilen tanıklar aracılığıyla gönderilir. Blok oluşturucular sonrasında sadece alakalı hesaplara gerekli tanıkları oluşturman durumu depolamaktan sorumludur. Durumun sorumluluğu neredeyse tamamen kullanıcılara verilmiştir, yani kullanıcılar hangi hesap ve depolama anahtarlarıyla etkileşimde olduklarını tanımlamak için tanıkları ve "erişim listelerini" gönderirler. +Güçlü durumsuzluk herhangi bir blokun durum verisi depolaması ihtiyacını ortadan kaldırır. Bunun yerine, işlemler blok oluşturucular tarafından toplanabilen tanıklar aracılığıyla gönderilir. Blok oluşturucular sonrasında sadece alakalı hesaplara gerekli tanıkları oluşturman durumu depolamaktan sorumludur. Durumun sorumluluğu neredeyse tamamen kullanıcılara verilmiştir, yani kullanıcılar hangi hesap ve depolama anahtarlarıyla etkileşimde olduklarını tanımlamak için tanıkları ve "erişim listelerini" gönderirler. Bu, son derece hafif düğümleri olanaklı kılardı ancak akıllı sözleşmelerle işlem yapmayı zorlaştırmak gibi bazı bedeller söz konusudur. Güçlü durumsuzluk araştırmacılar tarafından incelendi fakat şu anda Ethereum Yol Haritasının bir parçası olması beklenmiyor - Ethereum'un ölçeklendirilme gereklilikleri için şu anda zayıf durumsuzluk yeterli gibi görünüyor. @@ -95,7 +95,7 @@ Zayıf durumsuzluk, tarih sonlanması ve durum sonlanması hâlâ araştırma a - [Durum boyutu yönetimi teorisi](https://hackmd.io/@vbuterin/state_size_management) - [Diriliş-anlaşmazlık-minimize edilmiş durum sınırlaması](https://ethresear.ch/t/resurrection-conflict-minimized-state-bounding-take-2/8739) - [Durumsuzluğa giden yollar ve durum sonlanması](https://hackmd.io/@vbuterin/state_expiry_paths) -- [EIP-4444 şartnamesi](https://eips.ethereum.org/EIPS/eip-4444) +- [EIP-4444 özellikleri](https://eips.ethereum.org/EIPS/eip-4444) - [Alex Stokes'un EIP-4444 hakkındaki görüşleri](https://youtu.be/SfDC_qUZaos) - [Durumsuzluk neden bu kadar önemli](https://dankradfeist.de/ethereum/2021/02/14/why-stateless.html) - [Orijinal durumsuz istemcinin konsept notları](https://ethresear.ch/t/the-stateless-client-concept/172) diff --git a/public/content/translations/tr/roadmap/verkle-trees/index.md b/public/content/translations/tr/roadmap/verkle-trees/index.md index 43f7dcffdf0..261af1365a3 100644 --- a/public/content/translations/tr/roadmap/verkle-trees/index.md +++ b/public/content/translations/tr/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ Verkle ağacı test ağları zaten aktif ve çalışıyor, ancak Verkle ağaçla - ["Verkle ağaçları Ethereum'u nasıl yalın ve anlamlı kılar", Devcon 6'da Guillaume Ballet](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Durumsuz müşteriler, ETHDenver 2020'den Piper Merriam](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Dankrad Fiest, Sıfır Bilgi podcast'inde Verkle ağaçlarını ve durumsuzluğu açıklıyor](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Verkle ağaçları, Vitalik Buterin](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Verkle ağaçları, Vitalik Buterin](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Verkle ağaçları, Dankrad Feist](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [Verkle ağacı EIP Belgeleri](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/tr/security/index.md b/public/content/translations/tr/security/index.md index 9091f3cca4b..6956f2a9e98 100644 --- a/public/content/translations/tr/security/index.md +++ b/public/content/translations/tr/security/index.md @@ -24,7 +24,7 @@ Zayıf şifre örneği: TatlıTüylüKedicikler! Güçlü şifre örneği: ymv\*azu.EAC8eyp8umf ``` -Bir başka yaygın hata da, [sosyal mühendislik]() aracılığıyla kolayca tahmin edilebilen veya bulunabilen şifreler kullanmaktır. Şifrenizde annenizin kızlık soyadı, çocuklarınızın veya evcil hayvanlarınızın adları veya doğum tarihlerinin bulunması güvenli değildir ve şifrenizin ele geçirilme riskini artırır. +Bir başka yaygın hata da, [sosyal mühendislik](https://wikipedia.org/wiki/Social_engineering_(security)) aracılığıyla kolayca tahmin edilebilen veya bulunabilen şifreler kullanmaktır. Şifrenizde annenizin kızlık soyadı, çocuklarınızın veya evcil hayvanlarınızın adları veya doğum tarihlerinin bulunması güvenli değildir ve şifrenizin ele geçirilme riskini artırır. #### Şifre belirlemek için iyi yöntemler: {#good-password-practices} @@ -66,7 +66,7 @@ Gerçekten siz olduğunuzu kanıtlamak için, kimlik doğrulama için kullanıla - Olduğunuz bir şey (parmak izi veya göz/yüz tarayıcısı gibi) - Sahip olduğunuz bir şey (telefonunuzda bir güvenlik anahtarı veya kimlik doğrulama uygulaması) -**İki Faktörlü Doğrulama (2FA)** kullanmak çevrimiçi hesaplarınız için ek bir _güvenlik faktörü_ sağlar; böylece sadece şifrenizi bilmek (bildiğiniz bir şey) bir hesaba erişmek için yeterli değildir. En yaygın olarak, ikinci faktör **zaman esaslı tek seferlik şifre (TOTP)** olarak bilinen, Google Authenticator veya Authy gibi bir doğrulayıcı uygulamadan ulaşabileceğiniz rastgele seçilmiş 6 haneli bir koddur. Bunlar "senin sahip olduğun bir şey" faktörü ile çalışırlar çünkü zamanlı kodu oluşturan tohum, sizin aygıtınızda depolanır. +**İki Faktörlü Doğrulama (2FA)** kullanmak çevrimiçi hesaplarınız için ek bir *güvenlik faktörü* sağlar; böylece sadece şifrenizi bilmek (bildiğiniz bir şey) bir hesaba erişmek için yeterli değildir. En yaygın olarak, ikinci faktör **zaman esaslı tek seferlik şifre (TOTP)** olarak bilinen, Google Authenticator veya Authy gibi bir doğrulayıcı uygulamadan ulaşabileceğiniz rastgele seçilmiş 6 haneli bir koddur. Bunlar "senin sahip olduğun bir şey" faktörü ile çalışırlar çünkü zamanlı kodu oluşturan tohum, sizin aygıtınızda depolanır.
@@ -270,7 +270,6 @@ Airdrop dolandırıcılığı, bir varlığı (NFT, token) cüzdanınıza Airdro ### Web güvenliği {#reading-web-security} -- [Bu sebepten dolayı iki faktörlü doğrulama için metin kullanmamalısınız](https://www.theverge.com/2017/9/18/16328172/sms-two-factor-authentication-hack-password-bitcoin) - _The Verge_ - [3 milyona yakın aygıt kötü amaçlı yazılım işlenmiş Chrome ve Edge eklentileri tarafından enfekte edildi](https://arstechnica.com/information-technology/2020/12/up-to-3-million-devices-infected-by-malware-laced-chrome-and-edge-add-ons/) - _Dan Goodin_ - [Asla Unutmayacağınız Güçlü Bir Şifre Nasıl Oluşturulur](https://www.avg.com/en/signal/how-to-create-a-strong-password-that-you-wont-forget) - _AVG_ - [Güvenlik anahtarı nedir?](https://help.coinbase.com/en/coinbase/getting-started/verify-my-account/security-keys-faq) - _Coinbase_ @@ -278,7 +277,7 @@ Airdrop dolandırıcılığı, bir varlığı (NFT, token) cüzdanınıza Airdro ### Kripto güvenliği {#reading-crypto-security} - [Kendinizi ve Fonlarınızı Koruma](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [Kriptoda Güvende Kalmanın 4 Yolu](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [Yaygın kripto iletişim yazılımlarındaki güvenlik sorunları](https://docs.salusec.io/untitled/web3-penetration-test/risks-in-social-media) - _Salus_ - [Acemiler ve Zeki İnsanlar için Güvenlik Rehberi](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [Kripto Güvenliği: Şifreler ve Doğrulama](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/tr/zero-knowledge-proofs/index.md b/public/content/translations/tr/zero-knowledge-proofs/index.md index fa9e65958d6..53678f092c1 100644 --- a/public/content/translations/tr/zero-knowledge-proofs/index.md +++ b/public/content/translations/tr/zero-knowledge-proofs/index.md @@ -150,7 +150,7 @@ Blok zincir oylama şemalarının pek çok olumlu özelliği vardır: tamamen de Rüşvet ve gizli anlaşmalar, (özellikle kullanıcılar hangi oyu verdiklerini kanıtlayabildiğinde) oylamayı bir sinyal mekanizması olarak kullanan süreçlerin verimliliğini kısıtlar. Özellikle oyların sınırlı kaynak kullanımını etkilediği durumlarda, bu durum önemli sonuçlara yol açabilir. -Örneğin, [kuadratik fonlama mekanizmaları](https://www.radicalxchange.org/concepts/plural-funding/) farklı kamu projeleri arasında tercihleri belirlemek üzere bağışları kullanır. Her bağış, projeler için bir "oy" sayılır ve daha çok oy alan projeler eşleştirme havuzundan daha çok fon alır. +Örneğin, [kuadratik fonlama mekanizmaları](https://www.radicalxchange.org/concepts/plural-funding/) farklı kamu projeleri arasında tercihleri belirlemek üzere bağışları kullanır. Her bağış, projeler için bir "oy" sayılır ve daha çok oy alan projeler eşleştirme havuzundan daha çok fon alır. Zincir üstü oylama kullanmak, kuadratik fonlamayı gizli anlaşmalara açık hale getirir: Blok zincir işlemleri herkese açıktır, yani rüşvet verenler zincir üstü aktiviteleri inceleyebilir ve rüşvet alanların "oylarını" görebilir. Bu şekilde kuadratik fonlama, topluluğun tercihlerine dayalı fonların kullanımı için etkili bir yöntem olmaktan çıkar. @@ -176,7 +176,7 @@ MACI kullanmak koordinatöre rüşvetçilerle tezgah çevirmemesi veya oy veren Ancak koordinatörün dürüst olduğu durumlarda, MACI zincir üzerinde oylamaların doğruluğunu garantilemek için güçlü bir aracı temsil eder. Bu onun büyük miktarda her bir kişinin oy seçimlerinin bütünlüğüne dayanan ikinci dereceden finansman uygulamalar (ör. [clr.fund](https://clr.fund/#/about/maci)) arasındaki popülerliğini açıklar. -[MACI hakkında daha fazla bilgi edinin](https://github.com/privacy-scaling-explorations/maci/blob/master/specs/01_introduction.md). +[MACI hakkında daha fazla bilgi edinin](https://privacy-scaling-explorations.github.io/maci/). ## Sıfır bilgili ispatları kullanmanın dezavantajları {#drawbacks-of-using-zero-knowledge-proofs} @@ -208,5 +208,5 @@ ZK-STARK şifreleme için çarpışmaya direçli karmalar kullandığı için ku - [Bir Sıfır Bilgili İspat: Blok Zincirde Gizliliği İyileştirmek](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARK'lar - Gerçekçi Bir Sıfır Bilgi Örneği ve Derinlemesine İnceleme](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARK'lar - Kuantum Bilgisayarlara Bile Karşı Doğrulanabilir Güven Oluşturmak](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) —_Adam Luciano_ -- [zk-SNARK'ların nasıl mümkün olduğuna ilişkin yaklaşık bir giriş](https://vitalik.ca/general/2021/01/26/snarks.html) - _Vitalik Buterin_ +- [zk-SNARK'ların nasıl mümkün olduğuna ilişkin yaklaşık bir giriş](https://vitalik.eth.limo/general/2021/01/26/snarks.html) - _Vitalik Buterin_ - [Sıfır Bilgili İspat ve Blok Zincirdeki Rolü Nedir?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) - _LeewayHertz_ diff --git a/public/content/translations/uk/dao/index.md b/public/content/translations/uk/dao/index.md index 6d52114698e..9a9b55878bf 100644 --- a/public/content/translations/uk/dao/index.md +++ b/public/content/translations/uk/dao/index.md @@ -156,7 +156,7 @@ _Зазвичай використовується для децентраліз - [Як запустити цифрову спільноту на основі DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) — [DAOhaus](https://daohaus.club/) - [Що таке DAO?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) — [Coinmarketcap](https://coinmarketcap.com) - [Що таке голографічний консенсус?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) — [DAOstack](https://daostack.io/) -- [DAO — не корпорація: де має значення децентралізація в автономних організаціях, Віталік](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO — не корпорація: де має значення децентралізація в автономних організаціях, Віталік](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA тощо: неповний посібник з термінології](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [блог Ethereum](https://blog.ethereum.org) ### Відеоматеріали {#videos} diff --git a/public/content/translations/uk/decentralized-identity/index.md b/public/content/translations/uk/decentralized-identity/index.md index e13143e65c5..960e84d2aad 100644 --- a/public/content/translations/uk/decentralized-identity/index.md +++ b/public/content/translations/uk/decentralized-identity/index.md @@ -109,7 +109,7 @@ summaryPoint3: Завдяки криптовалюті користувачі з ### Токени Soulbound та ідентичність {#soulbound} -[Токени Soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) (NFT, що не підлягають передаванню) можна використовувати для збору інформації, унікальної для певного гаманця. Це фактично створює унікальну ідентифікаційну інформацію в ланцюжку, прив’язану до конкретної адреси Ethereum, яка може містити токени, що представляють досягнення (наприклад, завершення певного онлайн-курсу або проходження порогового значення в грі) або участь у спільноті. +[Токени Soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (NFT, що не підлягають передаванню) можна використовувати для збору інформації, унікальної для певного гаманця. Це фактично створює унікальну ідентифікаційну інформацію в ланцюжку, прив’язану до конкретної адреси Ethereum, яка може містити токени, що представляють досягнення (наприклад, завершення певного онлайн-курсу або проходження порогового значення в грі) або участь у спільноті. ## Переваги децентралізованої ідентичності {#benefits-of-decentralized-identity} diff --git a/public/content/translations/uk/desci/index.md b/public/content/translations/uk/desci/index.md index d0e2f2a5ff0..255e36436e0 100644 --- a/public/content/translations/uk/desci/index.md +++ b/public/content/translations/uk/desci/index.md @@ -76,7 +76,7 @@ Web3 має потенціал розірвати цю несправну мод Так само як NFT можуть передавати дохід від майбутніх транзакцій початковому творцю, ви можете встановити прозорі ланцюжки атрибуції вартості для винагороди дослідників, управлінських органів (наприклад, DAO) або навіть суб'єктів, чиї дані збираються. -[Токени IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) можуть також виконувати функцію ключа до децентралізованого сховища даних досліджень, що проводяться, і підключатися до NFT і фінансування [DeFi](/defi/) (від фракціонування до пулів кредитування та оцінки вартості). Це також дає сутностям, що перебувають на ланцюжку, як-от DAO (наприклад, [VitaDAO](https://www.vitadao.com/)), здійснювати дослідження безпосередньо на ланцюжку. Поява непередаваних [токенів soulbound](https://vitalik.ca/general/2022/01/26/soulbound.html) також може відігравати важливу роль у DeSci, даючи людям змогу засвідчувати свій досвід і облікові дані, пов'язані з їхньою адресою Ethereum. +[Токени IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) можуть також виконувати функцію ключа до децентралізованого сховища даних досліджень, що проводяться, і підключатися до NFT і фінансування [DeFi](/defi/) (від фракціонування до пулів кредитування та оцінки вартості). Це також дає сутностям, що перебувають на ланцюжку, як-от DAO (наприклад, [VitaDAO](https://www.vitadao.com/)), здійснювати дослідження безпосередньо на ланцюжку. Поява непередаваних [токенів soulbound](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) також може відігравати важливу роль у DeSci, даючи людям змогу засвідчувати свій досвід і облікові дані, пов'язані з їхньою адресою Ethereum. ### Зберігання й архітектура даних і доступ до них {#data-storage} diff --git a/public/content/translations/uk/governance/index.md b/public/content/translations/uk/governance/index.md index 16fca0f12c9..b85ade9498c 100644 --- a/public/content/translations/uk/governance/index.md +++ b/public/content/translations/uk/governance/index.md @@ -175,9 +175,9 @@ _Примітка. Будь-хто може належати до кількох Процес керування в Ethereum не є чітко визначеним. Різні учасники спільноти мають власні погляди щодо цього. Ви можете ознайомитися з ними нижче. -- [Примітка до управління Blockchain](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [Примітка до управління Blockchain](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [Як працює управління Ethereum?](https://cryptotesters.com/blog/ethereum-governance) – _Криптотестувальники_ - [Як працює управління Ethereum](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) - _Міка Золту_ - [Хто основний розробник Ethereum?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Хадсон Джеймсон_ -- [Керування, частина 2. Плутократія — це все ще погано](https://vitalik.ca/general/2018/03/28/plutocracy.html) — _Віталік Бутерін_ -- [Відмова від керування з голосуванням монетами](https://vitalik.ca/general/2021/08/16/voting3.html) — _Віталік Бутерін_ +- [Керування, частина 2. Плутократія — це все ще погано](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) — _Віталік Бутерін_ +- [Відмова від керування з голосуванням монетами](https://vitalik.eth.limo/general/2021/08/16/voting3.html) — _Віталік Бутерін_ diff --git a/public/content/translations/uk/zero-knowledge-proofs/index.md b/public/content/translations/uk/zero-knowledge-proofs/index.md index 3904694988c..ce0a6e0b69f 100644 --- a/public/content/translations/uk/zero-knowledge-proofs/index.md +++ b/public/content/translations/uk/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK вважається захищеним від загрози кван - [Доказ із нульовим розголошенням: покращення конфіденційності в блокчейні](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Дмітрій Лавренов_ - [zk-SNARK. Реалістичний приклад нульового розголошення і глибоке занурення в нього](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Адам Лучіано_ - [ZK-STARK — створення довіри, яку можна перевірити, навіть попри квантові компʼютери](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Адам Лучіано_ -- [Чому можливі ZK-SNARK? Загальний огляд](https://vitalik.ca/general/2021/01/26/snarks.html) — _Віталік Бутерін_ +- [Чому можливі ZK-SNARK? Загальний огляд](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Віталік Бутерін_ - [Що таке доказ із нульовим розголошенням і яка його роль у блокчейні?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _Лівай Херц_ diff --git a/public/content/translations/vi/dao/index.md b/public/content/translations/vi/dao/index.md index 57220cacd81..54043625a08 100644 --- a/public/content/translations/vi/dao/index.md +++ b/public/content/translations/vi/dao/index.md @@ -156,7 +156,7 @@ _Thường được sử dụng để phát triển và quản lí phi tập tru - [Làm thế nào để khởi phát một cộng đồng số hoạt động dựa trên DAO](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) - [DAOhaus](https://daohaus.club/) - [DAO là gì?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) - [Coinmarketcap](https://coinmarketcap.com) - [Đồng thuận đa chiều là gì?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO không phải là công ty: Khi sự phân quyền trong tổ chức tự trị có vai trò quan trọng, theo Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [DAO không phải là công ty: Khi sự phân quyền trong tổ chức tự trị có vai trò quan trọng, theo Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [DAO, DAC, DA và Nhiều Hơn Nữa: Hướng Dẫn Thuật Ngữ Không Hoàn Chỉnh](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [Ethereum Blog](https://blog.ethereum.org) ### Video {#videos} diff --git a/public/content/translations/zh-tw/community/code-of-conduct/index.md b/public/content/translations/zh-tw/community/code-of-conduct/index.md index 4d00bd1ff44..10db533599d 100644 --- a/public/content/translations/zh-tw/community/code-of-conduct/index.md +++ b/public/content/translations/zh-tw/community/code-of-conduct/index.md @@ -1,5 +1,5 @@ --- -title: 管理辦法 +title: 行為守則 description: 我們在 ethereum.org 努力追求的基本標準。 lang: zh-tw --- @@ -23,19 +23,19 @@ Ethereum.org 致力於: - 以太坊基金會的網站 - 推廣投資或以任何形式牟取暴利的平臺 -- 認可個人專案或為任何組織背書的平臺 +- 認可個人專案,或為任何組織背書的平臺 - 中心化及去中心化交易所,或其他任何形式的金融平臺 - 提供投資建議或法律諮詢等的平臺 -## 管理辦法 {#code-of-conduct} +## 行為守則 {#code-of-conduct} ### 承諾 {#pledge} -開放參與是 ethereum.org 的核心精神。 我們的網站和社群由數千位貢獻者維護,只有當我們維持友好的參與環境時,這才可能實現。 為此,本網站的貢獻者承諾將為所有 ethereum.org 平臺及社群的參與者維持零騷擾的環境。 Ethereum.org 社群歡迎和重視任何友善或想參與建設的人,無論年齡、是否殘疾、種族、性別特徵、性別認同、經驗水平、專業領域、教育、社會經濟地位、國籍、外觀、種族、宗教或任何其他方面的多樣性。 +開放參與是 ethereum.org 的核心精神。 我們的網站和社群由數千位貢獻者維護,只有當我們維持友好的參與環境時,這才可能實現。 為此,本網站的貢獻者承諾將為所有 ethereum.org 平臺及社群參與者維持一個零騷擾的環境。 Ethereum.org 社群歡迎和重視任何友善或想參與建設的人,無論年齡、是否殘疾、種族、性別特徵、性別認同、經驗水平、專業領域、教育、社會經濟地位、國籍、外觀、種族、宗教或任何其他方面的多樣性。 ### 適用範圍 {#scope} -此管理辦法適用於所有 ethereum.org 空間(如 GitHub、Discord、Figma、Crowdin、Twitter 和其他線上平臺),且當社群在現實世界的公共場所(如:聚會、座談會及活動等等)時也同樣適用。 +此行為守則適用於所有 ethereum.org 空間(如 GitHub、Discord、Figma、Crowdin、Twitter 和其他線上平臺),且當社群在現實世界的公共場所(如:聚會、座談會及活動等等)時也同樣適用。 ### 我們的標準 {#our-standards} @@ -52,8 +52,8 @@ Ethereum.org 致力於: - 人身暴力、威脅人身暴力或鼓勵任何形式的人身暴力 - 使用帶有性暗示的言語或圖像,或令人反感的性關注 -- 冒充他人,或以其他方式謊稱與某些人或組織有聯繫 -- 蓄意激怒、汙辱/貶低他人和人身或政治上的攻擊 +- 冒充他人或以其他方式謊稱與某些人或組織有聯繫 +- 蓄意激怒、汙辱/貶低他人,以及人身或政治上的攻擊 - 在公開或私人頻道中騷擾其他社群成員 - 未經許可公開他人的私人資料,如實體住址或網路位址 - 使用社交工程、詐騙或操控其他社群成員 @@ -64,12 +64,12 @@ Ethereum.org 致力於: ### 檢舉 {#reporting} -違反管理辦法的行為一般來說會被社群看到,因為我們努力讓一切透明,以便社群成員能夠自我監督。 +違反行為守則一般來說都會被社群看到,因為我們努力讓一切透明,以便社群成員能夠自我監督。 然而,如果發生了一些你覺得需要額外關注的事件,你可以向擁有版主身份者(如 discord guide)提出,使他們能協助調查和執行適當的回覆。 -檢舉時,請儘可能附上詳細資訊,包括具體的例子與發生時間。 這有助於確保公平的結果。 +檢舉時,請儘可能附上詳細資訊,包括具體的例子與發生時間。 這有助於確保結果公平。 ### 強製執行 {#enforcement} -依據嚴重程度,違反指導原則者可能會收到警告、暫時停權或永久踢出 ethereum.org 社群。 +依據嚴重程度,違反行為守則者可能會收到警告、暫時停權或被永久踢出 ethereum.org 社群。 diff --git a/public/content/translations/zh-tw/community/events/index.md b/public/content/translations/zh-tw/community/events/index.md index 9b9e90f16db..24cb71fb3ae 100644 --- a/public/content/translations/zh-tw/community/events/index.md +++ b/public/content/translations/zh-tw/community/events/index.md @@ -19,6 +19,6 @@ hideEditButton: true -有興趣舉辦自己的聚會嗎? 請查看[BUIDL Network](https://consensys.net/developers/buidlnetwork/),這是個由 ConsenSys 為了幫助以太坊社群聚會而提出的提案。 +有興趣舉辦自己的聚會嗎? 請查看 [BUIDL Network](https://consensys.net/developers/buidlnetwork/),這是個由 ConsenSys 為了幫助以太坊社群聚會而提出的提案。 這是一個由我們社群所維護的部分活動清單, 你可以從[這裡找到更多以太坊聚會。](https://www.meetup.com/topics/ethereum/) 若你知曉其他未於此清單列出的聚會, [請幫忙加入!](https://github.com/ethereum/ethereum-org-website/blob/dev/src/data/community-meetups.json) diff --git a/public/content/translations/zh-tw/community/get-involved/index.md b/public/content/translations/zh-tw/community/get-involved/index.md index 8595fdcb88b..199bf7d3127 100644 --- a/public/content/translations/zh-tw/community/get-involved/index.md +++ b/public/content/translations/zh-tw/community/get-involved/index.md @@ -8,47 +8,47 @@ lang: zh-tw 以太坊社群裡包含了具有各種不同背景跟技術的人。 無論你是開發者、藝術家或是會計師,你總會找到方法參與我們的社群。 以下建議可幫助你踏出第一步。 -由閱讀[管理辦法](/community/code-of-conduct)中 ethereum.org 的使命與核心價值開始。 +由閱讀[行為守則](/community/code-of-conduct)中 ethereum.org 的使命與核心價值開始。 ## 程式開發人員 {#developers} -- 訪問 [ethereum.org/developers/](/developers/),瞭解和嘗試使用以太坊 -- [從 Gitcoin 獲得懸賞](https://gitcoin.co/),透過解決大小技術問題轉區加密貨幣! +- 造訪 [ethereum.org/developers/](/developers/),瞭解和嘗試使用以太坊 +- [從 Gitcoin 獲得賞金](https://gitcoin.co/),透過解決大小技術問題來賺取加密貨幣! - 參加你附近的 [ETHGlobal](http://ethglobal.co/) 駭客松活動。 - 留意[與你的專業領域或偏好的編程語言有關的專案](/developers/docs/programming-languages/) - 觀看或參與[核心開發者會議](https://www.youtube.com/playlist?list=PLaM7G4Llrb7zfMXCZVEXEABT8OSnd4-7w) -- [以太坊生態系統支持計劃願望清單](https://esp.ethereum.foundation/wishlist/) - 以太坊生態系統支持計劃正積極尋找工具、文檔和基礎設施領域的資助申請 +- [以太坊生態系統支持計劃願望清單](https://esp.ethereum.foundation/wishlist/) - 以太坊生態系統支持計劃正積極尋找工具、文件和基礎設施領域的資助申請 - [Web3Bridge](https://www.web3bridge.com/) - 加入有抱負的 Web3 社群,一起積極尋找、培訓和支持整個非洲數百名開發人員和社群成員 - 加入[以太坊牧貓人組織 Discord](https://discord.io/EthCatHerders) ## 研究人員和學術工作者 {#researchers-and-academics} -你有數學、虛擬貨幣或者經濟學相關的學術背景嗎? 你可能會對在以太坊生態中的一些前線工作有興趣。 +你有數學、虛擬貨幣或者經濟學相關的學術背景嗎? 你可能會對以太坊生態中的一些前線工作有興趣。 - 撰寫或審查以太坊改進提案 - 撰寫以太坊改進提案 1. 將你的想法提交至[以太坊魔法師協會](https://ethereum-magicians.org) - 2. 閱讀 [EIP-1](https://eip.ethereum.org/EIPS/eip-1) - **沒錯,就是指*整篇*文檔。** - 3. 遵照 EIP-1 中的指示, 并在寫草稿時加以參考。 - - 了解如何成為[以太坊改進提案編輯者](https://eips.ethereum.org/EIPS/eip-5069) - - 現在起你可以進行同行評審,審核其他人的以太坊改進提案! 請見[使用 `e-review` 標籤建立新提取請求](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review)。 在 `discussion-to` 連結提供技術性回饋。 + 2. 閱讀 [EIP-1](https://eips.ethereum.org/EIPS/eip-1) - **沒錯,就是指_整篇_文件。** + 3. 遵照 EIP-1 中的指示, 並在寫草稿時參考指示。 + - 了解如何成為[以太坊改進提案編輯](https://eips.ethereum.org/EIPS/eip-5069) + - 現在,你可以進行同行評審,審核其他人的以太坊改進提案! 請見[使用 `e-review` 標籤建立新提取請求](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review)。 在 `discussion-to` 連結提供技術性回饋。 - 參與[以太坊改進提案管理體系](https://github.com/ethereum-cat-herders/EIPIP) - 加入[以太坊牧貓人組織 Discord](https://discord.io/EthCatHerders) - [更多以太坊改進提案相關資訊](/eips/) -- [Challenges.ethereum.org](https://challenges.ethereum.org/) - 该網站中有一系列高回報研究懸賞,你可在此賺取 $100,000 美金以上。 +- [Challenges.ethereum.org](https://challenges.ethereum.org/) - 該網站中有一系列高回報研究賞金,你可在此賺取 $100,000 美金以上。 - [Ethresear.ch](https://ethresear.ch) - 以太坊為研究而設的主要論壇,同時也是加密貨幣經濟學在世界上最有影響力的論壇。 -- [以太坊基金會研究在線問答](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) - 由研究人員提供的問答系列。 當下階段開放時,任何人都可以提出問題。 +- [以太坊基金會研究線上問答](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) - 由研究人員提供的問答系列。 當下階段開放時,任何人都可以提出問題。 - [生態系統支援計劃的願望清單](https://esp.ethereum.foundation/wishlist/) - 以太坊生態系統支援計劃正在積極籌備資助申請的領域 [探索更多活躍的研究領域](/community/research/)。 ## 非技術性參與選項 {#non-technical} -如果你不是程式開發人員,在以太坊中,你可能會不知道該從哪裡開始。 這裏提供一些建議,還有一些為特定專業背景人士提供的資源。 +如果你不是程式開發人員,在以太坊中,你可能會不知道該從哪裡開始。 這裡提供了一些建議,還有一些為特定專業背景人士提供的資源。 ### 在你所在城市籌備一場聚會 {#meetups} -- 不知道從哪開始? [BUIDL 網路](https://consensys.net/developers/buidlnetwork/)可以幫到你。 +- 不知道從哪開始? [BUIDL 網路](https://consensys.net/developers/buidlnetwork/)幫得上忙。 ### 撰寫以太坊相關的內容 {#write-content} @@ -66,7 +66,7 @@ lang: zh-tw ### 運行一節點 {#run-a-node} -參加數千個為了幫助讓以太坊進一步去中心化的節點營運者。 +跟數千名節點營運者一起讓以太坊進一步去中心化。 - [有關如何運行節點的詳細資訊](/developers/docs/nodes-and-clients/run-a-node/) @@ -78,36 +78,36 @@ lang: zh-tw ### 支援專案 {#support-projects} -以太坊生態系統正在進行一項任務,即尋找有益於公眾且有影響力的專案。 僅需非常小份的捐款,就能顯露你對此的支援,從而幫助完成重要的工作。 +以太坊生態系統正在進行一項任務,即尋找有益於公眾且有影響力的專案。 僅需非常小額的捐款,就能表達你對此的支援,從而實現重要工作。 - [Gitcoin](https://gitcoin.co/fund) - [clr.fund](https://clr.fund/#/about) ## 金融從業人員和會計師 {#financial-professionals} -- 以太坊是「去中心化金融」生態系統的發源地 - 這是一個擁有各種協議與應用程式的網路,可以視為一種金融系統。 如果你是金融從業人員,可以到 [DeFi Llama](https://defillama.com/) 或 [DeFiPrime](https://defiprime.com) 查看我們的 DeFi 應用程式 -- 你是會計師? 以太坊的資產 - 以太幣、代幣、去中心化金融等 - 新興會計議題有很多。 你可以先查看一些為了幫助加密貨幣使用者解決記帳問題和會計挑戰的專案計畫,例如 [Rotki](https://rotki.com/) +- 以太坊是「去中心化金融」生態系統的發源地 - 這是一個擁有各種協議與應用程式的網路,可以視為一種金融系統。 如果你是金融從業人員,可以到 [DeFi Llama](https://defillama.com/) 或 [DeFiPrime](https://defiprime.com) 查看我們的去中心化金融應用程式 +- 你是會計師? 以太坊的資產 - 以太幣、代幣、去中心化金融等 - 新興會計議題有很多。 你可以先查看一些旨在幫助加密貨幣使用者解決記帳問題和會計挑戰的專案計畫,例如 [Rotki](https://rotki.com/) ## 產品經理 {#product-managers} -- 以太坊生態系統需要你的才華! 很多公司都在招聘產品經理。 如你想要從公開招募的專案著手,請跟[以太坊牧貓人組織](https://discord.com/invite/Nz6rtfJ8Cu)或[元同業聯盟](https://www.metacartel.org/)聯絡。 +- 以太坊生態系統需要你的才華! 很多公司都在招聘產品經理。 如你想要從公開招募的專案著手,請聯絡[以太坊牧貓人組織](https://discord.com/invite/Nz6rtfJ8Cu)或[元同業聯盟](https://www.metacartel.org/)。 ## 市場策劃人員 {#marketing} -- 以太坊生態系統內有著非常多的市場策劃和溝通人員的工作位置! +- 以太坊生態系統內設有非常多市場策劃和溝通人員的職位! -## 以太坊徵才 {#ethereum-jobs} +## 以太坊工作 {#ethereum-jobs} **想在以太坊尋找工作?** - [ethereum.org 工作](/about/#open-jobs) -- [以太坊基金會工作版面 (Lever)](https://jobs.lever.co/ethereumfoundation) -- [以太坊基金會工作版面 (BambooHR)](https://ethereum.bamboohr.com/jobs/) +- [以太坊基金會職缺布告欄 (Lever)](https://jobs.lever.co/ethereumfoundation) +- [以太坊基金會職缺布告欄 (BambooHR)](https://ethereum.bamboohr.com/jobs/) - [加密貨幣相關工作](https://cryptocurrencyjobs.co/ethereum/) - [加密行業工作](https://crypto.jobs/) - [在 ConsenSys 的職涯](https://consensys.net/careers/) - [加密貨幣相關工作清單](https://cryptojobslist.com/ethereum-jobs) -- [與銀行無關的工作版面](https://pallet.xyz/list/bankless/jobs) +- [與銀行無關的職缺布告欄](https://pallet.xyz/list/bankless/jobs) - [useWeb3 工作](https://www.useweb3.xyz/jobs) - [Web3 工作](https://web3.career) - [Web3 Army](https://web3army.xyz/) @@ -115,13 +115,13 @@ lang: zh-tw - [以太坊工作](https://startup.jobs/ethereum-jobs) - [CryptoJobster](https://cryptojobster.com/tag/ethereum/) -## 加入一個去中心化自治組織 (DAO) {#decentralized-autonomous-organizations-daos} +## 加入去中心化自治組織 (DAO) {#decentralized-autonomous-organizations-daos} -「DAO」是指去中心化自治組織。 這些群體會利用以太坊技術加速整合及合作。 例如,為了控制會員,他們會針對提案進行投票,或者管理質押池內的資產。 當去中心化自治組織仍維持在試驗狀態時,他們會提供機會給你去尋找你認同的群體,找尋合作者,然後在以太坊的社群內培養你的影響力。 [有關去中心化自治組織的詳細資訊](/dao/) +「DAO」是指去中心化自治組織。 這些群體會利用以太坊技術加速整合及合作。 例如,為了控制會員,他們會針對提案進行投票,或者管理質押池內的資產。 當去中心化自治組織仍維持在試驗狀態時,他們讓你有機會去尋找你認同的群體、合作者,然後在以太坊的社群內培養你的影響力。 [更多去中心化自治組織相關資訊](/dao/) -- [DAOSquare](https://www.daosquare.io) [@DAOSquare](https://twitter.com/DAOSquare) - _在科技界以外推廣去中心化自治組織的概念,並幫助大家通過此等組織創造價值_ -- [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _一個認為互聯網為集體所有的開發者社群_ -- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - _由一些幫助開發 Web3 的自由工作者所組成的去中心化自治組織_ +- [DAOSquare](https://www.daosquare.io) [@DAOSquare](https://twitter.com/DAOSquare) - _在科技界以外推廣去中心化自治組織的概念,並幫助大家透過此等組織創造價值_ +- [開發者去中心化自治組織](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _一個認為網際網路為集體所有的開發者社群_ +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - _由一些協助開發 Web3 的自由工作者所組成的去中心化自治組織_ - [DXdao](https://DXdao.eth.link/) [@DXdao](https://twitter.com/DXdao_) - _去中心化發展,以及去中心化應用程式和技術協議的管理體系_ - [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _DAOhaus 的社群管理體系_ - [Hero DAO](https://herodao.org/) [@hero_dao](https://twitter.com/hero_dao) - _社群所擁有的超級英雄系列_ @@ -135,4 +135,4 @@ lang: zh-tw - [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - _一個致力於為以太坊發展提供資金的社群_ - [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - _Web3 建造者集中地_ -無論何時、無論以何種方式,當你為 ethereum.org 出力時,請記得遵守 ethereum.org 的[管理辦法](/community/code-of-conduct)! +無論何時、無論以何種方式,當你為 ethereum.org 出力時,請記得遵守 ethereum.org 的[行為守則](/community/code-of-conduct)! diff --git a/public/content/translations/zh-tw/community/grants/index.md b/public/content/translations/zh-tw/community/grants/index.md index adfc8826c10..931271e2adc 100644 --- a/public/content/translations/zh-tw/community/grants/index.md +++ b/public/content/translations/zh-tw/community/grants/index.md @@ -15,30 +15,26 @@ lang: zh-tw 這些計劃通過向各種專案提供資助來支援開放的以太坊生態系統。 其中包括可擴展性、社群建設、安全性、隱私等方面的解決方案。 這些贈款並不專門針對任何一個以太坊平台,如果你不確定,可以從這裡開始。 - [EF 生態系統支援計劃](https://esp.ethereum.foundation) - _資助有益於以太坊的開源專案,特別關注通用工具、基礎設施、研究和公共產品_ -- [以太坊需求建議書](https://github.com/ethereum/requests-for-proposals) - _以太坊基金會對以太坊生態系統中的工作和專案提出的建議要求_ - [MetaCartel](https://www.metacartel.org/grants/) - _開發去中心化應用程式、創建去中心化自治組織_ - [Moloch DAO](https://www.molochdao.com/) - _隱私性、二層網路擴容、用戶端安全性等_ -- [公開募資](https://opengrants.com/explore) -- [去中心化自治組織資助](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _有關資助機構的 Google 電子表格_ -- [Crunchbase Web3 資助計劃](https://www.cryptoneur.xyz/web3-grants) - _按類別、使用案例、總金額等篩選及搜尋資助計劃。 歡迎幫助他人尋找適合的資助計劃。_ +- [去中心化自治組織資助計畫](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _有關資助機構的 Google 試算表_ +- [Crunchbase Web3 資助計劃](https://www.cryptoneur.xyz/web3-grants) - _按類別、使用案例、總金額等篩選及搜尋資助計劃。 幫助他人尋找適合的資助計劃。_ - [學術資助](https://esp.ethereum.foundation/academic-grants) - _支援以太坊相關學術工作的資助計劃_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks 彙編了關於所有資助計畫、提案徵集和漏洞懸賞計畫的詳盡清單。_ ## 特定專案 {#project-specific} 這些專案旨在為開發和實驗自身技術的專案獲取資助。 - [Aave 資助計劃](https://aavegrants.org/) – _[Aave](https://aave.com/) 為去中心化自治組織提供資助_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) 生態系統基金_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) 生態系統基金_ - [Chainlink 資助計劃](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) 社群資助_ -- [Compound 資助計劃](https://compoundgrants.org/) – _[Compound](https://compound.finance/) 金融生態系統_ - [Decentraland 資助計劃](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) 去中心化自治組織元宇宙_ -- [Lido 生態系統資助組織 (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) 金融生態系統_ +- [Lido 生態系統資助機構 (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) 金融生態系統_ - [MetaMask 計劃](https://metamaskgrants.org/) - _[MetaMask](https://metamask.io/) 員工引導自助去中心化自治組織_ -- [mStable 資助計劃](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) 社群_ - [SKALE 網路資助計劃](https://skale.space/developers#grants) - _[SKALE 網路](https://skale.space/)生態系統_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) 生態系統_ -- [UMA 資助計劃](https://grants.umaproject.org/) - _[UMA](https://umaproject.org/) 開發者支援_ -- [Uniswap 資助計劃](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) 社群_ +- [Uniswap 資助計畫](https://www.uniswapfoundation.org/apply-for-a-grant) - _[Uniswap](https://uniswap.org/) 社群_ - [Web3 資助計劃](https://web3grants.net) - _與 Web3/加密貨幣相關的資助計劃詳盡列表_ ## 二次融資 {#quadratic-funding} diff --git a/public/content/translations/zh-tw/community/language-resources/index.md b/public/content/translations/zh-tw/community/language-resources/index.md index 9ec411799d7..27bccfbafad 100644 --- a/public/content/translations/zh-tw/community/language-resources/index.md +++ b/public/content/translations/zh-tw/community/language-resources/index.md @@ -1,6 +1,6 @@ --- title: 語言資源 -description: 用於了解以太坊的非英文資源 +description: 用以了解以太坊的非英文資源 lang: zh-tw --- @@ -10,15 +10,15 @@ lang: zh-tw 我們的目標是以所有語言提供教育內容,幫助世界各地的人們克服語言障礙,成功加入以太坊社群。 -如果你更喜歡用你的母語閱讀或者知道某人不會說英語,你可以在下面找到有用的非英語資源列表。 数十万的以太坊爱好者聚集在这些在线论坛上,分享消息、谈论最近的发展、讨论技术问题并畅想未来。 +如果你更喜歡用你的母語閱讀,或你知道某人不會說英語,你可以在下面找到有用的非英語資源列表。 数十万的以太坊爱好者聚集在这些在线论坛上,分享消息、谈论最近的发展、讨论技术问题并畅想未来。 -知道一個以你的語言撰寫的教育資源? [請創建議題](https://github.com/ethereum/ethereum-org-website/issues/new/choose),以將其添加到列表! +知道以你的語言撰寫的教育資源? [請創建議題](https://github.com/ethereum/ethereum-org-website/issues/new/choose),以將其添加到列表! ## Ethereum.org 資源 {#ethereum-org} Ethereum.org 已翻譯為 40 多種語言,你可以在我們的[語言頁面](/languages)上找到這些語言。 -如果你會使用兩種語言,而且想幫助我們宣傳到更多的人,你也可以參與 [ethereum.org 翻譯計劃](/contributing/translation-program/#translation-program),幫助我們翻譯該網站。 +如果你會使用兩種語言,而且想幫助我們宣傳,讓更多人知道,你也可以參與 [ethereum.org 翻譯計劃](/contributing/translation-program/#translation-program),幫助我們翻譯該網站。 ## 社群資源 {#community} @@ -29,7 +29,7 @@ Ethereum.org 已翻譯為 40 多種語言,你可以在我們的[語言頁面]( - [BeinCrypto](http://www.beincrypto.com.br) - 提供有關加密貨幣的新聞和文章,包括巴西交易所列表 - [Cointegraph](http://cointelegraph.com.br/category/analysis) - 巴西版 Cointelegraph,一個重要的加密貨幣新聞媒體機構 - [Livecoins](http://www.livecoins.com.br/ethereum) - 提供有關加密貨幣的新聞和工具 -- [Livecoins](http://www.livecoins.com.br/ethereum) - 提供有關加密貨幣的新聞和工具 +- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) - 提供有關加密貨幣的新聞和報告 **教育** @@ -44,22 +44,22 @@ Ethereum.org 已翻譯為 40 多種語言,你可以在我們的[語言頁面]( **通用資源** -- [Ethereum.cn](https://www.ethereum.cn/) - 由社群維護的網站內容,包括共識層升級、所有核心開發者會議記錄、二層網路等 +- [Ethereum.cn](https://www.ethereum.cn/) - 由社群維護的網站內容,包括共識層升級、所有核心開發者會議紀錄、二層網路等 - [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) - 學習從基礎到高級以太坊主題的所有知識 - [Untimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) - 由社群維護的內容,涵蓋以太坊、去中心化金融、非同質化代幣和 Web3 相關知識 -- [123ETH](https://123eth.org/) - 以太坊生態系統的一個門戶網站 -- [Zhen Xiao(肖臻)](http://zhenxiao.com/blockchain/) - 關於加密貨幣及其應用的免費在線課程 +- [123ETH](https://123eth.org/) - 以太坊生態系統的入口網站 +- [Zhen Xiao(肖臻)](http://zhenxiao.com/blockchain/) - 關於加密貨幣及其應用的免費線上課程 - [以太坊白皮書](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) - 中文版以太坊白皮書 **以太坊生態系統** -- [ETHPlanet](https://www.ethplanet.org/) - 可在線或現場參加駭客松,為大學生提供培訓 +- [ETHPlanet](https://www.ethplanet.org/) - 可上線或現場參加駭客松,為大學生提供培訓 - [PrimitivesLane](https://www.primitiveslane.org/) - 一個以區塊鏈技術為重點的非營利研究小組 - [以太坊中國翻譯社群](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) - 一個致力於翻譯以太坊教育類內容的社群 **適用於開發人員** -- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - 每週學習主流去中心化應用程式專案,並會分享想法及意見的學習群組 +- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - 每週學習主流去中心化應用程式專案,並分享想法及意見的學習群組 - [LearnBlockchain](https://learnblockchain.cn/) - 一個分享區塊鏈技術相關資訊的開發者社群 **適用於密碼學研究人員** @@ -72,7 +72,7 @@ Ethereum.org 已翻譯為 40 多種語言,你可以在我們的[語言頁面]( - [Gwei.cz](https://gwei.cz) - 有關 Web3 的當地社群,產出教育內容、舉辦線上和線下活動 - [Gwei.cz Příručka](https://prirucka.gwei.cz/) - 以太坊新手指南 - [DAO Příručka](https://dao.gwei.cz/) - 去中心化自治組織新手指南 -- [精通以太坊](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - 捷克語版《精通以太坊》 +- [精通以太坊](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - 捷克語版《精通以太坊》 ### 法語 {#fr} @@ -91,7 +91,7 @@ Ethereum.org 已翻譯為 40 多種語言,你可以在我們的[語言頁面]( ### 義大利語 {#it} - [Ethereum Italia](https://www.ethereum-italia.it/) - 提供以太坊教育資源、活動和新聞,專注於智慧型合約和區塊鏈技術 -- [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) - 以太坊意大利語播客 +- [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) - 以太坊義大利語播客 - [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) - 學習使用 Solidity - [Microsoft Learning(智慧型合約)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/)- 學習用 Solidity 撰寫智慧型合約 - [Microsoft Learn(去中心化應用程式)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/)- 使用去中心化應用程式建立使用者介面 @@ -107,24 +107,24 @@ Ethereum.org 已翻譯為 40 多種語言,你可以在我們的[語言頁面]( - [Tutoriales online](https://tutoriales.online/curso/solidity) - 學習以太坊 Solidity 和編程 - [Curso Introducción a Ethereum Development](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) - Solidity 基礎知識,以及測試和部署你的首個智慧型合約 - [Curso Introducción a Seguridad y Hacking en Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) - 了解真實智慧型合約中常見的漏洞和安全問題 -- [去中心化金融開發課程介紹](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) - 了解去中心化金融智慧型合約如何在 Solidity 中工作,並創建自己的自動化做市商應用 +- [去中心化金融開發課程介紹](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) - 了解去中心化金融智慧型合約如何在 Solidity 中運作,並創建自己的自動化做市商應用 - [Cryptoversidad](https://www.youtube.com/c/Cryptoversidad) - 由淺入深的非技術性區塊鏈教學 學習所有有關加密貨幣和以太坊的知識。 ### 土耳其語 {#tr} - [BTK Akademi](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) - 專注於區塊鍊和加密貨幣的課程 -- [偉大的重命名:以太坊 2 發生了什麼?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) -《偉大的重命名》博文的土耳其語譯作,解釋了“以太坊 2”術語的變化 +- [偉大的重命名:以太坊 2 發生了什麼?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/)-《偉大的重命名》博文的土耳其語譯作,解釋了「以太坊 2」術語的變化 ### 越南語 {#vi} - [Tino Group](https://wiki.tino.org/ethereum-la-gi/) - 以太坊、去中心化應用程式、錢包和常見問題的概述 -- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) - 具有以太坊新聞和教育子頁面的網頁平台 -- [Coin68](https://coin68.com/ethereum-tieu-diem/) - 提供以太坊新聞和教育內容的加密貨幣門戶網站 +- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) - 以太坊新聞和教育子頁面的網頁平台 +- [Coin68](https://coin68.com/ethereum-tieu-diem/) - 提供以太坊新聞和教育內容的加密貨幣入口網站 ### 日語 {#ja} - [日本網路和虛擬貨幣資產交易組織](https://jvcea.or.jp/) - [日本虛擬資產商業組織](https://cryptocurrency-association.org/) -- [區塊鏈開發入門 - 學習 | 微軟文檔](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) - 該學習路徑將向你介紹以太坊平台上的區塊鏈和發展 +- [區塊鏈開發入門 - 學習 | 微軟文件](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) - 該學習路徑將向你介紹以太坊平台上的區塊鏈和發展 - [精通以太坊](https://www.oreilly.co.jp/books/9784873118963/) - 日語版《精通以太坊》 - [手把手教你使用 Solidity 和以太坊制訂智慧型合約](https://www.oreilly.co.jp/books/9784873119342/) - 日語版《手把手教你使用 Solidity 和以太坊制訂智慧型合約》 diff --git a/public/content/translations/zh-tw/community/online/index.md b/public/content/translations/zh-tw/community/online/index.md index 2eb5ae87cc7..cdd3f659096 100644 --- a/public/content/translations/zh-tw/community/online/index.md +++ b/public/content/translations/zh-tw/community/online/index.md @@ -24,19 +24,19 @@ lang: zh-tw 以太牧貓人組織 - 提供專案管理以支援以太坊的社群 以太坊駭客 - 由全球以太坊駭客線上社群 ETHGlobal 所管理的 Discord 聊天室 CryptoDevs - 專注於以太坊開發的 Discord 社群 -EthStaker Discord - 給現有及潛在質押者的社群營運指導、教育、支援及資源。 +EthStaker Discord - 給現有及潛在質押者的社群營運指導、教育、支援及資源。 Ethereum.org 網站團隊 - 訪問並和團隊及社群大眾聊聊 Ethereum.org 網站開發及設計 Matos Discord - 建造者、產業領袖,及以太坊愛好者出沒的 web3 創作者社群。 我們熱愛 web3 開發、設計及文化。 與我們一起建立。 -Solidity Gitter - 討論 solidity 的開發 (Gitter) +Solidity Gitter - 討論 solidity 的開發 (Gitter) Solidity Matrix - 討論 solidity 的開發 (Matrix) -以太坊技術堆棧交易所 _- 問答論壇_ -Peeranha _- 去中心化問答論壇_ +以太坊技術堆棧交易所 *- 問答論壇* +Peeranha *- 去中心化問答論壇* -## 油管和推特 {#youtube-and-twitter} +## YouTube 和 Twitter {#youtube-and-twitter} 以太坊基金會 - 掌握以太坊基金會最新的資訊 @ethereum - 以太坊基金會的官方帳戶 -@ethdotorg - 以太坊的門戶網站,為我們成長中的全球社群而建 +@ethdotorg - 以太坊的入口網站,為我們成長中的全球社群而建 具影響力的以太坊推特帳戶清單 diff --git a/public/content/translations/zh-tw/community/research/index.md b/public/content/translations/zh-tw/community/research/index.md index 5df03dff81a..0453e9de605 100644 --- a/public/content/translations/zh-tw/community/research/index.md +++ b/public/content/translations/zh-tw/community/research/index.md @@ -10,7 +10,7 @@ lang: zh-tw ## 以太坊研究如何進行 {#how-ethereum-research-works} -以太坊研究是公開透明的,體現了[去中心化科研 (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science) 的原則。 這種文化使研究工具和輸出盡可能開放且可以互動,例如通過可執行筆記本。 以太坊研究進步非常迅速,有新的發現會在開放論壇(如 [ethresear.ch](https://ethresear.ch/))上發文和討論,而非在經過多輪同行評審後,通過傳統出版物傳達給社群。 +以太坊研究是公開透明的,體現了[去中心化科研 (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science) 的原則。 這種文化使研究工具和輸出盡可能開放且可以互動,例如通過可執行筆記本。 以太坊研究進步非常迅速,有新的發現都會在開放論壇(如 [ethresear.ch](https://ethresear.ch/))上發文和討論,而非經過多輪同行評審後,再透過傳統出版物傳達給社群。 ## 通用研究資源 {#general-research-resources} @@ -35,7 +35,7 @@ lang: zh-tw - 提高用戶端實現的安全性或性能; - 以及開發輕量用戶端。 -除了前瞻性研究外,以太坊還在研究將一些基本的協議重新設計,例如單時隙最終性,以實現以太坊的重大改進。 此外,效率、安全和監控共識用戶端之間的點對點網路也是重要的研究課題。 +除了前瞻性研究外,以太坊也在研究如何重新設計一些基本協議,例如單時隙最終性,以實現以太坊的重大改進。 此外,效率、安全和監控共識用戶端之間的點對點網路也是重要的研究課題。 #### 背景介紹讀物 {#background-reading} @@ -57,7 +57,7 @@ lang: zh-tw - 發展輕量用戶端支援; - 研究燃料限制; -- 以及與新資料結構的相容性(如 Verkle 樹)。 +- 以及與新資料結構的相容性(如沃克爾樹)。 #### 背景介紹讀物 {#background-reading-1} @@ -70,8 +70,8 @@ lang: zh-tw - [狀態過期](https://notes.ethereum.org/@vbuterin/state_expiry_eip) - [狀態過期的路徑](https://hackmd.io/@vbuterin/state_expiry_paths) - [Verkel 和狀態過期提案](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) -- [歷史記錄管理](https://eips.ethereum.org/EIPS/eip-4444) -- [Verkle 樹](https://vitalik.ca/general/2021/06/18/verkle.html) +- [歷史紀錄管理](https://eips.ethereum.org/EIPS/eip-4444) +- [沃克爾樹](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [資料可用性取樣](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) ## 用戶端開發 {#client-development} @@ -83,7 +83,7 @@ lang: zh-tw 1. 持續追蹤區塊鏈頭部、流言區塊和處理共識邏輯的共識用戶端 2. 支援以太坊虛擬機和執行交易及智慧型合約的執行用戶端 -查看[節點及用戶端頁面](/developers/docs/nodes-and-clients/)以獲得關於節點和用戶端的詳細資訊,以及所有當前用戶端實現的列表。 你也可以在[歷史記錄頁面](/history/)找到以太坊所有的歷史升級記錄。 +查看[節點及用戶端頁面](/developers/docs/nodes-and-clients/)以獲得關於節點和用戶端的詳細資訊,以及所有當前用戶端實現的列表。 你也可以在[歷史紀錄頁面](/history/)找到以太坊所有的歷史升級紀錄。 ### 執行用戶端 {#execution-clients} @@ -97,7 +97,7 @@ lang: zh-tw ## 擴容與性能 {#scaling-and-performance} -擴容以太坊是以太坊研究者關注的重大領域。 目前的方法包括了將交易卸載到卷軸上,以及透過資料二进制大对象讓它們儘可能便宜。 以太坊擴容的相關介紹可以在我們的[擴容頁面](/developers/docs/scaling)查看。 +擴容以太坊是以太坊研究者關注的重大領域。 目前的方法包括了將交易卸載到卷軸上,以及透過資料二進位大型物件讓它們儘可能便宜。 以太坊擴容的相關介紹可以在我們的[擴容頁面](/developers/docs/scaling)查看。 ### 第二層 {#layer-2} @@ -124,7 +124,7 @@ lang: zh-tw - [區塊鏈跨鏈橋簡介](/bridges/) - [Vitalik 討論跨鏈橋](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [區塊鏈跨鏈橋文章](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [跨鏈橋中鎖定之資金]() +- [跨鏈橋中鎖定之資金](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### 近期研究 {#recent-research-3} @@ -156,15 +156,15 @@ lang: zh-tw #### 近期研究 {#recent-research-5} -- [FGPAs 上的橢圓曲線簽章演算法](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) +- [FPGA 上的橢圓曲線加密演算法](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) ## 安全性 {#security} -安全是個廣泛的議題,可能包含了垃圾訊息/詐騙預防、錢包安全、硬體安全、加密經濟安全、漏洞懸賞、應用程式測試和用戶端軟體及密鑰管理。 貢獻知識至這些領域將有助於加速主流採用。 +安全是個廣泛的議題,可能包含了垃圾訊息/詐騙預防、錢包安全、硬體安全、加密經濟安全、漏洞懸賞、應用程式測試和用戶端軟體及金鑰管理。 貢獻知識至這些領域將有助於加速主流採用。 ### 密碼學與零知識證明 {#cryptography--zkp} -零知識證明 (ZKP) 和密碼學都對在以太坊和其應用程式上實現隱私性及安全性非常重要。 零知識證明是一個相對年輕但快速發展的領域,有許多開放研究與開發機會。 一些可能性包括開發更高效的[Keccak 雜湊演算法](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview)實現、找到比現存更好的多項式承諾或降低橢圓曲線簽章演算法產生公鑰和驗證簽名邏輯的費用。 +零知識證明 (ZKP) 和密碼學都對在以太坊和其應用程式上實現隱私性及安全性非常重要。 零知識證明是一個相對年輕但快速發展的領域,有許多開放研究與開發機會。 一些可能性包括開發更高效的 [Keccak 雜湊演算法](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview)實現、找到比現存更好的多項式承諾,或降低橢圓曲線簽章演算法產生公鑰和驗證簽名邏輯的費用。 #### 背景介紹讀物 {#background-reading-6} @@ -179,7 +179,7 @@ lang: zh-tw ### 錢包 {#wallets} -以太坊錢包可以是瀏覽器插件、桌面版和手機應用程式,又或者是以太坊上的智慧型合約。 目前正在積極研究社交恢復錢包,該錢包可以降低與個人私鑰管理相關的風險。 與錢包開發相關的是研究帳戶抽象的替代形式,這是新興研究的一個重要領域。 +以太坊錢包可以是瀏覽器插件、桌面版和手機應用程式,又或者是以太坊上的智慧型合約。 目前正在積極研究社交恢復錢包,該錢包可以降低與個人金鑰管理相關的風險。 與錢包開發相關的是研究帳戶抽象的替代形式,這是新興研究的一個重要領域。 #### 背景介紹讀物 {#background-reading-7} @@ -194,7 +194,7 @@ lang: zh-tw - [專注於智慧型合約錢包的驗證](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) - [以太坊帳戶的未來](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) - [EIP-3074 AUTH 和 AUTHCALL 操作碼](https://eips.ethereum.org/EIPS/eip-3074) -- [在外部擁有帳戶地址發佈程式碼](https://eips.ethereum.org/EIPS/eip-5003) +- [在外部帳戶地址發佈程式碼](https://eips.ethereum.org/EIPS/eip-5003) ## 社群、教育及外展 {#community-education-and-outreach} @@ -238,7 +238,7 @@ lang: zh-tw - [為以太坊區塊鏈設計的交易費機制:EIP-1559 的經濟學分析(Tim Roughgarden,2020 年)](https://timroughgarden.org/papers/eip1559.pdf) - [EIP-1559 模擬(穩健激勵群組)](https://ethereum.github.io/abm1559) - [由第一原理(註:最基本的命題或假設,不能被省略或刪除)了解卷軸經濟](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) -- [Flash Boys 2.0:去中心化交易所的交易搶跑、交易記錄和共識不穩定](https://arxiv.org/abs/1904.05234) +- [Flash Boys 2.0:去中心化交易所的交易搶跑、交易紀錄和共識不穩定](https://arxiv.org/abs/1904.05234) #### 近期研究 {#recent-research-10} @@ -262,7 +262,7 @@ lang: zh-tw ### 流動性質押及衍生品 {#liquid-staking-and-derivatives} -流動性質押藉由將以太幣兌換成一種代表質押以太幣,且可以用於去中心化金融的代幣,讓持有低於 32 以太幣的使用者也能獲得質押收益。 然而,流動性質押相關的激勵措施和市場動態仍在發掘階段,它對以太坊安全性的影響(例如中心化風險)也是。 +流動性質押藉由將以太幣兌換成一種代表質押以太幣,且可以用於去中心化金融的代幣,讓持有低於 32 個以太幣的使用者也能獲得質押收益。 然而,流動性質押相關的激勵措施和市場動態仍在發掘階段,它對以太坊安全性的影響(例如中心化風險)亦然。 #### 背景介紹讀物 {#background-reading-12} @@ -311,7 +311,7 @@ lang: zh-tw ### 去中央化金融 {#defi} -去中心化金融 (DeFi) 是建立在以太坊之上的主要應用程式類別之一。 去中心化金融目標是建立可組合的「貨幣樂高」,讓使用者可以透過智慧型合約儲存、轉移、出借、借用和投資加密資產。 去中心化金融是發展快速且常常更新的領域。 需要持續對安全、效率及可存取協議進行研究。 +去中心化金融 (DeFi) 是建立在以太坊之上的主要應用程式類別之一。 去中心化金融旨在建立可組合的「貨幣樂高」,讓使用者可以透過智慧型合約儲存、轉移、出借、借用和投資加密資產。 去中心化金融是發展快速且常常更新的領域。 需要持續對安全、效率及可存取協議進行研究。 #### 背景介紹讀物 {#background-reading-15} @@ -325,7 +325,7 @@ lang: zh-tw ### 去中心化自治組織 {#daos} -以太坊一個頗具影響力的使用案例是透過使用去中心化自治組織,以去中心化的方式進行整合。 以太坊上有許多活躍的研究,是關於如何開發和利用去中心化自治組織執行管理體係的改進形態,作為一種所需信任最小化的協調工具,大幅擴展了除了傳統公司和組織之外的選擇。 +以太坊一個頗具影響力的使用案例是透過使用去中心化自治組織,以去中心化的方式進行整合。 以太坊上有許多活躍的研究,關乎如何開發和利用去中心化自治組織執行管理體系的改進形態,作為一種所需信任最小化的協調工具,大幅擴展了除了傳統公司和組織之外的選擇。 #### 背景介紹讀物 {#background-reading-16} @@ -338,7 +338,7 @@ lang: zh-tw ### 開發人員工具 {#developer-tools} -為以太坊開發者打造的工具進步十分迅速。 在這個領域中,有許多積極的研究和發展工作要做。 +為以太坊開發者打造的工具日新月異。 在這個領域中,有許多積極的研究和發展工作要做。 #### 背景介紹讀物 {#background-reading-17} @@ -352,7 +352,7 @@ lang: zh-tw - [以太坊研發 Discord 的共識工具頻道](https://discordapp.com/channels/595666850260713488/746343380900118528) -### Oracles {#oracles} +### 預言機 {#oracles} 預言機透過無需許可和去中心化的方式將鏈下資料導入鏈上。 將此資料上鏈使去中心化應用程式可對現實世界的現象做出反應,如現實世界的資產價格波動、鏈下應用程式的事件,甚至是天氣變化。 @@ -367,7 +367,7 @@ lang: zh-tw ### 應用程式安全 {#app-security} -一般發生在以太坊上的攻擊都是利用單一應用程式的漏洞,而非協議本身的漏洞。 駭客和應用程式開發者正在進行一場軍備競賽,以開發新的攻擊和防禦手段。 這表示研究和發展對保持應用程式的安全和遠離被駭一直都很重要。 +一般發生在以太坊上的攻擊都是利用單一應用程式的漏洞,而非協議本身的漏洞。 駭客和應用程式開發者正在進行一場軍備競賽,以開發新的攻擊和防禦手段。 這表示研究和發展對保持應用程式的安全、遠離被駭一直都很重要。 #### 背景介紹讀物 {#background-reading-19} diff --git a/public/content/translations/zh-tw/community/support/index.md b/public/content/translations/zh-tw/community/support/index.md index 080df595a4b..3a5cf837b89 100644 --- a/public/content/translations/zh-tw/community/support/index.md +++ b/public/content/translations/zh-tw/community/support/index.md @@ -10,7 +10,7 @@ lang: zh-tw 你正在尋找官方的以太坊支援嗎? 第一件你應該知道的事情是以太坊為去中心化。 這代表沒有中心組織、實體或個體會持有以太坊,也因此沒有官方支援頻道。 -明白以太坊的去中心化本質十分重要,因為任何聲稱是以太坊官方支援的人可能正在試圖欺詐你! 最佳預防騙徒的保護措施是自行學習,並認真看待網路安全。 +明白以太坊的去中心化本質十分重要,因為任何聲稱是以太坊官方支援的人都可能正試圖欺詐你! 預防騙徒的最佳保護措施是自我教育,並認真看待網路安全。 以太坊安全及詐騙預防 @@ -20,7 +20,7 @@ lang: zh-tw 學習以太坊基礎知識 -儘管具有如欠缺官方支援之類的問題,很多以太坊生態系統上的團體、社群和專案都很樂意提供協助。你也能夠在此頁找到很多有用的資訊及資源。 仍有疑問? 加入 [ethereum.org discord](/discord/),我們會嘗試提供幫助。 +儘管欠缺官方支援,很多以太坊生態系統上的團體、社群和專案都很樂意提供協助。你也能夠在此頁面找到很多有用的資訊及資源。 仍有疑問? 加入 [ethereum.org discord](/discord/),我們會嘗試提供幫助。 ## 錢包支援 {#wallet-support} @@ -30,16 +30,16 @@ lang: zh-tw - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_此清單並未列出所有受支援錢包。 是否需要幫你尋找特定的錢包的支援? 加入 [ethereum.org discord](https://discord.gg/ethereum-org),我們會嘗試提供幫助。_ +_此清單並未列出所有受支援錢包。 是否需要幫你尋找特定錢包的支援? 加入 [ethereum.org discord](https://discord.gg/rZz26QWfCg),我們會嘗試提供幫助。_ 尋找以太坊錢包? [請查看我們完整的以太坊錢包清單](/wallets/find-wallet/)。 ## 開發去中心化應用程式 {#building-support} -開發可能很難, 但有一些專注發展的空間具有樂意提供幫助且經驗豐富的以太坊開發者。 +開發可能很難, 但一些專注於開發的空間上有樂意提供幫助,且經驗豐富的以太坊開發者。 - [Alchemy University](https://university.alchemy.com/#starter_code) -- [CryptoDevs discord](https://discord.gg/Z9TA39m8Yu) +- [CryptoDevs discord](https://discord.com/invite/5W5tVb3) - [Ethereum StackExchange](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Web3 University](https://www.web3.university/) @@ -49,11 +49,11 @@ _此清單並未列出所有受支援錢包。 是否需要幫你尋找特定的 ### 模組化 {#dapp-tooling} -你的問題跟某個特定的質押池、專案或庫相關嗎? 多數專案具有專有的聊天伺服器或論壇,以為你提供支援。 +你的問題跟某個特定的質押池、專案或庫相關嗎? 多數專案都有專門為你提供支援的聊天伺服器或論壇。 常見示例有: -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [安全帽](https://discord.gg/xtrMGhmbfZ) @@ -65,10 +65,10 @@ _此清單並未列出所有受支援錢包。 是否需要幫你尋找特定的 如果你要運行一個節點或者驗證程式,有一些專門的社群可幫助你開始。 -- [EthStaker discord](https://discord.io/ethstaker) +- [EthStaker discord](https://discord.gg/ethstaker) - [EthStaker reddit](https://www.reddit.com/r/ethstaker) -大部份開發以太坊用戶端的團隊也具有面向大眾的專有空間,在此你能夠獲得支援及提出疑問。 +大部份開發以太坊用戶端的團隊也都有面向大眾的專有空間,你可在其中獲得支援及提出疑問。 ### 執行用戶端 {#execution-clients} @@ -91,17 +91,17 @@ _此清單並未列出所有受支援錢包。 是否需要幫你尋找特定的 ### 我一直往錯的錢包傳送以太幣 {#wrong-wallet} -在以太坊進行的傳送不可還原。 不幸的是,如你已經將以太幣傳送至錯的錢包,則沒有方法追回這些資金。 沒有中心組織、實體或個體持有以太坊,這代表沒有人能夠逆轉交易。 因此,在傳送交易前請務必進行雙重核查。 +在以太坊進行的傳送不可還原。 不幸的是,如你已經將以太幣傳送至錯的錢包,便無法追回這些資金。 沒有中心組織、實體或個體持有以太坊,這代表沒有人能夠逆轉交易。 因此,在傳送交易前請務必進行雙重核查。 ### 如何索要以太坊贈品? {#giveaway-scam} -以太坊贈品是為了偷取你持有的以太幣而設計好的騙案。 不要被一些高得不真實的回報率給欺騙 - 如果你將以太幣傳送至一個贈品地址,你將不會收到申領的贈品,而且你也不能索要賠償。 +以太坊贈品是為了偷取你持有的以太幣而設計的騙局。 不要被一些高得不真實的回報率給欺騙 - 如果你將以太幣傳送至一個贈品地址,你將不會收到申領的贈品,而且你也不能索要賠償。 -[有關防止騙案的詳細資訊](/security/#common-scams) +[有關防止詐騙的詳細資訊](/security/#common-scams) ### 我的交易卡住了 {#stuck-transaction} -如果你提交了一個低於所需的交易費,由於網路需求,你在以太坊上的交易有時可能會卡住。 很多錢包會提供一個選項,重新用較高的手續費去提交同一個交易,讓交易能夠順利進行。 另外,你還可以取消正在等待處理的交易。該動作能將一筆交易傳送到你持有的地址,然後使用與待處理交易相同的隨機數繼續。 +如果你提交了一個低於所需的交易費,由於網路需求,你在以太坊上的交易有時可能會卡住。 很多錢包都會提供一個選項,重新用較高的手續費去提交同一筆交易,讓交易能夠順利進行。 另外,你還可以取消正在等待處理的交易。該動作能將一筆交易傳送到你持有的地址,然後使用與待處理交易相同的隨機數繼續。 [怎樣在 MetaMask 加速或者取消待完成交易](https://metamask.zendesk.com/hc/en-us/articles/360015489251-How-to-speed-up-or-cancel-a-pending-transaction) @@ -109,7 +109,7 @@ _此清單並未列出所有受支援錢包。 是否需要幫你尋找特定的 ### 如何在以太坊挖礦? {#mining-ethereum} -以太坊挖礦已不再可能。 當以太坊由工作量證明更換為權益證明時,挖礦就被關閉了。 現在以太坊沒有礦工了,取而代之的是驗證者。 驗證者質押以太幣並收到因為幫助維持網路安全而獲得的質押酬勞。 +以太坊挖礦已不再可能。 當以太坊由工作量證明更換為權益證明時,挖礦就被關閉了。 現在以太坊沒有礦工了,取而代之的是驗證者。 驗證者質押以太幣並收到因協助維持網路安全而獲得的質押酬勞。 ### 如何成為質押者/驗證者? {#become-validator} diff --git a/public/content/translations/zh-tw/dao/index.md b/public/content/translations/zh-tw/dao/index.md index 4546b217069..e8e3e165802 100644 --- a/public/content/translations/zh-tw/dao/index.md +++ b/public/content/translations/zh-tw/dao/index.md @@ -156,7 +156,7 @@ _通常用於協定和去中心化應用程式的去中心化開發及治理, - [如何創立由去中心化自治組織支援的數位社群](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [什麼是去中心化自治組織?](https://coinmarketcap.com/alexandria/article/what-is-a-dao)– [Coinmarketcap](https://coinmarketcap.com) - [什麼是全局共識?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c)- [DAOstack](https://daostack.io/) -- [Vitalik,《去中心化自治組織並非法人團體:去中心化在自治組織裡的重要之處》](https://vitalik.ca/general/2022/09/20/daos.html) +- [Vitalik,《去中心化自治組織並非法人團體:去中心化在自治組織裡的重要之處》](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [去中心化自治組織、去中心化自治公司、去中心化應用程式等:不完整術語指引](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [以太坊部落格](https://blog.ethereum.org) ### 影片 {#videos} diff --git a/public/content/translations/zh-tw/decentralized-identity/index.md b/public/content/translations/zh-tw/decentralized-identity/index.md index 33aa31924b0..48626d9f6c0 100644 --- a/public/content/translations/zh-tw/decentralized-identity/index.md +++ b/public/content/translations/zh-tw/decentralized-identity/index.md @@ -109,7 +109,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 ### 靈魂綁定代幣和身分 {#soulbound} -[靈魂綁定代幣](https://vitalik.ca/general/2022/01/26/soulbound.html)(不可轉讓的非同質化代幣)可以用於收集特定錢包的獨有資訊。 這有效地創建了綁定到特定以太坊地址的唯一鏈上身分,這可能包括代表成就的代幣(例如完成某些特定的線上課程或在遊戲中超過分數門檻)或社區參與代幣。 +[靈魂綁定代幣](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)(不可轉讓的非同質化代幣)可以用於收集特定錢包的獨有資訊。 這有效地創建了綁定到特定以太坊地址的唯一鏈上身分,這可能包括代表成就的代幣(例如完成某些特定的線上課程或在遊戲中超過分數門檻)或社區參與代幣。 ## 去中心化身分的好處 {#benefits-of-decentralized-identity} diff --git a/public/content/translations/zh-tw/desci/index.md b/public/content/translations/zh-tw/desci/index.md index 4ffac5c57d7..9866bd0b873 100644 --- a/public/content/translations/zh-tw/desci/index.md +++ b/public/content/translations/zh-tw/desci/index.md @@ -76,7 +76,7 @@ Web3 廣泛試驗過去中心化自治組織和 Web3 開發的不同激勵模型 就像非同質化代幣可以將未來交易的收入返還給原創作者一樣,你可以建立透明的價值歸屬鏈來獎勵研究人員、管理機構(如去中心化自治組織),甚至是資料被收集的研究對象。 -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 還是將正在進行的實驗之資料庫去中心化的關鍵,還可以插入非同質化代幣與 [DeFi](/defi/) 金融化(從資產分割到借貸池與價值評估)。 它還允許如 [VitaDAO](https://www.vitadao.com/) 這樣的去中心化自治組織等鏈上原生實體直接在鏈上進行研究。 不可轉移的[「靈魂綁定」代幣](https://vitalik.ca/general/2022/01/26/soulbound.html)的出現,允許個人證明他們的經驗和證書與他們的以太坊地址相關聯,因而也可能在去中心化科研中發揮重要作用。 +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 還是將正在進行的實驗之資料庫去中心化的關鍵,還可以插入非同質化代幣與 [DeFi](/defi/) 金融化(從資產分割到借貸池與價值評估)。 它還允許如 [VitaDAO](https://www.vitadao.com/) 這樣的去中心化自治組織等鏈上原生實體直接在鏈上進行研究。 不可轉移的[「靈魂綁定」代幣](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)的出現,允許個人證明他們的經驗和證書與他們的以太坊地址相關聯,因而也可能在去中心化科研中發揮重要作用。 ### 資料存儲、存取和架構 {#data-storage} diff --git a/public/content/translations/zh-tw/developers/docs/accounts/index.md b/public/content/translations/zh-tw/developers/docs/accounts/index.md index 725a490d8f6..55baa281c8e 100644 --- a/public/content/translations/zh-tw/developers/docs/accounts/index.md +++ b/public/content/translations/zh-tw/developers/docs/accounts/index.md @@ -28,12 +28,12 @@ lang: zh-tw - 建立帳戶是免費的 - 能夠發起交易 -- 外部帳戶之間的交易只能是以太幣/代幣轉賬 +- 外部帳戶之間的交易只能是以太幣/代幣轉帳 - 由密碼學金鑰組組成:公開以及私密金鑰控制帳戶活動 **合約帳戶** -- 建立帳戶會佔用網絡存儲因此會產生費用 +- 建立帳戶會佔用網路儲存因此會產生費用 - 只能在接受到交易時發送交易 - 從外部帳戶向合約帳戶發送的交易能觸發程式碼,並能執行多種不同操作:例如傳送代幣,甚至建立新合約。 - 合約帳戶沒有私密金鑰。 但它們由智慧型合約程式碼的邏輯控制 @@ -43,9 +43,9 @@ lang: zh-tw 以太坊帳戶有四個欄位: - `nonce` – 一個計數器,指示外部帳戶發送的交易數量或合約帳戶建立的合約數量。 對於每個帳戶,一筆特定 Nonce 的交易只能執行一次,這是未了防範重放攻擊,即不斷地廣播並重覆執行已簽署的交易。 -- `balance` – 該地址擁有的 Wei 的數量。 Wei 是以太幣的面額,1 以太幣等於 1e+18 個 Wei。 -- `codeHash` -- 此雜湊值指帳戶於以太坊虛擬機 (EVM) 上的*程式碼*。 包含了程式碼片段的合約帳戶可以執行不同操作。 對帳戶進行訊息調用時,執行此以太坊虛擬機程式碼。 不同於帳戶的其他欄位,此欄位無法更改。 所有此等程式碼片段都包含於狀態資料庫中其對應的雜湊值下,以便日後擷取。 此雜湊值稱為 codeHash。 對於外部帳戶,codeHash 欄位是空字串的雜湊值。 -- `storageRoot` – 有時稱為存儲雜湊值。 梅克爾帕特里夏樹之根節點的 256 位雜湊值,它對帳戶的存儲內容進行編碼(256 位整數值之間的映射),在樹形資料結構中編碼成 256 位整數鍵的雜湊值到 RPL 編碼的 256 位整數值之間的映射。 該樹形資料結構對此帳戶的存儲內容的雜湊值進行編碼,且默認為空白。 +- `balance` – 該地址擁有的 Wei 的數量。 Wei 是以太幣的面額,1 以太幣等於1e+18 個 Wei。 +- `codeHash` -- 此雜湊值指帳戶於以太坊虛擬機 (EVM) 上的_程式碼_。 包含了程式碼片段的合約帳戶可以執行不同操作。 對帳戶進行訊息調用時,執行此以太坊虛擬機程式碼。 不同於帳戶的其他欄位,此欄位無法更改。 所有此等程式碼片段都包含於狀態資料庫中其對應的雜湊值下,以便日後擷取。 此雜湊值稱為 codeHash。 對於外部帳戶,codeHash 欄位是空字串的雜湊值。 +- `storageRoot` – 有時稱為儲存雜湊值。 梅克爾帕特里夏樹之根節點的 256 位雜湊值,它對帳戶的儲存內容進行編碼(256 位整數值之間的映射),在樹形資料結構中編碼成 256 位整數鍵的雜湊值到 RPL 編碼的 256 位整數值之間的映射。 該樹形資料結構對此帳戶的儲存內容的雜湊值進行編碼,且默認為空白。 ![顯示帳戶組成結構的圖表](./accounts.png) _此圖表源於[以太坊的以太坊虛擬機圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ @@ -69,7 +69,7 @@ lang: zh-tw 公開金鑰是使用[橢圓曲線數位簽名演算法](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm)從私密金鑰產生的。 你的帳戶的公開地址由公開金鑰 Keccak-256 雜湊值的後 20 位在開頭加上 `0x` 組成。 -下面的範例展示如何使用一種簽名工具 [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) 來產生一個新帳戶。 Clef 是一種與以太坊用戶端 [Geth](https://geth.ethereum.org) 綁定的帳戶管理與簽名工具。 `clef newaccount` 命令建立一個新的金鑰組並將其存儲於加密的密鑰庫。 +下面的範例展示如何使用一種簽名工具 [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) 來產生一個新帳戶。 Clef 是一種與以太坊用戶端 [Geth](https://geth.ethereum.org) 綁定的帳戶管理與簽名工具。 `clef newaccount` 命令建立一個新的金鑰組並將其儲存於加密的密鑰庫。 ``` > clef newaccount --keystore diff --git a/public/content/translations/zh-tw/developers/docs/blocks/index.md b/public/content/translations/zh-tw/developers/docs/blocks/index.md index 0a4badf296a..4ed2eae5cf8 100644 --- a/public/content/translations/zh-tw/developers/docs/blocks/index.md +++ b/public/content/translations/zh-tw/developers/docs/blocks/index.md @@ -14,13 +14,13 @@ lang: zh-tw 為確保所有以太坊網路參與者擁有同步狀態並一致同意明確的交易歷史記錄,我們將交易分批打包成區塊。 此代表數十個(或數百個)交易將同時被提交、同意及同步。 -![顯示區塊中的交易導致狀態產生變化的圖表](./tx-block.png) _此圖源於[以太坊 EVM 圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![顯示區塊中的交易導致狀態產生變化的圖表](./tx-block.png) _此圖源於[以太坊EVM圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ 透過將交易提交間隔分開,所有網路參與者能有足夠時間來達成共識:即便每秒有大量交易請求提出,但在以太坊上,僅以大約 12 秒的時間建立並提交一次區塊。 ## 區塊如何運作? {#how-blocks-work} -為了保持交易歷史記錄,區塊嚴格按照順序排列(新建立區塊包含父區塊之參照),而區塊內的交易也是嚴格按照順序排列。 除極個別情形外,在任何給定時間點,所有網路參與者都一致同意區塊的準確數量及歷史記錄,並致力於將當前的即時交易請求批次打包到下一個區塊中。 +為了保持交易歷史記錄,區塊嚴格按照順序排列(新建立區塊包含父區塊之參照),而區塊內的交易也是嚴格按照順序排列。 除極個別情形外,在任何給定時間點,所有網路參與者都一致同意區塊的準確數量及歷史記錄,並致力於將當前的即時交易請求批次打包到下一個區塊中。 當隨機挑選的驗證者在網路上生成一個區塊後,區塊將被廣播至全網路;所有節點將此新區塊添加於它們的區塊鏈尾端,接著,挑選一個新的驗證者來產生下一個區塊。 目前區塊生成、提交/共識流程是由以太坊之「權益證明」協議規定的。 @@ -39,97 +39,97 @@ lang: zh-tw 區塊內有很多資訊。 在最高層級,區塊包含以下欄位: -| 欄位 | 描述 | -| :--------------- | :--------------------------- | -| `時隙` | 區塊所屬的時隙 | -| `proposer_index` | 提出區塊的驗證者的識別碼 | -| `parent_root` | 前一個區塊的雜湊值 | -| `state_root` | 狀態物件的根雜湊值 | -| `主旨` | 包含多個欄位的物件,定義如下 | +| 欄位 | 描述 | +|:---------------- |:-------------- | +| `時隙` | 區塊所屬的時隙 | +| `proposer_index` | 提出區塊的驗證者的識別碼 | +| `parent_root` | 前一個區塊的雜湊值 | +| `state_root` | 狀態物件的根雜湊值 | +| `主旨` | 包含多個欄位的物件,定義如下 | 區塊的 `body` 包含以下幾個欄位: -| 欄位 | 描述 | -| :------------------- | :--------------------------- | +| 欄位 | 描述 | +|:-------------------- |:-------------- | | `randao_reveal` | 用於選擇下一個區塊提出者的值 | -| `eth1_data` | 關於存款合約的資訊 | -| `塗鴉` | 用於標記區塊的任意資料 | -| `proposer_slashings` | 將被罰沒的驗證者清單 | -| `attester_slashings` | 將被罰沒的驗證者清單 | -| `證明` | 支持當前區塊的證明清單 | -| `存款` | 存款合約的新增存款清單 | -| `voluntary_exits` | 離開網路的驗證者清單 | -| `sync_aggregate` | 服務輕量用端的驗證者子集 | -| `execution_payload` | 執行用户端傳送來的交易 | +| `eth1_data` | 關於存款合約的資訊 | +| `塗鴉` | 用於標記區塊的任意資料 | +| `proposer_slashings` | 將被罰沒的驗證者清單 | +| `attester_slashings` | 將被罰沒的驗證者清單 | +| `證明` | 支持當前區塊的證明清單 | +| `存款` | 存款合約的新增存款清單 | +| `voluntary_exits` | 離開網路的驗證者清單 | +| `sync_aggregate` | 服務輕量用端的驗證者子集 | +| `execution_payload` | 執行用户端傳送來的交易 | `attestations` 欄位包含區塊中所有證明的清單。 每個證明都有自己的資料類型並包含一些資料。 每個證明包含: -| 欄位 | 描述 | -| :----------------- | :----------------------- | +| 欄位 | 描述 | +|:------------------ |:------------ | | `aggregation_bits` | 參與過此證明的驗證者清單 | -| `數據資料` | 包含多個子欄位的容器 | +| `數據資料` | 包含多個子欄位的容器 | | `signature` | 所有證明驗證者的聚合簽名 | `attestation` 中的 `data` 欄位包含: -| 欄位 | 描述 | -| :------------------ | :----------------------------- | -| `時隙` | 與證明相關的時隙 | -| `索引` | 證明驗證者的索引 | +| 欄位 | 描述 | +|:------------------- |:--------------- | +| `時隙` | 與證明相關的時隙 | +| `索引` | 證明驗證者的索引 | | `beacon_block_root` | 包含此物件的信標區塊的根雜湊值 | -| `來源` | 最後一個合法檢查點 | -| `target` | 最新時期的邊界區塊 | +| `來源` | 最後一個合法檢查點 | +| `target` | 最新時期的邊界區塊 | 執行 `execution_payload` 中的交易會更新全域狀態。 所有用戶端都重新執行 `execution_payload` 中的交易,以確保新的狀態與新區塊中 `state_root` 欄位中的狀態相符。 這就是用戶端辨別新區塊是否有效並可以安全添加至其區塊鏈中的方式。 `execution payload` 自身是一個有許多欄位的物件。 還有一個 `execution_payload_header` 欄位,其中包含了關於執行資料的重要摘要資訊。 這些資料結構組織方式如下: `xecution_payload_header` 包含以下欄位: -| 欄位 | 描述 | -| :------------------ | :--------------------------------------- | -| `家長_雜湊值` | 父區塊的雜湊值 | -| `fee_recipient` | 用於支付交易費的帳戶地址 | +| 欄位 | 描述 | +|:------------------- |:-------------------- | +| `家長_雜湊值` | 父區塊的雜湊值 | +| `fee_recipient` | 用於支付交易費的帳戶地址 | | `state_root` | 在應用此區塊中的變更後全域狀態的根雜湊值 | -| `receipts_root` | 交易收據樹的雜湊值 | -| `logs_bloom` | 包含事件記錄的資料結構 | -| `prev_randao` | 用於隨機選擇驗證者的值 | -| `block_number` | 目前區塊號碼 | -| `gas_limit` | 此區塊允許的最高燃料用量 | -| `gas_used` | 此區塊實際消耗的燃料用量 | -| `時間戳` | 區塊時間 | -| `extra_data` | 原始字節位元組格式的任意額外資料 | -| `base_fee_per_gas` | 基本費用的值 | -| `block_hash` | 執行區塊的雜湊值 | -| `transactions_root` | 有效負載中交易的根雜湊值 | -| `withdrawal_root` | 有效負載中提款的根雜湊值 | +| `receipts_root` | 交易收據樹的雜湊值 | +| `logs_bloom` | 包含事件記錄的資料結構 | +| `prev_randao` | 用於隨機選擇驗證者的值 | +| `block_number` | 目前區塊號碼 | +| `gas_limit` | 此區塊允許的最高燃料用量 | +| `gas_used` | 此區塊實際消耗的燃料用量 | +| `時間戳` | 區塊時間 | +| `extra_data` | 原始字節位元組格式的任意額外資料 | +| `base_fee_per_gas` | 基本費用的值 | +| `block_hash` | 執行區塊的雜湊值 | +| `transactions_root` | 有效負載中交易的根雜湊值 | +| `withdrawal_root` | 有效負載中提款的根雜湊值 | `execution_payload` 自身包含了以下欄位(請注意,這些欄位與標頭相同,只是它不包含交易的根雜湊值,而是包含實際的交易清單和提款資訊): -| 欄位 | 描述 | -| :--------------------- | :--------------------------------------- | -| `家長_雜湊值` | 父區塊的雜湊值 | -| `fee_recipient` | 用於支付交易費的帳戶地址 | -| `state_root` | 在應用此區塊中的變更後全域狀態的根雜湊值 | -| `receipts_root` | 交易收據樹的雜湊值 | -| `logs_bloom` | 包含事件記錄的資料結構 | -| `prev_randao` | 用於隨機選擇驗證者的值 | -| `block_number` | 目前區塊號碼 | -| `gas_limit` | 此區塊允許的最高燃料用量 | -| `gas_used` | 此區塊實際消耗的燃料用量 | -| `時間戳` | 區塊時間 | -| `extra_data` | 原始字節位元組格式的任意額外資料 | -| `base_fee_per_gas` | 基本費用的值 | -| `block_hash` | 執行區塊的雜湊值 | -| `交易(transactions)` | 要執行交易的清單 | -| `提款` | 提款物件清單 | +| 欄位 | 描述 | +|:------------------ |:-------------------- | +| `家長_雜湊值` | 父區塊的雜湊值 | +| `fee_recipient` | 用於支付交易費的帳戶地址 | +| `state_root` | 在應用此區塊中的變更後全域狀態的根雜湊值 | +| `receipts_root` | 交易收據樹的雜湊值 | +| `logs_bloom` | 包含事件記錄的資料結構 | +| `prev_randao` | 用於隨機選擇驗證者的值 | +| `block_number` | 目前區塊號碼 | +| `gas_limit` | 此區塊允許的最高燃料用量 | +| `gas_used` | 此區塊實際消耗的燃料用量 | +| `時間戳` | 區塊時間 | +| `extra_data` | 原始字節位元組格式的任意額外資料 | +| `base_fee_per_gas` | 基本費用的值 | +| `block_hash` | 執行區塊的雜湊值 | +| `交易(transactions)` | 要執行交易的清單 | +| `提款` | 提款物件清單 | `withdrawals` 清單包含 `withdrawals` 物件,具下列結構: -| 欄位 | 描述 | -| :--------------- | :--------------- | -| `地址` | 已提款的帳戶地址 | -| `amount` | 提款金額 | -| `索引` | 提款索引值 | -| `validatorIndex` | 驗證者索引值 | +| 欄位 | 描述 | +|:---------------- |:-------- | +| `address` | 已提款的帳戶地址 | +| `amount` | 提款金額 | +| `索引` | 提款索引值 | +| `validatorIndex` | 驗證者索引值 | ## 區塊時間 {#block-time} diff --git a/public/content/translations/zh-tw/developers/docs/dapps/index.md b/public/content/translations/zh-tw/developers/docs/dapps/index.md index e0fa52340d4..534b67d686a 100644 --- a/public/content/translations/zh-tw/developers/docs/dapps/index.md +++ b/public/content/translations/zh-tw/developers/docs/dapps/index.md @@ -14,7 +14,7 @@ lang: zh-tw 去中心化應用程序的後端程式碼在去中心化點對點網路上運行。 與之相比,普通應用程序的後端程式碼在中心化伺服器上運行。 -去中心化應用程式的前端程式碼與使用者介面可以用任何語言編寫(就像普通應用程式一樣),以呼叫其後端。 此外,其前端能夠託管於任何去中心化存儲中,例如[星際檔案系統](https://ipfs.io/)。 +去中心化應用程式的前端程式碼與使用者介面可以用任何語言編寫(就像普通應用程式一樣),以呼叫其後端。 此外,其前端能夠託管於任何去中心化儲存中,例如[星際檔案系統](https://ipfs.io/)。 - **去中心化** -- 去中心化應用程式運行於以太坊上。以太坊是一個開放式公共去中心化平台,不受任何個人或群組控制 - **確定性** - 去中心化應用程式總是執行相同函式,而與其執行環境無關 @@ -31,17 +31,17 @@ lang: zh-tw - **零下線時間** -- 一旦智慧型合約部屬到區塊鏈上,整個網路將始終能夠為想要與此合約互動的客戶提供服務。 因此,惡意行為者無法發動針對單獨去中心化應用程式的拒絕服務攻擊。 - **隱私** -- 你無需提供真實身份,即可部署去中心化應用程式或與之互動。 -- **抗審查** -- 網絡上的任何單獨實體都無法阻止使用者提交交易、部署去中心化應用程式並讀取區塊鏈中的資料。 -- **資料完整性** -- 藉由加密基元技術,存儲於區塊鏈上的資料具不可變性及無爭議性。 惡意行為者無法假造已公開的交易或其他資料。 +- **抗審查** -- 網路上的任何單獨實體都無法阻止使用者提交交易、部署去中心化應用程式並讀取區塊鏈中的資料。 +- **資料完整性** -- 藉由加密基元技術,儲存於區塊鏈上的資料具不可變性及無爭議性。 惡意行為者無法假造已公開的交易或其他資料。 - **無需信任的計算/可驗證的行為** – 可以對智慧型合約進行分析且可以保障其按照可預見的方式執行,而無需信任中心化管理機構。 在傳統模式下,情況並非如此;例如,在使用線上銀行系統時,我們必須信任此等金融機構不會濫用我們的財物資料,不會竄改紀錄或者不會受到駭客攻擊。 ## 去中心化應用程式的開發弊端 {#drawbacks-of-dapp-development} -- **維護** -- 因為發佈到區塊鏈上的程式碼與資料更加難以修改,去中心化應用程式維護起來難度更大。 一旦部署去中心化應用程式後,開發者將難以更新去中心化應用程式(或其存儲的基礎資料),即便在舊版本中發現了錯誤或安全風險。 -- **效能開銷** – 效能開銷非常之高,並且擴容極其困難。 為了達成以太坊追求的高水平安全性、完整性、透明性及可靠性,每個節點都運行並存儲每一筆交易。 除此之外,達成權益證明共識也需要時間。 -- **網絡壅塞** -- 當一個去中心化應用程式佔用過多計算資源時,整個網絡會變得壅塞。 目前,以太坊網路能每秒處理大約 10-15 筆交易,但如果發送交易的速度快於處理速度,未確認的交易池將快速暴增。 +- **維護** -- 因為發佈到區塊鏈上的程式碼與資料更加難以修改,去中心化應用程式維護起來難度更大。 一旦部署去中心化應用程式後,開發者將難以更新去中心化應用程式(或其儲存的基礎資料),即便在舊版本中發現了錯誤或安全風險。 +- **效能開銷** – 效能開銷非常之高,並且擴容極其困難。 為了達成以太坊追求的高水平安全性、完整性、透明性及可靠性,每個節點都運行並儲存每一筆交易。 除此之外,達成權益證明共識也需要時間。 +- **網路壅塞** -- 當一個去中心化應用程式佔用過多計算資源時,整個網路會變得壅塞。 目前,以太坊網路能每秒處理大約 10-15 筆交易,但如果發送交易的速度快於處理速度,未確認的交易池將快速暴增。 - **使用者體驗** – 可能很難設計出方便使用的體驗,因為普通終端使用者可能會發現難以設定透過真正安全的方式與區塊鏈互動所需的工具棧。 -- **中心化** -- 方便使用且方便開發的解決方案建立於以太坊基礎層上,最終它們可能在某些方面看起來像是中心化服務。 例如,此等服務可能在伺服器端存儲金鑰或其他敏感資訊,通過中心化伺服器支援前端,或者在將其寫入區塊鏈前在中心化伺服器上運行重要業務邏輯。 中心化會消除許多(如果不是全部)區塊鏈相較於傳統模式的優勢。 +- **中心化** -- 方便使用且方便開發的解決方案建立於以太坊基礎層上,最終它們可能在某些方面看起來像是中心化服務。 例如,此等服務可能在伺服器端儲存金鑰或其他敏感資訊,通過中心化伺服器支援前端,或者在將其寫入區塊鏈前在中心化伺服器上運行重要業務邏輯。 中心化會消除許多(如果不是全部)區塊鏈相較於傳統模式的優勢。 ## 想透過實際視覺學習? {#visual-learner} @@ -51,19 +51,19 @@ lang: zh-tw **Scaffold-ETH _- 透過可適應你的智慧型合約的前端,快速體驗 Solidity。_** -- [GitHub](https://github.com/austintgriffith/scaffold-eth) +- [Github](https://github.com/austintgriffith/scaffold-eth) - [範例去中心化應用程式](https://punkwallet.io/) **Create Eth App _- 通過一條指令建立以太坊支援的應用程式。_** -- [GitHub](https://github.com/paulrberg/create-eth-app) +- [Github](https://github.com/paulrberg/create-eth-app) -**One Click Dapp _ - FOSS 工具,用來透過[應用程式介面](/glossary/#abi)生成去中心化應用程式前端。_** +**One Click Dapp _ - FOSS 工具,用來透過[應用程式二進位介面](/glossary/#abi)生成去中心化應用程式前端。_** - [oneclickdapp.com](https://oneclickdapp.com) -- [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1) +- [Github](https://github.com/oneclickdapp/oneclickdapp-v1) -**Etherflow* -- FOSS 工具,以太坊開發者可用其測試節點,在瀏覽器中撰寫並偵錯遠端程序呼叫。*** +**Etherflow_ -- FOSS 工具,以太坊開發者可用其測試節點,在瀏覽器中撰寫並偵錯遠端程序呼叫。_** - [etherflow.quiknode.io](https://etherflow.quiknode.io/) - [GitHub](https://github.com/abunsen/etherflow) @@ -72,7 +72,7 @@ lang: zh-tw - [首頁](https://thirdweb.com/) - [文件](https://portal.thirdweb.com/) -- [GitHub](https://github.com/thirdweb-dev/) +- [Github](https://github.com/thirdweb-dev/) ## 衍生閱讀 {#further-reading} diff --git a/public/content/translations/zh-tw/developers/docs/evm/index.md b/public/content/translations/zh-tw/developers/docs/evm/index.md index 09b91e43690..111ff92205c 100644 --- a/public/content/translations/zh-tw/developers/docs/evm/index.md +++ b/public/content/translations/zh-tw/developers/docs/evm/index.md @@ -4,21 +4,21 @@ description: 以太坊虛擬機及其與網路狀態、交易、智慧型合約 lang: zh-tw --- -不能用描述雲彩或海浪的相同方式來描述以太坊虛擬機的實體安裝,但它確實作為一個單獨*實體*存在,由數千臺相互連結且運行以太坊用戶端的電腦維護。 +不能用描述雲彩或海浪的相同方式來描述以太坊虛擬機的實體安裝,但它確實作為一個單獨_實體_存在,由數千臺相互連結且運行以太坊用戶端的電腦維護。 以太坊協議本身的存在僅是為了保持這個特殊狀態機持續、不間斷和不可變的運行。 它是所有以太坊帳戶和智慧型合約存在的環境。 對於區塊鏈上的任何一個區塊,以太坊有且僅有一種『規範』狀態,而以太坊虛擬機用於定義在區塊之間計算新的有效狀態的規則。 ## 基本資訊 {#prerequisites} -首先,對電腦科學之常用術語,例如[字節位元組](https://wikipedia.org/wiki/Byte)、[記憶體](https://wikipedia.org/wiki/Computer_memory)及[堆疊]()等有一個基本認知,才能夠理解以太坊虛擬機。 熟悉密碼學/區塊鏈概念,如[雜湊函式](https://wikipedia.org/wiki/Cryptographic_hash_function)和[梅克爾樹](https://wikipedia.org/wiki/Merkle_tree)等也有幫助。 +首先,對電腦科學之常用術語,例如[字節位元組](https://wikipedia.org/wiki/Byte)、[記憶體](https://wikipedia.org/wiki/Computer_memory)及[堆疊](https://wikipedia.org/wiki/Stack_(abstract_data_type))等有一個基本認知,才能夠理解以太坊虛擬機。 熟悉密碼學/區塊鏈概念,如[雜湊函式](https://wikipedia.org/wiki/Cryptographic_hash_function)和[梅克爾樹](https://wikipedia.org/wiki/Merkle_tree)等也有幫助。 ## 從帳本至狀態機 {#from-ledger-to-state-machine} 我們經常使用「分佈式帳本」這一比喻來描述比特幣一類的區塊鏈,區塊鏈透過使用一些基礎加密工具來支持去中心化貨幣。 帳本維護著活動記錄,並且必須遵守一套管控帳本修改相關操作的規則。 例如,比特幣地址無法花費超出其先前接受數量之比特幣。 此類規則構成比特幣及其他區塊鏈上所有交易的基礎。 -盡管以太坊有著自己的原生加密貨幣(以太幣)且遵循幾乎相同的直觀規則,但它還支持一種更加強大的功能:[智慧型合約](/developers/docs/smart-contracts/)。 對於此更為複雜的功能,需要一種更貼切之比喻來形容以太坊。 以太坊並非分佈式帳本,而是一種分佈式[狀態機](https://wikipedia.org/wiki/Finite-state_machine)。 以太坊狀態為一種龐大資料結構,其中不僅包含所有帳戶與餘額還包括*機器狀態*,機器狀態能夠遵照先前定義的一套規則在區塊之間變化並能執行任何機器程式碼。 在區塊之間變更狀態的具體規則由以太坊虛擬機定義。 +盡管以太坊有著自己的原生加密貨幣(以太幣)且遵循幾乎相同的直觀規則,但它還支持一種更加強大的功能:[智慧型合約](/developers/docs/smart-contracts/)。 對於此更為複雜的功能,需要一種更貼切之比喻來形容以太坊。 以太坊並非分佈式帳本,而是一種分佈式[狀態機](https://wikipedia.org/wiki/Finite-state_machine)。 以太坊狀態為一種龐大資料結構,其中不僅包含所有帳戶與餘額還包括_機器狀態_,機器狀態能夠遵照先前定義的一套規則在區塊之間變化並能執行任何機器程式碼。 在區塊之間變更狀態的具體規則由以太坊虛擬機定義。 -![展示以太坊虛擬機構成的圖表](./evm.png) _此圖源於[以太坊 EVM 圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![展示以太坊虛擬機構成的圖表](./evm.png) _此圖源於[以太坊EVM圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ ## 以太坊狀態轉換函式 {#the-ethereum-state-transition-function} @@ -32,7 +32,7 @@ Y(S, T)= S' ### 狀態 {#state} -在以太坊情境下,狀態為一個龐大的資料結構,稱為[改進的梅克爾帕特里夏樹](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/),該樹保存由雜湊值連接在一起的所有[帳戶](/developers/docs/accounts/)且可回朔至在區塊鏈上存儲的單一根哈希。 +在以太坊情境下,狀態為一個龐大的資料結構,稱為[改進的梅克爾帕特里夏樹](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/),該樹保存由雜湊值連接在一起的所有[帳戶](/developers/docs/accounts/)且可回朔至在區塊鏈上儲存的單一根哈希。 ### 交易 {#transactions} @@ -42,11 +42,11 @@ Y(S, T)= S' ## 以太坊虛擬機相關說明 {#evm-instructions} -以太坊虛擬機的執行類似於[堆疊機](https://wikipedia.org/wiki/Stack_machine),執行深度為 1024 個項目。 每個項目均為 256 位元的字,選擇它是為了方便用於 256 位元加密(例如,Keccak-256 雜湊或 secp256k1 簽章)。 +以太坊虛擬機的執行類似於[堆疊機](https://wikipedia.org/wiki/Stack_machine),執行深度為 1024 個專案。 每個專案均為 256 位元的字,選擇它是為了方便用於 256 位元加密(例如,Keccak-256 雜湊或 secp256k1 簽章)。 -執行過程中,以太坊虛擬機維持一個臨時*記憶體*(即字尋址字元陣列),該記憶體於交易間隔期間不存在。 +執行過程中,以太坊虛擬機維持一個臨時_記憶體_(即字尋址字元陣列),該記憶體於交易間隔期間不存在。 -然而,合約確實包含一棵梅克爾帕特里夏*存儲*樹(即字尋址字陳列),該樹與相關帳戶關聯且是全域狀態的一部分。 +然而,合約確實包含一棵梅克爾帕特里夏_儲存_樹(即字尋址字陳列),該樹與相關帳戶關聯且是全域狀態的一部分。 已編譯的智慧型合約位元組碼作為一些以太坊虛擬機[作業碼](/developers/docs/evm/opcodes)執行,後者執行標準堆疊操作,例如 `XOR`、`AND`、`ADD`、`SUB` 等。 以太坊虛擬機亦可透過一些區塊鏈特定的堆疊操作實作,例如 `ADDRESS`、`BALANCE`、`BLOCKHASH` 等。 @@ -64,6 +64,7 @@ Y(S, T)= S' - [evmone](https://github.com/ethereum/evmone) - _C++_ - [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_ - [eEVM](https://github.com/microsoft/eevm) - _C++_ +- [revm](https://github.com/bluealloy/revm) - _Rust_ ## 延伸閱讀 {#further-reading} diff --git a/public/content/translations/zh-tw/developers/docs/evm/opcodes/index.md b/public/content/translations/zh-tw/developers/docs/evm/opcodes/index.md index e86fce4a5cc..c5093615133 100644 --- a/public/content/translations/zh-tw/developers/docs/evm/opcodes/index.md +++ b/public/content/translations/zh-tw/developers/docs/evm/opcodes/index.md @@ -14,157 +14,157 @@ lang: zh-tw 💡 快速提示:要檢視整行,可以用 `[shift] + 滑鼠滾輪`在桌面上水平滾動。 -| 堆疊 | 名稱 | 燃料 | 初始堆疊 | 最終堆疊 | 記憶體/存儲空間 | 注釋 | -| :---: | :------------- | :---------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------- | :------------------------------ | :---------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | -| 00 | 停止 | 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 = addr.exists ? keccak256(addr.code) : 0 | -| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | -| 41 | COINBASE | 2 | `。` | `block.coinbase` | | address of miner of current 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-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-5E | _invalid_ | | | | | | -| 5F | PUSH0 | 2 | `。` | `uint8` | | 將常數 0 推入堆疊中 | -| 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` | `。` | | LOG1(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` | `。` | | LOG1(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` | `。` | | LOG1(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 | 返回 | 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 | 返回 | 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` | `。` | | | destroy contract and sends all funds to `addr` | +| 堆疊 | 名稱 | 燃料 | 初始堆疊 | 最終堆疊 | 記憶體/儲存空間 | 注釋 | +|:-----:|:-------------- |:-----------------------------------------------------------------------------------------------:|:------------------------------------------------ |:-------------------------------------------- |:----------------------------------------------------------------------------- |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 00 | 停止 | 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` | | address of miner of current 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-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-5E | _invalid_ | | | | | | +| 5F | PUSH0 | 2 | `。` | `uint8` | | 將常數 0 推入堆疊中 | +| 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` | `。` | | LOG1(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` | `。` | | LOG1(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` | `。` | | LOG1(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 | 返回 | 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 | 返回 | 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` | `。` | | | destroy contract and sends all funds to `addr` | diff --git a/public/content/translations/zh-tw/developers/docs/gas/index.md b/public/content/translations/zh-tw/developers/docs/gas/index.md index 3aaf80c2a9c..827d29b37ff 100644 --- a/public/content/translations/zh-tw/developers/docs/gas/index.md +++ b/public/content/translations/zh-tw/developers/docs/gas/index.md @@ -36,7 +36,7 @@ lang: zh-tw 只支付 `base fee` 的交易在技術層面上是有效的,但不太可能加入下一個區塊中,因為此類交易未向驗證者提供任何激勵,因此驗證者不會選擇它而不管任何其他交易。 「適宜」的 `priority` 費依據發送交易時的網路使用情況而定 - 若當時需求非常高,你需要將你的 `priority` 費設高點,而需求低時則可以付少點。 -舉例來說,假設 Jordan 要付給 Taylor 1 以太幣。 以太幣轉賬需要 21,000 單位的燃料,而基本費用為 10 gwei。 Jordan 支付 2 gwei 小費。 +舉例來說,假設 Jordan 要付給 Taylor 1 以太幣。 以太幣轉帳需要 21,000 單位的燃料,而基本費用為 10 gwei。 Jordan 支付 2 gwei 小費。 現在總燃料費為: @@ -54,28 +54,28 @@ lang: zh-tw 此基本費用透過一個公式計算,該公式比較前一個區塊的大小(所有交易使用的燃料用量)與目標區塊大小。 如果超出目標區塊大小,每個區塊的基本費用將最大增加 12.5%。 這種指數級增長讓區塊大小無限增加在經濟上不可行。 -| 區塊編號 | 包含燃料 | 費用增幅 | 當前基本費用 | -| -------- | -------: | -------: | -----------: | -| 1 | 15M | 0% | 100 gwei | -| 2 | 30M | 0% | 100 gwei | -| 3 | 30M | 12.5% | 112.5 gwei | -| 4 | 30M | 12.5% | 126.6 gwei | -| 5 | 30M | 12.5% | 142.4 gwei | -| 6 | 30M | 12.5% | 160.2 gwei | -| 7 | 30M | 12.5% | 180.2 gwei | -| 8 | 30M | 12.5% | 202.7 gwei | +| 區塊編號 | 包含燃料 | 費用增幅 | 當前基本費用 | +| ---- | ----:| -----:| ----------:| +| 1 | 15M | 0% | 100 gwei | +| 2 | 30M | 0% | 100 gwei | +| 3 | 30M | 12.5% | 112.5 gwei | +| 4 | 30M | 12.5% | 126.6 gwei | +| 5 | 30M | 12.5% | 142.4 gwei | +| 6 | 30M | 12.5% | 160.2 gwei | +| 7 | 30M | 12.5% | 180.2 gwei | +| 8 | 30M | 12.5% | 202.7 gwei | 依據上表 -- 要在 9 號區塊中建立一筆交易,錢包會讓使用者明確知道將交易添加到下一個區塊中的**最大基本費用**為 `current base fee * 112.5%` 或 `202.7 gwei * 112.5% = 228.1 gwei`。 值得注意的是,因為基本費用在區塊變滿之前增加的速度很快,我們不太可能看到大量已滿區塊連續出現。 -| 區塊編碼 | 包含 Gas 費 | 增加費用 | 目前基本費用 | -| -------- | ----------: | -------: | --------------: | -| 30 | 30M | 12.5% | 2705.6 gwei | -| ... | ... | 12.5% | ... | -| 50 | 30M | 12.5% | 28531.3 gwei | -| ... | ... | 12.5% | ... | -| 100 | 30M | 12.5% | 10302608.6 gwei | +| 區塊編碼 | 包含Gas費 | 增加費用 | 目前基本費用 | +| ---- | ------:| -----:| ---------------:| +| 30 | 30M | 12.5% | 2705.6 gwei | +| ... | ... | 12.5% | ... | +| 50 | 30M | 12.5% | 28531.3 gwei | +| ... | ... | 12.5% | ... | +| 100 | 30M | 12.5% | 10302608.6 gwei | ### 優先費(小費) {#priority-fee} @@ -103,9 +103,9 @@ lang: zh-tw ## 什麼是燃料限制? {#what-is-gas-limit} -燃料限制指的是你在一筆交易中最多願意使用多少燃料。 包含[智慧型合約](/developers/docs/smart-contracts/)的更複雜的交易需要進行更多計算工作,所以比起簡單的支付,它們需要更高的燃料限制。 標準以太幣轉賬需要的燃料限制為 21,000 單位燃料。 +燃料限制指的是你在一筆交易中最多願意使用多少燃料。 包含[智慧型合約](/developers/docs/smart-contracts/)的更複雜的交易需要進行更多計算工作,所以比起簡單的支付,它們需要更高的燃料限制。 標準以太幣轉帳需要的燃料限制為 21,000 單位燃料。 -例如,如果為一次簡單的以太幣轉賬設定了 50,000 的燃料限制,以太坊虛擬機將消耗 21,000 單位燃料並退還剩餘的 29,000。 然而,如果你設定的燃料過低,例如為簡單的以太幣轉賬設定 20,000 的燃料限制,以太坊虛擬機將用盡 20,000 燃料單位嘗試完成交易,但最終交易會失敗。 隨後,以太坊虛擬機會還原全部變更,但因為驗證者已完成了相當於 20k 燃料單位的工作,所以會消耗這些燃料。 +例如,如果為一次簡單的以太幣轉帳設定了 50,000 的燃料限制,以太坊虛擬機將消耗 21,000 單位燃料並退還剩餘的 29,000。 然而,如果你設定的燃料過低,例如為簡單的以太幣轉帳設定 20,000 的燃料限制,以太坊虛擬機將用盡 20,000 燃料單位嘗試完成交易,但最終交易會失敗。 隨後,以太坊虛擬機會還原全部變更,但因為驗證者已完成了相當於 20k 燃料單位的工作,所以會消耗這些燃料。 ## 為何燃料費這麼高? {#why-can-gas-fees-get-so-high} @@ -125,7 +125,7 @@ lang: zh-tw 假設 Alice 需要支付給 Bob 1 以太幣。 在交易中,燃料限制是 21,000 單位,燃料費價格為 200 gwei。 -總費用將為:`Gas units (limit) * Gas price per unit`,即 `21,000 * 200 = 4,200,000 gwei` 或 0.0042 以太幣。 +總費用將為:`Gas units (limit) *燃料price per unit`,即 `21,000 * 200 = 4,200,000 gwei` 或 0.0042 以太幣。 倫敦升級的 [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) 實作使交易費機制更加複雜,但也讓燃料費更加可預測,最終形成了更高效的交易費市場。 使用者可以透過 `maxFeePerGas` 提交交易,表示他們願意支付多少費用以讓其交易被執行,使用者知道他們不會支付超過燃料市價 (`baseFeePerGas`) 的燃料費,並且會得到任何多餘費用(扣除小費)的退款。 @@ -139,7 +139,7 @@ lang: zh-tw - [Etherscan](https://etherscan.io/gastracker) _交易燃料費價格估算器_ - [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _燃料估算 Chrome 延伸模組,支援 0 類原始交易及 2 類 EIP-1559 交易。_ -- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _在主網、Arbitrum、Polygon 上使用當地貨幣計算不同交易類型的燃料費。_ +- [Cryptoneur燃料Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _在主網、Arbitrum、Polygon 上使用當地貨幣計算不同交易類型的燃料費。_ ## 相關工具 {#related-tools} diff --git a/public/content/translations/zh-tw/developers/docs/intro-to-ether/index.md b/public/content/translations/zh-tw/developers/docs/intro-to-ether/index.md index f45da82b03c..9022bdd665b 100644 --- a/public/content/translations/zh-tw/developers/docs/intro-to-ether/index.md +++ b/public/content/translations/zh-tw/developers/docs/intro-to-ether/index.md @@ -12,7 +12,7 @@ lang: zh-tw 加密貨幣為交易媒介,其安全由以區塊鏈為基礎的帳本保障。 -交易媒介被廣泛視作商品與服務的付款方式,帳本為用來追蹤交易的資料存儲。 區塊鏈技術讓使用者能夠在帳本上進行交易,且無需依賴任何信任之第三方來維持此帳本。 +交易媒介被廣泛視作商品與服務的付款方式,帳本為用來追蹤交易的資料儲存。 區塊鏈技術讓使用者能夠在帳本上進行交易,且無需依賴任何信任之第三方來維持此帳本。 第一種加密貨幣為比特幣,由中本聰創建。 自從比特幣 2009 問世以來,人們已經在多個不同區塊鏈上開發了數千種加密貨幣。 @@ -50,10 +50,10 @@ Wei 為以太幣的最小面額,因而,許多技術實作,例如[以太坊 Gwei 是 giga-wei 的簡稱,常用來描述以太坊上的燃料費用。 -| 面額 | 用以太幣表示的價值 | 常見用途 | -| ---- | ------------------ | -------------- | -| Wei | 10-18 | 技術實作 | -| Gwei | 10-9 | 人類可讀燃料費 | +| 面額 | 用以太幣表示的價值 | 常見用途 | +| ---- | ---------------- | ------- | +| Wei | 10-18 | 技術實作 | +| Gwei | 10-9 | 人類可讀燃料費 | ## 傳送以太幣 {#transferring-ether} diff --git a/public/content/translations/zh-tw/developers/docs/intro-to-ethereum/index.md b/public/content/translations/zh-tw/developers/docs/intro-to-ethereum/index.md index 3664ea8ee21..82fd9a36238 100644 --- a/public/content/translations/zh-tw/developers/docs/intro-to-ethereum/index.md +++ b/public/content/translations/zh-tw/developers/docs/intro-to-ethereum/index.md @@ -8,7 +8,7 @@ lang: zh-tw 區塊鏈是一個公共資料庫,在網路中的許多電腦之間更新和共享。 -「區塊」是指存儲在連續群組(即「區塊」)中的資料及狀態。 若你給其他人發送以太幣,交易資料須添加至區塊後才算交易成功。 +「區塊」是指儲存在連續群組(即「區塊」)中的資料及狀態。 若你給其他人發送以太幣,交易資料須添加至區塊後才算交易成功。 「鏈」指的是每個區塊透過加密方式引用上一個區塊。 換言之,區塊連結在一起。 無法變更區塊內的資料,除非對其後所有區塊進行變更,這需要整個網路達成共識。 @@ -28,7 +28,7 @@ lang: zh-tw 以太坊宇宙中有一臺單獨的規範電腦(稱為以太坊虛擬機,EVM),網路上的所有參與者都對其狀態達成共識。 所有以太坊網路參與者(每個以太坊節點)都保存有此電腦之狀態的副本。 此外,任何參與者能向此電腦廣播執行任意計算的請求。 每當此類請求被廣播時,網路上的其他參與者將確認、驗證並完成(「執行」)此計算。 此等執行將引起以太坊虛擬機狀態變化,而狀態變化將被提交並傳播至整個網路。 -計算請求亦稱為交易請求;所有交易的紀錄及以太坊虛擬機的當前狀態存儲於區塊鏈上,而區塊鏈由所有節點存儲並達成共識。 +計算請求亦稱為交易請求;所有交易的紀錄及以太坊虛擬機的當前狀態儲存於區塊鏈上,而區塊鏈由所有節點儲存並達成共識。 加密機制確保一旦交易被驗證為有效並添加至區塊鏈上,以後就無法被篡改。 此相同機制也確保所有交易是透過相同的「權限」簽署並執行(除了 Alice 本人外,任何人都不應該能從她的帳戶發送數位資產)。 @@ -36,7 +36,7 @@ lang: zh-tw **以太幣 (ETH)** 是以太坊的原生加密貨幣。 以太坊的作用是提供一個計算市場。 此類市場為參與者提供經濟獎勵,激勵其驗證並執行交易請求,並且向網路提供計算資源。 -任何廣播交易請求的參與者還必須給網路提供一定數量的以太幣,作為賞金。 網路將此類賞金獎勵給最終驗證交易、執行交易、將交易提交至區塊鏈及廣播交易至網絡的任何人。 +任何廣播交易請求的參與者還必須給網路提供一定數量的以太幣,作為賞金。 網路將此類賞金獎勵給最終驗證交易、執行交易、將交易提交至區塊鏈及廣播交易至網路的任何人。 支付的以太幣數量對應於執行此計算所需的資源。 這些賞金也能阻止惡意參與者蓄意透過請求執行無限計算或其他資源密集類型的指令碼來堵塞網路,因為惡意參與者必須支付使用計算資源的費用。 @@ -66,19 +66,19 @@ lang: zh-tw ### 以太坊虛擬機 {#evm} -以太坊虛擬機為一臺全域虛擬電腦,所有以太坊網路參與者都存儲其狀態並達成共識。 任何參與者都能請求在以太坊虛擬機上執行任何程式碼;程式碼執行會改變以太坊虛擬機的狀態。 +以太坊虛擬機為一臺全域虛擬電腦,所有以太坊網路參與者都儲存其狀態並達成共識。 任何參與者都能請求在以太坊虛擬機上執行任何程式碼;程式碼執行會改變以太坊虛擬機的狀態。 [更多以太坊虛擬機相關資訊](/developers/docs/evm/) ### 節點 {#nodes} -存儲以太坊虛擬機狀態的真實電腦。 節點互相通訊,以傳播關於以太坊虛擬機狀態及新出現狀態變化的資訊。 任何使用者還可以透過從節點廣播程式碼執行請求,請求執行程式碼。 以太坊網路本身為所有以太坊節點及其通信之彙總。 +儲存以太坊虛擬機狀態的真實電腦。 節點互相通訊,以傳播關於以太坊虛擬機狀態及新出現狀態變化的資訊。 任何使用者還可以透過從節點廣播程式碼執行請求,請求執行程式碼。 以太坊網路本身為所有以太坊節點及其通信之彙總。 [更多詳情關於節點](/developers/docs/nodes-and-clients/) ### 帳戶 {#accounts} -以太幣存儲之處。 使用者可以初始化帳戶,將以太幣存入帳戶,並將其帳戶中的以太幣轉賬給其他使用者。 帳戶及帳戶餘額存儲於以太坊虛擬機中的一張龐大表格中;它們是以太坊虛擬機全部狀態的一部分。 +以太幣儲存之處。 使用者可以初始化帳戶,將以太幣存入帳戶,並將其帳戶中的以太幣轉帳給其他使用者。 帳戶及帳戶餘額儲存於以太坊虛擬機中的一張龐大表格中;它們是以太坊虛擬機全部狀態的一部分。 [更多帳戶相關資訊](/developers/docs/accounts/) diff --git a/public/content/translations/zh-tw/developers/docs/networks/index.md b/public/content/translations/zh-tw/developers/docs/networks/index.md index b04ace50372..60e6dd79502 100644 --- a/public/content/translations/zh-tw/developers/docs/networks/index.md +++ b/public/content/translations/zh-tw/developers/docs/networks/index.md @@ -60,8 +60,9 @@ lang: zh-tw - [Alchemy Sepolia 水龍頭](https://sepoliafaucet.com/) - [Infura Sepolia 水龍頭](https://www.infura.io/faucet) - [Chainstack Sepolia 水龍頭](https://faucet.chainstack.com/sepolia-faucet) +- [測試網水龍頭 | Sepolia](https://testnet-faucet.com/sepolia/) -#### Goerli*(長期支援)* {#goerli} +#### Goerli_(長期支援)_ {#goerli} _注意:[Goerli 測試網已被棄用](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17)且將在 2023 年被 [Holesovice](https://github.com/eth-clients/holesovice) 取代。 請考慮將你的應用程式遷移到 Sepolia。_ @@ -69,7 +70,7 @@ Goerli 是測試驗證和質押的測試網。 Goerli 測試網對想要運行 - 開放的驗證者集合,質押者可以測試網路升級 - 龐大的狀態,對於測試複雜智慧型合約的互動很有用 -- 同步時間更長,且需要更多存儲空間運行節點 +- 同步時間更長,且需要更多儲存空間運行節點 ##### 相關資源 @@ -111,28 +112,36 @@ Goerli 是測試驗證和質押的測試網。 Goerli 測試網對想要運行 - [Paradigm 水龍頭](https://faucet.paradigm.xyz/) - [Coinbase 錢包水龍頭 | Optimism Goerli](https://coinbase.com/faucets/optimism-goerli-faucet) +#### Starknet Goerli {#starknet-goerli} + +[Starknet](https://www.starknet.io) 的測試網。 + +##### 水龍頭 + +- [Starknet 水龍頭](https://faucet.goerli.starknet.io) + ## 私人網路 {#private-networks} -若節點未連接到公共網路(即主網或測試網),則以太坊網路就是一個 私人網路。 在此情況下,私人僅表示保留或隔離,非受保護或安全。 +若節點未連接到公共網路 (即主網或測試網),則以太坊網路就是一個 私人網路。 在此情況下,私人僅表示保留或隔離,而非受保護或安全。 ### 發展網路 {#development-networks} -開發以太坊應用程式時,在部署前你想先在私人網路上運行它,瞭解其運作情況。 類似於進行 Web 開發時在自己的電腦上建立本機伺服器,你可以建立本機區塊鏈實例來測試你的去中心化應用程式。 與公共測試網相比,這可以大幅提升疊代速度。 +開發以太坊應用程式時,最好在部署前先在私人網路上執行,瞭解其運作情況。 類似於進行網頁開發時,在自己的電腦上建立本機伺服器,你可以建立本機區塊鏈實例來測試你的去中心化應用程式。 與公共測試網相比,這可以大幅提升迭代速度。 -一些專案與工具專用於開發網路。 瞭解更多關於[開發網路](/developers/docs/development-networks/)的資訊。 +有些專門輔助專案和工具可以使用。 深入瞭解[開發網路](/developers/docs/development-networks/)的資訊。 ### 聯盟網路 {#consortium-networks} -共識過程由預先定義的一組受信任節點控制。 舉例來說,在一個由知名學術機構組成的私人網路中,每個機構管理單個節點,區塊由網路中達到閾值數量的簽署人驗證。 +共識過程由預先定義的一組受信任節點控制。 舉例來說,在知名學術機構組成的私人網路中,每個機構管理單節點,區塊由網路中達到閾值數量的簽署人驗證。 如果說公共以太坊網路是公共網際網路,那麼聯盟網路就是私有內部網路。 ## 相關工具 {#related-tools} -- [Chainlist](https://chainlist.org/) _將錢包與提供商連結到適當鏈識別碼與網路識別碼的以太坊虛擬機網路清單_ -- [以以太坊虛擬機為基礎的鏈](https://github.com/ethereum-lists/chains) _GitHub 的鏈中繼資料存放庫,可運行鏈清單_ +- [Chainlist](https://chainlist.org/) _是將錢包與提供者連結到適當鏈 ID 與網路 ID 的以太坊虛擬機網路的清單_ +- [採用以太坊虛擬機 (EVM) 的鏈](https://github.com/ethereum-lists/chains) _Github 鏈中繼資料存放庫,支援 Chainlist_ ## 衍生閱讀 {#further-reading} - [提案:可預測的以太坊測試網生命週期](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) -- [以太坊測試網的進化之路](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) +- [以太坊測試網的演進](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/anatomy/index.md new file mode 100644 index 00000000000..956daf362a2 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/anatomy/index.md @@ -0,0 +1,655 @@ +--- +title: 智慧型合約結構 +description: 智慧型合約深入解析:功能、資料、變數。 +lang: zh-tw +--- + +智慧型合約是在以太坊地址運作的程式。 由可以在接收交易後執行的資料與函數組成。 此為智慧型合約組成的概覽。 + +## 基本資訊 {#prerequisites} + +務必先瞭解[智慧型合約](/developers/docs/smart-contracts/)。 此文件假設你已熟悉 JavaScript 或 Python 等程式語言。 + +## 資料 {#data} + +任何合約資料都須指定至 `storage` 或 `memory` 這兩個位置。 修改智慧型合約的存儲很麻煩,所以必須謹慎思考要將資料儲存至何處。 + +### 存儲 {#storage} + +永久資料也稱為存儲,並由狀態變數表示。 這些值會永久儲存於區塊鏈上。 你需要聲明一個類型,以便於合約在編譯時可以追蹤在區塊鏈上需要多少存儲空間。 + +```solidity +// Solidity 範例 +contract SimpleStorage { + uint storedData; //狀態變量 + // ... +} +``` + +```python +# Vyper 範例 +storedData: int128 +``` + +如果已編寫過物件導向程式語言,應該會熟悉大多數類型。 但如果剛接觸以太坊開發,則會不熟悉 `address` 類型。 + +一個 `address` 類型可以容納一個以太坊地址,相當於 20 個位元組或 160 個位元。 它會以十六進制的形式傳回,前綴是 0x。 + +其他類型包含: + +- 布林值 +- 整數 +- 定點數 +- 固定規模的位元組陣列 +- 動態規模的位元組陣列 +- 有理數和整數常值 +- 字串常值 +- 十六進位常值 +- 列舉 + +如需更多說明,請參閱文件: + +- [查看 Vyper 類型](https://vyper.readthedocs.io/en/v0.1.0-beta.6/types.html#value-types) +- [查看 Solidity 類型](https://solidity.readthedocs.io/en/latest/types.html#value-types) + +### 記憶體 {#memory} + +僅在合約函數的執行生命週期儲存的值稱為記憶體變數。 由於這些變數不是永久儲存在區塊鏈上,所以使用成本要低得多。 + +在 [Solidity 文件](https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html?highlight=memory#storage-memory-and-the-stack)中深入瞭解以太坊虛擬機如何儲存資料(存儲、記憶體和堆疊)。 + +### 環境變數 {#environment-variables} + +除了在自已的合約上定義的變數外,還有一些特殊的全域變數。 它們主要用於提供有關區塊鏈或目前交易的資訊。 + +範例: + +| **屬性** | **狀態變數** | **描述** | +| ----------------- | -------- | ----------- | +| `block.timestamp` | uint256 | 目前區塊時期的時間戳 | +| `msg.sender` | address | 訊息發送者(目前調用) | + +## 函數 {#functions} + +用最簡單的術語來說,函數可以取得資訊或者設定資訊來回應傳入的交易。 + +有兩種函數調用方式: + +- `Internal` – 不會建立以太坊虛擬機調用 + - 內部函數和狀態變數只能在內部存取(如在目前合約內部或從其衍生的合約存取) +- `External` – 會建立以太坊虛擬機調用 + - 外部函數是合約介面的一部分,這表示可以從其他合約與透過交易調用。 一個外部函數 `f` 不可以被內部調用(即 `f()` 無法工作,但 `this.f()` 可以)。 + +它們還可以是 `Public` 或 `Private` + +- `public` 函數可以在合約內部調用或者透過訊息在合約外部調用 +- `Private` 函數僅定義它們的合約內部可見,而不會出現在衍生合約中 + +函數和狀態變數都可以被定義為 Public 或 Private + +以下是更新合約狀態變數的函數: + +```solidity +// Solidity 範例 +function update_name(string value) public { + dapp_name = value; +} +``` + +- `String` 類型的參數 `Value` 傳入函數 `update_name` +- 該函數聲明為 `public`,表示任何人都能存取 +- 該函數未聲明為 `view`,因此可以修改合約狀態 + +### 檢視函數 {#view-functions} + +這些函數保證不會修改合約資料的狀態。 常見範例為「getter」函數,例如,你可能用此接收使用者的餘額。 + +```solidity +// Solidity 範例 +function balanceOf(address _owner) public view returns (uint256 _balance) { + return ownerPizzaCount[_owner]; +} +``` + +```python +dappName: public(string) + +@view +@public +def readName() -> string: + return dappName +``` + +以下情況被視為修改狀態: + +1. 寫入狀態變數。 +2. [釋出事件](https://solidity.readthedocs.io/en/v0.7.0/contracts.html#events)。 +3. [建立其他合約](https://solidity.readthedocs.io/en/v0.7.0/control-structures.html#creating-contracts)。 +4. 使用 `selfdestruct` 。 +5. 透過調用傳送以太幣。 +6. 調用任何未標記為 `view` 或 `pure` 的函數。 +7. 使用低階調用。 +8. 使用包含特定作業碼的內嵌組譯碼。 + +### Constructor 函數 {#constructor-functions} + +`constructor` 函數只在首次部署時執行一次。 與許多基於類型之程式語言的 `constructor` 函數類似,這些函數常將狀態變數初始化為指定值。 + +```solidity +// Solidity 示例 +// 初始化合約數據, 設置 `owner`為合約的創建者。 +constructor() public { + // 所有智慧型合約依賴外部交易來觸發其函數。 + // `msg` 是一個全局變量,包含了給定交易的相關數據, + // 例如發送者的地址和交易中包含的ETH數量。 + // 了解更多: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + owner = msg.sender; +} +``` + +```python +# Vyper 範例 + +@external +def __init__(_beneficiary: address, _bidding_time: uint256): + self.beneficiary = _beneficiary + self.auctionStart = block.timestamp + self.auctionEnd = self.auctionStart + _bidding_time +``` + +### 內建函數 {#built-in-functions} + +除了自己合約上定義的變數與函數外,還有一些特殊的內建函數。 最明顯的例子: + +- `address.send()` – Solidity +- `send(address)` – Vyper + +這讓合約可以給其他帳戶傳送以太幣。 + +## 編寫函數 {#writing-functions} + +你的函數需要: + +- 參數變數及其類型(若接受參數) +- 聲明為 internal/external +- 聲明為 pure/view/payable +- 傳回類型(若傳回值) + +```solidity +pragma solidity >=0.4.0 <=0.6.0; + +contract ExampleDapp { + string dapp_name; //state variable + + /*在合約部署時調用以初始化數據*/ + constructor() public{ + dapp_name = "My Example dapp"; + } + + // Get 函數 + function read_name() public view returns(string){ + return dapp_name; + } + + // Set 函數 + function update_name(string value) public { + dapp_name = value; + } +} +``` + +完整的合約看起來可能如上所示。 這裡的 `constructor` 函數為 `dapp_name` 變數提供初始值。 + +## 事件與記錄 {#events-and-logs} + +事件讓你可以透過前端或其他訂閱應用程式與智慧型合約通訊。 執行交易挖礦時,智慧型合約可以釋出事件,並將記錄寫入區塊鏈,讓前端能夠處理。 + +## 附註範例 {#annotated-examples} + +以下是一些用 Solidity 編寫的範例。 若你想試著編寫程式碼,可以在 [Remix](http://remix.ethereum.org) 中與這些範例互動。 + +### Hello world {#hello-world} + +```solidity +// 確定Solidity版本,使用語義化版本。 +// 了解更多:https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.5.10; + +// 定義合約名稱 `HelloWorld`. +// 一個合約是函數和數據 (其狀態) 的集合。 +// 一旦部署,合約就會留在以太坊區塊鏈的一個特定地址上。 +// 了解更多: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + // 定義`string`類型變量 `message` + // 狀態變量是其值永久存儲在合約存儲中的變量。 + // 關鍵字 `public` 使得可以從合約外部訪問。 + // 並創建了一個其它合約或客戶可以調用訪問該值的函數。 + string public message; + + // 類似於很多基於類的面向對象語言, + // 構造函數是僅在合約創建時執行的特殊函數。 + // 構造器用於初始化合約的數據。 + // 了解更多:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) public { + // 接受一個字符變量 `initMessage` + // 並為合約的存儲變量`message` 賦值 + message = initMessage; + } + + // 一個public函數接受字符參數並更新存儲變量 `message` + function update(string memory newMessage) public { + message = newMessage; + } +} +``` + +### 代幣 {#token} + +```solidity +pragma solidity ^0.5.10; + +contract Token { + // 一個 `address` 類比於郵件地址 - 它用來識別以太坊的一個帳戶. + // 地址可以代表一個智慧型合約或一個外部(用戶)帳戶。 + // 了解更多: https://solidity.readthedocs.io/en/v0.5.10/types.html#address + address public owner; + + // `mapping` 是一個哈希表(hash table)數據結構 + // 此 `mapping` 將一個無符號整數 (代幣餘額) 分配給地址 (代幣持有者)。 + // 了解更多: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types + mapping (address => uint) public balances; + +// 事件(Events)允許在區塊鏈上記錄活動。 + // 以太坊客戶端可以監聽事件,以便對合約狀態更改作出反應。 + // 了解更多: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events + event Transfer(address from, address to, uint amount); + + // 初始化合約數據,設置 `owner`為合約創建者的地址。 + constructor() public { + // 所有智慧型合約依賴外部交易來觸發其函數。 + // `msg` 是一個全局變量,包含了給定交易的相關數據, + // 例如發送者的地址和交易中包含的ETH數量。 + // 了解更多: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + owner = msg.sender; + } + + // 創建一些新代幣並發送給一個地址 + function mint(address receiver, uint amount) public { + // `require` 是一個用於強制執行某些條件的控制結構。 + // 如果 `require` 的條件為 `false`, 則異常被觸發, + // 所有在當前調用中對狀態的更改將被還原。 + // 了解更多: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + + // 只有合約的擁有者可以調用這個函數 + require(msg.sender == owner, "You are not the owner."); + + // 保證代幣的最大數量 + require(amount < 1e60, "Maximum issuance succeeded"); + + // 將 `receiver` 持有的代幣數量數量增加 `amount` + balances[receiver] += amount; + } + + // 發送一定數量調用者的代幣給一個地址 + function transfer(address receiver, uint amount) public { + // 發送者必須有足夠數量的代幣用於發送 + require(amount <= balances[msg.sender], "Insufficient balance."); + + // 調整兩個帳戶的餘額 + balances[msg.sender] -= amount; + balances[receiver] += amount; + + // 觸發之前定義的事件。 + emit Transfer(msg.sender, receiver, amount); + } +} +``` + +### 獨特的數位資產 {#unique-digital-asset} + +```solidity +pragma solidity ^0.5.10; + +// 從其它文件向當前合約中導入符號 +// 本例使用一系列來自OpenZeppelin的輔助合約. +// 了解更多: 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.sol"; +import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol"; +import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol"; + +// `is` 關鍵字用於從其它外部合約繼承函數和關鍵字。 +// 本例中, `CryptoPizza` 繼承 `IERC721` 和 `ERC165` 合約. +// 了解更多: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance +contract CryptoPizza is IERC721, ERC165 { + // 使用 OpenZeppelin's SafeMath 庫來安全執行算數操作。 + // 了解更多: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath + using SafeMath for uint256; + + //Solidity語言中的常量(Constant)狀態變量與其他語言類似。 + // 但是必須用一個表達式為常量賦值,而這個表達式本身必須在編譯時是一個常量。 + // Learn more: 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 + struct Pizza { + string name; + uint256 dna; + } + + // Creates an empty array of Pizza structs + Pizza[] public pizzas; + + // Mapping from pizza ID to its owner's address + mapping(uint256 => address) public pizzaToOwner; + + // Mapping from owner's address to number of owned token + mapping(address => uint256) public ownerPizzaCount; + + // Mapping from token ID to approved address + mapping(uint256 => address) pizzaApprovals; + + // You can nest mappings, this example maps owner to operator approvals + mapping(address => mapping(address => bool)) private operatorApprovals; + + // Internal function to create a random Pizza from string (name) and 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 + 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(_name, _dna) + { + // Adds Pizza to array of Pizzas and get 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 + + // note that address(0) is the zero address, + // indicating that pizza[id] is not yet allocated to a particular user. + + assert(pizzaToOwner[id] == address(0)); + + // Maps the Pizza to the owner + pizzaToOwner[id] = msg.sender; + ownerPizzaCount[msg.sender] = SafeMath.add( + ownerPizzaCount[msg.sender], + 1 + ); + } + + // Creates a random Pizza from string (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) + 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 + pure + returns (uint256) + { + // Generates random uint from string (name) + address (owner) + uint256 rand = uint256(keccak256(abi.encodePacked(_str))) + + uint256(_owner); + rand = rand % dnaModulus; + return rand; + } + + // Returns array of Pizzas found by owner + 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 + view + returns (uint256[] memory) + { + // Uses the `memory` storage location to store values only for the + // lifecycle of this function call. + // 了解更多: 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++) { + if (pizzaToOwner[i] == _owner) { + result[counter] = i; + counter++; + } + } + return result; + } + + // 轉移 Pizza 和歸屬關係到其它地址 + 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."); + + ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1); + ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1); + pizzaToOwner[_pizzaId] = _to; + + // 觸發繼承自 IERC721 合約中定義的事件。 + emit Transfer(_from, _to, _pizzaId); + _clearApproval(_to, _pizzaId); + } + + /** + * 安全轉帳給定代幣 ID 的所有權到其它地址 + * 如果目標地址是一個合約,則該合約必須實現 `onERC721Received`函數, + * 該函數調用了安全轉帳並且返回一個magic value。 + * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; + * 否則, 轉帳被回退. + */ + function safeTransferFrom(address from, address to, uint256 pizzaId) + public + { + // solium-disable-next-line arg-overflow + this.safeTransferFrom(from, to, pizzaId, ""); + } + + /** + * 安全轉帳給定代幣ID所有權到其它地址 + * 如果目標地址是一個合約,則該合約必須實現`onERC721Received`函數, + * 該函數調用安全轉帳並返回一個magic value + * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; + * 否則,轉帳被回退. + */ + function safeTransferFrom( + address from, + address to, + uint256 pizzaId, + bytes memory _data + ) public { + this.transferFrom(from, to, pizzaId); + require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received."); + } + + /** + * Internal function to invoke `onERC721Received` on a target address + * The call is not executed if the target address is not a contract + */ + function _checkOnERC721Received( + address from, + address to, + uint256 pizzaId, + bytes memory _data + ) internal returns (bool) { + if (!isContract(to)) { + return true; + } + + bytes4 retval = IERC721Receiver(to).onERC721Received( + msg.sender, + from, + pizzaId, + _data + ); + 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 + 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."); + + ownerPizzaCount[msg.sender] = SafeMath.sub( + ownerPizzaCount[msg.sender], + 1 + ); + pizzaToOwner[_pizzaId] = address(0); + } + + // Returns count of Pizzas by address + function balanceOf(address _owner) public view returns (uint256 _balance) { + return ownerPizzaCount[_owner]; + } + + // Returns owner of the Pizza found by id + function ownerOf(uint256 _pizzaId) public view returns (address _owner) { + address owner = pizzaToOwner[_pizzaId]; + require(owner != address(0), "Invalid Pizza ID."); + return owner; + } + + // Approves other address to transfer ownership of Pizza + function approve(address _to, uint256 _pizzaId) public { + require(msg.sender == pizzaToOwner[_pizzaId], "Must be the Pizza owner."); + pizzaApprovals[_pizzaId] = _to; + emit Approval(msg.sender, _to, _pizzaId); + } + + // Returns approved address for specific Pizza + function getApproved(uint256 _pizzaId) + public + view + returns (address operator) + { + require(_exists(_pizzaId), "Pizza does not exist."); + 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 + */ + function _clearApproval(address owner, uint256 _pizzaId) private { + require(pizzaToOwner[_pizzaId] == owner, "Must be pizza owner."); + require(_exists(_pizzaId), "Pizza does not exist."); + 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 + */ + function setApprovalForAll(address to, bool approved) public { + require(to != msg.sender, "Cannot approve own address"); + operatorApprovals[msg.sender][to] = approved; + emit ApprovalForAll(msg.sender, to, approved); + } + + // Tells whether an operator is approved by a given owner + function isApprovedForAll(address owner, address operator) + public + view + returns (bool) + { + return operatorApprovals[owner][operator]; + } + + // Takes ownership of Pizza - only for approved users + function takeOwnership(uint256 _pizzaId) public { + require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved."); + address owner = this.ownerOf(_pizzaId); + this.transferFrom(owner, msg.sender, _pizzaId); + } + + // Checks if Pizza exists + 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 + function _isApprovedOrOwner(address spender, uint256 pizzaId) + internal + view + returns (bool) + { + address owner = pizzaToOwner[pizzaId]; + // Disable solium check because of + // https://github.com/duaraghav8/Solium/issues/175 + // solium-disable-next-line operator-whitespace + return (spender == owner || + this.getApproved(pizzaId) == spender || + this.isApprovedForAll(owner, spender)); + } + + // Check if Pizza is unique and doesn't exist yet + modifier isUnique(string memory _name, uint256 _dna) { + bool result = true; + for (uint256 i = 0; i < pizzas.length; i++) { + if ( + keccak256(abi.encodePacked(pizzas[i].name)) == + keccak256(abi.encodePacked(_name)) && + pizzas[i].dna == _dna + ) { + result = false; + } + } + require(result, "Pizza with such name already exists."); + _; + } + + // Returns whether the target address is a contract + 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. + // 參閱 https://ethereum.stackexchange.com/a/14016/36603 + // 了解更多信息. + // TODO: 在Serenity發布前再次檢查這裡, + // 否則到時所有地址都將判斷為合約. + // solium-disable-next-line security/no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } +} +``` + +## 衍生閱讀 {#further-reading} + +請參閱 Solidity 和 Vyper 文件,獲得智慧型合約更完整的概觀: + +- [Solidity](https://solidity.readthedocs.io/) +- [Vyper](https://vyper.readthedocs.io/) + +## 相關主題 {#related-topics} + +- [智慧型合約](/developers/docs/smart-contracts/) +- [以太坊虛擬機](/developers/docs/evm/) + +## 相關教程 {#related-tutorials} + +- [縮減合約大小應對合約大小限制](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– 減少智慧型合約大小的實用秘訣。_ +- [用事件記錄智慧型合約資料](/developers/tutorials/logging-events-smart-contracts/) _ – 對智慧型合約事件進行介紹,以及如何使用事件來記錄資料。_ +- [與其他 Solidity 合約互動](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– 如何從現有合約部署智慧型合約並與之互動。_ diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/compiling/index.md new file mode 100644 index 00000000000..9b830da34b9 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/compiling/index.md @@ -0,0 +1,278 @@ +--- +title: 編譯智慧型合約 +description: 說明為什麼需要編譯智慧型合約以及編譯的實際作用。 +lang: zh-tw +incomplete: true +--- + +你需要以網頁應用程式和以太坊虛擬機 (EVM) 能夠理解的方式編譯合約。 + +## 基本資訊 {#prerequisites} + +在閱讀關於編譯的文章前,先閱讀[智慧型合約](/developers/docs/smart-contracts/)及[以太坊虛擬機](/developers/docs/evm/)簡介可能對你有幫助。 + +## 以太坊虛擬機 {#the-evm} + +若要讓[以太坊虛擬機](/developers/docs/evm/)能執行你的合約,合約需要以**位元組碼**格式編譯。 編譯會將以下程式碼: + +```solidity +pragma solidity 0.4.24; + +contract Greeter { + + function greet() public constant returns (string) { + return "Hello"; + } + +} +``` + +**轉換成:** + +``` +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 +``` + +## Web 應用程式 {#web-applications} + +編譯器還會生成**應用程式二進制介面 (ABI)**,你需要藉此讓應用程式理解你的合約,並調用合約函數。 + +ABI 是一個 JSON 格式檔案,描述了被部署的合約及其智慧型合約函數。 這有助於彌合 Web2 和 Web3 之間的差距 + +[JavaScript 用戶端庫](/developers/docs/apis/javascript/)會讀取**應用程式二進制介面**,以便你在你的 Web 應用程式介面中調用智慧型合約。 + +以下是 ERC-20 代幣合約的應用程式二進制介面。 ERC-20 是你可以在以太坊上交易的一種代幣。 + +```json +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } +] +``` + +## 衍生閱讀 {#further-reading} + +- [應用程式二進制介面規範](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ + +## 相關主題 {#related-topics} + +- [JavaScript 用戶端庫](/developers/docs/apis/javascript/) +- [以太坊虛擬機](/developers/docs/evm/) diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/deploying/index.md new file mode 100644 index 00000000000..ea4335a0107 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/deploying/index.md @@ -0,0 +1,74 @@ +--- +title: 部署智慧型合約 +description: +lang: zh-tw +--- + +你需要部署智慧型合約,以供以太坊網路使用者使用。 + +要部署智慧型合約,只需要傳送一個包含編譯後智慧型合約程式碼的以太坊交易,而無須指定任何接收者。 + +## 基本資訊 {#prerequisites} + +在部署智慧型合約前,你需要理解[以太坊網路](/developers/docs/networks/)、[交易](/developers/docs/transactions/)與[智慧型合約結構](/developers/docs/smart-contracts/anatomy/)。 + +部署合約同樣需要花費以太幣 (ETH),因為合約會儲存在區塊鏈上,所以你應該熟悉以太坊的[燃料與手續費](/developers/docs/gas/)。 + +最後,你需要在部署前編譯合約,所以請確保你已閱讀[編譯智慧型合約](/developers/docs/smart-contracts/compiling/)。 + +## 如何部署智慧型合約 {#how-to-deploy-a-smart-contract} + +### 需要準備: {#what-youll-need} + +- 合約的位元組碼是透過[編譯](/developers/docs/smart-contracts/compiling/)產生的 +- 可作為燃料的以太幣 – 像其他交易一樣,你需要設定燃料限制,所以請注意合約部署需要比簡單的以太幣傳送花費更多燃料 +- 一個部署腳本或外掛程式 +- 存取[以太坊節點](/developers/docs/nodes-and-clients/),你可以透過執行自己的節點、連結公共節點,或透過應用程式介面金鑰使用[節點服務](/developers/docs/nodes-and-clients/nodes-as-a-service/)來存取。 + +### 部署智慧型合約的步驟 {#steps-to-deploy} + +The specific steps involved will depend on the development framework in question. For example, you can check out [Hardhat's documentation on deploying your contracts](https://hardhat.org/guides/deploying.html) or [Foundry's documentation on deploying and verifying a smart contract](https://book.getfoundry.sh/forge/deploying). Once deployed, your contract will have an Ethereum address like other [accounts](/developers/docs/accounts/) and can be verified using [source code verification tools](/developers/docs/smart-contracts/verifying/#source-code-verification-tools). + +## 相關工具 {#related-tools} + +**Remix - _Remix 整合開發環境允許開發、部署和管理類似區塊鏈的以太坊智慧型合約_** + +- [Remix](https://remix.ethereum.org) + +**Tenderly - _Web3 開發平台,提供了開發、測試、監控和營運智慧型合約所需的偵錯、可觀察性和基礎架構組件_** + +- [tenderly.co](https://tenderly.co/) +- [文件](https://docs.tenderly.co/) +- [Github](https://github.com/Tenderly) +- [Discord](https://discord.gg/eCWjuvt) + +**Hardhat - _用於編譯、部署、測試和偵錯以太坊軟體的開發環境_** + +- [hardhat.org](https://hardhat.org/getting-started/) +- [合約部署文件](https://hardhat.org/guides/deploying.html) +- [Github](https://github.com/nomiclabs/hardhat) +- [Discord](https://discord.com/invite/TETZs2KK4k) + +**Web3 - _使用一條指令輕鬆部署任何合約至任何與以太坊虛擬機相容的區塊鏈_** + +- [文件](https://portal.thirdweb.com/deploy/) + +## 相關教程 {#related-tutorials} + +- [部署你的第一個智慧型合約](/developers/tutorials/deploying-your-first-smart-contract/)_ – 如何在以太坊測試網部署你的第一個智慧型合約。_ +- [Hello World | 智慧型合約使用教學](/developers/tutorials/hello-world-smart-contract/) _ – 在以太坊建立與部署基本智慧型合約的簡單使用教學。_ +- [與其他 Solidity 合約互動](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– 如何從現有合約部署智慧型合約並與之互動。_ +- [如何壓縮智慧型合約大小](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/)_ - 如何壓縮智慧型合約大小至限制以下來降低燃料費_ + +## 衍生閱讀 {#further-reading} + +- [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) - _OpenZeppelin_ +- [利用 Hardhat 來部署合約](https://hardhat.org/guides/deploying.html) - _Nomic Labs_ + +_認識社區或社團資源能幫助大家學習更多? 歡迎自由編輯或添加於本頁!!_ + +## 相關主題 {#related-topics} + +- [開發架構](/developers/docs/frameworks/) +- [運行一Ethereum節點](/developers/docs/nodes-and-clients/run-a-node/) +- [節點即服務](/developers/docs/nodes-and-clients/nodes-as-a-service) diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/index.md new file mode 100644 index 00000000000..bf93b0f7115 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/index.md @@ -0,0 +1,111 @@ +--- +title: 智慧型合約簡介 +description: 智慧型合約概觀,重點介紹其特點及限制。 +lang: zh-tw +--- + +## 智慧型合約是什麼? {#what-is-a-smart-contract} + +「智慧型合約」就是在以太坊區塊鏈上執行的程式。 這是一系列存在於以太坊區塊鏈特定地址的程式碼(函數)及資料(狀態)。 + +智慧型合約是一種[以太坊帳戶](/developers/docs/accounts/)。 這表示智慧型合約有餘額且能作為交易目標。 然而,智慧型合約不受使用者控制,而是部署至網路,並按程式編寫方式執行。 使用者帳戶能藉由傳送交易,執行智慧型合約定義的函數,來與智慧型合約互動。 智慧型合約能定義規則,就像一般合約一樣,且完全透過程式碼自動執行。 預設情況下,智慧型合約無法刪除,且與其互動的結果無法逆轉。 + +## 基本資訊 {#prerequisites} + +如果你是初學者,或是想找不技術性不太強的說明,推薦你參閱[智慧型合約簡介](/smart-contracts/)。 + +務必先詳閱[帳戶](/developers/docs/accounts/)、[交易](/developers/docs/transactions/)及[以太坊虛擬機](/developers/docs/evm/)後再踏入智慧型合約的世界。 + +## 數位販賣機 {#a-digital-vending-machine} + +或許最適合智慧型合約的比喻是 [Nick Szabo](https://unenumerated.blogspot.com/) 所說的「販賣機」。 只要輸入正確,就保證能得到特定的輸出結果。 + +要從販賣機取得一包點心: + +``` +錢 + 點心選擇 = 點心分發 +``` + +這種邏輯會編寫進販賣機中。 + +而智慧型合約就像販賣機,其中編寫了邏輯。 以下是若使用 Solidity 編寫智慧型合約,這種販賣機運作方式的簡要範例: + +```solidity +pragma solidity 0.8.7; + +contract VendingMachine { + + // Declare state variables of the contract + address public owner; + mapping (address => uint) public cupcakeBalances; + + // When 'VendingMachine' contract is deployed: + // 1. set the deploying address as the owner of the contract + // 2. set the deployed smart contract's cupcake balance to 100 + constructor() { + owner = msg.sender; + cupcakeBalances[address(this)] = 100; + } + + // Allow the owner to increase the smart contract's cupcake balance + function refill(uint amount) public { + require(msg.sender == owner, "Only the owner can refill."); + cupcakeBalances[address(this)] += amount; + } + + // Allow anyone to purchase cupcakes + 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"); + cupcakeBalances[address(this)] -= amount; + cupcakeBalances[msg.sender] += amount; + } +} +``` + +如同自動販賣機消除了我們對販賣員工的需求,智慧型合約也可取代許多產業的中間媒介。 + +## 無需許可 {#permissionless} + +任何人都能編寫智慧型合約並部署於區塊鏈網路。 你只需要學習如何使用[智慧型合約語言](/developers/docs/smart-contracts/languages/)編碼,並取得足夠的以太幣,即可部署合約。 部署合約基本上是一種交易,因此你需要支付[燃料](/developers/docs/gas/)費用,如同進行簡單的以太幣轉帳一樣。 然而,部署合約的燃料成本卻遠高於此。 + +以太坊具備方便開發者編寫智慧型合約的程式語言: + +- Solidity +- Vyper + +[深入瞭解程式語言](/developers/docs/smart-contracts/languages/) + +然而,在部署合約前需要先編譯,讓以太坊的虛擬機可以解譯並儲存合約。 [深入瞭解編譯](/developers/docs/smart-contracts/compiling/) + +## 可組合性 {#composability} + +智慧型合約公開於以太坊, 類似一API於網路. 這表示你可以在自己的智慧型合約中,調用其他智慧型合約,以大幅拓展可能性。 合約甚至能部署其他合約。 + +深入瞭解[智慧型合約的可組合性](/developers/docs/smart-contracts/composability/)。 + +## 限制 {#limitations} + +智慧型合約本身無法取得「真實世界」事件的資訊,因為這些合約無法擷取鏈外來源中的資料。 這表示智慧型合約不會針對真實世界的事件做出反應。 這是刻意設計。 過度依賴外部資訊可能會破壞共識機制,而共識對安全性與去中心化至關重要。 + +然而,區塊鏈應用程式最好能使用鏈外資料。 解決方法是使用[預言機](/developers/docs/oracles/),這種工具可以取得鏈外資料並提供給智慧型合約使用。 + +智慧型合約的另一個限制為合約大小的上限。 智慧型合約必須小於 24KB,不然燃料不足。 可以透過[鑽石模式](https://eips.ethereum.org/EIPS/eip-2535)迴避此問題。 + +## 多簽合約 {#multisig} + +多簽(多重簽章)合約是需要多個有效簽章,才能執行交易的智慧型合約帳戶。 這能有效預防持有大量以太幣或代幣的合約發生單點失效。 多簽合約也能將執行合約與金鑰管理的責任分散給多方,避免遺失單一私密金鑰造成資金無法回復的損失。 基於上述理由,多簽合約可用於簡單的去中心化組織管理體系。 多簽需要在 M 個可接受的簽章中取得 N 個簽章才能執行(其中,N ≤ M 且 M > 1)。 通常是`N = 3, M = 5` 以及 `N = 4, M = 7`。 4/7 的多簽需要在七個可能的有效簽章中取得四個簽章。 這表示即便遺失三個簽章,仍可取回資金。 在這種情況下,這也表示大多數金鑰持有者必須同意並簽署,才能執行合約。 + +## 智慧型合約資源 {#smart-contract-resources} + +**OpenZeppelin Contracts -** **_開發安全智慧型合約的資料庫。_** + +- [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) +- [Github](https://github.com/OpenZeppelin/openzeppelin-contracts) +- [社群論壇](https://forum.openzeppelin.com/c/general/16) + +## 衍生閱讀 {#further-reading} + +- [Coinbase:什麼是智慧型合約?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) +- [Chainlink:什麼是智慧型合約?](https://chain.link/education/smart-contracts) +- [影片:智慧型合約簡介](https://youtu.be/ZE2HxTmxfrI) diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/languages/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/languages/index.md new file mode 100644 index 00000000000..4ba4bbc7959 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/languages/index.md @@ -0,0 +1,321 @@ +--- +title: 智慧型合約語言 +description: Solidity 及 Vyper:兩種智慧型合約常用語言的概觀與比較。 +lang: zh-tw +--- + +以太坊一大好處是,對開發者而言,編寫智慧型合約的語言相對簡單。 如你熟悉 Python 或任何[大括號語言](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages),會發現其實他們的語法非常相似。 + +兩種最熱門、最受管理的語言為: + +- Solidity +- Vyper + +經驗更豐富的開發者可能也會想使用 Yul,這是[以太坊虛擬機](/developers/docs/evm/)的中階語言,或是使用 Yul 的延伸語言 Yul+。 + +若你有興趣,且想協助測試還處於大力開發階段的新語言,可以實驗仍在發展初期的新興智慧型合約語言 Fe。 + +## 基本資訊 {#prerequisites} + +如果已經有編程語言的知識,特別是 JavaScript 或 Python,可以幫助你瞭解智慧型合約語言的差異。 同時,我們建議你在深入理解語言差異之前,先理解智慧型合約的概念。 [智慧型合約簡介](/developers/docs/smart-contracts/)。 + +## Solidity {#solidity} + +- 實作智慧型合約的物件導向高階語言。 +- 深受 C++ 語言影響的大括號語言。 +- 靜態類型(編譯時已知變數類型)。 +- 支援: + - 繼承(你可以延展其他合約)。 + - 資料庫(你可以建立能從不同的合約調用的可重複使用代碼,如同其他物件導向程式語言中的靜態類別靜態函數)。 + - 複雜的使用者定義類型。 + +### 重要連結 {#important-links} + +- [文件](https://docs.soliditylang.org/en/latest/) +- [Solidity 語言入口網站](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/) 橋接 [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [懶人包](https://reference.auditless.com/cheatsheet) +- [Solidity 部落格](https://blog.soliditylang.org/) +- [Solidity Twitter](https://twitter.com/solidity_lang) + +### 合約範例 {#example-contract} + +```solidity +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >= 0.7.0; + +contract Coin { + // 關鍵字 "public" 使變量可以被其它合約訪問 + address public minter; + mapping (address => uint) public balances; + + // 事件Events允許客戶讀取你聲明的特定合約變更。 + event Sent(address from, address to, uint amount); + + // Constructor構造代碼僅在合約創建時執行一次。 + constructor() { + minter = msg.sender; + } + + // 發送一定數量新創建的代幣到某個地址。 + // 只有合約創建者可以調用。 + function mint(address receiver, uint amount) public { + require(msg.sender == minter); + require(amount < 1e60); + balances[receiver] += amount; + } + + // 發送一定量已經存在的代幣 + // 從調用者到任意地址 + function send(address receiver, uint amount) public { + require(amount <= balances[msg.sender], "Insufficient balance."); + balances[msg.sender] -= amount; + balances[receiver] += amount; + emit Sent(msg.sender, receiver, amount); + } +} +``` + +這個範例應該能讓你瞭解 Solidity 的合約語法。 關於函數和變數的詳細描述,[請參閱文件](https://docs.soliditylang.org/en/latest/contracts.html)。 + +## Vyper {#vyper} + +- Python 程式語言 +- 強輸入類型 +- 精巧易懂的編譯器代碼 +- 有效率的產生位元組碼 +- 為了提升合約安全性並更容易審核,特意提供比 Solidity 更少功能。 Vyper 不支援: + - 修飾符 + - 繼承 + - 內嵌組譯碼 + - 函數重載 + - 運算子重載 + - 遞迴調用 + - 無限長度迴圈 + - 二進制定點 + +如需更多資訊,[請參閱 Vyper 原理](https://vyper.readthedocs.io/en/latest/index.html)。 + +### 重要鏈結 {#important-links-1} + +- [文件](https://vyper.readthedocs.io) +- [Vyper by Example](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) +- [更多 Vyper by Example](https://vyper-by-example.org/) +- [Github](https://github.com/vyperlang/vyper) +- [Vyper 社群 Discord 聊天](https://discord.gg/SdvKC79cJk) +- [懶人包](https://reference.auditless.com/cheatsheet) +- [Vyper 的智慧型合約開發框架與工具](/developers/docs/programming-languages/python/) +- [VyperPunk:瞭解如何保障與駭客攻擊 Vyper 智慧型合約](https://github.com/SupremacyTeam/VyperPunk) +- [VyperExamples:Vyper 漏洞範例](https://www.vyperexamples.com/reentrancy) +- [支援開發的 Vyper Hub](https://github.com/zcor/vyper-dev) +- [Vyper 最熱門的智慧型合約範例](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) +- [出色的 Vyper 精選資源](https://github.com/spadebuilders/awesome-vyper) + +### 範例 {#example} + +```python +# Open Auction + +# Auction params +# Beneficiary receives money from the highest bidder +beneficiary: public(address) +auctionStart: public(uint256) +auctionEnd: public(uint256) + +# Current state of auction +highestBidder: public(address) +highestBid: public(uint256) + +# Set to true at the end, disallows any change +ended: public(bool) + +# Keep track of refunded bids so we can follow the withdraw pattern +pendingReturns: public(HashMap[address, uint256]) + +# Create a simple auction with `_bidding_time` +# seconds bidding time on behalf of the +# beneficiary address `_beneficiary`. +@external +def __init__(_beneficiary: address, _bidding_time: uint256): + self.beneficiary = _beneficiary + self.auctionStart = block.timestamp + self.auctionEnd = self.auctionStart + _bidding_time + +# Bid on the auction with the value sent +# together with this transaction. +# The value will only be refunded if the +# auction is not won. +@external +@payable +def bid(): + # Check if bidding period is over. + assert block.timestamp < self.auctionEnd + # Check if bid is high enough + assert msg.value > self.highestBid + # Track the refund for the previous high bidder + self.pendingReturns[self.highestBidder] += self.highestBid + # Track new high bid + self.highestBidder = msg.sender + self.highestBid = msg.value + +# Withdraw a previously refunded bid. The withdraw pattern is +# used here to avoid a security issue. If refunds were directly +# sent as part of bid(), a malicious bidding contract could block +# those refunds and thus block new higher bids from coming in. +@external +def withdraw(): + pending_amount: uint256 = self.pendingReturns[msg.sender] + self.pendingReturns[msg.sender] = 0 + send(msg.sender, pending_amount) + +# End the auction and send the highest bid +# to the beneficiary. +@external +def endAuction(): + # It is a good guideline to structure functions that interact + # with other contracts (i.e. they call functions or send ether) + # into three phases: + # 1. checking conditions + # 2. performing actions (potentially changing conditions) + # 3. interacting with other contracts + # If these phases are mixed up, the other contract could call + # back into the current contract and modify the state or cause + # effects (ether payout) to be performed multiple times. + # If functions called internally include interaction with external + # contracts, they also have to be considered interaction with + # external contracts. + + # 1. Conditions + # Check if auction endtime has been reached + assert block.timestamp >= self.auctionEnd + # Check if this function has already been called + assert not self.ended + + # 2. Effects + self.ended = True + + # 3. Interaction + send(self.beneficiary, self.highestBid) +``` + +此範例應該能讓你瞭解 Solidity 的合約語法。 關於函數和變數的詳細描述,[請參閱文件](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction)。 + +## Yul 和 Yul+ {#yul} + +如果你是以太坊新手並且尚未使用過智慧型合約語言編碼,建議你從 Solidity 或 Vyper 開始。 只有在你熟悉智慧型合約安全性最佳案例和使用以太坊虛擬機的具體細節後,才可投入 Yul 或 Yul+。 + +**Yul** + +- 以太坊的中階語言。 +- 支援[以太坊虛擬機](/developers/docs/evm)和 [eWASM](https://github.com/ewasm),一種以太坊風格的 WebAssembly,目的在於成為兩個平台均可使用的通用工具。 +- 高級最佳化階段的優良目標,能使以太坊虛擬機和 eWASM 平台均等受益。 + +**Yul+** + +- Yul 的低階高效延伸語言。 +- 最初設計用於[樂觀卷軸](/developers/docs/scaling/optimistic-rollups/)合約。 +- Yul+ 可以被視為 Yul 的實驗性升級建議,為其添加新功能。 + +### 重要鏈結 {#important-links-2} + +- [Yul 文件](https://docs.soliditylang.org/en/latest/yul.html) +- [Yul+ 文件](https://github.com/fuellabs/yulp) +- [Yul+ 訓練場](https://yulp.fuel.sh/) +- [Yul+ 介紹文章](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f) + +### 合約範例 {#example-contract-2} + +以下簡單範例採用冪函數。 它可以使用 `solc --strict-assembly --bin input.yul` 編譯。 這個範例應該 儲存在 input.yul 檔案中。 + +``` +{ + function power(base, exponent) -> result + { + switch exponent + case 0 { result := 1 } + case 1 { result := base } + default + { + result := power(mul(base, base), div(exponent, 2)) + if mod(exponent, 2) { result := mul(base, result) } + } + } + let res := power(calldataload(0), calldataload(32)) + mstore(0, res) + return(0, 32) +} +``` + +如果你已經熟悉智慧型合約,可以在[此處](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example)找到 Yul 言語的完整 ERC20 實作。 + +## Fe {#fe} + +- 用於以太坊虛擬機 (EVM) 的靜態類型語言。 +- 受 Python 和 Rust 所啟發。 +- 目標是讓以太坊生態系統的新手開發者,都能輕鬆學習這門語言。 +- Fe 還處於早期開發階段,其 Alpha 版本於 2021 年 1 月推出。 + +### 重要鏈結 {#important-links-3} + +- [Github](https://github.com/ethereum/fe) +- [Fe 發布聲明](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) +- [Fe 2021 開發藍圖](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [Fe Discord 聊天室](https://discord.com/invite/ywpkAXFjZH) +- [Fe Twitter](https://twitter.com/official_fe) + +### 合約範例 {#example-contract-3} + +以下為採用 Fe 的簡單合約。 + +``` +type BookMsg = bytes[100] + +contract GuestBook: + pub guest_book: map + + event Signed: + book_msg: BookMsg + + pub def sign(book_msg: BookMsg): + self.guest_book[msg.sender] = book_msg + + emit Signed(book_msg=book_msg) + + pub def get_msg(addr: address) -> BookMsg: + return self.guest_book[addr].to_mem() + +``` + +## 如何選擇 {#how-to-choose} + +與任何其他編程語言一樣,重點在於根據合適的工作與個人偏好選擇正確工具。 + +如果你還沒有嘗試過任何一種語言,請考慮以下幾點: + +### Solidity 的優點是什麼? {#solidity-advantages} + +- 如果你是初學者,有不少使用教學和學習工具。 在[透過編碼學習](/developers/learning-tools/)部分瞭解更多相關資訊。 +- 提供優良的開發者工具。 +- Solidity 擁有龐大的開發者社群,這表示你很可能會很快找到問題的答案。 + +### Vyper 的優點是什麼? {#vyper-advatages} + +- 適合想要編寫智慧型合約的 Python 開發者入門。 +- Vyper 的功能較少,因此非常適合快速製作創意原型。 +- Vyper 的目的是容易審查並盡可能提高人類可讀性。 + +### Yul 和 Yul+ 的優點是什麼? {#yul-advantages} + +- 簡單而實用的低階語言。 +- 允許更接近原始以太坊虛擬機,有助於最佳化合約的燃料使用量。 + +## 語言比較 {#language-comparisons} + +如需瞭解基本語法比較、合約生命週期、介面、運算子、數據結構、功能、控制流程等資訊,請參閱[由 Auditless 編寫的懶人包](https://reference.auditless.com/cheatsheet/) + +## 衍生閱讀 {#further-reading} + +- [OpenZeppelin 的 Solidity 合約資料庫](https://docs.openzeppelin.com/contracts) +- [Solidity 範例](https://solidity-by-example.org) diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md new file mode 100644 index 00000000000..c7df82341e8 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/libraries/index.md @@ -0,0 +1,117 @@ +--- +title: 智慧型合約庫 +description: +lang: zh-tw +--- + +你無需從頭開始編寫專案中的每一個智慧型合約。 因為我們有許多開放原始碼智慧型合約庫可為你的專案提供可重複利用的組件,因此你不必從零開始。 + +## 基本資訊 {#prerequisites} + +在使用智慧型合約庫之前,最好先清楚瞭解智慧型合約的結構。 如果尚未完成,請前往[智慧型合約結構](/developers/docs/smart-contracts/anatomy/)。 + +## 庫的內容 {#whats-in-a-library} + +你通常可以在智慧型合約庫中找到兩種組件:可以添加到合約的可重複使用行為,與採納的各種標準。 + +### 行為 {#behaviors} + +編寫智慧型合約時,你很可能會發現自己在重複編寫類似代碼。比如說在合約中指派一個_管理員_地址執行受保護的操作;或添加一個緊急_暫停_按鈕以應對預料之外的問題。 + +智慧型合約庫通常透過[庫](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries)或在Solidity 中[繼承](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance),讓這些行為可以重複使用。 + +例如,以下是[OpenZepelin Contracts 資料庫](https://github.com/OpenZeppelin/openzeppelin-contracts)的 [`Ownable` 合約](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol)簡化版,此合約指定了合約擁有者的地址,並提供將存取方法限制為只有擁有者可存取的修飾符。 + +```solidity +contract Ownable { + address public owner; + + constructor() internal { + owner = msg.sender; + } + + modifier onlyOwner() { + require(owner == msg.sender, "Ownable: caller is not the owner"); + _; + } +} +``` + +若要在你的合約中使用這種組件,首先要匯入,再於自己的合約中擴充。 這會允許你使用基礎 `Ownable` 合約提供的修飾符來保護函數 + +```solidity +import ".../Ownable.sol"; // Path to the imported library + +contract MyContract is Ownable { + // The following function can only be called by the owner + function secured() onlyOwner public { + msg.sender.transfer(1 ether); + } +} +``` + +另一個比較受歡迎的例子是 [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) 或 [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html)。 這些庫(與基礎合約不同)提供了語言本身不具備的溢出檢查算術函數。 使用這些庫而非原生算術運算可以防止合約出現溢出,這類錯誤可能導致災難性後果! + +### 標準 {#standards} + +為了促進[可組合性和互通性](/developers/docs/smart-contracts/composability/),以太坊社群已使用**以太坊意見徵求**的形式定義了幾個標準。 你可以在[標準](/developers/docs/standards/)部分閱讀更多相關資訊。 + +將以太坊意見徵求納入合約時,更好的做法是尋找標準實作,而非嘗試推出自己的方式。 許多智慧型合約庫包含採用最熱門 ERC 標準的做法。 例如,[ERC20 可互換代幣標準](/developers/tutorials/understand-the-erc-20-token-smart-contract/)可在 [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md)、[DappSys](https://github.com/dapphub/ds-token/) 和 [OpenZepelin](https://docs.openzeppelin.com/contracts/3.x/erc20) 中找到。 此外,一些以太坊意見徵求也提供作為以太坊意見徵求本身一部分的規範實作。 + +值得一提的是,一些以太坊意見徵求並非獨立的,而是對其他以太坊意見徵求的補充。 例如,[ERC2612](https://eips.ethereum.org/EIPS/eip-2612) 拓展了 ERC20,提高其可用性。 + +## 如何新增庫 {#how-to} + +務必參考你要納入的庫文件,以掌握如何將其納入專案的具體說明。 有些 Solidity 合約庫使用 `npm` 來封裝,所以你可以直接透過 `npm install`。 大多數[編譯](/developers/docs/smart-contracts/compiling/)合約的工具會在你的 `node_modules` 中尋找智慧型合約庫,所以你可以執行: + +```solidity +// This will load the @openzeppelin/contracts library from your node_modules +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +contract MyNFT is ERC721 { + constructor() ERC721("MyNFT", "MNFT") public { } +} +``` + +無論使用哪種方法,納入庫時,務必留意[程式語言](/developers/docs/smart-contracts/languages/)的版本。 例如,如果你使用 Solidity 0.5 編寫合約,就不能使用 Solidity 0.6 庫。 + +## 使用時機 {#when-to-use} + +在你的專案使用智慧型合約庫有幾個好處。 首先,這提供了現成的組件,可以納入你的系統,而不必自己編寫程式碼,從而節省時間。 + +安全性也是一個重要的優點。 開放原始碼智慧型合約庫也經常接受嚴格審查。 鑑於許多專案都依賴它們,社群有強烈動機加以持續審查。 在應用程式代碼中比起可重複使用的合約庫更容易發現錯誤。 有些庫甚至接受[外部審核](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audit),以提高安全性。 + +然而,使用智慧型合約庫可能將你不熟悉的程式碼納入專案。 我們會想匯入合約,並將其直接納入專案,但若未充分理解該合約的作用,可能會由於意外行為,而無意中在系統中引入問題。 務必參閱要匯入的程式碼文件,然後在納入專案前審查程式碼! + +最後,在決定是否納入庫時,要考慮其總體使用情況。 獲得廣泛採用的資料庫,好處在於有取得更廣大的社群和關注來審視問題。 在建立智慧型合約時,安全性應為首要考量! + +## 相關工具 {#related-tools} + +**OpenZeppelin Contracts:** **_最熱門的智慧型合約開發資料庫。 _** + +- [文件](https://docs.openzeppelin.com/contracts/) +- [Github](https://github.com/OpenZeppelin/openzeppelin-contracts) +- [社群論壇](https://forum.openzeppelin.com/c/general/16) + +**DappSys:****_安全、簡單、靈活的智慧型合約建置組件。_** + +- [文件檔案](https://dappsys.readthedocs.io/) +- [Github](https://github.com/dapphub/dappsys) + +**HQ20:** **_提供合約、資料庫與範例的 Solidity 專案,幫助你建立現實世界可用、功能齊全的分散式應用程式。 _** + +- [Github](https://github.com/HQ20/contracts) + +**Web3 Solidity SDK:** **_提供有效率建立自訂智慧型合約所需的工具_** + +- [文件](https://portal.thirdweb.com/solidity/) +- [Github](https://github.com/thirdweb-dev/contracts) + +## 相關教程 {#related-tutorials} + +- [以太坊開發者的安全考量](/developers/docs/smart-contracts/security/) _– 構建智慧型合約時的安全考量使用教學,包括庫的使用。_ +- [瞭解 ERC-20 代幣智慧型合約](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _:關於 ERC20 標準的教學,由多個資料庫提供。_ + +## 衍生閱讀 {#further-reading} + +_認識社區或社團資源能幫助大家學習更多? 歡迎自由編輯或添加於本頁!!_ diff --git a/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md new file mode 100644 index 00000000000..7695157d7d6 --- /dev/null +++ b/public/content/translations/zh-tw/developers/docs/smart-contracts/security/index.md @@ -0,0 +1,555 @@ +--- +title: 智慧型合約安全 +description: 建立安全的以太坊智慧型合約指南之概觀 +lang: zh-tw +--- + +智慧型合約極度靈活,且能夠控制大量值和資料,同時基於部署在區塊鏈上的程式碼執行不可變的邏輯。 這建立了活躍的去信任和去中心化的應用程式生態系統,它與傳統系統相比有許多優點。 這也為謀求透過智慧型合約漏洞獲利的攻擊者提供機會。 + +公共區塊鏈,例如以太坊,使智慧型合約的安全議題更加複雜。 已部署的合約程式碼_通常_無法變更,以修補安全缺陷;而要追蹤從智慧型合約竊取的資產也十分困難,且因為物件的不可變性,大多無法挽回。 + +雖然數字有差異,但因智慧型合約安全缺陷而遭竊取或損失的總額,估計超過 10 億美元。 備受關注的事件如 [DAO 駭客攻擊](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(駭客竊取 360 萬以太幣,現價超過 10 億美元);[Parity 多重簽章錢包駭客攻擊](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach)(駭客竊取 3 千萬美元);以及 [Parity 凍結錢包問題](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(超過 3 億美元的以太幣遭到永久凍結)。 + +前面提到的問題,促使開發者將努力打造安全、健全且有韌性的智慧型合約視為當務之急。 我們必須嚴肅看待智慧型合約的安全性,每個開發者都需要好好加以瞭解。 此指南將涵蓋以太坊開發者應有的資安考量,並探索提升智慧型合約安全性的資源。 + +## 基本資訊 {#prerequisites} + +請務必熟悉[開發智慧型合約的基本知識](/developers/docs/smart-contracts/),再來瞭解安全性。 + +## 建立安全的以太坊智慧型合約指南 {#smart-contract-security-guidelines} + +### 1. 設計正確的存取控制 {#design-proper-access-controls} + +在智慧型合約中,任何外部帳戶 (EOA) 或合約帳戶都可以調用標記為 `public` 或 `external` 的函數。 如果你想要其他人與你的智慧型合約互動,務必指定函數的公共可見性。 標記為 `private` 的函數只能被智慧型合約內部的函數調用,外部帳戶無法調用這種函數。 讓每個網路參與者存取智慧型合約函數可能造成一些問題,尤其是這表示人人都能執行須謹慎以對的操作(例如鑄造新代幣)。 + +為了防止未授權者使用智慧型合約函數,務必落實安全存取控制。 存取控制機制將使用智慧型合約中特定函數的功能限縮給某些核准實體,例如負責管理合約的帳戶。 在智慧型合約中,**可擁有模式**和**以角色為基礎的控制**是兩個有效落實存取控制的方法。 + +#### 可擁有模式 {#ownable-pattern} + +在可擁有模式下,會在建立合約的過程中,將一個地址設為合約的「擁有者」。 受保護的函數會配置一個 `OnlyOwner` 修飾符,確保執行函數前,先驗證調用地址的身分。 為防止不受歡迎的存取,合約擁有者以外的地址對受保護函數的調用都會遭到撤銷。 + +#### 以角色為基礎的控制 {#role-based-access-control} + +在一個智慧型合約中,將一個地址註冊為 `Owner` 會導致集中風險及單點失效。 假如合約擁有者的帳戶金鑰遭竊,攻擊者就可以攻擊合約擁有者的智慧型合約。 這就是為什麼使用以角色為基礎的控制模式和多重管理帳戶可能是更好的方法。 + +在以角色為基礎的控制下,存取敏感函數的權限會分散給一組受信任的參與者。 例如一個帳戶可能負責鑄造代幣;另一個帳戶則執行升級或暫停合約。 這種分散存取控制的做法排除了單點失效,也減少使用者的信任假設。 + +##### 使用多重簽章錢包 + +另一個落實安全存取控制的方法是使用[多重簽章帳戶](/developers/docs/smart-contracts/#multisig)管理合約。 不同於一般外部帳戶 (EOA),多重簽章帳戶由多個實體持有,而且需要最小數量的帳戶簽章,例如 5 個持有人中 3 個人的簽章,才能執行交易。 + +使用多簽存取控制,可多添一層安全性,因為對合約採取執行任何操作都需要多位合約持有人的同意。 這在使用可擁有模式的情況下尤其必要,因為它讓攻擊者或不肖內部人士更難操縱敏感的合約函數以達成其惡意目的。 + +### 2. 使用 require()、assert() 和 revert() 陳述式保護合約運作 {#use-require-assert-revert} + +如前面所說的,一旦將智慧型合約部署到區塊鏈上,任何人都可以調用智慧型合約內的公共函數。 因為無法事先預期外部帳戶將如何與你的合約互動,理想做法是在部署前落實內部保障措施,防止會造成問題的操作。 你可以強制使用者對智慧型合約執行正確行為,如果執行操作未能通過某些條件,可以使用 `require()`、`assert()` 和 `revert()` 陳述式,來啟動例外狀況並撤銷狀態變更。 + +**`require()`**:`require` 會定義於函數的開頭,確保在執行調用函數前,達到預先定義的條件。 `require` 陳述式可以用於驗證使用者輸入的資料、確認狀態變數或在繼續執行函數前驗證調用帳戶的身分。 + +**`assert()`**:`assert()` 用於偵測內部錯誤和確認程式碼是否違反「不變性」。 不變性是在執行所有函數時,都應為真的合約狀態的邏輯斷言。 不變性的一個範例就是代幣合約的最大總供應量或餘額。 使用 `assert()` 確保你的合約絕不會進入脆弱狀態,若發生這種狀況,所有狀態變數將會回復到先前狀態。 + +**`revert()`**:`revert()` 可以運用在未滿足指定條件時,觸發例外狀況的 if-else 陳述式。 以下範例合約使用 `revert()` 來保護函數的執行: + +``` +pragma solidity ^0.8.4; + +contract VendingMachine { + address owner; + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("Not enough Ether provided."); + // Perform the purchase. + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); + + payable(msg.sender).transfer(address(this).balance); + } +} +``` + +### 3. 測試智慧型合約和驗證程式碼的正確性 {#test-smart-contracts-and-verify-code-correctness} + +在[以太坊虛擬機](/developers/docs/evm/)上執行的程式碼具備不可變性,代表智慧型合約在開發階段需要接受更高階的品質評估。 全面測試你的合約並注意任何超出預期的結果,將大大提升合約的安全性,且長期來看可保護使用者。 + +常用方法是使用預期合約會接受的使用者模擬資料,來編寫小型單元測試。 [單元測試](/developers/docs/smart-contracts/testing/#unit-testing)適合測試特定函數的功能,並確保智慧型合約如預期運作。 + +很可惜,單元測試單獨使用時,提升智慧型合約安全性的成效並不顯著。 單元測試可能證明函數可以正確執行模擬資料,但單元測試的效果取決於編寫測試的品質。 這使得偵測未注意到、但會破壞智慧型合約安全性的邊緣案例與漏洞非常困難。 + +更好的做法是結合單元測試與屬性測試,並運用[靜態和動態分析](/developers/docs/smart-contracts/testing/#static-dynamic-analysis)執行。 靜態分析依賴低階表示法,像是[控制流程圖](https://en.wikipedia.org/wiki/Control-flow_graph)和[抽象語法樹](https://deepsource.io/glossary/ast/),來分析可觸及的程式狀態和執行路徑。 同時,動態分析技術,如模糊測試、用隨機輸入值執行合約程式碼,能夠偵測違反安全屬性的操作。 + +[形式驗證](/developers/docs/smart-contracts/)是另一項驗證智慧型合約安全屬性的技術。 不同於一般測試,形式驗證可以确凿地證明智慧型合約不存在任何錯誤。 這種做法會建立描述預期安全屬性的形式規范,並證明合約的形式模型遵守此規范。 + +### 4 邀請獨立審查程式碼 {#get-independent-code-reviews} + +測試完合約後,最好請其他人來確認原始程式碼是否有任何安全性問題。 測試沒辦法涵蓋智慧型合約內的每一處瑕疵,但進行獨立審查可增加發現漏洞的可能性。 + +#### 審核 {#audits} + +委託智慧型合約審核服務是進行獨立程式碼審查的方法之一。 審核者在確保智慧型合約安全性,且沒有品質瑕疵和設計錯誤上扮演重要角色。 + +但是,你應該避免把審核當成一勞永逸地的解決方案。 智慧型合約審核不可能發現每一個錯誤,其主要目的是再次進行審查,幫助開發者偵測在開發初期和測試階段沒有發現的問題。 你應該遵循[和審核者合作的最佳案例](https://twitter.com/tinchoabbate/status/1400170232904400897),製作完整的程式碼記錄,以及新增內嵌備註,才能從智慧型合約審核中獲得最大效益。 + +#### 漏洞懸賞 {#bug-bounties} + +設立漏洞懸賞賞計畫是另一個實現外部程式碼審查的方法。 漏洞懸賞會發放經濟性獎勵給發現應用程式漏洞的個人(通常是白帽駭客)。 + +若正確運用,漏洞懸賞可以給予駭客社群檢查你程式碼重大缺陷的動機。 一個實際案例是「無限貨幣錯誤」,讓攻擊者可以在以太坊的[二層](/layer-2/)協定 [Optimism](https://www.optimism.io/) 上建立無限數量的以太幣。 幸好有位白帽駭客[發現了這個缺陷](https://www.saurik.com/optimism.html),並通知了相關團隊[,因此獲得了一大筆獎金](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/)。 + +有效的漏洞懸賞獎金機制,應與面臨風險的資金成比例。 就像「[Scaling Bug Bounty(擴大漏洞懸賞)](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)」一文所說,這種方法讓人在財務上有動機盡責揭露,而非利用漏洞。 + +### 5 開發智慧型合約時遵循最佳案例 {#follow-smart-contract-development-best-practices} + +不能因為有審核和漏洞懸賞就不盡責編寫高品質程式碼。 優良的智慧型合約安全性始於遵循正確的設計和開發流程: + +- 將所有的程式碼儲存在版本控制系統中,例如 git + +- 修改所有程式碼都需透過提取請求完成 + +- 確保所有的提取請求都至少有一個獨立審核人:如果是自己獨自開發專案,可斟酌找其他開發者交換審查程式碼 + +- 使用[開發環境](/developers/docs/frameworks/)來測試、編譯、部署智慧型合約 + +- 利用基本的程式碼分析工具,例如 Mythril 和 Slither 來執行程式碼。 理想情况下,這應該在合併提取請求及檢查輸出結果異同前完成 + +- 確認程式碼編譯沒有錯誤,且 Solidity 編譯器不會傳出警告 + +- 正確記錄程式碼(使用 [NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html)),並運用簡單易懂的語言詳細描述合約架構。 這樣才容易讓其他人審核和審查你的程式碼。 + +### 6. 採行健全的災害復原計畫 {#implement-disaster-recovery-plans} + +設計安全的存取控制、採用函數修飾符和其他上述提議,可改善智慧型合約安全,但不能排除惡意入侵的可能性。 建立安全的智慧型合約需要做好「防範錯誤的準備」,以及對攻擊作出有效反應的備援計畫。 正確的災害復原計畫包含下列部分或全部要素: + +#### 合約升級 {#contract-upgrades} + +雖然以太坊智慧型合約是預設不得變更,但可以透過升級模式來達成某程度的變更。 當重大缺陷迫使舊合約無法使用,而部署新邏輯是最可行的選擇時,就必須升級合約。 + +合約升級機制的運作方式不同,「代理人模式」是升級智慧型合約最常見的方法。 代理人模式會將應用程式的狀態和邏輯拆分成_兩個_合約。 第一個合約(稱為「代理人合約」)儲存狀態變數(例如使用者餘額);第二個合約(稱為「邏輯合約」)保存執行合約函數的程式碼。 + +帳戶只和代理人合約互動,代理人合約再用低階調用 [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) 發送所有函數調用至邏輯合約。 和一般的訊息調用不同,`delegatecall()` 會確保在邏輯合約地址上執行的程式碼是在調用合約的情境下執行。 這表示邏輯合約將永遠把資料寫入代理人的存儲空間(而不是自己的存儲空間),且會保留 `msg.sender` 與 `msg.value` 的原始值。 + +委託邏輯合約的調用必須將其地址儲存在代理人合約的存儲空間。 因此,升級合約的邏輯只是部署另一個邏輯合約,並將新地址儲存至代理人合約。 之後,代理人合約的調用都會自動傳送至新的邏輯合約,讓你在未實際修改程式碼的情況下「升級」合約。 + +[更多升級合約相關資訊](/developers/docs/smart-contracts/upgrading/)。 + +#### 緊急停止 {#emergency-stops} + +如前所述,即便進行大量審核和測試,仍不可能發現智慧型合約的所有漏洞。 如果已經部署的程式出現漏洞,就不可能修補,因為你無法改變在合約地址執行的程式碼。 而且,升級機制(例如,代理人模式)可能需要時間完成(通常需要不同相關方的同意),因此會給攻擊者更多時間造成更大傷害。 + +極端選擇是執行「緊急停止」函數,阻止調用合約中的易受攻擊函數。 緊急停止通常包含下列要素: + +1. 指示智慧型合約是否在停止狀態的全域布林變數。 建立合約時,此變數被設定為 `false`,一旦合約終止,就會回復為 `true`。 + +2. 執行時參照這個布林變數的函數。 在智慧型合約不在終止狀態時,可存取這類函數;但啟動緊急停止功能後,此類函數就無法存取。 + +3. 可以存取緊急停止函數的實體,可將布林變數設定為 `true`。 為防止惡意行動,可以限制只有受信任地址(例如,合約持有人)才可調用此函數。 + +一旦合約啟動緊急停止,將無法調用特定函數。 藉由將指定函數包裹在參照全域變數的修飾符中來達成此目的。 以下是說明如何在合約中採用此模式的[範例](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol): + +```solidity +// This code has not been professionally audited and makes no promises about safety or correctness. Use at your own risk. + +contract EmergencyStop { + + bool isStopped = false; + + modifier stoppedInEmergency { + require(!isStopped); + _; + } + + modifier onlyWhenStopped { + require(isStopped); + _; + } + + modifier onlyAuthorized { + // Check for authorization of msg.sender here + _; + } + + function stopContract() public onlyAuthorized { + isStopped = true; + } + + function resumeContract() public onlyAuthorized { + isStopped = false; + } + + function deposit() public payable stoppedInEmergency { + // Deposit logic happening here + } + + function emergencyWithdraw() public onlyWhenStopped { + // Emergency withdraw happening here + } +} +``` + +此範例展現緊急停止的基本特徵: + +- `isStopped` 是布林變數,在開始時計算為為 `false`,當合約進入緊急模式時即變更為 `true`。 + +- 函數修飾符 `onlyWhenStopped` 和 `stoppedInEmergency` 會檢查 `isStopped` 變數。 `stoppedInEmergency` 用於控制合約出現漏洞時,無法存取的函數(例如,`deposit()`)。 這些函數的調用將直接遭到撤銷。 + +`onlyWhenStopped` 用於在緊急情況下應調用的函數(例如,`emergencyWithdraw()`)。 這類函數有助解決困境,因此被排除在「受限函數」清單之外。 + +緊急停止功能提供處理智慧型合約嚴重漏洞的有效權宜之計。 然而,這種方法需要使用者相信開發者不會基於自身利益啟動緊急停止功能。 面對這種疑慮,可能的解決方法是透過鏈上投票機制、時間鎖定、或多簽錢包核准等分散式方法管理緊急停止功能。 + +#### 事件監控 {#event-monitoring} + +[事件](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events)可以追蹤智慧型合約函數調用狀況和監控狀態變數的變化。 理想做法是當某一方執行攸關安全的行動(例如,提領資金)時,讓智慧型合約釋出事件。 + +記錄事件和鏈外監控事件,可以掌握合約運作狀況並有助及早發現惡意行動。 這表示你的團隊可以快速對駭客攻擊做出反應,並採取行動減輕對使用者的衝擊,例如:暫停函數或執行升級。 + +你也可以選擇現成的監控工具,在有人和你的合約互動時,這些工具會自動傳送警告通知。 這些工具可讓你基於不同的觸發器,例如:交易量、函數調用頻率或涉及特定函數時,建立自訂警告通知。 例如:你可以編寫在單筆交易提款金額超過特定閾值時傳送警告。 + +### 7. 設計安全治理體系 {#design-secure-governance-systems} + +你可能想要藉由移交重要智慧型合約的控制權給社群成員,來分散管理(去中心化)應用程式。 這種情況下,智慧型合約系統將包含一個治理模組,也就是允許社群成員透過鏈上治理體系核准管理行動的機制。 例如,採納升級代理人合約的提案,可由代幣持有人投票決定。 + +去中心化治理的好處在於讓開發者和終端使用者的利益一致。 儘管如此,若未正確落實智慧型合約治理機制,仍可能產生新的風險。 可能出現的情況是,一位攻擊者透過[閃電貸](/defi/#flash-loans)取得大量投票權(以持有代幣數量決定),推動通過惡意提案。 + +預防鏈上治理相關問題的方法之一是[使用時間鎖定](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/)。 時間鎖定是直到特定時間過後,才讓智慧型合約執行某些動作。 其他策略包括:根據每一個代幣被鎖定的時間賦予「投票加權」,或以歷史期間(例如:過去的 2-3 個區塊)而不是目前區塊,來衡量一個地址的投票權。 這兩種方法都能降低快速累積投票權,進而影響鏈上投票結果的情況。 + +深入瞭解[設計安全治理體系](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/)和 [去中心化自治組織的不同投票機制](https://hackernoon.com/governance-is-the-holy-grail-for-daos)。 + +### 8. 將程式碼的複雜性降到最低 {#reduce-code-complexity} + +傳統的軟體開發者都熟悉 KISS (「保持簡約」),也就是不要在軟體中引進不必要複雜設計的原則。 這是因為長期以來,人們都認為「複雜系統會發生複雜的故障」,且更容易造成代價高昂的錯誤。 + +編寫智慧型合約尤其注重簡約,因為智慧型合約可能控制龐大資金。 保持簡約的秘訣:編寫智慧型合約時盡可能重複使用既有庫,例如 [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/4.x/)。 因為這些庫已經通過開發者廣泛審核和測試,使用時可以降低從零開始開發新功能出現漏洞的幾率。 + +另一個建議是編寫小型函數,並將商業邏輯拆分成多個合約,確立模組化合約。 編寫較簡單的程式碼不只能縮小智慧型合約中的受攻擊面,也使判斷整個系統的正確性更簡單,亦能提早偵測可能的設計錯誤。 + +### 9. 防範一般的智慧型合約漏洞 {#mitigate-common-smart-contract-vulnerabilities} + +#### 重入攻擊 {#reentrancy} + +以太坊虛擬機不允許並行執行,也就是無法同時執行牽涉同一訊息調用的兩個合約。 一個外部調用會終止調用合約的執行和記憶體,直到這個調用返回結果,這時才會繼續正常執行。 這個過程可被正式稱為將[控制流程](https://www.computerhope.com/jargon/c/contflow.htm)轉移到另一個合約。 + +雖然大多數情況下無害,但轉移控制流程至不受信任的合約可能引起重入攻擊等問題。 在初始函數調用完成前,若惡意合約回呼易受攻擊的合約,就是重入攻擊。 我們可以舉一個例子來說明這種攻擊類型。 + +試想有個簡單的智慧型合約(稱為「Victim」),可以讓任何人存入與提領以太幣: + +```solidity +// This contract is vulnerable. Do not use in production + +contract Victim { + mapping (address => uint256) public balances; + + function deposit() external payable { + balances[msg.sender] += msg.value; + } + + function withdraw() external { + uint256 amount = balances[msg.sender]; + (bool success, ) = msg.sender.call.value(amount)(""); + require(success); + balances[msg.sender] = 0; + } +} +``` + +此合約公布了一個 `withdraw()` 函數,允許使用者提領先前存入合約內的以太幣。 處理提款時,合約執行以下操作: + +1. 檢查使用者的以太幣餘額 +2. 匯出資金至調用地址 +3. 將餘額重置為 0,避免使用者進一步提領 + +`Victim` 合約中的 `withdraw()` 函數遵循「檢查-互動-效果」模式。 若滿足必要的執行條件,就會進行_檢查_(即使用者的以太幣餘額是正數),接著再傳送以太幣至調用者的地址,進行_互動_,最後套用交易_效果_(即減少使用者的餘額)。 + +假如是外部帳戶 (EOA) 調用 `withdraw()`,函數將如預期執行:`msg.sender.call.value()` 傳送以太幣給調用者。 然而,如果調用 `withdraw()` 的 `msg.sender` 是智慧型合約帳戶,使用`msg.sender.call.value()` 傳送資金,也會觸發儲存在該帳戶地址的程式碼執行。 + +試想這是部署在合約地址的程式碼: + +```solidity + contract Attacker { + function beginAttack() external payable { + Victim(victim_address).deposit.value(1 ether)(); + Victim(victim_address).withdraw(); + } + + function() external payable { + if (gasleft() > 40000) { + Victim(victim_address).withdraw(); + } + } +} +``` + +這個合約在設計上要達成三個目的: + +1. 接受其他帳戶(可能是攻擊者的外部帳戶)的存款 +2. 存入 1 以太幣至 Victim 合約 +3. 提領存儲在智慧型合約中的 1 以太幣 + +這裡沒有任何問題,除了傳入 `msg.sender.call.value` 剩餘的燃料超過 40,000 時,`Attacker` 中的另一個函數會再次調用 `Victim` 內的 `withdraw()`。 這讓 `Attacker` 在第一次調用 `withdraw` 結束_之前_,可以一再進入 `Victim` 提領更多資金。 這個循環看起來像這樣: + +```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 +``` + +總起來說,因為調用者的餘額並非 0,直到函數執行結束前,後續的調用都能成功執行,並允許調用者多次提領餘額。 這類攻擊可以被用於將智慧型合約內的所有資金提領一空,如同 [2016 年的 DAO 駭客攻擊](https://www.coindesk.com/learn/2016/06/25/understanding-the-dao-attack/)。 就像[重入入侵公開清單](https://github.com/pcaversaccio/reentrancy-attacks)所示,如今重入攻擊仍是智慧型合約面臨的嚴重問題。 + +##### 如何預防重入攻擊 + +處理重入攻擊的方法是遵循[檢查 - 效果 - 互動模式](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern)。 這個模式指示函數如以下次序執行,在繼續執行下一個動作前,必須先執行進行必要檢查的程式碼,然後是執行操縱合約狀態的程式碼,最後才執行與其他合約或外部帳戶互動的程式碼。 + +依照檢查 - 效果 - 互動模式改寫 `Victim` 合約如下: + +```solidity +contract NoLongerAVictim { + function withdraw() external { + uint256 amount = balances[msg.sender]; + balances[msg.sender] = 0; + (bool success, ) = msg.sender.call.value(amount)(""); + require(success); + } +} +``` + +這個合約如下執行:_檢查_使用者餘額、套用 `withdraw()` 函數的_效果_(將使用者的餘額重置為 0),再繼續執行_互動_(傳送以太幣至使用者地址)。 這能確保合約在外部調用前更新存儲空間,排除會引發第一次攻擊的重入條件。 `Attacker` 合約仍然可能回呼 `NoLongerAVictim`,但因為 `balances[msg.sender]` 已設定為 0,所以再次提領時會出現錯誤。 + +另一個方法是使用相斥鎖定(一般稱為「Mutex」),鎖定合約的部分狀態,直到完成函數調用。 這個方法是在函數執行前,將一個布林變數設定為 `true`,調用完成後再把布林變數回復為 `false`。 如以下範例所示,使用 Mutex 可保護函數在初始調用尚未完成前,不被重複調用,並有效阻止重入。 + +```solidity +pragma solidity ^0.7.0; + +contract MutexPattern { + bool locked = false; + mapping(address => uint256) public balances; + + modifier noReentrancy() { + require(!locked, "Blocked from reentrancy."); + 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 + function withdraw(uint _amount) public payable noReentrancy returns(bool) { + require(balances[msg.sender] >= _amount, "No balance to withdraw."); + + balances[msg.sender] -= _amount; + bool (success, ) = msg.sender.call{value: _amount}(""); + require(success); + + return true; + } +} +``` + +你還可以使用[提取款項](https://docs.openzeppelin.com/contracts/4.x/api/security#PullPayment)系統,要求使用者從智慧型合約提款,而不是使用「推送付款」系統傳送資金至帳戶。 如此一來,就可免除在未知地址上意外啟動程式碼的可能性(也能防止特定阻斷服務攻擊)。 + +#### 整數下溢與上溢 {#integer-underflows-and-overflows} + +算術運算結果超出可接受數值範圍,必須「退位」至最低代表值時,就是整數上溢。 例如:`uint8` 最多只能儲存相當於 2^8-1=255 的值。 若算術運算結果導致大於 `255` 的值,就屬於上溢,並會將 `uint` 重置為 `0`,類似汽車里程表達到里程數上限 (999999) 時,將重置為 0。 + +整數下溢的發生原因也是如此:算術運算結果小於可接受範圍。 例如你嘗試要對 `uint8` 的 `0` 進行遞減,結果就會是進位至最高代表值 (`255`)。 + +整數上溢和下溢都可能對合約狀態變數產生非預期的變更,導致預料外的執行。 以下範例顯示攻擊者可以利用智慧型合約內的算術上溢執行無效操作: + +``` +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. + +/* +1. Deploy TimeLock +2. Deploy Attack with address of TimeLock +3. Call Attack.attack sending 1 ether. You will immediately be able to + withdraw your ether. + +What happened? +Attack caused the TimeLock.lockTime to overflow and was able to withdraw +before the 1 week waiting period. +*/ + +contract TimeLock { + mapping(address => uint) public balances; + mapping(address => uint) public lockTime; + + function deposit() external payable { + balances[msg.sender] += msg.value; + lockTime[msg.sender] = block.timestamp + 1 weeks; + } + + function increaseLockTime(uint _secondsToIncrease) public { + lockTime[msg.sender] += _secondsToIncrease; + } + + function withdraw() public { + require(balances[msg.sender] > 0, "Insufficient funds"); + require(block.timestamp > lockTime[msg.sender], "Lock time not expired"); + + uint amount = balances[msg.sender]; + balances[msg.sender] = 0; + + (bool sent, ) = msg.sender.call{value: amount}(""); + require(sent, "Failed to send Ether"); + } +} + +contract Attack { + TimeLock timeLock; + + constructor(TimeLock _timeLock) { + timeLock = TimeLock(_timeLock); + } + + fallback() external payable {} + + function attack() public payable { + timeLock.deposit{value: msg.value}(); + /* + if t = current lock time then we need to find x such that + x + t = 2**256 = 0 + so x = -t + 2**256 = type(uint).max + 1 + so x = type(uint).max + 1 - t + */ + timeLock.increaseLockTime( + type(uint).max + 1 - timeLock.lockTime(address(this)) + ); + timeLock.withdraw(); + } +} +``` + +##### 如何預防整數下溢和上溢 + +自 0.8.0 版本起,Solidity 編譯器拒絕使用會導致整數下溢和上溢的程式碼。 然而,使用較低版本編譯器編譯的合約應該檢查涉及算術運算的函數,或使用庫(例如 [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math))來檢查下溢/上溢。 + +#### 操縱預言機 {#oracle-manipulation} + +[預言機](/developers/docs/oracles/)會取得鏈外資訊,並把這些資訊傳到鏈上供智慧型合約使用。 使用預言機,可以設計與鏈外系統(例如資本市場)互通的智慧型合約,大幅拓展應用範圍。 + +然而,若預言機遭到破壞,將不正確的資訊傳到鏈上,智慧型合約將會根據不正確輸入資料執行,可能引起問題。 這是「預言機問題」的基礎,也就是要確保來自區塊鏈預言機的是正確、及時的最新資訊。 + +可能產生的相關安全性疑慮,就是使用如去中心化交易所等鏈上預言機,取得資產的現貨價格。 [去中心化金融 (DeFi)](/defi/) 產業的借貸平台通常都藉此判斷使用者抵押品的價值,再決定借貸額度。 + +去中心化交易所的價格之所以準確,大體上倚靠套利者在市場上維持市場均衡。 然而,這也提供操縱空間,若鏈上預言機可根據歷史交易模式(通常使用的方法)計算資產價格時,更是如此。 + +例如,在和你的借貸合約互動之前,攻擊者可藉由取得閃電貸的權利,人為膨脹某資產的現貨價格。 在去中心化交易所查詢該資產的價格時,會傳回高於正常價值(因為攻擊者大量「買單」扭曲對該資產的需求量)的價格,因而允許他們超額借貸。 像這樣的「閃電貸攻擊」已被用來入侵依靠價格預言機的去中心化金融應用程式,造成協定損失數百萬美元。 + +##### 如何預防操縱預言機 + +避免預言機操縱的最低要求,是使用會查詢多來源資訊的去中心化預言機網路,來避免單點失效。 在大多數情況下,去中心化預言機內建加密經濟獎勵機制,促進預言機節點報告正確資訊,因此比集中化預言機安全。 + +若你打算在鏈上預言機查詢資產價格,可考慮使用採用時間加權平均價格 (TWAP) 機制的預言機。 [時間加權平均價格預言機](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles)會查詢兩個不同時間點(你可以更改時間點)的資產價格,再根據得到數據的平均值計算現貨價值。 選擇時間較長的價格可保護協定免於價格操縱,因為近期大量的交易下單不會對資產價格造成影響。 + +## 開發者的智慧型合約安全性資源 {#smart-contract-security-resources-for-developers} + +### 分析智慧型合約和驗證程式碼正確性的工具 {#code-analysis-tools} + +- **[測試工具和庫](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** - _一系列執行智慧型合約單元測試、靜態分析和動態分析的產業標準工具和庫。_ + +- **[形式驗證工具](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools) - **_驗證智慧型合約功能正確性和檢查不變性的工具。_ + +- **[智慧型合約審核服務](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)**:_提供以太坊開發專案智慧型合約審核服務的組織清單。_ + +- **[漏洞懸賞平台](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _協調漏洞懸賞計畫和發放獎金給揭發智慧型合約重大漏洞者的平台。_ + +- **[分叉檢查工具](https://forkchecker.hashex.org/)** - _檢查分叉合約所有可用資訊的線上免費工具。_ + +- **[應用程式二進制介面編碼器](https://abi.hashex.org/)** - _對 Solidity 合約的函數和建構函數引數進行編碼的線上免費服務。_ + +### 監視智慧型合約的工具 {#smart-contract-monitoring-tools} + +- **[OpenZeppelin Defender Sentinels](https://docs.openzeppelin.com/defender/v1/sentinel)** - _一個自動監控和回應智慧型合約事件、函數和交易參數的工具。_ + +- **[Tenderly Real-Time Alerting](https://tenderly.co/alerting/)**:_當智慧型合約或錢包出現不尋常的和意外事件時,可以獲得即時通知的工具。_ + +### 智慧型合約的安全管理工具 {#smart-contract-administration-tools} + +- **[OpenZeppelin Defender Admin](https://docs.openzeppelin.com/defender/v1/admin)** - _管理智慧型合約運作,包括存取控制、升級、和暫停的介面。_ + +- **[Safe](https://safe.global/)** - _在以太坊上執行、需要達到最低核准人數(N 人中的M 人),才能執行交易的智慧型合約數位錢包。_ + +- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/4.x/)** - _執行合約所有權、升級、存取控制、治理、暫停等管理功能的合約庫。_ + +### 智慧型合約審核服務 {#smart-contract-auditing-services} + +- **[ConsenSys Diligence](https://consensys.net/diligence/)** - _協助區塊鏈生態系系統中的專案,確保其協定處於可發布狀態,且用於保護使用者的智慧型合約審核服務。_ + +- **[CertiK](https://www.certik.com/)** - _率先致力於智慧型合約和區塊鏈網路上使用最新形式驗證技術的區塊鏈安全公司。_ + +- **[Trail of Bits](https://www.trailofbits.com/)** - _結合安全性研究和攻擊者心理來降低風險和強化程式碼的網絡安全公司。_ + +- **[PeckShield](https://peckshield.com/)** - _為整個區塊鏈生態系統的安全性、隱私權、易用性提供產品和服務的區塊鏈安全公司。_ + +- **[QuantStamp](https://quantstamp.com/)** - _經由安全性和風險評估服務促進廣泛採用區塊鏈技術的審核服務。_ + +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _提供去中心化系統安全性審核的智慧型合約安全公司。_ + +- **[Runtime Verification](https://runtimeverification.com/)** - _專精於智慧型合約形式模型和驗證的安全公司。_ + +- **[Hacken](https://hacken.io)** - _為區塊鏈安全採用 360 度全方位方法的 Web3 網路安全審核者。_ + +- **[Nethermind](https://nethermind.io/smart-contracts-audits)** - _Solidity 和 Cairo 稽核服務,確保智慧型合約完整性、以及以太坊及 Starknet 使用者的安全。_ + +- **[HashEx](https://hashex.org/)** - _HashEx 專注於區塊鏈和智慧型合約審核,以確保加密貨幣的安全性,提供智慧型合約開發、滲透測試、區塊鏈諮詢等服務。_ + +- **[Code4rena](https://code4rena.com/)** - _鼓勵智慧型合約安全性專家找出漏洞,並協助提升 Web3 安全性,富競爭力的審核平台。_ + +### 漏洞懸賞平台 {#bug-bounty-platforms} + +- **[Immunefi](https://immunefi.com/)** - _這是智慧型合約和去中心化金融專案漏洞懸賞平台。安全研究員在此審核程式碼、找出漏洞、獲得報酬、使加密貨幣更安全。_ + +- **[HackerOne](https://www.hackerone.com/)** - _連結商業和滲透測試者及安全研究者的漏洞協調和漏洞懸賞平台。_ + +- **[HackenProof](https://hackenproof.com/)** - _專業的加密貨幣專案(去中心化金融、智慧型合約、錢包、中心化交易所等)漏洞懸賞平台。安全專業人士在此提供分類服務,而研究者可以在提出重要、經過驗證的錯誤報告時獲得報酬。_ + +### 已知的智慧型合約漏洞和弱點出版品 {#common-smart-contract-vulnerabilities-and-exploits} + +- **[ConsenSys:已知的智慧型合約攻擊](https://consensys.github.io/smart-contract-best-practices/attacks/)** - _以適合初學者的方式解說最重大的合約漏洞,大部分案例會附上範例程式碼。_ + +- **[SWC Registry](https://swcregistry.io/)** - _適用於以太坊智慧型合約的通用弱點列表 (CWE) 精選清單。_ + +- **[Rekt](https://rekt.news/)** - _知名加密貨幣駭客和侵入事件的定期更新的出版品,並附上詳細的事後剖析報告。_ + +### 學習智慧型合約安全性的挑戰 {#challenges-for-learning-smart-contract-security} + +- **[優質的 BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _區塊鏈安全性的實戰演習、挑戰、和[奪旗](https://www.webopedia.com/definitions/ctf-event/amp/)競賽和解決方案評論精選清單。_ + +- **[脆弱不堪的去中心化金融](https://www.damnvulnerabledefi.xyz/)** - _學習去中心化金融智慧型合約攻撃性安全防衛的實戰演習,以及培養找出錯誤和審核安全性的技能。_ + +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _以 Web3/Solidity 為中心的實戰演習,每一個等級都是一個必須被「駭客破解」的智慧型合約。_ + +### 保護智慧型合約的最佳案例 {#smart-contract-security-best-practices} + +- **[ConsesSys:以太坊智慧型合約安全性最佳案例](https://consensys.github.io/smart-contract-best-practices/)** - _保護以太坊智慧型合約安全性之準則的完整清單。_ + +- **[Nascent:簡單的安全性工具組](https://github.com/nascentxyz/simple-security-toolkit)** - _安全導向的實用智慧型合約開發指南與檢核清單。_ + +- **[Solidity 模式](https://fravoll.github.io/solidity-patterns/)** - _關於智慧型合約程式語言 Solidity 的安全性模型和最佳案例的實用彙總。_ + +- **[Solidity 文件:安全性考量](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _使用 Solidity 編寫安全智慧型合約的指南。_ + +- **[智慧型合約安全性驗證標準](https://github.com/securing/SCSVS)** - _適用於開發者、架構師、安全性審查者和廠商的標準化智慧型合約安全性 14 點檢查清單。_ + +### 關於智慧型合約安全性的使用教學 {#tutorials-on-smart-contract-security} + +- [如何編寫安全的智慧型合約](/developers/tutorials/secure-development-workflow/) + +- [如何使用 Slither 搜索智慧型合約bug.](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) + +- [如何使用 Manticore 搜索智慧型合約bug.](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) + +- [智慧型合約安全指南](/developers/tutorials/smart-contract-security-guidelines/) + +- [如何安全整合包含任意代幣的代幣合約](/developers/tutorials/token-integration-checklist/) diff --git a/public/content/translations/zh-tw/developers/docs/transactions/index.md b/public/content/translations/zh-tw/developers/docs/transactions/index.md index 6012b3fa9d2..4d188245f3d 100644 --- a/public/content/translations/zh-tw/developers/docs/transactions/index.md +++ b/public/content/translations/zh-tw/developers/docs/transactions/index.md @@ -4,7 +4,7 @@ description: 以太坊交易概觀 – 運作原理、資料結構以及如何 lang: zh-tw --- -交易是帳戶發出的帶密碼學簽章的指令。 帳戶將發起交易以更新以太坊網絡的狀態。 最簡單的交易是將以太幣從一個帳戶轉賬到另一個帳戶。 +交易是帳戶發出的帶密碼學簽章的指令。 帳戶將發起交易以更新以太坊網路的狀態。 最簡單的交易是將以太幣從一個帳戶轉帳到另一個帳戶。 ## 前置要求 {#prerequisites} @@ -14,7 +14,7 @@ lang: zh-tw 以太坊交易是指由外部帳戶發起的操作,換句話說,此帳戶是由人而不是智慧型合約管理的帳戶。 例如,如果 Bob 發送給 Alice 1 以太幣,Bob 的帳戶必須扣除,Alice 的帳戶必須存入。 此更改狀態的操作發生在交易中。 -![顯示交易導致狀態變化的圖表](./tx.png) _此圖源於[以太坊 EVM 圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![顯示交易導致狀態變化的圖表](./tx.png) _此圖源於[以太坊EVM圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ 交易會改變以太坊虛擬機的狀態,須廣播至整個網路。 任何節點都可以廣播要在以太坊虛擬機上執行的交易請求;之後驗證者將執行交易並將引起的狀態變化傳播到網路上的其他節點。 @@ -26,7 +26,7 @@ lang: zh-tw - `recipient` – 接收地址(如果為外部帳戶,交易將傳輸值。 如果為合約帳戶,交易將執行合約程式碼) - `signature` – 發送者的識別碼。 當發送者以私密金鑰簽署交易並確認發送者已授權此交易时,就會產生此簽章。 - `nonce` - 用來表示帳戶中交易編號的按順序遞增計數器 -- `value` – 發送者轉賬至接收者的以太幣數量(面額為 WEI,1 以太幣等於 10 的 18 次方 wei) +- `value` – 發送者轉帳至接收者的以太幣數量(面額為 WEI,1 以太幣等於 10 的 18 次方 wei) - `input data` –可選欄位,可填入任意資料 - `gasLimit` – 交易可以使用的最大燃料單位數量。 [以太坊虛擬機](/developers/docs/evm/opcodes)指定了每個計算步驟的所需燃料單位 - `maxPriorityFeePerGas` - 已使用燃料的最高價格,可作為給驗證者的小費 @@ -135,7 +135,7 @@ calldata 的剩餘部分是參數,[依據 ABI 規範中的說明編碼](https: ### 關於燃料 {#on-gas} -如上所述,執行交易需要花費[燃料](/developers/docs/gas/)。 簡單的轉賬交易需要 21000 單位燃料。 +如上所述,執行交易需要花費[燃料](/developers/docs/gas/)。 簡單的轉帳交易需要 21000 單位燃料。 所以,若 Bob 要以 190 gwei 的 `baseFeePerGas` 還有 10 gwei 的 `maxPriorityFeePerGas` 給 Alice 發送 1 以太幣,Bob 將需要支付以下費用: @@ -155,7 +155,7 @@ Alice 的帳戶將存入 **+1.0 以太幣** 所有智慧型合約互動也需要燃料。 -![顯示如何退還未使用燃料的圖表](./gas-tx.png) _此圖源於[以太坊 EVM 圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ +![顯示如何退還未使用燃料的圖表](./gas-tx.png) _此圖源於[以太坊EVM圖解](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf)_ 任何交易中未使用的燃料都會退還給使用者帳戶。 diff --git a/public/content/translations/zh-tw/developers/docs/web2-vs-web3/index.md b/public/content/translations/zh-tw/developers/docs/web2-vs-web3/index.md index 4c4301808e3..d98309a961b 100644 --- a/public/content/translations/zh-tw/developers/docs/web2-vs-web3/index.md +++ b/public/content/translations/zh-tw/developers/docs/web2-vs-web3/index.md @@ -12,17 +12,17 @@ Web2 指的是目前我們大多人熟知的網際網路。 網際網路由各 很多 Web3 開發者選擇建立去中心化應用程式,是因為以太坊固有的去中心化優點: -- 任何網絡中的使用者,都擁有使用服務的權限,換句話說,使用服務不需要任何權限。 +- 任何網路中的使用者,都擁有使用服務的權限,換句話說,使用服務不需要任何權限。 - 沒有任何人能夠阻止或限制你使用服務。 - 支付是透過原生代幣以太幣建立的。 - 以太坊是圖靈完備的,這表示你可以在上面寫許多程式。 ## 實務對比 {#practical-comparisons} -| Web2 | Web3 | -| -------------------------------------------------- | ---------------------------------------------------------------------- | -| Twitter 可以審查任何帳戶或推文 | Web3 推文不可被審查,因為採用了去中心化控制 | -| 支付服務商可以決定不允許對某些類型的工作支付 | Web3 支付應用程式不需要任何個人資料,且無法阻止支付 | +| Web2 | Web3 | +| ------------------------- | --------------------------------------- | +| Twitter 可以審查任何帳戶或推文 | Web3 推文不可被審查,因為採用了去中心化控制 | +| 支付服務商可以決定不允許對某些類型的工作支付 | Web3 支付應用程式不需要任何個人資料,且無法阻止支付 | | 零工經濟應用程式之服務伺服器會當機並影響勞動者收入 | Web3 伺服器不會當機 – 由上千台電腦組成的去中心化網路以太坊是它們的後端 | 這不代表所有服務都需要變成去中心化應用程式。 以下範例將說明 web2 和 web3 服務的主要差異。 @@ -40,15 +40,15 @@ Web3 目前的一些限制: 下表大致列出了中心化與去中心化數位網路的優點與缺點。 -| 中心化系統 | 去中心化系統 | -| ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -| 網路直徑小(所有參與者連結到一個中央機構);資訊傳播速度快,因為資訊由一個具大量計算資源的中央機構處理。 | 網路上距離最遙遠的參與者也許是近在咫尺。 資訊在整個網路廣播所需的時間可能較長。 | -| 通常效能更高(吞吐量更大,使用的計算資源總量更少)且更方便實作。 | 通常效能較低(吞吐量較小,使用的計算資源總量更多)且實作起來更為複雜。 | -| 出現資料衝突時,解決方案簡單明瞭:最終事實來源就是中央機構。 | 如果對等節點針對參與者要同步的資料狀態做出相互衝突的聲明,解決爭議時就需要一個通常較為複雜的協議。 | -| 單點失敗:惡意行為者也許能夠透過攻擊中心機構讓網路當機。 | 無單點失敗:即使相當一部分參與者遭受攻擊/下線,網路依舊能持續正常運作。 | +| 中心化系統 | 去中心化系統 | +| ------------------------------------------------------------ | -------------------------------------------------------------------- | +| 網路直徑小(所有參與者連結到一個中央機構);資訊傳播速度快,因為資訊由一個具大量計算資源的中央機構處理。 | 網路上距離最遙遠的參與者也許是近在咫尺。 資訊在整個網路廣播所需的時間可能較長。 | +| 通常效能更高(吞吐量更大,使用的計算資源總量更少)且更方便實作。 | 通常效能較低(吞吐量較小,使用的計算資源總量更多)且實作起來更為複雜。 | +| 出現資料衝突時,解決方案簡單明瞭:最終事實來源就是中央機構。 | 如果對等節點針對參與者要同步的資料狀態做出相互衝突的聲明,解決爭議時就需要一個通常較為複雜的協議。 | +| 單點失敗:惡意行為者也許能夠透過攻擊中心機構讓網路當機。 | 無單點失敗:即使相當一部分參與者遭受攻擊/下線,網路依舊能持續正常運作。 | | 網路參與者之間的協調更加簡單,且由中央機構處理。 中央機構能強迫網路參與者採納升級、協議更新等等,幾乎不會產生矛盾摩擦。 | 協調通常較困難,因為沒有任何一家代理在網路層面決策、協議升級等方面有最終決定權。 最壞情況下,如果對協議變更無法達成共識,網路可能分裂。 | -| 中央機構能審查資料,可能會阻斷部分網路與網路其他部分互動。 | 審查難度極大,因為資訊有多種途徑可以傳播到整個網路。 | -| 網路參與者受中央機構控制。 | 任何人都能參與網路,不存在任何「守門人」。 理想情況下,參與成本極低。 | +| 中央機構能審查資料,可能會阻斷部分網路與網路其他部分互動。 | 審查難度極大,因為資訊有多種途徑可以傳播到整個網路。 | +| 網路參與者受中央機構控制。 | 任何人都能參與網路,不存在任何「守門人」。 理想情況下,參與成本極低。 | 注意,這些概況可能並不適用於每個網路。 此外實際當中,網路的中心化與去中心化程度是一個範圍;沒有任何一個網路是完全中心化或完全去中心化的。 @@ -56,7 +56,7 @@ Web3 目前的一些限制: - [什麼是 Web3?](/web3/) - _ethereum.org_ - [Web 3.0 應用程式的架構](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ -- [去中心化的意義](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _2017 年 2 月 6 日 - Vitalik Buterin_ +- [去中心化的意義](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _2017 年 2 月 6日 - Vitalik Buterin_ - [去中心化的重要性](https://medium.com/s/story/why-decentralization-matters-5e3f79f7638e) _2018 年 2 月 18 日 - Chris Dixon_ - [什麼是 Web 3.0?它為什麼重要?](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _2019 年 12 月 31 日 - Max Mersch 和 Richard Muirhead_ - [為何我們需要 Web 3.0](https://medium.com/@gavofyork/why-we-need-web-3-0-5da4f2bf95ab) _2018 年 9 月 12 日 - Gavin Wood_ diff --git a/public/content/translations/zh-tw/governance/index.md b/public/content/translations/zh-tw/governance/index.md index 454a13d1a1f..7da27c6f562 100644 --- a/public/content/translations/zh-tw/governance/index.md +++ b/public/content/translations/zh-tw/governance/index.md @@ -175,9 +175,9 @@ _注意:任何人都能參與多個組別,例如,協定開發者可以支 以太坊管理體系的定義並不嚴謹。 不同社群參與者對其看法不一。 其中包括: -- [區塊鏈管理體系筆記](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [區塊鏈管理體系筆記](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [以太坊管理體系如何運作?](https://cryptotesters.com/blog/ethereum-governance) – _Cryptotesters_ - [以太坊管理體系如何運作](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a) – _Micah Zoltu_ - [以太坊核心開發者為何?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/) - _Hudson Jameson_ -- [管理體系,第二部分:金權政治仍舊令人搖頭](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [跳脫貨幣投票管理體系](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [管理體系,第二部分:金權政治仍舊令人搖頭](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [跳脫貨幣投票管理體系](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/zh-tw/roadmap/account-abstraction/index.md b/public/content/translations/zh-tw/roadmap/account-abstraction/index.md index 0e6516af626..6dcef3ef7f1 100644 --- a/public/content/translations/zh-tw/roadmap/account-abstraction/index.md +++ b/public/content/translations/zh-tw/roadmap/account-abstraction/index.md @@ -117,7 +117,7 @@ EIP-4337 也會改變錢包的運作方式。 這些功能將外包給稱為「 - [來自 Devcon Bogota 的《為何帳戶抽象對去中心化應用程式來說是革命性的改變》](https://www.youtube.com/watch?v=OwppworJGzs) - [來自 Devcon Bogota 的「帳戶抽象 ELI5」(譯註:ELI5 是「把我當五歲小孩和我解釋」的英文縮寫,指用簡單易懂的方式解釋)](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Vitalik 的《帳戶抽象之路》筆記](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Vitalik 關於社交恢復錢包的部落格文章](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Vitalik 關於社交恢復錢包的部落格文章](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [EIP-2938 筆記](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [EIP-2938 文檔](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 筆記](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/zh-tw/roadmap/verkle-trees/index.md b/public/content/translations/zh-tw/roadmap/verkle-trees/index.md index e447a6c3975..04386d35e4c 100644 --- a/public/content/translations/zh-tw/roadmap/verkle-trees/index.md +++ b/public/content/translations/zh-tw/roadmap/verkle-trees/index.md @@ -60,6 +60,6 @@ Verkle 樹測試網已經啟動並運行,但用戶端仍需要進行大量更 - [「Verkle 樹如何讓以太坊變得更加精幹而簡約」Guillaume Ballet 在 Devcon 6 發表的演講](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam 談 ETHDenver 2020 的無狀態用戶端](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Dankrad Feist 在「零知識」播客上談 Verkle 樹和無狀態用戶端](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Vitalik Buterin 談 Verkle 樹](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Vitalik Buterin 談 Verkle 樹](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist 談 Verkle 樹](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [EIP 文件:Verkle 樹](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md index 3f1f7b335b5..cbcf887f8f1 100644 --- a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK 是** Zero-Knowledge Scalable Transparent Argument of Knowledge(零 - [零知識證明:改善區塊鏈的隱私](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [零知識簡潔非交互式知識論證 — 零知識現實範例與深入探討](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [零知識可擴容透明知識論證 — 建立可驗證的信任,哪怕面對量子電腦](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [如何使零知識簡潔非交互式知識論證成真之相關簡介](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [如何使零知識簡潔非交互式知識論證成真之相關簡介](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [零知識證明是什麼?在區塊鏈中的角色為何?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/)— _LeewayHertz_ diff --git a/public/content/translations/zh/bridges/index.md b/public/content/translations/zh/bridges/index.md index 87e0c515502..fa60d9177a1 100644 --- a/public/content/translations/zh/bridges/index.md +++ b/public/content/translations/zh/bridges/index.md @@ -6,7 +6,7 @@ lang: zh # 区块链桥 {#prerequisites} -_Web3 已经发展成为一个由一层网络区块链和二层网络扩展解决方案组成的生态系统,每个解决方案都具有独特的功能和权衡。 随着区块链协议数量的增加,[跨链移动资产的需求也随之增加]()。  为了满足这一需求,我们需要桥接。_ +_Web3 已经发展成为一个由一层网络区块链和二层网络扩展解决方案组成的生态系统,每个解决方案都具有独特的功能和权衡。 随着区块链协议数量的增加,[跨链移动资产的需求也随之增加](https://dune.xyz/eliasimos/Bridge-Away-(from-Ethereum))。 为了满足这一需求,我们需要桥接。_ @@ -18,7 +18,7 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 你来自美国,正计划去欧洲旅行。 你有美元,但你需要欧元来消费。 要将你的美元兑换成欧元,你可以使用货币兑换并支付少量费用。 -但是,如果你想使用不同的区块链进行类似的兑换,您会怎么做? 假设你想用以太坊主网的以太币兑换 [Arbitrum](https://arbitrum.io/) 上的以太币。 就像我们为欧元进行的货币兑换一样,我们需要一种机制将我们的以太币从以太坊转移到 Arbitrum。 桥梁使这种交易成为可能。 在本例中,[Arbitrum 有一个原生桥梁](https://bridge.arbitrum.io/),可以将以太币从主网转移到 Arbitrum。 +但是,如果你想使用不同的区块链进行类似的兑换,你会怎么做? 假设你想用以太坊主网的以太币兑换 [Arbitrum](https://arbitrum.io/) 上的以太币。 就像我们为欧元进行的货币兑换一样,我们需要一种机制将我们的以太币从以太坊转移到 Arbitrum。 桥梁使这种交易成为可能。 在本例中,[Arbitrum 有一个原生桥梁](https://bridge.arbitrum.io/),可以将以太币从主网转移到 Arbitrum。 ## 我们为什么需要桥梁? {#why-do-we-need-bridges} @@ -30,7 +30,7 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 桥梁能够: -- 跨链传输资产和信息 +- 跨链传输资产和信息。 - 使去中心化应用程序可以利用各种区块链的优势 - 从而增强它们的能力(因为协议现在有更多的创新设计空间)。 - 使用户能够访问新平台并利用不同链的优势。 - 使来自不同区块链生态系统的开发人员相互协作并为用户构建新平台。 @@ -57,7 +57,7 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 ### 拥有原生加密资产 {#own-native} -如果你只有以太坊网络资产但想拥有原生比特币, 你可以先兑换得到以太坊上的 BTC - WBTC(Wrapped Bitcoin), 但 WBTC 是以太坊网络上的 ERC-20 代币,仍不是原生比特币。 然后你可以通过跨链桥,将资产从以太坊网络跨到比特币网络, 即将 WBTC 转换为原生 BTC。 当然你也可以反向跨链,通过跨链桥,将原生 BTC 转换为 WBTC, 用于以太坊网络的 DeFi 协议中。 +如果你只有以太坊网络资产但想拥有原生比特币, 你可以先兑换得到以太坊上的 BTC - WBTC(Wrapped Bitcoin), 但 WBTC 是以太坊网络上的 ERC-20 代币,仍不是原生比特币。 然后你可以通过跨链桥,将资产从以太坊网络跨到比特币网络, 即将 WBTC 转换为原生 BTC。 或者,你可能拥有以太币并希望在以太坊去中心化金融协议中使用。 用于以太坊网络的 DeFi 协议中。 你还可以使用中心化交易所完成上述所有操作。 但是,除非你的资金已经在交易所,否则将涉及多个步骤,而且你最好使用桥梁。 @@ -67,17 +67,17 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 ## 桥梁类型 {#types-of-bridge} -桥梁具有各种设计和复杂程度。 一般来说,桥梁分为两类:需信任桥梁和免信任桥梁。 +桥梁具有各种设计和复杂程度。 一般来说,桥梁分为两类:需信任桥梁和去信任桥梁。 -| 需信任桥梁 | 免信任桥梁 | -| ------------------------------------------------------------------------- | ---------------------------------------------------------- | -| 需信任桥梁依赖于中心实体或系统的运作。 | 免信任桥梁使用智能合约和算法运行。 | +| 需信任桥梁 | 去信任桥梁 | +| ------------------------------------- | ----------------------------- | +| 需信任桥梁依赖于中心实体或系统的运作。 | 去信任桥梁使用智能合约和算法运行。 | | 他们对资金的保管和桥梁的安全性有信任假设。 用户大多依赖桥梁运营商的声誉。 | 这种桥梁免于信任,即桥梁的安全性与底层区块链的安全性相同。 | -| 用户需要放弃对其加密资产的控制。 | 通过智能合约,免信任桥梁使用户能够继续控制他们的资金。 | +| 用户需要放弃对其加密资产的控制。 | 通过智能合约,去信任桥梁使用户能够继续控制他们的资金。 | -简而言之,我们可以说需信任桥梁具有信任假设,而免信任桥梁对信任的依赖非常小,因此不会在基础域之外出现新的信任假设。 上述术语的解释如下: +简而言之,我们可以说需信任桥梁具有信任假设,而去信任桥梁对信任的依赖非常小,因此不会在基础域之外出现新的信任假设。 上述术语的解释如下: -- **免信任**:与底层域具有同等的安全性。 如 [Arjun Bhuptani 在本文中所述。](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) +- **去信任**:与底层域具有同等的安全性。 如 [Arjun Bhuptani 在本文中所述。](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) - **信任假设**:通过在系统中添加外部验证者来摆脱底层域的安全性,从加密经济学的角度来说,这降低了安全性。 为了更好地理解这两种方法之间的主要区别,我们来举个例子: @@ -89,9 +89,9 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 手动检查站类似于需信任模式,因为它依赖于第三方(即工作人员)进行操作。 作为用户,你相信工作人员会做出正确的决定并正确使用你的私人信息。 -自助值机类似于免信任模式,因为它不再需要操作员,而是利用技术进行操作。 用户始终可以控制他们的数据,并且不必信任第三方来处理他们的私人信息。 +自助值机类似于去信任模式,因为它不再需要操作员,而是利用技术进行操作。 用户始终可以控制他们的数据,并且不必信任第三方来处理他们的私人信息。 -许多桥梁解决方案采用的模式介于这两个极端之间,具有不同的免信任度。 +许多桥梁解决方案采用的模式介于这两个极端之间,具有不同的去信任度。 @@ -115,7 +115,7 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 - 桥梁运营商对需信任桥梁有恶意 - 桥梁被非法侵入 -最近的一次黑客攻击是 Solana 的虫洞桥,[在黑客攻击期间被窃取了 12 万 wETH(3.25 亿美元)](https://rekt.news/wormhole-rekt/)。 [区块链中的许多顶级黑客攻击都涉及到桥梁](https://rekt.news/leaderboard/)。 +最近的一次黑客攻击是 Solana 的虫洞桥,[在黑客攻击期间被窃取了 12 万 包装以太币(3.25 亿美元)](https://rekt.news/wormhole-rekt/)。 [区块链中的许多顶级黑客攻击都涉及到桥梁](https://rekt.news/leaderboard/)。 桥梁对于让用户加入以太坊二层网络至关重要,甚至对于想要探索不同生态系统的用户也至关重要。 然而,鉴于与桥梁交互所涉及的风险,用户必须了解桥梁正在做出的权衡取舍。 这些是一些确保[跨链安全的策略](https://blog.debridge.finance/10-strategies-for-cross-chain-security-8ed5f5879946)。 @@ -124,11 +124,11 @@ _Web3 已经发展成为一个由一层网络区块链和二层网络扩展解 ## 延伸阅读 {#further-reading} - [EIP-5164:跨链执行](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658)_2022 年 6 月 18 日 - Brendan Asselstine_ -- [二层网络桥梁风险框架](https://gov.l2beat.com/t/l2bridge-risk-framework/31) _2022 年 7 月 5 日 - Bartek Kiepuszewski_ +- [二层网络桥梁风险框架](https://gov.l2beat.com/t/l2bridge-risk-framework/31) _2022 年 7 月 5日 - Bartek Kiepuszewski_ - [“为什么未来将出现多链,而不会是跨链。”](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) _2022 年 1 月 8 日 - Vitalik Buterin_ - [什么是区块链桥以及我们如何对其进行分类?](https://blog.li.finance/what-are-blockchain-bridges-and-how-can-we-classify-them-560dc6ec05fa) _2021 年 2 月 18 日 - Arjun Chand_ - [什么是跨链桥接?](https://www.alchemy.com/overviews/cross-chain-bridges) _2022 年 5 月 10 日 - Alchemy_ -- [区块链桥:构建加密网络的网络](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) _2021 年 9 月 8 日 - Dmitriy Berenzon_ +- [区块链桥:构建加密网络的网络](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) _2021 年 9 月 8 日 - Dmitriy Berenzon _ - [加密空间中的桥梁](https://medium.com/chainsafe-systems/bridges-in-crypto-space-12e158f5fd1e) _2021 年 8 月 23 日 - Ben Adar Hyman_ - [互操作性三难困境](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) _2021 年 10 月 1 日 - Arjun Bhuptani_ - [保护桥梁:正确完成跨链通信](https://medium.com/dragonfly-research/secure-the-bridge-cross-chain-communication-done-right-part-i-993f76ffed5d) _2021 年 8 月 23 日 - Celia Wan_ diff --git a/public/content/translations/zh/community/code-of-conduct/index.md b/public/content/translations/zh/community/code-of-conduct/index.md new file mode 100644 index 00000000000..8a6de0a2dcf --- /dev/null +++ b/public/content/translations/zh/community/code-of-conduct/index.md @@ -0,0 +1,75 @@ +--- +title: 行为守则 +description: 我们在以太坊社区中严格恪守的准则 +lang: zh +--- + +## 使命 {#mission} + +开发和维护最全面、触手可及的以太坊知识中心。 + +## 价值观 {#values} + +Ethereum.org 社区致力于实现: + +- 教育性,旨在帮助每个人了解以太坊 +- 包容性 +- 可访问性 +- 社区驱动 +- 专注于以太坊的基础技术和用例 +- 专注于以太坊的概念和设计原则 + +## 我们不是 {#what-we-are-not} + +- 以太坊基金会网站 +- 鼓吹投资或牟取暴利的平台 +- 鼓励或支持个别项目或组织的平台 +- 去中心化交易所、中心化交易所或任何其他形式的金融平台 +- 提供任何类型的财务或法律建议的平台 + +## 行为守则 {#code-of-conduct} + +### 承诺 {#pledge} + +开放参与是 ethereum.org 的核心理念。 我们的网站和社区由成千上万的贡献者共同维护,只有当我们维持热情友好的参与环境时,这一点才有可能实现。 为此,本网站的贡献者承诺为所有 ethereum.org 平台及社区空间的参与者维持一个零骚扰的环境。 Ethereum.org 社区欢迎并重视希望以建设性和友好的方式参与进来的任何人,无论其年龄、残疾、族裔、性别特征、性别认同、经验水平、专业领域、教育程度、社会经济地位、国籍、个人外貌、种族、宗教或任何其他方面的多样性。 + +### 适用范围 {#scope} + +本行为准则适用于所有 ethereum.org 空间(如 GitHub、Discord、Figma、Crowdin、Twitter 和其他在线平台),也适用于在现实世界的公共场所(如聚会、会议和活动)代表社区的情况。 + +### 我们的准则 {#our-standards} + +下面是一些有助于创造积极环境的行为范例: + +- 使用友善包容的语言 +- 尊重不同的观点和经验 +- 优雅地接受并/或以同理心提供建设性批评 +- 冷静专业地处理争议或分歧 +- 对其他社区成员展现同理心以及友善包容的态度 +- 鼓励和支持社区中的新奇观点 + +禁止参与者进行以下不端行为: + +- 任何形式的身体暴力,以身体暴力相威胁或鼓动身体暴力 +- 使用性挑逗的语言或图像,或存在冒犯性的性企图 +- 冒充他人或虚假宣称与某个个人或组织有关联。 +- 嘲弄、侮辱/诋毁性评论,以及人身或政治攻击 +- 在公共或私密频道对其他社区成员进行骚扰 +- 未经明确许可发布他人的私人信息,如住址或电子邮箱 +- 社会工程学攻击、欺骗或以其他方式操控其他社区成员 +- 以为个人谋取金钱或非金钱收益为目的,鼓吹投资、代币、项目等 +- 发布与主题无关内容,对服务器进行垃圾邮件攻击 +- 无视社区管理员的要求或警告 +- 进行其他任何被视为在专业场合不适宜的行为 + +### 举报 {#reporting} + +通常情况下,违反行为准则的行为会引起社区关注,因为我们致力于通过公开透明的渠道处理事务,并鼓励社区成员进行自我监督。 + +然而,如果你发现了需要关注的事情,可以向担任管理职责的人(例如,discord 督导)提出,这样他们就可以帮助调查并做出适当的响应。 + +举报时,请尽量多提供细节,包括描述具体的事情和发生时间等。 这将有助于获得公正的结果。 + +### 惩罚措施 {#enforcement} + +根据严重程度不同,违反行为准则的人会受到 ethereum.org 社区的警告、暂时或永久封禁。 diff --git a/public/content/translations/zh/community/events/index.md b/public/content/translations/zh/community/events/index.md index 180ef44b748..f6d248ceea8 100644 --- a/public/content/translations/zh/community/events/index.md +++ b/public/content/translations/zh/community/events/index.md @@ -7,7 +7,7 @@ hideEditButton: true ## 活动预告 {#events} -**每个月,世界各地都会举办大型以太坊活动。**您可以考虑参加附近的一个活动,认识更多的社区成员,了解就业机会,并培养新的技能。 +**每个月,世界各地都会举办大型以太坊活动。**你可以考虑参加附近的一个活动,认识更多的社区成员,了解就业机会,并培养新的技能。 @@ -15,10 +15,10 @@ hideEditButton: true ## 以太坊聚会 {#meetups} -找不到适合您的活动? 尝试加入一个聚会。 聚会是指由各个以太坊爱好者团体举办的小型活动——这是对以太坊感兴趣的人们聚集在一起的机会,他们可以一起谈论并了解以太坊的最新发展。 +找不到适合你的活动? 尝试加入一个聚会。 聚会是指由各个以太坊爱好者团体举办的小型活动——这是对以太坊感兴趣的人们聚集在一起的机会,他们可以一起谈论并了解以太坊的最新发展。 有兴趣举办自己的聚会? 查看 [BUIDL 网络](https://consensys.net/developers/buidlnetwork/),这是由 ConsenSys 发起的一项举措,旨在帮助支持以太坊的各个聚会社区。 -这是一个由我们社区制定的不完整列表。 您可以[在此处查找更多以太坊聚会](https://www.meetup.com/topics/ethereum/)。 想要将了解到的活跃聚会小组添加到此列表? [请添加](https://github.com/ethereum/ethereum-org-website/blob/dev/src/data/community-meetups.json)! +这是一个由我们社区制定的不完整列表。 你可以[在此处查找更多以太坊聚会](https://www.meetup.com/topics/ethereum/)。 想要将了解到的活跃聚会小组添加到此列表? [请添加](https://github.com/ethereum/ethereum-org-website/blob/dev/src/data/community-meetups.json)! diff --git a/public/content/translations/zh/community/get-involved/index.md b/public/content/translations/zh/community/get-involved/index.md index b012886b895..d3dd970bdc5 100644 --- a/public/content/translations/zh/community/get-involved/index.md +++ b/public/content/translations/zh/community/get-involved/index.md @@ -6,14 +6,16 @@ lang: zh # 如何加入? {#get-involved} -以太坊社区中的成员具有许多不同的背景和技能。 无论您是开发人员、艺术家还是会计师,都可以加入。 以下建议列表可能会帮助您开始加入。 +以太坊社区中的成员具有许多不同的背景和技能。 无论你是开发人员、艺术家还是会计师,都可以加入。 以下建议列表可能会帮助你开始加入。 + +首先,在我们的[行为准则](/community/code-of-conduct)中,阅读并了解 ethereum.org 的使命和价值观。 ## 开发人员 {#developers} - 访问 [ethereum.org/developers/](/developers/),了解和尝试使用以太坊 - [在 Gitcoin 上查找悬赏](https://gitcoin.co/),解决一个或大或小的技术问题,赚取加密货币! -- 参加您附近的一个 [ETHGlobal](http://ethglobal.co/) 黑客马拉松活动! -- 查看[与您的专业领域或所选编程语言相关的项目](/developers/docs/programming-languages/) +- 参加你附近的一个 [ETHGlobal](http://ethglobal.co/) 黑客马拉松活动! +- 查看[与你的专业领域或所选编程语言相关的项目](/developers/docs/programming-languages/) - 观看或参与[核心开发人员电话会议](https://www.youtube.com/playlist?list=PLaM7G4Llrb7zfMXCZVEXEABT8OSnd4-7w) - [生态系统支持计划的愿望清单](https://esp.ethereum.foundation/wishlist/) - 适用于工具、文档和基础设施领域,以太坊生态系统支持计划正在积极寻求这些领域的资助申请 - [Web3Bridge](https://www.web3bridge.com/) - 加入有抱负的 web3 社区,一起积极寻找、培训和支持整个非洲的数百名开发人员和社区成员 @@ -21,9 +23,19 @@ lang: zh ## 研究人员 & 学者 ‍ {#researchers-and-academics} -您是否有数学、加密或经济学方面的背景? 您可能会对以太坊生态系统中正在进行的一些前沿工作感兴趣 - -- [Challenges.ethereum.org](https://challenges.ethereum.org/) - 一系列高额研究奖金,您可以从中赚取 >100,000 美元 +你是否有数学、密码学或经济学方面的背景? 你可能会对以太坊生态系统中正在进行的一些前沿工作感兴趣: + +- 撰写或审查以太坊改进提案 + - 撰写以太坊改进提案 + 1. 在[以太坊魔术师](https://ethereum-magicians.org)论坛上提交你的创想 + 2. 查阅 [EIP-1](https://eips.ethereum.org/EIPS/eip-1) - **是的,请阅读_整份_文件。** + 3. 请遵循 EIP-1 中的指导准则。 在撰写提案草案时,请参考 EIP-1。 + - 了解如何成为[以太坊改进提案编辑人员](https://eips.ethereum.org/EIPS/eip-5069) + - 你现在即可对以太坊改进提案进行同行评审! 请参阅[打开带有 `e-review` 标签的同行评审](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review)。 在 `discussion-to` 链接上提供技术反馈。 + - 参与[以太坊改进提案治理](https://github.com/ethereum-cat-herders/EIPIP) + - 加入[以太坊牧猫人组织 Discord](https://discord.io/EthCatHerders) + - [关于以太坊改进提案的更多信息](/eips/) +- [Challenges.ethereum.org](https://challenges.ethereum.org/) - 一系列高额研究奖金,让你可以赚取超过 $100,000 USD - [Ethresear.ch](https://ethresear.ch) - 以太坊的主要研究论坛,也是世界上最具影响力的加密经济学论坛 - [以太坊基金会研究团队 AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) - 正在进行中的研究人员问答系列。 下一部分开放时,任何人都可以提出问题。 - [生态系统支持计划愿望清单](https://esp.ethereum.foundation/wishlist/) - 介绍以太坊生态系统支持计划正在积极征询资助申请的研究领域 @@ -32,9 +44,9 @@ lang: zh ## 非技术技能组合 ‍ {#non-technical} -如果你不是开发人员,可能很难知道以太坊如何入门。 下面提供几项建议以及针对特定专业背景的资源。 +如果你不是开发者,可能很难知道以太坊如何入门。 下面提供几项建议以及针对特定专业背景的资源。 -### 在您的城市组织一场小聚会 {#meetups} +### 在你的城市组织一场小聚会 {#meetups} - 不知道如何开始? [BUIDL 网络](https://consensys.net/developers/buidlnetwork/)可以提供帮助。 @@ -45,20 +57,20 @@ lang: zh ### 主动提出为社区电话会议做会议纪要 {#take-notes} -- 现在有许多开源社区电话会议,有人记录会议纪要将是一个极大的帮助。 如果您感兴趣,请加入 [Ethereum Cat Herders discord](https://discord.com/invite/Nz6rtfJ8Cu),并做简短的自我介绍! +- 现在有许多开源社区电话会议,有人记录会议纪要将是一个极大的帮助。 如果你感兴趣,请加入 [Ethereum Cat Herders discord](https://discord.com/invite/Nz6rtfJ8Cu),并做简短的自我介绍! -### 将以太坊的相关文章翻译成您的母语 {#translate-ethereum} +### 将以太坊的相关文章翻译成你的母语 {#translate-ethereum} - ethereum.org 具有一个翻译计划,可将网站和其他资源翻译成多种语言 - 点击[这里](/contributing/translation-program)了解如何参与 ### 运行节点 {#run-a-node} -与数千位节点运营商一起帮助以太坊进一步去中心化。 +加入数千位节点运营商的行列,共同加强以太坊的去中心化。 - [关于如何运行节点的更多信息](/developers/docs/nodes-and-clients/run-a-node/) -### 质押您的以太币 {#staking} +### 质押你的以太币 {#staking} 通过质押以太币,你不但可以获得奖励,还能够帮助保护以太坊网络。 @@ -74,11 +86,11 @@ lang: zh ## 金融专业人士 & 会计师 ‍ {#financial-professionals} - 以太坊是“去中心化金融”生态系统的发源地,该系统是一个提供替代金融系统的协议和应用程序网络。 如果你是金融专业人士,可以查看 [DeFi Llama](https://defillama.com/) 或 [defprime](https://defiprime.com) 上的一些去中心化金融应用程序 -- 会计师? 以太坊上的资产(以太币、令牌、去中心化金融等)带来了许多新的会计问题。 您可以从查看一些项目开始,帮助加密货币用户克服他们的记账 & 会计挑战,如 [Rotki](https://rotki.com/) +- 会计师? 以太坊上的资产(以太币、令牌、去中心化金融等)带来了许多新的会计问题。 你可以从查看一些项目开始,帮助加密货币用户克服他们的记账 & 会计挑战,如 [Rotki](https://rotki.com/) ## 产品经理 ‍ {#product-managers} -- 以太坊生态系统需要有才之士! 许多公司正在招聘产品经理。 如果您想从为开源项目做贡献开始,请联系 [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) 或 [MetaCartel](https://www.metacartel.org/) +- 以太坊生态系统需要有才之士! 许多公司正在招聘产品经理。 如果你想从为开源项目做贡献开始,请联系 [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) 或 [MetaCartel](https://www.metacartel.org/) ## 市场营销 ‍ {#marketing} @@ -105,7 +117,7 @@ lang: zh ## 加入去中心化自治组织 {#decentralized-autonomous-organizations-daos} -“DAO”是指去中心化自治组织。 这些团队利用以太坊技术促进组织和协作。 例如,成员资格管理、提案投票或联合资产管理。 虽然去中心化自治组织仍处于试验阶段,但它们提供了机会,让你找到自己认同的团队,找到合作者并且扩大自己对以太坊社区的影响。 [关于去中心化自治组织的更多信息](/dao/) +“DAO”是指去中心化自治组织。 这些团队利用以太坊技术促进组织和协作。 例如,用于成员资格管理、提案投票或联合资产管理。 虽然去中心化自治组织仍处于试验阶段,但它们提供了机会,让你找到自己认同的团队,找到合作者并且扩大自己对以太坊社区的影响。 [更多关于去中心化自治组织的信息](/dao/) - [DAOSquare](https://www.daosquare.io) [@DAOSquare](https://twitter.com/DAOSquare) - _在非技术领域推广去中心化自治组织这一概念,帮助人们通过去中心化自治组织创造价值_ - [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _由相信互联网为集体所有的构建者组成的社区_ @@ -122,3 +134,5 @@ lang: zh - [ΜΓΔ](https://metagammadelta.com/) (Meta Gamma Delta) [@metagammadelta](https://twitter.com/metagammadelta) - _女性主导的项目_ - [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - _专注于资助以太坊发展的社区_ - [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - _由 Web3 构建者组成的团队_ + +请记住,无论何时,无论通过何种方式,在为 ethereum.org 做贡献时,都请遵守 ethereum.org [行为准则](/community/code-of-conduct)! diff --git a/public/content/translations/zh/community/grants/index.md b/public/content/translations/zh/community/grants/index.md index b31f847861b..ab8fefc7ff8 100644 --- a/public/content/translations/zh/community/grants/index.md +++ b/public/content/translations/zh/community/grants/index.md @@ -6,7 +6,7 @@ lang: zh # 以太坊资助 {#ethereum-grants} -下面列出的方案为向致力于促进以太坊生态系统成功和发展的项目提供各种资金支持。 根据本指南来寻求和申请资金,助力您的以太坊项目成功。 +下面列出的方案为向致力于促进以太坊生态系统成功和发展的项目提供各种资金支持。 根据本指南来寻求和申请资金,助力你的以太坊项目成功。 这个列表由我们的社区管理。 如果有内容缺失或错误,请编辑此页面! @@ -15,31 +15,27 @@ lang: zh 这些计划通过向大量项目提供资助来支持庞大的以太坊生态系统。 其中包括可扩容性、社区建设、安全、隐私等解决方案。 这些资助并非专门针对任何一个以太坊平台,如果不确定,可以从这里开始。 - [以太坊基金会生态系统资助方案](https://esp.ethereum.foundation) - _资助有利于以太坊的开源项目,重点资助通用工具、基础设施、研究和公共物品_ -- [以太坊意见征求](https://github.com/ethereum/requests-for-proposals) - _以太坊基金会对以太坊生态系统中的工作和项目提出的建议要求_ - [MetaCartel](https://www.metacartel.org/grants/) - _去中心化应用程序开发、去中心化自治组织创建_ - [Moloch 去中心化自治组织](https://www.molochdao.com/) - _隐私、二层网络扩容、客户端安全性等_ -- [开放资助](https://opengrants.com/explore) -- [DAO 资助](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _Google 资助组织电子表格_ -- [Web3 资助 Crunchbase](https://www.cryptoneur.xyz/web3-grants) - _按类别、用例、金额等筛选和搜索资助。 致力于帮助他人找到合适的资助。_ +- [去中心化自治组织资助](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _资助组织的 Google 电子表格_ +- [Crunchbase for Web3 资助](https://www.cryptoneur.xyz/web3-grants) - _按类别、用例、金额等筛选和搜索资助。 致力于帮助他人找到合适的资助。_ - [学术资助](https://esp.ethereum.foundation/academic-grants) - _为以太坊相关学术工作提供资助_ +- [Blockworks Grantfarm](https://blockworks.co/grants/programs) - _Blockworks 编译了一份包含所有资助、提案征求和漏洞悬赏的完整名录。_ ## 特定项目 {#project-specific} 这些项目为旨在开发和实验自己技术的项目建立了自己的资助。 - [Aave 资助方案](https://aavegrants.org/) – _[Aave](https://aave.com/) 资助去中心化自治组织_ -- [Balancer](https://balancergrants.notion.site/Balancer-Community-Grants-23e562c5bc4347cd8304637bff0058e6) – _[Balancer](https://balancer.fi/) 生态系统基金_ +- [Balancer](https://quark-ceres-740.notion.site/Balancer-Grants-938f1b979810427f8d903a904315da41) – _[Balancer](https://balancer.fi/) 生态系统基金_ - [Chainlink 资助方案](https://chain.link/community/grants) - _[Chainlink](https://chain.link/) 社区资助_ -- [Compound 资助方案](https://compoundgrants.org/) – _[Compound](https://compound.finance/) 金融生态系统_ -- [Decentraland 资助方案](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) DAO Metaverse_ -- [Lido 生态系统资助组织 (LEGO)](https://lego.lido.fi/) – _[Lido](https://lido.fi/) 金融生态系统_ +- [Decentraland 资助方案](https://governance.decentraland.org/grants/) – _[Decentraland](https://decentraland.org/) 去中心化自治组织元宇宙_ +- [Lido 生态系统资助组织 (LEGO)](https://lido.fi/lego) – _[Lido](https://lido.fi/) 金融生态系统_ - [MetaMask 方案](https://metamaskgrants.org/) - _-[MetaMask](https://metamask.io/) 员工主导的资助去中心化自助组织_ -- [mStable 资助方案](https://docs.mstable.org/advanced/grants-program) - _[mStable](https://mstable.org/) 社区_ - [SKALE 网络资助方案](https://skale.space/developers#grants) - _[SKALE 网络](https://skale.space/)生态系统_ - [The Graph](https://airtable.com/shrdfvnFvVch3IOVm) – _[The Graph](https://thegraph.com/) 生态系统_ -- [UMA 资助方案](https://grants.umaproject.org/) - _[UMA](https://umaproject.org/) 开发者支持_ -- [Uniswap 资助方案](https://www.unigrants.org/) – _[Uniswap](https://uniswap.org/) 社区_ -- [Web3 资助](https://web3grants.net) - _Web3/加密货币相关资助方案详尽列表_ +- [Uniswap 资助方案](https://www.uniswapfoundation.org/apply-for-a-grant) - _[Uniswap](https://uniswap.org/) 社区_ +- [Web3 Grants](https://web3grants.net) - _Web3/ 加密货币相关资助方案详尽清单_ ## 二次方融资 {#quadratic-funding} @@ -50,4 +46,4 @@ lang: zh ## 在以太坊工作 {#work-in-ethereum} -没有准备好启动您自己的项目? 有数百家公司正在积极寻求热情人士的加入,为以太坊生态系统奉献力量。 正在寻找更多信息? [点击查看更多以太坊相关工作](/community/get-involved/#ethereum-jobs) +没有准备好启动你自己的项目? 有数百家公司正在积极寻求热情人士的加入,为以太坊生态系统奉献力量。 正在寻找更多信息? [点击查看更多以太坊相关工作](/community/get-involved/#ethereum-jobs) diff --git a/public/content/translations/zh/community/language-resources/index.md b/public/content/translations/zh/community/language-resources/index.md index f41170aaa65..99559bd18de 100644 --- a/public/content/translations/zh/community/language-resources/index.md +++ b/public/content/translations/zh/community/language-resources/index.md @@ -10,15 +10,15 @@ lang: zh 我们的目标是提供所有语言的教育内容,帮助世界各地的人们克服语言障碍,成功加入以太坊社区。 -如果您更喜欢用您的母语阅读或者知道某人不会说英语,您可以在下面找到有用的非英语资源列表。 数十万以太坊爱好者齐聚这些在线论坛,分享消息、谈论近来的发展、热烈讨论技术问题并畅想未来。 +如果你更喜欢用你的母语阅读或者知道某人不会说英语,你可以在下面找到有用的非英语资源列表。 数十万以太坊爱好者齐聚这些在线论坛,分享消息、谈论近来的发展、热烈讨论技术问题并畅想未来。 -知道一个您语言的教育资源? [创建问题](https://github.com/ethereum/ethereum-org-website/issues/new/choose),以将其添加到列表! +知道一个你语言的教育资源? [创建问题](https://github.com/ethereum/ethereum-org-website/issues/new/choose),以将其添加到列表! ## Ethereum.org 资源 {#ethereum-org} Ethereum.org 被地道地翻译成 40 多种语言,请参阅我们的[语言页面](/languages)。 -如果您会使用两种语言,而且想帮助我们宣传到更多的人,您也可以参与 [ethereum.org 翻译计划](/contributing/translation-program/#translation-program),帮助我们翻译该网站。 +如果你会使用两种语言,而且想帮助我们宣传到更多的人,你也可以参与 [ethereum.org 翻译计划](/contributing/translation-program/#translation-program),帮助我们翻译该网站。 ## 社区资源 {#community} @@ -72,7 +72,7 @@ Ethereum.org 被地道地翻译成 40 多种语言,请参阅我们的[语言 - [Gwei.cz](https://gwei.cz) - 当地 Web3 社区,制作教育内容,组织在线和现场活动 - [Gwei.cz Příručka](https://prirucka.gwei.cz/) - 以太坊初学者指南 - [DAO Příručka](https://dao.gwei.cz/) - 去中心化自治组织初学者指南 -- [精通以太坊](https://ipfs.infura-ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - 精通以太坊(捷克语) +- [精通以太坊](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - 精通以太坊(捷克语) ### 法语 {#fr} diff --git a/public/content/translations/zh/community/online/index.md b/public/content/translations/zh/community/online/index.md index 89d0677e2e2..bf90abe10df 100644 --- a/public/content/translations/zh/community/online/index.md +++ b/public/content/translations/zh/community/online/index.md @@ -27,10 +27,10 @@ lang: zh EthStaker Discord - 社区为现有和潜在的质押人提供的指导、教育、支持和资源。 Ethereum.org 网站团队 - 拜访社区中的团队和成员并与他们讨论 ethereum.org 的网络开发和设计 Matos Discord - Web3 创作者社区,构建者、业界人士和以太坊爱好者在这里聚会。 我们热衷于 Web3 的开发、设计和文化。 来吧,我们一起来构建。 -Solidity Gitter - 有关 Solidity 开发的聊天 (Gitter) +Solidity Gitter - 有关 Solidity 开发的聊天 (Gitter) Solidity Matrix - 有关 Solidity 开发的聊天 (Matrix) -以太坊堆栈交易所 _- 问答论坛_ -Peeranha _- 去中心化问答论坛_ +以太坊堆栈交易所 *- 问答论坛* +Peeranha *- 去中心化问答论坛* ## YouTube 和 Twitter {#youtube-and-twitter} diff --git a/public/content/translations/zh/community/research/index.md b/public/content/translations/zh/community/research/index.md new file mode 100644 index 00000000000..f28dfe561c5 --- /dev/null +++ b/public/content/translations/zh/community/research/index.md @@ -0,0 +1,395 @@ +--- +title: 活跃的以太坊研究领域 +description: 探索不同的开放研究领域,并了解如何参与其中。 +lang: zh +--- + +# 活跃的以太坊研究领域 {#active-areas-of-ethereum-research} + +以太坊的一项主要优势就在于一个高度活跃的研究与工程社区在不断改进它。 全世界许多充满热情且技术熟练的人都希望致力于解决以太坊中尚未解决的问题,但找出这些问题的根源往往不那么容易。 本页概述了以太坊重要的活跃研究领域,作为对以太坊最前沿领域的粗略指南。 + +## 以太坊研究如何进行 {#how-ethereum-research-works} + +以太坊的研究开放透明,体现[去中心化科学 (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science) 的准则。 其文化致力于最大程度上提升研究工具及成果的开放性和交互性,例如通过可执行笔记本。 以太坊研究进展迅速,新的研究成果会在 [ethresear.ch](https://ethresear.ch/) 等论坛上发布并公开讨论,而不是通过传统的发布方式,在经过几轮同行评审后才能向社区传播。 + +## 通用研究资源 {#general-research-resources} + +不管是哪种具体主题,都可以在 [ethresear.ch](https://ethresear.ch) 和 [以太坊研发 Discord 频道](https://discord.gg/qGpsxSA)上找到大量和以太坊研究相关的信息。 这些是以太坊研究人员讨论最新想法和开发机会的主要平台。 + +[DelphiDigital](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) 在 2022 年 5 月发布的这份报告对以太坊路线图进行了精彩的概述。 + +## 资金来源 {#sources-of-funding} + +你可以参与以太坊研究,并因此获得报酬! 例如,[以太坊基金会](/foundation/)近期开展了一轮[学术资助活动](https://esp.ethereum.foundation/academic-grants)。 可以在[以太坊资助页面](/community/grants/)找到相关信息,了解目前正在进行和即将开展的资助机会。 + +## 协议研究 {#protocol-research} + +协议研究关注以太坊的基础层,基础层指一系列规则,它们定义节点如何连接、通信、交换和储存以太坊数据以及就区块链状态达成共识。 协议研究分为两个层类别:共识和执行。 + +### 共识 {#consensus} + +共识研究关注[以太坊的权益证明机制](/developers/docs/consensus-mechanisms/pos/)。 下面是一些共识研究课题的示例: + +- 发现和修补漏洞; +- 量化加密经济安全性; +- 提高客户端实现的安全性或性能; +- 以及开发轻客户端。 + +还开展了一些前瞻性研究并对协议进行一些重大重新设计(例如单时隙最终确定性),以实现以太坊的重要改进。 此外,共识客户端之间对等网络的效率、安全性和监测也是重要的研究课题。 + +#### 背景阅读 {#background-reading} + +- [权益证明简介](/developers/docs/consensus-mechanisms/pos/) +- [“Casper-FFG”论文](https://arxiv.org/abs/1710.09437) +- [友好确定工具 Casper 之解说](https://arxiv.org/abs/1710.09437) +- [Gasper 论文](https://arxiv.org/abs/2003.03052) + +#### 近期研究 {#recent-research} + +- [Ethresear.ch共识](https://ethresear.ch/c/consensus/29) +- [可用性/确定性困境](https://arxiv.org/abs/2009.04987) +- [单时隙确定性](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) +- [提议者-构建者分离](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) + +### 执行 {#execution} + +执行层专注于执行交易、运行[以太坊虚拟机 (EVM)](/developers/docs/evm/) 并生成执行有效载荷以传递给共识层。 有许多活跃的研究领域,包括: + +- 构建轻客户端支持; +- 研究燃料限制; +- 以及采用新数据结构(例如沃克尔树)。 + +#### 背景阅读 {#background-reading-1} + +- [以太坊虚拟机 (EVM) 简介](/developers/docs/evm) +- [Ethresear.ch 执行层](https://ethresear.ch/c/execution-layer-research/37) + +#### 近期研究 {#recent-research-1} + +- [数据库优化](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) +- [状态数据到期](https://notes.ethereum.org/@vbuterin/state_expiry_eip) +- [状态到期路径](https://hackmd.io/@vbuterin/state_expiry_paths) +- [沃克尔树和状态到期提案](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) +- [历史数据管理](https://eips.ethereum.org/EIPS/eip-4444) +- [沃克尔树](https://vitalik.eth.limo/general/2021/06/18/verkle.html) +- [数据可用性采样](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) + +## 客户端开发 {#client-development} + +以太坊客户端是以太坊协议的实现。 客户端开发通过将协议研究的成果融入客户端中,让这些成果转化为现实。 客户端开发包括升级客户端规范和搭建具体实现方案。 + +一个以太坊节点需要运行两个软件: + +1. 一个共识客户端,用于追踪区块链头部、传播区块并处理共识逻辑 +2. 一个执行客户端,用于支持以太坊虚拟机并执行交易和智能合约 + +关于节点和客户端更多详细信息以及当前所有客户端实现的清单,请参阅[节点和客户端页面](/developers/docs/nodes-and-clients/)。 你也可以在[历史页面](/history/)找到所有以太坊升级的历史信息。 + +### 执行客户端 {#execution-clients} + +- [执行客户端规范](https://github.com/ethereum/execution-specs) +- [执行应用程序接口规范](https://github.com/ethereum/execution-apis) + +### 共识客户端 {#consensus-clients} + +- [共识客户端规范](https://github.com/ethereum/consensus-specs) +- [信标应用程序接口规范](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) + +## 扩容和性能 {#scaling-and-performance} + +以太坊扩容是以太坊研究人员关注的一个重大领域。 目前的方法包括将交易转移到卷叠上,并使用数据二进制大对象使交易尽可能经济实惠。 扩容以太坊的介绍信息见[扩容页面](/developers/docs/scaling)。 + +### 二层网络 {#layer-2} + +现在有一些二层网络协议,它们使用不同的技术在以太坊一层网络上批量处理交易并保证交易安全,从而对以太坊扩容。 这个课题发展十分迅速,具备很强的研究和发展潜力。 + +#### 背景阅读 {#background-reading-2} + +- [二层网络简介](/layer-2/) +- [Polynya:卷叠、数据可用性及模块化链](https://polynya.medium.com/rollups-data-availability-layers-modular-blockchains-introductory-meta-post-5a1e7a60119d) + +#### 近期研究 {#recent-research-2} + +- [面向排序者的 Arbitrum 公平排序](https://eprint.iacr.org/2021/1465) +- [ethresear.ch 二层网络](https://ethresear.ch/c/layer-2/32) +- [以卷叠为中心的路线图](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) +- [L2Beat](https://l2beat.com/) + +### 链桥 {#bridges} + +二层网络中一个需要进行更多研究和开发的特别领域是安全且性能良好的链桥。 这包括不同二层网络之间以及一层网络与二层网络之间的链桥。 这是一个非常重要的研究领域,因为链桥往往是黑客攻击的目标。 + +#### 背景阅读 {#background-reading-3} + +- [区块链桥简介](/bridges/) +- [Vitalik 谈链桥](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) +- [区块链链桥相关文章](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) +- [链桥上锁定的价值](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) + +#### 近期研究 {#recent-research-3} + +- [验证链桥](https://stonecoldpat.github.io/images/validatingbridges.pdf) + +### 分片 {#sharding} + +分片以太坊区块链长期以来都是发展路线图的一部分。 不过,“Danksharding”等新的扩容解决方案正占据中心位置。 + +#### 背景阅读 {#background-reading-4} + +- [Proto-Danksharding 注释](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) +- [Bankless 的 Danksharding 视频](https://www.youtube.com/watch?v=N5p0TB77flM) +- [以太坊分片研究纲要](https://notes.ethereum.org/@serenity/H1PGqDhpm?type=view) +- [Danksharding (Polynya)](https://polynya.medium.com/danksharding-36dc0c8067fe) + +#### 近期研究 {#recent-research-4} + +- [EIP-4844:Proto-Danksharding](https://eips.ethereum.org/EIPS/eip-4844) +- [Vitalik 谈分片和数据可用性采样](https://hackmd.io/@vbuterin/sharding_proposal) + +### 硬件 {#hardware} + +在普通硬件上[运行节点](/developers/docs/nodes-and-clients/run-a-node/)是保持以太坊去中心化的基础。 因此,尽可能降低运行节点的硬件要求是目前正在进行的研究中一个重要领域。 + +#### 背景阅读 {#background-reading-5} + +- [Ethereum on ARM](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) + +#### 近期研究 {#recent-research-5} + +- [基于现场可编程门阵列的椭圆曲线数字算法](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) + +## 安全性 {#security} + +安全是一个广泛的话题,可能包括垃圾邮件/诈骗防范、钱包安全、硬件安全、加密经济安全、应用程序和客户端软件的错误查找和测试以及密钥管理。 拓宽这些领域的知识将有助于促进主流采用。 + +### 加密和零知识证明 {#cryptography--zkp} + +零知识证明 (ZKP) 和加密对于建立以太坊及其应用程序的隐私性和安全性很关键。 零知识是一个相对年轻但发展迅速的领域,有许多开放研究和开发机会。 它包括一些可能性,如开发更高效的 [Keccak 哈希算法](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview) 实现,找寻更好的多项式承诺,或是降低椭圆曲线数字签名算法公钥生成和签名验证电路的成本。 + +#### 背景阅读 {#background-reading-6} + +- [0xparc 博客](https://0xparc.org/blog) +- [zkp.science](https://zkp.science/) +- [零知识播客](https://zeroknowledge.fm/) + +#### 近期研究 {#recent-research-6} + +- [椭圆曲线加密的近期进展](https://ethresear.ch/t/the-ec-fft-algorithm-without-elliptic-curve-and-isogenies/11346) +- [Ethresear.ch 零知识](https://ethresear.ch/c/zk-s-nt-arks/13) + +### 钱包 {#wallets} + +以太坊钱包可以是浏览器扩展、桌面和移动应用程序,也可以是以太坊上的智能合约。 有关社交恢复钱包的研究目前很活跃,这种钱包可以降低个人用户密钥管理相关的风险。 和钱包开发相关联的是对账户抽象其他形式的研究,这是一个重要的新兴研究领域。 + +#### 背景阅读 {#background-reading-7} + +- [钱包简介](/wallets/) +- [钱包安全性简介](/security/) +- [ethresear.ch 安全性](https://ethresear.ch/tag/security) +- [EIP-2938 帐户抽象](https://eips.ethereum.org/EIPS/eip-2938) +- [EIP-4337 帐户抽象](https://eips.ethereum.org/EIPS/eip-4337) + +#### 近期研究 {#recent-research-7} + +- [以验证为核心的智能合约钱包](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [帐户的未来](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [EIP-3074 AUTH 和 AUTHCALL 操作码](https://eips.ethereum.org/EIPS/eip-3074) +- [在外部帐户地址发布代码](https://eips.ethereum.org/EIPS/eip-5003) + +## 社区、教育和宣传 {#community-education-and-outreach} + +为了帮助新用户熟悉以太坊,需要新的教育资源和方法来宣传。 这可能包括博客和文章、书籍、播客、网络迷因、教学资源、活动以及其他任何建立社区、欢迎新手和教育人们了解以太坊的内容。 + +### 用户体验/用户界面 {#uxui} + +为了帮助更多人熟悉了解以太坊,以太坊生态系统必须优化用户体验/用户界面。 这要求设计师和产品专家重新审视钱包和应用程序的设计。 + +#### 背景阅读 {#background-reading-8} + +- [Ethresear.ch 用户体验/用户界面](https://ethresear.ch/c/ui-ux/24) + +#### 近期研究 {#recent-research-8} + +- [Web3 设计 Discord](https://discord.gg/FsCFPMTSm9) +- [Web3 设计原则](https://www.web3designprinciples.com/) +- [以太坊魔术师论坛用户体验讨论](https://ethereum-magicians.org/t/og-council-ux-follow-up/9032/3) + +### 经济学 {#economics} + +以太坊中的经济学研究普遍遵循了两个途径:验证依赖于经济激励的机制(“微观经济学”)的安全性和分析协议、应用程序和用户之间的价值流动(“宏观经济学”)。 有一些复杂的加密经济学因素与以太坊原生资产(以太币)及构建于其上的代币(例如非同质化代币和 ERC20 代币)有关。 + +#### 背景阅读 {#background-reading-9} + +- [稳健激励小组](https://ethereum.github.io/rig/) +- [Devconnect 开发者大会上的以太坊经济学研讨会](https://www.youtube.com/playlist?list=PLTLjFJ0OQOj5PHRvA2snoOKt2udVsyXEm) + +#### 近期研究 {#recent-research-9} + +- [EIP559 实证分析](https://arxiv.org/abs/2201.05574) +- [流通量平衡](https://ethresear.ch/t/circulating-supply-equilibrium-for-ethereum-and-minimum-viable-issuance-during-the-proof-of-stake-era/10954) +- [量化最大可提取价值:森林有多黑暗?](https://arxiv.org/abs/2101.05511) + +### 区块空间和费用市场 {#blockspace-fee-markets} + +区块空间市场管理向区块添加最终用户交易,不管是直接在以太坊(一层网络)还是在卷叠等桥接网络(二层网络)上进行的交易。 在以太坊上,交易接将提交到依据 EIP-1559 协议部署的费用市场,保护区块链免受垃圾邮件和定价拥堵的影响。 在两个网络上,交易可能产生外部效应,即最大可提取价值 (MEV),包括可获得或管理这些外部效应的新型市场结构。 + +#### 背景阅读 {#background-reading-10} + +- [以太坊区块链的交易费机制设计:EIP-1559 的经济分析(Tim Roughgarden,2020 年)](https://timroughgarden.org/papers/eip1559.pdf) +- [模拟 EIP-1559(稳健激励小组)](https://ethereum.github.io/abm1559) +- [基于首要原则的卷叠经济学](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) +- [Flash Boys 2.0:抢先交易、交易重新排序以及去中心化交易所的共识不稳定](https://arxiv.org/abs/1904.05234) + +#### 近期研究 {#recent-research-10} + +- [多维 EIP-1559 的视频演示](https://youtu.be/QbR4MTgnCko) +- [跨域最大可提取价值](http://arxiv.org/abs/2112.01472) +- [最大可提取价值拍卖](https://ethresear.ch/t/mev-auction-auctioning-transaction-ordering-rights-as-a-solution-to-miner-extractable-value/6788) + +### 权益证明激励 {#proof-of-stake-incentives} + +验证者使用以太坊的原生资产(以太币)作为阻止不诚信行为的抵押品。 这类加密经济学决定了网络安全。 老练的验证者可能利用激励层的细微差别发起显式攻击。 + +#### 背景阅读 {#background-reading-11} + +- [以太坊经济学大师课和经济模型](https://github.com/CADLabs/ethereum-economic-model) +- [模拟权益证明激励机制(稳健激励小组)](https://ethereum.github.io/beaconrunner/) + +#### 近期研究 {#recent-research-11} + +- [增加提议者/构建者分离 (PBS) 下交易审查阻力](https://notes.ethereum.org/s3JToeApTx6CKLJt8AbhFQ) +- [针对权益证明以太坊的三次攻击](https://arxiv.org/abs/2110.10086) + +### 流动性质押和衍生品 {#liquid-staking-and-derivatives} + +流动性质押让拥有不足 32 以太币的用户获得质押收益,即让他们将以太币兑换成代表已质押以太币且可在去中心化金融中使用的代币。 然而,我们仍在探索与流动性质押相关的激励和市场动态,以及其对以太坊安全性的影响(例如中心化风险)。 + +#### 背景阅读 {#background-reading-12} + +- [Ethresear.ch 流动性质押](https://ethresear.ch/search?q=liquid%20staking) +- [Lido:去信任以太坊质押之路](https://blog.lido.fi/the-road-to-trustless-ethereum-staking/) +- [Rocket Pool:质押协议简介](https://medium.com/rocket-pool/rocket-pool-staking-protocol-part-1-8be4859e5fbd) + +#### 近期研究 {#recent-research-12} + +- [Lido 上的提款处理](https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) +- [提款凭证](https://ethresear.ch/t/withdrawal-credential-rotation-from-bls-to-eth1/8722) +- [流动性质押衍生品的风险](https://notes.ethereum.org/@djrtwo/risks-of-lsd) + +## 测试 {#testing} + +### 形式验证 {#formal-verification} + +形式验证是指编写代码以验证以太坊的共识规范正确无误。 该规范有一个用 Python 编写的可执行版本,需要维护和开发。 进一步研究可以帮助改进该规范的 Python 实现,并添加可以更稳健地验证正确性和发现问题的工具。 + +#### 背景阅读 {#background-reading-13} + +- [形式验证简介](https://ptolemy.berkeley.edu/projects/embedded/research/vis/doc/VisUser/vis_user/node4.html) +- [形式验证 (Intel)](https://www.cl.cam.ac.uk/~jrh13/papers/mark10.pdf) + +#### 近期研究 {#recent-research-13} + +- [存款合约的形式验证](https://github.com/runtimeverification/deposit-contract-verification) +- [信标链规范的形式验证](https://github.com/runtimeverification/deposit-contract-verification) + +## 数据科学和分析 {#data-science-and-analytics} + +我们需要更多的数据分析工具和仪表板,来提供有关以太坊活动和网络健康状况的详细信息。 + +### 背景阅读 {#background-reading-14} + +- [Dune Analytics](https://dune.com/browse/dashboards) +- [客户端多样性仪表板](https://clientdiversity.org/) + +#### 近期研究 {#recent-research-14} + +- [稳健激励小组数据分析](https://ethereum.github.io/rig/) + +## 应用程序和工具 {#apps-and-tooling} + +应用程序层支持一个多样化的程序生态系统,这些程序在以太坊基础层上结算交易。 开发团队不断寻找新方法,来利用以太坊为重要的 Web2 应用程序创建可组合、无需许可且抗审查的版本,或者创建全新 Web3 原生概念。 同时,新工具也在持续开发中,使得在以太坊上构建去中心化应用程序不那么复杂。 + +### 去中心化金融 {#defi} + +去中心化金融 (DeFi) 是构建在以太坊上的主要一类应用程序。 去中心化金融旨在创建可组合的“货币乐高”,允许用户通过智能合约存储、转账、借出、借入以及投资加密资产。 它是一个变化迅速、不断更新的领域。 对于安全、高效和可访问的协议,需要持续不断地研究。 + +#### 背景阅读 {#background-reading-15} + +- [去中心化金融](/defi/) +- [Coinbase:什么是去中心化金融?](https://www.coinbase.com/learn/crypto-basics/what-is-defi) + +#### 近期研究 {#recent-research-15} + +- [去中心化金融,中心化所有权?](https://arxiv.org/pdf/2012.09306.pdf) +- [乐观:通往低费用交易的道路](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) + +### 去中心化自治组织 {#daos} + +以太坊的一个有影响力的用例就是能够通过应用去中心化自治组织实施去中心化的组织。 当前,进行着大量活跃的研究,探索如何开发和利用以太坊上的去中心化自治组织,将其作为一种只需最少信任的协调工具来实施改进的治理形式,这极大地扩展了人们的选择,使之不再局限于传统的公司和组织。 + +#### 背景阅读 {#background-reading-16} + +- [去中心化自治组织简介](/dao/) +- [Dao Collective](https://daocollective.xyz/) + +#### 近期研究 {#recent-research-16} + +- [去中心化自治组织生态系统详解](https://www.researchgate.net/publication/358694594_Mapping_out_the_DAO_Ecosystem_and_Assessing_DAO_Autonomy) + +### 开发者工具 {#developer-tools} + +以太坊开发者的工具在迅速改进。 这一常规领域有大量的研发工作要做。 + +#### 背景阅读 {#background-reading-17} + +- [编制语言工具](/developers/docs/programming-languages/) +- [开发者框架](/developers/docs/frameworks/) +- [共识开发者工具清单](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [代币标准](/developers/docs/standards/tokens/) +- [CryptoDevHub:以太坊虚拟机工具](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) + +#### 近期研究 {#recent-research-17} + +- [以太坊研发 Discord 共识工具频道](https://discordapp.com/channels/595666850260713488/746343380900118528) + +### 预言机 {#oracles} + +预言机以一种无需许可、去中心化的方式将链下数据导入区块链上。 将这些数据导入链上,去中心化应用程序就可以对现实世界的现象做出反应,例如现实世界的资产价格波动、链下应用程序中的事件,甚至天气变化。 + +#### 背景阅读 {#background-reading-18} + +- [预言机简介](/developers/docs/oracles/) + +#### 最新研究 {#recent-research-18} + +- [区块链预言机调查](https://arxiv.org/pdf/2004.07140.pdf) +- [Chainlink 白皮书](https://chain.link/whitepaper) + +### 应用程序安全 {#app-security} + +以太坊上的黑客攻击通常利用单个应用程序中的漏洞,而不是协议本身的漏洞。 黑客和应用程序开发者在开发新的攻击和防御手段中陷入了一场军备竞赛。 这意味着,始终都需要进行重要的研发,保障应用程序安全并免受黑客攻击。 + +#### 背景阅读 {#background-reading-19} + +- [虫洞利用情况报告](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) +- [以太坊合约黑客攻击事后分析清单](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) +- [Rekt 新闻](https://twitter.com/RektHQ?s=20&t=3otjYQdM9Bqk8k3n1a1Adg) + +#### 近期研究 {#recent-research-19} + +- [ethresear.ch 应用程序](https://ethresear.ch/c/applications/18) + +### 技术栈 {#technology-stack} + +将整个以太坊技术栈去中心化是一项重要的研究领域。 目前,以太坊上的去中心化应用程序通常有一些中心化部分,因为它们依赖中心化的工具或基础设施。 + +#### 背景阅读 {#background-reading-20} + +- [以太坊堆栈](/developers/docs/ethereum-stack/) +- [Coinbase:Web3 栈简介](https://blog.coinbase.com/a-simple-guide-to-the-web3-stack-785240e557f0) +- [智能合约简介](/developers/docs/smart-contracts/) +- [去中心化存储简介](/developers/docs/storage/) + +#### 近期研究 {#recent-research-20} + +- [智能合约的可组合性](/developers/docs/smart-contracts/composability/) diff --git a/public/content/translations/zh/community/support/index.md b/public/content/translations/zh/community/support/index.md index 961ca99134f..71de24166b9 100644 --- a/public/content/translations/zh/community/support/index.md +++ b/public/content/translations/zh/community/support/index.md @@ -8,9 +8,9 @@ lang: zh ## 以太坊官方支持 {#official-support} -您正在寻求以太坊官方支持吗? 您应该知道的第一件事是以太坊是去中心化的。 这意味着以太坊不属于任何中心化组织、实体或个人,因此没有官方支持渠道。 +你正在寻求以太坊官方支持吗? 你应该知道的第一件事是以太坊是去中心化的。 这意味着以太坊不属于任何中心化组织、实体或个人,因此没有官方支持渠道。 -了解以太坊的去中心化性质至关重要,因为任何自称是以太坊官方支持人员的人都可能在试图诈骗您! 预防诈骗的最好办法就是自学并认真对待安全问题。 +了解以太坊的去中心化性质至关重要,因为任何自称是以太坊官方支持人员的人都可能在试图诈骗你! 预防诈骗的最好办法就是自学并认真对待安全问题。 以太坊安全和预防欺诈措施 @@ -20,17 +20,17 @@ lang: zh 学习以太坊基础知识 -尽管缺乏官方支持,但以太坊生态系统中的许多团体、社区和项目都乐于提供帮助,并且您可以在此页面上找到很多有用的信息和资源。 还有问题吗? 加入 [ethereum.org Discord](/discord/),我们会尽力提供帮助。 +尽管缺乏官方支持,但以太坊生态系统中的许多团体、社区和项目都乐于提供帮助,并且你可以在此页面上找到很多有用的信息和资源。 还有问题吗? 加入 [ethereum.org Discord](/discord/),我们会尽力提供帮助。 ## 钱包支持 {#wallet-support} -您的钱包有问题吗? 大多数钱包都有专门的支持团队可以提供帮助: +你的钱包有问题吗? 大多数钱包都有专门的支持团队可以提供帮助: - [MetaMask](https://metamask.zendesk.com/hc/) - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_这并不是完整的列表。 需要帮助寻找特定钱包的支持? 加入 [ethereum.org Discord](https://discord.gg/ethereum-org),我们会尝试帮助您。_ +_这并不是完整的列表。 需要帮助寻找特定钱包的支持? 加入 [ethereum.org Discord](https://discord.gg/rZz26QWfCg),我们会尝试帮助你。_ 正在寻找以太坊钱包? [深入了解我们完整的以太坊钱包列表](/wallets/find-wallet/)。 @@ -39,20 +39,21 @@ _这并不是完整的列表。 需要帮助寻找特定钱包的支持? 加 构建这类应用可能很困难。 以下提供了一些专注于开发的平台,其中有经验丰富的以太坊开发人员,他们会乐意提供帮助。 - [Alchemy University](https://university.alchemy.com/#starter_code) -- [CryptoDevs discord](https://discord.gg/Z9TA39m8Yu) +- [CryptoDevs discord](https://discord.com/invite/5W5tVb3) - [以太坊堆栈交易所](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Web3 University](https://www.web3.university/) +- [LearnWeb3](https://discord.com/invite/learnweb3) -您还可以在我们的[以太坊开发者资源](/developers/)部分找到文档和开发指南。 +你还可以在我们的[以太坊开发者资源](/developers/)部分找到文档和开发指南。 ### 工具 {#dapp-tooling} -您的问题是否与某个特定的工具、项目或程序库有关? 大多数项目都有专用于用户支持的聊天服务器或论坛。 +你的问题是否与某个特定的工具、项目或程序库有关? 大多数项目都有专用于用户支持的聊天服务器或论坛。 以下是一些比较常见的例子: -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [安全帽](https://discord.gg/xtrMGhmbfZ) @@ -62,12 +63,12 @@ _这并不是完整的列表。 需要帮助寻找特定钱包的支持? 加 ## 运行节点 {#node-support} -如果您正在运行节点或验证者节点,下面是一些专门帮助您入门的社区。 +如果你正在运行节点或验证者节点,下面是一些专门帮助你入门的社区。 - [EthStaker discord](https://discord.gg/ethstaker) - [EthStaker reddit](https://www.reddit.com/r/ethstaker) -大多数构建以太坊客户端的团队也有专门的、面向公众的平台,您可以在这些平台获取支持和提问。 +大多数构建以太坊客户端的团队也有专门的、面向公众的平台,你可以在这些平台获取支持和提问。 ### 执行客户端 {#execution-clients} @@ -84,23 +85,23 @@ _这并不是完整的列表。 需要帮助寻找特定钱包的支持? 加 - [Teku](https://discord.gg/7hPv2T6) - [Lodestar](https://discord.gg/aMxzVcr) -您还可以[在此处了解如何运行节点](/developers/docs/nodes-and-clients/run-a-node/)。 +你还可以[在此处了解如何运行节点](/developers/docs/nodes-and-clients/run-a-node/)。 ## 常见问题 {#faq} ### 我把以太币发到了错误的钱包中 {#wrong-wallet} -以太坊上发送的交易是不可逆的。 如果您将以太币发送到错误的钱包,很遗憾,没有办法追回这些资金。 以太坊不属于任何中心化组织、实体或个人,这意味着没有人可以逆转交易。 因此,在发送交易之前,一定要仔细检查您的交易,这一点至关重要。 +以太坊上发送的交易是不可逆的。 如果你将以太币发送到错误的钱包,很遗憾,没有办法追回这些资金。 以太坊不属于任何中心化组织、实体或个人,这意味着没有人可以逆转交易。 因此,在发送交易之前,一定要仔细检查你的交易,这一点至关重要。 ### 如何获取以太坊的赠品? {#giveaway-scam} -以太坊赠品是用来窃取您以太币的骗局。 不要被看起来好得令人难以置信的优惠所诱惑 — 如果您将以太币发送到赠品地址,您不但收不到赠品,还将无法追回您的资金。 +以太坊赠品是用来窃取你以太币的骗局。 不要被看起来好得令人难以置信的优惠所诱惑 — 如果你将以太币发送到赠品地址,你不但收不到赠品,还将无法追回你的资金。 [关于预防诈骗的更多信息](/security/#common-scams) ### 我的交易被卡住了 {#stuck-transaction} -如果你提交的交易费低于网络需求,以太坊上的交易有时会被卡住。 许多钱包提供了一个选项,即以更高的交易费重新提交同一项交易,使该交易得以处理。 或者,您可以发送交易到您自己的地址,并使用与待定交易相同的随机数,以取消待定交易。 +如果你提交的交易费低于网络需求,以太坊上的交易有时会被卡住。 许多钱包提供了一个选项,即以更高的交易费重新提交同一项交易,使该交易得以处理。 或者,你可以发送交易到你自己的地址,并使用与待定交易相同的随机数,以取消待定交易。 [如何在 MetaMask 上加速或取消待定交易](https://metamask.zendesk.com/hc/en-us/articles/360015489251-How-to-speed-up-or-cancel-a-pending-transaction) @@ -110,6 +111,6 @@ _这并不是完整的列表。 需要帮助寻找特定钱包的支持? 加 以太坊不再支持挖矿。 在以太坊从工作量证明过渡到权益证明后,挖矿就终止了。 现在,以太坊使用验证者而不是矿工。 验证者质押以太币并通过保护以太坊安全获得质押奖励。 -### 我如何成为质押人/验证者? {#become-validator} +#### 我如何成为质押人/验证者? {#become-validator} 要成为验证者,你必须在以太坊存款合约中质押 32 个以太币并搭建一个验证节点。 更多信息见[质押界面](/staking)和[质押启动版](https://launchpad.ethereum.org/)。 diff --git a/public/content/translations/zh/dao/index.md b/public/content/translations/zh/dao/index.md index 865d42328a9..582c614a1f9 100644 --- a/public/content/translations/zh/dao/index.md +++ b/public/content/translations/zh/dao/index.md @@ -156,7 +156,7 @@ _通常用于协议和去中心化应用程序的去中心化开发和管理, - [如何创立由去中心化自治组织提供支持的数字社区](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [什么是去中心化自治组织?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) - [什么是全息共识?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [《去中心化自治组织不是公司:去中心化在自治组织中很重要》,作者 Vitalik](https://vitalik.ca/general/2022/09/20/daos.html) +- [《去中心化自治组织不是公司:去中心化在自治组织中很重要》,作者 Vitalik](https://vitalik.eth.limo/general/2022/09/20/daos.html) - [去中心化自治组织、数据可用性委员会、数据可用性等等:不完整术语指南](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [以太坊博客](https://blog.ethereum.org) ### 视频 {#videos} diff --git a/public/content/translations/zh/decentralized-identity/index.md b/public/content/translations/zh/decentralized-identity/index.md index daf990f9114..8a298022bd2 100644 --- a/public/content/translations/zh/decentralized-identity/index.md +++ b/public/content/translations/zh/decentralized-identity/index.md @@ -109,7 +109,7 @@ summaryPoint3: 多亏了加密技术,用户现在拥有了再次发布、持 ### 灵魂绑定代币和身份 {#soulbound} -[灵魂绑定代币](https://vitalik.ca/general/2022/01/26/soulbound.html)(不可转让的非同质化代币)可用于收集特定钱包的独有信息。 这有效地创建了一个绑定至特定以太坊地址的唯一链上身份,其中可能包括代表成就(例如完成某些特定在线课程或在游戏中超过特定分数)或社区参与度的代币。 +[灵魂绑定代币](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)(不可转让的非同质化代币)可用于收集特定钱包的独有信息。 这有效地创建了一个绑定至特定以太坊地址的唯一链上身份,其中可能包括代表成就(例如完成某些特定在线课程或在游戏中超过特定分数)或社区参与度的代币。 ## 去中心化身份的好处 {#benefits-of-decentralized-identity} diff --git a/public/content/translations/zh/desci/index.md b/public/content/translations/zh/desci/index.md index 50ffcd052fd..b78e2b25f70 100644 --- a/public/content/translations/zh/desci/index.md +++ b/public/content/translations/zh/desci/index.md @@ -76,7 +76,7 @@ summaryPoint3: 它以开放科学运动为基础。 就像非同质化代币可以将未来交易的受益转回给原创作者一样,你可以建立透明的价值归属链,以此奖励研究人员、管理机构(比如去中心化自治组织),甚至是数据收集对象。 -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 就像一把钥匙,可以打开进行中的研究实验的去中心化数据存储库,还可以插入了同质化代币和[去中心化金融](/defi/)这些金融领域(从分片化到借贷池和价值评估)。 它也允许一些原生链上实体直接在链上进行研究,比如[VitaDAO](https://www.vitadao.com/) 等去中心化自治组织。 不可转移的[“灵魂绑定”代币](https://vitalik.ca/general/2022/01/26/soulbound.html)的出现,也能在去中心化科学中发挥重要作用,它允许个人证明与以太坊地址关联的经验和凭证。 +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 就像一把钥匙,可以打开进行中的研究实验的去中心化数据存储库,还可以插入了同质化代币和[去中心化金融](/defi/)这些金融领域(从分片化到借贷池和价值评估)。 它也允许一些原生链上实体直接在链上进行研究,比如[VitaDAO](https://www.vitadao.com/) 等去中心化自治组织。 不可转移的[“灵魂绑定”代币](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)的出现,也能在去中心化科学中发挥重要作用,它允许个人证明与以太坊地址关联的经验和凭证。 ### 数据存储、访问和架构 {#data-storage} diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/faqs/index.md index 85c310d7faa..20bd5fa37eb 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/faqs/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -18,7 +18,7 @@ lang: zh 工作量证明需要在挖矿过程中消耗大量的电力,因此能耗要高得多。 而权益证明只需要非常少量的能量 - 以太坊验证者甚至可以在树莓派等低功耗设备上运行。 以太坊的权益证明机制被认为比工作量证明机制更安全,因为攻击的代价更高,并且给攻击者造成的后果更严重。 -工作量证明与权益证明是一个有争议的话题。 [Vitalik Buterin 的博客](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work)以及 Justin Drake 与 Lyn Alden 之间的辩论对这些论点做了很好的总结。 +工作量证明与权益证明是一个有争议的话题。 [Vitalik Buterin 的博客](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)以及 Justin Drake 与 Lyn Alden 之间的辩论对这些论点做了很好的总结。 @@ -89,7 +89,7 @@ Casper 和 LMD_GHOST 的组合被称为 Gasper。 社交罚没是指社区协调区块链的分叉以应对攻击的能力。 它使社区能够从攻击者最终化不诚实的链中恢复过来。 它也可以用于对抗审查攻击。 - [关于社交罚没的更多信息](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) -- [Vitalik Buterin 关于社交罚没的观点](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Vitalik Buterin 关于社交罚没的观点](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) ## 我会受到罚没吗? {#will-i-get-slashed} @@ -101,7 +101,7 @@ Casper 和 LMD_GHOST 的组合被称为 Gasper。 无利害关系问题是一些权益证明机制中的一个概念性问题,其中只有奖励而没有惩罚。 如果没有任何利害关系,那么一个务实的验证者同样愿意验证任何甚至多个区块链分叉,因为这将增加他们的奖励。 以太坊通过使用最终确定性条件和罚没机制来确保只有一个规范链,以解决此问题。 -[关于无利害关系问题的更多信息](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) +[关于无利害关系问题的更多信息](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) ## 什么是分叉选择算法? {#what-is-a-fork-choice-algorithm} diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/index.md index 48bfec99cc0..e15eba44906 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/index.md @@ -79,10 +79,10 @@ lang: zh ## 延伸阅读 {#further-reading} -- [Proof of Stake FAQ](https://vitalik.ca/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_ - [What is Proof of Stake](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _ConsenSys_ - [What Proof of Stake Is And Why It Matters](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _Vitalik Buterin_ -- [为什么采用权益证明(2020 年 11 月)](https://vitalik.ca/general/2020/11/06/pos2020.html) _Vitalik Buterin_ +- [为什么采用权益证明(2020 年 11 月)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _Vitalik Buterin_ - [权益证明:我如何爱上弱主观性](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _Vitalik Buterin_ - [权益证明以太坊的攻击和防御](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) - [权益证明设计原则](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _Vitalik Buterin_ diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md index d6199f5ab16..5bcad99bdc1 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -65,5 +65,5 @@ lang: zh ## 延伸阅读 {#further-reading} - [Vitalik 的权益证明设计理念](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) -- [Vitalik 的权证明常见问题](https://vitalik.ca/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [Vitalik 的权证明常见问题](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) - [权益证明与工作量证明的“简介”视频](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/zh/developers/docs/nodes-and-clients/index.md b/public/content/translations/zh/developers/docs/nodes-and-clients/index.md index 86a01b1315d..2bc39d6bd91 100644 --- a/public/content/translations/zh/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/zh/developers/docs/nodes-and-clients/index.md @@ -20,7 +20,7 @@ sidebarDepth: 2 - 执行客户端(也称为执行引擎、EL 客户端或旧称“以太坊 1”客户端)侦听网络中广播的新交易,并在以太坊虚拟机中执行它们,并保存所有当前以太坊数据的最新状态和数据库。 - 共识客户端(也称为信标节点、CL 客户端或旧称“以太坊 2”客户端)实现权益证明共识算法,使网络能够根据来自执行客户端的经验证数据达成一致。 此外还有名为“验证者”的第三种软件,它们可被添加到共识客户端中,使节点能参与保护网络安全。 -这些客户端软件相互协作,以追踪以太坊的链头,并允许用户与以太坊网络进行交互。 这种模块化设计被称作[封装复杂性](https://vitalik.ca/general/2022/02/28/complexity.html),它包含多个协同运作的软件。 此方法让无缝实施[合并](/roadmap/merge)变得更简单,客户端软件更易于维护和开发,并且还能重复利用各个客户端(例如在[二层网络生态系统](/layer-2/)当中)。 +这些客户端软件相互协作,以追踪以太坊的链头,并允许用户与以太坊网络进行交互。 这种模块化设计被称作[封装复杂性](https://vitalik.eth.limo/general/2022/02/28/complexity.html),它包含多个协同运作的软件。 此方法让无缝实施[合并](/roadmap/merge)变得更简单,客户端软件更易于维护和开发,并且还能重复利用各个客户端(例如在[二层网络生态系统](/layer-2/)当中)。 ![关联执行和共识客户端](./eth1eth2client.png) 关联执行与共识客户端的简化图。 diff --git a/public/content/translations/zh/developers/docs/scaling/index.md b/public/content/translations/zh/developers/docs/scaling/index.md index 0900a51d03f..620e5f8cc3f 100644 --- a/public/content/translations/zh/developers/docs/scaling/index.md +++ b/public/content/translations/zh/developers/docs/scaling/index.md @@ -103,11 +103,11 @@ _请注意,视频中的解释使用“二层网络”这一术语指代所有 - [以卷叠为中心的以太坊路线图](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ - [有关以太坊第二层扩容解决方案的最新分析](https://www.l2beat.com/) - [评估以太坊第二层扩容解决方案:一个比较框架](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) -- [卷叠不完全指南](https://vitalik.ca/general/2021/01/05/rollup.html) +- [卷叠不完全指南](https://vitalik.eth.limo/general/2021/01/05/rollup.html) - [以太坊赋能的零知识卷叠:强者](https://hackmd.io/@canti/rkUT0BD8K) - [“乐观卷叠”对比“零知识卷叠”](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) - [零知识区块链的可扩展性](https://ethworks.io/assets/download/zero-knowledge-blockchain-scaling-ethworks.pdf) - [为什么卷叠 + 数据分片是高可扩展性的唯一可持续的解决办法](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) -- [什么类型的三层网络有意义?](https://vitalik.ca/general/2022/09/17/layer_3.html) +- [什么类型的三层网络有意义?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) _还有哪些社区资源对你有所帮助? 请编辑本页面并添加!_ diff --git a/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md index 35c8e4fae69..5ce7d2d6fdf 100644 --- a/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md +++ b/public/content/translations/zh/developers/docs/scaling/optimistic-rollups/index.md @@ -208,7 +208,7 @@ ii. 使用乐观卷叠的开发者和项目团队可以利用以太坊的基础 以太坊主链限制了区块可以容纳的数据量,以燃料单位计量([平均区块大小](/developers/docs/blocks/#block-size)为 1500 万燃料)。 虽然这限制了每笔交易可以使用多少燃料,但也意味着我们可以通过减少与交易相关的数据来增加每个区块处理的交易,直接提高了可扩展性。 -乐观卷叠使用多种技术来实现交易数据压缩并提高每秒交易量速率。 例如,这篇[文章](https://vitalik.ca/general/2021/01/05/rollup.html)将基本用户交易(发送以太币)在主网上生成的数据量与同一交易在卷叠上生成的数据量进行了比较: +乐观卷叠使用多种技术来实现交易数据压缩并提高每秒交易量速率。 例如,这篇[文章](https://vitalik.eth.limo/general/2021/01/05/rollup.html)将基本用户交易(发送以太币)在主网上生成的数据量与同一交易在卷叠上生成的数据量进行了比较: | 参数 | 以太坊 (L1) | 卷叠 (L2) | | --------- | ----------------- | ------------ | diff --git a/public/content/translations/zh/developers/docs/scaling/plasma/index.md b/public/content/translations/zh/developers/docs/scaling/plasma/index.md index b6c20490e5b..b1bcfe32297 100644 --- a/public/content/translations/zh/developers/docs/scaling/plasma/index.md +++ b/public/content/translations/zh/developers/docs/scaling/plasma/index.md @@ -171,7 +171,7 @@ Plasma 不同于此,因为主网只接收最少量的子链状态信息。 这 - [学习 Plasma](https://www.learnplasma.org/en/) - [关于何为“共享安全”以及它为何如此重要的简单提示](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) -- [侧链、Plasma 与分片](https://vitalik.ca/general/2019/06/12/plasma_vs_sharding.html) +- [侧链、Plasma 与分片](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) - [了解 Plasma(第一部分):基础知识](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) - [Plasma 的一生](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) diff --git a/public/content/translations/zh/developers/docs/scaling/sidechains/index.md b/public/content/translations/zh/developers/docs/scaling/sidechains/index.md index 2080f9c64e4..9987421973d 100644 --- a/public/content/translations/zh/developers/docs/scaling/sidechains/index.md +++ b/public/content/translations/zh/developers/docs/scaling/sidechains/index.md @@ -7,7 +7,7 @@ sidebarDepth: 3 侧链是独立于以太坊运行的独立区块链,通过双向桥梁与以太坊主网连接。 侧链可以有单独的区块参数和[共识算法](/developers/docs/consensus-mechanisms/),它们通常是为高效处理交易而设计的。 但是,使用侧链需要权衡取舍,因为它们未继承以太坊的安全属性。 与[二层网络扩容解决方案](/layer-2/)不同,侧链不会将状态变化和交易数据发布到以太坊主网。 -侧链还在一定程度上牺牲了去中心化或安全性来实现高吞吐量([可扩展性三难困境](https://vitalik.ca/general/2021/05/23/scaling.html))。 然而,正如其升级[愿景声明](/roadmap/vision/)中所述,以太坊致力于在不影响去中心化和安全性的情况下扩容。 +侧链还在一定程度上牺牲了去中心化或安全性来实现高吞吐量([可扩展性三难困境](https://vitalik.eth.limo/general/2021/05/23/scaling.html))。 然而,正如其升级[愿景声明](/roadmap/vision/)中所述,以太坊致力于在不影响去中心化和安全性的情况下扩容。 ## 侧链如何运作? {#how-do-sidechains-work} diff --git a/public/content/translations/zh/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/zh/developers/docs/scaling/zk-rollups/index.md index 097a08d6236..cb3af0b679e 100644 --- a/public/content/translations/zh/developers/docs/scaling/zk-rollups/index.md +++ b/public/content/translations/zh/developers/docs/scaling/zk-rollups/index.md @@ -238,7 +238,7 @@ ZK-STARK 对于量子计算机也是安全的,而 ZK-SNARK 中使用的椭圆 - **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll 是 一家致力于为以太坊构建原生零知识以太坊虚拟机二层解决方案的技术驱动型公司。_ -- **[Taiko](https://taiko.xyz)** - _Taiko 是去中心化的、等同于以太坊的零知识卷叠([1 类零知识以太坊虚拟机](https://vitalik.ca/general/2022/08/04/zkevm.html))。_ +- **[Taiko](https://taiko.xyz)** - _Taiko 是去中心化的、等同于以太坊的零知识卷叠([1 类零知识以太坊虚拟机](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))。_ - **[ZKSync](https://docs.zksync.io/zkevm/)** - _ZkSync 2.0 是与以太坊虚拟机兼容的零知识卷叠,由 Matter Labs 构建并由它自己的零知识以太坊虚拟机提供支持。_ @@ -250,5 +250,5 @@ ZK-STARK 对于量子计算机也是安全的,而 ZK-SNARK 中使用的椭圆 - [什么是 zkEVM(零知识以太坊虚拟机)?](https://www.alchemy.com/overviews/zkevm) - [zkEVM(零知识以太坊虚拟机)简介](https://hackmd.io/@yezhang/S1_KMMbGt) - [超赞的 zkEVM(零知识以太坊虚拟机)资源](https://github.com/LuozhuZhang/awesome-zkevm) -- [ZK-SNARK(零知识简洁非交互式知识论证)底层技术](https://vitalik.ca/general/2017/02/01/zk_snarks.html) -- [SNARK(简洁非交互式知识论证),怎么可能?](https://vitalik.ca/general/2021/01/26/snarks.html) +- [ZK-SNARK(零知识简洁非交互式知识论证)底层技术](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [SNARK(简洁非交互式知识论证),怎么可能?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/zh/eips/index.md b/public/content/translations/zh/eips/index.md index 1e13c8918f5..37ef1a6aea8 100644 --- a/public/content/translations/zh/eips/index.md +++ b/public/content/translations/zh/eips/index.md @@ -1,5 +1,5 @@ --- -title: 以太坊改进提议 (EIP) +title: 以太坊改进提案 (EIP) description: 了解以太坊改进提案所需的基本信息 lang: zh --- @@ -8,7 +8,7 @@ lang: zh ## 什么是 EIP? {#what-are-eips} -[以太坊改进提议 (EIP)](https://eips.ethereum.org/)是为以太坊潜在新功能或流程提出建议的标准。 EIP 包含提议改进的技术规范,并作为社区的“真相来源”。 在 EIP 的过程中,将会讨论和制定以太坊的网络升级和应用标准。 +[以太坊改进提案 (EIP)](https://eips.ethereum.org/)是为以太坊潜在新功能或流程提出建议的标准。 EIP 包含提议改进的技术规范,并作为社区的“真相来源”。 在 EIP 的过程中,将会讨论和制定以太坊的网络升级和应用标准。 以太坊社区中的任何人都可以创造一个 EIP。 以太坊改进提案编写准则在 [EIP 1](https://eips.ethereum.org/EIPS/eip-1) 中提供。 以太坊改进提案应主要包括简明技术规范,并提供一些激励措施。 以太坊改进提案的创作者负责在社区内建立共识并记录不同意见。 从历史上看,大多数以太坊改进提案的创作者通常是应用程序或协议开发者,因为提交高水平的以太坊改进提案需要很强的技术能力。 @@ -52,7 +52,7 @@ EIP 作为一个中心角色,记载以太坊的变化并且记载在以太坊 ## 了解更多 {#learn-more} -如果您有兴趣详细了解以太坊改进提案,请查看[以太坊改进提案网站](https://eips.ethereum.org/)和[ EIP-1](https://eips.ethereum.org/EIPS/eip-1)。 下面是一些有用的链接: +如果你有兴趣详细了解以太坊改进提案,请查看[以太坊改进提案网站](https://eips.ethereum.org/)和[ EIP-1](https://eips.ethereum.org/EIPS/eip-1)。 下面是一些有用的链接: - [以太坊改进提案完整列表](https://eips.ethereum.org/all) - [所以太坊改进提案类型说明](https://eips.ethereum.org/EIPS/eip-1#eip-types) diff --git a/public/content/translations/zh/energy-consumption/index.md b/public/content/translations/zh/energy-consumption/index.md index f540efdf9d4..c7a264b3678 100644 --- a/public/content/translations/zh/energy-consumption/index.md +++ b/public/content/translations/zh/energy-consumption/index.md @@ -8,56 +8,58 @@ lang: zh 以太坊是一个绿色区块链。 以太坊的[权益证明](/developers/docs/consensus-mechanisms/pos)共识机制,使用以太币而不是[能源](/developers/docs/consensus-mechanisms/pow)来保护网络安全。 整个以太坊全球网络的能源消耗约为 [0.0026 亿千瓦时/年](https://carbon-ratings.com/eth-report-2022)。 -以太坊的能耗估算值来自[加密碳评级机构 (CCRI)](https://carbon-ratings.com) 的一项研究。 该机构对以太坊的耗电量与碳足迹进行了自下而上的估算([查看报告](https://carbon-ratings.com/eth-report-2022))。 他们测量了具有各种硬件和客户端软件配置的各种不同节点的耗电量。 以太坊网络的年耗电量估算值为 **2,601 兆瓦时**(0.0026 亿千瓦时),相当于应用了区域特定碳强度因子的 **870 吨二氧化碳当量**的年碳排放量。 该估算值随节点加入和退出网络变化 - 可通过使用[剑桥区块链网络可持续性指数](https://ccaf.io/cbnsi/ethereum)提供的连续 7 天的平均估算值进行跟踪(请注意他们使用的估算方式略有不同 - 详细信息请参见其网站)。 +以太坊的能耗估算值来自[加密碳评级机构 (CCRI)](https://carbon-ratings.com) 的一项研究。 该机构对以太坊网络的电力消耗和碳足迹进行了自下而上的估算([查看报告](https://carbon-ratings.com/eth-report-2022))。 他们测量了具有各种硬件和客户端软件配置的各种不同节点的耗电量。 以太坊网络的年耗电量估算值为 **2,601 兆瓦时**(0.0026 亿千瓦时),相当于应用了区域特定碳强度因子的 **870 吨二氧化碳当量**的年碳排放量。 在节点加入和退出网络时,该值会随之变化 - 可通过使用[剑桥区块链网络可持续性指数](https://ccaf.io/cbnsi/ethereum)提供的连续 7 天的平均估算值进行跟踪(请注意他们使用的估算方式略有不同 - 详细信息请参见其网站)。 -为全面了解以太坊的能源消耗,我们可以比较某些其他行业的能源消耗年化估算值。 这将有助于我们更好地理解以太坊能源消耗估算值是高还是低。 +为全面了解以太坊的能源消耗,我们可以比较某些其他产品和行业的能源消耗年化估算值。 这将有助于我们更好地理解以太坊能源消耗估算值是高还是低。 -上面的图表显示了以太坊和其他一些行业的年化能源消耗估算值,单位为亿千瓦时/年。 所有估算值均来自可在 2023 年 5 月获取的公开信息,下表列出了数据来源的链接: +上面的图表显示了以太坊与其他一些产品和行业的能源消耗估算值,单位为亿千瓦时/年。 所有估算值均来自 2023 年7 月获得的公开信息,其来源链接在下表列出。 -| | 年化能源消耗(亿千瓦时) | 和权益证明以太坊比较 | 来源 | -| :--------------------- | :----------------------: | :------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 全球数据中心 | 200 | 77,000 倍 | [来源](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | -| 黄金开采(最小估算值) | 131 | 50,000 倍 | [来源](https://ccaf.io/cbnsi/cbeci/comparisons) | -| 比特币(最大估算值) | 131 | 50,000 倍 | [来源](https://ccaf.io/cbnsi/cbeci/comparisons) | -| 工作量证明以太坊 | 78 | 30,000 倍 | [来源](https://digiconomist.net/ethereum-energy-consumption) | -| YouTube(仅直接能耗) | 12 | 4600 倍 | [来源](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf) | -| 美国游戏行业 | 34 | 13,000 倍 | [来源](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | -| Netflix(最小估算值) | 0.451 | 173 倍 | [来源](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | -| PayPal | 0.26 | 100 倍 | [来源](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261) | -| AirBnB | 0.02 | 8 倍 | [来源]() | -| 权益证明以太坊 | 0.0026 | 1 倍 | [来源](https://carbon-ratings.com/eth-report-2022) | +| | 年化能源消耗(亿千瓦时) | 和权益证明以太坊比较 | 来源 | +|:----------- |:------------:|:----------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| 全球数据中心 | 190 | 73,000 倍 | [来源](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | +| 比特币 | 149 | 53,000 倍 | [来源](https://ccaf.io/cbnsi/cbeci/comparisons) | +| 开采金矿 | 131 | 50,000 倍 | [来源](https://ccaf.io/cbnsi/cbeci/comparisons) | +| 美国游戏行业\* | 34 | 13,000 倍 | [来源](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | +| 工作量证明以太坊 | 21 | 8,100 倍 | [来源](https://ccaf.io/cbnsi/ethereum/1) | +| Google | 19 | 7,300 倍 | [来源](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) | +| Netflix | 0.457 | 176 倍 | [来源](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | +| PayPal | 0.26 | 100 倍 | [来源](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-(1).pdf) | +| AirBnB | 0.02 | 8 倍 | [来源](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-(Final).pdf) | +| **权益证明以太坊** | **0.0026** | **1 倍** | [来源](https://carbon-ratings.com/eth-report-2022) | -准确估算能源消耗比较复杂,尤其是当衡量对象有着复杂的供应链或部署细节且影响到其效率时。 以 Netflix 或者 Youtube 为例。 他们的能源消耗估算存在差异,取决于他们是只包括用于维护系统和向用户交付内容的能耗(_直接能耗_),还是也包括制作内容、运营公司、投放广告等方面所需的能耗(_间接能耗_)。 间接能耗还可能包括在电视、电脑和移动设备等终端用户设备上观看内容所需的能源,而这些能耗又取决于使用的设备。 +\*包括个人电脑、笔记本电脑和游戏机等用户终端设备。 -[Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix) 上有一些针对该问题的讨论。 在上表中,报告的 Netflix 估算值包括他们自己报告的*直接*和*间接*能耗。 Youtube 只提供了其*直接*能耗的估算值,大约为 [12 亿千瓦时/年](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf)。 +获得准确的能源消耗估算值比较复杂,尤其是被衡量对象有着复杂的供应链或部署细节影响效率时。 例如,Netflix 和 Google 的能源消耗估算值存在差异,这取决于估算值只包括用于维护系统和向用户提供内容的能耗(_直接能耗_),还是也包括制作内容、运营公司、投放广告等方面所需的能耗(_间接能耗_)。 间接能耗还包括用于在用户终端设备(例如电视,电脑和手机)上消费内容的能耗。 -上面的表格与图表还包括与比特币及工作量证明以太坊的对比。 需要注意的是,工作量证明网络的能耗并不是静态的,它每天都在变化。 工作量证明以太坊的估算值是即将[合并](/roadmap/merge/)为权益证明网络之前的数值,是由 [Digiconomist](https://digiconomist.net/ethereum-energy-consumption) 预测的。 其他来源,如[剑桥区块链网络可持续发展指数](https://ccaf.io/cbnsi/ethereum/1)估计其能源消耗要低得多(接近 20 亿千瓦时/年)。 比特币的能源消耗估算在各个来源之间也存在很大差异,这一话题引发了许多大同小异的[争论](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/),涉及到的不仅仅是消耗的能源数量,还包括能源来源和相关伦理问题。 能源消耗不一定与环境足迹精确对应,因为不同的项目可能使用不同的能源,例如更小或更大比例的可再生能源。 例如,[剑桥比特币耗电量指数](https://ccaf.io/cbnsi/cbeci/comparisons)指出,理论上讲,天然气燃除或在输配电过程中损失的电力就可以满足比特币网络的能源需求。 以太坊的可持续性路线是用一种环保替代方案取代比特币网络中的高能耗部分。 +以上估算值的比较并不完美。 间接能耗的数量因来源而异,并且很少包括来自用户终端设备的能耗。 每一个数据来源都有关于被衡量对象的更多详细信息。 + +上面的表格与图表还包括与比特币及工作量证明以太坊的比较。 需要注意的是,工作量证明以太坊网络的能源消耗不是静态的,它每天都在变化。 不同来源的能耗估算值也会有很大差异。 这个话题引起了一些微妙的[争论](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/),不仅涉及能源消耗量,还涉及能源来源和相关伦理问题。 能源消耗不一定与环境足迹精确对应,因为不同的项目可能使用不同的能源,例如更低或更高比例的可再生能源。 例如,[剑桥比特币耗电量指数](https://ccaf.io/cbnsi/cbeci/comparisons)指出,理论上讲,天然气燃除或在输配电过程中损失的电力就可以满足比特币网络的能源需求。 以太坊的可持续性路线是用一种环保替代方案取代网络中的高能耗部分。 可以在[剑桥区块链网络可持续性指数网站](https://ccaf.io/cbnsi/ethereum)上查看多个不同行业的能源消耗和一氧化碳排放估算值。 ## 每笔交易的能耗估算值 {#per-transaction-estimates} -许多文章估算了区块链中“每笔交易”的能源消耗。 然而,这种估算可能会产生误导,因为提出和验证区块所需的能源与区块中的交易数量无关。 如果以每笔交易为单位计算能源消耗,意味着交易越少能源消耗越少,反之亦然,但事实并非如此。 而且,每笔交易的能源消耗估算值高度依赖于区块链的交易吞吐量是如何定义的,并且可以通过调整这个定义来使估算值看起来更大或更小。 +许多文章估算的是区块链上“每笔交易”的能源消耗。 然而,这种估算可能会产生误导,因为提出和验证区块所需的能源与区块中的交易数量无关。 如果以每笔交易为单位计算能源消耗,意味着交易越少能源消耗越少,反之亦然,但事实并非如此。 而且,每笔交易的能源消耗估算值高度依赖于区块链的交易吞吐量是如何定义的,并且可以通过调整这个定义来使估算值看起来更大或更小。 -例如,在以太坊上,交易吞吐量不仅是基础层的交易吞吐量,还包括所有“[二层网络](/layer-2/)”卷叠的交易吞吐量总和。 二层网络的交易吞吐量总和通常未包含在计算中,但可以解释排序者使用的额外能源(少量)以及他们处理的交易数量(大量)可能会大幅降低每笔交易的能源消耗估算值。 这就是跨平台比较每笔交易的能源消耗可能造成误导的原因之一。 +例如,在以太坊上,交易吞吐量不仅是基础层的交易吞吐量,还包括所有“[二层网络](/layer-2/)”卷叠的交易吞吐量总和。 二层网络的交易吞吐量总和通常未包含在计算中,但可以解释排序者使用的额外能源(少量)以及他们处理的交易数量(大量)可能会大幅降低每笔交易的能源消耗估算值。 这就是为什么跨平台比较每笔交易的能源消耗可能造成误导的原因之一。 ## 以太坊的碳债务 {#carbon-debt} 以太坊目前的能源消耗非常低,但并非总是如此。 以太坊最初采用工作量证明机制,其环境成本远远高于目前的权益证明机制。 -创立伊始,以太坊就计划实施权益证明共识机制,但要实施这种共识机制而不牺牲安全性和去中心化,需要多年的重点研究和开发。 因此,使用了工作量证明机制来启动网络。 工作量证明机制要求矿工使用计算硬件进行值计算,而这个过程中会消耗能源。 +创立伊始,以太坊就计划实施权益证明共识机制,但要施这种共识机制而不牺牲安全性和去中心化,需要多年的重点研究和开发。 因此,我们使用了工作量证明机制启动以太坊网络。 工作量证明机制要求矿工使用计算硬件进行值计算,而这个过程中会消耗能源。 ![合并前后以太坊能源消耗比较,左侧 330 米高的埃菲尔铁塔表示以太坊合并前的高能耗,右侧 4 厘米高的乐高小人代表以太坊合并后大幅降低的能耗](energy_consumption_pre_post_merge.png) -CCRI 估计,以太坊的年化耗电量会因合并减少 **99.988% ** 以上。 同样,以太坊的碳足迹减少了大约 **99.992%**(二氧化碳当量从 11,016,000 吨减少到 870 吨)。 比较而言,排放减少量就如同从埃菲尔铁塔的高度下降到小塑料玩偶一般巨大,如上图所示。 因此,保护网络的环境成本大大降低。 同时,据信网络安全也得到改善。 +CCRI 估计,以太坊的年化耗电量会因合并减少 **99.988%** 以上。 同样,以太坊的碳足迹减少了大约 **99.992%**(二氧化碳当量从 11,016,000 吨减少到 870 吨)。 比较而言,排放减少量就如同从埃菲尔铁塔的高度下降到小塑料玩偶一般巨大,如上图所示。 因此,保护网络的环境成本大大降低。 同时,据信网络安全也得到改善。 ## 绿色应用程序层 {#green-applications} 尽管以太坊的能源消耗非常低,但以太坊上也出现了大量不断增长且高度活跃的[**再生金融 (ReFi)**](/refi/) 社区。 再生金融应用程序使用去中心化金融组件来构建具有积极外部影响,从而使环境受益的金融应用程序。 再生金融是更广泛的[“太阳朋克”](https://en.wikipedia.org/wiki/Solarpunk)运动的一部分,这项运动与以太坊高度契合,旨在将技术进步和环境管理结合起来。 以太坊具有去中心化、无需许可和可组合的特性,这使其成为再生金融和太阳朋克社区的理想基础层。 -Web3 原生公共物品融资平台,如 [Gitcoin](https://gitcoin.co) 举行气候进程,推动在以太坊应用程序层上形成环境意识。 通过制定这些计划(以及其他,例如[去中心化科研](/desci/)),以太坊正在成为一项对环境和社会有益的技术。 +Web3 原生公共物品融资平台,如 [Gitcoin](https://gitcoin.co) 举行气候回合,推动在以太坊应用程序层上形成环境意识。 通过制定这些计划(以及其他,例如[去中心化科学](/desci/)),以太坊正在成为一项对环境和社会有益的技术。 如果你认为本页尚有可改进之处,请提出问题或拉取请求。 本页面上的统计数据是基于公开数据的估算值 - 它们不代表 ethereum.org 团队或以太坊基金会的官方声明或承诺。 diff --git a/public/content/translations/zh/governance/index.md b/public/content/translations/zh/governance/index.md index 317ff7aad6c..0eeed867ae1 100644 --- a/public/content/translations/zh/governance/index.md +++ b/public/content/translations/zh/governance/index.md @@ -21,7 +21,7 @@ _如果没有人拥有以太坊,那么关于以太坊过去和未来变化的 ## 以太坊治理 {#ethereum-governance} -以太坊治理是指进行协议更改的流程。 需要特别指出的是,这个流程与人们和应用程序如何使用该协议无关 - 以太坊无需许可。 世界上任何人都可以在任意地方参与链上活动。 没有规定谁可以或者不可以构建应用程序或者发送交易。 然而,需要有一个流程来提议针对核心协议的修改,去中心化应用正是在核心协议上运行的。 由于非常多的人都依赖以太坊的稳定性,因此对包括社会和技术流程在内的核心修改进行协调的门槛非常高,需要确保对以太坊进行的任何修改都是安全的并得到社区的广泛支持。 +以太坊治理是指进行协议更改的流程。 需要特别指出的是,这个流程与人们和应用程序如何使用该协议无关 - 以太坊无需许可。 世界上任何人都可以在任意地方参与链上活动。 没有规定谁可以或者不可以构建应用程序或者发送交易。 然而,需要有一个流程来提议针对核心协议的修改,去中心化应用程序正是在核心协议上运行的。 由于非常多的人都依赖以太坊的稳定性,因此对包括社会和技术流程在内的核心修改进行协调的门槛非常高,需要确保对以太坊进行的任何修改都是安全的并得到社区的广泛支持。 ### 链上治理与链下治理 {#on-chain-vs-off-chain} @@ -47,20 +47,20 @@ _虽然在协议层上,以太坊的治理在链下进行,但许多基于以 - **应用程序用户**:这些人员与以太坊区块链上的应用程序交互。 - **应用程序/工具开发者**:这些人编写在以太坊区块链上运行的应用程序是(比如去中心化金融、非同质化代币等)或构建以太坊交互的工具(例如钱包、测试套件等)。 [关于去中心化应用程序的更多信息](/dapps/)。 - **节点运营商**:这些人运行区块和交易广播节点,拒绝遇到的任何无效交易或区块。 [关于节点的更多信息](/developers/docs/nodes-and-clients/)。 -- **以太坊改进提议作者**:这些人提议修改以太坊协议,具体形式为以太坊改进提议。 [关于以太坊改进提议的更多信息](/eips/)。 +- **以太坊改进提案作者**:这些人提议修改以太坊协议,具体形式为以太坊改进提案。 [关于以太坊改进提案的更多信息](/eips/)。 - **验证者**:这些人运行的节点能够将新的区块添加到以太坊区块链上。 - **协议开发者**(又名 “核心开发者”):这些人需要维护各种以太坊实现(例如执行层的 go-ethereum、Nethermind、Besu、Erigon,或共识层的 Prysm、Lighthouse、Nimbus、Teku、Lodestar)。 [关于以太坊客户端的更多信息](/developers/docs/nodes-and-clients/)。 -_注:任何个人都可以属于多个组(如:协议开发者可以支持以太坊改进提议,运行信标链验证者,并使用去中心化金融应用程序)。 不过为了明确概念,这样最容易区分。_ +_注:任何个人都可以属于多个组(如:协议开发者可以支持以太坊改进提案,运行信标链验证者,并使用去中心化金融应用程序)。 不过为了明确概念,这样最容易区分。_ -## 什么是以太坊改进提议? {#what-is-an-eip} +## 什么是以太坊改进提案? {#what-is-an-eip} -以太坊治理中使用的一个重要流程是**以太坊改进提议**。 以太坊改进提议是指明以太坊潜在新功能或流程的一套标准。 以太坊社区内的任何人都可以创建以太坊改进提议。 如果你对撰写以太坊改进提案或参与同行评审和/或治理感兴趣,请参阅: +以太坊治理中使用的一个重要流程是**以太坊改进提案**。 以太坊改进提案是指明以太坊潜在新功能或流程的一套标准。 以太坊社区内的任何人都可以创建以太坊改进提案。 如果你对撰写以太坊改进提案或参与同行评审和/或治理感兴趣,请参阅: - 关于以太坊改进提议的更多信息 + 关于以太坊改进提案的更多信息 @@ -69,21 +69,21 @@ _注:任何个人都可以属于多个组(如:协议开发者可以支持 对以太坊协议进行修改的正式流程如下: -1. **提出核心以太坊改进提议**:如 [EIP-1](https://eips.ethereum.org/EIPS/eip-1#core-eips) 所述,正式提议对以太坊进行修改的第一步是在核心以太坊改进提议进行详细说明。 一旦被接受,这将作为协议开发者要执行的以太坊改进提议正式规范。 +1. **提出核心以太坊改进提案**:如 [EIP-1](https://eips.ethereum.org/EIPS/eip-1#core-eips) 所述,正式提议对以太坊进行修改的第一步是在核心以太坊改进提案进行详细说明。 一旦被接受,这将作为协议开发者要执行的以太坊改进提案正式规范。 -2. **向协议开发者展示以太坊改进提议**:一旦拥有已对其收集社区意见的核心以太坊改进提议,您应该将它展示给协议开发者。 您可以通过提议在 [AllCoreDevs 调用](https://github.com/ethereum/execution-specs/tree/master/network-upgrades#getting-the-considered-for-inclusion-cfi-status)中进行讨论来实现此目的。 很可能已经在 [Ethereum Magician 论坛](https://ethereum-magicians.org/)或 [Ethereum R&D Discord](https://discord.gg/mncqtgVSVw) 中进行过异步讨论。 +2. **向协议开发者展示以太坊改进提案**:一旦拥有已对其收集社区意见的核心以太坊改进提案,你应该将它展示给协议开发者。 你可以通过提议在 [AllCoreDevs 调用](https://github.com/ethereum/execution-specs/tree/master/network-upgrades#getting-the-considered-for-inclusion-cfi-status)中进行讨论来实现此目的。 很可能已经在 [Ethereum Magician 论坛](https://ethereum-magicians.org/)或 [Ethereum R&D Discord](https://discord.gg/mncqtgVSVw) 中进行过异步讨论。 > 此阶段的潜在成果包括: -> - 该以太坊改进提议将被考虑用于未来网络升级 +> - 该以太坊改进提案将被考虑用于未来网络升级 > - 要求技术变更 > - 如果不是优先事项或相对于发展工作而言改进不够明显,则可能会被否决。 -3. 收到所有相关利益相关方的反馈意见后,**进入最终提议:**您很可能需要更改初始建议,以改善其安全性,或更好地满足不同用户的需求。 一旦以太坊改进提议中包含了您认为必要的所有更改,您需要再次将其展示给协议开发者。 然后进入流程的下一步,或者出现新问题,需要对您的建议进行另一轮迭代。 +3. 收到所有相关利益相关方的反馈意见后,**进入最终提议:**你很可能需要更改初始建议,以改善其安全性,或更好地满足不同用户的需求。 一旦以太坊改进提案中包含了你认为必要的所有更改,你需要再次将其展示给协议开发者。 然后进入流程的下一步,或者出现新问题,需要对你的建议进行另一轮迭代。 -4. **将以太坊改进提议包含在网络升级中**:假定该以太坊改进提议已经过审批、测试和实施,将被安排作为网络升级的一部分。 鉴于网络升级的协调成本很高(每个人都需要同步升级),以太坊改进提议通常被捆绑在一起升级。 +4. **将以太坊改进提案包含在网络升级中**:假定该以太坊改进提案已经过审批、测试和实施,将被安排作为网络升级的一部分。 鉴于网络升级的协调成本很高(每个人都需要同步升级),以太坊改进提案通常被捆绑在一起升级。 -5. **网络升级已激活**:网络升级激活后,以太坊改进提议将在以太坊网络上运行。 _注意:网络升级通常在测试网上激活后才会在以太坊主网上激活。_ +5. **网络升级已激活**:网络升级激活后,以太坊改进提案将在以太坊网络上运行。 _注意:网络升级通常在测试网上激活后才会在以太坊主网上激活。_ 这一流程虽然极度简化,但概述了在以太坊激活协议修改的重要阶段。 现在看看该流程中的非正式因素。 @@ -91,11 +91,11 @@ _注:任何个人都可以属于多个组(如:协议开发者可以支持 ### 了解先前的工作 {#prior-work} -以太坊改进提议倡导者应首先熟悉先前的工作和建议,然后认真考虑创建一个可部署到以太坊主网上的以太坊改进提议。 这样,该提议很有可能带入一些以前没有被拒绝过的新事物。 研究此问题的三个主要方面是[以太坊改进提案存储库](https://github.com/ethereum/EIPs)、[以太坊魔法师](https://ethereum-magicians.org/)和 [ethresear.ch](https://ethresear.ch/)。 +以太坊改进提案倡导者应首先熟悉先前的工作和建议,然后认真考虑创建一个可部署到以太坊主网上的以太坊改进提案。 这样,该提议很有可能带入一些以前没有被拒绝过的新事物。 研究此问题的三个主要方面是[以太坊改进提案存储库](https://github.com/ethereum/EIPs)、[以太坊魔法师](https://ethereum-magicians.org/)和 [ethresear.ch](https://ethresear.ch/)。 ### 工作组 {#working-groups} -如果未经编辑或修改,以太坊改进提议的初稿不太可能在以太坊主网上执行。 一般而言,以太坊改进提议倡导者将与一部分协议开发者合作,指明、实施、测试、迭代和最后确定提议。 根据历史经验,这些工作组需要几个月(有时甚至需要几年!)。 同样的,以太坊改进提议倡导者应在收集最终用户反馈意见和减轻部署风险的工作早期就让相关应用程序/工具开发者参与。 +如果未经编辑或修改,以太坊改进提案的初稿不太可能在以太坊主网上执行。 一般而言,以太坊改进提案倡导者将与一部分协议开发者合作,指明、实施、测试、迭代和最后确定提议。 根据历史经验,这些工作组需要几个月(有时甚至需要几年!)。 同样的,以太坊改进提案倡导者应在收集最终用户反馈意见和减轻部署风险的工作早期就让相关应用程序/工具开发者参与。 ### 社区共识 {#community-consensus} @@ -103,9 +103,9 @@ _注:任何个人都可以属于多个组(如:协议开发者可以支持 在如何处理争议性提议方面没有明确的指导手册。 这是以太坊去中心化设计的结果,其中没有任何一个利益相关者群体可以通过蛮力强迫其他人:协议开发者可以选择不实施代码更改;节点操作员可以选择不运行最新的以太坊客户端;应用程序团队和用户可以选择不在链上进行交易。 由于协议开发者没有办法强迫人们执行网络升级,他们通常会避免实施对于更广泛社区来说争议大于好处的以太坊改进提案。 -以太坊改进提议倡导者应征求所有相关利益相关方的反馈意见。 如果您发现自己是一个有争议的以太坊改进提议倡导者,你应该尝试解决反对方的问题,以便围绕该提议建立共识。 考虑到以太坊社区的规模和多样性,无法使用固定形式(如:投币选举)来达成社区共识,并且提议倡导者将适应他们提案的情况。 +以太坊改进提案倡导者应征求所有相关利益相关方的反馈意见。 如果你发现自己是一个有争议的以太坊改进提案倡导者,你应该尝试解决反对方的问题,以便围绕该提议建立共识。 考虑到以太坊社区的规模和多样性,无法使用固定形式(如:投币选举)来达成社区共识,并且提议倡导者将适应他们提案的情况。 -除了以太坊网络的安全性外,协议开发者历来对应用程序/工具开发者和应用程序用户的价值给予了高度重视,因为正是因为他们使用和发展以太坊,才使以太坊生态系统对其他利益相关方形成吸引力。 此外,以太坊改进提议需要在所有客户实端实施执行,这些项目由不同的团队管理。 在这个过程中,通常意味着让多个协议开发者团队相信,某个特定的改变有价值,它有助于最终用户或解决安全问题。 +除了以太坊网络的安全性外,协议开发者历来对应用程序/工具开发者和应用程序用户的价值给予了高度重视,因为正是因为他们使用和发展以太坊,才使以太坊生态系统对其他利益相关方形成吸引力。 此外,以太坊改进提案需要在所有客户实端实施执行,这些项目由不同的团队管理。 在这个过程中,通常意味着让多个协议开发者团队相信,某个特定的改变有价值,它有助于最终用户或解决安全问题。 @@ -163,7 +163,7 @@ _注:任何个人都可以属于多个组(如:协议开发者可以支持 ## 如何加入? {#get-involved} -- [提出以太坊改进提议](/eips/#participate) +- [提出以太坊改进提案](/eips/#participate) - [讨论目前的提案](https://ethereum-magicians.org/) - [参与 R&D 讨论](https://ethresear.ch/) - [加入以太坊 R&D Discord](https://discord.gg/mncqtgVSVw) @@ -173,11 +173,11 @@ _注:任何个人都可以属于多个组(如:协议开发者可以支持 ## 延伸阅读 {#further-reading} -以太坊的治理并没有严格定义。 各社区参与者对此有着不同的看法。 例如: +以太坊的治理并没有严格定义。 各社区参与者对此有着不同的看法。 以下是其中一部分: -- [关于区块链管理的说明](https://vitalik.ca/general/2017/12/17/voting.html) - _Vitalik Buterin_ +- [关于区块链管理的说明](https://vitalik.eth.limo/general/2017/12/17/voting.html) - _Vitalik Buterin_ - [以太坊治理如何发挥作用?](https://cryptotesters.com/blog/ethereum-governance) - _Cryptotestters_ - [以太坊治理如何发挥作用](https://medium.com/coinmonks/how-ethereum-governance-works-71856426b63a)- _Micah Zoltu_ - [什么是以太坊核心开发者?](https://hudsonjameson.com/2020-06-22-what-is-an-ethereum-core-developer/)- _Hudson Jameson_ -- [治理,第 2 部分:财阀统治仍非好事](https://vitalik.ca/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ -- [超越代币投票的治理方式](https://vitalik.ca/general/2021/08/16/voting3.html) - _Vitalik Buterin_ +- [治理,第 2 部分:财阀统治仍非好事](https://vitalik.eth.limo/general/2018/03/28/plutocracy.html) - _Vitalik Buterin_ +- [超越代币投票的治理方式](https://vitalik.eth.limo/general/2021/08/16/voting3.html) - _Vitalik Buterin_ diff --git a/public/content/translations/zh/nft/index.md b/public/content/translations/zh/nft/index.md index a605b833f09..b6a050df9d5 100644 --- a/public/content/translations/zh/nft/index.md +++ b/public/content/translations/zh/nft/index.md @@ -14,38 +14,32 @@ summaryPoint3: 由以太坊区块链上的智能合约提供支持 ## 什么是非同质化代币? {#what-are-nfts} -每个非同质化代币都是独一无二的。 每个非同质化代币都有不同的属性(非同质化),并且可证明其稀缺性。 这与 ERC-20 等代币不同,同一 ERC-20 代币集合中的所有代币都是完全相同的,拥有同样的属性(“同质化”)。 你无需关心钱包中的具体某一张钞票,因为它们完全相同并具有同样的价值。 然而,你*需要*关心你拥有具体哪一个非同质化代币,因为它们都有区分于其他非同质化代币的独特属性(“非同质化”)。 +每个非同质化代币都是独一无二的。 每个非同质化代币都有不同的属性(非同质化),并且可证明其稀缺性。 这一点不同于以太币和 USDC 等其他基于以太坊的代币,这类代币中,每个代币都是相同的且具有相同的属性(“同质化”)。 你不会关心钱包中的具体某一张钞票(或以太币),因为它们完全相同且具有同样的价值。 然而,你_需要_关心你拥有具体哪一个非同质化代币,因为它们都有区分于其他非同质化代币的独特属性(“非同质化”)。 -每个非同质化代币的独特性使其能够实现艺术品、收藏品甚至房地产等资产的代币化,一个特定的独特非同质化代币可以代表一个特定的独特实体或数字物品。 资产所有权由以太坊区块链保护 - 任何人都不能修改所有权记录或复制/粘贴新的非同质化代币。 +每个非同质化代币的独特性使其能够实现艺术品、收藏品甚至房地产等资产的代币化,一个特定的独特非同质化代币可以代表一个特定的独特实体或数字物品。 资产的所有权可以在以太坊区块链上公开验证。 ## 资产互联网 {#internet-of-assets} -非同质化代币和以太坊解决了当前互联网上存在的一些问题。 随着一切都变得更加数字化,我们需要以不受中心化机构控制的方式,复制实体物品的属性, 如稀缺性、独特性和所有权证明。 例如,通过非同质化代币,你可以拥有不属于某个公司特定音乐应用的音乐 mp3,或者拥有一个可以出售或交换但不会被平台提供商任意收回的社交媒体账号。 +非同质化代币和以太坊解决了当前互联网上存在的一些问题。 随着数字化程度的提升,需要以一种不受中心化组织控制的方式复制实体物品的属性,如稀缺性、独特性和所有权证明。 例如,利用非同质化代币,你可以在所有以太坊应用程序中拥有一个音乐 mp3 文件的所有权,而不必局限于某一家公司的特定音乐应用程序(如 Spotify 或 Apple Music)。 你可以拥有一个社交媒体账号,你自己可以出售或交换,但平台提供商不能任意收回。 非同质化代币互联网与我们今天大多数人使用的互联网的对比如下…… ### 对比 {#nft-comparison} -| 非同质化代币互联网 | 当今互联网 | -| --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | -| 你拥有自己的数字资产! 只有你可以出售或交换它们。 | 你从某个组织租借到资产。 | -| 非同质化代币在数字世界里是独一无二的,没有两个相同的非同质化代币。 | 物体的副本通常无法与原件区分开。 | -| 非同质化代币的所有权储存在区块链上,任何人都可以验证。 | 数字物品的所有权记录存储在由机构控制的服务器上 - 你必须相信他们的话。 | -| 非同质化代币是以太坊上的智能合约。 这意味人们很容易在以太坊上的其他智能合约或者应用中使用它。 | 拥有数字物品的公司通常需要自己的“围墙花园(封闭平台)”基础设施。 | -| 内容创建人可以在任何地方出售他们的作品,并可以进入全球市场。 | 创建人依靠所用平台的基础设施和分布。 这通常受到使用条款和地理限制的制约。 | -| 非同质化代币创建人可以保留自己作品的所有权,并直接在非同质化代币合约中设置版税。 | 音乐媒体服务等平台扣留大部分销售利润。 | - -## 非同质化代币的工作原理是什么? {#how-nfts-work} - -和在以太坊上发行的任何代币一样,非同质化代币也是由智能合约发行的。 智能合约符合几种非同质化代币标准中的一种(通常是 ERC-721 或 ERC-1155),这些标准定义了合约具有的功能。 合约可以创建(“铸造”)非同质化代币并将它们分配给特定所有者。 在合约中,通过将特定非同质化代币映射到特定地址来定义所有权。 非同质化代币有一个 ID,并通常有与之相关联的元数据,这使其成为独一无二的特定代币。 - -当有人创建或铸造一个非同质化代币时,他们实际上是在智能合约中执行一个函数,将特定非同质化代币分配到其地址。 这一信息储存在合约的存储空间中,也是区块链的一部分。 合约创建人可以在合约中添加额外逻辑,例如限制总供应量或定义每次转让代币时需支付给创建人的版税。 +| 非同质化代币互联网 | 当今互联网 | +| ----------------------------------------------- | ------------------------------------- | +| 你拥有自己的数字资产! 只有你可以出售或交换它们。 | 你租用某个组织的资产,该资产可以被收回。 | +| 非同质化代币在数字世界里是独一无二的,没有两个相同的非同质化代币。 | 物体的副本通常无法与原件区分开。 | +| 非同质化代币的所有权储存在区块链上,任何人都可以验证。 | 数字物品的所有权记录存储在由机构控制的服务器上 - 你必须相信他们的话。 | +| 非同质化代币是以太坊上的智能合约。 这意味人们很容易在以太坊上的其他智能合约或者应用中使用它。 | 拥有数字物品的公司通常需要自己的“围墙花园(封闭平台)”基础设施。 | +| 内容创建人可以在任何地方出售他们的作品,并可以进入全球市场。 | 创建人依靠所用平台的基础设施和分布。 这通常受到使用条款和地理限制的制约。 | +| 非同质化代币创建人可以保留自己作品的所有权,并直接在非同质化代币合约中设置版税。 | 音乐媒体服务等平台扣留大部分销售利润。 | ## 非同质化代币有哪些用武之地? {#nft-use-cases} -非同质化代币可以用于多种用途,包括: +非同质化代币有多种用途,包括: - 证明你参加过某个活动 - 证明你完成了某个课程 @@ -56,25 +50,39 @@ summaryPoint3: 由以太坊区块链上的智能合约提供支持 - 限制内容访问权限 - 发放凭据 - 分布式互联网域名 -- DeFi 抵押品 +- 去中心化金融抵押品 -假设你是一位艺术家,希望使用非同质化代币分享自己的作品,同时不想失去对作品的控制,也不想中间商分走利润。 你可以创建一个新合约,指定非同质化代币的数量、属性和特定艺术品的链接。 作为艺术家,你可以在智能合约中设置你应该收取的版税(例如,每次转让非同质化代币时,将销售价格的 5% 转到合约所有人)。 因为你拥有部署合约的钱包,所以你可以始终证明是你是非同质化代币的创建人。 你的买家也可以轻松地证明他们拥有你的系列艺术品中的一个真正的非同质化代币,因为他们的钱包地址与你的智能合约中的一个代币相关联。 他们可以在整个以太坊生态系统中使用非同质化代币,因为其真实性能得到保证。 +假设你是一位艺术家,希望使用非同质化代币分享自己的作品,同时不想失去对作品的控制,也不想中间商分走利润。 你可以创建一个新合约,指定非同质化代币的数量、属性和特定艺术品的链接。 作为艺术家,你可以在智能合约中设置你应该收取的版税(例如,每次转让非同质化代币时,将销售价格的 5% 转给合约所有人)。 因为你拥有部署合约的钱包,所以你始终可以证明是你是非同质化代币的创建人。 你的买家也可以轻松地证明他们拥有代表你的系列艺术品的真正的非同质化代币,因为他们的钱包地址与你的智能合约中的一个代币相关联。 他们可以在整个以太坊生态系统中使用该非同质化代币,因为其真实性能得到保证。 -再以体育活动的门票为例。 就像活动组织方可以选择出售多少门票一样,非同质化代币的创建人可以决定创建多少份复制品。 有时候,这些是完全相同的复制品,如 5000 张普通门票。 有时候,会制作一些非常相似但略有不同的门票,如指定座位的门票。 这些门票可以在用户之间点对点买卖,而无需支付票务处理费用,买家也可以通过检查合约地址来确保门票的真实性。 +再以体育赛事的门票为例。 就像赛事组织方可以选择出售多少门票一样,非同质化代币的创建人可以决定创建多少份复制品。 有时候,它们是完全相同的复制品,如 5000 张普通门票。 有时候,会制作一些非常相似但略有不同的门票,如指定座位的门票。 这些门票可以在用户之间点对点买卖,而无需支付票务处理费用,买家始终可以通过检查合约地址来确保门票的真实性。 -在 ethereum.org 上,非同质化代币被用来证明人们对我们的 GitHub 库做出了贡献或者参加了电话会议,我们甚至拥有自己的非同质化代币域名。 如果你对 ethereum.org 做了贡献,即可认领出勤证明协议非同质化代币。 一些数字货币相关活动使用 POAP 作为门票。 [关于贡献的更多信息](/contributing/#poap)。 +在 ethereum.org 上,非同质化代币用于证明人们对我们的 Github 存储库做出了有意义的贡献(对网站进行了编程、撰写或修改了文章...)、翻译了我们的内容或参加了我们的社区电话会议,我们甚至拥有了自己的非同质化代币域名。 如果你对 ethereum.org 做出了贡献,可以认领 POAP 徽章非同质化代币。 一些加密货币相关活动使用 POAP 徽章作为门票。 [关于贡献的更多信息](/contributing/#poap)。 -![ethereum.org 出勤证明协议](./poap.png) +![ethereum.org POAP 徽章](./poap.png) -本网站也有一个由非同质化代币支持的备用域名:**ethereum.eth**。 我们的 `.org` 地址由域名系统 (DNS) 提供商集中管理,而 ethereum`.eth` 则通过以太坊域名服务 (ENS) 在以太坊上注册。 此域名由我们所有和管理。 [查看我们的 ENS 记录](https://app.ens.domains/name/ethereum.eth) +本网站也有一个由非同质化代币支持的备用域名:**ethereum.eth**。 我们的 `.org` 地址由域名系统 (DNS) 提供商集中管理,而 ethereum`.eth` 则通过以太坊域名服务 (ENS) 在以太坊上注册。 此域名由我们拥有和管理。 [查看我们的以太坊域名服务记录](https://app.ens.domains/name/ethereum.eth) [关于以太坊域名服务的更多信息](https://app.ens.domains) +## 非同质化代币的工作原理是什么? {#how-nfts-work} + +非同质化代币与以太坊区块链上的任何数字物品一样,都是通过一种称为“智能合约”的特殊以太坊计算机程序创建的。 这些合约遵循某些规则,例如 ERC-721 或 ERC-1155 标准,这些规则决定了合约的功能。 + +非同质化代币智能合约可以做一些重要事情: + +- **创建非同质化代币:**它可以创建新的非同质化代币。 +- **分配所有权:**通过将非同质化代币链接到特定的以太坊地址来跟踪谁拥有哪些非同质化代币。 +- **为每个非同质化代币提供 ID:**每个非同质化代币都有一个独一无二的编号。 此外,通常还会附加一些信息(元数据),描述非同质化代币所代表的内容。 + +当有人“创建”或“铸造”非同质化代币时,本质上是告诉智能合约赋予他们特定非同质化代币的所有权。 该信息安全且公开地存储在区块链中。 + +此外,合约的创建人可以添加额外的规则。 他们可能会限制某种非同质化代币的创建数量,或者决定在非同质化代币易手时他们应该获得少量版税。 + ### 非同质化代币安全性 {#nft-security} -以太坊的安全性来自权益证明。 该机制旨在通过经济手段遏制恶意行为,使以太坊防篡改。 这使得非同质化代币成为可能。 一旦包含你的非同质化代币交易的区块最终确定,攻击者需要花费数百万个以太币才能更改它。 运行以太坊软件的任何人都能立即检测到对非同质化代币的不诚实篡改,并且不良行为者将受到经济处罚并被驱逐出网络。 +以太坊的安全性来自权益证明。 该机制旨在通过经济手段遏制恶意行为,使以太坊防篡改。 这便是非同质化代币的由来。 一旦包含你的非同质化代币交易的区块最终确定,攻击者需要花费数百万个以太币才能更改它。 运行以太坊软件的任何人都能立即检测到对非同质化代币的不诚实篡改,并且不良行为者将受到经济处罚并被驱逐出网络。 非同质化代币的安全问题通常与网络钓鱼诈骗、智能合约漏洞或用户错误(例如无意中暴露私钥)有关,因此非同质化代币所有者务必保障钱包的安全性。 @@ -84,7 +92,7 @@ summaryPoint3: 由以太坊区块链上的智能合约提供支持 ## 延伸阅读 {#further-reading} -- [非同质化代币初学者指南](https://linda.mirror.xyz/df649d61efb92c910464a4e74ae213c4cab150b9cbcc4b7fb6090fc77881a95d) - _Linda Xie,2020 年 1 月_ +- [非同质化代币初学者指南](https://linda.mirror.xyz/df649d61efb92c910464a4e74ae213c4cab150b9cbcc4b7fb6090fc77881a95d) – _Linda Xie,2020 年 1 月_ - [EtherscanNFT 跟踪器](https://etherscan.io/nft-top-contracts) - [ERC-721 代币标准](/developers/docs/standards/tokens/erc-721/) - [ERC-1155 代币标准](/developers/docs/standards/tokens/erc-1155/) diff --git a/public/content/translations/zh/roadmap/account-abstraction/index.md b/public/content/translations/zh/roadmap/account-abstraction/index.md index 085d023f841..b8486346afb 100644 --- a/public/content/translations/zh/roadmap/account-abstraction/index.md +++ b/public/content/translations/zh/roadmap/account-abstraction/index.md @@ -1,5 +1,5 @@ --- -title: 账户抽象 +title: 帐户抽象 description: 关于以太坊简化用户帐户和增强用户帐户安全性的计划的概述 lang: zh summaryPoints: @@ -8,7 +8,7 @@ summaryPoints: - 丢失和泄露的密钥可以通过多重备份进行找回 --- -# 账户抽象 {#account-abstraction} +# 帐户抽象 {#account-abstraction} 用户通过**[外部帐户 (EOA)](/glossary/#eoa)** 与以太坊进行交互。 这是当前开始交易或执行智能合约的唯一方式, 这限制了用户与以太坊的交互。 例如,这导致很难进行批量交易,并且要求用户一直让以太币帐户中有余额以支付燃料费。 @@ -25,8 +25,8 @@ summaryPoints: 由于目前只有外部帐户 ([EOA](/glossary/#eoa)) 可以发起交易,所以这些好处还没有得到本地支持。 外部帐户采用简单的公钥-私钥对。 它们的工作原理如下: -- 如果你拥有私钥,可以在以太坊虚拟机 (EVM) 的规则范围内做任何事情。 -- 如果你没有私钥,将无法进行*任何操作*。 +- 如果你拥有私钥,可以在以太坊虚拟机 (EVM) 的规则范围内做_任何_事情。 +- 如果你没有私钥,将无法进行_任何操作_。 如果你丢失了密钥则无法找回,而窃取者可以使用窃取的密钥立即获得帐户中的所有资金。 @@ -47,8 +47,8 @@ summaryPoints: - **多重签名授权**:你可以在多个受信任的人或设备之间共享授权凭证。 然后,可以对合约进行配置,以便超过预设值的交易需要获得一定比例(例如 3/5)的受信任方的授权。 例如,高价值的交易可能需要在移动设备和硬件钱包上都获得批准,或者需要分散在受信任家庭成员的帐户的签名。 - **帐户冻结**:如果设备丢失或被入侵,可以从另一个经过授权的设备上锁定帐户,以保护用户的资产安全。 - **帐户找回**:丢失设备或忘记密码了? 在目前的模式下,这意味着你的资产可能被永远冻结。 通过智能合约钱包,你可以对一些帐户进行预授权,使其可以授权新设备并重置访问权限。 -- **设置交易限额**:指定一天/一周/一个月内每天最高可以从帐户中转出的价值。 这意味着,即使攻击者成功获得了你的帐户的访问权限,他们也无法一次性将所有资金转移走,而你有机会冻结帐户并重新设置访问权限。 -- **创建白名单**:仅允许与你认为安全的特定地址进行交易。 这意味着*即使* 你的私钥被盗,攻击者也无法将资金发送到非白名单目标帐户。 这些白名单需要多个签名才能更改,这样除非攻击者能够获得你的多个备份密钥,否则无法将自己的地址添加到名单中。 +- **设置交易限制**:指定帐户一天/一周/一月可以转移的每日价值阈值。 这意味着,即使攻击者成功获得了你的帐户的访问权限,他们也无法一次性将所有资金转移走,而你有机会冻结帐户并重新设置访问权限。 +- **创建白名单**:只能与已知安全的地址进行交易。 这意味着_即使_ 你的私钥被盗,攻击者也无法将资金发送到非白名单目标帐户。 这些白名单需要多个签名才能更改,这样除非攻击者能够获得你的多个备份密钥,否则无法将自己的地址添加到名单中。 ## 改善用户体验 {#better-user-experience} @@ -60,7 +60,7 @@ summaryPoints: 燃料管理是以太坊用户主要面临的问题之一,主要是因为以太币是唯一可用于支付交易费用的资产。 假设你的钱包内有 USDC 余额但没有以太币余额。 由于你无法支付燃料费用,所以无法转移或交换这些 USDC 代币。 你也无法将 USDC 交换成以太币,因为这个操作本身也需要支付燃料费用。 要解决这个问题,你需要从交易所或其他地址向你的帐户发送更多以太币。 通过智能合约钱包,你可以轻松使用 USDC 支付燃料费用,从而解放你的帐户。 你不再需要在所有帐户中保持以太币余额了。 -帐户抽象还可以让去中心化应用程序的开发者以创造性的方式进行燃料管理。 例如,你可以考虑与你最喜爱的去中心化交易所达成协议,每月支付固定费用以获得无限次交易的权限。 去中心化应用可能会作为你使用其平台的奖励或入门优惠,为你支付所有燃料费用。 当智能合约钱包在协议层面得到支持时,开发者在燃料管理方面进行创新将更加容易。 +帐户抽象还可以让去中心化应用程序的开发者以创造性的方式进行燃料管理。 例如,你可以考虑与你最喜爱的去中心化交易所达成协议,每月支付固定费用以获得无限次交易的权限。 去中心化应用程序可能会作为你使用其平台的奖励或入门优惠,为你支付所有燃料费用。 当智能合约钱包在协议层面得到支持时,开发者在燃料管理方面进行创新将更加容易。 @@ -100,7 +100,7 @@ EIP-4337 是以去中心化方式使智能合约钱包获得本地支持的第 -EIP-3074 旨在更新以太坊的外部帐户,允许其将控制权委托给智能合约。 这意味着智能合约逻辑可以批准源自外部帐户的交易。 这可以实现一些功能,如燃料赞助和批量交易。 要使其生效,需要向以太坊虚拟机添加两个新的操作码:AUTHAUTHCALL。 通过 EIP-3074,不需要合约就可以获得智能合约钱包的好处,取而代之的是一种特定类型的无状态、免信任、不可升级的合约(被称为“调用者”),用于处理交易。 +EIP-3074 旨在更新以太坊的外部帐户,允许其将控制权委托给智能合约。 这意味着智能合约逻辑可以批准源自外部帐户的交易。 这可以实现一些功能,如燃料赞助和批量交易。 要使其生效,需要向以太坊虚拟机添加两个新的操作码:AUTHAUTHCALL。 通过 EIP-3074,不需要合约就可以获得智能合约钱包的好处,取而代之的是一种特定类型的无状态、去信任、不可升级的合约(被称为“调用者”),用于处理交易。 请注意,EIP-3074 目前尚未激活。 目前社区更倾向于 EIP-4337,因为它不需要对协议进行更改。 @@ -114,10 +114,10 @@ EIP-4337 是以去中心化方式使智能合约钱包获得本地支持的第 - [erc4337.io](https://www.erc4337.io/) - [帐户抽象面板探讨 — Devcon Bogota](https://www.youtube.com/watch?app=desktop&v=WsZBymiyT-8) -- ["为什么帐户抽象对于去中心化应用而言是一场革命性的变革" — Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) -- ["帐户抽象 ELI5” — Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) +- ["为什么帐户抽象对于去中心化应用程序而言是一场革命性的变革" — Devcon Bogota](https://www.youtube.com/watch?v=OwppworJGzs) +- [“帐户抽象 ELI5” — Devcon Bogota](https://www.youtube.com/watch?v=QuYZWJj65AY) - [Vitalik“帐户抽象之路”说明](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Vitalik 关于社交恢复钱包的博文](https://vitalik.ca/general/2021/01/11/recovery.html) +- [Vitalik 关于社交恢复钱包的博文](https://vitalik.eth.limo/general/2021/01/11/recovery.html) - [EIP-2938 说明](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [EIP-2938 文件](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 说明](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) diff --git a/public/content/translations/zh/roadmap/beacon-chain/index.md b/public/content/translations/zh/roadmap/beacon-chain/index.md index eaa605f3e97..c79e8d1540e 100644 --- a/public/content/translations/zh/roadmap/beacon-chain/index.md +++ b/public/content/translations/zh/roadmap/beacon-chain/index.md @@ -4,7 +4,6 @@ description: 了解信标链 - 引入权益证明的以太坊升级。 lang: zh template: upgrade image: /upgrades/core.png -alt: summaryPoint1: 信标链为以太坊生态系统引入了权益证明。 summaryPoint2: 信标链于 2022 年 9 月与原有的以太坊工作量证明链合并。 summaryPoint3: 信标链引入的共识逻辑和区块广播协议目前保护着以太坊。 diff --git a/public/content/translations/zh/roadmap/index.md b/public/content/translations/zh/roadmap/index.md index 100553cc2ae..d4490f87394 100644 --- a/public/content/translations/zh/roadmap/index.md +++ b/public/content/translations/zh/roadmap/index.md @@ -1,9 +1,9 @@ --- title: 以太坊路线图 -description: 提高以太坊可扩展性、安全性和可持续性的路径。 +description: 提高以太坊可扩展性、安全性和可持续性的途径。 lang: zh template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "以太坊路线图" summaryPoints: buttons: @@ -14,7 +14,7 @@ buttons: variant: 简要 --- -以太坊已经是一个强大的全球协调平台,但它仍在不断改进。 我们制定的一套雄心勃勃的改进措施将使以太坊从目前的形式升级为一个可以完全扩展、具有最大弹性的平台。 以太坊路线图呈现了这些升级。 +以太坊已经是一个强大的全球协调平台,但它仍在不断改进。 我们制定的一套雄心勃勃的改进措施,将使现有以太坊升级为一个可以完全扩展、具有最大弹性的平台。 以太坊路线图呈现了这些升级。 **若要了解以太坊之前的升级,请访问我们的[历史记录](/history/)页面** @@ -55,24 +55,24 @@ buttons: ## 为什么以太坊需要一份路线图? {#why-does-ethereum-need-a-roadmap} -以太坊定期升级,以提高其可扩展性、安全性或可持续性。 以太坊的核心优势之一是随着研究和开发产生的新的思想而不断进化。 这种适应性使以太坊得以灵活应对新出现的挑战,紧跟最先进的技术突破。 +以太坊定期升级,以提高可扩展性、安全性或可持续性。 以太坊的核心优势之一是随着研发产生的新颖想法不断进化。 这种适应性使以太坊得以灵活应对新出现的挑战,紧跟最先进的技术突破。 -因为协议的技术性很强,所以路线图主要是研究人员和开发人员多年来工作的结果,但任何有意向的人都可以参与进来。 相关想法往往是在 [ethresear.ch](https://ethresearch.ch/)、[以太坊魔术师](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) 等论坛或以太币研发 Discord 服务器讨论时产生的。 它们可能是对发现的新漏洞的反馈、来自位于应用层的组织(如去中心化应用和交易所)的建议或对于最终用户面临的问题(例如成本或交易速度)的建议。 这些想法一旦成熟,就可以作为 [以太坊改进建议](https://eips.ethereum.org/) 提出。 整个过程都是公开进行的,社区的任何人可以随时发表意见。 +因为协议的技术性很强,所以路线图主要是研究人员和开发者多年来工作的结果,但任何有意向的人都可以参与进来。 通常,创想始自一些论坛上的讨论,例如 [ethresear.ch](https://ethresear.ch/)、[以太坊魔术师论坛](https://ethereum-magicians.org/) 或以太坊研发 discord 服务器。 它们可能是对发现的新漏洞的响应、来自位于应用程序层的组织(如去中心化应用程序和交易所)的建议或对于最终用户面临的问题(例如成本或交易速度)的建议。 这些想法一旦成熟,就可以作为 [以太坊改进建议](https://eips.ethereum.org/) 提出。 整个过程都是公开进行的,社区的任何人可以随时发表意见。 -[关于以太坊治理的更多信息](/governance/) +[更多关于以太坊治理的信息](/governance/)

ETH2 是什么?

-

在以太坊转用权益证明之前,“Eth2” 一词通常用于描述以太坊的未来,但它已被淘汰,被更加准确的术语取代。它最初被用来区分转用权益证明之前和之后的以太坊网络,有时被用来指不同的以太坊客户端(执行客户端有时被称为 ETH1 客户端,共识客户端有时被称为 ETH2 客户端)。

+

在以太坊过渡到权益证明之前,“以太坊 2”一词通常用于描述以太坊的未来,但它已被淘汰,被更加准确的术语取代。该术语最初用来区分过渡到权益证明之前和之后的以太坊网络,有时也用来指不同的以太坊客户端(执行客户端有时被称为以太坊 1 客户端,共识客户端有时称为以太坊2 客户端)。

-## 以太坊的路线图是否会随着时间的推移而改变? {#will-ethereums-roadmap-change-over-time} +## 以太坊路线图是否会随着时间的推移而改变? {#will-ethereums-roadmap-change-over-time} 是的,几乎肯定会。 路线图是目前的以太坊升级计划,涵盖近期计划和未来计划。 我们预计路线图会随着新的信息和技术的出现而改变。 @@ -80,19 +80,19 @@ buttons: ## 路线图将何时完成? {#when-will-the-roadmap-be-finished} -以太坊将在今后 6 个月内实施一些升级(例如质押提款) - 其他升级的优先性较低,可能在今后 5-10 年内不会实施(例如量子计算抗性)。 我们很难预测每次升级的确切完成时间,因为许多路线图项目是以不同速度平行进行和开发的。 随着时间的推移,升级的紧迫性也可能由于外部因素而发生变化(例如,量子计算机的性能和可用性突然飞跃可能会使抗量子计算加密技术的紧迫性提高)。 +以太坊将在今后 6 个月内实施一些升级(例如质押提款) - 其他升级的优先性较低,可能在今后 5-10 年内不会实施(例如量子计算抗性)。 我们很难预测每次升级的确切完成时间,因为许多路线图项目是以不同速度并行进行和开发的。 随着时间的推移,升级的紧迫性也可能由于外部因素而发生变化(例如,量子计算机的性能和可用性突飞猛进可能会使抗量子计算加密技术的紧迫性提高)。 -思考以太坊发展的一种方法是类比生物进化。 虽然随着网络的性能、可拓展性和安全性越来越强,需要对协议进行的更改越来越少,但一个能够适应新挑战和保持健康的网络仍然比抗拒变化的网络更有可能成功。 +思考以太坊发展的一种方法是类比生物进化。 虽然随着网络的性能、可扩展性和安全性越来越强,需要对协议进行的更改越来越少,但一个能够适应新挑战和保持健康的网络仍然比抗拒变化的网络更有可能成功。 ## 升级时我要做什么吗? {#do-i-have-to-do-anything-when-there-is-an-upgrade} -升级往往不会对最终用户产生影响,除非提供更好的用户体验、更安全的协议以及更多与以太坊互动的选项。 最终用户既不需要积极参与升级,也不需要采取任何行动来保护资产。 节点运营商需要更新其客户端以准备升级。 某些升级可能导致应用开发者更改。 例如,历史数据到期升级可能需要应用开发者从新的来源获取历史数据。 +升级往往不会对最终用户产生影响,除非提供更好的用户体验、更安全的协议以及更多与以太坊互动的选项。 最终用户既不需要积极参与升级,也不需要采取任何行动来保护资产。 节点运营商需要更新其客户端以准备升级。 某些升级可能导致应用程序开发者作出更改。 例如,历史数据到期升级可能需要应用开发者从新的来源获取历史数据。 ## Verge、Splurge 等升级是什么? {#what-about-the-verge-splurge-etc} -[Vitalik Buterin 提出了以太坊线路图](https://twitter.com/VitalikButerin/status/1588669782471368704)的愿景,根据对以太坊架构的影响,该路线图将升级分为几个类别。 这包括: +[Vitalik Buterin 提出了以太坊线路图](https://twitter.com/VitalikButerin/status/1588669782471368704)的愿景,根据对以太坊架构的影响,该路线图分为几个类别。 其中包括: -- 合并:涉及从工作量证明转为权益证明的升级 +- 合并:涉及从工作量证明过渡到权益证明的升级 - Surge:涉及通过卷叠和数据分片进行扩展的升级 - Scourge:涉及抗审查性、去中心化和最大可提取价值的协议风险的升级 - Verge:涉及更轻松地验证区块的升级 @@ -103,15 +103,15 @@ buttons: ## 什么是分片? {#what-about-sharding} -分片是指将以太坊区块链分割开来,让一部分验证者只负责全部数据的一小部分。 这最初是用于扩展以太坊的一种方式。 然而,二层卷叠的发展速度远远快于预期,已经实现了大量扩展,并且在 Proto-Danksharding 实施后还将实现比现在多很多的扩展。 这意味着不再需要"分片链",因此已将其从路线图中删除。 +分片是指将以太坊区块链分割开来,让一部分验证者只负责全部数据的一小部分。 这最初是用于扩展以太坊的一种方式。 然而,二层网络卷叠的发展速度远远快于预期,已经实现了大量扩容,并且在 Proto-Danksharding 实施后还将实现更多扩容。 这意味着不再需要"分片链",因此已将其从路线图中删除。 -## 正在寻求什么特定技术升级? {#looking-for-specific-technical-upgrades} +## 正在寻求特定技术升级? {#looking-for-specific-technical-upgrades} -- [Danksharding](/roadmap/danksharding) - Danksharding 通过向以太坊区块添加数据块,为用户大大降低二层卷叠成本。 -- [质押提现](/staking/withdrawals) - 上海/卡佩拉升级启用了以太坊质押提款,允许用户解锁质押的以太币。 -- [单时隙确定性](/roadmap/single-slot-finality)-让区块可以在同一时隙内提议和最终确定,无需等待 15 分钟。 这提高了应用的便利性,大大增加了攻击难度。 -- [提议者-构建者分离方案](/roadmap/pbs) - 将区块构建和区块提议任务分给不同验证者,为以太坊达成共识提供了一种更公平、更抗审查和更高效的方式。 +- [Danksharding](/roadmap/danksharding) - Danksharding 通过向以太坊区块添加二进制大对象数据,为用户大大降低二层网络卷叠成本。 +- [质押提款](/staking/withdrawals) - 上海/卡佩拉升级启用了以太坊质押提款,允许用户解锁质押的以太币。 +- [单时隙最终确定性](/roadmap/single-slot-finality) - 让区块可以在同一时隙内提出和最终确定,无需等待 15 分钟。 这提高了应用程序的便利性,大大增加了攻击难度。 +- [提议者-构建者分离方案](/roadmap/pbs) - 将区块构建和区块提出工作分给不同验证者,为以太坊达成共识提供了一种更公平、更抗审查和更高效的方式。 - [秘密领袖选举](/roadmap/secret-leader-election) - 采用巧妙的加密技术可以确保当前区块提议者的身份不被公开,从而保护他们免受某些类型的攻击。 -- [帐户抽象](/roadmap/account-abstraction) -帐户抽象是一种在以太坊上为智能合约钱包提供本地支持而非使用复杂中间件的升级。 +- [帐户抽象](/roadmap/account-abstraction) - 帐户抽象是一种在以太坊上为智能合约钱包提供本地支持而不必使用复杂中间件的升级。 - [沃克尔树](/roadmap/verkle-trees) - 沃克尔树是一种数据结构,可用于在以太坊上启用无状态客户端。 这些“无状态”客户端只需要很小的存储空间,但仍然能够验证新的区块。 -- [无状态](/roadmap/statelessness) - 无状态客户端将能够验证新区块,而无需存储大量数据。 这可以为运营节点带来很多好处,而成本仅为目前的一小部分。 +- [无状态性](/roadmap/statelessness) - 无状态性客户端将能验证新区块,并且无需存储大量数据。 这可以为运营节点带来很多好处,而成本仅为目前成本的一小部分。 diff --git a/public/content/translations/zh/roadmap/merge/index.md b/public/content/translations/zh/roadmap/merge/index.md index 6ef27949c1b..7ef9ee65e5e 100644 --- a/public/content/translations/zh/roadmap/merge/index.md +++ b/public/content/translations/zh/roadmap/merge/index.md @@ -4,7 +4,6 @@ description: 了解合并 - 以太坊主网何时采用权益证明机制。 lang: zh template: upgrade image: /upgrades/merge.png -alt: summaryPoint1: 以太坊主网采用权益证明机制,但情况并非一直如此。 summaryPoint2: 从原有的工作量证明机制过渡到权益证明机制的升级称为合并。 summaryPoint3: 合并是指原有的以太坊主网与单独的权益证明区块链即信标链合并,现已成为一条链。 @@ -31,7 +30,7 @@ summaryPoint4: 合并将使以太坊的能源消耗减少大约 99.95%。 纵观以太坊的历史,开发人员一直在为从工作量证明到权益证明的最终过渡做准备。 信标链于 2020 年 12 月 1 日创建,它作为独立的区块链与主网一起运行。 -信标链最开始并不处理主网上的交易。 而是通过对活跃的验证者及其账户余额达成一致来就自己的状态达成共识。 经过广泛测试后,是时候让信标链就真实数据上达成共识了。 合并后,信标链将成为所有网络数据的共识引擎,包括执行层交易和账户余额。 +信标链最开始并不处理主网上的交易。 而是通过对活跃的验证者及其帐户余额达成一致来就自己的状态达成共识。 经过广泛测试后,是时候让信标链就真实数据上达成共识了。 合并后,信标链将成为所有网络数据的共识引擎,包括执行层交易和帐户余额。 合并代表正式转变成使用信标链作为区块生产引擎。 挖矿将不再是生产有效区块的手段。 而是由权益证明验证者承担这个角色,并且现在负责处理所有交易的有效性及提出区块。 @@ -45,7 +44,7 @@ summaryPoint4: 合并将使以太坊的能源消耗减少大约 99.95%。 **对于持有者/用户而言,合并不会带来任何变化。** -*再次提醒:*作为以太币或以太坊上任何其他数字资产的用户或持有者,以及非节点运营的质押人,**不需要在合并之前对你的资金或钱包做任何事情以加入合并。**以太币还是以太币。 没有像“旧以太币”/“新以太币”或“以太坊 1”/“以太坊 2”这样说法,钱包在合并前后的工作方式一样 — 告诉你其他说法人很可能是骗子。 +_再次提醒:_作为以太币或以太坊上任何其他数字资产的用户或持有者,以及非节点运营的质押人,**不需要在合并之前对你的资金或钱包做任何事情以加入合并。**以太币还是以太币。 没有像“旧以太币”/“新以太币”或“以太坊 1”/“以太坊 2”这样说法,钱包在合并前后的工作方式一样 — 告诉你其他说法人很可能是骗子。 虽然权益证明替代了工作量证明,但是以太坊自创世块以来的全部历史记录都完整保留且没有改变。 合并前你钱包里的所有资金在合并后仍可使用。 **你不需要采取任何行动来升级。** @@ -122,9 +121,9 @@ contentPreview="False. Anyone is free to sync their own self-verified copy of Et 以太坊节点有两种类型:可以提议区块的节点和不能提议区块的节点。 -可以提议区块的节点只占以太坊节点总数的一小部分。 这类节点包括工作量证明 (PoW) 下的挖矿节点和权益证明 (PoS) 下的验证者节点。 该类别需要投入经济资源(例如工作量证明中的 GPU 哈希算力或权益证明中的质押以太币),以换取有时提出下一个区块并获得协议奖励的能力。 +可以提议区块的节点只占以太坊节点总数的一小部分。 这类节点包括工作量证明 (PoW) 下的挖矿节点和权益证明 (PoS) 下的验证者节点。 该类别需要投入经济资源(例如工作量证明中的图形处理单元哈希算力或权益证明中的质押以太币),以换取有时提出下一个区块并获得协议奖励的能力。 -网络上的其他节点(例如大部分节点)不需要投入任何经济资源,只需一台有着 1 到 2 TB 的可用存储空间并且可以连接互联网的消费级计算机即可。 这些节点不提出区块,但它们仍然在网络安全中扮演着关键的角色,通过监听新的区块,在区块到达时根据网络共识机制验证它们的有效性,并对所有的区块产出负责任。 如果区块是有效的,节点将继续通过网络传播它。 如果区块出于任何原因无效,节点软件将会忽略它将他视为无效区块并停止传播。 +网络上的其他节点(例如大部分节点)不需要投入任何经济资源,只需一台有着 1 到 2 TB的可用存储空间并且可以连接互联网的消费级计算机即可。 这些节点不提出区块,但它们仍然在网络安全中扮演着关键的角色,通过监听新的区块,在区块到达时根据网络共识规则验证它们的有效性,并对所有的区块产出负责任。 如果区块是有效的,节点将继续通过网络传播它。 如果区块出于任何原因无效,节点软件将会忽略它将他视为无效区块并停止传播。 在任一共识机制(工作量证明或权益证明)下,任何人都可以运行非区块生产节点;我们强烈建议所有有能力的用户都这样做。 运行一个节点对以太坊非常有价值,并为任何运行节点的个人提供额外的好处,如改进的安全性、隐私性和抗审查性。 diff --git a/public/content/translations/zh/roadmap/merge/issuance/index.md b/public/content/translations/zh/roadmap/merge/issuance/index.md index 8de30495ad6..2a80fb9bd10 100644 --- a/public/content/translations/zh/roadmap/merge/issuance/index.md +++ b/public/content/translations/zh/roadmap/merge/issuance/index.md @@ -68,9 +68,9 @@ title="以太币发行内容提要"> ### 共识层发行 {#cl-issuance-post-merge} -共识层发行与合并前一样继续进行,为证明和提出区块的验证者提供少量奖励。 验证者奖励继续计入在共识层上管理的*验证者余额*。 与可以在以太坊主网上交易的当前帐户(“执行”帐户)不同,这些单独的以太坊帐户无法自由地与其他以太坊帐户进行交易。 这些帐户中的资金只能提取到一个指定的执行地址。 +共识层发行与合并前一样继续进行,为证明和提出区块的验证者提供少量奖励。 验证者奖励继续计入在共识层上管理的_验证者余额_。 与可以在以太坊主网上交易的当前帐户(“执行”帐户)不同,这些单独的以太坊帐户无法自由地与其他以太坊帐户进行交易。 这些帐户中的资金只能提取到一个指定的执行地址。 -自 2023 年 4 月上海/卡佩拉升级以来,这些提款操作已经对质押人开放。 我们将鼓励质押人提取他们的*收益/奖励(超过 32 个以太币的余额)*,因为即便不提取,这些资金也不会增加他们的质押权重(最大值 32)。 +自 2023 年 4 月上海/卡佩拉升级以来,这些提款操作已经对质押人开放。 我们将鼓励质押人提取他们的_收益/奖励(超过 32 个以太币的余额)_,因为即便不提取,这些资金也不会增加他们的质押权重(最大值 32)。 质押人也可以选择退出并提取他们的全部验证者余额。 为了确保以太坊稳定,对同时离开的验证者数量设置了上限。 @@ -80,7 +80,7 @@ title="以太币发行内容提要"> ### 合并后的通胀分析 {#post-merge-inflation-breakdown} -- 总以太币供应:**~120,520,000 以太币** (在 2022 年 9 月合并的时候) +- 总以太币供应:**~120,520,000 以太币** (在2022年9月合并的时候) - 执行层发行量:**0** - 共识层发行量:同上,年化发行率**大约 0.52%**(质押总量为 1400 万个以太币) @@ -91,7 +91,7 @@ title="以太币发行内容提要"> ## 销毁 {#the-burn} -针对以太币发行的反制因素是以太币销毁率。 为了在以太坊上执行交易,必须支付最低费用(称为“基础费”),基础费随网络活动持续波动(区块到区块)。 该费用使用以太币支付,为了让交易有效*必须*支付。 基础费在交易过程中*销毁*并退出流通。 +针对以太币发行的反制因素是以太币销毁率。 为了在以太坊上执行交易,必须支付最低费用(称为“基础费”),基础费随网络活动持续波动(区块到区块)。 该费用使用以太币支付,为了让交易有效_必须_支付。 基础费在交易过程中_销毁_并退出流通。 费用销毁在 2021 年 8 月的伦敦升级后上线,在合并后保持不变。 @@ -105,7 +105,7 @@ title="以太币发行内容提要"> 为了确定在指定 24 小时内完全抵消发行量所需的平均燃料价格,首先计算一天中的区块总数,假定出块时间是 12 秒: -- `(1 个区块/12秒) * (60 秒/分钟) = 5 个区块/分钟` +- `(1 个区块/12秒) * (60 秒/分钟) = 5 个区块/分钟` - `(5 个区块/分钟) * (60 分钟/小时) = 300 个区块/小时` - `(300 个区块/小时) * (24 小时/天) = 7200 个区块/天` diff --git a/public/content/translations/zh/roadmap/pbs/index.md b/public/content/translations/zh/roadmap/pbs/index.md index 63032379e6e..ae81faf0c2b 100644 --- a/public/content/translations/zh/roadmap/pbs/index.md +++ b/public/content/translations/zh/roadmap/pbs/index.md @@ -6,7 +6,7 @@ lang: zh # 提议者-构建者分离 {#proposer-builder-separation} -目前,以太坊验证者既构建区块,*也*广播区块。 他们将通过传播网络接收的交易打包成一个区块,然后发送到以太坊网络的对等节点。 **提议者-构建者分离 (PBS) **将这些工作分给多个验证者。 区块构建者将负责创建区块,并在每个时隙将它们提供给区块提议者。 区块提议者无法看到区块的内容,只是选择收益最高的区块,并向区块构建者支付费用,然后将区块发送给对等节点。 +目前,以太坊验证者既构建区块,_也_广播区块。 他们将通过传播网络接收的交易打包成一个区块,然后发送到以太坊网络的对等节点。 **提议者-构建者分离 (PBS) **将这些工作分给多个验证者。 区块构建者将负责创建区块,并在每个时隙将它们提供给区块提议者。 区块提议者无法看到区块的内容,只是选择收益最高的区块,并向区块构建者支付费用,然后将区块发送给对等节点。 进行这次重要升级有多项原因。 首先,它在协议级别创造了防止交易审查的机会。 其次,它防止可以更好地优化区块构建的盈利能力的机构参与者取代业余验证者。 第三,它通过推动 Danksharding 升级帮助拓展了以太坊。 @@ -26,7 +26,7 @@ lang: zh ## 提议者-构建者分离和最大可提取价值 {#pbs-and-mev} -**最大可提取价值 (MEV)**是指验证者通过对交易进行对其有利的排序,使其收益最大化。 常见的例子包括在去中心化交易所进行套利交换(如提前进行大额买卖)或寻找机会清算去中心化金融头寸。 将最大可提取价值最大化需要复杂的技术知识,还需要普通验证者安装定制软件,因此机构运营商在获取最大可提取价值方面极有可能胜过个人和业余验证者。 这意味着,中心化运营商的质押回报可能更高,从而形成一种中心化力量,抑制家庭质押。 +**最大可提取价值 (MEV)**是指验证者通过对交易进行对其有利的排序,使其收益最大化。 常见的例子包括在去中心化交易所进行套利交换(如提前进行大额买卖)或寻找机会清算去中心化金融头寸。 将最大可提取价值最大化需要复杂的技术知识,还需要普通验证者安装定制软件,因此机构运营商在获取最大可提取价值方面极有可能胜过个人和业余验证者。 这意味着,中心化运营商的质押回报可能更高,从而形成一种中心化力量,抑制自行质押。 提议者-构建者分离通过重新配置最大可提取价值的经济原理解决了这一问题。 区块提议者无需自行搜索最大可提取价值,只需从区块构建者提供的众多区块中挑选一个即可。 区块构建者可能已经完成了复杂的最大可提取价值提取工作,但其奖励归区块提议者所有。 这意味着,即使一小部分专业的区块构建者主导了最大可提取价值的提取,但奖励由网络上的任何验证者(包括个体和家庭质押人)获得。 diff --git a/public/content/translations/zh/roadmap/security/index.md b/public/content/translations/zh/roadmap/security/index.md index 77b60ca6c1f..17dac78c660 100644 --- a/public/content/translations/zh/roadmap/security/index.md +++ b/public/content/translations/zh/roadmap/security/index.md @@ -1,37 +1,37 @@ --- title: 更安全的以太坊 -description: 以太坊是现有的最安全和去中心化的智能合约平台。 然而,我们仍可以进行一些改进,以确保以太坊能够抵御未来任何程度的攻击。 +description: 以太坊是现有的最安全和去中心化的智能合约平台。 不过,我们仍有改进空间,从而确保以太坊能够抵御未来任何程度的攻击。 lang: zh image: /roadmap/roadmap-security.png alt: "以太坊路线图" template: roadmap --- -以太坊已经是一个非常安全、去中心化的智能合约平台。 然而,我们仍可以进行一些改进,以确保以太坊能够抵御未来各种攻击。 这包括对以太坊客户端处理竞争区块的方式进行微调,以及提高网络认为区块[“最终确认”](/developers/docs/consensus-mechanisms/pos/#finality)(意味着在不对攻击者造成极端经济损失的情况下无法改变)的速度。 +以太坊已经是一个非常安全的去中心化智能合约平台。 然而,我们仍可以进行一些改进,以确保以太坊能够抵御未来各种攻击。 改进的内容包括对以太坊客户端处理竞争区块的方式进行微调,以及提高网络认为区块 [“最终确认”](/developers/docs/consensus-mechanisms/pos/#finality)(意味着在不对攻击者造成极端经济损失的情况下无法改变)的速度。 此外,还可以进行一些改进,使审查交易变得更加困难,比如对区块提议者隐藏区块的实际内容,或者采用新的方法来识别客户端何时在审查。 这些改进将共同升级权益证明协议,使从个人到企业的所有用户都对他们在以太坊上的应用程序、数据和资产随即产生信心。 ## 质押提款 {#staking-withdrawals} -从工作量证明升级到权益证明的过程始于以太坊的先驱们在存款合约中质押以太币。 这些以太币用于保护网络。 然而,这些以太币尚不能解锁并退还给用户。 允许提取以太币是权益证明升级的一个关键部分。 提款是功能完善的权益证明协议的关键组成部分,而且允许提款也有利于以太坊的安全性,因为这可以让质押人将以太币奖励用于其他非质押目的。 这意味着需要流动性的用户不必依赖于可能推动以太坊的中心化的流动性质押衍生品 (LSD)。 这项升级预定在 2023 年 4 月 12 日完成。 +从工作量证明升级到权益证明的过程始于以太坊的先驱们在存款合约中质押以太币。 这些以太币用于保护网络。 然而,这些以太币尚不能解锁并退还给用户。 允许提取以太币是权益证明升级的关键部分。 提款是功能完善的权益证明协议的关键组成部分,而且允许提款也有利于以太坊的安全性,因为这可以让质押人将以太币奖励用于其他非质押目的。 这意味着需要流动性的用户不必依赖于可能推动以太坊的中心化的流动性质押衍生品 (LSD)。 这项升级预定在 2023 年 4 月 12 日完成。 阅读关于提款的信息 ## 防御攻击 {#defending-against-attacks} -即使在提款后,仍然可以对以太坊的 [权益证明](/developers/docs/consensus-mechanisms/pos/)协议进行改进。 其中一项被称为[视图合并](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739) - 这是一种更安全的分叉选择算法,可以让某些复杂攻击更加困难。 +即使在提款后,仍然可以对以太坊的[权益证明](/developers/docs/consensus-mechanisms/pos/)协议进行改进。 其中一项被称为“[视图合并](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739)”- 这是一个更安全的分叉选择算法,可以让某些复杂攻击更加困难。 -减少以太坊最终确定区块所需的时间将可以改善用户体验,并防止复杂的“重组”攻击,即攻击者试图重组最近的区块以获取利润或审查特定交易。 [**单时隙最终确定性 (SSF)**](/roadmap/single-slot-finality/)是一种尽可能减少最终确定延迟的方式。 现在,攻击者理论上可以说服其他验证者重新配置 15 分钟的区块。 采用单时隙最终确定性后,该数值为 0。 从个人到应用程序和交易所,所有用户都可以从中受益,快速确保他们的交易不会被撤销,而网络也可以从中受益,防范一整类攻击。 +减少以太坊最终确定区块所需的时间将可以改善用户体验,并防止复杂的“重组”攻击,即攻击者试图重组最近的区块以获取利润或审查特定交易。 [**单时隙确定性 (SSF)**](/roadmap/single-slot-finality/)是一种尽可能减少最终确定延迟的方式。 现在,攻击者理论上可以说服其他验证者重新配置 15 分钟的区块。 采用单时隙确定性后,该数值为 0。 从个人到应用程序和交易所,所有用户都可以从中受益,快速确保他们的交易不会被撤销,而网络也可以从中受益,防范一整类攻击。 -了解单时隙最终确定性 +了解单时隙确定性 ## 防范审查 {#defending-against-censorship} -去中心化可以防止个人或一小部分验证者的影响力过大。 新型质押技术有助于确保以太坊的验证者尽可能保持去中心化,同时还能防范硬件、软件和网络故障。 包括将验证者责任分散到多个节点的软件。 这被称为**分布式验证者技术 (DVT)**。 由于分布式验证者技术允许多台计算机共同参与验证,从而增加了冗余和容错性,因此我们鼓励质押池使用分布式验证者技术。 它还将验证者密钥分散到多个系统中,而不是由一个运营商运行多个验证者。 这增加了不诚实运营商协调对以太坊的攻击的难度。 总之,这种想法是由*社区*而非个人运行验证者,从而提高安全性。 +去中心化可以防止个人或一小部分验证者的影响力过大。 新型质押技术有助于确保以太坊的验证者尽可能保持去中心化,同时还能防范硬件、软件和网络故障。 包括将验证者责任分散到多个节点的软件。 这被称为**分布式验证者技术 (DVT)**。 由于分布式验证者技术允许多台计算机共同参与验证,从而增加了冗余和容错性,因此我们鼓励质押池使用分布式验证者技术。 它还能将验证者密钥分散到多个系统中,而不是由一个运营商运行多个验证者。 这增加了不诚实运营商协调对以太坊的攻击的难度。 总之,它的想法是由_社区_而非个人运行验证者,从而提高安全性。 了解分布式验证者技术 -实施**提议者-构建者器分离 (PBS)** 将大大提高以太坊对审查的固有防范能力。 提议者-构建者器分离可以让一个验证者创建区块,另一个验证者在以太坊网络中广播区块。 这可以确保在整个网络中更加公平地分享利润最大化的区块构建算法带来的收益,**防止质押随着时间的推移集中到表现最好的机构质押人**。 区块提议者可以从区块构建者市场中选择收益最高的区块。 要进行审查,区块提议者往往需要选择收益较低的区块,这**在经济上不合理,而且很容易被网络上的其他验证者发现**。 +实施**提议者-构建者器分离 (PBS)** 将大大提高以太坊对审查的固有防范能力。 提议者-构建者器分离可以让一个验证者创建区块,另一个验证者在以太坊网络中广播区块。 这可以确保在整个网络中更加公平地分享利润最大化的区块构建算法带来的收益,**防止质押随着时间的推移集中到表现最好的机构质押人**。 区块提议者可以从区块建造商市场中选择收益最高的区块。 要进行审查,区块提议者往往需要选择收益较低的区块,这**在经济上不合理,而且很容易被网络上的其他验证者发现**。 提议者-构建者器分离还有一些潜在的附件功能,如加密交易和纳入清单,可以进一步提高以太坊的抗审查性。 这使得区块构建者和提议者无法看到其区块中包含的实际交易。 @@ -39,7 +39,7 @@ template: roadmap ## 保护验证者 {#protecting-validators} -老练的攻击者有可能识别出即将到来的验证者,并向它们发送垃圾邮件,以阻止它们提议区块。这被称为**拒绝服务 (DoS)**攻击。 实施[**秘密领袖选举 (SLE)**](/roadmap/secret-leader-election) 可以防止预先知道区块提议者,从而防范此类攻击。 其工作原理是对代表候选区块提议者的加密承诺进行不断混洗,并利用它们的顺序来决定选择哪个验证者,从而使验证者自己才能事先知道它们的顺序。 +老练的攻击者有可能识别出即将到来的验证者,并向它们发送垃圾邮件,以阻止它们提议区块。这被称为**拒绝服务 (DoS)**攻击。 实施[**秘密领袖选举 (SLE)**](/roadmap/secret-leader-election)可防止预先知道区块提议者,从而防范此类攻击。 其工作原理是对代表候选区块提议者的加密承诺进行不断混洗,并利用它们的顺序来决定选择哪个验证者,从而使验证者自己才能事先知道它们的顺序。 了解秘密领袖选举 diff --git a/public/content/translations/zh/roadmap/single-slot-finality/index.md b/public/content/translations/zh/roadmap/single-slot-finality/index.md index b577ada6761..278a2e26245 100644 --- a/public/content/translations/zh/roadmap/single-slot-finality/index.md +++ b/public/content/translations/zh/roadmap/single-slot-finality/index.md @@ -6,59 +6,59 @@ lang: zh # 单时隙确定性 {#single-slot-finality} -目前,以太坊区块大约需要 15 分钟才能最终确定。 然而,我们可以提高以太坊的共识机制验证区块的效率,大幅减少最终确定所需的时间。 区块可以在同一时隙内提议并最终确定,无需等待 15 分钟。 这一概念叫做“**单时隙确定性 (SSF)**”。 +目前,以太坊区块大约需要 15 分钟才能最终确定。 然而,我们可以提高以太坊的共识机制验证区块的效率,大幅减少最终确定所需的时间。 区块可以在同一时隙内提议并最终确定,无需等待 15 分钟。 这一概念叫做**单时隙确定性 (SSF)** 。 ## 什么是最终确定性? {#what-is-finality} -在以太坊基于权益证明的共识机制中,确定性是指在质押的以太币总数的至少 33% 被销毁之前,保证区块保持原状或继续留在区块链中。 这样可以实现“加密经济学”安全性,因为人们对区块链的信心来自于改变区块链的顺序或内容会带来极高成本,理性的经济行为者不会试图这样做。 +在以太坊基于权益证明的共识机制中,确定性是指在质押的以太币总数的至少 33% 被销毁之前,保证区块保持原状或继续留在区块链中。 这样可以实现“加密经济学”安全性,因为人们对区块链的信心来自于改变区块链的顺序或内容成本极高,因而理性的经济行为者不会试图这样做。 ## 为什么要追求更快实现确定性? {#why-aim-for-quicker-finality} -目前最终确定区块所需的时间太长。 大多数用户都不希望等待 15 分钟才能最终确定交易,而且对于那些希望实现高交易吞吐量的应用和交易所来说,等待这么长时间才能确定交易是否永久完成也很不方便。 区块提议和最终确定之间的延迟也为短时间重组创造了机会,攻击者可利用这种方式审查某些区块或提取最大可提取值。 处理分阶段升级区块的机制也相当复杂,并已多次打补丁以弥补安全漏洞,这使得它成为以太坊代码库中较容易出现细微漏洞的部分之一。 这些问题都可以通过将最终确定时间缩短到一个时隙来解决。 +目前,最终确定区块所需的时间太长。 大多数用户都不希望等待 15 分钟才能最终确定交易,而且对于希望实现高交易吞吐量的应用程序和交易所来说,等待如此长时间才能确定交易是否最终完成也极其不便。 区块提出和最终确定之间的延迟也使得短时间重组有了可乘之机,攻击者可以利用这种方式审查某些区块或提取最大可提取价值 (MEV)。 处理分阶段升级区块的机制也相当复杂,而且已多次打补丁以弥补安全漏洞,这使得它成为以太坊代码库中较容易出现细微漏洞的部分之一。 这些问题都可以通过将最终确定时间缩短到一个时隙来解决。 ## 去中心化/时间/费用的权衡 {#the-decentralization-time-overhead-tradeoff} -确定性保证并不是新区块的直接属性;新区块的最终确定需要时间。 这种现象的原因是,只有代表网络上的质押以太币总数的至少 2/3 的验证者投票支持("认证"),区块才能被视为最终确定。 网络上的每个验证节点必须处理来自其他节点的认证,才能知道某个区块是否达到了 2/3 的阈值。 +新区块并非可以立即实现有保证的最终确定性;新区块的最终确定需要时间。 之所以出现这种现象,是因为只有代表网络上的质押以太币总数的至少 2/3 的验证者投票支持("认证"),区块才能被视为最终确定。 网络上的每个验证节点必须处理来自其他节点的认证,才能知道某个区块是否达到了这一 2/3 阈值。 -完成最后确认的时间越短,每个节点所需的计算能力就越强,因为它需要更快地完成认证处理。 此外,网络上的验证节点越多,每个区块需要处理的认证就越多,这也增加了所需的处理能力。 需要的处理能力越强,参与的人数就越少,因为运行每个验证节点需要更加昂贵的硬件。 延长区块之间的时间可以降低每个节点所需的计算能力,但也会延长最终确认时间,因为认证的处理速度会变慢。 +完成最后确认的时间越短,每个节点所需的算力就越强,因为它需要更快地完成认证处理。 此外,网络上的验证节点越多,每个区块需要处理的认证就越多,这也增加了所需的处理能力。 需要的处理能力越强,能参与的人数就越少,因为运行每个验证节点需要更加昂贵的硬件。 延长区块之间的时间可以降低每个节点所需的算力,但也会延长最终确认时间,因为认证的处理速度会变慢。 -因此,我们需要在费用(计算能力)、去中心化(参与验证区块链的节点数量)和最终确定时间之间进行权衡。 理想的系统机制能够平衡最小的计算能力、最大化的去中心以及最短的最终确定时间。 +因此,我们需要在费用(算力)、去中心化(参与验证区块链的节点数量)和最终确定时间之间进行权衡。 理想的系统机制能够平衡最少的算力、最大化的去中心以及最短的最终确定时间。 以太坊现有的共识机制通过以下途径平衡了这三个参数: -- **将最少质押数量设为 32 个以太币**。 它设定了单个节点需要处理的验证者认证数量的上限,因此也设定了每个节点的计算要求上限。 -- **将最终确定时间设置为大约 15 分钟**。 这为验证者运行普通家用计算机来安全地处理每个区块的认证提供了充足的时间。 +- **将最少质押数量设为 32 以太币**。 这就设定了单个节点需要处理的验证者认证数量的上限,因此也设定了每个节点的计算要求上限。 +- **将最终确定时间设置为大约 15 分钟**。 这使得验证者有充足的时间在普通家用计算机运行运算,从而安全地处理每个区块的认证。 -根据目前的机制设计,为了减少最终确定的时间,必须减少网络上的验证者数量或者增加每个节点的硬件要求。 然而,我们可以对处理认证的方式进行改进,在不增加每个节点的费用的前提下提高认证处理数量。 更高效的处理将可以在单一时隙内完成最终确定,无需延长至两个时段。 +根据目前的机制设计,为了减少最终确定的时间,必须减少网络上的验证者数量或者提高每个节点的硬件要求。 不过,我们可以改进处理认证的方式,在不增加每个节点的费用的前提下提高认证处理数量。 更高效的处理将可以在单一时隙内完成最终确定,无需延长至两个时段。 ## 单时隙确定性的实现路径 {#routes-to-ssf} - + -目前的共识机制结合了多个验证者的认证(这些验证者被称为委员会),以减少每个验证者为验证区块需要处理的信息数量。 每个验证者都有机会在每个时段(32 个时隙)认证,但在每个时隙内,只有一部分验证者可以认证,这被称为“委员会”认证。 为此,他们被分为几个子网,其中几个验证者被选为“聚合者”。 每个这些聚合者将他们在其所在子网内看到的其他验证者的所有签名合并为单一聚合签名。 聚合最多个人签名的聚合者将聚合签名递交给区块提议者,后者将该聚合签名与其他委员会的聚合签名一起纳入区块。 +目前的共识机制结合了多个验证者的认证(这些验证者被称为委员会),以减少每个验证者为验证区块需要处理的信息数量。 每个验证者都有机会在每个时段(32 个时隙)认证,但在每个时隙内,只有一部分验证者可以认证,这称为“委员会”认证。 为此,他们被分为几个子网,其中几个验证者被选为“聚合者”。 每个这些聚合者将他们在其所在子网内看到的其他验证者的所有签名合并为单一聚合签名。 聚合最多个人签名的聚合者将聚合签名传送给区块提议者,后者将该聚合签名与其他委员会的聚合签名一起添加到区块。 -通过此过程,每个验证者完全可以在每个时段中投票,因为“32 个时隙*64 个委员会*每一个委员会 256 个验证者=每时段 524,288 个验证者”。 在本文章撰写时(2023 年 2 月),有大约 513,000 个活跃验证者。 +通过此过程,每个验证者完全可以在每个时段中投票,因为“32 个时隙*64 个委员会*每一个委员会 256 个验证者=每个时段 524,288 个验证者”。 在本文章撰写时(2023 年 2 月),有大约 513,000 个活跃验证者。 按照这一方案,每个验证者只能在整个时段中通过分发他们的认证对区块投票。 然而,我们或许可以改进此机制,让每个验证者有机会在每个时隙内进行认证。 -自从以太坊共识机制设计问世以来,签名汇总方案 (BLS) 已经被证明比原先设想的扩展性更强,同时客户端处理和验证签名的能力也得到了提升。 事实证明,大量验证者在单时隙内处理认证是可行的。 例如,如果单时隙内一百万个验证者投票两次,时隙时间调整为 16 秒,则节点需要以每秒至少 125,000 次聚合的速度认证签名,才能在单时隙内处理一百万次认证。 实际上,一台普通的计算机完成一次签名验证大约需要 500 纳秒,也就是说 125,000 次签名验证可以在 62.5 毫秒内完成 — 这远远低于 1 秒的阈值。 +自从以太坊共识机制设计问世以来,签名汇总方案 (BLS) 已经被证明比原先设想的扩展性更强,同时客户端处理和验证签名的能力也得到了提升。 事实证明,大量验证者在单时隙内处理认证是可行的。 例如,如果单时隙内一百万个验证者投票两次,时隙时间调整为 16 秒,则节点需要以每秒至少125,000 次聚合的速度认证签名,才能在单时隙内处理一百万次认证。 实际上,一台普通的计算机完成一次签名验证大约需要 500 纳秒,也就是说 125,000 次签名验证可以在大约 62.5 毫秒内完成 — 这远远低于 1 秒的阈值。 -通过创建超级委员会,例如每个时隙随机选择 125,000 个验证者,能够进一步提高效率。 只有这些验证者才能对区块进行投票,因此只有这一部分的验证者能够决定是否最终确定区块。 这个想法是否可行取决于社区希望成功攻击以太坊的成本有多高。 这是因为攻击者获得*相应超级委员会*中三分之二的质押以太币,就可以最终确定不诚实的区块,无需获得三分之二的质押以太币总数。 这仍然是一个积极的研究领域,但有一点似乎有道理,对于一个大到需要首先成立超级委员会的验证者集合而言,攻击那些小委员会的成本会非常高(例如:以以太币为单位,攻击成本将是`2/3*125,000*32=~2,600,000 以太币`)。 攻击成本可以通过扩大验证者集合的规模进行调整(例如:调整验证者的规模,使攻击成本等于一百万以太币、四百万以太币、一千万以太币等)。 社区的[初步民意调查](https://youtu.be/ojBgyFl6-v4?t=755)似乎表明,一百万到两百万以太币是可接受的攻击成本,这意味着每个超级委员会约有 65,536 到 97,153 个验证者。 +通过创建超级委员会能够进一步提高效率,例如每个时隙随机选择 125,000 个验证者。 只有这些验证者才能对区块进行投票,因此只有这一部分的验证者能够决定是否最终确定区块。 这个想法是否可行取决于社区希望成功攻击以太坊的成本有多高。 这是因为攻击者获得_相应超级委员会_中三分之二的质押以太币,就可以最终确定不诚实的区块,无需获得三分之二的质押以太币总数。 这仍然是一个积极的研究领域,但有一点似乎有道理,对于一个大到需要首先成立超级委员会的验证者集合而言,攻击那些小委员会的成本会非常高(例如:以以太币为单位,攻击成本将是`2/3*125,000*32=~2,600,000 以太币`)。 攻击成本可以通过扩大验证者集合的规模进行调整(例如:调整验证者的规模,使攻击成本等于一百万以太币、四百万以太币、一千万以太币等)。 社区的[初步意见调查](https://youtu.be/ojBgyFl6-v4?t=755)似乎表明,一百万到两百万以太币是可接受的攻击成本,这意味着每个超级委员会约有 65,536 到 97,153 个验证者。 -然而,验证并不是真正的瓶颈 — 验证者节点的真正挑战是签名聚合。 要扩容签名聚合,可能需要增加每个子网中的验证者数量,增加子网的数量,或者增加额外聚合层(也就是说,设置委员会的委员会)。 部分解决措施可能是允许存在专业的聚合者 — 类似于通过提案者-构建者分离和 Danksharding,将区块构建和生成卷叠数据的承诺外包给专业区块构建者的做法。 +然而,验证并不是真正的瓶颈 — 验证者节点的真正挑战是签名聚合。 要扩容签名聚合,可能需要增加每个子网中的验证者数量,增加子网的数量,或者增加额外聚合层(也就是说,设置委员会的委员会)。 部分解决措施可能是允许存在专业的聚合者 — 类似于通过提议者-构建者分离和 Danksharding,将区块构建和生成卷叠数据的承诺外包给专业区块构建者的做法。 ## 在单时隙确定性中,分叉选择规则的作用是什么? {#role-of-the-fork-choice-rule} -目前的共识机制依赖于确定性工具(决定三分之二的验证者是否已经认证某个区块链的算法)和分叉选择规则(决定在面临多种选择时哪一区块链是正确选择的算法)的紧密结合。 分叉选择算法只考虑最后一个确定的区块*之后*的区块。 在单时隙确定性下,不会有分叉选择规则要考虑任何区块,因为区块的确认时隙与提议时隙相同。 这意味着在单时隙最终确定性下,*要么*分叉选择算法,*要么*确定性工具,将会随时保持活跃。 确定性工具会最终确定三分之二的验证者在线并诚信认证的区块。 如果一个区块不能超过三分之二的阈值,那么分叉选择规则将会确定遵循哪条区块链。 这也为维持懒惰惩罚机制创造了机会,这种机制能够收回> 1/3 的验证者离线的区块链(有一些额外的细微差别)。 +目前的共识机制依赖于确定性工具(决定三分之二的验证者是否已经认证某个区块链的算法)和分叉选择规则(决定在面临多种选择时哪一区块链是正确选择的算法)的紧密结合。 分叉选择算法只考虑最后一个确定的区块_之后_的区块。 在单时隙确定性下,不会有分叉选择规则要考虑任何区块,因为区块的确认时隙与提议时隙相同。 这意味着在单时隙确定性下,_要么_分叉选择算法,_要么_确定性工具,将会随时保持活跃。 确定性工具会最终确定三分之二的验证者在线并诚信认证的区块。 如果一个区块不能超过这一三分之二阈值,那么分叉选择规则将会确定遵循哪条区块链。 这也为维持怠惰惩罚机制创造了机会,这种机制能够收回> 1/3 的验证者离线的区块链(有一些额外的细微差别)。 ## 未解决的问题 {#outstanding-issues} -通过增加每个子网的验证者数量来扩容聚合的问题是,这会导致点对点网络的负载增加。 添加聚合层的问题是,这设计起来非常复杂并且会增加延迟(也就是说,它会让区块提议者接收所有子网聚合者的消息的时间延长)。 即使使用 BLS 签名聚合,也不清楚如何处理网上活跃的验证者数量超过了每个时隙的处理能力的情况。 一种可能的解决方法是,由于所有验证者都在每个时隙内认证并且在单时隙确定性下没有委员会,可完全取消有效余额 32 个以太币的上限,这意味着管理多个验证者的运营商能够合并它们的质押并减少运行的验证者,从而减少验证节点需要处理的信息数量,满足整个验证者集合的需求。 这取决于大型质押人是否同意合并他们的验证者。 也可以对任何时间的验证者数量或者质押的以太币数量设置固定上限。 然而,这需要建立相应机制,决定允许哪些验证者参与,禁止哪些验证者参与,这种机制容易产生不希望的附带影响。 +通过增加每个子网的验证者数量来扩容聚合的问题是,这会导致点对点网络的负载增加。 添加聚合层的问题是,这设计起来非常复杂并且会增加延迟(也就是说,它会让区块提议者接收所有子网聚合者的消息的时间延长)。 即使使用 BLS 签名聚合,也不清楚如何处理网上活跃的验证者数量超过了每个时隙的处理能力的情况。 一种可能的解决方法是,由于所有验证者都在每个时隙内认证并且在单时隙确定性下没有委员会,可完全取消有效余额 32 个以太币的上限,这意味着管理多个验证者的运营商能够合并它们的质押并减少运行的验证者,从而减少验证节点需要处理的信息数量,满足整个验证者集合的需求。 这取决于大质押人是否同意合并他们的验证者。 也可以对任何时间的验证者数量或者质押的以太币数量设置固定上限。 然而,这需要建立相应机制,决定允许哪些验证者参与,禁止哪些验证者参与,这种机制容易产生不希望的附带影响。 ## 当前进展 {#current-progress} -单时隙确定性正处于研究阶段。 预计它不会在几年内推出,可能会在 [Verkle 树](/roadmap/verkle-trees/)和 [Danksharding](/roadmap/danksharding/) 等其他重大升级之后推出。 +单时隙确定性正处于研究阶段。 预计它不会在几年内推出,可能会在 [Verkle 树](/roadmap/verkle-trees/)和 [Danksharding](/roadmap/danksharding]) 等其他重大升级之后推出。 ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/roadmap/statelessness/index.md b/public/content/translations/zh/roadmap/statelessness/index.md index 637a86b51ba..f353da323b0 100644 --- a/public/content/translations/zh/roadmap/statelessness/index.md +++ b/public/content/translations/zh/roadmap/statelessness/index.md @@ -6,18 +6,18 @@ lang: zh # 无状态性、状态数据到期和历史数据到期 {#statelessness} -能够在普通硬件上运行以太坊节点对于实现真正的去中心化来说至关重要。 这是因为运行节点使用户可以通过独立进行加密检查来验证信息,而不是依赖第三方提供数据。 运行节点可以让用户直接将交易提交到以太坊点对点网络,无需依赖中介。 如果只有拥有昂贵硬件的用户才能享受这些好处,去中心化就不可能实现。 相反,节点应该能够以非常普通的处理和内存要求运行,以便它们可以在手机、微型计算机上运行,或者在家用计算机上运行而几乎不被注意到。 +对于实现真正的去中心化来说,能够在普通硬件上运行以太坊节点至关重要。 这是因为运行节点使用户通过独立进行加密检查来验证信息,而不是依赖第三方提供数据。 运行节点可以让用户直接将交易提交到以太坊对等网络,无需依赖中介。 如果只有拥有昂贵硬件的用户才能享受这些好处,去中心化就不可能实现。 相反,运行节点的处理和内存方面的要求应该非常普通,以便节点可以在手机、微型计算机上运行,或者在家用计算机上运行而几乎不被注意到。 -今天,高磁盘空间要求是阻碍大众访问节点的主要障碍。 这主要是因为需要存储以太坊的大量状态数据。 这种状态数据包含处理新区块和交易所必需的关键信息。 截至本文撰写时,运行完整的以太坊节点的建议硬件是 2TB 的高速固态硬盘。 对于不删除任何旧数据的节点来说,存储需求每周增长约 14GB,而存储自创世块以来的所有数据的存档节点已接近 12TB(截至本文撰写时,即 2023 年 2 月)。 +今天,高磁盘空间要求是阻碍大众访问节点的主要障碍。 这主要是因为需要存储以太坊的大量状态数据。 这种状态数据包含处理新区块和交易所必需的关键信息。 截至本文撰写时,建议使用 2TB 的高速固态硬盘运行以太坊全节点。 对于不删除任何旧数据的节点来说,存储需求每周增长约 14GB,而存储自创世块以来的所有数据的存档节点已接近 12TB(截至本文撰写时,即 2023 年 2 月)。 -较便宜的硬盘驱动器被用于储存较久远的数据,但它们运行速度太慢,无法应对传入的区块。 保持现有的客户端存储模式的同时使数据存储更加便宜和便利,只是这一问题的暂时性不完全解决方法,因为以太坊的状态增长是“无限的”,这意味着存储要求只会不断增加,技术改进必须一直跟上状态增长的步伐。 相反,客户端必须寻找在不依赖查阅本地数据库数据的情况下验证区块和交易的新方式。 +较便宜的硬盘驱动器用于存储较久远的数据,但它们运行速度太慢,无法应对传入的区块。 保持现有的客户端存储模式的同时使数据存储更加便宜和方便,只是这一问题的暂时性不完全解决方法,因为以太坊的状态增长是“无限的”,这意味着存储要求只会不断增加,技术改进必须一直跟上状态增长的步伐。 相反,客户端必须寻找在不依赖于查阅本地数据库数据的情况下核对区块和交易的新方式。 ## 减少节点存储量 {#reducing-storage-for-nodes} 有多种方法可以减少每个节点需要存储的数据量,每种方法都要求对以太坊的核心协议进行不同程度的更新: - **历史数据到期**:可以让节点删除早于 X 区块的状态数据,但不能改变以太坊客户端处理状态数据的模式 -- **状态数据过期**:让不常用的状态数据进入不活跃状态。 不活跃的数据在重新恢复前会被客户端忽略。 +- **状态数据过期**:让不常用的状态数据进入非活跃状态。 不活跃的数据在重新恢复前会被客户端忽略。 - **弱无状态性**:只有区块生产者需要访问完整的状态数据,其他节点能够在没有本地状态数据库的情况下验证区块。 - **强无状态性**:没有节点需要访问完整的状态数据。 @@ -25,52 +25,52 @@ lang: zh ### 历史数据到期 {#history-expiry} -历史数据到期是指客户端删除它们不可能再需要的旧数据,以便只用存储一小部分的历史数据,在新数据传入时丢弃旧数据。 客户端需要历史数据的原因有两个:同步和服务数据请求。 最初,客户端需要从创世区块一直同步到链头区块,以验证每个后续区块都正确。 如今,客户端使用“弱主观性检查站”向链头区块引导。 这些检查站都是受信任的起始点,类似于接近现在区块的创世区块,而不是最初的以太坊创世区块。 这意味着客户端能够丢弃最近的弱主观性检查站之前的所有信息,而不会失去同步到链头区块的能力。 客户端目前通过从本地数据库提取历史数据来服务历史数据请求(通过 JSON-RPC 发送)。 然而,在实施历史数据到期后,如果请求的数据已经被删除,将无法服务这类请求。 此时,提供此类历史数据需要一些创新方法。 +历史数据到期是指客户端删除它们不可能再需要的旧数据,以便仅存储一小部分历史数据,在新数据传入时丢弃旧数据。 客户端需要历史数据的原因有两个:同步和服务数据请求。 最初,客户端必须与从创世区块一直到链头区块的所有区块同步,以验证每个后续区块都正确。 如今,客户端使用“弱主观性检查站”向链头区块引导。 这些检查点都是受信任的起始点,类似于接近当前区块的创世区块,而不是最初的以太坊创世区块。 这意味着客户端能够丢弃最近的弱主观性检查点之前的所有信息,而不会失去同步到链头区块的能力。 客户端目前通过从本地数据库提取历史数据来服务历史数据请求(通过 JSON-RPC 发送)。 然而,在实施历史数据到期后,如果请求的数据已经被删除,将无法服务这类请求。 此时,提供此类历史数据需要一些创新方法。 -一种方案是客户端使用门户网络等方法向同等节点索取历史数据。 门户网络是一个在开发中的用于提供历史数据的点对点网络,其中每个节点储存一小部分的以太坊历史数据,因此全部历史数据分散存在整个网络。 它通过寻找储存相关数据的节点并且向其索取数据来服务数据请求。 由于要求访问历史数据的基本都是应用,因此也可以让它们负责存储数据。 以太坊空间内也可能有足够的无私行为者愿意维护历史档案。 这可能是一个旨在管理历史数据存储的去中心化自治组织,最好结合了所有这些方案。 这些提供者能够以多种方式提供数据,例如 torrent、FTP、菲乐币或者 IPFS。 +一种方案是客户端使用门户网络等方法向其他客户端索取历史数据。 门户网络是一个在开发中的用于提供历史数据的对等网络,其中每个节点存储一小部分以太坊历史数据,因此全部历史数据分散存在整个网络。 它通过寻找存储相关数据的节点并且向其索取数据来服务数据请求。 由于要求访问历史数据的基本都是应用程序,因此也可以让它们负责存储数据。 以太坊空间内也可能有足够的无私行为者愿意维护历史档案。 这可能是一个旨在管理历史数据存储的去中心化自治组织,它最好结合了所有这些方案。 这些提供者能够以多种方式提供数据,例如通过 torrent、FTP、菲乐币或者星际文件系统。 -历史数据到期在某种程度上有争议,因为到目前为止以太坊一直在隐含地保证任何历史数据的可用性。 之前一直可以作为标准做法从创世块开始完全同步,即使它依赖通过快照重建一些较早的数据。 历史数据到期将提供这种保证的责任移出了以太坊核心协议。 如果它是最终能提供历史数据的中心化组织,将会带来新的审查风险。 +历史数据到期在某种程度上有争议,因为到目前为止以太坊一直在隐晦地保证任何历史数据的可用性。 从创世块开始完全同步已经成为标准做法,即使它依赖通过快照重建一些较早的数据。 历史数据到期将提供这种保证的责任移出了以太坊核心协议。 如果它是最终能提供历史数据的中心化组织,将会带来新的审查风险。 -EIP-4444 尚未准备上市,但在积极讨论中。 有趣的是,EIP-4444 所面临的挑战的技术性并不是那么强,主要是在社区管理方面。 要让它上市,需要社区加入,其中包括可信赖实体不仅要同意,还要承诺存储和提供历史数据。 +EIP-4444 尚未准备好上线,但在积极讨论中。 有趣的是,EIP-4444 所面临的挑战的技术性并不是那么强,主要在社区管理方面。 要让它上市,需要社区加入,其中包括可信赖实体不仅要同意,还要承诺存储和提供历史数据。 -此升级没有从根本上改变以太坊节点处理状态数据的模式,它仅仅改变了历史数据的访问方式。 +此升级没有从根本上改变以太坊节点处理状态数据的方式,它仅仅改变了历史数据的访问方式。 ### 状态数据到期 {#state-expiry} 状态数据到期是指从单个节点中删除最近未访问的状态数据。 可以采取以下几种方式实施: -- **租金到期**:向帐户收取租金并且在租金为零后,将数据视为到期 +- **租金到期**:向帐户收取租金并且在租金为零后,将帐户视为到期 - **时间到期**:如果某帐户在一段时间没有读写操作,让该帐户进入不活跃状态 -租金到期可以向希望保留在活跃状态数据库中的帐户直接收取租金。 时间到期可以从最后一次帐户交互开始倒计时,也可以为所有帐户设置定期到期。 此外,还可以采用一些机制将时间和租金模式的元素结合到一起,例如,如果某帐户在时间到期之前支付了小额费用,将保持活跃状态。 对于状态数据到期,需要注意的是,不活跃的状态数据**未被删除**,它只是与活跃的状态数据分开存储。 不活跃的状态数据可以重新恢复为活跃的状态数据。 +租金到期可以向希望保留在活跃的状态数据库中的帐户直接收取租金。 时间到期可以从最后一次帐户交互开始倒计时,也可以为所有帐户设置定期到期。 此外,还可以采用一些机制将时间和租金模式的元素结合到一起,例如,如果某帐户在时间到期之前支付了小额费用,将保持活跃状态。 对于状态数据到期,必须注意到不活跃的状态数据**未被删除**,它只是与活跃的状态数据分开存储。 不活跃的状态数据可以重新恢复到活跃状态。 -要实现这一点,或许可以创建有特定时段(可能约一年)的状态树。 当新的时段开始时,一个全新的状态树也随之创建。 只有当前状态树可以修改,其他所有状态树都不可修改。 以太坊节点将只保留当前状态树和之前一个状态树。 这就需要用一种方法根据地址存在的时段给它盖上时间戳。 [有几种可能的方法](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607)可以做到这一点,但最重要的一种方法需要将[地址加长](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)以容纳额外的信息,此外长地址还更加安全。 在路线图中,这项升级被称为[地址空间扩展](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485) +要实现这一点,或许可以创建有特定期限(可能约一年)的状态树。 当新的时段开始时,一个全新的状态树也随之创建。 只有当前状态树可以修改,其他所有状态数都不可修改。 以太坊节点只能保持现有的状态树和之前一个状态树。 这就需要用一种方法根据地址存在的时段给地址盖上时间戳。 [可能有几种方法](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607)可以做到这一点,但最重要的一种方法需要将[地址加长](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)以容纳额外的信息,此加长地址还更加安全。 在路线图中,这项升级被称为[地址空间扩展](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485) 与历史数据到期相同,在执行状态数据到期后,存储旧状态数据的责任会从个别用户转移至中心化提供商等其他实体、无私的社区成员,或门户网络等的更具前瞻性的去中心化解决方案。 -状态数据到期机制仍处于研究阶段,还未准备好上线。 状态数据到期的上线时间可能会比无状态客户端和历史数据过期晚,因为那些升级能够让大部分验证者轻松管理占用庞大空间的状态数据。 +状态数据到期机制仍处于研究阶段,还未准备好上线。 状态数据到期的上线时间可能会比无状态客户端和历史数据到期晚,因为那些升级能够让大部分验证者轻松管理占用庞大空间的状态数据。 ## 无状态性 {#statelessness} -无状态性一词有些误导性,因为它并不意味着“状态”的概念被完全消除,而是会改变以太坊节点处理状态数据的方式。 无状态性本身有两种形式:弱无状态性和强无状态性。 弱无状态性通过将存储状态数据的责任转给少数节点,让大部分节点不存储状态数据。 强无状态性则会使所有节点无需再存储完整的状态数据。 这两种无状态性都会为普通验证者带来如下好处: +无状态性一词有些误导性,因为它并不意味着“状态”的概念被完全消除,而是会改变以太坊节点处理状态数据的方式。 无状态性本身有两种形式:弱无状态性和强无状态性。 弱无状态性通过将存储状态数据的责任转给少数节点,从而让大部分节点实现无状态化。 强无状态性则会使所有节点无需再存储完整的状态数据。 这两种无状态性都会为普通验证者带来如下好处: - 近乎及时的同步速度 - 无需按顺序验证区块 -- 将运行节点的硬件需求降至极低(例如在手机上运行) +- 将运行节点的硬件要求降至极低(例如在手机上运行) - 因为无需再进行读/写操作,所以节点可以在廉价硬盘上运行 -- 和以太坊加密技术的未来升级相兼容 +- 和以太坊加密技术的未来升级兼容 ### 弱无状态性 {#weak-statelessness} -弱无状态性会更改以太坊节点验证状态变更的方式,但它并不会完全消除网络中所有节点的状态存储要求。 相反,弱无状态性会将状态存储的责任交给区块提议者,同时网络中的所有其他节点无需存储完整的状态数据即可验证区块。 +弱无状态性会更改以太坊节点验证状态变化的方式,但它并不会完全消除网络中所有节点存储状态的需求。 相反,弱无状态性会将状态存储的责任交给区块提议者,同时网络中的所有其他节点无需存储完整的状态数据即可验证区块。 -**在弱无状态性中,提议区块需要访问完整的状态数据,但验证区块不需要状态数据。** +**在弱无状态性中,提出区块需要访问完整的状态数据,但验证区块不需要状态数据** -要实现这一点,以太坊客户端中必须已经实施[沃克尔树](/roadmap/verkle-trees)。 沃克尔树是一种用于存储以太坊状态数据的替代数据结构,可以在对等节点之间传递固定大小的较小“见证”数据以验证区块,而不是根据本地数据库验证区块。 此外,还需要实施[提议者-构建者分离](/roadmap/pbs/),因为这可以让区块构建者成为拥有更强大硬件的专业节点,而这些节点需要访问完整的状态数据。 +要实现这一点,以太坊客户端中必须已经实施[沃克尔树](/roadmap/verkle-trees/)。 沃克尔树是一种用于存储以太坊状态数据的替代数据结构,可以在对等节点之间传递固定大小的较小“见证”数据以验证区块,而不是根据本地数据库验证区块。 此外,还需要实施[提议者-构建者分离](/roadmap/pbs/),因为这可以让区块构建者成为拥有更强大硬件的专业节点,而这些节点需要访问完整的状态数据。 -无状态性依赖于区块构建者保存完整状态数据的副本,以便生成可用于验证区块的见证。 其他节点不需要访问状态数据,验证区块所需的所有信息都可以在见证中获得。 这就造成了一种情况,即提议区块的成本很高,但验证区块的成本很低,这意味着运行区块提议节点的运营商会越来越少。 不过,只要有尽可能多的参与者能够独立验证区块提议者提出的区块是否有效,区块提议者的去中心化并不重要。 +无状态性依赖于区块构建者保存完整状态数据的副本,以便生成可用于验证区块的见证。 其他节点不需要访问状态数据,验证区块所需的所有信息都可以在见证中获得。 这就造成了一种情况,即提出区块的成本很高,但验证区块的成本很低,这意味着运行区块提出节点的运营商会越来越少。 不过,只要有尽可能多的参与者能够独立验证区块提议者提出的区块是否有效,区块提议者的去中心化并不重要。 阅读 Dankrad 的说明,了解更多信息 @@ -81,23 +81,23 @@ EIP-4444 尚未准备上市,但在积极讨论中。 有趣的是,EIP-4444 ### 强无状态性 {#strong-statelessness} -强无状态性无需任何区块存储状态数据。 取而代之的是,交易可以通过由区块生产者聚合的见证发送。 区块生产者只负责存储为相关帐户生成见证所需的状态数据。 因为用户发送见证和“访问列表”来声明他们正在与哪些帐户和存储密钥进行交互,所以状态存储责任几乎完全由用户来承担。 +强无状态性无需任何区块存储状态数据。 取而代之的是,交易可以通过由区块生产者汇总的见证发送。 区块生产者只负责存储为相关帐户生成见证所需的状态数据。 因为用户发送见证和“访问列表”来声明他们正在与哪些帐户和存储密钥进行交互,所以状态存储责任几乎完全由用户来承担。 这样会使节点变得极为轻量,但也存在一些折中,例如节点更难与智能合约进行交易。 -研究人员已经对强无状态性进行了研究,但目前预计强无状态性不会成为以太坊路线图的一部分,更加可能的是,弱无状态性已足以满足以太坊的扩展需求。 +研究人员已经对强无状态性进行了研究,但目前预计强无状态性不会成为以太坊路线图的一部分,更加可能的是,弱无状态性已足以满足以太坊的扩容需求。 ## 当前进展 {#current-progress} -弱无状态性、历史数据过期和状态数据过期都处于研究阶段,预计几年后才会上线。 我们不能保证所有这些提案都能实现,例如,如果首先实现了状态数据到期,可能就不需要再实现历史数据到期。 此外,还需要首先完成其他路线图项目,例如[沃克尔树](/roadmap/verkle-trees)和[提议者-构建者分离](/roadmap/pbs)。 +弱无状态性、历史数据到期和状态数据到期都处于研究阶段,预计几年后才会上线。 我们不能保证所有这些提案都能实现,例如,如果首先实现了状态数据到期,可能就不需要再实现历史数据到期。 此外,还需要首先完成其他路线图项目,例如[沃克尔树](/roadmap/verkle-trees)和[提议者-构建者分离](/roadmap/pbs)。 ## 延伸阅读 {#further-reading} -- [Vitalik 在 AMA 上关于无状态性的讲解](https://www.reddit.com/r/ethereum/comments/o9s15i/impromptu_technical_ama_on_statelessness_and/) +- [Vitalik 关于无状态性的相关问答](https://www.reddit.com/r/ethereum/comments/o9s15i/impromptu_technical_ama_on_statelessness_and/) - [一种状态规模管理理论](https://hackmd.io/@vbuterin/state_size_management) -- [复活冲突最小化状态边界](https://ethresear.ch/t/resurrection-conflict-minimized-state-bounding-take-2/8739) -- [实现无状态性和状态数据到期的路径](https://hackmd.io/@vbuterin/state_expiry_paths) +- [重新恢复冲突最小化状态边界](https://ethresear.ch/t/resurrection-conflict-minimized-state-bounding-take-2/8739) +- [实现无状态性的途径和状态数据到期](https://hackmd.io/@vbuterin/state_expiry_paths) - [EIP-4444 规范](https://eips.ethereum.org/EIPS/eip-4444) - [Alex Stokes 关于 EIP-4444 的讲解](https://youtu.be/SfDC_qUZaos) - [为什么无状态性如此重要?](https://dankradfeist.de/ethereum/2021/02/14/why-stateless.html) - [关于最初无状态客户端概念的说明](https://ethresear.ch/t/the-stateless-client-concept/172) -- [关于状态数据到期的更多信息](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) +- [更多关于状态数据到期的信息](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) - [更多关于状态数据到期的信息](https://hackmd.io/@vbuterin/state_expiry_paths#Option-2-per-epoch-state-expiry) diff --git a/public/content/translations/zh/roadmap/user-experience/index.md b/public/content/translations/zh/roadmap/user-experience/index.md index fef7cebc856..f1a7ec74506 100644 --- a/public/content/translations/zh/roadmap/user-experience/index.md +++ b/public/content/translations/zh/roadmap/user-experience/index.md @@ -1,36 +1,36 @@ --- -title: 改善用户体验 -description: 对于大多数人来说,使用以太坊仍然过于复杂。 为了促进以太坊的大规模普及,必须大幅降低其进入门槛 - 必须让用户在访问以太坊时,享受去中心化、无需许可和抗审查的好处,同时像使用传统的 Web2 应用一样丝滑顺畅。 +title: 提升用户体验 +description: 对于大多数人来说,使用以太坊仍然过于复杂。 为了促进以太坊的大规模普及,必须大幅降低其进入门槛 - 必须让用户在访问以太坊时,享受去中心化、无需许可和抗审查的好处,同时像使用传统的 Web2 应用程序一样丝滑顺畅。 lang: zh image: /roadmap/roadmap-ux.png alt: "以太坊路线图" template: roadmap --- -从管理密钥和钱包到发起交易,以太坊的使用过程都需要简化。 为了促进以太坊的大规模普及,必须大幅提升使用的便捷性,让用户在访问以太坊时,体验无需许可和抗审查的好处,同时像使用 Web2 应用一样丝滑顺畅。 +从管理密钥和钱包到发起交易,以太坊的使用过程都需要简化。 为了促进以太坊的大规模普及,必须大幅提升使用的便捷性,让用户在访问以太坊时,体验无需许可和抗审查的好处,同时像使用 Web2 应用程序一样丝滑顺畅。 ## 超越助记词 {#no-more-seed-phrases} -以太坊帐户由一对密钥保护,其中,公钥用于帐户识别,私钥用于消息签名。 私钥类似于主密码,提供以太坊帐户的完全访问权限。 对于更熟悉代表用户管理帐户的银行和 Web2 应用的人来说,这是一种完全不同的操作方式。 为了使以太坊在不依赖中心化第三方的情况下大规模普及,必须有一种方法,可以让用户简单顺畅地掌握自己的资产并控制自己的数据,且无需了解公私钥加密法和密钥管理。 +以太坊帐户由一对密钥保护,其中,公钥用于帐户识别,私钥用于消息签名。 私钥类似于主密码,提供以太坊帐户的完全访问权限。 对于更熟悉代表用户管理帐户的银行和 Web2 应用程序的人来说,这是一种完全不同的操作方式。 为了使以太坊在不依赖中心化第三方的情况下大规模普及,必须有一种方法,可以让用户简单顺畅地掌握自己的资产并控制自己的数据,且无需了解公私钥加密法和密钥管理。 这个问题的解决办法是使用智能合约与以太坊交互。 智能合约钱包提供了在密钥丢失或被盗时保护帐户的途径以及更好地发现和防范欺诈的机会,还可以让钱包拥有新功能。 虽然智能合约钱包现在已经存在,但很难构建,因为它们需要以太坊协议的更好支持。 这种额外支持被称为帐户抽象。 -关于帐户抽象的更多信息 +更多关于帐户抽象的信息 ## 人人皆有节点 运行节点的用户不必依赖第三方为他们提供数据,他们可以快速、匿名且无需许可地与以太坊区块链交互。 然而,现在运行一个节点需要技术知识和大量磁盘空间,这意味着许多人不得不依赖第三方。 -以太坊将进行几项升级,使节点更容易运行,资源密集程度更低。 存储数据的方式将改为使用被称为**沃克尔树**的更具空间效率的结构。 同时,通过[无状态性](/roadmap/statelessness)或[数据到期](/roadmap/statelessness/#data-expiry)升级,以太坊节点将不再需要存储完整的以太坊状态数据的拷贝,从而大幅降低硬盘空间需求。 [轻节点](/developers/docs/nodes-and-clients/light-clients/)将具备运营完整节点的许多好处,但是在手机或简单的浏览器应用中就可以轻松运行。 +以太坊将进行几项升级,使节点更容易运行,资源密集程度更低。 存储数据的方式将改为使用更具空间效率的结构,称为**沃克尔树**。 同时,通过[无状态性](/roadmap/statelessness)或[数据到期](/roadmap/statelessness/#data-expiry)升级,以太坊节点将不再需要存储完整的以太坊状态数据的副本,从而大幅降低硬盘空间需求。 [轻节点](/developers/docs/nodes-and-clients/light-clients/)将具备运行全节点的许多好处,但是在手机或简单的浏览器应用程序中就可以轻松运行。 阅读关于沃克尔树的信息 -通过这些升级,运行节点的障碍实际上减少到零。 用户将可以安全、无需许可地访问以太坊,且不需要在计算机或手机上牺牲大量磁盘空间或 CPU,在使用应用时,也不必依赖第三方提供数据或网络访问权限。 +通过这些升级,运行节点的障碍实际上减少到零。 用户将可以安全、无需许可地访问以太坊,且不需要在计算机或手机上牺牲大量磁盘空间或 CPU,在使用应用程序时,也不必依赖第三方提供数据或网络访问权限。 ## 当前进展 {#current-progress} 智能合约钱包已经推出,但需要进行更多升级以使其尽可能去中心化和无需许可。 EIP-4337 是一个成熟的提案,不需要对以太坊协议做出任何修改。 EIP-4337 需要的主要智能合约于 2023 年 3 月部署。 -完全的无状态性仍处于研究阶段,可能还需要几年才能实现。 在通往完全无状态性的路上有许多里程碑,包括可能不久后就会实现的数据到期。 可能需要首先完成其他路线图项目,例如[沃克尔树](/roadmap/verkle-trees/)和[提议者-构建者分离](/roadmap/pbs/)。 +完全的无状态性仍处于研究阶段,可能还需要几年才能实现。 在通往完全无状态性的道路上有许多里程碑,包括可能不久后就会实现的数据到期。 可能需要首先完成其他路线图项目,例如[沃克尔树](/roadmap/verkle-trees/)和[提议者-构建者分离](/roadmap/pbs/)。 沃克尔树测试网已经上线并运行,下一阶段是在私有测试网上运行启用沃克尔树的客户端,然后在公共测试网运行。 你可以通过在测试网部署智能合约或运行测试网客户端来帮助加速这一进程。 diff --git a/public/content/translations/zh/roadmap/verkle-trees/index.md b/public/content/translations/zh/roadmap/verkle-trees/index.md index 5eb8f088538..ed5e1d13afc 100644 --- a/public/content/translations/zh/roadmap/verkle-trees/index.md +++ b/public/content/translations/zh/roadmap/verkle-trees/index.md @@ -1,6 +1,6 @@ --- title: 沃克尔树 -description: 沃克尔树的简要描述以及将如何被用于升级以太坊 +description: 沃克尔树的简要描述以及将如何用于升级以太坊 lang: zh summaryPoints: - 了解沃克尔树是什么 @@ -9,37 +9,37 @@ summaryPoints: # 沃克尔树 {#verkle-trees} -沃克尔树("Vector commitment"和"Merkle Trees"的组合)是一种数据结构,可用于升级以太坊节点,使其能够不再存储大量状态数据,同时不失去验证区块的能力。 +沃克尔树("Vector commitment" 和 "Merkle Trees" 的组合)是一种数据结构,可用于升级以太坊节点,使其能够不再存储大量状态数据,同时不失去验证区块的能力。 ## 无状态性 {#statelessness} -沃克尔树是实现无状态以太坊客户端的关键一步。 无状态客户端是指不需要为了验证传入的区块而存储整个状态数据库的客户端。 无状态客户端使用与区块一同传来的状态数据的“见证”来验证区块,而非使用以太坊状态数据的本地拷贝。 见证是执行一组特定交易所需的单个状态数据片段的集合,以及表明见证确实是完整数据的一部分的加密证据。 见证用于*替代*状态数据库。 要做到这一点,见证需要非常小,以便能够安全地在网络上广播并被验证者在 12 秒的时隙内处理。 当前的状态数据结构不合适,因为它形成的见证太大。 沃克尔树通过实现小型见证解决了这个问题,从而消除了无状态客户端的主要障碍之一。 +沃克尔树是实现无状态以太坊客户端的关键一步。 无状态客户端是指不需要为了验证传入的区块而存储整个状态数据库的客户端。 无状态客户端使用与区块一同传来的状态数据的“见证”来验证区块,而非使用以太坊状态数据的本地拷贝。 见证是执行一组特定交易所需的单个状态数据片段的集合,以及表明见证确实是完整数据的一部分的加密证据。 见证用于_替代_状态数据库。 要做到这一点,见证需要非常小,以便能够安全地在网络上广播并被验证者在 12 秒的时隙内处理。 当前的状态数据结构不合适,因为它形成的见证太大。 沃克尔树通过实现小型见证解决了这个问题,从而消除了无状态客户端的主要障碍之一。 -以太坊客户端目前使用一种名为默克尔帕特里夏树的数据结构来存储其状态数据。 单个帐户的信息被存储为该树的叶子,然后对这些叶子反复进行哈希处理,直到只剩下一个哈希值。 这个最终的哈希值被称为“根”。 为了验证区块,以太坊客户端需要执行区块中的所有交易并更新它们的本地状态树。 如果本地树的根与区块提议者提供的相同,则该区块被视为有效,因为区块提议者和验证节点进行的计算如有任何差异,都会导致根哈希值完全不同。 这样做的问题在于验证区块链要求每个客户端存储链头区块以及一些历史区块的整个状态树(Geth 中的默认设置是保存链头区块之后 128 个区块的状态数据) 这要求客户端有非常大的磁盘空间,这成为在低成本、低功耗硬件上运行完整节点的障碍。 一个解决方案是将状态树更新为一个更高效的结构(沃克尔树),该结构可以被概括为使用可以分享的较小的数据“见证”来代替完整的状态数据。 将状态数据的形式改为沃克尔树是迈向无状态客户端的重要一步。 +以太坊客户端目前使用一种名为默克尔帕特里夏树的数据结构来存储其状态数据。 单个帐户的信息被存储为该树的叶子,然后对这些叶子反复进行哈希处理,直到只剩下一个哈希值。 这个最终的哈希值被称为“根”。 为了验证区块,以太坊客户端需要执行区块中的所有交易并更新它们的本地状态树。 如果本地树的根与区块提议者提供的相同,则该区块被视为有效,因为区块提议者和验证节点进行的计算如有任何差异,都会导致根哈希值完全不同。 这样做的问题在于验证区块链要求每个客户端存储链头区块以及一些历史区块的整个状态树(Geth 中的默认设置是保存链头区块之后 128 个区块的状态数据)。 这要求客户端有非常大的磁盘空间,这成为在低成本、低功耗硬件上运行全节点的障碍。 一个解决方案是将状态树更新为一个更高效的结构(沃克尔树),该结构可以被概括为使用可以分享的小型数据“见证”来代替完整的状态数据。 将状态数据的形式改为沃克尔树是迈向无状态客户端的重要一步。 ## 什么是见证?我们为什么需要它们? {#what-is-a-witness} -验证区块意味着重新执行区块中包含的交易,将更改应用到以太坊的状态数,并计算新的根哈希值。 区块经过验证是指,计算出的状态根哈希值与随该区块提供的根哈希值相同(因为这意味着区块提议者确实进行了他们所说的计算)。 在当今的以太坊客户端中,更新状态需要访问整个状态数,而它是一个必须本地存储的非常大的数据结构。 见证只包含执行区块中的交易所需的状态数据片段。 验证者只能使用这些片段来验证区块提议者是否正确执行了区块交易并更新了状态。 然而,这意味着见证需要在以太坊网络的对等节点之间非常快速地传输,能够在 12 秒的时隙内被每个节点安全地接收和处理。 如果见证过大,一些节点可能需要很长时间才能下载并跟上区块链的进度。 这会推动中心化,因为它意味着只有拥有快速互联网连接的节点才能参与验证区块。 有了沃克尔树,就无需将状态存储在硬盘上;验证区块所需的*一切信息*都包含在区块本身中。 遗憾的是,默克尔树产生的见证过于庞大,无法支持无状态客户端。 +验证区块意味着重新执行区块中包含的交易,将更改应用到以太坊的状态数,并计算新的根哈希值。 区块经过验证是指,计算出的状态根哈希值与随该区块提供的根哈希值相同(因为这意味着区块提议者确实进行了他们所说的计算)。 在当今的以太坊客户端中,更新状态需要访问整个状态数,而它是一个必须本地存储的非常大的数据结构。 见证只包含执行区块中的交易所需的状态数据片段。 验证者只能使用这些片段来验证区块提议者是否正确执行了区块交易并更新了状态。 然而,这意味着见证需要在以太坊网络的对等节点之间非常快速地传输,能够在 12 秒的时隙内被每个节点安全地接收和处理。 如果见证过大,一些节点可能需要很长时间才能下载并跟上区块链的进度。 这会推动中心化,因为它意味着只有拥有快速互联网连接的节点才能参与验证区块。 有了沃克尔树,就无需将状态存储在硬盘上;验证区块所需的_一切信息_都包含在区块本身中。 遗憾的是,默克尔树产生的见证过于庞大,无法支持无状态客户端。 ## 为什么沃克尔树可以实现更小的见证? {#why-do-verkle-trees-enable-smaller-witnesses} -默克尔树的结构使得见证非常大,无法在 12 秒的时隙内安全地在对等节点之间广播。 这是因为见证是连接数据(保存在叶子中)和根哈希值的路径。 要验证数据,不仅需要有连接每个叶子和根节点的所有中间哈希值,还需要有所有“同级”节点。 证明中的每个节点都有一个同级节点,需要与之进行哈希运算以创建树上的下一个哈希值。 这需要大量数据。 沃克尔树缩短了树叶与树根之间的距离,并且不再要求为了验证根哈希值而提供同级节点,从而缩小了见证。 使用功能强大的多项式承诺方案替代哈希式的矢量承诺,可以获得更高的空间效率。 多项式承诺可以固定见证的大小,无论它证明的叶子数量有多少。 +默克尔树的结构使得见证非常大,无法在 12 秒的时隙内被安全地在对等节点之间广播。 这是因为见证是连接数据(保存在叶子中)和根哈希值的路径。 要验证数据,不仅需要有连接每个叶子和根节点的所有中间哈希值,还需要有所有“同级”节点。 证明中的每个节点都有一个同级节点,需要与之进行哈希运算以创建树上的下一个哈希值。 这需要大量数据。 沃克尔树缩短了树叶与树根之间的距离,并且不再要求为了验证根哈希值而提供同级节点,从而缩小了见证。 使用功能强大的多项式承诺方案替代哈希式的向量承诺,可以获得更高的空间效率。 多项式承诺允许固定大小的见证,无论它证明的叶子数量有多少。 -在多项式承诺方案下,见证的大小是可控的,可以轻松在点对点网络上传输。 这样,客户端就能以最小的数据量验证每个区块的状态变化。 +在多项式承诺方案下,见证的大小是可控的,可以轻松在对等网络上传输。 这样,客户端就能以最小的数据量验证每个区块的状态变化。 -见证的大小取决于它所包含的叶子的数量。 假设见证包含 1000 个叶子,在默克尔数中见证大小约为 3.5MB(假设该树有 7 个层级)。 而在沃克尔树(假设该树有 4 个层级)中,相同数据的见证大小约为 150 kB - **小了约 23 倍**。 见证的缩小将使无状态客户端见证的大小达到可接受的程度。 根据使用的特定多项式承诺,多项式见证的大小为 0.128 -1 kB。 +见证的大小取决于它所包含的叶子的数量。 假设见证包含 1000 片叶子,在默克尔树中见证大小约为 3.5MB(假设该树有 7 个层级)。 而在沃克尔树(假设该树有 4 个层级)中,相同数据的见证大小约为 150 kB - **小了约 23 倍**。 见证的缩小将使无状态客户端见证的大小达到可接受的程度。 根据使用的特定多项式承诺,多项式见证的大小为 0.128 -1 kB。 ## 沃克尔树的结构是什么? {#what-is-the-structure-of-a-verkle-tree} -沃克尔树是 `(key,value)` 对,其中键是 32 字节元素,由一个 31 字节的*词干*和一个单字节的*后缀*组成。 这些键分为*扩展*节点和*内部*节点。 扩展节点代表一个单一的词干,包含 256 个不同后缀的子节点。 内部节点也有 256 个子节点,但它们可以是其他扩展节点。 沃克尔树和默克尔树结构的主要区别在于,沃克尔树更扁平,这意味着连接叶子和根的中间节点更少,因此生成证明所需的数据也更少。 +沃克尔树是 `(key,value)` 对,其中键是 32 字节元素,由一个 31 字节的_词干_和一个单字节的_后缀_组成。 这些键分为_扩展_节点和_内部_节点。 扩展节点代表一个单一的词干,包含 256 个不同后缀的子节点。 内部节点也有 256 个子节点,但它们可以是其他扩展节点。 沃克尔树和默克尔树结构的主要区别在于,沃克尔树更扁平,这意味着连接叶子和根的中间节点更少,因此生成证明所需的数据也更少。 ![](./verkle.png) @@ -47,11 +47,11 @@ summaryPoints: ## 当前进展 {#current-progress} -沃克尔树测试网已经启动并运行,但需要对客户端进行大量更新,才能让其支持沃克尔树。 你可以通过在测试网部署智能合约或运行测试网客户端来帮助加速这一进程。 +沃克尔树测试网已经启动并运行,但要支持沃克尔树,还需要对客户端进行大量更新。 你可以通过在测试网部署智能合约或运行测试网客户端来帮助加速这一进程。 -[探索 Beverly Hills 沃克尔测试网](https://beverlyhills.ethpandaops.io) +[探索 Beverly Hills 沃克尔树测试网](https://beverlyhills.ethpandaops.io) -[观看 Guillaume Ballet 关于 Condrieu 沃克尔测试网的讲解](https://www.youtube.com/watch?v=cPLHFBeC0Vg)(注意:Condrieu 测试网是工作量证明,现已被 [Kaustinen 测试网](https://kaustinen.ethdevops.io)取代)。 +[观看 Guillaume Ballet 关于 Condrieu 沃克尔树测试网的讲解](https://www.youtube.com/watch?v=cPLHFBeC0Vg)(注意:Condrieu 测试网采用工作量证明,现已被 [Kaustinen 测试网](https://kaustinen.ethdevops.io)取代)。 ## 延伸阅读 {#further-reading} @@ -60,6 +60,6 @@ summaryPoints: - [Guillaume Ballet 在 Devcon 6 上的演讲“沃克尔树如何让以太坊变得高效精简”](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam 在 2020 年 ETHDenver 大会上关于无状态客户端的讲解](https://www.youtube.com/watch?v=0yiZJNciIJ4) - [Dankrad Fiest 在 Zero Knowledge 播客上关于沃克尔树和无状态性的讲解](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Vitalik Buterin 关于沃克尔树的讲解](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Vitalik Buterin 关于沃克尔树的讲解](https://vitalik.eth.limo/general/2021/06/18/verkle.html) - [Dankrad Feist 关于沃克尔树的讲解](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) - [沃克尔树的以太坊改进提案](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/zh/security/index.md b/public/content/translations/zh/security/index.md index 94f2b7f110b..fefafbf13a8 100644 --- a/public/content/translations/zh/security/index.md +++ b/public/content/translations/zh/security/index.md @@ -6,7 +6,7 @@ lang: zh # 以太坊安全和预防欺诈措施 {#introduction} -随着人们对加密货币的兴趣越来越大,学习使用加密货币时的最佳做法是至关重要的。 加密货币是非常有趣和令人兴奋的,但也存在严重的风险。 如果您前期投入少量的工作,你就可以降低这些风险。 +随着人们对加密货币的兴趣越来越大,学习使用加密货币时的最佳做法是至关重要的。 加密货币是非常有趣和令人兴奋的,但也存在严重的风险。 如果你前期投入少量的工作,你就可以降低这些风险。 @@ -14,7 +14,7 @@ lang: zh ### 使用强密码 {#use-strong-passwords} -[超过 80% 的账户被黑客攻击是由于密码薄弱或被盗造成的](https://cloudnine.com/ediscoverydaily/electronic-discovery/80-percent-hacking-related-breaches-related-password-issues-cybersecurity-trends/)。 一个很长的字符、数字和符号组合是保证您的账户安全的最好方法。 +[超过 80% 的帐户被黑客攻击是由于密码薄弱或被盗造成的](https://cloudnine.com/ediscoverydaily/electronic-discovery/80-percent-hacking-related-breaches-related-password-issues-cybersecurity-trends/)。 一个很长的字符、数字和符号组合是保证你的帐户安全的最好方法。 个人常犯的一个错误是使用两到三个常见的、具有相关性的词典词汇的组合。 像这样的密码是不安全的,因为它们很容易被称为[字典攻击](https://wikipedia.org/wiki/Dictionary_attack)的简单黑客技术所攻击。 @@ -24,7 +24,7 @@ lang: zh 强密码示例:ymv\*azu.EAC8eyp8umf ``` -另一个常见错误是使用容易通过[社交工程]()猜出或发现的密码。 在密码中加入母亲的婚前姓氏、孩子或宠物的名字或出生日期是不安全的,会增加密码被黑客攻击的风险。 +另一个常见错误是使用容易通过[社交工程](https://wikipedia.org/wiki/Social_engineering_(security))猜出或发现的密码。 在密码中加入母亲的婚前姓氏、孩子或宠物的名字或出生日期是不安全的,会增加密码被黑客攻击的风险。 #### 强密码设置方法: {#good-password-practices} @@ -37,7 +37,7 @@ lang: zh ### 使用独立的密码 {#use-unique-passwords} -如果密码数据被泄露,强密码也无法提供足够的保护。 网站[我被攻破了吗](https://haveibeenpwned.com)允许您检查您的账户是否参与了存储在其数据库中的任何数据入侵。 如果有,**您应该立刻更改泄露的密码**。  为每个帐户设置独立的密码可以降低当你的一个密码被破解时黑客进入你所有账户的风险。 +如果密码数据被泄露,强密码也无法提供足够的保护。 网站[我被攻破了吗](https://haveibeenpwned.com)允许你检查你的帐户是否参与了存储在其数据库中的任何数据入侵。 如果有,**你应该立刻更改泄露的密码**。  为每个帐户设置独立的密码可以降低当你的一个密码被破解时黑客进入你所有帐户的风险。 ### 使用密码管理器 {#use-password-manager} @@ -47,7 +47,7 @@ lang: zh
-记住为每个账户设置的唯一强密码并不现实。 密码管理器为您的所有密码提供了一个安全、加密的存储空间,您可以通过一个强主密码进行访问。 他们还在注册新服务时生成建议使用的强密码,这样你就不必自行创建密码了。 许多密码管理器也会告诉你是否涉及数据泄露,让你在任何恶意攻击之前更改密码。 +记住为每个帐户设置的唯一强密码并不现实。 密码管理器为你的所有密码提供了一个安全、加密的存储空间,你可以通过一个强主密码进行访问。 他们还在注册新服务时生成建议使用的强密码,这样你就不必自行创建密码了。 许多密码管理器也会告诉你是否涉及数据泄露,让你在任何恶意攻击之前更改密码。 ![密码管理器使用示例](./passwordManager.png) @@ -60,13 +60,13 @@ lang: zh ### 2FA(双重身份验证) {#two-factor-authentication} -为了证明您是本人,有不同的唯一证明可以用来验证。 这些被称为**因素**的三个主要因素是: +为了证明你是本人,有不同的唯一证明可以用来验证。 这些被称为**因素**的三个主要因素是: -- 您知道的信息(例如密码或安全问题) +- 你知道的信息(例如密码或安全问题) - 生理特征(如指纹或虹膜/面部识别) - 你私有的(安全密钥或你手机上的认证程序) -使用**双重身份验证 (2FA)** 为您的在线账户提供额外的*安全因素*,因此仅知道您的密码(您知道的信息)不足以访问一个账户。 最常见的是,双重验证是一个随机的 6 位数代码,被称为**基于时间的一次性密码(TOTP)**,您可以通过身份验证程序应用程序(如 Google authenticator 或 Authy)生成。 这是一种“你私有的”,因为生成随机时间密码的种子文件存储在你的设备上。 +使用**双重身份验证 (2FA)** 为你的在线帐户提供额外的*安全因素*,因此仅知道你的密码(你知道的信息)不足以访问一个帐户。 最常见的是,双重验证是一个随机的6位数代码,被称为**基于时间的一次性密码(TOTP)**,你可以通过身份验证程序应用程序(如Google authenticator或Authy)生成。 这是一种“你私有的”,因为生成随机时间密码的种子文件存储在你的设备上。
@@ -92,7 +92,7 @@ lang: zh ### 卸载浏览器扩展程序 {#uninstall-browser-extensions} -Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览器的功能并提高用户体验,但它们也存在风险。 大多数浏览器扩展程序默认请求获得“读取和更改网站数据”的权限,几乎允许它们对您的数据做任何事情。 Chrome 扩展程序总是自动更新,因此旧版本安全的扩展程序可能会在更新后被加入恶意代码。 大多数浏览器扩展程序都不会试图窃取您的数据,但您应该知道它们可以。 +Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览器的功能并提高用户体验,但它们也存在风险。 大多数浏览器扩展程序默认请求获得“读取和更改网站数据”的权限,几乎允许它们对你的数据做任何事情。 Chrome 扩展程序总是自动更新,因此旧版本安全的扩展程序可能会在更新后被加入恶意代码。 大多数浏览器扩展程序都不会试图窃取你的数据,但你应该知道它们可以。 #### 通过以下方式保持安全: {#browser-extension-safety} @@ -106,9 +106,9 @@ Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览 ## 加密货币安全 101 {#crypto-security} -### 提升您的知识水平 {#level-up-your-knowledge} +### 提升你的知识水平 {#level-up-your-knowledge} -人们在网络中被骗的主要原因之一通常是缺乏了解。 例如,如果您不了解以太坊网络是去中心化的,不为任何人所拥有,您就很容易上当受骗。有人假装成客户服务人员,承诺用您的私钥找回您丢失的以太币。 了解以太坊如何运作是一项值得的投资。 +人们在网络中被骗的主要原因之一通常是缺乏了解。 例如,如果你不了解以太坊网络是去中心化的,不为任何人所拥有,你就很容易上当受骗。有人假装成客户服务人员,承诺用你的私钥找回你丢失的以太币。 了解以太坊如何运作是一项值得的投资。 什么是以太坊? @@ -121,19 +121,19 @@ Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览 ## 钱包安全 {#wallet-security} -### 不要把您的私钥给别人 {#protect-private-keys} +### 不要把你的私钥给别人 {#protect-private-keys} -**无论任何原因,永远不要与他人分享您的私钥!** +**无论任何原因,永远不要与他人分享你的私钥!** -您钱包的私钥就像您的以太坊钱包的密码。 这是阻止知道您的钱包地址的人榨干您账户中所有资产的唯一方法。 +你钱包的私钥就像你的以太坊钱包的密码。 这是阻止知道你的钱包地址的人榨干你帐户中所有资产的唯一方法。 什么是以太坊钱包? -#### 不要将您的助记词/私钥截图 {#screenshot-private-keys} +#### 不要将你的助记词/私钥截图 {#screenshot-private-keys} -如果将您的助记词或私钥截图,您有可能将它们同步到云端,并有可能使它们被黑客获取。 从云端获取私钥是黑客最常见的攻击方式。 +如果将你的助记词或私钥截图,你有可能将它们同步到云端,并有可能使它们被黑客获取。 从云端获取私钥是黑客最常见的攻击向量。 ### 使用硬件钱包 {#use-hardware-wallet} @@ -148,37 +148,37 @@ Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览 ### 发送交易前仔细检查 {#double-check-transactions} -不小心将加密货币发送到错误的钱包地址是一个常见的错误。 **在以太坊上发送交易是不可逆的。**除非您认识地址所有者并能说服他们把您的资金退回来,否则您将没有办法找回您的资金。 +不小心将加密货币发送到错误的钱包地址是一个常见的错误。 **在以太坊上发送交易是不可逆的。**除非你认识地址所有者并能说服他们把你的资金退回来,否则你将没有办法找回你的资金。 -在发送交易之前,请务必确保您发送的地址与接收人的地址完全匹配。 在与智能合约进行交互时,建议在签名前阅读交易消息。 +在发送交易之前,请务必确保你发送的地址与接收人的地址完全匹配。 在与智能合约进行交互时,建议在签名前阅读交易消息。 ### 设置智能合约的支出限额 {#spend-limits} -与智能合约进行交互时,不得允许无限制支出限额。 无支出限额可以让智能合约掏空您的钱包。 相反,只将支出限额设置为交易所需金额。 +与智能合约进行交互时,不得允许无限制支出限额。 无支出限额可以让智能合约掏空你的钱包。 相反,只将支出限额设置为交易所需金额。 -许多以太坊钱包提供限额保护,以防止账户被掏空。 +许多以太坊钱包提供限额保护,以防止帐户被掏空。 -[如何撤销智能合约访问您的加密资金](/guides/how-to-revoke-token-access/) +[如何撤销智能合约访问你的加密资金](/guides/how-to-revoke-token-access/) ## 常见的骗术 {#common-scams} -骗子总是想方设法从您身上骗走您的资金。 完全阻止骗子是不可能的,但我们可以通过了解所使用的大多数技术来降低他们的成功率。 虽然骗术层出不穷,但是他们的本质相同。 最重要的是,请记住: +骗子总是想方设法从你身上骗走你的资金。 完全阻止骗子是不可能的,但我们可以通过了解所使用的大多数技术来降低他们的成功率。 虽然骗术层出不穷,但是他们的本质相同。 最重要的是,请记住: - 始终保持怀疑态度 -- 没有人会给您免费或打折的以太币 -- 没有人需要获取您的私钥或个人信息 +- 没有人会给你免费或打折的以太币 +- 没有人需要获取你的私钥或个人信息 ### 赠品诈骗 {#giveaway} -加密货币中最常见的骗局之一是赠品诈骗。 赠品诈骗有多种形式,但一般前提是,如果您将以太币发送到所提供的钱包地址,您将会收到双倍的以太币。 *因此,它也称为“买一送一”诈骗。* +加密货币中最常见的骗局之一是赠品诈骗。 赠品诈骗有多种形式,但一般前提是,如果你将以太币发送到所提供的钱包地址,你将会收到双倍的以太币。 *因此,它也称为“买一送一”诈骗。* -这些骗局往往规定赠品领取时间有限,促使您做出错误决定并制造出一种虚假的紧迫感。 +这些骗局往往规定赠品领取时间有限,促使你做出错误决定并制造出一种虚假的紧迫感。 #### 社交媒体黑客攻击 {#social-media-hacks} -最出名的一次发生在 2020 年 7 月,当时很多知名人士和组织的 Twitter 帐户被黑。 黑客使用被盗的帐户发布了一个比特币赠送活动。 尽管这些欺骗性的推文很快就被发现并删除,但黑客们还是成功骗走了 11 个比特币(截至 2021 年 9 月,这些比特币价值 50 万美元)。 +最出名的一次发生在 2020 年 7 月,当时很多知名人士和组织的 Twitter 帐户被黑。 黑客使用被盗的帐户发布了一个比特币赠送活动。 尽管这些欺骗性的推文很快就被发现并删除,但黑客们还是成功骗走了 11 个比特币(截至 2021年 9 月,这些比特币价值 50 万美元)。 ![Twitter 上的诈骗案例](./appleTwitterScam.png) @@ -188,7 +188,7 @@ Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览 除最常使用的 Vitalik Buterin 以外,此类骗局也使用了加密货币圈内许多其他知名人士(例如 Elon Musk 或 Charles Hoskinson)。 在直播中加入一位知名人士会让骗局看起来有一种合法性(这看起来有点牵强,但 Vitalik 参与其中,所以肯定没问题!)。 -**赠品活动通常是骗局。 如果您把钱转到这些账户,您将永远失去它们。** +**赠品活动通常是骗局。 如果你把钱转到这些帐户,你将永远失去它们。** ![YouTube 上的诈骗案例](./youtubeScam.png) @@ -200,10 +200,10 @@ Chrome 扩展程序或 Firefox 插件等浏览器扩展程序可以增强浏览 ![Discord 上的技术支持诈骗案例](./discordScam.png) -一般来说,员工永远不会通过私人的非官方渠道与您交流。 在处理支持问题时,要牢记一些简单的事情: +一般来说,员工永远不会通过私人的非官方渠道与你交流。 在处理支持问题时,要牢记一些简单的事情: - 永远不要分享你的私钥、助记词或密码 -- 绝不允许任何人远程访问您的电脑 +- 绝不允许任何人远程访问你的电脑 - 切勿通过官方指定以外的渠道沟通 @@ -228,7 +228,7 @@ _注意:有一些衍生的代币/票据可能代表了被质押的以太币( 如果你收到一封来历不明的电子邮件,请记住: -- 永远不要打开您不认识的电子邮件地址中的链接或附件 +- 永远不要打开你不认识的电子邮件地址中的链接或附件 - 切勿将你的个人信息或密码泄露给任何人 - 删除来历不明的电子邮件 @@ -252,9 +252,9 @@ _注意:有一些衍生的代币/票据可能代表了被质押的以太币( 有些事情要记住: -- 警惕任何与您联系,告诉您如何使用加密货币赚钱的人 +- 警惕任何与你联系,告诉你如何使用加密货币赚钱的人 - 做好关于赌注、流动性池或其他加密货币投资方式的调研 -- 这种计划即使有,也很少是合法的。 如果是的话,它们会成为主流,您会听说过它们。 +- 这种计划即使有,也很少是合法的。 如果是的话,它们会成为主流,你会听说过它们。 [有人在矿池骗局中损失了 20 万美元](https://www.reddit.com/r/CoinBase/comments/r0qe0e/scam_or_possible_incredible_payout/) @@ -270,7 +270,6 @@ _注意:有一些衍生的代币/票据可能代表了被质押的以太币( ### 网络安全 {#reading-web-security} -- [为何不应使用文本进行双重身份验证](https://www.theverge.com/2017/9/18/16328172/sms-two-factor-authentication-hack-password-bitcoin) - _The Verge_ - [多达 300 万台设备被带有恶意软件的 Chrome 和 Edge 插件感染](https://arstechnica.com/information-technology/2020/12/up-to-3-million-devices-infected-by-malware-laced-chrome-and-edge-add-ons/) - _Dan Goodin_ - [如何创建一个不会忘记的强密码](https://www.avg.com/en/signal/how-to-create-a-strong-password-that-you-wont-forget) - _AVG_ - [什么是安全密钥?](https://help.coinbase.com/en/coinbase/getting-started/verify-my-account/security-keys-faq) - _Coinbase_ @@ -278,7 +277,7 @@ _注意:有一些衍生的代币/票据可能代表了被质押的以太币( ### 加密货币安全 {#reading-crypto-security} - [保护自己和资金](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [保持加密货币安全的 4 种方法](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [常见加密通信软件中的安全问题](https://docs.salusec.io/untitled/web3-penetration-test/risks-in-social-media) - _Salus_ - [任何人都适用的安全指南](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [加密货币安全:密码和身份验证](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/zh/web3/index.md b/public/content/translations/zh/web3/index.md index 5bfe2587f6e..940ae27302e 100644 --- a/public/content/translations/zh/web3/index.md +++ b/public/content/translations/zh/web3/index.md @@ -18,7 +18,7 @@ Web3 是摆脱这一困境的方案。 不同于科技巨头垄断的传统互 ### Web 1.0:只读 (1990-2004) {#web1} -1989 年,在日内瓦的欧洲核子研究中心,Tim Berners-Lee 正忙于开发将成为万维网的协议。 他的想法是什么呢? 创建一种开放的、去中心化协议,在地球上任何角落实现信息共享。 +1989年,在日内瓦的欧洲核子研究中心,Tim Berners-Lee 正忙于开发将成为万维网的协议。 他的想法是什么呢? 创建一种开放的、去中心化协议,在地球上任何角落实现信息共享。 Berners-Lee 创造的第一个万维网雏形,现在被称为“Web 1.0”,大约在 1990 年至 2004 年之间形成。 Web 1.0 主要是由公司拥有的静态网站,用户之间的互动几乎为零 - 个人很少创造内容,导致它被称为只读网络。 @@ -49,7 +49,7 @@ Web3 已成为一个包罗万象的术语,代表了一个新的、更好的互 - **Web3 是去中心化的:**大部分互联网不是由中心化实体控制和拥有的,而是由构建者和用户分配所有权。 - **Web3 无需许可:**每个人都有参与 Web3 的平等权限,没有人被排除在外。 - **Web3 具有原生支付功能:**它使用加密货币进行线上消费和汇款,而不是依赖传统银行或第三方支付机构过时的基础设施。 -- **Web3 无需信任:**它通过激励措施和经济机制运转,而不是依赖受信任的第三方。 +- **Web3 去信任:**它通过激励措施和经济机制运转,而不是依赖受信任的第三方。 ### 为什么 Web3 很重要? {#why-is-web3-important} @@ -57,9 +57,9 @@ Web3 已成为一个包罗万象的术语,代表了一个新的、更好的互 #### 所有权 {#ownership} -Web3 以前所未有的方式赋予您数字资产的所有权。 例如,假设您正在玩一个 Web2 游戏。 如果您购买游戏内物品,它会直接与您的帐户绑定。 如果游戏创建者删除您的帐户,您将丢失这些物品。 或者如果您停止玩游戏,您将失去投资到游戏内物品的价值。 +Web3 以前所未有的方式赋予你数字资产的所有权。 例如,假设你正在玩一个 Web2 游戏。 如果你购买游戏内物品,它会直接与你的帐户绑定。 如果游戏创建者删除你的帐户,你将丢失这些物品。 或者如果你停止玩游戏,你将失去投资到游戏内物品的价值。 -Web3 允许通过[非同质化代币 (NFT)](/nft/) 直接拥有所有权。 任何人甚至是游戏创作者,都没有权力剥夺您的所有权。 而且,如果您停止玩这个游戏,您可以在公开市场上出售或交易您的游戏内物品并收回它们的价值。 +Web3 允许通过[非同质化代币 (NFT)](/nft/) 直接拥有所有权。 任何人甚至是游戏创作者,都没有权力剥夺你的所有权。 而且,如果你停止玩这个游戏,你可以在公开市场上出售或交易你的游戏内物品并收回它们的价值。
了解更多有关非同质化代币的更多信息
@@ -74,7 +74,7 @@ Web3 允许通过[非同质化代币 (NFT)](/nft/) 直接拥有所有权。 任 OnlyFans 是一个由用户生产内容的成人网站,拥有 100 多万内容创作者,其中许多人将该平台作为他们的主要收入来源。 2021 年 8 月,OnlyFans 宣布了禁止色情内容的计划。 这个公告在平台创作者中引发了愤怒,他们感觉自己在帮助创建了平台后被剥夺了收入。 在遭遇强烈反对之后,这个决定很快被推翻。 尽管创作者赢得了这场战斗,但它突显了 Web 2.0 创作者的一个困境:如果离开一个平台,就会失去在平台积攒的声誉和关注。 -在 Web3,您的数据位于区块链上。 当您决定离开一个平台时,您可以将您的声誉带走,将其带进另一个更符合您的价值观的平台。 +在 Web3,你的数据位于区块链上。 当你决定离开一个平台时,你可以将你的声誉带走,将其带进另一个更符合你的价值观的平台。 Web 2.0 需要内容创作者信任平台不会更改规则,但抗审查则是 Web3 平台的原生特性。 @@ -105,7 +105,7 @@ Web3 允许你使用以太坊地址和以太坊域名服务配置文件控制你 ### 原生支付功能 {#native-payments} -Web2 的支付基础设施依赖于银行和第三方支付机构,这就把没有银行账户或碰巧生活在某些“不好”国家/地区的人排除在外。 Web3 使用诸如[以太币](/eth/)之类的代币直接在浏览器中汇款,不需要受信任的第三方。 +Web2 的支付基础设施依赖于银行和第三方支付机构,这就把没有银行帐户或碰巧生活在某些“不好”国家/地区的人排除在外。 Web3 使用诸如[以太币](/eth/)之类的代币直接在浏览器中汇款,不需要受信任的第三方。 有关以太币的更多信息 @@ -117,7 +117,7 @@ Web2 的支付基础设施依赖于银行和第三方支付机构,这就把没 ### 可访问性 {#accessibility} -如今,人人都可以使用重要的 Web3 功能,例如使用以太坊登录,而且不会有任何费用。 但是,相对较高的交易成本仍然让许多人望而却步。 由于高昂的交易费用,Web3 不大可能在不太富裕的发展中国家使用。 在以太坊,正在通过[路线图](/roadmap/)和[二层网络扩容解决方案](/developers/docs/scaling/)解决这些难题。 技术现成可用,但我们需要提高技术在 2 层网络的采用程度,才能让每个人都能使用 Web3。 +如今,人人都可以使用重要的 Web3 功能,例如使用以太坊登录,而且不会有任何费用。 但是,相对较高的交易成本仍然让许多人望而却步。 由于高昂的交易费用,Web3 不大可能在不太富裕的发展中国家使用。 在以太坊,正在通过[路线图](/roadmap/)和[二层网络扩容解决方案](/developers/docs/scaling/)解决这些难题。 技术现成可用,但我们需要提高技术在二层网络的采用程度,才能让每个人都能使用 Web3。 ### 用户体验 {#user-experience} @@ -135,7 +135,7 @@ Web3 生态系统很年轻,并且正在迅速发展。 因此,它目前主 ## 去中心化的未来 {#decentralized-future} -Web3 是一个年轻且不断发展的生态系统。 Gavin Wood 在 2014 年创造了这个术语,但其中许多想法直到最近才成为现实。 仅在去年,我们就经历了人们对加密货币的兴趣大增、2 层扩容解决方案的改进、新治理形式的大规模实验以及数字身份的革命。 +Web3 是一个年轻且不断发展的生态系统。 Gavin Wood 在 2014 年创造了这个术语,但其中许多想法直到最近才成为现实。 仅在去年,我们就经历了人们对加密货币的兴趣大增、二层网络扩容解决方案的改进、新治理形式的大规模实验以及数字身份的革命。 我们才刚刚开始用 Web3 创建更美好的互联网,但随着我们持续改进它的基础设施,互联网的未来看起来一片光明。 diff --git a/public/content/translations/zh/zero-knowledge-proofs/index.md b/public/content/translations/zh/zero-knowledge-proofs/index.md index 7940c19b0d1..ec74c288e55 100644 --- a/public/content/translations/zh/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh/zero-knowledge-proofs/index.md @@ -16,7 +16,7 @@ lang: zh ## 我们为什么需要零知识证明? {#why-zero-knowledge-proofs-are-important} -零知识证明是一项应用密码学的突破,它提高了个人信息的安全性。 想一想你如何向另一方(例如,一个服务提供商)证明一项声明(例如,“我是 X 国的公民”)。 你需要提供“证据”来支持你的声明,例如国家护照或驾驶证。 +零知识证明是一项应用密码学的突破,它提高了个人信息的安全性。 想一想你如何向另一方(例如,一个服务提供商)证明一项声明(例如,“我是X国的公民”)。 你需要提供“证据”来支持你的声明,例如国家护照或驾驶证。 但这种方法存在问题,主要是缺乏隐私。 与第三方服务商共享的个人身份信息 (PII) 储存在中心化数据库,这些数据库很容易受到黑客攻击。 随着身份信息窃取成为一个越来越严峻的问题,人们呼吁采用更能保护隐私的方式来分享敏感信息。 @@ -46,7 +46,7 @@ lang: zh 以上描述了“交互式零知识证明”的结构。 早期的零知识协议使用交互式证明,验证一个声明的有效性需要证明者和验证者之间来回多次沟通。 -一个比较好的展示交互式证明是如何运转的例子是 Jean-Jacques Quisquater 非常有名的[阿里巴巴山洞故事](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave)。 在故事里,Peggy(证明者)想要向 Victor(验证者)证明她知道打开魔法之门的暗号,但她又没有透露暗号是什么。 +一个比较好的展示交互式证明是如何运转的例子是 Jean-Jacques Quisquater 非常有名的[阿里巴巴山洞故事](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave)。 在故事里,Peggy(证明者)想要向Victor(验证者)证明她知道打开魔法之门的暗号,但她又没有透露暗号是什么。 ### 非交互式零知识证明 {#non-interactive-zero-knowledge-proofs} @@ -64,7 +64,7 @@ lang: zh #### 零知识简洁非交互式知识论证 (ZK-SNARK) {#zk-snarks} -ZK-SNARK 是**零知识简洁非交互式知识论证**的缩写。 ZK-SNARK 协议具有以下特点: +零知识简洁非交互式知识论证是**零知识简洁非交互式知识论证**的缩写。 零知识简洁非交互式知识论证协议具有以下特点: - **零知识**:验证者可以验证声明的完整性,而不需要知道关于该声明的任何其他信息。 验证者对声明的唯一了解就是它是真还是假。 @@ -78,19 +78,19 @@ ZK-SNARK 是**零知识简洁非交互式知识论证**的缩写。 ZK-SNARK 协 前面提到的“共享密钥”是指证明者和验证者同意在生成和验证证明时使用的公共参数。 生成公共参数(统称为通用参考编码 (CRS))是一个敏感的操作,因为它在协议安全性方面非常重要。 如果用于生成通用参考编码的熵(随机数)落入到不诚实的证明者手上,他们就能计算虚假证明。 -[多方计算 (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) 是一种在生成公共参数时降低风险的方法。 多个参与方参与到[信任设置仪式](https://zkproof.org/2021/06/30/setup-ceremonies/amp/),每个人提供一些随机数值来生成通用参考编码。 只要有一个诚实的参与方销毁了他们那部分的熵,ZK-SNARK 协议就能保持计算的可靠性。 +[多方计算 (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) 是一种在生成公共参数时降低风险的方法。 多个参与方参与到[信任设置仪式](https://zkproof.org/2021/06/30/setup-ceremonies/amp/),每个人提供一些随机数值来生成通用参考编码。 只要有一个诚实的参与方销毁了他们那部分的熵,零知识简洁非交互式知识论证协议就能保持计算的可靠性。 信任设置要求用户信任参数生成的参与者。 然而,ZK-STARK 的发展使其能在非信任的设置下证明协议。 #### 零知识可扩容透明知识论证 (ZK-STARK) {#zk-starks} -ZK-STARK 是**零知识可扩容透明知识论证**的缩写。 ZK-STARK 类似于 ZK-SNARK,除了它是: +ZK-STARK 是**零知识可扩容透明知识论证**的缩写。 ZK-STARK 类似于ZK-SNARK,除了它是: -- **可扩容**:当证人的规模比较大时,ZK-STARK 生成和验证证明比 ZK-SNARK 要快。 随着证人规模的增加,STARK 证明的证明和验证时间只会略微增加(SNARK 证明和验证时间与证人规模呈线性增长)。 +- **可扩容**:当证人的规模比较大时,ZK-STARK 生成和验证证明比零知识简洁非交互式知识论证要快。 随着证人规模的增加,简洁的非交互式知识论证证明的证明和验证时间只会略微增加(简洁的非交互式知识论证证明和验证时间与证人规模呈线性增长)。 -- **透明**:ZK-STARK 依赖于可公开验证的随机数来生成用于证明和验证的公共参数,而不是信任设置。 因此,它比 ZK-SNARK 更加透明。 +- **透明**:ZK-STARK 依赖于可公开验证的随机数来生成用于证明和验证的公共参数,而不是信任设置。 因此,它比零知识简洁非交互式知识论证更加透明。 -ZK-STARK 会产生比 ZK-SNARK 更大的证明,这意味着它通常具有更高的验证开销。 然而,在有些情况下(如证明大型数据集),ZK-STARK 可能比 ZK-SNARK 更具成本效益。 +ZK-STARK 会产生比零知识简洁非交互式知识论证更大的证明,这意味着它通常具有更高的验证开销。 然而,在有些情况下(如证明大型数据集),ZK-STARK 可能比零知识简洁非交互式知识论证更具成本效益。 ## 零知识证明的应用场景 {#use-cases-for-zero-knowledge-proofs} @@ -154,13 +154,13 @@ ZK-STARK 会产生比 ZK-SNARK 更大的证明,这意味着它通常具有更 使用链上投票使得二次融资容易受到串通的影响:区块链交易是公开的,所以行贿者可以检查受贿者的链上活动,看他们是如何“投票”的。 这种方式使得二次融资不再是一个根据社区的集体偏好来分配资金的有效手段。 -幸运的是,更新的解决方案,例如 MACI(最低限度的反串通基础设施),正在使用零知识证明来让链上投票(例如二次融资机制)能够抵制贿赂和串通。 MACI 是一个智能合约和脚本的集合,它允许中央管理员(称为“协调员”)汇总票数和统计结果,*无需*暴露每个人是如何投票的。 即便如此,仍然可以验证投票是否被正确计数,或确认某个人参加了该轮的投票。 +幸运的是,更新的解决方案,例如 MACI(最低限度的反串通基础设施),正在使用零知识证明来让链上投票(例如二次融资机制)能够抵制贿赂和串通。 MACI 是一个智能合约和脚本的集合,它允许中央管理员(称为“协调员”)汇总票数和统计结果,_无需_暴露每个人是如何投票的。 即便如此,仍然可以验证投票是否被正确计数,或确认某个人参加了该轮的投票。 #### MACI 是如何与零知识证明协作的? {#how-maci-works-with-zk-proofs} 一开始,协调员在以太坊部署 MACI 合约,之后用户就可以注册投票(通过把它们的公钥注册到智能合约上)。 用户通过发送经公钥加密后的信息给智能合约来完成投票(一个有效投票必须使用与用户身份关联的最新公钥来签名,另外还有其他标准)。 然后,协调员在投票期结束后处理所有的信息,统计票数,在链上验证结果。 -在 MACI 中,零知识证明用来确保计算的正确性,避免协调员错误地处理投票和汇总结果。 这是通过要求协调员生成 ZK-SNARK 证明来实现的,验证 a) 所有的信息都被正确处理 b) 最后的结果与所有*有效*投票总和对应。 +在 MACI 中,零知识证明用来确保计算的正确性,避免协调员错误地处理投票和汇总结果。 这是通过要求协调员生成零知识简洁非交互式知识论证证明来实现的,验证 a) 所有的信息都被正确处理 b) 最后的结果与所有_有效_投票总和对应。 因此,即便没有分享每个用户的投票明细(通常是这样的),MACI 也能保证计算过程中计算结果的完整性。 这一特点有助于减少基本的串通方案的有效性。 通过之前 Bob 贿赂 Alice 来给某个选项投票的例子,我们可以探索这种可能性: @@ -172,11 +172,11 @@ ZK-STARK 会产生比 ZK-SNARK 更大的证明,这意味着它通常具有更 - Alice 向 Bob 展示交易,显示她已经投票给了`选项 B`(投票是无效的,因为最初的那个公钥在系统中已经不再跟 Alice 的身份关联)。 - 在处理消息时,协调员跳过 Alice 投给`选项 B` 的选票,只把`选项 A` 的投票纳入计数。 因此,Bob 串通 Alice 和操纵链上投票的意图失败了。 -使用最低限度的反串通基础设施时,*确实*需要相信协调员不会与行贿者串通或者试图自己来贿赂投票者。 协调员可以解密用户消息(创建证明的时候需要),以确保它们可以准确验证每个人是如何投票的。 +使用最低限度的反串通基础设施时,_确实_需要相信协调员不会与行贿者串通或者试图自己来贿赂投票者。 协调员可以解密用户消息(创建证明的时候需要),以确保它们可以准确验证每个人是如何投票的。 在协调员保持诚实的情况下,MACI 代表了一个强大的工具,保证了链上投票的神圣性。 这解释了它为何在二次融资应用中如此受欢迎(例如 [clr.fund](https://clr.fund/#/about/maci)),二次融资严重依赖于每个人投票选择的完整性。 -[了解更多关于 MACI 的知识](https://github.com/privacy-scaling-explorations/maci/blob/master/specs/01_introduction.md)。 +[了解更多关于最小反串谋基础设施的信息](https://privacy-scaling-explorations.github.io/maci/)。 ## 使用零知识证明的缺点 {#drawbacks-of-using-zero-knowledge-proofs} @@ -186,17 +186,17 @@ ZK-STARK 会产生比 ZK-SNARK 更大的证明,这意味着它通常具有更 ### 证明验证费用 {#proof-verification-costs} -验证证明也需要复杂的计算,这增加了在应用程序中应用零知识技术的成本。 这种成本在证明计算方面尤其突出。 例如,零知识卷叠在以太坊上需要支付约 500,000 燃料来验证一个 ZK-SNARK 证明,验证 ZK-STARK 则需要更高的费用。 +验证证明也需要复杂的计算,这增加了在应用程序中应用零知识技术的成本。 这种成本在证明计算方面尤其突出。 例如,零知识卷叠在以太坊上需要支付约 500,000 燃料来验证一个零知识简洁非交互式知识论证证明,验证 ZK-STARK 则需要更高的费用。 ### 信任假设 {#trust-assumptions} -在 ZK-SNARK 中,通用参考编码(公共参数)只生成一次,然后可供零知识协议的参与方重复使用。 公共参数由信任设置仪式创建,其参与方被假定是诚实的。 +在零知识简洁非交互式知识论证中,通用参考编码(公共参数)只生成一次,然后可供零知识协议的参与方重复使用。 公共参数由信任设置仪式创建,其参与方被假定是诚实的。 -但是并没有什么方法能让用户去评估参与者是否诚实,用户必须相信开发者的话。 ZK-STARK 无需信任假设,因为生成字符串所使用的随机数是可公开验证的。 与此同时,研究者正在研究让 ZK-SNARK 的无信任设置来增加证明机制的安全性。 +但是并没有什么方法能让用户去评估参与者是否诚实,用户必须相信开发者的话。 ZK-STARK 去信任假设,因为生成字符串所使用的随机数是可公开验证的。 与此同时,研究者正在研究让零知识简洁非交互式知识论证的无信任设置来增加证明机制的安全性。 ### 量子计算的威胁 {#quantum-computing-threats} -ZK-SNARK 使用椭圆曲线加密法 ([ECDSA](/glossary/#ecdsa)) 进行加密。 尽管椭圆曲线加密法算法目前是安全的,但未来量子计算机的发展可能会打破它的安全模型。 +零知识简洁非交互式知识论证使用椭圆曲线加密法 ([ECDSA](/glossary/#ecdsa)) 进行加密。 尽管椭圆曲线加密法算法目前是安全的,但未来量子计算机的发展可能会打破它的安全模型。 ZK-STARK 由于使用抗碰撞的哈希值进行加密,被认为不受量子计算的威胁。 与椭圆曲线加密法中使用的公私密钥对不同,抗碰撞哈希算法更难被量子计算破解。 @@ -208,5 +208,5 @@ ZK-STARK 由于使用抗碰撞的哈希值进行加密,被认为不受量子 - [零知识证明:改善区块链上的隐私](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARK — 一个现实的零知识例子和深入研究](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARK — 创建可验证的信任,即使面对量子计算机](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [关于如何让 zk-SNARK 成为可能的大致介绍](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [关于如何让 zk-SNARK 成为可能的大致介绍](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [什么是零知识证明以及它在区块链中的角色](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/content/zero-knowledge-proofs/index.md b/public/content/zero-knowledge-proofs/index.md index 094f0f5610d..a045a3a2ef1 100644 --- a/public/content/zero-knowledge-proofs/index.md +++ b/public/content/zero-knowledge-proofs/index.md @@ -208,5 +208,5 @@ ZK-STARK is considered immune to the threat of quantum computing, as it uses col - [A Zero-Knowledge Proof: Improving Privacy on a Blockchain](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [zk-SNARKs — A Realistic Zero-Knowledge Example and Deep Dive](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [ZK-STARKs — Create Verifiable Trust, even against Quantum Computers](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [An approximate introduction to how zk-SNARKs are possible](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [An approximate introduction to how zk-SNARKs are possible](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [What is Zero-Knowledge Proof and Its Role in Blockchain?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/) — _LeewayHertz_ diff --git a/public/dev-tools/scaffold-eth.png b/public/dev-tools/scaffold-eth.png deleted file mode 100644 index dce1e56b73450a878860136be05221e9b2b2b3ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4906 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 diff --git a/public/dev-tools/scaffoldeth.png b/public/dev-tools/scaffoldeth.png index 03453c47365a2c22e69a4480f28feae8eda73a5c..92f0f0414f5cb89cff3918ed8667cd81bace4016 100644 GIT binary patch delta 1902 zcmV-!2a))Q5AqI>8Gi-<003~}l~e!#010qNS#tmY3ljhU3ljkVnw%H_0004VQb$4n zuFf3k00004XF*Lt006O%3;baP000LENklDPHROA+mMK*7K-*4D;p(Pi8gm4g4!4xZGVIfs3-_tP!R-izj^ku z$!4>A*}a>0ckX6>@Fwx@l8pP@y#Ho)vIV^{rmU`PLfPcXzbmktWo3)XmXtkJ)>`>m zlxby6Wxlga)0M_Japo8Dh)#hYLhjPLfxQ2+GbTG;2AhjTdau~bwdYg zlT|6i$ci8}ILc<0AGTmEvvQQrznmdeI80%hf@H239pX$CiW zoWYPY#-Q%QP$E&mY)? z5rR}I6DG*_7Y^~QuL2SbaK{zWeU%m{-TBYtV1Sg1L7$L~g(o&|^{rK?%!_Gj> zkni8WW7rW7>dcxZC%boNHhVr~=gyr$0#F96RtrTT+UIXH8h)>Q`0&B^Ja5&$e*Nl~ zg-Xc_S$`K1by=)0%6doZW_EUVU5zA#s35gkEf8fG;QynDT1m8*_3qufOoEJzj9}~5 zts5Ty`0?Yq*2(tm+p%lcu63^|vbD0jyo>_}4g{a25DV&T2yWZ94PU-|+4Qx1-JU&r zkQIu+jEk+6zkmOtNG@Kyh-=rbK?<=M^6c3&?0?(0FVkz&1WB49oJo9#7A-`SQ>RYh z?c2AIKqQ86c4QSJ55Io>!nbeVN)?05%*;Rv5kc6wm7r`PLby&tlR$e6;mmmO;6bkM z*}s23E?l^PUSKSF^5h9VefoqVk?;V-h!sQDD$Qnd!{hN75`{wCx^)Zp@82J)mWpvJ zhJRV0P+ZF8=V4V`12J$LRLio~s{M_@r4Z-%nND^+tO;RIQM zLd?z0B|b;jRTNH;6&4m2QlDdRKY#u_ihsZff=(dcY+ax3tcU<_y&!Z|(LkOC#gOds zhFC8M#mKtMTtsbRwIFm;bXR$hu1y9?5Zx{IZh<@v>Dt8F8Is3U#bIr7@Zdp6V5K14 zYL2W(1$Zk3$&yuVhE#20ogfV2c>{SG619m{g2bDL{X#Kxw^ghXq@O^Z#>tZ>wSU$o z)(9fGH&8g6B7eN0GcCTndi4rNj~)$#h;FiAm45HuJ&}zUe%V&7 zRugZujNkNm_5HaySA9zA*#e81}aN?Z^4 zWm}Pg(9}A}>hDMsCT_g=YDTP%MYT;tu7#CBohfjbWih63ry_UXC#|b9Mt{)7J%9du zwIXMh#h4<2wd*0wvM5XlcPlDa7KlTUSV*$I;H`NK{L!0*Bo9#=nA;IXM@O}1Gz{Vt zAxhW{PRqI&+$FcO8ZkpQYxwa-&%Jy1;?SW(&`H#F#o>*paU@+;h!KKJO--df$Cp?Yn$g*ic+EqpI%QTh2q#pS4`Sa%u zk1^$Bt)P1xtUcntJ4|s^U@!8Tz%R>cwVL0JcDtSUI8PXo7!M1^BtecGIa1_xfnSDo zn;9X$fB#N>PSp**iYZ#h6fGD-L1t!V3cW7kw?#)YDEj}2iHTt4E`LjKX70~m-VL_X zA3l5-q^U`V!tk*?hs7|+vk>GNE$`pI5023&`nKy*XMr?ydwFLPT^DCaQZK6jllj5C z2&O>ymS^mAU3c!>DMJi7LFj)?f>~5a7r1;uOmJ06u&Zp?#g`YvBv%zjs)o^N|ELdh z&CHEM+)->4bm2CpbN~nJVOR*gL%mCr*HX!wgH26VrN8{gqtan))o2bLhmVV4br>xLU9j<`PV@+k#$iWu$Mg<+kY5$=Upv+t* oERH2~`hx79zd^^<=U#OAADNN-`tOsNd;kCd07*qoM6N<$f@Hac+yDRo literal 1928 zcmZ`(do+|=8-LxWd``xt;d6V3=;rboAyOY>3?{~1t{q{Flrc08hRhuI$#f8*FS(T{ z%;bdJ#wZdYPK2o=Mrz?xsu73Cd7akzR^;~|>vwzQT?Y-Ato8?Nhm)rgC-2ec{ zIXd9n;T*c-2njgaTam)xBuTb$wgG^K9NEn?Qg981IJi3l09_9Nm}vm80k@d*01yiS zz+w;pSQY~Sidxd8On9~fG=a;3mhQocX+CH&(EnRIcw|Qwy`uw*gwmK{v}9Q7JNdg{ z8;Hq_56?^rU&#YM<$|I-a5-nkVEi4x@$=vKBTV=UfA0iQnc-AsEz@b5ZSXY90v0FH z7^GMx`2rjnVX)DD4!OW2$L=(DPN!#1!MXT4``oX&H_+AZOY}ME8Cc)UADWmhH#pvZ zr?FYbG~3LMyWhOk&g&sDu*=p17GcsOSxIDgKQrvZ+uPeB2~jG1Yebqm(E|Xjr-S5| z%NYFf+bB6En`BB5x3@v_{HIqtpg{VQ+%&28X5OrD}vgW&j{2V4X zS01!pjwXRZWlY-5 z5w(|;>sYjUI#aauABjZ5;r~rG{Bq)>)u2{ku>aSArB0J$_whAj`f9P1y=WqLx*^N9 zrnU4%RWH+_oA>Okj>5=WDI{OwK zk!iEmZKHSDc03gU3(Ja{y7c3VPMr(ze#kXl+dLa@?#1C|R7BfoFzdBr4e@S2Q6xZ#sq%_wHnK!>a zlRCAMJbo8ZR_3dI5S3ARAlhF!FOlAni|9QtW1eVm3DJ@w3DDyZy|RZY@xObGnpzvH z7}aDIt0iU|+3(ZtO`nxgMp8e$$l+wajVr0V*vNA5a~cfCBle%o2zT43I=ZK6L1I=) z>Dpa%KKOr!CIS_xbady@CUmR8pz7!*^Q|2rC04J6l!gJn&%O4jyv&{Wg_@>{+mUgrqcLJDdq7#gRa`r zzT$$CK*1G6Ny3`&=94hivgXAf#Zk|e*xoUkv+v@t`5Fb?RT^7sGL(a-O>vR|N1u}l zdZ_%GMGiW6AbM_D06 z+<*>2Z_hrc>%+t!w}_9}n~?Mo+A~q5?yk@n%~|9qvK@7bw5w9b2ZUbsxQA8fs?@@$ z#nM12!F{U$4}V*NM1AHAS-RIxjhy?O1fz01F@Fa0GGoC^$uXw}-|D0l`Fu<);{6%d z#(q7F2(O)~tk5BoJ!9{lf#*~@u&3U|JF|y2epngoqDgvvk<+4w1zDwF_BJG57VaJl zS2xY5RTxpBhq-ETmQIf-2N=v;HH*>fcw{IPH;cu$6v`is5R#gN7=kPzXh8Fo(*F%aMunaYOZex3HrtRIcmQy;BjPyNpp-uWn|E5s diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 359606dc4c2..5d74cae881f 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -27,7 +27,19 @@ import "@docsearch/css" export const SearchIconButton = forwardRef( (props, ref) => ( - ) diff --git a/src/components/UpcomingEventsList.tsx b/src/components/UpcomingEventsList.tsx index 1ce916bc2f6..4eae5079e20 100644 --- a/src/components/UpcomingEventsList.tsx +++ b/src/components/UpcomingEventsList.tsx @@ -1,39 +1,30 @@ import { useEffect, useState } from "react" +import { useTranslation } from "next-i18next" import { Box } from "@chakra-ui/react" -import Translation from "@/components/Translation" +import type { CommunityConference } from "@/lib/types" + +import { Button } from "@/components/Buttons" +import EventCard from "@/components/EventCard" +import InfoBanner from "@/components/InfoBanner" +import InlineLink from "@/components/Link" import { trackCustomEvent } from "@/lib/utils/matomo" -import events from "../data/community-events.json" - -import { Button } from "./Buttons" -import EventCard from "./EventCard" -import InfoBanner from "./InfoBanner" -import InlineLink from "./Link" - -interface ICommunityEventData { - title: string - to: string - sponsor: string | null - location: string - description: string - startDate: string - endDate: string -} +import communityConferences from "@/data/community-events" -interface IOrderedUpcomingEventType extends ICommunityEventData { +type OrderedUpcomingEvent = CommunityConference & { date: string formattedDetails: string } -const UpcomingEventsList: React.FC = () => { +const UpcomingEventsList = () => { + const { t } = useTranslation("page-community") const eventsPerLoad = 10 const [orderedUpcomingEvents, setOrderedUpcomingEvents] = useState< - Array + OrderedUpcomingEvent[] >([]) const [maxRange, setMaxRange] = useState(eventsPerLoad) - const [isVisible, setIsVisible] = useState(true) // Create Date object from each YYYY-MM-DD JSON date string const dateParse = (dateString: string): Date => { @@ -46,7 +37,7 @@ const UpcomingEventsList: React.FC = () => { } useEffect(() => { - const eventsList: Array = [...events] + const eventsList: CommunityConference[] = [...communityConferences] const yesterday = new Date() yesterday.setDate(yesterday.getDate() - 1) @@ -70,9 +61,7 @@ const UpcomingEventsList: React.FC = () => { event.endDate ).toLocaleDateString()}` - const details = `${event.sponsor ? "(" + event.sponsor + ")" : ""} ${ - event.description - }` + const details = `${event.description}` return { ...event, @@ -86,7 +75,6 @@ const UpcomingEventsList: React.FC = () => { const loadMoreEvents = () => { setMaxRange((counter) => counter + eventsPerLoad) - setIsVisible(maxRange + eventsPerLoad <= orderedUpcomingEvents.length) trackCustomEvent({ eventCategory: "more events button", eventAction: "click", @@ -97,9 +85,9 @@ const UpcomingEventsList: React.FC = () => { if (orderedUpcomingEvents.length === 0) { return ( - {" "} + {t("page-community-upcoming-events-no-events")}{" "} - + {t("page-community-please-add-to-page")} ) @@ -151,9 +139,9 @@ const UpcomingEventsList: React.FC = () => { maxWidth="620px" marginTop="5" > - {isVisible && ( + {maxRange <= orderedUpcomingEvents.length && ( )} diff --git a/src/data/community-events.json b/src/data/community-events.json deleted file mode 100644 index f9183a5cdac..00000000000 --- a/src/data/community-events.json +++ /dev/null @@ -1,209 +0,0 @@ -[ - { - "title": "ETHDam", - "to": "https://www.ethdam.com/", - "sponsor": null, - "location": "Amsterdam, Netherlands", - "description": "Conference and hackathon gathering the best Privacy and Security builders", - "startDate": "2024-04-12", - "endDate": "2024-04-14" - }, - { - "title": "ETH Abu Dhabi", - "to": "https://www.ethabudhabi.org/", - "sponsor": null, - "location": "Abu Dhabi, UAE", - "description": "The Ethereum dev conference and hackathon in Abu Dhabi on everything DeFi, privacy, EVM scaling, layers 2, Account Abstraction and more with a focus on decentralization and community projects. We also organize a Demo Pitch Day with VCs.", - "startDate": "2023-11-27", - "endDate": "2023-11-29" - }, - { - "title": "Road to Devcon(Shenzhen)", - "to": "https://ethsz.openbuild.xyz/", - "sponsor": null, - "location": "Shenzhen, China", - "description": "Preheating activities for DEVCON 7 in the China region.Developers and communities, let us gather at Devcon!", - "startDate": "2023-10-21", - "endDate": "2023-10-21" - }, - { - "title": "ETHDubai", - "to": "https://www.ethdubaiconf.org/", - "sponsor": null, - "location": "Dubai, UAE", - "description": "The Ethereum dev conference and hackathon in Dubai on everything DeFi, privacy, EVM scaling, layers 2, Account Abstraction and more with a focus on decentralization and community projects. We also organize a Demo Pitch Day with VCs.", - "startDate": "2024-04-19", - "endDate": "2024-04-21" - }, - { - "title": "Ethereum Rio", - "to": "https://www.ethereumbrasil.com/", - "sponsor": null, - "location": "Rio de Janeiro, Brazil", - "description": "3rd Edition of LATAM's most loved ETH event. Bootcamp, Buildathon & Conference", - "startDate": "2024-03-19", - "endDate": "2024-03-24" - }, - { - "title": "DappConn", - "to": "https://www.dappcon.io/", - "sponsor": null, - "location": "Berlin, Germany", - "description": "A 3-day Developer Conference for Ethereum Infrastructure and dApps that would bring together over 900 builders together, hosted by Gnosis since 2018.", - "startDate": "2024-05-21", - "endDate": "2024-05-23" - }, - { - "title": "ETHKL 2023", - "to": "https://hack.ethkl.org/", - "sponsor": null, - "location": "Kuala Lumpur, Malaysia", - "description": "Ethereum Kuala Lumpur 2023 is a Conference & Hackathon aimed at the objective of promoting the understanding and adoption of Ethereum smart contracts and related technologies.", - "startDate": "2023-10-13", - "endDate": "2023-10-15" - }, - { - "title": "ETHVietnam", - "to": "https://www.eth-vietnam.com/", - "sponsor": null, - "location": "Hanoi, Vietnam", - "description": "ETH Community in SEA to #Build, #Learn and #Share together.", - "startDate": "2024-03-16", - "endDate": "2024-03-17" - }, - { - "title": "AB-Summit", - "to": "https://blockchainsummit.africa", - "sponsor": null, - "location": "University Of Ghana - Legon. Accra, Ghana", - "description": "Building Blockchains for Africa's Future. We support the Blockchain revolution and we are establishing a movement to promote its use out of love for our African Continent and the nations that make it up.", - "startDate": "2023-10-27", - "endDate": "2023-10-28" - }, - { - "title": "ETHVenice", - "to": "https://ethvenice.com/", - "sponsor": null, - "location": "Venice, Italy", - "description": "The event takes place in one of the most beautiful and historic cities in the world, Venice! A conference and hackathon open to all people who want to expand their knowledge, learn about this amazing world or get involved. We are waiting for you in many, let's connect.", - "startDate": "2023-10-20", - "endDate": "2023-10-22" - }, - { - "title": "ETHOnline", - "to": "https://ethglobal.com/events/ethonline2023", - "sponsor": null, - "location": "Remote", - "description": "ETHGlobal's biggest global online event will happen again this October with hundreds of projects and weekly summits!", - "startDate": "2023-10-06", - "endDate": "2023-10-27" - }, - { - "title": "ETHGlobal Istanbul", - "to": "https://ethglobal.com/events/istanbul", - "sponsor": null, - "location": "Istanbul, Turkey", - "description": "ETHGlobal Istanbul is going to be an event full of hacking, networking, side events and fun activities.", - "startDate": "2023-11-17", - "endDate": "2023-11-19" - }, - { - "title": "ETH Hong Kong", - "to": "https://www.ethhongkong.co/", - "sponsor": null, - "location": "Hong Kong", - "description": "ETH Hong Kong will be held in Q4 2023. It is the first-ever large-scale ETH Hong Kong event, which will be developer driven and full of hacking, panel discussions, boot camps and other fun activities.", - "startDate": "2023-10-22", - "endDate": "2023-10-24" - }, - { - "title": "ETH Miami 2023", - "to": "https://ethmiami.net/", - "sponsor": null, - "location": "Miami", - "description": "Join ETH Miami’s 2nd Annual Web3 Hackathon”.", - "startDate": "2023-10-27", - "endDate": "2023-10-29" - }, - { - "title": "ETHLisbon 2023", - "to": "https://www.ethlisbon.org/", - "sponsor": null, - "location": "Gale patio, Lisbon, Portugal", - "description": "ETHLisbon is an Ethereum-focused hackathon bringing together the best Web 3.0 builders to the crypto capital of Europe.", - "startDate": "2023-11-03", - "endDate": "2023-11-05" - }, - { - "title": "ETH LONDON Hackathon 2023", - "to": "https://www.encode.club/eth-london", - "sponsor": null, - "location": "London, UK", - "description": "Join us for the ETH London Hackathon, 27th-29th October 2023, an exciting and innovative event focusing on Ethereum technology. Network with industry leaders, showcase your skills, and innovate in the thriving Ethereum space.", - "startDate": "2023-10-27", - "endDate": "2023-10-29" - }, - { - "title": "Devconnect Istanbul", - "to": "https://devconnect.org", - "sponsor": null, - "location": "Istanbul, Turkey", - "description": "Devconnect is a week-long gathering of independent Ethereum events. There is no \"main\" event. Instead, different teams host events, each with a unique focus, ranging from beginner-friendly to expert level. Throughout the week, there will also be an official Devconnect coworking space. It aims to bring together Ethereum's builders, researchers, and community in one place.", - "startDate": "2023-11-13", - "endDate": "2023-11-19" - }, - { - "title": "Ethereum Costa Rica Day", - "to": "http://ethereum.cr", - "sponsor": null, - "location": "Costa Rica", - "description": "Full day of learning about Ethereum, onboarding new users and builders.", - "startDate": "2023-11-18", - "endDate": "2023-11-18" - }, - { - "title": "ETH Riyadh", - "to": "https://ethriyadh.com/", - "sponsor": null, - "location": "Riyadh, Saudi Arabia", - "description": "ETH Riyadh unites developers and builders from Saudi Arabia and the other Middle East regions, nurturing their roles and connections in the Ethereum ecosystem.", - "startDate": "2023-09-20", - "endDate": "2023-10-15" - }, - { - "title": "A General Forum on Ethereum Localism", - "to": "https://pdxdao.xyz/localism/", - "sponsor": null, - "location": "Portland, OR, USA", - "description": "Three days and thoughtful side events will create a container where the Ethereum community can elaborate for itself, in a plurality of directions, what an experimentalism of the city can mean and look like for web3.", - "startDate": "2023-10-13", - "endDate": "2023-10-15" - }, - { - "title": "Pragma Istanbul", - "to": "https://ethglobal.com/events/pragma-istanbul", - "sponsor": null, - "location": "Istanbul, Turkey", - "description": "Pragma Istanbul is an in-person summit for builders and leaders in the web3 ecosystem", - "startDate": "2023-11-16", - "endDate": "2023-11-16" - }, - { - "title": "ETHIndia 2023", - "to": "https://ethindia.co/", - "sponsor": null, - "location": "Bengaluru, India", - "description": "ETHIndia is a hackathon — a movement with the goal of inspiring and fostering a community of builders promoting technological advancements for Ethereum.", - "startDate": "2023-12-8", - "endDate": "2023-12-10" - }, - { - "title": "Devcon 7 - Southeast Asia", - "to": "https://devcon.org/", - "sponsor": null, - "location": "Bangkok, Thailand", - "description": "Discover Ethereum and its community at Devcon, the conference for developers, thinkers, and makers and a place for learning, knowledge sharing, and fun.", - "startDate": "2024-11-12", - "endDate": "2024-11-15" - } -] diff --git a/src/data/community-events.ts b/src/data/community-events.ts new file mode 100644 index 00000000000..acabac367a2 --- /dev/null +++ b/src/data/community-events.ts @@ -0,0 +1,395 @@ +import { CommunityConference } from "@/lib/types" + +const communityConferences: CommunityConference[] = [ + { + title: "ETH Cinco de Mayo", + startDate: "2024-02-02", + endDate: "2024-02-04", + to: "https://ethcincodemayo.com/", + location: "Cholula, Puebla", + description: + "A perfect combination of competition, workshops, networking, entrepreneurship and culture!", + }, + { + title: "Circuit Breaker", + to: "https://ethglobal.com/events/circuitbreaker", + location: "Remote", + description: "It’s finally the time to do a dedicated event all about Zero Knowledge Proofs. Build, learn, and understand how to write ZK Circuits at Circuit Breaker and play a role in making ZK Tooling better. Join us for the month of Feb to do everything ZK.", + startDate: "2024-2-2", + endDate: "2024-2-21" + }, + { + title: "ETH Lima Day", + startDate: "2024-02-03", + endDate: "2024-02-03", + to: "https://ethlima.org", + location: "Lima, PE", + description: "In Ethereum Lima, we are united by the will to create a community that can take advantage of the opportunities of the technological revolution that comes with blockchain, and particularly with Ethereum.", + }, + { + title: "NFT Paris", + startDate: "2024-02-23", + endDate: "2024-02-24", + to: "https://nftparis.xyz", + location: "Paris, FR", + description: "Where Finance, Gaming, Art, Fashion, Sport , Media converge to celebrate the era of digital assets.", + }, + { + title: "ETHDenver", + startDate: "2024-02-23", + endDate: "2024-03-03", + to: "https://ethdenver.com", + location: "Denver, CO, USA", + description: "ETHDenver celebrates the convergence of blockchain, culture, and education. Located in the heart of Denver, Colorado, ETHDenver is the premiere destination for #BUIDLing the decentralized future..", + }, + { + title: "Pragma Denver", + to: "https://ethglobal.com/events/pragma-denver", + location: "Denver, Colorado", + description: "Our first IRL event of the year will be our One Day Founders Only Pragma conference in Denver just before the big weekend. We’re excited to show you our new format for how we believe amazing content focused web3 summits should be executed!", + startDate: "2024-2-28", + endDate: "2024-2-28" + }, + { + title: "ETH Latam", + startDate: "2024-03-13", + endDate: "2024-03-14", + to: "https://ethlatam.org/#/honduras", + location: "San Pedro Sula, HN", + description: "ETH Latam brings together the global community of creators and educators with the most vibrant crypto communities in the world, who use Ethereum protocols and technology in their daily lives, providing real solutions to real problems.", + }, + { + title: "Pragma London", + to: "https://ethglobal.com/events/pragma-london", + location: "London, United Kingdom", + description: "Pragma is a one-day, single-track, in-person summit hosted by ETHGlobal. With a focus on intimacy, Pragma serves as a hub for high-quality talks and as a forum of discussion for builders and leaders from Ethereum ecosystem and beyond. Join us on Pi Day in London to catchup on all things pushing this ecosystem forward", + startDate: "2024-3-14", + endDate: "2024-3-14" + }, + { + title: "ETHGlobal London", + to: "https://ethglobal.com/events/london2024", + location: "London, United Kingdom", + description: "ETHGlobal London is going to be an event full of hacking, networking, side events and fun activities. We are excited to be back in London for our inaugural event of 2024, marking our first return since 2020.", + startDate: "2024-3-15", + endDate: "2024-3-17" + }, + { + title: "ETH Canal", + startDate: "2024-03-19", + endDate: "2024-03-21", + to: "https://ethcanal.xyz", + location: "Panama City, PA", + description: "Experience three transformative where the Ethereum community gathers in Panama, to discuss blockchain innovation.", + }, + { + title: "ETHVietnam", + startDate: "2024-03-16", + endDate: "2024-03-17", + to: "https://www.eth-vietnam.com/", + location: "Hanoi, Vietnam", + description: "ETH Community in SEA to #Build, #Learn and #Share together.", + }, + { + title: "Ethereum Rio", + startDate: "2024-03-19", + endDate: "2024-03-24", + to: "https://www.ethereumbrasil.com/", + location: "Rio de Janeiro, Brazil", + description: + "3rd Edition of LATAM's most loved ETH event. Bootcamp, Buildathon & Conference", + }, + { + title: "ETHTaipei", + startDate: "2024-03-21", + endDate: "2024-03-24", + to: "https://ethtaipei.org", + location: "Taipei, TW", + description: "ETHTaipei presents an opportunity to learn about cutting-edge technology and applications about Ethereum, as well as to get involved with the local community in Taiwan.", + }, + { + title: "ETHSamba", + to: "https://www.ethsamba.org/", + location: "Rio de Janeiro, Brazil", + description: "Bootcamp & Hackathon for builders in sunny Rio de Janeiro with the usual ETHSamba vibes", + startDate: "2024-03-22", + endDate: "2024-03-24" + }, + { + title: "ETHBucharest", + startDate: "2024-03-27", + endDate: "2024-03-30", + to: "https://ethbucharest.xyz", + location: "Bucharest, ROU", + description: "Eth Bucharest is not just an event; it’s a movement empowering creativity, bold ideas, and meaningful connections in the heart of Eastern Europe.", + }, + { + title: "ETH Seoul", + startDate: "2024-03-29", + endDate: "2024-03-31", + to: "https://ethseoul.org", + location: "Seoul, KR", + description: "ETH Seoul is a 3 day hackathon that takes place from March 29-31 in Neowiz building in Pangyo, South Korea", + }, + { + title: "DEFICON", + startDate: "2024-03-30", + endDate: "2024-03-30", + to: "https://deficon.nyc", + location: "New York, NYC, USA", + description: "DeFiCon is a nonprofit conference with a mission to elevate the ethos of peer-to-peer crypto.", + }, + { + title: "NFT NYC", + startDate: "2024-04-03", + endDate: "2024-04-05", + to: "https://nft.nyc", + location: "NYC, USA", + description: "7th edition of the NFT.NYC", + }, + { + title: "Ethereumzuri.ch 2024", + to: "https://ethereumzuri.ch/", + location: "Zurich, Switzerland", + description: "Switzerland's largest Ethereum research and development-focused community conference and hackathon, with the goal of connecting academics, developers, researchers, and enthusiasts, and creating a space for collaboration and innovation.", + startDate: "2024-04-05", + endDate: "2024-04-07" + }, + { + title: "Scaling Ethereum 2024", + to: "https://ethglobal.com/events/scaling2024", + location: "Remote", + description: "Join us April as we bring back our community favorite — Scaling Ethereum. Strap in for three weeks of hacking and summits devoted to pushing the envelope and building the future L2 infrastructure of our ecosystem.", + startDate: "2024-4-5", + endDate: "2024-4-26" + }, + { + title: "ETHDam", + to: "https://www.ethdam.com/", + location: "Amsterdam, Netherlands", + description: "Conference and hackathon gathering the best Privacy and Security builders", + startDate: "2024-04-12", + endDate: "2024-04-14" + }, + { + title: "Web3FC³", + to: "https://www.web3fc.xyz/", + location: "Barcelona, Spain", + description: "A chain-agnostic conference for the grassroots community. An event by Web3 Family, running in-person meetups and conference in Barcelona.", + "startDate": "2024-04-17", + "endDate": "2024-04-19" + }, + { + title: "TOKEN2049", + startDate: "2024-04-18", + endDate: "2024-04-19", + to: "https://token2049.com", + location: "Dubai, UAE", + description: "TOKEN2049 is organized annually in Dubai and Singapore, where founders and executives in the web3 industry share their view on the industry", + }, + { + title: "ETHTallinn", + startDate: "2024-04-19", + endDate: "2024-04-21", + to: "https://ethtallinn.org/", + location: "Tallinn, EST", + description: "ETHTallinn is an Ethereum community focused on pushing technologies to new limits within the DeFi, NFT, and web3 industry", + }, + { + title: "ETHDubai", + startDate: "2024-04-19", + endDate: "2024-04-21", + to: "https://www.ethdubaiconf.org/", + location: "Dubai, UAE", + description: + "The Ethereum dev conference and hackathon in Dubai on everything DeFi, privacy, EVM scaling, layers 2, Account Abstraction and more with a focus on decentralization and community projects. We also organize a Demo Pitch Day with VCs.", + }, + { + title: "Pragma Sydney", + to: "https://ethglobal.com/events/pragma-sydney", + location: "Sydney, Australia", + description: "Pragma is a one-day, single-track, in-person summit hosted by ETHGlobal. With a focus on intimacy, Pragma serves as a hub for high-quality talks and as a forum of discussion for builders and leaders from Ethereum ecosystem and beyond. Join us at our first event in Oceania and meet incredible founders helping shape this ecosystem.", + startDate: "2024-5-2", + endDate: "2024-5-2" + }, + { + title: "ETHGlobal Sydney", + to: "https://ethglobal.com/events/sydney", + location: "Sydney, Australia", + description: "ETHGlobal Sydney is going to be an event full of hacking, networking, side events and fun activities. This will be our inaugural event on the continent of Oceania-completing the global in ETHGlobal as the sixth and final continent in our world tour.", + startDate: "2024-5-3", + endDate: "2024-5-5" + }, + { + title: "DappConn", + startDate: "2024-05-21", + endDate: "2024-05-23", + to: "https://www.dappcon.io/", + location: "Berlin, Germany", + description: + "A 3-day Developer Conference for Ethereum Infrastructure and dApps that would bring together over 900 builders together, hosted by Gnosis since 2018.", + }, + { + title: "ETHBerlin04", + to: "https://www.ethberlin.org", + location: "Berlin, Germany", + description: "ETHBerlin is a hackathon, a cultural festival, an educational event, a platform for hacktivism, and a community initiative to push the decentralized ecosystem forward.", + startDate: "2024-05-24", + endDate: "2024-05-26" + }, + { + title: "BlockSplit", + startDate: "2024-05-27", + endDate: "2024-05-30", + to: "https://blocksplit.net", + location: "Split, Croatia", + description: "Web3 Conference in the heart of the Mediterranean.", + }, + { + title: "Non Fungible Conference", + startDate: "2024-05-28", + endDate: "2024-05-30", + to: "https://nonfungibleconference.com/", + location: "Lisbon, PRT", + description: "NFC is an experimental Web3 event that brings the global NFT community together", + }, + { + title: "Consensus2024", + startDate: "2024-05-29", + endDate: "2024-05-31", + to: "https://coindesk.com/consensus/", + location: "Austin, TX, USA", + description: "Consensus 2024 is your chance to be a part of important conversation in crypto and Web3.", + }, + { + title: "ETHPrague", + startDate: "2024-05-31", + endDate: "2024-06-02", + to: "https://ethprague.com", + location: "Prague, CZ", + description: "An event focused on the future of Ethereum and potential concepts or applications that don't yet exist", + }, + { + title: "ETHDublin", + startDate: "2024-05-31", + endDate: "2024-06-02", + to: "https://ethdublin.io", + location: "Dublin, IRL", + description: "ETHDublin brings together like-minded investors, builders and designers from all over the world to solve industry problems, harnessing the power of Web3", + }, + { + title: "ETH Belgrade", + to: "https://ethbelgrade.rs/", + location: "Belgrade, Serbia", + description: "ETH Belgrade is a playground for exploring Ethereum possibilities. As part of Belgrade Blockchain Week, this three-day conference gathers extraordinary minds and Ethereum enthusiasts to share knowledge and spark ideas that will ignite the whole ecosystem.", + startDate: "2024-06-03", + endDate: "2024-06-05" + }, + { + title: "Belgrade Blockchain Week", + startDate: "2024-06-01", + endDate: "2024-06-09", + to: "https://belgradeblockchainweek.com/", + location: "Belgrade, SRB", + description: "Belgrade Blockchain Week is a week-long in-person gathering of the greatest Web3 minds and professionals. It features independent events organized by top-tier companies and communities throughout the week.", + }, + { + title: "ETHKyiv", + startDate: "2024-06-01", + endDate: "2024-06-01", + to: "https://ethkyiv.org", + location: "Kyiv, UKR", + description: "Through Hackathon, Conference, side events, discussions, collaborations, and vast networking, we aim to further establish Kyiv as an innovation and infrastructure development leader", + }, + { + title: "Pragma Brussels", + to: "https://ethglobal.com/events/pragma-brussels", + location: "Brussels, Belgium", + description: "Pragma is a one-day, single-track, in-person summit hosted by ETHGlobal. With a focus on intimacy, Pragma serves as a hub for high-quality talks and as a forum of discussion for builders and leaders from Ethereum ecosystem and beyond.", + startDate: "2024-7-11", + endDate: "2024-7-11" + }, + { + title: "ETHGlobal Brussels", + to: "https://ethglobal.com/events/brussels", + location: "Brussels, Belgium", + description: "ETHGlobal Brussels is going to be an event full of hacking, networking, side events and fun activities. This marks our first event in Belgium and our 3rd hackathon alongside EthCC.", + startDate: "2024-7-12", + endDate: "2024-7-14" + }, + { + title: "EDCON", + startDate: "2024-07-26", + endDate: "2024-07-30", + to: "https://edcon.io/", + location: "Tokyo, JPN", + description: "EDCON is committed to serving the Ethereum ecosystem by boosting communication and engagement between Ethereum communities worldwide", + }, + { + title: "ETHOnline 2024", + to: "https://ethglobal.com/events/ethonline2024", + location: "Remote", + description: "Our community favorite and flagship event is back once again. Join thousands of developers and creatives online next August for ETHOnline 2024!", + startDate: "2024-8-23", + endDate: "2024-9-13" + }, + { + title: "Web3 Lagos Conference", + startDate: "2024-09-05", + endDate: "2024-09-07", + to: "https://event.web3bridge.com/", + location: "Lagos, NGA", + description: "This conference will bring together Web3 enthusiasts from all over Nigeria and beyond. Here, community meets technology for three days of intensive Networking and Learning experiences.", + }, + { + title: "TOKEN2049", + startDate: "2024-09-18", + endDate: "2024-09-19", + to: "https://token2049.com", + location: "Singapore, SG", + description: "TOKEN2049 is organized annually in Dubai and Singapore, where founders and executives in the web3 industry share their view on the industry", + }, + { + title: "ETHGlobal Singapore", + to: "https://ethglobal.com/events/singapore2024", + location: "Singapore, Singapore", + description: "ETHGlobal Singapore is going to be an event full of hacking, networking, side events and fun activities. We cannot wait to at long last return to Singapore. Since our last ETHSingapore in 2018, so much has changed.", + startDate: "2024-9-20", + endDate: "2024-9-22" + }, + { + title: "Pragma San Francisco", + to: "https://ethglobal.com/events/pragma-sanfrancisco", + location: "San Francisco, California", + description: "Pragma is a single-track, in-person summit hosted by ETHGlobal. With a focus on intimacy, Pragma serves as a hub for high-quality talks and as a forum of discussion for builders and leaders from Ethereum ecosystem and beyond. For the first time, we’re excited to introduce a multi-day format to cover an even wider range for all things happening in web3", + startDate: "2024-10-15", + endDate: "2024-10-17" + }, + { + title: "ETHGlobal San Francisco", + to: "https://ethglobal.com/events/sanfrancisco2024", + location: "San Francisco, California", + description: "ETHGlobal Singapore is going to be an event full of hacking, networking, side events and fun activities. In our third iteration of ETHGlobal San Francisco, we're going bigger than ever.", + startDate: "2024-10-18", + endDate: "2024-10-20" + }, + { + title: "Devcon 7 - Southeast Asia", + to: "https://devcon.org/", + location: "Bangkok, Thailand", + description: + "Discover Ethereum and its community at Devcon, the conference for developers, thinkers, and makers and a place for learning, knowledge sharing, and fun.", + startDate: "2024-11-12", + endDate: "2024-11-15", + }, + { + title: "ETHGlobal Devcon 2024", + to: "https://ethglobal.com/events/devcon2024", + location: "TBD", + description: "Whenever Devcon happens, we’ll be running a large hackathon right alongside it. Don’t miss the biggest web3 developer meetup of the year in South East Asia.", + startDate: "TBD", + endDate: "TBD" + }, +] + +export default communityConferences diff --git a/src/data/placeholders/content-developers-docs-accounts-data.json b/src/data/placeholders/content-developers-docs-accounts-data.json index c4113bf0309..f2652d15455 100644 --- a/src/data/placeholders/content-developers-docs-accounts-data.json +++ b/src/data/placeholders/content-developers-docs-accounts-data.json @@ -11,6 +11,14 @@ "hash": "0ae7ea59", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2UlEQVR4nGOYVvGfc2XSJG4Zrv9MrIyNTECaOS76P1tZyX/2qRWvOVujN7BFsq9jbnFpYVmQu4AVJAaSA+G62v+8DJunXuDcOWkJ7+L1/0U2bvgvvnr1f+GuU/9ZNsZEM/9v0OF/3tEud2PKMq2TC24qbFt8TfL/ZBfee+2xbAxA0NH+XwREM67Z+D98+cr/JxYu/n1p1Zr/u5et/28Gknjf0c61du3//OXL/x9ZtPT/8RVr/0/bu+Cx9H9pLkaQfGXFDyGGWbOesG/Z8p9t3tz/PIsX/eDfu/c/187//5n/e7qx/O/I4Fi1/n/K4iX/V86f930d0PB2kAEMUFBV8V+IYfas/+wMWMD/Dg+W//mCrMvX/c9etPjf7kVL/u1dvvr/5B1zHghvbr9itn7yc73UpP/cKAYAAxDkNLDz/sfxM/8vC2Bftfp/xvz5P9bNn/9zw9Ll/3uPzjkqPKntW2RX53/fQF+gXpwu2CrFfK/dmG3Vhv/ZwDDYv3jxv8NAL0zdvWi3SHvx24Dm8t8uwEDkwG0AyAVVQpz/y3TZgd7heJcXwgUKk/8dIkwNVf99Kxv/W0+f+p8TFBV8QCwBxGKY+K9ET9NnyclAenINhA3mT/rPC8JANVIApH4CoEM/ZJsAAAAASUVORK5CYII=" }, + "/content/translations/fr/developers/docs/accounts/accounts.png": { + "hash": "94a2ded9", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB10lEQVR4nGNYVXWD+35xqjAv81pmVsZGJhmu/8xx0f/Zykr+s0+teM053Xc6+3G3VpYWlxaWBbkLWEFiIDkQrqv9z8sAEtg/aw3fluX/RTdu+C++evV/4a5T/1n+d3Yw/W/UEPzcUalyfvY6jW3L7ssfXHxN8v9kF9577bFsDEDQ0f5fBEQzrt38P2zZ8v/H5y/4eWnVmv+7l63/bwaS+FhTzb1+7f98oNzhxUv+H1ux9v+0vQseSzNAQWXFDyGGWbOesG/Z8p9t7tzPPBMnPOPfu/g/187//5n/e7qx/O/I4Fi1/n/K8pX/Vy1a9Hvd2nX/20EG/JfmYgQZUFXxX4hh9qz/7AxYwP8OD5b/+YKsS5b/z16y7P/uRUv+712y8v/ko3MuC+9u322zs+esSVjufy4UA4ABCDIZbPr/OH7m/7PL2Zct+58xf+HvdUC8Yf6i/71HVx8VntL+M2JKzz//QF+gXpwu2CrFfK/dmG3Vuv/Zixb/2z9/0b/DS1f+n7pn/UmR9uK3AZ2V39yBXuDEbQDIBVVCnP/LdNn/Z7hzvMsL4QLR/ztEmGqq/vtWNv63nj4VaAAwKviAWAKIxTDxX4meps+Sk4H05BoIG8yf9J8Xqk8KAErbArlC7+1jAAAAAElFTkSuQmCC" + }, + "/content/translations/hu/developers/docs/accounts/accounts.png": { + "hash": "a050ce79", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVR4nGPoaP/PsapqFXck+zpmGa7/TEDMHBf9n62s5D/71IrXnMvSlnHMt8xmbXFpYVmQu4AVJAaSA+G62v+8DJUVrziftReK7V7ySXzWzL/iq1f/F+469Z9lY0w08/8GHf53HcVqV7tm6x6afVpx2+Jrkt877PnutceyMQAB0HIREM24asP/sOWr/x+fv+j3pVVr/u9etv6/GUjifUc71/p1//OWLPt/eP7if8dWr/s/be+Cm9IMUFBZ8UOIYdasJ+xbtvxnA2KexYv/8+9d/J9r5///zP893Vj+d2RwrFr/P2Xe3O+rZsx6u27Fqv/te1e9hRtQVfFfiGH2rP/sDFjA/w4Plv/5gqzLV/7Pnrfg1+55C37sXbLy/+Sjq68I7+o5YbFlwj1D/6T/3CgGAAOQEeQlsAFx/Mz/Z5ezr1r5P2P23C/rZs/5vGHhkv+9R+ccFZ7Y8i2iv+u/X6AvUC9OF2yVYr7XbswGDJ/s+Yv/7J8z/8dhoGum7ll8QqS19HlgZ+U398y2/xy4DQC5oEqI83+ZLvv/DHeOd3khXP8z0jn+d4gw1VT9961s/G89fep/TlBU8AGxBBCLYeK/Ej1NnyUnA+nJNRA2mD/pPy9UnxQAdK8BM1vgdiEAAAAASUVORK5CYII=" + }, "/content/translations/it/developers/docs/accounts/accounts.png": { "hash": "fd88e46b", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB00lEQVR4nGNY1P6O62V5uUBH+38mGa7/TNFR65mBbDYg5ljYvptreVsbx8aYaLb5ltmsrdGtbJunXuCcPes/OwjX1f7nZZhV+p/90JTV3KtX/xeeP/+v2NIl/4V2/v/P/L9DhOl/sQLPx54axcezV2ocn3td/uTcExL/6wx5r+bysjIAQWPDf2EQzbh+4//wRYv/nZw95/OV5Sv/716//r/Zf2kuxvcd7Vxr1/3PW7r8/9FFS/+fXLH2/7Rdyx5KMUBBZcUPIYZZs56wb9nyn23KlP/cs2d941u8+D8XkM/839ON5X9HBseaDf9TFy//v3L+gl9r1m74375t1m0ZkOEg3NjwS5gB5BcGLOB/hwfQABGWZcv+Zy1Z9n/3wsX/9gHpydvnHBHe1XnIeuekSyapSf+5UQwABiIj3IA4fub/s8vZ5y78n7Fw0e+18+d/3zBn3o+e3Yt2i0xq+xze2/Pft6wEqBenC7ZKMf+PM2Jbte5/9sIl/w/MX/jryIpV/6fsWXxCpLP0aXBn3TvPqor/nLgNALmgSogT6A2O/xkCHG9ieTn/V8VygsRrqoC2N/23mj4VaAAwvvmAWAKIxdBxU+N/cRiG8UFqJ0/6zwvVJwUAVsYGKw6KZ88AAAAASUVORK5CYII=" @@ -19,6 +27,14 @@ "hash": "a7597f86", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB00lEQVR4nHWRX2jTUBjFvzZbmrS2zLXMwYaiL4L4LKJC30V8kbDHgGARR51hBLIJXpxsPnRlyxLX3rbbSGiLBAUpOhgD50AFRVBhT4IMhPmHKVTHpE7wmIjzYbgDP+75Lpdzz+USZ2vR1YGBDsYQJkJYUTzB96KPxFkjOqcyyVMUkWcy7Uxhopd/KpsmIgG6jjiZWUQWcm7McZB03Y0ur4xOAAKIQjD2722yK4dejU4eXZ5aPnjfXuqGfjj+IkPt5MswkAzWkFNF363it2eTUx9XypUfi7UajgUBHwYHY24VlytzP58Uy9+fz1Yx7RVe9tBfaVqzk0zzTcTzIOZyiPk+wTmi/iwgnW4DUyWnjgszM1u3C4XmHbeOm/Ol171/2jEKG8bXJAVvof8ILAigNs63LpUqrcVCafPhdKVl1cZrqcaN+VMLow9O6ufX4zsCEPrnFBJgZiOWtX7Rtr/ctaxP9yasz+MNxlMT15p9YyObZ1V1Vdq9gUfCCjsiVuvo929/VOQbj2cd2A2+lLre//bciPb+NMusRXcPCBpoJENNS2AHJOR75XfacTnY1/XWmexVnMjnIZP/3wmfbp+unQwNYd8223Nw1raxh7FfieFh9PwGBJD7Vr2Y53cAAAAASUVORK5CYII=" }, + "/content/translations/ru/developers/docs/accounts/accounts.png": { + "hash": "7d23e6d3", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB20lEQVR4nGNYWnaF+1Z1nvCHOHW+RsdGFj6W/0wR4f/ZCgv+s8/JPM+1KGkRR4ZpButsEM6czTqh5CknSA6EKyr+8zKABB52z+E/NfuU9LrFPySWLv0qnDnnAuva8HDm/83KAvfqCpSvt07VP9cxS2f33AuS/3tteW80RbAxAEFT038REM24dPX/8Dnz/xyfMv3dpcWL/+9eufK/GUjiZVMT15KV//Pnzf99ZPac78cXLf8/bdvsy9IMUFBa8lmIYcqUe+zr1v1nmzH9Lc+c7gf827b951r//z/zf2cnlv/NSRxAw1JmzP66avr092uXrfjfvm32Xen/fCxM//+LMTaV/AcZ8J+dAQv43ww0IJONdc68/9mzZn/dPXv2l71z5v2ZvG/aWeG9bVvstrUfMIuP/8+NYgAwABlBXgIbEMHG/H9qIfvM2T8zpk5/t27qtLcbpkx937t/6X7hifUfItpbfvr7eAH14nTBOh7mG026bMvWAl0w58f+6bM+HF64+P/UbXMOizQUPgpsKX3jntz0nwO3ASAXlLJz/i9UZ/+fxMbxMlOG63FSEsf/Zg6mqrLfvsU1/60nTvzPCYoKPiCWAGIxTPxdor32nWQvkO4th7DB/J7/vFB9UgDtEf0hNnJSDwAAAABJRU5ErkJggg==" + }, + "/content/translations/tr/developers/docs/accounts/accounts.png": { + "hash": "bdf7ebfe", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByklEQVR4nGNY1P6O63ZhoaAM138mKGaOi/7PVlbyn31qxWvO1tRWjvmW2awtLi0sC3IXsILEQHIgXFf7n5cBJPBw8k7e5bP+iC5d8ld89er/wl2n/rP87+xg+l+hIfC0vVLlSt98nUOzTytuW3xN8nuHPd+99lg2BiDoaP8vAqIZV6/7H7585f8T8xf9vrRqzf/dy9b/NwNJvO9o51q1/n/+suX/Dy9a8v/4irX/p+1dcFOaAQoqK34IMcya9YR9y5b/bEDMA8T8e/f+59r5/z/z/w4Plv8dGRxAA1KWLPu/av7CH+vWrvvfvnfBY+n/0lyMIAOqKv4LMcye9Z+dAQsAG5AvyAp0WfbSJf93A12wF8ievGPOA+Ft7bttdvacNQnL/c+FYgAwAEEmg03/H8fP/H92Ofuqlf8z5s/7vm7OvG8bFi/533t0zlHhSW2fI3s7//kH+gL14nTBVinme+3GbKs2/M9etuz//oWL/x8Ghs/U3Yt2i3SWPg9srfzoDgxEDtwGgFxQJcT5v0yX/X+HJsf/jnwuUJj87xBhqqn671vZ+N96+tT/nKCo4ANiCSAWw8R/JXqaPktOBtKTayBsMH/Sf16oPikAxJIEd4Av32sAAAAASUVORK5CYII=" + }, "/content/translations/zh/developers/docs/accounts/accounts.png": { "hash": "02642adc", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2ElEQVR4nGNY1P6O62V5uYDp//+MHe3/meKi/zMDaTYg5ljYvpvram4u18aYVrYT7SdYWqNb2TZPvcA5e9Z/dhCuq/3PywBSeGjKIe7Vq/8Lz5//UWzLlv9CO///Z/7fIcL0P1+Q63NHkcrFiTM0l085JXtg+gHJ/3WGvFdzeVkZgKCx4b8wiGZcs/F/+LLl/0/Onvflyqo1/3cvW//f7L80F+P7jnauNZv+586b/+vIjJnvTq5e93/algU3pEFyII2VFT+EGGbNesIOtJVt7Zr/3GvX/ufbu/c/F5DP/N/TjeV/RwbH+nX/U5cu+79y9uwva9au+9++d8FjaQYoKC76KcwA8gsDFvC/wwNogAgL0AVZS5b82z177rd9q1b/n3xoyQWhLZ0XzNdOfmwQlvufC8UAGa7/jHAD4viZ/5cFsK/Z/D9j9qwPaydNeLRhxar/Pbun7BaZ2vIuakrX16C23CtcuF2wVYr5f5wR26oN/7PnL/x9YPas90eWrvw/dfei3SITSu6GzSy/67+k9gwvbgNALqgS4gR6heN/hybH/+kanP+rYjlB4nWV/33K6v5bTZ/6nxMUjXxALAHEYui4qfG/OAx3VEH4ILWTJ/3nBelrbvovDQC1aAdY45cHygAAAABJRU5ErkJggg==" @@ -26,21 +42,5 @@ "/content/translations/zh-tw/developers/docs/accounts/accounts.png": { "hash": "a2725091", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0ElEQVR4nGM4W7uEd1PhbB4Zrv+MQMwExMxx0f/Zykr+s0+teM053Xc6e4tLC0ur61GWBbkLWEFiIDkQrqv9z8uwqX0Tz7llu3hXr/4vPGvmX3EQnb/oKuv/zg6m/00qou+b0jWOtO9VWjvlmPzBxdck/0924b3XHsvGAAQd7f9FQDTj+o3/w5et/H9i9twvl1at/b972fr/ZiCJjzXV3Bs3/C+YN+/boalTXx1bve7/tC0Lbkj/l+ZiBMlXVvwQYpg16wn7li3/2YCYB4j59+79z7Xz/3/m/55uLP87MjhWrfufunjxv1UzZrxdt3bd//a9Cx5LM0BBVcV/IYbZs/6zM2AB/zs8WP7nC7Ku2vA/e/7C37vnzP2yd9Xq/5MPLbkgtK39hMXqCY/0w3L/c6EYAApIkJfABsTxM/8vC2AHGpAxfdrbdRMnPNiwdPn/3qNzjgrPbnkeN6fzQ6gFMLBxu2CrFPO9dmO25ev+Z8+e/Wn/pCnPDy9Y/n/qjlWXhecVnYxfWn4uLL4NnwEgF1QJcf4v02UHhcX7jhAuEP2/Q4Sptv6/d0XDf8vpU/9zgqKCD4glgFgME/+V6Gn6LDm55q8ECIPYYP6k/7xQfVIAixwCZg8/fsIAAAAASUVORK5CYII=" - }, - "/content/translations/hu/developers/docs/accounts/accounts.png": { - "hash": "a050ce79", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4klEQVR4nHVRS2gTURR97SSZydQ2mIQ2rdm4cWUXIojiwo1YXVQpiCjVLkQ0EqwUtSahikr0PUPFT4ifmTQzOiExMzKJMAqaBsGSWnQnKrjJShSUVrDSBjUemVoE0R443B/3cC6XMApBj+kte3iTC4poDorgBvrhGj4OPhX55M4dzAnKhrAzvjnuUI+oTrtnz2yePoVWEo18dL+nQ+3l7JcO6VajwzDgSzyH4/7efg5nVntm2LFVrxNy91P5xcqH2pvOebaprUb3uQghhFH47dikl7Arb+CZcuf7S/0eyrki1tmDz4yKRROD2RwmFO3npGHiekV9u4IsIhqpe4kkveMtCy7LwjJNg6eiQXwEcNi2xQEWEvQiDmTG5vWb0rR5Vwet6NN/BGIReIksgSf/AdhWB44ud+YLCGfUb+WMWq9kC0hWjVe+x6NT660rtTU79qPlL4GgiCb7pAWBAQ8H+SSvFxCSx76acnq2dDuLS9V01Xc1Prf7cgLb+3rBL+3gQRdXo2tdeglhRfvxJK3UJ/IFpMa1Kf/5Ex/6Lkbneg5fgLC0gO0g5nVjuJtHqEeYGdwpInRIAPM3j8TQGz2LjTdScNuvaGMUAUbR/i8bgdFzs51J2ggkR37nC/U1tC7udf0CdK8BM4Vbt1AAAAAASUVORK5CYII=" - }, - "/content/translations/fr/developers/docs/accounts/accounts.png": { - "hash": "94a2ded9", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nHWRT2gTURDGX7KbbLM1LU2ipn/Ai4dePCle6rG0eggqSBHEnhQCpfZQqcmaCpGWt5UIahoDiWXTzbprNt1NxSiUGIqUWBSKoFA8tQeLF1EoAbGE5pNXexHtwDAz3zA/PhhiSp9bN8ev+72cxbkccWePCG74CtwTNyGkIt886VBaWB2Y5qf6p/jcaM7FNLZjeWcSXsKE5cxCW9nA4eeLOFoswn/vPXjMyE7EezvqcvT4h6zd+0rfPPYmv96JZL93g151E0KITBFg1WG9wJBuYFXJ7Xw0F1DRSzjNFtux260lC2O6gZW8hrfPLDyu5r50k/2IRn75SCazJZTLcM/N1Q89fPC1vZqHuARwODfAQw63mCVcMwowVbVhWzYoA6BbdDCAFIGPZDMQyH8C8lkeYx0uzcCIpqOiaqhqBSRrTz75K7RyZimxdmpoFOJfgB4RjLxHx3A7h+wtQdcRVuYbtjLfWFRU3K8Va/5ZunN5NtE8fzEE4WAHL7u4DXrSbdoYUfPNZUVtrjwtIPW69C5Ax79fmIn+HJQi8BwMYA4knwcTJwSEB1t+3Lgksgo54IxJCEXj6Eun4GGvaJMpgjLFkX9zN5i4W+9M0t1gMvan35sfwbt/1/UbStsCuZ1Zs6sAAAAASUVORK5CYII=" - }, - "/content/translations/ru/developers/docs/accounts/accounts.png": { - "hash": "7d23e6d3", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5UlEQVR4nHVRS2gTURSdJJOZSdqkYkpJjbsuulFc2Y0oWBeCKOIqWVkYXWQoaINJLf77Uo1QAwYzmZo3ppg41VEyupDZhBqhQqGglipYBIsfXBRsGtCQlhaOvNqNaA8c7o97OJfLGYPvWz5ePBOon+z2Dx8c5v08nJEwhNgARF156y3KRSm6N+qmjAp1345/97AZ49AQfBxrfBnV22boTMgqrQQNoxFQ9Fl3ORx2Idm1beHKQNeH6+qeNzfzuyr3ZjuR3u+bJxGB4ziOELSz6DCeIKyPr09ntdpcqYSKaaKHDRYJ8T4wcbYwvvaK6s3p4kPkbPouxG0iEf+5nctmF0TLgjCmLbXqo5/bbBvep4ALh3p5JGXJNHF6jDYea9pyeeIRUjb9FIKfdwIdDhIHE4DI/QdI9vJQBLdeQH+eNiqU/prUC+t3XuReByZvPD9gp1729PWh5S8BPw8HO2lDICK4oMbEu3Q1qmo1S80tPcuqy+mqUQ1krtYjqZHV40ePQNzagdXqmie7hYky+vP6SlXL16ful6Da+lT7tdjXEyOJH4dPEUhbCzAHCdGDWLcIWZAWlZ3eb7IsISk5LwyuHTt3CfsyGXjYK/yEIEgIOv5lM5i6XOtMk2Ywff5PvlHfgm9zb8dv7RH9IcfErXYAAAAASUVORK5CYII=" - }, - "/content/translations/tr/developers/docs/accounts/accounts.png": { - "hash": "bdf7ebfe", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1ElEQVR4nHWRX0hTcRTHf+7f3S5Nc1s1nS9BDwX1lASh0EtQLxK+FBH5VCAMGULpNjQoXL/fRH1wrGAb3nl3vbfd6ebDTRqXS5BIUfQSIUQgRYUPgiKCCrm+8Vt7ifLAl/OP8+FwDpHppvh5cLC1Q4StIXvfLbiG7kFIRzc8ibsJt3Qx7By7PObID+SdvMZ7XA9G4SW88DVV9WqZg2NzSu1EqQT/+Fs4kGQ2RE8f/UFjpz5OSWdfZd+dXCqstu2xS81r9LaLEEIYRYD7plIZN7Qi3kjyzw/6PEy1ggu8scWoqFcQUTUsywpeP1vAEyv/KUQaFovu+0gm810wDLgMA0cMAy2WBbEK2MGuOsD63XoFdxQVujS7X14og1r5byGExCYOiEfhI9kMBPIfqwMirU6tiPCcAlNWYGlFpF7kvviXqNldnXjfeX0A4l+ADhGcXKejr8WO7LCgF9EvzeyVczO7iwUFkyu5Ff/0452bk8lf13p7IBy+wfN2+xo979IXEVZVvJwtYFmfR9qUzUDy/npvIrZ9hVG4DwfwDeI+D4bOCWBn3GARkd8ELGAbiaMn9hBdT9Pw8Fc0M4ogozj+r2rBiUc7bSlaC6ZG/sT1fBrexlz7b8SSBHe8x5VuAAAAAElFTkSuQmCC" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-blocks-data.json b/src/data/placeholders/content-developers-docs-blocks-data.json index cf27f013483..6f632224a79 100644 --- a/src/data/placeholders/content-developers-docs-blocks-data.json +++ b/src/data/placeholders/content-developers-docs-blocks-data.json @@ -11,6 +11,14 @@ "hash": "4a855fa1", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABS0lEQVR4nI2RTU4CMRTHi4AJiXvcaELCggtI0DPokrW6kBUbTtATsGIG6HS++RhTV5zAuxgTYwLC6AwQMf5txwxxIcaX/Jqm/b2X9j1CdgSADKXYS9nlJSEEsikycQ+USsg2Se3VWf2Hp9hZEIRk7tjjma6HF91OeC7M2ak6+1Vut1FwHFyZHm48iWXhWrRFYWC/D7VeHErmrrUZPbRaBXWXeraHS03DAZHJh8MASwkSbhELY1VyrbWv9eNlpxvFtrXxJ/5TSXmj1Avwyjwck/EYRdP5iPT+HNxaQVZ+87VFWbDnpqm/jIzebCD4tDnhi7LpINL0KRiPlLcIAhwRzlF0PcTuAPAkqgBj68p382gOjUZe7ZmDiryLHH/rhYzJF8gl77qodg3UDOOz1uOoqr4k06mLLKX3ubRXypNfTjxm40ROYv/P8f4nvgCdFPraMg/tQQAAAABJRU5ErkJggg==" }, + "/content/translations/fr/developers/docs/blocks/tx-block.png": { + "hash": "6f0fee24", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTUlEQVR4nI2Rz0oCURTGx3+B0aKdbQwECV8gidZBQbteIFu4CNwFvUMo9gBi0dyRmW7qeO/YaNrCbbVoEfQaWjpDFPR1riUoZHTgu5x7z+8czj1H0+bYNhAoFhCcaB43ttsuQtPK5/NBnMbDkzj5dC8GDzuz3J9FH8tPW/ysv1cxsNsyvE2sLQd+BcslRBs2MjWBrFK9hoNeobdY5dDP9c+BbqBf46g8l0pRFVPMVRVZW2DfYFjSKHml6cJ320CnC7g38LoSCW6CXTD4JI98/cFBYoZr41UKrGptFzHOMbIswGkCtsRQMiSvTT9nMr/C2QdrmW+5ewdJxTH2PuYaEgO7jrhGrcaEgCfpUTpUQGDILaS+h1cM4/goonxuI0WxkWJ+uBd+SR3QERENpOkrG0oWR1rNRSW5GTd0snMXnsxqmuN1rNMmFv7cxH/sCwWmBVA/jWuHAAAAAElFTkSuQmCC" + }, + "/content/translations/hu/developers/docs/blocks/tx-block.png": { + "hash": "dc634412", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVklEQVR4nI2RP0vDQBjGr/+EintdFAod+gUsxcXRwVE6q4Od/A73CWJtmhovMUmTtI1ks4s4iYvfwkXEgkvTNmmLgo93rQERLb7wHA/3/u654z1C/iwkKEUy1t8cL99H6rsAJEBJGoQk5lGUJEFpsvKDWxp6X7vZtRqP+7Ic7nnseTsO++32rGXh0LZxLKQbOOrR3qquz5wzJRjIzeHgUpt2HiQpa/BezJk2DhQFa4QfXm97mNgu4LaBzhUi30HeZCO3rgSTenMU6ReRc+tM84JzOCPE/YjZ2CTdLnKaMQvrjT5UbQzTwdhRgoKn9k9U+aWjKa+u8NfOtKAZ7+Fp7WnB2Qg8DxtE15Fr2YjiZN4YMzYrLoZH06hWM8IzC0XeC8VLv7ghY/wFfMm0WihZ1lv5XENZ1VGSJGTn86n4KbpzlxZe7AlOMJr2UWYmtvj8Vpb+xH/qE6Ga+IV7hUM9AAAAAElFTkSuQmCC" + }, "/content/translations/it/developers/docs/blocks/tx-block.png": { "hash": "f77e6903", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVR4nI2Rz0oCURTGRxkjo0WLwDYGglQPkAS9gAVFK/fVwoXboFeQSnQflM4fnebqzOjMNE3YwtqVBD1JDJNji6KveyeFgowOfHA453e/e8+5HDchskCkXEJ0rElcGKWTR/67UClHsTPPj/uoJKOstn3c/8FNNMTSXOTp9HbTFJ9zkoitKzVYZ7Vf4Zsu4nobe1R5y0Re07HfK/VmVAVSVYQnSPCaCho4P4uzHmNCzsCuLGGWaxtYcFwMLRtgchwEdyZSpA5JkDGkBgFRIPYtpBhnOyPOhU8vX+RcBwmiYSDJ72hcAC0DfreJtCn4BUV4FYn0VruUg8KDhTTjqrUh6gqg6/CuXSS5FkHC6GBgjl7QNuFrLSx/La/M4/AgxnJDxQrlXkwLH4yjuWfo1ICoiNk2MrqGNSaiI0PHmmaHitkif7RxH26b1RhH5w85rYNVOsLUn9/7n/gEWsUCYC4yCogAAAAASUVORK5CYII=" @@ -19,6 +27,14 @@ "hash": "5b9d226f", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABXElEQVR4nI2RwUoCQRzGV1kjo0M3uxgIUj1AEvQCeqhbD1AePHQNegWpFXsAI21H0h3dXd1dF8MO0q0kgg69RWDmekjw6z8rQhFKf/iYb2Z+8zHzH0maU0kgkM8hONM8zq+c8iz/lKIoQVxGZWyuBcQ+eZrngwcXvV/cwtDXq5eUzt4PmYr9jva1Nwv7U/cdhI0GjkkZ20JGbyLdzXVXdA71Wp183JTRJ3/7ViiEdQNpwQg1TByVGVYlMutuGyPbAVwXcFx4DxZiRhWsyDCiAK9GYT0bMcE5UwaWgwFvYkNqu4hwjiFjY9CIKsegU0O8VRmdVEqeqpXHJeGfbMS5jmGx5PlchaN/10ZUqnNEzCaGlAhxC8vGQK9ja9q8vIyz05DwpoZt4j5pfyLYho2+aVAA1xByHCQMHbtC3ECCnrUsDmWTWfk89eh3W6wJjt7vc1odO9S/pYU/8Z/6BiWQAg7gl7wIAAAAAElFTkSuQmCC" }, + "/content/translations/ru/developers/docs/blocks/tx-block.png": { + "hash": "0814b755", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABUklEQVR4nI2Rv07CUBjFL/9MMO64aELCwAtIjIubi6NhVgaZeIf7BCVaWtp7K5beWki6yaQDcfMtXAwOxiitUCAOHlsEYowQT3JuvuF3v3w5h5ClQoxSxOdezoVyXSR+GkAMlCQXqyiJg9J48Re3cmm32j24kB6OZNk/bKu9PRAS+xOUJKRNEyeWhdPIjSZKHdpZ53ogqvKbJ6ten7PAuZekdKOB0py7tHCsKNgg4edN28FIXAGRLQfBtUCWa6/2udIfndW8gGsDcSvGWTHj7Ii18c5cbJNWC5m67g9VvQ+d+dCNycA1xjmhPFY0uecw5dl2tKfKjRjnFM0f1pSXKcd44LXb2CKGgYxpIbBmF5gCA8Ym+e/waBLlciqamYl8ePbQshecz1h4Qfikmk0UOP/cjawZH4Uol2k7RTdB9++S86wirs4x5VSGnbCJtZVN/Edf73j24LxMkV4AAAAASUVORK5CYII=" + }, + "/content/translations/tr/developers/docs/blocks/tx-block.png": { + "hash": "55cbeafd", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABV0lEQVR4nI2Rz0oCURTGr/8Co71tCgQXvkAirdu1C1xXC1218QnuEwilM053RmfmzugMzM5eoEXQgxQRUpHljApiX/dqRkRKB87lwP2d7557PkJWBRCjFPFlruRkBAESPxOiGZQkv7UoiYPSeOkXt1b0pn57wNX7I1UND33W3wchsT/BWg1py8JJy0KZc5TbNk6vKNu0zJlbb4YD9XL0aren3btqNS3v+BdnchwrCraIaN7u+Bg5HcD1gI6HKNDHWas1cRvN4UjRoshsT52e85h1BScZyYqed8axSzwPGd2YhA3lCcyIIF4ZOsogF7DnM6b2u7r24sq654xzkju/eADTQ8HNBr6PHWIYyNgcEXcXypaDIWOT/GJ5NIlKJSVrZiEvxg5twUlW1G+MiQnEkbJtFJo6irr+UdQMFORe5u6UggSl18nlriQnvjznmIk94cTGWif+E5/7GfjWyZcnKAAAAABJRU5ErkJggg==" + }, "/content/translations/zh/developers/docs/blocks/tx-block.png": { "hash": "da0f9d1c", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVR4nI2RTUsCQRjHV9HI6NAhsIuBINUHSIK+gB2KTt3Lg4duEXT1KLSi3yBlX0yn3dl1dlkMPXmNCPogYdsqWeG/GV+gCKUH/vAw85v/PC+SNCcyQKhURHimedw4ivJj5KdkWQ7jeD2CrbWQuEc5EUa5FD66fvjFLTR9rj4dMOXlpKrjsEOxPzP7E502YtTGGVfO9ZAzm8jqF9oKs6BWNLxqNfRsipqfz8dMiqzDJpzNcKqpWJVsCxteCwPHBZjD5aHfZUg6FKqiY6DW0LdMKF02THr3GLhTjvM+/3xTanmIE4JAUYZQ1U/UCfz2HVLtxtc5Ud4V43ZUFTk3TRETwU0l4NwH9Dp6VgsJySCIW00EogJemnD3TQPbk+GVIri6jIqcWNjh3BtzMZpyPYtyA9JAlJeVpib2hAhFmre1LB4VMgWxkfG0xZngCJtwDQO7vIWlhZv4T3wDZvEBoRcuN5sAAAAASUVORK5CYII=" @@ -26,21 +42,5 @@ "/content/translations/zh-tw/developers/docs/blocks/tx-block.png": { "hash": "bfe92f12", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWUlEQVR4nI2RS04CQRCGGxATjHvcaELCggtIiFfQpazVBazYcII5gA5GHcSedl49A8SJGw7hMdiwMSQ+eA2PGPmt0ZAQTSZWUt2V1Nd/d//FWEQoCuKrjOKY7yOxngBiKLMkGIuFfSgsDkWJF39xkaJPF50ju9Y9rtUnh23eP1iJ/QlVRcqycOp5KDkOSoaBM67wLcdaulf14aB+N323rc9mr1pNhT2PmHtKYeJE07DN6PCO18bUkgDtaD4g8PVZRppz9/p2NL1pBIFpfMiOfM64xNku4LaIa2NEF+6xVgtp3ZhP1MsehLmAIzGWWj/7KN4qutZv6o1X1xcvlY6cZXVjMTlXu+AiAAkNTBO7TAikbQeB9ACH1E0HY87nuR/zlA2Uy8mw5hZy1JtIYkKW6iHn9AJakraNvK4vC/SdQkMgH/ryPZ2in1BIZOXVOsdN7NMkNiMn8Z/4Aukp90d29r6eAAAAAElFTkSuQmCC" - }, - "/content/translations/hu/developers/docs/blocks/tx-block.png": { - "hash": "dc634412", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVklEQVR4nI2Rv0rDUBTGb/8JFfe6WCh06AtYioujg6N01g528h3uE8TaNDXexCS9SdpINruIk7j4Fi4iFlyatklbFPzktgZErHjgg4/Dj+8cziFkZSFBKZKxVnOEEN9H6rsAJEBJGoQkFlGUJEFpsvqD+zP0vnGzZ7UeD2Q53PfY804c9tv0rGXhiHMcC+kGan3aX9f1uX2mBEO5PRpearPugyRlDQO1mDM5DhUFG8SysOl6mHIHcFyge4XIt1Ew2dhpKsG02R5H+kVk39qzguBsFxByPYwZR570eshpxjxstgZQtQlMGxNbCYqeOjhR5Zeuprw6wl/bs6JmvIenjaclxxF4HraIriPX4YjiZJNjwti8tDweTaNezwjPLJRMjlBs+sWNGEOeMIZMp4OyZb1VzjVUVB1lSUJ2cZ+qn6K7d2nhRU9wgtG0jwozse37WPvzE/+pT6Ga+IWLQWLiAAAAAElFTkSuQmCC" - }, - "/content/translations/fr/developers/docs/blocks/tx-block.png": { - "hash": "6f0fee24", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTUlEQVR4nI2Rz0oCURTGx3+B0aKdbQwECV8gidZBQbteIFu4CNwFvUMo+gBi4dyRGU/qnTtjozku3FaLFkGvoaUzREFfXEtQKOmDDw7n/M5ZfEdR/tA+ECgWEJxZWaa+i9C88/l8EKV4eDZHKR5EqRg87S1yS48+Vp726HJ4VNNw2NG8XWytB34FK2VETY5MUyAr3WriZFAYrDYI6pX6OVI1DJuE2nO5HJUzyVw3kOUCxxrDmmJybLQd+E4X6LmAcwvPtZAgHazK4FcZPNKhPthILHBdvFoCm0rXQYwIE8MA7DbALYwthuSN7ud05teIfbCO/pa7t5GUHGPvU860MOItxJUGISYEPKsNWDbABcZkIPUdXjGM87OIrIkjxQUmkvnhXqiOTYXqiAgTaZNjR9ogpGUucsnJOKGLg7vpN2RvnqMWtvsuVpZ+4j/6AgWmBVCYqDcWAAAAAElFTkSuQmCC" - }, - "/content/translations/ru/developers/docs/blocks/tx-block.png": { - "hash": "0814b755", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABU0lEQVR4nI2Rv07CUBSHL/9MMO64SELCwAtIjIubi6NhVgaZeIf7BCVaWtrbCuXeWki6yaQDcfMtXAwOxiitUCAO/kwrEGOEeJIvOTn5cnJyfoSsLMQoRXzBao8Q4rpI/ARADJQkl6soiYPSeOmXt3Zpv9Y/vJQejmXZP+qqg30QEvtTlCSkLQunnOMspNlGuUd7m4YeiJr85smqNzRY4NxLUrrZRHnhtThOFAVbxLKwbTuYiCsghDsIrgVyhvZqXyjDyXndCwxtJG7FNCfmnh26Nt6ZiyzpdJBp6P5Y1YfQmQ/dnI1cc5oXymNVkwcOU55tR3uq3ohpXtH8cV15iTxmBF63ix1imshYHAGfX2AJjBibFb6fR5OoVFJhzywUWhxjbi89nzFkCWNItdsoGsbnXohmfhTDv0TplNwEPbiL0ghnodcwEHkqw67rYmNtEv+pL+949uArPXfiAAAAAElFTkSuQmCC" - }, - "/content/translations/tr/developers/docs/blocks/tx-block.png": { - "hash": "55cbeafd", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABVUlEQVR4nI2Rz0oCURjFr/8Co71tEgIXvkAirdu1C1xXC1218QnuEwilM9qdcebeO6MzMDt7gRZBD1JESEWWM6MgduJqRURJBz74+L4fZ3EOIX8JSFCK5OeQVQoCpL4PgAQoSX95UZIEpcnKD26l6VXzek/qtwe6Hu77bLgLQhK/go0GspzjqMtRlRJVS+D4grJ1bs/dZjsc6efxs7Bm/Zt6Pat+8oOzJQ41DRuEc2z2fMROD3A9oOchCozJNu9O3VZ7HGudKLKtmTNw7rddH7FiFNvz8cok8sTzkDPMadjSHsDMCJbA2NFGhYA9njB92Dc6T67aB86koLjTszswI4Ql5iPfxxYxTeSERCTdpTN3MGZsWlyGR9Oo1TJqZxxFWyIULqBYW+KFMeQJY8gIgVLbQNkw3sodEyWVy6KdSpCi9HLRhropjvMlx2zsBAHWVjbxH70D+xn41rzPuVMAAAAASUVORK5CYII=" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attack-and-defense-data.json b/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attack-and-defense-data.json index fa05dcc671c..bae5b89c69f 100644 --- a/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attack-and-defense-data.json +++ b/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attack-and-defense-data.json @@ -3,6 +3,10 @@ "hash": "aaff0fbb", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABUUlEQVR4nGNggIK0tDT+jo4OORA7NDSUs7m6WR5IM4P4QLZicUwxNwM+cOXYMaFLZ8/qZSbna86cOFP57dvn2leuXGEDyV0+d0L//Pn9Alg1hoauAtsyafOVRRM3XfkPMuTu3btZ33/8/P/27atQGRkLzqnbbv2fvuVyL1h9/Sq2////M8INqK+vZwLRMzddTJm48cxChv8MjG/evNH6/+PT/P8/v+jb19ezTFx5YvP0tafjQOqAmplwegNs8jYG9glHN5lWzzuyctbWE05QcRYQvXj/aYeWJce3bzlxyRjTMKBL0maeYQUx1x4/7tqx/ur/uQfOpoH49vt7RED0rD3HE5pXXvi/8/gNTxB/1SqI9zFdAQRvn9/RmdTcreisEStcb1/PArMRiNnxegMKGMvKymSiA9Mk/e3jBWDRSTQAuQKYLkDeYUSTYGRAjgEgAAAQw6QrLEaZfwAAAABJRU5ErkJggg==" }, + "/content/translations/es/developers/docs/consensus-mechanisms/pos/attack-and-defense/reorg-schematic.png": { + "hash": "2e38c778", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABS0lEQVR4nGNggIJQFxf++vp6GRDbwsKCs7q6Wtbe3p4FxG9ubpYNDQ3lYcAH/v//L3Dv5k19c3Nz1ZKSEuXPnz9rA8XYQHKPHz/We/fuHT9WjaGhq5hB9KTNVxZN3HT9/7ULF3QePnyY+evX7/9vX70KlZGR4Zyy8+7/aVsu94LV169iAxrMCDcA6GwmED1z07mUiRtPLQQymT69eaP199u7+f9/ftG3t69n6V1xdOO0NSdioS5lwucNRoZVDGxTD2wyrZt/dOWcHWccwYbPPMMKohfvP+/Quuzkti0nLhmDLUcxDKg5Dapw4/Hjrt2bbv6fc/BsBohvv79HBETP3ns8sW3N1f87j9/wBPFXrfrPjN0VQPD57UPthIQEWSBTAoiFYM4HYna83oACpuzsbCljY2NQyIOij42QBgwDGCBpgBFFFOQ65BgAAgDL9pnU7NclXAAAAABJRU5ErkJggg==" + }, "/content/translations/it/developers/docs/consensus-mechanisms/pos/attack-and-defense/reorg-schematic.png": { "hash": "bd8b7b43", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNklEQVR4nI2RwUrDQBCG9+QriODRoyD4CoLgE1ToGxTBu4hP4AMInnqQSkEDsSdzUqoxGprqSRCDaSutUSRtkk22pv3d3boV2gr+sDA7M/vNzA7Bj1zXheM4yLIMvu/DNE1QSmVM2MI3S0QZURjC815wXCrBsiwEQQDGmIy1Wk3EUTwbwFhfGrnCLsj8CpqNBmzbxqmmcaAnK5O5JWzv7cu8MKa8y8EvQLQsdFA8wWZhBwHt8tZjfL6/gfKqKWXYyG+hWK7IPJU/NYKS3/vAzX0Nq+t5GBfX3DNEko7+4tK8w/JaDo9Pz2PYGCAuaubbeh2ELOCwrCH6iuD6r+j2ezjSK9y/CKv2MA1QGmA0X6fdhmGc40zXcVWtTrX+5whCSZrIjxSrFSfkGxKA4X8BIlk9mtQk5BuTjBDYhrqbSAAAAABJRU5ErkJggg==" @@ -11,16 +15,12 @@ "hash": "b8ab487d", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABOElEQVR4nH2QMUvDQBTHb3UUxI8gKH4HQT9BHcQPUAd3B/0AgoujOurgVAw4CRkECWIHqZgMMcS0KUHSRkNSzxpzTdK/udOoNMH/4+Dd3bvf/d8jyJWmKSzLEiuKIjiOA03TQCkVe13X4XkeqkSKhBd37Q7OJAmyLMN1XTDGxF3XtsV9JYCxkUhqG9sg04uw222omgpFUdDr9+D7PsjUHDZ39kTd23uE8V8At891cNzAan0LwTAQtuM4wnNu2zRNLNXq2N0/Ah2EKOpLLRTyXl/QVO+wsLKOi0sFLGH4yGFJEkO+usb88hoeHjv4ml32C+DkoudmqwVCZnB42sAwoTCfbAxGFCfSeX4+i5vb+583JQdZHlzcfgH8TyUAVxiGMAwDQRCIgWXfMa6orQTwn/kgJwfGNQn5BAlnEi86uc5+AAAAAElFTkSuQmCC" }, + "/content/translations/tr/developers/docs/consensus-mechanisms/pos/attack-and-defense/reorg-schematic.png": { + "hash": "4c8075cb", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTUlEQVR4nGNggIKsrCyevr4+SRA7LS2Ntb6+XgaImUD83t5eaSCbgwEfePjwoeDNy+f0bWxslCoqKpTevn2rc+vWLXaQ3M2bl/Xv3z8vgFVjaOgqZhA9dfO1RRM2Xf1//cwZ3fv372f++v3n/6tXr0JlZCw4p+2483/K5ou9YPX1q9j+///PCDcA5szZ2y+nTN54ZiGQyfjmzRut/78+zf//84s+yIK+Vcc2TllzNBak7n/9fyac3gCbvIqBbeqBTaY184+umLbzjBNIfP/+/ywgevH+8w6ty45t23LikjHY8v/IhgE1p808wwpibjx+3LVr/fX/Cw6fTwfxbba1ioJdufd4Yuuqi/93Hr/hCeKvWvWfGbsrgODTm2da6enp0kAmP8hbUDkmIGb//x+PN2CgsrJSXE1NTQTIxB76BEFoKDPMZmRvMiDHABAAAC71m4Ar686VAAAAAElFTkSuQmCC" + }, "/content/translations/zh/developers/docs/consensus-mechanisms/pos/attack-and-defense/reorg-schematic.png": { "hash": "8b7d12b7", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABKElEQVR4nHWRTUrDQBTHZ+UR7AVcCeIZRDyB+HGBggju3OoJXLsVERcKEpB26S5gWzWp4i6SNpIaCU1IjE46adq/M2OnlCb+Z/PmvcfvfRFMFEURHMdBnueglMK2bWkLCVv4ykSUkSQJB3Sh6zosy4Lv+2CMyZjwf/N4KYCxTBo7+0cglVV4vQ+YpokbTcOn56EfBCALSzg4Pvkr9EMxngWoNk/PrrBZPUREY1ktDHzZ9jAbYmN7DxfXNZmn8gsjKPlffTy8PmNlfRd3epN7RkgHqYzpLQPLa1t4s9+nsClAfNLJzK12G4Qs4lyrY5BTWD0HcRbj8rbO/RU0H1+KAKURf0JhGMJ4MtC4b2C2SGGJpavlcl0XnW5HXkSBxyV5/wLUCec1D/kFi98UpYY6dRoAAAAASUVORK5CYII=" - }, - "/content/translations/es/developers/docs/consensus-mechanisms/pos/attack-and-defense/reorg-schematic.png": { - "hash": "2e38c778", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABV0lEQVR4nGNggIJQFxf++vp6GRDbwsKCs7q6Wtbe3p4FxG9ubpYNDQ3lYcAH/v//L3Dv5k19c3Nz1ZKSEuXPnz9r////nw0k9/jxY713797xY9UYGrqKGURP2nxl0cRN1/9fu3BB5+HDh5m/fv3+//bVq1AZGRnOKTvv/p+25XIvWH39Krb///8zwg2or69nAtEzN51Lmbjx1EIGBgamT2/eaP399m7+/59f9O3t61l6VxzdOG3NiVioS5nweYORYRUD29QDm0zr5h9dOWfHGUew4TPPsILoxfvPO7QuO7lty4lLxmDLUQz7/58xDapw4/Hjrt2bbv6fc/BsBohvv79HBETP3ns8sW3N1f87j9/wBPFXrfoP9j6mKxgYGD6/faidkJAgy8DAIMHAwCAEc/7////Z8XoDCpiys7OljI2NQSEPij5wbJACmBggaQAR2lBvgjESAADL9pnU+G6EAgAAAABJRU5ErkJggg==" - }, - "/content/translations/tr/developers/docs/consensus-mechanisms/pos/attack-and-defense/reorg-schematic.png": { - "hash": "4c8075cb", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWklEQVR4nGNggIKsrCyevr4+SRA7LS2Ntb6+Xqa+vp4JxO/t7ZWur6/nYMAHHj58KHjz8jl9GxsbpYqKCqW3b9/q3Lp1ix0kd/PmZf37988LYNUYGrqKGURP3Xxt0YRNV/9fP3NG9/79+5m/fv/5/+rVq1AZGQvOaTvu/J+y+WIvWH39Krb///8zwg2ohzpz9vbLKZM3nlnIwMDA+ObNG63/vz7N///ziz7Igr5VxzZOWXM0FqTuf/1/sHqs4D/I5FUMbFMPbDKtmX90xbSdZ5xA4vv3/2cB0Yv3n3doXXZs25YTl4zBlv9HNuz/f8a0mWdYQcyNx4+7dq2//n/B4fPpIL7NtlZRsCv3Hk9sXXXx/87jNzxB/FWr/oO9j+kKBgaGT2+eaaWnp0szMDDwg7wFlWP6//8/O4jGGyMgUFlZKa6mpibCwMCAPfQJgtBQkPMQoQ31JhgjAQAu9ZuAXmG5NgAAAABJRU5ErkJggg==" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attestations-data.json b/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attestations-data.json index 83a33a12991..ab9a70ecfb6 100644 --- a/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attestations-data.json +++ b/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-attestations-data.json @@ -3,6 +3,10 @@ "hash": "78675710", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC6klEQVR4nH1TbUhTURi+mjn8IEKxwCD60hSiiEKoqJ9BhWZBQRGk9COsJn1QUj8aQQ2HWM0t1IzErx9e17YkZZvEymzN2nS6ue3efbD2db3b3WfebRrtdI5t/qoOHM577/u8z/s+73sOhsGFazQFPp1jq0wm20imSU4oFOKbzeaPDBPsAQCsx/63rrb375ONyeQrKrtptEcy2zXwhh8Oh+8b5gxS/3fG4Z0L3UU4ANR5kCznjw0K4C6DuxB7+YXkf16YHU0N6R6M42Z3x4BKcqetrQgBFcOgxfhu0RideC/IBK5DJ0zQTJKkNhgM3sN6p23ntITtBnQeEA0YbvNE8joTbSqGzoNJkNzp1szWBAzmSujnpNNgAyKIx+PV0Wh0IZFIHEKs50mCZEmC+AXtCwgQi8VKmWBwDGbqZBimORKP11OUd4z2u9Uw6CJFUUUwAZ5MJrdjLADlNE0fj8Qj9ZCgEuB48RRheyFg2XJE5vH4bwHgLVVNLje+nUg8B8BdAAk2wZgPqVSqcq2ZFgvZSBCWZxqNkysbj6VH1cuN6P/8/I/N6OSKktybopVeTzi8N0TTh+GkJJCgAknIMZlM+QqFokQoHOeQM5NleinVpuhNVQGA5XZ361bH+GgEnLjSCWoSsdhlv99/DUroW6sAkuTyeDw0pjyoWex0OKZCoSAffRMEsQVhxGJQnJnAJUjQlKmgCgXXuVwug8vt/gbtk5FIZNvS0tKpQCCgYZhwO9TbIhQKOdk7AP0NqAKPxzMIm70bEewn7U6xnbCPxBPxowjk8/kKWZY9k0qxZynKx8VxPD/bK0hcARMesVqtfXAKO7BaXs8uiVzStSw3fpJ14trXQ1JBFuzWO49556jrqzJ5vNy/XuVBg/eJwW5Ssfh8q1JC+Dr6lMMURTc4nfaHxumfeqty0RZSTjzO4lG/MnJWJWFPNZZaqXbmNIiCktZuXZPglaIeltmv1+lpr5dWMXqimlJ/3fOvt/QbQvQI2PE+79MAAAAASUVORK5CYII=" }, + "/content/translations/es/developers/docs/consensus-mechanisms/pos/attestations/attestation_schematic.png": { + "hash": "186d5aef", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC4UlEQVR4nH1TW0wTQRQtiDY8YgwETTAxPlESozEajRr99AODoh8kGhPhEwSiGIP6YaMRhBB8UQJVDKE+W2oLVdYWQqpBoAhtFlqKlkcttu52u9vutt3uSrXjDFK+1Elu7t17z5w5986sRAKXWj2U6h2b3aDT6dY4nU6pIAi1brf7A8+HHwMAVkr+t8oblbt1b/RdC70z9u5HnXiLsqtGFBeuub+5tYwvMusZ919BOABMKZAs6U8MUqFlQ0uTtA07a4ft4/roS+v1dxqH+4HS+PpyQ0M6AhpUoHr8LWlj+/rrlzauQJ7juEqo0MyybLXkydDnooEv0+WwuLf1KV51s1lfYLfbM2BxnwCELbTdvp9zOHLjAEjpeHw1IgiFQnmQZBLaQcRa5CNJniSIXzA+gwAeD5cVYtmecDjSEggEKnmeLwyHAliUZ03RaPQsjuPpMK+Gs9qECHLgaccQSAQgF6jlGeap6eZ6ns9BZCRFXQLAk9U/+LOku1+4D8B8KkEQa2mafg8V5C4PEyZLGMZ3b3Tka4UO4+J6048SlJ+YJdchX9UkVFxsEtvhybs4hjkEvQYSbEMKkmDPqwwGQyaGOaVWK5Y9ovU2mNrFHQDIkhWKscVrvPVKzC+TgwORCHfe7/eXMQzTsawAkiTLZDJ0TSmwIKco8iNFU3fQN5S6HmHkcpCxdAPnIEEpUgCHuQNtPkFRFE5RzCiM84PB4MaIGDkO/RAbYBshuBrDMGniDUCCYqTA4/E8g347IthDUbScIsjOhWj0CAJ5vd60WCx2SoyJp2naV4FaTMwK9Q3rh10uVwdJkpslBVflW1WazlZBZxvQtajMbc+76hPgecvcUcJBXFhsUyZL/utTfoF7avCZyV5eM1Fn1Dq8DzuMKpoOFpPU9xtTFmCZMpLTjLHvdgKP5rXUzmJLkrsDtgKt2XoSsCCzTjFWWqPoKRQEXumam/NxXKSXttjy5gc/7fzXv/QbBC0OY/0iRjcAAAAASUVORK5CYII=" + }, "/content/translations/it/developers/docs/consensus-mechanisms/pos/attestations/attestation_schematic.png": { "hash": "6f90b0ee", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC6UlEQVR4nH1TbUhTURi+mil+EKEYURB9aQpRRIFU1M9+GJYFCUWQ/tRUwgipH40kTRH7clJLyRwZNdeWC9em6EpzTl12dVdtm8J2vdvd9+6+b23t9F6n/qoOvJxz3/Oc57zPc96LYTBEInW6Rbu8SyqVbjUYDGlut7vJZDJ98XicnQihzdj/RnWb8LD0o+zDr8Elov9FHy4QSho9Hua2yWyS2Ffcy+Ss8xaHQ0iVAmRJiTVKh8iFyMC6JgxNE8SsjO2dufNJvGB+IlS+v9namskBFX2ofm7AqmOGhlvWDm7iZp/PV2s2mzUMw9Rjr9Q/ytR6YzVsHm3vxevudchKCEKVBZvHILdPPzJS5MAX8mGdFo/Ht3AEfr+/MBAIzIfD4eMYisXKqJWVEEVRv2Ox8GUOAOscP8MMBALBZy6Xq9bmtJUyXpc86HergPgKjuOZMIsikcgeLBQK7QDQGWAthVvykYifpVk0drRAPkFmrUOIyhkej1X0D0ceI0Sm0zS9DYz+zLJs/oaZJElW0DT1aHrSVCOV++IyVayCy6tUxHZurmuP1NxoZ7s9Ns8ht9t+AioQgxd5nDFJBEGkKkSKbLlcnmYYHc2dlFhaFd3+AoR4yQKBdvUZG96yxVV8VBQOBq85nc4qr9fbAwSJCoAkmcfjcc+UEvT7+TRt/RoKBR5w36Rev5PD8Pkoa+0FrgJBJVcByC7AotHoOdCE2+y2aThQHIl4dweDwbMAUEM/tIHWegNUtt4DQFBuhwqsVutrIDoAt/88YrFY+TRJ9zkcjlMcSKvVZrBs9ALLhi7a7XQNQkTquleAyYMuPQnRA5fsxS7xOveLJeLnEaluTCoQaV72Slo2jJ0kT5PfqesJmbzkv7byG5xqxJfmB0PiuWalZMHytEf5DiSVW23UXWIq9m1RaTO6lUP31/GcX2tyViVhD8d0JRLNzHnEoOxmgbayoUtR6nI4hEaj0U7bHYOuCV0hOT518F//0h+lYAyFuJ0k7wAAAABJRU5ErkJggg==" @@ -11,16 +15,12 @@ "hash": "57f56e8a", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC5ElEQVR4nH1TbUhTURieZoofRCgWGERfmkIUURQV9bMfhmX9EIog/amplBFWPxpFmiL25cQsQ1yfzul05dqmYWluM5ebbs6cGnO7d/O2j+7ddndvm3l6jzV/VQdezrkvz/uc93necwUCWBKJJpHUz22UyWRrrVZrAsdx1Tab7QPLMo8RQqsF/1ul9eJdstfy7rB61tzzqMPYJJZWhcPhqwRBdNFUcI4Yd1/GOIQG4oAs5vcZJUKkQyQJWrTWaq15XB56OXbtrdQyf1+s6rxUV5eMgcp2VDn+ZsFE972r/VO4Cu8ej6fc7XbraJquFDzRfCkYmp4uRWG0p+GpseJGozzPbDan0Cy7l0PcVrvGsI+xWLKWEEpYWkJrMIHf788JBoOTDMMcwKwF3yiKdTldP+F8GgMIC5EWYtneUCjUFAgEylmWzQ8EfIoF0jZAkuQZwCVDXgJebcYEGdDKUdbvz+cRykISUYpuaqaxlmUzMJnD4byIkCVNPbxY1NPH3cP6oXgd3P4eImvFTMpFFYVC9N3REbJMpmCW5AOLRTjf3z+xHu8VDVzZhQa+FYp3gskHGSYgBYJM3EEMaI5XKpWpeITWwcF0rdRRp2zlsxESxjY365fHePMVn1siQvtB+zmfz1cCRG0rHQBJrFAoxGOKA90ihqE/cj+42/jbYDBswBiRCKXgHYrPUhRVDERSMDMbFx/3ejxGr9c7CudcMGZTMMgfA4AGAPUArrQqFAnRNwD5QvCsxOl0PoNRbscEux0kKXLZXR0oHD6MQXq9PikSiZzkI/wpuLEMMPFRr3iez4TLDrlcrjYg2iLIuyLa1tElfcjJTEOypnZdy/Pu2ijYPvL1CGEmzi/LFApj//qUXxiJKuPspJqVTtSoOi3kgzZVO0V5Cp1O+/UpPfo8pXLPeFV9t6J47BeWE5UkuDNkyuvSjZ1ANEqtadYXVzX35kOb4nnbPPXdH1T7taYc+/CnHf/6l34Bv0ITVEKVXFMAAAAASUVORK5CYII=" }, + "/content/translations/tr/developers/docs/consensus-mechanisms/pos/attestations/attestation_schematic.png": { + "hash": "16bc3155", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC30lEQVR4nH1TbUhTURieZokfRCgWGESfphBFFEVF/eyHYVk/hCJIf2oaZYTVj0aRpohlOLH1Qbg+zLk2W7m2SawyddYcm875LbXPe+/udu/m7nbb1+k91vxVHTic957zvM99nvc9RyCAIZUOZTgN8xsUCsUa1YwqPR6PN9A0/SkaDT1CCK0U/G9Ut0h2Kd4qeyPaOcubhz2mDomsPhaJXVuwf5ezZHDeYfZcwTiEdGlAlvI7Rhkw82BmCh4PzzQMW8zKUJfx+nuZ9cd9ieb15ebmLAxUd6E68ztinO3/0PQncQVe/X7/BZvNpmdZtk7wZGCqbGh6thoO97Q9M9XebFeWWCyWbI/HszeM2C20ZXqf32otgPP0RCKxGhPwPF8UDAYnQqHQAcxaRhBujiCIOMSnMcBhdeT6aLqPYZgO/Deej5ayjE8V8Ht1MYTOmEymLNiXhsPhTZggH6Qc5TiuFOICJBVl6ydn25s4Lh+T0QxzCSF/rnYwVqHURFux/8XFxbWQ8xGUFCwXk3STFSTpumcaddfIVWxCqftZgffH5ol1eK1tC9dcbOOfQvJOkH4QFMiAYBtWkAKeV6nV6hyVSpU+Y/ycNyJzNuvEfCFCwlSx2LDUxluv+OIqEdofDPrP+Xy+KiDqXFYAJKlCoRC3Kc3r9YpcLtcX2kfdwd80x63HGJEIZeMVks+SJFkJBFhBIU4+DgU0kRT1DeJiJsxsBHnHADgEPluAsA4rS94BqH55IBCooijqOeC2Y4LdFE2LvIS3JxKJHMYgg8GQCR04GeACp4CoBltM1gr7BoJDTqezE7qwWVByVbS1W9bzgFOMDSg6uvWPX/Q2JcG2kYUjbit5fsmmUJj616v80uSoN89NaDnZWKNGbnW2dmq6GSZYTlHEjSkjGp3UELNeTf/tJB7XC9tJWhLcHRgvkeuNJxCLchrFhsp6cV9pNBqR2O12kuN4LT08XmQb/LrjX2/pFzj6EvcgdX5CAAAAAElFTkSuQmCC" + }, "/content/translations/zh/developers/docs/consensus-mechanisms/pos/attestations/attestation_schematic.png": { "hash": "daa8901e", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC4klEQVR4nH1TbUhTYRSeZg4/iFAsMIg+TSGKKIqK+tkPw7J+CEWQ+6mplBFWPxpFmiL25URXgrk+zLk2tTQ3CUtrrppjujl17gab+zTb7t3d3b13W3s7rzV/VS+8nPOe+7zPOc857xUIYMnl2jSXntioUqnWWq1WIc/zdTbC9oGLMI8RQqsF/1sVTbLdqtf9vRGNzdz3qMcolSlrI5HINfuCXUkthgjn5PcrGIfQSAqQJf32URrsHNjpgvZxa924ebI/3GW4/lZhsT+QqV9dbmzMwMChrnjN5BuviRx+1/Dn4ipsY7FYldPp1HEcVyN4op0tGTPPVaAI2tv21Fh9s6W/yGw2Z5IkuY9kya3kHLGfsljy4ggJ43G0BhPAxQKapqfD4fBBzFoCbIzH7f4J/hkMgHM2y7IDNB1qpSi6CuLF/iXf4KLPMQL+WY/HkwEJ5IDZjAlyl0jyWDAYLOYQykNySaZuZr6lgWFyMdlSIHAJISpbM8qL+obZ+1g/ZF8XCATeQyV5K82kqJAoFAremzJ6KlWDZHxgJCbCcYJA67GtbmYrLzZzHTTN7wKSQ1CBAgi24wqSQHOqVqvNssbjQsPoYM5npatxqIPLR0icLJXql8d46yVXKJKgA3w4fJ5hmHKSDHauVAAkyWKxGI8pheM5idu98JGP8nfwGcAbMEYiQZnYet3ecwRBlIEMXEE+vnzC6/UafT7fV/ALoTGbqFDoOFit3082QaYaq3VQmHgDEC+Fd1IO+GcURe3ABHvsCy6J1+npgQ9HMEiv16dHo9FTHMecJkl/JWBSE73CumF8h2ESnUC2RVB0VbKtR6loY1WmMVVrt679eW9DAuyYcBz1zfouLMsUi5P/+pRfGJ21Rtu0hlVM1auVFtfDTnU3jK7U4bDdmDWgiRm1d/6Hevh2Ao/79UfOsiTB3TFTkVJnOIlIlFUv1ZfVSgeKoUzZN4LwMWFOExw3FTg+fdn5r3/pF7DYExafletzAAAAAElFTkSuQmCC" - }, - "/content/translations/es/developers/docs/consensus-mechanisms/pos/attestations/attestation_schematic.png": { - "hash": "186d5aef", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVR4nH1TW0gUYRQezRIvRCgWGERXS4giiqKiHnswLOtBKIL0UVMpI6weWoo0RezmilqGuF1Xt1213HYVsTBveWHVca311thOMzu3nX/d2Zm09sS/qU/VeTn///Odj+875/wEQRBEfX13FD0wtcFisaxxuVyRqqoWURT1QVHmHgPASuJ/kVNm2G1509w43zpJNj1qcFQaGgs1bf4a9Y0yix7/lHuYv4JxAB0RABD25wxRAJAAANFETY+rqIccbg68HLr+zuSkHhjsry+XlsZgoM0IBcNv2VG5rb1ksXAFzgihPIqiemVZLiCedH9O7/wykQMAe6ueOvJvVjSnkiQZK8vyPhXULQJJ7kdOZ1IQIFIIBldjAp/Pl4wQGkMIHcSs6R6WVViG+QUAZzDA7UbxPllumZvzV0qSlKcoStqcT7IGFLkjEAicdTgcMZIk1auqugkTJMqyfAyDNIAkqNfH9o5PVJQoSiImYznuEoA7vr3rZ2ZTu3ofYDaKYZi1giC8RwglLTeTYZhMUfTc6+/7mmuxomBzx49M/D4yxa7DOb9czb1YrtVKkrQLieIhSZJMCKFtWEEYSZKrbDZbnNXqihwasib0menSjlptB4AuvLp6IDTGW6+0lGw9HPD70Xme57NFUaxbVgAA4TqdDo8pQhRFPcexHzmBu4PvgiCsxxi9HmIXJ3CO5/ksrMDn8+3AxSc4jnNwnNgPACler3ejX/Mf93q93bIkl/E8X2C1WiOXdgAhlIEVuN3uZzzPb8cEezhO0HMM2zAfCBzBIJqmoxcWFk5pC9ppQfDkYotLvcK+aZo+PDMzU8ey7GYi9ap+q9HUUKVaRjstlcbemueNoaXBMTs4fZRxMhdCNnW68L+u8guHu9AxOdaqmEaK7WYn/bDObhQEbwbLfb8xPgiD43Z2QrS33V7C434t2glZIu52jqaae4dOggxxxdUDWYXVLWmqqhhmpqc9CPlbhcHR5NmuTzv/9Zl+AwQtDmNPxT4PAAAAAElFTkSuQmCC" - }, - "/content/translations/tr/developers/docs/consensus-mechanisms/pos/attestations/attestation_schematic.png": { - "hash": "16bc3155", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVR4nH1TW0hUURS92UNKiSgsKIielhBFFEVFffZhWNZHUATlZ6ZRRlh9NBRphvTCEZsehPYwx8mpqSZHiaksHWuUGb2OpRk1OjP33rmPc+67Gccdx7Kvav/scw7rrLPW3vtQFEVRdnv79Ih/aKHT6ZzlHnCnp1Kpcp7n3yST+i0AmEr9L4ou161xPnM9SbR8oZ/ebAzU1DnKRhOjp78Of2tCrDo0EoyfJDgA7xQAmPRrDdMBIAsAZlC3OwbKO+igS6/vPvPSEfp+vc7z+ERlZQYBNtdDafA504taX136fXEyyRjjo+Fw2IcQKqXutH3a2/55sAgA1lXdC5Scq3bl0TSdGY/H1xuAlvL05w04FMoGgPSxsbGZhMA0zRxVVft0Xd9EWPcyTExjGCYFAPsIYCQ0Mkfk+ReSJNWQ10wzmY8k0S1jwTsKsD8QCGRgjO2GYSwmBPMRQts1TcsHgGywWzN9/YPVlzRtPiHjJek4AJ7T8n60wOVJXiP+FUWZixB6bZpm9p9isjG2gGWjVwNdseImNxpzeX8UkPOeIWYeySVVRvGxKvOuoiirdV3fjDF2mKa5nCiYRNP0tObm5tlutzt9oPttVqcjUum1mSsBLGk2m3+8jecfmbmFVtioqvigKIqFiqLU/lEAAGkWi4W0aYogCNZoNPqOF7mLZM9r2gKCsVohk2RRFA+wLHtYURSiYCW5vJNhmADLcR8BIFcypEUY4x2iKLYjhC4LglBKlE3MgKqqh2RZLuQ47j7GeAUhWMvxvFVghMZEIrGVgPx+/wxJknbLmrxHFMViYnGiVsS3LMtbIpFIrWEYS6i8U9ZlDY7GG5qzp81Z0+C7/eDJ+NCQCHd+3RYLsUfGbVosaX8d5YeBkbLgl74WzdFT4WkKRa7VehokST3EcczZT93Q1e9hBgVP64UJPKkXsTNhibrS1pvX5OveBQhmV9j8h8tsL/KTyUTd8PAwq2lmC9/RmxN+/2HVvz7TTzj6EvdL0AtEAAAAAElFTkSuQmCC" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-keys-data.json b/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-keys-data.json index 1cb8120918a..45ab7a7df5b 100644 --- a/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-keys-data.json +++ b/src/data/placeholders/content-developers-docs-consensus-mechanisms-pos-keys-data.json @@ -7,6 +7,14 @@ "hash": "fa02b5c9", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAAz0XRFWHRSYXcACmV4aWYKICAgIDY1MzIKNDU3ODY5NjYwMDAwNDk0OTJhMDAwODAwMDAwMDA5MDAwMDAxMDQwMDAxMDAwMDAwMmEwMzAwMDAwMTAxMDQwMDAxMDAwMDAwCjJkMDIwMDAwMDIwMTAzMDAwMzAwMDAwMDdhMDAwMDAwMWEwMTA1MDAwMTAwMDAwMDgwMDAwMDAwMWIwMTA1MDAwMTAwMDAwMAo4ODAwMDAwMDI4MDEwMzAwMDEwMDAwMDAwMjAwMDAwMDMxMDEwMjAwMGQwMDAwMDA5MDAwMDAwMDMyMDEwMjAwMTQwMDAwMDAKOWUwMDAwMDA2OTg3MDQwMDAxMDAwMDAwYjIwMDAwMDBjNDAwMDAwMDA4MDAwODAwMDgwMDQ4MDAwMDAwMDEwMDAwMDA0ODAwCjAwMDAwMTAwMDAwMDQ3NDk0ZDUwMjAzMjJlMzEzMDJlMzEzODAwMDAzMjMwMzIzMDNhMzAzNzNhMzIzNDIwMzEzNjNhMzIzMgozYTMyMzkwMDAxMDAwMWEwMDMwMDAxMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDA4MDAwMDAxMDQwMDAxMDAwMDAwMDAwMTAwMDAKMDEwMTA0MDAwMTAwMDAwMGIwMDAwMDAwMDIwMTAzMDAwMzAwMDAwMDJhMDEwMDAwMDMwMTAzMDAwMTAwMDAwMDA2MDAwMDAwCjA2MDEwMzAwMDEwMDAwMDAwNjAwMDAwMDE1MDEwMzAwMDEwMDAwMDAwMzAwMDAwMDAxMDIwNDAwMDEwMDAwMDAzMDAxMDAwMAowMjAyMDQwMDAxMDAwMDAwNGQxODAwMDAwMDAwMDAwMDA4MDAwODAwMDgwMGZmZDhmZmUwMDAxMDRhNDY0OTQ2MDAwMTAxMDAKMDAwMTAwMDEwMDAwZmZkYjAwNDMwMDA4MDYwNjA3MDYwNTA4MDcwNzA3MDkwOTA4MGEwYzE0MGQwYzBiMGIwYzE5MTIxMzBmCjE0MWQxYTFmMWUxZDFhMWMxYzIwMjQyZTI3MjAyMjJjMjMxYzFjMjgzNzI5MmMzMDMxMzQzNDM0MWYyNzM5M2QzODMyM2MyZQozMzM0MzJmZmRiMDA0MzAxMDkwOTA5MGMwYjBjMTgwZDBkMTgzMjIxMWMyMTMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIKMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyCmZmYzAwMDExMDgwMGIwMDEwMDAzMDEyMjAwMDIxMTAxMDMxMTAxZmZjNDAwMWYwMDAwMDEwNTAxMDEwMTAxMDEwMTAwMDAwMAowMDAwMDAwMDAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYmZmYzQwMGI1MTAwMDAyMDEwMzAzMDIwNDAzMDUwNTA0MDQwMDAwMDEKN2QwMTAyMDMwMDA0MTEwNTEyMjEzMTQxMDYxMzUxNjEwNzIyNzExNDMyODE5MWExMDgyMzQyYjFjMTE1NTJkMWYwMjQzMzYyCjcyODIwOTBhMTYxNzE4MTkxYTI1MjYyNzI4MjkyYTM0MzUzNjM3MzgzOTNhNDM0NDQ1NDY0NzQ4NDk0YTUzNTQ1NTU2NTc1OAo1OTVhNjM2NDY1NjY2NzY4Njk2YTczNzQ3NTc2Nzc3ODc5N2E4Mzg0ODU4Njg3ODg4OThhOTI5Mzk0OTU5Njk3OTg5OTlhYTIKYTNhNGE1YTZhN2E4YTlhYWIyYjNiNGI1YjZiN2I4YjliYWMyYzNjNGM1YzZjN2M4YzljYWQyZDNkNGQ1ZDZkN2Q4ZDlkYWUxCmUyZTNlNGU1ZTZlN2U4ZTllYWYxZjJmM2Y0ZjVmNmY3ZjhmOWZhZmZjNDAwMWYwMTAwMDMwMTAxMDEwMTAxMDEwMTAxMDEwMAowMDAwMDAwMDAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYmZmYzQwMGI1MTEwMDAyMDEwMjA0MDQwMzA0MDcwNTA0MDQwMDAxMDIKNzcwMDAxMDIwMzExMDQwNTIxMzEwNjEyNDE1MTA3NjE3MTEzMjIzMjgxMDgxNDQyOTFhMWIxYzEwOTIzMzM1MmYwMTU2MjcyCmQxMGExNjI0MzRlMTI1ZjExNzE4MTkxYTI2MjcyODI5MmEzNTM2MzczODM5M2E0MzQ0NDU0NjQ3NDg0OTRhNTM1NDU1NTY1Nwo1ODU5NWE2MzY0NjU2NjY3Njg2OTZhNzM3NDc1NzY3Nzc4Nzk3YTgyODM4NDg1ODY4Nzg4ODk4YTkyOTM5NDk1OTY5Nzk4OTkKOWFhMmEzYTRhNWE2YTdhOGE5YWFiMmIzYjRiNWI2YjdiOGI5YmFjMmMzYzRjNWM2YzdjOGM5Y2FkMmQzZDRkNWQ2ZDdkOGQ5CmRhZTJlM2U0ZTVlNmU3ZThlOWVhZjJmM2Y0ZjVmNmY3ZjhmOWZhZmZkYTAwMGMwMzAxMDAwMjExMDMxMTAwM2YwMGY3ZmEyOAphMjgwMGEyOGEyODAwYTI4YTI4MDBhNDBjMGIxNTA3OTFkNjk2YTI0ZmYwMDhmODk3ZjBhMDA5NjhhMjhhMDAyOGEyOGEwMDIKOGEyOGEwMDI4YTI4YTAwMjhhMjhhMDAyOGEyOGEwMDI4YTI4YTAwMjhhMjhhMDAyOGEyOGEwMDI4YTI4YTAwMjhhMjhhMDAyCjhhMjhhMDAyOGEyOGEwMDI4YTI4YTAwMjhhMjhhMDAyYTI0ZmY4Zjg5N2YwYTk2YTAzMTg5NjQ5OTFiMzgzYjdhMWM1MDA0Zgo0NTY3OWQyMjAyYjgzMjRmY2Y1M2U2MWM5YWIwOTY3MWE2YzM5NzYyOGU1ZDRiMzY0ZTQ4MjNmOTFhNTc2MmQ0YTdhNmQ4NTkKY2JhN2M0ZjI1YTQwZWVkOTI1OWEzMDQ5MzkzNTZiZmIzMmMzZmU3Y2FkYmZlZmQyZmYwMDg1Mzc0YWZmMDA5MDY0MWY0M2ZjCmNkNTdkNWY0YjlmNTI3YjczMTVmNGI2Y2IxMzAyYzIzNjYxYmM2ZjQ2MjBlMDhlYWFhY2JmZjAwMDJhNjMyZDdmNjZkODdmYwpmOTViN2ZkZmE1ZmYwMDBhM2ZiMzc0ZmNlM2VjNTZkZmY3ZTk3ZmMyYTE4NzRkNzU4MGFjZjcwZDM0ODZkOTIwMmNkZDMyMDEKY2I3ZDQ5M2NmZDA1NGYyNTk4OTI0OTVkODgyNWExZjI5NzIzZWVmNWNmZTdjN2U0MjgxZjQxM2ZiMzJjM2ZlN2NhZGJmZWZkCjJmZjg1NDRiNmI2ZjZmYWI0MjYwODIyODg5ODI0Y2VjNDBiOWY5OTNkMmFlYzY5ZTVjNDg5OWNlZDUwMzM1NWU0ZmY5MGFkYgpmZjAwZDcwOTdmZjQyNGEwNDVhYWNmYjhiNzg2ZTM1Njg5Njc4NjM5NDA4MTg4MGVhMGUzZTY1ZjVhZDBhYThkZmYwMDIxODgKZmYwMGViODM3ZmU4NGI0MDBiZmQ5OTYxZmYwMDNlNTZkZmY3ZTk3ZmMyODNhNmQ4MDE5MzY1NmQ4ZmZhZTRiZmUxNTYxYzE2CjQ2NTA3MDQ4MjAxZjRhY2Q4NzRhNzg2Mzk2M2ZiNGJjODkyMTVjODk1OTlmODBlNDkxYzkzZDU0ODVmYzI4MDJkN2Y2NmU5ZgpmZjAwM2U1NmRmZjdlOTdmYzI4ZmVjY2IwZmY5ZjJiNmZmMDBiZjRiZmUxNTAzZTlkMjMxYjkyYjI0Njg2NzY1MGM0MjY3MjgKMWJlNjFmNTJiOTE5ZWQ5ZjZjNTVjNDg3NjVjNGIyZTdmZDYwNTE4ZmE2N2ZjNjkwZTQ5MjdhMTU2ZWI0ZGIxMTY5MzExNjU2CmUwODQ2ZTdjYTVmNGZhNTU4YjJmZjhmMGI3ZmYwMGFlNGJmYzg1MmRkZmZjNzljZmZmMDA1Y2RiZjk1MjU4ZmYwMGM3ODViNwpmZDcyNWZlNDI5ODg5MjZmZjUxMjdmYmE2YWE0MWE2ZDg5Yjc4YzliMmI2Y2VkMWZmMmM5N2QzZTk1NmU2ZmY1MTI3ZmJhNjkKMmRmZjAwZTNkZTJmZjcwN2YyYTAwODdmYjMyYzNmZTdjYWRiZmVmZDJmZjg1MWZkOWJhN2ZmMDBjZjk1YjdmZGZhNWZmMGFhCmI3ZGE1Y2Q3NzdhYjcwOTc5MmM0YWFhMDA0NTc2MDMyMDNmMzgwNDAzY2IyOWZmODBkM2FlZjRjN2JhYjc5ZTMzMmE2NjY5MApiMTJjOTkwYTM2ZWQwMDczYzExYzFmY2ZkNjkzMmEyOTM3NjZlYzU4ZmVjZGIwZmYwMDlmMmI2ZmZiZjRiZmUxNDdmNjY1ODcKZmNmOTViN2ZkZmE1ZmYwMDBhNGZiMGU3Y2UyZDIxNjY5NjQ1N2M5ZmUxMGI4YzAxZWRjMTNmNTI2YWRkMzI0Y2FiMzgyMmI3CmYxMGRmMjQzMTI0NjlmNjU4MGVkNDUwMDY3N2NiY2YxNWFiNTlkMGZmYzhjOTdiZmY1ZTk2ZmZmMDBhMWNkNWEzNDAxMTRmNwoxMWRiODUzMjEyMDEyNDY3MWMwYzAyNzlmYzAxYTgzZmI1MmQzY2M0NGYzODZlNmUwN2Q3MTljN2Q2YWM0ZjA0NzczMTc5NzIKYWVlNDI0MWM2N2QwZTZhYTJlOGQ2MmFlMWM0NGMxODM2ZTA3N2I2NDFjNjMzZDZhNWYzNzQxM2I5MmFlYTM2OGU4OGUyNjE4CjcwMDhlM2Q0NmUxZmEwYTcxYmRiNjA4NWZjZTVkYWE0MDI3M2MwMjQ2NDY3ZjBhODk3NDliMzVlOTFiNzAwMDFmM2I3NjE4MQpkZWE1MzYzNmNkMDk4NWEzY2ExMjA5MDQ5M2NlMzE5Y2ZhZjE0N2JjMWE4ODc1MGIzMTljZGNjNzkwNzA3ZTZhYjA4ZWIyMjIKYmExMDU1ODY0MTFkYzU1MWZlYzdiMzBlMDg4YzgwMDM2MTcyNzhkYzAwMzhmNGUwNzZhYjkxNDY5MGM0OTEyMGMyMjAwYTA2CjdiNTM1N2VhMGFlM2VhMjhmOTlhNTNkYjgxNTIzMmFiOGMzMGM4YThhMTUwOTJjYTgzODAzMDQwYTYzMjZhMjhhMjgwMzM1Nwo0ODc4ZDc2YzVhOWRlYzY5OTM4NTUyOTgxZWRjYWQyZmY2NjRkZmY0MTZiZmZjZTNmZjAwZTIyYjQ2OGEwMGUyZmM2OTI2YmYKYTNlOGYxNDlhMTNlYTM3ZjdiMjVjNDY5YjM3NDJhYWE4NTg2NDkyY2EwNzNmNzQ3YmI3YjFhZGZiN2IxOWU3Yjc4ZTUzYTllCmE1MTk3NTBjNTFjNDYxOTczZDg4ZDlkNmE3ZDVmZjAwZTNjNTdmZWJlMjBmZmQxYTk1N2E4MDMzYmZiMzI2ZmYwMGEwYjVmZgowMGU3MWZmZjAwMTE1MjViNjllNjBiOTEzYmRlZGNjZWMxMGEwMTI5NWMwMDQ4MjdhMjhmNDE1NzY4YTAwMmFhNWQ1ODdkYTYKNjQ5NTZlYTdiNzc0NTJiOTg4YWYyMGUwZjM5MDdkMmFkZDE0MDE5ZGZkOTkzN2ZkMDVhZmZmMDAzOGZmMDBmODhhM2ZiMzI2CmZmMDBhMGI1ZmYwMGU3MWZmZjAwMTE1YTM0NTAwNzBkZTE5OWZjNDVhOTZiM2FkNDFhYjBkNGFjYWQ2MmI4YzU4NDg0YzQ3NwpjNTgxZjdiMGJjMzFlMWIwNzFjMzYzYjFhZWEzZmIzMjZmZmEwYjVmZmU3MWZmMDBmMTE1MzU5ZmZjN2Q1ZmZmMDBkNzcxZmYKMDBhMmQyYWRkMDA2NmI2OTMyYmEzMjM2YWI3ZTU1ODYwOGNjN2QzZmVmOGFkMDhhMzU4YTI0OGQ3M2I1MTQyOGNmYTBhNzUxCjQwMDhjYTFkNGE5ZTg0NjJiMzk3NGE5NTU0MjhkNWFmYzAwMzAzOThmZjAwZjg4YWQyYTI4MDMzYmZiMzI2ZmYwMGEwYjVmZgowMGU3MWZmZjAwMTE1Y2E3OGFlZjM1ZWQyNzVhZDAyZGI0ZDdkNTZlZWRlZTZlOGFkZTNhNzkzYzI2YzczODVjYThjYjdjYTUKYjhlYzk4ZWUyYmJjYWM1ZDZmZmU0MmJlMWNmZjAwYjA4YjdmZTkyY2Y0MDE2N2ZiMzI2ZmZhMGI1ZmZlNzFmZjAwZjExNDdmCjY2NGRmZjAwNDE2YmZmMDBjZTNmZmUyMmI0NjhhMDBhNTY3YTcwYjRiOTlhZTFhZTY3OWU1OTUxNTBiNGE1Nzg1NTJjNDAxOAowM2ZiYzZhZWQxNDUwMDE0NTE0NTAwMTQ1MTQ1MDAxNDUxNDUwMDE1MTI3ZmM3YzRiZjg1NGI1MTI3ZmM3YzRiZjg1MDA0YjQKNTE0NTAwMTQ1NjVkODVhMjRmNjUxY2IyNGI3MmNlZDkyNGZkYTY0MWRjZmYwMGI1NTY3ZmIzYTBmZWZkY2ZmZTA1NDlmZjAwCmM1NTAwMzM1N2ZmOGYxNWZmYWY4ODNmZjAwNDZhNTVlYWE0ZmE1ZGI0OGJiNWNkYzMwYzgzODM3MzIxZTQxYzgzZjdiZDQ1MwpiZmIzYTBmZWZkY2ZmZTA1NDlmZjAwYzU1MDA1YmEyYWE3ZjY3NDFmZGZiOWZmMDBjMGE5M2ZmOGFhOGQyMDViN2Q1MjEwOTIKNGM1NWExOTA5NTc5OWRjNzBjOTgzODI0ZmE5ZmNlODAyZmQxNDU1MGI4ODg0ZmE5YzUxYmJjYTEwNDJjZDg0OTU5MzlkY2JlCjg0NjY4MDJmZDE1NTNmYjNhMGZlZmRjZmZlMDU0OWZmMDBjNTUxZmQ5ZDA3ZjdlZTdmZjAyYTRmZmUyYTgwMGIzZmY4ZmFiZgpmZjAwYWVlM2ZmMDA0NWE1NWJhYTZiYTY1YjI5NjJhNmUwMTYzOTYyMmU2NGU0ZTMxZmRlZjQwMjk3ZmIzYTBmZWZkY2ZmMDAKZTA1NDlmZmM1NTAwNWJhMmE4NWNkODQ0OTZiMmIyYzk3NDA4NDI0MWZiNTQ5ZTlmZWY1NTliMzYyZDY1NmVjYzQ5NjMxYTkyCjRmN2UyODAyNmEyOTkzMTIyMTcyMGUwZWQzNTUyMWIwODVhMDhkOGM5NzI0OTUwNGZmMDBhNTQ5ZTlmZWY1MDA1ZWFjNWQ2ZgpmZTQyYmUxY2ZmMDBiMDhiN2ZlOTJjZjU3ZmZiM2EwZmVmZGNmZjAwZTA1NDlmZmM1NTMyNGQyMmQyNTc4OWU0MTNiYjQ0ZGIKZTMyZDcxMjEyOGQ4MmI5MWYzNzA3MDQ4ZmExMzQwMTdhOGFhOWZkOWQwN2Y3ZWU3ZmYwMDAyYTRmZjAwZTJhOGZlY2U4M2ZiCmY3M2ZmODE1MjdmZjAwMTU0MDE2ZThhY2NiNDQzMGViYjc5MGFjOTMzNDYyZGEwNzBiMjRhY2UwMTJkMjgyNDY0OWM2NzAzZgoyYWQzYTAwMjhhMjhhMDAyOGEyOGEwMDI4YTI4YTAwMmEwMjllNjQ5MzJlZjY1Y2VkZTU0ZTBkNGY1MDkzZTU0Y2NjNDFkYWMKMDcyMDY3OWEwMGE4NzRjOTE4NjBkZmRjNjc5YzkwNzFmZTdhNTU4OGVkNTkwYTE2OWU0NzJhYzRmY2M3ZDdmY2ZmMDAzYTkzCmNmNGZmNmJmZWY5MzQ3OWU5ZmVkN2ZkZjI2OTcyYTE1ODgzNGFmZjkwNjQxZjQzZmNjZDQxYWFjMWFhNGNmNmZmZDlkNzJiMAphMDYxZTZlNDBjOTFiZDMzOGM4M2ZjMWU2N2UzOGEyMTg2NmI3ODg0NTE1ZTkwOGI5YzAzMDY0OGU2OWZmZTkzZmYwMDNmYmYKZjkyZmZmMDBkN2E2MzEyMmI2YmU3ODA5Yjk5Yzc5YzZkOTIzYzQ2NzAwNDk4M2I5YjNlZTcxZjk3YmQ0YjcxNmQzNGFlZWNhCmU3MWU1YWFhYTg3MmJmYzU5NmU5ZWEwMDE5ZWQ1ODNlMjhmMTBjZmUxY2QyN2VkOWU3MzVjNGFkMjI0NzFjMjk2ZmYzM2U0OApjZTM5ZWMzMjdmMGFkNjgyNzk2ZWFkZTM5ZTFkNDU1ZTI5MTQzYTMwODM4MjBmMjBmNWEyYzE3ZDJjNWZiNjQ3OGVkYTI0OTAKZTVkNTQwNjM5Y2YzOGY1ZWY1MTQ5ZmYyMTViN2ZmMDBhZTEyZmYwMGU4NDk1MGZmMDBhNGZmMDBjZmY3ZmU0YmZmMDBmNWU5CjYyNTY1YmE1OWU2YjkzMjZkNDY0MGEyMmRiZDQ4MzlmZmM3NjgwMmZkNTQ2ZmYwMDkwYzQ3ZmY1YzFiZmY0MjVhOWJlZDExZgphOWZmMDBiZTRkNTU5ZDdjY2I5NDllMmI4MzEzMmExNDM5OGY3MDIwOTA3ZmE1MDA1ZDdkYzUxODI5YzM2MGUzZWI1OWQxNWEKZWEwMjI5NjM5YWU3Y2QwZmI0MDJjNDAyMDZmM2JiZWU4MWZjMzhmYzY5ZjliOWZmMDA5ZmUxZmYwMDgwZmYwMGZkN2EwOWI4CjAzMjZmYzdmZGY4ZmZlYmQwMDM1ZWRhZjBiNWQxNDIwNzljY2FhYjk5NGUwMjY3MGM0N2ExZGE0ZTMxZGMwZmFkNGQ2ZjA1Ywo0NzdkNzEyNDhlNGM2ZmY3N2Y3ODRlN2QzZTVlOGI4ZTljNzVhZTdiYzM5ZTI2OTNjNDMyNmEwOGIyYzk2ZTZkNmUwYzY5ZTYKNDAzZjdkMWZmMGM4YmNmNDNjZDZlZTZlN2ZlN2Y4N2ZlMDNmZmYwMDVlOTU4NzI3Y2NlZWNiNTc3ZmYxZTczZmZkNzM2ZmU1CjQ5NjNmZjAwMWUxNmRmZjVjOTdmOTBhYTkyMmNmMjQ2YzhkN2UzMGMwODM4ODNmZjAwYWY1NmExOTIyODYxOGUyMGM0ODQ1MAphMDkwN2IwYTYyMjU5YmZkNDQ5ZmVlOWE0YjdmZjhmNzhiZmRjMWZjYTlhZjM0NGU4Y2JiODhjOGM3NDM1NTExNmUxMTE1NDUKZjhjMDE4MWZiOGZmMDBlYmQwMDM2ZjYwZDRlNGJkMGY2Yjc0MjM4MDI4ZjkzOGU1YjBmOWNlNDFlZmU1ZmUwMGQxNzk2YjdiCjM0MzJmOTZmODkxYTVkYzk4OTU5MDIwMGI4MWQzYWYzYzkxZWZlZDRmY2RjN2ZjZmY4ZmYwMGJmMWZmZDdhYzBmMTE3OGEyNApkMDJmNzRhODFhZTdjZDE3OTcxZTVjY2MyMGZmMDA1MzFlZDNmMzllN2E2ZWRhM2U5OTNkYTkzNTcyYTMyZTU3NzQ2ZTVlNTkKZGVjZDFjZTYzOWM4Njc5MzI4MDM5NGQ4YTEzMDM5MWZlZDdjZGZhNTY5OGU5Y2Q2N2U2ZTNmZTdmZDdmZWZjN2ZmMDA1ZThjCmRjN2ZjZmY4ZmYwMGJmMWZmZDdhMmRhZGM5MTIxZmY5MTkyZjdmZWJkMmRmZmYwMDQzOWFiNDZiM2FkYTIxMGRlY2Q3NzJkYwo5OTY0OTYzNDhmMWU1ZWQwMDI5NjIzZmYwMDQzMzVhMGFjMWQ0MzBlODY5ODBiNDUxNDUwMDE0NTE0NTAwMTQ1MTQ1MDAxNDUKMTUxOTlkMDEyMzkzOGUzODE0MDEyNTE1MTc5ZTllOGRmZjAwN2M5YTNjZjRmNDZmZmJlNGQwMDRiNDU0NWU3YTdhMzdmZGYyCjY4ZjNkM2QxYmZlZjkzNDAxNTc1NzAwZTllNGUwNjQ0OTFmM2ZmMDA2ZDE2YWYwMDAwYzAwMDBmNmFjZWQ1YTc1M2E3OTE4NgpmZjAwNTkxZmYwOWZlZmFkNWRmM2QzZDFiZmVmOTM0MDEyZDE1MTc5ZTllOGRmZjdjOWEzY2Y0ZjQ2ZmYwMGJlNGQwMDRiNDUKNDVlN2E3YTM3ZmRmMjY4ZjNkM2QxYmZlZjkzNDAxMmQyMTAwODIwODA0MWVhMGQ0N2U3YTdhMzdmZGYyNjhmM2QzZDFiZmVmCjkzNDAxMWRiMjhmMzZlMGUwNjQ0OTgwN2ZlMDJiNTY2YTlkYmNlYmU2NWNmMGRmZWI3ZmJhN2ZiYTJhN2YzZDNkMWJmZWY5Mwo0MDEyZDE1MTc5ZTllOGRmZjdjOWEzY2Y0ZjQ2ZmYwMGJlNGQwMDRiNDU0NWU3YTdhMzdmZGYyNjhmM2QzZDFiZmVmOTM0MDEKMmQ2NWVhY2EwZGVlOTA3MDM5YmNjMWZmMDBiZjUyNTVmZjAwM2QzZDFiZmVmOTM1OWJhYTRjYTZlZjQ5Mzg2ZTJmMzNkM2ZlCjk5NDk0MDFhZmQwNjA1MTUxNzllOWU4ZGZmMDA3YzlhM2NmNGY0NmZmYmU0ZDAwNGI0NTQ1ZjY4NGY0NmZmMDBiZTRkNDhhYwoxOTQxMTljN2JkMDAyZDI2NDdhOGE4MmYyZGRhZWFkOGM2OTI3OTZjNDhjMzYzMzhmNWZkMzM1NDIwZDEzYzgyMDA5Yzk1ZGMKYmRjODM4NTI3MWM4M2Q3Njg1MWY4NjZhNWI3N2Q4ZDIzMTgzNTc3MmIzMzVlOGFjYzFhNzVjODBmOWJiNjJlNTQwMGRiOTgxCmUwMzBmNWZmMDA2ODdlNTUxZmY2NTVmNjNmZTQyOTI5M2IwMmUzOWVhMDYzM2Y1ZWE3ZWI4ZjRhMmVmYjBmZDljM2Y5OGQ3YQoyYjJhMmQyZWU5MmNlZGUzMzdlZmU3Yzc5MmYyODVlNjQyN2FlN2Y5ZmQ3ZGIyMGM5NjU2NTc1NmYzMjk5YWYyNTk5MTUwODIKMThlNzczMTNkN2YwMWM1MTc3ZDgxYzIyOTNiNDhkMWE4YWRmZmQ0MmZlM2ZjZTlkMjA3MmJmMjEwM2VhMjkyMGZmMDA1MDk4CmY0YWEzMjI0YTI4YTI4MDMzZWNkNmUyZWFkNTI2NmJjOTU0YmU0ZTE1NTMwMzlmNzVhOWZlY2QzN2ZjZmY0ZmYwMGY3Y2E3ZgpmMTM0Y2QyYmZlNDE5MDdkMGZmMzM1NzI4MDI4ZGM2OWVmNzMxNzk1MjVmNWM2ZGM4NmUxNTNiMTA0N2YwZmI1NGJmNjY5YmYKZTdmYTdmZmJlNTNmZjg5YWE5MTVkZWE1YjI2Njk2ZDk3ZmQ1YjM0NmE4YTQxZGMwMjkwMGU0ZjcyYzQ3NmZiYmY5NWQ4ZmNlCjE3MGM4ZTc3NDYyMzVjMzZkYzY1YjljZmY0YTA2OTBkZmIzNGRmZjNmZDNmZmRmMjlmZmM0ZDMxM2NlOGFmZTM4OWFlMWU1NAo3ODlkODg3NTUxODIwYWUzYTAxZWE2YWU1NTU5M2ZlNDJiNmZmZjAwNWMyNWZmMDBkMDkyODExNmFhOWNlZDJiZGZjNzAyNGMKZDEyOTg5OWNlZDBhNDkyMDgxZGMxZjVhYjk1NTFiZmU0MzExZmYwMGQ3MDZmZjAwZDA5NjgwMWRmNjY5YmZlN2ZhN2ZmYmU1CjNmZjg5YTNlY2QzN2ZjZmYwMDRmZmYwMDdjYTdmZjAwMTM1NjZiMmY1NmJiZDRhZDhlNmMyZDU2NzAyMzY2MjE4MTM5MjAxMgowMGMxZWY4YzdlMzQwMTYxMmNhNTQyZTQ1ZjRmOTc2ZGM3ZTU0ZWI4MDNmYmJlZDRmZjAwYjM0ZGZmMDAzZmQzZmYwMGRmMjkKZmYwMGM0ZDQxNzEyZGUwNTlkZDM3YTgwNTU2MzUwOWJiOWM2NGI3NGU5OTM4ZWZmMDA3N2RlYWY4Y2VkMTllYjhhMmUzYjY5CjcyOWNmMGNmMTViYzkyMGJlOWIyYWE0OGNhYTc2MWZlZWQ1OGI2OTFhNWI0ODY0NmZiY2U4YWM3ZWE0NTI1ZGZmYzc5Y2ZmZgowMDVjZGJmOTUyNThmZjAwYzc4NWI3ZmQ3MjVmZTQyODExMmM4YzU2Mjc2MWQ0MDI0NTU1OGEwOWRlMjQ3MzdkMzY1OTQxZmIKYTlmZjAwYzRkNTk5YmZkNDQ5ZmVlOWE0YjdmZjAwOGY3OGJmZGMxZmNhODAyMmZiMzRkZmYzZmQzZmZkZjI5ZmZjNGQ0MzNlCjk4ZDcxMjViYmJkZjVjNjYwOTNjYzRjMDRlYmI0YWYzZjJmYTMxYWI3NzBmMjQ3NmQyYmM0OWJlNDU0MjU1N2ZiYzcxYzBhYQozMGNmYTgzYTQ4OTM0NmE4ZmU2MDBhZTg4NDAyYmJjODI3OTI3Zjg0NjdmZTA0M2YxMDBiM2Y2NjliZmU3ZmE3ZmYwMGJlNTMKZmYwMDg5YTNlY2QzN2ZjZmY0ZmYwMGY3Y2E3ZmYxMzQ5NmIyNGVmNzE3MjI1MDdjYjU2MWU1OTJiOGY1ZmYwMGViN2FmNWZjCjA1YWE0OWRjNzI1Njc2MzNlZGE1OTk3NTdiYWI0OTI2Njk2MzhlMDhhNDUyYzAwMjBiMzQ4MGY0MDNmYjgyYjQyYjNhMWZmOQoxOTJmN2ZlYmQyZGZmZjAwNDM5YWI0Njk4ODI4YTI4YTAwMjhhMjhhMDAyOGEyOGEwMDJhMTgxOTQ0MmEwYjAwNDc1MDRkNGQKNGMzMTQ2NGU0YTI5M2Y0YTAwNWRlYmZkZTFmOWQxYmQ3ZmJjM2YzYTRmMjYzZmVlMmZlNTQ3OTMxZmY3MTdmMmEwMGNmYjYxCjdkNmI2ZWIwYWE1YTNhYTY0MDYzMzMwMjQ2N2QzNmQ0YmU3NmExZmYwMDNjYWNmZjAwZWZmYjdmZjEzNTZmYzk4ZmZiOGJmOQo1MWU0YzdmZGM1ZmNhODAyOGNiNzFhOTI0NGVjOTZkNjZlYzAxMjEzZWQwYzM3MWY0ZmJiNDk2ZjdiNzk3MzZlOTM0NTE1YTEKNDcxOTE5OTk4MTFlYzQxNGM4M2VkNTdmYzk4ZmZiOGJmOTU1MDlhMjRkM2VlYmNmMDgzZWNiMjljNGMzMWM0NmRkOWZkODFlCjg3ZjAzZWE2ODAyNGYzYjUwZmY5ZTU2N2ZmMDA3ZmRiZmYwMDg5YTIyMTcyZjdjOTM1YzBiNzQ0NDhkOTAwOGU0MmM0OTI1NApmNzAzZmJiNTZmY2E4ZmZiOGJmOTUxZTU0N2ZkYzVmY2E4MDE3N2FmZjc4N2U3NTRlZTE2NzE3OTFkYzViZjkwZDg4ZDkwODkKMjQyYmQ0ODNkODFmNGFiN2U0YzdmZGM1ZmNhOGYyNjNmZWUyZmU1NDAxNTNjZWQ0M2ZlNzk1OWZmZGZmMDA2ZmZlMjY4ZjNiCjUwZmYwMDllNTY3ZmY3ZmRiZmY4OWFiN2U0YzdmZGM1ZmNhOGYyYTNmZWUyZmU1NDAxNDYzYmFiZjkxYTQxZTRkOThkOGRiNwpmZDdiNzNjMDNmZGRmN2E3ZjlkYTg3ZmNmMmIzZmYwMGJmZWRmZjAwYzRkM2VkZTI4ZmNjYjlmOTE3ZmQ2ZmE3ZmIyYjU2M2MKYThmZjAwYjhiZjk1MDA1MTk1YjUwOTYxNzhmY2FiMzFiOTRhZTdjZjZlMzNmZjAwMDFhYjc2ZTA0MzZkMTQ0NWQ0OTQ0MGE0CjgzZTgyOWZlNGM3ZmRjNWZjYThmMjYyZmY5ZTZiZjk1MDAyNDg1NWUzNjUwY2I5MjA4ZWI1NGUzN2Q0MTIzNTRmMmFjY2VkMAowNjdjZjZmZjAwZTI2YWVmOTMxN2Y3MTdmMmEzYzk4YmZiOGJmOTUwMDU0ZjNiNTBmZjAwOWU1NjdmZjdmZGJmZjg5YTgwZGYKNmExZjZjNWI3NGI3YjQ2M2I3NzQ4ZGY2ODZjMjBlZGZjMWQ0OWVkZjVmYzZjNWU0ODkwMjJhNDUwYWM5NzEyOWRiMWE3ZjMyCjdkODc1M2ZlMjQwYTdkYWQ4YzU2ZDE2ZGMwNzc2M2I5ZTQyMzk3NmVlN2ZjZjQxODE0MDExZjlkYTg3ZmNmMmIzZmZiZmVkZgpmYzRkMWU3NmExZmYwMDNjYWNmZjAwZWZmYjdmZjEzNTZmYzk4YmZlNzlhZmU1NDc5MzE3ZmNmMzVmY2E4MDI5NWE0MzM4ZDQKYWU2ZWVlMGMwYmU2NDMxYzRhYjFiOTZmYmE1Y2U0ZTQwZmVmZmU5NWEwMDgyMzIyOTllNGM1ZmYwMDNjZDdmMmE3MDAxNDYwCjBjMGEwMDVhMjhhMjgwMGEyOGEyODAwYTI4YTI4MDBhMjhhMjgwMGEyOGEyODAwYTI4YTI4MDBhZTVlNmQyYWMyZjI1Yjg3Ygo5YjI4MjY2Nzk2NDBjNjQ4YzM2ZTFiODhjMWNmYjU3NTE1NTlmNGZiMjk1Y2JjOTY5NmVlZWRjOTY2OGMxMjdmNGFjNmI1MzcKNTIzNjRlYzRjOTVkMWM1NGI2NTM0NzMzMjQ3ZTFjYjM5MjMyY2ZiMWY3ODVjMDFmNzcyMzA3YWY1ZTNhN2E1Njk0MWE0ZDhjCjkxODY5NzRiYjc4OTg4MDc2OTQwNDhlMDY0MWZhMWM4YWRlOWI0N2QzNjc4NWUyN2IxYjdkYWMzMDRhYzYwMTFlZTBlMzgzNQo1ZWQ2Y2VjYzRhNmNlZTZjYWQ4Y2U4YmI5NWZjOTUwMjU1ZmVmMGUzMTlmNTFkYjhlYzQ1NzNiYzI0YmY5YmZhZmJjOWU0N2QKYzZlODc2ZjBkYWNiNzkxNDExMmM2OTk0M2I1NDYwNjcxNWIxNTE0MzZmMDViMjk1ODIxOGUyMDRlNDg0NTBiOWZjYWE1YWViCjg0Nzk2MmEyY2I0YWM4YzBmMTNjNjkzYmU4ZDBjYWExZTM3YmUyMTkwZjIxODc5MTMxZTQ3ZDQwM2Y4NTY3NWU2OTU2ZjEyNAo2NmQ3NDliNTk0ZWVmOWMxNTAzZTVjMTNjN2JlNDAxZjhkNzU5MzViYzM3MmExNjc4NjM5NTQxYzgwZWExODAzZWJjZDQzZmQKOTlhN2ZmMDBjZjhkYjdmZGZhNWZmMGFjNmI1MDk1NDk3MzI5NTg5OTQ2ZWNlM2FkMmM0Y2E4ZWQ3MWUxZGI1YjcyNzY5NTAwCmFiOTM5YzY3M2QzYTdhZmI3ZTc3ZTVkMzJjNmRkYWRlNTg2ZDIxOGU0NWI5ODcwY2E4MDExZmJjNWFkYWI3ZDM2YzBjOTcxOQpiMmI2Mzg5NzhmZGQyZmY3NDdiNTU5NWQzYWM1MTk1OTZjYWRkNTk0ODIwODg5NzIwOGVmZDJiMzU4NTkyOTI3Y2RmZDdkZTEKY2FjYjM0NTE0NTc2OTY3MmE5YTVkOGNlZDM0YjJkOWMyZWVkMzQ4NGIzMjAyNGZjZTZiMjI2YjRiOThlZTRjNzFmODY2Y2E1CjhjYmJlZDkzY2M1NWMyOGZiYjkxODNjOWY2Y2Q3NmQzNThlOWNhYWYzNGQ2YjZhMDBjYjNiYmM2YmY1MjQ5YWE1NmRhNWRhNQpkY2EyZjI0YjA4MTIzYzdlZTYyMzEwMDcwN2Y4OTg2M2E5ZjRlYzNkYzljNzEzYzJjYWVkZjM3ZjVmNzk5ZjIzZWU2NGMxYTMKZDg0ODU5ZTVkMmFkYTM2MDcwYmYyMjkyNTcwM2ZhZmYwMDJhZDdmMGZjNDkwNWJkZGM1MTIwNDhkNmU1ODJhYThjMDFmMmFkCjVkZmVjY2QzZmYwMGU3YzZkYmZlZmQyZmY4NTRkMGMxMTViYTZjODYyNDhkMzM5ZGE4YTAwY2ZlMTVhNTFhMTJhNzJiYjk1YwphNGI1YjkyNTE0NTE1ZDI1MDUxNDUxNDAwNTE0NTE0MDA1MTQ1MTQwMDUxNDUxNDAwNTE0NTE0MDA1MTQ1MTQwMDUxNDUxNDAKMDUxNDUxNDAwNTUzZDUyMjU3YjE5MjVlOTJjMGE2NTg5Yzc1NDYwMGYyM2Y1MWVlMDkxNTcyYWI2YTFmZjIwZGJhZmYwMGFlCjJmZmM4ZDAwMzE2MWJkMmEwZmRiMTc5MWZmMDAzYzQ3ZjhkMzY1ZjNlMDQwZjM2YTMxNDZhNTgyODJmMTgwMDkyNzAwNzI3YQo5M2M1NWM0ZmY1NmJmNDE1NTM1NWQyZWRmNThiMDdiM2JhZGZlNTMxMGQ5NDM4MjA4MzkwNDFlYzQxZTczNDAwOTE3OWYzNDQKYjJjNWE4YzUyNDZlMDMyYmFjNjA4MjBmNzA3MzRlZjJhZWZmMDBlN2Y5M2ZlZmQwZmYwMDFhYzRmZjAwODQxMzQ4MGZiYTM3CmI5OGM2YzA4NTUxZDQyOTUwMTgwMThjN2EzN2U4M2I2NDFjYmJiZDMzYzM5ZTFmZDc2ZGVkZTczNzRiZjZiN2YzMTUwZTBjNQpiYjAxNDJlMzZmNzBhN2U1MDc5YzkzODM4Y2E4MDc1NzBjMzNmZWYxZTNkNDIzNjBjZTc3MTExODM4MjM4MjNhZmI1M2Q1NmUKMWMxMmJhODQ0YzAxMjA5MTE4M2M4ZWEzYWQ2M2RhZjg0YjRkNGIwYjg1YjRiYTk5YTNiYzhmZmQ2OTI5MjcwNWI3ZTQxMmJjCmU3M2QwZTQ3YjcyNzI4OWUwNWQyMjNiNTY4MTFhZTAwNjRkOWJiNzI5NjFmMzY3NzAyNDdkZWVkOWY0ZTI4MDM2ZmNhYmJmZgowMDlmZDRmZjAwYmY0M2ZjNjhmMjJmM2ZlN2YxN2ZlZmM4ZmYwMDFhY2VkMzdjMmQ2NWE1ZWEyZjdkMGNmNzJmMjNiM2IxNTkKMWMxNWNiMTFkODAxZDNhMGZkNzM4MThkY2EwMGNkNzgyNTkyZmVkZTFiOTlmY2Q4YjZiNGJiMDI2ZDA1OTRhZTMzZWEzZTZjCmUzZDQwYWQyYWFiMjdmYzg1YWRmZmViODRiZmYwMGExNDc1NmE4MDBhMjhhMjgwMGEyOGEyODAwYTI4YTI4MDBhMjhhMjgwMAphMjhhMjgwMGEyOGEyODAwYTI4YTI4MDBhMjhhMjgwMGEyOGEyODAwYTI4YTI4MDBhYWRhODdmYzgzNmViZmViOGJmZjAwMjMKNTY2OTkyYzRiMzQyZjEzZTc2YmE5NTM4ZjQzNDAwYTlmZWFkN2U4MjlkNTllMzRkOTQwYzBkNTJmYjFmNThmZjAwZjg4YTVmCmVjZDk3ZmU4Mjk3ZGY5YzdmZjAwYzQ1MDA1ZmFhYmE4NjlkNjdhYWQ5YjVhNWY1YmE0ZjAzMTA1OTFmYTFjMWM4ZmU1NTE3Zgo2NmNiZmYwMDQxNGJlZmNlM2ZmZTIyOGZlY2Q5N2ZlODI5N2RmOWM3ZmYwMGM0NTAwNzhhNWMzNzg4N2MzMWUzMDlmNDkxYWMKNWVjMTZmMTI5OWVkYjc0NTM0ZmYwMDZiNzMyMTA5MThkYTc2YWZjOWI3MjQ4ZTRmMmQ5YzlhZjc0YjU2OTllY2UwN2I5NDA5CjNiNDZhNjQ0MDcyMTViMWM4ZmNlYWExZDJkY2IwNjNhOTVlMTYxZDA5ZjJmMjNmZjAwMWNhNzdmNjZjYmZmMDA0MTRiZWZjZQozZmZlMjI4MDJmZDE1NDNmYjM2NWZmMDBhMGE1ZjdlNzFmZmYwMDExNDdmNjZjYmZmNDE0YmVmY2UzZmYwMGUyMjgwMjU5M2YKZTQyZDZmZmYwMDVjMjVmZjAwZDBhM2FiNTU1MmRlYzRjMzcxZTczZGQ1YzRlYzE0YTBmMzRhZTAwMjQxM2QwMGY0MTU2ZTgwCjBhMjhhMjgwMGEyOGEyODAwYTI4YTI4MDNmZmZkOTAwCuBFZDEAAAHISURBVHicfZFJS0JRFMcvtegD1Ddo3UdoETSCRUQDpTbQ5GsgWhhYRvSKQIpIoqykFvmyAZ+CPAK12rgpo0XurEVSFJKRNpib6p/3WGEF/eFyh3Pu757/uQwZSiaTNOLx+Pf8NTLPM9fs64Dr+uYanr1dqNVqdHe0w2gcxo7DgRatFs1aDWySBLPZjJrqarSm9n6/H8zjU7AqLePk9Jiosdg9FEWBVqNBIBAg+Mz0NARBoHgkEoFer4cojqcrSLwk8Jx4wuvbKwXD4QsCyLIDPp8XoVAILqcTGxsSgsEgvcr3a2urqdwwWGYPuAW34oJOp0NFeSlZ4LD6uloUFRWSHYvFgpLiYpSXlVCF7HcTo7dRetVkMlECr0qWZSwsLtL66vISdrsdS0vLaQtuyYa50RG4beufFsIwDBsw2D8A64qVLk9MTGJsZJQuyrKTYkJXJw6PjsCeHx8Qu4uCz7xJHKAou+jtE9DT35mq4hAG4xBa2hrI/5RpHE2aemxtblGlfyxwCNfs/BQYY5Bd22hsq0J+QR7BcnIZGltV3/k/AL91dnZOvcjKyiaYKIo42D+g2Nv7O83/AtJ2FFRWqgjg8XrJBhf/dq4Pwlw0HW21aGIAAAAASUVORK5CYII=" }, + "/content/translations/es/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png": { + "hash": "326d987a", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAIAAABiEdh4AAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nG1STU/bQBC14O8FjvkPHCL1gHohSKCKA6iH9JBecykHLjlwQRUhmGBjY8vGWFEwJjGWGyJqJ3Eckw9jlvDqdWmAPmnH83b2zezOmJnN4ZmQJ0Lmd+I4nr0FU6/XdV1XFEXTNNgLLYWqqnICPQE9gMOM4zjgpmk2m03DMOZpo9GwHQfWMK4sy4LTbrcZ27aPKkeiICqKeqnr1u0te8xK55J0LuuXOqI8f1arcdqFJggi0jG4luWYh8f7klobhH3Qe++Ok6qs+LPX/w06DAc1scLL7K97+88bsPyhV2EPzFZjGk8IeX4YD0SZE5TT8TQEfYynvHxyJp8GYz8VAJ7rjkYjOLRLQRD0uj04UfQI20+Qdgmr0+lsbG6Wy2XaRCgLhUKxWKQpoigqlUrbOzvIkgrQkE8rK3u7PyaTCeggCL6sr3/d2vJ9n+q/fyusfV71XC8VhGHYur6WeL7b7YISQmSBP6lWSQLXdUWOa92YNB3zOkKURhOhwcUQG4ZDOKBoJUL/Jk0/5C/gY5yLCwuZTAZH34XeVKBFYHO5HJNgeXkJlN7kfYV5QT6fp4JsNvu6+X8BrYtXFhPgz5l9wAszUXQM1aqSuwAAAABJRU5ErkJggg==" + }, + "/content/translations/es/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png": { + "hash": "1d9c6e8e", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nHVRQUtiURR+UDC7lvUH2resf+AmNy0GBOG1eURIUM40vKAsy0XwooUwIE1lNLgZTB0bApPAaOHCUdq4c6UUJtl0zV425P265zjKGHThcO/hnPN93/muBqDdjVqt1m40mnwLIdo3N1V+vw2qdW8NkLi7q+PpyYYawPlFBl6vFx6PB4FAAKlUinPDMBCNRhEKhfit6zqy2Sy0+/s/WPLP4ySdRP22DsozmQwDFItFtFot7O7tYnllGc2HJhQzA1uWxTWlAHi0m3hpv3CxXC4jmUwiEokwe6lU6uUESKyUk5JKpdIB6B5a4ewsBdM04XQ64fP5WA1JdjgcPBgOh+FyubheKBQ6ALfVKh4fGiyJVBBTMBjkBmUUD+7v73GNWMkLAuqtYH35hFj4G2zbZsnEbJpLODz4jsTPhNp3C/61dV7j+PgX10gVm0gAf5+fOYiNGE5P0/i8uIC5+Rnk8zmsB1ZhzHZc37Q2oE+7ET+KMxkByP9DgfD9dWdbapomo7Ef0m1MydGxYZn7nZNDI5r8qE/2+vtMfHuur67Z7fHxCQwOfPjny2VfDwGI90JJFMoDoRwXSo1QZgr1K309r5FBOoEZ7fPHAAAAAElFTkSuQmCC" + }, "/content/translations/it/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png": { "hash": "664c4da6", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nH2RXUsiYRTHn/u97BMsddcX6bo3GO1qo11bsRcjSNiE9WUphtBaKKOLIrNA1F1GK0dBphf1ZvVqLSiTRWGLiUwTJ7v653MC0YIOHOacmXN+5/zPMLRZo9Egr1arrSd3TdM63rfHrB1wfXONxFEcRqMRUyYTFhYX8FuSKJ6eMMHv98Pj8WDcYMD4l89IplJgx8kETtMKDuISzs7/4vFRg6IoBMnlcjRlY30dFosFda0OVVXxw+nE8rK7+e0JjK9SqdyjXL5rbvAfxWIRshxFKBgk0MXlJSKRCOUcmM1mKd/b9aFUKnVK4M37BxLMZjMGBvrhcrtwGI3SyjphGFJTjs/nw/DQEPQ6gWDs9RFV9ZYmra6tUQFfmTfynMd8CL/F5uYWHZL9OVUQ3vGS/ytc0VoOhwNOmx3ebS8CgQBWVn7CLS5RHA5HYP9uw9zsLNLpNJhWq6Fee0ClXCYiB8RicZhnJmH4+gmZTAbfrHMYHRuhBptjHvqRFzn5fP6tBA7hJrrsYIwh9MuPfl0fPvZ2EYx9YBjU97XqOwCvrXBVgCiK6O7uIZjVasXJ8UlHzbsALof/UkEQCCDLMslot2diWD0a5BNXYgAAAABJRU5ErkJggg==" @@ -19,6 +27,14 @@ "hash": "a4d9d1db", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABtklEQVR4nH2Q3yuDYRTHn7/ApTv8IUwpaZb8Xo1eWjRKkYbXXPgZa0j5VaMwjMbNLhdpI9MuV4p3wnZj3lytiRm19eUcrBflW6f3ed5zzuc53yOgUTqd5kgkErnvdzwmH3P/tTUik80g+ZTEy0sKqnqP0+AJjEYjWlskyIMydnZ30WwyQWoyYW19HQ6HA1UGA+pra3Hk90Pc3F4jGDrmIOpz6hk+n48h4XCYX5mZnobFYuG8qqqwWq0YGxtFJpuF0Fqg5F38Dh6PB1ubmwy6uLyE1+vlOwFDoRD29/awuuJELBb7BLy9vn4B7nFw6IMkSSgpLsbwyDA3N9TVoayslMFOpxOlOh0qKsoZJn4vkaagl8bHJ7iA7tQ4ZbfzORqNwuVyYX5+gS0xYNYmI3J+/uE/hatIhD32dvdgaXEZ7h03BvplDPXJ3EhLpVy72YxAIPAJeIjH2QYByBeN3dHZjq6eNvg/Ni0P9aFZauCGSfsIqmsMPJWiKH8t0FikucUpCCGw7d5Ao1SJ/EKB4FkQIk+gskaXq/8B+C1FiWDQZkNhQRHDyBpNp9W/gG87er2eAXQmG1q9A5JoMIlBfgP8AAAAAElFTkSuQmCC" }, + "/content/translations/tr/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png": { + "hash": "3630daad", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAIAAABiEdh4AAAACXBIWXMAAAsTAAALEwEAmpwYAAABvUlEQVR4nG1SUUvCUBQe/j7xxT9RD0JQIEG9RFD0UEL2oo976jEhiAyrudQ7daiNablimRmZbbO5zOy6PnfFsvpg43znnO+ce8+5nPsDlNJPSn96hsOhOwvu2kOlUlEUBcalomiaBqqqKgw4ax5KpRKi8HDNZhNc0+pMeQ96XatrdXjgB0USS63Wqq3WA6frukQkieQL+aIsl/SGXsgXyuUyIZIsy6CoPQ4V5VyWNBoNDseq36rJ04QkC5ZtgD4+3Qu5k1Tm6MV4AjWsjpBLZovnd63b8R3wtV8ej1OH6lXlfeCMXNd2LJGcC9nU27tN6Qj/NDm9IIL5+jwRjMsYRr/fh8GmZNu2aVowPrwpdc2u/QoxnQhw743NjYNEgg3R6fWie3vxeBwyUBTieX4nEjFNcyLABBbm5/Z5njWxut211ZWt9XWW4TjO7s728tJip9OZCFDppqoSUYRrhFO7bj4jnp0kqYd2u50T00hg5bjpCgeDAUYMDQ6GGKrAAMUoEfre9PRRMMDGdn0+n9/vR+qv0EwH1gT/UCjEeQgEAuzSM2/pryAcDjNBMBicOv8XsL4YTjQajcViWI77B1+J6XZQteTVjwAAAABJRU5ErkJggg==" + }, + "/content/translations/tr/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png": { + "hash": "0a3fded1", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAAByElEQVR4nHVRQUtiURS+fyBaRtMPmB/hyk27giEJJotwI0ZlM4pYjMw0LgKhjfRKXLkITCyZxUhNCEPgMIoyzIw7N5MwaRIZ7/bSR0O+r3uOk2TQhcO5951zvu873xMAug/RbDa7UhqcdV1X+ZzvT6NX62Vx173DTdsAHfURJydf4fF44HK5EAqFkM1m+e10OpFMJhGNRvnucDiQz+chPn/5hFn3FH78LkPXJVpXLeRyOQaoVCowTRPatgaf3wfj2mASAg6Hw1wTptlRQ5f4d3vLxVqthkwmg0QiwezVarX/JkBipTcpoV6BR6feqOP4+Aherxd2ux2BQIDVkGSbzcaDsVgMExOTXC+VSoMAJIlUEFMkEuEGZdT/wZ2+QvKCgHiFn4Vv2Hi7jF+FAox2myUT88rKG2hbmho+wIf361gNrvEa6dQ+10gVm1g//YNUfAcXjQbanY5iOFW7H2JxaQH+4LJSUcR6+B3m5qd5YCPyETOz00rFHpPRCtbjUJI5a/FNSwhhJVO71px7yhp7OWwVit+toRFhvXo93u8f8ODpOft7xm6Pjr6AAuNfVy6XB3oIQD4XSqJM76elclwqAKnMlOqvDPTcA2X/MI+vXK3WAAAAAElFTkSuQmCC" + }, "/content/translations/zh/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png": { "hash": "9f28a68b", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACAUlEQVR4nH1S32/SUBRu5r835xN/gfGx8VH2pjFxiYnLHjBRXwjZi288GE2UGX51UO3aIanQEEYaROw2KMVaOijl8547WpCpX3J6z/3u7XfOPecI2EAYhpgzo3UdQRDcuEcQ2u02TNNEvV5Hq9Xi1jQMzjUaDRjM73a73Ke7ZLquo9PpcF/o9XqcoE0k0O/3OUc+8U2jyTkSM5hPP9M5cQKp5/MFaOopFEVBrVbDd3ZQLJagaTWoqoYT5QTWuQW5KkOSKtDrOsplCZZlQaB3mL023uay+KyV4XoOf9vQOUdBzuFD4Q0c1+acNxmjJB+hWM3hx8W36xrQx/llI3/8ER3TwFXgswIt2DqBclpFVS1jNvcxD0IE8xnULxXGV+BORisBquhgMIDneZykLiyYiPvTxWh0fXG27IJt2xiPx6su0IcK+WRvD9lsNm6X67pIpVJ48fIV9wm+7yOTyeDZ/n4szAWoquK9u3h9eIir6ZQfOCzKw91dPH38iPuECRN4fnCAB/dFDIbDlQClftb8ClmSeIqU3oLxn9j+6P07LkrcxeUljktFnLGZiAIJ69NFb6PeU3voKZQycWTE0XBRgHXEAuFyfKPi0KDc2trCnZ0dXqPNezcEIkyXqYmiCEEQuG3f3o6LuIl/CiSTyVggkUj8cfZfgQgULZ1Oc/tb5Ai/AWprZi6+8r/hAAAAAElFTkSuQmCC" @@ -26,21 +42,5 @@ "/content/translations/zh/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png": { "hash": "c19afb0c", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0UlEQVR4nH2R30uaURjHTxet/6C7/o6t62D9Ihlpsn5YONumGKMuognC+mXmjWLdtCuDiW7S6wv1EoQtIi8KyS5EJk6o96awqLCJOUP9ds4TEyvYA897nvOe53zO93sOQ10Ui0XKXC5XG/9l/k++9r++h4nP1fUlHsYrbG1vwmh8B4vFjOmZaYTW1vDeZMLHURO++f3wer14q9dj2DCE3b09sETyCC7PLH5nfnHqDZEjkQiHGJFIJAi8vLSEifFxWstms7Db7XC5FlGpVsGAKsqVMlkQi8cnx5AkCYFAgECpVAqKouB7MEjAWCwGORzGqs8HVVUFALgrlWoASQ7BbLags+M1nItOrG9sYMRggKanm8A+vrG7qwta7RuCsaeXeH5+QSe5PR5qICjfKOaiVtUTUrey8pUssYuzU8yMWZCMx5AvFJDJZMij7bONn7ZKzY55B5xzDqolKUxrn6xWRKNRMCH/lHsp/S2icHtLvhRlE1YONX0wcBUHmJyaQP9gL9VfZm0YGOojVel0+rkFIUuEe3kBjDF+Jz+gHWxHcwvD/sE+WAODpq+t1v8I8DTih3Hs/NzBq5eteNHYRHNZlh/1/Bcg7Iin1Ol0pEZ4Flkf9z1nOM6VpYulAAAAAElFTkSuQmCC" - }, - "/content/translations/es/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png": { - "hash": "326d987a", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAIAAABiEdh4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB20lEQVR4nG2Sv2/TQBTHrfLvhY75HzpEYkAspBIV6kDFEIawZoGBJQMLQqRpmsaNa8upa1kmdZ30dJioOM4PxziOe1y+qD4LQsRnOd27+77ve+9OwgZrzn9xvhlhjG1uAUiWZZmmqeu6YRi6rl8aOb1eT8swM8QFy7IkSqlpmo7juK7b7/c3t7ZtE0pt2+73vw6HQ9u2Pc+TCCHHjWOlq+h678o0h7e3rZOWeqGqF5p5ZRJCZPm83e4Yl0a3q1BKJQBD6nw5+aj22vNoCuBu/L2jNlvK58n0B4BFNG8rDVlrfbsjDz0AmC3GjdYnZ2CvWML5+udyrmidrn62XEWcr+/ZStZOz7WzcDnLBQDGvh/HMQAxpTAMJ8EEQJreA5hm5FMCMBqNXhwc1Ot1McQ4jiuVSrVaFSnSNK3Vaq+OjsIwzAWu6z7Z2/vw/l2SJADmYfhyf//14eFs9lBDHMdv31SeP3s69se5IIqiwfW1KstBEADgnGtd+bTZ5Bm+7yudzuDGEenyHoQ1ISQIAsZYkiSLaMEYC4KAUpqm6d+XFotIxrOOLct6tLNTKBQopVtH/zgIEwClUknK2N19DEBUsu2wKSiXy0JQLBb/BP8vEL6+71czPM/b+qoAfgMzUXQMpRyAKQAAAABJRU5ErkJggg==" - }, - "/content/translations/es/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png": { - "hash": "1d9c6e8e", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABxklEQVR4nHVQTUsbURR9UMFdl/YPdO/S/oNsnE0XhYAwbgYpQdD4wQia+pGFMKWLgBCsmtKSjcQYx1KIIox0kUU0uMluVglKMhj1xTjGYt6Re9MEI/jg8t7l3HfOuUcAaHXK87xWvd7gW0rZqlYr/H5ZhHVuAShcXdVwf++jWq3g+K+DcDiMUCiEaDSKbDbLvWEYSKVSiMfj/NZ1HblcDuLm5hpzSxP4c2ijdlkD9Y7jMEGxWESz2cTG5gbmF+bRuG3A8zwmtiyLMQEAd34Dj61HBkulEmzbRjKZZHXXdbs9EZIq9eSkXC63CTqHVjg6ysI0TWiahkgkwm7IciAQ4I+JRALBYJDxQqHQJrisVHB3W2dL5IKUYrEYD0gp+ePW1iZjpEpZEFF3BWt2CunEd/i+z5ZJ2TTn8PPHL2T2MrCsr1haXOY19vd/M0auOEQA+PfwwEVqpHBwcIjpmUmMT4zh9DSP5egXGJ/bqa9aK9BHR7C7s8tiRKCel5SS77X1b0oIoVLpbTVifFTvBwdU/iSv3r4T6pM+3J3vCfHluTi/4LSHhj6g703//1zOemaIQL5WruvKzF5GapomhRDStm3pOE7PzBORQTqBPRn2nAAAAABJRU5ErkJggg==" - }, - "/content/translations/tr/developers/docs/consensus-mechanisms/pos/keys/validator-key-schematic.png": { - "hash": "3630daad", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAIAAABiEdh4AAAACXBIWXMAAAsTAAALEwEAmpwYAAAB40lEQVR4nG2STWvbQBCGhX+f8cV/oj0YCi2YQnspgZQemkCdi330qccaAqUOTqOosSXbQlYXWZU2QV0rDnE2kpyNIqvqeoq1JnXSvrfdmWde5kOCDXHOf3O++ZNl2eYTACQnl2maCCHHcb4jhDE2TdOyLIwxQsjOZRiG4zgYY8n3fdu2MXYFOfF927Fd7GLs2rY98X2MsUgd2+Pp9FzyPE9TNU3tD/pDXTc84g36g9FopKqaruse8QzDWIWGeq+rEkIkAHDPrPZhS9PliAUAcHE5kXsHnZPP18ElAAQRlXvt7vDo5/Rs1QMAzK4vvnT2rR/mIo2XACyOFPVI7nbuFozz5d2CHauH31Q5vLlaA6syQZAkCQCIKTHGwjACgF/5lObhnN0wnodWgO/722+3P7VaYojx7W1tb6/RaDDGACBJkmazubO7G4bhGsAYP3v65GOzKUyi+fzN61fvtrZERhzHH3bev3zxnFK6Bhhjp2NLVRRK6ZLzJUD/RPl60Oa5ZrNZTzk+HVui3LoHAEjT1PM8SmmWZUmSMMayLKOUEkLSNP276fujEAIAhFChUCgWi4SQR6EHDsIEACqVipSrVCqJph/c0r9AtVoVQLlcvv/8PyB8wzCs1Wr1ej0IVot/dK1/AInpdlBCDCf+AAAAAElFTkSuQmCC" - }, - "/content/translations/tr/developers/docs/consensus-mechanisms/pos/keys/multiple-keys.png": { - "hash": "0a3fded1", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABzklEQVR4nHVRz0sbURB+/0DpsWj/gP4ROe2lN4ViEGqUkouktMZfBC0Nrc1BCPQS3Bo85VDYhujiwUUrC0VIaWRD0ea2l7pQky6lkfe6JovF7FdmbIMROjDMG2bm+76ZJwD0/rnv+z2lAo5Syp7vf+f3Tb+qXUVx2bvEeScAme/7ODj4gFQqhWQyiWw2C8uyOE8kEjAMA4VCgd/xeBzVahVi5/02JqfH8PlLHVIqtM/asG2bARqNBsIwhP5Gx8LiAoJfAZMQcC6X45oIwy7aZz/x++KCi57nwTRNlEolZnddt58TILFSTkqoV+CaNVtN7O/vIZ1OQ9M0ZDIZVkOSY7EYDxaLRYyMjHLdcZxBAJJEKogpn89zg5Ty7+B6XyHdgoB4haPaR6zOz+C4VkPQ6bBkYp6dnYO+psM0t/DyxQqWl57xGpXyJtdIFR+xefIV5Y11/Gi10Ol24XknsKxdPHn6GItLM3CcQ6zknmPq0TgPrOZfYWJyHIbxjslohei6Syk56huvIyFEZJTfRlPTY9Hde7ej2uGn6NYdET14eL/fP3CDm3b67ZSvPTQ0DCEEf129Xh/oIQD1P3ddV1U2K0rTNCWEUKZpKtu2B3r+AGX/MI+nc4OHAAAAAElFTkSuQmCC" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-evm-data.json b/src/data/placeholders/content-developers-docs-evm-data.json index ea08e8409c3..9808ce64de3 100644 --- a/src/data/placeholders/content-developers-docs-evm-data.json +++ b/src/data/placeholders/content-developers-docs-evm-data.json @@ -23,6 +23,22 @@ "hash": "85a0a449", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHklEQVR4nDVSX0hTURg/bUv3j5DaQKFwEHvtwSIqiL2V7KGH8EIEsoi4b2NcV0ZTOXSZQ9t/N7bdbd57x21uXKxAR/YiC6O3aAgDfdBiKQ7RZI3MCtvXPZf64Mf5+H2H7/d9v3OQ2w3dLhfoyUkwqIAKg4HkGEMXjcHIMGAgPKPwXi+YFF6HEJxQQYoYY41MUdoqxjqg6ZOAkIbkHfdgN1KC1AH36xVeK+CqXnAJesIDRhqlCHoMoNnFDjMwZw11Bp/2jbZxybNkAzlpzknwgC+AczbetkrisWcmC9e3WHy7MRWobI+NnVMbqN3cSFXj6A/GR4/h/sJI0bL88uh8SQaYK8G7Cv/j2us3AGIRZMDO3p1gZKgZDJpQNA22TKrlE3KtCVE8xjwPdvQv5vOf+nP8n4YgHC3I6eblXP53h8sDrwoqU6uX4im4MhXba4WS7Va2AIdcAYbL6R3nTHr/Hsd9Gy5nv9+U4p1TuxibZ2WwJhJwhqJAK8ugBWLi2/FFez1STq3H5jNrkeeparY+xIkQlhKb70Xu4IU0B7dURbrPCA6kqyoGtkccFsXALnXtz08TVzf87M+9aOhXOxmD/UDgBmDaePBscrkVZu/+X2d7enq84Z9cXA8VLU3vBVM8eMi+itZsqIprPat+aWDVzw+ssbmLK09WrC7F2MpDoTfqqfWQt0cO0H1ki/YNf+YS+QdfGMrAjn69I/mW+v4C6P0grdTzuZkAAAAASUVORK5CYII=" }, + "/content/translations/fr/developers/docs/evm/evm.png": { + "hash": "7097d2e2", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0UlEQVR4nG2RS2gTURSGxzRx4hiloCguXIggiBtdtLiwasWF4EYQXLoQKdhloeCiS13ZEq0SJH2aEjHRQaFWRBSlElrj2M7ENJN3pmmTloBQTGkrSj/njg268MDH+Q/38nMeUk7N+giN7uVJcE+DmP+H0vuU7SMB5P9h3SspDKnN4ype6f0QOzRN88zM4LD6ou4OlGlqcPvmXy2Q7GD4oo/gpQOF5/ik6WdlhYkLbi4fd23RZNcuaSv+1Zv9dz0ij4c4NjZKX/xRfZdE4L5SjXNw+TPtgsUPtCYNDmUMTuYStGZ1Dps6LaIuxjkqDKZU9mnDnJpVV7yOs2nSPZcCQckiY6YZrFbBssB+CxfybNS+QTFD1OlqbETmVZc7/BFZorPFY8Q5o8/SZxjcSel0ZtP48zlIpfhl61AywaqdyZs8FmOuv5k/x+vo/p4obqeDrzrdaRPmy/anIhlrgcHvdajVYHGB8NISG2trsFwlYhtsm3jJQEL9eeTPknq65HyME/o0N7IJOsoZrpQ02ooprueSXDO/cLaQ5mphjo6KznlhQLBdwX96pzOCOGM1WJEbm45EIq7NB1OeRi3O2tCTvZOeTzHkysN3u1cG3jb7b+H9DVlwVwAwa9tYAAAAAElFTkSuQmCC" + }, + "/content/translations/fr/developers/docs/gas/gas.png": { + "hash": "7b612395", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIElEQVR4nDVS3WtSYRh/28zND2K1LQz6orA/YIuoLvKuhhddxE4X0TAiDlTIOHOjDONh6swNnJl2/NYz3UwOyyDNmwhj1Z00ioUwjVpBQ3BxGos+WD2951QP/Hifjx+/53mf9yVWK3ZYLNgpnzIGKBgONbIPgGoWUCvHDPU5H2rO21BH8ypCcIsCjhYBoE1kmPYKgGoJGDUCaauy7NaydaCDUJNreHnvdiREjQzoy9aykpd5hKp1AmJbE0x65HZrljjYAWNrzvnr8weaoZA+nsVLqRk0Z/jVnXPZzeFIAk80HPYzdZezVHeN7FEEFDUrUVSjbFU7dg0vFq4Wup8Xvh3MiYj3cvjsQebL8WIJMZlBceOK2fDROz24arPpiD+M+yO8dCPOf74pCJuQSqGR/LNS6M2+RBpXhPTPh2L47ZFk+tfvaAJTSkM6tUIKxPDo1B1JmvA3pbsp/JqYxaF8+JPZH2peiEY3hvKxtVPZQGtbE0CfTGJvMIjdDIPtdPK/Ak8dReNrX55fDhQitelZvhKrDUYF9M2EGi+EhHRfyOFppSO7S4smolqmC1wfMfUgQ/RoIzrybjx4rO4e/74yeevHevA2tjyekwistjXpfiJ54dz/67yfcDkor1iFaA9Cv5afankfex4dIhVY7HrlzvbRQl/NGe9fsC/0WuhiS6Npg394sUt+e2JC1UvnnLHhjhy20X/wgWM0YJfOiqOi4Q9eChzy43YkhgAAAABJRU5ErkJggg==" + }, + "/content/translations/hu/developers/docs/evm/evm.png": { + "hash": "175569b3", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB6UlEQVR4nH2ST2gTQRjFp3HTbReTRgVR8aIiiHjxUAlUUYs37yoeFIoU1oMktdXQ3iYtQkv9u0GazO4mO8nGjUnWIBEWsYd68ODB0EJtLwUPgvUkKqE2TZ+7iUFPfvDjfXN5w3szhFL0zI+zvjWqBBdHaOh9RAlGIxD/R5VWpeWJiV0PRz/3Es8A8SEX6iE5EUXcTeG7WsYOjyuX29qBuIPYvgDkw/tL9ONOwlw3xAcFBIUuF1+LeI+P/Jl/95os+z2ld76duB3DrB57FyDrVJYqytrB0v3aoK0snX+lfOrXNBzi2nY4q+NUVsURQ93u5xxhW10/BuztsmJvDmh3lweqlEkt57SOsaTWQEr7hUweq1kOVnoB5AtAmiNnPsNG5SVg5mC1IxwPICqKTP4gEYQFvzpXP5tI1GcTT+szc6xx0+B44AKmb265aqRY/aeebsIwtkw3ojCvvD299ISHZBmtSETTNseY3oB7E7IWVvNFsKoD2BWgUESuaGPDeQ2Ui7C8ribvIZmZWjnaLil6UdSnV04mla+yxTFc4M1Lz5Pfz+SN5o2c3hjiqR/nTN68ZmYwbKtfLrTKvt4dxC1xT7yMbvJoFL1OxBE7TVNKfTWZ+TvnBbog/H0F5o8qEGvjM32LI49D3p/4Da4DINS0abFVAAAAAElFTkSuQmCC" + }, + "/content/translations/hu/developers/docs/gas/gas.png": { + "hash": "4ccf5d60", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIElEQVR4nDVSS2gTURR9pjFtPkixBlpQrEg2LlyoiIqSnZYiLqSDIJaKSBZKKEMs9svVJFPafBrThGnzmygzURlNpB+yk0D9QSl20UoKVVqbQog2Equi1bbXeYNeOLz7zr2c++7hEbsdq9vasIaeFE0KGBb1NAdAnQ3QQO+Up/kVBxoVXksI7lDBKkUA0MgMU5UD0M4Do0MgmhmbbWfW3lRNlKB1vGE24SGie83K+qw9q/K0TyliDSBqSmA1IbtXP8/CbugoO2XH2AGUwyZBxOvCA2xOBNfNKXGznRfwzBL0XlzkXJOrPT37VAFVzU5U1YhtxtBxG69lbmbqXmZ+HhQfIUoSvngilE+NjSNGkygjMPWFoaGWotdrJIERbOT5L92x8Kc+6T6CIKCF/Iun8Xf7Y8LWx2Ti97g88uF4XNjcjsb/COpA5dVqUzCKJwYDpYrbV6gEIhs/IhK2psKFZt/w6lWe/9z6OPr9nBjc3lUCMCVkNIdCWMcwWAWqgGLiG+eEZXpA4qe90mjeL/K5aL4lktjyJ+8tvIrzxbT4EC+oE20NBrQSLTVwveu0Gc8Tg7r20t3Qybk7fb9WPAMb30LDuNbffxYjYFjzcM8rfu7y/3WWOa530e2aWPCl9hQdh40hz1fuWWC2keQgV7s8KB6hyDtjR6e6pszU2MlbyfpA+2wt60c9saL2rTNlee8ePeZQ/sEKy+hdneVL6e50w18JQx8AICGwYQAAAABJRU5ErkJggg==" + }, "/content/translations/it/developers/docs/evm/evm.png": { "hash": "8a97e969", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB20lEQVR4nHWSz2sTURDH18SwiSYgtCpepV7EQy+i1oBSFUSPInjxoFIQPXgq+CcUkVK0FQxpSlPSGiW1ohUrWiFail3J/kg2u0mTVklNNCgYU9oK2o9vo+lBcODLmxnezPvOd560OqIEeDTSyr1QSwPR/lY1ktoae438OIH3X7ydQc4nkn4GE9vMCbzSizC+7+Pjm5cn6hsQF13/gySMyGk/oVO7nMel6Zc/fIQuejjT7hLYRE/QzedzbumvMXnS1fTXb/V5nPNhhH3RIXrnhusBJ7mllqztXpxaPV5J0vlN5VDhDXssjY6czkHToC2rcSCTpePDDHudBsYQO9QxDtthy9fonEnTremgG5C1yFk24XIZFt+DZRErFlirfoWFHPcbrJ7e9jLcKQ88EBpwZb9Hn+OImqJXU7mpKFy1LfpyNhhpfuZtommNZdGIfJZRMaa7Nv3lKFPPtl+7QWMkydTp1gWDjGBQWCC3VCJcr0O1CsKPVSqsrayIeIm4o9PkE+4qMdr+iBS9LueTtCuzXDbe0VW0ODtvEiyaXMqbXDAFu4LF+fkMXZ9UjjVqeoJ+7pzYWUrik14N4iuHPspNpePxuGu9f9bTjJ21bmxB5J2/UHqeCvwaG21x/N8BAVa/C6zZgAAAAABJRU5ErkJggg==" @@ -35,48 +51,32 @@ "hash": "1ba8ab36", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB6ElEQVR4nHVRTWsTURR9TTJOYxsEa3Qr2JW4ELKwVCFgN/6BLl1o6CCGQaINpqvnJmCp0xpaJ3nzkZlM2xAnhlooEd3MRkUhKIKIrRuRCm7qItTmw9jTmdHgRi+c98558C733ENsCeE3M2L0QzI58vGmcOw9TR2lFIP/g5gD/3TOGmrcvnvE08Q7HEpD1IVDnRBsOwhgwH0P/AvELVwnw0gcP2FTe5jY0sswhBgHQgYAF4QEMUmC5E+BkkCfNwSB8256a+fMjWnMa+nnEfJVEA4/WXBOVmdfTNTmXl1cl9+Nmax1qsi644bSHVNVjOrsxzlWxLid+3zaa2DPbEXz02/PG9QZ9DsrWjctK3vILX2HrHY2NRNaxQasMqAZWC0to11bc7UJ259KFHl3ykOiCJ4gRjiWa8ZluTXPlF/3FuVWsmhiQTN+oqDu9Vxu5VlzV9U7KGrtsmsxVJeexbey2WhMgG+JFAq7aaa2YS4Dxgo2yxVo6xtAtQa4fLVSRXujDjyq4KG3qztZMDXzadT/vC9e4leWts8u3t++puR3piyjN1nSmxcsvZcw9dYV/UEzXjI6l0taZ2qt8G3Ct3CVRJAY+p2ClEK4Ltb5/qbdOAMNgXF97UX7NwXGebE/ntUirzOZESn1JXwASRwbo/wkCf8AAAAASUVORK5CYII=" }, - "/content/translations/zh/developers/docs/evm/evm.png": { - "hash": "be4d05bc", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7UlEQVR4nE1Sy2sTQRif5tG1DWpRC6IXEb14UelBCWIO9uA/sLeKiDQVYZESU1s8DIqnpqFda5rMZjebbB62k0qxlFw8BEEEoYeCCCYg6sGigqjVmKQt/TmzGOnAx3zP3/ckug5ldBQ9lGLPbmJ0uffLbfXw+oTaH4s4AU34uTaObifmBKq3aJ+UiQQA0EX+UYfnKvfWdU1ZZWE/59wrnD2SiHjQDuzDyP5jjH7qJTITaMgHQjyCvO5PievoOu/iJZj843dqp++O/Uya0Rd7yVpkKGDOfjyyOPly8Bl7N1jSv56dm2sez7DNoG1snnfSOGGxxjmWQZDrH05JAH2i3s/GXgd1va64yKbxJzrz6BtMG3CKqJlZmPMcyJcgdcVcHq3ykrDZ4G5VKu1GKOTTNCgEA8TPEhuhmYc/4olkYyrJcFMATKfTTTDj13bGgWNYrd+mvYV8duuxBFiJPb/4lk4dGgjDbYmkUt+jyXQDMqtdQK00D/PpMlB+Agi+uFBGa6UCLHIsiBl13XsAI3P/zUk3eEe7rBSm359JzK7fKNg7w0W7reasjQuOtX09azWvWaK6nN2+kjPbw0upz5fcFoZIACM9R53IWoDExQ1UtIrSmTSl1LMaZv6OXKVV3/8tCP1VsXsZ+Gp8/KC8g7/CmBuewj9G+gAAAABJRU5ErkJggg==" - }, - "/content/translations/zh-tw/developers/docs/evm/evm.png": { - "hash": "d082b641", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nH2QT0gUYRjGx9XZf1gKaunBIAWhg6CHRJBQoZAu3vRoEMvCGl2qoYQUB6TL7J8gQ22NKZ0/O1M2s7vDOrtrtcRK20XES63hwU5hgR1KPCw9fd9uC5584eF5n8P3vu/3Yx4+gOt2AO7QJNzUaT5NfgHOr3NPG37ygXNqMOdlwkG4iRwjQE2PAEcgg1qaqVP5blS8KoYU+I5mcJ3dn+bUBka5U/SCG2ZxrYmF73wtuhprEGl3MP/rZL+ncSz1hdlvPQJfWtT5nTPMUfieNy3uXCg8275ekH4NayvoVmR0GDr646/QF9fQaWi4THNKOrxEB4iPvrdo/P7AC/HAVZ6s6+DE1b8wEoCVQnHNxHL2LeltYM2AnLRw/D4HJOPQKleFnYiM1lEmDD1dkzD4XCyFJBmCGsNkwkIkpgNKDCUjiRVFxW9JIQNMyOSLnlz0c/+Plx/PEj7O8gUxFZxKHmSygGmhaKWx/GET2HgH2GnImQ0cbxZIzkKjjB4/wZIx/6WrAml6zGVGD3pl8SiQMuFfNzG+LuOK9Qa+xGvcNFQMkc0TRH5b/nO1DPpW60VMtdXfV8Ey0Rl48lN5V5W0IAiO3bsKW81boa26k70RgtsO2vWz0/BQBv8AuaguEg7oJ5gAAAAASUVORK5CYII=" - }, - "/content/translations/zh-tw/developers/docs/gas/gas.png": { - "hash": "2eb4379a", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJUlEQVR4nDVSX0hTcRj9bY7tbrMQdDShSCgJfNSICmJP/cGHHsJLEMn1IXwohlxXlGb8dBvTmnOsO646vffOXY24uaKUPRUDK4KIIjKcaPTnIRkuWGi4SjzdO+3A4cB3Pg58h494vbBxHBhDDbIU1gadhlKd7RQOlofd8HxhOC/64NTnFhBiIgQmwusmpdSsaWyFrhZ4z9hwkjjBeZh5ylqJDgAm+PY40UQcCs0yWU5hynNKzERPYyhgzlNPJfi99lxnZ81g59LQY147mI/TSlnFpQkZzVLsu2tKRYco48RyT9e5XK9/9kfg5r5yQDnNS2yGavw3e8d1tD28IlS/yOBAUgVSKTyfTf05/iANDEvQQFn3l4Fwy0o47CT90Y06MV7onlJKt5LJTSrLpXqyg+nxj/sT0uZXRdp4og2vHBkdK22NJv7KO2eZy0sREUdp6FMxFFstigp+jU6idXrsZ3M0nm8bH19vvZ9YP63GtnbnKa2UNLgEAdUsi4rtIvUSX/ln6l8PqOKHocmRxaFJ8WlivkVKITIhLL9MSmtp9R7ObhdW64CHWDLejA2XG9xoJw7QBiv53Ccce9PTVSpEI7/X4ndRCIVOgbY7CreDz4oD/gv/z1kMBHpyfb0zucGpmtVrh3YJd9YCj/rf1ZEszVYtBdXG90G5ccE/1jTXNecyip29qriVjmwVH4GdeGB565frF4Ijh336H4DjmMCN4vl0d7r2H/ExIXQ0qGaMAAAAAElFTkSuQmCC" - }, - "/content/translations/hu/developers/docs/evm/evm.png": { - "hash": "175569b3", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB70lEQVR4nH2SP2gTYRjGv8ZLLz3MNSqIiouKIOLiUAmoqMXNXcVBoUjhHCSprYZ2+04RLPXvBWny3V1yX3LpxSRnkBMOsUMdHBwMLdR2KTgI1klUQm2aPnIJRSeHH+87vDy8z/O+hFJEZsdZ/wrV5PkRGvuQ0ORkAuL/8KgnLU5M7Hg8+qWPBAJQhyJQaYDkJzRxJ0XoSg3bAi5f6tYtCCEEqT1RKAf3Vumn7YRRT4I6KEAWeiALoQ5qJBQMdob/6RuKEg4qvf392K0UpszU+yhZpYpU11b2Vx82Bl1t4dxr7fOAYeAANzbjBRMnCjoOWfrmAOeIu/rqEWB3j5N6u8+4s3jSo0zqKOdMjGWMFrLGb+RLWC5wsOpLoFQGchxFewZr9VeAXYTTtXA0iqQoMuWjRBAXwvp080w63ZxKP29OTrPWDYvjkcUBZq5vWBxWljV/mbk2LGvDhiwIs9q7UwvPeExR0LFEDGN9jJkt2DNAwcFyqQLm+YBbB8oVFCsu1vw3QK0CJ8jq7n1k8veWDndDSl4QzQdLxzPaN8XhGC7z9sUXmR+nS1b7etFsDfHsz7M2b1+18xh29a/nO2Ff65VxU9yl1tBLnoyiz0/44lbSlNJQQ2Hd1Qghc3RO+HsFFk5qEBvjk/3zI09jwU/8Aa4DINTDvcCkAAAAAElFTkSuQmCC" - }, - "/content/translations/hu/developers/docs/gas/gas.png": { - "hash": "4ccf5d60", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHElEQVR4nDVQXUhTYRj+mmvzbCMkGygUGbGbLrqoiIpidyUSXYSHIBIjYhfFQQ5Lyj/e2nZE9+OaG0f3d1acs4pTW/jD7mJgfyCSFxkTLDQnjJWLZUVZ6hvfoV54eH95Xp6HcBwa29uxlmaKZg6NLI8MrQHQ4AA00Z7OaX3JiWYA1BOC2zTwPDIAoFNZtiYPoJ8D1oBAdDMOx/Yc12wkhBC6x2tWCx4ghle8yuS4nDandwQAawFRVwa7BfndzBwPO6Gz4lKdY/tQjVgkGa9K97ElGVqzpuWNDlHCU4vQe35BcE+u9PTs0Qg0No5orFHHjKnzJl7JXs/Wv8j+3C8/RFQUfP5YqpwYG0eMpVBFYBuKQ0OtJZ/PTIIj2CSKX7rjkU99yj0ESUIb+RdPEu/2xqXNj6nk73F15MPRhLSxFUv8kbSHiDrtKBTDY4PBctXjL1aD0fUfUQXb0pFii3945bIofm57FPt+Rg5t7SgDWJIqWsNhrGdZrKGyNRNfuyZs0wOKOO1TRgsBWczHCq3R5GYgdXf+ZUIsZeQHeE776Gg0oZ3oqYFrXSeteJaYNNmLd8LH397u+7XsHVj/Fh7G1f7+0xgF06pXeFYNCBf/y1kShN4Fj3ti3p/eVXIeNIe9X4Wnwdkmkod83dKgfIii4IofnuqaslJjJ2+kGoIds3V8ABliR/0bV9r23jN6xOlE8zLPMu5blQuZ7kzjXwlDHwCDrM4rAAAAAElFTkSuQmCC" - }, - "/content/translations/fr/developers/docs/evm/evm.png": { - "hash": "7097d2e2", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVR4nG2RTWgTURSFxzRx4hiloCguXIggiJu6aHFh1YqLghuh4NKFSMEuCwUXXerKlmiVIOmvKRETHRRqRERRKqE1xnYS08xk8jdNm2kJCMWUtqL0kzcadOGDj3cuXA73nivlVdNHaGI/j4P7GsT935WBJ+wcDyD/D+tuWWFUbZ5S8UrvRtmVTCY9c3M4rD+vuwMVmhrcuvFXCyRJkhi76CN46VDxGT5p9mlFIdbppqvF9YcmYp0u0eg0/6O3h+54xD8V4sTkBIOJh/U9EoF7ip3g8OonOgTL72nLpDiSS3Eqn6bN1Diqa7SKupTguDCYUTmQHOP0vLrmdZx1nb6FLAjKFjndYMS2wbJA1wkXC2zVvkIpR9SZanJc5mWvO/wBWaKn1ZNKcFabZzCV4nZWo8c08BfykM3y0zQIZdKsmwYUdB6JNTdfL57nVfRgfxS3M8EXjT5Dh8UKFErkrCVGvtWhVoPlJcIrK2xtbMCqTYSulh2xFwyn1R/HfofU3ysX4pzUZrlupumu5LhcTtJeynItn+Gq/plzRYMrxQW6qxoXhAHBDgX/md3OCuKMdrAqN5KORCKu7fszTtriibM29PTAtOdjHLn64O3eteE3zf6beH8BWXBXAF2WxBIAAAAASUVORK5CYII=" - }, - "/content/translations/fr/developers/docs/gas/gas.png": { - "hash": "7b612395", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHUlEQVR4nDVR3UtTcRj+NdfmPghLjQV9UdgfoBHVRbsr2UUX4ekikkXEoOIgxym1WLxszqWCrrU1d/btpmsMW9DWbiIMq7uRFIbgFmVBMphxEqMPrCfOwV54eL8enoeXl/E8tFYrmuUso5uHlhOgk2siaGwEvdxzBI0wDt1FOwxEUDOGbQoEAToiUuU5rmmOSL1InAbEVBWbbXuZ79Yyxpi8w9X9O8GYBhwZy3xZmcs8RoRmAlR1Mhsh7NUtCrSLBtfcszdnD9WDQWM0gyuJKVjSodXdM5nNvnAMp2pOx7nqkLtUHerfpwgoajxTVEVbRT94A5cL1wutLws/DmfzwIMsXjxKfztZLAHxNPIb1yymzyMTPat2u4H5JnEwHJJuRUNfb6dSm5RIoINtRSn47kAsiZVU8vfj/OT7Y/Hkn79iDAnFEFApJH8Ex8fuSdKwry7dT+B7bBq9uckvFl+wfkkUN3pzkbUzGX9jR53IGI+jPRBAK8ehiWhL4Lmz2PF2PBda9hfCSxPTobnIUo+YwvhUsPYqFZMeprI4qzja9uhhZuplvqxd7ze3gWNG2JmBfXAFTlQ9rp8ro3d+rQfuouH1ngbZ9I1RzzNphC78P+fj8JCz6nEVKyS2gbr0obHGyFPvkyNsjhZa3ngynRUSO5fc0a55x3y7ldBcGkiafH0LLfLvmRnq1+6ZjponfNRuh+GTwOnIIZ3PD+RN/wBeChzy3HK0MQAAAABJRU5ErkJggg==" - }, "/content/translations/ru/developers/docs/evm/evm.png": { "hash": "7db3e69f", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5ElEQVR4nG2SW0iTARTHPy+7pWOBlfQsEUIP68EsMJIw2FMEA3vrIULIx0LwoddwkKKErFq20uFk1lLKFRWtUKO5tHb/dvvm2NZcgi9NvETtF9+3rJcO/Dj/h8PhnP85QsqdbOT+vYPY7jT9mrrbhGPgwLbjk37wMeqHVjT/A+crPVMvDV/snxuExffo5gfnVTIfhncVSkXqrLkqN/v/aZnzrdTgvmjAduFw4U1eL/ie5PZh6VZjNtYqXG+vx2OqF/4EHlPtnq7cHlHJecbOMccjhvzjZb3AuKXhhyfXkntbOVv00fnNx6nsAkelKO2pECeSAVrEAG2JICczflrlBn7ndvOCgw7JK+mUzpEwfaEQBEOQypBIJxlbK0E2C6LI5KrEzsYGZBJMK1O9uKbFY1I/d6MV6G1TBf2cWfIxtOTjVmiF3rjISCIOoTA/k3EmggE2IzFIizgxG+t2X8e7mJ05dGOa6qrhAH1KQbo6QTbP2PcyrK9DIc9kcY2drS0oFXFhNtbMzWELPONI1aSJfk3My3H/IlfTUXpyCbpXlzmdiXElFeGyuEKnFOeSFKWnsEyXYrSlw4D1XLM4GmsU3j1AV7R91ew57XK5aiujHxW35dicLf+9iKzlveUfwO7d/3QA7W9Oq1dqcOVjQQAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4UlEQVR4nG2SXUhTYRzGj3Of6VhgJV1LhNBFXZgFRhIGXUUQ2F0XEUJeFoIX3YaDFCVk1rKVDiezllJaVLRCjdbSOvtwZ9+ObU4TvGniR9R+nXPWqIte+PE+L7z8eZ6Hv5DwxGu5f28/9qG6X+N363D27Nt2fjb3Pkb/0Ibhf+B6ZWb8peWr40uNMP8e02zvrE7hQ/+uylqBalu2zK3uv1rhfCNVeC5ZsF84mH+TMwu+J9k9WNv1XDyqUbnRrGXmnFb4c2StqejSnQGdck86OOJ8RJ9/pGgWGLHW/JjJNmTfls4UfLR+83EyM8fh1BLNiSDH4yINkkhTLMCJtJ9GZYDftV0/56Ql5U2Z1MnhEF3BIARkEmliyTjDq2uQyYAkMbacYmdjA9IxJlRXL64bZWf65x6MAp1NuoCf05989MncDi7SGZUYiEUhGOJnPMpoQGQzHIGkhEuOWb37OtrG1OSBmxOUo4ZEutQPybKDTI7h70VYX4d8jrHCKjtbWyCX65YHVE1PYxefcahc0mi3IeLlmH+ea8klOrIx2pcXOJWOcDUR5oq0SGsqymW5k478Am1q0dYWC7az9dJgpFZ49wBTwb5iqDTtdrs1pcGPusp7c6qo/VcruZUdwOHd+7QH429Oq1dqUr2iCQAAAABJRU5ErkJggg==" }, "/content/translations/ru/developers/docs/gas/gas.png": { "hash": "f946eb71", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIklEQVR4nDVR3UtTcRj+NdfmPhApDYXCovYPaER10e5KvOgiPF1UYkTsQjjI2ZKYKS9uMjnpnGvj6OY+nMcjccqiHLuLhdVFIHmRVjYDy0g0lRlGH6hPnIO98PB+8PA8vO/LeB7m5maUallDPQ8zJ8Ci1UQwuQhWrecIJiEIyzUPbEQwMsb26RAEWIjIoHJcSZ7IOEucCcQM0y7X/l2+3swYY3lyGtFaUw7GTGghe47P6XONx4hQSoBhhZx2CIctswId6Gxb96meJ8egRu3DMm5mUmgYlZYPKfJ2azSBc/Md3ksFvy/79o77iC6gq/FMV425pq1tt3FDcSkVLx/9Oq6owPg4XjxIbZ59PAkkRqFutTRULfX3Ny739tpYaBBHJWmrfVja6BwZAaVScLC9yEbnahJpfB5J/32qDn46lUhv78ZSOyndEDDopHAcp8XwWjHQ/614L77zMzGGJmVwqaEv9PV6VPredD++fkEO75atENmTSVRGIjjIcSgh2hN4Lj50TItj0msxM/QumJHy8feNseROMD3w4VVCWp2Qx3FRd3RVW+Fkxo98zvzD7azAVVaGlko7KwQiZ+Z89HtR7PmzGRnAWuDuecTIutEXeFYM+q78X2fe39VR8HdN5t1KBajOKomrohrIn2B5mikvdMu1i+JE7ULPcN2Ud6pSO2z2VroqRDPl2u+ZE8Y3PsWx0D100uOB7YvAWchbvCy3y9X/AFolG8usfQJ5AAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJ0lEQVR4nDVS30tTURw/zTXdHCK2hUJhUfsHVKJ6aG8le+ghvD1UYkTch8FF7pbETDm4yeSm21wbd267u9u83hG3LMrhWyysHoJhD2llM7CMRFOZYfQDt2/n3urAh/P98eHz/Z7v9yCGgdqeHqhTbxWdBBQLRtXGGAw0BpPqU8RmA2C84oZ6EtcjhPZpYEkSY6xTKKqmgLF+AVMGwEhXpOn9VaazlpBQAdv10NvaCAgZwInNs8ysFld5iKjVYQDdOrabgT1kXGBx02DflldxPzoKStSclOB6VgTHJL92UJb2eqMCnFka8Fwo+bz517dchzUBTY1BmmqcLpr6bsI1mZYtzx/8OCYrALkcPLsn7px+OAMgTIKy63Q0rwaDXWujo/UoFIMjPL/bn+S3BzMZwKIINvTv5KOLrUIaPmbSvx8rsQ8nhPReNS5WRK0g6VojhRNwkgtvlv3BL+U7icp3YQq65diqYyz0+WqU/9p9N7F1TgpXG9YxNqdSYI1E4ABFQQ3p/K/AU+6+rchN8S+57MSbQJYvJN52xVOVQHr83QuB35iWcnBeq0i3mMCO9O/JAL+57Ba4jBrAaTWjkj9yatGLf65wI792IuOw6b99FuLYtD3mf1IOeC/9f86Sb2ig5BuaKbhkC+B2E89tcIq/cJys6FVjaVhqW+Gm25ZHku1znjmrOtj8jXRziOTU3SM76Oe9sm15eKLDTf7BJ5YyYk/5otQvtfwBWiUby6ogImIAAAAASUVORK5CYII=" }, "/content/translations/tr/developers/docs/evm/evm.png": { "hash": "0ad31c8c", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2klEQVR4nH2Sy2tTURCHj6nXPEihtG66EhEEwUVcVF34iOKi7pSASxciBbsv9B8QBRsrWiIk0WhDrbGGFGo2IhUCoUnwkceNN6+bhiRNYqUItoRItZ+cxODOxcfMwMzvzJkZkV3GRGBxhJfuEfx3DvLMN+xzYfwf0dmflu+epaGVICbh92COzEQUCWmUneXt/StBDK4qA5Lb0z3bRwghCF+14r4yGlnKWUXsddWC+4KCw2b4ywDhcYNM7CX/8/cePlCkDT3l+HMfTj2EVeB6ZPkW/32ovsbFZgx7M84pNcXhfIrTxTQnC0mOaEnGZFxOcEwK6Iv6aMLXOReZiVi6ymqGqYwKxRJUauS1HN7WV6hUQNNYWNfpbG1BOc+rbldz902Exw+882IWTI4pqQTnM2mcapp7aobJQo7ZYhGyGX4VcsyrKjsyLmm8wGFT2qst+25odfixk+6XRCrJlHy93oBimXylhvfHNmxuQr3GQrNJp92GVoMADtu+8Bs86eDu0d6Q5qeNpSgnPke5VcoyUc1zbf0DZ8tfuFlUuaF9xK7nuK5nmdhIckkKcPeMFf/loXgUo3j/BHPDvWHsTzoQCBj25tZ6rQkh5Fr7vly1LKq9/TQY88UG5U38AXPwVd8s3v/rAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB10lEQVR4nH2Sy2tTURDGr6m3eZBCad10JSIIggtdVF1UjeJCd4rg0oWIYPeF/gOioLGiJUISvdpQa6wlBc1GpEIgNAk+8rjxJr25aUnaJK0UwZYQqfbnOWkDrhz4mJkznO98M3OU/CwOwlP9vPL3E7qzj+dan+bD/j/Ex365fgSme9/O4FBCAZyx+zFVgizq5uzGXlGw+Sp0Sdwe3fEdKMKIXnbjvzQQmy64lcSbigv/WZUrR2276CJ6wabs2r/x9qOHqvSRZxx5oeG1IrgVfI9d35N/9i/Pc66ewFNPckLPcKCY4aSZ5fhCmoNGmkGZl1MclgTWlDWQ0lqnhWpXm1nPMZLTwSzBUpWiUSDYWBXxEhgGk4sWrfV1KBd53VY1/sAhlHV/COJUGB5UMynO5LJ49Sz3BNnwQoEx04R8jt8intB1NmVeMngpWlSbcw3PVmSu74mXdktKJs2IfH25JlSUKQoVwZ8bsLYmzqpM1uu0mk1o1AgLgj3RdwSyM1uHdoY0MWovxTn2Nc6tUp6blSJXFz9xqvyNG6bOdeMzHqvANUvUVtKclwTcHXITutibjGNXPj7FWfOv2DuTDofDtu3xebWTy7V2Yrlqean6/ktPQkv0yD/xF3PwVd+UB6lQAAAAAElFTkSuQmCC" }, "/content/translations/tr/developers/docs/gas/gas.png": { "hash": "87299d07", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHklEQVR4nDVR3UtTcRj+OZdzm4hkC4WiT/8BjagovKrEiy7C00Uki4jdyEEOM2qyev1Y0lhbzdmZ25nnTI86OZhQjt3JQvu4GUQxHIEkBSHGBssMS8wnzqleeHk/eV6e52U8D4vTiWo96t7Gw8IJsOo5EapcBJte630hCOs1N+xEMIOxCsZQwQQBViIyaRxXmSUy54mrAjFTzuXak+HbLIwxps/B763FcWZ5LWjWDJ8x+voeI0I1AaZ1aq2BcMC63HWnvq+nNKi5nx2BNlIjybgpj6N9QlzZP5Xc7hZlnPvg9Vwu9FG6NDh40AAw0HhmoMZcOdut27gx1zVXvzC3dSylAakUltIT22fSGSA5BW3T2dpQGLjfsRYI2NmjKA6PiuVeRdq4m0zukCyjif2z2cTHQ5L8+5OibD3XomsnE8rOblyGbBwETMZSOI5T/nCxHHyyWY6r+BEbR+eMVGofjhavJxKbnTPx0kU1vFu7TlQzpsERiaCe41Cp0zZEfOGdb3ofnBGXH8+OFkLTYjae75AmEZwUV1+pY9+eqtO49FewRhuImXUBNzxnHTjP7Abt1f7I6RXfwM/1UODX95FhFIeGLoBctqLft1B+QFf/01np7/fm++7Nf3k4tQ/UYhP9X/3p0NJRlqW3de98anPOF2suDEgti55Fh5NQne5RGpTubJ3+e9YK8xtvtOllb+hEwA37Z4Gzkqd8Re1VG/8AtgMfccsTPdoAAAAASUVORK5CYII=" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJElEQVR4nDVSW2sTQRSeprFpLpRijLSgeM0faEVUlDyppQ8+SNcHsURE8lKWsrSiCdGTm8UQE01TN82lu2m3acJSA9qQtxJpvbwERAkNQrAoSIkkEGukWmqPu6seOMyZ7zt8M+ebITSNGqsVO+VVzgEpKQa1cg2AHTZAnbyXcSaI2mtjqJdwNRLSRgi2EUYiAUAlUlR7EUBdBqoDgahKNtueAj2gIVLIPNJ7u/A40bxmRG2BLii43CeR2AmIqhpYDMgc0K6N3DG6xhtecezZERSnDAkOb3KzODjHVvenU9ujLIfnPjjtlysuyDe83oOKgKJGE0U1Zivpbt3GG7mRnHE5t3UsIyJmMrian9s+ky8gptIotqyWnorn/tBGIKAnj6J4eJptOvjE5t1Uagc4Ds3kXywmPx5KcL8/8fzWczG6cTLJ7+zGOeSUA6VbK03hOJ7yh+vN4JNWMy7gj9gsDmcTjcHJaP16MtkazsYbF4XwblcNwDAjoikSQSNFYTsoApKJL5xL5vfBLLv2eHG6Elpgi/HyUGIeg/Ps+ith5ttTYQEv/TWsVyeZppYN3LSfNeF5olfGXndHTld9np+1UODX96lJrE9MXECw6ep+33LzAVz9P07V7XaWXfeWvjxM70Po17H+r/58aPUoKcLb7nc+oa/ki/VVPIn+FfuKySoZmx/ne/jRYrf89sSC6jfOqPmlI3QiIP2DzwylBXvziuAQev8AtgMfcY5TYFEAAAAASUVORK5CYII=" + }, + "/content/translations/zh/developers/docs/evm/evm.png": { + "hash": "be4d05bc", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7UlEQVR4nE1Sy2sTQRif5tG1DWpRC6IXEb14UelBCWIO9uA/sLeKiDQVYZESU1s8DIqnpqFda5rMZjebbB62k0qxlFw8BEEEoYeCCCYg6sGigqjVmKQt/TmzGOnAx3zP3/ckug5ldBQ9lGLPbmJ0uffLbfXw+oTaH4s4AU34uTaObifmBKq3aJ+UiQQA0EX+UYfnKvfWdU1ZZWE/59wrnD2SiHjQDuzDyP5jjH7qJTITaMgHQjyCvO5PievoOu/iJZj843dqp++O/Uya0Rd7yVpkKGDOfjyyOPly8Bl7N1jSv56dm2sez7DNoG1snnfSOGGxxjmWQZDrH05JAH2i3s/GXgd1va64yKbxJzrz6BtMG3CKqJlZmPMcyJcgdcVcHq3ykrDZ4G5VKu1GKOTTNCgEA8TPEhuhmYc/4olkYyrJcFMATKfTTTDj13bGgWNYrd+mvYV8duuxBFiJPb/4lk4dGgjDbYmkUt+jyXQDMqtdQK00D/PpMlB+Agi+uFBGa6UCLHIsiBl13XsAI3P/zUk3eEe7rBSm359JzK7fKNg7w0W7reasjQuOtX09azWvWaK6nN2+kjPbw0upz5fcFoZIACM9R53IWoDExQ1UtIrSmTSl1LMaZv6OXKVV3/8tCP1VsXsZ+Gp8/KC8g7/CmBuewj9G+gAAAABJRU5ErkJggg==" + }, + "/content/translations/zh-tw/developers/docs/evm/evm.png": { + "hash": "d082b641", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nH2QT0gUYRjGx9XZf1gKaunBIAWhg6CHRJBQoZAu3vRoEMvCGl2qoYQUB6TL7J8gQ22NKZ0/O1M2s7vDOrtrtcRK20XES63hwU5hgR1KPCw9fd9uC5584eF5n8P3vu/3Yx4+gOt2AO7QJNzUaT5NfgHOr3NPG37ygXNqMOdlwkG4iRwjQE2PAEcgg1qaqVP5blS8KoYU+I5mcJ3dn+bUBka5U/SCG2ZxrYmF73wtuhprEGl3MP/rZL+ncSz1hdlvPQJfWtT5nTPMUfieNy3uXCg8275ekH4NayvoVmR0GDr646/QF9fQaWi4THNKOrxEB4iPvrdo/P7AC/HAVZ6s6+DE1b8wEoCVQnHNxHL2LeltYM2AnLRw/D4HJOPQKleFnYiM1lEmDD1dkzD4XCyFJBmCGsNkwkIkpgNKDCUjiRVFxW9JIQNMyOSLnlz0c/+Plx/PEj7O8gUxFZxKHmSygGmhaKWx/GET2HgH2GnImQ0cbxZIzkKjjB4/wZIx/6WrAml6zGVGD3pl8SiQMuFfNzG+LuOK9Qa+xGvcNFQMkc0TRH5b/nO1DPpW60VMtdXfV8Ey0Rl48lN5V5W0IAiO3bsKW81boa26k70RgtsO2vWz0/BQBv8AuaguEg7oJ5gAAAAASUVORK5CYII=" + }, + "/content/translations/zh-tw/developers/docs/gas/gas.png": { + "hash": "2eb4379a", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJUlEQVR4nDVSX0hTcRj9bY7tbrMQdDShSCgJfNSICmJP/cGHHsJLEMn1IXwohlxXlGb8dBvTmnOsO646vffOXY24uaKUPRUDK4KIIjKcaPTnIRkuWGi4SjzdO+3A4cB3Pg58h494vbBxHBhDDbIU1gadhlKd7RQOlofd8HxhOC/64NTnFhBiIgQmwusmpdSsaWyFrhZ4z9hwkjjBeZh5ylqJDgAm+PY40UQcCs0yWU5hynNKzERPYyhgzlNPJfi99lxnZ81g59LQY147mI/TSlnFpQkZzVLsu2tKRYco48RyT9e5XK9/9kfg5r5yQDnNS2yGavw3e8d1tD28IlS/yOBAUgVSKTyfTf05/iANDEvQQFn3l4Fwy0o47CT90Y06MV7onlJKt5LJTSrLpXqyg+nxj/sT0uZXRdp4og2vHBkdK22NJv7KO2eZy0sREUdp6FMxFFstigp+jU6idXrsZ3M0nm8bH19vvZ9YP63GtnbnKa2UNLgEAdUsi4rtIvUSX/ln6l8PqOKHocmRxaFJ8WlivkVKITIhLL9MSmtp9R7ObhdW64CHWDLejA2XG9xoJw7QBiv53Ccce9PTVSpEI7/X4ndRCIVOgbY7CreDz4oD/gv/z1kMBHpyfb0zucGpmtVrh3YJd9YCj/rf1ZEszVYtBdXG90G5ccE/1jTXNecyip29qriVjmwVH4GdeGB565frF4Ijh336H4DjmMCN4vl0d7r2H/ExIXQ0qGaMAAAAAElFTkSuQmCC" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-gas-data.json b/src/data/placeholders/content-developers-docs-gas-data.json index f943cbd11d2..ebd86874972 100644 --- a/src/data/placeholders/content-developers-docs-gas-data.json +++ b/src/data/placeholders/content-developers-docs-gas-data.json @@ -23,6 +23,22 @@ "hash": "2b1ea8a1", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhklEQVR4nGNgAIL/mWys/yPYmBnIAZMX/xdYvPj/6lmzPm+Yt+j/7oUL/7uAxNet+0+cgevW3WBbOve/zfxp7x0Wzf7iumr+UymQ+KEmJxaQqzBwZAQEg9h8LIwM/5s5mICYDchhAml8d2Q9z5tly8SAYiz/55qz/m/WYwPTYDbQ0P9izEAM1CPHBeKDXXHu6LuEs+f+nrh46f+Rqxf+Fn1cv0QbHDZzs1j/Z5qxrlu3DuydU0f/eu/c+e/Yzr3/95/a/c4Q7o17N/7WPH/+///rt///P7zyuwyseXKwwP9mKZ7/uew8/3tteUHO3bnuf/qMOf//z577///21b8d4AZc3XtV8cqN/9bnrv+3vLb/ju7H1RNk/1uwsP4X+s8I0vi/uQnsvYUf/vPe33ym5PnCVb/fzJjhD9YMDoxSdk6YYU+OLOb4vK6HHxo2LGB/r+NhBrP/izH+L43g/F4brwMUFwGpYYDYoMzxeHEyGIP9DTIU6Hd0fG+KN/uNpgg2sMVgwzmYADdN2utJU7EzAAAAAElFTkSuQmCC" }, + "/content/translations/fr/developers/docs/gas/gas.png": { + "hash": "7b612395", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIElEQVR4nDVS3WtSYRh/28zND2K1LQz6orA/YIuoLvKuhhddxE4X0TAiDlTIOHOjDONh6swNnJl2/NYz3UwOyyDNmwhj1Z00ioUwjVpBQ3BxGos+WD2951QP/Hifjx+/53mf9yVWK3ZYLNgpnzIGKBgONbIPgGoWUCvHDPU5H2rO21BH8ypCcIsCjhYBoE1kmPYKgGoJGDUCaauy7NaydaCDUJNreHnvdiREjQzoy9aykpd5hKp1AmJbE0x65HZrljjYAWNrzvnr8weaoZA+nsVLqRk0Z/jVnXPZzeFIAk80HPYzdZezVHeN7FEEFDUrUVSjbFU7dg0vFq4Wup8Xvh3MiYj3cvjsQebL8WIJMZlBceOK2fDROz24arPpiD+M+yO8dCPOf74pCJuQSqGR/LNS6M2+RBpXhPTPh2L47ZFk+tfvaAJTSkM6tUIKxPDo1B1JmvA3pbsp/JqYxaF8+JPZH2peiEY3hvKxtVPZQGtbE0CfTGJvMIjdDIPtdPK/Ak8dReNrX55fDhQitelZvhKrDUYF9M2EGi+EhHRfyOFppSO7S4smolqmC1wfMfUgQ/RoIzrybjx4rO4e/74yeevHevA2tjyekwistjXpfiJ54dz/67yfcDkor1iFaA9Cv5afankfex4dIhVY7HrlzvbRQl/NGe9fsC/0WuhiS6Npg394sUt+e2JC1UvnnLHhjhy20X/wgWM0YJfOiqOi4Q9eChzy43YkhgAAAABJRU5ErkJggg==" + }, + "/content/translations/fr/developers/docs/transactions/gas-tx.png": { + "hash": "c3de15c5", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhElEQVR4nGNgAIL/EWxs/5s5uEA0A6lg8eL/Agvm/109beqbTXPn/9k3Z/F/Z5D4unX/mYkyYN26G2wLF/yzmT3tucPCOd9dVs1/KgV21bpIZqCLMHFkBASD2HwsjAxApzMBMcgLTBCN63jerpov/t+Hlf1/sxPL/0wz1v9zzSEYxP8vxgzEQD1yXCA+2BXnjr6LP3To04mz5/4fuXblf+GnZdP0gaazQBRxcK1btw7snf27v3lv3Prt2L5D//ef2v3OEO6Nh7f+1rx49f//+/f//z+88bsM7JK5Hvz/KyR4wbjXlhfk3G3r/qfPmPP//9z5//9vX/3bAW7A1b1XFa9c+W998tJ/y2v77+j+Xj1B9n8aGy/QiRxgw5qbwN5b+OE/7+ONZ0qeLVj5+82MGf4M0Chk/l/Kzgkz7MmRIxyf1/Xwg8VBfgbhdTxANgfI/4z/SyM4v9fG6wDFRcDhBnLa/2ZljseLk8H4/9wsVrBmUOCh4XtTvNlvNEWwQVwFNBBoAABAw9xkciqS2gAAAABJRU5ErkJggg==" + }, + "/content/translations/hu/developers/docs/gas/gas.png": { + "hash": "4ccf5d60", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIElEQVR4nDVSS2gTURR9pjFtPkixBlpQrEg2LlyoiIqSnZYiLqSDIJaKSBZKKEMs9svVJFPafBrThGnzmygzURlNpB+yk0D9QSl20UoKVVqbQog2Equi1bbXeYNeOLz7zr2c++7hEbsdq9vasIaeFE0KGBb1NAdAnQ3QQO+Up/kVBxoVXksI7lDBKkUA0MgMU5UD0M4Do0MgmhmbbWfW3lRNlKB1vGE24SGie83K+qw9q/K0TyliDSBqSmA1IbtXP8/CbugoO2XH2AGUwyZBxOvCA2xOBNfNKXGznRfwzBL0XlzkXJOrPT37VAFVzU5U1YhtxtBxG69lbmbqXmZ+HhQfIUoSvngilE+NjSNGkygjMPWFoaGWotdrJIERbOT5L92x8Kc+6T6CIKCF/Iun8Xf7Y8LWx2Ti97g88uF4XNjcjsb/COpA5dVqUzCKJwYDpYrbV6gEIhs/IhK2psKFZt/w6lWe/9z6OPr9nBjc3lUCMCVkNIdCWMcwWAWqgGLiG+eEZXpA4qe90mjeL/K5aL4lktjyJ+8tvIrzxbT4EC+oE20NBrQSLTVwveu0Gc8Tg7r20t3Qybk7fb9WPAMb30LDuNbffxYjYFjzcM8rfu7y/3WWOa530e2aWPCl9hQdh40hz1fuWWC2keQgV7s8KB6hyDtjR6e6pszU2MlbyfpA+2wt60c9saL2rTNlee8ePeZQ/sEKy+hdneVL6e50w18JQx8AICGwYQAAAABJRU5ErkJggg==" + }, + "/content/translations/hu/developers/docs/transactions/gas-tx.png": { + "hash": "2bf689ee", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABjUlEQVR4nJ1STyhEQRx+u2//vNUue9CqPWzJleJCQiROlIODvREHUQ4KJy77rusgth7rsWwKm4nyrzattg1JlBbvICXLASux2fLSZ2bEwUmmvmbma75vfr9vRhDowKDVBlmyCP8Z4TCcwalMJBB4WA2FEVVVNDCeEIh/MiBEsyjT79Xq5H3tfDDTuDx762Z83Fdvgtci/sZKm8jB1vSYQQBcBnRaJDSbrUyoEWLPLs8W0JZMUCvM6Ck385lBpqZwiRRGyJ4ctudVHOzedRzsZw5PTpBInn70Py0qpcg1iRgrZNlIhBDeTjz61rSxre9tRhFLrKfKftq40vTh1C2QTgPXmj7Egx1vdUJ229FntWO0xkENDZsE3co0EJwBtiJ63Y/B2c5ZYVJD1fEFKs9jlyUvC34PF7KSqRCyz8jOzT3DcbN2NHAXWtIfFaWFi3k49Bm/zVKJhPRK/HmcZwYMxC7yTFheg15bdqS9mPL5lDMKXzcUSTfhLg6ovWYuZuH9wtVEk1Xzefl/4YbU4BOjzNlVEleqewAAAABJRU5ErkJggg==" + }, "/content/translations/it/developers/docs/transactions/gas-tx.png": { "hash": "58be553a", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhUlEQVR4nGP4H8/A8T+Nget/PRizMJAKFk5+Ijxtyru1kyY+2zx37p990+b+dwGJr1r1n5koA1atusI2b+pHq0nTntrOm/Xdae3MV5Ig8f+hocz/Qxkw8CooBvMZGBgZ/v9nYPxfyMD5P5eBHaTx+c4L3J+XzRYHe63engWMZxqzgjGI/R+oEYTrJblAfLArDu26n7hv/5tTZ8/+PXrx7K/Cl/OnGPz3YOD7X6/F879UmHfVqlVg7+zb/cV7y7YfxzZv/XngwIb7hnBvXD39rebGjf//nzz7///B5R9lYC/0+wv8zxXiA+F/9WZ8QOcybVr1J33KzP//Z876/3/z8u8OcAMu7LygeP32f6sTF/9bXNt/R+fdwg65/1oMbDD5////M4Lo/S//89xef7L44eylv19MmeIPkQQFBjAMYIrvz5/P8W/xRD6wODBa4TiNgRUSXqGcb4tjdID+FwGKMzGAQvJ/vTzH/fnxYPx/ZhorWHMaMNDQ8K2JHuxX6kPBLoMazAQAyzjWvQiNaWwAAAAASUVORK5CYII=" @@ -31,6 +47,18 @@ "hash": "5c846059", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiElEQVR4nJVQXSiDURg++2yzDVMm5YbcSkqipUTaxcqFq90prubKhZYLpc6tcmOsrz7aFpI6tchyIbVNoY9cbFmK1FDLfyEsP3mcczC1K049nfM+7/s+531egj5igZfYQDk8pIj898xO3TtU9S4y6c9Gg2HE1CBcgmcMfxNjLG0OafdtqnrVHpp+65rXrqoFD1BFTFQI9g0ZE2IglBJF2nCTYkGcryVLEJmr4gXWNK03g3YYoTWbJMQbvFGAVttELKfY27zp1/Xcrq4/bW1uXA+fhcZb0EFK4Wss+RissIMxaSe2/tgdXc1tR1dfEonlTFPexmHqdfTkBMhmgfTuw4i0MOYqx7CjDFzgg7ba+XTKCnsfCGiANgNEF3OdeYHkWrJufx9tqRScB/Hjhmc2UQMnsf7kARjEHb9EaWZpx3c6s/B2EQj0fCXFMoZ+izPxsAXaWLnkKTHm4SUm7t2AIY/11tfbwP1Xcl4hYnGgtZZMuE8Cmtckm718aQU48ruL09Rjlh9/CSufvrzXg22hqYEAAAAASUVORK5CYII=" }, + "/content/translations/ru/developers/docs/gas/gas.png": { + "hash": "f946eb71", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJ0lEQVR4nDVS30tTURw/zTXdHCK2hUJhUfsHVKJ6aG8le+ghvD1UYkTch8FF7pbETDm4yeSm21wbd267u9u83hG3LMrhWyysHoJhD2llM7CMRFOZYfQDt2/n3urAh/P98eHz/Z7v9yCGgdqeHqhTbxWdBBQLRtXGGAw0BpPqU8RmA2C84oZ6EtcjhPZpYEkSY6xTKKqmgLF+AVMGwEhXpOn9VaazlpBQAdv10NvaCAgZwInNs8ysFld5iKjVYQDdOrabgT1kXGBx02DflldxPzoKStSclOB6VgTHJL92UJb2eqMCnFka8Fwo+bz517dchzUBTY1BmmqcLpr6bsI1mZYtzx/8OCYrALkcPLsn7px+OAMgTIKy63Q0rwaDXWujo/UoFIMjPL/bn+S3BzMZwKIINvTv5KOLrUIaPmbSvx8rsQ8nhPReNS5WRK0g6VojhRNwkgtvlv3BL+U7icp3YQq65diqYyz0+WqU/9p9N7F1TgpXG9YxNqdSYI1E4ABFQQ3p/K/AU+6+rchN8S+57MSbQJYvJN52xVOVQHr83QuB35iWcnBeq0i3mMCO9O/JAL+57Ba4jBrAaTWjkj9yatGLf65wI792IuOw6b99FuLYtD3mf1IOeC/9f86Sb2ig5BuaKbhkC+B2E89tcIq/cJys6FVjaVhqW+Gm25ZHku1znjmrOtj8jXRziOTU3SM76Oe9sm15eKLDTf7BJ5YyYk/5otQvtfwBWiUby6ogImIAAAAASUVORK5CYII=" + }, + "/content/translations/ru/developers/docs/transactions/gas-tx.png": { + "hash": "6215b9db", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABk0lEQVR4nJVRTyiDYRjfvu379tkMSSOK5CpyIUkktylu223iIG7k34GLT7lwUDtsYz7agYa3lFlirbQpcdJWX6lFo0UOC5l88fO9rzjsxFu/ep5fz/N7nt/z6jAs8BrMmDAVADa97r9PXn4plWV1x+2+3/P63o596+imPCEw/EmAEEWQA2jzeh86/L6X7qB8V0l5YJ6DUzDkY9fhYGB5kVGvgyRyGBBENBoFSjxGIpZcUC5HH2+G1CBA6jLC38Iz0Bg2gwYOUrWZ5myL89h9fzz2dJZIIJ64xOhT0NsAl2DBWF0JpqoshBBm5+To1R4Kv5+GDj+j0f1006+NlPIxk8kA2Sxwo6iTzMJmTxGmK6wMS+1Wut0BwZBnFVhZA8LbauevQDKSrE0oaDu7ROtV7Lpe3VqoQQ9vQin0tBHSHEfrNrKwpvcuxjPr2+qjx9PLmtkxtC/8EbuNBcRnsljMbiOJRuabFBpYrH0zJpwFuVlXvcaX0Rrd94Q6MR0YZIB/hGeiw818PlJuu0mZcwpsMBMXuS+h1OBFwGFOlAAAAABJRU5ErkJggg==" + }, + "/content/translations/tr/developers/docs/gas/gas.png": { + "hash": "87299d07", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACJElEQVR4nDVSW2sTQRSeprFpLpRijLSgeM0faEVUlDyppQ8+SNcHsURE8lKWsrSiCdGTm8UQE01TN82lu2m3acJSA9qQtxJpvbwERAkNQrAoSIkkEGukWmqPu6seOMyZ7zt8M+ebITSNGqsVO+VVzgEpKQa1cg2AHTZAnbyXcSaI2mtjqJdwNRLSRgi2EUYiAUAlUlR7EUBdBqoDgahKNtueAj2gIVLIPNJ7u/A40bxmRG2BLii43CeR2AmIqhpYDMgc0K6N3DG6xhtecezZERSnDAkOb3KzODjHVvenU9ujLIfnPjjtlysuyDe83oOKgKJGE0U1Zivpbt3GG7mRnHE5t3UsIyJmMrian9s+ky8gptIotqyWnorn/tBGIKAnj6J4eJptOvjE5t1Uagc4Ds3kXywmPx5KcL8/8fzWczG6cTLJ7+zGOeSUA6VbK03hOJ7yh+vN4JNWMy7gj9gsDmcTjcHJaP16MtkazsYbF4XwblcNwDAjoikSQSNFYTsoApKJL5xL5vfBLLv2eHG6Elpgi/HyUGIeg/Ps+ith5ttTYQEv/TWsVyeZppYN3LSfNeF5olfGXndHTld9np+1UODX96lJrE9MXECw6ep+33LzAVz9P07V7XaWXfeWvjxM70Po17H+r/58aPUoKcLb7nc+oa/ki/VVPIn+FfuKySoZmx/ne/jRYrf89sSC6jfOqPmlI3QiIP2DzwylBXvziuAQev8AtgMfcY5TYFEAAAAASUVORK5CYII=" + }, "/content/translations/zh/developers/docs/transactions/gas-tx.png": { "hash": "92086cfe", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABgklEQVR4nJ1QPUiCURR9+W/2S0E0VWs4FEGEEEUUBA5N3yZEDTY1iNQUfKNtEaihqV8UNXzlEEQlBlaDSpk/IAUhCRGUQjU4JBad3nulQ1N04fDuve++8+45hNCAhRgwT7TkP7GygpbNDQRdrud9bwAnbj/GWV+WofwTgSxnNYEATG53cTjgfRvb8hQ7WT8ijqggEOVvyILAwWtC6ghA6mAjekxQGbTxGEobsLPeAStRwzOghtir4SfPKSnoQwaxs57VfIvz49xMLFa6TGcQTV1VbAXJ2cfIIHbpIBIdAAWbi5+VzYeH5ehR+OP0Ilzsr8m4yZSX7h+AQhHIpSqL3FiHuRULbY2YJY2f4mATJVQcBD/m1nyAzw8c7ZZGawTpULonmYQpnsDQdSRnfJUc3VzfT9ANeC4DDfm9hP3Ou/3+5HROfV8yM6gH1eG8JOlePMvNdHUFhaoG5gn3S9A/2y1Gqr+dzZCq1rw0zQGPVc1JrdS0X7hdndRmRUHDP/4mVnwBjQDWKno/wrwAAAAASUVORK5CYII=" @@ -42,33 +70,5 @@ "/content/translations/zh-tw/developers/docs/transactions/gas-tx.png": { "hash": "e79ca859", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABjElEQVR4nJ1RTShEURSenzfvvdHMkCQsRLYkCyREE6tRFjZjRSxEKQpZsJmXsrGikF4z49E0yrVQJk1+EmKwoMFbiISR0kSR9OJz351QbOTW1z3n657v3PMdAxycEd2CA5JoMvznKApSZpT3+fHxxwWfgrAso0bnCYH5TwKEqLzsQ4U8Ga+a9j7VznlvsnR+w+Pk4ObNv9DoToDG9JnRAKQb0cKLlLDqhSohttfAcCbNeUhOTvUU8JBLLQw0p+/NFCZI2Ul6zn6xsx5rPtjTIsen2Iweous5MFSMQo7HWJ1AvREJIWycyNabK7SsbYdXsRYJx4u+xjiLvg3c3gGPD8ClqvXpHEYbUtCfYUenYMNIpV03eymINv8soFCEAlr1t8DKce5eFOW7Ryg7WTsr0KakHLadVBjZLXnYhvwPsF8s7vfEfEHtfmKinhUzY3oF66fY9aYigsjJ+lopODY3sZlZrPvV67a+DDblUz6NrT7RIU+8UloZIHdYmGh7ieUnzsdcgkoaedaYiYumD7UO3C+/vhqyAAAAAElFTkSuQmCC" - }, - "/content/translations/hu/developers/docs/gas/gas.png": { - "hash": "4ccf5d60", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHElEQVR4nDVQXUhTYRj+mmvzbCMkGygUGbGbLrqoiIpidyUSXYSHIBIjYhfFQQ5Lyj/e2nZE9+OaG0f3d1acs4pTW/jD7mJgfyCSFxkTLDQnjJWLZUVZ6hvfoV54eH95Xp6HcBwa29uxlmaKZg6NLI8MrQHQ4AA00Z7OaX3JiWYA1BOC2zTwPDIAoFNZtiYPoJ8D1oBAdDMOx/Yc12wkhBC6x2tWCx4ghle8yuS4nDandwQAawFRVwa7BfndzBwPO6Gz4lKdY/tQjVgkGa9K97ElGVqzpuWNDlHCU4vQe35BcE+u9PTs0Qg0No5orFHHjKnzJl7JXs/Wv8j+3C8/RFQUfP5YqpwYG0eMpVBFYBuKQ0OtJZ/PTIIj2CSKX7rjkU99yj0ESUIb+RdPEu/2xqXNj6nk73F15MPRhLSxFUv8kbSHiDrtKBTDY4PBctXjL1aD0fUfUQXb0pFii3945bIofm57FPt+Rg5t7SgDWJIqWsNhrGdZrKGyNRNfuyZs0wOKOO1TRgsBWczHCq3R5GYgdXf+ZUIsZeQHeE776Gg0oZ3oqYFrXSeteJaYNNmLd8LH397u+7XsHVj/Fh7G1f7+0xgF06pXeFYNCBf/y1kShN4Fj3ti3p/eVXIeNIe9X4Wnwdkmkod83dKgfIii4IofnuqaslJjJ2+kGoIds3V8ABliR/0bV9r23jN6xOlE8zLPMu5blQuZ7kzjXwlDHwCDrM4rAAAAAElFTkSuQmCC" - }, - "/content/translations/hu/developers/docs/transactions/gas-tx.png": { - "hash": "2bf689ee", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkElEQVR4nJ1STShEURi9M++9eW80hoVGWUzJlmJDQjSxGmVhYXbEQpSFMlZs5m5ZCPUYz9+kGLlRDDWJNCGJkp+3kJJh4S8xUV46ulcsrOSr0/3u6Z5z73e6hBBCEFSdoJqD/KciEWSGR1Pzw8N3i5MRxA0D1ZxnDNKfDBgzHfrYe7kxcls5HU7VRCeuczi/FfLJCDik31hokAR4TwixEcBjQ7NDQ62icqHJmOstOpENqskwShS0FSti5aA+GfBIgMcO6k3je8Jrd/OmaXcntXd4iMTx0Ufn46xeCLcsYSCXZ6MxxsQ4W/FX/8qatR2LYyOxnCz6GePCtHqS18DDA3BpWt0i2MH6TNAcFzpUF/or0uGWbTGGVn0MCI8Dq/NW1Y/ByfpJ7rGJsoMzlJ5unBc8z/R5hZA/2S3bQEN2fm7qCelXS/tdN5Nz1r2u1wmxCCeoOr/NkomE9sL6MgTPDTiYSxKZ8LyCAedbb2M+qC8LVLOTrxvytKtIiwCMdkWIeXi/cDHkV81QQPwXYUg1+yejzNlVQLeFPgAAAABJRU5ErkJggg==" - }, - "/content/translations/fr/developers/docs/gas/gas.png": { - "hash": "7b612395", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHUlEQVR4nDVR3UtTcRj+NdfmPghLjQV9UdgfoBHVRbsr2UUX4ekikkXEoOIgxym1WLxszqWCrrU1d/btpmsMW9DWbiIMq7uRFIbgFmVBMphxEqMPrCfOwV54eL8enoeXl/E8tFYrmuUso5uHlhOgk2siaGwEvdxzBI0wDt1FOwxEUDOGbQoEAToiUuU5rmmOSL1InAbEVBWbbXuZ79Yyxpi8w9X9O8GYBhwZy3xZmcs8RoRmAlR1Mhsh7NUtCrSLBtfcszdnD9WDQWM0gyuJKVjSodXdM5nNvnAMp2pOx7nqkLtUHerfpwgoajxTVEVbRT94A5cL1wutLws/DmfzwIMsXjxKfztZLAHxNPIb1yymzyMTPat2u4H5JnEwHJJuRUNfb6dSm5RIoINtRSn47kAsiZVU8vfj/OT7Y/Hkn79iDAnFEFApJH8Ex8fuSdKwry7dT+B7bBq9uckvFl+wfkkUN3pzkbUzGX9jR53IGI+jPRBAK8ehiWhL4Lmz2PF2PBda9hfCSxPTobnIUo+YwvhUsPYqFZMeprI4qzja9uhhZuplvqxd7ze3gWNG2JmBfXAFTlQ9rp8ro3d+rQfuouH1ngbZ9I1RzzNphC78P+fj8JCz6nEVKyS2gbr0obHGyFPvkyNsjhZa3ngynRUSO5fc0a55x3y7ldBcGkiafH0LLfLvmRnq1+6ZjponfNRuh+GTwOnIIZ3PD+RN/wBeChzy3HK0MQAAAABJRU5ErkJggg==" - }, - "/content/translations/fr/developers/docs/transactions/gas-tx.png": { - "hash": "c3de15c5", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiElEQVR4nJVSTyiDYRz+9u/bu2Wbg5Ci5EpyIaHWOCjK9XPaQRE3hRy4eK+UA2tlX9/WSrF6i8JhsVojxA4aLUnJ38Roajt85tH7Lg5c+NXT+/5+vc/T8/x6JUmSJCiyDErs/JT+W+EwSoNaIeJbfFpXtfedQBidfM4YTH8SYCwth4If7Uu+e3cokO9a1W6rhCvWb4Ii/0a/UgS/O80GCZQYQQmPYCwSWcnzqlaBXosV1GPGcLMFaksRvEe5CSg3gtbYeS/xSu5mvPF4dv84icRZCqPZZV8jnGZz8RGxM8ZEnFg017O2kdvbiSN2GM00fce4Oi9MPTwCLy/AVVqfEE7UbhcmKx0Ccx0ObneTYcgfAFQN2Iro7m+B0+3T2lQKbQcnaD2LXTTokflqDMoOUA8RYnRGxAu9wnG9djR2F1zRn/z+PkEWyxi32r7EbhIJ8sZmXWLOM3OwEhMo4fkNGFds+WlvPainTOyNWwOtI9fhAQGoIxZB5sv7gcuFHmt6RhF/RQhSYvwEQMPcZDPiz6UAAAAASUVORK5CYII=" - }, - "/content/translations/ru/developers/docs/gas/gas.png": { - "hash": "f946eb71", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACIklEQVR4nDVR3UtTcRj+NdfmPhApDYXCovYPaER10e5KvOgiPF1UYkTsQjjI2ZKYKS9uMjnpnGvj6OY+nMcjccqiHLuLhdVFIHmRVjYDy0g0lRlGH6hPnIO98PB+8PA8vO/LeB7m5maUallDPQ8zJ8Ci1UQwuQhWrecIJiEIyzUPbEQwMsb26RAEWIjIoHJcSZ7IOEucCcQM0y7X/l2+3swYY3lyGtFaUw7GTGghe47P6XONx4hQSoBhhZx2CIctswId6Gxb96meJ8egRu3DMm5mUmgYlZYPKfJ2azSBc/Md3ksFvy/79o77iC6gq/FMV425pq1tt3FDcSkVLx/9Oq6owPg4XjxIbZ59PAkkRqFutTRULfX3Ny739tpYaBBHJWmrfVja6BwZAaVScLC9yEbnahJpfB5J/32qDn46lUhv78ZSOyndEDDopHAcp8XwWjHQ/614L77zMzGGJmVwqaEv9PV6VPredD++fkEO75atENmTSVRGIjjIcSgh2hN4Lj50TItj0msxM/QumJHy8feNseROMD3w4VVCWp2Qx3FRd3RVW+Fkxo98zvzD7azAVVaGlko7KwQiZ+Z89HtR7PmzGRnAWuDuecTIutEXeFYM+q78X2fe39VR8HdN5t1KBajOKomrohrIn2B5mikvdMu1i+JE7ULPcN2Ud6pSO2z2VroqRDPl2u+ZE8Y3PsWx0D100uOB7YvAWchbvCy3y9X/AFolG8usfQJ5AAAAAElFTkSuQmCC" - }, - "/content/translations/ru/developers/docs/transactions/gas-tx.png": { - "hash": "6215b9db", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABk0lEQVR4nJVQTyiDcRj+9m3fb982Q9KIIrmKXEgSabetuNmNOGhuZDhw8SkXDmqHbcxHO9DGr1b+JJbSKHHS1FdKNFrksEbIF49+P3Fw4q2n3vfpfZ/3fV4BXiLBS6zwmS2AwyD8N9S5pyJV1df8/rt4MPS6F1qCk/GUwvgnAUo1okbQHAzet4ZDT86oelvGeGBKhIcYf2O9q4uD1/kmgwBFFtFLZNSZCCMeEgnbS1QtQadkhVJLoLSbEG6UOFgOhxFwiFAqrKwWWJwk73oOk7njVAqHqTMM5qLBWnQTG4aqCzFabqOUcjsHu8+uze23o82dj/39jXT9j41L7X08kwGyWeBa00e4hRV3PsZK7RyzLXZ23RZFf2ABmF8EtmN624/AeeK8KqWh+fgMTRfJqxp9dboSbsmMIhjYIJRJkfUtZ2FPx0+HM0sx/SEQ6ODD/Bk+s+Vb7CYZkR/pTAH/jSKbuG+aZ+Q5HAb4PJaXie4aKO3FrEf42lAtpyN9HAgPSFzU2yD9xqXfZdYmPYQv5uKy+Amh1OBFX59pVAAAAABJRU5ErkJggg==" - }, - "/content/translations/tr/developers/docs/gas/gas.png": { - "hash": "87299d07", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAACHklEQVR4nDVR3UtTcRj+OZdzm4hkC4WiT/8BjagovKrEiy7C00Uki4jdyEEOM2qyev1Y0lhbzdmZ25nnTI86OZhQjt3JQvu4GUQxHIEkBSHGBssMS8wnzqleeHk/eV6e52U8D4vTiWo96t7Gw8IJsOo5EapcBJte630hCOs1N+xEMIOxCsZQwQQBViIyaRxXmSUy54mrAjFTzuXak+HbLIwxps/B763FcWZ5LWjWDJ8x+voeI0I1AaZ1aq2BcMC63HWnvq+nNKi5nx2BNlIjybgpj6N9QlzZP5Xc7hZlnPvg9Vwu9FG6NDh40AAw0HhmoMZcOdut27gx1zVXvzC3dSylAakUltIT22fSGSA5BW3T2dpQGLjfsRYI2NmjKA6PiuVeRdq4m0zukCyjif2z2cTHQ5L8+5OibD3XomsnE8rOblyGbBwETMZSOI5T/nCxHHyyWY6r+BEbR+eMVGofjhavJxKbnTPx0kU1vFu7TlQzpsERiaCe41Cp0zZEfOGdb3ofnBGXH8+OFkLTYjae75AmEZwUV1+pY9+eqtO49FewRhuImXUBNzxnHTjP7Abt1f7I6RXfwM/1UODX95FhFIeGLoBctqLft1B+QFf/01np7/fm++7Nf3k4tQ/UYhP9X/3p0NJRlqW3de98anPOF2suDEgti55Fh5NQne5RGpTubJ3+e9YK8xtvtOllb+hEwA37Z4Gzkqd8Re1VG/8AtgMfccsTPdoAAAAASUVORK5CYII=" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-nodes-and-clients-data.json b/src/data/placeholders/content-developers-docs-nodes-and-clients-data.json index c1b3fa99ad9..3202b70f648 100644 --- a/src/data/placeholders/content-developers-docs-nodes-and-clients-data.json +++ b/src/data/placeholders/content-developers-docs-nodes-and-clients-data.json @@ -15,10 +15,26 @@ "hash": "d911a514", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeklEQVR4nIVQO0vDYBRNi1IHJwcXQdwEFTdXV1HQXyCCu+AgdM3iKEKXLroLFR+LQ6kQ61DUtqTaViEJfbfpM1+qaZ5NjqZYURC9cLgXzuHecw9F/VOBQMAXYtmpmom9qoKTDxwUdMy5HA14ByKapr2gKA+ALzDAiMvFBWGNL+YNXVUcU+05jq5CkkgvJ2srf17G5/a6haDjWGhzKUN6iVtSNmaYnTqIhizD5McojuN8y/Ozu+xVaJukozGVezjX+PgOyURTaoH1i105WcnxIMKT3S0XILZtp9bso0kssyabS9RZODwZPDw95q5v1nPJu3Q7kzzS+YeNYuL+UcmltlqKEqtXSpDzz/3XShFiveeIDc1pEVsrS2+LA6uCgEmahveC0WYYBuOu9UhEnXZ7x7b3AQsSx5rkOWZ2s1EDcgvtLm6H73qonwF6h3DJTAPjNdK51CwTfRu2rtoQq4QXRGPhe2CeYf9tTiQwmlewWn3t+8sSNkslTAw178xLMg/NF2jCAAAAAElFTkSuQmCC" }, + "/content/translations/es/developers/docs/nodes-and-clients/eth1eth2client.png": { + "hash": "446b7673", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAKCAYAAAC9vt6cAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJElEQVR4nG2SoY6EQBBE5x9W4TGrUHwDP4BD4VA4HAqHRCFxOBwOiUPicEgkbgUhvfP6wt7ehU4mnWmmaqpqMCJyyk2VZSlhGEoURdqbppFhGHR91WHuCOZ5ljzPJcsySdNU+ziOsm2bElH7vrP/JXi9Xh+CdV2VoK5rBaCmqiopikLVQMjenjuMZTphg4DFIc/z5PF4SBzHehAVzOlBEIjv+5IkyY+CrutObmPwfD7FdV0F2bksy6IqIKJP0/SxwDdVYMGnMUZYgCEjKDxTgPnWtq3uIb7KKj+MZTkZwo4FUnccR4m+5ZMDMwi5oO97VPwN8QqSEPGJIsAAIQJMZ45lfUZC/AZf/pDMTXR8oxIVKOSZsWj7/X/Ae18hooaORdb/DN48penrYFzyNAAAAABJRU5ErkJggg==" + }, + "/content/translations/es/developers/docs/nodes-and-clients/nodes.png": { + "hash": "63b5cec2", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABgUlEQVR4nIVRS0sCYRQdJahFmzatItq1KGjVqh8QEfQHgqB90KbaumkdCNGm/kBFD4IKiRiRUMnCMkscx2faOKnzjem855uTIwkFURcO58K53Me5DPNP+P3+/otodKSsYv1VofvlNrb4FiZdzQd4u0U+n88LhvF0Ug+ALliwfa52l87Oc8W8qasfjqW0HaopkAhRXhv63J+T8dW9atEdxzHQSMd1KRWzaokbQ6sLkDQ8s2x+gOE4rn9mYnw1fn6wLKdC4TYXOdaysRWSDD6ohfiGIMv3lXwGhH+kcikHoU6dt5oNkVjmm2xOM0eBwPC2/3AveR1cyMaiT7VkdFfJ3S4UYuHHZu5h6b3dClfLJTQLKVuuFCFUFUcQNeddsvWcKE11V+V5DLuGnFySsQMWg+7qZ1fSqMsipZuAhVo6bpKXiEkSQYMSEfUmQr1zf5jnNuzBFZMiBgXSOFUtA7YNqqs2hIqU4QVj8rthnh7/lrNAX8nCbOeFawXJWSzKGOrVfAIV1C7z5ELHWAAAAABJRU5ErkJggg==" + }, "/content/developers/docs/nodes-and-clients/client-diagram.png": { "hash": "250323f1", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAHCAIAAACOQloVAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIElEQVR4nEWPQW6CUBCGuQFn4TBsbOIdXDasWWiatCasvAEbFk3TFFswklcXUvBZwCoqGERbSgNNQ1JDF/RHk3Yymfwz881khsnS+OQLj0ZhcNZoCML5Lt4irevv2z/g5MzKd6cTi9qmZZlPltVqtQRBmM/nj4R47jNaUbjI093/ANA8/6yqqizLoih6vZ4sy6e0LH/gxuA+Wnlf+Rtoj44Zl1rggiBIkgQcx3HNZhMijmPUIfrq3YgMR8OH9QvdLN164Ptw6HTaiqKgraqqbdugWZbleR4VQsjQMC4v2tQky9mEWfszVe3jEkmSsiyrjgbBHA369ubapeOP1yjdh/VJGOhedUVRxK+6rmM3PkbUNA3POI6z8Ka4HjTifuP/AlSnClI7OoqMAAAAAElFTkSuQmCC" }, + "/content/translations/fr/developers/docs/nodes-and-clients/eth1eth2client.png": { + "hash": "45325f76", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVR4nG1SoZaCUBR8v0CmW0gUE4VkMvkBJBPNRDLRbCabiWai0Ww0G8XjcQONZmP3Le/uzD3Ccdd954wP7psZ592LERELDH9xu92Guq7fwPqT44BP83z5tbqukyzLJI5jiaJIkiSRy+UiEEtZlhPv8XhYg5+h73stjDuJRVEo+XQ6yfl8VgM+b7dbadtWOYCdElA8goIwDDUFRUxAw91uJ+v1Ws/SNKXMGrgNTdNobJKMMTKbzZRwOBxkv9/rv+Z5rthsNpqMXOisAWkIgkCFnufJ8XhUM6bgoph1CriY6GVZg8Lg+77GophmbB7vTCMmWa1WasB7V1U1NRrp7dsUeMCo8/lc705Tgven2WKxkOVyqf0BV6fwDbgRnC8OHKI7CByu6CB26IW+w8DB2D2n8fXvd8CoYw/GkXFnurEHnJZ+B+QD91fg4A6DO0RTjc/oi9b5DoMP7NcfUR0yimI6ZAAAAAAASUVORK5CYII=" + }, + "/content/translations/fr/developers/docs/nodes-and-clients/nodes.png": { + "hash": "0792f586", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABe0lEQVR4nIVQvUrDYBRNi1CHLg5OgrhX3BzdBdEXEAQfQHBQ1y6uDhVx8QUcFMFBBQvRKv1Ra1u1iglGG03SNG2+1KbNf46mWOiiXjicC+dy77mHov6pRCIRSRYKI6KJFcHwdgUdG6yFWKDFgXB3KB6Ph0FRoS6ALmhgINBunl9mmMqrbXY+fbut+57RgaqSNt8wpv+8jJ/tNQ/bvm+hzhbNxmPOVe4uLateBbFQpunXQYphmMhULLZ8d7K/SMrnmdZz+qDN5pbI/VnJ5AtrVU3LCxwLlb31CP+CasPzRcWFTBxb1OxJ6iiVGt7a3Nt5Sl7MctfZe/khu2NyV3OVfKbYZIsLiq6nZYEH4R7d5scbpGrbl2TDV4hnvKutia5VUcRwwMe0MUbTiAbWD087owHLjrcOOKgzBVstp221RFs+qUFpItV7N0T1hRcs6iEQaVmOSqp6YDgWXBffGbqQBMLwUmu8P7BQj3/pB3jDmf7Q3VVew3xFw1Bv5gsuAjFdre6MGQAAAABJRU5ErkJggg==" + }, "/content/translations/it/developers/docs/nodes-and-clients/eth1eth2client.png": { "hash": "5d5baad2", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABIUlEQVR4nH2SrY6EQBCE5xV4hDUYFAaPQqFQKBQKh0Kt4glQOBQOhcOtw+FwOBwOh+vL18kkkNu7STrzQ1V1dTdG/lj7vss8z7IsyyOO43jgzDcyoCiKNHzfl6IolLyuq4zjqJjrujQeAjywtm2Tvu9lmiYl4ATyMAzyfr81AYK4NHeyDYhkLstShdI01b2ua8nzXDzPU1daAmpkYO+6ThzHkdfrpUDuTdNIVVVKJhDFVdu26soAcl1XjDEa3BH7fD6aAYJ9Z1HGo4kAgyCQMAwVhD3O1HiepzqxJdAbyrNT4vuvKZAdq4gyBUSxSykI8ZYkiZb1ELANvIvYzJARybJM4jjWBtppfP0PrFUA7DZoGoL/lmDd2DlbZ5x5Y2J3tz8g+jN99f7GTQAAAABJRU5ErkJggg==" @@ -35,28 +51,12 @@ "hash": "9e54eeae", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABeElEQVR4nIVQy0oCYRhVCWrRpkWrINob7Vq2D6JeIAh6gKBFtZ1N2yA3bXyAIgh3FSRMTeBUZFqh5piao83N/Gdybja3UxMJbqoPDueDc/guJxL5pxKJxHA6l5sQLGwIBg6aXexUdMRDjQJi3yaKomIAooOggaFQuyqXF57qVcc29cA1jcDvWSBENfmOPf/nZvxMV3zsBYELpZztdYo3HilkPpyOBGKjQNfrIxGO44bn4vH1h9OjVa3AsHopkzJr12vq4/l9j89tSZqWbdUqUJ/v/fdmHeKbHwiKB0V1HUFzZiPHDDO+u7Of5NKXi9Vb9lHMs8leLbvUyN7k3yv5lbZhZKQWD+2l5HVfGxAlMxAlO2irvt0k+sz3qXccxikKsdSJOnVIYzQ8/ezSmgxZdv1t4OsF7s4hRdZRCxcf0NqQNTD9d6MhBgKM9RGKtCyPioSkLMeB5+MrQw+ioHK8qE8PBhbt8y/9EG+78y3D2+RJsNzQMNb3fAIv6TQpkmNG8gAAAABJRU5ErkJggg==" }, - "/content/translations/es/developers/docs/nodes-and-clients/eth1eth2client.png": { - "hash": "446b7673", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAKCAYAAAC9vt6cAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJ0lEQVR4nG2SoY6EQBBE5x9QeAwKtd/AD+BQOBRuHQqHRCFxOBwOiUPicCNXjkMQ0pfXFzbchU4mnemhaqpqMCJyykPVdS1Jkkiaptq7rpNpmnTd6jBPBOu6SlmW8n6/pSgK7fM8y+fzUSLKOcf++BLs+/4lsNYqQdu2CkBN0zRSVZWqgZC9tfYwzrkTNghYfBRFkXieJ1mW6YeoYE6P41her5fkef6rYBiGk9sYhGEoQRAoaBgG2bZNVUBEX5bla4EzVVCW5WmMERZgyAgKzxRgzvq+1z3EVznnDmOtPRnCjgVS931fie7yyYEZhFwwjiMq/oZ4BUmI+EQRYIAQAaYzx7I+IyHewZc/JHMTHd+oRAUKeWYsruv6/B/w3leIqKFjkfU/gx88penrzThc/gAAAABJRU5ErkJggg==" - }, - "/content/translations/es/developers/docs/nodes-and-clients/nodes.png": { - "hash": "63b5cec2", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABg0lEQVR4nIVRu0oDURC9iqCFjU0qETsLBSsrP0BE8AcEwV6wUds01kJAbPQHjPhAUBGRDSIxGCVRoyHr5mniZk2yd6P73r17ZBdTCKIDwwycmTMzZwj5xyKRSO9JIjFY1bHyqrGdqop14RNjPhYGuoOicDjcDUK6CCFdAALnwPX42G0uP8OXi7apf3iOpnrM0CBTqr22zOk/J+Obve6wTc+z0MqlTDmbdBoPV5bRFCEbeOK4Yh/heb53cnRkKXUcXVCyl3GVv9438slFmoml9VJqVVSUu1rxBVS4Z0qlALHJvLeGC4k69ptiT5C9s7PQRmR3O3MRm80nE4+NTGJLK9zMlpLx+3YhPf+ufsbr1Qrapayr1MoQ65onSob3LrtmQZLHg1UFASFfkINTOhzl0O+vfnQuD/lRYmwNcNDIpWz6fG3Th5jFqIRmG5edc3+I5xN23AczEvpF2jrUHQuuC2bqLsSa/CKIVvCJjmA+SRB/yzmgp+JgqqpiuSR7c2UFA52+LxXULvOIsGGOAAAAAElFTkSuQmCC" - }, - "/content/translations/fr/developers/docs/nodes-and-clients/eth1eth2client.png": { - "hash": "45325f76", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAACXBIWXMAAAsTAAALEwEAmpwYAAABa0lEQVR4nG1SLZPCMBTMX0DjMVUYFAZVheIHVKHqUKgqXF1VHKquCoerw9XVMBlOxMXF9a7X7M2+oT3u4828afKyu928FwWgBzD8TmPMcLvd/iTrT0wA8K6emx/hnMPxeMRms8F6vUaSJGiaBsYYXC6XCee975X3fui6Tgrjl8CyLAVcVRXquhYBrrMsg7VWMMaYfnJA8pgkLJdLcUESHVAwz3Ps93s5S9OUtF5Za4e2bcU2QUopLBYLAWitURSF/PV0OkkeDgdxRmzbtr3SWg9RFAlxNpvhfD6LGF0wSGadBAYdvUSvqqoa5vO52CKZYmwe70whOtntdiLAe1+v16nR1trvHrxOgFZXq5XcnaJM3p9icRxju91Kf5xzMoVP730Yk/N1zoUsy0KapkFrHfI8D0VRyD6O45AkCc/p4OPfd0CrYw/GkfFLd2MPOC15B8QDeLym9/5R1/XDWjvVuG6aRurcd133BuD+BVEdMopGADFTAAAAAElFTkSuQmCC" - }, - "/content/translations/fr/developers/docs/nodes-and-clients/nodes.png": { - "hash": "0792f586", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABe0lEQVR4nIVQO0vDYBRNRdDBxcFJEPeKm6O7IPoHBMEfIDioaxdXh4q4+AccFMFBBQvRKm19tlWrmGC10SSNafOlNu2X95EvWHBRLxzOhXPvuQ+O+yeSyWRPKp8fVGwsyjTYki2sig7iTEsAXVFRIpHoAsfFIgAReKCbaVdPz5NC5cW125+h27LCgLZhGKQl1enEn5Px7f4RYCMMHdTEgl1/OPf12zPHqVVBHJR4/qWXEwShZzweX7g93JkjpZNs8ymz2xLP58ndcdGW8stV07yWyyIM8SYg0jOq9SBUdB8a8VzFdMe4/XR6YH1te/MxdTpVvszdafe5Tbt8MV25zhYaYmFWt6yMJksg5Qe/8f4KtdoKVY2GOgnom9EcjVZVFAwwPuDpMM+jj62+d9QeYqx5wQrgoSbkXaOUcY0i74TkA3oD6c65MYbO85hRB0zkNa1PNYxd6jnwfQS07UOViSCpzZGfD2MmEf+Sd0vUm3i3/CXJxEzFRH+n7wsuAjFd3yKOmAAAAABJRU5ErkJggg==" - }, "/content/translations/tr/developers/docs/nodes-and-clients/eth1eth2client.png": { "hash": "689f8403", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAKCAYAAAC9vt6cAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJklEQVR4nG2Soa6EMBBF+w+r1mNQKL5h1T6FQ+FQOBxqHRKFxOFwOCQOicMhkXUIQmZz5qVk38s2mbSlM6d3bjEicsqX8Xq9JIoiieNYo21bGYZB42Mc5htgnmfJ81whbubbtm3SNI3mWGvZHxdg3/cLsK6rFEUhdV1rgYM4VeyrqiLvMNbaExoAgqQgCOR2u0mSJAphBphlmTweDwnDUNI0/VUwDMMJjQTf98XzPKV3XSfLsiiQAkDTNF0tcKYKqqo6jTFCUIw8jBrHUROfzx89c4WA3bDWHmZZlpNDCmgBx+/3++UBslFRlqUG7XBB3/eo+GuiMxIT8QEY7dAvxYBYo5RZnxETP4tdf+7dkcyaG4EA5UlRPM/z9/+A93YmusBA4r8Hb9236tzU73vsAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAKCAYAAAC9vt6cAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJElEQVR4nG2SoY6EMBCG+w4oPAa1ap8BtadwKBxqHQ6FQ6KQOBxuHRKHxOGQSByCkDm+uXRv70KTSVs68/WfvxgROeRi5HkuYRhKFEUaTdNI13UaH2M3V4BxHCVNU4XYmW/Lskhd15qzriv7X8C2bW/APM+SZZlUVaUFFmJVsS/LkrzdnKQDGgCCpNvtJo7jSBzHCmEG+Hw+JQgCud/vkiTJj4KzpwMaCb7vi+d5Sm/bVqZpUiAFgIZheLfAmSo4kw9jjBAUIw+j+r7XxMfjS89sIWA7TuW7OUkHhxTQAo67rvv2ANmoKIpCg3a44PV6oeKvidZITMQHYLRDvxQDYo1SZn1GTPwstv3Zd0cya24EApQnRfE5X/8HvLc10QYGEv89+Abdt+rcSheIqQAAAABJRU5ErkJggg==" }, "/content/translations/tr/developers/docs/nodes-and-clients/nodes.png": { "hash": "8d368670", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABfklEQVR4nIVRS0sCYRT9FKEWbdq4imjXoqBV27YRQX8gCNoHbaqtm9aCBG3qDyQYLZOIyR5GVqhpGTq+J8dHznzmjOM8vjkxopuIunA5F869574I+ccCgcBYKJmcEnrYrarsRFDg57uYdzgf4B4k+Xw+NwhxEUJcAIbOeRzuKV9a5atlo691bUP9spnWg0ypWm0rK392xlC9brJD29Yh8Yl+OxMz26lb3ZQaaOl45bjiOMlms2NLc7Pb8fPgJk1Hosr73amWf9yS01eJXim+J1L6/FHMQc4lGa0UIH4yu9a00JRNo0aNRRIKh70H/uBx5vJqrfj8kGq9Ph2pudhaOR5LdgqJjabSjdaFCmjhzeoIJYh11a7VNbspW/1CQ1oYjJrg4XWQu8cMx2HCGf3iBtMONhjbB0xQ/sWQ3qIGTUV0dD7R6uB6tO6P48E9codMNzAhyu0zzTRgWWB6j0GsyTle1AefGB3MERngbzEHeComlgUFOyXJXi9TTI7qvgFjSTBNohT5KAAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABfElEQVR4nIVRO0vDYBRNi1AHFxcnETcHC06uriKCf0AQ3AUXde3iXCiCi/4BBcXRIhKfFauljX1Jm6ZPmz5M8sU2TfP4cjRiQUT0wuUcOJd7z72XYf6JUCjkO+K48VoPm1WNHtS6CPId+F0tAHg/iwKBgBcM4/mgHgBfyQ652mOhtMhXy2Zf7zim9uZQvQeFEK0qdRf+nIyv7g2L7jqOAZlP9KVs1JKSN4YlN9E2kGbZ4jCTy+V8c9NT6/HTw1WSuox0n2+P9cLDmpK6SPRK8S2RkNhLMQ8lz1FSESC+UqfestFSLLNOzFnmKBwe2wke7mfPL5aKsftkO/24p+WjS+V4lFOFxEqr24k0ahUQIWOrtRLEhubUG7rTUuy+0JRnPq0meIy5yN5hkmUx4lo/u8aEi01KtwELhH8y5UzEJMlLA+or2iquBuv+OB68g3TFVBMjoiKd6JYJ2wY1ehRiXcnzouH/fjDPAH/jLDBUsTD/8cKNkuwslwlGBzXvY0kwTWsW/GMAAAAASUVORK5CYII=" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-nodes-and-clients-node-architecture-data.json b/src/data/placeholders/content-developers-docs-nodes-and-clients-node-architecture-data.json index cd5083f6106..ff1db1de8e5 100644 --- a/src/data/placeholders/content-developers-docs-nodes-and-clients-node-architecture-data.json +++ b/src/data/placeholders/content-developers-docs-nodes-and-clients-node-architecture-data.json @@ -7,6 +7,14 @@ "hash": "0a0bffa2", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACxElEQVR4nGN49OiR0IvPn/UevXunC6KfPHkizAAEoaGhzCC6beE64d4dx4TAYqtWgcXKZ67ib1x9xHYViP/58+eYr9++/X/+/MXb7z9+/P/+/XsiSFFpZycviK5csie5fNmebBC7fv9+FhCd0TlNvXj+tt7i7kXcDK9fv5Z68OxNyNbj1xsfPH4d8/LlS5XPn787rV+/Qxak2NDWPcPJJwJsQO2GA4FNO84HgNgG5vYzQuOzJEBshtyZC2Pbtp/4XzhjV/nSLVsEHzx61Hf48EltkJy2gZm+uY2THogdmN2QGF3RnQViW9o5GxobG7OCDahYtC2tZPmhH5mL9rdeWbWKDSjE+P//f0YGBGACEaKikm66WgahUDFmKF3PlDbzKVdq22LTkimrQE5i3A/0K5IBjKuggXfmzFXz9defOwDleIGBrwJWU19fDw4YkN///PkTNnPmTFZ0F+yHBt62rY+7Nmz9Nun9+9dlL1++2gtUA3GFuo6hiZmd+4K0zEJHmK1IzmeAGbZ/0VmVvVNug8MG5iowUNE2KXDyDP7v6RO2DMTv7e3lhLkEhOsh4cLQuON4cPX28+AwqP//nwluAAePiJ2Ztdt/W2efcBD/waPHC27evGsLYvcdPCNZt/lUM4ht5xcT5xuXlwNi163eG9k6d5soyHnMTU1NqnaOHpOnT5+nCuSzfv3/X/r69eughMSUVl/P5Z9Snrv//n0OBRUNexMLa19wmlh/PCt7zhEphncfP/p+/PTp4a9fv85+/vzlwadPn8AJBeQFYHLmBDK59U2sJ4aHJ8jCXCwsLMxrYGDZkpaWJsIADPmof//+/3/+4uVvoO3/f/75EwsNOBZEIKmwA3MCs729PUtoKDjwWAzNXYLs7eM5GB59+CD08ePHhlevXu8G0o1ALIwc8kSBDx8+KL1588Hlw4fvSiRoBscCABz8VnlIWv5NAAAAAElFTkSuQmCC" }, + "/content/translations/es/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png": { + "hash": "4e66c5e6", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACv0lEQVR4nGPYuXMn96dPn+w/f//uCqRt6uvr2RhA4P9/RhDVu2qH0LQthwVB7NBVq5hBdMfMVfzN6w7b/P//n4nhxYsPSp8/f/n6+fPn/5+/fn22/8oVHrDiwkJOEF2+dE9K+ZKd2SB2/f79LCA6rXWmRvH8bb31MzdxMTx//pz7/qvPkXtP3+x/+PBZ3KpVq9g+fPig3NvbKwRSbGDjkensE5kFYtduOBbYtOuiH1jc3H5GRHKyONi1OTPmxrRsPfa/YM6eKqAXuG7fvhe7atVmaZCcjo6hnoWdiy6IHZDblBRZ0pUJYlvaORva29uDXcRQtmBLesmKQz8yFu1vWQUJA6b/0DCAAiYQISoq6a6lZRACFWOG0vVMaUC/JHcsNetbfEYSKMC4H+hXJAMYV0ED78SJWxbrrj2zB8qxPnjwShIsGxoKkbxz547Yr/+/jO3t61kY0MB+aOBt3/K4Z/WWb/3ff792fPnydQVcgZq2gamxteu8yMQsG7Cb6v8zIRsAc83+VVdU9k65rY0cpWCgomVc6OwV8t/LP2I5zH+hoaEgBSCNjPXAmAEbvO1ESP22c+AwqP+PZAkHj4CtsaXjf3sX30gQ//r1WxmnTl1UB7H7tl+TbNp8qhnEdvCNjfeLzwWnibrVuyJ7lu4XATmPff78+QaevmFzV6xdqw8KoDdv3vAB/c0BVMcSU9zN7Z9SmXvr1j92eWV1B1NTGx9wmlh/PKtg8XZJhk+fvgYAU+LbX79+3/7y9esjoGYzSDjUs8THx4MM4dE3sZ4YGJgiA3OxkJAQn76+ZWtkZJoIw8+ffyL+/fv///Xrd/9+/Pj559evX1bQgEP4UUWFHRhszKCEAwkbexZDc5cge3ugBV+/fpV++/ZT2qNHT1vevPmY+OjRByHkkCcKPH16huv69esKx4494iRaEzR1AgDpxEHTeuf2AQAAAABJRU5ErkJggg==" + }, + "/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png": { + "hash": "180f838d", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACnklEQVR4nGNgqK9nOnLkOu+Np09Frl+/zhsaGsr8//9/RgYGBhBmaFu4Tnj2jh1CIHboqlXMILpj5ir+5nWHbYDqmEB85vv3Hy559fLVl/sPHq0A8lnAigsLOUF0+dI9KSVLdmaD2PX794Pl0lpnahTO39ZbP3MTF4jPdODMdd01+y7mnzhz0cLe3p7l5cuXKvX1vWBbDWw8Mp19IrNA7NoNxwKbdl30A7GNzO1nRCQni4PYDFXzliV17Dz1v3zh/ob6+nquq1dvxKxatVkaJKejY6hnYeeiC2IH5DYlRZZ0ZYLYVvauBiDLwAaULtiSVrziwI+URftbVtXXs4FcBQ0HGAD7VVRUxkNXyzgUKsYMpeuZ0mY+5UptW2HaMnOtJCjw9gP9imQA4ypo4J05c81i3bVn9kA51rPXr0uBZUNDIZJ3714S//r1qxkwFtgY0MB+aOBt3/K4Z93WL/3Pn993fPjweQVcgZq2gamZteu88IQMW7Cb6iHRAwMw1+xfdUzl8JTb2sgWg4GKplG+k0fwfy/fsKUw/4HSAzQtMNavWgV2Vf22EyH1286FgNn/kSwREJGws3b0/u/mHRYN4l+6cj39yJFT6iB23/aDkg2bjzWD2La+sfF+8bngNFG3em9kz9L9IhATeHhEpORVqzVMTYUh4XGXf/78+RxAJotP/Uwu/5TK3Fu3/rHLK6s7mJnZeoPU1K49nlWweLskWP/TFy+qfv3+ffHFi1c1MD8D0wMT0Bug1Mijb2I9MTAwRQbmYmFhYV4DI4uWyMg0iAtevHg5B6jp/+u3bxeA+LBoQwSSCjsw2JhBCQcSNvYsRhaugR4euexg+SdPnqjfunU3+tXHj6rIoU40uHLlCs/Vq3dUz5x5ykWCNnAsAADNQxUCTyPJKAAAAABJRU5ErkJggg==" + }, "/content/translations/it/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png": { "hash": "8e36d95c", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACL0lEQVR4nHWSz2sTURDHH4J4KHrxJmI9eBbxP/Af8CBULx4ECYgQjKlaFK3QQytePKgXNRWsUExdJYoVKQ0oSkSphKqNbdJWm81mzbabbtwkm2ySr29mm5ANOjD7Zt+Pz5v3nRGu68JxHFSlO06NnazZbKIl3bRK7GRuo8Gj9cdGIrkg97QgypUKvi+kkEwmeazIf95kWXBkHFGmcfvxMwlr8EUE/fIthdDYHZQrVQjXrUErrGM6nkBWzW9l4cAwDAYdPXYcJ06e4vjV+8948ymJUtGE2NaHzPIKBC3cf/IU/QMBjNydkNQyVld/orAFiEan8Dz2guPLIzdwSTrZlKLIbKse4F40BnFkAIO3xlFnLRzWoG2kE1nofBiBwBnfnGjIwLKrmJXpqXqBD3Yf7v5X5RMzOZ1juoQBbRKJRoLW6nUfoA0hm5yMY/zRB7nX5GcygD4PIg8hxA75XsWXXq/pOQO/0jn/E+hz8NBhCRAQ23fypG3bHR1anK7XG68/zuFlYs6XFQOuDV9nQPBcmCeX0hlsmCYL+tss4uaEl1kwPITTZ0McKzPvYGxYHmB+/iv27N0n67rcodOt1FSbsgsDwQvchaOjY7hydZj3RGIzyOrrEJSqpuWxIkXJ63pHXTpAwmpaDn27dvMlbVNVFf37D2BtLetVIfVjCbPxt1hcTLM4vVUoFjc7HUrrlNngxSF5QckD2HZZUnM8/qsCvcBuYw2ITOn+r3y9zdVdxr/nl13QtC0tDAAAAABJRU5ErkJggg==" @@ -15,16 +23,8 @@ "hash": "1773be8f", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElEQVR4nIVSS2tTURA+iK6KblyIuLALtwr+BP+AC/GxcSFoQMSSNj6wiBUFW3Hjwi6ENl2oYJs0Yii2liJYCVQqVWkNLtIYbe69zU3S3Lx6e/M493PO2BuSuujAnJn5zplv5pwzwnEcqdS2ben5AGSj0ZC0yHzBkoVSmbFavc7Wojj2Na62pSiWSlheXmFd+RFHiWIlCndsG8HINJ69ekOICyJn+y3+E71Dw9i0tyAUaGTzeD+/gLSmY4tiqo5sLsdEp8+cx4WLl9h/F1vE7OJ3FK0CxJ4uJJO/INTGyEQY3Wev4MHwC5QrFd7wCEKhMKLRKfb7Hz7GrYFB9sORCHfEBM8n3kKcOocbT0dRJ5DuCiklPFEdKentC8Dnu8q+49TYiiZtVu0aPsS+QMtkObE9uT3WtHUk9WwLZwKPXT1etVr9r3r74dfjHzEyNo9KxYJhrDPOVxgNjkGIvRgPTXa0vFMyeg5/EnrnFdRy/MRJIhAQ+/YzqDpRD6QquG2HZz4vYWphqfMKark3cJ8JevwBBleTSeQ3NvhBzYKFJy8jjF8P3Mbla372I3OfkC+U/xGoITp0+AgSidUWu7oGTScNVBm+nptoNJt4NDiEO/13+UwwOod0Jg9Rq9egGwbW1tIwTXN72sAJahp1Q0fXgYNcxJO0puFo9zHOUb/gplK/3emZWbIpV8VKAbTUsiyXiF3qiC29kevvCxBedIXXrmlm2e78wt1EuFKalGRu2jZbwtjuplSM7V/nW1vx5gT+DAAAAABJRU5ErkJggg==" }, - "/content/translations/es/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png": { - "hash": "4e66c5e6", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC10lEQVR4nI1TbUhTURg+m0ttitXQYhgUKRlqbbL8yuVVVCrxM1w40IYpSy1BUbICO+AHSDkliHCQLTJJrmihS5soFxKWmASCONqkdOHnZqx7valTduLcbSH9iJ4f933ue97z8vDc5wKDwRBA0zTBbG1l0DQthxD6AgyEeLhoyPeip/qJI5grSNIH11YteahpYEKOEOKD1VXHKYbZZBmGQQzLLlOzs4HccE3NQVzre8bK6l8ZbmEOKUqAq7pFe6ZWN6yB2kEhWFlZCfi2zijHP33pWFxcvk6SpK/D4QjTaDQiPCyVX65Iy1JWYt7w1pjfODqTw/Xjic7C0tJjnNrbnV1Fze+MqPrZ2H0IodBi+VpMkkOh+Cw6OuZcQnL6WczzqhpvKOseVmCemJwWQxAEpwjceaG/Wdf7Ybv8JdVMuj3gI48HHvDxIyREfCkyUlrg6XF+AAAgX60dFJa29sS1d0+LAQA8iqIE+xbwSI95k5PmhIG5ZQIhdGBhYR3PAqBQuA/n5+ePOpFTRhDQLWsf8EJcR/Tf2/r0vzq2dm2pa2u2u38GTkdJY2VJGc+VJZVyThNEnGQvvGoocjZ8/Iklav8n5RAeKatJyyxAmbmFr90d4KNQKPAAvsiDJMllAw5PFsDhz5wHEGfAC//AwxdliamISM9W4neTyVw+NTUTgXn7yJy4cWiqCfOU7GJVjqqKy8SDvlFlWw8VjOX56XQ66ZXsa129/f0SbJDdbg+iKMofACAoqn0UkFt2r8psdvmdCItIiY2VZ+EFDW8+VlZ3j4gBTbN5DLO54XTuWjZZ1mq32+M4iRAKVCoVXhIoOZ/0OD+/7LhXsUgkCpJIEluUSnUw2NnZK3S5ELLZfri2t3f2nE7nBTzE5dyL8HA/ABQ+ODhubwhBTHz6VYJQ+QOWZUM3Nmi11brUbLf/LLFaHVyE/wrSv7G0NC00mUwnjUYr9wP9JziFvwHpxEHTllr7JgAAAABJRU5ErkJggg==" - }, - "/content/translations/fr/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png": { - "hash": "180f838d", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACtklEQVR4nGNgqK9nOnLkOu+Np09Frl+/zhsaGsr8//9/RgYGBhBmaFu4Tnj2jh1CIHboqlXMILpj5ir+5nWHbf7//88E4jPfv/9wyauXr77cf/BoBQMDAwtYcWEhJ4guX7onpWTJzmwQu37/frBcWutMjcL523rrZ27iAvGZDpy5rrtm38X8E2cuWtjb27O8fPlSpb6+F2yrgY1HprNPZBaIXbvhWGDTrot+ILaRuf2MiORkcRCboWresqSOnaf+ly/c31BfX8919eqNmFWrNkuD5HR0DPUs7Fx0QeyA3KakyJKuTBDbyt7VAGQZAwiULtiSVrziwI+URftbVtXXs4FcBQ0HGAD7VVRUxkNXyzgUKgYODwYGhnqmtJlPuVLbVpi2zFwrCQq8/fv3syAZwLgKGnhnzlyzWHftmf3///9Zz16/LgWWDQ2FSN69e0n869evZqGhoSAXoACQgSB6+5bHPeu2ful//vy+48OHzyvgCtS0DUzNrF3nhSdk2ILdVA+JHhiAuWb/qmMqh6fc1ka2GAxUNI3ynTyC/3v5hi2FiDAwg9IDNC0w1q9aBXZV/bYTIfXbzoWA2dA0AAYCIhJ21o7e/928w6JB/EtXrqcfOXJKHcTu235QsmHzsWYQ29Y3Nt4vPhecJupW743sWbpfBGICD4+IlLxqtYapqTCIe/fuXf758+dzgBKVT/1MLv+Uytxbt/6xyyurO5iZ2XqD1NSuPZ5VsHg7KNAZGJ6+eFH16/fviy9evKoB8UF+rq+vZwoNDQWlRh59E+uJgYEpMhDbGBiEhYV5DYwsWiIj0yAuePHi5Zz/////f/327QIQHxZtcKCiws7AEMoMSjiQsLFnMbJwDfTwyGUHyz958kT91q270a8+flSFuQDFAELgypUrPFev3lE9c+YpOHMQCcCxAADNQxUCbjRzOgAAAABJRU5ErkJggg==" - }, "/content/translations/tr/developers/docs/nodes-and-clients/node-architecture/node-architecture-text-background.png": { "hash": "027b8aaa", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC1klEQVR4nI1TbUhTURg+m9OZWdrQQgr8kWSpOU1NzeU1ZpkxP/OSg2zkZKQhGRZWlBcVQ8oZQUYj+yAT5QYWanclyRX84ZARCKK0lsKknM6x7TqHqOzEe91C+hE9P8773HPe8/K8z3kvoigqyOFwHLO7XCecq6spNE0HIQDGAgha+pPk6dDYHuAkTQdAbNPRYS39YzKMsRAZjT/Clu1268KCFduW7bYpi0UCSQqNJgRiQ8+Xqoa3n68Cp1hWBFHTqjtc/4rRUrqBEMSyrMg8b8//OD7TZDLNlzEMI3Y6nQcpSssXSpKdrZYrlDXAmz6MlTQPTxby++nEs3K1eh+v9tqLN5fu6w34ZtfI3eta7Y7Z2dkKmh7cD2cJCcmJGdm5R4EX1zZXKm88qAaemS1PJgiCV4TuvGY09b2ja9Xdoy00RYEHQuzzwAchLJGRUXlxcUllvj3eD4QQJdToBkLUbT3HO7r1UQghAbS1rYCA9plnMJgy+qd/EdhoDDQapyEXIZLcOjSbzXvX19dTCYLakrUNUBCifmi+vX/I82hlxXbq58LirT8Jh+KT0lKyTr9UXtbIeE0U5iX74VfD0lMxI0++xwOnaexvAaGY+NQ6eT6JzxWV9/r7I0kSEuCigPLNBsUYyijmK+8BBTPgR3Bo+MmUTDkmcguU8D1jMl+ZmJiMBd6hn45qHJxoAZ5TUKEqVNXyM9H4bljZ3sNGgLzAzs7niWcU57v6+vqkGGOxzWbbxbJsMEJIdLH+4c6iqtu1jMkrjo6OzUlLkymgwL334zV1YLrT7c5zu1eXNjY2v3k8HhvHccWQoNPpAlUqFRQJlaZmPS4pqTrgVyyRSHZLpZmtSqUmAq2tbRR5vV5sXVzaxBjjTYwv+IzbZlKMGCEyAAZnyxtClJyeW0oQqmA0NzcXznFutcVibXO4XJUW37/w1yD9GxzHHXE4HKUul4s37j8v86/wG0wXRHmU2aX7AAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAACXBIWXMAAAsTAAALEwEAmpwYAAACwklEQVR4nGOor69ne//+vdHbjx+tPnz9arxq1So2BhD4/58RRPWu2iE0bcthQRA7dNUqZhDdMXMVf/O6wzb///9nYjhz5i7/m7dvXzx//uL/6zdvX1959EgIpMgnLY0LRJcv3ZNSvmRnNohdv38/C4hOa52pUTx/W2/9zE1cDPuBgncev/Xcevx6461bj0O2bdvG/uHDB+X6+l6wQQY2HpnOPpFZIHbjhsOBTbsu+oHFze1nRCQni4Ndmz93UVzb9hP/S+fsrSns7eW8d+9e7KpVm6VBcjo6hnoWdi66IHZAblNSZElXJohtaedsaG9vD3YRQ9WCbWnFyw/8yFx8oHkVMEyAQkz/oWEABUwgQlRU0l1LyyAEKsYMpeuZ0oB+Se5Yata3eLskUIAR5C0kAxhXQQPvxIlbFuuuPbP/f+YM65kz1yTBsqGhEMk7d+6I/fr1y8Tevp6FAQ3shwbe9i2Pe9Zt+db/+fNrx6fPX1bAFahpG5gaW7vOi0xMswG7qf4/E7IBMNfsX3VFZe+U29og9qpV/5nhClS0TQqcPUP/e/lHLIf5LzQ0FKQApJGxHpo26redCKnfdg4cBvX/kSzh4BGwNbZ0/m/v4hsJ4l+/dSfj1KmL6iB23/ZrknWbTzWD2A6+sfF+8bngNFG3eldkz9L9IiDnsU6dOlvPzSd4zooVK/SBfPbXr1/zAv3NAVTHElPcze2fUpm77dY/dnl5dQdTUxsfkAG1649nFYAC/cOXL+5fvnx99fv3n5vfvn17/enTpwCQgpkzZ7LGx8eDDOHRN7GeGBiYIgNzsZCQEJ++vmVrZGSaCMOPH7/9//379//Fy1d/gLb/BxLh0IBDCiQVdmB8MYMSDiRs7FkMzV2C7O2BFty/f1/g06cvyY8eveh4//Fj0iNoXkBLSPgB0NmawBwZ9PHjR3USNINjAQBMF0R5Kjv4HwAAAABJRU5ErkJggg==" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-nodes-and-clients-run-a-node-data.json b/src/data/placeholders/content-developers-docs-nodes-and-clients-run-a-node-data.json index 84cbdb3c418..fa5bb2fa9bd 100644 --- a/src/data/placeholders/content-developers-docs-nodes-and-clients-run-a-node-data.json +++ b/src/data/placeholders/content-developers-docs-nodes-and-clients-run-a-node-data.json @@ -7,6 +7,14 @@ "hash": "a1ffccb5", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNElEQVR4nGWRoY7CYBCE/xfgdXgEEhIECoFD1yFIEIgmFYgmlRW4CgQJrqaCpKKiAoFoUoFAVFQgEIiKiiHf5uAu3J9M2F12Z3emru978eq61ul0UpZl9lsUhfI8V5qmloOyLA3El8tFm81GTj+PwvV61fP5NEBcVZU1+b6vMAz1eDzUdZ2BmGUujmNr+Lt1tVppvV5bnCSJgUuoeZ6n5XKp4/Go8/ksBzMDh8NB+/3esN1uFQSBIOd/rmCAnN4oioyQBR8JbEdC0zTmByCHGBKaqe12O7uWGNnubSIJw+B2u9kwIL7f7+YHSyBAO3nbtr8X4C7GQPiN91dC2ng8Nkn/CLgAd78fpIDL0I0PmEqNiz4SMGk0Gmk6nWoymdim2Wwm55xhOBxqPp8bqC8WCw0GA70AVvrJ4VhtwvQAAAAASUVORK5CYII=" }, + "/content/translations/es/developers/docs/nodes-and-clients/run-a-node/diagram.png": { + "hash": "563703bd", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAIAAAC0SDtlAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIUlEQVR4nFWQoYqEYBSF/xeYp7FOHhAMJsOAwSbYJggGg2AwLEwwCgbDBGHaFINgMBgMhgWDwbDBYDBMmGBwP353md0T5Hq957vnKtZ13bat7/uyLIui4FlVFc/H41FKNU1T1zVF13W+74tNipdhGJ7P5zzPINq29TwvCIIoivbO6/ValgWigJTneSUF7EOKIk3TLMuYwGZZluM4TAISl8vleDzy7Xa7JUkShiGG6/UaxzEB7ve767rMsBAE2cQ4jtM0EZFIFJ9SNFnL6N4HRMGdJH/f8CXF6CBFTXrMUDGQDQPEHwOhuWn9L/oYuEFVVSJxJIj3Bv7D9kf7H2NP9is2wBU7ieNOp5Ou65qmwTMMQ0gpimKa5vl8pmPb9uFw+AZzhTgBqueBvQAAAABJRU5ErkJggg==" + }, + "/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/diagram.png": { + "hash": "7e3c66e0", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTUlEQVR4nF1Roa4CMRCs4Cf4F36AbzhBgiDhA0gQ5xAIBIIEQ4JAIBGIEycQCATiBAKBQKA2CAwJoiQdZjbvSB5NJt3utrOz0/B6vSKAeDqdYlmWcbvdxqIoPBYUK6d4v987lKuqKg6Hwxjwt5jA5XIBCfF8Pj2nc57nGAwGmM/neDwe3/r9fgdJESaTCabTqR/IDnZDp9NBv9/HZrPx2nK5xGKx8L3dbmM8HuNwOPj9kGUZBBXX67Un666U6nuv18NsNsNqtUKj0fCcCFxBPYIeSvL1esX5fP4HKVHteDy6Ip2Vp28I7/f768HtdnOIRA9qKKe6xpM6KdFj+SAFSaCkRJNSff4FiRLHSCGExJETmyQSp+8IYpTDv0tdBKmQGpmpUXR3t9shMDDeMxpio9HI+CsOOm38Oms2m8au1u12jQqMBEYfjKZbq9WyDxOMypYsezpUAAAAAElFTkSuQmCC" + }, "/content/translations/it/developers/docs/nodes-and-clients/run-a-node/diagram.png": { "hash": "de0308c1", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMElEQVR4nF1RoaqFQBDdH/Af/JoLgsFkv00wCAbBYBAMthsMBsFgMNxmNAgGg8FgEAw3GAwGg8FgMMzjDE957y4cdubM7syes+I8T8Iax5GqqqKyLHlvmobquub84tq2ZR5x3/fkeR4J+l0gPp8P7fvOQGNwjuOQ67r0er1o2zY6joOBGI1FEAQUxzFPAzDhuvR+vymKIiqKgs88n0+GaZqU5zl1XUfiL5FlGU/yfZ/CMCTbtknXda5blsU7ODRHY0i6JWAyJCzLwn4AyHEoSRKOwaVpyh4gh0RxmYhknmfGNE33BcRoivrVDNpRA3+/AEUYg4bfuAZAgqZpLAOvWNf1/y/A3e+FpsAwDOwRvIKM60W3BDj+eDxIVVWGoihsoBCCIcsy/wA4wDAMkiSJfgDO4cPYtDijAQAAAABJRU5ErkJggg==" @@ -15,16 +23,8 @@ "hash": "e3b11c5c", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABXklEQVR4nHVRoaoCURS83WL2B/wCf2HbRptB2GJb2CJsEQwGg8FgWTBYBIuwYYvBIhgsBoPFYBAOBoPBcIU778zhKbzwLhx0zjk7d2aue71eHoA/Ho++qiq/Xq99WZb2f7PZ/MG73c56xIfDwWdZ5h1+jzZwPp/xfr+hpN8aj8dI0xRKZPj5fFo9Hg8oKdxoNEKe55jNZtjv97bY7Xat5vM5lsulkaxWKxRFgTiObV+VYLvdwiVJgiiKrMllDvr9Pnq9nuHJZGIKPkTOOXQ6HbuIu18LZKOFy+WC0+lkRUxl6tXkckbFmoHNaNvRMw/lX69XKy5ygSS32w33+x0asqmgUlojZp8KAksTDhpM+OBPaXD2q4RBlQS1ENrttmG9LHwtkJEp/3eohKqm0yn0Mnsty0A/Ep2LepTBYCDqUYbDoWh40mw2pV6vS6PRkFqtJvoyslgsbEdfRFqtlvwAwibC8s8h8BsAAAAASUVORK5CYII=" }, - "/content/translations/es/developers/docs/nodes-and-clients/run-a-node/diagram.png": { - "hash": "563703bd", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAIAAAC0SDtlAAAACXBIWXMAAAsTAAALEwEAmpwYAAABQklEQVR4nFXQIavDMBAH8H6BfZrZ6UFhYqpiMDE3mKsoRFQEJiYKE5OBioqJQl1MxEFExImKiEJERURFRETFREVFH6TvMd5PHX+4O+6ieZ6XZTHGAIAQAgCklADAOYcAEZVSAKC1zvM8WgKtdd/3n8/Hez/Pc9u2hBBK6ePxWJNpmsZxFEJEnPO6rmWAiEWAiGVZVlUlhKCUXi6X2+3GOW/bNkrTdLfbVVX1fr8ZY/f7vSiK5/P5er3yPG+aJsuyNE0JIWVZKqUia61zDgD6vnfOdYG1tq7rLMvWnDEGAMYYrfX3hiGw1vbBMAze+67rlFKMMSGEMcY599uAiOM4zv8ty9J1HaU0jmNCiJTSe//dME3TWq/Wjw3DUP0xxiBitE5qmma/3x+Px8PhEMdxkiRRsN1uz+fz6XRKkuR6vW42mx9zhTgBxkIKKgAAAABJRU5ErkJggg==" - }, - "/content/translations/fr/developers/docs/nodes-and-clients/run-a-node/diagram.png": { - "hash": "7e3c66e0", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABWElEQVR4nG1Qq67CQBBdwU/wL/wA31BBgiDhA0gQOERFRcUmNU0qEEhERcUKREUFoqICUVFRtUHUkKxYkj03ZwIk9+ZOcrIzZx57ZpRzzgPwXdd5Y4wvy9JXVSU+QZ8c/bquBeTatvX7/d4rvK1tW/R9D+ccns+ncIwPhwN2ux2yLMM0Td/84/GAMQYqSRKkaSpBXdcoyxKr1Qrb7RaXy0VyRVEgz3N5l8sl4jhG0zRSr6IoAsHk+XwW8vNrVVXybjYbaK1xOp0wm82E4wBRgLexkZKHYcD9fv8FKmHudruJIsbku66Der1e3xuM4yjgEDZ8QI55rkd1VMJm3oEKAtE0TZimSfz/0Pd90FoHpVSIoigMwxDGcQzfFTiRF/5r/IWgCqrhMbkKa6/XK5RzzgKwxhh7PB5tkiSCOI5tlmV2Pp9bpZRdr9dWa23zPLdpmtqiKOxisbA/E4zKlib/CsIAAAAASUVORK5CYII=" - }, "/content/translations/tr/developers/docs/nodes-and-clients/run-a-node/diagram.png": { "hash": "8a127415", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAIAAAC0SDtlAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJ0lEQVR4nFXQoa6DMBQGYF6A19iDTCxZMoHCIdAVJDjEHAI3ObGkYgJXh6k4SUVFBeKIJogKBGKiAoGoQHS57XZv7qeOaP5z/ib7vnvvp2kCAM45AEgpf2fOuZRSKQUAiHi9XhMfIKIxxjm3bZv3XinVfFlrXWCtBYCk67rb7RaDh2EghNR1zRh7PB7P57Pv+6ZpiqIghDDGxnFMqqqKLyilWmsajONIKW3bVghxv98JIW3bcs6FEJ+TpJTGmHmedWCMQcSu65ZliSkAME0TIiaxNCIuwTzP5stai4hxyTAMWuvX6/XZoJRa13X/LwbVdX08HquqEkJYa/9+yTkX52gN4kmx7rZtPx1iEmPsdDplWXa5XM7nc57nSXA4HPIgy7KyLNM0fQNS+DrgBJSHbwAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAIAAAC0SDtlAAAACXBIWXMAAAsTAAALEwEAmpwYAAABDklEQVR4nFVQIdNFUBC9f8Df8EMEM2YESRNkwYz2BU3QRMGMIGiaIpgRBEEQzAiCIAiCIAjCfee7633vfSfsnN179+zZZfd9c86naarruqoqxLZt/zgi0q7rwIdh8H2fcQEk8zxf13WeJ1L8+Hlj3/dLAARtLAzDKIpIuCxLx3E8zyuKIkmSLMvyPEePZVmoo9j3PXNdl36kaTqOYyqAB8QgCJqmieMYv8FhD+ljCfKwtCzLKAAOkxi+riupwAL2RJHR0mCrAHrmN2AadRoCt+jctu2ZgC2P47j/g4RgWFEUOEcnJD5Xwh34Fw4BskTr4oC/O5ASSqqqGoah67qmaaZpMgFZlk0BPNm2LUnSC1L4OuDCBS0KAAAAAElFTkSuQmCC" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-smart-contracts-verifying-data.json b/src/data/placeholders/content-developers-docs-smart-contracts-verifying-data.json index dd4fe620d79..d12f9cbc826 100644 --- a/src/data/placeholders/content-developers-docs-smart-contracts-verifying-data.json +++ b/src/data/placeholders/content-developers-docs-smart-contracts-verifying-data.json @@ -3,16 +3,16 @@ "hash": "42415142", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAGCAIAAABFHomwAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA5UlEQVR4nD2PQW7CMBBFLeUW0Lv1Dix6AcQJYNuy4ApVD4ASJUqFVAXBJgpSNwkLEhNMZurYOP0htH9h+c/4/RkL1z10u+vPdc49ijjzPE+SZLCiIVJXzWysvV0UGWPQUEoVx5OUZ2utsU5duaxqXPBIwMiaELeON8+Tl/BzAwB5QRDEccxEmEXMxD9t26IlZN3Imq11xalcvX8UZYlldrt9GIZf221z+K7SLIoi8Gma9gA2QbzW7fLtdTqdLeYLrIEwZtZaI/5cScC+72dZ1gPDt4joaTwSQnieN4z+F3h1V8933S8FDQHqouW1xwAAAABJRU5ErkJggg==" }, + "/content/translations/es/developers/docs/smart-contracts/verifying/source-code-verification.png": { + "hash": "9e1984a6", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAGCAYAAADKfB7nAAAACXBIWXMAAAsTAAALEwEAmpwYAAABCElEQVR4nF1PQU7DMBA06jPo9/gD4hHAGcQR+gIk7hxiGtJKUVBBQZBLIxBK0jrNhmB7B9soArHSSDtr78ysAGBHGGPsX+5h//F1Wdo0TUOv3X/R0Sda+sIwaDADqu2htYYvpVqsyw/UdQOvbQxj1/WOb0PvBCCUH2y6sHx7v8TB4RHmi2UQyLIMUkZIFgl6IoAtiHp09Gsims2Omy2xNsxvVcVX1zf8XtXMjq9Wjyyl5PQhY3p55frpme/imGUUcZ7nzhIsvLMvrzi7nOHk+BTnZxcuooGxJsxHt1YpxEmCeRyjKIqfBMzssrlk7Y6m030SQtBkb0LDMIT5COdD7mZSSgX4d7/7DRXDYcZWrjjGAAAAAElFTkSuQmCC" + }, "/content/translations/it/developers/docs/smart-contracts/verifying/source-code-verification.png": { "hash": "ffbba644", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAGCAYAAADKfB7nAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA/UlEQVR4nE2QwUrDQBCGN69hX85n8OAD6MFLDx5Fz76B+ACSkLJFkJQKJQS8GEXabuuaHZNN9ndnisYfBnZnhu//GRUwahgGKWDshjDOWHVdoygKefd9D9U4gv0iEPnYGPBpnQxY1lq81h8wZic93wfZ3ca/j7veeyhumL0Tzwc9x/HJKfL5owDYKcsyaK1BLu5ECBHB0Te6rpMdZfZNBFB0CHhbr3F7d4/3zUaiL5fPyPMcT4sFmuoF21WJ2UwLtCzLA4BjsztRi+urG5yfXWA6vZTI7MKObdvKMXbGCDBNU1RVdQD8HsfFiJPJEZRSSJLkL+J/MZTvwiXQqB+mbWFPMLZAAAAAAABJRU5ErkJggg==" }, - "/content/translations/es/developers/docs/smart-contracts/verifying/source-code-verification.png": { - "hash": "9e1984a6", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAGCAYAAADKfB7nAAAACXBIWXMAAAsTAAALEwEAmpwYAAABAklEQVR4nF1OwUrDUBB80s+wv+c/iB+hnhWP2i8QvHtobEwLIVIlorm0KNK0fWk2xreZkfckCi4MzM4yM2tIdj1U9Zf36P7ti+WyS9M0cKfamVo+WckX29YRIG3V0DlHP9ZWXCw/WJZr+mxVcFc3LMtt4E6VxnphUwfz7f2MB4dHnExnISDLMkbRmMk0YSNCoqNIw1r+Ssx6s8N6K3AKvK1WuLq+wfuqBBSYzx8RRRHShwzy8ory6Rl3cYxoPEae5yAJ45v9+MTR5Ygnx6c8P7ugqlI7DXrfVlnLOEk4iWMWRfHzAQAhKVLtZDjcF2OMDPYG0rZt0HuAFKcq1toAf/febxXDYcY+OBTTAAAAAElFTkSuQmCC" - }, "/content/translations/tr/developers/docs/smart-contracts/verifying/source-code-verification.png": { "hash": "1faaf96c", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAGCAYAAADKfB7nAAAACXBIWXMAAAsTAAALEwEAmpwYAAABAklEQVR4nHVOMU7DQBA8lGeQ7/EGCv4ABX3awAOQqGlsYpzCMgpREISCiCDixOd4jbn1DLqLLNGw0kij2d2ZMSS7Ht0f/h/eV6suy7LAnWpnavlmJT9sW0ftyNJK4H6qquL684vWWqpq2O/rhkVRUhV0qjTWC7uaAHk3mfLk9IzRwzQY5HnOOI6YpikbEfojkYa1NHTuEGK2uz22pcAp8LHZYHxzi/WmABSYzZ4QxzGyxxzy8opi/oz7JEEURVgsFiAJ45P9eMfrqzEvzi85Go2ona+sQe/TKmuZpCknScLl8u3QAICQFKlrGQ6PxRgjg6OBtG0b9B4gxamKtTbA7/3vLy+/Yedw/DWAAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAGCAYAAADKfB7nAAAACXBIWXMAAAsTAAALEwEAmpwYAAABBklEQVR4nHVQQU7DQAxc1GfQ7/EGDv0DHLjnWngAEmcuCQ3pIQoqVRAtByqKSNpkuw4hGw/erSJxwdJI9njtGa8C0A/o/+T/4X2z6dM09Xlnba8MfUPTD9q2gxW6qsnnLrTW2H5+oa5rWGt9/2AalGUlNUMWQNWO2BswA/ezOc7OJwgf535BlmWIohBJkqAhgntE1MAIuu4oonb7A+8q4s4yfxQFT2/veFuUzFIvFs8cRRGnTxnT64rL5Qs/xDGHYch5noskWDllF27jzfUUlxdXCIJA7FoPxw9qWk6Jxc0sjrFevx0dMLN4E2fG0Hh8SkopGp2MqG1bzw8QHZKbSf7Dw/Xd7C8vv2Hn5dErgAAAAABJRU5ErkJggg==" } } \ No newline at end of file diff --git a/src/data/placeholders/content-developers-docs-transactions-data.json b/src/data/placeholders/content-developers-docs-transactions-data.json index 6b3ce6b7dba..51045a102bc 100644 --- a/src/data/placeholders/content-developers-docs-transactions-data.json +++ b/src/data/placeholders/content-developers-docs-transactions-data.json @@ -23,6 +23,22 @@ "hash": "2b1ea8a1", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhklEQVR4nGNgAIL/mWys/yPYmBnIAZMX/xdYvPj/6lmzPm+Yt+j/7oUL/7uAxNet+0+cgevW3WBbOve/zfxp7x0Wzf7iumr+UymQ+KEmJxaQqzBwZAQEg9h8LIwM/5s5mICYDchhAml8d2Q9z5tly8SAYiz/55qz/m/WYwPTYDbQ0P9izEAM1CPHBeKDXXHu6LuEs+f+nrh46f+Rqxf+Fn1cv0QbHDZzs1j/Z5qxrlu3DuydU0f/eu/c+e/Yzr3/95/a/c4Q7o17N/7WPH/+///rt///P7zyuwyseXKwwP9mKZ7/uew8/3tteUHO3bnuf/qMOf//z577///21b8d4AZc3XtV8cqN/9bnrv+3vLb/ju7H1RNk/1uwsP4X+s8I0vi/uQnsvYUf/vPe33ym5PnCVb/fzJjhD9YMDoxSdk6YYU+OLOb4vK6HHxo2LGB/r+NhBrP/izH+L43g/F4brwMUFwGpYYDYoMzxeHEyGIP9DTIU6Hd0fG+KN/uNpgg2sMVgwzmYADdN2utJU7EzAAAAAElFTkSuQmCC" }, + "/content/translations/fr/developers/docs/transactions/tx.png": { + "hash": "6be510fa", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABL0lEQVR4nI2RzUrDQBSFR1tURNwo2I1dV7eCqEifwogI+hCu3M0zFFppyM9kkoh00qAu6rYv4cp36MIuBjG0xzsjhZIs9MCQyz1fzr2TMEYCsFo6K6wk0ytzZaYiMFYJqojz9zVf4tQNcO6GOPN9tF2B1lKMDel58wPrEWNYIXDS6Xyss24XjSiBjlNApiiynJ4JhvbV+9YO7o52TS0SvCjyohhF+gTECaZS6ibzPOwFET57D5MZmfqRzFBiYAP44dacH2+bmobknv8F19eaBs1EjEkYYp/RKg1K1vkzoIYoRm/AIPvdQDmqNubjuq0zvFqPGMMSM1UKTROwQRtc0tRrX+BKSNwEdMfF/Rd/pN//bhN3axjDUn3hutj88yP/S5yjvnwcB7UyY3plzvR/AFUp6h+XmMqtAAAAAElFTkSuQmCC" + }, + "/content/translations/fr/developers/docs/transactions/gas-tx.png": { + "hash": "c3de15c5", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABhElEQVR4nGNgAIL/EWxs/5s5uEA0A6lg8eL/Agvm/109beqbTXPn/9k3Z/F/Z5D4unX/mYkyYN26G2wLF/yzmT3tucPCOd9dVs1/KgV21bpIZqCLMHFkBASD2HwsjAxApzMBMcgLTBCN63jerpov/t+Hlf1/sxPL/0wz1v9zzSEYxP8vxgzEQD1yXCA+2BXnjr6LP3To04mz5/4fuXblf+GnZdP0gaazQBRxcK1btw7snf27v3lv3Prt2L5D//ef2v3OEO6Nh7f+1rx49f//+/f//z+88bsM7JK5Hvz/KyR4wbjXlhfk3G3r/qfPmPP//9z5//9vX/3bAW7A1b1XFa9c+W998tJ/y2v77+j+Xj1B9n8aGy/QiRxgw5qbwN5b+OE/7+ONZ0qeLVj5+82MGf4M0Chk/l/Kzgkz7MmRIxyf1/Xwg8VBfgbhdTxANgfI/4z/SyM4v9fG6wDFRcDhBnLa/2ZljseLk8H4/9wsVrBmUOCh4XtTvNlvNEWwQVwFNBBoAABAw9xkciqS2gAAAABJRU5ErkJggg==" + }, + "/content/translations/hu/developers/docs/transactions/tx.png": { + "hash": "b677d6a3", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMUlEQVR4nI2Rz0rDQBDGV1tURLwo2Is9Vx9AVKS+hBER9Dm87Rso1RQa8me7SRGaJkoOeu1L+AIehXqwyAoN9XNnpVCSg36wMDvzm29ndxnTArBYWAusIMoVuSJTEhgrGZXE+cuSJ3Hg+zgKQhx6HpqOQGPOxpi03e8dqhHjaFYI7LdaWGa2/VmTPaiwBwQSeZwCMkJiWq8aG+DHmxTLEBnV/C5yYjUzllLVmetiSzd+3Npv07v2SEX3xqhvDPju2ojvrVPcjZC6YoLrm1flel9TvX8PArXN9Cg17azSRyB5QP70DPQHvxPEVlwZ8mHVxANkppYgTzPDjOMYdTJY0WOd6lPPPYEzIXFB7zG7/+xHOp1J0w9xSQyxuufEcbD65yP/S5yjOr8sC5UiQ7kiR/kfF5Xp1Hwzpb8AAAAASUVORK5CYII=" + }, + "/content/translations/hu/developers/docs/transactions/gas-tx.png": { + "hash": "2bf689ee", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABjUlEQVR4nJ1STyhEQRx+u2//vNUue9CqPWzJleJCQiROlIODvREHUQ4KJy77rusgth7rsWwKm4nyrzattg1JlBbvICXLASux2fLSZ2bEwUmmvmbma75vfr9vRhDowKDVBlmyCP8Z4TCcwalMJBB4WA2FEVVVNDCeEIh/MiBEsyjT79Xq5H3tfDDTuDx762Z83Fdvgtci/sZKm8jB1vSYQQBcBnRaJDSbrUyoEWLPLs8W0JZMUCvM6Ck385lBpqZwiRRGyJ4ctudVHOzedRzsZw5PTpBInn70Py0qpcg1iRgrZNlIhBDeTjz61rSxre9tRhFLrKfKftq40vTh1C2QTgPXmj7Egx1vdUJ229FntWO0xkENDZsE3co0EJwBtiJ63Y/B2c5ZYVJD1fEFKs9jlyUvC34PF7KSqRCyz8jOzT3DcbN2NHAXWtIfFaWFi3k49Bm/zVKJhPRK/HmcZwYMxC7yTFheg15bdqS9mPL5lDMKXzcUSTfhLg6ovWYuZuH9wtVEk1Xzefl/4YbU4BOjzNlVEleqewAAAABJRU5ErkJggg==" + }, "/content/translations/it/developers/docs/transactions/tx.png": { "hash": "49fb00da", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMUlEQVR4nI2RwUrDQBCGV1tUBD0p1oO9Sl9AUCs+hAQp6GN48LSvYG0ipmmSpi0Yt2lVEK99CZ/BiyKSQyoE8juTWijbgw4sO/zz7b+zs0JQAFjU1oLQgjWd05m5gBBzRnMh5euS7eGg2cSR7+PQtnFsOd+VGZvcxHJQ4RozzN62sF+vY1mYJkpBD0mnB3gB0lAB7S6i/Kjc3ogvq5uc+108qsGEoTozcRAkZeE42CIxbpjvWcP6GPsdwG1D5QYXu2uZ3FvnnJhhy09xdf02vrG/Ms/Hp+dhR1BLpTBC0id3FSF9fgHu1KQDZajCSI6KnJP2xLV7YgYPQNhHrBTKbLBCtxrUUo1uOaX9zHVRnb5/+iP5jAKc/zI1OnNCM1n9c8j/CilRnF2GgYLOsKZzrP8Ap7zplJ5Gj9kAAAAASUVORK5CYII=" @@ -39,6 +55,18 @@ "hash": "5c846059", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiElEQVR4nJVQXSiDURg++2yzDVMm5YbcSkqipUTaxcqFq90prubKhZYLpc6tcmOsrz7aFpI6tchyIbVNoY9cbFmK1FDLfyEsP3mcczC1K049nfM+7/s+531egj5igZfYQDk8pIj898xO3TtU9S4y6c9Gg2HE1CBcgmcMfxNjLG0OafdtqnrVHpp+65rXrqoFD1BFTFQI9g0ZE2IglBJF2nCTYkGcryVLEJmr4gXWNK03g3YYoTWbJMQbvFGAVttELKfY27zp1/Xcrq4/bW1uXA+fhcZb0EFK4Wss+RissIMxaSe2/tgdXc1tR1dfEonlTFPexmHqdfTkBMhmgfTuw4i0MOYqx7CjDFzgg7ba+XTKCnsfCGiANgNEF3OdeYHkWrJufx9tqRScB/Hjhmc2UQMnsf7kARjEHb9EaWZpx3c6s/B2EQj0fCXFMoZ+izPxsAXaWLnkKTHm4SUm7t2AIY/11tfbwP1Xcl4hYnGgtZZMuE8Cmtckm718aQU48ruL09Rjlh9/CSufvrzXg22hqYEAAAAASUVORK5CYII=" }, + "/content/translations/ru/developers/docs/transactions/tx.png": { + "hash": "316a39a0", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABLUlEQVR4nK2Rz0rDQBDGV1tURLypuehZfQCxpfQpjIigZ1/BU56hkJSk+bPZFhq7SahC9dqX8OQzVNEeIm1oP3dTC2WP4sDAMPObb2YYQoQBWFd8jSgmcyqnMn8zw3jd8BgqvoNaEKHqeag7FMcrs4ttLHd+UtQCVB0ftRbFeaPxtklME1rYQcY6QMCQP3BAxEnReq/t4a6yL2PaxmOcLhjJip4xYzgi3S4OXG/6ZVmjWdP+zFx/IqFeIWCc7syNs91fgdR1v2E2R5llf8xa/uQ9inBIKIXGU2RpH0j6yJ9fgF682IDrvDQ0huUijvE0EDWeIJesYMaciw2EwJYf4lJMvfYorijDjS9uXN6//IhtT+thG7eSkazouXAcbP/XJ1BedV1HSWVkTuVk/gfRsOiehUcAoQAAAABJRU5ErkJggg==" + }, + "/content/translations/ru/developers/docs/transactions/gas-tx.png": { + "hash": "6215b9db", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABk0lEQVR4nJVRTyiDYRjfvu379tkMSSOK5CpyIUkktylu223iIG7k34GLT7lwUDtsYz7agYa3lFlirbQpcdJWX6lFo0UOC5l88fO9rzjsxFu/ep5fz/N7nt/z6jAs8BrMmDAVADa97r9PXn4plWV1x+2+3/P63o596+imPCEw/EmAEEWQA2jzeh86/L6X7qB8V0l5YJ6DUzDkY9fhYGB5kVGvgyRyGBBENBoFSjxGIpZcUC5HH2+G1CBA6jLC38Iz0Bg2gwYOUrWZ5myL89h9fzz2dJZIIJ64xOhT0NsAl2DBWF0JpqoshBBm5+To1R4Kv5+GDj+j0f1006+NlPIxk8kA2Sxwo6iTzMJmTxGmK6wMS+1Wut0BwZBnFVhZA8LbauevQDKSrE0oaDu7ROtV7Lpe3VqoQQ9vQin0tBHSHEfrNrKwpvcuxjPr2+qjx9PLmtkxtC/8EbuNBcRnsljMbiOJRuabFBpYrH0zJpwFuVlXvcaX0Rrd94Q6MR0YZIB/hGeiw818PlJuu0mZcwpsMBMXuS+h1OBFwGFOlAAAAABJRU5ErkJggg==" + }, + "/content/translations/tr/developers/docs/transactions/tx.png": { + "hash": "9f39d2af", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABKUlEQVR4nK2Rz0rDQBDGV1tU/He1F3vyoBfPWqS+gScjIuhL+AA5e6ym2phNtrvtJWlCyEGveQmfQhG0h4CG9nNnpVByFAcGhpnfzHzDMKYNwGLFF1jFKFflqszfzLZflrjEoevjKFBocY62K7A7t9uo6XrTPVML0CJWCBx0OlhmjoOGHKJQQyCQKMMY6Csk1DS1dzZxc7JBsVTIouSXIVYNMJayaDLPw5bfx6fTfZvcP3wUcgAIhdDsvt5fg3O8TjEN9fgXbu9ei0deTDTzHgTYZlpKQ08ukhSIU5RPz0A4QkxNkRXV8jyvm3iEzNRilGlmmHEUoUkDVrSCMy3tggucC4lLX984u3/2kV7vu61VXBFDrO45dV2s/tcnUJ93y0KtylCuylH+B8EE6WdMqMZ/AAAAAElFTkSuQmCC" + }, "/content/translations/zh/developers/docs/transactions/tx.png": { "hash": "90e11dee", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABNklEQVR4nK1RPUvDUBSNtqgodrWL7l0cBVtLV3cJUtBf4Q/I7CKmpmCS5uMlwdbX1BJQ1/wJ/4FDcXHIkCopOd4XLJSM4oULl/POPfe8eyWJAsB6KdekUgiszCtz/haK8rah22gaBtpBgJZlodM3vxorsws3fRMNXUfHcdCyfbTvBzhWVWxKmoY6C5AyH7CcLHt4BFwPk6JVOarlymlN1MxDxCfEcReZ7eZwfSSM4UAyTezZDElP+8jV3mxumCmRwAuBq8MdXDd3Re0wPJn2N25u3+fq3Swf2IvP4RD7Elmqj0KkY1IPp8heXoEhRyiauMwrcRxXRU1Y9ExvPEQ2jYDRGIkuHJDAluNBJktdcnJO0y9oDyfL/y8vInZELi5/OV3qOaOdbP/XJVBdTVlGpcwRWJkn8B8bxOjX2tlNkQAAAABJRU5ErkJggg==" @@ -54,33 +82,5 @@ "/content/translations/zh-tw/developers/docs/transactions/gas-tx.png": { "hash": "e79ca859", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABjElEQVR4nJ1RTShEURSenzfvvdHMkCQsRLYkCyREE6tRFjZjRSxEKQpZsJmXsrGikF4z49E0yrVQJk1+EmKwoMFbiISR0kSR9OJz351QbOTW1z3n657v3PMdAxycEd2CA5JoMvznKApSZpT3+fHxxwWfgrAso0bnCYH5TwKEqLzsQ4U8Ga+a9j7VznlvsnR+w+Pk4ObNv9DoToDG9JnRAKQb0cKLlLDqhSohttfAcCbNeUhOTvUU8JBLLQw0p+/NFCZI2Ul6zn6xsx5rPtjTIsen2Iweous5MFSMQo7HWJ1AvREJIWycyNabK7SsbYdXsRYJx4u+xjiLvg3c3gGPD8ClqvXpHEYbUtCfYUenYMNIpV03eymINv8soFCEAlr1t8DKce5eFOW7Ryg7WTsr0KakHLadVBjZLXnYhvwPsF8s7vfEfEHtfmKinhUzY3oF66fY9aYigsjJ+lopODY3sZlZrPvV67a+DDblUz6NrT7RIU+8UloZIHdYmGh7ieUnzsdcgkoaedaYiYumD7UO3C+/vhqyAAAAAElFTkSuQmCC" - }, - "/content/translations/hu/developers/docs/transactions/tx.png": { - "hash": "b677d6a3", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABMUlEQVR4nI2RQUrDQBSGR1tURNwo2I1dVw8gKqVewogIeg53cwOlmkJDMjOZpAidNkoWuu0lvIBLoS4sEqGh/vJGCiVd1B8ePN7/zc/MG8YYYwCWC7XECqJZkWOLBMbmgubE+etKoHEkBOoywnEQoOEp1GZibEjL/9kjjxhPoK4UDptNrDLX/aroDrKoA0iN3CSAjtG3R69rW+An29TrCCl5IkROrI4x0jqrMt/HjtT4vHPfJ/etYRY/2KCuDeD7G0N+sEl9GCPx1Rg3t2+ZH3xPwhgfUma7TClUTIIseQL6j8ifX4Bu7+8GxjGlAR+Ubd9Dar0+8iS1zMgYVClgTYQ4kxoXgcK50rikfUzfP/2RdnvcEBGuiCFWhDj1PKwvXPK/xDnKs+U4KBUZmhU5Mn4BF5Xp1KCBHo0AAAAASUVORK5CYII=" - }, - "/content/translations/hu/developers/docs/transactions/gas-tx.png": { - "hash": "2bf689ee", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkElEQVR4nJ1STShEURi9M++9eW80hoVGWUzJlmJDQjSxGmVhYXbEQpSFMlZs5m5ZCPUYz9+kGLlRDDWJNCGJkp+3kJJh4S8xUV46ulcsrOSr0/3u6Z5z73e6hBBCEFSdoJqD/KciEWSGR1Pzw8N3i5MRxA0D1ZxnDNKfDBgzHfrYe7kxcls5HU7VRCeuczi/FfLJCDik31hokAR4TwixEcBjQ7NDQ62icqHJmOstOpENqskwShS0FSti5aA+GfBIgMcO6k3je8Jrd/OmaXcntXd4iMTx0Ufn46xeCLcsYSCXZ6MxxsQ4W/FX/8qatR2LYyOxnCz6GePCtHqS18DDA3BpWt0i2MH6TNAcFzpUF/or0uGWbTGGVn0MCI8Dq/NW1Y/ByfpJ7rGJsoMzlJ5unBc8z/R5hZA/2S3bQEN2fm7qCelXS/tdN5Nz1r2u1wmxCCeoOr/NkomE9sL6MgTPDTiYSxKZ8LyCAedbb2M+qC8LVLOTrxvytKtIiwCMdkWIeXi/cDHkV81QQPwXYUg1+yejzNlVQLeFPgAAAABJRU5ErkJggg==" - }, - "/content/translations/fr/developers/docs/transactions/tx.png": { - "hash": "6be510fa", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABL0lEQVR4nI2RwUrDQBRFR1tURNwo6Mauq1tBtJR+hRUR9CNcucs3FFppaJKZSSKlSYO60G1/wpX/0IVdBDG0RyZSKOmiXnjwePfM5c2MEEIIYL1Qa6IgMytyYpUQYiloSZb1seFoLmyXuu1RcxwatqS6EJOHdHqz49zzqBlWSs5brc9N0W5zqAJSPwQdksUJ6IBhfvShusf96b7pZcBLlIDyycI++AETrdOK6PU4cBVfncfxVPmkT33wNIM8wDrZmVlnu6ZXAUnP+cZ20lSHTKXP2PM4ElJyGCWkyTNEQ7K3dxjEfxtEzag0skblvI95zb0hmWEHMZMoomICtlzFlae5cSTXUnPrutTn95//SLf703AVd4YxrKu4tG22Vz7yv2RZlBer2aRUZMysyBnjF1Up6h8gXS3yAAAAAElFTkSuQmCC" - }, - "/content/translations/fr/developers/docs/transactions/gas-tx.png": { - "hash": "c3de15c5", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiElEQVR4nJVSTyiDYRz+9u/bu2Wbg5Ci5EpyIaHWOCjK9XPaQRE3hRy4eK+UA2tlX9/WSrF6i8JhsVojxA4aLUnJ38Roajt85tH7Lg5c+NXT+/5+vc/T8/x6JUmSJCiyDErs/JT+W+EwSoNaIeJbfFpXtfedQBidfM4YTH8SYCwth4If7Uu+e3cokO9a1W6rhCvWb4Ii/0a/UgS/O80GCZQYQQmPYCwSWcnzqlaBXosV1GPGcLMFaksRvEe5CSg3gtbYeS/xSu5mvPF4dv84icRZCqPZZV8jnGZz8RGxM8ZEnFg017O2kdvbiSN2GM00fce4Oi9MPTwCLy/AVVqfEE7UbhcmKx0Ccx0ObneTYcgfAFQN2Iro7m+B0+3T2lQKbQcnaD2LXTTokflqDMoOUA8RYnRGxAu9wnG9djR2F1zRn/z+PkEWyxi32r7EbhIJ8sZmXWLOM3OwEhMo4fkNGFds+WlvPainTOyNWwOtI9fhAQGoIxZB5sv7gcuFHmt6RhF/RQhSYvwEQMPcZDPiz6UAAAAASUVORK5CYII=" - }, - "/content/translations/ru/developers/docs/transactions/tx.png": { - "hash": "316a39a0", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABLElEQVR4nK2RQUrDUBCGn7aoiLhTs7Fr9QBiS+gpjIiga6/gKmcoJCVp8vLyGmjMS0IVare9hCvPUEW7iLSh/eWlFkrWHRgYZr75Z4YhhBACYLvkW6RkMlfmyEZM1993XI46taF6IRqui6bNcLY2u9jGdBbnRc1Dw6ZQOwxXrdbHLjEMKH6AjAeAx5E/C4AHSIrWJ+UIj/VjGbMuXuJ0yUjWDzDhHDXS6+HEcWc/pjmet63vzKFTCUWFgH5xsNAvD/8FUsf5hdEeZ6b1Ne/Q6WcY4pQwBkWkyNI+kPSRvw2BKF5uIDRRGemjahHHeB0MAZEgl2wUYyIEalJgj/q48TjuXIZbxnFPKdTV/auPWNas6XfxIBnJUh/Xto39TX0C1XXXNFTKjMyVOVn4A9Gw6J7bqSa1AAAAAElFTkSuQmCC" - }, - "/content/translations/ru/developers/docs/transactions/gas-tx.png": { - "hash": "6215b9db", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABk0lEQVR4nJVQTyiDcRj+9m3fb982Q9KIIrmKXEgSabetuNmNOGhuZDhw8SkXDmqHbcxHO9DGr1b+JJbSKHHS1FdKNFrksEbIF49+P3Fw4q2n3vfpfZ/3fV4BXiLBS6zwmS2AwyD8N9S5pyJV1df8/rt4MPS6F1qCk/GUwvgnAUo1okbQHAzet4ZDT86oelvGeGBKhIcYf2O9q4uD1/kmgwBFFtFLZNSZCCMeEgnbS1QtQadkhVJLoLSbEG6UOFgOhxFwiFAqrKwWWJwk73oOk7njVAqHqTMM5qLBWnQTG4aqCzFabqOUcjsHu8+uze23o82dj/39jXT9j41L7X08kwGyWeBa00e4hRV3PsZK7RyzLXZ23RZFf2ABmF8EtmN624/AeeK8KqWh+fgMTRfJqxp9dboSbsmMIhjYIJRJkfUtZ2FPx0+HM0sx/SEQ6ODD/Bk+s+Vb7CYZkR/pTAH/jSKbuG+aZ+Q5HAb4PJaXie4aKO3FrEf42lAtpyN9HAgPSFzU2yD9xqXfZdYmPYQv5uKy+Amh1OBFX59pVAAAAABJRU5ErkJggg==" - }, - "/content/translations/tr/developers/docs/transactions/tx.png": { - "hash": "9f39d2af", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABJ0lEQVR4nK2RvUoDQRDHVxNU/GpNYyoLbaw1hPgGVkaCoC/hA6S2jF40533s7SZNLneEFNrmJXwKRdAUB3okP9mTQLg6AwN/5v+bmV1GCCEEsJrLFZELU8tzYinRbL6tuYpT26PqayquS82WHC7szl7TdmZHmedTMayUnLRarAvLoqR6JLoHviLtRxBoYtM0ax7scne+Y7TSjML4nzGs7jJRKikLx2HPC/i22h/Tx6evRHVBavrZ7tvjLayzbaPNUMf94f7hPXl2k6nUfPo++0JKSmFMEg8hGpK+vEJ/QGSawnpYGI/HxUwPGGVeRDocZcwkDCmbARtewKWvuHIlDam49jyq8//PL9Lp/NYCzY1hDOsFXNg2m8u6BMXFrNcp5BlTy3PG+APBBOlnD0PU9AAAAABJRU5ErkJggg==" } } \ No newline at end of file diff --git a/src/data/placeholders/content-energy-consumption-data.json b/src/data/placeholders/content-energy-consumption-data.json index 3a203053a33..4cf197b5a2c 100644 --- a/src/data/placeholders/content-energy-consumption-data.json +++ b/src/data/placeholders/content-energy-consumption-data.json @@ -19,64 +19,60 @@ "hash": "db7c5eb2", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABjUlEQVR4nE1RwU7CQBBdChRBI1CjJKg/YCJXevEAgYYDScuhB5oYlUoBA5Z6EJTECgeJCZFggKQfwAVv/gBXDxy5+Al+Be4zXcMmk52ZffN23gzJ5XIB27a31uu1F/bpOKH5fM6PRqPAYrHwbdpyufTDWAw8MQzDr6oqT0l8hJ5m/fLMNC8ilmUFaY6nII4SgpzDO709iP9z+Xw+hGIkAOg0S5Jtm5FGoxFwHMePAgDRqSyLp/Ted4k4WseRQqFwsPnD8PWpOJ32oyr9HQSQI4pHwVqjI00G1a+XntUnROUZMZFlOYIOEKxWK/590G3PZv0oJFAT6NtuJqOGTbNeHL71frrP7Y9YIrHtEniJJEkC0z8ej3ce7s3Jo2Ud0tmEWq1WmAHT6WSsVjOUVCorUegJ5vbXAbRBLwhujKtkuaR9G/q5hhibYEN0h8qBMB6PH4uiGIQPnAfThlMpFyt3t3q23byuYpBsVQCiG0hiMVs7cQ+YOF3XBWxF11UBLbJH6gc1TYsqirLn5j2ukV/Nf+duuMjn8gAAAABJRU5ErkJggg==" }, - "/content/translations/it/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "b778eb85", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnklEQVR4nE1SXUvCYBSeTvMTypZpEV52MbAboW5GQowasSKDQZg2zPHaNr+RUroYUV70sVKoC/Ef7LYf4E2X3vcP+hvrnOmiFx7enfc85zlfowRBCBiGEbRtm0ZYlhmyLGthOBwGRqORfzKZ+FxMp1M/wrWRT0GwD7Bg2xZNwWnXS5xhtJZrtZkAkDwAL97o/2c7oAqFQgRFUBEJneblfr9Xi7vZ5wGeTIb4peNt9mhvJ4E8qJKGOC8lSVIcDSwNHYMnIz8eDxIytAWEKAT7WpIUIpqx+/6sfj32m2+JrUJkLkxTuVxuDQUQ+Pjxen89HgwSIiHhdpusYCU8zy9Wq+qJ+XL303+4/Uyl0jFMhpVToiiGcQb4AORw76ZudrvtTUKIfzabWa8cx8Xh7ZTnhUOgstlsNujMAFqgZVkOokBLJ2mldPZNyhcK2qbpbMTZDn4jF6tkGGadZdmoO1ivW0FFyZf1q+JBp1Gu6LrO/E0ajqZpUVVVY66NtzNEdzX4LyjK+QZkiUJFyUajsYQ+3ARsahUBvmSxWGSwd1f8F8ZG8L4ZuviOAAAAAElFTkSuQmCC" - }, - "/content/energy-consumption/energy.png": { - "hash": "be71e967", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAKCAYAAAC9vt6cAAAACXBIWXMAAAsTAAALEwEAmpwYAAABq0lEQVR4nGNgYGDg57Gx4WKVluFiZJTnkJBg5VEQYhEUZGTkB8rxQTE/GkYWY+D476La9d9JJe/T89S626vcrUCCysqigoQA2AAWQ042oAFHgXjh///Zl/6fdqv9v9+2cmmZijKTkL6gtqysiJycnDA2jGzAISCe//9z5sn/Zx2n/b/n8fzjChMtoAI2LxERYQUhIZCFAugY0wWfc878P2E/4/8llwfXVkbatU96oq7kbcojqavLq6WlJQqyVVFRUQiGkQ04DHbBx+xT/4/bzfp/xvnyx2sv5j578n//fxuF1v+WcvGgcDEUFhEUEBAQwh0Gf/LP/L/gNOf/Nbcrfx98Wfzp6/8jQPGTQDwh4f8plYyMcEWgJl6oZgHkWJgBjIW6H6+zF/w/4FD5/7jj0tdnH9fdf/x/5n97pan/LFTLqj5tXtp4YEqAj7KPcGJipmxwcKwUNDoZ+BUDA/lZNTX5jB38hEVF1fk01DIERERE+NXVxfnlXV15JYByqiKi/CoqKgJWVlaiurrWIra2tiJwA0AYlHCEGRnhCURYmIWfWVgYPQEhJy6wWgCan6Lf2je5qAAAAABJRU5ErkJggg==" - }, - "/content/translations/fil/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "29d225d1", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpaayhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMWNjY1aQITAF1QVJbvX1+QK5ubnsaWkzQeKMIAxyqb+/hS6QFoUaxAS0gIkBaLsQsg39nXWR09rbBePj4zmACrhA4hYWMpyZudVuU3syTrQ1FbYzMISyQQ1mYvD19RWHGXDlyhW2ST2NFevn9wtkZWXxFBUViYD87O0dJZifnxPZ39f0srGhYrW4nh431ABmBmdnZ2GY/6dMqeepLMufWlaWKwPy/8yZYC8wgRQ6OZmLZ2Wl+zs6uroBlWqBwg3sAnt7exaQf0EG5GclmqcmRd1MS46NAvF7e3s5QZpBLoQGKtjfUlJSshYWFiA5RpA6RpBtIEZaSlRaQUGiS0l+cjpQjA8aVeCwAVrCV1FRIQjTBIt2BihgBDqJHxhwEn5+fryRkZEioLABxVBUVJSgm5ubUGBgoCRQjSgo0EF8oB6wwQAkbeW3BUKC+QAAAABJRU5ErkJggg==" - }, - "/content/translations/pt-br/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "9bc5f7c6", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTUlEQVR4nIVRv0vDUBB+o+Dg5t8g6Oqss+g/IKIodRQFu0kHIV10VSgo2MVB9w7StUswUIgUipHSNIFCNfB8kUKgvM+7g4S2Dh4c7+579/M7pbW2SZJYADbLMsv+eDy2aZqKP62Ms05jigCwTiYTsNzf1RDHkWAUgP9ExXEsgXnw9VUVH8E7aALB8sJaf+P56RGe9yo+46yq3W6LkReoOpcIwz4laNBq8pckX7i5rWF5SWFzYx39MCqKKN/3Zzod7O9KgdHoE0EQCN7r9VCpXEAphcUFBd9/k1jOU8PhsEj+obHXVlfQarUwzw1PWi6fo1Q6huM4MqFwkDPPV2g2Xyx1sTvbW+LPX4df9huNhg3DUGyVj8JydnqCev0BR4d7iAaDGbaZD+bizxVIDY1qOp2O8TzP0FXEdl3XUJKh/Ys/4svQKqbb7RrOo8bmF1A8Alv2d8SLAAAAAElFTkSuQmCC" - }, - "/content/translations/zh/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "cf50c27a", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnElEQVR4nGPw8PBgr6+v5/j//z8zCK9a1cu5atUqtokTJ7LPnDmTdf/+/SwwfObMGVYQhvFB6hmAmlmAmO3//1XMDEBQlJdoU19fKJSbCzEAqIgRiJlANEgeiQ/GDPb29ixpaWlgU0EKSgqS3Forc0XT0mayggyHamA0Nk5jDfUz0/J1MhcHqQO6khkoz8QQEBAgDHMeSGJCR33U7NkTxOPj6zmACnhA4lmhoTxZWfV2U7ozj3S2FvSL68VwQw1mZvCL8JMCmQbCIMGpfc1lIAN8fNK4MjJixObPn88RGBgolpOTE9Db0/istaV6s5ycriDIMpALGUDOz83NZQcJAP3MVVme11tRUaQGEoeGAdj/QK+KAMWCXFw8vIBKtYB8DnAYhIaGMsfHx3OADMjOjtJNTYy6lpYclwLi9/aCYwQcOyA2SC3IMGFhYSktLS0eWMAygmIBxEhPiUrOzo5xLclPTq+oyBaGhzQQZGVl8WRmZgrC+MhyMA5jRUWFoLd3lCDQRRKrVoGiFhIDIAuio6Ml4+LipCFRDo9GRgDqPvih0PctyQAAAABJRU5ErkJggg==" + "/content/translations/fr/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "9bc283e5", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABlklEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpaayhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMZhmmILqgiS3+vp8gdzcXHaoOCMIg1zq72+hC6RFoQYxAeXBBogi29DfWRc5rb1dMD4+nqO4uJgb5EwLCxnOzNxqt6k9GSfamgrbGRhC2aAGMzEEBAQIw1xw5coVtkk9jRXr5/cLgDQXFRWJ/P9/htXbO0owPz8nsr+v6WVjQ8VqcT09bqgBzAw+Pj4iMP9PmVLPU1mWP7WsLFcG5P+ZM2eyggwGKXRyMhfPykr3d3R0dQMq1QJ5HewCe3t7FpB/QQZkZSWapyZF3UxLi40C8Xt7ezmh3mOGBirTfyAWlJKStbCw4AS5AqSOEWQbiJGeEpVaUJDoUpKfnF5eXs4PjyogAFrCBzRECOoiRli0M0ABI9BJzDExMWKgwIuNjRVO8/HhgsoxAUOeDxRWIAxUxwMSA+kBYQBDqec8tPLXrwAAAABJRU5ErkJggg==" }, - "/content/translations/zh-tw/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "f38313a4", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnUlEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpxqyhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMWNjY9a0tDRWmILqgiS3+vp8gdzcXJDLQLYwgjDIpf7+FrpAWhRqEBNQnonBx8dHBNmG/s66yGnt7YLx8fEcxcXF3CCnWlmp82bmVrtN7kk/0dZU2M7AEMoGNZiJwdvbWxrEAOErV66wTepprFg/v18gKyuLB+gKUaDhnH5+flL5+TmR/X2NLxsbyleL6+lxQw1gZgD5H4RBtk+ZUs9TWZY/taqqUBrk/5kzZ7LCwsDJyUk8PT0l0NHR1Q2oVAukB+wCe3t7FpB/QQZkZMRbpCZF3UxLjo0C8Xt7ezmh3mOGBirY34KCgrIWFhacIFeA1DGCbAMx0lOiUgsKUl3KClNSOzrK+eFRBQRAS/gqKioEodHNCIt2BigAmcQUExMjBvQvb1RUlDwoEGGSwIDmioiIEAc6WxoUG1D1YNsBkhrjVwm4Nn4AAAAASUVORK5CYII=" + "/content/translations/hi/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "b3c25cbb", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoUlEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DKGhWmyhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMWNjY9a0tDRWmILqgiS3+vp8gdzcXJDLQLYwgjDIpf7+FrpAWhRqEBNQnonB29tbEKoQbEB/Z13ktPZ2wfj4eI7i4mJukFfs7e15MnOr3ab2pJ9oaypsZ2AIZYMazMTg5+cnBXPOlStX2Cb1NFasn98vANIMdIVoR0cHv5eXl0RhXnZEf1/jy8aG8tXienrcUAOYGfz9/QVAXgDZPmVKPU9lWf7UqqpCaZD/Z86cyQrzs5OTk3h6ekqgo6OrG1CpFijcwC4AOo8F5F+QARkZ8RapSVE309Jio0D83t5eTqjrmKGByvQfiKWkpGQtLCw4QYaD1DGCbAMx0lOiUgsKEl1K8pPTy8vL+eFRBQRAS/gqKioEQbbCnA+TAxsCcgnQK5L2oaE8ERER4kAn8sAkgSHP5+vrCxIT9fHx4QKph2IGAOza4ispROSRAAAAAElFTkSuQmCC" }, "/content/translations/hu/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "1a3a398c", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsElEQVR4nE1RTWsaURS9TuIYbQgampra9A8Umk0XnU2RhEQGRxhcPLCDZUrQMZW+OCNEpgR6mywqhVgxSQuz6n6yCPQPuO3CpZv+hP6KV46MIQ8uvPt17jn3kmmaGWZeU0qtwH5HUS6OY30ymWSm0+nqQ5vNZmnY0kc9ed6rtBBCZ+ZVIiL/4/s3vZ6bD4Igy8y6UkqL4xjgGvJKqRT8+1itVsuhGQEUnPlHFeZeXkqZiaIojQYYmNq28dI0za0ESGNmjer1+tPlFCTG3z6//TkcFlzXXWPmHHKGsZP9IM8q15edP18vgiGR0BNgjarV6vaSznw+168uz8O7X+N8t9td7/f7j6HZsqxCEJw0xt8v/p1/CW+Lu7uPEoAVsizrmRACAKmbG17/NOj9GAzkDvQnEjQU7u+/LnY6rfre3mGFiF5gbwsGoAq9oH987BrtI+ev571z4I9Go+xyYclSF7pLpdJzwzCyGIq6FKbh02k5bd9vH5z6LY9ZbtyfioiklBthGBYeXGMBjP/iAdF13W1cpdFoFB3HKSAOeUKITSHEVrPZfGLbdr5cLuPkmJ76D2E35WwINqEnAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoUlEQVR4nE1RTUsCYRBeV10/CtHINLM/ENSlQ3sJUUpEhcWDYIuxEbqatLkrJBtCWx2SQBPLgj11t0PQH/DawaOXfkK/wuaR3WhgeN/5euaZGSaTyXgMw/DO53Mn9NM0/ePxmBsOh57JZOL6r9Pp1A21beQzsrzrLhaLHIG4GBL1/GS/2ZSCmqb5yMdREkuAAGcRp9cB+8+Xz+f9KIYDCR31NG0YzaCiKB7TNN0ogIKpIPDb9IYtIJbqWKZQKKzbXRAYPFwfvXa7IUmSvJTgR4zn474zpZN+7tW+7u+0LsMUOQuYZbLZbNSmM5vNuKferf7xNgg2Go3lVqu1iplzuVxI0y5Kg8e7n9sb/T2ys7NkATgZCm7QDgDgGI2M5at286XdVuKY3xqBRWIqtRep1SqFZPIwTUS3sLcFA1DFvKBfr0t89VT8luVjEXa/3/fZC7OWupg7Fott8jzvQ1PkOdANn1pFrKpq9eBSrciGoQT+TkVCTQK6rof+XcNp720hQCQ2UVylVCpFRFEMwY/xSFdIw+VyeU0QhGAikcDJ0d3xC2E35WynIoGwAAAAAElFTkSuQmCC" }, - "/content/translations/hi/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "b3c25cbb", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABr0lEQVR4nE1RTUsjQRCtTJLRaNDkEOJG9g8IesllLjIYNDT5GvbQEAMy6uqMy9pOhoiJCpbZwyaC2ZBFF+a09/Eg+Ady3UOOufgT/BUtFWZkDw+6ql6/eq8bGGNziDgvpYwSXjxvwfd9dTQazY3H49j/mEwmcUJYEx84X1M55yoixgAAmqf7m45jplzXTSCiKqVUfN8ncYXmUsoI1R+9fD4ftywrHhKum4dFRCclhCBntCVCIKeGoa0zxjKBkIKICpTL5XRAnAkM7252//R6adM051ut1iJF0XU9+U1cFx/v7X8/f7g9AK4GwgrUarVcaGc6naq/77ud57/DFF0WQmT6/f5yqVRacc++14e/um/d2/ZTdmNjMRCIgmEYKYpA2x8eMHl54TxeXbmrlN/zPIo2y1woFLK2ffRla2unCABr9G4zB7quxygvCZycmNrxYePVsvYaVA8Gg0TgLho8qiIRlVwu91nTtASJEy9C2+hgHzWOm82D7XPnq91ut5c/vgoAhBBLnU4nTVtD++FsJkJOLMv6pHOerNfrWc55Mhwyxpaq1Sr1MpVKZYH4AeAd7NriK133/fEAAAAASUVORK5CYII=" - }, - "/content/translations/fr/energy-consumption/energy_consumption_pre_post_merge.png": { - "hash": "9bc283e5", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnUlEQVR4nE1RTUsCURR9jjo2JaWpBVF/IKhtswkxSh44oJu3SBTLaixpGEdDC6GbLZJAE8OCWbWfFkF/wG0Ll276Cf2KF3d4Iy4OvPt17jn3EUppCAAWOOd+xLdtLzqOIw+Hw9B4PA7MYzKZBBFejP1E1/UgY0wGgAAhhNSuT/ZNsxSxLEsBAJlzLjmOg+QS1jnnPoxnOSaGvYZ2rZwGMCOGYYRE3odApdmsukMpTQgiCQBcgsT8hsHz/fF7txstlUoLjUZjCWWq6qZyZbTTb73Ln6dHq0sIkwWxRHK5XMxTMJ1O5dde5/brYxDB4Xq9Hud8Esxk8lHTvD4evDz+dR5uP9d3d5cEgZ9omhb3/I9GEL5rmm/NprGJ/m3bDiIxNh4c7K1Xq5VsKnWUJoRso3VXQTKZDKBfJKhWT/cuyvlfXS/mMe73+4qw5xdHlTiAFN3Y2FJVVUEV2OfDbfionOcvarXTwxvzrNJqtVZmX0UIMQxj2bKsVaHIle/VXBLGmL9QKKzh8YrFYkzXtEVRkyily3grBGMsjDmcQfwDQ6nnPJx3t74AAAAASUVORK5CYII=" + "/content/translations/it/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "b778eb85", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnklEQVR4nE1SXUvCYBSeTvMTypZpEV52MbAboW5GQowasSKDQZg2zPHaNr+RUroYUV70sVKoC/Ef7LYf4E2X3vcP+hvrnOmiFx7enfc85zlfowRBCBiGEbRtm0ZYlhmyLGthOBwGRqORfzKZ+FxMp1M/wrWRT0GwD7Bg2xZNwWnXS5xhtJZrtZkAkDwAL97o/2c7oAqFQgRFUBEJneblfr9Xi7vZ5wGeTIb4peNt9mhvJ4E8qJKGOC8lSVIcDSwNHYMnIz8eDxIytAWEKAT7WpIUIpqx+/6sfj32m2+JrUJkLkxTuVxuDQUQ+Pjxen89HgwSIiHhdpusYCU8zy9Wq+qJ+XL303+4/Uyl0jFMhpVToiiGcQb4AORw76ZudrvtTUKIfzabWa8cx8Xh7ZTnhUOgstlsNujMAFqgZVkOokBLJ2mldPZNyhcK2qbpbMTZDn4jF6tkGGadZdmoO1ivW0FFyZf1q+JBp1Gu6LrO/E0ajqZpUVVVY66NtzNEdzX4LyjK+QZkiUJFyUajsYQ+3ARsahUBvmSxWGSwd1f8F8ZG8L4ZuviOAAAAAElFTkSuQmCC" }, "/content/translations/ja/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "8f3b50ca", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABq0lEQVR4nE1RTUsbURS9+RqNqcaUaiGlfyBQN9mMCxmETJhVJIsHNaHYjjpjoa+TR8SoAa+6aCgxSqwK8wO6GXf+gWy7yDKb/oT+ildOyIiLA/fjvHPPu5ccx5lj5nmtdQp4CsOFKIqM4XA4NxqN0i8xHo8zQJyDT+VyOSOEMJg5TUTU+vZ5Iwh2lpVSWWY2tNbJKIognkRfa51A/lyzbTuHxyiA0G25VeZgWUoJZ5iSABFOt7bMD47jrMyEksycJCHEOwSxwM3Ps+2HXq8AgXa7nQvDMFMqkfFVdqu/rvw/Py5Vj0gYsTDV6/XV2M5kMjFury6Ofz/0Ch7zgpRypd/v50xTZJX6/vHm+vLfxfnx49u1tdxMIEWVSiXveV4G0+/u+NXJUXB/eqrgysB0ELEw215f9f29+uamXSWiEvY2dWBZVhp2IXBwsGPuu42/3u6nBvLBYJAFCZgtdfrvYrH43jRN9BLgJTANgb/X2G+1vlQOg12/0+nkn09FRFLKJaXU6xfXmF4C8VQEljzPe4OrCCHyABGBkKrVaovYleu6i81mc8myrPn43X9KCN4XidEH9AAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABn0lEQVR4nE1RzUoCURS+48/4V1nRDxi9gFAbN9MiRJgRV8YsBkoJa7SZgqaZwUgraKpFEmpiWTAP0MZ2vYDbFi7d9Ag9hZ1PnOjC4Z6f737nu+ewXC4XchwnPB6P/bBP1432+32+2+2GBoNB4L8Nh8MgzIuBZ6lUKqgoCk8kAUbHOj3YNs3SvG3bEcrxBPIRIch9qNPNIf7LSZIUw2MkALi21KzjmPOGYUAZunAAQunOjrBB9/KUyEd1H6Pua3A8gs7jzd5bo7EAgmq1GnNdN5hMMv7EuM6+tPSvh3u7wZjCe8RMluUVT85oNOKfW3f197fGguY4USJZbjabMUFQIrZ9ttt5uv+5u61/rG5uxqYEfiaKYlzTtCC693rOzOWF+Xp1ZUMVj+4AYmCStLWi6xU5k5GyBE1ibhMF6XQ6ALkgOD4uCUdq4Vsr7xcQt9vtCECw6VAn/04kEuuCIKDGAcehGxy9UjiyrEPx3CzrtVot/rcqOtRkjkgW/23D781tQgJJ9JUlbIX8OIzyAPjz+fwsZqWq6myxWJwj1WHv3S9KCN4XN4GjSwAAAABJRU5ErkJggg==" }, "/content/translations/ko/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "1c68b4a0", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABpUlEQVR4nE1RTUsCURR9jjpqWThUSF9/QKiNi2YTD4tkYGCGWcwiQybMniUNowOZEXSzRRJoYl8wq/bTIugPuG3h0k0/oV/x4spM9ODA/Tice899RFGUBAAkOedRxKfnzfi+Lw6Hw8RoNIr9x3g8jiPCHPnEzOVE0zRFAIgRQkjj7HDbcaxMs9lMAYDIORd830dxAfuc8wjmf7V8Ph9njMVDwlWjUgRwMrZtJzzPw3oEgZvquryhKMpSICQAgEA0TZvD6aHA4P56/7XblSzLSgLADNZleS11al8Vn3q1r7vbZpcQUwyEBaKq6ioGiMlkIj72Ou2Pt0GmXq+nXdddRM+qWpIc52x/8ND56dxcvGc3N2cDgSihlKbRAk5/fob0Zct5abXsNfQfWEDx6M7OVrZWqxqFwl6REJLDu003oJTG0C8KnFQt+bhS+mZH5RLm/X4/FW4XHFXgAIIkSeuyLGMvgjw8hogBq5aY61Z2zxtVhocMvwqJtm3Pt9ttKRCcrj+1EDxUipTL5QVd1zPGgbHMWH5qCx+lNKlp2ophGMsYh3xs/gLfX+iojENE+QAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABn0lEQVR4nE2RzUoCURTH74w6fmQxQ4VY9gJCblw0mxCNRBhwmMUsNIYJs2uJwzgDmSE02SIJNLEsmFV7WwS9gNsWLt30CD3FdE/MjS4c7rnn/Pmdj4tKpVLYcZyI53kBsA/Xjc1mM24ymYTn83nwvy0WixAYfYMeqek0p6oqRyBBRE67dbxvmjpvWVaUxDgiYgkQ4Czkyc3A+y+WzWZDGOMQFfTataLjmLxhGGHXdSHOgEGnsizuknvTB7GkAIvK5fIqVKeA8f115WUwEHRdj5B4DOKimIqeG73i07DxeXdrDRBSOR/MIkmStsEBWy6X3OOw331/HfPNZjNu2/YGzCxJVcE0W5XxQ/+7f3P5lshkVnxAAOVyuTiMANWnUyd+1TGfOx0jBfP7IwA8UCjsJRqNupLPHxaJNA17++2AAIIwLwDO6rp4Wqt+4ROtCu/RaBSl3flLZT1igiDsiKIIOQZ0sAwOHFyvYtuuHVy06xgWSb8KhKTIWrfbFXwgQ78d+QdIjKZp67Is88qRksQ4G6JJ0mWELHtLUZQk+FQPuR/fX+ioimHv/AAAAABJRU5ErkJggg==" + }, + "/content/translations/fil/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "29d225d1", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpaayhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMWNjY1aQITAF1QVJbvX1+QK5ubnsaWkzQeKMIAxyqb+/hS6QFoUaxAS0gIkBaLsQsg39nXWR09rbBePj4zmACrhA4hYWMpyZudVuU3syTrQ1FbYzMISyQQ1mYvD19RWHGXDlyhW2ST2NFevn9wtkZWXxFBUViYD87O0dJZifnxPZ39f0srGhYrW4nh431ABmBmdnZ2GY/6dMqeepLMufWlaWKwPy/8yZYC8wgRQ6OZmLZ2Wl+zs6uroBlWqBwg3sAnt7exaQf0EG5GclmqcmRd1MS46NAvF7e3s5QZpBLoQGKtjfUlJSshYWFiA5RpA6RpBtIEZaSlRaQUGiS0l+cjpQjA8aVeCwAVrCV1FRIQjTBIt2BihgBDqJHxhwEn5+fryRkZEioLABxVBUVJSgm5ubUGBgoCRQjSgo0EF8oB6wwQAkbeW3BUKC+QAAAABJRU5ErkJggg==" }, "/content/translations/pl/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "9d6dffbb", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABqUlEQVR4nE1RPUvDUBR9TdvU1iKNH1VE/4CgSwezSKhoCU3BZnigIVKVmmLxmaRgrQhe62ARrKV+QSb3OAj+ga4OHbv4E/wVTy4m4nCHe9495557HlFVNQEAY5zzKNaH56V83xf7/X5iMBjE/tdwOIxjhT3OE8uy4pRSEQBihBDiHO+t2XYl47puEgBEzrng+z6KC/jOOY9g/4eVSqUUkhHAgQvnoABgZxhjCRRHAhY63dqSl1VVnQmEBAAQCKV0DptwQ+/2cuel05EqlcoYAKQQl+WF5BG7KDze1T5vrt0OIVQMhAV0MB3aGY1G4sNdu/X+2svU6/V0o9GYxps1zZBc92S7d9/+bl+dvc2urIwHAlFSLBbnAoHI0xOkz5v2c7PJFvB+z/PwBHQXXV9fna3Vqno+v1kghCxhbv8zENG+Xd9fPTwwvixr18C+2+0mA/FoEKrAAQRpfn5RluUkLsW5SChQqxqHjrO/cepULQA28fdVhBDG2ESr1ZJC0u+3/waPQETTNMk0zayi0LRp6lld17O5XC6uKEqMUjpZLpenEDMMQ0Is5P0AforpmoyE4MkAAAAASUVORK5CYII=" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoUlEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpaayhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMR8fHy6QZpAASEF1QZJbfX2+QG5uLjvIcJAGEAa51N/fQhdIi0INYgLqY2IA2i4B4sBs6O+si5zW3i4YHx/PAVTABRK3sJDhzMytdpvck36iramwnYEhlA1qMNgFIjDnXLlyhW1ST2PF+vn9AllZWTxFRUUiID97e0cJFhbmRfT3Nb5sbChfLa6nxw01gJnBy8tLAmoA45Qp9TyVZflTy8pyZUD+nzlzJivUdcxOTubi6ekpgY6Orm5Ah2qBwg05DNhAzs/PSjRPTYq6mZYWGwXi9/b2ckINZ4YGKtN/IBaUkpK1sLDgBFkKUscIMyA9JSq1oCDRpbQgJa2+PpcPHlVAAAxUvoqKCkGYJki0QwIeJMDo7e0tGBMTI2ZvH8oTExMoFhgYKGZsbMxqb2/PAnSuUEBAgDBILCoqShAkBtMHAH6K6Zrwx+g6AAAAAElFTkSuQmCC" + }, + "/content/translations/pt-br/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "9bc5f7c6", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABTUlEQVR4nIVRv0vDUBB+o+Dg5t8g6Oqss+g/IKIodRQFu0kHIV10VSgo2MVB9w7StUswUIgUipHSNIFCNfB8kUKgvM+7g4S2Dh4c7+579/M7pbW2SZJYADbLMsv+eDy2aZqKP62Ms05jigCwTiYTsNzf1RDHkWAUgP9ExXEsgXnw9VUVH8E7aALB8sJaf+P56RGe9yo+46yq3W6LkReoOpcIwz4laNBq8pckX7i5rWF5SWFzYx39MCqKKN/3Zzod7O9KgdHoE0EQCN7r9VCpXEAphcUFBd9/k1jOU8PhsEj+obHXVlfQarUwzw1PWi6fo1Q6huM4MqFwkDPPV2g2Xyx1sTvbW+LPX4df9huNhg3DUGyVj8JydnqCev0BR4d7iAaDGbaZD+bizxVIDY1qOp2O8TzP0FXEdl3XUJKh/Ys/4svQKqbb7RrOo8bmF1A8Alv2d8SLAAAAAElFTkSuQmCC" }, "/content/translations/ru/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "ddea5543", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABoklEQVR4nE2RQUsCURDHn7vrqlnhlmmBfYEgLx3aS4iSsiCYHt5hldiM2hJcdlfJCqHJDkmgiVHBnrpvh6Av4LWDRy99hD7Fi5Hd6DC8N/Nm/vObeURRlBAAhBljPNqn4yy4riuOx+PQZDIR/tt0Og2i+T7mE13fCVJKRQAQCCHEah7tmaYWs207AgAiY4xzXRfFOXxnjAXQ/4tRSjFRwAAmdK3jAoAZMwwDybBLAA1JDw7kbUVR1jwhDgDmAuvo+B1GDzfqa78vaZoWbrfbUcSU5VSkYXQLL4Ozr/s7u08IFT1hjuTz+YSPM5vNxKdB7+rjbRTD4larFceZi8WiZJpNdfTY++ndXr4n0+moJ8DPBXzU52dYvO6YL52OkcL5HccJenR8LrebbDT0cjabLxBCtnBvc4JMJiPgvIhvnGvy6XH1W9cPq+gPh8OIR8d7S+UYACdJ0qYsyxFsinkB7IYX/aSqW1Z9/8I60QFg+e+rUNwwlm3bXvGLMO4vfi5SKpWWarXaBqV0sV6vr1UqlQSllEfUcrm8qqpqHE80/BG/7heXX+jnTWO+oQAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABm0lEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpxqyhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMaBmkEIWkABIQXVBklt9fb5Abm4uyGUgWxhBGORSf38LXSAtCjWICSgPNkACxIHZ0N9ZFzmtvV0wPj6eo7i4mBvkTAsLGc7M3Gq3qT3pJ9qaCtsZGELZoAYzMbi6uorBnHPlyhW2ST2NFevn9wuANBcVFYmA/Ozt7S2Yn58T2d/X+LKxoXy1uJ4eN9QAZrABMKdOmVLPU1mWP7WsLFcG5P+ZM2eyQl3H7ORkLp6ZmRbg6OjqBnSoFijcwC6wt7dnAfkX5PzcjHiL1KSom2lpsVEgfm9vLyfUdczQQGX6D8SCgoKyFhYWnCBLQeoYQbaBGGkpUWkFBYkupQUpaUAxPnhUgQzPzeUDGiIE0wQShwU82BA/Pz/e6OhoSaDTeBITE0UDAwPFgGxmkFMDAgKEIyMjRUA0CINiBKYPAJdf6Odccgt6AAAAAElFTkSuQmCC" }, "/content/translations/tr/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "d01d6536", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsElEQVR4nE1RTUsCYRB+XXNNs9K+rKg/ENTFQ3uJKEqWWl09vFBqbJ+a0tu6ErIRNNUhCTKxL9hT9+0Q9Ae8dvDopZ/Qr3hjlt3ohYF55p155pkZIstyEAD6Oed+tE/LCtu2Lbbb7WCn0+n7b91uN4DmYcwniUQiQCkVAaCPEEKqJ7tLuq5FDcMIAYDIORds20ZyAf855z7EfzFFUca8JEy4qO4nAfQoYyxYLFoBLEBDpaoqzcuyPO4SCQAgEEo3JjkHwevQurvcfm00Ypqm9QNAGOOSNBMqs4vk033p6/bGaBBCRZdYIKlUKu7J6fV64uP9tfnx1opWKpVIrVYbw5k3N3Mxwzjdaj3c/Fxfme/xhYUBl8DvEOD8GHh+hsh5XX+p19kMzm9Zzgiozr+6uhgvl4uZlZX1JCFkDvfmKKCUDiNA+exYk472c9/Fg50c4mazGfIW5i5V4ABCbHp6VpKkEDbFPB92Q6d0mDuqVvfWzvSDEgAMuadydsMYGzJNM/bvGg4x+s5Lp9OD+Xx+anmZRiil45lMZhTJC4XCAKV0JJvNTmBcVdWooihht8z3C/q555W90K2fAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABp0lEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DMbGxqyhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMR8fHxGYIpCC6oIkt/r6fIHc3Fz2tLSZrCANIAxyqb+/hS6QFoUaxAS0gIkhNNRL4v//eiaYDf2ddZHT2tsF4+PjOYAKuEDiFhYynJm51W6Te9JPtDUVtjMwhLJBDWZi8PX1FYc558qVK2yTehor1s/vF8jKyuIpKioSAfnZ2ztKsLAwL6K/r+llY0PFanE9PW6oAcxgA0D+BwlMmVLPU1mWP7WsLFcG5P+ZM8FeALmO2cnJXDwzMy3A0dHVDehQLVC4gV0AZPCDOCDn52bEW6QmRd1MS46NAvF7e3s5YQEGDVSm/0AsKCUla2FhwQmyFKSOEWQbiJGeEpVaUJDoUpKfnA4U44NGFThsgIHKV1FRIYgUG8ywgAcDPz8/3ujoaEl7+1AeoItEAwIChEGGx8TEcAP5QoGBgWIgcX9/fwFgzHFBtTECAPq555Xe1fXcAAAAAElFTkSuQmCC" }, "/content/translations/uk/energy-consumption/energy_consumption_pre_post_merge.png": { "hash": "8c43c675", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABpUlEQVR4nE2RTUsCURSGr19j2pdD2QfUHwhq46LZhBQpAwq6uQtHZGLKUcFh/Ag1gm62SILMLAtm1X5aBP0Bty1cuukn9CtuvDITDbxwz5lz3/Occ4ksy0HG2Bzn3Ad9WlbYtm1hOBwGx+Ox/78mk0kAcmPUE12PBSilAmPMTwghterJgWmqkXq9HmKMCZxzr23bMPfiP+fcg/gvRylFoR8JFFzWtCRjZsQwDJChiwcCaSYj7cqyHHWMvIyxmcEGArfD4O4q99rriaqqzjWbzXlgStJWqGJcJp/vS1+3N/UeIVRwjL0kkUisuTjT6VR4uu92Pt4GEVxuNBqrmDmVSommWc09PnR/utft9/W9vXmHwkeA5KKORmzhomW+tFrGFua3LCvg0PmOjvbXKxU9e3iYSBJCdrC3GUE8HvdjXjiWy6pU1JRvXS8oiPv9fsih8zlLnc0tiuK2JEkhNEWdB91wKJ0pxVqteHxunpbabX3576kIIYZhLHU6HdG95D47zrMPW87n85vpdDpMKY1qmraIPFCz2ewKVCgUVhRFEWOxWACNoV8/B+UN93mg5QAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnklEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpxqyhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMaBmkEIWkABIQXVBklt9fb5Abm4uyGUgWxhBGORSf38LXSAtCjWICSgPNkACxIHZ0N9ZFzmtvV0wPj6eo7i4mBvkTAsLGc7M3Gq3yT3pJ9qaCtsZGELZoAYzMbi6uorBnHPlyhW2ST2NFevn9wuANBcVFYmA/Ozt7S2Yn58TOaGv8WVjQ/lqcT09bqgrmBlAToI5dcqUep7KsvypZWW5MiD/z5w5kxXqOmYnJ3PxzMy0AEdHVzegXi1QuIFdYG9vzwLyL8jEjIx4i9SkqJtpabFRIH5vby8n1HXM0EAF+1tQUFDWwsKCE2QpSB0jyDYQIz0lKrWgINWlJD85vbw8jR8eVUAAtISvoqJCEKYJFu0MMAAK5ejoaEkfHx8uoPNEk5KSeEHiIKcGBAQIg3BsbKxwVFSUoLGxMSvIYhAGAD8H5Q0nOz8oAAAAAElFTkSuQmCC" + }, + "/content/translations/zh/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "cf50c27a", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnElEQVR4nGPw8PBgr6+v5/j//z8zCK9a1cu5atUqtokTJ7LPnDmTdf/+/SwwfObMGVYQhvFB6hmAmlmAmO3//1XMDEBQlJdoU19fKJSbCzEAqIgRiJlANEgeiQ/GDPb29ixpaWlgU0EKSgqS3Forc0XT0mayggyHamA0Nk5jDfUz0/J1MhcHqQO6khkoz8QQEBAgDHMeSGJCR33U7NkTxOPj6zmACnhA4lmhoTxZWfV2U7ozj3S2FvSL68VwQw1mZvCL8JMCmQbCIMGpfc1lIAN8fNK4MjJixObPn88RGBgolpOTE9Db0/istaV6s5ycriDIMpALGUDOz83NZQcJAP3MVVme11tRUaQGEoeGAdj/QK+KAMWCXFw8vIBKtYB8DnAYhIaGMsfHx3OADMjOjtJNTYy6lpYclwLi9/aCYwQcOyA2SC3IMGFhYSktLS0eWMAygmIBxEhPiUrOzo5xLclPTq+oyBaGhzQQZGVl8WRmZgrC+MhyMA5jRUWFoLd3lCDQRRKrVoGiFhIDIAuio6Ml4+LipCFRDo9GRgDqPvih0PctyQAAAABJRU5ErkJggg==" + }, + "/content/translations/zh-tw/energy-consumption/energy_consumption_pre_post_merge.png": { + "hash": "f38313a4", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAJCAYAAAA7KqwyAAAACXBIWXMAAAsTAAALEwEAmpwYAAABnUlEQVR4nGPw8PBgr6+v5/j//z8zCG+aOZNr1apVbBMnTmTfv38/CzI+c+YMKwjD+CD1DGlpxqyhoaFsQENYGICgICfBNj8/XqCwsJATKMYGVMQENBBkOBNIHkgzgvhwMWNjY9a0tDRWmILqgiS3+vp8gdzcXJDLQLYwgjDIpf7+FrpAWhRqEBNQnonBx8dHBNmG/s66yGnt7YLx8fEcxcXF3CCnWlmp82bmVrtN7kk/0dZU2M7AEMoGNZiJwdvbWxrEAOErV66wTepprFg/v18gKyuLB+gKUaDhnH5+flL5+TmR/X2NLxsbyleL6+lxQw1gZgD5H4RBtk+ZUs9TWZY/taqqUBrk/5kzZ7LCwsDJyUk8PT0l0NHR1Q2oVAukB+wCe3t7FpB/QQZkZMRbpCZF3UxLjo0C8Xt7ezmh3mOGBirY34KCgrIWFhacIFeA1DGCbAMx0lOiUgsKUl3KClNSOzrK+eFRBQRAS/gqKioEodHNCIt2BigAmcQUExMjBvQvb1RUlDwoEGGSwIDmioiIEAc6WxoUG1D1YNsBkhrjVwm4Nn4AAAAASUVORK5CYII=" } } \ No newline at end of file diff --git a/src/data/placeholders/content-web3-data.json b/src/data/placeholders/content-web3-data.json index 64f561a9dd3..606e3560a83 100644 --- a/src/data/placeholders/content-web3-data.json +++ b/src/data/placeholders/content-web3-data.json @@ -35,144 +35,144 @@ "hash": "ff883f0b", "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRzU8TURRHX1z6L7gybtw0xrULN67UjS5M3DQmLty4MYaQEBUNmhg/Ek0aDCKQ2AS0iJJKUqtpwZYiMo7S2laLBbWF0i9wYJgy0wlzfDO48SY3b3V+97x7xbZptnVdx7Is3HJkt8w2Dc2gXNcolBukl1aZW1gmll4koi4QSmad0Iccj6NKS9i2TSDQS2J6GtvewbRsmhsGlbVNipU1Mj+rHpzI/yaq/mBc+c5IIsPAO5W+t5/wAlZrdUorFaqNdXQZUNO2PDhXqqMuVkhkf/0HB9+nefRG4d54CuH803bLaNsUl5senJfwvFRPFcq76rLDMuBp7AuBiVkeyr41ltgNaJkWE8nP3B0Is+/4BR6MRMmWasQl5E52wfuhSXr6X3PE38WBMx3e9OvPpxCugLZp4Dvbidh7GLHHx8XbgyhSPaIUeDWT99TP9Qwi9h9DiIOIQ6e4EZqiazjmCEvuwFUfehHhpP8SHXeeEIqrnrq78bGZnPfvQHgW34nzHPV3cvpqH1eG43SPSoP1jda2e7Lqny0aRotiU2OuuEIss0T44zd5sq8E4/P0y60HU1l65XvzZdK59mySy0NR/S+dS6BmTV/irAAAAABJRU5ErkJggg==" }, - "/content/translations/it/web3/web1.png": { - "hash": "8b6a7fc9", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5klEQVR4nCWRy2sTYRTFv0XduHEjZCOVdGNBlCIYu3KjoiKCiPonuFYXAcEK1ieC6DSDKdVKrcZE6dAmTUPEREM6dapJ0xhJOkkfU5LJ5DExIxUTbDvf8Zv0wtnd3z3n3ku2Kf3XardhySrK1Gpvomb8gVJtIrdexcKyitmsgnBChv9bDm+/pMxAugBuSiySza0tPOOGwPNuqFoF+i8DOoNLuoFCqY4Ug7/KRUR/rGB6PgtvbBFjnxLmu7kMngbEMmEJqAUWVlZRqVSxWtSgNTewrDWQXtMg5Xfg0EIewtxPeONpvIomTSEl46EQU4kV2UpR0uoY4MawmFdQZgmktIzTjlO4f4/H55yCCTGDN8zd5RfhdE+a55wcrg/7y6RWb+BoVw/6u+wgxIbHLz5A1X8jMBND396D6N7dgxFPsDPgjsuHA6ynb9d+k+w5jLM3n6vEutvlExfh6HWg+/gleEJxyGUdgYiEM4cuoN9+EkOecMedm4jBvu8IbLZekxy7gvO3R3dWaP5tY61hdJyzxRq+F0qdvR+NCBjk32M8koQ7NA9+RsLgVBw3XofMB4FZXHs5XSZ1Y6NlgezilL2LSkvr9GNSpkEmf2KJ+sQMZTB9Mhmnd71ROjAeps7R4PYtXwRXXYLyH1FTiizldPKvAAAAAElFTkSuQmCC" - }, - "/content/translations/it/web3/web2.png": { - "hash": "9a66952c", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7klEQVR4nB2QX2hSYRiHv0F33QXBtit3VyuIWtAuuhhECNHt6CZIVjeNYBQ05k1UBGOBOWqSMEpsmNRipuiYOJelpzlL2SnN8k+T49HjPGp29Ljk8/jr6Avv5fM+Lw8B0JYkCbLcRG86HQXNgzbKfxrIClUkciVEMwWEkjn4YimsMXHYP7KKi03DtB7mCKUURuMizOZllMUKGvIBqo0WOLGOFC+C3ROwncojEP8N904Sbz+xsPpjyptwAgZHsEBUaVcoieA4HsWCgP3qXwg1qW/vwZE0j+CPHDyRJNZUyM58h+VDTHGwKTx+H+R7B9BqtZDjipiZNyO0+6tv74E3dTPQXZmG83OiD69sxWByMph99k7R3jbgzrKbJ5VKDWMDGowPjICQYeifWCHWm7iqN0AzeAZHD49CO/0AXjaDOaMNx8kQxg6NKOTIaWhnTf0PutcnpzBx7iJOXZ7Ca08AZUnGtYdLGD12CUOD5zF+4x7Wd9NYcoRw4uQFDGvOKmRCh8lHKzzpdLuo/2ujqEIltXwyX0ZYjeb/lsVTmxcLFg8s/iheqmva2MGCm4HevqkYfRHcfeUtkGpdbub3a52fXJlGU3kaSuzRLTZD1eLU9SVJV7fj9MXmV7roYuj8aoDet/nonHWjrbf5cOu5M/sfn9OJV1VsucIAAAAASUVORK5CYII=" - }, - "/content/translations/it/web3/web3.png": { - "hash": "6e8c2af3", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB10lEQVR4nDWQTW8SURSGr1v/QlfGlTFN1K0rF26a6MLGhYvqrnHZhdFqYqK1q8YaRZPGYK3VGJRIS7DWjsC0nRbBQbBMwgC2fAgzFIRpARnKxx1e70zTk5zl877POeSg3e42dR2dTgfm9Nm22l1UajqUah2pQgWxzC6CvwvgY2ksR7fxKRA3lqU0Zr2RPOn1DDx5ZoOPX2VgB9p+HdW6jqLWwE5Rg5QtQdxRsS7nwEW2sfhdhkOQDNfPJF4shVRiNirFMnIFBalMDmmlhHKtacHx/F9E0kUI8h8LdoeTJox5fstwhGQ8Xtg8DDhS17s9ZMt7FiwzOMrUA6kC/EydY+thAW/9v2DzBI25TQmTzvXDAFN9aSOKqVduDAzdxFMHh7hSsbS/sZs9PxKYdvJ4ZP+M89fv4cTVW4Z9bQsPPq6pxCyvNXQMXrsDcvwcyLHTGJ2wW+pHNy+KSYw8tIOcvAhCToGcHTaee8MYf+dVCe330aIU8y4Ol0bGcHvqNZx8BCH2OJ+UsbSdwThmvog4c3kUF26M48r9l8Y0J+Lue79KqvVmS9Uahrr/j5aaLZrc1WggkaesnbpDCfpBkOicL0pnVsL0jRCjthWRTi5sdCdcAsZmv2b/A/Jnn7SNGFjfAAAAAElFTkSuQmCC" - }, - "/content/translations/fil/web3/web2.png": { - "hash": "94e4b830", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2UlEQVR4nDWQX0hTcRTHbw++9VxkD/0RijAoItKe6qGIiCAoeiqIGUFBhC8tQ4QQiWxElNU0MmGyRaDhslnOBV1bd1mO3Uwnm7I1b6bb3Mb+OVvcT797owPn7XzO95yPVKlUfufzeUqlEv+ruLpGMlsgvpQh/GOZ4NxPlMgCo5MRhj5N80JWdee4yhNPoCxVq1U679qw27tJJDQWfyVNWEvniGgpQvOLJizPxHEr07yUVRzvgwbMg2EFSReJK5ms6AypVIrwXJzEcoZYMosq4MBsgnEBeyZmGfR/x+WfwiGW9H0I0Tko/1tQLpeJxTSab/egTEXN9ImoxuUL1zh3+pJ5tgEbyY+G/Fx/OMBBSxvNdjdSOp2hoaaOxnXbkKRNtNies5Ircb7lHls27mHD+nqOXbmF99s8VpuDXWJmf812MVvHidZuJHGAbjnTxOGGo+w72YTztUy6WMbS/pidO46zufYQjRfbGFGjdL36SP3uI9RuPYC09xRnO/p1IfEPucoaWq7AkpAXXkgSENJ8IvF+/wgdT930er/wbOwrXW8U7gz7ueEao9Xp5aZoKZUrrhrWDeOGNON3Q9poKIonGGHg8wy9vkkTNqS1u3xY+97qVsc7rva4C38B8IeJgY+QC+YAAAAASUVORK5CYII=" - }, - "/content/translations/fil/web3/web3.png": { - "hash": "8a260dc0", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv2sTcRjGvzj6HziKi0sQZwcXF9FFB8ElCA4uLiKlUPxJFaSoWClKbW3BQKun1RALMUrSejGxNp42MYlNk1abtGlzaeO15q4xJ/fxe5fJF17e6fO8z/u8YqfVajfNJnLiliPbarWpGyYV3aBQqZNeWmN2YYVoepGwtoASzzrKxxyPIilL2LbN3f77qB+SUqSN3jDY2DKpbm5Tqm6S+bHuwWp+mYhWJJiaZ1zN8PidxuDbzwh341pNZ6VaIztfpLi8Ss1oenCurKMtVlGzP/+DA+/TPHyT4nYw0RFw6FTL/ktZb3hwXsJz0nqiUOlYlx2SAk+iXxmYnKFf9s0JtSNgyfsn41/oGw6y5+g57o1HyJZrxCTkbnbBO8oUvUOvOeTvYd+pLm/7tWfTCNeAsW3iO92N2H0QscvH+VsjpKT1cKrAq2Tes36mdwSx9whC7EccOMF1ZZqesagj/sgQzbbN6Iswx/0X6OobRolpnnU38Ylkzrt7IDSD79hZDvu7OXl5kEtjMa4+lw4aW9aO+7L1X03qpkVpw2C2tEo0s0To03f5sm8EYnMMydQDiSwP5LzxMu5ceTrFxdHI73+pIJ/JiKQ1ogAAAABJRU5ErkJggg==" - }, - "/content/translations/pt-br/web3/web2.png": { - "hash": "4d9fe018", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB9UlEQVR4nB2QT2iScRzGf0HHTh2q7VK7VQuiGrRDh0GEEOw4doqN1sUuoyDJQ4MiGBSb0WYNjFUzW2yRzdnKTBvbqzNF620ux6svir6m01c3X/9M+/n69L5+4Tl8D8/zfHhIvV7/J0kSylIZ6jWbMir7DeR2y0hki9hO5hCMpcFEEvga5LDk3cK7NVa2sVEYV3xJQimFwfAEJtMLFIq72Ff+QrkGQdwDJ+TBxjPY4FJwb/Kw/4hgYY3Fa1dInveFMWldTxOltJXLi8hkd6CSlGp1pMUS+EwBm4ksfIp5/U8Cn/wRfPCEseANw7z6U7ayHCZtjKAGoFquIB4XMDo+AyYUabcHogK0w6MYGtS2sVWz2R2CcckD3dR7WXNrArdNdoGIYhE9B7rQq4iQTtwzzKGwV8U1/QSOHz2LI4e6obl5Hw42hrsGC06RDlw42CWTw+eg0RnbBK2Rgevou3gF5/tH8Hb5O8RKDUMPpnH65FV0HLuE3htjWPkVxbSVQfeZy+g80SOTvmEMPDQLpNlqoVRv4K9URV5RJJWDn0/D9ZvHU4sDj14uq6Nh1hXE8y9+PLZ7oZ//JhucftyZc6SJgltJ7RSbXDJHg1yKMltx6mZjVFmc2gPbdHEjTGedATpl89DxxVU69sZJda8+N/QWJ7TPPvL/AUKkidfXlTUIAAAAAElFTkSuQmCC" - }, - "/content/translations/pt-br/web3/web3.png": { - "hash": "768304cd", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABzklEQVR4nDWQTU8TURiFr1v+gwvDhoQYo1tWLtxJMCYuXAg7o1slfpAQgrLCaJSSGDJGhESaVJCm8jVgm35KbZ1aSzq00BZsOwzQjE5wCjPe3jnemcibnOXz5jmHtGzbMppNnJgmnLN5js2/aOhNKNoRirUGshUV61s1hH6UsZTZxmwiz5byFQjityqhlOLVmAfReJyDJvSjJn4Zxy5c2tOQ29lHqqQgIu9ClLYx/0WGN5pj81IR4wtJhXADWz04hJNCaReqpuNAN1w4Xz2EVN5DVP7pwv50wYExFcoyb1LGM3+iTuz/2s6ZtIUdVXNhmcMZrp4o1hDk6iJPgD+YDn6HJ7DO3sU3MOKLKO4Di9dYiEkYfePH2at38dIrIl9vuNqrvHPg6yae+0J4KnxCV+8Azt3oZ0I4i2FfuE4cAaf3+ZsPQdougpzpxO0ngqt+2pmPhlvDAkj7FRDSAXLhGvOspTEwE6w7G8BiDFNzIrr77uHB6CTmIlkk+XCfcxVXe5b3fb2YwqWeO7jc9wjXByfYCzGFx++DCtGNE4Mv3lJ+/6ENy6IFVaOJzSpdlrYoV6e+2AZ9u5ahEytpynvTcTFNRz7GrKEPYdyfFMv/AKq2oEjaSH8oAAAAAElFTkSuQmCC" - }, - "/content/translations/zh/web3/web2.png": { - "hash": "df3520d3", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8UlEQVR4nB2QTWjTcBjGI+jJmyDMXXR4cdNLUdgOHgYihd2HF8H6cakIsoOjPQgqA5lQ68eih4GjlvqxydrNVjZrS1k/5iqtRlsj2UJnmtitTWtsky7l3/Qx7Qvv4YX39zwPDwWgVa/XoWkautNuG1D3Wij/bWB7pwb29y4yWxJSnICPGQ5LqTzerDHGMrOJmfcpgSKEwO1+BJp+jnJFxp55VxtNCBUFnFgBUyhhnSsi+oNHcIPF/BoDTyRrvP2ch8sflyjTtNMFJakEXdfxr6lDlBXwpWoPTm+KiP/cRijNYjGZw3wqB2/sq+FnODwIxMWuALSGikJBxI0pGoks2xPognbbTdgu2HuxF01HbzQLeimJyafvDOuECxOzQZGS5RqGDxzHyL4BUFQ/nA89qCgqLjpdONpnweGDQ7Bev4vwdx4Otw9D5s/p/QMGdcgC6yTdS9C5On4Fo8PnYRm7jFehGGS1iUv3ZjB4YgxH+s5i5NptfPhmluZP4OSpc+g/dsagRm0Yn/KKVLvTgaK38KeuYcdsni2WkeYlREzHJ75VTM+FMBfJ4IW59MoGpoNJOF5/MtzhNG69XJWoqqKpwm6t/UsokwxXJIl8gUSZLWI2Tpa/sGRhPUdMmDwOJMj9hRi54wsTh2el5fSFYX8W4P8DPKeJv7btthkAAAAASUVORK5CYII=" - }, - "/content/translations/zh/web3/web3.png": { - "hash": "fee7de9d", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0ElEQVR4nDWRz08TURSFn1v+BxfGFTEucOvKBTuMC3XhAtkZ3aoBITH+wg1Eo0BitCaTSKShUsBa0RFaSmGgUgtlYocKLWLbKbS0MKkzdIbHm+ObAW9ylt/Nd+4lddM80A0DlmXBGZtn3zzAjmYgX9ag5MpIbmxhYS2P8EoWE0vrGJFSbELO4vXXeI5QSvGyrx9T4WnUOWhaFLv6PorVGjLFKuTf20hki5hRNiEm1jE2r8AblZn/RxoDwZhKDm3b3i6VsZlXUSxVUKtbKGm6C//MlVw4qvxx4fF42oEhhJeZN6agd1wqEPtY2xmDG2QKFRd21Je4uvQrjxBXF3kCfMG70DL6AgtMmJPx1B89WmDxGsHZBHrefsTJllt44RWRKuy42t9458D3VTzzhfHE8wnnr3fh1NW7zBNJ4uFwpEAcAa1m4Oy1DpCGJpATZ3DjscdV/9+ZHw2tjzwgp5tBSCNI02XWPxlH11Do2IAxDI5N4mLbbbT3CPDPJBHLqJiSN1ztEd731edFnLt0Exfa7uHK/TfsubiIzvchlWh6XVertUN17y8tmyZNb1WptJqjXxJrlKtTn5Si/GiUv4wK0RU6IMZp9+is9eBDBHcEMfsPuFegZfxfK6gAAAAASUVORK5CYII=" - }, - "/content/translations/zh-tw/web3/web2.png": { - "hash": "e17a9acd", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nB2RX0iTURiHvy6867poXfRHKMKgiEi7qosiIoKg6KogZgQFId20DBFCJIqQmFbWSozJFoGGy2Y5FzRdW5Zjq3SyNZjz2zLd7Nu/z+nWns7Zgffufc7vd56jlEql9VwuR7FYRJ5K5R+F1TWW/uaJL64Qnv9D4FcSX2SBsekIw59neOUJVW0TIZ44/bpSLpcxm7uxWJ6jZbPopXUyeR01rRFRlwnGUjXYMxvH4ZvhtSeE9WNAwphHfCgyUU2miM8n0HW9lp5MZ4n9zhASsH8uwYSAnVNzDHl/Yvf+wCou6f8U5P6QB6UqakswnkjRcreXyUC4lj4VVbl6qYULZ6/UaktYJj8a9nKze5DDxnZu9DpQ0ukVGuvqadqwA0Ux0Nr1koxW5GJrF9s272PTxgZOXLuD63sM0wMre5QtHKzbKXbrOdX2FEUUqBrPNXO08TgHTjdje+shXdAxdjxm966TbDUcoelyO6OhKD1vJmnYewzD9kMo+89wvnOgKiRW0EprqFqeRWE+vLCEX0hzi8SHA6N0Whz0ub7yYvwbPe983Bvxcss+TpvNxW0xyrJWWJVfJo1LafLtUtpYMIozEGHwyyx97ukaLKV12N2Y+t9XTdYPXH/myP8H+o+KJK4vfE0AAAAASUVORK5CYII=" - }, - "/content/translations/zh-tw/web3/web3.png": { - "hash": "25d171c6", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv2sTYRjHXxz9F5zExSWIs4OLk7roILgEwcHFRaQUij+pghQFq0WprS0YaPW0GmIhRklaE9LUnqdNTKJpk7QmMbZNqteau1xzch/fu0w+8OWdPs/zeZ9HtC2r0zIMOnYHtxwZ0+rQ0A2qGzqFaoN0+ScLSzWi6RJhbQklkXWUVI5HEdUUtm0zeO8+yVSKtgRNa4fmlkF9c5tifZPMypoHx/PfiWjLBNVvTMYzPH6nMfz2I8KdWFqpUK7UWC6vopsW63rLg3OVDbRSnXh29T848D7Nwzcqt4PJbgOHbln2X4q1pgfnJbwo1ZOFalddJiQbPIl+Zmh6nkGZm1PxbgPTsphOfGJgNMieo+e4OxkhW1knJiF3sgveUWboH3nNIX8f+071eNOvPZtFuAL6toHvdC9i90HELh/nb42hSvWwWuDVXN5TP9M/hth7BCH2Iw6c4LoyS99E1BE7colGx2b8RZjj/gv0DIyixDRP3d341FzO+/dQaB7fsbMc9vdy8vIwlyZiXH0uDX5tmW33ZGu/WzQMk2JTZ6H4g2imTOjDV3myLwRii4zIrQeSWR7I98bLhHPl6QwXxyN//gEp3qAW4kat1gAAAABJRU5ErkJggg==" - }, - "/content/translations/pl/web3/web2.png": { - "hash": "e120238b", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2UlEQVR4nB2RXUiTYRhA3y6867poXfQjFGFQRKRd1UUREUFQdFUQM4KCkG5ahgghEkVITCsrWsZki0DDZbOcC/p0bVmOfZZOtgbL/bh0f+3bPqdbO/HuuT+c5zmPKJfL64VCgVKphJxq9R/F1TWWcxrRVJbg7z/4fyXwhmKMz4QY+TLHa0Wt2SZVnjh9uqhUKpjNvVgsL8lkc+jldTKaTjydJxRfIRBJ1mFlPorDO8cbRcX6yS9hzKNehDTG4gkSSykKBa1uT6T/ElnKoEaS+BYWmZyP4pxeYNjzE7vnB1ZFZeBzgPvDCqIG6LpOdDFJ291+pvzBun06HOfqpTYunL1SX1vC0vxoxMPN3iEOGzu50e9ApNNZmhsaadmwAyEMtPe8IpMvcbG9h22b97FpYxMnrt3BNRvB9MDKHrGFgw07EaKRUx1PEUDNeK6Vo83HOXC6Fds7hXRRx9j1mN27TrLVcISWy52MqWH63k7RtPcYhu2HEPvPcL57sCYqlSr58hrxvEYqpxGMLeMLxXDPRng4OEb3cwcW1zdeTHyn772Xe6Mebtkn6LC5uG1zIVbyxVX5MllcRpO3y2jjgTBOf4ihr/NY3DN1WEbrsrsxDXyomawfuf7Mof0HAQyKKFkhnBYAAAAASUVORK5CYII=" - }, - "/content/translations/pl/web3/web3.png": { - "hash": "994c996d", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv2sTcRiHvzj6HziKi0sQZwcXF9FFB8ElCA4uLiKlUPxJFaQoWC1KbW3BQKun1RADMYakMSFN7Hnai0lMYi7WpE3zo03TmksuOckjd5184R2fz/u87yu6htFv6zq9Xg+rBkDH6NNo6ZTrLXLlBmpxg+X8GkFVw6fkkaKpgRRP88wvd4Rpmow/ekwsHqdr9Kk2mmzu6FS2dilUtkj+qtpwJPMbv/ITt5xlPpLkeUBh8uMX7IC1Ss3udLZAfnWdWqttw+lSHUWrEEmt/ge7Pqk8/SBz3x1DWMpWW2WYfynVmzacKdVZKW4Qy5X31FUNj5zlRfAbE94E494EdxciewFdw8Ab/crYtJsDJy/xcN5PqlQjpGr2ZAt8IC0yOvWeY84RDp0bsqffehVGWAKtXR3H+WHE/qOIfQ4u35tB1ir45BzvljK2+oXRGcTBEwhxGHHkDLelMCNzwYHomSZ632T2jY/TzisMjU0jhRRb3br4wlLa3nvCk8Bx6iLHncOcvT7JtbkQN1+HEc2dTtd6WXW7TUPvUNhssVxYJ5gs4vn8Ayn6HVdohamAgiuW4klA4c7b6ODGy0Wuzvr//AOh9J/CVoRn0gAAAABJRU5ErkJggg==" - }, - "/content/translations/hu/web3/web2.png": { - "hash": "40c2c147", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB20lEQVR4nB2RXUhTYRiAvy6867rQLvoRijAoItKu6qKIiCAouiqIGUFBRF20DBFCvDBiRNmPRUuYbBFouGyWc0GztaU5Ns0pO42tdqZzO5un/RxnW3vinPf+4Xnf5xWVSuVvoVCgXC6jT632j9LaOpnVIol0noVfKwR/pvBHk4zPRBn5Os9rb7hunwzz1BXQRLVaxWKxYLVaWU6voORVckUNWVGJyllCsSUD9kYSOP3zvPGGsX0K6jAPR/0I3ZrJKgaclFNIcZmU8ofYco5wbInA4m8mIwlcU4sM+37g8M1h84YZ+Bzi3rAXUQc0TSMel7nZ249/TjLs05LMlYvXOX/msrG2DuvmxyM+bj0a4pCpixvPnAhFydPa0Ezbhu0I0UiH5RU5tcyFDgtbN+9l08YWjl+9i3s2hvm+jd2ikQMNOxCimZOd/cYJddPZdo60HmP/qXbs77woJQ1T9xN27TzBlqbDtF3qYiws0ff2Cy17jtK07SBi32nO9QzWRbVaQ62sI6tF0qtFFpIZAtEkntkYDwbH6HnhxOqe5uXEd/re++kd9XHbMUGn3c0duxuRVUtr+sv04nq0KUk2oo2HJFzBKEPfIlg9MwasR+t2eDAPfKibbR+59txZ/A8vjYmkeno52QAAAABJRU5ErkJggg==" + "/content/translations/fr/web3/web2.png": { + "hash": "e51718f8", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nB2RXUiTURjH3y6867rILvoQijAoItKu6qKIiCAouiqIGUFBRF20DBFCvFBCYtqHRVOYbBFouGyWc0GztWU5tkwnm8OVm/t6p2/7eJ0t9uucHXg4N8/v/J/nd5Ryufw3n89TKpWQpyqquL5BZq1ALLVK6Fca/2ICb3iZiZkwo1/meOUOVq1TQZ46fLpSqVQwmXoxmwfIZFXSuTVyBZ24qhGOZwlEV2qwez6G3TvHa3cQy0e/hDGNeVFkaiKRJJlKsyLu0GKMhPqHaDJHUMC+hd9MCdgxvcCI5yc2zywW8cjgpwDdI24UObKu6ywtxbnT1Y93NlJLn47EuX7lFpfOX6uNLWGZ/HjUw93eYY4a2rn9zI6iqqs01TXQvGkXirKN1p4BclqJy6097Nh6gC2bGzl14wHOH1GMDy3sEz2H63aL3gbOtPXXVqgaLrRwvOkkh862YH3rRi3qGDqesHfPabbXH6P5ajvjwQh9bz7TuP8E9TuPoBw8x8XOoaqQ+A+tvEFcK5AS5kPLGXxCmkskPhoap/OFHbPzGy8nv9P3zkvXmId7tknarE7ui1KyWnFdfpk0LqXJ3aW0iUAEhz/M8Nd5zK6ZGiylddhcGAffV42WD9x8bi/8Bzxuiacaq7nzAAAAAElFTkSuQmCC" }, - "/content/translations/hu/web3/web3.png": { - "hash": "7b8c322d", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nGWQvWsTcRjHfzj6HziKi0sQZwcXF9FFB8ElCA4uLiKlUHylCuILKIRKrW3BQKun1RADMYakMSEv5rzqJU1M27w1SW2SNjGtuWvS03zkrm4+8Iyf7/fzPGKn19vtahr9fh9zBkDP+E27q7PW2iZbaaIW10ku1wioBbzKMlJkcSDFMzzzybowDAOHY4xoPI5h/KHV7lCpt8jXmmTLDVKlugWHs6v4lBVcco7ZcIpJv8L4xy9YAeVqjVKlSi5fJrNSIqnmCCbTxNJFForr/8HOTypPP8g8dEURprK5/FOvNNvUNrcoNtqkVhtEl6p76moBt5zjReArDk+CJ54Ed+fCewF6r4cnssCDSRcHTl7i8azPgoNqwWo2wUfSPKMT7zlmH+HQuSGr/darEMIU6Gxr2M4PI/YfReyzcfneFHLhB155iXexrKV+YXQKcfAEQhxGHDnDbSnEyExgIPqGgbZrMP3Gy2n7FYbuP0cKKpa6+fG5WMa62+FOYDt1keP2Yc5eH+faTJCbr0OI9pa+s9HRqP/ssqHp5Dc7JPNrBFJF3J+/I0XSOIPfmPArOKOLjPkV7ryNDG68nOfqtO/XX1SAnuGucb4JAAAAAElFTkSuQmCC" + "/content/translations/fr/web3/web3.png": { + "hash": "95095a18", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwElEQVR4nFWRy08TURSHb1z6L7gybtw0xrULN66UjS5M3DQmLty4MYaQEJ9BE+MTE6JBBBKbgI6CTSWp1bRgSxEZq7S2SKFUpFLoAxyhM32Mmc87Fzee5Je7+s757jmi3mi0aqZJs9nELUfGarSoGCaFskG2UCGZX2Nm4Sfh5BLBxAJaLO1oHzI8DumWsG2be/e7mZyMU5fgtmmxWbMobmyRK26Q+r6u4OjcD0KJRfz6PMPRFP3vEvS+/YRqsFYqqyzmlxVcMmoKzqyUSSwViaaX/4N975M8eqNzxx9HOP+03WrYfyRYVfD8apVZqR7PFnbUZQKywdPwF3rGpnkgc2MkutNA7oGx2Gdu9/vZc/Qs3cMh0islIhJyJ7vgXW2crr7XHPJ2su9ku5p+9fkEwhUwtkw8pzoQuw8idnk4d3MAXaoH9SyvpuaU+umuAcTeIwixH3HgONe0CTqHwo5oyh2YLZvBl0HavOdpv/UELZJQ6u7GR6Yy6t89gWk8x85w2NvBiUu9XByKcOWFNNj8bdXdk63/qlGRF8hVDWZyq4RTeQIfv8mTfcUXmaVPbt0XT/NQvtdHY87lZ+NcGAxt/wVBQ6AtqqV9TwAAAABJRU5ErkJggg==" }, "/content/translations/hi/web3/web1.png": { "hash": "bf6a3512", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0klEQVR4nCWRz2uSARyH38Mg6Bx5ibF5WRFBFNugQ5cwoksR9Rd06VosoUvmqdghWLMFSXNriOG0mNMX288XmTm36cya+Csdatv0Fc2Z71sr3id8O3yPD5/P9/kIwG9FVeh0Omign6IeUW22KR40SO0eEMtVCKd2CW6mmYummFmOaTPSNi984Y4A4HZ78PsDdFQV9egPcrNNWW6SLdeI5yp8SpdY/pzHF9nBJW0ztbjJ+HwYWyCC0E2s1mS+FYu0Wi1ayi8q8g9ye3UdjmZLrCTziLEM3vAXXKEEU1KcydUYT2dXNeGvpqGoKqXyPuZRO9Fklu/NNpFEmquDJqyW50g7BR1+u7TF+NwaDyc+cOmuhRH7PEK1Vmewx8hwTx+CcJJRu1tv4A+GOH/iLL3HjdidfjxrSaw2NwOCgYvHjAhCH9cfTdB1oN25couh00P0Xr6NUwyRlxv4lta5du4mw/0mXr5boCttzCPRf+oCBsMZhAETNx5P/n9B/qlQqDf15GRhn41smY9baZ699mIZc+nSXonrujTre4kH0yJmh8iIQ0RoHHaUg8ahPlmisKfDK4kcwXgGfzzDbOQr9oWN7mRdaTxxLmJ+49fuOwLcs3nb/wAbXouFVZlnYQAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1UlEQVR4nCWRz2uScRzHn8Mg6Bx5ibF5WRFBFNugQ5cwoksR9Rd06VosoUvmqdghWLMFSdtqiOG0mHsU20+RmXObZtbEqenQtamPaG75PLXiefU8T4f34QufF5/39/URgN+yItPpdFC1hx5ZOaTWOqBUbZLZrpLI7xDNbBNazzITzzC1mFCnwp945o92BG0ej8eLKAboKArK4R8kDa5ILXKVOkkN/pgts/i5gD+2iVsDJ+fXGZ2N4gjEEPSNtbrEt1KJdrtNW/7FjvSD/G7DgOO5MkvpAsHEFr7oF9yRFJPhJOPLCR5PL6vCX1XVKiuUK3tYh53E0zm+aw1iqSyX+y3YbU8JbxYN+M3CBqMzK9wfe8+F2zaGnLMItXqD/i4zg109CMJxhp0eo4EYinD22Gm6j5pxukS8K2nsDg99gonzR8zabA9XH4yhO1BvXbrBwMkBui/exBWMUJCa+BdWuXLmOoO9Fp6/nUOXNuIN03viHCbTKYQ+C9cejv//gvRTpthoGZvTxT3WchU+bGR58tKHbcRtSHsRXDWk2d+Fufc6iHUiyJAWobnfkavNfeNkqeKuAS+l8oSSW4hapmNfcc6t6SfTpfHINY/1lajenQhwx+E7+AcbXouF0hB+aAAAAABJRU5ErkJggg==" }, "/content/translations/hi/web3/web2.png": { "hash": "aa8663b2", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2ElEQVR4nB2RXUhTcRiH/11413XRuuhDSMKgiEi7qosiIoKg6KogZgQFEd60DBFCJIqQMPuwSIzJFgONLZvlXNDRtaU5diynbg2WO25z33X2Za49cc57/7y/3/u8AvhbKpWoVitoU6v9o1hZJ5VXiSZzLP5aw/9zFW8oxsRcCPuXBd5Ict0yJfPM6SsLDbLZbNjtdrK5PPnfRbJqGSVTIKSkCUTiOiwFozi8C9gkGfMnvwbTN+ZFX5BIpYkpqySTayRSORK5P0QSWeRIHN/SClPBKM6ZJUY9P7B6vmOWZIY+B3gwKiG0yiW1SHQlTvu9AaYDy3r6bFjh2uWbXDx3Va+twVryE7uHW49HOGLsov25A5HJ5GhpaKR10y6EMNDR+5psocSljl52bN3Pls3NnLx+F9d8BNNDM3vFNg417EaIRk53Dugn1I3n2zjWcoKDZ9qwvJPIFMsYu5/StOcU2w1Hab3Sxbgcpv/tNM37jmPYeRhx4CwXeobrYmOjRqG6jlJQSeZVFmMpfKEY7vkIj4bH6XnpYNA1y6vJb/S/93J/zMNt6ySdFhd3LC5EulCsaC/TjGvSZsKKLm0iEMbpDzHyNcige06HNWndVjemoQ91k/kjN1441P/VboqSKCyAiAAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nB2RXUhTYRjHTxfedV20LvoQijAoItKu6qKIiCAouiqIGUFBhDctQ4QQiSIkyj4sEmOyxUBjy2Y5F3R0bWmOncqPtgbLTTf3XTtnm7n267znhRfei+f3/J/n90rAX03TqFYriFOr/UOtrJIulIil8sz/WiH4cwl/OM7YTBjnp1leyUrdNqHwxB0oSwJyOBw4nU5y+QKF3yq5UplEtkg4kSEUXTZgeS6Gyz+LQ1awfggKmAcjfowGyXSGeGKJVGpFf+dJ5v8QTeZQdDiwsMiEDrunFhj2fcfu+4ZVbzLwMcTdYRlJjKyVVGKLy7Td7mMy9MNIn44kuHzhGudOXzLGFrBIfuT0cf3hEAfNnbQ9dSFls3maGxppWbcNSTLR3vOSXFHjfHsPWzbuYcP6Jo5duYXnaxTLPSu7pE3sb9iu1zZyoqPPWKFuPtPK4eaj7DvZiu2NTFYtY+56zM4dx9lsOkTLxU5GlQi9rydp2n0E09YDSHtPcbZ7sC6trdUoVldJFEukdPPz8TQBXZpXT7w/OEr3cxf9nmlejH+h962fOyM+btjH6bB5uKlfKVNUK+LLhHEhbUrfXUgbC0VwB8MMfZ6j3ztjwEJal92LZeBd3WJ9z9VnrtJ/1W6Kkrmv40MAAAAASUVORK5CYII=" }, "/content/translations/hi/web3/web3.png": { "hash": "00a24f18", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwElEQVR4nFWRv28ScRjGv3H0X3AyLi7EODu4OKmLDiYuxMTBxcWYpkmjVlNNjD8STRpNrW0TSVq9WotIgkigCKFiz1MOAUvLYYVKW6BIsXdcgdzH3DH5JO/4eZ/nfV7RNs2OYRj0ej1sWYBhdqg1dcrVJvlyDbW4wdLKOmFVI6CsIMUzlvQpy7OgbAgbeuvzkUpnaJsdB67v6FS2WxQq26R/bjpwLPeLoLKKV15mJpZmIqQw9uELwnasNhqsFtecabX32GruOnC2VEXRKsQya//Bno8qT9/LPPAm+gvssWV2exTW6w6cK1VJFTdI5Mv96KqGT17mRfgbo/4kj/1J7szF+gsM08Qf/8r9CS8HTl7i0UyQTGmLiKo5zjb4UFpgZPwdx9xDHDo34LjffBXF7sBqtnRc5wcR+48i9rm4fHcSWasQkPPML+ac6BdGJhEHTyDEYcSRM9ySogxNhy2x1+2id7pMvQ5w2n2FgXvPkSKKE91ufG4x69w96kviOnWR4+5Bzl4f49p0hOHZKKKxY7Ttl23+2aWmGxTqTZYKvwmni/g+/0CKf8cTSTEeUvAkMjwJKdx+E7duvFzg6lTw7z9pvaDRMuHzYgAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABv0lEQVR4nFWRTWsTURiFLy79C67EjZsgrl24caXd6EJwEwQXbtyIlELxkyqIH6BQlFrbgoFWR2vjWIhRktaE1NpxNImTaNo01qbGNkljGjuTaRLm8c5k5QuHu3rOe+55RdO2W5Zl0el0cMeRsuwWlbpJsVwnV6yQKvxmYXGNSGqZkL6IEjcc5UOGR2HNEi70SlVJpg2aEnTh6pZJabNBvrRJ+se6B8eyPwnrSwS170zE0oy80xl6+wnhbizXaiwVVjw1mjts1Lc9OLNaRl8uETNW/oMD71M8fKNxJ5joGjh0x253yK9VPTgr4aSMnsgVu9GlVGnwJPKFwel57kvdmIx1DSzbZjr+mdsjQfYcPcu9iTDG6gZRCbmbXfCuMsPA8GsO+fvZd7LX23712SxuB069YeI71YfYfRCxy8e5m6NoMnpIyzE1l/Winx4YRew9ghD7EQeOc02ZpX884oiddhuz1WbsRYge/3l6bz1GiepedLfxybmM9+9BdR7fsTMc9vdx4tIQF8ejXHkuE9S2rKZ7svU/21RMi3y1zkL+F5F0AfXjN3myrwSiSYZl64GEwQP5Xn8Zdy4/neHCWPjvP2m9oNG6D6NdAAAAAElFTkSuQmCC" }, - "/content/translations/fr/web3/web2.png": { - "hash": "e51718f8", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2klEQVR4nB2RXUiTYRiG3w4867jQDvoRijAoItKO6qCIiCAoOiqIGUFBRB20DBFCPFBCYtqPRVOYbBFouGyWc0GztWU59mlO2Ryu9r99c2s/n7PFrnj3nF/c9309olKp/C0UCpTLZeTVgNLGJulckXByneVfKbyrMdyBCNPzASa+LvHaqdTMswrPbB5NVKtVDIYBjMZh0hmVVDZHtqgRVfMEohl8oXgddvrDWN1LvHEqmD55JYxh0o2QqbFYgkQyRTyWYHk1TEz9QyiRRQnF8az8ZtYfxja3wrjrJxbXIianwshnH33jToSsrGkaa2tR7vYO4V4M1tPnglFuXL3N5QvX67UlLJOfTLi4NzDGMV0Xd55bEaq6TmtDM21bdiNEIx39w2TzZa509LNz+0G2bW3h9M2H2BdC6B+Z2C8aOdKwByGaOds5VJ9Q011s50TrKQ6fa8f8zola0tB1P2Xf3jPsaDpO27UuppQgg2+/0HLgJE27jiIOnedSz2hNVKv/yFc2ieaLJHNFliNpPIEIjoUQj0en6HlpxWj/zquZHwy+d9M76eK+ZYZOs50HZjsiky9tyJdJ41Ka3C6lTfuC2LwBxr75MTrm67CU1m1xoB/5UNObPnLrhbX4HzxuiacTv+YdAAAAAElFTkSuQmCC" + "/content/translations/hu/web3/web2.png": { + "hash": "40c2c147", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nB2RXUhTYRjHTxfedV1kF30ISRgUEWlXdVFERBAUXRXEjKAgoi5ahgghXhgxwuzDoiVMtgg0XDbLuaDZ2tIcW+YHW0NrZzm3s3Xax3G2dX695zzw3j2/5/88v1eqVCp/C4UC5XIZo2q1f5RW18j8LrKUzjP/Y4Xw9xTBWJKx6RjDn2Z54Y/qzokojzwhTapWq9hsNux2O8vpFZS8Sq6oISsqMTlLJPHLhP1zS7iDs7z0R3G8DxswPSNBJCM1k1VMOCmniC/KpJQ/JJZzRAUcWvjJhIA9kwsMBb7hCszgEEP6P0S4M+RH0sUATdNYFOD17j6CM3EzfSouc+n8Vc6eumiubcBG8oPhADfuD3LA0sG1x24kRcnTXNdAy7ptSNIm2mzPyallzrXZ2LJxNxvWN3H08m28XxNY7zrYKXr21W0XvQ0cb+8zT9Atp1s51HyEvSdacb72o5Q0LJ0PadxxjM31B2m50MFoNE7vq4807TpM/db9SHtOcqZrQBcSa6iVNWS1SFqYn09mCAlpPpF4b2CUrqdu7N4pno1/ofdNkO6RADdd47Q7vdwST8qqpVXjywzjhrRJcbshbSwSxxOOMfh5Drtv2oQNaZ0uH9b+t7rV8Y4rT9zF/y+NiaTBAgo2AAAAAElFTkSuQmCC" }, - "/content/translations/fr/web3/web3.png": { - "hash": "95095a18", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwUlEQVR4nFWRvWtTYRSHXxz9F5zExSWIs4OLk7roILgEwcHFRaQUip9UQfysUJRa24KBVq9WQwzEGJLGpKmx16tNTGrSJrE2Nmk+Wq9t7s1NruSR+3bywBmf33nOOaJtWd2WYdDpdHCqB5hWl4ZuUK7r5MsNUqUq80u/CKeKBLQllHimp3zM8iSomsK2be4/GGJ2NkHb6rJtmGy2TCobWxQqG6R/rEs4tviToLaMV80xFUszFtIYef8ZGVCt1WUvl1YkXNNbEs6u1tGKFWKZlf9gz4cUj9+p3PUmEI6y005Z9l8KlaaEc2tNFkpVEvnyjnqqiE/N8Sz8lWF/kof+JDenYzsBbcvCH//CnTEve46eY2gqSGa1RiRVlJMd8J4yw+DoWw65B9h3qk9Ov/YiinAE9C0D1+l+xO6DiF0uzt8aRy1WCKh53swtSvUzg+OIvUcQYj/iwAmuK1EGJsM90bFtjK7NxKsAx90X6Lv9FCWiSXXn4tNzWbn3sC+J69hZDrv7OXl5hEuTEa6+jCI2/5ht52Xrv1s0DJNCU2e+sEY4XcL36TtK/BueyAKjIQ1PIsOjkMaN1/HeleczXJwIbv8DQUOgLW9eV1wAAAAASUVORK5CYII=" + "/content/translations/hu/web3/web3.png": { + "hash": "7b8c322d", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxElEQVR4nF2Rv29SUQCFbxz9DxyNiwsxzg4uLkYXHUxciImDi4sxTZNGraaaGH8kmpCaWtsmkrT6apVgE0QDrRCg8qQKFKQtBQpUgRaklUcffZbP+147eZOTO51zvnuu2Nb1nZam0el0ME9XSjf+0mi1WatvkS7WiOd+EV0q44uv4IktoQQXukokxXOv2haGYeBwDBKKRDCMXeqNJsVKnWy5RrpQJZGvWOZAehVvbBmXmmEikGDkU4yhj1+xAgqlMvliiUy2QGo5TzSewR9NEk7mmJft/5udn+M8+6DyyBVCdPex2Ucv1hqUNzbJVRskVquEFkt76FJuGfDS9w3H9BxPpe5NBfYC2rrOdHCehyMuDp2+wpMJr2X2S5PZbBofKzMMDL/nhL2PIxd6rPbbr2cRJkBzS8N2sRdx8DjigI2r90dRV37iURd5F05b6JcGRhGHTyHEUcSxc9xRZukb93VFR26g7RiMvfFw1n6NngcvUPwxC91cfCqcst7tcM9hO3OZk/Zezt8c4sa4n/5JSdDYbG+vNzUqv1usa22yG02i2TV8iRzuLz/klyVx+r8zLFd3hhYYlPfdt8HurVczXB/z/vkHVICe4QTB+A8AAAAASUVORK5CYII=" }, "/content/translations/id/web3/web2.png": { "hash": "a250ee5c", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB20lEQVR4nB2RXUhTcRiH/11413XRuuhDKMKgiEi7qosiIoKg6KogZgQFEd60DBFCJIqQmPZh0TAmWwQaLpvlXNDRtaU5diw32Rosd7bmdubWPo7TrT1x9t4/PD+eV1QqlY1CoUC5XEa/Wu0fpbV10rkisdQqod8r+H8l8IbjTM6HGfu6yBtJrtumZZ45fZqoVquYzf1YLBbSGRWtskG2qKGoecJKhkA02YClYAyHd5G3koz1s1+HMY97EboxriRQEklSqRVyJY2E+pfonyxyNIlvaZnpYAzn7BKjnp/YPT+wSjJDXwI8HJUQdUDTNGLLSTruDzLjDzXscxGF61ducen8tcZsHdbNT8Y83O4f4aixm47nDoSqrtLa1Ezbpl0IYaCz7zXZfJnLnX3s2HqALZtbOHXjHq6FKKZHVvaJbRxu2o0QzZzpGkQAdeOFdo63nuTQ2XZs7yXUkoax5yl795xmu+EYbVe7mZAjDLyboWX/CQw7jyAOnuNi73BdVKs18pV1lHyRVK5IKJ7GF47jXojyeHiC3pcOLK45Xk19Z+CDlwfjHu7Yp+iyubhrcyEy+dKa/jK9uB5tNqI0ok0GIjj9YUa+BbG45xuwHq3H7sY09LFusn7i5gtH8T+xGYn0HBPcZgAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4ElEQVR4nB2RXUhTYRyHTxfedV20LvoQijAoItKu6qKIiCAouiqIGUFBhDctQ4QQiSQkpn1YNIzJFoGGy2Y5FzRdW5pjq3SyNVjubM3tTNc+jtOt8/SevfDevc//9/s/r1SpVDYKhQLlchn91Gr/KK2tk1ktEk+vEP69TOBXEl8kwcRchNEv87z2hDTbVIinTr8qVatVzOY+LBYLmayCWtkgV1SRlTwROUswlqrDnoU4Dt88bzwhrJ8COox5zIekJybkJHIyRTq9zGpJJan8JfYnR0jA/sUlpgTsnFlkxPsTu/cHVjFk8HOQnhEPkiZqq6pKfClF2/0BpgPhevpsVOb6lVtcOn+tXluH9eTHo15u9w1z1NhJ2zMHkqKs0NzQSMumXUiSgfbeV+TyZS6397Jj6wG2bG7i1I17uL7HMD20sk/axuGG3eJtI2c6BpBEAc14oZXjzSc5dLYV2zsPiljD2PWEvXtOs91wjJarnYyHovS/naZp/wkMO48gHTzHxe4hTUiska+sI+eLpIX5cCKDX0hzi8RHQ+N0v3Bgcc3ycvIb/e99PBjzcsc+SYfNxV1xpWy+tKZ/mW5clzYjdtelTQSjOAMRhr8uYHHP1WFdWpfdjWnwg2ayfuTmc0fxP7EZifRvdw7rAAAAAElFTkSuQmCC" }, "/content/translations/id/web3/web3.png": { "hash": "3d9c2bb7", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nFWQvWsTcRzGfzj6HziKi0sQZwcXF7GLDoJLEBxcXERKofhKFcTXCkWptS0YaPW0NcRAjCFpTJoae542MUmbNpfWxLw019az9pJLTvKRu+LgA9/x8zzP9xEt0+zsGAbtdpt/apodNN2g3NDJlzVSxRrzyz8Ip1QCyjJSPNOVPmZ5GpSbwrIsHjwcJDY7S9NsU9c2HLi6uU2hukl6te7Asdx3gsoKXnmJyVia0ZDC8PvPOAa19QZr5QqLBZXsyioVTXfgbKmBolaJZdb+gz0fUjx5J3PPm0B0AftsmdYfSo0tB86VGiwUayTy5d3qKRWfvMTz8FeG/Eke+ZPcmortGrRME3/8C3dHvew7fp7BySCZ0jqRlOok2+B9aYaBkbcccfdz4HSvk379ZRRhF9C3DVxn+hB7DyP2uLhwewxZrRKQ87yZyznVzw6MIfYfQ4iDiEMnuSFF6Z8Id0XbsjA6FuOvA/S4L9J75xlSRHGq24tPzWWdv4d8SVwnznHU3cepK8Ncnohw7VUUsfWr2bJXr//cQTOaFDZ05gsVwukivk+LSPFveCILjIQUPIkMj0MKN6fj3asvZrg0Hvz9F1a1n5MqrXgNAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nFWRTU8TURhGb1z6D1waN24a49qFGzdGN7owcdOYuHDjxhhCQvwMmhg/MSEaRCCxCcgo2lSSWk0LTiki4yitbbHQAra2lA7giExpO2aOdwZdeJM3d3We99zniq1Go7VpWTSbTf6deqOFYVqUaia5kkFyYZnpue9EkwXC+hxKPO0o7zM8imh1Yds2d+91oU5MSLBJ1Vj14MraBvnKGqnFqger2W9E9HmC2leG1BR9b3V63nzEC1heqbFUKjObL5CZX6RsmB6cKdbQCxXU9NJ/cOBdkoevNW4HEwhHKjt/1Rv2b4q1dQ/OSnhGqidypW11OSEZ8CT6me7RKe7LuT6ibgfIHhiNf+JWX5Bdh8/QNRQhXVwhJiF3swveUcbo7H3FAX8He060eduvDI8jXAFzw8J3sh2xcz9ih4+zN/rRpHpYy/FyMuupn+rsR+w+hBB7EfuOcVUZp2Mw6oim7MBq2Qw8D3PUf462m49RYrqn7jY+Mpnx3t0dmsJ35DQH/e0cv9jDhcEYl59Jg/Wf9S239eqPTQyrTn7VZDpfJppaIPRhVn7ZFwKxGXpl64FEmgfyvvYi7lx6Osb5gcivP1a1n5OtJHWyAAAAAElFTkSuQmCC" + }, + "/content/translations/it/web3/web1.png": { + "hash": "8b6a7fc9", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB5klEQVR4nCWRy2sTYRTFv0XduHEjZCOVdGNBlCIYu3KjoiKCiPonuFYXAcEK1ieC6DSDKdVKrcZE6dAmTUPEREM6dapJ0xhJOkkfU5LJ5DExIxUTbDvf8Zv0wtnd3z3n3ku2Kf3XardhySrK1Gpvomb8gVJtIrdexcKyitmsgnBChv9bDm+/pMxAugBuSiySza0tPOOGwPNuqFoF+i8DOoNLuoFCqY4Ug7/KRUR/rGB6PgtvbBFjnxLmu7kMngbEMmEJqAUWVlZRqVSxWtSgNTewrDWQXtMg5Xfg0EIewtxPeONpvIomTSEl46EQU4kV2UpR0uoY4MawmFdQZgmktIzTjlO4f4/H55yCCTGDN8zd5RfhdE+a55wcrg/7y6RWb+BoVw/6u+wgxIbHLz5A1X8jMBND396D6N7dgxFPsDPgjsuHA6ynb9d+k+w5jLM3n6vEutvlExfh6HWg+/gleEJxyGUdgYiEM4cuoN9+EkOecMedm4jBvu8IbLZekxy7gvO3R3dWaP5tY61hdJyzxRq+F0qdvR+NCBjk32M8koQ7NA9+RsLgVBw3XofMB4FZXHs5XSZ1Y6NlgezilL2LSkvr9GNSpkEmf2KJ+sQMZTB9Mhmnd71ROjAeps7R4PYtXwRXXYLyH1FTiizldPKvAAAAAElFTkSuQmCC" + }, + "/content/translations/it/web3/web2.png": { + "hash": "9a66952c", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB7klEQVR4nB2QX2hSYRiHv0F33QXBtit3VyuIWtAuuhhECNHt6CZIVjeNYBQ05k1UBGOBOWqSMEpsmNRipuiYOJelpzlL2SnN8k+T49HjPGp29Ljk8/jr6Avv5fM+Lw8B0JYkCbLcRG86HQXNgzbKfxrIClUkciVEMwWEkjn4YimsMXHYP7KKi03DtB7mCKUURuMizOZllMUKGvIBqo0WOLGOFC+C3ROwncojEP8N904Sbz+xsPpjyptwAgZHsEBUaVcoieA4HsWCgP3qXwg1qW/vwZE0j+CPHDyRJNZUyM58h+VDTHGwKTx+H+R7B9BqtZDjipiZNyO0+6tv74E3dTPQXZmG83OiD69sxWByMph99k7R3jbgzrKbJ5VKDWMDGowPjICQYeifWCHWm7iqN0AzeAZHD49CO/0AXjaDOaMNx8kQxg6NKOTIaWhnTf0PutcnpzBx7iJOXZ7Ca08AZUnGtYdLGD12CUOD5zF+4x7Wd9NYcoRw4uQFDGvOKmRCh8lHKzzpdLuo/2ujqEIltXwyX0ZYjeb/lsVTmxcLFg8s/iheqmva2MGCm4HevqkYfRHcfeUtkGpdbub3a52fXJlGU3kaSuzRLTZD1eLU9SVJV7fj9MXmV7roYuj8aoDet/nonHWjrbf5cOu5M/sfn9OJV1VsucIAAAAASUVORK5CYII=" + }, + "/content/translations/it/web3/web3.png": { + "hash": "6e8c2af3", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB10lEQVR4nDWQTW8SURSGr1v/QlfGlTFN1K0rF26a6MLGhYvqrnHZhdFqYqK1q8YaRZPGYK3VGJRIS7DWjsC0nRbBQbBMwgC2fAgzFIRpARnKxx1e70zTk5zl877POeSg3e42dR2dTgfm9Nm22l1UajqUah2pQgWxzC6CvwvgY2ksR7fxKRA3lqU0Zr2RPOn1DDx5ZoOPX2VgB9p+HdW6jqLWwE5Rg5QtQdxRsS7nwEW2sfhdhkOQDNfPJF4shVRiNirFMnIFBalMDmmlhHKtacHx/F9E0kUI8h8LdoeTJox5fstwhGQ8Xtg8DDhS17s9ZMt7FiwzOMrUA6kC/EydY+thAW/9v2DzBI25TQmTzvXDAFN9aSOKqVduDAzdxFMHh7hSsbS/sZs9PxKYdvJ4ZP+M89fv4cTVW4Z9bQsPPq6pxCyvNXQMXrsDcvwcyLHTGJ2wW+pHNy+KSYw8tIOcvAhCToGcHTaee8MYf+dVCe330aIU8y4Ol0bGcHvqNZx8BCH2OJ+UsbSdwThmvog4c3kUF26M48r9l8Y0J+Lue79KqvVmS9Uahrr/j5aaLZrc1WggkaesnbpDCfpBkOicL0pnVsL0jRCjthWRTi5sdCdcAsZmv2b/A/Jnn7SNGFjfAAAAAElFTkSuQmCC" }, "/content/translations/ja/web3/web2.png": { "hash": "b4c47384", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nB2RXUhTcRiH/11413WhXfQhFGFQRKRd1UUREUFQdFUQM4KCCG9ahgghEklILPuwlRiTLQINl81yLujo2tIcm+WUrcVxmzq3M53bOh7d2hPnvPBePvze9/kJTdM28/k8+upTLv+juL5BerWAnFphdn6ZwO8FfJEEI1MRBr/N8FYKVexjIZ67/KoolUpYLBas1lekMwqqtkm2oJJUckSSGYKxRQOWwjJO3wzvpBC2LwEdxjLkQ+ip8nycP3KcVGqZNVVjQVkjtpQlFFvEPxdnLCzjmphjwPsLh/cnNilE79cgHQMSogKoqoocX6LpQTfjgVkjfTKa5MbV21y+cN04W4f15KeDXu486eeYqZWmF06EoqxQX1VLw5bdCFFNc+cbsrm/XGnuZOf2g2zbWsfpm/dxT8cwP7KxX1RzpGoPQtRytqXbeKFiutjIifpTHD7XiP2DhFJUMbU9Y9/eM+yoOU7DtVaGQ1G63o9Td+AkNbuOIg6d51J7X0WUSmVy2gbJXIHUaoHZRBp/JIFnOsbjvmHarU563JO8Hv1B10cfD4e83HWM0mJ3c8/uRmRyxXW9Mt24Lm0imjSkjQSjuAIR+r+H6fFMGbAurc3hwdz7qWK2febWS2fhP4DaidjZx3u3AAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nB2RX0iTYRSHvy6867rILvojFGFQRKRd1UUREkFQdFUQM4KCCG9ahgghEkmILPtjKzEmWwQaLpvlXNB0bWmOrdLJ1mLOmXP7ZnNbn59u7el998K5O8/5vec5iq7rG7lcDlnylUr/KKytk/qTJ5ZcITS/jP/nIt7wAqPTYYY+z/DKHSxbx4M8cfg0pVgsYjKZMJufk0qraPoGmbxGQs0STqQJRH9XYPdsDLt3htfuIJaPfgljGvaiyNTYfJxfsTjJ5DKrms6iukp0KUNQwL65OOMCdkzOMej5gc3zHYsY0vcpQMegG6UsBmiaRiy+RNO9Hib8oUr6VCTBtcs3uXjuauXbEpbJj4Y83Ho4wFFDK01P7SiqukJdVQ31m3ahKNto7nxJJvuXS82d7Nh6gC2bazl1/S7Ob1GMDyzsEz2Hq3aL3hpOt/RUVigbzjdyvO4kh840Yn3rRi1oGNoes3dPA9urj1F/pZWRYITuNxPU7j9B9c4jKAfPcqG9vywklsjq6ySyeZLCfGghhU9Ic4nErv4R2s12ep1TvBj7Svc7L/eHPdy2jdFidXJHlJLOFtbkyaRxKW1S7C6ljQYiOPxhBr7M0uuarsBSWpvNhbHvfdlo+cCNZ/b8f4DaidgJW23XAAAAAElFTkSuQmCC" }, "/content/translations/ja/web3/web3.png": { "hash": "341d1c44", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nFWRv2sTcRjGvzj6LziJi0sQZwcXJ3XRQXAJgoOLi0gpFLVKFaSoGChKbW3BQKuntSEGYgxJ84PU2PO0iUlN2lysibmmTVJje3eNSbmP3GXyhXf8PM/zPq/Yt6yubhi0Wi3ssQCz06XRNqhutSlWG2TKGyyt/iKSUQkqq0jJnCV9zPMsJJvChmLxOI88HuqNJrtGh23dRGvtUNJaZH/UHTix8pOQsoZPLjCbyPI8rDD+4TPCdtRNk0pNY6287sCbbd2B85UtFFUjkVv/D/bGMzx9L/PAl+oL2GtPp7dPSWs6cKHWZLm8QapY7UfPqPjlAi8iXxkLpPEE0tybS/QF9jodAskvjE76OHT6Co9nQ+Qqm0QzquNsgw+lBUYm3nHCPcSRCwOO++1XMewOrPaOgeviIOLgccQBF1fvTyGrGkG5yPziihP90sgU4vAphDiKOHaOO1KMoZmIJf72ehjdHtNvgpx1X2NgdBIpqjjR7cbnFvPO3WP+NK4zlznpHuT8zXFuzEQZfh1DbP8x9+yX1X/rNAyTUrPNUqlGJFvG/+k7UvIb3ugyE2EFbyrHk7DC3bdJ69bLBa5Ph3b/ARUWoBiI760oAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nFWRv2sTcRjGD0f/BSdxcQni7ODipC46CC5BcHBxESmFolapghQVA0WprS0YaPW0NsRCjJI0P0itPU+bmNSmTWNNTEybXD3bu+uZlPv4vcvkCw/f6fO8z/d5pT3HaRumiaZpuOMIWXabpm5S3dQpVptky79YWPlJLLtGRF1BTucd+UOBJ1HFklwokUzyIBCg0WyxY9psGRZ1bZtSXSP3veHBqaUfRNVVQsoyk6kcT9+rDL/7hORuNCyLSq3Oanndgzd0w4MLlU3UtTqp/Pp/cDCZ5fFbhXuhTNfAoTt2Z0+ALQ9errVYFNEzxWo3ulBYGDyLfWFoZp6A0J2pVNdg17aZSX9mcDTEgZOXeDgZJV/ZIC4gd7ML3pdnGRh5wzF/H4fO9Xjbb75I4Hbg6NsmvvO9SPuPIu3zcfnuGIqIHlGKTM8tedEvDIwhHTyBJB1GOnKGW3KCvomYI/3tdDDbHcZfRTjtv0LP4ChyXPWiu41PzRW8fw+F5/Gdushxfy9nrw9zbSJO/0uRYOuPteuerPHboGlalFo6C6UasVyZ8Mdv4mRfCcYXGRGtBzN5Hon39uu0c+P5LFfHozv/ABUWoBh/NIWjAAAAAElFTkSuQmCC" }, "/content/translations/ko/web3/web1.png": { "hash": "efc98eb5", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0klEQVR4nB2Rz0uTcQDGvwch6BztEtJ2sYggCi06dIlFdCmi/oIuXQsTvLR2KjoI5jRo6CwZC3WFc47lz5fhmnNurpVjv5hrWzrdeBe++2XI+4n3fe4fnofPI05U9VhpNOh0OmhRgVb7Hwd1hd2KTLJQIZotE0wW8EdSzIWTTK1E1Slpm3eeYFNosM02SiQSpdlu02x3qNYVStU6mdIhsWyZ76kiKz9yeEI7uKRtJpcijMwHsS2EECeqym6hyO9SGVmWqSstytW/ZPdqOhzOFFlN5PBF07iDP3EF4kxKMSbWoryeWVOFNrndOaZQ2mdwaJxwIsOfukIonuJOrxmrZQhpJ6/Dn5a3GJlb58XYV24+sdBvn0ccHNbo7TJxo8uIEGd5a5/WF3j9Aa6cuUT3aRN2p5fZ9QRW2zQ9wsC1UyaEOM+9wTGE5u3x7Yf0Xeij+9YjnL4AuaqMZ3mDu5cfcN1oZvTzIpq04VkJ47mrGAwXET1m7r+cUHUH1UaLfK2uNyfy+2xmSnzbSvHmgxvLsEuX9t63oUuzfpF4/tHHgMNHv8OHkI+arYp8pF8Wz+/p8Go8iz+WxhtLMxP6hX1xU7tMk8Yr5xID4171mWOBpza38h+uKYtIe2mJ/wAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0klEQVR4nB2Rz2uScRzHv4dB0DnyEiO9rBhBFFvRoUsY0aUY9Rd06VqswS6Zp6LDYM0tSPajhhjbLOac2H6KzJxzmlkTp+JMbXN75DHmz0U8r57n+cD79nnxefP6iH+KclKr12m322ijqGm2/nJYrbFXlknmy0QzJYLJPL5IivlwkunVqDLt/8Ybd7AhNNhmGyUSidJotdS0kVS4KFVJF4+IqfDXVIHV71ncoR2cKji1HGFkIYhtMYRQG7CXL/CrWEKWZaq1JiXpD5n9ig6H0wXWElm80V1cwR84A3Gm/DEm1qO8nF1XhFa51T4hXzxgcGiccCLNb7VBKJ7ido8Zq2UI/05Ohz+sbDMyv8Gzsc/ceGSh376AODyq0NNh4nqHESHO8to+ozfw+AJcPtNN52kTdoeHuY0EVtsMXcLA1VMmdfc8dwfHEJq3h7f66L3QS+fNBzi8AbKSjHtlkzuX7nPNaGb04xKatOE5P8ZzVzAYLiK6zNx7PqHoDqR6k1ylql9O5A7YShf5sp3i1TsXlmGnLu2td1OXZv3k5+l7LwOTXvrVCPm40SzLx/rL4rl9HV6LZ/DFdvGomQ39xL60pb1Mk8YLxzID4x7lyeQij22u2n+uKYtIEQ1SEgAAAABJRU5ErkJggg==" }, "/content/translations/ko/web3/web2.png": { "hash": "f74e5b8a", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2UlEQVR4nB2RXUhTcRiH/11413XRuuhDKMKgiEi7qosiIoKg6KogZgQFEd60DBFCJIqQKPuwSIyNLQInLpvlXNDRtaU5diw32Rqudqa2D3f07DPXnjjnvX/e3+99XgH8rVQqFItF9KnV/lEoV0nnNRLLK0R+/SH4M4U/mmRsJsrwlzneSHLdPiHzzB0oCR1yOoew2WysrWmUylVyWgklqxJVMoTiiwYshRO4/HO8lWSsn4I6zKMRP8aCpXSGpJJCzausliqksqvEl3LI8UUC87+ZCCdwT83j9P3A4fuOVZIZ+BzivlNC6JWLWoGFBYW2u31MBiNG+nRM4eqlG1w4e8WorcN68pNhHzcfD3LY3Enbcxcim12huaGRlg07EMJEe89rcmqRi+09bNu8j00bmzhx7Q6e2TiWB1b2iC0cbNiJEI2c6ugzTqibz7VytPk4B063Yn8nkS2UMHc9Zfeuk2w1HaHlciejcozeoUma9h7DtP0QYv8Zznfb6mJ9vYZaqaKoGst5jUgyTSCaxDsb56FtlO6XLvo907wa/0bvez/3RnzccozTYfdw2+5BZNRCWX+ZblyXNhVTDGljoRjuYJTBr2H6vTMGrEvrcnixDHyoW6wfuf7Cpf0HGzaKvxgEeDsAAAAASUVORK5CYII=" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB20lEQVR4nB2RXUhTYRjHTxfedV20LvoQijAoItKu6qKIiCAouiqIGUFBhDctQ4QQiSIkyj4sEmOHLQInLpvlXNB0bWmOrdLJ1tDaWdo+9OjZmcdc+3Xe88B79/ye//P8Xgn4axgGuq4jqlL5R2llldyixuz8Aomff4j+yBJOZhiaSNL/aZJXwXjVNRLniS9SlgTk8fQhyzLLyxplEy5qZZSCSlLJE0v/tuDg1Cze8CSvg3GcH6IC5sFAGGvAXC5PRsmiLqoslQ2yhSXSc0XiJhyZ/sWICfvGpvGEvuMOfcNpDun5GOOuJ4gkVta1EjMzCk23uxiNJqz08ZTC5QvXOHf6krW2gEXyo/4Q1x/2ctDeStNTL1KhsEB9TS0N67YhSTaaO15SVHXON3ewZeMeNqyv49iVW/i/pnHcc7JL2sT+mu1mby0nWrqsE6r2M40crj/KvpONuN4EKZTK2Nses3PHcTbbDtFwsZXBeIrOvlHqdh/BtvUA0t5TnG2Xq9LaWgXVWEVRNeZN84lMjogpLWAm3pcHaX/upds/zovhL3S+DXNnIMQN9zAtLj83zSfl1dKK+DJhXEgbM28X0oZiKXzRJL2fp+gOTFiwkNbmDuDoeVd1ON9z9ZlX+w8bNoq/CgVChAAAAABJRU5ErkJggg==" }, "/content/translations/ko/web3/web3.png": { "hash": "ffd5c981", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABvUlEQVR4nFWRy2sTYRTFP1z6L7gSN26CuHbhxpW60YXgJggu3LgRKYXikyqID1AoSq1twUCrU6slpsQYksaE1NhxaicmsamZWJM2zVOTmMlT5ifzdeWFs/yde8694q9l9TvdLrbssYB2t0+lbpIv10nnK+jZHVY2tgjoBl5tAyWSsJSPSZ761LawIc/iIpq2Kg1suNowKdSaZAo14j+KEg6nfuLTvrOgrjMbjjPp1xh//xlpUCyV2cxvU2u0aHZ6lOotCSdzZTSjQDix+R/s+qDz5J3K/YUowo5syx6z2yezVZVwKldmLbtDNJ3fja4buNV1nge+MOaJ8cgT4/Z8eNeg3e3hiaxyb9LNvuMXeDjrI5ErEdQNudkGHyhLjE685YhzhANnhuT2Gy9DsoJVb5o4zg4j9h5G7HFw8c4UqlHAq6Z5s5yS0c+NTiH2H0OIg4hDp7iphBiZCViiNxhg9gdMv/Jy0nmJobvPUIKajG5ffH45KXuPuWM4TpznqHOY01fHuTIT5PpcCPGr0e7YLyv+blEx22SqdVYy2wTiWdyfvqFEvuIKrjHh13BFEzz2a9x6HbGuvVji8rTvzz/qYKEihYS+DgAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABvUlEQVR4nFWRvWtTYRTGXxz9F5zExSWIs4OLk7roILgEwcHFRaQUilqlCuIHKBSl1rZgoNXU2hJTYpSkNSG19nprE5Noalpr08Z86k3MvfmS+/O9b1088HCm33Oec474Y9udZquFI6dsKavVoWyY5EoGmVyZ+PoPlla3CMXXCOireKNJ2/suxaOgZgkH8s/OouvLysCBKzWTfLVONl8l8a2g4Ej6O0H9KzPaFyYiCUbe6Ay9/oAyKBRLbOS2qdYa1JttikZDwanNEvpankhy4z/Y8zbOw1cad2ZiCPtfbKdMOT27VVFwWsIrMnosk9uJLuWTBk9CHxn0L3Jf6sZUZMfAarXxR5e5PeJjz9Fz3JsIktwsEpaQM9kB73rnGBh+ySF3H/tO9ajpV5/NqxVso27iOt2L2H0QscvF+ZujaDJ6QMswvZBW0c8MjCL2HkGI/YgDJ7jmnadvPGSLdreL2eky9jzAcfcFem49xhvWVXTn4lMLKbX3oG8R17GzHHb3cvLyEJfGw/RPygQ/a1bTeVnhV4OyaZGtGCxltwkl1vG9/yxf9glPeIVheXVPLMkD2a+/iNpXns5xcSz4+y/qYKEijcJMYQAAAABJRU5ErkJggg==" + }, + "/content/translations/fil/web3/web2.png": { + "hash": "94e4b830", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB2UlEQVR4nDWQX0hTcRTHbw++9VxkD/0RijAoItKe6qGIiCAoeiqIGUFBhC8tQ4QQiWxElNU0MmGyRaDhslnOBV1bd1mO3Uwnm7I1b6bb3Mb+OVvcT797owPn7XzO95yPVKlUfufzeUqlEv+ruLpGMlsgvpQh/GOZ4NxPlMgCo5MRhj5N80JWdee4yhNPoCxVq1U679qw27tJJDQWfyVNWEvniGgpQvOLJizPxHEr07yUVRzvgwbMg2EFSReJK5ms6AypVIrwXJzEcoZYMosq4MBsgnEBeyZmGfR/x+WfwiGW9H0I0Tko/1tQLpeJxTSab/egTEXN9ImoxuUL1zh3+pJ5tgEbyY+G/Fx/OMBBSxvNdjdSOp2hoaaOxnXbkKRNtNies5Ircb7lHls27mHD+nqOXbmF99s8VpuDXWJmf812MVvHidZuJHGAbjnTxOGGo+w72YTztUy6WMbS/pidO46zufYQjRfbGFGjdL36SP3uI9RuPYC09xRnO/p1IfEPucoaWq7AkpAXXkgSENJ8IvF+/wgdT930er/wbOwrXW8U7gz7ueEao9Xp5aZoKZUrrhrWDeOGNON3Q9poKIonGGHg8wy9vkkTNqS1u3xY+97qVsc7rva4C38B8IeJgY+QC+YAAAAASUVORK5CYII=" + }, + "/content/translations/fil/web3/web3.png": { + "hash": "8a260dc0", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv2sTcRjGvzj6HziKi0sQZwcXF9FFB8ElCA4uLiKlUPxJFaSoWClKbW3BQKun1RALMUrSejGxNp42MYlNk1abtGlzaeO15q4xJ/fxe5fJF17e6fO8z/u8YqfVajfNJnLiliPbarWpGyYV3aBQqZNeWmN2YYVoepGwtoASzzrKxxyPIilL2LbN3f77qB+SUqSN3jDY2DKpbm5Tqm6S+bHuwWp+mYhWJJiaZ1zN8PidxuDbzwh341pNZ6VaIztfpLi8Ss1oenCurKMtVlGzP/+DA+/TPHyT4nYw0RFw6FTL/ktZb3hwXsJz0nqiUOlYlx2SAk+iXxmYnKFf9s0JtSNgyfsn41/oGw6y5+g57o1HyJZrxCTkbnbBO8oUvUOvOeTvYd+pLm/7tWfTCNeAsW3iO92N2H0QscvH+VsjpKT1cKrAq2Tes36mdwSx9whC7EccOMF1ZZqesagj/sgQzbbN6Iswx/0X6OobRolpnnU38Ylkzrt7IDSD79hZDvu7OXl5kEtjMa4+lw4aW9aO+7L1X03qpkVpw2C2tEo0s0To03f5sm8EYnMMydQDiSwP5LzxMu5ceTrFxdHI73+pIJ/JiKQ1ogAAAABJRU5ErkJggg==" + }, + "/content/translations/pl/web3/web2.png": { + "hash": "e120238b", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nB2RXUjTURiHTxfedV20LvoQijAoItKu6qKIiCAouiqIGUFBSDctQ4QQiSQkppUVLWOyRaDhslnOBU3XluXYKp1sDZbbdOk21z7+Trf2dM4OvHfvc36/8xxRKpXWc7kcxWIRdSqVfxRW11hayRNNZgj+/oPvVwJPKMbYdIjhzzO8cgWqlokAj+1eTZTLZYzGHkymF6QzK2ilddJ5jXgqSyi+jD+yUINds1FsnhleuwKYP/oUjHHEg1CJsXiCxGKSXC5fS0+k/hJZTBOQsHdungkJ26fmGHL/xOr+gVle0v/JT9eQC1GVtTVNIzq/QMvdPiZ9wVr6VDjO1UstXDh7pVZbwSr54bCbmz2DHNa3c6PPhkilMjTW1dO0YQdC6Gjtfkk6W+RiazfbNu9j08YGTly7g+N7BMN9M3vEFg7W7ZS79Zxqe4KQBar6c80cbTzOgdPNWN66SBU09B2P2L3rJFt1R2i63M5oIEzvm0ka9h5Dt/0QYv8ZzncOVKXECtnSGvFsnqQ0H4wt4ZXSnDLxwcAonc9smBxfeT7+jd53Hu6NuLllHafN4uC2HLGcLayqL1PGlTT1diVtzB/G7gsx+GUWk3O6BitpHVYnhv73VYP5A9ef2vL/AQEMiijd7l/hAAAAAElFTkSuQmCC" + }, + "/content/translations/pl/web3/web3.png": { + "hash": "994c996d", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nFWRy2sTURSHLy79D1yKGzdBunbhxo3oRheCmyC4cONGpBSK9UEVpCi0WpTa2oKBVsdWQyzEKElrQpracbSJSWxiWmvSxjzaOK2ZvEbm887UjQd+3NV3znfPEc1Wq1M3DNrtNnZZMo1Wh6puUKjoZApV4ms/WcpuEIyv4teyKJGkpcRSPA6oDWGaJkP3HxCNxWhKsFStsbVjUNzeJVfcJvG95MDh9A8C2je86gpT4QRP3mmMvP2I02CjWHaSWsmRXd+krNcdOJWvoK0WCSfX/4M97+M8eqNy1xtFWP+07WqZf8hXag6clvCyVI9mCnvqMj7Z4GnwM8OziwzJ3J4J7zWQe2A28omBMS8HTlxkcCpAMl8mJCF7sg3eU+boH33NUXcvh852O9NvPJ9H2AL6roHrXA9ifxdin4tLd8ZRpbpfzfBqIe2on+8fRxw8jhCHEUdOc1OZp3cyaIm23IHRMZmY9nPKfZnugTGUkOao2xufWUg5/x72LeI6eYFj7h7O9I1wdTLE9RfSoLbTaNonK/2qUzUa5LZ0lnKbBBNr+D58lSf7gie0zKjcuiea5KF8b72MWNeezXFlIvD7L6H0n8L1LKV7AAAAAElFTkSuQmCC" + }, + "/content/translations/pt-br/web3/web2.png": { + "hash": "4d9fe018", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB9UlEQVR4nB2QT2iScRzGf0HHTh2q7VK7VQuiGrRDh0GEEOw4doqN1sUuoyDJQ4MiGBSb0WYNjFUzW2yRzdnKTBvbqzNF620ux6svir6m01c3X/9M+/n69L5+4Tl8D8/zfHhIvV7/J0kSylIZ6jWbMir7DeR2y0hki9hO5hCMpcFEEvga5LDk3cK7NVa2sVEYV3xJQimFwfAEJtMLFIq72Ff+QrkGQdwDJ+TBxjPY4FJwb/Kw/4hgYY3Fa1dInveFMWldTxOltJXLi8hkd6CSlGp1pMUS+EwBm4ksfIp5/U8Cn/wRfPCEseANw7z6U7ayHCZtjKAGoFquIB4XMDo+AyYUabcHogK0w6MYGtS2sVWz2R2CcckD3dR7WXNrArdNdoGIYhE9B7rQq4iQTtwzzKGwV8U1/QSOHz2LI4e6obl5Hw42hrsGC06RDlw42CWTw+eg0RnbBK2Rgevou3gF5/tH8Hb5O8RKDUMPpnH65FV0HLuE3htjWPkVxbSVQfeZy+g80SOTvmEMPDQLpNlqoVRv4K9URV5RJJWDn0/D9ZvHU4sDj14uq6Nh1hXE8y9+PLZ7oZ//JhucftyZc6SJgltJ7RSbXDJHg1yKMltx6mZjVFmc2gPbdHEjTGedATpl89DxxVU69sZJda8+N/QWJ7TPPvL/AUKkidfXlTUIAAAAAElFTkSuQmCC" + }, + "/content/translations/pt-br/web3/web3.png": { + "hash": "768304cd", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABzklEQVR4nDWQTU8TURiFr1v+gwvDhoQYo1tWLtxJMCYuXAg7o1slfpAQgrLCaJSSGDJGhESaVJCm8jVgm35KbZ1aSzq00BZsOwzQjE5wCjPe3jnemcibnOXz5jmHtGzbMppNnJgmnLN5js2/aOhNKNoRirUGshUV61s1hH6UsZTZxmwiz5byFQjityqhlOLVmAfReJyDJvSjJn4Zxy5c2tOQ29lHqqQgIu9ClLYx/0WGN5pj81IR4wtJhXADWz04hJNCaReqpuNAN1w4Xz2EVN5DVP7pwv50wYExFcoyb1LGM3+iTuz/2s6ZtIUdVXNhmcMZrp4o1hDk6iJPgD+YDn6HJ7DO3sU3MOKLKO4Di9dYiEkYfePH2at38dIrIl9vuNqrvHPg6yae+0J4KnxCV+8Azt3oZ0I4i2FfuE4cAaf3+ZsPQdougpzpxO0ngqt+2pmPhlvDAkj7FRDSAXLhGvOspTEwE6w7G8BiDFNzIrr77uHB6CTmIlkk+XCfcxVXe5b3fb2YwqWeO7jc9wjXByfYCzGFx++DCtGNE4Mv3lJ+/6ENy6IFVaOJzSpdlrYoV6e+2AZ9u5ahEytpynvTcTFNRz7GrKEPYdyfFMv/AKq2oEjaSH8oAAAAAElFTkSuQmCC" }, "/content/translations/ru/web3/web1.png": { "hash": "41623c11", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVR4nB3Rz2vScRzH8c9hEHSOvMRILysiiGIrOnQJI7oUUX9Bl67FGuySeSo6jNxsQTZdDTG2Wcw5sf38IjPnNp1ZE3/hRM10Os2ZbtPxfYbfw/v44v3i8RLHsnxUq9VoNBrIoFzzoEWxWmenUCGSLhBI5PBG0rg3osz4I0wsBeQJaYthh7chWu02bwzDfDCbKe3tcdBqU6rWyZaqxLO7BBM5vkczLP1I4vBtY5O2GF/YYGTWi3HOhziWZXbSGaLxBMVCkWq9Sa70l0S+rIT98QzL4SSuQAy79yc2T4hxKYh5JcDLqRVZdCofHh6RzRcZHBrDH47zu1rHF4pyq1eLXjeEtJ1Swp8WNxmZWeXZ6FeuP9LRb5pFFHfL9HZpuNalRojTvDZNKg2cbg+XTl2g+6QGk9XJ9GoYvXGSHqHiygkNQpzlzuAoouP28OZ9+s710X3jAVaXh2SpgmNxjdsX73FVreXt53k6aIZpCfWZy6hU5xE9Wu4+N8uKQelfk1S5qnwOp/6wHs/ybTPKq/d2dAabgvbOtaag6b9IPP3oYsDiot/iQlT2G81CZV+ZLJTKK+HlUAJ3MIYzGGPK9wvT/Hpnsg4aL6wLDIw55SeWOR4b7fX/UZ+Kfg1hyHwAAAAASUVORK5CYII=" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1ElEQVR4nB2Rz2uScRzHv4dB0DnyEiO9rIggiq3o0CWM6FJE/QVduhZrsEvmqegwcrMF2dxqiLHNYs6J7afIzLlNM2viVJzoMt3jNGe6TeN59fgc3rfPi8+b11v8k+WjarVKvV5HBjWNgybFSo3tQplYpkAouYM/lsGzHmc6GGN8MSSPe78x6PTXRbPV4pVpkHdWK9LeHgfNFpIC56QKidwuYQX+Gs+y+D2FM7CJXQHH5tcZmvFjng0glAZsZ7LEE0mKhSKVWoMd6Q/JfEmFg4ksS9EU7tAWDv8P7L4IY94w1uUQzyeXZdGufHh4RC5fpH9ghGA0wS+lQSAS50a3HqNhAO9mWoU/LGwwNL3Ck+HPXH1goNcygyjuluju0HGlQ4sQJ3lpmVAbuDw+Lpw4R+dxHRabi6mVKEbzBF1Cw6VjOuX2NLf6hxFtb/ev36XnTA+d1+5hc/tISWWcC6vcPH+Hy1o9rz/O0ZZmmvKiPXURjeYsokvP7adWWXUg/W2QLlXUz9H0b9YSOb5sxHnx1oHBZFelvXGvqtKMn7w8fu+mb9RNrxJR3q83CuV9dbJIOq/CS5EknvAWLiWTgZ9Y5tbak7Wl8cw2T9+IS340OstDs6P2H1Gfin75ocH3AAAAAElFTkSuQmCC" }, "/content/translations/ru/web3/web2.png": { "hash": "3fb436d9", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nDWQXUhTcRyG/11413WhXfQhFGFQRB92VRdFRARB0ZXdzPAi8MKbliFCiEQhKWUfFpljskWg4bJZzgUdW2dpzh2XU7bGlptj7uNsbeO4OrEnzqAfvJcP7/t7RKVS+VMsFjHy/zZ1nVxJI5ZSWfm5ge/HOnIozvRCiIkvy7ySlKptVuGJ06sJXdfp7x/AYrGQyWTZyOWJJtOE1tKEEhn8kWQNloIxHPIyryUF60efAfNgUkYYjfHEOjlVRVXzKMEwkncReXGVQCyFd3WN2WAM59wq457v2D0BrJLCyCc/98YlRBXQNI1oNEHHnSHkQJjUrzLz4QRtLe20XGqrzTZgo/nRhIcbD8c4Yeqm46kDkc2qHK1rpHnLboSop7PvJZlCmaud99m5/SDbtjZx9vptXEsRzH1W9ot6jtTtQYhGzncN1V6omi63cur4GQ5faMX2ViJb1jD1PGbf3nPsaDhJ87VuppQwg28+03TgNA27jiEOXeRK72hV6PpfCpXfJAolUvkSK/E03lAc91KEgdEpep87GHbN82LmG4PvZO5Oerhpn6HL5uKWzYXIFMqb6XypZlyJJJkLJ2rSpv1hnL4QY1+DDLsXarAhrcfuxjzyvmq2fqD9maP0DxDAiNu8ufArAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nDWQXUhTcRjGTxfedV1kF30IRRgU0Ydd1UUREUFQdGU3M7wIvPCmZYgQIlFIStmHReaYbBFouGyWc0HH1lmac6flHFuy5abMfZytbRxXi/36n0EvPHfP8z7v+5PK5fKfQqGAof+zUamQLerEkhpLP9fx/VhFCceZmg8z/nmRl7Jatc2oPHZ6dakizH19/VgsFtLpDOvZHNG1FOEVoUQa//JaLSwHYziURV7JKtYPPiPM/QkFyWiMJ1bJahqalkMNRpC9CygLIQKxJN7QCjMi7JwNMeb5jt0TwCqWDH/0c3dMRqqKBbquE40maL89iBKIkPxVYi6SoLW5jeaLrbWzjbDR/HDcw/UHoxw3ddH+xIGUyWgcqWugadMuJGkbHb0vSOdLXOm4x46tB9iyuZEz127h+raMudfKPuE5XLdbeBs41zlYe6FqutTCyWOnOXS+BdsbmUxJx9T9iL17zrK9/gRNV7uYVCMMvP5E4/5T1O88inTwApd7RqoC4l/y5d8k8kWSuSJL8RReAc0tGvtHJul55mDINcfz6a8MvFW4M+Hhhn2aTpuLm0KSOHcjJYIGcVUQnxW/G9Cm/BGcvjCjX4IMuedrYQNat92Nefhd1Wx9T9tTR/EfEMCI29AtNPQAAAAASUVORK5CYII=" }, "/content/translations/ru/web3/web3.png": { "hash": "c3589019", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxUlEQVR4nFWRv28ScRjGv3H0P3A0Li7EODu4uBhddDBxISYOLi7GNE0af6aamEaNNY2mtraJJK1ebUuQBJFAEUrFnqcFAaH80EILBUp7VA5OzvAxd0y+yTt+nud5n1d0dL3b0lp0dB1zekBb71JXNUo1lUypTqxQYXV9E38sj0dZRwonetKnJC+8clsYhsHj0acsL0f4Yxg09prsNDXKjX1y5Qbxn9sWHEpt4FWyOOU0s6E4L30K4x++IEzHSrXGZrlCIp0lu7FFVW1ZcLJYQ8mXCSV+/Qc7PsZ4/l7moTPSFzDXHN34S7G2a8GpYo21QoVIptSPHsvjktO88n9jzB1l1B3l/nyoL9DWddzhr4xMOjl0+gpPZr0kilUCsbzlbIKPpCWGJ95xwj7EkQsDlvudN0GEGUDd17BdHEQcPI44YOPqgynkfBmPnGFxJWVFvzQ8hTh8CiGOIo6d464UZGjG3xNmcVrXYPqth7P2awyMTCIFFCu62fj8StK6e8wVxXbmMiftg5y/Oc6NmQC354KI3Wa7Y75se69FXWuT21FZzW3hjxdwff6BFP6OI7DGhE/BEUnwzKdwbyHcu/V6ievT3t//ALrMn9OB478oAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRz2sTURCAHx79DzyKFy9BPHvw4kX0ogfBSxA8ePEiUgrFn1RBioqVotTWFgy0Gq2GWIhRktakqbXrahM3sWnSapM2aZKm3dTsNmZlP99uTg4M712+mW9mxG6r1W4aTeSLE7ZMs9WmphsUqzrZYo3kSpn5pTUiyWVC6hL+uGb7P6V5ElZMYVkW9/sfMjOT4I/817cbbDYMSvUd8qU6qZ8bLhzLrBJWcwSURcZjKZ5+UBl8/wXhdCxXqqyVymiLOXKr61T0pgunC1XU5RIx7dd/sO9jksfvFO4GEp0CNp1oWX8pVLdcOCPhBameyBY76jKDssCzyDcGJufol3l7ItYpYMr5J+Nf6RsOsO/4BR6Mh9EKFaIScjo74D3/FL1Dbzni7eHAmS63+40X0whHQN8x8JztRuw9jNjj4eKdERSpHlKyvJnNuOrnekcQ+48hxEHEoVPc9E/TMxaxhbM4o20x+irESe8luvqG8UdVV93Z+MRs2p17IDiH58R5jnq7OX11kCtjUa6/lAZbDXPXOdnGdpOaYZLf1JnPrxNJrRD8/EOe7Du+6AJDcuu+hMYj+d56HbevPZ/i8mj49z+6zJ/Tx9WZ2wAAAABJRU5ErkJggg==" }, "/content/translations/tr/web3/web2.png": { "hash": "dc153c40", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nB2RXUhTcRyG/11413WhXfQhFGFQRKRd1UUREUFQdFUQM4KCiLpoGSKEeGGExLQPi4Yx2SLQcNks54KOri3NsWP5tTVY29mHc1/sbHO2tSfO+d0/7/vy/ESlUvlbKBQolUpoV6v9o7ixSSqnEk5mWf6zhu93DE8gyuR8gLFvi7yV5Lp1Wua5w1sW1WoVk6kfs9lMIrlGTi2SUcso6TwBZR1/KK7D0lIYu2eRd5KM5YtPgzGNe9ADlFicqBIjGlGIpbIksgVCiQxyKI53JcL0UhjH7Aqj7l/Y3D+xSDJDX/08GpUQdaBcLhOOxLnbO8iMf1Vvnwsq3Lh6m8sXruuzNVhrfjrm5l7/CMcMXdx5YUek01laG5pp27IbIRrp6HtDJl/iSkcfO7cfZNvWFk7ffIhzIYTxsYX9opEjDXsQopmznYMIoG642M6J1lMcPteO9YNEuljG0P2MfXvPsKPpOG3XupiQgwy8n6HlwEmadh1FHDrPpZ7huqhWa+Qrmyh5lWROZTmawhuI4loI8WR4gp5XdszOOV5P/WDgo4fecTf3bVN0Wp08sDoR6/nihvYyzbgmbTao6NIm/UEcvgAj35cwu+Z1WJPWbXNhHPpUN1o+c+ulXf0PS1SJtE8YXsoAAAAASUVORK5CYII=" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4ElEQVR4nB2RXUhTYRyHTxfedV1kF30IRRgUEWlXdVFERBAUXRXEjKAgoi5ahgghXhghMe3DooMx2SLQcNks54Kma0tzbJVfW4O1nX04tzn2cZxt7ek954X37v/8f7/3eaVKpfK3UChQLpfRTq32j9L6Bum1IpFUjsU/K/h+x/EEY0zMBRn9Os8bV6BumQrwzO5VpWq1isnUhyzLJFMrrBVLZIsqSiZPUFnFH07osGshgs0zz1tXAPNnnwZjGvOgL1DiCWJKnFhUIZ7OkcwVCCezBATsXYoyJWD7zBIj7l9Y3T8xiyWDX/w8HHEh1UVtVVWJRBPc6Rlg2r+sp8+GFK5fucWl89f02hqsJT8ZdXO3b5ijhk5uP7chZTI5WhqaaN20C0naRnvva7L5Mpfbe9mx9QBbNjdz6sYDHD/CGB+Z2SdmDjfsFrNNnOkYQBIF6oYLbRxvOcmhs21Y3rvIlFQMXU/Zu+c02xuP0Xq1k/FAiP530zTvP0HjziNIB89xsXuoLhzUyFc2UPJFUsL8YiyNV0hzisTHQ+N0v7QhO2Z5Nfmd/g8eesbc3LNO0mFxcF9caTVfWte+TDOuSZsRb9ekTfhD2H1Bhr8tIDvndFiT1mV1Yhz8WDeaP3Hzha34H0tUibRl2mmkAAAAAElFTkSuQmCC" }, "/content/translations/tr/web3/web3.png": { "hash": "c78700c0", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv28ScRiHv3H0X3AyLi7EODu4OKmLDiYuxMTBxcWYpknjz1QT02iikWhqa5tI0urVKkESRAJFCC32PC0IFSpQBXq0UPBsuePgDI+56+SbvOPzeZ/3fUXXNPsdXafX62HXADDMPk1Np9rQKFSbpMt1ltdqRNIlgsoaUiI7kJZyPAvJhrAsi8ceD8mlFF2zz65u0O4YqK0dimqLzPqmA8dXfxFSfuCT88zGMzwPK4x/+IwTUFPrlCs1svkijbbGltZx4FylgVJSiWd//gd7P6Z5+l7mvi+JsJXttsu0/rJebzlwfmOblXKdZKG6p54u4ZfzvIh8xRNI8SiQ4u58fC/AME0CiS+MTfo4cPISD2dDZCtbRNMlZ7INPpAWGJ14xzH3CIfODTnTb72KIWwBbUfHdX4Ysf8oYp+Ly/emkEsqQbnA28VVR/3C6BTi4AmEOIw4cobbUoyRmchA9CwLvW8x/TrIafcVhsYmkaKKo25ffH4x5+zt8adwnbrIcfcwZ6+Pc20mys25GKL9x+jaL9v83aGpGxS3NZaLG0QyZfyfviMlvuGNrjARVvAmszwJK9x5kxjceLnA1enQ7j8KrKAEVJlHjwAAAABJRU5ErkJggg==" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxElEQVR4nFWRv2tTURTHL47+C07i4hLE2cHFSV10EFyC4ODiIlIKxZ9UQYqCYlBqawsGWk2thliIUZLWhLSx8WkTk5rUNNUkTdqkic827+UlT97H+15dPPDlTp9zPvcc0TGMXlvT6Ha72GXJ6EaPhqpRrqvkyw1SxRqLKxXCqVWCygq+WMbyLWR5EkrqwjRNHno8xBcSdCS4o+m02jrV5jaFapP02oYDR5d/ElK+40/mmIymefpeYfjdJ5wGlWqNYqlCJleg3lLZVNsOnC3VUVarRDM//oO9H1I8fpvkrj+OsP5p22WYf1irNR04t77FklSP58u76jIB2eBZ+AuemQQPZG5PR3cb6IbBTOwzQ6N+9h2/wP3JEJnSJhEJ2ZNt8J5vlsGRNxxxD3DgTJ8z/caLOYQtoG5ruM72I/YeRuxxcfHOGEmpHkzmeT2/7KifGxxD7D+GEAcRh05x0zfHwETYEl25A61nMv4yyEn3JfqGRvFFFEfd3vj0fNb5tyeQwHXiPEfd/Zy+OsyViQjXp6RB67fesU+28atNQ16gsKWyWFgnnC4S+PhNnuwr3sgSI3Lr3niGR/K99SpmXXs+y+Xx0M5fCqygBMkPGjwAAAAASUVORK5CYII=" }, "/content/translations/uk/web3/web1.png": { "hash": "8c668a29", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1ElEQVR4nB2Rz2uScQDGv4dB0DnyEiO9rIggiq3o0CWM6FJE/QVduhZrUIfMU9Fh5GYLsuZqiLHNYs692H6KzNzcdOaa+Csn6kynaM5e537wfsL38Bw/PA+fRxwpyn69XkeWZRRQ09w7oFRrsFWsEs0UCSbz+KIZ3KsxJleijM4HlVHPOgNOnywODg95YxrAYvlAoVRC3mtRrjXIlWskcjuEknl+xLLM/0zh9G9i96wzMrvK4JQP87QfcaQobGWyJFK/yWSyKpwv/yVZqKjwSiLLQiSFFIzj8G1g94YZ8YQYXgzycnxREe3JrdY+uUKJZ/1WAhtJtmsN/OEYN7r1GA39eDbTKvx5bo3BySWeDH3j6gMDvZYpRGmnQneHjisdWoQ4yWvLmLrA5fZy4cQ5Oo/rsNhcTCxFMJrH6BIaLh3TIcRpbj0dQrS93b9+l54zPXReu4dN8pIqV3HOLXPz/B0ua/W8/TJDW5ppwoP21EU0mrOILj23nw8rqoPyvybpSk1tjqT/EEjk+L4W49V7BwaTXZX2TlpWpRm/enj8SaLPKtFrlRDVXblZrO6ql4XTBRVeCCdxh+K4QnHG/b+wzATal7Wl8cI2S99Hl/LIOs1Ds6PxHwALiky5HzSwAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB1klEQVR4nB2Rz2uScRzHn8Mg6Bx5iZFeVkQQxVZ06BJGdCmi/oIuXYs1qEPmqegwcrMFPTVXQ4xtFnNObD8fZObmpplr4tSc6GY6RXPrcW6L59XzPIc338vn9f28eX2Ef4qy32g0kGUZBfQ09w4o13fZKNVI5EpE0psEEzn8y0nGlxIMz0aUYek7fZ6gLBwcHvLK1ocovqNYLiPvtaiocKFSJ1XYJqrC35J5Zn9k8ITWcKng0PQy/RNB7JMhBLUBG7k8qcwvcuqrwZuVP6SLVR1eSuWZi2fwRdZxB1dxBWIMSVEG5yM8H51XBK1yq7VPoVjmSa+D8GqaLfWTUCzJtU4zVksv0lpWhz/OrNA/vsCjgS9cvmehW5xAKG9X6WwzcanNiCAc56U4ojfw+gOcO3aG9qMmRKeXsYU4VvsIHYKBC0dM6uxJbjweQNC83b16m65TXbRfuYPTFyBTqeGZWeT62VtcNJp5/WkKTZptTMJ44jwGw2mEDjM3nw4quoPK3ybZal3fHM/+Jpwq8HUlyYu3biw2ly7tjW9Rl2b9LPHwg48eh49uNUJtR26Wajv6yWLZog7PxdL4o+t41YyGfiJOhbWTadJ45pym571XeeCY5L7dvfsfAAuKTKCfTFsAAAAASUVORK5CYII=" }, "/content/translations/uk/web3/web2.png": { "hash": "785a3c60", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3UlEQVR4nDWRXUhTcRyG/11413XRuuhDKMKgiEi7qosiIoKg6KogZgQFEd60DBFCJIoZUVZbkQmTLQINl81yLujY2po5Np1fmwdO25xzX4596OqsPXEGvfcP7+/3vKJSqfwpFAqUy2X+Z0NVSa0VUZI55n+t4l9axhOOMTYVZvj7LG+lYM06EeSFw7suVFWlx9iDyWQmlc6wksqhJNJEV3OE42kCcqIOS3MKds8s76Qgli9+DebJiAehNWpgLL5MNpMltCjj8YeQV7LMKEm8C1Em5hQcvgWG3CFs7hksUpD+rwEeDkmIavUv5WIZJZqg7b4ZX2iJVKHMZCTO9Su3uHT+Wv1sDdaanw27uf10kKP6TtpMdkQmk6O5oZGWTbsQQke78Q3pfInL7Y/YsfUAWzY3cerGPZzTMgajhX1iG4cbdiNEI2c6zPUXavoLrRxvPsmhs61YP0hkSuvou56zd89ptuuO0XK1k9FghN7332jafwLdziOIg+e42D1QE6paJV/5TTxfJLlWZD6WwhuO4ZqWeTwwSvcrO33OSV6P/6T3o4cHI27u2MbpsDq5a3Ui0vnShjaZZjwoJ/BF4nVpY4EIDn+YwR9z9Lmm6rAmrcvmwtD/qWawfObmS3vxH2rQiSNQbHopAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3klEQVR4nDWRX2iSYRSHvy5213WRXfRnUMSCIqKtq7ooIiIIiq4KwkVQELGbbDEGMUYULqJWadEaODSCLWbL1ZxBLtNcE23un074Uuecfprovs3SfHo/oQPv3Xne3znPkcrl8p9isYiqqvyv9UqFzK8ScjrP3M8VAotLeCMJxqYiDH+d4bU7VLNOhHjm8K1JFdHcY+zBZDKTySosZ/LIqSzxlTyRZJZgLFWH3bMydu8Mb9whLJ8CGsyjES+SlqiBieQSOSVHeCGGNxAmtpxjWk7jm48zIWCHf54hTxibZxqL+KT/c5D7Q26kavUvaklFjqdou2vGH14kU1SZjCa5eukGF85eqY+twVryk2EPNx8PcljfSZvJjqQoeZobGmnZsANJ0tFufEW2sMrF9gds27yPTRubOHHtDs4fMQxGC3ukLRxs2Cl6GznVYa6vUNOfa+Vo83EOnG7F+s6NsrqGvuspu3edZKvuCC2XOxkNRel9+4WmvcfQbT+EtP8M57sHakJilUL5N8lCibQwP5fI4BPSXCLx4cAo3S/s9DkneTn+nd73Xu6NeLhlG6fD6uS2eJIYd107mWY8JIz7xe6atLFgFEcgwuC3WfpcU3VYk9Zlc2Ho/1AzWD5y/bm99A9q0IkjVpfffAAAAABJRU5ErkJggg==" }, "/content/translations/uk/web3/web3.png": { "hash": "77b29b90", - "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABwklEQVR4nFWRv2sTcRjGvzj6HziKi0sQZwcXF9FFB8ElCA4uLiKlUNQqVZCiYqUotbUFA62e1oYYiDEkjUlTY8/TXkzTpE3SmNT8Nr1qL700MR+5i4svPOPzPp/3ecWuYezt6DqtVgtzuoDR7lDTdApVjVShhpotsbS2iV/N4FHWkMLxrvRxhadeuSk6nT88GHnEwkKEVrtNqVKn3NimvLVDuviT2EbZMocS3/Eq6zjlJDOhGM98CmPvPyPMxM1iyVIynUNdXSdXqrNR2SKer6BkioTiuf/Mjg8qT97J3HNGegtM8Q89X9XIVhok8lWWsyUiqUIPXc3gkpM8939l1B1lxB3lzmyot6BpGLjDXxiecHLg5CUeznit9ICasZJN431pnqHxtxyzD3DoXJ+VfvNlEGECaL90bOf7EfuPIvbZuHx3EjlTxCOnmFtMWOgXhiYRB08gxGHEkTPckoIMTPu7wixO32sz9drDafsV+oYnkAKKhW42Pru4Yt096opiO3WR4/Z+zl4f49p0gMFXQURju7lrvsxsvaY3Sdc1ltI/8MeyuD6tIoW/4QgsM+5TcETiPPYp3H4T7t54Mc/VKe/vv3qSn6eoAVOKAAAAAElFTkSuQmCC" + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv09TURiGTxz9DxyNi0tjnB1cXIwuOpi4NCYOLi7GEBKiokETQ9SIIRoEIbEJaBVpKkmtpgVbisj1Kq2lUCilttgftJai3HJL630853byS96c6f3e57yf2DXNvR3DoNFooMaSMpstyjWD3GaNZK5MNF1gfmWDQHQNn76COxy33J8WeerX6qLV+suDvkfMzERoNJsUShWK1W2KWzuk8r+IrRdtcyjxA7++ikdbZiwU49kHnYH3XxAqcSNfsLWcyhBdWiVTqLBe2iKeLaGv5QnFM/+ZXR+jPHmncc8TaS+waI9Cz0rsdKlKIrvJgkSPJHNtdCmvXPA88I3+yTn6pO6Mh9oL6qbJZPgrvUMeDpy8xMMxv50elCaVrIz33VP0DL7lmLOLQ+c67PSbL6cRCqD228BxvhOx/yhin4PLd4fRJLpPSzIxm7DRL/QMIw6eQIjDiCNnuOWepms0YAlVnLHXZOS1j9POK3T0DuEO6ja6anx8dtH+d793Dsepixx3dnL2+gDXRoN0v5IE1e36rjqZar1s1ElVasynfhKIpfF+XpIn+44ruMCgbN0VifNYvrffhK0bL6a4OuL/8w96kp+nirbJsQAAAABJRU5ErkJggg==" + }, + "/content/translations/zh/web3/web2.png": { + "hash": "df3520d3", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB8UlEQVR4nB2QTWjTcBjGI+jJmyDMXXR4cdNLUdgOHgYihd2HF8H6cakIsoOjPQgqA5lQ68eih4GjlvqxydrNVjZrS1k/5iqtRlsj2UJnmtitTWtsky7l3/Qx7Qvv4YX39zwPDwWgVa/XoWkautNuG1D3Wij/bWB7pwb29y4yWxJSnICPGQ5LqTzerDHGMrOJmfcpgSKEwO1+BJp+jnJFxp55VxtNCBUFnFgBUyhhnSsi+oNHcIPF/BoDTyRrvP2ch8sflyjTtNMFJakEXdfxr6lDlBXwpWoPTm+KiP/cRijNYjGZw3wqB2/sq+FnODwIxMWuALSGikJBxI0pGoks2xPognbbTdgu2HuxF01HbzQLeimJyafvDOuECxOzQZGS5RqGDxzHyL4BUFQ/nA89qCgqLjpdONpnweGDQ7Bev4vwdx4Otw9D5s/p/QMGdcgC6yTdS9C5On4Fo8PnYRm7jFehGGS1iUv3ZjB4YgxH+s5i5NptfPhmluZP4OSpc+g/dsagRm0Yn/KKVLvTgaK38KeuYcdsni2WkeYlREzHJ75VTM+FMBfJ4IW59MoGpoNJOF5/MtzhNG69XJWoqqKpwm6t/UsokwxXJIl8gUSZLWI2Tpa/sGRhPUdMmDwOJMj9hRi54wsTh2el5fSFYX8W4P8DPKeJv7btthkAAAAASUVORK5CYII=" + }, + "/content/translations/zh/web3/web3.png": { + "hash": "fee7de9d", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB0ElEQVR4nDWRz08TURSFn1v+BxfGFTEucOvKBTuMC3XhAtkZ3aoBITH+wg1Eo0BitCaTSKShUsBa0RFaSmGgUgtlYocKLWLbKbS0MKkzdIbHm+ObAW9ylt/Nd+4lddM80A0DlmXBGZtn3zzAjmYgX9ag5MpIbmxhYS2P8EoWE0vrGJFSbELO4vXXeI5QSvGyrx9T4WnUOWhaFLv6PorVGjLFKuTf20hki5hRNiEm1jE2r8AblZn/RxoDwZhKDm3b3i6VsZlXUSxVUKtbKGm6C//MlVw4qvxx4fF42oEhhJeZN6agd1wqEPtY2xmDG2QKFRd21Je4uvQrjxBXF3kCfMG70DL6AgtMmJPx1B89WmDxGsHZBHrefsTJllt44RWRKuy42t9458D3VTzzhfHE8wnnr3fh1NW7zBNJ4uFwpEAcAa1m4Oy1DpCGJpATZ3DjscdV/9+ZHw2tjzwgp5tBSCNI02XWPxlH11Do2IAxDI5N4mLbbbT3CPDPJBHLqJiSN1ztEd731edFnLt0Exfa7uHK/TfsubiIzvchlWh6XVertUN17y8tmyZNb1WptJqjXxJrlKtTn5Si/GiUv4wK0RU6IMZp9+is9eBDBHcEMfsPuFegZfxfK6gAAAAASUVORK5CYII=" + }, + "/content/translations/zh-tw/web3/web2.png": { + "hash": "e17a9acd", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB3ElEQVR4nB2RX0iTURiHvy6867poXfRHKMKgiEi7qosiIoKg6KogZgQFId20DBFCJIqQmFbWSozJFoGGy2Y5FzRdW5Zjq3SyNZjz2zLd7Nu/z+nWns7Zgffufc7vd56jlEql9VwuR7FYRJ5K5R+F1TWW/uaJL64Qnv9D4FcSX2SBsekIw59neOUJVW0TIZ44/bpSLpcxm7uxWJ6jZbPopXUyeR01rRFRlwnGUjXYMxvH4ZvhtSeE9WNAwphHfCgyUU2miM8n0HW9lp5MZ4n9zhASsH8uwYSAnVNzDHl/Yvf+wCou6f8U5P6QB6UqakswnkjRcreXyUC4lj4VVbl6qYULZ6/UaktYJj8a9nKze5DDxnZu9DpQ0ukVGuvqadqwA0Ux0Nr1koxW5GJrF9s272PTxgZOXLuD63sM0wMre5QtHKzbKXbrOdX2FEUUqBrPNXO08TgHTjdje+shXdAxdjxm966TbDUcoelyO6OhKD1vJmnYewzD9kMo+89wvnOgKiRW0EprqFqeRWE+vLCEX0hzi8SHA6N0Whz0ub7yYvwbPe983Bvxcss+TpvNxW0xyrJWWJVfJo1LafLtUtpYMIozEGHwyyx97ukaLKV12N2Y+t9XTdYPXH/myP8H+o+KJK4vfE0AAAAASUVORK5CYII=" + }, + "/content/translations/zh-tw/web3/web3.png": { + "hash": "25d171c6", + "base64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAYAAADwdn+XAAAACXBIWXMAAAsTAAALEwEAmpwYAAABw0lEQVR4nFWRv2sTYRjHXxz9F5zExSWIs4OLk7roILgEwcHFRaQUij+pghQFq0WprS0YaPW0GmIhRklaE9LUnqdNTKJpk7QmMbZNqteau1xzch/fu0w+8OWdPs/zeZ9HtC2r0zIMOnYHtxwZ0+rQ0A2qGzqFaoN0+ScLSzWi6RJhbQklkXWUVI5HEdUUtm0zeO8+yVSKtgRNa4fmlkF9c5tifZPMypoHx/PfiWjLBNVvTMYzPH6nMfz2I8KdWFqpUK7UWC6vopsW63rLg3OVDbRSnXh29T848D7Nwzcqt4PJbgOHbln2X4q1pgfnJbwo1ZOFalddJiQbPIl+Zmh6nkGZm1PxbgPTsphOfGJgNMieo+e4OxkhW1knJiF3sgveUWboH3nNIX8f+071eNOvPZtFuAL6toHvdC9i90HELh/nb42hSvWwWuDVXN5TP9M/hth7BCH2Iw6c4LoyS99E1BE7colGx2b8RZjj/gv0DIyixDRP3d341FzO+/dQaB7fsbMc9vdy8vIwlyZiXH0uDX5tmW33ZGu/WzQMk2JTZ6H4g2imTOjDV3myLwRii4zIrQeSWR7I98bLhHPl6QwXxyN//gEp3qAW4kat1gAAAABJRU5ErkJggg==" } } \ No newline at end of file diff --git a/src/fonts/IBMPlexMono-Regular.ttf b/src/fonts/IBMPlexMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..81ca3dcc9264054eda54892f2105a4d9f85eaf50 GIT binary patch literal 133720 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�f+*W;r$=a=vy`(2<$1RoaK*H7}p<@P(j8nx3t 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

4*9^KT7^n>*M>|wJB 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%0DCo0&`A-%p#lSZ_a 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

r4&=ywuOFzp>FIx^> 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 Uh@3pmyhdg$M{-oyJW7cF3l>xKP5=M^ literal 0 HcmV?d00001 diff --git a/src/intl/ar/page-gas.json b/src/intl/ar/page-gas.json new file mode 100644 index 00000000000..18b0b42a007 --- /dev/null +++ b/src/intl/ar/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "عمولة الغاز على إيثريوم: كيف تعمل؟", + "page-gas-meta-description": "اعرف المزيد حول الغاز على شبكة إيثريوم: كيف تعمل وكيف تدفع عمولات غاز أقل", + "page-gas-hero-title": "عمولات الغاز", + "page-gas-hero-header": "عمولات الشبكة", + "page-gas-hero-button-1-content": "ما هو الغاز؟", + "page-gas-hero-subtitle-1": "تدعى العمولات على شبكة إيثريوم بالغاز.", + "page-gas-hero-subtitle-2": "الغاز هو الوقود الذي يشغّل إيثريوم.", + "page-gas-summary-title": "الملخص", + "page-gas-summary-item-1": "تحتاج كل معاملة على إيثريوم لصيغة دفع صغيرة كي تتم", + "page-gas-summary-item-2": "تُعرف هذه العمولات بعمولة ‘الغاز ‘", + "page-gas-summary-item-3": "تتغير عمولة الغاز بناء على مدى ازدحام الشبكة بالمعاملات", + "page-gas-what-are-gas-fees-header": "ما هي عمولات الغاز؟", + "page-gas-what-are-gas-fees-text-1": "تخيّل إيثريوم كشبكة حاسوبية ضخمة يستطيع فيها الناس القيام بمهام مثل إرسال رسائل أو تشغيل برامج. تماما كما في العالم الواقعي, تحتاج هذه المهام للطاقة كي يتم تنفيذها.", + "page-gas-what-are-gas-fees-text-2": "في إيثريوم, يملك كل إجراء حسابي سعر \"غاز\" محدد. الغاز الذي تصرفه كعمولة يعمل بمثابة التكلفة الكلية للإجراءات التي تتضمنها معاملتك. عندما ترسل معاملة أو تشغّل عقد ذكي, أنت بذلك تدفع الغاز كعمولة مقابل معالجة معاملتك.", + "page-gas-how-do-i-pay-less-gas-header": "كيف يمكنني دفع كمية أقل من الغاز؟", + "page-gas-how-do-i-pay-less-gas-text": "بالرغم من أن العمولات العالية تكون حتميّة في بعض الأحيان, لكن يبقى هناك استراتيجيات يمكن استخدامها لتقليل التكلفة:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "أرسل معاملاتك بوقت محدد", + "page-gas-how-do-i-pay-less-gas-card-1-description": "تماما مثلما يكون السفر في أوقات مغايرة لأوقات الذروة يكون أقل ازدحاما وبتكاليف أقل, فإن إيثريوم تعتبر أرخص عموما عندما تكون أمريكا الشمالية نائمة.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "انتظر حتى ينخفض الغاز", + "page-gas-how-do-i-pay-less-gas-card-2-description": "تتغير أسعار الغاز للأعلى والأسفل كل إثني عشرة ثانية وذلك وفقا لمدى ازدحام شبكة إيثريوم. عندما تكون أسعار الغاز مرتفعة, فإن الانتظار لبضع ثواني فقط قبل إجراء المعاملة قد يقلل بشكل كبير مما تدفعه.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "استخدام الطبقة 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "تم بناء شبكات الطبقة 2 اعتمادا على إيثريوم, وهي توفر عمولات منخفضة وتستوعب إجراء معاملات أكثر. تعتبر هذه الشبكات اختيار جيد لحفظ عمولات المعاملات التي لا يكون من الضروري إجراؤها على شبكة إيثريوم الرئيسية.", + "page-gas-try-layer-2": "جرب شبكات الطبقة 2", + "page-gas-what-causes-high-gas-fees-header": "ما الذي يسبب عمولات الغاز المرتفعة؟", + "page-gas-what-causes-high-gas-fees-text-1": "في الوقت الذي تبدأ فيه كمية (غاز) الحوسبة على شبكة إيثريوم بتجاوز عتبات معينة, تبدأ عمولات الغاز بالارتفاع. كلما تجاوز غاز الحوسبة هذه العتبة بنسبة أكبر, كلما ازدادت عمولات الغاز بشكل أسرع.", + "page-gas-what-causes-high-gas-fees-text-2": "قد يحدث ارتفاع العمولة بسبب أشياء مثل تطبيقات لامركزية شهيرة أو بسبب رموز غير قابلة للاستبدال NFTs, أو الازدياد المؤقت لحجم التداول على المبادلات اللامركزية DEXs, أو بسبب الحجم الكبير جدا لنشاطات المستخدمين في فترة الذروة.", + "page-gas-what-causes-high-gas-fees-text-3": "على مطوري إيثريوم الاهتمام بتحسين استخدام عقودهم الذكية قبل نشرها. إذا استخدم الكثير من الناس عقود ذكية مكتوبة برداءة, سيستهلك ذلك المزيد من الغاز كعمولات وقد يسبب ازدحام الشبكة.", + "page-gas-want-to-dive-deeper": "هل تريد التعمق بهذا؟", + "page-gas-check-out-the-developer-docs": "اطلع على المستندات الموجهة للمطورين.", + "page-gas-attack-of-the-cryptokitties-header": "الهجوم الذي تسبب به Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "في نوفمبر 2017, تم إطلاق مشروع Cryptokitties الغني عن التعريف. وقد أدى الارتفاع السريع في شعبية المشروع إلى ازدحام الشبكة و ارتفاع عمولات الغاز بشكل كبير. التحديات التي فرضتها حادثة Cryptokitties سرّعت عجلة إيجاد حلول توسعية لشبكة إيثريوم.", + "page-gas-why-do-we-need-gas-header": "لماذا نحتاج للغاز؟", + "page-gas-why-do-we-need-gas-text": "يعتبر الغاز مكوّن شديد الأهمية في الحفاظ على أمان إيثريوم ومعالجة المعاملات. يساعد الغاز على ذلك بطرق عدة:", + "page-gas-benefits-1-description": "يساعد الغاز في مقاومة إيثريوم لهجمات sybil (هجوم الهويات المتعددة) وذلك بمنع الجهات المشبوهة من غمر الشبكة بالنشاطات الاحتيالية.", + "page-gas-benefits-2-description": "بسبب أن عمليات الحوسبة تتطلب تكاليف الغاز, سيكون من غير المجدي اقتصاديا غمر إيثريوم بكمية ضخمة من المعاملات مرتفعة التكلفة, سواء كان ذلك بالصدفة أو بنية سيئة.", + "page-gas-benefits-3-description": "وجود سقف لكمية الحوسبة التي يمكن إجراؤها في وقت محدد يمنع غمر إيثريوم بالمعاملات, ويساعد في التأكد من أن الشبكة دائما متاحة لإجراء المعاملات.", + "page-gas-how-is-gas-calculated-header": "كيف يتم حساب الغاز؟", + "page-gas-advanced": "إعدادات متقدمة", + "page-gas-how-is-gas-calculated-text-1": "عمولة الغاز الكلية تتكون من عدة أجزاء:", + "page-gas-how-is-gas-calculated-item-1": "عمولة أساسية: وهي عمولة يتم تحديدها من قبل الشبكة بحيث يتم دفعها مقابل كل معاملة", + "page-gas-how-is-gas-calculated-item-2": "عمولة تفضيلية: وهي عمولة إضافية اختيارية لتشجيع مشغلي العقد على تضمين معاملتك", + "page-gas-how-is-gas-calculated-item-3": "وحدات الغاز المستخدمة*: تتذكر أننا قلنا الغاز يمثّل الحوسبة؟ الإجراءات الأكثر تعقيدا, مثل التفاعل مع عقد ذكي, تستخدم غاز أكثر من الإجراءات البسيطة, مثل إرسال معاملة.", + "page-gas-how-is-gas-calculated-list-item-1": "* شاهد الشكل 1 لمعرفة كمية الغاز التي تستهلكها أنواع مختلفة من المعاملات", + "page-gas-how-is-gas-calculated-text-2": "الصيغة المستخدمة لحساب عمولة الغاز هي وحدات الغاز المستخدمة* (العمولة الأساسية + العمولة التفضيلية). أغلب المحفظات ستقوم بحساب استهلاك المعاملة من الغاز وعرضه بطريقة مبسطة أكثر.", + "page-gas-table-figure": "الشكل 1: الغاز المستهلك حسب نوع المعاملة", + "page-gas-table-header-1": "نوع المعاملة", + "page-gas-table-header-2": "وحدات الغاز المستخدمة", + "page-gas-table-item-1-transaction-type": "إرسال ETH", + "page-gas-table-item-2-transaction-type": "إرسال رموز ERC-20", + "page-gas-table-item-3-transaction-type": "تحويل NFT", + "page-gas-table-item-4-transaction-type": "المبادلة عبر Uniswap", + "page-gas-faq-header": "الأسئلة المتكررة", + "page-gas-faq-question-1-q": "لمن تذهب عمولة الغاز التي تتطلبها معاملتي؟", + "page-gas-faq-question-1-a-1": "الجزء الأكبر هو عمولة غاز —العمولة الأساسية— يتم تدميرها من قبل البروتوكول (تُحرق). العمولة التفضيلية, إذا تم تضمينها في معاملتك, سيتم إعطاؤها للمدقق الذي يعرض معاملتك.", + "page-gas-faq-question-1-a-2": "يمكنك قراءة وصف مفصّل عن العملية في مستندات مطوري الغاز.", + "page-gas-faq-question-2-q": "هل أحتاج لدفع الغاز ب ETH؟", + "page-gas-faq-question-2-a-1": "نعم, جميع عمولات الغاز على إيثريوم يتم دفعها بعملة ETH المحلية.", + "page-gas-faq-question-2-a-2": "المزيد من الرموز غير قابلة لاسترداد", + "page-gas-faq-question-3-q": "ما هو gwei؟", + "page-gas-faq-question-3-a-1": "في أغلب المحفظات أو مواقع تتبع أسعار الغاز, سترى أسعار الغاز مسماة ب ‘gwei’.", + "page-gas-faq-question-3-a-2": "Gwei هي مجرد وحدة أصغر من عملة ETH, كما هو البنس بالنسبة للدولار, مع وجود اختلاف وهو أن 1 ETH تعادل 1 مليار gwie. تكون Gwei مفيدة عند الحديث عن كميات صغيرة جدا من عملة ETH.", + "page-gas-use-layer-2": "استخدام الطبقة 2" +} diff --git a/src/intl/ar/page-get-eth.json b/src/intl/ar/page-get-eth.json index cde45c39f0c..353513c0d6a 100644 --- a/src/intl/ar/page-get-eth.json +++ b/src/intl/ar/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "المبادلات عبارة عن أعمال تتيح لك شراء العملات المشفرة باستخدام العملات التقليدية. لديها الوصاية على أي عملة إثير تشتريها حتى ترسلها إلى محفظة تتحكم فيها.", "page-get-eth-checkout-dapps-btn": "تحقق من التطبيقات اللامركزية.", "page-get-eth-community-safety": "منشورات المجتمع عن الأمن", - "page-get-eth-description": "لا تراقب أي حكومة أو شركة إثيريوم وعملات إثير - إنها لامركزية. يعني هذا أن عملات إثير متاحة للجميع.", + "page-get-eth-description": "لا تخضع Ethereum للتحكُّم من قِبل أي مؤسسة - فهي لا مركزية.", "page-get-eth-dex": "المبادلات اللامركزية (DEX)", - "page-get-eth-dex-desc": "إذا كنت تريد المزيد من التحكم، فقم بشراء عملات إثير نظير إلى نظير. باستخدام DEX، يمكنك المتاجرة دون منح السيطرة على أموالك إلى شركة مركزية.", + "page-get-eth-dex-desc": "إذا كنت تريد المزيد من التحكُّم، فاشترِ ETH باستخدام العقود الذكية. مع DEX، يمكنك تداول الأصول الرقمية دون أن تجعل أي شركة مركزية تتحكم في أموالك.", + "page-get-eth-peers": "احصل على ETH من أقرانك", + "page-get-eth-peers-desc": "بعد إنشاء حساب على إيثريوم، كل ما عليك فعله هو مشاركة عنوانك لبدء إرسال ETH واستقباله (وغيرها من الرموز المميزة) من نظير إلى نظير.", + "page-get-eth-staking": "مكافآت المراهنة", + "page-get-eth-staking-desc": "إذا كان لديك بالفعل بعض ETH، فيمكنك كسب المزيد من الأموال عن طريق تشغيل عقدة برنامج المدقق. تتقاضى أموالاً مقابل القيام بعملية التحقُّق هذه في ETH.", + "page-get-eth-earn": "اربح ETH", + "page-get-eth-earn-desc": "يمكنك ربح ETH من خلال العمل لدى المؤسسات اللامركزية ذاتية الحوكمة (DAOs) أو الشركات التي تدفع بالعملات المشفرة، والفوز بالمكافآت، والعثور على الأخطاء البرمجية والمزيد.", + "page-get-eth-daos-link-desc": "تعرَّف على المزيد حول المؤسسات اللامركزية ذاتية الحوكمة (DAOs)", + "page-get-eth-cex-link-desc": "اطّلِع على قائمة التبادلات", + "page-get-eth-staking-link-desc": "تعرَّف على المزيد من المعلومات حول تجميد العملات", "page-get-eth-dexs": "المبادلات الامركزية (DEX)", "page-get-eth-dexs-desc": "المبادلات اللامركزية هي أسواق مفتوحة لعملات إثير والرموز المميزة الأخرى. وتربط بين المشترين والبائعين مباشرة.", "page-get-eth-dexs-desc-2": "بدلاً من استخدام طرف ثالث موثوق به لحماية الأموال في المعاملة، تستخدم نصًا برمجيًا. لن يتم تحويل إثير البائع إلا عندما يتم ضمان الدفع. يُعرف هذا النوع من النصوص البرمجية بالعقد الذكي.", - "page-get-eth-dexs-desc-3": "هذا يعني أن هناك قيودًا جغرافية أقل من البدائل المركزية. إذا كان شخص ما يبيع ما تريد ويقبل طريقة دفع يمكنك تقديمها، فأنت على ما يرام. يمكن أن تتيح لك DEX شراء عملات إثير باستخدام الرموز المميزة الأخرى أو PayPal أو حتى عمليات التسليم النقدي الشخصية.", + "page-get-eth-dexs-desc-3": "وهذا يعني أن هناك قيودًا جغرافية مفروضة أقل من البدائل المركزية. إذا كان شخص ما يبيع ما تريده ويقبل طريقة الدفع التي يمكنك توفيرها، فأنت تسير في الطريق الصحيح.", "page-get-eth-do-not-copy": "مثال: لا تنسخ", "page-get-eth-exchanges-disclaimer": "لقد جمعنا هذه المعلومات يدويًا. إذا اكتشفت شيئًا خطأً، فأخبرنا بذلك على", - "page-get-eth-exchanges-empty-state-text": "أدخل بلد إقامتك للاطلاع على قائمة المحافظ والمبادلات التي يمكنك استخدامها لشراء عملات إثير", + "page-get-eth-exchanges-empty-state-text": "أدخِل بلد إقامتك للاطّلاع على قائمة التبادلات التي قد تتمكن من استخدامها", "page-get-eth-exchanges-except": "إلا", "page-get-eth-exchanges-header": "ما هي الدولة التي تعيش فيها؟", "page-get-eth-exchanges-header-exchanges": "مبادلات", "page-get-eth-exchanges-header-wallets": "المحافظ الإلكترونية", - "page-get-eth-exchanges-intro": "للمبادلات والمحافظ قيود على الأماكن التي يمكن فيها بيع العملات المشفرة.", + "page-get-eth-exchanges-intro": "تفرض التبادلات قيودًا على المكان الذي يمكنها فيه بيع العملات المشفرة. تُعدَّ هذه قائمة إرشادية للخدمات التي يعتقد أنها تعمل في كل بلد. لا يُمثل الشمول هنا تأييدًا - يجب عليك إجراء بحثك الخاص!", "page-get-eth-exchanges-no-exchanges": "عذرًا، نحن لا نعرف أي مبادلات تسمح لك بشراء عملات إثير من هذا البلد. إذا كنت تفعل ذلك، أخبرنا في", - "page-get-eth-exchanges-no-exchanges-or-wallets": "عذراً، نحن لا نعرف أي مبادلات أو محافظ تسمح لك بشراء عملات إثير من هذا البلد. إذا كنت تفعل ذلك، فأخبرنا في", + "page-get-eth-exchanges-no-exchanges-or-wallets": "عذرًا، نحن لا نعرف أي مبادلات تسمح لك بشراء عملات إثير من هذا البلد. إذا كنت تفعل ذلك، أخبرنا في", "page-get-eth-exchanges-no-wallets": "عذرًا، لا نعرف أي محافظ تتيح لك شراء عملات إثير من هذا البلد. إذا قمت بذلك، فأخبرنا على", "page-get-eth-exchanges-search": "اكتب المكان الذي تعيش فيه...", "page-get-eth-exchanges-success-exchange": "قد يستغرق التسجيل في المبادلات عدة أيام بسبب الشيكات القانونية الخاصة.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "الحصول على صورة بطل إثير", "page-get-eth-keep-it-safe": "المحافظة على سلامة إثير لديك", "page-get-eth-meta-description": "كيف تشتري إثير على أساس مكان سكنك ونصح عن كيفية الاعتناء بها.", - "page-get-eth-meta-title": "كيفية شراء إثير", + "page-get-eth-meta-title": "كيف يمكنك الحصول على ETH", "page-get-eth-need-wallet": "سوف تحتاج إلى محفظة لاستخدام DEX.", "page-get-eth-new-to-eth": "جديد في إثير؟ إليك نظرة عامة لتبدأ.", "page-get-eth-other-cryptos": "شراء باستخدام العملات المشفرة الأخرى", - "page-get-eth-protect-eth-desc": "إذا كنت تخطط لشراء الكثير من عملات إثير، فقد ترغب في الاحتفاظ به في محفظة تتحكم فيها، وليس في مبادلة. وذلك لأن المبادلات هي هدف محتمل للقرصنة. إذا حصل المخترق على حق الوصول، يمكن أن تفقد أموالك. بينما على الصعيد الآخر، أنت فقط من يتحكم في محفظتك.", - "page-get-eth-protect-eth-in-wallet": "حماية إثير في محفظة", + "page-get-eth-protect-eth-desc": "تتمثل إحدى الميزات الرئيسية لإيثريوم في أنك تحافظ على السيطرة على أصولك عن طريق إدارة حسابك الخاص. وهذا يعني أنك لستُ مضطرًا إلى أن تضع ثقتك في أي طرف ثالث فيما يتعلق بأصولك، وأنك تخضغ للحماية من أي وصي يتصرف بطريقة غير شريفة أو يتعرض للإفلاس أو للاختراق. ومع ذلك، فهذا يعني أيضًا أنك تتحمل مسؤولية الحفاظ على أمانك الخاص.", + "page-get-eth-protect-eth-in-wallet": "احتفظ بـ ETH الخاص بك في محفظتك الخاصة", "page-get-eth-search-by-country": "البحث عن بلد", - "page-get-eth-security": "ولكن هذا يعني أيضًا أنكم بحاجة إلى أخذ أمن أموالكم على محمل الجد. مع عملات إثير، أنت لا تثق في بنك لرعاية أموالك، أنت تثق بنفسك.", + "page-get-eth-security": "وهذا يعني أنك بحاجة إلى ألا تتهاون في الحفاظ على أمان أموالك. مع ETH، أنت لا تضع ثقتك في بنك أو شركة للاعتناء بأصولك، أنت تتحمَّل مسؤولية الحفاظ عليها بنفسك.", "page-get-eth-smart-contract-link": "المزيد عن العقود الذكية", "page-get-eth-swapping": "قم بمبادلة رموزك المميزة بعملات إثير لدى الآخرين، والعكس.", "page-get-eth-try-dex": "جرب منصة التبادل اللامركزي", "page-get-eth-use-your-eth": "استخدم عملات إثير لديك", "page-get-eth-use-your-eth-dapps": "الآن بعد أن أصبح لديك محفظة، اكتشف بعض تطبيقات إثيريوم (اللامركزية). هناك تطبيقات لامركزية للتمويل، وشبكات تواصل اجتماعي وألعاب و الكثير من الفئات الأخرى.", "page-get-eth-wallet-instructions": "اتبع تعليمات المحفظة", - "page-get-eth-wallet-instructions-lost": "إذا فقدت الوصول إلى محفظتك، فستفقد الوصول إلى أموالك. يجب أن تعطيك محفظتك تعليمات بشأن الحماية من هذا. تأكد من متابعتها بعناية – في معظم الحالات، لا يمكن لأحد أن يساعدك إذا فقدت الوصول إلى محفظتك.", + "page-get-eth-wallet-instructions-lost": "إذا تعذَّر عليك استخدام حسابك، فسوف تفقد إمكانية الاستفادة من أموالك. يجب أن تزودك محفظتك بتعليمات حول الحماية من هذا الإجراء. تأكَّد من متابعتها بعناية - في معظم الحالات، لا يمكن لأحد مساعدتك إذا تعذَّر عليك استخدام حسابك.", "page-get-eth-wallets": "المحافظ الإلكترونية", "page-get-eth-wallets-link": "المزيد من المحافظ", "page-get-eth-wallets-purchasing": "بعض المحافظ تسمح لك بشراء العملات المشفرة ببطاقة خصم أو ائتمان أو تحويلات مصرفية أو حتى Apple Pay. تنطبق القيود الجغرافية.", - "page-get-eth-warning": "هذه المبادلات اللامركزية ليست للمبتدئين، حيث ستحتاج إلى بعض عملات إثير لاستخدامها.", + "page-get-eth-warning": "هذه التبادلات اللامركزية ليست مخصَّصة للمبتدئين حيث ستحتاج إلى بعض ETH لاستخدامها. هذه مجرد أمثلة، وليست منتجات معتمدة. أجرِ بحثك الخاص!", "page-get-eth-what-are-DEX's": "ماهي المبادلات اللامركزية؟", "page-get-eth-whats-eth-link": "ما هي عملات إثير؟", - "page-get-eth-where-to-buy-desc": "يمكنك شراء شراء عملات إثير من المبادلات أو من المحافظ مباشرة.", + "page-get-eth-where-to-buy-desc": "يمكنك ربح ETH، أو استلامها من أقرانك، أو شرائها من التبادلات والتطبيقات.", "page-get-eth-where-to-buy-desc-2": "تحقق من الخدمات التي يمكنك استخدامها استنادًا إلى مكان سكنك.", - "page-get-eth-where-to-buy-title": "من أين تشتري عملات إثير", + "page-get-eth-where-to-buy-title": "من أين تحصل على إثير", "page-get-eth-your-address": "عنوان إثير الخاص بك", "page-get-eth-your-address-desc": "عندما تقوم بتنزيل محفظة، ستقوم بإنشاء عنوان إثير العام لك. إليك ما يبدو عليه:", "page-get-eth-your-address-desc-3": "يمكنك اعتبار هذا مثل عنوان البريد الإلكتروني الخاص بك، ولكن بدلاً من البريد الإلكتروني يمكنه تلقي إثير. إذا كنت ترغب في نقل إثير من المبادلات إلى محفظتك، استخدم عنوانك كوجهة. تأكد دائمًا من التحقق بدقة قبل أن ترسل!", diff --git a/src/intl/ar/page-wallets-find-wallet.json b/src/intl/ar/page-wallets-find-wallet.json index 6e67f425aab..494b9415439 100644 --- a/src/intl/ar/page-wallets-find-wallet.json +++ b/src/intl/ar/page-wallets-find-wallet.json @@ -11,7 +11,7 @@ "page-stake-eth": "تجميد عملات إثير", "page-find-wallet-open-source": "مفتوح المصدر", "page-find-wallet-open-source-desc": "البرمجيات مفتوحة المصدر تتيح لأي شخص تدقيق سلامة التطبيق وأمنه", - "page-find-wallet-self-custody": "الحضانة الذاتية", + "page-find-wallet-self-custody": "الوصاية الذاتية", "page-find-wallet-non-custodial": "المحافظ الساخنة", "page-find-wallet-non-custodial-desc": "المحافظ التي لا تتحكم في مفاتيحك الخاصة", "page-find-wallet-hardware-wallet-support": "دعم محفظة الأجهزة", @@ -49,12 +49,12 @@ "page-find-wallet-token-support": "دعم الرمز المميز", "page-find-wallet-features": "الخصائص", "page-find-wallet-security": "الأمن", - "page-find-wallet-smart-contract": "Smart contract", - "page-find-wallet-check-out": "Check out", + "page-find-wallet-smart-contract": "عقد ذكي", + "page-find-wallet-check-out": "التحقُّق", "page-find-wallet-info-updated-on": "تم تحديث المعلومات في", "page-find-wallet-showing-all-wallets": "عرض جميع المحافظ", "page-find-wallet-showing": "عرض ", - "page-find-wallet-wallets": "المحافظ الإلكترونية", + "page-find-wallet-wallets": "المحافظ", "page-find-wallet-iOS": "iOS", "page-find-wallet-android": "أندرويد", "page-find-wallet-linux": "لينكس", @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "عوامل تصفية الميزات", "page-find-wallet-footnote-1": "المحافظ المدرجة في هذه الصفحة ليست مصادقات رسمية، ويتم توفيرها للأغراض الإعلامية فقط.", "page-find-wallet-footnote-2": "تم توفير أوصافها من خلال مشاريع المحفظة نفسها.", - "page-find-wallet-footnote-3": "نحن نضيف منتجات إلى هذه الصفحة استنادًا إلى معايير في سياسة الإدراج لدينا. إذا كنت تريد منا إضافة محفظة، قم بطرح استفسار في GitHub.", + "page-find-wallet-footnote-3": "نضيف منتجات إلى هذه الصفحة بناءً على المعايير الواردة في سياسة العرض. إذا كنت تريد إضافة محفظة، فقدِّم تذكرة مشكلة في GitHub.", "page-find-wallet-mobile": "جوال", "page-find-wallet-mobile-desc": "محافظ مع تطبيقات الجوال", "page-find-wallet-desktop": "سطح المكتب", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "محافظ مع ملحقات المتصفح", "page-find-wallet-device": "جهاز", "page-find-choose-to-compare": "اختر للمقارنة", - "page-find-wallet-choose-features": "اختر الميزات" + "page-find-wallet-choose-features": "اختر الميزات", + "page-find-wallet-reset-filters": "إعادة تعيين عناصر التصفية" } diff --git a/src/intl/az/page-dapps.json b/src/intl/az/page-dapps.json index 877c611531e..6fdaf96bcec 100644 --- a/src/intl/az/page-dapps.json +++ b/src/intl/az/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "1inch loqosu", - "page-dapps-dexguru-logo-alt": "DexGuru loqosu", "page-dapps-aave-logo-alt": "Aave loqosu", "page-dapps-add-button": "MT təklif edin", "page-dapps-add-title": "MT əlavə edin", + "page-dapps-ankr-logo-alt": "Ankr loqosu", + "page-dapps-api3-logo-alt": "API3 loqosu", + "page-dapps-arweave-logo-alt": "ARweave loqosu", "page-dapps-audius-logo-alt": "Audius loqosu", "page-dapps-augur-logo-alt": "Augur loqosu", "page-dapps-axie-infinity-logo-alt": "Axie Infinity loqosu", "page-dapps-balancer-logo-alt": "Balancer loqosu", "page-dapps-brave-logo-alt": "Brave loqosu", + "page-dapps-beginner-friendly-description": "Başlayanlar üçün yaxşı olan bir neçə dapp. Aşağıda, daha çox dappları araşdırın.", + "page-dapps-beginner-friendly-header": "Yeni başlayan üçün uyğun", "page-dapps-category-arts": "İncəsənət və moda", "page-dapps-category-browsers": "Brauzerlər", + "page-dapps-category-code-marketplaces": "Kod bazarları", "page-dapps-category-collectibles": "Rəqəmsal kolleksiyalar", - "page-dapps-category-competitive": "Müsabiqə", + "page-dapps-category-competitive": "Web3 oyunları", "page-dapps-category-computing": "Tərtibatçı alətləri", - "page-dapps-category-dex": "Token mübadilələri", - "page-dapps-category-investments": "İnvestisiyalar", + "page-dapps-category-dex": "Birja", + "page-dapps-category-investments": "İnvestisiya fondları", "page-dapps-category-lending": "Kredit vermək və borc vermək", "page-dapps-category-lottery": "Kraudfanding", "page-dapps-category-marketplaces": "Bazar yerləri", "page-dapps-category-music": "Musiqi", "page-dapps-category-payments": "Ödənişlər", "page-dapps-category-insurance": "Sığorta", - "page-dapps-category-portfolios": "Portfoliolar", - "page-dapps-category-trading": "Ticarət və proqnoz bazarları", + "page-dapps-category-portfolios": "Portfelin idarə edilməsi", + "page-dapps-category-trading": "Proqnoz bazarları", "page-dapps-category-utilities": "Infrastruktur", "page-dapps-category-worlds": "Virtual dünyalar", + "page-dapps-category-demand-aggregator": "Tələb aqreqatorları", + "page-dapps-category-derivatives": "Törəmələr", + "page-dapps-category-liquid-staking": "Maye staking", + "page-dapps-category-bridges": "Bridges", + "page-dapps-category-experiences": "Paylaşılan təcrübələr", + "page-dapps-category-guilds": "Gəlir gildiyaları", + "page-dapps-category-avatar": "Avatarlar", "page-dapps-choose-category": "Kateqoriya seçin", + "page-dapps-category-social": "Sosial mediya", + "page-dapps-category-content": "Məzmun", + "page-dapps-category-messaging": "Mesajlaşma", + "page-dapps-category-identity": "Identity", "page-dapps-collectibles-benefits-1-description": "İncəsənət Ethereum-da tokenləşdirildikdə, sahiblik hamının görməsi üçün sübut edilə bilər. Sənət əsərinin yaradılışından indiki sahibinə qədər olan səyahətini izləyə bilərsiniz. Bu, saxtakarlığın qarşısını alır.", "page-dapps-collectibles-benefits-1-title": "Mülkiyyət sübut olunur", "page-dapps-collectibles-benefits-2-description": "Musiqi yayımlamaq və ya sənət əsərləri almaq üçün pul ödəmək sənətçilər üçün daha ədalətlidir. Ethereum ilə vasitəçilərə daha az ehtiyac var. Vasitəçilərə ehtiyac varsa, onların xərcləri o qədər də yüksək deyil, çünki platformaların şəbəkənin infrastrukturu üçün pul ödəməyə ehtiyacı yoxdur.", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "Bunlar rəqəmsal sahibliyə, yaradıcılar üçün qazanc potensialını artırmağa və sevimli yaradıcılarınıza və onların işinə investisiya etməyin yeni yollarını ixtira etməyə yönəlmiş tətbiqlərdir.", "page-dapps-collectibles-title": "Mərkəzləşdirilməmiş incəsənət və kolleksiyalar", "page-dapps-compound-logo-alt": "Compound loqosu", + "page-dapps-convex-logo-alt": "Convex loqosu", "page-dapps-cryptopunks-logo-alt": "CryptoPunks loqosu", "page-dapps-cryptovoxels-logo-alt": "Cryptovoxels loqosu", + "page-dapps-cyberconnect-logo-alt": "CyberConnect loqosu", "page-dapps-dapp-description-1inch": "Ən yaxşı qiymətləri birləşdirərək yüksək qiymətdən qaçmağa kömək edir.", "page-dapps-dapp-description-aave": "Faiz qazanmaq və istənilən vaxt geri çəkmək üçün tokenlərinizi borc verin.", + "page-dapps-dapp-description-ankr": "Qurmaq, qazanmaq, oyun oynamaq və sair üçün müxtəlif Web3 infrastruktur məhsulları dəsti – hamısı blockchaində.", + "page-dapps-dapp-description-api3": "10 şəbəkədə (və hesablamada) dApp-lara kripto və forex qiymətləri də daxil olmaqla real vaxt aktiv qiymət məlumatlarına qoşulmağa imkan verən birinci tərəfin qiymət arayışı məlumat lentləri.", + "page-dapps-dapp-description-arweave": "Bir ilkin ödənişlə məlumatları daimi, davamlı şəkildə saxlayın.", "page-dapps-dapp-description-async-art": "#ProgrammableArt yaradın, toplayın və mübadilə edin - rəqəmsal rəsmlər ümumi təsvirə təsir etmək üçün istifadə edə biləcəyiniz \"Laylara\" bölünür. Hər bir Master və Layer ERC721 tokenidir.", "page-dapps-dapp-description-audius": "Mərkəzləşdirilməmiş axın platforması. Dinləyir = etiketlər deyil, yaradıcılar üçün pul.", "page-dapps-dapp-description-augur": "İdman, iqtisadiyyat və digər dünya hadisələrinin nəticələrinə mərc edin.", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "Baxış üçün tokenlər qazanın və onlarla sevimli yaradıcılarınızı dəstəkləyin.", "page-dapps-dapp-description-cent": "NFT göndərməklə pul qazandığınız sosial şəbəkə.", "page-dapps-dapp-description-compound": "Faiz qazanmaq və istənilən vaxt geri çəkmək üçün tokenlərinizi borc verin.", + "page-dapps-dapp-description-convex": "Convex, Curve likvidlik provayderlərinə ticarət haqqı qazanmağa və CRV-lərini bağlamadan artırılmış CRV tələb etməyə imkan verir.", "page-dapps-dapp-description-cryptopunks": "Ethereum-da ilk token kolleksiyalarından biri olan pankları alın, təklif edin və satışa təqdim edin.", "page-dapps-dapp-description-cryptovoxels": "İncəsənət qalereyaları yaradın, mağazalar tikin və torpaq satın alın – Ethereum virtual dünyası.", + "page-dapps-dapp-description-cyberconnect": "Dapps şəbəkə effektlərini yükləməyə və fərdi sosial təcrübələr qurmağa kömək edən mərkəzləşdirilməmiş sosial qrafik protokolu", "page-dapps-dapp-description-dark-forest": "Sonsuz, prosedurla yaradılan, kriptoqrafik olaraq müəyyən edilmiş kainatda planetləri fəth edin.", "page-dapps-dapp-description-decentraland": "Tədqiq edə biləcəyiniz virtual dünyada virtual torpaq toplayın, ticarət edin.", "page-dapps-dapp-description-ens": "Ethereum ünvanları və mərkəzləşdirilməmiş saytlar üçün istifadəçi üçün uyğun adlar.", "page-dapps-dapp-description-foundation": "Rəqəmsal sənət əsərlərinin unikal nəşrlərinə investisiya qoyun və digər alıcılarla elemetləri mübadilə edin.", "page-dapps-dapp-description-gitcoin": "Açıq mənbəli proqram təminatı üzərində işləyərək kripto qazanın.", "page-dapps-dapp-description-gitcoin-grants": "Gücləndirilmiş töhfələrlə Ethereum icma layihələri üçün kraudfanding", + "page-dapps-dapp-description-gm": "Söhbət, forumlar və səs üçün hamısı bir yerdə platformadır ki, gəliri yaradıcıları ilə bölüşür", "page-dapps-dapp-description-gods-unchained": "Strateji ticarət kartı oyunu. Real həyatda sata biləcəyiniz kartları oynayaraq qazanın.", "page-dapps-dapp-description-golem": "Paylaşılan hesablama gücünə daxil olun və ya öz resurslarınızı icarəyə götürün.", + "page-dapps-dapp-description-graph": "Ethereum və IPFS kimi şəbəkələri sorğulamaq üçün indeksləşdirmə protokolu.", + "page-dapps-dapp-description-ipfs": "Vebi yenilənə bilən, davamlı və daha açıq etməklə bəşəriyyətin biliyini qorumaq və inkişaf etdirmək üçün nəzərdə tutulmuş peer-to-peer hipermedia protokolu.", "page-dapps-dapp-description-radicle": "Vasitəçilər olmadan birəbir kod əməkdaşlığını təmin edin.", + "page-dapps-dapp-description-kyberswap": "Mübadilə edin və ən yaxşı qiymətlərlə qazanın.", + "page-dapps-dapp-description-lido": "Rəqəmsal aktivlər üçün sadələşdirilmiş və təhlükəsiz staking.", "page-dapps-dapp-description-loopring": "Sürət üçün qurulmuş birəbir ticarət platforması.", "page-dapps-dapp-description-marble-cards": "URL-lərə əsaslanan unikal rəqəmsal kartları yaradın və ticarət edin.", "page-dapps-dapp-description-matcha": "Ən yaxşı qiymətləri tapmağınıza kömək etmək üçün bir çox mübadilələri axtarır.", + "page-dapps-dapp-description-mirror": "Web3 üçün web3 üzərində qurulan Mirror-un güclü nəşriyyat platforması onlayn yazının sərhədlərini aşır", + "page-dapps-dapp-description-multichain": "Web3 üçün son marşrutlaşdırıcı. Bu, ixtiyari zəncirlərarası qarşılıqlı əlaqə üçün hazırlanmış bir infrastrukturdur.", "page-dapps-dapp-description-nifty-gateway": "Ən yaxşı rəssamlardan, idmançılardan, brendlərdən və yaradıcılardan şəbəkəli şəkildə əsərləri satın alın.", "page-dapps-dapp-description-oasis": "Ethereum stabilkoini olan Dai ilə ticarət edin, borc alın və qənaət edin.", "page-dapps-dapp-description-opensea": "Məhdud sayda mal alın, satın, kəşf edin və mübadilə edin.", "page-dapps-dapp-description-opera": "Brauzerinizdən tacirlərə, digər istifadəçilərə və proqramlara kripto göndərin.", + "page-dapps-dapp-description-osuvox": "Blockchain üzərində yaşayan 3D avatarlar", "page-dapps-dapp-description-poap": "Müxtəlif virtual və ya şəxsi tədbirlərdə olduğunuzu sübut edən NFT-ləri toplayın. Onlardan lotereyaya qoşulmaq, səs vermək, əməkdaşlıq etmək və ya sadəcə lovğalanmaq üçün istifadə edin.", "page-dapps-dapp-description-polymarket": "Nəticələrə mərc. İnformasiya bazarlarında ticarət.", "page-dapps-dapp-description-pooltogether": "Uduza bilməyəcəyiniz lotereya. Hər həftə mükafatlar.", @@ -82,13 +113,19 @@ "page-dapps-dapp-description-rotki": "Məxfiliyinizə hörmət edən açıq mənbəli portfel izləmə, analitika, mühasibat uçotu və vergi hesabatı aləti.", "page-dapps-dapp-description-krystal": "Bütün sevimli DeFi xidmətlərinə daxil olmaq üçün bir pəncərə.", "page-dapps-dapp-description-rarible": "Tokenləşdirilmiş kolleksiya elmentləri yaradın, satın və alın.", + "page-dapps-dapp-description-rubic": "İstifadəçilər və dApplar üçün çarpaz zəncirli texnoloji toplayıcısı.", "page-dapps-dapp-description-sablier": "Real vaxtda pul axını.", + "page-dapps-dapp-description-skiff": "Sizə sərbəst ünsiyyət qurmaq imkanı verən ucdan-uca şifrələnmiş e-poçt, təqvim, sənədlər və fayllar.", + "page-dapps-dapp-description-spatial": "Öz fərdi avatarınızı və 3D dünyalarınızı yaradın", + "page-dapps-dapp-description-spruce": "Şəxsiyyət və məlumatlara nəzarəti olması lazım olduğu yerdə tərk etmək üçün açıq mənbə yığını: istifadəçilərlə.", + "page-dapps-dapp-description-status": "Sərbəst məlumat axınını təmin etmək, şəxsi, təhlükəsiz söhbət haqqını qorumaq və fərdlərin suverenliyini irəlilətmək üçün nəzərdə tutulmuşdur.", "page-dapps-dapp-description-superrare": "Rəqəmsal sənət əsərlərini birbaşa rəssamlardan və ya ikincil bazarlardan alın.", + "page-dapps-dapp-description-synthetix": "Synthetix sintetik aktivlərin buraxılış və ticarəti üçün bir protokoldur", "page-dapps-dapp-description-token-sets": "Avtomatik olaraq yenidən tarazlaşan kriptovalyuta investisiya strategiyaları.", "page-dapps-dapp-description-tornado-cash": "Ethereum-da anonim əməliyyatlar göndərin.", "page-dapps-dapp-description-uniswap": "Tokenləri sadəcə dəyişdirin və ya % mükafat üçün tokenlər təmin edin.", - "page-dapps-dapp-description-dexguru": "DeFi treyderləri üçün girova əsaslanmayan ticarət terminalı", - "page-dapps-dapp-description-synthetix": "Synthetix sintetik aktivlərin buraxılış və ticarəti üçün bir protokoldur", + "page-dapps-dapp-description-xmtp": "DM-lər, xəbərdarlıqlar, elanlar və s. daxil olmaqla blockchain hesabları arasında mesajlar göndərin.", + "page-dapps-dapp-description-yearn": "Yearn Finance gəlir toplayıcısıdır. Fiziki şəxslərə, DAO-lara və digər protokollara rəqəmsal aktivləri yerləşdirmək və gəlir əldə etmək üçün bir imkan yaradır.", "page-dapps-docklink-dapps": "Dapp-lərə giriş", "page-dapps-docklink-smart-contracts": "Ağıllı müqavilələr", "page-dapps-dark-forest-logo-alt": "Dark Forest loqosu", @@ -104,9 +141,7 @@ "page-dapps-desc": "Sınamaq üçün Ethereum tətbiqini tapın.", "page-dapps-doge-img-alt": "Kompüterdən istifadə edən itin təsviri", "page-dapps-editors-choice-dark-forest": "Planetləri fəth etmək üçün başqalarına qarşı oynayın və qabaqcıl Ethereum miqyası/məxfilik texnologiyasını sınayın. Bəlkə Ethereum ilə artıq tanış olanlar üçün.", - "page-dapps-editors-choice-description": "Ethereum.org komandasının hazırda sevdiyi bir neçə mərkəzləşdirilməmiş tətbiq var. Aşağıdakı daha çox mərkəzləşdirilməmiş tətbiqi araşdırın.", "page-dapps-editors-choice-foundation": "Mədəniyyətə sərmayə qoyun. Bəzi inanılmaz rəssamların, musiqiçilərin və brendlərin unikal rəqəmsal sənət əsərlərini və modasını alın, mübadilə edin və satın.", - "page-dapps-editors-choice-header": "Redaktorların seçimləri", "page-dapps-editors-choice-pooltogether": "İtkisiz lotereya üçün bilet alın. Hər həftə bütün bilet fondundan əldə edilən faiz bir şanslı qalibə göndərilir. İstədiyiniz zaman pulunuzu geri alın.", "page-dapps-editors-choice-uniswap": "Tokenlərinizi asanlıqla dəyişdirin. Şəbəkədəki insanlarla token ticarətinə imkan verən icma sevimlisi.", "page-dapps-ens-logo-alt": "Ethereum Name Service loqosu", @@ -156,8 +191,10 @@ "page-dapps-get-started-title": "Başla", "page-dapps-gitcoin-grants-logo-alt": "Gitcoin Grants loqosu", "page-dapps-gitcoin-logo-alt": "Gitcoin loqosu", + "page-dapps-gm-logo-alt": "gm.xyz loqosu", "page-dapps-gods-unchained-logo-alt": "Gods Unchained loqosu", "page-dapps-golem-logo-alt": "Golem loqosu", + "page-dapps-graph-logo-alt": "Graph loqosu", "page-dapps-radicle-logo-alt": "Radicle loqosu", "page-dapps-hero-header": "Ethereum tərəfindən dəstəklənən alətlər və xidmətlər", "page-dapps-hero-subtitle": "MT biznes modellərini pozmaq və ya yenilərini icad etmək üçün Ethereum-dan istifadə edən tətbiqlərin artan hərəkətidir.", @@ -165,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "Ağıllı müqavilə hamının görməsi və tam olaraq bu qaydalara uyğun işləməsi üçün zəncir üzərində yaşayan qaydalar toplusuna bənzəyir. Bir avtomat təsəvvür edin: onu kifayət qədər vəsait və düzgün seçimlə təmin etsəniz, istədiyiniz əşyanı alacaqsınız. Avtomatlar kimi, ağıllı müqavilələr də Ethereum hesabınız kimi vəsait saxlaya bilər. Bu, koda razılaşma və əməliyyatlarda vasitəçilik etməyə imkan verir.", "page-dapps-how-dapps-work-p3": "MT Ethereum şəbəkəsində yerləşdirildikdən sonra onları dəyişdirə bilməzsiniz. MT mərkəzləşdirilə bilər, çünki onlar fərdi və ya şirkət tərəfindən deyil, müqavilədə yazılmış məntiqlə idarə olunur.", "page-dapps-how-dapps-work-title": "MT necə işləyir", + "page-dapps-ipfs-logo-alt": "IPFS loqosu", + "page-dapps-kyberswap-logo-alt": "KyberSwap loqosu", "page-dapps-learn-callout-button": "Quraşdır", "page-dapps-learn-callout-description": "İcma tərtibatçı portalımızda proqram yaratmağa başlamağınıza kömək edəcək sənədlər, alətlər və çərçivələr var.", "page-dapps-learn-callout-image-alt": "Leqo kərpicdən ETH simvolu quran əlin təsviri.", "page-dapps-learn-callout-title": "MT qurmağı öyrənin", + "page-dapps-lido-logo-alt": "Lido loqosu", "page-dapps-loopring-logo-alt": "Loopring loqosu", "page-dapps-magic-behind-dapps-description": "MT adi proqramlar kimi görünə bilər. Ancaq pərdə arxasında bəzi xüsusi keyfiyyətlərə malikdirlər, çünki Ethereum-un bütün super güclərini miras alırlar. MT-ləri tətbiqlərdən fərqləndirən budur.", "page-dapps-magic-behind-dapps-link": "Ethereum-u möhtəşəm edən nədir?", @@ -179,11 +219,23 @@ "page-dapps-marble-cards-logo-alt": "marble.cards loqosu", "page-dapps-async-logo-alt": "Async loqosu", "page-dapps-matcha-logo-alt": "Matcha loqosu", + "page-dapps-metaverse-benefits-title": "metadünya", + "page-dapps-metaverse-benefits-description": "Ethereum-da metadünyanın inkişaf etməsinə imkan verən nədir?", + "page-dapps-metaverse-benefits-1-title": "NFT-lər", + "page-dapps-metaverse-benefits-1-description": "İstifadəçilərə məxsus olan və eyni standartları dəstəkləyən virtual aləmlərdə və bazarlarda qarşılıqlı istifadə edilə bilən unikal oyundaxili elementlər.", + "page-dapps-metaverse-benefits-2-title": "İstifadəçiyə məxsus icmalar", + "page-dapps-metaverse-benefits-2-description": "Şəxsiyyətlər çoxsaylı virtual aləmlərdə sosial şəbəkələri araşdırmaq və yaratmaq üçün sonsuz imkanları olan istifadəçilərə məxsusdur.", + "page-dapps-metaverse-button": "Metadünya", + "page-dapps-metaverse-title": "Metadünya", + "page-dapps-metaverse-description": "Bunlar istifadəçilərə virtual aləmlərdə sərbəst iştirak etməyə imkan verən proqramlardır. İstifadəçilər şəxsi şəbəkələr yarada və rəqəmsal aktivlərə sahib ola bilərlər", + "page-dapps-mirror-logo-alt": "Mirror loqosu", "page-dapps-mobile-options-header": "Başqa kateqoriyaya baxın", + "page-dapps-multichain-logo-alt": "Multichain loqosu", "page-dapps-nifty-gateway-logo-alt": "Nifty Gateway loqosu", "page-dapps-oasis-logo-alt": "Oasis loqosu", "page-dapps-opensea-logo-alt": "OpenSea loqosu", "page-dapps-opera-logo-alt": "Opera loqosu", + "page-dapps-osuvox-logo-alt": "OSUVOX loqosu", "page-dapps-polymarket-logo-alt": "Polymarket loqosu", "page-dapps-poap-logo-alt": "Proof of Attendance Protocol loqosu", "page-dapps-pooltogether-logo-alt": "PoolTogether loqosu", @@ -191,10 +243,18 @@ "page-dapps-ready-button": "Keç", "page-dapps-ready-description": "Sınamaq üçün bir MT seçin", "page-dapps-ready-title": "Hazırsan?", + "page-dapps-rubic-logo-alt": "Rubic loqosu", "page-dapps-sablier-logo-alt": "Sablier loqosu", "page-dapps-set-up-a-wallet-button": "Pulqabı tap", "page-dapps-set-up-a-wallet-description": "Pulqabı MT üçün \"girişiniz\"dir", "page-dapps-set-up-a-wallet-title": "Pulqabı qurun", + "page-dapps-skiff-logo-alt": "Skiff loqosu", + "page-dapps-social-button": "Sosial", + "page-dapps-social-description": "Bunlar rəqəmsal şəxsiyyətlərin və sosial qrafiklərin istifadəçilərə məxsus olduğu mərkəzləşdirilməmiş şəxsiyyət texnologiyalarından istifadə edərək mərkəzləşdirilməmiş sosial şəbəkələrin yaradılmasına yönəlmiş proqramlardır.", + "page-dapps-social-title": "Sosial", + "page-dapps-spatial-logo-alt": "Spatial loqosu", + "page-dapps-spruce-logo-alt": "Spruce loqosu", + "page-dapps-status-logo-alt": "Status loqosu", "page-dapps-superrare-logo-alt": "SuperRare loqosu", "page-dapps-technology-button": "Texnologiya", "page-dapps-technology-description": "Bunlar tərtibatçı alətlərinin mərkəzsizləşdirilməsinə, kripto-iqtisadi sistemlərin mövcud texnologiyaya daxil edilməsinə və açıq mənbəli inkişaf işləri üçün bazarların yaradılmasına yönəlmiş tətbiqlərdir.", @@ -214,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "Tokenləşdirilmiş oyundaxili elementlər haqqında ətraflı", "page-dapps-dapp-description-pwn": "Ethereum-da hər hansı bir token və ya NFT ilə dəstəklənən asan kreditlər.", "page-dapps-pwn-image-alt": "PWN loqosu", - "page-dapps-dapp-description-yearn": "Yearn Finance gəlir toplayıcısıdır. Fiziki şəxslərə, DAO-lara və digər protokollara rəqəmsal aktivləri yerləşdirmək və gəlir əldə etmək üçün bir imkan yaradır.", + "page-dapps-xmtp-logo-alt": "XMTP loqosu", + "opage-dapps-yearn-logo-alt": "Yearn loqosu", "page-dapps-yearn-image-alt": "Yearn loqosu", - "page-dapps-dapp-description-convex": "Convex, Curve likvidlik provayderlərinə ticarət haqqı qazanmağa və CRV-lərini bağlamadan artırılmış CRV tələb etməyə imkan verir.", "page-dapps-convex-image-alt": "Convex loqosu", "foundation": "Fond", "transaction-fees": "Köçürmə üzrə xidmət haqları nə qədərdir?", - "page-wallets-get-some": "Bir az ETH alın" + "page-wallets-get-some": "Bir az ETH alın", + "page-dapps-dapp-description-curve": "Curve stabilcoinlara yönəlmiş bir dexdir", + "page-dapps-curve-image-alt": "Curve loqosu", + "page-dapps-dapp-description-dodo": "DODO, Proactive Market Maker alqoritmindən (PMM) istifadə edən zəncirli likvidlik təminatçısıdır", + "page-dapps-dodo-image-alt": "DODO loqosu", + "page-dapps-dapp-description-artblocks": "Art Blocks, müasir generativ sənətin cəlbedici əsərlərini həyata keçirməyə həsr edilmişdir", + "page-dapps-artblocks-image-alt": "Art Blocks loqosu" } diff --git a/src/intl/az/page-languages.json b/src/intl/az/page-languages.json index 1b8d2ce474f..e18c5c3dc9d 100644 --- a/src/intl/az/page-languages.json +++ b/src/intl/az/page-languages.json @@ -12,10 +12,13 @@ "page-languages-want-more-link": "Tərcümə Proqramı", "page-languages-want-more-paragraph": "ethereum.org tərcüməçiləri həmişə səhifələri mümkün qədər çox dilə tərcümə edirlər. Onların hazırda nə üzərində işlədiyini görmək və ya onlara qoşulmaq üçün qeydiyyatdan keçərək haqqımızda oxuyun", "page-languages-filter-placeholder": "Filtr", + "langauge-am": "Amhar dili", "language-ar": "Ərəb dili", "language-az": "Azərbaycan dili", + "langauge-be": "Belarus dili", "language-bg": "Bolqar dili", "language-bn": "Benqal dili", + "language-bs": "Bosniya dili", "language-ca": "Katalan dili", "language-cs": "Çexcə", "language-da": "Danimarka dili", @@ -32,6 +35,7 @@ "language-hi": "Hind dili", "language-hr": "Xorvat dili", "language-hu": "Macar dili", + "language-hy-am": "Erməni dili", "language-id": "İndoneziya dili", "language-ig": "İqbo dili", "language-it": "İtalyanca", @@ -39,12 +43,14 @@ "language-ka": "Gürcü dili", "language-kk": "Qazax dili", "language-km": "Khmer dili", + "language-kn": "Kannada dili", "language-ko": "Koreya dili", "language-lt": "Litva dili", "language-ml": "Malayalam dili", "language-mr": "Marathi dili", "language-ms": "Malay dili", "language-nb": "Norveç dili", + "language-ne-np": "Nepal dili", "language-nl": "Niderland dili", "language-pcm": "Nigeriya Pidgin dili", "language-fil": "Filipin dili", @@ -58,8 +64,9 @@ "language-sl": "Sloven dili", "language-sr": "Serb dili", "language-sw": "Svahili dili", - "language-th": "Tay dili", "language-ta": "Tamil dili", + "language-th": "Tay dili", + "language-tk": "Türkmən dili", "language-tr": "Türkcə", "language-uk": "Ukrayna dili", "language-ur": "Urdu dili", diff --git a/src/intl/az/page-layer-2.json b/src/intl/az/page-layer-2.json index e396bb34ebc..7d8f3abbf7e 100644 --- a/src/intl/az/page-layer-2.json +++ b/src/intl/az/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "zkSync, Matter Labs-dan istifadəçi mərkəzli zk toplama platformasıdır. Bu, artıq Ethereum şəbəkəsində yaşayan Ethereum üçün bir miqyaslandırma həlldir. Ödənişləri, token dəyişdirmələrini və NFT zərbini dəstəkləyir.", "zkspace-description": "ZKSpace platforması üç əsas hissədən ibarətdir: ZKSwap adlı ZK-Rollups texnologiyasından istifadə edən 2 AMM DEX qat, ZKSquare adlı ödəniş xidməti və ZKSea adlı NFT bazarı.", "aztec-description": "Aztec Network Ethereum-da mərkəzləşdirilməmiş tətbiqlərə məxfilik və miqyas əldə etməyə imkan verən ilk şəxsi zk-toplamadır.", + "starknet-description": "Starknet, bir lay 2 Validity Rollup'dır. O, yüksək ötürmə qabiliyyətini, aşağı qaz xərclərini təmin edir və Ethereum lay 1 təhlükəsizlik səviyyələrini saxlayır.", "layer-2-note": "Qeydlər:", "layer-2-ecosystem-portal": "Ekosistem Portalı", "layer-2-token-lists": "Token siyahıları", diff --git a/src/intl/az/page-stablecoins.json b/src/intl/az/page-stablecoins.json index 3ee1a15d388..e991aa20e29 100644 --- a/src/intl/az/page-stablecoins.json +++ b/src/intl/az/page-stablecoins.json @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "Fiat", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "Qiymətli metallar", "page-stablecoins-table-error": "Stabilkoinləri yükləmək mümkün olmadı. Səhifəni yeniləməyə çalışın.", + "page-stablecoins-table-loading": "Stabilkoin datası yüklənir...", "page-stablecoins-title": "Stabilkoinlər", "page-stablecoins-top-coins": "Bazar kapitallaşmasına görə ən yaxşı stabilkoinlər", "page-stablecoins-top-coins-intro": "Bazar kapitallaşması:", diff --git a/src/intl/cs/common.json b/src/intl/cs/common.json index fa8d201e2ea..05c7449a8d0 100644 --- a/src/intl/cs/common.json +++ b/src/intl/cs/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Abstrakce účtu", "about-ethereum-org": "O ethereum.org", "about-us": "O nás", + "adding-desci-projects": "Přidávání projektů Desci", + "adding-developer-tools": "Přidávání vývojářských nástrojů", + "adding-exchanges": "Přidávání směnáren", + "adding-glossary-terms": "Přidávání termínů do slovníku pojmů", + "adding-layer-2s": "Adding Layer 2s", + "adding-products": "Adding Products", + "adding-staking-products": "Přidávání produktů pro staking", + "adding-wallets": "Přidávání peněženek", + "account-abstraction": "Abstrakce účtu", + "acknowledgements": "Poděkování", "aria-toggle-search-button": "Zobrazit hledání", "aria-toggle-menu-button": "Zobrazit menu", "beacon-chain": "Řetězová vazba", @@ -12,6 +21,8 @@ "community-hub": "Komunitní centrum", "community-menu": "Menu Komunita", "contact": "Kontakt", + "content-buckets": "Kategorie", + "content-resources": "Zdroje", "content-standardization": "Standardizace obsahu", "contributing": "Příspěvky", "contributors": "Přispěvatelé", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Decentralizované sociální sítě", "decentralized-science": "„Decentralizovaná věda“", "defi-page": "Decentralizované finance (DeFi)", + "design": "Design", + "design-principles": "Principy designu", "devcon": "Devcon", "developers": "Vývojáři", "developers-home": "Domovská stránka pro vývojáře", @@ -94,11 +107,11 @@ "grants": "Granty", "grant-programs": "Grantové programy pro ekosystém", "guides": "Příručky", - "guides-hub": "Výukový hub", + "guides-hub": "Návody", "history-of-ethereum": "Historie Etherea", "home": "Domů", "how-ethereum-works": "Jak funguje Ethereum", - "how-to-register-an-ethereum-account": "Jak „zaregistrovat“ účet Ethereum", + "how-to-create-an-ethereum-account": "Jak si \"vytvořit\" Ethereum účet", "how-to-revoke-token-access": "Jak zrušit chytrý přístup k Vašim krypto fondům", "how-to-swap-tokens": "Jak prohodit tokeny", "how-to-use-a-bridge": "Jak propojit tokeny do 2. vrstvy", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Nelze načíst data. Zkuste to znovu později.", "logo": "Logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Sloučení", "more": "Více", "nav-developers": "Vývojáři", "nav-developers-docs": "Dokumentace pro vývojáře", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Hledat!", "search-eth-address": "Vypadá to jako Ethereum adresa. Neposkytujeme údaje specifické pro adresy. Zkuste je vyhledat na průzkumníku bloků", "search-no-results": "Nenalezeny žádné výsledky", + "security": "Bezpečnost", "single-slot-finality": "Konečnost jednoho slotu", "statelessness": "Bezstavovost", "see-contributors": "Zobrazit přispěvatele", @@ -181,6 +196,7 @@ "start-here": "Začněte zde", "style-guide": "Style guide", "solo": "Samostatné uzamčení", + "support": "Podpora", "terms-of-use": "Podmínky použití", "translation-banner-body-new": "Tato stránka je zobrazena v angličtině, protože jsme ji zatím nepřeložili. Pomozte nám přeložit tento obsah.", "translation-banner-body-update": "K dispozici je nová verze této stránky, ale v současné době je pouze v angličtině. Pomozte nám přeložit nejnovější verzi.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Nejsou tu žádné chyby!", "translation-banner-no-bugs-content": "Tato stránka není přeložena. Záměrně jsme ji zatím ponechali v angličtině.", "translation-banner-no-bugs-dont-show-again": "Znovu nezobrazovat", + "translation-program": "Překladatelský program", "try-using-search": "Zkuste použít vyhledávání k nalezení toho, co hledáte, nebo", "tutorials": "Návody", "up": "Nahoru", diff --git a/src/intl/cs/page-get-eth.json b/src/intl/cs/page-get-eth.json index 10324955585..72fdab65c4b 100644 --- a/src/intl/cs/page-get-eth.json +++ b/src/intl/cs/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Burzy jsou podniky, které vám umožňují koupit si krypto za tradiční měny. Spravují vámi zakoupené ETH, dokud si ho nepošlete do vlastní peněženky.", "page-get-eth-checkout-dapps-btn": "Podívejte se na dappky", "page-get-eth-community-safety": "Komunitní příspěvky o bezpečnosti", - "page-get-eth-description": "Ethereum a ETH nereguluje žádná vládou ani společnost, jsou decentralizované. Znamená to, že ETH může používat naprosto kdokoliv.", + "page-get-eth-description": "Ethereum není řízeno žádnou organizací – je decentralizované.", "page-get-eth-dex": "Decentralizované burzy (DEX)", - "page-get-eth-dex-desc": "Pokud chcete větší kontrolu, nakupte ETH v režimu peer-to-peer. Na burzách DEX můžete obchodovat, aniž byste dávali své prostředky centralizované společnosti.", + "page-get-eth-dex-desc": "Pokud chcete větší kontrolu, kupte si ETH pomocí chytrých kontraktů. Na platformě DEX můžete obchodovat s digitálními aktivy, aniž byste předávali kontrolu nad svými prostředky centralizované společnosti.", + "page-get-eth-peers": "Získávejte ETH od jiných uživatelů", + "page-get-eth-peers-desc": "Jakmile budete mít účet Ethereum, jediným dalším krokem, abyste mohli začít posílat a přijímat ETH (a další tokeny) formou peer-to-peer, je sdílet vaši adresu.", + "page-get-eth-staking": "Vložení odměn", + "page-get-eth-staking-desc": "Pokud již nějaké ETH máte, můžete si vydělat další spuštěním validátorového síťového uzlu. Za to dostáváte zaplaceno v ETH.", + "page-get-eth-earn": "Vydělejte si ETH", + "page-get-eth-earn-desc": "ETH si můžete vydělat prací pro organizace DAO nebo společnosti, které platí kryptoměnami, vyhráváním odměn, hledáním softwarových chyb a další aktivitou.", + "page-get-eth-daos-link-desc": "Více o organizacích DAO", + "page-get-eth-cex-link-desc": "Seznam burz", + "page-get-eth-staking-link-desc": "Více o stakingu", "page-get-eth-dexs": "Decentralizované burzy (DEX)", "page-get-eth-dexs-desc": "Decentralizované burzy jsou otevřené trhy pro ETH a ostatní tokeny. Kupujícího a prodávajícího mezi sebou propojují napřímo.", "page-get-eth-dexs-desc-2": "Místo používání důvěryhodné třetí strany k ochraně peněžních prostředků používají kód. ETH prodejce bude převedeno pouze v případě, že je platba zaručena. Tento typ kódu je znám jako chytrý kontrakt.", - "page-get-eth-dexs-desc-3": "Toto znamená, že geografická omezení jsou menší než u centralizovaných alternativ. Pokud někdo prodává, co chcete a přijímá platební metodu, kterou jste schopni poskytnout, jste na dobré cestě. Burzy DEX vám umožní koupit ETH s ostatními tokeny, PayPalem nebo dokonce osobními dodávkami hotovosti.", + "page-get-eth-dexs-desc-3": "To znamená, že jsou méně geograficky omezeny než centralizované alternativy. Pokud někdo prodává to, co chcete, a přijímá platební metodu, kterou můžete poskytnout, obchod se může uskutečnit okamžitě.", "page-get-eth-do-not-copy": "Příklad: Nekopírovat", "page-get-eth-exchanges-disclaimer": "Tyto informace jsme shromáždili vlastními silami. Pokud si všimnete, že je zde něco špatně, dejte nám vědět na", - "page-get-eth-exchanges-empty-state-text": "Zadejte zemi vašeho trvalého pobytu a zobrazí se vám seznam peněženek a výměn, které můžete použít k nákupu ETH.", + "page-get-eth-exchanges-empty-state-text": "Zadejte zemi svého pobytu a zobrazí se seznam burz, které můžete použít", "page-get-eth-exchanges-except": "Mimo", "page-get-eth-exchanges-header": "V jaké zemi žijete?", "page-get-eth-exchanges-header-exchanges": "Burzy", "page-get-eth-exchanges-header-wallets": "Kryptoměnové peněženky", - "page-get-eth-exchanges-intro": "Burzy a peněženky mohou obchodovat s kryptoměnami pouze v některých částech světa.", + "page-get-eth-exchanges-intro": "Burzy jsou omezené v tom, kde mohou prodávat kryptoměny. Toto je orientační seznam služeb, o kterých se předpokládá, že fungují v každé zemi. To, že je zde burza zahrnuta v seznamu, neznamená, že ji podporujeme – vždy si udělejte vlastní průzkum!", "page-get-eth-exchanges-no-exchanges": "Omlouváme se, ale nevíme o žádné burze umožňující nakupovat ETH z této země. Pokud takovou znáte, dejte nám vědět na", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Omlouváme se, ale nevíme o žádné burze ani peněžence umožňující nakupovat ETH z této země. Pokud takové znáte, dejte nám vědět na", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Omlouváme se, ale nevíme o žádné burze umožňující nakupovat ETH z této země. Pokud takovou znáte, dejte nám vědět na", "page-get-eth-exchanges-no-wallets": "Omlouváme se, ale nevíme o žádné peněžence umožňující nakupovat ETH z této země. Pokud takovou znáte, dejte nám vědět na", "page-get-eth-exchanges-search": "Zadejte místo, kde žijete...", "page-get-eth-exchanges-success-exchange": "Registrace v rámci výměny může trvat několik dní, vzhledem k jejich právním kontrolám.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Získat úvodní ETH obrázek", "page-get-eth-keep-it-safe": "Udržujte své ETH v bezpečí", "page-get-eth-meta-description": "Jak nakupovat ETH podle toho, kde žijete, a rady, jak se o něj postarat.", - "page-get-eth-meta-title": "Nakupování ETH", + "page-get-eth-meta-title": "Jak získat ETH", "page-get-eth-need-wallet": "K využívání burz DEX potřebujete peněženku.", "page-get-eth-new-to-eth": "Teprve se s ETH seznamujete? Zde je přehled, jak začít.", "page-get-eth-other-cryptos": "Koupit pomocí jiné kryptoměny", - "page-get-eth-protect-eth-desc": "Pokud plánujete kupovat velké množství ETH, možná jej budete chtít uschovat v peněžence, nikoli ve výměně. To proto, že výměna je pravděpodobným cílem pro hackery. Pokud hacker získá přístup, můžete ztratit vaše prostředky. Jinak řečeno, pouze vy ovládáte svou peněženku.", - "page-get-eth-protect-eth-in-wallet": "Chraňte Vaše ETH v peněžence", + "page-get-eth-protect-eth-desc": "Jedním z hlavních rysů Etherea je, že kontrolu nad svými aktivy si udržujete sami pomocí správy svého účtu. To znamená, že nemusíte důvěřovat žádné třetí straně a jste chráněni před případným nečestným jednáním správce, krachem centralizované společnosti nebo jejím napadením. Znamená to však také, že přebíráte odpovědnost za svou vlastní bezpečnost.", + "page-get-eth-protect-eth-in-wallet": "Nechte ETH ve své peněžence", "page-get-eth-search-by-country": "Hledat podle státu", - "page-get-eth-security": "To ale také znamená, že je třeba brát bezpečnost vašich prostředků vážně. Ve světě ETH nesvěřujete své peníze bance, která by se vám o ně postarala. Zde se spoléháte pouze sami na sebe.", + "page-get-eth-security": "To znamená, že bezpečnost svých prostředků musíte brát vážně. S ETH nedůvěřujete bance nebo společnosti, že se o vaše aktiva postará, ale sami přebíráte odpovědnost.", "page-get-eth-smart-contract-link": "Více o chytrých kontraktech", "page-get-eth-swapping": "Směňte své tokeny za cizí ETH nebo naopak.", "page-get-eth-try-dex": "Vyzkoušejte DEX", "page-get-eth-use-your-eth": "Používejte své ETH", "page-get-eth-use-your-eth-dapps": "Teď, když vlastníte ETH, omrkněte aplikace Ethereum (dappky). Máme dappky pro finance, sociální média, hry a mnoho dalších kategorií.", "page-get-eth-wallet-instructions": "Postupujte podle pokynů uvedených v peněžence", - "page-get-eth-wallet-instructions-lost": "Přijdete-li o přístup k peněžence, ztratíte zároveň přístup k prostředkům. Peněženka by vám měla poskytnout rady, jak takovému případu předejít. Nezapomeňte si tedy pokyny pečlivě prostudovat. Ve většině případů vám totiž se ztraceným přístupem k peněžence nikdo nepomůže.", + "page-get-eth-wallet-instructions-lost": "Pokud ztratíte přístup ke svému účtu, ztratíte přístup ke svým prostředkům. Vaše peněženka by vám měla poskytnout informace o tom, jak se proti takové situaci chránit. Pečlivě ho dodržujte – pokud ztratíte přístup ke svému účtu, ve většině případů vám nikdo nebude schopen pomoci.", "page-get-eth-wallets": "Kryptoměnové peněženky", "page-get-eth-wallets-link": "Více o peněženkách", "page-get-eth-wallets-purchasing": "Některé peněženky umožňují nákup kryptoměn prostřednictvím debetní nebo kreditní karty, bankovního převodu nebo dokonce přes Apple Pay. Na tento nákup se vztahují zeměpisná omezení.", - "page-get-eth-warning": "Burzy DEX nejsou pro začátečníky, potřebujete totiž ETH, abyste je mohli využívat.", + "page-get-eth-warning": "Tyto platformy DEX nejsou pro začátečníky, protože k jejich použití budete potřebovat nějaké ETH. Toto jsou pouze příklady burz, nikoli podporované produkty. Vždy si udělejte vlastní průzkum!", "page-get-eth-what-are-DEX's": "Co jsou burzy DEX?", "page-get-eth-whats-eth-link": "Co je to ETH?", - "page-get-eth-where-to-buy-desc": "ETH si můžete koupit na burzách nebo přímo v peněženkách.", + "page-get-eth-where-to-buy-desc": "Můžete si ETH vydělat, přijímat ho od svých peers nebo kupovat pomocí burz a aplikací.", "page-get-eth-where-to-buy-desc-2": "Zkontrolujte, které služby můžete používat podle toho, kde žijete.", - "page-get-eth-where-to-buy-title": "Kde koupit ETH", + "page-get-eth-where-to-buy-title": "Kde získat ETH", "page-get-eth-your-address": "Vaše ETH adresa", "page-get-eth-your-address-desc": "Když si stáhnete peněženku, vytvoří pro vás veřejnou ETH adresu. Zde je, jak vypadá:", "page-get-eth-your-address-desc-3": "Je to něco jako vaše e-mailová adresa, ale místo e-mailu můžete dostávat ETH. Pokud chcete přenést ETH z výměny do peněženky, použijte vaši adresu jako místo určení. Před odesláním vše radši dvakrát zkontrolujete!", diff --git a/src/intl/cs/page-wallets-find-wallet.json b/src/intl/cs/page-wallets-find-wallet.json index 15de53c4c91..1e96007df04 100644 --- a/src/intl/cs/page-wallets-find-wallet.json +++ b/src/intl/cs/page-wallets-find-wallet.json @@ -54,7 +54,7 @@ "page-find-wallet-info-updated-on": "informace aktualizovány", "page-find-wallet-showing-all-wallets": "Zobrazení všech peněženek", "page-find-wallet-showing": "Zobrazeno ", - "page-find-wallet-wallets": "peněženkách.", + "page-find-wallet-wallets": "peněženky", "page-find-wallet-iOS": "iOS", "page-find-wallet-android": "Android", "page-find-wallet-linux": "Linux", @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "Filtry funkcí", "page-find-wallet-footnote-1": "Peněženky uvedené na této stránce nejsou oficiálním doporučením a jsou poskytovány pouze pro informační účely.", "page-find-wallet-footnote-2": "Jejich popisy byly poskytnuty samotnými tvůrci peněženek.", - "page-find-wallet-footnote-3": "Na tuto stránku přidáváme produkty na základě kritérií v našich pravidlech. Pokud byste chtěli přidat peněženku, navrhněte podnět na GitHubu.", + "page-find-wallet-footnote-3": "Na tuto stránku přidáváme produkty na základě kritérií v našich zásadách pro přidávání. Pokud byste chtěli přidat peněženku, navrhněte podnět na GitHubu.", "page-find-wallet-mobile": "Mobilní", "page-find-wallet-mobile-desc": "Peněženky s mobilními aplikacemi", "page-find-wallet-desktop": "Desktopová", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Peněženky s rozšířeními prohlížeče", "page-find-wallet-device": "Zařízení", "page-find-choose-to-compare": "Zvolte pro porovnání", - "page-find-wallet-choose-features": "Vyberte funkce" + "page-find-wallet-choose-features": "Vyberte funkce", + "page-find-wallet-reset-filters": "Resetovat filtry" } diff --git a/src/intl/el/page-staking-deposit-contract.json b/src/intl/el/page-staking-deposit-contract.json index cfa15206b1e..34571ff3316 100644 --- a/src/intl/el/page-staking-deposit-contract.json +++ b/src/intl/el/page-staking-deposit-contract.json @@ -1,28 +1,28 @@ { - "page-staking-deposit-contract-address": "Διεύθυνση κατάθεσης κεφαλαίου Eth2", + "page-staking-deposit-contract-address": "Διεύθυνση κατάθεσης κεφαλαίου για αποθήκευση", "page-staking-deposit-contract-address-caption": "Προσθέσαμε κενά για να διευκολύνουμε την ανάγνωση της διεύθυνσης", "page-staking-deposit-contract-address-check-btn": "Έλεγχος της διεύθυνσης κατάθεσης του κεφαλαίου", - "page-staking-deposit-contract-checkbox1": "Έχω ήδη χρησιμοποιήσει την πλατφόρμα εκκίνησης για τη ρύθμιση του Eth2 επικυρωτή μου.", - "page-staking-deposit-contract-checkbox2": "Καταλαβαίνω ότι πρέπει να χρησιμοποιήσω την πλατφόρμα εκκίνησης για την αποθήκευση (stake). Απλές συναλλαγές σε αυτή τη διεύθυνση δεν λειτουργούν.", + "page-staking-deposit-contract-checkbox1": "Έχω χρησιμοποιήσει ήδη την πλατφόρμα εκκίνησης για τη ρύθμιση του Ethereum επικυρωτή μου.", + "page-staking-deposit-contract-checkbox2": "Καταλαβαίνω ότι πρέπει να χρησιμοποιήσω την πλατφόρμα εκκίνησης για την αποθήκευση. Απλές συναλλαγές σε αυτή τη διεύθυνση δε λειτουργούν.", "page-staking-deposit-contract-checkbox3": "Θα ελέγξω τη διεύθυνση κατάθεσης κεφαλαίου με άλλες πηγές.", "page-staking-deposit-contract-confirm-address": "Επιβεβαίωση αποκάλυψης της διεύθυνσης", "page-staking-deposit-contract-copied": "Η διεύθυνση αντιγράφηκε", "page-staking-deposit-contract-copy": "Αντιγραφή διεύθυνσης", - "page-staking-deposit-contract-etherscan": "Προβολή σύμβασης στην Etherscan", - "page-staking-deposit-contract-h2": "Εδώ δεν κάνετε stake", - "page-staking-deposit-contract-launchpad": "Πλατφόρμα έναρξης Stake", + "page-staking-deposit-contract-etherscan": "Προβολή συμβολαίου στο Etherscan", + "page-staking-deposit-contract-h2": "Δεν κάνετε εδώ αποθήκευση κεφαλαίου", + "page-staking-deposit-contract-launchpad": "Αποθήκευση κεφαλαίου με χρήση της πλατφόρμας εκκίνησης", "page-staking-deposit-contract-launchpad-2": "Χρήση της πλατφόρμας εκκίνησης", - "page-staking-deposit-contract-meta-desc": "Επαληθεύστε τη διεύθυνση κατάθεσης για το staking σε Eth2.", - "page-staking-deposit-contract-meta-title": "Διεύθυνση κατάθεσης κεφαλαίου Eth2", - "page-staking-deposit-contract-read-aloud": "Ανάγνωση δυνατά της διεύθυνσης", + "page-staking-deposit-contract-meta-desc": "Επαληθεύστε τη διεύθυνση κατάθεσης του συμβολαίου για αποθήκευση Ethereum.", + "page-staking-deposit-contract-meta-title": "Διεύθυνση κατάθεσης κεφαλαίου για αποθήκευση Ethereum", + "page-staking-deposit-contract-read-aloud": "Διαβάστε δυνατά τη διεύθυνση", "page-staking-deposit-contract-reveal-address-btn": "Αποκάλυψη της διεύθυνσης", - "page-staking-deposit-contract-staking": " Για να κάνετε stake τα ETH σας σε Eth2 θα πρέπει να χρησιμοποιήσετε την πλατφόρμα εκκίνησης ακολουθώντας τις οδηγίες. Η αποστολή ETH σε αυτή τη διεύθυνση δεν σας καθιστά staker και θα οδηγήσει σε μια αποτυχημένη συναλλαγή.", + "page-staking-deposit-contract-staking": "Για να αποθηκεύσετε τα ETH σας θα πρέπει να χρησιμοποιήσετε την πλατφόρμα εκκίνησης ακολουθώντας τις οδηγίες. Η αποστολή ETH στη διεύθυνση σε αυτή τη σελίδα δε σας καθιστά ως συμμετέχων και θα οδηγήσει σε μια αποτυχημένη συναλλαγή.", "page-staking-deposit-contract-staking-check": "Ελέγξτε αυτές τις πηγές", - "page-staking-deposit-contract-staking-check-desc": "Αναμένουμε να υπάρχουν πολλές ψεύτικες διευθύνσεις και κακόβουλες ενέργειες. Για να είστε ασφαλείς, ελέγξτε τη διεύθυνση staking Eth2 που χρησιμοποιείτε με τη διεύθυνση σε αυτή τη σελίδα. Σας συνιστούμε να την ελέγξετε και με άλλες αξιόπιστες πηγές.", - "page-staking-deposit-contract-staking-more-link": "Περισσότερα για το staking", + "page-staking-deposit-contract-staking-check-desc": "Αναμένουμε να υπάρχουν πολλές ψεύτικες διευθύνσεις και κακόβουλες ενέργειες. Για να είστε ασφαλείς, ελέγξτε τη διεύθυνση αποθήκευσης που χρησιμοποιείτε, με τη διεύθυνση σε αυτή τη σελίδα. Σας συνιστούμε να την ελέγξετε και με άλλες αξιόπιστες πηγές.", + "page-staking-deposit-contract-staking-more-link": "Περισσότερα για την αποθήκευση κεφαλαίου", "page-staking-deposit-contract-stop-reading": "Διακοπή ανάγνωσης", - "page-staking-deposit-contract-subtitle": " Αυτή είναι η διεύθυνση της σύμβασης staking Eth2. Χρησιμοποιήστε αυτή τη σελίδα για να επιβεβαιώσετε ότι στέλνετε κεφάλαια στη σωστή διεύθυνση όταν κάνετε stake.", + "page-staking-deposit-contract-subtitle": "Αυτή είναι η διεύθυνση του συμβολαίου αποθήκευσης Ethereum. Χρησιμοποιήστε αυτή τη σελίδα για να επιβεβαιώσετε ότι στέλνετε κεφάλαια στη σωστή διεύθυνση όταν κάνετε αποθήκευση.", "page-staking-deposit-contract-warning": "Ελέγξτε προσεκτικά κάθε χαρακτήρα.", - "page-staking-deposit-contract-warning-2": "Η αποστολή κεφαλαίων σε αυτή τη διεύθυνση δεν θα λειτουργήσει και δεν θα σας κάνει staker. Πρέπει να ακολουθήσετε τις οδηγίες στην πλατφόρμα εκκίνησης.", + "page-staking-deposit-contract-warning-2": "Η αποστολή κεφαλαίων σε αυτή τη διεύθυνση δε θα λειτουργήσει και δε θα σας καταχωρήσει ως συμμετέχων. Πρέπει να ακολουθήσετε τις οδηγίες στην πλατφόρμα εκκίνησης.", "page-staking-deposit-contract-title": "Ελέγξτε τη διεύθυνση κατάθεσης του κεφαλαίου" } diff --git a/src/intl/el/page-staking.json b/src/intl/el/page-staking.json index de2411552b0..981d12651fd 100644 --- a/src/intl/el/page-staking.json +++ b/src/intl/el/page-staking.json @@ -1,9 +1,237 @@ { - "page-staking-image-alt": "Εικόνα της μασκότ Rhino για την eth2 πλατφόρμα.", - "page-staking-description": "Η αποθήκευση ή staking, είναι η πράξη της κατάθεσης 32 ETH για να μπορεί να τεθεί σε λειτουργία το λογισμικό επικύρωσης. Ως επαληθευτής θα είστε υπεύθυνος για την αποθήκευση δεδομένων, την επεξεργασία συναλλαγών και την προσθήκη νέων μπλοκ στην κεντρική αλυσίδα. Έτσι θα παραμείνει το Ethereum ασφαλές για όλους και εσείς κερδίσετε νέα ETH από τη διαδικασία. Αυτή η διαδικασία, γνωστή και ως απόδειξη συμμετοχής, εισάγεται από την Κεντρική Αλυσίδα.", - "page-staking-join-community": "Συνδεθείτε με την κοινότητα αποθήκευσης", - "page-staking-join-community-desc": "Η κοινότητα r/ethstaker είναι για όσους επιθυμούν να συζητήσουν για την αποθήκευση στο Ethereum - να συμμετέχουν για να λάβουν συμβουλές, υποστήριξη και να μιλήσουν σχετικά με το θέμα.", + "comp-withdrawal-comparison-current-title": "Τρέχων χρήστες", + "comp-withdrawal-comparison-current-li-1": "Μερικοί χρήστες μπορεί να έχουν δηλώσει διεύθυνση ανάληψης κατά την αρχική δημιουργία αποθήκευσης του κεφαλαίου τους. Αυτοί οι χρήστες δε χρειάζεται να κάνουν τίποτα περισσότερο", + "comp-withdrawal-comparison-current-li-2": "Η πλειοψηφία των συμμετεχόντων στο δίκτυο δεν παρείχαν μια διεύθυνση ανάληψης κατά την αρχική κατάθεση και θα χρειαστεί να ενημερώσουν τα στοιχεία τους παρέχοντας μια διεύθυνση ανάληψης την οποία ελέγχουν. Το ακόλουθο site παρέχει οδηγίες για το πως γίνεται αυτό ", + "comp-withdrawal-comparison-current-p": "Μπορείτε να προσθέσετε τον αναγνωριστικό αριθμό του επικυρωτή σας εδώ, για να διαπιστώσετε αν χρειάζεται να ενημερώσετε τα στοιχεία σας (μπορούν να βρεθούν στα αρχεία καταγραφής του λογισμικού πελάτη σας):", + "comp-withdrawal-comparison-new-title": "Νέοι χρήστες στην αποθήκευση (δεν έχει γίνει ακόμα κατάθεση)", + "comp-withdrawal-comparison-new-li-1": "Από προεπιλογή, οι νέοι χρήστες αποθήκευσης κεφαλαίου που θέλουν να ενεργοποιήσουν τις αυτόματες πληρωμές ανταμοιβών και τη λειτουργία ανάληψης, θα πρέπει να παρέχουν μια διεύθυνση ανάληψης Ethereum που ελέγχουν κατά τη δημιουργία των κλειδιών επικύρωσής τους χρησιμοποιώντας το εργαλείο Staking Deposit CLI", + "comp-withdrawal-comparison-new-li-2": "Δεν απαιτείται κατά τη διαδικασία κατάθεσης αλλά αν το κάνετε στο μέλλον δεν θα ανανεώσετε τα κλειδιά για ξεκλείδωμα του κεφαλαίου σας.", + "comp-withdrawal-comparison-new-p": "Η πλατφόρμα εκκίνησης αποθήκευσης κεφαλαίου θα σας καθοδηγήσει στη διαδικασία της αποθήκευσης κεφαλαίου.", + "comp-withdrawal-comparison-new-link": "Μετάβαση στην Πλατφόρμα Αποθήκευσης Κεφαλαίου", + "comp-withdrawal-credentials-placeholder": "Ευρετήριο επικυρωτή", + "comp-withdrawal-credentials-error": "Ελέγξτε ξανά τον αριθμό ευρετηρίου του επικυρωτή και προσπαθήστε ξανά.", + "comp-withdrawal-credentials-upgraded-1": "Το ευρετήριο επικυρωτή {{validatorIndex}} είναι έτοιμο να αρχίσει να λαμβάνει επιβραβεύσεις!", + "comp-withdrawal-credentials-upgraded-2": "Διαπιστευτήρια ανάληψης που συνδέονται με τη διεύθυνση εκτέλεσης:", + "comp-withdrawal-credentials-not-upgraded-1": "Ο επικυρωτής χρειάζεται αναβάθμιση.", + "comp-withdrawal-credentials-not-upgraded-1-testnet": "Ο επικυρωτής του δικτύου δοκιμών Goerli χρειάζεται αναβάθμιση.", + "comp-withdrawal-credentials-not-upgraded-2": "Οδηγίες σχετικά με τον τρόπο αναβάθμισης μπορείτε να βρείτε στην Πλατφόρμα έναρξης αποθήκευσης κεφαλαίου", + "comp-withdrawal-credentials-verify-mainnet": "Επαλήθευση στο Κεντρικό δίκτυο", + "comp-withdrawal-credentials-verify-goerli": "Επαλήθευση στο Goerli", + "page-staking-withdrawals-when": "Δημοσιεύθηκε!", + "page-staking-image-alt": "Εικόνα της μασκότ Rhino για την πλατφόρμα αποθήκευσης.", + "page-staking-benefits-1-title": "Κερδίστε ανταμοιβές", + "page-staking-benefits-1-description": "Οι ανταμοιβές δίνονται για ενέργειες που βοηθούν το δίκτυο να επιτύχει τη συναίνεση. Θα λάβετε ανταμοιβές εκτελώντας λογισμικό που ομαδοποιεί σωστά τις συναλλαγές σε ένα νέο μπλοκ και ελέγχει τις εργασίες άλλων επικυρωτών, επειδή αυτό είναι που κρατά την κρυπτοαλυσίδα να λειτουργεί με ασφάλεια.", + "page-staking-benefits-2-title": "Καλύτερη ασφάλεια", + "page-staking-benefits-2-description": "Το δίκτυο γίνεται ποιο δυνατό ενάντια σε επιθέσεις, καθώς χρειάζονται όλο και περισσότερα ETH για τον έλεγχο της πλειοψηφίας του δικτύου. Για να απειληθεί το δίκτυο θα χρειαζόταν να ελέγχετε την πλειοψηφία των κόμβων, το οποίο σημαίνει ότι θα ελέγχατε την πλειοψηφία των EΤΗ στο σύστημα και είναι πολλά!", + "page-staking-benefits-3-title": "Πιο βιώσιμο", + "page-staking-benefits-3-description": "Οι χρήστες με αποθηκευμένο κεφάλαιο δε χρειάζονται τη χρήση της απόδειξης εργασίας όπου απαιτεί μεγάλη κατανάλωση ενέργειάς για την ασφάλειά του δικτύου, που σημαίνει ότι οι κόμβοι μπορούν να εκτελεστούν σε σχετικά απλά μηχανήματά.", + "page-staking-benefits-3-link": "Περισσότερα για την κατανάλωση ενέργειας στο Ethereum", + "page-staking-description": "Η αποθήκευση κεφαλαίου αφορά την κατάθεση 32 ETH με σκοπό την ενεργοποίηση του κόμβου. Ως επικυρωτής θα είστε υπεύθυνοι για την αποθήκευση των δεδομένων, την επεξεργασία των συναλλαγών και την προσθήκη μπλοκ στην κρυπτοαλυσίδα. Αυτό θα διατηρήσει το Ethereum ασφαλές για όλους και θα αποδώσει νέα ETH.", + "page-staking-hero-title": "Πώς να αποθηκεύσετε τα ETH σας", + "page-staking-hero-header": "Λάβετε ανταμοιβές ενώ βοηθάτε στην ασφάλεια του Ethereum", + "page-staking-hero-subtitle": "Η αποθήκευση ευνοεί το οικοσύστημα του Ethereum. Όλοι οι χρήστες με οποιαδήποτε ποσότητα ΕΤΗ μπορεί να βοηθήσει στην ασφάλεια του δικτύου και να κερδίσει ανταμοιβή από τη διαδικασία.", + "page-staking-dropdown-home": "Αρχική σελίδα αποθήκευσης", + "page-staking-dropdown-solo": "Ατομική αποθήκευση κεφαλαίου", + "page-staking-more-on-solo": "Περισσότερα για την ατομική αποθήκευση", + "page-staking-learn-more-solo": "Μάθετε περισσότερα για την ατομική αποθήκευση", + "page-staking-dropdown-saas": "Η αποθήκευση κεφαλαίου ως υπηρεσία", + "page-staking-saas-with-abbrev": "Η αποθήκευση ως υπηρεσία (SaaS)", + "page-staking-more-on-saas": "Περισσότερα για την αποθήκευση ως υπηρεσία", + "page-staking-learn-more-saas": "Μάθετε περισσότερα για την αποθήκευση ως υπηρεσία", + "page-staking-dropdown-pools": "Αποθήκευση κεφαλαίου σε δεξαμενή", + "page-staking-dropdown-withdrawals": "Σχετικά με αναλήψεις", + "page-staking-dropdown-dvt": "Κατανεμημένη τεχνολογία επικύρωσης", + "page-staking-more-on-pools": "Περισσότερα για την αποθήκευση σε δεξαμενή", + "page-staking-learn-more-pools": "Μάθετε περισσότερα για την αποθήκευση σε δεξαμενή", + "page-staking-section-what-title": "Τι είναι η αποθήκευση;", + "page-staking-section-what-link": "Μάθετε πώς να αποκτήσετε ETH", + "page-staking-section-why-title": "Γιατί να αποθηκεύσετε τα ΕΤΗ σας;", + "page-staking-section-why-p1": "Όλα εξαρτώνται από την ποσότητα που είστε πρόθυμοι να αποθηκεύσετε. Θα χρειαστείτε 32 ETH για να ενεργοποιήσετε τον δικό σας επικυρωτή, αλλά είναι δυνατόν να συμμετέχετε και με λιγότερα.", + "page-staking-section-why-p2": "Ελέγξτε τις παρακάτω επιλογές για αποφασίστε για αυτήν που είναι καλύτερη για εσάς και για το δίκτυο.", + "page-staking-guide-title-coincashew-ethereum": "Οδηγός CoinCashew's Ethereum 2.0", + "page-staking-guide-title-somer-esat": "Somer Esat", + "page-staking-guide-title-rocket-pool": "Χειριστές κόμβου Rocket Pool", + "page-staking-guide-description-linux": "Linux (CLI)", + "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", + "page-staking-hierarchy-solo-h2": "Ατομική αποθήκευση κεφαλαίου στο σπίτι", + "page-staking-hierarchy-solo-pill-1": "Μεγαλύτερη επίπτωση", + "page-staking-hierarchy-solo-pill-2": "Πλήρης έλεγχος", + "page-staking-hierarchy-solo-pill-3": "Πλήρεις ανταμοιβές", + "page-staking-hierarchy-solo-pill-4": "Εμπιστοσύνη", + "page-staking-hierarchy-solo-p1": "Η ατομική αποθήκευση στο Ethereum είναι το χρυσό πρότυπο για την αποθήκευση. Παρέχει πλήρεις ανταμοιβές στη συμμετοχή, βελτιώνει την αποκέντρωση του δικτύου και ποτέ δεν απαιτεί να εμπιστευτείτε τα χρήματά σας σε τρίτο.", + "page-staking-hierarchy-solo-p2": "Όσοι σκέφτονται να αποθηκεύσουν ατομικά θα πρέπει να έχουν τουλάχιστον 32 ETH και έναν υπολογιστή αποκλειστικά για αυτό τον σκοπό και συνδεδεμένο στο διαδίκτυο ~24/7. Μερική τεχνογνωσία είναι χρήσιμη, αλλά πλέον υπάρχουν εύκολα εργαλεία που βοηθούν στην απλοποίηση της διαδικασίας.", + "page-staking-hierarchy-saas-pill-1": "Τα 32 ΕΤΗ σας", + "page-staking-hierarchy-saas-pill-2": "Τα κλειδιά του επικυρωτή σας", + "page-staking-hierarchy-saas-pill-3": "Λειτουργία σε έμπιστο κόμβο", + "page-staking-hierarchy-saas-p1": "Εάν δε θέλετε ή δεν αισθάνεστε άνετα να ασχοληθείτε με το υλικό, αλλά θέλετε να αποθηκεύσετε τα 32 ETH σας, οι επιλογές αποθήκευσης ως υπηρεσία σάς επιτρέπουν να αναθέσετε το δύσκολο κομμάτι ενώ κερδίζετε ανταμοιβές από τα μπλοκ.", + "page-staking-hierarchy-saas-p2": "Αυτές οι επιλογές σας καθοδηγούν στη δημιουργία ενός συνόλου διαπιστευτηρίων επικύρωσης, τη μεταφόρτωση των κλειδιών υπογραφής σας σε αυτά και την κατάθεση των 32 ETH σας. Αυτό επιτρέπει στην υπηρεσία να επικυρώνει εκ μέρους σας.", + "page-staking-hierarchy-saas-p3": "Αυτή η μέθοδος αποθήκευσης κεφαλαίου απαιτεί ένα ορισμένο επίπεδο εμπιστοσύνης στον πάροχο. Για να περιοριστεί ο κίνδυνος, τα κλειδιά ανάληψης των ETH σας διατηρούνται συνήθως στην κατοχή σας.", + "page-staking-hierarchy-pools-pill-1": "Αποθηκεύστε οποιαδήποτε ποσότητα", + "page-staking-hierarchy-pools-pill-2": "Κερδίστε ανταμοιβές", + "page-staking-hierarchy-pools-pill-3": "Διατηρήστε το απλό", + "page-staking-hierarchy-pools-pill-4": "Δημοφιλές", + "page-staking-hierarchy-pools-p1": "Υπάρχουν τώρα αρκετές λύσεις συμμετοχής σε δεξαμενή αποθήκευσης για να βοηθήσουν τους χρήστες που δεν έχουν ή δεν αισθάνονται άνετα να αποθηκεύσουν 32 ETH.", + "page-staking-hierarchy-pools-p2": "Πολλές από αυτές τις επιλογές περιλαμβάνουν αυτό που είναι γνωστό ως «ρευστότητα αποθηκευμένου κεφαλαίου» το οποίο περιλαμβάνει ένα κρυπτονόμισμα ERC που αντιπροσωπεύει το αποθηκευμένο κεφάλαιο σε ETH.", + "page-staking-hierarchy-pools-p3": "Η ρευστότητα αποθηκευμένου κεφαλαίου παρέχει εύκολη έξοδο ανά πάσα στιγμή και κάνει την αποθήκευση κεφαλαίου τόσο απλή η μετατροπή ενός κρυπτονομίσματος. Αυτή η επιλογή επιτρέπει στους χρήστες να διατηρούν την κυριότητα των χρημάτων τους στο δικό τους Ethereum πορτοφόλι.", + "page-staking-hierarchy-pools-p4": "Η αποθήκευση κεφαλαίου σε μια δεξαμενή ρευστότητας δεν είναι εγγενής λειτουργία στο δίκτυο του Ethereum. Τρίτοι πάροχοι παρέχουν αυτές τις υπηρεσίες οι οποίες ενέχουν το δικό τους ρίσκο.", + "page-staking-hierarchy-cex-h2": "Επίσημα ανταλλακτήρια", + "page-staking-hierarchy-cex-pill-1": "Ελάχιστες επιπτώσεις", + "page-staking-hierarchy-cex-pill-2": "Αυξημένο ζήτημα εμπιστοσύνης", + "page-staking-hierarchy-cex-p1": "Πολλά κεντρικά ανταλλακτήρια παρέχουν υπηρεσίες αποθήκευσης κεφαλαίου, αν δεν αισθάνεστε άνετα να διατηρείτε ΕΤΗ στο πορτοφόλι σας. Λειτουργούν θετικά παρέχοντας επιτόκιο για τα ETH σας απαιτώντας ελάχιστη επίβλεψη και προσπάθεια.", + "page-staking-hierarchy-cex-p2": "Η αντιστάθμιση εδώ είναι ότι οι κεντρικοί πάροχοι ενοποιούν μεγάλες δεξαμενές ETH για να εκτελέσουν μεγάλους αριθμούς επικυρωτών. Αυτό μπορεί να είναι επικίνδυνο για το δίκτυο και τους χρήστες του, καθώς δημιουργεί έναν μεγάλο κεντρικό στόχο και σημείο αποτυχίας, καθιστώντας το δίκτυο πιο ευάλωτο σε επιθέσεις ή σφάλματα.", + "page-staking-hierarchy-cex-p3": "Ίσως να μην αισθάνεστε άνετα να διατηρείτε εσείς τα δικά σας κλειδιά. Οι παρακάτω επιλογές είναι εδώ για εσάς. Εξετάστε το ενδεχόμενο να ανατρέξετε στη σελίδα μας με τα πορτοφόλια, όπου μπορείτε να ξεκινήσετε να μαθαίνετε πώς να αναλαμβάνετε την πραγματική ιδιοκτησία των κεφαλαίων σας. Όταν είστε έτοιμοι, επιστρέψτε και ανεβάστε το επίπεδό σας στην αποθήκευση κεφαλαίου δοκιμάζοντας μία από τις προσφερόμενες υπηρεσίες αποθήκευσης κεφαλαίου σε δεξαμενή.", + "page-staking-hierarchy-subtext": "Όπως ίσως έχετε παρατηρήσει, υπάρχουν πολλοί τρόποι συμμετοχής στην αποθήκευση κεφαλαίου στο Ethereum. Αυτοί οι τρόποι στοχεύουν σε ένα ευρύ φάσμα χρηστών και ο καθένας είναι μοναδικός και ποικίλλει ως προς τους κινδύνους, τις ανταμοιβές και τα ζητήματα εμπιστοσύνης. Ορισμένοι είναι πιο αποκεντρωμένοι, δοκιμασμένοι και/ή επικίνδυνοι από άλλους. Παρέχουμε ορισμένες πληροφορίες για δημοφιλή έργα στον χώρο, αλλά κάντε πάντα τη δική σας έρευνα πριν στείλετε ETH οπουδήποτε.", + "page-staking-comparison-solo-saas": "Με τους παρόχους SaaS εξακολουθείτε να απαιτείται να καταθέσετε 32 ETH, αλλά δε χρειάζεται να εκτελείτε υλικό. Συνήθως διατηρείτε την πρόσβαση στα κλειδιά επικύρωσης, αλλά πρέπει επίσης να κοινοποιήσετε τα κλειδιά υπογραφής σας, ώστε ο χειριστής να μπορεί να ενεργεί εκ μέρους του επικυρωτή σας. Αυτό εισάγει ένα επίπεδο εμπιστοσύνης που δεν υπάρχει όταν εκτελείτε το δικό σας υλικό και σε αντίθεση με την προσωπική αποθήκευση κεφαλαίου στο σπίτι, το SaaS δε βοηθά τόσο πολύ στη γεωγραφική κατανομή των κόμβων. Εάν αισθάνεστε άβολα να χειρίζεστε το υλικό αλλά εξακολουθείτε να θέλετε να δεσμεύσετε 32 ETH, η χρήση ενός παρόχου SaaS μπορεί να είναι μια καλή επιλογή για εσάς.", + "page-staking-comparison-solo-pools": "Η επιλογή εκτέλεσης του δικού σας κόμβου χρειάζεται μεγαλύτερή εμπλοκή και τεχνικές γνώσεις, από τη συμμετοχή σε δεξαμενή αποθήκευσης και έχετε τον πλήρη έλεγχο ρυθμίσεων και ασφάλειας του επικυρωτή σας. Η αποθήκευση κεφαλαίου σε δεξαμενή απαιτεί πολύ λιγότερα για συμμετοχή. Οι χρήστες μπορούν να συμμετέχουν με λιγότερα ETH, δε χρειάζεται να δημιουργήσουν κλειδιά επικύρωσης και δεν απαιτείται υπολογιστικό σύστημα εκτός από μια σύνδεση στο διαδίκτυο. Τα κρυπτονομίσματα ρευστότητας δίνουν τη δυνατότητα απόσυρσης της συμμετοχής σας. Αν σας ενδιαφέρουν αυτά τα χαρακτηριστικά η συμμετοχή σε δεξαμενή αποθήκευσης είναι μια καλή επιλογή.", + "page-staking-comparison-saas-solo": "Απαιτείται να έχετε τα δικά σας κλειδιά επικύρωσης χωρίς να χρειάζεται να συμμετέχετε σε δεξαμενή αποθήκευσης, καθώς με το SaaS πρέπει να εμπιστεύεστε έναν τρίτο, ο οποίος ενδέχεται να ενεργήσει κακόβουλα ή να γίνει ο ίδιος στόχος επίθεσης ή κακής λειτουργίας. Εάν αυτές οι παραδοχές εμπιστοσύνης ή οι κίνδυνοι συμμετοχής σε κεντρική υπηρεσία σας απασχολούν, ο χρυσός κανόνας της αποθήκευσης κεφαλαίου είναι η ατομική αποθήκευση κεφαλαίου.", + "page-staking-comparison-saas-pools": "Σημαίνει ότι βασίζεστε γενικά σε κάποιον άλλον να εκτελέσει το λογισμικό πελάτη επικύρωσης, αλλά σε αντίθεση με το SaaS, η αποθήκευση σε δεξαμενή σάς επιτρέπει να συμμετέχετε με μικρότερα ποσά ETH. Αν θέλετε να αποθηκεύσετε λιγότερα από 32 ETH, εξετάστε το ενδεχόμενο συμμετοχής σε δεξαμενή.", + "page-staking-comparison-pools-solo": "Η αποθήκευση κεφαλαίου σε ομαδική δεξαμενή έχει σημαντικά χαμηλότερο όριο εισόδου σε σύγκριση με τη μεμονωμένη αποθήκευση, αλλά συνοδεύεται από πρόσθετο κίνδυνο με την ανάθεση όλων των λειτουργιών του κόμβου σε τρίτο μέρος και με επιπλέον χρέωση. Η μεμονωμένη αποθήκευση κεφαλαίου παρέχει πλήρη έλεγχο στις επιλογές που αφορούν τις ρυθμίσεις μιας διάταξης αποθήκευσης κεφαλαίου. Οι χρήστες που αποθηκεύουν κεφάλαιο δε χρειάζεται ποτέ να παραδώσουν τα κλειδιά τους σε τρίτο και απολαμβάνουν πλήρεις ανταμοιβές χωρίς μεσάζων.", + "page-staking-comparison-pools-saas": "Είναι παρόμοιο με τους χρήστες που δεν εκτελούν οι ίδιοι το λογισμικό επικύρωσης, σε αντίθεση με τις επιλογές αποθήκευσης σε δεξαμενή, το SaaS απαιτεί πλήρη κατάθεση 32 ETH για ενεργοποίηση του επικυρωτή. Οι ανταμοιβές καταχωρούνται για τον χρήστη και συνήθως αφορούν μια μηνιαία κράτηση ή άλλο νόμισμα για τη χρήση της υπηρεσίας. Εάν προτιμάτε να διατηρείτε εσείς τα κλειδιά του επικυρωτή σας και θέλετε να αποθηκεύσετε τουλάχιστον 32 ETH, η χρήση ενός παρόχου SaaS μπορεί να είναι μια καλή επιλογή για εσάς.", + "page-staking-considerations-solo-1-title": "Ανοιχτού κώδικα", + "page-staking-considerations-solo-1-description": "Ο βασικός κώδικας είναι 100% ανοιχτού λογισμικού και διαθέσιμος στο κοινό για ενσωμάτωση και χρήση.", + "page-staking-considerations-solo-1-warning": "Κλειστό λογισμικό", + "page-staking-considerations-solo-2-title": "Ελεγμένο", + "page-staking-considerations-solo-2-description": "Ο βασικός κώδικας έχει υποβληθεί σε επίσημο έλεγχο και τα αποτελέσματα δημοσιεύθηκαν και είναι διαθέσιμα στο κοινό.", + "page-staking-considerations-solo-2-warning": "Κανένα", + "page-staking-considerations-solo-3-title": "Εύρεση σφάλματος", + "page-staking-considerations-solo-3-description": "Έχει πραγματοποιηθεί δημόσια επιβράβευση σφαλμάτων σε οποιονδήποτε βασικό κώδικα για την ανταμοιβή των χρηστών για την ασφαλή αναφορά ή/και τη διόρθωση τρωτών σημείων", + "page-staking-considerations-solo-3-valid": "Προσωρινά ενεργοί", + "page-staking-considerations-solo-3-caution": "Ολοκληρωμένα", + "page-staking-considerations-solo-4-title": "Έλεγχος λειτουργίας", + "page-staking-considerations-solo-4-description": "Λογισμικό που έχει διατεθεί και χρησιμοποιηθεί δημόσια για προκαθορισμένο χρονικό διάστημα", + "page-staking-considerations-solo-4-valid": "> 1 έτος", + "page-staking-considerations-solo-4-caution": "> 6 μήνες", + "page-staking-considerations-solo-4-warning": "Πρόσφατα", + "page-staking-considerations-solo-5-title": "Εμπιστοσύνη", + "page-staking-considerations-solo-5-description": "Τα κλειδιά επικυρωτή δεν ανατίθενται ποτέ σε κανέναν άλλο άνθρωπο κατά τη διάρκεια λειτουργίας του επικυρωτή. Τυχόν έξυπνα συμβόλαια που εμπλέκονται δεν έχουν πρόσβαση από «πίσω πόρτες», χωρίς πρόσβαση από προνομιακές άδειες για εκτέλεση.", + "page-staking-considerations-solo-5-warning": "Αξιόπιστο", + "page-staking-considerations-solo-6-title": "Δεν απαιτείται άδεια", + "page-staking-considerations-solo-6-description": "Δεν απαιτείται ειδική άδεια από τους χρήστες για τη λειτουργία ενός επικυρωτή χρησιμοποιώντας το λογισμικό ή την υπηρεσία.", + "page-staking-considerations-solo-6-valid": "Χωρίς άδεια", + "page-staking-considerations-solo-6-warning": "Απαιτείται εξουσιοδότηση", + "page-staking-considerations-solo-7-title": "Πολλαπλή εφαρμογή πελάτη", + "page-staking-considerations-solo-7-description": "Το λογισμικό επιτρέπει στους χρήστες να επιλέγουν και να εναλλάσσονται μεταξύ τουλάχιστον δύο ή περισσότερων λογισμικών πελάτη εκτέλεσης και δύο ή περισσότερων λογισμικών πελάτη του επιπέδου συναίνεσης.", + "page-staking-considerations-solo-7-valid": "Εύκολη εναλλαγή πελάτη", + "page-staking-considerations-solo-7-warning": "Περιορίζεται στο δημοφιλέστερο λογισμικό πελάτη", + "page-staking-considerations-solo-8-title": "Αυτοέλεγχος", + "page-staking-considerations-solo-8-description": "Ο χρήστης διατηρεί τη φύλαξη των διαπιστευτηρίων επικύρωσης, συμπεριλαμβανομένων των κλειδιών υπογραφής και ανάληψης.", + "page-staking-considerations-solo-8-warning": "Διατήρηση από τρίτο μέρος", + "page-staking-considerations-solo-9-title": "Οικονομικά", + "page-staking-considerations-solo-9-description": "Οι χρήστες μπορούν να λειτουργήσουν έναν επικυρωτή, αποθηκεύοντας λιγότερα από 32 ETH χρησιμοποιώντας ομαδικά κεφάλαια από άλλους.", + "page-staking-considerations-solo-9-valid": "< 32 ETH", + "page-staking-considerations-solo-9-warning": "32 ETH", + "page-staking-considerations-saas-4-description": "Υπηρεσία που έχει διατεθεί και χρησιμοποιηθεί δημόσια για προκαθορισμένο χρονικό διάστημα", + "page-staking-considerations-saas-6-description": "Δεν απαιτείται ειδική άδεια από τους χρήστες, εγγραφή λογαριασμού ή KYC για να συμμετάσχουν στην υπηρεσία.", + "page-staking-considerations-saas-6-valid": "Οποιοσδήποτε μπορεί να συμμετέχει", + "page-staking-considerations-saas-6-warning": "Απαιτείται εξουσιοδότηση", + "page-staking-considerations-saas-7-title": "Ποικιλομορφία εκτέλεσης", + "page-staking-considerations-saas-7-description": "Η υπηρεσία δεν πρέπει να εκτελεί περισσότερο από το 50% των συνολικών επικυρωτών τους με το δημοφιλέστερο λογισμικό πελάτη εκτέλεσης.", + "page-staking-considerations-saas-7-valid": "Λιγότερο από 50%", + "page-staking-considerations-saas-7-caution": "Προς το παρόν άγνωστο", + "page-staking-considerations-saas-7-warning": "Περισσότερο από 50%", + "page-staking-considerations-saas-8-title": "Ποικιλομορφία συναίνεσης", + "page-staking-considerations-saas-8-description": "Η υπηρεσία δεν πρέπει να εκτελεί περισσότερο από το 50% των συνολικών επικυρωτών τους με το δημοφιλέστερο λογισμικό πελάτη συναίνεσης.", + "page-staking-considerations-saas-8-valid": "Λιγότερο από 50%", + "page-staking-considerations-saas-8-caution": "Προς το παρόν άγνωστο", + "page-staking-considerations-saas-8-warning": "Περισσότερο από 50%", + "page-staking-considerations-pools-5-description": "Η υπηρεσία δεν απαιτεί να εμπιστεύεστε κανέναν άνθρωπο για τη φύλαξη των κλειδιών σας ή τη διανομή των ανταμοιβών.", + "page-staking-considerations-pools-6-title": "Κόμβοι χωρίς την απαίτηση άδειας", + "page-staking-considerations-pools-6-description": "Η υπηρεσία επιτρέπει σε οποιονδήποτε να εγγραφεί ως διαχειριστής κόμβου για τη δεξαμενή, χωρίς άδεια.", + "page-staking-considerations-pools-7-description": "Η υπηρεσία δεν πρέπει να εκτελεί περισσότερο από το 50% των συνολικών επικυρωτών τους με το δημοφιλέστερο λογισμικό πελάτη εκτέλεσης.", + "page-staking-considerations-pools-8-title": "Ψηφιακό στοιχείο ρευστότητας", + "page-staking-considerations-pools-8-description": "Προσφέρει εμπορεύσιμο ψηφιακό στοιχείο ρευστότητας που αντιπροσωπεύει το αποθηκευμένο κεφάλαιο σε ETH σας, το οποίο διατηρείται στο πορτοφόλι σας.", + "page-staking-considerations-pools-8-valid": "Ψηφιακό στοιχείο(α) ρευστότητας", + "page-staking-considerations-pools-8-warning": "Μη ψηφιακό στοιχείο ρευστότητας", + "page-staking-considerations-pools-9-description": "Η υπηρεσία δεν πρέπει να εκτελεί περισσότερο από το 50% των συνολικών επικυρωτών τους με το δημοφιλέστερο λογισμικό πελάτη συναίνεσης.", + "page-staking-how-solo-works-item-1": "Αποκτήστε υλικό: Πρέπει να εκτελέσετε έναν κόμβο για να αποθηκεύσετε κεφάλαιο.", + "page-staking-how-solo-works-item-2": "Συγχρονισμός πελάτη επιπέδου εκτέλεσης", + "page-staking-how-solo-works-item-3": "Συγχρονισμός πελάτη επιπέδου συναίνεσης", + "page-staking-how-solo-works-item-4": "Δημιουργήστε τα κλειδιά σας και τοποθετήστε τα στον πελάτη επικύρωσης", + "page-staking-how-solo-works-item-5": "Παρακολουθείτε και συντηρείτε τον κόμβο σας", + "page-staking-launchpad-widget-testnet-label": "Δίκτυο δοκιμών Goerli", + "page-staking-launchpad-widget-testnet-start": "Ξεκινήστε την αποθήκευση κεφαλαίου στο δίκτυο δοκιμών του Goerli", + "page-staking-launchpad-widget-mainnet-label": "Κεντρικό δίκτυο", + "page-staking-launchpad-widget-mainnet-start": "Ξεκινήστε την αποθήκευση στο Κεντρικό δίκτυο", + "page-staking-launchpad-widget-span": "Επιλογή δικτύου", + "page-staking-launchpad-widget-p1": "Οι μεμονωμένοι χρήστες επικυρωτή αναμένεται να δοκιμάσουν τις ρυθμίσεις τους και τις δεξιότητες τους στη λειτουργία της εφαρμογής στο δίκτυο δοκιμών Goerli πριν διακινδυνεύσουν οποιοδήποτε κεφάλαιο. Να θυμάστε είναι σημαντικό να επιλέξετε έναν πελάτη μειοψηφίας καθώς βελτιώνει την ασφάλεια του δικτύου και περιορίζει τον κίνδυνο.", + "page-staking-launchpad-widget-p2": "Εάν αισθάνεστε άνετα με αυτό, μπορείτε να ρυθμίσετε όλα όσα χρειάζεστε από τη γραμμή εντολών χρησιμοποιώντας μόνο την Πλατφόρμα εκκίνησης αποθήκευσης κεφαλαίου.", + "page-staking-launchpad-widget-p3": "Για να κάνετε τα πράγματα πιο εύκολα, ρίξτε μια ματιά στα παρακάτω εργαλεία και οδηγούς που μπορούν να σας βοηθήσουν μαζί με το την Πλατφόρμα εκκίνησης για αποθήκευση κεφαλαίου, για να ρυθμίσετε εύκολα το λογισμικό πελάτη σας.", + "page-staking-launchpad-widget-link": "Εργαλεία και οδηγίες λογισμικού", + "page-staking-products-get-started": "Ας αρχίσουμε", + "page-staking-dropdown-staking-options": "Επιλογές αποθήκευσης κεφαλαίου", + "page-staking-dropdown-staking-options-alt": "Αναδυόμενο μενού επιλογών αποθήκευσης", + "page-staking-stats-box-metric-1": "Σύνολο αποθηκευμένων ΕΤΗ", + "page-staking-stats-box-metric-2": "Σύνολο επικυρωτών", + "page-staking-stats-box-metric-3": "Τρέχον APR", + "page-staking-stats-box-metric-1-tooltip": "Το άθροισμα αποθηκευμένων ETH στην Κεντρική Αλυσίδα, μη συμπεριλαμβανομένων των υπολοίπων άνω των 32 ETH", + "page-staking-stats-box-metric-2-tooltip": "Ο αριθμός λογαριασμών επικύρωσης που είναι ενεργοποιημένοι αυτήν τη στιγμή στην Κεντρική Αλυσίδα", + "page-staking-stats-box-metric-3-tooltip": "Μέση ετήσια οικονομική απόδοση ανά επικυρωτή κατά την τελευταία 24ωρη περίοδο", + "page-staking-section-comparison-subtitle": "Δεν υπάρχει ενιαία λύση για αποθήκευση κεφαλαίου καθώς η κάθε περίπτωση είναι μοναδική. Θα συγκρίνουμε μερικούς από τους κινδύνους, τις ανταμοιβές και τις απαιτήσεις των διαφορετικών τρόπων με τους οποίους μπορείτε να αποθηκεύσετε το κεφάλαιο σας.", + "page-staking-section-comparison-rewards-title": "Ανταμοιβές", + "page-staking-section-comparison-solo-rewards-li1": "Μέγιστες ανταμοιβές - λαμβάνετε πλήρεις ανταμοιβές απευθείας από το πρωτόκολλο.", + "page-staking-section-comparison-solo-rewards-li2": "Λαμβάνετε ανταμοιβές για τη συγκέντρωση συναλλαγών σε ένα νέο μπλοκ ή τον έλεγχο εργασίας άλλων επικυρωτών για να διατηρήσετε την αλυσίδα σε λειτουργία με ασφάλεια.", + "page-staking-section-comparison-solo-rewards-li3": "Θα λάβετε επίσης τέλη συναλλαγής που δεν έχουν «καεί» για τα μπλοκ που προτείνετε.", + "page-staking-section-comparison-saas-rewards-li1": "Συνήθως περιλαμβάνει πλήρεις ανταμοιβές πρωτοκόλλου μείον τη μηνιαία χρέωση για τη λειτουργία του κόμβου.", + "page-staking-section-comparison-saas-rewards-li2": "Οι διαθέσιμοι πίνακες ελέγχου διευκολύνουν την παρακολούθηση λειτουργίας του λογισμικού πελάτη επικύρωσης.", + "page-staking-section-comparison-pools-rewards-li1": "Οι χρήστες που συμμετέχουν σε δεξαμενή αποθήκευσης λαμβάνουν ανταμοιβές διαφορετικά, ανάλογα με τη μέθοδο που έχουν επιλέξει.", + "page-staking-section-comparison-pools-rewards-li2": "Πολλές υπηρεσίες αποθήκευσης σε δεξαμενή προσφέρουν ένα ή περισσότερα στοιχεία ρευστότητας που αντιπροσωπεύουν το αποθηκευμένο κεφάλαιο σε ETH συν το μερίδιό σας από τις ανταμοιβές του επικυρωτή.", + "page-staking-section-comparison-pools-rewards-li3": "Τα κρυπτονομίσματα ρευστότητας μπορούν να διατηρηθούν στο πορτοφόλι σας, να χρησιμοποιηθούν στο DeFi και να πωληθούν εάν αποφασίσετε να αποχωρήσετε.", + "page-staking-section-comparison-risks-title": "Κίνδυνοι", + "page-staking-section-comparison-solo-risks-li1": "Τα ETH σας είναι αποθηκευμένα", + "page-staking-section-comparison-solo-risks-li2": "Υπάρχουν ποινές, οι οποίες κοστίζουν ETH, για τη μετάβαση εκτός σύνδεσης.", + "page-staking-section-comparison-solo-risks-li3": "Η κακόβουλη συμπεριφορά μπορεί να έχει ως αποτέλεσμα την «περικοπή» μεγαλύτερων ποσοτήτων ETH και αναγκαστική έξοδο από το δίκτυο.", + "page-staking-section-comparison-saas-risks-li1": "Ίδιοι κίνδυνοι με την ατομική αποθήκευση, συν τον κίνδυνο του παρόχου υπηρεσιών.", + "page-staking-section-comparison-saas-risks-li2": "Η χρήση των κλειδιών υπογραφής σας ανατίθεται σε κάποιον άλλον που θα μπορούσε να συμπεριφερθεί κακόβουλα.", + "page-staking-section-comparison-pools-risks-li1": "Οι κίνδυνοι ποικίλλουν ανάλογα με τη μέθοδο που χρησιμοποιείται.", + "page-staking-section-comparison-pools-risks-li2": "Γενικά, οι κίνδυνοι αποτελούνται από έναν συνδυασμό του κινδύνου αντισυμβαλλομένου, του έξυπνου συμβολαίου και του κινδύνου εκτέλεσης.", + "page-staking-section-comparison-requirements-title": "Προϋποθέσεις", + "page-staking-section-comparison-solo-requirements-li1": "Πρέπει να καταθέσετε 32 ETH", + "page-staking-section-comparison-solo-requirements-li2": "Να διατηρείται υλικό για τη λειτουργία πελάτη εκτέλεσης Ethereum και για πελάτη συναίνεσης ενώ είστε συνδεδεμένοι στο διαδίκτυο.", + "page-staking-section-comparison-solo-requirements-li3": "Η Πλατφόρμα εκκίνησης θα σας καθοδηγήσει σχετικά με τη διαδικασία και τις απαιτήσεις σε υλικό", + "page-staking-section-comparison-saas-requirements-li1": "Κατάθεση 32 ETH και δημιουργία των κλειδιών σας με βοήθεια", + "page-staking-section-comparison-saas-requirements-li2": "Αποθηκεύστε τα κλειδιά σας με ασφάλεια", + "page-staking-section-comparison-saas-requirements-li3": "Τα υπόλοιπα αναλαμβάνονται, αν και συγκεκριμένες υπηρεσίες διαφέρουν", + "page-staking-section-comparison-pools-requirements-li1": "Μικρότερες απαιτήσεις σε ETH, ορισμένα έργα απαιτούν τόσο λίγα όσο 0.01 ETH", + "page-staking-section-comparison-pools-requirements-li2": "Καταθέστε απευθείας από το πορτοφόλι σας σε διαφορετικές πλατφόρμες αποθήκευσης ή απλώς πραγματοποιήστε συναλλαγές για ένα από τα αποθηκευμένα ψηφιακά στοιχεία ρευστότητας.", + "page-staking-faq-1-question": "Τι είναι ο επικυρωτής;", + "page-staking-faq-1-answer": "Ο επικυρωτής είναι μια εικονική οντότητα που ζει στο Ethereum και συμμετέχει στη συναίνεση του πρωτοκόλλου Ethereum. Οι επικυρωτές αντιπροσωπεύονται από ένα υπόλοιπο κεφαλαίου, ένα δημόσιο κλειδί και άλλες ιδιότητες. Μια εφαρμογή πελάτη επικύρωσης είναι το λογισμικό που ενεργεί για λογαριασμό του επικυρωτή διατηρώντας και χρησιμοποιώντας το ιδιωτικό του κλειδί. Ένας πελάτης επικύρωσης μπορεί να διατηρεί πολλά ζεύγη κλειδιών, ελέγχοντας πολλούς επικυρωτές.", + "page-staking-faq-2-question": "Χρειάζονται κρύπτο για την αποθήκευση κεφαλαίου;", + "page-staking-faq-2-answer": "Ένας επικυρωτής έχει τη δυνατότητα να προτείνει και να πιστοποιεί μπλοκ για το δίκτυο. Για να αποφευχθεί η κακόβουλη συμπεριφορά, οι χρήστες πρέπει να δεσμεύσουν τα χρήματά τους. Αυτό επιτρέπει στο πρωτόκολλο να τιμωρεί τους κακόβουλους χρήστες. Η αποθήκευση κεφαλαίου είναι ένα μέσο για να είστε ειλικρινείς, καθώς οι πράξεις σας θα έχουν οικονομικές συνέπειες.", + "page-staking-faq-3-question": "Μπορώ να αγοράσω Eth2;", + "page-staking-faq-3-answer-p1": "Δεν υπάρχει εγγενές κρυπτονόμισμα «Eth2» στο πρωτόκολλο, καθώς το κρυπτονόμισμα (ETH) δεν άλλαξε όταν το Ethereum πέρασε στην απόδειξη συμμετοχής.", + "page-staking-faq-3-answer-p2": "Υπάρχουν παράγωγα κρυπτονομίσματα που μπορεί να αντιπροσωπεύουν αποθηκευμένο κεφάλαιο ETH (δηλ. το rETH από το Rocket Pool, το stETH από το Lido, το ETH2 από το Coinbase). Μάθετε περισσότερα σχετικά με τις δεξαμενές αποθήκευσης κεφαλαίου", + "page-staking-faq-4-question": "Η αποθήκευση κεφαλαίου είναι σε λειτουργία;", + "page-staking-faq-4-answer-p1": "Ναι, είναι δυνατή η αποθήκευση κεφαλαίου από τη 1η Δεκεμβρίου 2020.", + "page-staking-faq-4-answer-p2": "Αυτό σημαίνει ότι η αποθήκευση κεφαλαίου είναι επί του παρόντος ενεργή για τους χρήστες να καταθέσουν τα ETH τους, να εκτελέσουν ένα λογισμικό πελάτη επικύρωσης και να αρχίσουν να κερδίζουν ανταμοιβές.", + "page-staking-faq-4-answer-p3": "Η αναβάθμιση Shanghai/Capella ολοκληρώθηκε στις 12 Απριλίου 2023, επιτρέποντας τις αναλήψεις από αποθηκευμένο κεφάλαιο, κλείνοντας έτσι τον κύκλο της ρευστότητας αποθηκευμένου κεφαλαίου.", + "page-staking-faq-5-question": "Πότε μπορώ να αποσύρω το αποθηκευμένο κεφάλαιο ΕΤΗ μου;", + "page-staking-faq-5-answer-p1": "Τώρα αμέσως! Οι χρήστες με αποθηκευμένο κεφάλαιο είναι ελεύθεροι να αποσύρουν τις ανταμοιβές τους ή/και το αρχικό τους κεφάλαιο από το υπόλοιπο του επικυρωτή, εάν το επιθυμούν.", + "page-staking-faq-5-answer-p2": "Οι χρήστες με αποθηκευμένο κεφάλαιο θα κερδίζουν επίσης ανταμοιβές με τη μορφή αμοιβών και MEV όταν προτείνουν μπλοκ, τα οποία είναι αμέσως διαθέσιμα μέσω της καθορισμένης διεύθυνσης ανάληψης.", + "page-staking-faq-5-answer-link": "Περισσότερα για την ανάληψη αποθηκευμένων κεφαλαίων", + "page-staking-further-reading-1-link": "Γιατί απόδειξη συμμετοχής (Νοε 2020)", + "page-staking-further-reading-author-vitalik-buterin": "Vitalik Buterin", + "page-staking-further-reading-2-link": "Serenity Design Rationale", + "page-staking-further-reading-3-link": "Απόδειξη συμμετοχής FAQ (Δεκέμβριος 2017)", + "page-staking-further-reading-4-link": "Ειδήσεις Eth2", + "page-staking-further-reading-4-author": "Ben Edgington", + "page-staking-further-reading-5-link": "Οριστικοποιήθηκε αρ. 33, επίπεδο συναίνεσης Ethereum (Ιανουάριος 2022)", + "page-staking-further-reading-5-author": "Danny Ryan", + "page-staking-further-reading-6-link": "Πιστοποίηση Κόστους", + "page-staking-further-reading-7-link": "Γνωσιακή βάση Beaconcha.in", + "page-staking-further-reading-8-link": "Beaconcha.in Κοινοτικά Εκπαιδευτικά Υλικά", + "page-staking-further-reading-9-link": "Πλατφόρμα εκκίνησης αποθήκευσης κεφαλαίου FAQ", + "page-staking-further-reading-10-link": "Γνωσιακή βάση EthStaker", + "page-staking-toc-how-to-stake-your-eth": "Πώς να αποθηκεύσετε τα ETH σας", + "page-staking-toc-comparison-of-options": "Σύγκριση επιλογών αποθήκευσης κεφαλαίου", + "page-staking-toc-faq": "Συχνές ερωτήσεις", + "page-staking-toc-further": "Περισσότερες πληροφορίες", + "page-staking-dom-info-title": "Αποθήκευση κεφαλαίου με Ethereum", + "page-staking-join-community": "Συνδεθείτε με την κοινότητα αποθήκευσης κεφαλαίου", + "page-staking-join-community-desc": "Το EthStaker είναι μια κοινότητα για όλους για να συζητήσουν και να μάθουν για την αποθήκευση στο Ethereum. Συμμετέχετε μαζί με δεκάδες χιλιάδες μέλη από όλο τον κόσμο για συμβουλές, υποστήριξη και για να μιλήσετε για όλα τα θέματα για την αποθήκευση κεφαλαίου.", "page-staking-meta-description": "Μια επισκόπηση της αποθήκευσης Ethereum: οι κίνδυνοι, οι ανταμοιβές και οι απαιτήσεις καθώς και πού μπορούν να υλοποιηθούν.", - "page-staking-meta-title": "Αποθήκευση Ethereum", - "page-upgrades-merge-btn": "Περισσότερα για την ενσωμάτωση" + "page-staking-meta-title": "Αποθήκευση κεφαλαίου Ethereum", + "page-staking-withdrawals-important-notices": "Σημαντικές ανακοινώσεις", + "page-staking-withdrawals-important-notices-desc": "Οι αναλήψεις δεν είναι ακόμη διαθέσιμες. Διαβάστε τις Συχνές ερωτήσεις για τη συγχώνευση και μετά τη συγχώνευση Eth2 για περισσότερες πληροφορίες.", + "page-upgrades-merge-btn": "Περισσότερα για τη συγχώνευση", + "subscribe-to-ef-blog": "Εγγραφείτε στο ιστολόγιο EF για να λαμβάνετε ειδοποιήσεις μέσω email για τις πιο πρόσφατες ανακοινώσεις πρωτοκόλλου." } diff --git a/src/intl/en/learn-quizzes.json b/src/intl/en/learn-quizzes.json index c62ecbb2a97..016c3b8e08f 100644 --- a/src/intl/en/learn-quizzes.json +++ b/src/intl/en/learn-quizzes.json @@ -306,8 +306,8 @@ "h003-prompt": "When did The Merge happen?", "h003-a-label": "September 15th 2022", "h003-a-explanation": "The Merge happened on September 15th 2022 at 06:42:42 AM (UTC).", - "h003-b-label": "December 1st 2021", - "h003-b-explanation": "The Merge happened later than this. December 1st 2022 was when the Beacon Chain was launched.", + "h003-b-label": "December 1st 2020", + "h003-b-explanation": "The Merge happened later than this. December 1st 2020 was when the Beacon Chain was launched.", "h003-c-label": "November 27 2013", "h003-c-explanation": "The Merge happened later than this. November 27, 2013 was when the Ethereum whitepaper was released.", "h003-d-label": "October 31st 2008", diff --git a/src/intl/en/page-gas.json b/src/intl/en/page-gas.json index a9c736a9e79..73bba191cda 100644 --- a/src/intl/en/page-gas.json +++ b/src/intl/en/page-gas.json @@ -48,7 +48,7 @@ "page-gas-table-header-2": "Units of gas used", "page-gas-table-item-1-transaction-type": "Sending ETH", "page-gas-table-item-2-transaction-type": "Sending ERC-20 tokens", - "page-gas-table-item-3-transaction-type": "Transferring and NFT", + "page-gas-table-item-3-transaction-type": "Transferring an NFT", "page-gas-table-item-4-transaction-type": "Swapping on Uniswap", "page-gas-faq-header": "Frequency asked questions", "page-gas-faq-question-1-q": "Who gets paid the gas fee in my transaction?", diff --git a/src/intl/es/common.json b/src/intl/es/common.json index 2f5111bc722..acc9b6c07bf 100644 --- a/src/intl/es/common.json +++ b/src/intl/es/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "¿Le ha resultado útil este tutorial?", "feedback-widget-thank-you-title": "¡Gracias por sus comentarios!", "feedback-widget-thank-you-subtitle": "Mejore esta página respondiendo a algunas preguntas.", - "feedback-widget-thank-you-subtitle-ext": "Si necesita ayuda, puede comunicarse con la comunidad en nuestro canal Discord.", + "feedback-widget-thank-you-subtitle-ext": "Si necesita ayuda, puede comunicarse con la comunidad en nuestro canal Discord.", "feedback-widget-thank-you-timing": "2–3 minutos", "feedback-widget-thank-you-cta": "Abrir encuesta breve", "find-wallet": "Encontrar cartera", @@ -107,7 +107,7 @@ "grants": "Subvenciones", "grant-programs": "Programas para subvenciones del ecosistema", "guides": "Guías", - "guides-hub": "Centro de guías", + "guides-hub": "Guías prácticas", "history-of-ethereum": "Historia de Ethereum", "home": "Inicio", "how-ethereum-works": "Cómo funciona Ethereum", diff --git a/src/intl/es/learn-quizzes.json b/src/intl/es/learn-quizzes.json index babe87acad6..b1d19b05a29 100644 --- a/src/intl/es/learn-quizzes.json +++ b/src/intl/es/learn-quizzes.json @@ -62,7 +62,7 @@ "a004-d-label": "Más de diez veces", "a004-explanation": "Ethereum nunca ha desaparecido completamente fuera de línea (dejó de producir bloques) desde su lanzamiento.", "a005-prompt": "Ethereum consume más electricidad que:", - "a005-a-label": "Minado de oro", + "a005-a-label": "Minería de oro", "a005-a-explanation": "La minería de oro utiliza ~131 teravarios/hora al año. Ethereum utiliza aproximadamente 0,0026 teravatios/hora al año.", "a005-b-label": "Netflix", "a005-b-explanation": "Netflix utiliza ~0,451 teravarios/hora al año. Ethereum utiliza aproximadamente 0,0026 teravatios/hora al año.", @@ -94,7 +94,7 @@ "b003-b-label": "Si un participante intenta engañar a la red, corre el riesgo de perder su ETH", "b003-b-explanation": "Los participantes corren el riesgo de perder una cantidad significativa de sus ETH si se demuestra que se comportan malintencionadamente contra la red. Esto se conoce como un recorte.", "b003-c-label": "Los participantes trabajan con potentes ordenadores para demostrar la prueba de trabajo.", - "b003-c-explanation": "Los participantes no necesitan tener un hardware potente para apostar sus ETH. Ethereum dejó de usar la prueba de trabajo al producirse La fusión.", + "b003-c-explanation": "Los participantes no necesitan tener un hardware potente para apostar sus ETH. Ethereum dejó de usar la prueba de trabajo al producirse La Fusión.", "b003-d-label": "Los participantes se someten a KYC antes de ser aceptados como validadores", "b003-d-explanation": "Apostar en Ethereum no tiene permisos y no requiere KYC.", "b004-prompt": "Los ETH son valiosos, porque:", diff --git a/src/intl/es/page-about.json b/src/intl/es/page-about.json index 25f9230930c..b36ba7a4654 100644 --- a/src/intl/es/page-about.json +++ b/src/intl/es/page-about.json @@ -9,25 +9,24 @@ "page-about-li-4": "implementado", "page-about-link-1": "El código fuente de este repositorio está bajo la licencia MIT", "page-about-link-2": "GitHub", - "page-about-link-3": "Ver la lista completa de tareas en curso en GitHub", + "page-about-link-3": "Ver la lista completa de tareas en curso en Github", "page-about-link-4": "Únase a nuestro servidor Discord", "page-about-link-5": "Contacte con nosotros en Twitter", - "page-about-link-6": "Ver la lista completa de tareas implementadas en GitHub", - "page-about-link-7": "Crear un asunto en GitHub", + "page-about-link-6": "Ver la lista completa de tareas implementadas en Github", + "page-about-link-7": "Crear un asunto en Github", "page-about-p-1": "Desde el lanzamiento de ethereum.org, nos esforzamos por ser transparentes sobre cómo funcionamos. Este es uno de nuestros valores fundamentales, porque creemos que la transparencia es crucial para el éxito de Ethereum.", "page-about-p-2": "Usamos", "page-about-p-3": "como herramienta principal de gestión de proyectos. Organizamos nuestras tareas en 3 categorías:", - "page-about-p-4": "Hacemos todo lo posible para mantener a la comunidad informada sobre el estado de una tarea específica.", + "page-about-p-4": " Hacemos todo lo posible para mantener a la comunidad informada sobre el estado de una tarea específica.", "page-about-p-5": "Tareas que estamos implementando.", "page-about-p-6": "Tareas que hemos puesto en cola para implementar después.", "page-about-p-7": "Tareas completadas recientemente.", "page-about-p-8": "¿Tiene una idea de cómo mejorar ethereum.org? ¡Nos encantaría colaborar con usted!", "page-what-is-ethereum-energy-consumption-chart-legend": "Consumo energético anual en TW/año", "page-upgrades-post-merge-banner-governance-ood": "Parte del contenido de esta página estará obsoleto después de la fusión. Por favor cree una PR si quiere contribuir.", - "energy-consumption-chart-youtube-label": "YouTube", - "energy-consumption-chart-gold-mining-galaxy-label": "Minería de oro (Galaxy Digital)", "energy-consumption-chart-global-data-centers-label": "Centros de datos globales", - "energy-consumption-chart-gold-mining-cbeci-label": "Minería de oro (CBECI)", + "energy-consumption-chart-airbnb-label": "AirBnB", + "energy-consumption-gold-mining-cbeci-label": "Minería de oro", "energy-consumption-chart-btc-pow-label": "PoW de BTC", "energy-consumption-chart-netflix-label": "Netflix", "energy-consumption-chart-eth-pow-label": "PoW de ETH", diff --git a/src/intl/es/page-assets.json b/src/intl/es/page-assets.json index c4b3b927ab7..fe007107e97 100644 --- a/src/intl/es/page-assets.json +++ b/src/intl/es/page-assets.json @@ -33,11 +33,15 @@ "page-assets-future": "Futuro", "page-assets-h1": "activos de ethereum.org", "page-assets-hero": "protagonista de ethereum.org", + "page-assets-hero-panda": "ethereum.org hero with merge panda", + "page-assets-merge-panda": "Merge panda", + "page-assets-merge-panda-svg": "Combinar emoji panda", "page-assets-hero-particles": "Imagen de partículas ETH", "page-assets-historical-artwork": "Obra histórica", "page-assets-illustrations": "Ilustraciones", "page-assets-impact": "Impacto", "page-assets-infrastructure": "Infraestructura", + "page-assets-leslie-the-rhino": "Leslie el rinoceronte", "page-assets-meta-desc": "Explore y descargue los activos de marca, las ilustraciones y los medios de Ethereum y ethereum.org.", "page-assets-meta-title": "Activos de marca de Ethereum", "page-assets-mainnet": "Red principal", diff --git a/src/intl/es/page-bug-bounty.json b/src/intl/es/page-bug-bounty.json index 0252237c62c..8c9000deeff 100644 --- a/src/intl/es/page-bug-bounty.json +++ b/src/intl/es/page-bug-bounty.json @@ -2,31 +2,31 @@ "page-upgrades-bug-bounty-annotated-specs": "especificación anotada", "page-upgrades-bug-bounty-annotations": "Podría ser de ayuda revisar las siguientes anotaciones:", "page-upgrades-bug-bounty-client-bugs": "Errores del cliente", - "page-upgrades-bug-bounty-client-bugs-desc": "Los clientes ejecutan la red Ethereum y deben seguir la lógica establecida en la especificación y estar seguros contra posibles ataques. Los errores que queremos encontrar están relacionados con la implementación del protocolo.", - "page-upgrades-bug-bounty-client-bugs-desc-2": "Actualmente, los clientes de la capa de ejecución (Besu, Erigon, Geth y Nethermind) y los clientes de la capa de consenso (Lighthouse, Lodestar, Nimbus, Teku y Prysm) están incluidos en el programa de recompensas por errores. Se pueden agregar más clientes a medida que completen las auditorías y estén listos para la producción.", + "page-upgrades-bug-bounty-client-bugs-desc": "Los clientes ejecutan la red Ethereum y deben seguir la lógica establecida en la especificación y estar protegidos frente a posibles ataques. Los errores que nos interesan están relacionados con la implementación del protocolo.", + "page-upgrades-bug-bounty-client-bugs-desc-2": "Currently execution layer clients (Besu, Erigon, Geth and Nethermind) and consensus layer clients (Lighthouse, Lodestar, Nimbus, Teku and Prysm) are included in the Bug Bounty Program. More clients may be added as they complete audits and become production ready. Currently, c-kzg-4844 and go-kzg-4844 are also included in the bug bounty program.", "page-upgrades-bug-bounty-clients": "Clientes destacados en las recompensas", "page-upgrades-bug-bounty-clients-type-1": "Problemas de incumplimiento de especificaciones", - "page-upgrades-bug-bounty-clients-type-2": "Errores inesperados o vulnerabilidades de negación del servicio (DOS)", + "page-upgrades-bug-bounty-clients-type-2": "Errores inesperados, RCE o vulnerabilidades de negación del servicio (DOS)", "page-upgrades-bug-bounty-clients-type-3": "Cualquier problema que cause divisiones irreparables en el consenso con respecto al resto de la red.", "page-upgrades-bug-bounty-misc-bugs": "Errores de solidez", - "page-upgrades-bug-bounty-misc-bugs-desc": "Consulte el archivo SECURITY.MD de Solodity para obtener más detalles sobre lo que se incluye en este alcance.", - "page-upgrades-bug-bounty-misc-bugs-desc-2": "Solidity no ofrece garantías de seguridad con respecto a la compilación de entradas que no son de confianza, y no otorgamos recompensas por errores del compilador solc en datos generados de manera malintencionada.", + "page-upgrades-bug-bounty-misc-bugs-desc": "Consulte el archivo SECURITY.MD de Solidity para obtener más detalles sobre lo que se incluye en este alcance.", + "page-upgrades-bug-bounty-misc-bugs-desc-2": "Solidity no ofrece garantías de seguridad con respecto a la compilación de entradas que no son de confianza, ni tampoco otorgamos recompensas por errores del compilador solc en datos generados de manera malintencionada.", "page-upgrades-bug-bounty-deposit-bugs": "Errores del contrato de depósito", "page-upgrades-bug-bounty-deposit-bugs-desc": "Las especificaciones y el código fuente del contrato de depósito de la cadena de baliza son parte del programa de recompensas por errores.", "page-upgrades-bug-bounty-docking": "fusión", "page-upgrades-bug-bounty-email-us": "Envíenos un correo electrónico:", "page-upgrades-bug-bounty-help-links": "Enlaces útiles", "page-upgrades-bug-bounty-hunting": "Reglas de búsqueda de errores", - "page-upgrades-bug-bounty-hunting-desc": "El programa de recompensas por errores es un programa de recompensas experimental y discrecional para nuestra comunidad activa de Ethereum con el fin de alentar y recompensar a quienes ayudan a mejorar la plataforma. No es una competición. Debe saber que podemos cancelar el programa en cualquier momento, y los premios quedan a la sola discreción del panel de recompensas por errores de Ethereum Foundation. Además, no podemos otorgar premios a personas que están en listas de sanciones o que se encuentran en países en listas de sanciones (por ejemplo, Corea del Norte, Irán, etc.). Las leyes locales nos obligan a solicitar una prueba de su identidad. Usted es responsable de todos los impuestos. Todos los premios están sujetos a la ley aplicable. Finalmente, su prueba no debe violar ninguna ley ni comprometer ningún dato que no sea suyo y debe realizarse en redes de prueba locales en ejecución.", + "page-upgrades-bug-bounty-hunting-desc": "El programa de recompensas por errores es un programa de recompensas experimental y discrecional para nuestra comunidad activa de Ethereum con el fin de alentar y recompensar a quienes ayudan a mejorar la plataforma. No es una competición. Debe saber que podemos cancelar el programa en cualquier momento, y los premios quedan a discreción del panel de recompensas por errores de Ethereum Foundation. Además, no podemos otorgar premios a personas que están en listas de sanciones, o que se encuentran en países en listas de sanciones (por ejemplo, Corea del Norte, Irán, etc.). La legislación local nos obliga a solicitar una prueba de su identidad. Usted es responsable del tributo de todos los impuestos. Todos los premios están sujetos a la ley aplicable. Por último, su prueba no debe infringir ninguna ley ni hacer referencia a ningún dato que no sea suyo y debe realizarse en redes de prueba locales en ejecución.", "page-upgrades-bug-bounty-hunting-leaderboard": "Tabla de recompensa de errores de la capa de consenso", "page-upgrades-bug-bounty-hunting-execution-leaderboard": "Tabla de recompensa de errores de la capa de ejecución", "page-upgrades-bug-bounty-hunting-leaderboard-subtitle": "Encuentre errores en la capa de consenso para añadirlos a esta tabla de clasificación", "page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle": "Encuentre errores en la capa de ejecución para agregarlos a esta tabla de clasificación", - "page-upgrades-bug-bounty-hunting-li-1": "Los problemas sin un POC o que ya hayan sido enviados por otro usuario o que los mantenedores de especificaciones y clientes ya conozcan no son elegibles para recompensas.", + "page-upgrades-bug-bounty-hunting-li-1": "Los problemas sin un POC, que ya haya enviado otro usuario o que los mantenedores de especificaciones y clientes ya conozcan no son elegibles para recompensas.", "page-upgrades-bug-bounty-hunting-li-2": "La divulgación pública de una vulnerabilidad la descarta para optar a una recompensa.", "page-upgrades-bug-bounty-hunting-li-3": "Empleados y contratistas de Ethereum Foundation o equipos de clientes en el ámbito del programa de recompensas pueden participar en el programa solo en la acumulación de puntos y no recibirán recompensas monetarias.", "page-upgrades-bug-bounty-hunting-li-4": "El programa de recompensas de Ethereum tiene en cuenta numerosas variables a la hora de determinar las recompensas. Las definiciones de elegibilidad, puntuación y todos los términos relacionados con una recompensa quedan al criterio exclusivo del panel de recompensas por errores de Ethereum Foundation.", - "page-upgrades-bug-bounty-leaderboard": "Ver tablas completas", + "page-upgrades-bug-bounty-leaderboard": "Ver tablas de clasificación completas", "page-upgrades-bug-bounty-leaderboard-list": "Tabla de clasificación de las recompensas", "page-upgrades-bug-bounty-leaderboard-points": "puntos", "page-upgrades-bug-bounty-ledger-desc": "Las especificaciones de Ethereum detallan la justificación del diseño para la capa de ejecución y la capa de consenso.", @@ -34,21 +34,21 @@ "page-upgrades-bug-bounty-meta-description": "Una descripción general del programa de recompensas de errores de Ethereum: cómo involucrarse y recompensar la información.", "page-upgrades-bug-bounty-meta-title": "Programa de recompensas por errores de Ethereum", "page-upgrades-bug-bounty-not-included": "Fuera de ámbito", - "page-upgrades-bug-bounty-not-included-desc": "Sólo los temas enumerados en el ámbito forman parte del programa de recompensas de errores. Esto significa que, por ejemplo, nuestra infraestructura, como las páginas web, dns, correo electrónico, etc., no forman parte del ámbito de la recompensa. Los errores de contrato de ERC20 normalmente no se incluyen en el ámbito de la recompensa. Sin embargo, podemos ayudar a llegar a las partes afectadas, como los autores o los intercambios en tales casos. ENS es mantenido por la fundación de ENS, y no es parte del alcance de la recompensa.", + "page-upgrades-bug-bounty-not-included-desc": "Solo los objetivos enumerados bajo el alcance del ámbito forman parte del programa de recompensas por errores. Lo que significa que, por ejemplo, nuestra infraestructura, como páginas web, DNS o correos electrónicos no están incluidos en el ámbito de las recompensas. Los errores de contrato ERC20 tampoco están incluidos en el ámbito de la recompensa. No obstante, podemos ayudarle a llegar a las partes afectadas, como autores o intercambios en estos casos. Del mantenimiento de ENS se encarga la fundación ENS y no forma parte del ámbito de recompensas. Las vulnerabilidades requieren que el usuario haya expuesto públicamente una API, como JSON-RPC o la API de baliza, que queda fuera del ámbito del programa de recompensas de errores.", "page-upgrades-bug-bounty-owasp": "Ver método OWASP", - "page-upgrades-bug-bounty-points": "El EF también proporcionará recompensas basadas en:", + "page-upgrades-bug-bounty-points": "La EF también proporcionará recompensas basadas en:", "page-upgrades-bug-bounty-points-error": "Error al cargar los datos. Actualice.", "page-upgrades-bug-bounty-points-exchange": "Intercambio de puntos", "page-upgrades-bug-bounty-points-loading": "Cargando datos...", "page-upgrades-bug-bounty-points-payout-desc": "Ethereum Foundation pagará el valor de USD en ETH o DAI.", "page-upgrades-bug-bounty-points-point": "1 punto", "page-upgrades-bug-bounty-points-rights-desc": "Ethereum Foundation se reserva el derecho de hacer modificaciones sin previo aviso.", - "page-upgrades-bug-bounty-points-usd": "2 dólares", + "page-upgrades-bug-bounty-points-usd": "2 USD", "page-upgrades-bug-bounty-quality": "Calidad de la descripción", "page-upgrades-bug-bounty-quality-desc": ": se pagan recompensas más altas por informes claros y bien escritos.", "page-upgrades-bug-bounty-quality-fix": "Calidad de la solución, si se incluye: se pagan recompensas más altas por los envíos con una descripción clara de cómo solucionar el problema.", "page-upgrades-bug-bounty-quality-repro": "Calidad de la reproducción", - "page-upgrades-bug-bounty-quality-repro-desc": ": Debe incluirse una prueba de concepto (POC) para poder optar a los premios. Por favor incluya el código de prueba, scripts e instrucciones detalladas. Cuanto más fácil nos resulte reproducir y verificar la vulnerabilidad, mayor será la recompensa.", + "page-upgrades-bug-bounty-quality-repro-desc": ": debe incluirse una prueba de concepto (POC) para poder optar a los premios. Por favor incluya el código de prueba, scripts e instrucciones detalladas. Cuanto más fácil nos resulte reproducir y verificar la vulnerabilidad, mayor será la recompensa.", "page-upgrades-bug-bounty-questions": "¿Tiene alguna pregunta?", "page-upgrades-bug-bounty-rules": "Leer las normas", "page-upgrades-bug-bounty-slogan": "Programa de recompensa de errores", @@ -56,9 +56,9 @@ "page-upgrades-bug-bounty-execution-specs": "Especificaciones de la capa de ejecución", "page-upgrades-bug-bounty-specs-docs": "Documentos de especificaciones", "page-upgrades-bug-bounty-submit": "Enviar un error", - "page-upgrades-bug-bounty-submit-desc": "Por cada error válido que encuentre, obtendrá recompensas. La cantidad de recompensas que se otorguen variará dependiendo del grado de gravedad. La gravedad se calcula según el modelo de calificación de riesgo OWASP basado en el impacto en la red de Network y en la probabilidad.", - "page-upgrades-bug-bounty-subtitle": "Gane hasta 250.000 USD y un lugar en el tablero de clasificación por encontrar un protocolo, cliente y errores de Solidity que afecten a la red Ethereum.", - "page-upgrades-bug-bounty-title": "Abierto para envíos", + "page-upgrades-bug-bounty-submit-desc": "Por cada error válido que encuentre, obtendrá recompensas. La cantidad de recompensas que se otorguen variará dependiendo del grado de gravedad. La gravedad se calcula según el modelo de calificación de riesgo OWASP basado en el impacto en la red de Ethereum y en la probabilidad.", + "page-upgrades-bug-bounty-subtitle": "Encuentre un protocolo, cliente y errores de Solidity que afecten a la red Ethereum y gane hasta 250.000 USD, además de un lugar en el tablero de clasificación.", + "page-upgrades-bug-bounty-title": "Ya puede enviar informes", "page-upgrades-bug-bounty-title-1": "Cadena de baliza", "page-upgrades-bug-bounty-title-2": "Opción de bifurcación", "page-upgrades-bug-bounty-title-3": "Contrato de depósito de Solidity", @@ -69,7 +69,7 @@ "page-upgrades-bug-bounty-type-4": "Inconsistencias de cálculos o parámetros", "page-upgrades-bug-bounty-types": "Tipos de errores", "page-upgrades-bug-bounty-validity": "En el ámbito", - "page-upgrades-bug-bounty-validity-desc": "Nuestro programa de recompensas por errores abarca de principio a fin: desde la solidez de los protocolos (como el modelo de consenso de cadena de bloques, los protocolos alámbricos y p2p, la prueba de participación, etc.) y el cumplimiento del protocolo/implementación hasta la seguridad de la red y la integridad del consenso. La seguridad clásica del cliente, así como la seguridad de las primitivas criptográficas, también forman parte del programa. En caso de duda, envíe un correo electrónico a bounty@ethereum.org y pregúntenos.", + "page-upgrades-bug-bounty-validity-desc": "Nuestro programa de recompensas por errores abarca de principio a fin: desde la solidez de los protocolos (como el modelo de consenso de cadena de bloques, los protocolos alámbricos y p2p, la prueba de participación, etc.) y el cumplimiento del protocolo/implementación hasta la seguridad de la red y la integridad del consenso. La seguridad clásica del cliente, así como la seguridad de las primitivas criptográficas también forman parte del programa. En caso de duda, envíe un correo electrónico a bounty@ethereum.org y pregúntenos.", "page-upgrades-bug-bounty-card-critical": "Crítico", "page-upgrades-bug-bounty-card-critical-risk": "Enviar un error de riesgo crítico", "page-upgrades-bug-bounty-card-h2": "Medio", @@ -102,14 +102,14 @@ "page-upgrades-bug-bounty-card-text-3": "El atacante puede realizar con éxito la ejecución remota de código en un cliente mayoritario, y es insignificante que un atacante desencadene la vulnerabilidad", "page-upgrades-question-title": "Preguntas más frecuentes", "bug-bounty-faq-q1-title": "¿Cómo debería ser un buen envío de vulnerabilidad?", - "bug-bounty-faq-q1-contentPreview": "Vea un ejemplo real de un informe de vulnerabilidad de calidad.", + "bug-bounty-faq-q1-contentPreview": "Mira un ejemplo real de un reporte de vulnerabilidad de calidad.", "bug-bounty-faq-q1-content-1": "Descripción: Denegación de servicio remoto usando bloques no validados", "bug-bounty-faq-q1-content-2": "Escenario posible: Un atacante puede enviar bloques que requieran una alta cantidad de computación (el máximo gasLimit), pero carecer de prueba de trabajo. Si el atacante envía bloques continuamente, este puede forzar al nodo de la víctima a utilizar 100 % de su CPU.", "bug-bounty-faq-q1-content-3": "Impacto: Un atacante puede abusar del uso de CPU en nodos remotos, causando posiblemente un DoS completo.", - "bug-bounty-faq-q1-content-4": "Componentes: Ir a la versión del cliente v0.6.8", + "bug-bounty-faq-q1-content-4": "Componentes: Ir a la versión del cliente v0.6.8.", "bug-bounty-faq-q1-content-5": "Reproducción: Envía un bloque a un «Go node» que contenga muchos tx pero ningún PoW válido.", "bug-bounty-faq-q1-content-6": "Details: Los bloques se validan con el método Process (Block, dontReact). Este método realiza costosas tareas con uso intensivo de la CPU, como la ejecución de transacciones (sm.ApplyDiff) y después verifica la prueba de trabajo (sm.ValidateBlock()). Esto permite a un atacante enviar bloques que tal vez requieran una gran cantidad de cálculo (el máximo gasLimit) pero sin prueba de trabajo. Si el atacante envía bloques continuamente, puede forzar al nodo víctima a una utilización del 100 % de la CPU.", - "bug-bounty-faq-q1-content-7": "Fix: Invierte el orden de las comprobaciones.", + "bug-bounty-faq-q1-content-7": "Solución: Invertir el orden de las comprobaciones.", "bug-bounty-faq-q2-title": "¿Tiene limitación temporal el programa de recompensas de errores?", "bug-bounty-faq-q2-contentPreview": "No.", "bug-bounty-faq-q2-content-1": "Actualmente no hay fecha de finalización. Consulte el blog de Ethereum Foundation para estar al día de las novedades.", @@ -117,11 +117,11 @@ "bug-bounty-faq-q3-contentPreview": "Las recompensas se pagan en ETH o DAI.", "bug-bounty-faq-q3-content-1": "Recompensas se pagan en ETH o DAI después de validar el envío, normalmente unos días después. Las leyes locales nos obligan a pedir una prueba de identidad. Además, necesitaremos su dirección ETH.", "bug-bounty-faq-q4-title": "¿Puedo donar mi recompensa a una organización benéfica?", - "bug-bounty-faq-q4-contentPreview": "Sí, claro.", + "bug-bounty-faq-q4-contentPreview": "¡Sí!", "bug-bounty-faq-q4-content-1": "Podemos donar su recompensa a la organización benéfica que usted prefiera.", "bug-bounty-faq-q5-title": "He informado de un problema o una vulnerabilidad, pero ¡no he recibido respuesta!", - "bug-bounty-faq-q5-contentPreview": "Por favor, dé unos días de tiempo para que alguien responda a su envío.", - "bug-bounty-faq-q5-content-1": "Nuestro objetivo es responder a los envíos lo antes posible. No dude en enviarnos un correo electrónico a bounty@ethereum.orgsi no ha recibido respuesta en uno o dos días.", + "bug-bounty-faq-q5-contentPreview": "Por favor, dé unos días de tiempo para que alguien responda a su informe.", + "bug-bounty-faq-q5-content-1": "Nuestro objetivo es responder a los informes enviaos lo antes posible. No dude en enviarnos un correo electrónico a bounty@ethereum.orgsi no ha recibido respuesta en uno o dos días.", "bug-bounty-faq-q6-title": "Quiero ser anónimo. / No quiero que mi nombre aparezca en la tabla de clasificación.", "bug-bounty-faq-q6-contentPreview": "Puede hacerlo, pero podría perder el derecho a las recompensas.", "bug-bounty-faq-q6-content-1": "El envío anónimo o con un seudónimo puede hacerse, pero no le permitirá optar a las recompensas de ETH/DAI. Para poder optar a ellas, necesitamos saber su nombre real, junto con una prueba de identidad. Para donar su recompensa a una organización benéfica no es necesario su identidad.", diff --git a/src/intl/es/page-dapps.json b/src/intl/es/page-dapps.json index 6d3607e274e..05da20aaa59 100644 --- a/src/intl/es/page-dapps.json +++ b/src/intl/es/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "Logo de 1 pulgada", - "page-dapps-dexguru-logo-alt": "Logo de DexGuru", "page-dapps-aave-logo-alt": "Logo de Aave", "page-dapps-add-button": "Sugerir DApp", "page-dapps-add-title": "Añadir DApp", + "page-dapps-ankr-logo-alt": "Logotipo de Ankr", + "page-dapps-api3-logo-alt": "Logotipo de API3", + "page-dapps-arweave-logo-alt": "Logotipo de ARweave", "page-dapps-audius-logo-alt": "Logo de Audius", "page-dapps-augur-logo-alt": "Logo de Augur", "page-dapps-axie-infinity-logo-alt": "Logo de Axie Infinity", "page-dapps-balancer-logo-alt": "Logo de Balancer", "page-dapps-brave-logo-alt": "Logo de Brave", + "page-dapps-beginner-friendly-description": "Algunas DApps son buenas para principiantes. Explore más DApps a continuación.", + "page-dapps-beginner-friendly-header": "Aptas para principiantes", "page-dapps-category-arts": "Arte y moda", "page-dapps-category-browsers": "Buscadores", + "page-dapps-category-code-marketplaces": "Plataformas de código", "page-dapps-category-collectibles": "Coleccionables digitales", - "page-dapps-category-competitive": "Concurso", + "page-dapps-category-competitive": "Juegos Web3", "page-dapps-category-computing": "Herramientas para desarrolladores", - "page-dapps-category-dex": "Intercambios de token", - "page-dapps-category-investments": "Inversiones", + "page-dapps-category-dex": "Intercambios", + "page-dapps-category-investments": "Fondos de inversión", "page-dapps-category-lending": "Prestar y pedir prestado", "page-dapps-category-lottery": "Micromecenazgo", "page-dapps-category-marketplaces": "Mercados", "page-dapps-category-music": "Música", "page-dapps-category-payments": "Pagos", "page-dapps-category-insurance": "Seguros", - "page-dapps-category-portfolios": "Porfolios", - "page-dapps-category-trading": "Mercados predictivos y comerciales", + "page-dapps-category-portfolios": "Administración de portafolio", + "page-dapps-category-trading": "Predicción de mercados", "page-dapps-category-utilities": "Utilidades", "page-dapps-category-worlds": "Mundos virtuales", + "page-dapps-category-demand-aggregator": "Agregadores de demanda", + "page-dapps-category-derivatives": "Derivados", + "page-dapps-category-liquid-staking": "Participación de liquidez", + "page-dapps-category-bridges": "Puentes", + "page-dapps-category-experiences": "Experiencias compartidas", + "page-dapps-category-guilds": "Gremios de rendimiento", + "page-dapps-category-avatar": "Avatares", "page-dapps-choose-category": "Elegir categoría", + "page-dapps-category-social": "Redes sociales", + "page-dapps-category-content": "Contenido", + "page-dapps-category-messaging": "Mensajería", + "page-dapps-category-identity": "Identidad", "page-dapps-collectibles-benefits-1-description": "Cuando el arte se tokeniza en Ethereum, puede demostrarse la titularidad para que todo el mundo la vea. Puede rastrear el viaje de la obra de arte desde su creación hasta su titular actual. Esto evita las falsificaciones.", "page-dapps-collectibles-benefits-1-title": "La titularidad es demostrable", "page-dapps-collectibles-benefits-2-description": "Pagar para transmitir música o comprar obras de arte es mucho más justo para los artistas. Con Ethereum hay menos necesidad de intermediarios. Y si se necesitan intermediarios, sus costes no son tan altos, porque las plataformas no necesitan pagar por la infraestructura de la red.", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "Estas son aplicaciones que se centran en la titularidad digital, incrementando el potencial de ingresos para los creadores e inventando nuevas formas de invertir en sus creadores preferidos y su trabajo.", "page-dapps-collectibles-title": "Arte y coleccionables descentralizados", "page-dapps-compound-logo-alt": "Logo de Compound", + "page-dapps-convex-logo-alt": "Logo de Convex", "page-dapps-cryptopunks-logo-alt": "Logo de CryptoPunks", "page-dapps-cryptovoxels-logo-alt": "Logo de Cryptovoxels", + "page-dapps-cyberconnect-logo-alt": "Logotipo de CyberConnect", "page-dapps-dapp-description-1inch": "Le ayuda a evitar el elevado desfase de precios mediante la agregación de los mejores precios.", "page-dapps-dapp-description-aave": "Preste sus tókenes para ganar intereses y retírelos en cualquier momento.", + "page-dapps-dapp-description-ankr": "Conjunto de diferentes productos de infraestructura Web3 para construir, ganar dinero, jugar y más, todo en la cadena de bloques.", + "page-dapps-dapp-description-api3": "Fuentes propias con referencias de precios que permiten las DApps en 10 redes (y sumando) para conectar en tiempo real la información de precios de los activos, incluyendo precios de criptomonedas y mercados de divisas.", + "page-dapps-dapp-description-arweave": "Almacenar datos permanentemente de manera sostenible con una única comisión principal.", "page-dapps-dapp-description-async-art": "Crea, colecciona y comercializa #ProgrammableArt, pinturas digitales divididas en «capas» que se pueden utilizar para afectar la imagen general. Cada maestro y capa es un token ERC721.", "page-dapps-dapp-description-audius": "Plataforma de streaming descentralizada. Escuchas = dinero para creadores, no etiquetas.", "page-dapps-dapp-description-augur": "Apueste por los resultados de los deportes, la economía y más eventos mundiales.", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "Gane tókenes por navegar y apoyar a sus creadores favoritos con ellos.", "page-dapps-dapp-description-cent": "Una red social donde puede ganar dinero publicando NFT.", "page-dapps-dapp-description-compound": "Preste sus tókenes para ganar intereses y retírelos en cualquier momento.", + "page-dapps-dapp-description-convex": "Convex permite a los proveedores de liquidez Curve, recibir cuotas de intercambio y reclamar CRV incrementado sin tener que bloquear su CRV.", "page-dapps-dapp-description-cryptopunks": "Compre, puje y ofrezca Punks a la venta: uno de los primeros tókenes coleccionables en Ethereum.", "page-dapps-dapp-description-cryptovoxels": "Cree galerías de arte, construya tiendas y compre tierras: un mundo virtual de Ethereum.", + "page-dapps-dapp-description-cyberconnect": "Protocolo de gráfico social descentralizado que ayuda a la red de DApps a efectuar y construir experiencias sociales personalizadas", "page-dapps-dapp-description-dark-forest": "Conquiste planetas en un universo infinito, generado por procedimientos y especificado criptográficamente.", "page-dapps-dapp-description-decentraland": "Coleccione, comercie con tierras virtuales en un mundo virtual que puede explorar.", "page-dapps-dapp-description-ens": "Nombres fáciles de usar para las direcciones de Ethereum y los sitios descentralizados.", "page-dapps-dapp-description-foundation": "Invierta en ediciones únicas de obras de arte digitales y piezas comerciales con otros compradores.", "page-dapps-dapp-description-gitcoin": "Gane criptomonedas trabajando en software de código abierto.", "page-dapps-dapp-description-gitcoin-grants": "Micromecenazgo para proyectos de la comunidad Ethereum con contribuciones ampliadas", + "page-dapps-dapp-description-gm": "Plataforma todo en uno para mensajería, foros y voz, que actualmente comparte las ganancias con los creadores", "page-dapps-dapp-description-gods-unchained": "Juego de cartas estratégicas. Jugando ganará cartas que puede vender en la vida real.", "page-dapps-dapp-description-golem": "Acceda a la potencia informática compartida o alquile sus propios recursos.", + "page-dapps-dapp-description-graph": "Un protocolo de indexación para realizar consultas en redes como Ethereum e IPFS.", + "page-dapps-dapp-description-ipfs": "Un protocolo hipermedia entre pares, diseñado para preservar y aumentar el conocimiento de la humanidad al hacer la web mejorable, resilente y más abierta.", "page-dapps-dapp-description-radicle": "Asegurar la colaboración entre pares sin intermediarios.", + "page-dapps-dapp-description-kyberswap": "Intercambia y gana con las mejores tarifas.", + "page-dapps-dapp-description-lido": "Staking simplificado y seguro para activos digitales.", "page-dapps-dapp-description-loopring": "Plataforma de intercambio de pares a pares creada para la velocidad.", "page-dapps-dapp-description-marble-cards": "Cree e intercambie tarjetas digitales únicas basadas en URL.", "page-dapps-dapp-description-matcha": "Busque múltiples intercambios para encontrar los mejores precios.", + "page-dapps-dapp-description-mirror": "Construida en Web3 y para Web3, la plataforma de publicación de Mirror supera los límites de la escritura en línea", + "page-dapps-dapp-description-multichain": "El router definitivo para Web3. Es una infraestructura desarrollada por interacciones arbitrarias a través de cadenas.", "page-dapps-dapp-description-nifty-gateway": "Compre obras en cadena a artistas de primer nivel, atletas, marcas y creadores.", "page-dapps-dapp-description-oasis": "Comercie, pida prestado y ahorre con Dai, una moneda estable de Ethereum.", "page-dapps-dapp-description-opensea": "Compre, venda, descubra e intercambie bienes de edición limitada.", "page-dapps-dapp-description-opera": "Envíe criptografía desde su navegador a comerciantes, otros usuarios y aplicaciones.", + "page-dapps-dapp-description-osuvox": "Avatares 3D viviendo en la cadena de bloques", "page-dapps-dapp-description-poap": "Obtenga NFT probando que estuvo en diferentes eventos virtuales o en persona. Úselos para participar en rifas, votar, colaborar o simplemente para presumir.", "page-dapps-dapp-description-polymarket": "Apueste por los resultados. Comercie en mercados de información.", "page-dapps-dapp-description-pooltogether": "Una lotería que no puede perder. Premios cada semana.", @@ -82,13 +113,19 @@ "page-dapps-dapp-description-rotki": "Herramienta de código abierto para realizar seguimientos de porfolios, análisis, contabilidad e informes de impuestos que respeta tu privacidad.", "page-dapps-dapp-description-krystal": "Una plataforma integral para acceder a todos sus servicios DeFi favoritos.", "page-dapps-dapp-description-rarible": "Cree, venda y compre coleccionables tokenizados.", + "page-dapps-dapp-description-rubic": "Agregador tecnológico de cadena cruzada para usuarios y DApps.", "page-dapps-dapp-description-sablier": "Envíe dinero en tiempo real.", + "page-dapps-dapp-description-skiff": "Correo electrónico, calendario, documentos y archivos cifrados de extremo a extremo que le dan el poder de comunicarse libremente.", + "page-dapps-dapp-description-spatial": "Cree su propio avatar y sus mundos 3D", + "page-dapps-dapp-description-spruce": "Apilar el código abierto para dejar el control de la identidad y los datos donde debería estar: con los usuarios.", + "page-dapps-dapp-description-status": "Diseñado para permitir el flujo libre de información, proteger el derecho a la privacidad, conversaciones seguras y promover la soberanía de los individuos.", "page-dapps-dapp-description-superrare": "Compre obras de arte digitales directamente de artistas o en mercados secundarios.", + "page-dapps-dapp-description-synthetix": "Synthetix es un protocolo para emitir y comercializar activos sintéticos.", "page-dapps-dapp-description-token-sets": "Estrategias de inversión criptográficas que se reequilibran automáticamente.", "page-dapps-dapp-description-tornado-cash": "Envíe transacciones anónimas en Ethereum.", "page-dapps-dapp-description-uniswap": "Intercambie tókenes simplemente o proporcione tókenes por un porcentaje de recompensas.", - "page-dapps-dapp-description-dexguru": "Terminal de intercambio sin custodia para comerciantes de DeFi", - "page-dapps-dapp-description-synthetix": "Synthetix es un protocolo para emitir y comercializar activos sintéticos.", + "page-dapps-dapp-description-xmtp": "Envíe mensajes entre cuentas de la cadena de bloques, incluyendo mensajes privados, alertas, anuncios y más.", + "page-dapps-dapp-description-yearn": "Yearn Finance es un agregador de rendimiento, que otorga a particulares, DAO y otros protocolos una forma de depositar activos financieros y recibir rendimiento.", "page-dapps-docklink-dapps": "Introducción a las dapps", "page-dapps-docklink-smart-contracts": "Contratos inteligentes", "page-dapps-dark-forest-logo-alt": "Logo de Dark Forest", @@ -104,9 +141,7 @@ "page-dapps-desc": "Encuentre una aplicación de Ethereum para probar.", "page-dapps-doge-img-alt": "Ilustración de un doge usando un ordenador", "page-dapps-editors-choice-dark-forest": "Juegue contra otros para conquistar planetas y probar la tecnología de escalado y privacidad de Ethereum de vanguardia. Tal vez uno para aquellos que ya están familiarizados con Ethereum.", - "page-dapps-editors-choice-description": "Unas pocas DApps con las que el equipo de ethereum.org está encantado. Explore más aplicaciones a continuación.", "page-dapps-editors-choice-foundation": "Invierta en cultura. Compre, comercie y venda obras de arte digitales exclusivas y moda de artistas, músicos y marcas increíbles.", - "page-dapps-editors-choice-header": "Opciones de los editores", "page-dapps-editors-choice-pooltogether": "Compre un boleto para la lotería sin pérdidas. Cada semana, el interés generado por todos los boletos juntos se envía a un afortunado ganador. Obtenga su dinero cuando quiera.", "page-dapps-editors-choice-uniswap": "Intercambie sus tókenes con facilidad. Un favorito de la comunidad que le permite intercambiar tókenes con gente a través de la red.", "page-dapps-ens-logo-alt": "Logo de Servicio Ethereum Name", @@ -156,8 +191,10 @@ "page-dapps-get-started-title": "Comenzar", "page-dapps-gitcoin-grants-logo-alt": "Logo de Gitcoin Grants", "page-dapps-gitcoin-logo-alt": "Logo de Gitcoin", + "page-dapps-gm-logo-alt": "Logotipo de gm.xyz", "page-dapps-gods-unchained-logo-alt": "Logo de Gods Unchained", "page-dapps-golem-logo-alt": "Logo de Golem", + "page-dapps-graph-logo-alt": "Logotipo de Graph", "page-dapps-radicle-logo-alt": "Logo de Radicle", "page-dapps-hero-header": "Herramientas y servicios basados en Ethereum", "page-dapps-hero-subtitle": "Las DApps son un movimiento creciente de aplicaciones que utilizan Ethereum para interrumpir modelos de negocio o inventar otros nuevos.", @@ -165,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "Un contrato inteligente es como un conjunto de reglas que viven en cadena para que todos vean y ejecuten exactamente de acuerdo con esas reglas. Imagínese una máquina expendedora: si le suministra suficientes fondos y hace la selección correcta, obtendrá el artículo que desee. Y al igual que las máquinas expendedoras, los contratos inteligentes pueden mantener fondos de la misma manera que su cuenta de Ethereum. Esto permite que el código medie en acuerdos y transacciones.", "page-dapps-how-dapps-work-p3": "Una vez que las DApps están desplegadas en la red Ethereum, no puede cambiarlas. Las DApps pueden descentralizarse porque están controladas por la lógica escrita en el contrato, no por un individuo o por una empresa.", "page-dapps-how-dapps-work-title": "Cómo funcionan las DApps", + "page-dapps-ipfs-logo-alt": "Logotipo de IPFS", + "page-dapps-kyberswap-logo-alt": "Logotipo de KyberSwap", "page-dapps-learn-callout-button": "Comenzar a crear", "page-dapps-learn-callout-description": "Nuestro portal de desarrolladores de la comunidad tiene documentos, herramientas y marcos para ayudarle a comenzar a crear una DApp.", "page-dapps-learn-callout-image-alt": "Imagen de una mano construyendo un símbolo ETH con ladrillos de Lego.", "page-dapps-learn-callout-title": "Aprenda a crear una DApp", + "page-dapps-lido-logo-alt": "Logotipo de Lido", "page-dapps-loopring-logo-alt": "Logo de Loopring", "page-dapps-magic-behind-dapps-description": "Las DApps pueden parecer aplicaciones normales. Pero entre bastidores tienen algunas cualidades especiales, dado que heredan todos los superpoderes de Ethereum. Esto es lo que hace que las DApps sean diferentes de las aplicaciones.", "page-dapps-magic-behind-dapps-link": "¿Qué hace que Ethereum sea genial?", @@ -179,22 +219,42 @@ "page-dapps-marble-cards-logo-alt": "Logo de marble.cards", "page-dapps-async-logo-alt": "Logo Async", "page-dapps-matcha-logo-alt": "Logo de Matcha", + "page-dapps-metaverse-benefits-title": "metaverso", + "page-dapps-metaverse-benefits-description": "¿Qué hay en Ethereum que le permite prosperar al metaverso?", + "page-dapps-metaverse-benefits-1-title": "NTF", + "page-dapps-metaverse-benefits-1-description": "Los objetos únicos dentro de los juegos son propios de los usuarios e interoperables a través de mundos virtuales y plataformas que admiten los mismos estándares.", + "page-dapps-metaverse-benefits-2-title": "Comunidades propias del usuario", + "page-dapps-metaverse-benefits-2-description": "Las identidades son propias de los usuarios con oportunidades sin límites para explorar y crear redes sociales a través de múltiples mundos virtuales.", + "page-dapps-metaverse-button": "Metaverso", + "page-dapps-metaverse-title": "Metaverso", + "page-dapps-metaverse-description": "Hay aplicaciones que le permiten a los usuarios participar libremente en mundos virtuales. Los usuarios pueden formar redes personales y ser los propietarios de activos digitales", + "page-dapps-mirror-logo-alt": "Logotipo de Mirror", "page-dapps-mobile-options-header": "Buscar otra categoría", + "page-dapps-multichain-logo-alt": "Logotipo de Multichain", "page-dapps-nifty-gateway-logo-alt": "Logo de Nifty Gateway", "page-dapps-oasis-logo-alt": "Logo de Oasis", "page-dapps-opensea-logo-alt": "Logo de OpenSea", "page-dapps-opera-logo-alt": "Logo de Opera", + "page-dapps-osuvox-logo-alt": "Logotipo de OSUVOX", "page-dapps-polymarket-logo-alt": "Logo de Polymarket", "page-dapps-poap-logo-alt": "Logo de Proof of Attendance Protocol", "page-dapps-pooltogether-logo-alt": "Logo de PoolTogether", "page-dapps-rarible-logo-alt": "Logo de Rarible", "page-dapps-ready-button": "Ir", - "page-dapps-ready-description": "Elija una dapp para probar", + "page-dapps-ready-description": "Elija una DApp para probar", "page-dapps-ready-title": "¿Listo?", + "page-dapps-rubic-logo-alt": "Logotipo de Rubic", "page-dapps-sablier-logo-alt": "Logo de Sablier", "page-dapps-set-up-a-wallet-button": "Encontrar cartera", - "page-dapps-set-up-a-wallet-description": "Una cartera es su inicio de sesión para una dapp", + "page-dapps-set-up-a-wallet-description": "Una cartera es su inicio de sesión para una DApp", "page-dapps-set-up-a-wallet-title": "Configurar una cartera", + "page-dapps-skiff-logo-alt": "Logotipo de Skiff", + "page-dapps-social-button": "Social", + "page-dapps-social-description": "Estas son aplicaciones que se centran en crear redes sociales descentralizadas utilizando tecnologías de identidad también descentralizadas donde las identidades digitales y las huellas sociales son propiedad de los usuarios.", + "page-dapps-social-title": "Social", + "page-dapps-spatial-logo-alt": "Logotipo de Spatial", + "page-dapps-spruce-logo-alt": "Logotipo de Spruce", + "page-dapps-status-logo-alt": "Logotipo de Status", "page-dapps-superrare-logo-alt": "Logo de SuperRare", "page-dapps-technology-button": "Tecnología", "page-dapps-technology-description": "Estas son aplicaciones que se centran en descentralizar las herramientas de los desarrolladores, incorporar sistemas criptoeconómicos a la tecnología existente y crear mercados para el trabajo de desarrollo de código abierto.", @@ -214,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "Más sobre objetos de juegos tokenizados", "page-dapps-dapp-description-pwn": "Préstamos fáciles respaldados por cualquier token o NFT en Ethereum.", "page-dapps-pwn-image-alt": "Logo de PWN", - "page-dapps-dapp-description-yearn": "Yearn Finance es un agregador de rendimiento, que otorga a particulares, DAO y otros protocolos una forma de depositar activos financieros y recibir rendimiento.", + "page-dapps-xmtp-logo-alt": "Logotipo de XMTP", + "opage-dapps-yearn-logo-alt": "Logo de Yearn", "page-dapps-yearn-image-alt": "Logo de Yearn", - "page-dapps-dapp-description-convex": "Convex permite a los proveedores de liquidez Curve, recibir cuotas de intercambio y reclamar CRV incrementado sin tener que bloquear su CRV.", "page-dapps-convex-image-alt": "Logo de Convex", "foundation": "Foundation", "transaction-fees": "¿Cuáles son las tarifas de transacción?", - "page-wallets-get-some": "Obtener ETH" + "page-wallets-get-some": "Obtener ETH", + "page-dapps-dapp-description-curve": "Curvees un intercambio descentralizado (DEX) enfocado en las monedas estables", + "page-dapps-curve-image-alt": "Logotipo de Curve", + "page-dapps-dapp-description-dodo": "DODO es un proveedor de liquidez en la cadena, que aprovecha el algoritmo creador proactivo de mercado (o PMM, por sus siglas en inglés)", + "page-dapps-dodo-image-alt": "Logotipo de DODO", + "page-dapps-dapp-description-artblocks": "Art Blocks se dedica a dar vida a fascinantes obras de arte generativo contemporáneo", + "page-dapps-artblocks-image-alt": "Logotipo de Art Blocks" } diff --git a/src/intl/es/page-gas.json b/src/intl/es/page-gas.json new file mode 100644 index 00000000000..36f0ac1d134 --- /dev/null +++ b/src/intl/es/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Tarifas de gas en Ethereum: ¿cómo funcionan?", + "page-gas-meta-description": "Descubra más cosas sobre el gas en Ethereum: cómo funciona y cómo pagar menos en tarifas de gas", + "page-gas-hero-title": "Tarifas de gas", + "page-gas-hero-header": "Tarifas de red", + "page-gas-hero-button-1-content": "¿Qué es el gas?", + "page-gas-hero-subtitle-1": "A las tarifas de red en Ethereum se les denomina gas.", + "page-gas-hero-subtitle-2": "El gas es el combustible que potencia a Ethereum.", + "page-gas-summary-title": "Resumen", + "page-gas-summary-item-1": "Cada transacción en Ethereum requiere una pequeña forma de pago para su procesamiento", + "page-gas-summary-item-2": "A estas tarifas se les denomina tarifa de gas", + "page-gas-summary-item-3": "Las tarifas de gas cambian de acuerdo a la congestión de la red", + "page-gas-what-are-gas-fees-header": "¿Qué son las tarifas de gas?", + "page-gas-what-are-gas-fees-text-1": "Piensa en Ethereum como una larga red de computadoras donde las personas pueden hacer tareas como enviar mensajes o correr programas. Al igual que en la vida real, estas tareas requieren energías para ser realizadas.", + "page-gas-what-are-gas-fees-text-2": "En Ethereum, cada acción computacional tiene establecido un precio de «gas». Sus tarifas de gas son el coste total de las acciones en su transacción. Cuando envía una transacción o ejecuta un contrato inteligente, paga en tarifas de gas para procesarlos.", + "page-gas-how-do-i-pay-less-gas-header": "¿Cómo puedo pagar menos gas?", + "page-gas-how-do-i-pay-less-gas-text": "Mientras que en ocasiones pagar una tarifa alta de gas en Ethereum es inevitable, hay estrategias que puede usar para reducir el coste:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Programe sus transacciones", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Al igual que en los desplazamientos fuera de las horas punta se encuentra menos tráfico y es más cómodo, Ethereum suele ser más barato de usar cuando Norteamérica está dormida.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Espere a que el gas baje", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Los precios de gas suben y bajan cada doce segundos en función del estado de congestión de Ethereum. Cuando los precios de gas son altos, esperar algunos minutos antes de hacer una transacción puede representar una caída significativa en lo que paga.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Utilizar la capa 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Las cadenas de capa 2 están construidas sobre Ethereum, ofreciendo tarifas bajas y la gestión de más transacciones. Estas son una buena opción para ahorrar en tarifas para transacciones que no requieren realizarse en la red principal de Ethereum.", + "page-gas-try-layer-2": "Pruebe la capa 2", + "page-gas-what-causes-high-gas-fees-header": "¿Qué hace que las tarifas de gas sean altas?", + "page-gas-what-causes-high-gas-fees-text-1": "Siempre que la cantidad de cálculo (gas) en Ethereum excede un cierto umbral, las tarifas del gas comienzan a aumentar. Cuanto más supere el gas este umbral, más rápido aumentarán las tarifas del gas.", + "page-gas-what-causes-high-gas-fees-text-2": "El aumento de las tarifas podría proceder de cosas como DApps populares o NFT, de un aumento periódico del intercambio en DEX, o de una abrumadora actividad de sus usuarios en horas punta.", + "page-gas-what-causes-high-gas-fees-text-3": "Los desarrolladores en Ethereum deben encargarse de optimizar sus contratos inteligentes antes de desplegarlos. Si muchas personas están usando un contrato inteligente pésimamente escrito, este consumirá más gas y sin notarlo podría causar una congestión en la red.", + "page-gas-want-to-dive-deeper": "¿Quiere profundizar más sobre este tema?", + "page-gas-check-out-the-developer-docs": "Revise la documentación para desarrolladores.", + "page-gas-attack-of-the-cryptokitties-header": "Ataque de Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "En noviembre de 2017, se lanzó el popular proyecto de CryptoKitties. Su rápido aumento de popularidad causó una congestión significativa en la red y unas tarifas de gas extremadamente altas. Los desafíos que planteó CryptoKitties aceleraron la urgencia de encontrar soluciones para la escalabilidad de Ethereum.", + "page-gas-why-do-we-need-gas-header": "¿Por qué necesitamos gas?", + "page-gas-why-do-we-need-gas-text": "El gas es un elemento vital para velar por la seguridad de Ethereum y procesar transacciones. El gas ayuda de varias maneras:", + "page-gas-benefits-1-description": "El gas mantiene la resistencia de Ethereum ante ataques Sybil, al prevenir que individuos maliciosos sobrecarguen la red con actividades fraudulentas.", + "page-gas-benefits-2-description": "Como la computación cuesta gas, se desmotiva financieramente sobrecargar a Ethereum con transacciones costosas, ya sean accidentales o maliciosas.", + "page-gas-benefits-3-description": "En cualquier momento, puede aplicarse un límite estricto en la cantidad de computación para prevenir la sobrecarga de Ethereum, lo que permite garantizar que la red siempre esté accesible.", + "page-gas-how-is-gas-calculated-header": "¿Cómo se calcula el gas?", + "page-gas-advanced": "Recursos avanzados", + "page-gas-how-is-gas-calculated-text-1": "La tarifa total de gas que pague se compondrá de cuatro partes:", + "page-gas-how-is-gas-calculated-item-1": "Tarifa base: la tarifa establecida por la red que debe pagar una transacción.", + "page-gas-how-is-gas-calculated-item-2": "Tarifa de prioridad: una propina opcional para incentivar a los operadores del nodo a que incluyan su transacción.", + "page-gas-how-is-gas-calculated-item-3": "Unidades de gas usadas*: si recuerda bien, hemos mencionado anteriormente que el gas representa la computación. Pues acciones más complejas como interactuar con un contrato inteligente usan más gas que las simples, como enviar una transacción.", + "page-gas-how-is-gas-calculated-list-item-1": "* Véase la Figura 1 para comprender cuánto gas utilizan los distintos tipos de transacciones.", + "page-gas-how-is-gas-calculated-text-2": "La fórmula para calcular una tarifa de gas corresponde a las unidades de gas usadas * (tarifa base + tarifa de prioridad). Muchas billeteras calcularán el uso de gas y lo mostrarán de una manera más sencilla.", + "page-gas-table-figure": "Figura 1: Gas usado por tipo de transacción", + "page-gas-table-header-1": "Tipo de transacción", + "page-gas-table-header-2": "Unidades de gas usado", + "page-gas-table-item-1-transaction-type": "Enviar ETH", + "page-gas-table-item-2-transaction-type": "Enviar tókenes ERC-20", + "page-gas-table-item-3-transaction-type": "Transfirir y NFT", + "page-gas-table-item-4-transaction-type": "Intercambiar en Uniswap", + "page-gas-faq-header": "Preguntas frecuentes", + "page-gas-faq-question-1-q": "¿Quién recibe el pago por la tarifa de gas en mi transacción?", + "page-gas-faq-question-1-a-1": "El protocolo destruye (quema) la mayor parte de la tarifa de gas, es decir, la tarifa base. La tarifa de prioridad, si está incluida en su transacción, se le proporcionará al validador que haya propuesto su transacción.", + "page-gas-faq-question-1-a-2": "Puedes leer una descripción detallada del proceso en la documentación del desarrollador de gas.", + "page-gas-faq-question-2-q": "¿Necesito pagar el gas en ETH?", + "page-gas-faq-question-2-a-1": "Sí, todas las tarifas de gas en Ethereum deben pagarse en la moneda nativa ETH.", + "page-gas-faq-question-2-a-2": "Más sobre ETH", + "page-gas-faq-question-3-q": "¿Qué es gwei?", + "page-gas-faq-question-3-a-1": "En muchas billeteras o rastreadores de gas, verá los precios de gas expresados en «gwei».", + "page-gas-faq-question-3-a-2": "Gwei es una denominación más pequeña de ETH, al igual que los céntimos lo son del euro o los centavos del dolar, con la salvedad de que 1 ETH equivale a 1.000 millones de gwei. El gwei es útil cuando hablamos sobre cantidades muy pequeñas de ETH.", + "page-gas-use-layer-2": "Utilizar la capa 2" +} diff --git a/src/intl/es/page-languages.json b/src/intl/es/page-languages.json index 261da4bb493..766f0a7d674 100644 --- a/src/intl/es/page-languages.json +++ b/src/intl/es/page-languages.json @@ -12,10 +12,13 @@ "page-languages-want-more-link": "Programa de traducción", "page-languages-want-more-paragraph": "Los traductores de ethereum.org siempre traducen páginas a tantos idiomas como sea posible. Para ver en qué están trabajando ahora mismo o para registrarse y unirse a ellos, lea acerca de nuestro", "page-languages-filter-placeholder": "Filtrar", + "langauge-am": "Amárico", "language-ar": "Árabe", "language-az": "Azerbaiyano", + "langauge-be": "Bielorruso", "language-bg": "Búlgaro", "language-bn": "Bengalí", + "language-bs": "Bosnio", "language-ca": "Catalán", "language-cs": "Checo", "language-da": "Danés", @@ -32,6 +35,7 @@ "language-hi": "Hindi", "language-hr": "Croata", "language-hu": "Húngaro", + "language-hy-am": "Armenio", "language-id": "Indonesio", "language-ig": "Igbo", "language-it": "Italiano", @@ -39,12 +43,14 @@ "language-ka": "Georgiano", "language-kk": "Kazajo", "language-km": "Jemer", + "language-kn": "Canarés", "language-ko": "Coreano", "language-lt": "Lituano", "language-ml": "Malabar", "language-mr": "Maratí", "language-ms": "Malayo", "language-nb": "Noruego", + "language-ne-np": "Nepalí", "language-nl": "Holandés", "language-pcm": "Pidgin nigeriano", "language-fil": "Filipino", @@ -58,8 +64,9 @@ "language-sl": "Esloveno", "language-sr": "Serbio", "language-sw": "Suajili", - "language-th": "Tailandés", "language-ta": "Tamil", + "language-th": "Tailandés", + "language-tk": "Turcomano", "language-tr": "Turco", "language-uk": "Ucraniano", "language-ur": "Urdu", diff --git a/src/intl/es/page-layer-2.json b/src/intl/es/page-layer-2.json index e4283aaffc8..7cb0cf920cc 100644 --- a/src/intl/es/page-layer-2.json +++ b/src/intl/es/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "zkSync es una plataforma de agrupaciones de conocimiento ceo de Matter Labs centrada en el usuario. Es una solución de escalabilidad para Ethereum que ya existe en la red principal de Ethereum. Soporta pagos, intercambio de tókenes y la acuñación (o minting) de NFT.", "zkspace-description": "La plataforma ZKSpace consiste de tres partes principales: un capa 2 de AMM DEX ―que utiliza una tecnología de ZK-rollups llamada ZKSwap― un servicio de pago llamado ZKSquare y una plataforma intermediaria de NFT llamada ZKSea.", "aztec-description": "Aztec Network es la primera agrupación de conocimiento cero privada de Ethereum, que permite a las aplicaciones descentralizadas privacidad y escalabilidad.", + "starknet-description": "Starknet es una capa acumulativa de validez 2, proporciona un alto rendimiento, bajos costes de gas y retiene los niveles de seguridad de la capa 1 de Ethereum.", "layer-2-note": "Nota:", "layer-2-ecosystem-portal": "Portal del ecosistema", "layer-2-token-lists": "Listas de tókenes", diff --git a/src/intl/es/page-learn.json b/src/intl/es/page-learn.json index b24fca8d272..785de803069 100644 --- a/src/intl/es/page-learn.json +++ b/src/intl/es/page-learn.json @@ -11,7 +11,7 @@ "hero-subtitle": "Su guía educativa para el mundo de Ethereum. Conozca el funcionamiento de Ethereum y cómo conectarse a él. Esta página incluye artículos técnicos y no técnicos, guías y recursos.", "hero-button-lets-get-started": "¡Comencemos!", "what-is-crypto-1": "Puede que haya oído hablar de las criptomonedas, las cadenas de bloques y los bitcoins. Los siguientes enlaces le ayudarán a saber lo que son y cómo se relacionan con Ethereum.", - "what-is-crypto-2": "Criptomonedas, como el bitcoin, permiten que cualquiera transfiera dinero a cualquier rincón del mundo. Ethereum también lo hace, con el añadido de que puede ejecutar un código que permite a las personas crear aplicaciones y organizaciones. Es resiliente y flexible a la vez, y cualquier programa informático puede ejecutar Ethereum. Conozca más detalles y descubra cómo empezar:", + "what-is-crypto-2": "Las criptomonedas, tales como bitcoin, permiten a cualquiera transferir dinero de manera global. Ethereum también lo permite y además es capaz de ejecutar un código que permite a las personas crear aplicaciones y organizaciones; es a la par resiliente y flexible. Cualquier programa informático puede ejecutarse en Ethereum. Conozca más detalles y entérese de cómo puede iniciarse en el universo Ethereum:", "what-is-ethereum-card-title": "¿Qué es Ethereum?", "what-is-ethereum-card-description": "Si es nuevo, empiece aquí a saber por qué Ethereum importa.", "what-is-ethereum-card-image-alt": "Ilustración de una persona mirando en un bazar, que pretende representar a Ethereum.", diff --git a/src/intl/es/page-stablecoins.json b/src/intl/es/page-stablecoins.json index b319c104e18..5fdcb3f220d 100644 --- a/src/intl/es/page-stablecoins.json +++ b/src/intl/es/page-stablecoins.json @@ -7,10 +7,10 @@ "page-stablecoins-accordion-borrow-places-intro": "Estas DApps le permiten pedir prestadas monedas estables usando criptomonedas como garantía. Algunos aceptan otros tókenes, así como ETH.", "page-stablecoins-accordion-borrow-places-title": "Lugares para pedir prestadas monedas estables", "page-stablecoins-accordion-borrow-requirement-1": "Una cartera de Ethereum", - "page-stablecoins-accordion-borrow-requirement-1-description": "Necesitará una cartera para usar una dapp", + "page-stablecoins-accordion-borrow-requirement-1-description": "Necesitará una cartera para usar una DApp", "page-stablecoins-accordion-borrow-requirement-2": "Ether (ETH)", "page-stablecoins-accordion-borrow-requirement-2-description": "Necesitará ETH para las comisiones de garantía o transacción", - "page-stablecoins-accordion-borrow-requirements-description": "Para pedir prestadas monedas estables, tendrá que usar la dapp correcta. También necesitará una cartera y ETH.", + "page-stablecoins-accordion-borrow-requirements-description": "Para pedir prestadas monedas estables, tendrá que usar la DApp correcta. También necesitará una cartera y ETH.", "page-stablecoins-accordion-borrow-risks-copy": "Si utiliza ETH como garantía y su valor cae, su garantía no cubrirá las monedas estables que generó. Esto provocará la liquidación de sus ETH y puede enfrentarse a una penalización. Así que, si pide prestadas monedas estables, tendrá que vigilar el precio del ETH.", "page-stablecoins-accordion-borrow-risks-link": "Último precio del ETH", "page-stablecoins-accordion-borrow-risks-title": "Riesgos", @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "Dinero fiduciario", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "Metales preciosos", "page-stablecoins-table-error": "No se pudieron cargar las monedas estables. Intente actualizar la página.", + "page-stablecoins-table-loading": "Cargando datos de monedas estables...", "page-stablecoins-title": "Monedas estables", "page-stablecoins-top-coins": "Mejores monedas estables por capitalización de mercado", "page-stablecoins-top-coins-intro": "La capitalización del mercado es", diff --git a/src/intl/es/page-staking.json b/src/intl/es/page-staking.json index 26bdd76352d..5629ade2175 100644 --- a/src/intl/es/page-staking.json +++ b/src/intl/es/page-staking.json @@ -231,7 +231,7 @@ "page-staking-meta-description": "Una descripción general de las apuestas de Ethereum: los riesgos, las recompensas, los requisitos y dónde hacerlo.", "page-staking-meta-title": "Apuestas en Ethereum", "page-staking-withdrawals-important-notices": "Avisos importantes", - "page-staking-withdrawals-important-notices-desc": "Las retiradas de fondos aún no están disponibles. Para más información, consulte Preguntas frecuentes sobre la fusión ETh2 y sus efectos posteriores.", + "page-staking-withdrawals-important-notices-desc": "Las retiradas de fondos aún no están disponibles. Para más información, consulte Preguntas frecuentes sobre La Fusión ETh2 y sus efectos posteriores.", "page-upgrades-merge-btn": "Más sobre la fusión", "subscribe-to-ef-blog": "Suscríbase al blog de EF para recibir notificaciones por correo electrónico de los últimos anuncios de protocolo." } diff --git a/src/intl/es/page-upgrades-index.json b/src/intl/es/page-upgrades-index.json index 251698ff4f6..bb504573c12 100644 --- a/src/intl/es/page-upgrades-index.json +++ b/src/intl/es/page-upgrades-index.json @@ -9,11 +9,11 @@ "consensus-client-prysm-logo-alt": "Logotipo de Prysm", "consensus-client-teku-logo-alt": "Logotipo de Teku", "page-upgrades-answer-1": "La cadena de baliza se utilizó como herramienta para actualizar la red principal de Ethereum en La Fusión.", - "page-upgrades-answer-2": "La Fusión supuso la actualización más sustancial realizada hasta el momento en Ethereum, y en ella se pasó de la prueba de trabajo a una prueba de participación basada en una capa de consenso.", + "page-upgrades-answer-2": "La Fusión supuso la actualización más destacada realizada hasta el momento en Ethereum, y en ella se pasó de la prueba de trabajo a una prueba de participación basada en una capa de consenso.", "page-upgrades-answer-4": "La cadena de baliza se utilizó para desarrollar el consenso basado en una prueba de participación que Ethereum utiliza hoy en día. Se ejecutó por separado a la red principal de Ethereum, para que los desarrolladores pudieran observar el mecanismo de consenso de forma aislada antes de utilizarlo para coordinar la actividad real.", "page-upgrade-article-author-status": "Estado", "page-upgrade-article-author-ethmerge": "La Fusión de Ethereum", - "page-upgrade-article-author-alchemy": "Alquimia", + "page-upgrade-article-author-alchemy": "Alchemy", "page-upgrade-article-author-consensys": "Consensys", "page-upgrade-article-author-delphi-digital": "Delphi Digital", "page-upgrade-article-author-eip-4844": "Vitalik Buterin, Dankrad Feist, Diederik Loerakker, George Kadianakis, Matt Garnett, Mofi Taiwo", @@ -21,9 +21,9 @@ "page-upgrade-article-author-vitalik-buterin": "Vitalik Buterin", "page-upgrade-article-author-ethos-dev": "Ethos.dev", "page-upgrade-article-title-two-point-oh": "2.0: la cadena de baliza", - "page-upgrade-article-title-beacon-chain-explainer": "La descripción de la cadena de baliza Ethereum 2.0 que necesita leer primero", + "page-upgrade-article-title-beacon-chain-explainer": "La descripción de la cadena de baliza en Ethereum 2.0 que necesita leer primero", "page-upgrade-article-title-sharding-consensus": "Consenso de fragmentación", - "page-upgrade-article-title-sharding-is-great": "Por qué la fragmentación es buena: desmitificar las propiedades técnicas", + "page-upgrade-article-title-sharding-is-great": "Por qué la fragmentación funciona de maravillas: desmitificar las propiedades técnicas", "page-upgrade-article-title-rollup-roadmap": "Una hoja de ruta centrada en las acumulaciones (o «rollups»)", "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "La guía del autoestopista de Ethereum", "page-upgrade-article-title-eip-4844": "EIP-4844: Transacciones de cúmulos de fragmentos (Proto-Danksharding)", @@ -41,13 +41,13 @@ "page-upgrades-beacon-chain-estimate": "La cadena de baliza está en directo", "page-upgrades-beacon-chain-title": "La cadena de baliza", "page-upgrades-bug-bounty": "Ver el programa de recompensas por errores", - "page-upgrades-clients": "Revisar los clientes consensuados (conocidos anteriormente como clientes «Eth2»)", + "page-upgrades-clients": "Revisar los clientes de consenso (denominados anteriormente clientes «Eth2»)", "page-staking-deposit-contract-title": "Comprobar la dirección del contrato de depósito", "page-upgrades-dive": "Sumérjase en la visión", - "page-upgrades-dive-desc": "¿Cómo estamos consiguiendo que Ethereum sea más escalable, seguro y sostenible? Todo ello al tiempo mantenemos la ética regidora de descentralización de Ethereum.", + "page-upgrades-dive-desc": "¿Cómo estamos consiguiendo que Ethereum sea más escalable, seguro y sostenible? Y todo ello manteniendo el espíritu central de la descentralización de Ethereum.", "page-upgrades-docking": "La Fusión", "page-upgrades-merge-answer-1": "Al materializarse La Fusión, Ethereum pasó al consenso de prueba de participación el 15 de septiembre de 2022. La cadena de baliza se fusionó con la red principal, oficialmente en desuso de la prueba de trabajo en Ethereum, reduciendo así el consumo de energía de Ethereum en un ~99,95%.", - "page-upgrades-merge-btn": "Más información sobre La Fusión", + "page-upgrades-merge-btn": "Más sobre la fusión", "page-upgrades-merge-desc": "La red principal de Ethereum se fusionó con la cadena de baliza de prueba de participación, lo que marcó el final de la minería con consumo energético intensivo.\n", "page-upgrades-merge-estimate": "La Fusión ya se ha producido", "page-upgrades-merge-mainnet": "¿Qué es la red principal?", @@ -59,13 +59,13 @@ "page-upgrades-help": "¿Quiere ayudar con las actualizaciones de Ethereum?", "page-upgrades-help-desc": "Hay muchas oportunidades para opinar sobre las actualizaciones de Ethereum, ayudar con las pruebas e incluso ganar recompensas.", "page-upgrades-index-staking": "Es momento de apostar", - "page-upgrades-index-staking-desc": "\nLa clave de las actualizaciones de Ethereum es la introducción de la participación. Si desea utilizar su ETH para ayudar a proteger la red Ethereum, asegúrese de seguir estos pasos.", - "page-upgrades-index-staking-learn": "Más información sobre cómo apostar", + "page-upgrades-index-staking-desc": "La clave de las actualizaciones de Ethereum es la introducción de la participación. Si desea utilizar sus ETH para ayudar a proteger la red Ethereum, asegúrese de seguir estos pasos.", + "page-upgrades-index-staking-learn": "Más información sobre las participaciones", "page-upgrades-index-staking-learn-desc": "La cadena de baliza aportó participación a Ethereum. Si usted tiene ETH, puede hacer un bien público asegurando la red y ganando más ETH al mismo tiempo.", - "page-upgrades-index-staking-step-1": "1. Configurar con la plataforma de lanzamiento", - "page-upgrades-index-staking-step-1-btn": "Visitar la plataforma de lanzamiento de apuestas", + "page-upgrades-index-staking-step-1": "1. Configure con la plataforma de lanzamiento", + "page-upgrades-index-staking-step-1-btn": "Visite la plataforma de lanzamiento de apuestas", "page-upgrades-index-staking-step-1-desc": "Para apostar en Ethereum, deberá usar la plataforma de lanzamiento; esto le guiará a través del proceso.", - "page-upgrades-index-staking-step-2": "2. Confirmar la dirección de apuesta", + "page-upgrades-index-staking-step-2": "2. Confirme la dirección de participación", "page-upgrades-index-staking-step-2-btn": "Confirme la dirección del contrato de depósito", "page-upgrades-index-staking-step-2-desc": "Antes de apostar su ETH, asegúrese de verificar que tiene la dirección correcta. Debe haber pasado por la plataforma de lanzamiento antes de hacer esto.", "page-upgrades-index-staking-sustainability": "Más sostenible", @@ -76,7 +76,7 @@ "page-upgrades-question-1-desc": "Ethereum se está actualizando progresivamente; las actualizaciones son distintas con diferentes fechas de envío.", "page-upgrades-question-2-title": "¿Es la cadena de baliza una cadena de bloques separada?", "page-upgrades-question-2-desc": "Sí. La cadena de baliza fue el nombre que se le dio a una cadena de bloques de prueba de participación paralela, utilizada para actualizar la red principal de Ethereum. Ahora solo hay una cadena de bloques, formada por la fusión de la cadena de bloques de Ethereum original y la cadena de baliza.\n", - "page-upgrades-question-3-answer-2a": "La Fusión tuvo un impacto mínimo en los desarrolladores de dapp: todavía interactúan con Ethereum de la misma manera.", + "page-upgrades-question-3-answer-2a": "La Fusión tuvo un impacto mínimo en los desarrolladores de DApp: todavía interactúan con Ethereum de la misma manera.", "page-upgrades-question-3-answer-2a-link": "La Fusión y los desarrolladores de DApps", "page-upgrades-question-3-answer-2b": "Los planes de fragmentación siguen desarrollándose, pero se diseñarán pensando en las acumulaciones en capa 2.", "page-upgrades-layer-2-rollups": "Más información sobre las acumulaciones en capa 2", @@ -86,10 +86,10 @@ "page-upgrades-question-4-answer-1": "Cada vez que envía una transacción o usa una dapp en la actualidad, está usando la capa de ejecución, también conocida como red principal.", "page-upgrades-question-4-answer-3": "Desde La Fusión, los validadores aseguran toda la red mediante prueba de participación.", "page-upgrades-question-4-answer-6": "Cualquiera puede convertirse en validador si apuesta sus ETH.", - "page-upgrades-question-4-answer-7": "Más información acerca de cómo apostar", + "page-upgrades-question-4-answer-7": "Más información sobre las participaciones", "page-upgrades-question-4-title": "¿Qué es la capa de ejecución?", "page-upgrades-question-4-desc": "Antes de La Fusión, la cadena de bloques de Ethereum a veces se denominaba «Eth1». Este término se eliminó gradualmente a favor de la «capa de ejecución».", - "page-upgrades-question-5-answer-1": "Para convertirse en un validador en la red, deberá apostar 32 ETH. Si no tiene tanto, o no está dispuesto a apostar tanto, puede unirse a grupos de apuestas. Estos grupos le permitirán apostar menos y ganar fracciones de las recompensas totales.", + "page-upgrades-question-5-answer-1": "Para convertirse en un validador en la red, deberá apostar 32 ETH. Si no tiene tanto, o no está dispuesto a apostar tanto, puede unirse a grupos de participaciones. Estos grupos le permitirán apostar menos y ganar fracciones de las recompensas totales.", "page-upgrades-question-5-desc": "Tendrá que usar la plataforma de lanzamiento de apuestas o unirse a un grupo de apuestas.", "page-upgrades-question-5-title": "¿Cómo puedo apostar?", "page-upgrades-question-6-answer-3": "Danny Ryan, de Ethereum Foundation, mantiene regularmente al corriente a la comunidad:", @@ -117,15 +117,15 @@ "page-upgrades-question-8-answer-1": "Las actualizaciones de Ethereum ayudarán a Ethereum a escalar de forma descentralizada, manteniendo la seguridad y aumentando la sostenibilidad.", "page-upgrades-question-8-answer-2": "Tal vez el problema más obvio sea que Ethereum necesita poder manejar más de 15 a 45 transacciones por segundo. No obstante, las actualizaciones también abordan otros problemas actuales con Ethereum.", "page-upgrades-question-8-answer-3": "En momentos de alta demanda, la red hace que Ethereum sea caro de usar. Los nodos en la red tienen que afrontar el tamaño de Ethereum y la cantidad de datos que sus computadoras tienen que procesar. El algoritmo original que sustentaba la seguridad y la descentralización de Ethereum requería mucha energía y tenía ser más ecológico.", - "page-upgrades-question-8-answer-4": "Mucho de lo que está cambiando siempre ha estado en la hoja de ruta de Ethereum, incluso desde 2015. Sin embargo, las condiciones actuales hacen que se requieran actualizaciones aún mayores.", + "page-upgrades-question-8-answer-4": "Mucho de lo que está cambiando ha estado siempre en la hoja de ruta de Ethereum, incluso desde 2015. Sin embargo, las condiciones actuales hacen que se requieran actualizaciones aún mayores.", "page-upgrades-question-8-answer-6": "Explore la visión de Ethereum", "page-upgrades-question-8-desc": "El Ethereum que utilizamos hoy en día necesita ofrecer una mejor experiencia a los usuarios finales y a los participantes de la red.", "page-upgrades-question-8-title": "¿Por qué se necesitan actualizaciones?", "page-upgrades-question-9-answer-1": "El rol más activo que puede desempeñar es apostar sus ETH.", "page-upgrades-question-9-answer-2": "También puede que desee ejecutar un segundo cliente para ayudar a mejorar la diversidad de los clientes.", - "page-upgrades-question-9-answer-3": "Si usted es más técnico, puede ayudar a detectar errores en los nuevos clientes.", + "page-upgrades-question-9-answer-3": "Si usted tiene un perfil más técnico, puede ayudar a detectar errores en los nuevos clientes.", "page-upgrades-question-9-answer-4": "También puede influir en los debates técnicos con investigadores de Ethereum en ethresear.ch.", - "page-upgrades-question-9-desc": "No tiene que tener un perfil técnico para contribuir, la comunidad se nutre de aportaciones de todo tipo de conjuntos de habilidades.", + "page-upgrades-question-9-desc": "No es necesario tener un perfil técnico para contribuir; la comunidad se nutre de aportaciones de todo tipo de conjuntos de habilidades.", "page-upgrades-question-9-stake-eth": "Apostar ETH", "page-upgrades-question-9-title": "¿Cómo puedo contribuir a las actualizaciones de Ethereum?", "page-upgrades-question-9-more": "Encuentre formas más generales de involucrarse con Ethereum", @@ -142,7 +142,7 @@ "page-upgrades-question-10-answer-8": "Más información sobre la hoja de ruta centrada en las acumulaciones", "page-upgrades-question-11-title": "¿Puedo comprar Eth2?", "page-upgrades-question-11-desc": "No. No hay token Eth2 y su ETH no ha cambiado después de La Fusión.", - "page-upgrades-question-11-answer-1": "Una de las fuerzas impulsoras detrás del cambio de nombre Eth2 fue la idea errónea común de que los titulares de ETH debían migrar su ETH a 'ETH 2.0' después de La Fusión o cualquier otra actualización. Esto no es cierto y nunca lo ha sido.", + "page-upgrades-question-11-answer-1": "Una de las fuerzas impulsoras detrás del cambio de nombre Eth2 fue la idea común y errónea de que los titulares de ETH debían migrar su ETH a «ETH 2.0» después de La Fusión o cualquier otra actualización. Esto no es cierto y nunca lo ha sido.", "page-upgrades-question-11-answer-2": " Esta confusión es comúnmente explotada por estafadores.", "page-upgrades-question-title": "Preguntas más frecuentes", "page-upgrades-question3-answer-1": "Los propietarios de ETH no necesitan hacer nada, no tienen que cambiar ni actualizar sus ETH. Seguramente habrá estafas que dirán lo contrario, ¡vaya con cuidado!", @@ -176,7 +176,7 @@ "page-roadmap-vision-desc": "Para incorporar Ethereum a la sociedad y que sirva a todas las personas, debemos conseguir que sea más escalable, seguro y sostenible.", "page-upgrades-what-happened-to-eth2-title": "¿Qué pasó con «Eth2»?", "page-upgrades-what-happened-to-eth2-1": "El término «Eth2» se utilizaba comúnmente antes de La Fusión, pero se está eliminando a favor de una terminología más precisa.", - "page-upgrades-what-happened-to-eth2-1-more": "Más información sobre la fusión.", + "page-upgrades-what-happened-to-eth2-1-more": "Más información sobre La Fusión.", "page-upgrades-what-happened-to-eth2-2": "Desde que se fusionaron «Eth1» y «Eth2», ya no hay dos cadenas de bloque Ethereum; solo Ethereum.", "page-upgrades-what-happened-to-eth2-3": "Para evitar mayor confusión, la comunidad ha actualizado estos términos:", "page-upgrades-what-happened-to-eth2-3-1": "«Eth1» es ahora la«capa de ejecución», que se encarga de las transacciones y ejecución.", @@ -187,7 +187,7 @@ "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "Patrones mentales", "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Un problema importante con el término Eth2 es que crea un modelo mental inconexo para los nuevos usuarios de Ethereum. Creen intuitivamente que Eth1 es el primero que se ha creado y que Eth2 viene después. O que Eth1 deja de existir una vez que Eth2 aparece. Ninguna de estas afirmaciones es cierta. Al eliminar el término Eth2, evitamos la confusión que produciría en futuros usuarios el tener que razonar este confuso patrón mental.", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "Inclusividad", - "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "A medida que el mapa de ruta de Ethereum ha evolucionado, Ethereum 2.0 se ha convertido en una representación inexacta de la hoja de ruta de Ethereum. Ser cuidadoso y preciso en nuestra elección de palabras permite que el contenido de Ethereum sea comprendido por el público más amplio posible.", + "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "A medida que la hoja de ruta de Ethereum ha evolucionado, Ethereum 2.0 se ha convertido en una representación inexacta de la hoja de ruta de Ethereum. Ser cuidadoso y preciso en nuestra elección de palabras permite que el público más amplio posible comprenda el contenido de Ethereum.", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "Prevención de estafas", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "Lamentablemente, personas con malas intenciones han intentado usar el nombre incorrecto de Eth2 para estafar a los usuarios, diciéndoles que intercambien sus tókenes ETH por «ETH2», o que deben migrar a través de algún procedimiento su ETH antes de la actualización a Eth2. Esperamos que esta terminología actualizada ofrezca claridad para eliminar este riesgo de estafa y ayude a hacer el ecosistema más seguro.", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "Transparencia de la participación", @@ -195,7 +195,7 @@ "page-upgrades-what-to-do": "¿Qué necesita hacer?", "page-upgrades-what-to-do-desc": "Si es usted un usuario de dapp o titular de ETH, no necesita hacer nada. Si es un desarrollador o quiere empezar a apostar, puede implicarse de distintas maneras hoy en día.", "page-upgrades-whats-next": "¿Qué son las actualizaciones de Ethereum?", - "page-upgrades-whats-next-desc": "La guía para el futuro de Ethereum conlleva mejoras de protocolo interconectadas que harán que la red sea más escalable, más segura y más sustentable. Estas mejoras están siendo desarrolladas por varios equipos dentro del ecosistema de Ethereum.", + "page-upgrades-whats-next-desc": "La hoja de ruta de Ethereum conlleva mejoras de protocolo interconectadas que harán que la red sea más escalable, más segura y más sostenible. Estas mejoras las están desarrollando varios equipos dentro del ecosistema de Ethereum.", "page-upgrades-whats-next-history": "Más información acerca de actualizaciones anteriores de Ethereum", "page-upgrades-whats-ethereum": "Un segundo, ¿pero qué es Ethereum?", "page-upgrades-whats-new": "¿Y ahora qué pasará con Ethereum?", diff --git a/src/intl/es/page-wallets-find-wallet.json b/src/intl/es/page-wallets-find-wallet.json index 153c3fae7c6..9e739d504e7 100644 --- a/src/intl/es/page-wallets-find-wallet.json +++ b/src/intl/es/page-wallets-find-wallet.json @@ -50,11 +50,11 @@ "page-find-wallet-features": "Funciones", "page-find-wallet-security": "Seguridad", "page-find-wallet-smart-contract": "Contrato inteligente", - "page-find-wallet-check-out": "Revisa", + "page-find-wallet-check-out": "Eche un vistazo", "page-find-wallet-info-updated-on": "información actualizada sobre", "page-find-wallet-showing-all-wallets": "Mostrar todas las carteras", "page-find-wallet-showing": "Exhibición ", - "page-find-wallet-wallets": "monederos", + "page-find-wallet-wallets": "carteras", "page-find-wallet-iOS": "iOS", "page-find-wallet-android": "Android", "page-find-wallet-linux": "Linux", diff --git a/src/intl/es/page-what-is-ethereum.json b/src/intl/es/page-what-is-ethereum.json index 1e4af0ba76e..8ef0c7ae787 100644 --- a/src/intl/es/page-what-is-ethereum.json +++ b/src/intl/es/page-what-is-ethereum.json @@ -84,7 +84,7 @@ "page-what-is-ethereum-more-on-energy-consumption": "Más acerca del consumo energético de Ethereum", "page-what-is-ethereum-energy-consumption-chart-legend": "Consumo energético anual en TW/año", "energy-consumption-chart-global-data-centers-label": "Centros de datos globales", - "energy-consumption-gold-mining-cbeci-label": "Minado de oro", + "energy-consumption-gold-mining-cbeci-label": "Minería de oro", "energy-consumption-chart-btc-pow-label": "PoW de BTC", "energy-consumption-chart-netflix-label": "Netflix", "energy-consumption-chart-eth-pow-label": "PoW de ETH", diff --git a/src/intl/fa/page-roadmap-vision.json b/src/intl/fa/page-roadmap-vision.json index ed2a5a7de0a..deb68a0c97e 100644 --- a/src/intl/fa/page-roadmap-vision.json +++ b/src/intl/fa/page-roadmap-vision.json @@ -1,65 +1,67 @@ { - "page-roadmap-vision-2014": "یک پست وبلاگی منتشر شده در سال 2014 برای مشاهده‌ی جزئیات اثبات سهام را مشاهده کنید", - "page-roadmap-vision-2021": "یک پست بلاگ سال 2021 را درباره‌ی تکامل نقشه‌ی راه اتریوم ببینید", - "page-roadmap-vision-2021-updates": "یک پست بلاگ سال 2021 را درباره‌ی به‌روزرسانی‌های پروتکل اتریوم ببینید", - "page-roadmap-vision-desc-1": "اتریوم نیاز دارد برای خدمت‌رسانی بهتر به کاربران جهانی، گرفتگی‌های شبکه را کاهش و سرعت را بهبود ببخشد.", + "page-roadmap-vision-2014": "مشاهده یک پست وبلاگی منتشر شده در سال 2014 که جزئیاتی از اثبات سهام را مطرح می‌کند", + "page-roadmap-vision-2021": "مشاهده یک پست وبلاگی سال 2021 درباره‌ تکامل نقشه‌ راه اتریوم", + "page-roadmap-vision-2022": "مشاهده یک پست وبلاگی سال 2022: راهنمای سفر به اتریوم", + "page-roadmap-vision-2021-updates": "مشاهده یک پست وبلاگی سال 2021 درباره‌ به‌روزرسانی‌های پروتکل اتریوم", + "page-roadmap-vision-desc-1": "اتریوم نیاز دارد برای خدمت‌رسانی بهتر به پایگاه کاربران جهانی، ازدحام شبکه را کاهش و سرعت را بهبود ببخشد.", "page-roadmap-vision-desc-2": "اجرای یک گره با رشد شبکه سخت‌تر می‌شود. این کار با تلاش برای مقیاس‌پذیری شبکه حتی از این هم سخت‌تر می‌شود.", - "page-roadmap-vision-desc-3": "اتریوم مقدار قابل توجهی برق مصرف می‌کند. فناوری که شبکه را ایمن می‌کند نیاز به پایداری بیشتری دارد.", - "page-roadmap-vision-ethereum-node": "اطلاعات بیشتر در رابطه با گره‌ها", + "page-roadmap-vision-desc-3": "اتریوم مقدار قابل توجهی برق مصرف می‌کند. فناوری مورد استفاده در حفظ امنیت شبکه نیاز به پایداری بیشتری دارد.", + "page-roadmap-vision-ethereum-node": "اطلاعات بیشتر درباره‌ گره‌ها", "page-roadmap-vision-future": "آینده‌‌ای دیجیتالی در مقیاس جهانی", "page-roadmap-vision-meta-desc": "مروری بر اثر ارتقاها بر اتریوم و چالش‌هایی که باید پشت سر گذاشته شوند.", "page-roadmap-vision-meta-title": "چشم‌انداز اتریوم", "page-roadmap-vision-mining": "اطلاعات بیشتر درباره استخراج", "page-roadmap-vision-problems": "مشکلات امروز", "page-roadmap-vision-scalability": "مقیاس‌پذیری", - "page-roadmap-vision-scalability-desc": "اتریوم باید بتواند بدون افزایش حجم گره‌ها با تعداد تراکنش‌های بیشتری کار کند. گره‌ها عضو اساسی شبکه هستند که ذخیره می‌کنند و زنجیره بلوکی را اجرا می‌کنند. افزایش تعداد گره‌ها عملی نیست زیرا تنها کسانی که دارای کامپیوترهای قدرتمند و گران هستند قادر به اتجام آن هستند. برای مقیاس‌پذیری، اتریوم به تراکنش‌های بیشتری در ثانیه و گره‌های بیشتر نیاز دارد. گره‌ی بیشتر یعنی امنیت بیشتر.", - "page-roadmap-vision-scalability-desc-3": "ارتقای خرده‌زنجیره بار شبکه را به 64 زنجیره‌ی جدید پخش می‌کند. این کار با کاهش ازدحام شبکه و افزایش سرعت به بیشتر از 15-45 تراکنش در ثانیه‌ی فعلی، به اتریوم اجازه‌ی نفس کشیدن می‌دهد.", - "page-roadmap-vision-scalability-desc-4": "و در حالی که زنجیره‌های بیشتری وجود خواهد داشت، در واقع نیاز به کار کمتر توسط اعتبارسنج‌ها و تأمین‌کنندگان شبکه خواهد داشت. اعتبارسنج‌ها به جای کل اتریوم تنها نیاز دارند خرده‌زنجیره‌ها را اجرا کنند. که باعث می‌شود گره‌ها سبک‌تر و اترویم مقیاس‌پذیرتر شود و غیرمتمرکز بماند.", - "page-roadmap-vision-security": "امنیت", - "page-roadmap-vision-security-desc": "ارتقاهای برنامه‌ریزی‌شده امنیت اتریوم را در برابر حمله‌های هماهنگ‌شده، مانند حمله 51%، افزایش می‌دهند. این نوع حمله به‌گونه‌ای است که اگر کسی بیشتر شبکه را کنترل کند می‌تواند مسبب تغییرات مخربی در آن شود.", - "page-roadmap-vision-security-desc-3": "انتقال به گواهی سهام به معنای آن است که پروتکل اتریوم بازدارندگی بیشتری ضدحملات دارد. چون در اثبات سهام، اعتبارسنج‌هایی که شبکه را ایمن می‌سازند باید مقادیر چشمگیری از اتر را در پروتکل سهام گذاری کنند. اگر آن‌ها اقدام به حمله به شبکه کنند، پروتکل به شکل خودکار اتر آن‌ها را نابود خواهد ساخت.", - "page-roadmap-vision-security-desc-5": "این امر در اثبات کار امکان‌پذیر نیست، چرا که حداکثر کاری که پروتکل می‌تواند انجام دهد این است که باعث شود نهادهایی که شبکه را ایمن می‌کنند (استخراج‌گران) پاداش استخراجی که می‌توانستند به دست بیاورند را از دست بدهند. برای دستیابی به اثر مشابه در اثبات کار، پروتکل باید توانایی تخریب تمام تجهیزات استخراج‌گر را در صورت اقدام به تقلب داشته باشد.", - "page-roadmap-vision-security-desc-5-link": "اطلاعات بیشتر در مورد اثبات کار", - "page-roadmap-vision-security-desc-10": "سهام‌گذاری همین‌طور به این معنا است که شما برای اجرای یک گره‌ی اتریوم نیازی به سرمایه‌گذاری روی سخت‌افزار ویژه ندارید. این کار احتمالاً افراد بیشتری را به اعتبارسنج شدن ترغیب می‌کند که باعث می‌شود تمرکززدایی شبکه افزایش یابد و سطح حمله کاهش یابد.", - "page-roadmap-vision-security-staking": "سهام‌گذاری اتر", - "page-roadmap-vision-security-validator": "شما می‌توانید با سهام گذاری اتر خود به یک اعتبارسنج تبدیل شوید.", + "page-roadmap-vision-scalability-desc": "اتریوم باید بتواند بدون افزایش حجم گره‌ها با تعداد تراکنش‌های بیشتری کار کند. گره‌ها عضو اساسی شبکه هستند که زنجیره بلوکی را ذخیره و اجرا می‌کنند. افزایش تعداد گره‌ها عملی نیست زیرا تنها کسانی که دارای کامپیوترهای قدرتمند و گران هستند قادر به انجام آن هستند. برای مقیاس‌پذیری، اتریوم به تراکنش‌های بیشتری در ثانیه و گره‌های بیشتر نیاز دارد. گره بیشتر یعنی امنیت بیشتر.", + "page-roadmap-vision-scalability-desc-3": "رول‌آپ‌های لایه 2 اتریوم مقیاس‌پذیری را با انتقال تراکنش‌ها به خارج از زنجیره و فقط ارسال خلاصه داده‌ها به اتریوم انجام می‌دهد. این دسته‌بندی تعداد داده‌های ورودی اتریوم را افزایش می‌دهد و در عین حال، هزینه‌های کاربران را به شدت کاهش می‌دهد.", + "page-roadmap-vision-scalability-desc-4": "رول‌آپ‌ها به ذخیره‌سازی کم‌هزینه در لایه 1 نیاز دارند تا تراکنش‌ها تا حد امکان برای کاربران ارزان شود. این به شکل حباب‌های متصل به بلوک‌های اتریوم ارائه می‌شود. در نهایت، توده‌های زیادی به بلوک‌های اتریوم متصل می‌شوند و فضای ذخیره‌سازی ارزانی برای بسیاری از رول‌آپ‌ها فراهم می‌کنند.", + "page-roadmap-vision-security": "ایمنی", + "page-roadmap-vision-security-desc": "این ارتقاهای برنامه‌ریزی‌شده امنیت اتریوم را در برابر حملات هماهنگ بهبود می‌بخشد.", + "page-roadmap-vision-security-desc-3": "در اثبات سهام، امنیت اضافه‌تر به‌وسیله عوامل بازدارندۀ بزرگتری که برپایه اقتصاد رمزارز جلوی حمله را می‌گیرد حاصل می‌شود. دلیلش این است که در اثبات سهام، اعتبارسنج‌هایی که شبکه را ایمن می‌کنند باید مقادیر قابل توجهی از اتر را در پروتکل قرار دهند. اگر آنها سعی در حمله به شرکت نمایند، پروتکل می‌تواند به طور خودکار اتر آنها را از بین ببرد.", + "page-roadmap-vision-security-desc-5": "با این حال، نکته حائز اهمیت این است که ارتقاهایی که از اعتبارسنج‌ها در برابر حملات محروم‌سازی از خدمات محافظت می‌کنند، ناشناس بودن آنها را افزایش دهند و بلوک‌سازی و انتشار بلوک جداگانه به زودی اجرا شود. این ارتقاها از اعتبارسنج‌های فردی و شبکه به عنوان یک کل در برابر حملات زنده و سانسور محافظت می‌کنند.", + "page-roadmap-vision-security-desc-5-link": "اطلاعات بیشتر درباره اثبات سهام", + "page-roadmap-vision-security-desc-10": "سهام‌گذاری همچنین به این معنی است که برای مشارکت مستقیم در اجماع، نیازی به سرمایه‌گذاری در سخت‌افزار عالی‌رتبه ندارید. این امر باید افراد بیشتری را تشویق کند تا به اعتبارسنج تبدیل شوند تا غیرمتمرکزسازی شبکه را افزایش داده و سطح حمله را کاهش دهد.", + "page-roadmap-vision-security-staking": "اتر را سهام گذاری کنید", + "page-roadmap-vision-security-validator": "شما می‌توانید با سهام‌گذاری اتر خود به یک اعتبارسنج تبدیل شوید.", "page-roadmap-vision-staking-lower": "اطلاعات بیشتر درباره سهام‌گذاری", - "page-roadmap-vision-subtitle": "اتریوم را تا زمانی که به اندازه کافی قدرتمند شود که به عموم بشریت کمک کند رشد دهید.", + "page-roadmap-vision-subtitle": "اتریوم را تا جایی رشد دهید که قدرت کافی را برای کمک به عموم بشریت پیدا کند.", "page-roadmap-vision-sustainability": "پایداری", - "page-roadmap-vision-sustainability-desc-1": "بر کسی پوشیده نیست که اتریوم و سایر بلاکچین‌ها مانند بیت کوین به خاطر استخراجشان شدیداً انرژی‌بر هستند.", - "page-roadmap-vision-sustainability-desc-2": "اما اتریوم به سمتی حرکت می‌کند که با اتر ایمن شود، نه با توان پردازش - با سهام‌گذاری.", - "page-roadmap-vision-sustainability-desc-3": "اگرچه سهام‌گذاری قبلاً توسط زنجیره‌ی بیکن معرفی شده است، اتریومی که امروزه استفاده می‌کنیم به‌طور موازی اجرا می‌شود. یک سیستم با اتر امن شده است و دیگری با توان پردازشی. این موضوع تا زمان ادغام ادامه دارد.", - "page-roadmap-vision-sustainability-desc-8": "با راه افتادن و اجرای زنجیره‌ی بیکن، کار روی ادغام شبکه اصلی با لایه‌ی اجماع جدید آغاز شده است. در آن زمان، شبکه‌ی اصلی با سهام‌گذاری اتر با انرژی بسیار کمتر ایمن خواهد شد.", - "page-roadmap-vision-sustainability-subtitle": "اتریوم باید سبزتر شود.", + "page-roadmap-vision-sustainability-desc-1": "اتریوم اکنون یک زنجیره بلوکی سبز است. وقتی مکانیزم اثبات سهام جای اثبات کار را گرفت، مصرف انرژی تا 99/95٪ کاهش یافت.", + "page-roadmap-vision-sustainability-desc-2": "اتریوم اکنون از طریق سهام‌گذاری، و نه از طریق قدرت محاسباتی، ایمن شده است.", + "page-roadmap-vision-sustainability-desc-3": "این افزایش پایداری مزایای امنیتی نیز به همراه دارد - اتر سهام‌گذاری‌شده باعث می‌شود حمله به زنجیره بسیار گران‌تر از زمان اثبات کار باشد، اما هزینه کمتری برای ایمن کردن آن دارد زیرا در مقایسه با زمانی که استخراجگرها روی کار بودند، به صدور اتر جدید کمتری نیاز است تا به اعتبارسنج‌ها پرداخت شود.", + "page-roadmap-vision-sustainability-desc-8": "حرکت به سمت اثبات سهام اتریوم را سبزتر و امن‌تر کرد. این پلتفورم یک پلتفورم کم‌کربن برای ساخت برنامه‌ها و سازمان‌ها است.", + "page-roadmap-vision-sustainability-subtitle": "اتریوم یک زنجیره بلوکی سبز با امنیتی قوی ازلحاظ اقتصاد رمزنگاری است.", "page-roadmap-vision-title": "چشم‌انداز اتریوم", - "page-roadmap-vision-title-1": "شبکه‌ی گرفته", + "page-roadmap-vision-title-1": "شبکۀ مسدود", "page-roadmap-vision-title-2": "فضای دیسک", "page-roadmap-vision-title-3": "انرژی بیش از حد", - "page-roadmap-vision-trilemma-cardtext-1": "ارتقاهای اتریوم باعث می‌شود که اتریوم مقیاس‌پذیر، ایمن و نامتمرکز شود. زنجیره‌ای‌سازی اتریوم را با افزایش تعداد تراکنش‌ها در هر ثانیه ضمن کاهش توان لازم برای اجرای یک گره و اعتبارسنجی یک خرده‌زنجیره مقیاس‌پذیرتر می‌کند. زنجیره‌ی بیکن با هماهنگ کردن اعتبارسنج‌ها در سرتاسر خرده‌زنجیره‌ها اتریوم را ایمن می‌سازد. و سهام‌گذاری سد موجود در برابر مشارکت را کاهش می‌دهد، و در نتیجه شبکه‌ای بزرگتر، و نامتمرکزتر، ساخته می‌شود.", - "page-roadmap-vision-trilemma-cardtext-2": "شبکه‌های زنجیره‌‌ی بلوکی ایمن و نامتمرکز نیاز دارند تا هر گره تمام تراکنش‌های پردازش‌شده توسط زنجیره را تأیید کند. این حجم از کار، تعداد تراکنش‌هایی که می‌تواند در هر واحد زمان اتفاق بیافتد را محدود می‌سازد. تمرکززدایی و ایمنی بازتابی از زنجیره‌ی اتریوم امروزی است.", - "page-roadmap-vision-trilemma-cardtext-3": "شبکه‌های غیر متمرکز با خرج کردن اطلاعات درباره‌ی تراکنش‌ها در سراسر گره‌ها کار می‌کنند - کل شبکه نیاز دارد تا درباره‌ی هر تغییر حالتی بداند. مقیاس‌پذیری تراکنش‌ها در هر ثانیه سرتاسر شبکه‌ی غیرمتمرکز، امنیت را به چالش می‌کشد، زیرا هر چقدر تأخیر بیشتر باشد، احتمال مورد حمله قرار گرفتن در زمانی که اطلاعات در حال انتقال هستند بیشتر می‌شود.", - "page-roadmap-vision-trilemma-cardtext-4": "افزایش قدرت و حجم گره‌های اتریوم می‌تواند به افزایش تعداد تراکنش‌ها به‌طور امن کمک کند، اما سخت‌افزار مورد نیاز ما را از انجام آن باز می‌دارد، که تهدیدی برای غیرمتمرکزسازی است. امیدوار هستیم با زنجیره‌ای‌سازی و اثبات کار بتوانیم اتریوم را با افزایش تعداد گره‌ها، و نه حجم آن‌ها مقیاس‌بندی کنیم.", + "page-roadmap-vision-trilemma-cardtext-1": "ارتقاهای اتریوم باعث خواهد شد که اتریوم مقیاس‌پذیر، امن و غیرمتمرکز شود. سهام‌گذاری موانع مشارکت و محدودیت در صرفه به مقیاس را کاهش داده و درنتیجه، شبکه‌ای بزرگتر و غیرمتمرکزتر ساخته است.", + "page-roadmap-vision-trilemma-cardtext-2": "در شبکه‌های زنجیره‌‌ بلوکی ایمن و نامتمرکز، لازم است هر گره تمام تراکنش‌هایی که توسط زنجیره پردازش شده است تأیید شود. این حجم از کار، تعداد تراکنش‌هایی را که می‌تواند در هر مقطع مشخصی اتفاق بیفتد محدود می‌سازد. غیرمتمرکز و ایمن بازتابی است از ویژگی زنجیره اتریوم امروزی.", + "page-roadmap-vision-trilemma-cardtext-3": "شبکه‌های غیرمتمرکز فعالیتشان را با ارسال اطلاعات تراکنش‌ها در سراسر گره‌ها انجام می‌دهند؛ کل شبکه نیاز دارد تا درباره هر تغییر حالتی بداند. مقیاس‌پذیری تراکنش‌ها در هر ثانیه در سرتاسر شبکۀ غیرمتمرکز باعث ایجاد خطرات امنیتی می‌شود زیرا هر چقدر تراکنش‌ها بیشتر باشد، تأخیر هم بیشتر می‌شود، و احتمال حمله به اطلاعات طی مدتی که در حال انتقال هستند بیشتر می‌شود.", + "page-roadmap-vision-trilemma-cardtext-4": "افزایش قدرت و حجم گره‌های اتریوم می‌تواند به افزایش تعداد تراکنش‌ها در ثانیه به‌شکلی امن کمک کند، اما سخت‌افزار مورد نیاز یک عامل بازدارنده برای افرادی است که قادر به انجام این کار هستند. این موضوع تهدیدی برای غیرمتمرکزسازی است. امیدوار هستیم با شاردینگ (زنجیره‌ای‌سازی) و اثبات سهام بتوانیم اتریوم را با افزایش تعداد گره‌ها، و نه حجم آن‌ها، مقیاس‌بندی کنیم.", "page-roadmap-vision-trilemma-h2": "چالش مقیاس‌پذیری غیرمتمرکز", - "page-roadmap-vision-trilemma-modal-tip": "روی دایره‌های زیر کلیک کنید تا بهتر با مشکلات مقیاس‌پذیری غیرمتمرکز آشنا شوید", - "page-roadmap-vision-trilemma-p": "یک راه بومی برای حل این مشکل اتریوم این است که آن را متمرکزتر کنیم. اما غیرمتمرکز بودن بسیار مهم است. این غیرمتمرکز بودن است که اتریوم را غیرقابل کنترل، آزاد، محرم اطلاعات و تقریباً غیرقابل نفوذ می‌کند.", - "page-roadmap-vision-trilemma-p-1": "چشم‌انداز اتریوم این است که مقیاس‌پذیرتر و امن شود، و در عین حال غیرمتمرکز بماند. رسیدن به این 3 مشخصه، مشکلی است که از آن به‌عنوان معضل سه‌گانه‌ی مقیاس‌پذیری یاد می‌شود.", - "page-roadmap-vision-trilemma-p-2": "ارتقای اتریوم با هدف حل این معضل سه‌گانه است، اما مشکلات زیادی وجود دارد.", - "page-roadmap-vision-trilemma-press-button": "آیکون روی مثلث را بفشارید تا بهتر با مشکلات مقیاس‌پذیری غیرمتمرکز آشنا شوید.", + "page-roadmap-vision-trilemma-modal-tip": "روی دایره‌های زیر کلیک کنید تا با مشکلات مقیاس‌پذیری غیرمتمرکز بهتر آشنا شوید", + "page-roadmap-vision-trilemma-p": "یک راه ساده برای حل مشکلات اتریوم متمرکز کردن آن است. اما غیرمتمرکزسازی بسیار مهم است. این غیرمتمرکزسازی است که به اتریوم بی‌طرفی، مقاومت در برابر سانسور، باز بودن، مالکیت داده‌ها و امنیت تقریباً شکست‌ناپذیر می‌دهد.", + "page-roadmap-vision-trilemma-p-1": "چشم‌انداز اتریوم این است که مقیاس‌پذیرتر و امن‌تر شود، و در عین حال غیرمتمرکز بماند. رسیدن به این 3 مشخصه، مشکلی است که از آن به‌عنوان معضل سه‌گانه مقیاس‌پذیری یاد می‌شود.", + "page-roadmap-vision-trilemma-p-2": "ارتقاهای اتریوم با هدف حل این معضل سه‌گانه ارائه می‌شود، اما مشکلات زیادی وجود دارد.", + "page-roadmap-vision-trilemma-press-button": "دکمه‌های روی مثلث را فشار دهید تا با مشکلات مقیاس‌پذیری غیرمتمرکز بهتر آشنا شوید.", "page-roadmap-vision-trilemma-text-1": "غیرمتمرکزسازی", "page-roadmap-vision-trilemma-text-2": "ایمنی", "page-roadmap-vision-trilemma-text-3": "مقیاس‌پذیری", - "page-roadmap-vision-trilemma-title-1": "در مورد معضل سه‌گانه‌ی مقیاس‌پذیری کاوش کنید", - "page-roadmap-vision-trilemma-title-2": "ارتقای اتریوم و مقیاس‌پذیری غیرمتمرکز", + "page-roadmap-vision-trilemma-title-1": "در مورد معضل سه‌گانه مقیاس‌پذیری کاوش کنید", + "page-roadmap-vision-trilemma-title-2": "ارتقاهای اتریوم و مقیاس‌پذیری غیرمتمرکز", "page-roadmap-vision-trilemma-title-3": "امن و غیرمتمرکز", "page-roadmap-vision-trilemma-title-4": "غیرمتمرکز و مقیاس‌پذیر", "page-roadmap-vision-trilemma-title-5": "مقیاس‌پذیر و امن", "page-roadmap-vision-understanding": "درک چشم‌انداز اتریوم", - "page-roadmap-vision-upgrade-needs": "نیاز برای ارتقاها", - "page-roadmap-vision-upgrade-needs-desc": "پروتکل اتریوم که در سال 2015 اجرایی شد با موفقیت بزرگی همراه بود. اما جامعه‌ی اتریوم همیشه در انتظار چند ارتقاهای کلیدی برای دستیابی به حداکثر ظرفیت اتریوم بود.", - "page-roadmap-vision-upgrade-needs-desc-2": "تقاضای بالا باعث افزایش کارمزد تراکنش می‌شود که اتریوم را برای عمده‌ی کاربران گران می‌کند. فضای موردنیاز برای اجرای کلاینت اتریوم به‌سرعت در حال افزایش است. و الگوریتم وفاق اثبات کار که اتریوم را امن و غیرمتمرکز نگه می‌دارد اثرات زیست‌محیطی زیادی دارد.", - "page-roadmap-vision-upgrade-needs-desc-3": "اتریوم چند ارتقا در پیش دارد که مستقیماً این مشکلات و موارد دیگر را برطرف می‌کنند. از این مجموعه از ارتقاها به نام «سرنیتی» (Serenity) و «Eth2» یاد می‌شود، که یک حوزه‌ی پویای تحقیق و توسعه از سال 2014 بوده است.", - "page-roadmap-vision-upgrade-needs-desc-5": "حالا که فناوری آماده است، این ارتقاها اتریوم را از نوع بنا می‌کنند و آن را مقیاس‌پذیرتر، امن‌تر و پایدارتر می‌کنند - تا زندگی برای کاربران حال حاضر بهتر شود و کاربران جدید جذب شوند. این مهم در حالی رخ می‌دهد که هسته‌ی اتریوم یعنی غیرمتمرکز بودن پابرجا است.", - "page-roadmap-vision-upgrade-needs-desc-6": "این بدان معنی است که هیچ تغییری یکباره‌ای برای مقیاس‌پذیری وجود ندارد. تغییرات به مرور زمان به آن اضافه می‌شوند.", - "page-roadmap-vision-upgrade-needs-serenity": "یک پست وبلاگی منتشر شده در سال 2015 را درباره‌ی «سرنیتی» (Serenity) ببینید", - "ethereum": "اتریوم" + "page-roadmap-vision-upgrade-needs": "نیاز به ارتقاها", + "page-roadmap-vision-upgrade-needs-desc": "پروتکل اتریوم که در سال 2015 اجرایی شد با موفقیتی باورنکردنی همراه بوده است. اما جامعه اتریوم همیشه در انتظار چند ارتقای کلیدی برای دستیابی به حداکثر ظرفیت اتریوم بود.", + "page-roadmap-vision-upgrade-needs-desc-2": "تقاضای بالا باعث افزایش کارمزد تراکنش می‌شود که اتریوم را برای یک کاربر عادی گران می‌کند. فضای ذخیره‌سازی موردنیاز برای اجرای کلاینت اتریوم به‌سرعت در حال افزایش است.", + "page-roadmap-vision-upgrade-needs-desc-3": "اتریوم چند ارتقا در پیش دارد که این مشکلات و موارد دیگر را برطرف می‌کنند. در ابتدا به این مجموعه از ارتقاها «سرنیتی» (Serenity) و «Eth2» گفته می‌شد، که یک حوزه تحقیق و توسعۀ پویا از سال 2014 بوده است.", + "page-roadmap-vision-upgrade-needs-desc-5": "حالا که فناوری آماده است، این ارتقاها اتریوم را از نو بنا می‌کنند و آن را مقیاس‌پذیرتر، امن‌تر و پایدارتر می‌کنند - تا زندگی برای کاربران حاضر بهتر شود و کاربران جدید جذب شوند. همه اینها در حالی رخ می‌دهد که ارزش بنیادی اتریوم، یعنی غیرمتمرکزسازی، پابرجا خواهد ماند.", + "page-roadmap-vision-upgrade-needs-desc-6": "این بدان معنی است که مقیاس‌پذیری به‌یکباره میسر نمی‌شود. بهبودها به مرور زمان اعمال خواهند شد.", + "page-roadmap-vision-upgrade-needs-serenity": "مشاهده یک پست وبلاگی از سال 2015 که به بحث درمورد «سرنیتی» (Serenity) می‌پردازد", + "ethereum": "اتریوم", + "page-roadmap-vision-danksharding": "اطلاعات بیشتر در مورد Danksharding" } diff --git a/src/intl/fa/page-upgrades-get-involved.json b/src/intl/fa/page-upgrades-get-involved.json index 9fe260669fb..99e37d3ac49 100644 --- a/src/intl/fa/page-upgrades-get-involved.json +++ b/src/intl/fa/page-upgrades-get-involved.json @@ -1,40 +1,46 @@ { - "page-upgrades-get-involved-btn-1": "کلاینت‌ها را ببینید", + "page-upgrades-get-involved-btn-1": "مشاهده کلاینت‌ها", "page-upgrades-get-involved-btn-2": "اطلاعات بیشتر درباره سهام‌گذاری", "page-upgrades-get-involved-btn-3": "پیدا کردن باگ‌ها", - "page-upgrades-get-involved-bug": "باگ ممکن است یکی از این موارد باشد:", + "page-upgrades-get-involved-bug": "باگ می‌تواند یکی از این موارد باشد:", "page-upgrades-get-involved-bug-hunting": "شکار باگ", "page-upgrades-get-involved-bug-hunting-desc": "باگ‌های موجود در مشخصات ارتقای لایه‌ی اجماع یا موجود در خود کلاینت‌ها را شناسایی و گزارش کنید. شما می‌توانید تا سقف 50,000 دلار پول و جایگاهی در رده‌بندی کسب کنید.", "page-upgrades-get-involved-bug-li": "مشکلات عدم همخوانی مشخصات", "page-upgrades-get-involved-bug-li-2": "باگ‌های مخل قطعیت", "page-upgrades-get-involved-bug-li-3": "بردارهای محروم‌سازی از سرویس (DOS)", "page-upgrades-get-involved-bug-li-4": "و موارد دیگر...", - "page-upgrades-get-involved-desc-1": "اجرای یک کلاینت به‌منزله‌ی عضویت فعال شما در اتریوم خواهد بود. کلاینت شما به رهگیری تراکنش‌ها و چک کردن بلوک‌های جدید کمک خواهد کرد.", + "page-upgrades-get-involved-desc-1": "اجرای یک کلاینت به‌منزله‌ عضویت فعال شما در اتریوم خواهد بود. کلاینت شما به رهگیری تراکنش‌ها و چک کردن بلوک‌های جدید کمک خواهد کرد.", "page-upgrades-get-involved-desc-2": "اگر اتر دارید، می‌توانید با سهام‌گذاری آن یک اعتبارسنج بشوید و به ایمن‌سازی شبکه کمک کنید. به عنوان یک اعتبارسنج به شما پاداش در قالب اتر تعلق خواهد گرفت.", - "page-upgrades-get-involved-desc-3": "عضو جامعه‌ی تست‌کنندگان شوید. در تست کردن ارتقاهای اتریوم کمک کنید و آن را قبل از رونمایی ارتقا دهید. باگ پیدا کنید و پاداش بگیرید.", - "page-upgrades-get-involved-ethresearch-1": "زنجیره‌ای‌سازی", - "page-upgrades-get-involved-ethresearch-2": "ادغام", + "page-upgrades-get-involved-desc-3": "عضو جامعه‌ تست‌کنندگان شوید! در تست کردن ارتقاهای اتریوم قبل از اجرای آنها کمک کنید. باگ پیدا کنید و پاداش بگیرید.", + "page-upgrades-get-involved-ethresearch-1": "زنجیره ای سازی", + "page-upgrades-get-involved-ethresearch-2": "The Merge (ادغام)", "page-upgrades-get-involved-ethresearch-3": "اجرای خرده‌زنجیره‌ای", "page-upgrades-get-involved-ethresearch-4": "تمام سرفصل‌های تحقیق", "page-upgrades-get-involved-how": "چگونه می‌خواهید در این کار دخیل شوید؟", - "page-upgrades-get-involved-how-desc": "جامعه‌ی اتریوم همیشه از اجرای کلاینت، سهام‌گذاری و شکار باگ توسط آدم‌های بیشتر سود خواهد برد.", + "page-upgrades-get-involved-how-desc": "جامعه‌ اتریوم همیشه از اجرای کلاینت‌ها، سهام‌گذاری و شکار باگ توسط آدم‌های بیشتر سود خواهد برد.", "page-upgrades-get-involved-join": "به تحقیق بپیوندید", - "page-upgrades-get-involved-join-desc": "مانند بسیاری از چیزهای مربوط به اتریوم، بخش زیادی از تحقیقات عمومی هستند. این بدان معنا است که شما می‌توانید در مباحثات شرکت کنید یا اینکه فقط بخوانید که محققان اتریوم چه حرفی برای گفتن دارند. ethresear.ch موضوعات مختلفی از جمله ارتقاهای اجماع، زنجیره‌ای‌سازی، رول‌آپ‌ها و غیره را پوشش می‌دهد.", + "page-upgrades-get-involved-join-desc": "مانند بسیاری از مسائل مرتبط با اتریوم، بسیاری از تحقیقات عمومی هستند. این بدان معناست که می‌توانید در بحث‌ها شرکت کنید یا فقط آنچه محققان اتریوم برای گفتن دارند بخوانید. در وبسایت ethresear.ch تعدادی از موضوعات از جمله ارتقاهای اجماع، رول‌آپ‌ها و موارد دیگر پوشش داده شده است.", "page-upgrades-get-involved-meta-description": "چگونه در ارتقاهای اتریوم مشارکت کنیم: اجرای گره، سهام‌گذاری، شکار باگ و غیره.", - "page-upgrades-get-involved-run-clients": "راه‌اندازی کاربران اجماع", - "page-upgrades-get-involved-run-clients-desc": "کلید ایمنی بلندمدت اتریوم در توزیع گسترده‌ی کلاینت‌ها است. کلاینت نرم افزاری است که زنجیره‌‌ی بلوکی را اجرا کرده و تراکنش‌ها و ساخت بلوک‌های جدید را بررسی می‌کند. هر کلاینت ویژگی‌های خاص خود را دارد، پس کلاینتی را انتخاب کنید که با آن راحتید.", + "page-upgrades-get-involved-run-clients": "یک جفت کلاینت را اجرا کنید", + "page-upgrades-get-involved-run-clients-desc": "«مشتری یا کلاینت» نرم‌افزاری است که زنجیره بلوکی را اجرا می‌کند، و در مورد اتریوم، یک گره کامل نیاز به اجرای یک جفت از این کلاینت‌ها دارد: یک کلاینت لایه اجرا و یک کلاینت لایه اجماع.\nیک گره کامل می‌تواند تراکنش‌ها را بررسی کند و اگر اتر را نیز سهام‌گذاری کند، می‌تواند بلوک‌های جدیدی ایجاد کند. هر کلاینت ویژگی‌های خاص خود را دارد اما به طور کلی عملکرد یکسانی را انجام می‌دهد، بنابراین ما شما را تشویق می‌کنیم تا هر زمان که ممکن است یک کلاینت اقلیتی را انتخاب کنید تا همواره مجموعه‌ای متنوع و ایمن از کلاینت‌ها داشته باشید.", + "page-upgrades-get-involved-run-clients-desc-link": "اطلاعات بیشتر در مورد گوناگونی کلاینت‌ها.", + "page-upgrades-get-involved-run-clients-execution": "کلاینت‌های لایه اجرا", + "page-upgrades-get-involved-run-clients-execution-desc": "این کلاینت‌ها قبلاً کلاینت‌های «Eth1» نامیده می‌شدند، اما این اصطلاح با جایگزین شدن کلاینت‌های «لایه اجرا» درحال منسوخ شدن است.", + "page-upgrades-get-involved-run-clients-consensus": "کلاینت‌های لایه اجماع", + "page-upgrades-get-involved-run-clients-consensus-desc": "این کلاینت‌ها قبلاً به عنوان کلاینت‌های «Eth2» نامیده می‌شدند، اما این اصطلاح با جایگزین شدن کلاینت‌های «لایه اجماع» درحال منسوخ شدن است.", "page-upgrades-get-involved-stake": "اتر خود را سهام‌گذاری کنید", - "page-upgrades-get-involved-stake-desc": "شما هم‌اکنون می‌توانید اتر خود را برای کمک به ایمن‌سازی زنجیره‌ی بیکن سهام‌گذاری کنید.", - "page-upgrades-get-involved-stake-eth": "سهام‌گذاری اتر", + "page-upgrades-get-involved-stake-desc": "شما هم‌اکنون می‌توانید اتر خود را برای کمک به ایمن‌سازی زنجیره بیکن سهام‌گذاری کنید.", + "page-upgrades-get-involved-stake-eth": "اتر را سهام گذاری کنید", "page-upgrades-get-involved-subtitle": "در اینجا تمام راه‌های کمک شما به اتریوم و تلاش‌های آتی مرتبط با ارتقاها را می‌بینید.", "page-upgrades-get-involved-title-1": "اجرای یک کلاینت", "page-upgrades-get-involved-title-2": "اتر خود را سهام‌گذاری کنید", "page-upgrades-get-involved-title-3": "پیدا کردن باگ‌ها", - "page-upgrades-get-involved-written-go": "برنامه‌نویسی‌شده با زبان گو", - "page-upgrades-get-involved-written-java": "برنامه‌نویسی‌شده با زبان جاوا", - "page-upgrades-get-involved-written-javascript": "برنامه‌نویسی‌شده با زبان جاوا اسکریپت", - "page-upgrades-get-involved-written-nim": "برنامه‌نویسی‌شده با زبان گو", - "page-upgrades-get-involved-written-rust": "برنامه‌نویسی‌شده با زبان راست", + "page-upgrades-get-involved-written-c-sharp": "نوشته‌شده در زبان برنامه‌نویسی سی شارپ", + "page-upgrades-get-involved-written-go": "برنامه‌نویسی‌شده با زبان Go", + "page-upgrades-get-involved-written-java": "نوشته‌شده به زبان جاوا", + "page-upgrades-get-involved-written-javascript": "نوشته‌شده به زبان جاوا اسکریپت", + "page-upgrades-get-involved-written-nim": "نوشته‌شده به زبان Nim", + "page-upgrades-get-involved-written-rust": "نوشته‌شده به زبان Rust", "page-upgrades-get-involved": "در ارتقای اتریوم مشارکت کنید", "page-upgrades-get-involved-2": "مشارکت کنید", "page-upgrades-bug-bounty-leaderboard-points": "امتیازها" diff --git a/src/intl/fa/page-upgrades-index.json b/src/intl/fa/page-upgrades-index.json index fa91b645be1..758be7680dd 100644 --- a/src/intl/fa/page-upgrades-index.json +++ b/src/intl/fa/page-upgrades-index.json @@ -1,44 +1,67 @@ { + "consensus-client-besu-logo-alt": "لوگوی Besu", + "consensus-client-erigon-logo-alt": "لوگوی Erigon", + "consensus-client-geth-logo-alt": "لوگوی Geth", "consensus-client-lighthouse-logo-alt": "لوگوی Lighthouse", "consensus-client-lodestar-logo-alt": "لوگوی Lodestar", + "consensus-client-nethermind-logo-alt": "لوگوی Nethermind", "consensus-client-nimbus-logo-alt": "لوگوی Nimbus", "consensus-client-prysm-logo-alt": "لوگوی Prysm", "consensus-client-teku-logo-alt": "لوگوی Teku", - "page-upgrades-answer-1": "تغییراتی که انجام می‌شود را به‌عنوان مجموعه‌ای از نسخه‌های به‌روز شده که برای بهبود اتریوم که امروزه استفاده می‌کنیم، در نظر بگیرید. این به‌روزرسانی‌ها شامل ایجاد یک زنجیره‌ی جدید به نام زنجیره‌ی بیکن است و تعدادی زنجیره‌ی جدید به نام «شارد» را معرفی می‌کند.", - "page-upgrades-answer-2": "برخی ارتقاها جدای از شبکه اصلی اتریوم است که امروزه از آن استفاده می‌‌کنیم، اما جایگزین آن نخواهند شد. در عوض، شبکه‌ی اصلی با این سیستم موازی که به‌مرور در حال اضافه شدن است «ادغام» می‌‌شود.", - "page-upgrades-answer-4": "به عبارت دیگر اتریوم که امروز از آن استفاده می‌کنیم در نهایت تمام ویژگی‌هایی را که ما در چشم‌انداز اتریوم هدف قرار داده‌ایم مجسم خواهد کرد.", + "page-upgrades-answer-1": "از زنجیره بیکن به عنوان ابزاری برای ارتقای شبکه اصلی اتریوم در رویداد «ادغام» استفاده شد.", + "page-upgrades-answer-2": "با وقوع «ادغام»، اتریوم اساسی‌ترین ارتقای خود را داشت که اثبات کار را با یک لایه اجماع جدید مبتنی بر اثبات سهام جایگزین کرد.", + "page-upgrades-answer-4": "از زنجیره بیکن برای توسعه مکانیزم اجماع مبتنی بر اثبات سهام که اتریوم درحال حاضر بکار می‌برد استفاده شد. این مکانیزم به طور جداگانه برای شبکه اصلی اتریوم (Mainnet) اجرا شد تا توسعه‌دهندگان بتوانند مکانیزم اجماع را به صورت مجزا قبل از استفاده از آن برای هماهنگ کردن فعالیت واقعی، مشاهده کنند.", + "page-upgrade-article-author-status": "وضعیت", + "page-upgrade-article-author-ethmerge": "Ethmerge", + "page-upgrade-article-author-alchemy": "Alchemy", + "page-upgrade-article-author-consensys": "Consensys", + "page-upgrade-article-author-delphi-digital": "دلفی دیجیتال", + "page-upgrade-article-author-eip-4844": "ویتالیک بوترین، دانکراد فیست، دیدریک لوراکر، جورج کادیناکیس، مت گارنت، موفی تایوو", "page-upgrade-article-author-ethereum-foundation": "بنیاد اتریوم", + "page-upgrade-article-author-vitalik-buterin": "ویتالیک بوترین", + "page-upgrade-article-author-ethos-dev": "Ethos.dev", "page-upgrade-article-title-two-point-oh": "دو نقطه صفر: زنجیره‌ی بیکن", "page-upgrade-article-title-beacon-chain-explainer": "توضیح‌دهنده‌ی زنجیره‌ی بیکن اتریوم ۲.۰ که شما باید اول مطالعه کنید", "page-upgrade-article-title-sharding-consensus": "اجماع زنجیره‌ای‌سازی", "page-upgrade-article-title-sharding-is-great": "چرا زنجیره‌ای‌سازی عالی است: آشکارسازی ویژگی‌های فنی", "page-upgrade-article-title-rollup-roadmap": "یک نقشه‌ی راه رول‌آپ محور", - "page-upgrades-beacon-chain-date": "زنجیره‌ی بیکن اول دسامبر 2020 راه‌اندازی شد.", - "page-upgrades-beacon-chain-desc": "زنجیره‌ی بیکن سهام‌گذاری را برای اتریوم به ارمغان آورد، زمینه را برای ارتقاهای آینده فراهم کرد و در نهایت سیستم جدید را هماهنگ خواهد کرد.", + "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "راهنمای سفر به اتریوم", + "page-upgrade-article-title-eip-4844": "EIP-4844: تراکنش‌های توده‌ای شارد (Proto-Danksharding)", + "page-upgrade-article-title-proto-danksharding-faq": "سؤالات متداول درمورد Proto-Danksharding", + "page-upgrade-article-title-sharding-das": "توضیحی در مورد شاردینگ و نمونه‌گیری دسترسی‌پذیری به داده‌ها (DAS)", + "page-upgrade-article-title-ethmerge": "Ethmerge", + "page-upgrade-article-title-merge-is-coming": "«ادغام» در راه است", + "page-upgrade-article-title-state-of-the-merge": "وضعیت ادغام: به‌روزرسانی ادغام اتریوم و انتقال به اثبات سهام در سال 2022", + "page-upgrade-article-title-ropsten-merge-testnet": "اعلام شبکه تست Ropsten Merge", + "page-upgrade-article-title-execution-layer-specs": "مشخصات لایه اجرا", + "page-upgrade-article-title-consensus-layer-specs": "مشخصات لایه اجماع", + "page-upgrade-article-title-engine-api-specs": "مشخصات موتور API", + "page-upgrades-beacon-chain-date": "زنجیره بیکن در تاریخ 1 دسامبر 2020 راه‌اندازی شد", + "page-upgrades-beacon-chain-desc": "زنجیره بیکن امکان سهام‌گذاری را برای اتریوم به ارمغان آورد و زمینه را برای ارتقاهای آینده فراهم کرد. این زنجیره هماهنگی لازم را برای اتریوم جدید مبتنی بر اثبات سهام انجام می‌دهد.", "page-upgrades-beacon-chain-estimate": "زنجیره‌ی بیکن در حال اجرا است", - "page-upgrades-beacon-chain-title": "زنجیره‌ی بیکن", + "page-upgrades-beacon-chain-title": "زنجیره بیکن", "page-upgrades-bug-bounty": "برنامه‌ی پاداش برای باگ را ببینید", "page-upgrades-clients": "کلاینت‌های اجماع را نگاه کنید (پیشتر به نام کاربران «Eth2» شناخته می‌شدند)", "page-staking-deposit-contract-title": "آدرس قرارداد سپرده را بررسی کنید", "page-upgrades-dive": "با چشم‌انداز آشنا شوید", - "page-upgrades-dive-desc": "چگونه می‌خواهیم اتریوم را مقیاس‌پذیرتر، ایمن‌تر و پایدارتر کنیم؟ همه این‌ها با حفظ اصول اصلی غیرمتمرکزسازی انجام می‌شود.", - "page-upgrades-docking": "ادغام", - "page-upgrades-merge-answer-1": "ادغام زمانی است که شبکه‌ی اصلی شروع به استفاده از زنجیره‌ی بیکن برای اجماع کند و اثبات کار در سال 2022 خاموش شود.", - "page-upgrades-merge-btn": "اطلاعات بیشتر درباره ادغام", - "page-upgrades-merge-desc": "شبکه‌ی اصلی اتریوم به وقتش نیاز به ادغام با زنجیره‌ی بیکن خواهد داشت. این امر سهام‌گذاری را برای تمام شبکه فعال ساخته و نشانگر پایان کار فرایند پر مصرف استخراج خواهد بود.", - "page-upgrades-merge-estimate": "برآورد: 2022", + "page-upgrades-dive-desc": "چگونه می‌توانیم اتریوم را مقیاس‌پذیرتر، ایمن‌تر و پایدارتر کنیم؟ و با وجود همه اینها، ویژگی اصلی اتریوم یعنی غیرمتمرکزسازی را حفظ کنیم.", + "page-upgrades-docking": "The Merge (ادغام)", + "page-upgrades-merge-answer-1": "رویداد «ادغام» زمانی بود که اتریوم در 15 سپتامبر 2022 به مکانیزم اجماع اثبات سهام تغییر کرد. زنجیره بیکن با شبکه اصلی ادغام شد و رسماً مکانیزم اثبات کار در اتریوم را منسوخ کرد و مصرف انرژی اتریوم را تا حدود 99/95% کاهش داد.", + "page-upgrades-merge-btn": "اطلاعات بیشتر درباره‌ی ادغام", + "page-upgrades-merge-desc": "شبکه اصلی اتریوم با زنجیره بیکن اثبات سهام ادغام شد، و پایان فرآیند استخراج انرژی‌بر را رقم زد.", + "page-upgrades-merge-estimate": "«ادغام» برقرار است", "page-upgrades-merge-mainnet": "شبکه‌ی اصلی چیست؟", "page-upgrades-eth-blog": "وبلاگ ethereum.org", "page-upgrades-explore-btn": "کاوش ارتقاها", "page-upgrades-get-involved": "در ارتقای اتریوم مشارکت کنید", "page-upgrades-get-involved-2": "مشارکت کنید", - "page-upgrades-head-to-ethresearch": "رفتن به ethresear.ch", + "page-upgrades-head-to-ethresearch": "به ethresear.ch بروید", "page-upgrades-help": "می‌خواهید به ارتقای اتریوم کمک کنید؟", "page-upgrades-help-desc": "فرصت های زیادی برای محک زدن ارتقاهای اتریوم وجود دارد، از راه تست کردن کمک کنید و حتی پاداش کسب کنید.", "page-upgrades-index-staking": "سهام‌گذاری اینجاست", "page-upgrades-index-staking-desc": "یکی از موارد مهم در ارتقاهای اتریوم، آغاز فرایند سهام‌گذاری است. اگر می‌خواهید با استفاده از دارایی اتر خودتان به ایمن سازی شبکه اتریوم کمک نمایید، این مراحل را دنبال کنید.", "page-upgrades-index-staking-learn": "آشنایی با سهام‌گذاری", - "page-upgrades-index-staking-learn-desc": "زنجیره‌ی بیکن سهام‌گذاری را برای اتریوم امکان‌پذیر می‌کند. بدان معنا که اگر اتر داشته باشید، قادر خواهید بود با استفاده از آن علاوه بر ایمن‌سازی شبکه، اتر بیشتری به عنوان جایزه به دست آورید.", + "page-upgrades-index-staking-learn-desc": "زنجیره بیکن امکان سهام‌گذاری را به اتریوم آورد. اگر اتر دارید، می‌توانید با ایمن‌سازی شبکه، یک کار خیر عمومی انجام دهید و در این فرآیند اتر بیشتری کسب کنید.", "page-upgrades-index-staking-step-1": "1- راه‌اندازی با سکوی پرتاب", "page-upgrades-index-staking-step-1-btn": "مشاهده سکوی پرتاب سهام‌گذاری", "page-upgrades-index-staking-step-1-desc": "برای سهام‌گذاری در اتریوم باید از سکوی پرتاب استفاده کنید که شما را در انجام فرایند راهنمایی می‌کند.", @@ -52,25 +75,31 @@ "page-upgrades-question-1-title": "ارتقاها چه زمانی انجام می‌شوند؟", "page-upgrades-question-1-desc": "اتریوم به تدریج ارتقا می‌یابد؛ ارتقاها هر کدام در یک زمان متفاوتی انجام می‌شوند.", "page-upgrades-question-2-title": "آیا زنجیره‌ی بیکن یک زنجیره‌ی بلوکی متمایز است؟", - "page-upgrades-question-2-desc": "درست نیست که این ارتقاها را به عنوان یک زنجیره‌ی بلوکی مجزا در نظر بگیریم.", + "page-upgrades-question-2-desc": "بله. زنجیره بیکن نامی بود که به یک زنجیره بیکن موازی مبتنی بر اثبات سهام داده شد که برای ارتقای شبکه اصلی اتریوم مورد استفاده قرار گرفت. اکنون تنها یک زنجیره بلوکی وجود دارد که از ادغام زنجیره بلوکی اصلی اتریوم با زنجیره بیکن تشکیل شده است.", + "page-upgrades-question-3-answer-2a": "رویداد «ادغام» تأثیری ناچیز بر توسعه‌دهندگان dapp داشت - آنها همچنان با اتریوم به همان روش‌های قبل تعامل دارند.", + "page-upgrades-question-3-answer-2a-link": "رویداد «ادغام» و توسعه‌دهندگان dapp", + "page-upgrades-question-3-answer-2b": "طرح‌های شاردینگ (زنجیره‌ای‌سازی) هنوز در حال توسعه هستند، اما با در نظر گرفتن رول‌آپ‌های لایه 2 طراحی خواهند شد.", + "page-upgrades-layer-2-rollups": "اطلاعات بیشتر در مورد رول‌آپ‌های لایه 2", "page-upgrades-question-3-answer-3-link": "به ethresear.ch مراجعه کنید", "page-upgrades-question-3-desc": "در حال حاضر لازم نیست جهت آمادگی برای ارتقاها کاری انجام دهید.", "page-upgrades-question-3-title": "چگونه برای ارتقاها آماده شوم؟", - "page-upgrades-question-4-answer-1": "امروز هرز مان که تراکنشی بفرستید یا از برنامه‌ی غیرمتمرکز استفاده کنید، در حال استفاده از لایه‌ی اجرایی، یا شبکه‌ی اصلی، هستید. این اتریومی است که توسط استخراجگران ایمن می‌شود.", - "page-upgrades-question-4-answer-3": "پس از ادغام، اعتبارسنج‌ها تمام شبکه را از طریق اثبات سهام ایمن خواهند کرد.", + "page-upgrades-question-4-answer-1": "امروز هر زمان که یک تراکنش ارسال می‌کنید یا از یک dapp استفاده می‌کنید، درواقع دارید از لایه اجرا استفاده می‌کنید که تحت عنوان «شبکه اصلی» (Mainnet) نیز شناخته می‌شود.", + "page-upgrades-question-4-answer-3": "از زمان «ادغام»، اعتبارسنج‌ها امنیت کل شبکه را از طریق اثبات سهام تأمین می‌کنند.", "page-upgrades-question-4-answer-6": "هرکسی می‌تواند با سهام‌گذاری اتر خود به یک اعتبارسنج تبدیل شود.", "page-upgrades-question-4-answer-7": "اطلاعات بیشتر درباره سهام‌گذاری", "page-upgrades-question-4-title": "لایه‌ی اجرا چیست؟", - "page-upgrades-question-4-desc": "شبکه‌ی اصلی اتریومی که امروزه با آن کار می‌کنید پیشتر به نام Eth1 شناخته می‌شد. این نام در فاز بعدی به اسم لایه‌ی اجرا شناخته خواهد شد.", - "page-upgrades-question-5-answer-1": "برای تبدیل شدن به یک اعتبارسنج کامل در شبکه، باید 32 اتر سهام‌گذاری کنید. اگر این مقدار را ندارید، یا تمایل ندارید این مقدار سهام‌گذاری کنید، می‌توانید به استخرهای سهام‌گذاری بپیوندید. این استخرها به شما اجازه می‌‌دهند کمتر سهام‌گذاری کرده و بخشی از کل پاداش‌ها را کسب کنید.", + "page-upgrades-question-4-desc": "قبل از رویداد «ادغام»، زنجیره بلوکی اتریوم گاهی اوقات تحت عنوان «Eth1» نامیده می‌شد. این اصطلاح با جایگزینی «لایه اجرا» از میان برداشته شد.", + "page-upgrades-question-5-answer-1": "برای تبدیل شدن به یک اعتبارسنج در شبکه، باید 32 اتر سهام‌گذاری کنید. اگر آنقدر ندارید، یا مایل نیستید که این مقدار سهام‌گذاری کنید، می‌توانید به استخرهای سهام‌گذاری بپیوندید. این استخرها به شما امکان می‌دهند که کمتر سهام‌گذاری کنید و کسری از کل پاداش‌ها را به دست آورید.", "page-upgrades-question-5-desc": "باید از سکوی پرتاب سهام‌گذاری استفاده کنید یا در یک استخر سهام‌گذاری عضو شوید.", "page-upgrades-question-5-title": "چگونه سهام‌گذاری کنم؟", "page-upgrades-question-6-answer-3": "دنی رایان از بنیاد اتریوم به طور معمول انجمن را بروز نگه می‌دارد:", "page-upgrades-question-6-answer-4": "بن اجینگتون از ConsenSys یک خبر هفتگی درباره‌ی ارتقاهای اتریوم دارد:", "page-upgrades-question-6-answer-5": "شما همینطور می‌توانید در ethresear.ch به بحث درباره تحقیق و توسعه‌ی اتریوم بپیوندید.", "page-upgrades-question-6-title": "باید با برنامه‌ی کاربردی غیرمتمرکز خود چه کنم؟", - "page-upgrades-question-6-desc": "برنامه‌ی غیرمتمرکز شما متأثر از ارتقاهای قریب‌الوقوع نخواهند شد. هرچند ارتقاهای آتی شاید تغییراتی را بطلبد.", - "page-upgrades-question-6-answer-1": "در حال حاضر نیاز به هیچ اقدامی نیست. اما پیشنهاد می‌‌شود که پیگیر توسعه ارتقاهای خرده‌زنجیره‌ها و ادغام باشید.", + "page-upgrades-question-6-desc": "«ادغام» به گونه‌ای طراحی شد که کمترین تأثیر را بر توسعه‌دهندگان dapp داشته باشد، اگرچه چند تغییر کوچک وجود داشت که شایان ذکر است.", + "page-upgrades-question-6-answer-1": "توسعه‌دهندگان Dapp که با Ethereum پیش از ادغام آشنا هستند باید از برخی تغییرات آگاه باشند. این تغییرات شامل ساختار بلوک و زمان‌بندی، چند تغییر در کد عملیاتی، منابع انتخاب تصادفی بر روی زنجیره و مفهوم قطعیت ایپوک می‌شود.", + "page-upgrades-question-6-answer-1-link": "چگونه «ادغام» بر لایه برنامه‌های اتریوم تأثیر گذاشت", + "page-upgrades-question-6-answer-2": "برنامه‌ها تقریباً به طور کامل از اثرپذیری در امان ماندند.", "page-upgrades-question-7-desc": "تیم‌های گوناگونی از سراسر انجمن اتریوم در حال کار روی ارتقاهای مختلفی از اتریوم هستند.", "page-upgrades-question-7-lighthouse": "Lighthouse", "page-upgrades-question-7-lighthouse-lang": "(اجرای Rust)", @@ -87,7 +116,7 @@ "page-upgrades-question-7-clients": "درباره‌ی کلاینت‌های اتریوم بیشتر بدانید", "page-upgrades-question-8-answer-1": "ارتقاهای اتریوم به اتریوم کمک می‌کنند در عین حفظ ایمنی و افزایش پایداری به شکل نامتمرکز مقیاس‌پذیر شود.", "page-upgrades-question-8-answer-2": "شاید بدیهی‌ترین مشکل این باشد که اتریوم نیازمند رسیدگی به بیش از 15 تا 45 تراکنش بر ثانیه باشد. اما ارتقاها مشکلات دیگر مربوط به اتریوم امروز را نیز برطرف می‌‌کنند.", - "page-upgrades-question-8-answer-3": "شبکه به قدری در تقاضای شدید است که استفاده از اتریوم را گران می‌‌کند. گره‌ها در شبکه در حال تقلا کردن زیر حجم اتریوم و مقدار داده‌ای هستند که رایانه‌هایشان باید پردازش کنند. و الگوریتم زیربنایی که اتریوم را ایمن و نامتمرکز می‌‌کند بسیار انرژی بر است و باید سبزتر شود.", + "page-upgrades-question-8-answer-3": "استفاده از شبکه در زمان‌های پر تقاضا باعث می‌شود که استفاده از اتریوم پرهزینه باشد. گره‌ها در شبکه از حیث اندازه اتریوم و حجم داده‌هایی که رایانه‌هایشان باید پردازش کنند، با مشکل مواجه هستند. الگوریتم اصلی که زیربنای امنیت و غیرمتمرکزسازی اتریوم بود، انرژی‌بر بود و باید کم‌مصرف‌تر و سبزتر می‌شد.", "page-upgrades-question-8-answer-4": "بسیاری از تغییرات در حال اجرا همیشه جزوی از نقشه راه اتریوم بوده‌اند، حتی از سال ۲۰۱۵. اما وضعیت کنونی نیاز به ارتقاها را حتی بیشتر از قبل می‌‌کند.", "page-upgrades-question-8-answer-6": "مشاهده‌ی چشم‌انداز اتریوم", "page-upgrades-question-8-desc": "اتریومی که امروزه استفاده می‌‌کنیم باید به کاربران نهایی و مشارکت‌کنندگان در شبکه تجربه‌ی بهتری را ارائه کند.", @@ -97,7 +126,7 @@ "page-upgrades-question-9-answer-3": "اگر آدم فنی‌تری هستید، می‌توانید به پیدا کردن اشکال در کلاینت‌های جدید کمک کنید.", "page-upgrades-question-9-answer-4": "همچنین می‌توانید در بحث‌های فنی با محققان اتریوم در ethresear.ch شرکت کنید.", "page-upgrades-question-9-desc": "برای مشارکت لازم نیست فنی باشید. جامعه نیازمند مشارکت تمام انواع مهارت‌ها است.", - "page-upgrades-question-9-stake-eth": "سهام‌گذاری اتر", + "page-upgrades-question-9-stake-eth": "اتر را سهام گذاری کنید", "page-upgrades-question-9-title": "چطور می‌توانم در ارتقاهای اتریوم مشارکت کنم؟", "page-upgrades-question-9-more": "راه‌های عمومی‌تری برای مشارکت با اتریوم بیابید", "page-upgrades-question-10-title": "فازهای «Eth2» چه هستند؟", @@ -107,32 +136,32 @@ "page-upgrades-question-10-answer-1-link": "مشاهده‌ی ارتقاها", "page-upgrades-question-10-answer-2": "اما اگر پیگیر مباحثات بوده باشید، در اینجا نحوه‌ی کارایی ارتقاها در نقشه‌های راه فنی و کمی درباره نحوه تغییر آن‌ها آورده شده ست.", "page-upgrades-question-10-answer-3": "در فاز 0 توضیح داده شده است که زنجیره‌ی بیکن چگونه بر پا شد.", - "page-upgrades-question-10-answer-5": "فاز 1 ابتدا بر اجرای خرده زنجیره ها تمرکز داشت، اما اولویت بندی به «ادغام» که ارتقای برنامه‌ریزی‌شده‌ی بعدی بود، تغییر پیدا کرد.", - "page-upgrades-question-10-answer-6": "پیشتر برنامه ریزی شده بود که فاز 1.5 ادامه‌دهنده‌ی استقرار خرده‌زنجیره‌ها باشد، یعنی زمانی که شبکه‌ی اصلی مطابق قرار به‌عنوان آخرین خرده‌زنجیره به زنجیره‌ی بیکن اضافه می‌شود. جهت تسریع گذار از استخراج مبتنی بر اثبات کار، شبکه‌ی اصلی در عوض نماینده‌ی نخستین خرده‌زنجیره‌ای خواهد بود که به زنجیره‌ی بیکن متصل می‌شود. این فرایند به «ادغام» مشهور است و قدم بزرگی به سوی اتریومی سبزتر است.", - "page-upgrades-question-10-answer-7": "گرچه برنامه‌های مرتبط با فاز 2 با برنامه‌ریزی ادغام پیش از خرده‌زنجیره‌ها محل تحقیق و مباحثات شدید بوده است، این امر تداوم ارزیابی مجدد مطابق نیازهای پیش روی توسعه‌ی اتریوم را ممکن خواهد ساخت. با وجود یک نقشه‌ی راه رول‌آپ‌محور، لزوم آنی به خرده‌زنجیره‌ها محل بحث است.", + "page-upgrades-question-10-answer-5": "فاز 1 در ابتدا بر روی پیاده‌سازی خرده‌زنجیره‌ها تمرکز داشت، اما اولویت‌بندی به اجرای رویداد «ادغام» تغییر کرد، که روز 15 سپتامبر 2022 اجرا شد.", + "page-upgrades-question-10-answer-6": "فاز 1.5 در ابتدا برای دنبال کردن پیاده‌سازی خرده‌بندی برنامه‌ریزی شده بود، و این زمانی بود که «شبکه اصلی» به عنوان آخرین قطعه به زنجیره بیکن اضافه می‌شد. با این حال، با پیشرفت فناوری رول‌آپ، جامعه اتریوم در عوض فرآیند کنار گذاشتن اثبات کار را تسریع کرد.", + "page-upgrades-question-10-answer-7": "طرح‌های پیرامون فاز 2 محل تحقیق و بحث فشرده بوده است. با پشت سر گذاشتن رویداد «ادغام»، و پیشرفت‌هایی در راهکارهای لایه 2، اهداف به سمت ارائه شکل ساده‌تری از شاردینگ داده‌ها برای به حداکثر رساندن کارایی رول‌آپ تغییر کرده‌اند. لایه 2 فعلی امکان مقیاس‌بندی اجرای تراکنش‌ها را فراهم می‌کند و شاردینگ اجازه می‌دهد تا اثبات‌های این داده‌ها روی لایه 1 به روشی ارزان و مقیاس‌پذیر ذخیره شود.", "page-upgrades-question-10-answer-8": "اطلاعات بیشتر درباره نقشه‌ی راه رول‌آپ محور", "page-upgrades-question-11-title": "آیا می‌توانم Eth2 بخرم؟", - "page-upgrades-question-11-desc": "خیر. هیچ توکن Eth2 وجود ندارد و اتر شما پس از ادغام تغییر نخواهد کرد.", - "page-upgrades-question-11-answer-1": "یکی از دلایل برندسازی مجدد Eth2 این تصور غلط رایج بود که دارندگان اتریوم باید اتریوم خود را پس از «اتریوم 2.0» منتقل کنند. این حرف اصلاً درست نیست. این ", - "page-upgrades-question-11-answer-2": "یک تکنیک رایج است که کلاهبرداران استفاده می‌کنند.", + "page-upgrades-question-11-desc": "نه. هیچ توکن Eth2 وجود ندارد، و اتر شما بعد از رویداد «ادغام» تغییری نکرده است.", + "page-upgrades-question-11-answer-1": "یکی از نیروهای محرک پشت تغییر نام تجاری Eth2 رواج این تصور غلط بود که دارندگان اتر باید اتر خود را پس از رویداد «ادغام» یا هر ارتقای دیگری به «ETH 2.0» منتقل کنند. این درست نیست و هرگز هم نبوده است.", + "page-upgrades-question-11-answer-2": " این سردرگمی به‌طور متداول توسط کلاهبرداران مورد سوء استفاده قرار می‌گیرد.", "page-upgrades-question-title": "پرسش‌های متداول", "page-upgrades-question3-answer-1": "دارندگان اتر نیاز به انجام هیچ اقدامی ندارند. اتر شما نیازی به تغییر یا ارتقا نخواهد داشت. به احتمال زیاد کلاهبردارانی هستند که خلاف این را به شما می‌گویند، پس مراقب باشید.", "page-upgrades-scalable": "مقیاس‌پذیرتر", "page-upgrades-scalable-desc": "برای اینکه استفاده از نرم‌افزارها سریع‌تر و ارزان‌تر شود، اتریوم نیازمند پشتیبانی از هزاران تراکنش بر ثانیه است.", "page-upgrades-secure": "ایمن‌تر", "page-upgrades-secure-desc": "اتریوم نیاز دارد که ایمن‌تر شود. همچنان که پذیرش اتریوم بیشتر می‌شود، پروتکل نیازمند آن است که در برابر تمام انواع حملات ایمن شود.", - "page-upgrades-shard-date": "خرده‌زنجیره‌ها باید زمانی در سال 2023 ادغام را دنبال کنند.", - "page-upgrades-shard-desc": "خرده‌زنجیره‌ها ظرفیت اتریوم را جهت پردازش تراکنش‌ها و ذخیره‌سازی داده افزایش خواهند داد. خود خرده‌زنجیره‌ها طی زمان، در فازهای متمادی دارای امکانات بیشتری خواهند شد.", - "page-upgrades-shard-estimate": "برآورد: 2023", - "page-upgrades-shard-lower": "اطلاعات بیشتر درباره خرده‌زنجیره‌ها", - "page-upgrades-shard-title": "خرده‌زنجیره‌ها", + "page-upgrades-shard-date": "شاردینگ دنباله‌روی رویداد «ادغام» در چند فاز خواهد بود که حوالی سال 2023-2024 رخ خواهد داد.", + "page-upgrades-shard-desc": "Danksharding ظرفیت اتریوم در ذخیره داده‌ها را افزایش می‌دهد و با داشتن عملکردی هماهنگ با L2، تعداد داده‌های ورودی را افزایش و کارمزدهای شبکه را کاهش می‌دهد. Danksharding در چند مرحله اجرا خواهد شد و با مرحله ProtoDanksharding شروع می‌شود.", + "page-upgrades-shard-estimate": "برآورد: 2023-2024", + "page-upgrades-shard-lower": "اطلاعات بیشتر درباره شاردینگ", + "page-upgrades-shard-title": "زنجیره ای سازی", "page-upgrades-stay-up-to-date": "به‌روز بمانید", "page-upgrades-stay-up-to-date-desc": "آخرین اخبار را از پژوهشگران و توسعه‌دهندگان شاغل در ارتقاهای اتریوم بگیرید.", - "page-upgrades-sustainable-desc": "اتریوم باید برای محیط بهتر باشد. فناوری امروز به توان پردازش و انرژی بیش از حد نیاز دارد.", + "page-upgrades-sustainable-desc": "اتریوم تا همین اواخر بسیار انرژی‌بر بود. انتقال به اثبات سهام باعث کاهش مصرف انرژی شبکه به میزان بیش از 99/9 درصد شد.", "page-upgrades-take-part": "در تحقیق مشارکت کنید", "page-upgrades-take-part-desc": "محققیق و علاقه‌مندان اتریوم در این جا برای مباحثه در مورد تحقیقات شامل هر چیزی در مورد ارتقاهای اتریوم گرد هم می‌آیند.", "page-upgrades-the-upgrades": "ارتقاهای اتریوم", - "page-upgrades-the-upgrades-desc": "اتریوم مجموعه‌ای از ارتقاهایی است که مقیاس‌پذیری، امنیت، و ظرفیت شبکه را افزایش می‌دهد. گرچه هر کدام به صورت موازی عمل می‌کند، مقدار مشخصی به یکدیگر وابسته هستند که مشحص می‎‌کند چه زمانی بکار گرفته می‌شوند.", + "page-upgrades-the-upgrades-desc": "هدف ارتقاهای اتریوم بهبود مقیاس‌پذیری، امنیت و پایداری شبکه است. اتریوم اخیراً ارتقاهای عمده‌ای را در زمینه امنیت و پایداری پشت سر گذاشته است، و در آینده موارد بیشتری به خصوص در رابطه با مقیاس‌پذیری در راه خواهد بود.", "page-upgrades-unofficial-roadmap": "این نقشه‌ی راه رسمی نیست. این روشی است که ما بر اساس اطلاعاتی که وجود دارد با آن نشان می‌دهیم که چه اتفاقاتی در حال وقوع است. اما فناوری می‌تواند خیلی سریع تغییر کنند. پس این را یک تعهد در نظر نگیرید.", "page-upgrades-upgrade-desc": "اتریومی که ما می‌شناسیم و دوست داریم، تنها مقیاس‌پذیرتر، امن‌تر و با ظرفیت بالاتر...", "page-upgrades-upgrades": "ارتقاهای اتریوم", @@ -140,14 +169,15 @@ "page-upgrades-upgrades-beacon-chain": "زنجیره‌ی بیکن", "page-upgrades-upgrades-guide": "راهنمای ارتقاهای اتریوم", "page-upgrades-upgrades-docking": "ادغام", + "page-upgrades-energy-consumption": "اطلاعات بیشتر در مورد مصرف انرژی اتریوم", "page-upgrades-upgrading": "ارتقای اتریوم به جایگاه‌های بنیادین نو", "page-roadmap-vision": "چشم‌انداز", - "page-roadmap-vision-btn": "اطلاعات بیشتر درباره‌ی چشم‌انداز اتریوم", - "page-roadmap-vision-desc": "برای آوردن اتریوم به جریان اصلی و ارائه‌ی خدمات به تمام بشریت، باید اتریوم را مقیاس‌پذیرتر، ایمن‌تر و پایدارتر کنیم.", - "page-upgrades-what-happened-to-eth2-title": "چه بر سر «اتر۲» آمد؟", - "page-upgrades-what-happened-to-eth2-1": "واژه‌ی «Eth2» برای آمادگی ادغام از بین می‌رود.", + "page-roadmap-vision-btn": "اطلاعات بیشتر درباره چشم‌انداز اتریوم", + "page-roadmap-vision-desc": "برای آوردن اتریوم به جریان اصلی و ارائه خدمات به تمام بشریت، باید اتریوم را مقیاس‌پذیرتر، ایمن‌تر و پایدارتر کنیم.", + "page-upgrades-what-happened-to-eth2-title": "چه بر سر «Eth2» آمد؟", + "page-upgrades-what-happened-to-eth2-1": "از اصطلاح «Eth2» به‌طور متداول قبل از رویداد «ادغام» استفاده می‌شد، اما با جایگزینی اصطلاحات دقیق‌تر در جریان حذف است.", "page-upgrades-what-happened-to-eth2-1-more": "اطلاعات بیشتر درباره ادغام.", - "page-upgrades-what-happened-to-eth2-2": "پس از ادغام «Eth1» و «Eth2» به یک زنجیره‌ی واحد، دیگر دو شبکه‌ی مجزای اتریوم وجود نخواهد داشت؛ فقط اتریوم خواهد بود.", + "page-upgrades-what-happened-to-eth2-2": "از زمان ادغام «Eth1» و «Eth2»، دیگر دو زنجیره بلوکی متمایز اتریوم وجود ندارد؛ فقط اتریوم وجود دارد.", "page-upgrades-what-happened-to-eth2-3": "برای جلوگیری از گیج شدن، جامعه این واژه‌ها را به‌روز کرده است:", "page-upgrades-what-happened-to-eth2-3-1": "«Eth1» الان «لایه‌ی اجرا» است که به تراکنش‌ها و اجراها رسیدگی می‌کند.", "page-upgrades-what-happened-to-eth2-3-2": "«Eth2» الان «لایه‌ی اجماع» است، که به وفاق اثبات کار رسیدگی می‌کند.", @@ -173,6 +203,6 @@ "page-staking-deposit-contract-staking-more-link": "اطلاعات بیشتر درباره سهام‌گذاری", "docs-nav-proof-of-stake": "اثبات سهام", "docs-nav-proof-of-work": "اثبات کار", - "page-upgrades-get-involved-ethresearch-1": "زنجیره‌ای‌سازی", - "page-upgrades-get-involved-ethresearch-2": "ادغام" + "page-upgrades-get-involved-ethresearch-1": "زنجیره ای سازی", + "page-upgrades-get-involved-ethresearch-2": "The Merge (ادغام)" } diff --git a/src/intl/fa/page-upgrades.json b/src/intl/fa/page-upgrades.json index 2b0794c480f..d5d824a373d 100644 --- a/src/intl/fa/page-upgrades.json +++ b/src/intl/fa/page-upgrades.json @@ -1,17 +1,24 @@ { - "page-upgrades-beacon-date": "ارسال شد!", + "page-upgrades-merge-infographic-el": "حالت اتریوم: تراکنش‌ها، برنامه‌ها، قراردادها، موجودی‌ها", + "page-upgrades-merge-infographic-alt-text": "اینفوگرافیک نشان می‌دهد که چگونه زنجیره بیکن در طول انتقال از اثبات کار به اثبات سهام، در لایه اجرایی اتریوم ادغام می‌شود.", + "page-upgrades-beacon-date": "اجرا شد!", "page-upgrades-merge-date": "سپتامبر 2022", "page-upgrades-shards-date": "حوالی 2023", + "page-upgrades-pbs": "به زودی اتفاق نمی‌افتد - برای سال 2024/25 انتظار می‌رود", + "page-upgrades-post-merge-banner-tutorial-ood": "این آموزش قدیمی است و بعد از رویداد ادغام ممکن است کار نکند. اگر می‌خواهید مشارکت کنید، درخواست PR ثبت کنید.", + "page-upgrades-post-merge-banner-governance-ood": "برخی از مطالب این صفحه بعد از رویداد ادغام منسوخ شده‌اند. اگر می‌خواهید مشارکت کنید، درخواست PR ثبت کنید.", "page-upgrades-upgrades-guide": "راهنمای ارتقاهای اتریوم", - "page-upgrades-upgrades-docking": "ادغام", - "page-upgrades-shard-title": "خرده‌زنجیره‌ها", - "page-upgrades-upgrades-beacon-chain": "زنجیره‌ی بیکن", + "page-upgrades-upgrades-docking": "The Merge (ادغام)", + "page-upgrades-shard-title": "زنجیره ای سازی", + "page-upgrades-upgrades-beacon-chain": "زنجیره بیکن", + "consensus-beaconscan-title": "beaconscan", + "consensus-beaconscan-in-title": "beaconcha.in", "consensus-beaconcha-in-desc": "مرورگر متن‌باز زنجیره بیکن", "consensus-beaconscan-desc": "مرورگر زنجیره بیکن - Etherscan برای لایه اجماع", "consensus-become-staker": "سهام‌گذار شوید", - "consensus-become-staker-desc": "سهام‌گذاری در جریان است! اگر می‌خواهید ETH خود را جهت ایمن‌سازی شبکه سهام‌گذاری کنید، مطمئن شوید که از ریسک‌های این کار مطلع هستید.", + "consensus-become-staker-desc": "سهام‌گذاری در جریان است! اگر می‌خواهید اتر خود را جهت ایمن‌سازی شبکه سهام‌گذاری کنید، مطمئن شوید که از ریسک‌های این کار مطلع باشید.", "consensus-explore": "کاوش در داده‌ها", - "consensus-run-beacon-chain": "راه‌اندازی یک مشتری اجماع", + "consensus-run-beacon-chain": "راه‌اندازی یک کلاینت اجماع", "consensus-run-beacon-chain-desc": "اتریوم به کلاینت‌های بیشتر و بیشتری نیاز دارد. به این کار عام‌المنفعه اتریوم کمک کنید!", "read-more": "بیشتر بخوانید" } diff --git a/src/intl/fr/common.json b/src/intl/fr/common.json index 8045fc2210b..2c50d192156 100644 --- a/src/intl/fr/common.json +++ b/src/intl/fr/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "Ce tutoriel vous a été utile ?", "feedback-widget-thank-you-title": "Merci pour vos commentaires !", "feedback-widget-thank-you-subtitle": "Améliorez cette page en répondant à quelques questions.", - "feedback-widget-thank-you-subtitle-ext": "Si vous avez besoin d'aide, you pouvez contacter la communauté sur notre Discord.", + "feedback-widget-thank-you-subtitle-ext": "Si vous avez besoin d'aide, you pouvez contacter la communauté sur notre Discord.", "feedback-widget-thank-you-timing": "2-3 min", "feedback-widget-thank-you-cta": "Ouvrir l'enquête courte", "find-wallet": "Trouver un portefeuille", @@ -107,7 +107,7 @@ "grants": "Subventions", "grant-programs": "Programme de Soutien à l'Ecosystème", "guides": "Guides", - "guides-hub": "Centre des guides", + "guides-hub": "Guides pratiques", "history-of-ethereum": "L'histoire d'Ethereum", "home": "Accueil", "how-ethereum-works": "Fonctionnement d'Ethereum", diff --git a/src/intl/fr/page-dapps.json b/src/intl/fr/page-dapps.json index 94f69dc0389..eeae0039d6e 100644 --- a/src/intl/fr/page-dapps.json +++ b/src/intl/fr/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "Logo de 1inch", - "page-dapps-dexguru-logo-alt": "Logo de DexGuru", "page-dapps-aave-logo-alt": "Logo de Aave", "page-dapps-add-button": "Dapp suggérée", "page-dapps-add-title": "Ajouter une DApp", + "page-dapps-ankr-logo-alt": "Logo Ankr", + "page-dapps-api3-logo-alt": "Logo API3", + "page-dapps-arweave-logo-alt": "Logo ARweave", "page-dapps-audius-logo-alt": "Logo Audius", "page-dapps-augur-logo-alt": "Logo Augure", "page-dapps-axie-infinity-logo-alt": "Logo Axie Infinity", "page-dapps-balancer-logo-alt": "Logo Banancer", "page-dapps-brave-logo-alt": "Logo Brave", + "page-dapps-beginner-friendly-description": "Quelques applications décentralisées pour les débutants. Explorez plus d'applications décentralisées ci-dessous.", + "page-dapps-beginner-friendly-header": "Bien pour les débutants", "page-dapps-category-arts": "Art et mode", "page-dapps-category-browsers": "Navigateurs", + "page-dapps-category-code-marketplaces": "Marchés de code", "page-dapps-category-collectibles": "Produits de collection numériques", - "page-dapps-category-competitive": "Compétition", + "page-dapps-category-competitive": "Jeux Web3", "page-dapps-category-computing": "Outils de développement", - "page-dapps-category-dex": "Échanges de jetons", - "page-dapps-category-investments": "Investissements", + "page-dapps-category-dex": "Échanges", + "page-dapps-category-investments": "Fonds d'investissement", "page-dapps-category-lending": "Prêter et emprunter", "page-dapps-category-lottery": "Financement participatif", "page-dapps-category-marketplaces": "Marchés", "page-dapps-category-music": "Musique", "page-dapps-category-payments": "Paiements", "page-dapps-category-insurance": "Assurance", - "page-dapps-category-portfolios": "Portefeuilles", - "page-dapps-category-trading": "Marché de trading et marchés prédictifs", + "page-dapps-category-portfolios": "Gestion de portefeuille", + "page-dapps-category-trading": "Marchés prédictifs", "page-dapps-category-utilities": "Utilitaires", "page-dapps-category-worlds": "Mondes virtuels", + "page-dapps-category-demand-aggregator": "Agrégateurs de demande", + "page-dapps-category-derivatives": "Dérivée", + "page-dapps-category-liquid-staking": "Mise en jeu libre", + "page-dapps-category-bridges": "Passerelles", + "page-dapps-category-experiences": "Expériences partagées", + "page-dapps-category-guilds": "Guildes de rendement", + "page-dapps-category-avatar": "Avatars", "page-dapps-choose-category": "Choisir une catégorie", + "page-dapps-category-social": "Réseaux sociaux", + "page-dapps-category-content": "Contenu", + "page-dapps-category-messaging": "Messagerie", + "page-dapps-category-identity": "Identité", "page-dapps-collectibles-benefits-1-description": "Lorsque de l'art est tokenisé sur Ethereum, la propriété peut être prouvée à tout le monde. Vous pouvez tracer le parcours de l'œuvre depuis sa création à son possesseur actuel. Cela empêche les contrefaçons.", "page-dapps-collectibles-benefits-1-title": "La propriété est démontrable", "page-dapps-collectibles-benefits-2-description": "Payer pour diffuser de la musique ou acheter des œuvres d'art est beaucoup plus juste pour les artistes. Avec Ethereum, il y a moins besoin d'intermédiaires. Et si des intermédiaires sont nécessaires, leurs coûts ne sont pas aussi élevés parce que les plateformes n'ont pas besoin de payer pour l'infrastructure du réseau.", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "Ce sont des applications qui se concentrent sur la propriété numérique, augmentant le potentiel de gains pour les créateurs, et inventant de nouvelles façons d'investir dans vos créateurs préférés et leur travail.", "page-dapps-collectibles-title": "Arts et objets de collection décentralisés", "page-dapps-compound-logo-alt": "Logo Compound", + "page-dapps-convex-logo-alt": "Logo de Convex", "page-dapps-cryptopunks-logo-alt": "Logo CryptoPunks", "page-dapps-cryptovoxels-logo-alt": "Logo Cryptovoxels", + "page-dapps-cyberconnect-logo-alt": "Logo CyberConnect", "page-dapps-dapp-description-1inch": "Vous aide à éviter un glissement du prix à la hausse en agrégant les meilleurs prix.", "page-dapps-dapp-description-aave": "Prêtez vos jetons pour gagner des intérêts et retirez à tout moment.", + "page-dapps-dapp-description-ankr": "Ensemble de différents produits d'infrastructure Web3 pour construire, gagner, jouer et plus encore — le tout sur la blockchain.", + "page-dapps-dapp-description-api3": "Flux de données de prix qui permettent aux dApps sur 10 réseaux (et plus encore) de se connecter à des données de prix d'actifs en temps réel, y compris les prix des crypto-monnaies et du forex.", + "page-dapps-dapp-description-arweave": "Stockez les données de manière permanente et durable avec un seul frais initial.", "page-dapps-dapp-description-async-art": "Créez, collectionnez et échangez #ProgrammableArt - des peintures numériques divisées en \"calques\" que vous pouvez utiliser pour affecter l'image globale. Chaque maître et chaque calque est un jeton ERC721.", "page-dapps-dapp-description-audius": "Plateforme de streaming décentralisée. Écoutes = argent pour les créateurs, pas pour les labels.", "page-dapps-dapp-description-augur": "Parier sur les résultats du sport, de l'économie et plus d'événements mondiaux.", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "Gagnez des jetons en naviguant et soutenez vos créateurs préférés avec eux.", "page-dapps-dapp-description-cent": "Un réseau social où vous gagnez de l'argent en publiant des NFT.", "page-dapps-dapp-description-compound": "Prêtez vos jetons pour gagner des intérêts et retirez à tout moment.", + "page-dapps-dapp-description-convex": "Convex permet aux apporteurs de liquidité de Curve de gagner des commissions d'échange et d'obtenir des CRV boostés sans verrouiller les leurs.", "page-dapps-dapp-description-cryptopunks": "Achetez, pariez et offrez des punks à la vente – l'un des premiers jetons de collection sur Ethereum.", "page-dapps-dapp-description-cryptovoxels": "Créez des galeries d'art, construisez des magasins et achetez des terrains – un monde virtuel Ethereum.", + "page-dapps-dapp-description-cyberconnect": "Protocole de graphe social décentralisé qui aide les dApps à amorcer l'effet de réseau et à construire des expériences sociales personnalisées", "page-dapps-dapp-description-dark-forest": "Conquérez des planètes dans un univers infini, généré de façon procédurale et spécifié par cryptographie.", "page-dapps-dapp-description-decentraland": "Collectez et échangez des terrains virtuels dans un monde virtuel que vous pouvez explorer.", "page-dapps-dapp-description-ens": "Noms conviviaux pour les adresses Ethereum et les sites décentralisés.", "page-dapps-dapp-description-foundation": "Investissez dans des éditions uniques d'œuvres d'art numériques et échangez des pièces avec d'autres acheteurs.", "page-dapps-dapp-description-gitcoin": "Gagnez de la cryptomonnaie en travaillant sur des logiciels en open source.", "page-dapps-dapp-description-gitcoin-grants": "Financement participatif de projets communautaires Ethereum avec des contributions amplifiées", + "page-dapps-dapp-description-gm": "Plateforme tout-en-un pour chatter, en vocal et en text qui partage vraiment ses revenus avec ses créateurs", "page-dapps-dapp-description-gods-unchained": "Jeu stratégique de cartes de trading. Gagnez des cartes que vous pouvez vendre dans la vie réelle en jouant.", "page-dapps-dapp-description-golem": "Accédez à l'énergie informatique partagée ou louez vos propres ressources.", + "page-dapps-dapp-description-graph": "Un protocole d'indexation pour rechercher dans des réseaux comme Ethereum et IPFS.", + "page-dapps-dapp-description-ipfs": "Un protocole hypermédia pair à pair conçu pour préserver et augmenter le savoir de l'humanité en rendant le web évolutif, résilient et plus ouvert.", "page-dapps-dapp-description-radicle": "Sécurisez le code pair à pair sans intermédiaires.", + "page-dapps-dapp-description-kyberswap": "Échangez et gagnez aux meilleurs taux.", + "page-dapps-dapp-description-lido": "La mise en jeu simplifiée et sécurisée pour les actifs numériques.", "page-dapps-dapp-description-loopring": "Plateforme de trading Peer-to-peer conçue pour la vitesse.", "page-dapps-dapp-description-marble-cards": "Créez et échangez des cartes numériques uniques basées sur des URL.", "page-dapps-dapp-description-matcha": "Analyse plusieurs marchés pour vous aider à trouver les meilleurs prix.", + "page-dapps-dapp-description-mirror": "Construit sur web3 pour web3, la solide plateforme de publication de Mirror repousse les limites de l'écriture en ligne", + "page-dapps-dapp-description-multichain": "Le routeur ultime pour web3. Il s'agit d'une infrastructure développée pour des interactions arbitraires entre chaînes.", "page-dapps-dapp-description-nifty-gateway": "Achetez des œuvres sur la chaîne auprès des meilleurs artistes, athlètes, marques et créateurs.", "page-dapps-dapp-description-oasis": "Échangez, empruntez et économisez avec Dai, un stablecoin Ethereum.", "page-dapps-dapp-description-opensea": "Achetez, vendez, découvrez, et échangez des produits en édition limitée.", "page-dapps-dapp-description-opera": "Envoyez des cryptomonnaies à partir de votre navigateur aux commerçants, aux autres utilisateurs et aux applications.", + "page-dapps-dapp-description-osuvox": "Avatars 3D vivant sur la blockchain", "page-dapps-dapp-description-poap": "Accumulez des NFT prouvant que vous étiez à différents événements virtuels ou en personne. Utilisez-les pour rejoindre des tirages au sort, voter, collaborer ou juste pour vous vanter.", "page-dapps-dapp-description-polymarket": "Pariez sur les résultats, négociez sur les marchés de l'information.", "page-dapps-dapp-description-pooltogether": "Une loterie que vous ne pouvez pas perdre. Des prix chaque semaine.", @@ -82,13 +113,19 @@ "page-dapps-dapp-description-rotki": "Logiciel libre pour effectuer le suivi, l'analyse, la comptabilité et la fiscalité de votre portefeuille en respectant votre confidentialité.", "page-dapps-dapp-description-krystal": "Une plateforme à guichet unique pour accéder à tous vos services DeFi préférés.", "page-dapps-dapp-description-rarible": "Créez, vendez et achetez des objets de collection tokenisés.", + "page-dapps-dapp-description-rubic": "Agrégateur de technologie Inter-Chain pour les utilisateurs et les dApps.", "page-dapps-dapp-description-sablier": "Diffusez de l'argent en temps réel.", + "page-dapps-dapp-description-skiff": "Email, calendrier, documents et fichiers chiffrés de bout en bout qui vous donnent le pouvoir de communiquer librement.", + "page-dapps-dapp-description-spatial": "Créez votre propre avatar personnalisé et des mondes 3D", + "page-dapps-dapp-description-spruce": "Pile open-source pour laisser le contrôle de l'identité et des données là où il devrait être : entre les mains des utilisateurs.", + "page-dapps-dapp-description-status": "Conçu pour permettre la libre circulation de l'information, protéger le droit à des conversations privées et sécurisées, et promouvoir la souveraineté des individus.", "page-dapps-dapp-description-superrare": "Achetez des œuvres numériques directement auprès des artistes ou sur les marchés secondaires.", + "page-dapps-dapp-description-synthetix": "Synthetix est un protocole pour émettre et échanger des avoirs synthétiques", "page-dapps-dapp-description-token-sets": "Stratégies d'investissement cryptographiques qui se rééquilibrent automatiquement.", "page-dapps-dapp-description-tornado-cash": "Effectuez des transactions anonymes grâce à Ethereum.", "page-dapps-dapp-description-uniswap": "Échangez facilement des jetons ou envoyez des jetons pour des récompenses en pourcentage.", - "page-dapps-dapp-description-dexguru": "Terminal de trading non-dépositaire pour les traders DeFi", - "page-dapps-dapp-description-synthetix": "Synthetix est un protocole pour émettre et échanger des avoirs synthétiques", + "page-dapps-dapp-description-xmtp": "Envoyez des messages entre les comptes blockchain, y compris les messages directs, les alertes, les annonces et plus encore.", + "page-dapps-dapp-description-yearn": "Yearn Finance est un agrégateur de rendement. Il donne aux individus, aux DAOs et aux autres protocoles un moyen de déposer des avoirs numériques et de recevoir des intérêts.", "page-dapps-docklink-dapps": "Introduction aux dapps", "page-dapps-docklink-smart-contracts": "Contrats intelligents", "page-dapps-dark-forest-logo-alt": "Logo de Dark Forest", @@ -104,9 +141,7 @@ "page-dapps-desc": "Trouvez une application Ethereum a essayer.", "page-dapps-doge-img-alt": "Image d'un Shiba utilisant un ordinateur", "page-dapps-editors-choice-dark-forest": "Affrontez d'autres joueurs pour conquérir des planètes et essayez la technologie de pointe de mise à l'échelle/de confidentialité d'Ethereum. À destination uniquement de ceux qui sont familiarisés avec la technologie Ethereum.", - "page-dapps-editors-choice-description": "Quelques DApps que l'équipe ethereum.org adorent en ce moment. Découvrez plus DApps ci-dessous.", "page-dapps-editors-choice-foundation": "Investissez dans la culture. Achetez, échangez, et vendez des illustrations numériques uniques et des articles de mode de certains artistes, musiciens et marques incroyables.", - "page-dapps-editors-choice-header": "Choix de la rédaction", "page-dapps-editors-choice-pooltogether": "Achetez un billet gagnant pour la loterie. Chaque semaine, l'intérêt généré par l'ensemble du pool de billets est envoyé à un heureux gagnant. Récupérez votre argent quand vous le souhaitez.", "page-dapps-editors-choice-uniswap": "Échangez facilement vos jetons. Un favori de la communauté qui vous permet d'échanger des jetons avec le réseau.", "page-dapps-ens-logo-alt": "Logo du service d'Ethereum", @@ -156,8 +191,10 @@ "page-dapps-get-started-title": "Premiers pas", "page-dapps-gitcoin-grants-logo-alt": "Logo Gitcoin Grants", "page-dapps-gitcoin-logo-alt": "Logo Gitcoin", + "page-dapps-gm-logo-alt": "Logo gm.xyz", "page-dapps-gods-unchained-logo-alt": "Logo de Gods Unchained", "page-dapps-golem-logo-alt": "Logo golem", + "page-dapps-graph-logo-alt": "Logo Graph", "page-dapps-radicle-logo-alt": "Logo Radicle", "page-dapps-hero-header": "Outils et services alimenté par Ethereum", "page-dapps-hero-subtitle": "Les DApps, c'est un mouvement croissant d'applications qui utilisent Ethereum pour disrupter les modèles d'entreprises ou en inventer de nouveaux.", @@ -165,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "Un contrat intelligent est comme un ensemble de règles qui vit sur-chaîne à la vue de tous, et fonctionne exactement selon ces règles. Imaginez un distributeur de boissons : si vous lui fournissez suffisamment de fonds et entrez une sélection, vous recevrez la boisson que vous voulez. Et comme les distributeurs, les contrats intelligents peuvent détenir des fonds tout comme votre compte Ethereum. Cela permet de programmer des ententes et des transactions.", "page-dapps-how-dapps-work-p3": "Une fois que les DApps sont déployées sur le réseau Ethereum, vous ne pouvez pas les modifier. Les DApps peuvent être décentralisées car elles sont contrôlées par la logique inscrite dans le contrat, pas par un individu ou une entreprise.", "page-dapps-how-dapps-work-title": "Comment fonctionnent les DApps", + "page-dapps-ipfs-logo-alt": "Logo IPFS", + "page-dapps-kyberswap-logo-alt": "Logo KyberSwap", "page-dapps-learn-callout-button": "Commencer à construire", "page-dapps-learn-callout-description": "Notre portail de développeurs a de la documentation, des outils et des structures pour vous aider à commencer à construire une DApp.", "page-dapps-learn-callout-image-alt": "Illustration d'une main frabriquant un symbole ETH au moyen de briques de lego.", "page-dapps-learn-callout-title": "Apprenez à élaborer une DApp", + "page-dapps-lido-logo-alt": "Logo Lido", "page-dapps-loopring-logo-alt": "Logo Loopring", "page-dapps-magic-behind-dapps-description": "Les DApps peuvent donner l'impression d'être des applications normales mais elles ont des qualités spéciales parce qu'elles héritent de tous les superpouvoirs d'Ethereum. Voici ce qui différencie les DApps des applications.", "page-dapps-magic-behind-dapps-link": "Qu'est-ce qui rend Ethereum génial ?", @@ -179,11 +219,23 @@ "page-dapps-marble-cards-logo-alt": "Logo marble.cards", "page-dapps-async-logo-alt": "Logo d'Async", "page-dapps-matcha-logo-alt": "Logo Matcha", + "page-dapps-metaverse-benefits-title": "métavers", + "page-dapps-metaverse-benefits-description": "Qu'est-ce qui, dans Ethereum, permet au métavers de prospérer ?", + "page-dapps-metaverse-benefits-1-title": "NFTs", + "page-dapps-metaverse-benefits-1-description": "Des objets uniques dans un jeu qui sont la propriété de l'utilisateur et interopérables à travers différents mondes virtuels et marchés ayant les mêmes normes.", + "page-dapps-metaverse-benefits-2-title": "Communautés détenues par les utilisateurs", + "page-dapps-metaverse-benefits-2-description": "Les identités appartiennent aux utilisateurs avec d'infinies possibilités d'explorer et de créer des réseaux sociaux à travers plusieurs mondes virtuels.", + "page-dapps-metaverse-button": "Métavers", + "page-dapps-metaverse-title": "Métavers", + "page-dapps-metaverse-description": "Ce sont des applications qui permettent aux utilisateurs de participer librement à des mondes virtuels. Les utilisateurs peuvent former des réseaux personnels et prendre possession d'actifs numériques", + "page-dapps-mirror-logo-alt": "Logo Mirror", "page-dapps-mobile-options-header": "Parcourir une autre catégorie", + "page-dapps-multichain-logo-alt": "Logo Multichain", "page-dapps-nifty-gateway-logo-alt": "Logo Nifty Gateway", "page-dapps-oasis-logo-alt": "Logo Oasis", "page-dapps-opensea-logo-alt": "Logo OpenSea", "page-dapps-opera-logo-alt": "Logo Opera", + "page-dapps-osuvox-logo-alt": "Logo OSUVOX", "page-dapps-polymarket-logo-alt": "Logo Polymarket", "page-dapps-poap-logo-alt": "Logo Proof of Attendance Protocol", "page-dapps-pooltogether-logo-alt": "Logo PoolTogether", @@ -191,10 +243,18 @@ "page-dapps-ready-button": "Aller", "page-dapps-ready-description": "Choisissez une DApp à essayer", "page-dapps-ready-title": "Prêt ?", + "page-dapps-rubic-logo-alt": "Logo Rubic", "page-dapps-sablier-logo-alt": "Logo Sablier", "page-dapps-set-up-a-wallet-button": "Trouver un portefeuille", "page-dapps-set-up-a-wallet-description": "Un portefeuille est votre \"nom d'utilisateur\" pour une DApp", "page-dapps-set-up-a-wallet-title": "Configurez un portefeuille", + "page-dapps-skiff-logo-alt": "Logo Skiff", + "page-dapps-social-button": "Réseaux sociaux", + "page-dapps-social-description": "Ce sont des applications qui se concentrent sur la création de réseaux sociaux décentralisés en utilisant des technologies d'identité décentralisées où les identités numériques et les graphes sociaux appartiennent aux utilisateurs.", + "page-dapps-social-title": "Réseaux sociaux", + "page-dapps-spatial-logo-alt": "Logo Spatial", + "page-dapps-spruce-logo-alt": "Logo Spruce", + "page-dapps-status-logo-alt": "Logo Status", "page-dapps-superrare-logo-alt": "Logo SuperRare", "page-dapps-technology-button": "Technologie", "page-dapps-technology-description": "Ce sont des applications qui se concentrent sur la décentralisation des outils de développement, l'intégration de systèmes de chiffrement dans la technologie existante, et la création de marchés pour le développement des logiciels libres.", @@ -214,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "En savoir plus sur les objets en jeu tokenisés", "page-dapps-dapp-description-pwn": "Prêts faciles garantis par n'importe quel jeton ou NFT sur Ethereum.", "page-dapps-pwn-image-alt": "Logo PWN", - "page-dapps-dapp-description-yearn": "Yearn Finance est un agrégateur de rendement. Il donne aux individus, aux DAOs et aux autres protocoles un moyen de déposer des avoirs numériques et de recevoir des intérêts.", + "page-dapps-xmtp-logo-alt": "Logo XMTP", + "opage-dapps-yearn-logo-alt": "Logo de Yearn", "page-dapps-yearn-image-alt": "Logo de Yearn", - "page-dapps-dapp-description-convex": "Convex permet aux apporteurs de liquidité de Curve de gagner des commissions d'échange et d'obtenir des CRV boostés sans verrouiller les leurs.", "page-dapps-convex-image-alt": "Logo de Convex", "foundation": "Fondation", "transaction-fees": "Quels sont les frais de transaction ?", - "page-wallets-get-some": "Obtenir de l'ETH" + "page-wallets-get-some": "Obtenir de l'ETH", + "page-dapps-dapp-description-curve": "Curve est un DEX focalisé sur les stablecoins", + "page-dapps-curve-image-alt": "Logo de Curve", + "page-dapps-dapp-description-dodo": "DODO est un fournisseur de liquidités on-chain, qui s'appuie sur l'algorithme Proactive Market Maker (PMM).", + "page-dapps-dodo-image-alt": "Logo de DODO", + "page-dapps-dapp-description-artblocks": "Art Blocks est dédié à donner vie à des œuvres captivantes d'art génératif contemporain", + "page-dapps-artblocks-image-alt": "Logo Art Blocks" } diff --git a/src/intl/fr/page-gas.json b/src/intl/fr/page-gas.json new file mode 100644 index 00000000000..1e9a0c26358 --- /dev/null +++ b/src/intl/fr/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Frais de gaz sur Ethereum : comment cela fonctionne-t-il ?", + "page-gas-meta-description": "En savoir plus sur le gaz sur Ethereum : comment cela fonctionne-t-il et comment payer moins de frais de gaz", + "page-gas-hero-title": "Frais de Gaz", + "page-gas-hero-header": "Frais de réseau", + "page-gas-hero-button-1-content": "Qu'est-ce que le gaz ?", + "page-gas-hero-subtitle-1": "Les frais de réseau sur Ethereum sont appelés gaz.", + "page-gas-hero-subtitle-2": "Le gaz est le carburant qui alimente Ethereum.", + "page-gas-summary-title": "Résumé", + "page-gas-summary-item-1": "Chaque transaction sur Ethereum nécessite une petite forme de paiement pour être traitée", + "page-gas-summary-item-2": "Ces frais sont connus sous le nom de frais de 'gaz'.", + "page-gas-summary-item-3": "Les frais de gaz varient en fonction de la congestion du réseau", + "page-gas-what-are-gas-fees-header": "Que sont les frais de gaz ?", + "page-gas-what-are-gas-fees-text-1": "Pensez à Ethereum comme à un grand réseau informatique où les personnes peuvent effectuer des tâches telles que l'envoi de messages ou l'exécution de programmes. Comme dans le monde réel, ces tâches nécessitent de l'énergie pour être accomplies.", + "page-gas-what-are-gas-fees-text-2": "Dans Ethereum, chaque action de calcul a un prix de \"gaz\" fixé. Vos frais de gaz représentent le coût total des actions de votre transaction. Lorsque vous envoyez une transaction ou exécutez un contrat intelligent, vous payez des frais de gaz pour la traiter.", + "page-gas-how-do-i-pay-less-gas-header": "Comment payer moins de gaz ?", + "page-gas-how-do-i-pay-less-gas-text": "Si l'augmentation des frais sur Ethereum est parfois inévitable, il existe des stratégies pour en réduire le coût :", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Effectuez vos transactions au bon moment", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Tout comme les voyages en dehors des heures de pointe sont moins fréquentés et plus abordables, l'Ethereum est généralement moins cher à utiliser lorsque l'Amérique du Nord est endormie.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Attendre la baisse du prix du gaz", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Les prix du gaz augmentent et diminuent toutes les douze secondes en fonction de l'encombrement d'Ethereum. Lorsque le prix du gaz est élevé, le fait d'attendre quelques minutes avant d'effectuer une transaction peut entraîner une baisse significative du prix à payer.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Utiliser la couche 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Les couches de niveau 2 sont construites sur Ethereum, proposent des frais moins élevés et traitent davantage de transactions. Elles constituent un bon choix pour économiser des frais sur les transactions qui n'ont pas besoin d'être effectuées sur le réseau Ethereum principal.", + "page-gas-try-layer-2": "Essayez la couche 2", + "page-gas-what-causes-high-gas-fees-header": "Quelles sont les causes des frais de gaz élevés ?", + "page-gas-what-causes-high-gas-fees-text-1": "Chaque fois que la quantité de calcul (gaz) sur Ethereum dépasse un certain seuil, les frais de gaz commencent à augmenter. Plus le gaz dépasse ce seuil, plus les frais de gaz augmentent rapidement.", + "page-gas-what-causes-high-gas-fees-text-2": "Des frais plus élevés peuvent être causés par des éléments tels que des dapps ou des NFT populaires, une augmentation périodique des échanges sur les DEX, ou un nombre excessif d'activités d'utilisateurs aux heures de pointe.", + "page-gas-what-causes-high-gas-fees-text-3": "Les développeurs d'Ethereum doivent veiller à optimiser l'utilisation de leurs contrats intelligents avant de les déployer. Si de nombreuses personnes utilisent un contrat intelligent mal écrit, celui-ci consommera plus de gaz et pourrait involontairement provoquer une congestion du réseau.", + "page-gas-want-to-dive-deeper": "Voulez-vous en apprendre davantage ?", + "page-gas-check-out-the-developer-docs": "Consultez la documentation destinée aux développeurs.", + "page-gas-attack-of-the-cryptokitties-header": "L'attaque des Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "En novembre 2017, le projet populaire CryptoKitties a été lancé. Son pic de popularité rapide a provoqué une congestion importante du réseau et des frais de gaz extrêmement élevés. Les défis posés par CryptoKitties ont accéléré l'urgence de trouver des solutions pour l'évolutivité d'Ethereum.", + "page-gas-why-do-we-need-gas-header": "Pourquoi avons-nous besoin de gaz ?", + "page-gas-why-do-we-need-gas-text": "Le gaz est un élément essentiel pour assurer la sécurité d'Ethereum et le traitement des transactions. Le gaz est utile à bien des égards :", + "page-gas-benefits-1-description": "Le gaz permet à Ethereum de résister à la sybille en empêchant les acteurs malveillants de submerger le réseau d'activités frauduleuses.", + "page-gas-benefits-2-description": "Étant donné que le calcul coûte du gaz, le fait de spammer Ethereum avec des transactions coûteuses, que ce soit de manière accidentelle ou malveillante, est financièrement découragé.", + "page-gas-benefits-3-description": "Une limite stricte sur la quantité de calcul qui peut être effectuée à tout moment empêche Ethereum d'être submergé, ce qui contribue à garantir que le réseau soit toujours accessible.", + "page-gas-how-is-gas-calculated-header": "Comment les frais de gaz sont-ils calculés ?", + "page-gas-advanced": "Avancé", + "page-gas-how-is-gas-calculated-text-1": "Le montant total des frais de gaz que vous payez est composé de plusieurs éléments :", + "page-gas-how-is-gas-calculated-item-1": "Frais de base : frais fixés par le réseau qui doivent être payés pour une transaction.", + "page-gas-how-is-gas-calculated-item-2": "Frais de priorité : un conseil facultatif pour inciter les opérateurs de nœuds à inclure votre transaction.", + "page-gas-how-is-gas-calculated-item-3": "Unités de gaz utilisées* : vous vous souvenez que nous avons dit que le gaz représentait le calcul ? Les actions plus complexes, comme l'interaction avec un contrat intelligent, utilisent plus de gaz que les actions simples, comme l'envoi d'une transaction.", + "page-gas-how-is-gas-calculated-list-item-1": "* Voir la figure 1 pour connaître la quantité de gaz utilisée par les différents types de transactions.", + "page-gas-how-is-gas-calculated-text-2": "La formule de calcul des frais de gaz est la suivante : unités de gaz utilisées * (frais de base + frais de priorité). La plupart des portefeuilles calculent la consommation de gaz et l'affichent de manière plus directe.", + "page-gas-table-figure": "Figure 1 : Gaz utilisé par type de transaction", + "page-gas-table-header-1": "Type de transaction", + "page-gas-table-header-2": "Unités de gaz utilisées", + "page-gas-table-item-1-transaction-type": "Envoi d'ETH", + "page-gas-table-item-2-transaction-type": "Envoi de jetons ERC-20", + "page-gas-table-item-3-transaction-type": "Transfert et NFT", + "page-gas-table-item-4-transaction-type": "Échanger sur Uniswap", + "page-gas-faq-header": "Foire aux questions", + "page-gas-faq-question-1-q": "Qui perçoit les frais de gaz dans le cadre de ma transaction ?", + "page-gas-faq-question-1-a-1": "La majeure partie des frais de gaz - la taxe de base - est détruite par le protocole (brûlée). Les frais de priorité, s'ils sont inclus dans votre transaction, seront donnés au validateur qui a proposé votre transaction.", + "page-gas-faq-question-1-a-2": "Vous pouvez lire une description détaillée du processus dans la documentation destinée aux développeurs de gaz.", + "page-gas-faq-question-2-q": "Dois-je payer le gaz en ETH ?", + "page-gas-faq-question-2-a-1": "Oui. Tous les frais de gaz sur Ethereum doivent être payés dans la devise native ETH.", + "page-gas-faq-question-2-a-2": "Plus d'infos sur ETH", + "page-gas-faq-question-3-q": "Qu'est-ce que le gwei ?", + "page-gas-faq-question-3-a-1": "Dans la plupart des portefeuilles ou des systèmes de suivi du gaz, les prix du gaz sont exprimés en 'gwei'.", + "page-gas-faq-question-3-a-2": "Le Gwei est une unité plus petite de l'ETH, comme les centimes le sont pour les dollars, à la différence que 1 ETH équivaut à 1 milliard de Gwei. Le Gwei est utile lorsqu'il s'agit de très petites quantités d'ETH.", + "page-gas-use-layer-2": "Utiliser la couche 2" +} diff --git a/src/intl/fr/page-roadmap-vision.json b/src/intl/fr/page-roadmap-vision.json index 91ad3fe51cc..3f4622e0413 100644 --- a/src/intl/fr/page-roadmap-vision.json +++ b/src/intl/fr/page-roadmap-vision.json @@ -6,23 +6,23 @@ "page-roadmap-vision-desc-1": "Ethereum a besoin de réduire la congestion du réseau et d'améliorer les vitesses pour mieux servir une base d'utilisateurs mondiale.", "page-roadmap-vision-desc-2": "Exécuter un nœud devient plus difficile au fur et à mesure que le réseau grandit. Cela sera encore plus difficile avec les efforts de mise à l'échelle du réseau.", "page-roadmap-vision-desc-3": "Ethereum consomme trop d'électricité. La technologie qui maintient la sécurité du réseau doit être plus durable.", - "page-roadmap-vision-ethereum-node": "En savoir plus sur les nœuds", + "page-roadmap-vision-ethereum-node": "Plus d'infos sur les nœuds", "page-roadmap-vision-future": "Un avenir numérique à l'échelle mondiale", - "page-roadmap-vision-meta-desc": "Un aperçu de l'impact des mises à niveau sur Ethereum et des défis qu'elles doivent surmonter.", + "page-roadmap-vision-meta-desc": "Un aperçu de l'impact des mises à niveau sur Ethereum et des défis devant être surmontés.", "page-roadmap-vision-meta-title": "La vision d'Ethereum", "page-roadmap-vision-mining": "En savoir plus sur le minage", "page-roadmap-vision-problems": "Problèmes actuels", "page-roadmap-vision-scalability": "Évolutivité", "page-roadmap-vision-scalability-desc": "Ethereum doit pouvoir gérer plus de transactions par seconde sans augmenter la taille des nœuds du réseau. Les nœuds sont des acteurs vitaux au réseau qui stockent et exécutent la blockchain. L'augmentation de la taille des nœuds n'est pas pratique car seuls ceux qui disposent d'ordinateurs puissants et coûteux pourraient le faire. Pour évoluer, Ethereum a besoin d'exécuter plus de transactions par seconde, couplé à plus de nœuds. Plus de nœuds signifie plus de sécurité.", - "page-roadmap-vision-scalability-desc-3": "Les mises à jour de la fragmentation permettent de répartir les besoins de stockage des données sur l'ensemble du réseau, et il n'est plus nécessaire que tous les nœuds conservent 100 % des données. Bien que cela ne concerne pas directement la mise à l'échelle de l'exécution des transactions, ce problème est directement résolu par les solutions de rollup de couche 2.", - "page-roadmap-vision-scalability-desc-4": "Les rollups ont besoin d'un stockage bon marché sur la couche 1 pour être plus efficaces. La fragmentation donnera à Ethereum toute latitude pour maximiser l'efficacité des rollups, permettant des améliorations exponentielles au-delà de la limite actuelle de 15-45 transactions par seconde.", + "page-roadmap-vision-scalability-desc-3": "Les rollups de couche 2 font évoluer Ethereum en déplaçant les transactions hors chaîne et en publiant uniquement des données récapitulatives sur Ethereum. Ce regroupement augmente le débit d'Ethereum tout en réduisant considérablement les coûts pour les utilisateurs.", + "page-roadmap-vision-scalability-desc-4": "Les rollups nécessitent un stockage à faible coût sur la couche 1 pour rendre les transactions aussi bon marché que possible pour les utilisateurs. Celui-ci sera fourni sous forme de blobs attachés aux blocs Ethereum. À terme, de nombreux blobs seront attachés aux blocs Ethereum, offrant ainsi un stockage bon marché pour de nombreux rollups.", "page-roadmap-vision-security": "Sécurité", "page-roadmap-vision-security-desc": "Les mises à niveau prévues améliorent la sécurité d'Ethereum contre les attaques coordonnées.", "page-roadmap-vision-security-desc-3": "Avec la preuve d'enjeu, une sécurité supplémentaire provient de facteurs plus importants de dissuasion crypto-économiques contre les attaques. Cela est dû au fait que, dans la preuve d'enjeu, les validateurs qui sécurisent le réseau doivent miser des quantités significatives d'ETH dans le protocole. S'ils tentent d'attaquer le réseau, le protocole peut automatiquement détruire leur ETH.", "page-roadmap-vision-security-desc-5": "Cependant, il est également important que les mises à niveau qui protègent les validateurs contre les attaques par déni de service, améliorent leur anonymat. De plus, la construction de blocs séparés et la propagation de blocs seront prochainement mis en œuvre. Ces mises à niveau protègent les validateurs individuels et le réseau dans son ensemble contre les attaques vives et la censure.", "page-roadmap-vision-security-desc-5-link": "En savoir plus sur la preuve d'enjeu", "page-roadmap-vision-security-desc-10": "La mise en jeu signifie également que vous n'avez pas besoin d'investir dans du matériel d'élite pour participer directement au consensus. Cela devrait encourager davantage de gens à devenir validateur, augmentant ainsi la décentralisation du réseau et diminuant la surface d'attaque.", - "page-roadmap-vision-security-staking": "Mise en jeu de l'ETH", + "page-roadmap-vision-security-staking": "Mettre en jeu de l'ETH", "page-roadmap-vision-security-validator": "Vous pouvez devenir un validateur en mettant en jeu votre ETH.", "page-roadmap-vision-staking-lower": "Plus d'infos sur la mise en jeu", "page-roadmap-vision-subtitle": "Développez Ethereum jusqu'à ce qu'il soit assez puissant pour aider toute l'humanité.", @@ -36,10 +36,10 @@ "page-roadmap-vision-title-1": "Réseau saturé", "page-roadmap-vision-title-2": "Espace disque", "page-roadmap-vision-title-3": "Trop d'énergie", - "page-roadmap-vision-trilemma-cardtext-1": "Les mises à niveau d'Ethereum rendront Ethereum évolutif, sécurisé et décentralisé. La fragmentation rendra Ethereum plus évolutif en augmentant le nombre de transactions par seconde tout en diminuant la puissance nécessaire pour faire fonctionner un nœud et valider la chaîne. La chaîne phare sécurisera Ethereum en coordonnant les validateurs sur un ensemble de données partagées. Enfin, la mise en jeu abaissera la barrière à la participation et limitera les économies d'échelle, créant ainsi un réseau plus vaste et plus décentralisé.", + "page-roadmap-vision-trilemma-cardtext-1": "Les mises à jour d'Ethereum rendront Ethereum évolutif, sécurisé et décentralisé. Staking a abaissé la barrière à la participation et limité les économies d'échelle, créant un réseau plus vaste - plus décentralisé.", "page-roadmap-vision-trilemma-cardtext-2": "Les réseaux blockchain sécurisés et décentralisés exigent que chaque nœud vérifie chaque transaction traitée par la chaîne. Ce volume de travail limite le nombre de transactions qui peuvent se faire à un moment donné. Décentralisée et sécurisée sont les adjectifs qui caractérisent la chaîne Ethereum aujourd'hui.", "page-roadmap-vision-trilemma-cardtext-3": "Les réseaux décentralisés fonctionnent en envoyant des informations sur les transactions à travers les nœuds - tout le réseau a besoin d'être informé de tout changement d'état. La mise à l'échelle des transactions par seconde sur un réseau décentralisé comporte des risques de sécurité car, plus il y a de transactions, plus le délai est long, plus la probabilité d'attaque est élevée lorsque l'information transite sur le réseau.", - "page-roadmap-vision-trilemma-cardtext-4": "L'augmentation de la taille et de la puissance des nœuds d'Ethereum pourrait augmenter les transactions par seconde de façon sécurisée, mais l’exigence matérielle restreindrait alors qui peut ou non le faire – c'est une menace sur la décentralisation. Nous espérons que la fragmentation et la preuve d'enjeu permettront à Ethereum d'augmenter la quantité de nœuds et non la taille de nœuds.", + "page-roadmap-vision-trilemma-cardtext-4": "L'augmentation de la taille et de la puissance des nœuds d'Ethereum pourrait augmenter les transactions par seconde de façon sécurisée, mais l’exigence matérielle restreindrait alors qui peut ou non le faire – c'est une menace pour la décentralisation. Nous espérons que la fragmentation et la preuve d'enjeu permettront à Ethereum d'augmenter la quantité de nœuds et non la taille de nœuds.", "page-roadmap-vision-trilemma-h2": "Le défi de la mise à l'échelle décentralisée", "page-roadmap-vision-trilemma-modal-tip": "Appuyez sur les cercles ci-dessous pour mieux comprendre les problèmes de la mise à l'échelle décentralisée", "page-roadmap-vision-trilemma-p": "La manière naïve de résoudre les problèmes d'Ethereum serait de le rendre plus centralisé. Cependant, la décentralisation est trop importante. C'est la décentralisation qui donne à Ethereum sa neutralité, sa capacité de résistance à la censure, son ouverture, sa gestion de la propriété des données et une sécurité quasi inébranlable.", @@ -57,10 +57,11 @@ "page-roadmap-vision-understanding": "Comprendre la vision Ethereum", "page-roadmap-vision-upgrade-needs": "La nécessité de mettre à niveau", "page-roadmap-vision-upgrade-needs-desc": "Le protocole Ethereum qui a été lancé en 2015 a connu un succès incroyable. Mais la communauté Ethereum s'attendait toujours à ce que quelques mises à niveau clés soient nécessaires pour débloquer le plein potentiel d'Ethereum.", - "page-roadmap-vision-upgrade-needs-desc-2": "La demande élevée augmente les frais de transaction qui font qu'Ethereum est coûteux pour l'utilisateur moyen. L'espace disque nécessaire au fonctionnement d'un client Ethereum augmente à un rythme rapide. Et l'algorithme de consensus sous-jacent sur la preuve de travail qui maintient Ethereum sécurisé et décentralisé a un impact environnemental important.", + "page-roadmap-vision-upgrade-needs-desc-2": "La demande élevée augmente les frais de transaction qui font qu'Ethereum est coûteux pour l'utilisateur moyen. L'espace disque nécessaire au fonctionnement d'un client Ethereum augmente à un rythme rapide.", "page-roadmap-vision-upgrade-needs-desc-3": "Ethereum possède un ensemble de mises à niveau qui traitent ces problèmes et bien plus encore. Cet ensemble d'améliorations s'appelait à l'origine « Serenity » et « Eth2 », et elles sont un domaine actif de recherche et de développement depuis 2014.", "page-roadmap-vision-upgrade-needs-desc-5": "Maintenant que la technologie est prête, ces mises à niveau réarchitectureront Ethereum pour le rendre plus évolutif, sécurisé et durable... pour améliorer la vie des utilisateurs existants et en attirer de nouveaux. Tout en préservant l'idée clé de décentralisation, qui sous-tend Ethereum.", "page-roadmap-vision-upgrade-needs-desc-6": "Cela signifie qu'il n'y a pas d'interrupteur pour activer l'évolutivité d'un seul coup. Les améliorations seront incorporées progressivement au fil du temps.", "page-roadmap-vision-upgrade-needs-serenity": "Voir un article de blog 2015 traitant de « Serenity »", - "ethereum": "Ethereum" + "ethereum": "Ethereum", + "page-roadmap-vision-danksharding": "En savoir plus sur la fragmentation" } diff --git a/src/intl/fr/page-stablecoins.json b/src/intl/fr/page-stablecoins.json index 727e3e0282a..291b10c59b8 100644 --- a/src/intl/fr/page-stablecoins.json +++ b/src/intl/fr/page-stablecoins.json @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "Monnaie fiduciaire", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "Métaux précieux", "page-stablecoins-table-error": "Impossible de charger les stablecoins. Essayez de rafraîchir la page.", + "page-stablecoins-table-loading": "Chargement des données de stablecoin...", "page-stablecoins-title": "Stablecoins", "page-stablecoins-top-coins": "Top des stablecoins par capitalisation boursière", "page-stablecoins-top-coins-intro": "La capitalisation boursière est", diff --git a/src/intl/fr/page-upgrades-get-involved.json b/src/intl/fr/page-upgrades-get-involved.json index 781be56e724..9e76dcf4ec8 100644 --- a/src/intl/fr/page-upgrades-get-involved.json +++ b/src/intl/fr/page-upgrades-get-involved.json @@ -4,23 +4,23 @@ "page-upgrades-get-involved-btn-3": "Trouver des bogues", "page-upgrades-get-involved-bug": "Un bogue pourrait être :", "page-upgrades-get-involved-bug-hunting": "Aller à la chasse aux bogues", - "page-upgrades-get-involved-bug-hunting-desc": "Trouvez et signalez des bogues dans les spécifications de mise à niveau du consensus ou dans les clients eux-mêmes. Vous pouvez gagner jusqu'à 50 000 USD ainsi qu'une place dans le classement.", - "page-upgrades-get-involved-bug-li": "problèmes de non conformité de spécification", - "page-upgrades-get-involved-bug-li-2": "bogues empêchant la finalisation des blocs", + "page-upgrades-get-involved-bug-hunting-desc": "Trouvez et signalez des bogues dans les spécifications de mise à niveau de la couche de consensus ou dans les clients eux-mêmes. Vous pouvez gagner jusqu'à 50 000 USD ainsi qu'une place dans le classement.", + "page-upgrades-get-involved-bug-li": "problèmes de non-conformité de spécification", + "page-upgrades-get-involved-bug-li-2": "bogues empêchant la finalité", "page-upgrades-get-involved-bug-li-3": "vecteurs de déni de service (DOS)", - "page-upgrades-get-involved-bug-li-4": "et plus encore...", - "page-upgrades-get-involved-desc-1": "Exécuter un logiciel client signifie que vous serez un participant actif dans Ethereum. Votre logiciel client vous aidera à garder une trace des transactions et à vérifier les nouveaux blocs.", - "page-upgrades-get-involved-desc-2": "Si vous avez des ETH, vous pouvez le mettre en jeu pour devenir un validateur et aider à sécuriser le réseau. En tant que validateur, vous pouvez gagner des récompenses en ETH.", + "page-upgrades-get-involved-bug-li-4": "Et plus encore...", + "page-upgrades-get-involved-desc-1": "Exécuter un logiciel client signifie que vous serez un participant actif dans Ethereum. Votre client vous aidera à garder une trace des transactions et à vérifier les nouveaux blocs.", + "page-upgrades-get-involved-desc-2": "Si vous avez des ETH, vous pouvez les mettre en jeu pour devenir un validateur et aider à sécuriser le réseau. En tant que validateur, vous pouvez gagner des récompenses en ETH.", "page-upgrades-get-involved-desc-3": "Rejoignez la communauté des testeurs ! Aidez à tester les mises à niveau d'Ethereum avant qu'elles ne soient publiées, trouvez des bogues et gagnez des récompenses.", "page-upgrades-get-involved-ethresearch-1": "Fragmentation", - "page-upgrades-get-involved-ethresearch-2": "La fusion", + "page-upgrades-get-involved-ethresearch-2": "La Fusion", "page-upgrades-get-involved-ethresearch-3": "Execution fragmentée", "page-upgrades-get-involved-ethresearch-4": "Tous les sujets de recherche", "page-upgrades-get-involved-how": "Comment voulez-vous vous impliquer ?", - "page-upgrades-get-involved-how-desc": "La communauté Ethereum bénéficie toujours de l'arrivée de nouvelles personnes qui exécutent des logiciels clients, misent et chassent les bogues.", + "page-upgrades-get-involved-how-desc": "La communauté Ethereum bénéficiera toujours de l'arrivée de nouvelles personnes qui exécutent des logiciels clients, misent et chassent les bogues.", "page-upgrades-get-involved-join": "Rejoignez la recherche", - "page-upgrades-get-involved-join-desc": "Comme c'est souvent le cas avec Ethereum, la plupart des recherches effectuées sont publiques. Cela signifie que vous pouvez prendre part aux discussions ou simplement lire ce que les chercheurs d'Ethereum ont à dire. ethresear.ch couvre un grand nombre de sujets, y compris les mises à niveau du consensus, la fragmentation, les rollups et bien plus encore.", - "page-upgrades-get-involved-meta-description": "Comment participeraux mises à niveau d'Ethereum : opérer des nœuds, mettez en jeu, débusquez des bogues, et bien plus encore.", + "page-upgrades-get-involved-join-desc": "Comme c'est souvent le cas avec Ethereum, la plupart des recherches effectuées sont publiques. Cela signifie que vous pouvez prendre part aux discussions ou simplement lire ce que les chercheurs d'Ethereum ont à dire. ethresear.ch couvre un grand nombre de sujets, y compris les mises à niveau du consensus, les rollups et bien plus encore.", + "page-upgrades-get-involved-meta-description": "Comment participer aux mises à niveau d'Ethereum : opérer des nœuds, mettre en jeu, débusquer des bogues, et bien plus encore.", "page-upgrades-get-involved-run-clients": "Exécuter une paire de clients", "page-upgrades-get-involved-run-clients-desc": "Un 'client' est un logiciel qui exécute la blockchain, et dans le cas d'Ethereum, un noeud complet nécessite l'exécution d'une paire de ces clients : un client de couche d'exécution et un client de couche de consensus. Un nœud complet peut vérifier les transactions et, si vous mettez également des ETH en jeu, peut créer de nouveaux blocs. Chaque client a ses propres caractéristiques, mais exécute la même fonction dans l'ensemble, donc nous vous encourageons à choisir un client minoritaire dans la mesure du possible pour que le pool de clients soit diversifié et sécurisé.", "page-upgrades-get-involved-run-clients-desc-link": "En savoir plus sur la diversité des clients.", @@ -42,6 +42,6 @@ "page-upgrades-get-involved-written-nim": "Écrit en Nim", "page-upgrades-get-involved-written-rust": "Écrit en Rust", "page-upgrades-get-involved": "Participez à la mise à niveau d'Ethereum", - "page-upgrades-get-involved-2": "S'impliquer", + "page-upgrades-get-involved-2": "S’engager", "page-upgrades-bug-bounty-leaderboard-points": "points" } diff --git a/src/intl/fr/page-upgrades-index.json b/src/intl/fr/page-upgrades-index.json index ce15f1854fd..ae5e7644a0a 100644 --- a/src/intl/fr/page-upgrades-index.json +++ b/src/intl/fr/page-upgrades-index.json @@ -11,6 +11,7 @@ "page-upgrades-answer-1": "La Chaîne phare a été employée comme outil pour mettre à niveau le réseau principal Ethereum durant La Fusion.", "page-upgrades-answer-2": "La Fusion représente la mise à niveau la plus importante de l'histoire d'Ethereum, en substituant la preuve de travail par une nouvelle couche de consensus basée sur la preuve d'enjeu.", "page-upgrades-answer-4": "La Chaîne phare a été utilisée pour développer le consensus basé sur la preuve d'enjeu qu'Ethereum utilise aujourd'hui. Elle s'exécute en parallèle du réseau principal Ethereum afin de permettre aux développeurs d'observer le mécanisme de consensus de manière isolée avant de l'utiliser pour coordonner une activité réelle.", + "page-upgrade-article-author-status": "Status", "page-upgrade-article-author-ethmerge": "Ethmerge", "page-upgrade-article-author-alchemy": "Alchemy", "page-upgrade-article-author-consensys": "Consensys", @@ -38,22 +39,22 @@ "page-upgrades-beacon-chain-date": "La chaîne phare a été lancée le 1er décembre 2020", "page-upgrades-beacon-chain-desc": "La chaîne phare a apporté la mise en jeu à Ethereum, et posé les bases des futures mises à niveau. Elle coordonne la nouvelle preuve d'enjeu d'Ethereum.", "page-upgrades-beacon-chain-estimate": "La chaîne phare est active", - "page-upgrades-beacon-chain-title": "La chaîne phare", + "page-upgrades-beacon-chain-title": "La Chaîne phare", "page-upgrades-bug-bounty": "Voir le programme de primes au bogue", "page-upgrades-clients": "Découvrez les clients de consensus (précédemment appelés clients « d'Eth2 »)", "page-staking-deposit-contract-title": "Vérifiez l'adresse du contrat de dépôt", "page-upgrades-dive": "Plongez dans la vision", "page-upgrades-dive-desc": "De quelle manière rendons-nous Ethereum plus évolutif, plus sûr et plus durable (tout en gardant l'éthique fondamentale de décentralisation d'Ethereum) ?", - "page-upgrades-docking": "La fusion", + "page-upgrades-docking": "La Fusion", "page-upgrades-merge-answer-1": "La Fusion a eu lieu le 15 septembre 2022 lorsque Ethereum est passé au consensus par mise en jeu. La Chaîne Phare a fusionné avec le réseau principal, dépréciant officiellement la preuve de travail sur Ethereum, et réduisant la consommation d'énergie d'Ethereum de ~99,95 %.", - "page-upgrades-merge-btn": "Plus d'informations sur la fusion", + "page-upgrades-merge-btn": "Plus d'infos sur la fusion", "page-upgrades-merge-desc": "Le réseau principal Ethereum a fusionné avec la chaîne phare de preuve d'enjeu, marquant ainsi la fin du minage à forte intensité énergétique.", "page-upgrades-merge-estimate": "La Fusion est en ligne", "page-upgrades-merge-mainnet": "Qu'est-ce que le réseau principal ?", "page-upgrades-eth-blog": "blog ethereum.org", "page-upgrades-explore-btn": "Explorez les améliorations", "page-upgrades-get-involved": "Participez à la mise à niveau d'Ethereum", - "page-upgrades-get-involved-2": "S'impliquer", + "page-upgrades-get-involved-2": "S’engager", "page-upgrades-head-to-ethresearch": "Visitez ethresear.ch", "page-upgrades-help": "Souhaitez-vous aider à mettre à niveau Ethereum ?", "page-upgrades-help-desc": "Il existe de nombreuses opportunités pour participer aux mises à niveau d'Ethereum, aider à réaliser des tests, et même gagner des récompenses.", @@ -150,7 +151,7 @@ "page-upgrades-secure": "Plus sécurisé", "page-upgrades-secure-desc": "L'Ethereum doit être plus sécurisé. À mesure que l'adoption d'Ethereum s'intensifie, le protocole doit être plus sécurisé contre toutes les formes d'attaque.", "page-upgrades-shard-date": "La fragmentation suivra la Fusion en plusieurs phases, au cours des années 2023-2024.", - "page-upgrades-shard-desc": "La fragmentation augmentera la capacité d'Ethereum à stocker des données et fonctionnera harmonieusement avec les L2 pour augmenter le débit et réduire les frais de réseau. La fragmentation sera déployée en plusieurs étapes.", + "page-upgrades-shard-desc": "La fragmentation augmentera la capacité d'Ethereum à stocker des données et fonctionnera harmonieusement avec les L2 pour augmenter le débit et réduire les frais de réseau. La fragmentation sera déployée en plusieurs étapes, à commencer par ProtoDanksharding.", "page-upgrades-shard-estimate": "Estimation : 2023-2024", "page-upgrades-shard-lower": "En savoir plus sur la fragmentation", "page-upgrades-shard-title": "Fragmentation", @@ -170,17 +171,17 @@ "page-upgrades-upgrades-docking": "La fusion", "page-upgrades-energy-consumption": "En savoir plus sur la consommation énergétique d'Ethereum", "page-upgrades-upgrading": "Mise à niveau d'Ethereum vers de nouveaux sommets", - "page-roadmap-vision": "Notre vision", - "page-roadmap-vision-btn": "En savoir plus sur la vision d'Ethereum", + "page-roadmap-vision": "La vision", + "page-roadmap-vision-btn": "En savoir plus sur la vision Ethereum", "page-roadmap-vision-desc": "Pour intégrer Ethereum dans le courant général et servir toute l'humanité, nous devons rendre Ethereum plus évolutif, plus sécuritaire et plus durable.", - "page-upgrades-what-happened-to-eth2-title": "Qu'est-il arrivé à « Eth2 » ?", + "page-upgrades-what-happened-to-eth2-title": "Que devient « Eth2 » ?", "page-upgrades-what-happened-to-eth2-1": "Le terme « Eth2 » a été couramment utilisé avant La Fusion mais est progressivement abandonné en faveur d'une terminologie plus précise.", "page-upgrades-what-happened-to-eth2-1-more": "En savoir plus sur la fusion.", "page-upgrades-what-happened-to-eth2-2": "Depuis La Fusion de « Eth1 » et « Eth2 », il n'y a plus deux blockchains distinctes d'Ethereum ; il n'y a qu'Ethereum.", "page-upgrades-what-happened-to-eth2-3": "Pour limiter la confusion, la communauté a mis à jour ces termes :", "page-upgrades-what-happened-to-eth2-3-1": "« Eth1 » est maintenant « la couche d'exécution », qui gère les transactions et les exécutions.", "page-upgrades-what-happened-to-eth2-3-2": "« Eth2 » est maintenant la « couche de consensus », qui gère le consensus de la preuve d'enjeu.", - "page-upgrades-what-happened-to-eth2-4": "Ces mises à jour terminologiques ne modifient que les conventions de nomenclature. Elles ne modifient pas les objectifs ou la feuille de route d'Ethereum.", + "page-upgrades-what-happened-to-eth2-4": "Ces mises à jour d'ordre terminologique ne concernent que les conventions de nommage ; les objectifs et la feuille de route d'Ethereum restent inchangés.", "page-upgrades-what-happened-to-eth2-5": "En savoir plus sur le changement de nom « Eth2 »", "page-upgrades-why-cant-we-just-use-eth2-title": "Pourquoi ne pas juste utiliser Eth2 ?", "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "Mentalités", @@ -203,5 +204,5 @@ "docs-nav-proof-of-stake": "Preuve d'enjeu", "docs-nav-proof-of-work": "Preuve de travail", "page-upgrades-get-involved-ethresearch-1": "Fragmentation", - "page-upgrades-get-involved-ethresearch-2": "La fusion" + "page-upgrades-get-involved-ethresearch-2": "La Fusion" } diff --git a/src/intl/fr/page-upgrades.json b/src/intl/fr/page-upgrades.json index c953779a8d1..7d645891ce8 100644 --- a/src/intl/fr/page-upgrades.json +++ b/src/intl/fr/page-upgrades.json @@ -4,18 +4,21 @@ "page-upgrades-beacon-date": "Expédié !", "page-upgrades-merge-date": "Septembre 2022", "page-upgrades-shards-date": "~2023", + "page-upgrades-pbs": "Pas imminent - attendez 2024/25", "page-upgrades-post-merge-banner-tutorial-ood": "Ce tutoriel est obsolète depuis la fusion et peut ne pas fonctionner. Veuillez éditer un PR sur GitHub si vous souhaitez contribuer.", "page-upgrades-post-merge-banner-governance-ood": "Certains contenus sur cette page sont périmés depuis la fusion. Veuillez éditer un PR sur GitHub si vous souhaitez contribuer.", "page-upgrades-upgrades-guide": "Guide des mises à niveau d'Ethereum", - "page-upgrades-upgrades-docking": "La fusion", + "page-upgrades-upgrades-docking": "La Fusion", "page-upgrades-shard-title": "Fragmentation", - "page-upgrades-upgrades-beacon-chain": "La chaîne phare", + "page-upgrades-upgrades-beacon-chain": "La Chaîne phare", + "consensus-beaconscan-title": "beaconscan", + "consensus-beaconscan-in-title": "beaconcha.in", "consensus-beaconcha-in-desc": "Explorateur open source de la chaîne phare", - "consensus-beaconscan-desc": "Explorateur de la chaîne phare – Etherscan pour la couche consensus", + "consensus-beaconscan-desc": "Explorateur de la chaîne phare – Etherscan pour la couche de consensus", "consensus-become-staker": "Devenir un validateur", "consensus-become-staker-desc": "La mise en jeu est ouverte ! Si vous voulez miser vos ETH pour aider à sécuriser le réseau, soyez au courant des risques.", "consensus-explore": "Explorer les données", "consensus-run-beacon-chain": "Exécuter un client de consensus", "consensus-run-beacon-chain-desc": "Ethereum a besoin qu'un maximum de clients s'exécutent. Aidez ce bien public Ethereum !", - "read-more": "Voir plus" + "read-more": "En savoir plus" } diff --git a/src/intl/hr/common.json b/src/intl/hr/common.json index b416dfc6099..4a6efc85178 100644 --- a/src/intl/hr/common.json +++ b/src/intl/hr/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Apstrakcija računa", "about-ethereum-org": "O stranici ethereum.org", "about-us": "O nama", + "adding-desci-projects": "Dodavanje DeSci projekata", + "adding-developer-tools": "Dodavanje alata za razvojne programere", + "adding-exchanges": "Dodavanje mjenjačnica", + "adding-glossary-terms": "Dodavanje pojmova", + "adding-layer-2s": "Adding Layer 2s", + "adding-products": "Adding Products", + "adding-staking-products": "Dodavanje ulagačkih proizvoda", + "adding-wallets": "Dodavanje novčanika", + "account-abstraction": "Apstrakcija računa", + "acknowledgements": "Priznanja", "aria-toggle-search-button": "Gumb za pretraživanje", "aria-toggle-menu-button": "Gumb za izbornik", "beacon-chain": "Beacon Chain", @@ -12,6 +21,8 @@ "community-hub": "Središte zajednice", "community-menu": "Izbornik zajednice", "contact": "Kontakt", + "content-buckets": "Spremnici za sadržaj", + "content-resources": "Resursi za sadržaj", "content-standardization": "Standardizacija sadržaja", "contributing": "Doprinos", "contributors": "Donatori", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Decentralizirane društvene mreže", "decentralized-science": "Decentralizirana znanost (DeSci)", "defi-page": "Decentralizirane financije (DeFi)", + "design": "Dizajn", + "design-principles": "Principi dizajna", "devcon": "Devcon", "developers": "Programeri", "developers-home": "Početna stranica za programere", @@ -94,11 +107,11 @@ "grants": "Stipendije", "grant-programs": "Programi stipendiranja ekosustava", "guides": "Vodiči", - "guides-hub": "Centar vodiča", + "guides-hub": "How-to guides", "history-of-ethereum": "Povijest Ethereuma", "home": "Početna", "how-ethereum-works": "Kako Ethereum radi", - "how-to-register-an-ethereum-account": "Kako \"registrirati\" Ethereum račun", + "how-to-create-an-ethereum-account": "How to \"create\" an Ethereum account", "how-to-revoke-token-access": "Kako pametnom ugovoru oduzeti pravo pristupa vašim kripto sredstvima", "how-to-swap-tokens": "Kako zamijeniti tokene", "how-to-use-a-bridge": "Kako premostiti tokene na 2. sloj", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Nije moguće učitati podatke. Pokušajte ponovno kasnije.", "logo": "logotip", "mainnet-ethereum": "Glavna mreža Ethereum", + "merge": "Spoji", "more": "Više", "nav-developers": "Programeri", "nav-developers-docs": "Dokumenti za programere", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Pretražuj do mile volje!", "search-eth-address": "Ovo izgleda kao adresa Ethereuma. Ne pružamo podatke specifične za adrese. Pokušajte ga potražiti u istraživaču blokova poput", "search-no-results": "Nije pronađen rezultat za vašu pretragu", + "security": "Sigurnost", "single-slot-finality": "Konačnost jednog utora", "statelessness": "Izostanak stanja", "see-contributors": "Pogledajte donatore", @@ -181,6 +196,7 @@ "start-here": "Počnite ovdje", "style-guide": "Style guide", "solo": "Samostalan staking", + "support": "Podrška", "terms-of-use": "Uvjeti korištenja", "translation-banner-body-new": "Ovu stranicu pregledavate na engleskom jer je još nismo preveli. Pomozite nam prevesti ovaj sadržaj.", "translation-banner-body-update": "Postoji nova verzija ove stranice, ali trenutačno samo na engleskom. Pomozite nam prevesti najnoviju verziju.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Ovdje nema bugove!", "translation-banner-no-bugs-content": "Ova stranica nije prevedena. Zasad smo namjerno ostavili ovu stranicu na engleskom.", "translation-banner-no-bugs-dont-show-again": "Ne prikazuj više", + "translation-program": "Prevoditeljski program", "try-using-search": "Pokušajte pomoću pretraživanja pronaći ono što tražite ili", "tutorials": "Praktični vodiči", "up": "Gore", diff --git a/src/intl/hr/page-get-eth.json b/src/intl/hr/page-get-eth.json index ffa242a089e..2ab1c005e25 100644 --- a/src/intl/hr/page-get-eth.json +++ b/src/intl/hr/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Mjenjačnice su tvrtke koje vam omogućavaju da kupujete kripto koristeći tradicionalne valute. Imaju skrbništvo nad bilo kojim ETH-om koji kupite dok ga ne pošaljete u novčanik koji kontrolirate.", "page-get-eth-checkout-dapps-btn": "Pogledajte dapps", "page-get-eth-community-safety": "Objave zajednice o sigurnosti", - "page-get-eth-description": "Ethereum i ETH ne kontrolira nijedna vlada ili tvrtka – oni su decentralizirani. To znači da je ETH svima otvoren za upotrebu.", + "page-get-eth-description": "Ethereum ne kontrolira niti jedna organizacija – on je decentraliziran.", "page-get-eth-dex": "Decentralizirane mjenjačnice (DEX)", - "page-get-eth-dex-desc": "Ako želite veću kontrolu, kupite ETH od nekog ravnopravnog. S DEX-om možete trgovati bez davanja kontrole nad svojim sredstvima centraliziranoj tvrtki.", + "page-get-eth-dex-desc": "Ako želite veću kontrolu, kupite ETH u obliku pametnog ugovora. S DEX-om možete trgovati digitalnom imovinom bez davanja kontrole nad svojim sredstvima centraliziranoj tvrtki.", + "page-get-eth-peers": "Primite ETH od ravnopravnih članova", + "page-get-eth-peers-desc": "Jednom kada napravite Ethereum račun, sve što trebate učiniti je podijeliti svoju adresu kako biste počeli slati i primati ETH (i druge tokene) izravno od ravnopravnih članova.", + "page-get-eth-staking": "Staking rewards", + "page-get-eth-staking-desc": "Ako već imate ETH, možete zaraditi još više pokretanjem validatorskog čvora. Za taj ste validatorski posao plaćeni u ETH-u.", + "page-get-eth-earn": "Zaradite ETH", + "page-get-eth-earn-desc": "Možete zaraditi ETH radom za DAO ili tvrtke koje plaćaju u kriptovalutama, osvajanjem nagrada, pronalaženjem softverskih grešaka i dr.", + "page-get-eth-daos-link-desc": "Saznajte više o DAO-u", + "page-get-eth-cex-link-desc": "Prikaži popis mjenjačnica", + "page-get-eth-staking-link-desc": "Saznajte više o ulaganju", "page-get-eth-dexs": "Decentralizirane mjenjačnice (DEX)", "page-get-eth-dexs-desc": "Decentralizirane mjenjačnice otvoreno su tržište za ETH i druge tokene. One izravno povezuju kupce i prodavače.", "page-get-eth-dexs-desc-2": "Umjesto da se koriste pouzdanom trećom stranom za zaštitu sredstava u transakciji, oni se koriste kôdom. ETH prodavatelja prenosit će se samo kada je plaćanje zajamčeno. Ta vrsta koda poznata je kao pametni ugovor.", - "page-get-eth-dexs-desc-3": "To znači da je manje geografskih ograničenja nego kod centraliziranih alternativa. Ako netko prodaje ono što želite i prihvaća način plaćanja koji pružate, možete to obaviti. DEX vam omogućuje kupnju ETH-a drugim tokenima, PayPalom ili čak osobnom dostavom gotovine.", + "page-get-eth-dexs-desc-3": "To znači da je manje geografskih ograničenja nego kod centraliziranih alternativa. Ako netko prodaje ono što želite i prihvaća način plaćanja koji pružate, možete to obaviti.", "page-get-eth-do-not-copy": "Primjer: Nemojte kopirati", "page-get-eth-exchanges-disclaimer": "Ove smo podatke prikupili ručno. Ako primijetite nešto pogrešno, javite nam na", - "page-get-eth-exchanges-empty-state-text": "Unesite državu prebivališta da biste vidjeli popis novčanika i mjenjačnica pomoću kojih možete kupiti ETH", + "page-get-eth-exchanges-empty-state-text": "Unesite državu prebivališta da biste vidjeli popis mjenjačnica koje možete upotrebljavati", "page-get-eth-exchanges-except": "Osim", "page-get-eth-exchanges-header": "U kojoj državi živite?", "page-get-eth-exchanges-header-exchanges": "Mjenjačnice", "page-get-eth-exchanges-header-wallets": "Novčanici", - "page-get-eth-exchanges-intro": "Mjenjačnice i novčanici imaju ograničenja gdje mogu prodavati kripto.", + "page-get-eth-exchanges-intro": "Mjenjačnice imaju ograničenja gdje mogu prodavati kriptovalute. Ovo je popis usluga kroz koje možete raditi u svakoj državi. To što su na popisu ne označava preporuku – sami istražite svaku od njih!", "page-get-eth-exchanges-no-exchanges": "Žao nam je, ne znamo nijednu mjenjačnicu koja vam omogućava kupnju ETH iz ove zemlje. Ako vi znate, javite nam na", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Nažalost, ne znamo nijednu mjenjačnicu ili novčanik koji bi vam omogućili kupnju ETH iz ove zemlje. Ako vama uspije, javite nam na", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Žao nam je, ne znamo nijednu mjenjačnicu koja vam omogućava kupnju ETH iz ove zemlje. Ako vi znate, javite nam na", "page-get-eth-exchanges-no-wallets": "Žao nam je, ne znamo nijedan novčanik koji bi vam omogućio da kupite ETH iz ove zemlje. Ako to uspijete, javite nam na", "page-get-eth-exchanges-search": "Upišite gdje živite..", "page-get-eth-exchanges-success-exchange": "Može potrajati nekoliko dana da se registrirate u mjenjačnici zbog njihovih zakonskih provjera.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Nabavite sliku ETH heroja", "page-get-eth-keep-it-safe": "Čuvajte svoj ETH fond na sigurnom", "page-get-eth-meta-description": "Kako kupiti ETH na temelju mjesta na kojem živite i savjeti o tome kako se brinuti o fondu.", - "page-get-eth-meta-title": "Kako kupiti ETH", + "page-get-eth-meta-title": "Kako dobiti ETH", "page-get-eth-need-wallet": "Za upotrebu DEX-a trebat će vam novčanik.", "page-get-eth-new-to-eth": "Novi ste na ETH? Evo objašnjenja za početak.", "page-get-eth-other-cryptos": "Kupujte s drugim kriptom", - "page-get-eth-protect-eth-desc": "Ako planirate kupiti puno ETH-a, možda ćete ga htjeti držati u novčaniku koji kontrolirate, a ne u razmjeni. To je zato što je razmjena vjerojatna meta hakera. Ako haker dobije pristup, mogli biste izgubiti sredstva. U suprotnom, samo vi imate kontrolu nad svojim novčanikom.", - "page-get-eth-protect-eth-in-wallet": "Zaštitite svoj ETH fond u novčaniku", + "page-get-eth-protect-eth-desc": "Jedna od glavnih značajki Ethereuma upravljanje je vlastitim računom i tako zadržavanje kontrole nad vlastitim sredstvim. To znači da svoja sredstva ne morate povjeriti trećoj strani i zaštićeni ste od nepoštenog postupanja treće strane sa sredstvima, njihovog bankrota i gubitka sredstava uslijed internetskih prijevara. S druge strane, to znači da ste odgovorni za vlastitu sigurnost.", + "page-get-eth-protect-eth-in-wallet": "Čuvajte svoj ETH u vlastitom novčaniku", "page-get-eth-search-by-country": "Traži prema državi", - "page-get-eth-security": "Ali to također znači da morate ozbiljno shvatiti sigurnost svojih sredstava. Koristeći ETH ne povjeravate sredstva banci koja će se brinuti o vašem novcu, nego odgovornost preuzimate na sebe.", + "page-get-eth-security": "To znači da morate ozbiljno shvatiti sigurnost svojih sredstava. Koristeći ETH ne povjeravate sredstva banci ili tvrtki koja će se brinuti o vašem novcu, nego odgovornost preuzimate na sebe.", "page-get-eth-smart-contract-link": "Više o pametnim ugovorima", "page-get-eth-swapping": "Zamijenite svoje tokene za ETH sredstva drugih. I obrnuto.", "page-get-eth-try-dex": "Probaj DEX", "page-get-eth-use-your-eth": "Upotrijebite svoja ETH sredstva", "page-get-eth-use-your-eth-dapps": "Sad kad posjedujete određena ETH sredstva, pogledajte neke Ethereum aplikacije (dapps). Postoje dapps aplikacije za financije, društvene medije, igre na sreću i puno drugih kategorija.", "page-get-eth-wallet-instructions": "Slijedite upute za novčanik", - "page-get-eth-wallet-instructions-lost": "Ako izgubite pristup novčaniku, izgubit ćete pristup sredstvima. Novčanik bi vam trebao dati upute za zaštitu od toga. Obavezno ih pažljivo slijedite – u većini slučajeva nitko vam ne može pomoći ako izgubite pristup novčaniku.", + "page-get-eth-wallet-instructions-lost": "Ako izgubite pristup svojemu računu, gubite i pristup svojim sredstvima. Novčanik bi vam trebao dati upute za zaštitu od toga. Obavezno ih pažljivo slijedite – u većini slučajeva nitko vam ne može pomoći ako izgubite pristup računu.", "page-get-eth-wallets": "Novčanici", "page-get-eth-wallets-link": "Više o novčanicima", "page-get-eth-wallets-purchasing": "Neki novčanici omogućuju vam kupnju kripto podataka debitnom/kreditnom karticom, bankovnim prijenosom ili čak Apple Pay-om. Međutim, primjenjuju se zemljopisna ograničenja.", - "page-get-eth-warning": "Ovi DEX-ovi nisu za početnike jer će vam trebati nešto ETH-a da biste ih upotrijebili.", + "page-get-eth-warning": "Decentralizirane mjenjačnice nisu za početnike jer je potrebno imati ETH kako bi se moglo koristiti njima. Ovo su samo primjeri, a ne preporuke. Istražite ih sami!", "page-get-eth-what-are-DEX's": "Što su DEX-ovi?", "page-get-eth-whats-eth-link": "Što je ETH?", - "page-get-eth-where-to-buy-desc": "ETH možete kupiti u mjenjačnicama ili izravno iz novčanika.", + "page-get-eth-where-to-buy-desc": "ETH možeš zaraditi, primiti ga od ravnopravnih članova ili ga kupiti putem mjenjačnica i aplikacija.", "page-get-eth-where-to-buy-desc-2": "Provjerite koje usluge možete upotrebljavati na temelju mjesta u kojem živite.", - "page-get-eth-where-to-buy-title": "Gdje kupiti ETH", + "page-get-eth-where-to-buy-title": "Gdje nabaviti ETH", "page-get-eth-your-address": "Vaša ETH adresa", "page-get-eth-your-address-desc": "Kada preuzmete novčanik, stvorit će vam javnu ETH adresu. Evo primjera kako to izgleda:", "page-get-eth-your-address-desc-3": "Mislite na ovo kao na svoju e-adresu, ali umjesto pošte može primiti ETH. Ako želite prenijeti ETH iz mjenjačnice u novčanik, upotrijebite svoju adresu kao odredište. Obavezno provjerite prije slanja!", diff --git a/src/intl/hr/page-wallets-find-wallet.json b/src/intl/hr/page-wallets-find-wallet.json index 17f52a084b5..cc1e43f7ae5 100644 --- a/src/intl/hr/page-wallets-find-wallet.json +++ b/src/intl/hr/page-wallets-find-wallet.json @@ -49,12 +49,12 @@ "page-find-wallet-token-support": "Podrška za tokene", "page-find-wallet-features": "Značajke", "page-find-wallet-security": "Sigurnost", - "page-find-wallet-smart-contract": "Smart contract", - "page-find-wallet-check-out": "Check out", + "page-find-wallet-smart-contract": "Pametni ugovor", + "page-find-wallet-check-out": "Odjava", "page-find-wallet-info-updated-on": "informacije ažurirane", "page-find-wallet-showing-all-wallets": "Prikaz svih novčanika", "page-find-wallet-showing": "Prikazivanje ", - "page-find-wallet-wallets": "novčanici", + "page-find-wallet-wallets": "novčanika", "page-find-wallet-iOS": "iOS", "page-find-wallet-android": "Android", "page-find-wallet-linux": "Linux", @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "Filtri po značajkama", "page-find-wallet-footnote-1": "Prikaz novčanika na ovoj stranici ne predstavlja službeno odobrenje i služi samo za informaciju.", "page-find-wallet-footnote-2": "Njihovi opisi primljeni su izravno od projekata novčanika.", - "page-find-wallet-footnote-3": "Na ovu stranicu dodajemo proizvode temeljem kriterija iz naše politike uvrštenja. Ako želite da dodamo novčanik, podignite problem na GitHub-u.", + "page-find-wallet-footnote-3": "Na ovu stranicu dodajemo proizvode temeljem kriterija iz naše politike uvrštenja. Ako želite da dodamo novčanik, rehistrirajte problem na GitHub-u.", "page-find-wallet-mobile": "Mobitel", "page-find-wallet-mobile-desc": "Novčanici s mobilnim aplikacijama", "page-find-wallet-desktop": "Desktop", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Novčanici s ekstenzijama za preglednike", "page-find-wallet-device": "Uređaj", "page-find-choose-to-compare": "Odaberite za usporedbu", - "page-find-wallet-choose-features": "Odaberite značajke" + "page-find-wallet-choose-features": "Odaberite značajke", + "page-find-wallet-reset-filters": "Resetirajte filtre" } diff --git a/src/intl/hu/common.json b/src/intl/hu/common.json index 4cc88760025..c7470004b58 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Számlaabsztrakció", "about-ethereum-org": "Az ethereum.org-ról", "about-us": "Rólunk", + "adding-desci-projects": "Desci projektek hozzáadása", + "adding-developer-tools": "Fejlesztői eszközök hozzáadása", + "adding-exchanges": "Tőzsdék hozzáadása", + "adding-glossary-terms": "Új fogalmak hozzáadása", + "adding-layer-2s": "Adding Layer 2s", + "adding-products": "Adding Products", + "adding-staking-products": "Letétbe helyezési lehetőségek hozzáadása", + "adding-wallets": "Tárcák hozzáadása", + "account-abstraction": "Számlaabsztrakció", + "acknowledgements": "Köszönetnyilvánítások", "aria-toggle-search-button": "Keresés bekapcsolása gomb", "aria-toggle-menu-button": "Menü bekapcsolása gomb", "beacon-chain": "Beacon Chain", @@ -12,6 +21,8 @@ "community-hub": "Közösségi központ", "community-menu": "Közösségi menü", "contact": "Kapcsolat", + "content-buckets": "Tartalomgyűjtők", + "content-resources": "Tartalomforrások", "content-standardization": "Tartalomegységesítés", "contributing": "Közreműködők", "contributors": "Hozzájárulók", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Decentralizált közösségi hálózatok", "decentralized-science": "Nem központosított kutatás (DeSci)", "defi-page": "Decentralizált pénzügy (DeFi)", + "design": "Dizájn", + "design-principles": "Dizájnelvek", "devcon": "Devcon", "developers": "Fejlesztők", "developers-home": "Fejlesztői kezdőlap", @@ -59,7 +72,7 @@ "enterprise-menu": "Vállalati menü", "esp": "Ecosystem Támogatási Program", "eth-current-price": "Jelenlegi ETH árfolyam (USD)", - "ethereum-basics": "Ethereum alapok", + "ethereum-basics": "Az Ethereum alapjai", "ethereum-bug-bounty": "Ethereum bugvadász program", "consensus-when-shipping": "Mikor lesz kész?", "ethereum-upgrades": "Az Ethereum fejlesztései", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "Hasznosnak találta az útmutatót?", "feedback-widget-thank-you-title": "Köszönjük a visszajelzést!", "feedback-widget-thank-you-subtitle": "Tedd jobbá ezt az oldalt egy pár kérdés megválaszolásával.", - "feedback-widget-thank-you-subtitle-ext": "Ha segítségre van szüksége, akkor a Discordunkon veheti fel a kapcsolatot közösségünkkel.", + "feedback-widget-thank-you-subtitle-ext": "Ha segítségre van szüksége, akkor a Discordunkon veheti fel a kapcsolatot közösségünkkel.", "feedback-widget-thank-you-timing": "2–3 perc", "feedback-widget-thank-you-cta": "Rövid kérdőív megnyitása", "find-wallet": "Tárca keresése", @@ -94,11 +107,11 @@ "grants": "Támogatások", "grant-programs": "Ökoszisztéma-támogatási program", "guides": "Útmutatók", - "guides-hub": "Útmutatóközpont", + "guides-hub": "Útmutatók", "history-of-ethereum": "Az Ethereum története", "home": "Kezdőlap", "how-ethereum-works": "Hogy működik az Ethereum", - "how-to-register-an-ethereum-account": "Hogyan lehet létrehozni Ethereum-számlát", + "how-to-create-an-ethereum-account": "Hogyan lehet Ethereum számlát „létrehozni”", "how-to-revoke-token-access": "Hogyan vonható vissza, hogy az okosszerződés hozzáférjen a kriptoeszközeihez", "how-to-swap-tokens": "Hogyan lehet átváltani a tokeneket", "how-to-use-a-bridge": "Hogyan lehet áthelyezni a tokeneket a második blokkláncrétegbe (L2)", @@ -121,13 +134,14 @@ "learn-more": "Bővebben", "less": "Kevesebb", "light-mode": "Világos", - "listing-policy-disclaimer": "Az oldalon szereplő egyik termék sincs hivatalosan jóváhagyva, csak információs célokat szolgálnak. Ha szeretnél egy terméket hozzáadni, vagy visszajelzést küldeni az irányelvről, akkor nyiss egy GitHub ticketet.", + "listing-policy-disclaimer": "Az oldalon szereplő egyik termék sincs hivatalosan jóváhagyva, csak információs célokat szolgálnak. Ha szeretnél egy terméket hozzáadni, vagy visszajelzést küldeni az irányelvről, akkor nyiss egy Github ticketet.", "loading": "Betöltés...", "loading-error": "Betöltési hiba.", "loading-error-refresh": "Hiba, kérjük frissítsen.", "loading-error-try-again-later": "Nem sikerült az adatok betöltése. Kérjük, próbálja meg később.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Egyesítés", "more": "Több", "nav-developers": "Fejlesztők", "nav-developers-docs": "Fejlesztői dokumentumok", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Keresés indítása!", "search-eth-address": "Ez úgy néz ki, mint egy Ethereum cím. Mi nem szolgáltatunk címspecifikus adatot. Próbálj meg rákeresni egy blokkfelfedezőn, mint például", "search-no-results": "Nincs találat a keresésre", + "security": "Biztonság", "single-slot-finality": "Egyhelyes véglegesség", "statelessness": "Hontalanság", "see-contributors": "Hozzájárulók megtekintése", @@ -179,8 +194,9 @@ "stake-eth": "ETH letétbe helyezése", "staking": "Letétbe helyezés", "start-here": "Kezdje itt", - "style-guide": "Style guide", + "style-guide": "Stílusútmutató", "solo": "Egyéni letétbe helyezés", + "support": "Támogatás", "terms-of-use": "Felhasználási feltételek", "translation-banner-body-new": "Ezt az oldalt angol nyelven látja, mert még nem fordítottuk le. Segítsen lefordítani ezt a tartalmat.", "translation-banner-body-update": "Az oldal új verziója jelenleg csak angolul érhető el. Segítsen nekünk a fordításban.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Itt nincsenek bugok!", "translation-banner-no-bugs-content": "Ez az oldal nincs lefordítva. Egyelőre szándékosan hagytuk meg angol nyelven ezt az oldalt.", "translation-banner-no-bugs-dont-show-again": "Ne jelenjen meg többször", + "translation-program": "Fordítási Program", "try-using-search": "Használja a keresőt, hogy megtalálja, amit keres vagy", "tutorials": "Oktatóanyagok", "up": "Fel", diff --git a/src/intl/hu/learn-quizzes.json b/src/intl/hu/learn-quizzes.json index 49589736cd4..179dda701b6 100644 --- a/src/intl/hu/learn-quizzes.json +++ b/src/intl/hu/learn-quizzes.json @@ -242,7 +242,7 @@ "f004-c-label": "alkotói gazdaság", "f004-c-explanation": "Az NFT-k révén jöhetett létre az alkotói gazdaság.", "f004-d-label": "„doge” gazdaság", - "f004-d-explanation": "Az NFT-k révén létrejöhetett egy új gazdaság az alkotók, nem a „doge” 🐶 számára.", + "f004-d-explanation": "Az NFT-k révén létrejöhetett egy új gazdaság az alkotók, nem a „doge” számára.", "f005-prompt": "Az Ethereumon lévő NFT káros a környezetre", "f005-a-label": "Igaz", "f005-a-explanation": "Az egyesítés (The Merge) óta (áttérés a proof-of-stake-re), a tranzakcióknak jelentéktelen hatása van a környezetre.", diff --git a/src/intl/hu/page-dapps.json b/src/intl/hu/page-dapps.json index 6bd01235a54..cd08bb7311c 100644 --- a/src/intl/hu/page-dapps.json +++ b/src/intl/hu/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "1inch logó", - "page-dapps-dexguru-logo-alt": "DexGuru-logó", "page-dapps-aave-logo-alt": "Aave logó", "page-dapps-add-button": "Dapp ajánlása", "page-dapps-add-title": "Dapp hozzáadása", + "page-dapps-ankr-logo-alt": "Ankr logó", + "page-dapps-api3-logo-alt": "API3 logó", + "page-dapps-arweave-logo-alt": "ARweave logó", "page-dapps-audius-logo-alt": "Audius logó", "page-dapps-augur-logo-alt": "Augur logó", "page-dapps-axie-infinity-logo-alt": "Axie Infinity logó", "page-dapps-balancer-logo-alt": "Balancer logó", "page-dapps-brave-logo-alt": "Brave logó", + "page-dapps-beginner-friendly-description": "Néhány dapp kezdő felhasználóknak. Fedezzen fel még több dappot alább.", + "page-dapps-beginner-friendly-header": "Kezdő felhasználóknak", "page-dapps-category-arts": "Művészet és divat", "page-dapps-category-browsers": "Böngészők", + "page-dapps-category-code-marketplaces": "Programkódpiactér", "page-dapps-category-collectibles": "Digitális gyűjthető tárgyak", - "page-dapps-category-competitive": "Verseny", + "page-dapps-category-competitive": "Web3 játékok", "page-dapps-category-computing": "Fejlesztői eszközök", - "page-dapps-category-dex": "Tokenváltások", - "page-dapps-category-investments": "Befektetések", + "page-dapps-category-dex": "Tőzsdék", + "page-dapps-category-investments": "Befektetési alapok", "page-dapps-category-lending": "Hitelezés és kölcsönzés", "page-dapps-category-lottery": "Közösségi finanszírozás", "page-dapps-category-marketplaces": "Piacterek", "page-dapps-category-music": "Zene", "page-dapps-category-payments": "Fizetések", "page-dapps-category-insurance": "Biztosítás", - "page-dapps-category-portfolios": "Portfóliók", - "page-dapps-category-trading": "Kereskedelem és hírpiacok", + "page-dapps-category-portfolios": "Portfólió-menedzsment", + "page-dapps-category-trading": "Fogadói piacok", "page-dapps-category-utilities": "Eszközök", "page-dapps-category-worlds": "Virtuális világok", + "page-dapps-category-demand-aggregator": "Keresletaggregátorok", + "page-dapps-category-derivatives": "Derivatívák", + "page-dapps-category-liquid-staking": "Likvid letétbe helyezés", + "page-dapps-category-bridges": "Bridges", + "page-dapps-category-experiences": "Közös élmények", + "page-dapps-category-guilds": "Hozamvadászok", + "page-dapps-category-avatar": "Avatárok", "page-dapps-choose-category": "Válassz kategóriát", + "page-dapps-category-social": "Közösségi média", + "page-dapps-category-content": "Tartalom", + "page-dapps-category-messaging": "Üzenetküldés", + "page-dapps-category-identity": "Identitás", "page-dapps-collectibles-benefits-1-description": "Amikor egy műalkotást Ethereumon tokenizálnak, akkor a tulajdonjogról bárki megbizonyosodhat. Vissza lehet követni a műalkotás életútját a keletkezéstől a jelenlegi tulajdonosig. Ez megakadályozza a hamisítást.", "page-dapps-collectibles-benefits-1-title": "A tulajdonjog bizonyítható", "page-dapps-collectibles-benefits-2-description": "A művészek szemszögéből sokkal igazságosabb fizetni a zene streamelésért vagy műtárgyakért. Az Ethereumnál kevésbé van szükség harmadik félre. És ha szükséges is harmadik felet bevonni, a költségeik nem olyan magasak, mivel a platformoknak nem kell a hálózati infrastruktúráért fizetni.", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "Ezek olyan alkalmazások, amelyek a digitális tulajdonjogra fókuszálnak úgy, hogy az alkotók számára kereseti potenciált biztosítanak és új lehetőségeket teremtenek, hogy befektethessen a kedvenc alkotóiba és a munkájukba.", "page-dapps-collectibles-title": "Decentralizált műalkotások és gyűjthető tárgyak", "page-dapps-compound-logo-alt": "Compound logo", + "page-dapps-convex-logo-alt": "Convex-logó", "page-dapps-cryptopunks-logo-alt": "CryptoPunks logo", "page-dapps-cryptovoxels-logo-alt": "Cryptovoxels logo", + "page-dapps-cyberconnect-logo-alt": "CyberConnect logó", "page-dapps-dapp-description-1inch": "Segít elkerülni a magas árcsúszásokat a legjobb árak összehasonlításával.", "page-dapps-dapp-description-aave": "Adja kölcsönbe tokeneit, keressen kamatot és vegye ki, amikor csak szeretné.", + "page-dapps-dapp-description-ankr": "Különféle web3-as infrastruktúra-összeállítások programépítéshez, pénzkereséshez, játékhoz és más használatra – minden a blokkláncon belül.", + "page-dapps-dapp-description-api3": "Ár referenciaadatok első kézből, amelyek által a dappok 10 (a jövőben még több) hálózaton valós időben tudnak kapcsolódni az eszközök áradataihoz, beleértve a kriptó és forex árakat is.", + "page-dapps-dapp-description-arweave": "Adattárolás folyamatosan, fenntartható módon egy előre kifizetett díj ellenében.", "page-dapps-dapp-description-async-art": "Alkosson, gyűjtsön és kereskedjen #ProgramozhatoMutaggyal –a digitális festmények „Rétegekre” bonthatók, amelyeket a teljes kép befolyásolására használhat. Minden Master és Layer egy-egy ERC721 token.", "page-dapps-dapp-description-audius": "Decentralizált streaming platform. Hallgatások = pénz az alkotóknak, nem a kiadóknak.", "page-dapps-dapp-description-augur": "Fogadjon sporteseményekre, gazdasági vagy más eseményekre.", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "Keress tokeneket böngészéskor és támogasd kedvenc alkotóidat.", "page-dapps-dapp-description-cent": "Egy közösségi hálózat, ahol pénzt kereshet NFT-k készítésével.", "page-dapps-dapp-description-compound": "Adja kölcsönbe tokeneit, keressen kamatot, és vegye ki, amikor csak szeretné.", + "page-dapps-dapp-description-convex": "A Convex lehetővé teszi, hogy a Curve-nek likviditást biztosító egyének kereskedelmi díjakat kapjanak, valamint boosted CRV-t kapjanak anélkül, hogy a saját CRV-jük zárolásra kerülne.", "page-dapps-dapp-description-cryptopunks": "Vásároljon, licitáljon vagy adjon el punkokat – az egyik legelső gyűjthető tokent az Ethereumon.", "page-dapps-dapp-description-cryptovoxels": "Hozzon létre galériákat, építsen üzleteket vagy vásároljon földet az Ethereum virtuális világban.", + "page-dapps-dapp-description-cyberconnect": "Decentralizált közösségigráf-protokoll, amelynek révén a dappok képesek a hálózati hatásokat felhasználni és személyre szabott közösségi tapasztalatot adni", "page-dapps-dapp-description-dark-forest": "Hódítson meg bolygókat egy végtelen, algoritmikusan létrehozott, kriptográfiailag meghatározott univerzumban.", "page-dapps-dapp-description-decentraland": "Gyűjtsön és kereskedjen virtuális földdel egy virtuális világban, amit felfedezhet.", "page-dapps-dapp-description-ens": "Felhasználóbarát nevek Ethereum-címekhez vagy decentralizált oldalakhoz.", "page-dapps-dapp-description-foundation": "Fektessen be egyedi kiadású műalkotásokba, és kereskedjen velük más vevőkkel.", "page-dapps-dapp-description-gitcoin": "Szerezzen kriptót nyílt forráskódú szoftverfejlesztéssel.", "page-dapps-dapp-description-gitcoin-grants": "Közösségi finanszírozás Ethereum közösségi projekteknek felerősített hozzájárulásokkal", + "page-dapps-dapp-description-gm": "Egyetlen platform csevegésre, fórumok működtetésére és véleménynyilvánításra, amely megosztja a keletkező jövedelmet a tartalom készítőivel", "page-dapps-dapp-description-gods-unchained": "Stratégiai kártyajáték. Szerezzen kártyákat játék közben, amiket a való életben el is adhat.", "page-dapps-dapp-description-golem": "Szerezzen hozzáférést megosztott számítási kapacitáshoz, vagy adja bérbe a saját erőforrásait.", + "page-dapps-dapp-description-graph": "Egy indexáló protokoll, mellyel lekérdezhetők olyan hálózatok, mint az Ethereum és az IPFS.", + "page-dapps-dapp-description-ipfs": "Egy közvetítőmentes (peer-to-peer) hipermédia-protokoll az emberiség tudásának megőrzésére és fejlesztésére azáltal, hogy a hálózatot fejleszthetővé, rugalmassá és nyitottabbá teszi.", "page-dapps-dapp-description-radicle": "Biztonságos peer-to-peer kódkollaboráció közvetítők nélkül.", + "page-dapps-dapp-description-kyberswap": "Átváltás és jövedelemszerzés a legjobb árakon.", + "page-dapps-dapp-description-lido": "Digitális eszközök egyszerűsített és biztonságos letétbe helyezése.", "page-dapps-dapp-description-loopring": "Peer-to-peer kereskedelmi platform a sebességre kihegyezve.", "page-dapps-dapp-description-marble-cards": "Alkosson egyedi digitális kártyákat, melyek URL-eken alapulnak.", "page-dapps-dapp-description-matcha": "Több különböző tőzsde között megtalálja Önnek a legjobb árakat.", + "page-dapps-dapp-description-mirror": "Web3-ra épített platform web3-tartalmakért – a Mirror robosztus publikációs platformja kiterjeszti az írások online publikálásának határait", + "page-dapps-dapp-description-multichain": "A legjobb router a web3 számára. Egy olyan infrastruktúra, amelyet a korlátlan láncok közötti interakciókra fejlesztettek.", "page-dapps-dapp-description-nifty-gateway": "Vásároljon alkotásokat a láncon top művészektől, sportolóktól, márkáktól vagy alkotóktól.", "page-dapps-dapp-description-oasis": "Kereskedjen, vegyen fel kölcsönt vagy tegyen félre Daival, egy Ethereum stabil érmével.", "page-dapps-dapp-description-opensea": "Vásárolonj, adja tovább, fedezzen fel és kereskedjen limitált kiadású javakkal.", "page-dapps-dapp-description-opera": "Küldjön kriptót a böngészőjéből kereskedőknek, más felhasználóknak vagy alkalmazásoknak.", + "page-dapps-dapp-description-osuvox": "3D avatárok, amelyek a blokkláncon élnek", "page-dapps-dapp-description-poap": "Gyűjtsön NFT-ket, amelyek bizonyítják, hogy különböző virtuális vagy személyes eseményeken vett részt. Használja őket sorsolásokon való részvételhez, szavazáshoz, együttműködéshez vagy egyszerűen csak dicsekedéshez.", "page-dapps-dapp-description-polymarket": "Fogadonj kimenetelekre. Kereskedjen a hírpiacokon.", "page-dapps-dapp-description-pooltogether": "A szerencsejáték, amin nem veszíthet. Nyeremények minden héten.", @@ -82,13 +113,19 @@ "page-dapps-dapp-description-rotki": "Nyílt forráskódú portfóliókövető, elemző, számviteli és adóbevallási eszköz, amely tiszteletben tartja a magánszférát.", "page-dapps-dapp-description-krystal": "Egyetlen platform az összes kedvenc DeFi-szolgáltatás eléréséhez.", "page-dapps-dapp-description-rarible": "Készítsen, adjon el és vásároljon tokenizált gyűjthető tárgyakat.", + "page-dapps-dapp-description-rubic": "Láncok közötti technológiai aggregátor a felhasználók és a dappok számára.", "page-dapps-dapp-description-sablier": "Streameljen pénzt valós időben.", + "page-dapps-dapp-description-skiff": "Teljeskörűen titkosított levelezés, naptár, dokumentumok és fájlok, amelyek által szabadon kommunikálhat.", + "page-dapps-dapp-description-spatial": "Hozza létre saját avatárját és 3D világait", + "page-dapps-dapp-description-spruce": "Nyílt forráskódú megoldás, mellyel a személyazonosság és az adatok a felhasználónál maradnak, mivel egyedül hozzá tartoznak.", + "page-dapps-dapp-description-status": "Lehetővé teszi az információk szabad áramlását, biztosítja a bizalmas és biztonságos beszélgetéseket, és elősegíti az egyének szuverenitását.", "page-dapps-dapp-description-superrare": "Vásároljon digitális műtárgyakat közvetlenül a művészektől vagy másodlagos piacokról.", + "page-dapps-dapp-description-synthetix": "A Synthetix egy szintetikus eszközöket létrehozó és azokkal kereskedő protokoll", "page-dapps-dapp-description-token-sets": "Kripto befektetési stratégiák, melyek automatikusan kiegyensúlyozódnak.", "page-dapps-dapp-description-tornado-cash": "Küldjön névtelen tranzakciókat az Ethereumon.", "page-dapps-dapp-description-uniswap": "Cseréljen tokeneket egyszerűen, vagy biztosítson tokeneket egy bizonyos kamatért cserébe.", - "page-dapps-dapp-description-dexguru": "Nem felügyelt kereskedelmi platform DeFi kereskedőknek", - "page-dapps-dapp-description-synthetix": "A Synthetix egy szintetikus eszközöket létrehozó és azokkal kereskedő protokoll", + "page-dapps-dapp-description-xmtp": "Blokkláncszámlák közötti üzenetküldés, amelyben közvetlen üzenetek, figyelmeztetések, bejelentések és más jellegű közlések is lehetségesek.", + "page-dapps-dapp-description-yearn": "A Yearn Finance egy hozamokat aggregáló projekt, mely lehetővé teszi, hogy egyének, DAO-k és más protokollok letétbe helyezzék digitális eszközeiket és arra hozamot kapjanak.", "page-dapps-docklink-dapps": "Bevezetés a dappok világába", "page-dapps-docklink-smart-contracts": "Okosszerződések", "page-dapps-dark-forest-logo-alt": "Dark Forest logo", @@ -104,9 +141,7 @@ "page-dapps-desc": "Keressen Ethereum applikációt, amit szívesen kipróbálna.", "page-dapps-doge-img-alt": "Illusztráció egy számítógépet használó doge-kutyáról", "page-dapps-editors-choice-dark-forest": "Játsszon más játékosok ellen a bolygók meghódításában és próbáld ki a legkorszerűbb Ethereum méretezési/adatvédelmi technológiát. Inkább azoknak, akik már járatosak az Ethereumban.", - "page-dapps-editors-choice-description": "Egy pár dapp, amit az ethereum.org csapat nagyon kedvel mostanság. Fedezzen fel több dappot lentebb.", "page-dapps-editors-choice-foundation": "Fektessen a kultúrába. Vásároljon, kereskedjen és adjon el egyedi digitális műtárgyakat és divatcikkeket pár hihetetlen előadótól, zenésztől vagy márkától.", - "page-dapps-editors-choice-header": "A Szerkesztők ajánlata", "page-dapps-editors-choice-pooltogether": "Vegyen veszteségmentes lottójegyet! Minden héten egy szerencsés nyertes megkapja a jegyalap által termelt egy heti kamat összegét. Kapja vissza a pénzét, amikor csak akarja.", "page-dapps-editors-choice-uniswap": "Cseréljen tokeneket könnyedén. Egy közösségi kedvenc, mely segít, hogy a többiekkel kereskedjen a hálózaton keresztül.", "page-dapps-ens-logo-alt": "Ethereum Name Service logo", @@ -156,8 +191,10 @@ "page-dapps-get-started-title": "Kezdjünk bele", "page-dapps-gitcoin-grants-logo-alt": "Gitcoin Grants logo", "page-dapps-gitcoin-logo-alt": "Gitcoin logo", + "page-dapps-gm-logo-alt": "gm.xyz logo", "page-dapps-gods-unchained-logo-alt": "Gods Unchained logo", "page-dapps-golem-logo-alt": "Golem logo", + "page-dapps-graph-logo-alt": "Graph logó", "page-dapps-radicle-logo-alt": "Radicle logó", "page-dapps-hero-header": "Ethereummal működtetett eszközök és szolgáltatások", "page-dapps-hero-subtitle": "A dappok olyan egyre növekvő alkalmazások, melyek az Ethereumot használják, hogy üzleti modelleket tegyenek próbára, vagy újakat hozzanak létre.", @@ -165,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "Az okosszerződés egy láncon futó szabályrendszer, így bárki meggyőződhet arról, hogy minden szabályszerűen történik. Képzeljen el egy ételautomatát: ha elég pénzt dob be és a megfelelő dolgot választja ki, akkor azt kapja, amit szeretne. És ahogy az automaták, úgy az okosszerződések is tőkét tárolnak hasonlóan az Ethereum számlájához. Így a kód megállapodásokat és trnazakciókat mediálhat.", "page-dapps-how-dapps-work-p3": "A dappokat az Ethereum hálózatra történő telepítésük után nem lehet megváltoztatni. A dappok decentralizáltak lehetnek, ha a szerződésbe írt logika irányítja őket, nem pedig egy személy vagy egy cég.", "page-dapps-how-dapps-work-title": "Hogy működnek a dappok", + "page-dapps-ipfs-logo-alt": "IPFS logó", + "page-dapps-kyberswap-logo-alt": "KyberSwap logó", "page-dapps-learn-callout-button": "Kezdjen el építeni", "page-dapps-learn-callout-description": "A közösségi fejlesztői portálunk dokumentációkat, eszközöket és keretrendszereket is tartalmaz, hogy segítsen belekezdeni a dappok építésébe.", "page-dapps-learn-callout-image-alt": "Egy kéz illusztrációja, mely egy ETH szimbólumot épít lego kockákból.", "page-dapps-learn-callout-title": "Tanuljon meg dappot építeni", + "page-dapps-lido-logo-alt": "Lido logó", "page-dapps-loopring-logo-alt": "Loopring logo", "page-dapps-magic-behind-dapps-description": "A dappok hasonlítanak egy normál apphoz, de a kulisszák mögött van néhány különleges tulajdonságuk, mert öröklik az Ethereum összes szupererejét. Itt egy pár dolog, hogy miben különböznek a dappok az appoktól.", "page-dapps-magic-behind-dapps-link": "Mi teszi az Ethereumot nagyszerűvé?", @@ -179,11 +219,23 @@ "page-dapps-marble-cards-logo-alt": "marble.cards logo", "page-dapps-async-logo-alt": "Async logó", "page-dapps-matcha-logo-alt": "Matcha logo", + "page-dapps-metaverse-benefits-title": "metaverzum", + "page-dapps-metaverse-benefits-description": "Mi az, ami miatt az Ethereum lehetővé teszi a metaverzumok virágzását?", + "page-dapps-metaverse-benefits-1-title": "NFT-k", + "page-dapps-metaverse-benefits-1-description": "Egyedi, játékhoz tartozó tételek, amelyeket a felhasználó birtokol és a különféle, ugyanazt a szabványt követő virtuális világokban és piactereken is kezelhet.", + "page-dapps-metaverse-benefits-2-title": "A felhasználók által menedzselt közösségek", + "page-dapps-metaverse-benefits-2-description": "Felhasználók által birtokolt személyazonosság, mellyel széleskörűen tudnak felfedezni és létrehozni közösségi hálózatokat számos virtuális világban.", + "page-dapps-metaverse-button": "Metaverzum", + "page-dapps-metaverse-title": "Metaverzum", + "page-dapps-metaverse-description": "Olyan alkalmazások, amelyek által a felhasználók szabadon részt vehetnek a virtuális világokban. Személyes kapcsolatokat alakíthatnak ki és digitális eszközöket is birtokolhatnak", + "page-dapps-mirror-logo-alt": "Mirror logó", "page-dapps-mobile-options-header": "Másik kategória böngészése", + "page-dapps-multichain-logo-alt": "Multichain logó", "page-dapps-nifty-gateway-logo-alt": "Nifty Gateway logo", "page-dapps-oasis-logo-alt": "Oasis logo", "page-dapps-opensea-logo-alt": "OpenSea logo", "page-dapps-opera-logo-alt": "Opera logo", + "page-dapps-osuvox-logo-alt": "OSUVOX logó", "page-dapps-polymarket-logo-alt": "Polymarket logo", "page-dapps-poap-logo-alt": "Proof of Attendance Protocol (azaz részvételt tanúsító protokoll) logó", "page-dapps-pooltogether-logo-alt": "PoolTogether logo", @@ -191,10 +243,18 @@ "page-dapps-ready-button": "Ugrás", "page-dapps-ready-description": "Válasszon ki egy dappot, amit ki szeretne próbálni", "page-dapps-ready-title": "Készen áll?", + "page-dapps-rubic-logo-alt": "Rubic logó", "page-dapps-sablier-logo-alt": "Sablier logo", "page-dapps-set-up-a-wallet-button": "Tárca keresése", "page-dapps-set-up-a-wallet-description": "A tárcával „jelentkezhet be” a dappba", "page-dapps-set-up-a-wallet-title": "Tárca létrehozása", + "page-dapps-skiff-logo-alt": "Skiff logó", + "page-dapps-social-button": "Közösségi", + "page-dapps-social-description": "Ezek olyan alkalmazások, amelyek lényege a decentralizált közösségi hálózatok létrehozása decentralizált személyazonossági technológiát használva, ahol a felhasználók birtokában van a személyazonosságuk és a közösségi gráfjuk is.", + "page-dapps-social-title": "Közösségi", + "page-dapps-spatial-logo-alt": "Spatial logó", + "page-dapps-spruce-logo-alt": "Spruce logó", + "page-dapps-status-logo-alt": "Status logo", "page-dapps-superrare-logo-alt": "SuperRare logo", "page-dapps-technology-button": "Technológia", "page-dapps-technology-description": "Ezek olyan alkalmazások, amelyek a fejlesztői eszközök decentralizálására, a kriptogazdasági rendszerek beépítésére a meglévő technológiára és a nyílt forráskódú fejlesztési munkák piactereinek létrehozására összpontosítanak.", @@ -214,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "Bővebben a tokenizált, játékokhoz kapcsolódó dolgokról", "page-dapps-dapp-description-pwn": "Hitelek könyedén, amelyek mögött bármilyen, az Ethereumon elérhető token vagy NFT áll.", "page-dapps-pwn-image-alt": "PWN logó", - "page-dapps-dapp-description-yearn": "A Yearn Finance egy hozamokat aggregáló projekt, mely lehetővé teszi, hogy egyének, DAO-k és más protokollok letétbe helyezzék digitális eszközeiket és arra hozamot kapjanak.", + "page-dapps-xmtp-logo-alt": "XMTP logó", + "opage-dapps-yearn-logo-alt": "Yearn-logó", "page-dapps-yearn-image-alt": "Yearn-logó", - "page-dapps-dapp-description-convex": "A Convex lehetővé teszi, hogy a Curve-nek likviditást biztosító egyének kereskedelmi díjakat kapjanak, valamint boosted CRV-t kapjanak anélkül, hogy a saját CRV-jük zárolásra kerülne.", "page-dapps-convex-image-alt": "Convex-logó", "foundation": "Alapítvány", "transaction-fees": "Mik azok a tranzakciós díjak?", - "page-wallets-get-some": "Szerezz valamennyi ETH-et" + "page-wallets-get-some": "Szerezz valamennyi ETH-et", + "page-dapps-dapp-description-curve": "A Curve egy olyan decentralizált tőzsde (dex), amely a stabil érmékre fókuszál", + "page-dapps-curve-image-alt": "Curve logó", + "page-dapps-dapp-description-dodo": "A DODO egy láncon belüli likviditási szolgáltató, amely a Proactive Market Maker (PMM, Proaktív piacmenedzselő) algoritmust használja", + "page-dapps-dodo-image-alt": "DODO logó", + "page-dapps-dapp-description-artblocks": "Az Art Blocks a kortárs, generatív művészet lenyűgöző alkotásait kelti életre", + "page-dapps-artblocks-image-alt": "Art Blocks logó" } diff --git a/src/intl/hu/page-developers-docs.json b/src/intl/hu/page-developers-docs.json index 7ac126e541a..b1f50b96163 100644 --- a/src/intl/hu/page-developers-docs.json +++ b/src/intl/hu/page-developers-docs.json @@ -1,59 +1,135 @@ { "docs-nav-accounts": "Fiókok", + "docs-nav-accounts-description": "Entitások a hálózaton, akik egyenleggel rendelkezhetnek és tranzakciókat indíthatnak", "docs-nav-advanced": "Speciális", "docs-nav-backend-apis": "Backend API-ok", "docs-nav-block-explorers": "Blokk felfedezők", "docs-nav-blocks": "Blokkok", + "docs-nav-blocks-description": "Az a módszer, amely alapján a tranzakciókat kötegelik annak biztosítására, hogy a státusz minden szereplőnél szinkronizálva legyen", + "docs-nav-bridges": "Bridges", + "docs-nav-bridges-description": "Fejlesztőknek szóló áttekintés a hidakról", "docs-nav-compiling-smart-contracts": "Okosszerződések fordítása", "docs-nav-composability": "Összeilleszthetőség", "docs-nav-consensus-mechanisms": "Konszenzus mechanizmusok", + "docs-nav-consensus-mechanisms-description": "Hogyan egyeznek meg az elosztott hálózat egyéni csomópontjai a rendszer aktuális státuszáról", + "docs-nav-gasper": "Gasper", + "docs-nav-weak-subjectivity": "Gyenge szubjektivitás", + "docs-nav-attestations": "Tanúsítások", + "docs-nav-keys": "Kulcsok", + "docs-nav-block-proposal": "Blokkjavaslat", "docs-nav-data-and-analytics": "Adat és elemzések", + "docs-nav-data-and-analytics-description": "Hogyan kerül aggregálásra, rendezésre és megvalósításra a blokkláncadat a dapp-ba", + "docs-nav-data-availability": "Adatelérhetőség", "docs-nav-dart": "Dart", "docs-nav-delphi": "Delphi", "docs-nav-deploying-smart-contracts": "Okosszerződések telepítése", + "docs-nav-design-and-ux": "Bevezetés a tervezésbe és UX-be", + "docs-nav-design-and-ux-description": "Bevezetés az UX-tervezésbe és -kutatásba a web3 térben és az Ethereumon", + "docs-nav-design-fundamentals": "Tervezési alapok", "docs-nav-development-frameworks": "Fejlesztői keretrendszerek", + "docs-nav-development-frameworks-description": "Eszközök, amelyek megkönnyítik a fejlesztést az Ethereum", "docs-nav-development-networks": "Fejlesztői hálózatok", + "docs-nav-development-networks-description": "Lokális blokklánc-környezetek a dappok tesztelésére a bevezetés előtt", "docs-nav-dot-net": ".NET", - "docs-nav-erc-20": "ERC-20", - "docs-nav-erc-721": "ERC-721", + "docs-nav-erc-20": "ERC-20: helyettesíthető tokenek", + "docs-nav-erc-721": "ERC-721: NFT-k", "docs-nav-erc-777": "ERC-777", "docs-nav-erc-1155": "ERC-1155", + "docs-nav-erc-4626": "ERC-4626", "docs-nav-ethereum-client-apis": "Ethereum kliens API-ok", + "docs-nav-ethereum-client-apis-description": "Kényelmes könyvtárak, hogy a webes alkalmazás kommunikálni tudjon az Ethereummal és az okosszerződésekkel", "docs-nav-ethereum-stack": "Ethereum stack", "docs-nav-evm": "Ethereum virtuális gép (EVM)", + "docs-nav-evm-description": "Az EVM kezeli az összes számítást az Ethereum-hálózaton", "docs-nav-foundational-topics": "Alapvető témák", "docs-nav-gas": "Üzemanyag", + "docs-nav-gas-description": "A tranzakciók feldolgozása számítási kapacitást igényel, amelyet a küldők fizetnek ki ETH-ben", "docs-nav-golang": "Golang", "docs-nav-integrated-development-environments-ides": "Integrált Fejlesztői Környezetek (IDE-k)", + "docs-nav-integrated-development-environments-ides-description": "A legjobb környezet a dapp programozásra", "docs-nav-intro-to-dapps": "Bevezetés a dapps-ok világába", + "docs-nav-intro-to-dapps-description": "Bevezetés a decentralizált alkalmazásokba", + "docs-nav-intro-to-ether": "Bevezetés az Ether világába", + "docs-nav-intro-to-ether-description": "Az ether rövid áttekintése", "docs-nav-intro-to-ethereum": "Bevezetés az Ethereum-ba", + "docs-nav-intro-to-ethereum-description": "Az Ethereum rövid áttekintése", "docs-nav-intro-to-the-stack": "Bevezetés a stack-be", + "docs-nav-intro-to-the-stack-description": "Az Ethereum/web3 áttekintése", "docs-nav-java": "Java", "docs-nav-java-script-apis": "JavaScript API-ok", "docs-nav-javascript": "JavaScript", + "docs-nav-json-rpc": "JSON-RPC", + "docs-nav-mev": "Bányászattal kitermelhető maximális érték (MEV)", + "docs-nav-mev-description": "A blokkjutalmon túl hogyan nyerhető ki érték az Ethereum-blokkláncból", "docs-nav-mining": "Bányászat", + "docs-nav-mining-algorithms": "Bányászati algoritmusok", + "docs-nav-dagger-hashimoto": "Dagger-Hashimoto", + "docs-nav-ethash": "Ethash", "docs-nav-networks": "Hálózatok", + "docs-nav-networks-description": "Az Ethereum megvalósítása a teszthálózatokkal együtt", "docs-nav-nodes-and-clients": "Csomópontok és kliensek", + "docs-nav-nodes-and-clients-description": "A hálózatban részt vevő egyének, illetve a tranzakciók igazolásához futtatott szoftverek", + "docs-nav-opcodes": "Műveleti kódok", + "docs-nav-run-a-node": "Csomópont futtatása", + "docs-nav-client-diversity": "Kliensdiverzitás", + "docs-nav-bootnodes": "Bootnode-ok", + "docs-nav-light-clients": "Könnyű kliens", "docs-nav-nodes-as-a-service": "Csomópont, mint szolgáltatás", "docs-nav-oracles": "Orákulumok", + "docs-nav-oracles-description": "Az információ bekerülése az Ethereum blokkláncba", "docs-nav-programming-languages": "Programozási nyelvek", + "docs-nav-programming-languages-description": "Az Ethereum használata olyan nyelvekkel, amelyeket már ismer", "docs-nav-proof-of-stake": "Proof-of-stake", "docs-nav-proof-of-work": "Proof-of-work", "docs-nav-python": "Python", - "docs-nav-readme": "README", + "docs-nav-readme": "Áttekintés", + "docs-nav-ruby": "Ruby", "docs-nav-rust": "Rust", "docs-nav-scaling": "Méretezés", - "docs-nav-smart-contract-security": "Biztonság", + "docs-nav-scaling-description": "Módszerek a decentralizáció és a biztonság megőrzésére az Ethereum növekedésével", + "docs-nav-scaling-optimistic-rollups": "Optimista összesítések", + "docs-nav-scaling-zk-rollups": "Zero-knowledge összegzők", + "docs-nav-scaling-channels": "Állapotcsatornák", + "docs-nav-scaling-sidechains": "Mellékláncok", + "docs-nav-scaling-plasma": "Plasma", + "docs-nav-scaling-validium": "Validium", + "docs-nav-smart-contract-security": "Okosszerződés-biztonság", + "docs-nav-smart-contract-security-description": "Bevált gyakorlatok az okosszerződés-támadások és -sebezhetőségek kezelésére", + "docs-nav-smart-contract-formal-verification": "Az okosszerződés formális érvényesítése", + "docs-nav-smart-contract-formal-verification-description": "Bevezetés a formális hitelesítésbe az Ethereum-okosszerződések kontextusában", "docs-nav-smart-contract-anatomy": "Okosszerződés felépítés", "docs-nav-smart-contract-languages": "Okosszerződés nyelvek", "docs-nav-smart-contracts": "Okosszerződések", + "docs-nav-smart-contracts-description": "Programok, amelyek Ethereum-címen találhatók, és tranzakciók által kiváltott funkciókat futtatnak", "docs-nav-smart-contracts-libraries": "Okosszerződés könyvtárak", "docs-nav-standards": "Szabványok", + "docs-nav-standards-description": "Közös protokollok a projektek hatékonyságának és elérhetőségének fenntartására a közösség felé", "docs-nav-storage": "Tárhely", + "docs-nav-storage-description": "Decentralizált tárolási struktúrák és mechanizmusok", "docs-nav-testing-smart-contracts": "Okosszerződések tesztelése", "docs-nav-token-standards": "Token szabványok", "docs-nav-transactions": "Tranzakciók", + "docs-nav-transactions-description": "Transzferek és más akciók, amelyek megváltoztatják az Ethereum státuszát", + "docs-nav-upgrading-smart-contracts": "Okosszerződések frissítése", + "docs-nav-verifying-smart-contracts": "Okosszerződések érvényesítése", "docs-nav-web2-vs-web3": "Web2 vs Web3", + "docs-nav-web2-vs-web3-description": "Alapvető különbségek, amelyeket a blokkláncon alapuló alkalmazások nyújtanak", + "docs-nav-networking-layer": "Hálózati réteg", + "docs-nav-networking-layer-description": "Az Ethereum hálózati rétegének működése", + "docs-nav-networking-layer-network-addresses": "Hálózati címek", + "docs-nav-networking-layer-portal-network": "Portal Network", + "docs-nav-data-structures-and-encoding": "Adatszerkezetek és kódolás", + "docs-nav-data-structures-and-encoding-description": "Az Ethereum stacken használt adatstruktúrák és kódolási sémák bemutatása", + "docs-nav-data-structures-and-encoding-rlp": "Rekurzív hosszúságú prefixum (RLP)", + "docs-nav-data-structures-and-encoding-patricia-merkle-trie": "Patricia Merkle Trie", + "docs-nav-data-structures-and-encoding-ssz": "Egyszerű sorosítás (SSZ)", + "docs-nav-data-structures-and-encoding-web3-secret-storage": "Web3 titkos tárhely meghatározása", + "docs-nav-rewards-and-penalties": "PoS jutalmak és büntetések", + "docs-nav-node-architecture": "Csomópont-architektúra", + "docs-nav-archive-nodes": "Csomópontok archiválása", + "docs-nav-attack-and-defense": "PoS-támadás és védekezés", + "docs-nav-pos-vs-pow": "A proof-of-stake és a proof-of-work összehasonlítása", + "docs-nav-pos-faqs": "Proof-of-stake GYIK", "page-calltocontribute-desc-1": "Ha a témának a szakértője vagy és szeretnél hozzájárulni, akkor szerkeszd ezt az oldalt és szórd meg a tudásoddal.", "page-calltocontribute-desc-2": "Jóváírást kapsz, és segítesz az Ethereum közösségnek!", "page-calltocontribute-desc-3": "Használd rugalmasan", @@ -62,8 +138,12 @@ "page-calltocontribute-link-2": "Discord szerver", "page-calltocontribute-span": "Oldal szerkesztése", "page-calltocontribute-title": "Segíts nekünk ezzel a lappal", - "back-to-top": "Vissza a tetejére", - "banner-page-incomplete": "Ez az oldal nem teljes, és szeretnénk a segítségét kérni. Szerkessze ezt az oldalt, és adjon hozzá bármit, ami Ön szerint hasznos lehet másoknak.", + "layer-2-arbitrum-note": "A hibavizsgálat csak az engedélyezőlistán szereplő felhasználók számára elérhető, az engedélyezőlista még nincs megnyitva", + "layer-2-boba-note": "Az állapotvalidálás fejlesztés alatt áll", + "layer-2-metis-note": "Fejlesztés alatt álló csalási bizonyítékok", + "layer-2-optimism-note": "A hibavizsgálat fejlesztés alatt áll", + "back-to-top": "Vissza az oldal tetejére", + "banner-page-incomplete": "Ez az oldal nem teljes, és szeretnénk a segítségét kérni. Szerkessze az oldalt, és adjon hozzá bármit, ami Ön szerint hasznos lehet másoknak.", "next": "Következő", "previous": "Előző" } diff --git a/src/intl/hu/page-gas.json b/src/intl/hu/page-gas.json new file mode 100644 index 00000000000..c7fbca54a7c --- /dev/null +++ b/src/intl/hu/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Gázdíjak az Ethereumon: hogyan működnek?", + "page-gas-meta-description": "Tudjon meg többet arról, hogy mi a gáz az Ethereumon: hogyan működik és hogyan lehet kevesebb gázdíjat fizetni", + "page-gas-hero-title": "Gázdíjak", + "page-gas-hero-header": "Hálózati díjak", + "page-gas-hero-button-1-content": "Mi az a gáz?", + "page-gas-hero-subtitle-1": "Az Ethereumon a hálózati díjakat nevezik gáznak.", + "page-gas-hero-subtitle-2": "A gáz az az üzemanyag, amely az Ethereumot működteti.", + "page-gas-summary-title": "Összegzés", + "page-gas-summary-item-1": "Az Ethereumon minden tranzakcióért valamekkora összeget fizetni kell, hogy azt feldolgozza a rendszer", + "page-gas-summary-item-2": "Ezeket a díjakat nevezzük gázdíjnak", + "page-gas-summary-item-3": "A gázdíjak a hálózati leterheltség alapján változnak", + "page-gas-what-are-gas-fees-header": "Mik a gázdíjak?", + "page-gas-what-are-gas-fees-text-1": "Gondoljon úgy az Ethereumra, akár egy nagy számítógépes hálózatra, ahol az emberek üzeneteket tudnak küldeni vagy programokat tudnak futtatni. Ahogy a való világban, úgy ezekhez a feladatokhoz is energiára van szükség.", + "page-gas-what-are-gas-fees-text-2": "Az Ethereumban minden számítási tevékenység egy előre meghatározott gázdíjjal rendelkezik. Az Ön gázdíja a tranzakcióban lévő tevékenységek teljes költsége. Amikor Ön tranzakciót küld vagy okosszerződést futtat, ennek díját gázban fizeti ki, hogy végre legyen hajtva.", + "page-gas-how-do-i-pay-less-gas-header": "Hogyan fizessek kevesebb gázt?", + "page-gas-how-do-i-pay-less-gas-text": "Miközben az Ethereumon néha elkerülhetetlenek a magas díjak, vannak olyan stratégiák, amelyekkel a költség csökkenthető:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Időzítse a tranzakciókat", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Ahogy a szezonon kívüli utazások kevésbé zsúfoltak és megfizethetőbbek, úgy az Ethereumot is általában olcsóbb használni, amikor Észak-Amerikában éjszaka van.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Várja meg, amíg a gáz ára csökken", + "page-gas-how-do-i-pay-less-gas-card-2-description": "A gáz ára tizenkét másodpercenként emelkedik vagy csökken, attól függően, hogy mennyire zsúfolt az Ethereum. Ha a gázárak magasak, akkor várjon néhány percet a tranzakció előtt, és jelentősen csökkenhet a fizetendő összeg.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "A második blokkláncréteg (L2) használata", + "page-gas-how-do-i-pay-less-gas-card-3-description": "A második blokkláncréteg (L2) megoldások az Ethereumra épülnek, alacsonyabb díjakat kínálnak és több tranzakciót kezelnek. Jó választásnak bizonyulnak, ha olyan tranzakciók díját szeretnénk megtakarítani, amelyeknek nem kell a fő Ethereum-hálózaton történniük.", + "page-gas-try-layer-2": "Próbálja ki a második blokkláncréteges (L2) megoldásokat", + "page-gas-what-causes-high-gas-fees-header": "Mi okozza a magas gázdíjakat?", + "page-gas-what-causes-high-gas-fees-text-1": "Amikor az Ethereumon a számítási kapacitás mennyisége (gáz) meghalad egy bizonyos küszöbértéket, a gázdíjak emelkedni kezdenek. Minél inkább meghaladja a gáz ezt a küszöböt, annál gyorsabban nőnek a díjak.", + "page-gas-what-causes-high-gas-fees-text-2": "A magasabb díjakat olyan dolgok okozhatják, mint a népszerű dappok vagy NFT-k, az időszakosan megnövekedett kereskedés a decentralizált tőzsdéken (DEX), vagy a felhasználói aktivitás növekedése csúcsidőben.", + "page-gas-what-causes-high-gas-fees-text-3": "Az Ethereumon dolgozó fejlesztőknek ügyelniük kell arra, hogy az okosszerződések használatát a telepítés előtt optimalizálják. Ha sokan használnak egy rosszul megírt okosszerződést, az több gázt fog fogyasztani, és nem szándékos hálózati torlódást okozhat.", + "page-gas-want-to-dive-deeper": "Szeretne többet tudni erről?", + "page-gas-check-out-the-developer-docs": "Tekintsen bele a fejlesztői dokumentációkba.", + "page-gas-attack-of-the-cryptokitties-header": "A Cryptokitties berobbanása", + "page-gas-attack-of-the-cryptokitties-text": "2017 novemberében indult a népszerű CryptoKitties projekt. A népszerűség megugrása jelentős hálózati torlódást és magas gázdíjakat okozott. Ezek a kihívások megnövelték az Ethereum skálázására vonatkozó megoldások sürgősségét.", + "page-gas-why-do-we-need-gas-header": "Miért van szükség gázra?", + "page-gas-why-do-we-need-gas-text": "A gáz kritikus szerepet játszik abban, hogy az Ethereum biztonságos legyen és tranzakciókat lehessen rajta végrehajtani. A gáz számos módon segít:", + "page-gas-benefits-1-description": "A gáz sybil-ellenállóvá teszi az Ethereumot, megakadályozva, hogy a rosszindulatú szereplők csalárd tevékenységekkel árasszák el a hálózatot.", + "page-gas-benefits-2-description": "Mivel a számítás gázba kerül, az Ethereum drága tranzakciókkal való teleszemetelése (spam), véletlenül vagy rosszindulatúan, pénzügyileg nem motiváló.", + "page-gas-benefits-3-description": "Az egyszerre elvégezhető számítások mennyiségének korlátozása megakadályozza, hogy az Ethereum túlterhelődjön, így biztosítva, hogy a hálózat mindig elérhető legyen.", + "page-gas-how-is-gas-calculated-header": "Hogyan kerül kiszámításra a gáz?", + "page-gas-advanced": "Speciális", + "page-gas-how-is-gas-calculated-text-1": "Az Ön által fizetett gázdíj több elemből áll:", + "page-gas-how-is-gas-calculated-item-1": "Alapdíj: a hálózat által meghatározott díj, melyet a tranzakcióért fizetni kell", + "page-gas-how-is-gas-calculated-item-2": "Elsőbbségi díj: egy opcionális borravaló, amely motiválja a csomópont-üzemeltetőket, hogy prioritással kezeljék az Ön tranzakcióját", + "page-gas-how-is-gas-calculated-item-3": "Az elhasznált gáz egysége*: emlékszik, hogy azt mondtuk, a gáz a számítási kapacitást jelenti? Az összetettebb tevékenységek, mint az okosszerződésekkel való interakció, több gázt használ, mint az egyszerűbbek, például egy tranzakció elküldése.", + "page-gas-how-is-gas-calculated-list-item-1": "* Tekintse meg az 1. ábrán, hogy a különféle tranzakciók mennyi gázt használnak", + "page-gas-how-is-gas-calculated-text-2": "A gázdíj kiszámításának képlete: felhasznált gázegység * (alapdíj + elsőbbségi díj). A legtöbb tárca kiszámítja a gázhasználatot, és egyértelműen megmutatja azt.", + "page-gas-table-figure": "1. ábra: A tranzakciótípusok által használt gáz", + "page-gas-table-header-1": "Tranzakciótípus", + "page-gas-table-header-2": "Felhasznált gázegységek", + "page-gas-table-item-1-transaction-type": "ETH küldése", + "page-gas-table-item-2-transaction-type": "ERC-20 tokenek küldése", + "page-gas-table-item-3-transaction-type": "NFT átadása", + "page-gas-table-item-4-transaction-type": "Valutaváltás a Uniswap-on", + "page-gas-faq-header": "Gyakran ismételt kérdések", + "page-gas-faq-question-1-q": "Ki kapja meg a gázdíjat a tranzakciómból?", + "page-gas-faq-question-1-a-1": "A gázdíj nagy részét – az alapdíjat – a protokoll megsemmisíti (elégeti). Az elsőbbségi díjat, ha az Ön tranzakciója tartalmaz ilyet, az a validátor kapja, aki előterjeszti azt.", + "page-gas-faq-question-1-a-2": "A folyamat részletes leírását a gázfejlesztői dokumentációban olvashatja.", + "page-gas-faq-question-2-q": "A gázt ETH-ben kell fizessem?", + "page-gas-faq-question-2-a-1": "Igen. Az Ethereumon minden gázdíjat a natív ETH valutában kell kifizetni.", + "page-gas-faq-question-2-a-2": "Többet az ETH-ről", + "page-gas-faq-question-3-q": "Mi az a gwei?", + "page-gas-faq-question-3-a-1": "A legtöbb tárcában vagy gázlistában a gázárakat a denominált gwei-ben jelölik.", + "page-gas-faq-question-3-a-2": "A gwei az ETH kisebb egysége (ahogy a penny a dollárnak), 1 ETH 1 milliárd gwei-nek felel meg. Tehát a gwei akkor hasznos, ha kis mennyiségű ETH-ről beszélünk.", + "page-gas-use-layer-2": "A második blokkláncréteg (L2) használata" +} diff --git a/src/intl/hu/page-get-eth.json b/src/intl/hu/page-get-eth.json index 4eeacf9eb4d..71350895bc9 100644 --- a/src/intl/hu/page-get-eth.json +++ b/src/intl/hu/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "A tőzsdék olyan vállalkozások, melyek lehetővé teszik kriptó vásárlását hagyományos valutákkal. Ők rendelkeznek az Ön által vásárolt ETH felett, amíg ki nem utalja egy tárcába, amit Ön irányít.", "page-get-eth-checkout-dapps-btn": "Nézd meg a dappokat", "page-get-eth-community-safety": "Közösségi posztok a biztonságról", - "page-get-eth-description": "Az Ethereumot és az ETH-et egyik cég vagy kormány sem irányítja - decentralizáltak. Ez azt jelenti, hogy az ETH-et bárki használhatja.", + "page-get-eth-description": "Az Ethereumot nem irányítja semmilyen szervezet – teljesen decentralizált.", "page-get-eth-dex": "Decentralizált tőzsdék (DEX-ek)", - "page-get-eth-dex-desc": "Ha nagyobb kontrollt szeretnél, akkor vásárolj ETH-et peer-to-peer módon. A DEX-ekkel úgy kereskedhetsz, hogy nem adod át a kontrollt a vagyonod felett egy centralizált vállalatnak.", + "page-get-eth-dex-desc": "Ha nagyobb kontrollt szeretne, akkor vásároljon ETH-et okosszerződéssel. A DEX-ekkel úgy kereskedhet digitális eszközökkel, hogy nem adja át a kontrollt a vagyona felett egy centralizált vállalatnak.", + "page-get-eth-peers": "Kapjon ETH-t más személyektől", + "page-get-eth-peers-desc": "Amint rendelkezik Ethereum számlával, csak meg kell adnia a címét ahhoz, hogy ETH-t (és más tokeneket) küldjön és fogadjon peer-to-peer módon.", + "page-get-eth-staking": "A letétbe helyezésből eredő jutalmak", + "page-get-eth-staking-desc": "Ha már rendelkezik valamennyi ETH-szel, akkor többet is kereshet, ha validátor-csomópontként tevékenykedik. A validálásért ETH-ben fizetnek.", + "page-get-eth-earn": "ETH-jövedelem", + "page-get-eth-earn-desc": "ETH-jövedelmet szerezhet azáltal, hogy DAO-knak dolgozik, vagy olyan szervezeteknek, amelyek kritpóban fizetnek, továbbá programhibák és más vadászatok során is jutalmul kaphatja.", + "page-get-eth-daos-link-desc": "Tudjon meg többet a DAO-król", + "page-get-eth-cex-link-desc": "Tekintse meg a tőzsdék listáját", + "page-get-eth-staking-link-desc": "Tudjon meg többet a letétbe helyezésről", "page-get-eth-dexs": "Decentralizált tőzsdék (DEX-ek)", "page-get-eth-dexs-desc": "A decentralizált tőzsdék nyílt piactereket nyújtanak az ETH-nek és más tokeneknek. Közvetlenül összekötik a vevőket az eladókkal.", "page-get-eth-dexs-desc-2": "Ahelyett, hogy egy megbízható harmadik felet bíznának meg a pénz megőrzésére a tranzakcióban, kódot használnak. Az eladó ETH-jét csak akkor utalják át, ha a fizetés garantált. Ezt a típusú kódot úgy hívják, hogy okosszerződés.", - "page-get-eth-dexs-desc-3": "Ez azt jelenti, hogy kevesebb a földrajzi korlátozás, mint a centralizált alternatíváknál. Ha valaki azt árul, amit szeretnél, és elfogadja az általad megadott fizetési módot, akkor minden rendben. A DEX-ek lehetővé teszik, hogy ETH-et vásárolj más tokenekkel, PayPal-lal vagy akár személyesen készpénzzel.", + "page-get-eth-dexs-desc-3": "Ez azt jelenti, hogy kevesebb a földrajzi korlátozás, mint a centralizált alternatíváknál. Ha valaki olyat árul, amit Ön meg szeretne vásárolni, és elfogadja az Ön által megadott fizetési módot, akkor minden rendben.", "page-get-eth-do-not-copy": "Példa: Ne másolja le", "page-get-eth-exchanges-disclaimer": "Ezt az információt manuális gyűjtöttük. Ha találsz valami hibát, jelezd felénk itt:", - "page-get-eth-exchanges-empty-state-text": "Írd be az országot, ahol élsz, a tárcák és tőzsdék listájához, melyeket ETH vételre használhatsz.", + "page-get-eth-exchanges-empty-state-text": "Írja be az országot, ahol él, azon tőzsdék listájának megjelenítéséhez, amelyeket használhat", "page-get-eth-exchanges-except": "Kivéve", "page-get-eth-exchanges-header": "Melyik országban élsz?", "page-get-eth-exchanges-header-exchanges": "Tőzsdék", "page-get-eth-exchanges-header-wallets": "Tárcák", - "page-get-eth-exchanges-intro": "A tőzsdék és a tárcák korlátozzák a kripto értékesítési helyeit.", + "page-get-eth-exchanges-intro": "A tőzsdék nem árulhatnak kriptót mindenhol. Ez a lista jelzés értékű, hogy melyik országban milyen szolgáltatások működnek. Nem minősül jóváhagyásnak az, hogy a listán szerepel egy szolgáltató – mindig ellenőrizze Ön is, hogy mi engedélyezett!", "page-get-eth-exchanges-no-exchanges": "Sajnáljuk, de nem tudunk olyan tőzsdéről, ahol ETH-et tudsz venni ebben az országban. Ha találsz ilyet, tudasd velünk", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Sajnáljuk, de nem tudunk olyan tőzsdéről vagy tárcáról, ahol ETH-et tudsz venni ebben az országban. Ha találsz ilyet, tudasd velünk", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Sajnáljuk, de nem tudunk olyan tőzsdéről, ahol ETH-et tudsz venni ebben az országban. Ha találsz ilyet, tudasd velünk", "page-get-eth-exchanges-no-wallets": "Sajnáljuk, de nem tudunk olyan tárcáról, ahol ETH-et tudsz venni ebben az országban. Ha találsz ilyet, tudasd velünk", "page-get-eth-exchanges-search": "Írja be, hogy hol él...", "page-get-eth-exchanges-success-exchange": "Egy tőzsdére történő regisztráció több napot is igénybe vehet a jogi ellenőrzések miatt.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "ETH szerzése hős ábra", "page-get-eth-keep-it-safe": "Az ETH-ed biztonságban tartása", "page-get-eth-meta-description": "Hogyan tudsz lakhely alapján ETH-et venni és tanács arról, hogy hogyan vigyázz rá.", - "page-get-eth-meta-title": "Hogy lehet ETH-et venni", + "page-get-eth-meta-title": "Hogyan lehet ETH-et szerezni", "page-get-eth-need-wallet": "A DEX-ek használatához egy tárcára lesz szükséged.", "page-get-eth-new-to-eth": "Még új az ETH? Itt egy összefoglaló, hogy hogyan fogj hozzá.", "page-get-eth-other-cryptos": "Vásárlás más kriptoval", - "page-get-eth-protect-eth-desc": "Ha sok ETH-et tervezel venni, akkor lehet, hogy érdemesebb egy tárcában tárolni, amit te irányítasz, nem pedig egy tőzsdén. Ennek az az oka, hogy a tőzsdék gyakori célpontjai a hackereknek. Ha egy hacker hozzáférést szerez, elveszítheted a pénzedet. Ezzel szemben a tárcádhoz csak te férsz hozzá.", - "page-get-eth-protect-eth-in-wallet": "Védd meg az ETH-edet egy tárcában", + "page-get-eth-protect-eth-desc": "Az Ethereum egyik fő vonása, hogy a felhasználó a saját számláját kezeli, így mindig ellenőrzése alatt tarthatja a saját eszközeit. Ennélfogva nem kell rábízni az eszközöket egy harmadik félre, így elkerülhető, hogy az eszközöket felügyelő rosszhiszeműen járjon el, csődbe menjen vagy megtámadják. Emellett az is fontos, hogy a felhasználónak kell felelősséget vállalni a saját biztonságát illetően.", + "page-get-eth-protect-eth-in-wallet": "Tartsa az ETH-t a saját tárcájában", "page-get-eth-search-by-country": "Keresés ország szerint", - "page-get-eth-security": "De ez azt is jelenti, hogy komolyan kell venned a pénzed feletti biztonságot. Az ETH esetében nem egy bankot bízol meg, hogy vigyázzon a pénzedre, hanem magadban bízol.", + "page-get-eth-security": "Ez azt jelenti, hogy komolyan kell vennie a pénze feletti biztonságot. Az ETH esetében nem egy bankot vagy egy céget bíz meg, hogy vigyázzon az eszközeire, hanem Ön vállalja a felelősséget.", "page-get-eth-smart-contract-link": "Többet az okos szerződésekről", "page-get-eth-swapping": "Kereskedj a tokeneiddel más emberek ETH-éért. És fordítva.", "page-get-eth-try-dex": "Próbáljon ki egy DEX-et", "page-get-eth-use-your-eth": "Használd az ETH-ed", "page-get-eth-use-your-eth-dapps": "Most, hogy már van valamennyi ETH-ed, próbálj ki valamilyen Ethereum alkalmazást (dappot). Vannak pénzügyi, közösségi média, játék és még sok más kategóriájú dappok.", "page-get-eth-wallet-instructions": "Kövesd a tárca utasításokat", - "page-get-eth-wallet-instructions-lost": "Ha elveszted a hozzáférést a tárcádhoz, akkor elveszted a hozzáférést a pénzedhez. A tárcádnak utasításokat kell addnia, hogy ezt meg tudd akadályozni. Kövesd őket figyelmesen - a legtöbb esetben senki sem tud segíteni, ha elveszted a hozzáférést a tárcádhoz.", + "page-get-eth-wallet-instructions-lost": "Ha a számlához való hozzáférését elveszti, akkor nem lehet elérni a rajta lévő eszközöket. A tárca olyan utasításokat ad, amelyekkel ez elkerülhető. Kövesse azokat figyelmesen – a legtöbb esetben senki sem tud segíteni, ha elveszik a számlához való hozzáférése.", "page-get-eth-wallets": "Tárcák", "page-get-eth-wallets-link": "Többet a tárcákról", "page-get-eth-wallets-purchasing": "Néhány tárcával hitel- és bankkártyával, banki átutalással vagy akár Apple Pay-jel is tudsz kriptot venni. Földrajzi szabályozás lehet érvényben.", - "page-get-eth-warning": "Ezek a DEX-ek nem kezdőknek valók, mivel kelleni fog valamennyi ETH a használatukhoz.", + "page-get-eth-warning": "Ezek a DEX-ek nem kezdő felhasználóknak valók, mert használatukhoz ETH-ra van szükség. Ezek csak példák, nem minősül jóváhagyásnak az említésük. Mindig ellenőrizze le Ön is!", "page-get-eth-what-are-DEX's": "Mik azok a DEX-ek?", "page-get-eth-whats-eth-link": "Mi az az ETH?", - "page-get-eth-where-to-buy-desc": "Vásárolhatsz ETH-et tőzsdéken vagy tárcákról közvetlenül.", + "page-get-eth-where-to-buy-desc": "ETH-t szerezhet jövedelemként, kaphat más személyektől vagy vehet tőzsdén és alkalmazások révén.", "page-get-eth-where-to-buy-desc-2": "Ellenőrizd, hogy mely szolgáltatásokat használhatod a lakhelyed alapján.", - "page-get-eth-where-to-buy-title": "Hol lehet ETH-et venni", + "page-get-eth-where-to-buy-title": "Hol lehet ETH-et szerezni", "page-get-eth-your-address": "Az ETH címed", "page-get-eth-your-address-desc": "Ha letöltesz egy tárcát, akkor egy nyilvános ETH címet fog generálni neked. Így néz ki:", "page-get-eth-your-address-desc-3": "Gondolj rá úgy, mint az email címedre, de emailek helyett ETH-et kaphatsz rá. Ha ETH-et szeretnél kiutalni egy tőzsdéről a tárcádra, használd a címedet, mint beérkező cím. Küldés előtt mindig ellenőrizd többször is!", diff --git a/src/intl/hu/page-languages.json b/src/intl/hu/page-languages.json index d78b1eab67a..88baeb222d1 100644 --- a/src/intl/hu/page-languages.json +++ b/src/intl/hu/page-languages.json @@ -12,10 +12,13 @@ "page-languages-want-more-link": "Fordítási Program", "page-languages-want-more-paragraph": "az ethereum.org fordítók mindig a lehető legtöbb nyelvre igyekeznek lefordítani az oldalakat. Hogy megnézd mivel foglalkoznak jelenleg, vagy csatlakozz munkájukhoz, olvasd el az", "page-languages-filter-placeholder": "Szűrő", + "langauge-am": "Amhara", "language-ar": "Arab", "language-az": "Azerbajdzsáni", + "langauge-be": "Belarusz", "language-bg": "Bolgár", "language-bn": "Bengáli", + "language-bs": "Bosnyák", "language-ca": "Katalán", "language-cs": "Cseh", "language-da": "Dán", @@ -32,6 +35,7 @@ "language-hi": "Hindi", "language-hr": "Horvát", "language-hu": "Magyar", + "language-hy-am": "Örmény", "language-id": "Indonéz", "language-ig": "Igbó", "language-it": "Olasz", @@ -39,12 +43,14 @@ "language-ka": "Grúz", "language-kk": "Kazah", "language-km": "Khmer", + "language-kn": "Kannada", "language-ko": "Koreai", "language-lt": "Litván", "language-ml": "Malajálam", "language-mr": "Maráthi", "language-ms": "Maláj", "language-nb": "Norvég", + "language-ne-np": "Nepáli", "language-nl": "Holland", "language-pcm": "Nigériai pidzsin", "language-fil": "Filippínó", @@ -58,8 +64,9 @@ "language-sl": "Szlovèn", "language-sr": "Szerb", "language-sw": "Szuahéli", - "language-th": "Thai", "language-ta": "Tamil", + "language-th": "Thai", + "language-tk": "Türkmén", "language-tr": "Török", "language-uk": "Ukrán", "language-ur": "Urdu", diff --git a/src/intl/hu/page-layer-2.json b/src/intl/hu/page-layer-2.json index cd855aa7cc8..f69f05493eb 100644 --- a/src/intl/hu/page-layer-2.json +++ b/src/intl/hu/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "A zkSync egy felhasználó-központú zero-knowledge rollup platform, amelyet a Matter Labs dolgozott ki. Egy Ethereum-skálázási megoldás, amely már elérhető az Ethereum főhálózatán. Támogatja a kifizetéseket, a tokenátváltást és az NFT-k létrehozását.", "zkspace-description": "A ZKSpace platform három fő részből áll: az L2 AMM DEX (automatikus piackészítőként működő decentralizált tőzsde), mely ZK-rollup technológát használ, és ZKSwapnak nevezik; a kifizetési rendszer, melynek ZKSquare a neve; és az NFT-piactér, amely ZKSea néven fut.", "aztec-description": "Az Aztec Network az első privát ZK-rollup az Ethereumon, mely lehetővé teszi, hogy a decentralizált alkalmazások élvezhessék az adatvédelmet és a skálázást.", + "starknet-description": "A Starknet egy validitáson alapuló összevont tranzakció (L2). Gyors tranzakcióátvitel, alacsony gázdíj jellemzi, miközben megtartja az Ethereum (L1) biztonsági szintjét.", "layer-2-note": "Megjegyzés:", "layer-2-ecosystem-portal": "Ökoszisztéma portál", "layer-2-token-lists": "Tokenlisták", diff --git a/src/intl/hu/page-learn.json b/src/intl/hu/page-learn.json index 4e5248f7747..2074eca5e9b 100644 --- a/src/intl/hu/page-learn.json +++ b/src/intl/hu/page-learn.json @@ -11,7 +11,7 @@ "hero-subtitle": "Az Ön tanulási útmutatója az Ethereum világába. Ismerje meg, hogyan működik az Ethereum és hogyan tud hozzá kapcsolódni. Ez az oldal technikai és nem technikai cikkeket, útmutatókat és forrásokat is tartalmaz.", "hero-button-lets-get-started": "Lássunk neki!", "what-is-crypto-1": "Talán Ön is hallott már a kriptovalutákról, blokkláncokról és a Bitcoinról. Az alábbi hivatkozások feltárják, hogy mik ezek és hogyan kapcsolódnak az Ethereumhoz.", - "what-is-crypto-2": "A kriptovaluták, mint amilyen a Bitcoin is, lehetővé teszik bárki számára, hogy pénzt utaljon a világon bárhova. Az Ethereum is képes erre, ráadásul olyan programkódokat is tud futtatni, melyek révén alkalmazásokat és szervezeteket lehet rá építeni. Egyaránt ellenálló és rugalmas: bármilyen számítógépes program futhat az Ethereumon. Tudjon meg többet, és kezdje el Ön is használni:", + "what-is-crypto-2": "A kriptovaluták, mint amilyen a bitcoin is, lehetővé teszik bárki számára, hogy pénzt utaljon a világon bárhova. Az Ethereum is képes erre, ráadásul olyan programkódokat is tud futtatni, amelyek révén alkalmazásokat és szervezeteket lehet rá építeni. Egyaránt ellenálló és rugalmas: bármilyen számítógépes program futhat az Ethereumon. Tudjon meg többet, és kezdje el használni Ön is:", "what-is-ethereum-card-title": "Mi az Ethereum?", "what-is-ethereum-card-description": "Ha Önnek új az Ethereum világa, akkor kezdje itt és ismerje meg, hogy miért fontos az Ethereum.", "what-is-ethereum-card-image-alt": "Egy bazárba kukucskáló ember képe, amely az Ethereumot reprezentálja.", diff --git a/src/intl/hu/page-roadmap-vision.json b/src/intl/hu/page-roadmap-vision.json index 94083a518d3..f5eca7bf384 100644 --- a/src/intl/hu/page-roadmap-vision.json +++ b/src/intl/hu/page-roadmap-vision.json @@ -1,63 +1,67 @@ { - "page-roadmap-vision-2014": "Egy proof-of-stake-et részletező 2014-es blog poszt megtekintése", - "page-roadmap-vision-desc-1": "Az Ethereumnak csökkentenie kell a hálózati torlódást és növelnie a sebességet, hogy kiszolgálja a globális felhasználói bázist.", - "page-roadmap-vision-desc-2": "Egy csomópont futtatása egyre nehezebb, ahogy nő a hálózat. Ez csak nehezebbé fog válni a hálózat méretezhetőségének növelésével.", - "page-roadmap-vision-desc-3": "Az Ethereum túl sok elektromosságot használ. A hálózat biztonságát szolgáltató technológiának fenntarthatóbbnak kell lennie.", - "page-roadmap-vision-ethereum-node": "Többet a csomópontokról", - "page-roadmap-vision-future": "Egy digitális jövő globális méretben", - "page-roadmap-vision-meta-desc": "Egy áttekintő az Eth2 fejlesztések Ethereumra való hatásáról és a kihívásokról, amikkel meg kell küzdenünk.", - "page-roadmap-vision-meta-title": "Ethereum 2.0 (Eth2) vízió", - "page-roadmap-vision-mining": "Többet a bányászatról", + "page-roadmap-vision-2014": "Tekintse meg ezt a proof-of-stake-et részletező 2014-es blogposztot", + "page-roadmap-vision-2021": "Tekintse meg ezt a 2021-es blogposztot az Ethereum-útiterv fejlődéséről", + "page-roadmap-vision-2022": "Tekintse meg ezt a 2022-es blogposztot: Ethereum útikalauz stopposoknak", + "page-roadmap-vision-2021-updates": "Tekintse meg ezt a 2021-es blogposztot az Ethereum-protokoll frissítéseiről", + "page-roadmap-vision-desc-1": "Az Ethereumnak csökkentenie kell a hálózati leterheltséget és növelnie a sebességet, hogy jobban kiszolgálhasson egy globális felhasználói bázist.", + "page-roadmap-vision-desc-2": "A hálózat növekedésével egyre nehezebb csomópontokat futtatni. A hálózat méretezésére tett erőfeszítésekkel ez csak még nehezebbé fog válni.", + "page-roadmap-vision-desc-3": "Az Ethereum túl sok elektromos áramot használ. A hálózat biztonságát nyújtó technológiának fenntarthatóbbnak kell lennie.", + "page-roadmap-vision-ethereum-node": "A csomópontokról bővebben", + "page-roadmap-vision-future": "Egy digitális jövő globális méretekben", + "page-roadmap-vision-meta-desc": "Áttekintő a frissítések Ethereumra gyakorolt hatásáról és a leküzdendő kihívásokról.", + "page-roadmap-vision-meta-title": "Az Ethereum jövőképe", + "page-roadmap-vision-mining": "A bányászatról bővebben", "page-roadmap-vision-problems": "A jelen problémái", "page-roadmap-vision-scalability": "Méretezhetőség", - "page-roadmap-vision-scalability-desc": "Az Ethereumnak több tranzakciót kell egy másodperc alatt feldolgoznia anélkül, hogy megnövelnénk a csomópontok méretét a hálózatban. A csomópontok létfontosságú hálózati elemek, melyek a blokkláncot tárolják és futtatják. A csomópont méretének növelése nem praktikus, mert csak az erős és drága számítógépekkel rendelkezők képesek erre. Ahhoz, hogy méretezhető legyen, az Ethereumnak több tranzakciót kell feldolgoznia egy másodperc alatt további csomópontokkal egyesülve. Több csomópont nagyobb biztonságot jelent.", - "page-roadmap-vision-scalability-desc-3": "A shard lánc fejlesztés a hálózati terhelést 64 új láncon fogja eloszlatni. Ez levegőhöz juttatja az Ethereumot a torlódás csökkentésével és tovább növeli a sebességet a jelenlegi 15-45 tranzakció per másodpercenkénti határon túl.", - "page-roadmap-vision-scalability-desc-4": "És annak ellenére, hogy több lánc lesz, ez valójában kevesebb munkát fog igényelni a validátorok - hálózat fenntartói - részéről. A validátoroknak csak a saját shardjukat kell 'futtatni' és nem a teljes Ethereum láncot. Ez a csomópontokat könnyűvé teszi és lehetővé teszi az Ethereum számára, hogy méretezhető legyen és megmaradjon decentralizáltnak.", + "page-roadmap-vision-scalability-desc": "Az Ethereumnak másodpercenként több tranzakciót kell tudni feldolgozni anélkül, hogy megnövelnénk a hálózati csomópontok méretét. A csomópontok létfontosságú hálózati elemek, amelyek a blokkláncot tárolják és futtatják. A csomópont méretének növelése nem praktikus, mert csak az erős és drága számítógépekkel rendelkezők lennének képesek erre. Ahhoz, hogy méretezhető legyen, az Ethereumnak másodpercenként több tranzakciót kell tudnia feldolgozni, és több csomóponttal kell rendelkeznie. A több csomópont nagyobb biztonságot jelent.", + "page-roadmap-vision-scalability-desc-3": "Az L2 összevont tranzakciók skálázzák az Ethereumot azáltal, hogy a tranzakciókat a láncon kívül kezelik, és csak azok összegzését küldik be az Ethereumra. Ez a kötegelés megnöveli a hálózat tranzakcióátvitelét, közben drasztikusan csökkenti a felhasználók költségeit.", + "page-roadmap-vision-scalability-desc-4": "A összevont tranzakcióknak alacsony költségű tárolási megoldásra van szükségük az L1-en, hogy a lehető legolcsóbb tranzakciós díjat tudják kínálni. Ezt blobok formájában kapják meg, amelyek az Ethereum-blokkokhoz kapcsolódnak. Végül számos blob lesz az Ethereum-blokkhoz csatolva, hogy az összevont tranzakcióknak olcsó tárhelyet biztosítson.", "page-roadmap-vision-security": "Biztonság", - "page-roadmap-vision-security-desc": "Az Eth2 fejlesztések növelni fogják az Ethereum biztonságát irányított támadásokkal szemben, mint például az 51%-os támadás. Ez egy olyan támadás, amikor valaki a hálózat többségét irányítja és hamis változtatásokat tud megvalósítani.", - "page-roadmap-vision-security-desc-3": "A proof-of-stake-be történő átmenet azt jelenti, hogy az Ethereum protokollnak nagyobb eltántorító tényezői vannak a támadásokkal szemben. Ennek az az oka, hogy a proof-of-stake esetében a hálózatot biztonságban tartó validátoroknak egy jelentős mennyiségű ETH-et kell letenniük a protokollba. Ha megpróbálják megtámadni a hálózatot, a protokoll automatikusan elpusztíthatja az ETH-üket.", - "page-roadmap-vision-security-desc-5": "Ez nem lehetséges a proof-of-work esetében, ahol legjobb esetben a protokoll kényszerítheti a hálózatot biztosító szereplőket (bányászokat), hogy elveszítsék a bányászati jutalékot, amit egyébként megkaptak volna. Hogy azonos hatást érjünk el a proof-of-worknél, a protokollnak el kellene pusztítania a bányász teljes felszerelését, ha megpróbál csalni.", - "page-roadmap-vision-security-desc-5-link": "Többet a proof-of-work-ről", - "page-roadmap-vision-security-desc-10": "A staking azt is jelenti, hogy nem kell elit hardverbe fektetned, hogy egy Ethereum csomópontot 'futtass'. Ez több embert bátoríthat arra, hogy validátorok legyenek, megnövelve ezzel a hálózat decentralizáltságát és csökkentve a támadási felületet.", + "page-roadmap-vision-security-desc": "A tervezett frissítések fokozzák az Ethereum védelmét a koordinált támadásokkal szemben.", + "page-roadmap-vision-security-desc-3": "A proof-of-stake mechanizmusnál a nagyobb biztonságot a támadások ellen ható nagyobb kriptogazdasági ösztönzők adják. Ennek az az oka, hogy a proof-of-stake esetében a hálózatot biztonságban tartó validátoroknak jelentős mennyiségű ETH-t kell letétbe helyezniük a protokollban. Ha megpróbálják megtámadni a hálózatot, a protokoll automatikusan megsemmisítheti az ETH-jukat.", + "page-roadmap-vision-security-desc-5": "Ugyanakkor az is fontos, hogy olyan frissítések vannak kilátásban a közeljövőben, amelyek megvédik a validátorokat a szolgáltatásmegtagadással járó támadások ellen, fokozzák az anonimitásukat, és elválasztják a blokképítést a blokkpropagálástól. Ezek a frissítések az egyes validátorokat és a hálózat egészét is védik a liveness támadásoktól és a cenzúrától.", + "page-roadmap-vision-security-desc-5-link": "A proof-of-stake-ről bővebben", + "page-roadmap-vision-security-desc-10": "A letétbe helyezés azt is jelenti, hogy nem kell csúcstechnológiás hardverbe fektetnie, hogy közvetlenül részt vehessen a konszenzusban. Ez több embert bátoríthat arra, hogy validátorrá váljon, megnövelve ezzel a hálózat decentralizáltságát és csökkentve a támadási felületet.", "page-roadmap-vision-security-staking": "ETH letétbe helyezése", - "page-roadmap-vision-security-validator": "Az ETH-ed letétbe helyezésével validátor lehetsz.", + "page-roadmap-vision-security-validator": "ETH letétbe helyezésével Ön is lehet validátor.", "page-roadmap-vision-staking-lower": "Többet a letétbe helyezésről", - "page-roadmap-vision-subtitle": "Addig fejleszteni az Ethereumot, amíg elég erős nem lesz, hogy az egész emberiséget szolgálja.", + "page-roadmap-vision-subtitle": "Addig fejlesztjük az Ethereumot, amíg elég erős nem lesz, hogy az egész emberiséget szolgálja.", "page-roadmap-vision-sustainability": "Fenntarthatóság", - "page-roadmap-vision-sustainability-desc-1": "Nem titok, hogy az Ethereum és más blokkláncok, mint a Bitcoin, energiaintenzívek a bányászat miatt.", - "page-roadmap-vision-sustainability-desc-2": "De az Ethereum az ETH-el történő biztonság irányába tart, nem pedig a számítási erővel - a staking által.", - "page-roadmap-vision-sustainability-desc-3": "Bár a stakinget a Beacon Chain vezeti be, az általunk használt Ethereum egy ideig párhuzamosan fog futni, mielőtt „összeolvadna” vagy „dokkolna” az Eth2 frissítésekkel. Az egyik rendszert ETH tartja biztonságban, a másikat számítási erő. Ez azért van, mert eleinte a shard láncok nem fogják tudni kezelni például a számláinkat vagy dappokat. Tehát nem feledkezhetünk meg a bányászatról és a főhálózatról.", - "page-roadmap-vision-sustainability-desc-8": "Amint a Beacon Chain és a sharding fejlesztések működnek, elkezdődik a főhálózat bedokkolásával kapcsolatos munka az új rendszerrel. Ez a főhálózatot egy sharddá alakítja, amit így ETH fog biztonságban tartani és kevésbé lesz energiaintenzív.", - "page-roadmap-vision-sustainability-subtitle": "Az Ethereumnak zöldebbnek kell lennie.", - "page-roadmap-vision-title": "Az Eth2 vízió", - "page-roadmap-vision-title-1": "Feltorlódott hálózat", + "page-roadmap-vision-sustainability-desc-1": "Az Ethereum most már zöld blokklánc. Az energiafelhasználás nagyjából 99,95%-kal csökkent, amikor a proof-of-work mechanizmust leváltották proof-of-stake-re.", + "page-roadmap-vision-sustainability-desc-2": "Az Ethereum biztonságát most már letétbe helyezéssel biztosítják, nem pedig számítási teljesítménnyel.", + "page-roadmap-vision-sustainability-desc-3": "Ez a fenntarthatósági fejlődés biztonsági előnyökkel is jár. A letétbe helyezett Ether sokkal drágábbá teszi a lánc megtámadását, mint amilyen a proof-of-work mechanizmus idején volt, ám a hálózat biztosítása sokkal kevesebbe kerül, mivel sokkal kevesebb új ETH-t kell kibocsátani a validátorok kifizetéséhez, mint amennyi a bányászokhoz kellett.", + "page-roadmap-vision-sustainability-desc-8": "A váltás a proof-of-stake mechanizmusra zöldebbé és biztonságosabbá tette az Ethereumot. Most már egy alacsony kibocsátású platform, amelyen alkalmazások és szervezetek építhetők.", + "page-roadmap-vision-sustainability-subtitle": "Az Ethereum egy zöld blokklánc, erős kriptogazdaság-védelemmel.", + "page-roadmap-vision-title": "Az Ethereum jövőképe", + "page-roadmap-vision-title-1": "Bedugult hálózat", "page-roadmap-vision-title-2": "Lemezterület", "page-roadmap-vision-title-3": "Túl sok energia", - "page-roadmap-vision-trilemma-cardtext-1": "Az Eth2 fejlesztések az Ethereumot méretezhetővé, biztonságossá és decentralizálttá fogják tenni. A sharding skálázhatóbbá teszi az Ethereumot a másodpercenkénti tranzakciók növelésével mindemellett csökkentve a csomópont futtatásához és a lánc validálásához szükséges erőt. A Beacon Chain biztonságossá teszi az Ethereumot a validátorok koordinálásával a shardokon keresztül. A staking pedig csökkenti a részvétel akadályait, ezzel egy nagyobb - decentralizáltabb - hálózatot teremtve.", - "page-roadmap-vision-trilemma-cardtext-2": "A biztonságos és decentralizált blokklánc hálózatok összes csomópontjának a lánc által feldolgozott összes tranzakciót ellenőrizniük kell. A munka mennyisége behatárolja a tranzakciók számát, melyek egy adott időben történnek. A decentralizáltság és biztonság a mai Ethereumot tükrözi.", - "page-roadmap-vision-trilemma-cardtext-3": "A decentralizált hálózatok úgy működnek, hogy információkat küldenek a csomópontokon keresztül a tranzakciókról - az egész hálózatnak tudnia kell minden állapotváltozásról. A másodpercenkénti tranzakciók skálázhatósága egy decentralizált hálózatnál biztonsági kockázatot jelent, mivel minél több a tranzakció, annál nagyobb a késés és annál nagyobb a támadás valószínűsége, mialatt az információ még nem ért célba.", - "page-roadmap-vision-trilemma-cardtext-4": "Az Ethereum csomópontok méretének és teljesítményének növelése biztonságos módon növelheti a másodpercenkénti tranzakciókat, de a hardverigény korlátozná, hogy ki teheti meg - ez fenyegeti a decentralizációt. Abban reménykedünk, hogy a sharding és a proof-of-stake lehetővé teszi majd az Ethereum méretezését a csomópontok mennyiségének növelésével, nem pedig a csomópont méretével.", + "page-roadmap-vision-trilemma-cardtext-1": "Az Ethereum fejlesztései skálázhatóvá, biztonságossá és decentralizálttá teszik a hálózatot. A letétbe helyezés (staking) csökkentette az akadályát a részvételnek és a behatárolt méretgazdaságosságnak, így nagyobb és decentralizáltabb hálózatot hozott létre.", + "page-roadmap-vision-trilemma-cardtext-2": "A biztonságos és decentralizált blokklánchálózatok az összes csomóponttól megkövetelik a lánc által feldolgozott összes tranzakció ellenőrzését. A munkamennyiség korlátozza az adott időegység alatt feldolgozható tranzakciók számát. A mai Ethereum-láncra a decentralizáltság és a biztonság jellemző.", + "page-roadmap-vision-trilemma-cardtext-3": "A decentralizált hálózatok úgy működnek, hogy információkat küldenek a tranzakciókról a csomópontokon keresztül – az egész hálózatnak tudnia kell minden állapotváltozásról. A másodpercenkénti tranzakciók méretezése egy decentralizált hálózatnál biztonsági kockázatot jelent, mivel minél több a tranzakció, annál nagyobb a késés, és annál nagyobb a támadás valószínűsége, mialatt az információ úton van.", + "page-roadmap-vision-trilemma-cardtext-4": "Az Ethereum-csomópontok méretének és teljesítményének növelése biztonságos módon növelheti a másodpercenkénti tranzakciók számát, de a hardverigény korlátozná a résztvevők körét – ez pedig fenyegeti a decentralizációt. Reményeink szerint a szilánkolás és a proof-of-stake segítségével az Ethereum a csomópontméret növelése helyett a csomópontok számának növelésével lesz méretezhető.", "page-roadmap-vision-trilemma-h2": "A decentralizált méretezés kihívása", - "page-roadmap-vision-trilemma-modal-tip": "Kattints a karikákra lentebb, hogy jobban megértsd a decentralizált méretezés problémáját", - "page-roadmap-vision-trilemma-p": "Az Ethereum problémáinak naív megoldása az lenne, ha centralizáltabbá tennénk. De a decentralizáció túlságosan fontos. A decentralizáltság adja az Ethereumnak a cenzúra-ellenállását, nyitottságát, adatvédelmét és a közel feltörhetetlen biztonságát.", - "page-roadmap-vision-trilemma-p-1": "Az Ethereum víziója, hogy skálázhatóbb és biztonságosabb legyen, de ugyanakkor megmaradjon decentralizáltnak. Ennek a 3 tulajdonságnak az elérését úgy hívjuk, hogy méretezhetőségi trilemma.", - "page-roadmap-vision-trilemma-p-2": "Az Eth2 fejlesztések a trilemma megoldását tűzték ki célul, de van egy pár jelentős kihívás.", - "page-roadmap-vision-trilemma-press-button": "Nyomd meg a gombokat a háromszögön, hogy jobban megértsd a decentralizált méretezés problémáit.", + "page-roadmap-vision-trilemma-modal-tip": "Kattintson a lenti karikákra, hogy jobban megértse a decentralizált méretezés problémáját", + "page-roadmap-vision-trilemma-p": "Naiv megoldás lenne az Ethereum problémáira, ha centralizáltabbá tennénk, a decentralizáció túlságosan is fontos. A decentralizáció adja az Ethereum cenzúrával szembeni ellenálló képességét, nyitottságát, adatvédelmét és a közel feltörhetetlen biztonságát.", + "page-roadmap-vision-trilemma-p-1": "Az Ethereum víziója, hogy méretezhetőbb és biztonságosabb legyen, de ugyanakkor megőrizze a decentralizáltságát. A felsorolt 3 tulajdonság elérésének problematikáját úgy hívjuk, hogy méretezhetőségi trilemma.", + "page-roadmap-vision-trilemma-p-2": "Az Ethereum frissítések célja a trilemma megoldása, de van néhány jelentős kihívás.", + "page-roadmap-vision-trilemma-press-button": "Nyomja meg a háromszögön található gombokat, hogy jobban megismerje a decentralizált méretezés problémáját.", "page-roadmap-vision-trilemma-text-1": "Decentralizáció", "page-roadmap-vision-trilemma-text-2": "Biztonság", "page-roadmap-vision-trilemma-text-3": "Méretezhetőség", - "page-roadmap-vision-trilemma-title-1": "Fedezd fel a méretezhetőségi trilemmát", - "page-roadmap-vision-trilemma-title-2": "Eth2 fejlesztések és decentralizált méretezés", + "page-roadmap-vision-trilemma-title-1": "Fedezze fel a méretezhetőségi trilemmát", + "page-roadmap-vision-trilemma-title-2": "Ethereum-frissítések és decentralizált méretezés", "page-roadmap-vision-trilemma-title-3": "Biztonságos és decentralizált", "page-roadmap-vision-trilemma-title-4": "Decentralizált és méretezhető", "page-roadmap-vision-trilemma-title-5": "Méretezhető és biztonságos", - "page-roadmap-vision-understanding": "Az Eth2 vízió megértése", - "page-roadmap-vision-upgrade-needs": "Az Eth2 fejlesztések szükségessége", - "page-roadmap-vision-upgrade-needs-desc": "A 2015-ben indult Ethereum protokollnak elképesztő sikere lett. De az Ethereum közösség mindig is arra számított, hogy egy pár kulcsfontosságú fejlesztésre lesz szükség, hogy az Ethereum teljes potenciálját elérjük.", - "page-roadmap-vision-upgrade-needs-desc-2": "A magas kereslet felfelé hajtja a tranzakciós díjakat, ami az Ethereumot drágává teszi az átlag felhasználó számára. Az Ethereum klienshez szükséges lemezterület nagy ütemben nő. És a mögöttes proof-of-work konszenzus algoritmusnak, mely az Ethereum biztonságát és decentralizáltságát biztosítja, nagy a környezeti hatása.", - "page-roadmap-vision-upgrade-needs-desc-3": "Amire gyakran Eth2-ként hivatkozunk, gyakorlatilag egy fejlesztéssorozat, mely ezeket a problémákat orvosolja és még ennél is többet. Ezt a fejlesztési halmazt eredetlieg 'Serenity-nek' hívták, és már 2014-től aktív területe a kutatásnak és fejlesztésnek.", - "page-roadmap-vision-upgrade-needs-desc-5": "Most, hogy a technológia készen áll, ezek a fejlesztések át fogják alakítani az Ethereumot, hogy méretezhetőbb, biztonságosabb és fenntarthatóbb legyen - hogy jobbá tegyék a jelenlegi és új felhasználók életét. Mindezt úgy, hogy megőrizzék az Ethereum belső decentralizáltági értékét.", - "page-roadmap-vision-upgrade-needs-desc-6": " Ez azt jelenti, hogy az Eth2-n nincs bekapcsoló gomb. A fejlesztések egyesével fognak megérkezni idővel.", - "page-roadmap-vision-upgrade-needs-serenity": "Egy 2015-ös blog poszt megtekintése a 'Serenity-ről'", - "ethereum": "Ethereum" + "page-roadmap-vision-understanding": "Az Ethereum jövőképének megértése", + "page-roadmap-vision-upgrade-needs": "A frissítések szükségessége", + "page-roadmap-vision-upgrade-needs-desc": "A 2015-ben indult Ethereum-protokollnak elképesztő sikere lett. De az Ethereum-közösség mindig is számított arra, hogy néhány kulcsfontosságú fejlesztésre szükség lesz, hogy kibontakozhasson az Ethereumban rejlő potenciál.", + "page-roadmap-vision-upgrade-needs-desc-2": "A nagy kereslet felhajtja a tranzakciós díjakat, ami az átlagfelhasználó számára drágává teszi az Ethereumot. Az Ethereum-kliens futtatásához szükséges lemezterület nagysága nagy ütemben nő.", + "page-roadmap-vision-upgrade-needs-desc-3": "Az Ethereum rendelkezésére álló frissítéscsomagja többek között ezeket a problémákat is orvosolja. Ez a frissítési halmaz eredetileg a „Serenity” és az „Eth2” nevet viselte, és már 2014-től aktív területe a kutatásnak és fejlesztésnek.", + "page-roadmap-vision-upgrade-needs-desc-5": "Most, hogy a technológia készen áll, ezek a fejlesztések át fogják strukturálni az Ethereumot, hogy méretezhetőbb, biztonságosabb és fenntarthatóbb legyen – hogy jobbá tegye a jelenlegi felhasználók életét és új felhasználókat vonzzon be. Mindezt úgy, hogy megőrizze az Ethereum decentralizáltságának alapértékét.", + "page-roadmap-vision-upgrade-needs-desc-6": "Ez azt jelenti, hogy a méretezhetőségnek nincs bekapcsológombja. A fejlesztések az idő előrehaladtával, fokozatosan érkeznek majd.", + "page-roadmap-vision-upgrade-needs-serenity": "Tekintse meg ezt a 2015-ös blogposztot a „Serenityről”", + "ethereum": "Ethereum", + "page-roadmap-vision-danksharding": "Bővebben a Dankshardingról" } diff --git a/src/intl/hu/page-stablecoins.json b/src/intl/hu/page-stablecoins.json index 3b286578909..184548303f9 100644 --- a/src/intl/hu/page-stablecoins.json +++ b/src/intl/hu/page-stablecoins.json @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "Fiat", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "Nemesfémek", "page-stablecoins-table-error": "Nem lehet betölteni a stabil érméket. Próbálja meg frissíteni az oldalt.", + "page-stablecoins-table-loading": "Stabilérmeadatok betöltése...", "page-stablecoins-title": "Stabil érmék", "page-stablecoins-top-coins": "Legfontosabb stabil érmék piaci kapitalizáció alapján", "page-stablecoins-top-coins-intro": "A piaci kapitalizáció", diff --git a/src/intl/hu/page-upgrades-get-involved.json b/src/intl/hu/page-upgrades-get-involved.json index 0325a5cf9d7..82f1c5a9d62 100644 --- a/src/intl/hu/page-upgrades-get-involved.json +++ b/src/intl/hu/page-upgrades-get-involved.json @@ -1,41 +1,47 @@ { "page-upgrades-get-involved-btn-1": "Kliensek megtekintése", - "page-upgrades-get-involved-btn-2": "Többet a stakingről", - "page-upgrades-get-involved-btn-3": "Találj bugokat", - "page-upgrades-get-involved-bug": "Egy bug lehet:", - "page-upgrades-get-involved-bug-hunting": "Menj bug vadászatra", - "page-upgrades-get-involved-bug-hunting-desc": "Keress és jelents bugokat az Eth2 fejlesztési specifikációban vagy magukban a kliensekben. Akár 50 000 USD-t is nyerhetsz és szerepelhetsz ranglistán.", - "page-upgrades-get-involved-bug-li": "specifikáció nem-megfelelési problémák", - "page-upgrades-get-involved-bug-li-2": "véglegesítést megakadályozó bugok", - "page-upgrades-get-involved-bug-li-3": "szolgáltatásmegtagadás (DOS) vektorok", - "page-upgrades-get-involved-bug-li-4": "és még sok más...", - "page-upgrades-get-involved-desc-1": "Egy kliens futtatása azt jelenti, hogy aktív résztvevője vagy az Ethereumnak. A kliensed segíteni fog tranzakciók feljegyzésében és az új blokkok ellenőrzésében.", - "page-upgrades-get-involved-desc-2": "Ha van ETH-ed, akkor letétbe helyezheted, validátorrá válhatsz és segíthetsz biztonságossá tenni a hálózatot. Validátorként ETH jutalmakat kaphatsz.", - "page-upgrades-get-involved-desc-3": "Csatlakozz a közösségi tesztelési kezdeményezéshez! Segíts letesztelni az Eth2 fejlesztéseket mielőtt bevezetnék őket, találj bugokat és szerezz jutalmakat.", + "page-upgrades-get-involved-btn-2": "Többet a letétbe helyezésről", + "page-upgrades-get-involved-btn-3": "Találjon hibákat", + "page-upgrades-get-involved-bug": "Hiba lehet például:", + "page-upgrades-get-involved-bug-hunting": "Menjen hibavadászatra", + "page-upgrades-get-involved-bug-hunting-desc": "Keresse és jelentse a hibákat a konszenzusréteg frissítési specifikációban vagy magukban a kliensekben. Akár 50 000 USD-t is nyerhet, és szerepelhet a ranglistán.", + "page-upgrades-get-involved-bug-li": "specifikáció – megfelelőségi problémák", + "page-upgrades-get-involved-bug-li-2": "véglegességet megtörő hibák", + "page-upgrades-get-involved-bug-li-3": "szolgáltatásmegtagadási (DOS) vektorok", + "page-upgrades-get-involved-bug-li-4": "és még sok mást...", + "page-upgrades-get-involved-desc-1": "Egy kliens futtatása azt jelenti, hogy Ön aktív résztvevője az Ethereumnak. A kliense segít a tranzakciók feljegyzésében és az új blokkok ellenőrzésében.", + "page-upgrades-get-involved-desc-2": "Ha van ETH-ja, akkor letétbe helyezheti, validátorrá válhat, és segíthet biztosítani a hálózatot. Validátorként ETH-jutalmakat kaphat.", + "page-upgrades-get-involved-desc-3": "Csatlakozzon a közösségi tesztelési kezdeményezéshez! Segítsen tesztelni az Ethereum frissítéseit a bevezetésük előtt, találjon hibákat, és szerezzen jutalmakat.", "page-upgrades-get-involved-ethresearch-1": "Sharding", - "page-upgrades-get-involved-ethresearch-2": "Eth1 és Eth2 átmenet", - "page-upgrades-get-involved-ethresearch-3": "Shardok és az állapot végrehajtás", - "page-upgrades-get-involved-ethresearch-4": "Minden kutatási téma", - "page-upgrades-get-involved-how": "Hogyan szeretnél bevonódni?", - "page-upgrades-get-involved-how-desc": "Az Ethereum közösség mindig szívesen veszi ha többen futtatnak klienseket, stakelnek és bugokat vadásznak.", - "page-upgrades-get-involved-join": "Csatlakozz a kutatáshoz", - "page-upgrades-get-involved-join-desc": " Mint a legtöbb dolog az Ethereumnál, a kutatás nagy része nyilvános. Ez azt jelenti, hogy részt vehetsz a vitákban vagy átolvashatod az Ethereum kutatók munkáit. Az ethresear.ch többet fed le, mint az Eth2 fejlesztések, de az Eth2 nagyobb fókuszban van.", - "page-upgrades-get-involved-meta-description": "Hogy vehetsz részt az Eth2-ben: futtass node-ot, stakelj, keress bugokat vagy más egyebet.", - "page-upgrades-get-involved-run-clients": "Futtass beacon chain klienseket", - "page-upgrades-get-involved-run-clients-desc": "Az Ethereum hosszútávú biztonságához kulcsfontosságú a kliensek erős eloszlása. A kliens egy szoftver, mely a blokkláncot futtatja, ellenőrzi a tranzakciókat és az újonnan létrehozott blokkokat. Minden kliens egyedi tulajdonságokkal rendelkezik, úgyhogy olyat válassz, mellyel elboldogulsz.", - "page-upgrades-get-involved-stake": "Stakeld az ETH-ed", - "page-upgrades-get-involved-stake-desc": "Mostantól letétbe helyezheted az ETH-edet a beacon chain biztonságossá tételéhez.", + "page-upgrades-get-involved-ethresearch-2": "A beolvadás", + "page-upgrades-get-involved-ethresearch-3": "Szilánkolt végrehajtás", + "page-upgrades-get-involved-ethresearch-4": "Összes kutatási téma", + "page-upgrades-get-involved-how": "Hogyan szeretne bekapcsolódni?", + "page-upgrades-get-involved-how-desc": "Az Ethereum-közösségnek mindig jól jön, ha többen futtatnak klienseket, letétbe helyeznek és hibákra vadásznak.", + "page-upgrades-get-involved-join": "Csatlakozzon a kutatáshoz", + "page-upgrades-get-involved-join-desc": "Mint a legtöbb dolog az Ethereumnál, a kutatás nagy része is nyilvános. Ez azt jelenti, hogy Ön részt vehet a vitákban, illetve átolvashatja az Ethereum kutatóinak munkáit. Az ethresear.ch számos témát lefed, például a konszenzusfrissítéseket, az összevont tranzakciókat stb.", + "page-upgrades-get-involved-meta-description": "Hogyan vehet részt az Ethereum frissítésekben: futtasson csomópontot, helyezzen letétbe ETH-t, keressen hibákat stb.", + "page-upgrades-get-involved-run-clients": "Futtasson klienspárt", + "page-upgrades-get-involved-run-clients-desc": "A „kliens” egy szoftver, amely a blokkláncot futtatja. Az Ethereum esetében egy teljes csomóponthoz két klienst szükséges futtatni: egy végrehajtásiréteg-klienst és egy konszenzusréteg-klienst. A teljes csomópont képes ellenőrizni a tranzakciókat, és ha ETH-letét is rendelkezésre áll, akkor új blokkokat is létrehozhat. Minden kliensnek megvannak a maga sajátosságai, de összességében ugyanazokat a funkciókat látják el, ezért arra biztatunk mindenkit, hogy a sokszínű biztonságos kliensállomány érdekében, amikor csak lehet, válasszon kevésbé használt klienst.", + "page-upgrades-get-involved-run-clients-desc-link": "A kliensdiverzitásról bővebben.", + "page-upgrades-get-involved-run-clients-execution": "Végrehajtásiréteg-kliensek", + "page-upgrades-get-involved-run-clients-execution-desc": "Ezeket a klienseket korábban „Eth1” klienseknek nevezték, ám ezt a kifejezést kiszorította a „végrehajtásiréteg-kliens” elnevezés.", + "page-upgrades-get-involved-run-clients-consensus": "Konszenzusréteg-kliensek", + "page-upgrades-get-involved-run-clients-consensus-desc": "Ezeket a klienseket korábban „Eth2” klienseknek nevezték, ám ezt a kifejezést kiszorította a „konszenzusréteg-kliens” elnevezés.", + "page-upgrades-get-involved-stake": "Helyezze letétbe a rendelkezésére álló ETH-t", + "page-upgrades-get-involved-stake-desc": "Mostantól az ETH-ja letétbe helyezésével hozzájárulhat a beacon lánc biztonságához.", "page-upgrades-get-involved-stake-eth": "ETH letétbe helyezése", - "page-upgrades-get-involved-subtitle": "Itt van minden, amivel az Ethereumot és a jövőbeli Eth2-höz kapcsolódó erőfeszítéseket segítheted.", - "page-upgrades-get-involved-title-1": "Futtass klienst", - "page-upgrades-get-involved-title-2": "Stakeld az ETH-ed", - "page-upgrades-get-involved-title-3": "Találj bugokat", - "page-upgrades-get-involved-written-go": "Go-ban írva", - "page-upgrades-get-involved-written-java": "Java-ban írva", - "page-upgrades-get-involved-written-javascript": "JavaScript-ben írva", - "page-upgrades-get-involved-written-nim": "Nim-ben írva", - "page-upgrades-get-involved-written-rust": "Rust-ban írva", - "page-upgrades-get-involved": "Vegyél részt az Eth2-ben", - "page-upgrades-get-involved-2": "Kapcsolódj be", - "page-upgrades-bug-bounty-leaderboard-points": "pontok" + "page-upgrades-get-involved-subtitle": "Itt megtalál mindent, amivel az Ethereumot és a jövőbeni frissítésekhez kapcsolódó erőfeszítéseket segítheti.", + "page-upgrades-get-involved-title-1": "Futtasson egy klienst", + "page-upgrades-get-involved-title-2": "Helyezze letétbe a rendelkezésére álló ETH-t", + "page-upgrades-get-involved-title-3": "Találjon hibákat", + "page-upgrades-get-involved-written-c-sharp": "C# programnyelven írva", + "page-upgrades-get-involved-written-go": "Go programnyelven írva", + "page-upgrades-get-involved-written-java": "Java programnyelven írva", + "page-upgrades-get-involved-written-javascript": "JavaScript programnyelven írva", + "page-upgrades-get-involved-written-nim": "Nim programnyelven írva", + "page-upgrades-get-involved-written-rust": "Rust programnyelven írva", + "page-upgrades-get-involved": "Vegyen részt az Ethereum frissítésében", + "page-upgrades-get-involved-2": "Kapcsolódjon be", + "page-upgrades-bug-bounty-leaderboard-points": "pontszám" } diff --git a/src/intl/hu/page-upgrades-index.json b/src/intl/hu/page-upgrades-index.json index 00c8d19db84..0cdde8ba6bf 100644 --- a/src/intl/hu/page-upgrades-index.json +++ b/src/intl/hu/page-upgrades-index.json @@ -1,145 +1,208 @@ { - "consensus-client-lighthouse-logo-alt": "Lighthouse logo", - "consensus-client-lodestar-logo-alt": "Lodestar logo", - "consensus-client-nimbus-logo-alt": "Nimbus logo", - "consensus-client-prysm-logo-alt": "Prysm logo", - "consensus-client-teku-logo-alt": "Teku logo", - "page-upgrades-answer-1": "Gondolj úgy az Eth2-re, mint egy fejlesztési sorozatra, melyeket a ma használt Ethereumhoz hozzáadunk, hogy tovább fejlesszük. Ezekbe a fejlesztésekbe beletartozik egy új lánc, melyet Beacon Chainnek nevezünk és további 64 lánc, melyeket shardoknak nevezünk.", - "page-upgrades-answer-2": "Ezek a ma használt Ethereum főhálózattól különállóak, de nem fogják helyettesíteni azt. Ehelyett a főhálózat bedokkol vagy 'beolvad' ebbe a párhuzamos rendszerbe, melyet idővel hozzáadunk.", - "page-upgrades-answer-4": "Más szavakkal az Ethereum, amit ma használunk, végül megtestesíti mindazon tulajdonságokat, melyeket az Eth2 vízióval elérni szeretnénk.", - "page-upgrades-beacon-chain-date": "A Beacon Chain 2020. december 1.-ején lépett életbe.", - "page-upgrades-beacon-chain-desc": "Az ökoszisztéma első Eth2 kiegészítője. A Beacon Chain elhozza a letétbe helyezést az Ethereumra, lefekteti a jövő fejlesztéseinek alapjait és az új rendszert fogja koordinálni végül.", - "page-upgrades-beacon-chain-estimate": "A Beacon Chain életbe lépett", + "consensus-client-besu-logo-alt": "A Besu logója", + "consensus-client-erigon-logo-alt": "Az Erigon logója", + "consensus-client-geth-logo-alt": "A Geth logója", + "consensus-client-lighthouse-logo-alt": "A Lighthouse logója", + "consensus-client-lodestar-logo-alt": "A Lodestar logója", + "consensus-client-nethermind-logo-alt": "A Nethermind logója", + "consensus-client-nimbus-logo-alt": "A Nimbus logója", + "consensus-client-prysm-logo-alt": "A Prysm logója", + "consensus-client-teku-logo-alt": "A Teku logója", + "page-upgrades-answer-1": "A Beacon láncot arra használták, hogy az egyesítés (Merge) idején frissítsék az Ethereum fő hálózatát.", + "page-upgrades-answer-2": "Az egyesítéssel (Merge) az Ethereum eddigi legjelentősebb frissítését hajtották végre, felváltva az addig használt proof-of-work mechanizmust egy új, proof-of-stake alapú konszenzusrétegre.", + "page-upgrades-answer-4": "A Beacon láncot az Ethereum által most használt proof-of-stake alapú konszenzusmechanizmus kifejlesztéséhez használták. Az Ethereum fő hálózatától különválasztva futtatták, hogy a fejlesztők megfigyelhessék, hogyan működik önmagában a konszenzusmechanizmus, mielőtt valós tevékenység koordinálására használnák.", + "page-upgrade-article-author-status": "Állapot", + "page-upgrade-article-author-ethmerge": "Ethmerge", + "page-upgrade-article-author-alchemy": "Alchemy", + "page-upgrade-article-author-consensys": "Consensys", + "page-upgrade-article-author-delphi-digital": "Delphi Digital", + "page-upgrade-article-author-eip-4844": "Vitalik Buterin, Dankrad Feist, Diederik Loerakker, George Kadianakis, Matt Garnett, Mofi Taiwo", + "page-upgrade-article-author-ethereum-foundation": "Ethereum Alapítvány", + "page-upgrade-article-author-vitalik-buterin": "Vitalik Buterin", + "page-upgrade-article-author-ethos-dev": "Ethereum.org", + "page-upgrade-article-title-two-point-oh": "Kettő pont nulla: a Beacon lánc", + "page-upgrade-article-title-beacon-chain-explainer": "A Beacon lánc/Ethereum 2.0 leírása, amelyet először el kell olvasnia", + "page-upgrade-article-title-sharding-consensus": "Szilánkolási konszenzus", + "page-upgrade-article-title-sharding-is-great": "Miért remek dolog a szilánkolás: a műszaki tulajdonságok érthetőbbé tétele", + "page-upgrade-article-title-rollup-roadmap": "Összevonttranzakció-központú útiterv", + "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "Ethereum útikalauz stopposoknak", + "page-upgrade-article-title-eip-4844": "EIP-4844: Shard Blob tranzakciók (Proto-Danksharding)", + "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding GYIK", + "page-upgrade-article-title-sharding-das": "Magyarázat a szilánkoláshoz és az adatelérhetőség-mintázáshoz (Data Availability Sampling – DAS)", + "page-upgrade-article-title-ethmerge": "Ethmerge", + "page-upgrade-article-title-merge-is-coming": "Jön az egyesítés (Merge)", + "page-upgrade-article-title-state-of-the-merge": "Hogy áll az egyesítés (Merge): friss hírek az Ethereum beolvadásról, vagyis a Proof-of-Stake 2022-es bevezetéséről", + "page-upgrade-article-title-ropsten-merge-testnet": "A Ropsten Merge tesztelőhálózat bejelentése", + "page-upgrade-article-title-execution-layer-specs": "Végrehajtási réteg – specifikáció", + "page-upgrade-article-title-consensus-layer-specs": "Konszenzusréteg – specifikáció", + "page-upgrade-article-title-engine-api-specs": "Motor-API – specifikáció", + "page-upgrades-beacon-chain-date": "A Beacon láncot 2020. december 1-jén élesítették", + "page-upgrades-beacon-chain-desc": "A Beacon lánc tette lehetővé a letétbe helyezést az Ethereumon, és lefektette az alapjait a jövőbeli frissítéseknek. Ez a lánc végzi az új, proof-of-stake Ethereum koordinálását.", + "page-upgrades-beacon-chain-estimate": "A Beacon lánc élesítése", "page-upgrades-beacon-chain-title": "A Beacon Chain", - "page-upgrades-bug-bounty": "Bug vadászati program megtekintése", - "page-upgrades-clients": "Eth2 kliensek megtekintése", - "page-staking-deposit-contract-title": "A letéti szerződés cím ellenőrzése", - "page-upgrades-dive": "Merülj el a vízióban", - "page-upgrades-dive-desc": "Hogyan tesszük az Ethereumot skálázhatóbbá, biztonságosabbá és fenttarthatóbbá? Mindezt úgy, hogy a legfontosabb Ethereum decentralizáltsági étosz megmarad.", - "page-upgrades-docking": "A dokkolás", - "page-upgrades-merge-answer-1": "A dokkolás az, amikor a főhálózat egy sharddá válik. Ez a shard láncok sikeres bevezetése után jön.", - "page-upgrades-merge-btn": "Többet a dokkolásról", - "page-upgrades-merge-desc": "Egy ponton a főhálózati Ethereumnak be kell majd “dokkolnia” vagy “olvadnia” a Beacon Chainbe. Ez lehetővé teszi majd a letétbe helyezést a teljes hálózatnak és az energia-intenzív bányászat végét jelenti.", - "page-upgrades-merge-estimate": "Becslés: 2022", - "page-upgrades-merge-mainnet": "Mi az a főhálózat?", + "page-upgrades-bug-bounty": "Hibavadász program megtekintése", + "page-upgrades-clients": "Tekintse meg a konszenzusos klienseket (korábbi nevükön „Eth2” kliensek)", + "page-staking-deposit-contract-title": "Ellenőrizze a letéti szerződéscímet", + "page-upgrades-dive": "Merüljön el a jövőképben", + "page-upgrades-dive-desc": "Hogyan tesszük az Ethereumot méretezhetőbbé, biztonságosabbá és fenntarthatóbbá? Mindezt úgy, hogy közben megtartjuk az Ethereum lényegét képező decentralizáltságot.", + "page-upgrades-docking": "A beolvadás", + "page-upgrades-merge-answer-1": "Az egyesítés (Merge) volt az az esemény, amely során az Ethereum 2022. szeptember 15-én áttért a proof-of-stake konszenzusmechanizmusra. A Beacon lánc összeolvadt a fő lánccal, ezzel hivatalosan is megszüntetve a proof-of-work használatát Ethereumon, és nagyjából 99,95%-kal csökkentve az Ethereum energiafelhasználását.", + "page-upgrades-merge-btn": "A beolvadásról bővebben", + "page-upgrades-merge-desc": "Az Ethereum fő hálózata egyesült a proof-of-stake Beacon lánccal, ami az energiaintenzív bányászat végét jelentette.", + "page-upgrades-merge-estimate": "Megtörtént az egyesítés (Merge)", + "page-upgrades-merge-mainnet": "Mi az a fő hálózat?", "page-upgrades-eth-blog": "ethereum.org blog", - "page-upgrades-explore-btn": "Fejlesztések felfedezése", - "page-upgrades-get-involved": "Vegyél részt az Eth2-ben", - "page-upgrades-get-involved-2": "Kapcsolódj be", - "page-upgrades-head-to-ethresearch": "Irány a(z) ethresear.ch", - "page-upgrades-help": "Szeretnéd segíteni az Eth2-t?", - "page-upgrades-help-desc": "Rengeteg lehetőség adódik, hogy bekapcsolódj az Eth2 fejlesztésekbe, Segítsd a tesztelésben, és még díjakat is nyerhetsz.", - "page-upgrades-index-staking": "A letétbe helyezés megérkezett", - "page-upgrades-index-staking-desc": "Az Eth2 fejlesztések kulcsa a staking bevezetése. Ha szeretnéd az ETH-edet a hálózat biztonságának segítésére használni, akkor kövesd ezeket a lépéseket.", - "page-upgrades-index-staking-learn": "Tudj meg többet a staking-ről", - "page-upgrades-index-staking-learn-desc": "A Beacon Chain elhozza a letétbe helyezést az Ethereumra. Ez azt jelenti, hogy ha van ETH-ed, akkor közhasznú tevékenységként a hálózatot biztonságosabbá teheted és a folyamat közben több ETH-et szerezhetsz.", - "page-upgrades-index-staking-step-1": "1. Beállítás az indítópulttal", - "page-upgrades-index-staking-step-1-btn": "Staking indítópult meglátogatása", - "page-upgrades-index-staking-step-1-desc": "Ahhoz, hogy az Eth2-n stakelj az indítópultot kell használnod - ez végigkísér a folyamaton.", - "page-upgrades-index-staking-step-2": "2. Letéti cím megerősítése", - "page-upgrades-index-staking-step-2-btn": "Letéti szerződés cím megerősítése", - "page-upgrades-index-staking-step-2-desc": "Mielőtt letétbe raknád az ETH-edet, ellenőrizd, hogy a helyes címet használod-e. Először végig kell menned a indítópulton, mielőtt ezt megteszed.", + "page-upgrades-explore-btn": "Fedezze fel a frissítéseket", + "page-upgrades-get-involved": "Vegyen részt az Ethereum frissítésében", + "page-upgrades-get-involved-2": "Kapcsolódjon be", + "page-upgrades-head-to-ethresearch": "Látogasson el az ethresear.ch oldalra", + "page-upgrades-help": "Segítene az Ethereum-frissítéseknél?", + "page-upgrades-help-desc": "Rengeteg lehetőség adódik, hogy bekapcsolódjon az Ethereum-frissítésekbe, segítsen a tesztelésben, és még díjakat is nyerhet.", + "page-upgrades-index-staking": "A letétbe helyezés már elérhető", + "page-upgrades-index-staking-desc": "Az Ethereum-frissítések kulcsa a letétbe helyezés bevezetése. Ha szeretné az ETH-ját a hálózatbiztonság segítésére használni, akkor kövesse ezeket a lépéseket.", + "page-upgrades-index-staking-learn": "Tudjon meg többet a letétbe helyezésről", + "page-upgrades-index-staking-learn-desc": "A Beacon lánc elhozta a letétbe helyezést az Ethereumra. Ez azt jelenti, hogy ha van ETH-ja, akkor a közjó érdekében biztonságosabbá teheti a hálózatot, és közben még több ETH-et szerezhet.", + "page-upgrades-index-staking-step-1": "1. Beállítás az indítóállás segítségével", + "page-upgrades-index-staking-step-1-btn": "Nyissa meg a letétbehelyezési indítóállást", + "page-upgrades-index-staking-step-1-desc": "Az Ethereumon a letétbe helyezéshez az indítóállást kell használnia – az végigkíséri majd a folyamaton.", + "page-upgrades-index-staking-step-2": "2. Letétbehelyezési cím megerősítése", + "page-upgrades-index-staking-step-2-btn": "Ellenőrizze a letétbehelyezési szerződéscímet", + "page-upgrades-index-staking-step-2-desc": "Mielőtt letétbe helyezné az ETH-ját, ellenőrizze, hogy a helyes címet használja-e. Mielőtt ezt megtehetné, végig kell mennie az indítóállás beállításain.", "page-upgrades-index-staking-sustainability": "Fenntarthatóbb", - "page-upgrades-meta-desc": "Egy áttekintés az Ethereum 2.0 fejlesztésekről és a vízióról, amit szeretnénk megvalósítani.", - "page-upgrades-meta-title": "Az Eth2 fejlesztések", - "page-upgrades-proof-stake-link": "Többet a proof-of-stake-ről", - "page-upgrades-question-1-title": "Mikor vezetik be az Eth2-t?", - "page-upgrades-question-1-desc": "Az Eth2 különböző fejlesztésekből áll különböző bevezetési dátumokkal.", - "page-upgrades-question-2-title": "Az Eth2 egy különálló blokklánc?", - "page-upgrades-question-2-desc": "Nem teljesen pontos úgy gondolni az Eth2-re, mint egy különálló blokkláncra.", - "page-upgrades-question-3-answer-3-link": "ethresear.ch meglátogatása", - "page-upgrades-question-3-desc": "Jelenleg nem kell csinálnod semmit, hogy felkészülj az Eth2-re.", - "page-upgrades-question-3-title": "Hogyan készüljek fel az Eth2-re?", - "page-upgrades-question-4-answer-1": "Amikor ma elküldesz egy tranzakciót vagy egy dappot használsz, akkor az Eth1-et használod. Ez a bányászok által biztosított Ethereum.", - "page-upgrades-question-4-answer-3": "A dokkolás után validátorok fogják biztosítani a teljes hálózatot proof-of-stake-el.", - "page-upgrades-question-4-answer-6": "Bárki validátor lehet ETH letétbe helyezéssel.", + "page-upgrades-meta-desc": "Az Ethereum frissítések és a megvalósítani remélt jövőkép áttekintése.", + "page-upgrades-meta-title": "Ethereum frissítések (korábban „Eth2”)", + "page-upgrades-proof-stake-link": "A proof-of-stake-ről bővebben", + "page-upgrades-question-1-title": "Mikor lépnek életbe a frissítések?", + "page-upgrades-question-1-desc": "Az Ethereum frissítése lépésről lépésre történik. Különálló frissítésekből áll, eltérő bevezetési dátumokkal.", + "page-upgrades-question-2-title": "A Beacon lánc különálló blokklánc?", + "page-upgrades-question-2-desc": "Igen. A Beacon lánc az Ethereum fő hálózatának frissítéséhez használt párhuzamos proof-of-stake blokklánc neve. Most már csak egy blokklánc létezik, amely úgy jött létre, hogy eredeti Ethereum-blokklánc beolvadt a Beacon láncba.", + "page-upgrades-question-3-answer-2a": "Az egyesítés (Merge) minimális hatással volt a dapp-fejlesztőkre. Ők továbbra is változatlan módon kommunikálnak az Ethereummal.", + "page-upgrades-question-3-answer-2a-link": "Az egyesítés (Merge) és a dapp-fejlesztők", + "page-upgrades-question-3-answer-2b": "A szilánkolási tervek kidolgozása még folyamatban van, de 2. rétegű összevont tranzakciókkal számolva alakítják ki őket.", + "page-upgrades-layer-2-rollups": "A 2. rétegű összevont tranzakciókról bővebben", + "page-upgrades-question-3-answer-3-link": "Tovább az ethresear.ch oldalra", + "page-upgrades-question-3-desc": "Jelenleg semmit sem kell tennie, hogy felkészüljön a frissítésekre.", + "page-upgrades-question-3-title": "Hogyan készülhetek fel a frissítésekre?", + "page-upgrades-question-4-answer-1": "Ha ma tranzakciót kezdeményez vagy egy dappot használ, akkor a fő hálózatnak is nevezett végrehajtási réteget használja.", + "page-upgrades-question-4-answer-3": "Az egyesítés (Merge) óta a validátorok a proof-of-stake konszenzusmechanizmus útján biztosítják a teljes hálózatot.", + "page-upgrades-question-4-answer-6": "ETH letétbe helyezésével bárki lehet validátor.", "page-upgrades-question-4-answer-7": "Többet a letétbe helyezésről", - "page-upgrades-question-4-title": "Mi az az Eth1?", - "page-upgrades-question-4-desc": "Az Eth1 az Ethereum főhálózatra utal, amit ma is használsz.", - "page-upgrades-question-5-answer-1": "Hogy teljes validátorrá válhass, 32 ETH-et kell letétbe helyezned. Ha nincs olyan sok vagy nem szeretnél ennyit letenni, akkor csatlakozhatsz letéti alapokhoz. Ezek az alapok lehetővé teszik, hogy kevesebbet tegyél letétbe és az összes díjnak a töredékében részesülj.", - "page-upgrades-question-5-desc": "A staking indítópultot kell használnod, vagy csatlakoznod kell egy letéti alaphoz.", - "page-upgrades-question-5-title": "Hogyan helyezzek el letétet?", - "page-upgrades-question-6-answer-3": "Danny Ryan az Ethereum Alapítványtól rendszeres tájékoztatást nyújt a közösségnek:", - "page-upgrades-question-6-answer-4": "Ben Edgingtonnak a Consensystől vagy egy heti rendszerességű Eth2 hírlevele:", - "page-upgrades-question-6-answer-5": "Csatlakozhatsz az Eth2 kutatási és fejlesztési fórumhoz az ethresear.ch oldalon.", + "page-upgrades-question-4-title": "Mi az a végrehajtási réteg?", + "page-upgrades-question-4-desc": "Az egyesítés (Merge) előtt az Ethereum-blokkláncot „Eth1” néven is emlegették. Ezt a megnevezést szorította ki a „végrehajtási réteg” kifejezés.", + "page-upgrades-question-5-answer-1": "Hogy validátorrá válhasson, letétbe kell helyeznie 32 ETH-t. Ha nincs elegendő ETH-ja, vagy nem szeretne ennyit letétbe helyezni, akkor csatlakozhat letéti poolokhoz. Ezek az alapok lehetővé teszik, hogy kevesebbet tegyen letétbe, és cserébe a teljes díj törtrészét kapja meg.", + "page-upgrades-question-5-desc": "A letétbehelyezési indítóállást kell használnia, vagy csatlakoznia kell egy letéti poolhoz.", + "page-upgrades-question-5-title": "Hogyan történik a letétbe helyezés?", + "page-upgrades-question-6-answer-3": "Az Ethereum Alapítvány részéről Danny Ryan nyújt rendszeres tájékoztatást a közösségnek:", + "page-upgrades-question-6-answer-4": "A ConsenSys munkatársa, Ben Edgington heti hírlevelet készít az Ethereum-frissítésekkel kapcsolatban:", + "page-upgrades-question-6-answer-5": "Emellett csatlakozhat az Ethereum-kutatási és -fejlesztési fórumhoz is az ethresear.ch oldalon.", "page-upgrades-question-6-title": "Mit kell csinálnom a dappommal?", - "page-upgrades-question-6-desc": "A dappodra nem lesz hatással egyik közelgő frissítés sem. Azonban a jövőbeli fejlesztések szükségessé tehetnek egy pár változtatást.", - "page-upgrades-question-6-answer-1": "Egyelőre nincs semmi tennivaló. De azt ajánljuk, hogy légy naprakész a shard láncok és a dokkolás fejlesztéseivel.", - "page-upgrades-question-7-desc": "A közösség egészéből sok különböző csapat dolgozik a különféle Eth2 frissítéseken.", + "page-upgrades-question-6-desc": "Az egyesítést (Merge) úgy tervezték meg, hogy minimális hatást gyakoroljon a dapp-fejlesztőkre, azonban történt néhány említésre méltó változtatás.", + "page-upgrades-question-6-answer-1": "A beolvadás előtti Ethereumot ismerő dapp-fejlesztőknek tisztában kell lenniük néhány változással. Ezek közé sorolható a blokkstruktúra és -időzítés változása, néhány műveletikód-változás, a láncon belüli (on-chain) véletlenszerűség forrása és a korszak-véglegesítés koncepciója.", + "page-upgrades-question-6-answer-1-link": "Az egyesítés (Merge) hatása az Ethereum alkalmazási rétegére", + "page-upgrades-question-6-answer-2": "Az alkalmazások szinte teljesen érintetlenek maradtak.", + "page-upgrades-question-7-desc": "A közösség egészéből sok különböző csapat dolgozik a különféle Ethereum-frissítéseken.", "page-upgrades-question-7-lighthouse": "Lighthouse", - "page-upgrades-question-7-lighthouse-lang": "(Rust implementáció)", + "page-upgrades-question-7-lighthouse-lang": "(Rust-implementáció)", "page-upgrades-question-7-lodestar": "Lodestar", - "page-upgrades-question-7-lodestar-lang": "(JavaScript implementáció)", + "page-upgrades-question-7-lodestar-lang": "(JavaScript-implementáció)", "page-upgrades-question-7-nimbus": "Nimbus", - "page-upgrades-question-7-nimbus-lang": "(Nim implementáció)", + "page-upgrades-question-7-nimbus-lang": "(Nim-implementáció)", "page-upgrades-question-7-prysm": "Prysm", - "page-upgrades-question-7-prysm-lang": "(Go implementáció)", - "page-upgrades-question-7-teams": "Az Eth2 kliens csapatok:", + "page-upgrades-question-7-prysm-lang": "(Go-implementáció)", + "page-upgrades-question-7-teams": "Az Ethereum konszenzusoskliens-csapatai:", "page-upgrades-question-7-teku": "Teku", - "page-upgrades-question-7-teku-lang": "(Java implementáció)", - "page-upgrades-question-7-title": "Ki építi az Eth2-t?", - "page-upgrades-question-8-answer-1": "Az Eth2 fejlesztések az Ethereum decentralizált módon történő skálázhatóságában fognak segíteni a biztonság fenntartásával és a fenntarthatóság növelésével.", - "page-upgrades-question-8-answer-2": "Valószínűleg a legnyilvánvalóbb probléma az az, hogy az Ethereumnak 15-45 tranzakciónál többet kell tudnia kezelni másodpercenként. De az Eth2 fejlesztés az Ethereum más jelenlegi problémáját is orvosolja.", - "page-upgrades-question-8-answer-3": "A hálózat használatára nagy a kereslet, mely az Ethereum használatát megdrágítja. A hálózati csomópontok küszködnek az Ethereum mérete és az adatmennyiség miatt, melyet a számítógépeknek fel kell dolgozniuk. És a mögöttes algoritmus, mely biztonságossá és decentralizálttá teszi az Ethereumot, energiaintenzív és zöldebbnek kell lennie.", - "page-upgrades-question-8-answer-4": "Az Ethereum ütemterv egészen 2015-től sk változtatást tartalmazott. De a jelenlegi feltételek még inkább szükségesebbé teszik a frissítéseket.", - "page-upgrades-question-8-answer-6": "Fedezd fel az Eth2 víziót", - "page-upgrades-question-8-desc": "Az ma használt Ethereumnak jobb élményeket kell nyújtania a végfelhasználóknak és a hálózati szereplőknek.", - "page-upgrades-question-8-title": "Miért szükséges az Eth2?", - "page-upgrades-question-9-answer-1": "A legaktívabb szerep, amit elvállalhatsz az az ETH-ed letétbe helyezése.", - "page-upgrades-question-9-answer-2": "Esetleg futtathatsz egy második klienst javítva ezzel a kliens diverzitást.", - "page-upgrades-question-9-answer-3": "Ha technikásabb vagy, akkor segíthetsz megtalálni az új kliensek bugjait.", - "page-upgrades-question-9-answer-4": "Beszállhatsz a technikai beszélgetésbe az Ethereum kutatókkal az ethresear.ch oldalon.", - "page-upgrades-question-9-desc": "A közreműködéshez nem kell technikai tudás. A közösség mindenféle készségtől keres hozzájárulást.", + "page-upgrades-question-7-teku-lang": "(Java-implementáció)", + "page-upgrades-question-7-title": "Ki fejleszti Ethereum-frissítéseket?", + "page-upgrades-question-7-clients": "Tudjon meg többet az Ethereum-kliensekről", + "page-upgrades-question-8-answer-1": "Az Ethereum-frissítések segítik az Ethereum decentralizált méretezését, miközben megőrzik a hálózat biztonságát és fokozzák a fenntarthatóságát.", + "page-upgrades-question-8-answer-2": "A legnyilvánvalóbb probléma talán az, hogy az Ethereumnak másodpercenként 15–45 tranzakciónál többet kell tudnia kezelni. Ám a frissítések az Ethereum más aktuális problémáit is orvosolják.", + "page-upgrades-question-8-answer-3": "A hálózathasználat iránti igény növekedése megdrágítja az Ethereum használatát. Az Ethereum méretének és a számítógépes feldolgozással érintett adatok mennyiségének kezelése kihívást jelent a csomópontok számára. Az Ethereum biztonságának és decentralizációjának alapját képező eredeti algoritmus működése energiaintenzív volt, és zöldebbé kellett tenni.", + "page-upgrades-question-8-answer-4": "A most eszközölt változásokból sok olyan van, amely mindig is szerepelt az Ethereum útitervében, némelyik már 2015 óta. Ám a jelenlegi körülmények még inkább növelik a frissítések iránti igényt.", + "page-upgrades-question-8-answer-6": "Fedezze fel az Ethereum jövőképét", + "page-upgrades-question-8-desc": "A ma használt Ethereumnak jobb élményt kell nyújtania a végfelhasználók és a hálózati résztvevők számára.", + "page-upgrades-question-8-title": "Miért van szükség frissítésekre?", + "page-upgrades-question-9-answer-1": "Az Ön számára nyitva álló legaktívabb szerep az ETH-ja letétbe helyezése.", + "page-upgrades-question-9-answer-2": "A kliensdiverzitás elősegítése érdekében akár egy második klienst is futtathat.", + "page-upgrades-question-9-answer-3": "Ha erősebb a műszaki vénája, akkor segíthet a hibakeresésben az új klienseknél.", + "page-upgrades-question-9-answer-4": "Emellett az Ethereum-kutatók közötti szakmai párbeszédekben is részt vehet az ethresear.ch oldalon.", + "page-upgrades-question-9-desc": "A részvételhez nem szükséges műszaki tudás. A közösség bármilyen szakmai hátterű ember meglátásait szívesen fogadja.", "page-upgrades-question-9-stake-eth": "ETH letétbe helyezése", - "page-upgrades-question-9-title": "Hogyan tudok közreműködni az Eth2-höz?", + "page-upgrades-question-9-title": "Hogyan járulhatok hozzá az Ethereum-frissítésekhez?", + "page-upgrades-question-9-more": "Keressen általánosabb módot, hogy részt vehessen az Ethereum fejlesztésében", "page-upgrades-question-10-title": "Mik az Eth2 fázisai?", - "page-upgrades-question-10-desc": "A fázisok a munka fázisaihoz kapcsolódnak és az Eth2 műszaki ütemtervre fókuszálnak.", - "page-upgrades-question-10-answer-1": "Nem szívesen beszélünk túl sokat a műszaki ütemtervről, mert ez szoftver: a dolgok változhatnak. Úgy gondoljuk, hogy könnyebb megérteni, mi történik, ha elolvasod az eredményeket.", - "page-upgrades-question-10-answer-1-link": "Frissítések megtekintése", - "page-upgrades-question-10-answer-2": "De ha követted a beszélgetéseket, itt van, hogy hogy illenek a fejlesztések a műszaki ütemtervekbe.", - "page-upgrades-question-10-answer-3": "A Fázis 0 részletezi a Beacon Chain életbe léptetéséhez szükséges munkát.", - "page-upgrades-question-10-answer-5": "A műszaki ütemtervekben szereplő Fázis 1 a shard láncok implementálására fókuszál.", - "page-upgrades-question-10-answer-6": "A főhálózat dokkolása az Eth2-be a shard láncok megvalósítása érdekében végzett munka kiterjesztése, és a Fázis 1.5-ként emlegetik. De egy jelentős pillanat, mivel az Ethereum, ahogy ma ismerjük, összeolvad a többi Eth2 fejlesztéssel. Továbbá ez az a pillanat, amikor az Ethereum teljesen átáll proof-of-stake-re.", - "page-upgrades-question-10-answer-7": "Jelenleg nem teljes világos, hogy mi fog történni a Fázis 2 körül. Még mindig komoly kutatás és vita tárgyát képezi. Az eredeti terv az volt, hogy további extra funkciókkal látjuk el a shardokat, de lehet, hogy erre nem lesz szükség a rollup-centrikus ütemterv szerint.", - "page-upgrades-question-10-answer-8": "Többet a rollup-centrikus ütemtervről", + "page-upgrades-question-10-desc": "Néhány dolog megváltozott.", + "page-upgrades-question-10-answer-0": "Az „Eth2” megnevezés is eltűnik, mivel nem egyetlen frissítést vagy új hálózatot jelöl. Pontosabban fogalmazva több frissítésből álló eszköztárat jelent, amelyek mind hozzájárulnak ahhoz, hogy az Ethereum méretezhetőbb, biztonságosabb és fenntarthatóbb legyen. Az Ön által ismert és szeretett hálózat neve egyszerűen csak Ethereum.", + "page-upgrades-question-10-answer-1": "Nem szívesen beszélünk a kelleténél többet a műszaki útitervről, mivel ez egy szoftver, vagyis a dolgok változhatnak. Szerintünk a kimenetelekről olvasva könnyebb megérteni az eseményeket.", + "page-upgrades-question-10-answer-1-link": "A frissítések megtekintése", + "page-upgrades-question-10-answer-2": "Ám ha követte a beszélgetéseket, most megmutatjuk, hogyan illeszkednek a frissítések a műszaki útitervbe, és egy kis betekintést adunk a változásokba is.", + "page-upgrades-question-10-answer-3": "A 0. fázis ismertette azt a munkát, amely a Beacon lánc élesítéséhez kellett.", + "page-upgrades-question-10-answer-5": "Az 1. fázis eredetileg a láncszilánkok megvalósítására fókuszált, de aztán az egyesítés (Merge) lépett az első helyre, és 2022. szeptember 15-én meg is valósult.", + "page-upgrades-question-10-answer-6": "Az 1.5 fázis az eredeti tervek szerint a szilánkok bevezetését követte volna, amikor a fő hálózat utolsó szilánkként a Beacon lánchoz kerül. Azonban ahogy az összevonttranzakció-technológia fejlődött, az Ethereum-közösség inkább a proof-of-work mechanizmusról való áttérést gyorsította fel.", + "page-upgrades-question-10-answer-7": "A 2. fázissal kapcsolatos tervek intenzív kutatás és párbeszéd tárgyát képezték. Most, hogy az egyesítés (Merge) megtörtént és a 2. rétegű megoldások fejlődését figyelembe véve a célok az adatszilánkolás egy egyszerűbb formájának biztosítása felé tolódnak el az összevont tranzakciók hatékonyságának maximalizálása érdekében. A jelenlegi 2. rétegű megoldások lehetővé teszik a tranzakciók végrehajtásának méretezését, a szilánkolás segítségével pedig megvalósítható ezen adatok bizonyítékának olcsó és méretezhető tárolása az 1. rétegen.", + "page-upgrades-question-10-answer-8": "Az összevonttranzakció-központú útitervről bővebben", + "page-upgrades-question-11-title": "Vásárolhatok Eth2-t?", + "page-upgrades-question-11-desc": "Nem. Nincs Eth2-token, és az ETH sem változott az egyesítés (Merge) után.", + "page-upgrades-question-11-answer-1": "Az Eth2 név felvétele mögötti hajtóerők egyike az az általános félreértés volt, hogy az ETH-tulajdonosoknak az egyesítés (Merge) vagy bármely más frissítést követően migrálniuk kell majd az ETH-tokenjeiket az ETH 2.0-ra. Ez nem igaz, és soha nem is volt az.", + "page-upgrades-question-11-answer-2": " Ezt a félreértést a csalók gyakran kihasználják.", "page-upgrades-question-title": "Gyakran ismételt kérdések", - "page-upgrades-question3-answer-1": "Az ETH birtokosoknak biztos, hogy nem kell csinálniuk semmit. Az ETH-edet nem kell megváltoztatni vagy frissíteni. Biztos, hogy lesznek olyan átverések, melyek ezt tanácsolják, úgyhogy légy óvatos.", - "page-upgrades-scalable": "Skálázhatóbb", - "page-upgrades-scalable-desc": "Az Ethereumnak biztosítania kell az 1000 tranzakciót másodpercenként, hogy az alkalmazások gyorsabbak és olcsóbbak legyenek.", + "page-upgrades-question3-answer-1": "Az ETH-birtokosoknak nem kell csinálniuk semmit. Az ETH-t nem kell megváltoztatni, sem frissíteni. Majdnem biztosan lesznek olyan átverések, amelyek ezt tanácsolják, úgyhogy legyen óvatos.", + "page-upgrades-scalable": "Méretezhetőbb", + "page-upgrades-scalable-desc": "Az Ethereumnak biztosítania kell az 1000 tranzakciót másodpercenként, hogy az alkalmazások gyorsabbak és olcsóbban használhatók legyenek.", "page-upgrades-secure": "Biztonságosabb", - "page-upgrades-secure-desc": "Az Ethereumnak biztonságosabbnak kell lennie. Ahogy az Ethereum adoptációja egyre nő, a protokollnak is biztonságosabbnak kell lennie különféle támadásokkal szemben.", - "page-upgrades-shard-date": "A shard láncok bevezetése, a második fejlesztés, nagyjából 2023 körül várható.", - "page-upgrades-shard-desc": "A shard láncok megnövelik az Ethereum a tranzakciók feldolgozására és adattárolására vonatkozó kapacitását. A shardok idővel több funkciót fognak ellátni, melyet több fázisban vezetünk be.", - "page-upgrades-shard-estimate": "Becslés: 2023", - "page-upgrades-shard-lower": "Többet a shard láncokról", - "page-upgrades-shard-title": "Shard láncok", - "page-upgrades-stay-up-to-date": "Maradj naprakész", - "page-upgrades-stay-up-to-date-desc": "Kapd meg a legfrissebb infókat a kutatóktól és fejlesztőktől, akik az Eth2 fejlesztéseken dolgoznak.", - "page-upgrades-sustainable-desc": "Az Ethereumnak környezetbarátabbnak kell lennie. A mai technológia túl sok számítási erőt és energiát emészt fel.", - "page-upgrades-take-part": "Vegyél részt a kutatásban", - "page-upgrades-take-part-desc": "Ethereum kutatók és érdeklődők találkoznak itt, hogy megvitassák a kutatási törekvéseket beleértve az Eth2-t is.", - "page-upgrades-the-upgrades": "Az Eth2 fejlesztések", - "page-upgrades-the-upgrades-desc": "Az Eth2 egy fejlesztések sorozata az Ethereum skálázhatósága, biztonsága és fenntarthatósága növelésének érdekében. Bár mindegyiken párhuzamosan dolgoznak, vannak bizonyos függőségeik, amelyek meghatározzák, hogy mikor kerülnek bevezetésre.", - "page-upgrades-unofficial-roadmap": "Ez nem egy hivatalos ütemterv. A kint lévő információk alapján így tekintünk a történésekre. De mivel ez technológia, a dolgok egy pillanat alatt megváltozhatnak. Tehát kérjük ne úgy értelmezd, mint egy kötelezettségvállalást.", - "page-upgrades-upgrade-desc": "Az Ethereum, amit ismerünk és szeretünk, csak skálázhatóbb, biztonságosabb és fenntarthatóbb...", - "page-upgrades-upgrades": "Az Eth2 fejlesztések", - "page-upgrades-upgrades-aria-label": "Eth2 fejlesztések menü", - "page-upgrades-upgrades-beacon-chain": "A Beacon Chain", - "page-upgrades-upgrades-guide": "Útmutató az Eth2 fejlesztésekhez", - "page-upgrades-upgrades-docking": "A főhálózat és az Eth2 dokkolása", - "page-upgrades-upgrading": "Az Ethereum merően új magasságokba fejlesztése", + "page-upgrades-secure-desc": "Az Ethereumnak biztonságosabbnak kell lennie. Ahogy az Ethereum elfogadása növekszik, a protokoll biztonságosát is fokozni kell a különféle támadásokkal szemben.", + "page-upgrades-shard-date": "A szilánkolás 2023 és 2024 folyamán több fázisban követi majd az egyesítést (Merge).", + "page-upgrades-shard-desc": "A szilánkolás kibővíti az Ethereum adattárolási kapacitását, és harmonikusan együttműködik majd az L2-megoldásokkal a feldolgozási kapacitás méretezése és a hálózati díjak csökkentése érdekében. A szilánkolás bevezetése több fázisban valósul meg, a ProtoDankshardinggal kezdve.", + "page-upgrades-shard-estimate": "Megvalósítás várható ideje: 2023–2024", + "page-upgrades-shard-lower": "A szilánkolásról bővebben", + "page-upgrades-shard-title": "Szilánkolás (sharding)", + "page-upgrades-stay-up-to-date": "Legyen mindig naprakész", + "page-upgrades-stay-up-to-date-desc": "Szerezze meg a legfrissebb infókat az Ethereum-frissítéseken dolgozó kutatóktól és fejlesztőktől.", + "page-upgrades-sustainable-desc": "Az Ethereum működése egészen a közelmúltig energiaintenzív volt. Az áttérés a proof-of-stake mechanizmusra több mint 99,9%-kal csökkentette a hálózat energiafelhasználását.", + "page-upgrades-take-part": "Vegyen részt a kutatásban", + "page-upgrades-take-part-desc": "Az Ethereum kutatók és érdeklődők találkoznak itt, hogy megvitassák a kutatási törekvéseket, beleértve mindent, ami az Ethereum frissítésekhez kapcsolódik.", + "page-upgrades-the-upgrades": "Az Ethereum frissítései", + "page-upgrades-the-upgrades-desc": "Az Ethereum-frissítések célja a hálózat méretezhetőségének, biztonságának, és fenntarthatóságának javítása. Az Ethereum a közelmúltban nagyszabású frissítéseket hajtott végre a biztonság és a fenntarthatóság tekintetében, és a jövőben is várható hasonló, különösen a méretezhetőséghez kapcsolódóan.", + "page-upgrades-unofficial-roadmap": "Ez nem a hivatalos útiterv. A nyilvánosságra hozott információk alapján így tekintünk a történésekre. De mivel ez technológia, a dolgok egy pillanat alatt megváltozhatnak. Tehát, kérjük, ne értelmezze ezt kötelezettségvállalásként.", + "page-upgrades-upgrade-desc": "Az Ethereum, amit ismerünk és szeretünk, csak méretezhetőbb, biztonságosabb és fenntarthatóbb módon...", + "page-upgrades-upgrades": "Az Ethereum frissítései", + "page-upgrades-upgrades-aria-label": "Ethereum-frissítések – menü", + "page-upgrades-upgrades-beacon-chain": "A Beacon lánc", + "page-upgrades-upgrades-guide": "Útmutató az Ethereum-frissítésekhez", + "page-upgrades-upgrades-docking": "A beolvadás", + "page-upgrades-energy-consumption": "Az Ethereum energiafogyasztásáról bővebben", + "page-upgrades-upgrading": "Az Ethereum merően új magasságokba emelése frissítéseken keresztül", "page-roadmap-vision": "A jövőkép", - "page-roadmap-vision-btn": "Többet az Eth2 vízióról", - "page-roadmap-vision-desc": "Ahhoz, hogy az Ethereumot mainstreammé tegyük és az egész emberiséget szolgálja, először skálázhatóbbá, biztonságosabbá és fenntarthatóbbá kell tennünk.", - "page-upgrades-what-to-do": "Mit kell tenned?", - "page-upgrades-what-to-do-desc": "Ha dapp felhasználó vagy ETH birtokló vagy, nem kell csinálnod semmit. Ha fejlesztő vagy vagy szeretnél elkezdeni letétbe helyezni, akkor ma többféleképpen is bekapcsolódhatsz.", - "page-upgrades-whats-next": "Mi az az Eth2?", - "page-upgrades-whats-next-desc": "Az Eth2 egy összekapcsolt fejlesztéssorozatot jelent, mely az Ethereumot skálázhatóbbá, biztonságosabbá és fenntarthatóbá teszi. Ezeket a frissítéseket több csapat fejleszti szerte az Ethereum ökoszisztémából.", + "page-roadmap-vision-btn": "Az Ethereum jövőképről bővebben", + "page-roadmap-vision-desc": "Ahhoz, hogy az Ethereumot széles körben elfogadottá tegyük és az emberiség szolgálatába állítsuk, méretezhetőbbé, biztonságosabbá és fenntarthatóbbá kell tennünk a hálózatot.", + "page-upgrades-what-happened-to-eth2-title": "Mi történt az „Eth2”-vel?", + "page-upgrades-what-happened-to-eth2-1": "Az „Eth2” kifejezést az egyesítés (Merge) előtt gyakran használták, de eltűnőben van, hogy átadja helyét egy pontosabb terminológiának.", + "page-upgrades-what-happened-to-eth2-1-more": "Az egyesítésről (Merge) bővebben.", + "page-upgrades-what-happened-to-eth2-2": "Az „Eth1” és az „Eth2” összeolvadása óta nincs két külön Ethereum-blokklánc; csak egy Ethereum létezik.", + "page-upgrades-what-happened-to-eth2-3": "A zavar elkerülése érdekében a közösség frissítette az alábbi kifejezéseket:", + "page-upgrades-what-happened-to-eth2-3-1": "Az „Eth1” helyett a „végrehajtási réteg” kifejezést használjuk. Ez a réteg kezeli a tranzakciókat és a végrehajtást.", + "page-upgrades-what-happened-to-eth2-3-2": "Az „Eth2” helyett a „konszenzusréteg” kifejezést használjuk. Ez a réteg kezeli a proof-of-stake konszenzust.", + "page-upgrades-what-happened-to-eth2-4": "Ezek a terminológiai módosítások csak az elnevezési szabályokat változtatják meg; ez nem változtat az Ethereum céljain vagy útitervén.", + "page-upgrades-what-happened-to-eth2-5": "Tudjon meg többet az „Eth2” átnevezéséről", + "page-upgrades-why-cant-we-just-use-eth2-title": "Miért nem nevezhetjük egyszerűen csak Eth2-nek?", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "Mentális modellek", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "Az egyik fő probléma az Eth2 elnevezéssel, hogy az Ethereum új felhasználóiban hibás mentális modellt hoz létre. Akaratlanul is arra gondolnak, hogy az Eth1 volt előbb, és az Eth2 jött később. Vagy azt hiszik, hogy az Eth1 megszűnt létezni az Eth2 létrejöttével. Egyik elképzelés sem igaz. Az Eth2 kifejezés kivezetésével megkíméljük a jövőbeni felhasználóinkat attól, hogy vissza kelljen fejteniük ezeket a kifejezéseket.", + "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "Bennfoglalás", + "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "Ahogy az Ethereum útiterve fejlődött, az Ethereum 2.0 pontatlan megjelöléssé vált az Ethereum-útiterv számára. A körültekintő és pontos választás lehetővé teszi, hogy a lehető legszélesebb értelemben vett nagyközönség is megértse az Ethereum tartalmát.", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "Csalásmegelőzés", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "Sajnos a rosszindulatú szereplők megpróbálják felhasználni a helytelen Eth2 megnevezést, hogy a felhasználókat átverve arra kérjék őket, hogy cseréljék ki ETH-tokenjeiket ETH2-tokenekre, vagy azt állítsák, hogy még az Eth2-frissítés előtt migrálniuk kell az ETH-tokenjeiket. Reméljük hogy ez a frissített terminológia olyannyira egyértelmű, hogy megszünteti az ilyen csalások lehetőségét, és biztonságosabbá teszi az ökoszisztémát.", + "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "Egyértelműség a letétbe helyezés terén", + "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "Vannak olyan letéti operátorok, akik a Beacon láncon letétbe helyezett ETH-t is „ETH2” kóddal jelenítették meg. Ezt potenciális félreértésekhez vezethet, mivel a szolgáltatások felhasználói valójában nem ETH2-tokent kapnak. ETH2-token nem létezik; egyszerűen csak a részesedést tükrözi az adott szolgáltató letétjében.", + "page-upgrades-what-to-do": "Mit kell tennie?", + "page-upgrades-what-to-do-desc": "Ha Ön dapp-felhasználó, illetve ETH-tulajdonos, akkor nem kell tennie semmit. Ha fejlesztő, illetve letétbe helyezést szeretne végezni, akkor most többféleképpen is bekapcsolódhat.", + "page-upgrades-whats-next": "Mik azok az Ethereum-frissítések?", + "page-upgrades-whats-next-desc": "Az Ethereum-útiterv összekapcsolt protokollfrissítéseket tartalmaz, amelyek méretezhetőbbé, biztonságosabbá és fenntarthatóbbá teszik a hálózatot. Ezeket a frissítéseket az Ethereum-ökoszisztéma több csapata fejleszti világszerte.", + "page-upgrades-whats-next-history": "Ismerje meg a korábbi Ethereum-frissítéseket", "page-upgrades-whats-ethereum": "Egy pillanat, mi az az Ethereum?", - "page-upgrades-whats-new": "Mi az új az Eth2-ben?", - "page-staking-deposit-contract-staking-more-link": "Többet a stakingről", + "page-upgrades-whats-new": "Mi vár az Ethereumra?", + "page-upgrades-security-link": "A biztonságról és a csalásmegelőzésről bővebben", + "page-staking-deposit-contract-staking-more-link": "Többet a letétbe helyezésről", "docs-nav-proof-of-stake": "Proof-of-stake", "docs-nav-proof-of-work": "Proof-of-work", "page-upgrades-get-involved-ethresearch-1": "Sharding", - "page-upgrades-get-involved-ethresearch-2": "Eth1 és Eth2 átmenet" + "page-upgrades-get-involved-ethresearch-2": "A beolvadás" } diff --git a/src/intl/hu/page-upgrades.json b/src/intl/hu/page-upgrades.json index 7471d048a0a..93ba45f48f7 100644 --- a/src/intl/hu/page-upgrades.json +++ b/src/intl/hu/page-upgrades.json @@ -1,15 +1,24 @@ { - "page-upgrades-beacon-date": "Kiszállított!", - "page-upgrades-upgrades-guide": "Útmutató az Eth2 fejlesztésekhez", - "page-upgrades-upgrades-docking": "A főhálózat és az Eth2 dokkolása", - "page-upgrades-shard-title": "Shard láncok", + "page-upgrades-merge-infographic-el": "Ethereum-állapot: tranzakciók, applikációk, szerződések, egyenlegek", + "page-upgrades-merge-infographic-alt-text": "Infografikus ábrázolás a Beacon lánc beolvadásáról az Ethereum végrehajtási rétegébe a proof-of-work → proof-of-stake mechanizmusváltás során.", + "page-upgrades-beacon-date": "Megvalósítva!", + "page-upgrades-merge-date": "2022. szeptember", + "page-upgrades-shards-date": "~2023", + "page-upgrades-pbs": "Nem azonnali – 2024/25-ben várható", + "page-upgrades-post-merge-banner-tutorial-ood": "Ez az útmutató a beolvadás után már nem naprakész, és előfordulhat, hogy nem működik. Ha szeretne segíteni, kérjük, küldjön egy bejelentést (PR-t).", + "page-upgrades-post-merge-banner-governance-ood": "Az oldalon található tartalmak egy része a beolvadás után már nem naprakész. Ha szeretne segíteni, kérjük, küldjön egy bejelentést (PR-t).", + "page-upgrades-upgrades-guide": "Útmutató az Ethereum-frissítésekhez", + "page-upgrades-upgrades-docking": "A beolvadás", + "page-upgrades-shard-title": "Sharding", "page-upgrades-upgrades-beacon-chain": "A Beacon Chain", + "consensus-beaconscan-title": "beaconscan", + "consensus-beaconscan-in-title": "beaconcha.in", "consensus-beaconcha-in-desc": "Nyílt forráskódú Beacon Chain explorer", - "consensus-beaconscan-desc": "Beacon Chain explorer - Etherscan a konszenzus réteg számára", - "consensus-become-staker": "Legyél te is letétbe helyező", - "consensus-become-staker-desc": "A letétbe helyezés életbe lépett! Ha szeretnéd letétbe helyezni az ETH-edet a hálózat biztonságánk növeléséhez, bizonyosodj meg arról, hogy ismered a kockázatokat.", - "consensus-explore": "Ismerd meg az adatokat", - "consensus-run-beacon-chain": "Konszenzus kliens futtatása", - "consensus-run-beacon-chain-desc": "Az Ethereum annyi futó klienst igényel, amennyi lehetséges. Segítsd ezzel az Ethereum közjavat!", + "consensus-beaconscan-desc": "Beacon Chain explorer – Etherscan a konszenzusréteg számára", + "consensus-become-staker": "Legyen Ön is letétbe helyező", + "consensus-become-staker-desc": "A letétbe helyezés életbe lépett! Ha szeretné letétbe helyezni ETH-jeit a hálózat biztonságának növeléséhez, bizonyosodjon meg arról, hogy ismeri a kockázatokat.", + "consensus-explore": "Ismerje meg az adatokat", + "consensus-run-beacon-chain": "Konszenzusos kliens futtatása", + "consensus-run-beacon-chain-desc": "Az Ethereum annyi futó klienst igényel, amennyi lehetséges. Segítse ezzel az Ethereum közjavát!", "read-more": "Bővebben" } diff --git a/src/intl/hu/page-wallets-find-wallet.json b/src/intl/hu/page-wallets-find-wallet.json index 50c43cd10c6..9d749808ea5 100644 --- a/src/intl/hu/page-wallets-find-wallet.json +++ b/src/intl/hu/page-wallets-find-wallet.json @@ -50,11 +50,11 @@ "page-find-wallet-features": "Jellemzők", "page-find-wallet-security": "Biztonság", "page-find-wallet-smart-contract": "Smart contract", - "page-find-wallet-check-out": "Nézd meg", + "page-find-wallet-check-out": "Nézze meg", "page-find-wallet-info-updated-on": "információ utolsó frissítésének dátuma", "page-find-wallet-showing-all-wallets": "Az összes tárca megjelenítése", "page-find-wallet-showing": "Mutatás ", - "page-find-wallet-wallets": "tárcák", + "page-find-wallet-wallets": "tárca", "page-find-wallet-iOS": "iOS", "page-find-wallet-android": "Android", "page-find-wallet-linux": "Linux", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Tárcák böngészőbővítményekkel", "page-find-wallet-device": "Eszköz", "page-find-choose-to-compare": "Válassza ki az összehasonlításhoz", - "page-find-wallet-choose-features": "Válasszon a funkciók közül" + "page-find-wallet-choose-features": "Válasszon a funkciók közül", + "page-find-wallet-reset-filters": "Szűrők törlése" } diff --git a/src/intl/tr/common.json b/src/intl/tr/common.json index d74a896eb25..aac93513867 100644 --- a/src/intl/tr/common.json +++ b/src/intl/tr/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Hesap soyutlama", "about-ethereum-org": "ethereum.org hakkında", "about-us": "Hakkımızda", + "adding-desci-projects": "Desci Projeleri Ekleme", + "adding-developer-tools": "Geliştirici Araçları Ekleme", + "adding-exchanges": "Borsalar Ekleme", + "adding-glossary-terms": "Sözlük Terimleri Ekleme", + "adding-layer-2s": "Katman 2'leri Ekleme", + "adding-products": "Ürün ekleme", + "adding-staking-products": "Hisseleme Ürünleri Ekleme", + "adding-wallets": "Cüzdanşar Ekleme", + "account-abstraction": "Hesap soyutlama", + "acknowledgements": "Onaylar", "aria-toggle-search-button": " Arama düğmesini aç/kapat", "aria-toggle-menu-button": "Menü düğmesini aç/kapat", "beacon-chain": "İşaret Zinciri", @@ -12,6 +21,8 @@ "community-hub": "Topluluk merkezi", "community-menu": "Topluluk Menüsü", "contact": "İletişim", + "content-buckets": "İçerik Kovaları", + "content-resources": "İçerik Kaynakları", "content-standardization": "İçerik standartlaştırma", "contributing": "Katkılar", "contributors": "Katkıda Bulunanlar", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Merkezî olmayan sosyal ağlar", "decentralized-science": "Merkeziyetsiz bilim (DeSci)", "defi-page": "Merkezi Olmayan Finans (DeFi)", + "design": "Tasarım", + "design-principles": "Tasarım İlkeleri", "devcon": "Devcon", "developers": "Geliştiriciler", "developers-home": "Geliştirici Ana Sayfası", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "Bu rehber yararlı oldu mu?", "feedback-widget-thank-you-title": "Geri bildiriminiz için teşekkürler!", "feedback-widget-thank-you-subtitle": "Birkaç soru yanıtlayarak bu sayfanın daha iyi hâle gelmesine yardımcı olun.", - "feedback-widget-thank-you-subtitle-ext": "Yardıma ihtiyacınız varsa Discord sunucumuzdan topluluğa ulaşabilirsiniz.", + "feedback-widget-thank-you-subtitle-ext": "Yardıma ihtiyacınız varsa Discord sunucumuzdan topluluğa ulaşabilirsiniz.", "feedback-widget-thank-you-timing": "2–3 dakika", "feedback-widget-thank-you-cta": "Kısa anketi aç", "find-wallet": "Cüzdan bul", @@ -94,11 +107,11 @@ "grants": "Yardımlar", "grant-programs": "Ekosistem Destek Programları", "guides": "Kılavuzlar", - "guides-hub": "Klavuzlar merkezi", + "guides-hub": "Nasıl yapılır rehberleri", "history-of-ethereum": "Ethereum'un Geçmişi", "home": "Ana sayfa", "how-ethereum-works": "Ethereum nasıl çalışır?\n", - "how-to-register-an-ethereum-account": "Ethereum hesabı nasıl \"kayıt\" edilir?", + "how-to-create-an-ethereum-account": "Bir Ethereum hesabı nasıl \"oluşturulur\"", "how-to-revoke-token-access": "Kripto fonlarınızın akıllı sözleşme erişimini nasıl iptal edebilirsiniz?", "how-to-swap-tokens": "Jetonlar nasıl takas edilir?", "how-to-use-a-bridge": "Jetonlar nasıl 2. katmana nasıl köprülenir?", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Veri yüklenemiyor. Daha sonra tekrar deneyin.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Birleşme", "more": "Daha fazlası", "nav-developers": "Geliştiriciler", "nav-developers-docs": "Geliştirici dokümanları", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Uzakta ara!", "search-eth-address": "Bu bir Ethereum adresine benziyor. Adreslere özel veriler sağlamıyoruz. Şunun gibi bir blok gezgininde aramayı deneyin", "search-no-results": "Aramanız için sonuç yok", + "security": "Güvenlik", "single-slot-finality": "Tek yuva kesinliği", "statelessness": "Durumsuzluk", "see-contributors": "Katkıda bulunanları göster", @@ -181,6 +196,7 @@ "start-here": "Başlamak için", "style-guide": "Stil rehberi", "solo": "Tekli staking", + "support": "Destek", "terms-of-use": "Kullanım Koşulları", "translation-banner-body-new": "Henüz çevirmediğimiz için bu sayfayı İngilizce olarak görüntülüyorsunuz. Bu içeriği çevirmemize yardım edin.", "translation-banner-body-update": "Bu sayfanın yeni bir sürümü vardır ancak şu anda yalnızca İngilizce'dir. Son sürümü çevirmemize yardımcı ol.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Burada hata yok!", "translation-banner-no-bugs-content": "Bu sayfa tercüme edilmiyor. Bu sayfayı şimdilik kasıtlı olarak İngilizce bıraktık.", "translation-banner-no-bugs-dont-show-again": "Tekrar gösterme", + "translation-program": "Çeviri Programı", "try-using-search": "Aradığınızı bulmak için arama işlevini kullanmayı deneyin veya", "tutorials": "Sunumlar", "up": "Yukarı", diff --git a/src/intl/tr/page-dapps.json b/src/intl/tr/page-dapps.json index 7578d769f96..ff2ed11d378 100644 --- a/src/intl/tr/page-dapps.json +++ b/src/intl/tr/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "1inch logosu", - "page-dapps-dexguru-logo-alt": "DexGuru logosu", "page-dapps-aave-logo-alt": "Aave logosu", "page-dapps-add-button": "dApp öner", "page-dapps-add-title": "dApp ekle", + "page-dapps-ankr-logo-alt": "Ankr logosu", + "page-dapps-api3-logo-alt": "API3 logosu", + "page-dapps-arweave-logo-alt": "ARweave logosu", "page-dapps-audius-logo-alt": "Audius logosu", "page-dapps-augur-logo-alt": "Augur logosu", "page-dapps-axie-infinity-logo-alt": "Axie Infinity logosu", "page-dapps-balancer-logo-alt": "Balancer logosu", "page-dapps-brave-logo-alt": "Brave logosu", + "page-dapps-beginner-friendly-description": "Birkaç merkeziyetsiz uygulama yeni başlayanlar için uygundur. Daha fazlasını aşağıda keşfedin.", + "page-dapps-beginner-friendly-header": "Yeni başlayan dostu", "page-dapps-category-arts": "Sanat ve moda", "page-dapps-category-browsers": "Tarayıcılar", + "page-dapps-category-code-marketplaces": "Kod pazar yerleri", "page-dapps-category-collectibles": "Dijital koleksiyonlar", - "page-dapps-category-competitive": "Rekabet", + "page-dapps-category-competitive": "Web3 oyunları", "page-dapps-category-computing": "Geliştirici araçları", - "page-dapps-category-dex": "Token takasları", - "page-dapps-category-investments": "Yatırımlar", + "page-dapps-category-dex": "Borsalar", + "page-dapps-category-investments": "Yatırım fonları", "page-dapps-category-lending": "Borç verme ve borçlanma", "page-dapps-category-lottery": "Kitle fonlama", "page-dapps-category-marketplaces": "Pazar yerleri", "page-dapps-category-music": "Müzik", "page-dapps-category-payments": "Ödemeler", "page-dapps-category-insurance": "Sigorta", - "page-dapps-category-portfolios": "Portföyler", - "page-dapps-category-trading": "Trade ve tahmin piyasaları", + "page-dapps-category-portfolios": "Portföy yönetimi", + "page-dapps-category-trading": "Tahmin piyasaları", "page-dapps-category-utilities": "Yardımcı araçlar", "page-dapps-category-worlds": "Sanal dünyalar", + "page-dapps-category-demand-aggregator": "Talep biriktiriciler", + "page-dapps-category-derivatives": "Türevler", + "page-dapps-category-liquid-staking": "Likit hisseleme", + "page-dapps-category-bridges": "Köprüler", + "page-dapps-category-experiences": "Paylaşılan deneyimler", + "page-dapps-category-guilds": "Getiri birlikleri", + "page-dapps-category-avatar": "Avatarlar", "page-dapps-choose-category": "Kategori seçimi", + "page-dapps-category-social": "Sosyal medya", + "page-dapps-category-content": "İçerik", + "page-dapps-category-messaging": "Mesajlaşma", + "page-dapps-category-identity": "Kimlik", "page-dapps-collectibles-benefits-1-description": "Bir sanat eseri Ethereum blok zincirinde belirtildiğinde sahipliğini yaratılışından şu anki sahibine kadar takip edebilirsin. Bu sahteciliği engeller.", "page-dapps-collectibles-benefits-1-title": "Sahiplik kanıtlanabilir", "page-dapps-collectibles-benefits-2-description": "Müzik dinlemek veya sanat eseri satın almak için ödeme yapmak sanatçılar için çok daha adil. Ethereum ile aracılara daha az ihtiyaç var. Aracılara ihtiyaç duyulursa, maliyetleri o kadar yüksek olmaz çünkü platformların ağ altyapısı için ödeme yapması gerekmez.", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "Bunlar, dijital sahipliğe odaklanan, içerik oluşturucular için kazanç potansiyelini artıran ve en sevdiğiniz içerik oluşturuculara ve onların çalışmalarına yatırım yapmak için yeni yollar icat eden uygulamalardır.", "page-dapps-collectibles-title": "Merkezi olmayan sanatlar ve koleksiyonlar", "page-dapps-compound-logo-alt": "Compound logosu", + "page-dapps-convex-logo-alt": "Convex logosu", "page-dapps-cryptopunks-logo-alt": "CryptoPunks logosu", "page-dapps-cryptovoxels-logo-alt": "Cryptovoxels logosu", + "page-dapps-cyberconnect-logo-alt": "CyberConnect logosu", "page-dapps-dapp-description-1inch": "En iyi fiyatları toplayarak yüksek fiyat düşüşlerinden kaçınmanıza yardımcı olur.", "page-dapps-dapp-description-aave": "Faiz kazanmak ve istediğiniz zaman para çekmek için token'larınızı ödünç verin.", + "page-dapps-dapp-description-ankr": "Farklı Web3 altyapı ürünleri seti, inşa etme, kazanma, oyun oynama ve daha fazlası için - hepsi blok zincir üzerinde.", + "page-dapps-dapp-description-api3": "10 ağa (ve sayılmaya devam eden) bağlı dApp'lerin gerçek zamanlı varlık fiyat verilerine bağlanmasına izin veren birinci taraf fiyat referans veri beslemeleri; kripto ve döviz fiyatları da dahil olmak üzere.", + "page-dapps-dapp-description-arweave": "Veriyi kalıcı ve sürdürülebilir bir şekilde depolayın, tek önceden ödenmiş ücretle.", "page-dapps-dapp-description-async-art": "#ProgrammableArt - genel görüntüyü etkilemek için kullanabileceğiniz \"Katmanlara\" bölünmüş dijital resimler oluşturun, toplayın ve ticaretini yapın. Her Ana ve Katman bir ERC721 belirtecidir.", "page-dapps-dapp-description-audius": "Merkezi olmayan akış platformu = yaratıcılar için para, etiketler için değil.", "page-dapps-dapp-description-augur": "Spor, ekonomi ve diğer dünya olaylarının sonuçlarına bahse girin.", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "Göz atmak için token kazanın ve en sevdiğiniz içerik oluşturucularını onlarla destekleyin.", "page-dapps-dapp-description-cent": "NFT üreterek para kazanabileceğin bir sosyal ağdır.", "page-dapps-dapp-description-compound": "Faiz kazanmak ve istediğiniz zaman para çekmek için token'larınızı ödünç verin.", + "page-dapps-dapp-description-convex": "Convex, Curve likidite sağlayıcılarına CRV'lerini kilitlemeden işlem ücretleri kazanma ve arttırılmış CRV talep etmelerine olanak tanır.", "page-dapps-dapp-description-cryptopunks": "Ethereum'daki ilk token koleksiyon parçalarından biri olan punkları satın alın, teklif verin ve satışa sunun.", "page-dapps-dapp-description-cryptovoxels": "Sanat galerileri oluşturun, mağazalar inşa edin ve arazi satın alın - bir Ethereum sanal dünyası.", + "page-dapps-dapp-description-cyberconnect": "DApps'e ağ etkilerini başlatmaları ve kişiselleştirilmiş sosyal deneyimler oluşturmalarına yardımcı olan merkezi olmayan sosyal grafik protokolü", "page-dapps-dapp-description-dark-forest": "Sonsuz, prosedürel olarak oluşturulmuş, kriptografik olarak belirlenmiş bir evrende gezegenleri fethedin.", "page-dapps-dapp-description-decentraland": "Keşfedebileceğiniz sanal bir dünyada sanal arazi toplayın, ticaretini yapın.", "page-dapps-dapp-description-ens": "Ethereum adresleri için kullanıcı dostu isimler ve merkezi olmayan siteler.", "page-dapps-dapp-description-foundation": "Dijital sanat eserlerinin benzersiz baskılarına yatırım yapın ve diğer alıcılarla ticaret yapın.", "page-dapps-dapp-description-gitcoin": "Açık kaynaklı yazılım üzerinde çalışarak kripto kazanın.", "page-dapps-dapp-description-gitcoin-grants": "Güçlendirilmiş katkılarla Ethereum topluluk projeleri için kitle fonlaması", + "page-dapps-dapp-description-gm": "Chat, forum ve ses için, kazançları üreticileriyle paylaşan hepsi bir arada platform", "page-dapps-dapp-description-gods-unchained": "Stratejik ticaret kart oyunu. Gerçek hayatta satabileceğiniz kartları oynayarak kazanın.", "page-dapps-dapp-description-golem": "Paylaşılan bilgi işlem gücüne erişin veya kendi kaynaklarınızı kiralayın.", + "page-dapps-dapp-description-graph": "Ethereum ve IPFS gibi ağları sorgulamak için bir dizinleme protokolü.", + "page-dapps-dapp-description-ipfs": "İnterneti yükseltilebilir, dayanıklı ve daha açık hale getirerek insanlığın bilgisini korumayı ve büyütmeyi amaçlayan eşten eşe bir hipermedya protokolü.", "page-dapps-dapp-description-radicle": "Aracılar olmadan eşler arası kod işbirliğini güvence altına alın.", + "page-dapps-dapp-description-kyberswap": "En iyi oranlarda takas yapın ve kazanın.", + "page-dapps-dapp-description-lido": "Dijital varlıklar için basitleştirilmiş ve güvenli hisseleme.", "page-dapps-dapp-description-loopring": "Eşler arası ticaret platformu hız için inşa edilmiştir.", "page-dapps-dapp-description-marble-cards": "URL' lere dayalı benzersiz dijital kartlar oluşturun ve ticaret yapın.", "page-dapps-dapp-description-matcha": "Size en iyi fiyatları bulmanıza yardımcı olacak şekilde birden fazla borsada arama yapın.", + "page-dapps-dapp-description-mirror": "Web3 için Web3 üzerine inşa edilmiş, Mirror'ın güçlü yayıncılık platformu, çevrimiçi yazmanın sınırlarını zorluyor", + "page-dapps-dapp-description-multichain": "Web3 için bir nihai yönlendirici. Rastgele cross-chain etkileşimleri için geliştirilmiş bir altyapıdır.", "page-dapps-dapp-description-nifty-gateway": "Zincirdeki sanatçılar, sporcular, markalar, ve yaratıcıların eserleri satın alın.", "page-dapps-dapp-description-oasis": "Bir Ethereum sabit coin olan Dai ile ticaret yapın, ödünç alın ve tasarruf edin.", "page-dapps-dapp-description-opensea": "Sınırlı sayıda mal satın alın, satın, keşfedin ve ticaret yapın.", "page-dapps-dapp-description-opera": "Tarayıcınızdan satıcılara, diğer kullanıcılara ve uygulamalara kripto gönderin.", + "page-dapps-dapp-description-osuvox": "Blok zincir üzerinde yaşayan 3B avatarlar", "page-dapps-dapp-description-poap": "Farklı sanal veya yüz yüze etkinliklerde olduğunuzu kanıtlayan NFT'leri toplayın. Bunları çekilişlere katılmak, oy vermek, işbirliği yapmak veya sadece övünmek için kullanın.", "page-dapps-dapp-description-polymarket": "Sonuçlara bahse girin. Bilgi piyasalarında ticaret yapın.", "page-dapps-dapp-description-pooltogether": "Kaybedemeyeceğiniz bir piyango. Her hafta ödüller.", @@ -82,13 +113,19 @@ "page-dapps-dapp-description-rotki": "Gizliliğinize saygı duyan açık kaynaklı portföy takibi, analiz, muhasebe ve vergi raporlama aracı.", "page-dapps-dapp-description-krystal": "Tüm favori DeFi servislerinize erişim sağlayan tek bir platform.", "page-dapps-dapp-description-rarible": "Token'li koleksiyonlar oluşturun, satın ve satın alın.", + "page-dapps-dapp-description-rubic": "Kullanıcılar ve dApp'ler için Cross-Chain teknoloji toplayıcısı.", "page-dapps-dapp-description-sablier": "Gerçek zamanlı olarak para akışı.", + "page-dapps-dapp-description-skiff": "Sonsuz şifreli e-posta, takvim, belgeler ve dosyalar; size özgürce iletişim kurma gücü verir.", + "page-dapps-dapp-description-spatial": "Kendi özel avatarınızı ve 3B dünyalarınızı oluşturun", + "page-dapps-dapp-description-spruce": "Kimlik ve veri kontrolünü olması gereken yerde bırakmak için açık kaynaklı bir yapı, kullanıcılarla...", + "page-dapps-dapp-description-status": "Bilgi akışını serbest bırakma, özel, güvenli konuşma hakkını koruma ve bireylerin egemenliğini destekleme amacıyla tasarlandı.", "page-dapps-dapp-description-superrare": "Dijital sanat eserlerini doğrudan sanatçılardan veya ikincil pazarlardan satın alın.", + "page-dapps-dapp-description-synthetix": "Synthetix, sentetik varlıkların ihraç ve ticaretini sağlayan bir protokoldür", "page-dapps-dapp-description-token-sets": "Otomatik olarak yeniden dengeleyen kripto yatırım stratejileri.", "page-dapps-dapp-description-tornado-cash": "Ethereum'da anonim işlemler gönderin.", "page-dapps-dapp-description-uniswap": "Token'leri basitçe değiştirin veya % ödüller için token'ler sağlayın.", - "page-dapps-dapp-description-dexguru": "DeFi tüccarları için gözetimsiz ticaret terminali", - "page-dapps-dapp-description-synthetix": "Synthetix, sentetik varlıkların ihraç ve ticaretini sağlayan bir protokoldür", + "page-dapps-dapp-description-xmtp": "DM'ler, uyarılar, duyurular ve daha fazlası dahil olmak üzere blokzincir hesapları arasında mesaj gönderin.", + "page-dapps-dapp-description-yearn": "Yearn Finans bir getirici toplayıcıdır. Bireylere, DAO'lara ve diğer protokollere dijital varlıkları yatırmak ve getiri almak için bir yol verir.", "page-dapps-docklink-dapps": "Dapps'a giriş", "page-dapps-docklink-smart-contracts": "Akıllı sözleşmeler", "page-dapps-dark-forest-logo-alt": "Dark Forest logosu", @@ -104,9 +141,7 @@ "page-dapps-desc": "Denemek için bir Ethereum uygulaması bulun.", "page-dapps-doge-img-alt": "Bilgisayar kullanan bir köpek görseli", "page-dapps-editors-choice-dark-forest": "Gezegenleri fethetmek ve en son Ethereum ölçekleme/gizlilik teknolojisini denemek için başkalarına karşı oynayın. Ethereum' a zaten aşına olanlar için örneklerden bir tanesi.", - "page-dapps-editors-choice-description": "Ethereum.org ekibinin şu anda sevdiği birkaç merkezi olmayan uygulama (dapp). Aşağıdan daha fazla uygulama keşfedin.", "page-dapps-editors-choice-foundation": "Kültüre yatırım yapın. İnanılmaz sanatçı, müzisyen ve markadan benzersiz dijital sanat eserleri ve moda ürünleri satın alın, ticaret yapın ve satın.", - "page-dapps-editors-choice-header": "Editörlerin seçimi", "page-dapps-editors-choice-pooltogether": "Kaybetmediğiniz piyango için bir bilet satın alın. Her hafta, tüm bilet havuzundan elde edilen faiz şanslı bir kazanana gönderilir. İstediğiniz zaman paranızı geri alın.", "page-dapps-editors-choice-uniswap": "Tokenlerinizi kolaylıkla değiştirin. Ağ genelinde insanlarla token ticareti yapmanızı sağlayan bir topluluk favorisi.", "page-dapps-ens-logo-alt": "Ethereum Name Service logosu", @@ -156,8 +191,10 @@ "page-dapps-get-started-title": "Başlayın", "page-dapps-gitcoin-grants-logo-alt": "Gitcoin Grants logosu", "page-dapps-gitcoin-logo-alt": "Gitcoin logosu", + "page-dapps-gm-logo-alt": "gm.xyz logosu", "page-dapps-gods-unchained-logo-alt": "Gods Unchained logosu", "page-dapps-golem-logo-alt": "Golem logosu", + "page-dapps-graph-logo-alt": "Şema logosu", "page-dapps-radicle-logo-alt": "Radicle Logosu", "page-dapps-hero-header": "Ethereum destekli araçlar ve hizmetler", "page-dapps-hero-subtitle": "Merkezi olmayan uygulamalar (dapps), iş modellerini bozmak veya yenilerini icat etmek için Ethereum kullanarak gelişen bir uygulama hareketidir.", @@ -165,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "Akıllı bir sözleşme, herkesin görmesi ve tam olarak bu kurallara göre çalışması için zincir üzerinde yaşayan bir dizi kural gibidir. Bir otomat düşünün: yeterli para ve doğru seçim ile tedarik ederseniz, istediğiniz öğeyi alırsınız. Otomatlar gibi, akıllı sözleşmeler de Ethereum hesabınız gibi para tutabilir. Bu, kodun anlaşmalara ve işlemlere aracılık etmesine izin verir.", "page-dapps-how-dapps-work-p3": "Merkezi olmayan uygulamalar Ethereum ağına dağıtıldıktan sonra bunları değiştiremezsiniz. Uygulamalar merkezi olmayan olabilir çünkü bir birey veya şirket değil, sözleşmeye yazılan mantık tarafından kontrol edilirler.", "page-dapps-how-dapps-work-title": "Merkezi olmayan uygulamalar nasıl çalışır", + "page-dapps-ipfs-logo-alt": "IPFS logosu", + "page-dapps-kyberswap-logo-alt": "KyberSwap logosu", "page-dapps-learn-callout-button": "Geliştirmeye başla", "page-dapps-learn-callout-description": "Topluluk geliştirici portalı, mümkün olan en kısa sürede merkezi olmayan uygulama oluşturmaya başlamanıza yardımcı olacak belgelere, araçlara ve çerçevelere sahiptir.", "page-dapps-learn-callout-image-alt": "Lego tuğlalarından ETH sembolü inşa eden bir elin görseli.", "page-dapps-learn-callout-title": "Bir merkezi olmayan uygulama (dapp) inşa etmeyi öğrenin", + "page-dapps-lido-logo-alt": "Lido logosu", "page-dapps-loopring-logo-alt": "Loopring logosu", "page-dapps-magic-behind-dapps-description": "Merkezi olmayan uygulamalar normal uygulamalar gibi hissettirebilir. Ancak sahnelerin arkasında bazı özel nitelikler var çünkü Ethereum' un tüm süper güçlerini miras alırlar. Merkezi olmayan uygulamaları, uygulamalardan farklı kılan şey budur.", "page-dapps-magic-behind-dapps-link": "Ethereum' u harika yapan nedir?", @@ -179,11 +219,23 @@ "page-dapps-marble-cards-logo-alt": "marble.cards logosu", "page-dapps-async-logo-alt": "Asenkron logosu", "page-dapps-matcha-logo-alt": "Matcha logosu", + "page-dapps-metaverse-benefits-title": "metaverse", + "page-dapps-metaverse-benefits-description": "Ethereum'un metaverse'in gelişmesine olanak tanıyan özellikleri nelerdir?", + "page-dapps-metaverse-benefits-1-title": "NFT'ler", + "page-dapps-metaverse-benefits-1-description": "Kullanıcıların sahip olduğu ve aynı standartları destekleyen sanal dünyalar ve pazar yerlerinde etkileşimli olan benzersiz oyun içi öğeler.", + "page-dapps-metaverse-benefits-2-title": "Kullanıcı sahipli topluluklar", + "page-dapps-metaverse-benefits-2-description": "Kimlikler, kullanıcılar tarafından sahiplenilir, birden fazla sanal dünya üzerinde sosyal ağlar oluşturmak ve keşfetmek için sonsuz fırsatlar sunar.", + "page-dapps-metaverse-button": "Metaverse", + "page-dapps-metaverse-title": "Metaverse", + "page-dapps-metaverse-description": "Bunlar, kullanıcıların sanal dünyalara özgürce katılım sağlamasına olanak tanıyan uygulamalardır. Kullanıcılar kişisel ağlar oluşturabilir ve dijital varlıkların sahipliğini alabilir", + "page-dapps-mirror-logo-alt": "Mirror logosu", "page-dapps-mobile-options-header": "Başka bir kategoriye göz atın", + "page-dapps-multichain-logo-alt": "Çoklu Zincir logosu", "page-dapps-nifty-gateway-logo-alt": "Nifty Gateway logosu", "page-dapps-oasis-logo-alt": "Oasis logosu", "page-dapps-opensea-logo-alt": "Oasis logosu", "page-dapps-opera-logo-alt": "Opera logosu", + "page-dapps-osuvox-logo-alt": "OSUVOX logosu", "page-dapps-polymarket-logo-alt": "Polymarket logosu", "page-dapps-poap-logo-alt": "Katılım İspatı Protokolü logosu", "page-dapps-pooltogether-logo-alt": "PoolTogether logosu", @@ -191,10 +243,18 @@ "page-dapps-ready-button": "Başla", "page-dapps-ready-description": "Denemek için merkezi olmayan bir uygulama seçin", "page-dapps-ready-title": "Hazır mısın?", + "page-dapps-rubic-logo-alt": "Rubic logosu", "page-dapps-sablier-logo-alt": "Sablier logosu", "page-dapps-set-up-a-wallet-button": "Cüzdan bul", "page-dapps-set-up-a-wallet-description": "Bir cüzdan bir merkezi olmayan uygulama için \"girişiniz\" demektir", "page-dapps-set-up-a-wallet-title": "Bir cüzdan oluşturun", + "page-dapps-skiff-logo-alt": "Skiff logosu", + "page-dapps-social-button": "Sosyal", + "page-dapps-social-description": "Bunlar, kullanıcıların dijital kimliklerin ve sosyal şemaların sahibi olduğu, merkezi olmayan kimlik teknolojilerini kullanan, merkezi olmayan sosyal ağlar oluşturmaya odaklanan uygulamalardır.", + "page-dapps-social-title": "Sosyal", + "page-dapps-spatial-logo-alt": "Spatial logosu", + "page-dapps-spruce-logo-alt": "Spruce logosu", + "page-dapps-status-logo-alt": "Status logosu", "page-dapps-superrare-logo-alt": "SuperRare logosu", "page-dapps-technology-button": "Teknoloji", "page-dapps-technology-description": "Bunlar, geliştirici araçlarını Ademi merkezileştirmeye, kripto-ekonomik sistemleri mevcut teknolojiye dahil etmeye ve açık kaynak geliştirme çalışmaları için pazarlar oluşturmaya odaklanan uygulamalardır.", @@ -214,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "Tokenize edilmiş oyun içi öğeler hakkında daha fazla bilgi", "page-dapps-dapp-description-pwn": "Ethereum'da herhangi bir jeton veya NFT ile desteklenen kolay krediler.", "page-dapps-pwn-image-alt": "PWN logosu", - "page-dapps-dapp-description-yearn": "Yearn Finans bir getirici toplayıcıdır. Bireylere, DAO'lara ve diğer protokollere dijital varlıkları yatırmak ve getiri almak için bir yol verir.", + "page-dapps-xmtp-logo-alt": "XMTP logosu", + "opage-dapps-yearn-logo-alt": "Yearn logosu", "page-dapps-yearn-image-alt": "Yearn logosu", - "page-dapps-dapp-description-convex": "Convex, Curve likidite sağlayıcılarına CRV'lerini kilitlemeden işlem ücretleri kazanma ve arttırılmış CRV talep etmelerine olanak tanır.", "page-dapps-convex-image-alt": "Convex logosu", "foundation": "Kurum", "transaction-fees": "İşlem ücretleri nedir?", - "page-wallets-get-some": "Bir miktar ETH edin" + "page-wallets-get-some": "Bir miktar ETH edin", + "page-dapps-dapp-description-curve": "Curve, stabilcoinlere odaklanmış bir DEX'tir", + "page-dapps-curve-image-alt": "Curve logosu", + "page-dapps-dapp-description-dodo": "DODO, Proaktif Piyasa Yapıcı algoritmasını (PMM) kullanarak on-chain likidite sağlayıcısıdır", + "page-dapps-dodo-image-alt": "DODO logosu", + "page-dapps-dapp-description-artblocks": "Art Blocks, çarpıcı çağdaş üretken sanat eserlerini hayata geçirmeye adanmıştır", + "page-dapps-artblocks-image-alt": "Art Blocks logosu" } diff --git a/src/intl/tr/page-index.json b/src/intl/tr/page-index.json index ab703baf48c..9efe58a06fe 100644 --- a/src/intl/tr/page-index.json +++ b/src/intl/tr/page-index.json @@ -14,8 +14,8 @@ "page-index-get-started-eth-title": "ETH edinin", "page-index-get-started-eth-description": "ETH, Ethereum'un para birimidir, bunu uygulamalarda kullanabilirsiniz.", "page-index-get-started-eth-image-alt": "Büyülenmiş biçimde bir ether (ETH) glifine hayranlık duyan bir grup insan görseli.", - "page-index-get-started-dapps-title": "Bir merkeziyetsiz uygulama (dapp) kullanın", - "page-index-get-started-dapps-description": "Dapp'ler (Merkezi olmayan uygulamalar) Ethereum tarafından işletilen uygulamalardır. Neler yapabileceğinize bir göz atın.", + "page-index-get-started-dapps-title": "Bir dapp kullanın", + "page-index-get-started-dapps-description": "Merkeziyetsiz uygulamalar Ethereum tarafından işletilen uygulamalardır. Neler yapabileceğinize bir göz atın.", "page-index-get-started-dapps-image-alt": "Bilgisayar kullanan bir köpek görseli.", "page-index-get-started-devs-title": "Geliştirmeye başlayın", "page-index-get-started-devs-description": "Ethereum ile kodlamaya başlamak istiyorsanız geliştirici portalımızdan belgelere, öğretici rehberlere ve daha fazlasına erişebilirsiniz.", diff --git a/src/intl/tr/page-stablecoins.json b/src/intl/tr/page-stablecoins.json index 99fc498dd44..12605061a4c 100644 --- a/src/intl/tr/page-stablecoins.json +++ b/src/intl/tr/page-stablecoins.json @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "Resmi Para", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "Değerli madenler", "page-stablecoins-table-error": "Sabit paralar yüklenemedi. Sayfayı yenilemeyi deneyin.", + "page-stablecoins-table-loading": "Sabit para verileri yükleniyor...", "page-stablecoins-title": "Sabit paralar", "page-stablecoins-top-coins": "Piyasa değerine göre en iyi sabit paralar", "page-stablecoins-top-coins-intro": "Piyasa değeri", diff --git a/src/intl/tr/page-upgrades-get-involved.json b/src/intl/tr/page-upgrades-get-involved.json index d3911d34042..dfdc8fd1ed6 100644 --- a/src/intl/tr/page-upgrades-get-involved.json +++ b/src/intl/tr/page-upgrades-get-involved.json @@ -4,8 +4,8 @@ "page-upgrades-get-involved-btn-3": "Hataları bulun", "page-upgrades-get-involved-bug": "Hatalar şunlardan biri olabilir:", "page-upgrades-get-involved-bug-hunting": "Hata avına çıkın", - "page-upgrades-get-involved-bug-hunting-desc": "Fikir birliği katmanı yükseltme şartnamesindeki veya istemcilerin kendilerindeki hataları bulun ve bildirin. 50.000 ABD Dolarına kadar para kazanabilir ve lider tablosunda bir yer edinebilirsiniz.", - "page-upgrades-get-involved-bug-li": "şartname uyumsuzluk sorunları", + "page-upgrades-get-involved-bug-hunting-desc": "Fikir birliği katmanı yükseltme özelliklerindeki veya istemcilerin kendilerindeki hataları bulun ve bildirin. 50.000 ABD Dolarına kadar para kazanabilir ve lider tablosunda bir yer edinebilirsiniz.", + "page-upgrades-get-involved-bug-li": "özelliklerle uyumsuzluk sorunları", "page-upgrades-get-involved-bug-li-2": "kesinliği bozan hatalar", "page-upgrades-get-involved-bug-li-3": "hizmet reddi (DOS) vektörleri", "page-upgrades-get-involved-bug-li-4": "ve daha fazlası...", diff --git a/src/intl/tr/page-upgrades-index.json b/src/intl/tr/page-upgrades-index.json index 9b3ae4ec7e9..cbbdb5b6841 100644 --- a/src/intl/tr/page-upgrades-index.json +++ b/src/intl/tr/page-upgrades-index.json @@ -17,8 +17,8 @@ "page-upgrade-article-author-consensys": "ConsenSys", "page-upgrade-article-author-delphi-digital": "Delphi Digital", "page-upgrade-article-author-eip-4844": "Vitalik Buterin, Dankrad Feist, Diederik Loerakker, George Kadianakis, Matt Garnett, Mofi Taiwo", - "page-upgrade-article-author-ethereum-foundation": "Ethereum Vakfı", - "page-upgrade-article-author-vitalik-buterin": "वितालिक बुटेरिन", + "page-upgrade-article-author-ethereum-foundation": "Ethereum'un Geleceği", + "page-upgrade-article-author-vitalik-buterin": "Vitalik Buterin", "page-upgrade-article-author-ethos-dev": "Ethos.dev", "page-upgrade-article-title-two-point-oh": "Yeni Versiyon: İşaret Zinciri", "page-upgrade-article-title-beacon-chain-explainer": "Önce okumanız gereken İşaret Zinciri Ethereum 2.0 açıklayıcısı", @@ -29,13 +29,13 @@ "page-upgrade-article-title-eip-4844": "EIP-4844: Shard Blob İşlemleri (Proto-Danksharding)", "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding SSS", "page-upgrade-article-title-sharding-das": "Parçalama ve veri kullanılabilirliğini örnekleme (DAS) açıklaması", - "page-upgrade-article-title-ethmerge": "دمج الإثيريوم", + "page-upgrade-article-title-ethmerge": "Ethmerge ", "page-upgrade-article-title-merge-is-coming": "Birleşim Yaklaşıyor", "page-upgrade-article-title-state-of-the-merge": "Birleşimin Durumu: Ethereum'un 2022 Hisse İspatı Birleşimi Hakkında Bir Güncelleme", "page-upgrade-article-title-ropsten-merge-testnet": "Ropsten Birleşim Test Ağı Duyurusu", - "page-upgrade-article-title-execution-layer-specs": "Yürütüm katmanı tanımlamaları", - "page-upgrade-article-title-consensus-layer-specs": "Fikir birliği katmanı tanımlamaları", - "page-upgrade-article-title-engine-api-specs": "Makine uygulama programlama arayüzü tanımlamaları", + "page-upgrade-article-title-execution-layer-specs": "Yürütüm katmanı özellikleri", + "page-upgrade-article-title-consensus-layer-specs": "Fikir birliği katmanı özellikleri", + "page-upgrade-article-title-engine-api-specs": "Makine uygulama programlama arayüzü özellikleri", "page-upgrades-beacon-chain-date": "İşaret Zinciri 1 Aralık 2020'de hayata geçirildi", "page-upgrades-beacon-chain-desc": "İşaret Zinciri, Ethereum'a hisselemeyi getirdi, gelecekteki yükseltmeler için zemin hazırladı ve yakında yeni Hisse ispatlı Ethereum'u koordine edecek.", "page-upgrades-beacon-chain-estimate": "İşaret Zinciri yayınlandı", @@ -45,9 +45,9 @@ "page-staking-deposit-contract-title": "Para yatırma sözleşmesi adresini kontrol edin", "page-upgrades-dive": "Vizyona dalın", "page-upgrades-dive-desc": "Ethereum'u nasıl daha ölçülebilir, güvenli ve sürdürülebilir yapabiliriz? Hem de Ethereum'un temel değeri olan merkeziyetsizleştirmeyi koruyarak.", - "page-upgrades-docking": "Birleşim", + "page-upgrades-docking": "Birleştirme", "page-upgrades-merge-answer-1": "Birleşim, Ethereum 15 Elül 2022 tarihinde hisse ispatı mutabakatına geçiş yaptığında gerçekleşti. İşaret Zinciri, Ethereum'da iş ispatını resmi olarak onaylayarak Ana Ağ ile birleşti ve Ethereum'un enerji tüketimini yaklaşık %99,95'e kadar azalttı.", - "page-upgrades-merge-btn": "Birleştirme hakkında daha fazla bilgi", + "page-upgrades-merge-btn": "Birleştirme hakkında ek bilgi", "page-upgrades-merge-desc": "Ana Ağ Ethereum, yoğun enerji tüketen madenciliğin sonunu getirerek hisse ispatlı İşaret Zinciri ile birleşti.", "page-upgrades-merge-estimate": "Birleşim hayata geçirildi", "page-upgrades-merge-mainnet": "Mainnet nedir?", @@ -179,7 +179,7 @@ "page-upgrades-what-happened-to-eth2-1-more": "Birleştirme hakkında daha fazla bilgi.", "page-upgrades-what-happened-to-eth2-2": "\"Eth1\" ile \"Eth2\"nin birleşiminden bu yana artık iki farklı Ethereum blok zinciri yok, yalnızca bir Ethereum var.", "page-upgrades-what-happened-to-eth2-3": "Karışıklığı önlemek için topluluk şu şartları güncelledi:", - "page-upgrades-what-happened-to-eth2-3-1": "\"Eth1\" artık, işlemleri ve yürütümü işleyen \"yürütüm katmanı\"dır.", + "page-upgrades-what-happened-to-eth2-3-1": "\"Eth1\" artık, işlemleri ve çalışmayı yapan \"çalıştırma katmanı\"dır.", "page-upgrades-what-happened-to-eth2-3-2": "\"Eth2\" artık, hisse ispatı mutabakatını yöneten \"mutabakat katmanı\"dır.", "page-upgrades-what-happened-to-eth2-4": "Bu terminoloji güncellemeleri yalnızca adlandırma alışkanlıklarını değiştirir; bu, Ethereum'un hedeflerini veya yol haritasını değiştirmez.", "page-upgrades-what-happened-to-eth2-5": "\"Eth2\" ad değişimi hakkında daha fazla bilgi edinin", @@ -193,7 +193,7 @@ "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "Hisseleme netliği", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "Bazı stake etme operatörleri, İşaret Zinciri üzerinde stake edilen ETH'yi \"ETH2\" göstergesi ile temsil etti. Hizmeti kullananlar aslında bir \"ETH2\" tokeni almadığı için bu potansiyel bir karışıklık yaratabiliyor. \"ETH2\" diye bir token yok; bu sadece kullanıcıların, belirli sağlayıcıların stake ettikleri miktardaki paylarını temsil eder.", "page-upgrades-what-to-do": "Ne yapmanız gerekiyor?", - "page-upgrades-what-to-do-desc": "Bir merkeziyetsiz uygulama kullanıcısı veya ETH sahibiyseniz, hiçbir şey yapmanıza gerek yoktur. Bir geliştiriciyseniz veya stake etmeye başlamak istiyorsanız, bugünden dahil olmanın yolları var.", + "page-upgrades-what-to-do-desc": "Bir dapp kullanıcısı veya ETH sahibiyseniz, hiçbir şey yapmanıza gerek yoktur. Bir geliştiriciyseniz veya stake etmeye başlamak istiyorsanız, bugün dahil olmanın yolları var.", "page-upgrades-whats-next": "Ethereum yükseltmeleri nelerdir?", "page-upgrades-whats-next-desc": "Ethereum yol haritası, ağı daha ölçeklenebilir, daha güvenli ve daha sürdürülebilir hâle getirecek birbirine bağlı protokol yükseltmelerini içerir. Bu yükseltmeler, Ethereum ekosistemindeki birden fazla ekip tarafından inşa ediliyor.", "page-upgrades-whats-next-history": "Önceki Ethereum yükseltmeleri hakkında bilgi edinin", diff --git a/src/intl/tr/page-upgrades.json b/src/intl/tr/page-upgrades.json index e3431c42cc4..4514255c32d 100644 --- a/src/intl/tr/page-upgrades.json +++ b/src/intl/tr/page-upgrades.json @@ -20,5 +20,5 @@ "consensus-explore": "Verileri keşfedin", "consensus-run-beacon-chain": "Bir fikir birliği istemcisi çalıştırın", "consensus-run-beacon-chain-desc": "Ethereum için olabildiğince fazla çalışan istemci gerekiyor. Ethereum'a kamu yararı için yardım edin!", - "read-more": "Daha fazla okuyun" + "read-more": "Daha fazla bilgi edinin" } diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index 3d41ba45823..74adfb3fba1 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "帳戶抽象", "about-ethereum-org": "關於 ethereum.org", "about-us": "關於我們", + "adding-desci-projects": "新增去中心化科學專案", + "adding-developer-tools": "新增開發者工具", + "adding-exchanges": "新增交易所", + "adding-glossary-terms": "新增詞彙表術語", + "adding-layer-2s": "添加第 2 層", + "adding-products": "新增產品", + "adding-staking-products": "新增質押產品", + "adding-wallets": "新增錢包", + "account-abstraction": "帳戶抽象", + "acknowledgements": "致謝", "aria-toggle-search-button": "切換搜尋按鈕", "aria-toggle-menu-button": "切換選單按鈕", "beacon-chain": "信標鏈", @@ -12,6 +21,8 @@ "community-hub": "社群中心", "community-menu": "社群選單", "contact": "聯絡方式", + "content-buckets": "內容門類", + "content-resources": "內容資源", "content-standardization": "內容統一化", "contributing": "參與貢獻", "contributors": "貢獻者", @@ -28,6 +39,8 @@ "decentralized-social-networks": "去中心化社群網路", "decentralized-science": "去中心化科研 (DeSci)", "defi-page": "去中心化金融 (DeFi)", + "design": "設計", + "design-principles": "設計理念", "devcon": "Devcon", "developers": "開發者", "developers-home": "開發者首頁", @@ -42,24 +55,24 @@ "docsearch-start-remove-recent-search": "從歷史紀錄中移除此搜尋", "docsearch-start-favorite-searches": "收藏", "docsearch-start-remove-favorite-search": "從收藏中移除此搜尋", - "docsearch-no-results-text": "沒有關於此項目的搜尋結果:", + "docsearch-no-results-text": "沒有關於此專案的搜尋結果:", "docsearch-no-results-suggested-query": "嘗試搜尋", "docsearch-no-results-missing": "認為此查詢該傳回結果?", "docsearch-no-results-missing-link": "請與我們聯係。", "docsearch-error-title": "無法擷取結果", - "docsearch-error-help": "你或許需要檢查網絡連接。", + "docsearch-error-help": "你或許需要檢查網路連接。", "documentation": "文件", "down": "下移", "ecosystem": "生態系統", "edit-page": "編輯頁面", "ef-blog": "以太坊基金會部落格", "eips": "以太坊改進提案", - "energy-consumption": "以太坊能源消耗", + "energy-consumption": "以太坊能耗", "enterprise": "企業", "enterprise-menu": "企業版選單", "esp": "生態系統支援計畫", "eth-current-price": "以太幣 (ETH) 現值 (美金)", - "ethereum-basics": "Ethereum 基礎概念", + "ethereum-basics": "以太坊基礎概念", "ethereum-bug-bounty": "以太坊漏洞懸賞計畫", "consensus-when-shipping": "何時生效?", "ethereum-upgrades": "以太坊升級", @@ -94,11 +107,11 @@ "grants": "獎助金", "grant-programs": "生態系統獎助金計畫", "guides": "指南", - "guides-hub": "指南中心", + "guides-hub": "操作指南", "history-of-ethereum": "以太坊的歷史", "home": "首頁", "how-ethereum-works": "以太坊如何運作", - "how-to-register-an-ethereum-account": "如何「註冊」以太坊帳戶", + "how-to-create-an-ethereum-account": "如何「建立」以太坊帳戶", "how-to-revoke-token-access": "如何撤銷智慧型合約對你的加密資金的訪問權限", "how-to-swap-tokens": "如何兌換代幣", "how-to-use-a-bridge": "如何通過跨鏈橋將代幣轉移至二層網路", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "無法載入資料。請稍後再試。", "logo": "標誌", "mainnet-ethereum": "以太坊主網路", + "merge": "合併", "more": "更多", "nav-developers": "開發者", "nav-developers-docs": "開發者文件", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "隨意搜尋!", "search-eth-address": "這看起來像是以太坊地址。我們沒有提供與地址相關的資訊,請嘗試在區塊瀏覽器上搜尋,例如", "search-no-results": "沒有符合條件的搜尋結果", + "security": "安全性", "single-slot-finality": "單一時隙最終確定性", "statelessness": "無狀態", "see-contributors": "查看貢獻者", @@ -181,6 +196,7 @@ "start-here": "由此開始", "style-guide": "設計指南", "solo": "單獨質押", + "support": "支援", "terms-of-use": "使用條款", "translation-banner-body-new": "由於尚未翻譯,本頁面內容以英文顯示。協助我們翻譯內容。", "translation-banner-body-update": "本頁面內容已有新版本,但目前僅提供英文。協助我們翻譯最新內容。", @@ -191,13 +207,14 @@ "translation-banner-no-bugs-title": "這裡沒有漏洞!", "translation-banner-no-bugs-content": "此頁面未翻譯,目前特意維持英文原文。", "translation-banner-no-bugs-dont-show-again": "不再顯示", + "translation-program": "翻譯計畫", "try-using-search": "請嘗試使用搜尋功能來尋找你要的資訊,或", "tutorials": "教學", "up": "上移", "use-ethereum": "使用以太坊", "use-ethereum-menu": "使用以太坊選單", "user-experience": "用戶體驗", - "verkle-trees": "Verkle 樹狀結構", + "verkle-trees": "沃克爾樹", "wallets": "錢包", "we-couldnt-find-that-page": "找不到該頁面", "web3": "什麼是 Web3?", diff --git a/src/intl/zh-tw/page-community.json b/src/intl/zh-tw/page-community.json index 52b56b4d271..3ee56420880 100644 --- a/src/intl/zh-tw/page-community.json +++ b/src/intl/zh-tw/page-community.json @@ -1,6 +1,6 @@ { "page-community-card-1-title": "加入一個線上社群", - "page-community-card-1-description": "尋找你的部落,同其他以太坊愛好者一起加入社群。", + "page-community-card-1-description": "尋找你的部落,加入內有其他以太坊愛好者的社群。", "page-community-card-2-title": "以太坊活動", "page-community-card-2-description": "尋找並參與以太坊會議、駭客松或者聚會。", "page-community-card-3-title": "為專案做出貢獻", @@ -9,10 +9,10 @@ "page-community-card-4-description": "資助撥款可幫助你推行自己的專案。", "page-community-contribute": "為 ethereum.org 做出貢獻", "page-community-contribute-button": "關於貢獻的更多資訊", - "page-community-contribute-description": "對很多人來說,以太坊官網 (ethereum.org) 是他們踏入這個生態圈的第一步。它一直被數以千計的開源貢獻者們維持在最新並能呈現準確資訊的狀態。想要幫忙嗎?請閱讀我們在 GitHub 公佈的對做出貢獻或負責議題的指導。", + "page-community-contribute-description": "對很多人來說,以太坊官網 (ethereum.org) 是他們踏入這個生態圈的第一步。它一直被數以千計的開源貢獻者們維持在最新並能呈現準確資訊的狀態。想要幫忙嗎?請閱讀我們在 GitHub 公佈的如何做出貢獻或負責議題的指導。", "page-community-contribute-secondary-button": "在 GitHub 上檢視", "page-community-daos-callout-title": "去中心化自治組織 (DAO)", - "page-community-daos-callout-description": "這些組織利用以太坊的交易技術來加速組織間的架構組成和合作。例如,為了要控制會員制、提案投票或者管理質押池的資產。", + "page-community-daos-callout-description": "這些組織利用以太坊的交易技術來加速組織間的架構組成和合作。例如,控制會員制、提案投票或者管理質押池的資產。", "page-community-explore-dapps": "探索Dapps", "page-community-explore-dapps-alt": "探索Dapps", "page-community-explore-dapps-description": "去中心化應用程式是在以太坊上構建的應用程式。這些應用程式正在打破現有商業架構,創造新的商業模式。", @@ -21,17 +21,17 @@ "page-community-find-a-job": "尋找工作", "page-community-get-eth": "取得以太幣", "page-community-get-eth-alt": "取得些以太(ETH)", - "page-community-get-eth-description": "以太幣是以太坊的原生貨幣。你將需要在自己錢包放一些以太幣才可使用以太坊的應用程式。", + "page-community-get-eth-description": "以太幣是以太坊的原生貨幣。你將需要在自己錢包放一些以太幣才能使用以太坊的應用程式。", "page-community-get-eth-title": "取得些以太(ETH)", "page-community-get-involved-title": "我該如何參與?", - "page-community-get-involved-description": "有很多方法可以參與到正快速成長的以太坊社群;你能夠參加其中一個受歡迎的網上社群,出席活動,加入群組聚會,為專案作出貢獻,或者參加眾多以太坊在線論壇中的一個。", - "page-community-get-involved-image-alt": "參與貢獻", - "page-community-hero-alt": "以太坊社群樞紐", - "page-community-hero-header": "歡迎來到以太坊社群樞紐", + "page-community-get-involved-description": "很多途徑都能參與快速成長中的以太坊社群;你能夠參加其中一個受歡迎的網上社群、出席活動、加入群組聚會,為專案做出貢獻,或者參加眾多以太坊線上論壇中的一個。", + "page-community-get-involved-image-alt": "加入我們", + "page-community-hero-alt": "以太坊社群中心", + "page-community-hero-header": "歡迎來到以太坊社群中心", "page-community-hero-subtitle": "以太坊社群是成千上萬名開發者、技術人員、設計師、使用者、HODLers 以及愛好者的家園。\n*HODLers:出自一個有關比特幣交易的小插曲,最初由喝醉了的交易者 GameKyuubi 在論壇上提出,說明對虛擬幣交易的應有心態和一些自己的意見。", "page-community-hero-title": "加入社群", "page-community-meetuplist-no-meetups": "我們沒有在此搜尋中找到任何聚會,你是否知道其中一個?", - "page-community-meta-title": "社群樞紐", + "page-community-meta-title": "社群中心", "page-community-meta-description": "社群主頁說明", "page-community-open-source": "創始人?開發者?你們會因自己付出而獲得報酬。", "page-community-open-source-description": "你是否正在或者想要為以太坊的發展做出貢獻?企業正在招聘數以千計的技術和非技術人員。你想投的職位有名目了?試著尋找資助讓你的專案可以正式進行。", @@ -49,6 +49,6 @@ "page-community-why-get-involved-card-1-description": "每個人都可以加入社群。尋找並聯系與你有相同想法的人,一起討論、衡量和推崇以太坊。", "page-community-why-get-involved-card-2-title": "賺取收入", "page-community-why-get-involved-card-2-description": "所有人都有帳單要付。以太坊可幫助你找到一份有意義的工作,而且能夠從中悠餘地自力更生。", - "page-community-why-get-involved-card-3-title": "變得重要", - "page-community-why-get-involved-card-3-description": "參與到以太坊的平台會讓你成為一名在科技領域積極的持份者,給數百萬人帶來積極的影響。" + "page-community-why-get-involved-card-3-title": "做出改變吧", + "page-community-why-get-involved-card-3-description": "參與以太坊的平台會讓你成為一名科技領域的積極利益相關方,對數百萬人造成正向影響。" } diff --git a/src/intl/zh-tw/page-developers-docs.json b/src/intl/zh-tw/page-developers-docs.json index 2a8f8b4f0b5..ae7e9bfb464 100644 --- a/src/intl/zh-tw/page-developers-docs.json +++ b/src/intl/zh-tw/page-developers-docs.json @@ -40,7 +40,7 @@ "docs-nav-ethereum-client-apis-description": "簡便的程式庫,可讓你的 Web 應用程式與以太坊及智慧型合約互動", "docs-nav-ethereum-stack": "以太坊技術堆棧", "docs-nav-evm": "以太坊虛擬機 (EVM)", - "docs-nav-evm-description": "以太坊虛擬機處理以太坊網絡中的所有計算", + "docs-nav-evm-description": "以太坊虛擬機處理以太坊網路中的所有計算", "docs-nav-foundational-topics": "基礎主題", "docs-nav-gas": "Gas", "docs-nav-gas-description": "處理交易所需的算力,費用由交易發送者使用以太幣支付", @@ -105,11 +105,11 @@ "docs-nav-standards": "標準", "docs-nav-standards-description": "所有參與者一致同意的協議,用於保證專案的效率及社群可存取性", "docs-nav-storage": "存儲", - "docs-nav-storage-description": "去中心化存儲結構及機制", + "docs-nav-storage-description": "去中心化儲存結構及機制", "docs-nav-testing-smart-contracts": "測試智慧型合約", "docs-nav-token-standards": "權杖標準", "docs-nav-transactions": "交易紀錄", - "docs-nav-transactions-description": "導致以太坊網路狀態變化的轉賬及其他操作", + "docs-nav-transactions-description": "導致以太坊網路狀態變化的轉帳及其他操作", "docs-nav-upgrading-smart-contracts": "升級智慧型合約", "docs-nav-verifying-smart-contracts": "驗證智慧型合約", "docs-nav-web2-vs-web3": "Web2 vs Web3", @@ -123,7 +123,7 @@ "docs-nav-data-structures-and-encoding-rlp": "遞迴長度前綴 (RLP)", "docs-nav-data-structures-and-encoding-patricia-merkle-trie": "帕特里夏梅克爾樹", "docs-nav-data-structures-and-encoding-ssz": "簡易序列化 (SSZ)", - "docs-nav-data-structures-and-encoding-web3-secret-storage": "Web3 金鑰存儲的定義", + "docs-nav-data-structures-and-encoding-web3-secret-storage": "Web3 金鑰儲存的定義", "docs-nav-rewards-and-penalties": "權益證明下的獎勵及懲罰", "docs-nav-node-architecture": "節點架構", "docs-nav-archive-nodes": "歸檔節點", diff --git a/src/intl/zh/page-community.json b/src/intl/zh/page-community.json index e736fccd956..aabdde8c10b 100644 --- a/src/intl/zh/page-community.json +++ b/src/intl/zh/page-community.json @@ -1,12 +1,12 @@ { "page-community-card-1-title": "加入在线社区", - "page-community-card-1-description": "找到您的社群,并与其他以太坊爱好者一起加入社区。", + "page-community-card-1-description": "找到你的社群,并与其他以太坊爱好者一起加入社区。", "page-community-card-2-title": "以太坊活动", "page-community-card-2-description": "查找并参与以太坊会议、黑客马拉松或者线下聚会。", "page-community-card-3-title": "为项目出力", "page-community-card-3-description": "查阅如何根据自己的专业背景和技能制定一份为项目出力的方法列表。", "page-community-card-4-title": "寻找资助", - "page-community-card-4-description": "为了帮助您的项目启动,您可以申请资助。", + "page-community-card-4-description": "为了帮助你的项目启动,你可以申请资助。", "page-community-contribute": "为 ethereum.org 贡献力量", "page-community-contribute-button": "关于贡献力量的更多信息", "page-community-contribute-description": "对于许多人来说,ethereum.org 是他们进入生态系统的第一步。由数千名开源贡献者保持网站信息最新和准确。想要帮忙吗?请阅读我们的贡献指南,或在我们的 GitHub 上帮忙处理问题。", @@ -16,15 +16,15 @@ "page-community-explore-dapps": "探索去中心化应用程序", "page-community-explore-dapps-alt": "探索去中心化应用程序", "page-community-explore-dapps-description": "去中心化应用程序是在以太坊上构建的应用程序。这些应用程序正在打破传统,构建新的商业模式。", - "page-community-explore-dapps-title": "尝试使用一些去中心化应用", + "page-community-explore-dapps-title": "尝试使用一些去中心化应用程序", "page-community-explore-grants": "深入了解资助", "page-community-find-a-job": "查找工作", "page-community-get-eth": "获取以太币", "page-community-get-eth-alt": "获取一些以太币", - "page-community-get-eth-description": "以太币是以太坊的原生货币。要使用以太坊应用,您需要在钱包中预留一些以太币。", + "page-community-get-eth-description": "以太币是以太坊的原生货币。要使用以太坊应用,你需要在钱包中预留一些以太币。", "page-community-get-eth-title": "获取一些以太币", "page-community-get-involved-title": "如何加入?", - "page-community-get-involved-description": "有很多方法可以参与快速发展的以太坊社区:您可以加入一个热门在线社区、参加一个活动、加入一个聚会小组、为一个项目做贡献,或者参加一个关于以太坊的在线论坛。", + "page-community-get-involved-description": "有很多方法可以参与快速发展的以太坊社区:你可以加入一个热门在线社区、参加一个活动、加入一个聚会小组、为一个项目做贡献,或者参加一个关于以太坊的在线论坛。", "page-community-get-involved-image-alt": "参与其中", "page-community-hero-alt": "以太坊社区中心", "page-community-hero-header": "欢迎来到以太坊社区中心", @@ -33,22 +33,22 @@ "page-community-meetuplist-no-meetups": "没有符合搜索条件的聚会结果。知道聚会名称?", "page-community-meta-title": "社区中心", "page-community-meta-description": "社区主页描述", - "page-community-open-source": "创建人?构建者?为您的工作寻求资助。", - "page-community-open-source-description": "您正在或想要构建以太坊?多家公司目前正在招聘数千名技术和非技术性岗位人员。心中已有想法?试着找到一笔资助,让您的项目启动。", - "page-community-open-source-image-alt": "为您的工作寻求资助", + "page-community-open-source": "创建人?构建者?为你的工作寻求资助。", + "page-community-open-source-description": "你正在或想要构建以太坊?多家公司目前正在招聘数千名技术和非技术性岗位人员。心中已有想法?试着找到一笔资助,让你的项目启动。", + "page-community-open-source-image-alt": "为你的工作寻求资助", "page-community-please-add-to-page": "请添加到此页面!", "page-community-support": "以太坊支持", "page-community-support-alt": "支持", "page-community-support-button": "获取支持", - "page-community-support-description": "需要支持吗?以太坊没有官方支持,但有数百个有用的社区可以帮助您在以太坊上获取成功。", + "page-community-support-description": "需要支持吗?以太坊没有官方支持,但有数百个有用的社区可以帮助你在以太坊上获取成功。", "page-community-try-ethereum": "亲自体验以太坊", - "page-community-upcoming-events-no-events": "我们不知道近期会有哪些活动。您知道吗?", + "page-community-upcoming-events-no-events": "我们不知道近期会有哪些活动。你知道吗?", "page-community-upcoming-events-load-more": "加载更多", "page-community-why-get-involved-title": "为什么要参与?", - "page-community-why-get-involved-card-1-title": "查找您的社群", + "page-community-why-get-involved-card-1-title": "查找你的社群", "page-community-why-get-involved-card-1-description": "每个人都可以加入社群。寻找并联系想法相同的人,一起讨论、思考和推崇以太坊。", "page-community-why-get-involved-card-2-title": "赚取生活费", - "page-community-why-get-involved-card-2-description": "每个人都有账单需要支付。在以太坊上,您可以找到有意义的工作,并通过工作获取高额的报酬。", - "page-community-why-get-involved-card-3-title": "让您脱颖而出", + "page-community-why-get-involved-card-2-description": "每个人都有账单需要支付。在以太坊上,你可以找到有意义的工作,并通过工作获取高额的报酬。", + "page-community-why-get-involved-card-3-title": "让你脱颖而出", "page-community-why-get-involved-card-3-description": "加入以太坊,成为积极影响数百万人的技术的积极利益攸关者。" } diff --git a/src/intl/zh/page-dapps.json b/src/intl/zh/page-dapps.json index e20c52e4464..cc261ae2428 100644 --- a/src/intl/zh/page-dapps.json +++ b/src/intl/zh/page-dapps.json @@ -1,94 +1,131 @@ { "page-dapps-1inch-logo-alt": "1inch徽标", - "page-dapps-dexguru-logo-alt": "DexGuru 徽标", "page-dapps-aave-logo-alt": "Aave徽标", - "page-dapps-add-button": "建议去中心化应用", - "page-dapps-add-title": "添加去中心化应用", + "page-dapps-add-button": "建议去中心化应用程序", + "page-dapps-add-title": "添加去中心化应用程序", + "page-dapps-ankr-logo-alt": "Ankr 徽标", + "page-dapps-api3-logo-alt": "API3 徽标", + "page-dapps-arweave-logo-alt": "ARweave 徽标", "page-dapps-audius-logo-alt": "Audius徽标", "page-dapps-augur-logo-alt": "Augur徽标", "page-dapps-axie-infinity-logo-alt": "Axie Infinity徽标", "page-dapps-balancer-logo-alt": "Balancer 徽标", "page-dapps-brave-logo-alt": "Brave徽标", + "page-dapps-beginner-friendly-description": "一些去中心化应用程序适合新手。在下面探索更多去中心化应用程序。", + "page-dapps-beginner-friendly-header": "适合初学者", "page-dapps-category-arts": "艺术与时尚", "page-dapps-category-browsers": "浏览器", + "page-dapps-category-code-marketplaces": "代码市场", "page-dapps-category-collectibles": "数字收藏品", - "page-dapps-category-competitive": "竞赛", + "page-dapps-category-competitive": "Web3 游戏", "page-dapps-category-computing": "开发者工具", - "page-dapps-category-dex": "代币交易所", - "page-dapps-category-investments": "投资", + "page-dapps-category-dex": "交易所", + "page-dapps-category-investments": "投资基金", "page-dapps-category-lending": "贷款与借贷", "page-dapps-category-lottery": "众筹", "page-dapps-category-marketplaces": "市场", "page-dapps-category-music": "音乐", "page-dapps-category-payments": "支付", "page-dapps-category-insurance": "保险", - "page-dapps-category-portfolios": "投资组合", - "page-dapps-category-trading": "交易和预测市场", + "page-dapps-category-portfolios": "投资组合管理", + "page-dapps-category-trading": "预测市场", "page-dapps-category-utilities": "实用工具", "page-dapps-category-worlds": "虚拟世界", + "page-dapps-category-demand-aggregator": "需求聚合器", + "page-dapps-category-derivatives": "衍生品", + "page-dapps-category-liquid-staking": "流动性质押", + "page-dapps-category-bridges": "链桥", + "page-dapps-category-experiences": "经验分享", + "page-dapps-category-guilds": "Yield guilds 游戏公会", + "page-dapps-category-avatar": "头像", "page-dapps-choose-category": "选择分类", - "page-dapps-collectibles-benefits-1-description": "当艺术作品在以太坊上被数字化为代币(Token)之后,这件艺术作品的所有权将会被大家有目共睹,您可以追踪这件艺术作品从创作者到现持有人的全部历程。这样可以防止山寨。", + "page-dapps-category-social": "社交媒体", + "page-dapps-category-content": "内容", + "page-dapps-category-messaging": "消息", + "page-dapps-category-identity": "身份", + "page-dapps-collectibles-benefits-1-description": "当艺术作品在以太坊上被数字化为代币(Token)之后,这件艺术作品的所有权将会被大家有目共睹,你可以追踪这件艺术作品从创作者到现持有人的全部历程。这样可以防止山寨。", "page-dapps-collectibles-benefits-1-title": "所有权是可验证的", "page-dapps-collectibles-benefits-2-description": "消费者(利用以太坊)来购买在线音乐或购买艺术品对艺术家来说将会更加的公平。通过以太坊可以减少不必要的中间商。而且,即使需要中间商,他们的成本也不会高,因为平台不需要支付网络基础设施的费用。", "page-dapps-collectibles-benefits-2-title": "对创作者更公平", - "page-dapps-collectibles-benefits-3-description": "代币化的收藏品是与您的以太坊地址绑定的,而不是平台。所以您可以在任何以太坊市场上出售游戏内物品等东西,而不仅仅是在游戏本身。", - "page-dapps-collectibles-benefits-3-title": "收藏品与您同行", - "page-dapps-collectibles-benefits-4-description": "工具和产品已经存在,您可以将您的艺术作品代币化,并进行销售!您的代币可以在任何和所有的以太坊收藏品平台上销售。", + "page-dapps-collectibles-benefits-3-description": "代币化的收藏品是与你的以太坊地址绑定的,而不是平台。所以你可以在任何以太坊市场上出售游戏内物品等东西,而不仅仅是在游戏本身。", + "page-dapps-collectibles-benefits-3-title": "收藏品与你同行", + "page-dapps-collectibles-benefits-4-description": "工具和产品已经存在,你可以将你的艺术作品代币化,并进行销售!你的代币可以在任何和所有的以太坊收藏品平台上销售。", "page-dapps-collectibles-benefits-4-title": "已有的基础设施", - "page-dapps-collectibles-benefits-description": "这些应用专注于数字所有权,增加创作者的收入潜力,并发明新的方式来投资您喜爱的创作者及其作品。", + "page-dapps-collectibles-benefits-description": "这些应用专注于数字所有权,增加创作者的收入潜力,并发明新的方式来投资你喜爱的创作者及其作品。", "page-dapps-collectibles-benefits-title": "分散式收藏品和流媒体", "page-dapps-collectibles-button": "艺术品和收藏品", - "page-dapps-collectibles-description": "这些应用专注于数字所有权,增加创作者的收入潜力,并发明新的方式来投资您喜爱的创作者及其作品。", + "page-dapps-collectibles-description": "这些应用专注于数字所有权,增加创作者的收入潜力,并发明新的方式来投资你喜爱的创作者及其作品。", "page-dapps-collectibles-title": "去中心化艺术品和收藏品", "page-dapps-compound-logo-alt": "Compound徽标", + "page-dapps-convex-logo-alt": "Convex 标志", "page-dapps-cryptopunks-logo-alt": "CryptoPunks徽标", "page-dapps-cryptovoxels-logo-alt": "Cryptovoxels徽标", - "page-dapps-dapp-description-1inch": "通过聚合最优价格,帮助您避免高的滑点。", - "page-dapps-dapp-description-aave": "借出您的代币赚取利息,并可随时提取。", - "page-dapps-dapp-description-async-art": "创建、收集和交易#可编程艺术--数字画作被分割成 \"层\",您可以用它来影响整体图像。每个主图层和图层都是一个ERC721令牌。", + "page-dapps-cyberconnect-logo-alt": "CyberConnect 徽标", + "page-dapps-dapp-description-1inch": "通过聚合最优价格,帮助你避免高的滑点。", + "page-dapps-dapp-description-aave": "借出你的代币赚取利息,并可随时提取。", + "page-dapps-dapp-description-ankr": "一系列完全存在于区块链上的不同的 Web3 基础设施产品,用于构建、获利、游戏等。", + "page-dapps-dapp-description-api3": "第一方价格参考数据源,允许 10 个网络上的去中心化应用程序(和计数)连接到实时资产价格数据,包括加密货币和外汇价格。", + "page-dapps-dapp-description-arweave": "一次性预付费用即可永久、持续地存储数据。", + "page-dapps-dapp-description-async-art": "创建、收集和交易#可编程艺术--数字画作被分割成 \"层\",你可以用它来影响整体图像。每个主图层和图层都是一个ERC721令牌。", "page-dapps-dapp-description-audius": "去中心化的流媒体平台。听众=创作者的钱,而不是标签。", "page-dapps-dapp-description-augur": "投注体育、经济和更多世界事件的结果。", "page-dapps-dapp-description-axie-infinity": "交易和战斗的生物称为Axies。边玩边赚 - 可在手机上使用", "page-dapps-dapp-description-balancer": "Balancer 是一个自动化投资组合管理和交易平台。", - "page-dapps-dapp-description-brave": "通过浏览赚取代币,用代币支持您喜欢的创作者。", + "page-dapps-dapp-description-brave": "通过浏览赚取代币,用代币支持你喜欢的创作者。", "page-dapps-dapp-description-cent": "通过发布 NFT 赚钱的社交网络。", - "page-dapps-dapp-description-compound": "借出您的代币赚取利息,并可随时提取。", + "page-dapps-dapp-description-compound": "借出你的代币赚取利息,并可随时提取。", + "page-dapps-dapp-description-convex": "Convex 可以让 Curve 流动性提供商在不锁定 CRV 的情况下赚取交易费用,并申请增强版 CRV。", "page-dapps-dapp-description-cryptopunks": "购买、竞价和提供punk for sale--这是以太坊上第一批代币收藏品之一。", "page-dapps-dapp-description-cryptovoxels": "创建艺术画廊,建立商店,购买土地--一个以太坊虚拟世界。", + "page-dapps-dapp-description-cyberconnect": "去中心化社交图谱协议,帮助引发去中心化应用程序网络效应并构建个性化社交体验", "page-dapps-dapp-description-dark-forest": "在一个无限的、程序生成的、密码学指定的宇宙中征服行星。", - "page-dapps-dapp-description-decentraland": "在您可以探索的虚拟世界中收集、交易虚拟土地。", + "page-dapps-dapp-description-decentraland": "在你可以探索的虚拟世界中收集、交易虚拟土地。", "page-dapps-dapp-description-ens": "用户友好的以太坊地址和去中心化网站的名称。", "page-dapps-dapp-description-foundation": "投资独特版本的数字艺术品,并与其他买家交易作品。", "page-dapps-dapp-description-gitcoin": "在开源软件上工作,赚取加密货币。", "page-dapps-dapp-description-gitcoin-grants": "为以太坊社区项目进行众筹,并扩大捐献。", - "page-dapps-dapp-description-gods-unchained": "策略性的交易卡游戏。通过玩,赚取卡,您可以在现实生活中出售。", + "page-dapps-dapp-description-gm": "集聊天、论坛和语音于一身的一体化平台,真正与创作者分享收入", + "page-dapps-dapp-description-gods-unchained": "策略性的交易卡游戏。通过玩,赚取卡,你可以在现实生活中出售。", "page-dapps-dapp-description-golem": "访问共享计算能力或租用自己的资源。", + "page-dapps-dapp-description-graph": "一种用于查询以太坊和星际文件系统等网络的索引协议。", + "page-dapps-dapp-description-ipfs": "一种点对点超媒体协议,旨在通过使网络可升级、有弹性、更开放来保存和发展人类的知识。", "page-dapps-dapp-description-radicle": "没有中间商的安全点对点代码协作。", + "page-dapps-dapp-description-kyberswap": "以最佳汇率兑换并获利。", + "page-dapps-dapp-description-lido": "简便安全的数字资产质押。", "page-dapps-dapp-description-loopring": "点对点交易平台,为速度而生。", "page-dapps-dapp-description-marble-cards": "创建和交易独特的基于URL的数字卡。", - "page-dapps-dapp-description-matcha": "搜索多个交易所,帮您找到最佳价格。", + "page-dapps-dapp-description-matcha": "搜索多个交易所,帮你找到最佳价格。", + "page-dapps-dapp-description-mirror": "Mirror 基于 Web3 构建面向 Web3 的强大发布平台,拓展了在线写作的界限", + "page-dapps-dapp-description-multichain": "Web3 的终极路由器,是一种为任意跨链交互而开发的基础设施。", "page-dapps-dapp-description-nifty-gateway": "在区块链上购买顶级艺术家、运动员、品牌和创作者的作品。", "page-dapps-dapp-description-oasis": "用Dai这个以太坊稳定币进行交易、借贷和储蓄。", "page-dapps-dapp-description-opensea": "购买、出售、发现和交易限量版商品。", - "page-dapps-dapp-description-opera": "从您的浏览器向商家、其他用户和应用程序发送加密货币。", - "page-dapps-dapp-description-poap": "收集证明您处于不同的虚拟或真人事件的 NFT。使用它们加入抽奖、投票、合作或用作谈资。", + "page-dapps-dapp-description-opera": "从你的浏览器向商家、其他用户和应用程序发送加密货币。", + "page-dapps-dapp-description-osuvox": "区块链上的 3D 头像", + "page-dapps-dapp-description-poap": "收集证明你处于不同的虚拟或真人事件的 NFT。使用它们加入抽奖、投票、合作或用作谈资。", "page-dapps-dapp-description-polymarket": "在结果上下注。在信息市场上交易。", - "page-dapps-dapp-description-pooltogether": "您不会输的彩票。每周都有奖。", - "page-dapps-dapp-description-index-coop": "一个加密指数基金,让您的组合获取高价值 DeFi 代币的曝光度。", + "page-dapps-dapp-description-pooltogether": "你不会输的彩票。每周都有奖。", + "page-dapps-dapp-description-index-coop": "一个加密指数基金,让你的组合获取高价值去中心化金融代币的曝光度。", "page-dapps-dapp-description-nexus-mutual": "无保险公司投保。免受智能合约漏洞和黑客的影响。", "page-dapps-dapp-description-etherisc": "去中心化的保险模板,任何人都可以用其来建立自己的保险赔付范围。", - "page-dapps-dapp-description-zapper": "追踪您的投资组合,从同一个界面使用一系列 DeFi 产品。", - "page-dapps-dapp-description-zerion": "管理您的投资组合,简单地评估市场上的每一项 DeFi 资产。", - "page-dapps-dapp-description-rotki": "开源投资组合跟踪、分析、会计和税务报告工具,会尊重您的隐私。", + "page-dapps-dapp-description-zapper": "追踪你的投资组合,从同一个界面使用一系列去中心化金融产品。", + "page-dapps-dapp-description-zerion": "管理你的投资组合,简单地评估市场上的每一项去中心化金融资产。", + "page-dapps-dapp-description-rotki": "开源投资组合跟踪、分析、会计和税务报告工具,会尊重你的隐私。", "page-dapps-dapp-description-krystal": "一个可访问所有你最欢的去中心化金融服务的一站式平台。", - "page-dapps-dapp-description-rarible": "创建、出售和购买通证化的收藏品。", + "page-dapps-dapp-description-rarible": "创建、出售和购买代币化的收藏品。", + "page-dapps-dapp-description-rubic": "面向用户和去中心化应用程序的跨链技术聚合器。", "page-dapps-dapp-description-sablier": "实时流转资金。", + "page-dapps-dapp-description-skiff": "端到端加密电子邮件、日历、文档和文件,让你能够自由交流。", + "page-dapps-dapp-description-spatial": "创建自己的自定义头像和 3D 世界", + "page-dapps-dapp-description-spruce": "开源堆栈将身份和数据控制权交还给用户。", + "page-dapps-dapp-description-status": "旨在实现信息的自由流动,保护进行私密安全对话的权利,并促进个人主权。", "page-dapps-dapp-description-superrare": "直接从艺术家或在二级市场购买数字艺术作品。", + "page-dapps-dapp-description-synthetix": "Synthetix 是一个用于发行和交易合成资产的协议", "page-dapps-dapp-description-token-sets": "自动再平衡的加密投资策略。", "page-dapps-dapp-description-tornado-cash": "在以太坊上发送匿名交易。", "page-dapps-dapp-description-uniswap": "简单地交换代币或提供代币换取%的奖励。", - "page-dapps-dapp-description-dexguru": "去中心化金融交易者的非托管交易终端", - "page-dapps-dapp-description-synthetix": "Synthetix 是一个用于发行和交易合成资产的协议", + "page-dapps-dapp-description-xmtp": "在区块链帐户之间发送消息,包括私信、警报、公告等。", + "page-dapps-dapp-description-yearn": "Yearn Finance 是一个收益聚合器。它为个人、DAO 和其他协议提供了一种存入数字资产并获得收益的方式。", "page-dapps-docklink-dapps": "去中心化应用程序简介", "page-dapps-docklink-smart-contracts": "智能合约", "page-dapps-dark-forest-logo-alt": "Dark Forest徽标", @@ -104,35 +141,33 @@ "page-dapps-desc": "找一个以太坊应用试试。", "page-dapps-doge-img-alt": "用电脑设计一只狗", "page-dapps-editors-choice-dark-forest": "与他人对弈,征服星球,尝试最前沿的以太坊扩展/隐私技术。也许是对于那些已经熟悉以太坊的人来说。", - "page-dapps-editors-choice-description": "一些ethereum.org团队现在喜欢的去中心化应用。下面是更多的去中心化应用。", "page-dapps-editors-choice-foundation": "投资于文化。购买、交易和出售来自一些不可思议的艺术家、音乐家和品牌的独特数字艺术品和时尚。", - "page-dapps-editors-choice-header": "主编推荐", - "page-dapps-editors-choice-pooltogether": "买一张无损彩票。每周将整个票池产生的利息寄给一位幸运儿。只要您愿意,随时可以拿回您的钱。", - "page-dapps-editors-choice-uniswap": "轻松交换您的代币。一个社区的宠儿,让您可以和全网的人交换代币。", - "page-dapps-ens-logo-alt": "以太坊名称服务徽标", - "page-dapps-explore-dapps-description": "很多去中心化应用还在实验中,测试去中心化网络的可能性。但在科技、金融、游戏和收藏品类中,已经有一些成功的先行者。", + "page-dapps-editors-choice-pooltogether": "买一张无损彩票。每周将整个票池产生的利息寄给一位幸运儿。只要你愿意,随时可以拿回你的钱。", + "page-dapps-editors-choice-uniswap": "轻松交换你的代币。一个社区的宠儿,让你可以和全网的人交换代币。", + "page-dapps-ens-logo-alt": "以太坊域名服务徽标", + "page-dapps-explore-dapps-description": "很多去中心化应用程序还在实验中,测试去中心化网络的可能性。但在科技、金融、游戏和收藏品类中,已经有一些成功的先行者。", "page-dapps-explore-dapps-title": "探索去中心化应用程序", - "page-dapps-features-1-description": "一旦部署到以太坊上,去中心化应用代码就无法删除。而且任何人都可以使用去中心化应用的功能。即使去中心化应用背后的团队解散了,您仍然可以使用它。一旦在以太坊上,它就会留在那里。", + "page-dapps-features-1-description": "一旦部署到以太坊上,去中心化应用程序代码就无法删除。而且任何人都可以使用去中心化应用程序的功能。即使去中心化应用程序背后的团队解散了,你仍然可以使用它。一旦在以太坊上,它就会留在那里。", "page-dapps-features-1-title": "没有所有者", - "page-dapps-features-2-description": "您不能被阻止使用去中心化应用或提交交易。例如,如果Twitter是在以太坊上,没有人可以屏蔽您的帐户或阻止您发推特。", - "page-dapps-features-2-title": "抗审查", + "page-dapps-features-2-description": "你不能被阻止使用去中心化应用程序或提交交易。例如,如果Twitter是在以太坊上,没有人可以屏蔽你的帐户或阻止你发推特。", + "page-dapps-features-2-title": "免审查", "page-dapps-features-3-description": "因为以太坊有以太币可以直接用于支付。开发者不需要花时间去集成第三方的支付。", "page-dapps-features-3-title": "内置付款", - "page-dapps-features-4-description": "去中心化应用的代码通常是开源和默认互相兼容的。开发团队之间通常情况下都可以互相引用。例如:想要让用户在您的去中心化应用中交易代币,您只需要引入支持交易代币的合约代码并使用即可。", + "page-dapps-features-4-description": "去中心化应用程序的代码通常是开源和默认互相兼容的。开发团队之间通常情况下都可以互相引用。例如:想要让用户在你的去中心化应用程序中交易代币,你只需要引入支持交易代币的合约代码并使用即可。", "page-dapps-features-4-title": "即插即用", - "page-dapps-features-5-description": "在使用大部分去中心化应用时,您不需要分享您的真实身份,只需要一个以太坊账户与付款账户即可进行登录。", + "page-dapps-features-5-description": "在使用大部分去中心化应用程序时,你不需要分享你的真实身份,只需要一个以太坊帐户与付款帐户即可进行登录。", "page-dapps-features-5-title": "匿名登录", - "page-dapps-features-6-description": "密码学可以保证攻击者无法伪造交易和去中心化应用交互行为。您可以授权去中心化应用来操作您的以太坊账户,通常是通过您的钱包程序,因此您需要确保证书的安全。", + "page-dapps-features-6-description": "密码学可以保证攻击者无法伪造交易和去中心化应用程序交互行为。你可以授权去中心化应用程序来操作你的以太坊帐户,通常是通过你的钱包程序,因此你需要确保证书的安全。", "page-dapps-features-6-title": "加密保护", - "page-dapps-features-7-description": "一旦去中心化应用在以太坊上线就无法单独下线,它只能随着以太坊一起下线,以太坊的规模大到难以攻击。", + "page-dapps-features-7-description": "一旦去中心化应用程序在以太坊上线就无法单独下线,它只能随着以太坊一起下线,以太坊的规模大到难以攻击。", "page-dapps-features-7-title": "无需下载", - "page-dapps-finance-benefits-1-description": "您无需注册便可使用以太坊的交易服务。只要您有资金和网络连接,就可以进行交易了。", + "page-dapps-finance-benefits-1-description": "你无需注册便可使用以太坊的交易服务。只要你有资金和网络连接,就可以进行交易了。", "page-dapps-finance-benefits-1-title": "开源", "page-dapps-finance-benefits-2-description": "你可以通过这些金融产品和全世界的代币互动,人们随时随刻在以太网络的基础上铸造新的代币", "page-dapps-finance-benefits-2-title": "一个新的代币经济", - "page-dapps-finance-benefits-3-description": "团队新推出的稳定币 — 一种更稳定的加密货币。这允许您可以在没有风险和不确定性的情况下去实验并使用加密货币。", + "page-dapps-finance-benefits-3-description": "团队新推出的稳定币 — 一种更稳定的加密货币。这允许你可以在没有风险和不确定性的情况下去实验并使用加密货币。", "page-dapps-finance-benefits-3-title": "稳定币", - "page-dapps-finance-benefits-4-description": "以太坊领域的金融产品都是模块化并且彼此兼容的。这些模块的配置在不断地更新,赋予了您手中加密货币更多的能力。", + "page-dapps-finance-benefits-4-description": "以太坊领域的金融产品都是模块化并且彼此兼容的。这些模块的配置在不断地更新,赋予了你手中加密货币更多的能力。", "page-dapps-finance-benefits-4-title": "互联金融服务", "page-dapps-finance-benefits-description": "以太坊为什么可以让分散式金融应用得以蓬勃发展?", "page-dapps-finance-benefits-title": "去中心化金融", @@ -140,10 +175,10 @@ "page-dapps-finance-description": "这些是专注在构建使用加密货币进行金融服务的应用,它们提供像借、贷、赚取利息,以及不需要个人信息的私密支付等服务。", "page-dapps-finance-title": "去中心化金融", "page-dapps-foundation-logo-alt": "基金会徽标", - "page-dapps-gaming-benefits-1-description": "无论是虚拟土地还是可交易卡片,您的收藏品在收藏品市场上都是可交易的,您的游戏物品有真实世界价值。", + "page-dapps-gaming-benefits-1-description": "无论是虚拟土地还是可交易卡片,你的收藏品在收藏品市场上都是可交易的,你的游戏物品有真实世界价值。", "page-dapps-gaming-benefits-1-title": "游戏物品兼做代币", - "page-dapps-gaming-benefits-2-description": "您的物品(有些时候包括进程)的所有权完全归您,而不是游戏公司所有,所以您无需担心游戏公司的服务器被攻击所带来的服务器故障或解散。", - "page-dapps-gaming-benefits-2-title": "您的储蓄是安全的", + "page-dapps-gaming-benefits-2-description": "你的物品(有些时候包括进程)的所有权完全归你,而不是游戏公司所有,所以你无需担心游戏公司的服务器被攻击所带来的服务器故障或解散。", + "page-dapps-gaming-benefits-2-title": "你的储蓄是安全的", "page-dapps-gaming-benefits-3-description": "就像是以太坊支付可以交给任何人认证一样,游戏也可以使用这个机制确保公平性。理论上来说,从暴击到对手宝箱的大小都可以可以核查的。", "page-dapps-gaming-benefits-3-title": "可证明的公正性", "page-dapps-gaming-benefits-description": "以太坊凭借什么可以让去中心化游戏蓬勃发展?", @@ -151,50 +186,75 @@ "page-dapps-gaming-button": "游戏", "page-dapps-gaming-description": "这些侧重于创造虚拟世界和同其他玩家竞技的应用使用具有现实世界价值的收藏品。", "page-dapps-gaming-title": "去中心化游戏", - "page-dapps-get-some-eth-description": "去中心化应用的操作有交易费用作为成本", - "page-dapps-get-started-subtitle": "如果想要使用去中心化应用,您得先有一个钱包以及一些以太币。钱包可以使您连接并登录,而以太币可以用来支付任何交易费。", + "page-dapps-get-some-eth-description": "去中心化应用程序的操作有交易费用作为成本", + "page-dapps-get-started-subtitle": "如果想要使用去中心化应用程序,你得先有一个钱包以及一些以太币。钱包可以使你连接并登录,而以太币可以用来支付任何交易费。", "page-dapps-get-started-title": "开始体验", "page-dapps-gitcoin-grants-logo-alt": "Gitcoin Grants徽标", "page-dapps-gitcoin-logo-alt": "Gitcoin徽标", + "page-dapps-gm-logo-alt": "gm.xyz 徽标", "page-dapps-gods-unchained-logo-alt": "Gods Unchained徽标", "page-dapps-golem-logo-alt": "Golem徽标", + "page-dapps-graph-logo-alt": "Graph 徽标", "page-dapps-radicle-logo-alt": "Radicle 徽标", "page-dapps-hero-header": "由以太坊提供支持的工具和服务", - "page-dapps-hero-subtitle": "去中心化应用是运用以太坊网络来打破传统商业模式或发明新商业模式的蓬勃发展的应用新运动。", - "page-dapps-how-dapps-work-p1": "去中心化应用的后端代码(智能合约)运行在一个去中心化的网络上,而非中心化的服务器。他们使用以太坊区块链网络作为数据存储端,并且用智能合约实现app的业务逻辑。", - "page-dapps-how-dapps-work-p2": "一个智能合约像是一套设立在区块链上的规则,所有人都可以准确地观察和运行这套规则。设想一下,有一台自动贩卖机:如果向它提供足够的资金和正确的选择,您将得到您想要的货品。正如自动贩卖机一样,智能合约可以像您的以太坊账户一样存储持有资金。这允许代码之间协议和交易。", - "page-dapps-how-dapps-work-p3": "一旦去中心化应用部署到以太坊网络,您将无法更改他们。去中心化应用之所以可以被去中心化就是因为他们被合约中的逻辑所控制,而不是公司或者个人。", - "page-dapps-how-dapps-work-title": "去中心化应用工作原理", + "page-dapps-hero-subtitle": "去中心化应用程序是运用以太坊网络来打破传统商业模式或发明新商业模式的蓬勃发展的应用新运动。", + "page-dapps-how-dapps-work-p1": "去中心化应用程序的后端代码(智能合约)运行在一个去中心化的网络上,而非中心化的服务器。他们使用以太坊区块链网络作为数据存储端,并且用智能合约实现app的业务逻辑。", + "page-dapps-how-dapps-work-p2": "一个智能合约像是一套设立在区块链上的规则,所有人都可以准确地观察和运行这套规则。设想一下,有一台自动贩卖机:如果向它提供足够的资金和正确的选择,你将得到你想要的货品。正如自动贩卖机一样,智能合约可以像你的以太坊帐户一样存储持有资金。这允许代码之间协议和交易。", + "page-dapps-how-dapps-work-p3": "一旦去中心化应用程序部署到以太坊网络,你将无法更改他们。去中心化应用程序之所以可以被去中心化就是因为他们被合约中的逻辑所控制,而不是公司或者个人。", + "page-dapps-how-dapps-work-title": "去中心化应用程序工作原理", + "page-dapps-ipfs-logo-alt": "IPFS 徽标", + "page-dapps-kyberswap-logo-alt": "KyberSwap 徽标", "page-dapps-learn-callout-button": "开始构建", - "page-dapps-learn-callout-description": "我们的社区开发者门户拥有文档、工具和框架来帮助您开始构建一个去中心化应用。", + "page-dapps-learn-callout-description": "我们的社区开发者门户拥有文档、工具和框架来帮助你开始构建一个去中心化应用程序。", "page-dapps-learn-callout-image-alt": "一幅用手拼乐高积木版的以太币符号的插图。", - "page-dapps-learn-callout-title": "学习创建一个去中心化应用", + "page-dapps-learn-callout-title": "学习创建一个去中心化应用程序", + "page-dapps-lido-logo-alt": "Lido 徽标", "page-dapps-loopring-logo-alt": "Loopring徽标", - "page-dapps-magic-behind-dapps-description": "去中心化应用可能会让人觉得是普通的应用。但在背后,它们有一些不一样的优秀特性,因为它们继承了所有以太坊的超能力。点击这里了解为什么去中心化应用不同于一般应用。", + "page-dapps-magic-behind-dapps-description": "去中心化应用程序可能会让人觉得是普通的应用。但在背后,它们有一些不一样的优秀特性,因为它们继承了所有以太坊的超能力。点击这里了解为什么去中心化应用程序不同于一般应用。", "page-dapps-magic-behind-dapps-link": "为什么我们说以太坊伟大?", - "page-dapps-magic-behind-dapps-title": "去中心化应用的魔法", + "page-dapps-magic-behind-dapps-title": "去中心化应用程序的魔法", "page-dapps-magic-title-1": "魔法", "page-dapps-magic-title-2": "背后", "page-dapps-magician-img-alt": "魔法师插图", "page-dapps-marble-cards-logo-alt": "marble.cards徽标", "page-dapps-async-logo-alt": "Async 徽标", "page-dapps-matcha-logo-alt": "Matcha徽标", + "page-dapps-metaverse-benefits-title": "元宇宙", + "page-dapps-metaverse-benefits-description": "以太坊为什么能让元宇宙蓬勃发展?", + "page-dapps-metaverse-benefits-1-title": "非同质化代币", + "page-dapps-metaverse-benefits-1-description": "用户拥有的独特游戏物品,可在支持相同标准的虚拟世界和市场中互操作。", + "page-dapps-metaverse-benefits-2-title": "用户拥有的社区", + "page-dapps-metaverse-benefits-2-description": "身份由用户拥有,他们有无尽的机会在多个虚拟世界中探索和创建社交网络。", + "page-dapps-metaverse-button": "元宇宙", + "page-dapps-metaverse-title": "元宇宙", + "page-dapps-metaverse-description": "这些应用程序使用户能够自由地参与到虚拟世界中。用户可以构建个人网络并拥有数字资产的所有权", + "page-dapps-mirror-logo-alt": "Mirror 徽标", "page-dapps-mobile-options-header": "浏览另一个类别", + "page-dapps-multichain-logo-alt": "Multichain 徽标", "page-dapps-nifty-gateway-logo-alt": "Nifty Gateway徽标", "page-dapps-oasis-logo-alt": "Oasis徽标", "page-dapps-opensea-logo-alt": "OpenSea徽标", "page-dapps-opera-logo-alt": "Opera徽标", + "page-dapps-osuvox-logo-alt": "OSUVOX 徽标", "page-dapps-polymarket-logo-alt": "Polymarket徽标", "page-dapps-poap-logo-alt": "Proof of Attendance Protocol 徽标", "page-dapps-pooltogether-logo-alt": "PoolTogether徽标", "page-dapps-rarible-logo-alt": "Rarible徽标", "page-dapps-ready-button": "出发", - "page-dapps-ready-description": "选择一个去中心化应用来尝试", + "page-dapps-ready-description": "选择一个去中心化应用程序来尝试", "page-dapps-ready-title": "准备好了吗?", + "page-dapps-rubic-logo-alt": "Rubic 徽标", "page-dapps-sablier-logo-alt": "Sablier徽标", "page-dapps-set-up-a-wallet-button": "查找钱包", - "page-dapps-set-up-a-wallet-description": "一个钱包地址是您“登录”去中心化应用的凭证", + "page-dapps-set-up-a-wallet-description": "一个钱包地址是你“登录”去中心化应用程序的凭证", "page-dapps-set-up-a-wallet-title": "创建一个钱包", + "page-dapps-skiff-logo-alt": "Skiff 徽标", + "page-dapps-social-button": "社交", + "page-dapps-social-description": "这些应用程序专注于利用去中心化身份技术创建去中心化社交网络,其中数字身份和社交图谱由用户拥有。", + "page-dapps-social-title": "社交", + "page-dapps-spatial-logo-alt": "Spatial 徽标", + "page-dapps-spruce-logo-alt": "Spruce 徽标", + "page-dapps-status-logo-alt": "Status 徽标", "page-dapps-superrare-logo-alt": "SuperRare徽标", "page-dapps-technology-button": "科技", "page-dapps-technology-description": "这些应用侧重于开发者工具的去中心化,将加密经济系统纳入现有技术,并为开发开放源码的开发工作创建市场。", @@ -203,22 +263,28 @@ "page-dapps-tornado-cash-logo-alt": "Tornado cash徽标", "page-dapps-uniswap-logo-alt": "Uniswap徽标", "page-dapps-wallet-callout-button": "查找钱包", - "page-dapps-wallet-callout-description": "钱包同样也是去中心化应用,根据功能最适合您的原则选择一个钱包。", + "page-dapps-wallet-callout-description": "钱包同样也是去中心化应用程序,根据功能最适合你的原则选择一个钱包。", "page-dapps-wallet-callout-image-alt": "机器人插图。", "page-dapps-wallet-callout-title": "查看钱包", "page-dapps-warning-header": "坚持独立思考和研究", - "page-dapps-warning-message": "以太坊是一种新技术,大多数应用程序都是新的。在存放大量资金之前,请确保您了解风险。", + "page-dapps-warning-message": "以太坊是一种新技术,大多数应用程序都是新的。在存放大量资金之前,请确保你了解风险。", "page-dapps-what-are-dapps": "什么是Dapp?", "page-dapps-more-on-defi-button": "关于去中心化金融的更多信息", "page-dapps-more-on-nft-button": "关于代币化收藏品的更多信息", "page-dapps-more-on-nft-gaming-button": "关于代币化游戏物品的更多信息", "page-dapps-dapp-description-pwn": "轻松贷由以太坊上的任意代币或非同质化代币提供支持。", "page-dapps-pwn-image-alt": "PWN 徽标", - "page-dapps-dapp-description-yearn": "Yearn Finance 是一个收益聚合器。它为个人、DAO 和其他协议提供了一种存入数字资产并获得收益的方式。", + "page-dapps-xmtp-logo-alt": "XMTP 徽标", + "opage-dapps-yearn-logo-alt": "Yearn 标志", "page-dapps-yearn-image-alt": "Yearn 标志", - "page-dapps-dapp-description-convex": "Convex 可以让 Curve 流动性提供商在不锁定 CRV 的情况下赚取交易费用,并申请增强版 CRV。", "page-dapps-convex-image-alt": "Convex 标志", "foundation": "基金会", "transaction-fees": "什么是交易费?", - "page-wallets-get-some": "获取一些以太币" + "page-wallets-get-some": "获取一些以太币", + "page-dapps-dapp-description-curve": "Curve 是一家专注于稳定币的去中心化交易所", + "page-dapps-curve-image-alt": "Curve 徽标", + "page-dapps-dapp-description-dodo": "DODO 是一个链上流动性提供商,它采用的是主动做市商算法 (PMM)", + "page-dapps-dodo-image-alt": "DODO 徽标", + "page-dapps-dapp-description-artblocks": "Art Blocks 致力于让精彩的当代生成艺术作品栩栩如生", + "page-dapps-artblocks-image-alt": "Art Blocks 徽标" } diff --git a/src/intl/zh/page-stablecoins.json b/src/intl/zh/page-stablecoins.json index 64aed86d8d4..8742bd0e3f8 100644 --- a/src/intl/zh/page-stablecoins.json +++ b/src/intl/zh/page-stablecoins.json @@ -7,39 +7,39 @@ "page-stablecoins-accordion-borrow-places-intro": "这些去中心化应用程序允许你将加密货币作为抵押品借入稳定币。有些接受以太币和其它代币。", "page-stablecoins-accordion-borrow-places-title": "借入稳定币的地方", "page-stablecoins-accordion-borrow-requirement-1": "以太坊钱包", - "page-stablecoins-accordion-borrow-requirement-1-description": "您需要钱包才能使用去中心化应用", + "page-stablecoins-accordion-borrow-requirement-1-description": "你需要钱包才能使用去中心化应用程序", "page-stablecoins-accordion-borrow-requirement-2": "以太币 (ETH)", - "page-stablecoins-accordion-borrow-requirement-2-description": "您将需要ETH来支付抵押和/或交易费用", - "page-stablecoins-accordion-borrow-requirements-description": "要借到稳定币,您需要正确使用去中心化应用。您还需要一个钱包和一些ETH。", - "page-stablecoins-accordion-borrow-risks-copy": "如果您使用ETH作为抵押品,其价值下降,您的抵押品将无法抵扣您生成的稳定币。这将导致您的ETH清算,您可能会面临惩罚。所以如果您借用稳定币,您需要观看ETH价格。", + "page-stablecoins-accordion-borrow-requirement-2-description": "你将需要ETH来支付抵押和/或交易费用", + "page-stablecoins-accordion-borrow-requirements-description": "要借到稳定币,你需要正确使用去中心化应用程序。你还需要一个钱包和一些ETH。", + "page-stablecoins-accordion-borrow-risks-copy": "如果你使用ETH作为抵押品,其价值下降,你的抵押品将无法抵扣你生成的稳定币。这将导致你的ETH清算,你可能会面临惩罚。所以如果你借用稳定币,你需要观看ETH价格。", "page-stablecoins-accordion-borrow-risks-link": "最新的ETH价格", "page-stablecoins-accordion-borrow-risks-title": "风险", - "page-stablecoins-accordion-borrow-text-preview": "您可以通过使用加密货币作为抵押借入一些稳定币,但您必须偿还。", + "page-stablecoins-accordion-borrow-text-preview": "你可以通过使用加密货币作为抵押借入一些稳定币,但你必须偿还。", "page-stablecoins-accordion-borrow-title": "借款", "page-stablecoins-accordion-buy-exchanges-title": "热门交易所", "page-stablecoins-accordion-buy-requirement-1": "加密交易所和钱包", - "page-stablecoins-accordion-buy-requirement-1-description": "请查看您当地的可用服务", - "page-stablecoins-accordion-buy-requirements-description": "您可以从一个绑定交易所或者钱包的账户中直接购买加密货币。您可能已经使用它们获取了一些ETH。请查看您当地可用的服务。", - "page-stablecoins-accordion-buy-text-preview": "大量交易所或者钱包能够让您直接买入稳定币,这种能力可能受到当地政策限制。", + "page-stablecoins-accordion-buy-requirement-1-description": "请查看你当地的可用服务", + "page-stablecoins-accordion-buy-requirements-description": "你可以从一个绑定交易所或者钱包的帐户中直接购买加密货币。你可能已经使用它们获取了一些ETH。请查看你当地可用的服务。", + "page-stablecoins-accordion-buy-text-preview": "大量交易所或者钱包能够让你直接买入稳定币,这种能力可能受到当地政策限制。", "page-stablecoins-accordion-buy-title": "购买", - "page-stablecoins-accordion-buy-warning": "中心化交易所有可能只是列出了类似USDC、Tether这些由法币支持的稳定币。您无法直接购买它们,但是您应能够在这些平台上用您的ETH或者其它加密货币购买它们。", + "page-stablecoins-accordion-buy-warning": "中心化交易所有可能只是列出了类似USDC、Tether这些由法币支持的稳定币。你无法直接购买它们,但是你应能够在这些平台上用你的ETH或者其它加密货币购买它们。", "page-stablecoins-accordion-earn-project-1-description": "开放源代码软件运动的大部分技术性工作。", - "page-stablecoins-accordion-earn-project-2-description": "MakerDao社区(为您带来Dai的团队)的技术、内容和其他工作。", - "page-stablecoins-accordion-earn-project-3-description": "当您精通此道时,可以通过寻找漏洞赢得Dai。", + "page-stablecoins-accordion-earn-project-2-description": "MakerDao社区(为你带来Dai的团队)的技术、内容和其他工作。", + "page-stablecoins-accordion-earn-project-3-description": "当你精通此道时,可以通过寻找漏洞赢得Dai。", "page-stablecoins-accordion-earn-project-bounties": "Gitcoin悬赏", "page-stablecoins-accordion-earn-project-bug-bounties": "共识层漏洞悬赏", "page-stablecoins-accordion-earn-project-community": "MakerDao社区", - "page-stablecoins-accordion-earn-projects-copy": "这些平台将为您的工作支付稳定币作为酬劳。", + "page-stablecoins-accordion-earn-projects-copy": "这些平台将为你的工作支付稳定币作为酬劳。", "page-stablecoins-accordion-earn-projects-title": "从哪里赚取稳定币", "page-stablecoins-accordion-earn-requirement-1": "以太坊钱包", - "page-stablecoins-accordion-earn-requirement-1-description": "您需要一个钱包来接收您赚取的稳定币", - "page-stablecoins-accordion-earn-requirements-description": "因为价值稳定,稳定币是为工作和服务支付酬劳的好方法。但是您首先需要一个钱包。", - "page-stablecoins-accordion-earn-text-preview": "您可以通过为以太坊生态下的项目工作来赚取稳定币。", + "page-stablecoins-accordion-earn-requirement-1-description": "你需要一个钱包来接收你赚取的稳定币", + "page-stablecoins-accordion-earn-requirements-description": "因为价值稳定,稳定币是为工作和服务支付酬劳的好方法。但是你首先需要一个钱包。", + "page-stablecoins-accordion-earn-text-preview": "你可以通过为以太坊生态下的项目工作来赚取稳定币。", "page-stablecoins-accordion-earn-title": "收益", "page-stablecoins-accordion-less": "更少", "page-stablecoins-accordion-more": "更多", - "page-stablecoins-accordion-requirements": "您所需要的", - "page-stablecoins-accordion-swap-dapp-intro": "如果您已经拥有以太币和一个钱包,您就可以使用这些去中心化应用来交换稳定币。", + "page-stablecoins-accordion-requirements": "你所需要的", + "page-stablecoins-accordion-swap-dapp-intro": "如果你已经拥有以太币和一个钱包,你就可以使用这些去中心化应用程序来交换稳定币。", "page-stablecoins-accordion-swap-dapp-link": "关于去中心化交易所的更多信息", "page-stablecoins-accordion-swap-dapp-title": "交换代币的应用", "page-stablecoins-accordion-swap-editors-tip": "编辑提示", @@ -47,79 +47,79 @@ "page-stablecoins-accordion-swap-editors-tip-copy": "获取一个钱包,通过它购买以太币并直接兑换成包括稳定币在内的其它代币。", "page-stablecoins-accordion-swap-pill": "推荐", "page-stablecoins-accordion-swap-requirement-1": "以太坊钱包", - "page-stablecoins-accordion-swap-requirement-1-description": "您需要一个钱包来授权兑换和存储代币", + "page-stablecoins-accordion-swap-requirement-1-description": "你需要一个钱包来授权兑换和存储代币", "page-stablecoins-accordion-swap-requirement-2": "以太币 (ETH)", "page-stablecoins-accordion-swap-requirement-2-description": "为兑换支付费用", - "page-stablecoins-accordion-swap-text-preview": "您可以在去中心化的交易所中找到绝大多数稳定币。因此您可以使用您可能拥有的任何代币去兑换这些稳定币。", + "page-stablecoins-accordion-swap-text-preview": "你可以在去中心化的交易所中找到绝大多数稳定币。因此你可以使用你可能拥有的任何代币去兑换这些稳定币。", "page-stablecoins-accordion-swap-title": "兑换", "page-stablecoins-algorithmic": "算法", - "page-stablecoins-algorithmic-con-1": "您需要相信(或者能够读懂)算法。", - "page-stablecoins-algorithmic-con-2": "您的代币数量将随着供给总量而变化。", - "page-stablecoins-algorithmic-description": "这些稳定币没有其它资产作为支撑。相反,一种算法将确保当价格低于预期时出售代币,在价格高于预期时获得更多代币。由于流通中的代币数量经常变化,您所持有的代币数量也会随之改变,但是总能反应出您所占的份额。", + "page-stablecoins-algorithmic-con-1": "你需要相信(或者能够读懂)算法。", + "page-stablecoins-algorithmic-con-2": "你的代币数量将随着供给总量而变化。", + "page-stablecoins-algorithmic-description": "这些稳定币没有其它资产作为支撑。相反,一种算法将确保当价格低于预期时出售代币,在价格高于预期时获得更多代币。由于流通中的代币数量经常变化,你所持有的代币数量也会随之改变,但是总能反应出你所占的份额。", "page-stablecoins-algorithmic-pro-1": "无需抵押物。", "page-stablecoins-algorithmic-pro-2": "由公开算法控制。", "page-stablecoins-bank-apy": "0.05%", "page-stablecoins-bank-apy-source": "由美国联邦政府保证的银行基础利率。", "page-stablecoins-bank-apy-source-link": "来源", "page-stablecoins-bitcoin-pizza": "臭名昭著的比特币比萨", - "page-stablecoins-bitcoin-pizza-body": "2010年,有人用10000枚比特币购买了2个比萨,在当时,这些比特币价值 $41美元。而在现在,那就是百万美元。在以太坊的历史上还有很多类似令人懊悔的交易。稳定币可以解决这个问题,因此您可以一边手握ETH,一边享用您的披萨。", + "page-stablecoins-bitcoin-pizza-body": "2010年,有人用10000枚比特币购买了2个比萨,在当时,这些比特币价值 $41美元。而在现在,那就是百万美元。在以太坊的历史上还有很多类似令人懊悔的交易。稳定币可以解决这个问题,因此你可以一边手握ETH,一边享用你的披萨。", "page-stablecoins-coin-price-change": "币价波动(最近30天)", "page-stablecoins-crypto-backed": "由加密货币支撑", "page-stablecoins-crypto-backed-con-1": "不如法币支撑的稳定币稳定。", - "page-stablecoins-crypto-backed-con-2": "您需要对抵押的加密货币的价值波动保持关注。", + "page-stablecoins-crypto-backed-con-2": "你需要对抵押的加密货币的价值波动保持关注。", "page-stablecoins-crypto-backed-description": "这些稳定币由其它加密资产(例如ETH)作为支撑。它们的价格随着底层资产(即抵押物)的价值波动而波动。由于ETH的价格可能波动,这些稳定币需要超额抵押来确保价值稳定。这种方法意味着价值$1美元的稳定币需要有至少价值$2美元的加密资产进行抵押。如果ETH的价格下跌,更多的ETH将会用于支撑稳定币,否则稳定币将会失去价值。", "page-stablecoins-crypto-backed-pro-1": "透明且完全去中心化。", "page-stablecoins-crypto-backed-pro-2": "快速转化为其它加密资产。", - "page-stablecoins-crypto-backed-pro-3": "没有外部监管 - 所有资产由以太坊账户完全控制。", - "page-stablecoins-dai-banner-body": "Dai 可能是最著名的分布式稳定币。它和 1 美元等价并被去中心化应用广泛接受。", + "page-stablecoins-crypto-backed-pro-3": "没有外部监管 - 所有资产由以太坊帐户完全控制。", + "page-stablecoins-dai-banner-body": "Dai 可能是最著名的分布式稳定币。它和 1 美元等价并被去中心化应用程序广泛接受。", "page-stablecoins-dai-banner-learn-button": "了解 Dai", "page-stablecoins-dai-banner-swap-button": "将以太币转换成 Dai 币", "page-stablecoins-dai-banner-title": "Dai", "page-stablecoins-dai-logo": "Dai 徽标", "page-stablecoins-editors-choice": "主编推荐", - "page-stablecoins-editors-choice-intro": "这些是当前最知名的稳定币,并被去中心化应用广泛使用。", + "page-stablecoins-editors-choice-intro": "这些是当前最知名的稳定币,并被去中心化应用程序广泛使用。", "page-stablecoins-explore-dapps": "探索去中心化应用程序", "page-stablecoins-fiat-backed": "法币抵押", "page-stablecoins-fiat-backed-con-1": "中心化 - 必须有人签发代币。", "page-stablecoins-fiat-backed-con-2": "需要审计确保这些公司拥有足够的资产储备。", - "page-stablecoins-fiat-backed-description": "简单来说由传统意义上的法币(通常是美元)来抵押。您使用您的法币购入稳定币,并可以随时兑换回来。", + "page-stablecoins-fiat-backed-description": "简单来说由传统意义上的法币(通常是美元)来抵押。你使用你的法币购入稳定币,并可以随时兑换回来。", "page-stablecoins-fiat-backed-pro-1": "具有对抗加密货币价值波动的安全性。", "page-stablecoins-fiat-backed-pro-2": "价格波动很小。", "page-stablecoins-find-stablecoin": "查找稳定币", "page-stablecoins-find-stablecoin-how-to-get-them": "如何获取稳定币", - "page-stablecoins-find-stablecoin-intro": "有上百种可用的稳定币。这里有一份指南,如果您初次接触以太坊,我们建议您先做一些研究。", + "page-stablecoins-find-stablecoin-intro": "有上百种可用的稳定币。这里有一份指南,如果你初次接触以太坊,我们建议你先做一些研究。", "page-stablecoins-find-stablecoin-types-link": "稳定币的不同类型", "page-stablecoins-get-stablecoins": "如何获取稳定币", "page-stablecoins-hero-alt": "市值前三的稳定币:Dai、USDC 和 Tether。", "page-stablecoins-hero-button": "获取稳定币", "page-stablecoins-hero-header": "用于日常使用的电子货币", "page-stablecoins-hero-subtitle": "稳定币是币值稳定的以太坊代币,即使以太坊的价值存在波动。", - "page-stablecoins-interest-earning-dapps": "赚取利息的去中心化应用", + "page-stablecoins-interest-earning-dapps": "赚取利息的去中心化应用程序", "page-stablecoins-meta-description": "以太坊稳定币简介:它们是什么,如何获取以及为什么重要。", "page-stablecoins-precious-metals": "贵金属", "page-stablecoins-precious-metals-con-1": "中心化 - 必须有人签发代币。", - "page-stablecoins-precious-metals-con-2": "您需要相信代币发行者拥有相应的贵金属储备。", + "page-stablecoins-precious-metals-con-2": "你需要相信代币发行者拥有相应的贵金属储备。", "page-stablecoins-precious-metals-description": "就像法币一样,这些加密货币使用黄金等资源维持它们的价值。", "page-stablecoins-precious-metals-pro-1": "具有对抗加密货币价值波动的安全性。", "page-stablecoins-prices": "稳定币价格", - "page-stablecoins-prices-definition": "稳定币是不具有波动性的加密货币。它们具有很多和ETH相同的能力,同时它们的价值稳定,更像传统货币。因此您可以在以太坊上像使用传统货币一样使用它们。", + "page-stablecoins-prices-definition": "稳定币是不具有波动性的加密货币。它们具有很多和ETH相同的能力,同时它们的价值稳定,更像传统货币。因此你可以在以太坊上像使用传统货币一样使用它们。", "page-stablecoins-prices-definition-how": "稳定币如何维持稳定价值", - "page-stablecoins-research-warning": "以太坊是一种新技术,同时绝大部分应用也是新鲜出炉。请确保您了解这些风险。", + "page-stablecoins-research-warning": "以太坊是一种新技术,同时绝大部分应用也是新鲜出炉。请确保你了解这些风险。", "page-stablecoins-research-warning-title": "坚持独立思考和研究", "page-stablecoins-save-stablecoins": "储蓄稳定币", - "page-stablecoins-save-stablecoins-body": "由于有大量借入需求,稳定币通常拥有高于平均的收益率。有些去中心化应用能够让您通过将稳定币放入借贷池赚取即时收益。就像在金融界一样,您出借稳定币,且可以随时撤回,获取收益。", - "page-stablecoins-saving": "妥善利用您的稳定币储蓄以赚取利息。就像加密世界中的任何东西,预期的收益率曲线(APY)总是根据供需每天实时变化。", - "page-stablecoins-stablecoins-dapp-callout-description": "查看以太坊上的去中心化应用 - 日常交易中稳定币更实用。", + "page-stablecoins-save-stablecoins-body": "由于有大量借入需求,稳定币通常拥有高于平均的收益率。有些去中心化应用程序能够让你通过将稳定币放入借贷池赚取即时收益。就像在金融界一样,你出借稳定币,且可以随时撤回,获取收益。", + "page-stablecoins-saving": "妥善利用你的稳定币储蓄以赚取利息。就像加密世界中的任何东西,预期的收益率曲线(APY)总是根据供需每天实时变化。", + "page-stablecoins-stablecoins-dapp-callout-description": "查看以太坊上的去中心化应用程序 - 日常交易中稳定币更实用。", "page-stablecoins-stablecoins-dapp-callout-image-alt": "插图:一只拟人狗。", - "page-stablecoins-stablecoins-dapp-callout-title": "使用您的稳定币", + "page-stablecoins-stablecoins-dapp-callout-title": "使用你的稳定币", "page-stablecoins-stablecoins-dapp-description-1": "包括Dai、USDC、TUSD、USDT等在内的稳定币市场。 ", "page-stablecoins-stablecoins-dapp-description-2": "出借稳定币以赚取利息和$COMP,一种Compound自己的代币。", - "page-stablecoins-stablecoins-dapp-description-3": "一个能够从您的 Dai 和 USDC 上赚取利息的交易平台。", + "page-stablecoins-stablecoins-dapp-description-3": "一个能够从你的 Dai 和 USDC 上赚取利息的交易平台。", "page-stablecoins-stablecoins-dapp-description-4": "一个为了存 Dai 而做的应用。", - "page-stablecoins-stablecoins-feature-1": "稳定币可以在全球范围内的互联网上发送。只要您有以太坊账户,就可以简单地发送或接收它们。", - "page-stablecoins-stablecoins-feature-2": "对稳定币的需求很大,因此您可以通过出借赚取利息。但是请确保您明确其中的风险。", - "page-stablecoins-stablecoins-feature-3": "稳定币可以和ETH以及其它以太坊代币互相转换。大量去中心化应用依赖稳定币。", - "page-stablecoins-stablecoins-feature-4": "稳定币由加密算法保证安全。没有人能够以您的身份伪造交易。", + "page-stablecoins-stablecoins-feature-1": "稳定币可以在全球范围内的互联网上发送。只要你有以太坊帐户,就可以简单地发送或接收它们。", + "page-stablecoins-stablecoins-feature-2": "对稳定币的需求很大,因此你可以通过出借赚取利息。但是请确保你明确其中的风险。", + "page-stablecoins-stablecoins-feature-3": "稳定币可以和ETH以及其它以太坊代币互相转换。大量去中心化应用程序依赖稳定币。", + "page-stablecoins-stablecoins-feature-4": "稳定币由加密算法保证安全。没有人能够以你的身份伪造交易。", "page-stablecoins-stablecoins-meta-description": "以太坊稳定币简介:它们是什么,如何获取以及为什么重要。", "page-stablecoins-stablecoins-table-header-column-1": "货币", "page-stablecoins-stablecoins-table-header-column-2": "市值", @@ -128,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "法币", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "贵金属", "page-stablecoins-table-error": "无法加载稳定币数据。请刷新页面。", + "page-stablecoins-table-loading": "正在加载稳定币数据...", "page-stablecoins-title": "稳定币", "page-stablecoins-top-coins": "处于领先地位的稳定币(按市值排序)", "page-stablecoins-top-coins-intro": "市值等于", @@ -140,7 +141,7 @@ "page-stablecoins-usdc-logo": "USDC 徽标", "page-stablecoins-why-stablecoins": "为什么使用稳定币?", "page-stablecoins-how-they-work-button": "它们如何运作", - "page-stablecoins-why-stablecoins-body": "以太币和比特币一样是一种新技术,所以价值存在波动。因此您可能不会想在日常生活中使用它。稳定币作为传统货币价值的替代品,成为您能够在以太坊上使用的稳定资金。", + "page-stablecoins-why-stablecoins-body": "以太币和比特币一样是一种新技术,所以价值存在波动。因此你可能不会想在日常生活中使用它。稳定币作为传统货币价值的替代品,成为你能够在以太坊上使用的稳定资金。", "page-stablecoins-more-defi-button": "关于去中心化金融 (DeFi) 的更多信息", "page-stablecoins-tools-title": "进一步了解稳定币", "page-stablecoins-tools-stablecoinswtf-description": "Stablecoins.wtf 提供了一个仪表板,其中包含了一些最知名稳定币的历史市场数据、统计信息和教育内容。", diff --git a/src/intl/zh/page-upgrades-get-involved.json b/src/intl/zh/page-upgrades-get-involved.json index 682b7cfb06d..5bcff659e62 100644 --- a/src/intl/zh/page-upgrades-get-involved.json +++ b/src/intl/zh/page-upgrades-get-involved.json @@ -17,7 +17,7 @@ "page-upgrades-get-involved-ethresearch-3": "分片执行", "page-upgrades-get-involved-ethresearch-4": "所有研究专题", "page-upgrades-get-involved-how": "我应该如何参与?", - "page-upgrades-get-involved-how-desc": "更多人运行客户端、质押和查找漏洞,可以让以太坊社区一直受益。", + "page-upgrades-get-involved-how-desc": "有更多人运行客户端、质押和查找漏洞,就可以让以太坊社区一直受益。", "page-upgrades-get-involved-join": "参与研究", "page-upgrades-get-involved-join-desc": "和以太坊的其它东西一样,大量研究都是公开的。这意味着你可以参与讨论或者只是阅读以太坊研究者们发表的言论。ethresear.ch 涵盖了许多话题,例如共识升级、卷叠等。", "page-upgrades-get-involved-meta-description": "如何参与以太坊升级:运行节点、质押、查找漏洞等。", @@ -28,12 +28,12 @@ "page-upgrades-get-involved-run-clients-execution-desc": "这些客户端曾称为“以太坊 1”客户端,但这个词正在被弃用,代之以“执行层客户端”。", "page-upgrades-get-involved-run-clients-consensus": "共识层客户端", "page-upgrades-get-involved-run-clients-consensus-desc": "这些客户端曾称为“以太坊 2”客户端,但这个词正在被弃用,代之以“共识层客户端”。", - "page-upgrades-get-involved-stake": "质押您的以太币", + "page-upgrades-get-involved-stake": "质押你的以太币", "page-upgrades-get-involved-stake-desc": "你现在可以质押你的以太币,帮助保证信标链的安全了。", "page-upgrades-get-involved-stake-eth": "质押ETH", "page-upgrades-get-involved-subtitle": "下面是你能帮助推动以太坊发展以及未来升级相关工作的所有方法:", "page-upgrades-get-involved-title-1": "运行客户端", - "page-upgrades-get-involved-title-2": "质押您的以太币", + "page-upgrades-get-involved-title-2": "质押你的以太币", "page-upgrades-get-involved-title-3": "查找漏洞", "page-upgrades-get-involved-written-c-sharp": "用 C# 语言编写", "page-upgrades-get-involved-written-go": "用 Go 语言编写", diff --git a/src/intl/zh/page-upgrades-index.json b/src/intl/zh/page-upgrades-index.json index 604e77718f2..f987f665f90 100644 --- a/src/intl/zh/page-upgrades-index.json +++ b/src/intl/zh/page-upgrades-index.json @@ -9,44 +9,44 @@ "consensus-client-prysm-logo-alt": "Prysm 徽标", "consensus-client-teku-logo-alt": "Teku 徽标", "page-upgrades-answer-1": "在合并时,信标链作为一种工具来升级以太坊主网。", - "page-upgrades-answer-2": "合并后,以太坊完成了自身最重要的升级,从工作量证明转换为基于共识层的新型权益证明。", + "page-upgrades-answer-2": "借助合并,以太坊完成了自身最重要的升级,从工作量证明过渡到基于共识层的新型权益证明。", "page-upgrades-answer-4": "信标链用于开发以太坊目前采用的基于权益证明的共识。信标链以前独立于以太坊主网单独运行,因此开发者可以观察单独运行的共识机制,然后再使用它协调实际活动。", "page-upgrade-article-author-status": "状态", "page-upgrade-article-author-ethmerge": "以太坊合并", "page-upgrade-article-author-alchemy": "Alchemy", "page-upgrade-article-author-consensys": "Consensys", - "page-upgrade-article-author-delphi-digital": "特尔斐数据", - "page-upgrade-article-author-eip-4844": "Vitalik Buterin, Dankrad Feist, Diederik Loerakker, George Kadianakis, Matt Garnett, Mofi Taiwo", + "page-upgrade-article-author-delphi-digital": "Delphi Digital", + "page-upgrade-article-author-eip-4844": "Vitalik Buterin、Dankrad Feist、Diederik Loerakker、George Kadianakis、Matt Garnett、Mofi Taiwo", "page-upgrade-article-author-ethereum-foundation": "以太坊基金会", "page-upgrade-article-author-vitalik-buterin": "Vitalik Buterin", "page-upgrade-article-author-ethos-dev": "Ethos.dev", "page-upgrade-article-title-two-point-oh": "以太坊 2.0:信标链", - "page-upgrade-article-title-beacon-chain-explainer": "以太坊 2.0 信标链:一篇您需要优先阅读的解读文章", + "page-upgrade-article-title-beacon-chain-explainer": "以太坊 2.0 信标链:一篇需要优先阅读的解读文章", "page-upgrade-article-title-sharding-consensus": "分片共识", - "page-upgrade-article-title-sharding-is-great": "为什么分片技术很重要:从技术角度揭秘", + "page-upgrade-article-title-sharding-is-great": "为什么分片很重要:从技术角度揭秘", "page-upgrade-article-title-rollup-roadmap": "以卷叠为中心的路线图", "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "以太坊漫游指南", - "page-upgrade-article-title-eip-4844": "EIP-4844:分片 Blob 交易 (Proto-Danksharding)", + "page-upgrade-article-title-eip-4844": "EIP-4844:分片二进制大对象交易 (Proto-Danksharding)", "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding 常见问题", - "page-upgrade-article-title-sharding-das": "分片和数据可用性抽样 (DAS) 的解释", + "page-upgrade-article-title-sharding-das": "对分片和数据可用性采样 (DAS) 的解释", "page-upgrade-article-title-ethmerge": "以太坊合并", "page-upgrade-article-title-merge-is-coming": "合并即将到来", "page-upgrade-article-title-state-of-the-merge": "合并动态:2022 年以太坊合并为权益证明机制的最新情况", "page-upgrade-article-title-ropsten-merge-testnet": "Ropsten 测试网合并公告", "page-upgrade-article-title-execution-layer-specs": "执行层规范", "page-upgrade-article-title-consensus-layer-specs": "共识层规范", - "page-upgrade-article-title-engine-api-specs": "应用程序接口规范", + "page-upgrade-article-title-engine-api-specs": "引擎应用程序接口规范", "page-upgrades-beacon-chain-date": "信标链在 2020 年 12 月 1 日上线。", "page-upgrades-beacon-chain-desc": "信标链为以太坊带来了质押,并为未来的升级奠定了基础。信标链为新生的权益证明以太坊进行协调。", "page-upgrades-beacon-chain-estimate": "信标链已经上线", "page-upgrades-beacon-chain-title": "信标链", "page-upgrades-bug-bounty": "查看漏洞悬赏计划", - "page-upgrades-clients": "查看共识客户端(以前称为以太坊 2.0 客户端)", - "page-staking-deposit-contract-title": "确认存款合约地址", + "page-upgrades-clients": "查看共识客户端(以前称为“以太坊 2”客户端)", + "page-staking-deposit-contract-title": "检查存款合约地址", "page-upgrades-dive": "深入了解愿景", - "page-upgrades-dive-desc": "如何提升以太坊的可扩展性、安全性和可持续性?同时秉持以太坊的核心精神去中心化。", + "page-upgrades-dive-desc": "如何提升以太坊的可扩展性、安全性和可持续性?同时秉持以太坊的核心理念去中心化。", "page-upgrades-docking": "合并", - "page-upgrades-merge-answer-1": "2022 年 9 月 15 日以太坊过渡到权益证明共识之日即为合并之时。信标链并入主网,正式地废弃了以太坊的工作量证明,并将以太坊能源消耗降低了约 99.95%。", + "page-upgrades-merge-answer-1": "2022 年 9 月 15 日以太坊过渡到权益证明共识之日即为合并之时。信标链与主网合并,正式废弃了以太坊的工作量证明,并将以太坊能源消耗降低了约 99.95%。", "page-upgrades-merge-btn": "关于合并的更多信息", "page-upgrades-merge-desc": "以太坊主网与权益证明信标链合并,标志着高能耗挖矿的终结。", "page-upgrades-merge-estimate": "合并正在进行", @@ -55,52 +55,52 @@ "page-upgrades-explore-btn": "探索升级", "page-upgrades-get-involved": "参与升级以太坊", "page-upgrades-get-involved-2": "参与其中", - "page-upgrades-head-to-ethresearch": "访问 ethresear.ch", + "page-upgrades-head-to-ethresearch": "前往 ethresear.ch", "page-upgrades-help": "想要帮助以太坊升级吗?", - "page-upgrades-help-desc": "有很多机会可以参与以太坊的升级,帮助测试或者获得奖励。", - "page-upgrades-index-staking": "质押来了", - "page-upgrades-index-staking-desc": "以太坊升级的关键是引入质押。如果您希望使用您的以太币来帮助保证以太坊网络的安全,请参考以下指引。", + "page-upgrades-help-desc": "有很多机会可以评价和讨论以太坊升级,帮助测试甚至获得奖励。", + "page-upgrades-index-staking": "质押来临", + "page-upgrades-index-staking-desc": "以太坊升级的关键是引入质押。如果你希望使用你的以太币帮助保证以太坊网络的安全,请遵循以下步骤。", "page-upgrades-index-staking-learn": "了解质押", - "page-upgrades-index-staking-learn-desc": "信标链为以太坊引入了质押。如果你有以太币,你可以通过保护网络来做公益并在此过程中赚取更多以太币。", + "page-upgrades-index-staking-learn-desc": "信标链为以太坊引入了质押。如果你有以太币,你可以通过保护网络安全来做公益并在此过程中赚取更多以太币。", "page-upgrades-index-staking-step-1": "1. 用启动板进行设置", "page-upgrades-index-staking-step-1-btn": "访问质押启动板", - "page-upgrades-index-staking-step-1-desc": "想要参与以太坊的质押,您需要使用该启动板 - 它将带您了解整个过程。", + "page-upgrades-index-staking-step-1-desc": "想要参与以太坊的质押,你需要使用该启动板 - 它将带你了解整个过程。", "page-upgrades-index-staking-step-2": "2. 确认质押地址", "page-upgrades-index-staking-step-2-btn": "确认存款合约地址", - "page-upgrades-index-staking-step-2-desc": "在质押您的以太币之前,确保您的地址正确,而且必须已通过启动板完成设置。", + "page-upgrades-index-staking-step-2-desc": "在质押你的以太币之前,务必要核查地址是否正确,而且必须先通过启动板完成设置。", "page-upgrades-index-staking-sustainability": "更加可持续", - "page-upgrades-meta-desc": "以太坊升级的概述及其希望实现的愿景。", + "page-upgrades-meta-desc": "以太坊升级概述及希望实现的愿景。", "page-upgrades-meta-title": "以太坊升级(原“以太坊 2”)", "page-upgrades-proof-stake-link": "关于权益证明的更多信息", "page-upgrades-question-1-title": "升级什么时候上线?", "page-upgrades-question-1-desc": "以太坊正在逐步升级;这些升级项目有不同的上线日期。", - "page-upgrades-question-2-title": "信标链是一个独立的区块链吗?", - "page-upgrades-question-2-desc": "是的。用来升级以太坊主网的并行权益证明区块链称为信标链。现在只有一条区块链,由最初的以太坊区块链和信标链合并而成。", - "page-upgrades-question-3-answer-2a": "合并对去中心化应用程序开发者影响甚微 — 他们仍以相同的方式与以太坊交互。", + "page-upgrades-question-2-title": "信标链是一条独立的区块链吗?", + "page-upgrades-question-2-desc": "是的。用来升级以太坊主网的并行权益证明区块链称为信标链。现在只有一条区块链,由原先的以太坊区块链和信标链合并而成。", + "page-upgrades-question-3-answer-2a": "合并对去中心化应用程序开发者的影响甚微 — 他们仍以相同的方式与以太坊交互。", "page-upgrades-question-3-answer-2a-link": "合并与去中心化应用程序开发者", - "page-upgrades-question-3-answer-2b": "分片计划仍在开发中,但在设计时将考虑二层网络卷叠。", + "page-upgrades-question-3-answer-2b": "分片计划仍在制定中,但在设计时将考虑二层网络卷叠。", "page-upgrades-layer-2-rollups": "更多关于二层网络卷叠的信息", "page-upgrades-question-3-answer-3-link": "访问 ethresear.ch", - "page-upgrades-question-3-desc": "您现在不需要为这些升级做任何准备。", + "page-upgrades-question-3-desc": "你现在不需要为这些升级做任何准备。", "page-upgrades-question-3-title": "针对这些升级,我需要做什么准备?", "page-upgrades-question-4-answer-1": "目前,在你发送交易或使用去中心化应用程序时,使用的是执行层,也称为主网。", "page-upgrades-question-4-answer-3": "合并后,验证者通过权益证明机制保护整个网络的安全。", - "page-upgrades-question-4-answer-6": "任何人都可以通过质押他们的以太币成为一个验证者。", + "page-upgrades-question-4-answer-6": "任何人都可以通过质押他们的以太币成为验证者。", "page-upgrades-question-4-answer-7": "关于质押的更多信息", "page-upgrades-question-4-title": "什么是执行层?", "page-upgrades-question-4-desc": "合并前,以太坊区块链有时称为“以太坊 1”。此术语逐渐被“执行层”所取代。", - "page-upgrades-question-5-answer-1": "要想成为网络上的验证者,需要质押 32 个以太币。如果你没有 32 个以太币,或者不想质押那么多,可以加入质押池。质押池允许你进行少量质押并获得相应份额的奖励。", - "page-upgrades-question-5-desc": "您需要使用质押启动板或者加入一个质押池。", + "page-upgrades-question-5-answer-1": "要想成为网络上的验证者,需要质押 32 个以太币。如果你没有 32 个以太币,或者不想质押那么多,可以加入质押池。质押池允许你质押较少的以太币并获得相应份额的奖励。", + "page-upgrades-question-5-desc": "你需要使用质押启动板或者加入一个质押池。", "page-upgrades-question-5-title": "如何质押?", "page-upgrades-question-6-answer-3": "以太坊基金会的 Danny Ryan 负责定期更新社区信息:", - "page-upgrades-question-6-answer-4": "ConsenSys 的 Ben Edgington 每周会提供一份关于以太坊升级的简报:", - "page-upgrades-question-6-answer-5": "您也可以访问 ethresear.ch,参与以太坊研发的讨论。", + "page-upgrades-question-6-answer-4": "ConsenSys 的 Ben Edgington 负责提供关于以太坊升级的每周简讯:", + "page-upgrades-question-6-answer-5": "你也可以访问 ethresear.ch,参与以太坊研发相关讨论。", "page-upgrades-question-6-title": "我需要对我的去中心化应用程序做什么?", "page-upgrades-question-6-desc": "合并旨在对去中心化应用程序开发者产生最小的影响,便仍有一些细微变化值得注意。", "page-upgrades-question-6-answer-1": "熟悉合并前以太坊的去中心化应用程序开发者应该注意到一些变化。这些变化包括区块结构和时序、一些操作码的变化,链上随机性的来源和时段最终确定的概念。", - "page-upgrades-question-6-answer-1-link": "合并如何影响以太坊的应用层", + "page-upgrades-question-6-answer-1-link": "合并如何影响以太坊的应用程序层", "page-upgrades-question-6-answer-2": "应用程序几乎完全未受影响。", - "page-upgrades-question-7-desc": "社区中很多不同的团队都在为以太坊的升级而努力。", + "page-upgrades-question-7-desc": "社区中很多不同的团队都在为以太坊的各项升级而努力。", "page-upgrades-question-7-lighthouse": "Lighthouse", "page-upgrades-question-7-lighthouse-lang": "(Rust 语言实现)", "page-upgrades-question-7-lodestar": "Lodestar", @@ -113,93 +113,93 @@ "page-upgrades-question-7-teku": "Teku", "page-upgrades-question-7-teku-lang": "(Java 语言实现)", "page-upgrades-question-7-title": "谁在构建以太坊升级?", - "page-upgrades-question-7-clients": "了解关于以太坊客户端的更多信息", - "page-upgrades-question-8-answer-1": "以太坊升级将帮助以太坊以去中心化的方式进行扩容,同时保证安全性,并提升可持续发展的能力。", - "page-upgrades-question-8-answer-2": "可能最显著的问题是,以太坊需要具有每秒处理超过 15-45 笔交易的能力。但是以太坊升级同时还能解决以太坊当前面临的一些其它问题。", - "page-upgrades-question-8-answer-3": "高需求时期的网络使得以太坊的使用成本高昂。面对以太坊的规模和它们的计算机必须处理的大量数据,网络中的节点苦苦挣扎。支撑以太坊安全和去中心化的原始算法消耗大量能源,该算法需要更加环保。", - "page-upgrades-question-8-answer-4": "以太坊的路线图上呈现了从 2015 年起正在发生的大量变化。但是当前环境使得升级变得更加紧迫。", + "page-upgrades-question-7-clients": "了解更多关于以太坊客户端的信息", + "page-upgrades-question-8-answer-1": "以太坊升级将帮助以太坊以去中心化的方式进行扩容,同时保证安全性,并提升可持续性。", + "page-upgrades-question-8-answer-2": "也许最显著的问题是,以太坊需要具有每秒处理超过 15-45 笔交易的能力。但是以太坊升级同时还能解决以太坊当前面临的一些其他问题。", + "page-upgrades-question-8-answer-3": "在高需求时间,网络让以太坊的使用成本高昂。面对以太坊的规模和网络上的计算机必须处理的大量数据,网络中的节点苦苦挣扎。支撑以太坊安全和去中心化的原始算法消耗大量能源,需要更加环保。", + "page-upgrades-question-8-answer-4": "从 2015 年起,正在发生的许多变化就已经出现在以太坊路线图中。但是当前环境使得升级变得更加紧迫。", "page-upgrades-question-8-answer-6": "探索以太坊的愿景", - "page-upgrades-question-8-desc": "我们当前正在使用的以太坊需要为终端用户和网络参与者提供更好的体验。", + "page-upgrades-question-8-desc": "我们当前使用的以太坊需要为最终用户和网络参与者提供更好的体验。", "page-upgrades-question-8-title": "为什么需要升级?", - "page-upgrades-question-9-answer-1": "当前您能发挥的最积极的作用是质押您的以太币。", - "page-upgrades-question-9-answer-2": "您还可以运行第二个客户端来提高客户端的密度。", - "page-upgrades-question-9-answer-3": "如果您有技术专长,可以帮忙查找新客户端的漏洞。", - "page-upgrades-question-9-answer-4": "您可以在 ethresear.ch 上和以太坊研究者进行各种技术方面的讨论。", - "page-upgrades-question-9-desc": "您不需要成为技术专家来为以太坊作出贡献。社区需要各种技能的同路人贡献自己的力量。", - "page-upgrades-question-9-stake-eth": "质押以太币", + "page-upgrades-question-9-answer-1": "当前你能发挥的最积极的作用是质押你的以太币。", + "page-upgrades-question-9-answer-2": "也许,你还想运行另一种客户端来提高客户端多样性。", + "page-upgrades-question-9-answer-3": "如果你有技术专长,可以帮忙查找新客户端的漏洞。", + "page-upgrades-question-9-answer-4": "你可以在 ethresear.ch 上和以太坊研究人员进行各种技术方面的讨论。", + "page-upgrades-question-9-desc": "你不需要成为技术专家来为以太坊作出贡献。社区需要各种技能的同路人贡献自己的力量。", + "page-upgrades-question-9-stake-eth": "质押ETH", "page-upgrades-question-9-title": "我如何为以太坊升级做贡献?", - "page-upgrades-question-9-more": "寻找更多的方式来参与以太坊的工作", + "page-upgrades-question-9-more": "寻找更多常规方式来参与以太坊的工作", "page-upgrades-question-10-title": "什么是“以太坊 2 阶段”?", "page-upgrades-question-10-desc": "这里发生了一些变化。", - "page-upgrades-question-10-answer-0": "“以太坊 2”这个词正在逐步被淘汰,因为它并不代表一个单一的升级或新的网络。更准确地说,它是“一组升级”,所有人都尽自己的力量使以太坊变得更可扩展、更安全和更可持续。您知道并热爱的网络,就叫做以太坊。", - "page-upgrades-question-10-answer-1": "我们不想过多谈论技术路线图的相关术语,因为这是软件:情况随时可能改变。我们觉得介绍当前正在发生的事情更易于您理解。", + "page-upgrades-question-10-answer-0": "“以太坊 2”这个词正在被逐步淘汰,因为它并不代表一个单一的升级或新的网络。更准确地说,它是“一组升级”,所有人都尽自己的力量使以太坊变得更加可扩展、更加安全和更加可持续。你知道并热爱的网络,就叫做以太坊。", + "page-upgrades-question-10-answer-1": "我们不想过多谈论技术路线图,因为这是软件:情况随时可能改变。我们觉得当你知道结果后,就更容易理解当前正在发生的事情。", "page-upgrades-question-10-answer-1-link": "查看相关升级", - "page-upgrades-question-10-answer-2": "如果您已经关注了相关讨论,这里呈现了相关升级将如何符合技术路线图以及它们如何变化的一些情况。", - "page-upgrades-question-10-answer-3": "阶段 0 描述了如何上线信标链的相关工作。", - "page-upgrades-question-10-answer-5": "第一阶段最初侧重于实现分片链,但后来首要任务改为 2022 年 9 月 15 日启动的合并。", - "page-upgrades-question-10-answer-6": "阶段 1.5 最初计划在主网作为最后一个分片链添加到信标链后继续跟进分片实施。然而,随着卷叠技术发展,以太坊社区加快了从工作量证明向权益证明的过渡。", - "page-upgrades-question-10-answer-7": "第二阶段的计划一直是深入研究和讨论的焦点。随着合并的完成以及二层网络解决方案的进步,目标已经变成提供一种更简洁的数据分片形式,从而最大限度地提高卷叠效率。目前二层网络支持扩展交易执行的能力,而分片将允许以低廉和可扩展的方式在一层网络存储这些数据的证明。", - "page-upgrades-question-10-answer-8": "关于以卷叠为中心的路线图的更多信息", - "page-upgrades-question-11-title": "我可以购买以太坊 2 吗?", + "page-upgrades-question-10-answer-2": "如果你一直在关注讨论,这里将介绍相关升级如何契合技术路线图以及它们如何变化。", + "page-upgrades-question-10-answer-3": "阶段 0 描述了信标链上线的相关工作。", + "page-upgrades-question-10-answer-5": "阶段 1 最初侧重于实现分片链,但后来首要任务改为 2022 年 9 月 15 日启动的合并。", + "page-upgrades-question-10-answer-6": "阶段 1.5 最初计划在主网作为最后一条分片链添加到信标链后继续跟进分片实现。然而,随着卷叠技术发展,以太坊社区加快了从工作量证明向权益证明的过渡。", + "page-upgrades-question-10-answer-7": "阶段 2 的计划一直是深入研究和讨论的焦点。随着合并的完成以及二层网络解决方案的进步,目标已经变成提供一种更简洁的数据分片形式,从而最大限度地提高卷叠效率。目前二层网络支持扩展交易执行的能力,而分片将允许以低廉和可扩展的方式在一层网络存储这些数据的证明。", + "page-upgrades-question-10-answer-8": "更多关于以卷叠为中心的路线图的信息", + "page-upgrades-question-11-title": "我可以购买以太坊 2 代币吗?", "page-upgrades-question-11-desc": "不能,没有以太坊 2 代币,合并后你的以太币没有改变。", - "page-upgrades-question-11-answer-1": "推动以太坊 2 重命名背后的因素之一是一种普遍的误解,即以太币持有者需要在合并或任何其他升级后将他们的以太币迁移到“以太坊 2.0”。这不是真的,从来都不是真的。", - "page-upgrades-question-11-answer-2": "这种混乱通常被骗子利用。", + "page-upgrades-question-11-answer-1": "推动以太坊 2 重命名背后的因素之一是一种普遍的误解,即以太币持有者需要在合并或任何其他升级后将他们的以太币迁移到“以太坊 2.0”。这不是真的,从来都不是。", + "page-upgrades-question-11-answer-2": "这种困惑情况通常被骗子利用。", "page-upgrades-question-title": "常见问题", - "page-upgrades-question3-answer-1": "以太币持有者不需要做任何事情。您的以太币不需要进行兑换或者升级。但可以预料的是,会有一些骗子告诉您需要这么做,请千万小心。", - "page-upgrades-scalable": "更可扩展", - "page-upgrades-scalable-desc": "以太坊需要支持每秒处理 1000 个交易,以使以太坊应用运行更快、更经济实惠。", - "page-upgrades-secure": "更安全", - "page-upgrades-secure-desc": "以太坊需要变得更安全。随着以太坊的应用越来越广泛,协议本身需要变得更加安全,以对抗各种形式的攻击。", - "page-upgrades-shard-date": "分片将在合并完成后于 2023 年至 2024 年的某个时间分多个阶段进行。", + "page-upgrades-question3-answer-1": "以太币持有者不需要做任何事情。你的以太币不需要进行兑换或者升级。但几乎可以确定的是,会有一些骗子告诉你需要这么做,请千万小心。", + "page-upgrades-scalable": "更加可扩展", + "page-upgrades-scalable-desc": "以太坊需要支持每秒处理 1000 笔交易,以使以太坊应用程序运行更快、更经济实惠。", + "page-upgrades-secure": "更加安全", + "page-upgrades-secure-desc": "以太坊需要变得更安全。随着以太坊的应用愈加广泛,协议本身需要变得更加安全,抵御各种形式的攻击。", + "page-upgrades-shard-date": "分片将在合并完成后于 2023 年至 2024 年的某个时间分阶段进行。", "page-upgrades-shard-desc": "Danksharding 将扩展以太坊的数据存储能力,并与二层网络融洽协作以扩展吞吐量并降低网络费用。Danksharding 将分多个阶段推出,第一个阶段是 ProtoDanksharding。", "page-upgrades-shard-estimate": "预计上线时间:2023-2024", "page-upgrades-shard-lower": "有关分片的更多信息", "page-upgrades-shard-title": "分片", - "page-upgrades-stay-up-to-date": "新闻", - "page-upgrades-stay-up-to-date-desc": "获得研究员和开发者关于以太坊升级工作的最新信息。", - "page-upgrades-sustainable-desc": "不久之前以太坊还是能源密集型。过渡到权益证明让以太网能源消耗减少了 99.9% 以上。", + "page-upgrades-stay-up-to-date": "了解最新动态", + "page-upgrades-stay-up-to-date-desc": "从以太坊升级相关研究人员和开发者处了解最新动态。", + "page-upgrades-sustainable-desc": "不久之前以太坊还是能耗大户。过渡到权益证明让以太网能源消耗减少了 99.9% 以上。", "page-upgrades-take-part": "参与研究", - "page-upgrades-take-part-desc": "以太坊的研究者和爱好者聚在这里讨论研究成果,包括和升级相关的任何问题。", + "page-upgrades-take-part-desc": "以太坊的研究人员和爱好者齐聚于此,讨论研究成果,包括和以太坊升级相关的任何问题。", "page-upgrades-the-upgrades": "以太坊升级", "page-upgrades-the-upgrades-desc": "以太坊的升级旨在提高网络的可扩展性、安全性和可持续性。以太坊最近在安全性和可持续性方面进行了一些重大升级,未来还会有更多升级,特别是在可扩展性方面。", - "page-upgrades-unofficial-roadmap": "这不是官方的路线图。这是我们从正在发生的视角汇总的信息。但是技术无时无刻不在变化。因此请不要把它看做一份承诺。", - "page-upgrades-upgrade-desc": "依然是那个我们熟悉和深爱的以太坊,只是更可扩展、更安全、更可持续。", + "page-upgrades-unofficial-roadmap": "这不是官方路线图,而是我们根据获得的信息得出的对正在进行的升级的看法。但是技术无时无刻不在变化。因此请不要把它看做一份承诺。", + "page-upgrades-upgrade-desc": "依然是那个我们熟悉和深爱的以太坊,只是更加可扩展、更加安全、更加可持续。", "page-upgrades-upgrades": "以太坊升级", "page-upgrades-upgrades-aria-label": "以太坊升级菜单", "page-upgrades-upgrades-beacon-chain": "信标链", "page-upgrades-upgrades-guide": "以太坊升级指引", "page-upgrades-upgrades-docking": "合并", "page-upgrades-energy-consumption": "更多关于以太坊能源消耗的信息", - "page-upgrades-upgrading": "升级以太坊到一个重要的新高度", + "page-upgrades-upgrading": "将以太坊升级到重要的新高度", "page-roadmap-vision": "愿景", - "page-roadmap-vision-btn": "有关以太坊愿景的更多信息", + "page-roadmap-vision-btn": "更多关于以太坊愿景的信息", "page-roadmap-vision-desc": "为了让以太坊成为主流并造福全人类,我们需要让以太坊变得更加可扩展、更加安全和更加可持续。", "page-upgrades-what-happened-to-eth2-title": "“以太坊 2”发生了什么?", - "page-upgrades-what-happened-to-eth2-1": "“合并”前,术语“以太坊 2”经常使用,但现在它正在逐步被更精确的术语取代。", - "page-upgrades-what-happened-to-eth2-1-more": "关于合并的更多信息。", + "page-upgrades-what-happened-to-eth2-1": "“合并”前,“以太坊 2”一词经常使用,但现在它正在逐步被更准确的术语取代。", + "page-upgrades-what-happened-to-eth2-1-more": "更多关于合并的信息。", "page-upgrades-what-happened-to-eth2-2": "在合并了“以太坊 1”和“以太坊 2”后,不再有两条不同的以太坊区块链,而是只有一个以太坊。", "page-upgrades-what-happened-to-eth2-3": "为了减少混乱,社区更新了这些条款:", "page-upgrades-what-happened-to-eth2-3-1": "“以太坊 1”现在是处理交易和执行的“执行层”。", "page-upgrades-what-happened-to-eth2-3-2": "“以太坊 2”现在是处理权益证明共识的“共识层”。", "page-upgrades-what-happened-to-eth2-4": "这些术语的更新仅会改变命名约定;不会改变以太坊的目标及路线图。", - "page-upgrades-what-happened-to-eth2-5": "了解关于“以太坊 2”重命名的更多信息", - "page-upgrades-why-cant-we-just-use-eth2-title": "为什么我们不就使用以太坊 2?", + "page-upgrades-what-happened-to-eth2-5": "了解有关“以太坊 2”重命名的更多信息", + "page-upgrades-why-cant-we-just-use-eth2-title": "使用以太坊 2 就可以了,但为什么不呢?", "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "心理模型", - "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "以太坊 2 品牌的一个主要问题是为以太坊新用户创造了一种破碎的心理模型。他们会凭直觉认为以太坊 1 在前,以太坊 2 在后。或者以太坊 2 问世后,以太坊 1 就不复存在了。但这两种想法都不对。弃用术语“以太坊 2”,将来的用户就不会有这种心理模型的困扰。", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "以太坊 2 名称的一个主要问题是为以太坊新用户建立了一种破碎的心理模型。他们会凭直觉认为以太坊 1 在前,以太坊 2 在后。或者以太坊 2 问世后,以太坊 1 就不复存在了。但这两种想法都不对。弃用术语“以太坊 2”,将来的用户就不会有这种心理模型的困扰。", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "包容性", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "随着以太坊路线图的演变,以太坊 2.0 已然无法准确代表以太坊路线图。严谨准确的用词选择有助于让最广泛的受众了解以太坊上的内容。", - "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "预防诈骗", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "防范诈骗", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "遗憾的是,恶意行为者尝试利用“以太坊 2”这一误称来欺骗用户,告诉他们用以太币兑换“以太坊 2”代币,或者要在以太坊 2 升级之前必须以某种方式迁移以太币。我们希望此次术语更新能够澄清事实,消除这种骗局要素,打造更安全的生态系统。", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "澄清质押", - "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "有些质押运营商还使用“以太坊 2”自动收报机代表在信标链上质押的以太币。由于这些服务的用户实际上并不会收到“以太坊 2”代币,因此可能会造成混乱。不存在所谓的“以太坊 2”代币;那仅代表用户在特定运营商质押中的份额。", - "page-upgrades-what-to-do": "您需要做什么?", - "page-upgrades-what-to-do-desc": "如果您是一个去中心化应用程序用户或者以太币持有者,您不需要做任何事情。如果您是一个开发者或者想要参与质押,这里有一些帮助您参与其中的指引。", + "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "有些质押运营商还使用“以太坊 2”名称代表在信标链上质押的以太币。由于这些服务的用户实际上并不会收到“以太坊 2”代币,因此可能会造成混乱。不存在所谓的“以太坊 2”代币;那仅代表用户在特定运营商质押中的份额。", + "page-upgrades-what-to-do": "你需要做什么?", + "page-upgrades-what-to-do-desc": "如果你是一名去中心化应用程序用户或者以太币持有者,你不需要做任何事情。如果你是一位开发者或者想要参与质押,这里有一些帮助你参与其中的指引。", "page-upgrades-whats-next": "什么是以太坊升级?", - "page-upgrades-whats-next-desc": "以太坊路线图涉及一系列相互关联的协议升级,其目标是使得以太坊更可扩展、更安全以及更可持续。这些升级由以太坊生态系统里的多个团队共同开发。", - "page-upgrades-whats-next-history": "了解之前以太坊升级的信息", + "page-upgrades-whats-next-desc": "以太坊路线图包括一系列相互关联的协议升级,目标是使得以太坊更加可扩展、更加安全以及加更可持续。这些升级由以太坊生态系统中的多个团队开发。", + "page-upgrades-whats-next-history": "了解之前的以太坊升级", "page-upgrades-whats-ethereum": "等等,什么是以太坊?", "page-upgrades-whats-new": "以太坊下一步要做什么?", - "page-upgrades-security-link": "关于以太坊安全和预防诈骗的更多信息", + "page-upgrades-security-link": "更多关于安全和预防诈骗的信息", "page-staking-deposit-contract-staking-more-link": "关于质押的更多信息", "docs-nav-proof-of-stake": "权益证明", "docs-nav-proof-of-work": "工作量证明", diff --git a/src/intl/zh/template-usecase.json b/src/intl/zh/template-usecase.json index 070595ab787..0a7340efae5 100644 --- a/src/intl/zh/template-usecase.json +++ b/src/intl/zh/template-usecase.json @@ -7,7 +7,7 @@ "template-usecase-dropdown-desci": "去中心化科学 (DeSci)", "template-usecase-dropdown-refi": "再生金融(ReFi)", "template-usecase-dropdown": "以太坊使用案例", - "template-usecase-banner": "以太坊的用法不断开发和演进。添加任何您认为会使事情变得更清晰或更及时的信息。", + "template-usecase-banner": "以太坊的用法不断开发和演进。添加任何你认为会使事情变得更清晰或更及时的信息。", "template-usecase-edit-link": "编辑页面", "template-usecase-dropdown-aria": "使用案例下拉菜单" } diff --git a/src/lib/api/calendarEvents.ts b/src/lib/api/calendarEvents.ts index f57b71a06c0..b268666da9d 100644 --- a/src/lib/api/calendarEvents.ts +++ b/src/lib/api/calendarEvents.ts @@ -30,7 +30,6 @@ export async function fetchCommunityEvents(): Promise date: event.start.dateTime, title: event.summary, calendarLink: event.htmlLink, - pastEventLink: event.location, } }) const upcomingEventData = futureEventsReqData @@ -41,7 +40,6 @@ export async function fetchCommunityEvents(): Promise date: event.start.dateTime, title: event.summary, calendarLink: event.htmlLink, - pastEventLink: event.location, } }) diff --git a/src/lib/api/ghRepoData.ts b/src/lib/api/ghRepoData.ts index 019c52244f2..51c0ea14429 100644 --- a/src/lib/api/ghRepoData.ts +++ b/src/lib/api/ghRepoData.ts @@ -89,13 +89,12 @@ const frameworksList: Array = [ }, { id: "scaffoldeth", - url: "https://github.com/austintgriffith/scaffold-eth", - githubUrl: "https://github.com/austintgriffith/scaffold-eth", + url: "https://scaffoldeth.io/", + githubUrl: "https://github.com/scaffold-eth/scaffold-eth-2", background: "#ffffff", - name: "scaffold-eth", - description: - "page-developers-local-environment:page-local-environment-scaffold-eth-desc", - alt: "page-developers-local-environment:page-local-environment-scaffold-eth-logo-alt", + name: "Scaffold-ETH-2", + description: "page-developers-local-environment:page-local-environment-scaffold-eth-desc", + alt: "page-local-environment-scaffold-eth-logo-alt", image: ScaffoldEthImage, }, { diff --git a/src/lib/fonts.ts b/src/lib/fonts.ts index d8e8bea0b26..a0f92f997ed 100644 --- a/src/lib/fonts.ts +++ b/src/lib/fonts.ts @@ -1,13 +1,16 @@ -import { Inter } from "next/font/google" -import { IBM_Plex_Mono } from "next/font/google" +import localFont from "next/font/local" -export const inter = Inter({ - subsets: ["latin"], +// downloaded from https://fonts.google.com/specimen/Inter +export const inter = localFont({ + src: "../fonts/Inter-VariableFont_slnt,wght.ttf", + display: "swap", fallback: ["sans-serif"], }) -export const mono = IBM_Plex_Mono({ - subsets: ["latin"], - weight: ["400"], +// downloaded from https://fonts.google.com/specimen/IBM+Plex+Mono +export const mono = localFont({ + src: "../fonts/IBMPlexMono-Regular.ttf", + display: "swap", + weight: "400", fallback: ["Courier", "monospace"], }) diff --git a/src/lib/interfaces.ts b/src/lib/interfaces.ts index 87f41b8ca02..1b47a02b0b5 100644 --- a/src/lib/interfaces.ts +++ b/src/lib/interfaces.ts @@ -184,7 +184,6 @@ export interface CommunityEvent { date: string title: string calendarLink: string - pastEventLink?: string } export interface ReqCommunityEvent { diff --git a/src/lib/types.ts b/src/lib/types.ts index e6c2cc631d4..2e9cd328717 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -346,3 +346,12 @@ export type StatsBoxMetric = { apiUrl: string apiProvider: string } + +export type CommunityConference = { + title: string + to: string + location: string + description: string + startDate: string + endDate: string +} \ No newline at end of file diff --git a/src/pages/layer-2.tsx b/src/pages/layer-2.tsx index 4b497f9a603..23c1b508ce9 100644 --- a/src/pages/layer-2.tsx +++ b/src/pages/layer-2.tsx @@ -665,7 +665,7 @@ const Layer2Page = () => { - Vitalik Buterin - + {t("an-incomplete-guide-to-rollups")} {" "} - Vitalik Buterin diff --git a/src/pages/run-a-node.tsx b/src/pages/run-a-node.tsx index 3e1e98de58c..3f6bdd4a373 100644 --- a/src/pages/run-a-node.tsx +++ b/src/pages/run-a-node.tsx @@ -833,7 +833,7 @@ const RunANodePage = () => {

  • - + {t("page-run-a-node-further-reading-3-link")} {" "} -{" "} diff --git a/src/pages/staking/index.tsx b/src/pages/staking/index.tsx index 99443375eb3..385d4e7bb29 100644 --- a/src/pages/staking/index.tsx +++ b/src/pages/staking/index.tsx @@ -672,7 +672,7 @@ const StakingPage = ({

    {tocItems.further.title}

    • - + {t("page-staking-further-reading-1-link")} {" "} -{" "} @@ -690,7 +690,7 @@ const StakingPage = ({
    • - + {t("page-staking-further-reading-3-link")} {" "} -{" "} diff --git a/yarn.lock b/yarn.lock index 21e666ac654..765a7cd1c50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6070,6 +6070,11 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chromatic@^10.5.0: + version "10.5.0" + resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-10.5.0.tgz#85349cccb30d2d004668fdd33314f701300fc72e" + integrity sha512-fOdncJpF/JxRKhNyKwkxw08tVyqF+SJq/TI9cEEUgqip/+KHDfW4U0fy2U1C+RXuJefN6FgqOflsEUoURNBmGg== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" From e14a3a55bf5463eb0e889f1a650989f5beb27419 Mon Sep 17 00:00:00 2001 From: Crostons Date: Fri, 26 Jan 2024 11:52:06 +0530 Subject: [PATCH 095/478] Changes history/docs --- public/content/history/index.md | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/public/content/history/index.md b/public/content/history/index.md index 63d04575319..f04dfd1f1c3 100644 --- a/public/content/history/index.md +++ b/public/content/history/index.md @@ -172,6 +172,20 @@ Altair was the first major network upgrade that had an exact rollout time. Every The London upgrade introduced [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), which reformed the transaction fee market, along with changes to how gas refunds are handled and the [Ice Age](/glossary/#ice-age) schedule. +#### What was the London Upgrade / EIP-1559? + +Before the London Upgrade, Ethereum had fixed-sized blocks. In times of high network demand, these blocks operated at full capacity. As a result, users often had to wait for demand to reduce to get included in a block, which led to a poor user experience. The London Upgrade introduced variable-sized blocks to Ethereum. + +The way transaction fees on the Ethereum network were calculated changed with [the London Upgrade](/history/#london) of August 2021. Before the London upgrade, fees were calculated without separating `base` and `priority` fees, as follows: + +Let's say Alice had to pay Bob 1 ETH. In the transaction, the gas limit is 21,000 units, and the gas price is 200 gwei. + +The total fee would have been: `Gas units (limit) * Gas price per unit` i.e `21,000 * 200 = 4,200,000 gwei` or 0.0042 ETH + +The implementation of [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) in the London Upgrade made the transaction fee mechanism more complex, but made gas fees more predictable, resulting in a more efficient transaction fee market. Users can submit transactions with a `maxFeePerGas` corresponding to how much they are willing to pay for the transaction to be executed, knowing that they will not pay more than the market price for gas (`baseFeePerGas`), and get any extra, minus their tip, refunded. + +This video explains EIP-1559 and the benefits it brings:[![EIP-1559 Explained]](https://www.youtube.com/watch?v=MGemhK9t44Q) + - [Are you a dapp developer? Be sure to upgrade your libraries and tooling.](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/london-ecosystem-readiness.md) - [Read the Ethereum Foundation announcement](https://blog.ethereum.org/2021/07/15/london-mainnet-announcement/) - [Read the Ethereum Cat Herder's explainer](https://medium.com/ethereum-cat-herders/london-upgrade-overview-8eccb0041b41) @@ -188,24 +202,6 @@ The London upgrade introduced [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559 - - -Before the London Upgrade, Ethereum had fixed-sized blocks. In times of high network demand, these blocks operated at full capacity. As a result, users often had to wait for demand to reduce to get included in a block, which led to a poor user experience. The London Upgrade introduced variable-sized blocks to Ethereum. - -The way transaction fees on the Ethereum network were calculated changed with [the London Upgrade](/history/#london) of August 2021. Before the London upgrade, fees were calculated without separating `base` and `priority` fees, as follows: - -Let's say Alice had to pay Bob 1 ETH. In the transaction, the gas limit is 21,000 units, and the gas price is 200 gwei. - -The total fee would have been: `Gas units (limit) * Gas price per unit` i.e `21,000 * 200 = 4,200,000 gwei` or 0.0042 ETH - -The implementation of [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) in the London Upgrade made the transaction fee mechanism more complex, but made gas fees more predictable, resulting in a more efficient transaction fee market. Users can submit transactions with a `maxFeePerGas` corresponding to how much they are willing to pay for the transaction to be executed, knowing that they will not pay more than the market price for gas (`baseFeePerGas`), and get any extra, minus their tip, refunded. - -This video explains EIP-1559 and the benefits it brings: - - - - - --- ### Berlin {#berlin} From 55fa6e0aad2f5bbc51920802d6cebd2a8686f9ff Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 26 Jan 2024 06:24:50 -0800 Subject: [PATCH 096/478] fix: search modal scroll position and overlay maintain scroll position when closing search modal, fix modal overlay to screen --- src/components/Search/SearchModal.tsx | 3 ++- src/components/Search/utils.ts | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/components/Search/SearchModal.tsx b/src/components/Search/SearchModal.tsx index b8bf2b03a82..5b4923b5913 100644 --- a/src/components/Search/SearchModal.tsx +++ b/src/components/Search/SearchModal.tsx @@ -9,9 +9,10 @@ type ModalPropsNoScroll = Omit const DocSearchModalWithChakra = chakra( (props: ModalPropsNoScroll & { className?: string }) => { const { className, ...docModalProps } = props + const windowScrollY = typeof window === "undefined" ? 0 : window.scrollY return (
      - +
      ) } diff --git a/src/components/Search/utils.ts b/src/components/Search/utils.ts index e883735df91..1496b3dcb37 100644 --- a/src/components/Search/utils.ts +++ b/src/components/Search/utils.ts @@ -74,6 +74,11 @@ export const getSearchModalStyles = (): SystemStyleObject => ({ "--docsearch-modal-width": "650px", "--docsearch-hit-height": "fit-content", + ".DocSearch.DocSearch-Container": { + position: "fixed", + inset: 0, + }, + ".DocSearch-SearchBar": { p: { base: 4, md: 8 }, pb: 4, @@ -103,10 +108,9 @@ export const getSearchModalStyles = (): SystemStyleObject => ({ }, }, - ".DocSearch-Container--Stalled .DocSearch-MagnifierLabel, .DocSearch-Container--Stalled .DocSearch-LoadingIndicator": - { - color: "primary.highContrast", - }, + ".DocSearch-Container--Stalled .DocSearch-MagnifierLabel, .DocSearch-Container--Stalled .DocSearch-LoadingIndicator": { + color: "primary.highContrast", + }, ".DocSearch-Dropdown": { ps: { base: 4, md: 8 }, From 9f82ccf6c613026beaeaee33bd5338357a9b4e9a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 26 Jan 2024 08:57:16 -0800 Subject: [PATCH 097/478] style: update progress bar and active colors --- src/components/LanguagePicker.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index 91e37691a4a..f8ec95751df 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -70,11 +70,16 @@ const Progress = ({ value }: Pick) => ( h="0.5" w="full" bg="body.light" - sx={{ + _groupHover={{ "[role=progressbar]": { backgroundColor: "primary.highContrast", }, }} + sx={{ + "[role=progressbar]": { + backgroundColor: "body.medium", + }, + }} /> ) @@ -264,7 +269,7 @@ const LanguagePicker = ({ locale={browserLocale as Lang} onClick={onMenuClose} > - + {browserLocaleInfo.targetName} Date: Sat, 27 Jan 2024 12:54:29 -0800 Subject: [PATCH 098/478] feat: enable multiple browser preferences style: display translation progress numbers in browser preference list --- src/components/LanguagePicker.tsx | 126 +++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 38 deletions(-) diff --git a/src/components/LanguagePicker.tsx b/src/components/LanguagePicker.tsx index f8ec95751df..8c02e96b90b 100644 --- a/src/components/LanguagePicker.tsx +++ b/src/components/LanguagePicker.tsx @@ -192,20 +192,49 @@ const LanguagePicker = ({ .includes(filterValue.toLowerCase()) ) - // Get the preferred language for the users browser - const [navLang, setNavLang] = useState("") + // Get the preferred languages for the users browser + const [navLangs, setNavLangs] = useState([]) useEffect(() => { - setNavLang(navigator.language.toLowerCase()) + setNavLangs(Array.from(navigator.languages)) }, []) - const browserLocale = locales?.reduce((acc, cur) => { - if (cur.toLowerCase() === navLang) return cur - if (navLang.includes(cur.toLowerCase()) && acc !== navLang) return cur - return acc - }, "") - const browserLocaleInfo = displayNames.find( - ({ localeOption }) => localeOption === browserLocale + + // For each browser preference, reduce to the most specific match found in `locales` array + const allBrowserLocales: Lang[] = navLangs + .map( + (navLang) => + locales?.reduce((acc, cur) => { + if (cur.toLowerCase() === navLang) return cur + if (navLang.includes(cur.toLowerCase()) && acc !== navLang) return cur + return acc + }, "") as Lang + ) + .filter((i) => !!i) // Remove those without matches + + // Remove duplicate matches + const browserLocales: Lang[] = Array.from(new Set(allBrowserLocales)) + + // Get display info for each browser locale + const browserLocalesInfo: LocaleDisplayInfo[] = browserLocales.map( + (browserLocale) => { + const item = displayNames.find( + ({ localeOption }) => localeOption === browserLocale + ) + if (!item) + throw new Error("Missing browser locale info for " + browserLocale) + return item + } ) + const getProgressInfo = (approvalProgress: number, wordsApproved: number) => { + const percentage = new Intl.NumberFormat(locale!, { + style: "percent", + }).format(approvalProgress / 100) + const progress = + approvalProgress === 0 ? "<" + percentage.replace("0", "1") : percentage + const words = new Intl.NumberFormat(locale!).format(wordsApproved) + return { progress, words } + } + return ( - {browserLocaleInfo && ( + {browserLocalesInfo.length > 0 && ( <> - Browser language + Browser{" "} + {browserLocalesInfo.length === 1 + ? "language" + : "languages"} - - - {browserLocaleInfo.targetName} - - - {browserLocaleInfo.sourceName} - - - + {browserLocalesInfo.map( + ({ + localeOption, + targetName, + sourceName, + approvalProgress, + wordsApproved, + }) => { + const { progress, words } = getProgressInfo( + approvalProgress, + wordsApproved + ) + return ( + + + {targetName} + + + {sourceName} + + + {progress} translated • {words} words + + + + ) + } + )} )} @@ -327,14 +383,8 @@ const LanguagePicker = ({ index ) => { const firstResult = index === 0 - const percentage = new Intl.NumberFormat(locale!, { - style: "percent", - }).format(approvalProgress / 100) - const progress = - approvalProgress === 0 - ? "<" + percentage.replace("0", "1") - : percentage - const words = new Intl.NumberFormat(locale!).format( + const { progress, words } = getProgressInfo( + approvalProgress, wordsApproved ) return ( From e4a0bb5ba25b1b20b5ee6c9d4bbdc26ca90a5ead Mon Sep 17 00:00:00 2001 From: Adri Date: Mon, 29 Jan 2024 14:37:15 +0100 Subject: [PATCH 099/478] Update community-meetups.json Add Web3 Family in Barcelona --- src/data/community-meetups.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/data/community-meetups.json b/src/data/community-meetups.json index 89ad32bd63f..372199f8474 100644 --- a/src/data/community-meetups.json +++ b/src/data/community-meetups.json @@ -1,4 +1,10 @@ [ + { + "title": "Web3 Fanmily", + "emoji": ":es:", + "location": "Barcelona", + "link": "https://www.meetup.com/web3family/" + }, { "title": "CryptoCanal", "emoji": ":nl:", From 28d7477f1401bb0d58200012ce8a5ad8f9ae6208 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:32:29 -0800 Subject: [PATCH 100/478] build: yarn add @ark-ui/react --- package.json | 1 + yarn.lock | 730 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 729 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e1a8de9b7c7..59288055872 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "markdown-checker": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/markdownChecker.ts" }, "dependencies": { + "@ark-ui/react": "^1.3.0", "@chakra-ui/next-js": "^2.1.5", "@chakra-ui/react": "^2.8.0", "@crowdin/crowdin-api-client": "^1.25.0", diff --git a/yarn.lock b/yarn.lock index 765a7cd1c50..9867c366500 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,6 +146,85 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@ark-ui/anatomy@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ark-ui/anatomy/-/anatomy-1.3.0.tgz#fabbbf9ebf42dde8e010a69eaed6ae45d0c8116e" + integrity sha512-1yG2MrzUlix6KthjQMCNiHnkXrWwEdFAX6D+HqGJaNu0XvaGul2J+wDNtjsdX+gxiWu1nXXEEOAWlFVYMUf65w== + dependencies: + "@zag-js/accordion" "0.32.1" + "@zag-js/anatomy" "0.32.1" + "@zag-js/avatar" "0.32.1" + "@zag-js/carousel" "0.32.1" + "@zag-js/checkbox" "0.32.1" + "@zag-js/color-picker" "0.32.1" + "@zag-js/color-utils" "0.32.1" + "@zag-js/combobox" "0.32.1" + "@zag-js/date-picker" "0.32.1" + "@zag-js/date-utils" "0.32.1" + "@zag-js/dialog" "0.32.1" + "@zag-js/editable" "0.32.1" + "@zag-js/file-upload" "0.32.1" + "@zag-js/hover-card" "0.32.1" + "@zag-js/menu" "0.32.1" + "@zag-js/number-input" "0.32.1" + "@zag-js/pagination" "0.32.1" + "@zag-js/pin-input" "0.32.1" + "@zag-js/popover" "0.32.1" + "@zag-js/presence" "0.32.1" + "@zag-js/progress" "0.32.1" + "@zag-js/radio-group" "0.32.1" + "@zag-js/rating-group" "0.32.1" + "@zag-js/select" "0.32.1" + "@zag-js/slider" "0.32.1" + "@zag-js/splitter" "0.32.1" + "@zag-js/switch" "0.32.1" + "@zag-js/tabs" "0.32.1" + "@zag-js/tags-input" "0.32.1" + "@zag-js/toast" "0.32.1" + "@zag-js/toggle-group" "0.32.1" + "@zag-js/tooltip" "0.32.1" + +"@ark-ui/react@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ark-ui/react/-/react-1.3.0.tgz#5189c85052b324a50052a18f00564ba3ee7df4b6" + integrity sha512-JHjNoIX50+mUCTaEGMjfGQWGGi31pKsV646jZJlR/1xohpYJigzg8BvO97cTsVk8fwtur+cm11gz3Nf7f5QUnA== + dependencies: + "@ark-ui/anatomy" "1.3.0" + "@zag-js/accordion" "0.32.1" + "@zag-js/avatar" "0.32.1" + "@zag-js/carousel" "0.32.1" + "@zag-js/checkbox" "0.32.1" + "@zag-js/color-picker" "0.32.1" + "@zag-js/color-utils" "0.32.1" + "@zag-js/combobox" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/date-picker" "0.32.1" + "@zag-js/date-utils" "0.32.1" + "@zag-js/dialog" "0.32.1" + "@zag-js/editable" "0.32.1" + "@zag-js/file-upload" "0.32.1" + "@zag-js/hover-card" "0.32.1" + "@zag-js/menu" "0.32.1" + "@zag-js/number-input" "0.32.1" + "@zag-js/pagination" "0.32.1" + "@zag-js/pin-input" "0.32.1" + "@zag-js/popover" "0.32.1" + "@zag-js/presence" "0.32.1" + "@zag-js/progress" "0.32.1" + "@zag-js/radio-group" "0.32.1" + "@zag-js/rating-group" "0.32.1" + "@zag-js/react" "0.32.1" + "@zag-js/select" "0.32.1" + "@zag-js/slider" "0.32.1" + "@zag-js/splitter" "0.32.1" + "@zag-js/switch" "0.32.1" + "@zag-js/tabs" "0.32.1" + "@zag-js/tags-input" "0.32.1" + "@zag-js/toast" "0.32.1" + "@zag-js/toggle-group" "0.32.1" + "@zag-js/tooltip" "0.32.1" + "@zag-js/types" "0.32.1" + "@aw-web-design/x-default-browser@1.4.126": version "1.4.126" resolved "https://registry.yarnpkg.com/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz#43e4bd8f0314ed907a8718d7e862a203af79bc16" @@ -2589,6 +2668,21 @@ dependencies: "@floating-ui/utils" "^0.1.3" +"@floating-ui/core@^1.5.3": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== + dependencies: + "@floating-ui/utils" "^0.2.1" + +"@floating-ui/dom@1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.4.tgz#28df1e1cb373884224a463235c218dcbd81a16bb" + integrity sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ== + dependencies: + "@floating-ui/core" "^1.5.3" + "@floating-ui/utils" "^0.2.0" + "@floating-ui/dom@^1.5.1": version "1.5.3" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" @@ -2609,6 +2703,11 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== +"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== + "@humanwhocodes/config-array@^0.11.13": version "0.11.13" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" @@ -2628,6 +2727,20 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@internationalized/date@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.1.tgz#14401139f70c1ef14b845d3cac8912e82e82adcc" + integrity sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ== + dependencies: + "@swc/helpers" "^0.5.0" + +"@internationalized/number@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.5.0.tgz#9de6018424b441a6545f209afa286ad7df4a2906" + integrity sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w== + dependencies: + "@swc/helpers" "^0.5.0" + "@ioredis/commands@^1.1.1": version "1.2.0" resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" @@ -4416,6 +4529,13 @@ dependencies: tslib "^2.4.0" +"@swc/helpers@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" + integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== + dependencies: + tslib "^2.4.0" + "@swc/types@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" @@ -5189,16 +5309,243 @@ "@types/emscripten" "^1.39.6" tslib "^1.13.0" +"@zag-js/accordion@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/accordion/-/accordion-0.32.1.tgz#76a55ae18239b1dd7b7ad7f5d408a3f225a66882" + integrity sha512-16beDVpEhXFQsQRMZLmHFruhGphSprJ5XrRu6+OM2U7aTulo1w3ENUd9uI+mIs4oTVO66lYI4Lp+dFcT2UUIYA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/anatomy@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/anatomy/-/anatomy-0.32.1.tgz#02741fcdcf3b6196e9795eaca01a2b239872d52d" + integrity sha512-bR+tfFfkbxwhBzGGjEQG+RUnbeCjMx7tWJxykGnGdVLwAh0wKTQBEfHEOCOQh5qU8RhKUieqemAdvc7oP3Tp4w== + +"@zag-js/aria-hidden@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/aria-hidden/-/aria-hidden-0.32.1.tgz#60b2f4ee5798433fb73fd5e7fdf3581a075e2795" + integrity sha512-kznwxvUUHDax8Kd7YNVVCzQcwGARTRaZNOcIkw7MTLE8g/pU+C4pYkwR9iqA7/8imGfjYrZfSsQqZRTb4bkS0g== + dependencies: + "@zag-js/dom-query" "0.32.1" + +"@zag-js/auto-resize@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/auto-resize/-/auto-resize-0.32.1.tgz#16d5abe6b83fdcc7399f22af8ff353ec5706f169" + integrity sha512-MO6N5gPs2xDKbFgrakn6LDWv1GgN8uhfwpsqchLJX+EaZVvLIz8cXFD+jDv3RjK+5GRWV4mIF+26SXuHRSt9Ug== + dependencies: + "@zag-js/dom-query" "0.32.1" + +"@zag-js/avatar@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/avatar/-/avatar-0.32.1.tgz#1a4cf53d40772404d5ca6043fefb195fb4c5a329" + integrity sha512-5P+95pkMX2Na4yljN1etdgYyA+3HPORjWKn0Y3JamkYIAqJwRFO+taEdSm/xcRkuT6aGA3luheUowjt8wZssyA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/mutation-observer" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/carousel@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/carousel/-/carousel-0.32.1.tgz#d2ceebdf1b41300489038ebc694e31a174e2a50a" + integrity sha512-S7dUrPtiLr42Fa+S3O18kqKVqSu2yuk67bqGDtppIZSaFOugYHK4feBkZqjKw+eF12NVRRVO2j+A40d3MvxbSA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/checkbox@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/checkbox/-/checkbox-0.32.1.tgz#60f5c010d5722ecda7916e17302a5bc148fe4f1c" + integrity sha512-5reRreGyDZ5IlBNd5m1QrYXCehVIl/pmfKMEcAfad5DcgCaHGv5j76eahxbKln/8TEdwz4eWzBrqNtwSkKL5+w== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/collection@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/collection/-/collection-0.32.1.tgz#13699df3ded3284982387064fbd09a1fa6a8de6b" + integrity sha512-dAzcVQ/n+xAYoxWB/65/CQinv66RNVuq5ig0fEYszBqP+HjFnOpeGkIrEvP+bFI38hFEViiGtfr6oGAsVByOVQ== + +"@zag-js/color-picker@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/color-picker/-/color-picker-0.32.1.tgz#b2ff4715faed4e94bf3eccc73592330c8fe60664" + integrity sha512-ov3FC+c2WBYmEGRXWFVb2jih2Ecejj5JqBjDL9iMLBs2KNY9jnpvtH7WnZbijNY+RMDBj+C/DNI7K2NVaamSIA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/color-utils" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/tabbable" "0.32.1" + "@zag-js/text-selection" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/color-utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/color-utils/-/color-utils-0.32.1.tgz#bfc877fece9cbe94a0be37cb95a3af4ed8d1e6f0" + integrity sha512-AzupfOD7oD0mE+H9roTzwnLqtw1wYiJGOQKLPAwdwPQdznJUQD6sMOpxR/6RBuITVTm8Bl12Mr4+7s29LVJruw== + dependencies: + "@zag-js/numeric-range" "0.32.1" + +"@zag-js/combobox@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/combobox/-/combobox-0.32.1.tgz#36b349e95effe7e8f7d474d8d4730c8484f44201" + integrity sha512-skz2C5UxLD5JoYNP4hcPaQJu2cW7vycKqjDNI9ZtygSkZHOHx+JxpYiACBnr1vqzXatIOuDQm/HUuWW9yOT4eA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/aria-hidden" "0.32.1" + "@zag-js/collection" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/mutation-observer" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/core@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/core/-/core-0.32.1.tgz#fa36544efe7b11f63df0956eb2f3ddbc46e2d9f0" + integrity sha512-F9F7920/CisoLWALQACIhqbMvemgbv86qBULJ+UEe+a/9XgGwPh9UGn/H/q5EWkNpgEapz2b3pl3ONgKmXsK1A== + dependencies: + "@zag-js/store" "0.32.1" + klona "2.0.6" + +"@zag-js/date-picker@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/date-picker/-/date-picker-0.32.1.tgz#062a36e0c0bdda4f34c6ccd83a8a1595cf9d1d8f" + integrity sha512-n/hYmF+/R4+NuyfPRzCgeuLT6LJihKSuKzK29STPWy3sC/tBBHiqhNv1/4UKbatHUJXdBW2XF+N8Rw08RffcFQ== + dependencies: + "@internationalized/date" "^3.5.1" + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/date-utils" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/live-region" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/text-selection" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/date-utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/date-utils/-/date-utils-0.32.1.tgz#3184aa6edfa0eee782ea3200dcd0787cb0f8a5eb" + integrity sha512-dbBDRSVr5pRUw3rXndyGuSshZiWqQI5JQO4D2KIFGkXzorj6WzoOpcO910Z7AdM/9cCAMpCjUrka8d8o9BpJBg== + +"@zag-js/dialog@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/dialog/-/dialog-0.32.1.tgz#d3da6fb4c4ced60e924dbda8453dbe99af8746ad" + integrity sha512-czp+qXcdAOM70SrvDo4gBpYZx6gS6HXyrpiptW3+EHa2eiCfc/Z2w+Nu+ZadOTEQGgNWlKlCLW7Ery0i9mMDsw== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/aria-hidden" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/remove-scroll" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + focus-trap "7.5.4" + +"@zag-js/dismissable@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/dismissable/-/dismissable-0.32.1.tgz#bd8cdf9d5d552b2e5b1867b6ebb36c894282087c" + integrity sha512-UIkG+9Eb5wrus2F2Dy4zqk0pwCV53sdnMYBxk9dpvDzBJHzW+InhVeg3UeKmPL8ELcYlhH/Bap99XCRJvxsXow== + dependencies: + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/interact-outside" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/dom-event@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/dom-event/-/dom-event-0.32.1.tgz#a7214ee83ba0eb50ea2fb1b601ef335298739f91" + integrity sha512-wN6f5Kkf7C/YFN3wbEG3gUockSebyy1fPNL2BuL4C8PIP8vOD14hnHTzZWg5yYfO+veybIAL38r8I46C+bOVBQ== + dependencies: + "@zag-js/text-selection" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/dom-query@0.16.0": version "0.16.0" resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.16.0.tgz#bca46bcd78f78c900064478646d95f9781ed098e" integrity sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ== +"@zag-js/dom-query@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.32.1.tgz#7a85cf3beb0600c2e1d5e3d5844f91028aab0073" + integrity sha512-u6hrQHQ0/dcUi6xJn8d2Mu1ClN4KZpPqOKrJFSaxadWjSy+x0qp48WY2CBQ6gZ3j8IwR/XjzU9bu9wY5jJfHgA== + +"@zag-js/editable@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/editable/-/editable-0.32.1.tgz#9969a0e82d2b07fada258d904c111c8de74f7218" + integrity sha512-QEGnfp2P9nWVp9vGNWtszspvQcF3KtBRToZrv5/DT30Mpo/uPDKtqijLs0SnB/W60ELzcIRhK4J9taGoK8O8uw== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/interact-outside" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/element-rect@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/element-rect/-/element-rect-0.32.1.tgz#2d933c4925328d0e5c9747ab84353517200212b2" + integrity sha512-tAmxgxU2LsByK8PIs/Cj6cBJ8xZCVXE9RoStxthhuPL7xKYUfZvFGuhHVOHTHd6sDKEqbj6K1ds/TGPuglIh4w== + "@zag-js/element-size@0.10.5": version "0.10.5" resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.10.5.tgz#a24bad2eeb7e2c8709e32be5336e158e1a1a174f" integrity sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w== +"@zag-js/element-size@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.32.1.tgz#4d6f4e776e88ff0c42471a26c4528f110c8070be" + integrity sha512-ACklufmJQpah2UqwZUlYFaKi6uWfZBeTghtbfYHcDfzRbg2Hni612v8L1JeS4vAgjeDpcdHQpXXR4AZSpGZgNw== + +"@zag-js/file-upload@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/file-upload/-/file-upload-0.32.1.tgz#3446c12b0ce28015b3ed7c855eb44e14fc116c93" + integrity sha512-cD0NRIDof9Vv2DemmnYe9ZPZxOZ6b8XZl8eq4G0e8+WLYtnRXyEURl8Dw0QJpfdDPQaHnnD4CNxPTQcLgP+9Sg== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/file-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/file-utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/file-utils/-/file-utils-0.32.1.tgz#061c0b69e8226532c5b0228c7d99a0ba0d8ca6bd" + integrity sha512-0PxTrljW51Lf9OCuYNlZuaLgF0v1NoVRzXa/osZ9HGceQjfo77R5G9u+/TP3u53W2PTxajEZ4eNzTibgpzNXFg== + "@zag-js/focus-visible@0.16.0": version "0.16.0" resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz#c9e53e3dbab0f2649d04a489bb379f5800f4f069" @@ -5206,6 +5553,375 @@ dependencies: "@zag-js/dom-query" "0.16.0" +"@zag-js/form-utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/form-utils/-/form-utils-0.32.1.tgz#7307e0257d9e9bfca04a5272caba8224bb5b3b99" + integrity sha512-OemLBlHCHHm7t8wNcf78FRudRA7FegSgsNEzAjrRTyx+lJztDyHRLaoyI1gCEIg+0Kzl2nMxjOl4MStGsDj8iw== + dependencies: + "@zag-js/mutation-observer" "0.32.1" + +"@zag-js/hover-card@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/hover-card/-/hover-card-0.32.1.tgz#e4e4e58f8ce7e905c4e8288aee4d30447d7697f7" + integrity sha512-k66YK0z0P4LuK78+jnRoUPxJiM9GA0sbEEz3oPlvcFVXMMwnRTPNIw1OjksfAPI+Nvgg7H6D3A+7HCdRI/oBjw== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/interact-outside@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/interact-outside/-/interact-outside-0.32.1.tgz#c95403bfdf55304534082c1f5294f01c36a20590" + integrity sha512-8zHuswfTAgfMCaQnp3N4WStvnL32VyxURafb21+mE4neAF/DaKfJHWnJpeUMG1Qh/eXsrMRBxVoX+nBMhHj9bg== + dependencies: + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/tabbable" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/live-region@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/live-region/-/live-region-0.32.1.tgz#9abdbdde9ee0555f4b136248bf5d67c2d1328818" + integrity sha512-6/9QMLVZbTRh/G6MoJc/auN8r5vjdY9vUgNT680C2LOa2vnRR5/y0DkIpVgttNh1rSenQ/eLEYxp8hQF1rIYNw== + dependencies: + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/menu@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/menu/-/menu-0.32.1.tgz#afa834530ba275e0b03ec812f38e09db1aeff2d0" + integrity sha512-IPsTljVF0N9xTwub1cpGl3GAG5ttAq3h38PdZERREzT3qRgw4v3K/I1TG2vIiDXgJz8UZzUKox6ZYdU7UIAkRA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/mutation-observer" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/rect-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/mutation-observer@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/mutation-observer/-/mutation-observer-0.32.1.tgz#342431293ffb821d1525442b64a6f08ee3a9b92e" + integrity sha512-/hlObxGnhAaYYVnwRJC227md0M3kSE6mO24vkqVGwq2GglS+u4zbVcBBUuWgHdMML+ZjIQrZuVycCBMfVlHq0g== + +"@zag-js/number-input@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/number-input/-/number-input-0.32.1.tgz#bcdd91d26a691fca37e92d12d34eb18166643465" + integrity sha512-atyIOvoMITb4hZtQym7yD6I7grvPW83UeMFO8hCQg3HWwd2zR4+63mouWuyMoWb4QrzVFRVQBaU8OG5xGlknEw== + dependencies: + "@internationalized/number" "^3.5.0" + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/mutation-observer" "0.32.1" + "@zag-js/number-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/number-utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/number-utils/-/number-utils-0.32.1.tgz#e43784358532ccfcc2af7f299b6fec755310a36d" + integrity sha512-x/nttU31TtFVTqFBM8e3ZH/0MCc+u15WAfk0rT6ESkoZcdb80rTzZVMokCKCUdpi/JdB1vjEeCLSnj+ig8oAIQ== + +"@zag-js/numeric-range@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/numeric-range/-/numeric-range-0.32.1.tgz#a7759f41a9b87b17d3c8364eb32df293df4466b8" + integrity sha512-1Qe2URTenlrdsWuArlnQ+v5bBH2mHZD3XsK6jYV+C2lgatVzdcoN4GCSNTiF7w+So6J+NTeLMkVHMGCW1Kzx1g== + +"@zag-js/pagination@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/pagination/-/pagination-0.32.1.tgz#b7d39b82483633eb92d361299b809ff114b31221" + integrity sha512-lhogzKxJnx5D2Xoni/xm5rkOuy15KWSxqBHVwe8+j5aSNqMy7+aRtEN2F2VQCDVL/v1fdciQvOCA9udm37kZ4w== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/pin-input@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/pin-input/-/pin-input-0.32.1.tgz#c6c426b0d04959976eae7c64f6d3f9781653aa33" + integrity sha512-d18cCXKUr7INL0Xm5KyIoiTRSNsPXfIlIEMl2HrAvM3r70wtEag0PmiDNA5NS2tB4LnnX0XowchGB4HsdFS/ng== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/popover@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/popover/-/popover-0.32.1.tgz#44327ae40dce2d8a16e3821fe7acf837fdaf32ba" + integrity sha512-B01if49v3crCjkvtSvIX4CBdT/475nj3DttOObc36s0YOxCEt3UihMITBD5JvIKwEqjZ6oU5t0sLcUYOqQ4f2A== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/aria-hidden" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/remove-scroll" "0.32.1" + "@zag-js/tabbable" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + focus-trap "7.5.4" + +"@zag-js/popper@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/popper/-/popper-0.32.1.tgz#bbe53adff6914cfd0b3e07dfb1ed066b741baf95" + integrity sha512-aQgogW1N4VreNACSQhXQoZeXtQQtB//FXUvt1CBnW2DtmZ6YkNnaAfn186Q2lkw2/T0chITRy3eYeviwMmMrqg== + dependencies: + "@floating-ui/dom" "1.5.4" + "@zag-js/dom-query" "0.32.1" + "@zag-js/element-rect" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/presence@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/presence/-/presence-0.32.1.tgz#6c8be7995749fb72b7b7ba7c5b2d7a3b1cfec039" + integrity sha512-8189QMUf/L1dztAZdurx18ZwPyWlq58Mrd+GdATSaf8JstgrI1ovzVs606inQghWptKHMsH7dUIaV9UkhbSx3Q== + dependencies: + "@zag-js/core" "0.32.1" + "@zag-js/types" "0.32.1" + +"@zag-js/progress@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/progress/-/progress-0.32.1.tgz#4025a053ce0f928bf6f70a48ab2b8cbbcdee962c" + integrity sha512-ClkQvNYnuIpKfAPUceZXY5E2m/3NnIm21cvHe4gAoJ88YdqEHd5rIRoHP63g8ET8Ct/2KkBRkgR+LrQnGQOomA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/radio-group@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/radio-group/-/radio-group-0.32.1.tgz#a5d0f78f388615289803c83aad4ca15ca52a3ae1" + integrity sha512-NvdSjwRF38qIh0oM68jERf71uiwV2JFTrGeQEs3EIqONzULwL6jR2p4P1wm3JJNBAkSYBKZMER5cVUUcqM3kjQ== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/element-rect" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/rating-group@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/rating-group/-/rating-group-0.32.1.tgz#2930f7308f7ea0a66167f60172222e46dcc9602b" + integrity sha512-RBaFRCw7P00bgTrEjUHT3h/OGRO8XmXKkQYqqhm1tsVbeTsT47iwHoc6XnMEiGBonaJDwN/J0oFasw7GNg5sow== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/react@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/react/-/react-0.32.1.tgz#180899ef682132348867e7bac9eab58e4afdf139" + integrity sha512-b1SB7hXXv1K6CmXkcy5Y7mb0YRWkyvulyhK8VW5O5hIAPuGxOTx70psmVeZbmVzhjdORCiro9jKx8Ec0LfolFg== + dependencies: + "@zag-js/core" "0.32.1" + "@zag-js/store" "0.32.1" + "@zag-js/types" "0.32.1" + proxy-compare "2.5.1" + +"@zag-js/rect-utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/rect-utils/-/rect-utils-0.32.1.tgz#3ca21ba3e7b2e8648d4446d1ddc154e376d4c8c1" + integrity sha512-cI07kgldjUZP+SLhXeG9VSl47nrENlC96Fs7jWcTfHj62rhdY8WsBJ0tiTztvwar9m1chwxXZwJowHN+nPIgDQ== + +"@zag-js/remove-scroll@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/remove-scroll/-/remove-scroll-0.32.1.tgz#f2f70dd32131cbd3ae7dbf186a4828bd14e7b3bc" + integrity sha512-LyXt2rNMSKb9MKeJRyKTgpk4R7jdA+9kEQTSG5qyA94jo1og7FVgA1W/E+pNkdxDEk1VplL768VU6y7E/L3DHg== + dependencies: + "@zag-js/dom-query" "0.32.1" + +"@zag-js/select@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/select/-/select-0.32.1.tgz#c6517110eb46b2cce4ad5dbefcae4a366d81a241" + integrity sha512-jSzmTKCN1Fk/ZDDWM8TVGOtwgpYUDgyceegjYT+hW1mmEetu4tQcEvAr0557NOzh8akqLvcVFbg/kMj0IriKAA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/collection" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dismissable" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/mutation-observer" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/tabbable" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/slider@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/slider/-/slider-0.32.1.tgz#1e5e9208987dab14263d4b64cbc0046b18c3cceb" + integrity sha512-iZSB3Y8/Maakxem0Ha3rBRa8AyAplhN5K50Bgz+wsv0VEzNNUmK4QgaTWReWd6SfeTRpnC5ftKCcfM2aQrLm6g== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/element-size" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/numeric-range" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/splitter@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/splitter/-/splitter-0.32.1.tgz#092c38c624bd33a166c9ce3eb66fbd20e4710654" + integrity sha512-NdHLUXtQAlnz6QpdPwcqZCqYul7LaVqsp0hgtXR2PN4HbH+VAaDfY76pUk6LBerUcykChGZvtM9U0A5FCo1x4A== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/number-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/store@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/store/-/store-0.32.1.tgz#390321175b3c5b3e509ecc9a31a650a86bc9e307" + integrity sha512-hKwzpqAPljw06oOI+eO+Is2udpmY9GsGfmdoqvZVYoK4f5sawpZY9EC/84tbK9QKWUDTbFS+0Ujc254GUThmDA== + dependencies: + proxy-compare "2.5.1" + +"@zag-js/switch@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/switch/-/switch-0.32.1.tgz#686882da59a75a499fc8a47cf98dfac5fca1ddd3" + integrity sha512-+5w/AtINA+jpORX1cuUrnyIFXrfjhqV7667EKK/zbPi0Pf1E10+TEihpfFjY6bgms9CSNWZVEb6w2f2C0PNBDA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + "@zag-js/visually-hidden" "0.32.1" + +"@zag-js/tabbable@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/tabbable/-/tabbable-0.32.1.tgz#a5e13bb68588867f2f79b5a1abeac9086bfe3211" + integrity sha512-fMXtVgBiX7z3Qmdv+McrfihiSkqsDbNX2nn3e63L7jdy9ZpgnR3jG9BwUZvv7hvzkuOAFhhdKgBYYT+fkBavGg== + dependencies: + "@zag-js/dom-query" "0.32.1" + +"@zag-js/tabs@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/tabs/-/tabs-0.32.1.tgz#52dca46927da66689dc17d52e2c9f825af29afd6" + integrity sha512-5l8/k2Pw9Kbfsvvx6HWcVqK7Ns7ca+nyPGLSZtZLMp/Zn2q3xSG32C1U3oDaYtQVIQSiEHdnMjw0C2v+CxGDMA== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/element-rect" "0.32.1" + "@zag-js/tabbable" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/tags-input@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/tags-input/-/tags-input-0.32.1.tgz#9e1283b5fa46af857d8d06bd0e1278bde9d59ea1" + integrity sha512-oliLhiMpRNbWFixHF+Oe7hySQBp7NKtL/s8rN5dLT1G1GFRMzuuht/QnmL1h8EoGGpTwaaokMo4zl4uVzHbwyw== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/auto-resize" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/form-utils" "0.32.1" + "@zag-js/interact-outside" "0.32.1" + "@zag-js/live-region" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/text-selection@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/text-selection/-/text-selection-0.32.1.tgz#0735405b31b5ed4a48493ec9d82cc783804f2c56" + integrity sha512-aK1uswWYF76PFoxGL+3HW/kth9uldFWSW4lOh89NfEcc6Ym7qS5B+P0HKJVM9DuQbihvQX9dyc9PvM7/LJTSRA== + dependencies: + "@zag-js/dom-query" "0.32.1" + +"@zag-js/toast@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/toast/-/toast-0.32.1.tgz#1047d768fd7fb1a52e3ab5fa7cd4a19caa2a920b" + integrity sha512-HrfVzFX7ANS9qOewCr8qOCbgko635bZxYKMv+ojjo4U/TtwkGb43+lVU7/qwZj0z18/OtXBH5YQjFwQZXg5x8g== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/toggle-group@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/toggle-group/-/toggle-group-0.32.1.tgz#10f9d432956c3f72318ca4732720573d39a4e510" + integrity sha512-MM1XI4J45rRCZiDHcMtZWud0+bWMu6IcMnrbd9oig330YAF3RzcjTlxX93YRY35F04OUMBq5el9qe3qc2vyMuw== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/tooltip@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/tooltip/-/tooltip-0.32.1.tgz#ddaee0b7af324ae7c3741b36739dd7a1eea40025" + integrity sha512-+rsmDYTELFBHoYKg5iKShGfRD3H9FJDaZRq915Uc9YnyePMXCnWRgnVp+lk3zI+FDgysQm67SDLRJsR24Iioqg== + dependencies: + "@zag-js/anatomy" "0.32.1" + "@zag-js/core" "0.32.1" + "@zag-js/dom-event" "0.32.1" + "@zag-js/dom-query" "0.32.1" + "@zag-js/popper" "0.32.1" + "@zag-js/types" "0.32.1" + "@zag-js/utils" "0.32.1" + +"@zag-js/types@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/types/-/types-0.32.1.tgz#21e1e21affafdabe005feb20f6620fca90f8553e" + integrity sha512-BLfqb+im4vtXXJqhd2ZUg/4LquEd1qPt9XN56XVjudGDTftN8n3EDpuail7VKxdL59W4jR7wW8lvl4sSgrQKWw== + dependencies: + csstype "3.1.3" + +"@zag-js/utils@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/utils/-/utils-0.32.1.tgz#7a1510635dd634c74e93809185d8acdbcc48eb60" + integrity sha512-jrcmWYcA3L6TO4fZbPFvpSGEy2Z/mbWt6bPQbmcVgq/BltSS0YxxfPl+eD+S/rZI9aneszwsr04Z5TpladFiVA== + +"@zag-js/visually-hidden@0.32.1": + version "0.32.1" + resolved "https://registry.yarnpkg.com/@zag-js/visually-hidden/-/visually-hidden-0.32.1.tgz#6580d852e9de0511bb3f9bb5e01a4a0a479be08e" + integrity sha512-Vzieo4vNulzY/0zqmVfeYW/LcFJp5xtEoyUgR1FBctH8uBPBRhTIEXxKtoMablW6/vccOVo7zcu0UrR5Vx+eYQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -6581,6 +7297,11 @@ csso@5.0.5: dependencies: css-tree "~2.2.0" +csstype@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + csstype@^3.0.2, csstype@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -7932,7 +8653,7 @@ focus-trap-react@^10.2.3: focus-trap "^7.5.4" tabbable "^6.2.0" -focus-trap@^7.5.4: +focus-trap@7.5.4, focus-trap@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.4.tgz#6c4e342fe1dae6add9c2aa332a6e7a0bbd495ba2" integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w== @@ -9357,7 +10078,7 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@^2.0.4: +klona@2.0.6, klona@^2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== @@ -11199,6 +11920,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-compare@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" + integrity sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA== + proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" From fcb7572a9d4ecdf996cf47df7e04f8cb185e05e1 Mon Sep 17 00:00:00 2001 From: Arian Hamdi Date: Tue, 30 Jan 2024 03:40:45 +0330 Subject: [PATCH 101/478] fix: feedback widget by modifying left property --- src/components/FeedbackWidget.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index ee6c7abf572..d9d35f0f6cc 100644 --- a/src/components/FeedbackWidget.tsx +++ b/src/components/FeedbackWidget.tsx @@ -43,7 +43,8 @@ const FixedDot = ({ boxShadow="tableItemBox" position="sticky" bottom={{ base: `${bottomOffset + 1}rem`, lg: 4 }} - ms="auto" + me="1rem" + left={`calc(100% - ${size})`} mt={{ lg: "inherit" }} insetEnd={4} zIndex={98} /* Below the mobile menu */ From f8f39d32d648c4eecc140d71e7bc6672086d195b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:37:58 -0800 Subject: [PATCH 102/478] build: updates types, add LvlRefs --- src/components/Nav/types.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/Nav/types.ts b/src/components/Nav/types.ts index f69c8f15c29..6fbd703d265 100644 --- a/src/components/Nav/types.ts +++ b/src/components/Nav/types.ts @@ -1,13 +1,14 @@ import { IconType } from "react-icons" +type LinkOnly = { href: string, items: never } +type ItemsOnly = { items: NavItem[], href: never } +type LinkXorItems = LinkOnly | ItemsOnly + export type NavItem = { label: string description: string - icon?: IconType -} & ( - | { items: NavItem[], href?: never } - | { href: string, items?: never } - ) + icon: IconType +} & LinkXorItems export type NavSectionKey = | "learn" @@ -24,4 +25,6 @@ export type NavSectionDetail = { export type NavSections = Record -export type Level = 1 | 2 | 3 | 4 +export type Level = 1 | "1" | 2 | "2" | 3 | "3" | 4 | "4" + +export type LvlRefs = Record<"lvl1" | "lvl2" | "lvl3", React.RefObject> From 0ae97948b8ea6c15f05da9ed815f145f8e8c1225 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 29 Jan 2024 19:39:49 -0800 Subject: [PATCH 103/478] feat: initial draft of ark-ui nav menu --- src/components/Nav/ArkMenu.tsx | 265 +++++++++++++++++++++++++++++++++ src/components/Nav/Menu.tsx | 6 +- src/components/Nav/index.tsx | 5 +- 3 files changed, 270 insertions(+), 6 deletions(-) create mode 100644 src/components/Nav/ArkMenu.tsx diff --git a/src/components/Nav/ArkMenu.tsx b/src/components/Nav/ArkMenu.tsx new file mode 100644 index 00000000000..bdd376971b4 --- /dev/null +++ b/src/components/Nav/ArkMenu.tsx @@ -0,0 +1,265 @@ +import { Fragment, useRef } from "react" +import { useRouter } from "next/router" +import { BsCircle } from "react-icons/bs" +import { MdChevronLeft, MdChevronRight } from "react-icons/md" +import { Menu, Portal } from "@ark-ui/react" +import { + Box, + calc, + Flex, + type FlexProps, + Grid, + Icon, + type IconProps, + ListItem, + Text, + UnorderedList, + useToken, +} from "@chakra-ui/react" + +import type { Lang } from "@/lib/types" + +import { Button } from "@/components/Buttons" +import Link from "@/components/Link" + +import { isLangRightToLeft } from "@/lib/utils/translations" +import { cleanPath } from "@/lib/utils/url" + +import { SECTION_LABELS } from "@/lib/constants" + +import type { Level, LvlRefs, NavItem, NavSections } from "./types" + +type NextChevronProps = IconProps & { + lvl: Level + isLink: boolean +} + +const NextChevron = ({ lvl, isLink, ...props }: NextChevronProps) => { + const { locale } = useRouter() + if (isLink) return undefined + const isRtl = isLangRightToLeft(locale! as Lang) + return ( + + ) +} + +type GetHoverActionsArgs = { + lvl: Level + index: number + href?: string +} + +type ItemProps = { + item: NavItem + lvl: Level + // index: number + // getHoverActions: (args: GetHoverActionsArgs) => Partial +} + +const Item = ({ + item, + lvl, +}: // index, +// getHoverActions, +ItemProps) => { + const { label, description, icon: CustomIcon, ...action } = item + const { asPath } = useRouter() + const isLink = !!action.href + const isActivePage = isLink && cleanPath(asPath) === action.href + // const hoverActions = getHoverActions({ lvl, index, href: action.href }) + // const { isActive: isHovered } = hoverActions + const minW = calc.subtract( + calc.multiply(useToken("sizes.container", "md"), 0.5), + useToken("space", 8) + ) // Half of `md` container (smallest desktop width) minus padding + if ((lvl as number) > 3) return null + return ( + + ) +} + +type LvlPortalProps = { + lvl: Level + refs: LvlRefs + items: NavItem[] +} +const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => ( + + + + {items.map((item) => { + const { label, description, icon: CustomIcon, ...action } = item + return ( + + {action.href ? ( + + + + ) : ( + + + + + + + )} + + ) + })} + + + +) + +type ArkMenuProps = FlexProps & { + sections: NavSections +} +const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { + const refs: LvlRefs = { + lvl1: useRef(null), + lvl2: useRef(null), + lvl3: useRef(null), + } + + return ( + <> + + {SECTION_LABELS.map((sectionKey) => { + const { label } = sections[sectionKey] + return ( + + + + + + + ) + })} + + + + + + + + ) +} + +export default ArkMenu diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx index e1e8c8cdace..c1d986a99aa 100644 --- a/src/components/Nav/Menu.tsx +++ b/src/components/Nav/Menu.tsx @@ -135,7 +135,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { position: "absolute", inset: 0, insetInlineEnd: isLink ? 0 : -1, - background: `var(--eth-colors-menu-lvl${lvl + 1}-background)`, + background: `var(--eth-colors-menu-lvl${lvl as number + 1}-background)`, borderStartStartRadius: "var(--eth-radii-base)", borderEndStartRadius: "var(--eth-radii-base)", borderStartEndRadius: isLink @@ -147,7 +147,7 @@ const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { zIndex: 0, }} transition={{ duration: 0.2 }} - layoutId={`menu-lvl${lvl + 1}-highlight`} + layoutId={`menu-lvl${lvl as number + 1}-highlight`} /> )} @@ -261,7 +261,7 @@ const Menu = ({ sections, ...props }: MenuProps) => { p: 4, me: 0, direction: "column", - zIndex: 1 - lvl, + zIndex: 1 - (lvl as number), }) const lvlAnimationProps = { diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 8a31d5df623..9d41dd65ab3 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -7,7 +7,6 @@ import { Flex, HStack, Icon, - Text, useColorModeValue, useDisclosure, } from "@chakra-ui/react" @@ -17,7 +16,7 @@ import { EthHomeIcon } from "../icons" import { BaseLink } from "../Link" import Search from "../Search" -import Menu from "./Menu" +import ArkMenu from "./ArkMenu" import MobileNavMenu from "./Mobile" import { useNav } from "./useNav" @@ -72,7 +71,7 @@ const Nav = () => { justifyContent={{ base: "flex-end", md: "space-between" }} ms={{ base: 3, xl: 8 }} > - + {/* Desktop */} From 34937e322d5b5a4b6f2c78619b7a5ba40ab5741a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 29 Jan 2024 20:36:19 -0800 Subject: [PATCH 104/478] refactor: enable highlighting, clean up --- src/components/Nav/ArkMenu.tsx | 122 ++++++++++++++++----------------- 1 file changed, 58 insertions(+), 64 deletions(-) diff --git a/src/components/Nav/ArkMenu.tsx b/src/components/Nav/ArkMenu.tsx index bdd376971b4..e6c06e5b15a 100644 --- a/src/components/Nav/ArkMenu.tsx +++ b/src/components/Nav/ArkMenu.tsx @@ -1,4 +1,5 @@ -import { Fragment, useRef } from "react" +import { Fragment, useRef, useState } from "react" +import { motion } from "framer-motion" import { useRouter } from "next/router" import { BsCircle } from "react-icons/bs" import { MdChevronLeft, MdChevronRight } from "react-icons/md" @@ -47,40 +48,29 @@ const NextChevron = ({ lvl, isLink, ...props }: NextChevronProps) => { ) } -type GetHoverActionsArgs = { - lvl: Level - index: number - href?: string -} - type ItemProps = { item: NavItem lvl: Level - // index: number - // getHoverActions: (args: GetHoverActionsArgs) => Partial } -const Item = ({ - item, - lvl, -}: // index, -// getHoverActions, -ItemProps) => { +const Item = ({ item, lvl }: ItemProps) => { const { label, description, icon: CustomIcon, ...action } = item const { asPath } = useRouter() const isLink = !!action.href const isActivePage = isLink && cleanPath(asPath) === action.href - // const hoverActions = getHoverActions({ lvl, index, href: action.href }) - // const { isActive: isHovered } = hoverActions + const [highlighted, setHighlighted] = useState(false) + const minW = calc.subtract( calc.multiply(useToken("sizes.container", "md"), 0.5), useToken("space", 8) ) // Half of `md` container (smallest desktop width) minus padding - if ((lvl as number) > 3) return null + return ( { - - - + + + ) From 30cba6cf8e5733081a123f707678a84982d9aec8 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:49:34 -0800 Subject: [PATCH 109/478] build: exclude ark-ui and zag-js from netlifty include only menu and portal components --- netlify.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/netlify.toml b/netlify.toml index 3e26ef59558..05314fb9485 100644 --- a/netlify.toml +++ b/netlify.toml @@ -22,4 +22,9 @@ "./src/intl/**/*", "!./public/**/*", "!./node_modules/@swc/core-linux-x64-musl/**/*", + "!./node_modules/@ark-ui/**/*", + "!./node_modules/@zag-js/**/*", + "./node_modules/@ark-ui/react/menu/**/*", + "./node_modules/@ark-ui/react/portal.*", + "./node_modules/@zag-js/menu/**/*", ] \ No newline at end of file From c9e23eeed5ca4179dd7e44b9444106a7ed175286 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:08:33 -0800 Subject: [PATCH 110/478] refactor: menu footer using Button and Grid components fixes https://github.com/ethereum/ethereum-org-website/pull/12006#issuecomment-1917353498 --- src/components/Nav/Mobile.tsx | 77 +++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index da09276d893..893cb7dbb93 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -1,8 +1,9 @@ import React, { Fragment, ReactNode, RefObject } from "react" import { motion } from "framer-motion" import { useTranslation } from "next-i18next" +import { IconType } from "react-icons" import { BsTranslate } from "react-icons/bs" -import { MdBrightness2, MdLanguage, MdSearch, MdWbSunny } from "react-icons/md" +import { MdBrightness2, MdSearch, MdWbSunny } from "react-icons/md" import { Box, ButtonProps, @@ -13,10 +14,13 @@ import { DrawerOverlay, Flex, forwardRef, + Grid, Icon, List, ListItem, MenuButton, + Text, + useColorModeValue, } from "@chakra-ui/react" import LanguagePicker from "@/components/LanguagePicker" @@ -74,8 +78,25 @@ const FooterItem = forwardRef((props, ref) => ( /> )) +type FooterButtonProps = ButtonProps & { + icon: IconType +} + +const FooterButton = ({ icon, ...props }: FooterButtonProps) => ( + + } + {...props} + /> + ) +} + +type CloseButtonProps = ButtonProps & { + onToggle: () => void +} + +const CloseButton = ({ onToggle, ...props }: CloseButtonProps) => { + const { t } = useTranslation("common") + return ( + + + + + + + } + {...props} + /> + ) +} + +export interface IProps extends ButtonProps { + isMenuOpen: boolean + isDarkTheme: boolean + toggleMenu: () => void + toggleTheme: () => void + toggleSearch: () => void + linkSections: ISections + fromPageParameter: string + drawerContainerRef: RefObject +} + +const MobileNavMenu: React.FC = ({ + isMenuOpen, + isDarkTheme, + toggleMenu: onToggle, + toggleTheme, + toggleSearch, + linkSections, + fromPageParameter, + drawerContainerRef, + ...props +}) => { + const { t } = useTranslation("common") + + const ThemeIcon = useColorModeValue(MdBrightness2, MdWbSunny) + const themeLabelKey = useColorModeValue("dark-mode", "light-mode") + + return ( + <> + + + {t("close")} + {Object.keys(linkSections).map((sectionKey, idx) => { @@ -232,7 +276,7 @@ const MobileNavMenu: React.FC = ({ {item.text} {item.items.map((item, idx) => ( - + = ({ ))} ) : ( - + = ({ ) : ( - + = ({ icon={MdSearch} onClick={() => { // Workaround to ensure the input for the search modal can have focus - toggleMenu() + onToggle() toggleSearch() }} > @@ -297,7 +341,7 @@ const MobileNavMenu: React.FC = ({ h="calc(100svh - var(--eth-sizes-8))" w="calc(100vw - var(--eth-sizes-8))" inset="4" - handleClose={toggleMenu} + handleClose={onToggle} > {t("languages")} From 22d4d6aadbec2ce247f3a22c1b4d5ca6338f634f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:34:59 -0800 Subject: [PATCH 113/478] fix: update breakpoint use `lg` now, change to `md` if desktop/mobile breakpoint change is merged from in the nav-menu redesign PR --- src/components/LanguagePicker/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 19a1695be4a..5fb9bcc140a 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -172,7 +172,7 @@ const LanguagePicker = ({ {/* Mobile Close bar */} Date: Tue, 30 Jan 2024 19:35:10 -0800 Subject: [PATCH 114/478] style: current lang colors, add check icon --- src/components/LanguagePicker/MenuItem.tsx | 153 ++++++++++-------- src/components/LanguagePicker/ProgressBar.tsx | 8 +- src/components/LanguagePicker/index.tsx | 1 + 3 files changed, 92 insertions(+), 70 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index b3d25d76445..6834b178316 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -1,6 +1,10 @@ import { useRouter } from "next/router" +import { BsCheck } from "react-icons/bs" import { + Box, + Flex, forwardRef, + Icon, MenuItem as ChakraMenuItem, type MenuItemProps as ChakraMenuItemProps, Text, @@ -14,78 +18,93 @@ import ProgressBar from "./ProgressBar" type ItemProps = ChakraMenuItemProps & { displayInfo: LocaleDisplayInfo + isFeatured: boolean } -const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { - const { - localeOption, - sourceName, - targetName, - approvalProgress, - wordsApproved, - } = displayInfo - const { asPath, locale } = useRouter() +const MenuItem = forwardRef( + ({ displayInfo, isFeatured, ...props }: ItemProps, ref) => { + const { + localeOption, + sourceName, + targetName, + approvalProgress, + wordsApproved, + } = displayInfo + const { asPath, locale } = useRouter() + const isCurrent = localeOption === locale && !isFeatured - const getProgressInfo = (approvalProgress: number, wordsApproved: number) => { - const percentage = new Intl.NumberFormat(locale!, { - style: "percent", - }).format(approvalProgress / 100) - const progress = - approvalProgress === 0 ? "<" + percentage.replace("0", "1") : percentage - const words = new Intl.NumberFormat(locale!).format(wordsApproved) - return { progress, words } - } + const getProgressInfo = ( + approvalProgress: number, + wordsApproved: number + ) => { + const percentage = new Intl.NumberFormat(locale!, { + style: "percent", + }).format(approvalProgress / 100) + const progress = + approvalProgress === 0 ? "<" + percentage.replace("0", "1") : percentage + const words = new Intl.NumberFormat(locale!).format(wordsApproved) + return { progress, words } + } - const { progress, words } = getProgressInfo(approvalProgress, wordsApproved) + const { progress, words } = getProgressInfo(approvalProgress, wordsApproved) - return ( - { - e.target.scrollIntoView({ block: "nearest" }) - }} - scrollMarginY="16" - _hover={{ bg: "primary.lowContrast", textDecoration: "none" }} - _focus={{ bg: "primary.lowContrast" }} - sx={{ - p: { - textDecoration: "none", - overflow: "hidden", - textOverflow: "ellipsis", - whiteSpace: "nowrap", - }, - }} - href={asPath} - locale={localeOption} - {...props} - > - - {targetName} - - - {sourceName} - - { + e.target.scrollIntoView({ block: "nearest" }) + }} + scrollMarginY="16" + _hover={{ bg: "primary.lowContrast", textDecoration: "none" }} + _focus={{ bg: "primary.lowContrast" }} + sx={{ + p: { + textDecoration: "none", + overflow: "hidden", + textOverflow: "ellipsis", + whiteSpace: "nowrap", + }, + }} + href={asPath} + locale={localeOption} + {...props} > - {progress} translated • {words} words - - - - ) -}) + + + + {targetName} + + + {sourceName} + + + {isCurrent && } + + + {progress} translated • {words} words + + + + ) + } +) export default MenuItem diff --git a/src/components/LanguagePicker/ProgressBar.tsx b/src/components/LanguagePicker/ProgressBar.tsx index b0ab9768023..bcf710a2474 100644 --- a/src/components/LanguagePicker/ProgressBar.tsx +++ b/src/components/LanguagePicker/ProgressBar.tsx @@ -1,8 +1,10 @@ import { Progress, ProgressProps } from "@chakra-ui/react" -type ProgressBarProps = Pick +type ProgressBarProps = Pick & { + isCurrent?: boolean +} -const ProgressBar = ({ value }: ProgressBarProps) => ( +const ProgressBar = ({ value, isCurrent }: ProgressBarProps) => ( ( }} sx={{ "[role=progressbar]": { - backgroundColor: "body.medium", + backgroundColor: isCurrent ? "primary.highContrast" : "body.medium", }, }} /> diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 5fb9bcc140a..75678a264ee 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -212,6 +212,7 @@ const LanguagePicker = ({ key={`item-${displayInfo.localeOption}`} displayInfo={displayInfo} onClick={onMenuClose} + isFeatured /> ))} From a3a34f01a232415e11f3ff96ab0567f01f7ead22 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:45:40 -0800 Subject: [PATCH 115/478] style: add mobile overlay behind menu placeholder --- src/components/Nav/Mobile.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index 42e80729500..85e8aaf3297 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -342,6 +342,13 @@ const MobileNavMenu: React.FC = ({ w="calc(100vw - var(--eth-sizes-8))" inset="4" handleClose={onToggle} + _before={{ + content: '""', + position: "fixed", + inset: 0, + bg: "black", + opacity: 0.4, + }} // TODO: Replace with overlay component > {t("languages")} From 1fe9d666c9ce1d181ac508fbf3735380a2867898 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 20:00:25 -0800 Subject: [PATCH 116/478] patch: boolean prop optional --- src/components/LanguagePicker/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index 6834b178316..c66b6428420 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -18,7 +18,7 @@ import ProgressBar from "./ProgressBar" type ItemProps = ChakraMenuItemProps & { displayInfo: LocaleDisplayInfo - isFeatured: boolean + isFeatured?: boolean } const MenuItem = forwardRef( From 4b3ccb57dbbccae246037d36363411c483ed3850 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 20:00:58 -0800 Subject: [PATCH 117/478] i18n: extract LanguagePicker strings --- src/components/LanguagePicker/MenuItem.tsx | 5 ++++- src/components/LanguagePicker/index.tsx | 15 ++++++--------- src/intl/en/page-languages.json | 6 +++++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index c66b6428420..f50c381f3b7 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -1,4 +1,5 @@ import { useRouter } from "next/router" +import { useTranslation } from "next-i18next" import { BsCheck } from "react-icons/bs" import { Box, @@ -30,6 +31,7 @@ const MenuItem = forwardRef( approvalProgress, wordsApproved, } = displayInfo + const { t } = useTranslation("page-languages") const { asPath, locale } = useRouter() const isCurrent = localeOption === locale && !isFeatured @@ -99,7 +101,8 @@ const MenuItem = forwardRef( color="body.medium" maxW="full" > - {progress} translated • {words} words + {progress} {t("page-languages-translated")} • {words}{" "} + {t("page-languages-words")} diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 75678a264ee..ab657e2744f 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -41,8 +41,7 @@ const LanguagePicker = ({ ...props }: LanguagePickerProps) => { const { t } = useTranslation("page-languages") - const router = useRouter() - const { locale, locales } = router + const { locale, locales } = useRouter() const inputRef = useRef(null) const firstItemRef = useRef(null) const [filterValue, setFilterValue] = useState("") @@ -186,7 +185,7 @@ const LanguagePicker = ({ textTransform="uppercase" fontSize="xs" > - Close + {t("close")} @@ -202,10 +201,7 @@ const LanguagePicker = ({ {browserLocalesInfo.length > 0 && ( <> - Browser{" "} - {browserLocalesInfo.length === 1 - ? "language" - : "languages"} + {t("page-languages-browser-language")} {browserLocalesInfo.map((displayInfo) => ( - Filter list ({filteredNames.length} languages) + {t("page-languages-filter-label")}{" "} + ({filteredNames.length} {t("common:languages")}) inputRef.current?.focus()} @@ -230,7 +227,7 @@ const LanguagePicker = ({ closeOnSelect={false} > setFilterValue(e.target.value)} ref={inputRef} diff --git a/src/intl/en/page-languages.json b/src/intl/en/page-languages.json index 53d97878c77..961776a3c65 100644 --- a/src/intl/en/page-languages.json +++ b/src/intl/en/page-languages.json @@ -11,7 +11,11 @@ "page-languages-want-more-header": "Want to see ethereum.org in a different language?", "page-languages-want-more-link": "Translation Program", "page-languages-want-more-paragraph": "ethereum.org translators are always translating pages in as many languages as possible. To see what they're working on right now or to sign up to join them, read about our", - "page-languages-filter-placeholder": "Filter", + "page-languages-filter-label": "Filter list", + "page-languages-filter-placeholder": "Type to filter", + "page-languages-browser-language": "Browser language(s)", + "page-languages-translated": "translated", + "page-languages-words": "words", "langauge-am": "Amharic", "language-ar": "Arabic", "language-az": "Azerbaijani", From 56489453510b1e5fefa980a3e9cf4d2a5179a28d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:59:26 -0800 Subject: [PATCH 118/478] fix: rtl menu navigation --- src/components/Nav/ArkMenu.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/ArkMenu.tsx b/src/components/Nav/ArkMenu.tsx index bb380e321dd..74626219e01 100644 --- a/src/components/Nav/ArkMenu.tsx +++ b/src/components/Nav/ArkMenu.tsx @@ -33,6 +33,8 @@ import type { NavSections, } from "./types" +import { useRtlFlip } from "@/hooks/useRtlFlip" + const NextChevron = (props: IconProps) => { const { locale } = useRouter() const isRtl = isLangRightToLeft(locale! as Lang) @@ -108,6 +110,7 @@ type LvlPortalProps = { items: NavItem[] } const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { + const { direction } = useRtlFlip() const pad = 4 if (lvl > 3) return null return ( @@ -145,7 +148,7 @@ const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { ) : ( - + @@ -173,6 +176,8 @@ const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { const [activeSection, setActiveSection] = useState(null) + const { direction } = useRtlFlip() + const handleOpenChange = ( { open }: MenuOpenChangeDetails, sectionKey: NavSectionKey @@ -206,6 +211,7 @@ const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { unmountOnExit loop onOpenChange={(details) => handleOpenChange(details, sectionKey)} + dir={direction} > - ) -} - -type LvlPortalProps = { - lvl: Level - refs: LvlRefs - items: NavItem[] -} -const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { - const { direction } = useRtlFlip() - const pad = 4 - if (lvl > 3) return null - return ( - - - - {items.map((item) => { - const { label, ...action } = item - return ( - - {"href" in action ? ( - - - - ) : ( - - - - - - - )} - - ) - })} - - - - ) -} - -type ArkMenuProps = FlexProps & { - sections: NavSections -} -const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { - const { isOpen, onOpen, onClose } = useDisclosure() - - const [activeSection, setActiveSection] = useState(null) - - const { direction } = useRtlFlip() - - const handleOpenChange = ( - { open }: MenuOpenChangeDetails, - sectionKey: NavSectionKey - ): void => { - setActiveSection(open ? sectionKey : null) - open ? onOpen() : onClose() - } - - const refs: LvlRefs = { - lvl1: useRef(null), - lvl2: useRef(null), - lvl3: useRef(null), - } - - const handleSectionHover = (sectionKey: NavSectionKey) => { - if (!isOpen) return - if (sectionKey === activeSection) return - setActiveSection(sectionKey) - // TODO: Open the section being hovered - } - - return ( - <> - - {SECTION_LABELS.map((sectionKey) => { - const { label } = sections[sectionKey] - const isActive = activeSection === sectionKey - return ( - handleOpenChange(details, sectionKey)} - dir={direction} - > - - - - - - ) - })} - - - - - - - - ) -} - -export default ArkMenu diff --git a/src/components/Nav/ArkMenu/Item.tsx b/src/components/Nav/ArkMenu/Item.tsx new file mode 100644 index 00000000000..c5b50a2adac --- /dev/null +++ b/src/components/Nav/ArkMenu/Item.tsx @@ -0,0 +1,76 @@ +import { useRouter } from "next/router" +import { BsCircle } from "react-icons/bs" +import { Box, Button, forwardRef, Icon, Link, Text } from "@chakra-ui/react" + +import { cleanPath } from "@/lib/utils/url" + +import type { Level, NavItem } from "../types" + +import NextChevron from "./NextChevron" + +type ItemProps = { + item: NavItem + lvl: Level +} + +const Item = forwardRef(({ item, lvl }: ItemProps, ref) => { + const { label, description, icon: CustomIcon, ...action } = item + const { asPath } = useRouter() + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + + return ( + + ) +}) + +export default Item diff --git a/src/components/Nav/ArkMenu/LvlPortal.tsx b/src/components/Nav/ArkMenu/LvlPortal.tsx new file mode 100644 index 00000000000..2da75377671 --- /dev/null +++ b/src/components/Nav/ArkMenu/LvlPortal.tsx @@ -0,0 +1,76 @@ +import { Fragment } from "react" +import { Menu, Portal } from "@ark-ui/react" +import { Flex } from "@chakra-ui/react" + +import type { Level, LvlRefs, NavItem } from "../types" + +import Item from "./Item" + +import { useRtlFlip } from "@/hooks/useRtlFlip" + +type LvlPortalProps = { + lvl: Level + refs: LvlRefs + items: NavItem[] +} + +const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { + const { direction } = useRtlFlip() + const pad = 4 + if (lvl > 3) return null + return ( + + + + {items.map((item) => { + const { label, ...action } = item + return ( + + {"href" in action ? ( + + + + ) : ( + + + + + + + )} + + ) + })} + + + + ) +} + +export default LvlPortal diff --git a/src/components/Nav/ArkMenu/NextChevron.tsx b/src/components/Nav/ArkMenu/NextChevron.tsx new file mode 100644 index 00000000000..c79cea234b5 --- /dev/null +++ b/src/components/Nav/ArkMenu/NextChevron.tsx @@ -0,0 +1,15 @@ +import { useRouter } from "next/router" +import { MdChevronLeft, MdChevronRight } from "react-icons/md" +import { Icon,type IconProps } from "@chakra-ui/react" + +import type { Lang } from "@/lib/types" + +import { isLangRightToLeft } from "@/lib/utils/translations" + +const NextChevron = (props: IconProps) => { + const { locale } = useRouter() + const isRtl = isLangRightToLeft(locale! as Lang) + return +} + +export default NextChevron diff --git a/src/components/Nav/ArkMenu/index.tsx b/src/components/Nav/ArkMenu/index.tsx new file mode 100644 index 00000000000..c59f2e89be1 --- /dev/null +++ b/src/components/Nav/ArkMenu/index.tsx @@ -0,0 +1,134 @@ +import { useRef, useState } from "react" +import { motion } from "framer-motion" +import { Menu, type MenuOpenChangeDetails } from "@ark-ui/react" +import { + Box, + Flex, + type FlexProps, + Grid, + Text, + useDisclosure, +} from "@chakra-ui/react" + +import { Button } from "@/components/Buttons" + +import { SECTION_LABELS } from "@/lib/constants" + +import type { LvlRefs, NavSectionKey, NavSections } from "../types" + +import LvlPortal from "./LvlPortal" + +import { useRtlFlip } from "@/hooks/useRtlFlip" + +type ArkMenuProps = FlexProps & { + sections: NavSections +} + +const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { + const { isOpen, onOpen, onClose } = useDisclosure() + + const [activeSection, setActiveSection] = useState(null) + + const { direction } = useRtlFlip() + + const handleOpenChange = ( + { open }: MenuOpenChangeDetails, + sectionKey: NavSectionKey + ): void => { + setActiveSection(open ? sectionKey : null) + open ? onOpen() : onClose() + } + + const refs: LvlRefs = { + lvl1: useRef(null), + lvl2: useRef(null), + lvl3: useRef(null), + } + + const handleSectionHover = (sectionKey: NavSectionKey) => { + if (!isOpen) return + if (sectionKey === activeSection) return + setActiveSection(sectionKey) + // TODO: Open the section being hovered + } + + return ( + <> + + {SECTION_LABELS.map((sectionKey) => { + const { label } = sections[sectionKey] + const isActive = activeSection === sectionKey + return ( + handleOpenChange(details, sectionKey)} + dir={direction} + > + + + + + + ) + })} + + + + + + + + ) +} + +export default ArkMenu From 62321eb2e94adc788b72e1ba1ff23883790652ad Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 07:41:50 -0800 Subject: [PATCH 121/478] refactor: use languages util, rm root access --- src/components/LanguagePicker/index.tsx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index ab657e2744f..f960246dfb0 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -14,11 +14,13 @@ import { Text, } from "@chakra-ui/react" -import type { Lang, LocaleDisplayInfo } from "@/lib/types" +import type { I18nLocale, Lang, LocaleDisplayInfo } from "@/lib/types" import { Button } from "@/components/Buttons" import { BaseLink } from "@/components/Link" +import { languages } from "@/lib/utils/translations" + import progressData from "@/data/translationProgress.json" import { DEFAULT_LOCALE } from "@/lib/constants" @@ -26,8 +28,6 @@ import { DEFAULT_LOCALE } from "@/lib/constants" import MenuItem from "./MenuItem" import NoResultsCallout from "./NoResultsCallout" -import i18nConfig from "@/../i18n.config.json" - type LanguagePickerProps = Omit & { children: React.ReactNode placement: MenuProps["placement"] @@ -57,9 +57,9 @@ const LanguagePicker = ({ const totalWords = progressData[0].words.total - const localeToDisplayInfo = (localeOption: string): LocaleDisplayInfo => { - const i18nConfigItem = i18nConfig.find(({ code }) => localeOption === code) - const englishName = i18nConfigItem!.name + const localeToDisplayInfo = (localeOption: Lang): LocaleDisplayInfo => { + const i18nItem: I18nLocale = languages[localeOption] + const englishName = i18nItem.name // Get "source" display name (Language choice displayed in language of current locale) const intlSource = new Intl.DisplayNames([locale!], { @@ -76,7 +76,7 @@ const LanguagePicker = ({ const fallbackTarget = new Intl.DisplayNames([localeOption], { type: "language", }).of(localeOption) - const i18nConfigTarget = i18nConfigItem?.localName + const i18nConfigTarget = i18nItem.localName const targetName = i18nConfigTarget || fallbackTarget if (!sourceName || !targetName) { @@ -86,7 +86,7 @@ const LanguagePicker = ({ // English will not have a dataItem const dataItem = progressData.find( ({ languageId }) => - i18nConfigItem!.crowdinCode.toLowerCase() === languageId.toLowerCase() + i18nItem.crowdinCode.toLowerCase() === languageId.toLowerCase() ) const approvalProgress = @@ -108,7 +108,7 @@ const LanguagePicker = ({ } const displayNames: LocaleDisplayInfo[] = - locales + (locales as Lang[]) ?.map(localeToDisplayInfo) .sort((a, b) => b.approvalProgress - a.approvalProgress) || [] @@ -217,7 +217,9 @@ const LanguagePicker = ({ {t("page-languages-filter-label")}{" "} - ({filteredNames.length} {t("common:languages")}) + + ({filteredNames.length} {t("common:languages")}) + inputRef.current?.focus()} From f0bbfe6bdfbde3deee23ed1dc6733da2dfff84a0 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 07:42:22 -0800 Subject: [PATCH 122/478] refactor: rm useEffect; type check for navigator --- src/components/LanguagePicker/index.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index f960246dfb0..f4d484d7217 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from "react" +import { useRef, useState } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" import { @@ -47,10 +47,7 @@ const LanguagePicker = ({ const [filterValue, setFilterValue] = useState("") // Get the preferred languages for the users browser - const [navLangs, setNavLangs] = useState([]) - useEffect(() => { - setNavLangs(Array.from(navigator.languages)) - }, []) + const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] if (!(progressData?.length > 0)) throw new Error("Missing translation progress data; check GitHub action") From 57955125f7aaa7cefdfb68fd4aaed7ab6f76e15d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 08:21:34 -0800 Subject: [PATCH 123/478] refactor: extract useLanguagePicker custom hook --- src/components/LanguagePicker/index.tsx | 120 ++------------ .../LanguagePicker/useLanguagePicker.tsx | 149 ++++++++++++++++++ src/lib/types.ts | 18 ++- 3 files changed, 175 insertions(+), 112 deletions(-) create mode 100644 src/components/LanguagePicker/useLanguagePicker.tsx diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index f4d484d7217..3af6d554b7b 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -1,5 +1,3 @@ -import { useRef, useState } from "react" -import { useRouter } from "next/router" import { useTranslation } from "next-i18next" import { Box, @@ -14,19 +12,12 @@ import { Text, } from "@chakra-ui/react" -import type { I18nLocale, Lang, LocaleDisplayInfo } from "@/lib/types" - import { Button } from "@/components/Buttons" import { BaseLink } from "@/components/Link" -import { languages } from "@/lib/utils/translations" - -import progressData from "@/data/translationProgress.json" - -import { DEFAULT_LOCALE } from "@/lib/constants" - import MenuItem from "./MenuItem" import NoResultsCallout from "./NoResultsCallout" +import { useLanguagePicker } from "./useLanguagePicker" type LanguagePickerProps = Omit & { children: React.ReactNode @@ -41,107 +32,14 @@ const LanguagePicker = ({ ...props }: LanguagePickerProps) => { const { t } = useTranslation("page-languages") - const { locale, locales } = useRouter() - const inputRef = useRef(null) - const firstItemRef = useRef(null) - const [filterValue, setFilterValue] = useState("") - - // Get the preferred languages for the users browser - const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] - - if (!(progressData?.length > 0)) - throw new Error("Missing translation progress data; check GitHub action") - - const totalWords = progressData[0].words.total - - const localeToDisplayInfo = (localeOption: Lang): LocaleDisplayInfo => { - const i18nItem: I18nLocale = languages[localeOption] - const englishName = i18nItem.name - - // Get "source" display name (Language choice displayed in language of current locale) - const intlSource = new Intl.DisplayNames([locale!], { - type: "language", - }).of(localeOption) - // For languages that do not have an Intl display name, use English name as fallback - const fallbackSource = - intlSource !== localeOption ? intlSource : englishName - const i18nKey = "language-" + localeOption.toLowerCase() - const i18nSource = t(i18nKey) - const sourceName = i18nSource === i18nKey ? fallbackSource : i18nSource - - // Get "target" display name (Language choice displayed in that language) - const fallbackTarget = new Intl.DisplayNames([localeOption], { - type: "language", - }).of(localeOption) - const i18nConfigTarget = i18nItem.localName - const targetName = i18nConfigTarget || fallbackTarget - - if (!sourceName || !targetName) { - throw new Error("Missing language display name, locale: " + localeOption) - } - - // English will not have a dataItem - const dataItem = progressData.find( - ({ languageId }) => - i18nItem.crowdinCode.toLowerCase() === languageId.toLowerCase() - ) - - const approvalProgress = - localeOption === DEFAULT_LOCALE ? 100 : dataItem?.approvalProgress || 0 - - const wordsApproved = - localeOption === DEFAULT_LOCALE - ? totalWords || 0 - : dataItem?.words.approved || 0 - - return { - localeOption, - approvalProgress, - sourceName, - targetName, - englishName, - wordsApproved, - } - } - - const displayNames: LocaleDisplayInfo[] = - (locales as Lang[]) - ?.map(localeToDisplayInfo) - .sort((a, b) => b.approvalProgress - a.approvalProgress) || [] - - const filteredNames = displayNames.filter( - ({ localeOption, sourceName, targetName, englishName }) => - (localeOption + sourceName + targetName + englishName) - .toLowerCase() - .includes(filterValue.toLowerCase()) - ) - - // For each browser preference, reduce to the most specific match found in `locales` array - const allBrowserLocales: Lang[] = navLangs - .map( - (navLang) => - locales?.reduce((acc, cur) => { - if (cur.toLowerCase() === navLang) return cur - if (navLang.includes(cur.toLowerCase()) && acc !== navLang) return cur - return acc - }, "") as Lang - ) - .filter((i) => !!i) // Remove those without matches - - // Remove duplicate matches - const browserLocales: Lang[] = Array.from(new Set(allBrowserLocales)) - - // Get display info for each browser locale - const browserLocalesInfo: LocaleDisplayInfo[] = browserLocales.map( - (browserLocale) => { - const item = displayNames.find( - ({ localeOption }) => localeOption === browserLocale - ) - if (!item) - throw new Error("Missing browser locale info for " + browserLocale) - return item - } - ) + const { + inputRef, + firstItemRef, + filterValue, + setFilterValue, + browserLocalesInfo, + filteredNames, + } = useLanguagePicker() return ( { + const { t } = useTranslation("page-languages") + const { locale, locales } = useRouter() + const inputRef = useRef(null) + const firstItemRef = useRef(null) + const [filterValue, setFilterValue] = useState("") + + const [filteredNames, setFilteredNames] = useState([]) + const [browserLocalesInfo, setBrowserLocalesInfo] = useState< + LocaleDisplayInfo[] + >([]) + + const localeToDisplayInfo = useCallback( + (localeOption: Lang): LocaleDisplayInfo => { + const i18nItem: I18nLocale = languages[localeOption] + const englishName = i18nItem.name + + // Get "source" display name (Language choice displayed in language of current locale) + const intlSource = new Intl.DisplayNames([locale!], { + type: "language", + }).of(localeOption) + // For languages that do not have an Intl display name, use English name as fallback + const fallbackSource = + intlSource !== localeOption ? intlSource : englishName + const i18nKey = "language-" + localeOption.toLowerCase() + const i18nSource = t(i18nKey) + const sourceName = i18nSource === i18nKey ? fallbackSource : i18nSource + + // Get "target" display name (Language choice displayed in that language) + const fallbackTarget = new Intl.DisplayNames([localeOption], { + type: "language", + }).of(localeOption) + const i18nConfigTarget = i18nItem.localName + const targetName = i18nConfigTarget || fallbackTarget + + if (!sourceName || !targetName) { + throw new Error( + "Missing language display name, locale: " + localeOption + ) + } + + // English will not have a dataItem + const dataItem = data.find( + ({ languageId }) => + i18nItem.crowdinCode.toLowerCase() === languageId.toLowerCase() + ) + + const approvalProgress = + localeOption === DEFAULT_LOCALE ? 100 : dataItem?.approvalProgress || 0 + + if (data.length === 0) + throw new Error( + "Missing translation progress data; check GitHub action" + ) + + const totalWords = data[0].words.total + + const wordsApproved = + localeOption === DEFAULT_LOCALE + ? totalWords || 0 + : dataItem?.words.approved || 0 + + return { + localeOption, + approvalProgress, + sourceName, + targetName, + englishName, + wordsApproved, + } + }, + [locale, t] + ) + + // perform all the filtering and mapping when the filter value change + useEffect(() => { + // Get the preferred languages for the users browser + const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] + + // For each browser preference, reduce to the most specific match found in `locales` array + const allBrowserLocales: Lang[] = navLangs + .map( + (navLang) => + locales?.reduce((acc, cur) => { + if (cur.toLowerCase() === navLang) return cur + if (navLang.includes(cur.toLowerCase()) && acc !== navLang) + return cur + return acc + }, "") as Lang + ) + .filter((i) => !!i) // Remove those without matches + + // Remove duplicate matches + const browserLocales: Lang[] = Array.from(new Set(allBrowserLocales)) + + const displayNames: LocaleDisplayInfo[] = + (locales as Lang[]) + ?.map(localeToDisplayInfo) + .sort((a, b) => b.approvalProgress - a.approvalProgress) || [] + + setFilteredNames( + displayNames.filter( + ({ localeOption, sourceName, targetName, englishName }) => + (localeOption + sourceName + targetName + englishName) + .toLowerCase() + .includes(filterValue.toLowerCase()) + ) + ) + // Get display info for each browser locale + setBrowserLocalesInfo( + browserLocales.map((browserLocale) => { + const item = displayNames.find( + ({ localeOption }) => localeOption === browserLocale + ) + if (!item) + throw new Error("Missing browser locale info for " + browserLocale) + return item + }) + ) + }, [filterValue, localeToDisplayInfo, locales]) + + return { + inputRef, + firstItemRef, + filterValue, + setFilterValue, + browserLocalesInfo, + filteredNames, + } +} diff --git a/src/lib/types.ts b/src/lib/types.ts index 601e1749336..2fbd110613d 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -397,4 +397,20 @@ export type CommunityConference = { description: string startDate: string endDate: string -} \ No newline at end of file +} + +// Translation progress data +type TranslationProgressSummary = { + total: number + translated: number + preTranslateAppliedTo: number + approved: number +} + +export type TranslationProgressDataItem = { + languageId: string + words: TranslationProgressSummary + phrases: TranslationProgressSummary + translationProgress: number + approvalProgress: number +} From 95953cd6cd015caf28f855ae90feac4fa7bdce1b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:28:29 -0800 Subject: [PATCH 124/478] feat: add Matomo event tracking update isOpen/onOpen/onClose disclosure handling, export {t} from hook --- src/components/LanguagePicker/index.tsx | 284 +++++++++--------- .../LanguagePicker/useLanguagePicker.tsx | 40 ++- 2 files changed, 188 insertions(+), 136 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 3af6d554b7b..d88ba190eee 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -1,4 +1,3 @@ -import { useTranslation } from "next-i18next" import { Box, Flex, @@ -31,15 +30,19 @@ const LanguagePicker = ({ handleClose, ...props }: LanguagePickerProps) => { - const { t } = useTranslation("page-languages") const { + t, + disclosure, inputRef, firstItemRef, filterValue, setFilterValue, browserLocalesInfo, filteredNames, - } = useLanguagePicker() + getLinkEventValue, + } = useLanguagePicker(handleClose) + + const { onClose } = disclosure return ( - {({ onClose }) => { - const onMenuClose = () => { - setFilterValue("") - handleClose ? handleClose() : onClose() - } - return ( - <> - {children} - - {/* Mobile Close bar */} - - - + {children} + + {/* Mobile Close bar */} + + + - {/* Main Language selection menu */} - - {browserLocalesInfo.length > 0 && ( - <> - - {t("page-languages-browser-language")} - - {browserLocalesInfo.map((displayInfo) => ( - - ))} - - - )} + {/* Main Language selection menu */} + + {browserLocalesInfo.length > 0 && ( + <> + + {t("page-languages-browser-language")} + + {browserLocalesInfo.map((displayInfo) => ( + + onClose({ + eventName: "Locale chosen (browser preference)", + eventValue: getLinkEventValue(displayInfo.localeOption), + }) + } + isFeatured + /> + ))} + + + )} - - {t("page-languages-filter-label")}{" "} - - ({filteredNames.length} {t("common:languages")}) - - - inputRef.current?.focus()} - p="0" - bg="transparent" - position="relative" - closeOnSelect={false} - > - setFilterValue(e.target.value)} - ref={inputRef} - h="8" - mt="1" - mb="2" - bg="background.base" - color="body.base" - onKeyDown={(e) => { - // Navigate to first result on enter - if (e.key === "Enter") { - e.preventDefault() - firstItemRef.current?.click() - } - }} - /> - + + {t("page-languages-filter-label")}{" "} + + ({filteredNames.length} {t("common:languages")}) + + + inputRef.current?.focus()} + p="0" + bg="transparent" + position="relative" + closeOnSelect={false} + > + setFilterValue(e.target.value)} + ref={inputRef} + h="8" + mt="1" + mb="2" + bg="background.base" + color="body.base" + onKeyDown={(e) => { + // Navigate to first result on enter + if (e.key === "Enter") { + e.preventDefault() + firstItemRef.current?.click() + } + }} + /> + - {filteredNames.map((displayInfo, index) => { - const firstResult = index === 0 - return ( - - ) - })} + {filteredNames.map((displayInfo, index) => { + const firstResult = index === 0 + return ( + + onClose({ + eventName: "Locale chosen", + eventValue: getLinkEventValue(displayInfo.localeOption), + }) + } + /> + ) + })} - {filteredNames.length === 0 && ( - - )} - + {filteredNames.length === 0 && ( + + onClose({ + eventName: "Translation program link (no results)", + eventValue: "/contributing/translation-program", + }) + } + /> + )} + - {/* Footer callout */} - - - Help us translate ethereum.org.{" "} - - Learn more - - - - - - ) - }} + {/* Footer callout */} + + + Help us translate ethereum.org.{" "} + + onClose({ + eventName: "Translation program link (menu footer)", + eventValue: "/contributing/translation-program", + }) + } + > + Learn more + + + + ) } diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 19c7b6ab7e5..415058dee24 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -1,6 +1,7 @@ import { useCallback, useEffect, useRef, useState } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" +import { useDisclosure } from "@chakra-ui/react" import type { I18nLocale, @@ -9,6 +10,7 @@ import type { TranslationProgressDataItem, } from "@/lib/types" +import { MatomoEventOptions, trackCustomEvent } from "@/lib/utils/matomo" import { languages } from "@/lib/utils/translations" import progressData from "@/data/translationProgress.json" @@ -17,9 +19,9 @@ import { DEFAULT_LOCALE } from "@/lib/constants" const data = progressData as TranslationProgressDataItem[] -export const useLanguagePicker = () => { +export const useLanguagePicker = (handleClose?: () => void) => { const { t } = useTranslation("page-languages") - const { locale, locales } = useRouter() + const { asPath, locale, locales } = useRouter() const inputRef = useRef(null) const firstItemRef = useRef(null) const [filterValue, setFilterValue] = useState("") @@ -138,12 +140,46 @@ export const useLanguagePicker = () => { ) }, [filterValue, localeToDisplayInfo, locales]) + const { isOpen, ...menu } = useDisclosure() + + const eventBase: MatomoEventOptions = { + eventCategory: `Language picker`, + eventAction: `Clicked`, + eventName: "Open or close language picker", + } + + const onOpen = () => { + menu.onOpen() + trackCustomEvent({ ...eventBase, eventValue: "Opened" }) + } + + /** + * When closing the menu, track whether this is following a link, or simply closing the menu + * @param customMatomoEvent Optional custom event property overrides + */ + const onClose = (customMatomoEvent?: Partial): void => { + setFilterValue("") + handleClose && handleClose() + menu.onClose() + trackCustomEvent( + customMatomoEvent + ? { ...eventBase, ...customMatomoEvent } + : { ...eventBase, eventValue: "Closed" } + ) + } + + const getLinkEventValue = (localeOption: string) => + join(localeOption + asPath) + return { + t, + disclosure: { isOpen, onOpen, onClose }, inputRef, firstItemRef, filterValue, setFilterValue, browserLocalesInfo, filteredNames, + getLinkEventValue, } } From 16612ec31d45550ab99a5eb5afcca179c111583f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:34:45 -0800 Subject: [PATCH 125/478] i18n: extract missing LanguagePicker strings --- src/components/LanguagePicker/index.tsx | 4 ++-- src/intl/en/page-languages.json | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index d88ba190eee..0f7754ab1e2 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -185,7 +185,7 @@ const LanguagePicker = ({ justifyContent="center" > - Help us translate ethereum.org.{" "} + {t("page-languages-recruit-community")}{" "} @@ -195,7 +195,7 @@ const LanguagePicker = ({ }) } > - Learn more + {t("common:learn-more")} diff --git a/src/intl/en/page-languages.json b/src/intl/en/page-languages.json index 961776a3c65..700d0ec58bf 100644 --- a/src/intl/en/page-languages.json +++ b/src/intl/en/page-languages.json @@ -16,6 +16,7 @@ "page-languages-browser-language": "Browser language(s)", "page-languages-translated": "translated", "page-languages-words": "words", + "page-languages-recruit-community": "Help us translate ethereum.org.", "langauge-am": "Amharic", "language-ar": "Arabic", "language-az": "Azerbaijani", From 2d6147bb23919e1f231d63032aac84aea9fcd2c8 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 12:55:46 -0800 Subject: [PATCH 126/478] refactor: reuse existing type, rm redundant entry --- .../LanguagePicker/useLanguagePicker.tsx | 4 +- src/lib/types.ts | 113 ++++++++---------- 2 files changed, 51 insertions(+), 66 deletions(-) diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 415058dee24..7c06db94f06 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -7,7 +7,7 @@ import type { I18nLocale, Lang, LocaleDisplayInfo, - TranslationProgressDataItem, + ProjectProgressData, } from "@/lib/types" import { MatomoEventOptions, trackCustomEvent } from "@/lib/utils/matomo" @@ -17,7 +17,7 @@ import progressData from "@/data/translationProgress.json" import { DEFAULT_LOCALE } from "@/lib/constants" -const data = progressData as TranslationProgressDataItem[] +const data = progressData as ProjectProgressData[] export const useLanguagePicker = (handleClose?: () => void) => { const { t } = useTranslation("page-languages") diff --git a/src/lib/types.ts b/src/lib/types.ts index ab9e38cead7..66e4a40ccc0 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -233,6 +233,55 @@ export type LocaleDisplayInfo = { wordsApproved: number } +type TranslatedStats = { + tmMatch: number + default: number + total: number +} + +export type AllTimeData = { + name: string + url: string + unit: string + dateRange: { + from: string + to: string + } + currency: string + mode: string + totalCosts: number + totalTMSavings: number + totalPreTranslated: number + data: Array<{ + user: { + id: number + username: string + fullName: string + userRole: string + avatarUrl: string + preTranslated: number + totalCosts: number + } + languages: Array<{ + language: { + id: string + name: string + userRole: string + tmSavings: number + preTranslate: number + totalCosts: number + } + translated: TranslatedStats + targetTranslated: TranslatedStats + translatedByMt: TranslatedStats + approved: TranslatedStats + translationCosts: TranslatedStats + approvalCosts: TranslatedStats + }> + }> +} + + // GitHub contributors export type Commit = { commit: { @@ -401,67 +450,3 @@ export type CommunityConference = { startDate: string endDate: string } - -// Translation progress data -type TranslationProgressSummary = { - total: number - translated: number - preTranslateAppliedTo: number - approved: number -} - -export type TranslationProgressDataItem = { - languageId: string - words: TranslationProgressSummary - phrases: TranslationProgressSummary - translationProgress: number - approvalProgress: number -} - -type TranslatedStats = { - tmMatch: number - default: number - total: number -} - -export type AllTimeData = { - name: string - url: string - unit: string - dateRange: { - from: string - to: string - } - currency: string - mode: string - totalCosts: number - totalTMSavings: number - totalPreTranslated: number - data: Array<{ - user: { - id: number - username: string - fullName: string - userRole: string - avatarUrl: string - preTranslated: number - totalCosts: number - } - languages: Array<{ - language: { - id: string - name: string - userRole: string - tmSavings: number - preTranslate: number - totalCosts: number - } - translated: TranslatedStats - targetTranslated: TranslatedStats - translatedByMt: TranslatedStats - approved: TranslatedStats - translationCosts: TranslatedStats - approvalCosts: TranslatedStats - }> - }> -} From 26b1eae874ff03f790ea55a308ba87c8189e050a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 14:16:10 -0800 Subject: [PATCH 127/478] fix: rm unmountOnExit to allow links to be followed --- src/components/Nav/ArkMenu/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Nav/ArkMenu/index.tsx b/src/components/Nav/ArkMenu/index.tsx index c59f2e89be1..f79f281e513 100644 --- a/src/components/Nav/ArkMenu/index.tsx +++ b/src/components/Nav/ArkMenu/index.tsx @@ -61,7 +61,6 @@ const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { return ( handleOpenChange(details, sectionKey)} dir={direction} From 7c5bbb40a0f9b59a9ed87162ebaabb794b218ac7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 14:16:25 -0800 Subject: [PATCH 128/478] refactor: rename component to ItemContent --- src/components/Nav/ArkMenu/{Item.tsx => ItemContent.tsx} | 4 ++-- src/components/Nav/ArkMenu/LvlPortal.tsx | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/components/Nav/ArkMenu/{Item.tsx => ItemContent.tsx} (95%) diff --git a/src/components/Nav/ArkMenu/Item.tsx b/src/components/Nav/ArkMenu/ItemContent.tsx similarity index 95% rename from src/components/Nav/ArkMenu/Item.tsx rename to src/components/Nav/ArkMenu/ItemContent.tsx index c5b50a2adac..55f10c149c5 100644 --- a/src/components/Nav/ArkMenu/Item.tsx +++ b/src/components/Nav/ArkMenu/ItemContent.tsx @@ -13,7 +13,7 @@ type ItemProps = { lvl: Level } -const Item = forwardRef(({ item, lvl }: ItemProps, ref) => { +const ItemContent = forwardRef(({ item, lvl }: ItemProps, ref) => { const { label, description, icon: CustomIcon, ...action } = item const { asPath } = useRouter() const isLink = "href" in action @@ -73,4 +73,4 @@ const Item = forwardRef(({ item, lvl }: ItemProps, ref) => { ) }) -export default Item +export default ItemContent diff --git a/src/components/Nav/ArkMenu/LvlPortal.tsx b/src/components/Nav/ArkMenu/LvlPortal.tsx index 2da75377671..2f0f1b6e782 100644 --- a/src/components/Nav/ArkMenu/LvlPortal.tsx +++ b/src/components/Nav/ArkMenu/LvlPortal.tsx @@ -4,7 +4,7 @@ import { Flex } from "@chakra-ui/react" import type { Level, LvlRefs, NavItem } from "../types" -import Item from "./Item" +import ItemContent from "./ItemContent" import { useRtlFlip } from "@/hooks/useRtlFlip" @@ -50,12 +50,12 @@ const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { {"href" in action ? ( - + ) : ( - + Date: Wed, 31 Jan 2024 16:12:14 -0800 Subject: [PATCH 129/478] chore: rm unused data-group --- src/components/Nav/ArkMenu/ItemContent.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Nav/ArkMenu/ItemContent.tsx b/src/components/Nav/ArkMenu/ItemContent.tsx index 55f10c149c5..1b16c0794aa 100644 --- a/src/components/Nav/ArkMenu/ItemContent.tsx +++ b/src/components/Nav/ArkMenu/ItemContent.tsx @@ -46,7 +46,6 @@ const ItemContent = forwardRef(({ item, lvl }: ItemProps, ref) => { sx={{ "span:first-of-type": { m: 0, me: 4 } }} py="4" bg="none" - data-group _hover={{ boxShadow: "none", }} From 3ec4c3c1c0b15c3f69d3b951d12e36205a489718 Mon Sep 17 00:00:00 2001 From: lucas-amberg <102396588+lucas-amberg@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:32:45 -0800 Subject: [PATCH 130/478] Replace, rename, or remove URLS that are no longer valid. Replaced, renamed, and removed urls on the page as specified in issue #12081 --- public/content/desci/index.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/public/content/desci/index.md b/public/content/desci/index.md index c5bc80a3dd6..547ccdf69d8 100644 --- a/public/content/desci/index.md +++ b/public/content/desci/index.md @@ -93,7 +93,7 @@ Explore projects and join the DeSci community. - [DeSci.Global: global events and meetup calendar](https://desci.global) - [Blockchain for Science Telegram](https://t.me/BlockchainForScience) -- [Molecule: Fund and get funded for your research projects](https://discover.molecule.to/) +- [Molecule: Fund and get funded for your research projects](https://www.molecule.xyz/) - [VitaDAO: receive funding through sponsored research agreements for longevity research](https://www.vitadao.com/) - [ResearchHub: post a scientific result and engage in a conversation with peers](https://www.researchhub.com/) - [LabDAO: fold a protein in-silico](https://alphafodl.vercel.app/) @@ -101,14 +101,14 @@ Explore projects and join the DeSci community. - [DeSci Foundation: DeSci publishing tool builder](https://descifoundation.org/) - [DeSci.World: one-stop shop for users to view, engage with decentralized science](https://desci.world) - [Fleming Protocol: open-source data economy that fuels collaborative biomedical discovery](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) -- [OceanDAO: DAO governed funding for data-related science](https://oceanprotocol.com/dao) +- [OceanDAO: DAO governed funding for data-related science](https://oceanprotocol.com/) - [Opscientia: open decentralized science workflows](https://opsci.io/research/) - [LabDAO: fold a protein in-silico](https://alphafodl.vercel.app/) - [Bio.xyz: get funded for your biotech DAO or desci project](https://www.bio.xyz/) - [ResearchHub: post a scientific result and engage in a conversation with peers](https://www.researchhub.com/) - [VitaDAO: receive funding through sponsored research agreements for longevity research](https://www.vitadao.com/) -- [Fleming Protocol: open-source data economy that fuels collaborative biomedical discovery](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) -- [Active Inference Lab](https://www.activeinference.org/) +- [Fleming Protocol: open-source data economy that fuels collaborative biomedical discovery](http://flemingprotocol.io/) +- [Active Inference Institute](https://www.activeinference.org/) - [CureDAO: Community-Owned Precision Health Platform](https://docs.curedao.org/) - [IdeaMarkets: enabling decentralized scientific credibility](https://ideamarket.io/) - [DeSci Labs](https://www.desci.com/) @@ -122,9 +122,8 @@ We welcome suggestions for new projects to list - please look at our [listing po - [The case for DeSci](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) - [Guide to DeSci](https://future.com/what-is-decentralized-science-aka-desci/) - [Decentralized science resources](https://www.vincentweisser.com/decentralized-science) -- [Molecule’s Biopharma IP-NFTs - A Technical Description](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) +- [Molecule’s Biopharma IP-NFTs - A Technical Description](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) - [Building Trustless Systems of Science by Jon Starr](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) -- [The Emergence of Biotech DAOs](https://molecule.to/blog/the-emergence-of-biotech-daos) - [Paul Kohlhaas - DeSci: The Future of Decentralized Science (podcast)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) - [An Active Inference Ontology for Decentralized Science: from Situated Sensemaking to the Epistemic Commons](https://zenodo.org/record/6320575) - [DeSci: The Future of Research by Samuel Akinosho](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) From 4807a50b577635cdb77c66e0777281963552863c Mon Sep 17 00:00:00 2001 From: lucas-amberg <102396588+lucas-amberg@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:34:10 -0800 Subject: [PATCH 131/478] remove duplicate URLS Removed duplicate URLS on the page as specified in issue #11519 --- public/content/desci/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/content/desci/index.md b/public/content/desci/index.md index 547ccdf69d8..c9e7ae8f6ea 100644 --- a/public/content/desci/index.md +++ b/public/content/desci/index.md @@ -100,13 +100,9 @@ Explore projects and join the DeSci community. - [dClimate API: query climate data collected by a decentralized community](https://api.dclimate.net/) - [DeSci Foundation: DeSci publishing tool builder](https://descifoundation.org/) - [DeSci.World: one-stop shop for users to view, engage with decentralized science](https://desci.world) -- [Fleming Protocol: open-source data economy that fuels collaborative biomedical discovery](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) - [OceanDAO: DAO governed funding for data-related science](https://oceanprotocol.com/) - [Opscientia: open decentralized science workflows](https://opsci.io/research/) -- [LabDAO: fold a protein in-silico](https://alphafodl.vercel.app/) - [Bio.xyz: get funded for your biotech DAO or desci project](https://www.bio.xyz/) -- [ResearchHub: post a scientific result and engage in a conversation with peers](https://www.researchhub.com/) -- [VitaDAO: receive funding through sponsored research agreements for longevity research](https://www.vitadao.com/) - [Fleming Protocol: open-source data economy that fuels collaborative biomedical discovery](http://flemingprotocol.io/) - [Active Inference Institute](https://www.activeinference.org/) - [CureDAO: Community-Owned Precision Health Platform](https://docs.curedao.org/) From 98a2f8922ebf048ae21a2ca5b90de252caff10fb Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 16:59:32 -0800 Subject: [PATCH 132/478] i18n: extract JSON strings --- src/components/Nav/useNav.ts | 238 +++++++++++++++++------------------ src/intl/en/common.json | 107 +++++++++++++++- 2 files changed, 225 insertions(+), 120 deletions(-) diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index d040b285c76..9e69d9c63b2 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -41,78 +41,78 @@ export const useNav = () => { ariaLabel: t("learn-menu"), items: [ { - label: "Overview", - description: "All things Ethereum education", + label: t("nav-overview-label"), + description: t("nav-overview-description"), icon: BsCompass, href: "/learn", }, { - label: "Basics", - description: "Understand the fundamentals of Ethereum", + label: t("nav-basics-label"), + description: t("nav-basics-description"), icon: BsUiChecksGrid, items: [ { label: t("what-is-ethereum"), - description: "Understand what makes Ethereum special", + description: t("nav-what-is-ethereum-description"), href: "/what-is-ethereum", }, { label: t("what-is-ether"), - description: "The currency of Ethereum apps", + description: t("nav-what-is-ether-description"), href: "/eth", }, { label: t("ethereum-wallets"), - description: "An app to interact with your Ethereum account", + description: t("nav-ethereum-wallets-description"), href: "/wallets", }, { - label: "What is Web3?", - description: "An alternative to centralized monopolies dictating the rules", + label: t("nav-what-is-web3-label"), + description: t("nav-what-is-web3-description"), href: "/web3", }, { label: t("smart-contracts"), - description: "The fundamental buliding blocks of the Ethereum ecosystem", + description: t("nav-smart-contracts-description"), href: "/smart-contracts", }, ], }, { - label: "Advanced", - description: "Learn the more complex topics", + label: t("nav-advanced-label"), + description: t("nav-advanced-description"), icon: BsSliders, items: [ { - label: "Gas fees", - description: "How are ETH transaction fees calculated", + label: t("nav-gas-fees-label"), + description: t("nav-gas-fees-description"), href: "/gas", }, { label: t("bridges"), - description: "Web3 has evolved into an ecosystem of primary L1 blockchains and L2 scaling solutions", + description: t("nav-bridges-description"), href: "/bridges", }, { label: t("zero-knowledge-proofs"), - description: "A way to prove the validity of a statement without reveling the statement itself", + description: t("nav-zkp-description"), href: "/zero-knowledge-proofs", }, { label: t("run-a-node"), - description: "Become fully sovereign while helping secure the network", + description: t("nav-run-a-node-description"), href: "/run-a-node", }, { label: t("ethereum-security"), - description: "Learn best practices when using cryptocurrency", + description: t("nav-security-description"), href: "/security", }, ], }, { - label: "Test your knowledge", - description: "Find out how well you understand Ethereum and cryptocurrencies", + label: t("nav-quizzes-label"), + description: t("nav-quizzes-description"), icon: BsMortarboard, href: "/quizzes", } @@ -123,43 +123,43 @@ export const useNav = () => { ariaLabel: t("use-menu"), items: [ { - label: "Get started", - description: "Your first steps to use Ethereum", + label: t("get-started"), + description: t("nav-get-started-description"), icon: BsPinAngle, items: [ { - label: "Choose your wallet", - description: "Wallets allow you to use crypto", + label: t("nav-find-wallet-label"), + description: t("nav-find-wallet-description"), href: "/wallets/find-wallet", }, { label: t("get-eth"), - description: "You need ether (ETH) to use Ethereum applications", + description: t("nav-get-eth-description"), href: "/get-eth", }, { label: t("decentralized-applications-dapps"), - description: "Explore a rich ecosystem of apps using Ethereum", + description: t("nav-dapps-description"), href: "/dapps", }, { - label: "How to guides", - description: "Practical step-by-step guides to help you get started", + label: t("nav-guides-label"), + description: t("nav-guides-description"), items: [ // TODO: Add /guides/ link as first sub-item? { - label: "How to create an Ethereum account", - description: "Anyone can create an Ethereum account at any time, for free with a wallet app", + label: t("nav-guide-create-account-label"), + description: t("nav-guide-create-account-description"), href: "/guides/how-to-create-an-ethereum-account", }, { - label: "How to use a wallet", - description: "Learn how to operate all the basic functions of a wallet", + label: t("nav-guide-use-wallet-label"), + description: t("nav-guide-use-wallet-description"), href: "/guides/how-to-use-a-wallet", }, { - label: "How to revoke smart contract access", - description: "Stay safe when interacting with smart contracts and applications in the Ethereum ecosystem", + label: t("nav-guide-revoke-access-label"), + description: t("nav-guide-revoke-access-description"), href: "/guides/how-to-revoke-token-access", }, ] @@ -167,52 +167,52 @@ export const useNav = () => { ], }, { - label: "Use cases", - description: "Discover different ideas for Ethereum usage", + label: t("nav-use-cases-label"), + description: t("nav-use-cases-description"), icon: BsLightbulb, items: [ { label: t("stablecoins"), - description: "Stablecoins are Ethereum tokens designed to stay at a fixed value", + description: t("nav-stablecoins-description"), href: "/stablecoins", }, { label: t("nft-page"), - description: "A way to represent anything unique as an Ethereum-based asset", + description: t("nav-nft-description"), href: "/nft", }, { label: t("defi-page"), - description: "A global, open alternative to the traditional financial market", + description: t("nav-defi-description"), href: "/defi", }, { label: t("dao-page"), - description: "Member-owned communities without centralized authority", + description: t("nav-dao-description"), href: "/dao", }, { - label: "Emerging use cases", - description: "Get to know other newer use cases for Ethereum", + label: t("nav-emerging-label"), + description: t("nav-emerging-description"), items: [ { label: t("decentralized-identity"), - description: "Issue and own your unique decentralized identifiers", + description: t("nav-did-description"), href: "/decentralized-identity", }, { label: t("decentralized-social-networks"), - description: "Blockchain-based platforms for social interaction and content creation", + description: t("nav-desoc-description"), href: "/social-networks", }, { label: t("decentralized-science"), - description: "A global, open alternative to th current scientific system", + description: t("nav-desci-description"), href: "/desci", }, { label: t("regenerative-finance"), - description: "An alternative economic system build on regenerative principles", + description: t("nav-refi-description"), href: "/refi", }, ] @@ -220,35 +220,35 @@ export const useNav = () => { ], }, { - label: "Stake", - description: "Earn rewards for securing Ethereum", + label: t("nav-stake-label"), + description: t("nav-stake-description"), icon: BsSafe, items: [ { - label: "Staking home", - description: "An overview of different options for staking", + label: t("nav-staking-home-label"), + description: t("nav-staking-home-description"), href: "/staking", }, { - label: "Staking from home", - description: "Run home hardware and personally add to the security and decentralization of the Ethereum network", + label: t("nav-staking-solo-label"), + description: t("nav-staking-solo-description"), href: "/staking/solo", }, { - label: "Staking with a service", - description: "Third-party node operators handle the operation of your validator client", + label: t("nav-staking-saas-label"), + description: t("nav-staking-saas-description"), href: "/staking/saas", }, { - label: "Pooled staking", - description: "Stake and earn rewards with any amount of ETH by joining with others", + label: t("nav-staking-pool-label"), + description: t("nav-staking-pool-description"), href: "/staking/pools", }, ], }, { label: t("layer-2"), - description: "Cheaper and faster transactions for Ethereum", + description: t("nav-layer-2-description"), icon: BsLayers, href: "/layer-2", } @@ -259,78 +259,78 @@ export const useNav = () => { ariaLabel: t("build-menu"), items: [ { - label: "Builder's home", - description: "A builder's manual for Ethereum—by builders, for builders", + label: t("nav-builders-home-label"), + description: t("nav-builders-home-description"), icon: BsTools, href: "/developers", }, { - label: "Get started", - description: "Useful information for newcomers", + label: t("get-started"), + description: t("nav-start-building-description"), icon: BsPinAngle, items: [ { - label: "Tutorials", - description: "Curated list of community tutorials", + label: t("tutorials"), + description: t("nav-tutorials-description"), href: "/developers/tutorials", }, { - label: "Learn by coding", - description: "Tools that help you experiment with Ethereum", + label: t("learn-by-coding"), + description: t("nav-learn-by-coding-description"), href: "/developers/learning-tools", }, { - label: "Set up local environment", - description: "Choose and set up your Ethereum development stack", + label: t("set-up-local-env"), + description: t("nav-local-env-description"), href: "/developers/local-environment", }, { - label: "Grants", - description: "A curated list by our community on projects that provide grant funding programs", + label: t("grants"), + description: t("nav-grants-description"), href: "/community/grants", } ] }, { - label: "Documentation", - description: "Docs to help you understand and build with Ethereum", + label: t("documentation"), + description: t("nav-docs-description"), icon: BsJournalCode, items: [ { - label: "Overview", - description: "Your home for developer docs", + label: t("nav-overview-label"), + description: t("nav-docs-overview-description"), href: "/developers/docs", }, { - label: "Foundational topics", - description: "Core fundamentals to develop on Ethereum", + label: t("nav-docs-foundation-label"), + description: t("nav-docs-foundation-description"), href: "/developers/docs/intro-to-ethereum", }, { - label: "Ethereum stack", - description: "Understand all the details of the Ethereum stack", + label: t("nav-docs-stack-label"), + description: t("nav-docs-stack-description"), href: "/developers/docs/ethereum-stack", }, { - label: "UX/UI design fundamentals", - description: "Description of unique web3 design challenges, best practices and user research insights", + label: t("nav-docs-design-label"), + description: t("nav-docs-design-description"), href: "/developers/docs/design-and-ux" } ], }, { - label: "Enterprise", - description: "Business applications for Ethereum", + label: t("enterprise"), + description: t("nav-enterprise-description"), icon: BsBuildings, items: [ { - label: "Mainnet Ethereum", - description: "Enterprise blockchain applications can be built on the public Ethereum Mainnet", + label: t("mainnet-ethereum"), + description: t("nav-mainnet-description"), href: "/enterprise", }, { - label: "Private Ethereum", - description: "Developer resources for private enterprise Ethereum", + label: t("private-ethereum"), + description: t("nav-private-description"), href: "/enterprise/private-ethereum" } ] @@ -343,45 +343,45 @@ export const useNav = () => { items: [ { label: t("community-hub"), - description: "Overview on how to participate", + description: t("nav-participate-overview-description"), icon: BsPersonArmsUp, href: "/community", }, { - label: "Communities and events", - description: "Decentralization and freedom to participate for anyone", + label: t("nav-events-label"), + description: t("nav-events-description"), icon: BsMegaphone, items: [ { label: t("ethereum-online"), - description: "Hundreds of thousands of Ethereum enthusiasts father in these online communities", + description: t("nav-events-online-description"), href: "/community/online", }, { label: t("ethereum-events"), - description: "Every month there are major Ethereum events in-person and online", + description: t("nav-events-irl-description"), href: "/community/events", }, ] }, { - label: "Ethereum.org", - description: "This website is community driven—join us and contribute too", + label: t("site-title"), + description: t("nav-ethereum-org-description"), icon: BsFire, items: [ { - label: "Contributing to ethereum.org", - description: "If you want to help, this will guide you", + label: t("nav-contribute-label"), + description: t("nav-contribute-description"), href: "/contributing", }, { - label: "Translation program", - description: "A collaborative effort to translate ethereum.org to all languages", + label: t("translation-program"), + description: t("nav-translation-program-description"), href: "/contributing/translation-program", }, { - label: "About ethereum.org", - description: "A public, open-source project for the Ethereum community", + label: t("about-ethereum-org"), + description: t("nav-about-description"), href: "/about", }, ], @@ -394,60 +394,60 @@ export const useNav = () => { items: [ { label: t("ethereum-whitepaper"), - description: "The original Ethereum whitepaper written by Vitalik Buterin in 2014", + description: t("nav-whitepaper-description"), icon: BsBook, href: "/whitepaper", }, { - label: "Roadmap", - description: "The path to more scalability, security and sustainabillity for Ethereum", + label: t("nav-roadmap-label"), + description: t("nav-roadmap-description"), icon: BsSignpost, items: [ { - label: "Improved security", - description: "Making sure Ethereum stays resilient to all kinds of attacks into the future", + label: t("nav-roadmap-security-label"), + description: t("nav-roadmap-security-description"), href: "/roadmap/security", }, { - label: "Cheaper transactions", - description: "Network updates to further reduce transaction costs and speed", + label: t("nav-roadmap-scaling-label"), + description: t("nav-roadmap-scaling-description"), href: "/roadmap/scaling", }, { - label: "Better user experience", - description: "Using Ethereum needs to be simplified", + label: t("nav-roadmap-ux-label"), + description: t("nav-roadmap-ux-description"), href: "/roadmap/user-experience", }, { - label: "Future-proofing", - description: "Solidifying Ethereum as a robust and decentralized network", + label: t("nav-roadmap-future-label"), + description: t("nav-roadmap-future-description"), href: "/roadmap/future-proofing", }, ] }, { - label: "Research and development", - description: "PRocesses used to improve Ethereum", + label: t("nav-research-label"), + description: t("nav-research-description"), icon: PiFlask, items: [ { - label: "Technical history of Ethereum", - description: "A timeline of all the major forks and updates", + label: t("nav-history-label"), + description: t("nav-history-description"), href: "/history", }, { - label: "Open research", - description: "One of the primary strengths of Ethereum is its active research community", + label: t("nav-open-research-label"), + description: t("nav-open-research-description"), href: "/community/research", }, { - label: "Ethereum improvement proposals (EIPs)", - description: "Standards that specify new features or processes", + label: t("nav-eip-label"), + description: t("nav-eip-description"), href: "/eips", }, { - label: "Governance", - description: "The process involved in upgrading the Ethereum protocol", + label: t("nav-governance-label"), + description: t("nav-governance-description"), href: "/governance", }, ] diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 7bb3c926bbd..ee0b1a9bbe6 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -147,9 +147,114 @@ "mainnet-ethereum": "Mainnet Ethereum", "merge": "Merge", "more": "More", - "nav-developers": "Developers", + "nav-about-description": "A public, open-source project for the Ethereum community", + "nav-advanced-description": "Learn the more complex topics", + "nav-advanced-label": "Advanced", + "nav-basics-description": "Understand the fundamentals of Ethereum", + "nav-basics-label": "Basics", + "nav-bridges-description": "Web3 has evolved into an ecosystem of primary L1 blockchains and L2 scaling solutions", + "nav-builders-home-description": "A builder's manual for Ethereum—by builders, for builders", + "nav-builders-home-label": "Builder's home", + "nav-contribute-description": "If you want to help, this will guide you", + "nav-contribute-label": "Contributing to ethereum.org", + "nav-dao-description": "Member-owned communities without centralized authority", + "nav-dapps-description": "Explore a rich ecosystem of apps using Ethereum", + "nav-defi-description": "A global, open alternative to the traditional financial market", + "nav-desci-description": "A global, open alternative to th current scientific system", + "nav-desoc-description": "Blockchain-based platforms for social interaction and content creation", "nav-developers-docs": "Developers docs", + "nav-developers": "Developers", + "nav-did-description": "Issue and own your unique decentralized identifiers", + "nav-docs-description": "Docs to help you understand and build with Ethereum", + "nav-docs-design-description": "Description of unique web3 design challenges, best practices and user research insights", + "nav-docs-design-label": "UX/UI design fundamentals", + "nav-docs-foundation-description": "Core fundamentals to develop on Ethereum", + "nav-docs-foundation-label": "Foundational topics", + "nav-docs-overview-description": "Your home for developer docs", + "nav-docs-stack-description": "Understand all the details of the Ethereum stack", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Standards that specify new features or processes", + "nav-eip-label": "Ethereum improvement proposals (EIPs)", + "nav-emerging-description": "Get to know other newer use cases for Ethereum", + "nav-emerging-label": "Emerging use cases", + "nav-enterprise-description": "Business applications for Ethereum", + "nav-ethereum-org-description": "This website is community driven—join us and contribute too", + "nav-ethereum-wallets-description": "An app to interact with your Ethereum account", + "nav-events-description": "Decentralization and freedom to participate for anyone", + "nav-events-irl-description": "Every month there are major Ethereum events in-person and online", + "nav-events-label": "Communities and events", + "nav-events-online-description": "Hundreds of thousands of Ethereum enthusiasts father in these online communities", + "nav-find-wallet-description": "Wallets allow you to use crypto", + "nav-find-wallet-label": "Choose your wallet", + "nav-gas-fees-description": "How are ETH transaction fees calculated", + "nav-gas-fees-label": "Gas fees", + "nav-get-eth-description": "You need ether (ETH) to use Ethereum applications", + "nav-get-started-description": "Your first steps to use Ethereum", + "nav-governance-description": "The process involved in upgrading the Ethereum protocol", + "nav-governance-label": "Governance", + "nav-grants-description": "A curated list by our community on projects that provide grant funding programs", + "nav-guide-create-account-description": "Anyone can create an Ethereum account at any time, for free with a wallet app", + "nav-guide-create-account-label": "How to create an Ethereum account", + "nav-guide-revoke-access-description": "Stay safe when interacting with smart contracts and applications in the Ethereum ecosystem", + "nav-guide-revoke-access-label": "How to revoke smart contract access", + "nav-guide-use-wallet-description": "Learn how to operate all the basic functions of a wallet", + "nav-guide-use-wallet-label": "How to use a wallet", + "nav-guides-description": "Practical step-by-step guides to help you get started", + "nav-guides-label": "How to guides", + "nav-history-description": "A timeline of all the major forks and updates", + "nav-history-label": "Technical history of Ethereum", + "nav-layer-2-description": "Cheaper and faster transactions for Ethereum", + "nav-learn-by-coding-description": "Tools that help you experiment with Ethereum", + "nav-local-env-description": "Choose and set up your Ethereum development stack", + "nav-mainnet-description": "Enterprise blockchain applications can be built on the public Ethereum Mainnet", + "nav-nft-description": "A way to represent anything unique as an Ethereum-based asset", + "nav-open-research-description": "One of the primary strengths of Ethereum is its active research community", + "nav-open-reserach-label": "Open research", + "nav-overview-description": "All things Ethereum education", + "nav-overview-label": "Overview", + "nav-participate-overview-description": "Overview on how to participate", "nav-primary": "Primary", + "nav-private-description": "Developer resources for private enterprise Ethereum", + "nav-quizzes-description": "Find out how well you understand Ethereum and cryptocurrencies", + "nav-quizzes-label": "Test your knowledge", + "nav-refi-description": "An alternative economic system build on regenerative principles", + "nav-research-description": "Processes used to improve Ethereum", + "nav-research-label": "Research and development", + "nav-roadmap-description": "The path to more scalability, security and sustainability for Ethereum", + "nav-roadmap-future-description": "Solidifying Ethereum as a robust and decentralized network", + "nav-roadmap-future-label": "Future-proofing", + "nav-roadmap-label": "Roadmap", + "nav-roadmap-scaling-description": "Network updates to further reduce transaction costs and speed", + "nav-roadmap-scaling-label": "Cheaper transactions", + "nav-roadmap-security-description": "Making sure Ethereum stays resilient to all kinds of attacks into the future", + "nav-roadmap-security-label": "Improved security", + "nav-roadmap-ux-description": "Using Ethereum needs to be simplified", + "nav-roadmap-ux-label": "Better user experience", + "nav-run-a-node-description": "Become fully sovereign while helping secure the network", + "nav-security-description": "Learn best practices when using cryptocurrency", + "nav-smart-contracts-description": "The fundamental buliding blocks of the Ethereum ecosystem", + "nav-stablecoins-description": "Stablecoins are Ethereum tokens designed to stay at a fixed value", + "nav-stake-description": "Earn rewards for securing Ethereum", + "nav-stake-label": "Stake", + "nav-staking-home-description": "An overview of different options for staking", + "nav-staking-home-label": "Staking home", + "nav-staking-pool-description": "Stake and earn rewards with any amount of ETH by joining with others", + "nav-staking-pool-label": "Pooled staking", + "nav-staking-saas-description": "Third-party node operators handle the operation of your validator client", + "nav-staking-saas-label": "Staking with a service", + "nav-staking-solo-description": "Run home hardware and personally add to the security and decentralization of the Ethereum network", + "nav-staking-solo-label": "Solo staking", + "nav-start-building-description": "Useful information for newcomers", + "nav-translation-program-description": "A collaborative effort to translate ethereum.org to all languages", + "nav-tutorials-description": "Curated list of community tutorials", + "nav-use-cases-description": "Discover different ideas for Ethereum usage", + "nav-use-cases-label": "Use cases", + "nav-what-is-ether-description": "The currency of Ethereum apps", + "nav-what-is-ethereum-description": "Understand what makes Ethereum special", + "nav-what-is-web3-label": "What is Web3?", + "nav-what-is-web3-description": "An alternative to centralized monopolies dictating the rules", + "nav-whitepaper-description": "The original Ethereum whitepaper written by Vitalik Buterin in 2014", + "nav-zkp-description": "A way to prove the validity of a statement without reveling the statement itself", "nft-page": "Non-fungible tokens (NFTs)", "nfts": "NFTs", "no": "No", From dd6fa805c64ebf9f0dbfdbe39efb2b5464b76984 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:17:03 -0800 Subject: [PATCH 133/478] refactor: rename Menu component --- src/components/Nav/Menu.tsx | 402 ------------------ .../Nav/{ArkMenu => Menu}/ItemContent.tsx | 0 .../Nav/{ArkMenu => Menu}/LvlPortal.tsx | 0 .../Nav/{ArkMenu => Menu}/NextChevron.tsx | 0 .../Nav/{ArkMenu => Menu}/index.tsx | 16 +- src/components/Nav/index.tsx | 4 +- 6 files changed, 10 insertions(+), 412 deletions(-) delete mode 100644 src/components/Nav/Menu.tsx rename src/components/Nav/{ArkMenu => Menu}/ItemContent.tsx (100%) rename src/components/Nav/{ArkMenu => Menu}/LvlPortal.tsx (100%) rename src/components/Nav/{ArkMenu => Menu}/NextChevron.tsx (100%) rename src/components/Nav/{ArkMenu => Menu}/index.tsx (91%) diff --git a/src/components/Nav/Menu.tsx b/src/components/Nav/Menu.tsx deleted file mode 100644 index e1e8c8cdace..00000000000 --- a/src/components/Nav/Menu.tsx +++ /dev/null @@ -1,402 +0,0 @@ -import { type RefObject, useCallback, useEffect, useRef, useState } from "react" -import { AnimatePresence, motion } from "framer-motion" -import { useRouter } from "next/router" -import { BsCircle } from "react-icons/bs" -import { MdChevronLeft, MdChevronRight } from "react-icons/md" -import { - Box, - type ButtonProps, - calc, - Flex, - type FlexProps, - Grid, - Icon, - type IconProps, - List, - Popover, - PopoverContent, - PopoverTrigger, - Text, - useToken, -} from "@chakra-ui/react" - -import type { Lang } from "@/lib/types" - -import { Button } from "@/components/Buttons" -import Link from "@/components/Link" - -import { isLangRightToLeft } from "@/lib/utils/translations" -import { cleanPath } from "@/lib/utils/url" - -import { SECTION_LABELS } from "@/lib/constants" - -import type { Level, NavItem, NavSectionKey, NavSections } from "./types" - -type ActiveState = - | { section: null; lvl1: null; lvl2: null; lvl3: null } - | { section: NavSectionKey; lvl1: null; lvl2: null; lvl3: null } - | { section: NavSectionKey; lvl1: number; lvl2: null; lvl3: null } - | { section: NavSectionKey; lvl1: number; lvl2: number; lvl3: null } - | { section: NavSectionKey; lvl1: number; lvl2: number; lvl3: number } - -const activeNull: ActiveState = { - section: null, - lvl1: null, - lvl2: null, - lvl3: null, -} - -type NextChevronProps = IconProps & { - lvl: Level - isLink: boolean -} - -const NextChevron = ({ lvl, isLink, ...props }: NextChevronProps) => { - const { locale } = useRouter() - if (isLink) return undefined - const isRtl = isLangRightToLeft(locale! as Lang) - return ( - - ) -} - -type GetHoverActionsArgs = { - lvl: Level - index: number - href?: string -} - -type MenuButtonProps = { - item: NavItem - lvl: Level - index: number - getHoverActions: (args: GetHoverActionsArgs) => Partial -} - -const MenuButton = ({ item, lvl, index, getHoverActions }: MenuButtonProps) => { - const { label, description, icon: CustomIcon, ...action } = item - const { asPath } = useRouter() - const isLink = !!action.href - const isActivePage = isLink && cleanPath(asPath) === action.href - const hoverActions = getHoverActions({ lvl, index, href: action.href }) - const { isActive: isHovered } = hoverActions - const minW = calc.subtract( - calc.multiply(useToken("sizes.container", "md"), 0.5), - useToken("space", 8) - ) // Half of `md` container (smallest desktop width) minus padding - return ( - - ) -} - -export type MenuProps = FlexProps & { - sections: NavSections -} - -// TODO (a11y): Keyboard arrow navigation - -const Menu = ({ sections, ...props }: MenuProps) => { - const { locale } = useRouter() - const isRtl = isLangRightToLeft(locale! as Lang) - - const [active, setActive] = useState(activeNull) - - const menuContentRef = useRef(null) - - const onOpen = (key: NavSectionKey) => { - setActive((prev) => ({ ...prev, section: key } as ActiveState)) - } - - const onClose = () => { - setActive(activeNull) - } - - const isOpen = !!active.section - - const getLvl1Items = (): NavItem[] => { - if (!active.section) return [] - return sections[active.section as NavSectionKey].items || [] - } - - const getLvl2Items = (): NavItem[] => { - if (!active.section || active.lvl1 === null) return [] - const lvl1Items = sections[active.section as NavSectionKey].items - const lvl2Items = lvl1Items[active.lvl1 % lvl1Items.length].items || [] - return lvl2Items - } - - const getLvl3Items = (): NavItem[] => { - if (!active.section || active.lvl1 === null || active.lvl2 === null) - return [] - const lvl1Items = sections[active.section as NavSectionKey].items - const lvl2Items = lvl1Items[active.lvl1 % lvl1Items.length].items || [] - if (lvl2Items.length === 0) return [] - const lvl3Items = lvl2Items[active.lvl2].items || [] - return lvl3Items - } - - const has = { - lvl1Items: getLvl1Items().length > 0, - lvl2Items: getLvl2Items().length > 0, - lvl3Items: getLvl3Items().length > 0, - } as const - - const scrollToEnd = useCallback( - (ref: RefObject) => { - ref.current?.scrollTo({ - left: ref.current.scrollWidth * (isRtl ? -1 : 1), - }) - }, - [isRtl] - ) - - useEffect(() => { - if (has.lvl3Items) { - scrollToEnd(menuContentRef) - } - }, [has.lvl2Items, has.lvl3Items, scrollToEnd]) - - const setActiveIndex = (lvl: Level, index: number | null) => { - if (lvl === 3) { - setActive((prev) => ({ ...prev, lvl3: index } as ActiveState)) - } else if (lvl === 2) { - setActive((prev) => ({ ...prev, lvl2: index, lvl3: null } as ActiveState)) - } else { - setActive( - (prev) => - ({ - ...prev, - lvl1: index, - lvl2: null, - lvl3: null, - } as ActiveState) - ) - } - } - - const getLvlContainerProps = (lvl: Level): FlexProps => ({ - bg: `menu.lvl${lvl}.background`, - color: `menu.lvl${lvl}.main`, - p: 4, - me: 0, - direction: "column", - zIndex: 1 - lvl, - }) - - const lvlAnimationProps = { - as: motion.div, - initial: { opacity: 0, height: 0 }, - animate: { opacity: 1, height: "auto" }, - exit: { opacity: 0, height: 0 }, - } as const - - const getHoverActions = ({ - lvl, - index, - href, - }: GetHoverActionsArgs): Partial => ({ - isActive: active[`lvl${lvl}`] === index, - onClick: () => { - href ? onClose() : setActiveIndex(1, index) - }, - onMouseEnter: () => setActiveIndex(lvl, index), - onFocusCapture: () => setActiveIndex(lvl, index), - }) - - return ( - - - - {SECTION_LABELS.map((key) => { - const { label, ariaLabel } = sections[key] - return ( - - ) - })} - - - setActiveIndex(1, null)} - overflow="auto" - > - - {has.lvl1Items && ( - - {getLvl1Items().map((item, index) => ( - - ))} - - )} - - {has.lvl2Items && ( - - {getLvl2Items().map((item, index) => ( - - ))} - - )} - - - {has.lvl3Items && ( - - {getLvl3Items().map((item, index) => ( - - ))} - - )} - - - - - ) -} - -export default Menu diff --git a/src/components/Nav/ArkMenu/ItemContent.tsx b/src/components/Nav/Menu/ItemContent.tsx similarity index 100% rename from src/components/Nav/ArkMenu/ItemContent.tsx rename to src/components/Nav/Menu/ItemContent.tsx diff --git a/src/components/Nav/ArkMenu/LvlPortal.tsx b/src/components/Nav/Menu/LvlPortal.tsx similarity index 100% rename from src/components/Nav/ArkMenu/LvlPortal.tsx rename to src/components/Nav/Menu/LvlPortal.tsx diff --git a/src/components/Nav/ArkMenu/NextChevron.tsx b/src/components/Nav/Menu/NextChevron.tsx similarity index 100% rename from src/components/Nav/ArkMenu/NextChevron.tsx rename to src/components/Nav/Menu/NextChevron.tsx diff --git a/src/components/Nav/ArkMenu/index.tsx b/src/components/Nav/Menu/index.tsx similarity index 91% rename from src/components/Nav/ArkMenu/index.tsx rename to src/components/Nav/Menu/index.tsx index f79f281e513..eaaa290bee3 100644 --- a/src/components/Nav/ArkMenu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,6 +1,6 @@ import { useRef, useState } from "react" import { motion } from "framer-motion" -import { Menu, type MenuOpenChangeDetails } from "@ark-ui/react" +import { Menu as ArkMenu, type MenuOpenChangeDetails } from "@ark-ui/react" import { Box, Flex, @@ -20,11 +20,11 @@ import LvlPortal from "./LvlPortal" import { useRtlFlip } from "@/hooks/useRtlFlip" -type ArkMenuProps = FlexProps & { +type NavMenuProps = FlexProps & { sections: NavSections } -const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { +const Menu = ({ sections, ...props }: NavMenuProps) => { const { isOpen, onOpen, onClose } = useDisclosure() const [activeSection, setActiveSection] = useState(null) @@ -59,13 +59,13 @@ const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { const { label } = sections[sectionKey] const isActive = activeSection === sectionKey return ( - handleOpenChange(details, sectionKey)} dir={direction} > - + - + - + ) })} @@ -130,4 +130,4 @@ const ArkMenu = ({ sections, ...props }: ArkMenuProps) => { ) } -export default ArkMenu +export default Menu diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 9d41dd65ab3..c0885d6bf5f 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -16,7 +16,7 @@ import { EthHomeIcon } from "../icons" import { BaseLink } from "../Link" import Search from "../Search" -import ArkMenu from "./ArkMenu" +import Menu from "./Menu" import MobileNavMenu from "./Mobile" import { useNav } from "./useNav" @@ -71,7 +71,7 @@ const Nav = () => { justifyContent={{ base: "flex-end", md: "space-between" }} ms={{ base: 3, xl: 8 }} > - + {/* Desktop */} From 806a504b8c4aa25a1b9f4da5b54bc182d56cd41e Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 1 Feb 2024 08:41:13 -0800 Subject: [PATCH 134/478] build: netlify ignore @swc/core-linux-x64-gnu --- netlify.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/netlify.toml b/netlify.toml index c57dd52fd99..fa941e6ec49 100644 --- a/netlify.toml +++ b/netlify.toml @@ -22,6 +22,7 @@ "./src/intl/**/*", "!./public/**/*", "!./node_modules/@swc/core-linux-x64-musl/**/*", + "!./node_modules/@swc/core-linux-x64-gnu/**/*", "!./node_modules/@ark-ui/**/*", "!./node_modules/@zag-js/**/*", ] \ No newline at end of file From 0b2cf23e46fc4ec129ca8ea0783e89f88006ddaf Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 1 Feb 2024 09:49:11 -0800 Subject: [PATCH 135/478] feat: update matomo event tracking --- src/components/LanguagePicker/index.tsx | 17 ++++++------- .../LanguagePicker/useLanguagePicker.tsx | 25 ++++++++++--------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 0f7754ab1e2..eaf17932b36 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -39,7 +39,6 @@ const LanguagePicker = ({ setFilterValue, browserLocalesInfo, filteredNames, - getLinkEventValue, } = useLanguagePicker(handleClose) const { onClose } = disclosure @@ -101,8 +100,8 @@ const LanguagePicker = ({ displayInfo={displayInfo} onClick={() => onClose({ - eventName: "Locale chosen (browser preference)", - eventValue: getLinkEventValue(displayInfo.localeOption), + eventAction: "Locale chosen (browser preference)", + eventName: displayInfo.localeOption, }) } isFeatured @@ -154,8 +153,8 @@ const LanguagePicker = ({ ref={firstResult ? firstItemRef : null} onClick={() => onClose({ - eventName: "Locale chosen", - eventValue: getLinkEventValue(displayInfo.localeOption), + eventAction: "Locale chosen", + eventName: displayInfo.localeOption, }) } /> @@ -166,8 +165,8 @@ const LanguagePicker = ({ onClose({ - eventName: "Translation program link (no results)", - eventValue: "/contributing/translation-program", + eventAction: "Translation program link (no results)", + eventName: "/contributing/translation-program", }) } /> @@ -190,8 +189,8 @@ const LanguagePicker = ({ href="/contributing/translation-program" onClick={() => onClose({ - eventName: "Translation program link (menu footer)", - eventValue: "/contributing/translation-program", + eventAction: "Translation program link (menu footer)", + eventName: "/contributing/translation-program", }) } > diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 7c06db94f06..c32eda96b9f 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -21,7 +21,7 @@ const data = progressData as ProjectProgressData[] export const useLanguagePicker = (handleClose?: () => void) => { const { t } = useTranslation("page-languages") - const { asPath, locale, locales } = useRouter() + const { locale, locales } = useRouter() const inputRef = useRef(null) const firstItemRef = useRef(null) const [filterValue, setFilterValue] = useState("") @@ -142,35 +142,37 @@ export const useLanguagePicker = (handleClose?: () => void) => { const { isOpen, ...menu } = useDisclosure() - const eventBase: MatomoEventOptions = { + const eventBase: Pick = { eventCategory: `Language picker`, - eventAction: `Clicked`, - eventName: "Open or close language picker", + eventAction: "Open or close language picker", } const onOpen = () => { menu.onOpen() - trackCustomEvent({ ...eventBase, eventValue: "Opened" }) + trackCustomEvent({ + ...eventBase, + eventName: "Opened", + } as MatomoEventOptions) } /** * When closing the menu, track whether this is following a link, or simply closing the menu * @param customMatomoEvent Optional custom event property overrides */ - const onClose = (customMatomoEvent?: Partial): void => { + const onClose = ( + customMatomoEvent?: Required> & + Partial + ): void => { setFilterValue("") handleClose && handleClose() menu.onClose() trackCustomEvent( - customMatomoEvent + (customMatomoEvent ? { ...eventBase, ...customMatomoEvent } - : { ...eventBase, eventValue: "Closed" } + : { ...eventBase, eventName: "Closed" }) satisfies MatomoEventOptions ) } - const getLinkEventValue = (localeOption: string) => - join(localeOption + asPath) - return { t, disclosure: { isOpen, onOpen, onClose }, @@ -180,6 +182,5 @@ export const useLanguagePicker = (handleClose?: () => void) => { setFilterValue, browserLocalesInfo, filteredNames, - getLinkEventValue, } } From b96e9508d084da46e7fef5747cdfd3ac34483584 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 1 Feb 2024 09:49:49 -0800 Subject: [PATCH 136/478] fix: remove initialFocusRef, add string namespace --- src/components/LanguagePicker/index.tsx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index eaf17932b36..c33780f0c22 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -44,13 +44,7 @@ const LanguagePicker = ({ const { onClose } = disclosure return ( - + {children} onClose()} - textTransform="uppercase" - fontSize="xs" > - {t("close")} + {t("common:close")} From 53a8759662b099f54d1f0e744d447b62c45f391d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:54:17 -0800 Subject: [PATCH 137/478] build: rm zag-js and ark-ui from netlify ignore --- netlify.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/netlify.toml b/netlify.toml index fa941e6ec49..22bd377bb8e 100644 --- a/netlify.toml +++ b/netlify.toml @@ -23,6 +23,4 @@ "!./public/**/*", "!./node_modules/@swc/core-linux-x64-musl/**/*", "!./node_modules/@swc/core-linux-x64-gnu/**/*", - "!./node_modules/@ark-ui/**/*", - "!./node_modules/@zag-js/**/*", ] \ No newline at end of file From 772e7f73fff19e3e50ea2877256f56333f190a75 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 1 Feb 2024 13:37:06 -0800 Subject: [PATCH 138/478] refactor: clean up ItemContent --- src/components/Nav/Menu/ItemContent.tsx | 52 +++++++++---------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/src/components/Nav/Menu/ItemContent.tsx b/src/components/Nav/Menu/ItemContent.tsx index 1b16c0794aa..aa056d5e522 100644 --- a/src/components/Nav/Menu/ItemContent.tsx +++ b/src/components/Nav/Menu/ItemContent.tsx @@ -1,5 +1,4 @@ import { useRouter } from "next/router" -import { BsCircle } from "react-icons/bs" import { Box, Button, forwardRef, Icon, Link, Text } from "@chakra-ui/react" import { cleanPath } from "@/lib/utils/url" @@ -14,53 +13,38 @@ type ItemProps = { } const ItemContent = forwardRef(({ item, lvl }: ItemProps, ref) => { - const { label, description, icon: CustomIcon, ...action } = item + const { label, description, icon, ...action } = item const { asPath } = useRouter() const isLink = "href" in action const isActivePage = isLink && cleanPath(asPath) === action.href + const itemIcon = + lvl !== 1 || !icon ? undefined : ( + + ) + + const expandIcon = isLink ? undefined : ( + + ) + return ( + + + {label} + + + {description} + + ) -}) +} export default ItemContent diff --git a/src/components/Nav/Menu/LvlPortal.tsx b/src/components/Nav/Menu/LvlPortal.tsx index e5f16ab9e75..2a4d6c5b9f6 100644 --- a/src/components/Nav/Menu/LvlPortal.tsx +++ b/src/components/Nav/Menu/LvlPortal.tsx @@ -1,10 +1,16 @@ import { Fragment } from "react" +import { useRouter } from "next/router" import { Menu as ArkMenu, Portal as ArkPortal } from "@ark-ui/react" -import { Flex } from "@chakra-ui/react" +import { Button, Flex, Icon, Link } from "@chakra-ui/react" + +import { ButtonProps } from "@/components/Buttons" + +import { cleanPath } from "@/lib/utils/url" import type { Level, LvlRefs, NavItem } from "../types" import ItemContent from "./ItemContent" +import NextChevron from "./NextChevron" import { useRtlFlip } from "@/hooks/useRtlFlip" @@ -16,8 +22,10 @@ type LvlPortalProps = { const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { const { direction } = useRtlFlip() + const { asPath } = useRouter() const pad = 4 if (lvl > 3) return null + return ( @@ -45,17 +53,37 @@ const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { }} > {items.map((item) => { - const { label, ...action } = item + const { label, description, icon, ...action } = item + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + + const buttonProps: ButtonProps = { + color: isActivePage ? "menu.active" : `menu.lvl${lvl}.main`, + leftIcon: lvl !== 1 || !icon ? undefined : , + rightIcon: isLink ? undefined : , + position: "relative", + w: "full", + sx: { "span:first-of-type": { m: 0, me: 4 } }, // Spacing for icon + py: "4", + bg: "none", + _hover: { boxShadow: "none" }, + _active: { boxShadow: "none" }, + } + return ( - {"href" in action ? ( - - + {isLink ? ( + + ) : ( - + - + { return ( <> - + {SECTION_LABELS.map((sectionKey) => { - const { label } = sections[sectionKey] + const { label, items } = sections[sectionKey] const isActive = activeSection === sectionKey return ( handleOpenChange(details, sectionKey)} dir={direction} + onOpenChange={(details) => handleOpenChange(details, sectionKey)} + loop > - + ) })} From 0bb753e0a7734f6a7e60262fcf7e2aeee0602c15 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:41:59 -0800 Subject: [PATCH 141/478] chore: hooks first, rm unused --- src/components/Nav/Menu/index.tsx | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index fb03116bd9a..17cb8081a36 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -31,25 +31,18 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { const { direction } = useRtlFlip() - const handleOpenChange = ( - { open }: MenuOpenChangeDetails, - sectionKey: NavSectionKey - ): void => { - setActiveSection(open ? sectionKey : null) - open ? onOpen() : onClose() - } - const refs: LvlRefs = { lvl1: useRef(null), lvl2: useRef(null), lvl3: useRef(null), } - const handleSectionHover = (sectionKey: NavSectionKey) => { - if (!isOpen) return - if (sectionKey === activeSection) return - setActiveSection(sectionKey) - // TODO: Open the section being hovered + const handleOpenChange = ( + { open }: MenuOpenChangeDetails, + sectionKey: NavSectionKey + ): void => { + setActiveSection(open ? sectionKey : null) + open ? onOpen() : onClose() } return ( @@ -70,7 +63,6 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { variant="ghost" m="0" color={isActive ? "primary.base" : "menu.lvl1.body"} - // onMouseEnter={() => handleSectionHover(sectionKey)} > {isActive && ( Date: Thu, 1 Feb 2024 16:04:12 -0800 Subject: [PATCH 142/478] feat: update mobile menu close button use intl header --- src/components/Nav/Mobile.tsx | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index cafc2dbe6e9..5c5981ea611 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -12,6 +12,7 @@ import { chakra, Drawer, DrawerBody, + DrawerCloseButton, DrawerContent, DrawerFooter, DrawerHeader, @@ -341,14 +342,9 @@ const MobileNavMenu = ({ size="md" > + - + - Ethereum.org + {t("site-title")} - + + {t("close")} + {/* MAIN NAV CONTENTS OF MOBILE MENU */} - + {SECTION_LABELS.map((key) => linkSections[key]).map( ({ label, items }) => ( From f13b893497ba19f6ddb8eeb4bb16287ae6a0bfc5 Mon Sep 17 00:00:00 2001 From: Arian Hamdi Date: Fri, 2 Feb 2024 10:46:45 +0330 Subject: [PATCH 143/478] fix: popup position --- src/components/FeedbackWidget.tsx | 132 ++++++++++++++++-------------- 1 file changed, 69 insertions(+), 63 deletions(-) diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index b313826ee17..6a0223e56fc 100644 --- a/src/components/FeedbackWidget.tsx +++ b/src/components/FeedbackWidget.tsx @@ -185,79 +185,85 @@ const FeedbackWidget = () => { - - - - {feedbackSubmitted - ? t("feedback-widget-thank-you-title") - : t("feedback-widget-prompt")} - + - {/* Body: */} - {feedbackSubmitted && ( - <> - - {t("feedback-widget-thank-you-subtitle")} - - - {t("feedback-widget-thank-you-timing")} - - - )} + + {feedbackSubmitted + ? t("feedback-widget-thank-you-title") + : t("feedback-widget-prompt")} + - - {feedbackSubmitted ? ( - - ) : ( + {/* Body: */} + {feedbackSubmitted && ( <> - - + {t("feedback-widget-thank-you-timing")} + )} - + + + {feedbackSubmitted ? ( + + ) : ( + <> + + + + )} + + From 68bf0c7c976c83f5ad07d461494cefcc0d06036f Mon Sep 17 00:00:00 2001 From: Arian Hamdi Date: Fri, 2 Feb 2024 10:52:52 +0330 Subject: [PATCH 144/478] fix: change left to insetStart --- src/components/FeedbackWidget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index 6a0223e56fc..0c4efae2cf1 100644 --- a/src/components/FeedbackWidget.tsx +++ b/src/components/FeedbackWidget.tsx @@ -46,8 +46,8 @@ const FixedDot = ({ position="sticky" bottom={{ base: `${bottomOffset + 1}rem`, lg: 4 }} me="1rem" - left={`calc(100% - ${size})`} mt={{ lg: "inherit" }} + insetStart={`calc(100% - ${size})`} insetEnd={4} zIndex={98} /* Below the mobile menu */ display="flex" From ff1e34fe9fa7acd135b4320a95c7bfeae071540a Mon Sep 17 00:00:00 2001 From: Arian Hamdi Date: Fri, 2 Feb 2024 10:53:21 +0330 Subject: [PATCH 145/478] fix: typo --- src/components/FeedbackWidget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index 0c4efae2cf1..85cfcb5a756 100644 --- a/src/components/FeedbackWidget.tsx +++ b/src/components/FeedbackWidget.tsx @@ -138,7 +138,7 @@ const FeedbackWidget = () => { setIsExpanded(false) } - // Dispay on English pages only + // Display on English pages only if (locale !== DEFAULT_LOCALE) return null return ( From f36cc9b3be58b33d112efd167bb7779187c5cf02 Mon Sep 17 00:00:00 2001 From: Maxime Servais Date: Fri, 2 Feb 2024 11:03:24 +0100 Subject: [PATCH 146/478] Add Base as an Optimistic rollup [Fixes #11698] --- public/layer-2/base.png | Bin 0 -> 13050 bytes src/data/layer-2/layer-2.ts | 17 +++++++++++++++++ src/intl/en/page-layer-2.json | 2 ++ 3 files changed, 19 insertions(+) create mode 100644 public/layer-2/base.png diff --git a/public/layer-2/base.png b/public/layer-2/base.png new file mode 100644 index 0000000000000000000000000000000000000000..8293da7a78f710100a4ecb5f92e966a5a20e54a4 GIT binary patch literal 13050 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 z z*xi@+{rJ_!eBOlj8}q%ywH|!#&MtLXp)n%-D!!Naw#pNW46!Ihb-}cK&gU<9zXS{1 zQeGFZ%bQJS5cVnnGKAmzS(rs$Ag9MAJPdYNUq#N3uoVaXKdE1m@gHa5asU7T07*qo IM6N<$f* Date: Fri, 2 Feb 2024 11:11:55 +0100 Subject: [PATCH 147/478] Ran autofix to sort imports --- src/data/layer-2/layer-2.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/layer-2/layer-2.ts b/src/data/layer-2/layer-2.ts index b34e3d63e9f..a501eea3a96 100644 --- a/src/data/layer-2/layer-2.ts +++ b/src/data/layer-2/layer-2.ts @@ -4,10 +4,10 @@ import type { TranslationKey } from "@/lib/types" import ArbitrumImage from "@/public/layer-2/arbitrum.png" import AztecImage from "@/public/layer-2/aztec.png" +import BaseImage from "@/public/layer-2/base.png" import BobaImage from "@/public/layer-2/boba.png" import LoopringImage from "@/public/layer-2/loopring.png" import OptimismImage from "@/public/layer-2/optimism.png" -import BaseImage from "@/public/layer-2/base.png" import StarknetImage from "@/public/layer-2/starknet.png" import ZKSpaceImage from "@/public/layer-2/zkspace.png" import zkSyncImage from "@/public/layer-2/zksync.png" From ab4086da1530edff0b2a01c00d96626bed13e69b Mon Sep 17 00:00:00 2001 From: Nuno Loureiro Date: Fri, 2 Feb 2024 15:26:22 +0000 Subject: [PATCH 148/478] fixed image --- .../developers/docs/transactions/gas-tx.png | Bin 11788 -> 11487 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/content/translations/pt-br/developers/docs/transactions/gas-tx.png b/public/content/translations/pt-br/developers/docs/transactions/gas-tx.png index 0ffd5869b721e717cc562f9380d3057467a6ade7..3b347370158fc662e4d8eac82d57fd8e21194e5c 100644 GIT binary patch literal 11487 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 From 5d5f9b0d6015ad7def01bf746fa39000200bb2c1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:04:28 +0100 Subject: [PATCH 149/478] docs: add function comment Co-authored-by: Pablo Pettinari --- src/lib/utils/url.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/utils/url.ts b/src/lib/utils/url.ts index 12d26ccff88..9aefe24a02d 100644 --- a/src/lib/utils/url.ts +++ b/src/lib/utils/url.ts @@ -36,4 +36,5 @@ export const isHrefActive = ( export const isHash = (href: string): boolean => href.startsWith("#") +// remove any query params or hashes from the path export const cleanPath = (path: string): string => path.replace(/[$#].+$/, "") From 186460ab82af2a76008accc18d46cc66ea71668f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:21:53 -0800 Subject: [PATCH 150/478] style: update spacing token --- src/@chakra-ui/foundations/spacing.ts | 2 +- src/components/Nav/Menu/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/@chakra-ui/foundations/spacing.ts b/src/@chakra-ui/foundations/spacing.ts index 2dfdb908578..0a8832ced03 100644 --- a/src/@chakra-ui/foundations/spacing.ts +++ b/src/@chakra-ui/foundations/spacing.ts @@ -1,7 +1,7 @@ const spacing = { 7.5: "1.875rem", 10.5: "2.625rem", - navHeight: "4.75rem", + 16.5: "4.75rem", // Nav height } export default spacing diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 17cb8081a36..cc7381425f1 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -89,7 +89,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { Date: Sat, 3 Feb 2024 02:08:04 +0500 Subject: [PATCH 151/478] update broken link #12077 --- src/pages/stablecoins.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index f7e28079fbe..68313c682fa 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -563,7 +563,7 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { {t("page-stablecoins-usdc-banner-swap-button")} From 73295961e59fc8ecacace716dfd12688d03610f1 Mon Sep 17 00:00:00 2001 From: Mohit Kambli Date: Fri, 2 Feb 2024 17:35:46 -0500 Subject: [PATCH 152/478] Fix #12101: Bug: missing space in history entries --- src/components/History/NetworkUpgradeSummary.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/History/NetworkUpgradeSummary.tsx b/src/components/History/NetworkUpgradeSummary.tsx index 6e69957897d..46d84cacc10 100644 --- a/src/components/History/NetworkUpgradeSummary.tsx +++ b/src/components/History/NetworkUpgradeSummary.tsx @@ -52,7 +52,7 @@ const NetworkUpgradeSummary = ({ name }: NetworkUpgradeSummaryProps) => { {t(translationKey)}:{" "} - {new Intl.NumberFormat(localeForStatsBoxNumbers).format(number)} + {new Intl.NumberFormat(localeForStatsBoxNumbers).format(number)} ) From 3837d70c76e6f69fadf63ef2dab5f6cb3df115d4 Mon Sep 17 00:00:00 2001 From: Sam Richards Date: Fri, 2 Feb 2024 19:27:54 -0500 Subject: [PATCH 153/478] fix: homepage link to developers page --- src/pages/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/index.tsx b/src/pages/index.tsx index a7af8529a0c..96d89b2744b 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -530,7 +530,7 @@ const HomePage = ({ - + From 229f6623300965e5b3cc7dd27895f37c03543a92 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 2 Feb 2024 23:04:25 -0800 Subject: [PATCH 154/478] fix: intl string key typo --- src/intl/en/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/common.json b/src/intl/en/common.json index ee0b1a9bbe6..bf86dbdb8df 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -209,7 +209,7 @@ "nav-mainnet-description": "Enterprise blockchain applications can be built on the public Ethereum Mainnet", "nav-nft-description": "A way to represent anything unique as an Ethereum-based asset", "nav-open-research-description": "One of the primary strengths of Ethereum is its active research community", - "nav-open-reserach-label": "Open research", + "nav-open-research-label": "Open research", "nav-overview-description": "All things Ethereum education", "nav-overview-label": "Overview", "nav-participate-overview-description": "Overview on how to participate", From 01de5b26902176aa67e9b9907e1f7661eb96773a Mon Sep 17 00:00:00 2001 From: Vincent Legrand <66972283+NelCit@users.noreply.github.com> Date: Sat, 3 Feb 2024 12:16:36 +0100 Subject: [PATCH 155/478] Typo : "NTF" instead of "NFT" --- public/content/translations/fr/web3/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/fr/web3/index.md b/public/content/translations/fr/web3/index.md index 07b996fc003..88a8fdce02e 100644 --- a/public/content/translations/fr/web3/index.md +++ b/public/content/translations/fr/web3/index.md @@ -64,7 +64,7 @@ Web3 permet la propriété directe via les [jetons non-fongibles (NFT)](/nft/).
      En savoir plus sur les NFT
      - Plus d'infos sur les NTF + Plus d'infos sur les NFT
      From 7282e1f23bd55cd18c72cb110fae6f1373663cdb Mon Sep 17 00:00:00 2001 From: a-hagi613 Date: Sun, 4 Feb 2024 11:28:41 -0500 Subject: [PATCH 156/478] fixed the broken link to correct one stated in issue: Update USDC link on stablecoin.tsx #12077 --- src/pages/stablecoins.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index f7e28079fbe..68313c682fa 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -563,7 +563,7 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { {t("page-stablecoins-usdc-banner-swap-button")} From 0f50e9c57775786d2c242f333107265b2021dd21 Mon Sep 17 00:00:00 2001 From: Barukimang Date: Mon, 5 Feb 2024 09:41:30 +0300 Subject: [PATCH 157/478] added ethsafari event info for 2024 --- src/data/community-events.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/community-events.ts b/src/data/community-events.ts index a40158dac91..42480df6c4d 100644 --- a/src/data/community-events.ts +++ b/src/data/community-events.ts @@ -349,6 +349,15 @@ const communityConferences: CommunityConference[] = [ location: "Lagos, NGA", description: "This conference will bring together Web3 enthusiasts from all over Nigeria and beyond. Here, community meets technology for three days of intensive Networking and Learning experiences.", }, + { + title: "ETHSafari", + startDate: "2024-09-09", + endDate: "2024-09-15", + to: "https://ethsafari.xyz/", + location: "Nairobi & Kilifi, Kenya", + description: + "Welcome to the latest greatest Ethereum event happening in Africa! Join the BlockTrain from Nairobi to celebrate an ETH-festival held underneath ancient Boabab trees in Kilifi.", + }, { title: "TOKEN2049", startDate: "2024-09-18", From 02b594f95ee428ae151950a6eb68a9c180b8c482 Mon Sep 17 00:00:00 2001 From: Barukimang Date: Mon, 5 Feb 2024 09:55:59 +0300 Subject: [PATCH 158/478] small edit --- src/data/community-events.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/community-events.ts b/src/data/community-events.ts index 42480df6c4d..62443075058 100644 --- a/src/data/community-events.ts +++ b/src/data/community-events.ts @@ -356,7 +356,7 @@ const communityConferences: CommunityConference[] = [ to: "https://ethsafari.xyz/", location: "Nairobi & Kilifi, Kenya", description: - "Welcome to the latest greatest Ethereum event happening in Africa! Join the BlockTrain from Nairobi to celebrate an ETH-festival held underneath ancient Boabab trees in Kilifi.", + "Welcome to the largest Ethereum event happening in Africa! Join the BlockTrain from Nairobi to celebrate an ETH-festival held underneath ancient Boabab trees in Kilifi.", }, { title: "TOKEN2049", From fe1ed8a8e2bb428f2f273b574e62a472e87a8735 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:19:37 -0800 Subject: [PATCH 159/478] feat: browser preference badge --- src/components/LanguagePicker/MenuItem.tsx | 177 ++++++++++-------- src/components/LanguagePicker/index.tsx | 54 ++---- .../LanguagePicker/useLanguagePicker.tsx | 43 +++-- src/intl/en/page-languages.json | 3 +- src/lib/types.ts | 2 + 5 files changed, 137 insertions(+), 142 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index f50c381f3b7..5b92c0db558 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -2,6 +2,7 @@ import { useRouter } from "next/router" import { useTranslation } from "next-i18next" import { BsCheck } from "react-icons/bs" import { + Badge, Box, Flex, forwardRef, @@ -19,95 +20,113 @@ import ProgressBar from "./ProgressBar" type ItemProps = ChakraMenuItemProps & { displayInfo: LocaleDisplayInfo - isFeatured?: boolean } -const MenuItem = forwardRef( - ({ displayInfo, isFeatured, ...props }: ItemProps, ref) => { - const { - localeOption, - sourceName, - targetName, - approvalProgress, - wordsApproved, - } = displayInfo - const { t } = useTranslation("page-languages") - const { asPath, locale } = useRouter() - const isCurrent = localeOption === locale && !isFeatured +const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { + const { + localeOption, + sourceName, + targetName, + approvalProgress, + wordsApproved, + isBrowserPreference, + isBrowserDefault, + } = displayInfo + const { t } = useTranslation("page-languages") + const { asPath, locale } = useRouter() + const isCurrent = localeOption === locale - const getProgressInfo = ( - approvalProgress: number, - wordsApproved: number - ) => { - const percentage = new Intl.NumberFormat(locale!, { - style: "percent", - }).format(approvalProgress / 100) - const progress = - approvalProgress === 0 ? "<" + percentage.replace("0", "1") : percentage - const words = new Intl.NumberFormat(locale!).format(wordsApproved) - return { progress, words } - } + const getProgressInfo = (approvalProgress: number, wordsApproved: number) => { + const percentage = new Intl.NumberFormat(locale!, { + style: "percent", + }).format(approvalProgress / 100) + const progress = + approvalProgress === 0 ? "<" + percentage.replace("0", "1") : percentage + const words = new Intl.NumberFormat(locale!).format(wordsApproved) + return { progress, words } + } - const { progress, words } = getProgressInfo(approvalProgress, wordsApproved) + const { progress, words } = getProgressInfo(approvalProgress, wordsApproved) - return ( - { - e.target.scrollIntoView({ block: "nearest" }) - }} - scrollMarginY="16" - _hover={{ bg: "primary.lowContrast", textDecoration: "none" }} - _focus={{ bg: "primary.lowContrast" }} - sx={{ - p: { - textDecoration: "none", - overflow: "hidden", - textOverflow: "ellipsis", - whiteSpace: "nowrap", - }, - }} - href={asPath} - locale={localeOption} - {...props} - > - - + return ( + { + e.target.scrollIntoView({ block: "nearest" }) + }} + scrollMarginY="8" + _hover={{ bg: "primary.lowContrast", textDecoration: "none" }} + _focus={{ bg: "primary.lowContrast" }} + sx={{ + p: { + textDecoration: "none", + overflow: "hidden", + textOverflow: "ellipsis", + whiteSpace: "nowrap", + }, + }} + href={asPath} + locale={localeOption} + {...props} + > + + + {targetName} - - {sourceName} - - - {isCurrent && } - - - {progress} {t("page-languages-translated")} • {words}{" "} - {t("page-languages-words")} - - - - ) - } -) + {isBrowserPreference && ( + + {t( + isBrowserDefault + ? "page-languages-browser-default" + : "page-languages-browser-preference" + )} + + )} + + + {sourceName} + + + {isCurrent && } +
      + + {progress} {t("page-languages-translated")} • {words}{" "} + {t("page-languages-words")} + + + + ) +}) export default MenuItem diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index c33780f0c22..90e6b32e9cd 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -3,7 +3,6 @@ import { Flex, Input, Menu, - MenuDivider, MenuItem as ChakraMenuItem, MenuList, type MenuListProps, @@ -37,7 +36,7 @@ const LanguagePicker = ({ firstItemRef, filterValue, setFilterValue, - browserLocalesInfo, + browserLocales, filteredNames, } = useLanguagePicker(handleClose) @@ -81,28 +80,6 @@ const LanguagePicker = ({ bg="background.highlight" sx={{ "[role=menuitem]": { py: "3", px: "2" } }} > - {browserLocalesInfo.length > 0 && ( - <> - - {t("page-languages-browser-language")} - - {browserLocalesInfo.map((displayInfo) => ( - - onClose({ - eventAction: "Locale chosen (browser preference)", - eventName: displayInfo.localeOption, - }) - } - isFeatured - /> - ))} - - - )} - {t("page-languages-filter-label")}{" "} @@ -136,22 +113,19 @@ const LanguagePicker = ({ /> - {filteredNames.map((displayInfo, index) => { - const firstResult = index === 0 - return ( - - onClose({ - eventAction: "Locale chosen", - eventName: displayInfo.localeOption, - }) - } - /> - ) - })} + {filteredNames.map((displayInfo, index) => ( + + onClose({ + eventAction: "Locale chosen", + eventName: displayInfo.localeOption, + }) + } + /> + ))} {filteredNames.length === 0 && ( void) => { const [filterValue, setFilterValue] = useState("") const [filteredNames, setFilteredNames] = useState([]) - const [browserLocalesInfo, setBrowserLocalesInfo] = useState< - LocaleDisplayInfo[] - >([]) + const [browserLocales, setBrowserLocales] = useState([]) const localeToDisplayInfo = useCallback( (localeOption: Lang): LocaleDisplayInfo => { @@ -81,6 +79,9 @@ export const useLanguagePicker = (handleClose?: () => void) => { ? totalWords || 0 : dataItem?.words.approved || 0 + const isBrowserPreference = browserLocales.includes(localeOption) + const isBrowserDefault = + browserLocales.length > 0 && browserLocales[0] === localeOption return { localeOption, approvalProgress, @@ -88,9 +89,11 @@ export const useLanguagePicker = (handleClose?: () => void) => { targetName, englishName, wordsApproved, + isBrowserPreference, + isBrowserDefault, } }, - [locale, t] + [browserLocales, locale, t] ) // perform all the filtering and mapping when the filter value change @@ -103,8 +106,11 @@ export const useLanguagePicker = (handleClose?: () => void) => { .map( (navLang) => locales?.reduce((acc, cur) => { - if (cur.toLowerCase() === navLang) return cur - if (navLang.includes(cur.toLowerCase()) && acc !== navLang) + if (cur.toLowerCase() === navLang.toLowerCase()) return cur + if ( + navLang.toLowerCase().includes(cur.toLowerCase()) && + acc !== navLang + ) return cur return acc }, "") as Lang @@ -112,12 +118,16 @@ export const useLanguagePicker = (handleClose?: () => void) => { .filter((i) => !!i) // Remove those without matches // Remove duplicate matches - const browserLocales: Lang[] = Array.from(new Set(allBrowserLocales)) + setBrowserLocales(Array.from(new Set(allBrowserLocales))) const displayNames: LocaleDisplayInfo[] = - (locales as Lang[]) - ?.map(localeToDisplayInfo) - .sort((a, b) => b.approvalProgress - a.approvalProgress) || [] + (locales as Lang[])?.map(localeToDisplayInfo).sort((a, b) => { + if (a.isBrowserDefault) return -1 + if (b.isBrowserDefault) return 1 + if (a.isBrowserPreference) return -1 + if (b.isBrowserPreference) return 1 + return b.approvalProgress - a.approvalProgress + }) || [] setFilteredNames( displayNames.filter( @@ -127,17 +137,6 @@ export const useLanguagePicker = (handleClose?: () => void) => { .includes(filterValue.toLowerCase()) ) ) - // Get display info for each browser locale - setBrowserLocalesInfo( - browserLocales.map((browserLocale) => { - const item = displayNames.find( - ({ localeOption }) => localeOption === browserLocale - ) - if (!item) - throw new Error("Missing browser locale info for " + browserLocale) - return item - }) - ) }, [filterValue, localeToDisplayInfo, locales]) const { isOpen, ...menu } = useDisclosure() @@ -180,7 +179,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { firstItemRef, filterValue, setFilterValue, - browserLocalesInfo, + browserLocales, filteredNames, } } diff --git a/src/intl/en/page-languages.json b/src/intl/en/page-languages.json index 700d0ec58bf..c1625accf10 100644 --- a/src/intl/en/page-languages.json +++ b/src/intl/en/page-languages.json @@ -13,7 +13,8 @@ "page-languages-want-more-paragraph": "ethereum.org translators are always translating pages in as many languages as possible. To see what they're working on right now or to sign up to join them, read about our", "page-languages-filter-label": "Filter list", "page-languages-filter-placeholder": "Type to filter", - "page-languages-browser-language": "Browser language(s)", + "page-languages-browser-default": "Browser default", + "page-languages-browser-preference": "Browser preference", "page-languages-translated": "translated", "page-languages-words": "words", "page-languages-recruit-community": "Help us translate ethereum.org.", diff --git a/src/lib/types.ts b/src/lib/types.ts index 66e4a40ccc0..dfc362af38e 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -231,6 +231,8 @@ export type LocaleDisplayInfo = { englishName: string approvalProgress: number wordsApproved: number + isBrowserPreference?: boolean + isBrowserDefault?: boolean } type TranslatedStats = { From 23e7fda083663e0c53572fca8fe8228ea647bf46 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:06:22 -0800 Subject: [PATCH 160/478] chore: deprecate isBrowserPreference --- src/components/LanguagePicker/MenuItem.tsx | 9 ++------- .../LanguagePicker/useLanguagePicker.tsx | 17 ++++++++--------- src/intl/en/page-languages.json | 1 - src/lib/types.ts | 1 - 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index 5b92c0db558..0903d39dab0 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -29,7 +29,6 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { targetName, approvalProgress, wordsApproved, - isBrowserPreference, isBrowserDefault, } = displayInfo const { t } = useTranslation("page-languages") @@ -90,7 +89,7 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { > {targetName} - {isBrowserPreference && ( + {isBrowserDefault && ( { h="fit-content" bg="none" > - {t( - isBrowserDefault - ? "page-languages-browser-default" - : "page-languages-browser-preference" - )} + {t("page-languages-browser-default")} )}
      diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index bf01a5156bc..ddd4d22660d 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -79,9 +79,8 @@ export const useLanguagePicker = (handleClose?: () => void) => { ? totalWords || 0 : dataItem?.words.approved || 0 - const isBrowserPreference = browserLocales.includes(localeOption) - const isBrowserDefault = - browserLocales.length > 0 && browserLocales[0] === localeOption + const isBrowserDefault = browserLocales.includes(localeOption) + return { localeOption, approvalProgress, @@ -89,7 +88,6 @@ export const useLanguagePicker = (handleClose?: () => void) => { targetName, englishName, wordsApproved, - isBrowserPreference, isBrowserDefault, } }, @@ -108,7 +106,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { locales?.reduce((acc, cur) => { if (cur.toLowerCase() === navLang.toLowerCase()) return cur if ( - navLang.toLowerCase().includes(cur.toLowerCase()) && + navLang.toLowerCase().startsWith(cur.toLowerCase()) && acc !== navLang ) return cur @@ -122,10 +120,11 @@ export const useLanguagePicker = (handleClose?: () => void) => { const displayNames: LocaleDisplayInfo[] = (locales as Lang[])?.map(localeToDisplayInfo).sort((a, b) => { - if (a.isBrowserDefault) return -1 - if (b.isBrowserDefault) return 1 - if (a.isBrowserPreference) return -1 - if (b.isBrowserPreference) return 1 + const indexA = browserLocales.indexOf(a.localeOption as Lang) + const indexB = browserLocales.indexOf(b.localeOption as Lang) + if (indexA >= 0 && indexB >= 0) return indexA - indexB + if (indexA >= 0) return -1 + if (indexB >= 0) return 1 return b.approvalProgress - a.approvalProgress }) || [] diff --git a/src/intl/en/page-languages.json b/src/intl/en/page-languages.json index c1625accf10..9fd6feea227 100644 --- a/src/intl/en/page-languages.json +++ b/src/intl/en/page-languages.json @@ -14,7 +14,6 @@ "page-languages-filter-label": "Filter list", "page-languages-filter-placeholder": "Type to filter", "page-languages-browser-default": "Browser default", - "page-languages-browser-preference": "Browser preference", "page-languages-translated": "translated", "page-languages-words": "words", "page-languages-recruit-community": "Help us translate ethereum.org.", diff --git a/src/lib/types.ts b/src/lib/types.ts index dfc362af38e..18d437e134d 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -231,7 +231,6 @@ export type LocaleDisplayInfo = { englishName: string approvalProgress: number wordsApproved: number - isBrowserPreference?: boolean isBrowserDefault?: boolean } From c4e3639269c9462a1c89760c16e4d6ce793f018f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:09:34 -0800 Subject: [PATCH 161/478] chore: add missing hook dependency --- src/components/LanguagePicker/useLanguagePicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index ddd4d22660d..157daeec993 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -136,7 +136,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { .includes(filterValue.toLowerCase()) ) ) - }, [filterValue, localeToDisplayInfo, locales]) + }, [browserLocales, filterValue, localeToDisplayInfo, locales]) const { isOpen, ...menu } = useDisclosure() From 21379636a9e894ebb3372308620c55f4e49a4ba3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 5 Feb 2024 15:31:22 -0800 Subject: [PATCH 162/478] chore: clean up unused variables --- src/components/LanguagePicker/index.tsx | 1 - .../LanguagePicker/useLanguagePicker.tsx | 61 +++++++++---------- 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 90e6b32e9cd..7c347d33249 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -36,7 +36,6 @@ const LanguagePicker = ({ firstItemRef, filterValue, setFilterValue, - browserLocales, filteredNames, } = useLanguagePicker(handleClose) diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 157daeec993..25d3e77b603 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef, useState } from "react" +import { useEffect, useRef, useState } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" import { useDisclosure } from "@chakra-ui/react" @@ -27,10 +27,32 @@ export const useLanguagePicker = (handleClose?: () => void) => { const [filterValue, setFilterValue] = useState("") const [filteredNames, setFilteredNames] = useState([]) - const [browserLocales, setBrowserLocales] = useState([]) - const localeToDisplayInfo = useCallback( - (localeOption: Lang): LocaleDisplayInfo => { + // perform all the filtering and mapping when the filter value change + useEffect(() => { + // Get the preferred languages for the users browser + const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] + + // For each browser preference, reduce to the most specific match found in `locales` array + const allBrowserLocales: Lang[] = navLangs + .map( + (navLang) => + locales?.reduce((acc, cur) => { + if (cur.toLowerCase() === navLang.toLowerCase()) return cur + if ( + navLang.toLowerCase().startsWith(cur.toLowerCase()) && + acc !== navLang + ) + return cur + return acc + }, "") as Lang + ) + .filter((i) => !!i) // Remove those without matches + + // Remove duplicate matches + const browserLocales = Array.from(new Set(allBrowserLocales)) + + const localeToDisplayInfo = (localeOption: Lang): LocaleDisplayInfo => { const i18nItem: I18nLocale = languages[localeOption] const englishName = i18nItem.name @@ -90,33 +112,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { wordsApproved, isBrowserDefault, } - }, - [browserLocales, locale, t] - ) - - // perform all the filtering and mapping when the filter value change - useEffect(() => { - // Get the preferred languages for the users browser - const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] - - // For each browser preference, reduce to the most specific match found in `locales` array - const allBrowserLocales: Lang[] = navLangs - .map( - (navLang) => - locales?.reduce((acc, cur) => { - if (cur.toLowerCase() === navLang.toLowerCase()) return cur - if ( - navLang.toLowerCase().startsWith(cur.toLowerCase()) && - acc !== navLang - ) - return cur - return acc - }, "") as Lang - ) - .filter((i) => !!i) // Remove those without matches - - // Remove duplicate matches - setBrowserLocales(Array.from(new Set(allBrowserLocales))) + } const displayNames: LocaleDisplayInfo[] = (locales as Lang[])?.map(localeToDisplayInfo).sort((a, b) => { @@ -136,7 +132,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { .includes(filterValue.toLowerCase()) ) ) - }, [browserLocales, filterValue, localeToDisplayInfo, locales]) + }, [filterValue, locale, locales, t]) const { isOpen, ...menu } = useDisclosure() @@ -178,7 +174,6 @@ export const useLanguagePicker = (handleClose?: () => void) => { firstItemRef, filterValue, setFilterValue, - browserLocales, filteredNames, } } From 8c3576ed6344918f9a658ca29d690e5c20bbea02 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:11:37 -0800 Subject: [PATCH 163/478] feat: keyboard navigation updates --- .../LanguagePicker/NoResultsCallout.tsx | 43 ++-- src/components/LanguagePicker/index.tsx | 187 +++++++++++------- .../LanguagePicker/useLanguagePicker.tsx | 20 +- src/components/Nav/index.tsx | 4 +- 4 files changed, 161 insertions(+), 93 deletions(-) diff --git a/src/components/LanguagePicker/NoResultsCallout.tsx b/src/components/LanguagePicker/NoResultsCallout.tsx index 78c11076f56..e45916839de 100644 --- a/src/components/LanguagePicker/NoResultsCallout.tsx +++ b/src/components/LanguagePicker/NoResultsCallout.tsx @@ -1,5 +1,5 @@ import { useTranslation } from "next-i18next" -import { Box, Text } from "@chakra-ui/react" +import { FormHelperText, forwardRef, Text } from "@chakra-ui/react" import { BaseLink } from "@/components/Link" @@ -7,24 +7,27 @@ import MenuItem from "./MenuItem" type NoResultsCalloutProps = { onClose: () => void } -const NoResultsCallout = ({ onClose }: NoResultsCalloutProps) => { - const { t } = useTranslation("page-languages") - return ( - - - {t("page-languages-want-more-header")} - - {t("page-languages-want-more-paragraph")}{" "} - - {t("page-languages-want-more-link")} - - - ) -} +const NoResultsCallout = forwardRef( + ({ onClose }: NoResultsCalloutProps, ref) => { + const { t } = useTranslation("page-languages") + return ( + + + {t("page-languages-want-more-header")} + + {t("page-languages-want-more-paragraph")}{" "} + + {t("page-languages-want-more-link")} + + + ) + } +) export default NoResultsCallout diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 7c347d33249..2cd953d6d94 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -1,13 +1,19 @@ import { Box, Flex, + FormControl, + FormLabel, Input, + InputGroup, + InputRightElement, + Kbd, Menu, - MenuItem as ChakraMenuItem, MenuList, type MenuListProps, type MenuProps, Text, + type UseDisclosureReturn, + useEventListener, } from "@chakra-ui/react" import { Button } from "@/components/Buttons" @@ -21,34 +27,45 @@ type LanguagePickerProps = Omit & { children: React.ReactNode placement: MenuProps["placement"] handleClose?: () => void + menuState?: UseDisclosureReturn } const LanguagePicker = ({ children, placement, handleClose, + menuState, ...props }: LanguagePickerProps) => { - const { - t, - disclosure, - inputRef, - firstItemRef, - filterValue, - setFilterValue, - filteredNames, - } = useLanguagePicker(handleClose) - + const { t, refs, disclosure, filterValue, setFilterValue, filteredNames } = + useLanguagePicker(handleClose, menuState) + const { inputRef, firstItemRef, noResultsRef, footerRef } = refs const { onClose } = disclosure + /** + * Adds a keydown event listener to focus filter input (\). + * @param {string} event - The keydown event. + */ + useEventListener("keydown", (e) => { + if (e.key !== "\\") return + e.preventDefault() + inputRef.current?.focus() + }) + return ( - + {children} { + if (e.key === "Tab" || e.key === "\\") { + e.preventDefault() + ;(e.shiftKey ? inputRef : footerRef).current?.focus() + } + }} {...props} > {/* Mobile Close bar */} @@ -79,63 +96,100 @@ const LanguagePicker = ({ bg="background.highlight" sx={{ "[role=menuitem]": { py: "3", px: "2" } }} > - - {t("page-languages-filter-label")}{" "} - - ({filteredNames.length} {t("common:languages")}) - - - inputRef.current?.focus()} - p="0" - bg="transparent" - position="relative" - closeOnSelect={false} - > - setFilterValue(e.target.value)} - ref={inputRef} - h="8" - mt="1" - mb="2" - bg="background.base" - color="body.base" - onKeyDown={(e) => { - // Navigate to first result on enter - if (e.key === "Enter") { + + + {t("page-languages-filter-label")}{" "} + + ({filteredNames.length} {t("common:languages")}) + + + + setFilterValue(e.target.value)} + onBlur={(e) => { + if (e.relatedTarget?.tagName.toLowerCase() === "div") { + e.currentTarget.focus() + } + }} + ref={inputRef} + h="8" + mt="1" + mb="2" + bg="background.base" + color="body.base" + onKeyDown={(e) => { + // Navigate to first result on enter + if (e.key === "Enter") { + e.preventDefault() + firstItemRef.current?.click() + } + // If Tab/ArrowDown, focus on first item if available, NoResults link otherwise + if (e.key === "Tab" || e.key === "ArrowDown") { + e.preventDefault() + ;(filteredNames.length === 0 + ? noResultsRef + : firstItemRef + ).current?.focus() + e.stopPropagation() + } + }} + /> + + + \ + + + + + {filteredNames.map((displayInfo, index) => ( + { + if (e.key !== "\\") return e.preventDefault() - firstItemRef.current?.click() + inputRef.current?.focus() + }} + onClick={() => + onClose({ + eventAction: "Locale chosen", + eventName: displayInfo.localeOption, + }) } - }} - /> - + /> + ))} - {filteredNames.map((displayInfo, index) => ( - - onClose({ - eventAction: "Locale chosen", - eventName: displayInfo.localeOption, - }) - } - /> - ))} - - {filteredNames.length === 0 && ( - - onClose({ - eventAction: "Translation program link (no results)", - eventName: "/contributing/translation-program", - }) - } - /> - )} + {filteredNames.length === 0 && ( + + onClose({ + eventAction: "Translation program link (no results)", + eventName: "/contributing/translation-program", + }) + } + /> + )} + {/* Footer callout */} @@ -151,6 +205,7 @@ const LanguagePicker = ({ {t("page-languages-recruit-community")}{" "} onClose({ diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 25d3e77b603..78c3df6926d 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" -import { useDisclosure } from "@chakra-ui/react" +import { useDisclosure, type UseDisclosureReturn } from "@chakra-ui/react" import type { I18nLocale, @@ -19,11 +19,18 @@ import { DEFAULT_LOCALE } from "@/lib/constants" const data = progressData as ProjectProgressData[] -export const useLanguagePicker = (handleClose?: () => void) => { +export const useLanguagePicker = ( + handleClose?: () => void, + menuState?: UseDisclosureReturn +) => { const { t } = useTranslation("page-languages") const { locale, locales } = useRouter() - const inputRef = useRef(null) - const firstItemRef = useRef(null) + const refs = { + inputRef: useRef(null), + firstItemRef: useRef(null), + noResultsRef: useRef(null), + footerRef: useRef(null), + } const [filterValue, setFilterValue] = useState("") const [filteredNames, setFilteredNames] = useState([]) @@ -143,6 +150,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { const onOpen = () => { menu.onOpen() + menuState?.onOpen() trackCustomEvent({ ...eventBase, eventName: "Opened", @@ -160,6 +168,7 @@ export const useLanguagePicker = (handleClose?: () => void) => { setFilterValue("") handleClose && handleClose() menu.onClose() + menuState?.onClose() trackCustomEvent( (customMatomoEvent ? { ...eventBase, ...customMatomoEvent } @@ -169,9 +178,8 @@ export const useLanguagePicker = (handleClose?: () => void) => { return { t, + refs, disclosure: { isOpen, onOpen, onClose }, - inputRef, - firstItemRef, filterValue, setFilterValue, filteredNames, diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 0f84b80ae11..5818a745dca 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -42,6 +42,7 @@ const Nav: FC = ({ path }) => { const { t } = useTranslation("common") const searchModalDisclosure = useDisclosure() const navWrapperRef = useRef(null) + const languagePickerState = useDisclosure() const languagePickerRef = useRef(null) /** * Adds a keydown event listener to toggle color mode (ctrl|cmd + \) @@ -54,6 +55,7 @@ const Nav: FC = ({ path }) => { if (e.metaKey || e.ctrlKey) { toggleColorMode() } else { + if (languagePickerState.isOpen) return languagePickerRef.current?.click() } }) @@ -135,6 +137,7 @@ const Nav: FC = ({ path }) => { w="xs" inset="unset" top="unset" + menuState={languagePickerState} > = ({ path }) => { transition="color 0.2s" _hover={{ color: "primary.hover", - bg: "primary.lowContrast", "& svg": { transform: "rotate(10deg)", transition: "transform 0.5s", From 72470f0350e5058f879d2727dd61cd6688af5e90 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:26:47 -0800 Subject: [PATCH 164/478] fix: mobile picker positioning resolves RTL positioning bug --- src/components/LanguagePicker/index.tsx | 2 +- src/components/Nav/Mobile.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 2cd953d6d94..367d9a488be 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -25,7 +25,7 @@ import { useLanguagePicker } from "./useLanguagePicker" type LanguagePickerProps = Omit & { children: React.ReactNode - placement: MenuProps["placement"] + placement?: MenuProps["placement"] handleClose?: () => void menuState?: UseDisclosureReturn } diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index 85e8aaf3297..266e473f00a 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -337,8 +337,8 @@ const MobileNavMenu: React.FC = ({ {t(themeLabelKey)} Date: Tue, 6 Feb 2024 14:19:05 +0100 Subject: [PATCH 165/478] Update translation stats --- public/content/contributing/translation-program/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/contributing/translation-program/index.md b/public/content/contributing/translation-program/index.md index 478458ac5a3..94759801cbd 100644 --- a/public/content/contributing/translation-program/index.md +++ b/public/content/contributing/translation-program/index.md @@ -38,7 +38,7 @@ Read more about the ethereum.org Translation Program [mission and vision](/contr - [**5,600 +** translators](/contributing/translation-program/contributors/) - [**62** languages live on site](/languages/) -- [**3 million** words translated in 2022](/contributing/translation-program/acknowledgements/) +- [**3 million** words translated in 2023](/contributing/translation-program/acknowledgements/) From 08e68a2331455b68d79f3345174703499fa1653c Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 6 Feb 2024 08:08:46 -0700 Subject: [PATCH 166/478] Add missing namespace for gas page translations --- src/lib/utils/translations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/utils/translations.ts b/src/lib/utils/translations.ts index f9179a68c55..d61fee95ee8 100644 --- a/src/lib/utils/translations.ts +++ b/src/lib/utils/translations.ts @@ -149,7 +149,7 @@ const getRequiredNamespacesForPath = (path: string) => { if (path.startsWith("/gas")) { primaryNamespace = "page-gas" - requiredNamespaces = [...requiredNamespaces, "page-gas"] + requiredNamespaces = [...requiredNamespaces, "page-gas", "page-community"] } if (path.startsWith("/what-is-ethereum")) { From cb54a4663f184885e159f8621f791ef1f1c42745 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:02:18 -0800 Subject: [PATCH 167/478] feat: hide "languages" below lg breakpoint --- src/components/Nav/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx index 5818a745dca..99f23767f03 100644 --- a/src/components/Nav/index.tsx +++ b/src/components/Nav/index.tsx @@ -10,6 +10,7 @@ import { HStack, Icon, MenuButton, + Text, useDisclosure, useEventListener, } from "@chakra-ui/react" @@ -169,7 +170,10 @@ const Nav: FC = ({ path }) => { verticalAlign="middle" me={2} /> - {t("common:languages")} {locale!.toUpperCase()} + + {t("common:languages")}  + + {locale!.toUpperCase()} From 12eac19ef50f934523b3e5825ba28685d9cf10c1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:06:31 -0800 Subject: [PATCH 168/478] build: yarn add @radix-ui/react-navigation-menu --- package.json | 1 + yarn.lock | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/package.json b/package.json index 8f9a53a7e18..72ee8946f85 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@docsearch/react": "^3.5.2", "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", + "@radix-ui/react-navigation-menu": "^1.1.4", "@socialgouv/matomo-next": "^1.8.0", "clipboard": "^2.0.11", "embla-carousel-react": "^7.0.0", diff --git a/yarn.lock b/yarn.lock index 7d728c2ec29..4addf98d639 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3382,6 +3382,18 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" +"@radix-ui/react-dismissable-layer@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" + integrity sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-escape-keydown" "1.0.3" + "@radix-ui/react-focus-guards@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" @@ -3407,6 +3419,27 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-navigation-menu@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.1.4.tgz#654151310c3f9a29afd19fb60ddc7977e54b8a3d" + integrity sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.1" + "@radix-ui/react-collection" "1.0.3" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-context" "1.0.1" + "@radix-ui/react-direction" "1.0.1" + "@radix-ui/react-dismissable-layer" "1.0.5" + "@radix-ui/react-id" "1.0.1" + "@radix-ui/react-presence" "1.0.1" + "@radix-ui/react-primitive" "1.0.3" + "@radix-ui/react-use-callback-ref" "1.0.1" + "@radix-ui/react-use-controllable-state" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-use-previous" "1.0.1" + "@radix-ui/react-visually-hidden" "1.0.3" + "@radix-ui/react-popper@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" @@ -3432,6 +3465,15 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-presence@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" + integrity sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.1" + "@radix-ui/react-use-layout-effect" "1.0.1" + "@radix-ui/react-primitive@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" From 4a8739a1ec8120a1ddc4947b27bcd62ebb0579dc Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:08:08 -0800 Subject: [PATCH 169/478] feat: template radix-ui nav menu --- src/components/Nav/Menu/index.tsx | 224 +++++++++++++++++++----------- 1 file changed, 143 insertions(+), 81 deletions(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index cc7381425f1..9f37e3a9386 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,34 +1,22 @@ -import { useRef, useState } from "react" -import { motion } from "framer-motion" -import { Menu as ArkMenu, type MenuOpenChangeDetails } from "@ark-ui/react" -import { - Box, - Flex, - type FlexProps, - Grid, - Text, - useDisclosure, -} from "@chakra-ui/react" +import { useRef } from "react" +import { Box, Flex, Grid } from "@chakra-ui/react" +import * as NavigationMenu from "@radix-ui/react-navigation-menu" +import * as Portal from "@radix-ui/react-portal" import { Button } from "@/components/Buttons" +import Link from "@/components/Link" import { SECTION_LABELS } from "@/lib/constants" -import type { LvlRefs, NavSectionKey, NavSections } from "../types" - -import LvlPortal from "./LvlPortal" +import type { LvlRefs, NavSections } from "../types" import { useRtlFlip } from "@/hooks/useRtlFlip" -type NavMenuProps = FlexProps & { +type NavMenuProps = { sections: NavSections } -const Menu = ({ sections, ...props }: NavMenuProps) => { - const { isOpen, onOpen, onClose } = useDisclosure() - - const [activeSection, setActiveSection] = useState(null) - +const Menu = ({ sections }: NavMenuProps) => { const { direction } = useRtlFlip() const refs: LvlRefs = { @@ -37,77 +25,151 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { lvl3: useRef(null), } - const handleOpenChange = ( - { open }: MenuOpenChangeDetails, - sectionKey: NavSectionKey - ): void => { - setActiveSection(open ? sectionKey : null) - open ? onOpen() : onClose() - } - return ( <> - - {SECTION_LABELS.map((sectionKey) => { - const { label, items } = sections[sectionKey] - const isActive = activeSection === sectionKey - return ( - handleOpenChange(details, sectionKey)} - loop - > - - - - - - ) - })} - + + + + {SECTION_LABELS.map((sectionKey) => { + const { label: sectionLabel, items: l1Items } = + sections[sectionKey] + return ( + + + + + + {/* Content goes to Viewport, wrapped in Portal, referencing Grid column */} + + + + {l1Items.map( + ({ + label: l1Label, + description: l1Description, + ...l1Action + }) => { + const l2Items = l1Action.items || [] + return ( + + {"href" in l1Action ? ( + + + + ) : ( + <> + + + + + + + + {l2Items.map( + ({ + label: l2Label, + description: l2Description, + ...l2Action + }) => { + return ( + + + + + + + + + {l2Action.items?.map( + ({ + label: + l3Label, + description: + l3Description, + ...l3Action + }) => ( + + + + + + + + + ) + )} + + + + + + + ) + } + )} + + + + + + + + + )} + + ) + } + )} + + + + + + + + + ) + })} + + + + + + + From 0027ec9cd25fa0542fb0defa8182d9051798c32a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:22:49 -0800 Subject: [PATCH 170/478] refactor: extract recursive LvlContent --- src/components/Nav/Menu/LvlContent.tsx | 81 +++++++++++++++++ src/components/Nav/Menu/index.tsx | 120 ++----------------------- 2 files changed, 86 insertions(+), 115 deletions(-) create mode 100644 src/components/Nav/Menu/LvlContent.tsx diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx new file mode 100644 index 00000000000..123addbfab0 --- /dev/null +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -0,0 +1,81 @@ +import { Fragment } from "react" +import { useRouter } from "next/router" +import { Menu as ArkMenu, Portal as ArkPortal } from "@ark-ui/react" +import { Box, Button, Flex, Icon, Link } from "@chakra-ui/react" +import * as NavigationMenu from "@radix-ui/react-navigation-menu" +import * as Portal from "@radix-ui/react-portal" + +import { ButtonProps } from "@/components/Buttons" + +import { cleanPath } from "@/lib/utils/url" + +import type { Level, LvlRefs, NavItem } from "../types" + +import ItemContent from "./ItemContent" +import NextChevron from "./NextChevron" + +import { useRtlFlip } from "@/hooks/useRtlFlip" + +type LvlPortalProps = { + lvl: Level + refs: LvlRefs + items: NavItem[] +} + + +/** + * Content for each sub-menu below top-level navigation + * Content renders inside sibling Viewport + * Viewport wrapped in Portal to render inside a passed ref + * @param { 1 | 2 | 3 } lvl - The level of the menu + * @param refs - The references to the Grid column elements. + * @param { NavItem[] } items - The items to be displayed in the menu + * @returns The JSX element representing the menu content. + */ +const LvlContent = ({ lvl, refs, items }: LvlPortalProps) => { + // const { direction } = useRtlFlip() + // const { asPath } = useRouter() + // const pad = 4 + if (lvl > 3) return null + + return ( + + + + + {items.map(({ label, description, ...action }) => { + const subItems = action.items || [] + return ( + + {"href" in action ? ( + + + + ) : ( + <> + + + + + + )} + + ) + })} + + + + + + + + ) +} + +export default LvlContent diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 9f37e3a9386..94907b4d51e 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -4,12 +4,13 @@ import * as NavigationMenu from "@radix-ui/react-navigation-menu" import * as Portal from "@radix-ui/react-portal" import { Button } from "@/components/Buttons" -import Link from "@/components/Link" import { SECTION_LABELS } from "@/lib/constants" import type { LvlRefs, NavSections } from "../types" +import LvlContent from "./LvlContent" + import { useRtlFlip } from "@/hooks/useRtlFlip" type NavMenuProps = { @@ -31,126 +32,15 @@ const Menu = ({ sections }: NavMenuProps) => { {SECTION_LABELS.map((sectionKey) => { - const { label: sectionLabel, items: l1Items } = - sections[sectionKey] + const { label, items } = sections[sectionKey] return ( - - {/* Content goes to Viewport, wrapped in Portal, referencing Grid column */} - - - - {l1Items.map( - ({ - label: l1Label, - description: l1Description, - ...l1Action - }) => { - const l2Items = l1Action.items || [] - return ( - - {"href" in l1Action ? ( - - - - ) : ( - <> - - - - - - - - {l2Items.map( - ({ - label: l2Label, - description: l2Description, - ...l2Action - }) => { - return ( - - - - - - - - - {l2Action.items?.map( - ({ - label: - l3Label, - description: - l3Description, - ...l3Action - }) => ( - - - - - - - - - ) - )} - - - - - - - ) - } - )} - - - - - - - - - )} - - ) - } - )} - - - - - - - + ) })} From 756cb69176e78a9c1d6144d12183123d29017d85 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:18:42 -0800 Subject: [PATCH 171/478] feat: update item styling --- src/components/Nav/Menu/LvlContent.tsx | 66 ++++++++++++++++++-------- src/components/Nav/Menu/index.tsx | 13 ++++- 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 123addbfab0..c2c8285a4ff 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -1,7 +1,5 @@ -import { Fragment } from "react" import { useRouter } from "next/router" -import { Menu as ArkMenu, Portal as ArkPortal } from "@ark-ui/react" -import { Box, Button, Flex, Icon, Link } from "@chakra-ui/react" +import { Box, Button, Icon, Link } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import * as Portal from "@radix-ui/react-portal" @@ -14,15 +12,12 @@ import type { Level, LvlRefs, NavItem } from "../types" import ItemContent from "./ItemContent" import NextChevron from "./NextChevron" -import { useRtlFlip } from "@/hooks/useRtlFlip" - -type LvlPortalProps = { +type LvlContentProps = { lvl: Level refs: LvlRefs items: NavItem[] } - /** * Content for each sub-menu below top-level navigation * Content renders inside sibling Viewport @@ -32,31 +27,64 @@ type LvlPortalProps = { * @param { NavItem[] } items - The items to be displayed in the menu * @returns The JSX element representing the menu content. */ -const LvlContent = ({ lvl, refs, items }: LvlPortalProps) => { - // const { direction } = useRtlFlip() - // const { asPath } = useRouter() - // const pad = 4 +const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { + const { asPath } = useRouter() if (lvl > 3) return null return ( - + - - {items.map(({ label, description, ...action }) => { + + {items.map((item) => { + const { label, description, icon, ...action } = item const subItems = action.items || [] + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + + const activeStyles = { + outline: "none", + rounded: "md", + "p, svg": { color: "primary.base" }, + bg: `menu.lvl${lvl}.activeBackground`, + boxShadow: "none", + } + + const buttonProps: ButtonProps = { + color: isActivePage ? "menu.active" : `menu.lvl${lvl}.main`, + leftIcon: lvl === 1 && icon ? : undefined, + rightIcon: isLink ? undefined : , + position: "relative", + w: "full", + sx: { + "span:first-of-type": { m: 0, me: 4 }, // Spacing for icon + '&[data-state="open"]': { roundedEnd: "none" }, + }, + py: "4", + bg: "none", + _hover: activeStyles, + _active: activeStyles, + _focus: activeStyles, + variant: "ghost", + } + return ( - {"href" in action ? ( + {isLink ? ( - ) : ( <> - - + + { return ( - From 82921b7f88ce213742f5689a291faf928e84c2ec Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:28:00 -0800 Subject: [PATCH 172/478] fix: NavMenuProps to accept BoxProps --- src/components/Nav/Menu/index.tsx | 74 ++++++++++++++++--------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index e6e16f36665..4ec5f9be370 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,5 +1,5 @@ import { useRef } from "react" -import { Box, Flex, Grid } from "@chakra-ui/react" +import { Box, type BoxProps, Flex, Grid } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import * as Portal from "@radix-ui/react-portal" @@ -13,11 +13,11 @@ import LvlContent from "./LvlContent" import { useRtlFlip } from "@/hooks/useRtlFlip" -type NavMenuProps = { +type NavMenuProps = BoxProps & { sections: NavSections } -const Menu = ({ sections }: NavMenuProps) => { +const Menu = ({ sections, ...props }: NavMenuProps) => { const { direction } = useRtlFlip() const refs: LvlRefs = { @@ -28,39 +28,41 @@ const Menu = ({ sections }: NavMenuProps) => { return ( <> - - - - {SECTION_LABELS.map((sectionKey) => { - const { label, items } = sections[sectionKey] - return ( - - - - - - - ) - })} - - - - - - + + + + + {SECTION_LABELS.map((sectionKey) => { + const { label, items } = sections[sectionKey] + return ( + + + + + + + ) + })} + + + + + + + Date: Tue, 6 Feb 2024 15:28:20 -0800 Subject: [PATCH 173/478] chore: remove @ark-ui/react --- package.json | 1 - src/components/Nav/Menu/LvlPortal.tsx | 104 ---- yarn.lock | 730 +------------------------- 3 files changed, 2 insertions(+), 833 deletions(-) delete mode 100644 src/components/Nav/Menu/LvlPortal.tsx diff --git a/package.json b/package.json index 72ee8946f85..629842197e4 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "markdown-checker": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/markdownChecker.ts" }, "dependencies": { - "@ark-ui/react": "^1.3.0", "@chakra-ui/react": "^2.8.0", "@crowdin/crowdin-api-client": "^1.25.0", "@docsearch/react": "^3.5.2", diff --git a/src/components/Nav/Menu/LvlPortal.tsx b/src/components/Nav/Menu/LvlPortal.tsx deleted file mode 100644 index 2a4d6c5b9f6..00000000000 --- a/src/components/Nav/Menu/LvlPortal.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Fragment } from "react" -import { useRouter } from "next/router" -import { Menu as ArkMenu, Portal as ArkPortal } from "@ark-ui/react" -import { Button, Flex, Icon, Link } from "@chakra-ui/react" - -import { ButtonProps } from "@/components/Buttons" - -import { cleanPath } from "@/lib/utils/url" - -import type { Level, LvlRefs, NavItem } from "../types" - -import ItemContent from "./ItemContent" -import NextChevron from "./NextChevron" - -import { useRtlFlip } from "@/hooks/useRtlFlip" - -type LvlPortalProps = { - lvl: Level - refs: LvlRefs - items: NavItem[] -} - -const LvlPortal = ({ lvl, refs, items }: LvlPortalProps) => { - const { direction } = useRtlFlip() - const { asPath } = useRouter() - const pad = 4 - if (lvl > 3) return null - - return ( - - - - {items.map((item) => { - const { label, description, icon, ...action } = item - const isLink = "href" in action - const isActivePage = isLink && cleanPath(asPath) === action.href - - const buttonProps: ButtonProps = { - color: isActivePage ? "menu.active" : `menu.lvl${lvl}.main`, - leftIcon: lvl !== 1 || !icon ? undefined : , - rightIcon: isLink ? undefined : , - position: "relative", - w: "full", - sx: { "span:first-of-type": { m: 0, me: 4 } }, // Spacing for icon - py: "4", - bg: "none", - _hover: { boxShadow: "none" }, - _active: { boxShadow: "none" }, - } - - return ( - - {isLink ? ( - - - - ) : ( - - - - - - - )} - - ) - })} - - - - ) -} - -export default LvlPortal diff --git a/yarn.lock b/yarn.lock index 4addf98d639..90b7c15dca6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -146,85 +146,6 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@ark-ui/anatomy@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ark-ui/anatomy/-/anatomy-1.3.0.tgz#fabbbf9ebf42dde8e010a69eaed6ae45d0c8116e" - integrity sha512-1yG2MrzUlix6KthjQMCNiHnkXrWwEdFAX6D+HqGJaNu0XvaGul2J+wDNtjsdX+gxiWu1nXXEEOAWlFVYMUf65w== - dependencies: - "@zag-js/accordion" "0.32.1" - "@zag-js/anatomy" "0.32.1" - "@zag-js/avatar" "0.32.1" - "@zag-js/carousel" "0.32.1" - "@zag-js/checkbox" "0.32.1" - "@zag-js/color-picker" "0.32.1" - "@zag-js/color-utils" "0.32.1" - "@zag-js/combobox" "0.32.1" - "@zag-js/date-picker" "0.32.1" - "@zag-js/date-utils" "0.32.1" - "@zag-js/dialog" "0.32.1" - "@zag-js/editable" "0.32.1" - "@zag-js/file-upload" "0.32.1" - "@zag-js/hover-card" "0.32.1" - "@zag-js/menu" "0.32.1" - "@zag-js/number-input" "0.32.1" - "@zag-js/pagination" "0.32.1" - "@zag-js/pin-input" "0.32.1" - "@zag-js/popover" "0.32.1" - "@zag-js/presence" "0.32.1" - "@zag-js/progress" "0.32.1" - "@zag-js/radio-group" "0.32.1" - "@zag-js/rating-group" "0.32.1" - "@zag-js/select" "0.32.1" - "@zag-js/slider" "0.32.1" - "@zag-js/splitter" "0.32.1" - "@zag-js/switch" "0.32.1" - "@zag-js/tabs" "0.32.1" - "@zag-js/tags-input" "0.32.1" - "@zag-js/toast" "0.32.1" - "@zag-js/toggle-group" "0.32.1" - "@zag-js/tooltip" "0.32.1" - -"@ark-ui/react@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ark-ui/react/-/react-1.3.0.tgz#5189c85052b324a50052a18f00564ba3ee7df4b6" - integrity sha512-JHjNoIX50+mUCTaEGMjfGQWGGi31pKsV646jZJlR/1xohpYJigzg8BvO97cTsVk8fwtur+cm11gz3Nf7f5QUnA== - dependencies: - "@ark-ui/anatomy" "1.3.0" - "@zag-js/accordion" "0.32.1" - "@zag-js/avatar" "0.32.1" - "@zag-js/carousel" "0.32.1" - "@zag-js/checkbox" "0.32.1" - "@zag-js/color-picker" "0.32.1" - "@zag-js/color-utils" "0.32.1" - "@zag-js/combobox" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/date-picker" "0.32.1" - "@zag-js/date-utils" "0.32.1" - "@zag-js/dialog" "0.32.1" - "@zag-js/editable" "0.32.1" - "@zag-js/file-upload" "0.32.1" - "@zag-js/hover-card" "0.32.1" - "@zag-js/menu" "0.32.1" - "@zag-js/number-input" "0.32.1" - "@zag-js/pagination" "0.32.1" - "@zag-js/pin-input" "0.32.1" - "@zag-js/popover" "0.32.1" - "@zag-js/presence" "0.32.1" - "@zag-js/progress" "0.32.1" - "@zag-js/radio-group" "0.32.1" - "@zag-js/rating-group" "0.32.1" - "@zag-js/react" "0.32.1" - "@zag-js/select" "0.32.1" - "@zag-js/slider" "0.32.1" - "@zag-js/splitter" "0.32.1" - "@zag-js/switch" "0.32.1" - "@zag-js/tabs" "0.32.1" - "@zag-js/tags-input" "0.32.1" - "@zag-js/toast" "0.32.1" - "@zag-js/toggle-group" "0.32.1" - "@zag-js/tooltip" "0.32.1" - "@zag-js/types" "0.32.1" - "@aw-web-design/x-default-browser@1.4.126": version "1.4.126" resolved "https://registry.yarnpkg.com/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz#43e4bd8f0314ed907a8718d7e862a203af79bc16" @@ -2661,21 +2582,6 @@ dependencies: "@floating-ui/utils" "^0.1.3" -"@floating-ui/core@^1.5.3": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" - integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== - dependencies: - "@floating-ui/utils" "^0.2.1" - -"@floating-ui/dom@1.5.4": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.4.tgz#28df1e1cb373884224a463235c218dcbd81a16bb" - integrity sha512-jByEsHIY+eEdCjnTVu+E3ephzTOzkQ8hgUfGwos+bg7NlH33Zc5uO+QHz1mrQUOgIKKDD1RtS201P9NvAfq3XQ== - dependencies: - "@floating-ui/core" "^1.5.3" - "@floating-ui/utils" "^0.2.0" - "@floating-ui/dom@^1.5.1": version "1.5.3" resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" @@ -2696,11 +2602,6 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== -"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" - integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== - "@humanwhocodes/config-array@^0.11.13": version "0.11.13" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" @@ -2720,20 +2621,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== -"@internationalized/date@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.1.tgz#14401139f70c1ef14b845d3cac8912e82e82adcc" - integrity sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ== - dependencies: - "@swc/helpers" "^0.5.0" - -"@internationalized/number@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.5.0.tgz#9de6018424b441a6545f209afa286ad7df4a2906" - integrity sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w== - dependencies: - "@swc/helpers" "^0.5.0" - "@ioredis/commands@^1.1.1": version "1.2.0" resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" @@ -4564,13 +4451,6 @@ dependencies: tslib "^2.4.0" -"@swc/helpers@^0.5.0": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" - integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== - dependencies: - tslib "^2.4.0" - "@swc/types@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.5.tgz#043b731d4f56a79b4897a3de1af35e75d56bc63a" @@ -5344,243 +5224,16 @@ "@types/emscripten" "^1.39.6" tslib "^1.13.0" -"@zag-js/accordion@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/accordion/-/accordion-0.32.1.tgz#76a55ae18239b1dd7b7ad7f5d408a3f225a66882" - integrity sha512-16beDVpEhXFQsQRMZLmHFruhGphSprJ5XrRu6+OM2U7aTulo1w3ENUd9uI+mIs4oTVO66lYI4Lp+dFcT2UUIYA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/anatomy@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/anatomy/-/anatomy-0.32.1.tgz#02741fcdcf3b6196e9795eaca01a2b239872d52d" - integrity sha512-bR+tfFfkbxwhBzGGjEQG+RUnbeCjMx7tWJxykGnGdVLwAh0wKTQBEfHEOCOQh5qU8RhKUieqemAdvc7oP3Tp4w== - -"@zag-js/aria-hidden@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/aria-hidden/-/aria-hidden-0.32.1.tgz#60b2f4ee5798433fb73fd5e7fdf3581a075e2795" - integrity sha512-kznwxvUUHDax8Kd7YNVVCzQcwGARTRaZNOcIkw7MTLE8g/pU+C4pYkwR9iqA7/8imGfjYrZfSsQqZRTb4bkS0g== - dependencies: - "@zag-js/dom-query" "0.32.1" - -"@zag-js/auto-resize@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/auto-resize/-/auto-resize-0.32.1.tgz#16d5abe6b83fdcc7399f22af8ff353ec5706f169" - integrity sha512-MO6N5gPs2xDKbFgrakn6LDWv1GgN8uhfwpsqchLJX+EaZVvLIz8cXFD+jDv3RjK+5GRWV4mIF+26SXuHRSt9Ug== - dependencies: - "@zag-js/dom-query" "0.32.1" - -"@zag-js/avatar@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/avatar/-/avatar-0.32.1.tgz#1a4cf53d40772404d5ca6043fefb195fb4c5a329" - integrity sha512-5P+95pkMX2Na4yljN1etdgYyA+3HPORjWKn0Y3JamkYIAqJwRFO+taEdSm/xcRkuT6aGA3luheUowjt8wZssyA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/mutation-observer" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/carousel@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/carousel/-/carousel-0.32.1.tgz#d2ceebdf1b41300489038ebc694e31a174e2a50a" - integrity sha512-S7dUrPtiLr42Fa+S3O18kqKVqSu2yuk67bqGDtppIZSaFOugYHK4feBkZqjKw+eF12NVRRVO2j+A40d3MvxbSA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/checkbox@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/checkbox/-/checkbox-0.32.1.tgz#60f5c010d5722ecda7916e17302a5bc148fe4f1c" - integrity sha512-5reRreGyDZ5IlBNd5m1QrYXCehVIl/pmfKMEcAfad5DcgCaHGv5j76eahxbKln/8TEdwz4eWzBrqNtwSkKL5+w== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/collection@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/collection/-/collection-0.32.1.tgz#13699df3ded3284982387064fbd09a1fa6a8de6b" - integrity sha512-dAzcVQ/n+xAYoxWB/65/CQinv66RNVuq5ig0fEYszBqP+HjFnOpeGkIrEvP+bFI38hFEViiGtfr6oGAsVByOVQ== - -"@zag-js/color-picker@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/color-picker/-/color-picker-0.32.1.tgz#b2ff4715faed4e94bf3eccc73592330c8fe60664" - integrity sha512-ov3FC+c2WBYmEGRXWFVb2jih2Ecejj5JqBjDL9iMLBs2KNY9jnpvtH7WnZbijNY+RMDBj+C/DNI7K2NVaamSIA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/color-utils" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/tabbable" "0.32.1" - "@zag-js/text-selection" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/color-utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/color-utils/-/color-utils-0.32.1.tgz#bfc877fece9cbe94a0be37cb95a3af4ed8d1e6f0" - integrity sha512-AzupfOD7oD0mE+H9roTzwnLqtw1wYiJGOQKLPAwdwPQdznJUQD6sMOpxR/6RBuITVTm8Bl12Mr4+7s29LVJruw== - dependencies: - "@zag-js/numeric-range" "0.32.1" - -"@zag-js/combobox@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/combobox/-/combobox-0.32.1.tgz#36b349e95effe7e8f7d474d8d4730c8484f44201" - integrity sha512-skz2C5UxLD5JoYNP4hcPaQJu2cW7vycKqjDNI9ZtygSkZHOHx+JxpYiACBnr1vqzXatIOuDQm/HUuWW9yOT4eA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/aria-hidden" "0.32.1" - "@zag-js/collection" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/mutation-observer" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/core@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/core/-/core-0.32.1.tgz#fa36544efe7b11f63df0956eb2f3ddbc46e2d9f0" - integrity sha512-F9F7920/CisoLWALQACIhqbMvemgbv86qBULJ+UEe+a/9XgGwPh9UGn/H/q5EWkNpgEapz2b3pl3ONgKmXsK1A== - dependencies: - "@zag-js/store" "0.32.1" - klona "2.0.6" - -"@zag-js/date-picker@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/date-picker/-/date-picker-0.32.1.tgz#062a36e0c0bdda4f34c6ccd83a8a1595cf9d1d8f" - integrity sha512-n/hYmF+/R4+NuyfPRzCgeuLT6LJihKSuKzK29STPWy3sC/tBBHiqhNv1/4UKbatHUJXdBW2XF+N8Rw08RffcFQ== - dependencies: - "@internationalized/date" "^3.5.1" - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/date-utils" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/live-region" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/text-selection" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/date-utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/date-utils/-/date-utils-0.32.1.tgz#3184aa6edfa0eee782ea3200dcd0787cb0f8a5eb" - integrity sha512-dbBDRSVr5pRUw3rXndyGuSshZiWqQI5JQO4D2KIFGkXzorj6WzoOpcO910Z7AdM/9cCAMpCjUrka8d8o9BpJBg== - -"@zag-js/dialog@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/dialog/-/dialog-0.32.1.tgz#d3da6fb4c4ced60e924dbda8453dbe99af8746ad" - integrity sha512-czp+qXcdAOM70SrvDo4gBpYZx6gS6HXyrpiptW3+EHa2eiCfc/Z2w+Nu+ZadOTEQGgNWlKlCLW7Ery0i9mMDsw== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/aria-hidden" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/remove-scroll" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - focus-trap "7.5.4" - -"@zag-js/dismissable@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/dismissable/-/dismissable-0.32.1.tgz#bd8cdf9d5d552b2e5b1867b6ebb36c894282087c" - integrity sha512-UIkG+9Eb5wrus2F2Dy4zqk0pwCV53sdnMYBxk9dpvDzBJHzW+InhVeg3UeKmPL8ELcYlhH/Bap99XCRJvxsXow== - dependencies: - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/interact-outside" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/dom-event@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/dom-event/-/dom-event-0.32.1.tgz#a7214ee83ba0eb50ea2fb1b601ef335298739f91" - integrity sha512-wN6f5Kkf7C/YFN3wbEG3gUockSebyy1fPNL2BuL4C8PIP8vOD14hnHTzZWg5yYfO+veybIAL38r8I46C+bOVBQ== - dependencies: - "@zag-js/text-selection" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/dom-query@0.16.0": version "0.16.0" resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.16.0.tgz#bca46bcd78f78c900064478646d95f9781ed098e" integrity sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ== -"@zag-js/dom-query@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.32.1.tgz#7a85cf3beb0600c2e1d5e3d5844f91028aab0073" - integrity sha512-u6hrQHQ0/dcUi6xJn8d2Mu1ClN4KZpPqOKrJFSaxadWjSy+x0qp48WY2CBQ6gZ3j8IwR/XjzU9bu9wY5jJfHgA== - -"@zag-js/editable@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/editable/-/editable-0.32.1.tgz#9969a0e82d2b07fada258d904c111c8de74f7218" - integrity sha512-QEGnfp2P9nWVp9vGNWtszspvQcF3KtBRToZrv5/DT30Mpo/uPDKtqijLs0SnB/W60ELzcIRhK4J9taGoK8O8uw== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/interact-outside" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/element-rect@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/element-rect/-/element-rect-0.32.1.tgz#2d933c4925328d0e5c9747ab84353517200212b2" - integrity sha512-tAmxgxU2LsByK8PIs/Cj6cBJ8xZCVXE9RoStxthhuPL7xKYUfZvFGuhHVOHTHd6sDKEqbj6K1ds/TGPuglIh4w== - "@zag-js/element-size@0.10.5": version "0.10.5" resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.10.5.tgz#a24bad2eeb7e2c8709e32be5336e158e1a1a174f" integrity sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w== -"@zag-js/element-size@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.32.1.tgz#4d6f4e776e88ff0c42471a26c4528f110c8070be" - integrity sha512-ACklufmJQpah2UqwZUlYFaKi6uWfZBeTghtbfYHcDfzRbg2Hni612v8L1JeS4vAgjeDpcdHQpXXR4AZSpGZgNw== - -"@zag-js/file-upload@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/file-upload/-/file-upload-0.32.1.tgz#3446c12b0ce28015b3ed7c855eb44e14fc116c93" - integrity sha512-cD0NRIDof9Vv2DemmnYe9ZPZxOZ6b8XZl8eq4G0e8+WLYtnRXyEURl8Dw0QJpfdDPQaHnnD4CNxPTQcLgP+9Sg== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/file-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/file-utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/file-utils/-/file-utils-0.32.1.tgz#061c0b69e8226532c5b0228c7d99a0ba0d8ca6bd" - integrity sha512-0PxTrljW51Lf9OCuYNlZuaLgF0v1NoVRzXa/osZ9HGceQjfo77R5G9u+/TP3u53W2PTxajEZ4eNzTibgpzNXFg== - "@zag-js/focus-visible@0.16.0": version "0.16.0" resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz#c9e53e3dbab0f2649d04a489bb379f5800f4f069" @@ -5588,375 +5241,6 @@ dependencies: "@zag-js/dom-query" "0.16.0" -"@zag-js/form-utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/form-utils/-/form-utils-0.32.1.tgz#7307e0257d9e9bfca04a5272caba8224bb5b3b99" - integrity sha512-OemLBlHCHHm7t8wNcf78FRudRA7FegSgsNEzAjrRTyx+lJztDyHRLaoyI1gCEIg+0Kzl2nMxjOl4MStGsDj8iw== - dependencies: - "@zag-js/mutation-observer" "0.32.1" - -"@zag-js/hover-card@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/hover-card/-/hover-card-0.32.1.tgz#e4e4e58f8ce7e905c4e8288aee4d30447d7697f7" - integrity sha512-k66YK0z0P4LuK78+jnRoUPxJiM9GA0sbEEz3oPlvcFVXMMwnRTPNIw1OjksfAPI+Nvgg7H6D3A+7HCdRI/oBjw== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/interact-outside@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/interact-outside/-/interact-outside-0.32.1.tgz#c95403bfdf55304534082c1f5294f01c36a20590" - integrity sha512-8zHuswfTAgfMCaQnp3N4WStvnL32VyxURafb21+mE4neAF/DaKfJHWnJpeUMG1Qh/eXsrMRBxVoX+nBMhHj9bg== - dependencies: - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/tabbable" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/live-region@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/live-region/-/live-region-0.32.1.tgz#9abdbdde9ee0555f4b136248bf5d67c2d1328818" - integrity sha512-6/9QMLVZbTRh/G6MoJc/auN8r5vjdY9vUgNT680C2LOa2vnRR5/y0DkIpVgttNh1rSenQ/eLEYxp8hQF1rIYNw== - dependencies: - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/menu@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/menu/-/menu-0.32.1.tgz#afa834530ba275e0b03ec812f38e09db1aeff2d0" - integrity sha512-IPsTljVF0N9xTwub1cpGl3GAG5ttAq3h38PdZERREzT3qRgw4v3K/I1TG2vIiDXgJz8UZzUKox6ZYdU7UIAkRA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/mutation-observer" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/rect-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/mutation-observer@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/mutation-observer/-/mutation-observer-0.32.1.tgz#342431293ffb821d1525442b64a6f08ee3a9b92e" - integrity sha512-/hlObxGnhAaYYVnwRJC227md0M3kSE6mO24vkqVGwq2GglS+u4zbVcBBUuWgHdMML+ZjIQrZuVycCBMfVlHq0g== - -"@zag-js/number-input@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/number-input/-/number-input-0.32.1.tgz#bcdd91d26a691fca37e92d12d34eb18166643465" - integrity sha512-atyIOvoMITb4hZtQym7yD6I7grvPW83UeMFO8hCQg3HWwd2zR4+63mouWuyMoWb4QrzVFRVQBaU8OG5xGlknEw== - dependencies: - "@internationalized/number" "^3.5.0" - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/mutation-observer" "0.32.1" - "@zag-js/number-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/number-utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/number-utils/-/number-utils-0.32.1.tgz#e43784358532ccfcc2af7f299b6fec755310a36d" - integrity sha512-x/nttU31TtFVTqFBM8e3ZH/0MCc+u15WAfk0rT6ESkoZcdb80rTzZVMokCKCUdpi/JdB1vjEeCLSnj+ig8oAIQ== - -"@zag-js/numeric-range@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/numeric-range/-/numeric-range-0.32.1.tgz#a7759f41a9b87b17d3c8364eb32df293df4466b8" - integrity sha512-1Qe2URTenlrdsWuArlnQ+v5bBH2mHZD3XsK6jYV+C2lgatVzdcoN4GCSNTiF7w+So6J+NTeLMkVHMGCW1Kzx1g== - -"@zag-js/pagination@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/pagination/-/pagination-0.32.1.tgz#b7d39b82483633eb92d361299b809ff114b31221" - integrity sha512-lhogzKxJnx5D2Xoni/xm5rkOuy15KWSxqBHVwe8+j5aSNqMy7+aRtEN2F2VQCDVL/v1fdciQvOCA9udm37kZ4w== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/pin-input@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/pin-input/-/pin-input-0.32.1.tgz#c6c426b0d04959976eae7c64f6d3f9781653aa33" - integrity sha512-d18cCXKUr7INL0Xm5KyIoiTRSNsPXfIlIEMl2HrAvM3r70wtEag0PmiDNA5NS2tB4LnnX0XowchGB4HsdFS/ng== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/popover@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/popover/-/popover-0.32.1.tgz#44327ae40dce2d8a16e3821fe7acf837fdaf32ba" - integrity sha512-B01if49v3crCjkvtSvIX4CBdT/475nj3DttOObc36s0YOxCEt3UihMITBD5JvIKwEqjZ6oU5t0sLcUYOqQ4f2A== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/aria-hidden" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/remove-scroll" "0.32.1" - "@zag-js/tabbable" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - focus-trap "7.5.4" - -"@zag-js/popper@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/popper/-/popper-0.32.1.tgz#bbe53adff6914cfd0b3e07dfb1ed066b741baf95" - integrity sha512-aQgogW1N4VreNACSQhXQoZeXtQQtB//FXUvt1CBnW2DtmZ6YkNnaAfn186Q2lkw2/T0chITRy3eYeviwMmMrqg== - dependencies: - "@floating-ui/dom" "1.5.4" - "@zag-js/dom-query" "0.32.1" - "@zag-js/element-rect" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/presence@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/presence/-/presence-0.32.1.tgz#6c8be7995749fb72b7b7ba7c5b2d7a3b1cfec039" - integrity sha512-8189QMUf/L1dztAZdurx18ZwPyWlq58Mrd+GdATSaf8JstgrI1ovzVs606inQghWptKHMsH7dUIaV9UkhbSx3Q== - dependencies: - "@zag-js/core" "0.32.1" - "@zag-js/types" "0.32.1" - -"@zag-js/progress@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/progress/-/progress-0.32.1.tgz#4025a053ce0f928bf6f70a48ab2b8cbbcdee962c" - integrity sha512-ClkQvNYnuIpKfAPUceZXY5E2m/3NnIm21cvHe4gAoJ88YdqEHd5rIRoHP63g8ET8Ct/2KkBRkgR+LrQnGQOomA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/radio-group@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/radio-group/-/radio-group-0.32.1.tgz#a5d0f78f388615289803c83aad4ca15ca52a3ae1" - integrity sha512-NvdSjwRF38qIh0oM68jERf71uiwV2JFTrGeQEs3EIqONzULwL6jR2p4P1wm3JJNBAkSYBKZMER5cVUUcqM3kjQ== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/element-rect" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/rating-group@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/rating-group/-/rating-group-0.32.1.tgz#2930f7308f7ea0a66167f60172222e46dcc9602b" - integrity sha512-RBaFRCw7P00bgTrEjUHT3h/OGRO8XmXKkQYqqhm1tsVbeTsT47iwHoc6XnMEiGBonaJDwN/J0oFasw7GNg5sow== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/react@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/react/-/react-0.32.1.tgz#180899ef682132348867e7bac9eab58e4afdf139" - integrity sha512-b1SB7hXXv1K6CmXkcy5Y7mb0YRWkyvulyhK8VW5O5hIAPuGxOTx70psmVeZbmVzhjdORCiro9jKx8Ec0LfolFg== - dependencies: - "@zag-js/core" "0.32.1" - "@zag-js/store" "0.32.1" - "@zag-js/types" "0.32.1" - proxy-compare "2.5.1" - -"@zag-js/rect-utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/rect-utils/-/rect-utils-0.32.1.tgz#3ca21ba3e7b2e8648d4446d1ddc154e376d4c8c1" - integrity sha512-cI07kgldjUZP+SLhXeG9VSl47nrENlC96Fs7jWcTfHj62rhdY8WsBJ0tiTztvwar9m1chwxXZwJowHN+nPIgDQ== - -"@zag-js/remove-scroll@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/remove-scroll/-/remove-scroll-0.32.1.tgz#f2f70dd32131cbd3ae7dbf186a4828bd14e7b3bc" - integrity sha512-LyXt2rNMSKb9MKeJRyKTgpk4R7jdA+9kEQTSG5qyA94jo1og7FVgA1W/E+pNkdxDEk1VplL768VU6y7E/L3DHg== - dependencies: - "@zag-js/dom-query" "0.32.1" - -"@zag-js/select@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/select/-/select-0.32.1.tgz#c6517110eb46b2cce4ad5dbefcae4a366d81a241" - integrity sha512-jSzmTKCN1Fk/ZDDWM8TVGOtwgpYUDgyceegjYT+hW1mmEetu4tQcEvAr0557NOzh8akqLvcVFbg/kMj0IriKAA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/collection" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dismissable" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/mutation-observer" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/tabbable" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/slider@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/slider/-/slider-0.32.1.tgz#1e5e9208987dab14263d4b64cbc0046b18c3cceb" - integrity sha512-iZSB3Y8/Maakxem0Ha3rBRa8AyAplhN5K50Bgz+wsv0VEzNNUmK4QgaTWReWd6SfeTRpnC5ftKCcfM2aQrLm6g== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/element-size" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/numeric-range" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/splitter@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/splitter/-/splitter-0.32.1.tgz#092c38c624bd33a166c9ce3eb66fbd20e4710654" - integrity sha512-NdHLUXtQAlnz6QpdPwcqZCqYul7LaVqsp0hgtXR2PN4HbH+VAaDfY76pUk6LBerUcykChGZvtM9U0A5FCo1x4A== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/number-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/store@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/store/-/store-0.32.1.tgz#390321175b3c5b3e509ecc9a31a650a86bc9e307" - integrity sha512-hKwzpqAPljw06oOI+eO+Is2udpmY9GsGfmdoqvZVYoK4f5sawpZY9EC/84tbK9QKWUDTbFS+0Ujc254GUThmDA== - dependencies: - proxy-compare "2.5.1" - -"@zag-js/switch@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/switch/-/switch-0.32.1.tgz#686882da59a75a499fc8a47cf98dfac5fca1ddd3" - integrity sha512-+5w/AtINA+jpORX1cuUrnyIFXrfjhqV7667EKK/zbPi0Pf1E10+TEihpfFjY6bgms9CSNWZVEb6w2f2C0PNBDA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - "@zag-js/visually-hidden" "0.32.1" - -"@zag-js/tabbable@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/tabbable/-/tabbable-0.32.1.tgz#a5e13bb68588867f2f79b5a1abeac9086bfe3211" - integrity sha512-fMXtVgBiX7z3Qmdv+McrfihiSkqsDbNX2nn3e63L7jdy9ZpgnR3jG9BwUZvv7hvzkuOAFhhdKgBYYT+fkBavGg== - dependencies: - "@zag-js/dom-query" "0.32.1" - -"@zag-js/tabs@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/tabs/-/tabs-0.32.1.tgz#52dca46927da66689dc17d52e2c9f825af29afd6" - integrity sha512-5l8/k2Pw9Kbfsvvx6HWcVqK7Ns7ca+nyPGLSZtZLMp/Zn2q3xSG32C1U3oDaYtQVIQSiEHdnMjw0C2v+CxGDMA== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/element-rect" "0.32.1" - "@zag-js/tabbable" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/tags-input@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/tags-input/-/tags-input-0.32.1.tgz#9e1283b5fa46af857d8d06bd0e1278bde9d59ea1" - integrity sha512-oliLhiMpRNbWFixHF+Oe7hySQBp7NKtL/s8rN5dLT1G1GFRMzuuht/QnmL1h8EoGGpTwaaokMo4zl4uVzHbwyw== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/auto-resize" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/form-utils" "0.32.1" - "@zag-js/interact-outside" "0.32.1" - "@zag-js/live-region" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/text-selection@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/text-selection/-/text-selection-0.32.1.tgz#0735405b31b5ed4a48493ec9d82cc783804f2c56" - integrity sha512-aK1uswWYF76PFoxGL+3HW/kth9uldFWSW4lOh89NfEcc6Ym7qS5B+P0HKJVM9DuQbihvQX9dyc9PvM7/LJTSRA== - dependencies: - "@zag-js/dom-query" "0.32.1" - -"@zag-js/toast@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/toast/-/toast-0.32.1.tgz#1047d768fd7fb1a52e3ab5fa7cd4a19caa2a920b" - integrity sha512-HrfVzFX7ANS9qOewCr8qOCbgko635bZxYKMv+ojjo4U/TtwkGb43+lVU7/qwZj0z18/OtXBH5YQjFwQZXg5x8g== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/toggle-group@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/toggle-group/-/toggle-group-0.32.1.tgz#10f9d432956c3f72318ca4732720573d39a4e510" - integrity sha512-MM1XI4J45rRCZiDHcMtZWud0+bWMu6IcMnrbd9oig330YAF3RzcjTlxX93YRY35F04OUMBq5el9qe3qc2vyMuw== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/tooltip@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/tooltip/-/tooltip-0.32.1.tgz#ddaee0b7af324ae7c3741b36739dd7a1eea40025" - integrity sha512-+rsmDYTELFBHoYKg5iKShGfRD3H9FJDaZRq915Uc9YnyePMXCnWRgnVp+lk3zI+FDgysQm67SDLRJsR24Iioqg== - dependencies: - "@zag-js/anatomy" "0.32.1" - "@zag-js/core" "0.32.1" - "@zag-js/dom-event" "0.32.1" - "@zag-js/dom-query" "0.32.1" - "@zag-js/popper" "0.32.1" - "@zag-js/types" "0.32.1" - "@zag-js/utils" "0.32.1" - -"@zag-js/types@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/types/-/types-0.32.1.tgz#21e1e21affafdabe005feb20f6620fca90f8553e" - integrity sha512-BLfqb+im4vtXXJqhd2ZUg/4LquEd1qPt9XN56XVjudGDTftN8n3EDpuail7VKxdL59W4jR7wW8lvl4sSgrQKWw== - dependencies: - csstype "3.1.3" - -"@zag-js/utils@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/utils/-/utils-0.32.1.tgz#7a1510635dd634c74e93809185d8acdbcc48eb60" - integrity sha512-jrcmWYcA3L6TO4fZbPFvpSGEy2Z/mbWt6bPQbmcVgq/BltSS0YxxfPl+eD+S/rZI9aneszwsr04Z5TpladFiVA== - -"@zag-js/visually-hidden@0.32.1": - version "0.32.1" - resolved "https://registry.yarnpkg.com/@zag-js/visually-hidden/-/visually-hidden-0.32.1.tgz#6580d852e9de0511bb3f9bb5e01a4a0a479be08e" - integrity sha512-Vzieo4vNulzY/0zqmVfeYW/LcFJp5xtEoyUgR1FBctH8uBPBRhTIEXxKtoMablW6/vccOVo7zcu0UrR5Vx+eYQ== - abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -7332,11 +6616,6 @@ csso@5.0.5: dependencies: css-tree "~2.2.0" -csstype@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - csstype@^3.0.2, csstype@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -8688,7 +7967,7 @@ focus-trap-react@^10.2.3: focus-trap "^7.5.4" tabbable "^6.2.0" -focus-trap@7.5.4, focus-trap@^7.5.4: +focus-trap@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.4.tgz#6c4e342fe1dae6add9c2aa332a6e7a0bbd495ba2" integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w== @@ -10113,7 +9392,7 @@ kleur@^4.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== -klona@2.0.6, klona@^2.0.4: +klona@^2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== @@ -11955,11 +11234,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-compare@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" - integrity sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA== - proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" From 4172a1344b12a24f9effebf546268df87922e588 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 15:45:06 -0800 Subject: [PATCH 174/478] fix: menu item styling --- src/components/LanguagePicker/MenuItem.tsx | 6 +++--- src/components/LanguagePicker/ProgressBar.tsx | 13 +++---------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index 0903d39dab0..65d660c64b0 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -58,7 +58,7 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { pt="2 !important" alignItems="start" borderRadius="base" - bg="transparent" + bg={isCurrent ? "background.base" : "transparent"} color="body.base" textDecoration="none" data-group @@ -108,7 +108,7 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { {sourceName} - {isCurrent && } + {isCurrent && } { {progress} {t("page-languages-translated")} • {words}{" "} {t("page-languages-words")} - + ) }) diff --git a/src/components/LanguagePicker/ProgressBar.tsx b/src/components/LanguagePicker/ProgressBar.tsx index bcf710a2474..06bb008923f 100644 --- a/src/components/LanguagePicker/ProgressBar.tsx +++ b/src/components/LanguagePicker/ProgressBar.tsx @@ -1,23 +1,16 @@ import { Progress, ProgressProps } from "@chakra-ui/react" -type ProgressBarProps = Pick & { - isCurrent?: boolean -} +type ProgressBarProps = Pick -const ProgressBar = ({ value, isCurrent }: ProgressBarProps) => ( +const ProgressBar = ({ value }: ProgressBarProps) => ( From 782359f5ec2bb3cb5835ebdee66baa50e1729eab Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:26:25 -0800 Subject: [PATCH 175/478] feat: update styling --- src/components/Nav/Menu/LvlContent.tsx | 5 ++++- src/components/Nav/Menu/index.tsx | 27 +++++++++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index c2c8285a4ff..f3068c4d09a 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -58,7 +58,10 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { w: "full", sx: { "span:first-of-type": { m: 0, me: 4 }, // Spacing for icon - '&[data-state="open"]': { roundedEnd: "none" }, + '&[data-state="open"]': { + roundedEnd: "none", + bg: `menu.lvl${lvl}.activeBackground`, + }, }, py: "4", bg: "none", diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 4ec5f9be370..a6258fcd3ae 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -29,7 +29,11 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { return ( <> - + {SECTION_LABELS.map((sectionKey) => { @@ -66,17 +70,30 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { - - - + + + ) From 299f9f8249df522fa71694acb554e60f43b6307c Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:33:34 -0800 Subject: [PATCH 176/478] fix: margin-inline-end on submenu list items --- src/components/Nav/Menu/LvlContent.tsx | 58 ++++++++++++++------------ 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index f3068c4d09a..c0eaf9fe4b3 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -1,5 +1,5 @@ import { useRouter } from "next/router" -import { Box, Button, Icon, Link } from "@chakra-ui/react" +import { Button, Icon, Link, ListItem, UnorderedList } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import * as Portal from "@radix-ui/react-portal" @@ -31,11 +31,18 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { const { asPath } = useRouter() if (lvl > 3) return null + const pad = 4 + return ( - + {items.map((item) => { const { label, description, icon, ...action } = item const subItems = action.items || [] @@ -63,7 +70,7 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { bg: `menu.lvl${lvl}.activeBackground`, }, }, - py: "4", + py: pad, bg: "none", _hover: activeStyles, _active: activeStyles, @@ -72,34 +79,33 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { } return ( - - {isLink ? ( - - - - ) : ( - <> - - - - - - )} + + ) : ( + <> + + + + + + )} + ) })} - + From 5a292a8bf6468ba0adbc58d18d889eea3bea61d9 Mon Sep 17 00:00:00 2001 From: Nuno Loureiro Date: Wed, 7 Feb 2024 11:33:24 +0000 Subject: [PATCH 177/478] new icons --- src/components/Nav/useNav.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index 9e69d9c63b2..664e3f1333d 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -4,21 +4,24 @@ import { BsBook, BsBuildings, BsCompass, - BsFire, BsJournalCode, BsLayers, BsLightbulb, BsMegaphone, BsMortarboard, - BsPersonArmsUp, + BsFlag, BsPinAngle, BsSafe, BsSignpost, BsSliders, - BsTools, + BsCodeSquare, BsUiChecksGrid, } from "react-icons/bs" -import { PiFlask } from "react-icons/pi"; +import { LiaEthereum } from "react-icons/lia"; +import { + PiFlask, + PiUsersFourLight, +} from "react-icons/pi"; import { useColorMode, useColorModeValue, useDisclosure } from "@chakra-ui/react" import { trackCustomEvent } from "@/lib/utils/matomo" @@ -261,13 +264,13 @@ export const useNav = () => { { label: t("nav-builders-home-label"), description: t("nav-builders-home-description"), - icon: BsTools, + icon: BsCodeSquare, href: "/developers", }, { label: t("get-started"), description: t("nav-start-building-description"), - icon: BsPinAngle, + icon: BsFlag, items: [ { label: t("tutorials"), @@ -344,7 +347,7 @@ export const useNav = () => { { label: t("community-hub"), description: t("nav-participate-overview-description"), - icon: BsPersonArmsUp, + icon: PiUsersFourLight, href: "/community", }, { @@ -367,7 +370,7 @@ export const useNav = () => { { label: t("site-title"), description: t("nav-ethereum-org-description"), - icon: BsFire, + icon: LiaEthereum, items: [ { label: t("nav-contribute-label"), From 60c4e17783088979992c156fddbe16d871397f6a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 7 Feb 2024 06:57:18 -0800 Subject: [PATCH 178/478] fix: import order --- src/components/Nav/useNav.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index 664e3f1333d..6e508b4ff53 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -3,22 +3,22 @@ import { useTranslation } from "next-i18next" import { BsBook, BsBuildings, + BsCodeSquare, BsCompass, + BsFlag, BsJournalCode, BsLayers, BsLightbulb, BsMegaphone, BsMortarboard, - BsFlag, BsPinAngle, BsSafe, BsSignpost, BsSliders, - BsCodeSquare, BsUiChecksGrid, } from "react-icons/bs" import { LiaEthereum } from "react-icons/lia"; -import { +import { PiFlask, PiUsersFourLight, } from "react-icons/pi"; From e8de8a620659db9594bbeb0c191f316929dcd1e4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 7 Feb 2024 06:58:17 -0800 Subject: [PATCH 179/478] fix: Link import --- src/components/Nav/Menu/LvlContent.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index c0eaf9fe4b3..8dfb50b1600 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -1,9 +1,10 @@ import { useRouter } from "next/router" -import { Button, Icon, Link, ListItem, UnorderedList } from "@chakra-ui/react" +import { Button, Icon, ListItem, UnorderedList } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import * as Portal from "@radix-ui/react-portal" import { ButtonProps } from "@/components/Buttons" +import Link from "@/components/Link" import { cleanPath } from "@/lib/utils/url" From c9b8226b5682ebd5f40adc9488b9ddd6ca9e1e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marius=20Kj=C3=A6rstad?= Date: Wed, 7 Feb 2024 16:14:46 +0100 Subject: [PATCH 180/478] Change miner to maximal in MEV --- public/content/developers/docs/mev/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/mev/index.md b/public/content/developers/docs/mev/index.md index 067b1110e34..0aff138ad20 100644 --- a/public/content/developers/docs/mev/index.md +++ b/public/content/developers/docs/mev/index.md @@ -6,7 +6,7 @@ lang: en Maximal extractable value (MEV) refers to the maximum value that can be extracted from block production in excess of the standard block reward and gas fees by including, excluding, and changing the order of transactions in a block. -## Miner extractable value {#miner-extractable-value} +## Maximal extractable value {#maximal-extractable-value} Maximal extractable value was first applied in the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and initially referred to as "miner extractable value". This is because in proof-of-work, miners control transaction inclusion, exclusion, and ordering. However, since the transition to proof-of-stake via [The Merge](/roadmap/merge) validators have been responsible for these roles, and mining is no longer part of the Ethereum protocol. The value extraction methods still exist, though, so the term "Maximal extractable value" is now used instead. From e8768304330fe2054743cdb445218dba074d86d0 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Wed, 7 Feb 2024 16:35:45 +0100 Subject: [PATCH 181/478] add relative position to the table container to avoid overflows --- src/components/Table/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Table/index.tsx b/src/components/Table/index.tsx index 469a2006f78..a939b0315d1 100644 --- a/src/components/Table/index.tsx +++ b/src/components/Table/index.tsx @@ -23,7 +23,7 @@ interface TableProps extends ThemingProps<"Table"> { const Table = (props: TableProps) => { const { variant, ...rest } = props return ( - + ) From e65fda7eed93b25ea7a2e85274d0d496f8a7d1a8 Mon Sep 17 00:00:00 2001 From: Nuno Loureiro Date: Wed, 7 Feb 2024 15:48:20 +0000 Subject: [PATCH 182/478] trying to keep the same width on md break point --- src/components/Nav/Menu/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index a6258fcd3ae..92c23cc2559 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -73,7 +73,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { visibility="hidden" top="16.5" insetInline="0" - templateColumns={{ base: "repeat(2, 1fr) 0fr", lg: "repeat(3, 1fr)" }} + templateColumns={{ base: "repeat(3, 1fr) 0fr", lg: "repeat(3, 1fr)" }} shadow="md" border="1px" borderColor="menu.stroke" From a5cf666708537aec4b973cf79d48e7d6f507f6c1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 7 Feb 2024 08:28:56 -0800 Subject: [PATCH 183/478] Revert "trying to keep the same width on md break point" This reverts commit e65fda7eed93b25ea7a2e85274d0d496f8a7d1a8. --- src/components/Nav/Menu/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 92c23cc2559..a6258fcd3ae 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -73,7 +73,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { visibility="hidden" top="16.5" insetInline="0" - templateColumns={{ base: "repeat(3, 1fr) 0fr", lg: "repeat(3, 1fr)" }} + templateColumns={{ base: "repeat(2, 1fr) 0fr", lg: "repeat(3, 1fr)" }} shadow="md" border="1px" borderColor="menu.stroke" From dc64a8ccd74aa901f07dd6f8285f0e28df33b62d Mon Sep 17 00:00:00 2001 From: Michael Connell Date: Wed, 7 Feb 2024 09:39:35 -0800 Subject: [PATCH 184/478] remove broken links `useweb3` leads to a 404 and I can't find that page anymore on the site and `crypto.jobs` leads to a 500. not sure if that's just a temporary problem though --- public/content/community/get-involved/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/content/community/get-involved/index.md b/public/content/community/get-involved/index.md index 2a581192859..ec658bedfa4 100644 --- a/public/content/community/get-involved/index.md +++ b/public/content/community/get-involved/index.md @@ -105,11 +105,9 @@ The Ethereum ecosystem is on a mission to fund public goods and impactful projec - [Ethereum Foundation job board (BambooHR)](https://ethereum.bamboohr.com/jobs/) - [JobStash](https://jobstash.xyz) - [Cryptocurrency Jobs](https://cryptocurrencyjobs.co/ethereum/) -- [Crypto.jobs](https://crypto.jobs/) - [Careers at ConsenSys](https://consensys.net/careers/) - [Crypto Jobs List](https://cryptojobslist.com/ethereum-jobs) - [Bankless jobs board](https://pallet.xyz/list/bankless/jobs) -- [useWeb3 Jobs](https://www.useweb3.xyz/jobs) - [Web3 Jobs](https://web3.career) - [Web3 Army](https://web3army.xyz/) - [Crypto Valley Jobs](https://cryptovalley.jobs/) From f99df647e99f56bfe8f391979741e0e8b65acd99 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 7 Feb 2024 10:21:39 -0800 Subject: [PATCH 185/478] fix: consistent mobile breakpoint for nav bar --- src/components/LanguagePicker/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 367d9a488be..e791067317b 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -71,7 +71,7 @@ const LanguagePicker = ({ {/* Mobile Close bar */} Date: Wed, 7 Feb 2024 10:45:34 -0800 Subject: [PATCH 186/478] refactor: trim progress data, clean up --- .../LanguagePicker/useLanguagePicker.tsx | 16 +- src/data/translationProgress.json | 1456 ++++------------- src/lib/types.ts | 58 +- src/scripts/crowdin/getTranslationProgress.ts | 39 +- 4 files changed, 329 insertions(+), 1240 deletions(-) diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 78c3df6926d..c5336e5d55e 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -13,11 +13,11 @@ import type { import { MatomoEventOptions, trackCustomEvent } from "@/lib/utils/matomo" import { languages } from "@/lib/utils/translations" -import progressData from "@/data/translationProgress.json" +import progressDataJson from "@/data/translationProgress.json" import { DEFAULT_LOCALE } from "@/lib/constants" -const data = progressData as ProjectProgressData[] +const progressData = progressDataJson satisfies ProjectProgressData[] export const useLanguagePicker = ( handleClose?: () => void, @@ -88,20 +88,24 @@ export const useLanguagePicker = ( } // English will not have a dataItem - const dataItem = data.find( + const dataItem = progressData.find( ({ languageId }) => i18nItem.crowdinCode.toLowerCase() === languageId.toLowerCase() ) const approvalProgress = - localeOption === DEFAULT_LOCALE ? 100 : dataItem?.approvalProgress || 0 + localeOption === DEFAULT_LOCALE + ? 100 + : Math.floor( + (dataItem!.words.approved / dataItem!.words.total) * 100 + ) || 0 - if (data.length === 0) + if (progressData.length === 0) throw new Error( "Missing translation progress data; check GitHub action" ) - const totalWords = data[0].words.total + const totalWords = progressData[0].words.total const wordsApproved = localeOption === DEFAULT_LOCALE diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index 7b8f39ddf89..6ad4311983f 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -2,1548 +2,638 @@ { "languageId": "af", "words": { - "total": 336489, - "translated": 2654, - "preTranslateAppliedTo": 134, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 474, - "preTranslateAppliedTo": 36, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "am", "words": { - "total": 336489, - "translated": 34590, - "preTranslateAppliedTo": 3747, - "approved": 9634 - }, - "phrases": { - "total": 24685, - "translated": 3447, - "preTranslateAppliedTo": 362, - "approved": 993 - }, - "translationProgress": 10, - "approvalProgress": 2 + "approved": 9631, + "total": 340006 + } }, { "languageId": "ar", "words": { - "total": 336489, - "translated": 101830, - "preTranslateAppliedTo": 35259, - "approved": 40466 - }, - "phrases": { - "total": 24685, - "translated": 8511, - "preTranslateAppliedTo": 3243, - "approved": 3373 - }, - "translationProgress": 30, - "approvalProgress": 12 + "approved": 40199, + "total": 340006 + } }, { "languageId": "az", "words": { - "total": 336489, - "translated": 29092, - "preTranslateAppliedTo": 1761, - "approved": 18707 - }, - "phrases": { - "total": 24685, - "translated": 2701, - "preTranslateAppliedTo": 310, - "approved": 1852 - }, - "translationProgress": 8, - "approvalProgress": 5 + "approved": 18602, + "total": 340006 + } }, { "languageId": "be", "words": { - "total": 336489, - "translated": 7372, - "preTranslateAppliedTo": 726, - "approved": 5879 - }, - "phrases": { - "total": 24685, - "translated": 822, - "preTranslateAppliedTo": 94, - "approved": 603 - }, - "translationProgress": 2, - "approvalProgress": 1 + "approved": 5879, + "total": 340006 + } }, { "languageId": "bg", "words": { - "total": 336489, - "translated": 36624, - "preTranslateAppliedTo": 12272, - "approved": 14767 - }, - "phrases": { - "total": 24685, - "translated": 3737, - "preTranslateAppliedTo": 1422, - "approved": 1531 - }, - "translationProgress": 10, - "approvalProgress": 4 + "approved": 14656, + "total": 340006 + } }, { "languageId": "bi", "words": { - "total": 336489, - "translated": 180, - "preTranslateAppliedTo": 20, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 115, - "preTranslateAppliedTo": 17, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "bn", "words": { - "total": 336489, - "translated": 44527, - "preTranslateAppliedTo": 4114, - "approved": 36246 - }, - "phrases": { - "total": 24685, - "translated": 3853, - "preTranslateAppliedTo": 532, - "approved": 3027 - }, - "translationProgress": 13, - "approvalProgress": 10 + "approved": 36077, + "total": 340006 + } }, { "languageId": "br-FR", "words": { - "total": 336489, - "translated": 192, - "preTranslateAppliedTo": 148, - "approved": 82 - }, - "phrases": { - "total": 24685, - "translated": 29, - "preTranslateAppliedTo": 21, - "approved": 7 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 82, + "total": 340006 + } }, { "languageId": "bs", "words": { - "total": 336489, - "translated": 12036, - "preTranslateAppliedTo": 713, - "approved": 5879 - }, - "phrases": { - "total": 24685, - "translated": 1160, - "preTranslateAppliedTo": 68, - "approved": 603 - }, - "translationProgress": 3, - "approvalProgress": 1 + "approved": 5879, + "total": 340006 + } }, { "languageId": "ca", "words": { - "total": 336489, - "translated": 46990, - "preTranslateAppliedTo": 14452, - "approved": 19695 - }, - "phrases": { - "total": 24685, - "translated": 4571, - "preTranslateAppliedTo": 1601, - "approved": 2056 - }, - "translationProgress": 13, - "approvalProgress": 5 + "approved": 19651, + "total": 340006 + } }, { "languageId": "cs", "words": { - "total": 336489, - "translated": 62786, - "preTranslateAppliedTo": 6867, - "approved": 26678 - }, - "phrases": { - "total": 24685, - "translated": 5544, - "preTranslateAppliedTo": 1004, - "approved": 2427 - }, - "translationProgress": 18, - "approvalProgress": 7 + "approved": 26515, + "total": 340006 + } }, { "languageId": "da", "words": { - "total": 336489, - "translated": 15857, - "preTranslateAppliedTo": 2817, - "approved": 1466 - }, - "phrases": { - "total": 24685, - "translated": 1668, - "preTranslateAppliedTo": 488, - "approved": 263 - }, - "translationProgress": 4, - "approvalProgress": 0 + "approved": 1454, + "total": 340006 + } }, { "languageId": "de", "words": { - "total": 336489, - "translated": 237654, - "preTranslateAppliedTo": 43906, - "approved": 163737 - }, - "phrases": { - "total": 24685, - "translated": 18419, - "preTranslateAppliedTo": 4130, - "approved": 13313 - }, - "translationProgress": 70, - "approvalProgress": 48 + "approved": 162757, + "total": 340006 + } }, { "languageId": "el", "words": { - "total": 336489, - "translated": 102635, - "preTranslateAppliedTo": 18079, - "approved": 102345 - }, - "phrases": { - "total": 24685, - "translated": 10333, - "preTranslateAppliedTo": 2113, - "approved": 10314 - }, - "translationProgress": 30, - "approvalProgress": 30 + "approved": 102339, + "total": 340006 + } }, { "languageId": "eo", "words": { - "total": 336489, - "translated": 824, - "preTranslateAppliedTo": 268, - "approved": 169 - }, - "phrases": { - "total": 24685, - "translated": 77, - "preTranslateAppliedTo": 27, - "approved": 16 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 169, + "total": 340006 + } }, { "languageId": "es-EM", "words": { - "total": 336489, - "translated": 331819, - "preTranslateAppliedTo": 51273, - "approved": 296693 - }, - "phrases": { - "total": 24685, - "translated": 24558, - "preTranslateAppliedTo": 4649, - "approved": 21958 - }, - "translationProgress": 98, - "approvalProgress": 88 + "approved": 318593, + "total": 340006 + } }, { "languageId": "et", "words": { - "total": 336489, - "translated": 1014, - "preTranslateAppliedTo": 245, - "approved": 75 - }, - "phrases": { - "total": 24685, - "translated": 149, - "preTranslateAppliedTo": 46, - "approved": 12 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 75, + "total": 340006 + } }, { "languageId": "eu", "words": { - "total": 336489, - "translated": 768, - "preTranslateAppliedTo": 217, - "approved": 36 - }, - "phrases": { - "total": 24685, - "translated": 83, - "preTranslateAppliedTo": 38, - "approved": 4 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 36, + "total": 340006 + } }, { "languageId": "fa", "words": { - "total": 336489, - "translated": 149845, - "preTranslateAppliedTo": 28269, - "approved": 96744 - }, - "phrases": { - "total": 24685, - "translated": 12201, - "preTranslateAppliedTo": 2782, - "approved": 7769 - }, - "translationProgress": 44, - "approvalProgress": 28 + "approved": 96301, + "total": 340006 + } }, { "languageId": "fa-AF", "words": { - "total": 336489, - "translated": 193, - "preTranslateAppliedTo": 37, - "approved": 186 - }, - "phrases": { - "total": 24685, - "translated": 22, - "preTranslateAppliedTo": 6, - "approved": 17 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 186, + "total": 340006 + } }, { "languageId": "fi", "words": { - "total": 336489, - "translated": 45286, - "preTranslateAppliedTo": 11063, - "approved": 22594 - }, - "phrases": { - "total": 24685, - "translated": 4157, - "preTranslateAppliedTo": 1096, - "approved": 2136 - }, - "translationProgress": 13, - "approvalProgress": 6 + "approved": 22519, + "total": 340006 + } }, { "languageId": "fil", "words": { - "total": 336489, - "translated": 63679, - "preTranslateAppliedTo": 5142, - "approved": 54718 - }, - "phrases": { - "total": 24685, - "translated": 5343, - "preTranslateAppliedTo": 656, - "approved": 4539 - }, - "translationProgress": 18, - "approvalProgress": 16 + "approved": 54484, + "total": 340006 + } }, { "languageId": "fr", "words": { - "total": 336489, - "translated": 336489, - "preTranslateAppliedTo": 54154, - "approved": 336420 - }, - "phrases": { - "total": 24685, - "translated": 24685, - "preTranslateAppliedTo": 4849, - "approved": 24674 - }, - "translationProgress": 100, - "approvalProgress": 99 + "approved": 334953, + "total": 340006 + } }, { "languageId": "gi", "words": { - "total": 336489, - "translated": 4, - "preTranslateAppliedTo": 4, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 2, - "preTranslateAppliedTo": 2, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "gl", "words": { - "total": 336489, - "translated": 8308, - "preTranslateAppliedTo": 1290, - "approved": 1062 - }, - "phrases": { - "total": 24685, - "translated": 1042, - "preTranslateAppliedTo": 238, - "approved": 165 - }, - "translationProgress": 2, - "approvalProgress": 0 + "approved": 1047, + "total": 340006 + } }, { "languageId": "gu-IN", "words": { - "total": 336489, - "translated": 3066, - "preTranslateAppliedTo": 1043, - "approved": 1300 - }, - "phrases": { - "total": 24685, - "translated": 551, - "preTranslateAppliedTo": 251, - "approved": 235 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 1291, + "total": 340006 + } }, { "languageId": "ha", "words": { - "total": 336489, - "translated": 524, - "preTranslateAppliedTo": 114, - "approved": 4 - }, - "phrases": { - "total": 24685, - "translated": 54, - "preTranslateAppliedTo": 18, - "approved": 2 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 4, + "total": 340006 + } }, { "languageId": "he", "words": { - "total": 336489, - "translated": 7207, - "preTranslateAppliedTo": 1109, - "approved": 1222 - }, - "phrases": { - "total": 24685, - "translated": 1041, - "preTranslateAppliedTo": 268, - "approved": 203 - }, - "translationProgress": 2, - "approvalProgress": 0 + "approved": 1207, + "total": 340006 + } }, { "languageId": "hi", "words": { - "total": 336489, - "translated": 75996, - "preTranslateAppliedTo": 8937, - "approved": 57736 - }, - "phrases": { - "total": 24685, - "translated": 6278, - "preTranslateAppliedTo": 975, - "approved": 4820 - }, - "translationProgress": 22, - "approvalProgress": 17 + "approved": 57405, + "total": 340006 + } }, { "languageId": "hr", "words": { - "total": 336489, - "translated": 28058, - "preTranslateAppliedTo": 9317, - "approved": 13546 - }, - "phrases": { - "total": 24685, - "translated": 3014, - "preTranslateAppliedTo": 1040, - "approved": 1399 - }, - "translationProgress": 8, - "approvalProgress": 4 + "approved": 13432, + "total": 340006 + } }, { "languageId": "hu", "words": { - "total": 336489, - "translated": 218207, - "preTranslateAppliedTo": 18587, - "approved": 148555 - }, - "phrases": { - "total": 24685, - "translated": 16143, - "preTranslateAppliedTo": 1952, - "approved": 11899 - }, - "translationProgress": 64, - "approvalProgress": 44 + "approved": 198484, + "total": 340006 + } }, { "languageId": "hy-AM", "words": { - "total": 336489, - "translated": 10508, - "preTranslateAppliedTo": 1290, - "approved": 9634 - }, - "phrases": { - "total": 24685, - "translated": 1094, - "preTranslateAppliedTo": 243, - "approved": 993 - }, - "translationProgress": 3, - "approvalProgress": 2 + "approved": 9631, + "total": 340006 + } }, { "languageId": "id", "words": { - "total": 336489, - "translated": 280227, - "preTranslateAppliedTo": 37675, - "approved": 156274 - }, - "phrases": { - "total": 24685, - "translated": 21146, - "preTranslateAppliedTo": 3636, - "approved": 12116 - }, - "translationProgress": 83, - "approvalProgress": 46 + "approved": 155502, + "total": 340006 + } }, { "languageId": "ig", "words": { - "total": 336489, - "translated": 31195, - "preTranslateAppliedTo": 1678, - "approved": 23475 - }, - "phrases": { - "total": 24685, - "translated": 2954, - "preTranslateAppliedTo": 299, - "approved": 2278 - }, - "translationProgress": 9, - "approvalProgress": 6 + "approved": 23355, + "total": 340006 + } }, { "languageId": "it", "words": { - "total": 336489, - "translated": 336489, - "preTranslateAppliedTo": 57137, - "approved": 336174 - }, - "phrases": { - "total": 24685, - "translated": 24685, - "preTranslateAppliedTo": 5157, - "approved": 24656 - }, - "translationProgress": 100, - "approvalProgress": 99 + "approved": 334707, + "total": 340006 + } }, { "languageId": "ja", "words": { - "total": 336489, - "translated": 316663, - "preTranslateAppliedTo": 48606, - "approved": 284629 - }, - "phrases": { - "total": 24685, - "translated": 23404, - "preTranslateAppliedTo": 4431, - "approved": 20925 - }, - "translationProgress": 94, - "approvalProgress": 84 + "approved": 283319, + "total": 340006 + } }, { "languageId": "ka", "words": { - "total": 336489, - "translated": 15234, - "preTranslateAppliedTo": 2130, - "approved": 1449 - }, - "phrases": { - "total": 24685, - "translated": 1936, - "preTranslateAppliedTo": 387, - "approved": 253 - }, - "translationProgress": 4, - "approvalProgress": 0 + "approved": 1434, + "total": 340006 + } }, { "languageId": "kk", "words": { - "total": 336489, - "translated": 2027, - "preTranslateAppliedTo": 1138, - "approved": 1155 - }, - "phrases": { - "total": 24685, - "translated": 427, - "preTranslateAppliedTo": 225, - "approved": 185 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 1140, + "total": 340006 + } }, { "languageId": "km", "words": { - "total": 336489, - "translated": 16940, - "preTranslateAppliedTo": 1646, - "approved": 15713 - }, - "phrases": { - "total": 24685, - "translated": 1769, - "preTranslateAppliedTo": 327, - "approved": 1551 - }, - "translationProgress": 5, - "approvalProgress": 4 + "approved": 15612, + "total": 340006 + } }, { "languageId": "kn", "words": { - "total": 336489, - "translated": 44325, - "preTranslateAppliedTo": 1474, - "approved": 26051 - }, - "phrases": { - "total": 24685, - "translated": 3595, - "preTranslateAppliedTo": 144, - "approved": 2343 - }, - "translationProgress": 13, - "approvalProgress": 7 + "approved": 25901, + "total": 340006 + } }, { "languageId": "ko", "words": { - "total": 336489, - "translated": 108091, - "preTranslateAppliedTo": 19220, - "approved": 51562 - }, - "phrases": { - "total": 24685, - "translated": 8998, - "preTranslateAppliedTo": 2057, - "approved": 3874 - }, - "translationProgress": 32, - "approvalProgress": 15 + "approved": 51367, + "total": 340006 + } }, { "languageId": "ku", "words": { - "total": 336489, - "translated": 897, - "preTranslateAppliedTo": 70, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 116, - "preTranslateAppliedTo": 40, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "ky", "words": { - "total": 336489, - "translated": 456, - "preTranslateAppliedTo": 129, - "approved": 12 - }, - "phrases": { - "total": 24685, - "translated": 129, - "preTranslateAppliedTo": 55, - "approved": 7 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 12, + "total": 340006 + } }, { "languageId": "lb", "words": { - "total": 336489, - "translated": 257, - "preTranslateAppliedTo": 81, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 29, - "preTranslateAppliedTo": 11, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "lt", "words": { - "total": 336489, - "translated": 4171, - "preTranslateAppliedTo": 1794, - "approved": 1567 - }, - "phrases": { - "total": 24685, - "translated": 790, - "preTranslateAppliedTo": 398, - "approved": 257 - }, - "translationProgress": 1, - "approvalProgress": 0 + "approved": 1552, + "total": 340006 + } }, { "languageId": "mai", "words": { - "total": 336489, - "translated": 1, - "preTranslateAppliedTo": 1, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 1, - "preTranslateAppliedTo": 1, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "mk", "words": { - "total": 336489, - "translated": 422, - "preTranslateAppliedTo": 245, - "approved": 88 - }, - "phrases": { - "total": 24685, - "translated": 164, - "preTranslateAppliedTo": 88, - "approved": 16 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 88, + "total": 340006 + } }, { "languageId": "ml-IN", "words": { - "total": 336489, - "translated": 18507, - "preTranslateAppliedTo": 6285, - "approved": 11452 - }, - "phrases": { - "total": 24685, - "translated": 2119, - "preTranslateAppliedTo": 750, - "approved": 1281 - }, - "translationProgress": 5, - "approvalProgress": 3 + "approved": 11316, + "total": 340006 + } }, { "languageId": "mn", "words": { - "total": 336489, - "translated": 142, - "preTranslateAppliedTo": 131, - "approved": 64 - }, - "phrases": { - "total": 24685, - "translated": 19, - "preTranslateAppliedTo": 17, - "approved": 4 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 64, + "total": 340006 + } }, { "languageId": "mr", "words": { - "total": 336489, - "translated": 33873, - "preTranslateAppliedTo": 1592, - "approved": 26062 - }, - "phrases": { - "total": 24685, - "translated": 2914, - "preTranslateAppliedTo": 269, - "approved": 2346 - }, - "translationProgress": 10, - "approvalProgress": 7 + "approved": 25900, + "total": 340006 + } }, { "languageId": "ms", "words": { - "total": 336489, - "translated": 74157, - "preTranslateAppliedTo": 4802, - "approved": 37271 - }, - "phrases": { - "total": 24685, - "translated": 6231, - "preTranslateAppliedTo": 619, - "approved": 2879 - }, - "translationProgress": 22, - "approvalProgress": 11 + "approved": 37132, + "total": 340006 + } }, { "languageId": "my", "words": { - "total": 336489, - "translated": 1568, - "preTranslateAppliedTo": 914, - "approved": 706 - }, - "phrases": { - "total": 24685, - "translated": 188, - "preTranslateAppliedTo": 99, - "approved": 58 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 706, + "total": 340006 + } }, { "languageId": "ne-NP", "words": { - "total": 336489, - "translated": 1887, - "preTranslateAppliedTo": 200, - "approved": 1434 - }, - "phrases": { - "total": 24685, - "translated": 317, - "preTranslateAppliedTo": 45, - "approved": 248 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 1434, + "total": 340006 + } }, { "languageId": "nl", "words": { - "total": 336489, - "translated": 71400, - "preTranslateAppliedTo": 17112, - "approved": 37568 - }, - "phrases": { - "total": 24685, - "translated": 6480, - "preTranslateAppliedTo": 1791, - "approved": 3380 - }, - "translationProgress": 21, - "approvalProgress": 11 + "approved": 37358, + "total": 340006 + } }, { "languageId": "no", "words": { - "total": 336489, - "translated": 6743, - "preTranslateAppliedTo": 1939, - "approved": 1717 - }, - "phrases": { - "total": 24685, - "translated": 1319, - "preTranslateAppliedTo": 414, - "approved": 306 - }, - "translationProgress": 2, - "approvalProgress": 0 + "approved": 1702, + "total": 340006 + } }, { "languageId": "or", "words": { - "total": 336489, - "translated": 146, - "preTranslateAppliedTo": 42, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 79, - "preTranslateAppliedTo": 31, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "pa-IN", "words": { - "total": 336489, - "translated": 3977, - "preTranslateAppliedTo": 458, - "approved": 6 - }, - "phrases": { - "total": 24685, - "translated": 365, - "preTranslateAppliedTo": 44, - "approved": 2 - }, - "translationProgress": 1, - "approvalProgress": 0 + "approved": 6, + "total": 340006 + } }, { "languageId": "pcm", "words": { - "total": 336489, - "translated": 28626, - "preTranslateAppliedTo": 2714, - "approved": 17267 - }, - "phrases": { - "total": 24685, - "translated": 2637, - "preTranslateAppliedTo": 350, - "approved": 1686 - }, - "translationProgress": 8, - "approvalProgress": 5 + "approved": 17163, + "total": 340006 + } }, { "languageId": "pl", "words": { - "total": 336489, - "translated": 158045, - "preTranslateAppliedTo": 23871, - "approved": 94469 - }, - "phrases": { - "total": 24685, - "translated": 12909, - "preTranslateAppliedTo": 2437, - "approved": 7963 - }, - "translationProgress": 46, - "approvalProgress": 28 + "approved": 93928, + "total": 340006 + } }, { "languageId": "pt-BR", "words": { - "total": 336489, - "translated": 326075, - "preTranslateAppliedTo": 53214, - "approved": 319354 - }, - "phrases": { - "total": 24685, - "translated": 24198, - "preTranslateAppliedTo": 4787, - "approved": 23630 - }, - "translationProgress": 96, - "approvalProgress": 94 + "approved": 317914, + "total": 340006 + } }, { "languageId": "pt-PT", "words": { - "total": 336489, - "translated": 39477, - "preTranslateAppliedTo": 4918, - "approved": 26172 - }, - "phrases": { - "total": 24685, - "translated": 3712, - "preTranslateAppliedTo": 775, - "approved": 2376 - }, - "translationProgress": 11, - "approvalProgress": 7 + "approved": 26010, + "total": 340006 + } }, { "languageId": "ro", "words": { - "total": 336489, - "translated": 103193, - "preTranslateAppliedTo": 28227, - "approved": 78311 - }, - "phrases": { - "total": 24685, - "translated": 9188, - "preTranslateAppliedTo": 2632, - "approved": 6983 - }, - "translationProgress": 30, - "approvalProgress": 23 + "approved": 77817, + "total": 340006 + } }, { "languageId": "ru", "words": { - "total": 336489, - "translated": 172802, - "preTranslateAppliedTo": 35985, - "approved": 96860 - }, - "phrases": { - "total": 24685, - "translated": 14092, - "preTranslateAppliedTo": 3599, - "approved": 7842 - }, - "translationProgress": 51, - "approvalProgress": 28 + "approved": 96401, + "total": 340006 + } }, { "languageId": "sat", "words": { - "total": 336489, - "translated": 69, - "preTranslateAppliedTo": 66, - "approved": 57 - }, - "phrases": { - "total": 24685, - "translated": 26, - "preTranslateAppliedTo": 25, - "approved": 20 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 57, + "total": 340006 + } }, { "languageId": "si-LK", "words": { - "total": 336489, - "translated": 978, - "preTranslateAppliedTo": 886, - "approved": 706 - }, - "phrases": { - "total": 24685, - "translated": 134, - "preTranslateAppliedTo": 98, - "approved": 58 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 706, + "total": 340006 + } }, { "languageId": "sk", "words": { - "total": 336489, - "translated": 14738, - "preTranslateAppliedTo": 2629, - "approved": 6377 - }, - "phrases": { - "total": 24685, - "translated": 1683, - "preTranslateAppliedTo": 439, - "approved": 700 - }, - "translationProgress": 4, - "approvalProgress": 1 + "approved": 6362, + "total": 340006 + } }, { "languageId": "sl", "words": { - "total": 336489, - "translated": 54938, - "preTranslateAppliedTo": 20007, - "approved": 26540 - }, - "phrases": { - "total": 24685, - "translated": 5175, - "preTranslateAppliedTo": 2068, - "approved": 2537 - }, - "translationProgress": 16, - "approvalProgress": 7 + "approved": 26395, + "total": 340006 + } }, { "languageId": "sn", "words": { - "total": 336489, - "translated": 557, - "preTranslateAppliedTo": 557, - "approved": 465 - }, - "phrases": { - "total": 24685, - "translated": 53, - "preTranslateAppliedTo": 53, - "approved": 40 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 465, + "total": 340006 + } }, { "languageId": "so", "words": { - "total": 336489, - "translated": 1238, - "preTranslateAppliedTo": 797, - "approved": 493 - }, - "phrases": { - "total": 24685, - "translated": 252, - "preTranslateAppliedTo": 156, - "approved": 42 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 493, + "total": 340006 + } }, { "languageId": "sq", "words": { - "total": 336489, - "translated": 8532, - "preTranslateAppliedTo": 6014, - "approved": 693 - }, - "phrases": { - "total": 24685, - "translated": 1115, - "preTranslateAppliedTo": 741, - "approved": 58 - }, - "translationProgress": 2, - "approvalProgress": 0 + "approved": 693, + "total": 340006 + } }, { "languageId": "sr-CS", "words": { - "total": 336489, - "translated": 41464, - "preTranslateAppliedTo": 3636, - "approved": 26313 - }, - "phrases": { - "total": 24685, - "translated": 3837, - "preTranslateAppliedTo": 504, - "approved": 2374 - }, - "translationProgress": 12, - "approvalProgress": 7 + "approved": 26151, + "total": 340006 + } }, { "languageId": "sv-SE", "words": { - "total": 336489, - "translated": 28083, - "preTranslateAppliedTo": 8024, - "approved": 10006 - }, - "phrases": { - "total": 24685, - "translated": 3150, - "preTranslateAppliedTo": 1096, - "approved": 1087 - }, - "translationProgress": 8, - "approvalProgress": 2 + "approved": 9980, + "total": 340006 + } }, { "languageId": "sw", "words": { - "total": 336489, - "translated": 24971, - "preTranslateAppliedTo": 6832, - "approved": 16569 - }, - "phrases": { - "total": 24685, - "translated": 2729, - "preTranslateAppliedTo": 883, - "approved": 1784 - }, - "translationProgress": 7, - "approvalProgress": 4 + "approved": 16508, + "total": 340006 + } }, { "languageId": "ta", "words": { - "total": 336489, - "translated": 8030, - "preTranslateAppliedTo": 1738, - "approved": 1453 - }, - "phrases": { - "total": 24685, - "translated": 1041, - "preTranslateAppliedTo": 335, - "approved": 255 - }, - "translationProgress": 2, - "approvalProgress": 0 + "approved": 1438, + "total": 340006 + } }, { "languageId": "te", "words": { - "total": 336489, - "translated": 13832, - "preTranslateAppliedTo": 1291, - "approved": 694 - }, - "phrases": { - "total": 24685, - "translated": 1401, - "preTranslateAppliedTo": 153, - "approved": 59 - }, - "translationProgress": 4, - "approvalProgress": 0 + "approved": 694, + "total": 340006 + } }, { "languageId": "tg", "words": { - "total": 336489, - "translated": 169, - "preTranslateAppliedTo": 87, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 52, - "preTranslateAppliedTo": 44, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "th", "words": { - "total": 336489, - "translated": 12941, - "preTranslateAppliedTo": 2660, - "approved": 5951 - }, - "phrases": { - "total": 24685, - "translated": 1728, - "preTranslateAppliedTo": 498, - "approved": 630 - }, - "translationProgress": 3, - "approvalProgress": 1 + "approved": 5936, + "total": 340006 + } }, { "languageId": "ti", "words": { - "total": 336489, - "translated": 160, - "preTranslateAppliedTo": 14, - "approved": 0 - }, - "phrases": { - "total": 24685, - "translated": 17, - "preTranslateAppliedTo": 1, - "approved": 0 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 0, + "total": 340006 + } }, { "languageId": "tk", "words": { - "total": 336489, - "translated": 6361, - "preTranslateAppliedTo": 739, - "approved": 5881 - }, - "phrases": { - "total": 24685, - "translated": 709, - "preTranslateAppliedTo": 131, - "approved": 604 - }, - "translationProgress": 1, - "approvalProgress": 1 + "approved": 5881, + "total": 340006 + } }, { "languageId": "tl", "words": { - "total": 336489, - "translated": 2844, - "preTranslateAppliedTo": 811, - "approved": 86 - }, - "phrases": { - "total": 24685, - "translated": 264, - "preTranslateAppliedTo": 93, - "approved": 8 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 86, + "total": 340006 + } }, { "languageId": "tr", "words": { - "total": 336489, - "translated": 326807, - "preTranslateAppliedTo": 44723, - "approved": 321705 - }, - "phrases": { - "total": 24685, - "translated": 24288, - "preTranslateAppliedTo": 4221, - "approved": 23859 - }, - "translationProgress": 97, - "approvalProgress": 95 + "approved": 320257, + "total": 340006 + } }, { "languageId": "uk", "words": { - "total": 336489, - "translated": 191008, - "preTranslateAppliedTo": 34741, - "approved": 64755 - }, - "phrases": { - "total": 24685, - "translated": 15442, - "preTranslateAppliedTo": 3316, - "approved": 5426 - }, - "translationProgress": 56, - "approvalProgress": 19 + "approved": 64387, + "total": 340006 + } }, { "languageId": "ur-IN", "words": { - "total": 336489, - "translated": 1998, - "preTranslateAppliedTo": 367, - "approved": 1214 - }, - "phrases": { - "total": 24685, - "translated": 437, - "preTranslateAppliedTo": 162, - "approved": 200 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 1205, + "total": 340006 + } }, { "languageId": "ur-PK", "words": { - "total": 336489, - "translated": 2766, - "preTranslateAppliedTo": 1441, - "approved": 725 - }, - "phrases": { - "total": 24685, - "translated": 451, - "preTranslateAppliedTo": 191, - "approved": 60 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 725, + "total": 340006 + } }, { "languageId": "uz", "words": { - "total": 336489, - "translated": 22487, - "preTranslateAppliedTo": 4383, - "approved": 1878 - }, - "phrases": { - "total": 24685, - "translated": 2310, - "preTranslateAppliedTo": 640, - "approved": 339 - }, - "translationProgress": 6, - "approvalProgress": 0 + "approved": 1863, + "total": 340006 + } }, { "languageId": "vi", "words": { - "total": 336489, - "translated": 62946, - "preTranslateAppliedTo": 12751, - "approved": 16174 - }, - "phrases": { - "total": 24685, - "translated": 5744, - "preTranslateAppliedTo": 1399, - "approved": 1635 - }, - "translationProgress": 18, - "approvalProgress": 4 + "approved": 16076, + "total": 340006 + } }, { "languageId": "yo", "words": { - "total": 336489, - "translated": 3820, - "preTranslateAppliedTo": 930, - "approved": 687 - }, - "phrases": { - "total": 24685, - "translated": 494, - "preTranslateAppliedTo": 117, - "approved": 55 - }, - "translationProgress": 1, - "approvalProgress": 0 + "approved": 687, + "total": 340006 + } }, { "languageId": "zh-CN", "words": { - "total": 336489, - "translated": 323069, - "preTranslateAppliedTo": 56826, - "approved": 305017 - }, - "phrases": { - "total": 24685, - "translated": 23991, - "preTranslateAppliedTo": 5128, - "approved": 22626 - }, - "translationProgress": 96, - "approvalProgress": 90 + "approved": 303699, + "total": 340006 + } }, { "languageId": "zh-TW", "words": { - "total": 336489, - "translated": 214786, - "preTranslateAppliedTo": 37224, - "approved": 111257 - }, - "phrases": { - "total": 24685, - "translated": 17351, - "preTranslateAppliedTo": 3689, - "approved": 8893 - }, - "translationProgress": 63, - "approvalProgress": 33 + "approved": 110743, + "total": 340006 + } }, { "languageId": "zu", "words": { - "total": 336489, - "translated": 164, - "preTranslateAppliedTo": 164, - "approved": 109 - }, - "phrases": { - "total": 24685, - "translated": 17, - "preTranslateAppliedTo": 17, - "approved": 9 - }, - "translationProgress": 0, - "approvalProgress": 0 + "approved": 109, + "total": 340006 + } } ] \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index 5bd2eecbab4..82a81d84236 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -155,7 +155,8 @@ export type RawQuestion = { export type QuestionBank = Record export type QuestionKey = keyof typeof allQuestionData -export type AnswerKey = typeof allQuestionData[QuestionKey]["answers"][number]["id"] +export type AnswerKey = + (typeof allQuestionData)[QuestionKey]["answers"][number]["id"] export type Question = RawQuestion & { id: QuestionKey @@ -192,7 +193,10 @@ export type QuizKey = keyof typeof allQuizData type HasScoredPerfect = boolean type QuestionsCorrect = number -export type CompletedQuizzes = Record +export type CompletedQuizzes = Record< + QuizKey, + [HasScoredPerfect, QuestionsCorrect] +> export type UserStats = { score: number @@ -238,37 +242,12 @@ export type LocaleContributions = { } // Crowdin translation progress -type Language = { - id: string - name: string - editorCode: string - twoLettersCode: string - threeLettersCode: string - locale: string - androidCode: string - osxCode: string - osxLocale: string - pluralCategoryNames: string[] - pluralRules: string - pluralExamples: string[] - textDirection: string - dialectOf: unknown -} - -type CountSummary = { - total: number - translated: number - preTranslateAppliedTo: number - approved: number -} - export type ProjectProgressData = { - languageId: string, - language?: Language, - words: CountSummary, - phrases: CountSummary, - translationProgress: number - approvalProgress: number + languageId: string + words: { + total: number + approved: number + } } export type LocaleDisplayInfo = { @@ -329,7 +308,6 @@ export type AllTimeData = { }> } - // GitHub contributors export type Commit = { commit: { @@ -368,8 +346,8 @@ export type ToCNodeEntry = { export type TocNodeType = | ToCNodeEntry | { - items: TocNodeType[] - } + items: TocNodeType[] + } export type ToCItem = { title: string @@ -435,12 +413,12 @@ export type TimestampedData = { export type MetricDataValue = | { - error: string - } + error: string + } | { - data: Data - value: Value - } + data: Data + value: Value + } export type EtherscanNodeResponse = { result: { diff --git a/src/scripts/crowdin/getTranslationProgress.ts b/src/scripts/crowdin/getTranslationProgress.ts index bb654f6ce33..54df1481f05 100644 --- a/src/scripts/crowdin/getTranslationProgress.ts +++ b/src/scripts/crowdin/getTranslationProgress.ts @@ -1,4 +1,4 @@ -import fs from 'fs' +import fs from "fs" import type { ProjectProgressData } from "../../lib/types" @@ -10,16 +10,33 @@ async function main() { const projectId = Number(process.env.CROWDIN_PROJECT_ID) || 363359 try { - const response = await crowdin.translationStatusApi.getProjectProgress(projectId, { - limit: 200, - }) - - if (!response) throw new Error("Error fetching Crowdin translation progress. Check your environment variables for a working API key.") - - const progress = response.data.map(({ data }) => ({ ...data, language: undefined } satisfies ProjectProgressData)) - - fs.writeFileSync("src/data/translationProgress.json", JSON.stringify(progress, null, 2)) - + const response = await crowdin.translationStatusApi.getProjectProgress( + projectId, + { + limit: 200, + } + ) + + if (!response) + throw new Error( + "Error fetching Crowdin translation progress. Check your environment variables for a working API key." + ) + + const progress = response.data.map( + ({ data }) => + ({ + languageId: data.languageId, + words: { + approved: data.words.approved, + total: data.words.total, + }, + } as ProjectProgressData) + ) + + fs.writeFileSync( + "src/data/translationProgress.json", + JSON.stringify(progress, null, 2) + ) } catch (error: unknown) { console.error((error as Error).message) } From dbab8869d0caaf49c13161efa742f00ffbdc3e61 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 7 Feb 2024 13:55:36 -0800 Subject: [PATCH 187/478] style: adjust spacing --- src/components/Nav/Menu/index.tsx | 3 ++- src/components/Nav/index.tsx | 16 ++++------------ src/components/Search/index.tsx | 2 +- src/components/Search/utils.ts | 5 +++-- 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index a6258fcd3ae..759d0cc91c0 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -43,8 +43,9 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { - - ) : ( - <> - - - - - - )} - - - ) - })} - + + ) : ( + <> + + + + + + )} + + + ) + })} + + diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 0fc8f171001..86a9a27c65a 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,7 +1,6 @@ import { useRef } from "react" import { Box, type BoxProps, Flex, Grid } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" -import * as Portal from "@radix-ui/react-portal" import { Button } from "@/components/Buttons" @@ -27,75 +26,72 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { } return ( - <> - - + + + + {SECTION_LABELS.map((sectionKey) => { + const { label, items } = sections[sectionKey] + return ( + + + + + + + ) + })} + + + - - - {SECTION_LABELS.map((sectionKey) => { - const { label, items } = sections[sectionKey] - return ( - - - - - - - ) - })} - - - + - - - - - - - - - - + + + + + + ) } From 14e6b2a99f335f4bd76a7b1e870f2e076cfea089 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Thu, 8 Feb 2024 10:58:15 +0100 Subject: [PATCH 191/478] force display of the default locale prefix in the url --- next-i18next.config.js | 6 +++-- next.config.js | 5 ++-- .../LanguagePicker/useLanguagePicker.tsx | 8 ++++--- src/lib/utils/translations.ts | 23 ++++++++----------- src/middleware.ts | 18 +++++++++++++++ src/pages/[...slug].tsx | 7 ++++-- 6 files changed, 45 insertions(+), 22 deletions(-) create mode 100644 src/middleware.ts diff --git a/next-i18next.config.js b/next-i18next.config.js index bacf8af4049..d286162a4cb 100644 --- a/next-i18next.config.js +++ b/next-i18next.config.js @@ -9,9 +9,11 @@ const locales = BUILD_LOCALES /** @type {import('next-i18next').UserConfig} */ module.exports = { i18n: { - defaultLocale: "en", + // "default" locale is a hack to always display the locale prefix in the + // url. Ref: https://nextjs.org/docs/pages/building-your-application/routing/internationalization#prefixing-the-default-locale + defaultLocale: "default", // supported locales defined in `i18n.config.json` - locales, + locales: ["default", ...locales], }, // define custom location for intl files, otherwise default to public/locales (https://github.com/i18next/next-i18next#2-translation-content) localePath: "./src/intl", diff --git a/next.config.js b/next.config.js index db22e54df8e..3afc1bf5ffc 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,6 @@ const { PHASE_DEVELOPMENT_SERVER } = require("next/constants") -const { i18n } = require("./next-i18next.config") +const i18n = require("./next-i18next.config") const LIMIT_CPUS = Number(process.env.LIMIT_CPUS || 2) @@ -33,7 +33,8 @@ module.exports = (phase, { defaultConfig }) => { return config }, - i18n, + ...i18n, + trailingSlash: true, images: { deviceSizes: [640, 750, 828, 1080, 1200, 1504, 1920], }, diff --git a/src/components/LanguagePicker/useLanguagePicker.tsx b/src/components/LanguagePicker/useLanguagePicker.tsx index 78c3df6926d..b5a7b3b67e1 100644 --- a/src/components/LanguagePicker/useLanguagePicker.tsx +++ b/src/components/LanguagePicker/useLanguagePicker.tsx @@ -11,7 +11,7 @@ import type { } from "@/lib/types" import { MatomoEventOptions, trackCustomEvent } from "@/lib/utils/matomo" -import { languages } from "@/lib/utils/translations" +import { filterFakedLocales, languages } from "@/lib/utils/translations" import progressData from "@/data/translationProgress.json" @@ -24,7 +24,7 @@ export const useLanguagePicker = ( menuState?: UseDisclosureReturn ) => { const { t } = useTranslation("page-languages") - const { locale, locales } = useRouter() + const { locale, locales: rawLocales } = useRouter() const refs = { inputRef: useRef(null), firstItemRef: useRef(null), @@ -37,6 +37,8 @@ export const useLanguagePicker = ( // perform all the filtering and mapping when the filter value change useEffect(() => { + const locales = filterFakedLocales(rawLocales) + // Get the preferred languages for the users browser const navLangs = typeof navigator !== "undefined" ? navigator.languages : [] @@ -139,7 +141,7 @@ export const useLanguagePicker = ( .includes(filterValue.toLowerCase()) ) ) - }, [filterValue, locale, locales, t]) + }, [filterValue, locale, rawLocales, t]) const { isOpen, ...menu } = useDisclosure() diff --git a/src/lib/utils/translations.ts b/src/lib/utils/translations.ts index 91a752b5112..2b175c69c04 100644 --- a/src/lib/utils/translations.ts +++ b/src/lib/utils/translations.ts @@ -18,6 +18,10 @@ export const isLangRightToLeft = (lang: Lang): boolean => { return langConfig[0].langDir === "rtl" } +export const filterFakedLocales = (locales: string[] | undefined) => { + return locales?.filter((locale) => locale !== "default") || [] +} + // Overwrites the default Persian numbering of the Farsi language to use Hindu-Arabic numerals (0-9) // Context: https://github.com/ethereum/ethereum-org-website/pull/5490#pullrequestreview-892596553 export const getLocaleForNumberFormat = (locale: Lang): Lang => @@ -73,10 +77,7 @@ const getRequiredNamespacesForPath = (path: string) => { if (path.startsWith("/energy-consumption")) { primaryNamespace = "page-what-is-ethereum" - requiredNamespaces = [ - ...requiredNamespaces, - "page-about", - ] + requiredNamespaces = [...requiredNamespaces, "page-about"] } if (path.startsWith("/eth")) { @@ -133,10 +134,7 @@ const getRequiredNamespacesForPath = (path: string) => { if (path.startsWith("/roadmap/vision")) { primaryNamespace = "page-roadmap-vision" - requiredNamespaces = [ - ...requiredNamespaces, - "page-upgrades-index", - ] + requiredNamespaces = [...requiredNamespaces, "page-upgrades-index"] } if (path.startsWith("/gas")) { @@ -163,10 +161,7 @@ const getRequiredNamespacesForPath = (path: string) => { if (path.startsWith("/wallets/find-wallet")) { primaryNamespace = "page-wallets-find-wallet" - requiredNamespaces = [ - ...requiredNamespaces, - "page-wallets", - ] + requiredNamespaces = [...requiredNamespaces, "page-wallets"] } if (path.startsWith("/layer-2")) { @@ -193,7 +188,9 @@ const getRequiredNamespacesForPath = (path: string) => { } // Ensures that the primary namespace is always the first item in the array - return primaryNamespace ? [primaryNamespace, ...requiredNamespaces] : [...requiredNamespaces] + return primaryNamespace + ? [primaryNamespace, ...requiredNamespaces] + : [...requiredNamespaces] } const getRequiredNamespacesForLayout = (layout?: string) => { diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 00000000000..de894a9b431 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,18 @@ +import { NextRequest, NextResponse } from "next/server" + +const PUBLIC_FILE = /\.(.*)$/ + +export async function middleware(req: NextRequest) { + if ( + req.nextUrl.pathname.startsWith("/_next") || + req.nextUrl.pathname.includes("/api/") || + PUBLIC_FILE.test(req.nextUrl.pathname) + ) { + return + } + + if (req.nextUrl.locale === "default") { + console.log(`/en${req.nextUrl.pathname}`) + return NextResponse.redirect(new URL(`/en${req.nextUrl.pathname}`, req.url)) + } +} diff --git a/src/pages/[...slug].tsx b/src/pages/[...slug].tsx index 449e0a18299..5bc4fa704d0 100644 --- a/src/pages/[...slug].tsx +++ b/src/pages/[...slug].tsx @@ -32,7 +32,10 @@ import { getLastDeployDate } from "@/lib/utils/getLastDeployDate" import { getLastModifiedDate } from "@/lib/utils/gh" import { getContent, getContentBySlug } from "@/lib/utils/md" import { remapTableOfContents } from "@/lib/utils/toc" -import { getRequiredNamespacesForPage } from "@/lib/utils/translations" +import { + filterFakedLocales, + getRequiredNamespacesForPage, +} from "@/lib/utils/translations" import { docsComponents, @@ -82,7 +85,7 @@ export const getStaticPaths = (({ locales }) => { const contentFiles = getContent("/") // Generate page paths for each supported locale - const paths = locales!.flatMap((locale) => + const paths = filterFakedLocales(locales).flatMap((locale) => contentFiles.map((file) => ({ params: { // Splitting nested paths to generate proper slug From 7422634ee37294679689162090254192add0f61e Mon Sep 17 00:00:00 2001 From: Nuno Loureiro Date: Thu, 8 Feb 2024 15:31:41 +0000 Subject: [PATCH 192/478] changed the main color for the language --- src/components/LanguagePicker/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index 65d660c64b0..a42704a9bf1 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -85,7 +85,7 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { {targetName} From 0dc8268534100b5e30996b3064d7c77736a6484e Mon Sep 17 00:00:00 2001 From: Nuno Loureiro Date: Thu, 8 Feb 2024 15:31:41 +0000 Subject: [PATCH 193/478] changed the main color for the language --- src/components/LanguagePicker/MenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index 65d660c64b0..a42704a9bf1 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -85,7 +85,7 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { {targetName} From 453925b8c6abb472909616395a4ebbf331346112 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 8 Feb 2024 09:23:46 -0800 Subject: [PATCH 194/478] fix: menu item hover label styles --- src/components/LanguagePicker/MenuItem.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/LanguagePicker/MenuItem.tsx b/src/components/LanguagePicker/MenuItem.tsx index a42704a9bf1..e1ec58213e3 100644 --- a/src/components/LanguagePicker/MenuItem.tsx +++ b/src/components/LanguagePicker/MenuItem.tsx @@ -61,12 +61,15 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { bg={isCurrent ? "background.base" : "transparent"} color="body.base" textDecoration="none" - data-group onFocus={(e) => { e.target.scrollIntoView({ block: "nearest" }) }} scrollMarginY="8" - _hover={{ bg: "primary.lowContrast", textDecoration: "none" }} + _hover={{ + bg: "primary.lowContrast", + textDecoration: "none", + "p.language-name": { color: "primary.base" }, + }} _focus={{ bg: "primary.lowContrast" }} sx={{ p: { @@ -84,6 +87,7 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { @@ -108,7 +112,9 @@ const MenuItem = forwardRef(({ displayInfo, ...props }: ItemProps, ref) => { {sourceName} - {isCurrent && } + {isCurrent && ( + + )} Date: Thu, 8 Feb 2024 13:39:04 -0500 Subject: [PATCH 195/478] fix roadmap link [Fixes #12108] --- public/content/roadmap/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/roadmap/index.md b/public/content/roadmap/index.md index 6a218c2e655..ef683bb7ddf 100644 --- a/public/content/roadmap/index.md +++ b/public/content/roadmap/index.md @@ -59,7 +59,7 @@ Ethereum gets regular upgrades that enhance its scalability, security, or sustai -The roadmap is mostly the result of years of work by researchers and developers - because the protocol is very technical - but any motivated person can participate. Ideas usually start off as discussions on a forum such as [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) or the Eth R&D discord server. They may be responses to new vulnerabilities that are discovered, suggestions from organizations working in the application layer (such as dapps and exchanges) or from known frictions for end users (such as costs or transaction speeds). When these ideas mature, they can be proposed as [Ethereum Improvement Proposals](https://eips.ethereum.org/). This is all done in public so that anyone from the community can weigh in at any time. +The roadmap is mostly the result of years of work by researchers and developers - because the protocol is very technical - but any motivated person can participate. Ideas usually start off as discussions on a forum such as [ethresear.ch](https://ethresear.ch/), [Ethereum Magicians](https://ethereum-magicians.org/) or the Eth R&D discord server. They may be responses to new vulnerabilities that are discovered, suggestions from organizations working in the application layer (such as dapps and exchanges) or from known frictions for end users (such as costs or transaction speeds). When these ideas mature, they can be proposed as [Ethereum Improvement Proposals](https://eips.ethereum.org/). This is all done in public so that anyone from the community can weigh in at any time. [More on Ethereum governance](/governance/) From e604378efae7ec1f266dafbe36860ae23816cce3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 8 Feb 2024 13:33:31 -0800 Subject: [PATCH 196/478] fix: nested menu kbd escape --- src/components/Nav/Menu/LvlContent.tsx | 134 +++++++++++++------------ src/components/Nav/Menu/index.tsx | 15 +-- 2 files changed, 77 insertions(+), 72 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 9251f44e61c..dff652fc28f 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -1,3 +1,4 @@ +import NextLink from "next/link" import { useRouter } from "next/router" import { Box, Button, Icon, ListItem, UnorderedList } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" @@ -36,81 +37,82 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { return ( - + - - - {items.map((item) => { - const { label, description, icon, ...action } = item - const subItems = action.items || [] - const isLink = "href" in action - const isActivePage = isLink && cleanPath(asPath) === action.href - const activeStyles = { - outline: "none", - rounded: "md", - "p, svg": { color: "primary.base" }, - bg: `menu.lvl${lvl}.activeBackground`, - boxShadow: "none", - } - const buttonProps: ButtonProps = { - color: isActivePage ? "menu.active" : `menu.lvl${lvl}.main`, - leftIcon: lvl === 1 && icon ? : undefined, - rightIcon: isLink ? undefined : , - position: "relative", - w: "full", - sx: { - "span:first-of-type": { m: 0, me: 4 }, // Spacing for icon - '&[data-state="open"]': { - roundedEnd: "none", - bg: `menu.lvl${lvl}.activeBackground`, - }, - }, - py: pad, - bg: "none", - _hover: activeStyles, - _active: activeStyles, - _focus: activeStyles, - variant: "ghost", - } - return ( - - - {isLink ? ( + + {items.map((item) => { + const { label, description, icon, ...action } = item + const subItems = action.items || [] + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + const activeStyles = { + outline: "none", + rounded: "md", + "p, svg": { color: "primary.base" }, + bg: `menu.lvl${lvl}.activeBackground`, + boxShadow: "none", + } + const buttonProps: ButtonProps = { + color: isActivePage ? "menu.active" : `menu.lvl${lvl}.main`, + leftIcon: lvl === 1 && icon ? : undefined, + rightIcon: isLink ? undefined : , + position: "relative", + w: "full", + me: -pad, + sx: { + "span:first-of-type": { m: 0, me: pad }, // Spacing for icon + }, + py: pad, + bg: "none", + _hover: activeStyles, + _focus: activeStyles, + variant: "ghost", + } + return ( + + + {isLink ? ( + - - ) : ( - <> - - - - - - )} - - - ) - })} - - + + ) : ( + <> + + + + + + )} + + + ) + })} + - + ) } diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 86a9a27c65a..448453cee38 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -6,7 +6,7 @@ import { Button } from "@/components/Buttons" import { SECTION_LABELS } from "@/lib/constants" -import type { LvlRefs, NavSections } from "../types" +import type { Level, LvlRefs, NavSections } from "../types" import LvlContent from "./LvlContent" @@ -25,6 +25,10 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { lvl3: useRef(null), } + const getLvlSx = (lvl: Level): BoxProps["sx"] => ({ + '&:has([data-state="open"])': { bg: menuColors.lvl[lvl].background }, + }) + return ( { bg: "menu.lvl2.background", }, '&:has(#lvl3 [data-state="open"])': { - bg: "menu.lvl3-background", + bg: "menu.lvl3.background", }, - div: { h: "full" }, }} > - + - - + + From 006b487e7b3c43c16142f05f3d4b150c597c09ab Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 8 Feb 2024 14:24:34 -0800 Subject: [PATCH 197/478] chore: clean up Nav/Mobile remove unused, update icon name --- src/components/Nav/Mobile.tsx | 73 ++++------------------------------- 1 file changed, 7 insertions(+), 66 deletions(-) diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index 963b22b9dce..e34b9118810 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -20,7 +20,6 @@ import { DrawerHeader, DrawerOverlay, Flex, - forwardRef, Grid, Heading, Icon, @@ -42,29 +41,6 @@ import LanguagePicker from "../LanguagePicker" import type { Level, NavItem, NavSections } from "./types" -const FooterItem = forwardRef((props, ref) => ( - -)) type FooterButtonProps = ButtonProps & { icon: IconType @@ -86,10 +62,10 @@ const FooterButton = ({ icon, ...props }: FooterButtonProps) => ( const FooterItemText = (props: ChildOnlyProp) => ( void -} - -const CloseButton = ({ onToggle, ...props }: CloseButtonProps) => { - const { t } = useTranslation("common") - return ( - - - - - - - } - {...props} - /> - ) -} - const expandedPathVariants = { closed: { d: "M12 7.875V17.125", @@ -207,7 +148,7 @@ const expandedPathVariants = { }, } -const OpenCloseIcon = ({ isOpen }: { isOpen: boolean }) => ( +const ExpandIcon = ({ isOpen }: { isOpen: boolean }) => ( ( + ) return ( @@ -292,7 +234,6 @@ const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => ( pe="4" py="4" > - - + Date: Thu, 8 Feb 2024 14:25:06 -0800 Subject: [PATCH 198/478] refactor: rm menu tokens, replace with hook --- src/@chakra-ui/semanticTokens.ts | 38 +---- src/components/Nav/Menu/ItemContent.tsx | 8 +- src/components/Nav/Menu/LvlContent.tsx | 12 +- src/components/Nav/Menu/index.tsx | 12 +- src/components/Nav/Mobile.tsx | 179 ++++++++++++------------ src/hooks/useNavMenuColors.ts | 46 ++++++ 6 files changed, 161 insertions(+), 134 deletions(-) create mode 100644 src/hooks/useNavMenuColors.ts diff --git a/src/@chakra-ui/semanticTokens.ts b/src/@chakra-ui/semanticTokens.ts index c2dc91afb26..9b81ae3c21a 100644 --- a/src/@chakra-ui/semanticTokens.ts +++ b/src/@chakra-ui/semanticTokens.ts @@ -96,37 +96,6 @@ const semanticTokens = { _light: "rgba(255, 255, 255, 0.80)", _dark: "rgba(34, 34, 34, 0.80)", }, - - // Menu - menu: { - stroke: { _light: "gray.200", _dark: "gray.600" }, - highlight: "primary.base", - active: "primary.highContrast", - lvl1: { - main: "body.base", - subtext: { _light: "gray.400", _dark: "gray.400" }, - background: { _light: "white", _dark: "black" }, - activeBackground: { _light: "gray.150", _dark: "gray.700" }, - }, - lvl2: { - main: "body.base", - subtext: { _light: "gray.400", _dark: "gray.300" }, - background: { _light: "gray.150", _dark: "gray.700" }, - activeBackground: { _light: "gray.200", _dark: "gray.600" }, - }, - lvl3: { - main: "body.base", - subtext: { _light: "gray.500", _dark: "gray.300" }, - background: { _light: "gray.200", _dark: "gray.600" }, - activeBackground: { _light: "gray.100", _dark: "gray.700" }, - }, - lvl4: { - main: "body.base", - subtext: { _light: "gray.700", _dark: "gray.300" }, - background: { _light: "gray.300", _dark: "gray.700" }, - activeBackground: { _light: "gray.200", _dark: "gray.800" }, - }, - } }, gradients: { bgMainGradient: { @@ -138,9 +107,10 @@ const semanticTokens = { }, shadows: { menu: { - accordion: "0px 2px 2px 0px rgba(0, 0, 0, 0.12) inset, 0px -3px 2px 0px rgba(0, 0, 0, 0.14) inset" - } - } + accordion: + "0px 2px 2px 0px rgba(0, 0, 0, 0.12) inset, 0px -3px 2px 0px rgba(0, 0, 0, 0.14) inset", + }, + }, } export default semanticTokens diff --git a/src/components/Nav/Menu/ItemContent.tsx b/src/components/Nav/Menu/ItemContent.tsx index c3ff3f69b48..80bf9654c22 100644 --- a/src/components/Nav/Menu/ItemContent.tsx +++ b/src/components/Nav/Menu/ItemContent.tsx @@ -5,6 +5,8 @@ import { cleanPath } from "@/lib/utils/url" import type { Level, NavItem } from "../types" +import { useNavMenuColors } from "@/hooks/useNavMenuColors" + type ItemProps = { item: NavItem lvl: Level @@ -13,6 +15,8 @@ type ItemProps = { const ItemContent = ({ item, lvl }: ItemProps) => { const { label, description, icon, ...action } = item const { asPath } = useRouter() + const menuColors = useNavMenuColors() + const isLink = "href" in action const isActivePage = isLink && cleanPath(asPath) === action.href @@ -20,13 +24,13 @@ const ItemContent = ({ item, lvl }: ItemProps) => { {label} {description} diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index dff652fc28f..f58a0cbd9ad 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -14,6 +14,8 @@ import type { Level, LvlRefs, NavItem } from "../types" import ItemContent from "./ItemContent" import NextChevron from "./NextChevron" +import { useNavMenuColors } from "@/hooks/useNavMenuColors" + type LvlContentProps = { lvl: Level refs: LvlRefs @@ -31,6 +33,8 @@ type LvlContentProps = { */ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { const { asPath } = useRouter() + const menuColors = useNavMenuColors() + if (lvl > 3) return null const pad = 4 @@ -48,12 +52,12 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { const activeStyles = { outline: "none", rounded: "md", - "p, svg": { color: "primary.base" }, - bg: `menu.lvl${lvl}.activeBackground`, + "p, svg": { color: menuColors.highlight }, + bg: menuColors.lvl[lvl].activeBackground, boxShadow: "none", } const buttonProps: ButtonProps = { - color: isActivePage ? "menu.active" : `menu.lvl${lvl}.main`, + color: isActivePage ? menuColors.active : menuColors.body, leftIcon: lvl === 1 && icon ? : undefined, rightIcon: isLink ? undefined : , position: "relative", @@ -75,7 +79,7 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { sx={{ '&:has(button[data-state="open"])': { roundedEnd: "none", - bg: `menu.lvl${lvl}.activeBackground`, + bg: menuColors.lvl[lvl].activeBackground, me: -pad, pe: pad, }, diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 448453cee38..4f828e5f898 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -10,6 +10,7 @@ import type { Level, LvlRefs, NavSections } from "../types" import LvlContent from "./LvlContent" +import { useNavMenuColors } from "@/hooks/useNavMenuColors" import { useRtlFlip } from "@/hooks/useRtlFlip" type NavMenuProps = BoxProps & { @@ -18,6 +19,7 @@ type NavMenuProps = BoxProps & { const Menu = ({ sections, ...props }: NavMenuProps) => { const { direction } = useRtlFlip() + const menuColors = useNavMenuColors() const refs: LvlRefs = { lvl1: useRef(null), @@ -73,21 +75,21 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { templateColumns="repeat(3, 1fr)" shadow="md" border="1px" - borderColor="menu.stroke" - bg="menu.lvl1.background" + borderColor={menuColors.stroke} + bg={menuColors.lvl[1].background} sx={{ '&:has(#lvl1 [data-state="open"])': { visibility: "visible", }, '&:has(#lvl2 [data-state="open"])': { - bg: "menu.lvl2.background", + bg: menuColors.lvl[2].background, }, '&:has(#lvl3 [data-state="open"])': { - bg: "menu.lvl3.background", + bg: menuColors.lvl[3].background, }, }} > - + diff --git a/src/components/Nav/Mobile.tsx b/src/components/Nav/Mobile.tsx index e34b9118810..1ecd0d94103 100644 --- a/src/components/Nav/Mobile.tsx +++ b/src/components/Nav/Mobile.tsx @@ -41,6 +41,7 @@ import LanguagePicker from "../LanguagePicker" import type { Level, NavItem, NavSections } from "./types" +import { useNavMenuColors } from "@/hooks/useNavMenuColors" type FooterButtonProps = ButtonProps & { icon: IconType @@ -175,98 +176,97 @@ type LvlAccordionProps = { onToggle: () => void } -const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => ( - - {items.map(({ label, description, ...actions }) => { - if ("href" in actions) +const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { + const menuColors = useNavMenuColors() + return ( + + {items.map(({ label, description, ...actions }) => { + if ("href" in actions) + return ( + + + + ) return ( - + + + + {label} + + + {description} + + + + + + + + + + )} ) - return ( - - {({ isExpanded }) => ( - <> - - - - - {label} - - - {description} - - - - - - - - - - )} - - ) - })} - -) + })} + + ) +} export type MobileNavMenuProps = ButtonProps & { isOpen: boolean @@ -292,6 +292,7 @@ const MobileNavMenu = ({ const ThemeIcon = useColorModeValue(MdBrightness2, MdWbSunny) const themeLabelKey = useColorModeValue("dark-mode", "light-mode") const isMenuOpen = !!useBreakpointValue({ base: isOpen, md: false }) + const menuColors = useNavMenuColors() return ( <> @@ -339,11 +340,11 @@ const MobileNavMenu = ({ <> - + +} + +export const useNavMenuColors = (): NavMenuColors => ({ + body: "body.base", + stroke: "body.light", + highlight: "primary.base", + active: "primary.highContrast", + lvl: { + 1: { + subtext: useColorModeValue("gray.400", "gray.400"), + background: useColorModeValue("white", "black"), + activeBackground: useColorModeValue("gray.150", "gray.700"), + }, + 2: { + subtext: useColorModeValue("gray.400", "gray.300"), + background: useColorModeValue("gray.150", "gray.700"), + activeBackground: useColorModeValue("gray.200", "gray.600"), + }, + 3: { + subtext: useColorModeValue("gray.500", "gray.300"), + background: useColorModeValue("gray.200", "gray.600"), + activeBackground: useColorModeValue("gray.100", "gray.700"), + }, + 4: { + subtext: useColorModeValue("gray.700", "gray.300"), + background: useColorModeValue("gray.300", "gray.700"), + activeBackground: useColorModeValue("gray.200", "gray.800"), + }, + }, +}) From b133f1625320fa0091cf0b8b1dc604838b86e793 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:07:07 -0800 Subject: [PATCH 199/478] feat: add matomo tracking for desktop nav --- src/components/Nav/Menu/LvlContent.tsx | 13 ++++++++++++- src/components/Nav/Menu/index.tsx | 13 ++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index f58a0cbd9ad..7cc9cc3add7 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -7,6 +7,7 @@ import * as Portal from "@radix-ui/react-portal" import { ButtonProps } from "@/components/Buttons" import Link from "@/components/Link" +import { trackCustomEvent } from "@/lib/utils/matomo" import { cleanPath } from "@/lib/utils/url" import type { Level, LvlRefs, NavItem } from "../types" @@ -88,7 +89,17 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { {isLink ? ( - diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 4f828e5f898..992560b3466 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -4,6 +4,8 @@ import * as NavigationMenu from "@radix-ui/react-navigation-menu" import { Button } from "@/components/Buttons" +import { trackCustomEvent } from "@/lib/utils/matomo" + import { SECTION_LABELS } from "@/lib/constants" import type { Level, LvlRefs, NavSections } from "../types" @@ -37,13 +39,22 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { dir={direction} orientation="horizontal" delayDuration={750} + onValueChange={(activeSection) => { + trackCustomEvent({ + eventCategory: "Desktop navigation menu", + eventAction: "Section changed", + eventName: activeSection + ? `Open section: ${activeSection}` + : "Menu closed", + }) + }} > {SECTION_LABELS.map((sectionKey) => { const { label, items } = sections[sectionKey] return ( - + - - ) - return ( - - {({ isExpanded }) => ( - <> - - - - - - {label} - - - {description} - - - - - - - - - - )} - - ) - })} - - ) -} - -export type MobileNavMenuProps = ButtonProps & { - isOpen: boolean - onToggle: () => void - toggleColorMode: () => void - toggleSearch: () => void - linkSections: NavSections - fromPageParameter: string - drawerContainerRef: RefObject -} - -const MobileNavMenu = ({ - isOpen, - onToggle, - toggleColorMode: toggleTheme, - toggleSearch, - linkSections, - fromPageParameter, - drawerContainerRef, - ...props -}: MobileNavMenuProps) => { - const { t } = useTranslation("common") - const ThemeIcon = useColorModeValue(MdBrightness2, MdWbSunny) - const themeLabelKey = useColorModeValue("dark-mode", "light-mode") - const isMenuOpen = !!useBreakpointValue({ base: isOpen, md: false }) - const menuColors = useNavMenuColors() - - return ( - <> - - - {/* DRAWER MENU */} - - - - - - - {t("site-title")} - - - {t("close")} - - - - {/* MAIN NAV CONTENTS OF MOBILE MENU */} - - - {SECTION_LABELS.map((key) => linkSections[key]).map( - ({ label, items }) => ( - - {({ isExpanded }) => ( - <> - - - - - {label} - - - - - - - - - )} - - ) - )} - - - - {/* FOOTER ELEMENTS: SEARCH, LIGHT/DARK, LANGUAGES */} - - - { - // Workaround to ensure the input for the search modal can have focus - onToggle() - toggleSearch() - }} - > - {t("search")} - - - {t(themeLabelKey)} - - - - {t("languages")} - - - - - - - - ) -} - -export default MobileNavMenu diff --git a/src/components/Nav/Mobile/ExpandIcon.tsx b/src/components/Nav/Mobile/ExpandIcon.tsx new file mode 100644 index 00000000000..50e2d3f2990 --- /dev/null +++ b/src/components/Nav/Mobile/ExpandIcon.tsx @@ -0,0 +1,40 @@ +import { motion } from "framer-motion" +import { Icon } from "@chakra-ui/react" + +const expandedPathVariants = { + closed: { + d: "M12 7.875V17.125", + transition: { duration: 0.1 }, + }, + open: { + d: "M12 12V12", + transition: { duration: 0.1 }, + }, +} + +type ExpandIconProps = { + isOpen: boolean +} + +const ExpandIcon = ({ isOpen }: ExpandIconProps) => ( + + + + +) + +export default ExpandIcon diff --git a/src/components/Nav/Mobile/FooterButton.tsx b/src/components/Nav/Mobile/FooterButton.tsx new file mode 100644 index 00000000000..12e49bdd01d --- /dev/null +++ b/src/components/Nav/Mobile/FooterButton.tsx @@ -0,0 +1,23 @@ +import type { IconType } from "react-icons" +import { type ButtonProps, Icon } from "@chakra-ui/react" + +import { Button } from "@/components/Buttons" + +type FooterButtonProps = ButtonProps & { + icon: IconType +} + +const FooterButton = ({ icon, ...props }: FooterButtonProps) => ( + + + ) + return ( + + {({ isExpanded }) => ( + <> + + + + + + {label} + + + {description} + + + + + + + + + + )} + + ) + })} + + ) +} + +export default LvlAccordion diff --git a/src/components/Nav/Mobile/MenuBody.tsx b/src/components/Nav/Mobile/MenuBody.tsx new file mode 100644 index 00000000000..41a3acc0d93 --- /dev/null +++ b/src/components/Nav/Mobile/MenuBody.tsx @@ -0,0 +1,84 @@ +import { + Accordion, + AccordionButton, + AccordionItem, + AccordionPanel, + Box, + DrawerBody, + Heading, +} from "@chakra-ui/react" + +import { SECTION_LABELS } from "@/lib/constants" + +import type { Level, NavSections } from "../types" + +import ExpandIcon from "./ExpandIcon" +import LvlAccordion from "./LvlAccordion" + +import { useNavMenuColors } from "@/hooks/useNavMenuColors" + +type MenuBodyProps = { + onToggle: () => void + linkSections: NavSections +} + +const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => { + const menuColors = useNavMenuColors() + + return ( + + + {SECTION_LABELS.map((key) => linkSections[key]).map( + ({ label, items }) => ( + + {({ isExpanded }) => ( + <> + + + + + {label} + + + + + + + + + )} + + ) + )} + + + ) +} + +export default MenuBody diff --git a/src/components/Nav/Mobile/MenuFooter.tsx b/src/components/Nav/Mobile/MenuFooter.tsx new file mode 100644 index 00000000000..1f653bb7e76 --- /dev/null +++ b/src/components/Nav/Mobile/MenuFooter.tsx @@ -0,0 +1,79 @@ +import { useTranslation } from "next-i18next" +import { BsTranslate } from "react-icons/bs" +import { MdBrightness2, MdSearch, MdWbSunny } from "react-icons/md" +import { + DrawerFooter, + Grid, + MenuButton, + useColorModeValue, +} from "@chakra-ui/react" + +import LanguagePicker from "@/components/LanguagePicker" + +import FooterButton from "./FooterButton" +import FooterItemText from "./FooterItemText" + +type MenuFooterProps = { + onToggle: () => void + toggleColorMode: () => void + toggleSearch: () => void +} + +const MenuFooter = ({ + onToggle, + toggleColorMode, + toggleSearch, +}: MenuFooterProps) => { + const { t } = useTranslation("common") + const ThemeIcon = useColorModeValue(MdBrightness2, MdWbSunny) + const themeLabelKey = useColorModeValue("dark-mode", "light-mode") + + return ( + + + { + // Workaround to ensure the input for the search modal can have focus + onToggle() + toggleSearch() + }} + > + {t("search")} + + + {t(themeLabelKey)} + + + + {t("languages")} + + + + + ) +} + +export default MenuFooter diff --git a/src/components/Nav/Mobile/MenuHeader.tsx b/src/components/Nav/Mobile/MenuHeader.tsx new file mode 100644 index 00000000000..baaa473d215 --- /dev/null +++ b/src/components/Nav/Mobile/MenuHeader.tsx @@ -0,0 +1,25 @@ +import { useTranslation } from "next-i18next" +import { DrawerCloseButton, DrawerHeader, Flex } from "@chakra-ui/react" + +const MenuHeader = () => { + const { t } = useTranslation("common") + + return ( + + + {t("site-title")} + + + {t("close")} + + + ) +} + +export default MenuHeader diff --git a/src/components/Nav/Mobile/index.tsx b/src/components/Nav/Mobile/index.tsx new file mode 100644 index 00000000000..06507962fef --- /dev/null +++ b/src/components/Nav/Mobile/index.tsx @@ -0,0 +1,72 @@ +import type { RefObject } from "react" +import { + type ButtonProps, + Drawer, + DrawerContent, + DrawerOverlay, + useBreakpointValue, +} from "@chakra-ui/react" + +import type { NavSections } from "../types" + +import HamburgerButton from "./HamburgerButton" +import MenuBody from "./MenuBody" +import MenuFooter from "./MenuFooter" +import MenuHeader from "./MenuHeader" + +type MobileNavMenuProps = ButtonProps & { + isOpen: boolean + onToggle: () => void + toggleColorMode: () => void + toggleSearch: () => void + linkSections: NavSections + fromPageParameter: string + drawerContainerRef: RefObject +} + +const MobileNavMenu = ({ + isOpen, + onToggle, + toggleColorMode, + toggleSearch, + linkSections, + fromPageParameter, + drawerContainerRef, + ...props +}: MobileNavMenuProps) => { + const isMenuOpen = useBreakpointValue({ base: isOpen, md: false }) as boolean + + return ( + <> + + + {/* DRAWER MENU */} + + + + + {/* HEADER ELEMENTS: SITE NAME, CLOSE BUTTON */} + + + {/* MAIN NAV ACCORDION CONTENTS OF MOBILE MENU */} + + + {/* FOOTER ELEMENTS: SEARCH, LIGHT/DARK, LANGUAGES */} + + + + + ) +} + +export default MobileNavMenu From 65be4f4f9f6014e27d4bf60fb55924bace7eed20 Mon Sep 17 00:00:00 2001 From: Yash Jagtap Date: Fri, 9 Feb 2024 00:10:31 +0000 Subject: [PATCH 201/478] [fix] rename footer hyperlink --- src/components/Footer.tsx | 2 +- src/intl/en/common.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 0dd81c711dd..8865f9e2c04 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -284,7 +284,7 @@ const Footer = ({ lastDeployDate }: FooterProps) => { }, { to: "mailto:press@ethereum.org", - text: t("contact"), + text: t("press-contact"), }, ], }, diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 2776770d91c..1a33e4a9eb5 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -157,6 +157,7 @@ "page-last-updated": "Page last updated", "pbs": "Proposer-builder separation", "pools": "Pooled staking", + "press-contact": "Press Contact", "privacy-policy": "Privacy policy", "private-ethereum": "Private Ethereum", "product-disclaimer": "Products and services are listed as a convenience for the Ethereum community. Inclusion of a product or service does not represent an endorsement from the ethereum.org website team, or the Ethereum Foundation.", From 05022b65f146b4bfaba6914e24fe06213138a93e Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 8 Feb 2024 16:31:39 -0800 Subject: [PATCH 202/478] feat: add matomo tracking to mobile nav menu --- src/components/Nav/Mobile/LvlAccordion.tsx | 20 +++++++++++++++++++- src/components/Nav/Mobile/MenuBody.tsx | 11 +++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/Mobile/LvlAccordion.tsx b/src/components/Nav/Mobile/LvlAccordion.tsx index 1a890a99a54..aaf8b9f58d5 100644 --- a/src/components/Nav/Mobile/LvlAccordion.tsx +++ b/src/components/Nav/Mobile/LvlAccordion.tsx @@ -12,6 +12,8 @@ import { import { BaseLink } from "@/components/Link" +import { trackCustomEvent } from "@/lib/utils/matomo" + import type { Level, NavItem } from "../types" import ExpandIcon from "./ExpandIcon" @@ -37,7 +39,6 @@ const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { as={BaseLink} w="full" href={actions.href} - onClick={onToggle} variant="ghost" borderRadius="none" borderColor={menuColors.stroke} @@ -48,6 +49,14 @@ const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { _hover={{ color: menuColors.highlight, }} + onClick={() => { + trackCustomEvent({ + eventCategory: "Mobile navigation menu", + eventAction: `Follow level ${lvl - 1} link`, + eventName: actions.href!, + }) + onToggle() + }} > @@ -73,6 +82,15 @@ const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { color={menuColors.body} py="0" borderColor={menuColors.stroke} + onClick={() => { + trackCustomEvent({ + eventCategory: "Mobile navigation menu", + eventAction: `Level ${lvl - 1} section changed`, + eventName: `${ + isExpanded ? "Close" : "Open" + } section: ${label} - ${description.slice(0, 16)}...`, + }) + }} > { } borderBottom={isExpanded ? "1px" : "none"} borderColor="disabled" + onClick={() => { + trackCustomEvent({ + eventCategory: "Mobile navigation menu", + eventAction: "Section changed", + eventName: `${ + isExpanded ? "Close" : "Open" + } section: ${label}`, + }) + }} > Date: Fri, 9 Feb 2024 08:51:10 +0000 Subject: [PATCH 203/478] added Sage Design system to the list --- public/content/developers/docs/design-and-ux/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/public/content/developers/docs/design-and-ux/index.md b/public/content/developers/docs/design-and-ux/index.md index aa6f11b259c..31622f3993b 100644 --- a/public/content/developers/docs/design-and-ux/index.md +++ b/public/content/developers/docs/design-and-ux/index.md @@ -83,6 +83,7 @@ Get involved in professional community-driven organizations or join design group - [Ethereum.org Design system](https://www.figma.com/@ethdotorg) (Figma) - [Finity, a design system by Polygon](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma) - [Kleros Design System](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma) +- [Safe Design System](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma) - [ENS Design system](https://thorin.ens.domains/) - [Mirror Design System](https://degen-xyz.vercel.app/) From 6ec20cf3ef79cd579ecb25d95c719706e6527259 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 9 Feb 2024 07:33:42 -0800 Subject: [PATCH 204/478] fix: top nav spacing fixes empty space for deprecated developers sub-nav --- src/@chakra-ui/foundations/spacing.ts | 2 +- src/components/Nav/Menu/index.tsx | 2 +- src/components/SideNav.tsx | 2 +- src/components/TableOfContents/index.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/@chakra-ui/foundations/spacing.ts b/src/@chakra-ui/foundations/spacing.ts index 0a8832ced03..6f5271b1c7a 100644 --- a/src/@chakra-ui/foundations/spacing.ts +++ b/src/@chakra-ui/foundations/spacing.ts @@ -1,7 +1,7 @@ const spacing = { 7.5: "1.875rem", 10.5: "2.625rem", - 16.5: "4.75rem", // Nav height + 19: "4.75rem", // Nav height } export default spacing diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 992560b3466..78f4f7c18b9 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -81,7 +81,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { { Date: Fri, 9 Feb 2024 16:26:30 +0000 Subject: [PATCH 205/478] Update Crowdin translation progress --- src/data/translationProgress.json | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index 6ad4311983f..ed8a4f15a86 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -51,7 +51,7 @@ { "languageId": "bn", "words": { - "approved": 36077, + "approved": 36290, "total": 340006 } }, @@ -72,14 +72,14 @@ { "languageId": "ca", "words": { - "approved": 19651, + "approved": 19660, "total": 340006 } }, { "languageId": "cs", "words": { - "approved": 26515, + "approved": 27148, "total": 340006 } }, @@ -100,7 +100,7 @@ { "languageId": "el", "words": { - "approved": 102339, + "approved": 104171, "total": 340006 } }, @@ -114,7 +114,7 @@ { "languageId": "es-EM", "words": { - "approved": 318593, + "approved": 321408, "total": 340006 } }, @@ -163,7 +163,7 @@ { "languageId": "fr", "words": { - "approved": 334953, + "approved": 335594, "total": 340006 } }, @@ -205,7 +205,7 @@ { "languageId": "hi", "words": { - "approved": 57405, + "approved": 58038, "total": 340006 } }, @@ -233,7 +233,7 @@ { "languageId": "id", "words": { - "approved": 155502, + "approved": 159748, "total": 340006 } }, @@ -261,7 +261,7 @@ { "languageId": "ka", "words": { - "approved": 1434, + "approved": 2067, "total": 340006 } }, @@ -275,7 +275,7 @@ { "languageId": "km", "words": { - "approved": 15612, + "approved": 16245, "total": 340006 } }, @@ -338,7 +338,7 @@ { "languageId": "ml-IN", "words": { - "approved": 11316, + "approved": 11320, "total": 340006 } }, @@ -352,7 +352,7 @@ { "languageId": "mr", "words": { - "approved": 25900, + "approved": 26533, "total": 340006 } }, @@ -380,7 +380,7 @@ { "languageId": "nl", "words": { - "approved": 37358, + "approved": 37419, "total": 340006 } }, @@ -408,28 +408,28 @@ { "languageId": "pcm", "words": { - "approved": 17163, + "approved": 17604, "total": 340006 } }, { "languageId": "pl", "words": { - "approved": 93928, + "approved": 94561, "total": 340006 } }, { "languageId": "pt-BR", "words": { - "approved": 317914, + "approved": 318547, "total": 340006 } }, { "languageId": "pt-PT", "words": { - "approved": 26010, + "approved": 26034, "total": 340006 } }, @@ -443,7 +443,7 @@ { "languageId": "ru", "words": { - "approved": 96401, + "approved": 97034, "total": 340006 } }, @@ -513,7 +513,7 @@ { "languageId": "sw", "words": { - "approved": 16508, + "approved": 16612, "total": 340006 } }, @@ -541,7 +541,7 @@ { "languageId": "th", "words": { - "approved": 5936, + "approved": 6569, "total": 340006 } }, @@ -569,14 +569,14 @@ { "languageId": "tr", "words": { - "approved": 320257, + "approved": 320890, "total": 340006 } }, { "languageId": "uk", "words": { - "approved": 64387, + "approved": 64984, "total": 340006 } }, @@ -597,7 +597,7 @@ { "languageId": "uz", "words": { - "approved": 1863, + "approved": 2495, "total": 340006 } }, @@ -618,14 +618,14 @@ { "languageId": "zh-CN", "words": { - "approved": 303699, + "approved": 304538, "total": 340006 } }, { "languageId": "zh-TW", "words": { - "approved": 110743, + "approved": 111416, "total": 340006 } }, From 00613de1237fae3087d330cc9b77b1a76c4a8418 Mon Sep 17 00:00:00 2001 From: Yash Jagtap Date: Fri, 9 Feb 2024 17:08:37 +0000 Subject: [PATCH 206/478] [fix] update contact --- src/components/Footer.tsx | 2 +- src/intl/en/common.json | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx index 8865f9e2c04..0dd81c711dd 100644 --- a/src/components/Footer.tsx +++ b/src/components/Footer.tsx @@ -284,7 +284,7 @@ const Footer = ({ lastDeployDate }: FooterProps) => { }, { to: "mailto:press@ethereum.org", - text: t("press-contact"), + text: t("contact"), }, ], }, diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 1a33e4a9eb5..c95c26e1487 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -21,7 +21,7 @@ "community": "Community", "community-hub": "Community hub", "community-menu": "Community Menu", - "contact": "Contact", + "contact": "Press Contact", "content-buckets": "Content Buckets", "content-resources": "Content Resources", "content-standardization": "Content standardization", @@ -157,7 +157,6 @@ "page-last-updated": "Page last updated", "pbs": "Proposer-builder separation", "pools": "Pooled staking", - "press-contact": "Press Contact", "privacy-policy": "Privacy policy", "private-ethereum": "Private Ethereum", "product-disclaimer": "Products and services are listed as a convenience for the Ethereum community. Inclusion of a product or service does not represent an endorsement from the ethereum.org website team, or the Ethereum Foundation.", From b68cfe943af9a0ff4335174aa993122d5cb2e298 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Fri, 9 Feb 2024 19:43:26 +0100 Subject: [PATCH 207/478] remove error thrown in isLangRightToLeft function since now we have a fake locale that doesn't exist in the i18nconfig file --- src/lib/utils/translations.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/translations.ts b/src/lib/utils/translations.ts index 2b175c69c04..ea43344c497 100644 --- a/src/lib/utils/translations.ts +++ b/src/lib/utils/translations.ts @@ -12,8 +12,9 @@ export const languages: Languages = i18nConfig.reduce((result, config) => { export const isLangRightToLeft = (lang: Lang): boolean => { const langConfig = i18nConfig.filter((language) => language.code === lang) - if (!langConfig.length) - throw new Error("Language code not found in isLangRightToLeft") + if (!langConfig.length) { + return false + } return langConfig[0].langDir === "rtl" } From 2a010c295379963817b5b79f61bbc210efa7a826 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Fri, 9 Feb 2024 19:48:25 +0100 Subject: [PATCH 208/478] revert changes made in next config file --- next.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/next.config.js b/next.config.js index 3afc1bf5ffc..2223e7718aa 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,6 @@ const { PHASE_DEVELOPMENT_SERVER } = require("next/constants") -const i18n = require("./next-i18next.config") +const { i18n } = require("./next-i18next.config") const LIMIT_CPUS = Number(process.env.LIMIT_CPUS || 2) @@ -33,7 +33,7 @@ module.exports = (phase, { defaultConfig }) => { return config }, - ...i18n, + i18n, trailingSlash: true, images: { deviceSizes: [640, 750, 828, 1080, 1200, 1504, 1920], From a1b2bc93fb4a31db8971d3850b722c12c29fae3c Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Fri, 9 Feb 2024 19:48:39 +0100 Subject: [PATCH 209/478] define constant for the fake locale --- src/lib/constants.ts | 1 + src/lib/utils/translations.ts | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 5caae99081f..6efa2792b78 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -11,6 +11,7 @@ export const INTL_JSON_DIR = "src/intl" // i18n export const DEFAULT_LOCALE = "en" +export const FAKE_LOCALE = "default" // Sorted list of supported locales codes, defined in `i18n.config.json` const BUILD_LOCALES = process.env.BUILD_LOCALES export const LOCALES_CODES = BUILD_LOCALES diff --git a/src/lib/utils/translations.ts b/src/lib/utils/translations.ts index ea43344c497..c15c4b7ee17 100644 --- a/src/lib/utils/translations.ts +++ b/src/lib/utils/translations.ts @@ -1,6 +1,6 @@ import { Lang, Languages } from "@/lib/types" -import { DEFAULT_LOCALE } from "@/lib/constants" +import { DEFAULT_LOCALE, FAKE_LOCALE } from "@/lib/constants" import i18nConfig from "../../../i18n.config.json" @@ -20,7 +20,7 @@ export const isLangRightToLeft = (lang: Lang): boolean => { } export const filterFakedLocales = (locales: string[] | undefined) => { - return locales?.filter((locale) => locale !== "default") || [] + return locales?.filter((locale) => locale !== FAKE_LOCALE) || [] } // Overwrites the default Persian numbering of the Farsi language to use Hindu-Arabic numerals (0-9) From 6b3dc7c4e47749572d7015ad71d486249aa2527b Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Fri, 9 Feb 2024 19:53:34 +0100 Subject: [PATCH 210/478] use defined constants --- src/middleware.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index de894a9b431..6a0b81dfcbf 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,5 +1,7 @@ import { NextRequest, NextResponse } from "next/server" +import { DEFAULT_LOCALE, FAKE_LOCALE } from "./lib/constants" + const PUBLIC_FILE = /\.(.*)$/ export async function middleware(req: NextRequest) { @@ -11,8 +13,9 @@ export async function middleware(req: NextRequest) { return } - if (req.nextUrl.locale === "default") { - console.log(`/en${req.nextUrl.pathname}`) - return NextResponse.redirect(new URL(`/en${req.nextUrl.pathname}`, req.url)) + if (req.nextUrl.locale === FAKE_LOCALE) { + return NextResponse.redirect( + new URL(`/${DEFAULT_LOCALE}${req.nextUrl.pathname}`, req.url) + ) } } From 3c4a155f53b0c6ce763d0212fc11a91d5cce445f Mon Sep 17 00:00:00 2001 From: titanism <101466223+titanism@users.noreply.github.com> Date: Fri, 9 Feb 2024 19:14:10 -0600 Subject: [PATCH 211/478] fix: removed skiff (defunct and shutting down in 6 months) You should remove Skiff since they are defunct and shutting down service in 6 months. See . --- src/pages/dapps.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/pages/dapps.tsx b/src/pages/dapps.tsx index 05e8891e955..4fa2dbb40cc 100644 --- a/src/pages/dapps.tsx +++ b/src/pages/dapps.tsx @@ -101,7 +101,6 @@ import rotki from "@/public/dapps/rotki.png" import rubic from "@/public/dapps/rubic.png" import sablier from "@/public/dapps/sablier.png" import set from "@/public/dapps/set.png" -import skiff from "@/public/dapps/skiff.png" import spatial from "@/public/dapps/spatial.png" import spruce from "@/public/dapps/spruce.png" import dai from "@/public/dapps/stabledai.png" @@ -1139,13 +1138,6 @@ const DappsPage = () => { image: xmtp, alt: t("page-dapps-xmtp-logo-alt"), }, - { - title: "Skiff", - description: t("page-dapps-dapp-description-skiff"), - link: "https://skiff.com/", - image: skiff, - alt: t("page-dapps-skiff-logo-alt"), - }, ] const identity = [ From 5cfed0ce1f150e63052ad005303bca664028f3d5 Mon Sep 17 00:00:00 2001 From: aslikaya Date: Sat, 10 Feb 2024 16:21:46 +0300 Subject: [PATCH 212/478] Update eth2book link When we go to the book's current link, it says this version is old and provides a newer version link so it is updated to the newer version. --- .../docs/consensus-mechanisms/pos/attestations/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/developers/docs/consensus-mechanisms/pos/attestations/index.md index 78a35ca1d7d..518607faa21 100644 --- a/public/content/developers/docs/consensus-mechanisms/pos/attestations/index.md +++ b/public/content/developers/docs/consensus-mechanisms/pos/attestations/index.md @@ -87,6 +87,6 @@ Note that in some cases a lucky aggregator may also become the block proposer. I ## Further reading {#further-reading} - [Attestations in Vitalik's annotated consensus spec](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) -- [Attestations in eth2book.info](https://eth2book.info/altair/part3/containers/dependencies#attestationdata) +- [Attestations in eth2book.info](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) _Know of a community resource that helped you? Edit this page and add it!_ From 56b95b9e54e79423d2994b7a961751f17c78887b Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 11 Feb 2024 01:38:42 +0000 Subject: [PATCH 213/478] Update Crowdin contributors --- src/data/crowdin/combined-translators.json | 3014 +++++++++-------- .../crowdin/translation-buckets-dirs.json | 4 + 2 files changed, 1589 insertions(+), 1429 deletions(-) diff --git a/src/data/crowdin/combined-translators.json b/src/data/crowdin/combined-translators.json index 2d03bd03160..a7d57820431 100644 --- a/src/data/crowdin/combined-translators.json +++ b/src/data/crowdin/combined-translators.json @@ -8,7 +8,7 @@ { "id": 15567971, "username": "HASANTAHHAN", - "totalCosts": 988.79, + "totalCosts": 981.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15567971/medium/82c26b32ac2312ed1fbb253a222ec9e1.jpg" }, { @@ -67,7 +67,7 @@ { "id": 15567971, "username": "HASANTAHHAN", - "totalCosts": 2145.24, + "totalCosts": 2130.09, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15567971/medium/82c26b32ac2312ed1fbb253a222ec9e1.jpg" }, { @@ -79,7 +79,7 @@ { "id": 15760865, "username": "alhafadi37", - "totalCosts": 11.11, + "totalCosts": 9.09, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15760865/medium/f2956dd1958055433d32ecc065cf4e5e.png" } ] @@ -329,13 +329,13 @@ { "id": 15503382, "username": "mohammedE22", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15503382/medium/b5e1fa8943e236c07bbe459d92d23dcb.png" }, { "id": 15567971, "username": "HASANTAHHAN", - "totalCosts": 91.91, + "totalCosts": 77.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15567971/medium/82c26b32ac2312ed1fbb253a222ec9e1.jpg" }, { @@ -449,13 +449,13 @@ { "id": 15956561, "username": "taxir.abjadao", - "totalCosts": 948.39, + "totalCosts": 944.35, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15956561/medium/d3c5967663d9190fbf70f6b62b29ffd5.jpeg" }, { "id": 15808721, "username": "fahadanizi", - "totalCosts": 720.13, + "totalCosts": 716.09, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15808721/medium/a0fd95274585fea89c0735c63f60a0b1.png" } ] @@ -466,13 +466,13 @@ { "id": 15956561, "username": "taxir.abjadao", - "totalCosts": 1975.56, + "totalCosts": 1973.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15956561/medium/d3c5967663d9190fbf70f6b62b29ffd5.jpeg" }, { "id": 15808721, "username": "fahadanizi", - "totalCosts": 1860.42, + "totalCosts": 1858.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15808721/medium/a0fd95274585fea89c0735c63f60a0b1.png" }, { @@ -534,7 +534,7 @@ { "id": 14787370, "username": "agulani", - "totalCosts": 1358.45, + "totalCosts": 1344.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14787370/medium/9bb8a2d0d244e04f14b523e895b08100.jpg" } ] @@ -603,7 +603,7 @@ { "id": 15954257, "username": "arifulone", - "totalCosts": 1357.44, + "totalCosts": 1346.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954257/medium/a836f4b9acb6585087ed674cb6b3b77e.jpg" } ] @@ -614,7 +614,7 @@ { "id": 15954257, "username": "arifulone", - "totalCosts": 2182.61, + "totalCosts": 2167.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954257/medium/a836f4b9acb6585087ed674cb6b3b77e.jpg" } ] @@ -636,7 +636,7 @@ { "id": 15954257, "username": "arifulone", - "totalCosts": 1642.26, + "totalCosts": 1613.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954257/medium/a836f4b9acb6585087ed674cb6b3b77e.jpg" } ] @@ -669,7 +669,7 @@ { "id": 15954257, "username": "arifulone", - "totalCosts": 718.11, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954257/medium/a836f4b9acb6585087ed674cb6b3b77e.jpg" } ] @@ -713,7 +713,7 @@ { "id": 15954257, "username": "arifulone", - "totalCosts": 958.49, + "totalCosts": 954.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954257/medium/a836f4b9acb6585087ed674cb6b3b77e.jpg" } ] @@ -724,7 +724,7 @@ { "id": 15954257, "username": "arifulone", - "totalCosts": 2059.39, + "totalCosts": 2057.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954257/medium/a836f4b9acb6585087ed674cb6b3b77e.jpg" } ] @@ -813,7 +813,7 @@ { "id": 14643068, "username": "egelizo", - "totalCosts": 520.15, + "totalCosts": 496.92, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14643068/medium/f6f25b4f0e429a11e235ade8d866b314.jpeg" } ] @@ -898,7 +898,7 @@ { "id": 14643068, "username": "egelizo", - "totalCosts": 1569.54, + "totalCosts": 1563.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14643068/medium/f6f25b4f0e429a11e235ade8d866b314.jpeg" }, { @@ -1042,6 +1042,12 @@ "username": "Adasovec", "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880416/medium/3967eaff6d735a5983f60115a12cf7ab_default.png" + }, + { + "id": 15843833, + "username": "FoltinV", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15843833/medium/d9afa5c66a59b8166143dd4e1cca0630.jpeg" } ] }, @@ -1068,7 +1074,7 @@ { "id": 15843833, "username": "FoltinV", - "totalCosts": 2185.64, + "totalCosts": 2184.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15843833/medium/d9afa5c66a59b8166143dd4e1cca0630.jpeg" }, { @@ -1085,7 +1091,7 @@ { "id": 15843833, "username": "FoltinV", - "totalCosts": 2805.78, + "totalCosts": 2807.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15843833/medium/d9afa5c66a59b8166143dd4e1cca0630.jpeg" }, { @@ -1108,13 +1114,13 @@ { "id": 15086733, "username": "hedwika", - "totalCosts": 1491.77, + "totalCosts": 1463.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15086733/medium/e58bffb1edb2cd4a9e2bbe7046a0d1e8.jpeg" }, { "id": 15843833, "username": "FoltinV", - "totalCosts": 325.22, + "totalCosts": 354.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15843833/medium/d9afa5c66a59b8166143dd4e1cca0630.jpeg" } ] @@ -1136,19 +1142,19 @@ { "id": 15086733, "username": "hedwika", - "totalCosts": 598.93, + "totalCosts": 590.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15086733/medium/e58bffb1edb2cd4a9e2bbe7046a0d1e8.jpeg" }, { "id": 15843833, "username": "FoltinV", - "totalCosts": 71.71, + "totalCosts": 69.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15843833/medium/d9afa5c66a59b8166143dd4e1cca0630.jpeg" }, { "id": 15188556, "username": "korinektomas", - "totalCosts": 25.25, + "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15188556/medium/ede830d725802daea8fd2fa53e0ae952.png" } ] @@ -1181,13 +1187,13 @@ { "id": 15185884, "username": "carmen1912", - "totalCosts": 409.05, + "totalCosts": 402.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, { "id": 15810863, "username": "bitblondy", - "totalCosts": 124.23, + "totalCosts": 72.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15810863/medium/36dab07f1a377151348d57285a7955f7_default.png" }, { @@ -1361,7 +1367,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 470.66, + "totalCosts": 447.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -1591,13 +1597,13 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 669.63, + "totalCosts": 643.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { "id": 15189582, "username": "Mainnesti", - "totalCosts": 159.58, + "totalCosts": 155.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15189582/medium/607fd2e858dc07184c9200683f906fdb.jpg" }, { @@ -1667,7 +1673,7 @@ { "id": 15421538, "username": "johannt", - "totalCosts": 1419.05, + "totalCosts": 1403.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15421538/medium/7e1f5d90509951072c0de0d9684baa35.png" }, { @@ -1737,13 +1743,13 @@ { "id": 15707609, "username": "RvonRoit", - "totalCosts": 1342.29, + "totalCosts": 1314.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15707609/medium/79e71a64e2766240d93e42ed8730852d_default.png" }, { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 373.7, + "totalCosts": 371.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -1860,7 +1866,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 1111, + "totalCosts": 1101.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -2350,7 +2356,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 1162.51, + "totalCosts": 1152.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -2396,13 +2402,13 @@ { "id": 15810863, "username": "bitblondy", - "totalCosts": 1960.41, + "totalCosts": 1946.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15810863/medium/36dab07f1a377151348d57285a7955f7_default.png" }, { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 69.69, + "totalCosts": 83.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -2431,7 +2437,7 @@ { "id": 15932515, "username": "Astronaut828", - "totalCosts": 3084.54, + "totalCosts": 3069.39, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932515/medium/ff4f1f9efa429e626e53821ae26ecf21.png" }, { @@ -2454,7 +2460,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 3908.7, + "totalCosts": 3907.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -2518,7 +2524,7 @@ { "id": 13959389, "username": "inlak16", - "totalCosts": 124.23, + "totalCosts": 113.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13959389/medium/8163669279ee4bd20f4b7db97f6000fa.png" }, { @@ -2693,7 +2699,7 @@ { "id": 15082843, "username": "StevenR73", - "totalCosts": 241.39, + "totalCosts": 230.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082843/medium/9bd744aeb105dfeb6c55c0a7bb68a51e.jpeg" }, { @@ -2833,7 +2839,7 @@ { "id": 13959389, "username": "inlak16", - "totalCosts": 1200.89, + "totalCosts": 1173.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13959389/medium/8163669279ee4bd20f4b7db97f6000fa.png" }, { @@ -2851,7 +2857,7 @@ { "id": 14734372, "username": "translator-543216", - "totalCosts": 123.22, + "totalCosts": 122.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14734372/medium/ef5b9432ae79b613339ccead9ccea82c_default.png" } ] @@ -3123,7 +3129,7 @@ { "id": 14723446, "username": "DoGame5", - "totalCosts": 253.51, + "totalCosts": 248.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14723446/medium/7dacda0b245cc793a6e0f617b699b92a.png" }, { @@ -3164,13 +3170,13 @@ { "id": 14842386, "username": "rxchard", - "totalCosts": 363.6, + "totalCosts": 358.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14842386/medium/26d2e5d1d9b5f0e6ec25878feb24840b.jpeg" }, { "id": 15048483, "username": "Slated", - "totalCosts": 283.81, + "totalCosts": 281.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15048483/medium/3fc191d4ae2e76bab01bcff3839d030a.jpeg" }, { @@ -3272,18 +3278,18 @@ "totalCosts": 188.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221766/medium/9818a6f07e95c5f3260f34774d4e26fe.jpg" }, + { + "id": 15123193, + "username": "Coram_Deo", + "totalCosts": 67.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" + }, { "id": 13959389, "username": "inlak16", "totalCosts": 65.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13959389/medium/8163669279ee4bd20f4b7db97f6000fa.png" }, - { - "id": 15123193, - "username": "Coram_Deo", - "totalCosts": 54.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" - }, { "id": 15185884, "username": "carmen1912", @@ -3760,7 +3766,7 @@ { "id": 15047729, "username": "EricTheTurtle", - "totalCosts": 68.68, + "totalCosts": 62.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15047729/medium/705657a47d8515302fce11fdaf1e1081.png" }, { @@ -3916,18 +3922,18 @@ "totalCosts": 70.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, - { - "id": 15547721, - "username": "AmazinglyComfortableCat.eth", - "totalCosts": 65.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15547721/medium/93b66b37088b4e29cd828691e8eeaa88.png" - }, { "id": 14707408, "username": "Just-Stev", "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14707408/medium/06bb638d445604925d0bcaa58768558b.png" }, + { + "id": 15547721, + "username": "AmazinglyComfortableCat.eth", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15547721/medium/93b66b37088b4e29cd828691e8eeaa88.png" + }, { "id": 14546284, "username": "ladidan", @@ -3942,13 +3948,13 @@ { "id": 15932515, "username": "Astronaut828", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932515/medium/ff4f1f9efa429e626e53821ae26ecf21.png" }, { "id": 15221766, "username": "chrboesch", - "totalCosts": 89.89, + "totalCosts": 79.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15221766/medium/9818a6f07e95c5f3260f34774d4e26fe.jpg" }, { @@ -4023,7 +4029,7 @@ { "id": 15302370, "username": "Manusxb", - "totalCosts": 208.06, + "totalCosts": 204.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15302370/medium/9f944ffeaa451f3c2ea156478533b41f_default.png" }, { @@ -4069,7 +4075,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 3218.87, + "totalCosts": 3194.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -4178,7 +4184,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 813.05, + "totalCosts": 827.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -4214,7 +4220,7 @@ { "id": 15116307, "username": "Gorm-the-Old", - "totalCosts": 17.17, + "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15116307/medium/46b6a030b92eb4909c82bcc68026e4eb_default.png" }, { @@ -4336,7 +4342,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 402.99, + "totalCosts": 401.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -4505,13 +4511,13 @@ { "id": 15189582, "username": "Mainnesti", - "totalCosts": 656.5, + "totalCosts": 499.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15189582/medium/607fd2e858dc07184c9200683f906fdb.jpg" }, { "id": 13040371, "username": "Mario_Oettler", - "totalCosts": 398.95, + "totalCosts": 325.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13040371/medium/715a3c54d2c935cd55f8fc46b319ede4_default.png" }, { @@ -4865,7 +4871,7 @@ { "id": 15402842, "username": "Craisb", - "totalCosts": 1723.06, + "totalCosts": 1721.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15402842/medium/ff63192dd995e88e0c9e3fe60b787aaa_default.png" }, { @@ -4975,7 +4981,7 @@ { "id": 15123193, "username": "Coram_Deo", - "totalCosts": 1808.91, + "totalCosts": 1796.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123193/medium/b3211607cc43c707c0034f7502299d8d.jpeg" }, { @@ -5066,7 +5072,7 @@ { "id": 15810863, "username": "bitblondy", - "totalCosts": 133.32, + "totalCosts": 130.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15810863/medium/36dab07f1a377151348d57285a7955f7_default.png" } ] @@ -5144,7 +5150,7 @@ { "id": 13959389, "username": "inlak16", - "totalCosts": 1270.58, + "totalCosts": 1240.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13959389/medium/8163669279ee4bd20f4b7db97f6000fa.png" }, { @@ -5172,7 +5178,7 @@ { "id": 15421538, "username": "johannt", - "totalCosts": 1983.64, + "totalCosts": 1978.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15421538/medium/7e1f5d90509951072c0de0d9684baa35.png" }, { @@ -5228,7 +5234,7 @@ { "id": 15810863, "username": "bitblondy", - "totalCosts": 681.75, + "totalCosts": 668.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15810863/medium/36dab07f1a377151348d57285a7955f7_default.png" } ] @@ -5441,7 +5447,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 604.99, + "totalCosts": 581.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" }, { @@ -5521,7 +5527,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 1673.57, + "totalCosts": 1671.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" } ] @@ -5532,7 +5538,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 616.1, + "totalCosts": 597.92, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" }, { @@ -5599,7 +5605,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 657.51, + "totalCosts": 658.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" } ] @@ -5632,7 +5638,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 603.98, + "totalCosts": 573.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" } ] @@ -5693,7 +5699,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 966.57, + "totalCosts": 962.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" } ] @@ -5704,7 +5710,7 @@ { "id": 14568334, "username": "mr_giorgos", - "totalCosts": 2005.86, + "totalCosts": 2001.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg" }, { @@ -5743,7 +5749,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 597.92, + "totalCosts": 540.35, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -5799,18 +5805,18 @@ "totalCosts": 27.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" }, - { - "id": 15490162, - "username": "Mathewvizc7", - "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15490162/medium/ee6f672ba75de903b8f7bffb3be4773d_default.png" - }, { "id": 15150468, "username": "estebandidonft", "totalCosts": 18.18, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15150468/medium/4d44fae782af9bd5e371ce94ffa585c9.jpeg" }, + { + "id": 15490162, + "username": "Mathewvizc7", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15490162/medium/ee6f672ba75de903b8f7bffb3be4773d_default.png" + }, { "id": 14611076, "username": "davidperalta", @@ -6274,13 +6280,13 @@ { "id": 15500572, "username": "aspoky_dev", - "totalCosts": 593.88, + "totalCosts": 582.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15500572/medium/82f4c4ed41642c9eab1d510f97122467.jpg" }, { "id": 15085311, "username": "bunturx", - "totalCosts": 484.8, + "totalCosts": 463.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" }, { @@ -6309,7 +6315,7 @@ { "id": 15511756, "username": "Daniela-Camacho-Villalobo-110198", - "totalCosts": 178.77, + "totalCosts": 175.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15511756/medium/513599bdff63b6d935fa6d4fc6cca119_default.png" }, { @@ -6321,7 +6327,7 @@ { "id": 15538393, "username": "ballesterosliliana70", - "totalCosts": 133.32, + "totalCosts": 128.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15538393/medium/d8116baf1e8920a2369fb749f235586b.jpeg" }, { @@ -6368,7 +6374,7 @@ { "id": 15421106, "username": "rogerdaltry193", - "totalCosts": 860.52, + "totalCosts": 845.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15421106/medium/42065b2af539333bb83278e6ef5e2f29.png" }, { @@ -6510,7 +6516,7 @@ { "id": 15155844, "username": "CryptoSpace", - "totalCosts": 227.25, + "totalCosts": 198.97, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" }, { @@ -6839,12 +6845,6 @@ "totalCosts": 12.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14581548/medium/15cfd2d3d8015efbcfbc20c47deeb5be.jpeg" }, - { - "id": 14614016, - "username": "Anonyma", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14614016/medium/447ae91eb97d464346003fe6532cda12.jpg" - }, { "id": 15135505, "username": "Andrea00P", @@ -6857,6 +6857,12 @@ "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15542547/medium/fffae8cd8da3c88db943d27cc0e4208b_default.png" }, + { + "id": 14614016, + "username": "Anonyma", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14614016/medium/447ae91eb97d464346003fe6532cda12.jpg" + }, { "id": 14698482, "username": "lucaiach", @@ -7376,25 +7382,25 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 2390.67, + "totalCosts": 2377.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { "id": 15085311, "username": "bunturx", - "totalCosts": 765.58, + "totalCosts": 762.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" }, { "id": 14972621, "username": "CSR1415926535", - "totalCosts": 255.53, + "totalCosts": 252.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14972621/medium/ecc1e14d0406d3d97d4e9a292ce70f5a_default.png" }, { "id": 15096589, "username": "paulanieto1010", - "totalCosts": 148.47, + "totalCosts": 141.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15096589/medium/11bda7e6ac773b4cf8c3a84fdd9da4bd.jpeg" }, { @@ -7461,18 +7467,18 @@ { "fileId": "2778", "contributors": [ - { - "id": 15194310, - "username": "MGETH", - "totalCosts": 438.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" - }, { "id": 15522923, "username": "llucC", "totalCosts": 432.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522923/medium/539a9115b9d375bde4eb4bc0fc37995c.png" }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 424.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 15553253, "username": "EmelyGarcia", @@ -7598,6 +7604,12 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14807238/medium/4e9d7e22b8ba45851bf0d10bf4bb2f68.jpeg" }, + { + "id": 16224092, + "username": "coscujin64", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16224092/medium/3d8af10f6adb207ed307b53a2942fe16.png" + }, { "id": 15553253, "username": "EmelyGarcia", @@ -7612,7 +7624,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1791.74, + "totalCosts": 1781.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -7683,7 +7695,7 @@ { "id": 14581548, "username": "danielpg2106", - "totalCosts": 98.98, + "totalCosts": 87.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14581548/medium/15cfd2d3d8015efbcfbc20c47deeb5be.jpeg" }, { @@ -7914,12 +7926,6 @@ "totalCosts": 30.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15160522/medium/d85407776c94ea7ad76ca6c061fd4fcd_default.png" }, - { - "id": 14767094, - "username": "joshuaoliverdouglas", - "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14767094/medium/3114c0487b19c05afa8dc283c94c3a76.png" - }, { "id": 15194310, "username": "MGETH", @@ -8005,7 +8011,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 4091.51, + "totalCosts": 4064.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -8074,7 +8080,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 3429.96, + "totalCosts": 3418.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -8267,7 +8273,7 @@ { "id": 15029495, "username": "caceres.jose.fr", - "totalCosts": 176.75, + "totalCosts": 168.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15029495/medium/6cfbaec8bb35e6835abad73d00c81517.jpeg" }, { @@ -8460,7 +8466,7 @@ { "id": 14564238, "username": "FreddyAndresParra", - "totalCosts": 135.34, + "totalCosts": 130.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" }, { @@ -8766,13 +8772,13 @@ { "id": 14320782, "username": "JoseDeFreitas", - "totalCosts": 976.67, + "totalCosts": 774.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14320782/medium/db9b49609d804eb2048076de466d3162_default.png" }, { "id": 14926537, "username": "Ogion", - "totalCosts": 418.14, + "totalCosts": 398.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14926537/medium/43b283793d5f025f62a367784571a478_default.png" }, { @@ -8782,22 +8788,22 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14995487/medium/f890d1e85e50d0289ca19930aae629d1.png" }, { - "id": 15500572, - "username": "aspoky_dev", - "totalCosts": 86.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15500572/medium/82f4c4ed41642c9eab1d510f97122467.jpg" + "id": 15946267, + "username": "socopower", + "totalCosts": 59.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg" }, { "id": 15159056, "username": "ariel.barros", - "totalCosts": 79.79, + "totalCosts": 51.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15159056/medium/a055cc2e6c5ab28d0ebcb99d0eec29e3_default.png" }, { - "id": 15946267, - "username": "socopower", - "totalCosts": 59.59, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg" + "id": 15500572, + "username": "aspoky_dev", + "totalCosts": 51.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15500572/medium/82f4c4ed41642c9eab1d510f97122467.jpg" }, { "id": 15104875, @@ -8805,6 +8811,12 @@ "totalCosts": 41.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15104875/medium/e90d23a37d5c4325b45195c090936d2f_default.png" }, + { + "id": 16224092, + "username": "coscujin64", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16224092/medium/3d8af10f6adb207ed307b53a2942fe16.png" + }, { "id": 15003205, "username": "fernandososxd4", @@ -9598,14 +9610,8 @@ { "id": 14614016, "username": "Anonyma", - "totalCosts": 37.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14614016/medium/447ae91eb97d464346003fe6532cda12.jpg" - }, - { - "id": 15094993, - "username": "javier.donoso", "totalCosts": 31.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15094993/medium/824cbde6ec1e62405249bcf060ef90d1.jpeg" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14614016/medium/447ae91eb97d464346003fe6532cda12.jpg" }, { "id": 15528915, @@ -9619,6 +9625,12 @@ "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15035241/medium/984d86fd93f938b0489582b7f68e6b25_default.png" }, + { + "id": 15094993, + "username": "javier.donoso", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15094993/medium/824cbde6ec1e62405249bcf060ef90d1.jpeg" + }, { "id": 15022459, "username": "leonardo002031", @@ -9907,21 +9919,21 @@ { "id": 15522923, "username": "llucC", - "totalCosts": 135.34, + "totalCosts": 112.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522923/medium/539a9115b9d375bde4eb4bc0fc37995c.png" }, - { - "id": 15532581, - "username": "malopaes", - "totalCosts": 93.93, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15532581/medium/a0e70a6e9167aa3309b955fb577d8147_default.png" - }, { "id": 14581548, "username": "danielpg2106", "totalCosts": 93.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14581548/medium/15cfd2d3d8015efbcfbc20c47deeb5be.jpeg" }, + { + "id": 15532581, + "username": "malopaes", + "totalCosts": 80.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15532581/medium/a0e70a6e9167aa3309b955fb577d8147_default.png" + }, { "id": 15528915, "username": "J4yD3v", @@ -10161,7 +10173,7 @@ { "id": 15274148, "username": "almartinez", - "totalCosts": 1727.1, + "totalCosts": 1723.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15274148/medium/ba6827b07726231f6fa2a149da7c2627.png" }, { @@ -10220,7 +10232,7 @@ { "id": 15789613, "username": "djvictorvargas1988", - "totalCosts": 46.46, + "totalCosts": 43.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15789613/medium/f5d59ce9fa974c34fed81ee4bcfe45de.jpeg" }, { @@ -10267,7 +10279,7 @@ { "id": 15968127, "username": "gonzagramaglia", - "totalCosts": 1297.85, + "totalCosts": 1278.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15968127/medium/0c91665492f81a2479639eba5271d7bc.png" }, { @@ -10480,7 +10492,7 @@ { "id": 15058949, "username": "gracieluu_ar", - "totalCosts": 468.64, + "totalCosts": 445.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" }, { @@ -10500,12 +10512,6 @@ "username": "MGETH", "totalCosts": 21.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" - }, - { - "id": 15528915, - "username": "J4yD3v", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15528915/medium/c334abf55946c66116d12971fd368f2d_default.png" } ] }, @@ -10860,18 +10866,18 @@ "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15866753/medium/1f6bb2900a3f89af7cf2dffb4ca6df4d.png" }, - { - "id": 15436824, - "username": "araujo.eth", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15436824/medium/1b34b97c1e9e1a2ec99a7fba8d2dbada_default.png" - }, { "id": 15835983, "username": "saday18hernandez2004", "totalCosts": 23.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15835983/medium/8c15b511414ddfacf15479ca54e848c5.png" }, + { + "id": 15436824, + "username": "araujo.eth", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15436824/medium/1b34b97c1e9e1a2ec99a7fba8d2dbada_default.png" + }, { "id": 15056237, "username": "ismaventuras", @@ -10945,7 +10951,7 @@ { "id": 15730101, "username": "anaphant", - "totalCosts": 479.75, + "totalCosts": 464.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15730101/medium/54df140ba50202fe839069eb63683d45.png" }, { @@ -10957,7 +10963,7 @@ { "id": 15946267, "username": "socopower", - "totalCosts": 117.16, + "totalCosts": 102.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg" }, { @@ -11024,18 +11030,18 @@ "totalCosts": 264.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14630992/medium/5b635093aa84e77f956aba430141b90b.jpeg" }, - { - "id": 14564238, - "username": "FreddyAndresParra", - "totalCosts": 127.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" - }, { "id": 14982821, "username": "adriolguin", "totalCosts": 124.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14982821/medium/1d14c841994683501efe6856e8ca396f.jpg" }, + { + "id": 14564238, + "username": "FreddyAndresParra", + "totalCosts": 122.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" + }, { "id": 15135505, "username": "Andrea00P", @@ -11076,12 +11082,6 @@ "totalCosts": 186.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" }, - { - "id": 15522923, - "username": "llucC", - "totalCosts": 108.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522923/medium/539a9115b9d375bde4eb4bc0fc37995c.png" - }, { "id": 15490162, "username": "Mathewvizc7", @@ -11089,10 +11089,10 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15490162/medium/ee6f672ba75de903b8f7bffb3be4773d_default.png" }, { - "id": 16010703, - "username": "vero_vero03", - "totalCosts": 74.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16010703/medium/97c299201d2fe2be8c7fef377883e484_default.png" + "id": 15522923, + "username": "llucC", + "totalCosts": 71.71, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522923/medium/539a9115b9d375bde4eb4bc0fc37995c.png" }, { "id": 15960287, @@ -11100,6 +11100,12 @@ "totalCosts": 64.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" }, + { + "id": 16010703, + "username": "vero_vero03", + "totalCosts": 50.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16010703/medium/97c299201d2fe2be8c7fef377883e484_default.png" + }, { "id": 14995487, "username": "Gu1ll0t3", @@ -11192,7 +11198,7 @@ { "id": 15287132, "username": "0xAntonio", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15287132/medium/67c5a079a19f5b0cd46f8d628cff446d.png" }, { @@ -11204,7 +11210,7 @@ { "id": 15243012, "username": "Aitorgrcn", - "totalCosts": 79.79, + "totalCosts": 69.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15243012/medium/ce4c361d409467cd2c1b7d3a00b614d2_default.png" }, { @@ -11219,12 +11225,6 @@ "totalCosts": 7.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14755966/medium/f5becfea2dd543f57f356dfb3e42487d_default.png" }, - { - "id": 15237056, - "username": "al.corredera", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15237056/medium/d846ce5a4333a3c90131ebdc6abcb3b5.jpeg" - }, { "id": 15591241, "username": "Seyvick", @@ -11245,7 +11245,7 @@ { "id": 15317682, "username": "junowoz", - "totalCosts": 184.83, + "totalCosts": 180.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" }, { @@ -11257,7 +11257,7 @@ { "id": 15431356, "username": "davinci061299", - "totalCosts": 101, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15431356/medium/528b0f234df1b6a36aacfe2c4abde9b6.png" }, { @@ -11357,7 +11357,7 @@ { "id": 15770841, "username": "Angelito_18", - "totalCosts": 2798.71, + "totalCosts": 2774.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15770841/medium/f82644a45b17eed3facb1815dcc83d13.jpeg" }, { @@ -11409,7 +11409,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1747.3, + "totalCosts": 1742.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -11443,7 +11443,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 802.95, + "totalCosts": 774.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] @@ -11465,7 +11465,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 2291.69, + "totalCosts": 2272.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -11798,7 +11798,7 @@ { "id": 14645922, "username": "506utyutyuty", - "totalCosts": 630.24, + "totalCosts": 623.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14645922/medium/defd7b38618b1e500ae3c09e4b6f3f69.jpeg" }, { @@ -11807,18 +11807,18 @@ "totalCosts": 564.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14581548/medium/15cfd2d3d8015efbcfbc20c47deeb5be.jpeg" }, - { - "id": 14564238, - "username": "FreddyAndresParra", - "totalCosts": 93.93, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" - }, { "id": 15838619, "username": "al4ndrade", - "totalCosts": 82.82, + "totalCosts": 80.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15838619/medium/58f9acf18a854df6a81f207004a74b26.jpeg" }, + { + "id": 14564238, + "username": "FreddyAndresParra", + "totalCosts": 78.78, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14564238/medium/e6feebc5a27754079a07907fffac8389.jpg" + }, { "id": 14865328, "username": "Lostday", @@ -11858,7 +11858,7 @@ { "id": 14791370, "username": "williamx", - "totalCosts": 9.09, + "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14791370/medium/59d86e6d660482edfdda6487b7fc1205_default.png" }, { @@ -12213,7 +12213,7 @@ { "id": 15502508, "username": "fgavadeveloper", - "totalCosts": 804.97, + "totalCosts": 795.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15502508/medium/d6b18a64d4fbae95044bf5883443b797.png" }, { @@ -12341,7 +12341,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 522.17, + "totalCosts": 508.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] @@ -12501,7 +12501,7 @@ { "id": 15968127, "username": "gonzagramaglia", - "totalCosts": 882.74, + "totalCosts": 870.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15968127/medium/0c91665492f81a2479639eba5271d7bc.png" }, { @@ -12524,7 +12524,7 @@ { "id": 15903171, "username": "SidWeb", - "totalCosts": 495.91, + "totalCosts": 492.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15903171/medium/16aea0b15b034302e6e656749a0a7b8e.jpg" } ] @@ -12544,12 +12544,6 @@ "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" }, - { - "id": 15714091, - "username": "Karym_GG", - "totalCosts": 25.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" - }, { "id": 15847249, "username": "AlexanderMartinezz", @@ -12626,7 +12620,7 @@ { "id": 15908639, "username": "mettal", - "totalCosts": 312.09, + "totalCosts": 309.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15908639/medium/5b02a8579a760cb22bf5f82c312082f2.png" }, { @@ -12694,9 +12688,15 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1286.74, + "totalCosts": 1256.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, + { + "id": 16224092, + "username": "coscujin64", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16224092/medium/3d8af10f6adb207ed307b53a2942fe16.png" + }, { "id": 15553253, "username": "EmelyGarcia", @@ -12722,9 +12722,15 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1633.17, + "totalCosts": 1549.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, + { + "id": 16224092, + "username": "coscujin64", + "totalCosts": 32.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16224092/medium/3d8af10f6adb207ed307b53a2942fe16.png" + }, { "id": 15469966, "username": "1Sergio", @@ -12750,7 +12756,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 2079.59, + "totalCosts": 2066.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -12868,7 +12874,7 @@ { "id": 15770841, "username": "Angelito_18", - "totalCosts": 320.17, + "totalCosts": 307.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15770841/medium/f82644a45b17eed3facb1815dcc83d13.jpeg" }, { @@ -12981,7 +12987,7 @@ { "id": 15233666, "username": "Alifarhani", - "totalCosts": 40.4, + "totalCosts": 34.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" } ] @@ -13032,13 +13038,13 @@ { "id": 15097099, "username": "nader.sedigh", - "totalCosts": 474.7, + "totalCosts": 451.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" }, { "id": 15233666, "username": "Alifarhani", - "totalCosts": 121.2, + "totalCosts": 114.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" }, { @@ -13234,18 +13240,18 @@ "totalCosts": 142.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16001243/medium/b75b58e1e84d60e633167eb068b1253e.jpg" }, - { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 113.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" - }, { "id": 15233666, "username": "Alifarhani", "totalCosts": 108.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 107.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, { "id": 14665754, "username": "R3z4_Pr0gramm3r", @@ -13761,7 +13767,7 @@ { "id": 15099529, "username": "Aria-Naraghi", - "totalCosts": 1760.43, + "totalCosts": 1754.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" }, { @@ -13837,7 +13843,7 @@ { "id": 15955625, "username": "Coiniran", - "totalCosts": 713.06, + "totalCosts": 676.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" }, { @@ -13890,7 +13896,7 @@ { "id": 15967893, "username": "apacala", - "totalCosts": 344.41, + "totalCosts": 286.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967893/medium/6f427c7b8d63cf93f27c4df77f07a2b5_default.png" }, { @@ -13966,13 +13972,13 @@ { "id": 15967115, "username": "itsdeeters", - "totalCosts": 90.9, + "totalCosts": 86.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" }, { "id": 14814690, "username": "khodaarahmi", - "totalCosts": 74.74, + "totalCosts": 70.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814690/medium/22dbf1e43823e76cb094bff3fdcca212.jpeg" }, { @@ -13984,7 +13990,7 @@ { "id": 15233666, "username": "Alifarhani", - "totalCosts": 19.19, + "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" } ] @@ -14042,7 +14048,7 @@ { "id": 15233666, "username": "Alifarhani", - "totalCosts": 540.35, + "totalCosts": 536.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" }, { @@ -14065,7 +14071,7 @@ { "id": 15233666, "username": "Alifarhani", - "totalCosts": 1720.03, + "totalCosts": 1715.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" }, { @@ -14186,7 +14192,7 @@ { "id": 15144242, "username": "sharifi.masoud", - "totalCosts": 1069.59, + "totalCosts": 1054.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15144242/medium/afcb9846e0abee60cd0b4755effdebac.jpg" }, { @@ -14334,7 +14340,7 @@ { "id": 15955625, "username": "Coiniran", - "totalCosts": 1981.62, + "totalCosts": 1976.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" }, { @@ -14505,7 +14511,7 @@ { "id": 15955625, "username": "Coiniran", - "totalCosts": 3233.01, + "totalCosts": 3208.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" }, { @@ -14523,7 +14529,7 @@ { "id": 15967119, "username": "timtey", - "totalCosts": 34.34, + "totalCosts": 23.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" }, { @@ -14557,7 +14563,7 @@ { "id": 15955625, "username": "Coiniran", - "totalCosts": 1820.02, + "totalCosts": 1807.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" }, { @@ -14664,13 +14670,13 @@ { "id": 15967239, "username": "MahdiRezaeian", - "totalCosts": 853.45, + "totalCosts": 850.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967239/medium/a3fdd1e460fca7c1a39ec8f00a4ad059_default.png" }, { "id": 15955625, "username": "Coiniran", - "totalCosts": 801.94, + "totalCosts": 798.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" } ] @@ -14727,7 +14733,7 @@ { "id": 15955625, "username": "Coiniran", - "totalCosts": 589.84, + "totalCosts": 586.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" } ] @@ -14738,7 +14744,7 @@ { "id": 15955625, "username": "Coiniran", - "totalCosts": 1270.58, + "totalCosts": 1240.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955625/medium/cea2317824f592725aac52fcd2eedb26_default.png" }, { @@ -14760,7 +14766,7 @@ { "id": 15185884, "username": "carmen1912", - "totalCosts": 505, + "totalCosts": 447.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, { @@ -14854,7 +14860,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 66.66, + "totalCosts": 67.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -14983,13 +14989,13 @@ { "id": 13249257, "username": "SuperDelphi", - "totalCosts": 468.64, + "totalCosts": 445.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13249257/medium/f566e07e86e26f5911df1ddf5fae796d.png" }, { "id": 12844463, "username": "MATsxm", - "totalCosts": 131.3, + "totalCosts": 124.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -15228,22 +15234,22 @@ { "fileId": "6412", "contributors": [ - { - "id": 12844463, - "username": "MATsxm", - "totalCosts": 464.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" - }, { "id": 17361, "username": "plamarque", "totalCosts": 459.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png" }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 455.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, { "id": 13249257, "username": "SuperDelphi", - "totalCosts": 310.07, + "totalCosts": 288.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13249257/medium/f566e07e86e26f5911df1ddf5fae796d.png" }, { @@ -15319,7 +15325,7 @@ { "id": 14862460, "username": "vdusart", - "totalCosts": 1232.2, + "totalCosts": 1217.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14862460/medium/106cb769254652c20ddeab107317fd43_default.png" }, { @@ -15349,7 +15355,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 30.3, + "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] @@ -15419,13 +15425,13 @@ { "id": 15682041, "username": "Joker71293921", - "totalCosts": 1187.76, + "totalCosts": 1159.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15682041/medium/e62239d0be9e3327d12dd221caf5bd97.jpg" }, { "id": 14823260, "username": "omahs", - "totalCosts": 417.13, + "totalCosts": 415.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg" }, { @@ -15437,7 +15443,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 27.27, + "totalCosts": 55.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -15877,18 +15883,18 @@ "totalCosts": 175.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15426512/medium/3d6568dc6e76931cee4766ecb4c3163a.jpg" }, - { - "id": 12844463, - "username": "MATsxm", - "totalCosts": 68.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" - }, { "id": 15185884, "username": "carmen1912", "totalCosts": 67.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 62.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, { "id": 14587094, "username": "Fabs86", @@ -16206,7 +16212,7 @@ { "id": 15442454, "username": "Im-SpiETH", - "totalCosts": 828.2, + "totalCosts": 768.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15442454/medium/860696ab89262fe98a0b888882d2b2da_default.png" }, { @@ -16218,7 +16224,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 140.39, + "totalCosts": 116.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -16708,19 +16714,19 @@ { "id": 15624473, "username": "CaverneCrypto", - "totalCosts": 1783.66, + "totalCosts": 1770.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15624473/medium/7790c08f2ef4a5ba028091b6393900be_default.png" }, { "id": 12844463, "username": "MATsxm", - "totalCosts": 1275.63, + "totalCosts": 1265.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { "id": 17361, "username": "plamarque", - "totalCosts": 424.2, + "totalCosts": 415.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png" }, { @@ -16744,7 +16750,7 @@ { "id": 15085937, "username": "LeBrocanteur", - "totalCosts": 65.65, + "totalCosts": 63.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085937/medium/cae4de0cb475627b949a1c40efb71eed.png" }, { @@ -16785,7 +16791,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 2288.66, + "totalCosts": 2275.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -16854,7 +16860,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 150.49, + "totalCosts": 164.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -16887,12 +16893,6 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15426512/medium/3d6568dc6e76931cee4766ecb4c3163a.jpg" }, - { - "id": 16014683, - "username": "pierredogui", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16014683/medium/8dc8d59a7a6e2830c84d1a23f5d1814f.jpeg" - }, { "id": 14587890, "username": "Elikill58", @@ -16937,7 +16937,7 @@ { "id": 15683863, "username": "zeyadoun12", - "totalCosts": 82.82, + "totalCosts": 81.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15683863/medium/1d6ed972d684360bf9f45bafbabe6c6f.jpeg" }, { @@ -16996,7 +16996,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 289.87, + "totalCosts": 306.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -17043,7 +17043,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 1056.46, + "totalCosts": 1046.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -17281,7 +17281,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 317.14, + "totalCosts": 306.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] @@ -17398,7 +17398,7 @@ { "id": 15624473, "username": "CaverneCrypto", - "totalCosts": 3076.46, + "totalCosts": 3049.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15624473/medium/7790c08f2ef4a5ba028091b6393900be_default.png" }, { @@ -17474,13 +17474,13 @@ { "id": 15426512, "username": "Recktosaurus", - "totalCosts": 654.48, + "totalCosts": 639.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15426512/medium/3d6568dc6e76931cee4766ecb4c3163a.jpg" }, { "id": 15385196, "username": "Mcrypto", - "totalCosts": 86.86, + "totalCosts": 71.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15385196/medium/0540414f2afb6ad01aef4a67479750b8.jpg" }, { @@ -17608,7 +17608,7 @@ { "id": 14737644, "username": "DylanCONIN", - "totalCosts": 973.64, + "totalCosts": 956.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14737644/medium/d981e7d9ae1b98b7e8a21245675fc0e0.jpg" }, { @@ -17626,7 +17626,7 @@ { "id": 14587890, "username": "Elikill58", - "totalCosts": 35.35, + "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14587890/medium/1d5b3a9de8a7b7f6082357f1fe99d654.jpeg" } ] @@ -17807,7 +17807,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 311.08, + "totalCosts": 303, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -18023,7 +18023,7 @@ { "id": 14737644, "username": "DylanCONIN", - "totalCosts": 354.51, + "totalCosts": 352.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14737644/medium/d981e7d9ae1b98b7e8a21245675fc0e0.jpg" }, { @@ -18053,7 +18053,7 @@ { "id": 14587890, "username": "Elikill58", - "totalCosts": 7.07, + "totalCosts": 4.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14587890/medium/1d5b3a9de8a7b7f6082357f1fe99d654.jpeg" } ] @@ -18064,7 +18064,7 @@ { "id": 14737644, "username": "DylanCONIN", - "totalCosts": 619.13, + "totalCosts": 617.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14737644/medium/d981e7d9ae1b98b7e8a21245675fc0e0.jpg" }, { @@ -18076,7 +18076,7 @@ { "id": 14587890, "username": "Elikill58", - "totalCosts": 5.05, + "totalCosts": 2.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14587890/medium/1d5b3a9de8a7b7f6082357f1fe99d654.jpeg" } ] @@ -18192,7 +18192,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 335.32, + "totalCosts": 348.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -18298,19 +18298,19 @@ { "id": 15023979, "username": "moirauche", - "totalCosts": 800.93, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15023979/medium/9912737b3db1845917c3c8cc9a1f2d7a_default.png" }, { "id": 14989997, "username": "Sirlupinwatson1", - "totalCosts": 531.26, + "totalCosts": 512.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14989997/medium/58dac31cb4d977a29d3caf7d37e7cd45.jpeg" }, { "id": 12844463, "username": "MATsxm", - "totalCosts": 306.03, + "totalCosts": 238.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -18319,12 +18319,6 @@ "totalCosts": 107.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15138122/medium/8ff6cf249d17f4ce0c96218ee9d81c06_default.png" }, - { - "id": 15415492, - "username": "sashasrs", - "totalCosts": 53.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15415492/medium/3fa311e4cb49b48849796356395333e8.jpg" - }, { "id": 15954931, "username": "XofEE", @@ -18337,18 +18331,18 @@ "totalCosts": 44.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996665/medium/d9d39ce06d506da97c2bad107ed016c5.png" }, + { + "id": 15415492, + "username": "sashasrs", + "totalCosts": 39.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15415492/medium/3fa311e4cb49b48849796356395333e8.jpg" + }, { "id": 15624473, "username": "CaverneCrypto", "totalCosts": 16.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15624473/medium/7790c08f2ef4a5ba028091b6393900be_default.png" }, - { - "id": 15144292, - "username": "ytison", - "totalCosts": 9.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15144292/medium/303a9c200ea05f3a6af7273b3e21c301_default.png" - }, { "id": 14675712, "username": "LEMIBANDDEXARI", @@ -19154,7 +19148,7 @@ { "id": 14750044, "username": "eloise.emery", - "totalCosts": 961.52, + "totalCosts": 926.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14750044/medium/9e793da12e9905e4598d0e0a2e191289.jpeg" }, { @@ -19381,7 +19375,7 @@ { "id": 13249257, "username": "SuperDelphi", - "totalCosts": 319.16, + "totalCosts": 301.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13249257/medium/f566e07e86e26f5911df1ddf5fae796d.png" }, { @@ -19428,7 +19422,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 125.24, + "totalCosts": 118.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -19457,7 +19451,7 @@ { "id": 13473469, "username": "jules.seigneur77", - "totalCosts": 92.92, + "totalCosts": 80.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13473469/medium/4118d6e220ce9b45529503a39159dc48.jpg" }, { @@ -19791,13 +19785,13 @@ { "id": 17361, "username": "plamarque", - "totalCosts": 725.18, + "totalCosts": 719.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png" }, { "id": 12844463, "username": "MATsxm", - "totalCosts": 189.88, + "totalCosts": 212.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -19812,12 +19806,6 @@ "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15689365/medium/69a7b82eee2a901151a0414599bdf30f_default.png" }, - { - "id": 14075861, - "username": "Kler", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14075861/medium/a3cf69cc209acc2c520607aab4d1c615.jpeg" - }, { "id": 15188420, "username": "ThomasErhel", @@ -19968,7 +19956,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 135.34, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -20033,7 +20021,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 1297.85, + "totalCosts": 1261.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -20193,13 +20181,13 @@ { "id": 14823260, "username": "omahs", - "totalCosts": 291.89, + "totalCosts": 287.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg" }, { "id": 13249257, "username": "SuperDelphi", - "totalCosts": 81.81, + "totalCosts": 71.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13249257/medium/f566e07e86e26f5911df1ddf5fae796d.png" }, { @@ -20346,7 +20334,7 @@ { "id": 15302370, "username": "Manusxb", - "totalCosts": 451.47, + "totalCosts": 447.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15302370/medium/9f944ffeaa451f3c2ea156478533b41f_default.png" }, { @@ -20387,7 +20375,7 @@ { "id": 17361, "username": "plamarque", - "totalCosts": 695.89, + "totalCosts": 691.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png" }, { @@ -20546,7 +20534,7 @@ { "id": 14075861, "username": "Kler", - "totalCosts": 12842.15, + "totalCosts": 12822.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14075861/medium/a3cf69cc209acc2c520607aab4d1c615.jpeg" }, { @@ -20629,7 +20617,7 @@ { "id": 15442454, "username": "Im-SpiETH", - "totalCosts": 933.24, + "totalCosts": 909, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15442454/medium/860696ab89262fe98a0b888882d2b2da_default.png" }, { @@ -20677,7 +20665,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 8.08, + "totalCosts": 32.32, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -20957,7 +20945,7 @@ { "id": 14704668, "username": "phrobinet", - "totalCosts": 143.42, + "totalCosts": 132.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14704668/medium/f456203d0a45823ded3c364a95f57f3e.jpeg" }, { @@ -21543,7 +21531,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 520.15, + "totalCosts": 515.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -21551,6 +21539,12 @@ "username": "hdmed", "totalCosts": 71.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13324494/medium/e15dc911ade7cf545aeb847438d6742c.jpeg" + }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] }, @@ -21577,7 +21571,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 681.75, + "totalCosts": 668.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" } ] @@ -21639,7 +21633,7 @@ { "id": 14823260, "username": "omahs", - "totalCosts": 223.21, + "totalCosts": 209.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg" }, { @@ -21741,7 +21735,7 @@ { "id": 15442454, "username": "Im-SpiETH", - "totalCosts": 669.63, + "totalCosts": 630.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15442454/medium/860696ab89262fe98a0b888882d2b2da_default.png" }, { @@ -21781,7 +21775,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 2135.14, + "totalCosts": 2115.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -22246,7 +22240,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 1808.91, + "totalCosts": 1796.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -22254,6 +22248,12 @@ "username": "plamarque", "totalCosts": 731.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png" + }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] }, @@ -22265,12 +22265,6 @@ "username": "Im-SpiETH", "totalCosts": 492.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15442454/medium/860696ab89262fe98a0b888882d2b2da_default.png" - }, - { - "id": 15318490, - "username": "arthursw", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15318490/medium/673173431aeb53f29ca5516e9aa87bec_default.png" } ] }, @@ -22289,12 +22283,6 @@ "totalCosts": 372.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/17361/medium/fecfafa7716ac9d6838b43c31f48f6b9.png" }, - { - "id": 12844463, - "username": "MATsxm", - "totalCosts": 25.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" - }, { "id": 15954931, "username": "XofEE", @@ -22427,9 +22415,15 @@ { "id": 15914449, "username": "CoinHoodie", - "totalCosts": 1276.64, + "totalCosts": 1246.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15914449/medium/8d2590e4c534ca5125f1d70b6d9c71cc.jpeg" }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, { "id": 14823260, "username": "omahs", @@ -22586,7 +22580,7 @@ { "id": 15363678, "username": "Dawyer", - "totalCosts": 1168.57, + "totalCosts": 1153.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15363678/medium/50e493deacc1ae7d512f2b38aab07d00.png" }, { @@ -22641,18 +22635,18 @@ "totalCosts": 1223.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png" }, - { - "id": 15956379, - "username": "bhangbuddy", - "totalCosts": 232.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15956379/medium/435901b02d5b5f77c10fc06ff2c1c3e6.png" - }, { "id": 15950093, "username": "WholesomeBruh", "totalCosts": 208.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15950093/medium/0ca7566575ffb3df8169a24c985fc2f8_default.png" }, + { + "id": 15956379, + "username": "bhangbuddy", + "totalCosts": 204.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15956379/medium/435901b02d5b5f77c10fc06ff2c1c3e6.png" + }, { "id": 15363678, "username": "Dawyer", @@ -22684,14 +22678,8 @@ { "id": 15950093, "username": "WholesomeBruh", - "totalCosts": 716.09, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15950093/medium/0ca7566575ffb3df8169a24c985fc2f8_default.png" - }, - { - "id": 15363678, - "username": "Dawyer", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15363678/medium/50e493deacc1ae7d512f2b38aab07d00.png" } ] }, @@ -22770,7 +22758,7 @@ { "id": 15956379, "username": "bhangbuddy", - "totalCosts": 723.16, + "totalCosts": 700.94, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15956379/medium/435901b02d5b5f77c10fc06ff2c1c3e6.png" }, { @@ -22917,7 +22905,7 @@ { "id": 15363678, "username": "Dawyer", - "totalCosts": 327.24, + "totalCosts": 323.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15363678/medium/50e493deacc1ae7d512f2b38aab07d00.png" }, { @@ -22940,7 +22928,7 @@ { "id": 15967185, "username": "waseemnaik", - "totalCosts": 2059.39, + "totalCosts": 2057.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png" } ] @@ -23003,7 +22991,7 @@ { "id": 15967185, "username": "waseemnaik", - "totalCosts": 1321.08, + "totalCosts": 1296.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png" }, { @@ -23108,7 +23096,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 928.19, + "totalCosts": 870.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23125,7 +23113,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 555.5, + "totalCosts": 644.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23139,17 +23127,17 @@ { "fileId": "2868", "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 209.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + }, { "id": 14357794, "username": "robertdosa", "totalCosts": 186.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14357794/medium/a28b741096516a710523b87d9ee07223.png" - }, - { - "id": 15965461, - "username": "Satglow", - "totalCosts": 168.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] }, @@ -23165,7 +23153,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 134.33, + "totalCosts": 165.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -23324,7 +23312,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 184.83, + "totalCosts": 232.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -23369,7 +23357,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1813.96, + "totalCosts": 1821.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23392,7 +23380,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 216.14, + "totalCosts": 246.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23420,7 +23408,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 933.24, + "totalCosts": 953.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23437,7 +23425,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 666.6, + "totalCosts": 684.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23454,7 +23442,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1787.7, + "totalCosts": 1773.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23477,7 +23465,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1609.94, + "totalCosts": 1608.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23494,7 +23482,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 3362.29, + "totalCosts": 4204.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23517,7 +23505,7 @@ { "id": 14357794, "username": "robertdosa", - "totalCosts": 110.09, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14357794/medium/a28b741096516a710523b87d9ee07223.png" }, { @@ -23619,7 +23607,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 281.79, + "totalCosts": 270.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23636,7 +23624,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 238.36, + "totalCosts": 227.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -23715,7 +23703,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 673.67, + "totalCosts": 665.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23738,7 +23726,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 13.13, + "totalCosts": 39.39, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -23777,7 +23765,7 @@ { "id": 14357794, "username": "robertdosa", - "totalCosts": 395.92, + "totalCosts": 390.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14357794/medium/a28b741096516a710523b87d9ee07223.png" }, { @@ -23806,7 +23794,7 @@ { "id": 14357794, "username": "robertdosa", - "totalCosts": 626.2, + "totalCosts": 621.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14357794/medium/a28b741096516a710523b87d9ee07223.png" }, { @@ -23857,7 +23845,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 809.01, + "totalCosts": 814.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23880,7 +23868,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 98.98, + "totalCosts": 102.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24051,7 +24039,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 488.84, + "totalCosts": 507.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24068,7 +24056,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 11587.73, + "totalCosts": 11568.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24103,7 +24091,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1058.48, + "totalCosts": 1050.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24115,7 +24103,7 @@ { "id": 15616701, "username": "Wegonar", - "totalCosts": 62.62, + "totalCosts": 47.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15616701/medium/107a9002aa59a9dab9854283b420a57b.jpeg" }, { @@ -24154,7 +24142,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 905.97, + "totalCosts": 899.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24198,7 +24186,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 606, + "totalCosts": 575.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24209,7 +24197,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2046.26, + "totalCosts": 2031.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24243,7 +24231,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1669.53, + "totalCosts": 1641.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24265,7 +24253,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2091.71, + "totalCosts": 2069.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24364,7 +24352,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 718.11, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24414,7 +24402,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 957.48, + "totalCosts": 953.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24425,7 +24413,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2059.39, + "totalCosts": 2057.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24447,7 +24435,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 3235.03, + "totalCosts": 3210.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24469,7 +24457,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1994.75, + "totalCosts": 1989.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24502,7 +24490,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 5717.61, + "totalCosts": 5708.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24524,7 +24512,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 802.95, + "totalCosts": 774.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24546,7 +24534,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2349.26, + "totalCosts": 2330.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24712,7 +24700,7 @@ { "id": 14357794, "username": "robertdosa", - "totalCosts": 1365.52, + "totalCosts": 1334.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14357794/medium/a28b741096516a710523b87d9ee07223.png" }, { @@ -24757,7 +24745,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1820.02, + "totalCosts": 1807.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24779,7 +24767,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1131.2, + "totalCosts": 1105.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24878,7 +24866,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1286.74, + "totalCosts": 1256.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24900,7 +24888,7 @@ { "id": 15594493, "username": "0xceife", - "totalCosts": 312.09, + "totalCosts": 254.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15594493/medium/ada4e2f5276b6085495631bb59486bc8.gif" }, { @@ -24958,7 +24946,7 @@ { "id": 14861756, "username": "RahayuRafika_12", - "totalCosts": 192.91, + "totalCosts": 186.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg" } ] @@ -25015,13 +25003,13 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 472.68, + "totalCosts": 449.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { "id": 14861756, "username": "RahayuRafika_12", - "totalCosts": 122.21, + "totalCosts": 115.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg" } ] @@ -25066,7 +25054,7 @@ { "id": 15591667, "username": "Rohmen", - "totalCosts": 660.54, + "totalCosts": 655.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15591667/medium/73757d8bd29406cc7984633838c7abdc_default.png" }, { @@ -25217,7 +25205,7 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 1515, + "totalCosts": 1505.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { @@ -25334,7 +25322,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 54.54, + "totalCosts": 48.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -25685,13 +25673,13 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 2455.31, + "totalCosts": 2439.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1162.51, + "totalCosts": 1152.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" } ] @@ -25743,7 +25731,7 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 986.77, + "totalCosts": 972.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { @@ -25766,7 +25754,7 @@ { "id": 15934037, "username": "fuji.anggara10", - "totalCosts": 707, + "totalCosts": 705.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15934037/medium/e913f10d6d3550452e0b7c072e15aa40.jpeg" }, { @@ -25864,13 +25852,13 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 187.86, + "totalCosts": 176.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { "id": 14861756, "username": "RahayuRafika_12", - "totalCosts": 110.09, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg" }, { @@ -25887,7 +25875,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 516.11, + "totalCosts": 505, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -25910,7 +25898,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 460.56, + "totalCosts": 449.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -25950,7 +25938,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 202, + "totalCosts": 190.89, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -25996,7 +25984,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 261.59, + "totalCosts": 250.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -26025,7 +26013,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 166.65, + "totalCosts": 155.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -26100,7 +26088,7 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 750.43, + "totalCosts": 735.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { @@ -26199,7 +26187,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1475.61, + "totalCosts": 1452.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" } ] @@ -26296,7 +26284,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 870.62, + "totalCosts": 862.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -26440,7 +26428,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 440.36, + "totalCosts": 435.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -26457,7 +26445,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 661.55, + "totalCosts": 656.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -26595,13 +26583,13 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1060.5, + "totalCosts": 858.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 266.64, + "totalCosts": 231.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { @@ -27176,7 +27164,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1015.05, + "totalCosts": 979.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -27324,7 +27312,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1050.4, + "totalCosts": 1033.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" } ] @@ -27352,7 +27340,7 @@ { "id": 14730600, "username": "Datenshi", - "totalCosts": 290.88, + "totalCosts": 278.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14730600/medium/562d4270c70922086fe1ce42f079e984.jpg" }, { @@ -27407,18 +27395,18 @@ { "fileId": "6183", "contributors": [ + { + "id": 14708760, + "username": "hypebeans", + "totalCosts": 306.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/c99d5e08a676eaebe6f2a383a81222e1.jpg" + }, { "id": 15927303, "username": "roifnaufal21", "totalCosts": 217.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, - { - "id": 14708760, - "username": "hypebeans", - "totalCosts": 65.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/c99d5e08a676eaebe6f2a383a81222e1.jpg" - }, { "id": 14866604, "username": "yeremiaryangunadi", @@ -27519,7 +27507,7 @@ { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 1598.83, + "totalCosts": 1592.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { @@ -27624,7 +27612,7 @@ { "id": 15934037, "username": "fuji.anggara10", - "totalCosts": 710.03, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15934037/medium/e913f10d6d3550452e0b7c072e15aa40.jpeg" }, { @@ -27671,7 +27659,7 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 1690.74, + "totalCosts": 1636.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { @@ -27753,7 +27741,7 @@ { "id": 15588533, "username": "jundullah", - "totalCosts": 1947.28, + "totalCosts": 1932.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15588533/medium/18dbcb324d075828b211bb018e359ebc.jpg" }, { @@ -27812,7 +27800,7 @@ { "id": 14861756, "username": "RahayuRafika_12", - "totalCosts": 56.56, + "totalCosts": 28.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg" }, { @@ -27858,19 +27846,19 @@ { "id": 15775647, "username": "utomo878", - "totalCosts": 328.25, + "totalCosts": 322.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15775647/medium/e6c4302f1613714c53e496f87b61ae01.jpg" }, { "id": 14866604, "username": "yeremiaryangunadi", - "totalCosts": 85.85, + "totalCosts": 75.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14866604/medium/285a89179a206f3621ba14bf04085b27.png" }, { "id": 15627063, "username": "hudaxpropesor", - "totalCosts": 9.09, + "totalCosts": 7.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15627063/medium/b348c090a5a9288af23d49260b2479c2.png" } ] @@ -27980,7 +27968,7 @@ { "id": 15775647, "username": "utomo878", - "totalCosts": 921.12, + "totalCosts": 917.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15775647/medium/e6c4302f1613714c53e496f87b61ae01.jpg" }, { @@ -28003,7 +27991,7 @@ { "id": 15662523, "username": "Jokowdd", - "totalCosts": 852.44, + "totalCosts": 850.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15662523/medium/a1bde18af96dc28c3fd1c1dd610e8896.JPG" }, { @@ -28173,7 +28161,7 @@ { "id": 14861756, "username": "RahayuRafika_12", - "totalCosts": 329.26, + "totalCosts": 317.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg" } ] @@ -28348,7 +28336,7 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 1286.74, + "totalCosts": 1256.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" } ] @@ -28359,7 +28347,7 @@ { "id": 15927303, "username": "roifnaufal21", - "totalCosts": 8832.45, + "totalCosts": 8813.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png" }, { @@ -28417,14 +28405,14 @@ { "id": 15185884, "username": "carmen1912", - "totalCosts": 491.87, + "totalCosts": 434.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 79.79, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14786554, @@ -28469,9 +28457,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1308.96, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -28498,9 +28486,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -28515,9 +28503,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 121.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 115.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 13754187, @@ -28556,9 +28544,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 33.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -28579,9 +28567,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 198.97, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15101201, @@ -28608,9 +28596,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 40.4, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15498288, @@ -28626,19 +28614,19 @@ { "id": 14657804, "username": "jhonnyvianello", - "totalCosts": 378.75, + "totalCosts": 362.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14657804/medium/005d9fa70fdc5a4fcd818f63cf61e1a0.jpg" }, { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 124.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 117.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15101201, "username": "andreapiani.dev", - "totalCosts": 89.89, + "totalCosts": 82.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15101201/medium/e83a56185107895cbc97cbd279ecf901.jpg" }, { @@ -28660,9 +28648,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 265.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15216898, @@ -28683,9 +28671,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 178.77, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 16073436, @@ -28706,9 +28694,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 149.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28723,9 +28711,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 205.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -28734,9 +28722,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 325.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28751,9 +28739,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 221.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28774,9 +28762,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 160.59, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28791,9 +28779,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 788.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28814,9 +28802,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 467.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28843,9 +28831,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1176.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28866,9 +28854,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 136.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -28895,14 +28883,14 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1431.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1405.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, "username": "jhonnyvianello", - "totalCosts": 484.8, + "totalCosts": 465.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14657804/medium/005d9fa70fdc5a4fcd818f63cf61e1a0.jpg" }, { @@ -28942,9 +28930,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1239.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1236.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14963383, @@ -28977,9 +28965,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 2214.93, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 2199.78, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 16061752, @@ -28994,9 +28982,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2854.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -29029,9 +29017,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1707.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1677.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15747281, @@ -29052,9 +29040,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 877.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14558188, @@ -29105,9 +29093,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 53.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 13754187, @@ -29128,9 +29116,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 172.71, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29157,9 +29145,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1730.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1721.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -29180,9 +29168,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 536.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29239,9 +29227,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 644.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -29262,9 +29250,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 5239.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29273,9 +29261,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 792.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 753.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -29296,9 +29284,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1079.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15828035, @@ -29313,9 +29301,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 2325.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 2305.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -29342,9 +29330,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1105.95, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29353,9 +29341,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 689.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 683.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, @@ -29382,9 +29370,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 968.59, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29393,9 +29381,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1352.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15721133, @@ -29428,9 +29416,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 828.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -29445,9 +29433,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 685.79, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29474,9 +29462,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 455.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29497,9 +29485,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1731.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -29520,9 +29508,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 994.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 16171038, @@ -29537,9 +29525,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 576.71, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29554,9 +29542,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 276.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14963383, @@ -29589,9 +29577,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1580.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29642,9 +29630,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 162.61, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14923593, @@ -29677,9 +29665,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 158.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29688,14 +29676,14 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1895.77, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1836.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, "username": "hyperalchemy", - "totalCosts": 140.39, + "totalCosts": 116.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946127/medium/fb8809671278895b42cf50c752fd7bf2.png" } ] @@ -29705,9 +29693,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1115.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29716,9 +29704,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1174.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29727,9 +29715,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 735.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, @@ -29750,9 +29738,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 202, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -29773,9 +29761,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 365.62, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29790,9 +29778,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 414.1, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -29843,9 +29831,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 67.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14647238, @@ -29866,9 +29854,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 147.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -29895,9 +29883,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 156.55, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14970323, @@ -29942,9 +29930,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 102.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -29953,9 +29941,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 699.93, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14976781, @@ -29976,9 +29964,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 667.61, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14586142, @@ -30005,14 +29993,14 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1765.48, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1753.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, "username": "andrea0x.eth", - "totalCosts": 1747.3, + "totalCosts": 1734.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15630617/medium/b03e6368819544b642a8371e0a875054.jpeg" }, { @@ -30028,9 +30016,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 2230.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 2216.95, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30045,9 +30033,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 388.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30056,9 +30044,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 370.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 13754187, @@ -30091,9 +30079,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1067.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15813703, @@ -30108,9 +30096,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 334.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -30131,9 +30119,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1134.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30149,14 +30137,14 @@ { "id": 15946127, "username": "hyperalchemy", - "totalCosts": 505, + "totalCosts": 490.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946127/medium/fb8809671278895b42cf50c752fd7bf2.png" }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 437.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -30195,9 +30183,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1490.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30206,9 +30194,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 725.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30217,9 +30205,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 288.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 287.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -30252,9 +30240,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 560.55, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30275,9 +30263,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1501.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1491.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15587175, @@ -30298,9 +30286,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 221.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30308,16 +30296,16 @@ "fileId": "2736", "contributors": [ { - "id": 14633448, - "username": "ilrado", - "totalCosts": 93.93, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633448/medium/00e36a91231d5f6980f4ea96c1f24ab9.jpg" + "id": 13461670, + "username": "Herbie_23", + "totalCosts": 82.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { - "id": 13461670, - "username": "GiorgioHerbie", + "id": 14633448, + "username": "ilrado", "totalCosts": 82.82, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633448/medium/00e36a91231d5f6980f4ea96c1f24ab9.jpg" }, { "id": 14665128, @@ -30332,9 +30320,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 238.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -30349,9 +30337,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 127.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14677210, @@ -30366,9 +30354,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 110.09, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -30383,9 +30371,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 67.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -30400,9 +30388,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 159.58, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14786554, @@ -30441,9 +30429,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 271.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -30464,9 +30452,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 324.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 313.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30475,9 +30463,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 35.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15051821, @@ -30498,9 +30486,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 391.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14313472, @@ -30545,9 +30533,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 4144.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 4116.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30568,9 +30556,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2369.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -30585,9 +30573,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 743.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 728.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -30602,9 +30590,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 3588.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -30619,9 +30607,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1821.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30642,9 +30630,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 3671.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 3660.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30660,19 +30648,19 @@ { "id": 14686678, "username": "ametel01", - "totalCosts": 1235.23, + "totalCosts": 1212, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14686678/medium/42da64bc8743fcf14d7efc7aaebbd99f.jpeg" }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1195.84, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14648126, "username": "vittoria.f", - "totalCosts": 123.22, + "totalCosts": 122.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14648126/medium/7a5e23a63ce4d36422d0adb108c16ea0.png" } ] @@ -30688,9 +30676,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 94.94, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30699,9 +30687,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 815.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -30716,9 +30704,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 311.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -30739,9 +30727,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 660.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, @@ -30756,9 +30744,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 737.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 729.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -30791,9 +30779,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1029.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 13754187, @@ -30808,9 +30796,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 3939, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15503134, @@ -30843,9 +30831,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 3269.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30854,9 +30842,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 189.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14669508, @@ -30877,9 +30865,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 405.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15101201, @@ -30895,14 +30883,14 @@ { "id": 14633448, "username": "ilrado", - "totalCosts": 390.87, + "totalCosts": 385.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633448/medium/00e36a91231d5f6980f4ea96c1f24ab9.jpg" }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 147.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30911,9 +30899,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 738.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -30929,14 +30917,14 @@ { "id": 14633448, "username": "ilrado", - "totalCosts": 622.16, + "totalCosts": 617.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633448/medium/00e36a91231d5f6980f4ea96c1f24ab9.jpg" }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 235.33, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -30951,9 +30939,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 105.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -30962,9 +30950,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 209.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14669508, @@ -30985,9 +30973,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 443.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31020,9 +31008,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 748.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -31067,9 +31055,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 117.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31090,9 +31078,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1213.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 975.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31125,9 +31113,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 657.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -31142,9 +31130,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1347.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31165,9 +31153,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 379.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31176,9 +31164,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 859.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31187,9 +31175,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2128.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15124743, @@ -31210,9 +31198,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 3524.9, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31239,9 +31227,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 672.66, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31262,9 +31250,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1000.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -31279,9 +31267,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1973.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15129553, @@ -31320,9 +31308,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31331,9 +31319,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1540.25, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14313472, @@ -31360,9 +31348,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 658.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15503134, @@ -31407,9 +31395,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1648.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31424,9 +31412,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2153.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31435,9 +31423,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1596.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31446,9 +31434,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 383.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31457,9 +31445,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 349.46, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15101201, @@ -31474,9 +31462,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1242.3, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14313472, @@ -31497,9 +31485,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 864.56, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31525,9 +31513,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1285.73, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31536,9 +31524,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 419.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31547,9 +31535,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1355.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31558,9 +31546,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 738.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31569,9 +31557,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 4393.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 16073436, @@ -31586,9 +31574,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 3512.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31597,9 +31585,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 4074.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31614,9 +31602,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 390.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15133131, @@ -31631,9 +31619,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 471.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31659,9 +31647,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1027.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31670,9 +31658,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 449.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15956409, @@ -31687,9 +31675,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2709.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31698,9 +31686,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1050.4, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1015.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31709,9 +31697,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 649.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31726,9 +31714,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 11.11, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31737,9 +31725,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 806.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 16073436, @@ -31754,9 +31742,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1008.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31765,9 +31753,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 987.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -31788,9 +31776,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 738.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14786554, @@ -31811,9 +31799,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 8109.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -31840,9 +31828,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 892.84, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 875.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14633448, @@ -31863,9 +31851,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 78.78, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -31874,9 +31862,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 510.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 497.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14946101, @@ -31891,9 +31879,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 851.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -31914,9 +31902,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 544.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14684140, @@ -31943,9 +31931,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 113.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -31990,9 +31978,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 262.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -32031,9 +32019,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 267.65, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, @@ -32060,9 +32048,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 40.4, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -32077,9 +32065,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -32118,9 +32106,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 585.8, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -32134,18 +32122,18 @@ "totalCosts": 152.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15747281/medium/cb37f93c60bd9c25699ee6aa672c922c.jpeg" }, - { - "id": 14313472, - "username": "ntotao", - "totalCosts": 31.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14313472/medium/c09ed4450f8a65235c896745bd06abd0.jpg" - }, { "id": 15498288, "username": "Zybe22", "totalCosts": 26.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15498288/medium/e7f86893ff7c5de3946947caa3eae9a3_default.png" }, + { + "id": 14313472, + "username": "ntotao", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14313472/medium/c09ed4450f8a65235c896745bd06abd0.jpg" + }, { "id": 15266690, "username": "Fuliggine", @@ -32165,9 +32153,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 297.95, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15757687, @@ -32200,9 +32188,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 645.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15725045, @@ -32217,9 +32205,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 320.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32228,9 +32216,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 371.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32239,9 +32227,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 656.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15757333, @@ -32262,9 +32250,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 153.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -32291,9 +32279,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 145.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14600024, @@ -32344,9 +32332,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 39.39, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15630617, @@ -32385,9 +32373,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2466.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32396,9 +32384,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 384.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 348.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15120611, @@ -32461,9 +32449,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1808.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1796.79, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14560192, @@ -32484,9 +32472,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 495.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 492.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32501,9 +32489,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 431.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 406.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32512,9 +32500,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 2039.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 2002.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -32547,9 +32535,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1486.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32558,9 +32546,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1055.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32569,9 +32557,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 669.63, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 666.6, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32580,9 +32568,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 781.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32591,9 +32579,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 853.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 850.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32602,9 +32590,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1733.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32613,9 +32601,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2055.35, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32624,9 +32612,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 572.67, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 569.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32635,9 +32623,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1286.74, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1256.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32652,9 +32640,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 249.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14665128, @@ -32676,14 +32664,14 @@ { "id": 15266690, "username": "Fuliggine", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15266690/medium/beb929d96ab06718fce198051fdffaae.jpg" }, { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 87.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 77.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15197398, @@ -32698,9 +32686,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1334.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32709,9 +32697,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 594.89, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14657804, @@ -32762,9 +32750,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 933.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 929.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 13754187, @@ -32779,9 +32767,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 2014.95, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 2012.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -32796,9 +32784,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1964.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 13754187, @@ -32819,9 +32807,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1459.45, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32831,14 +32819,14 @@ { "id": 14665128, "username": "Pierlu_be", - "totalCosts": 6786.19, + "totalCosts": 6767, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665128/medium/5fdea361fcd2c73a52533056e2709694_default.png" }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2980.51, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 14686678, @@ -32889,9 +32877,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 1302.9, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 1278.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15747281, @@ -32953,9 +32941,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1596.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15185884, @@ -32976,9 +32964,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 122.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -32987,9 +32975,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 4116.76, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15721133, @@ -33010,9 +32998,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2158.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33021,9 +33009,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1744.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33061,9 +33049,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1321.08, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33089,9 +33077,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 400.97, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33100,9 +33088,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 656.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33111,9 +33099,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 389.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33122,9 +33110,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 681.75, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "username": "Herbie_23", + "totalCosts": 668.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33144,9 +33132,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 173.72, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, @@ -33161,9 +33149,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33172,9 +33160,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 217.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33194,9 +33182,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1505.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15266690, @@ -33228,9 +33216,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 2991.62, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33262,9 +33250,9 @@ "contributors": [ { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 1463.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" } ] }, @@ -33285,9 +33273,9 @@ }, { "id": 13461670, - "username": "GiorgioHerbie", + "username": "Herbie_23", "totalCosts": 22.22, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" }, { "id": 15946127, @@ -33314,7 +33302,7 @@ { "id": 15266690, "username": "Fuliggine", - "totalCosts": 1607.92, + "totalCosts": 1602.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15266690/medium/beb929d96ab06718fce198051fdffaae.jpg" }, { @@ -33340,18 +33328,18 @@ "totalCosts": 424.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13754187/medium/37de2106b564cdd5431a9c1f7e091087.png" }, + { + "id": 13461670, + "username": "Herbie_23", + "totalCosts": 54.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/c9291075edb8582a7efe26fe983237e1.jpg" + }, { "id": 15266690, "username": "Fuliggine", - "totalCosts": 59.59, + "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15266690/medium/beb929d96ab06718fce198051fdffaae.jpg" }, - { - "id": 13461670, - "username": "GiorgioHerbie", - "totalCosts": 54.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13461670/medium/9093f2d7047615a270b4c00bc2abd595_default.png" - }, { "id": 16171038, "username": "bianc8", @@ -33382,7 +33370,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 582.77, + "totalCosts": 525.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -33493,7 +33481,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 17.17, + "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -33579,13 +33567,13 @@ { "id": 15169660, "username": "kurotaky", - "totalCosts": 464.6, + "totalCosts": 441.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15169660/medium/05e3e729e62f12747a7d06b8f27d3cf5.jpeg" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 122.21, + "totalCosts": 115.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -33843,7 +33831,7 @@ { "id": 15275810, "username": "sakamotomasayuki7", - "totalCosts": 1446.32, + "totalCosts": 1394.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15275810/medium/3af3394e8787b462699f2e56425983a1.jpeg" }, { @@ -33861,7 +33849,7 @@ { "id": 15384904, "username": "_Sakura_", - "totalCosts": 94.94, + "totalCosts": 91.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15384904/medium/c2c00eb3c10ba62f1b8fee328e145fa6_default.png" } ] @@ -33872,7 +33860,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 488.84, + "totalCosts": 490.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -33932,6 +33920,12 @@ "username": "shoyu", "totalCosts": 17.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14730036/medium/3f53daf0320c8412a99de867a0ca6d2c_default.png" + }, + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] }, @@ -33941,7 +33935,7 @@ { "id": 15680077, "username": "miyamo", - "totalCosts": 1524.09, + "totalCosts": 1493.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680077/medium/a9db402339c4ac996a32133a844692ef_default.png" }, { @@ -33953,7 +33947,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 27.27, + "totalCosts": 56.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -34135,13 +34129,13 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 2409.86, + "totalCosts": 2418.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { "id": 15460936, "username": "tsukky", - "totalCosts": 747.4, + "totalCosts": 738.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15460936/medium/99ed6b4051dfcad3d1fa3e4cfaa17073.JPG" }, { @@ -34304,7 +34298,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 466.62, + "totalCosts": 500.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -34340,7 +34334,7 @@ { "id": 15135089, "username": "indwm", - "totalCosts": 17.17, + "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135089/medium/ad0dde7b6943eb1bdc2b8c64223dd070.png" }, { @@ -34573,7 +34567,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1975.56, + "totalCosts": 1987.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -34601,7 +34595,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1651.35, + "totalCosts": 1567.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -34996,13 +34990,13 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 3497.63, + "totalCosts": 3460.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { "id": 14880458, "username": "sekisanchi", - "totalCosts": 746.39, + "totalCosts": 741.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880458/medium/6b71180a926d6213e33b21e50df8e409_default.png" }, { @@ -35014,7 +35008,7 @@ { "id": 14395884, "username": "Frodo821", - "totalCosts": 129.28, + "totalCosts": 127.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14395884/medium/be6488d24fd9f5ff7ac7d461e6cd6758.jpeg" }, { @@ -35031,7 +35025,7 @@ { "id": 15458166, "username": "tomohata.eth", - "totalCosts": 2212.91, + "totalCosts": 2199.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15458166/medium/0ea3114dd4715ff746f20d57e43551e7.png" }, { @@ -35170,7 +35164,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 673.67, + "totalCosts": 672.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -35187,7 +35181,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 725.18, + "totalCosts": 741.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -35204,7 +35198,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 3538.03, + "totalCosts": 3537.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -35238,13 +35232,13 @@ { "id": 14880458, "username": "sekisanchi", - "totalCosts": 161.6, + "totalCosts": 150.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880458/medium/6b71180a926d6213e33b21e50df8e409_default.png" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 94.94, + "totalCosts": 83.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -35471,7 +35465,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 331.28, + "totalCosts": 320.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -35702,13 +35696,13 @@ { "id": 14880458, "username": "sekisanchi", - "totalCosts": 688.82, + "totalCosts": 665.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880458/medium/6b71180a926d6213e33b21e50df8e409_default.png" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 382.79, + "totalCosts": 377.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -35888,13 +35882,13 @@ { "id": 14395884, "username": "Frodo821", - "totalCosts": 452.48, + "totalCosts": 444.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14395884/medium/be6488d24fd9f5ff7ac7d461e6cd6758.jpeg" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 289.87, + "totalCosts": 297.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -36044,13 +36038,13 @@ { "id": 14880458, "username": "sekisanchi", - "totalCosts": 348.45, + "totalCosts": 345.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880458/medium/6b71180a926d6213e33b21e50df8e409_default.png" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 241.39, + "totalCosts": 238.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -36090,19 +36084,19 @@ { "id": 14880458, "username": "sekisanchi", - "totalCosts": 534.29, + "totalCosts": 531.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14880458/medium/6b71180a926d6213e33b21e50df8e409_default.png" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 470.66, + "totalCosts": 467.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { "id": 14708760, "username": "hypebeans", - "totalCosts": 91.91, + "totalCosts": 89.89, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/c99d5e08a676eaebe6f2a383a81222e1.jpg" }, { @@ -36212,7 +36206,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 684.78, + "totalCosts": 697.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -36318,37 +36312,37 @@ { "id": 15341508, "username": "hesoponyo", - "totalCosts": 802.95, + "totalCosts": 661.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15341508/medium/070055fd80d21a5f4b26e37dd49cd0d0.png" }, { "id": 14984219, "username": "James100", - "totalCosts": 632.26, + "totalCosts": 587.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14984219/medium/bda27d10133f63c72881c79071f28657_default.png" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 304.01, + "totalCosts": 251.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { "id": 15070235, "username": "akibe", - "totalCosts": 265.63, + "totalCosts": 199.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15070235/medium/49c7580ba53089f63456e5b0a7046950_default.png" }, { "id": 15039393, "username": "lvengda", - "totalCosts": 228.26, + "totalCosts": 146.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15039393/medium/98012abbf3c829db90925104318abce4.jpeg" }, { "id": 15025653, "username": "TsubTsub", - "totalCosts": 128.27, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15025653/medium/0d02a0fdb2070d4712926c3421364db2_default.png" }, { @@ -37016,7 +37010,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1032.22, + "totalCosts": 1025.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -37199,7 +37193,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 902.94, + "totalCosts": 901.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37216,7 +37210,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 343.4, + "totalCosts": 356.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -37253,18 +37247,18 @@ { "fileId": "6183", "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 801.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + }, { "id": 15660341, "username": "toshihikokamio", "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15660341/medium/49268d587952510117b47cfa380006d9.png" }, - { - "id": 15208868, - "username": "HiroyukiNaito", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" - }, { "id": 14730036, "username": "shoyu", @@ -37449,7 +37443,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 41.41, + "totalCosts": 63.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37501,7 +37495,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 379.76, + "totalCosts": 380.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37542,7 +37536,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 368.65, + "totalCosts": 334.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37577,7 +37571,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 2065.45, + "totalCosts": 2031.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37623,13 +37617,13 @@ { "id": 14103339, "username": "ryoji.imai", - "totalCosts": 332.29, + "totalCosts": 328.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14103339/medium/fc832d678cca1c9a43f019d8a819f41c.JPG" }, { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 85.85, + "totalCosts": 75.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37693,7 +37687,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 298.96, + "totalCosts": 478.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37734,7 +37728,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 353.5, + "totalCosts": 773.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" }, { @@ -37763,7 +37757,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1743.26, + "totalCosts": 2002.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -37803,7 +37797,7 @@ { "id": 15460936, "username": "tsukky", - "totalCosts": 8094.14, + "totalCosts": 8074.95, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15460936/medium/99ed6b4051dfcad3d1fa3e4cfaa17073.JPG" }, { @@ -37916,8 +37910,14 @@ { "id": 15680077, "username": "miyamo", - "totalCosts": 3235.03, + "totalCosts": 3210.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680077/medium/a9db402339c4ac996a32133a844692ef_default.png" + }, + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] }, @@ -37944,7 +37944,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 814.06, + "totalCosts": 869.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38073,7 +38073,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 495.91, + "totalCosts": 494.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38084,7 +38084,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1105.95, + "totalCosts": 1107.97, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38117,7 +38117,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 666.6, + "totalCosts": 668.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38139,7 +38139,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 850.42, + "totalCosts": 852.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38161,7 +38161,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 589.84, + "totalCosts": 588.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38172,7 +38172,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1286.74, + "totalCosts": 1294.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38273,7 +38273,7 @@ { "id": 15530275, "username": "emunwon", - "totalCosts": 410.06, + "totalCosts": 407.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15530275/medium/116c0ade79ef3b6e615e1db568c016cf_default.png" }, { @@ -38302,7 +38302,7 @@ { "id": 15430302, "username": "kwangtaekim", - "totalCosts": 1934.15, + "totalCosts": 1919, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430302/medium/705b3a29a93430236982b318c9131fcf.png" }, { @@ -38378,7 +38378,7 @@ { "id": 15442454, "username": "Im-SpiETH", - "totalCosts": 1640.24, + "totalCosts": 1611.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15442454/medium/860696ab89262fe98a0b888882d2b2da_default.png" }, { @@ -38459,7 +38459,7 @@ { "id": 15105599, "username": "SaturnPiece", - "totalCosts": 1816.99, + "totalCosts": 1810.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15105599/medium/a3e031fc91bbbf728f3bb5dd384e8400_default.png" }, { @@ -38479,6 +38479,12 @@ { "fileId": "5565", "contributors": [ + { + "id": 13903009, + "username": "igntsh", + "totalCosts": 399.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13903009/medium/04ae0d1fd930da54d2c40b2d5e37e31c.jpg" + }, { "id": 13471138, "username": "KyungwonPark", @@ -38540,13 +38546,13 @@ { "id": 13471138, "username": "KyungwonPark", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" }, { "id": 13997401, "username": "Windfactory", - "totalCosts": 92.92, + "totalCosts": 78.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13997401/medium/2ab4ff5d8770f710be0d12e4ec9f2123.png" } ] @@ -38662,7 +38668,7 @@ { "id": 15430302, "username": "kwangtaekim", - "totalCosts": 1234.22, + "totalCosts": 1232.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430302/medium/705b3a29a93430236982b318c9131fcf.png" }, { @@ -38732,7 +38738,7 @@ { "id": 15430302, "username": "kwangtaekim", - "totalCosts": 13633.99, + "totalCosts": 13614.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15430302/medium/705b3a29a93430236982b318c9131fcf.png" }, { @@ -38831,7 +38837,7 @@ { "id": 15569767, "username": "malayalam_translation", - "totalCosts": 158.57, + "totalCosts": 122.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15569767/medium/8d106f80c05286f2e679e742acb2f82c_default.png" }, { @@ -38860,7 +38866,7 @@ { "id": 15569767, "username": "malayalam_translation", - "totalCosts": 1802.85, + "totalCosts": 1748.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15569767/medium/8d106f80c05286f2e679e742acb2f82c_default.png" }, { @@ -38902,7 +38908,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 446.42, + "totalCosts": 440.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -38952,7 +38958,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 608.02, + "totalCosts": 577.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -38974,7 +38980,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 2180.59, + "totalCosts": 2165.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -39018,7 +39024,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 2040.2, + "totalCosts": 2034.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -39058,7 +39064,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 115.14, + "totalCosts": 75.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" }, { @@ -39121,7 +39127,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 398.95, + "totalCosts": 380.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -39154,7 +39160,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 587.82, + "totalCosts": 583.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -39165,7 +39171,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 1818, + "totalCosts": 1813.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" } ] @@ -39182,7 +39188,7 @@ { "id": 15958911, "username": "charlaiz", - "totalCosts": 453.49, + "totalCosts": 425.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15958911/medium/8f11adb77af544d9fd33ec842e035832_default.png" }, { @@ -39221,13 +39227,13 @@ { "id": 15284800, "username": "msliwinski123", - "totalCosts": 633.27, + "totalCosts": 575.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" }, { "id": 15894449, "username": "wosek_", - "totalCosts": 548.43, + "totalCosts": 490.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -39250,7 +39256,7 @@ { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 631.25, + "totalCosts": 617.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" }, { @@ -39285,7 +39291,7 @@ { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 2079.59, + "totalCosts": 2064.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" }, { @@ -39343,7 +39349,7 @@ { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 1635.19, + "totalCosts": 1606.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" }, { @@ -39865,7 +39871,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 199.98, + "totalCosts": 188.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { @@ -39882,7 +39888,7 @@ { "id": 14788394, "username": "k-sad", - "totalCosts": 588.83, + "totalCosts": 577.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14788394/medium/d36035c2e171b8c0a75df7a938eceadb.jpg" }, { @@ -39911,7 +39917,7 @@ { "id": 14802836, "username": "Ryeore", - "totalCosts": 499.95, + "totalCosts": 488.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" }, { @@ -39957,7 +39963,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 240.38, + "totalCosts": 229.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { @@ -40003,7 +40009,7 @@ { "id": 14802836, "username": "Ryeore", - "totalCosts": 149.48, + "totalCosts": 138.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14802836/medium/5c9792c4809bea937bb80c4743d66e5c_default.png" }, { @@ -40020,7 +40026,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 121.2, + "totalCosts": 110.09, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" } ] @@ -40070,7 +40076,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 1365.52, + "totalCosts": 1334.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" } ] @@ -40161,13 +40167,13 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 263.61, + "totalCosts": 255.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { "id": 15284800, "username": "msliwinski123", - "totalCosts": 211.09, + "totalCosts": 203.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" } ] @@ -40217,7 +40223,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 396.93, + "totalCosts": 391.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { @@ -40240,7 +40246,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 627.21, + "totalCosts": 622.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { @@ -40514,7 +40520,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 1011.01, + "totalCosts": 975.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { @@ -40617,7 +40623,7 @@ { "id": 14775946, "username": "Beas", - "totalCosts": 383.8, + "totalCosts": 366.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14775946/medium/22ad4db44fa2f657ec257775cddc899c.jpg" }, { @@ -40894,13 +40900,13 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 410.06, + "totalCosts": 406.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { "id": 15771025, "username": "Andrzej1072", - "totalCosts": 72.72, + "totalCosts": 62.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15771025/medium/e70215b910c59f0fa39516bbbe11c35d.png" } ] @@ -41002,7 +41008,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 728.21, + "totalCosts": 722.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -41082,7 +41088,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 1991.72, + "totalCosts": 1986.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] @@ -41093,7 +41099,7 @@ { "id": 15284800, "username": "msliwinski123", - "totalCosts": 594.89, + "totalCosts": 564.59, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284800/medium/a5707bdd7287b30379bd9c3cb122ef9b.png" }, { @@ -41116,7 +41122,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 266.64, + "totalCosts": 772.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -41133,13 +41139,13 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 1740.23, + "totalCosts": 1718.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { "id": 15966401, "username": "daniel.zarzecki047", - "totalCosts": 392.89, + "totalCosts": 370.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966401/medium/fa1d0a5129bf7a77c98232488dfc9d98.png" }, { @@ -41291,7 +41297,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 889.81, + "totalCosts": 885.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -41308,7 +41314,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 2059.39, + "totalCosts": 2057.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] @@ -41347,7 +41353,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 3235.03, + "totalCosts": 3210.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -41391,7 +41397,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 535.3, + "totalCosts": 477.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -41496,7 +41502,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 144.43, + "totalCosts": 138.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -41618,19 +41624,19 @@ { "id": 15116197, "username": "marciob", - "totalCosts": 422.18, + "totalCosts": 410.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15116197/medium/defe31fc631358c105140f44b22e84f7.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 124.23, + "totalCosts": 117.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15114963, "username": "tiagoyonamine.eth", - "totalCosts": 46.46, + "totalCosts": 35.35, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" }, { @@ -41955,25 +41961,25 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 1067.57, + "totalCosts": 1059.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 615.09, + "totalCosts": 602.97, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { "id": 15728117, "username": "alnrsnd", - "totalCosts": 482.78, + "totalCosts": 461.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15728117/medium/7631d966177edc87bcb5a0cbd146ca21_default.png" }, { "id": 15269576, "username": "camolina", - "totalCosts": 459.55, + "totalCosts": 437.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15269576/medium/1a3566292dbbb3d62c42cba932c6509c_default.png" }, { @@ -42019,7 +42025,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 2123.02, + "totalCosts": 2107.87, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -42077,7 +42083,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 1106.96, + "totalCosts": 1076.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -42247,7 +42253,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 754.47, + "totalCosts": 745.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -42404,7 +42410,7 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 784.77, + "totalCosts": 745.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { @@ -42438,7 +42444,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 2040.2, + "totalCosts": 2021.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -42505,12 +42511,6 @@ "totalCosts": 32.32, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733026/medium/ffb6aa67fea863e4898aa8a6e5c69e87.jpeg" }, - { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" - }, { "id": 15661337, "username": "dariovlopes", @@ -42529,6 +42529,12 @@ "totalCosts": 12.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14950197/medium/20d99cde077abaee189a2dc7908d26f2.png" }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, { "id": 14247352, "username": "borja_reverter", @@ -42884,7 +42890,7 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 1573.58, + "totalCosts": 1489.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { @@ -43235,7 +43241,7 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 1777.6, + "totalCosts": 1764.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { @@ -43253,13 +43259,13 @@ { "id": 15036833, "username": "Cubano.brito", - "totalCosts": 77.77, + "totalCosts": 75.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15036833/medium/4988573ecbd20a37fe3504a4fd98b573_default.png" }, { "id": 14247352, "username": "borja_reverter", - "totalCosts": 47.47, + "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" }, { @@ -43276,7 +43282,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 2332.09, + "totalCosts": 2318.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] @@ -43378,7 +43384,7 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 526.21, + "totalCosts": 512.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { @@ -43465,7 +43471,7 @@ { "id": 15121067, "username": "DiegoCabral", - "totalCosts": 39.39, + "totalCosts": 38.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" }, { @@ -43587,7 +43593,7 @@ { "id": 14814106, "username": "agatavital13", - "totalCosts": 99.99, + "totalCosts": 88.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814106/medium/4a3a75b77ba9e8f3ed12460e0191e03b_default.png" }, { @@ -43649,7 +43655,7 @@ { "id": 15038969, "username": "lalemcar260", - "totalCosts": 253.51, + "totalCosts": 242.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15038969/medium/ba1eb8218fc49239854c28720092989e.png" }, { @@ -43730,7 +43736,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 307.04, + "totalCosts": 295.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] @@ -43799,7 +43805,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 3386.53, + "totalCosts": 3359.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -43863,7 +43869,7 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 713.06, + "totalCosts": 697.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { @@ -43920,7 +43926,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 3325.93, + "totalCosts": 3314.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -43943,7 +43949,7 @@ { "id": 14667626, "username": "matheusrrugolo", - "totalCosts": 457.53, + "totalCosts": 451.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14667626/medium/8f3c59f10649fb1abbd53bee5614aa2b.jpeg" }, { @@ -44433,7 +44439,7 @@ { "id": 13855929, "username": "gabriel.silva", - "totalCosts": 452.48, + "totalCosts": 407.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" }, { @@ -44912,17 +44918,17 @@ "totalCosts": 178.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, - { - "id": 15114963, - "username": "tiagoyonamine.eth", - "totalCosts": 31.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" - }, { "id": 15515516, "username": "MCreimer", "totalCosts": 30.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" } ] }, @@ -45147,7 +45153,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 316.13, + "totalCosts": 279.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -45206,7 +45212,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 1589.74, + "totalCosts": 1553.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -45347,13 +45353,13 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 79.79, + "totalCosts": 69.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -45458,7 +45464,7 @@ { "id": 15226778, "username": "paulogio", - "totalCosts": 513.08, + "totalCosts": 509.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { @@ -45481,7 +45487,7 @@ { "id": 15226778, "username": "paulogio", - "totalCosts": 1693.77, + "totalCosts": 1691.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15226778/medium/1bed9c865119e5246c9ac5cc55851dae_default.png" }, { @@ -45598,7 +45604,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 9210.19, + "totalCosts": 9191, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { @@ -45687,7 +45693,7 @@ { "id": 13986387, "username": "rafarocha", - "totalCosts": 990.81, + "totalCosts": 966.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] @@ -45715,7 +45721,7 @@ { "id": 15515516, "username": "MCreimer", - "totalCosts": 889.81, + "totalCosts": 884.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] @@ -45823,7 +45829,7 @@ { "id": 15350616, "username": "Carlos_Silva", - "totalCosts": 1256.44, + "totalCosts": 1244.32, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" }, { @@ -45846,7 +45852,7 @@ { "id": 15350616, "username": "Carlos_Silva", - "totalCosts": 496.92, + "totalCosts": 493.89, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] @@ -45993,7 +45999,7 @@ { "id": 15350616, "username": "Carlos_Silva", - "totalCosts": 1286.74, + "totalCosts": 1256.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] @@ -46111,7 +46117,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 468.64, + "totalCosts": 445.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -46252,7 +46258,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 66.66, + "totalCosts": 60.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -46471,7 +46477,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 1162.51, + "totalCosts": 1152.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -46548,7 +46554,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 196.95, + "totalCosts": 185.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" }, { @@ -46751,13 +46757,13 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 1368.55, + "totalCosts": 1337.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" }, { "id": 12804952, "username": "imgelu", - "totalCosts": 137.36, + "totalCosts": 134.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12804952/medium/59d5d165d5b422c57908e7797d3b83ee.jpg" } ] @@ -46836,7 +46842,7 @@ { "id": 12804952, "username": "imgelu", - "totalCosts": 473.69, + "totalCosts": 465.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12804952/medium/59d5d165d5b422c57908e7797d3b83ee.jpg" } ] @@ -46908,7 +46914,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 461.57, + "totalCosts": 456.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -46919,7 +46925,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 685.79, + "totalCosts": 680.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -46991,7 +46997,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 1060.5, + "totalCosts": 858.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" }, { @@ -47348,7 +47354,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 1031.21, + "totalCosts": 995.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -47436,7 +47442,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 1034.24, + "totalCosts": 1017.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -47458,7 +47464,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 487.83, + "totalCosts": 475.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -47535,7 +47541,7 @@ { "id": 14087195, "username": "nicklcanada", - "totalCosts": 1577.62, + "totalCosts": 1571.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14087195/medium/810aea3ef8ba145e88db17a73c95a4b8_default.png" } ] @@ -47658,7 +47664,7 @@ { "id": 14514124, "username": "ViktorOn", - "totalCosts": 311.08, + "totalCosts": 305.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14514124/medium/fa0297b182b72fbcf006daba457ef1a3.png" }, { @@ -47798,7 +47804,7 @@ { "id": 14514124, "username": "ViktorOn", - "totalCosts": 558.53, + "totalCosts": 528.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14514124/medium/fa0297b182b72fbcf006daba457ef1a3.png" }, { @@ -48110,7 +48116,7 @@ { "id": 14514124, "username": "ViktorOn", - "totalCosts": 20.2, + "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14514124/medium/fa0297b182b72fbcf006daba457ef1a3.png" }, { @@ -48528,6 +48534,12 @@ "totalCosts": 40.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14884558/medium/0094ad75d25cfe8961a0e8318ff5d7f8.jpg" }, + { + "id": 15720271, + "username": "storming_heaven", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15720271/medium/8af1a5867d08e0a56b993cc13a0cd15f.png" + }, { "id": 14724864, "username": "deepweed", @@ -48548,7 +48560,7 @@ { "id": 15947515, "username": "blockson", - "totalCosts": 344.41, + "totalCosts": 343.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947515/medium/52b0b3490fcf6940d9027ef2f32a424b.jpeg" }, { @@ -48581,6 +48593,12 @@ "totalCosts": 8.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16041772/medium/fa169700ad14f27bdb85e5e6b2590e7b.png" }, + { + "id": 15720271, + "username": "storming_heaven", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15720271/medium/8af1a5867d08e0a56b993cc13a0cd15f.png" + }, { "id": 14514124, "username": "ViktorOn", @@ -48806,7 +48824,7 @@ { "id": 14514124, "username": "ViktorOn", - "totalCosts": 498.94, + "totalCosts": 492.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14514124/medium/fa0297b182b72fbcf006daba457ef1a3.png" }, { @@ -48838,6 +48856,12 @@ "totalCosts": 230.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966943/medium/0d340104d53d3ff4df1c7c2412e8c86e_default.png" }, + { + "id": 15720271, + "username": "storming_heaven", + "totalCosts": 106.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15720271/medium/8af1a5867d08e0a56b993cc13a0cd15f.png" + }, { "id": 16090810, "username": "ShurikSl", @@ -48894,7 +48918,7 @@ { "id": 15967233, "username": "jasminesprout", - "totalCosts": 710.03, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" }, { @@ -48977,7 +49001,7 @@ { "id": 15967233, "username": "jasminesprout", - "totalCosts": 2283.61, + "totalCosts": 2229.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" }, { @@ -49023,19 +49047,19 @@ { "id": 15967233, "username": "jasminesprout", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" }, { "id": 15214436, "username": "cheremmmisin", - "totalCosts": 60.6, + "totalCosts": 58.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15214436/medium/cebd8b7747a8b3ae790e25828eb135ed_default.png" }, { "id": 15206754, "username": "nixorn", - "totalCosts": 19.19, + "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15206754/medium/1f6bb058858c9608582b83fe050bdf67.jpeg" }, { @@ -49093,7 +49117,7 @@ { "id": 15619839, "username": "mediaquest", - "totalCosts": 1777.6, + "totalCosts": 1762.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15619839/medium/99c14ce4e8161f6b077fa0849ac4c5b0.png" }, { @@ -49152,7 +49176,7 @@ { "id": 15566151, "username": "AlexanderSh", - "totalCosts": 1191.8, + "totalCosts": 1163.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15566151/medium/2044a8dd6ae21fc4f7d8a8dad0190230_default.png" }, { @@ -49487,7 +49511,7 @@ { "id": 15967233, "username": "jasminesprout", - "totalCosts": 651.45, + "totalCosts": 649.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" }, { @@ -49564,7 +49588,7 @@ { "id": 14514124, "username": "ViktorOn", - "totalCosts": 34.34, + "totalCosts": 30.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14514124/medium/fa0297b182b72fbcf006daba457ef1a3.png" }, { @@ -49604,7 +49628,7 @@ { "id": 15763855, "username": "dovbyshbgd", - "totalCosts": 3222.91, + "totalCosts": 3198.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15763855/medium/5b59dc54e26664f82eab09a76961eaf7.png" }, { @@ -49638,7 +49662,7 @@ { "id": 15947515, "username": "blockson", - "totalCosts": 1973.54, + "totalCosts": 1968.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947515/medium/52b0b3490fcf6940d9027ef2f32a424b.jpeg" }, { @@ -49690,13 +49714,13 @@ { "id": 15967233, "username": "jasminesprout", - "totalCosts": 1758.41, + "totalCosts": 1746.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" }, { "id": 15763855, "username": "dovbyshbgd", - "totalCosts": 1500.86, + "totalCosts": 1488.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15763855/medium/5b59dc54e26664f82eab09a76961eaf7.png" }, { @@ -49793,7 +49817,7 @@ { "id": 15763855, "username": "dovbyshbgd", - "totalCosts": 672.66, + "totalCosts": 669.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15763855/medium/5b59dc54e26664f82eab09a76961eaf7.png" } ] @@ -49901,7 +49925,7 @@ { "id": 15763855, "username": "dovbyshbgd", - "totalCosts": 1247.35, + "totalCosts": 1217.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15763855/medium/5b59dc54e26664f82eab09a76961eaf7.png" }, { @@ -50026,7 +50050,7 @@ { "id": 14977831, "username": "PeterKecman", - "totalCosts": 1289.77, + "totalCosts": 1279.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14977831/medium/e1e3f150ce524a6cb88fccb8b4f52422.png" } ] @@ -50133,7 +50157,7 @@ { "id": 14977831, "username": "PeterKecman", - "totalCosts": 307.04, + "totalCosts": 301.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14977831/medium/e1e3f150ce524a6cb88fccb8b4f52422.png" } ] @@ -50144,7 +50168,7 @@ { "id": 14977831, "username": "PeterKecman", - "totalCosts": 497.93, + "totalCosts": 492.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14977831/medium/e1e3f150ce524a6cb88fccb8b4f52422.png" } ] @@ -50188,7 +50212,7 @@ { "id": 14977831, "username": "PeterKecman", - "totalCosts": 1622.06, + "totalCosts": 1616, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14977831/medium/e1e3f150ce524a6cb88fccb8b4f52422.png" } ] @@ -50247,7 +50271,7 @@ { "id": 14957177, "username": "joeurassa", - "totalCosts": 423.19, + "totalCosts": 417.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957177/medium/8323f79a3f73f2e723da72db082c0c22.jpg" } ] @@ -50290,7 +50314,7 @@ { "id": 14957177, "username": "joeurassa", - "totalCosts": 526.21, + "totalCosts": 502.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14957177/medium/8323f79a3f73f2e723da72db082c0c22.jpg" } ] @@ -50374,7 +50398,7 @@ { "id": 15908487, "username": "insidetrader", - "totalCosts": 513.08, + "totalCosts": 455.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15908487/medium/2dad4c49ee42d9df9633332d432e708e.jpg" }, { @@ -50440,12 +50464,6 @@ "username": "FDNTL", "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15396134/medium/12f9c36dce596d73529770adb87db81e.png" - }, - { - "id": 15310732, - "username": "0x_Ozan", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15310732/medium/0f00d931e8912ab78e17097621c79886_default.png" } ] }, @@ -50548,13 +50566,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 472.68, + "totalCosts": 449.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15532699, "username": "okurus", - "totalCosts": 64.64, + "totalCosts": 57.57, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15532699/medium/d28f6d5a89890907282d0a9ea5161174_default.png" }, { @@ -50866,13 +50884,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 523.18, + "totalCosts": 509.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 14690454, "username": "sekoman01", - "totalCosts": 350.47, + "totalCosts": 341.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14690454/medium/595a121d4a7427f7a21b75b32017c247.jpg" }, { @@ -50886,12 +50904,6 @@ "username": "Berke37", "totalCosts": 26.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14131653/medium/ff295534ec23d3428ba06f99e0fd50bb.jpg" - }, - { - "id": 15082707, - "username": "selcuk45", - "totalCosts": 7.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" } ] }, @@ -50945,18 +50957,18 @@ { "fileId": "7316", "contributors": [ - { - "id": 15357538, - "username": "yakupgurhangurcan", - "totalCosts": 914.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15357538/medium/c1b4eeb66ab399014df370502e9d2c6e.jpeg" - }, { "id": 14610740, "username": "realdeep", "totalCosts": 910.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610740/medium/970ca23cc257e03e86efefca66979df2.png" }, + { + "id": 15357538, + "username": "yakupgurhangurcan", + "totalCosts": 898.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15357538/medium/c1b4eeb66ab399014df370502e9d2c6e.jpeg" + }, { "id": 15396134, "username": "FDNTL", @@ -51004,12 +51016,6 @@ "username": "sekoman01", "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14690454/medium/595a121d4a7427f7a21b75b32017c247.jpg" - }, - { - "id": 15467576, - "username": "augur", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15467576/medium/471f881427c816c83c952446739e01d8_default.png" } ] }, @@ -51165,13 +51171,13 @@ { "id": 14131653, "username": "Berke37", - "totalCosts": 319.16, + "totalCosts": 310.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14131653/medium/ff295534ec23d3428ba06f99e0fd50bb.jpg" }, { "id": 15082707, "username": "selcuk45", - "totalCosts": 265.63, + "totalCosts": 256.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -51300,7 +51306,7 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 121.2, + "totalCosts": 115.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -51800,7 +51806,7 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 1444.3, + "totalCosts": 1433.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -51812,13 +51818,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 874.66, + "totalCosts": 864.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15964741, "username": "0xberil", - "totalCosts": 296.94, + "totalCosts": 294.92, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15964741/medium/f8fb148047395cf62c924755cb300f17_default.png" }, { @@ -51906,7 +51912,7 @@ { "id": 15963921, "username": "bicebaris", - "totalCosts": 654.48, + "totalCosts": 640.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15963921/medium/5ed57dad6d6d747e47d9378a8006ede1.jpg" }, { @@ -51947,7 +51953,7 @@ { "id": 15966007, "username": "0xselimc", - "totalCosts": 277.75, + "totalCosts": 276.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966007/medium/6008a158d741536a305a81bd295ab407.jpeg" }, { @@ -51988,7 +51994,7 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 3089.59, + "totalCosts": 3074.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -52099,7 +52105,7 @@ { "id": 14726116, "username": "salih.keyf", - "totalCosts": 21.21, + "totalCosts": 10.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14726116/medium/276f7773be59d0dd0ea1252e816006ca.jpg" }, { @@ -52302,7 +52308,7 @@ { "id": 14690454, "username": "sekoman01", - "totalCosts": 369.66, + "totalCosts": 358.55, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14690454/medium/595a121d4a7427f7a21b75b32017c247.jpg" }, { @@ -52383,13 +52389,13 @@ { "id": 14131653, "username": "Berke37", - "totalCosts": 2719.93, + "totalCosts": 2692.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14131653/medium/ff295534ec23d3428ba06f99e0fd50bb.jpg" }, { "id": 15966271, "username": "zeydrm", - "totalCosts": 2167.46, + "totalCosts": 2140.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966271/medium/bbeac0fbc387f8f821f861bc79c625fd.png" }, { @@ -52471,7 +52477,7 @@ { "id": 14610740, "username": "realdeep", - "totalCosts": 168.67, + "totalCosts": 153.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14610740/medium/970ca23cc257e03e86efefca66979df2.png" }, { @@ -52546,7 +52552,7 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 310.07, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -52587,13 +52593,13 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 901.93, + "totalCosts": 888.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { "id": 14996861, "username": "kaanmetu", - "totalCosts": 63.63, + "totalCosts": 51.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -52714,7 +52720,7 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 771.64, + "totalCosts": 763.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -52894,13 +52900,13 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 205.03, + "totalCosts": 204.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { "id": 14996861, "username": "kaanmetu", - "totalCosts": 98.98, + "totalCosts": 93.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -52929,7 +52935,7 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 349.46, + "totalCosts": 344.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -53133,13 +53139,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 467.63, + "totalCosts": 296.94, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15082707, "username": "selcuk45", - "totalCosts": 301.99, + "totalCosts": 282.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -53151,7 +53157,7 @@ { "id": 15964741, "username": "0xberil", - "totalCosts": 165.64, + "totalCosts": 130.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15964741/medium/f8fb148047395cf62c924755cb300f17_default.png" }, { @@ -53169,7 +53175,7 @@ { "id": 15084373, "username": "tarcanhursit", - "totalCosts": 48.48, + "totalCosts": 36.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084373/medium/63831adb2cf079020b094666d47417fd.jpg" }, { @@ -53966,7 +53972,7 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 251.49, + "totalCosts": 245.43, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -54119,7 +54125,7 @@ { "id": 15963921, "username": "bicebaris", - "totalCosts": 363.6, + "totalCosts": 327.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15963921/medium/5ed57dad6d6d747e47d9378a8006ede1.jpg" }, { @@ -54202,13 +54208,13 @@ { "id": 15467576, "username": "augur", - "totalCosts": 93.93, + "totalCosts": 39.39, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15467576/medium/471f881427c816c83c952446739e01d8_default.png" }, { "id": 15547847, "username": "sue-a", - "totalCosts": 59.59, + "totalCosts": 36.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15547847/medium/4df0260e4db384d42ff80a09e0a00d6e.jpeg" }, { @@ -54272,13 +54278,13 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 225.23, + "totalCosts": 215.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { "id": 15956471, "username": "nugen0x", - "totalCosts": 159.58, + "totalCosts": 155.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15956471/medium/0af49a07f4f83e5a5180858a4760868e.jpeg" }, { @@ -54383,7 +54389,7 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 484.8, + "totalCosts": 480.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -54418,7 +54424,7 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 1685.69, + "totalCosts": 1681.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -54482,7 +54488,7 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 8318.36, + "totalCosts": 8299.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { @@ -54641,7 +54647,7 @@ { "id": 15963921, "username": "bicebaris", - "totalCosts": 388.85, + "totalCosts": 383.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15963921/medium/5ed57dad6d6d747e47d9378a8006ede1.jpg" }, { @@ -54679,18 +54685,18 @@ "totalCosts": 226.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15810797/medium/fffa31f58ceab96c6db901b98fabf132.png" }, - { - "id": 15672817, - "username": "thebuzagi", - "totalCosts": 196.95, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15672817/medium/51945b15a89b4d9de324372227ac36de_default.png" - }, { "id": 15901569, "username": "ezraike", "totalCosts": 183.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15901569/medium/6f25011ba2194f82c502e04e4da44f22.png" }, + { + "id": 15672817, + "username": "thebuzagi", + "totalCosts": 168.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15672817/medium/51945b15a89b4d9de324372227ac36de_default.png" + }, { "id": 15709983, "username": "muggyw", @@ -55067,7 +55073,7 @@ { "id": 15963921, "username": "bicebaris", - "totalCosts": 1445.31, + "totalCosts": 1433.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15963921/medium/5ed57dad6d6d747e47d9378a8006ede1.jpg" }, { @@ -55266,7 +55272,7 @@ { "id": 15967667, "username": "iremkoci", - "totalCosts": 1286.74, + "totalCosts": 1256.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967667/medium/ac3a3d86bf757e56162d0faa7a03058d_default.png" } ] @@ -55366,7 +55372,7 @@ { "id": 14559918, "username": "Muzaffer015", - "totalCosts": 30.3, + "totalCosts": 27.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14559918/medium/72674bda7c61d3f06e65cc4d140e8af5_default.png" } ] @@ -55383,7 +55389,7 @@ { "id": 15966289, "username": "cinaryasemin", - "totalCosts": 611.05, + "totalCosts": 586.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966289/medium/4db7c2566069e455f22d0027dcd3bb06_default.png" }, { @@ -55469,7 +55475,7 @@ { "id": 15964741, "username": "0xberil", - "totalCosts": 681.75, + "totalCosts": 668.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15964741/medium/f8fb148047395cf62c924755cb300f17_default.png" } ] @@ -55635,7 +55641,7 @@ { "id": 15082707, "username": "selcuk45", - "totalCosts": 768.61, + "totalCosts": 740.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -55669,7 +55675,7 @@ { "id": 15966271, "username": "zeydrm", - "totalCosts": 1740.23, + "totalCosts": 1721.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966271/medium/bbeac0fbc387f8f821f861bc79c625fd.png" }, { @@ -55850,18 +55856,18 @@ "totalCosts": 923.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966007/medium/6008a158d741536a305a81bd295ab407.jpeg" }, - { - "id": 15966271, - "username": "zeydrm", - "totalCosts": 624.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966271/medium/bbeac0fbc387f8f821f861bc79c625fd.png" - }, { "id": 14131653, "username": "Berke37", "totalCosts": 617.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14131653/medium/ff295534ec23d3428ba06f99e0fd50bb.jpg" }, + { + "id": 15966271, + "username": "zeydrm", + "totalCosts": 540.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966271/medium/bbeac0fbc387f8f821f861bc79c625fd.png" + }, { "id": 14996861, "username": "kaanmetu", @@ -55981,7 +55987,7 @@ { "id": 15964741, "username": "0xberil", - "totalCosts": 386.83, + "totalCosts": 372.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15964741/medium/f8fb148047395cf62c924755cb300f17_default.png" }, { @@ -56004,19 +56010,19 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 1840.22, + "totalCosts": 1833.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15964741, "username": "0xberil", - "totalCosts": 474.7, + "totalCosts": 468.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15964741/medium/f8fb148047395cf62c924755cb300f17_default.png" }, { "id": 14131653, "username": "Berke37", - "totalCosts": 76.76, + "totalCosts": 70.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14131653/medium/ff295534ec23d3428ba06f99e0fd50bb.jpg" }, { @@ -56777,13 +56783,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 877.69, + "totalCosts": 842.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15082707, "username": "selcuk45", - "totalCosts": 169.68, + "totalCosts": 143.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -56904,13 +56910,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 806.99, + "totalCosts": 789.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15082707, "username": "selcuk45", - "totalCosts": 119.18, + "totalCosts": 102.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" }, { @@ -56933,13 +56939,13 @@ { "id": 14996861, "username": "kaanmetu", - "totalCosts": 680.74, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14996861/medium/eb0c9870f3f6317e6bfdc4a838e4fd5f.jpg" }, { "id": 15082707, "username": "selcuk45", - "totalCosts": 282.8, + "totalCosts": 272.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082707/medium/1422c6237f35e4d0e31e08554a233472.jpeg" } ] @@ -57056,18 +57062,18 @@ "totalCosts": 90.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15300418/medium/28c0af8820123db5d3a0cbf7bc72e713.jpeg" }, - { - "id": 14102529, - "username": "Nezila", - "totalCosts": 26.26, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14102529/medium/b68a69263d9c77b9078ffee899b05c02_default.png" - }, { "id": 15141064, "username": "OlhaHavr", "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15141064/medium/337f7507816e470c381c870e8ef54acb_default.png" }, + { + "id": 14102529, + "username": "Nezila", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14102529/medium/b68a69263d9c77b9078ffee899b05c02_default.png" + }, { "id": 15585897, "username": "rich_man", @@ -57145,19 +57151,19 @@ { "id": 15144404, "username": "addlemaddle096", - "totalCosts": 333.3, + "totalCosts": 322.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15144404/medium/27385dc54f5a7a5a602cb6ae4f9c409a.png" }, { "id": 15129995, "username": "alinabilyk", - "totalCosts": 142.41, + "totalCosts": 130.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15129995/medium/91175a3cc7e81c64ccdb5b22139074e3_default.png" }, { "id": 14102529, "username": "Nezila", - "totalCosts": 123.22, + "totalCosts": 116.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14102529/medium/b68a69263d9c77b9078ffee899b05c02_default.png" }, { @@ -57174,7 +57180,7 @@ { "id": 15551683, "username": "sashathefck", - "totalCosts": 473.69, + "totalCosts": 471.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15551683/medium/89389ac4c9211911a107017bd6784870.jpeg" }, { @@ -57209,7 +57215,7 @@ { "id": 15585897, "username": "rich_man", - "totalCosts": 715.08, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15585897/medium/fd7b02c0fe40afe5bb82dc812d16cf30_default.png" }, { @@ -57261,7 +57267,7 @@ { "id": 15804803, "username": "sun_dariia", - "totalCosts": 1635.19, + "totalCosts": 1606.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15804803/medium/e753b43a4cf480cd2a37c5795cdb83ba_default.png" }, { @@ -57404,18 +57410,18 @@ "totalCosts": 177.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14951861/medium/d5a9304f836af504ad35d48759c700ed.jpeg" }, - { - "id": 15143910, - "username": "vkulpinova6", - "totalCosts": 31.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15143910/medium/c51e6458948ee8d9c7deb546cbb114a6_default.png" - }, { "id": 15300418, "username": "globart", "totalCosts": 30.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15300418/medium/28c0af8820123db5d3a0cbf7bc72e713.jpeg" }, + { + "id": 15143910, + "username": "vkulpinova6", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15143910/medium/c51e6458948ee8d9c7deb546cbb114a6_default.png" + }, { "id": 14686790, "username": "Horus267", @@ -57600,13 +57606,13 @@ { "id": 15967233, "username": "jasminesprout", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" }, { "id": 14686790, "username": "Horus267", - "totalCosts": 85.85, + "totalCosts": 75.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14686790/medium/9695742f9165e3cf2585e31e74898270.png" } ] @@ -57845,7 +57851,7 @@ { "id": 15585897, "username": "rich_man", - "totalCosts": 580.75, + "totalCosts": 576.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15585897/medium/fd7b02c0fe40afe5bb82dc812d16cf30_default.png" }, { @@ -57874,7 +57880,7 @@ { "id": 15585897, "username": "rich_man", - "totalCosts": 1773.56, + "totalCosts": 1769.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15585897/medium/fd7b02c0fe40afe5bb82dc812d16cf30_default.png" }, { @@ -58021,7 +58027,7 @@ { "id": 15300418, "username": "globart", - "totalCosts": 93.93, + "totalCosts": 69.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15300418/medium/28c0af8820123db5d3a0cbf7bc72e713.jpeg" }, { @@ -58131,7 +58137,7 @@ { "id": 15369062, "username": "datiq9999", - "totalCosts": 13.13, + "totalCosts": 10.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15369062/medium/2f838f2a38f728234f3124c6515f7656.png" }, { @@ -58165,7 +58171,7 @@ { "id": 15729281, "username": "Junel", - "totalCosts": 560.55, + "totalCosts": 502.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15729281/medium/0be4e0167eb236dea935c2ecf60ab99e_default.png" }, { @@ -58326,12 +58332,6 @@ "username": "yuping", "totalCosts": 10.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" - }, - { - "id": 14870630, - "username": "a8832021", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14870630/medium/b36889c699124e54c6b781e3ba477726.png" } ] }, @@ -58464,13 +58464,13 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 468.64, + "totalCosts": 445.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { "id": 14870630, "username": "a8832021", - "totalCosts": 75.75, + "totalCosts": 68.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14870630/medium/b36889c699124e54c6b781e3ba477726.png" }, { @@ -58479,6 +58479,12 @@ "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15314206, "username": "cuijia", @@ -58695,6 +58701,12 @@ "totalCosts": 106.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16201976/medium/e4c92be84c0c0b1f08c76ad801087656_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15923725, "username": "xyx986", @@ -58740,6 +58752,12 @@ "username": "yuping", "totalCosts": 328.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -58794,6 +58812,12 @@ "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16016629/medium/aaff09e3b204facc4da78652554ec80b.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15314206, "username": "cuijia", @@ -58870,6 +58894,12 @@ "totalCosts": 27.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15145320, "username": "Unili", @@ -58890,7 +58920,7 @@ { "id": 15193608, "username": "yuping", - "totalCosts": 838.3, + "totalCosts": 808, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" }, { @@ -58937,7 +58967,7 @@ { "id": 15506758, "username": "Z_Zircon", - "totalCosts": 384.81, + "totalCosts": 382.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15506758/medium/12b5a3865ebef9bd988207c36d88c0a7.jpg" }, { @@ -58981,6 +59011,12 @@ "username": "YangIO", "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15219862/medium/9e4172499882462a3fc790d83b7a1a9d.jpg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -58990,7 +59026,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 1709.93, + "totalCosts": 1694.78, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -59022,6 +59058,12 @@ "username": "iPhantasmLavender", "totalCosts": 45.45, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15373768/medium/fb5b03de96ccb41bad412ed79ca8e690_default.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -59063,6 +59105,12 @@ "username": "mdranger", "totalCosts": 12.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15126233/medium/626a747d0f645d3b176bcd58d6835175_default.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -59072,7 +59120,7 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 1357.44, + "totalCosts": 1329.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { @@ -59090,7 +59138,7 @@ { "id": 15680993, "username": "nzinmymind", - "totalCosts": 111.1, + "totalCosts": 109.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680993/medium/c48e18c9909ca14dd2c4796c916a6007.jpeg" }, { @@ -59117,6 +59165,12 @@ "totalCosts": 39.39, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15722739/medium/316f09f87baa8a22fbb7fc449db7ed1e.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 16051140, "username": "MichaelQubycn", @@ -59374,7 +59428,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 463.59, + "totalCosts": 454.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -59657,7 +59711,7 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 784.77, + "totalCosts": 745.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { @@ -59754,12 +59808,6 @@ "totalCosts": 30.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15242372/medium/23bf740e9d096ee0b3de7b9f5528c8c9.JPG" }, - { - "id": 15112343, - "username": "Vanfer", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15112343/medium/87c5413d17c005198e47cecbef5fcbef.jpeg" - }, { "id": 14771456, "username": "marcusma", @@ -59772,6 +59820,12 @@ "totalCosts": 12.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708696/medium/2303f2ec8760f6fa46ad1117e61d23b5.jpg" }, + { + "id": 15112343, + "username": "Vanfer", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15112343/medium/87c5413d17c005198e47cecbef5fcbef.jpeg" + }, { "id": 15314206, "username": "cuijia", @@ -60041,6 +60095,12 @@ "totalCosts": 12.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14870630/medium/b36889c699124e54c6b781e3ba477726.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15381970, "username": "tzbkk", @@ -60283,7 +60343,7 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 733.26, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { @@ -60307,21 +60367,21 @@ { "id": 16105472, "username": "Mindy00", - "totalCosts": 140.39, + "totalCosts": 116.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16105472/medium/e3c4ba4f35bd3c3e5bc13053976cd282.png" }, - { - "id": 15680993, - "username": "nzinmymind", - "totalCosts": 58.58, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680993/medium/c48e18c9909ca14dd2c4796c916a6007.jpeg" - }, { "id": 15911295, "username": "Xin_Cheng", "totalCosts": 51.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15911295/medium/8aae130b64f46cd1ea960d085950a560_default.png" }, + { + "id": 15680993, + "username": "nzinmymind", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680993/medium/c48e18c9909ca14dd2c4796c916a6007.jpeg" + }, { "id": 15871701, "username": "maxwellcotto", @@ -60573,6 +60633,12 @@ "username": "penglaishan.cn", "totalCosts": 5.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14690748/medium/dd3be098cca6b66915e02147fd6407e7.jpg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -60875,19 +60941,19 @@ { "id": 15558917, "username": "imalittlemole", - "totalCosts": 1729.12, + "totalCosts": 1721.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15558917/medium/3140ea0253adc0e3f3c81b050f3b30b3.png" }, { "id": 14553216, "username": "rielychen", - "totalCosts": 619.13, + "totalCosts": 613.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, { "id": 14958061, "username": "Dearry", - "totalCosts": 543.38, + "totalCosts": 539.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14958061/medium/120296ee25b4bfc07225bfbc8a6d5666_default.png" }, { @@ -60905,7 +60971,7 @@ { "id": 15651555, "username": "Mseth", - "totalCosts": 42.42, + "totalCosts": 40.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15651555/medium/1154b8dc970d67063e739ed4676bc549.jpeg" }, { @@ -60929,7 +60995,7 @@ { "id": 15577913, "username": "FU-xinkuan1988", - "totalCosts": 18.18, + "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15577913/medium/dd04d6df3d97ccdbd1db1571b8509a84_default.png" }, { @@ -60958,7 +61024,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 862.54, + "totalCosts": 849.41, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -61185,12 +61251,6 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15357618/medium/12f023106f6a24e98bfc6553c07a46f4.jpg" }, - { - "id": 15848653, - "username": "QueenNot", - "totalCosts": 14.14, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15848653/medium/9506bee8d4f41073b7c7fb3523239878_default.png" - }, { "id": 16072688, "username": "lz895779981", @@ -61241,7 +61301,7 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 84.84, + "totalCosts": 83.83, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { @@ -61407,7 +61467,7 @@ { "id": 15924353, "username": "Li_Rui", - "totalCosts": 668.62, + "totalCosts": 658.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15924353/medium/24be33af9672c1afbe79146c7acda3a0_default.png" }, { @@ -61489,7 +61549,7 @@ { "id": 14125747, "username": "misakajwk", - "totalCosts": 110.09, + "totalCosts": 98.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14125747/medium/27c8b5a8d49f829339205e8f4bf47ca0.jpeg" }, { @@ -61692,7 +61752,7 @@ { "id": 15193608, "username": "yuping", - "totalCosts": 312.09, + "totalCosts": 300.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" } ] @@ -61726,7 +61786,7 @@ { "id": 15314206, "username": "cuijia", - "totalCosts": 4060.2, + "totalCosts": 4032.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -61808,7 +61868,7 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 726.19, + "totalCosts": 711.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { @@ -61946,6 +62006,12 @@ "totalCosts": 90.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381970/medium/b43b331e365346453668db293656f269.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15531743, "username": "Meriky", @@ -61966,7 +62032,7 @@ { "id": 14770398, "username": "zhangyuenet", - "totalCosts": 1360.47, + "totalCosts": 1334.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14770398/medium/8895f12e399c436af12059556ba1aaf7_default.png" }, { @@ -62170,7 +62236,7 @@ { "id": 14553216, "username": "rielychen", - "totalCosts": 665.59, + "totalCosts": 657.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, { @@ -62188,7 +62254,7 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 128.27, + "totalCosts": 120.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { @@ -62482,7 +62548,7 @@ { "id": 14690748, "username": "penglaishan.cn", - "totalCosts": 392.89, + "totalCosts": 387.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14690748/medium/dd3be098cca6b66915e02147fd6407e7.jpg" }, { @@ -62540,7 +62606,7 @@ { "id": 14771456, "username": "marcusma", - "totalCosts": 499.95, + "totalCosts": 494.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14771456/medium/bc3f51e759b958dabc1b61845df639e4_default.png" }, { @@ -62858,25 +62924,25 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 1081.71, + "totalCosts": 879.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { "id": 14553216, "username": "rielychen", - "totalCosts": 658.52, + "totalCosts": 475.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, { "id": 14969167, "username": "Chenguang", - "totalCosts": 449.45, + "totalCosts": 430.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14969167/medium/836403c60f29409ef8ca2acc585c8d61.jpeg" }, { "id": 15314206, "username": "cuijia", - "totalCosts": 110.09, + "totalCosts": 74.74, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" }, { @@ -62890,6 +62956,12 @@ "username": "telebee", "totalCosts": 24.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15224386/medium/52b2ec0ff1b2d2f6893458a3a632a2eb_default.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -63408,6 +63480,12 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15381970/medium/b43b331e365346453668db293656f269.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 16201976, "username": "Tjmin", @@ -63912,7 +63990,7 @@ { "id": 15097185, "username": "sunbeam.", - "totalCosts": 1201.9, + "totalCosts": 1197.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097185/medium/ef91246c2b7ee8bc15d5b2834ce6fc70.jpg" }, { @@ -63962,6 +64040,12 @@ "totalCosts": 23.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15242372/medium/23bf740e9d096ee0b3de7b9f5528c8c9.JPG" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15424846, "username": "Josevff03", @@ -64192,7 +64276,7 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 245.43, + "totalCosts": 210.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { @@ -64312,6 +64396,12 @@ "totalCosts": 29.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15911295/medium/8aae130b64f46cd1ea960d085950a560_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 16201976, "username": "Tjmin", @@ -64472,7 +64562,7 @@ { "id": 14792498, "username": "tyevlag", - "totalCosts": 1033.23, + "totalCosts": 1016.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792498/medium/3d13e013f50df91c50a9d67e9034daf8.png" }, { @@ -64530,13 +64620,13 @@ { "id": 14732424, "username": "WUBAOYU", - "totalCosts": 342.39, + "totalCosts": 330.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14732424/medium/75217f83736977871d3e128f01d75bab_default.png" }, { "id": 14553216, "username": "rielychen", - "totalCosts": 328.25, + "totalCosts": 316.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, { @@ -64774,6 +64864,12 @@ "totalCosts": 244.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14792200/medium/651095028597144eac73720a0c320b3d.jpeg" }, + { + "id": 15617973, + "username": "Dasferco", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15617973/medium/3dfc9ee8000385d013ae2c9f4ca88f25_default.png" + }, { "id": 14829178, "username": "EffectChen", @@ -64815,6 +64911,12 @@ "totalCosts": 23.23, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14792498, "username": "tyevlag", @@ -64870,7 +64972,7 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 176.75, + "totalCosts": 170.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { @@ -64891,6 +64993,12 @@ "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15086195/medium/cb67cfa9d14a4cb5d9cb8c9ad9fa18b9.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15156816, "username": "Fengfeng0157", @@ -65119,6 +65227,12 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15558917/medium/3140ea0253adc0e3f3c81b050f3b30b3.png" }, + { + "id": 15617973, + "username": "Dasferco", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15617973/medium/3dfc9ee8000385d013ae2c9f4ca88f25_default.png" + }, { "id": 15751745, "username": "zookeeper", @@ -65237,6 +65351,12 @@ "username": "cuijia", "totalCosts": 3.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -65249,18 +65369,18 @@ "totalCosts": 251.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/59227a901011469470b992963cd20855.jpg" }, - { - "id": 15511366, - "username": "NikoDi2000", - "totalCosts": 64.64, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15511366/medium/bcddefb5a1f3c4cc9d023f5c0271bb26.png" - }, { "id": 15425018, "username": "TTa77", "totalCosts": 52.52, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15425018/medium/a0ec669dae445a589d6b020b2fd856c8.png" }, + { + "id": 15511366, + "username": "NikoDi2000", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15511366/medium/bcddefb5a1f3c4cc9d023f5c0271bb26.png" + }, { "id": 14829178, "username": "EffectChen", @@ -65333,6 +65453,12 @@ "totalCosts": 2.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13962433/medium/6a8b7d48c93a310b833e5f26db2aab4f.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14948719, "username": "zhao16813888", @@ -65389,7 +65515,7 @@ { "id": 15511366, "username": "NikoDi2000", - "totalCosts": 117.16, + "totalCosts": 80.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15511366/medium/bcddefb5a1f3c4cc9d023f5c0271bb26.png" }, { @@ -65434,6 +65560,12 @@ "totalCosts": 4.04, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14556868/medium/e73365d23b16289c375cdc7b684c7150.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14712154, "username": "fivenicerice", @@ -65548,13 +65680,13 @@ { "id": 15156816, "username": "Fengfeng0157", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15156816/medium/8ce4621e9192a27e8a0ec7e37d9e316e_default.png" }, { "id": 15193608, "username": "yuping", - "totalCosts": 85.85, + "totalCosts": 75.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" }, { @@ -65680,6 +65812,12 @@ "username": "Fengfeng0157", "totalCosts": 7.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15156816/medium/8ce4621e9192a27e8a0ec7e37d9e316e_default.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -65689,7 +65827,7 @@ { "id": 15101527, "username": "alexanderhawl", - "totalCosts": 496.92, + "totalCosts": 492.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15101527/medium/d5363de72b7fd3067a430db7ac9ad8ab.jpeg" }, { @@ -65739,6 +65877,12 @@ "username": "Bombarda", "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314032/medium/fe5947709f5700c989cfe91917850390_default.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -65754,7 +65898,7 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 252.5, + "totalCosts": 250.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { @@ -65784,7 +65928,7 @@ { "id": 15242372, "username": "billwang", - "totalCosts": 22.22, + "totalCosts": 20.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15242372/medium/23bf740e9d096ee0b3de7b9f5528c8c9.JPG" }, { @@ -65792,6 +65936,12 @@ "username": "cuijia", "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15314206/medium/97a1d7142aa4eba6ed8a0212ddada4a8.jpeg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -65801,7 +65951,7 @@ { "id": 15773245, "username": "Tykoo", - "totalCosts": 901.93, + "totalCosts": 898.9, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15773245/medium/68e99c266c13a7685c01896596d05b7d.png" }, { @@ -65851,6 +66001,12 @@ "username": "ying.ying09", "totalCosts": 18.18, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15906651/medium/7fbb552cabdbfcd79477e56fc90a2670.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -65937,7 +66093,7 @@ { "id": 15193608, "username": "yuping", - "totalCosts": 5838.81, + "totalCosts": 5819.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" }, { @@ -66098,13 +66254,13 @@ { "id": 15657887, "username": "DreamInMorning", - "totalCosts": 2962.33, + "totalCosts": 2951.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, { "id": 15680993, "username": "nzinmymind", - "totalCosts": 564.59, + "totalCosts": 551.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680993/medium/c48e18c9909ca14dd2c4796c916a6007.jpeg" }, { @@ -66119,6 +66275,12 @@ "totalCosts": 31.31, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15730443/medium/66ac38b84d1d3ef0166033202f82e355.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15871701, "username": "maxwellcotto", @@ -66150,7 +66312,7 @@ { "id": 14829178, "username": "EffectChen", - "totalCosts": 2009.9, + "totalCosts": 1990.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, { @@ -66423,7 +66585,7 @@ { "id": 15871701, "username": "maxwellcotto", - "totalCosts": 1014.04, + "totalCosts": 1001.92, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15871701/medium/211aaa985795803b88e9fa89069ed517.png" }, { @@ -66435,7 +66597,7 @@ { "id": 15924353, "username": "Li_Rui", - "totalCosts": 456.52, + "totalCosts": 444.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15924353/medium/24be33af9672c1afbe79146c7acda3a0_default.png" }, { @@ -66508,12 +66670,6 @@ "username": "Fred-Porlock", "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15386722/medium/d45a14868eeb521fcff121613eaeee3c.png" - }, - { - "id": 15871701, - "username": "maxwellcotto", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15871701/medium/211aaa985795803b88e9fa89069ed517.png" } ] }, @@ -66627,7 +66783,7 @@ { "id": 15871701, "username": "maxwellcotto", - "totalCosts": 718.11, + "totalCosts": 715.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15871701/medium/211aaa985795803b88e9fa89069ed517.png" }, { @@ -66767,7 +66923,7 @@ { "id": 15918181, "username": "QuinnHou", - "totalCosts": 795.88, + "totalCosts": 765.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15918181/medium/17e80957f6d7eef4f215c6cc41951dae_default.png" }, { @@ -67047,7 +67203,7 @@ { "id": 15924353, "username": "Li_Rui", - "totalCosts": 979.7, + "totalCosts": 974.65, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15924353/medium/24be33af9672c1afbe79146c7acda3a0_default.png" }, { @@ -67140,7 +67296,7 @@ { "id": 15201846, "username": "boyinlee", - "totalCosts": 2151.3, + "totalCosts": 2136.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15201846/medium/3d9d29022427094faeb700ddbd5c078a.jpeg" }, { @@ -67192,7 +67348,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 622.16, + "totalCosts": 593.88, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -67303,13 +67459,13 @@ { "id": 15055487, "username": "xaviershen1", - "totalCosts": 303, + "totalCosts": 298.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15055487/medium/10522705934133754c3c30644a91e987.png" }, { "id": 14765612, "username": "mintleaf", - "totalCosts": 78.78, + "totalCosts": 64.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14765612/medium/95146c9af272a6aa0fe1ee9060d19ab4.jpeg" }, { @@ -67414,7 +67570,7 @@ { "id": 15201846, "username": "boyinlee", - "totalCosts": 510.05, + "totalCosts": 506.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15201846/medium/3d9d29022427094faeb700ddbd5c078a.jpeg" }, { @@ -67449,7 +67605,7 @@ { "id": 15201846, "username": "boyinlee", - "totalCosts": 1728.11, + "totalCosts": 1724.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15201846/medium/3d9d29022427094faeb700ddbd5c078a.jpeg" }, { @@ -67925,18 +68081,18 @@ "totalCosts": 145.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15955263/medium/51ba4f008f63f1b37ac900269bcaccc0_default.png" }, - { - "id": 14298362, - "username": "chtyozi88", - "totalCosts": 121.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14298362/medium/faa58e5522ded9b4f4fe7628c5352a59.png" - }, { "id": 15174096, "username": "13u22", "totalCosts": 118.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15174096/medium/2c7598abbcf6dc776b41f9443584bf8f.jpeg" }, + { + "id": 14298362, + "username": "chtyozi88", + "totalCosts": 115.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14298362/medium/faa58e5522ded9b4f4fe7628c5352a59.png" + }, { "id": 15247752, "username": "18349693112mingdong", @@ -68038,7 +68194,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 1991.72, + "totalCosts": 1986.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" } ] @@ -68049,13 +68205,13 @@ { "id": 15222542, "username": "Jcys", - "totalCosts": 519.14, + "totalCosts": 495.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15222542/medium/c4b538278714558f9a5430c0cef783de.JPG" }, { "id": 15399006, "username": "Xeift", - "totalCosts": 87.87, + "totalCosts": 80.8, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" } ] @@ -68202,7 +68358,7 @@ { "id": 14817838, "username": "Tadashi1024", - "totalCosts": 31.31, + "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14817838/medium/e8bbda9fb55464b5d13482f3f1bef0d4.jpg" } ] @@ -68391,7 +68547,7 @@ { "id": 14449556, "username": "LuckyPigeon", - "totalCosts": 86.86, + "totalCosts": 50.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14449556/medium/2a538164f71dc2cdbec9b9279eed934e.png" }, { @@ -68450,7 +68606,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 1663.47, + "totalCosts": 1651.35, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -68484,7 +68640,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 873.65, + "totalCosts": 848.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -68501,7 +68657,7 @@ { "id": 15508914, "username": "0xycl", - "totalCosts": 1115.04, + "totalCosts": 1060.5, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15508914/medium/98fd4c1396bf4b16bcf44f291ee28fcc.png" }, { @@ -68678,7 +68834,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 694.88, + "totalCosts": 664.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -68771,7 +68927,7 @@ { "id": 15957819, "username": "ming30650", - "totalCosts": 664.58, + "totalCosts": 640.34, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15957819/medium/2baae61ca579f0a04efd89cd210f2c6a_default.png" }, { @@ -68794,7 +68950,7 @@ { "id": 14779158, "username": "K0ue1", - "totalCosts": 1489.75, + "totalCosts": 1458.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14779158/medium/a0145bfd442c7c2b368c5aeae336f176.png" } ] @@ -68862,7 +69018,7 @@ { "id": 14779158, "username": "K0ue1", - "totalCosts": 876.68, + "totalCosts": 868.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14779158/medium/a0145bfd442c7c2b368c5aeae336f176.png" }, { @@ -68977,7 +69133,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 1356.43, + "totalCosts": 1342.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" }, { @@ -69035,7 +69191,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 1653.37, + "totalCosts": 1638.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" }, { @@ -69069,7 +69225,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 1642.26, + "totalCosts": 1613.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" } ] @@ -69091,7 +69247,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 718.11, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" } ] @@ -69135,7 +69291,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 957.48, + "totalCosts": 953.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" } ] @@ -69146,7 +69302,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 2059.39, + "totalCosts": 2057.37, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" } ] @@ -69190,7 +69346,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 2111.91, + "totalCosts": 2089.69, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" } ] @@ -69295,7 +69451,7 @@ { "id": 15837955, "username": "Magdalena_", - "totalCosts": 3235.03, + "totalCosts": 3210.79, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837955/medium/8c0a833a266fd86e17f6e6ce9592278d.jpg" } ] @@ -69338,7 +69494,7 @@ { "id": 15952403, "username": "Ezejoe36", - "totalCosts": 1357.44, + "totalCosts": 1346.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15952403/medium/70fcdec4d0f8ee875339e30b96862a26.jpeg" } ] @@ -69464,7 +69620,7 @@ { "id": 15967847, "username": "luniacllama", - "totalCosts": 1282.7, + "totalCosts": 1270.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg" } ] @@ -69492,7 +69648,7 @@ { "id": 15967185, "username": "waseemnaik", - "totalCosts": 2016.97, + "totalCosts": 2001.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png" }, { @@ -69509,7 +69665,7 @@ { "id": 15967185, "username": "waseemnaik", - "totalCosts": 3109.79, + "totalCosts": 3106.76, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png" } ] @@ -69520,7 +69676,7 @@ { "id": 15967847, "username": "luniacllama", - "totalCosts": 1125.14, + "totalCosts": 1096.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967847/medium/76cc99da9c9731bac54edf64508ac14f.jpeg" }, { @@ -69554,7 +69710,7 @@ { "id": 15967185, "username": "waseemnaik", - "totalCosts": 469.65, + "totalCosts": 451.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967185/medium/8544c16b7d24e687e63334d42c70d6dd.png" }, { @@ -69593,7 +69749,7 @@ { "id": 15962007, "username": "omkarkamale001", - "totalCosts": 1360.47, + "totalCosts": 1346.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15962007/medium/9019d6a347ebffa6f6464e00132355aa.jpeg" } ] @@ -69604,7 +69760,7 @@ { "id": 15962007, "username": "omkarkamale001", - "totalCosts": 2183.62, + "totalCosts": 2168.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15962007/medium/9019d6a347ebffa6f6464e00132355aa.jpeg" } ] @@ -69615,7 +69771,7 @@ { "id": 15962007, "username": "omkarkamale001", - "totalCosts": 3096.66, + "totalCosts": 3093.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15962007/medium/9019d6a347ebffa6f6464e00132355aa.jpeg" } ] @@ -69626,7 +69782,7 @@ { "id": 15962007, "username": "omkarkamale001", - "totalCosts": 1642.26, + "totalCosts": 1613.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15962007/medium/9019d6a347ebffa6f6464e00132355aa.jpeg" } ] @@ -69659,7 +69815,7 @@ { "id": 15962007, "username": "omkarkamale001", - "totalCosts": 718.11, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15962007/medium/9019d6a347ebffa6f6464e00132355aa.jpeg" } ] @@ -69709,7 +69865,7 @@ { "id": 15934037, "username": "fuji.anggara10", - "totalCosts": 1348.35, + "totalCosts": 1337.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15934037/medium/e913f10d6d3550452e0b7c072e15aa40.jpeg" }, { @@ -69792,7 +69948,7 @@ { "id": 15934037, "username": "fuji.anggara10", - "totalCosts": 13702.67, + "totalCosts": 13683.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15934037/medium/e913f10d6d3550452e0b7c072e15aa40.jpeg" }, { @@ -69825,13 +69981,13 @@ { "id": 15769467, "username": "seunbayo", - "totalCosts": 1018.08, + "totalCosts": 1006.97, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15769467/medium/8532abcb64313bbe86bddfbe926187ea_default.png" }, { "id": 15813587, "username": "Melasin", - "totalCosts": 342.39, + "totalCosts": 339.36, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15813587/medium/07b0aaedbd8922799e42b1707269a374.jpg" } ] @@ -69870,7 +70026,7 @@ { "id": 15885247, "username": "ct1aic.eth", - "totalCosts": 1317.04, + "totalCosts": 1305.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15885247/medium/cf22113f9226047f8f9868e4774bc4c3.png" }, { @@ -69910,7 +70066,7 @@ { "id": 15885247, "username": "ct1aic.eth", - "totalCosts": 2133.12, + "totalCosts": 2117.97, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15885247/medium/cf22113f9226047f8f9868e4774bc4c3.png" }, { @@ -69956,7 +70112,7 @@ { "id": 15885247, "username": "ct1aic.eth", - "totalCosts": 1642.26, + "totalCosts": 1613.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15885247/medium/cf22113f9226047f8f9868e4774bc4c3.png" } ] @@ -69984,13 +70140,13 @@ { "id": 15938189, "username": "altinocoelho", - "totalCosts": 306.03, + "totalCosts": 301.99, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15938189/medium/a94b70c2f9891e65834e1864392d4912.png" }, { "id": 15885247, "username": "ct1aic.eth", - "totalCosts": 105.04, + "totalCosts": 94.94, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15885247/medium/cf22113f9226047f8f9868e4774bc4c3.png" } ] @@ -70017,7 +70173,7 @@ { "id": 15967793, "username": "TanjaPale", - "totalCosts": 1348.35, + "totalCosts": 1337.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967793/medium/7a23945a1b7ec0fd21d81d4820ba115f_default.png" } ] @@ -70045,7 +70201,7 @@ { "id": 15967793, "username": "TanjaPale", - "totalCosts": 2183.62, + "totalCosts": 2168.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967793/medium/7a23945a1b7ec0fd21d81d4820ba115f_default.png" } ] @@ -70067,7 +70223,7 @@ { "id": 15967793, "username": "TanjaPale", - "totalCosts": 1642.26, + "totalCosts": 1613.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967793/medium/7a23945a1b7ec0fd21d81d4820ba115f_default.png" } ] @@ -70089,7 +70245,7 @@ { "id": 15967793, "username": "TanjaPale", - "totalCosts": 718.11, + "totalCosts": 699.93, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967793/medium/7a23945a1b7ec0fd21d81d4820ba115f_default.png" } ] diff --git a/src/data/crowdin/translation-buckets-dirs.json b/src/data/crowdin/translation-buckets-dirs.json index d8a003ebaa7..047969f7919 100644 --- a/src/data/crowdin/translation-buckets-dirs.json +++ b/src/data/crowdin/translation-buckets-dirs.json @@ -110,5 +110,9 @@ { "id": 7833, "name": "28) Developer Tutorials IV" + }, + { + "id": 8218, + "name": "Menu redesign & language picker" } ] \ No newline at end of file From cc6777129b20c8fbc1a7278465cf373e4d58da8a Mon Sep 17 00:00:00 2001 From: aslikaya Date: Sun, 11 Feb 2024 16:34:54 +0300 Subject: [PATCH 214/478] Fix a typo --- .../consensus-mechanisms/pos/rewards-and-penalties/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md index 9b08d0fbe4d..57874b13ecd 100644 --- a/public/content/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md +++ b/public/content/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md @@ -50,7 +50,7 @@ PROPOSER_WEIGHT uint64(8) These weights sum to 64. The reward is calculated as the sum of the applicable weights divided by 64. A validator that has made timely source, target and head votes, proposed a block and participated in a sync committee could receive `64/64 * base_reward == base_reward`. However, a validator is not usually a block proposer, so their maximum reward is `64-8 /64 * base_reward == 7/8 * base_reward`. Validators that are neither block proposers nor in a sync committee can receive `64-8-2 / 64 * base_reward == 6.75/8 * base_reward`. -An additional reward is added to incentivize rapid attestations. This is the `inclusion_delay_reward`. This has a value equal to the `base_reward` multiplied by `1/delay` where `delay` is the number of slots separating the block proposal and attestation. For example, if the attestation is submitted within one slot of the block proposal the attestor receives `base_reward * 1/1 == base_reward`. If the attestation arrives in the next slot, the attestor received `base_reward * 1/2` and so on. +An additional reward is added to incentivize rapid attestations. This is the `inclusion_delay_reward`. This has a value equal to the `base_reward` multiplied by `1/delay` where `delay` is the number of slots separating the block proposal and attestation. For example, if the attestation is submitted within one slot of the block proposal the attestor receives `base_reward * 1/1 == base_reward`. If the attestation arrives in the next slot, the attestor receives `base_reward * 1/2` and so on. Block proposers receive `8 / 64 * base_reward` for **each valid attestation** included in the block, so the actual value of the reward scales with the number of attesting validators. Block proposers can also increase their reward by including evidence of misbehavior by other validators in their proposed block. These rewards are the "carrots" that encourage validator honesty. A block proposer which includes slashing will be rewarded with the `slashed_validators_effective_balance / 512`. From ad438683fb1b0b876721fa41916cde234e85ec10 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sun, 11 Feb 2024 13:09:39 -0800 Subject: [PATCH 215/478] fix: image src path --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f21484ed93..1a88de38666 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![gitpoap badge](https://public-api.gitpoap.io/v1/repo/ethereum/ethereum-org-website/badge)](https://www.gitpoap.io/gh/ethereum/ethereum-org-website)
      - ethereum logo + ethereum logo

      👋 Welcome to ethereum.org!

      From 2725071f928fd221052452d57678794e04b365d8 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 12 Feb 2024 09:43:11 +0100 Subject: [PATCH 216/478] remove conflicting redirects with new rules --- public/_redirects | 4 ---- 1 file changed, 4 deletions(-) diff --git a/public/_redirects b/public/_redirects index 5ee30bff053..e1409002e3b 100644 --- a/public/_redirects +++ b/public/_redirects @@ -1,5 +1,3 @@ -/en/ / 301! - /discord https://discord.gg/ethereum-org 301! /*/discord https://discord.gg/ethereum-org 301! @@ -179,5 +177,3 @@ /studio /en/deprecated-software/#ethereum-studio 301! /*/studio /:splat/deprecated-software/#ethereum-studio 301! - -/en/stablecoins /stablecoins 301! \ No newline at end of file From 4661b61c3973ada90e7ca3e40f10c8dfbd60b1b3 Mon Sep 17 00:00:00 2001 From: sminempepe <76882704+sminempepe@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:54:56 +0300 Subject: [PATCH 217/478] Update index.md --- .../adding-desci-projects/index.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/content/contributing/adding-desci-projects/index.md b/public/content/contributing/adding-desci-projects/index.md index 51d2b0a9b67..b7702921f78 100644 --- a/public/content/contributing/adding-desci-projects/index.md +++ b/public/content/contributing/adding-desci-projects/index.md @@ -8,7 +8,7 @@ lang: en We want to make sure we show a variety of projects and give a good snapshot of the DeSci landscape. -Anyone is free to suggest a project to list on the DeSci page on ethereum.org. Equally, anyone who notices a project that is no longer relevant or no longer meets our eligibility criteria, they are free to suggest we remove it. +Anyone is free to suggest a project to list on the DeSci page on ethereum.org. Equally, anyone who notices a project that is no longer relevant or no longer meets our eligibility criteria is free to suggest its removal. ## The decision framework {#the-decision-framework} @@ -16,26 +16,26 @@ Anyone is free to suggest a project to list on the DeSci page on ethereum.org. E - **Open source code/data** - Openness of code and data is a core DeSci principle, so DeSci projects must not be closed source. The codebase should be accessible and ideally open to PRs. - **DeSci projects should be demonstrably decentralized** - This could include being governed by a DAO, or by building with a decentralized tech stack including non-custodial wallets. It probably involves auditable smart contracts on Ethereum. -- **Honest and accurate listing information** - it is expected that any suggested listings from projects come with honest and accurate information. Products that falsify listing information, such as declaring your product is “open source” when it is not, will be removed. +- **Honest and accurate listing information** - It is expected that any suggested listings from projects come with honest and accurate information. Products that falsify listing information, such as declaring your product is “open source” when it is not, will be removed. - **Demonstrable commitment to widening access to science** - A DeSci project should be able to articulate how they widen participation in science to the general public, not just to token/NFT holders. -- **Globally accessible** - your project doesn’t have geographic limitations or KYC requirements that exclude certain people from accessing your service. -- **Informative website and documentation** - it is important that visitors to the project website can understand what the project actually does, how it contributes to decentralization of science infrastructure and how to participate. +- **Globally accessible** - Your project doesn’t have geographic limitations or KYC requirements that exclude certain people from accessing your service. +- **Informative website and documentation** - It is important that visitors to the project website can understand what the project actually does, how it contributes to decentralization of science infrastructure and how to participate. - **Project should be part of the Ethereum ecosystem** - At ethereum.org we believe Ethereum (and its Layer 2's) to be the appropriate base layer for the DeSci movement. - **The project is fairly well established** - The project has real users that have been able to access the project's services for several months. ### Nice-to-haves -- **Available in multiple languages** - your project is translated into multiple languages allowing users around the world to access it. -- **Educational resources** - your product should have a well-designed onboarding experience to help and educate users. Or evidence of how-to content like articles or videos. -- **Third party audits** - your product has been professionally audited for vulnerabilities by a trusted third party. +- **Available in multiple languages** - Your project is translated into multiple languages allowing users around the world to access it. +- **Educational resources** - Your product should have a well-designed onboarding experience to help and educate users. Or evidence of how-to content like articles or videos. +- **Third-party audits** - Your product has been professionally audited for vulnerabilities by a trusted third party. - **Point of contact** - A point of contact for the project (this might be by a representative from a DAO or community) will greatly help us get accurate information when changes are made. This will keep updating ethereum.org manageable when gathering future information. ## Maintenance {#maintenance} As is the fluid nature of Ethereum, teams and products come and go and innovation happens daily, so we'll undertake routine checks of our content to: -- ensure that all projects listed still fulfil our criteria -- verify there aren't products that have been suggested that meet more of our criteria than the ones currently listed +- Ensure that all projects listed still fulfil our criteria +- Verify there aren't products that have been suggested that meet more of our criteria than the ones currently listed Ethereum.org is maintained by the open source community & we rely on the community to help keep this up to date. If you notice any information about listed projects that needs to be updated, please open an issue or a pull request on our GitHub repository. From e7f8f899fbea117afb0efd1c2311af54404c8d77 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:34:45 +0000 Subject: [PATCH 218/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3f21484ed93..3d1a1db00a4 100644 --- a/README.md +++ b/README.md @@ -1711,6 +1711,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Tarun Mohandas Daryanani
      Tarun Mohandas Daryanani

      🖋 Shubh
      Shubh

      🖋 duckdegen
      duckdegen

      🖋 + sminempepe
      sminempepe

      📖 From 798f5dd1186efda0be512a5efb615455704c4487 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:34:46 +0000 Subject: [PATCH 219/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 96154441279..4efeeb2a620 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -10965,6 +10965,15 @@ "contributions": [ "content" ] + }, + { + "login": "sminempepe", + "name": "sminempepe", + "avatar_url": "https://avatars.githubusercontent.com/u/76882704?v=4", + "profile": "https://github.com/sminempepe", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, From 3a37c5357d12dc1f8e1eccff39f8cfef08c47eb1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:40:15 +0000 Subject: [PATCH 220/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8cb7b4f2bec..ee65f801ac7 100644 --- a/README.md +++ b/README.md @@ -1712,6 +1712,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Shubh
      Shubh

      🖋 duckdegen
      duckdegen

      🖋 sminempepe
      sminempepe

      📖 + aslikaya
      aslikaya

      📖 From a8527e909cba0c3daee021bfe2af9751aaba0f1f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:40:16 +0000 Subject: [PATCH 221/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4efeeb2a620..a12f0e04398 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -10974,6 +10974,15 @@ "contributions": [ "doc" ] + }, + { + "login": "aslikaya", + "name": "aslikaya", + "avatar_url": "https://avatars.githubusercontent.com/u/9151261?v=4", + "profile": "https://github.com/aslikaya", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, From 023f657476e3e2ff5b0c2910980835ebdcaf2577 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:45:57 +0000 Subject: [PATCH 222/478] docs: update README.md [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee65f801ac7..d3c18b90930 100644 --- a/README.md +++ b/README.md @@ -1001,7 +1001,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Patrick Aljord
      Patrick Aljord

      📖 decifer
      decifer

      🤔 aghArdeshir
      aghArdeshir

      💻 - Michael Connell
      Michael Connell

      🖋 💻 + Michael Connell
      Michael Connell

      🖋 💻 🐛 Ahmed Mustafa Malik
      Ahmed Mustafa Malik

      💻 From d6eb66a3db8d4cb4d66caf21552b55a0561aea72 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:45:58 +0000 Subject: [PATCH 223/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a12f0e04398..e642a404163 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -5873,7 +5873,8 @@ "profile": "https://github.com/MiConnell", "contributions": [ "content", - "code" + "code", + "bug" ] }, { From 0d79ca44dab075e5af794f0494d22816f79894ae Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:51:44 +0000 Subject: [PATCH 224/478] docs: update README.md [skip ci] --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index d3c18b90930..bb3506ae4c5 100644 --- a/README.md +++ b/README.md @@ -1714,6 +1714,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d sminempepe
      sminempepe

      📖 aslikaya
      aslikaya

      📖 + + Lucas Amberg
      Lucas Amberg

      📖 + From 265d1389fb6f9d509a18bb711d85b09d8d355a4b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:51:45 +0000 Subject: [PATCH 225/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index e642a404163..d2d76f8fb89 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -10984,6 +10984,15 @@ "contributions": [ "doc" ] + }, + { + "login": "lucas-amberg", + "name": "Lucas Amberg", + "avatar_url": "https://avatars.githubusercontent.com/u/102396588?v=4", + "profile": "http://lucasamberg.dev", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 7, From 119a6a8898582bfb6c869acff24f33b5649b64a7 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:56:22 +0000 Subject: [PATCH 226/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bb3506ae4c5..999c840995a 100644 --- a/README.md +++ b/README.md @@ -1716,6 +1716,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Lucas Amberg
      Lucas Amberg

      📖 + Abdullahi
      Abdullahi

      🐛 From 4d4109858c0c114b1b92705e637e1271f8fb6061 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:56:23 +0000 Subject: [PATCH 227/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d2d76f8fb89..63affaa3ee9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -10993,6 +10993,15 @@ "contributions": [ "doc" ] + }, + { + "login": "a-hagi613", + "name": "Abdullahi", + "avatar_url": "https://avatars.githubusercontent.com/u/92589940?v=4", + "profile": "https://a-hagi.dev/", + "contributions": [ + "bug" + ] } ], "contributorsPerLine": 7, From bbf4432429f995f55faa3eeaf8b4cc9391aa6720 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:04:18 +0000 Subject: [PATCH 228/478] Update src/data/crowdin/translation-buckets-dirs.json --- src/data/crowdin/translation-buckets-dirs.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/data/crowdin/translation-buckets-dirs.json b/src/data/crowdin/translation-buckets-dirs.json index 047969f7919..d8a003ebaa7 100644 --- a/src/data/crowdin/translation-buckets-dirs.json +++ b/src/data/crowdin/translation-buckets-dirs.json @@ -110,9 +110,5 @@ { "id": 7833, "name": "28) Developer Tutorials IV" - }, - { - "id": 8218, - "name": "Menu redesign & language picker" } ] \ No newline at end of file From 5dfac3c7eb2a7455cc99b8547798086e9e0db8c1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:06:24 +0000 Subject: [PATCH 229/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 999c840995a..c03c7da63e4 100644 --- a/README.md +++ b/README.md @@ -1717,6 +1717,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Lucas Amberg
      Lucas Amberg

      📖 Abdullahi
      Abdullahi

      🐛 + Pranav Konde
      Pranav Konde

      🖋 From 10490c0799e7691199dfff548088203b3c3bc9f9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:06:25 +0000 Subject: [PATCH 230/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 63affaa3ee9..7077819b142 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11002,6 +11002,15 @@ "contributions": [ "bug" ] + }, + { + "login": "pranavkonde", + "name": "Pranav Konde", + "avatar_url": "https://avatars.githubusercontent.com/u/76070589?v=4", + "profile": "https://www.linkedin.com/in/pranav-konde-56aa141b5/", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, From 485088daf29197d324861a43e195ce31860a9a9e Mon Sep 17 00:00:00 2001 From: aslikaya Date: Mon, 12 Feb 2024 21:24:24 +0300 Subject: [PATCH 231/478] Update voting platform link The previous link http://v1.carbonvote.com/ was dead. This link from the archive works fine --- public/content/governance/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/governance/index.md b/public/content/governance/index.md index 733a42210c3..f2e36aa7e02 100644 --- a/public/content/governance/index.md +++ b/public/content/governance/index.md @@ -121,7 +121,7 @@ Forks are when major technical upgrades or changes need to be made to the networ The DAO fork was in response to the [2016 DAO attack](https://www.coindesk.com/understanding-dao-hack-journalists) where an insecure [DAO](/glossary/#dao) contract was drained of over 3.6 million ETH in a hack. The fork moved the funds from the faulty contract to a new contract allowing anyone who lost funds in the hack to recover them. -This course of action was voted on by the Ethereum community. Any ETH holder was able to vote via a transaction on [a voting platform](http://v1.carbonvote.com/). The decision to fork reached over 85% of the votes. +This course of action was voted on by the Ethereum community. Any ETH holder was able to vote via a transaction on [a voting platform](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). The decision to fork reached over 85% of the votes. It's important to note that whilst the protocol did fork to revert the hack, the weight the vote carried in deciding to fork is debatable for a few reasons: From 174aab05201945e4f74d2608321dccf7f68b0fa5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 12 Feb 2024 19:27:00 +0100 Subject: [PATCH 232/478] Apply suggestions from code review --- public/content/history/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/history/index.md b/public/content/history/index.md index f04dfd1f1c3..517b84c81b7 100644 --- a/public/content/history/index.md +++ b/public/content/history/index.md @@ -172,7 +172,7 @@ Altair was the first major network upgrade that had an exact rollout time. Every The London upgrade introduced [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559), which reformed the transaction fee market, along with changes to how gas refunds are handled and the [Ice Age](/glossary/#ice-age) schedule. -#### What was the London Upgrade / EIP-1559? +#### What was the London Upgrade / EIP-1559? {#eip-1559} Before the London Upgrade, Ethereum had fixed-sized blocks. In times of high network demand, these blocks operated at full capacity. As a result, users often had to wait for demand to reduce to get included in a block, which led to a poor user experience. The London Upgrade introduced variable-sized blocks to Ethereum. @@ -184,7 +184,7 @@ The total fee would have been: `Gas units (limit) * Gas price per unit` i.e `21, The implementation of [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) in the London Upgrade made the transaction fee mechanism more complex, but made gas fees more predictable, resulting in a more efficient transaction fee market. Users can submit transactions with a `maxFeePerGas` corresponding to how much they are willing to pay for the transaction to be executed, knowing that they will not pay more than the market price for gas (`baseFeePerGas`), and get any extra, minus their tip, refunded. -This video explains EIP-1559 and the benefits it brings:[![EIP-1559 Explained]](https://www.youtube.com/watch?v=MGemhK9t44Q) +This video explains EIP-1559 and the benefits it brings: [EIP-1559 Explained](https://www.youtube.com/watch?v=MGemhK9t44Q) - [Are you a dapp developer? Be sure to upgrade your libraries and tooling.](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/london-ecosystem-readiness.md) - [Read the Ethereum Foundation announcement](https://blog.ethereum.org/2021/07/15/london-mainnet-announcement/) From e2582c5f5a91de0230ec92d90643b9cf2790b771 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 12 Feb 2024 11:29:18 -0700 Subject: [PATCH 233/478] cleanup --- src/components/History/NetworkUpgradeSummary.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/History/NetworkUpgradeSummary.tsx b/src/components/History/NetworkUpgradeSummary.tsx index 46d84cacc10..cfd95209f3f 100644 --- a/src/components/History/NetworkUpgradeSummary.tsx +++ b/src/components/History/NetworkUpgradeSummary.tsx @@ -48,11 +48,11 @@ const NetworkUpgradeSummary = ({ name }: NetworkUpgradeSummaryProps) => { const blockTypeTranslation = (translationKey, explorerUrl, number) => { return ( - + {t(translationKey)}:{" "} - {new Intl.NumberFormat(localeForStatsBoxNumbers).format(number)} + {new Intl.NumberFormat(localeForStatsBoxNumbers).format(number)} ) From b722b0282484267f949b29245e87b6cb9a7f3269 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:30:15 +0000 Subject: [PATCH 234/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c03c7da63e4..c7f56aa4c5b 100644 --- a/README.md +++ b/README.md @@ -1718,6 +1718,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Lucas Amberg
      Lucas Amberg

      📖 Abdullahi
      Abdullahi

      🐛 Pranav Konde
      Pranav Konde

      🖋 + Mohit Kambli
      Mohit Kambli

      💻 From 483fac3c3e4c730fef39f70c77d4203cfaec7883 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 18:30:16 +0000 Subject: [PATCH 235/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7077819b142..ec00327182e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11011,6 +11011,15 @@ "contributions": [ "content" ] + }, + { + "login": "MohitKambli", + "name": "Mohit Kambli", + "avatar_url": "https://avatars.githubusercontent.com/u/31406633?v=4", + "profile": "https://github.com/MohitKambli", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From 0804079c0087c17c947cd4580c8ffcd077a0aae9 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:42:58 -0800 Subject: [PATCH 236/478] fix: patch issues from import --- public/content/translations/pl/community/online/index.md | 2 +- public/content/translations/pl/community/research/index.md | 2 +- src/intl/pl/common.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/pl/community/online/index.md b/public/content/translations/pl/community/online/index.md index c5e716197af..6fb5e38d8db 100644 --- a/public/content/translations/pl/community/online/index.md +++ b/public/content/translations/pl/community/online/index.md @@ -25,7 +25,7 @@ Setki tysięcy entuzjastów Ethereum gromadzi się na tych forach internetowych, Ethereum Hackers — czat Discord prowadzony przez ETHGlobal: społeczność internetowa dla hakerów Ethereum na całym świecie CryptoDevs — społeczność Discord skupiająca się na rozwoju Ethereum EthStaker Discord — prowadzone przez społeczność wskazówki, edukacja, wsparcie i zasoby dla obecnych i potencjalnych stakerów -Zespół strony internetowej ethereum.org — wpadnij i porozmawiaj o tworzeniu i projektowaniu strony internetowej ethereum.org z zespołem i ludźmi ze społeczności +Zespół strony internetowej ethereum.org — wpadnij i porozmawiaj o tworzeniu i projektowaniu strony internetowej ethereum.org z zespołem i ludźmi ze społeczności Matos Discord — społeczność twórców web3, w której spotykają się budujący, przedstawiciele przemysłu i entuzjaści Ethereum. Jesteśmy pasjonatami rozwoju, projektowania i kultury web3. Przyjdź tworzyć z nami. Solidity Gitter — czat dla deweloperów Solidity (Gitter) Solidity Matrix — czat dla rozwoju Solidity (Matrix) diff --git a/public/content/translations/pl/community/research/index.md b/public/content/translations/pl/community/research/index.md index 287d1af0adc..dbfe4d9b4fa 100644 --- a/public/content/translations/pl/community/research/index.md +++ b/public/content/translations/pl/community/research/index.md @@ -216,7 +216,7 @@ Aby wprowadzić więcej osób do Ethereum, ekosystem musi poprawić UX/UI. Będz ### Ekonomia {#economics} -Badania ekonomiczne w Ethereum zasadniczo opierają się na dwóch podejściach: walidacji bezpieczeństwa mechanizmów opartych na zachętach ekonomicznych („mikroekonomia”) i analizie przepływów wartości między protokołami, aplikacjami i użytkownikami („makroekonomia”). Istnieją złożone czynniki krypto-ekonomiczne związane z natywnym aktywem Ethereum (ethereum) i tokenami zbudowanymi na nim (na przykład NFT i tokeny ERC20). +Badania ekonomiczne w Ethereum zasadniczo opierają się na dwóch podejściach: walidacji bezpieczeństwa mechanizmów opartych na zachętach ekonomicznych („mikroekonomia”) i analizie przepływów wartości między protokołami, aplikacjami i użytkownikami („makroekonomia”). Istnieją złożone czynniki krypto-ekonomiczne związane z natywnym aktywem Ethereum (eter) i tokenami zbudowanymi na nim (na przykład NFT i tokeny ERC20). #### Podstawowe informacje {#background-reading-9} diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index 5b6fc8cc380..edee4eac2e0 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "Czy ten samouczek był pomocny?", "feedback-widget-thank-you-title": "Dziękujemy za opinię!", "feedback-widget-thank-you-subtitle": "Spraw, aby ta strona była jeszcze lepsza, odpowiadając na kilka pytań.", - "feedback-widget-thank-you-subtitle-ext": "Jeśli potrzebujesz pomocy, możesz skontaktować się ze społecznością na naszym kanale Discord.", + "feedback-widget-thank-you-subtitle-ext": "Jeśli potrzebujesz pomocy, możesz skontaktować się ze społecznością na naszym kanale Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Otwórz krótką ankietę", "find-wallet": "Znajdź portfel", From d4ce6d9222d69205a6e30717cc194cc4ede357f2 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 12 Feb 2024 13:48:08 -0800 Subject: [PATCH 237/478] fix: init useTranslation --- src/components/FeedbackWidget.tsx | 1 + src/intl/en/common.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/FeedbackWidget.tsx b/src/components/FeedbackWidget.tsx index 901dd45230c..32f2619f483 100644 --- a/src/components/FeedbackWidget.tsx +++ b/src/components/FeedbackWidget.tsx @@ -35,6 +35,7 @@ const FixedDot = ({ isExpanded, ...props }: FixedDotProps) => { + const { t } = useTranslation("common") const size = "3rem" return ( - -
      - ) : ( - <> - - - + + + + {items.map((item) => { + const { label, description, icon, ...action } = item + const subItems = action.items || [] + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + const activeStyles = { + outline: "none", + rounded: "md", + "p, svg": { color: menuColors.highlight }, + bg: menuColors.lvl[lvl].activeBackground, + boxShadow: "none", + } + const buttonProps: ButtonProps = { + color: isActivePage ? menuColors.active : menuColors.body, + leftIcon: lvl === 1 && icon ? : undefined, + rightIcon: isLink ? undefined : , + position: "relative", + w: "full", + me: -pad, + sx: { + "span:first-of-type": { m: 0, me: pad }, // Spacing for icon + }, + py: pad, + bg: "none", + _hover: activeStyles, + _focus: activeStyles, + variant: "ghost", + } + return ( + + { + // Bring focus to destination button when leaving + ;(e.relatedTarget as HTMLButtonElement).focus() + }} + > + {isLink ? ( + + + + + + ) : ( + <> + + + + - - )} - - - ) - })} - - - - - - - + + + )} + + + ) + })} + + + + {/* + */} + ) } diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 2451607f8e6..aabb39092e6 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -77,41 +77,44 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { {label} - + + + + + ) })} - - - + + + {/* - - + */} ) From 90baa1a03efb7ebc3932bd8812a4583ff4438468 Mon Sep 17 00:00:00 2001 From: Gabriel Temtsen Date: Wed, 14 Feb 2024 18:19:15 +0100 Subject: [PATCH 289/478] updated page category key --- src/intl/am/page-stablecoins.json | 2 +- src/intl/ar/page-stablecoins.json | 2 +- src/intl/az/page-stablecoins.json | 2 +- src/intl/bg/page-stablecoins.json | 2 +- src/intl/bn/page-stablecoins.json | 2 +- src/intl/ca/page-stablecoins.json | 2 +- src/intl/cs/page-stablecoins.json | 2 +- src/intl/da/page-stablecoins.json | 2 +- src/intl/de/page-stablecoins.json | 2 +- src/intl/el/page-stablecoins.json | 2 +- src/intl/en/page-stablecoins.json | 2 +- src/intl/es/page-stablecoins.json | 2 +- src/intl/fa/page-stablecoins.json | 2 +- src/intl/fi/page-stablecoins.json | 2 +- src/intl/fil/page-stablecoins.json | 2 +- src/intl/fr/page-stablecoins.json | 2 +- src/intl/gl/page-stablecoins.json | 2 +- src/intl/gu/page-stablecoins.json | 2 +- src/intl/he/page-stablecoins.json | 2 +- src/intl/hi/page-stablecoins.json | 2 +- src/intl/hr/page-stablecoins.json | 2 +- src/intl/hu/page-stablecoins.json | 2 +- src/intl/hy-am/page-stablecoins.json | 2 +- src/intl/id/page-stablecoins.json | 2 +- src/intl/ig/page-stablecoins.json | 2 +- src/intl/it/page-stablecoins.json | 2 +- src/intl/ja/page-stablecoins.json | 2 +- src/intl/ka/page-stablecoins.json | 2 +- src/intl/kk/page-stablecoins.json | 2 +- src/intl/km/page-stablecoins.json | 2 +- src/intl/kn/page-stablecoins.json | 2 +- src/intl/ko/page-stablecoins.json | 2 +- src/intl/lt/page-stablecoins.json | 2 +- src/intl/ml/page-stablecoins.json | 2 +- src/intl/mr/page-stablecoins.json | 2 +- src/intl/ms/page-stablecoins.json | 2 +- src/intl/nb/page-stablecoins.json | 2 +- src/intl/nl/page-stablecoins.json | 2 +- src/intl/pcm/page-stablecoins.json | 2 +- src/intl/pl/page-stablecoins.json | 2 +- src/intl/pt-br/page-stablecoins.json | 2 +- src/intl/pt/page-stablecoins.json | 2 +- src/intl/ro/page-stablecoins.json | 2 +- src/intl/ru/page-stablecoins.json | 2 +- src/intl/se/page-stablecoins.json | 2 +- src/intl/sk/page-stablecoins.json | 2 +- src/intl/sl/page-stablecoins.json | 2 +- src/intl/sr/page-stablecoins.json | 2 +- src/intl/sw/page-stablecoins.json | 2 +- src/intl/ta/page-stablecoins.json | 2 +- src/intl/th/page-stablecoins.json | 2 +- src/intl/tr/page-stablecoins.json | 1 + src/intl/uk/page-stablecoins.json | 2 +- src/intl/ur/page-stablecoins.json | 2 +- src/intl/uz/page-stablecoins.json | 2 +- src/intl/vi/page-stablecoins.json | 2 +- src/intl/zh-tw/page-stablecoins.json | 2 +- src/intl/zh/page-stablecoins.json | 2 +- src/pages/stablecoins.tsx | 2 +- 59 files changed, 59 insertions(+), 58 deletions(-) diff --git a/src/intl/am/page-stablecoins.json b/src/intl/am/page-stablecoins.json index 35926fb31a4..4ed2e33a40b 100644 --- a/src/intl/am/page-stablecoins.json +++ b/src/intl/am/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "ምንጭ", "page-stablecoins-bitcoin-pizza": "በመጥፎ የሚታወቀው የቢትኮይን ፒዛ", "page-stablecoins-bitcoin-pizza-body": "እ. ኤ. አ. በ 2010 አንድ ሰው 2 ፒዛዎችን በ 10,000 ቢትኮይን ገዛ። በወቅቱ እነዚህ ዋጋ ~$41 አካባቢ ነበር። ዛሬ ባለው ገበያ ይህ በሚሊዮን የሚቆጠር ዶላር ነው። በኢቴርየም ታሪክ ውስጥም ብዙ ተመሳሳይ የሚያስቆጩ ግብይቶች አሉ። ስቴብልኮይኖች ይህንን ችግር ይፈታሉ፣ ስለዚህ ፒዛዎን ማጣጣም እና ETHዎንም መያዝ ይችላሉ።", - "page-stablecoins-category": "ማንቸስተር & ትምህርት", + "page-stablecoins-category-dashboard-and-education": "ማንቸስተር & ትምህርት", "page-stablecoins-coin-price-change": "የሳንቲም የዋጋ ለውጥ (ባለፉት 30 ቀናት)", "page-stablecoins-crypto-backed": "በክሪፕቶ የሚደገፉ", "page-stablecoins-crypto-backed-con-1": "በገንዘብ ኖት ከሚደገፉ ስቴብልኮይኖች ያነሰ የተረጋጋ።", diff --git a/src/intl/ar/page-stablecoins.json b/src/intl/ar/page-stablecoins.json index 85e7b1c1c7c..95d8a81897a 100644 --- a/src/intl/ar/page-stablecoins.json +++ b/src/intl/ar/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "المصدر", "page-stablecoins-bitcoin-pizza": "بيتزا بيتكوين سيئة السمعة", "page-stablecoins-bitcoin-pizza-body": "في عام 2010، اشترى شخص 2 بيتزا مقابل 10,000 بيتكوين. في ذلك الوقت كانت قيمتها حوالي 41 دولارًا أمريكيًا. في سوق اليوم، يساوي هذا ملايين الدولارات. هناك العديد من المعاملات المؤسفة المماثلة في تاريخ إثيريوم. العملات المستقرة تحل هذه المشكلة، حتى تتمكن من الاستمتاع بالبيتزا والتمسك بعملات الإثير الخاصة بك.", - "page-stablecoins-category": "لوحة المعلومات والتعليم", + "page-stablecoins-category-dashboard-and-education": "لوحة المعلومات والتعليم", "page-stablecoins-coin-price-change": "تغير سعر العملة (آخر 30 يومًا)", "page-stablecoins-crypto-backed": "العملة المشفرة المدعومة", "page-stablecoins-crypto-backed-con-1": "أقل ثباتًا من العملات المستقرة المدعومة بالعملة الورقية.", diff --git a/src/intl/az/page-stablecoins.json b/src/intl/az/page-stablecoins.json index 7331664bf96..f6ec953de50 100644 --- a/src/intl/az/page-stablecoins.json +++ b/src/intl/az/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Mənbə", "page-stablecoins-bitcoin-pizza": "Məşhur Bitcoin pizzası", "page-stablecoins-bitcoin-pizza-body": "2010-cu ildə kimsə 10 000 bitkoinə 2 pizza alıb. O zaman bunlar ~41 ABŞ dolları dəyərində idi. İndiki bazarda bu milyonlarla dollardır. Ethereum tarixində bir çox oxşar təəssüf doğuran əməliyyatlar var. Stabilkoinlər bu problemi həll edir, beləliklə siz pizzanızdan həzz ala və ETH-ni saxlaya biləsiniz.", - "page-stablecoins-category": "Pult və Təhsil", + "page-stablecoins-category-dashboard-and-education": "Pult və Təhsil", "page-stablecoins-coin-price-change": "Token qiymət dəyişikliyi (son 30 gün)", "page-stablecoins-crypto-backed": "Kripto ilə dəstəklənən", "page-stablecoins-crypto-backed-con-1": "Fiat dəstəkli stabilkoinlərdən daha az stabildir.", diff --git a/src/intl/bg/page-stablecoins.json b/src/intl/bg/page-stablecoins.json index 4048df3cf6e..afcf5f9031c 100644 --- a/src/intl/bg/page-stablecoins.json +++ b/src/intl/bg/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Източник", "page-stablecoins-bitcoin-pizza": "Небезизвестната Биткойн пица", "page-stablecoins-bitcoin-pizza-body": "През 2010 г. някой купил 2 пици за 10 000 биткойна. По онова време те са стрували около 41 щатски долара. Според днешния пазар това са милиони долари. Съществуват много подобни трансакции, изпълнени със съжаление, в историята на Етереум. Стейбълкойните решават този проблем, така че се наслаждавайте на пицата си и се дръжте за вашите ETH.", - "page-stablecoins-category": "Табло & Образование", + "page-stablecoins-category-dashboard-and-education": "Табло & Образование", "page-stablecoins-coin-price-change": "Промяна в цената на монетите (през последните 30 дни)", "page-stablecoins-crypto-backed": "Подсигурени от криптовалута", "page-stablecoins-crypto-backed-con-1": "По-малко стабилни отколкото стейбълкойните, подкрепени от традиционна валута.", diff --git a/src/intl/bn/page-stablecoins.json b/src/intl/bn/page-stablecoins.json index 2589d6695d5..d9f79463877 100644 --- a/src/intl/bn/page-stablecoins.json +++ b/src/intl/bn/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "উৎস", "page-stablecoins-bitcoin-pizza": "অখ্যাত বিটকয়েন পিজ্জা", "page-stablecoins-bitcoin-pizza-body": "2010 সালে, কেউ 10,000 বিটকয়েনের জন্য 2টি পিজা কিনেছিল। তখন এগুলোর মূল্য ছিল ~$41 USD। আজকের বাজারে এটি মিলিয়ন ডলার। ইথেরিয়াম এর ইতিহাসে অনেক অনুরূপ অনুতপ্ত লেনদেন আছে। স্টেবলকয়েন এই সমস্যার সমাধান করে, যাতে আপনি আপনার পিজ্জা উপভোগ করতে পারেন এবং আপনার ETH ধরে রাখতে পারেন।", - "page-stablecoins-category": "ড্যাশবোর্ড এবং শিক্ষা", + "page-stablecoins-category-dashboard-and-education": "ড্যাশবোর্ড এবং শিক্ষা", "page-stablecoins-coin-price-change": "কয়েনের মূল্য পরিবর্তন (গত 30 দিন)", "page-stablecoins-crypto-backed": "ক্রিপ্টো ব্যাকড", "page-stablecoins-crypto-backed-con-1": "ফিয়াট-ব্যাকড স্টেবলকয়েনের চেয়ে কম স্থিতিশীল।", diff --git a/src/intl/ca/page-stablecoins.json b/src/intl/ca/page-stablecoins.json index 7f8c0641a90..10f7fbe0488 100644 --- a/src/intl/ca/page-stablecoins.json +++ b/src/intl/ca/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Font", "page-stablecoins-bitcoin-pizza": "La pizza infame de Bitcoin", "page-stablecoins-bitcoin-pizza-body": "El 2010, algú va comprar 2 pizzes amb 10.000 bitcoins. En aquest moment, equivalien a uns 41 dòlars. En el mercat d'avui en dia, valen milions de dòlars. Hi ha diverses transaccions similars lamentables a la història d'Ethereum. Les monedes estables resolen aquest problema, així que podeu gaudir de la pizza i conservar els vostres ETH.", - "page-stablecoins-category": "Tauler de control & Educació", + "page-stablecoins-category-dashboard-and-education": "Tauler de control & Educació", "page-stablecoins-coin-price-change": "Canvi del preu de la moneda (últims 30 dies)", "page-stablecoins-crypto-backed": "Recolzat per criptomoneda", "page-stablecoins-crypto-backed-con-1": "Menys estable que les monedes estables recolzades per diner fiduciari.", diff --git a/src/intl/cs/page-stablecoins.json b/src/intl/cs/page-stablecoins.json index d6c60d01994..22956f72619 100644 --- a/src/intl/cs/page-stablecoins.json +++ b/src/intl/cs/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Zdroj", "page-stablecoins-bitcoin-pizza": "Nechvalně proslulá pizza za Bitcoiny", "page-stablecoins-bitcoin-pizza-body": "V roce 2010 někdo koupil dvě pizzy za 10 000 bitcoinů. Ty v té době měly cenu kolem 41 dolarů. Dnes to představuje miliony dolarů. V historii platformy Ethereum je mnoho podobných politováníhodných transakcí. Stabilní kryptoměny tento problém řeší, takže si můžete vychutnat pizzu a přitom držet ETH.", - "page-stablecoins-category": "Řídicí panel a vzdělání", + "page-stablecoins-category-dashboard-and-education": "Řídicí panel a vzdělání", "page-stablecoins-coin-price-change": "Změna ceny (posledních 30 dnů)", "page-stablecoins-crypto-backed": "Zajištěné kryptoměnou", "page-stablecoins-crypto-backed-con-1": "Méně stabilní než stablecoiny kryté papírovými penězi.", diff --git a/src/intl/da/page-stablecoins.json b/src/intl/da/page-stablecoins.json index 16c76a51328..62408dfb92d 100644 --- a/src/intl/da/page-stablecoins.json +++ b/src/intl/da/page-stablecoins.json @@ -16,4 +16,4 @@ "matcha-logo": "Matcha-logo", "oasis-logo": "Oasis-logo", "uniswap-logo": "Uniswap logo", - "page-stablecoins-category": "Dashboard & Uddannelse"} + "page-stablecoins-category-dashboard-and-education": "Dashboard & Uddannelse"} diff --git a/src/intl/de/page-stablecoins.json b/src/intl/de/page-stablecoins.json index 6fbc1d10dc8..da74f5156d2 100644 --- a/src/intl/de/page-stablecoins.json +++ b/src/intl/de/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Quelle", "page-stablecoins-bitcoin-pizza": "Die berüchtigte Bitcoin-Pizza", "page-stablecoins-bitcoin-pizza-body": "Im Jahr 2010 kaufte jemand 2 Pizzen für 10.000 Bitcoins. Zu der Zeit waren diese ~ 41 USD wert. Auf dem heutigen Markt sind das Millionen von Dollar. Es gibt viele ähnliche bedauerliche Transaktionen in der Geschichte von Ethereum. Stablecoins lösen dieses Problem, sodass Sie Ihre Pizza genießen und an Ihren ETH festhalten können.", - "page-stablecoins-category": "Dashboard & Onderwijs", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Onderwijs", "page-stablecoins-coin-price-change": "Coin-Preisänderung (letzte 30 Tage)", "page-stablecoins-crypto-backed": "Krypto-unterstützt", "page-stablecoins-crypto-backed-con-1": "Weniger stabil als von Papiergeld unterstützte Stablecoins.", diff --git a/src/intl/el/page-stablecoins.json b/src/intl/el/page-stablecoins.json index 55b446bf50c..8b4dbf080a7 100644 --- a/src/intl/el/page-stablecoins.json +++ b/src/intl/el/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Πηγή", "page-stablecoins-bitcoin-pizza": "Η περίφημη πίτσα Bitcoin", "page-stablecoins-bitcoin-pizza-body": "Το 2010, κάποιος αγόρασε 2 πίτσες στην τιμή των 10.000 bitcoin. Εκείνη τη στιγμή η αξία τους ήταν περίπου ~$41 USD, ενώ σήμερα αξίζουν μερικά εκατομμύρια. Υπάρχουν βέβαια και άλλες παρόμοιες λυπηρές συναλλαγές στην ιστορία του Ethereum. Τα κρυπτονομίσματα σταθερής αξίας έχουν επιλύσει αυτό το πρόβλημα, οπότε μπορείτε να απολαύσετε την πίτσα σας και να κρατήσετε τα ΕΤΗ σας.", - "page-stablecoins-category": "Πίνακας ελέγχου & Εκπαίδευση", + "page-stablecoins-category-dashboard-and-education": "Πίνακας ελέγχου & Εκπαίδευση", "page-stablecoins-coin-price-change": "Μεταβολή τιμής νομίσματος (τελευταίες 30 ημέρες)", "page-stablecoins-crypto-backed": "Υποστήριξη κρυπτονομισμάτων", "page-stablecoins-crypto-backed-con-1": "Λιγότερο σταθερό από τα υποστηριζόμενα με fiat κρυπτονομίσματα σταθερής αξίας.", diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 343932471fb..25e0e0d36a6 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Source", "page-stablecoins-bitcoin-pizza": "The infamous Bitcoin pizza", "page-stablecoins-bitcoin-pizza-body": "In 2010, someone bought 2 pizzas for 10,000 bitcoin. At the time these were worth ~$41 USD. In today’s market that’s millions of dollars. There are many similar regretful transactions in Ethereum’s history. Stablecoins solve this problem, so you can enjoy your pizza and hold on to your ETH.", - "page-stablecoins-category": "Dashboard & Education", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Education", "page-stablecoins-coin-price-change": "Coin price change (last 30 days)", "page-stablecoins-crypto-backed": "Crypto backed", "page-stablecoins-crypto-backed-con-1": "Less stable than fiat-backed stablecoins.", diff --git a/src/intl/es/page-stablecoins.json b/src/intl/es/page-stablecoins.json index feb82ca75f4..3a58ae6ef51 100644 --- a/src/intl/es/page-stablecoins.json +++ b/src/intl/es/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Fuente", "page-stablecoins-bitcoin-pizza": "La infame pizza de Bitcoin", "page-stablecoins-bitcoin-pizza-body": "En 2010, alguien compró 2 pizzas con 10.000 bitcoins. En ese momento equivalían a unos 41 dólares. En el mercado de hoy en día, valen millones de dólares. Hay varias transacciones similares lamentables en la historia de Ethereum. Las monedas estables resuelven este problema, así que puede disfrutar de la pizza y conservar sus ETH.", - "page-stablecoins-category": "Panel de control y educación", + "page-stablecoins-category-dashboard-and-education": "Panel de control y educación", "page-stablecoins-coin-price-change": "Cambio del precio de la moneda (últimos 30 días)", "page-stablecoins-crypto-backed": "Respaldado por criptomonedas", "page-stablecoins-crypto-backed-con-1": "Menos estable que las monedas estables respaldadas por dinero fiduciario.", diff --git a/src/intl/fa/page-stablecoins.json b/src/intl/fa/page-stablecoins.json index 88bff7b4ac2..eb9471a72ec 100644 --- a/src/intl/fa/page-stablecoins.json +++ b/src/intl/fa/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "منبع", "page-stablecoins-bitcoin-pizza": "پیتزای بدنام بیت‌کوینی", "page-stablecoins-bitcoin-pizza-body": "در سال 2010، یک نفر 2 پیتزا را به ارزش 10 هزار بیت کوین خریداری کرد. در آن زمان، ارزش آنها 41 دلار امریکا بود. در بازار امروز، ارزش آنها میلیون‌ها دلار است. تراکنش‌های بسیار زیاد مشابه و پشیمان‌کننده‌ای در تاریخچه اتریوم وجود دارد. پایدارزها این مشکل را حل کرده‌اند، بنابراین شما می‌توانید از پیتزای خود لذت ببرید و اتریوم خود را نگه دارید.", - "page-stablecoins-category": "داشبورد و آموزش", + "page-stablecoins-category-dashboard-and-education": "داشبورد و آموزش", "page-stablecoins-coin-price-change": "تغییر قیمت ارز (30 روز گذشته)", "page-stablecoins-crypto-backed": "پشتیبانی رمزارز", "page-stablecoins-crypto-backed-con-1": "پایداری کمتر از استیبل کوین‌ها با پشتوانه مالی فیات.", diff --git a/src/intl/fi/page-stablecoins.json b/src/intl/fi/page-stablecoins.json index a25a9d4a3f8..ca0c2f55737 100644 --- a/src/intl/fi/page-stablecoins.json +++ b/src/intl/fi/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Lähde", "page-stablecoins-bitcoin-pizza": "Bitcoin-pizzasta se lähti", "page-stablecoins-bitcoin-pizza-body": "Vuonna 2010 asiakas osti kaksi pizzaa 10 000 bitcoinilla, mikä vastasi tuolloin noin 41 USD:a. Tänä päivänä summan arvo on miljoonia dollareita. Useita vastaavia harmittavia transaktioita on tapahtunut Ethereuminkin historiassa. Vakaat kryptot ratkaisivat ongelman, joten nyt voit nauttia pizzaa kohtuuhintaan.", - "page-stablecoins-category": "Hallintapaneeli ja koulutus", + "page-stablecoins-category-dashboard-and-education": "Hallintapaneeli ja koulutus", "page-stablecoins-coin-price-change": "Kolikon hinnan muutos (viimeiset 30 päivää)", "page-stablecoins-crypto-backed": "Kryptoihin perustuva", "page-stablecoins-crypto-backed-con-1": "Vähemmän vakaa kuin perinteisiin fiat-valuuttoihin sidotut vakaat kryptot.", diff --git a/src/intl/fil/page-stablecoins.json b/src/intl/fil/page-stablecoins.json index 0cfb81728c7..7874ec739ab 100644 --- a/src/intl/fil/page-stablecoins.json +++ b/src/intl/fil/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Source", "page-stablecoins-bitcoin-pizza": "Ang sikat na Bitcoin pizza", "page-stablecoins-bitcoin-pizza-body": "Noong 2010, may bumili ng 2 pizza gamit ang 10,000 bitcoin. Noong panahong ito, ~$41 USD ang katumbas nito. Sa kasalukuyang market, katumbas iyon ng milyong-milyong dolyar. Maraming nakakapanghinayang na transaksyon sa kasaysayan ng Ethereum na katulad nito. Malulutas ng mga stablecoin ang ganitong problema, kaya makakain mo ang pizza mo at maitatabi mo ang ETH mo.", - "page-stablecoins-category": "Dashboard at Edukasyon", + "page-stablecoins-category-dashboard-and-education": "Dashboard at Edukasyon", "page-stablecoins-coin-price-change": "Pagbabago sa presyo ng coin (nakalipas na 30 araw)", "page-stablecoins-crypto-backed": "Crypto backed", "page-stablecoins-crypto-backed-con-1": "Hindi masyadong stable kumpara sa mga fiat-backed stablecoin.", diff --git a/src/intl/fr/page-stablecoins.json b/src/intl/fr/page-stablecoins.json index 02f70b3952c..97f83767742 100644 --- a/src/intl/fr/page-stablecoins.json +++ b/src/intl/fr/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Source", "page-stablecoins-bitcoin-pizza": "La célèbre pizza Bitcoin", "page-stablecoins-bitcoin-pizza-body": "En 2010, quelqu’un a acheté 2 pizzas pour 10 000 bitcoins. À l’époque, elles valaient environ 41 USD. Sur le marché d’aujourd’hui, cela représente des millions de dollars. Il existe beaucoup de transactions regrettables similaires dans l'histoire d'Ethereum. Les stablecoins résolvent ce problème, pour que vous puissiez profiter de votre pizza et conserver votre ETH.", - "page-stablecoins-category": "Tableau de bord & Éducation", + "page-stablecoins-category-dashboard-and-education": "Tableau de bord & Éducation", "page-stablecoins-coin-price-change": "Variation du prix des pièces (30 derniers jours)", "page-stablecoins-crypto-backed": "Crypto adossé", "page-stablecoins-crypto-backed-con-1": "Moins stable que les stablecoins adossées à la monnaie fiduciaire.", diff --git a/src/intl/gl/page-stablecoins.json b/src/intl/gl/page-stablecoins.json index b9b1f9ed045..4dc7bdb4ef2 100644 --- a/src/intl/gl/page-stablecoins.json +++ b/src/intl/gl/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Logotipo de Matcha", "oasis-logo": "Logotipo de Oasis", "uniswap-logo": "Logotipo de Uniswap", - "page-stablecoins-category": "Panel de control & Educación" + "page-stablecoins-category-dashboard-and-education": "Panel de control & Educación" } diff --git a/src/intl/gu/page-stablecoins.json b/src/intl/gu/page-stablecoins.json index ef944354404..c474682a6ca 100644 --- a/src/intl/gu/page-stablecoins.json +++ b/src/intl/gu/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "મેચ લોગો", "oasis-logo": "ઓએસિસ લોગો", "uniswap-logo": "યુનિસ્વેપ લોગો", - "page-stablecoins-category": "ડેશબોર્ડ અને શિક્ષણ" + "page-stablecoins-category-dashboard-and-education": "ડેશબોર્ડ અને શિક્ષણ" } diff --git a/src/intl/he/page-stablecoins.json b/src/intl/he/page-stablecoins.json index e59acf8f1af..a08c916c7ac 100644 --- a/src/intl/he/page-stablecoins.json +++ b/src/intl/he/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "לוגו של מאתצא", "oasis-logo": "לוגו של אואסיס", "uniswap-logo": "לוגו של אוניס'אפ", - "page-stablecoins-category": "לוח מחוונים וחינוך" + "page-stablecoins-category-dashboard-and-education": "לוח מחוונים וחינוך" } diff --git a/src/intl/hi/page-stablecoins.json b/src/intl/hi/page-stablecoins.json index e1c22f37aad..d1be261df25 100644 --- a/src/intl/hi/page-stablecoins.json +++ b/src/intl/hi/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "स्रोत", "page-stablecoins-bitcoin-pizza": "बदनाम बिटकॉइन पिज़्ज़ा", "page-stablecoins-bitcoin-pizza-body": "2010 में, किसी ने 10,000 बिटकॉइन से 2 पिज़्ज़ा खरीदा। उस समय इनका मूल्य ~$41 USD था। आज के बाजार में जो लाखों डॉलर का है। इथेरियम के इतिहास में कई समान अफसोसजनक लेनदेन हैं। स्थिर कॉइन इस समस्या को हल कर देते हैं, जिससे आप अपने पिज़्ज़ा का आनंद ले सकते हैं और अपने ETH पर पकड़ बना सकते हैं।", - "page-stablecoins-category": "डैशबोर्ड और शिक्षा", + "page-stablecoins-category-dashboard-and-education": "डैशबोर्ड और शिक्षा", "page-stablecoins-coin-price-change": "कॉइन मूल्य परिवर्तन (पिछले 30 दिन)", "page-stablecoins-crypto-backed": "क्रिप्टो समर्थित", "page-stablecoins-crypto-backed-con-1": "फिएट-समर्थित स्थिर कॉइन की तुलना में कम स्थिर।", diff --git a/src/intl/hr/page-stablecoins.json b/src/intl/hr/page-stablecoins.json index 48088370980..5d7613bb0e7 100644 --- a/src/intl/hr/page-stablecoins.json +++ b/src/intl/hr/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Izvor", "page-stablecoins-bitcoin-pizza": "Čuvena Bitcoin pizza", "page-stablecoins-bitcoin-pizza-body": "2010. godine netko je kupio 2 pizze za 10.000 bitcoina. U to su vrijeme vrijedile ~ 41 USD. Na današnjem tržištu to su stotine milijuna dolara. U povijesti Ethereuma postoji mnogo sličnih žalosnih transakcija. Stabilne kovanice rješavaju ovaj problem, tako da možete uživati u svojoj pizzi i zadržati svoj ETH.", - "page-stablecoins-category": "Nadzorna ploča i obrazovanje", + "page-stablecoins-category-dashboard-and-education": "Nadzorna ploča i obrazovanje", "page-stablecoins-coin-price-change": "Promjena cijene kovanica (posljednjih 30 dana)", "page-stablecoins-crypto-backed": "Podržano kriptom", "page-stablecoins-crypto-backed-con-1": "Manje stabilni od stabilnih fiat-kovanica.", diff --git a/src/intl/hu/page-stablecoins.json b/src/intl/hu/page-stablecoins.json index 06df6f1c10e..e4bc450e6aa 100644 --- a/src/intl/hu/page-stablecoins.json +++ b/src/intl/hu/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Forrás", "page-stablecoins-bitcoin-pizza": "A hírhedt Bitcoin pizza", "page-stablecoins-bitcoin-pizza-body": "2010-ben valaki vett 2 pizzát 10,000 bitcoinért. Akkoriban ezek körülbelül 41 USD-t értek. Ez a mai piacon több millió dollár. Sok hasonló sajnálatos tranzakció történt az Ethereum történetében is. A stabil érmék megoldják ezt a problémát, szóval megeheti jóétvággyal a pizzáját és megtarthatjaaz ETH-ét is.", - "page-stablecoins-category": "Irányítópult és Oktatás", + "page-stablecoins-category-dashboard-and-education": "Irányítópult és Oktatás", "page-stablecoins-coin-price-change": "Érme árfolyamváltozás (utolsó 30 nap)", "page-stablecoins-crypto-backed": "Kriptofedezetű", "page-stablecoins-crypto-backed-con-1": "Kevésbé stabil, mint a fiatfedezetű stabil érmék.", diff --git a/src/intl/hy-am/page-stablecoins.json b/src/intl/hy-am/page-stablecoins.json index 238e806e4d6..f942f68d548 100644 --- a/src/intl/hy-am/page-stablecoins.json +++ b/src/intl/hy-am/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Աղբյուրը", "page-stablecoins-bitcoin-pizza": "Տխրահռչակ Բիթքոին պիցցան", "page-stablecoins-bitcoin-pizza-body": "2010-ին, ինչ-որ մեկը 10.000 Բիթքոինով 2 հատ պիցցա է գնել: Այդ ժամանակ դրանք արժեցել են մոտավորապես 41 դոլլար: Այժմյան շուկայում դրանց ընդհանուր արժողությունը միլլիոնավոր դոլլարներ է: Նմանատիպ շատ ափսոսալի փոխանցումներ եղել են նաև Էթերիումի պատմության մեջ: Ստեյբլքոիները լուծում են այդ խնդիրը, Ձեզ թույլ տալով վայելել Ձեր պիցցան առանց Էթեր (ETH) վճարելու:", - "page-stablecoins-category": "Վարկանշան & Կրթություն", + "page-stablecoins-category-dashboard-and-education": "Վարկանշան & Կրթություն", "page-stablecoins-coin-price-change": "Արժույթների գնային փոփոխություններ (վերջին 30 օրերին)", "page-stablecoins-crypto-backed": "Կրիպտոարժույթով ապահովագրված", "page-stablecoins-crypto-backed-con-1": "Ավելի քիչ կայուն քան ֆիատային արժույթով ապահովագրված ստեյբլքոիները:", diff --git a/src/intl/id/page-stablecoins.json b/src/intl/id/page-stablecoins.json index 84f2c5a4e3f..6f87068d9a2 100644 --- a/src/intl/id/page-stablecoins.json +++ b/src/intl/id/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Sumber", "page-stablecoins-bitcoin-pizza": "Pizza Bitcoin yang terkenal jahat", "page-stablecoins-bitcoin-pizza-body": "Pada tahun 2010, seseorang membeli 2 pizza seharga 10.000 bitcoin. Pada saat itu, nilainya ~$41 USD. Di pasar saat ini, itu bernilai jutaan dolar. Ada banyak transaksi penuh penyesalan dalam sejarah Ethereum. Stablecoin memecahkan masalah ini, sehingga Anda dapat menikmati pizza Anda dan mempertahankan ETH Anda.", - "page-stablecoins-category": "Dasbor & Pendidikan", + "page-stablecoins-category-dashboard-and-education": "Dasbor & Pendidikan", "page-stablecoins-coin-price-change": "Perubahan harga koin (30 hari terakhir)", "page-stablecoins-crypto-backed": "Kripto didukung", "page-stablecoins-crypto-backed-con-1": "Kurang stabil dibandingkan stablecoin yang didukung oleh fiat.", diff --git a/src/intl/ig/page-stablecoins.json b/src/intl/ig/page-stablecoins.json index 7bcab4f5546..95e3c5803f0 100644 --- a/src/intl/ig/page-stablecoins.json +++ b/src/intl/ig/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Isi mmalite", "page-stablecoins-bitcoin-pizza": "Bitcoin pizza a ma ama", "page-stablecoins-bitcoin-pizza-body": "Na 2010, mmadụ ji Bitcoin 10,000 zụta pizza 2. N'oge ọnụ ahịa ndị bụ ~$ 41USD. N'ahịa taa, nke ahụ bụ nde kwuru nde dollar. E nwere ọtụtụ azụmahịa dị etu a na-enye mwute n'akụkọ Ethereum. Stebụlkọịn doziri nsogbu a, yabụ i nwere ike ịta Pizza gị ma jigide ETH gị.", - "page-stablecoins-category": "Dashboard na Education", + "page-stablecoins-category-dashboard-and-education": "Dashboard na Education", "page-stablecoins-coin-price-change": "Mgbanwe ọnụahịa mkpụrụ ego (ụbọchị 30 gara aga)", "page-stablecoins-crypto-backed": "Nke crypto kwadoro", "page-stablecoins-crypto-backed-con-1": "Ka stebụlkọịn nke fịyatị kwadoro ghara ịkwụsị ike.", diff --git a/src/intl/it/page-stablecoins.json b/src/intl/it/page-stablecoins.json index 6c2409f5481..aae500f8acf 100644 --- a/src/intl/it/page-stablecoins.json +++ b/src/intl/it/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Fonte", "page-stablecoins-bitcoin-pizza": "La famigerata Pizza Bitcoin", "page-stablecoins-bitcoin-pizza-body": "Nel 2010, qualcuno acquistò 2 pizze per 10.000 bitcoin. Al tempo, il valore era pari a circa $37 EUR. Nel mercato odierno, equivarrebbero a milioni di dollari. Esistono simili transazioni non proprio vantaggiose, nella storia di Ethereum. Le Stablecoin risolvono tale problema, così che possa goderti la tua pizza, senza perdere i tuoi ETH.", - "page-stablecoins-category": "Dashboard & Educazione", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Educazione", "page-stablecoins-coin-price-change": "Variazione del prezzo della moneta (ultimi 30 giorni)", "page-stablecoins-crypto-backed": "Sostenuti da criptovalute", "page-stablecoins-crypto-backed-con-1": "Meno stabili delle Stablecoin sostenute da valute legali.", diff --git a/src/intl/ja/page-stablecoins.json b/src/intl/ja/page-stablecoins.json index 446aa7660fd..62c0d27f2f8 100644 --- a/src/intl/ja/page-stablecoins.json +++ b/src/intl/ja/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "情報源", "page-stablecoins-bitcoin-pizza": "悪名高いBitcoinピザ", "page-stablecoins-bitcoin-pizza-body": "2010年、誰かが10,000ビットコインで2枚のピザを購入しました。当時、これらは~41ドルの価値がありました。今日の市場では数百万ドルです。Ethereumの歴史の中には、似たような残念なトランザクションが多くあります。ステーブルコインはこの問題を解決してくれるので、あなたはピザを楽しみながらETHを保持することができるのです。", - "page-stablecoins-category": "ダッシュボード&教育", + "page-stablecoins-category-dashboard-and-education": "ダッシュボード&教育", "page-stablecoins-coin-price-change": "コインの価格変更(直近30日間)", "page-stablecoins-crypto-backed": "暗号資産の裏付け", "page-stablecoins-crypto-backed-con-1": "不換紙幣担保型のステーブルコインよりも低い安定性。", diff --git a/src/intl/ka/page-stablecoins.json b/src/intl/ka/page-stablecoins.json index f430a5bcc3c..2b058114cd3 100644 --- a/src/intl/ka/page-stablecoins.json +++ b/src/intl/ka/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Matcha-ს ლოგო", "oasis-logo": "Oasis -ის ლოგო", "uniswap-logo": "Uniswap-ის ლოგო", - "page-stablecoins-category": "პანელი & განათლება" + "page-stablecoins-category-dashboard-and-education": "პანელი & განათლება" } diff --git a/src/intl/kk/page-stablecoins.json b/src/intl/kk/page-stablecoins.json index e62ef50d435..bcea87baaff 100644 --- a/src/intl/kk/page-stablecoins.json +++ b/src/intl/kk/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Matcha логотипі", "oasis-logo": "Oasis логотипі", "uniswap-logo": "Uniswap логотипі", - "page-stablecoins-category": "Қасымдық тақтасы және оқу" + "page-stablecoins-category-dashboard-and-education": "Қасымдық тақтасы және оқу" } diff --git a/src/intl/km/page-stablecoins.json b/src/intl/km/page-stablecoins.json index ab1743ee0d3..d9f74b3e3df 100644 --- a/src/intl/km/page-stablecoins.json +++ b/src/intl/km/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "ប្រភព", "page-stablecoins-bitcoin-pizza": "ភីហ្សា Bitcoin ដ៏ល្បីល្បាញ", "page-stablecoins-bitcoin-pizza-body": "ក្នុងឆ្នាំ 2010 មាននរណាម្នាក់បានទិញភីហ្សាចំនួន 2 ក្នុងតម្លៃ 10,000 bitcoin ។ នៅពេលនោះមានតម្លៃ ~ 41 ដុល្លារ។ នៅក្នុងទីផ្សារសព្វថ្ងៃ មានតម្លៃរាប់លានដុល្លារ។ មានប្រតិបត្តិការសោកស្ដាយស្រដៀងគ្នាជាច្រើននៅក្នុងប្រវត្តិសាស្រ្តរបស់ Ethereum ។ Stablecoins ដោះស្រាយបញ្ហានេះ ដូច្នេះអ្នកអាចរីករាយនឹងភីហ្សារបស់អ្នក ហើយកាន់ ETH របស់អ្នក។", - "page-stablecoins-category": "ផ្ទៃដើមសេចក្ដីស្វែងរក & ការអប់រំ", + "page-stablecoins-category-dashboard-and-education": "ផ្ទៃដើមសេចក្ដីស្វែងរក & ការអប់រំ", "page-stablecoins-coin-price-change": "ការផ្លាស់ប្តូរតម្លៃកាក់ (30 ថ្ងៃចុងក្រោយ)", "page-stablecoins-crypto-backed": "Crypto គាំទ្រ", "page-stablecoins-crypto-backed-con-1": "មានស្ថិរភាពតិចជាងកាក់ស្ថិរភាពដែលគាំទ្រដោយ fiat", diff --git a/src/intl/kn/page-stablecoins.json b/src/intl/kn/page-stablecoins.json index 7084b0f9e2d..4cf9c8f8206 100644 --- a/src/intl/kn/page-stablecoins.json +++ b/src/intl/kn/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "ಮೂಲ", "page-stablecoins-bitcoin-pizza": "ಕುಖ್ಯಾತ ಬಿಟ್ ಕಾಯಿನ್ ಪಿಜ್ಜಾ", "page-stablecoins-bitcoin-pizza-body": "2010 ರಲ್ಲಿ, ಯಾರೋ ಒಬ್ಬರು 10,000 ಬಿಟ್ ಕಾಯಿನ್ ಗೆ 2 ಪಿಜ್ಜಾಗಳನ್ನು ಖರೀದಿಸಿದರು. ಆ ಸಮಯದಲ್ಲಿ ಇವುಗಳ ಮೌಲ್ಯ ~ $ 41 USD ಆಗಿತ್ತು. ಇಥಿರಿಯಮ್ ನ ಇತಿಹಾಸದಲ್ಲಿ ಇದೇ ರೀತಿಯ ಅನೇಕ ವಿಷಾದಕರ ವಹಿವಾಟುಗಳಿವೆ. ಸ್ಟ್ಯಾಬಲ್ ಕಾಯಿನ್ ಗಳು ಈ ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸುತ್ತವೆ, ಆದ್ದರಿಂದ ನೀವು ನಿಮ್ಮ ಪಿಜ್ಜಾವನ್ನು ಆನಂದಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ETH ಅನ್ನು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳಬಹುದು.", - "page-stablecoins-category": "ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ಮತ್ತು ಶಿಕ್ಷಣ", + "page-stablecoins-category-dashboard-and-education": "ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ಮತ್ತು ಶಿಕ್ಷಣ", "page-stablecoins-coin-price-change": "ನಾಣ್ಯಗಳ ಬೆಲೆ ಬದಲಾವಣೆ (ಕಳೆದ 30 ದಿನಗಳು)", "page-stablecoins-crypto-backed": "ಕ್ರಿಪ್ಟೋ ಬೆಂಬಲಿತ", "page-stablecoins-crypto-backed-con-1": "ಫಿಯೆಟ್-ಬೆಂಬಲಿತ ಸ್ಟೇಬಲ್‍ಕಾಯಿನ್‍‍ಗಳಿಗಿಂತ ಕಡಿಮೆ ಸ್ಥಿರವಾಗಿದೆ.", diff --git a/src/intl/ko/page-stablecoins.json b/src/intl/ko/page-stablecoins.json index 008a2a6a51f..71ffcdf2010 100644 --- a/src/intl/ko/page-stablecoins.json +++ b/src/intl/ko/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "출처", "page-stablecoins-bitcoin-pizza": "악명 높은 비트코인 피자 사건", "page-stablecoins-bitcoin-pizza-body": "2010년, 한 사용자가 10,000비트코인으로 피자 두 판을 샀습니다. 그때는 비트코인의 가치가 약 41달러였습니다. 오늘날 시장에서는 수백만 달러죠. 이더리움의 역사에서 그것과 비슷한 안타까운 거래 내역이 많습니다. 스테이블 코인은 이러한 문제를 해결하므로 당신은 피자를 즐기며 ETH를 계속 보유할 수 있습니다.", - "page-stablecoins-category": "대시 보드 및 교육", + "page-stablecoins-category-dashboard-and-education": "대시 보드 및 교육", "page-stablecoins-coin-price-change": "코인 가격 변동 (지난 30일간)", "page-stablecoins-crypto-backed": "암호화폐 기반", "page-stablecoins-crypto-backed-con-1": "명목화폐 기반 스테이블 코인보다 덜 안정적입니다.", diff --git a/src/intl/lt/page-stablecoins.json b/src/intl/lt/page-stablecoins.json index 8135d57e509..78c8a20770b 100644 --- a/src/intl/lt/page-stablecoins.json +++ b/src/intl/lt/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "„Matcha“ logotipas", "oasis-logo": "„Oasis“ logotipas", "uniswap-logo": "„Uniswap“ logotipas", - "page-stablecoins-category": "Valdymo skydelis ir švietimas" + "page-stablecoins-category-dashboard-and-education": "Valdymo skydelis ir švietimas" } diff --git a/src/intl/ml/page-stablecoins.json b/src/intl/ml/page-stablecoins.json index 35feabe43f6..922f65e317a 100644 --- a/src/intl/ml/page-stablecoins.json +++ b/src/intl/ml/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "ഉറവിടം", "page-stablecoins-bitcoin-pizza": "കുപ്രസിദ്ധമായ ബിറ്റ്കോയിൻ പിസ്സ", "page-stablecoins-bitcoin-pizza-body": "2010 ൽ ഒരാൾ 10,000 ബിറ്റ്കോയിന് 2 പിസ്സകൾ വാങ്ങി. അക്കാലത്ത് ഇവയുടെ വില US 41 യുഎസ്ഡി ആയിരുന്നു. ഇന്നത്തെ വിപണിയിൽ ദശലക്ഷക്കണക്കിന് ഡോളർ. Ethereumന്റെ ചരിത്രത്തിൽ സമാനമായ നിരവധി ഖേദകരമായ ഇടപാടുകൾ ഉണ്ട്. സ്റ്റേബിൾ‌കോയിനുകൾ‌ ഈ പ്രശ്‌നം പരിഹരിക്കുന്നു, അതിനാൽ‌ നിങ്ങളുടെ പിസ്സ ആസ്വദിക്കാനും നിങ്ങളുടെ ETH മുറുകെ പിടിക്കാനും കഴിയും.", - "page-stablecoins-category": "ഡാഷ്ബോർഡ് & പഠനം", + "page-stablecoins-category-dashboard-and-education": "ഡാഷ്ബോർഡ് & പഠനം", "page-stablecoins-coin-price-change": "നാണയ വില മാറ്റം (കഴിഞ്ഞ 30 ദിവസം)", "page-stablecoins-crypto-backed": "ക്രിപ്‌റ്റോ പിന്തുണയുള്ളത്", "page-stablecoins-crypto-backed-con-1": "ഫിയറ്റ് പിന്തുണയുള്ള സ്റ്റേബിൾകോയിനുകളേക്കാൾ സ്ഥിരത കുറവാണ്.", diff --git a/src/intl/mr/page-stablecoins.json b/src/intl/mr/page-stablecoins.json index f8110ea69c2..7cf97c5d771 100644 --- a/src/intl/mr/page-stablecoins.json +++ b/src/intl/mr/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "स्रोत", "page-stablecoins-bitcoin-pizza": "कुप्रसिद्ध Bitcoin पिझ्झा", "page-stablecoins-bitcoin-pizza-body": "2010 मध्ये, कोणीतरी 10,000 bitcoin साठी 2 पिझ्झा विकत घेतले. त्यावेळी त्यांची किंमत ~$41 USD होती. आजच्या बाजारात ते लाखो डॉलर्स आहे. Ethereum च्या इतिहासात असेच अनेक खेदजनक व्यवहार आहेत. स्टेबलकॉइन्स या समस्येचे निराकरण करतात, जेणेकरून तुम्ही तुमच्या पिझ्झाचा आनंद घेऊ शकता आणि तुमच्या ETH ला धरून राहू शकता.", - "page-stablecoins-category": "डॅशबोर्ड आणि शिक्षण", + "page-stablecoins-category-dashboard-and-education": "डॅशबोर्ड आणि शिक्षण", "page-stablecoins-coin-price-change": "नाण्याच्या किंमतीत बदल (गेल्या 30 दिवसांत)", "page-stablecoins-crypto-backed": "क्रिप्टो समर्थित", "page-stablecoins-crypto-backed-con-1": "फियाट-बॅक्ड स्टेबलकॉइन्सपेक्षा कमी स्थिर.", diff --git a/src/intl/ms/page-stablecoins.json b/src/intl/ms/page-stablecoins.json index a1af1b51bc6..1efa60083f1 100644 --- a/src/intl/ms/page-stablecoins.json +++ b/src/intl/ms/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Sumber", "page-stablecoins-bitcoin-pizza": "Peristiwa piza Bitcoin terkenal", "page-stablecoins-bitcoin-pizza-body": "Pada tahun 2010, seseorang telah membeli 2 piza pada harga 10,000 bitcoin. Pada masa itu, bitcoin bernilai ~$41 USD. Pada pasaran kini, jumlah tersebut bernilai jutaan dolar. Terdapat banyak transaksi penuh sesal seperti ini dalam sejarah Ethereum. Syiling stabil menyelesaikan masalah ini, jadi anda boleh menikmati piza dan menyimpan ETH anda.", - "page-stablecoins-category": "Papan Pemuka & Pendidikan", + "page-stablecoins-category-dashboard-and-education": "Papan Pemuka & Pendidikan", "page-stablecoins-coin-price-change": "Perubahan harga syiling (30 hari lalu)", "page-stablecoins-crypto-backed": "Bersandarkan kripto", "page-stablecoins-crypto-backed-con-1": "Kurang stabil berbanding syiling stabil yang bersandarkan mata wang fiat.", diff --git a/src/intl/nb/page-stablecoins.json b/src/intl/nb/page-stablecoins.json index 1164f858f09..908c99b6037 100644 --- a/src/intl/nb/page-stablecoins.json +++ b/src/intl/nb/page-stablecoins.json @@ -11,5 +11,5 @@ "matcha-logo": "Matcha-logo", "oasis-logo": "Oasis-logo", "uniswap-logo": "Uniswap-logo", - "page-stablecoins-category": "Dashbord og utdanning" + "page-stablecoins-category-dashboard-and-education": "Dashbord og utdanning" } diff --git a/src/intl/nl/page-stablecoins.json b/src/intl/nl/page-stablecoins.json index 09b5308e490..aa4af78e749 100644 --- a/src/intl/nl/page-stablecoins.json +++ b/src/intl/nl/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Bron", "page-stablecoins-bitcoin-pizza": "De beruchte Bitcoin pizza", "page-stablecoins-bitcoin-pizza-body": "In 2010 kocht iemand 2 pizzas voor 10.000 bitcoin. Op dat moment was dit ongeveer $ 41 dollar waard. Op de markt van vandaag zijn dat miljoenen dollars. Er zijn veel soortgelijke betreurenswaardige transacties in de geschiedenis van Ethereum. Stablecoins lossen dit probleem op, zodat u van uw pizza kunt genieten en uw ETH kunt behouden.", - "page-stablecoins-category": "Dashboard & Onderwijs", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Onderwijs", "page-stablecoins-coin-price-change": "Muntprijswijziging (laatste 30 dagen)", "page-stablecoins-crypto-backed": "Door crypto ondersteund", "page-stablecoins-crypto-backed-con-1": "Minder stabiel dan stabiele, door fiat ondersteunde stablecoins.", diff --git a/src/intl/pcm/page-stablecoins.json b/src/intl/pcm/page-stablecoins.json index ebe9c8a73e4..7fcf16aa21b 100644 --- a/src/intl/pcm/page-stablecoins.json +++ b/src/intl/pcm/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Source", "page-stablecoins-bitcoin-pizza": "Di Bitcoin pizza wey nor popula", "page-stablecoins-bitcoin-pizza-body": "For 2010, one pesin buy 2 pizza for 10,000 bitcoin. For dat taim, di 10,000 worth ~$41 USD. For tuday's market, e dey worth millions of dollars. E get plenti similar transakshons wey pipol rigret for Ethereum's history too. Stabolcoins find solushon to all dis palava, wit stabolcoins yu go fit chop yor pizza and hold yor ETH witout regreting anytin later.", - "page-stablecoins-category": "Dashboard & Education", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Education", "page-stablecoins-coin-price-change": "Coin price shange (for di last 30 days)", "page-stablecoins-crypto-backed": "Wey crypto dey back", "page-stablecoins-crypto-backed-con-1": "E nor too stabol like stabolcoins wey fiat dey back.", diff --git a/src/intl/pl/page-stablecoins.json b/src/intl/pl/page-stablecoins.json index 79dcfba3e94..91b5b37faf9 100644 --- a/src/intl/pl/page-stablecoins.json +++ b/src/intl/pl/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Źródło", "page-stablecoins-bitcoin-pizza": "Niesamowita pizza bitcoin", "page-stablecoins-bitcoin-pizza-body": "W 2010 roku ktoś kupił 2 pizze za 10 000 bitcoinów. W tamtym czasie były one warte ~41 USD. Na dzisiejszym rynku to miliony dolarów. W historii Ethereum jest wiele podobnych żałosnych transakcji. Stablecoins rozwiązują ten problem, dzięki czemu możesz cieszyć się pizzą i trzymać się ETH.", - "page-stablecoins-category": "Pulpit & Edukacja", + "page-stablecoins-category-dashboard-and-education": "Pulpit & Edukacja", "page-stablecoins-coin-price-change": "Zmiana cen monet (ostatnie 30 dni)", "page-stablecoins-crypto-backed": "Zabezpieczone kryptowalutą", "page-stablecoins-crypto-backed-con-1": "Mniej stabilne niż stablecoiny wspierane przez pieniądz fiducjarny.", diff --git a/src/intl/pt-br/page-stablecoins.json b/src/intl/pt-br/page-stablecoins.json index 0222f004713..bd5b4bcb156 100644 --- a/src/intl/pt-br/page-stablecoins.json +++ b/src/intl/pt-br/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Fonte", "page-stablecoins-bitcoin-pizza": "A infame pizza de bitcoin", "page-stablecoins-bitcoin-pizza-body": "Em 2010, alguém comprou 2 pizzas por 10.000 bitcoins. Na época, eles valiam cerca de US$ 41. No mercado de hoje, isso vale milhões de dólares. Existem muitas transações lamentáveis ​​semelhantes na história da Ethereum. As stablecoins resolvem este problema, para que você possa saborear a sua pizza e ficar com os seus ETH.", - "page-stablecoins-category": "Painel & Educação", + "page-stablecoins-category-dashboard-and-education": "Painel & Educação", "page-stablecoins-coin-price-change": "Mudança de preço da moeda (últimos 30 dias)", "page-stablecoins-crypto-backed": "Respaldada por cripto", "page-stablecoins-crypto-backed-con-1": "Menos estável do que stablecoins respaldadas por moedas fiduciárias.", diff --git a/src/intl/pt/page-stablecoins.json b/src/intl/pt/page-stablecoins.json index 920ac9871c2..662668d0724 100644 --- a/src/intl/pt/page-stablecoins.json +++ b/src/intl/pt/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Fonte", "page-stablecoins-bitcoin-pizza": "A infame pizza Bitcoin", "page-stablecoins-bitcoin-pizza-body": "Em 2010, alguém comprou 2 pizzas por 10 000 bitcoin. Na altura, estas valiam ~41 US$. No mercado atual, isso equivale a milhões de dólares. Existem muitas transações lamentáveis semelhantes na história da Ethereum. As stablecoins resolvem este problema, pelo que pode desfrutar da sua pizza e manter a sua ETH.", - "page-stablecoins-category": "Painel & Educação", + "page-stablecoins-category-dashboard-and-education": "Painel & Educação", "page-stablecoins-coin-price-change": "Variação do preço da criptomoeda (últimos 30 dias)", "page-stablecoins-crypto-backed": "Com suporte para criptomoedas", "page-stablecoins-crypto-backed-con-1": "Menos estáveis do que as stablecoins apoiadas em moeda fiduciária.", diff --git a/src/intl/ro/page-stablecoins.json b/src/intl/ro/page-stablecoins.json index fe312edf133..cfda8d7dca2 100644 --- a/src/intl/ro/page-stablecoins.json +++ b/src/intl/ro/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Sursa", "page-stablecoins-bitcoin-pizza": "Infama pizza Bitcoin", "page-stablecoins-bitcoin-pizza-body": "În 2010, cineva a cumpărat 2 pizza pentru 10.000 bitcoin. La vremea respectivă, acestea valorau ~ 41 USD. Pe piața de astăzi valorează milioane de dolari. Există multe tranzacții regretabile similare în istoria Ethereum. Stablecoin-urile rezolvă această problemă, astfel încât să vă puteți bucura de pizza și să vă păstrați ETH-ul.", - "page-stablecoins-category": "Tablou de bord și educație", + "page-stablecoins-category-dashboard-and-education": "Tablou de bord și educație", "page-stablecoins-coin-price-change": "Modificarea prețului monedei (în ultimele 30 de zile)", "page-stablecoins-crypto-backed": "Garantat de cripto", "page-stablecoins-crypto-backed-con-1": "Mai puțin stabile decât stablecoins susținute de fiat.", diff --git a/src/intl/ru/page-stablecoins.json b/src/intl/ru/page-stablecoins.json index 99336589ebd..db08b137618 100644 --- a/src/intl/ru/page-stablecoins.json +++ b/src/intl/ru/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Источник", "page-stablecoins-bitcoin-pizza": "The Infamous Bitcoin Pizza", "page-stablecoins-bitcoin-pizza-body": "В 2010 году кто-то купил две пиццы за 10 000 биткоинов. В то время они стоили около 41 доллара. На сегодняшний день это миллионы долларов. В истории Ethereum бывали и другие транзакции, о которых люди жалели. Стабильные монеты решают эту проблему, так что вы можете наслаждаться пиццей и хранить свои ETH.", - "page-stablecoins-category": "Панель инструментов и образование", + "page-stablecoins-category-dashboard-and-education": "Панель инструментов и образование", "page-stablecoins-coin-price-change": "Изменение цены монет (за последние 30 дней)", "page-stablecoins-crypto-backed": "Обеспечено криптовалютой", "page-stablecoins-crypto-backed-con-1": "Менее стабильные, чем фиатные стабильные монеты.", diff --git a/src/intl/se/page-stablecoins.json b/src/intl/se/page-stablecoins.json index 4bee3cc8aac..f7e3e468c66 100644 --- a/src/intl/se/page-stablecoins.json +++ b/src/intl/se/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Källa", "page-stablecoins-bitcoin-pizza": "Den ökända Bitcoin-pizzan", "page-stablecoins-bitcoin-pizza-body": "År 2010 köpte någon 2 pizzor för 10 000 bitcoin. På den tiden dessa var värda ungefär 41 USD. På dagens marknad skulle detta vara miljontals dollar. Det finns många liknande beklagliga transaktioner i Ethereums historia. Stablecoins lösa detta problem, så att du kan njuta av din pizza men ändå ha kvar dina ETH.", - "page-stablecoins-category": "Instrumentpanel och utbildning", + "page-stablecoins-category-dashboard-and-education": "Instrumentpanel och utbildning", "page-stablecoins-coin-price-change": "Förändring av myntvärdet (senaste 30 dagarna)", "page-stablecoins-crypto-backed": "Stödd av krypto", "page-stablecoins-crypto-backed-con-1": "Mindre stabila än fiat-stödda stablecoins.", diff --git a/src/intl/sk/page-stablecoins.json b/src/intl/sk/page-stablecoins.json index 997c0358e52..219ad20b547 100644 --- a/src/intl/sk/page-stablecoins.json +++ b/src/intl/sk/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Logo Matcha", "oasis-logo": "Logo Oasis", "uniswap-logo": "Logo Uniswap", - "page-stablecoins-category": "Ovládací panel a vzdelávanie" + "page-stablecoins-category-dashboard-and-education": "Ovládací panel a vzdelávanie" } diff --git a/src/intl/sl/page-stablecoins.json b/src/intl/sl/page-stablecoins.json index 45617fb6183..d0f3a480f70 100644 --- a/src/intl/sl/page-stablecoins.json +++ b/src/intl/sl/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Vir", "page-stablecoins-bitcoin-pizza": "Zloglasna Bitcoin pica", "page-stablecoins-bitcoin-pizza-body": "Leta 2010 je nekdo kupil 2 pici za 10.000 bitcoinov. Takrat je bilo to enakovredno približno 41 USD. Na današnjem trgu je vrednost narasla na več milijonov dolarjev. V Ethereumovi zgodovini obstajajo številne podobno transakcije, vredne obžalovanja. Stabilni kovanci rešujejo to težavo, tako da lahko uživate v pici in obdržite svoj ETH.", - "page-stablecoins-category": "Nadzorna plošča in izobraževanje", + "page-stablecoins-category-dashboard-and-education": "Nadzorna plošča in izobraževanje", "page-stablecoins-coin-price-change": "Spremembe cen kovancev (zadnjih 30 dni)", "page-stablecoins-crypto-backed": "Temeljijo na kriptografiji", "page-stablecoins-crypto-backed-con-1": "Manj stabilni kot stabilni kovanci, ki temeljijo na fiat valutah.", diff --git a/src/intl/sr/page-stablecoins.json b/src/intl/sr/page-stablecoins.json index 75cfc5b420d..aff0efd1c90 100644 --- a/src/intl/sr/page-stablecoins.json +++ b/src/intl/sr/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Izvor", "page-stablecoins-bitcoin-pizza": "Poznata Bitcoin pica", "page-stablecoins-bitcoin-pizza-body": "Godine 2010. neko je kupio dve pice za 10.000 bitcoina. U to vreme, to je vredelo približno 41 USD. Na današnjem tržištu to su milioni dolara. Postoji mnogo sličnih transakcija za žaljenje u istoriji mreže Ethereum. Stabilni novčići rešavaju taj problem, tako da možete uživati u pici i zadržati svoj ETH.", - "page-stablecoins-category": "Контролна табла и образовање", + "page-stablecoins-category-dashboard-and-education": "Контролна табла и образовање", "page-stablecoins-coin-price-change": "Promena cene novčića (u poslednjih 30 dana)", "page-stablecoins-crypto-backed": "Podržan kriptovalutom", "page-stablecoins-crypto-backed-con-1": "Stabilni novčići koji su manje stabilni od onih podržanih valutom fiat.", diff --git a/src/intl/sw/page-stablecoins.json b/src/intl/sw/page-stablecoins.json index c8dd3411f06..550d9350553 100644 --- a/src/intl/sw/page-stablecoins.json +++ b/src/intl/sw/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Chanzo", "page-stablecoins-bitcoin-pizza": "Pizza isiomaarufu ya Bitcoin", "page-stablecoins-bitcoin-pizza-body": "Mwaka 2010, jamaa fulani alinunua pizza 2 kwa bitcoin 10,000. Kwa wakati huo bitcoin ililkua na thamani ya dola ya Marekani ~$41. Kwenye soko la leo hayo ni mamilioni ya dola. Kuna miamala ya kufanana yenye majuto kwenye historia ya Ethereum. Sarafu-imara hutoa suluhisho juu ya tatizo hili, ili uweze kufurahia pizza yako na kuendelea kushikilia ETH yako.", - "page-stablecoins-category": "Dashboard & Elimu", + "page-stablecoins-category-dashboard-and-education": "Dashboard & Elimu", "page-stablecoins-coin-price-change": "Mabadiliko ya bei ya sarafu (siku 30 zilizopita)", "page-stablecoins-crypto-backed": "Inategemea Kripto", "page-stablecoins-crypto-backed-con-1": "Uimara wake uko chini ya uimara wa sarafu-imara zinazotegemea fedha halisi za serikali.", diff --git a/src/intl/ta/page-stablecoins.json b/src/intl/ta/page-stablecoins.json index ce3693bb032..987849b0044 100644 --- a/src/intl/ta/page-stablecoins.json +++ b/src/intl/ta/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Matcha லோகோ", "oasis-logo": "Oasis லோகோ", "uniswap-logo": "Uniswap லோகோ", - "page-stablecoins-category": "டாஷ்போர்டு & கல்வி" + "page-stablecoins-category-dashboard-and-education": "டாஷ்போர்டு & கல்வி" } diff --git a/src/intl/th/page-stablecoins.json b/src/intl/th/page-stablecoins.json index 65807ec74ce..3f099ab2fcf 100644 --- a/src/intl/th/page-stablecoins.json +++ b/src/intl/th/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "โลโก้ Matcha", "oasis-logo": "โลโก้ Oasis", "uniswap-logo": "โลโก้ Uniswap", - "page-stablecoins-category": "แผงควบคุมและการศึกษา" + "page-stablecoins-category-dashboard-and-education": "แผงควบคุมและการศึกษา" } diff --git a/src/intl/tr/page-stablecoins.json b/src/intl/tr/page-stablecoins.json index 12605061a4c..0e5a9d125e8 100644 --- a/src/intl/tr/page-stablecoins.json +++ b/src/intl/tr/page-stablecoins.json @@ -63,6 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Kaynak", "page-stablecoins-bitcoin-pizza": "Kötü şöhretli Bitcoin pizzası", "page-stablecoins-bitcoin-pizza-body": "2010 yılında bir kişi 10.000 bitcoin karşılığında 2 pizza satın aldı. O zamanlar yaklaşık değeri 41 USD değerindeydi. Bugünün piyasasında bu milyonlarca dolar. Ethereum'un tarihinde buna benzer birçok pişmanlık verici işlem var. Sabit paralar bu sorunu çözer, böylece pizzanızın tadını çıkarabilir ve ETH'nizi elinizde tutabilirsiniz.", + "page-stablecoins-category-dashboard-and-education": "Panel we Umumyýet", "page-stablecoins-coin-price-change": "Para fiyat değişikliği (son 30 gün)", "page-stablecoins-crypto-backed": "Kripto destekli", "page-stablecoins-crypto-backed-con-1": "Fiat-destekli sabit paralardan daha az stabil.", diff --git a/src/intl/uk/page-stablecoins.json b/src/intl/uk/page-stablecoins.json index c9f16866000..f1308a39652 100644 --- a/src/intl/uk/page-stablecoins.json +++ b/src/intl/uk/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Джерело", "page-stablecoins-bitcoin-pizza": "Сумнозвісна піца Bitcoin", "page-stablecoins-bitcoin-pizza-body": "У 2010 році хтось купив 2 піци за 10 000 BTC. На той час вони коштували ~41 долар США. Сьогодні на ринку це мільйони доларів. Історія Ethereum налічує багато аналогічних помилкових транзакцій. Стабільні монети вирішують цю проблему, тож ви можете насолоджуватися піцою, не використовуючи ETH.", - "page-stablecoins-category": "Панель управління та освіта", + "page-stablecoins-category-dashboard-and-education": "Панель управління та освіта", "page-stablecoins-coin-price-change": "Зміна ціни монети (за останні 30 днів)", "page-stablecoins-crypto-backed": "Захищено криптовалютою", "page-stablecoins-crypto-backed-con-1": "Менш стабільні, ніж кредитно-паперові стабільні монети.", diff --git a/src/intl/ur/page-stablecoins.json b/src/intl/ur/page-stablecoins.json index ab1062feda3..60d8664495a 100644 --- a/src/intl/ur/page-stablecoins.json +++ b/src/intl/ur/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Matcha لوگو", "oasis-logo": "Oasis لوگو", "uniswap-logo": "Uniswap لوگو", - "page-stablecoins-category": "Панель управління та освіта" + "page-stablecoins-category-dashboard-and-education": "Панель управління та освіта" } diff --git a/src/intl/uz/page-stablecoins.json b/src/intl/uz/page-stablecoins.json index c7873dc6189..d93a2eed41b 100644 --- a/src/intl/uz/page-stablecoins.json +++ b/src/intl/uz/page-stablecoins.json @@ -16,5 +16,5 @@ "matcha-logo": "Matcha logotipi", "oasis-logo": "Oasis logotipi", "uniswap-logo": "Uniswap logotipi", - "page-stablecoins-category": "Boshqarish paneli va ta'lim" + "page-stablecoins-category-dashboard-and-education": "Boshqarish paneli va ta'lim" } diff --git a/src/intl/vi/page-stablecoins.json b/src/intl/vi/page-stablecoins.json index e67b32b7005..62625d029f4 100644 --- a/src/intl/vi/page-stablecoins.json +++ b/src/intl/vi/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "Nguồn", "page-stablecoins-bitcoin-pizza": "Phi vụ pizza Bitcoin đình đám", "page-stablecoins-bitcoin-pizza-body": "Vào năm 2010, một người đã mua 2 chiếc pizza bằng 10.000 bitcoin. Vào thời điểm đó, chúng có giá trị ~$41 USD. Trong thị trường hiện tại, giá trị tương ứng lên đến hàng triệu đô-la. Có rất nhiều giao dịch đáng tiếc tương tự xảy ra trong lịch sử của Ethereum. Stablecoin giải quyết được vấn đề này, vì vậy bạn có thể vừa thưởng thức pizza, vừa bảo toàn ETH của mình.", - "page-stablecoins-category": "Bảng điều khiển & Giáo dục", + "page-stablecoins-category-dashboard-and-education": "Bảng điều khiển & Giáo dục", "page-stablecoins-coin-price-change": "Biến động giá coin (30 ngày qua)", "page-stablecoins-crypto-backed": "Được hỗ trợ bởi tiền mã hóa", "page-stablecoins-crypto-backed-con-1": "Ít ổn định hơn so với các stablecoin được hỗ trợ bởi tiền pháp định.", diff --git a/src/intl/zh-tw/page-stablecoins.json b/src/intl/zh-tw/page-stablecoins.json index 0224ae0401e..32838bf5fdb 100644 --- a/src/intl/zh-tw/page-stablecoins.json +++ b/src/intl/zh-tw/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "來源", "page-stablecoins-bitcoin-pizza": "惡名昭彰的比特幣披薩", "page-stablecoins-bitcoin-pizza-body": "2010 年,有人以 10,000 比特幣購入 2 片披薩。當時這筆金額大約為 $41 美金,在今天價值上百萬美金。以太坊歷史上也有許多類似不堪回首的交易。穩定幣解決了這個問題,在你享用披薩的同時並保有你的以太幣。", - "page-stablecoins-category": "儀表板和教育", + "page-stablecoins-category-dashboard-and-education": "儀表板和教育", "page-stablecoins-coin-price-change": "價格變化 (過去 30 天)", "page-stablecoins-crypto-backed": "由加密貨幣擔保", "page-stablecoins-crypto-backed-con-1": "與法定貨幣擔保穩定幣相比較為不安定。", diff --git a/src/intl/zh/page-stablecoins.json b/src/intl/zh/page-stablecoins.json index 05e3514aee1..a2a4bdeeab0 100644 --- a/src/intl/zh/page-stablecoins.json +++ b/src/intl/zh/page-stablecoins.json @@ -63,7 +63,7 @@ "page-stablecoins-bank-apy-source-link": "来源", "page-stablecoins-bitcoin-pizza": "臭名昭著的比特币比萨", "page-stablecoins-bitcoin-pizza-body": "2010年,有人用10000枚比特币购买了2个比萨,在当时,这些比特币价值 $41美元。而在现在,那就是百万美元。在以太坊的历史上还有很多类似令人懊悔的交易。稳定币可以解决这个问题,因此你可以一边手握ETH,一边享用你的披萨。", - "page-stablecoins-category": "仪表板和教育", + "page-stablecoins-category-dashboard-and-education": "仪表板和教育", "page-stablecoins-coin-price-change": "币价波动(最近30天)", "page-stablecoins-crypto-backed": "由加密货币支撑", "page-stablecoins-crypto-backed-con-1": "不如法币支撑的稳定币稳定。", diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 8d2b32c3d03..69c42c98cb5 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -744,7 +744,7 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { >
      From c2cc1f8929f02adb1aef12dc66cf04ffa16f6a44 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:37:39 -0800 Subject: [PATCH 290/478] feat: update matomo tracking for nav menu pass locale and English activeSection name to event; remove passage of lvl --- src/components/Nav/Menu/LvlContent.tsx | 9 +++++--- src/components/Nav/Menu/index.tsx | 30 +++++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 56b21e7339b..9c809a52045 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -21,6 +21,7 @@ type LvlContentProps = { lvl: Level refs: LvlRefs items: NavItem[] + activeSection: string } /** @@ -30,10 +31,11 @@ type LvlContentProps = { * @param lvl - The level of the menu * @param refs - The references to the Grid column elements. * @param items - The items to be displayed in the menu + * @param activeSection - English label of the active section for event tracking * @returns The JSX element representing the menu content. */ -const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { - const { asPath } = useRouter() +const LvlContent = ({ lvl, refs, items, activeSection }: LvlContentProps) => { + const { asPath, locale } = useRouter() const menuColors = useNavMenuColors() if (lvl > 3) return null @@ -98,7 +100,7 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { onClick={() => trackCustomEvent({ eventCategory: "Desktop navigation menu", - eventAction: `Follow level ${lvl} link`, + eventAction: `Follow link from section: ${locale} - ${activeSection}`, eventName: action.href!, }) } @@ -119,6 +121,7 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { lvl={(lvl + 1) as Level} items={subItems} refs={refs} + activeSection={activeSection} /> )} diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 2451607f8e6..46123e12a55 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,4 +1,4 @@ -import { useRef } from "react" +import { useRef, useState } from "react" import { Box, type BoxProps, Flex, Grid } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" @@ -8,7 +8,7 @@ import { trackCustomEvent } from "@/lib/utils/matomo" import { SECTION_LABELS } from "@/lib/constants" -import type { Level, LvlRefs, NavSections } from "../types" +import type { Level, LvlRefs, NavSectionKey, NavSections } from "../types" import LvlContent from "./LvlContent" @@ -22,6 +22,7 @@ type NavMenuProps = BoxProps & { const Menu = ({ sections, ...props }: NavMenuProps) => { const { direction } = useRtlFlip() const menuColors = useNavMenuColors() + const [activeSection, setActiveSection] = useState(null) const refs: LvlRefs = { lvl1: useRef(null), @@ -38,6 +39,16 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { }, }) + const getEnglishSectionName = ( + activeSection: string + ): NavSectionKey | null => { + const index = Object.values(sections).findIndex( + (section) => section.label === activeSection + ) + if (index < 0) return null + return Object.keys(sections)[index] as NavSectionKey + } + return ( { orientation="horizontal" delayDuration={750} onValueChange={(activeSection) => { - trackCustomEvent({ - eventCategory: "Desktop navigation menu", - eventAction: "Section changed", - eventName: activeSection - ? `Open section: ${activeSection}` - : "Menu closed", - }) + setActiveSection(getEnglishSectionName(activeSection)) }} > @@ -77,7 +82,12 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { {label} - + ) })} From 17148c4ef00671e91bec256844fd48b29aa45bd6 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:47:27 -0800 Subject: [PATCH 291/478] fix: desktop activeSection typing --- src/components/Nav/Menu/LvlContent.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 9c809a52045..ca57224795e 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -10,7 +10,7 @@ import Link from "@/components/Link" import { trackCustomEvent } from "@/lib/utils/matomo" import { cleanPath } from "@/lib/utils/url" -import type { Level, LvlRefs, NavItem } from "../types" +import type { Level, LvlRefs, NavItem, NavSectionKey } from "../types" import ItemContent from "./ItemContent" import NextChevron from "./NextChevron" @@ -21,7 +21,7 @@ type LvlContentProps = { lvl: Level refs: LvlRefs items: NavItem[] - activeSection: string + activeSection: NavSectionKey | null } /** From 844f59f201e1e241b2b9b798edd05e7cbbedd527 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:48:20 -0800 Subject: [PATCH 292/478] feat: update matomo tracking for mobile nav menu --- src/components/Nav/Mobile/LvlAccordion.tsx | 15 ++++++++++++--- src/components/Nav/Mobile/MenuBody.tsx | 8 +++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/components/Nav/Mobile/LvlAccordion.tsx b/src/components/Nav/Mobile/LvlAccordion.tsx index aaf8b9f58d5..29d53c36934 100644 --- a/src/components/Nav/Mobile/LvlAccordion.tsx +++ b/src/components/Nav/Mobile/LvlAccordion.tsx @@ -1,3 +1,4 @@ +import { useRouter } from "next/router" import { Accordion, AccordionButton, @@ -14,7 +15,7 @@ import { BaseLink } from "@/components/Link" import { trackCustomEvent } from "@/lib/utils/matomo" -import type { Level, NavItem } from "../types" +import type { Level, NavItem, NavSectionKey } from "../types" import ExpandIcon from "./ExpandIcon" @@ -23,10 +24,17 @@ import { useNavMenuColors } from "@/hooks/useNavMenuColors" type LvlAccordionProps = { lvl: Level items: NavItem[] + activeSection: NavSectionKey onToggle: () => void } -const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { +const LvlAccordion = ({ + lvl, + items, + activeSection, + onToggle, +}: LvlAccordionProps) => { + const { locale } = useRouter() const menuColors = useNavMenuColors() return ( @@ -52,7 +60,7 @@ const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { onClick={() => { trackCustomEvent({ eventCategory: "Mobile navigation menu", - eventAction: `Follow level ${lvl - 1} link`, + eventAction: `Follow link from section: ${locale} - ${activeSection}`, eventName: actions.href!, }) onToggle() @@ -123,6 +131,7 @@ const LvlAccordion = ({ lvl, items, onToggle }: LvlAccordionProps) => { diff --git a/src/components/Nav/Mobile/MenuBody.tsx b/src/components/Nav/Mobile/MenuBody.tsx index a628552b7f2..2d4839536fe 100644 --- a/src/components/Nav/Mobile/MenuBody.tsx +++ b/src/components/Nav/Mobile/MenuBody.tsx @@ -30,8 +30,9 @@ const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => { return ( - {SECTION_LABELS.map((key) => linkSections[key]).map( - ({ label, items }) => ( + {SECTION_LABELS.map((key) => { + const { label, items } = linkSections[key] + return ( {({ isExpanded }) => ( <> @@ -79,6 +80,7 @@ const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => { @@ -86,7 +88,7 @@ const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => { )} ) - )} + })} ) From eef51d05a9ab68b965f04514ad976e1e3752a062 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 10:59:51 -0800 Subject: [PATCH 293/478] feat: update matomo tracking for mobile nav menu update open/close events to use English section key and locale --- src/components/Nav/Mobile/MenuBody.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/Mobile/MenuBody.tsx b/src/components/Nav/Mobile/MenuBody.tsx index 2d4839536fe..a53b4c525be 100644 --- a/src/components/Nav/Mobile/MenuBody.tsx +++ b/src/components/Nav/Mobile/MenuBody.tsx @@ -1,3 +1,4 @@ +import { useRouter } from "next/router" import { Accordion, AccordionButton, @@ -25,6 +26,7 @@ type MenuBodyProps = { } const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => { + const { locale } = useRouter() const menuColors = useNavMenuColors() return ( @@ -53,7 +55,7 @@ const MenuBody = ({ linkSections, onToggle }: MenuBodyProps) => { eventAction: "Section changed", eventName: `${ isExpanded ? "Close" : "Open" - } section: ${label}`, + } section: ${locale} - ${key}`, }) }} > From 4eee7acde7eec28e8ea261719dcedaf7eae0d939 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 14 Feb 2024 12:27:25 -0700 Subject: [PATCH 294/478] cleanup --- src/pages/stablecoins.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 69c42c98cb5..19b33fd371f 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -1,5 +1,5 @@ import { GetStaticProps } from "next/types" -import { useTranslation } from "next-i18next"; +import { useTranslation } from "next-i18next" import { serverSideTranslations } from "next-i18next/serverSideTranslations" import { Box, @@ -55,6 +55,7 @@ import daiLargeImg from "@/public/stablecoins/dai-large.png" import heroImg from "@/public/stablecoins/hero.png" import stablecoinsWtfImg from "@/public/stablecoins/tools/stablecoinswtf.png" import usdcLargeImg from "@/public/stablecoins/usdc-large.png" + type EthereumDataResponse = Array<{ id: string name: string From fd0651b0598d26db6ca65663f4112e8c808c4c45 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 19:27:40 +0000 Subject: [PATCH 295/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f88848028fb..5e4171c0e52 100644 --- a/README.md +++ b/README.md @@ -1726,6 +1726,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Alexey Nebolsin
      Alexey Nebolsin

      📖 jimgreen2013
      jimgreen2013

      📖 + Gabriel Temsten
      Gabriel Temsten

      💻 From e054d7fb272700b8f0fb51f1ac4236118c806bad Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 19:27:41 +0000 Subject: [PATCH 296/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 40bede61c16..7cfb717aa85 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11065,6 +11065,15 @@ "contributions": [ "doc" ] + }, + { + "login": "gabrieltemtsen", + "name": "Gabriel Temsten", + "avatar_url": "https://avatars.githubusercontent.com/u/57184013?v=4", + "profile": "https://github.com/gabrieltemtsen", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From e288edb9bbd01db84728cd90596202f1e69c8c92 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 14 Feb 2024 12:33:43 -0700 Subject: [PATCH 297/478] linter --- src/components/DevconGrantsBanner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DevconGrantsBanner.tsx b/src/components/DevconGrantsBanner.tsx index 0fe48217d5d..8f07b8df3a9 100644 --- a/src/components/DevconGrantsBanner.tsx +++ b/src/components/DevconGrantsBanner.tsx @@ -1,6 +1,6 @@ +import Emoji from "react-emoji-render" import { Text } from "@chakra-ui/react" -import Emoji from "react-emoji-render" import DismissableBanner from "./Banners/DismissableBanner" import Link from "./Link" From 89626c960f8bb58b7ae5bdd6e355e1f8b94e1988 Mon Sep 17 00:00:00 2001 From: jennyg0 Date: Wed, 14 Feb 2024 14:39:52 -0500 Subject: [PATCH 298/478] fix from review --- public/_redirects | 2 -- 1 file changed, 2 deletions(-) diff --git a/public/_redirects b/public/_redirects index 242b068272d..59711548c56 100644 --- a/public/_redirects +++ b/public/_redirects @@ -181,5 +181,3 @@ /*/studio /:splat/deprecated-software/#ethereum-studio 301! /en/stablecoins /stablecoins 301! - -/*/community/events https://esp.ethereum.foundation/devcon-grants 301! From 8324189b00215fd48d1b17e3167ad453f900d2f5 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 14 Feb 2024 12:52:19 -0700 Subject: [PATCH 299/478] cleanup --- public/_redirects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/_redirects b/public/_redirects index 59711548c56..5ee30bff053 100644 --- a/public/_redirects +++ b/public/_redirects @@ -180,4 +180,4 @@ /*/studio /:splat/deprecated-software/#ethereum-studio 301! -/en/stablecoins /stablecoins 301! +/en/stablecoins /stablecoins 301! \ No newline at end of file From 8959d76e3c145a2242dd5d1fc0e37fcaee73ac52 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 14 Feb 2024 12:54:36 -0700 Subject: [PATCH 300/478] add a space between emoji --- src/components/DevconGrantsBanner.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/DevconGrantsBanner.tsx b/src/components/DevconGrantsBanner.tsx index 8f07b8df3a9..1fac033ff62 100644 --- a/src/components/DevconGrantsBanner.tsx +++ b/src/components/DevconGrantsBanner.tsx @@ -14,7 +14,7 @@ const DevconGrantsBanner: React.FC = ({ pathname }) => { The Road to Devcon Grants support Ethereum education initiatives in - and close to Southeast Asia + and close to Southeast Asia {" "} Learn more{" "} here. From ffcca0425043dd02f118ffbd2921369e761ca048 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 19:55:30 +0000 Subject: [PATCH 301/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5e4171c0e52..712792c1cda 100644 --- a/README.md +++ b/README.md @@ -1727,6 +1727,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Alexey Nebolsin
      Alexey Nebolsin

      📖 jimgreen2013
      jimgreen2013

      📖 Gabriel Temsten
      Gabriel Temsten

      💻 + Jen
      Jen

      💻 From b0fb5b1f76eaf0f9fb452afd72ee8d45f8c379b8 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 19:55:31 +0000 Subject: [PATCH 302/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7cfb717aa85..b5f07a52dcd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11074,6 +11074,15 @@ "contributions": [ "code" ] + }, + { + "login": "jennyg0", + "name": "Jen ", + "avatar_url": "https://avatars.githubusercontent.com/u/60794961?v=4", + "profile": "https://github.com/jennyg0", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, From ed0b0897e419fdf912ea20cd8693663c540970c5 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 12:49:22 -0800 Subject: [PATCH 303/478] fix: name reversion --- src/intl/bg/page-languages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/bg/page-languages.json b/src/intl/bg/page-languages.json index 03edcfe6ed0..73337563552 100644 --- a/src/intl/bg/page-languages.json +++ b/src/intl/bg/page-languages.json @@ -4,7 +4,7 @@ "page-languages-learn-more": "Научете повече за нашата Програма за преводи", "page-languages-meta-desc": "Източници за всички поддържани езици в ethereum.org и начини да се включите като преводач.", "page-languages-meta-title": "езикови преводи на ethereum.org", - "page-languages-p1": "Ethereum е глобален проект и достъпът на всички в ethereum.org е от изключително значение, независимо каква е тяхната националност или език. Нашата общност работи усилено да превърне тази визия в реалност.", + "page-languages-p1": "Етереум е глобален проект и достъпът на всички в ethereum.org е от изключително значение, независимо каква е тяхната националност или език. Нашата общност работи усилено да превърне тази визия в реалност.", "page-languages-translations-available": "ethereum.org е наличен на следните езици", "page-languages-resources-paragraph": "Освен че превеждаме съдържанието на ethereum.org, също така поддържаме и", "page-languages-resources-link": "списък с подбрани ресурси на Етереум на много различни езици", From c310f6c3b844b5d8bc717a79cf599fba4c83a94a Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Wed, 14 Feb 2024 22:43:35 +0100 Subject: [PATCH 304/478] horizontal nav using grids --- src/components/Nav/Menu/LvlContent.tsx | 189 ++++++++++++------------- src/components/Nav/Menu/index.tsx | 37 ++--- 2 files changed, 105 insertions(+), 121 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 95c02414f89..0114126d688 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -1,8 +1,7 @@ import NextLink from "next/link" import { useRouter } from "next/router" -import { Button, Icon, ListItem, UnorderedList } from "@chakra-ui/react" +import { Button, Grid, Icon, ListItem, UnorderedList } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" -import * as Portal from "@radix-ui/react-portal" import { ButtonProps } from "@/components/Buttons" import Link from "@/components/Link" @@ -19,7 +18,6 @@ import { useNavMenuColors } from "@/hooks/useNavMenuColors" type LvlContentProps = { lvl: Level - refs: LvlRefs items: NavItem[] } @@ -28,11 +26,10 @@ type LvlContentProps = { * Content renders inside sibling Viewport * Viewport wrapped in Portal to render inside a passed ref * @param lvl - The level of the menu - * @param refs - The references to the Grid column elements. * @param items - The items to be displayed in the menu * @returns The JSX element representing the menu content. */ -const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { +const LvlContent = ({ lvl, items }: LvlContentProps) => { const { asPath } = useRouter() const menuColors = useNavMenuColors() @@ -41,97 +38,97 @@ const LvlContent = ({ lvl, refs, items }: LvlContentProps) => { const pad = 4 // Chakra-UI space token return ( - - - - {items.map((item) => { - const { label, description, icon, ...action } = item - const subItems = action.items || [] - const isLink = "href" in action - const isActivePage = isLink && cleanPath(asPath) === action.href - const activeStyles = { - outline: "none", - rounded: "md", - "p, svg": { color: menuColors.highlight }, - bg: menuColors.lvl[lvl].activeBackground, - boxShadow: "none", - } - const buttonProps: ButtonProps = { - color: isActivePage ? menuColors.active : menuColors.body, - leftIcon: lvl === 1 && icon ? : undefined, - rightIcon: isLink ? undefined : , - position: "relative", - w: "full", - me: -pad, - sx: { - "span:first-of-type": { m: 0, me: pad }, // Spacing for icon - }, - py: pad, - bg: "none", - _hover: activeStyles, - _focus: activeStyles, - variant: "ghost", - } - return ( - - { - // Bring focus to destination button when leaving - ;(e.relatedTarget as HTMLButtonElement).focus() - }} - > - {isLink ? ( - - - - - - ) : ( - <> - - - - - - - - )} - - - ) - })} - - - - {/* - */} + + + + + {items.map((item) => { + const { label, description, icon, ...action } = item + const subItems = action.items || [] + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + const activeStyles = { + outline: "none", + rounded: "md", + "p, svg": { color: menuColors.highlight }, + bg: menuColors.lvl[lvl].activeBackground, + boxShadow: "none", + } + const buttonProps: ButtonProps = { + color: isActivePage ? menuColors.active : menuColors.body, + leftIcon: lvl === 1 && icon ? : undefined, + rightIcon: isLink ? undefined : , + position: "relative", + w: "full", + me: -pad, + sx: { + "span:first-of-type": { m: 0, me: pad }, // Spacing for icon + }, + py: pad, + bg: "none", + _hover: activeStyles, + _focus: activeStyles, + variant: "ghost", + } + return ( + + { + // Bring focus to destination button when leaving + ;(e.relatedTarget as HTMLButtonElement).focus() + }} + > + {isLink ? ( + + + + + + ) : ( + <> + + + + + + + + )} + + + ) + })} + + + + + ) } diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index aabb39092e6..3ae65fae4bc 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,5 +1,4 @@ -import { useRef } from "react" -import { Box, type BoxProps, Flex, Grid } from "@chakra-ui/react" +import { Box, type BoxProps, Flex } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import { Button } from "@/components/Buttons" @@ -23,20 +22,14 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { const { direction } = useRtlFlip() const menuColors = useNavMenuColors() - const refs: LvlRefs = { - lvl1: useRef(null), - lvl2: useRef(null), - lvl3: useRef(null), - } - - const getLvlSx = (lvl: Level): BoxProps["sx"] => ({ - opacity: 0, - '&:has([data-state="open"])': { - bg: menuColors.lvl[lvl].background, - opacity: 1, - transition: "opacity 300ms linear", - }, - }) + // const getLvlSx = (lvl: Level): BoxProps["sx"] => ({ + // opacity: 0, + // '&:has([data-state="open"])': { + // bg: menuColors.lvl[lvl].background, + // opacity: 1, + // transition: "opacity 300ms linear", + // }, + // }) return ( @@ -78,16 +71,14 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { - { }, }} > - - + + ) @@ -111,10 +102,6 @@ const Menu = ({ sections, ...props }: NavMenuProps) => {
      - {/* - - - */}
      ) From 9d6833e04490dcf1075a0cc1e1f90ab71e0ad75b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 22:03:36 +0000 Subject: [PATCH 305/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 712792c1cda..0af799fc5bd 100644 --- a/README.md +++ b/README.md @@ -1728,6 +1728,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d jimgreen2013
      jimgreen2013

      📖 Gabriel Temsten
      Gabriel Temsten

      💻 Jen
      Jen

      💻 + Eugene
      Eugene

      🖋 From 9a932da37e8bf8e3d515b820ecedc96529e9b188 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 22:03:37 +0000 Subject: [PATCH 306/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index b5f07a52dcd..3dc08322726 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11083,6 +11083,15 @@ "contributions": [ "code" ] + }, + { + "login": "Molotov-Eugene", + "name": "Eugene", + "avatar_url": "https://avatars.githubusercontent.com/u/95471552?v=4", + "profile": "https://github.com/Molotov-Eugene", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, From a252172a5e8bbbfea890db2757462798c06274ce Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:14:24 -0800 Subject: [PATCH 307/478] fix: use internal Emoji component --- src/components/DevconGrantsBanner.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/DevconGrantsBanner.tsx b/src/components/DevconGrantsBanner.tsx index 1fac033ff62..2b89ef8a2a9 100644 --- a/src/components/DevconGrantsBanner.tsx +++ b/src/components/DevconGrantsBanner.tsx @@ -1,7 +1,7 @@ -import Emoji from "react-emoji-render" import { Text } from "@chakra-ui/react" import DismissableBanner from "./Banners/DismissableBanner" +import Emoji from "./Emoji" import Link from "./Link" interface IProps { @@ -14,8 +14,8 @@ const DevconGrantsBanner: React.FC = ({ pathname }) => { The Road to Devcon Grants support Ethereum education initiatives in - and close to Southeast Asia {" "} - Learn more{" "} + and close to Southeast Asia {" "} + Learn more{" "} here. From 8120142e1a118b80b928180c371c3936ca3be658 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:15:53 -0800 Subject: [PATCH 308/478] refactor: update with current code conventions --- src/components/DevconGrantsBanner.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/components/DevconGrantsBanner.tsx b/src/components/DevconGrantsBanner.tsx index 2b89ef8a2a9..8548eb55a87 100644 --- a/src/components/DevconGrantsBanner.tsx +++ b/src/components/DevconGrantsBanner.tsx @@ -1,22 +1,24 @@ import { Text } from "@chakra-ui/react" -import DismissableBanner from "./Banners/DismissableBanner" -import Emoji from "./Emoji" -import Link from "./Link" +import DismissableBanner from "@/components/Banners/DismissableBanner" +import Emoji from "@/components/Emoji" +import Link from "@/components/Link" -interface IProps { +type DevconGrantsBannerProps = { pathname: string } -const DevconGrantsBanner: React.FC = ({ pathname }) => { +const DevconGrantsBanner = ({ pathname }: DevconGrantsBannerProps) => { if (pathname.includes("community") && pathname.includes("events")) { return ( The Road to Devcon Grants support Ethereum education initiatives in - and close to Southeast Asia {" "} - Learn more{" "} - here. + and close to Southeast Asia {" "} + Learn more{" "} + + here. + ) From 4960fa7950871258ec45b2bbc782f68c96c11cb0 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Thu, 15 Feb 2024 09:07:47 +0100 Subject: [PATCH 309/478] migrate column colors --- src/components/Nav/Menu/LvlContent.tsx | 27 +++++++++++++++++++------- src/components/Nav/Menu/index.tsx | 6 ------ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 0114126d688..6d048700710 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -1,6 +1,13 @@ import NextLink from "next/link" import { useRouter } from "next/router" -import { Button, Grid, Icon, ListItem, UnorderedList } from "@chakra-ui/react" +import { + Box, + Button, + Grid, + Icon, + ListItem, + UnorderedList, +} from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import { ButtonProps } from "@/components/Buttons" @@ -39,7 +46,11 @@ const LvlContent = ({ lvl, items }: LvlContentProps) => { return ( - + {items.map((item) => { @@ -112,11 +123,13 @@ const LvlContent = ({ lvl, items }: LvlContentProps) => { - - + + + + )} diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 3ae65fae4bc..8b83f43f45c 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -84,12 +84,6 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { opacity: 1, transition: "opacity 200ms linear", }, - '&:has(#lvl2 [data-state="open"])': { - bg: menuColors.lvl[2].background, - }, - '&:has(#lvl3 [data-state="open"])': { - bg: menuColors.lvl[3].background, - }, }} > From 9a845cdc64e7a1aa2f0bfd07a8ffcf7819a80672 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Thu, 15 Feb 2024 09:22:24 +0100 Subject: [PATCH 310/478] remove gridarea prop --- src/components/Nav/Menu/LvlContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 6d048700710..7682069673c 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -52,7 +52,7 @@ const LvlContent = ({ lvl, items }: LvlContentProps) => { gridTemplateColumns={`repeat(${3 - (lvl - 1)}, 1fr)`} > - + {items.map((item) => { const { label, description, icon, ...action } = item const subItems = action.items || [] From cd2d71f25e28e7640244327818d910cb4d281d3d Mon Sep 17 00:00:00 2001 From: rjabr Date: Thu, 15 Feb 2024 12:13:20 +0200 Subject: [PATCH 311/478] Added missing whitespace after numbered emojis in all languages [Fixes #12173] --- public/content/contributing/design/index.md | 14 +++++++------- .../translations/de/contributing/design/index.md | 14 +++++++------- .../translations/es/contributing/design/index.md | 14 +++++++------- .../translations/fr/contributing/design/index.md | 14 +++++++------- .../translations/it/contributing/design/index.md | 14 +++++++------- .../pt-br/contributing/design/index.md | 14 +++++++------- .../translations/tr/contributing/design/index.md | 14 +++++++------- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/public/content/contributing/design/index.md b/public/content/contributing/design/index.md index be696a897e4..1e9ed484a40 100644 --- a/public/content/contributing/design/index.md +++ b/public/content/contributing/design/index.md @@ -12,7 +12,7 @@ Ultimately, this is a great way to build a diverse and impressive portfolio that ## How to contribute? -### Provide feedback on early design prototypes {#design-critique} +###  Provide feedback on early design prototypes {#design-critique} We sometimes need a help testing our raw ideas. This is a great way how to contribute without any technical knowledge. @@ -20,7 +20,7 @@ We sometimes need a help testing our raw ideas. This is a great way how to contr 2. You will be guided through the designs to provide feedback via comments function. 3. The outcome will be shared in the GitHub issue and then closed by the team. -### Participate in survey research {#answer-surveys} +###  Participate in survey research {#answer-surveys} Provide feedback on our website by: @@ -28,7 +28,7 @@ Provide feedback on our website by: 2. Clicking on the feedback widget at the bottom right corner and answering design and content-related questions. 3. Focus on the free format questions. -### Find design related issues on the website and report them {#report-design-issues} +###  Find design related issues on the website and report them {#report-design-issues} Ethereum.org is a fast growing website with many features and content. Some of the UI can easily become obsolete or could be improved. If you encounter any such instance, please report it so that it gets our attention. @@ -36,7 +36,7 @@ Ethereum.org is a fast growing website with many features and content. Some of t 2. Take screenshots and notes if you see any visual or UX issues. 3. Report the found issues using a [bug report](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -### Propose design changes {#propose-design-changes} +###  Propose design changes {#propose-design-changes} If you feel comfortable taking on design challenges, you can visit our GitHub issues board and filter for [design-related issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ If you feel comfortable taking on design challenges, you can visit our GitHub is 3. Propose the solution in the corresponding GitHub issue or [create a new one.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Wait for the design team to review. -### Build Design System together {#Contribute-to-design-system} +###  Build Design System together {#Contribute-to-design-system} Our design system makes designing ethereum.org fun and easy. If you are an experienced designer, you can help us prepare many components for the website. @@ -56,7 +56,7 @@ Our design system makes designing ethereum.org fun and easy. If you are an exper 5. The design team will review. 6. The Design team will incorporate the changes in the main file and publish the file to the community. -### Write design-related content on the website {#write-design-articles} +###  Write design-related content on the website {#write-design-articles} The Ethereum developer community is strong, but the design community is falling slightly behind. If you are a designer with web3 knowledge, please consider sharing your learnings with the larger community so that we can all grow and improve together; we have [a page on designing for Ethereum](/developers/docs/design-and-ux/) you can contribute to. You can also check our [listing policies](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ The Ethereum developer community is strong, but the design community is falling 4. Once approved, write the content. 5. Submit it in the corresponding GH issue. -### Draw new illustrations {#prepare-illustrations} +###  Draw new illustrations {#prepare-illustrations} Visualisations are one of the most powerful tools to explain abstract topics. There is an enormous potential by adding diagrams and infographics. After all, one image can say thousand words. diff --git a/public/content/translations/de/contributing/design/index.md b/public/content/translations/de/contributing/design/index.md index 564107086d4..80013f3318f 100644 --- a/public/content/translations/de/contributing/design/index.md +++ b/public/content/translations/de/contributing/design/index.md @@ -12,7 +12,7 @@ Letztendlich ist das eine großartige Möglichkeit, ein vielfältiges und beeind ## Wie kann ich etwas beitragen? -### Geben Sie Feedback zu frühen Design-Prototypen {#design-critique} +###  Geben Sie 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. @@ -20,7 +20,7 @@ Manchmal brauchen wir Hilfe beim Testen unserer "rohen" Ideen. Das ist eine gro 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} +###  Teilnahme an Umfragen {#answer-surveys} Geben Sie Feedback zu unserer Website: @@ -28,7 +28,7 @@ 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} +###  Finden Sie designbezogene Probleme auf der Website und melden Sie diese. {#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. @@ -36,7 +36,7 @@ Ethereum.org ist eine schnell wachsende Website mit vielen Funktionen und Inhalt 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). -### Designänderungen vorschlagen {#propose-design-changes} +###  Designänderungen vorschlagen {#propose-design-changes} Wenn Sie sich mit Design-Herausforderungen wohlfühlen, können Sie unser GitHub Issues Board besuchen und nach [designbezogenen Issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtern. @@ -45,7 +45,7 @@ Wenn Sie sich mit Design-Herausforderungen wohlfühlen, können Sie unser GitHub 3. Schlagen Sie die Lösung in dem entsprechenden GitHub-Thema vor oder erstellen Sie ein [neues Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). 4. Warten Sie auf die Überprüfung durch das Designteam. -### Das Designsystem gemeinsam aufbauen {#Contribute-to-design-system} +###  Das Designsystem gemeinsam aufbauen {#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. @@ -56,7 +56,7 @@ Mit unserem Designsystem macht das Entwerfen von ethereum.org Spaß und ist einf 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. -### Verfassen Sie designbezogene Inhalte auf der Website. {#write-design-articles} +###  Verfassen Sie designbezogene Inhalte auf der 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. @@ -66,7 +66,7 @@ Die Ethereum-Entwickler-Community ist stark, aber die Design-Community hinkt etw 4. Sobald die Anfrage genehmigt ist, schreiben Sie den Inhalt. 5. Reichen Sie ihn im entsprechenden GH-Thema ein. -### Gestalten Sie neue Illustrationen. {#prepare-illustrations} +###  Gestalten Sie 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. diff --git a/public/content/translations/es/contributing/design/index.md b/public/content/translations/es/contributing/design/index.md index 93cdbdaafe9..5154ae3b5a3 100644 --- a/public/content/translations/es/contributing/design/index.md +++ b/public/content/translations/es/contributing/design/index.md @@ -12,7 +12,7 @@ Por último, esto es un buen camino para construir un diverso e impresionante po ## ¿Cómo contribuir? -### Proporciona opiniones en diseños tempranos de prototipos {#design-critique} +###  Proporciona opiniones en diseños tempranos de prototipos {#design-critique} Algunas veces necesitamos ayuda para testear nuestras ideas crudas. Esto es un buen camino para saber cómo contribuir sin algunos conocimientos técnicos. @@ -20,7 +20,7 @@ Algunas veces necesitamos ayuda para testear nuestras ideas crudas. Esto es un b 2. Usted será guiado a través de diseños para proporcionar opiniones por comentarios de función. 3. El resultado será compartido en el asunto GitHub y después será cerrado por el equipo. -### Participa en las encuentas {#answer-surveys} +###  Participa en las encuentas {#answer-surveys} Proporciona opiniones en nuestra página web por: @@ -28,7 +28,7 @@ Proporciona opiniones en nuestra página web por: 2. Clicleando en la ventana de opiniones en abajo a la derecha en la esquina y respondiedo diseños y preguntas de contenido relacionado. 3. Céntrate en el formato de preguntas libres. -### Si detecta errores de diseño en la página web, comuníquelos {#report-design-issues} +###  Si detecta errores de diseño en la página web, comuníquelos {#report-design-issues} Ethereum.org es una página de rápido crecimiento con muchas características y contenido. Algunos de la interfaz de usuarios pueden fácilmente convertirse en obsoletos o podrían ser mejorados. Si usted detecta alguno de estos fallos, por favor comuníquelo para que podamos solucionarlo. @@ -36,7 +36,7 @@ Ethereum.org es una página de rápido crecimiento con muchas características y 2. Toma captures y notas si ves algún visual o asuntos UX. 3. Reporte el asunto encontrado usando un [bug report](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -### Propone cambios de diseño {#propose-design-changes} +###  Propone cambios de diseño {#propose-design-changes} Si usted se siente confortable tomando retos de diseños, puedes visitar nuestros asuntos GitHub abordar y filtrar para[asuntos relacionados de diseños](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Si usted se siente confortable tomando retos de diseños, puedes visitar nuestro 3. Propone la solución en el problema correspondiente en GitHub o [crea uno nuevo.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Espera que el equipo de diseño lo revise. -### Construyan juntos un Sistemas de Diseño {#Contribute-to-design-system} +###  Construyan juntos un Sistemas de Diseño {#Contribute-to-design-system} Nuestro sistema de diseño convierte el diseñado de ethereum.org fácil y sencillo. Si eres un diseñador experimentado, puedes ayudarnos a preparar muchos componentes para el sitio web. @@ -56,7 +56,7 @@ Nuestro sistema de diseño convierte el diseñado de ethereum.org fácil y senci 5. El equipo de diseño lo revisará. 6. El equipo de Diseño incorporará los cambios en el archivo principal y lo publicará a la comunidad. -### Escribe contenido relacionado con el diseño en el sitio web {#write-design-articles} +###  Escribe contenido relacionado con el diseño en el sitio web {#write-design-articles} La comunidad para desarrolladores de Ethereum es fuerte, pero la comunidad de diseño se está quedando rezagada. Si eres un diseñador con conocimiento en web3, por favor considera compartir tu conocimiento con la gran comunidad para crecer y mejorar juntos; contamos con [una página sobre el diseño en Ethereum](/developers/docs/design-and-ux/) a la que puedes contribuir. También puedes revisar nuestras [políticas de listado](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ La comunidad para desarrolladores de Ethereum es fuerte, pero la comunidad de di 4. Una vez aprobado, escribe el contenido. 5. Envíalo en el incidente correspondiente en GitHub. -### Dibuja nuevas ilustraciones {#prepare-illustrations} +###  Dibuja nuevas ilustraciones {#prepare-illustrations} Las visualizaciones son una de las herramientas más poderosas para explicar temas abstractos. Añadir diagramas e infografías supone un enorme potencial. Al fin y al cabo, una imagen vale más que mil palabras. diff --git a/public/content/translations/fr/contributing/design/index.md b/public/content/translations/fr/contributing/design/index.md index bc86a499e72..6c43db293f8 100644 --- a/public/content/translations/fr/contributing/design/index.md +++ b/public/content/translations/fr/contributing/design/index.md @@ -12,7 +12,7 @@ Finalement, c'est une excellente façon de construire un portfolio diversifié e ## Comment contribuer ? -### Fournir des commentaires sur les prototypes de conception {#design-critique} +###  Fournir des commentaires sur les prototypes de conception {#design-critique} Nous avons parfois besoin d'aide pour tester nos nouveautés. C'est une excellente manière de contribuer sans avoir de connaissances techniques. @@ -20,7 +20,7 @@ Nous avons parfois besoin d'aide pour tester nos nouveautés. C'est une excellen 2. Vous serez guidé à travers les conceptions pour fournir des commentaires via la fonction de commentaires. 3. Le résultat sera partagé dans une demande GitHub puis fermé par l'équipe. -### Participer à des enquêtes de recherche {#answer-surveys} +###  Participer à des enquêtes de recherche {#answer-surveys} Fournir des commentaires sur notre site web en : @@ -28,7 +28,7 @@ Fournir des commentaires sur notre site web en : 2. Cliquant sur le bouton de commentaire dans le coin inférieur droit et en répondant aux questions liées à la conception et au contenu. 3. Se concentrer sur les questions de format libre. -### Trouver des problèmes liés à la conception du site web et les signaler {#report-design-issues} +###  Trouver des problèmes liés à la conception du site web et les signaler {#report-design-issues} Ethereum.org est un site web en rapide croissance avec de nombreuses fonctionnalités et contenus. Certaines des interfaces utilisateur peuvent facilement devenir obsolètes ou pourraient être améliorées. Si vous rencontrez un tel cas, veuillez le signaler afin que nous y portions notre attention. @@ -36,7 +36,7 @@ Ethereum.org est un site web en rapide croissance avec de nombreuses fonctionnal 2. Prenez des captures d'écran et des notes si vous voyez des problèmes visuels ou d'expérience utilisateur. 3. Signalez les problèmes trouvés en utilisant un [rapport de bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -### Proposez des modifications de conception {#propose-design-changes} +###  Proposez des modifications de conception {#propose-design-changes} Si vous en avez l'envie, vous pouvez relever des défis de conception. Visitez notre tableau des problèmes sur GitHub et opérez un filtrage pour les [problèmes liés à la conception](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Si vous en avez l'envie, vous pouvez relever des défis de conception. Visitez n 3. Proposez la solution dans le problème correspondant sur GitHub ou [créez-en une nouvelle.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Attendez que l'équipe de conception l'examine. -### Construisons le système de conception ensemble {#Contribute-to-design-system} +###  Construisons le système de conception ensemble {#Contribute-to-design-system} Notre système de concep rend la conception d'ethereum.org amusante et facile. Si vous êtes un concepteur expérimenté, vous pouvez nous aider à préparer de nombreux composants pour le site web. @@ -56,7 +56,7 @@ Notre système de concep rend la conception d'ethereum.org amusante et facile. S 5. L'équipe de conception examinera votre travail. 6. L'équipe de conception intégrera les modifications dans le fichier principal et publiera le fichier pour la communauté. -### Rédigez du contenu lié à la conception sur le site web {#write-design-articles} +###  Rédigez du contenu lié à la conception sur le site web {#write-design-articles} La communauté des développeurs Ethereum est solide, mais la communauté des designers est un peu à la traîne. Si vous êtes un concepteur avec des connaissances en web3, envisagez de partager vos découvertes avec toute la communauté afin que nous puissions tous grandir et nous améliorer ensemble ; nous avons [une page sur la conception pour Ethereum](/developers/docs/design-and-ux/) à laquelle vous pouvez contribuer. Vous pouvez également consulter nos [politiques de référencement](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ La communauté des développeurs Ethereum est solide, mais la communauté des de 4. Une fois approuvé, rédigez le contenu. 5. Soumettez-le dans le problème GH correspondant. -### Dessinez de nouvelles illustrations {#prepare-illustrations} +###  Dessinez de nouvelles illustrations {#prepare-illustrations} Les images sont l'un des outils les plus puissants pour expliquer des sujets abstraits. Il y a un énorme potentiel en ajoutant des diagrammes et des infographies. Après tout, une image vaut mille mots. diff --git a/public/content/translations/it/contributing/design/index.md b/public/content/translations/it/contributing/design/index.md index 2c651914a23..cbbcd03aa20 100644 --- a/public/content/translations/it/contributing/design/index.md +++ b/public/content/translations/it/contributing/design/index.md @@ -12,7 +12,7 @@ Infine, questo è un ottimo modo per creare un portafoglio diversificato e sugge ## Come contribuire? -### Fornire feedback ai primi prototipi di progettazione {#design-critique} +###  Fornire feedback ai primi prototipi di progettazione {#design-critique} Talvolta, necessitiamo di aiuto nel testare le nostre idee abbozzate. Questo è un ottimo modo per contribuire senza alcuna conoscenza tecnica. @@ -20,7 +20,7 @@ Talvolta, necessitiamo di aiuto nel testare le nostre idee abbozzate. Questo è 2. Sarai guidato attraverso i design per fornire feedback tramite la funzionalità dei commenti. 3. Il risultato sarà condiviso nel ticket di GitHub e quindi sarà chiuso dal team. -### Partecipare ai sondaggi di ricerca {#answer-surveys} +###  Partecipare ai sondaggi di ricerca {#answer-surveys} Fornisci feedback tramite il nostro sito web: @@ -28,7 +28,7 @@ Fornisci feedback tramite il nostro sito web: 2. Cliccando sul widget del feedback nell'angolo inferiore destro e rispondendo a domande relative a progettazione e contenuti. 3. Concentrati sulle domande in formato libero. -### Trovare problemi di progettazione sul sito web e segnalarli {#report-design-issues} +###  Trovare problemi di progettazione sul sito web e segnalarli {#report-design-issues} Ethereum.org è un sito web in rapida crescita, con molte funzionalità e contenuti. Parte dell'UI può facilmente divenire obsoleta o migliorabile. Se riscontri un caso simile, ti preghiamo di segnalarlo, così che ottenga la nostra attenzione. @@ -36,7 +36,7 @@ Ethereum.org è un sito web in rapida crescita, con molte funzionalità e conten 2. Scatta degli screenshot e annota se vedi qualsiasi problema visivo o dell'UX. 3. Segnala i problemi trovati utilizzando una [segnalazione di bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -### Proponi modifiche al design {#propose-design-changes} +###  Proponi modifiche al design {#propose-design-changes} Se ti senti a tuo agio nell'affrontare le sfide del design, puoi visitare la bacheca dei nostri ticket di GitHub e filtrare i [problemi di design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Se ti senti a tuo agio nell'affrontare le sfide del design, puoi visitare la bac 3. Proponi la soluzione nel ticket di GitHub corrispondente o [creane uno nuovo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). 4. Attendi la revisione del team di progettazione. -### Creare insieme il sistema di progettazione {#Contribute-to-design-system} +###  Creare insieme il sistema di progettazione {#Contribute-to-design-system} Il nostro sistema di progettazione rende la progettazione di ethereum.org divertente e facile. Se sei un progettista esperto, puoi aiutarci a preparare molti componenti per il sito web. @@ -56,7 +56,7 @@ Il nostro sistema di progettazione rende la progettazione di ethereum.org divert 5. Il team di progettazione lo revisionerà. 6. Il team di progettazione incorporerà le modifiche nel file principale e pubblicherà il file per la comunità. -### Scrivere contenuti correlati alla progettazione sul sito web {#write-design-articles} +###  Scrivere contenuti correlati alla progettazione sul sito web {#write-design-articles} La comunità di sviluppatori di Ethereum è forte, mentre quella di progettazione è lievemente in ritardo. Se sei un progettista con conoscenze di Web3, ti preghiamo di condividerle con la comunità, in modo che possiamo tutti crescere e migliorarci insieme; abbiamo [una pagina sulla progettazione su Ethereum](/developers/docs/design-and-ux/) a cui puoi contribuire. Inoltre, puoi consultare le nostre [politiche di elencazione](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ La comunità di sviluppatori di Ethereum è forte, mentre quella di progettazion 4. Una volta approvato, scrivi i contenuti. 5. Inviali nel ticket di GH corrispondente. -### Disegnare nuove illustrazioni {#prepare-illustrations} +###  Disegnare nuove illustrazioni {#prepare-illustrations} Le visualizzazioni sono tra gli strumenti più potenti per spiegare degli argomenti astratti. L'aggiunta di diagrammi e infografiche ha un enorme potenziale. Dopotutto, un'immagine può dire più di mille parole. diff --git a/public/content/translations/pt-br/contributing/design/index.md b/public/content/translations/pt-br/contributing/design/index.md index 4f4edb6bc09..218476c5285 100644 --- a/public/content/translations/pt-br/contributing/design/index.md +++ b/public/content/translations/pt-br/contributing/design/index.md @@ -12,7 +12,7 @@ Por fim, essa é uma ótima maneira de construir um portfólio diversificado e i ## Como contribuir? -### Forneça feedback sobre os primeiros protótipos de design {#design-critique} +###  Forneça feedback sobre os primeiros protótipos de design {#design-critique} Às vezes, precisamos de ajuda para testar nossas ideias originais. Esta é uma ótima maneira de como contribuir sem nenhum conhecimento técnico. @@ -20,7 +20,7 @@ Por fim, essa é uma ótima maneira de construir um portfólio diversificado e i 2. Você será guiado pelos projetos para fornecer feedback por meio da função de comentários. 3. O resultado será compartilhado em problemas do GitHub e depois fechado pela equipe. -### Participe da pesquisa de levantamento {#answer-surveys} +###  Participe da pesquisa de levantamento {#answer-surveys} Forneça seus comentários em nosso site: @@ -28,7 +28,7 @@ Forneça seus comentários em nosso site: 2. Clicando no widget de feedback no canto inferior direito e respondendo a perguntas relacionadas ao design e conteúdo. 3. Foque nas perguntas de formato livre. -### Encontre problemas relacionados ao design no site e reporte-os {#report-design-issues} +###  Encontre problemas relacionados ao design no site e reporte-os {#report-design-issues} O Ethereum.org é um site de rápido crescimento com muitos recursos e conteúdo. Algumas das interfaces de usuário podem facilmente se tornar obsoletas ou poderiam ser aprimoradas. Se você encontrar qualquer caso parecido, por favor reporte ele para que chame a nossa atenção. @@ -36,7 +36,7 @@ O Ethereum.org é um site de rápido crescimento com muitos recursos e conteúdo 2. Faça capturas de tela e anotações se você notar algum problema visual ou de experiência do usuário. 3. Reporte os problemas encontrados usando um [formulário de bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -### Proponha mudanças de design {#propose-design-changes} +###  Proponha mudanças de design {#propose-design-changes} Se você se sente à vontade para enfrentar desafios de design, visite nosso quadro de problemas do GitHub e filtre por [problemas relacionados ao design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Se você se sente à vontade para enfrentar desafios de design, visite nosso qua 3. Proponha a solução no tíquete do GitHub correspondente ou [abra um novo.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Aguarde a revisão do time de design. -### Construir o Sistema de Design juntos {#Contribute-to-design-system} +###  Construir o Sistema de Design juntos {#Contribute-to-design-system} Nosso sistema de design torna o projeto ethereum.org divertido e fácil. Se você é um designer experiente, você pode nos ajudar a preparar muitos componentes para o site. @@ -56,7 +56,7 @@ Nosso sistema de design torna o projeto ethereum.org divertido e fácil. Se voc 5. A equipe de design revisará. 6. A equipe de design vai incorporar as mudanças no arquivo principal e publicará o arquivo para a comunidade. -### Escreva o conteúdo relacionado ao design no site {#write-design-articles} +###  Escreva o conteúdo relacionado ao design no site {#write-design-articles} A comunidade de desenvolvedores Ethereum é forte, mas a comunidade de design está ficando um pouco para trás. Se você é um designer com conhecimento em web3, por favor, considere compartilhar seus aprendizados com a comunidade maior, para que todos possamos crescer e melhorar juntos; temos [uma página sobre design para Ethereum](/developers/docs/design-and-ux/) para a qual você pode contribuir. Você também pode verificar nossas [políticas de listagem](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ A comunidade de desenvolvedores Ethereum é forte, mas a comunidade de design es 4. Uma vez aprovado, escreva o conteúdo. 5. Envie-o no problema GH correspondente. -### Desenhe novas ilustrações {#prepare-illustrations} +###  Desenhe novas ilustrações {#prepare-illustrations} As visualizações são uma das ferramentas mais poderosas para explicar tópicos abstratos. Há um enorme potencial ao adicionar diagramas e infográficos. Afinal, uma imagem pode dizer mil palavras. diff --git a/public/content/translations/tr/contributing/design/index.md b/public/content/translations/tr/contributing/design/index.md index a4aa9e0c985..ce2db6fd779 100644 --- a/public/content/translations/tr/contributing/design/index.md +++ b/public/content/translations/tr/contributing/design/index.md @@ -12,7 +12,7 @@ Sonuç olarak bu, tasarım becerilerinizi sergileyeceğiniz çeşit çeşit ve e ## Nasıl katkıda bulunulur? -### Erken tasarım prototipleri hakkında geribildirim sağlayın {#design-critique} +###  Erken tasarım prototipleri hakkında geribildirim sağlayın {#design-critique} Bazen ham fikirlerimizi test etme konusunda yardıma ihtiyaç duyuyoruz. Bu, herhangi bir teknik bilgi olmadan katkıda bulunmanın harika bir yoludur. @@ -20,7 +20,7 @@ Bazen ham fikirlerimizi test etme konusunda yardıma ihtiyaç duyuyoruz. Bu, her 2. Tasarımların üzerinden yorumlar seçeneğiyle geribildirim vermeye yönlendirileceksiniz. 3. Sonuç, Github konusunda paylaşılacak ve ekip tarafından kapatılacaktır. -### Anket araştırmasına katılın {#answer-surveys} +###  Anket araştırmasına katılın {#answer-surveys} Web sitemiz hakkında geribildirim sağlayın: @@ -28,7 +28,7 @@ Web sitemiz hakkında geribildirim sağlayın: 2. Sağ alt köşede bulunan geribildirim aracına tıklayıp tasarım ve içerik ile ilgili soruları cevaplayın. 3. Serbest biçimdeki sorulara odaklanın. -### Web sitesindeki tasarımla ilgili sorunları bulun ve bildirin {#report-design-issues} +###  Web sitesindeki tasarımla ilgili sorunları bulun ve bildirin {#report-design-issues} Ethereum.org, birçok içeriğe ve özelliğe sahip, hızla büyüyen bir web sitesidir. Bazı kullanıcı arayüzleri, kolayca güncelliğini yitirebilir ya da geliştirilebilir. Böyle bir durumla karşılaşırsanız, dikkate almamız için lütfen bize bildirin. @@ -36,7 +36,7 @@ Ethereum.org, birçok içeriğe ve özelliğe sahip, hızla büyüyen bir web si 2. Herhangi bir görsel sorun ya da kullanıcı deneyimi sorunu görürseniz, ekran görüntüsü ve notlar alın. 3. Bulduğunuz sorunları [hata raporu](https://github.com/ethereum/ethereum-org-website/issues/new/choose) ile bildirin. -### Tasarım değişiklikleri önerin {#propose-design-changes} +###  Tasarım değişiklikleri önerin {#propose-design-changes} Tasarım zorluklarının üstesinden gelme konusunda kendinizi rahat hissediyorsanız, GitHub konu panomuzu ziyaret edip [tasarımla ilgili sorunları](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtreleyin. @@ -45,7 +45,7 @@ Tasarım zorluklarının üstesinden gelme konusunda kendinizi rahat hissediyors 3. İlgili GitHub konusunda çözümü önerin ya da [yeni bir tane oluşturun.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. İncelemesi için tasarım ekibini bekleyin. -### Tasarım Sistemini birlikte geliştirin {#Contribute-to-design-system} +###  Tasarım Sistemini birlikte geliştirin {#Contribute-to-design-system} Tasarım sistemimiz, ethereum.org'u tasarlamayı eğlenceli ve kolay hale getirir. Deneyimli bir tasarımcıysanız, web sitesi için birçok ana bileşen hazırlamamıza yardımcı olabilirsiniz. @@ -56,7 +56,7 @@ Tasarım sistemimiz, ethereum.org'u tasarlamayı eğlenceli ve kolay hale getiri 5. Tasarım ekibi inceleyecektir. 6. Tasarım ekibi, değişiklikleri ana dosyada toplayacak ve bu dosyayı topluluk ile paylaşacaktır. -### Web sitesinde tasarımla ilgili içerik yazın {#write-design-articles} +###  Web sitesinde tasarımla ilgili içerik yazın {#write-design-articles} Ethereum geliştirici topluluğu güçlü olsa da, tasarım topluluğu biraz daha geride kalmıştır. Eğer web3'e dair bilgi sahibi bir tasarımcıysanız, lütfen öğrenimlerinizi daha büyük bir toplulukla paylaşmayı düşünün, böylece birlikte büyür ve gelişebiliriz; katkıda bulunmak isterseniz [Ethereum için bir tasarım sayfamız](/developers/docs/design-and-ux/) bulunmaktadır. Ayrıca [listeleme politikalarımızı](/contributing/design/adding-design-resources) kontrol edebilirsiniz. @@ -66,7 +66,7 @@ Ethereum geliştirici topluluğu güçlü olsa da, tasarım topluluğu biraz dah 4. Onaylandıktan sonra içeriği yazın. 5. İlgili GH konusunda sunun. -### Yeni illüstrasyonlar çizin {#prepare-illustrations} +###  Yeni illüstrasyonlar çizin {#prepare-illustrations} Görselleştirmeler, soyut konuları özetlemenin en güçlü araçlarından biridir. Diyagramlar ve infografikler ekleyerek büyük bir potansiyel elde edilir. Sonuç olarak, bir görsel bin kelime söyleyebilir. From f48306d54147ae25faee286249e9389f515d394b Mon Sep 17 00:00:00 2001 From: rimtaex Date: Thu, 15 Feb 2024 21:12:18 +0900 Subject: [PATCH 312/478] Fix typo --- public/content/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/de/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/es/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/fr/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/hu/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/it/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/ja/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/pt-br/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/tr/developers/docs/apis/json-rpc/index.md | 2 +- .../translations/zh/developers/docs/apis/json-rpc/index.md | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/developers/docs/apis/json-rpc/index.md b/public/content/developers/docs/apis/json-rpc/index.md index f98e573f251..3c259c2e098 100755 --- a/public/content/developers/docs/apis/json-rpc/index.md +++ b/public/content/developers/docs/apis/json-rpc/index.md @@ -622,7 +622,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Retrieving an element of the map is harder. The position of an element in the map is calculated with: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` This means to retrieve the storage on pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] we need to calculate the position with: 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 f4f8f0ac6be..3a5a990326b 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 @@ -575,7 +575,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Das Abrufen eines Elements aus der Karte ist schwieriger. Die Position eines Elements in der Karte wird berechnet mit: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Das bedeutet, um den Speicher auf pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] abzurufen, müssen wir die Position berechnen mit: diff --git a/public/content/translations/es/developers/docs/apis/json-rpc/index.md b/public/content/translations/es/developers/docs/apis/json-rpc/index.md index e3f9edb13d9..a9a00d81686 100644 --- a/public/content/translations/es/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/es/developers/docs/apis/json-rpc/index.md @@ -620,7 +620,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Recuperar un elemento del mapa es más difícil. La posición de un elemento de un mapa se calcula con: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Esto signifíca que para recuperar el almacenamiento en pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] necesitamos calcular la posición con: diff --git a/public/content/translations/fr/developers/docs/apis/json-rpc/index.md b/public/content/translations/fr/developers/docs/apis/json-rpc/index.md index 81282e17f19..b2a31d8867c 100644 --- a/public/content/translations/fr/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/fr/developers/docs/apis/json-rpc/index.md @@ -620,7 +620,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ La récupération d'un élément de la carte est plus difficile. La position d'un élément dans la carte est calculée avec : ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Cela signifie que pour récupérer le stockage sur pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] nous devons calculer la position avec : diff --git a/public/content/translations/hu/developers/docs/apis/json-rpc/index.md b/public/content/translations/hu/developers/docs/apis/json-rpc/index.md index 23402c798ab..97a95f017ce 100644 --- a/public/content/translations/hu/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/hu/developers/docs/apis/json-rpc/index.md @@ -620,7 +620,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ A térkép egyik elemének megszerzése már nehezebb. A térképen egy elem pozícióját így kalkuláljuk: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Ahhoz, hogy megszerezzük a tárhelyet a pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] tekintetében, a pozíciót így kell kalkulálni: diff --git a/public/content/translations/it/developers/docs/apis/json-rpc/index.md b/public/content/translations/it/developers/docs/apis/json-rpc/index.md index 6a1a398aaa7..e046243bd82 100644 --- a/public/content/translations/it/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/it/developers/docs/apis/json-rpc/index.md @@ -575,7 +575,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Recuperare un elemento della mappa è più difficile. La posizione di un elemento nella mappa è calcolata con: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Ciò significa che per recuperare l'archiviazione in pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] dobbiamo calcolare la posizione con: diff --git a/public/content/translations/ja/developers/docs/apis/json-rpc/index.md b/public/content/translations/ja/developers/docs/apis/json-rpc/index.md index 8e0b6b46266..3d1e75ee693 100644 --- a/public/content/translations/ja/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/ja/developers/docs/apis/json-rpc/index.md @@ -620,7 +620,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ ただし、マップの要素の取得は、より複雑になります。 マップの要素の位置は、次のように計算されます。 ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` つまり、pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"]のストレージを取得するためには、次のように位置を計算する必要があります。 diff --git a/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md b/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md index d5abb70bd72..39825cc7f09 100644 --- a/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/pt-br/developers/docs/apis/json-rpc/index.md @@ -575,7 +575,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Recuperar um elemento do mapa é mais difícil. A posição de um elemento no mapa é calculada com: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Isso significa que, para recuperar o armazenamento na pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] precisamos calcular a posição com: diff --git a/public/content/translations/tr/developers/docs/apis/json-rpc/index.md b/public/content/translations/tr/developers/docs/apis/json-rpc/index.md index 725980b6921..9166b134f37 100644 --- a/public/content/translations/tr/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/tr/developers/docs/apis/json-rpc/index.md @@ -575,7 +575,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ Haritanın bir öğesini almak daha zordur. Bir elemanın haritadaki konumu şu şekilde hesaplanır: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` Bu, pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] üzerindeki depolamayı almak için konumu şu şekilde hesaplamamız gerektiği anlamına gelir: diff --git a/public/content/translations/zh/developers/docs/apis/json-rpc/index.md b/public/content/translations/zh/developers/docs/apis/json-rpc/index.md index 3bb3491e867..fa0ab5716d9 100644 --- a/public/content/translations/zh/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/zh/developers/docs/apis/json-rpc/index.md @@ -575,7 +575,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ 检索映射的元素要难一些。 映射中的元素位置通过以下方式计算: ```js -keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` 这意味着要检索 pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] 上的存储,我们需要通过以下方法计算位置: From c9e7f216646e458efb0df638647ad76b29c9df07 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:39:04 +0000 Subject: [PATCH 313/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0af799fc5bd..305480f1611 100644 --- a/README.md +++ b/README.md @@ -1729,6 +1729,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Gabriel Temsten
      Gabriel Temsten

      💻 Jen
      Jen

      💻 Eugene
      Eugene

      🖋 + RimTaeX
      RimTaeX

      🖋 From 0e876e6fe6200806acaefbd50ec2614ea35fdbc4 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:39:05 +0000 Subject: [PATCH 314/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 3dc08322726..ff708ef6b20 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11092,6 +11092,15 @@ "contributions": [ "content" ] + }, + { + "login": "rimtaex", + "name": "RimTaeX", + "avatar_url": "https://avatars.githubusercontent.com/u/155366533?v=4", + "profile": "https://github.com/rimtaex", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, From 8481b1407181a1d76c304b91d3275b7f8f09e213 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 15 Feb 2024 10:51:47 -0700 Subject: [PATCH 315/478] remove extra space --- public/content/contributing/design/index.md | 14 +++++++------- .../translations/de/contributing/design/index.md | 14 +++++++------- .../translations/es/contributing/design/index.md | 14 +++++++------- .../translations/fr/contributing/design/index.md | 14 +++++++------- .../translations/it/contributing/design/index.md | 14 +++++++------- .../pt-br/contributing/design/index.md | 14 +++++++------- .../translations/tr/contributing/design/index.md | 14 +++++++------- 7 files changed, 49 insertions(+), 49 deletions(-) diff --git a/public/content/contributing/design/index.md b/public/content/contributing/design/index.md index 1e9ed484a40..9cb9b17a4d7 100644 --- a/public/content/contributing/design/index.md +++ b/public/content/contributing/design/index.md @@ -12,7 +12,7 @@ Ultimately, this is a great way to build a diverse and impressive portfolio that ## How to contribute? -###  Provide feedback on early design prototypes {#design-critique} +###  Provide feedback on early design prototypes {#design-critique} We sometimes need a help testing our raw ideas. This is a great way how to contribute without any technical knowledge. @@ -20,7 +20,7 @@ We sometimes need a help testing our raw ideas. This is a great way how to contr 2. You will be guided through the designs to provide feedback via comments function. 3. The outcome will be shared in the GitHub issue and then closed by the team. -###  Participate in survey research {#answer-surveys} +###  Participate in survey research {#answer-surveys} Provide feedback on our website by: @@ -28,7 +28,7 @@ Provide feedback on our website by: 2. Clicking on the feedback widget at the bottom right corner and answering design and content-related questions. 3. Focus on the free format questions. -###  Find design related issues on the website and report them {#report-design-issues} +###  Find design related issues on the website and report them {#report-design-issues} Ethereum.org is a fast growing website with many features and content. Some of the UI can easily become obsolete or could be improved. If you encounter any such instance, please report it so that it gets our attention. @@ -36,7 +36,7 @@ Ethereum.org is a fast growing website with many features and content. Some of t 2. Take screenshots and notes if you see any visual or UX issues. 3. Report the found issues using a [bug report](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Propose design changes {#propose-design-changes} +###  Propose design changes {#propose-design-changes} If you feel comfortable taking on design challenges, you can visit our GitHub issues board and filter for [design-related issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ If you feel comfortable taking on design challenges, you can visit our GitHub is 3. Propose the solution in the corresponding GitHub issue or [create a new one.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Wait for the design team to review. -###  Build Design System together {#Contribute-to-design-system} +###  Build Design System together {#Contribute-to-design-system} Our design system makes designing ethereum.org fun and easy. If you are an experienced designer, you can help us prepare many components for the website. @@ -56,7 +56,7 @@ Our design system makes designing ethereum.org fun and easy. If you are an exper 5. The design team will review. 6. The Design team will incorporate the changes in the main file and publish the file to the community. -###  Write design-related content on the website {#write-design-articles} +###  Write design-related content on the website {#write-design-articles} The Ethereum developer community is strong, but the design community is falling slightly behind. If you are a designer with web3 knowledge, please consider sharing your learnings with the larger community so that we can all grow and improve together; we have [a page on designing for Ethereum](/developers/docs/design-and-ux/) you can contribute to. You can also check our [listing policies](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ The Ethereum developer community is strong, but the design community is falling 4. Once approved, write the content. 5. Submit it in the corresponding GH issue. -###  Draw new illustrations {#prepare-illustrations} +###  Draw new illustrations {#prepare-illustrations} Visualisations are one of the most powerful tools to explain abstract topics. There is an enormous potential by adding diagrams and infographics. After all, one image can say thousand words. diff --git a/public/content/translations/de/contributing/design/index.md b/public/content/translations/de/contributing/design/index.md index 80013f3318f..9a0bd796860 100644 --- a/public/content/translations/de/contributing/design/index.md +++ b/public/content/translations/de/contributing/design/index.md @@ -12,7 +12,7 @@ Letztendlich ist das eine großartige Möglichkeit, ein vielfältiges und beeind ## Wie kann ich etwas beitragen? -###  Geben Sie Feedback zu frühen Design-Prototypen {#design-critique} +###  Geben Sie 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. @@ -20,7 +20,7 @@ Manchmal brauchen wir Hilfe beim Testen unserer "rohen" Ideen. Das ist eine gro 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} +###  Teilnahme an Umfragen {#answer-surveys} Geben Sie Feedback zu unserer Website: @@ -28,7 +28,7 @@ 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} +###  Finden Sie designbezogene Probleme auf der Website und melden Sie diese. {#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. @@ -36,7 +36,7 @@ Ethereum.org ist eine schnell wachsende Website mit vielen Funktionen und Inhalt 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). -###  Designänderungen vorschlagen {#propose-design-changes} +###  Designänderungen vorschlagen {#propose-design-changes} Wenn Sie sich mit Design-Herausforderungen wohlfühlen, können Sie unser GitHub Issues Board besuchen und nach [designbezogenen Issues](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtern. @@ -45,7 +45,7 @@ Wenn Sie sich mit Design-Herausforderungen wohlfühlen, können Sie unser GitHub 3. Schlagen Sie die Lösung in dem entsprechenden GitHub-Thema vor oder erstellen Sie ein [neues Thema](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). 4. Warten Sie auf die Überprüfung durch das Designteam. -###  Das Designsystem gemeinsam aufbauen {#Contribute-to-design-system} +###  Das Designsystem gemeinsam aufbauen {#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. @@ -56,7 +56,7 @@ Mit unserem Designsystem macht das Entwerfen von ethereum.org Spaß und ist einf 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. -###  Verfassen Sie designbezogene Inhalte auf der Website. {#write-design-articles} +###  Verfassen Sie designbezogene Inhalte auf der 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. @@ -66,7 +66,7 @@ Die Ethereum-Entwickler-Community ist stark, aber die Design-Community hinkt etw 4. Sobald die Anfrage genehmigt ist, schreiben Sie den Inhalt. 5. Reichen Sie ihn im entsprechenden GH-Thema ein. -###  Gestalten Sie neue Illustrationen. {#prepare-illustrations} +###  Gestalten Sie 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. diff --git a/public/content/translations/es/contributing/design/index.md b/public/content/translations/es/contributing/design/index.md index 5154ae3b5a3..844154f2fd0 100644 --- a/public/content/translations/es/contributing/design/index.md +++ b/public/content/translations/es/contributing/design/index.md @@ -12,7 +12,7 @@ Por último, esto es un buen camino para construir un diverso e impresionante po ## ¿Cómo contribuir? -###  Proporciona opiniones en diseños tempranos de prototipos {#design-critique} +###  Proporciona opiniones en diseños tempranos de prototipos {#design-critique} Algunas veces necesitamos ayuda para testear nuestras ideas crudas. Esto es un buen camino para saber cómo contribuir sin algunos conocimientos técnicos. @@ -20,7 +20,7 @@ Algunas veces necesitamos ayuda para testear nuestras ideas crudas. Esto es un b 2. Usted será guiado a través de diseños para proporcionar opiniones por comentarios de función. 3. El resultado será compartido en el asunto GitHub y después será cerrado por el equipo. -###  Participa en las encuentas {#answer-surveys} +###  Participa en las encuentas {#answer-surveys} Proporciona opiniones en nuestra página web por: @@ -28,7 +28,7 @@ Proporciona opiniones en nuestra página web por: 2. Clicleando en la ventana de opiniones en abajo a la derecha en la esquina y respondiedo diseños y preguntas de contenido relacionado. 3. Céntrate en el formato de preguntas libres. -###  Si detecta errores de diseño en la página web, comuníquelos {#report-design-issues} +###  Si detecta errores de diseño en la página web, comuníquelos {#report-design-issues} Ethereum.org es una página de rápido crecimiento con muchas características y contenido. Algunos de la interfaz de usuarios pueden fácilmente convertirse en obsoletos o podrían ser mejorados. Si usted detecta alguno de estos fallos, por favor comuníquelo para que podamos solucionarlo. @@ -36,7 +36,7 @@ Ethereum.org es una página de rápido crecimiento con muchas características y 2. Toma captures y notas si ves algún visual o asuntos UX. 3. Reporte el asunto encontrado usando un [bug report](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Propone cambios de diseño {#propose-design-changes} +###  Propone cambios de diseño {#propose-design-changes} Si usted se siente confortable tomando retos de diseños, puedes visitar nuestros asuntos GitHub abordar y filtrar para[asuntos relacionados de diseños](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Si usted se siente confortable tomando retos de diseños, puedes visitar nuestro 3. Propone la solución en el problema correspondiente en GitHub o [crea uno nuevo.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Espera que el equipo de diseño lo revise. -###  Construyan juntos un Sistemas de Diseño {#Contribute-to-design-system} +###  Construyan juntos un Sistemas de Diseño {#Contribute-to-design-system} Nuestro sistema de diseño convierte el diseñado de ethereum.org fácil y sencillo. Si eres un diseñador experimentado, puedes ayudarnos a preparar muchos componentes para el sitio web. @@ -56,7 +56,7 @@ Nuestro sistema de diseño convierte el diseñado de ethereum.org fácil y senci 5. El equipo de diseño lo revisará. 6. El equipo de Diseño incorporará los cambios en el archivo principal y lo publicará a la comunidad. -###  Escribe contenido relacionado con el diseño en el sitio web {#write-design-articles} +###  Escribe contenido relacionado con el diseño en el sitio web {#write-design-articles} La comunidad para desarrolladores de Ethereum es fuerte, pero la comunidad de diseño se está quedando rezagada. Si eres un diseñador con conocimiento en web3, por favor considera compartir tu conocimiento con la gran comunidad para crecer y mejorar juntos; contamos con [una página sobre el diseño en Ethereum](/developers/docs/design-and-ux/) a la que puedes contribuir. También puedes revisar nuestras [políticas de listado](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ La comunidad para desarrolladores de Ethereum es fuerte, pero la comunidad de di 4. Una vez aprobado, escribe el contenido. 5. Envíalo en el incidente correspondiente en GitHub. -###  Dibuja nuevas ilustraciones {#prepare-illustrations} +###  Dibuja nuevas ilustraciones {#prepare-illustrations} Las visualizaciones son una de las herramientas más poderosas para explicar temas abstractos. Añadir diagramas e infografías supone un enorme potencial. Al fin y al cabo, una imagen vale más que mil palabras. diff --git a/public/content/translations/fr/contributing/design/index.md b/public/content/translations/fr/contributing/design/index.md index 6c43db293f8..222e53fbbf3 100644 --- a/public/content/translations/fr/contributing/design/index.md +++ b/public/content/translations/fr/contributing/design/index.md @@ -12,7 +12,7 @@ Finalement, c'est une excellente façon de construire un portfolio diversifié e ## Comment contribuer ? -###  Fournir des commentaires sur les prototypes de conception {#design-critique} +###  Fournir des commentaires sur les prototypes de conception {#design-critique} Nous avons parfois besoin d'aide pour tester nos nouveautés. C'est une excellente manière de contribuer sans avoir de connaissances techniques. @@ -20,7 +20,7 @@ Nous avons parfois besoin d'aide pour tester nos nouveautés. C'est une excellen 2. Vous serez guidé à travers les conceptions pour fournir des commentaires via la fonction de commentaires. 3. Le résultat sera partagé dans une demande GitHub puis fermé par l'équipe. -###  Participer à des enquêtes de recherche {#answer-surveys} +###  Participer à des enquêtes de recherche {#answer-surveys} Fournir des commentaires sur notre site web en : @@ -28,7 +28,7 @@ Fournir des commentaires sur notre site web en : 2. Cliquant sur le bouton de commentaire dans le coin inférieur droit et en répondant aux questions liées à la conception et au contenu. 3. Se concentrer sur les questions de format libre. -###  Trouver des problèmes liés à la conception du site web et les signaler {#report-design-issues} +###  Trouver des problèmes liés à la conception du site web et les signaler {#report-design-issues} Ethereum.org est un site web en rapide croissance avec de nombreuses fonctionnalités et contenus. Certaines des interfaces utilisateur peuvent facilement devenir obsolètes ou pourraient être améliorées. Si vous rencontrez un tel cas, veuillez le signaler afin que nous y portions notre attention. @@ -36,7 +36,7 @@ Ethereum.org est un site web en rapide croissance avec de nombreuses fonctionnal 2. Prenez des captures d'écran et des notes si vous voyez des problèmes visuels ou d'expérience utilisateur. 3. Signalez les problèmes trouvés en utilisant un [rapport de bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Proposez des modifications de conception {#propose-design-changes} +###  Proposez des modifications de conception {#propose-design-changes} Si vous en avez l'envie, vous pouvez relever des défis de conception. Visitez notre tableau des problèmes sur GitHub et opérez un filtrage pour les [problèmes liés à la conception](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Si vous en avez l'envie, vous pouvez relever des défis de conception. Visitez n 3. Proposez la solution dans le problème correspondant sur GitHub ou [créez-en une nouvelle.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Attendez que l'équipe de conception l'examine. -###  Construisons le système de conception ensemble {#Contribute-to-design-system} +###  Construisons le système de conception ensemble {#Contribute-to-design-system} Notre système de concep rend la conception d'ethereum.org amusante et facile. Si vous êtes un concepteur expérimenté, vous pouvez nous aider à préparer de nombreux composants pour le site web. @@ -56,7 +56,7 @@ Notre système de concep rend la conception d'ethereum.org amusante et facile. S 5. L'équipe de conception examinera votre travail. 6. L'équipe de conception intégrera les modifications dans le fichier principal et publiera le fichier pour la communauté. -###  Rédigez du contenu lié à la conception sur le site web {#write-design-articles} +###  Rédigez du contenu lié à la conception sur le site web {#write-design-articles} La communauté des développeurs Ethereum est solide, mais la communauté des designers est un peu à la traîne. Si vous êtes un concepteur avec des connaissances en web3, envisagez de partager vos découvertes avec toute la communauté afin que nous puissions tous grandir et nous améliorer ensemble ; nous avons [une page sur la conception pour Ethereum](/developers/docs/design-and-ux/) à laquelle vous pouvez contribuer. Vous pouvez également consulter nos [politiques de référencement](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ La communauté des développeurs Ethereum est solide, mais la communauté des de 4. Une fois approuvé, rédigez le contenu. 5. Soumettez-le dans le problème GH correspondant. -###  Dessinez de nouvelles illustrations {#prepare-illustrations} +###  Dessinez de nouvelles illustrations {#prepare-illustrations} Les images sont l'un des outils les plus puissants pour expliquer des sujets abstraits. Il y a un énorme potentiel en ajoutant des diagrammes et des infographies. Après tout, une image vaut mille mots. diff --git a/public/content/translations/it/contributing/design/index.md b/public/content/translations/it/contributing/design/index.md index cbbcd03aa20..0379978bcc1 100644 --- a/public/content/translations/it/contributing/design/index.md +++ b/public/content/translations/it/contributing/design/index.md @@ -12,7 +12,7 @@ Infine, questo è un ottimo modo per creare un portafoglio diversificato e sugge ## Come contribuire? -###  Fornire feedback ai primi prototipi di progettazione {#design-critique} +###  Fornire feedback ai primi prototipi di progettazione {#design-critique} Talvolta, necessitiamo di aiuto nel testare le nostre idee abbozzate. Questo è un ottimo modo per contribuire senza alcuna conoscenza tecnica. @@ -20,7 +20,7 @@ Talvolta, necessitiamo di aiuto nel testare le nostre idee abbozzate. Questo è 2. Sarai guidato attraverso i design per fornire feedback tramite la funzionalità dei commenti. 3. Il risultato sarà condiviso nel ticket di GitHub e quindi sarà chiuso dal team. -###  Partecipare ai sondaggi di ricerca {#answer-surveys} +###  Partecipare ai sondaggi di ricerca {#answer-surveys} Fornisci feedback tramite il nostro sito web: @@ -28,7 +28,7 @@ Fornisci feedback tramite il nostro sito web: 2. Cliccando sul widget del feedback nell'angolo inferiore destro e rispondendo a domande relative a progettazione e contenuti. 3. Concentrati sulle domande in formato libero. -###  Trovare problemi di progettazione sul sito web e segnalarli {#report-design-issues} +###  Trovare problemi di progettazione sul sito web e segnalarli {#report-design-issues} Ethereum.org è un sito web in rapida crescita, con molte funzionalità e contenuti. Parte dell'UI può facilmente divenire obsoleta o migliorabile. Se riscontri un caso simile, ti preghiamo di segnalarlo, così che ottenga la nostra attenzione. @@ -36,7 +36,7 @@ Ethereum.org è un sito web in rapida crescita, con molte funzionalità e conten 2. Scatta degli screenshot e annota se vedi qualsiasi problema visivo o dell'UX. 3. Segnala i problemi trovati utilizzando una [segnalazione di bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Proponi modifiche al design {#propose-design-changes} +###  Proponi modifiche al design {#propose-design-changes} Se ti senti a tuo agio nell'affrontare le sfide del design, puoi visitare la bacheca dei nostri ticket di GitHub e filtrare i [problemi di design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Se ti senti a tuo agio nell'affrontare le sfide del design, puoi visitare la bac 3. Proponi la soluzione nel ticket di GitHub corrispondente o [creane uno nuovo](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request). 4. Attendi la revisione del team di progettazione. -###  Creare insieme il sistema di progettazione {#Contribute-to-design-system} +###  Creare insieme il sistema di progettazione {#Contribute-to-design-system} Il nostro sistema di progettazione rende la progettazione di ethereum.org divertente e facile. Se sei un progettista esperto, puoi aiutarci a preparare molti componenti per il sito web. @@ -56,7 +56,7 @@ Il nostro sistema di progettazione rende la progettazione di ethereum.org divert 5. Il team di progettazione lo revisionerà. 6. Il team di progettazione incorporerà le modifiche nel file principale e pubblicherà il file per la comunità. -###  Scrivere contenuti correlati alla progettazione sul sito web {#write-design-articles} +###  Scrivere contenuti correlati alla progettazione sul sito web {#write-design-articles} La comunità di sviluppatori di Ethereum è forte, mentre quella di progettazione è lievemente in ritardo. Se sei un progettista con conoscenze di Web3, ti preghiamo di condividerle con la comunità, in modo che possiamo tutti crescere e migliorarci insieme; abbiamo [una pagina sulla progettazione su Ethereum](/developers/docs/design-and-ux/) a cui puoi contribuire. Inoltre, puoi consultare le nostre [politiche di elencazione](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ La comunità di sviluppatori di Ethereum è forte, mentre quella di progettazion 4. Una volta approvato, scrivi i contenuti. 5. Inviali nel ticket di GH corrispondente. -###  Disegnare nuove illustrazioni {#prepare-illustrations} +###  Disegnare nuove illustrazioni {#prepare-illustrations} Le visualizzazioni sono tra gli strumenti più potenti per spiegare degli argomenti astratti. L'aggiunta di diagrammi e infografiche ha un enorme potenziale. Dopotutto, un'immagine può dire più di mille parole. diff --git a/public/content/translations/pt-br/contributing/design/index.md b/public/content/translations/pt-br/contributing/design/index.md index 218476c5285..3ba5470fd51 100644 --- a/public/content/translations/pt-br/contributing/design/index.md +++ b/public/content/translations/pt-br/contributing/design/index.md @@ -12,7 +12,7 @@ Por fim, essa é uma ótima maneira de construir um portfólio diversificado e i ## Como contribuir? -###  Forneça feedback sobre os primeiros protótipos de design {#design-critique} +###  Forneça feedback sobre os primeiros protótipos de design {#design-critique} Às vezes, precisamos de ajuda para testar nossas ideias originais. Esta é uma ótima maneira de como contribuir sem nenhum conhecimento técnico. @@ -20,7 +20,7 @@ Por fim, essa é uma ótima maneira de construir um portfólio diversificado e i 2. Você será guiado pelos projetos para fornecer feedback por meio da função de comentários. 3. O resultado será compartilhado em problemas do GitHub e depois fechado pela equipe. -###  Participe da pesquisa de levantamento {#answer-surveys} +###  Participe da pesquisa de levantamento {#answer-surveys} Forneça seus comentários em nosso site: @@ -28,7 +28,7 @@ Forneça seus comentários em nosso site: 2. Clicando no widget de feedback no canto inferior direito e respondendo a perguntas relacionadas ao design e conteúdo. 3. Foque nas perguntas de formato livre. -###  Encontre problemas relacionados ao design no site e reporte-os {#report-design-issues} +###  Encontre problemas relacionados ao design no site e reporte-os {#report-design-issues} O Ethereum.org é um site de rápido crescimento com muitos recursos e conteúdo. Algumas das interfaces de usuário podem facilmente se tornar obsoletas ou poderiam ser aprimoradas. Se você encontrar qualquer caso parecido, por favor reporte ele para que chame a nossa atenção. @@ -36,7 +36,7 @@ O Ethereum.org é um site de rápido crescimento com muitos recursos e conteúdo 2. Faça capturas de tela e anotações se você notar algum problema visual ou de experiência do usuário. 3. Reporte os problemas encontrados usando um [formulário de bug](https://github.com/ethereum/ethereum-org-website/issues/new/choose). -###  Proponha mudanças de design {#propose-design-changes} +###  Proponha mudanças de design {#propose-design-changes} Se você se sente à vontade para enfrentar desafios de design, visite nosso quadro de problemas do GitHub e filtre por [problemas relacionados ao design](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8). @@ -45,7 +45,7 @@ Se você se sente à vontade para enfrentar desafios de design, visite nosso qua 3. Proponha a solução no tíquete do GitHub correspondente ou [abra um novo.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. Aguarde a revisão do time de design. -###  Construir o Sistema de Design juntos {#Contribute-to-design-system} +###  Construir o Sistema de Design juntos {#Contribute-to-design-system} Nosso sistema de design torna o projeto ethereum.org divertido e fácil. Se você é um designer experiente, você pode nos ajudar a preparar muitos componentes para o site. @@ -56,7 +56,7 @@ Nosso sistema de design torna o projeto ethereum.org divertido e fácil. Se voc 5. A equipe de design revisará. 6. A equipe de design vai incorporar as mudanças no arquivo principal e publicará o arquivo para a comunidade. -###  Escreva o conteúdo relacionado ao design no site {#write-design-articles} +###  Escreva o conteúdo relacionado ao design no site {#write-design-articles} A comunidade de desenvolvedores Ethereum é forte, mas a comunidade de design está ficando um pouco para trás. Se você é um designer com conhecimento em web3, por favor, considere compartilhar seus aprendizados com a comunidade maior, para que todos possamos crescer e melhorar juntos; temos [uma página sobre design para Ethereum](/developers/docs/design-and-ux/) para a qual você pode contribuir. Você também pode verificar nossas [políticas de listagem](/contributing/design/adding-design-resources). @@ -66,7 +66,7 @@ A comunidade de desenvolvedores Ethereum é forte, mas a comunidade de design es 4. Uma vez aprovado, escreva o conteúdo. 5. Envie-o no problema GH correspondente. -###  Desenhe novas ilustrações {#prepare-illustrations} +###  Desenhe novas ilustrações {#prepare-illustrations} As visualizações são uma das ferramentas mais poderosas para explicar tópicos abstratos. Há um enorme potencial ao adicionar diagramas e infográficos. Afinal, uma imagem pode dizer mil palavras. diff --git a/public/content/translations/tr/contributing/design/index.md b/public/content/translations/tr/contributing/design/index.md index ce2db6fd779..f1bdc0b6b90 100644 --- a/public/content/translations/tr/contributing/design/index.md +++ b/public/content/translations/tr/contributing/design/index.md @@ -12,7 +12,7 @@ Sonuç olarak bu, tasarım becerilerinizi sergileyeceğiniz çeşit çeşit ve e ## Nasıl katkıda bulunulur? -###  Erken tasarım prototipleri hakkında geribildirim sağlayın {#design-critique} +###  Erken tasarım prototipleri hakkında geribildirim sağlayın {#design-critique} Bazen ham fikirlerimizi test etme konusunda yardıma ihtiyaç duyuyoruz. Bu, herhangi bir teknik bilgi olmadan katkıda bulunmanın harika bir yoludur. @@ -20,7 +20,7 @@ Bazen ham fikirlerimizi test etme konusunda yardıma ihtiyaç duyuyoruz. Bu, her 2. Tasarımların üzerinden yorumlar seçeneğiyle geribildirim vermeye yönlendirileceksiniz. 3. Sonuç, Github konusunda paylaşılacak ve ekip tarafından kapatılacaktır. -###  Anket araştırmasına katılın {#answer-surveys} +###  Anket araştırmasına katılın {#answer-surveys} Web sitemiz hakkında geribildirim sağlayın: @@ -28,7 +28,7 @@ Web sitemiz hakkında geribildirim sağlayın: 2. Sağ alt köşede bulunan geribildirim aracına tıklayıp tasarım ve içerik ile ilgili soruları cevaplayın. 3. Serbest biçimdeki sorulara odaklanın. -###  Web sitesindeki tasarımla ilgili sorunları bulun ve bildirin {#report-design-issues} +###  Web sitesindeki tasarımla ilgili sorunları bulun ve bildirin {#report-design-issues} Ethereum.org, birçok içeriğe ve özelliğe sahip, hızla büyüyen bir web sitesidir. Bazı kullanıcı arayüzleri, kolayca güncelliğini yitirebilir ya da geliştirilebilir. Böyle bir durumla karşılaşırsanız, dikkate almamız için lütfen bize bildirin. @@ -36,7 +36,7 @@ Ethereum.org, birçok içeriğe ve özelliğe sahip, hızla büyüyen bir web si 2. Herhangi bir görsel sorun ya da kullanıcı deneyimi sorunu görürseniz, ekran görüntüsü ve notlar alın. 3. Bulduğunuz sorunları [hata raporu](https://github.com/ethereum/ethereum-org-website/issues/new/choose) ile bildirin. -###  Tasarım değişiklikleri önerin {#propose-design-changes} +###  Tasarım değişiklikleri önerin {#propose-design-changes} Tasarım zorluklarının üstesinden gelme konusunda kendinizi rahat hissediyorsanız, GitHub konu panomuzu ziyaret edip [tasarımla ilgili sorunları](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) filtreleyin. @@ -45,7 +45,7 @@ Tasarım zorluklarının üstesinden gelme konusunda kendinizi rahat hissediyors 3. İlgili GitHub konusunda çözümü önerin ya da [yeni bir tane oluşturun.](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) 4. İncelemesi için tasarım ekibini bekleyin. -###  Tasarım Sistemini birlikte geliştirin {#Contribute-to-design-system} +###  Tasarım Sistemini birlikte geliştirin {#Contribute-to-design-system} Tasarım sistemimiz, ethereum.org'u tasarlamayı eğlenceli ve kolay hale getirir. Deneyimli bir tasarımcıysanız, web sitesi için birçok ana bileşen hazırlamamıza yardımcı olabilirsiniz. @@ -56,7 +56,7 @@ Tasarım sistemimiz, ethereum.org'u tasarlamayı eğlenceli ve kolay hale getiri 5. Tasarım ekibi inceleyecektir. 6. Tasarım ekibi, değişiklikleri ana dosyada toplayacak ve bu dosyayı topluluk ile paylaşacaktır. -###  Web sitesinde tasarımla ilgili içerik yazın {#write-design-articles} +###  Web sitesinde tasarımla ilgili içerik yazın {#write-design-articles} Ethereum geliştirici topluluğu güçlü olsa da, tasarım topluluğu biraz daha geride kalmıştır. Eğer web3'e dair bilgi sahibi bir tasarımcıysanız, lütfen öğrenimlerinizi daha büyük bir toplulukla paylaşmayı düşünün, böylece birlikte büyür ve gelişebiliriz; katkıda bulunmak isterseniz [Ethereum için bir tasarım sayfamız](/developers/docs/design-and-ux/) bulunmaktadır. Ayrıca [listeleme politikalarımızı](/contributing/design/adding-design-resources) kontrol edebilirsiniz. @@ -66,7 +66,7 @@ Ethereum geliştirici topluluğu güçlü olsa da, tasarım topluluğu biraz dah 4. Onaylandıktan sonra içeriği yazın. 5. İlgili GH konusunda sunun. -###  Yeni illüstrasyonlar çizin {#prepare-illustrations} +###  Yeni illüstrasyonlar çizin {#prepare-illustrations} Görselleştirmeler, soyut konuları özetlemenin en güçlü araçlarından biridir. Diyagramlar ve infografikler ekleyerek büyük bir potansiyel elde edilir. Sonuç olarak, bir görsel bin kelime söyleyebilir. From ef4edea99df56ad2224f152b0ad0df0f9872f9da Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 10:05:13 -0800 Subject: [PATCH 316/478] chore: add new menu item string to prepare translations --- src/intl/en/common.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/intl/en/common.json b/src/intl/en/common.json index bf86dbdb8df..84fee71a054 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -193,6 +193,7 @@ "nav-governance-description": "The process involved in upgrading the Ethereum protocol", "nav-governance-label": "Governance", "nav-grants-description": "A curated list by our community on projects that provide grant funding programs", + "nav-guide-overview-description": "List of all guides in one place", "nav-guide-create-account-description": "Anyone can create an Ethereum account at any time, for free with a wallet app", "nav-guide-create-account-label": "How to create an Ethereum account", "nav-guide-revoke-access-description": "Stay safe when interacting with smart contracts and applications in the Ethereum ecosystem", From f967b251ae7fe48d9c19ab441f7347ce3ca460c6 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 15 Feb 2024 11:52:21 -0700 Subject: [PATCH 317/478] remove tornado cash translations --- src/intl/am/page-dapps.json | 2 -- src/intl/ar/page-dapps.json | 2 -- src/intl/az/page-dapps.json | 2 -- src/intl/bg/page-dapps.json | 2 -- src/intl/bn/page-dapps.json | 2 -- src/intl/ca/page-dapps.json | 2 -- src/intl/cs/page-dapps.json | 2 -- src/intl/de/page-dapps.json | 2 -- src/intl/el/page-dapps.json | 2 -- src/intl/en/page-dapps.json | 2 -- src/intl/es/page-dapps.json | 2 -- src/intl/fa/page-dapps.json | 2 -- src/intl/fi/page-dapps.json | 2 -- src/intl/fil/page-dapps.json | 2 -- src/intl/fr/page-dapps.json | 2 -- src/intl/hi/page-dapps.json | 2 -- src/intl/hr/page-dapps.json | 2 -- src/intl/hu/page-dapps.json | 2 -- src/intl/hy-am/page-dapps.json | 2 -- src/intl/id/page-dapps.json | 2 -- src/intl/ig/page-dapps.json | 2 -- src/intl/it/page-dapps.json | 2 -- src/intl/ja/page-dapps.json | 2 -- src/intl/km/page-dapps.json | 2 -- src/intl/kn/page-dapps.json | 2 -- src/intl/ko/page-dapps.json | 2 -- src/intl/ml/page-dapps.json | 2 -- src/intl/mr/page-dapps.json | 2 -- src/intl/ms/page-dapps.json | 2 -- src/intl/nl/page-dapps.json | 2 -- src/intl/pcm/page-dapps.json | 2 -- src/intl/pl/page-dapps.json | 2 -- src/intl/pt-br/page-dapps.json | 2 -- src/intl/pt/page-dapps.json | 2 -- src/intl/ro/page-dapps.json | 2 -- src/intl/ru/page-dapps.json | 2 -- src/intl/se/page-dapps.json | 2 -- src/intl/sl/page-dapps.json | 2 -- src/intl/sr/page-dapps.json | 2 -- src/intl/sw/page-dapps.json | 2 -- src/intl/tr/page-dapps.json | 2 -- src/intl/uk/page-dapps.json | 2 -- src/intl/vi/page-dapps.json | 2 -- src/intl/zh-tw/page-dapps.json | 2 -- src/intl/zh/page-dapps.json | 2 -- 45 files changed, 90 deletions(-) diff --git a/src/intl/am/page-dapps.json b/src/intl/am/page-dapps.json index 48189195d88..cf14ba8e6ba 100644 --- a/src/intl/am/page-dapps.json +++ b/src/intl/am/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "ገንዘብን በቅጽበት ያሰራጩ።", "page-dapps-dapp-description-superrare": "የዲጂታል የጥበብ ስራዎችን በቀጥታ ከአርቲስቶች ወይም ከሁለተኛ ገበያዎች ይግዙ።", "page-dapps-dapp-description-token-sets": "ራሳቸውን የሚያመጣጥኑ የክሪፕቶ ኢንቨስትመንት ስልቶች።", - "page-dapps-dapp-description-tornado-cash": "በኢተርየም ላይ ማንነትዎን ሳይገልጽ ግብይቶችን ይላኩ።", "page-dapps-dapp-description-uniswap": "ቶከኖችን በቀላሉ ይቀይሩ ወይም የ% ድርሻ ያለው ሽልማቶችን ለማግኘት ቶከኖችን ያቅርቡ።", "page-dapps-dapp-description-dexguru": "ለDeFi ነጋዴዎች ጥበቃ የሌለው የንግድ ተርሚናል", "page-dapps-dapp-description-synthetix": "Synthetix ሰው ሰራሽ ንብረቶችን ለማውጣት እና ለመገበያየት ፕሮቶኮል ነው።", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "እነዚህ የገንቢ መሣሪያዎችን ያልተማከለ ማድረግ፣ ክሪፕቶኢኮኖሚያዊ ሥርዓቶችን አሁን ባለው ቴክኖሎጂ ውስጥ በማካተት እና ለክፍት ምንጭ ልማት ሥራ የገበያ ቦታዎችን በመፍጠር ላይ ያተኮሩ መተግበሪያዎች ናቸው።", "page-dapps-technology-title": "ያልተማከለ ቴክኖሎጂ", "page-dapps-token-sets-logo-alt": "የToken Sets አርማ", - "page-dapps-tornado-cash-logo-alt": "የTornado cash አርማ", "page-dapps-uniswap-logo-alt": "የUniswap አርማ", "page-dapps-wallet-callout-button": "ቦርሳ ያግኙ", "page-dapps-wallet-callout-description": "ቦርሳዎችም ራሳቸው dappዎች ናቸው። እርስዎን በሚያስማማዎ ባህሪያት ላይ በመመስረት አንዱን ይፈልጉ።", diff --git a/src/intl/ar/page-dapps.json b/src/intl/ar/page-dapps.json index f20a88c38ca..fbc6324c35b 100644 --- a/src/intl/ar/page-dapps.json +++ b/src/intl/ar/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "تدفق الأموال في الوقت الحقيقي.", "page-dapps-dapp-description-superrare": "شراء الأعمال الفنية الرقمية مباشرة من الفنانين أو في الأسواق الثانوية.", "page-dapps-dapp-description-token-sets": "استراتيجيات استثمار العملات المشفرة التي تعيد التوازن تلقائيًا.", - "page-dapps-dapp-description-tornado-cash": "إرسال معاملات مجهولة على إثيريوم.", "page-dapps-dapp-description-uniswap": "مبادلة الرموز ببساطة أو توفير الرموز المميزة لمكافآت بنسبة مئوية.", "page-dapps-dapp-description-dexguru": "بوابة تداول غير مقيدة للحرية لمتداولي دي فاي", "page-dapps-dapp-description-synthetix": "Synthetix هو بروتوكول لإصدار الأصول الاصطناعية وتداولها", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "هذه هي التطبيقات التي تركز على لامركزية أدوات المطور، ودمج أنظمة الاقتصاد المشفر في التكنولوجيا الحالية، وإنشاء أسواق لأعمال التطوير مفتوحة المصدر.", "page-dapps-technology-title": "التكنولوجيا اللامركزية", "page-dapps-token-sets-logo-alt": "شعار مجموعات الرموز", - "page-dapps-tornado-cash-logo-alt": "شعار Tornado cash", "page-dapps-uniswap-logo-alt": "شعار Uniswap", "page-dapps-wallet-callout-button": "العثور على محفظة", "page-dapps-wallet-callout-description": "المحفظة هي تطبيقات أيضًا. ابحث عن واحدة على أساس الميزات التي تناسبك.", diff --git a/src/intl/az/page-dapps.json b/src/intl/az/page-dapps.json index 8cd4e3ee16b..65d8f99eb9a 100644 --- a/src/intl/az/page-dapps.json +++ b/src/intl/az/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "Rəqəmsal sənət əsərlərini birbaşa rəssamlardan və ya ikincil bazarlardan alın.", "page-dapps-dapp-description-synthetix": "Synthetix sintetik aktivlərin buraxılış və ticarəti üçün bir protokoldur", "page-dapps-dapp-description-token-sets": "Avtomatik olaraq yenidən tarazlaşan kriptovalyuta investisiya strategiyaları.", - "page-dapps-dapp-description-tornado-cash": "Ethereum-da anonim əməliyyatlar göndərin.", "page-dapps-dapp-description-uniswap": "Tokenləri sadəcə dəyişdirin və ya % mükafat üçün tokenlər təmin edin.", "page-dapps-dapp-description-xmtp": "DM-lər, xəbərdarlıqlar, elanlar və s. daxil olmaqla blockchain hesabları arasında mesajlar göndərin.", "page-dapps-dapp-description-yearn": "Yearn Finance gəlir toplayıcısıdır. Fiziki şəxslərə, DAO-lara və digər protokollara rəqəmsal aktivləri yerləşdirmək və gəlir əldə etmək üçün bir imkan yaradır.", @@ -258,7 +257,6 @@ "page-dapps-technology-description": "Bunlar tərtibatçı alətlərinin mərkəzsizləşdirilməsinə, kripto-iqtisadi sistemlərin mövcud texnologiyaya daxil edilməsinə və açıq mənbəli inkişaf işləri üçün bazarların yaradılmasına yönəlmiş tətbiqlərdir.", "page-dapps-technology-title": "Mərkəzləşdirilməmiş texnologiya", "page-dapps-token-sets-logo-alt": "Token Sets loqosu", - "page-dapps-tornado-cash-logo-alt": "Tornado cash loqosu", "page-dapps-uniswap-logo-alt": "Uniswap loqosu", "page-dapps-wallet-callout-button": "Pulqabı tap", "page-dapps-wallet-callout-description": "Pulqabılar da mərkəzləşdirilməmiş tətbiqlərdir. Sizə uyğun olan xüsusiyyətlərə əsasən birini tapın.", diff --git a/src/intl/bg/page-dapps.json b/src/intl/bg/page-dapps.json index f4d06aa58b2..8707d821252 100644 --- a/src/intl/bg/page-dapps.json +++ b/src/intl/bg/page-dapps.json @@ -81,7 +81,6 @@ "page-dapps-dapp-description-sablier": "Паричен поток в реално време.", "page-dapps-dapp-description-superrare": "Купувайте дигитални произведения на изкуството от творци или от вторични пазари.", "page-dapps-dapp-description-token-sets": "Крипто инвестиционни стратегии, които автоматично отново се балансират.", - "page-dapps-dapp-description-tornado-cash": "Изпращайте анонимни трансакции в Етереум.", "page-dapps-dapp-description-uniswap": "Просто разменяйте токени или предлагайте токени за % от наградите.", "page-dapps-dark-forest-logo-alt": "Лого на Dark Forest", "page-dapps-decentraland-logo-alt": "Лого на Decentraland", @@ -189,7 +188,6 @@ "page-dapps-technology-description": "Това са приложения, фокусирани върху децентрализирани пособия на разработчиците, които включват криптоикономически системи в съществуващата технология и създават пазари за разработки с отворен код.", "page-dapps-technology-title": "Децентрализирана технология", "page-dapps-token-sets-logo-alt": "Лого на Token Sets", - "page-dapps-tornado-cash-logo-alt": "Лого на Tornado cash", "page-dapps-uniswap-logo-alt": "Лого на Uniswap", "page-dapps-wallet-callout-button": "Намерете портфейл", "page-dapps-wallet-callout-description": "Портфейлите също са dapps. Намерете такъв, който е на основата на характеристики по ваш избор.", diff --git a/src/intl/bn/page-dapps.json b/src/intl/bn/page-dapps.json index 076a51e8f61..4dd95bed58e 100644 --- a/src/intl/bn/page-dapps.json +++ b/src/intl/bn/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "রিয়েল-টাইমে অর্থ স্ট্রিম করুন।", "page-dapps-dapp-description-superrare": "শিল্পীদের কাছ থেকে বা সেকেন্ডারি মার্কেটে সরাসরি ডিজিটাল আর্টওয়ার্ক কিনুন।", "page-dapps-dapp-description-token-sets": "ক্রিপ্টো বিনিয়োগ কৌশল যা স্বয়ংক্রিয়ভাবে ভারসাম্য বজায় রাখে।", - "page-dapps-dapp-description-tornado-cash": "ইথেরিয়াম এ বেনামী লেনদেন পাঠান।", "page-dapps-dapp-description-uniswap": "সহজভাবে টোকেন অদলবদল করুন বা % পুরস্কারের জন্য টোকেন দেন।", "page-dapps-dapp-description-dexguru": "DeFi ব্যবসায়ীদের জন্য নন-কাস্টোডিয়াল ট্রেডিং টার্মিনাল", "page-dapps-dapp-description-synthetix": "Synthetix হলো সিন্থেটিক সম্পদ ইস্যু এবং ট্রেড করার জন্য একটি প্রোটোকল", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "এগুলি এমন অ্যাপ্লিকেশন যা ডেভেলপার টুলস-এর বিকেন্দ্রীকরণ, বিদ্যমান প্রযুক্তিতে ক্রিপ্টোইকোনমিক সিস্টেমগুলিকে অন্তর্ভুক্ত করার এবং ওপেন সোর্স ডেভেলপমেন্ট কাজের জন্য মার্কেটপ্লেস তৈরি করার উপর ফোকাস করে।", "page-dapps-technology-title": "বিকেন্দ্রীভূত প্রযুক্তি", "page-dapps-token-sets-logo-alt": "Token Sets লোগো", - "page-dapps-tornado-cash-logo-alt": "Tornado cash লোগো", "page-dapps-uniswap-logo-alt": "Uniswap লোগো", "page-dapps-wallet-callout-button": "ওয়ালেট খুঁজে নিন", "page-dapps-wallet-callout-description": "ওয়ালেটগুলিও dapps। আপনার উপযুক্ত বৈশিষ্ট্যগুলির উপর ভিত্তি করে একটি খুঁজুন।", diff --git a/src/intl/ca/page-dapps.json b/src/intl/ca/page-dapps.json index d8774453ef6..1582b439de1 100644 --- a/src/intl/ca/page-dapps.json +++ b/src/intl/ca/page-dapps.json @@ -81,7 +81,6 @@ "page-dapps-dapp-description-sablier": "Envieu diners en temps real.", "page-dapps-dapp-description-superrare": "Compreu obres d'art digitals directament dels artistes o en mercats secundaris.", "page-dapps-dapp-description-token-sets": "Estratègies d'inversió criptogràfiques que es reequilibren automàticament.", - "page-dapps-dapp-description-tornado-cash": "Envieu transaccions anònimes dins d'Ethereum.", "page-dapps-dapp-description-uniswap": "Intercanvieu tokens simplement o proporcioneu tokens per un percentatge de recompenses.", "page-dapps-docklink-dapps": "Introducció a les dapps", "page-dapps-docklink-smart-contracts": "Contractes intel·ligents", @@ -191,7 +190,6 @@ "page-dapps-technology-description": "Aquestes són aplicacions centrades en eines de desenvolupament descentralitzat, la incorporació de sistemes criptoeconòmics a la tecnologia existent i la creació de mercats per al treball de desenvolupament de codi obert.", "page-dapps-technology-title": "Tecnologia descentralitzada", "page-dapps-token-sets-logo-alt": "Logotip de Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logotip de Tornado cash", "page-dapps-uniswap-logo-alt": "Logotip d'Uniswapd", "page-dapps-wallet-callout-button": "Trobeu una cartera", "page-dapps-wallet-callout-description": "Les carteres també són dapps. Trobeu-ne una basada en les característiques que us convinguin.", diff --git a/src/intl/cs/page-dapps.json b/src/intl/cs/page-dapps.json index 64e09d85478..d11664a5478 100644 --- a/src/intl/cs/page-dapps.json +++ b/src/intl/cs/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Přenos peněz v reálném čase.", "page-dapps-dapp-description-superrare": "Kupujte digitální umělecká díla přímo od umělců nebo na sekundárních trzích.", "page-dapps-dapp-description-token-sets": "Investiční strategie do kryptoměn, které se automaticky vyvažují.", - "page-dapps-dapp-description-tornado-cash": "Posílejte anonymní transakce na Ethereu.", "page-dapps-dapp-description-uniswap": "Tokeny můžete jednoduše vyměnit, nebo je poskytnout jako odměnu v %.", "page-dapps-dapp-description-dexguru": "Tradingový terminál DeFi bez supervize třetí strany", "page-dapps-dapp-description-synthetix": "Synthetix je protokol pro vydávání syntetických aktiv a obchodování s nimi", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Jedná se o aplikace, které se zaměřují na decentralizaci vývojářských nástrojů, začlenění kryptoměnových systémů do existující technologie a vytváření tržišť pro vývoj open-source aplikace.", "page-dapps-technology-title": "Decentralizovaná technologie", "page-dapps-token-sets-logo-alt": "Logo Token sets", - "page-dapps-tornado-cash-logo-alt": "Logo Tornado cash", "page-dapps-uniswap-logo-alt": "Logo Uniswap", "page-dapps-wallet-callout-button": "Najít peněženku", "page-dapps-wallet-callout-description": "Peněženky jsou vlastně decentralizované aplikace. Podle funkcí si vyberte tu, která vám bude nejvíce vyhovovat.", diff --git a/src/intl/de/page-dapps.json b/src/intl/de/page-dapps.json index f1bf1239cbd..67fc4e50aaa 100644 --- a/src/intl/de/page-dapps.json +++ b/src/intl/de/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Übertragen Sie Geld in Echtzeit.", "page-dapps-dapp-description-superrare": "Kaufen Sie digitale Kunst direkt vom Künstler oder auf dem Zweitmarkt.", "page-dapps-dapp-description-token-sets": "Strategien für Krypto-Investitionen, die sich automatisch ausgleichen.", - "page-dapps-dapp-description-tornado-cash": "Versenden Sie anonyme Transaktionen auf Ethereum.", "page-dapps-dapp-description-uniswap": "Tauschen Sie Token einfach oder stellen Sie Token für prozentuale Vergütung zur Verfügung.", "page-dapps-dapp-description-dexguru": "Nicht-verwahrendes Handelsterminal für DeFi-Trader", "page-dapps-dapp-description-synthetix": "Synthetix ist ein Protokoll für die Emission und den Handel mit synthetischen Vermögenswerten", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Diese Anwendungen konzentrieren sich auf die Dezentralisierung von Entwicklerwerkzeugen, die Einbindung kryptoökonomischer Systeme in bestehende Technologien und die Schaffung von Marktplätzen für Open-Source-Entwicklungsarbeit.", "page-dapps-technology-title": "Dezentralisierte Technologie", "page-dapps-token-sets-logo-alt": "Token-Sets-Logo", - "page-dapps-tornado-cash-logo-alt": "Tornado-Cash-Logo", "page-dapps-uniswap-logo-alt": "Uniswap-Logo", "page-dapps-wallet-callout-button": "Finde eine Wallet", "page-dapps-wallet-callout-description": "Wallets sind auch dapps. Finde eine basierend auf den Merkmalen, die Ihnen passen.", diff --git a/src/intl/el/page-dapps.json b/src/intl/el/page-dapps.json index 3bc86fdd08e..8f94898fc40 100644 --- a/src/intl/el/page-dapps.json +++ b/src/intl/el/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Μεταδώστε χρήματα σε πραγματικό χρόνο.", "page-dapps-dapp-description-superrare": "Αγοράστε ψηφιακά έργα τέχνης απευθείας από τους καλλιτέχνες ή από δευτερογενείς αγορές.", "page-dapps-dapp-description-token-sets": "Επενδυτικές στρατηγικές κρυπτογράφησης που επανισορροπούν αυτόματα.", - "page-dapps-dapp-description-tornado-cash": "Αποστολή ανώνυμων συναλλαγών στο Ethereum.", "page-dapps-dapp-description-uniswap": "Μετατρέψτε εύκολα τα κρυπτονομίσματα ή παρέχετε μερικά για % ανταμοιβές.", "page-dapps-dapp-description-dexguru": "Τερματικό ελεύθερων συναλλαγών για εμπόρους DeFi", "page-dapps-dapp-description-synthetix": "Το Synthetix είναι ένα πρωτόκολλο για την έκδοση και εμπορία συνθετικών περιουσιακών στοιχείων", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Πρόκειται για εφαρμογές που επικεντρώνονται στην αποκέντρωση των εργαλείων ανάπτυξης, ενσωματώνοντας κρυπτοοικονομικά συστήματα στην υπάρχουσα τεχνολογία και δημιουργώντας αγορές για εργασίες ανάπτυξης ανοιχτού κώδικα.", "page-dapps-technology-title": "Αποκεντρωμένη τεχνολογία", "page-dapps-token-sets-logo-alt": "Λογότυπο Token Sets", - "page-dapps-tornado-cash-logo-alt": "Λογότυπο Tornado cash", "page-dapps-uniswap-logo-alt": "Λογότυπο Uniswap", "page-dapps-wallet-callout-button": "Επιλογή πορτοφολιού", "page-dapps-wallet-callout-description": "Τα πορτοφόλια είναι και αυτά αποκεντρωμένες εφαρμογές. Βρείτε ένα που να ταιριάζει σε εσάς.", diff --git a/src/intl/en/page-dapps.json b/src/intl/en/page-dapps.json index 9825e7a6553..33124ce32ed 100644 --- a/src/intl/en/page-dapps.json +++ b/src/intl/en/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "Buy digital artworks direct from artists or in secondary markets.", "page-dapps-dapp-description-synthetix": "A new financial primitive enabling the creation of synthetic assets, offering unique derivatives and exposure to real-world assets on the blockchain.", "page-dapps-dapp-description-token-sets": "Crypto investment strategies that automatically rebalance.", - "page-dapps-dapp-description-tornado-cash": "Send anonymous transactions on Ethereum.", "page-dapps-dapp-description-uniswap": "Swap tokens simply or provide tokens for % rewards.", "page-dapps-dapp-description-xmtp": "Send messages between blockchain accounts, including DMs, alerts, announcements, and more.", "page-dapps-dapp-description-yearn": "Decentralized suite of products helping individuals, DAOs, and other protocols earn yield on their digital assets.", @@ -260,7 +259,6 @@ "page-dapps-technology-description": "These are applications that focus on decentralizing developer tools, incorporating cryptoeconomic systems into existing technology, and creating marketplaces for open-source development work.", "page-dapps-technology-title": "Decentralized technology", "page-dapps-token-sets-logo-alt": "Token Sets logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logo", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Find wallet", "page-dapps-wallet-callout-description": "Wallets are dapps too. Find one based on the features that suit you.", diff --git a/src/intl/es/page-dapps.json b/src/intl/es/page-dapps.json index 94453d16ad6..731d920b46f 100644 --- a/src/intl/es/page-dapps.json +++ b/src/intl/es/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "Compre obras de arte digitales directamente de artistas o en mercados secundarios.", "page-dapps-dapp-description-synthetix": "Synthetix es un protocolo para emitir y comercializar activos sintéticos.", "page-dapps-dapp-description-token-sets": "Estrategias de inversión criptográficas que se reequilibran automáticamente.", - "page-dapps-dapp-description-tornado-cash": "Envíe transacciones anónimas en Ethereum.", "page-dapps-dapp-description-uniswap": "Intercambie tókenes simplemente o proporcione tókenes por un porcentaje de recompensas.", "page-dapps-dapp-description-xmtp": "Envíe mensajes entre cuentas de la cadena de bloques, incluyendo mensajes privados, alertas, anuncios y más.", "page-dapps-dapp-description-yearn": "Yearn Finance es un agregador de rendimiento, que otorga a particulares, DAO y otros protocolos una forma de depositar activos financieros y recibir rendimiento.", @@ -258,7 +257,6 @@ "page-dapps-technology-description": "Estas son aplicaciones que se centran en descentralizar las herramientas de los desarrolladores, incorporar sistemas criptoeconómicos a la tecnología existente y crear mercados para el trabajo de desarrollo de código abierto.", "page-dapps-technology-title": "Tecnología descentralizada", "page-dapps-token-sets-logo-alt": "Logo de Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo de Tornado cash", "page-dapps-uniswap-logo-alt": "Logo de Uniswap", "page-dapps-wallet-callout-button": "Encontrar cartera", "page-dapps-wallet-callout-description": "Las carteras también son DApps. Encuentre una basada en las características que le convengan.", diff --git a/src/intl/fa/page-dapps.json b/src/intl/fa/page-dapps.json index a47a98255b2..8e50e7b9ba3 100644 --- a/src/intl/fa/page-dapps.json +++ b/src/intl/fa/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "درآمد تولید محتوای رسانه‌ای در آن واحد.", "page-dapps-dapp-description-superrare": "کارهای هنری دیجیتالی را مستقیماً از هنرمندان یا بازارهای ثانویه خریداری کنید.", "page-dapps-dapp-description-token-sets": "راهبرد‌های سرمایه‌گذاری بر ارز دیجیتال که به‌صورت خودکار تعادل خود را بازیافته است.", - "page-dapps-dapp-description-tornado-cash": "معاملات ناشناس را بر بستر اتریوم انجام دهید.", "page-dapps-dapp-description-uniswap": "توکن‌ها را به‌سادگی تعویض کنید یا با درصدی به‌عنوان پاداش، توکن فراهم کنید.", "page-dapps-dapp-description-dexguru": "ترمینال معاملاتی غیرحضانتی برای تریدرهای دیفای", "page-dapps-dapp-description-synthetix": "سینتتیکس (Synthetix) یک پروتکل برای ضرب و مبادله دارایی های مصنوعی است", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "اینها برنامه‌های کاربردی‌ای هستند که تمرکزشان بر روی غیرمتمرکزسازی ابزار‌های توسعه‌دهنده است و نظام اقتصادی رمزارز را با فناوری موجود تلفیق می‌کنند و بازاری برای کار توسعه با منبع آزاد ایجاد می‌کنند.", "page-dapps-technology-title": "فناوری نامتمرکز", "page-dapps-token-sets-logo-alt": "لوگوی مجموعه‌های توکنی", - "page-dapps-tornado-cash-logo-alt": "لوگوی پول تورنادو", "page-dapps-uniswap-logo-alt": "لوگوی Uniswap", "page-dapps-wallet-callout-button": "یافتن کیف پول", "page-dapps-wallet-callout-description": "کیف پول‌ها هم جزء دپ‌ها هستند. یکی از آنها را که مناسب شما هستند انتخاب کنید.", diff --git a/src/intl/fi/page-dapps.json b/src/intl/fi/page-dapps.json index 294c18b6656..917f1c2c860 100644 --- a/src/intl/fi/page-dapps.json +++ b/src/intl/fi/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Rahan siirtoa reaali-aikaisesti.", "page-dapps-dapp-description-superrare": "Osta digitaalisia taideteoksia suoraan taiteilijoilta tai jälkimarkkinoilta.", "page-dapps-dapp-description-token-sets": "Tasapainotetut kryptojen investointistrategiat käyttöösi.", - "page-dapps-dapp-description-tornado-cash": "Lähetä transaktioita Ethereumiin anonyymisti.", "page-dapps-dapp-description-uniswap": "Vaihda rahakkeita kätevästi tai anna niitä käyttöön prosenttipalkkiolla.", "page-dapps-dapp-description-dexguru": "Käyttäjän hallitsema DeFi-kaupankäyntipääte", "page-dapps-docklink-dapps": "Johdanto dAppeihin", @@ -198,7 +197,6 @@ "page-dapps-technology-description": "Nämä sovellukset keskittyvät kehittäjien työkalujen hajauttamiseen, krypto-talousjärjestelmien integroimiseen olemassa olevaan teknologiaympäristöön ja avaamaan foorumeja avoimen lähdekoodin kehitystyöhön.", "page-dapps-technology-title": "Hajautettu teknologia", "page-dapps-token-sets-logo-alt": "Token Sets -logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash -logo", "page-dapps-uniswap-logo-alt": "Uniswap-logo", "page-dapps-wallet-callout-button": "Valitse lompakko", "page-dapps-wallet-callout-description": "Myös lompakot ovat dAppeja. Valitse lompakko, jonka ominaisuudet sopivat sinulle.", diff --git a/src/intl/fil/page-dapps.json b/src/intl/fil/page-dapps.json index eaed641e328..da307754081 100644 --- a/src/intl/fil/page-dapps.json +++ b/src/intl/fil/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Mag-stream ng pera nang real time.", "page-dapps-dapp-description-superrare": "Bumili ng mga digital artwork nang direkta mula sa mga artist o sa mga secondary market.", "page-dapps-dapp-description-token-sets": "Mga paraan ng pamumuhunan sa crypto na awtomatikong nagre-rebalance.", - "page-dapps-dapp-description-tornado-cash": "Magpadala ng mga anonymous na transaksyon sa Ethereum.", "page-dapps-dapp-description-uniswap": "Mag-swap ng mga token o magbigay ng mga token para sa % rewards.", "page-dapps-dapp-description-dexguru": "Non-custodial trading terminal para sa mga DeFi trader", "page-dapps-dapp-description-synthetix": "Ang Synthetix ay isang protocol para sa paglalabas at pagte-trade ng mga synthetic asset", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Ito ay mga application na nakation sa pag-decentralize ng mga tool ng developer, paglalagay sa kasalukuyang teknolohiya, at paggawa ng mga marketplace para sa open-source development work.", "page-dapps-technology-title": "Decentralized na teknolohiya", "page-dapps-token-sets-logo-alt": "Logo ng Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo ng Tornado Cash", "page-dapps-uniswap-logo-alt": "Logo ng Uniswap", "page-dapps-wallet-callout-button": "Maghanap ng pitaka", "page-dapps-wallet-callout-description": "Decentralized applications (dapps) din ang mga wallet. Maghanap ng wallet batay sa mga feature na akma sa iyo.", diff --git a/src/intl/fr/page-dapps.json b/src/intl/fr/page-dapps.json index 991a07def6e..cb5476f8532 100644 --- a/src/intl/fr/page-dapps.json +++ b/src/intl/fr/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "Achetez des œuvres numériques directement auprès des artistes ou sur les marchés secondaires.", "page-dapps-dapp-description-synthetix": "Synthetix est un protocole pour émettre et échanger des avoirs synthétiques", "page-dapps-dapp-description-token-sets": "Stratégies d'investissement cryptographiques qui se rééquilibrent automatiquement.", - "page-dapps-dapp-description-tornado-cash": "Effectuez des transactions anonymes grâce à Ethereum.", "page-dapps-dapp-description-uniswap": "Échangez facilement des jetons ou envoyez des jetons pour des récompenses en pourcentage.", "page-dapps-dapp-description-xmtp": "Envoyez des messages entre les comptes blockchain, y compris les messages directs, les alertes, les annonces et plus encore.", "page-dapps-dapp-description-yearn": "Yearn Finance est un agrégateur de rendement. Il donne aux individus, aux DAOs et aux autres protocoles un moyen de déposer des avoirs numériques et de recevoir des intérêts.", @@ -258,7 +257,6 @@ "page-dapps-technology-description": "Ce sont des applications qui se concentrent sur la décentralisation des outils de développement, l'intégration de systèmes de chiffrement dans la technologie existante, et la création de marchés pour le développement des logiciels libres.", "page-dapps-technology-title": "Technologie décentralisée", "page-dapps-token-sets-logo-alt": "Logo Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo de Tornado Cash", "page-dapps-uniswap-logo-alt": "Logo Uniswap", "page-dapps-wallet-callout-button": "Trouver un portefeuille", "page-dapps-wallet-callout-description": "Les portefeuilles sont également des DApps. Trouvez-en un basé sur les fonctionnalités qui vous conviennent.", diff --git a/src/intl/hi/page-dapps.json b/src/intl/hi/page-dapps.json index 2983bf1fc94..71c6f6ed806 100644 --- a/src/intl/hi/page-dapps.json +++ b/src/intl/hi/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "वास्तविक समय में धन स्ट्रीम करें।", "page-dapps-dapp-description-superrare": "कलाकारों या द्वितीयक बाजारों से सीधे डिजिटल कलाकृतियां खरीदें।", "page-dapps-dapp-description-token-sets": "क्रिप्टो निवेश रणनीतियां, जो स्वचालित रूप से रीबैलेंस करती हैं।", - "page-dapps-dapp-description-tornado-cash": "इथेरियम पर बेनाम लेनदेन भेजें।", "page-dapps-dapp-description-uniswap": "% पुरस्कारों के लिए टोकन को बस स्वैप करें या टोकन प्रदान करें।", "page-dapps-dapp-description-dexguru": "DeFi व्यापारियों के लिए नॉन-कस्टोडियल ट्रेडिंग टर्मिनल", "page-dapps-dapp-description-synthetix": "Synthetix सिंथेटिक एसेट को जारी करने और व्यापार करने के लिए एक प्रोटोकॉल है", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "ये ऐसे एप्लिकेशन हैं, जो डेवलपर टूल पर विकेंद्रीकरण करते हैं, जो मौजूदा तकनीक में क्रिप्टोकरंसी सिस्टम को शामिल करते हैं, और ओपन-सोर्स डेवलपमेंट वर्क के लिए मार्केटप्लेस बनाते हैं।", "page-dapps-technology-title": "विकेंद्रीकृत तकनीक", "page-dapps-token-sets-logo-alt": "टोकन सेट का लोगो", - "page-dapps-tornado-cash-logo-alt": "टोरनेडो कैश का लोगो", "page-dapps-uniswap-logo-alt": "Uniswap का लोगो", "page-dapps-wallet-callout-button": "वॉलेट खोजें", "page-dapps-wallet-callout-description": "वॉलेट भी डेप्स हैं। उन विशेषताओं के आधार पर खोजें, जो आपके लिए सही हैं।", diff --git a/src/intl/hr/page-dapps.json b/src/intl/hr/page-dapps.json index 7242dad24ef..c5d73bf910b 100644 --- a/src/intl/hr/page-dapps.json +++ b/src/intl/hr/page-dapps.json @@ -70,7 +70,6 @@ "page-dapps-dapp-description-sablier": "Prosljeđujte novac u stvarnom vremenu.", "page-dapps-dapp-description-superrare": "Digitalna umjetnička djela kupujte izravno od umjetnika ili na sekundarnim tržištima.", "page-dapps-dapp-description-token-sets": "Kripto strategije ulaganja koje se automatski uravnotežuju.", - "page-dapps-dapp-description-tornado-cash": "Šaljite anonimne transakcije na Ethereum.", "page-dapps-dapp-description-uniswap": "Zamijenite tokene jednostavno ili osigurajte tokene za % nagrada.", "page-dapps-dark-forest-logo-alt": "Dark Forest logo", "page-dapps-decentraland-logo-alt": "Decentraland logo", @@ -170,7 +169,6 @@ "page-dapps-technology-description": "To su aplikacije koje su usredotočene na decentraliziranje razvojnih alata, uključivanje kriptoekonomskih sustava u postojeću tehnologiju i stvaranje tržišta za razvojni rad s otvorenim kodom.", "page-dapps-technology-title": "Decentralizirana tehnologija", "page-dapps-token-sets-logo-alt": "Token Sets logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logo", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Pronađi novčanik", "page-dapps-wallet-callout-description": "Novčanici su također dapps-i. Pronađite jedan na temelju značajki koje vam odgovaraju.", diff --git a/src/intl/hu/page-dapps.json b/src/intl/hu/page-dapps.json index b67303cbaf4..4badb5cb861 100644 --- a/src/intl/hu/page-dapps.json +++ b/src/intl/hu/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "Vásároljon digitális műtárgyakat közvetlenül a művészektől vagy másodlagos piacokról.", "page-dapps-dapp-description-synthetix": "A Synthetix egy szintetikus eszközöket létrehozó és azokkal kereskedő protokoll", "page-dapps-dapp-description-token-sets": "Kripto befektetési stratégiák, melyek automatikusan kiegyensúlyozódnak.", - "page-dapps-dapp-description-tornado-cash": "Küldjön névtelen tranzakciókat az Ethereumon.", "page-dapps-dapp-description-uniswap": "Cseréljen tokeneket egyszerűen, vagy biztosítson tokeneket egy bizonyos kamatért cserébe.", "page-dapps-dapp-description-xmtp": "Blokkláncszámlák közötti üzenetküldés, amelyben közvetlen üzenetek, figyelmeztetések, bejelentések és más jellegű közlések is lehetségesek.", "page-dapps-dapp-description-yearn": "A Yearn Finance egy hozamokat aggregáló projekt, mely lehetővé teszi, hogy egyének, DAO-k és más protokollok letétbe helyezzék digitális eszközeiket és arra hozamot kapjanak.", @@ -258,7 +257,6 @@ "page-dapps-technology-description": "Ezek olyan alkalmazások, amelyek a fejlesztői eszközök decentralizálására, a kriptogazdasági rendszerek beépítésére a meglévő technológiára és a nyílt forráskódú fejlesztési munkák piactereinek létrehozására összpontosítanak.", "page-dapps-technology-title": "Decentralizált technológia", "page-dapps-token-sets-logo-alt": "Token Sets logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logo", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Tárca keresése", "page-dapps-wallet-callout-description": "A tárcák is dappok. Találjon egyet az Ön számára megfelelő funkciók alapján.", diff --git a/src/intl/hy-am/page-dapps.json b/src/intl/hy-am/page-dapps.json index fdbcd7ef442..1b2b5ba40fd 100644 --- a/src/intl/hy-am/page-dapps.json +++ b/src/intl/hy-am/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Կատարեք գումարի արագ փոխանցում:", "page-dapps-dapp-description-superrare": "Գնեք թվային արվեստի գործեր արտիստներից կամ երկրորդական շուկայից:", "page-dapps-dapp-description-token-sets": "Կրիպտոներդրումների ռազմավարություններ, որոնք ավտոմատ կերպով վերաբալանսավորվում են:", - "page-dapps-dapp-description-tornado-cash": "Կատարեք անանուն փոխանցումներ Էթերիումում:", "page-dapps-dapp-description-uniswap": "Փոխանակեք տոկեններ կամ տրամադրեք Ձեր տոկենները տոկոսային վճարների դիմաց:", "page-dapps-dapp-description-dexguru": "Առանց արտաքին վերահսկման առևտրային տերմինալ ԱպՖի (DeFi) թրեյդերների համար", "page-dapps-dapp-description-synthetix": "<>-ը ածանցյալ ակտիվներ թողարկելու և դրանց առք ու վաճառքը կարգավորող պրոտոկոլ է:", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Սրանք հավելվածներ են, որոնք կենտրոնանում են ծրագրավորման գործիքները ապակենտրոնացնելու վրա, առկա տեխնոլոգիայի մեջ ներդնելով կրիպտոտնտեսական համակարգեր և նոր շուկաներ ստեղծելով բաց հասանելիության ծրագրավորման աշխատանքի համար:", "page-dapps-technology-title": "Ապակենտրոնացված տեխնոլոգիա", "page-dapps-token-sets-logo-alt": "<>-ի պատկերանշանը", - "page-dapps-tornado-cash-logo-alt": "<>-ի պատկերանշանը", "page-dapps-uniswap-logo-alt": "<>-ի պատկերանշանը", "page-dapps-wallet-callout-button": "Գտնել դրամապանակ", "page-dapps-wallet-callout-description": "Դրամապանակները նույնպես ապ-հավելվածներ են: Գտեք Ձեր դրամապանակը ըստ Ձեր նախընտրած հատկությունների:", diff --git a/src/intl/id/page-dapps.json b/src/intl/id/page-dapps.json index f56d60ae6da..fdae9b05cd9 100644 --- a/src/intl/id/page-dapps.json +++ b/src/intl/id/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Alirkan uang secara dalam waktu nyata.", "page-dapps-dapp-description-superrare": "Beli karya seni digital langsung dari artis atau di pasar sekunder.", "page-dapps-dapp-description-token-sets": "Strategi investasi kripto yang menyeimbangkan kembali secara otomatis.", - "page-dapps-dapp-description-tornado-cash": "Kirim transaksi anonim di Ethereum.", "page-dapps-dapp-description-uniswap": "Tukar token secara mudah atau berikan token untuk imbalan %.", "page-dapps-dapp-description-dexguru": "Terminal perdagangan non-kustodian untuk trader DeFi", "page-dapps-dapp-description-synthetix": "Synthetix adalah sebuah protokol untuk menerbitkan dan memperdagangkan aset sintetis", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Inilah aplikasi yang berfokus pada desentralisasi peralatan pengembang, menggabungkan sistem ekonomi kripto ke dalam teknologi yang tersedia, dan menciptakan pasar untuk pekerjaan pengembangan secara sumber terbuka.", "page-dapps-technology-title": "Teknologi yang terdesentralisasi", "page-dapps-token-sets-logo-alt": "Logo Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo Tornado cash", "page-dapps-uniswap-logo-alt": "Logo Uniswap", "page-dapps-wallet-callout-button": "Temukan dompet", "page-dapps-wallet-callout-description": "Dompet juga merupakan dapp. Temukan dapp berdasarkan fitur yang sesuai untuk Anda.", diff --git a/src/intl/ig/page-dapps.json b/src/intl/ig/page-dapps.json index 97c872ecb9d..fc83e41da4a 100644 --- a/src/intl/ig/page-dapps.json +++ b/src/intl/ig/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Kirie ego n'ịntanetị mgbe o kwesiri.", "page-dapps-dapp-description-superrare": "Si n'aka onye ọrụ nka zụta ọrụ nka dijitalụ\n maọbụ n'aha onye ọzọ na-ere ha n'ahịa.", "page-dapps-dapp-description-token-sets": "Atụmatụ itinye ego nke kripto nke na-emezigharị na-akaghị ya aka.", - "page-dapps-dapp-description-tornado-cash": "Zipu azụmahịa na-amaghị aha ya n'Ethereum.", "page-dapps-dapp-description-uniswap": "Gbanwee kokin maọbụ weta tokin maka pasenti nkwụghachi ụgwọ.", "page-dapps-dapp-description-dexguru": "Ngwụcha azumahia na-enweghi onye ndú maka ndị ahia DeFi", "page-dapps-dapp-description-synthetix": "Sintetiks bụ usoro e ji enye ma na-ere ngwaahịa sintetiks", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Ndị a bụ ngwa na-elekwasị anya n'ime ka ngwaọrụ onye mmeputa ghara inwe onye ise nduzi, na-etinye usoro akụ na ụba crypto na teknụzụ dị ugbua, ma na emepụtakwa ebe azụmaahịa maka ọrụ mpepe a ma ebe ha si.", "page-dapps-technology-title": "Teknụzụ na-enweghị onye isi nduzi", "page-dapps-token-sets-logo-alt": "Akara ngosi Tokin Seti", - "page-dapps-tornado-cash-logo-alt": "Akara ngosi kaashị Tornado", "page-dapps-uniswap-logo-alt": "Akara ngosi Uniswap", "page-dapps-wallet-callout-button": "Chọta obere akpa ego", "page-dapps-wallet-callout-description": "Akpa ego ịntanetị bụkwa dapps. Chọta otu dabere na ngwaọrụ masịrị gị.", diff --git a/src/intl/it/page-dapps.json b/src/intl/it/page-dapps.json index 1ea13ab561b..4a7b3dea13e 100644 --- a/src/intl/it/page-dapps.json +++ b/src/intl/it/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Trasmetti denaro in tempo reale.", "page-dapps-dapp-description-superrare": "Acquista opere d'arte digitali direttamente dagli artisti, o nei mercati secondari.", "page-dapps-dapp-description-token-sets": "Strategie di investimento in criptovalute, che si riequilibrano automaticamente.", - "page-dapps-dapp-description-tornado-cash": "Invia transazioni anonime su Ethereum.", "page-dapps-dapp-description-uniswap": "Scambia semplicemente token o fornisci token per ricompense in percentuale.", "page-dapps-dapp-description-dexguru": "Un terminale di trading privo di custodia, per i trader della DeFi", "page-dapps-dapp-description-synthetix": "Synthetix è un protocollo per l'emissione e il trading di risorse sintetiche", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Si tratta di applicazioni incentrate sulla decentralizzazione degli strumenti per sviluppatori, incorporando sistemi criptoeconomici nella tecnologia esistente e creando mercati per il lavoro di sviluppo open source.", "page-dapps-technology-title": "Tecnologia decentralizzata", "page-dapps-token-sets-logo-alt": "Logo di Token Set", - "page-dapps-tornado-cash-logo-alt": "Logo di Tornado Cash", "page-dapps-uniswap-logo-alt": "Logo di Uniswap", "page-dapps-wallet-callout-button": "Trova portafoglio", "page-dapps-wallet-callout-description": "Anche i portafogli sono dapp. Trovane uno a seconda delle funzionalità adatte a te.", diff --git a/src/intl/ja/page-dapps.json b/src/intl/ja/page-dapps.json index 4e215a75af2..1bf4e09eda4 100644 --- a/src/intl/ja/page-dapps.json +++ b/src/intl/ja/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "リアルタイムでお金をストリーミングします。", "page-dapps-dapp-description-superrare": "アーティストまたは二次市場から直接デジタルアート作品を購入。", "page-dapps-dapp-description-token-sets": "自動的にバランスを取る暗号投資戦略。", - "page-dapps-dapp-description-tornado-cash": "イーサリアムで匿名のトランザクションを送信します。", "page-dapps-dapp-description-uniswap": "トークンを交換するか、トークンを%の報酬で提供します。", "page-dapps-dapp-description-dexguru": "DeFiトレーダー向けノンカストディアル取引ターミナル", "page-dapps-dapp-description-synthetix": "Synthetixは、合成資産を発行・取引するためのプロトコル", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "これらのアプリケーションは、デベロッパーツールを分散化させ、暗号資産経済システムを既存の技術に統合し、オープンソース開発作業のための市場を作成します。", "page-dapps-technology-title": "分散型テクノロジー", "page-dapps-token-sets-logo-alt": "Token Setsロゴ", - "page-dapps-tornado-cash-logo-alt": "Tornado cashロゴ", "page-dapps-uniswap-logo-alt": "Uniswapロゴ", "page-dapps-wallet-callout-button": "ウォレットを探す", "page-dapps-wallet-callout-description": "ウォレットもdappsです。 自分に合った特徴に基づいて探してください。", diff --git a/src/intl/km/page-dapps.json b/src/intl/km/page-dapps.json index 246a5e3a2d5..727ce844c38 100644 --- a/src/intl/km/page-dapps.json +++ b/src/intl/km/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "ស្ទ្រីមប្រាក់ក្នុងពេលវេលាជាក់ស្តែង។", "page-dapps-dapp-description-superrare": "ទិញស្នាដៃសិល្បៈឌីជីថលដោយផ្ទាល់ពីសិល្បករ ឬនៅក្នុងទីផ្សារបន្ទាប់បន្សំ។", "page-dapps-dapp-description-token-sets": "យុទ្ធសាស្រ្តវិនិយោគ Crypto ដែលធ្វើឱ្យមានតុល្យភាពឡើងវិញដោយស្វ័យប្រវត្តិ។", - "page-dapps-dapp-description-tornado-cash": "ផ្ញើប្រតិបត្តិការអនាមិកនៅលើ Ethereum ។", "page-dapps-dapp-description-uniswap": "ប្តូរថូខឹនយ៉ាងសាមញ្ញ ឬផ្តល់ថូខឹនសម្រាប់រង្វាន់ %។", "page-dapps-dapp-description-dexguru": "វេទិកាជួញដូរដែលមិនមានការឃុំឃាំងសម្រាប់អ្នកជួញដូរតាមរយៈ DeFi", "page-dapps-dapp-description-synthetix": "Synthetix គឺជាវេទិកាសម្រាប់បញ្ចេញ និងជួញដូរទ្រព្យសម្បត្តិសំយោគ", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "ទាំងនេះគឺជាកម្មវិធីដែលផ្តោតលើការធ្វើវិមជ្ឈការឧបករណ៍អ្នកអភិវឌ្ឍន៍ ការបញ្ចូលប្រព័ន្ធសេដ្ឋកិច្ចគ្រីពតូទៅក្នុងបច្ចេកវិទ្យាដែលមានស្រាប់ និងបង្កើតទីផ្សារសម្រាប់ការងារអភិវឌ្ឍន៍ប្រភពបើកចំហ។", "page-dapps-technology-title": "បច្ចេកវិទ្យាវិមជ្ឈការ", "page-dapps-token-sets-logo-alt": "និមិត្តសញ្ញា Token Sets", - "page-dapps-tornado-cash-logo-alt": "និមិត្តសញ្ញាសាច់ប្រាក់ Tornado", "page-dapps-uniswap-logo-alt": "និមិត្តសញ្ញា Uniswap", "page-dapps-wallet-callout-button": "ស្វែងរកកាបូប", "page-dapps-wallet-callout-description": "កាបូបក៏ជា dapps ផងដែរ។ ស្វែងរកមួយដោយផ្អែកលើលក្ខណៈពិសេសដែលសាកសមនឹងអ្នក។", diff --git a/src/intl/kn/page-dapps.json b/src/intl/kn/page-dapps.json index 5b1892ac0b2..726bbc54441 100644 --- a/src/intl/kn/page-dapps.json +++ b/src/intl/kn/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "ನೈಜ ಸಮಯದಲ್ಲಿ ಹಣವನ್ನು ಸ್ಟ್ರೀಮ್ ಮಾಡಿ.", "page-dapps-dapp-description-superrare": "ಕಲಾವಿದರಿಂದ ನೇರವಾಗಿ ಅಥವಾ ದ್ವಿತೀಯ ಮಾರುಕಟ್ಟೆಗಳಲ್ಲಿ ಡಿಜಿಟಲ್ ಕಲಾಕೃತಿಗಳನ್ನು ಖರೀದಿಸಿ.", "page-dapps-dapp-description-token-sets": "ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಸಮತೋಲನಗೊಳಿಸುವ ಕ್ರಿಪ್ಟೋ ಹೂಡಿಕೆ ತಂತ್ರಗಳು.", - "page-dapps-dapp-description-tornado-cash": "ಇಥಿರಿಯಮ್ ನಲ್ಲಿ ಅನಾಮಧೇಯ ವಹಿವಾಟುಗಳನ್ನು ಕಳುಹಿಸಿ.", "page-dapps-dapp-description-uniswap": "ಟೋಕನ್ ಗಳನ್ನು ಸರಳವಾಗಿ ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳಿ ಅಥವಾ % ಪ್ರತಿಫಲಗಳಿಗೆ ಟೋಕನ್ ಗಳನ್ನು ಒದಗಿಸಿ.", "page-dapps-dapp-description-dexguru": "ಡಿಫೈ ವ್ಯಾಪಾರಿಗಳಿಗೆ ಕಸ್ಟಡಿಯಲ್ಲದ ವ್ಯಾಪಾರ ಟರ್ಮಿನಲ್", "page-dapps-dapp-description-synthetix": "ಸಿಂಥೆಟಿಕ್ಸ್ ಎಂಬುದು ಸಂಶ್ಲೇಷಿತ ಸ್ವತ್ತುಗಳನ್ನು ವಿತರಿಸುವ ಮತ್ತು ವ್ಯಾಪಾರ ಮಾಡುವ ಪ್ರೋಟೋಕಾಲ್ ಆಗಿದೆ", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "ಇವು ಡೆವಲಪರ್ ಸಾಧನಗಳನ್ನು ವಿಕೇಂದ್ರೀಕರಿಸುವುದು, ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ತಂತ್ರಜ್ಞಾನದಲ್ಲಿ ಕ್ರಿಪ್ಟೋಎಕನಾಮಿಕ್ ವ್ಯವಸ್ಥೆಗಳನ್ನು ಸಂಯೋಜಿಸುವುದು ಮತ್ತು ಮುಕ್ತ-ಮೂಲ ಅಭಿವೃದ್ಧಿ ಕಾರ್ಯಗಳಿಗೆ ಮಾರುಕಟ್ಟೆಗಳನ್ನು ರಚಿಸುವತ್ತ ಗಮನ ಹರಿಸುವ ಅಪ್ಲಿಕೇಶನ್ಗಳಾಗಿವೆ.", "page-dapps-technology-title": "ವಿಕೇಂದ್ರೀಕೃತ ತಂತ್ರಜ್ಞಾನ", "page-dapps-token-sets-logo-alt": "Token Sets ಲೋಗೋ", - "page-dapps-tornado-cash-logo-alt": "Tornado cash ಲೋಗೋ", "page-dapps-uniswap-logo-alt": "Uniswap ಲೋಗೋ", "page-dapps-wallet-callout-button": "ವ್ಯಾಲೆಟ್ ಹುಡುಕಿ", "page-dapps-wallet-callout-description": "ವ್ಯಾಲೆಟ್ ಗಳು ಸಹ Dapps ಗಳಾಗಿವೆ. ನಿಮಗೆ ಸರಿಹೊಂದುವ ವೈಶಿಷ್ಟ್ಯಗಳ ಆಧಾರದ ಮೇಲೆ ಒಂದನ್ನು ಹುಡುಕಿ.", diff --git a/src/intl/ko/page-dapps.json b/src/intl/ko/page-dapps.json index d6633a2650c..615e5f1f080 100644 --- a/src/intl/ko/page-dapps.json +++ b/src/intl/ko/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "실시간으로 돈을 스트리밍합니다.", "page-dapps-dapp-description-superrare": "직접 아티스트로부터 디지털 미술품을 구매하거나 중고 시장에서 구매합니다.", "page-dapps-dapp-description-token-sets": "자동으로 재조정하는 암호화폐 투자 전략입니다.", - "page-dapps-dapp-description-tornado-cash": "이더리움에서 익명의 거래를 보냅니다.", "page-dapps-dapp-description-uniswap": "토큰을 간단하게 교환하거나 %의 보상을 위해 토큰을 제공합니다.", "page-dapps-dapp-description-dexguru": "디파이 트레이더를 위한 비수탁형 트레이딩 터미널", "page-dapps-dapp-description-synthetix": "Synthetix는 합성 자산 발행 및 거래를 위한 프로토콜입니다.", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "다음은 개발자 도구의 탈중앙화, 암호경제 시스템을 기존의 기술에 통합, 오픈소스 개발 작업을 위한 시장의 창출에 집중하는 애플리케이션입니다.", "page-dapps-technology-title": "탈중앙화 기술", "page-dapps-token-sets-logo-alt": "Token Sets 로고", - "page-dapps-tornado-cash-logo-alt": "Tornado cash 로고", "page-dapps-uniswap-logo-alt": "Uniswap 로고", "page-dapps-wallet-callout-button": "지갑 찾기", "page-dapps-wallet-callout-description": "지갑도 디앱입니다. 적합한 기능에 따라 골라보세요.", diff --git a/src/intl/ml/page-dapps.json b/src/intl/ml/page-dapps.json index e27711f912b..606dfaff235 100644 --- a/src/intl/ml/page-dapps.json +++ b/src/intl/ml/page-dapps.json @@ -70,7 +70,6 @@ "page-dapps-dapp-description-sablier": "തത്സമയം പണം സ്ട്രീം ചെയ്യുക.", "page-dapps-dapp-description-superrare": "ആർട്ടിസ്റ്റുകളിൽ നിന്നോ സെക്കൻഡറി മാർക്കറ്റുകളിൽ നിന്നോ നേരിട്ട് ഡിജിറ്റൽ കലാസൃഷ്ടികൾ വാങ്ങുക.", "page-dapps-dapp-description-token-sets": "സ്വപ്രേരിതമായി വീണ്ടും സമതുലിതമാക്കുന്ന ക്രിപ്‌റ്റോ നിക്ഷേപ തന്ത്രങ്ങൾ.", - "page-dapps-dapp-description-tornado-cash": "Ethereumൽ അജ്ഞാത ഇടപാടുകൾ അയയ്‌ക്കുക.", "page-dapps-dapp-description-uniswap": "ടോക്കണുകൾ ലളിതമായി സ്വാപ്പ് ചെയ്യുക അല്ലെങ്കിൽ % റിവാർഡുകൾക്കായി ടോക്കണുകൾ നൽകുക.", "page-dapps-dark-forest-logo-alt": "ഡാർക്ക് ഫോറസ്റ്റ് ലോഗോ", "page-dapps-decentraland-logo-alt": "ഡിസെൻട്രാലാൻഡ് ലോഗോ", @@ -170,7 +169,6 @@ "page-dapps-technology-description": "ഡവലപ്പർ ഉപകരണങ്ങൾ വികേന്ദ്രീകരിക്കുക, നിലവിലുള്ള സാങ്കേതികവിദ്യയിൽ ക്രിപ്റ്റോ ഇക്കണോമിക് സിസ്റ്റങ്ങൾ സംയോജിപ്പിക്കുക, ഓപ്പൺ സോഴ്‌സ് വികസന പ്രവർത്തനങ്ങൾക്കായി വിപണനസ്ഥലങ്ങൾ സൃഷ്ടിക്കുക എന്നിവയിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കുന്ന ആപ്ലിക്കേഷനുകളാണ് ഇവ.", "page-dapps-technology-title": "വികേന്ദ്രീകൃത സാങ്കേതികവിദ്യ", "page-dapps-token-sets-logo-alt": "ടോക്കൺ സെറ്റ്സ് ലോഗോ", - "page-dapps-tornado-cash-logo-alt": "ടൊര്ണാഡോ ക്യാഷ് ലോഗോ", "page-dapps-uniswap-logo-alt": "യൂണിസ്വാപ്പ് ലോഗോ", "page-dapps-wallet-callout-button": "വാലറ്റ് കണ്ടെത്തുക", "page-dapps-wallet-callout-description": "വാലറ്റുകളും ഡാപ്പുകളാണ്. നിങ്ങൾക്ക് അനുയോജ്യമായ സവിശേഷതകളെ അടിസ്ഥാനമാക്കി ഒന്ന് കണ്ടെത്തുക.", diff --git a/src/intl/mr/page-dapps.json b/src/intl/mr/page-dapps.json index c054e711cba..f5b5804af03 100644 --- a/src/intl/mr/page-dapps.json +++ b/src/intl/mr/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "प्रत्यक्ष-वेळी मध्ये पैसे प्रवाहित करा.", "page-dapps-dapp-description-superrare": "थेट कलाकारांकडून किंवा दुय्यम बाजारपेठेतून डिजिटल कलाकृती खरेदी करा.", "page-dapps-dapp-description-token-sets": "क्रिप्टो गुंतवणूक धोरणे जी आपोआप संतुलित होतात.", - "page-dapps-dapp-description-tornado-cash": "Ethereum वर निनावी व्यवहार पाठवा.", "page-dapps-dapp-description-uniswap": "फक्त टोकन स्वॅप करा किंवा % रिवॉर्डसाठी टोकन प्रदान करा.", "page-dapps-dapp-description-dexguru": "DeFi व्यापार्‍यांसाठी नॉन-कस्टोडियल ट्रेडिंग टर्मिनल", "page-dapps-dapp-description-synthetix": "Synthetix हा सिंथेटिक मालमत्ता जारी करण्यासाठी आणि व्यापार करण्यासाठी एक प्रोटोकॉल आहे", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "हे असे ऍप्लिकेशन आहेत जे विकसक साधनांचे विकेंद्रीकरण करणे, विद्यमान तंत्रज्ञानामध्ये क्रिप्टोइकॉनॉमिक सिस्टम समाविष्ट करणे आणि मुक्त-स्रोत विकास कार्यासाठी बाजारपेठ तयार करणे यावर लक्ष केंद्रित करतात.", "page-dapps-technology-title": "विकेंद्रित तंत्रज्ञान", "page-dapps-token-sets-logo-alt": "Token Sets लोगो", - "page-dapps-tornado-cash-logo-alt": "Tornado cash लोगो", "page-dapps-uniswap-logo-alt": "Uniswap लोगो", "page-dapps-wallet-callout-button": "वॉलेट शोधा", "page-dapps-wallet-callout-description": "वॉलेट देखील dapps आहेत. आपल्यास अनुकूल असलेल्या वैशिष्ट्यांवर आधारित एक शोधा.", diff --git a/src/intl/ms/page-dapps.json b/src/intl/ms/page-dapps.json index 2795fd43a63..ce0b5e4862b 100644 --- a/src/intl/ms/page-dapps.json +++ b/src/intl/ms/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Salurkan wang secara masa nyata.", "page-dapps-dapp-description-superrare": "Beli karya seni digital terus daripada artis atau pasaran sekunder.", "page-dapps-dapp-description-token-sets": "Strategi pelaburan kripto yang mengimbang semula secara automatik.", - "page-dapps-dapp-description-tornado-cash": "Hantarkan transaksi tanpa nama dalam Ethereum.", "page-dapps-dapp-description-uniswap": "Tukarkan token dengan mudah atau bekalkan token untuk ganjaran %.", "page-dapps-dapp-description-dexguru": "Terminal dagangan bukan penjaga untuk pedagang DeFi", "page-dapps-dapp-description-synthetix": "Synthetix ialah protokol untuk mengeluarkan dan mendagangkan aset sintetik", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Ini merupakan aplikasi yang tertumpu pada usaha menyahpusatkan alat pembangun, menggabungkan sistem kriptoekonomi ke dalam teknologi sedia ada, dan mewujudkan pasaran untuk kerja pembangunan sumber terbuka.", "page-dapps-technology-title": "Teknologi Ternyahpusat", "page-dapps-token-sets-logo-alt": "Logo Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo Tornado cash", "page-dapps-uniswap-logo-alt": "Logo Uniswap", "page-dapps-wallet-callout-button": "Cari \"wallet\"\nOr\nCari dompet", "page-dapps-wallet-callout-description": "Dompet juga merupakan dapps. Pilih dapp berdasarkan ciri yang sesuai dengan anda.", diff --git a/src/intl/nl/page-dapps.json b/src/intl/nl/page-dapps.json index 24c4abba04f..7bb7406f755 100644 --- a/src/intl/nl/page-dapps.json +++ b/src/intl/nl/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Stream geld in real-time.", "page-dapps-dapp-description-superrare": "Koop digitale kunstwerken rechtsreeks van kunstenaars of op secundaire markten.", "page-dapps-dapp-description-token-sets": "Crypto-beleggingsstrategieën die automatisch opnieuw in evenwicht worden gebracht.", - "page-dapps-dapp-description-tornado-cash": "Stuur anonieme transacties op Ethereum.", "page-dapps-dapp-description-uniswap": "Wissel simpelweg tokens of leen tokens uit voor % beloningen.", "page-dapps-dapp-description-dexguru": "Niet-custodiale handelsterminal voor DeFi-handelaren", "page-dapps-dapp-description-synthetix": "Synthetix is een protocol voor de uitgifte en verhandeling van synthetische activa", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Dit zijn toepassingen die zich richten op het decentraliseren van ontwikkelaarstools, het integreren van cryptoeconomische systemen in bestaande technologiën en het creëren van marktplaatsen voor opensource ontwikkelingswerk.", "page-dapps-technology-title": "Gedecentraliseerde technologie", "page-dapps-token-sets-logo-alt": "Token Sets logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logo", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Zoek een wallet", "page-dapps-wallet-callout-description": "Wallets zijn ook dapps. Zoek er een op basis van de functies die bij u passen.", diff --git a/src/intl/pcm/page-dapps.json b/src/intl/pcm/page-dapps.json index 3e17e3068db..72f4b393c7d 100644 --- a/src/intl/pcm/page-dapps.json +++ b/src/intl/pcm/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Stream moni for real-taim.", "page-dapps-dapp-description-superrare": "Buy digital artworks diret from artists dem or in sekondri markets.", "page-dapps-dapp-description-token-sets": "Crypto investment strategis wey dey automatically rebalans.", - "page-dapps-dapp-description-tornado-cash": "Send coded transashons ontop Ethereum.", "page-dapps-dapp-description-uniswap": "Yu fit to swap tokens abi make you provide tokens for % benefits.", "page-dapps-dapp-description-dexguru": "Non-kustodial trading terminal dey for DeFi traders", "page-dapps-dapp-description-synthetix": "Synthetix na protokol wey dey for giving and trading assets wey dey synthetik", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Dis na aplikashons wey dey fokus on decentralizin divelopa tools, e dey kombine cryptoekonomik systems into teknologi wey dey exist, and e dey create marketplaces for open source divelopment work.", "page-dapps-technology-title": "Decentralized teknologi", "page-dapps-token-sets-logo-alt": "Token Sets Logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logo", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Find wallet", "page-dapps-wallet-callout-description": "Wallets na dapps too. Find one wey dey based on di features wey yu like.", diff --git a/src/intl/pl/page-dapps.json b/src/intl/pl/page-dapps.json index 4422657ed32..f2ca1805fd7 100644 --- a/src/intl/pl/page-dapps.json +++ b/src/intl/pl/page-dapps.json @@ -122,7 +122,6 @@ "page-dapps-dapp-description-superrare": "Kupuj dzieła cyfrowe bezpośrednio od artystów lub na rynkach wtórnych.", "page-dapps-dapp-description-synthetix": "Synthetix to protokół do emisji i handlu aktywami syntetycznymi", "page-dapps-dapp-description-token-sets": "Strategie kryptowalutowych inwestycji, które automatycznie przywracają równowagę.", - "page-dapps-dapp-description-tornado-cash": "Wysyłaj anonimowe transakcje na Ethereum.", "page-dapps-dapp-description-uniswap": "Wymieniaj tokeny w prosty sposób lub dostarczaj tokeny w zamian za % nagrody.", "page-dapps-dapp-description-xmtp": "Wysyłaj wiadomości między kontami blockchain, w tym wiadomości prywatne, alerty, ogłoszenia i nie tylko.", "page-dapps-dapp-description-yearn": "Yearn Finance to agregator zysków. Daje osobom fizycznym, DAO i innym protokołom sposób na wpłacenie zasobów cyfrowych i otrzymywanie zysków.", @@ -260,7 +259,6 @@ "page-dapps-technology-description": "Są to aplikacje, które koncentrują się na decentralizacji narzędzi deweloperskich, włączaniu systemów kryptoekonomicznych do istniejących technologii oraz tworzeniu rynków dla prac rozwojowych typu open source.", "page-dapps-technology-title": "Technologia zdecentralizowana", "page-dapps-token-sets-logo-alt": "Logo Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo Tornado cash", "page-dapps-uniswap-logo-alt": "Logo Uniswap", "page-dapps-wallet-callout-button": "Znajdź portfel", "page-dapps-wallet-callout-description": "Portfele są również zdecentralizowanymi aplikacjami. Znajdź jeden na podstawie funkcji, które Ci odpowiadają.", diff --git a/src/intl/pt-br/page-dapps.json b/src/intl/pt-br/page-dapps.json index da1b10374d8..b1ae0e23e95 100644 --- a/src/intl/pt-br/page-dapps.json +++ b/src/intl/pt-br/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Transmita dinheiro em tempo real.", "page-dapps-dapp-description-superrare": "Compre obras de arte digitais diretamente dos artistas ou em mercados secundários.", "page-dapps-dapp-description-token-sets": "Estratégias de investimento em criptomoedas que se reequilibram automaticamente.", - "page-dapps-dapp-description-tornado-cash": "Envie transações anônimas na Ethereum.", "page-dapps-dapp-description-uniswap": "Troque tokens de forma simples ou forneça tokens por % de recompensa.", "page-dapps-dapp-description-dexguru": "Terminal de negociação sem custódia para traders DeFi", "page-dapps-dapp-description-synthetix": "Synthetix é um protocolo de emissão e negociação de ativos sintéticos", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Esses são aplicativos que se concentram na descentralização das ferramentas de desenvolvedores, incorporando sistemas cripto-econômicos na tecnologia existente e criando mercados para o trabalho de desenvolvimento de código aberto.", "page-dapps-technology-title": "Tecnologia descentralizada", "page-dapps-token-sets-logo-alt": "Logotipo do Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logotipo do Tornado Cash", "page-dapps-uniswap-logo-alt": "Logotipo Uniswap", "page-dapps-wallet-callout-button": "Encontre uma carteira", "page-dapps-wallet-callout-description": "As carteiras também são dapps. Encontre uma com base nos recursos que são importantes para você.", diff --git a/src/intl/pt/page-dapps.json b/src/intl/pt/page-dapps.json index 8cb404c0b9b..9c489f9d6fb 100644 --- a/src/intl/pt/page-dapps.json +++ b/src/intl/pt/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Transfira dinheiro em tempo real.", "page-dapps-dapp-description-superrare": "Compre obras de arte digitais diretamente de artistas ou em mercados secundários.", "page-dapps-dapp-description-token-sets": "Estratégias de investimento de criptomoedas que reequilibram automaticamente.", - "page-dapps-dapp-description-tornado-cash": "Envie transações anónimas na Ethereum.", "page-dapps-dapp-description-uniswap": "Troque tokens simplesmente ou forneça tokens por % de recompensas.", "page-dapps-dapp-description-dexguru": "Terminal de negociação sem custódia para comerciantes DeFi", "page-dapps-dapp-description-synthetix": "O Synthetix é um protocolo para emitir e negociar bens sintéticos", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Trata-se de aplicações que se centram na descentralização das ferramentas de desenvolvimento, na incorporação de sistemas criptoeconómicos na tecnologia existente e na criação de mercados para o trabalho de desenvolvimento de código aberto.", "page-dapps-technology-title": "Tecnologia descentralizada", "page-dapps-token-sets-logo-alt": "Logotipo Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logotipo Tornado cash", "page-dapps-uniswap-logo-alt": "Logótipo Uniswap", "page-dapps-wallet-callout-button": "Encontrar carteira", "page-dapps-wallet-callout-description": "As carteiras também são dapps. Encontre uma baseada nos recursos que mais lhe convém.", diff --git a/src/intl/ro/page-dapps.json b/src/intl/ro/page-dapps.json index e56487ef89d..72cd75d2ffc 100644 --- a/src/intl/ro/page-dapps.json +++ b/src/intl/ro/page-dapps.json @@ -81,7 +81,6 @@ "page-dapps-dapp-description-sablier": "Transmiteți bani în timp real.", "page-dapps-dapp-description-superrare": "Cumpărați opere de artă digitală direct de la artiști sau de pe piețele secundare.", "page-dapps-dapp-description-token-sets": "Strategii de investiții pentru cripto care îl reechilibrează automat.", - "page-dapps-dapp-description-tornado-cash": "Trimiteți tranzacții anonime pe Ethereum.", "page-dapps-dapp-description-uniswap": "Schimbați simplu jetoane sau oferiți jetoane pentru recompense în %.", "page-dapps-docklink-dapps": "Introducere în aplicații descentralizate (dapps)", "page-dapps-docklink-smart-contracts": "Contractele inteligente", @@ -191,7 +190,6 @@ "page-dapps-technology-description": "Acestea sunt aplicații care vizează descentralizarea instrumentelor pentru dezvoltatori, încorporarea sistemelor cripto-economice în tehnologia existentă și crearea piețelor pentru munca de dezvoltare open-source.", "page-dapps-technology-title": "Tehnologie descentralizată", "page-dapps-token-sets-logo-alt": "Sigla Token Sets", - "page-dapps-tornado-cash-logo-alt": "Sigla Tornado Cash", "page-dapps-uniswap-logo-alt": "Sigla Uniswap", "page-dapps-wallet-callout-button": "Găsiți portofelul", "page-dapps-wallet-callout-description": "Portofelele sunt și ele aplicații dapp. Găsiți unul în funcție de funcționalitățile pe care le doriți.", diff --git a/src/intl/ru/page-dapps.json b/src/intl/ru/page-dapps.json index b5304174d99..8372c05711a 100644 --- a/src/intl/ru/page-dapps.json +++ b/src/intl/ru/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "«Транслируйте» деньги в реальном времени.", "page-dapps-dapp-description-superrare": "Покупайте цифровые произведения искусства непосредственно от художников или на вторичных рынках.", "page-dapps-dapp-description-token-sets": "Стратегии инвестирования, которые автоматически ребалансируют портфель.", - "page-dapps-dapp-description-tornado-cash": "Отправляйте анонимные транзакции в Ethereum.", "page-dapps-dapp-description-uniswap": "Легко обменивайте токены или предоставляйте их для получения наград в процентах.", "page-dapps-dapp-description-dexguru": "Торговый терминал без ограничений для трейдеров DeFi", "page-dapps-dapp-description-synthetix": "Synthetix — это протокол для выпуска синтетических активов и торговли ими", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Это приложения, сфокусированные на децентрализованные средства разработчиков, включающие криптоэкономические системы в существующую технологию и создающие рынок для разработок на основе открытого исходного кода.", "page-dapps-technology-title": "Децентрализованная технология", "page-dapps-token-sets-logo-alt": "Логотип Token Sets", - "page-dapps-tornado-cash-logo-alt": "Логотип наличных Tornado", "page-dapps-uniswap-logo-alt": "Логотип Uniswap", "page-dapps-wallet-callout-button": "Найти кошелек", "page-dapps-wallet-callout-description": "Кошельки тоже являются приложениями dapp. Выберите кошелек на основе функций, которые подходят вам.", diff --git a/src/intl/se/page-dapps.json b/src/intl/se/page-dapps.json index 776821f77d1..8a2c8db0a4c 100644 --- a/src/intl/se/page-dapps.json +++ b/src/intl/se/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Strömma pengar i realtid.", "page-dapps-dapp-description-superrare": "Köp digitala konstverk direkt från konstnärer eller på andrahandsmarknader.", "page-dapps-dapp-description-token-sets": "Kryptoinvesteringsstrategier som automatiskt återbalanseras.", - "page-dapps-dapp-description-tornado-cash": "Skicka anonyma transaktioner på Ethereum.", "page-dapps-dapp-description-uniswap": "Byt polleter på ett enkelt sätt eller tillhandahåll polletter i utbyte mot %-belöningar.", "page-dapps-dapp-description-dexguru": "Handelsterminal för DeFi-handlare som inte är frihetsberövande", "page-dapps-docklink-dapps": "Introduktion till dapps", @@ -198,7 +197,6 @@ "page-dapps-technology-description": "Det handlar om applikationer som fokuserar på att decentralisera utvecklarverktyg, integrera kryptoekonomiska system i befintlig teknik och skapa marknadsplatser för utvecklingsarbete med öppen källkod.", "page-dapps-technology-title": "Decentraliserad teknik", "page-dapps-token-sets-logo-alt": "Token Sets-logotyp", - "page-dapps-tornado-cash-logo-alt": "Tornado kontantlogotyp", "page-dapps-uniswap-logo-alt": "Uniswap-logotyp", "page-dapps-wallet-callout-button": "Hitta plånbok", "page-dapps-wallet-callout-description": "Plånböcker är också dappar. Hitta en baserad på de funktioner som passar dig.", diff --git a/src/intl/sl/page-dapps.json b/src/intl/sl/page-dapps.json index 4648e3c9e4b..84307f5502b 100644 --- a/src/intl/sl/page-dapps.json +++ b/src/intl/sl/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Sproti pretočno predvajajte denar.", "page-dapps-dapp-description-superrare": "Kupujte digitalne umetnine neposredno od umetnikov ali na sekundarnih trgih.", "page-dapps-dapp-description-token-sets": "Strategije vlaganja v kriptovalute, ki se samodejno znova uravnovesijo.", - "page-dapps-dapp-description-tornado-cash": "Pošiljajte anonimne transakcije na Ethereumu.", "page-dapps-dapp-description-uniswap": "Preprosto menjajte žetone ali zagotovite žetone za % nagrade.", "page-dapps-dapp-description-dexguru": "Neskrbniški terminal za trgovanje za trgovce DeFi", "page-dapps-dapp-description-synthetix": "Synthetix je protokol za izdajanje sintetičnih sredstev in trgovanje z njimi", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "To so aplikacije, ki so osredotočene na decentralizacijo razvijalskih orodij, vključevanje kriptoekonomskih sistemov v obstoječe tehnologije in ustvarjanje trgov za odprtokodni razvoj.", "page-dapps-technology-title": "Decentralizirana tehnologija", "page-dapps-token-sets-logo-alt": "Logotip Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logotip Tornado cash", "page-dapps-uniswap-logo-alt": "Logotip Uniswap", "page-dapps-wallet-callout-button": "Poišči denarnico", "page-dapps-wallet-callout-description": "Tudi denarnice so decentralizirane aplikacije. Poiščite ustrezno glede na funkcije, ki vam ustrezajo.", diff --git a/src/intl/sr/page-dapps.json b/src/intl/sr/page-dapps.json index 877ad0d81a0..6105c51f431 100644 --- a/src/intl/sr/page-dapps.json +++ b/src/intl/sr/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Stavite u tok novac u realnom vremenu.", "page-dapps-dapp-description-superrare": "Kupujte digitalna umetnička dela direktno od umetnika ili na sekundarnim tržištima.", "page-dapps-dapp-description-token-sets": "Kripto strategije ulaganja koje se automatski rebalansiraju.", - "page-dapps-dapp-description-tornado-cash": "Pošaljite anonimne transakcije na Ethereum-u.", "page-dapps-dapp-description-uniswap": "Jednostavno zamenite tokene ili obezbedite tokene za% nagrade.", "page-dapps-dapp-description-dexguru": "Samoupravljački trgovački terminal za trgovce decentralizovanih finansija (DeFi)", "page-dapps-dapp-description-synthetix": "Synthetix je protokol za izdavanje sintetičkih sredstava i trgovinu njima", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "To su aplikacije koje se fokusiraju na decentralizaciju alata za programere, uključivanje kriptoekonomskih sistema u postojeću tehnologiju i stvaranje tržišta za razvojne radove otvorenog koda.", "page-dapps-technology-title": "Decentralizovana tehnologija", "page-dapps-token-sets-logo-alt": "Token Sets logo", - "page-dapps-tornado-cash-logo-alt": "Logo Tornado cash-a", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Pronađi novčanik", "page-dapps-wallet-callout-description": "Novčanici su takodje dapp-ovi. Pronađite ga na osnovu karakteristika koje vam odgovaraju.", diff --git a/src/intl/sw/page-dapps.json b/src/intl/sw/page-dapps.json index 4891a7a36ef..aaf01322a63 100644 --- a/src/intl/sw/page-dapps.json +++ b/src/intl/sw/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Pata mtiririko wa hela katika wakati halisi.", "page-dapps-dapp-description-superrare": "Nunua kazi za sanaa za kiidjitali kutka kwa wasanii au masoko ya sekondari.", "page-dapps-dapp-description-token-sets": "Mikakati ya uwekezaji ya Crypto ambayo inasawazisha kiotomatiki.", - "page-dapps-dapp-description-tornado-cash": "Fanya miamala ya siri kwenye Ethereum.", "page-dapps-dapp-description-uniswap": "Badilisha ishara kiurahisis au toa ishara kupata zawadi kwa silimia % kadhaa.", "page-dapps-dapp-description-dexguru": "Ufanyaji wa biashara bila usimamizi kwa wauzaji wa fedha zilizogatuliwa", "page-dapps-dapp-description-synthetix": "Synthetix ni itifaki ya utoaji wa na ufanyaji biashara wa amali asili", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Hizi ni programu ambazo zinaangazia ugatuaji wa zana za wasanidi programu, kujumuisha mifumo ya kriptoeconomic katika teknolojia iliyopo, na kuunda soko kwa kazi huria ya ukuzaji.", "page-dapps-technology-title": "Teknolojia zilizogatuliwa", "page-dapps-token-sets-logo-alt": "Nembo ya Token Sets", - "page-dapps-tornado-cash-logo-alt": "Nembo ya Tornado cash", "page-dapps-uniswap-logo-alt": "Nembo ya Uniswap", "page-dapps-wallet-callout-button": "Tafuta pochi", "page-dapps-wallet-callout-description": "Pochi ni dapps pia. Tafuta moja kulingana na vipengele vinavyokufaa.", diff --git a/src/intl/tr/page-dapps.json b/src/intl/tr/page-dapps.json index d3807efd72f..37194276259 100644 --- a/src/intl/tr/page-dapps.json +++ b/src/intl/tr/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "Dijital sanat eserlerini doğrudan sanatçılardan veya ikincil pazarlardan satın alın.", "page-dapps-dapp-description-synthetix": "Synthetix, sentetik varlıkların ihraç ve ticaretini sağlayan bir protokoldür", "page-dapps-dapp-description-token-sets": "Otomatik olarak yeniden dengeleyen kripto yatırım stratejileri.", - "page-dapps-dapp-description-tornado-cash": "Ethereum'da anonim işlemler gönderin.", "page-dapps-dapp-description-uniswap": "Token'leri basitçe değiştirin veya % ödüller için token'ler sağlayın.", "page-dapps-dapp-description-xmtp": "DM'ler, uyarılar, duyurular ve daha fazlası dahil olmak üzere blokzincir hesapları arasında mesaj gönderin.", "page-dapps-dapp-description-yearn": "Yearn Finans bir getirici toplayıcıdır. Bireylere, DAO'lara ve diğer protokollere dijital varlıkları yatırmak ve getiri almak için bir yol verir.", @@ -258,7 +257,6 @@ "page-dapps-technology-description": "Bunlar, geliştirici araçlarını Ademi merkezileştirmeye, kripto-ekonomik sistemleri mevcut teknolojiye dahil etmeye ve açık kaynak geliştirme çalışmaları için pazarlar oluşturmaya odaklanan uygulamalardır.", "page-dapps-technology-title": "Merkezi olmayan teknoloji", "page-dapps-token-sets-logo-alt": "Token Sets logosu", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logosu", "page-dapps-uniswap-logo-alt": "Uniswap logosu", "page-dapps-wallet-callout-button": "Cüzdan bulun", "page-dapps-wallet-callout-description": "Cüzdanlar da merkezi olmayan uygulamalardır. Size uygun özelliklere göre bir tane bulun.", diff --git a/src/intl/uk/page-dapps.json b/src/intl/uk/page-dapps.json index f9a7b9a0ec8..cd63a7aa604 100644 --- a/src/intl/uk/page-dapps.json +++ b/src/intl/uk/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Переказуйте гроші в режимі реального часу.", "page-dapps-dapp-description-superrare": "Купуйте цифрові витвори мистецтва безпосередньо в митців або на вторинних ринках.", "page-dapps-dapp-description-token-sets": "Криптографічні інвестиційні стратегії можна автоматично заново збалансувати.", - "page-dapps-dapp-description-tornado-cash": "Надсилайте анонімні транзакції в мережі Ethereum.", "page-dapps-dapp-description-uniswap": "Легко обмінюйте токени або надавайте їх за винагороди у відсотках.", "page-dapps-dapp-description-dexguru": "Торговий термінал без обмежень для трейдерів DeFi", "page-dapps-dapp-description-synthetix": "Synthetix — це протокол для випуску синтетичних активів і торгівлі ними", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Це програми, націлені на децентралізацію інструментів розробників, включення криптоекономічних систем в існуючі технології та створення торговельних майданчиків для роботи з відкритим вихідним кодом.", "page-dapps-technology-title": "Децентралізована технологія", "page-dapps-token-sets-logo-alt": "Token Sets logo", - "page-dapps-tornado-cash-logo-alt": "Tornado cash logo", "page-dapps-uniswap-logo-alt": "Uniswap logo", "page-dapps-wallet-callout-button": "Знайти гаманець", "page-dapps-wallet-callout-description": "Гаманці – це також децентралізовані програми. Знайдіть його на основі функцій, які вас цікавлять.", diff --git a/src/intl/vi/page-dapps.json b/src/intl/vi/page-dapps.json index a00712c57b7..facdb27c8e4 100644 --- a/src/intl/vi/page-dapps.json +++ b/src/intl/vi/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "Chuyển tiền trong thời gian thực.", "page-dapps-dapp-description-superrare": "Mua trực tiếp các tác phẩm nghệ thuật số từ nghệ sĩ hoặc trên thị trường thứ cấp.", "page-dapps-dapp-description-token-sets": "Các chiến lược đầu tư tái cân bằng tự động cho tiền mã hoá.", - "page-dapps-dapp-description-tornado-cash": "Gửi các giao dịch ẩn danh trên Ethereum.", "page-dapps-dapp-description-uniswap": "Chỉ cần hoán đổi token hoặc phân phối token dưới dạng % phần thưởng.", "page-dapps-dapp-description-dexguru": "Cổng giao dịch không qua trung gian cho các nhà giao dịch tài chính phi tập trung (DeFi)", "page-dapps-dapp-description-synthetix": "Synthetix là một giao thức dùng cho việc phát hành và giao dịch tài sản tổng hợp", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "Các ứng dụng này tập trung vào việc phân tán các công cụ dành cho nhà phát triển, tích hợp hệ thống kinh tế tiền mã hoá vào công nghệ hiện tại và thiết lập thị trường cho hoạt động phát triển mã nguồn mở.", "page-dapps-technology-title": "Công nghệ phi tập trung", "page-dapps-token-sets-logo-alt": "Logo của Token Sets", - "page-dapps-tornado-cash-logo-alt": "Logo của Tornado cash", "page-dapps-uniswap-logo-alt": "Logo của Uniswap", "page-dapps-wallet-callout-button": "Tìm ví", "page-dapps-wallet-callout-description": "Ví cũng là ứng dụng phi tập trung (dapp). Tìm một ví dựa trên các tính năng phù hợp với bạn.", diff --git a/src/intl/zh-tw/page-dapps.json b/src/intl/zh-tw/page-dapps.json index 770b79c61f4..d8070ba4e7c 100644 --- a/src/intl/zh-tw/page-dapps.json +++ b/src/intl/zh-tw/page-dapps.json @@ -85,7 +85,6 @@ "page-dapps-dapp-description-sablier": "即時流通資金。", "page-dapps-dapp-description-superrare": "直接從藝術家或二級市場購買數位藝術品。", "page-dapps-dapp-description-token-sets": "能自動調整資金的加密貨幣投資策略。", - "page-dapps-dapp-description-tornado-cash": "在以太坊傳送匿名交易。", "page-dapps-dapp-description-uniswap": "輕鬆交換代幣或提供代幣賺取 % 獎勵。", "page-dapps-dapp-description-dexguru": "面向去中心化金融交易者的不受監護式交易終端", "page-dapps-dapp-description-synthetix": "Synthetix 是一個用於發行及交易合成資產的協議。", @@ -200,7 +199,6 @@ "page-dapps-technology-description": "這些應用程式著重於去中心化開發者工具,融入加密貨幣系統與現有科技,及打造開源開發市場。", "page-dapps-technology-title": "去中心化科技", "page-dapps-token-sets-logo-alt": "Token Sets 標誌", - "page-dapps-tornado-cash-logo-alt": "Tornado cash 標誌", "page-dapps-uniswap-logo-alt": "Uniswap 標誌", "page-dapps-wallet-callout-button": "尋找錢包", "page-dapps-wallet-callout-description": "錢包也是去中心化應用程式之一。找一個適合你的錢包吧。", diff --git a/src/intl/zh/page-dapps.json b/src/intl/zh/page-dapps.json index 06f8733a6c3..fe473485db3 100644 --- a/src/intl/zh/page-dapps.json +++ b/src/intl/zh/page-dapps.json @@ -121,7 +121,6 @@ "page-dapps-dapp-description-superrare": "直接从艺术家或在二级市场购买数字艺术作品。", "page-dapps-dapp-description-synthetix": "Synthetix 是一个用于发行和交易合成资产的协议", "page-dapps-dapp-description-token-sets": "自动再平衡的加密投资策略。", - "page-dapps-dapp-description-tornado-cash": "在以太坊上发送匿名交易。", "page-dapps-dapp-description-uniswap": "简单地交换代币或提供代币换取%的奖励。", "page-dapps-dapp-description-xmtp": "在区块链帐户之间发送消息,包括私信、警报、公告等。", "page-dapps-dapp-description-yearn": "Yearn Finance 是一个收益聚合器。它为个人、DAO 和其他协议提供了一种存入数字资产并获得收益的方式。", @@ -258,7 +257,6 @@ "page-dapps-technology-description": "这些应用侧重于开发者工具的去中心化,将加密经济系统纳入现有技术,并为开发开放源码的开发工作创建市场。", "page-dapps-technology-title": "去中心化技术", "page-dapps-token-sets-logo-alt": "Token Sets徽标", - "page-dapps-tornado-cash-logo-alt": "Tornado cash徽标", "page-dapps-uniswap-logo-alt": "Uniswap徽标", "page-dapps-wallet-callout-button": "查找钱包", "page-dapps-wallet-callout-description": "钱包同样也是去中心化应用程序,根据功能最适合你的原则选择一个钱包。", From 9276fdb7671cddf18d774e133d39e11d50412998 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 15 Feb 2024 12:20:22 -0700 Subject: [PATCH 318/478] Update src/data/community-meetups.json --- src/data/community-meetups.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/community-meetups.json b/src/data/community-meetups.json index 372199f8474..f4d4cfd46d2 100644 --- a/src/data/community-meetups.json +++ b/src/data/community-meetups.json @@ -1,6 +1,6 @@ [ { - "title": "Web3 Fanmily", + "title": "Web3 Family", "emoji": ":es:", "location": "Barcelona", "link": "https://www.meetup.com/web3family/" From 57713e7bbed2747d92deb825ada006cc70255e1d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 11:28:19 -0800 Subject: [PATCH 319/478] fix: typo --- src/intl/en/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 84fee71a054..7c42150c0bd 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -183,7 +183,7 @@ "nav-events-description": "Decentralization and freedom to participate for anyone", "nav-events-irl-description": "Every month there are major Ethereum events in-person and online", "nav-events-label": "Communities and events", - "nav-events-online-description": "Hundreds of thousands of Ethereum enthusiasts father in these online communities", + "nav-events-online-description": "Hundreds of thousands of Ethereum enthusiasts gather in these online communities", "nav-find-wallet-description": "Wallets allow you to use crypto", "nav-find-wallet-label": "Choose your wallet", "nav-gas-fees-description": "How are ETH transaction fees calculated", From 4c067833a1b21f50c22ba6903b3ee8066eb71462 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:12:41 -0800 Subject: [PATCH 320/478] feat: add /guides/ home link --- src/components/Nav/useNav.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/useNav.ts b/src/components/Nav/useNav.ts index 0f29b9c9a91..6ebb1b6bb3b 100644 --- a/src/components/Nav/useNav.ts +++ b/src/components/Nav/useNav.ts @@ -151,7 +151,11 @@ export const useNav = () => { label: t("nav-guides-label"), description: t("nav-guides-description"), items: [ - // TODO: Add /guides/ link as first sub-item? + { + label: t("nav-overview-label"), + description: t("nav-guide-overview-description"), + href: "/guides/", + }, { label: t("nav-guide-create-account-label"), description: t("nav-guide-create-account-description"), From e6cbeb84634e05f53e89d8d16149ea1dfce5b700 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:22:32 -0800 Subject: [PATCH 321/478] fix: active page link styling adds 4px spacing between li's --- src/components/Nav/Menu/ItemContent.tsx | 7 ++----- src/components/Nav/Menu/LvlContent.tsx | 9 ++++++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/Nav/Menu/ItemContent.tsx b/src/components/Nav/Menu/ItemContent.tsx index 80bf9654c22..b665dbb47b5 100644 --- a/src/components/Nav/Menu/ItemContent.tsx +++ b/src/components/Nav/Menu/ItemContent.tsx @@ -22,15 +22,12 @@ const ItemContent = ({ item, lvl }: ItemProps) => { return ( - + {label} {description} diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 118ca3f5719..9ebcfc2381d 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -68,7 +68,7 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { boxShadow: "none", } const buttonProps: ButtonProps = { - color: isActivePage ? menuColors.active : menuColors.body, + color: menuColors.body, leftIcon: lvl === 1 && icon ? : undefined, rightIcon: isLink ? undefined : , position: "relative", @@ -78,7 +78,9 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { "span:first-of-type": { m: 0, me: pad }, // Spacing for icon }, py: pad, - bg: "none", + bg: isActivePage + ? menuColors.lvl[lvl].activeBackground + : "none", _hover: activeStyles, _focus: activeStyles, variant: "ghost", @@ -86,7 +88,8 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { return ( Date: Thu, 15 Feb 2024 14:41:48 -0800 Subject: [PATCH 322/478] refactor: extract logic for readability --- src/components/Nav/Menu/LvlContent.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 9ebcfc2381d..8a61ce75d60 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -46,13 +46,14 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { const pad = 4 // Chakra-UI space token + const getColumns = (lvl: Level) => { + const count = 4 - lvl // lvl 1: 3 cols, lvl 2: 2, lvl 3: 1 + return `repeat(${count}, 1fr)` + } + return ( - + {items.map((item) => { From 98a8265b4571cdfeb7aa129cbbbeaf286a4307fe Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:42:22 -0800 Subject: [PATCH 323/478] chore: update matomo action string --- src/components/Nav/Menu/LvlContent.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 8a61ce75d60..08421ab24c4 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -112,7 +112,7 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { onClick={() => trackCustomEvent({ eventCategory: "Desktop navigation menu", - eventAction: `Follow link from section: ${locale} - ${activeSection}`, + eventAction: `Menu - ${activeSection} - ${locale}`, eventName: action.href!, }) } From f44c73e4fd623c8c8927b5791ad877e5def41647 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:44:40 -0800 Subject: [PATCH 324/478] fix: add roundedStart to open item --- src/components/Nav/Menu/LvlContent.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 08421ab24c4..9ccbe3c8ca1 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -93,6 +93,7 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { _last={{ mb: 0 }} sx={{ '&:has(button[data-state="open"])': { + roundedStart: "md", roundedEnd: "none", bg: menuColors.lvl[lvl].activeBackground, me: -pad, From 7d5b3c2ce42306922ee1e04ed0fbfa5c8c24d0e2 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 15 Feb 2024 16:57:44 -0800 Subject: [PATCH 325/478] chore: rm old, add comment use `ul` wrapper for `li`'s --- src/components/Nav/Menu/LvlContent.tsx | 5 ----- src/components/Nav/Menu/index.tsx | 21 +++++---------------- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/LvlContent.tsx index 9ccbe3c8ca1..c06cd414171 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/LvlContent.tsx @@ -32,7 +32,6 @@ type LvlContentProps = { /** * Content for each sub-menu below top-level navigation * Content renders inside sibling Viewport - * Viewport wrapped in Portal to render inside a passed ref * @param lvl - The level of the menu * @param items - The items to be displayed in the menu * @param activeSection - English label of the active section for event tracking @@ -100,10 +99,6 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { pe: pad, }, }} - onMouseLeave={(e) => { - // Bring focus to destination button when leaving - ;(e.relatedTarget as HTMLButtonElement).focus() - }} > {isLink ? ( diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 30680850103..b1c0e02bbe6 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -23,15 +23,6 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { const menuColors = useNavMenuColors() const [activeSection, setActiveSection] = useState(null) - // const getLvlSx = (lvl: Level): BoxProps["sx"] => ({ - // opacity: 0, - // '&:has([data-state="open"])': { - // bg: menuColors.lvl[lvl].background, - // opacity: 1, - // transition: "opacity 300ms linear", - // }, - // }) - const getEnglishSectionName = ( activeSection: string ): NavSectionKey | null => { @@ -53,7 +44,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { }} > - + {SECTION_LABELS.map((sectionKey) => { const { label, items } = sections[sectionKey] return ( @@ -76,6 +67,10 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { + {/** + * This is the CONTAINER for all three menu levels + * This renders inside the NavigationMenu.Viewport component + */} { border="1px" borderColor={menuColors.stroke} bg={menuColors.lvl[1].background} - sx={{ - '&:has(#lvl1 [data-state="open"])': { - opacity: 1, - transition: "opacity 200ms linear", - }, - }} > Date: Thu, 15 Feb 2024 16:58:20 -0800 Subject: [PATCH 326/478] feat: add active link styling to mobile menu --- src/components/Nav/Mobile/LvlAccordion.tsx | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/components/Nav/Mobile/LvlAccordion.tsx b/src/components/Nav/Mobile/LvlAccordion.tsx index 29d53c36934..3b94143cf2e 100644 --- a/src/components/Nav/Mobile/LvlAccordion.tsx +++ b/src/components/Nav/Mobile/LvlAccordion.tsx @@ -14,6 +14,7 @@ import { import { BaseLink } from "@/components/Link" import { trackCustomEvent } from "@/lib/utils/matomo" +import { cleanPath } from "@/lib/utils/url" import type { Level, NavItem, NavSectionKey } from "../types" @@ -34,19 +35,20 @@ const LvlAccordion = ({ activeSection, onToggle, }: LvlAccordionProps) => { - const { locale } = useRouter() + const { asPath, locale } = useRouter() const menuColors = useNavMenuColors() - return ( - {items.map(({ label, description, ...actions }) => { - if ("href" in actions) + {items.map(({ label, description, ...action }) => { + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + if (isLink) return ( - - - ) : ( - <> - - - - - - - - - - )} - - - ) - })} -
      -
      - - -
      + + + + + {items.map((item) => { + const { label, description, icon, ...action } = item + const subItems = action.items || [] + const isLink = "href" in action + const isActivePage = isLink && cleanPath(asPath) === action.href + const activeStyles = { + outline: "none", + rounded: "md", + "p, svg": { color: menuColors.highlight }, + bg: menuColors.lvl[lvl].activeBackground, + boxShadow: "none", + } + const buttonProps: ButtonProps = { + color: menuColors.body, + leftIcon: lvl === 1 && icon ? : undefined, + rightIcon: isLink ? undefined : , + position: "relative", + w: "full", + me: -pad, + sx: { + "span:first-of-type": { m: 0, me: 4 }, // Spacing for icon + }, + py: pad, + bg: isActivePage + ? menuColors.lvl[lvl].activeBackground + : "none", + _hover: activeStyles, + _focus: activeStyles, + variant: "ghost", + } + return ( + + + {isLink ? ( + + + + + + ) : ( + <> + + + + + + + + + + )} + + + ) + })} + + + + +
      ) } diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index b1c0e02bbe6..24c9733df71 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,10 +1,10 @@ import { useState } from "react" -import { Box, type BoxProps, Flex } from "@chakra-ui/react" +import { AnimatePresence, motion, MotionProps } from "framer-motion" +import { Box, type BoxProps, Flex, Text } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import { Button } from "@/components/Buttons" -// import { trackCustomEvent } from "@/lib/utils/matomo" import { SECTION_LABELS } from "@/lib/constants" import type { NavSectionKey, NavSections } from "../types" @@ -22,6 +22,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { const { direction } = useRtlFlip() const menuColors = useNavMenuColors() const [activeSection, setActiveSection] = useState(null) + const isOpen = activeSection !== null const getEnglishSectionName = ( activeSection: string @@ -33,20 +34,34 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { return Object.keys(sections)[index] as NavSectionKey } + const handleSectionChange = (activeSection: string) => { + setActiveSection(getEnglishSectionName(activeSection)) + } + + const containerVariants: MotionProps["variants"] = { + open: { + opacity: 1, + maxHeight: "100vh", + transition: { duration: 0.2 }, + }, + closed: { + opacity: 0, + }, + } + return ( { - setActiveSection(getEnglishSectionName(activeSection)) - }} + delayDuration={500} + onValueChange={handleSectionChange} > {SECTION_LABELS.map((sectionKey) => { const { label, items } = sections[sectionKey] + const isActive = activeSection === sectionKey return ( @@ -55,38 +70,53 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { px={{ base: "3", lg: "4" }} variant="ghost" whiteSpace="nowrap" - color="body.base" - sx={{ - '&[data-state="open"]': { - bg: "primary.lowContrast", - color: "primary.base", - }, - }} + color={isActive ? "primary.base" : "body.base"} > - {label} + {/* Animated highlight for active section */} + {isActive && ( + + )} + + {label} + - - {/** - * This is the CONTAINER for all three menu levels - * This renders inside the NavigationMenu.Viewport component - */} - - - - + + + {/** + * This is the CONTAINER for all three menu levels + * This renders inside the NavigationMenu.Viewport component + */} + + + + + ) })} From b7f7c0be8a21c09ed48cc646e4b924f373483de0 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 17 Feb 2024 14:25:21 -0800 Subject: [PATCH 347/478] refactor: extract component logic to hook --- src/components/Nav/Menu/index.tsx | 27 ++++------------------ src/components/Nav/Menu/useNavMenu.ts | 33 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 src/components/Nav/Menu/useNavMenu.ts diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index b1c0e02bbe6..502bf13d959 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,37 +1,22 @@ -import { useState } from "react" import { Box, type BoxProps, Flex } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import { Button } from "@/components/Buttons" -// import { trackCustomEvent } from "@/lib/utils/matomo" import { SECTION_LABELS } from "@/lib/constants" -import type { NavSectionKey, NavSections } from "../types" +import type { NavSections } from "../types" import LvlContent from "./LvlContent" - -import { useNavMenuColors } from "@/hooks/useNavMenuColors" -import { useRtlFlip } from "@/hooks/useRtlFlip" +import { useNavMenu } from "./useNavMenu" type NavMenuProps = BoxProps & { sections: NavSections } const Menu = ({ sections, ...props }: NavMenuProps) => { - const { direction } = useRtlFlip() - const menuColors = useNavMenuColors() - const [activeSection, setActiveSection] = useState(null) - - const getEnglishSectionName = ( - activeSection: string - ): NavSectionKey | null => { - const index = Object.values(sections).findIndex( - (section) => section.label === activeSection - ) - if (index < 0) return null - return Object.keys(sections)[index] as NavSectionKey - } + const { direction, menuColors, activeSection, handleSectionChange } = + useNavMenu(sections) return ( @@ -39,9 +24,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { dir={direction} orientation="horizontal" delayDuration={750} - onValueChange={(activeSection) => { - setActiveSection(getEnglishSectionName(activeSection)) - }} + onValueChange={handleSectionChange} > diff --git a/src/components/Nav/Menu/useNavMenu.ts b/src/components/Nav/Menu/useNavMenu.ts new file mode 100644 index 00000000000..7445a1951a8 --- /dev/null +++ b/src/components/Nav/Menu/useNavMenu.ts @@ -0,0 +1,33 @@ +import { useState } from "react" + +import type { NavSectionKey, NavSections } from "../types" + +import { useNavMenuColors } from "@/hooks/useNavMenuColors" +import { useRtlFlip } from "@/hooks/useRtlFlip" + +export const useNavMenu = (sections: NavSections) => { + const { direction } = useRtlFlip() + const menuColors = useNavMenuColors() + const [activeSection, setActiveSection] = useState(null) + + const getEnglishSectionName = ( + activeSection: string + ): NavSectionKey | null => { + const index = Object.values(sections).findIndex( + (section) => section.label === activeSection + ) + if (index < 0) return null + return Object.keys(sections)[index] as NavSectionKey + } + + const handleSectionChange = (activeSection: string) => { + setActiveSection(getEnglishSectionName(activeSection)) + } + + return { + direction, + menuColors, + activeSection, + handleSectionChange, + } +} From 7f1cc7bb2d45f4052f3eeec3c7edd6c10d83de28 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:05:19 -0800 Subject: [PATCH 348/478] refactor: LvlContent -> SubMenu, extract hook --- .../Nav/Menu/{LvlContent.tsx => SubMenu.tsx} | 66 +++++++++++-------- src/components/Nav/Menu/index.tsx | 4 +- src/components/Nav/Menu/useSubMenu.ts | 35 ++++++++++ 3 files changed, 75 insertions(+), 30 deletions(-) rename src/components/Nav/Menu/{LvlContent.tsx => SubMenu.tsx} (82%) create mode 100644 src/components/Nav/Menu/useSubMenu.ts diff --git a/src/components/Nav/Menu/LvlContent.tsx b/src/components/Nav/Menu/SubMenu.tsx similarity index 82% rename from src/components/Nav/Menu/LvlContent.tsx rename to src/components/Nav/Menu/SubMenu.tsx index e5ab082b775..c3a575aa556 100644 --- a/src/components/Nav/Menu/LvlContent.tsx +++ b/src/components/Nav/Menu/SubMenu.tsx @@ -1,6 +1,5 @@ -import { AnimatePresence, motion, type MotionProps } from "framer-motion" +import { AnimatePresence, motion } from "framer-motion" import NextLink from "next/link" -import { useRouter } from "next/router" import { Box, Button, @@ -21,14 +20,13 @@ import type { Level, NavItem, NavSectionKey } from "../types" import ItemContent from "./ItemContent" import NextChevron from "./NextChevron" - -import { useNavMenuColors } from "@/hooks/useNavMenuColors" -import { useRtlFlip } from "@/hooks/useRtlFlip" +import { useSubMenu } from "./useSubMenu" type LvlContentProps = { lvl: Level items: NavItem[] activeSection: NavSectionKey | null + onClose: () => void } /** @@ -37,26 +35,36 @@ type LvlContentProps = { * @param lvl - The level of the menu * @param items - The items to be displayed in the menu * @param activeSection - English label of the active section for event tracking + * @param onClose - Function to close the menu * @returns The JSX element representing the menu content. */ -const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { - const { asPath, locale } = useRouter() - const menuColors = useNavMenuColors() - const { isRtl } = useRtlFlip() +const SubMenu = ({ + lvl, + items, + activeSection, + onClose, +}: LvlContentProps) => { + const { + activeSub, + asPath, + locale, + menuColors, + menuVariants, + PADDING, + setActiveSub, + handleSubMenuChange, + } = useSubMenu() if (lvl > 3) return null - const pad = 4 // Chakra-UI space token - const templateColumns = `repeat(${4 - lvl}, 1fr)` - const menuVariants: MotionProps["variants"] = { - closed: { opacity: 0, scaleX: 0.8, originX: isRtl ? 1 : 0 }, - open: { opacity: 1, scaleX: 1 }, - } - return ( - + { gridTemplateColumns={templateColumns} > - + {items.map((item) => { const { label, description, icon, ...action } = item const subItems = action.items || [] @@ -88,11 +96,11 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { rightIcon: isLink ? undefined : , position: "relative", w: "full", - me: -pad, + me: -PADDING, sx: { "span:first-of-type": { m: 0, me: 4 }, // Spacing for icon }, - py: pad, + py: PADDING, bg: isActivePage ? menuColors.lvl[lvl].activeBackground : "none", @@ -101,17 +109,17 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { variant: "ghost", } return ( - + @@ -120,13 +128,14 @@ const LvlContent = ({ lvl, items, activeSection }: LvlContentProps) => { - - - {/** - * This is the CONTAINER for all three menu levels - * This renders inside the NavigationMenu.Viewport component - */} - - - - - + + {/** + * This is the CONTAINER for all three menu levels + * This renders inside the NavigationMenu.Viewport component + */} + + + + ) })} From ce717a417c676bf07d14d40fe06c478409844d59 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 18 Feb 2024 02:15:10 +0000 Subject: [PATCH 353/478] Update Crowdin contributors --- src/data/crowdin/combined-translators.json | 1807 +++++++++++++++-- .../crowdin/translation-buckets-dirs.json | 4 + 2 files changed, 1593 insertions(+), 218 deletions(-) diff --git a/src/data/crowdin/combined-translators.json b/src/data/crowdin/combined-translators.json index a7d57820431..42ed3dd27fe 100644 --- a/src/data/crowdin/combined-translators.json +++ b/src/data/crowdin/combined-translators.json @@ -5401,6 +5401,23 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15310784/medium/cfdc53d28658b94b21e45d51acc457c7.jpg" } ] + }, + { + "fileId": "8027", + "contributors": [ + { + "id": 15421538, + "username": "johannt", + "totalCosts": 889.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15421538/medium/7e1f5d90509951072c0de0d9684baa35.png" + }, + { + "id": 15932515, + "username": "Astronaut828", + "totalCosts": 195.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932515/medium/ff4f1f9efa429e626e53821ae26ecf21.png" + } + ] } ] }, @@ -5749,7 +5766,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 540.35, + "totalCosts": 575.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -5790,7 +5807,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 129.28, + "totalCosts": 136.35, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -6407,6 +6424,12 @@ "totalCosts": 16.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15914025/medium/b2c5e012bade4e011c918815c86c4968.png" }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 15447840, "username": "jjalbertodiaz", @@ -6567,6 +6590,12 @@ "totalCosts": 28.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15767291/medium/7fad807cd8381eba8c73fbe5cff78eea.png" }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 15714091, "username": "Karym_GG", @@ -6839,6 +6868,12 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15655799/medium/0f108d6404eeff30e335b9cea2ad02d4_default.png" }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 14581548, "username": "danielpg2106", @@ -7467,18 +7502,18 @@ { "fileId": "2778", "contributors": [ + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 438.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 15522923, "username": "llucC", "totalCosts": 432.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15522923/medium/539a9115b9d375bde4eb4bc0fc37995c.png" }, - { - "id": 15194310, - "username": "MGETH", - "totalCosts": 424.2, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" - }, { "id": 15553253, "username": "EmelyGarcia", @@ -7624,7 +7659,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1781.64, + "totalCosts": 1790.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -8011,7 +8046,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 4064.24, + "totalCosts": 4091.51, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -8080,7 +8115,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 3418.85, + "totalCosts": 3429.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -8687,6 +8722,12 @@ "totalCosts": 13.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15866753/medium/1f6bb2900a3f89af7cf2dffb4ca6df4d.png" }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 15899559, "username": "Lgallardo", @@ -9642,6 +9683,18 @@ "username": "0xAntonio", "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15287132/medium/67c5a079a19f5b0cd46f8d628cff446d.png" + }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, + { + "id": 13917555, + "username": "benjiriro", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13917555/medium/304dd03df53b52c37cca54860ac922ed.jpeg" } ] }, @@ -10285,7 +10338,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 803.96, + "totalCosts": 823.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -10957,7 +11010,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 198.97, + "totalCosts": 214.12, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -11378,6 +11431,12 @@ "totalCosts": 27.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15770059/medium/52b81f2ff530c14473f18ee7281dae6a_default.png" }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, { "id": 15155844, "username": "CryptoSpace", @@ -11443,7 +11502,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 774.67, + "totalCosts": 869.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] @@ -12263,6 +12322,12 @@ "username": "rom1919", "totalCosts": 10.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14807238/medium/4e9d7e22b8ba45851bf0d10bf4bb2f68.jpeg" + }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] }, @@ -12330,7 +12395,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 261.59, + "totalCosts": 273.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] @@ -12722,7 +12787,7 @@ { "id": 15194310, "username": "MGETH", - "totalCosts": 1549.34, + "totalCosts": 1784.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { @@ -14781,6 +14846,12 @@ "totalCosts": 64.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, + { + "id": 15954931, + "username": "XofEE", + "totalCosts": 35.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" + }, { "id": 14758970, "username": "JJulles", @@ -15904,7 +15975,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 32.32, + "totalCosts": 46.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" } ] @@ -16227,6 +16298,12 @@ "totalCosts": 116.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 91.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, { "id": 14823260, "username": "omahs", @@ -16238,12 +16315,6 @@ "username": "mehdibouzit", "totalCosts": 17.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15949345/medium/2eb9da6ad8eb6399c9aff2b21957916d.png" - }, - { - "id": 12844463, - "username": "MATsxm", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] }, @@ -17052,6 +17123,12 @@ "totalCosts": 86.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15683863/medium/1d6ed972d684360bf9f45bafbabe6c6f.jpeg" }, + { + "id": 16223056, + "username": "amanoullah", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16223056/medium/dd51015ea92987bd3b19ef23b97095ac.png" + }, { "id": 14587890, "username": "Elikill58", @@ -17413,6 +17490,12 @@ "totalCosts": 49.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15442454/medium/860696ab89262fe98a0b888882d2b2da_default.png" }, + { + "id": 16223056, + "username": "amanoullah", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16223056/medium/dd51015ea92987bd3b19ef23b97095ac.png" + }, { "id": 15318490, "username": "arthursw", @@ -17489,6 +17572,12 @@ "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, + { + "id": 15954931, + "username": "XofEE", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" + }, { "id": 14933025, "username": "EdgyLsx", @@ -17599,6 +17688,12 @@ "username": "omahs", "totalCosts": 157.56, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg" + }, + { + "id": 16223056, + "username": "amanoullah", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16223056/medium/dd51015ea92987bd3b19ef23b97095ac.png" } ] }, @@ -17822,6 +17917,12 @@ "totalCosts": 17.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14181997/medium/0aaf4c266fa4700ccec8bcadb09440b6.jpg" }, + { + "id": 16223056, + "username": "amanoullah", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16223056/medium/dd51015ea92987bd3b19ef23b97095ac.png" + }, { "id": 17361, "username": "plamarque", @@ -18310,7 +18411,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 238.36, + "totalCosts": 283.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -19157,6 +19258,12 @@ "totalCosts": 63.63, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14635054/medium/92dc7e601ce7911daafcfaecb875e0cd.jpeg" }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, { "id": 15624473, "username": "CaverneCrypto", @@ -19369,7 +19476,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 332.29, + "totalCosts": 345.42, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -19422,7 +19529,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 118.17, + "totalCosts": 134.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -19445,7 +19552,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 104.03, + "totalCosts": 111.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" }, { @@ -20558,7 +20665,7 @@ { "id": 15954931, "username": "XofEE", - "totalCosts": 99.99, + "totalCosts": 119.18, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" }, { @@ -21573,6 +21680,12 @@ "username": "XofEE", "totalCosts": 668.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15954931/medium/7254d648c451b822632980e5bfcb61fa.png" + }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] }, @@ -23096,7 +23209,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 870.62, + "totalCosts": 876.68, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23198,7 +23311,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1303.91, + "totalCosts": 1318.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23442,7 +23555,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1773.56, + "totalCosts": 1787.7, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23482,7 +23595,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 4204.63, + "totalCosts": 4213.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23703,7 +23816,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 665.59, + "totalCosts": 673.67, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -23845,7 +23958,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 814.06, + "totalCosts": 827.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24056,7 +24169,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 11568.54, + "totalCosts": 11587.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24142,7 +24255,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 899.91, + "totalCosts": 906.98, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24197,7 +24310,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2031.11, + "totalCosts": 2046.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" }, { @@ -24231,7 +24344,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1641.25, + "totalCosts": 1669.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24253,7 +24366,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2069.49, + "totalCosts": 2091.71, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24435,7 +24548,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 3210.79, + "totalCosts": 3235.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24457,7 +24570,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1989.7, + "totalCosts": 1994.75, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24490,7 +24603,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 5708.52, + "totalCosts": 5717.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24512,7 +24625,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 774.67, + "totalCosts": 869.61, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24534,7 +24647,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 2330.07, + "totalCosts": 2349.26, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24745,7 +24858,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1807.9, + "totalCosts": 1820.02, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -24866,7 +24979,7 @@ { "id": 15965461, "username": "Satglow", - "totalCosts": 1256.44, + "totalCosts": 1294.82, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] @@ -27589,9 +27702,15 @@ { "id": 14708760, "username": "hypebeans", - "totalCosts": 218.16, + "totalCosts": 235.33, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/c99d5e08a676eaebe6f2a383a81222e1.jpg" }, + { + "id": 15711553, + "username": "iamgorgasiagian", + "totalCosts": 95.95, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15711553/medium/78d86636558fbd59511b5c714ae72f78.jpeg" + }, { "id": 15752359, "username": "feriywahyu", @@ -34595,7 +34714,7 @@ { "id": 15208868, "username": "HiroyukiNaito", - "totalCosts": 1567.52, + "totalCosts": 1835.17, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] @@ -38232,6 +38351,111 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" } ] + }, + { + "fileId": "8015", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 543.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "8011", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 1101.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "7609", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 1100.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "7617", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 346.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "7619", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 1490.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "7621", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 751.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "7757", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 2158.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "7801", + "contributors": [ + { + "id": 15680077, + "username": "miyamo", + "totalCosts": 1333.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680077/medium/a9db402339c4ac996a32133a844692ef_default.png" + }, + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 411.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] + }, + { + "fileId": "8003", + "contributors": [ + { + "id": 15208868, + "username": "HiroyukiNaito", + "totalCosts": 3458.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15208868/medium/4ed4a0a0659f1c63e52f395079aeb3c4.jpg" + } + ] } ] }, @@ -38325,9 +38549,9 @@ }, { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 14362948, @@ -38360,9 +38584,9 @@ }, { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 151.5, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 14261470, @@ -38389,9 +38613,9 @@ }, { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" } ] }, @@ -38487,9 +38711,9 @@ }, { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 239.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 15732175, @@ -38545,9 +38769,9 @@ "contributors": [ { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 298.96, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 13997401, @@ -38585,9 +38809,9 @@ "contributors": [ { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 229.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 14261470, @@ -38638,9 +38862,9 @@ }, { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 371.68, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 14261470, @@ -38679,9 +38903,9 @@ }, { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 261.59, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, { "id": 15678253, @@ -38790,9 +39014,15 @@ "contributors": [ { "id": 13471138, - "username": "KyungwonPark", + "username": "linguist_won", "totalCosts": 1165.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/3e72b4fdf306e3afb0bc101953bc0def_default.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" + }, + { + "id": 16231456, + "username": "hweersot", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16231456/medium/67b2fcfd6782db7b41efc531e5f3b1d1_default.png" } ] } @@ -45736,312 +45966,1309 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 24.24, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "7525", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 590.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 14247352, + "username": "borja_reverter", + "totalCosts": 153.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 78.78, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15740363, + "username": "Claudiojmoreira", + "totalCosts": 36.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15740363/medium/b998f6d1784d3b5ec2cd69dac9ca5e8c.jpeg" + } + ] + }, + { + "fileId": "8027", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1070.6, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "8035", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1165.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 16099664, + "username": "yanvictorsn", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" + } + ] + }, + { + "fileId": "7713", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 2207.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15836847, + "username": "k77", + "totalCosts": 208.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15836847/medium/a83e58c4be6c8ef96bda97967d4703cd.png" + }, + { + "id": 15830251, + "username": "paodequeijocompingado", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830251/medium/df305c6124650d8f50add955b4770062_default.png" + } + ] + }, + { + "fileId": "7717", + "contributors": [ + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 1244.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 501.97, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15849127, + "username": "IagoEmanuel15", + "totalCosts": 61.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" + } + ] + }, + { + "fileId": "7721", + "contributors": [ + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 493.89, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + } + ] + }, + { + "fileId": "7803", + "contributors": [ + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 1087.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7725", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 962.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14573604, + "username": "bceschini", + "totalCosts": 150.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" + } + ] + }, + { + "fileId": "7729", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 394.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14573604, + "username": "bceschini", + "totalCosts": 334.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" + } + ] + }, + { + "fileId": "7733", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 560.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15902117, + "username": "cassio.gusson", + "totalCosts": 221.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15902117/medium/07ad2db947468fb4ed35ed2b9e51f8d2.png" + } + ] + }, + { + "fileId": "7737", + "contributors": [ + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 850.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + } + ] + }, + { + "fileId": "7741", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1289.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15422032, + "username": "Fritzhoy", + "totalCosts": 508.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" + } + ] + }, + { + "fileId": "7745", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1883.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15902493, + "username": "victorsalles", + "totalCosts": 137.36, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15902493/medium/d8ecbd67e54b44d12e95650bd9371463_default.png" + } + ] + }, + { + "fileId": "7749", + "contributors": [ + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 517.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + }, + { + "id": 15837087, + "username": "gabekoin", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837087/medium/198e2d3ce88fd597d2f6a39fcc40964a.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7753", + "contributors": [ + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 1256.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + } + ] + }, + { + "fileId": "7919", + "contributors": [ + { + "id": 15932353, + "username": "nickksoares", + "totalCosts": 749.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 511.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 107.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + }, + { + "id": 15929325, + "username": "jsantann", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15929325/medium/dfe876696a9c986f4bc248f2aab9c5ed_default.png" + }, + { + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + }, + { + "id": 15912891, + "username": "Cristianoluizz", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + } + ] + }, + { + "fileId": "7939", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 389.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7935", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 668.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "8007", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 349.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "8011", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1101.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "7757", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1664.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 493.89, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7801", + "contributors": [ + { + "id": 15917951, + "username": "maisa.m", + "totalCosts": 947.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15917951/medium/399d31990fbb5c2b964adeaaeb05b6a0.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 742.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7631", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 2944.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" + } + ] + }, + { + "fileId": "6241", + "contributors": [ + { + "id": 15123265, + "username": "teachertialorena", + "totalCosts": 522.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123265/medium/322692ee8934a652c6dbae39a499eb0f.png" + }, + { + "id": 15165600, + "username": "Horberlan", + "totalCosts": 487.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" + }, + { + "id": 14946409, + "username": "giu.roperto", + "totalCosts": 254.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14946409/medium/56d3187cc785e71756040654b7eeabb4.png" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 72.72, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15711897, + "username": "deymison", + "totalCosts": 31.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15711897/medium/1ef720cca42e3af55c16939ac1143b9c_default.png" + }, + { + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + }, + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + } + ] + }, + { + "fileId": "3056", + "contributors": [ + { + "id": 14659020, + "username": "DanielTaqueto", + "totalCosts": 602.97, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14659020/medium/56f5cb0b5617518f3cd660cb1834c9d7_default.png" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 181.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + }, + { + "id": 15526425, + "username": "xReDzin", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15526425/medium/69278630b1c357a38d62e3e762fcf45b.gif" + } + ] + }, + { + "fileId": "3124", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 77.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + } + ] + }, + { + "fileId": "7995", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1165.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + } + ] + }, + { + "fileId": "6267", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 990.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 599.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15160588, + "username": "R_Dark", + "totalCosts": 578.73, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15160588/medium/3903ef1af6faeec9604b6db70b5e6233_default.png" + }, + { + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" + } + ] + }, + { + "fileId": "6243", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 58.58, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7627", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1077.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 386.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "3100", + "contributors": [ + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 326.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 48.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14746732, + "username": "asdealmeida1", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14746732/medium/41ad9e6c8c212d49a5e493167a43de8e.jpeg" + } + ] + }, + { + "fileId": "3160", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "7999", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 5126.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 295.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "3074", + "contributors": [ + { + "id": 14896196, + "username": "leoclark", + "totalCosts": 70.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14896196/medium/495d3305573cff327e6707a437689055_default.png" + }, + { + "id": 15376854, + "username": "RenanDeveloper", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + } + ] + }, + { + "fileId": "3120", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 536.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15502802, + "username": "soo659215", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15502802/medium/46ff8617d7a0337d86eb94536f7b090d.png" + }, + { + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" + } + ] + }, + { + "fileId": "3164", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 65.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + } + ] + }, + { + "fileId": "2994", + "contributors": [ + { + "id": 14815414, + "username": "KoelhoSec", + "totalCosts": 290.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14815414/medium/cc746b15dd6d2fa3bc01369caaef44ed.png" + }, + { + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 85.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 77.77, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 14820852, + "username": "btclient", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14820852/medium/6d3e4e81b1dd0aa840959da8c8bcf63f.jpg" + }, + { + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + } + ] + }, + { + "fileId": "2986", + "contributors": [ + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 49.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 14815414, + "username": "KoelhoSec", + "totalCosts": 33.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14815414/medium/cc746b15dd6d2fa3bc01369caaef44ed.png" + }, + { + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + }, + { + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" + } + ] + }, + { + "fileId": "6259", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 350.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + }, + { + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 11.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + } + ] + }, + { + "fileId": "3088", + "contributors": [ + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 129.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, + { + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + } + ] + }, + { + "fileId": "3116", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 145.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + } + ] + }, + { + "fileId": "6261", + "contributors": [ + { + "id": 15267214, + "username": "GihOB", + "totalCosts": 755.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15267214/medium/5e39792fb994591df54a7e4e3eed8ebd_default.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 439.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 15237912, + "username": "jmontanholi", + "totalCosts": 32.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15237912/medium/57ba37fabf85691003181b0eec197893.jpeg" + }, + { + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + } + ] + }, + { + "fileId": "2980", + "contributors": [ + { + "id": 15258752, + "username": "joserrbv", + "totalCosts": 149.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15258752/medium/ec21ac21287dcdbd73ab57b6fb0dc50e_default.png" + }, + { + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" + }, + { + "id": 13855929, + "username": "gabriel.silva", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13855929/medium/51d997bd43d246da34052b5cab702f56.jpg" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + } + ] + }, + { + "fileId": "6245", + "contributors": [ + { + "id": 15165600, + "username": "Horberlan", + "totalCosts": 579.74, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" + }, + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 148.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "6263", + "contributors": [ + { + "id": 15171274, + "username": "matheuspoleza", + "totalCosts": 738.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171274/medium/116eb81288db5943f5421648cd28c040.png" + }, + { + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 34.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] }, { - "fileId": "7525", + "fileId": "6432", "contributors": [ { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 590.85, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" - }, - { - "id": 14247352, - "username": "borja_reverter", - "totalCosts": 153.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14247352/medium/88273f0b60397d738624b328fe45c13e.png" + "id": 15422032, + "username": "Fritzhoy", + "totalCosts": 4072.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 78.78, + "totalCosts": 231.29, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15740363, - "username": "Claudiojmoreira", - "totalCosts": 36.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15740363/medium/b998f6d1784d3b5ec2cd69dac9ca5e8c.jpeg" - } - ] - }, - { - "fileId": "8027", - "contributors": [ + "id": 15711897, + "username": "deymison", + "totalCosts": 99.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15711897/medium/1ef720cca42e3af55c16939ac1143b9c_default.png" + }, { - "id": 15515516, - "username": "MCreimer", - "totalCosts": 1070.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + "id": 15724803, + "username": "Izabel_chaves", + "totalCosts": 32.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15724803/medium/7f2b4419d308a52a62f3b8f9ca9b4adf.jpg" } ] }, { - "fileId": "8035", + "fileId": "6436", "contributors": [ { "id": 15515516, "username": "MCreimer", - "totalCosts": 1165.54, + "totalCosts": 2934.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" }, { - "id": 16099664, - "username": "yanvictorsn", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16099664/medium/0be252ecf72e8e4d5021a63cd4ad3353.png" - } - ] - }, - { - "fileId": "7713", - "contributors": [ + "id": 15960287, + "username": "fabiannycnd", + "totalCosts": 364.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" + }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 2207.86, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 15165600, + "username": "Horberlan", + "totalCosts": 167.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" }, { - "id": 15836847, - "username": "k77", - "totalCosts": 208.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15836847/medium/a83e58c4be6c8ef96bda97967d4703cd.png" + "id": 15703467, + "username": "rsrosabio", + "totalCosts": 166.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15703467/medium/d318a4131cc261c314fbda858991c360_default.png" }, { - "id": 15830251, - "username": "paodequeijocompingado", - "totalCosts": 12.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15830251/medium/df305c6124650d8f50add955b4770062_default.png" + "id": 15350616, + "username": "Carlos_Silva", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" } ] }, { - "fileId": "7717", + "fileId": "7308", "contributors": [ - { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 1244.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" - }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 501.97, + "totalCosts": 2602.77, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, + { + "id": 15503932, + "username": "patriciamatos85", + "totalCosts": 352.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15503932/medium/1f4d1dfc4e99b2dc05937dc75a1b9c90.jpeg" + }, { "id": 15849127, "username": "IagoEmanuel15", - "totalCosts": 61.61, + "totalCosts": 53.53, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15849127/medium/e9fee6b4f74f480ba50df5d15b8f9f22.jpg" } ] }, { - "fileId": "7721", + "fileId": "3144", "contributors": [ { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 493.89, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + "id": 15171274, + "username": "matheuspoleza", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15171274/medium/116eb81288db5943f5421648cd28c040.png" } ] }, { - "fileId": "7803", + "fileId": "6247", "contributors": [ { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 1087.77, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + "id": 15165600, + "username": "Horberlan", + "totalCosts": 134.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15165600/medium/5ba9d519f33745fa64879cff2511ace4.png" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 15.15, + "totalCosts": 72.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" } ] }, { - "fileId": "7725", + "fileId": "3138", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 962.53, + "totalCosts": 384.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14573604, - "username": "bceschini", - "totalCosts": 150.49, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" + "id": 15245586, + "username": "s3ttings", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15245586/medium/255e604fc64ada6f55a802ea9de2204a_default.png" + }, + { + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + }, + { + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" } ] }, { - "fileId": "7729", + "fileId": "3156", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 394.91, + "totalCosts": 209.07, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 14573604, - "username": "bceschini", - "totalCosts": 334.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14573604/medium/e07f0a64aea775f906b999491ca671d9.jpeg" + "id": 15000979, + "username": "mauri.lustosa", + "totalCosts": 10.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15000979/medium/d3463e880ee39ff00ec110108c7c1711.png" } ] }, { - "fileId": "7733", + "fileId": "7304", "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 1567.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 560.55, + "totalCosts": 294.92, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15902117, - "username": "cassio.gusson", - "totalCosts": 221.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15902117/medium/07ad2db947468fb4ed35ed2b9e51f8d2.png" + "id": 15651827, + "username": "Jerdson", + "totalCosts": 189.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15651827/medium/39b72be0409a6ec42eb98042f2151986.png" } ] }, { - "fileId": "7737", + "fileId": "2998", "contributors": [ { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 850.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + "id": 14903162, + "username": "MatheusItagiba", + "totalCosts": 993.84, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14903162/medium/6214f00c88eff4c33a4a7b1b6d429926_default.png" + }, + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" } ] }, { - "fileId": "7741", + "fileId": "3148", "contributors": [ { "id": 13986387, "username": "rafarocha", - "totalCosts": 1289.77, + "totalCosts": 28.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15422032, - "username": "Fritzhoy", - "totalCosts": 508.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15422032/medium/a2df65c9d9309dec39402a0175f3a57f.png" + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" + }, + { + "id": 14633592, + "username": "Jhosephecacau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14633592/medium/48fcc09a9eaa9888c49977a97140109d_default.png" } ] }, { - "fileId": "7745", + "fileId": "6265", + "contributors": [ + { + "id": 15114963, + "username": "tiagoyonamine.eth", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15114963/medium/b9c830466fee03c6d68be46beacfdd16_default.png" + } + ] + }, + { + "fileId": "3036", "contributors": [ + { + "id": 15317682, + "username": "junowoz", + "totalCosts": 133.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15317682/medium/81940bf015f6f858cb88c0363d135cfa.jpeg" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 34.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" + }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 1883.65, + "totalCosts": 21.21, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" }, { - "id": 15902493, - "username": "victorsalles", - "totalCosts": 137.36, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15902493/medium/d8ecbd67e54b44d12e95650bd9371463_default.png" + "id": 15515516, + "username": "MCreimer", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" + }, + { + "id": 15814229, + "username": "andrebz", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15814229/medium/d83277686444f13c2426fd05f4529437.jpeg" + }, + { + "id": 15121067, + "username": "DiegoCabral", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15121067/medium/7622a32578aec0440b8e01743f23435f.png" } ] }, { - "fileId": "7749", + "fileId": "3010", "contributors": [ { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 517.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 342.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { - "id": 15837087, - "username": "gabekoin", - "totalCosts": 52.52, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15837087/medium/198e2d3ce88fd597d2f6a39fcc40964a.png" + "id": 15992039, + "username": "isgoingtozero", + "totalCosts": 62.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" + } + ] + }, + { + "fileId": "3092", + "contributors": [ + { + "id": 14693050, + "username": "Luuck4s", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14693050/medium/4c771a227b48f3be61dedc652acbefe1.jpeg" }, { "id": 13986387, "username": "rafarocha", - "totalCosts": 17.17, + "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + }, + { + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "7753", + "fileId": "3024", "contributors": [ { - "id": 15350616, - "username": "Carlos_Silva", - "totalCosts": 1256.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350616/medium/d1c4c996fc6985d2df9db6d157e17356.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" } ] }, { - "fileId": "7919", + "fileId": "3070", "contributors": [ { - "id": 15932353, - "username": "nickksoares", - "totalCosts": 749.42, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15932353/medium/a722341af1e695a8a496f57be3f72a32.png" + "id": 14382632, + "username": "gabe_san_", + "totalCosts": 130.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14382632/medium/bf7bc9d504ecf501809f65a7bc8c870b_default.png" }, { - "id": 13986387, - "username": "rafarocha", - "totalCosts": 511.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + "id": 14676296, + "username": "RenataBrito", + "totalCosts": 87.87, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14676296/medium/55c59b8d0a0a3366ed1c96d361c661a6_default.png" }, { - "id": 15376854, - "username": "RenanDeveloper", - "totalCosts": 107.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15376854/medium/960a793d255cc1e610c7ccd5667ed9d9_default.png" + "id": 14821880, + "username": "jonathanandrade10", + "totalCosts": 65.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14821880/medium/59c6c840e75ec03af8b88b5005744137.jpeg" }, { - "id": 15929325, - "username": "jsantann", - "totalCosts": 19.19, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15929325/medium/dfe876696a9c986f4bc248f2aab9c5ed_default.png" + "id": 14875990, + "username": "guilhermevendramini", + "totalCosts": 50.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14875990/medium/6c42a855600f60124d4fbb49962d2226.jpeg" }, { "id": 15992039, "username": "isgoingtozero", - "totalCosts": 6.06, + "totalCosts": 22.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15992039/medium/c2972e6f45c34e1982fa7a4e7627c85e.jpg" }, { - "id": 15912891, - "username": "Cristianoluizz", + "id": 14982023, + "username": "jdgomes", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14982023/medium/5a7cb2f4e765675058a56ef1b52a69dc_default.png" + }, + { + "id": 15960287, + "username": "fabiannycnd", "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15912891/medium/d8e9c294bdfe19b843d80b68714c6a6d.png" + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15960287/medium/82ae690984766dd6f391b26757bfedab_default.png" + } + ] + }, + { + "fileId": "3110", + "contributors": [ + { + "id": 13986387, + "username": "rafarocha", + "totalCosts": 914.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13986387/medium/72bb87143f2a8d013cddac84c4e2afac.jpg" + } + ] + }, + { + "fileId": "8003", + "contributors": [ + { + "id": 15515516, + "username": "MCreimer", + "totalCosts": 3459.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515516/medium/cad56d6fa7c03af94b18ead23e791019.png" } ] } @@ -58069,6 +59296,12 @@ { "fileId": "5565", "contributors": [ + { + "id": 16230594, + "username": "LIulyEmpty", + "totalCosts": 230.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16230594/medium/cd7250313adac6c32fcac7ef601c0343.jpg" + }, { "id": 15967193, "username": "minhkek", @@ -58186,6 +59419,12 @@ "totalCosts": 38.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13935595/medium/1906e23b6a9407fdde92b4e0b6f5acf5_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 35.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 16201976, "username": "Tjmin", @@ -58332,6 +59571,12 @@ "username": "yuping", "totalCosts": 10.1, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -59467,6 +60712,12 @@ "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15381970, "username": "tzbkk", @@ -59714,6 +60965,12 @@ "totalCosts": 745.38, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15657887/medium/9212535a0a5fb7ec22a9f8a8329dac3b.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 94.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15871701, "username": "maxwellcotto", @@ -59814,6 +61071,12 @@ "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14771456/medium/bc3f51e759b958dabc1b61845df639e4_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14708696, "username": "wmswms938", @@ -60311,6 +61574,12 @@ "username": "nzinmymind", "totalCosts": 85.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15680993/medium/c48e18c9909ca14dd2c4796c916a6007.jpeg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -60358,6 +61627,12 @@ "totalCosts": 490.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15350892/medium/12f685a4bf7fab1e51d80ba3b7b0e55d_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 267.65, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15425018, "username": "TTa77", @@ -61251,6 +62526,12 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15357618/medium/12f023106f6a24e98bfc6553c07a46f4.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 16072688, "username": "lz895779981", @@ -61441,6 +62722,12 @@ "totalCosts": 20.2, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15535025/medium/03f9f00ea9a0897fc885fe9cc74a8536.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14829178, "username": "EffectChen", @@ -61494,6 +62781,12 @@ "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16072062/medium/f98dda376a3f55bce2703d631f5be0f6_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15911295, "username": "Xin_Cheng", @@ -61795,6 +63088,12 @@ "totalCosts": 32.32, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15558917, "username": "imalittlemole", @@ -61877,6 +63176,12 @@ "totalCosts": 114.13, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14712154, "username": "fivenicerice", @@ -62009,7 +63314,7 @@ { "id": 15073799, "username": "GoForceX", - "totalCosts": 29.29, + "totalCosts": 40.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" }, { @@ -62286,6 +63591,12 @@ "username": "wl10909", "totalCosts": 8.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14678674/medium/d424c03f1cd6ad02ffb8017194999917_default.png" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -62833,6 +64144,12 @@ "totalCosts": 19.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15156816, "username": "Fengfeng0157", @@ -62951,17 +64268,17 @@ "totalCosts": 44.44, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15911295/medium/8aae130b64f46cd1ea960d085950a560_default.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 42.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15224386, "username": "telebee", "totalCosts": 24.24, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15224386/medium/52b2ec0ff1b2d2f6893458a3a632a2eb_default.png" - }, - { - "id": 15073799, - "username": "GoForceX", - "totalCosts": 6.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -64285,6 +65602,12 @@ "totalCosts": 48.48, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14553216/medium/ff7357a18e524ec40facc964cb2d15bc.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15314206, "username": "cuijia", @@ -64588,12 +65911,24 @@ "username": "yuping", "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193608/medium/c3b5342b0fef9f5f51eff5b0c2b93c70.jpg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, { "fileId": "3024", "contributors": [ + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 14957901, "username": "LiwenGou", @@ -64634,6 +65969,12 @@ "username": "hypebeans", "totalCosts": 54.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14708760/medium/c99d5e08a676eaebe6f2a383a81222e1.jpg" + }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" } ] }, @@ -66222,6 +67563,12 @@ "totalCosts": 22.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15284354/medium/e4f19dd54c37569ecf884aeeb57776aa.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15314206, "username": "cuijia", @@ -66321,6 +67668,12 @@ "totalCosts": 318.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15623859/medium/1b48569cd42fdf8a9e5af38841b58d4f.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15773245, "username": "Tykoo", @@ -66642,6 +67995,12 @@ "totalCosts": 49.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15816363/medium/a2ca44a459e8ce152ba8dfce117cb8fa.jpeg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15156816, "username": "Fengfeng0157", @@ -66950,6 +68309,12 @@ "totalCosts": 66.66, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15906651/medium/7fbb552cabdbfcd79477e56fc90a2670.png" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15904893, "username": "Yuki139", @@ -67236,6 +68601,12 @@ "totalCosts": 6.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965647/medium/96faf61b3b59c29adf03dca21e03582c.jpg" }, + { + "id": 15073799, + "username": "GoForceX", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" + }, { "id": 15438492, "username": "XiaoLi-sach", diff --git a/src/data/crowdin/translation-buckets-dirs.json b/src/data/crowdin/translation-buckets-dirs.json index d8a003ebaa7..047969f7919 100644 --- a/src/data/crowdin/translation-buckets-dirs.json +++ b/src/data/crowdin/translation-buckets-dirs.json @@ -110,5 +110,9 @@ { "id": 7833, "name": "28) Developer Tutorials IV" + }, + { + "id": 8218, + "name": "Menu redesign & language picker" } ] \ No newline at end of file From d7b66b3ed59de8e126f5c5b544c38b4a81db98ec Mon Sep 17 00:00:00 2001 From: Nico Date: Sun, 18 Feb 2024 16:05:26 -0300 Subject: [PATCH 354/478] docs: adds more community QA process details --- docs/deploy-process.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/deploy-process.md b/docs/deploy-process.md index b470c12a867..bf11ef24675 100644 --- a/docs/deploy-process.md +++ b/docs/deploy-process.md @@ -94,3 +94,9 @@ staging O - - - - - - - O dev O - - O - - - - O ``` + +## More about the Release Candidate QA process + +The main idea behind the community QA process is to focus on the [current release changelog](https://github.com/ethereum/ethereum-org-website/releases) and check that new features or fixes applied are working as expected. During QA sessions, some notes could also be shared if we're looking for specific things to be tested. + +If you find any bug, please report it on the [#website-bugs](https://discord.com/channels/714888181740339261/727898649006309377) Discord channel. From 2432c3b0b5d9c24eb35f618399d1239884b419c8 Mon Sep 17 00:00:00 2001 From: Gabriel Temtsen Date: Fri, 16 Feb 2024 07:12:08 +0100 Subject: [PATCH 355/478] added disclaimer to stablecoin page --- src/components/StablecoinBoxGrid.tsx | 40 +++++++++++++++++++++++++--- src/intl/en/page-stablecoins.json | 1 + src/pages/stablecoins.tsx | 1 + 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/components/StablecoinBoxGrid.tsx b/src/components/StablecoinBoxGrid.tsx index 463e2b09610..dd1493c2471 100644 --- a/src/components/StablecoinBoxGrid.tsx +++ b/src/components/StablecoinBoxGrid.tsx @@ -1,7 +1,9 @@ import { useState } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" -import { Box, Flex, useColorModeValue } from "@chakra-ui/react" +import { FaExclamation } from "react-icons/fa6" +import { HiOutlineSpeakerphone } from "react-icons/hi"; +import { Box, Flex, HStack,Icon,Text,useColorModeValue } from "@chakra-ui/react" import { ChildOnlyProp } from "@/lib/types" @@ -39,6 +41,7 @@ interface ILink { type GridItemProps = { description: string + disclaimer: string columnNumber: number rowNumber: number emoji: string @@ -65,6 +68,23 @@ const OpenTitle = ({ title }: { title: string }) => { ) } +const Disclaimer = ({ disclaimer }: { disclaimer: string }) => { + + return ( + + + + {/* */} + + {disclaimer} + + + + + ) + +} + const Title = ({ title }: { title: string }) => { return ( {isOpen ? ( - + <> + + + {title === t("page-stablecoins-algorithmic") && ( + + + + )} + + + + ) : ( <> @@ -196,7 +227,8 @@ const GridItem = ({
      {isOpen && (
      - + + {description} {pros && ( @@ -255,6 +287,7 @@ const GridItem = ({ export interface IPropsBoxItem { description: string + disclaimer?: string emoji: string title: string pros?: Array @@ -299,6 +332,7 @@ const StablecoinBoxGrid = ({ items }: StablecoinBoxGridProps) => { title={item.title} emoji={item.emoji} description={item.description} + disclaimer={item.disclaimer || ''} pros={item.pros} cons={item.cons} links={item.links} diff --git a/src/intl/en/page-stablecoins.json b/src/intl/en/page-stablecoins.json index 25e0e0d36a6..c9342a57a2a 100644 --- a/src/intl/en/page-stablecoins.json +++ b/src/intl/en/page-stablecoins.json @@ -56,6 +56,7 @@ "page-stablecoins-algorithmic-con-1": "You need to trust (or be able to read) the algorithm.", "page-stablecoins-algorithmic-con-2": "Your balance of coins will change based on total supply.", "page-stablecoins-algorithmic-description": "These stablecoins aren't backed by any other asset. Instead an algorithm will sell tokens if the price falls below the desired value and supply tokens if the value goes beyond the desired amount. Because the number of these tokens in circulation changes regularly, the number of tokens you own will change, but will always reflect your share.", + "page-stablecoins-algorithmic-disclaimer": "Algorithmic stablecoins are experimental technology. You should be aware of the risks before using them.", "page-stablecoins-algorithmic-pro-1": "No collateral needed.", "page-stablecoins-algorithmic-pro-2": "Controlled by a public algorithm.", "page-stablecoins-bank-apy": "0.05%", diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 19b33fd371f..0ee2ae11126 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -291,6 +291,7 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { { title: t("page-stablecoins-algorithmic"), description: t("page-stablecoins-algorithmic-description"), + disclaimer: t("page-stablecoins-algorithmic-disclaimer"), emoji: ":chart_with_downwards_trend:", pros: [ t("page-stablecoins-algorithmic-pro-1"), From c7a579c434f7af178f0d7e21e1c1dcfd812f822a Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Mon, 19 Feb 2024 12:29:49 +0100 Subject: [PATCH 356/478] Fix discord links --- public/content/developers/docs/apis/backend/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/developers/docs/apis/backend/index.md b/public/content/developers/docs/apis/backend/index.md index 6ddc486bf72..77081abe148 100644 --- a/public/content/developers/docs/apis/backend/index.md +++ b/public/content/developers/docs/apis/backend/index.md @@ -25,7 +25,7 @@ These libraries abstract away much of the complexity of interacting directly wit - [alchemy.com](https://www.alchemy.com/) - [Documentation](https://docs.alchemyapi.io/) - [GitHub](https://github.com/alchemyplatform) -- [Discord](https://discord.com/invite/A39JVCM) +- [Discord](https://discord.com/invite/alchemyplatform) **BlockCypher -** **_Ethereum Web APIs._** @@ -36,7 +36,7 @@ These libraries abstract away much of the complexity of interacting directly wit - [blastapi.io](https://blastapi.io/) - [Documentation](https://docs.blastapi.io) -- [Discord](https://discord.com/invite/VPkWESgtvV) +- [Discord](https://discord.gg/bwarelabs) **Infura -** **_The Ethereum API as a service._** @@ -84,7 +84,7 @@ These libraries abstract away much of the complexity of interacting directly wit - [quicknode.com](https://quicknode.com) - [Documentation](https://www.quicknode.com/docs) -- [Discord](https://discord.gg/NaR7TtpvJq) +- [Discord](https://discord.gg/quicknode) **Python Tooling -** **_Variety of libraries for Ethereum interaction via Python._** @@ -140,7 +140,7 @@ These libraries abstract away much of the complexity of interacting directly wit - [moralis.io](http://moralis.io) - [Documentation](https://docs.moralis.io/) - [GitHub](https://github.com/MoralisWeb3) -- [Discord](https://discord.com/invite/KYswaxwEtg) +- [Discord](https://moralis.io/joindiscord/) - [Forum](https://forum.moralis.io/) **Chainbase -** **_All-in-one web3 data infrastructure for Ethereum._** From f3c2d389d63d2226418764e77e0b014e1def59f9 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Mon, 19 Feb 2024 12:33:09 +0100 Subject: [PATCH 357/478] Fix discord link --- public/content/developers/docs/frameworks/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/developers/docs/frameworks/index.md b/public/content/developers/docs/frameworks/index.md index bd83e0e135b..6da91038516 100644 --- a/public/content/developers/docs/frameworks/index.md +++ b/public/content/developers/docs/frameworks/index.md @@ -76,7 +76,7 @@ Before diving into frameworks, we recommend you first read through our introduct - [alchemy.com](https://www.alchemy.com/) - [GitHub](https://github.com/alchemyplatform) -- [Discord](https://discord.com/invite/A39JVCM) +- [Discord](https://discord.com/invite/alchemyplatform) **NodeReal -** **_Ethereum Development Platform._** From daa13adf3735c0a0e3ed75044511559e72c8abff Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 19 Feb 2024 09:35:59 -0800 Subject: [PATCH 358/478] chore: apply suggestions from code review --- src/components/Nav/Menu/index.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/Nav/Menu/index.tsx b/src/components/Nav/Menu/index.tsx index 446897c7398..9523bae94ec 100644 --- a/src/components/Nav/Menu/index.tsx +++ b/src/components/Nav/Menu/index.tsx @@ -1,5 +1,5 @@ -import { AnimatePresence, motion } from "framer-motion" -import { Box, type BoxProps, Flex, Text } from "@chakra-ui/react" +import { motion } from "framer-motion" +import { Box, type BoxProps, Text, UnorderedList } from "@chakra-ui/react" import * as NavigationMenu from "@radix-ui/react-navigation-menu" import { Button } from "@/components/Buttons" @@ -31,11 +31,10 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { - + {SECTION_LABELS.map((sectionKey) => { const { label, items } = sections[sectionKey] const isActive = activeSection === sectionKey @@ -95,7 +94,7 @@ const Menu = ({ sections, ...props }: NavMenuProps) => { ) })} - + From 0194755a93282a829b9b980c0fc1a4b4df764762 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:19:30 -0800 Subject: [PATCH 359/478] intl: update menu string with acronym first --- src/intl/am/common.json | 10 +++++----- src/intl/ar/common.json | 10 +++++----- src/intl/az/common.json | 10 +++++----- src/intl/be/common.json | 10 +++++----- src/intl/bg/common.json | 10 +++++----- src/intl/bn/common.json | 10 +++++----- src/intl/bs/common.json | 10 +++++----- src/intl/ca/common.json | 10 +++++----- src/intl/cs/common.json | 8 ++++---- src/intl/da/common.json | 10 +++++----- src/intl/de/common.json | 10 +++++----- src/intl/el/common.json | 10 +++++----- src/intl/en/common.json | 4 ++-- src/intl/es/common.json | 10 +++++----- src/intl/fa/common.json | 10 +++++----- src/intl/fi/common.json | 6 +++--- src/intl/fil/common.json | 10 +++++----- src/intl/fr/common.json | 10 +++++----- src/intl/gl/common.json | 6 +++--- src/intl/gu/common.json | 8 ++++---- src/intl/he/common.json | 8 ++++---- src/intl/hi/common.json | 10 +++++----- src/intl/hr/common.json | 10 +++++----- src/intl/hu/common.json | 10 +++++----- src/intl/hy-am/common.json | 10 +++++----- src/intl/id/common.json | 10 +++++----- src/intl/ig/common.json | 10 +++++----- src/intl/it/common.json | 10 +++++----- src/intl/ka/common.json | 10 +++++----- src/intl/kk/common.json | 6 +++--- src/intl/km/common.json | 10 +++++----- src/intl/kn/common.json | 10 +++++----- src/intl/lt/common.json | 6 +++--- src/intl/ml/common.json | 6 +++--- src/intl/mr/common.json | 10 +++++----- src/intl/ms/common.json | 10 +++++----- src/intl/nb/common.json | 8 ++++---- src/intl/ne-np/common.json | 10 +++++----- src/intl/nl/common.json | 10 +++++----- src/intl/pcm/common.json | 10 +++++----- src/intl/pl/common.json | 10 +++++----- src/intl/pt-br/common.json | 10 +++++----- src/intl/pt/common.json | 10 +++++----- src/intl/ro/common.json | 10 +++++----- src/intl/ru/common.json | 10 +++++----- src/intl/se/common.json | 8 ++++---- src/intl/sk/common.json | 10 +++++----- src/intl/sl/common.json | 10 +++++----- src/intl/sr/common.json | 10 +++++----- src/intl/sw/common.json | 10 +++++----- src/intl/ta/common.json | 10 +++++----- src/intl/th/common.json | 10 +++++----- src/intl/tk/common.json | 10 +++++----- src/intl/tr/common.json | 10 +++++----- src/intl/uk/common.json | 10 +++++----- src/intl/ur/common.json | 8 ++++---- src/intl/uz/common.json | 8 ++++---- src/intl/vi/common.json | 10 +++++----- src/intl/zh-tw/common.json | 10 +++++----- src/intl/zh/common.json | 8 ++++---- 60 files changed, 279 insertions(+), 279 deletions(-) diff --git a/src/intl/am/common.json b/src/intl/am/common.json index 20178488c16..7fb5200678b 100644 --- a/src/intl/am/common.json +++ b/src/intl/am/common.json @@ -20,14 +20,14 @@ "copied": "ተገልብጧል", "copy": "መገልበጥ", "danksharding": "ዳንክሻርዲንግ", - "dao-page": "ያልተማከሉ ራስ ገዝ ድርጅቶች (DAOs)", + "dao-page": "DAOs - ያልተማከሉ ራስ ገዝ ድርጅቶች", "dark-mode": "ጨለማ", "data-provided-by": "የዳታ ምንጭ:", "decentralized-applications-dapps": "ያልተማከሉ መተግበሪያዎች (dapps)", "decentralized-identity": "ያልተማከለ ማንነት", "decentralized-social-networks": "ያልተማከሉ ማህበራዊ አውታረ-መረቦች፡፡", - "decentralized-science": "ያልተማከለ ሳይንስ (DeSci)", - "defi-page": "ያልተማከለ ፋይናንስ (DeFi)", + "decentralized-science": "DeSci - ያልተማከለ ሳይንስ", + "defi-page": "DeFi - ያልተማከለ ፋይናንስ", "devcon": "የገንቢዎች ጉባኤ (Devcon)", "developers": "ገንቢዎች", "developers-home": "የገንቢዎች መነሻ-ገፅ", @@ -132,7 +132,7 @@ "nav-developers": "ገንቢዎች", "nav-developers-docs": "የገንቢዎች ሰነዶች", "nav-primary": "ዋነኛ", - "nft-page": "የማይተኩ ቶከኖች (NFTs)", + "nft-page": "NFTs - የማይተኩ ቶከኖች", "nfts": "NFTዎች", "no": "አይደለም", "on-this-page": "በዚህ ገፅ ላይ", @@ -151,7 +151,7 @@ "return-home": "ወደ መነሻ-ገፅ ይመለሱ", "roadmap": "የኢቲሪየም ፍኖተ ካርታ", "resources": "የትርጉም ምንጮች", - "regenerative-finance": "መልሶ ማልሚያ ፋይናንስ (ReFi)", + "regenerative-finance": "ReFi - መልሶ ማልሚያ ፋይናንስ", "run-a-node": "ኖድ ማንቀሳቀስ ይጀምሩ", "rollup-component-website": "Website", "rollup-component-developer-docs": "የገንቢዎች ሰነዶች", diff --git a/src/intl/ar/common.json b/src/intl/ar/common.json index 1e0aea21d31..a63c5fba9da 100644 --- a/src/intl/ar/common.json +++ b/src/intl/ar/common.json @@ -20,14 +20,14 @@ "copied": "تم النسخ", "copy": "نسخ", "danksharding": "Danksharding", - "dao-page": "المنظمات المستقلة اللامركزية (DAO)", + "dao-page": "DAO - المنظمات المستقلة اللامركزية", "dark-mode": "داكن", "data-provided-by": "مصدر البيانات:", "decentralized-applications-dapps": "التطبيقات اللامركزية (dapps)", "decentralized-identity": "الهوية اللامركزية", "decentralized-social-networks": "الشبكات الاجتماعية اللامركزية", - "decentralized-science": "لا مركزية العلوم (DeSci)", - "defi-page": "التمويل اللامركزي (DeFi)", + "decentralized-science": "DeSci - لا مركزية العلوم", + "defi-page": "DeFi - التمويل اللامركزي", "devcon": "ديفكون", "developers": "المبرمجون", "developers-home": "الصفحة الرئيسية للمبرمجين", @@ -132,7 +132,7 @@ "nav-developers": "المبرمجون", "nav-developers-docs": "وثائق المبرمجين", "nav-primary": "رئيسي", - "nft-page": "رموز رقمية غير قابلة للاستبدال (NFT)", + "nft-page": "NFT - رموز رقمية غير قابلة للاستبدال", "nfts": "الرموز المميزة غير القابلة للاستبدال", "no": "لا", "on-this-page": "في هذه الصفحة", @@ -151,7 +151,7 @@ "return-home": "العودة إلى الرئيسية", "roadmap": "خارطة طريق إثيريوم", "resources": "مصادر الترجمة", - "regenerative-finance": "التمويل المتجدد (ري فاي)", + "regenerative-finance": "ري فاي - التمويل المتجدد", "run-a-node": "تشغيل عقدة", "rollup-component-website": "الموقع الإلكتروني", "rollup-component-developer-docs": "وثائق المبرمج", diff --git a/src/intl/az/common.json b/src/intl/az/common.json index 7902cf319e3..ec2d289855d 100644 --- a/src/intl/az/common.json +++ b/src/intl/az/common.json @@ -31,14 +31,14 @@ "copied": "Kopyalandı", "copy": "Kopyala", "danksharding": "Dankşardinq", - "dao-page": "Mərkəzləşdirilməmiş muxtar təşkilatlar (DAO)", + "dao-page": "DAO - Mərkəzləşdirilməmiş muxtar təşkilatlar", "dark-mode": "Tünd", "data-provided-by": "Məlumat mənbəyi:", "decentralized-applications-dapps": "Mərkəzləşdirilməmiş tətbiqlər (dapps)", "decentralized-identity": "Mərkəzləşdirilməmiş şəxsiyyət", "decentralized-social-networks": "Mərkəzləşdirilməmiş sosial şəbəkələr", - "decentralized-science": "Mərkəzləşdirilməmiş elm (DeSci)", - "defi-page": "Mərkəzləşdirilməmiş maliyyə (DeFi)", + "decentralized-science": "DeSci - Mərkəzləşdirilməmiş elm", + "defi-page": "DeFi - Mərkəzləşdirilməmiş maliyyə", "design": "Dizayn", "design-principles": "Dizayn Prinsipləri", "devcon": "İllik konfrans (Devcon)", @@ -146,7 +146,7 @@ "nav-developers": "Tərtibatçılar", "nav-developers-docs": "Tərtibatçı sənədləri", "nav-primary": "Əsas", - "nft-page": "Bir-birini əvəz edə bilməyən nişanlar (NFTs)", + "nft-page": "NFTs - Bir-birini əvəz edə bilməyən nişanlar", "nfts": "NFT-lər", "no": "Xeyr", "on-this-page": "Bu səhifədə", @@ -165,7 +165,7 @@ "return-home": "əsas səhifəyə qayıdın", "roadmap": "Ethereum planlama xəritəsi", "resources": "Tərcümə resursları", - "regenerative-finance": "Regenerativ maliyyə (ReFi)", + "regenerative-finance": "ReFi - Regenerativ maliyyə", "run-a-node": "Düyün başladın", "rollup-component-website": "Veb-sayt", "rollup-component-developer-docs": "Tərtibatçı sənədləri", diff --git a/src/intl/be/common.json b/src/intl/be/common.json index b14782dd9ce..98f7c53c14f 100644 --- a/src/intl/be/common.json +++ b/src/intl/be/common.json @@ -20,14 +20,14 @@ "copied": "Скапіявана", "copy": "Капіраваць", "danksharding": "Danksharding", - "dao-page": "Дэцэнтралізаваныя аўтаномныя арганізацыі (DAO)", + "dao-page": "DAO - Дэцэнтралізаваныя аўтаномныя арганізацыі", "dark-mode": "Цёмны", "data-provided-by": "Крыніца дадзеных:", "decentralized-applications-dapps": "Дэцэнтралізаваныя дадаткі (dapps)", "decentralized-identity": "Дэцэнтралізаваная ідэнтычнасць", "decentralized-social-networks": "Дэцэнтралізаваная сацыяльная сетка", - "decentralized-science": "Дэцэнтралізаваная навука (DeSci)", - "defi-page": "Дэцэнтралізаваныя фінансы (DeFi)", + "decentralized-science": "DeSci - Дэцэнтралізаваная навука", + "defi-page": "DeFi - Дэцэнтралізаваныя фінансы", "devcon": "Devcon", "developers": "Распрацоўшчыкі", "developers-home": "Галоўная старонка для распрацоўшчыкаў", @@ -132,7 +132,7 @@ "nav-developers": "Разпрацоўшчыкі", "nav-developers-docs": "Дакументацыя для распрацоўшчыкаў", "nav-primary": "Головна", - "nft-page": "Неўзаемназаменныя токены (NFT)", + "nft-page": "NFT - Неўзаемназаменныя токены", "nfts": "NFT", "no": "Не", "on-this-page": "На гэтай старонцы", @@ -151,7 +151,7 @@ "return-home": "вярнуцца на галоўную старонку", "roadmap": "План развіцця Ethereum", "resources": "Рэсурсы для перакладу", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Дакументацыя для распрацоўшчыкаў", diff --git a/src/intl/bg/common.json b/src/intl/bg/common.json index ffdea3aa7e7..a9765a83cdd 100644 --- a/src/intl/bg/common.json +++ b/src/intl/bg/common.json @@ -20,14 +20,14 @@ "copied": "Копирано", "copy": "Копиране", "danksharding": "Danksharding", - "dao-page": "Децентрализирани автономни организации (DAOs)", + "dao-page": "DAOs - Децентрализирани автономни организации", "dark-mode": "Тъмно", "data-provided-by": "Източник на данни:", "decentralized-applications-dapps": "Децентрализирани приложения (dapps)", "decentralized-identity": "Децентрализирана самоличност", "decentralized-social-networks": "Децентрализирани социални мрежи", - "decentralized-science": "Децентрализирана наука (DeSci)", - "defi-page": "Децентрализирани финанси (DeFi)", + "decentralized-science": "DeSci - Децентрализирана наука", + "defi-page": "DeFi - Децентрализирани финанси", "devcon": "Девкон/Devcon", "developers": "Разработчици", "developers-home": "Начална страница на разработчиците", @@ -132,7 +132,7 @@ "nav-developers": "Разработчици", "nav-developers-docs": "Документация за разработчици", "nav-primary": "Основен", - "nft-page": "Незаменяеми токени (NFTs)", + "nft-page": "NFTs - Незаменяеми токени", "nfts": "NFT", "no": "Не", "on-this-page": "На тази страница", @@ -151,7 +151,7 @@ "return-home": "към началната страница", "roadmap": "Пътна карта на Етереум", "resources": "Източници за превод", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Активиране на възел", "rollup-component-website": "Уебсайт", "rollup-component-developer-docs": "Документация на разработчика", diff --git a/src/intl/bn/common.json b/src/intl/bn/common.json index 48e34144da8..ab45f020d62 100644 --- a/src/intl/bn/common.json +++ b/src/intl/bn/common.json @@ -20,14 +20,14 @@ "copied": "কপি করা হয়েছে", "copy": "কপি করুন", "danksharding": "ড্যাঙ্কশার্ডিং", - "dao-page": "বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা (DAOs)", + "dao-page": "DAOs - বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা", "dark-mode": "ডার্ক", "data-provided-by": "ডেটার উৎস:", "decentralized-applications-dapps": "বিকেন্দ্রীভূত অ্যাপ্লিকেশন (dapps)", "decentralized-identity": "বিকেন্দ্রীভূত পরিচয়", "decentralized-social-networks": "বিকেন্দ্রীভূত সামাজিক নেটওয়ার্ক", - "decentralized-science": "ডিসেন্ট্রালাইজড সায়েন্স (DeSci)", - "defi-page": "বিকেন্দ্রীভূত অর্থ (DeFi) ", + "decentralized-science": "DeSci - ডিসেন্ট্রালাইজড সায়েন্স", + "defi-page": "DeFi - বিকেন্দ্রীভূত অর্থ ", "devcon": "Devcon", "developers": "ডেভেলপারগণ", "developers-home": "ডেভেলপার-এর হোম পেজ", @@ -132,7 +132,7 @@ "nav-developers": "ডেভেলপারগণ", "nav-developers-docs": "ডেভেলপার ডকুমেন্ট", "nav-primary": "প্রাইমারি", - "nft-page": "নন-ফাঞ্জিবল টোকেন (NFT)", + "nft-page": "NFT - নন-ফাঞ্জিবল টোকেন", "nfts": "NFT", "no": "না", "on-this-page": "এই পৃষ্ঠাতে যা যা আছে", @@ -151,7 +151,7 @@ "return-home": "হোম এ ফেরত যান", "roadmap": "ইথেরিয়াম রোডম্যাপ", "resources": "অনুবাদ সংক্রান্ত রিসোর্সগুলো", - "regenerative-finance": "রিজেনারেটিভ ফাইনান্স (ReFi)", + "regenerative-finance": "ReFi - রিজেনারেটিভ ফাইনান্স", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "ডেভেলপারের ডকুমেন্ট", diff --git a/src/intl/bs/common.json b/src/intl/bs/common.json index a787d68d0d8..de6ee8d5c85 100644 --- a/src/intl/bs/common.json +++ b/src/intl/bs/common.json @@ -20,14 +20,14 @@ "copied": "Kopirano", "copy": "Kopiraj", "danksharding": "Danksharding", - "dao-page": "Decentralizovane autonomne organizacije (DAO)", + "dao-page": "DAO - Decentralizovane autonomne organizacije", "dark-mode": "Tamno", "data-provided-by": "Izvor podataka:", "decentralized-applications-dapps": "Decentralizovane aplikacije (dapps)", "decentralized-identity": "Decentralizovan identitet", "decentralized-social-networks": "Decentralizovane društvene mreže", - "decentralized-science": "Decentralizovana nauka (DeSci)", - "defi-page": "Decentralizovane finansije (DeFi)", + "decentralized-science": "DeSci - Decentralizovana nauka", + "defi-page": "DeFi - Decentralizovane finansije", "devcon": "Devcon", "developers": "Programeri", "developers-home": "Početna stranica za programere", @@ -132,7 +132,7 @@ "nav-developers": "Programeri", "nav-developers-docs": "Dokumenti za programere", "nav-primary": "Primarni", - "nft-page": "Nezamenljivi tokeni (NFT)", + "nft-page": "NFT - Nezamenljivi tokeni", "nfts": "NFT", "no": "Ne", "on-this-page": "Na ovoj stranici", @@ -151,7 +151,7 @@ "return-home": "vrati se na početnu stranicu", "roadmap": "Plan razvoja Ethereum-a", "resources": "Pomoćna sredstva za prevođenje", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Dokumenti za programere", diff --git a/src/intl/ca/common.json b/src/intl/ca/common.json index 75496a9eeb8..68f6cf40b15 100644 --- a/src/intl/ca/common.json +++ b/src/intl/ca/common.json @@ -20,14 +20,14 @@ "copied": "Copiat", "copy": "Copiar", "danksharding": "Danksharding", - "dao-page": "Organitzacions autonomes decentralitzades (DAO)", + "dao-page": "DAO - Organitzacions autonomes decentralitzades", "dark-mode": "Fosc", "data-provided-by": "Font de la informació:", "decentralized-applications-dapps": "Aplicacions descentralitzades (dapps)", "decentralized-identity": "Identitat descentralitzada", "decentralized-social-networks": "Xarxes socials descentralitzades", - "decentralized-science": "Ciència descentralitzada (DeSci)", - "defi-page": "Finança decentralitzada (FiDe)", + "decentralized-science": "DeSci - Ciència descentralitzada", + "defi-page": "FiDe - Finança decentralitzada", "devcon": "Devcon", "developers": "Desenvolupadors", "developers-home": "Pàgina d'inici per a desenvolupadors", @@ -132,7 +132,7 @@ "nav-developers": "Desenvolupadors", "nav-developers-docs": "Documents per a desenvolupadors", "nav-primary": "Primari", - "nft-page": "Tokens no fungibles (NFT)", + "nft-page": "NFT - Tokens no fungibles", "nfts": "Els NFT", "no": "No", "on-this-page": "En aquesta pàgina", @@ -151,7 +151,7 @@ "return-home": "Retorna a l’inici", "roadmap": "Full de ruta d'Ethereum", "resources": "Recursos de traducció", - "regenerative-finance": "Finances regeneratives (ReFi)", + "regenerative-finance": "ReFi - Finances regeneratives", "run-a-node": "Executeu un node", "rollup-component-website": "Pàgina web", "rollup-component-developer-docs": "Documents per a desenvolupadors", diff --git a/src/intl/cs/common.json b/src/intl/cs/common.json index 05c7449a8d0..fc4646d38fa 100644 --- a/src/intl/cs/common.json +++ b/src/intl/cs/common.json @@ -31,14 +31,14 @@ "copied": "Zkopírováno", "copy": "Kopírovat", "danksharding": "Danksharding", - "dao-page": "Decentralizované autonomní organizace (DAO)", + "dao-page": "DAO - Decentralizované autonomní organizace", "dark-mode": "Tmavý", "data-provided-by": "Zdroj dat:", "decentralized-applications-dapps": "Decentralizované aplikace (dapps)", "decentralized-identity": "Decentralizovaná identita", "decentralized-social-networks": "Decentralizované sociální sítě", "decentralized-science": "„Decentralizovaná věda“", - "defi-page": "Decentralizované finance (DeFi)", + "defi-page": "DeFi - Decentralizované finance", "design": "Design", "design-principles": "Principy designu", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Vývojáři", "nav-developers-docs": "Dokumentace pro vývojáře", "nav-primary": "Hlavní", - "nft-page": "Nezaměnitelné tokeny (NFT)", + "nft-page": "NFT - Nezaměnitelné tokeny", "nfts": "NFT", "no": "Ne", "on-this-page": "Na této stránce", @@ -165,7 +165,7 @@ "return-home": "zpět na hlavní stránku", "roadmap": "Plán Etherea", "resources": "Zdroje překladu", - "regenerative-finance": "Regenerativní finance (ReFi)", + "regenerative-finance": "ReFi - Regenerativní finance", "run-a-node": "Spustit uzel", "rollup-component-website": "Web", "rollup-component-developer-docs": "Dokumentace pro vývojáře", diff --git a/src/intl/da/common.json b/src/intl/da/common.json index 0c571dbde49..973b7727585 100644 --- a/src/intl/da/common.json +++ b/src/intl/da/common.json @@ -20,14 +20,14 @@ "copied": "Kopieret", "copy": "Kopiér", "danksharding": "Danksharding", - "dao-page": "Decentraliserede autonome organisationer (DAO'er)", + "dao-page": "DAO'er - Decentraliserede autonome organisationer", "dark-mode": "Mørk", "data-provided-by": "Datakilde:", "decentralized-applications-dapps": "Decentraliserede applikationer (dapps)", "decentralized-identity": "Decentraliseret identitet", "decentralized-social-networks": "Decentraliserede sociale netværk", - "decentralized-science": "Decentraliseret videnskab (DeSci)", - "defi-page": "Decentraliserede finanser (DeFi)", + "decentralized-science": "DeSci - Decentraliseret videnskab", + "defi-page": "DeFi - Decentraliserede finanser", "devcon": "Devcon", "developers": "Udviklere", "developers-home": "Udviklerens startside", @@ -132,7 +132,7 @@ "nav-developers": "Udviklere", "nav-developers-docs": "Udviklerdokumenter", "nav-primary": "Primær", - "nft-page": "Ikke-ombyttelige tokens (NFT'er)", + "nft-page": "NFT'er - Ikke-ombyttelige tokens", "nfts": "NFT'er", "no": "Nej", "on-this-page": "På denne side", @@ -151,7 +151,7 @@ "return-home": "retur til startside", "roadmap": "Ethereum køreplan", "resources": "Oversættelsesressourcer", - "regenerative-finance": "Regenerativ finansiering (ReFi)", + "regenerative-finance": "ReFi - Regenerativ finansiering", "run-a-node": "Kør en node", "rollup-component-website": "Websted", "rollup-component-developer-docs": "Udviklerdokumenter", diff --git a/src/intl/de/common.json b/src/intl/de/common.json index 7795febe962..13c2ab899c7 100644 --- a/src/intl/de/common.json +++ b/src/intl/de/common.json @@ -31,14 +31,14 @@ "copied": "Kopiert", "copy": "Kopieren", "danksharding": "Danksharding", - "dao-page": "Dezentrale autonome Organisationen (DAOs)", + "dao-page": "DAOs - Dezentrale autonome Organisationen", "dark-mode": "Dunkel", "data-provided-by": "Datenquelle:", "decentralized-applications-dapps": "Dezentralisierte Anwendungen (dApps)", "decentralized-identity": "Dezentralisierte Identität", "decentralized-social-networks": "Dezentrale soziale Netzwerke", - "decentralized-science": "Dezentrale Wissenschaft (DeSci)", - "defi-page": "Dezentrales Finanzwesen (DeFi)", + "decentralized-science": "DeSci - Dezentrale Wissenschaft", + "defi-page": "DeFi - Dezentrales Finanzwesen", "design": "Design", "design-principles": "Designprinzipien", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Entwickler:innen", "nav-developers-docs": "Entwicklerdokumentation", "nav-primary": "Primäre", - "nft-page": "Non-Fungible Token (NFTs)", + "nft-page": "NFTs - Non-Fungible Token", "nfts": "NFTs", "no": "Nein", "on-this-page": "Auf dieser Seite", @@ -165,7 +165,7 @@ "return-home": "Zurück zur Startseite", "roadmap": "Ethereum-Roadmap", "resources": "Übersetzungsressourcen", - "regenerative-finance": "Regenerative Finanzen (ReFi)", + "regenerative-finance": "ReFi - Regenerative Finanzen", "run-a-node": "Einen Knoten betreiben", "rollup-component-website": "Website", "rollup-component-developer-docs": "Entwicklerdokumentation", diff --git a/src/intl/el/common.json b/src/intl/el/common.json index a4dbd5a9583..4c877513ce6 100644 --- a/src/intl/el/common.json +++ b/src/intl/el/common.json @@ -20,14 +20,14 @@ "copied": "Αντιγράφηκε", "copy": "Αντιγραφή", "danksharding": "Danksharding", - "dao-page": "Αποκεντρωμένοι αυτόνομοι οργανισμοί (DAO)", + "dao-page": "DAO - Αποκεντρωμένοι αυτόνομοι οργανισμοί", "dark-mode": "Σκούρο", "data-provided-by": "Προέλευση δεδομένων:", "decentralized-applications-dapps": "Αποκεντρωμένες εφαρμογές (dapps)", "decentralized-identity": "Αποκεντρωμένη ταυτότητα", "decentralized-social-networks": "Αποκεντρωμένα κοινωνικά δίκτυα", - "decentralized-science": "Αποκεντρωμένη επιστήμη (DeSci)", - "defi-page": "Αποκεντρωμένη τραπεζική (DeFi)", + "decentralized-science": "DeSci - Αποκεντρωμένη επιστήμη", + "defi-page": "DeFi - Αποκεντρωμένη τραπεζική", "devcon": "Devcon", "developers": "Προγραμματιστές", "developers-home": "Αρχική προγραμματιστών", @@ -132,7 +132,7 @@ "nav-developers": "Προγραμματιστές", "nav-developers-docs": "Τεκμηρίωση προγραμματιστών", "nav-primary": "Κύριο", - "nft-page": "Μη Εναλλάξιμα Κρυπτοπαραστατικά (NFT)", + "nft-page": "NFT - Μη Εναλλάξιμα Κρυπτοπαραστατικά", "nfts": "NFT", "no": "Όχι", "on-this-page": "Σε αυτήν τη σελίδα", @@ -151,7 +151,7 @@ "return-home": "επιστροφή στην αρχική", "roadmap": "Οδικός χάρτης Ethereum", "resources": "Πηγές μετάφρασης", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Εκτελέστε ένα κόμβο", "rollup-component-website": "Ιστότοπος", "rollup-component-developer-docs": "Τεκμηρίωση προγραμματιστή", diff --git a/src/intl/en/common.json b/src/intl/en/common.json index d0f386cdc50..c83819bfd32 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -40,7 +40,7 @@ "decentralized-applications-dapps": "Decentralized applications (dapps)", "decentralized-identity": "Decentralized identity", "decentralized-social-networks": "Decentralized social networks", - "decentralized-science": "Decentralized science (DeSci)", + "decentralized-science": "DeSci - Decentralized science", "description": "Description for nav item", "defi-page": "DeFi - Decentralized finance", "design": "Design", @@ -281,7 +281,7 @@ "research": "Research", "research-menu": "Research menu", "resources": "Translation resources", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Developer docs", diff --git a/src/intl/es/common.json b/src/intl/es/common.json index acc9b6c07bf..b9c227a44b5 100644 --- a/src/intl/es/common.json +++ b/src/intl/es/common.json @@ -31,14 +31,14 @@ "copied": "Copiado", "copy": "Copiar", "danksharding": "Danksharding", - "dao-page": "Organizaciones Autónomas Descentralizadas (DAO)", + "dao-page": "DAO - Organizaciones Autónomas Descentralizadas", "dark-mode": "Oscuro", "data-provided-by": "Fuente de datos:", "decentralized-applications-dapps": "Aplicaciones descentralizadas (DApps)", "decentralized-identity": "Identidad descentralizada", "decentralized-social-networks": "Redes sociales descentralizadas", - "decentralized-science": "Ciencias descentralizadas (DeSci)", - "defi-page": "Finanzas descentralizadas (DeFi)", + "decentralized-science": "DeSci - Ciencias descentralizadas", + "defi-page": "DeFi - Finanzas descentralizadas", "design": "Diseño", "design-principles": "Principios de diseño", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Desarrolladores", "nav-developers-docs": "Documentos para desarrolladores", "nav-primary": "Principal", - "nft-page": "Tókenes no fungibles (NFT)", + "nft-page": "NFT - Tókenes no fungibles", "nfts": "NTF", "no": "No", "on-this-page": "En esta página", @@ -165,7 +165,7 @@ "return-home": "volver a la página principal", "roadmap": "Hoja de ruta de Ethereum", "resources": "Recursos de traducción", - "regenerative-finance": "Finanzas regerenativas (ReFi)", + "regenerative-finance": "ReFi - Finanzas regerenativas", "run-a-node": "Ejecutar un nodo", "rollup-component-website": "Sitio web", "rollup-component-developer-docs": "Documentos para desarrolladores", diff --git a/src/intl/fa/common.json b/src/intl/fa/common.json index b6a1f944d1f..705e2eeecfc 100644 --- a/src/intl/fa/common.json +++ b/src/intl/fa/common.json @@ -20,14 +20,14 @@ "copied": "کپی شد", "copy": "کپی", "danksharding": "Danksharding", - "dao-page": "سازمان‌های مستقل غیر متمرکز (DAOs)", + "dao-page": "DAOs - سازمان‌های مستقل غیر متمرکز", "dark-mode": "تاریک", "data-provided-by": "منبع داده‌ها:", "decentralized-applications-dapps": "برنامه‌های کاربردی غیر متمرکز (dapps)", "decentralized-identity": "هویت نامتمرکز", "decentralized-social-networks": "شبکه‌های مجازی نامتمرکز", - "decentralized-science": "دانش نامتمرکز (دیسای)", - "defi-page": "امور مالی غیر متمرکز (DeFi)", + "decentralized-science": "دیسای - دانش نامتمرکز", + "defi-page": "DeFi - امور مالی غیر متمرکز", "devcon": "دِوکان", "developers": "توسعه دهندگان", "developers-home": "خانه توسعه دهندگان", @@ -132,7 +132,7 @@ "nav-developers": "توسعه‌دهندگان", "nav-developers-docs": "اسناد توسعه‌دهندگان", "nav-primary": "اولیه", - "nft-page": "توکن‌های معاوضه‌ناپذیر (NFT)", + "nft-page": "NFT - توکن‌های معاوضه‌ناپذیر", "nfts": "توکن‌های معاوضه‌ناپذیر", "no": "خیر", "on-this-page": "در این صفحه", @@ -151,7 +151,7 @@ "return-home": "بازگشت به صفحه اصلی", "roadmap": "نقشه‌ راه اتریوم", "resources": "منابع ترجمه", - "regenerative-finance": "امور مالی بازتولیدکننده (ReFi)", + "regenerative-finance": "ReFi - امور مالی بازتولیدکننده", "run-a-node": "راه‌اندازی یک گره", "rollup-component-website": "وب‌سایت", "rollup-component-developer-docs": "اسناد توسعه‌دهندگان", diff --git a/src/intl/fi/common.json b/src/intl/fi/common.json index 1541f45340a..bb646258820 100644 --- a/src/intl/fi/common.json +++ b/src/intl/fi/common.json @@ -115,9 +115,9 @@ "website-last-updated": "Sivusto viimeksi päivitetty", "what-is-ether": "Mikä on ether (ETH)?", "what-is-ethereum": "Mikä on Ethereum?", - "defi-page": "Hajautettu rahoitus (DeFi)", - "dao-page": "Hajautetut autonomiset organisaatiot (DAO:t)", - "nft-page": "Ei-vaihdettavat poletit (NFT:t)", + "defi-page": "DeFi - Hajautettu rahoitus", + "dao-page": "DAO:t - Hajautetut autonomiset organisaatiot", + "nft-page": "NFT:t - Ei-vaihdettavat poletit", "yes": "Kyllä", "page-index-meta-title": "Etusivu", "page-developers-aria-label": "Kehittäjien valikko" diff --git a/src/intl/fil/common.json b/src/intl/fil/common.json index 10cde6fdca8..75ec5b2f4e0 100644 --- a/src/intl/fil/common.json +++ b/src/intl/fil/common.json @@ -20,14 +20,14 @@ "copied": "Kinopya", "copy": "Kopyahin", "danksharding": "Danksharding", - "dao-page": "Mga decentralized autonomous organization (DAOs)", + "dao-page": "DAOs - Mga decentralized autonomous organization", "dark-mode": "Madilim", "data-provided-by": "Pinagmulan ng data:", "decentralized-applications-dapps": "Mga decentralized application (dapps)", "decentralized-identity": "Decentralized na identity", "decentralized-social-networks": "Mga decentralized na social network", - "decentralized-science": "Decentralized science (DeSci)", - "defi-page": "Decentralized finance (DeFi)", + "decentralized-science": "DeSci - Decentralized science", + "defi-page": "DeFi - Decentralized finance", "devcon": "Devcon", "developers": "Mga Developer", "developers-home": "Home ng mga developer", @@ -132,7 +132,7 @@ "nav-developers": "Mga Developer", "nav-developers-docs": "Developers docs", "nav-primary": "Primary", - "nft-page": "Mga non-fungible token (NFT)", + "nft-page": "NFT - Mga non-fungible token", "nfts": "NFTs", "no": "Hindi", "on-this-page": "Sa page na ito", @@ -151,7 +151,7 @@ "return-home": "bumalik sa home", "roadmap": "Roadmap ng Ethereum", "resources": "Mga resource sa translation", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Mag-run ng node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Developer docs", diff --git a/src/intl/fr/common.json b/src/intl/fr/common.json index 2c50d192156..e420dc8b9d4 100644 --- a/src/intl/fr/common.json +++ b/src/intl/fr/common.json @@ -31,14 +31,14 @@ "copied": "Copié", "copy": "Copier", "danksharding": "Danksharding", - "dao-page": "Organisations autonomes décentralisées (DAO)", + "dao-page": "DAO - Organisations autonomes décentralisées", "dark-mode": "Sombre", "data-provided-by": "Source de données :", "decentralized-applications-dapps": "Applications décentralisées (dApps)", "decentralized-identity": "Identité décentralisée", "decentralized-social-networks": "Réseaux sociaux décentralisés", - "decentralized-science": "Science décentralisée (DeSci)", - "defi-page": "Finance décentralisée (DeFi)", + "decentralized-science": "DeSci - Science décentralisée", + "defi-page": "DeFi - Finance décentralisée", "design": "Conception", "design-principles": "Principes de conception", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Développeurs", "nav-developers-docs": "Documentation pour les développeurs", "nav-primary": "Principale", - "nft-page": "Jetons non fongibles (NFTs)", + "nft-page": "NFTs - Jetons non fongibles", "nfts": "NFTs", "no": "Non", "on-this-page": "Sur cette page", @@ -165,7 +165,7 @@ "return-home": "retour à l'accueil", "roadmap": "Feuille de route d'Ethereum", "resources": "Traduction des ressources", - "regenerative-finance": "Finance régénérative (ReFi)", + "regenerative-finance": "ReFi - Finance régénérative", "run-a-node": "Exécuter un nœud", "rollup-component-website": "Site Web", "rollup-component-developer-docs": "Documentation pour les développeurs", diff --git a/src/intl/gl/common.json b/src/intl/gl/common.json index c9db4d8edfb..a1d8ee89861 100644 --- a/src/intl/gl/common.json +++ b/src/intl/gl/common.json @@ -115,9 +115,9 @@ "website-last-updated": "Última actualización da web", "what-is-ether": "Que é o ether (ETH)?", "what-is-ethereum": "Que é Ethereum?", - "defi-page": "Finanzas descentralizadas (DeFi)", - "dao-page": "Organizacións Autónomas Descentralizadas (DAO en inglés)", - "nft-page": "Tokens non funxibles (NFTs)", + "defi-page": "DeFi - Finanzas descentralizadas", + "dao-page": "DAO en inglés - Organizacións Autónomas Descentralizadas", + "nft-page": "NFTs - Tokens non funxibles", "yes": "Si", "page-index-meta-title": "Inicio" } diff --git a/src/intl/gu/common.json b/src/intl/gu/common.json index 0d62461499d..480999fbd63 100644 --- a/src/intl/gu/common.json +++ b/src/intl/gu/common.json @@ -19,7 +19,7 @@ "dark-mode": "અંધારુ", "data-provided-by": "માહિતીનું પ્રાપ્તિસ્થાન:", "decentralized-applications-dapps": "વિકેન્દ્રિત એપ્લિકેશન (dapps)", - "decentralized-science": "વિકેન્દ્રિત વિજ્ઞાન (DeSci)", + "decentralized-science": "DeSci - વિકેન્દ્રિત વિજ્ઞાન", "devcon": "ડેવકોન", "developers": "વિકાસકર્તાઓ", "developers-home": "વિકાસકર્તાઓનું ઘર", @@ -145,9 +145,9 @@ "website-last-updated": "Website નું છેલ્લું અપડેટ", "what-is-ether": "ઈથર (ETH) શું છે?", "what-is-ethereum": "ઈથિરિયમ શું છે?", - "defi-page": "વિકેન્દ્રિત ફાઇનાન્સ (DeFi)", - "dao-page": "વિકેન્દ્રિત સ્વાયત્ત સંસ્થાઓ (DAOs)", - "nft-page": "નોન-ફંગીબલ ટોકન્સ (NFTs)", + "defi-page": "DeFi - વિકેન્દ્રિત ફાઇનાન્સ", + "dao-page": "DAOs - વિકેન્દ્રિત સ્વાયત્ત સંસ્થાઓ", + "nft-page": "NFTs - નોન-ફંગીબલ ટોકન્સ", "decentralized-social-networks": "વિકેન્દ્રિત સામાજિક નેટવર્ક્સ", "decentralized-identity": "વિકેન્દ્રિત ઓળખ", "yes": "હા", diff --git a/src/intl/he/common.json b/src/intl/he/common.json index 14fd7ef65cf..32fefa1fb77 100644 --- a/src/intl/he/common.json +++ b/src/intl/he/common.json @@ -22,7 +22,7 @@ "dark-mode": "כהה", "data-provided-by": "מקור הנתונים:", "decentralized-applications-dapps": "יישומים מבוזרים (dapps)", - "decentralized-science": "מדע מבוזר (DeSci)", + "decentralized-science": "DeSci - מדע מבוזר", "devcon": "Devcon", "developers": "מפתחים", "developers-home": "דף הבית של מפתחים", @@ -167,9 +167,9 @@ "website-last-updated": "אתר האינטרנט עודכן לאחרונה", "what-is-ether": "מה זה אתר (ETH)?", "what-is-ethereum": "מה זה אתריום?", - "defi-page": "פיננסים מבוזרים (DeFi)", - "dao-page": "ארגונים אוטונומיים מבוזרים (DAOs)", - "nft-page": "אסימונים לא ניתנים לשינוי (NFTs)", + "defi-page": "DeFi - פיננסים מבוזרים", + "dao-page": "DAOs - ארגונים אוטונומיים מבוזרים", + "nft-page": "NFTs - אסימונים לא ניתנים לשינוי", "decentralized-social-networks": "רשת חברתית מבוזרת", "decentralized-identity": "זהות מבוזרת", "yes": "כן", diff --git a/src/intl/hi/common.json b/src/intl/hi/common.json index 380a1a58ae8..e5de9c3a6ad 100644 --- a/src/intl/hi/common.json +++ b/src/intl/hi/common.json @@ -20,14 +20,14 @@ "copied": "कॉपी किया गया", "copy": "कॉपी करें", "danksharding": "डैंकशार्डिंग", - "dao-page": "विकेन्द्रीकृत स्वायत्त संगठन (DAO)", + "dao-page": "DAO - विकेन्द्रीकृत स्वायत्त संगठन", "dark-mode": "गहरा रंग", "data-provided-by": "डाटा सोर्स:", "decentralized-applications-dapps": "विकेंद्रीकृत अनुप्रयोग (dapps)", "decentralized-identity": "विकेन्द्रीकृत पहचान", "decentralized-social-networks": "विकेन्द्रीकृत सोशल नेटवर्क", - "decentralized-science": "विकेंद्रित विज्ञान (DeSci)", - "defi-page": "विकेन्द्रीकृत वित्त (DeFi)", + "decentralized-science": "DeSci - विकेंद्रित विज्ञान", + "defi-page": "DeFi - विकेन्द्रीकृत वित्त", "devcon": "डेवकॉन", "developers": "डेवलपर", "developers-home": "डेवलपर के लिए मुखपृष्ठ", @@ -132,7 +132,7 @@ "nav-developers": "डिवेलपर्स", "nav-developers-docs": "डिवेलपर्स डॉक्यूमेंट", "nav-primary": "प्राथमिक", - "nft-page": "नॉन-फंजिबल टोकन (NFT)", + "nft-page": "NFT - नॉन-फंजिबल टोकन", "nfts": "NFTs", "no": "नहीं", "on-this-page": "इस पेज पर", @@ -151,7 +151,7 @@ "return-home": "होम पेज पर लौटें", "roadmap": "एथेरियम दिशानिर्देश", "resources": "अनुवाद के संसाधन", - "regenerative-finance": "रीजेनेरेटिव फाइनेंस (ReFi)", + "regenerative-finance": "ReFi - रीजेनेरेटिव फाइनेंस", "run-a-node": "नोड चलाएँ", "rollup-component-website": "वेबसाइट", "rollup-component-developer-docs": "डिवेलपर डॉक्यूमेंट", diff --git a/src/intl/hr/common.json b/src/intl/hr/common.json index 4a6efc85178..674dce82ed1 100644 --- a/src/intl/hr/common.json +++ b/src/intl/hr/common.json @@ -31,14 +31,14 @@ "copied": "Kopirano", "copy": "Kopiraj", "danksharding": "Dank-razdjeljivanje", - "dao-page": "Decentralizirane autonomne organizacije (DAO-ovi)", + "dao-page": "DAO-ovi - Decentralizirane autonomne organizacije", "dark-mode": "Tamno", "data-provided-by": "Izvor podataka:", "decentralized-applications-dapps": "Decentralizirane aplikacije (dapp-ovi)", "decentralized-identity": "Decentraliziran identitet", "decentralized-social-networks": "Decentralizirane društvene mreže", - "decentralized-science": "Decentralizirana znanost (DeSci)", - "defi-page": "Decentralizirane financije (DeFi)", + "decentralized-science": "DeSci - Decentralizirana znanost", + "defi-page": "DeFi - Decentralizirane financije", "design": "Dizajn", "design-principles": "Principi dizajna", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Programeri", "nav-developers-docs": "Dokumenti za programere", "nav-primary": "Primarni", - "nft-page": "Nezamjenjivi tokeni (NFT-ovi)", + "nft-page": "NFT-ovi - Nezamjenjivi tokeni", "nfts": "NFT - nezamjenjivi tokeni", "no": "Ne", "on-this-page": "Na ovoj stranici", @@ -165,7 +165,7 @@ "return-home": "vrati doma", "roadmap": "Plan razvoja Ethereuma", "resources": "Resursi prevođenja", - "regenerative-finance": "Regenerativne financije (ReFi)", + "regenerative-finance": "ReFi - Regenerativne financije", "run-a-node": "Raditi node-a", "rollup-component-website": "Web stranica", "rollup-component-developer-docs": "Dokumenti za programere", diff --git a/src/intl/hu/common.json b/src/intl/hu/common.json index c7470004b58..f3217245587 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -31,14 +31,14 @@ "copied": "Lemásolva", "copy": "Másolás", "danksharding": "Dank-féle párhuzamos futtatás (Danksharding)", - "dao-page": "Decentralizált autonóm szervezetek (DAO-k)", + "dao-page": "DAO-k - Decentralizált autonóm szervezetek", "dark-mode": "Sötét", "data-provided-by": "Adatforrás:", "decentralized-applications-dapps": "Decentralizált alkalmazások (dapps)", "decentralized-identity": "Decentralizált identitás", "decentralized-social-networks": "Decentralizált közösségi hálózatok", - "decentralized-science": "Nem központosított kutatás (DeSci)", - "defi-page": "Decentralizált pénzügy (DeFi)", + "decentralized-science": "DeSci - Nem központosított kutatás", + "defi-page": "DeFi - Decentralizált pénzügy", "design": "Dizájn", "design-principles": "Dizájnelvek", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Fejlesztők", "nav-developers-docs": "Fejlesztői dokumentumok", "nav-primary": "Elsődleges", - "nft-page": "Nem felcserélhető tokenek (NFT-k)", + "nft-page": "NFT-k - Nem felcserélhető tokenek", "nfts": "NFT-k", "no": "Nem", "on-this-page": "Ezen az oldalon", @@ -165,7 +165,7 @@ "return-home": "vissza a kezdőlapra", "roadmap": "Ethereum-ütemterv", "resources": "Fordítási erőforrások", - "regenerative-finance": "Regeneratív pénzügyek (ReFi)", + "regenerative-finance": "ReFi - Regeneratív pénzügyek", "run-a-node": "Csomópont futtatása", "rollup-component-website": "Honlap", "rollup-component-developer-docs": "Fejlesztői dokumentumok", diff --git a/src/intl/hy-am/common.json b/src/intl/hy-am/common.json index da82564ef3b..0146aa0a338 100644 --- a/src/intl/hy-am/common.json +++ b/src/intl/hy-am/common.json @@ -20,14 +20,14 @@ "copied": "Պատճենվել է", "copy": "Պատճենել", "danksharding": "Danksharding", - "dao-page": "Ապակենտրոնացված ինքնավար կազմակերպություններ (DAO)", + "dao-page": "DAO - Ապակենտրոնացված ինքնավար կազմակերպություններ", "dark-mode": "Մութ", "data-provided-by": "Տվյալների աղբյուր:", "decentralized-applications-dapps": "Ապակենտրոնացված հավելվածներ (dapps)", "decentralized-identity": "Ապակենտրոնացված ինքնություն", "decentralized-social-networks": "Ապակենտրոնացված սոցիալական ցանցեր", - "decentralized-science": "Ապակենտրոնացված գիտություն (DeSci)", - "defi-page": "Ապակենտրոնացված ֆինանսներ (DeFi)", + "decentralized-science": "DeSci - Ապակենտրոնացված գիտություն", + "defi-page": "DeFi - Ապակենտրոնացված ֆինանսներ", "devcon": "Devcon", "developers": "Ծրագրավորողներ", "developers-home": "Ծրագրավորողների գլխավոր էջ", @@ -132,7 +132,7 @@ "nav-developers": "Ծրագրավորողներ", "nav-developers-docs": "Մշակողների փաստաթղթեր", "nav-primary": "Առաջնային", - "nft-page": "Չփոխարինելի նշաններ (NFT)", + "nft-page": "NFT - Չփոխարինելի նշաններ", "nfts": "NFT-ներ", "no": "Ոչ", "on-this-page": "Այս էջում", @@ -151,7 +151,7 @@ "return-home": "Վերադառնալ տուն", "roadmap": "Ethereum ճանապարհային քարտեզ", "resources": "Թարգմանչական ռեսուրսներ", - "regenerative-finance": "Ռեգեներատիվ ֆինանսներ (ՌեՖի)", + "regenerative-finance": "ՌեՖի - Ռեգեներատիվ ֆինանսներ", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Մշակողի փաստաթղթեր", diff --git a/src/intl/id/common.json b/src/intl/id/common.json index 44654ca12da..5cddb32282d 100644 --- a/src/intl/id/common.json +++ b/src/intl/id/common.json @@ -20,14 +20,14 @@ "copied": "Disalin", "copy": "Salin", "danksharding": "Danksharding", - "dao-page": "Organisasi otonom terdesentralisasi (DAO)", + "dao-page": "DAO - Organisasi otonom terdesentralisasi", "dark-mode": "Gelap", "data-provided-by": "Sumber data:", "decentralized-applications-dapps": "Decentralized applications (dapp)", "decentralized-identity": "Identitas terdesentralisasi", "decentralized-social-networks": "Jaringan sosial terdesentralisasi", - "decentralized-science": "Sains terdesentralisasi (DeSci)", - "defi-page": "Keuangan terdesentralisasi (DeFi)", + "decentralized-science": "DeSci - Sains terdesentralisasi", + "defi-page": "DeFi - Keuangan terdesentralisasi", "devcon": "Devcon", "developers": "Pengembang", "developers-home": "Beranda Pengembang", @@ -132,7 +132,7 @@ "nav-developers": "Pengembang", "nav-developers-docs": "Dokumen pengembang", "nav-primary": "Utama", - "nft-page": "Token yang tidak dapat dipertukarkan (NFT)", + "nft-page": "NFT - Token yang tidak dapat dipertukarkan", "nfts": "NFT", "no": "Tidak", "on-this-page": "Pada halaman ini", @@ -151,7 +151,7 @@ "return-home": "kembali ke beranda", "roadmap": "Peta Perjalanan Ethereum", "resources": "Sumber terjemahan", - "regenerative-finance": "Keuangan regeneratif (ReFi)", + "regenerative-finance": "ReFi - Keuangan regeneratif", "run-a-node": "Menjalankan sebuah node", "rollup-component-website": "Situs web", "rollup-component-developer-docs": "Dokumen pengembang", diff --git a/src/intl/ig/common.json b/src/intl/ig/common.json index c19527c0a13..34dd647c9c1 100644 --- a/src/intl/ig/common.json +++ b/src/intl/ig/common.json @@ -20,14 +20,14 @@ "copied": "Akọpịala", "copy": "Kọpịa", "danksharding": "Danksharding", - "dao-page": "Otu zoro ezo n'enweghi nchikwa (DAOs)", + "dao-page": "DAOs - Otu zoro ezo n'enweghi nchikwa", "dark-mode": "Ojii", "data-provided-by": "Ebe data:", "decentralized-applications-dapps": "Ngwa komputa na aru oru na sistemu komputa (dapps)", "decentralized-identity": "Njirimara ọtụtụ ndị na achị", "decentralized-social-networks": "Netwọk mmekọrịta ọtụtụ ndị na achi", - "decentralized-science": "Sayensị ọtụtụ ndị na achị (DeSci)", - "defi-page": "Ego n'enweghi nchikwa (DeFi)", + "decentralized-science": "DeSci - Sayensị ọtụtụ ndị na achị", + "defi-page": "DeFi - Ego n'enweghi nchikwa", "devcon": "Devcon", "developers": "Ndị mmeputa", "developers-home": "Isi ulo oru ndi Mmeputa", @@ -132,7 +132,7 @@ "nav-developers": "Ndị mmeputa", "nav-developers-docs": "Akwụkwọ ndị na-emepụta", "nav-primary": "Isi mbido", - "nft-page": "Non-fungible tokin (NFTs)", + "nft-page": "NFTs - Non-fungible tokin", "nfts": "NFTs", "no": "Mba", "on-this-page": "Na peeji a", @@ -151,7 +151,7 @@ "return-home": "laghachi azu n'ụlọ", "roadmap": "Mapụ nke ụzọ Ethereum", "resources": "Akụrụngwa ntụgharị asụsụ", - "regenerative-finance": "Ego n'enweghi nchikwa (ReFi)", + "regenerative-finance": "ReFi - Ego n'enweghi nchikwa", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Akwụkwọ onye nrụpụta", diff --git a/src/intl/it/common.json b/src/intl/it/common.json index 75d193fe02a..0f3f42f0262 100644 --- a/src/intl/it/common.json +++ b/src/intl/it/common.json @@ -20,14 +20,14 @@ "copied": "Copiato", "copy": "Copia", "danksharding": "Danksharding", - "dao-page": "Organizzazioni autonome decentralizzate (DAO)", + "dao-page": "DAO - Organizzazioni autonome decentralizzate", "dark-mode": "Scuro", "data-provided-by": "Origine dei dati:", "decentralized-applications-dapps": "Applicazioni decentralizzate (dapps)", "decentralized-identity": "Identità decentralizzata", "decentralized-social-networks": "Social network decentralizzati", - "decentralized-science": "Scienza Decentralizzata (DeSci)", - "defi-page": "Finanza decentralizzata (DeFi)", + "decentralized-science": "DeSci - Scienza Decentralizzata", + "defi-page": "DeFi - Finanza decentralizzata", "devcon": "Devcon", "developers": "Sviluppatori", "developers-home": "Home degli sviluppatori", @@ -132,7 +132,7 @@ "nav-developers": "Sviluppatori", "nav-developers-docs": "Documentazione per sviluppatori", "nav-primary": "Principale", - "nft-page": "Token non fungibili (NFT)", + "nft-page": "NFT - Token non fungibili", "nfts": "NFT", "no": "No", "on-this-page": "Su questa pagina", @@ -151,7 +151,7 @@ "return-home": "torna alla home", "roadmap": "Roadmap di Ethereum", "resources": "Risorse di traduzione", - "regenerative-finance": "Finanza Rigenerativa (ReFi)", + "regenerative-finance": "ReFi - Finanza Rigenerativa", "run-a-node": "Esegui un nodo", "rollup-component-website": "Sito Web", "rollup-component-developer-docs": "Documentazione per sviluppatori", diff --git a/src/intl/ka/common.json b/src/intl/ka/common.json index 93100bf62e3..57410abaa72 100644 --- a/src/intl/ka/common.json +++ b/src/intl/ka/common.json @@ -20,14 +20,14 @@ "copied": "დაკოპირებულია", "copy": "კოპირება", "danksharding": "დენკშერდინგი", - "dao-page": "დეცენტრალიზებული ავტონომიური ორგანიზაციები (DAO)-ები", + "dao-page": "DAO - დეცენტრალიზებული ავტონომიური ორგანიზაციები-ები", "dark-mode": "ბნელი", "data-provided-by": "მონაცემთა წყარო:", "decentralized-applications-dapps": "დეცენტრალიზებული აპლიკაციები (dapps)", "decentralized-identity": "დეცენტრალიზებული იდენტობა", "decentralized-social-networks": "დეცენტრალიზებული სოციალური ქსელი", - "decentralized-science": "დეცენტრალიზებული მეცნიერება (DeSci)", - "defi-page": "დეცენტრალიზებული ფინანსები (DeFi)", + "decentralized-science": "DeSci - დეცენტრალიზებული მეცნიერება", + "defi-page": "DeFi - დეცენტრალიზებული ფინანსები", "devcon": "Devcon", "developers": "დეველოპერები", "developers-home": "დეველოპერების მთავარი", @@ -132,7 +132,7 @@ "nav-developers": "დეველოპერები", "nav-developers-docs": "დეველოპერების დოკუმენტაცია", "nav-primary": "ძირითადი", - "nft-page": "შეუცვლელი ტოკენები (NFT)-ები", + "nft-page": "NFT - შეუცვლელი ტოკენები-ები", "nfts": "NFT-ები", "no": "არა", "on-this-page": "ამ გვერდზე", @@ -151,7 +151,7 @@ "return-home": "დაბრუნება მთავარზე", "roadmap": "ეთერეუმის საგზაო რუკა", "resources": "თარგმნის რესურსები", - "regenerative-finance": "Რეგენერატიული ფინანსები (ReFi)", + "regenerative-finance": "ReFi - Რეგენერატიული ფინანსები", "run-a-node": "კვანძის გაშვება", "rollup-component-website": "ვებგვერდი", "rollup-component-developer-docs": "დეველოპერის დოკუმენტაცია", diff --git a/src/intl/kk/common.json b/src/intl/kk/common.json index 820eaef73b3..6eb75158e3d 100644 --- a/src/intl/kk/common.json +++ b/src/intl/kk/common.json @@ -144,9 +144,9 @@ "website-last-updated": "Веб-сайттың соңғы жаңартылуы", "what-is-ether": "Ether (ETH) дегеніміз не?", "what-is-ethereum": "Ethereum дегеніміз не?", - "defi-page": "Орталықсыздандырылған қаржы (DeFi)", - "dao-page": "Орталықсыздандырылған автономды ұйымдар (DAO-лар)", - "nft-page": "Өзара алмастырылмайтын токендер (NFT-лер)", + "defi-page": "DeFi - Орталықсыздандырылған қаржы", + "dao-page": "DAO-лар - Орталықсыздандырылған автономды ұйымдар", + "nft-page": "NFT-лер - Өзара алмастырылмайтын токендер", "decentralized-social-networks": "Decentralized social networks", "decentralized-identity": "Decentralized identity", "yes": "Иә", diff --git a/src/intl/km/common.json b/src/intl/km/common.json index 2154e3d01a6..c77493ec861 100644 --- a/src/intl/km/common.json +++ b/src/intl/km/common.json @@ -20,14 +20,14 @@ "copied": "បានចម្លង", "copy": "ចម្លង", "danksharding": "Danksharding", - "dao-page": "អង្គការស្វយ័តវិមជ្ឈការ (DAOs)", + "dao-page": "DAOs - អង្គការស្វយ័តវិមជ្ឈការ", "dark-mode": "ងងឹត", "data-provided-by": "ប្រភពទិន្នន័យ៖", "decentralized-applications-dapps": "កម្មវិធីវិមជ្ឈការ (dapps)", "decentralized-identity": "អត្តសញ្ញាណវិមជ្ឈការ", "decentralized-social-networks": "បណ្តាញសង្គមវិមជ្ឈការ", - "decentralized-science": "វិទ្យាសាស្ត្រវិមជ្ឈការ (DeSci)", - "defi-page": "ហិរញ្ញវត្ថុវិមជ្ឈការ (DeFi)", + "decentralized-science": "DeSci - វិទ្យាសាស្ត្រវិមជ្ឈការ", + "defi-page": "DeFi - ហិរញ្ញវត្ថុវិមជ្ឈការ", "devcon": "Devcon", "developers": "អ្នកអភិវឌ្ឍន៍", "developers-home": "ផ្ទះរបស់អ្នកអភិវឌ្ឍន៍", @@ -132,7 +132,7 @@ "nav-developers": "អ្នកអភិវឌ្ឍន៍", "nav-developers-docs": "ឯកសារអ្នកអភិវឌ្ឍន៍", "nav-primary": "បឋម", - "nft-page": "ថូខិនដែលមិនអាចផ្លាស់ប្តូរបាន (NFTs)", + "nft-page": "NFTs - ថូខិនដែលមិនអាចផ្លាស់ប្តូរបាន", "nfts": "NFTs", "no": "ទេ", "on-this-page": "នៅលើទំព័រនេះ", @@ -151,7 +151,7 @@ "return-home": "ត្រលប់ទៅទំព័រដើម", "roadmap": "ផែនទីបង្ហាញផ្លូវ Ethereum", "resources": "ធនធានបកប្រែ", - "regenerative-finance": "ហិរញ្ញវត្ថុបង្កើតឡើងវិញ (ReFi)", + "regenerative-finance": "ReFi - ហិរញ្ញវត្ថុបង្កើតឡើងវិញ", "run-a-node": "ដំណើរការ node", "rollup-component-website": "វែបសាយ", "rollup-component-developer-docs": "ឯកសារអ្នកអភិវឌ្ឍន៍", diff --git a/src/intl/kn/common.json b/src/intl/kn/common.json index a0c30074f6e..86cb9b72c59 100644 --- a/src/intl/kn/common.json +++ b/src/intl/kn/common.json @@ -20,14 +20,14 @@ "copied": "ನಕಲು ಮಾಡಲಾಗಿದೆ", "copy": "ನಕಲು", "danksharding": "ಡ್ಯಾಂಕ್‌ಶಾರ್ಡಿಂಗ್", - "dao-page": "ವಿಕೇಂದ್ರೀಕರಿತ ಸ್ವಯಂಚಾಲಿತ ಸಂಸ್ಥೆಗಳು (ಡಿಎಒಗಳು)", + "dao-page": "ಡಿಎಒಗಳು - ವಿಕೇಂದ್ರೀಕರಿತ ಸ್ವಯಂಚಾಲಿತ ಸಂಸ್ಥೆಗಳು", "dark-mode": "ಕತ್ತಲು / ಅಂಧಕಾರದ", "data-provided-by": "ಡೇಟಾ ಮೂಲ:", "decentralized-applications-dapps": "ವಿಕೇಂದ್ರೀಕೃತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು (dapps)", "decentralized-identity": "ವಿಕೇಂದ್ರೀಕರಿತ ಗುರುತು", "decentralized-social-networks": "ವಿಕೇಂದ್ರೀಕರಿತ ಸಾಮಾಜಿಕ ಜಾಲಗಳು", - "decentralized-science": "ವಿಕೇಂದ್ರೀಕರಿತ ವಿಜ್ಞಾನ (ಡಿಸೈ)", - "defi-page": "ವಿಕೇಂದ್ರೀಕರಿತ ಹಣಕಾಸು (ಡಿಫೈ)", + "decentralized-science": "ಡಿಸೈ - ವಿಕೇಂದ್ರೀಕರಿತ ವಿಜ್ಞಾನ", + "defi-page": "ಡಿಫೈ - ವಿಕೇಂದ್ರೀಕರಿತ ಹಣಕಾಸು", "devcon": "ಡೆವ್ಕಾನ್", "developers": "ಡೆವೆಲಪರ್", "developers-home": "ಡೆವಲಪರ್‌ಗಳ ಮುಖಪುಟ", @@ -132,7 +132,7 @@ "nav-developers": "ಡೆವೆಲಪರ್", "nav-developers-docs": "ಡೆವಲಪರ್‌ಗಳ ಮುಖಪುಟ", "nav-primary": "ಪ್ರಾಥಮಿಕ", - "nft-page": "ಶಿಲೀಂಧ್ರವಲ್ಲದ ಟೋಕನ್ ಗಳು (NFTs)", + "nft-page": "NFTs - ಶಿಲೀಂಧ್ರವಲ್ಲದ ಟೋಕನ್ ಗಳು", "nfts": "NFTs", "no": "ಇಲ್ಲ", "on-this-page": "ಈ ಪುಟದಲ್ಲಿ", @@ -151,7 +151,7 @@ "return-home": "ಮುಖಪುಟ ಹಿಂತಿರುಗಿ", "roadmap": "ಇಥಿರಿಯಮ್ ಮಾರ್ಗಸೂಚಿ", "resources": "ಅನುವಾದ ಸಂಪನ್ಮೂಲಗಳು", - "regenerative-finance": "ಪುನರುತ್ಪಾದಕ ಹಣಕಾಸು (ReFi)", + "regenerative-finance": "ReFi - ಪುನರುತ್ಪಾದಕ ಹಣಕಾಸು", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "ಡೆವಲಪರ್ ಡಾಕ್ಸ್", diff --git a/src/intl/lt/common.json b/src/intl/lt/common.json index 1acb09d4eb8..e48d0b75f54 100644 --- a/src/intl/lt/common.json +++ b/src/intl/lt/common.json @@ -115,9 +115,9 @@ "website-last-updated": "Svetainė paskutinį kartą atnaujinta", "what-is-ether": "Kas yra Ether (ETH)?", "what-is-ethereum": "Kas yra Ethereum?", - "defi-page": "Decentralizuoti finansai (DeFi)", - "dao-page": "Decentralizuotos autonominės organizacijos (DAO)", - "nft-page": "Nekeičiamieji žetonai (NFT)", + "defi-page": "DeFi - Decentralizuoti finansai", + "dao-page": "DAO - Decentralizuotos autonominės organizacijos", + "nft-page": "NFT - Nekeičiamieji žetonai", "yes": "Taip", "page-index-meta-title": "Pagrindinis puslapis", "page-developers-aria-label": "Kūrėjų meniu" diff --git a/src/intl/ml/common.json b/src/intl/ml/common.json index a3362555781..16e33757da6 100644 --- a/src/intl/ml/common.json +++ b/src/intl/ml/common.json @@ -132,9 +132,9 @@ "website-last-updated": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത വെബ്‌സൈറ്റ്", "what-is-ether": "എന്താണ് ഇതര്‍ (ETH)?", "what-is-ethereum": "എന്താണ് Ethereum?", - "defi-page": "വികേന്ദ്രീകൃത ധനകാര്യം (DeFi)", - "dao-page": "വികേന്ദ്രീകൃത സ്വയംഭരണ സ്ഥാപനങ്ങൾ (DAOs)", - "nft-page": "നോൺ-ഫഞ്ചിബിൾ ടോക്കണുകൾ (NFTs)", + "defi-page": "DeFi - വികേന്ദ്രീകൃത ധനകാര്യം", + "dao-page": "DAOs - വികേന്ദ്രീകൃത സ്വയംഭരണ സ്ഥാപനങ്ങൾ", + "nft-page": "NFTs - നോൺ-ഫഞ്ചിബിൾ ടോക്കണുകൾ", "yes": "അതെ", "page-index-meta-title": "വീട്", "page-developers-aria-label": "ഡവലപ്പർമാരുടെ മെനു" diff --git a/src/intl/mr/common.json b/src/intl/mr/common.json index c63f55112a2..c1c0f1c095e 100644 --- a/src/intl/mr/common.json +++ b/src/intl/mr/common.json @@ -20,14 +20,14 @@ "copied": "कॉपी केले", "copy": "कॉपी", "danksharding": "डंकशार्डिंग", - "dao-page": "विकेंद्रीत स्वायत्त संस्था (DAO)", + "dao-page": "DAO - विकेंद्रीत स्वायत्त संस्था", "dark-mode": "गडद", "data-provided-by": "डेटा स्रोत:", "decentralized-applications-dapps": "विकेंद्रित अनुप्रयोग (dapps)", "decentralized-identity": "विकेंद्रित ओळख", "decentralized-social-networks": "विकेंद्रित सामाजिक जाळे", - "decentralized-science": "विकेंद्रित विज्ञान (DeSci)", - "defi-page": "विकेंद्रीत अर्थव्यवस्था (DeFi)", + "decentralized-science": "DeSci - विकेंद्रित विज्ञान", + "defi-page": "DeFi - विकेंद्रीत अर्थव्यवस्था", "devcon": "डेव्हकॉन", "developers": "विकासक", "developers-home": "विकासकांचे मुख्यपृष्ठ", @@ -132,7 +132,7 @@ "nav-developers": "विकसक", "nav-developers-docs": "विकसक डॉक्स", "nav-primary": "प्राथमिक", - "nft-page": "नॉन-फंजीबल टोकन (NFT)", + "nft-page": "NFT - नॉन-फंजीबल टोकन", "nfts": "NFT", "no": "नाही", "on-this-page": "या पृष्ठावर", @@ -151,7 +151,7 @@ "return-home": "मुख्यपृष्ठावर परत या", "roadmap": "Ethereum नकाशा", "resources": "भाषांतर संसाधने", - "regenerative-finance": "रीजनरेटिव्ह फायनान्स (ReFi)", + "regenerative-finance": "ReFi - रीजनरेटिव्ह फायनान्स", "run-a-node": "एक नोड चालवा", "rollup-component-website": "वेबसाईट", "rollup-component-developer-docs": "विकसक डॉक्स", diff --git a/src/intl/ms/common.json b/src/intl/ms/common.json index f977fcf3736..c499f6bb936 100644 --- a/src/intl/ms/common.json +++ b/src/intl/ms/common.json @@ -20,14 +20,14 @@ "copied": "Telah disalin", "copy": "Salin", "danksharding": "Danksharding", - "dao-page": "Organisasi autonomi yang tak terpusat (DAO)", + "dao-page": "DAO - Organisasi autonomi yang tak terpusat", "dark-mode": "Gelap", "data-provided-by": "Sumber data:", "decentralized-applications-dapps": "Aplikasi tidak berpusat (dapps)", "decentralized-identity": "Identiti ternyahpusat", "decentralized-social-networks": "Rangkaian sosial ternyahpusat", - "decentralized-science": "Sains ternyahpusat (DeSci)", - "defi-page": "Kewangan tak terpusat (DeFi)", + "decentralized-science": "DeSci - Sains ternyahpusat", + "defi-page": "DeFi - Kewangan tak terpusat", "devcon": "Devcon", "developers": "Pembangun", "developers-home": "Laman Utama Pembangun", @@ -132,7 +132,7 @@ "nav-developers": "Pemaju", "nav-developers-docs": "Dokumen pembangun", "nav-primary": "Utama", - "nft-page": "Token yang tidak dapat dipertukarkan (NFT)", + "nft-page": "NFT - Token yang tidak dapat dipertukarkan", "nfts": "NFT", "no": "Tidak", "on-this-page": "Pada halaman ini", @@ -151,7 +151,7 @@ "return-home": "kembali ke laman utama", "roadmap": "Peta hala tuju Ethereum", "resources": "Sumber untuk penterjemahan", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Jalankan nod", "rollup-component-website": "Laman web", "rollup-component-developer-docs": "Dokumen pembangun", diff --git a/src/intl/nb/common.json b/src/intl/nb/common.json index ef4c9dacf0a..e6860b7e977 100644 --- a/src/intl/nb/common.json +++ b/src/intl/nb/common.json @@ -19,7 +19,7 @@ "dark-mode": "Mørk", "data-provided-by": "Datakilde:", "decentralized-applications-dapps": "Desentraliserte applikasjoner (dapper)", - "decentralized-science": "Desentralisert vitenskap (DeSci)", + "decentralized-science": "DeSci - Desentralisert vitenskap", "devcon": "Devcon", "developers": "Utviklere", "developers-home": "Startside for utviklere", @@ -149,9 +149,9 @@ "website-last-updated": "Nettsiden ble sist oppdatert", "what-is-ether": "Hva er ether (ETH)?", "what-is-ethereum": "Hva er Ethereum?", - "defi-page": "Desentralisert finans (DeFi)", - "dao-page": "Desentraliserte egenstyrte organisasjoner (DAO)", - "nft-page": "Ikke-ombyttelige tokener (NFT)", + "defi-page": "DeFi - Desentralisert finans", + "dao-page": "DAO - Desentraliserte egenstyrte organisasjoner", + "nft-page": "NFT - Ikke-ombyttelige tokener", "decentralized-social-networks": "Desentraliserte sosiale nettverk", "decentralized-identity": "Desentralisert identitet", "yes": "Ja", diff --git a/src/intl/ne-np/common.json b/src/intl/ne-np/common.json index 6e38c282f7b..8fd1c392e8a 100644 --- a/src/intl/ne-np/common.json +++ b/src/intl/ne-np/common.json @@ -20,14 +20,14 @@ "copied": "प्रतिलिपि गरिएको", "copy": "प्रतिलिपि बनाउनुहोस्", "danksharding": "डैंकसार्डिङ", - "dao-page": "विकेन्द्रीकृत स्वायत्त संस्थाहरू (DAOs)", + "dao-page": "DAOs - विकेन्द्रीकृत स्वायत्त संस्थाहरू", "dark-mode": "अँध्यारो", "data-provided-by": "डाटाको स्रोत:", "decentralized-applications-dapps": "विकेन्द्रीकृत एप्पहरू (dapps)", "decentralized-identity": "विकेन्द्रीकृत पहिचान", "decentralized-social-networks": "विकेन्द्रीकृत सामाजिक सञ्जाल", - "decentralized-science": "विकेन्द्रीकृत विज्ञान (DeSci)", - "defi-page": "विकेन्द्रीकृत वित्त (DeFi)", + "decentralized-science": "DeSci - विकेन्द्रीकृत विज्ञान", + "defi-page": "DeFi - विकेन्द्रीकृत वित्त", "devcon": "डेवकन", "developers": "निर्माताहरु", "developers-home": "निर्माताको गृहपृष्ठ", @@ -132,7 +132,7 @@ "nav-developers": "निर्माताहरु", "nav-developers-docs": "निर्माताको कागजात", "nav-primary": "प्राथमिक", - "nft-page": "नन-फन्जिबल टोकन (NFTs)", + "nft-page": "NFTs - नन-फन्जिबल टोकन", "nfts": "NFTs", "no": "होइन", "on-this-page": "यस पृष्ठमा", @@ -151,7 +151,7 @@ "return-home": "गृहपृष्ठमा फर्कनुहोस", "roadmap": "इथेरियम रोडम्याप", "resources": "अनुवादका स्रोतहरू", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Run a node", "rollup-component-website": "Website", "rollup-component-developer-docs": "निर्माताको कागजात", diff --git a/src/intl/nl/common.json b/src/intl/nl/common.json index 338be03ed4d..669da839aa6 100644 --- a/src/intl/nl/common.json +++ b/src/intl/nl/common.json @@ -20,14 +20,14 @@ "copied": "Gekopieerd", "copy": "Kopiëren", "danksharding": "Danksharding", - "dao-page": "Gedecentraliseerde autonome organisaties (DAO's)", + "dao-page": "DAO's - Gedecentraliseerde autonome organisaties", "dark-mode": "Donker", "data-provided-by": "Gegevensbron:", "decentralized-applications-dapps": "Gedecentraliseerde toepassingen (dapps)", "decentralized-identity": "Gedecentraliseerde identiteit", "decentralized-social-networks": "Gedecentraliseerde sociale netwerken", - "decentralized-science": "Gedecentraliseerde wetenschap (DeSci)", - "defi-page": "Gedecentraliseerde financiën (DeFi)", + "decentralized-science": "DeSci - Gedecentraliseerde wetenschap", + "defi-page": "DeFi - Gedecentraliseerde financiën", "devcon": "Devcon", "developers": "Ontwikkelaars", "developers-home": "Startpagina voor ontwikkelaars", @@ -132,7 +132,7 @@ "nav-developers": "Ontwikkelaars", "nav-developers-docs": "Ontwikkelaarsdocumenten", "nav-primary": "Primair", - "nft-page": "Niet-vervangbare tokens (NFT's)", + "nft-page": "NFT's - Niet-vervangbare tokens", "nfts": "NFT's", "no": "Nee", "on-this-page": "Op deze pagina", @@ -151,7 +151,7 @@ "return-home": "terug naar startpagina", "roadmap": "Ethereum-roadmap", "resources": "Vertaalbronnen", - "regenerative-finance": "Regeneratieve financiering (ReFi)", + "regenerative-finance": "ReFi - Regeneratieve financiering", "run-a-node": "Run een node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Ontwikkelaarsdocumenten", diff --git a/src/intl/pcm/common.json b/src/intl/pcm/common.json index edf1faa5c6e..f6c42186fb5 100644 --- a/src/intl/pcm/common.json +++ b/src/intl/pcm/common.json @@ -20,14 +20,14 @@ "copied": "Kopied", "copy": "Kopy", "danksharding": "Dankshardin", - "dao-page": "Disentralized autonomous organisashon (DAOs)", + "dao-page": "DAOs - Disentralized autonomous organisashon", "dark-mode": "Dark", "data-provided-by": "Data sorse:", "decentralized-applications-dapps": "Disentralized aplikashons (dapps)", "decentralized-identity": "Disentralized identity", "decentralized-social-networks": "Disentralized soshia netwoks", - "decentralized-science": "Disentralized sayens (DeSci)", - "defi-page": "Disentralized finans (Defi)", + "decentralized-science": "DeSci - Disentralized sayens", + "defi-page": "Defi - Disentralized finans", "devcon": "Devkon", "developers": "Divelopas", "developers-home": "Divelopas haus", @@ -132,7 +132,7 @@ "nav-developers": "Developers", "nav-developers-docs": "Diveloas docs", "nav-primary": "Primary", - "nft-page": "Non-fungibol tokens (NFTs)", + "nft-page": "NFTs - Non-fungibol tokens", "nfts": "NFTs", "no": "No", "on-this-page": "On dis page", @@ -151,7 +151,7 @@ "return-home": "Make yu riturn haus", "roadmap": "Ethereum roadmap", "resources": "Translashon risorsis", - "regenerative-finance": "Regenerative finans (ReFi)", + "regenerative-finance": "ReFi - Regenerative finans", "run-a-node": "Run node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Divelopa docs", diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index edee4eac2e0..54329a3ca6c 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -31,14 +31,14 @@ "copied": "Skopiowane", "copy": "Kopiuj", "danksharding": "Danksharding", - "dao-page": "Zdecentralizowane autonomiczne organizacje (DAO)", + "dao-page": "DAO - Zdecentralizowane autonomiczne organizacje", "dark-mode": "Ciemny", "data-provided-by": "Źródło danych:", "decentralized-applications-dapps": "Aplikacje zdecentralizowane (dapps)", "decentralized-identity": "Zdecentralizowana tożsamość", "decentralized-social-networks": "Zdecentralizowane sieci społecznościowe", - "decentralized-science": "Zdecentralizowana nauka (DeSci)", - "defi-page": "Zdecentralizowane finanse (DeFi)", + "decentralized-science": "DeSci - Zdecentralizowana nauka", + "defi-page": "DeFi - Zdecentralizowane finanse", "design": "Projekt", "design-principles": "Zasady projektowania", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Autorzy", "nav-developers-docs": "Dokumentacja deweloperów", "nav-primary": "Podstawowe", - "nft-page": "Tokeny niewymienialne (NFT)", + "nft-page": "NFT - Tokeny niewymienialne", "nfts": "Tokeny NFT", "no": "Nie", "on-this-page": "Na tej stronie", @@ -165,7 +165,7 @@ "return-home": "wróć do strony głównej", "roadmap": "Mapa drogowa Ethereum", "resources": "Zasoby do tłumaczenia", - "regenerative-finance": "Finanse regeneracyjne (ReFi)", + "regenerative-finance": "ReFi - Finanse regeneracyjne", "run-a-node": "Dodaj węzeł", "rollup-component-website": "Strona internetowa", "rollup-component-developer-docs": "Dokumentacja dewelopera", diff --git a/src/intl/pt-br/common.json b/src/intl/pt-br/common.json index 9b36306b79e..8820c43ae06 100644 --- a/src/intl/pt-br/common.json +++ b/src/intl/pt-br/common.json @@ -31,14 +31,14 @@ "copied": "Copiado", "copy": "Copiar", "danksharding": "Danksharding", - "dao-page": "Organizações autônomas descentralizadas (DAOs)", + "dao-page": "DAOs - Organizações autônomas descentralizadas", "dark-mode": "Escuro", "data-provided-by": "Fonte de dados:", "decentralized-applications-dapps": "Aplicativos descentralizados (dapps)", "decentralized-identity": "Identidade descentralizada", "decentralized-social-networks": "Redes sociais descentralizadas", - "decentralized-science": "Ciência descentralizada (DeSci)", - "defi-page": "Finanças descentralizadas (DeFi)", + "decentralized-science": "DeSci - Ciência descentralizada", + "defi-page": "DeFi - Finanças descentralizadas", "design": "Visual", "design-principles": "Princípios do design", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Desenvolvedores", "nav-developers-docs": "Documentação para o desenvolvedor", "nav-primary": "Principal", - "nft-page": "Tokens não fungíveis (NFTs)", + "nft-page": "NFTs - Tokens não fungíveis", "nfts": "NFTs (Tokens Não Fungíveis)", "no": "Não", "on-this-page": "Nesta página", @@ -165,7 +165,7 @@ "return-home": "Voltar ao início", "roadmap": "Planejamento Ethereum", "resources": "Recursos de tradução", - "regenerative-finance": "Finanças regenerativas (ReFi)", + "regenerative-finance": "ReFi - Finanças regenerativas", "run-a-node": "Executar um nó", "rollup-component-website": "Site", "rollup-component-developer-docs": "Documentação para o desenvolvedor", diff --git a/src/intl/pt/common.json b/src/intl/pt/common.json index d31426c166c..bd172292ac8 100644 --- a/src/intl/pt/common.json +++ b/src/intl/pt/common.json @@ -20,14 +20,14 @@ "copied": "Copiado", "copy": "Copiar", "danksharding": "Danksharding", - "dao-page": "Organizações Autónomas Descentralizadas (DAO)", + "dao-page": "DAO - Organizações Autónomas Descentralizadas", "dark-mode": "Escuro", "data-provided-by": "Origem dos dados:", "decentralized-applications-dapps": "Aplicações descentralizadas (dapps)", "decentralized-identity": "Identidade descentralizada", "decentralized-social-networks": "Redes sociais descentralizadas", - "decentralized-science": "Ciência Descentralizada (DeSci)", - "defi-page": "Finanças descentralizadas (DeFi)", + "decentralized-science": "DeSci - Ciência Descentralizada", + "defi-page": "DeFi - Finanças descentralizadas", "devcon": "Devcon", "developers": "Programadores", "developers-home": "Menu para Programadores", @@ -132,7 +132,7 @@ "nav-developers": "Programadores", "nav-developers-docs": "Documentos de programadores", "nav-primary": "Principal", - "nft-page": "Tokens não fungíveis (NFTs)", + "nft-page": "NFTs - Tokens não fungíveis", "nfts": "NFT", "no": "Não", "on-this-page": "Nesta página", @@ -151,7 +151,7 @@ "return-home": "voltar à página principal", "roadmap": "Roteiro Ethereum", "resources": "Recursos de tradução", - "regenerative-finance": "Finanças regenerativas (ReFi)", + "regenerative-finance": "ReFi - Finanças regenerativas", "run-a-node": "Executar um nó", "rollup-component-website": "Website", "rollup-component-developer-docs": "Documentos de programadores", diff --git a/src/intl/ro/common.json b/src/intl/ro/common.json index 47bf5795da8..dc5cf039b43 100644 --- a/src/intl/ro/common.json +++ b/src/intl/ro/common.json @@ -20,14 +20,14 @@ "copied": "Copiat", "copy": "Copiați", "danksharding": "Danksharding", - "dao-page": "Organizațiile autonome descentralizate (DAO)", + "dao-page": "DAO - Organizațiile autonome descentralizate", "dark-mode": "Fundal întunecat", "data-provided-by": "Sursa datelor:", "decentralized-applications-dapps": "Aplicații descentralizate (dapp)", "decentralized-identity": "Identitate descentralizată", "decentralized-social-networks": "Rețele sociale descentralizate", - "decentralized-science": "Știința descentralizată (DeSci)", - "defi-page": "Finanțele descentralizate (DeFi)", + "decentralized-science": "DeSci - Știința descentralizată", + "defi-page": "DeFi - Finanțele descentralizate", "devcon": "Devcon", "developers": "Dezvoltatori", "developers-home": "Pagina de pornire pentru dezvoltatori", @@ -132,7 +132,7 @@ "nav-developers": "Dezvoltatori", "nav-developers-docs": "Documente dezvoltator", "nav-primary": "Principal", - "nft-page": "Tokenuri nefungibile (NFT)", + "nft-page": "NFT - Tokenuri nefungibile", "nfts": "NFT-uri", "no": "Nu", "on-this-page": "Pe această pagină", @@ -151,7 +151,7 @@ "return-home": "înapoi la pagina principală", "roadmap": "Parcurs Ethereum", "resources": "Resurse de traducere", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Rulați un nod", "rollup-component-website": "Site web", "rollup-component-developer-docs": "Documente programator", diff --git a/src/intl/ru/common.json b/src/intl/ru/common.json index ac646cd9838..75e2d4b861e 100644 --- a/src/intl/ru/common.json +++ b/src/intl/ru/common.json @@ -31,14 +31,14 @@ "copied": "Скопировано", "copy": "Копировать", "danksharding": "Данкшардинг", - "dao-page": "Децентрализованные автономные организации (DAO)", + "dao-page": "DAO - Децентрализованные автономные организации", "dark-mode": "Темная", "data-provided-by": "Источник данных:", "decentralized-applications-dapps": "Децентрализованные приложения (dapps)", "decentralized-identity": "Децентрализованная идентификация", "decentralized-social-networks": "Децентрализованные социальные сети", - "decentralized-science": "Децентрализованная наука (DeSci)", - "defi-page": "Децентрализованные финансы (DeFi)", + "decentralized-science": "DeSci - Децентрализованная наука", + "defi-page": "DeFi - Децентрализованные финансы", "design": "Дизайн", "design-principles": "Принципы дизайна", "devcon": "Девкон", @@ -146,7 +146,7 @@ "nav-developers": "Разработчикам", "nav-developers-docs": "Документация для разработчиков", "nav-primary": "Основной", - "nft-page": "Невзаимозаменяемые токены (NFT)", + "nft-page": "NFT - Невзаимозаменяемые токены", "nfts": "NFT", "no": "Нет", "on-this-page": "На этой странице", @@ -165,7 +165,7 @@ "return-home": "Вернуться на главную", "roadmap": "Дорожная карта Ethereum", "resources": "Ресурсы для перевода", - "regenerative-finance": "Регенеративные финансы (ReFi)", + "regenerative-finance": "ReFi - Регенеративные финансы", "run-a-node": "Запуск узла", "rollup-component-website": "Сайт", "rollup-component-developer-docs": "Документация для разработчиков", diff --git a/src/intl/se/common.json b/src/intl/se/common.json index 64c07275cc7..5a20cdf01de 100644 --- a/src/intl/se/common.json +++ b/src/intl/se/common.json @@ -20,14 +20,14 @@ "copied": "Kopierad", "copy": "Kopiera", "danksharding": "Danksharding", - "dao-page": "Decentraliserade autonoma organisationer (DAO)", + "dao-page": "DAO - Decentraliserade autonoma organisationer", "dark-mode": "Mörkt", "data-provided-by": "Datakälla:", "decentralized-applications-dapps": "Decentraliserade program (dapps)", "decentralized-identity": "Decentraliserad identitet", "decentralized-social-networks": "Decentraliserade sociala nätverk", - "decentralized-science": "Decentraliserad vetenskap (DeSci)", - "defi-page": "Decentraliserad finansiering (DeFi)", + "decentralized-science": "DeSci - Decentraliserad vetenskap", + "defi-page": "DeFi - Decentraliserad finansiering", "devcon": "Devcon", "developers": "Utvecklare", "developers-home": "Startsida för utvecklare", @@ -129,7 +129,7 @@ "nav-developers": "Utvecklare", "nav-developers-docs": "Utvecklardokument", "nav-primary": "Primär", - "nft-page": "Icke-fungibla polletter (NFT)", + "nft-page": "NFT - Icke-fungibla polletter", "nfts": "NFT:er", "no": "Nej", "on-this-page": "På denna sida", diff --git a/src/intl/sk/common.json b/src/intl/sk/common.json index 7d7e602c70e..e30dd1937ee 100644 --- a/src/intl/sk/common.json +++ b/src/intl/sk/common.json @@ -20,14 +20,14 @@ "copied": "Skopírované", "copy": "Kopírovať", "danksharding": "Danksharding", - "dao-page": "Decentralizované autonómne organizácie (DAO)", + "dao-page": "DAO - Decentralizované autonómne organizácie", "dark-mode": "Tmavé", "data-provided-by": "Zdroj dát:", "decentralized-applications-dapps": "Decentralizované aplikácie (dapp)", "decentralized-identity": "Decentralizovaná identita", "decentralized-social-networks": "Decentralizovaná sociálna sieť", - "decentralized-science": "Decentralizovaná veda (DeSci)", - "defi-page": "Decentralizované finančníctvo (DeFi)", + "decentralized-science": "DeSci - Decentralizovaná veda", + "defi-page": "DeFi - Decentralizované finančníctvo", "devcon": "Developerská konferencia", "developers": "Vývojári", "developers-home": "Domovská stránka pre vývojárov", @@ -132,7 +132,7 @@ "nav-developers": "Pre vývojárov", "nav-developers-docs": "Vývojárske dokumenty", "nav-primary": "Primárne", - "nft-page": "Non-fungible tokeny (NFT)", + "nft-page": "NFT - Non-fungible tokeny", "nfts": "NFT-čka", "no": "Nie", "on-this-page": "Na tejto stránke", @@ -151,7 +151,7 @@ "return-home": "návrat domov", "roadmap": "Cestovná mapa Etherea", "resources": "Zdroje prekladu", - "regenerative-finance": "Regeneratívne finančníctvo (ReFi)", + "regenerative-finance": "ReFi - Regeneratívne finančníctvo", "run-a-node": "Spustiť uzol", "rollup-component-website": "Website", "rollup-component-developer-docs": "Vývojárske dokumenty", diff --git a/src/intl/sl/common.json b/src/intl/sl/common.json index 626cd0f80ec..fbca9467874 100644 --- a/src/intl/sl/common.json +++ b/src/intl/sl/common.json @@ -20,14 +20,14 @@ "copied": "Kopirano", "copy": "Kopiraj", "danksharding": "Dankovo drobljenje", - "dao-page": "Decentralizirane avtonomne organizacije (DAO)", + "dao-page": "DAO - Decentralizirane avtonomne organizacije", "dark-mode": "Temno", "data-provided-by": "Vir podatkov:", "decentralized-applications-dapps": "Decentralizirane aplikacije (dapps)", "decentralized-identity": "Decentralizirana identiteta", "decentralized-social-networks": "Decentralizirana družabna omrežja", - "decentralized-science": "Decentralizirana znanost (DeSci)", - "defi-page": "Decentralizirane finance (DeFi)", + "decentralized-science": "DeSci - Decentralizirana znanost", + "defi-page": "DeFi - Decentralizirane finance", "devcon": "Devcon", "developers": "Razvijalci", "developers-home": "Začetna stran za razvijalce", @@ -132,7 +132,7 @@ "nav-developers": "Razvijalci", "nav-developers-docs": "Dokumentacija za razvijalce", "nav-primary": "Primarna", - "nft-page": "Nezamenljivi žetoni (NFT-ji)", + "nft-page": "NFT-ji - Nezamenljivi žetoni", "nfts": "NFT-ji", "no": "Ne", "on-this-page": "Na tej strani", @@ -151,7 +151,7 @@ "return-home": "vrni se domov", "roadmap": "Načrt strani Ethereum", "resources": "Prevajalski viri", - "regenerative-finance": "Regenerativne finance (ReFi)", + "regenerative-finance": "ReFi - Regenerativne finance", "run-a-node": "Upravljajte vozlišče", "rollup-component-website": "Spletna stran", "rollup-component-developer-docs": "Dokumentacija za razvijalce", diff --git a/src/intl/sr/common.json b/src/intl/sr/common.json index ad80401aa17..a761f2c3eea 100644 --- a/src/intl/sr/common.json +++ b/src/intl/sr/common.json @@ -20,14 +20,14 @@ "copied": "Kopirano", "copy": "Kopiraj", "danksharding": "Fragmentacija podataka za skalabilnost (danksharding)", - "dao-page": "Decentralizovane autonomne organizacije (DAO)", + "dao-page": "DAO - Decentralizovane autonomne organizacije", "dark-mode": "Tamno", "data-provided-by": "Izvor podataka:", "decentralized-applications-dapps": "Decentralizovane aplikacije (dapps)", "decentralized-identity": "Decentralizovan identitet", "decentralized-social-networks": "Decentralizovane društvene mreže", - "decentralized-science": "Decentralizovana nauka (DeSci)", - "defi-page": "Decentralizovane finansije (DeFi)", + "decentralized-science": "DeSci - Decentralizovana nauka", + "defi-page": "DeFi - Decentralizovane finansije", "devcon": "Devcon", "developers": "Programeri", "developers-home": "Kuća programera", @@ -132,7 +132,7 @@ "nav-developers": "Programeri", "nav-developers-docs": "Dokumentacija za programere", "nav-primary": "Primarna", - "nft-page": "Nezamenljivi (NFT) tokeni", + "nft-page": "NFT - Nezamenljivi tokeni", "nfts": "Nezamenjivi tokeni", "no": "Ne", "on-this-page": "Na ovoj stranici", @@ -151,7 +151,7 @@ "return-home": "povratak na početnu stranicu", "roadmap": "Plan mreže Ethereum", "resources": "Resursi za prevođenje", - "regenerative-finance": "Regenerativne finansije (ReFi)", + "regenerative-finance": "ReFi - Regenerativne finansije", "run-a-node": "Pokretanje čvora", "rollup-component-website": "Veb-sajt", "rollup-component-developer-docs": "Dokumentacija za programere", diff --git a/src/intl/sw/common.json b/src/intl/sw/common.json index b1f3f07fec7..55aa99fa565 100644 --- a/src/intl/sw/common.json +++ b/src/intl/sw/common.json @@ -20,14 +20,14 @@ "copied": "Imenakiliwa", "copy": "Nakala", "danksharding": "Ugawanyikaji wa Dank", - "dao-page": "Mashirika huru yasiyotawaliwa (DAOs)", + "dao-page": "DAOs - Mashirika huru yasiyotawaliwa", "dark-mode": "Giza", "data-provided-by": "Chanzo cha taarifa:", "decentralized-applications-dapps": "Programu zisizoendeshwa na benki kuu wala serikali (dapps)", "decentralized-identity": "Utambulisho uliogatuliwa", "decentralized-social-networks": "Mitandao ya kijamiii iliogatuliwa", - "decentralized-science": "Sayansi iliogatuliwa (DeSci)", - "defi-page": "Fedha zisizotawalia (DeFi)", + "decentralized-science": "DeSci - Sayansi iliogatuliwa", + "defi-page": "DeFi - Fedha zisizotawalia", "devcon": "Devkon", "developers": "Wasanidi programu", "developers-home": "Nyumba ya Wasanidi Programu", @@ -132,7 +132,7 @@ "nav-developers": "Wasanidi programu", "nav-developers-docs": "Nyaraka za wasanidi programu", "nav-primary": "Msingi", - "nft-page": "Ishara zisizoambukiza (NFTs)", + "nft-page": "NFTs - Ishara zisizoambukiza", "nfts": "NFTs", "no": "Hapana", "on-this-page": "Juu ya ukurasa huu", @@ -151,7 +151,7 @@ "return-home": "rudi nyumbani", "roadmap": "Barabara ya Ethereum", "resources": "Rasilimali za tafsiri", - "regenerative-finance": "Uzalishaji upya wa fedha (ReFi)", + "regenerative-finance": "ReFi - Uzalishaji upya wa fedha", "run-a-node": "Endesha nodi", "rollup-component-website": "Tovuti", "rollup-component-developer-docs": "Nyaraka za msanidi programu", diff --git a/src/intl/ta/common.json b/src/intl/ta/common.json index 86dc3caeac4..3c5b1638327 100644 --- a/src/intl/ta/common.json +++ b/src/intl/ta/common.json @@ -20,14 +20,14 @@ "copied": "நகலெடுக்கப்பட்டது", "copy": "நகலெடு", "danksharding": "டான்க்ஷார்டிங்", - "dao-page": "பன்முனைப்படுத்தப்பட்ட தன்னாட்சி அமைப்புகள் (DAOs)", + "dao-page": "DAOs - பன்முனைப்படுத்தப்பட்ட தன்னாட்சி அமைப்புகள்", "dark-mode": "அடர்நிறம்", "data-provided-by": "தரவு மூலம்:", "decentralized-applications-dapps": "பன்முனைச் செயலிகள் (dapps)", "decentralized-identity": "பன்முனைப்படுத்தப்பட்ட அடையாளம்", "decentralized-social-networks": "பன்முனைப்படுத்தப்பட்ட சமூக வலைப்பின்னல்கள்", - "decentralized-science": "பன்முனை அறிவியல் (DeSci)", - "defi-page": "பன்முனைப்படுத்தப்பட்ட நிதி (DeFi)", + "decentralized-science": "DeSci - பன்முனை அறிவியல்", + "defi-page": "DeFi - பன்முனைப்படுத்தப்பட்ட நிதி", "devcon": "டெவ்கான்", "developers": "உருவாக்குநர்கள் (டெவலப்பர்கள்)", "developers-home": "உருவாக்குநர்களின் முகப்பு", @@ -132,7 +132,7 @@ "nav-developers": "உருவாக்குநர்கள் (டெவலப்பர்கள்)", "nav-developers-docs": "உருவாக்குநர்களின் ஆவணங்கள்", "nav-primary": "முதன்மை", - "nft-page": "மாற்ற முடியாத டோக்கன்கள் (NFTs)", + "nft-page": "NFTs - மாற்ற முடியாத டோக்கன்கள்", "nfts": "NFTs", "no": "இல்லை", "on-this-page": "இந்தப் பக்கத்தில்", @@ -151,7 +151,7 @@ "return-home": "முகப்புக்குச் செல்", "roadmap": "எத்தீரியம் திட்டப்படம்", "resources": "மொழிபெயர்ப்பு ஆதாரங்கள்", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "முனையை இயக்கு", "rollup-component-website": "வலைத்தளம்", "rollup-component-developer-docs": "உருவாக்குநர்களின் ஆவணங்கள்", diff --git a/src/intl/th/common.json b/src/intl/th/common.json index 65ea4470ce0..2690d52f42f 100644 --- a/src/intl/th/common.json +++ b/src/intl/th/common.json @@ -20,14 +20,14 @@ "copied": "คัดลอกแล้ว", "copy": "คัดลอก", "danksharding": "Danksharding", - "dao-page": "การบริหารองค์กรอัตโนมัติด้วยระบบ Decentralized (DAOs)", + "dao-page": "DAOs - การบริหารองค์กรอัตโนมัติด้วยระบบ Decentralized", "dark-mode": "โหมดมืด", "data-provided-by": "แหล่งข้อมูล:", "decentralized-applications-dapps": "แอปพลิเคชันไร้ศูนย์กลาง (dApp)", "decentralized-identity": "ตัวตนแบบกระจายศูนย์", "decentralized-social-networks": "เครือข่ายสังคมแบบกระจายศูนย์", - "decentralized-science": "วิทยาศาสตร์แบบ Decentralized (DeSci)", - "defi-page": "ระบบการเงินแบบ Decentralized (DeFi)", + "decentralized-science": "DeSci - วิทยาศาสตร์แบบ Decentralized", + "defi-page": "DeFi - ระบบการเงินแบบ Decentralized", "devcon": "Devcon", "developers": "นักพัฒนา", "developers-home": "หน้าแรกของนักพัฒนา", @@ -132,7 +132,7 @@ "nav-developers": "นักพัฒนา", "nav-developers-docs": "เอกสารสำหรับนักพัฒนา", "nav-primary": "หลัก", - "nft-page": "Non-fungible tokens (NFTs)", + "nft-page": "NFTs - Non-fungible tokens", "nfts": "NFT", "no": "ไม่", "on-this-page": "ในหน้านี้", @@ -151,7 +151,7 @@ "return-home": "กลับไปหน้าแรก", "roadmap": "แผนงานอีเธอเรียม", "resources": "แหล่งข้อมูลการแปล", - "regenerative-finance": "ระบบการเงินแบบเกิดใหม่ (ReFi)", + "regenerative-finance": "ReFi - ระบบการเงินแบบเกิดใหม่", "run-a-node": "รันโหนด", "rollup-component-website": "เว็บไซต์", "rollup-component-developer-docs": "เอกสารสำหรับนักพัฒนา", diff --git a/src/intl/tk/common.json b/src/intl/tk/common.json index d960e8b8e00..8bc0241ce20 100644 --- a/src/intl/tk/common.json +++ b/src/intl/tk/common.json @@ -20,14 +20,14 @@ "copied": "Göçürildi", "copy": "Göçürmek", "danksharding": "Danksharding", - "dao-page": "Merkezleşdirilmedik awtonom guramalar (DAO-lar)", + "dao-page": "DAO-lar - Merkezleşdirilmedik awtonom guramalar", "dark-mode": "Gara", "data-provided-by": "Maglumat çeşmesi:", "decentralized-applications-dapps": "Merkezleşdirilmedik programmalar(dapps)", "decentralized-identity": "Merkezleşdirilmedik şahsyýet", "decentralized-social-networks": "Merkezleşdirilmedik sosial ulgamlar", - "decentralized-science": "Merkezleşdirilmedik ylym (DeSci)", - "defi-page": "Merkezleşdirilmedik maliýe (DeFi)", + "decentralized-science": "DeSci - Merkezleşdirilmedik ylym", + "defi-page": "DeFi - Merkezleşdirilmedik maliýe", "devcon": "Devcon", "developers": "Işläp düzüjiler", "developers-home": "Işläp düzüjileriň öýi", @@ -132,7 +132,7 @@ "nav-developers": "Döredijiler", "nav-developers-docs": "Işläp düzüji resminamalary", "nav-primary": "Esasy", - "nft-page": "Özara çalşylmaýan tokenler (NFT-lar)", + "nft-page": "NFT-lar - Özara çalşylmaýan tokenler", "nfts": "NFT-lar", "no": "Ýok", "on-this-page": "Bu sahypada", @@ -151,7 +151,7 @@ "return-home": "baş sahypa dolanmak", "roadmap": "Ethereum ýol kartasy", "resources": "Terjime gorlary", - "regenerative-finance": "Regenerative finance (ReFi)", + "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Düwün işlediň", "rollup-component-website": "Website", "rollup-component-developer-docs": "Işläp düzüji resminamalary", diff --git a/src/intl/tr/common.json b/src/intl/tr/common.json index aac93513867..5ce9326e8ee 100644 --- a/src/intl/tr/common.json +++ b/src/intl/tr/common.json @@ -31,14 +31,14 @@ "copied": "Kopyalandı", "copy": "Kopyala", "danksharding": "Danksharding", - "dao-page": "Merkezi olmayan özerk kuruluşlar (DAO'lar)", + "dao-page": "DAO'lar - Merkezi olmayan özerk kuruluşlar", "dark-mode": "Koyu", "data-provided-by": "Veri kaynağı:", "decentralized-applications-dapps": "Merkezi olmayan uygulamalar (dapps)", "decentralized-identity": "Merkezî olmayan kimlik", "decentralized-social-networks": "Merkezî olmayan sosyal ağlar", - "decentralized-science": "Merkeziyetsiz bilim (DeSci)", - "defi-page": "Merkezi Olmayan Finans (DeFi)", + "decentralized-science": "DeSci - Merkeziyetsiz bilim", + "defi-page": "DeFi - Merkezi Olmayan Finans", "design": "Tasarım", "design-principles": "Tasarım İlkeleri", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "Geliştiriciler", "nav-developers-docs": "Geliştirici dokümanları", "nav-primary": "Birincil", - "nft-page": "Değiştirilemeyen tokenler (NFT'ler)", + "nft-page": "NFT'ler - Değiştirilemeyen tokenler", "nfts": "NFT'ler", "no": "Hayır", "on-this-page": "Bu sayfada", @@ -165,7 +165,7 @@ "return-home": "ana sayfaya dön", "roadmap": "Ethereum yol haritası", "resources": "Çeviri kaynakları", - "regenerative-finance": "Sürdürülebilir finans (SüFi)", + "regenerative-finance": "SüFi - Sürdürülebilir finans", "run-a-node": "Bir düğüm çalıştırın", "rollup-component-website": "Web sitesi", "rollup-component-developer-docs": "Geliştirici dokümanları", diff --git a/src/intl/uk/common.json b/src/intl/uk/common.json index 438ea551078..8447c239f11 100644 --- a/src/intl/uk/common.json +++ b/src/intl/uk/common.json @@ -20,14 +20,14 @@ "copied": "Скопійовано", "copy": "Копіювати", "danksharding": "Данксегментування", - "dao-page": "Децентралізовані автономні організації (DAO)", + "dao-page": "DAO - Децентралізовані автономні організації", "dark-mode": "Темний", "data-provided-by": "Джерело даних:", "decentralized-applications-dapps": "Децентралізовані програми (dapps)", "decentralized-identity": "Децентралізована ідентичність", "decentralized-social-networks": "Децентралізовані соціальні мережі", - "decentralized-science": "Децентралізована наука (DeSci)", - "defi-page": "Децентралізовані фінанси (DeFi)", + "decentralized-science": "DeSci - Децентралізована наука", + "defi-page": "DeFi - Децентралізовані фінанси", "devcon": "Devcon", "developers": "Розробникам", "developers-home": "Головна сторінка для розробників", @@ -132,7 +132,7 @@ "nav-developers": "Розробники", "nav-developers-docs": "Документація для розробників", "nav-primary": "Головна", - "nft-page": "Невзаємозамінні токени (NFT)", + "nft-page": "NFT - Невзаємозамінні токени", "nfts": "NFT", "no": "Ні", "on-this-page": "На цій сторінці", @@ -151,7 +151,7 @@ "return-home": "поверніться на головну сторінку", "roadmap": "План розвитку Ethereum", "resources": "Ресурси для перекладу", - "regenerative-finance": "Регенеративні фінанси (ReFi)", + "regenerative-finance": "ReFi - Регенеративні фінанси", "run-a-node": "Запуск вузла", "rollup-component-website": "Сайт", "rollup-component-developer-docs": "Документація для розробників", diff --git a/src/intl/ur/common.json b/src/intl/ur/common.json index fcf72b63e7d..31ab7496f8f 100644 --- a/src/intl/ur/common.json +++ b/src/intl/ur/common.json @@ -19,7 +19,7 @@ "dark-mode": "گہرا", "data-provided-by": "ڈیٹا کا ذریعہ:", "decentralized-applications-dapps": "غیر مرکزی ایپلیکیشنز (dapps)", - "decentralized-science": "غیر مرکزی سائنس (DeSci)", + "decentralized-science": "DeSci - غیر مرکزی سائنس", "devcon": "ڈیوکون", "developers": "ڈویلپرز", "developers-home": "ڈویلپرز کا ہوم", @@ -155,9 +155,9 @@ "website-last-updated": "ویب سائٹ آخری بار اپ ڈیٹ کی گئی", "what-is-ether": "ایتھر (ETH) کیا ہے؟", "what-is-ethereum": "Ethereum کیا ہے؟", - "defi-page": "غیر مرکزی مالیات (DeFi)", - "dao-page": "غیر مرکزی خودمختار تنظیمیں (DAOs)", - "nft-page": "نان فنجیبل ٹوکنز (NFTs)", + "defi-page": "DeFi - غیر مرکزی مالیات", + "dao-page": "DAOs - غیر مرکزی خودمختار تنظیمیں", + "nft-page": "NFTs - نان فنجیبل ٹوکنز", "decentralized-social-networks": "غیر مرکزی سوشل نیٹ ورکس", "decentralized-identity": "غیر مرکزی شناخت", "yes": "جی ہاں", diff --git a/src/intl/uz/common.json b/src/intl/uz/common.json index 070b7be26b2..2cc33a7d5ee 100644 --- a/src/intl/uz/common.json +++ b/src/intl/uz/common.json @@ -19,7 +19,7 @@ "dark-mode": "Tungi", "data-provided-by": "Ma'lumotlar manbai:", "decentralized-applications-dapps": "Markazlashtirilmagan ilovalar (dapps)", - "decentralized-science": "Decentralized science (DeSci)", + "decentralized-science": "DeSci - Decentralized science", "devcon": "Devcon", "developers": "Ishlab chiquvchilar", "developers-home": "Dasturchilar bosh sahifasi", @@ -145,9 +145,9 @@ "website-last-updated": "Sahifa oxirgi marta yangilandi", "what-is-ether": "Ether (ETH) nima?", "what-is-ethereum": "Ethereum bu nima?", - "defi-page": "Markazlashmagan moliya (DeFi)", - "dao-page": "Markazlashmagan avtonom tashkilotlar (DAO)", - "nft-page": "Unikal tokenlar (NFT)", + "defi-page": "DeFi - Markazlashmagan moliya", + "dao-page": "DAO - Markazlashmagan avtonom tashkilotlar", + "nft-page": "NFT - Unikal tokenlar", "decentralized-social-networks": "Markazlashmagan ijtimoiy tarmoqlar", "decentralized-identity": "Markazlashmagan identifikatsiya", "yes": "Ha", diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json index 6aedca8c844..e3434143e4c 100644 --- a/src/intl/vi/common.json +++ b/src/intl/vi/common.json @@ -20,14 +20,14 @@ "copied": "Đã sao chép", "copy": "Sao chép", "danksharding": "Danksharding", - "dao-page": "Tổ chức tự trị phi tập trung (DAO)", + "dao-page": "DAO - Tổ chức tự trị phi tập trung", "dark-mode": "Chế độ tối", "data-provided-by": "Nguồn dữ liệu:", "decentralized-applications-dapps": "Ứng dụng phi tập trung (dapps)", "decentralized-identity": "Nhận dạng phi tập trung", "decentralized-social-networks": "Mạng xã hội phi tập trung", - "decentralized-science": "Ngành khoa học phi tập trung (DeSci)", - "defi-page": "Tài chính phi tập trung (DeFi)", + "decentralized-science": "DeSci - Ngành khoa học phi tập trung", + "defi-page": "DeFi - Tài chính phi tập trung", "devcon": "Hội nghị các nhà phát triển", "developers": "Nhà phát triển", "developers-home": "Trang chủ dành cho nhà phát triển", @@ -132,7 +132,7 @@ "nav-developers": "Nhà phát triển", "nav-developers-docs": "Tài liệu dành cho nhà phát triển", "nav-primary": "Chính", - "nft-page": "Non-Fungible Token (NFT)", + "nft-page": "NFT - Non-Fungible Token", "nfts": "Các NFT", "no": "Không", "on-this-page": "Trên trang này", @@ -151,7 +151,7 @@ "return-home": "Trở về trang chủ", "roadmap": "Lộ trình Ethereum", "resources": "Tài nguyên dịch thuật", - "regenerative-finance": "Tài chính tái tạo (ReFi)", + "regenerative-finance": "ReFi - Tài chính tái tạo", "run-a-node": "Vận hành một nút", "rollup-component-website": "Trang web", "rollup-component-developer-docs": "Tài liệu dành cho nhà phát triển", diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index 74adfb3fba1..bc3e55b472a 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -31,14 +31,14 @@ "copied": "已複製", "copy": "複製", "danksharding": "Danksharding", - "dao-page": "去中心化自治組織 (DAO)", + "dao-page": "DAO - 去中心化自治組織", "dark-mode": "深色模式", "data-provided-by": "資料來源:", "decentralized-applications-dapps": "去中心化應用程式 (dapp)", "decentralized-identity": "去中心化身分", "decentralized-social-networks": "去中心化社群網路", - "decentralized-science": "去中心化科研 (DeSci)", - "defi-page": "去中心化金融 (DeFi)", + "decentralized-science": "DeSci - 去中心化科研", + "defi-page": "DeFi - 去中心化金融", "design": "設計", "design-principles": "設計理念", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "開發者", "nav-developers-docs": "開發者文件", "nav-primary": "主要導覽", - "nft-page": "非同質化代幣 (NFT)", + "nft-page": "NFT - 非同質化代幣", "nfts": "非同質化代幣", "no": "否", "on-this-page": "在本頁面", @@ -165,7 +165,7 @@ "return-home": "返回首頁", "roadmap": "以太坊開發藍圖", "resources": "翻譯資源", - "regenerative-finance": "再生金融 (ReFi)", + "regenerative-finance": "ReFi - 再生金融", "run-a-node": "執行節點", "rollup-component-website": "網站", "rollup-component-developer-docs": "開發者文件", diff --git a/src/intl/zh/common.json b/src/intl/zh/common.json index 995b26658b2..577074f8ea5 100644 --- a/src/intl/zh/common.json +++ b/src/intl/zh/common.json @@ -31,14 +31,14 @@ "copied": "已复制", "copy": "复制", "danksharding": "Danksharding", - "dao-page": "去中心化自治组织 (DAO)", + "dao-page": "DAO - 去中心化自治组织", "dark-mode": "深色模式", "data-provided-by": "数据来源:", "decentralized-applications-dapps": "去中心化应用程序 (dapps)", "decentralized-identity": "去中心化身份", "decentralized-social-networks": "去中心化社交网络", - "decentralized-science": "去中心化科学 (DeSci)", - "defi-page": "去中心化金融 (DeFi)", + "decentralized-science": "DeSci - 去中心化科学", + "defi-page": "DeFi - 去中心化金融", "design": "设计", "design-principles": "设计原则", "devcon": "Devcon", @@ -146,7 +146,7 @@ "nav-developers": "开发者", "nav-developers-docs": "开发者文档", "nav-primary": "主导航", - "nft-page": "非同质化代币 (NFT)", + "nft-page": "NFT - 非同质化代币", "nfts": "非同质化代币", "no": "否", "on-this-page": "在本页面", From 7438ac3026191365983289406375ad9007d8597f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 16 Feb 2024 19:13:17 -0800 Subject: [PATCH 360/478] refactor: extract getOgImage util --- src/components/PageMetadata.tsx | 31 +++++++++---------------------- src/lib/constants.ts | 1 + src/lib/utils/metadata.ts | 25 +++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 src/lib/utils/metadata.ts diff --git a/src/components/PageMetadata.tsx b/src/components/PageMetadata.tsx index 56ecb903c5c..1be364f6d03 100644 --- a/src/components/PageMetadata.tsx +++ b/src/components/PageMetadata.tsx @@ -4,6 +4,8 @@ import Head from "next/head" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" +import { getOgImage } from "@/lib/utils/metadata" + import { DEFAULT_LOCALE, SITE_URL } from "@/lib/constants" type NameMeta = { @@ -58,41 +60,26 @@ const PageMetadata = ({ const canonical = canonicalUrl || url /* Set fallback ogImage based on path */ - let ogImage = "/home/hero.png" - - if (slug.includes("developers")) { - ogImage = "/enterprise-eth.png" - } - - if (slug.includes("dapps")) { - ogImage = "/doge-computer.png" - } - - if (slug.includes("roadmap")) { - ogImage = "/upgrades/upgrade_doge.png" - } - - if (image) { - ogImage = image - } + const ogImage = image || getOgImage(slug) const ogImageUrl = new URL(ogImage, SITE_URL).href const metadata: Meta[] = [ - { name: `description`, content: desc }, { name: `image`, content: ogImageUrl }, - { property: `og:title`, content: fullTitle }, - { property: `og:description`, content: desc }, - { property: `og:type`, content: `website` }, + { name: `description`, content: desc }, + { name: `docsearch:description`, content: desc }, { name: `twitter:card`, content: `summary_large_image` }, { name: `twitter:creator`, content: author || siteTitle }, { name: `twitter:site`, content: author || siteTitle }, { name: `twitter:title`, content: fullTitle }, { name: `twitter:description`, content: desc }, { name: `twitter:image`, content: ogImageUrl }, + { property: `og:title`, content: fullTitle }, + { property: `og:locale`, content: locale! }, + { property: `og:description`, content: desc }, + { property: `og:type`, content: `website` }, { property: `og:url`, content: url }, { property: `og:image`, content: ogImageUrl }, { property: `og:site_name`, content: siteTitle }, - { name: `docsearch:description`, content: desc }, ] return ( diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 5caae99081f..3b2be72ad83 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -23,6 +23,7 @@ export const DISCORD_PATH = "/discord/" export const EDIT_CONTENT_URL = `https://github.com/ethereum/ethereum-org-website/tree/dev/` export const MAIN_CONTENT_ID = "main-content" export const WEBSITE_EMAIL = "website@ethereum.org" +export const DEFAULT_OG_IMAGE = "/home/hero.png" // Config export const CONTENT_IMAGES_MAX_WIDTH = 800 diff --git a/src/lib/utils/metadata.ts b/src/lib/utils/metadata.ts new file mode 100644 index 00000000000..eac481d8bb1 --- /dev/null +++ b/src/lib/utils/metadata.ts @@ -0,0 +1,25 @@ +import { DEFAULT_OG_IMAGE } from "@/lib/constants" + +/** + * List of default og images for different sections + */ +const imageForSlug = [ + { section: "developers", image: "/enterprise-eth.png" }, + { section: "dapps", image: "/doge-computer.png" }, + { section: "roadmap", image: "/upgrades/upgrade_doge.png" }, +] as const + +/** + * Get the default OG image for a page based on the slug + * @param slug - the slug of the page + * @returns relative path of image + */ +export const getOgImage = (slug: string[]): string => { + let result = DEFAULT_OG_IMAGE + for (const item of imageForSlug) { + if (slug.includes(item.section)) { + result = item.image + } + } + return result +} From acc20cbc789604276193ccacb117a6f38e03c7b1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 16 Feb 2024 19:14:32 -0800 Subject: [PATCH 361/478] feat: add/update page og images --- src/lib/utils/metadata.ts | 8 +++++--- src/pages/community.tsx | 1 + src/pages/dapps.tsx | 3 +-- src/pages/developers/index.tsx | 1 + src/pages/eth.tsx | 3 +-- src/pages/layer-2.tsx | 1 + src/pages/learn.tsx | 1 + src/pages/quizzes.tsx | 1 + src/pages/run-a-node.tsx | 1 + src/pages/stablecoins.tsx | 1 + src/pages/staking/index.tsx | 1 + src/pages/wallets/find-wallet.tsx | 1 + src/pages/wallets/index.tsx | 1 + 13 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/lib/utils/metadata.ts b/src/lib/utils/metadata.ts index eac481d8bb1..9b9463817c7 100644 --- a/src/lib/utils/metadata.ts +++ b/src/lib/utils/metadata.ts @@ -4,9 +4,11 @@ import { DEFAULT_OG_IMAGE } from "@/lib/constants" * List of default og images for different sections */ const imageForSlug = [ - { section: "developers", image: "/enterprise-eth.png" }, - { section: "dapps", image: "/doge-computer.png" }, - { section: "roadmap", image: "/upgrades/upgrade_doge.png" }, + { section: "developers", image: "/heroes/developers-hub-hero.jpg" }, + { section: "roadmap", image: "/heroes/roadmap-hub-hero.jpg" }, + { section: "guides", image: "/heroes/guides-hub-hero.jpg" }, + { section: "community", image: "/heroes/community-hero.png" }, + { section: "staking", image: "/upgrades/upgrade_rhino.png" }, ] as const /** diff --git a/src/pages/community.tsx b/src/pages/community.tsx index 6a35d7cf857..e485261a8d3 100644 --- a/src/pages/community.tsx +++ b/src/pages/community.tsx @@ -226,6 +226,7 @@ const CommunityPage = () => { diff --git a/src/pages/dapps.tsx b/src/pages/dapps.tsx index 4fa2dbb40cc..1284be4fc3c 100644 --- a/src/pages/dapps.tsx +++ b/src/pages/dapps.tsx @@ -115,7 +115,6 @@ import zapper from "@/public/dapps/zapper.png" import zerion from "@/public/dapps/zerion.png" import developers from "@/public/developers-eth-blocks.png" // Handled inside Callout => height=200 import doge from "@/public/doge-computer.png" // HERO, full? 624px -import ogImage from "@/public/doge-computer.png" // PageMetadata, src only import oneinch from "@/public/exchanges/1inch.png" import magicians from "@/public/magicians.png" import wallet from "@/public/wallet.png" // width=300 @@ -1335,7 +1334,7 @@ const DappsPage = () => { diff --git a/src/pages/developers/index.tsx b/src/pages/developers/index.tsx index d2f51051382..e11eb6d92a9 100644 --- a/src/pages/developers/index.tsx +++ b/src/pages/developers/index.tsx @@ -217,6 +217,7 @@ const DevelopersPage = () => { { diff --git a/src/pages/layer-2.tsx b/src/pages/layer-2.tsx index 77432f3c2a6..2c33dd5f125 100644 --- a/src/pages/layer-2.tsx +++ b/src/pages/layer-2.tsx @@ -253,6 +253,7 @@ const Layer2Page = () => { {/* Hero Section */} diff --git a/src/pages/learn.tsx b/src/pages/learn.tsx index ed2af2157c2..fea21c31888 100644 --- a/src/pages/learn.tsx +++ b/src/pages/learn.tsx @@ -213,6 +213,7 @@ const LearnPage = () => { diff --git a/src/pages/quizzes.tsx b/src/pages/quizzes.tsx index e0127550d23..df30fee0255 100644 --- a/src/pages/quizzes.tsx +++ b/src/pages/quizzes.tsx @@ -77,6 +77,7 @@ const QuizzesHubPage: NextPage< { diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 19b33fd371f..81c86e3aa5b 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -403,6 +403,7 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { diff --git a/src/pages/staking/index.tsx b/src/pages/staking/index.tsx index c420269de04..7a89d738b66 100644 --- a/src/pages/staking/index.tsx +++ b/src/pages/staking/index.tsx @@ -367,6 +367,7 @@ const StakingPage = ({ diff --git a/src/pages/wallets/find-wallet.tsx b/src/pages/wallets/find-wallet.tsx index 9191c340482..5239f1f0664 100644 --- a/src/pages/wallets/find-wallet.tsx +++ b/src/pages/wallets/find-wallet.tsx @@ -142,6 +142,7 @@ const FindWalletPage = () => { diff --git a/src/pages/wallets/index.tsx b/src/pages/wallets/index.tsx index 3f83bddf906..80311bc0624 100644 --- a/src/pages/wallets/index.tsx +++ b/src/pages/wallets/index.tsx @@ -267,6 +267,7 @@ const WalletsPage = () => { From 533ef488ea8329e9875c7474526cea29d84eec6a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Sat, 17 Feb 2024 11:11:14 -0800 Subject: [PATCH 362/478] fix: metadata string namespaces fixes metadata description not rendering appropriately --- src/pages/dapps.tsx | 2 +- src/pages/quizzes.tsx | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/pages/dapps.tsx b/src/pages/dapps.tsx index 1284be4fc3c..4b3d44a87a4 100644 --- a/src/pages/dapps.tsx +++ b/src/pages/dapps.tsx @@ -1333,7 +1333,7 @@ const DappsPage = () => { diff --git a/src/pages/quizzes.tsx b/src/pages/quizzes.tsx index df30fee0255..5d52582ddde 100644 --- a/src/pages/quizzes.tsx +++ b/src/pages/quizzes.tsx @@ -17,7 +17,6 @@ import QuizzesList from "@/components/Quiz/QuizzesList" import QuizzesModal from "@/components/Quiz/QuizzesModal" import QuizzesStats from "@/components/Quiz/QuizzesStats" import { useLocalQuizData } from "@/components/Quiz/useLocalQuizData" -import Translation from "@/components/Translation" import { existsNamespace } from "@/lib/utils/existsNamespace" import { getLastDeployDate } from "@/lib/utils/getLastDeployDate" @@ -56,7 +55,7 @@ export const getStaticProps = (async ({ locale }) => { const QuizzesHubPage: NextPage< InferGetStaticPropsType > = () => { - const { t } = useTranslation() + const { t } = useTranslation("learn-quizzes") const [userStats, updateUserStats] = useLocalQuizData() const [quizStatus, setQuizStatus] = useState("neutral") @@ -81,8 +80,8 @@ const QuizzesHubPage: NextPage< /> @@ -99,14 +98,14 @@ const QuizzesHubPage: NextPage< @@ -121,11 +120,11 @@ const QuizzesHubPage: NextPage< > - + {t("want-more-quizzes")} - + {t("contribute")} - + {t("add-quiz")} From e92856fcf9ff0e8d316422d019af1fca2e1d2e87 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Tue, 20 Feb 2024 17:46:19 +0100 Subject: [PATCH 363/478] add hreflangs --- src/components/PageMetadata.tsx | 23 +++++++++++++++-------- src/lib/utils/url.ts | 15 ++++++++++++++- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/components/PageMetadata.tsx b/src/components/PageMetadata.tsx index 56ecb903c5c..448e606548a 100644 --- a/src/components/PageMetadata.tsx +++ b/src/components/PageMetadata.tsx @@ -1,10 +1,10 @@ -import { join } from "path" - import Head from "next/head" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" -import { DEFAULT_LOCALE, SITE_URL } from "@/lib/constants" +import { getFullUrl } from "@/lib/utils/url" + +import { SITE_URL } from "@/lib/constants" type NameMeta = { name: string @@ -33,7 +33,7 @@ const PageMetadata = ({ canonicalUrl, author, }: PageMetadataProps) => { - const { locale, asPath } = useRouter() + const { locale, locales, asPath } = useRouter() const { t } = useTranslation() const desc = description || t("site-description") @@ -51,10 +51,7 @@ const PageMetadata = ({ * @example ethereum.org/about/ -> ethereum.org/about * @example ethereum.org/pt-br/web3/ -> ethereum.org/pt-br/web3 */ - const url = new URL( - join(locale === DEFAULT_LOCALE ? "" : locale!, path), - SITE_URL - ).href.replace(/\/$/, "") + const url = getFullUrl(locale, path) const canonical = canonicalUrl || url /* Set fallback ogImage based on path */ @@ -105,6 +102,16 @@ const PageMetadata = ({ /> ))} + {locales + ?.filter((loc) => loc !== locale) + .map((loc) => ( + + ))} ) } diff --git a/src/lib/utils/url.ts b/src/lib/utils/url.ts index 6e063ae14a9..214419d2289 100644 --- a/src/lib/utils/url.ts +++ b/src/lib/utils/url.ts @@ -1,4 +1,11 @@ -import { DISCORD_PATH, MAIN_CONTENT_ID } from "@/lib/constants" +import { join } from "path" + +import { + DEFAULT_LOCALE, + DISCORD_PATH, + MAIN_CONTENT_ID, + SITE_URL, +} from "@/lib/constants" export const isDiscordInvite = (href: string): boolean => href.includes(DISCORD_PATH) && !href.includes("http") @@ -35,3 +42,9 @@ export const isHrefActive = ( } export const isHash = (href: string): boolean => href.startsWith("#") + +export const getFullUrl = (locale: string | undefined, path: string) => + new URL(join(locale || DEFAULT_LOCALE, path), SITE_URL).href.replace( + /\/$/, + "" + ) From 6c006df9cebc01b9f9b264312f1cab364565b612 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 10:32:15 -0800 Subject: [PATCH 364/478] intl: update dapps label with acronym first --- src/intl/am/common.json | 2 +- src/intl/az/common.json | 2 +- src/intl/be/common.json | 2 +- src/intl/bs/common.json | 2 +- src/intl/ca/common.json | 2 +- src/intl/da/common.json | 2 +- src/intl/en/common.json | 2 +- src/intl/fa/common.json | 2 +- src/intl/fi/common.json | 2 +- src/intl/fil/common.json | 2 +- src/intl/gl/common.json | 2 +- src/intl/gu/common.json | 2 +- src/intl/he/common.json | 2 +- src/intl/hi/common.json | 2 +- src/intl/hr/common.json | 2 +- src/intl/hy-am/common.json | 2 +- src/intl/ig/common.json | 2 +- src/intl/ka/common.json | 2 +- src/intl/kk/common.json | 2 +- src/intl/km/common.json | 2 +- src/intl/kn/common.json | 2 +- src/intl/lt/common.json | 2 +- src/intl/ml/common.json | 2 +- src/intl/mr/common.json | 2 +- src/intl/ms/common.json | 2 +- src/intl/nb/common.json | 2 +- src/intl/ne-np/common.json | 2 +- src/intl/nl/common.json | 2 +- src/intl/pcm/common.json | 2 +- src/intl/pt-br/common.json | 2 +- src/intl/pt/common.json | 2 +- src/intl/ro/common.json | 2 +- src/intl/ru/common.json | 2 +- src/intl/se/common.json | 2 +- src/intl/sk/common.json | 2 +- src/intl/sl/common.json | 2 +- src/intl/sr/common.json | 2 +- src/intl/sw/common.json | 2 +- src/intl/ta/common.json | 2 +- src/intl/th/common.json | 2 +- src/intl/tr/common.json | 2 +- src/intl/uk/common.json | 2 +- src/intl/ur/common.json | 2 +- src/intl/uz/common.json | 2 +- src/intl/vi/common.json | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/intl/am/common.json b/src/intl/am/common.json index 7fb5200678b..29d53a9fa22 100644 --- a/src/intl/am/common.json +++ b/src/intl/am/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - ያልተማከሉ ራስ ገዝ ድርጅቶች", "dark-mode": "ጨለማ", "data-provided-by": "የዳታ ምንጭ:", - "decentralized-applications-dapps": "ያልተማከሉ መተግበሪያዎች (dapps)", + "decentralized-applications-dapps": "Dapps - ያልተማከሉ መተግበሪያዎች", "decentralized-identity": "ያልተማከለ ማንነት", "decentralized-social-networks": "ያልተማከሉ ማህበራዊ አውታረ-መረቦች፡፡", "decentralized-science": "DeSci - ያልተማከለ ሳይንስ", diff --git a/src/intl/az/common.json b/src/intl/az/common.json index ec2d289855d..75ad893b5d8 100644 --- a/src/intl/az/common.json +++ b/src/intl/az/common.json @@ -34,7 +34,7 @@ "dao-page": "DAO - Mərkəzləşdirilməmiş muxtar təşkilatlar", "dark-mode": "Tünd", "data-provided-by": "Məlumat mənbəyi:", - "decentralized-applications-dapps": "Mərkəzləşdirilməmiş tətbiqlər (dapps)", + "decentralized-applications-dapps": "Dapps - Mərkəzləşdirilməmiş tətbiqlər", "decentralized-identity": "Mərkəzləşdirilməmiş şəxsiyyət", "decentralized-social-networks": "Mərkəzləşdirilməmiş sosial şəbəkələr", "decentralized-science": "DeSci - Mərkəzləşdirilməmiş elm", diff --git a/src/intl/be/common.json b/src/intl/be/common.json index 98f7c53c14f..0c50d136a70 100644 --- a/src/intl/be/common.json +++ b/src/intl/be/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Дэцэнтралізаваныя аўтаномныя арганізацыі", "dark-mode": "Цёмны", "data-provided-by": "Крыніца дадзеных:", - "decentralized-applications-dapps": "Дэцэнтралізаваныя дадаткі (dapps)", + "decentralized-applications-dapps": "Dapps - Дэцэнтралізаваныя дадаткі", "decentralized-identity": "Дэцэнтралізаваная ідэнтычнасць", "decentralized-social-networks": "Дэцэнтралізаваная сацыяльная сетка", "decentralized-science": "DeSci - Дэцэнтралізаваная навука", diff --git a/src/intl/bs/common.json b/src/intl/bs/common.json index de6ee8d5c85..2cd5eefc6b2 100644 --- a/src/intl/bs/common.json +++ b/src/intl/bs/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Decentralizovane autonomne organizacije", "dark-mode": "Tamno", "data-provided-by": "Izvor podataka:", - "decentralized-applications-dapps": "Decentralizovane aplikacije (dapps)", + "decentralized-applications-dapps": "Dapps - Decentralizovane aplikacije", "decentralized-identity": "Decentralizovan identitet", "decentralized-social-networks": "Decentralizovane društvene mreže", "decentralized-science": "DeSci - Decentralizovana nauka", diff --git a/src/intl/ca/common.json b/src/intl/ca/common.json index 68f6cf40b15..5bdba3095b7 100644 --- a/src/intl/ca/common.json +++ b/src/intl/ca/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Organitzacions autonomes decentralitzades", "dark-mode": "Fosc", "data-provided-by": "Font de la informació:", - "decentralized-applications-dapps": "Aplicacions descentralitzades (dapps)", + "decentralized-applications-dapps": "Dapps - Aplicacions descentralitzades", "decentralized-identity": "Identitat descentralitzada", "decentralized-social-networks": "Xarxes socials descentralitzades", "decentralized-science": "DeSci - Ciència descentralitzada", diff --git a/src/intl/da/common.json b/src/intl/da/common.json index 973b7727585..836cfa0fa9b 100644 --- a/src/intl/da/common.json +++ b/src/intl/da/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO'er - Decentraliserede autonome organisationer", "dark-mode": "Mørk", "data-provided-by": "Datakilde:", - "decentralized-applications-dapps": "Decentraliserede applikationer (dapps)", + "decentralized-applications-dapps": "Dapps - Decentraliserede applikationer", "decentralized-identity": "Decentraliseret identitet", "decentralized-social-networks": "Decentraliserede sociale netværk", "decentralized-science": "DeSci - Decentraliseret videnskab", diff --git a/src/intl/en/common.json b/src/intl/en/common.json index c83819bfd32..bc7759c511d 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -37,7 +37,7 @@ "dao-page": "DAOs - Decentralized autonomous organizations", "dark-mode": "Dark", "data-provided-by": "Data source:", - "decentralized-applications-dapps": "Decentralized applications (dapps)", + "decentralized-applications-dapps": "Dapps - Decentralized applications", "decentralized-identity": "Decentralized identity", "decentralized-social-networks": "Decentralized social networks", "decentralized-science": "DeSci - Decentralized science", diff --git a/src/intl/fa/common.json b/src/intl/fa/common.json index 705e2eeecfc..be38ee4b625 100644 --- a/src/intl/fa/common.json +++ b/src/intl/fa/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - سازمان‌های مستقل غیر متمرکز", "dark-mode": "تاریک", "data-provided-by": "منبع داده‌ها:", - "decentralized-applications-dapps": "برنامه‌های کاربردی غیر متمرکز (dapps)", + "decentralized-applications-dapps": "Dapps - برنامه‌های کاربردی غیر متمرکز", "decentralized-identity": "هویت نامتمرکز", "decentralized-social-networks": "شبکه‌های مجازی نامتمرکز", "decentralized-science": "دیسای - دانش نامتمرکز", diff --git a/src/intl/fi/common.json b/src/intl/fi/common.json index bb646258820..676bbd0d2c1 100644 --- a/src/intl/fi/common.json +++ b/src/intl/fi/common.json @@ -17,7 +17,7 @@ "copy": "Kopio", "dark-mode": "Tumma", "data-provided-by": "Tietolähde:", - "decentralized-applications-dapps": "Hajautetut sovellukset (dapps)", + "decentralized-applications-dapps": "Dapps - Hajautetut sovellukset", "devcon": "Devcon", "developers": "Kehittäjät", "developers-home": "Kehittäjien etusivu", diff --git a/src/intl/fil/common.json b/src/intl/fil/common.json index 75ec5b2f4e0..5060416bc44 100644 --- a/src/intl/fil/common.json +++ b/src/intl/fil/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - Mga decentralized autonomous organization", "dark-mode": "Madilim", "data-provided-by": "Pinagmulan ng data:", - "decentralized-applications-dapps": "Mga decentralized application (dapps)", + "decentralized-applications-dapps": "Dapps - Mga decentralized application", "decentralized-identity": "Decentralized na identity", "decentralized-social-networks": "Mga decentralized na social network", "decentralized-science": "DeSci - Decentralized science", diff --git a/src/intl/gl/common.json b/src/intl/gl/common.json index a1d8ee89861..7aded72466e 100644 --- a/src/intl/gl/common.json +++ b/src/intl/gl/common.json @@ -17,7 +17,7 @@ "copy": "Copiar", "dark-mode": "Escuro", "data-provided-by": "Orixe de datos:", - "decentralized-applications-dapps": "Aplicacións descentralizadas (dapps)", + "decentralized-applications-dapps": "Dapps - Aplicacións descentralizadas", "devcon": "Devcon", "developers": "Programadores", "developers-home": "Menú para programadores", diff --git a/src/intl/gu/common.json b/src/intl/gu/common.json index 480999fbd63..75cbb7086e3 100644 --- a/src/intl/gu/common.json +++ b/src/intl/gu/common.json @@ -18,7 +18,7 @@ "copy": "નકલ કરો", "dark-mode": "અંધારુ", "data-provided-by": "માહિતીનું પ્રાપ્તિસ્થાન:", - "decentralized-applications-dapps": "વિકેન્દ્રિત એપ્લિકેશન (dapps)", + "decentralized-applications-dapps": "Dapps - વિકેન્દ્રિત એપ્લિકેશન", "decentralized-science": "DeSci - વિકેન્દ્રિત વિજ્ઞાન", "devcon": "ડેવકોન", "developers": "વિકાસકર્તાઓ", diff --git a/src/intl/he/common.json b/src/intl/he/common.json index 32fefa1fb77..d0b492a23f4 100644 --- a/src/intl/he/common.json +++ b/src/intl/he/common.json @@ -21,7 +21,7 @@ "danksharding": "דנקסהארדינג", "dark-mode": "כהה", "data-provided-by": "מקור הנתונים:", - "decentralized-applications-dapps": "יישומים מבוזרים (dapps)", + "decentralized-applications-dapps": "Dapps - יישומים מבוזרים", "decentralized-science": "DeSci - מדע מבוזר", "devcon": "Devcon", "developers": "מפתחים", diff --git a/src/intl/hi/common.json b/src/intl/hi/common.json index e5de9c3a6ad..43f5797f6e8 100644 --- a/src/intl/hi/common.json +++ b/src/intl/hi/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - विकेन्द्रीकृत स्वायत्त संगठन", "dark-mode": "गहरा रंग", "data-provided-by": "डाटा सोर्स:", - "decentralized-applications-dapps": "विकेंद्रीकृत अनुप्रयोग (dapps)", + "decentralized-applications-dapps": "Dapps - विकेंद्रीकृत अनुप्रयोग", "decentralized-identity": "विकेन्द्रीकृत पहचान", "decentralized-social-networks": "विकेन्द्रीकृत सोशल नेटवर्क", "decentralized-science": "DeSci - विकेंद्रित विज्ञान", diff --git a/src/intl/hr/common.json b/src/intl/hr/common.json index 674dce82ed1..6790cfd3a3f 100644 --- a/src/intl/hr/common.json +++ b/src/intl/hr/common.json @@ -34,7 +34,7 @@ "dao-page": "DAO-ovi - Decentralizirane autonomne organizacije", "dark-mode": "Tamno", "data-provided-by": "Izvor podataka:", - "decentralized-applications-dapps": "Decentralizirane aplikacije (dapp-ovi)", + "decentralized-applications-dapps": "Dapp-ovi - Decentralizirane aplikacije", "decentralized-identity": "Decentraliziran identitet", "decentralized-social-networks": "Decentralizirane društvene mreže", "decentralized-science": "DeSci - Decentralizirana znanost", diff --git a/src/intl/hy-am/common.json b/src/intl/hy-am/common.json index 0146aa0a338..015bd1ac17b 100644 --- a/src/intl/hy-am/common.json +++ b/src/intl/hy-am/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Ապակենտրոնացված ինքնավար կազմակերպություններ", "dark-mode": "Մութ", "data-provided-by": "Տվյալների աղբյուր:", - "decentralized-applications-dapps": "Ապակենտրոնացված հավելվածներ (dapps)", + "decentralized-applications-dapps": "Dapps - Ապակենտրոնացված հավելվածներ", "decentralized-identity": "Ապակենտրոնացված ինքնություն", "decentralized-social-networks": "Ապակենտրոնացված սոցիալական ցանցեր", "decentralized-science": "DeSci - Ապակենտրոնացված գիտություն", diff --git a/src/intl/ig/common.json b/src/intl/ig/common.json index 34dd647c9c1..255fc52aa97 100644 --- a/src/intl/ig/common.json +++ b/src/intl/ig/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - Otu zoro ezo n'enweghi nchikwa", "dark-mode": "Ojii", "data-provided-by": "Ebe data:", - "decentralized-applications-dapps": "Ngwa komputa na aru oru na sistemu komputa (dapps)", + "decentralized-applications-dapps": "Dapps - Ngwa komputa na aru oru na sistemu komputa", "decentralized-identity": "Njirimara ọtụtụ ndị na achị", "decentralized-social-networks": "Netwọk mmekọrịta ọtụtụ ndị na achi", "decentralized-science": "DeSci - Sayensị ọtụtụ ndị na achị", diff --git a/src/intl/ka/common.json b/src/intl/ka/common.json index 57410abaa72..4474a5bd290 100644 --- a/src/intl/ka/common.json +++ b/src/intl/ka/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - დეცენტრალიზებული ავტონომიური ორგანიზაციები-ები", "dark-mode": "ბნელი", "data-provided-by": "მონაცემთა წყარო:", - "decentralized-applications-dapps": "დეცენტრალიზებული აპლიკაციები (dapps)", + "decentralized-applications-dapps": "Dapps - დეცენტრალიზებული აპლიკაციები", "decentralized-identity": "დეცენტრალიზებული იდენტობა", "decentralized-social-networks": "დეცენტრალიზებული სოციალური ქსელი", "decentralized-science": "DeSci - დეცენტრალიზებული მეცნიერება", diff --git a/src/intl/kk/common.json b/src/intl/kk/common.json index 6eb75158e3d..54d7d03ef4a 100644 --- a/src/intl/kk/common.json +++ b/src/intl/kk/common.json @@ -18,7 +18,7 @@ "copy": "Көшіру", "dark-mode": "Күңгірт", "data-provided-by": "Деректер көзі:", - "decentralized-applications-dapps": "Орталықсыздандырылған қолданбалар (dapps)", + "decentralized-applications-dapps": "Dapps - Орталықсыздандырылған қолданбалар", "devcon": "Devcon", "developers": "Әзірлеушілер", "developers-home": "Әзірлеушілер басты беті", diff --git a/src/intl/km/common.json b/src/intl/km/common.json index c77493ec861..b36b5c62de7 100644 --- a/src/intl/km/common.json +++ b/src/intl/km/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - អង្គការស្វយ័តវិមជ្ឈការ", "dark-mode": "ងងឹត", "data-provided-by": "ប្រភពទិន្នន័យ៖", - "decentralized-applications-dapps": "កម្មវិធីវិមជ្ឈការ (dapps)", + "decentralized-applications-dapps": "Dapps - កម្មវិធីវិមជ្ឈការ", "decentralized-identity": "អត្តសញ្ញាណវិមជ្ឈការ", "decentralized-social-networks": "បណ្តាញសង្គមវិមជ្ឈការ", "decentralized-science": "DeSci - វិទ្យាសាស្ត្រវិមជ្ឈការ", diff --git a/src/intl/kn/common.json b/src/intl/kn/common.json index 86cb9b72c59..11009f753e6 100644 --- a/src/intl/kn/common.json +++ b/src/intl/kn/common.json @@ -23,7 +23,7 @@ "dao-page": "ಡಿಎಒಗಳು - ವಿಕೇಂದ್ರೀಕರಿತ ಸ್ವಯಂಚಾಲಿತ ಸಂಸ್ಥೆಗಳು", "dark-mode": "ಕತ್ತಲು / ಅಂಧಕಾರದ", "data-provided-by": "ಡೇಟಾ ಮೂಲ:", - "decentralized-applications-dapps": "ವಿಕೇಂದ್ರೀಕೃತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು (dapps)", + "decentralized-applications-dapps": "Dapps - ವಿಕೇಂದ್ರೀಕೃತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು", "decentralized-identity": "ವಿಕೇಂದ್ರೀಕರಿತ ಗುರುತು", "decentralized-social-networks": "ವಿಕೇಂದ್ರೀಕರಿತ ಸಾಮಾಜಿಕ ಜಾಲಗಳು", "decentralized-science": "ಡಿಸೈ - ವಿಕೇಂದ್ರೀಕರಿತ ವಿಜ್ಞಾನ", diff --git a/src/intl/lt/common.json b/src/intl/lt/common.json index e48d0b75f54..a28009b5dee 100644 --- a/src/intl/lt/common.json +++ b/src/intl/lt/common.json @@ -17,7 +17,7 @@ "copy": "Kopijuoti", "dark-mode": "Tamsus", "data-provided-by": "Duomenų šaltinis:", - "decentralized-applications-dapps": "Decentralizuotos programėlės (dapps'ai)", + "decentralized-applications-dapps": "Dapps'ai - Decentralizuotos programėlės", "devcon": "Devcon", "developers": "Kūrėjams", "developers-home": "Kūrėjų pagrindinis puslapis", diff --git a/src/intl/ml/common.json b/src/intl/ml/common.json index 16e33757da6..7784af4c010 100644 --- a/src/intl/ml/common.json +++ b/src/intl/ml/common.json @@ -17,7 +17,7 @@ "copy": "പകര്‍പ്പ്‌", "dark-mode": "ഡാർക്ക്", "data-provided-by": "ഡാറ്റ ഉറവിടം:", - "decentralized-applications-dapps": "വികേന്ദ്രീകൃത ആപ്ലിക്കേഷനുകൾ (ഡാപ്പുകൾ)", + "decentralized-applications-dapps": "ഡാപ്പുകൾ - വികേന്ദ്രീകൃത ആപ്ലിക്കേഷനുകൾ", "devcon": "ഡവ്കോൺ", "developers": "ഡെവലപ്പർമാർ", "developers-home": "ഡെവലപ്പേഴ്സ് ഹോം", diff --git a/src/intl/mr/common.json b/src/intl/mr/common.json index c1c0f1c095e..a42f8221f75 100644 --- a/src/intl/mr/common.json +++ b/src/intl/mr/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - विकेंद्रीत स्वायत्त संस्था", "dark-mode": "गडद", "data-provided-by": "डेटा स्रोत:", - "decentralized-applications-dapps": "विकेंद्रित अनुप्रयोग (dapps)", + "decentralized-applications-dapps": "Dapps - विकेंद्रित अनुप्रयोग", "decentralized-identity": "विकेंद्रित ओळख", "decentralized-social-networks": "विकेंद्रित सामाजिक जाळे", "decentralized-science": "DeSci - विकेंद्रित विज्ञान", diff --git a/src/intl/ms/common.json b/src/intl/ms/common.json index c499f6bb936..cd11bf06c59 100644 --- a/src/intl/ms/common.json +++ b/src/intl/ms/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Organisasi autonomi yang tak terpusat", "dark-mode": "Gelap", "data-provided-by": "Sumber data:", - "decentralized-applications-dapps": "Aplikasi tidak berpusat (dapps)", + "decentralized-applications-dapps": "Dapps - Aplikasi tidak berpusat", "decentralized-identity": "Identiti ternyahpusat", "decentralized-social-networks": "Rangkaian sosial ternyahpusat", "decentralized-science": "DeSci - Sains ternyahpusat", diff --git a/src/intl/nb/common.json b/src/intl/nb/common.json index e6860b7e977..aeb21b49f38 100644 --- a/src/intl/nb/common.json +++ b/src/intl/nb/common.json @@ -18,7 +18,7 @@ "copy": "Kopier", "dark-mode": "Mørk", "data-provided-by": "Datakilde:", - "decentralized-applications-dapps": "Desentraliserte applikasjoner (dapper)", + "decentralized-applications-dapps": "Dapper - Desentraliserte applikasjoner", "decentralized-science": "DeSci - Desentralisert vitenskap", "devcon": "Devcon", "developers": "Utviklere", diff --git a/src/intl/ne-np/common.json b/src/intl/ne-np/common.json index 8fd1c392e8a..eb03a178d97 100644 --- a/src/intl/ne-np/common.json +++ b/src/intl/ne-np/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - विकेन्द्रीकृत स्वायत्त संस्थाहरू", "dark-mode": "अँध्यारो", "data-provided-by": "डाटाको स्रोत:", - "decentralized-applications-dapps": "विकेन्द्रीकृत एप्पहरू (dapps)", + "decentralized-applications-dapps": "Dapps - विकेन्द्रीकृत एप्पहरू", "decentralized-identity": "विकेन्द्रीकृत पहिचान", "decentralized-social-networks": "विकेन्द्रीकृत सामाजिक सञ्जाल", "decentralized-science": "DeSci - विकेन्द्रीकृत विज्ञान", diff --git a/src/intl/nl/common.json b/src/intl/nl/common.json index 669da839aa6..5812c5dc2bb 100644 --- a/src/intl/nl/common.json +++ b/src/intl/nl/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO's - Gedecentraliseerde autonome organisaties", "dark-mode": "Donker", "data-provided-by": "Gegevensbron:", - "decentralized-applications-dapps": "Gedecentraliseerde toepassingen (dapps)", + "decentralized-applications-dapps": "Dapps - Gedecentraliseerde toepassingen", "decentralized-identity": "Gedecentraliseerde identiteit", "decentralized-social-networks": "Gedecentraliseerde sociale netwerken", "decentralized-science": "DeSci - Gedecentraliseerde wetenschap", diff --git a/src/intl/pcm/common.json b/src/intl/pcm/common.json index f6c42186fb5..3d5c1b34f68 100644 --- a/src/intl/pcm/common.json +++ b/src/intl/pcm/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - Disentralized autonomous organisashon", "dark-mode": "Dark", "data-provided-by": "Data sorse:", - "decentralized-applications-dapps": "Disentralized aplikashons (dapps)", + "decentralized-applications-dapps": "Dapps - Disentralized aplikashons", "decentralized-identity": "Disentralized identity", "decentralized-social-networks": "Disentralized soshia netwoks", "decentralized-science": "DeSci - Disentralized sayens", diff --git a/src/intl/pt-br/common.json b/src/intl/pt-br/common.json index 8820c43ae06..fc79dee685b 100644 --- a/src/intl/pt-br/common.json +++ b/src/intl/pt-br/common.json @@ -34,7 +34,7 @@ "dao-page": "DAOs - Organizações autônomas descentralizadas", "dark-mode": "Escuro", "data-provided-by": "Fonte de dados:", - "decentralized-applications-dapps": "Aplicativos descentralizados (dapps)", + "decentralized-applications-dapps": "Dapps - Aplicativos descentralizados", "decentralized-identity": "Identidade descentralizada", "decentralized-social-networks": "Redes sociais descentralizadas", "decentralized-science": "DeSci - Ciência descentralizada", diff --git a/src/intl/pt/common.json b/src/intl/pt/common.json index bd172292ac8..4f80ec5d733 100644 --- a/src/intl/pt/common.json +++ b/src/intl/pt/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Organizações Autónomas Descentralizadas", "dark-mode": "Escuro", "data-provided-by": "Origem dos dados:", - "decentralized-applications-dapps": "Aplicações descentralizadas (dapps)", + "decentralized-applications-dapps": "Dapps - Aplicações descentralizadas", "decentralized-identity": "Identidade descentralizada", "decentralized-social-networks": "Redes sociais descentralizadas", "decentralized-science": "DeSci - Ciência Descentralizada", diff --git a/src/intl/ro/common.json b/src/intl/ro/common.json index dc5cf039b43..af59e97f384 100644 --- a/src/intl/ro/common.json +++ b/src/intl/ro/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Organizațiile autonome descentralizate", "dark-mode": "Fundal întunecat", "data-provided-by": "Sursa datelor:", - "decentralized-applications-dapps": "Aplicații descentralizate (dapp)", + "decentralized-applications-dapps": "Dapp - Aplicații descentralizate", "decentralized-identity": "Identitate descentralizată", "decentralized-social-networks": "Rețele sociale descentralizate", "decentralized-science": "DeSci - Știința descentralizată", diff --git a/src/intl/ru/common.json b/src/intl/ru/common.json index 75e2d4b861e..0cae901adc0 100644 --- a/src/intl/ru/common.json +++ b/src/intl/ru/common.json @@ -34,7 +34,7 @@ "dao-page": "DAO - Децентрализованные автономные организации", "dark-mode": "Темная", "data-provided-by": "Источник данных:", - "decentralized-applications-dapps": "Децентрализованные приложения (dapps)", + "decentralized-applications-dapps": "Dapps - Децентрализованные приложения", "decentralized-identity": "Децентрализованная идентификация", "decentralized-social-networks": "Децентрализованные социальные сети", "decentralized-science": "DeSci - Децентрализованная наука", diff --git a/src/intl/se/common.json b/src/intl/se/common.json index 5a20cdf01de..91d517b23e9 100644 --- a/src/intl/se/common.json +++ b/src/intl/se/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Decentraliserade autonoma organisationer", "dark-mode": "Mörkt", "data-provided-by": "Datakälla:", - "decentralized-applications-dapps": "Decentraliserade program (dapps)", + "decentralized-applications-dapps": "Dapps - Decentraliserade program", "decentralized-identity": "Decentraliserad identitet", "decentralized-social-networks": "Decentraliserade sociala nätverk", "decentralized-science": "DeSci - Decentraliserad vetenskap", diff --git a/src/intl/sk/common.json b/src/intl/sk/common.json index e30dd1937ee..1632b009603 100644 --- a/src/intl/sk/common.json +++ b/src/intl/sk/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Decentralizované autonómne organizácie", "dark-mode": "Tmavé", "data-provided-by": "Zdroj dát:", - "decentralized-applications-dapps": "Decentralizované aplikácie (dapp)", + "decentralized-applications-dapps": "Dapp - Decentralizované aplikácie", "decentralized-identity": "Decentralizovaná identita", "decentralized-social-networks": "Decentralizovaná sociálna sieť", "decentralized-science": "DeSci - Decentralizovaná veda", diff --git a/src/intl/sl/common.json b/src/intl/sl/common.json index fbca9467874..c1934601fba 100644 --- a/src/intl/sl/common.json +++ b/src/intl/sl/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Decentralizirane avtonomne organizacije", "dark-mode": "Temno", "data-provided-by": "Vir podatkov:", - "decentralized-applications-dapps": "Decentralizirane aplikacije (dapps)", + "decentralized-applications-dapps": "Dapps - Decentralizirane aplikacije", "decentralized-identity": "Decentralizirana identiteta", "decentralized-social-networks": "Decentralizirana družabna omrežja", "decentralized-science": "DeSci - Decentralizirana znanost", diff --git a/src/intl/sr/common.json b/src/intl/sr/common.json index a761f2c3eea..a8eb8787ac4 100644 --- a/src/intl/sr/common.json +++ b/src/intl/sr/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Decentralizovane autonomne organizacije", "dark-mode": "Tamno", "data-provided-by": "Izvor podataka:", - "decentralized-applications-dapps": "Decentralizovane aplikacije (dapps)", + "decentralized-applications-dapps": "Dapps - Decentralizovane aplikacije", "decentralized-identity": "Decentralizovan identitet", "decentralized-social-networks": "Decentralizovane društvene mreže", "decentralized-science": "DeSci - Decentralizovana nauka", diff --git a/src/intl/sw/common.json b/src/intl/sw/common.json index 55aa99fa565..3d86e370b48 100644 --- a/src/intl/sw/common.json +++ b/src/intl/sw/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - Mashirika huru yasiyotawaliwa", "dark-mode": "Giza", "data-provided-by": "Chanzo cha taarifa:", - "decentralized-applications-dapps": "Programu zisizoendeshwa na benki kuu wala serikali (dapps)", + "decentralized-applications-dapps": "Dapps - Programu zisizoendeshwa na benki kuu wala serikali", "decentralized-identity": "Utambulisho uliogatuliwa", "decentralized-social-networks": "Mitandao ya kijamiii iliogatuliwa", "decentralized-science": "DeSci - Sayansi iliogatuliwa", diff --git a/src/intl/ta/common.json b/src/intl/ta/common.json index 3c5b1638327..a11901f2e36 100644 --- a/src/intl/ta/common.json +++ b/src/intl/ta/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - பன்முனைப்படுத்தப்பட்ட தன்னாட்சி அமைப்புகள்", "dark-mode": "அடர்நிறம்", "data-provided-by": "தரவு மூலம்:", - "decentralized-applications-dapps": "பன்முனைச் செயலிகள் (dapps)", + "decentralized-applications-dapps": "Dapps - பன்முனைச் செயலிகள்", "decentralized-identity": "பன்முனைப்படுத்தப்பட்ட அடையாளம்", "decentralized-social-networks": "பன்முனைப்படுத்தப்பட்ட சமூக வலைப்பின்னல்கள்", "decentralized-science": "DeSci - பன்முனை அறிவியல்", diff --git a/src/intl/th/common.json b/src/intl/th/common.json index 2690d52f42f..8c40b1a29d6 100644 --- a/src/intl/th/common.json +++ b/src/intl/th/common.json @@ -23,7 +23,7 @@ "dao-page": "DAOs - การบริหารองค์กรอัตโนมัติด้วยระบบ Decentralized", "dark-mode": "โหมดมืด", "data-provided-by": "แหล่งข้อมูล:", - "decentralized-applications-dapps": "แอปพลิเคชันไร้ศูนย์กลาง (dApp)", + "decentralized-applications-dapps": "DApp - แอปพลิเคชันไร้ศูนย์กลาง", "decentralized-identity": "ตัวตนแบบกระจายศูนย์", "decentralized-social-networks": "เครือข่ายสังคมแบบกระจายศูนย์", "decentralized-science": "DeSci - วิทยาศาสตร์แบบ Decentralized", diff --git a/src/intl/tr/common.json b/src/intl/tr/common.json index 5ce9326e8ee..8f227ead141 100644 --- a/src/intl/tr/common.json +++ b/src/intl/tr/common.json @@ -34,7 +34,7 @@ "dao-page": "DAO'lar - Merkezi olmayan özerk kuruluşlar", "dark-mode": "Koyu", "data-provided-by": "Veri kaynağı:", - "decentralized-applications-dapps": "Merkezi olmayan uygulamalar (dapps)", + "decentralized-applications-dapps": "Dapps - Merkezi olmayan uygulamalar", "decentralized-identity": "Merkezî olmayan kimlik", "decentralized-social-networks": "Merkezî olmayan sosyal ağlar", "decentralized-science": "DeSci - Merkeziyetsiz bilim", diff --git a/src/intl/uk/common.json b/src/intl/uk/common.json index 8447c239f11..1d9a7bcdcaa 100644 --- a/src/intl/uk/common.json +++ b/src/intl/uk/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Децентралізовані автономні організації", "dark-mode": "Темний", "data-provided-by": "Джерело даних:", - "decentralized-applications-dapps": "Децентралізовані програми (dapps)", + "decentralized-applications-dapps": "Dapps - Децентралізовані програми", "decentralized-identity": "Децентралізована ідентичність", "decentralized-social-networks": "Децентралізовані соціальні мережі", "decentralized-science": "DeSci - Децентралізована наука", diff --git a/src/intl/ur/common.json b/src/intl/ur/common.json index 31ab7496f8f..c25636ae3ca 100644 --- a/src/intl/ur/common.json +++ b/src/intl/ur/common.json @@ -18,7 +18,7 @@ "copy": "کاپی کریں", "dark-mode": "گہرا", "data-provided-by": "ڈیٹا کا ذریعہ:", - "decentralized-applications-dapps": "غیر مرکزی ایپلیکیشنز (dapps)", + "decentralized-applications-dapps": "Dapps - غیر مرکزی ایپلیکیشنز", "decentralized-science": "DeSci - غیر مرکزی سائنس", "devcon": "ڈیوکون", "developers": "ڈویلپرز", diff --git a/src/intl/uz/common.json b/src/intl/uz/common.json index 2cc33a7d5ee..b5d25cdeb01 100644 --- a/src/intl/uz/common.json +++ b/src/intl/uz/common.json @@ -18,7 +18,7 @@ "copy": "Nusxa olish", "dark-mode": "Tungi", "data-provided-by": "Ma'lumotlar manbai:", - "decentralized-applications-dapps": "Markazlashtirilmagan ilovalar (dapps)", + "decentralized-applications-dapps": "Dapps - Markazlashtirilmagan ilovalar", "decentralized-science": "DeSci - Decentralized science", "devcon": "Devcon", "developers": "Ishlab chiquvchilar", diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json index e3434143e4c..494b8873ebc 100644 --- a/src/intl/vi/common.json +++ b/src/intl/vi/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO - Tổ chức tự trị phi tập trung", "dark-mode": "Chế độ tối", "data-provided-by": "Nguồn dữ liệu:", - "decentralized-applications-dapps": "Ứng dụng phi tập trung (dapps)", + "decentralized-applications-dapps": "Dapps - Ứng dụng phi tập trung", "decentralized-identity": "Nhận dạng phi tập trung", "decentralized-social-networks": "Mạng xã hội phi tập trung", "decentralized-science": "DeSci - Ngành khoa học phi tập trung", From 1899364847c1ee1c7334032e50d969b6d8bfdbb4 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 10:36:30 -0800 Subject: [PATCH 365/478] intl: import common.json bundle for translations currently available --- src/intl/ar/common.json | 164 ++++++++++++++++++++++++++++++++---- src/intl/bg/common.json | 164 ++++++++++++++++++++++++++++++++---- src/intl/bn/common.json | 150 +++++++++++++++++++++++++++++---- src/intl/cs/common.json | 126 ++++++++++++++++++++++++++-- src/intl/de/common.json | 131 +++++++++++++++++++++++++++-- src/intl/el/common.json | 165 +++++++++++++++++++++++++++++++++---- src/intl/es/common.json | 123 ++++++++++++++++++++++++++- src/intl/fr/common.json | 125 ++++++++++++++++++++++++++-- src/intl/hu/common.json | 136 +++++++++++++++++++++++++++--- src/intl/id/common.json | 151 ++++++++++++++++++++++++++++++--- src/intl/it/common.json | 151 ++++++++++++++++++++++++++++++--- src/intl/ja/common.json | 150 +++++++++++++++++++++++++++++++-- src/intl/pl/common.json | 131 +++++++++++++++++++++++++++-- src/intl/zh-tw/common.json | 133 ++++++++++++++++++++++++++++-- src/intl/zh/common.json | 141 ++++++++++++++++++++++++++++--- 15 files changed, 1976 insertions(+), 165 deletions(-) diff --git a/src/intl/ar/common.json b/src/intl/ar/common.json index a63c5fba9da..48e08671636 100644 --- a/src/intl/ar/common.json +++ b/src/intl/ar/common.json @@ -1,17 +1,30 @@ { - "account-abstraction": "تجريد حساب", "about-ethereum-org": "نبذة عن ethereum.org", "about-us": "نبذة عنا", + "adding-desci-projects": "إضافة مشاريع علمية لامركزية", + "adding-developer-tools": "إضافة أدوات المبرمج", + "adding-exchanges": "إضافة مبادلات", + "adding-glossary-terms": "إضافة مصطلحات المسرد", + "adding-layer-2s": "إضافة الطبقة الثانية", + "adding-staking-products": "إضافة منتجات تجميد العملات", + "adding-wallets": "إضافة محافظ", + "account-abstraction": "تجريد الحساب", + "acknowledgements": "الإقرارات", "aria-toggle-search-button": "تبديل زر البحث", "aria-toggle-menu-button": "تبديل زر القائمة", "beacon-chain": "سلسلة المنارة", - "bridges": "جسور سلسلة الكتل", + "bridges": "جسور البلوكتشين", + "bug-bounty": "مكافأة اكتشاف الخلل", + "build": "بناء", + "build-menu": "بناء القائمة", "clear": "مسح", "close": "إغلاق", "community": "المجتمع", "community-hub": "مركز المجتمع", "community-menu": "قائمة المجتمع", "contact": "تواصل", + "content-buckets": "مجموعات المحتوى", + "content-resources": "موارد المحتوى", "content-standardization": "توحيد المحتوى", "contributing": "المساهمة", "contributors": "المساهمون", @@ -23,11 +36,14 @@ "dao-page": "DAO - المنظمات المستقلة اللامركزية", "dark-mode": "داكن", "data-provided-by": "مصدر البيانات:", - "decentralized-applications-dapps": "التطبيقات اللامركزية (dapps)", + "decentralized-applications-dapps": "Dapps - التطبيقات اللامركزية", "decentralized-identity": "الهوية اللامركزية", "decentralized-social-networks": "الشبكات الاجتماعية اللامركزية", "decentralized-science": "DeSci - لا مركزية العلوم", + "description": "وصف عنصر التنقل", "defi-page": "DeFi - التمويل اللامركزي", + "design": "التصميم", + "design-principles": "مبادئ التصميم", "devcon": "ديفكون", "developers": "المبرمجون", "developers-home": "الصفحة الرئيسية للمبرمجين", @@ -83,22 +99,22 @@ "feedback-card-prompt-tutorial": "هل كانت تعليمات الاستخدام هذه مفيدة؟", "feedback-widget-thank-you-title": "شكرًا لك على إبداء ملاحظاتك!", "feedback-widget-thank-you-subtitle": "اجعل هذه الصفحة أفضل من خلال الإجابة عن بعض الأسئلة.", - "feedback-widget-thank-you-subtitle-ext": "إذا كنت بحاجة إلى المساعدة، فإنه يمكنك التواصل مع المجتمع على Discord.", + "feedback-widget-thank-you-subtitle-ext": "إذا كنت بحاجة إلى المساعدة، يمكنك التواصل مع المجتمع على Discord.", "feedback-widget-thank-you-timing": "٢-٣ دقائق", "feedback-widget-thank-you-cta": "فتح استبيان قصير", "find-wallet": "البحث عن المحفظة", "future-proofing": "إثبات مستقبلي", - "get-eth": "الحصول إلى إثير", + "get-eth": "احصل على عملات إثير", "get-involved": "المشاركة", - "get-started": "بدء الاستخدام", + "get-started": "ابدأ الاستخدام", "grants": "منح", "grant-programs": "برامج منح النظام البيئي", "guides": "الأدلة", - "guides-hub": "مركز الأدلة", + "guides-hub": "أدلة إرشادية", "history-of-ethereum": "تاريخ إثيريوم", "home": "الصفحة الرئيسية", "how-ethereum-works": "كيفية عمل إثيريوم", - "how-to-register-an-ethereum-account": "كيفية \"تسجيل\" حساب إثيريوم", + "how-to-create-an-ethereum-account": "كيف \"تُنشئ\" حساب إيثريوم", "how-to-revoke-token-access": "كيفية إلغاء وصول العقد الذكي إلى أموال العملات المشفرة", "how-to-swap-tokens": "كيفية مبادلة الرموز المميزة", "how-to-use-a-bridge": "كيفية نقل الرموز المميزة عبر جسر إلى الطبقة 2", @@ -115,7 +131,7 @@ "last-edit": "آخر تعديل", "layer-2": "الطبقة ٢", "learn": "تعلّم", - "learn-by-coding": "تعلّم عن طريق البرمجة", + "learn-by-coding": "تعلم عن طريق البرمجة", "learn-hub": "مركز التعلم", "learn-menu": "قائمة التعلّم", "learn-more": "معرفة المزيد", @@ -128,18 +144,123 @@ "loading-error-try-again-later": "يتعذر تحميل البيانات، يُرجى إعادة المحاولة لاحقًا.", "logo": "الشعار", "mainnet-ethereum": "إثيريوم للشبكة الرئيسية", + "merge": "دمج", "more": "المزيد", - "nav-developers": "المبرمجون", + "nav-about-description": "مشروع عام مفتوح المصدر لمجتمع إيثيريوم", + "nav-advanced-description": "تعلّم أكثر المواضيع تعقيدًا", + "nav-advanced-label": "إعدادات متقدمة", + "nav-basics-description": "فهم أساسيات إيثيريوم", + "nav-basics-label": "الأساسيات", + "nav-bridges-description": "لقد تطور الإصدار الثالث من الويب Web3 إلى منظومة من البلوكتشين من الطبقة الأولى الأساسية وحلول التوسع من الطبقة الثانية", + "nav-builders-home-description": "دليل مبرمجي إيثيريوم—من المطورين، للمطورين", + "nav-builders-home-label": "الصفحة الرئيسية للمطورين", + "nav-contribute-description": "إذا كنت تريد المساعدة، فهذا سيوجهك", + "nav-contribute-label": "الإسهام في ethereum.org", + "nav-dao-description": "المجتمعات التي يمتلكها الأعضاء من دون سلطة مركزية", + "nav-dapps-description": "استكشف منظومة غنية من التطبيقات باستخدام إيثريوم", + "nav-defi-description": "بديل عالمي مفتوح عن السوق المالية التقليدية", + "nav-desci-description": "بديل عالمي مفتوح عن النظام العلمي الحالي", + "nav-desoc-description": "منصات قائمة على البلوكتشين للتفاعل الاجتماعي وإنشاء المحتوى", "nav-developers-docs": "وثائق المبرمجين", + "nav-developers": "المبرمجون", + "nav-did-description": "يمكنك إصدار المعرّفات اللامركزية الفريدة الخاصة بك وامتلاكها", + "nav-docs-description": "مستندات لمساعدتك على الفهم والبناء باستخدام إيثريوم", + "nav-docs-design-description": "وصف للتحديات وأفضل الممارسات ونتائج بحث المستخدم المتعلقة بتصميم الإصدار الثالث من الويب web3", + "nav-docs-design-label": "أساسيات تصميم تجربة المستخدم/واجهة المستخدم", + "nav-docs-foundation-description": "الأساسيات الجوهرية للتطوير اعتمادًا على إيثريوم", + "nav-docs-foundation-label": "مواضيع أساسية", + "nav-docs-overview-description": "الصفحة الرئيسية لمستندات المبرمج", + "nav-docs-stack-description": "فهم جميع التفاصيل المتعلقة بحزمة إيثيريوم", + "nav-docs-stack-label": "كومة ايثيريوم", + "nav-eip-description": "المعايير التي تحدد الميزات أو العمليات الجديدة", + "nav-eip-label": "مقترحات تحسين إيثيريوم (EIP)", + "nav-emerging-description": "تعرَّف على أحدث حالات استخدام إيثريوم الأخرى", + "nav-emerging-label": "حالات الاستخدام الناشئة", + "nav-enterprise-description": "تطبيقات إيثريوم للأعمال", + "nav-ethereum-org-description": "هذا الموقع الإلكتروني يقوده المجتمع—انضم إلينا وساهم أيضًا", + "nav-ethereum-wallets-description": "تطبيق للتفاعل مع حساب إيثريوم الخاص بك", + "nav-events-description": "اللامركزية وحرية المشاركة لأي شخص", + "nav-events-irl-description": "تقام أحداث كبرى تخص إيثريوم بشكل شخصي أو على الإنترنت كل شهر", + "nav-events-label": "المجتمعات والأحداث", + "nav-events-online-description": "ينشأ مئات الآلاف من المتحمسين لإيثريوم في تلك المجتمعات على الإنترنت", + "nav-find-wallet-description": "تتيح لك المحافظ استخدام العملات الرقمية", + "nav-find-wallet-label": "اختر محفظتك", + "nav-gas-fees-description": "كيف يتم حساب رسوم تحويل ETH", + "nav-gas-fees-label": "رسوم الغاز", + "nav-get-eth-description": "تحتاج إلى ether ‏(ETH) لاستخدام تطبيقات إيثريوم", + "nav-get-started-description": "خطواتك الأولى لاستخدام إيثريوم", + "nav-governance-description": "العملية التي تنطوي عليها ترقية بروتوكول إيثريوم", + "nav-governance-label": "إرشادات", + "nav-grants-description": "قائمة منسقة من قِبل مجتمعنا عن المشاريع التي تقدم برامج التمويل بالمِنح", + "nav-guide-create-account-description": "يمكن لأي شخص إنشاء حساب إيثريوم في أي وقت وبشكل مجاني باستخدام تطبيق محفظة", + "nav-guide-create-account-label": "كيف تُنشئ حساب إيثريوم", + "nav-guide-revoke-access-description": "حافظ على أمانك عند التفاعل مع العقود الذكية والتطبيقات في منظومة إيثريوم", + "nav-guide-revoke-access-label": "كيفية إلغاء وصول العقد الذكي", + "nav-guide-use-wallet-description": "تعرَّف على كيفية تشغيل جميع الوظائف الأساسية للمحفظة", + "nav-guide-use-wallet-label": "كيفية استخدام محفظة", + "nav-guides-description": "إرشادات عملية خطوة بخطوة لمساعدتك على البدء", + "nav-guides-label": "أدلة إرشادية", + "nav-history-description": "جدول زمني لجميع التَّفَرُّعات والتحديثات الرئيسية", + "nav-history-label": "التاريخ الفني للإيثريوم", + "nav-layer-2-description": "معاملات أرخص وأسرع لإيثريوم", + "nav-learn-by-coding-description": "أدوات ستساعدك على تجربة إيثريوم", + "nav-local-env-description": "اختر حزمة تطوير إيثريوم الخاصة بك وقم بإعدادها", + "nav-mainnet-description": "يمكن بناء تطبيقات بلوكتشين الخاصة بالشركات على شبكة إيثريوم الرئيسية العامة", + "nav-nft-description": "طريقة لتمثيل أي شيء فريد بوصفه أصلاً مستندًا إلى إيثريوم", + "nav-open-research-description": "تُعَد إحدى نقاط القوة الأساسية في إيثريوم هي مجتمع البحوث النشط الخاص به", + "nav-open-research-label": "البحث المفتوح", + "nav-overview-description": "كل ما يتعلق بالمحتوى التعليمي عن إيثريوم", + "nav-overview-label": "نظرة عامة", + "nav-participate-overview-description": "نظرة عامة إلى طريقة المشاركة", "nav-primary": "رئيسي", + "nav-quizzes-description": "اكتشف مدى فهمك لإيثريوم والعملات الرقمية", + "nav-quizzes-label": "اختبر معلوماتك", + "nav-refi-description": "نظام اقتصادي بديل قائم على أُسُس متجددة", + "nav-research-description": "العمليات المتبعة لتحسين إيثريوم", + "nav-research-label": "البحث والتطوير", + "nav-roadmap-description": "الطريق إلى زيادة إمكانية توسيع نطاق إيثريوم وأمنه واستدامته", + "nav-roadmap-future-description": "ترسيخ إيثريوم بوصفه شبكة قوية ولامركزية", + "nav-roadmap-future-label": "إثبات مستقبلي", + "nav-roadmap-label": "خريطة الطريق", + "nav-roadmap-scaling-description": "تحديثات الشبكة لتقليل تكاليف المعاملات والوقت الذي تستغرقه بشكل أكبر", + "nav-roadmap-security-description": "التأكد من حفاظ إيثريوم على مرونته في مواجهة جميع أنواع الهجمات في المستقبل", + "nav-roadmap-security-label": "تحسين الأمان", + "nav-roadmap-ux-description": "يلزم تبسيط استخدام إيثريوم", + "nav-run-a-node-description": "تمتع بالسيادة الكاملة في أثناء المساعدة على تأمين الشبكة", + "nav-security-description": "تعلّم أفضل الممارسات عند استخدام العملة الرقمية", + "nav-smart-contracts-description": "المكونات الأساسية لمنظومة إيثريوم", + "nav-stablecoins-description": "العملات المستقرة هي رموز لإيثريوم مصممة للبقاء عند قيمة ثابتة", + "nav-stake-description": "اربح المكافآت مقابل حماية إيثريوم", + "nav-stake-label": "تجميد العملات", + "nav-staking-home-description": "نظرة عامة إلى الخيارات المختلفة لتجميد العملات", + "nav-staking-home-label": "الصفحة الرئيسية للمراهنة", + "nav-staking-pool-description": "جمّد العملات واربح مكافآت بأي مبلغ من ETH من خلال الانضمام إلى الآخرين", + "nav-staking-pool-label": "تجميد العملات المجمّع", + "nav-staking-saas-description": "تتولى جهة خارجية مختصة بتشغيل العقد عمليات تشغيل عميلك المدقق", + "nav-staking-saas-label": "تجميد العملات باستخدام خدمة", + "nav-staking-solo-description": "تشغيل الأجهزة المنزلية، وتعزيز أمان ولامركزية شبكة إيثريوم بشكلٍ شخصي", + "nav-staking-solo-label": "تجميد العملات الفردي", + "nav-start-building-description": "معلومات مفيدة للمستجدين", + "nav-translation-program-description": "جهد تعاوني لترجمة موقع ethereum.org إلى جميع اللغات", + "nav-tutorials-description": "قائمة منسقة من تعليمات الاستخدام المجتمعية", + "nav-use-cases-description": "اكتشف أفكارًا مختلفة لاستخدام إيثريوم", + "nav-use-cases-label": "Use cases", + "nav-what-is-ether-description": "عملة تطبيقات إيثريوم", + "nav-what-is-ethereum-description": "فهم ما يميز إيثريوم", + "nav-what-is-web3-label": "ما هو Web3؟", + "nav-what-is-web3-description": "بديل عن الاحتكارات المركزية التي تفرض القواعد", + "nav-whitepaper-description": "المستند الفني الأصلي لإيثريوم الذي أعده فيتاليك بوتيرين في عام 2014", + "nav-zkp-description": "طريقة لإثبات صحة مسألة ما دون الحاجة إلى كشف هذه المسألة", "nft-page": "NFT - رموز رقمية غير قابلة للاستبدال", "nfts": "الرموز المميزة غير القابلة للاستبدال", "no": "لا", "on-this-page": "في هذه الصفحة", "open-research": "البحث المفتوح", - "page-developers-aria-label": "قائمة المطورين", + "page-developers-aria-label": "قائمة المبرمجين", "page-index-meta-title": "الصفحة الرئيسية", "page-last-updated": "آخر تحديث للصفحة", + "participate": "المشاركة", + "participate-menu": "قائمة المشاركة", "pbs": "الفصل بين المقدم والمنشيء", "pools": "تجميد العملات المجمّع", "privacy-policy": "سياسة الخصوصية", @@ -150,9 +271,11 @@ "refresh": "يُرجى تحديث الصفحة.", "return-home": "العودة إلى الرئيسية", "roadmap": "خارطة طريق إثيريوم", + "research": "البحوث", + "research-menu": "قائمة البحوث", "resources": "مصادر الترجمة", "regenerative-finance": "ري فاي - التمويل المتجدد", - "run-a-node": "تشغيل عقدة", + "run-a-node": "إضافة عقدة", "rollup-component-website": "الموقع الإلكتروني", "rollup-component-developer-docs": "وثائق المبرمج", "rollup-component-technology-and-risk-summary": "ملخص التكنولوجيا والخطر", @@ -164,10 +287,11 @@ "search-box-blank-state-text": "البحث بعيدًا!", "search-eth-address": "يبدو هذا كعنوان إثيريوم. نحن لا نقدم بيانات محددة للعناوين. حاول البحث عنه في مستكشف كتلة مثل", "search-no-results": "لا توجد نتائج لهذا البحث", + "security": "الأمان", "single-slot-finality": "نهائية فتحة واحدة", "statelessness": "انعدام الجنسية", "see-contributors": "عرض المساهمين", - "set-up-local-env": "إعداد البيئة المحلية", + "set-up-local-env": "إعداد البيئة المحلية الخاصة بك", "sharding": "التقسيم", "show-all": "إظهار الكل", "show-less": "إظهار أقل", @@ -175,12 +299,13 @@ "site-title": "ethereum.org", "skip-to-main-content": "تخطٍ إلى المحتوى الرئيسي", "smart-contracts": "العقود الذكية", - "stablecoins": "العملات الثابتة", + "stablecoins": "العملات المستقرة", "stake-eth": "تجميد عملات إثير", "staking": "تجميد العملات", "start-here": "البدء من هنا", "style-guide": "Style guide", "solo": "تجميد العملات الفردي", + "support": "الدعم", "terms-of-use": "شروط الاستخدام", "translation-banner-body-new": "ترى هذه الصفحة بالإنجليزية لأننا لم نترجمها بعد. ساعدنا في ترجمة هذا المحتوى.", "translation-banner-body-update": "هناك نسخة جديدة من هذه الصفحة لكنها باللغة الإنجليزية فقط الآن. ساعدنا في ترجمة أحدث نسخة.", @@ -191,20 +316,23 @@ "translation-banner-no-bugs-title": "لا توجد أخطاء هنا!", "translation-banner-no-bugs-content": "هذه الصفحة ليست مترجمة. لقد تركنا هذه الصفحة باللغة الإنجليزية بشكل متعمد للوقت الحالي.", "translation-banner-no-bugs-dont-show-again": "عدم الإظهار مجدّدًا", + "translation-program": "برنامج الترجمة", "try-using-search": "حاول استخدام البحث للعثور على ما تبحث عنه أو", "tutorials": "تعليمات الاستخدام", "up": "فوق", + "use": "الاستخدام", "use-ethereum": "استخدام إثيريوم", "use-ethereum-menu": "استخدام قائمة إثيريوم", + "use-menu": "قائمة الاستخدام", "user-experience": "تجربة المستخدم", "verkle-trees": "أشجار فيركل", - "wallets": "المحافظ", + "wallets": "المحافظ الإلكترونية", "we-couldnt-find-that-page": "لا يمكننا العثور على تلك الصفحة", "web3": "ما هو Web3؟", - "web3-title": "Web3", + "web3-title": "الإصدار الثالث من الويب. تم اقتراح Web3 لأول مرة من قبل الدكتور جافين وود، ويمثل رؤية جديدة وتركيزًا لتطبيقات الويب - من التطبيقات المملوكة والمدارة مركزيًا ، إلى التطبيقات المبنية على البروتوكولات اللامركزية (انظر Dapp)", "website-last-updated": "آخر تحديث للموقع", - "what-is-ether": "ما إيثر (ETH)؟", - "what-is-ethereum": "ما هو الإثيريوم؟", + "what-is-ether": "ما إثير (ETH)؟", + "what-is-ethereum": "ما إثيريوم؟", "withdrawals": "عمليات سحب تجميد العملات", "yes": "نعم", "zero-knowledge-proofs": "براهين المعرفة الصفرية" diff --git a/src/intl/bg/common.json b/src/intl/bg/common.json index a9765a83cdd..731feec1177 100644 --- a/src/intl/bg/common.json +++ b/src/intl/bg/common.json @@ -1,17 +1,31 @@ { - "account-abstraction": "Абстракция на акаунта", "about-ethereum-org": "За ethereum.org", "about-us": "За нас", + "adding-desci-projects": "Добавяне на проекти за децентрализирана наука (DeSci)", + "adding-developer-tools": "Добавяне на инструменти за разработчици", + "adding-exchanges": "Добавяне на борси", + "adding-glossary-terms": "Добавяне на термини в речника", + "adding-layer-2s": "Adding Layer 2s", + "adding-products": "Adding Products", + "adding-staking-products": "Добавяне на продукти за залагане", + "adding-wallets": "Добавяне на портфейли", + "account-abstraction": "Абстракция на акаунта", + "acknowledgements": "Благодарности", "aria-toggle-search-button": "Бутон за търсенеToggle", "aria-toggle-menu-button": "Бутон за Toggle меню", "beacon-chain": "Сигнална верига", "bridges": "Мостове на блокова верига", + "bug-bounty": "Акция за намиране на бъгове", + "build": "Изграждане", + "build-menu": "Меню за изграждане", "clear": "Изчистване", "close": "Затваряне", "community": "Общност", "community-hub": "Център на общността", "community-menu": "Меню на общността", "contact": "За контакти", + "content-buckets": "Контейнери за съдържание", + "content-resources": "Ресурси за съдържание", "content-standardization": "Стандартизация на съдържанието", "contributing": "С принос", "contributors": "Сътрудници", @@ -23,11 +37,14 @@ "dao-page": "DAOs - Децентрализирани автономни организации", "dark-mode": "Тъмно", "data-provided-by": "Източник на данни:", - "decentralized-applications-dapps": "Децентрализирани приложения (dapps)", + "decentralized-applications-dapps": "Dapps - Децентрализирани приложения", "decentralized-identity": "Децентрализирана самоличност", "decentralized-social-networks": "Децентрализирани социални мрежи", "decentralized-science": "DeSci - Децентрализирана наука", + "description": "Описание на елемент за навигация", "defi-page": "DeFi - Децентрализирани финанси", + "design": "Дизайн", + "design-principles": "Принципи на дизайн", "devcon": "Девкон/Devcon", "developers": "Разработчици", "developers-home": "Начална страница на разработчиците", @@ -51,7 +68,7 @@ "documentation": "Документация", "down": "Надолу", "ecosystem": "Екосистема", - "edit-page": "Редактиране на страницата", + "edit-page": "Редактирай страницата", "ef-blog": "Блог на фондация Етереум", "eips": "Предложения за подобрения в Етереум", "energy-consumption": "Потребление на електричество от Етериум", @@ -63,7 +80,7 @@ "ethereum-bug-bounty": "Кампания за търсене на бъгове на Етереум", "consensus-when-shipping": "Кога излиза?", "ethereum-upgrades": "Подобрения на Етереум", - "ethereum-brand-assets": "Характеристики на марката Етереум", + "ethereum-brand-assets": "Активи на марката Ethereum", "ethereum-online": "Общности в мрежата", "ethereum-events": "Събития на Етериум", "ethereum-foundation": "Фондация Етереум", @@ -83,22 +100,22 @@ "feedback-card-prompt-tutorial": "Полезено ли беше това обучение?", "feedback-widget-thank-you-title": "Благодарим за обратната връзка!", "feedback-widget-thank-you-subtitle": "Помогнете да направим тази страница по-добра, като отговорите на няколко въпроса.", - "feedback-widget-thank-you-subtitle-ext": "При нужда от помощ, свържете се с общността в нашия Дискорд.", + "feedback-widget-thank-you-subtitle-ext": "Ако се нуждаете от помощ, можете да се обърнете към общността на нашата страница Discord.", "feedback-widget-thank-you-timing": "2 – 3 мин", "feedback-widget-thank-you-cta": "Започнете кратка анкета", "find-wallet": "Намери портфейл", "future-proofing": "Подсигуряване за бъдещето", "get-eth": "Вземете ETH", "get-involved": "Включете се", - "get-started": "Започнете", + "get-started": "Начало", "grants": "Дарения", "grant-programs": "Програми за дарения в екосистемата", "guides": "Ръководства", - "guides-hub": "Център с ръководства", + "guides-hub": "Наръчници", "history-of-ethereum": "Историята на Етереум", "home": "Начална страница", "how-ethereum-works": "Как работи Етериум", - "how-to-register-an-ethereum-account": "Как да „регистрирате“ акаунт в Етереум", + "how-to-create-an-ethereum-account": "Как да „регистрирате“ акаунт в Етереум", "how-to-revoke-token-access": "Как да отмените достъпа на интелигентен договор до средствата ви в криптовалута", "how-to-swap-tokens": "Как да заменяте токени", "how-to-use-a-bridge": "Как да прехвърляте токени на слой 2", @@ -115,7 +132,7 @@ "last-edit": "Последна редакция", "layer-2": "Слой 2", "learn": "Научете", - "learn-by-coding": "Научете, като кодирате", + "learn-by-coding": "Учете се, като кодирате", "learn-hub": "Обучителен център", "learn-menu": "Как да научиш", "learn-more": "Научи повече", @@ -128,10 +145,116 @@ "loading-error-try-again-later": "Данните не могат да се заредят. Опитайте отново по-късно.", "logo": "лого", "mainnet-ethereum": "Основната мрежа на Етереум", - "more": "Още", - "nav-developers": "Разработчици", + "merge": "Сливане", + "more": "Повече", + "nav-about-description": "Публичен проект с отворен код за общността на Eтереум", + "nav-advanced-description": "Научете по-сложните теми", + "nav-advanced-label": "Разширени", + "nav-basics-description": "Разберете какво е основополагащо в Eтереум", + "nav-basics-label": "Основи", + "nav-bridges-description": "Web3 се превърна в екосистема от основни блокови вериги от слой 1 ( L1) и решения за мащабируемост от слой 2 ( L2)", + "nav-builders-home-description": "Ръководство за изграждане за Eтереум – от разработчици за разработчици", + "nav-builders-home-label": "Начална страница за разработчик", + "nav-contribute-description": "Ако имате нужда от помощ, това ще ви насочи", + "nav-contribute-label": "Допринасяне към ethereum.org", + "nav-dao-description": "Общности, притежавани от членовете, без централизирана власт", + "nav-dapps-description": "Разгледайте богата екосистема от приложения с помощта на Eтереум", + "nav-defi-description": "Глобална, отворена алтернатива на традиционния финансов пазар", + "nav-desci-description": "Глобална, отворена алтернатива на настоящата научна система", + "nav-desoc-description": "Базирани на блокови вериги платформи за социално взаимодействие и създаване на съдържание", "nav-developers-docs": "Документация за разработчици", + "nav-developers": "Разработчици", + "nav-did-description": "Издавайте и притежавайте свой собствени, уникални децентрализирани идентификатори", + "nav-docs-description": "Документи, които да ви помогнат да разберете и градите с Eтереум", + "nav-docs-design-description": "Описание на уникални предизвикателства с Web3 дизайн, най-добри практики и информация от потребителски проучвания", + "nav-docs-design-label": "Основи на UX/UI дизайна", + "nav-docs-foundation-description": "Базови фундаменти за разработване в Eтереум", + "nav-docs-foundation-label": "Основни теми", + "nav-docs-overview-description": "Вашата начална страница за документи за разработчици", + "nav-docs-stack-description": "Разберете всички подробности за обема на Етереум", + "nav-docs-stack-label": "Обем на Етереум", + "nav-eip-description": "Стандарти, които определят нови функции или процеси", + "nav-eip-label": "Предложения за подобряване на Eтереум (EIP)", + "nav-emerging-description": "Запознайте се с други, по-нови случаи на използване за Eтереум", + "nav-emerging-label": "Emerging use cases", + "nav-enterprise-description": "Бизнес приложения за Eтереум", + "nav-ethereum-org-description": "Този уебсайт се ръководи от общността – присъединете се към нас и дайте своя принос", + "nav-ethereum-wallets-description": "Приложение, което да взаимодейства с вашия акаунт в Eтереум", + "nav-events-description": "Децентрализация и свободата всеки да участва", + "nav-events-irl-description": "Всеки месец има големи събития на Eтереум – на живо и онлайн", + "nav-events-label": "Общности и събития", + "nav-events-online-description": "Стотици хиляди Eтереум ентусиасти покровителстват тези онлайн общности", + "nav-find-wallet-description": "Портфейлите ви позволяват да използвате криптовалута", + "nav-find-wallet-label": "Изберете своя портфейл", + "nav-gas-fees-description": "Как се изчисляват таксите за транзакции с ETH", + "nav-gas-fees-label": "Gas fees", + "nav-get-eth-description": "Нужен ви е етер (ETH), за да използвате приложенията на Eтереум", + "nav-get-started-description": "Първи стъпки в използването на Eтереум", + "nav-governance-description": "Процесът, използван за надграждането на протокола на Eтереум", + "nav-governance-label": "Управление", + "nav-grants-description": "Списък, подбран от нашата общност, с проекти, които предоставят програми с безвъзмездно финансиране", + "nav-guide-create-account-description": "Всеки може да си създаде акаунт в Eтереум по всяко време, безплатно с приложение за портфейл", + "nav-guide-create-account-label": "Как да „регистрирате“ акаунт в Етереум", + "nav-guide-revoke-access-description": "Бъдете защитени, когато взаимодействате с интелигентни договори и приложения в екосистемата на Eтереум", + "nav-guide-revoke-access-label": "Как да отмените достъпа на интелигентен договор", + "nav-guide-use-wallet-description": "Разберете как да управлявате всички основни функции на портфейл", + "nav-guide-use-wallet-label": "Как се използва портфейл", + "nav-guides-description": "Практични поетапни ръководства, които да ви помогнат да започнете", + "nav-guides-label": "Наръчници", + "nav-history-description": "Хронологичен списък на всички големи вилки и актуализации", + "nav-history-label": "Техническа история на Eтереум", + "nav-layer-2-description": "По-евтини и по-бързи трансакции за Eтереум", + "nav-learn-by-coding-description": "Инструменти, които ще ви помогнат да експериментирате с Eтереум", + "nav-local-env-description": "Изберете и настройте своя обем разработки в Eтереум", + "nav-mainnet-description": "Приложения на блоковата верига за предприятия мога да се изграждат на публичната основна мрежа на Eтереум", + "nav-nft-description": "Начин, по който да представите всяко уникално нещо като базиран на Етереум актив", + "nav-open-research-description": "Една от основните силни страни на Eтереум е активната изследователска общност", + "nav-open-research-label": "Отворено проучване", + "nav-overview-description": "Всичко за обучение за Eтереум", + "nav-overview-label": "Преглед", + "nav-participate-overview-description": "Общ преглед на начините да участвате", "nav-primary": "Основен", + "nav-private-description": "Ресурси на разработчиците за частното предприятие на Етереум", + "nav-quizzes-description": "Вижте колко добре разбирате Eтереум и криптовалутите", + "nav-quizzes-label": "Тествайте знанията си", + "nav-refi-description": "Алтернативна икономическа система, изградена на регенеративни принципи", + "nav-research-description": "Процес, използван за подобряване на Eтереум", + "nav-research-label": "Научно-изследователска и развойна дейност", + "nav-roadmap-description": "Пътят към по-голяма мащабност, сигурност и устойчивост за Eтереум", + "nav-roadmap-future-description": "Утвърждаване на Eтереум като стабилна и децентрализирана мрежа", + "nav-roadmap-future-label": "Подсигуряване за бъдещето", + "nav-roadmap-label": "Пътна карта", + "nav-roadmap-scaling-description": "Актуализации на мрежата за допълнително намаляване на цената на трансакциите и скоростта им", + "nav-roadmap-scaling-label": "Cheaper transactions", + "nav-roadmap-security-description": "Гарантиране, че Eтереум ще остане устойчива на всякакви атаки в бъдеще", + "nav-roadmap-security-label": "Повишена сигурност", + "nav-roadmap-ux-description": "Употребата на Eтереум трябва да е лесна", + "nav-roadmap-ux-label": "Better user experience", + "nav-run-a-node-description": "Станете напълно суверенни, като същевременно подпомагате обезопасяването на мрежата", + "nav-security-description": "Научете кои са най-добрите практики при използване на криптовалута", + "nav-smart-contracts-description": "Основните градивни блокове на екосистемата на Eтереум", + "nav-stablecoins-description": "Стейбълкойните са токени на Eтереум, създадени да поддържат фиксирана стойност", + "nav-stake-description": "Печелете награди за това да правите Eтереум по-безопасна", + "nav-stake-label": "Залагане", + "nav-staking-home-description": "Преглед на различните опции за залагане", + "nav-staking-home-label": "Staking home", + "nav-staking-pool-description": "Залагайте и печелете награди с каквато и да е сума ETH, като се обедините с други", + "nav-staking-pool-label": "Групово залагане", + "nav-staking-saas-description": "Third-party node operators handle the operation of your validator client", + "nav-staking-saas-label": "Залагане с услуга", + "nav-staking-solo-description": "Run home hardware and personally add to the security and decentralization of the Ethereum network", + "nav-staking-solo-label": "Самостоятелно залагане", + "nav-start-building-description": "Полезна информация за начинаещи", + "nav-translation-program-description": "Доброволно сътрудничество за превеждане на ethereum.org на всички езици", + "nav-tutorials-description": "Списък на общността с подбрани обучения", + "nav-use-cases-description": "Открийте различни идеи за използване на Eтереум", + "nav-use-cases-label": "Use cases", + "nav-what-is-ether-description": "Валутата на приложенията на Eтереум", + "nav-what-is-ethereum-description": "Научете какво прави Eтереум специална", + "nav-what-is-web3-label": "Какво представлява Web3?", + "nav-what-is-web3-description": "Алтернатива на централизираните монополи, които диктуват правилата", + "nav-whitepaper-description": "Оригиналният Уайтпейпър на Eтереум, написан от Виталик Бутерин през 2014 г.", + "nav-zkp-description": "Начин да се докаже валидността на твърдение, без самото твърдение да се разкрива", "nft-page": "NFTs - Незаменяеми токени", "nfts": "NFT", "no": "Не", @@ -140,6 +263,8 @@ "page-developers-aria-label": "Меню за разработчици", "page-index-meta-title": "Начална страница", "page-last-updated": "Последна актуализация на страницата", + "participate": "Участвайте", + "participate-menu": "Меню за участие", "pbs": "Разделяне на предлагащ и строител", "pools": "Групово залагане", "privacy-policy": "Политика за поверителност", @@ -150,13 +275,15 @@ "refresh": "Моля, обновете страницата.", "return-home": "към началната страница", "roadmap": "Пътна карта на Етереум", + "research": "Проучване", + "research-menu": "Меню за проучване", "resources": "Източници за превод", "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Активиране на възел", + "run-a-node": "Активирайте нод", "rollup-component-website": "Уебсайт", "rollup-component-developer-docs": "Документация на разработчика", "rollup-component-technology-and-risk-summary": "Технология и обобщение на рисковете", - "scaling": "Увеличаване на мащаба", + "scaling": "Мащаб", "saas": "Залагането като услуга", "search": "Търсене", "search-ethereum-org": "Търсене на ethereum.org", @@ -164,6 +291,7 @@ "search-box-blank-state-text": "Търсете по-нататък!", "search-eth-address": "Това прилича на адреса на Етереум. Ние не предлагаме данни, които са специфични за даден адрес. Опитайте да го намерите в block explorer като", "search-no-results": "Няма резултати от търсенето ви", + "security": "Сигурност", "single-slot-finality": "Финализиране в рамките на един слот", "statelessness": "Без състояние", "see-contributors": "Вижте сътрудниците", @@ -175,12 +303,13 @@ "site-title": "ethereum.org", "skip-to-main-content": "Прeскачане към основното съдържание", "smart-contracts": "Умни договори", - "stablecoins": "Стейбълкойни/Stablecoins", + "stablecoins": "Стейбълкойни", "stake-eth": "Залагайте ETH", "staking": "Залагане", "start-here": "Започнете тук", "style-guide": "Style guide", "solo": "Самостоятелно залагане", + "support": "Поддръжка", "terms-of-use": "Условия за ползване", "translation-banner-body-new": "Виждате тази страница на английски език, защото все още не сме я превели. Помогнете ни да преведем съдържанието.", "translation-banner-body-update": "Има нова версия на тази страница, но все още е само на английски език. Помогнете ни да преведем последната версия.", @@ -191,11 +320,14 @@ "translation-banner-no-bugs-title": "Тук няма грешки!", "translation-banner-no-bugs-content": "Тази страница не се превежда. Засега нарочно сме я оставили на английски език.", "translation-banner-no-bugs-dont-show-again": "Да не се показва отново", + "translation-program": "Програма за преводи", "try-using-search": "Опитайте да намерите това, което търсите, с търсачката или", "tutorials": "Ръководства", "up": "Нагоре", + "use": "Използване", "use-ethereum": "Използвайте Етереум", "use-ethereum-menu": "Използвайте менюто на Етереум", + "use-menu": "Меню за използване", "user-experience": "User experience", "verkle-trees": "Дърво на Verkle", "wallets": "Портфейли", @@ -203,8 +335,8 @@ "web3": "Какво представлява Web3?", "web3-title": "Web3", "website-last-updated": "Последно обновяване на уебсайта", - "what-is-ether": "Какво е етер/ether (ETH)?", - "what-is-ethereum": "Какво е Етереум?", + "what-is-ether": "Какво е етер (ETH)?", + "what-is-ethereum": "Какво е Eтереум?", "withdrawals": "Тегления на залози", "yes": "Да", "zero-knowledge-proofs": "Доказателства за нулево знание" diff --git a/src/intl/bn/common.json b/src/intl/bn/common.json index ab45f020d62..dccbbcca89b 100644 --- a/src/intl/bn/common.json +++ b/src/intl/bn/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "অ্যাকাউন্ট এবস্ট্রাকশন", "about-ethereum-org": "ethereum.org সম্পর্কে", "about-us": "আমাদের সম্পর্কে", + "adding-desci-projects": "Desci প্রকল্প যোগ করা হচ্ছে", + "adding-developer-tools": "ডেভেলপার টুল যোগ করা হচ্ছে", + "adding-exchanges": "এক্সচেঞ্জ যোগ করা হচ্ছে", + "adding-glossary-terms": "শব্দকোষের শর্তাদি যোগ করা হচ্ছে", + "adding-staking-products": "স্টেকিং পণ্য যোগ করা হচ্ছে", + "adding-wallets": "ওয়ালেট যোগ করা হচ্ছে", + "account-abstraction": "অ্যাকাউন্ট এবস্ট্রাকশন", + "acknowledgements": "অনুমোদন সমূহ", "aria-toggle-search-button": "সার্চ বাটন টগল করুন", "aria-toggle-menu-button": "মেনু বাটন টগল করুন", "beacon-chain": "বীকন চেন", "bridges": "ব্লকচেইন ব্রীজ", + "bug-bounty": "বাগ বাউন্টি", + "build": "বিল্ড", + "build-menu": "বিল্ড মেনু", "clear": "পরিষ্কার করুন", "close": "বন্ধ", "community": "কমিউনিটি", "community-hub": "কমিউনিটি হাব", "community-menu": "কমিউনিটি মেনু", "contact": "যোগাযোগ", + "content-buckets": "বিষয়বস্তু বালতি", + "content-resources": "বিষয়বস্তু সম্পদ", "content-standardization": "কন্টেন্টের মান নির্ধারণ", "contributing": "অবদান রাখছে", "contributors": "অবদানকারী", @@ -23,11 +35,14 @@ "dao-page": "DAOs - বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা", "dark-mode": "ডার্ক", "data-provided-by": "ডেটার উৎস:", - "decentralized-applications-dapps": "বিকেন্দ্রীভূত অ্যাপ্লিকেশন (dapps)", + "decentralized-applications-dapps": "Dapps - বিকেন্দ্রীভূত অ্যাপ্লিকেশন", "decentralized-identity": "বিকেন্দ্রীভূত পরিচয়", "decentralized-social-networks": "বিকেন্দ্রীভূত সামাজিক নেটওয়ার্ক", "decentralized-science": "DeSci - ডিসেন্ট্রালাইজড সায়েন্স", + "description": "ন্যাভ আইটেমের জন্য বর্ণনা", "defi-page": "DeFi - বিকেন্দ্রীভূত অর্থ ", + "design": "ডিজাইন", + "design-principles": "ডিজাইনের মূলনীতি", "devcon": "Devcon", "developers": "ডেভেলপারগণ", "developers-home": "ডেভেলপার-এর হোম পেজ", @@ -63,7 +78,6 @@ "ethereum-bug-bounty": "ইথেরিয়াম বাগ বাউন্টি প্রোগ্রাম", "consensus-when-shipping": "এটার শিপিং কখন?", "ethereum-upgrades": "ইথেরিয়াম আপগ্রেড", - "ethereum-brand-assets": "ইথেরিয়ামের ব্র্যান্ড অ্যাসেট", "ethereum-online": "অনলাইন কমিউনিটি", "ethereum-events": "ইথেরিয়াম ইভেন্ট", "ethereum-foundation": "ইথেরিয়াম ফাইন্ডেশন", @@ -75,7 +89,7 @@ "ethereum-protocol": "ইথেরিয়াম প্রোটোকল", "ethereum-security": "ইথেরিয়াম সুরক্ষা এবং স্ক্যাম প্রতিরোধ", "ethereum-support": "ইথেরিয়াম সাপোর্ট", - "ethereum-wallets": "ইথেরিয়াম ওয়ালেট", + "ethereum-wallets": "ইথেরিয়াম ওয়ালেট", "ethereum-whitepaper": "ইথেরিয়াম হোয়াইটপেপার", "feedback-widget-prompt": "এই পৃষ্ঠাটি কি সহায়ক?", "feedback-card-prompt-page": "এই পৃষ্ঠাটি কি সহায়ক ছিল?", @@ -83,22 +97,22 @@ "feedback-card-prompt-tutorial": "এই টিউটোরিয়ালটি কি সহায়ক ছিল?", "feedback-widget-thank-you-title": "আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ!", "feedback-widget-thank-you-subtitle": "কয়েকটি প্রশ্নের উত্তর দিয়ে এই পৃষ্ঠাটিকে আরও ভালো করুন।", - "feedback-widget-thank-you-subtitle-ext": "আপনার যদি সাহায্যের প্রয়োজন হয়, আমাদের Discord কমিউনিটির সাথে যোগাযোগ করতে পারেন।", + "feedback-widget-thank-you-subtitle-ext": "আপনার সাহায্যের প্রয়োজন হলে, আপনি আমাদের Discord-এ সম্প্রদায়ের সাথে যোগাযোগ করতে পারেন।.", "feedback-widget-thank-you-timing": "2–3 মিনিট", "feedback-widget-thank-you-cta": "ওপেন-শর্ট জরিপ", "find-wallet": "ওয়ালেট খুঁজে নিন", "future-proofing": "ভবিষ্যত-সুরক্ষাকরণ", - "get-eth": "ETH পান", + "get-eth": "ETH নিন", "get-involved": "যুক্ত হোন", - "get-started": "শু্রু করুন", + "get-started": "শুরু করা যাক", "grants": "অনুদান", "grant-programs": "ইকোসিস্টেম অনুদান কর্মসূচি", "guides": "নির্দেশিকা", - "guides-hub": "নির্দেশিকা কেন্দ্র", + "guides-hub": "কিভাবে নির্দেশিকা", "history-of-ethereum": "ইথেরিয়ামের ইতিহাস", "home": "হোম ", "how-ethereum-works": "ইথেরিয়াম কীভাবে কাজ করে", - "how-to-register-an-ethereum-account": "কিভাবে একটি ইথেরিয়াম একাউন্টে \"নিবন্ধন\" করবেন", + "how-to-create-an-ethereum-account": "কিভাবে একটি ইথেরিয়াম একাউন্টে \"নিবন্ধন\" করবেন", "how-to-revoke-token-access": "কিভাবে আপনার ক্রিপ্টো ফান্ড থেকে স্মার্ট কন্ট্রাক্টের অ্যাক্সেস প্রত্যাহার করবেন", "how-to-swap-tokens": "কিভাবে টোকেন অদলবদল করতে হয়", "how-to-use-a-bridge": "কিভাবে লেয়ার 2 এর সাথে টোকেন সংযুক্ত করতে হয়", @@ -128,10 +142,108 @@ "loading-error-try-again-later": "ডেটা লোড করতে অক্ষম। পরে আবার চেষ্টা করুন।", "logo": "লোগো", "mainnet-ethereum": "মেননেট ইথেরিয়াম", + "merge": "একত্র করুন", "more": "আরও অনেক কিছু", - "nav-developers": "ডেভেলপারগণ", + "nav-about-description": "ইথেরিয়াম কমিউনিটির জন্য এক পাবলিক, ওপেন-সোর্স প্রোজেক্ট", + "nav-advanced-description": "আরও জটিল বিষয়ে জানুন", + "nav-advanced-label": "উন্নত", + "nav-basics-description": "ইথেরিয়ামের মূলনীতিকে বুঝুন", + "nav-basics-label": "প্রাথমিক", + "nav-bridges-description": "Web3 নিজেকে উন্নত করে প্রাথমিক L1 ব্লকচেইন এবং L2 স্কেলিং সলিউশনে পরিণত করেছে", + "nav-builders-home-description": "ইথেরিয়ামের জন্য বিল্ডারদের একটি নির্দেশপুস্তিকা—বিল্ডারদের দ্বারা, বিল্ডারদের জন্য", + "nav-builders-home-label": "বিল্ডারের হোম", + "nav-contribute-description": "আপনি সাহায্য করতে চাইলে, এটি আপনাকে গাইড করবে", + "nav-contribute-label": "ethereum.org -এ অবদান রাখা", + "nav-dao-description": "সদস্যরাই হলেন কমিউনিটির মালিক এবং এখানে কেন্দ্রীয় কোনও নিয়ন্ত্রণ নেই", + "nav-dapps-description": "ইথেরিয়ামের সাহায্যে অ্যাপের এক সমৃদ্ধ ইকোসিস্টেম ঘুরে দেখুন", + "nav-defi-description": "চিরাচরিত আর্থিক বাজারের নিরিখে এক বিশ্বব্যাপী, উন্মুক্ত বিকল্প", + "nav-desci-description": "বর্তমান বৈজ্ঞানিক ব্যবস্থার নিরিখে এক বিশ্বব্যাপী, উন্মুক্ত বিকল্প", + "nav-desoc-description": "সোশ্যাল ইন্টার‌্যাকশন এবং কন্টেন্ট তৈরির জন্য ব্লকচেইন-ভিত্তিক প্ল্যাটফর্ম", "nav-developers-docs": "ডেভেলপার ডকুমেন্ট", + "nav-developers": "ডেভেলপারগণ", + "nav-did-description": "আপনার নিজস্ব স্বতন্ত্র ডিসেন্ট্রালাইজ আইডেন্টিফায়ার ইস্যু করুন এবং তার মালিক হোন", + "nav-docs-description": "ইথেরিয়ামের সাহায্যে বুঝতে এবং বিল্ড করতে সাহায্য করার জন্য ডক্স", + "nav-docs-design-description": "স্বতন্ত্র Web3 ডিজাইনের চ্যালেঞ্জ, সেরা পদ্ধতির বর্ণনা এবং ব্যবহারকারীর বিষয়ে গবেষণার গভীরে আলোকপাত", + "nav-docs-design-label": "UX/UI ডিজাইনের মূল বিষয়", + "nav-docs-foundation-description": "ইথেরিয়ামে ডেভেলপ করার বিষয়ে প্রধান বিষয়গুলি", + "nav-docs-overview-description": "আপনার ডেভেলপার হোমের ডক্স", + "nav-docs-stack-description": "ইথেরিয়াম স্ট্যাকের সমস্ত বিস্তারিত বোঝা", + "nav-eip-description": "স্ট্যান্ডার্ড যা নতুন ফিচার বা প্রক্রিয়াকে সুনির্দিষ্ট করে", + "nav-eip-label": "ইথেরিয়াম উন্নয়নের প্রস্তাব (EIP)", + "nav-emerging-description": "ইথেরিয়াম আরও নতুন কোন কোন ভাবে ব্যবহার করা সম্ভব তা জানুন", + "nav-enterprise-description": "ইথেরিয়ামের জন্য বিজনেস অ্যাপ্লিকেশন", + "nav-ethereum-org-description": "এই ওয়েবসাইটটি কমিউনিটির দ্বারা চালিত হয়—আমাদের সাথে যোগ দিন এবং আপনার অবদান রাখুন", + "nav-ethereum-wallets-description": "আপনার ইথেরিয়াম অ্যাকাউন্টের সাথে ইন্টার‍্যাক্ট করার একটি অ্যাপ", + "nav-events-description": "ডিসেন্ট্রালাইজ পদ্ধতি এবং সবার অংশগ্রহণ করার স্বাধীনতা", + "nav-events-irl-description": "প্রতি মাসেই অফলাইন এবং অনলাইন উভয় মোডেই প্রধান ইথেরিয়াম ইভেন্ট সংগঠিত হয়", + "nav-events-label": "কমিউনিটি এবং ইভেন্ট", + "nav-events-online-description": "হাজার হাজার ইথেরিয়াম অনুরাগী এইসব অনলাইন কমিউনিটিতে নেতৃত্ব দেন", + "nav-find-wallet-description": "আপনি ওয়ালেটের মাধ্যমে ক্রিপ্টো ব্যবহার করতে পারবেন", + "nav-find-wallet-label": "আপনার ওয়ালেট বেছে নিন", + "nav-gas-fees-description": "কীভাবে ETH ট্রানজ্যাকশন ফি হিসাব করা হয়", + "nav-gas-fees-label": "Ethereum-এ গ্যাস সম্পর্কে জানুন: তারা কীভাবে কাজ করে এবং কীভাবে গ্যাস ফি কম দিতে হয়", + "nav-get-eth-description": "ইথেরিয়াম অ্যাপ্লিকেশন ব্যবহার করতে হলে আপনার ইথার (ETH) প্রয়োজন", + "nav-get-started-description": "ইথেরিয়াম ব্যবহার করতে আপনার প্রথম ধাপ", + "nav-governance-description": "ইথেরিয়াম প্রোটোকল আপগ্রেড করার প্রক্রিয়া", + "nav-governance-label": "পরিচালনা", + "nav-grants-description": "গ্র্যান্ট ফান্ডিং প্রোগ্রাম দেওয়া প্রোজেক্টের বিষয়ে আমাদের কমিউনিটির একত্রিত করা একটি তালিকা", + "nav-guide-create-account-description": "একটি ওয়ালেট অ্যাপ দিয়ে বিনামূল্যে যেকেউ যখন খুশি একটি ইথেরিয়াম অ্যাকাউন্ট তৈরি করতে পারবেন", + "nav-guide-create-account-label": "কিভাবে একটি ইথেরিয়াম একাউন্টে \"নিবন্ধন\" করবেন", + "nav-guide-revoke-access-description": "ইথেরিয়াম ইকোসিস্টেমে স্মার্ট কন্ট্র্যাক্ট এবং অ্যাপ্লিকেশনের সাথে নিরাপদভাবে ইন্টার‍্যাক্ট করুন", + "nav-guide-revoke-access-label": "কীভাবে স্মার্ট কন্ট্র্যাক্টের অ্যাক্সেস প্রত্যাহার করবেন", + "nav-guide-use-wallet-description": "কীভাবে কোনও ওয়ালেটের সমস্ত প্রাথমিক বৈশিষ্ট্য ব্যবহার করবেন তা জানুন", + "nav-guide-use-wallet-label": "কিভাবে একটি ওয়ালেট ব্যবহার করতে হয়", + "nav-guides-description": "আপনাকে শুরু করতে সাহায্য করার জন্য বাস্তবিক ধাপে-ধাপে গাইড", + "nav-guides-label": "কীভাবে করবেন তার গাইড", + "nav-history-description": "সমস্ত প্রধান ফোর্ক এবং আপডেটের টাইমলাইন", + "nav-history-label": "ইথেরিয়ামের টেকনিক্যাল হিস্ট্রি", + "nav-layer-2-description": "ইথেরিয়ামের জন্য অপেক্ষাকৃত সস্তায় এবং তাড়াতাড়ি ট্রানজ্যাকশন", + "nav-learn-by-coding-description": "ইথেরিয়ামের সাথে পরীক্ষানীরিক্ষা করার টুলস", + "nav-local-env-description": "আপনার ইথেরিয়াম ডেভেলপমেন্ট স্ট্যাক বেছে নিন এবং সেট-আপ করুন", + "nav-mainnet-description": "এন্টারপ্রাইজ ব্লকচেইন অ্যাপ্লিকেশন পাবলিক ইথেরিয়াম মেইননেটে বানানো সম্ভব", + "nav-nft-description": "একটি ইথেরিয়াম-ভিত্তিক সম্পদ হিসেবে অনন্য কিছু উপস্থাপন করার একটি উপায়", + "nav-open-research-description": "অ্যাক্টিভ রিসার্চ কমিউনিটি হল ইথেরিয়ামের অন্যতম প্রধান শক্তি", + "nav-open-research-label": "উন্মুক্ত গবেষণা", + "nav-overview-description": "ইথেরিয়াম শিক্ষার সবকিছু", + "nav-participate-overview-description": "কীভাবে অংশগ্রহণ করবেন তা একঝলকে", "nav-primary": "প্রাইমারি", + "nav-quizzes-description": "আপনি ইথেরিয়াম এবং ক্রিপ্টোকারেন্সি কতটা ভালো বোঝেন তা দেখে নিন", + "nav-quizzes-label": "আপনার জ্ঞানের পরীক্ষা করুন", + "nav-refi-description": "পুনঃউৎপাদনমূলক নীতির উপর নির্মিত একটি বিকল্প অর্থনৈতিক ব্যবস্থা", + "nav-research-description": "ইথেরিয়ামকে উন্নত করতে ব্যবহৃত প্রক্রিয়াগুলি", + "nav-research-label": "গবেষণা এবং উন্নয়ন", + "nav-roadmap-description": "ইথেরিয়ামের জন্য আরও স্কেল করার, নিরাপত্তার এবং স্থায়িত্বের পথ", + "nav-roadmap-future-description": "ইথেরিয়ামকে এক শক্তিশালী এবং ডিসেন্ট্রালাইজড নেটওয়ার্ক হিসাবে আরও মজবুত করে তোলা", + "nav-roadmap-future-label": "ভবিষ্যত-সুরক্ষাকরণ", + "nav-roadmap-label": "রোডম্যাপ", + "nav-roadmap-scaling-description": "ট্রানজ্যাকশন খরচ এবং গতি আরও কমাতে নেটওয়ার্ক আপডেট", + "nav-roadmap-security-description": "ভবিষ্যতে সবধরনের আক্রমণ যাতে ইথেরিয়াম প্রতিহত করতে পারে তা নিশ্চিত করে তোলা হচ্ছে", + "nav-roadmap-security-label": "উন্নত নিরাপত্তা", + "nav-roadmap-ux-description": "ইথেরিয়ামের ব্যবহার আরও সহজ হতে হবে", + "nav-run-a-node-description": "নেটওয়ার্ক সুরক্ষিত করতে সাহায্য করার সময় সম্পূর্ণ সার্বভৌম হয়ে উঠুন", + "nav-security-description": "সেরা পদ্ধতি মেনে ক্রিপ্টোকারেন্সি ব্যবহার করার বিষয়ে জানুন", + "nav-smart-contracts-description": "ইথেরিয়াম ইকোসিস্টেমের প্রাথমিক ভিত্তিপ্রস্তর", + "nav-stablecoins-description": "স্টেবলকয়েন হল ইথেরিয়াম টোকেন যা এক নির্দিষ্ট মানে থাকবে বলেই ডিজাইন করা হয়েছে", + "nav-stake-description": "ইথেরিয়াম সুরক্ষিত করার জন্য পুরষ্কার অর্জন করুন", + "nav-stake-label": "স্টেক", + "nav-staking-home-description": "স্টেক করার জন্য বিভিন্ন অপশনের একঝলক", + "nav-staking-home-label": "স্টেকিং হোম", + "nav-staking-pool-description": "অন্যদের সাথে যোগদান করে যেকোনও পরিমাণের ETH দিয়ে স্টেক করুন এবং পুরস্কার জিতে নিন", + "nav-staking-pool-label": "সম্মিলিত স্টেকিং", + "nav-staking-saas-description": "থার্ড-পার্টি নোড অপারেটররা আপনার ভ্যালিডেটর ক্লায়েন্টের অপারেশন পরিচালনা করে", + "nav-staking-saas-label": "একটি পরিষেবা দিয়ে স্টেকিং", + "nav-staking-solo-description": "হোম হার্ডওয়্যার চালান এবং ব্যক্তিগতভাবে ইথেরিয়াম নেটওয়ার্কের নিরাপত্তা এবং বিকেন্দ্রীকরণ যোগ করুন", + "nav-staking-solo-label": "স্বতন্ত্র স্টেকিং", + "nav-start-building-description": "নতুনদের সাহায্যের জন্য তথ্য", + "nav-translation-program-description": "ethereum.org ওয়েবসাইটকে সমস্ত ভাষায় অনুবাদ করার জন্য সকলে মিলে করা এক প্রয়াস", + "nav-tutorials-description": "কমিউনিটির টিউটোরিয়ালের একত্রিত করা তালিকা", + "nav-use-cases-description": "ইথেরিয়াম ব্যবহারের বিভিন্ন আইডিয়া খুঁজে নিন", + "nav-what-is-ether-description": "ইথেরিয়াম অ্যাপের মুদ্রা", + "nav-what-is-ethereum-description": "কীভাবে ইথেরিয়াম বিশেষ হয়ে উঠেছে তা বুঝে নেওয়া", + "nav-what-is-web3-label": "Web3 কি?", + "nav-what-is-web3-description": "নিয়মকে চালিত করা কেন্দ্রীয়ভাবে একচেটিয়া নিয়ন্ত্রণের একটি বিকল্প", + "nav-whitepaper-description": "2014 সালে ভিটালিক বুটেরিনের লেখা আসল ইথেরিয়াম হোয়াইটপেপার", + "nav-zkp-description": "স্টেটমেন্টটিকে প্রকাশ না করেই স্টেটমেন্টের বৈধতা প্রমাণ করার একটি রাস্তা", "nft-page": "NFT - নন-ফাঞ্জিবল টোকেন", "nfts": "NFT", "no": "না", @@ -140,6 +252,7 @@ "page-developers-aria-label": "ডেভেলপারদের মেনু", "page-index-meta-title": "হোম ", "page-last-updated": "যখন পৃষ্ঠাটি শেষবারের মতো আপডেট করা হয়েছে", + "participate-menu": "অংশগ্রহণের মেনু", "pbs": "প্রস্তাবক-নির্মাতা পৃথকীকরণ", "pools": "সম্মিলিত স্টেকিং", "privacy-policy": "গোপনীয়তা সংক্রান্ত নীতি", @@ -150,10 +263,10 @@ "refresh": "অনুগ্রহ করে পেজটি রিফ্রেস করুন।", "return-home": "হোম এ ফেরত যান", "roadmap": "ইথেরিয়াম রোডম্যাপ", + "research": "গবেষণা", + "research-menu": "গবেষণার মেনু", "resources": "অনুবাদ সংক্রান্ত রিসোর্সগুলো", "regenerative-finance": "ReFi - রিজেনারেটিভ ফাইনান্স", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "ডেভেলপারের ডকুমেন্ট", "rollup-component-technology-and-risk-summary": "প্রযুক্তি এবং ঝুঁকি সংক্রান্ত সারাংশ", "scaling": "স্কেলিং", @@ -164,11 +277,11 @@ "search-box-blank-state-text": "খুঁজে নিন!", "search-eth-address": "এটি একটি ইথেরিয়াম ঠিকানার মতো দেখায়। আমরা ঠিকানার জন্য নির্দিষ্ট ডেটা প্রদান করি না। একটি ব্লক এক্সপ্লোরারে এটির জন্য খোঁজার চেষ্টা করুন যেমন", "search-no-results": "আপনার সার্চের জন্য কোনও ফলাফল পাওয়া যায়নি", + "security": "নিরাপত্তা", "single-slot-finality": "সিঙ্গেল-স্লট ফাইনালিটি", "statelessness": "রাষ্ট্রহীনতা", "see-contributors": "অবদানকারীদের দেখুন", - "set-up-local-env": "স্থানীয় পরিবেশ সেট-আপ করুন", - "sharding": "Sharding", + "set-up-local-env": "স্থানীয় পরিবেশ সেট আপ করুন", "show-all": "সবকটি দেখুন", "show-less": "কম দেখুন", "site-description": "ইথেরিয়াম হল অর্থ এবং নতুন ধরনের অ্যাপ্লিকেশনগুলির জন্য একটি বিশ্বজনীন, বিকেন্দ্রীভূত প্ল্যাটফর্ম। ইথেরিয়াম-এ আপনি কোড লিখতে পারেন যা অর্থ নিয়ন্ত্রণ করে, এবং বিশ্বের যে কোনো জায়গা থেকে প্রবেশগম্য অ্যাপ্লিকেশন নির্মাণ করে।", @@ -179,7 +292,6 @@ "stake-eth": "স্টেইক ETH", "staking": "স্টেকিং", "start-here": "এখানে শুরু করুন", - "style-guide": "Style guide", "solo": "স্বতন্ত্র স্টেকিং", "terms-of-use": "ব্যবহারের শর্তাবলী", "translation-banner-body-new": "আপনি এই পৃষ্ঠাটি ইংরেজিতে দেখছেন, কারণ আমরা এখনও এটি অনুবাদ করি নি। এই কন্টেন্ট অনুবাদ করতে আমাদের সাহায্য করুন।", @@ -187,23 +299,25 @@ "translation-banner-button-see-english": "ইংরেজিতে দেখুন", "translation-banner-button-translate-page": "পেজ অনুবাদ করুন", "translation-banner-title-new": "এই পৃষ্ঠাটি অনুবাদ করতে সাহায্য করুন", - "translation-banner-title-update": "এই পৃষ্ঠাটি আপডেট করতে সাহায্য করুন", + "translation-banner-title-update": "এই পাতাটি আপডেট করতে সাহায্য করুন", "translation-banner-no-bugs-title": "এখানে কোন বাগ নেই!", "translation-banner-no-bugs-content": "এই পেজটি অনুবাদ করা হয়নি। আমরা ইচ্ছাকৃত এই পেজটি আপাতত ইংরেজিতে রেখেছি।", "translation-banner-no-bugs-dont-show-again": "পুনরায় দেখাবেন না", + "translation-program": "অনুবাদ কর্মসূচি", "try-using-search": "সার্চ ব্যবহার করে আপনি যা খুঁজছেন তা পাওয়ার চেষ্টা করুন অথবা", "tutorials": "টিউটোরিয়াল", "up": "উপরে", + "use": "ব্যবহার", "use-ethereum": "ইথেরিয়াম ব্যবহার করুন", "use-ethereum-menu": "ইথেরিয়াম মেনু ব্যবহার করুন", - "user-experience": "User experience", + "use-menu": "ব্যবহারের মেনু", "verkle-trees": "ভার্কল ট্রি", "wallets": "ওয়ালেটসমূহ", "we-couldnt-find-that-page": "আমরা সেই পৃষ্ঠাটি খুঁজে পাইনি", "web3": "Web3 কি?", "web3-title": "Web3", "website-last-updated": "যখন ওয়েবসাইট শেষবারের মতো আপডেট করা হয়েছে", - "what-is-ether": "ইথার (ETH)বলতে কী বোঝায়?", + "what-is-ether": "ইথার (ETH) কী?", "what-is-ethereum": "ইথেরিয়াম কী?", "withdrawals": "স্টেকিং উইথড্রয়াল", "yes": "হ্যাঁ", diff --git a/src/intl/cs/common.json b/src/intl/cs/common.json index fc4646d38fa..259eda85ff3 100644 --- a/src/intl/cs/common.json +++ b/src/intl/cs/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Zobrazit menu", "beacon-chain": "Řetězová vazba", "bridges": "Blockchainové mosty", + "bug-bounty": "Odměna za vyřešení chyby", + "build": "Vytváření", + "build-menu": "Nabídka Vytváření", "clear": "Vymazat", "close": "Zavřít", "community": "Komunita", @@ -34,10 +37,11 @@ "dao-page": "DAO - Decentralizované autonomní organizace", "dark-mode": "Tmavý", "data-provided-by": "Zdroj dat:", - "decentralized-applications-dapps": "Decentralizované aplikace (dapps)", + "decentralized-applications-dapps": "Dapps - Decentralizované aplikace", "decentralized-identity": "Decentralizovaná identita", "decentralized-social-networks": "Decentralizované sociální sítě", "decentralized-science": "„Decentralizovaná věda“", + "description": "Popis položky navigace", "defi-page": "DeFi - Decentralizované finance", "design": "Design", "design-principles": "Principy designu", @@ -96,14 +100,14 @@ "feedback-card-prompt-tutorial": "Byl tento tutoriál užitečný?", "feedback-widget-thank-you-title": "Děkujeme za Váš názor!", "feedback-widget-thank-you-subtitle": "Tuto stránku můžete zlepšit zodpovězením několika otázek.", - "feedback-widget-thank-you-subtitle-ext": "Pokud potřebuješ pomoct, můžeš se obrátit na komunitu na našem Discordu.", + "feedback-widget-thank-you-subtitle-ext": "Pokud potřebujete poradit, obraťte se na naší komunitu na našem Discordu.", "feedback-widget-thank-you-timing": "2–3 minuty", "feedback-widget-thank-you-cta": "Vyplnit krátkou anketu", "find-wallet": "Najít peněženku", "future-proofing": "Příprava na budoucnost", "get-eth": "Získat ETH", "get-involved": "Zapojit se", - "get-started": "Začít", + "get-started": "Začínáme", "grants": "Granty", "grant-programs": "Grantové programy pro ekosystém", "guides": "Příručky", @@ -143,17 +147,121 @@ "mainnet-ethereum": "Mainnet Ethereum", "merge": "Sloučení", "more": "Více", - "nav-developers": "Vývojáři", + "nav-about-description": "Veřejný opensourcový projekt pro komunitu Etherea", + "nav-advanced-description": "Seznamte se se složitějšími tématy", + "nav-advanced-label": "Další", + "nav-basics-description": "Pochopení základů Etherea", + "nav-basics-label": "Základy", + "nav-bridges-description": "Web3 se vyvinul v ekosystém primárních blockchainů L1 a řešení pro škálování L2", + "nav-builders-home-description": "Návod pro tvůrce na platformě Ethereum – od tvůrců, pro tvůrce", + "nav-builders-home-label": "Domovská stránka pro tvůrce", + "nav-contribute-description": "Pokud potřebujete pomoc, pomůže vám tento návod", + "nav-contribute-label": "Přispívání na ethereum.org", + "nav-dao-description": "Členské komunity bez centralizovaného vedení", + "nav-dapps-description": "Prozkoumejte bohatý ekosystém aplikací využívajících Ethereum", + "nav-defi-description": "Globální otevřená alternativa k tradičnímu finančnímu trhu", + "nav-desci-description": "Globální otevřená alternativa ke stávajícímu vědeckému systému", + "nav-desoc-description": "Platformy založené na blockchainu pro sociální interakci a tvorbu obsahu", "nav-developers-docs": "Dokumentace pro vývojáře", + "nav-developers": "Vývojáři", + "nav-did-description": "Vydávání a vlastnictví jedinečných decentralizovaných identifikátorů", + "nav-docs-description": "Dokumenty, které vám pomohou porozumět Ethereu a vytvářet s ním", + "nav-docs-design-description": "Popis jedinečných výzev v oblasti designu webu3, osvědčených postupů a poznatků z výzkumu uživatelů", + "nav-docs-design-label": "Základy designu UX/UI", + "nav-docs-foundation-description": "Základy pro vývoj na platformě Ethereum", + "nav-docs-foundation-label": "Základní témata", + "nav-docs-overview-description": "Místo, kde najdete dokumenty pro vývojáře", + "nav-docs-stack-description": "Seznamte se se všemi podrobnostmi Ethereum zásobníku", + "nav-docs-stack-label": "Ethereum zásobník", + "nav-eip-description": "Normy, které specifikují nové funkce nebo postupy", + "nav-eip-label": "Návrhy na zlepšení platformy Ethereum (EIP)", + "nav-emerging-description": "Seznamte se s dalšími novějšími případy použití Etherea", + "nav-emerging-label": "Rozvíjející se případy použití", + "nav-enterprise-description": "Obchodní aplikace pro Ethereum", + "nav-ethereum-org-description": "Tento web je spravován komunitou – přidejte se k nám a přispějte také.", + "nav-ethereum-wallets-description": "Aplikace pro interakci s vaším účtem Ethereum", + "nav-events-description": "Decentralizace a svoboda účasti pro každého", + "nav-events-irl-description": "Každý měsíc se konají významné prezenční i online události týkající se Etherea", + "nav-events-label": "Komunity a události", + "nav-events-online-description": "V těchto online komunitách se sdružují statisíce nadšenců do Etherea", + "nav-find-wallet-description": "Peněženky umožňují používat kryptoměny", + "nav-find-wallet-label": "Zvolte peněženku", + "nav-gas-fees-description": "Jak jsou počítány transakční poplatky ETH", + "nav-gas-fees-label": "Palivové poplatky", + "nav-get-eth-description": "K používání aplikací pro Ethereum potřebujete ether (ETH)", + "nav-get-started-description": "Vaše první kroky k používání Etherea", + "nav-governance-description": "Proces upgradu protokolu Ethereum", + "nav-governance-label": "Řízení", + "nav-grants-description": "Seznam projektů vybraných naší komunitou, které poskytují grantové programy", + "nav-guide-create-account-description": "Účet Ethereum si může kdykoli zdarma vytvořit kdokoli pomocí aplikace peněženky", + "nav-guide-create-account-label": "Jak si vytvořit Ethereum účet", + "nav-guide-revoke-access-description": "Chraňte se při interakci s chytrými kontrakty a aplikacemi v ekosystému Ethereum", + "nav-guide-revoke-access-label": "Jak odvolat přístup k chytrým kontraktům", + "nav-guide-use-wallet-description": "Naučte se ovládat všechny základní funkce peněženky", + "nav-guide-use-wallet-label": "Jak používat peněženku", + "nav-guides-description": "Praktické podrobné návody které vám pomohou začít", + "nav-guides-label": "Návody", + "nav-history-description": "Časová osa všech hlavních forků a aktualizací", + "nav-history-label": "Technická historie Etherea", + "nav-layer-2-description": "Levnější a rychlejší transakce s Ethereem", + "nav-learn-by-coding-description": "Nástroje, které vám pomohou experimentovat s Ethereem", + "nav-local-env-description": "Výběr a nastavení sady nástrojů pro vývoj s Ethereem", + "nav-mainnet-description": "Podnikové blockchainové aplikace lze vytvářet na veřejné hlavní síti Etherea", + "nav-nft-description": "Způsob, jak reprezentovat cokoliv unikátního jako majetek založený na Ethereu", + "nav-open-research-description": "Jednou z hlavních předností Etherea je jeho aktivní výzkumná komunita", + "nav-open-research-label": "Otevřený průzkum", + "nav-overview-description": "Materiály o všem, co se týká Etherea", + "nav-overview-label": "Přehled", + "nav-participate-overview-description": "Přehled o tom, jak se zapojit", "nav-primary": "Hlavní", + "nav-quizzes-description": "Zjistěte, jak dobře rozumíte Ethereu a kryptoměnám", + "nav-quizzes-label": "Otestujte své znalosti", + "nav-refi-description": "Alternativní ekonomický systém postavený na regenerativních principech", + "nav-research-description": "Procesy používané k vylepšování Etherea", + "nav-research-label": "Výzkum a vývoj", + "nav-roadmap-description": "Cesta Etherea k větší škálovatelnosti, bezpečnosti a udržitelnosti", + "nav-roadmap-future-description": "Ustálení Etherea jako robustní a decentralizované sítě", + "nav-roadmap-future-label": "Příprava na budoucnost", + "nav-roadmap-label": "Plán postupu", + "nav-roadmap-scaling-description": "Aktualizace sítě ve snaze o další snížení transakčních nákladů a zvýšení rychlosti", + "nav-roadmap-scaling-label": "Cheaper transactions", + "nav-roadmap-security-description": "Zajištění odolnosti Etherea vůči všem druhům útoků i do budoucna", + "nav-roadmap-security-label": "Vylepšené zabezpečení", + "nav-roadmap-ux-description": "Používání Etherea je třeba zjednodušit", + "nav-run-a-node-description": "Získejte nezávislost a zároveň pomáhejte zabezpečit síť", + "nav-security-description": "Naučte se osvědčené postupy při používání kryptoměn", + "nav-smart-contracts-description": "Základní stavební kameny ekosystému Ethereum", + "nav-stablecoins-description": "Stablecoiny jsou tokeny Etherea navržené tak, aby si zachovaly pevnou hodnotu", + "nav-stake-description": "Dostávejte odměny za zajištění Etherea", + "nav-stake-label": "Podíl", + "nav-staking-home-description": "Přehled různých možností uzamčení", + "nav-staking-home-label": "Domov stakingu", + "nav-staking-pool-description": "Spojte síly s ostatními, vkládejte libovolné částky ETH a dostávejte odměny", + "nav-staking-pool-label": "Sdružené uzamčení", + "nav-staking-saas-description": "Operátoři uzlů třetích stran zajišťují provoz vašeho klienta validátoru", + "nav-staking-saas-label": "Uzamčení pomocí služby", + "nav-staking-solo-description": "Spusťte domácí hardware a osobně přidejte k zabezpečení a decentralizaci sítě Ethereum", + "nav-staking-solo-label": "Samostatné uzamčení", + "nav-start-building-description": "Užitečné informace pro nováčky", + "nav-translation-program-description": "Společné úsilí o překlad ethereum.org do všech jazyků", + "nav-tutorials-description": "Seznam vybraných komunitních výukových programů", + "nav-use-cases-description": "Objevte různé nápady na využití Etherea", + "nav-what-is-ether-description": "Měna aplikací Ethereum", + "nav-what-is-ethereum-description": "Zjistěte, čím je Ethereum výjimečné", + "nav-what-is-web3-label": "Co je Web3?", + "nav-what-is-web3-description": "Alternativa k centralizovaným monopolům diktujícím pravidla", + "nav-whitepaper-description": "Původní bílá kniha Etherea vypracovaná Vitalikem Buterinem v roce 2014", + "nav-zkp-description": "Způsob, jak dokázat platnost tvrzení, aniž by bylo nutné odhalit samotné tvrzení", "nft-page": "NFT - Nezaměnitelné tokeny", "nfts": "NFT", "no": "Ne", "on-this-page": "Na této stránce", "open-research": "Otevřený průzkum", - "page-developers-aria-label": "Menu vývojáře", + "page-developers-aria-label": "Nabídka pro vývojáře", "page-index-meta-title": "Domů", "page-last-updated": "Stránka naposledy aktualizována", + "participate": "Jak se zapojit", + "participate-menu": "Nabídka Zapojte se", "pbs": "Oddělení navrhovatelů od sestavovatelů", "pools": "Sdružené uzamčení", "privacy-policy": "Zásady ochrany osobních údajů", @@ -164,6 +272,8 @@ "refresh": "Prosím obnovte stránku.", "return-home": "zpět na hlavní stránku", "roadmap": "Plán Etherea", + "research": "Výzkum", + "research-menu": "Nabídka Výzkum", "resources": "Zdroje překladu", "regenerative-finance": "ReFi - Regenerativní finance", "run-a-node": "Spustit uzel", @@ -190,7 +300,7 @@ "site-title": "ethereum.org", "skip-to-main-content": "Přeskočit na hlavní obsah", "smart-contracts": "Chytré kontrakty", - "stablecoins": "Stablecoins", + "stablecoins": "Stabilní kryptoměny (stablecoins)", "stake-eth": "Stakujte ETH", "staking": "Stakování", "start-here": "Začněte zde", @@ -211,11 +321,13 @@ "try-using-search": "Zkuste použít vyhledávání k nalezení toho, co hledáte, nebo", "tutorials": "Návody", "up": "Nahoru", + "use": "Používání", "use-ethereum": "Používání platformy Ethereum", "use-ethereum-menu": "Požít Ethereum menu", + "use-menu": "Nabídka Používání", "user-experience": "Uživatelská zkušenost", "verkle-trees": "Verkle stromy", - "wallets": "Peněženky", + "wallets": "Kryptoměnové peněženky", "we-couldnt-find-that-page": "Požadovanou stránku se nám nepodařilo najít", "web3": "Co je Web3?", "web3-title": "Web3", diff --git a/src/intl/de/common.json b/src/intl/de/common.json index 13c2ab899c7..20a7ab0dc3a 100644 --- a/src/intl/de/common.json +++ b/src/intl/de/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Menübutton umschalten", "beacon-chain": "Beacon Chain", "bridges": "Blockchain-Brücken", + "bug-bounty": "Fehler-Kopfgeld (Bug-Bounty)", + "build": "Bauen", + "build-menu": "Build-Menü", "clear": "Löschen", "close": "Schließen", "community": "Community", @@ -34,10 +37,11 @@ "dao-page": "DAOs - Dezentrale autonome Organisationen", "dark-mode": "Dunkel", "data-provided-by": "Datenquelle:", - "decentralized-applications-dapps": "Dezentralisierte Anwendungen (dApps)", + "decentralized-applications-dapps": "DApps - Dezentralisierte Anwendungen", "decentralized-identity": "Dezentralisierte Identität", "decentralized-social-networks": "Dezentrale soziale Netzwerke", "decentralized-science": "DeSci - Dezentrale Wissenschaft", + "description": "Beschreibung für das Navigationselement", "defi-page": "DeFi - Dezentrales Finanzwesen", "design": "Design", "design-principles": "Designprinzipien", @@ -76,7 +80,7 @@ "ethereum-bug-bounty": "Ethereum Bug-Bounty-Programm", "consensus-when-shipping": "Wann wird es veröffentlicht?", "ethereum-upgrades": "Ethereum-Upgrades", - "ethereum-brand-assets": "Ethereum – Marken-Assets", + "ethereum-brand-assets": "Ethereum Marken-Assets", "ethereum-online": "Online-Communitys", "ethereum-events": "Ethereum-Events", "ethereum-foundation": "Ethereum Foundation", @@ -84,11 +88,11 @@ "ethereum-glossary": "Ethereum-Glossar", "ethereum-governance": "Ethereum – Steuerung", "ethereum-logo": "Ethereum-Logo", - "ethereum-roadmap": "Ethereum Roadmap", + "ethereum-roadmap": "Ethereum-Roadmap", "ethereum-protocol": "Ethereum-Protokoll", "ethereum-security": "Ethereum – Sicherheits- und Betrugsvorbeugung", "ethereum-support": "Ethereum-Support", - "ethereum-wallets": "Ethereum Wallets", + "ethereum-wallets": "Ethereum-Wallets", "ethereum-whitepaper": "Ethereum-Whitepaper", "feedback-widget-prompt": "Ist diese Seite hilfreich?", "feedback-card-prompt-page": "War diese Seite hilfreich?", @@ -96,10 +100,10 @@ "feedback-card-prompt-tutorial": "War dieses Tutorial hilfreich?", "feedback-widget-thank-you-title": "Danke für das Feedback!", "feedback-widget-thank-you-subtitle": "Helfen Sie uns, diese Seite noch interessanter zu gestalten, indem Sie ein paar Fragen beantworten.", - "feedback-widget-thank-you-subtitle-ext": "Wenn Sie Hilfe brauchen, können Sie sich auf unserem Discord-Kanal an die Community wenden.", + "feedback-widget-thank-you-subtitle-ext": "Wenn Sie Hilfe benötigen, können Sie sich auf unserem Discord an die Community wenden.", "feedback-widget-thank-you-timing": "2 bis 3 Minuten", "feedback-widget-thank-you-cta": "Kurze Umfrage öffnen", - "find-wallet": "Wallet finden", + "find-wallet": "Finden Sie eine Wallet", "future-proofing": "Zukunftssicherung", "get-eth": "ETH erwerben", "get-involved": "Mitmachen", @@ -143,9 +147,114 @@ "mainnet-ethereum": "Mainnet Ethereum", "merge": "Zusammenführen", "more": "Mehr", - "nav-developers": "Entwickler:innen", + "nav-about-description": "Ein öffentliches Open-Source-Projekt für die Ethereum-Community", + "nav-advanced-description": "Weitere Informationen zu komplexeren Themen", + "nav-advanced-label": "Fortgeschritten", + "nav-basics-description": "Die Grundlagen von Ethereum verstehen", + "nav-basics-label": "Grundlagen", + "nav-bridges-description": "Web3 hat sich zu einem Ökosystem aus primären L1-Blockchains und L2-Skalierungslösungen entwickelt", + "nav-builders-home-description": "Ein Builder-Handbuch für Ethereum. Von Buildern, für Builder", + "nav-builders-home-label": "Startseite für Builder", + "nav-contribute-description": "Wenn Sie Hilfe benötigen, erhalten Sie sie hier", + "nav-contribute-label": "Mitwirken bei ethereum.org", + "nav-dao-description": "Communitys im Besitz ihrer Mitglieder ohne zentrale Führung", + "nav-dapps-description": "Entdecken Sie ein umfassendes Ökosystem von Apps mit Ethereum", + "nav-defi-description": "Eine globale, offene Alternative zum traditionellen Finanzmarkt", + "nav-desci-description": "Eine globale, offene Alternative zum derzeitigen wissenschaftlichen System", + "nav-desoc-description": "Blockchain-basierte Plattformen für soziale Interaktionen und Content-Erstellung", "nav-developers-docs": "Entwicklerdokumentation", + "nav-developers": "Entwickler", + "nav-did-description": "Erstellen Sie Ihre eigenen einzigartigen dezentralisierten Identifikatoren", + "nav-docs-description": "Dokumente helfen Ihnen, Ethereum zu verstehen und Builder zu werden", + "nav-docs-design-description": "Beschreibung der einzigartigen Web3-Designherausforderungen, Best Practices und Forschungseinblicke von Benutzern", + "nav-docs-design-label": "UX/UI-Designgrundlagen", + "nav-docs-foundation-description": "Wichtige Grundlagen für die Entwicklung mit Ethereum", + "nav-docs-foundation-label": "Grundsätzliche Themen", + "nav-docs-overview-description": "Ihre Startseite für Entwicklerdokumente", + "nav-docs-stack-description": "Verstehen Sie den Ethereum-Stack in allen Einzelheiten", + "nav-docs-stack-label": "Ethereum-Stack", + "nav-eip-description": "Standards, die neue Funktionen oder Prozesse bezeichnen", + "nav-eip-label": "Ethereum Verbesserungsvorschläge (EIPs)", + "nav-emerging-description": "Lernen Sie mehr aktuelle Anwendungsfälle für Ethereum kennen", + "nav-emerging-label": "Neue Anwendungsfälle", + "nav-enterprise-description": "Geschäftliche Anwendungen für Ethereum", + "nav-ethereum-org-description": "Diese Website ist Community-basiert – werden Sie Mitglied und leisten Sie einen Beitrag", + "nav-ethereum-wallets-description": "Eine App zur Interaktion mit Ihrem Ethereum-Konto", + "nav-events-description": "Dezentralisierung und Teilnahmeoptionen für alle", + "nav-events-irl-description": "Jeden Monat gibt es große persönliche und Online-Events von Ethereum", + "nav-events-label": "Communitys und Events", + "nav-events-online-description": "Hunderttausende von Ethereum-Fans sind in diesen Online-Communitys aktiv", + "nav-find-wallet-description": "Wallets ermöglichen die Nutzung von Kryptowährungen", + "nav-find-wallet-label": "Wählen Sie Ihr Wallet", + "nav-gas-fees-description": "Wie werden ETH-Transaktionsgebühren berechnet?", + "nav-gas-fees-label": "Spritgebühren", + "nav-get-eth-description": "Sie benötigen Ethers (ETH), um Ethereum-Anwendungen zu nutzen", + "nav-get-started-description": "Ihre ersten Schritte zur Verwendung von Ethereum", + "nav-governance-description": "Der Prozess zum Upgrade des Ethereum-Protokolls", + "nav-governance-label": "Verwaltung", + "nav-grants-description": "Eine von unserer Community verwaltete Liste mit Projekten, die Zuschussprograme bieten", + "nav-guide-create-account-description": "Jeder kann zu jeder Zeit ein kostenloses Ethereum-Konto mit Wallet-App einrichten", + "nav-guide-create-account-label": "So erstellen Sie ein Ethereum-Konto", + "nav-guide-revoke-access-description": "Durch die Interaktion mit Smart-Verträgen und -Anwendungen im Ethereum-Ökosystem sind Sie stets sicher", + "nav-guide-revoke-access-label": "So widerrufen Sie den Zugriff auf Smart-Verträge", + "nav-guide-use-wallet-description": "Lernen Sie die grundlegenden Funktionen einer Krypto-Wallet kennen", + "nav-guide-use-wallet-label": "So verwenden Sie eine Wallet", + "nav-guides-description": "Praktische schrittweise Anleitungen zu den ersten Schritten", + "nav-guides-label": "Anleitungen", + "nav-history-description": "Eine Zeitleiste mit allen wichtigen Abspaltungen und Aktualisierungen", + "nav-history-label": "Die technische Geschichte von Ethereum", + "nav-layer-2-description": "Günstigere und schnellere Transaktionen für Ethereum", + "nav-learn-by-coding-description": "Tools, die Ihnen dabei helfen, mit Ethereum zu experimentieren", + "nav-local-env-description": "Wählen Sie Ihren Ethereum-Entwichlungsstack und richten Sie ihn ein", + "nav-mainnet-description": "Enterprise-Blockchain-Anwendungen können im öffentlichen Ethereum Mainnet erstellt werden", + "nav-nft-description": "Ein Weg, alles Einzigartige als eine Ethereum-basierte Anlage darzustellen", + "nav-open-research-description": "Eine der Hauptstärken von Ethereum ist seine aktive Forschungs-Community", + "nav-open-research-label": "Offene Forschung", + "nav-overview-description": "Alles über die Bildung mit Ethereum", + "nav-overview-label": "Übersicht", + "nav-participate-overview-description": "Überblick über die Teilnahme", "nav-primary": "Primäre", + "nav-private-description": "Entwicklerressourcen für das private Ethereum für Unternehmen", + "nav-quizzes-description": "Finden Sie heraus, wie gut Sie Ethereum und Kryptowährungen verstehen", + "nav-quizzes-label": "Teste dein Wissen", + "nav-refi-description": "Ein alternatives, auf regenerativen Prinzipien beruhendes Wirtschaftssystem", + "nav-research-description": "Prozesse zur Verbesserung von Ethereum", + "nav-research-label": "Forschung und Entwicklung", + "nav-roadmap-description": "Der Weg zu mehr Skalierbarkeit, Sicherheit und Nachhaltigkeit für Ethereum", + "nav-roadmap-future-description": "Festigung von Ethereum als robustes und dezentralisiertes Netzwerk", + "nav-roadmap-future-label": "Zukunftssicherung", + "nav-roadmap-label": "Fahrplan", + "nav-roadmap-scaling-description": "Netzwerkaktualisierungen zur weiteren Reduktion von Transaktionskosten und Geschwindigkeit", + "nav-roadmap-scaling-label": "Günstigere Transaktionen", + "nav-roadmap-security-description": "Gewährleistung, dass Ethereum vor allen zukünftigen Angriffen geschützt ist", + "nav-roadmap-security-label": "Verbesserte Sicherheit", + "nav-roadmap-ux-description": "Die Nutzung von Ethereum muss vereinfacht werden", + "nav-roadmap-ux-label": "Bessere Nutzererfahrung", + "nav-run-a-node-description": "Werden Sie unabhängig und helfen Sie mit, das Netzwerk zu sichern", + "nav-security-description": "Lernen Sie Best Practices zur Verwendung von Kryptowährungen kennen", + "nav-smart-contracts-description": "Die grundlegenden Bausteine des Ethereum-Ökosystems", + "nav-stablecoins-description": "Stablecoins sind Ethereum-Tokens mit einem festen Wert", + "nav-stake-description": "Erhalten Sie Belohnungen, wenn Sie Ethereum sichern", + "nav-stake-label": "Stake", + "nav-staking-home-description": "Eine Übersicht über die verschiedenen Staking-Optionen", + "nav-staking-home-label": "Staking-Home", + "nav-staking-pool-description": "Staken Sie und verdienen Sie Belohnungen mit jedem beliebigen ETH-Betrag, indem Sie Ihre Kräfte mit anderen bündeln", + "nav-staking-pool-label": "Gepooltes Staking", + "nav-staking-saas-description": "Drittanbieter als Node-Betreiber kümmern sich um den Betrieb Ihres Validator-Client", + "nav-staking-saas-label": "Staking mit einer Dienstleistung", + "nav-staking-solo-description": "Benutzen Sie Hardware zu Hause und tragen Sie persönlich zur Sicherheit und Dezentralisierung des Ethereum-Netzwerks bei", + "nav-staking-solo-label": "Solo-Staking", + "nav-start-building-description": "Hilfreiche Informationen für neue Mitglieder", + "nav-translation-program-description": "Eine gemeinsame Bemühung, ethereum.org in alle Sprachen zu übersetzen", + "nav-tutorials-description": "Verwaltete Liste mit Community-Tutorials", + "nav-use-cases-description": "Entdecken Sie verschiedene Ideen zur Nutzung von Ethereum", + "nav-use-cases-label": "Anwendungsfälle", + "nav-what-is-ether-description": "Die Währung der Ethereum-Apps", + "nav-what-is-ethereum-description": "Verstehen, was Ethereum so besonders macht", + "nav-what-is-web3-label": "Was ist Web3?", + "nav-what-is-web3-description": "Eine Alternative zu zentralisierten Monopolen, die die Regeln vorgeben", + "nav-whitepaper-description": "Das Original-Ethereum-Whitepaper, geschrieben von Vitalik Buterin im Jahr 2014", + "nav-zkp-description": "Eine Möglichkeit, die Gültigkeit einer Aussage zu beweisen, ohne die Aussage selbst offenzulegen", "nft-page": "NFTs - Non-Fungible Token", "nfts": "NFTs", "no": "Nein", @@ -154,6 +263,8 @@ "page-developers-aria-label": "Entwicklermenü", "page-index-meta-title": "Startseite", "page-last-updated": "Seite zuletzt aktualisiert", + "participate": "Mitmachen", + "participate-menu": "Teilnahmemenü", "pbs": "Proposer-Builder-Trennung", "pools": "Gepooltes Staking", "privacy-policy": "Datenschutzrichtlinien", @@ -164,9 +275,11 @@ "refresh": "Bitte aktualisieren Sie die Seite.", "return-home": "Zurück zur Startseite", "roadmap": "Ethereum-Roadmap", + "research": "Forschung", + "research-menu": "Forschungsmenü", "resources": "Übersetzungsressourcen", "regenerative-finance": "ReFi - Regenerative Finanzen", - "run-a-node": "Einen Knoten betreiben", + "run-a-node": "Einen Node ausführen", "rollup-component-website": "Website", "rollup-component-developer-docs": "Entwicklerdokumentation", "rollup-component-technology-and-risk-summary": "Technologie- und Risikozusammenfassung", @@ -211,8 +324,10 @@ "try-using-search": "Benutzen Sie die Suchfunktion, um zu finden, wonach Sie suchen", "tutorials": "Tutorials", "up": "Nach oben", + "use": "Anwenden", "use-ethereum": "Ethereum verwenden", "use-ethereum-menu": "Ethereum-Menü verwenden", + "use-menu": "Benutzermenü", "user-experience": "Benutzererfahrung", "verkle-trees": "Verkle Trees", "wallets": "Wallets", diff --git a/src/intl/el/common.json b/src/intl/el/common.json index 4c877513ce6..d934a884446 100644 --- a/src/intl/el/common.json +++ b/src/intl/el/common.json @@ -1,17 +1,31 @@ { - "account-abstraction": "Αφαιρετικότητα λογαριασμού", "about-ethereum-org": "Σχετικά με το ethereum.org", "about-us": "Σχετικά με εμάς", + "adding-desci-projects": "Προσθήκη έργων Desci", + "adding-developer-tools": "Προσθήκη εργαλείων προγραμματισμού", + "adding-exchanges": "Προσθήκη ανταλλακτηρίων", + "adding-glossary-terms": "Προσθήκη όρων στο γλωσσάρι", + "adding-layer-2s": "Προσθήκη επιπέδου 2s", + "adding-products": "Προσθήκη Προϊόντων", + "adding-staking-products": "Προσθήκη προϊόντων αποθήκευσης κεφαλαίου", + "adding-wallets": "Προσθήκη πορτοφολιών", + "account-abstraction": "Αφαιρετικότητα λογαριασμού", + "acknowledgements": "Αναγνώριση", "aria-toggle-search-button": "Εναλλαγή κουμπιού αναζήτησης", "aria-toggle-menu-button": "Εναλλαγή κουμπιού μενού", "beacon-chain": "Κύρια αλυσίδα", - "bridges": "Γέφυρες blockchain", + "bridges": "Γέφυρες κρυπτοαλυσίδας", + "bug-bounty": "Εύρεση σφάλματος", + "build": "Προγραμματισμός", + "build-menu": "Μενού προγραμματισμού", "clear": "Εκκαθάριση", "close": "Κλείσιμο", "community": "Κοινότητα", "community-hub": "Κέντρο κοινότητας", "community-menu": "Μενού κοινότητας", "contact": "Επικοινωνία", + "content-buckets": "Κατηγορίες περιεχομένου", + "content-resources": "Πηγές περιεχομένου", "content-standardization": "Τυποποίηση περιεχομένου", "contributing": "Συνεισφορές", "contributors": "Συνεισφέροντες", @@ -23,11 +37,14 @@ "dao-page": "DAO - Αποκεντρωμένοι αυτόνομοι οργανισμοί", "dark-mode": "Σκούρο", "data-provided-by": "Προέλευση δεδομένων:", - "decentralized-applications-dapps": "Αποκεντρωμένες εφαρμογές (dapps)", + "decentralized-applications-dapps": "Dapps - Αποκεντρωμένες εφαρμογές", "decentralized-identity": "Αποκεντρωμένη ταυτότητα", "decentralized-social-networks": "Αποκεντρωμένα κοινωνικά δίκτυα", "decentralized-science": "DeSci - Αποκεντρωμένη επιστήμη", + "description": "Περιγραφή στοιχείου πλοήγησης", "defi-page": "DeFi - Αποκεντρωμένη τραπεζική", + "design": "Σχεδιασμός", + "design-principles": "Αρχές σχεδιασμού", "devcon": "Devcon", "developers": "Προγραμματιστές", "developers-home": "Αρχική προγραμματιστών", @@ -53,8 +70,8 @@ "ecosystem": "Οικοσύστημα", "edit-page": "Επεξεργασία σελίδας", "ef-blog": "Ιστολόγιο ιδρύματος Ethereum", - "eips": "Προτάσεις βελτίωσης Ethereum", - "energy-consumption": "Κατανάλωση ενέργειας Ethereum", + "eips": "Προτάσεις βελτίωσης", + "energy-consumption": "Κατανάλωση ενέργειας", "enterprise": "Επιχείρηση", "enterprise-menu": "Μενού επιχειρήσεων", "esp": "Πρόγραμμα υποστήριξης οικοσυστήματος", @@ -63,42 +80,42 @@ "ethereum-bug-bounty": "Πρόγραμμα αναζήτησης σφαλμάτων", "consensus-when-shipping": "Πότε καταφτάνει;", "ethereum-upgrades": "Αναβαθμίσεις Ethereum", - "ethereum-brand-assets": "Ψηφιακά στοιχεία επωνυμίας Ethereum", + "ethereum-brand-assets": "Επώνυμα ψηφιακά στοιχεία Ethereum", "ethereum-online": "Διαδικτυακές κοινότητες", "ethereum-events": "Συμβάντα του Ethereum", "ethereum-foundation": "Ίδρυμα Ethereum", "ethereum-foundation-logo": "Λογότυπο ιδρύματος Ethereum", - "ethereum-glossary": "Γλωσσάρι Ethereum", + "ethereum-glossary": "Γλωσσάρι", "ethereum-governance": "Διαχείριση Ethereum", "ethereum-logo": "Λογότυπο Ethereum", - "ethereum-roadmap": "Οδικός χάρτης Ethereum", + "ethereum-roadmap": "Οδικός χάρτης", "ethereum-protocol": "Πρωτόκολλο ethereum", - "ethereum-security": "Ασφάλεια του Ethereum και πρόληψη κατά της απάτης", + "ethereum-security": "Ασφάλεια και πρόληψη κατά της απάτης", "ethereum-support": "Υποστήριξη Ethereum", "ethereum-wallets": "Πορτοφόλια Ethereum", - "ethereum-whitepaper": "Καταστατικό Ethereum", + "ethereum-whitepaper": "Καταστατικό", "feedback-widget-prompt": "Είναι χρήσιμη αυτή η σελίδα;", "feedback-card-prompt-page": "Ήταν χρήσιμη αυτή η σελίδα;", "feedback-card-prompt-article": "Ήταν χρήσιμο αυτό το άρθρο;", "feedback-card-prompt-tutorial": "Ήταν χρήσιμος αυτός ο οδηγός;", "feedback-widget-thank-you-title": "Σας ευχαριστούμε για τα σχόλια σας!", "feedback-widget-thank-you-subtitle": "Κάντε καλύτερη αυτή τη σελίδα απαντώντας σε μερικές ερωτήσεις.", - "feedback-widget-thank-you-subtitle-ext": "Αν χρειάζεστε βοήθεια, μπορείτε να επικοινωνήσετε με την κοινότητα στο Discord μας.", + "feedback-widget-thank-you-subtitle-ext": "Εάν χρειάζεστε βοήθεια, μπορείτε να απευθυνθείτε στην κοινότητά μας στο Discord.", "feedback-widget-thank-you-timing": "2–3 λεπτά", "feedback-widget-thank-you-cta": "Άνοιγμα της σύντομης έρευνας", - "find-wallet": "Εύρεση πορτοφολιού", + "find-wallet": "Επιλογή πορτοφολιού", "future-proofing": "Αντοχή στο μέλλον", - "get-eth": "Λάβετε ETH", + "get-eth": "Αγορά ETH", "get-involved": "Συμμετοχή", "get-started": "Ας αρχίσουμε", "grants": "Επιχορηγήσεις", "grant-programs": "Προγράμματα επιχορηγήσεων οικοσυστήματος", "guides": "Οδηγοί", - "guides-hub": "Κέντρο βοηθημάτων", + "guides-hub": "Αναλυτικές οδηγίες", "history-of-ethereum": "Ιστορία του Ethereum", "home": "Αρχική", "how-ethereum-works": "Πώς λειτουργεί το Ethereum", - "how-to-register-an-ethereum-account": "Πώς να «εγγράψετε» ένα λογαριασμό Ethereum", + "how-to-create-an-ethereum-account": "Πώς να «δημιουργήσετε» λογαριασμό Ethereum", "how-to-revoke-token-access": "Πώς να ανακαλέσετε την πρόσβαση ενός έξυπνου συμβολαίου στο κεφάλαιο κρυπτονομισμάτων σας", "how-to-swap-tokens": "Πώς να ανταλλάξετε ψηφιακά στοιχεία", "how-to-use-a-bridge": "Πώς να μεταφέρετε ψηφιακά στοιχεία μέσω γέφυρας στο επίπεδο 2", @@ -115,7 +132,7 @@ "last-edit": "Τελευταία επεξεργασία", "layer-2": "Επίπεδο 2", "learn": "Εκπαίδευση", - "learn-by-coding": "Μάθετε με κωδικοποίηση", + "learn-by-coding": "Μάθετε προγραμματίζοντας", "learn-hub": "Κέντρο μάθησης", "learn-menu": "Μενού εκπαίδευσης", "learn-more": "Μάθετε περισσότερα", @@ -128,10 +145,113 @@ "loading-error-try-again-later": "Αδυναμία φόρτωσης δεδομένων. Προσπαθήστε ξανά αργότερα.", "logo": "λογότυπο", "mainnet-ethereum": "Κεντρικό δίκτυο του Ethereum", + "merge": "Συγχώνευση", "more": "Περισσότερα", - "nav-developers": "Προγραμματιστές", + "nav-about-description": "Ένα δημόσιο έργο ανοικτού κώδικα για την κοινότητα Ethereum", + "nav-advanced-description": "Μάθετε τα πιο σύνθετα θέματα", + "nav-advanced-label": "Για προχωρημένους", + "nav-basics-description": "Κατανοήστε τις βασικές αρχές του Ethereum", + "nav-basics-label": "Τα βασικά", + "nav-bridges-description": "Το Web3 έχει εξελιχθεί σε ένα οικοσύστημα πρωτογενών blockchain L1 και λύσεων κλιμάκωσης L2", + "nav-builders-home-description": "Εγχειρίδιο προγραμματιστή για το Ethereum – φτιαγμένο από προγραμματιστές για προγραμματιστές", + "nav-builders-home-label": "Αρχική σελίδα προγραμματιστή", + "nav-contribute-description": "Αν θέλετε να βοηθήσετε, αυτό θα σας καθοδηγήσει", + "nav-contribute-label": "Συνεισφέρετε στο ethereum.org", + "nav-dao-description": "Κοινότητες που ανήκουν στα μέλη χωρίς κεντρική εξουσία", + "nav-dapps-description": "Εξερευνήστε ένα πλούσιο οικοσύστημα εφαρμογών που χρησιμοποιούν το Ethereum", + "nav-defi-description": "Μια παγκόσμια, ανοικτή εναλλακτική λύση στην παραδοσιακή χρηματοπιστωτική αγορά", + "nav-desci-description": "Μια παγκόσμια, ανοικτή εναλλακτική λύση στο τρέχον επιστημονικό σύστημα", + "nav-desoc-description": "Πλατφόρμες βασισμένες στο Blockchain για κοινωνική αλληλεπίδραση και δημιουργία περιεχομένου", "nav-developers-docs": "Τεκμηρίωση προγραμματιστών", + "nav-developers": "Προγραμματιστές", + "nav-did-description": "Έκδοση και κατοχή των δικών σας μοναδικών αποκεντρωμένων αναγνωριστικών", + "nav-docs-description": "Έγγραφα που θα σας βοηθήσουν να κατανοήσετε και να προγραμματίσετε στο Ethereum", + "nav-docs-design-description": "Περιγραφή των μοναδικών προκλήσεων στον σχεδιασμό Web3, βέλτιστες πρακτικές και ιδέες για έρευνα από τους χρήστες", + "nav-docs-design-label": "Βασικές αρχές σχεδιασμού UX/UI", + "nav-docs-foundation-description": "Οι βασικές αρχές για προγραμματισμό στο Ethereum", + "nav-docs-foundation-label": "Βασικά θέματα", + "nav-docs-overview-description": "Η αρχική σελίδα σας για τα έγγραφα σχετικά με τον προγραμματισμό", + "nav-docs-stack-description": "Κατανοήστε όλες τις λεπτομέρειες του Ethereum stack", + "nav-eip-description": "Πρότυπα που προσδιορίζουν νέες δυνατότητες ή διεργασίες", + "nav-eip-label": "Προτάσεις βελτίωσης Ethereum (EIP)", + "nav-emerging-description": "Μάθετε για άλλες νεότερες περιπτώσεις χρήσης του Ethereum", + "nav-emerging-label": "Μελλοντικές περιπτώσεις χρήσης", + "nav-enterprise-description": "Επιχειρηματικές εφαρμογές για το Ethereum", + "nav-ethereum-org-description": "Στο τιμόνι αυτού του ιστοτόπου βρίσκεται η κοινότητα. Γίνετε κι εσείς μέλη της και αρχίστε να συνεισφέρετε", + "nav-ethereum-wallets-description": "Εφαρμογή για αλληλεπίδραση με τον λογαριασμό Ethereum σας", + "nav-events-description": "Αποκέντρωση και ελευθερία συμμετοχής για όλους", + "nav-events-irl-description": "Κάθε μήνα λαμβάνουν χώρα μεγάλες εκδηλώσεις Ethereum τόσο διά ζώσης όσο και διαδικτυακά", + "nav-events-label": "Κοινότητες και εκδηλώσεις", + "nav-events-online-description": "Σε αυτές τις διαδικτυακές κοινότητες μαζεύονται εκατοντάδες χιλιάδες λάτρεις του Ethereum", + "nav-find-wallet-description": "Τα πορτοφόλια σάς επιτρέπουν να χρησιμοποιείτε κρυπτονομίσματα", + "nav-find-wallet-label": "Επιλέξτε το πορτοφόλι σας", + "nav-gas-fees-description": "Πώς υπολογίζονται τα τέλη συναλλαγών ETH", + "nav-gas-fees-label": "Κρατήσεις «gas»", + "nav-get-eth-description": "Χρειάζεστε ether (ETH) για να χρησιμοποιήσετε τις εφαρμογές του Ethereum", + "nav-get-started-description": "Τα πρώτα σας βήματα στη χρήση του Ethereum", + "nav-governance-description": "Η διεργασία που σχετίζεται με την αναβάθμιση του πρωτοκόλλου Ethereum", + "nav-governance-label": "Διακυβέρνηση", + "nav-grants-description": "Κατάλογος που καταρτίστηκε από την κοινότητά μας και περιλαμβάνει έργα που παρέχουν προγράμματα χρηματοδότησης", + "nav-guide-create-account-description": "Οποιοσδήποτε μπορεί να δημιουργήσει έναν λογαριασμό Ethereum ανά πάσα στιγμή, δωρεάν με μια εφαρμογή πορτοφολιού", + "nav-guide-create-account-label": "Πώς να «δημιουργήσετε» λογαριασμό Ethereum", + "nav-guide-revoke-access-description": "Μείνετε ασφαλείς όταν αλληλεπιδράτε με έξυπνα συμβόλαια και εφαρμογές στο οικοσύστημα Ethereum", + "nav-guide-revoke-access-label": "Πώς ανακαλείται η πρόσβαση σε έξυπνο συμβόλαιο", + "nav-guide-use-wallet-description": "Μάθετε πώς να χρησιμοποιείτε όλες τις βασικές λειτουργίες ενός πορτοφολιού", + "nav-guide-use-wallet-label": "Πώς να χρησιμοποιήσετε ένα πορτοφόλι", + "nav-guides-description": "Πρακτικοί οδηγοί βήμα προς βήμα για να σας βοηθήσουν να ξεκινήσετε", + "nav-guides-label": "Οδηγοί", + "nav-history-description": "Χρονοδιάγραμμα όλων των διακλαδώσεων (fork) και ενημερώσεων μείζονος σημασίας", + "nav-history-label": "Τεχνική ιστορία του Ethereum", + "nav-layer-2-description": "Φθηνότερες και ταχύτερες συναλλαγές για το Ethereum", + "nav-learn-by-coding-description": "Εργαλεία που σας βοηθούν να πειραματίζεστε με το Ethereum", + "nav-local-env-description": "Επιλέξτε και διαμορφώστε τη δική σας δομή δεδομένων προγραμματισμού του Ethereum", + "nav-mainnet-description": "Οι επιχειρηματικές εφαρμογές blockchain μπορούν να βασιστούν στο δημόσιο Κεντρικό Δίκτυο του Ethereum", + "nav-nft-description": "Ένας τρόπος για να αντιπροσωπεύσετε οτιδήποτε μοναδικό ως περιουσιακό στοιχείο με βάση το Ethereum", + "nav-open-research-description": "Ένα από τα κύρια προτερήματα του Ethereum είναι η δραστήρια ερευνητική του κοινότητα", + "nav-open-research-label": "Ανοιχτή έρευνα", + "nav-overview-description": "Τα πάντα για το εκπαιδευτικό περιεχόμενο του Ethereum", + "nav-overview-label": "Επισκόπηση", + "nav-participate-overview-description": "Επισκόπηση του τρόπου συμμετοχής", "nav-primary": "Κύριο", + "nav-quizzes-description": "Μάθετε πόσο καλά κατανοείτε το Ethereum και τα κρυπτονομίσματα", + "nav-quizzes-label": "Δοκιμάστε τις γνώσεις σας", + "nav-refi-description": "Ένα εναλλακτικό οικονομικό σύστημα που βασίζεται σε αναγεννητικές αρχές", + "nav-research-description": "Διεργασίες που χρησιμοποιούνται για τη βελτίωση του Ethereum", + "nav-research-label": "Έρευνα και ανάπτυξη", + "nav-roadmap-description": "Η πορεία για μεγαλύτερη επεκτασιμότητα, ασφάλεια και βιωσιμότητα για το Ethereum", + "nav-roadmap-future-description": "Το Ethereum εδραιώνεται ως εύρωστο και αποκεντρωμένο δίκτυο", + "nav-roadmap-future-label": "Αντοχή στο μέλλον", + "nav-roadmap-label": "Οδικός χάρτης", + "nav-roadmap-scaling-description": "Ενημερώσεις του δικτύου για περαιτέρω μείωση του κόστους και αύξηση της ταχύτητας των συναλλαγών", + "nav-roadmap-scaling-label": "Φθηνότερες συναλλαγές", + "nav-roadmap-security-description": "Διασφαλίζοντας ότι το Ethereum διατηρεί την ανθεκτικότητά του έναντι παντός είδους μελλοντικών επιθέσεων", + "nav-roadmap-security-label": "Αυξημένη ασφάλεια", + "nav-roadmap-ux-description": "Η χρήση του Ethereum πρέπει να απλοποιηθεί", + "nav-run-a-node-description": "Γίνετε πλήρως ανεξάρτητοι συμβάλλοντας παράλληλα στην ασφάλεια του δικτύου", + "nav-security-description": "Μάθετε τις βέλτιστες πρακτικές για τη χρήση κρυπτονομισμάτων", + "nav-smart-contracts-description": "Οι κύριοι θεμέλιοι λίθοι του οικοσυστήματος του Ethereum", + "nav-stablecoins-description": "Τα κρυπτονομίσματα σταθερής αξίας (stablecoin) είναι αναγνωριστικά του Ethereum που έχουν σχεδιαστεί να διατηρούν μια σταθερή αξία", + "nav-stake-description": "Λάβετε ανταμοιβές ενώ βοηθάτε στην ασφάλεια του Ethereum", + "nav-stake-label": "Συμμετοχή", + "nav-staking-home-description": "Επισκόπηση των διαφόρων επιλογών αποθήκευσης", + "nav-staking-home-label": "Αρχική σελίδα αποθήκευσης", + "nav-staking-pool-description": "Αποθηκεύστε και κερδίστε ανταμοιβές συμμετέχοντας με οποιοδήποτε ποσό ETH ενώνοντας τις δυνάμεις σας με άλλους", + "nav-staking-pool-label": "Αποθήκευση κεφαλαίου σε δεξαμενή", + "nav-staking-saas-description": "Οι διαχειριστές των κόμβων που συμμετέχετε ελέγχουν τη λειτουργία του λογισμικού σας επαλήθευσης", + "nav-staking-saas-label": "Αποθήκευση κεφαλαίου με υπηρεσία", + "nav-staking-solo-description": "Εκτελέστε την οικιακή σας συσκευή και επιληφθείτε προσωπικά για την ασφάλεια και την αποκέντρωση του δικτύου Ethereum", + "nav-staking-solo-label": "Ατομική αποθήκευση κεφαλαίου", + "nav-start-building-description": "Χρήσιμες πληροφορίες για νεοαφιχθέντες", + "nav-translation-program-description": "Συλλογική προσπάθεια μετάφρασης του ethereum.org σε όλες τις γλώσσες", + "nav-tutorials-description": "Επιμελημένος κατάλογος της κοινότητας με οδηγούς εκμάθησης", + "nav-use-cases-description": "Ανακαλύψτε διαφορετικές ιδέες για τη χρήση του Ethereum", + "nav-use-cases-label": "Περιπτώσεις χρήσης", + "nav-what-is-ether-description": "Το νόμισμα των εφαρμογών του Ethereum", + "nav-what-is-ethereum-description": "Κατανοήστε τι κάνει το Ethereum να ξεχωρίζει", + "nav-what-is-web3-label": "Τι είναι το Web3;", + "nav-what-is-web3-description": "Μια εναλλακτική λύση στα συγκεντρωτικά μονοπώλια που υπαγορεύουν τους κανόνες", + "nav-whitepaper-description": "Το αρχικό λευκό βιβλίο για το Ethereum που γράφτηκε από τον Vitalik Buterin το 2014", + "nav-zkp-description": "Ένας τρόπος να αποδειχθεί η εγκυρότητα της δήλωσης χωρίς να αποκαλυφθεί η ίδια η δήλωση", "nft-page": "NFT - Μη Εναλλάξιμα Κρυπτοπαραστατικά", "nfts": "NFT", "no": "Όχι", @@ -140,6 +260,8 @@ "page-developers-aria-label": "Μενού προγραμματιστών", "page-index-meta-title": "Αρχική", "page-last-updated": "Τελευταία ενημέρωση της σελίδας", + "participate": "Συμμετοχή", + "participate-menu": "Μενού συμμετοχής", "pbs": "Διαχωρισμός προτείνοντος - κατασκευαστή", "pools": "Αποθήκευση κεφαλαίου σε δεξαμενή", "privacy-policy": "Πολιτική απορρήτου", @@ -149,7 +271,9 @@ "quizzes": "Διαγωνισμοί γνώσεων", "refresh": "Παρακαλούμε ανανεώστε τη σελίδα.", "return-home": "επιστροφή στην αρχική", - "roadmap": "Οδικός χάρτης Ethereum", + "roadmap": "Οδικός χάρτης", + "research": "Έρευνα", + "research-menu": "Μενού έρευνας", "resources": "Πηγές μετάφρασης", "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Εκτελέστε ένα κόμβο", @@ -164,6 +288,7 @@ "search-box-blank-state-text": "Αναζητήστε ελεύθερα!", "search-eth-address": "Μοιάζει με διεύθυνση Ethereum. Δεν παρέχουμε δεδομένα ειδικά για διευθύνσεις. Δοκιμάστε να την αναζητήσετε σε έναν εξερευνητή μπλοκ όπως", "search-no-results": "Δεν υπάρχουν αποτελέσματα για την αναζήτησή σας", + "security": "Ασφάλεια", "single-slot-finality": "Οριστικοποίηση απλής θέσης", "statelessness": "Statelessness", "see-contributors": "Δείτε τους συνεισφέροντες", @@ -181,6 +306,7 @@ "start-here": "Ξεκινήστε από εδώ", "style-guide": "Οδηγός στυλ", "solo": "Ατομική αποθήκευση κεφαλαίου", + "support": "Υποστήριξη", "terms-of-use": "Όροι Χρήσης", "translation-banner-body-new": "Βλέπετε αυτήν τη σελίδα στα αγγλικά επειδή δεν την έχουμε μεταφράσει ακόμα. Βοηθήστε μας να μεταφράσουμε αυτό το περιεχόμενο.", "translation-banner-body-update": "Υπάρχει μια νέα έκδοση αυτής της σελίδας, αλλά αυτήν τη στιγμή είναι μόνο στα αγγλικά. Βοηθήστε μας να μεταφράσουμε την πιο πρόσφατη έκδοση.", @@ -191,11 +317,14 @@ "translation-banner-no-bugs-title": "Δεν υπάρχουν σφάλματα εδώ!", "translation-banner-no-bugs-content": "Αυτή η σελίδα δε μεταφράζεται. Την έχουμε αφήσει σκοπίμως στα Αγγλικά προς το παρόν.", "translation-banner-no-bugs-dont-show-again": "Να μην εμφανιστεί ξανά", + "translation-program": "Πρόγραμμα μετάφρασης", "try-using-search": "Χρησιμοποιήστε την αναζήτηση για να βρείτε αυτό που ψάχνετε ή", "tutorials": "Σεμινάρια", "up": "Πάνω", + "use": "Χρήση", "use-ethereum": "Χρήση του Ethereum", "use-ethereum-menu": "Χρήση του μενού Ethereum", + "use-menu": "Μενού χρήσης", "user-experience": "Εμπειρία χρήστη", "verkle-trees": "Verkle trees", "wallets": "Πορτοφόλια", diff --git a/src/intl/es/common.json b/src/intl/es/common.json index b9c227a44b5..487163cbe4a 100644 --- a/src/intl/es/common.json +++ b/src/intl/es/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Cambiar botón de menú", "beacon-chain": "Cadena de baliza", "bridges": "Puentes de cadena de bloques", + "bug-bounty": "Recompensa de error", + "build": "Construir", + "build-menu": "Menú Construir", "clear": "Borrar", "close": "Cerrar", "community": "Comunidad", @@ -34,10 +37,11 @@ "dao-page": "DAO - Organizaciones Autónomas Descentralizadas", "dark-mode": "Oscuro", "data-provided-by": "Fuente de datos:", - "decentralized-applications-dapps": "Aplicaciones descentralizadas (DApps)", + "decentralized-applications-dapps": "DApps - Aplicaciones descentralizadas", "decentralized-identity": "Identidad descentralizada", "decentralized-social-networks": "Redes sociales descentralizadas", "decentralized-science": "DeSci - Ciencias descentralizadas", + "description": "Descripción de un elemento de navegación", "defi-page": "DeFi - Finanzas descentralizadas", "design": "Diseño", "design-principles": "Principios de diseño", @@ -96,7 +100,7 @@ "feedback-card-prompt-tutorial": "¿Le ha resultado útil este tutorial?", "feedback-widget-thank-you-title": "¡Gracias por sus comentarios!", "feedback-widget-thank-you-subtitle": "Mejore esta página respondiendo a algunas preguntas.", - "feedback-widget-thank-you-subtitle-ext": "Si necesita ayuda, puede comunicarse con la comunidad en nuestro canal Discord.", + "feedback-widget-thank-you-subtitle-ext": "Si necesita ayuda, puede comunicarse con la comunidad en nuestro canal Discord.", "feedback-widget-thank-you-timing": "2–3 minutos", "feedback-widget-thank-you-cta": "Abrir encuesta breve", "find-wallet": "Encontrar cartera", @@ -143,9 +147,114 @@ "mainnet-ethereum": "Red principal de Ethereum", "merge": "Fusión", "more": "Más", - "nav-developers": "Desarrolladores", + "nav-about-description": "Un proyecto público de código abierto para la comunidad Ethereum", + "nav-advanced-description": "Conozca los temas más complejos", + "nav-advanced-label": "Recursos avanzados", + "nav-basics-description": "Entienda lo esencial de Ethereum", + "nav-basics-label": "Lo básico", + "nav-bridges-description": "Web3 ha evolucionado en un ecosistema de cadenas de bloques primarios de capa 1 y soluciones de escalabilidad de capa 2", + "nav-builders-home-description": "Un manual de constructores para Ethereum. De constructores para constructores.", + "nav-builders-home-label": "Inicio para los constructores", + "nav-contribute-description": "Si quiere ayudar, esta guía le dirá cómo.", + "nav-contribute-label": "Colaborar con ethereum.org", + "nav-dao-description": "Comunidades con propiedad compartida por los miembros sin liderazgo centralizado.", + "nav-dapps-description": "Explore el rico ecosistema de aplicaciones que usan Ethereum", + "nav-defi-description": "Una alternativa abierta y global al tradicional mercado financiero", + "nav-desci-description": "Una alternativa global y abierta al sistema científico actual", + "nav-desoc-description": "Plataformas basadas en cadenas de bloques para interacción social y creación de contenido", "nav-developers-docs": "Documentos para desarrolladores", + "nav-developers": "Desarrolladores", + "nav-did-description": "Cree y sea propietario de sus identificadores descentralizados propios", + "nav-docs-description": "Documentación de ayuda para entender y construir en Ethereum", + "nav-docs-design-description": "Descripción de los retos de diseño únicos de Web3, mejores prácticas y hallazgos de investigaciones de los usuarios", + "nav-docs-design-label": "Lo esencial del diseño de la UX/IU", + "nav-docs-foundation-description": "Los fundamentos para desarrollar en Ethereum", + "nav-docs-foundation-label": "Temas fundamentales", + "nav-docs-overview-description": "El sitio donde buscar documentación para desarrolladores", + "nav-docs-stack-description": "Entender todos los detalles de la pila Ethereum", + "nav-docs-stack-label": "Pila de Ethereum", + "nav-eip-description": "Estándares que especifican nuevas características o procesos", + "nav-eip-label": "Propuestas de mejora de Ethereum (EIP)", + "nav-emerging-description": "Conozca otros nuevos casos de uso para Ethereum", + "nav-emerging-label": "Casos de uso emergentes", + "nav-enterprise-description": "Aplicaciones empresariales para Ethereum", + "nav-ethereum-org-description": "Este sitio web está orientado a la comunidad: únase y contribuya con él", + "nav-ethereum-wallets-description": "Una aplicación para interactuar con su cuenta Ethereum", + "nav-events-description": "Descentralización y libertad para que todos participen", + "nav-events-irl-description": "Cada mes se celebran grandes eventos Etheerum en persona y en línea", + "nav-events-label": "Comunidades y eventos", + "nav-events-online-description": "Cientos de miles de entusiastas de Ethereum producen estas comunidades en línea", + "nav-find-wallet-description": "Las carteras le permiten usar criptomonedas", + "nav-find-wallet-label": "Elija su cartera", + "nav-gas-fees-description": "Cómo se calcula la comisión por transacción de sus ETH", + "nav-gas-fees-label": "Tarifas de gas", + "nav-get-eth-description": "Necesita ether (ETH) para utilizar las aplicaciones de Ethereum", + "nav-get-started-description": "Sus primeros pasos para utilizar Ethereum", + "nav-governance-description": "El proceso implicado en la actualización del protocolo de Ethereum", + "nav-governance-label": "Gobernanza", + "nav-grants-description": "Una lista seleccionada por nuestra comunidad de proyectos que proporcionan programas de financiación mediante becas", + "nav-guide-create-account-description": "Cualquiera puede crearse una cuenta en Ethereum siempre que lo desee, de forma gratuita y con una aplicación de cartera", + "nav-guide-create-account-label": "Cómo crear una cuenta de Ethereum", + "nav-guide-revoke-access-description": "Interactúe con contratos inteligentes y aplicaciones en el ecosistema de Ethereum de forma segura", + "nav-guide-revoke-access-label": "Cómo revocar el acceso a contratos inteligentes", + "nav-guide-use-wallet-description": "Domine el funcionamiento de todas las funciones básicas de su cartera", + "nav-guide-use-wallet-label": "Cómo utilizar una cartera", + "nav-guides-description": "Guías prácticas paso a paso para ayudarle a empezar", + "nav-guides-label": "Guías prácticas", + "nav-history-description": "Una cronología de las actualizaciones y bifurcaciones principales", + "nav-history-label": "Historia técnica de Ethereum", + "nav-layer-2-description": "Transacciones más rápidas y baratas para Ethereum", + "nav-learn-by-coding-description": "Herramientas que le ayudan a experimentar con Ethereum", + "nav-local-env-description": "Elija y defina su pila de desarrollo en Ethereum", + "nav-mainnet-description": "Las aplicaciones de cadena de bloques para empresa se pueden construir en la red principal y pública de Ethereum", + "nav-nft-description": "Una forma de representar cualquier cosa única como un activo basado en Ethereum", + "nav-open-research-description": "Una de las principales bazas de Ethereum es su activa comunidad de investigación", + "nav-open-research-label": "Abrir investigación", + "nav-overview-description": "Recursos educativos de Ethereum", + "nav-overview-label": "Resumen", + "nav-participate-overview-description": "Resumen de cómo participar", "nav-primary": "Principal", + "nav-private-description": "Recursos para desarrolladores para la empresa privada Ethereum", + "nav-quizzes-description": "Descubra cómo de bien puede entender Ethereum y las criptomonedas", + "nav-quizzes-label": "Evalúe su conocimiento", + "nav-refi-description": "Un sistema económico alternativo basado en principios regenerativos", + "nav-research-description": "Procesos utilizados para mejorar Ethereum", + "nav-research-label": "Investigación y desarrollo", + "nav-roadmap-description": "El camino hacia una mayor escalabilidad, seguridad y sostenibilidad para Ethereum", + "nav-roadmap-future-description": "Reforzar Ethereum como una red descentralizada y sólida", + "nav-roadmap-future-label": "De cara al futuro", + "nav-roadmap-label": "Hoja de ruta", + "nav-roadmap-scaling-description": "Actualizaciones de red para reducir aún más los costes de transacciones y la velocidad", + "nav-roadmap-scaling-label": "Transacciones más baratas", + "nav-roadmap-security-description": "Asegurarse de que Etherum sigue resistiendo a todo tipo de ataques en el futuro", + "nav-roadmap-security-label": "Seguridad mejorada", + "nav-roadmap-ux-description": "El uso de Ethereum debe simplificarse", + "nav-roadmap-ux-label": "Mejor experiencia de usuario", + "nav-run-a-node-description": "Sea completamente autónomo mientras ayuda a proteger la red", + "nav-security-description": "Aprenda las mejores prácticas en el uso de criptomonedas", + "nav-smart-contracts-description": "Los bloques de construcción fundamentales del ecosistema Ethereum", + "nav-stablecoins-description": "Las monedas estables son los tókenes de Ethereum diseñados para mantenerse a un valor fijo", + "nav-stake-description": "Gane recompensas por proteger Ethereum", + "nav-stake-label": "Participar", + "nav-staking-home-description": "Una presentación de las distintas opciones de participación", + "nav-staking-home-label": "Inicio de participaciones", + "nav-staking-pool-description": "Participe y gane recompensas con cualquier cantidad de ETH al unirse a otros", + "nav-staking-pool-label": "Participación agrupada", + "nav-staking-saas-description": "Nodos de terceros gestionan la operación de su cliente validador", + "nav-staking-saas-label": "Participar con un servicio", + "nav-staking-solo-description": "Ejecute hardware doméstico y contribuya personalmente a la seguridad y a la descentralización de la red Ethereum.", + "nav-staking-solo-label": "Participación en solitario", + "nav-start-building-description": "Información útil para principiantes", + "nav-translation-program-description": "Una iniciativa de colaboración para traducir ethereum.org a todos los idiomas", + "nav-tutorials-description": "Lista seleccionada de tutoriales de la comunidad", + "nav-use-cases-description": "Descubra diferentes ideas de usos de Ethereum", + "nav-use-cases-label": "Casos de uso", + "nav-what-is-ether-description": "La moneda de las aplicaciones de Ethereum", + "nav-what-is-ethereum-description": "Entienda qué es lo que hace a Ethereum especial", + "nav-what-is-web3-label": "¿Qué es Web 3.0?", + "nav-what-is-web3-description": "Una alternativa a los monopolios centralizados que dictan las normas", + "nav-whitepaper-description": "El informe técnico original de Ethereum escrito por Vitalik Buterin en 2014", + "nav-zkp-description": "Una forma de demostrar la validez de una declaración sin tener que revelarla", "nft-page": "NFT - Tókenes no fungibles", "nfts": "NTF", "no": "No", @@ -154,6 +263,8 @@ "page-developers-aria-label": "Menú para desarrolladores", "page-index-meta-title": "Inicio", "page-last-updated": "Última actualización de la página", + "participate": "Participar", + "participate-menu": "Menú Participar", "pbs": "Separación del creador de propuestas", "pools": "Participación agrupada", "privacy-policy": "Política de privacidad", @@ -164,6 +275,8 @@ "refresh": "Actualice la página.", "return-home": "volver a la página principal", "roadmap": "Hoja de ruta de Ethereum", + "research": "Investigación", + "research-menu": "Menú Investigación", "resources": "Recursos de traducción", "regenerative-finance": "ReFi - Finanzas regerenativas", "run-a-node": "Ejecutar un nodo", @@ -182,7 +295,7 @@ "single-slot-finality": "Finalidad de la ranura única", "statelessness": "Sin estado", "see-contributors": "Ver colaboradores", - "set-up-local-env": "Configurar entorno local", + "set-up-local-env": "Crear un entorno local", "sharding": "Fragmentación", "show-all": "Mostrar todo", "show-less": "Mostrar menos", @@ -211,8 +324,10 @@ "try-using-search": "Utilice el buscador para encontrar lo que está buscando o", "tutorials": "Tutoriales", "up": "Subir", + "use": "Usar", "use-ethereum": "Usar Ethereum", "use-ethereum-menu": "Usar menú de Ethereum", + "use-menu": "Menú Usar", "user-experience": "Experiencia de usuario", "verkle-trees": "Árboles Verkle", "wallets": "Carteras", diff --git a/src/intl/fr/common.json b/src/intl/fr/common.json index e420dc8b9d4..b2a015a38a2 100644 --- a/src/intl/fr/common.json +++ b/src/intl/fr/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Basculer le bouton du menu", "beacon-chain": "Chaîne phare", "bridges": "Ponts de connexion blockchain", + "bug-bounty": "Prime de bogue", + "build": "Construire", + "build-menu": "Construire le menu", "clear": "Traitée", "close": "Fermer", "community": "Communauté", @@ -34,10 +37,11 @@ "dao-page": "DAO - Organisations autonomes décentralisées", "dark-mode": "Sombre", "data-provided-by": "Source de données :", - "decentralized-applications-dapps": "Applications décentralisées (dApps)", + "decentralized-applications-dapps": "DApps - Applications décentralisées", "decentralized-identity": "Identité décentralisée", "decentralized-social-networks": "Réseaux sociaux décentralisés", "decentralized-science": "DeSci - Science décentralisée", + "description": "Description de l'élément de navigation", "defi-page": "DeFi - Finance décentralisée", "design": "Conception", "design-principles": "Principes de conception", @@ -76,7 +80,7 @@ "ethereum-bug-bounty": "Programme de chasse aux bogues d'Ethereum", "consensus-when-shipping": "C'est pour quand ?", "ethereum-upgrades": "Mises à niveau d'Ethereum", - "ethereum-brand-assets": "Éléments de la marque Ethereum", + "ethereum-brand-assets": "Actifs de la marque Ethereum", "ethereum-online": "Communautés en ligne", "ethereum-events": "Évènements Ethereum", "ethereum-foundation": "Ethereum Foundation", @@ -96,7 +100,7 @@ "feedback-card-prompt-tutorial": "Ce tutoriel vous a été utile ?", "feedback-widget-thank-you-title": "Merci pour vos commentaires !", "feedback-widget-thank-you-subtitle": "Améliorez cette page en répondant à quelques questions.", - "feedback-widget-thank-you-subtitle-ext": "Si vous avez besoin d'aide, you pouvez contacter la communauté sur notre Discord.", + "feedback-widget-thank-you-subtitle-ext": "Si vous avez besoin d'aide, vous pouvez contacter la communauté sur notre Discord.", "feedback-widget-thank-you-timing": "2-3 min", "feedback-widget-thank-you-cta": "Ouvrir l'enquête courte", "find-wallet": "Trouver un portefeuille", @@ -143,9 +147,114 @@ "mainnet-ethereum": "Réseau principal Ethereum", "merge": "Fusion", "more": "Plus", - "nav-developers": "Développeurs", + "nav-about-description": "Un projet public et open-source pour la communauté Ethereum", + "nav-advanced-description": "Maîtriser les sujets les plus complexes", + "nav-advanced-label": "Avancé", + "nav-basics-description": "Comprendre les fondamentaux d'Ethereum", + "nav-basics-label": "Les bases", + "nav-bridges-description": "Le Web3 a évolué vers un écosystème de blockchains primaires de couche 1 et de solutions de mise à l'échelle de couche 2", + "nav-builders-home-description": "Un manuel de construction pour Ethereum - par ceux qui le construisent, pour ceux qui le construisent", + "nav-builders-home-label": "Homepage constructeur", + "nav-contribute-description": "Pour contribuer, suivez ces recommandations", + "nav-contribute-label": "Contribuer à ethereum.org", + "nav-dao-description": "Des communautés détenues par leurs membres sans autorité centralisée", + "nav-dapps-description": "Découvrez un riche écosystème d'applications utilisant Ethereum", + "nav-defi-description": "Une alternative ouverte et globale au marché financier traditionnel", + "nav-desci-description": "Une alternative ouverte et globale au système scientifique actuel", + "nav-desoc-description": "Des plateformes basées sur la blockchain favorisant les interactions sociales et la création de contenu", "nav-developers-docs": "Documentation pour les développeurs", + "nav-developers": "Développeurs", + "nav-did-description": "Émettez et possédez vos identifiants décentralisés uniques", + "nav-docs-description": "Des documents pour vous aider à comprendre et à construire avec Ethereum", + "nav-docs-design-description": "Description des défis uniques en matière de conception web3, des bonnes pratiques et des résultats de recherche des utilisateurs", + "nav-docs-design-label": "Les fondamentaux du UX/UI design", + "nav-docs-foundation-description": "Principes de base pour développer sur Ethereum", + "nav-docs-foundation-label": "Sujets fondamentaux", + "nav-docs-overview-description": "Votre centre de documentation pour les développeurs", + "nav-docs-stack-description": "Comprendre tous les détails de la pile Ethereum", + "nav-docs-stack-label": "Pile d'Ethereum", + "nav-eip-description": "Normes définissant de nouvelles caractéristiques ou de nouveaux processus", + "nav-eip-label": "Propositions d'amélioration d'Ethereum (EIP)", + "nav-emerging-description": "Découvrez d'autres cas d'utilisation plus récents d'Ethereum", + "nav-emerging-label": "Cas d'utilisation émergents", + "nav-enterprise-description": "Applications commerciales d'Ethereum", + "nav-ethereum-org-description": "Ce site web est animé par la communauté - rejoignez-nous et contribuez vous aussi", + "nav-ethereum-wallets-description": "Une application pour interagir avec votre compte Ethereum", + "nav-events-description": "Décentralisation et liberté de participation pour tous", + "nav-events-irl-description": "Chaque mois, des événements majeurs liés à Ethereum sont organisés en personne ou en ligne", + "nav-events-label": "Communautés et événements", + "nav-events-online-description": "Des centaines de milliers de passionnés d'Ethereum participent à ces communautés en ligne", + "nav-find-wallet-description": "Les portefeuilles vous permettent d'utiliser des cryptomonnaies", + "nav-find-wallet-label": "Choisissez votre portefeuille", + "nav-gas-fees-description": "Comment sont calculés les frais de transaction ETH ?", + "nav-gas-fees-label": "Frais de Gaz", + "nav-get-eth-description": "Vous avez besoin d'éther (ETH) pour utiliser les applications Ethereum", + "nav-get-started-description": "Vos premiers pas pour utiliser Ethereum", + "nav-governance-description": "Le processus de mise à jour du protocole Ethereum", + "nav-governance-label": "Gouvernance", + "nav-grants-description": "Une liste établie par notre communauté sur les projets proposant des programmes de financement sous forme de bourses", + "nav-guide-create-account-description": "Tout le monde peut créer un compte Ethereum à tout moment, gratuitement, avec une application de portefeuille", + "nav-guide-create-account-label": "Comment créer un compte Ethereum", + "nav-guide-revoke-access-description": "Restez en sécurité en interagissant avec les contrats intelligents et les applications dans l'écosystème Ethereum", + "nav-guide-revoke-access-label": "Comment révoquer l'accès à un contrat intelligent ?", + "nav-guide-use-wallet-description": "Apprenez à utiliser toutes les fonctions de base d'un portefeuille", + "nav-guide-use-wallet-label": "Comment utiliser un portefeuille", + "nav-guides-description": "Des guides pratiques étape par étape pour vous aider à démarrer", + "nav-guides-label": "Guides de procédures", + "nav-history-description": "Une chronologie de toutes les principales fourches et mises à jour", + "nav-history-label": "Histoire technique d'Ethereum", + "nav-layer-2-description": "Des transactions moins chères et plus rapides pour Ethereum", + "nav-learn-by-coding-description": "Des outils qui vous aident à expérimenter avec Ethereum", + "nav-local-env-description": "Choisissez et mettez en place votre pile de développement Ethereum", + "nav-mainnet-description": "Les applications blockchain d'entreprise peuvent être créées sur le réseau public principal Ethereum", + "nav-nft-description": "Un moyen de représenter tout ce qui est unique en tant qu'actif Ethereum", + "nav-open-research-description": "L'un des principaux atouts d'Ethereum est sa communauté de recherche active", + "nav-open-research-label": "Recherche ouverte", + "nav-overview-description": "Tout savoir sur l'éducation à l'Ethereum", + "nav-overview-label": "Aperçu", + "nav-participate-overview-description": "Aperçu des modalités de participation", "nav-primary": "Principale", + "nav-private-description": "Ressources Ethereum pour les développeurs en entreprise", + "nav-quizzes-description": "Découvrez dans quelle mesure vous comprenez Ethereum et les cryptomonnaies", + "nav-quizzes-label": "Testez vos connaissances", + "nav-refi-description": "Un système économique alternatif fondé sur les principes de la régénération", + "nav-research-description": "Processus utilisés pour améliorer Ethereum", + "nav-research-label": "Recherche et développement", + "nav-roadmap-description": "La voie vers davantage d'évolutivité, de sécurité et de durabilité pour Ethereum", + "nav-roadmap-future-description": "Consolider Ethereum en tant que réseau robuste et décentralisé", + "nav-roadmap-future-label": "Pérenniser", + "nav-roadmap-label": "Feuille de route", + "nav-roadmap-scaling-description": "Mise à jour du réseau pour réduire davantage les coûts et la vitesse des transactions", + "nav-roadmap-scaling-label": "Transactions plus abordables", + "nav-roadmap-security-description": "Veiller à ce qu'Ethereum reste résilient face à tous les types d'attaques à venir", + "nav-roadmap-security-label": "Sécurité renforcée", + "nav-roadmap-ux-description": "L'utilisation d'Ethereum doit être simplifiée", + "nav-roadmap-ux-label": "Meilleure expérience utilisateur", + "nav-run-a-node-description": "Devenez pleinement autonome tout en contribuant à la sécurisation du réseau", + "nav-security-description": "Apprenez les bonnes pratiques en matière d'utilisation des cryptomonnaies", + "nav-smart-contracts-description": "Les éléments fondamentaux de l'écosystème Ethereum", + "nav-stablecoins-description": "Les Stablecoins sont des jetons Ethereum conçus pour conserver une valeur fixe", + "nav-stake-description": "Gagnez des récompenses en sécurisant Ethereum", + "nav-stake-label": "Mise", + "nav-staking-home-description": "Un aperçu des différentes options de mise en jeu", + "nav-staking-home-label": "Accueil mise en jeu", + "nav-staking-pool-description": "Misez et gagnez des récompenses avec n'importe quel montant en ETH en vous joignant à d'autres personnes", + "nav-staking-pool-label": "Mise en jeu en pool", + "nav-staking-saas-description": "Les opérateurs de nœuds tiers gèrent le fonctionnement de votre client de validateur", + "nav-staking-saas-label": "Mise en jeu en tant que service", + "nav-staking-solo-description": "Faites fonctionner votre propre matériel et contribuez ainsi à la sécurité et la décentralisation du réseau Ethereum", + "nav-staking-solo-label": "Mise en jeu en solo", + "nav-start-building-description": "Informations utiles pour les nouveaux venus", + "nav-translation-program-description": "Un effort collaboratif pour traduire ethereum.org dans toutes les langues", + "nav-tutorials-description": "Liste de tutoriels de la communauté", + "nav-use-cases-description": "Découvrez des idées originales d'utilisation d'Ethereum", + "nav-use-cases-label": "Cas d'usage", + "nav-what-is-ether-description": "La monnaie des applications Ethereum", + "nav-what-is-ethereum-description": "Comprendre la spécificité d'Ethereum", + "nav-what-is-web3-label": "Qu'est-ce que le Web3 ?", + "nav-what-is-web3-description": "Une alternative aux monopoles centralisés qui dictent les règles", + "nav-whitepaper-description": "Le livre blanc original d'Ethereum écrit par Vitalik Buterin en 2014", + "nav-zkp-description": "Une façon de prouver la validité d'une information sans révéler l'information elle-même", "nft-page": "NFTs - Jetons non fongibles", "nfts": "NFTs", "no": "Non", @@ -154,6 +263,8 @@ "page-developers-aria-label": "Menu des développeurs", "page-index-meta-title": "Accueil", "page-last-updated": "Dernière mise à jour de la page", + "participate": "Participer", + "participate-menu": "Menu de participation", "pbs": "Séparation entre le validateur et le constructeur de blocs", "pools": "Mise en jeu en pool", "privacy-policy": "Politique de confidentialité", @@ -164,9 +275,11 @@ "refresh": "Veuillez actualiser la page.", "return-home": "retour à l'accueil", "roadmap": "Feuille de route d'Ethereum", + "research": "Recherche", + "research-menu": "Menu de recherche", "resources": "Traduction des ressources", "regenerative-finance": "ReFi - Finance régénérative", - "run-a-node": "Exécuter un nœud", + "run-a-node": "Ajouter un nœud", "rollup-component-website": "Site Web", "rollup-component-developer-docs": "Documentation pour les développeurs", "rollup-component-technology-and-risk-summary": "Résumé des technologies et des risques", @@ -211,8 +324,10 @@ "try-using-search": "Essayez d'utiliser la recherche pour trouver ce que vous cherchez ou", "tutorials": "Tutoriels", "up": "Vers le haut", + "use": "Utiliser", "use-ethereum": "Utiliser Ethereum", "use-ethereum-menu": "Utiliser le menu Ethereum", + "use-menu": "Utiliser le menu", "user-experience": "Expérience utilisateur", "verkle-trees": "Les arbres de Verkle", "wallets": "Portefeuilles", diff --git a/src/intl/hu/common.json b/src/intl/hu/common.json index f3217245587..618612529f7 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -5,16 +5,19 @@ "adding-developer-tools": "Fejlesztői eszközök hozzáadása", "adding-exchanges": "Tőzsdék hozzáadása", "adding-glossary-terms": "Új fogalmak hozzáadása", - "adding-layer-2s": "Adding Layer 2s", + "adding-layer-2s": "2. réteg hozzáadása", "adding-products": "Adding Products", "adding-staking-products": "Letétbe helyezési lehetőségek hozzáadása", "adding-wallets": "Tárcák hozzáadása", "account-abstraction": "Számlaabsztrakció", "acknowledgements": "Köszönetnyilvánítások", - "aria-toggle-search-button": "Keresés bekapcsolása gomb", + "aria-toggle-search-button": "Keresőgomb bekapcsolása", "aria-toggle-menu-button": "Menü bekapcsolása gomb", - "beacon-chain": "Beacon Chain", + "beacon-chain": "Beacon lánc", "bridges": "Blokkláncösszekötők", + "bug-bounty": "Hibavadászat", + "build": "Fejlesztés", + "build-menu": "Fejlesztés menü", "clear": "Törlés", "close": "Bezárás", "community": "Közösség", @@ -34,10 +37,11 @@ "dao-page": "DAO-k - Decentralizált autonóm szervezetek", "dark-mode": "Sötét", "data-provided-by": "Adatforrás:", - "decentralized-applications-dapps": "Decentralizált alkalmazások (dapps)", + "decentralized-applications-dapps": "Dappok - Decentralizált alkalmazások", "decentralized-identity": "Decentralizált identitás", "decentralized-social-networks": "Decentralizált közösségi hálózatok", - "decentralized-science": "DeSci - Nem központosított kutatás", + "decentralized-science": "DeSci - Decentralizált tudomány", + "description": "Navigációs elem leírása", "defi-page": "DeFi - Decentralizált pénzügy", "design": "Dizájn", "design-principles": "Dizájnelvek", @@ -76,7 +80,7 @@ "ethereum-bug-bounty": "Ethereum bugvadász program", "consensus-when-shipping": "Mikor lesz kész?", "ethereum-upgrades": "Az Ethereum fejlesztései", - "ethereum-brand-assets": "Ethereum márkanév", + "ethereum-brand-assets": "Ethereum márkaeszközök", "ethereum-online": "Online közösségek", "ethereum-events": "Az Ethereum eseményei", "ethereum-foundation": "Ethereum Alapítvány", @@ -96,7 +100,7 @@ "feedback-card-prompt-tutorial": "Hasznosnak találta az útmutatót?", "feedback-widget-thank-you-title": "Köszönjük a visszajelzést!", "feedback-widget-thank-you-subtitle": "Tedd jobbá ezt az oldalt egy pár kérdés megválaszolásával.", - "feedback-widget-thank-you-subtitle-ext": "Ha segítségre van szüksége, akkor a Discordunkon veheti fel a kapcsolatot közösségünkkel.", + "feedback-widget-thank-you-subtitle-ext": "Ha segítségre van szüksége, akkor a Discordunkon veheti fel a kapcsolatot közösségünkkel.", "feedback-widget-thank-you-timing": "2–3 perc", "feedback-widget-thank-you-cta": "Rövid kérdőív megnyitása", "find-wallet": "Tárca keresése", @@ -134,18 +138,122 @@ "learn-more": "Bővebben", "less": "Kevesebb", "light-mode": "Világos", - "listing-policy-disclaimer": "Az oldalon szereplő egyik termék sincs hivatalosan jóváhagyva, csak információs célokat szolgálnak. Ha szeretnél egy terméket hozzáadni, vagy visszajelzést küldeni az irányelvről, akkor nyiss egy Github ticketet.", + "listing-policy-disclaimer": "Az oldalon szereplő egyik termék sincs hivatalosan jóváhagyva, csak információs célokat szolgálnak. Ha szeretne egy terméket hozzáadni, vagy visszajelzést küldeni az irányelvről, akkor nyisson egy issue-t Githubon.", "loading": "Betöltés...", "loading-error": "Betöltési hiba.", "loading-error-refresh": "Hiba, kérjük frissítsen.", "loading-error-try-again-later": "Nem sikerült az adatok betöltése. Kérjük, próbálja meg később.", "logo": "logo", - "mainnet-ethereum": "Mainnet Ethereum", + "mainnet-ethereum": "Ethereum Főhálózat", "merge": "Egyesítés", "more": "Több", - "nav-developers": "Fejlesztők", + "nav-about-description": "Nyilvános, nyílt forráskódú projekt az Ethereum közössége számára", + "nav-advanced-description": "Ismerkedjen meg komplexebb témákkal is", + "nav-advanced-label": "Haladó", + "nav-basics-description": "Ismerje meg az Ethereum alapjait", + "nav-basics-label": "Alapok", + "nav-bridges-description": "A web3 az elsődleges L1 blokkláncok és L2 skálázási megoldások ökoszisztémájává fejlődött", + "nav-builders-home-description": "Az Ethereum-fejlesztők kézikönyve – fejlesztőktől fejlesztőknek", + "nav-builders-home-label": "A fejlesztők otthona", + "nav-contribute-description": "Ha segíteni szeretne, itt talál útmutatást", + "nav-contribute-label": "Hozzájárulás az ethereum.org oldalhoz", + "nav-dao-description": "Tagtulajdonú közösségek központi hatóság nélkül", + "nav-dapps-description": "Fedezze fel az appok gazdag ökoszisztémáját az Ethereum segítségével", + "nav-defi-description": "Egy globális és nyitott alternatívája a hagyományos pénzügyi piacnak", + "nav-desci-description": "Egy globális és nyitott alternatívája a jelenlegi tudományos rendszernek", + "nav-desoc-description": "Blokkláncalapú platformok közösségi kapcsolódás és tartalomkészítés céljából", "nav-developers-docs": "Fejlesztői dokumentumok", + "nav-developers": "Fejlesztők", + "nav-did-description": "Egyedi decentralizált azonosítók kiadása és birtoklása", + "nav-docs-description": "Dokumentumok, amelyek segítenek megérteni és fejleszteni az Ethereumot", + "nav-docs-design-description": "Egyedülálló web3-tervezési kihívások leírása, bevált gyakorlatok és felhasználói kutatási információk", + "nav-docs-design-label": "UX/UI-tervezési alapok", + "nav-docs-foundation-description": "Alapvető tudnivalók az Ethereumon való fejlesztésről", + "nav-docs-foundation-label": "Alapvető témák", + "nav-docs-overview-description": "A fejlesztői dokumentumok otthona", + "nav-docs-stack-description": "Ismerje meg az Ethereum stack összes részletét", + "nav-eip-description": "Szabványok, amelyek új funkciókat vagy folyamatokat határoznak meg", + "nav-eip-label": "Ethereum fejlesztési javaslatok (EIP-k)", + "nav-emerging-description": "Ismerje meg az Ethereum egyéb, újabb felhasználási eseteit", + "nav-emerging-label": "Új alkalmazási területek", + "nav-enterprise-description": "Üzleti alkalmazások az Ethereumhoz", + "nav-ethereum-org-description": "Ez egy közösség által vezérelt webhely – csatlakozzon hozzánk és járuljon hozzá Ön is", + "nav-ethereum-wallets-description": "Egy app, amellyel kapcsolatba léphet Ethereum-fiókjával", + "nav-events-description": "Decentralizáció és szabad részvétel bárki számára", + "nav-events-irl-description": "Minden hónapban jelentős eseményeket szervez az Ethereum mind a személyes, mind az online térben", + "nav-events-label": "Közösségek és események", + "nav-events-online-description": "Ethereum-rajongók százezrei segítenek egymásnak ezekben az online közösségekben", + "nav-find-wallet-description": "Tárcák segítségével használhatja a kriptovalutákat", + "nav-find-wallet-label": "Válassza ki a tárcáját", + "nav-gas-fees-description": "Hogyan számítják ki az ETH tranzakciós illetékeit", + "nav-gas-fees-label": "Gázdíjak", + "nav-get-eth-description": "Az Ethereum-alkalmazások használatához etherre (ETH) van szükség", + "nav-get-started-description": "Az első lépések az Ethereum használatában", + "nav-governance-description": "Az Ethereum-protokoll frissítésének folyamata", + "nav-governance-label": "Irányítás", + "nav-grants-description": "A közösségünk által összeállított lista a támogatási programokat nyújtó projektekről", + "nav-guide-create-account-description": "Bárki nyithat Ethereum-számlát, bármikor és ingyenesen, egy tárca appal", + "nav-guide-create-account-label": "Hogyan lehet Ethereum számlát létrehozni", + "nav-guide-revoke-access-description": "Maradjon biztonságban, amikor okosszerződésekkel és alkalmazásokkal kerül kapcsolatba az Ethereum-ökoszisztémában", + "nav-guide-revoke-access-label": "Az okosszerződéses hozzáférés visszavonása", + "nav-guide-use-wallet-description": "Ismerje meg, hogyan működnek a tárca alapvető funkciói", + "nav-guide-use-wallet-label": "Hogyan használja a tárcát", + "nav-guides-description": "Részletes gyakorlati útmutatók, amelyek segítenek az indulásban", + "nav-guides-label": "Útmutatók", + "nav-history-description": "Az összes fontos elágazás és frissítés idővonala", + "nav-history-label": "Az Ethereum technikai története", + "nav-layer-2-description": "Olcsóbb és gyorsabb tranzakciók az Ethereumon", + "nav-learn-by-coding-description": "Eszközök, amelyek segítenek kísérletezni az Ethereummal", + "nav-local-env-description": "Az Ethereum fejlesztői stack kiválasztása és beállítása", + "nav-mainnet-description": "Vállalatiblokklánc-alkalmazások fejleszthetők az Ethereum nyilvános fő hálózatán", + "nav-nft-description": "Egy módszer arra, hogy egyedi dolgokat Ethereum-alapú javakként jelenítsünk meg", + "nav-open-research-description": "Az Ethereum egyik legnagyobb erőssége az aktív kutatói közösség", + "nav-open-research-label": "Nyílt kutatás", + "nav-overview-description": "Minden tudnivaló az Ethereum-oktatásról", + "nav-overview-label": "Áttekintés", + "nav-participate-overview-description": "A részvétel áttekintése", "nav-primary": "Elsődleges", + "nav-private-description": "Fejlesztői anyagok a privát vállalati Ethereumhoz", + "nav-quizzes-description": "Tudja meg, mennyire érti az Ethereumot és a kriptovalutákat", + "nav-quizzes-label": "Tesztelje tudását", + "nav-refi-description": "Egy alternatív gazdasági rendszer, amely regeneratív elvekre épít", + "nav-research-description": "Az Ethereum fejlesztésére használt eljárások", + "nav-research-label": "Kutatás és fejlesztés", + "nav-roadmap-description": "Az út, amely az Ethereum jobb skálázhatóságához, biztonságához és fenntarthatóságához vezet", + "nav-roadmap-future-description": "Az Ethereum megerősítése, hogy még robusztusabb és decentralizáltabb hálózattá váljon", + "nav-roadmap-future-label": "Időtállóság", + "nav-roadmap-label": "Útiterv", + "nav-roadmap-scaling-description": "Hálózati frissítések a tranzakciós költségek csökkentése és a sebesség növelése érdekében", + "nav-roadmap-scaling-label": "Olcsóbb tranzakciók", + "nav-roadmap-security-description": "Annak biztosítása, hogy az Ethereum a jövőben is ellenálljon mindenféle támadásnak", + "nav-roadmap-security-label": "Fokozott biztonság", + "nav-roadmap-ux-description": "Az Ethereum használatát egyszerűsíteni kell", + "nav-roadmap-ux-label": "Jobb felhasználói élmény", + "nav-run-a-node-description": "Váljon teljesen függetlenné, miközben segít biztonságosabbá tenni a hálózatot", + "nav-security-description": "Ismerje meg a kriptovaluták használatának bevált gyakorlatait", + "nav-smart-contracts-description": "Az Ethereum-ökoszisztéma alapvető építőkövei", + "nav-stablecoins-description": "A stabil érmék olyan Ethereum-tokenek, amelyeket úgy terveztek, hogy az értékül állandó maradjon", + "nav-stake-description": "Szerezzen jutalmat az Ethereum biztosításáért", + "nav-stake-label": "Letétbe helyezés", + "nav-staking-home-description": "A különböző letétbe helyezési lehetőségek áttekintése", + "nav-staking-home-label": "Otthoni letétbe helyezés", + "nav-staking-pool-description": "Helyezzen letétbe bármennyi ETH-t, és szerezzen jutalmakat másokkal együtt", + "nav-staking-pool-label": "Készletezett letétbe helyezés", + "nav-staking-saas-description": "Az Ön validátorkliensét harmadik fél működteti csomópontok kezelésével", + "nav-staking-saas-label": "Letétbe helyezés szolgáltatással", + "nav-staking-solo-description": "Működtessen az otthonából hardvert és támogassa személyesen az Ethereum hálózatának biztonságát és decentralizálását", + "nav-staking-solo-label": "Egyéni letétbe helyezés", + "nav-start-building-description": "Hasznos információk az újoncok számára", + "nav-translation-program-description": "Közös együttműködés, hogy az ethereum.org weboldalt minden nyelvre lefordítsuk", + "nav-tutorials-description": "A közösségi útmutatók válogatott listája", + "nav-use-cases-description": "Különböző ötletek az Ethereum használatához", + "nav-use-cases-label": "Felhasználási módok", + "nav-what-is-ether-description": "Az Ethereum-appok valutája", + "nav-what-is-ethereum-description": "Tudja meg, mi teszi az Ethereumot olyan különlegessé", + "nav-what-is-web3-label": "Mi az a Web3?", + "nav-what-is-web3-description": "A szabályokat meghatározó központosított monopóliumok alternatívája", + "nav-whitepaper-description": "Az eredeti Ethereum fehérkönyv, melyet Vitalik Buterin írt 2014-ben", + "nav-zkp-description": "Egy módszer egy állítás érvényességének igazolására úgy, hogy magát az állítást nem fedjük fel", "nft-page": "NFT-k - Nem felcserélhető tokenek", "nfts": "NFT-k", "no": "Nem", @@ -154,6 +262,8 @@ "page-developers-aria-label": "Fejlesztői Menü", "page-index-meta-title": "Kezdőlap", "page-last-updated": "Oldal legutoljára frissítve", + "participate": "Részvétel", + "participate-menu": "Részvétel menü", "pbs": "Javaslattevő-építő szétválasztása", "pools": "Készletezett letétbe helyezés", "privacy-policy": "Adatvédelmi szabályzat", @@ -164,13 +274,15 @@ "refresh": "Kérjük, frissítsd az oldalt.", "return-home": "vissza a kezdőlapra", "roadmap": "Ethereum-ütemterv", + "research": "Kutatás", + "research-menu": "Kutatás menü", "resources": "Fordítási erőforrások", "regenerative-finance": "ReFi - Regeneratív pénzügyek", "run-a-node": "Csomópont futtatása", "rollup-component-website": "Honlap", "rollup-component-developer-docs": "Fejlesztői dokumentumok", "rollup-component-technology-and-risk-summary": "Technológiai és kockázati összegzés", - "scaling": "Méretezés", + "scaling": "Skálázás", "saas": "Letétbe helyezés mint szolgáltatás", "search": "Keresés", "search-ethereum-org": "Keresés az ethereum.org oldalon", @@ -211,8 +323,10 @@ "try-using-search": "Használja a keresőt, hogy megtalálja, amit keres vagy", "tutorials": "Oktatóanyagok", "up": "Fel", + "use": "Használat", "use-ethereum": "Az Ethereum használata", "use-ethereum-menu": "Az Ethereum menü használata", + "use-menu": "Használat menü", "user-experience": "Felhasználói tapasztalat", "verkle-trees": "Verkle-fák", "wallets": "Tárcák", diff --git a/src/intl/id/common.json b/src/intl/id/common.json index 5cddb32282d..5a798766741 100644 --- a/src/intl/id/common.json +++ b/src/intl/id/common.json @@ -1,17 +1,30 @@ { - "account-abstraction": "Abstraksi akun", "about-ethereum-org": "Tentang ethereum.org", "about-us": "Tentang kami", + "adding-desci-projects": "Menambahkan Proyek Desci", + "adding-developer-tools": "Menambahkan Perangkat Pengembang", + "adding-exchanges": "Menambahkan Bursa", + "adding-glossary-terms": "Menambahkan Istilah Glosarium", + "adding-products": "Menambahkan Produk", + "adding-staking-products": "Menambahkan Produk Penaruhan", + "adding-wallets": "Menambahkan Dompet", + "account-abstraction": "Abstraksi akun", + "acknowledgements": "Penghargaan", "aria-toggle-search-button": "Tombol pencarian toggle", "aria-toggle-menu-button": "Tombol menu toggle", "beacon-chain": "Rantai Suar", "bridges": "Jembatan blockchain", + "bug-bounty": "Hadiah bounty", + "build": "Bangun", + "build-menu": "Bangun menu", "clear": "Menghapus", "close": "Tutup", "community": "Komunitas", "community-hub": "Hub komunitas", "community-menu": "Menu Komunitas", "contact": "Kontak", + "content-buckets": "Kategori Konten", + "content-resources": "Sumber Daya Konten", "content-standardization": "Standardisasi konten", "contributing": "Berkontribusi", "contributors": "Kontributor", @@ -23,11 +36,14 @@ "dao-page": "DAO - Organisasi otonom terdesentralisasi", "dark-mode": "Gelap", "data-provided-by": "Sumber data:", - "decentralized-applications-dapps": "Decentralized applications (dapp)", + "decentralized-applications-dapps": "Dapp - Decentralized applications", "decentralized-identity": "Identitas terdesentralisasi", "decentralized-social-networks": "Jaringan sosial terdesentralisasi", "decentralized-science": "DeSci - Sains terdesentralisasi", + "description": "Deskripsi untuk item navigasi", "defi-page": "DeFi - Keuangan terdesentralisasi", + "design": "Desain", + "design-principles": "Prinsip Desain", "devcon": "Devcon", "developers": "Pengembang", "developers-home": "Beranda Pengembang", @@ -63,15 +79,15 @@ "ethereum-bug-bounty": "Program bug hadiah bounty Ethereum", "consensus-when-shipping": "Kapan pengirimannya?", "ethereum-upgrades": "Peningkatan Ethereum", - "ethereum-brand-assets": "Aset Merek Ethereum", + "ethereum-brand-assets": "Aset merek Ethereum", "ethereum-online": "Komunitas daring", "ethereum-events": "Aksi Ethereum", "ethereum-foundation": "Yayasan Ethereum", "ethereum-foundation-logo": "Logo Yayasan Ethereum", "ethereum-glossary": "Glosarium Ethereum", - "ethereum-governance": "Tata Kelola Ethereum", + "ethereum-governance": "Pemerintahan Ethereum", "ethereum-logo": "Logo Ethereum", - "ethereum-roadmap": "Rencana pengembangan Ethereum", + "ethereum-roadmap": "Peta Perjalanan Ethereum", "ethereum-protocol": "Protokol Ethereum", "ethereum-security": "Keamanan dan pencegahan penipuan Ethereum", "ethereum-support": "Dukungan Ethereum", @@ -83,7 +99,7 @@ "feedback-card-prompt-tutorial": "Apakah tutorial ini membantu?", "feedback-widget-thank-you-title": "Terima kasih atas umpan baliknya!", "feedback-widget-thank-you-subtitle": "Jadikan halaman ini lebih baik lagi dengan menjawab beberapa pertanyaan.", - "feedback-widget-thank-you-subtitle-ext": "Jika butuh bantuan, Anda bisa menghubungi komunitas di Discord kami.", + "feedback-widget-thank-you-subtitle-ext": "Jika butuh bantuan, Anda dapat menghubungi komunitas di Discord kami.", "feedback-widget-thank-you-timing": "2–3 menit", "feedback-widget-thank-you-cta": "Buka survei singkat", "find-wallet": "Temukan dompet", @@ -94,11 +110,11 @@ "grants": "Hibah", "grant-programs": "Program Hibah Ekosistem", "guides": "Panduan", - "guides-hub": "Hub panduan", + "guides-hub": "Panduan Langkah demi Langkah", "history-of-ethereum": "Riwayat Ethereum", "home": "Beranda", "how-ethereum-works": "Cara kerja Ethereum", - "how-to-register-an-ethereum-account": "Cara \"mendaftarkan\" akun Ethereum", + "how-to-create-an-ethereum-account": "Cara \"membuat\" akun Ethereum", "how-to-revoke-token-access": "Cara mencabut akses kontrak pintar ke dana kripto Anda", "how-to-swap-tokens": "Cara menukar token", "how-to-use-a-bridge": "Cara bridge token ke lapisan ke-2", @@ -128,10 +144,116 @@ "loading-error-try-again-later": "Tidak dapat memuat data. Coba lagi nanti.", "logo": "logo", "mainnet-ethereum": "Ethereum Jaringan Utama", + "merge": "Gabungkan", "more": "Lebih Banyak", - "nav-developers": "Pengembang", + "nav-about-description": "Proyek publik sumber terbuka untuk komunitas Ethereum", + "nav-advanced-description": "Pelajari topik yang lebih kompleks", + "nav-advanced-label": "Tingkat Lanjut", + "nav-basics-description": "Pahami dasar-dasar Ethereum", + "nav-basics-label": "Dasar-dasar", + "nav-bridges-description": "Web3 telah berevolusi menjadi ekosistem blockchain L1 utama dan solusi penskalaan L2", + "nav-builders-home-description": "Panduan pembangun untuk Ethereum—oleh pembangun, untuk pembangun", + "nav-builders-home-label": "Beranda pembangun", + "nav-contribute-description": "Jika Anda ingin membantu, ini akan memandu Anda", + "nav-contribute-label": "Berkontribusi pada ethereum.org", + "nav-dao-description": "Komunitas milik anggota tanpa otoritas terpusat", + "nav-dapps-description": "Jelajahi eskosistem aplikasi yang kaya menggunakan Ethereum", + "nav-defi-description": "Alternatif global dan terbuka untuk pasar keuangan tradisional", + "nav-desci-description": "Alternatif global dan terbuka untuk sistem ilmiah saat ini", + "nav-desoc-description": "Platform berbasis blockchain untuk interaksi sosial dan pembuatan konten", "nav-developers-docs": "Dokumen pengembang", + "nav-developers": "Pengembang", + "nav-did-description": "Terbitkan dan miliki tanda pengenal terdesentralisasi yang unik", + "nav-docs-description": "Dokumen untuk membantu Anda memahami dan membangun dengan Ethereum", + "nav-docs-design-description": "Deskripsi tantangan desain web3 yang unik, praktik terbaik, dan wawasan penelitian pengguna", + "nav-docs-design-label": "Dasar-dasar desain UX/UI", + "nav-docs-foundation-description": "Dasar-dasar inti yang perlu dikembangkan di Ethereum", + "nav-docs-foundation-label": "Topik dasar", + "nav-docs-overview-description": "Beranda Anda untuk dokumen pengembang", + "nav-docs-stack-description": "Pahami semua detail tentang tumpukan Ethereum", + "nav-docs-stack-label": "Tumpukan Ethereum", + "nav-eip-description": "Standar yang menentukan fitur atau proses baru", + "nav-eip-label": "Proposal peningkatan Ethereum (EIP)", + "nav-emerging-description": "Kenali kasus penggunaan baru lainnya untuk Ethereum", + "nav-emerging-label": "Kasus penggunaan yang muncul", + "nav-enterprise-description": "Aplikasi bisnis untuk Ethereum", + "nav-ethereum-org-description": "Situs web ini digerakkan oleh komunitas—bergabunglah dengan kami dan berkontribusi juga", + "nav-ethereum-wallets-description": "Aplikasi untk berinteraksi dengan akun Ethereum Anda", + "nav-events-description": "Desentralisasi dan kebebasan untuk berpartisipasi bagi siapa saja", + "nav-events-irl-description": "Setiap bulan ada aksi besar Ethereum yang berlangsung secara langsung dan online", + "nav-events-label": "Komunitas dan aksi", + "nav-events-online-description": "Ratusan ribu penggemar Ethereum berkumpul dalam komunitas online ini", + "nav-find-wallet-description": "Dompet memungkinkan Anda untuk menggunakan kripto", + "nav-find-wallet-label": "Pilih dompet Anda", + "nav-gas-fees-description": "Bagaimana cara menghitung biaya transaksi ETH", + "nav-gas-fees-label": "Biaya gas", + "nav-get-eth-description": "Anda membutuhkan ether (ETH) untuk menggunakan aplikasi Ethereum", + "nav-get-started-description": "Langkah pertama Anda untuk menggunakan Ethereum", + "nav-governance-description": "Proses yang dilibatkan dalam peningkatan protokol Ethereum", + "nav-governance-label": "Tata Kelola", + "nav-grants-description": "Daftar yang dipilih oleh komunitas kami mengenai proyek yang menyediakan program pendanaan hibah", + "nav-guide-create-account-description": "Siapa pun bisa membuat akun Ethereum kapan saja, secara gratis dengan aplikasi dompet", + "nav-guide-create-account-label": "Cara membuat akun Ethereum", + "nav-guide-revoke-access-description": "Tetap aman saat berinteraksi dengan kontrak pintar dan aplikasi di ekosistem Ethereum", + "nav-guide-revoke-access-label": "Cara mencabut akses kontrak pintar", + "nav-guide-use-wallet-description": "Pelajari cara mengoperasikan semua fungsi dasar dompet", + "nav-guide-use-wallet-label": "Cara menggunakan dompet", + "nav-guides-description": "Panduan langkah demi langkah praktis untuk membantu Anda memulai", + "nav-guides-label": "Cara memandu", + "nav-history-description": "Linimasa semua garpu dan pembaruan besar", + "nav-history-label": "Riwayat teknis Ethereum", + "nav-layer-2-description": "Transaksi yang lebih murah dan lebih cepat untuk Ethereum", + "nav-learn-by-coding-description": "Alat yang membantu Anda bereksperimen dengan Ethereum", + "nav-local-env-description": "Pilih dan siapkan tumpukan pengembangan Ethereum Anda", + "nav-mainnet-description": "Aplikasi blockchain perusahaan dapat dibuat di Jaringan Utama Ethereum publik", + "nav-nft-description": "Cara untuk mewakili apa pun yang unik sebagai aset berbasis Ethereum", + "nav-open-research-description": "Salah satu kekuatan utama Ethereum adalah komunitas penelitiannya yang aktif", + "nav-open-research-label": "Buka penelitian", + "nav-overview-description": "Semua hal tentang pendidikan Ethereum", + "nav-overview-label": "Gambaran umum", + "nav-participate-overview-description": "Gambaran umum tentang cara berpartisipasi", "nav-primary": "Utama", + "nav-private-description": "Sumber daya pengembang untuk Ethereum perusahaan privat", + "nav-quizzes-description": "Cari tahu seberapa baik Anda memahami Ethereum dan mata uang kripto", + "nav-quizzes-label": "Uji pengetahuan Anda", + "nav-refi-description": "Sistem ekonomi alternatif dibuat berdasarkan prinsip-prinsip regeneratif", + "nav-research-description": "Proses yang digunakan untuk meningkatkan kualitas Ethereum", + "nav-research-label": "Penelitian dan pengembangan", + "nav-roadmap-description": "Jalan menuju peningkatan skalabilitas, keamanan, dan keberlanjutan Ethereum", + "nav-roadmap-future-description": "Memperkuat Ethereum sebagai jaringan yang kuat dan terdesentralisasi", + "nav-roadmap-future-label": "Proofing masa depan", + "nav-roadmap-label": "Rencana kerja", + "nav-roadmap-scaling-description": "Pembaruan jaringan untuk lebih mengurangi biaya dan kecepatan transaksi", + "nav-roadmap-scaling-label": "Transaksi yang lebih murah", + "nav-roadmap-security-description": "Memastikan Ethereum tetap tangguh terhadap segala jenis serangan di masa mendatang", + "nav-roadmap-security-label": "Peningkatan keamanan", + "nav-roadmap-ux-description": "Penggunaan Ethereum perlu disederhanakan", + "nav-roadmap-ux-label": "Pengalaman pengguna yang lebih baik", + "nav-run-a-node-description": "Menjadi berdaulat sepenuhnya sembari membantu mengamankan jaringan", + "nav-security-description": "Pelajari praktik terbaik saat menggunakan mata uang kripto", + "nav-smart-contracts-description": "Dasar-dasar blok pembangun ekosistem Ethereum", + "nav-stablecoins-description": "Stablecoin adalah token Ethereum yang dirancang agar tetap pada nilai tetap", + "nav-stake-description": "Dapatkan imbalan untuk mengamankan Ethereum", + "nav-stake-label": "Taruhan", + "nav-staking-home-description": "Gambaran umum berbagai opsi untuk penaruhan", + "nav-staking-home-label": "Penaruhan di beranda", + "nav-staking-pool-description": "Pasang taruhan dan dapatkan imbalan sejumlah ETH dengan bergabung dengan yang lain", + "nav-staking-pool-label": "Penaruhan pool", + "nav-staking-saas-description": "Operator simpul pihak ketiga menangani operasi dari klien validator Anda", + "nav-staking-saas-label": "Penaruhan dengan layanan", + "nav-staking-solo-description": "Jalankan perangkat keras di beranda dan secara pribadi berkontribusi pada keamanan dan desentralisasi jaringan Ethereum", + "nav-staking-solo-label": "Penaruhan solo", + "nav-start-building-description": "Informasi yang berguna bagi pendatang baru", + "nav-translation-program-description": "Upaya kolaboratif untuk menerjemahkan ethereum.org ke semua bahasa", + "nav-tutorials-description": "Daftar pilihan tutorial komunitas", + "nav-use-cases-description": "Temukan berbagai ide untuk penggunaan Ethereum", + "nav-use-cases-label": "Kasus penggunaan", + "nav-what-is-ether-description": "Mata uang aplikasi Ethereum", + "nav-what-is-ethereum-description": "Pahami apa yang membuat Ethereum spesial", + "nav-what-is-web3-label": "Apa itu Web3?", + "nav-what-is-web3-description": "Alternatif terhadap monopoli terpusat yang mendikte aturan", + "nav-whitepaper-description": "Laporan Ethereum asli yang ditulis oleh Vitalik Buterin pada tahun 2014", + "nav-zkp-description": "Cara untuk membuktikan keabsahan suatu pernyataan tanpa mengungkapkan pernyataan itu sendiri", "nft-page": "NFT - Token yang tidak dapat dipertukarkan", "nfts": "NFT", "no": "Tidak", @@ -140,6 +262,8 @@ "page-developers-aria-label": "Menu Developer", "page-index-meta-title": "Beranda", "page-last-updated": "Halaman terakhir kali diperbaharui", + "participate": "Partisipasi", + "participate-menu": "Menu partisipasi", "pbs": "Pemisahan pengusul-pembuat", "pools": "Penaruhan pool", "privacy-policy": "Kebijakan privasi", @@ -150,6 +274,8 @@ "refresh": "Silahkan muat ulang halaman.", "return-home": "kembali ke beranda", "roadmap": "Peta Perjalanan Ethereum", + "research": "Penelitian", + "research-menu": "Menu penelitian", "resources": "Sumber terjemahan", "regenerative-finance": "ReFi - Keuangan regeneratif", "run-a-node": "Menjalankan sebuah node", @@ -164,6 +290,7 @@ "search-box-blank-state-text": "Cari saja!", "search-eth-address": "Ini terlihat seperti alamat Ethereum. Kami tidak memberikan data khusus untuk alamat. Coba cari di penjelajah blok seperti", "search-no-results": "Tidak ada hasil untuk pencarian Anda", + "security": "Keamanan", "single-slot-finality": "Finalitas slot tunggal", "statelessness": "Tanpa kewarganegaraan", "see-contributors": "Lihat kontributor", @@ -181,6 +308,7 @@ "start-here": "Mulai di sini", "style-guide": "Panduan gaya penulisan", "solo": "Penaruhan solo", + "support": "Bantuan", "terms-of-use": "Ketentuan Penggunaan", "translation-banner-body-new": "Anda melihat halaman ini dalam bahasa Inggris karena kami belum menerjemahkannya. Bantu kami menerjemahkan konten ini.", "translation-banner-body-update": "Terdapat versi baru halaman ini namun sementara ini hanya dalam bahasa Inggris. Bantu kami menerjemahkan versi terkini.", @@ -191,11 +319,14 @@ "translation-banner-no-bugs-title": "Tidak ada bug di sini!", "translation-banner-no-bugs-content": "Halaman ini tidak diterjemahkan. Untuk saat ini kami sengaja membiarkan halaman ini dalam bahasa Inggris.", "translation-banner-no-bugs-dont-show-again": "Jangan tampilkan lagi", + "translation-program": "Program Penerjemahan", "try-using-search": "Coba gunakan pencarian untuk menemukan apa yang Anda cari atau", "tutorials": "Tutorial", "up": "Naik", + "use": "Gunakan", "use-ethereum": "Gunakan Ethereum", "use-ethereum-menu": "Gunakan menu Ethereum", + "use-menu": "Gunakan menu", "user-experience": "Pengalaman Pengguna", "verkle-trees": "Pohon Verkle", "wallets": "Dompet", @@ -203,7 +334,7 @@ "web3": "Apa itu Web3?", "web3-title": "Web3", "website-last-updated": "Situs web terakhir kali diperbarui", - "what-is-ether": "Apa itu ether (ETH)?", + "what-is-ether": "Apa itu Ether (ETH)?", "what-is-ethereum": "Apa itu Ethereum?", "withdrawals": "Penarikan penaruhan", "yes": "Ya", diff --git a/src/intl/it/common.json b/src/intl/it/common.json index 0f3f42f0262..82182853012 100644 --- a/src/intl/it/common.json +++ b/src/intl/it/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Astrazione account", "about-ethereum-org": "Informazioni su ethereum.org", "about-us": "Chi siamo", + "adding-desci-projects": "Aggiungere progetti DeSci", + "adding-developer-tools": "Aggiungere strumenti per sviluppatori", + "adding-exchanges": "Aggiungere borse", + "adding-glossary-terms": "Aggiungere termini dal glossario", + "adding-layer-2s": "Aggiungere Livelli 2", + "adding-products": "Aggiungere prodotti", + "adding-staking-products": "Aggiungere prodotti di staking", + "adding-wallets": "Aggiungere portafogli", + "account-abstraction": "Astrazione account", + "acknowledgements": "Riconoscimenti", "aria-toggle-search-button": "Attiva/Disattiva pulsante di ricerca", "aria-toggle-menu-button": "Attiva/Disattiva pulsante menu", "beacon-chain": "La Beacon Chain", @@ -12,6 +21,8 @@ "community-hub": "Hub della community", "community-menu": "Menu Community", "contact": "Contatti", + "content-buckets": "Categorie di contenuti", + "content-resources": "Risorse di contenuto", "content-standardization": "Standardizzazione dei contenuti", "contributing": "Contributi", "contributors": "Hanno contribuito", @@ -23,11 +34,14 @@ "dao-page": "DAO - Organizzazioni autonome decentralizzate", "dark-mode": "Scuro", "data-provided-by": "Origine dei dati:", - "decentralized-applications-dapps": "Applicazioni decentralizzate (dapps)", + "decentralized-applications-dapps": "Dapps - Applicazioni decentralizzate", "decentralized-identity": "Identità decentralizzata", "decentralized-social-networks": "Social network decentralizzati", "decentralized-science": "DeSci - Scienza Decentralizzata", + "description": "Descrizione dell’elemento di navigazione", "defi-page": "DeFi - Finanza decentralizzata", + "design": "Progettazione", + "design-principles": "Principi di progettazione", "devcon": "Devcon", "developers": "Sviluppatori", "developers-home": "Home degli sviluppatori", @@ -51,7 +65,7 @@ "documentation": "Documentazione", "down": "Giù", "ecosystem": "Ecosistema", - "edit-page": "Modifica la pagina", + "edit-page": "Modifica pagina", "ef-blog": "Blog della Ethereum Foundation", "eips": "Proposte di Miglioramento di Ethereum", "energy-consumption": "Consumo energetico di Ethereum", @@ -86,7 +100,7 @@ "feedback-widget-thank-you-subtitle-ext": "Se ti serve aiuto, puoi contattare la community sul nostro Discord.", "feedback-widget-thank-you-timing": "2-3 minuti", "feedback-widget-thank-you-cta": "Apri un breve sondaggio", - "find-wallet": "Trova portafoglio", + "find-wallet": "Trova un portafoglio", "future-proofing": "A prova di futuro", "get-eth": "Ottieni ETH", "get-involved": "Partecipa", @@ -94,11 +108,11 @@ "grants": "Sovvenzioni", "grant-programs": "Programma di supporto dell'ecosistema", "guides": "Guide", - "guides-hub": "Hub delle guide", + "guides-hub": "Guide esplicative", "history-of-ethereum": "Storia di Ethereum", "home": "Home page", "how-ethereum-works": "Come funziona Ethereum", - "how-to-register-an-ethereum-account": "Come \"registrare\" un conto di Ethereum", + "how-to-create-an-ethereum-account": "Come \"creare\" un conto di Ethereum", "how-to-revoke-token-access": "Come revocare l'accesso dei contratti intelligenti ai tuoi fondi di criptovalute", "how-to-swap-tokens": "Come scambiare token", "how-to-use-a-bridge": "Come collegare i token al livello 2", @@ -128,10 +142,116 @@ "loading-error-try-again-later": "Impossibile caricare i dati. Riprovare più tardi.", "logo": "logo", "mainnet-ethereum": "Rete principale Ethereum", + "merge": "Fusione", "more": "Altro", - "nav-developers": "Sviluppatori", + "nav-about-description": "Un progetto open source aperto al pubblico per la comunità Ethereum", + "nav-advanced-description": "Approfondisci gli argomenti più complessi", + "nav-advanced-label": "Avanzate", + "nav-basics-description": "Comprendi i fondamenti di Ethereum", + "nav-basics-label": "Nozioni di base", + "nav-bridges-description": "Web3 si è evoluto in un ecosistema di blockchain L1 primarie e di soluzioni di ridimensionamento L2", + "nav-builders-home-description": "Un manuale su Ethereum, scritto da sviluppatori per sviluppatori", + "nav-builders-home-label": "Pagina principale del costruttore", + "nav-contribute-description": "Se vuoi dare un contributo, questa guida di spiegherà come fare", + "nav-contribute-label": "Contribuire a ethereum.org", + "nav-dao-description": "Community posseduta dai membri, senza un’autorità centralizzata", + "nav-dapps-description": "Esplora un ricco ecosistema di app che utilizzano Ethereum", + "nav-defi-description": "Un'alternativa globale e aperta al sistema finanziario tradizionale", + "nav-desci-description": "Un'alternativa globale e aperta al sistema scientifico corrente", + "nav-desoc-description": "Piattaforme basate sulla blockchain per l'interazione sociale e la creazione di contenuti", "nav-developers-docs": "Documentazione per sviluppatori", + "nav-developers": "Sviluppatori", + "nav-did-description": "Emettere e possedere i propri identificativi unici decentralizzati", + "nav-docs-description": "Documenti per aiutarti a capire e compilare con Ethereum", + "nav-docs-design-description": "Descrizione delle sfide specifiche della progettazione web3, delle best practice e delle informazioni di ricerca sugli utenti", + "nav-docs-design-label": "Fondamenti di progettazione UX/UI", + "nav-docs-foundation-description": "Fondamenti principali per sviluppare su Ethereum", + "nav-docs-foundation-label": "Argomenti fondamentali", + "nav-docs-overview-description": "Il punto di riferimento per i documenti per gli sviluppatori", + "nav-docs-stack-description": "Capire tutti i dettagli dello stack di Ethereum", + "nav-docs-stack-label": "Stack di Ethereum", + "nav-eip-description": "Standard che specificano nuove funzionalità o processi", + "nav-eip-label": "Proposte di miglioramento di Ethereum (EIP)", + "nav-emerging-description": "Conoscere altri casi d'uso più recenti di Ethereum", + "nav-emerging-label": "Casi d'uso emergenti", + "nav-enterprise-description": "Applicazioni commerciali di Ethereum", + "nav-ethereum-org-description": "Questo sito web è alimentato dalla community: unisciti e contribuisci anche tu", + "nav-ethereum-wallets-description": "Un'app per interagire con il proprio conto di Ethereum", + "nav-events-description": "Decentralizzazione e libertà di partecipazione per chiunque", + "nav-events-irl-description": "Ogni mese ci sono importanti eventi Ethereum di persona e online", + "nav-events-label": "Community ed eventi", + "nav-events-online-description": "Centinaia di migliaia di appassionati di Ethereum partecipano a queste community online", + "nav-find-wallet-description": "I portafogli consentono di utilizzare le criptovalute", + "nav-find-wallet-label": "Scegliere il proprio portafoglio", + "nav-gas-fees-description": "Come vengono calcolate le commissioni di transazione in ETH", + "nav-gas-fees-label": "Commissioni sul gas", + "nav-get-eth-description": "Servono ether (ETH) per utilizzare le applicazioni di Ethereum", + "nav-get-started-description": "Primi passi per utilizzare Ethereum", + "nav-governance-description": "Processo di aggiornamento del protocollo Ethereum", + "nav-governance-label": "Governance", + "nav-grants-description": "Un elenco curato dalla nostra community sui progetti che forniscono programmi di finanziamento con sovvenzioni", + "nav-guide-create-account-description": "Chiunque può creare un conto di Ethereum in qualsiasi momento, gratuitamente con un app portafoglio", + "nav-guide-create-account-label": "Come creare un conto di Ethereum", + "nav-guide-revoke-access-description": "Sicurezza nell'interazione con i contratti intelligenti e le applicazioni dell'ecosistema Ethereum", + "nav-guide-revoke-access-label": "Come revocare l'accesso ai contratti intelligenti", + "nav-guide-use-wallet-description": "Impara come gestire tutte le funzioni di base di un portafoglio", + "nav-guide-use-wallet-label": "Come utilizzare un portafoglio", + "nav-guides-description": "Guide pratiche per muovere i primi passi", + "nav-guides-label": "Guide esplicative", + "nav-history-description": "Un viaggio nel tempo per illustrare tutte le principali diramazioni e gli aggiornamenti", + "nav-history-label": "La storia tecnica di Ethereum", + "nav-layer-2-description": "Transazioni più economiche e veloci per Ethereum", + "nav-learn-by-coding-description": "Strumenti che ti aiutano a sperimentare con Ethereum", + "nav-local-env-description": "Scegliere e impostare il proprio stack di sviluppo Ethereum", + "nav-mainnet-description": "Le applicazioni aziendali della blockchain possono essere costruite sulla Rete pubblica di Ethereum", + "nav-nft-description": "Un modo per rappresentare qualsiasi cosa unica come un asset basato su Ethereum", + "nav-open-research-description": "Uno dei principali punti di forza di Ethereum è la sua attiva comunità di ricerca", + "nav-open-research-label": "Ricerca aperta", + "nav-overview-description": "Tutto ciò che riguarda la formazione su Ethereum", + "nav-overview-label": "Panoramica", + "nav-participate-overview-description": "Panoramica sulle modalità di partecipazione", "nav-primary": "Principale", + "nav-private-description": "Risorse per sviluppatori per la rete Ethereum privata per le imprese", + "nav-quizzes-description": "Scopri quanto ne sai su Ethereum e le criptovalute", + "nav-quizzes-label": "Metti alla prova le tue conoscenze", + "nav-refi-description": "Un sistema economico alternativo costruito su principi rigenerativi", + "nav-research-description": "Processi usati per migliorare Ethereum", + "nav-research-label": "Ricerca e sviluppo", + "nav-roadmap-description": "Il percorso verso una maggiore scalabilità, sicurezza e sostenibilità per Ethereum", + "nav-roadmap-future-description": "Consolidare Ethereum come rete robusta e decentralizzata", + "nav-roadmap-future-label": "A prova di futuro", + "nav-roadmap-label": "Roadmap", + "nav-roadmap-scaling-description": "Aggiornamenti della rete per ridurre ulteriormente i costi e la velocità delle transazioni", + "nav-roadmap-scaling-label": "Transazioni più economiche", + "nav-roadmap-security-description": "Assicurarsi che Ethereum resti resiliente a tutti i tipi di attacchi in futuro", + "nav-roadmap-security-label": "Sicurezza migliorata", + "nav-roadmap-ux-description": "Occorre semplificare l'utilizzo di Ethereum", + "nav-roadmap-ux-label": "Migliore esperienza utente", + "nav-run-a-node-description": "Diventa completamente sovrano, aiutando a proteggere la rete", + "nav-security-description": "Imparare le best practice sull'uso delle criptovalute", + "nav-smart-contracts-description": "Gli elementi fondamentali dell'ecosistema Ethereum", + "nav-stablecoins-description": "Le stablecoin sono token Ethereum progettate per rimanere a un valore fisso", + "nav-stake-description": "Ottieni ricompense per proteggere Ethereum", + "nav-stake-label": "Stake", + "nav-staking-home-description": "Panoramica sulle diverse opzioni di staking", + "nav-staking-home-label": "Home dello staking", + "nav-staking-pool-description": "Fai staking e guadagna ricompense di qualsiasi importo di ETH unendoti ad altri", + "nav-staking-pool-label": "Staking in pool", + "nav-staking-saas-description": "Gli operatori di nodi di terze parti gestiscono l'operazione del tuo client del validatore", + "nav-staking-saas-label": "Staking con un servizio", + "nav-staking-solo-description": "Opera hardware domestico e aggiungi personalmente alla sicurezza e decentralizzazione della rete di Ethereum", + "nav-staking-solo-label": "Staking in solo", + "nav-start-building-description": "Informazioni utili per i novellini", + "nav-translation-program-description": "Uno sforzo collaborativo per tradurre ethereum.org in tutte le lingue", + "nav-tutorials-description": "Elenco curato di tutorial della community", + "nav-use-cases-description": "Scoprire diverse idee per l'utilizzo di Ethereum", + "nav-use-cases-label": "Casi d'uso", + "nav-what-is-ether-description": "La valuta delle app Ethereum", + "nav-what-is-ethereum-description": "Capire cosa rende speciale Ethereum", + "nav-what-is-web3-label": "Cos'è il Web3?", + "nav-what-is-web3-description": "Un'alternativa ai monopoli centralizzati che dettano le regole", + "nav-whitepaper-description": "Il whitepaper originale di Ethereum scritto da Vitalik Buterin nel 2014", + "nav-zkp-description": "Un modo per provare la validità di una dichiarazione senza rivelarla", "nft-page": "NFT - Token non fungibili", "nfts": "NFT", "no": "No", @@ -140,6 +260,8 @@ "page-developers-aria-label": "Menu Sviluppatori", "page-index-meta-title": "Home page", "page-last-updated": "Ultimo aggiornamento pagina", + "participate": "Partecipa", + "participate-menu": "Menu partecipa", "pbs": "Separazione proponente-sviluppatore", "pools": "Staking in pool", "privacy-policy": "Politica sulla privacy", @@ -150,13 +272,15 @@ "refresh": "Ricarica la pagina.", "return-home": "torna alla home", "roadmap": "Roadmap di Ethereum", + "research": "Ricerca", + "research-menu": "Menu ricerca", "resources": "Risorse di traduzione", "regenerative-finance": "ReFi - Finanza Rigenerativa", - "run-a-node": "Esegui un nodo", + "run-a-node": "Gestire un nodo", "rollup-component-website": "Sito Web", "rollup-component-developer-docs": "Documentazione per sviluppatori", "rollup-component-technology-and-risk-summary": "Riepilogo su tecnologia e rischi", - "scaling": "Scalabilità", + "scaling": "Ridimensionamento", "saas": "Staking come servizio", "search": "Ricerca", "search-ethereum-org": "Cerca su ethereum.org", @@ -164,10 +288,11 @@ "search-box-blank-state-text": "Pronti, partenza, cerca!", "search-eth-address": "Questo sembrerebbe un indirizzo Ethereum. Non forniamo dati specifici per gli indirizzi. Prova a cercarlo su un esploratore di blocchi come", "search-no-results": "Nessun risultato per questa ricerca", + "security": "Sicurezza", "single-slot-finality": "Finalità del singolo slot", "statelessness": "Assenza di stato", "see-contributors": "Visualizza chi ha contribuito", - "set-up-local-env": "Configura l'ambiente locale", + "set-up-local-env": "Configurare l'ambiente locale", "sharding": "Sharding", "show-all": "Mostra tutto", "show-less": "Mostra meno", @@ -181,6 +306,7 @@ "start-here": "Inizia da qui", "style-guide": "Guida di stile", "solo": "Staking in solo", + "support": "Supporto", "terms-of-use": "Condizioni d'uso", "translation-banner-body-new": "Stai visualizzando questa pagina in inglese perché non l'abbiamo ancora tradotta. Aiutaci a tradurre il contenuto.", "translation-banner-body-update": "C'è una nuova versione di questa pagina, ma al momento è solo in inglese. Aiutaci a tradurre l'ultima versione.", @@ -191,11 +317,14 @@ "translation-banner-no-bugs-title": "Nessun bug qui!", "translation-banner-no-bugs-content": "Questa pagina non è stata tradotta. Per il momento, è stata intenzionalmente lasciata in inglese.", "translation-banner-no-bugs-dont-show-again": "Non mostrare più", + "translation-program": "Programma di Traduzione", "try-using-search": "Prova a utilizzare la ricerca per trovare ciò che stai cercando, o", "tutorials": "Tutorial", "up": "Su", + "use": "Usa", "use-ethereum": "Usare Ethereum", "use-ethereum-menu": "Usa menu Ethereum", + "use-menu": "Usa menu", "user-experience": "Esperienza utente", "verkle-trees": "Alberi di Verkle", "wallets": "Portafogli", @@ -203,7 +332,7 @@ "web3": "Cos'è il Web3?", "web3-title": "Web3", "website-last-updated": "Ultimo aggiornamento sito web", - "what-is-ether": "Cos'è Ether (ETH)?", + "what-is-ether": "Cos'è ether (ETH)?", "what-is-ethereum": "Cos'è Ethereum?", "withdrawals": "Prelievi di staking", "yes": "Sì", diff --git a/src/intl/ja/common.json b/src/intl/ja/common.json index 3028892cb6d..20c399a2e72 100644 --- a/src/intl/ja/common.json +++ b/src/intl/ja/common.json @@ -1,17 +1,31 @@ { - "account-abstraction": "アカウント抽象化", "about-ethereum-org": "Ethereum.orgについて", "about-us": "私たちについて", + "adding-desci-projects": "Desciプロジェクトの追加", + "adding-developer-tools": "デベロッパー向けツールの追加", + "adding-exchanges": "取引所の追加", + "adding-glossary-terms": "用語集への用語の追加", + "adding-layer-2s": "レイヤー2の追加", + "adding-products": "イーサリアムプロダクトの追加", + "adding-staking-products": "ステーキングプロダクトの追加", + "adding-wallets": "ウォレットの追加", + "account-abstraction": "アカウント抽象化", + "acknowledgements": "謝辞", "aria-toggle-search-button": "検索ボタンの切り替え", "aria-toggle-menu-button": "メニューボタンの切り替え", "beacon-chain": "ビーコンチェーン", "bridges": "ブロックチェーンブリッジ", + "bug-bounty": "バグ報奨金", + "build": "ビルド", + "build-menu": "ビルドメニュー", "clear": "クリア", "close": "閉じる", "community": "コミュニティ", "community-hub": "コミュニティハブ", "community-menu": "コミュニティメニュー", "contact": "お問い合わせ", + "content-buckets": "コンテンツバケット", + "content-resources": "コンテンツリソース", "content-standardization": "コンテンツの標準化", "contributing": "貢献", "contributors": "貢献者", @@ -27,10 +41,13 @@ "decentralized-identity": "分散型アイデンティティ", "decentralized-social-networks": "分散型ソーシャルネットワーク", "decentralized-science": "分散型サイエンス(DeSci)", + "description": "ナビゲーションアイテムの説明", "defi-page": "分散型金融(DeFi)", + "design": "デザイン", + "design-principles": "デザイン原則", "devcon": "Devcon", "developers": "デベロッパー", - "developers-home": "デベロッパーのホーム", + "developers-home": "開発者のホーム", "docs": "ドキュメント", "docsearch-to-select": "選択する", "docsearch-to-navigate": "移動する", @@ -51,7 +68,7 @@ "documentation": "ドキュメント", "down": "下へ", "ecosystem": "エコシステム", - "edit-page": "ページ編集", + "edit-page": "ページを編集する", "ef-blog": "イーサリアム・ファウンデーションブログ", "eips": "イーサリアム改善の提案", "energy-consumption": "イーサリアムのエネルギー消費", @@ -63,7 +80,7 @@ "ethereum-bug-bounty": "イーサリアムバグ報奨金プログラム", "consensus-when-shipping": "導入のタイミング", "ethereum-upgrades": "イーサリアムのアップグレード", - "ethereum-brand-assets": "イーサリアムブランドアセット", + "ethereum-brand-assets": "イーサリアムブランド資産", "ethereum-online": "オンラインコミュニティ", "ethereum-events": "イーサリアムイベント", "ethereum-foundation": "イーサリアム・ファウンデーション", @@ -94,11 +111,11 @@ "grants": "助成制度", "grant-programs": "エコシステム助成プログラム", "guides": "ガイド", - "guides-hub": "ガイドハブ", + "guides-hub": "ハウツーガイド", "history-of-ethereum": "イーサリアムの歴史", "home": "ホーム", "how-ethereum-works": "イーサリアムの仕組み", - "how-to-register-an-ethereum-account": "イーサリアムアカウントの「登録」方法", + "how-to-create-an-ethereum-account": "イーサリアムアカウントの「開設」方法", "how-to-revoke-token-access": "暗号資金へのスマートコントラクトのアクセスを無効にする方法", "how-to-swap-tokens": "トークンの交換方法", "how-to-use-a-bridge": "トークンをレイヤー2にブリッジする方法", @@ -119,7 +136,7 @@ "learn-hub": "学習ハブ", "learn-menu": "学習メニュー", "learn-more": "もっと詳しく", - "less": "より少なく", + "less": "少なく表示", "light-mode": "ライト", "listing-policy-disclaimer": "このページに掲載されている全てのプロダクトは、公式に推奨するものではなく、情報提供のみを目的としています。プロダクトの追加やポリシーに関するフィードバックをご希望の場合は、GitHubで問題を提起してください。", "loading": "読み込み中", @@ -128,10 +145,116 @@ "loading-error-try-again-later": "データをロードできません。後でもう一度お試しください。", "logo": "ロゴ", "mainnet-ethereum": "メインネット イーサリアム", - "more": "もっと見る", - "nav-developers": "デベロッパー", + "merge": "マージ", + "more": "さらに表示", + "nav-about-description": "イーサリアムコミュニティのためのパブリックオープンソースプロジェクト", + "nav-advanced-description": "さらに複雑なトピックについて学ぶ", + "nav-advanced-label": "上級者向け", + "nav-basics-description": "イーサリアムの基盤を理解する", + "nav-basics-label": "基本", + "nav-bridges-description": "Web3は、主要なL1ブロックチェーンとL2スケーリングソリューションのエコシステムに進化しました", + "nav-builders-home-description": "ビルダーによるビルダーのためのイーサリアムのビルダーマニュアル", + "nav-builders-home-label": "ビルダーのホーム", + "nav-contribute-description": "お手伝いいただける場合は、ここからその方法を確認できます", + "nav-contribute-label": "ethereum.orgに貢献する", + "nav-dao-description": "中央集権的な制御がない、メンバー所有のコミュニティ", + "nav-dapps-description": "イーサリアムを利用したエコシステムの豊富なアプリケーションを探索する", + "nav-defi-description": "従来の金融市場に代わる、グローバルで開かれた市場", + "nav-desci-description": "現在の科学的システムに代わる、グローバルで開かれたシステム", + "nav-desoc-description": "ソーシャル・インタラクションとコンテンツ作成のためのブロックチェーンベースのプラットフォーム", "nav-developers-docs": "デベロッパー向け文書", + "nav-developers": "デベロッパー", + "nav-did-description": "独自の分散型識別子を発行し、所有する", + "nav-docs-description": "イーサリアムを理解し、イーサリアムを使ってビルドを行うためのヘルプドキュメント", + "nav-docs-design-description": "独自のWeb3デザインの課題、最善の方法、ユーザー検索のインサイトの説明", + "nav-docs-design-label": "UX/UIデザインの基礎", + "nav-docs-foundation-description": "イーサリアムで開発を行うための基本的な要点", + "nav-docs-foundation-label": "基礎的なトピック", + "nav-docs-overview-description": "デベロッパー向けドキュメントのホーム", + "nav-docs-stack-description": "イーサリアムスタックの全詳細を理解する", + "nav-docs-stack-label": "イーサリアムスタック", + "nav-eip-description": "新機能やプロセスを特定する基準", + "nav-eip-label": "イーサリアム改善提案(EIP)", + "nav-emerging-description": "イーサリアムの他の新しいユースケースを知る", + "nav-emerging-label": "新たなユースケース", + "nav-enterprise-description": "イーサリアムのビジネスアプリケーション", + "nav-ethereum-org-description": "このウェブサイトはコミュニティが主導しています。ぜひ参加して貢献しましょう", + "nav-ethereum-wallets-description": "イーサリアムアカウントを使用してアプリで対話する", + "nav-events-description": "分散化、そして誰でも参加できる自由", + "nav-events-irl-description": "毎月、主要なイーサリアムイベントが対面およびオンラインで開催されています", + "nav-events-label": "コミュニティおよびイベント", + "nav-events-online-description": "数十万人のイーサリアム愛好家がこれらのオンラインコミュニティで集結します", + "nav-find-wallet-description": "ウォレットにより、暗号通貨が利用できるようになります", + "nav-find-wallet-label": "ウォレットを選ぶ", + "nav-gas-fees-description": "ETHトランザクションフィーはどのように計算されるか", + "nav-gas-fees-label": "ガス代", + "nav-get-eth-description": "イーサリアムアプリケーションを使用するにはEther (ETH)が必要です", + "nav-get-started-description": "イーサリアムの使用に向けた第1ステップ", + "nav-governance-description": "イーサリアムプロトコルのアップグレードに関連するプロセス", + "nav-governance-label": "ガバナンス", + "nav-grants-description": "コミュニティによって精選された、助成金プログラムを提供するプロジェクトリスト", + "nav-guide-create-account-description": "ウォレットアプリを使用すれば誰でもいつでも無料でEthereumアカウントを作成できます", + "nav-guide-create-account-label": "イーサリアムアカウントの開設方法", + "nav-guide-revoke-access-description": "Ethereumエコシステム内のスマートコントラクトやアプリケーションとのやり取り時には安全に注意してください", + "nav-guide-revoke-access-label": "スマートコントラクトのアクセスを取り消す方法", + "nav-guide-use-wallet-description": "ウォレットの基本機能をそれぞれ操作する方法を学ぶ", + "nav-guide-use-wallet-label": "ウォレットの使用方法", + "nav-guides-description": "使用開始準備のための段階的な実践ガイド", + "nav-guides-label": "ハウツーガイド", + "nav-history-description": "すべての主要なフォークとアップデートのタイムライン", + "nav-history-label": "イーサリアムの技術的な歴史", + "nav-layer-2-description": "より安く、より速いイーサリアムの取引", + "nav-learn-by-coding-description": "イーサリアムを試してみるのに役立つツール", + "nav-local-env-description": "イーサリアムの開発スタックを選択してセットアップする", + "nav-mainnet-description": "エンタープライズブロックチェーンアプリケーションは、パブリックのイーサリアムメインネット上で構築することができます", + "nav-nft-description": "イーサリアムベースのアセットとして、何か唯一無二なものを表現する方法", + "nav-open-research-description": "イーサリアムの主な強みの一つは、その活発な研究コミュニティです", + "nav-open-research-label": "オープンリサーチ", + "nav-overview-description": "イーサリアム教育に関して", + "nav-overview-label": "概要", + "nav-participate-overview-description": "参加方法の概要", "nav-primary": "プライマリ", + "nav-private-description": "プライベードなエンタープライズ向けイーサリアムのデベロッパーリソース", + "nav-quizzes-description": "イーサリアムと仮想通貨の理解度をチェック", + "nav-quizzes-label": "あなたの理解度をテストする", + "nav-refi-description": "再生原理に基づく代替経済システム", + "nav-research-description": "イーサリアムをより良くするためのプロセス", + "nav-research-label": "研究・開発", + "nav-roadmap-description": "イーサリアムのスケーラビリティ、セキュリティ、サステナビリティを改善する工程", + "nav-roadmap-future-description": "イーサリアムを堅牢で分散型のネットワークとして確立させる", + "nav-roadmap-future-label": "未来のプルーフィング", + "nav-roadmap-label": "ロードマップ", + "nav-roadmap-scaling-description": "トランザクションコストをさらに削減し、処理速度を向上させるためのネットワーク更新", + "nav-roadmap-scaling-label": "より安価なトランザクション", + "nav-roadmap-security-description": "将来に向けてイーサリアムがあらゆる種類の攻撃に対して強靱であるようにする", + "nav-roadmap-security-label": "改善されたセキュリティ", + "nav-roadmap-ux-description": "イーサリアムの利用方法を簡素化する必要がある", + "nav-roadmap-ux-label": "ユーザーエクスペリエンスの向上", + "nav-run-a-node-description": "自分で完全にコントロールしつつ、ネットワークのセキュリティ向上に貢献する", + "nav-security-description": "暗号通貨を使用するときの最善の方法について学ぶ", + "nav-smart-contracts-description": "イーサリアムエコシステムの基本的な構築ブロック", + "nav-stablecoins-description": "ステーブルコインは、一定価値に保たれるように設計されたイーサリアムトークンです", + "nav-stake-description": "イーサリアムを保護して報酬を獲得", + "nav-stake-label": "ステーク", + "nav-staking-home-description": "ステーキングの異なるオプションの概要", + "nav-staking-home-label": "ステーキングホーム", + "nav-staking-pool-description": "他者と協力してETHをステーキングし、報酬を獲得する", + "nav-staking-pool-label": "ステーキングプール", + "nav-staking-saas-description": "サードパーティーのノードオペレータが、バリデータクライアントの運用を実施", + "nav-staking-saas-label": "サービスを利用してステーキングする", + "nav-staking-solo-description": "家庭用ハードウェアを稼働させ、イーサリアムネットワークのセキュリティと分散化に個人で貢献", + "nav-staking-solo-label": "ソロステーキング", + "nav-start-building-description": "初心者向けの有用な情報", + "nav-translation-program-description": "ethereum.orgをすべての言語に翻訳するための共同作業", + "nav-tutorials-description": "コミュニティチュートリアルの精選されたリスト", + "nav-use-cases-description": "イーサリアム利用のさまざまなアイデアを発見", + "nav-use-cases-label": "ユースケース", + "nav-what-is-ether-description": "イーサリアムアプリの通貨", + "nav-what-is-ethereum-description": "何がイーサリアムを特別なものにするのかを理解する", + "nav-what-is-web3-label": "Web3とは", + "nav-what-is-web3-description": "中央集権的な独占企業がルールを決定することに対する代替案", + "nav-whitepaper-description": "2014年にヴィタリック・ブテリンによって書かれたオリジナルのイーサリアムのホワイトペーパー", + "nav-zkp-description": "証明したい主張そのものを明らかにすることなく、主張の妥当性を証明する方法", "nft-page": "非代替性トークン(NFT)", "nfts": "NFT", "no": "いいえ", @@ -140,6 +263,8 @@ "page-developers-aria-label": "開発者向けメニュー", "page-index-meta-title": "ホーム", "page-last-updated": "ページの最終更新日時", + "participate": "EIPへの参加", + "participate-menu": "参加メニュー", "pbs": "プロポーザー/ビルダーセパレーション(PBS)", "pools": "ステーキングプール", "privacy-policy": "プライバシーポリシー", @@ -150,6 +275,8 @@ "refresh": "ページを更新してください。", "return-home": "ホームへ戻る", "roadmap": "イーサリアムロードマップ", + "research": "リサーチ", + "research-menu": "リサーチメニュー", "resources": "翻訳のリソース", "regenerative-finance": "再生金融(ReFi)", "run-a-node": "ノードの運用", @@ -164,6 +291,7 @@ "search-box-blank-state-text": "検索!", "search-eth-address": "これはイーサリアムのアドレスのようですが、アドレスに固有のデータは提供していません。etherscanのようなブロックエクスプローラーで検索してみてください。", "search-no-results": "検索結果はありません。", + "security": "セキュリティ", "single-slot-finality": "シングルスロット・ファイナリティ", "statelessness": "ステートレス", "see-contributors": "貢献者を表示", @@ -181,6 +309,7 @@ "start-here": "ここからスタート", "style-guide": "スタイルガイド", "solo": "ソロステーキング", + "support": "サポート", "terms-of-use": "利用規約", "translation-banner-body-new": "このページはまだ翻訳されていないため、英語で表示されています。このコンテンツの翻訳にご協力ください。", "translation-banner-body-update": "このページの新しいバージョンがありますが、現在は英語のみです。最新バージョンの翻訳にご協力ください。", @@ -191,11 +320,14 @@ "translation-banner-no-bugs-title": "ここにバグはありません!", "translation-banner-no-bugs-content": "このページは翻訳されていないため、このページは英語で表示されています。", "translation-banner-no-bugs-dont-show-again": "次回から表示しない", + "translation-program": "翻訳プログラム", "try-using-search": "検索からお探しのものを検索してみてください。", "tutorials": "チュートリアル", "up": "上へ", + "use": "利用する", "use-ethereum": "イーサリアムを使う", "use-ethereum-menu": "イーサリアムのメニューを使用", + "use-menu": "利用メニュー", "user-experience": "ユーザーエクスペリエンス", "verkle-trees": "バークルツリー", "wallets": "ウォレット", diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index 54329a3ca6c..f52f15a8b9d 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Włącz przycisk menu", "beacon-chain": "Łańcuch śledzący", "bridges": "Mosty blockchain", + "bug-bounty": "Nagrody za błędy", + "build": "Wybuduj", + "build-menu": "Menu budowania", "clear": "Wyczyść", "close": "Zamknij", "community": "Społeczność", @@ -34,10 +37,11 @@ "dao-page": "DAO - Zdecentralizowane autonomiczne organizacje", "dark-mode": "Ciemny", "data-provided-by": "Źródło danych:", - "decentralized-applications-dapps": "Aplikacje zdecentralizowane (dapps)", + "decentralized-applications-dapps": "Dapps - Aplikacje zdecentralizowane", "decentralized-identity": "Zdecentralizowana tożsamość", "decentralized-social-networks": "Zdecentralizowane sieci społecznościowe", "decentralized-science": "DeSci - Zdecentralizowana nauka", + "description": "Opis elementu nawigacyjnego", "defi-page": "DeFi - Zdecentralizowane finanse", "design": "Projekt", "design-principles": "Zasady projektowania", @@ -76,7 +80,7 @@ "ethereum-bug-bounty": "Program nagród za błędy Ethereum", "consensus-when-shipping": "Kiedy to się stanie?", "ethereum-upgrades": "Uaktualnienia Ethereum", - "ethereum-brand-assets": "Aktywa marki Ethereum", + "ethereum-brand-assets": "Zasoby marki Ethereum", "ethereum-online": "Społeczności internetowe", "ethereum-events": "Wydarzenia Ethereum", "ethereum-foundation": "Fundacja Ethereum", @@ -96,7 +100,7 @@ "feedback-card-prompt-tutorial": "Czy ten samouczek był pomocny?", "feedback-widget-thank-you-title": "Dziękujemy za opinię!", "feedback-widget-thank-you-subtitle": "Spraw, aby ta strona była jeszcze lepsza, odpowiadając na kilka pytań.", - "feedback-widget-thank-you-subtitle-ext": "Jeśli potrzebujesz pomocy, możesz skontaktować się ze społecznością na naszym kanale Discord.", + "feedback-widget-thank-you-subtitle-ext": "Jeśli potrzebujesz pomocy, możesz skontaktować się ze społecznością na naszym serwerze Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Otwórz krótką ankietę", "find-wallet": "Znajdź portfel", @@ -143,9 +147,114 @@ "mainnet-ethereum": "Sieć główna Ethereum", "merge": "Połącz", "more": "Więcej", - "nav-developers": "Autorzy", + "nav-about-description": "Publiczny projekt open-source dla społeczności Ethereum", + "nav-advanced-description": "Poznaj bardziej złożone zagadnienia", + "nav-advanced-label": "Zaawansowane", + "nav-basics-description": "Poznaj podstawy Ethereum", + "nav-basics-label": "Podstawy", + "nav-bridges-description": "Web3 przekształcił się w ekosystem podstawowych łańcuchów bloków L1 i rozwiązań skalowania L2", + "nav-builders-home-description": "Podręcznik twórców Ethereum — stworzony przez twórców dla twórców", + "nav-builders-home-label": "Strona główna twórcy", + "nav-contribute-description": "Jeśli chcesz pomóc, to Cię poprowadzi", + "nav-contribute-label": "Przyczynianie się do rozwoju ethereum.org", + "nav-dao-description": "Należące do członków społeczności bez scentralizowanej władzy", + "nav-dapps-description": "Poznaj bogaty ekosystem aplikacji korzystających z Ethereum", + "nav-defi-description": "Globalna, otwarta alternatywa dla tradycyjnego rynku finansowego", + "nav-desci-description": "Globalna, otwarta alternatywa dla obecnego systemu naukowego", + "nav-desoc-description": "Oparte na łańcuchu bloków platformy umożliwiające interakcje społeczne oraz tworzenie treści", "nav-developers-docs": "Dokumentacja deweloperów", + "nav-developers": "Deweloperzy", + "nav-did-description": "Wydawaj i posiadaj swoje unikalne zdecentralizowane identyfikatory", + "nav-docs-description": "Dokumenty, które pomogą Ci zrozumieć Ethereum i tworzyć za jego pomocą", + "nav-docs-design-description": "Opis unikalnych wyzwań związanych z projektowaniem web3, najlepsze praktyki i wnioski z badań użytkowników", + "nav-docs-design-label": "Podstawy projektowania UX/UI", + "nav-docs-foundation-description": "Główne podstawy programowania w sieci Ethereum", + "nav-docs-foundation-label": "Zagadnienia podstawowe", + "nav-docs-overview-description": "Twoja strona główna dokumentów programistycznych", + "nav-docs-stack-description": "Poznaj wszystkie szczegóły stosu Ethereum", + "nav-docs-stack-label": "Stos Ethereum", + "nav-eip-description": "Standardy określające nowe funkcje lub procesy", + "nav-eip-label": "Wnioski dotyczące ulepszenia Ethereum (EIP)", + "nav-emerging-description": "Poznaj inne, nowsze przypadki użycia Ethereum", + "nav-emerging-label": "Pojawiające się przypadki użycia", + "nav-enterprise-description": "Zastosowania biznesowe Ethereum", + "nav-ethereum-org-description": "Ta witryna internetowa jest prowadzona przez społeczność — dołącz do nas i również wnieś swój wkład", + "nav-ethereum-wallets-description": "Aplikacja do interakcji z Twoim kontem Ethereum", + "nav-events-description": "Decentralizacja i swoboda uczestnictwa dla każdego", + "nav-events-irl-description": "Każdego miesiąca odbywają się ważne wydarzenia związane z Ethereum, zarówno osobiste, jak i online", + "nav-events-label": "Społeczności i wydarzenia", + "nav-events-online-description": "W tych społecznościach internetowych zrzeszone są setki tysięcy entuzjastów Ethereum", + "nav-find-wallet-description": "Portfele umożliwiają korzystanie z kryptowalut", + "nav-find-wallet-label": "Wybierz swój portfel", + "nav-gas-fees-description": "Jak obliczane są opłaty transakcyjne ETH", + "nav-gas-fees-label": "Opłaty za gaz", + "nav-get-eth-description": "Do korzystania z aplikacji Ethereum niezbędny jest Ether (ETH)", + "nav-get-started-description": "Twoje pierwsze kroki w używaniu Ethereum", + "nav-governance-description": "Proces związany z aktualizacją protokołu Ethereum", + "nav-governance-label": "Zarządzanie", + "nav-grants-description": "Wyselekcjonowana przez naszą społeczność lista projektów, które zapewniają programy grantów finansowych", + "nav-guide-create-account-description": "Każdy może utworzyć konto Ethereum w dowolnym momencie, za darmo i z aplikacją portfela", + "nav-guide-create-account-label": "Jak stworzyć konto Ethereum", + "nav-guide-revoke-access-description": "Zachowaj bezpieczeństwo podczas interakcji z inteligentnymi kontraktami i aplikacjami w ekosystemie Ethereum", + "nav-guide-revoke-access-label": "Jak cofnąć dostęp do inteligentnego kontraktu", + "nav-guide-use-wallet-description": "Dowiedz się, jak obsługiwać wszystkie podstawowe funkcje portfela", + "nav-guide-use-wallet-label": "Jak używać portfela", + "nav-guides-description": "Praktyczne przewodniki krok po kroku, które pomogą Ci zacząć", + "nav-guides-label": "Przewodniki", + "nav-history-description": "Oś czasu wszystkich głównych forków i aktualizacji", + "nav-history-label": "Historia techniczna Ethereum", + "nav-layer-2-description": "Tańsze i szybsze transakcje w Ethereum", + "nav-learn-by-coding-description": "Narzędzia, które pomogą Ci eksperymentować z Ethereum", + "nav-local-env-description": "Wybierz i skonfiguruj swój stos programistyczny Ethereum", + "nav-mainnet-description": "Aplikacje blockchain dla przedsiębiorstw można tworzyć w publicznej sieci głównej Ethereum", + "nav-nft-description": "Sposób reprezentowania czegoś wyjątkowego jako aktywu na blockchainie Ethereum", + "nav-open-research-description": "Jedną z głównych zalet Ethereum jest jego aktywna społeczność badawcza", + "nav-open-research-label": "Otwarte badania", + "nav-overview-description": "Edukacją na temat wszystkiego, co związane z Ethereum", + "nav-overview-label": "Przegląd", + "nav-participate-overview-description": "Informacje o tym, jak wziąć udział", "nav-primary": "Podstawowe", + "nav-private-description": "Zasoby deweloperskie dla prywatnego przedsiębiorstwa Ethereum", + "nav-quizzes-description": "Sprawdź, jak dobrze rozumiesz Ethereum i kryptowaluty", + "nav-quizzes-label": "Przetestuj swoją wiedzę", + "nav-refi-description": "Alternatywny system ekonomiczny oparty na zasadach regeneracji", + "nav-research-description": "Procesy stosowane w celu ulepszenia Ethereum", + "nav-research-label": "Badania i rozwój", + "nav-roadmap-description": "Droga do zwiększenia skalowalności, bezpieczeństwa i stabilności Ethereum", + "nav-roadmap-future-description": "Umacnianie Ethereum jako niezawodnej sieci zdecentralizowanej", + "nav-roadmap-future-label": "Zabezpieczenie na przyszłość", + "nav-roadmap-label": "Plan działania", + "nav-roadmap-scaling-description": "Aktualizacje sieci, mające na celu dalsze obniżenie kosztów i zwiększenie szybkości transakcji", + "nav-roadmap-scaling-label": "Tańsze transakcje", + "nav-roadmap-security-description": "Dbanie o to, aby sieć Ethereum pozostała odporna na wszelkiego rodzaju ataki w przyszłości", + "nav-roadmap-security-label": "Zwiększone bezpieczeństwo", + "nav-roadmap-ux-description": "Korzystanie z Ethereum wymaga uproszczenia", + "nav-roadmap-ux-label": "Better user experience", + "nav-run-a-node-description": "Zapewnij sobie pełną suwerenność, zarazem pomagając w zabezpieczeniu sieci", + "nav-security-description": "Poznaj najlepsze praktyki dotyczące korzystania z kryptowalut", + "nav-smart-contracts-description": "Podstawowe elementy składowe ekosystemu Ethereum", + "nav-stablecoins-description": "Stablecoiny to tokeny Ethereum zaprojektowane tak, aby utrzymywały stałą wartość", + "nav-stake-description": "Zdobywaj nagrody za zabezpieczanie Ethereum", + "nav-stake-label": "Stakuj", + "nav-staking-home-description": "Omówienie różnych opcji stakingu", + "nav-staking-home-label": "Strona główna stakingu", + "nav-staking-pool-description": "Stakuj i zdobywaj nagrody z dowolną ilością ETH, łącząc siły z innymi", + "nav-staking-pool-label": "Stakowanie w puli", + "nav-staking-saas-description": "Działanie Twojego walidatora zapewniają zewnętrzni operatorzy węzłów", + "nav-staking-saas-label": "Staking za pomocą usługi", + "nav-staking-solo-description": "Uruchamiaj sprzęt domowy i osobiście zwiększaj bezpieczeństwo i decentralizację sieci Ethereum", + "nav-staking-solo-label": "Stakowanie solo", + "nav-start-building-description": "Przydatne informacje dla nowych użytkowników", + "nav-translation-program-description": "Wspólny wysiłek na rzecz przetłumaczenia ethereum.org na wszystkie języki", + "nav-tutorials-description": "Wyselekcjonowana lista samouczków społeczności", + "nav-use-cases-description": "Odkryj różne pomysły na wykorzystanie Ethereum", + "nav-use-cases-label": "Use cases", + "nav-what-is-ether-description": "Waluta aplikacji Ethereum", + "nav-what-is-ethereum-description": "Dowiedz się, co wyróżnia Ethereum", + "nav-what-is-web3-label": "Co to jest Web3?", + "nav-what-is-web3-description": "Alternatywa dla scentralizowanych monopoli dyktujących zasady", + "nav-whitepaper-description": "Oryginalna dokumentacja Ethereum napisana przez Vitalika Buterina w roku 2014", + "nav-zkp-description": "Sposób na udowodnienie prawdziwości stwierdzenia bez ujawniania samego stwierdzenia", "nft-page": "NFT - Tokeny niewymienialne", "nfts": "Tokeny NFT", "no": "Nie", @@ -154,6 +263,8 @@ "page-developers-aria-label": "Menu dewelopera", "page-index-meta-title": "Strona główna", "page-last-updated": "Strona ostatnio zaktualizowana", + "participate": "Uczestnictwo", + "participate-menu": "Menu Uczestnictwo", "pbs": "Separacja proponujący-budujący", "pools": "Stakowanie w puli", "privacy-policy": "Polityka prywatności", @@ -164,9 +275,11 @@ "refresh": "Odśwież stronę.", "return-home": "wróć do strony głównej", "roadmap": "Mapa drogowa Ethereum", + "research": "Badania", + "research-menu": "Menu Badania", "resources": "Zasoby do tłumaczenia", "regenerative-finance": "ReFi - Finanse regeneracyjne", - "run-a-node": "Dodaj węzeł", + "run-a-node": "Uruchom węzeł", "rollup-component-website": "Strona internetowa", "rollup-component-developer-docs": "Dokumentacja dewelopera", "rollup-component-technology-and-risk-summary": "Technologia i podsumowanie ryzyka", @@ -211,17 +324,19 @@ "try-using-search": "Aby znaleźć to, czego szukasz, spróbuj użyć wyszukiwania lub", "tutorials": "Samouczki", "up": "W górę", + "use": "Zastosowania", "use-ethereum": "Korzystanie z Ethereum", "use-ethereum-menu": "Menu korzystania z Ethereum", - "user-experience": "Doświadczenia użytkownika", + "use-menu": "Menu Zastosowania", + "user-experience": "Doświadczenie użytkownika", "verkle-trees": "Drzewa Verkle", "wallets": "Portfele", "we-couldnt-find-that-page": "Nie udało się odnaleźć tej strony", "web3": "Co to jest Web3?", "web3-title": "Web3", "website-last-updated": "Data ostatniej aktualizacji strony", - "what-is-ether": "Czym jest ether (ETH)?", - "what-is-ethereum": "Co to jest Ethereum?", + "what-is-ether": "Czym jest eter (ETH)?", + "what-is-ethereum": "Czym jest Ethereum?", "withdrawals": "Wypłaty ze stakingu", "yes": "Tak", "zero-knowledge-proofs": "Pakiety zbiorcze o wiedzy zerowej" diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index bc3e55b472a..5293ac67414 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "切換選單按鈕", "beacon-chain": "信標鏈", "bridges": "區塊鏈橋", + "bug-bounty": "漏洞懸賞", + "build": "建造", + "build-menu": "建造選單", "clear": "清除", "close": "關閉", "community": "社群", @@ -34,10 +37,11 @@ "dao-page": "DAO - 去中心化自治組織", "dark-mode": "深色模式", "data-provided-by": "資料來源:", - "decentralized-applications-dapps": "去中心化應用程式 (dapp)", + "decentralized-applications-dapps": "Dapp - 去中心化應用程式", "decentralized-identity": "去中心化身分", "decentralized-social-networks": "去中心化社群網路", "decentralized-science": "DeSci - 去中心化科研", + "description": "導覽項目說明", "defi-page": "DeFi - 去中心化金融", "design": "設計", "design-principles": "設計理念", @@ -84,7 +88,7 @@ "ethereum-glossary": "以太坊詞彙表", "ethereum-governance": "以太坊管理體系", "ethereum-logo": "以太坊標誌", - "ethereum-roadmap": "以太坊路線圖", + "ethereum-roadmap": "以太坊開發藍圖", "ethereum-protocol": "以太坊協議", "ethereum-security": "以太坊安全及詐騙預防", "ethereum-support": "以太坊支援", @@ -96,7 +100,7 @@ "feedback-card-prompt-tutorial": "這個使用教學對你有幫助嗎?", "feedback-widget-thank-you-title": "感謝你提供意見回饋!", "feedback-widget-thank-you-subtitle": "回答幾個問題,讓這個頁面更加完善。", - "feedback-widget-thank-you-subtitle-ext": "如果需要協助,你可以前往我們的 Discord 聯繫社群。", + "feedback-widget-thank-you-subtitle-ext": "若你需要幫助,可透過我們的 Discord 聯繫社群。", "feedback-widget-thank-you-timing": "2-3 分鐘", "feedback-widget-thank-you-cta": "開啟小調查", "find-wallet": "尋找錢包", @@ -128,7 +132,7 @@ "last-edit": "最後編輯", "layer-2": "第二層", "learn": "學習", - "learn-by-coding": "透過編碼學習", + "learn-by-coding": "透過編寫程式學習", "learn-hub": "學習中心", "learn-menu": "學習選單", "learn-more": "了解更多", @@ -143,9 +147,114 @@ "mainnet-ethereum": "以太坊主網路", "merge": "合併", "more": "更多", - "nav-developers": "開發者", + "nav-about-description": "適用以太坊社群的公性開放原始碼專案", + "nav-advanced-description": "深入瞭解更複雜的主題", + "nav-advanced-label": "進階", + "nav-basics-description": "瞭解以太坊的基本知識", + "nav-basics-label": "基本資料", + "nav-bridges-description": "Web3 已經演變成 L1 區塊鏈和 L2 擴容解決方案的生態系統", + "nav-builders-home-description": "由建置者製作且供建置者使用的建置者以太坊手冊", + "nav-builders-home-label": "建置者的首頁", + "nav-contribute-description": "如果你想要提供協助,這個手冊可引導你", + "nav-contribute-label": "對 ethereum.org 網站作出貢獻", + "nav-dao-description": "由成員所擁有且無集中式控制的社群", + "nav-dapps-description": "使用以太坊探索豐富的應用程式生態系統", + "nav-defi-description": "傳統金融市場的全球開放性替代方案", + "nav-desci-description": "當前科學系統的全球開放性替代方案。", + "nav-desoc-description": "基於區塊鏈的平台,用於社交互動、内容建立。", "nav-developers-docs": "開發者文件", + "nav-developers": "開發者", + "nav-did-description": "發佈並擁有您獨特的去中心化身分識別", + "nav-docs-description": "幫助你瞭解並使用以太坊來建造的文件", + "nav-docs-design-description": "獨特的 Web3 設計挑戰、最佳案例和使用研究洞見的說明", + "nav-docs-design-label": "UX/UI 設計基礎", + "nav-docs-foundation-description": "在以太坊上開發的核心基礎", + "nav-docs-foundation-label": "基礎主題", + "nav-docs-overview-description": "你的開發者文件首頁", + "nav-docs-stack-description": "瞭解所有關於以太坊技術堆棧的細節", + "nav-docs-stack-label": "以太坊技術堆棧", + "nav-eip-description": "規範新功能或流程的標準", + "nav-eip-label": "以太坊改進提案 (EIP)", + "nav-emerging-description": "瞭解其他比較新的以太坊使用案例", + "nav-emerging-label": "新興使用案例", + "nav-enterprise-description": "以太坊的商業應用程式", + "nav-ethereum-org-description": "本網站由社群共同推動—請加入我們,一同作出貢獻", + "nav-ethereum-wallets-description": "與你的以太坊帳戶互動的應用程式", + "nav-events-description": "擁有去集中化及自由度,任何人皆可參與", + "nav-events-irl-description": "每月皆有可以親自參與及線上參與的主要以太坊事件", + "nav-events-label": "社群與事件", + "nav-events-online-description": "數以萬計的以太坊愛好者維護這些線上社群", + "nav-find-wallet-description": "錢包允許你使用加密貨幣", + "nav-find-wallet-label": "選擇你的錢包", + "nav-gas-fees-description": "ETH 交易費用的計算方式", + "nav-gas-fees-label": "燃料費", + "nav-get-eth-description": "你需要 Ether (ETH) 來使用以太坊應用程式", + "nav-get-started-description": "使用以太坊的前幾個步驟", + "nav-governance-description": "本流程會牽涉以太坊協定的升級", + "nav-governance-label": "治理", + "nav-grants-description": "我們的社群所提供的精選清單,其中列出提供撥款募資計畫的專案", + "nav-guide-create-account-description": "任何人都可以在任何時間,以錢包應用程式免費地建立以太坊帳戶", + "nav-guide-create-account-label": "如何建立一個以太坊帳戶", + "nav-guide-revoke-access-description": "在以太坊生態系統中,安全地與智能合約和應用程式互動", + "nav-guide-revoke-access-label": "如何撤銷智能合約的使用", + "nav-guide-use-wallet-description": "瞭解如何操作錢包所有的基本功能", + "nav-guide-use-wallet-label": "如何使用錢包", + "nav-guides-description": "實用的逐步指南可協助你開始使用", + "nav-guides-label": "使用指南", + "nav-history-description": "所有主要分叉與升級的時間表", + "nav-history-label": "以太坊的技術歷史沿革", + "nav-layer-2-description": "適用以太坊的更便宜且更快速的交易", + "nav-learn-by-coding-description": "協助你用以太坊進行實驗的工具", + "nav-local-env-description": "選擇並設定你的以太坊開發堆棧", + "nav-mainnet-description": "可以將企業區塊鏈應用程式建造於公開的以太坊主網", + "nav-nft-description": "一種用以太坊資產來呈現任何獨特事物的方式", + "nav-open-research-description": "以太坊的主要優勢之一是其活躍的研究社群", + "nav-open-research-label": "開放研究", + "nav-overview-description": "以太坊教育的一切", + "nav-overview-label": "概觀", + "nav-participate-overview-description": "參與方式概覽", "nav-primary": "主要導覽", + "nav-private-description": "私有企業用以太坊開發者資源", + "nav-quizzes-description": "瞭解你對以太坊和加密貨幣的理解有多少", + "nav-quizzes-label": "測試你的知識", + "nav-refi-description": "建立在再生原則上的替代性經濟體系", + "nav-research-description": "用來改進以太坊的流程", + "nav-research-label": "研究與開發", + "nav-roadmap-description": "以太坊實現更高可擴容性、安全性和永續性的路徑", + "nav-roadmap-future-description": "強化以太坊成為一個穩健且去集中式的網路", + "nav-roadmap-future-label": "防過時", + "nav-roadmap-label": "開發藍圖", + "nav-roadmap-scaling-description": "更新網路以進一步降低交易成本並加快速度", + "nav-roadmap-scaling-label": "更便宜的交易", + "nav-roadmap-security-description": "確保以太坊對未來所有類型的攻擊都能隨時靈活應變", + "nav-roadmap-security-label": "提高安全性", + "nav-roadmap-ux-description": "以太坊的使用必須簡化", + "nav-roadmap-ux-label": "更好的使用者體驗", + "nav-run-a-node-description": "掌握完全主權,同時協助網路安全", + "nav-security-description": "瞭解使用加密貨幣的最佳案例", + "nav-smart-contracts-description": "以太坊生態系統的基礎建立區塊", + "nav-stablecoins-description": "穩定幣是專為保持在固定價值的以太坊代幣", + "nav-stake-description": "保護以太坊的同時賺取酬勞", + "nav-stake-label": "質押", + "nav-staking-home-description": "質押的不同選項概覽", + "nav-staking-home-label": "質押首頁", + "nav-staking-pool-description": "與其他人一起質押任意數量的以太幣並獲得酬勞", + "nav-staking-pool-label": "聯合質押", + "nav-staking-saas-description": "第三方節點營運商負責處理你的驗證者用戶端的運作", + "nav-staking-saas-label": "以服務質押", + "nav-staking-solo-description": "執行家用硬體,親自貢獻於以太坊網路的安全和去中心化", + "nav-staking-solo-label": "單獨質押", + "nav-start-building-description": "新手的實用資訊", + "nav-translation-program-description": "將 ethereum.org 網站翻譯成所有語言的協同合作", + "nav-tutorials-description": "社群使用教學的精選清單", + "nav-use-cases-description": "發現使用以太坊的不同想法", + "nav-use-cases-label": "使用案例", + "nav-what-is-ether-description": "以太坊應用程式貨幣", + "nav-what-is-ethereum-description": "瞭解以太坊的特別之處", + "nav-what-is-web3-label": "什麼是 Web3?", + "nav-what-is-web3-description": "支配遊戲規則的集中式壟斷替代方案", + "nav-whitepaper-description": "Vitalik Buterin 於 2014 年撰寫的以太坊白皮書原版", + "nav-zkp-description": "能證明陳述有效、卻又無需揭示陳述本身的方式", "nft-page": "NFT - 非同質化代幣", "nfts": "非同質化代幣", "no": "否", @@ -154,6 +263,8 @@ "page-developers-aria-label": "開發者選單", "page-index-meta-title": "首頁", "page-last-updated": "頁面上次更新", + "participate": "參與方式", + "participate-menu": "參與選單", "pbs": "提交者-建置者分離", "pools": "聯合質押", "privacy-policy": "隱私條款", @@ -164,13 +275,15 @@ "refresh": "請重新整理此頁面。", "return-home": "返回首頁", "roadmap": "以太坊開發藍圖", + "research": "研究", + "research-menu": "研究選單", "resources": "翻譯資源", "regenerative-finance": "ReFi - 再生金融", - "run-a-node": "執行節點", - "rollup-component-website": "網站", + "run-a-node": "運行節點", + "rollup-component-website": "官網", "rollup-component-developer-docs": "開發者文件", "rollup-component-technology-and-risk-summary": "技術和風險概要", - "scaling": "擴張", + "scaling": "縮放", "saas": "質押即服務", "search": "搜尋", "search-ethereum-org": "搜尋 ethereum.org", @@ -211,9 +324,11 @@ "try-using-search": "請嘗試使用搜尋功能來尋找你要的資訊,或", "tutorials": "教學", "up": "上移", + "use": "使用", "use-ethereum": "使用以太坊", "use-ethereum-menu": "使用以太坊選單", - "user-experience": "用戶體驗", + "use-menu": "使用選單", + "user-experience": "使用者體驗", "verkle-trees": "沃克爾樹", "wallets": "錢包", "we-couldnt-find-that-page": "找不到該頁面", diff --git a/src/intl/zh/common.json b/src/intl/zh/common.json index 577074f8ea5..933a8a8c9de 100644 --- a/src/intl/zh/common.json +++ b/src/intl/zh/common.json @@ -11,10 +11,13 @@ "adding-wallets": "添加钱包", "account-abstraction": "帐户抽象", "acknowledgements": "致谢", - "aria-toggle-search-button": "切换搜索按钮", - "aria-toggle-menu-button": "切换菜单按钮", + "aria-toggle-search-button": "切换搜索键", + "aria-toggle-menu-button": "切换菜单键", "beacon-chain": "信标链", "bridges": "区块链桥", + "bug-bounty": "漏洞悬赏", + "build": "构建", + "build-menu": "“构建”菜单", "clear": "明确", "close": "关闭", "community": "社区", @@ -26,25 +29,26 @@ "content-standardization": "内容标准化", "contributing": "参与贡献", "contributors": "贡献者", - "contributors-thanks": "所有对本页有贡献的人- 谢谢!", - "cookie-policy": "Cookie 政策", + "contributors-thanks": "感谢对本页做出贡献的每一个人!", + "cookie-policy": "缓存政策", "copied": "已复制", "copy": "复制", "danksharding": "Danksharding", "dao-page": "DAO - 去中心化自治组织", "dark-mode": "深色模式", "data-provided-by": "数据来源:", - "decentralized-applications-dapps": "去中心化应用程序 (dapps)", + "decentralized-applications-dapps": "Dapps - 去中心化应用", "decentralized-identity": "去中心化身份", "decentralized-social-networks": "去中心化社交网络", "decentralized-science": "DeSci - 去中心化科学", + "description": "导航项说明", "defi-page": "DeFi - 去中心化金融", "design": "设计", "design-principles": "设计原则", "devcon": "Devcon", "developers": "开发者", "developers-home": "开发者主页", - "docs": "相关文档", + "docs": "文档", "docsearch-to-select": "选择", "docsearch-to-navigate": "导航", "docsearch-to-close": "关闭", @@ -65,8 +69,8 @@ "down": "向下", "ecosystem": "生态系统", "edit-page": "编辑页面", - "ef-blog": "以太坊基金会博客", - "eips": "以太坊改进提案", + "ef-blog": "以太坊基金会的博客", + "eips": "以太坊改进提案 (Eip)", "energy-consumption": "以太坊能源消耗", "enterprise": "企业级应用", "enterprise-menu": "企业菜单", @@ -107,7 +111,7 @@ "grants": "资助", "grant-programs": "生态系统资助计划", "guides": "指南", - "guides-hub": "指南中心", + "guides-hub": "操作方法指南", "history-of-ethereum": "以太坊的历史", "home": "首页", "how-ethereum-works": "以太坊如何运作", @@ -125,7 +129,7 @@ "language-support": "语言支持", "languages": "语言", "last-24-hrs": "最近24小时", - "last-edit": "上次编辑", + "last-edit": "上次修改时间", "layer-2": "二层网络", "learn": "学习", "learn-by-coding": "通过编码来学习", @@ -134,7 +138,7 @@ "learn-more": "了解更多", "less": "更少", "light-mode": "明亮模式", - "listing-policy-disclaimer": "本页所列产品并非官方认可,仅供参考。如果你想添加产品或对策略提供反馈,请在GitHub中提出问题。", + "listing-policy-disclaimer": "本页所列产品并非官方认可,仅供参考。如果您想添加产品或对策略提供反馈,请在GitHub中提出问题。", "loading": "加载中...", "loading-error": "加载错误。", "loading-error-refresh": "错误,请刷新。", @@ -143,9 +147,114 @@ "mainnet-ethereum": "主网以太坊", "merge": "合并", "more": "更多", - "nav-developers": "开发者", + "nav-about-description": "以太坊社区的公开、开源项目", + "nav-advanced-description": "了解更高深的主题", + "nav-advanced-label": "高级", + "nav-basics-description": "了解以太坊基础知识", + "nav-basics-label": "基础知识", + "nav-bridges-description": "Web3 已发展成主要由一层网络区块链和二层网络扩容解决方案组成的生态系统", + "nav-builders-home-description": "以太坊构建者手册 — 由构建者编写,为构建者所用", + "nav-builders-home-label": "构建者首页", + "nav-contribute-description": "如需帮助,这里为您提供指南", + "nav-contribute-label": "为 ethereum.org 做贡献", + "nav-dao-description": "成员共同拥有的社区,不存在集中管理机构", + "nav-dapps-description": "借助以太坊,探索丰富多姿的应用程序生态系统", + "nav-defi-description": "传统金融市场的全球化、开放性替代方案", + "nav-desci-description": "当前科学体系的全球化、开放性替代方案", + "nav-desoc-description": "基于区块链的社交互动与内容创作平台", "nav-developers-docs": "开发者文档", + "nav-developers": "开发者", + "nav-did-description": "发布并掌控自己独有的去中心化身份标识", + "nav-docs-description": "帮助你了解以太坊并在其上进行构建的文档", + "nav-docs-design-description": "别具一格的 Web3 设计挑战相关说明、最佳做法及用户研究洞察", + "nav-docs-design-label": "用户体验/用户界面设计基础", + "nav-docs-foundation-description": "以太坊开发核心基础知识", + "nav-docs-foundation-label": "基础主题", + "nav-docs-overview-description": "开发者文档首页", + "nav-docs-stack-description": "了解以太坊堆栈全部细节", + "nav-docs-stack-label": "以太坊堆栈", + "nav-eip-description": "详细规定新功能或新流程的标准", + "nav-eip-label": "以太坊改进提案 (EIP)", + "nav-emerging-description": "学习其他以太坊新用例", + "nav-emerging-label": "新出现的用例", + "nav-enterprise-description": "以太坊的商业应用程序", + "nav-ethereum-org-description": "本网站由社区驱动 — 加入我们,做出贡献", + "nav-ethereum-wallets-description": "与以太坊帐户进行互动的应用程序", + "nav-events-description": "去中心化并且人人都可以自由参与", + "nav-events-irl-description": "每个月,以太坊都举办重大现场活动和线上活动", + "nav-events-label": "社区与活动", + "nav-events-online-description": "成千上万的以太坊爱好者是这些在线社区的缔造者", + "nav-find-wallet-description": "钱包让你得以使用加密货币", + "nav-find-wallet-label": "选择钱包", + "nav-gas-fees-description": "以太币交易费如何计算", + "nav-gas-fees-label": "燃料费", + "nav-get-eth-description": "要使用以太坊应用程序,需要使用以太币 (ETH)", + "nav-get-started-description": "使用以太坊的第一步", + "nav-governance-description": "该流程涉及升级以太坊协议", + "nav-governance-label": "治理", + "nav-grants-description": "社区提供的精选项目清单,这些项目提供了资助计划", + "nav-guide-create-account-description": "任何人都可以使用钱包应用程序,随时免费创建以太坊帐户", + "nav-guide-create-account-label": "如何创建以太坊帐户", + "nav-guide-revoke-access-description": "在以太坊生态系统中,与智能合约及应用程序互动时保障安全", + "nav-guide-revoke-access-label": "如何撤销智能合约的访问权限", + "nav-guide-use-wallet-description": "了解如何执行钱包的所有基础功能", + "nav-guide-use-wallet-label": "如何使用钱包", + "nav-guides-description": "可帮助初学者入门的实用分步指南", + "nav-guides-label": "操作方法指南", + "nav-history-description": "所有重大分叉和更新的时间线", + "nav-history-label": "以太坊技术史", + "nav-layer-2-description": "以太坊上的交易更经济、更快捷", + "nav-learn-by-coding-description": "可帮助用户尝试以太坊的工具", + "nav-local-env-description": "选择并设置以太坊开发栈", + "nav-mainnet-description": "企业级区块链应用程序可以在公共以太坊主网上构建", + "nav-nft-description": "一种用以太坊资产表示任何独特事物的方法", + "nav-open-research-description": "以太坊的一项主要优势就是它有一个活跃的研究社区", + "nav-open-research-label": "开放研究", + "nav-overview-description": "以太坊教育大全", + "nav-overview-label": "概述", + "nav-participate-overview-description": "参与方法概述", "nav-primary": "主导航", + "nav-private-description": "企业级私有以太坊开发者资源", + "nav-quizzes-description": "了解你对以太坊和加密货币的了解程度", + "nav-quizzes-label": "检验掌握的知识", + "nav-refi-description": "一种基于再生原理的替代经济体系", + "nav-research-description": "以太坊改进流程", + "nav-research-label": "研究与开发", + "nav-roadmap-description": "提高以太坊可扩展性、安全性和可持续性的途径", + "nav-roadmap-future-description": "强化以太坊,使之成为一个稳固、去中心化的网络", + "nav-roadmap-future-label": "面向未来", + "nav-roadmap-label": "路线图", + "nav-roadmap-scaling-description": "网络更新,可进一步降低交易费并提升交易速度", + "nav-roadmap-scaling-label": "交易费用更低", + "nav-roadmap-security-description": "确保以太坊具备复原能力,能够抵御未来的各类攻击", + "nav-roadmap-security-label": "安全性增强", + "nav-roadmap-ux-description": "以太坊的用法需要简化", + "nav-roadmap-ux-label": "改善用户体验", + "nav-run-a-node-description": "实现完全自主权,同时帮助保护网络安全", + "nav-security-description": "了解加密货币使用方面的最佳做法", + "nav-smart-contracts-description": "以太坊生态系统之基石", + "nav-stablecoins-description": "稳定币是价值固定不变的以太坊代币", + "nav-stake-description": "保护以太坊安全同时赚取奖励", + "nav-stake-label": "质押", + "nav-staking-home-description": "各种质押方案概述", + "nav-staking-home-label": "质押首页", + "nav-staking-pool-description": "通过联合其他人质押任意数量的以太币并获得奖励", + "nav-staking-pool-label": "联合质押", + "nav-staking-saas-description": "第三方节点运营商负责你的验证者客户端的操作", + "nav-staking-saas-label": "通过服务质押", + "nav-staking-solo-description": "运行家用硬件并自行加入以太坊网络的安全和去中心化", + "nav-staking-solo-label": "单独质押", + "nav-start-building-description": "新手实用信息", + "nav-translation-program-description": "一项将以太坊翻译成所有语言的协作计划", + "nav-tutorials-description": "社区教程精选清单", + "nav-use-cases-description": "发现和以太坊使用方法相关的各种理念", + "nav-use-cases-label": "用例", + "nav-what-is-ether-description": "以太坊应用程序中的货币", + "nav-what-is-ethereum-description": "理解以太坊的独特之处", + "nav-what-is-web3-label": "什么是 Web3?", + "nav-what-is-web3-description": "一种制定规则的集中垄断机构的替代机制", + "nav-whitepaper-description": "最初的以太坊白皮书由 Vitalik Buterin 在 2014 年撰写", + "nav-zkp-description": "在不披露声明本身的情况下,证明声明有效性的一种方法", "nft-page": "NFT - 非同质化代币", "nfts": "非同质化代币", "no": "否", @@ -154,16 +263,20 @@ "page-developers-aria-label": "开发者菜单", "page-index-meta-title": "首页", "page-last-updated": "页面最后更新", + "participate": "参与", + "participate-menu": "“参与”菜单", "pbs": "提议者-构建者分离", "pools": "联合质押", "privacy-policy": "隐私政策", - "private-ethereum": "私人以太坊", + "private-ethereum": "私密以太坊", "product-disclaimer": "列举产品和服务是为了方便以太坊社区。但列举任何产品或服务并不表示 ethereum.org 网站团队或以太坊基金会认可它们。", "quizzes-title": "测试中心", "quizzes": "测试", "refresh": "请刷新页面。", "return-home": "返回首页", "roadmap": "以太坊路线图", + "research": "研究", + "research-menu": "“研究”菜单", "resources": "翻译资源", "regenerative-finance": "再生金融(ReFi)", "run-a-node": "运行节点", @@ -211,8 +324,10 @@ "try-using-search": "请尝试使用搜索来查找相关内容,或者", "tutorials": "教程", "up": "向上", + "use": "用法", "use-ethereum": "使用以太坊", "use-ethereum-menu": "使用以太坊菜单", + "use-menu": "“用法”菜单", "user-experience": "用户体验", "verkle-trees": "沃克尔树", "wallets": "钱包", From ed5278d4e9671bc0b4fa4b88984872a21e0af9b8 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 12:33:11 -0800 Subject: [PATCH 366/478] chore: remove redundant / unused --- public/upgrades/upgrade_doge.png | Bin 511385 -> 0 bytes src/pages/community.tsx | 1 - src/pages/developers/index.tsx | 1 - 3 files changed, 2 deletions(-) delete mode 100644 public/upgrades/upgrade_doge.png diff --git a/public/upgrades/upgrade_doge.png b/public/upgrades/upgrade_doge.png deleted file mode 100644 index 7a488669ed9741149ee208065d2e645afe4e8348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511385 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%0A8EDq>X!4IL)L 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¥z0z3{u-vN8S`B*+q`o6nKw%!6auL^Acz73 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 z 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 z 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 { diff --git a/src/pages/developers/index.tsx b/src/pages/developers/index.tsx index e11eb6d92a9..d2f51051382 100644 --- a/src/pages/developers/index.tsx +++ b/src/pages/developers/index.tsx @@ -217,7 +217,6 @@ const DevelopersPage = () => { Date: Tue, 20 Feb 2024 21:10:50 +0000 Subject: [PATCH 367/478] chore(deps): bump ip from 2.0.0 to 2.0.1 Bumps [ip](https://github.com/indutny/node-ip) from 2.0.0 to 2.0.1. - [Commits](https://github.com/indutny/node-ip/compare/v2.0.0...v2.0.1) --- updated-dependencies: - dependency-name: ip dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 52a73c7a1e2..089da28037c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8721,9 +8721,9 @@ ioredis@^5.3.2: standard-as-callback "^2.1.0" ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105" + integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ== ipaddr.js@1.9.1: version "1.9.1" From 521d09d86bad6e208dde7880f7d02b59d3e69c75 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 14:29:06 -0700 Subject: [PATCH 368/478] Azerbaijani Feb 20 (Essentials) --- src/intl/az/page-gas.json | 64 +++++++++++++++++++++++ src/intl/az/page-wallets-find-wallet.json | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/intl/az/page-gas.json diff --git a/src/intl/az/page-gas.json b/src/intl/az/page-gas.json new file mode 100644 index 00000000000..c2a01a34432 --- /dev/null +++ b/src/intl/az/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Ethereum-da qaz haqları: necə işləyirlər?", + "page-gas-meta-description": "Ethereum-da qaz haqqında məlumat əldə edin: necə işləyirlər və qaz haqlarında necə daha az ödəmək olar", + "page-gas-hero-title": "Qaz haqları", + "page-gas-hero-header": "Şəbəkə haqları", + "page-gas-hero-button-1-content": "Qaz nədir?", + "page-gas-hero-subtitle-1": "Ethereum-da şəbəkə haqları qaz adlanır.", + "page-gas-hero-subtitle-2": "Qaz Ethereum-a güc verən yanacaqdır.", + "page-gas-summary-title": "İcmal", + "page-gas-summary-item-1": "Ethereum-da hər bir əməliyyatın işlənməsi üçün kiçik bir ödəniş forması tələb olunur", + "page-gas-summary-item-2": "Bu ödənişlər “qaz” haqqı kimi tanınır", + "page-gas-summary-item-3": "Qaz ödənişləri şəbəkə sıxlığından asılı olaraq dəyişir", + "page-gas-what-are-gas-fees-header": "Qaz haqları nədir?", + "page-gas-what-are-gas-fees-text-1": "Ethereum-u insanların mesaj göndərmək və ya proqramları işlətmək kimi işləri yerinə yetirə biləcəyi böyük bir kompüter şəbəkəsi kimi düşünün. Real dünyada olduğu kimi, bu vəzifələri yerinə yetirmək üçün enerji tələb olunur.", + "page-gas-what-are-gas-fees-text-2": "Ethereum-da hər bir hesablama hərəkətinin müəyyən bir \"qaz\" qiyməti var. Qaz haqlarınız əməliyyatınızdakı hərəkətlərin ümumi maliyyətidir. Tranzaksiya göndərdiyiniz və ya ağıllı müqavilə bağladığınız zaman onu emal etmək üçün qaz haqqı ödəyirsiniz.", + "page-gas-how-do-i-pay-less-gas-header": "Daha az qaz necə ödəyə bilərəm?", + "page-gas-how-do-i-pay-less-gas-text": "Ethereum-da daha yüksək ödənişlər bəzən qaçınılmaz olsa da, maliyyəti azaltmaq üçün istifadə edə biləcəyiniz strategiyalar var:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Əməliyyatlarınıza vaxt ayırın", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Pikdən kənarda səyahət etmək daha az izdihamlı və daha sərfəli olduğu kimi, Ethereum da, Şimali Amerika yuxuda olarkən istifadə edildikdə, ümumiyyətlə daha ucuzdur.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Qazın enməsini gözləyin", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Ethereumun nə qədər sıx olduğuna görə qaz qiymətləri hər on iki saniyədə qalxıb enir. Qaz qiymətləri yüksək olduqda, əməliyyat etməzdən əvvəl bir neçə dəqiqə gözləmək, ödədiyiniz məbləğdə əhəmiyyətli bir azalma ola bilər.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Qat 2-dən istifadə edin", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Layer-2 zəncirləri Ethereumun üstündə qurulur, daha aşağı ödənişlər təklif edir və daha çox əməliyyat aparır. Onlar əsas Ethereum şəbəkəsində baş verməsi lazım olmayan əməliyyatlarda ödənişlərə qənaət etmək üçün yaxşı seçimdir.", + "page-gas-try-layer-2": "2-ci qatı sınayın", + "page-gas-what-causes-high-gas-fees-header": "Qaz qiymətlərinin yüksək olması nədən qaynaqlanır?", + "page-gas-what-causes-high-gas-fees-text-1": "Ethereum-da hesablama miqdarı (qaz) müəyyən həddi aşdıqda, qaz haqları artmağa başlayır. Qaz bu həddi nə qədər çox keçərsə, qaz haqları bir o qədər tez artır.", + "page-gas-what-causes-high-gas-fees-text-2": "Daha yüksək ödənişlərə, populyar dapplar və ya NFT-lər, DEX-lərdə vaxtaşırı artan ticarət və ya pik vaxtlarda çox sayda istifadəçi fəaliyyəti səbəb ola bilər.", + "page-gas-what-causes-high-gas-fees-text-3": "Ethereum-da tərtibatçılar yerləşmədən əvvəl ağıllı müqavilələrdən istifadəni optimallaşdırmağa diqqət yetirməlidirlər. Bir çox insan zəif yazılmış ağıllı müqavilədən istifadə edərsə, o, daha çox qaz istehlak olub təsadüfən şəbəkə tıxanmasına səbəb ola bilər.", + "page-gas-want-to-dive-deeper": "Daha ətraflı öyrənmək istəyirsiniz?", + "page-gas-check-out-the-developer-docs": "Tərtibatçı sənədlərini yoxlayın.", + "page-gas-attack-of-the-cryptokitties-header": "Kriptokitilərin hücumu", + "page-gas-attack-of-the-cryptokitties-text": "2017-ci ilin noyabr ayında məşhur Kriptokitilər layihəsi istifadəyə verildi. Onun populyarlığının sürətlə artması şəbəkədə əhəmiyyətli sıxlığa və həddindən artıq yüksək qaz haqlarına səbəb oldu. Kriptokitilərin yaratdığı problemlər Ethereum-un miqyaslandırması üçün həll yolların tapılmasının aktuallığını sürətləndirdi.", + "page-gas-why-do-we-need-gas-header": "Niyə qaza ehtiyacımız var?", + "page-gas-why-do-we-need-gas-text": "Qaz Ethereum-u təhlükəsiz saxlamaq və əməliyyatları emal etmək üçün vacib elementdir. Qaz bir çox cəhətdən kömək edir:", + "page-gas-benefits-1-description": "Qaz, zərərli aktyorların fırıldaqçılıq fəaliyyətləri ilə şəbəkəni sıxışdırmasının qarşısını alaraq Ethereum sybil-ə davamlıdır.", + "page-gas-benefits-2-description": "Hesablama qaza başa gəldiyi üçün, Ethereum-a bahalı əməliyyatlarla ya təsadüfən və ya zərərli şəkildə spam göndərmək maliyyə cəhətdən təsirsiz hala gətirilir.", + "page-gas-benefits-3-description": "İstənilən vaxt həyata keçirilə bilən hesablamaların miqdarına dair sərt məhdudiyyət Ethereum-un həddindən artıq yüklənməsinin qarşısını alır və şəbəkənin həmişə əlçatan olmasını təmin edir.", + "page-gas-how-is-gas-calculated-header": "Qaz necə hesablanır?", + "page-gas-advanced": "Təkmilləşmiş", + "page-gas-how-is-gas-calculated-text-1": "Ödədiyiniz ümumi qaz haqqı bir neçə hissədən ibarətdir:", + "page-gas-how-is-gas-calculated-item-1": "Baza haqq: tranzaksiya üçün ödənilməli olan şəbəkə tərəfindən müəyyən edilmiş haqq", + "page-gas-how-is-gas-calculated-item-2": "Prioritet haqqı: qovşaq operatorları əməliyyatınıza daxil etməyə təşviq etmək üçün əlavə bəxşiş", + "page-gas-how-is-gas-calculated-item-3": "İstifadə olunan qaz vahidləri*: xatırlayırsınız ki, qaz hesablamanı təmsil edir? Ağıllı müqavilə ilə qarşılıqlı əlaqə kimi, daha mürəkkəb hərəkətlər, əməliyyat göndərmək kimi sadə hərəkətlərdən daha çox qaz istifadə edir.", + "page-gas-how-is-gas-calculated-list-item-1": "* Müxtəlif növ əməliyyatların nə qədər qaz istifadə etdiyini görmək üçün Şəkil 1-ə baxın", + "page-gas-how-is-gas-calculated-text-2": "Qaz haqqını hesablama düsturu, istifadə olunan qaz vahidləridir * (əsas haqq+ prioritet haqqı). Əksər pulqabları qaz istifadəsini hesablayacaq və onu daha sadə şəkildə göstərəcək.", + "page-gas-table-figure": "Şəkil 1: Əməliyyat növünə görə istifadə edilən qaz", + "page-gas-table-header-1": "Əməliyyat növü", + "page-gas-table-header-2": "İstifadə olunan qaz vahidləri", + "page-gas-table-item-1-transaction-type": "ETH göndərmək", + "page-gas-table-item-2-transaction-type": "ERC-20 tokenlərini göndərmək", + "page-gas-table-item-3-transaction-type": "Köçürmək və NFT", + "page-gas-table-item-4-transaction-type": "Uniswap-da dəyişdirmə", + "page-gas-faq-header": "Tez-tez soruşulan suallar", + "page-gas-faq-question-1-q": "Mənim əməliyyatımda qaz haqqını kim ödəyir?", + "page-gas-faq-question-1-a-1": "Əksəriyyət qaz haqqıdır - baza haqqı - protokolla məhv edilir (yandırılır). Əməliyyatınıza daxil edilərsə, prioritet haqqı əməliyyatınızı təklif edən validatora veriləcək.", + "page-gas-faq-question-1-a-2": "Prosesin ətraflı təsvirini qaz tərtibatçısı sənədlərində oxuya bilərsiniz", + "page-gas-faq-question-2-q": "Mən ETH-də qaz ödəməliyəmmi?", + "page-gas-faq-question-2-a-1": "Bəli. Ethereum-da bütün qaz haqları yerli ETH valyutasında ödənilməlidir.", + "page-gas-faq-question-2-a-2": "ETH haqqında daha çox", + "page-gas-faq-question-3-q": "Gwei nədir?", + "page-gas-faq-question-3-a-1": "Əksər pul kisələrində və ya qaz izləyicilərində siz qaz qiymətlərinin 'gwei' olaraq ifadə edildiyini görəcəksiniz.", + "page-gas-faq-question-3-a-2": "Gwei, pennilər dollara nisbətdə olduğu kimi, ETH-nin daha kiçik bir vahididir, fərq 1 ETH-nin 1 milyard gwei-yə bərabər olmasıdır. Gwei ETH-nin çox az miqdarında faydalıdır.", + "page-gas-use-layer-2": "Qat 2-dən istifadə edin" +} diff --git a/src/intl/az/page-wallets-find-wallet.json b/src/intl/az/page-wallets-find-wallet.json index 182e427fb8e..0c5f04e3392 100644 --- a/src/intl/az/page-wallets-find-wallet.json +++ b/src/intl/az/page-wallets-find-wallet.json @@ -49,7 +49,7 @@ "page-find-wallet-token-support": "Token dəstəyi", "page-find-wallet-features": "Xüsusiyyətləri", "page-find-wallet-security": "Təhlükəsizlik", - "page-find-wallet-smart-contract": "Ağıllı müqavilələr", + "page-find-wallet-smart-contract": "Ağıllı müqavilə", "page-find-wallet-check-out": "Yoxlayın", "page-find-wallet-info-updated-on": "məlumat yeniləndi", "page-find-wallet-showing-all-wallets": "Bütün pulqabılar göstərilir", From de73093155f626ab614b4a506b3a422bec003e3c Mon Sep 17 00:00:00 2001 From: Daniel Zarifpour Date: Tue, 20 Feb 2024 16:31:49 -0500 Subject: [PATCH 369/478] Update page-staking.json --- src/intl/en/page-staking.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/page-staking.json b/src/intl/en/page-staking.json index 950e31d96bd..e0dfdb68c34 100644 --- a/src/intl/en/page-staking.json +++ b/src/intl/en/page-staking.json @@ -187,7 +187,7 @@ "page-staking-section-comparison-requirements-title": "Requirements", "page-staking-section-comparison-solo-requirements-li1": "You must deposit 32 ETH", "page-staking-section-comparison-solo-requirements-li2": "Maintain hardware that runs both an Ethereum execution client and consensus client while connected to the internet", - "page-staking-section-comparison-solo-requirements-li3": "The Staking Launchpad will walk you through the process and hardware requirements", + "page-staking-section-comparison-solo-requirements-li3": "The Staking Launchpad will walk you through the process and hardware requirements", "page-staking-section-comparison-saas-requirements-li1": "Deposit 32 ETH and generate your keys with assistance", "page-staking-section-comparison-saas-requirements-li2": "Store your keys securely", "page-staking-section-comparison-saas-requirements-li3": "The rest is taken care of, though specific services will vary", From 0486d7bf6c3c3fe386621095e2e0b605c2f4e25e Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 15:05:42 -0700 Subject: [PATCH 370/478] Chinese import Feb 20 (Homepage, Essentials, Use cases, Docs - tech stack pages, Smart contracts - basics, Smart contracts - advanced, Research documentation) --- .../zh/decentralized-identity/index.md | 6 +- public/content/translations/zh/defi/index.md | 16 +- public/content/translations/zh/desci/index.md | 28 +- .../zh/developers/docs/apis/backend/index.md | 14 +- .../developers/docs/apis/javascript/index.md | 8 +- .../zh/developers/docs/apis/json-rpc/index.md | 880 +++--------------- .../block-explorers/index.md | 22 +- .../docs/data-and-analytics/index.md | 8 +- .../data-structures-and-encoding/index.md | 2 +- .../patricia-merkle-trie/index.md | 24 +- .../data-structures-and-encoding/rlp/index.md | 28 +- .../data-structures-and-encoding/ssz/index.md | 2 +- .../web3-secret-storage-definition/index.md | 14 +- .../docs/development-networks/index.md | 20 +- .../developers/docs/ethereum-stack/index.md | 20 +- .../zh/developers/docs/frameworks/index.md | 62 +- .../zh/developers/docs/ides/index.md | 6 +- .../developers/docs/networking-layer/index.md | 4 +- .../networking-layer/portal-network/index.md | 82 ++ .../docs/programming-languages/dart/index.md | 10 +- .../programming-languages/delphi/index.md | 4 +- .../programming-languages/dot-net/index.md | 6 +- .../programming-languages/golang/index.md | 10 +- .../docs/programming-languages/index.md | 12 +- .../docs/programming-languages/java/index.md | 4 +- .../programming-languages/javascript/index.md | 14 +- .../programming-languages/python/index.md | 8 +- .../docs/programming-languages/ruby/index.md | 4 +- .../docs/programming-languages/rust/index.md | 8 +- .../docs/smart-contracts/anatomy/index.md | 26 +- .../docs/smart-contracts/compiling/index.md | 12 +- .../smart-contracts/composability/index.md | 6 +- .../docs/smart-contracts/deploying/index.md | 28 +- .../formal-verification/index.md | 30 +- .../developers/docs/smart-contracts/index.md | 14 +- .../docs/smart-contracts/languages/index.md | 30 +- .../docs/smart-contracts/libraries/index.md | 30 +- .../docs/smart-contracts/security/index.md | 30 +- .../docs/smart-contracts/testing/index.md | 87 +- .../docs/smart-contracts/upgrading/index.md | 50 +- .../docs/smart-contracts/verifying/index.md | 36 +- .../zh/developers/docs/storage/index.md | 4 +- public/content/translations/zh/refi/index.md | 2 +- src/intl/zh/common.json | 2 +- src/intl/zh/page-gas.json | 64 ++ src/intl/zh/page-what-is-ethereum.json | 2 +- 46 files changed, 648 insertions(+), 1131 deletions(-) create mode 100644 public/content/translations/zh/developers/docs/networking-layer/portal-network/index.md create mode 100644 src/intl/zh/page-gas.json diff --git a/public/content/translations/zh/decentralized-identity/index.md b/public/content/translations/zh/decentralized-identity/index.md index 8a298022bd2..b84fa04b833 100644 --- a/public/content/translations/zh/decentralized-identity/index.md +++ b/public/content/translations/zh/decentralized-identity/index.md @@ -15,11 +15,11 @@ summaryPoint3: 多亏了加密技术,用户现在拥有了再次发布、持 然而,传统的身份管理系统长期以来一直依赖于中心化媒介,它负责发布、持有和控制你的身份标识和[身份证明](#what-are-attestations)。 这意味着你无法掌控你的身份相关信息,也无法决定谁能够访问你的可识别个人信息 (PII),以及这些人有多大的访问权限。 -为了解决这些问题,我们在以太坊等公链上构建了去中心化身份系统。 去中心化身份允许每个人管理他们的身份相关信息。 借助去中心化身份解决方案,*你*可以创建身份标识,以及声明和持有身份证明,无需依赖于中心化机构,如服务提供方或政府。 +为了解决这些问题,我们在以太坊等公链上构建了去中心化身份系统。 去中心化身份允许每个人管理他们的身份相关信息。 借助去中心化身份解决方案,_你_可以创建身份标识,以及声明和持有身份证明,无需依赖于中心化机构,如服务提供方或政府。 ## 什么是身份? {#what-is-identity} -身份是指由一些独特特征定义的一个人的自我意识。 身份表示一个*个体*,即一个独立的人类实体。 身份也可以指其他非人实体,比如组织或行政机构。 +身份是指由一些独特特征定义的一个人的自我意识。 身份表示一个_个体_,即一个独立的人类实体。 身份也可以指其他非人实体,比如组织或行政机构。 ## 什么是身份标识? {#what-are-identifiers} @@ -37,7 +37,7 @@ summaryPoint3: 多亏了加密技术,用户现在拥有了再次发布、持 身份证明是一个实体对另一个实体提出的所有权声明。 如果你在美国生活,你的驾驶执照会由美国车辆管理局(一个实体)颁发,它证明你(另一个实体)依法可驾驶汽车。 -身份证明与身份标识不同。 身份证明*包含*用于指向特定身份的身份标识,并声明与此身份相关的属性。 因此,你的驾驶执照具有身份标识(姓名、出生日期、地址),但也是你具有合法驾驶权利的证明。 +身份证明与身份标识不同。 身份证明_包含_用于指向特定身份的身份标识,并声明与此身份相关的属性。 因此,你的驾驶执照具有身份标识(姓名、出生日期、地址),但也是你具有合法驾驶权利的证明。 ### 什么是去中心化身份标识? {#what-are-decentralized-identifiers} diff --git a/public/content/translations/zh/defi/index.md b/public/content/translations/zh/defi/index.md index 15cfb7db62b..e1d716235d8 100644 --- a/public/content/translations/zh/defi/index.md +++ b/public/content/translations/zh/defi/index.md @@ -37,14 +37,14 @@ summaryPoint3: 基于开源技术,任何人都可以来编程。 ### 对比 {#defi-comparison} -| 去中心化金融 | 传统金融 | -| --------------------------------------------------------------- | ------------------------------------------------------------------------ | -| 你持有你的钱。 | 资金由机构持有。 | -| 你可以控制自己的资金流向和使用方式。 | 你必须相信机构不会出现资金管理不善问题,比如不会将钱借给高风险借款人。 | -| 资金转移在几分钟内完成。 | 如果人工处理,支付可能需要几天时间。 | -| 匿名交易。 | 金融活动与你的身份紧密相连。 | -| 去中心化金融对任何人开放。 | 你必须申请使用金融服务。 | -| 交易时间 24 小时不间断。 | 根据人工作息时间制定交易时间。 | +| 去中心化金融 | 传统金融 | +| --------------------------------- | ------------------------------------ | +| 你持有你的钱。 | 资金由机构持有。 | +| 你可以控制自己的资金流向和使用方式。 | 你必须相信机构不会出现资金管理不善问题,比如不会将钱借给高风险借款人。 | +| 资金转移在几分钟内完成。 | 如果人工处理,支付可能需要几天时间。 | +| 匿名交易。 | 金融活动与你的身份紧密相连。 | +| 去中心化金融对任何人开放。 | 你必须申请使用金融服务。 | +| 交易时间 24 小时不间断。 | 根据人工作息时间制定交易时间。 | | 建立在透明基础上 - 任何人都可以查看产品数据并检查系统运行状况。 | 金融机构是闭门造车:你不能要求查看他们的贷款历史,管理资产的记录,等等。 | diff --git a/public/content/translations/zh/desci/index.md b/public/content/translations/zh/desci/index.md index b78e2b25f70..87de5194961 100644 --- a/public/content/translations/zh/desci/index.md +++ b/public/content/translations/zh/desci/index.md @@ -18,7 +18,7 @@ summaryPoint3: 它以开放科学运动为基础。 去中心化科学旨在创建一个生态系统,激励科学家公开分享他们的研究,并因其工作获得荣誉,同时允许任何人轻松了解研究并为研究做出贡献。 去中心化科学的理念是,每个人都应能接触科学知识,同时科学研究的过程应该透明化。 去中心化科学正在创建一个更加去中心化和分布式的科学研究模式,让它能够更加抵制中心机构的审查和控制。 去中心化科学希望通过去中心化获取资金、科学工具和交流的通道,创造一个让新的和非传统的想法能蓬勃发展的环境。 -去中心化科学允许更多样化的资金来源(从[去中心化自治组织](/dao/)、[二次捐赠](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)到众筹等等),让数据和方法更加容易获得,并为可重复性提供激励。 +去中心化科学允许更加多样化的资助来源(从[去中心化自治组织](/dao/)、[二次捐赠](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)到众筹等等),让数据和方法更加容易获得,并为可复现性提供激励。 ### Juan Benet - 去中心化科学运动 @@ -28,16 +28,16 @@ summaryPoint3: 它以开放科学运动为基础。 一份关于科学关键问题的不完整清单以及去中心化科学如何帮助解决这些问题 -| **去中心化科学** | **传统科学** | -| ------------------------------------------------------------------------ | ------------------------------------------------------------------ | -| 资金的分配由公众决定,使用类似于二次捐赠或去中心化自治组织等机制。 | 小型、封闭、中心化的群体控制着资金的分配。 | -| 你可以与来自全球各地的同行在活力满满的团队里合作。 | 资金组织和你所在的机构限制你的合作。 | -| 在线的、透明的资助决定。 探索新的资助机制。 | 资助决定需要很长时间才能决策,透明度也有限。 资助机制很少。 | -| 利用 Web3 基元,让共享实验室服务变得更加轻松和透明。 | 共享实验室资源往往是缓慢和不透明的。 | -| 可以开发新的发表模型,使用 Web3 基元实现信任、透明和全民访问。 | 通过已有的途径发表,这些途径往往被认为是低效的、有偏见的和剥削的。 | -| 你可以通过同行审核工作获得代币和声誉。 | 你的同行评审是无报酬的,让营利出版商获利。 | -| 你拥有你产生的知识产权 (IP),并根据透明的条款进行分发。 | 你所在的机构拥有你产生的知识产权。 知识产权的获取不是透明的。 | -| 通过将所有步骤都放在链上,分享所有的研究,包括未成功的尝试所产生的数据。 | 发表偏见意味着研究者更有可能只分享那些有成功结果的实验。 | +| **去中心化科学** | **传统科学** | +| ------------------------------------ | --------------------------------- | +| 资金的分配由公众决定,使用类似于二次捐赠或去中心化自治组织等机制。 | 小型、封闭、中心化的群体控制着资金的分配。 | +| 你可以与来自全球各地的同行在活力满满的团队里合作。 | 资金组织和你所在的机构限制你的合作。 | +| 在线的、透明的资助决定。 探索新的资助机制。 | 资助决定需要很长时间才能决策,透明度也有限。 资助机制很少。 | +| 利用 Web3 基元,让共享实验室服务变得更加轻松和透明。 | 共享实验室资源往往是缓慢和不透明的。 | +| 可以开发新的发表模型,使用 Web3 基元实现信任、透明和全民访问。 | 通过已有的途径发表,这些途径往往被认为是低效的、有偏见的和剥削的。 | +| 你可以通过同行审核工作获得代币和声誉。 | 你的同行评审是无报酬的,让营利出版商获利。 | +| 你拥有你产生的知识产权 (IP),并根据透明的条款进行分发。 | 你所在的机构拥有你产生的知识产权。 知识产权的获取不是透明的。 | +| 通过将所有步骤都放在链上,分享所有的研究,包括未成功的尝试所产生的数据。 | 发表偏见意味着研究者更有可能只分享那些有成功结果的实验。 | ## 以太坊与去中心化科学 {#ethereum-and-desci} @@ -76,7 +76,7 @@ summaryPoint3: 它以开放科学运动为基础。 就像非同质化代币可以将未来交易的受益转回给原创作者一样,你可以建立透明的价值归属链,以此奖励研究人员、管理机构(比如去中心化自治组织),甚至是数据收集对象。 -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 就像一把钥匙,可以打开进行中的研究实验的去中心化数据存储库,还可以插入了同质化代币和[去中心化金融](/defi/)这些金融领域(从分片化到借贷池和价值评估)。 它也允许一些原生链上实体直接在链上进行研究,比如[VitaDAO](https://www.vitadao.com/) 等去中心化自治组织。 不可转移的[“灵魂绑定”代币](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)的出现,也能在去中心化科学中发挥重要作用,它允许个人证明与以太坊地址关联的经验和凭证。 +[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 就像一把钥匙,可以打开进行中的研究实验的去中心化数据存储库,还可以插入了同质化代币和[去中心化金融](/defi/)这些金融领域(从分片化到借贷池和价值评估)。 它也允许一些原生链上实体直接在链上进行研究,比如[VitaDAO](https://www.vitadao.com/) 等去中心化自治组织。 不可转移的[“灵魂绑定”代币](https://vitalik.ca/general/2022/01/26/soulbound.html)的出现,也能在去中心化科学中发挥重要作用,它允许个人证明与以太坊地址关联的经验和凭证。 ### 数据存储、访问和架构 {#data-storage} @@ -84,7 +84,7 @@ summaryPoint3: 它以开放科学运动为基础。 起点必须是这样的一个系统:它可以被任何持有正确的可核验凭证的去中心化身份访问。 这确保敏感数据只能被信任方安全复制,从而让数据得到冗余、抵抗审查、复现结果,甚至提供多方合作和向数据集添加新数据的能力。 类似于[计算机到数据](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol)的机密计算方法,提供了另外一种原始数据复制的访问机制,给大多数敏感数据创造了一个可信的研究环境。 可信的研究环境已经[被英国国民医疗服务系统所引用](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb)。作为一种面向未来的数据隐私与合作的解决方案,这种环境通过创造良好的生态系统,使用标准化的环境来共享代码和实践,让研究者安全地使用数据。 -灵活的 Web3 数据解决方案支持上述场景,也为真正开放的科学奠定基础。研究者在 Web3 中可以创造公共利益,无需访问权限和费用。 Web3 的公共数据解决方案,比如星际文件系统、Arweave 和菲乐币,也专门为去中心化做了优化。 例如 dClimate,让所有人获取气候和天气数据,包括来自气象站和气候预测模型的数据。 +灵活的 Web3 数据解决方案支持上述场景,也为真正开放的科学奠定基础。研究者在 Web3 中可以创造公共利益,无需访问权限和费用。 Web3 的公共数据解决方案,比如星际文件系统、Arweave和菲乐币,也专门为去中心化做了优化。 例如 dClimate,让所有人获取气候和天气数据,包括来自气象站和气候预测模型的数据。 ## 参与其中 {#get-involved} @@ -103,7 +103,7 @@ summaryPoint3: 它以开放科学运动为基础。 - [OceanDAO:由去中心化自治组织管理的数据相关科学的拨款](https://oceanprotocol.com/dao) - [Opscientia:开放的去中心化科学工作流程](https://opsci.io/research/) - [LabDAO: 仿真折叠蛋白质](https://alphafodl.vercel.app/) -- [Bio.xyz:为给你的生物技术去中心化自治组织或去中心化科学项目筹资](https://www.molecule.to/) +- [Bio.xyz:为给你的生物技术去中心化自治组织或去中心化科学项目筹资](https://www.bio.xyz/) - [ResearchHub: 发表科学成果并与同行对话](https://www.researchhub.com/) - [VitaDAO: 从赞助研究协议获取资金用于长寿研究](https://www.vitadao.com/) - [Fleming Protocol: 助长生物医学合作发现的开源数据经济](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/zh/developers/docs/apis/backend/index.md b/public/content/translations/zh/developers/docs/apis/backend/index.md index 2bf15a0818b..0841542959b 100644 --- a/public/content/translations/zh/developers/docs/apis/backend/index.md +++ b/public/content/translations/zh/developers/docs/apis/backend/index.md @@ -1,6 +1,6 @@ --- title: 后端应用程序接口库 -description: 以太坊客户端应用程序接口的介绍,使您能够从您的应用程序中与区块链进行交互。 +description: 以太坊客户端应用程序接口的介绍,使你能够从你的应用程序中与区块链进行交互。 lang: zh --- @@ -8,15 +8,15 @@ lang: zh 为此,每种以太坊客户端都实现了 [JSON-RPC](/developers/docs/apis/json-rpc/) 规范,因而应用程序可以依赖一组统一的[方法](/developers/docs/apis/json-rpc/#json-rpc-methods)。 -如果您想使用特定的编程语言去连接以太坊的节点,您可自行选择,但是在社区中已有几个方便的库,可以更方便地实现应用程序与以太坊的连接。 通过这些库,开发者可以方便地写下直观的一行函数来初始化(后端的)JSON RPC 请求并用于与以太坊进行交互。 +如果你想使用特定的编程语言去连接以太坊的节点,你可自行选择,但是在社区中已有几个方便的库,可以更方便地实现应用程序与以太坊的连接。 通过这些库,开发者可以方便地写下直观的一行函数来初始化(后端的)JSON RPC 请求并用于与以太坊进行交互。 ## 前置要求 {#prerequisites} -了解[以太坊堆栈](/developers/docs/ethereum-stack/)和[以太坊客户端](/developers/docs/nodes-and-clients/)可能会对您有所帮助。 +了解[以太坊堆栈](/developers/docs/ethereum-stack/)和[以太坊客户端](/developers/docs/nodes-and-clients/)可能会对你有所帮助。 ## 为什么要使用库? {#why-use-a-library} -这些库降低了与一个以太坊节点交互的复杂性。 它们还提供实用的函数(例如:将 ETH 转化为 Gwei),而作为开发者,您可以花费更少的时间来处理以太坊客户端的复杂问题,从而将更多的时间集中于处理您的应用程序的独特功能。 +这些库降低了与一个以太坊节点交互的复杂性。 它们还提供实用的函数(例如:将 ETH 转化为 Gwei),而作为开发者,你可以花费更少的时间来处理以太坊客户端的复杂问题,从而将更多的时间集中于处理你的应用程序的独特功能。 ## 可用的库 {#available-libraries} @@ -149,7 +149,7 @@ lang: zh - [相关文档](https://docs.chainbase.com/) - [Discord](https://discord.gg/Wx6qpqz4AF) -**GetBlock -** **_用于 Web3 开发的区块链服务_** +**GetBlock -** **_ 用于 Web3 开发的区块链即服务_** - [GetBlock.io](https://getblock.io/) - [相关文档](https://getblock.io/docs/) @@ -161,10 +161,10 @@ lang: zh - [GitHub](https://github.com/BlockPILabs) - [Discord](https://discord.com/invite/xTvGVrGVZv) -**Tokenview -** **_通用多加密区块链应用程序接口平台。_** +**Tokenview -** **_ 通用多重加密区块链应用程序接口平台。_** - [services.tokenview.io](https://services.tokenview.io/) -- [相关文档](https://services.tokeniew/docs?type=api) +- [相关文档](https://services.tokenview.io/docs?type=api) - [GitHub](https://github.com/Tokenview) ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/apis/javascript/index.md b/public/content/translations/zh/developers/docs/apis/javascript/index.md index 84ba47e87c6..aa5e8fcf951 100644 --- a/public/content/translations/zh/developers/docs/apis/javascript/index.md +++ b/public/content/translations/zh/developers/docs/apis/javascript/index.md @@ -1,14 +1,14 @@ --- title: JavaScript 应用编程接口库 -description: 以太坊 JavaScript 应用程序接口的介绍,使您能够从您的应用程序中与区块链进行交互。 +description: 以太坊 JavaScript 应用程序接口的介绍,使你能够从你的应用程序中与区块链进行交互。 lang: zh --- -为了使软件应用程序能够与以太坊区块链进行交互(例如:读取区块链数据或发送交易信息到网络),软件必须连接到以太坊节点。 +为了使网页应用程序能够与以太坊区块链进行交互(例如:读取区块链数据或发送交易信息到网络),软件必须连接到以太坊节点。 为此,每种以太坊客户端都实现了 [JSON-RPC](/developers/docs/apis/json-rpc/) 规范,因而应用程序可以依赖一组统一的[方法](/developers/docs/apis/json-rpc/#json-rpc-methods)。 -如果您想要用 JavaScript 连接到一个以太坊节点, 可以使用原生 JavaScript,不过生态系统中存在一些方便的库,使得这个事情变得更加容易。 通过这些库,开发者可以写下直观易懂甚至单行的代码就能初始化与以太坊的互动(背后使用 JSON RPC 请求)。 +如果你想要用 JavaScript 连接到一个以太坊节点, 可以使用原生 JavaScript,不过生态系统中存在一些方便的库,使得这个事情变得更加容易。 通过这些库,开发者可以写下直观易懂甚至单行的代码就能初始化与以太坊的互动(背后使用 JSON RPC 请求)。 请注意,[合并](/roadmap/merge/)后,运行节点需要两种互联的以太坊软件 - 执行客户端和共识客户端。 请确保你的节点同时包含执行客户端和共识客户端。 如果你的节点不在本地计算机上(例如,你的节点在 AWS 实例上运行),请相应地更新教程中的 IP 地址。 有关更多信息,请参阅我们关于[运行节点](/developers/docs/nodes-and-clients/run-a-node/)的页面。 @@ -208,7 +208,7 @@ contract Test { 这意味着你可以: - 发送一笔交易到指定的智能合约上,并执行智能合约上的方法 -- 调用方法去评估对气体的需求量。这个方法的执行是在以太坊虚拟机中执行的。 +- 调用方法去评估对燃料的需求量。这个方法的执行是在以太坊虚拟机中执行的。 - 部署一个合约 - 以及更多... diff --git a/public/content/translations/zh/developers/docs/apis/json-rpc/index.md b/public/content/translations/zh/developers/docs/apis/json-rpc/index.md index fa0ab5716d9..614133ae78b 100644 --- a/public/content/translations/zh/developers/docs/apis/json-rpc/index.md +++ b/public/content/translations/zh/developers/docs/apis/json-rpc/index.md @@ -16,7 +16,7 @@ lang: zh ## 便利性库 {#convenience-libraries} -虽然您可以选择通过 JSON 应用程序接口直接与以太坊客户端交互,但是对于去中心化应用程序开发者来说,常常有更容易的选项。 许多 [JavaScript](/developers/docs/apis/javascript/#available-libraries) 和[后端应用程序接口](/developers/docs/apis/backend/#available-libraries)库已经存在,可以在 JSON-RPC 应用程序接口之上提供封装。 通过这些库,开发者可以方便地写下直观的一行函数来初始化(后端的)JSON RPC 请求并用于与以太坊进行交互。 +虽然你可以选择通过 JSON 应用程序接口直接与以太坊客户端交互,但是对于去中心化应用程序开发者来说,常常有更容易的选项。 许多 [JavaScript](/developers/docs/apis/javascript/#available-libraries) 和[后端应用程序接口](/developers/docs/apis/backend/#available-libraries)库已经存在,可以在 JSON-RPC 应用程序接口之上提供封装。 通过这些库,开发者可以用他们选择的语言写下直观的一行函数来初始化(后端的)JSON RPC 请求并用于与以太坊进行交互。 ## 共识客户端应用程序接口 {#consensus-clients} @@ -155,13 +155,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[], { "id":67, "jsonrpc":"2.0", - "result": "Mist/v0.9.3/darwin/go1.4.1" + "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1" } ``` ### web3_sha3 {#web3_sha3} -返回给定数据的 Keccak-256(*不是*标准化的 SHA3-256)。 +返回给定数据的 Keccak-256(_不是_标准化的 SHA3-256)。 **参数** @@ -304,12 +304,57 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[] **返回值** -`Object|Boolean`,具有同步状态数据的对象,或 `FALSE`(当不同步时): +准确的返回数据因客户端实现而异。 节点未进行同步时,所有客户端返回 `False`,并且所有客户端返回以下字段。 + +`Object|Boolean`,具有同步状态数据的对象,或 `FALSE`(不进行同步时): - `startingBlock`: `QUANTITY` - 导入开始进行的区块(只有当同步进行到其区块头时才会被重置) - `currentBlock`: `QUANTITY` - 当前区块,同 eth_blockNumber - `highestBlock`: `QUANTITY` - 估计的最高区块 +然而,各个客户端还可能提供额外数据。 例如 Geth 返回以下字段: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "currentBlock": "0x3cf522", + "healedBytecodeBytes": "0x0", + "healedBytecodes": "0x0", + "healedTrienodes": "0x0", + "healingBytecode": "0x0", + "healingTrienodes": "0x0", + "highestBlock": "0x3e0e41", + "startingBlock": "0x3cbed5", + "syncedAccountBytes": "0x0", + "syncedAccounts": "0x0", + "syncedBytecodeBytes": "0x0", + "syncedBytecodes": "0x0", + "syncedStorage": "0x0", + "syncedStorageBytes": "0x0" + } +} +``` + +然而 Besu 返回: + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` + +有关更多详细信息,请参阅特定客户端的文档。 + **示例** ```js @@ -335,13 +380,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1} ### eth_coinbase {#eth_coinbase} -返回客户端 coinbase 地址。 +返回客户端的 coinbase 地址。 **参数** 无 -**返回值** +**返回** `DATA`,20 字节 - 当前的 coinbase 地址。 @@ -366,9 +411,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":6 无 -**返回值** +**返回** -`chainId`,表示字符串的十六进制值,代表当前链 ID 的整数。 +`chainId`,十六进制字符串值,代表当前链 ID 的整数。 **示例** @@ -385,15 +430,15 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67 ### eth_mining {#eth_mining} -如果客户端正在积极挖掘新区块,则返回 `true`。 +如果客户端正在积极挖掘新区块,则返回 `true`。 此方法只能在工作量证明网络中返回 `true`,并且在[合并](/roadmap/merge/)后可能无法用于某些客户端。 **参数** 无 -**返回值** +**返回** -`Boolean` - 如果客户端正在挖矿则返回 `true`,否则返回 `false`。 +`Boolean` - 如果客户端正在挖矿,则返回 `true`,否则返回 `false`。 **示例** @@ -410,13 +455,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71} ### eth_hashrate {#eth_hashrate} -返回节点挖矿时使用的每秒哈希数。 +返回节点挖矿时使用的每秒哈希数。 此方法只能在工作量证明网络中返回 `true`,并且在[合并](/roadmap/merge/)后可能无法用于某些客户端。 **参数** 无 -**返回值** +**返回** `QUANTITY` - 每秒哈希数。 @@ -435,13 +480,13 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":7 ### eth_gasPrice {#eth_gasprice} -返回单位燃料的当前价格(以 wei 为单位)。 +返回当前燃料价格的估计值,以 wei 为单位。 例如,Besu 客户端检查最后 100 个区块,并默认返回燃料单价中位数。 **参数** 无 -**返回值** +**返回** `QUANTITY` - 表示当前燃料价格(以 wei 为单位)的整数。 @@ -466,7 +511,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":7 无 -**返回值** +**返回** `Array of DATA`,20 字节 - 客户端拥有的地址。 @@ -550,9 +595,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407 **返回** -`DATA` - 此存储位置的值。 +`DATA` - 此存储位置处的值。 -**示例** 计算正确位置取决于要检索的存储。 考虑通过地址 `0x391694e7e0b0cce554cb130d723a9d27458f9298` 部署在 `0x295a70b2de5e3953354a6a8344e616ed314d7251` 的以下合约。 +**示例** 正确位置的计算取决于要检索的存储。 考虑通过地址 `0x391694e7e0b0cce554cb130d723a9d27458f9298` 部署在 `0x295a70b2de5e3953354a6a8344e616ed314d7251` 的以下合约。 ``` contract Storage { @@ -575,10 +620,10 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ 检索映射的元素要难一些。 映射中的元素位置通过以下方式计算: ```js -keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) +keccack(LeftPad32(key, 0), LeftPad32(map position, 0)) ``` -这意味着要检索 pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] 上的存储,我们需要通过以下方法计算位置: +这意味着要检索 pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"] 处的存储,我们需要通过以下方法计算位置: ```js keccak( @@ -589,7 +634,7 @@ keccak( ) ``` -可以使用 Web3 库自带的 geth 控制台进行计算: +可以使用 Web3 库附带的 geth 控制台进行计算: ```js > var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" @@ -607,7 +652,7 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ ### eth_getTransactionCount {#eth_gettransactioncount} -返回从一个地址*发送*的交易数量。 +返回从一个地址_发送_的交易数量。 **参数** @@ -776,7 +821,7 @@ params: [ **返回** -`DATA` - 来自给定地址的代码。 +`DATA` - 给定地址处的代码。 **示例** @@ -793,9 +838,9 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xa94f53 ### eth_sign {#eth_sign} -Sign 方法计算以太坊特定的签名:`sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`。 +Sign 方法如下计算以太坊特定的签名:`sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`。 -通过在消息中添加前缀,可以将计算出的签名识别为以太坊特定的签名。 这可以防止滥用行为,如恶意去中心化应用程序可以签署任意数据(例如交易)并使用签名冒充受害者。 +通过在消息中添加前缀,计算出的签名就可以识别为以太坊特定签名。 这可以防止滥用行为,如恶意去中心化应用程序可以签署任意数据(例如交易)并使用签名冒充受害者。 注意:签名时使用的地址必须已解锁。 @@ -829,17 +874,18 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d37 1. `Object` - 交易对象 -- `from`:`DATA`,20 字节 - 发送交易的地址。 -- `to`:`DATA`,20 字节 -(创建新合约时可选)将交易定向到的地址。 -- `gas`:`QUANTITY` -(可选,默认值:90000)表示为交易执行提供的燃料的整数。 它将返回未使用的燃料。 -- `gasPrice`: `QUANTITY` -(可选,默认值:待确定)表示用于每个已支付燃料的 gasPrice 的整数,单位为 Wei。 -- `value`: `QUANTITY` -(可选)表示与此交易一起发送的值的整数,单位为 Wei。 -- `data`:`DATA` - 合约的编译代码或调用的方法签名和编码参数的哈希。 -- `nonce`:`QUANTITY` -(可选)表示随机数的整数。 这允许覆盖你自己的使用相同随机数的待处理交易。 +- `type`: +- `from`: `DATA`,20 字节 - 发送交易的地址。 +- `to`: `DATA`,20 字节 -(创建新合约时可选)将交易定向到的地址。 +- `gas`: `QUANTITY` -(可选,默认值:90000)表示为交易执行提供的燃料的整数。 它将返回未使用的燃料。 +- `gasPrice`: `QUANTITY` -(可选,默认值:待确定)表示用于每笔已支付燃料的 gasPrice 的整数,以 Wei 为单位。 +- `value`: `QUANTITY` -(可选)表示与此交易一起发送的值的整数,以 Wei 为单位。 +- `data`: `DATA` - 合约的编译代码或调用的方法签名和编码参数的哈希。 +- `nonce`: `QUANTITY` -(可选)表示随机数的整数。 它允许覆盖你自己的使用相同随机数的待处理交易。 **返回** -`DATA`,已签名的交易对象。 +`DATA`,由指定帐户签名的 RLP 编码的交易对象。 **示例** @@ -856,7 +902,7 @@ curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction"," ### eth_sendTransaction {#eth_sendtransaction} -如果数据字段包含代码,则创建新的消息调用交易或合同创建。 +创建新的消息调用交易或创建合约(如果数据字段包含代码),然后使用 `from` 中指定的帐户签名。 **参数** @@ -867,7 +913,7 @@ curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction"," - `gas`: `QUANTITY` -(可选,默认值:90000)表示为交易执行提供的燃料的整数。 它将返回未使用的燃料。 - `gasPrice`: `QUANTITY` -(可选,默认值:待确定)表示用于每个已支付燃料的 gasPrice 的整数。 - `value`: `QUANTITY` -(可选)表示与此交易一起发送的值的整数。 -- `data`: `DATA` - 合约的编译代码或调用的方法签名和编码参数的哈希。 +- `input`: `DATA` - 合约的编译代码或调用的方法签名和编码参数的哈希。 - `nonce`: `QUANTITY` -(可选)表示随机数的整数。 它允许覆盖你自己的使用相同随机数的待处理交易。 ```js @@ -878,16 +924,17 @@ params: [ gas: "0x76c0", // 30400 gasPrice: "0x9184e72a000", // 10000000000000 value: "0x9184e72a", // 2441406250 - data: "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + input: + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", }, ] ``` -**返回值** +**返回** -`DATA`,32 字节 - 交易哈希,如果交易尚不可用,则为零哈希。 +`DATA`,32 字节 - 交易哈希,或者如果交易尚不可用,则为零哈希。 -当你创建合约时,交易被挖掘后,使用 [eth_getTransactionReceipt](#eth_gettransactionreceipt) 获取合约地址。 +创建合约时,在交易被挖掘后,使用 [eth_getTransactionReceipt](#eth_gettransactionreceipt) 获取合约地址。 **示例** @@ -904,7 +951,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{ ### eth_sendRawTransaction {#eth_sendrawtransaction} -为已签名的交易创建新的消息调用交易或合约创建。 +为已签名的交易创建新的消息调用交易或创建合约。 **参数** @@ -916,7 +963,7 @@ params: [ ] ``` -**返回值** +**返回** `DATA`,32 字节 - 交易哈希,或者如果交易尚不可用,则为零哈希。 @@ -937,7 +984,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" ### eth_call {#eth_call} -立即执行新的消息调用,而不在区块链上创建交易。 +立即执行新的消息调用,但不在区块链上创建交易。 通常用来执行只读智能合约的函数,例如 ERC-20 合约的 `balanceOf` 函数。 **参数** @@ -948,11 +995,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params" - `gas`: `QUANTITY` -(可选)表示为交易执行提供的燃料的整数。 eth_call 消耗零燃料,但某些执行可能需要此参数。 - `gasPrice`: `QUANTITY` -(可选)表示用于每个已支付燃料的 gasPrice 的整数 - `value`: `QUANTITY` -(可选)表示与此交易一起发送的值的整数 -- `data`: `DATA` -(可选)方法签名和编码参数的哈希。 有关详细信息,参见 [Solidity 文档中的以太坊合约应用程序二进制接口](https://docs.soliditylang.org/en/latest/abi-spec.html) +- `input`: `DATA` -(可选)方法签名和编码参数的哈希。 有关详细信息,参见 [Solidity 文档中的以太坊合约应用程序二进制接口](https://docs.soliditylang.org/en/latest/abi-spec.html)。 2. `QUANTITY|TAG` - 整数区块号,或字符串`“latest”`、`“earliest”`或`“pending”`,参见[默认区块参数](/developers/docs/apis/json-rpc/#default-block) -**返回值** +**返回** `DATA` - 已执行合约的返回值。 @@ -971,11 +1018,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}] ### eth_estimateGas {#eth_estimategas} -生成并返回允许交易完成所需燃料数量的估算值。 交易不会添加到区块链中。 请注意,出于各种原因,包括以太坊虚拟机机制和节点性能,估算值可能远远超过交易实际使用的燃料数量。 +生成并返回允许交易完成所需燃料数量的估算值。 交易不会添加到区块链中。 请注意,出于各种原因,包括以太坊虚拟机的机制和节点性能,估算值可能远远超过交易实际使用的燃料数量。 **参数** -参见 [eth_call](#eth_call) 的参数,但所有属性都是可选的。 如果没有指定燃料限制,geth 将使用来自待处理区块的区块燃料限制作为上限。 因此,当所需燃料数量高于待处理区块的燃料限制时,返回的估算值可能不足以执行调用/交易。 +参见 [eth_call](#eth_call) 的参数,但所有属性都是可选的。 如果没有指定燃料限制,geth 将使用待处理区块的区块燃料限制作为上限。 因此,当所需燃料数量高于待处理区块的燃料限制时,返回的估算值可能不足以执行调用/交易。 **返回** @@ -1100,7 +1147,7 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":[ ### eth_getTransactionByHash {#eth_gettransactionbyhash} -返回关于按交易哈希请求的交易的信息。 +根据交易哈希返回关于所请求交易的信息。 **参数** @@ -1125,9 +1172,9 @@ params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] - `to`: `DATA`,20 字节 - 接收者的地址。 如果是合约创建交易,则为 `null`。 - `transactionIndex`: `QUANTITY` - 表示区块中的交易索引位置的整数。 如果是待处理区块,则为 `null`。 - `value`: `QUANTITY` - 传输的值,以 Wei 为单位。 -- `v`: `QUANTITY` - 椭圆曲线数字签名算法恢复 ID -- `r`: `QUANTITY` - 椭圆曲线数字签名算法签名 r -- `s`: `QUANTITY` - 椭圆曲线数字签名算法签名 s +- `v`: `QUANTITY` - 椭圆曲线加密法恢复 ID +- `r`: `QUANTITY` - 椭圆曲线加密法签名 r +- `s`: `QUANTITY` - 椭圆曲线加密法签名 s **示例** @@ -1241,7 +1288,7 @@ params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"] - `logsBloom`: `DATA`,256 字节 - 轻客户端用于快速检索相关日志的布隆过滤器。 - `type`: `QUANTITY` - 表示交易类型的整数,`0x0` 表示传统交易,`0x1` 表示访问列表类型,`0x2` 表示动态费用。 -它还返回*以下两者之一*: +它还返回_以下两者之一_: - `root` : `DATA`,32 字节的交易后状态根(拜占庭升级之前) - `status`: `QUANTITY`,`1`(成功)或 `0`(失败) @@ -1336,159 +1383,23 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndInde 结果参见 [eth_getBlockByHash](#eth_getblockbyhash) -### eth_getCompilers {#eth_getcompilers} - -返回客户端上的可用编译器列表。 - -**参数** 无 - -**返回值** `Array` - 可用编译器的数组。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCompilers","params":[],"id":1}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": ["solidity", "lll", "serpent"] -} -``` - -### eth_compileSolidity {#eth_compile_solidity} - -返回已编译的 Solidity 代码。 - -**参数** - -1. `String` - 源代码。 - -```js -params: [ - "contract test { function multiply(uint a) returns(uint d) { return a * 7; } }", -] -``` - -**返回值** `DATA` - 已编译的源代码。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["contract test { function multiply(uint a) returns(uint d) { return a * 7; } }"],"id":1}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": { - "code": "0x605880600c6000396000f3006000357c010000000000000000000000000000000000000000000000000000000090048063c6888fa114602e57005b603d6004803590602001506047565b8060005260206000f35b60006007820290506053565b91905056", - "info": { - "source": "contract test {\n function multiply(uint a) constant returns(uint d) {\n return a * 7;\n }\n}\n", - "language": "Solidity", - "languageVersion": "0", - "compilerVersion": "0.9.19", - "abiDefinition": [ - { - "constant": true, - "inputs": [ - { - "name": "a", - "type": "uint256" - } - ], - "name": "multiply", - "outputs": [ - { - "name": "d", - "type": "uint256" - } - ], - "type": "function" - } - ], - "userDoc": { - "methods": {} - }, - "developerDoc": { - "methods": {} - } - } -} -``` - -### eth_compileLLL {#eth_compileLLL} - -返回已编译的 LLL 代码。 - -**参数** - -1. `String` - 源代码。 - -```js -params: ["(returnlll (suicide (caller)))"] -``` - -**返回值** `DATA` - 已编译的源代码。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_compileLLL","params":["(returnlll (suicide (caller)))"],"id":1}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": "0x603880600c6000396000f3006001600060e060020a600035048063c6888fa114601857005b6021600435602b565b8060005260206000f35b600081600702905091905056" // the compiled source code -} -``` - -### eth_compileSerpent {#eth_compileserpent} - -返回已编译的 Serpent 代码。 - -**参数** - -1. `String` - 源代码。 - -```js -params: ["/* some serpent */"] -``` - -**返回值** `DATA` - 已编译的源代码。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_compileSerpent","params":["/* some serpent */"],"id":1}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": "0x603880600c6000396000f3006001600060e060020a600035048063c6888fa114601857005b6021600435602b565b8060005260206000f35b600081600702905091905056" // the compiled source code -} -``` - ### eth_newFilter {#eth_newfilter} -基于过滤器选项创建一个过滤器对象,以在状态更改(日志)时发出通知。 要检查状态是否已更改,请调用 [eth_getFilterChanges](#eth_getfilterchanges)。 +基于筛选器选项创建一个筛选器对象,以在状态更改(日志)时发出通知。 要检查状态是否已更改,请调用 [eth_getFilterChanges](#eth_getfilterchanges)。 -**关于指定主题过滤器的说明:** 主题是顺序相关的。 以下主题过滤器将匹配日志中包含主题 [A, B] 的交易: +**关于指定主题筛选器的说明:** 主题是顺序相关的。 以下主题过滤器将匹配日志中包含主题 [A, B] 的交易: - `[]`“任意值” - `[A]`“第一个位置为 A(之后的位置为任意值)” - `[null, B]`“第一个位置为任意值,且第二个位置为 B(之后的位置为任意值)” - `[A, B]`“第一个位置为 A,且第二个位置为 B(之后的位置为任意值)” -- `[[A, B], [A, B]]`“第一个位置为 (A OR B),且第二个位置为 (A OR B)(之后的位置为任意值)” +- `[[A, B], [A, B]]`“第一个位置为(A OR B),且第二个位置为(A OR B)(之后的位置为任意值)” - **参数** -1. `Object` - 过滤器选项: +1. `Object` - 筛选器选项: -- `fromBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块号,`"latest"`(对于最后开采的区块),或`"pending"`、`"earliest"`(对于尚未开采的交易)。 -- `toBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块号,`"latest"`(对于最后开采的区块),或`"pending"`、`"earliest"`(对于尚未开采的交易)。 +- `fromBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块编号,`"latest"`(表示最后开采的区块),或`"pending"`、`"earliest"`(表示尚未开采的交易)。 +- `toBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块编号,`"latest"`(表示最后开采的区块),或`"pending"`、`"earliest"`(表示于尚未开采的交易)。 - `address`: `DATA|Array`,20 字节 -(可选)日志起源的合约地址或地址列表。 - `topics`: `Array of DATA` -(可选)32 字节 `DATA` 主题数组。 主题是顺序相关的。 每个主题也可以是带有“或”选项的 DATA 数组。 @@ -1510,7 +1421,7 @@ params: [ ] ``` -**返回值** `QUANTITY` - 过滤器 ID。 +**返回值** `QUANTITY` - 筛选器 ID。 **示例** @@ -1527,11 +1438,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topic ### eth_newBlockFilter {#eth_newblockfilter} -在节点中创建一个过滤器,以在新区块到达时发出通知。 要检查状态是否已更改,请调用 [eth_getFilterChanges](#eth_getfilterchanges)。 +在节点中创建一个筛选器,以在新区块到达时发出通知。 要检查状态是否已更改,请调用 [eth_getFilterChanges](#eth_getfilterchanges)。 **参数** 无 -**返回值** `QUANTITY` - 过滤器 ID。 +**返回值** `QUANTITY` - 筛选器 ID。 **示例** @@ -1548,11 +1459,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[], ### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter} -在节点中创建一个过滤器,以在新的待处理交易到达时发出通知。 要检查状态是否已更改,请调用 [eth_getFilterChanges](#eth_getfilterchanges)。 +在节点中创建一个筛选器,以在新的待处理交易到达时发出通知。 要检查状态是否已更改,请调用 [eth_getFilterChanges](#eth_getfilterchanges)。 **参数** 无 -**返回值** `QUANTITY` - 过滤器 ID。 +**返回值** `QUANTITY` - 筛选器 ID。 **示例** @@ -1569,11 +1480,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter" ### eth_uninstallFilter {#eth_uninstallfilter} -卸载具有给定 id 的过滤器。 当不再需要监控时应始终调用该方法。 此外,在一段时间内未使用 [eth_getFilterChanges](#eth_getfilterchanges) 请求过滤器时,过滤器便会超时。 +卸载具有给定 ID 的筛选器。 当不再需要监控时应始终调用该方法。 此外,在一段时间内未使用 [eth_getFilterChanges](#eth_getfilterchanges) 请求筛选器时,筛选器便会超时。 **参数** -1. `QUANTITY` - 过滤器 ID。 +1. `QUANTITY` - 筛选器 ID。 ```js params: [ @@ -1581,7 +1492,7 @@ params: [ ] ``` -**返回值** `Boolean` - 如果成功卸载过滤器,则为 `true`,否则为 `false`。 +**返回值** `Boolean` - 如果成功卸载筛选器,则为 `true`,否则为 `false`。 **示例** @@ -1598,11 +1509,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":[" ### eth_getFilterChanges {#eth_getfilterchanges} -过滤器的轮询方法,会返回自上次轮询以来产生的日志数组。 +筛选器轮询方法,返回自上次轮询以来产生的日志的数组。 **参数** -1. `QUANTITY` - 过滤器 ID。 +1. `QUANTITY` - 筛选器 ID。 ```js params: [ @@ -1613,7 +1524,7 @@ params: [ **返回值** `Array` - 日志对象数组,或者如果自上次轮询以来没有任何更改,则为空数组。 - 对于使用 `eth_newBlockFilter` 创建的过滤器,返回值是区块哈希(`DATA`,32 字节),例如 `["0x3454645634534..."]`。 -- 对于使用 `eth_newPendingTransactionFilter` 创建的过滤器,返回值是交易哈希(`DATA`,32 字节),例如 `["0x6345343454645..."]`。 +- 对于使用 `eth_newPendingTransactionFilter` 创建的筛选器,返回值是交易哈希(`DATA`,32 字节),例如 `["0x6345343454645..."]`。 - 对于使用 `eth_newFilter` 创建的过滤器,日志是具有以下参数的对象: - `removed`: `TAG` - 当日志由于链重组被删除时,为 `true`。 如果是有效日志,则为 `false`。 - `logIndex`: `QUANTITY` - 表示区块中的日志索引位置的整数。 如果是待处理日志,则为 `null`。 @@ -1622,8 +1533,8 @@ params: [ - `blockHash`: `DATA`,32 字节 - 此日志所在区块的哈希。 如果是待处理区块,则为 `null`。 如果是待处理日志,则为 `null`。 - `blockNumber`: `QUANTITY` - 此日志所在区块的区块编号。 如果是待处理区块,则为 `null`。 如果是待处理日志,则为 `null`。 - `address`: `DATA`,20 字节 - 此日志的来源地址。 - - `data`: `DATA` - 包含日志的一个或多个 32 字节非索引参数。 - - `topics`: `Array of DATA` - 0 到 4 个 32 字节 `DATA` 类型的索引日志参数的数组。 (在 _Solidity_ 中:第一个主题是事件签名的*哈希*(例如 `Deposit(address,bytes32,uint256)`),除非你使用 `anonymous` 说明符声明了该事件。) + - `data`: `DATA` - 包含日志的零个或多个 32 字节非索引参数。 + - `topics`: `Array of DATA` - 0 到 4 个 32 字节 `DATA` 类型的索引日志参数的数组。 (在 _Solidity_ 中:第一个主题是事件签名的_哈希_(例如 `Deposit(address,bytes32,uint256)`),除非你使用 `anonymous` 说明符声明了该事件。) - **示例** ```js @@ -1650,11 +1561,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":[ ### eth_getFilterLogs {#eth_getfilterlogs} -返回与给定 ID 的过滤器匹配的所有日志的数组。 +返回与具有给定 ID 的筛选器匹配的所有日志的数组。 **参数** -1. `QUANTITY` - 过滤器 ID。 +1. `QUANTITY` - 筛选器 ID。 ```js params: [ @@ -1675,14 +1586,14 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x ### eth_getLogs {#eth_getlogs} -返回与给定过滤器对象匹配的所有日志的数组。 +返回与给定筛选器对象匹配的所有日志的数组。 **参数** -1. `Object` - 过滤器选项: +1. `Object` - 筛选器选项: -- `fromBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块号,`"latest"`(对于最后开采的区块),或`"pending"`、`"earliest"`(对于尚未开采的交易)。 -- `toBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块号,`"latest"`(对于最后开采的区块),或`"pending"`、`"earliest"`(对于尚未开采的交易)。 +- `fromBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块编号,`"latest"`(表示最后开采的区块),或`"pending"`、`"earliest"`(表示尚未开采的交易)。 +- `toBlock`: `QUANTITY|TAG` -(可选,默认值:`"latest"`)整数区块编号,`"latest"`(表示最后开采的区块),或`"pending"`、`"earliest"`(表示于尚未开采的交易)。 - `address`: `DATA|Array`,20 字节 -(可选)日志起源的合约地址或地址列表。 - `topics`: `Array of DATA` -(可选)32 字节 `DATA` 主题数组。 主题是顺序相关的。 每个主题也可以是带有“或”选项的 DATA 数组。 - `blockhash`: `DATA`,32 字节 -(可选,**future**),添加 EIP-234 后,`blockHash` 将是一个新的过滤器选项,它会将返回的日志限制为具有 32 字节哈希 `blockHash` 的单一区块。 使用 `blockHash` 相当于 `fromBlock` = `toBlock` = 具有哈希 `blockHash` 的区块编号。 如果 `blockHash` 出现在筛选条件中,则 `fromBlock` 和 `toBlock` 都不允许。 @@ -1708,540 +1619,11 @@ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics" 结果参见 [eth_getFilterChanges](#eth_getfilterchanges) -### eth_getWork {#eth_getwork} - -返回当前区块的哈希、种子哈希和要满足的边界条件(“目标”)。 - -**参数** 无 - -**返回值** `Array` - 具有以下属性的数组: - -1. `DATA`,32 字符 - 当前区块头 pow-hash -2. `DATA`,32 字节 - 用于有向无环图的种子哈希。 -3. `DATA`,32 字节 - 边界条件(“目标”),2^256 / 难度。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getWork","params":[],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": [ - "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", - "0x5EED00000000000000000000000000005EED0000000000000000000000000000", - "0xd1ff1c01710000000000000000000000d1ff1c01710000000000000000000000" - ] -} -``` - -### eth_submitWork {#eth_submitwork} - -用于提交工作量证明解。 - -**参数** - -1. `DATA`,8 字节 - 找到的随机数(64 位) -2. `DATA`,32 字节 - 区块头的 pow-hash(256 位) -3. `DATA`,32 字节 - 混合摘要(256 位) - -```js -params: [ - "0x0000000000000001", - "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", - "0xD1FE5700000000000000000000000000D1FE5700000000000000000000000000", -] -``` - -**返回值** `Boolean` - 如果提供的解有效,则返回 `true`,否则返回 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitWork", "params":["0x0000000000000001", "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "0xD1GE5700000000000000000000000000D1GE5700000000000000000000000000"],"id":73}' -// Result -{ - "id":73, - "jsonrpc":"2.0", - "result": true -} -``` - -### eth_submitHashrate {#eth_submithashrate} - -用于提交挖矿哈希率。 - -**参数** - -1. `Hashrate`,哈希率的十六进制字符串表示(32 字节) -2. `ID`,字符串 - 一个随机的十六进制(32 字节)ID,用于标识客户端 - -```js -params: [ - "0x0000000000000000000000000000000000000000000000000000000000500000", - "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c", -] -``` - -**返回值** `Boolean` - 如果提交成功则返回 `true`,否则返回 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0", "method":"eth_submitHashrate", "params":["0x0000000000000000000000000000000000000000000000000000000000500000", "0x59daa26581d0acd1fce254fb7e85952f4c09d0915afd33d3886cd914bc7d283c"],"id":73}' -// Result -{ - "id":73, - "jsonrpc":"2.0", - "result": true -} -``` - -### db_putString(已弃用) {#db_putstring} - -在本地数据库中存储一个字符串。 - -**注意**:此函数已弃用。 - -**参数** - -1. `String` - 数据库名称。 -2. `String` - 键名。 -3. `String` - 要存储的字符串。 - -```js -params: ["testDB", "myKey", "myString"] -``` - -**返回值** `Boolean` - 如果值已存储,则返回 `true`,否则返回 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"db_putString","params":["testDB","myKey","myString"],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": true -} -``` - -### db_getString(已弃用) {#db_getstring} - -从本地数据库返回字符串。 **注意**:此函数已弃用。 - -**参数** - -1. `String` - 数据库名称。 -2. `String` - 键名。 - -```js -params: ["testDB", "myKey"] -``` - -**返回值** `String` - 先前存储的字符串。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"db_getString","params":["testDB","myKey"],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": "myString" -} -``` - -### db_putHex(已弃用) {#db_puthex} - -在本地数据库中存储二进制数据。 **注意**:此函数已弃用。 - -**参数** - -1. `String` - 数据库名称。 -2. `String` - 键名。 -3. `DATA` - 要存储的数据。 - -```js -params: ["testDB", "myKey", "0x68656c6c6f20776f726c64"] -``` - -**返回值** `Boolean` - 如果值已存储,则返回 `true`,否则返回 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"db_putHex","params":["testDB","myKey","0x68656c6c6f20776f726c64"],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": true -} -``` - -### db_getHex(已弃用) {#db_gethex} - -从本地数据库返回二进制数据。 **注意**:此函数已弃用。 - -**参数** - -1. `String` - 数据库名称。 -2. `String` - 键名。 - -```js -params: ["testDB", "myKey"] -``` - -**返回值** `DATA` - 先前存储的数据。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"db_getHex","params":["testDB","myKey"],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": "0x68656c6c6f20776f726c64" -} -``` - -### shh_version(已弃用) {#shh_post} - -返回当前的 Whisper 协议版本。 - -**注意**:此函数已弃用。 - -**参数** 无 - -**返回值** `String` - 当前的 Whisper 协议版本 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_version","params":[],"id":67}' -// Result -{ - "id":67, - "jsonrpc": "2.0", - "result": "2" -} -``` - -### shh_post(已弃用) {#shh_version} - -发送 Whisper 消息。 - -**注意**:此函数已弃用。 - -**参数** - -1. `Object` - whisper post 对象: - -- `from`: `DATA`,60 字节 -(可选)发送者的身份。 -- `to`: `DATA`,60 字节 -(可选)接收者的身份。 当存在消息时,Whisper 将加密消息,以便只有接收者可以将其解密。 -- `topics`: `Array of DATA` - `DATA` 主题的数组,供接收者识别消息。 -- `payload`: `DATA` - 消息的有效载荷。 -- `priority`: `QUANTITY` - 表示 ... (?) 范围内的优先级的整数。 -- `ttl`: `QUANTITY` - 表示生存时间的整数,以秒为单位。 - -```js -params: [ - { - from: "0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1", - to: "0x3e245533f97284d442460f2998cd41858798ddf04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a0d4d661997d3940272b717b1", - topics: [ - "0x776869737065722d636861742d636c69656e74", - "0x4d5a695276454c39425154466b61693532", - ], - payload: "0x7b2274797065223a226d6", - priority: "0x64", - ttl: "0x64", - }, -] -``` - -**返回值** `Boolean` - 如果消息已发送,则返回 `true`,否则返回 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_post","params":[{"from":"0xc931d93e97ab07fe42d923478ba2465f2..","topics": ["0x68656c6c6f20776f726c64"],"payload":"0x68656c6c6f20776f726c64","ttl":0x64,"priority":0x64}],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": true -} -``` - -### shh_newIdentity(已弃用){#shh_newidentity} - -在客户端中创建新的 Whisper 身份。 - -**注意**:此函数已弃用。 - -**参数** 无 - -**返回值** `DATA`,60 字节 - 新身份的地址。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_newIdentity","params":[],"id":73}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": "0xc931d93e97ab07fe42d923478ba2465f283f440fd6cabea4dd7a2c807108f651b7135d1d6ca9007d5b68aa497e4619ac10aa3b27726e1863c1fd9b570d99bbaf" -} -``` - -### shh_hasIdentity(已弃用){#shh_hasidentity} - -检查客户端是否持有给定身份的私钥。 - -**注意**:此函数已弃用。 - -**参数** - -1. `DATA`,60 字节 - 要检查的身份地址。 - -```js -params: [ - "0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1", -] -``` - -**返回值** `Boolean` - 如果客户端持有该身份的私钥,则返回 `true`,否则返回 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_hasIdentity","params":["0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1"],"id":73}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": true -} -``` - -### shh_newGroup(已弃用){#shh_newgroup} - -**注意**:此函数已弃用。 - -**参数** 无 - -**返回值** `DATA`,60 字节 - 新组的地址。 (?) - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_newGroup","params":[],"id":73}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": "0xc65f283f440fd6cabea4dd7a2c807108f651b7135d1d6ca90931d93e97ab07fe42d923478ba2407d5b68aa497e4619ac10aa3b27726e1863c1fd9b570d99bbaf" -} -``` - -### shh_addToGroup(已弃用){#shh_addtogroup} - -**注意**:此函数已弃用。 - -**参数** - -1. `DATA`,60 字节 - 将要添加到组 (?) 的身份地址。 - -```js -params: [ - "0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1", -] -``` - -**返回值** `Boolean` - 如果身份已成功添加到组中,则返回 `true`,否则返回 `false` (?)。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_addToGroup","params":["0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1"],"id":73}' -// Result -{ - "id":1, - "jsonrpc": "2.0", - "result": true -} -``` - -### shh_newFilter(已弃用){#shh_newfilter} - -创建过滤器以通知客户端何时收到与过滤器选项匹配的 Whisper 消息。 **注意**:此函数已弃用。 - -**参数** - -1. `Object` - 过滤器选项: - -- `to`: `DATA`,60 字节 -(可选)接收者的身份。 _存在该身份时,如果客户端持有此身份的私钥,它将尝试解密任何传入的消息。_ -- `topics`: `Array of DATA` - `DATA` 主题的数组,传入消息的主题应与其相匹配。 可以使用下列组合: - - `[A, B] = A && B` - - `[A, [B, C]] = A && (B || C)` - - `[null, A, B] = ANYTHING && A && B` `null` 用作通配符 - - - -```js -params: [ - { - topics: ["0x12341234bf4b564f"], - to: "0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1", - }, -] -``` - -**返回值** `QUANTITY` - 新创建的过滤器。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_newFilter","params":[{"topics": ['0x12341234bf4b564f'],"to": "0x2341234bf4b2341234bf4b564f..."}],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": "0x7" // 7 -} -``` - -### shh_uninstallFilter(已弃用){#shh_uninstallfilter} - -卸载具有给定 id 的过滤器。 当不再需要监控时应始终调用该方法。 此外,在一段时间内未使用 [shh_getFilterChanges](#shh_getfilterchanges) 请求过滤器时,过滤器便会超时。 **注意**:此函数已弃用。 - -**参数** - -1. `QUANTITY` - 过滤器 ID。 - -```js -params: [ - "0x7", // 7 -] -``` - -**返回值** `Boolean` - 如果成功卸载过滤器,则为 `true`,否则为 `false`。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_uninstallFilter","params":["0x7"],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": true -} -``` - -### shh_getFilterChanges(已弃用){#shh_getfilterchanges} - -Whisper 过滤器的轮询方法。 返回自上次调用此方法以来的新消息。 **注意**:调用 [shh_getMessages](#shh_getmessages) 方法将重置此方法的缓冲区,这样你就不会收到重复的消息。 **注意**:此函数已弃用。 - -**参数** - -1. `QUANTITY` - 过滤器 ID。 - -```js -params: [ - "0x7", // 7 -] -``` - -**返回值** `Array` - 自上次轮询以来收到的消息数组: - -- `hash`: `DATA`,32 字节(?) - 消息的哈希。 -- `from`: `DATA`,60 字节 - 如果指定了发送者,则为消息的发送者。 -- `to`: `DATA`,60 字节- 如果指定了接收者,则为消息的接收者。 -- `expiry`: `QUANTITY` - 表示此消息应到期的时间(以秒为单位)的整数 (?)。 -- `ttl`: `QUANTITY` - 表示消息应在系统中浮动的时间(以秒为单位)的整数 (?)。 -- `sent`: `QUANTITY` - 表示发送消息时的 unix 时间戳的整数。 -- `topics`: `Array of DATA` - 消息中包含的 `DATA` 主题数组。 -- `payload`: `DATA` - 消息的有效载荷。 -- `workProved`: `QUANTITY` - 表示发送此消息之前所需工作的整数 (?)。 - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_getFilterChanges","params":["0x7"],"id":73}' -// Result -{ - "id":1, - "jsonrpc":"2.0", - "result": [{ - "hash": "0x33eb2da77bf3527e28f8bf493650b1879b08c4f2a362beae4ba2f71bafcd91f9", - "from": "0x3ec052fc33..", - "to": "0x87gdf76g8d7fgdfg...", - "expiry": "0x54caa50a", // 1422566666 - "sent": "0x54ca9ea2", // 1422565026 - "ttl": "0x64", // 100 - "topics": ["0x6578616d"], - "payload": "0x7b2274797065223a226d657373616765222c2263686...", - "workProved": "0x0" - }] -} -``` - -### shh_getMessages(已弃用) {#shh_getmessages} - -获取与过滤器匹配的所有消息。 与 `shh_getFilterChanges` 不同,它返回所有消息。 - -**注意**:此函数已弃用。 - -**参数** - -1. `QUANTITY` - 过滤器 ID。 - -```js -params: [ - "0x7", // 7 -] -``` - -**返回值** 参见 [shh_getFilterChanges](#shh_getfilterchanges) - -**示例** - -```js -// Request -curl -X POST --data '{"jsonrpc":"2.0","method":"shh_getMessages","params":["0x7" -],"id":73}' -``` - -结果参见 [shh_getFilterChanges](#shh_getfilterchanges) - ## 使用示例 {#usage-example} ### 使用 JSON_RPC 部署合约 {#deploying-contract} -本节演示如何仅使用远程过程调用接口部署合约。 部署合约的替代途径可以消除这种复杂性 — 例如,使用在远程过程调用接口之上构建的库,如 [web3.js](https://web3js.readthedocs.io/) 和 [web3.py](https://github.com/ethereum/web3.py)。 这些抽象通常更容易理解且不易出错,但了解幕后发生的操作仍然很有帮助。 +本节演示如何仅使用远程过程调用接口部署合约。 一些其他部署合约的途径可以消除这种复杂性 — 例如,使用在远程过程调用接口之上构建的库,如 [web3.js](https://web3js.readthedocs.io/) 和 [web3.py](https://github.com/ethereum/web3.py)。 这些简化通常更容易理解且不易出错,但了解幕后发生的操作仍然很有帮助。 以下是一个名为 `Multiply7` 的简单智能合约,将使用 JSON-RPC 接口将其部署到以太坊节点。 本教程假设读者已经在运行 Geth 节点。 [此处](/developers/docs/nodes-and-clients/run-a-node)提供了更多关于节点和客户端的信息。 请参阅单独的[客户端](/developers/docs/nodes-and-clients/)文档,了解如何为非 Geth 客户端启动超文本传输协议 JSON-RPC。 大多数客户端默认在 `localhost:8545` 上提供服务。 @@ -2255,7 +1637,7 @@ contract Multiply7 { } ``` -首先确保启用了超文本传输协议远程过程调用接口。 这意味着我们在启动时为 Geth 提供 `--http` 标志。 在此示例中,我们使用私有开发链上的 Geth 节点。 使用这种方法,我们在真实网络上不需要以太币。 +首先确保启用了超文本传输协议远程过程调用接口。 这意味着我们在启动时为 Geth 提供 `--http` 标记。 在此示例中,我们使用私有开发链上的 Geth 节点。 使用这种方法,我们不需要真实网络上的以太币。 ```bash geth --http --dev console 2>>geth.log @@ -2273,14 +1655,14 @@ curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635 {"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"} ``` -因为数字是十六进制编码的,所以余额以十六进制字符串返回(以 wei 为单位)。 如果我们想要获得数字形式的以太币余额,我们可以使用 Geth 控制台中的 Web3。 +因为数字是十六进制编码的,所以余额以十六进制字符串返回(以 wei 为单位)。 如果我们想要获得数字形式的以太币余额,可以使用 Geth 控制台中的 Web3。 ```javascript web3.fromWei("0x1639e49bba16280000", "ether") // "410" ``` -现在我们的私有开发链上有一些以太币,我们可以部署合约了。 第一步是将 Multiply7 合约编译为可以发送到以太坊虚拟机的字节码。 要安装 Solidity 编译器 solc,请遵循 [Solidity 文档](https://docs.soliditylang.org/en/latest/installing-solidity.html)。 (你可能希望使用较旧的 `solc` 版本来匹配[在我们的示例中使用的编译器版本](https://github.com/ethereum/solidity/releases/tag/v0.4.20)。) +现在我们的私有开发链上有一些以太币,我们可以部署合约了。 第一步是将 Multiply7 合约编译为可以发送到以太坊虚拟机的字节码。 要安装 Solidity 编译器 solc,请遵循 [Solidity 文档](https://docs.soliditylang.org/en/latest/installing-solidity.html)。 (你可能希望使用较旧的 `solc` 版本来匹配[我们的示例中使用的编译器版本](https://github.com/ethereum/solidity/releases/tag/v0.4.20)。) 下一步是将 Multiply7 合约编译为可以发送到以太坊虚拟机的字节码。 @@ -2306,14 +1688,14 @@ curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from {"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"} ``` -交易被节点接受并返回交易哈希。 此哈希可用于跟踪交易。 下一步是确定部署我们的合约的地址。 每个已执行的交易都将创建一个收据。 此收据包含有关交易的各种信息,例如交易包含在哪个区块中以及以太坊虚拟机使用了多少燃料。 如果交易 创建了合约,它还将包含合约地址。 我们可以使用 `eth_getTransactionReceipt` 远程过程调用方法检索收据。 +交易被节点接受并返回交易哈希。 此哈希可用于跟踪交易。 下一步是确定我们的合约部署到的地址。 每个已执行的交易都将创建一个收据。 此收据包含有关交易的各种信息,例如交易包含在哪个区块中以及以太坊虚拟机使用了多少燃料。 如果交易 创建了合约,它还将包含合约地址。 我们可以使用远程过程调用方法 `eth_getTransactionReceipt` 检索收据。 ```bash curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545 {"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}} ``` -我们的合约是在 `0x4d03d617d700cf81935d7f797f4e2ae719648262` 上创建的。 结果为空而不是收据意味着该交易 尚未包含在区块中。 稍等片刻,检查你的矿工是否正在运行,然后重试。 +我们的合约是在 `0x4d03d617d700cf81935d7f797f4e2ae719648262` 上创建的。 结果为空而不是收据意味着该交易 尚未添加到区块中。 稍等片刻,检查你的矿工是否正在运行,然后重试。 #### 与智能合约交互 {#interacting-with-smart-contract} @@ -2321,7 +1703,7 @@ curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": [ `eth_sendTransaction` 需要几个参数,具体而言,`from`、`to` 和 `data`。 `From` 是我们帐户的公共地址,`to` 是合约地址。 `data` 参数包含有效载荷,它定义了必须调用哪个方法以及使用哪些参数。 这就是 [ABI(应用程序二进制接口)](https://docs.soliditylang.org/en/latest/abi-spec.html)的用武之地。 应用程序二进制接口是一个 JSON 文件,它定义了如何为以太坊虚拟机定义和编码数据。 -有效载荷的字节定义了调用合约中的哪个方法。 这是 Keccak 哈希的前 4 个字节以及函数名称及其参数类型(十六进制编码)。 Multiply 函数接受 uint,它是 uint256 的别名。 这为我们提供了: +有效载荷的字节定义了调用合约中的哪个方法。 这是函数名称及其参数类型的 Keccak 哈希的前 4 个字节(十六进制编码)。 Multiply 函数接受 uint,它是 uint256 的别名。 这为我们提供了: ```javascript web3.sha3("multiply(uint256)").substring(0, 10) @@ -2330,7 +1712,7 @@ web3.sha3("multiply(uint256)").substring(0, 10) 下一步是对参数进行编码。 只有一个 uint256,比如值 6。 应用程序二进制接口有一个部分指定了如何编码 uint256 类型。 -`int: enc(X)` 是 X 的高位优先二进制补码编码,对于负 X 在高阶(左侧)填充 0xff,对于正 X 填充零 > 字节,使得长度为 32 字节的倍数。 +`int: enc(X)` 是 X 的大端序二进制补码编码,对于负 X 在高位(左侧)填充 0xff,对于正 X 填充零 > 字节,使得长度为 32 字节的倍数。 此编码为 `0000000000000000000000000000000000000000000000000000000000000006`。 diff --git a/public/content/translations/zh/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/zh/developers/docs/data-and-analytics/block-explorers/index.md index 6e33d8321e4..4f6ed63152f 100644 --- a/public/content/translations/zh/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/translations/zh/developers/docs/data-and-analytics/block-explorers/index.md @@ -1,15 +1,15 @@ --- title: 区块浏览器 -description: 这是对于区块浏览器的介绍,让您进入区块链数据世界的大门,在这里您可以查询交易、帐户、合约以及更多以太坊区块链相关数据。 +description: 这是对于区块浏览器的介绍,让你进入区块链数据世界的大门,在这里你可以查询交易、帐户、合约以及更多以太坊区块链相关数据。 lang: zh sidebarDepth: 3 --- -区块浏览器是您进入以太坊数据世界的大门。 您可以通过区块浏览器来查看实时的区块、交易、矿工、帐户以及其他的链上相关活动。 +区块浏览器是你进入以太坊数据世界的大门。 你可以通过区块浏览器来查看实时的区块、交易、矿工、帐户以及其他的链上相关活动。 ## 前提条件 {#prerequisites} -您应该理解以太坊的基本概念,以便您能够理解区块浏览器向您展示的数据。 开始[介绍以太坊](/developers/docs/intro-to-ethereum/)。 +你应该理解以太坊的基本概念,以便你能够理解区块浏览器向你展示的数据。 开始[介绍以太坊](/developers/docs/intro-to-ethereum/)。 ## 服务 {#services} @@ -23,18 +23,18 @@ sidebarDepth: 3 - [Otterscan](https://otterscan.io/) - [Rantom](https://rantom.app/) - [Sirato](https://www.web3labs.com/sirato) -- [以太坊虚拟机](https://www.ethvm.com/) +- [EthVM](https://www.ethvm.com/) - [DexGuru 区块浏览器](https://ethereum.dex.guru/) ## 数据 {#data} -以太坊从设计上是透明的,所有信息都可以验证。 区块浏览器为获取这些信息提供了一个界面。 这适用于以太坊的主网络和测试网,如果您需要这些数据的话。 数据被分为执行数据和共识数据。 执行数据指已在一个特定区块内执行的交易。 共识数据指区块本身以及提出它们的验证者们。 +以太坊从设计上是透明的,所有信息都可以验证。 区块浏览器为获取这些信息提供了一个界面。 这适用于以太坊的主网络和测试网,如果你需要这些数据的话。 数据被分为执行数据和共识数据。 执行数据指已在一个特定区块内执行的交易。 共识数据指区块本身以及提出它们的验证者们。 -以下是您可以从区块浏览器获得的数据类型概要。 +以下是你可以从区块浏览器获得的数据类型概要。 ### 执行数据 {#execution-data} -每隔 12 秒就会有新的区块被添加到以太坊(除非区块提议者错过了提议机会),因此有几近稳定的数据流被添加到区块浏览器中。 区块里面包含着许多您可能会觉得有用的重要数据: +每隔 12 秒就会有新的区块被添加到以太坊(除非区块提议者错过了提议机会),因此有几近稳定的数据流被添加到区块浏览器中。 区块里面包含着许多你可能会觉得有用的重要数据: **标准数据** @@ -58,7 +58,7 @@ sidebarDepth: 3 ### 燃料 {#gas} -区块浏览器不仅会为你提供有关交易和区块中的燃料使用量的数据,还会为您提供有关网络当前燃料价格的信息。 这将帮助你了解网络使用情况,提交安全的交易和避免燃料超支。 寻找可以帮助你将这些信息获取到你自己的产品界面的应用程序接口。 燃料特定的数据涵盖: +区块浏览器不仅会为你提供有关交易和区块中的燃料使用量的数据,还会为你提供有关网络当前燃料价格的信息。 这将帮助你了解网络使用情况,提交安全的交易和避免燃料超支。 寻找可以帮助你将这些信息获取到你自己的产品界面的应用程序接口。 燃料特定的数据涵盖: - 安全但缓慢的交易所需的估计燃料单位数(以及估计的价格和持续时间) - 一般交易所需的估计燃料单位数(以及估计的价格和持续时间) @@ -98,14 +98,14 @@ sidebarDepth: 3 **用户帐户** - 帐户地址 - 你可以用来向其发送资金的公共地址 -- 以太币余额 - 与该账户关联的以太币金额 +- 以太币余额 - 与该帐户关联的以太币金额 - 总以太币价值 - 以太币的价值 - 代币 - 与帐户关联的代币及其价值 - 交易历史 - 此帐户为发送者或接收者的所有交易的列表 **智能合约** -智能合约帐户拥有用户帐户将拥有的所有数据,但一些区块浏览器甚至还会显示一些代码信息。 例如: +智能合约帐户拥有用户帐户将拥有的所有数据,但一些区块浏览器甚至还会显示一些代码信息。 示例包括: - 合约创建者 - 将合约部署到主网的地址 - 创建交易 - 包括部署到主网的交易 @@ -236,7 +236,7 @@ sidebarDepth: 3 - [Blockchair](https://blockchair.com/ethereum) - 最具隐私保护性的以太坊浏览器。 也用于排序和过滤(内存池)数据 - [Etherchain](https://www.etherchain.org/) - 以太坊主网的区块浏览器 - [Ethplorer](https://ethplorer.io/) - 专注于以太坊主网和 Kovan 测试网代币的区块浏览器 -- [Rantom](https://rantom.app/) - 是一个好用的开源 DeFi & NFT 交易查看器,用于提供详细的交易信息。 +- [Rantom](https://rantom.app/) - 是一个好用的开源去中心化金融非同质化代币交易查看器,用于提供详细的交易信息。 ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/data-and-analytics/index.md b/public/content/translations/zh/developers/docs/data-and-analytics/index.md index 0f162a26b66..66eae7a2b59 100644 --- a/public/content/translations/zh/developers/docs/data-and-analytics/index.md +++ b/public/content/translations/zh/developers/docs/data-and-analytics/index.md @@ -1,6 +1,6 @@ --- title: 数据和分析学 -description: 如何获取在链分析和数据以用于您的去中心化应用程序。 +description: 如何获取在链分析和数据以用于你的去中心化应用程序。 lang: zh --- @@ -12,7 +12,7 @@ lang: zh ## 前提条件 {#prerequisites} -您应该理解[区块浏览器](/developers/docs/data-and-analytics/block-explorers/) 的基本概念,以便更好地理解在数据分析环境中使用它们。 此外,熟悉[索引](/glossary/#index)概念,以了解它们给系统设计带来的好处。 +你应该理解[区块浏览器](/developers/docs/data-and-analytics/block-explorers/) 的基本概念,以便更好地理解在数据分析环境中使用它们。 此外,熟悉[索引](/glossary/#index)概念,以了解它们给系统设计带来的好处。 就架构基础而言,也要从理论上了解[应用程序接口](https://www.wikipedia.org/wiki/API)和 [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) 是什么。 @@ -30,11 +30,11 @@ lang: zh ## 客户端多样性 -[客户端多样性](/developers/docs/nodes-and-clients/client-diversity/)对于以太坊网络的整体健康很重要,因为它提供了对错误和漏洞利用的弹性。 目前,出现了一些客户端多样性仪表板,包括 [clientdiversity.org](https://clientdiversity.org/)、[rated.network](https://rated.network/)、[execution-diversity.info](https://execution-diversity.info/) 和 [Ethernodes](https://ethernodes.org/)。 +[客户端多样性](/developers/docs/nodes-and-clients/client-diversity/)对于以太坊网络的整体健康很重要,因为它提供了对错误和漏洞利用的弹性。 目前,出现了一些客户端多样性仪表板,包括 [clientdiversity.org](https://clientdiversity.org/)、[rated.network](https://www.rated.network)、[execution-diversity.info](https://execution-diversity.info/) 和 [Ethernodes](https://ethernodes.org/)。 ## Dune Analytics {#dune-analytics} -[Dune Analytics](https://dune.com/) 对区块链数据进行预处理,并存入关系型数据库(PostgreSQL 和 DatabricksSQL)表中,以便用户可以使用结构化查询语言 (SQL) 查询区块链数据并基于查询结果构建仪表板。 链上数据被组织为 4 个原始表:`blocks`、`transactions`、(事件)`logs` 和(调用)`traces`。 常见的合约和协议都已解码,并且每个都有自己的事件集和调用表。 这些事件和调用表被进一步处理并按协议类型组织成抽象表,例如 DEX、借贷、稳定币等。 +[Dune Analytics](https://dune.com/) 对区块链数据进行预处理,并存入关系型数据库(PostgreSQL 和 DatabricksSQL)表中,以便用户可以使用结构化查询语言 (SQL) 查询区块链数据并基于查询结果构建仪表板。 链上数据被组织为 4 个原始表:`blocks`、`transactions`、(事件)`logs` 和(调用)`traces`。 常见的合约和协议都已解码,并且每个都有自己的事件集和调用表。 这些事件和调用表被进一步处理并按协议类型组织成抽象表,例如去中心化交易所、借贷、稳定币等。 ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/zh/developers/docs/data-structures-and-encoding/index.md index 0219b3eaf35..826e55f2689 100644 --- a/public/content/translations/zh/developers/docs/data-structures-and-encoding/index.md +++ b/public/content/translations/zh/developers/docs/data-structures-and-encoding/index.md @@ -9,7 +9,7 @@ sidebarDepth: 2 ## 前提条件 {#prerequisites} -在继续阅读本文章之前,您应当对以太坊和[客户端软件](/developers/docs/nodes-and-clients/)的基本原理已经有所了解。 若是熟悉网络层这一概念和[以太坊白皮书](/whitepaper/)的话会更好。 +在继续阅读本文章之前,你应当对以太坊和[客户端软件](/developers/docs/nodes-and-clients/)的基本原理已经有所了解。 若是熟悉网络层这一概念和[以太坊白皮书](/whitepaper/)的话会更好。 ## 数据结构 {#data-structures} diff --git a/public/content/translations/zh/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/zh/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md index 7381a2a2b52..58ef01f827c 100644 --- a/public/content/translations/zh/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md +++ b/public/content/translations/zh/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -5,9 +5,9 @@ lang: zh sidebarDepth: 2 --- -默克尔帕特里字典树夏树提供了一种经过加密认证的数据结构,可用于存储所有 `(key, value)` 对。 +默克尔帕特里夏字典树提供了一种经过加密认证的数据结构,可用于存储所有 `(key, value)` 对。 -默克尔帕特里夏树是完全确定性的,这意味着有相同 `(key, value)` 对的字典树肯定是完全相同的,就连最后一个字节也相同。 这代表它们有着相同的根哈希,让插入、查找和删除操作具有难以企及的 `O(log(n))` 效率。 此外,相较于更复杂的基于比较的其他字典树(如红黑树),默克尔帕特里夏树更易于理解和编码。 +默克尔帕特里夏字典树是完全确定性的,这意味着有相同 `(key, value)` 对的字典树肯定是完全相同的,就连最后一个字节也相同。 这代表它们有着相同的根哈希,让插入、查找和删除操作具有难以企及的 `O(log(n))` 效率。 此外,相较于更复杂的基于比较的其他字典树(如红黑树),默克尔帕特里夏树更易于理解和编码。 ## 前提条件 {#prerequisites} @@ -25,7 +25,7 @@ sidebarDepth: 2 假设你想使用基数树数据结构永久保存一组键值对的次序。 为了在字典树中找到与键 `dog` 映射的值,首先需要把 `dog` 转换成字母表中的字母(给出 `64 6f 67`),然后沿着该路径向下遍历字典树,直到找到该值。 也就是说,为了找到字典树的根节点,你先在平面键/值数据库中查找根哈希。 它表示一组指向其他节点的键。 你会使用索引 `6` 的值作为键,并通过在平面键/值数据库中查找该键来获取下一层的节点。 然后使用索引 `4` 查找下一个值,再使用索引 `6`,以此类推,直到遍历路径 `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7` 后,你将找到该节点的值并且返回结果。 -从前缀树中查询和从其底层的固定“键/值”数据库中查询存在差异。 它们都定义了“键/值”对,但底层数据库能实现传统的 1 步查询,得到键对应的值。 而在前缀树中查询一个键对应的值则需要在底层数据库中查询多次才能得到最终结果。 我们把后者的查询方式称作 `path`,以避免描述上的模糊。 +从前缀树中查询和从其底层的固定“键/值”数据库中查询存在差异。 它们都定义了“键/值”对,但底层数据库能对键执行传统的 1 步查找。 而在前缀树中查询一个键对应的值则需要在底层数据库中查询多次才能得到最终结果。 我们把后者的查询方式称作 `path`,以避免描述上的模糊。 基数树的更新和删除操作定义如下: @@ -62,11 +62,11 @@ sidebarDepth: 2 return hash(newnode) ``` -“默克尔”基数树是通过使用确定性生成的加密哈希摘要链接节点来构建的。 这种内容寻址(在键/值数据库中 `key == keccak256(rlp(value))`)提供了存储数据的加密认证。 如果给定字典树的根哈希是公开的,那么任何人都可以通过提供将特定值与树根连接的每个节点的哈希,来证明该字典树在特定路径中包含给定值。 +“默克尔”基数树是通过使用确定性生成的加密哈希摘要链接节点来构建的。 这种(键/值数据库中 `key == keccak256(rlp(value))`)内容寻址提供了存储数据的加密完整性保障。 如果给定字典树的根哈希是公开的,那么任何可以访问底层叶数据的人都可以通过提供将特定值与树根连接的每个节点的哈希,来证明该字典树在特定路径中包含给定值。 -对于攻击者来说,他们无法证明 `(path, value)` 对不存在,因为根哈希从根本上基于它下方的所有哈希。 任何底层的修改都会改变根哈希。 +对于攻击者来说,他们无法证明 `(path, value)` 对不存在,因为根哈希从根本上基于它下方的所有哈希。 任何底层的修改都会改变根哈希。 可以将哈希看作是数据结构信息的一种压缩表示,并由哈希函数的预映射保护所保障。 -我们把基数树的原子单位(例如单个十六进制字符或 4 位二进制数)称为“半字节”。 如上文所述,以半字节为单位遍历路径时,节点最多可指向 16 个子节点,不过还包含一个 `value` 元素。 因此,我们把它们表示为具有长度的数组。 我们把这些有 17 个元素的数组称为“分支节点”。 +我们把基数树的原子单位(例如单个十六进制字符或 4 位二进制数)称为“半字节”。 如上文所述,以半字节为单位遍历路径时,节点最多可指向 16 个子节点,不过还包含一个 `value` 元素。 因此,我们把它们表示为具有长度 17 的数组。 我们把这些有 17 个元素的数组称为“分支节点”。 ## 默克尔帕特里夏树 {#merkle-patricia-trees} @@ -91,7 +91,7 @@ sidebarDepth: 2 ### 规范:带有可选终止符的十六进制序列的压缩编码 {#specification} -如上文所述,*剩余部分路径长度为奇数 vs 偶数*和*叶节点 vs 扩展节点*的标记位位于任意双元素节点中部分路径的第一个半字节。 从而产生以下结果: +如上文所述,_剩余部分路径长度为奇数 vs 偶数_和_叶节点 vs 扩展节点_的标记位位于任意双元素节点中部分路径的第一个半字节。 从而产生以下结果: hex char bits | node type partial path length ---------------------------------------------------------- @@ -162,7 +162,7 @@ sidebarDepth: 2 假定我们想要包含四个路径/值对 `('do', 'verb')`、`('dog', 'puppy')`、`('doge', 'coin')`、`('horse', 'stallion')` 的前缀树。 -首先,我们将路径和值都转换为 `bytes`。 在下方代码中,*路径*的实际字节代表用 `<>` 表示。而*值*仍然显示为字符串,用 `''` 表示,以便于理解(值也应为 `bytes`): +首先,我们将路径和值都转换为 `bytes`。 在下方代码中,_路径_的实际字节代表用 `<>` 表示。而_值_仍然显示为字符串,用 `''` 表示,以便于理解(值也应为 `bytes`): ``` <64 6f> : 'verb' @@ -183,7 +183,7 @@ sidebarDepth: 2 当一个节点在另一个节点内部引用时,包含的是 `H(rlp.encode(x))`,其中 `H(x) = keccak256(x) if len(x) > > = 32 else x` 和 `rlp.encode` 是[递归长度前缀](/developers/docs/data-structures-and-encoding/rlp)编码函数。 -请注意,更新前缀树时,*如果*新创建节点的长度 >= 32,则需要将键/值对 `(keccak256(x), x)` 存储在一个持久的查询表中。 然而,如果节点比这短,则不需要存储任何数据,因为函数 f(x) = x 是可逆的。 +请注意,更新前缀树时,_如果_新创建节点的长度 >= 32,则需要将键/值对 `(keccak256(x), x)` 存储在一个持久的查询表中。 然而,如果节点比这短,则不需要存储任何数据,因为函数 f(x) = x 是可逆的。 ## 以太坊中的前缀树 {#tries-in-ethereum} @@ -201,7 +201,7 @@ sidebarDepth: 2 ### 存储树 {#storage-trie} -存储树是*所有*合同数据存放之处。 每个帐户都有一棵单独的存储树。 要用给定地址在特定的存储位置检索值,需要存储地址、存储器中存储数据的整数位置,以及区块 ID。 之后,这些数据可以作为参数传入 JSON-RPC 应用程序接口中定义的 `eth_getStorageAt`,例如用于检索地址 `0x295a70b2de5e3953354a6a8344e616ed314d7251` 的存储插槽 0 中的数据: +存储树是_所有_合同数据存放之处。 每个帐户都有一棵单独的存储树。 要用给定地址在特定的存储位置检索值,需要存储地址、存储器中存储数据的整数位置,以及区块 ID。 之后,这些数据可以作为参数传入 JSON-RPC 应用程序接口中定义的 `eth_getStorageAt`,例如用于检索地址 `0x295a70b2de5e3953354a6a8344e616ed314d7251` 的存储插槽 0 中的数据: ``` curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 @@ -233,6 +233,8 @@ curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": [ {"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} ``` +注意:如果不是合约帐户,以太坊帐户的 `storageRoot` 默认为空。 + ### 交易树 {#transaction-trie} 每个区块都有一个独立的交易字典树,也用于存储 `(key, value)` 对。 路径为:`rlp(transactionIndex)`,代表了对应一个值的键,值由以下决定: @@ -248,7 +250,7 @@ else: ### 收据树 {#receipts-trie} -每个区块都有自己的收据树。 此处的 `path` 是:`rlp(transactionIndex)`。 `transactionIndex` 是它在挖矿区块中的索引。 收据字典树从不更新。 与交易字典树类似,它也有当前和以前的收据。 为了在收据字典树中查询特定的收据,需要提供区块中交易的索引、收据有效载荷以及交易类型。 返回的收据可以是 `Receipt` 类型,定义为 `transaction type` 和 `transaction payload` 的串接,也可以是 `LegacyReceipt` 类型,定义为 `rlp([status, cumulativeGasUsed, logsBloom, logs])`。 +每个区块都有自己的收据树。 此处的 `path` 是:`rlp(transactionIndex)`。 `transactionIndex` 是它在挖矿区块中的索引。 收据字典树从不更新。 与交易字典树类似,它也有当前和以前的收据。 为了在收据字典树中查询特定的收据,需要提供区块中交易的索引、收据有效载荷以及交易类型。 返回的收据可以是 `Receipt` 类型,定义为 `TransactionType` 和 `ReceiptPayload` 的串联;也可以是 `LegacyReceipt` 类型,定义为`rlp([status, cumulativeGasUsed, logsBloom, logs])`。 关于这个问题的更多信息可以在 [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718) 文档中找到。 diff --git a/public/content/translations/zh/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/zh/developers/docs/data-structures-and-encoding/rlp/index.md index b9ab8ef5968..5065ca21789 100644 --- a/public/content/translations/zh/developers/docs/data-structures-and-encoding/rlp/index.md +++ b/public/content/translations/zh/developers/docs/data-structures-and-encoding/rlp/index.md @@ -35,7 +35,7 @@ sidebarDepth: 2 - 对于值在 `[0x00, 0x7f]`(十进制 `[0, 127]`)范围内的单个字节,该字节即是它自己的递归长度前缀编码。 - 否则,如果字符串的长度为 0-55 个字节,则递归长度前缀编码包含一个值为 **0x80**(十进制 128)的单字节,加上该字符串之后字符串的长度。 因此,第一个字节的范围是 `[0x80, 0xb7]`(十进制 `[128, 183]`)。 - 如果字符串的长度超过 55 个字节,则递归长度前缀编码由一个值为 **0xb7**(十进制为 183)的单个字节,加上二进制字符串长度的以字节为单位的长度,后跟字符串的长度,然后是字符串。 例如,一个长 1024 字节的字符串将被编码为 `\xb9\x04\x00`(十进制 `185, 4, 0`)后跟该字符串。 在这里,`0xb9` (183 + 2 = 185) 为第一个字节,然后是表示实际字符串长度的 2 个字节 `0x0400`(十进制 1024)。 因此,第一个字节的范围是 `[0xb8, 0xbf]`(十进制 `[184, 191]`)。 -- 如果列表的总有效载荷长度(即其所有经过递归长度前缀编码的项目的组合长度)为 0-55 个字节,则递归长度前缀编码包含一个值为 **0xc0** 的单字节,加上列表长度,后跟一串项目递归长度前缀编码。 因此,第一个字节的范围是 `[0xc0, 0xf7]`(十进制 `[192, 247]`)。 +- 如果列表的总有效载荷长度(即其所有经过递归长度前缀编码的项目的组合长度)为 0-55 个字节,则递归长度前缀编码包含一个值为 **0xc0** 的单字节,加上有效载荷长度,后跟一串项目的递归长度前缀编码。 因此,第一个字节的范围是 `[0xc0, 0xf7]`(十进制 `[192, 247]`)。 - 如果列表的总有效载荷长度超过 55 个字节,则递归长度前缀编码包含一个值为 **0xf7** 的单字节,加上二进制格式的有效载荷长度的以字节为单位的长度,后跟有效载荷的长度,然后是项目递归长度前缀编码串。 因此,第一个字节的范围是 `[0xf8, 0xff]`(十进制 `[248, 255]`)。 对应的代码为: @@ -43,27 +43,27 @@ sidebarDepth: 2 ```python def rlp_encode(input): if isinstance(input,str): - if len(input) == 1 and ord(input) < 0x80: return input - else: return encode_length(len(input), 0x80) + input - elif isinstance(input,list): + 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) + for item in input: + output += rlp_encode(item) return encode_length(len(output), 0xc0) + output -def encode_length(L,offset): +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 - else: - raise Exception("input too long") + raise Exception("input too long") def to_binary(x): if x == 0: return '' - else: - return to_binary(int(x / 256)) + chr(x % 256) + return to_binary(int(x / 256)) + chr(x % 256) ``` ## 示例 {#examples} @@ -113,7 +113,7 @@ def rlp_decode(input): 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)) + output += rlp_decode(substr(input, offset + dataLen)) return output def decode_length(input): @@ -137,8 +137,7 @@ def decode_length(input): lenOfListLen = prefix - 0xf7 listLen = to_integer(substr(input, 1, lenOfListLen)) return (1 + lenOfListLen, listLen, list) - else: - raise Exception("input does not conform to RLP encoding form") + raise Exception("input does not conform to RLP encoding form") def to_integer(b): length = len(b) @@ -146,8 +145,7 @@ def to_integer(b): raise Exception("input is null") elif length == 1: return ord(b[0]) - else: - return ord(substr(b, -1)) + to_integer(substr(b, 0, -1)) * 256 + return ord(substr(b, -1)) + to_integer(substr(b, 0, -1)) * 256 ``` ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/zh/developers/docs/data-structures-and-encoding/ssz/index.md index 64750aff9b0..2dbabd0578f 100644 --- a/public/content/translations/zh/developers/docs/data-structures-and-encoding/ssz/index.md +++ b/public/content/translations/zh/developers/docs/data-structures-and-encoding/ssz/index.md @@ -109,7 +109,7 @@ sidebarDepth: 2 在某些情况下,树的叶子不会像上面示例中那样自然均匀地分布。 例如,叶子 4 可能是一个包含多个元素的容器,需要向默克尔树添加额外的“深度”,从而形成不均匀的树。 -与其将这些树元素称为叶子 X、节点 X 等,我们可以给它们赋予广义索引,从根 = 1 开始,沿着每个级别从左到右计数。 这即是前述广义索引。 序列化列表中的每个元素都有一个等于 `2**depth + idx` 的广义索引,其中 idx 是其在序列化对象中的零索引位置,深度是默克尔树中的层数,可以确定为元素(叶子)数量的平方根。 +与其将这些树元素称为叶子 X、节点 X 等,我们可以给它们赋予广义索引,从根 = 1 开始,沿着每个级别从左到右计数。 这即是前述广义索引。 序列化列表中的每个元素都有一个等于 `2**depth + idx` 的广义索引,其中 idx 是其在序列化对象中的零索引位置,depth 是默克尔树中的层数,可以计算为元素(叶子)数量的二进制对数。 ## 广义索引 {#generalized-indices} diff --git a/public/content/translations/zh/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md b/public/content/translations/zh/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md index 2ee9ec1ad64..74dfd6d860e 100644 --- a/public/content/translations/zh/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md +++ b/public/content/translations/zh/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md @@ -123,18 +123,18 @@ KECCAK(DK[16..31] ++ ) "crypto": { "cipher": "aes-128-ctr", "cipherparams": { - "iv": "83dbcc02d8ccb40e466191a123791e0e" + "iv": "740770fce12ce862af21264dab25f1da" }, - "ciphertext": "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", + "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2", "kdf": "scrypt", "kdfparams": { "dklen": 32, "n": 262144, - "p": 8, - "r": 1, - "salt": "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" + "p": 1, + "r": 8, + "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034" }, - "mac": "2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097" + "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c" }, "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", "version": 3 @@ -143,7 +143,7 @@ KECCAK(DK[16..31] ++ ) **中间计算结果**: -`Derived key`: `fac192ceb5fd772906bea3e118a69e8bbb5cc24229e20d8766fd298291bba6bd` `MAC Body`: `bb5cc24229e20d8766fd298291bba6bdd172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c` `MAC`: `2103ac29920d71da29f15d75b4a16dbe95cfd7ff8faea1056c33131d846e3097` `Cipher key`: `fac192ceb5fd772906bea3e118a69e8b` +`Derived key`:`7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` `MAC Body`:`edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` `MAC`:`337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` `Cipher key`:`7446f59ecc301d2d79bc3302650d8a5c` ## 第 1 版的改动 {#alterations-from-v2} diff --git a/public/content/translations/zh/developers/docs/development-networks/index.md b/public/content/translations/zh/developers/docs/development-networks/index.md index f50ca978a7e..d0a7449ad6b 100644 --- a/public/content/translations/zh/developers/docs/development-networks/index.md +++ b/public/content/translations/zh/developers/docs/development-networks/index.md @@ -4,13 +4,13 @@ description: 对以太坊应用的开发网络环境与开发工具的概览。 lang: zh --- -当使用智能合约来开发一个以太坊应用时,您可能想要在部署之前在本地查看它是如何工作的。 +当使用智能合约来开发一个以太坊应用时,你可能想要在部署之前在本地查看它是如何工作的。 -这和在本地运行一个本地网页服务器相似。为了测试您的去中心化应用程序,您可以使用开发网络创建一个本地的区块链。 这些以太坊开发网络提供了能够比公共测试网更快的迭代功能(例如您不需要从测试网获取以太币)。 +这和在本地运行一个本地网页服务器相似。为了测试你的去中心化应用程序,你可以使用开发网络创建一个本地的区块链。 这些以太坊开发网络提供了能够比公共测试网更快的迭代功能(例如你不需要从测试网获取以太币)。 ## 前置要求 {#prerequisites} -您应该先理解[以太坊堆栈](/developers/docs/ethereum-stack/)和[以太坊网络](/developers/docs/networks/)基础知识才能进入开发网络。 +你应该先理解[以太坊堆栈](/developers/docs/ethereum-stack/)和[以太坊网络](/developers/docs/networks/)基础知识才能进入开发网络。 ## 什么是开发网络? {#what-is-a-development-network} @@ -18,7 +18,7 @@ lang: zh **为什么不在本地运行一个标准的以太坊节点?** -你*可以*[运行节点](/developers/docs/nodes-and-clients/#running-your-own-node),但由于开发网络是以开发为目的而建立的,它们往往会打包一些快捷方便的功能,例如: +你_可以_[运行节点](/developers/docs/nodes-and-clients/#running-your-own-node),但由于开发网络是以开发为目的而建立的,它们往往会打包一些快捷方便的功能,例如: - 为本地区块链提供数据,这个功能很重要(例如使用以太币余额的帐户) - 用接收的每笔交易,按照顺序即时产生区块,毫不延迟。 @@ -26,13 +26,13 @@ lang: zh ## 可用工具 {#available-projects} -**注意**:大多数[开发框架](/developers/docs/frameworks/)包含一个内置的开发网络。 我们建议从一个框架开始[设置您的本地开发环境](/developers/local-environment/)。 +**注意**:大多数[开发框架](/developers/docs/frameworks/)包含一个内置的开发网络。 我们建议从一个框架开始[设置你的本地开发环境](/developers/local-environment/)。 ### Ganache {#ganache} -快速构建一个个人的以太坊区块链,您可以用它来运行测试,执行命令,并在控制链的运行方式时检查状态。 +快速构建一个个人的以太坊区块链,你可以用它来运行测试,执行命令,并在控制链的运行方式时检查状态。 -Ganache 提供了一个桌面应用程序 (Ganache UI) 以及一个命令行工具 (`ganache-cli`)。 它是 Truffle 工具套装的一部分。 +Ganache提供了一个桌面应用程序 (Ganache UI) 以及一个命令行工具 (`ganache-cli`)。 它是 Truffle 工具套装的一部分。 - [网站](https://www.trufflesuite.com/ganache) - [GitHub](https://github.com/trufflesuite/ganache) @@ -40,7 +40,7 @@ Ganache 提供了一个桌面应用程序 (Ganache UI) 以及一个命令行工 ### 安全帽网络 {#hardhat-network} -一个专门用于开发的本地以太坊网络。 该网络允许您部署合约,运行测试并调试代码。 +一个专门用于开发的本地以太坊网络。 该网络允许你部署合约,运行测试并调试代码。 安全帽网络内置了安全帽,安全帽是专业人员的以太坊开发环境。 @@ -64,9 +64,9 @@ Ganache 提供了一个桌面应用程序 (Ganache UI) 以及一个命令行工 ### Kurtosis 以太坊包 {#kurtosis} -Kurtosis 是一个用于多容器测试环境的构建系统,它让开发人员能够在本地构建区块链网络的可复制实例。 +Kurtosis 是一个用于多容器测试环境的构建系统,让开发者能够在本地构建区块链网络的可复现实例。 -以太坊 Kurtosis 包本地实例化了一个容器化和可参数化的以太坊测试网,支持多个不同的执行层 (EL) 和共识层 (CL)客户端以及 n 个节点。 Kurtosis 优雅地处理所有本地端口映射和服务连接,以方便 dApp 和智能合约原型设计和测试。 +以太坊 Kurtosis 包在本地实例化了一个容器化和可参数化的以太坊测试网,支持多种不同的执行层 (EL) 和共识层 (CL) 客户端以及 n 个节点。 Kurtosis 优雅地处理所有本地端口映射和服务连接,以方便去中心化应用程序和智能合约原型设计和测试。 - [以太坊网络包](https://github.com/kurtosis-tech/eth-network-package) - [网站](https://www.kurtosis.com/) diff --git a/public/content/translations/zh/developers/docs/ethereum-stack/index.md b/public/content/translations/zh/developers/docs/ethereum-stack/index.md index 101e9512915..d58c9f614aa 100644 --- a/public/content/translations/zh/developers/docs/ethereum-stack/index.md +++ b/public/content/translations/zh/developers/docs/ethereum-stack/index.md @@ -6,7 +6,7 @@ lang: zh 就像其他任何一种堆栈结构,完整的“以太栈”会基于不同的目的在不同的项目之间变换。 -然而,以太坊的核心技术是提供一种心智模型,这种模型帮助解决了以太坊区块如何在不同的应用之间的交互的问题。 理解堆栈的层级将有助于您理解可以将以太坊融入软件项目的不同方法。 +然而,以太坊的核心技术是提供一种心智模型,这种模型帮助解决了以太坊区块如何在不同的应用之间的交互的问题。 理解堆栈的层级将有助于你理解可以将以太坊融入软件项目的不同方法。 ## 级别 1:以太坊虚拟机 {#ethereum-virtual-machine} @@ -16,7 +16,7 @@ lang: zh 在后台,那些以太坊虚拟机会使用操作码执行一些特殊的任务。 这些(140 个惟一的)操作码使以太坊虚拟机具有 [图灵完备](https://en.wikipedia.org/wiki/Turing_completeness),这意味着只要提供足够的资源,以太坊虚拟机几乎可以计算任何东西。 -作为去中心化应用程序的开发者,除了了解以太坊虚拟机的存在之外,您不需要了解更多关于以太坊虚拟机的信息,并且可以在以太坊上畅通无阻地授权所有应用程序。 +作为去中心化应用程序的开发者,除了了解以太坊虚拟机的存在之外,你不需要了解更多关于以太坊虚拟机的信息,并且可以在以太坊上畅通无阻地授权所有应用程序。 ## 级别 2:智能合约 {#smart-contracts} @@ -26,11 +26,11 @@ lang: zh 智能合约不仅是开放源码库,而且它们基本上是运行 24/7 的开放应用程序接口服务,不能被取消。 智能合约提供了为用户和应用程序([去中心化应用程序](/developers/docs/dapps/))之间交互的公开方法,无需许可。 任何应用程序都可能会与已部署的智能合约集成组成功能,如添加[数据源](/developers/docs/oracles/)或支持代币交换。 任何人都可以在以太坊上部署智能合约,以便添加自定义功能来满足其应用程序的需要。 -作为一个去中心化应用程序开发者,如果您需要在以太坊区块链上添加自定义功能,需要通过写智能合约来实现。 您可能会发现您可以仅仅通过与现有智能合约进行整合来满足您项目的大部分或全部的需要。例如,如果您想要支持支付稳定币或启用分散交换代币。 +作为一个去中心化应用程序开发者,如果你需要在以太坊区块链上添加自定义功能,需要通过写智能合约来实现。 你可能会发现你可以仅仅通过与现有智能合约进行整合来满足你项目的大部分或全部的需要。例如,如果你想要支持支付稳定币或启用分散交换代币。 ## 级别 3:以太坊节点 {#ethereum-nodes} -为了让应用程序与以太坊区块链交互,它必须连接到 [以太坊节点](/developers/docs/nodes-and-clients/)。 正在连接到一个节点,您可以读取区块链数据和/或将交易发送到网络。 +为了让应用程序与以太坊区块链交互,它必须连接到 [以太坊节点](/developers/docs/nodes-and-clients/)。 正在连接到一个节点,你可以读取区块链数据和/或将交易发送到网络。 以太坊节点是运行着软件的电脑,这些软件也就是一个以太坊客户端。 客户端是一种以太坊的实现,它可以验证每个区块中的所有交易,从而确保网络安全和数据准确。 **以太坊节点是以太坊区块链**。 他们集体存储以太坊区块链的状态,并根据改变区块链状态的交易达成共识。 @@ -38,24 +38,24 @@ lang: zh ## 级别 4:以太坊客户端应用程序接口 {#ethereum-client-apis} -许多方便的库(由以太坊开源社区建立和维护)允许您的终端用户应用程序连接到以太坊区块链并进行通信。 +许多方便的库(由以太坊开源社区建立和维护)允许你的终端用户应用程序连接到以太坊区块链并进行通信。 -如果您的面向用户应用程序是一个 web 应用程序,您可以直接选择在您的前端使用 `npm 安装`一个 [JavaScript 应用程序接口](/developers/docs/apis/javascript/)。 或许您会选择使用 [Python](/developers/docs/programming-languages/python/) 或 [Java](/developers/docs/programming-languages/java/) 的应用程序接口在后端实现此功能。 +如果你的面向用户应用程序是一个 web 应用程序,你可以直接选择在你的前端使用 `npm 安装`一个 [JavaScript 应用程序接口](/developers/docs/apis/javascript/)。 或许你会选择使用 [Python](/developers/docs/programming-languages/python/) 或 [Java](/developers/docs/programming-languages/java/) 的应用程序接口在后端实现此功能。 -虽然这些应用程序接口不是栈必须的一部分,但它们抽象并消减了与以太坊节点直接互动的大部分复杂性。 它们还提供好用的函数(例如:将 ETH 转化为 Gwei),而作为开发者,您可以花费更少的时间处理以太坊客户端的复杂问题,从而将更多的时间集中于处理您的应用程序的独特功能。 +虽然这些应用程序接口不是栈必须的一部分,但它们抽象并消减了与以太坊节点直接互动的大部分复杂性。 它们还提供好用的函数(例如:将 ETH 转化为 Gwei),而作为开发者,你可以花费更少的时间处理以太坊客户端的复杂问题,从而将更多的时间集中于处理你的应用程序的独特功能。 ## 级别 5:终端用户应用程序 {#end-user-applications} -在栈的顶层是面向用户的应用程序。 这些是您今天经常用和构建的标准应用程序:主要是网络程序和移动应用程序。 +在栈的顶层是面向用户的应用程序。 这些是你今天经常用和构建的标准应用程序:主要是网络程序和移动应用程序。 开发这些用户界面的方式基本上保持不变。 用户常常不需要知道他们所使用的应用程序是使用区块链构建的。 ## 准备好选择技术栈了吗? {#ready-to-choose-your-stack} -查看我们的指南为您的以太坊应用程序 [设置本地开发环境](/developers/local-environment/)。 +查看我们的指南为你的以太坊应用程序 [设置本地开发环境](/developers/local-environment/)。 ## 延伸阅读 {#further-reading} - [一个 Web 3.0 应用的架构](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _Preethi Kasireddy_ -_还有哪些社区资源对您有所帮助? 编辑并添加本页面!_ +_还有哪些社区资源对你有所帮助? 编辑并添加本页面!_ diff --git a/public/content/translations/zh/developers/docs/frameworks/index.md b/public/content/translations/zh/developers/docs/frameworks/index.md index e0fc3f244a7..a7f6c6f79ab 100644 --- a/public/content/translations/zh/developers/docs/frameworks/index.md +++ b/public/content/translations/zh/developers/docs/frameworks/index.md @@ -6,26 +6,28 @@ lang: zh ## 框架介绍 {#introduction-to-frameworks} -构建一个完整的去中心化应用程序需要不同的技术。 软件框架包括许多需要的功能,或提供简单的插件系统来选择您需要的工具。 +构建一个完整的去中心化应用程序需要不同的技术。 软件框架包括许多需要的功能,或提供简单的插件系统来选择你需要的工具。 这些框架带有很多非常规的功能,比如: - 编一个本地区块链的程序功能。 -- 编辑和测试您智能合约的实用工具。 -- 客户开发附加功能,在同一个项目、仓库中来搭建您面向客户的应用程序。 +- 编辑和测试你智能合约的实用工具。 +- 客户端开发附加组件,以在同一项目/仓库中构建你的面向用户的应用。 - 无论是在本地运行的实例,还是在以太坊的公共网络之一,可以连接到以太网并且部署合约的配置。 -- 去中心化的应用程序分布——与类似星际文件系统(一种用于存储和访问文件、网站、应用程序和数据的分布式系统)的存储选项一体化。 +- 去中心化的应用分发 - 与诸如 IPFS 之类的存储选项集成。 ## 前置要求 {#prerequisites} -在更深入介绍这个框架之前,我们推荐您先阅读下面对于[去中心化应用程序](/developers/docs/dapps/)的简介以及[以太坊堆栈](/developers/docs/ethereum-stack/)。 +在更深入介绍这个框架之前,我们推荐你先阅读下面对于[去中心化应用程序](/developers/docs/dapps/)的简介以及[以太坊堆栈](/developers/docs/ethereum-stack/)。 ## 可用的框架 {#available-frameworks} -**Truffle -** **_开发环境、测试框架、部署通道及其他工具。_** +**Foundry** - **_Foundry 是一款快速、便携、模块化的以太坊应用程序开发工具包_** -- [trufflesuite.com](https://www.trufflesuite.com/) -- [GitHub](https://github.com/trufflesuite/truffle) +- [安装 Foundry](https://book.getfoundry.sh/) +- [Foundry 手册](https://book.getfoundry.sh/) +- [Telegram 上的 Foundry 社区聊天](https://t.me/foundry_support) +- [强大的 Foundry](https://github.com/crisgarner/awesome-foundry) **安全帽 -** **_ 面向专业人员的以太坊开发环境。_** @@ -37,29 +39,18 @@ lang: zh - [相关文档](https://docs.apeworx.io/ape/stable/) - [GitHub](https://github.com/ApeWorX/ape) -**Brownie -** **_ 基于 Python 的开发环境和测试框架。_** - -- [相关文档](https://eth-brownie.readthedocs.io/en/latest/) -- [GitHub](https://github.com/eth-brownie/brownie) - -**Web3j -** **_ 在 Java 虚拟机上开发区块链应用程序的平台。_ ** +**Web3j -** **_ Java 虚拟机上的区块链应用程序开发平台。_ ** - [主页](https://www.web3labs.com/web3j-sdk) - [相关文档](https://docs.web3j.io) - [GitHub](https://github.com/web3j/web3j) -**OpenZeppelin SDK -** **_终极智能合约工具包:一套帮助您开发、编译、升级、部署智能合约并与之交互的工具。_** - -- [OpenZepelin SDK](https://openzeppelin.com/sdk/) -- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) -- [社区论坛](https://forum.openzeppelin.com/c/support/17) - -**创建以太坊应用程序 -** **_使用一个命令创建以太坊驱动的应用程序。 提供众多 UI 框架和去中心化金融模板供选择。_** +**Create Eth App -** **_ 使用一个命令创建以太坊支持的应用程序。 提供众多 UI 框架和去中心化金融模板供选择。_** - [GitHub](https://github.com/paulrberg/create-eth-app) - [模板](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates) -**Scaffold-Eth -** **_Ethers.js + 安全帽 + React 组件和 web3 钩子函数:这是您开始构建由智能合约驱动的去中心化应用程序所需要的一切。_** +**Scaffold-Eth -** **_Ethers.js + 安全帽 + React 组件和 web3 钩子函数:构建智能合约支持的去中心化应用程序所需的一切资源,这里都有。_** - [GitHub](https://github.com/austintgriffith/scaffold-eth) @@ -79,19 +70,13 @@ lang: zh - [GitHub](https://github.com/alchemyplatform) - [Discord](https://discord.com/invite/A39JVCM) -**Foundry -** **_ 一种快速便携的模块化工具包,适用于使用 Rust 语言进行以太坊应用程序开发。_** - -- [相关文档](https://book.getfoundry.sh/) -- [GitHub](https://github.com/gakonst/foundry/) -- [面向 Foundry 的工具](https://github.com/crisgarner/awesome-foundry) - **NodeReal -** **_以太坊开发平台。_** - [Nodereal.io](https://nodereal.io/) - [GitHub](https://github.com/node-real) - [Discord](https://discord.gg/V5k5gsuE) -**thirdweb SDK -** **_使用我们强大的 SDK 和 CLI 构建能够与你的智能合约交互的 web3 应用程序。_** +**thirdweb SDK -** **_使用我们强大的软件开发工具包和命令行接口,构建能够与你的智能合约交互的 web3 应用程序。_** - [相关文档](https://portal.thirdweb.com/sdk/) - [GitHub](https://github.com/thirdweb-dev/) @@ -102,6 +87,25 @@ lang: zh - [GitHub](https://github.com/chainstack) - [Discord](https://discord.gg/BSb5zfp9AT) +**Brownie -** **_ 基于 Python 的开发环境和测试框架。_** + +- [相关文档](https://eth-brownie.readthedocs.io/en/latest/) +- [GitHub](https://github.com/eth-brownie/brownie) +- **Brownie 当前未维护** + +**Truffle -** **_开发环境、测试框架、构建管道及其他工具。_** + +- [trufflesuite.com](https://www.trufflesuite.com/) +- [GitHub](https://github.com/trufflesuite/truffle) +- **Truffle 开发已结束** - [了解更多](https://twitter.com/trufflesuite/status/1704946902393860589?t=NlIWeLTbBSAaJmS5uUAhSA&s=19) + +**OpenZeppelin SDK -** **_终极智能合约工具包:一套帮助你开发、编译、升级、部署智能合约并与之交互的工具。_** + +- [OpenZeppelin SDK](https://openzeppelin.com/sdk/) +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) +- [社区论坛](https://forum.openzeppelin.com/c/support/17) +- **OpenZeppelin SDK 开发已结束** + ## 延伸阅读 {#further-reading} _还有哪些社区资源对你有所帮助? 请编辑本页面并添加!_ diff --git a/public/content/translations/zh/developers/docs/ides/index.md b/public/content/translations/zh/developers/docs/ides/index.md index 37b908fd770..8f46f5cbe1b 100644 --- a/public/content/translations/zh/developers/docs/ides/index.md +++ b/public/content/translations/zh/developers/docs/ides/index.md @@ -4,11 +4,11 @@ description: lang: zh --- -当建立一个[集成开发环境](https://wikipedia.org/wiki/Integrated_development_environment)时,以太坊上的应用编程类似于任何其他软件项目编程。 这里有许多选项可供选择,最后,请选择一个最适合您偏好的集成开发环境或代码编辑器。 对您的以太坊开发来说,最好的集成开发环境很可能就是您在传统软件开发中使用过的集成开发环境。 +当建立一个[集成开发环境](https://wikipedia.org/wiki/Integrated_development_environment)时,以太坊上的应用编程类似于任何其他软件项目编程。 这里有许多选项可供选择,最后,请选择一个最适合你偏好的集成开发环境或代码编辑器。 对你的以太坊开发来说,最好的集成开发环境很可能就是你在传统软件开发中使用过的集成开发环境。 ## 基于网络的集成开发环境 {#web-based-ides} -如果您想在[设置本地开发环境](/developers/local-environment/)之前摆弄一下代码,这些网络应用是为以太坊智能合约开发定制的。 +如果你想在[设置本地开发环境](/developers/local-environment/)之前摆弄一下代码,这些网络应用是为以太坊智能合约开发定制的。 **[Remix](https://remix.ethereum.org/)** - **_基于 Web 的集成开发环境,内置静态分析和区块链测试虚拟机_** @@ -66,6 +66,6 @@ lang: zh ## 延伸阅读 {#further-reading} -- [以太坊集成开发环境 (IDE)](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Alchemy 提供的以太坊 IDE 列表_ +- [以太坊集成开发环境 (IDE)](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Alchemy 提供的以太坊集成开发环境列表_ _还有哪些社区资源对你有所帮助? 请编辑本页面并添加!_ diff --git a/public/content/translations/zh/developers/docs/networking-layer/index.md b/public/content/translations/zh/developers/docs/networking-layer/index.md index 501a864ebaa..bac7fa28ec9 100644 --- a/public/content/translations/zh/developers/docs/networking-layer/index.md +++ b/public/content/translations/zh/developers/docs/networking-layer/index.md @@ -47,9 +47,9 @@ sidebarDepth: 2 [以太坊节点记录 (ENR)](/developers/docs/networking-layer/network-addresses/) 是一个包含三个基本元素的对象:签名(根据某种商定的身份识别方案创建的记录内容的散列)、跟踪记录更改的序号和键:值对的任意列表。 这种格式不会过时,使新对等点之间身份识别信息的交换更加容易,并且是以太坊节点的首选[网络地址](/developers/docs/networking-layer/network-addresses)格式。 -#### 发现为什么建立在 UDP 协议上? {#why-udp} +#### 发现为什么建立在UDP协议上? {#why-udp} -UDP 协议不支持任何错误检查、重新发送失败的数据包,或者动态地打开和关闭连接;相反,它只是将连续的信息流发送至目标,无论它们是否被对方成功接收。 这种最简化的功能会产生最少的连接开销,从而使这种连接非常迅速。 对于发现而言,如果某个节点只想让其它节点知道它的存在以便它与某个对等点建立正式的连接,UDP 协议就已经足够了。 然而,对网络协议栈的其余部分来说,UDP 协议就不那么合适了。 节点之间的信息交流相当复杂,因此需要一个功能更完善的协议来支持重新发送、错误检查等。 TCP 协议带来更多功能所产生的额外连接开销是值得的。 因此,对等网络协议栈中的大多数协议在 TCP 协议之上运行。 +UDP协议不支持任何错误检查、重新发送失败的数据包,或者动态地打开和关闭连接;相反,它只是将连续的信息流发送至目标,无论它们是否被对方成功接收。 这种最简化的功能会产生最少的连接开销,从而使这种连接非常迅速。 对于发现而言,如果某个节点只想让其它节点知道它的存在以便它与某个对等点建立正式的连接,UDP协议就已经足够了。 然而,对网络协议栈的其余部分来说,UDP协议就不那么合适了。 节点之间的信息交流相当复杂,因此需要一个功能更完善的协议来支持重新发送、错误检查等。 TCP协议带来更多功能所产生的额外连接开销是值得的。 因此,对等网络协议栈中的大多数协议在TCP协议之上运行。 ### DevP2P {#devp2p} diff --git a/public/content/translations/zh/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/zh/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..f9266e9c052 --- /dev/null +++ b/public/content/translations/zh/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,82 @@ +--- +title: 门户网络 +description: 门户网络概览 - 旨在为低资源客户端提供支持的开发中网络。 +lang: zh +--- + +以太坊是由运行以太坊客户端软件的计算机组成的网络。 其中每一台电脑都称为“节点”。 客户端软件让节点能够发送和接收以太坊网络上的数据,并根据以太坊协议规则验证数据。 节点在其磁盘存储中保存大量历史数据,并且当它们从网络上的其他节点接收到新的数据包(即区块)时就添加到里面。 对于始终检查一个节点是否具有和网络其他部分一致的信息,这是必不可少的。 这意味着运行一个节点需要大量磁盘空间。 一些节点操作也需要占用大量 RAM。 + +为了解决这一磁盘存储问题,开发出了“轻”节点,它从全节点请求信息,而不是自己存储数据。 但是,这意味着轻节点无法独立验证信息,而是信任另一个节点。 它也意味着全节点需要承担额外的工作来服务那些轻节点。 + +门户网络是一种针对以太坊的新型网络设计,旨在通过在整个网络以小数据块的形式分享必要的数据,解决“轻”节点的数据可用性问题,让轻节点无需信任全节点或者向其增加额外压力。 + +关于[节点和客户端](/developers/docs/nodes-and-clients/)的更多信息 + +## 为什么需要门户网络 {#why-do-we-need-portal-network} + +以太坊节点在本地存储以太坊区块链的全部或部分副本。 这个本地副本用来验证交易并确保节点追随正确的链。 这些本地存储的数据让节点能够独立验证传入的数据是否正确有效,而无需信任任何其他实体。 + +区块链以及相关状态和收据数据的本地副本占用节点硬盘中的大量空间。 例如,要运行使用 [Geth](https://geth.ethereum.org) 搭配一种共识客户端的节点,推荐 2TB 硬盘。 快照同步只存储近期一组区块的链数据,采用这种同步时,Geth 一般占用约 650 GB的磁盘空间但是所需空间以每周大概 14GB 的速度增长(你可以定期将节点删除到 650 GB)。 + +这意味着运行节点的成本相当昂贵,因为大量的磁盘空间必须专门给以太坊使用。 以太坊路线图上针对这个问题有几种解决方案,包括[历史数据到期](/roadmap/statelessness/#history-expiry)、[状态数据到期](/roadmap/statelessness/#state-expiry)和[无状态性](/roadmap/statelessness/)。 但是,这些方案很可能要好几年才能实现。 还有不自己保存链数据副本的[轻节点](/developers/docs/nodes-and-clients/light-clients/),它们从全节点请求需要的数据。 然而,这意味着轻节点必须信任全节点会提供诚实的数据,并会给全节点带来压力,它们不得不提供轻节点所需的数据。 + +门户网络旨在提供一种可选方案,让轻节点无需信任全节点或者不会让全节点显著增加工作量,就可以获得需要的数据。 其运作原理是为以太坊节点引入了一种在整个网络中分享数据的新方式。 + +## 门户网络如何运作? {#how-does-portal-network-work} + +以太坊节点有着严格的协议,协议定义节点如何相互通信。 执行客户端使用一组子协议 [DevP2P](/developers/docs/networking-layer/#devp2p) 通信,而共识客户端使用一组不同的子协议 [libP2P](/developers/docs/networking-layer/#libp2p)。 这些子协议定义了可以在节点间传送的数据类型。 + +![devP2P 和 libP2P](portal-network-devp2p-libp2p.png) + +节点还能通过 [JSON-RPC 应用程序接口](/developers/docs/apis/json-rpc/)提供特定数据,这就是应用程序和钱包与以太坊节点交换信息的方式。 但是,这些都不是为轻客户端提供数据的理想协议。 + +轻客户端目前不能通过 DevP2P 或 libP2p 请求特定的链数据,因为这些协议只用于支持链同步和区块与交易的传播。 轻客户端不想要下载这类信息,因为那将无法让它们保持“轻量”。 + +JSON-RPC 也不是轻客户端请求数据的理想选择,因为它必须要连接到能够提供数据的特定全节点或中心化远程过程调用提供者。 这意味着轻客户端必须信任特定节点或提供者是诚实的,并且全节点很可能不得不处理来自许多轻客户端的大量请求,这提高了它们对带宽的要求. + +门户网络的关键是重新思考整个设计,为轻量化专门设计,摆脱现有以太坊客户端的设计限制。 + +门户网络的核心理念是采用目前网络堆栈的精华部分,它利用[分布式哈希表](https://en.wikipedia.org/wiki/Distributed_hash_table),通过轻量级 DevP2P 风格的对等去中心化网络提供轻客户端所需的信息,比如历史数据和当前链头的身份(与 Bittorrent 类似)。 + +这种想法是将以太坊全部历史数据的一小部分和一些特定节点职责添加给每个节点。 然后,通过搜索所请求的特定数据的存储节点,从中检索数据完成请求。 + +这颠覆了轻节点请求数据的普通模式,即查找单个节点然后请求它们筛选并提供大量数据;相反,轻节点快速筛选大型节点网络,其中每个节点处理少量数据。 + +目标是允许去中心化轻量级门户客户端网络: + +- 跟踪链头 +- 同步最近的和历史链数据 +- 检索状态数据 +- 广播交易 +- 使用[以太坊虚拟机](/developers/docs/evm/)执行交易 + +这种网络设计的优势在于: + +- 减少对中心化提供者的依赖 +- 减少网络带宽使用 +- 最小化或零同步 +- 让资源有限的设备(<1GB ram、<100mB 磁盘、1 个 CPU)可访问 + +下表展示了门户网络可提供的现有客户端的功能,让用户可在极低资源设备上访问它们。 + +![门户网络表](portal-network-table2.png) + +## 默认支持客户端多样性 {#client-diversity-as-default} + +门户网络开发者一开始还做出了设计选择:构建三种不同的门户网络客户端。 + +这些门户网络客户端如下: + +- [Trin](https://github.com/ethereum/trin):用 Rust 编写 +- [Fluffy](https://nimbus.team/docs/fluffy.html):用 Nim 编写 +- [Ultralight](https://github.com/ethereumjs/ultralight):用 Typescript 编写 + +多种独立客户端实现提升了以太坊网络的弹性和去中心化。 + +如果一种客户端遇到问题或者出现漏洞,其他客户端能继续平稳运行,防止单点故障。 另外,多样化的客户端实现促进了创新和竞争,推动改进并降低生态系统内的单一作物风险。 + +## 延伸阅读 {#futher-reading} + +- [门户网络(Piper Merriam 在 Devcon Bogota 上的讲解)](https://www.youtube.com/watch?v=0stc9jnQLXA)。 +- [门户网络 discord](https://discord.gg/CFFnmE7Hbs) +- [门户网络网站](https://www.ethportal.net/) diff --git a/public/content/translations/zh/developers/docs/programming-languages/dart/index.md b/public/content/translations/zh/developers/docs/programming-languages/dart/index.md index 83359b6a91c..0f7cd12edcf 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/dart/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/dart/index.md @@ -9,20 +9,20 @@ incomplete: true ## 教程 {#tutorials} -- [Flutter 和区块链 – Hello World 去中心化应用程序](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/)带您了解所有步骤,内容包括: +- [Flutter 和区块链 – Hello World 去中心化应用程序](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/)带你了解所有步骤,内容包括: 1. 安装 [Truffle 开发套件](https://www.trufflesuite.com/) 2. 使用 [Solidity](https://soliditylang.org/) 编写一个智能合约 3. 使用 Dart 编写一个用户界面 - 如果你已经了解基础知识,[使用 Flutter 构建移动去中心化应用程序](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a)的篇幅要短得多,效果可能更好 -- 如果您喜欢通过观看视频来学习,可以观看 [创建您的第一个区块链 Flutter 应用](https://www.youtube.com/watch?v=3Eeh3pJ6PeA),时长大概一个小时 -- 如果您不想花这么多时间,您可能喜欢[在以太坊上使用 Flutter 和 Dart 创建去中心化的区块链应用](https://www.youtube.com/watch?v=jaMFEOCq_1s),时长仅约 20 分钟 +- 如果你喜欢通过观看视频来学习,可以观看[构建你的第一个区块链 Flutter 应用程序](https://www.youtube.com/watch?v=3Eeh3pJ6PeA),时长大约一个小时 +- 如果你不想花这么多时间,你可能喜欢[在以太坊上使用 Flutter 和 Dart 创建去中心化的区块链应用](https://www.youtube.com/watch?v=jaMFEOCq_1s),时长仅约 20 分钟 - [将 MetaMask 集成到 Flutter 应用程序中](https://youtu.be/8qzVDje3IWk) — 这个短片会带你了解如何一步步将 MetaMask 集成到你的 Flutter 应用程序中。 ## 使用以太坊客户端 {#working-with-ethereum-clients} -您可以使用以太坊来创建去中心化应用程序(或称“dapp”),这种应用可以利用加密货币和区块链技术。 Dart 当前至少维护了两个调用以太坊 [JSON RPC 应用程序接口](/developers/docs/apis/json-rpc/)的库。 +你可以使用以太坊来创建去中心化应用程序(或称“dapp”),这种应用可以利用加密货币和区块链技术。 Dart 当前至少维护了两个调用以太坊 [JSON RPC 应用程序接口](/developers/docs/apis/json-rpc/)的库。 1. [来自 simonbutler.eu 的 Web3dart](https://pub.dev/packages/web3dart) 1. [来自 darticulate.com 的以太坊 5.0.0](https://pub.dev/packages/ethereum) -还有其他的一些库,可用于操作特定的以太坊地址或者让您检索各种加密货币的价格。 [您可以在这里查看完整的列表](https://pub.dev/dart/packages?q=ethereum)。 +还有其他的一些库,可用于操作特定的以太坊地址或者让你检索各种加密货币的价格。 [你可以在这里查看完整的列表](https://pub.dev/dart/packages?q=ethereum)。 diff --git a/public/content/translations/zh/developers/docs/programming-languages/delphi/index.md b/public/content/translations/zh/developers/docs/programming-languages/delphi/index.md index 6d5d6f1e55f..1eff5a22461 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/delphi/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/delphi/index.md @@ -13,7 +13,7 @@ incomplete: true 使用以太坊来创建去中心化应用程序,发挥加密货币和区块链技术的优势。 这些去中心化应用程序可以是值得信赖的,也即一旦被部署到以太坊上,它们将总是按程序运行。 这些应用程序可以控制数字资产,以便创造新的金融应用; 它们可以是去中心化的,也即没有任何单一实体或个人能够控制它们,而且它们几乎是不可能被审查的。 -在以太坊顶部构建去中心化应用,并使用 Delphi 编程语言与智能合约交互! +在以太坊顶部构建去中心化应用程序,并使用 Delphi 编程语言与智能合约交互! ## 智能合约和 Solidity 语言入门 {#getting-started-with-smart-contracts-and-the-solidity-language} @@ -23,7 +23,7 @@ incomplete: true - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## 初学者参考文献和链接 {#beginner-references-and-links} diff --git a/public/content/translations/zh/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/zh/developers/docs/programming-languages/dot-net/index.md index 7076172b121..73e05baaa9d 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/dot-net/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/dot-net/index.md @@ -19,7 +19,7 @@ incomplete: true - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## 初学者参考文献和链接 {#beginner-references-and-links} @@ -46,7 +46,7 @@ incomplete: true ## 面向中等程度用户的文章 {#intermediate-articles} - [Nethereum 练习册/样本列表](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) -- [部署您自己的开发测试链](https://github.com/Nethereum/Testchains) +- [部署你自己的开发测试链](https://github.com/Nethereum/Testchains) - [Solidity 的 VSCode Codegen 插件](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) - [Unity 和以太坊:为何以及如何?](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) - [为以太坊 dapp 创建 ASP.NET Core Web API](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) @@ -76,7 +76,7 @@ incomplete: true ## .NET 社区贡献者 {#dot-net-community-contributors} -在 Nethereum,我们主要活跃于 [Gitter](https://gitter.im/Nethereum/Nethereum) 上,任何人都可以前来提问/回答问题,获得帮助或者前来逛逛。 可以随意在 [Nethereum GitHub 存储库](https://github.com/Nethereum)上提交拉取请求或者打开一个问题,或者仅仅浏览我们提供的许多小项目/示例项目。 您可以在 [Discord](https://discord.gg/jQPrR58FxX) 上找到我们! +在 Nethereum,我们主要活跃于 [Gitter](https://gitter.im/Nethereum/Nethereum) 上,任何人都可以前来提问/回答问题,获得帮助或者前来逛逛。 可以随意在 [Nethereum GitHub 存储库](https://github.com/Nethereum)上提交拉取请求或者打开一个问题,或者仅仅浏览我们提供的许多小项目/示例项目。 你可以在 [Discord](https://discord.gg/jQPrR58FxX) 上找到我们! 如果你是 Nethermind 的新手并且需要入门帮助,请加入我们的 [Discord](http://discord.gg/PaCMRFdvWT)。 我们的开发人员随时准备回答你的问题。 不要犹豫,在 [Nethermind GitHub 存储库](https://github.com/NethermindEth/nethermind)上打开一个拉取请求或提出任何问题。 diff --git a/public/content/translations/zh/developers/docs/programming-languages/golang/index.md b/public/content/translations/zh/developers/docs/programming-languages/golang/index.md index 5123930562a..875cb55ac17 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/golang/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/golang/index.md @@ -7,7 +7,7 @@ incomplete: true 学习如何使用基于 Go 的项目和工具参与以太坊的开发 -使用以太坊创建去中心化应用(即"dapps")。 这些去中心化应用程序可被信任,意味着一旦被部署到以太坊上,它们将总是按既定程序运行。 它们是去中心化的,意味着它们运行在一个点对点网络中并且不存在单点故障。 不存在单一实体或者个人可以控制它们,它们也几乎不可能被审查。 它们可以通过控制数字资产来创建新的应用。 +使用以太坊创建去中心化应用程序(即"dapps")。 这些去中心化应用程序可被信任,意味着一旦被部署到以太坊上,它们将总是按既定程序运行。 它们是去中心化的,意味着它们运行在一个点对点网络中并且不存在单点故障。 不存在单一实体或者个人可以控制它们,它们也几乎不可能被审查。 它们可以通过控制数字资产来创建新的应用。 ## 智能合约和 Solidity 语言入门 {#getting-started-with-smart-contracts-and-solidity} @@ -17,7 +17,7 @@ incomplete: true - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) - [智能合约教程](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) @@ -27,7 +27,7 @@ incomplete: true - [开始使用 Geth](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458) - [使用 Golang 连接到以太坊](https://www.youtube.com/watch?v=-7uChuO_VzM) - [使用 Golang 部署以太坊智能合约](https://www.youtube.com/watch?v=pytGqQmDslE) -- [一步步教您测试和部署以太坊 Go 语言智能合约](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) +- [一步步教你测试和部署以太坊 Go 语言智能合约](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) - [电子书:使用 Go 开发以太坊](https://goethereumbook.org/) - _使用 Go 开发以太坊应用程序_ ## 面向中等程度用户的文章和文档 {#intermediate-articles-and-docs} @@ -57,7 +57,7 @@ incomplete: true - [Erigon](https://github.com/ledgerwatch/erigon) - _Go 以太坊的更快衍生品,专注于归档节点_ - [Golem](https://github.com/golemfactory/golem) - _Golem 正在创建一个算力全球市场_ - [Quorum](https://github.com/jpmorganchase/quorum) - _支持数据隐私的许可型以太坊实现_ -- [Prysm](https://github.com/prysmaticlabs/prysm) - _以太坊 ‘Serenity’2.0 Go 实现_ +- [Prysm](https://github.com/prysmaticlabs/prysm) - _以太坊 'Serenity' 2.0 Go 实现_ - [Eth Tweet](https://github.com/yep/eth-tweet) - _去中心化 Twitter:运行在以太坊区块链上的微博客服务_ - [Plasma MVP Golang](https://github.com/kyokan/plasma) — _Golang 实现以及最小可执行 Plasma 规范拓展_ - [Open Ethereum Mining Pool](https://github.com/sammy007/open-ethereum-pool) - _以太坊开源矿池_ @@ -66,7 +66,7 @@ incomplete: true - [Geth Light Client](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _轻量级以太坊子协议的 Geth 实现_ - [以太坊 Golang 软件开发工具包](https://github.com/everFinance/goether) - _Golang 中的简单以太坊钱包实现和实用程序_ -想要获取更多的资源? 请浏览 [ethereum.org/developers](/developers/)。 +想要获取更多的资源? 请查看 [ethereum.org/developers](/developers/)。 ## Go 社区贡献者 {#go-community-contributors} diff --git a/public/content/translations/zh/developers/docs/programming-languages/index.md b/public/content/translations/zh/developers/docs/programming-languages/index.md index d73b2c35ac7..5def3068072 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/index.md @@ -4,13 +4,13 @@ description: lang: zh --- -一个常见的误解是开发者必须编写[智能合约](/developers/docs/smart-contracts/)才能在以太坊上构建。 这是错误的。 以太坊网络及其社区的一个美好之处是您可以使用任意编程语言[参与](/community/)其中。 +一个常见的误解是开发者必须编写[智能合约](/developers/docs/smart-contracts/)才能在以太坊上构建。 这是错误的。 以太坊网络及其社区的一个美好之处是你可以使用任意编程语言[参与](/community/)其中。 -以太坊及其社区拥抱开源。 您可以找到各种语言的社区项目 - 客户端实现、API、开发框架、测试工具。 +以太坊及其社区拥抱开源。 你可以找到各种语言的社区项目 - 客户端实现、API、开发框架、测试工具。 -## 选择您的语言 {#data} +## 选择你的语言 {#data} -选择您使用的编程语言以便查找项目、资源和虚拟社区: +选择你使用的编程语言以便查找项目、资源和虚拟社区: - [面向 Dart 开发者的以太坊资源](/developers/docs/programming-languages/dart/) - [面向 Delphi 开发者的以太坊资源](/developers/docs/programming-languages/delphi/) @@ -24,6 +24,6 @@ lang: zh ### 如果不支持我的语言怎么办 {#other-lang} -如果您想链接到资源或指向额外编程语言的虚拟社区,您可以通过[提出问题](https://github.com/ethereum/ethereum-org-website/issues/new/choose) 来申请新页面。 +如果你想链接到资源或指向额外编程语言的虚拟社区,你可以通过[提出问题](https://github.com/ethereum/ethereum-org-website/issues/new/choose) 来申请新页面。 -如果只想使用当前不支持的语言 编写与区块链对接的代码,您可以使用 [JSON-RPC 接口](/developers/docs/apis/json-rpc/)连接以太坊网络。 任何可以使用 TCP/IP 的编程 语言都可以使用此接口。 +如果只想使用当前不支持的语言 编写与区块链对接的代码,你可以使用 [JSON-RPC 接口](/developers/docs/apis/json-rpc/)连接以太坊网络。 任何可以使用 TCP/IP 的编程 语言都可以使用此接口。 diff --git a/public/content/translations/zh/developers/docs/programming-languages/java/index.md b/public/content/translations/zh/developers/docs/programming-languages/java/index.md index 39240191ad0..70dcc27943e 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/java/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/java/index.md @@ -17,7 +17,7 @@ incomplete: true - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## 使用以太坊客户端 {#working-with-ethereum-clients} @@ -31,7 +31,7 @@ incomplete: true - [监听以太坊智能合约事件](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) - [使用 Besu (Pantheon), Linux 下的 Java 以太坊客户端](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) - [在 Java 集成测试中运行一个 Hyperledger Besu (Pantheon) 节点](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) -- [Web3j 备忘单]() +- [Web3j 备忘单](https://kauri.io/web3j-cheat-sheet-(java-ethereum)/5dfa1ea941ac3d0001ce1d90/c) ## 面向中等程度用户的文章 {#intermediate-articles} diff --git a/public/content/translations/zh/developers/docs/programming-languages/javascript/index.md b/public/content/translations/zh/developers/docs/programming-languages/javascript/index.md index 3cabf59242d..37a56e5829a 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/javascript/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/javascript/index.md @@ -4,7 +4,7 @@ description: 学习如何使用并通过基于 JavaScript 的项目及工具参 lang: zh --- -JavaScript 是以太坊生态中最受欢迎的语言之一。 事实上,有一个 [团队](https://github.com/ethereumjs) 致力于尽可能多地在以太坊引入 JavaScript。 +JavaScript是以太坊生态中最受欢迎的语言之一。 事实上,有一个 [团队](https://github.com/ethereumjs) 致力于尽可能多地在以太坊引入 JavaScript。 有机会在[堆栈的所有级别](/developers/docs/ethereum-stack/)使用 JavaScript(或接近)。 @@ -12,9 +12,9 @@ JavaScript 是以太坊生态中最受欢迎的语言之一。 事实上,有 ### JavaScript API 库 {#javascript-api-libraries} -如果您想要写入 JavaScript 来查询区块链、发送交易等,则最方便的方法是使用 [JavaScript API 库](/developers/docs/apis/javascript/)。 这些 API 允许开发者轻松与[以太坊网络节点](/developers/docs/nodes-and-clients/)交互。 +如果你想要写入 JavaScript 来查询区块链、发送交易等,则最方便的方法是使用 [JavaScript API 库](/developers/docs/apis/javascript/)。 这些 API 允许开发者轻松与[以太坊网络节点](/developers/docs/nodes-and-clients/)交互。 -您可以使用这些库与以太坊上的智能合约交互,因此只需要使用 JavaScript 与既有合约交互就可以构建一个 dapp。 +你可以使用这些库与以太坊上的智能合约交互,因此只需要使用 JavaScript 与既有合约交互就可以构建一个 dapp。 **参阅:** @@ -34,7 +34,7 @@ JavaScript 是以太坊生态中最受欢迎的语言之一。 事实上,有 有用 JavaScript 实现的[以太坊虚拟机](/developers/docs/evm/)。 它支持最新的分叉(fork)规则。 分叉规则是指因计划的升级而对 EVM 进行的改造。 -它被拆分成各种 JavaScript 软件包,以便您可以更好地了解: +它被拆分成各种 JavaScript 软件包,以便你可以更好地了解: - 帐户 - 区块 @@ -42,9 +42,9 @@ JavaScript 是以太坊生态中最受欢迎的语言之一。 事实上,有 - 交易 - 更多... -这将有助于您理解像“一个帐户的数据结构是什么?”这样的问题。 +这将有助于你理解像“一个帐户的数据结构是什么?”这样的问题。 -如果您倾向于阅读代码,下面的 JavaScript 代码可以很好地成为通读文档的替代方案。 +如果你倾向于阅读代码,下面的 JavaScript 代码可以很好地成为通读文档的替代方案。 **参阅 monorepo** [`ethereumjs`](https://github.com/ethereumjs/ethereumjs-vm) @@ -53,7 +53,7 @@ JavaScript 是以太坊生态中最受欢迎的语言之一。 事实上,有 目前正在开发的 Ethereumjs 客户端允许你发掘以太坊客户端如何使用你能理解的语言 (JavaScript) 工作! -它曾经在独立的[`存储库`](https://github.com/ethereumjs/ethereumjs-client)中托管,然而,后来它被作为一个包整合进了 EthereumVM monorepo。 +它曾经在独立的[`存储库`](https://github.com/ethereumjs/ethereumjs-client)中托管,然而,后来作为一个包整合进了 EthereumVM monorepo。 **参阅客户端** [`ethereumjs-client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) diff --git a/public/content/translations/zh/developers/docs/programming-languages/python/index.md b/public/content/translations/zh/developers/docs/programming-languages/python/index.md index 07efc1d4787..239be9c09a5 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/python/index.md @@ -17,7 +17,7 @@ incomplete: true - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## 初学者文章 {#beginner-articles} @@ -25,7 +25,7 @@ incomplete: true - [以太坊开发者指南 (Python)](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) - [2023 区块链报告中的 Python 状态](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) - [基于 Vyper 的智能合约简介](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) -- [使用 Python 和 Brownie 部署您自己的 ERC20 代币](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) +- [使用 Python 和 Brownie 部署你自己的 ERC20 代币](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) - [如何使用 Python Flask 开发 Ethereum 合约?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) - [Web3.py 简介 · 面向 Python 开发者的以太坊资源](https://www.dappuniversity.com/articles/web3-py-intro) - [如何通过 Python 和 web3.py 调用智能合约函数?](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py) @@ -36,7 +36,7 @@ incomplete: true - [创建 Python 以太坊接口:第 1 部分](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) - [基于 Python 的以太坊智能合约开发:完整(入门)教程](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) - [使用 Brownie 和 Python 部署智能合约](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) -- [使用 Brownie 在 OpenSea 上创建 NFT](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) +- [使用 Brownie 在 OpenSea 上创建非同质化代币](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) ## 面向高等程度用户的使用模式 {#advanced-use-patterns} @@ -82,7 +82,7 @@ incomplete: true ## Python 社区讨论 {#python-community-contributors} - [以太坊 Python 社区 Discord](https://discord.gg/9zk7snTfWe),适合讨论 Web3.py 和其他 Python 框架 -- [Vyper Discord](<[https://discord.gg/9zk7snTfWe](https://discord.gg/SdvKC79cJk)>),适合讨论 Vyper 智能合约编程 +- [Vyper Discord](https://discord.gg/SdvKC79cJk),适合讨论 Vyper 智能合约编程 ## 其他汇总列表 {#other-aggregated-lists} diff --git a/public/content/translations/zh/developers/docs/programming-languages/ruby/index.md b/public/content/translations/zh/developers/docs/programming-languages/ruby/index.md index f69d4101d3b..2d979891d29 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/ruby/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/ruby/index.md @@ -7,7 +7,7 @@ incomplete: false 了解如何使用基于 Ruby 的项目和工具为以太坊进行开发。 -使用以太坊来创建去中心化应用程序,发挥加密货币和区块链技术的优势。 这些去中心化应用程序可以无需信任,这意味着在部署到以太坊后,它们将始终按程序设定运行。 去中心化应用程序可以控制数字资产,从而创建新类型的金融应用程序。 它们可以是去中心化的,即没有任何单一实体或个人控制它们,而且它们几乎不可能被审查。 +使用以太坊来创建去中心化应用程序,发挥加密货币和区块链技术的优势。 这些去中心化应用程序可以去信任,这意味着在部署到以太坊后,它们将始终按程序设定运行。 去中心化应用程序可以控制数字资产,从而创建新类型的金融应用程序。 它们可以是去中心化的,即没有任何单一实体或个人控制它们,而且它们几乎不可能被审查。 ## 智能合约和 Solidity 语言入门 {#getting-started-with-smart-contracts-and-solidity} @@ -17,7 +17,7 @@ incomplete: false - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## 初学者文章 {#beginner-articles} diff --git a/public/content/translations/zh/developers/docs/programming-languages/rust/index.md b/public/content/translations/zh/developers/docs/programming-languages/rust/index.md index d164557c8ec..134202a3f9e 100644 --- a/public/content/translations/zh/developers/docs/programming-languages/rust/index.md +++ b/public/content/translations/zh/developers/docs/programming-languages/rust/index.md @@ -17,7 +17,7 @@ incomplete: true - [区块链详解](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) - [理解智能合约](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) -- [编写您的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [编写你的第一个智能合约](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) - [学习如何编写和部署 Solidity](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) ## 初学者文章 {#beginner-articles} @@ -25,7 +25,6 @@ incomplete: true - [选择以太坊客户端](https://www.trufflesuite.com/docs/truffle/reference/choosing-an-ethereum-client) - [Rust 以太坊客户端](https://openethereum.github.io/) \* **注意 OpenEthereum [已被废弃](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd)并已停止维护。** 请谨慎使用,最好切换至其他客户端实现。 - [使用 Rust 向以太坊发送交易](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) -- [Parity 以太坊客户端智能合约简介](https://wiki.parity.io/Smart-Contracts) - [如何用 Rust Wasm 为 Kovan 编写合约的分步教程](https://github.com/paritytech/pwasm-tutorial) ## 面向中等程度用户的文章 {#intermediate-articles} @@ -36,7 +35,6 @@ incomplete: true - [使用 JavaScript 和 Rust 搭建去中心化聊天室](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) - [使用 Vue.js 和 Rust 构建一个去中心化待办事项应用程序](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) -- [Secret Contracts 介绍](https://blog.enigma.co/getting-started-with-enigma-an-intro-to-secret-contracts-cdba4fe501c2) - [使用 Rust 构建区块链](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) ## Rust 项目和工具 {#rust-projects-and-tools} @@ -52,9 +50,9 @@ incomplete: true - [Ethers_rs](https://github.com/gakonst/ethers-rs)- _以太坊库和钱包的实现_ - [SewUp](https://github.com/second-state/SewUp) - _一个帮助用户用 Rust 语言构建以太坊 Webassembly 合约的库,正如在公共后端中开发一样_ - [Substreams](https://github.com/streamingfast/substreams) - _并行化区块链数据索引技术_ -- [Reth](https://github.com/paradigmxyz/reth) - Reth 即 Rust 以太坊简称的发音,是新的以太坊全节点实现 +- [Reth](https://github.com/paradigmxyz/reth) - Reth 即 Rust Ethereum 简称的发音,是新的以太坊全节点实现 -想要获取更多的资源? 请浏览 [ethereum.org/developers](/developers/)。 +想要获取更多的资源? 请查看 [ethereum.org/developers](/developers/)。 ## Rust 社区贡献者 {#rust-community-contributors} diff --git a/public/content/translations/zh/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/zh/developers/docs/smart-contracts/anatomy/index.md index c8d6f64f690..4fbb36ed509 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/anatomy/index.md @@ -8,15 +8,15 @@ lang: zh ## 前置要求 {#prerequisites} -确保您已经先阅读了[智能合约](/developers/docs/smart-contracts/)。 本文档假设您已经熟悉某种编程语言,例如 JavaScript 或 Python。 +确保你已经先阅读了[智能合约](/developers/docs/smart-contracts/)。 本文档假设你已经熟悉某种编程语言,例如 JavaScript 或 Python。 ## 数据 {#data} -任何合约数据必须分配到一个位置:要么是`存储`,要么是`内存`。 在智能合约中修改存储消耗很大,因此您需要考虑数据在哪里存取。 +任何合约数据必须分配到一个位置:要么是`存储`,要么是`内存`。 在智能合约中修改存储消耗很大,因此你需要考虑数据在哪里存取。 ### 存储 {#storage} -持久性数据被称之为存储,由状态变量表示。 这些值被永久地存储在区块链上。 您需要声明一个类型,以便于合约在编译时可以跟踪它在区块链上需要多少存储。 +持久性数据被称之为存储,由状态变量表示。 这些值被永久地存储在区块链上。 你需要声明一个类型,以便于合约在编译时可以跟踪它在区块链上需要多少存储。 ```solidity // Solidity example @@ -64,10 +64,10 @@ storedData: int128 示例: -| **属性** | **状态变量** | **描述** | -| ----------------- | ------------ | ------------------------ | -| `block.timestamp` | uint256 | 当前区块的时间戳 | -| `msg.sender` | 地址 | 消息的发送者(当前调用) | +| **属性** | **状态变量** | **描述** | +| ----------------- | -------- | ------------ | +| `block.timestamp` | uint256 | 当前区块的时间戳 | +| `msg.sender` | 地址 | 消息的发送者(当前调用) | ## 函数 {#functions} @@ -168,7 +168,7 @@ def __init__(_beneficiary: address, _bidding_time: uint256): ## 编写函数 {#writing-functions} -您的函数需要: +你的函数需要: - 参数变量及其类型(如果它接受参数) - 声明为 internal/external @@ -202,11 +202,11 @@ contract ExampleDapp { ## 事件和日志 {#events-and-logs} -事件可以让您通过前端或其它订阅应用与您的智能合约通信。 当交易被挖矿执行时,智能合约可以触发事件并且将日志写入区块链,然后前端可以进行处理。 +事件可以让你通过前端或其它订阅应用与你的智能合约通信。 当交易被挖矿执行时,智能合约可以触发事件并且将日志写入区块链,然后前端可以进行处理。 ## 附带说明的例子 {#annotated-examples} -这是一些用 Solidity 写的例子。 如果希望运行这些代码,您可以在 [Remix](http://remix.ethereum.org) 中调试。 +这是一些用 Solidity 写的例子。 如果希望运行这些代码,你可以在 [Remix](http://remix.ethereum.org) 中调试。 ### Hello world {#hello-world} @@ -232,7 +232,7 @@ contract HelloWorld { // 构造器用于初始化合约的数据。 // 了解更多:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors constructor(string memory initMessage) public { - // 接受一个字符变量 `initMessage` + // 接受一个字符变量 `initMessage` // 并为合约的存储变量`message` 赋值 message = initMessage; } @@ -244,7 +244,7 @@ contract HelloWorld { } ``` -### 代币(Token) {#token} +### 代币 {#token} ```solidity pragma solidity ^0.5.10; @@ -447,7 +447,7 @@ contract CryptoPizza is IERC721, ERC165 { /** * 安全转账给定代币 ID 的所有权到其它地址 - * 如果目标地址是一个合约,则该合约必须实现 `onERC721Received`函数, + * 如果目标地址是一个合约,则该合约必须实现 `onERC721Received`函数, * 该函数调用了安全转账并且返回一个 magic value。 * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; * 否则,转账被回退。 diff --git a/public/content/translations/zh/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/zh/developers/docs/smart-contracts/compiling/index.md index b8818b5e87c..569d14d7b45 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/compiling/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/compiling/index.md @@ -1,11 +1,11 @@ --- title: 编译智能合约 -description: 解释您为什么需要编译智能合约以及编译实际上做了什么。 +description: 解释你为什么需要编译智能合约以及编译实际上做了什么。 lang: zh incomplete: true --- -您需要编译您的合约,以便您的 web 应用程序和以太坊虚拟机能够理解它。 +你需要编译你的合约,以便你的 web 应用程序和以太坊虚拟机能够理解它。 ## 前提条件 {#prerequisites} @@ -13,7 +13,7 @@ incomplete: true ## 以太坊虚拟机 {#the-evm} -要使[以太坊虚拟机](/developers/docs/evm/)能够运行您的合约,您的合约必须被编译为**字节码**。 编译过程把如下代码: +要使[以太坊虚拟机](/developers/docs/evm/)能够运行你的合约,你的合约必须被编译为**字节码**。 编译过程把如下代码: ```solidity pragma solidity 0.4.24; @@ -35,13 +35,13 @@ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x ## Web 应用程序 {#web-applications} -编译器还将生成您需要的**应用程序二进制接口 (ABI)** ,以便您的应用程序能够理解合约并调用合约的功能。 +编译器还将生成你需要的**应用程序二进制接口 (ABI)** ,以便你的应用程序能够理解合约并调用合约的功能。 ABI 是一份 JSON 文件,描述了部署的合约及这个智能合约的函数。 这在 web2 和 web3 之间的鸿沟上架起交流的桥梁 -[Javascript 客户端库](/developers/docs/apis/javascript/)将读取**应用程序二进制接口 (ABI)**,以便您在 Web 应用程序接口中调用您的智能合约。 +[Javascript 客户端库](/developers/docs/apis/javascript/)将读取**应用程序二进制接口 (ABI)**,以便你在 Web 应用程序接口中调用你的智能合约。 -以下是 ERC-20 代币合约的应用程序二进制接口。 ERC-20 是您可以在以太坊交易的代币。 +以下是 ERC-20 代币合约的应用程序二进制接口。 ERC-20 是你可以在以太坊交易的代币。 ```json [ diff --git a/public/content/translations/zh/developers/docs/smart-contracts/composability/index.md b/public/content/translations/zh/developers/docs/smart-contracts/composability/index.md index 89fce07aa60..5aeb586fa91 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/composability/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/composability/index.md @@ -7,7 +7,7 @@ incomplete: true ## 简介 {#a-brief-introduction} -智能合约在以太坊上是公开的,可视为开放式应用程序接口。 您不需要写自己的智能合约才能成为一个去中心化应用程序开发者,您只需要知道如何与它们交互。 例如,您可以使用现有的智能合约 [Uniswap](https://uniswap.exchange/swap),一个去中心化的交易所,在您的应用中处理代币交易逻辑 – 您并不需要一切从零开始。 看看他们的一些 [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) 和 [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts) 合约。 +智能合约在以太坊上是公开的,可视为开放式应用程序接口。 你不需要写自己的智能合约才能成为一个去中心化应用程序开发者,你只需要知道如何与它们交互。 例如,你可以使用现有的智能合约 [Uniswap](https://uniswap.exchange/swap),一个去中心化的交易所,在你的应用中处理代币交易逻辑 – 你并不需要一切从零开始。 看看他们的一些 [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) 和 [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts) 合约。 ## 什么是可组合性? {#what-is-composability} @@ -45,7 +45,7 @@ incomplete: true 如果某个代币在`交易所 A` 的交易价格高于`交易所 B`,你可以利用价格差赚取利润。 然而,只有当你有足够的资本来为交易提供资金的情况下,你才能做到这一点(即,从`交易所 B` 购买代币并在`交易所 A` 出售)。 -在你没有足够资金来支付交易的情况下,闪电贷可能是个理想的办法。 [闪电贷](/defi/#flash-loans)的技术含量较高,但最基本的逻辑是,你可以借入资产(无抵押品),并在*一笔*交易中返还相同的资产。 +在你没有足够资金来支付交易的情况下,闪电贷可能是个理想的办法。 [闪电贷](/defi/#flash-loans)的技术含量较高,但最基本的逻辑是,你可以借入资产(无抵押品),并在_一笔_交易中返还相同的资产。 回到我们最初的示例,仲裁交易者可以拿出大笔闪电贷,从`交易所 B` 购买代币,在`交易所 A` 出售它们,退还资本+利息,并将利润保留在同一笔交易中。 这种复杂的逻辑需要将多个合约的调用结合起来,如果智能合约缺乏互操作性,这种调用是不可能做到的。 @@ -66,7 +66,7 @@ incomplete: true ## 相关教程 {#related-tutorials} - [合约的可组合性:以太坊智能合约开发的基石](https://www.decentlabs.io/blog/contract-composability-the-building-blocks-of-ethereum-smart-contract-development) -- [使用 create-eth-app 启动你的去中心化应用程序前端开发](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– 概述如何使用 create-eth-app,借助开箱即用的流行智能合约创建应用程序。_ +- [使用 create-eth-app 启动去中心化应用程序前端开发](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– 概述如何使用 create-eth-app,借助开箱即用的热门智能合约创建应用程序。_ ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/zh/developers/docs/smart-contracts/deploying/index.md index e452a726f22..59aea604500 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/deploying/index.md @@ -10,26 +10,24 @@ lang: zh ## 前置要求 {#prerequisites} -在部署智能合约之前,您需要理解[以太坊网络](/developers/docs/networks/), [交易](/developers/docs/transactions/)和[详解智能合约](/developers/docs/smart-contracts/anatomy/)。 +在部署智能合约之前,你需要理解[以太坊网络](/developers/docs/networks/), [交易](/developers/docs/transactions/)和[详解智能合约](/developers/docs/smart-contracts/anatomy/)。 -部署一个合约也需要耗费以太币 (ETH),因为他们被存储在区块链上,所以您应该熟悉以太坊的[燃料和费用](/developers/docs/gas/)。 +部署一个合约也需要耗费以太币 (ETH),因为他们被存储在区块链上,所以你应该熟悉以太坊的[燃料和费用](/developers/docs/gas/)。 -最后,您需要在部署之前编译您的合约,所以请确保您已经阅读了[编译智能合约](/developers/docs/smart-contracts/compiling/)。 +最后,你需要在部署之前编译你的合约,所以请确保你已经阅读了[编译智能合约](/developers/docs/smart-contracts/compiling/)。 ## 如何部署智能合约 {#how-to-deploy-a-smart-contract} -### 您所需要的 {#what-youll-need} +### 你所需要的 {#what-youll-need} -- 您的合约字节码 – 这是通过[编译](/developers/docs/smart-contracts/compiling/)获得的。 -- 用作燃料的以太币 – 像其他交易一样,您需要设定燃料限制,这样就知道部署合约比简单的以太币交易需要更多的燃料。 +- 合约的字节码 – 可通过[编译](/developers/docs/smart-contracts/compiling/)生成 +- 用作燃料的以太币 – 像其他交易一样,你需要设定燃料限制,这样就知道部署合约比简单的以太币交易需要更多的燃料。 - 一个部署脚本或插件。 -- 通过以下方式之一可以访问[以太坊节点](/developers/docs/nodes-and-clients/):运行自己的节点、连接到公共节点或使用[节点服务](/developers/docs/nodes-and-clients/nodes-as-a-service/)的应用程序接口应用程序接口密钥。 +- 通过以下方式之一可以访问[以太坊节点](/developers/docs/nodes-and-clients/):运行自己的节点、连接到公共节点或使用[节点服务](/developers/docs/nodes-and-clients/nodes-as-a-service/)的应用程序接口密钥。 ### 部署智能合约的步骤 {#steps-to-deploy} -所涉及的具体步骤将取决于您使用的工具。 例如,查看[关于部署合约的安全帽文档](https://hardhat.org/guides/deploying.html)或[关于网络和应用程序部署的 Truffle 文档](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment)。 这是两个最受欢迎的智能合约部署工具,它们涉及到编写脚本来处理部署步骤。 - -一旦部署,您的合约将有一个以太坊地址,就像其它[帐户](/developers/docs/accounts/)一样。 +具体步骤将取决于使用的开发框架。 例如,你可以查看[安全帽提供的合约部署文档](https://hardhat.org/guides/deploying.html)或 [Foundry 提供 的智能合约部署与验证文档](https://book.getfoundry.sh/forge/deploying)。 如同其他[帐户](/developers/docs/accounts/)一样,部署后,你的合约将有一个以太坊地址,并且可以使用[源代码验证工具](/developers/docs/smart-contracts/verifying/#source-code-verification-tools)来验证。 ## 相关工具 {#related-tools} @@ -44,20 +42,14 @@ lang: zh - [GitHub](https://github.com/Tenderly) - [Discord](https://discord.gg/eCWjuvt) -**安全帽 - _用于编译、部署、测试和调试您的以太坊软件的开发环境_** +**安全帽 - _用于编译、部署、测试和调试你的以太坊软件的开发环境_** - [hardhat.org](https://hardhat.org/getting-started/) - [关于部署合约的文档](https://hardhat.org/guides/deploying.html) - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**Truffle -** **_开发环境、测试框架、部署通道及其他工具。_** - -- [trufflesuite.com](https://www.trufflesuite.com/) -- [关于网络和应用部署的文档](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment) -- [GitHub](https://github.com/trufflesuite/truffle) - -**thirdweb - _使用单一命令轻松地将任何合约部署到任何与 EVM 兼容的区块链_。** +**thirdweb - _使用一条命令轻松地将任何合约部署到任何与以太坊虚拟机兼容的区块链_** - [相关文档](https://portal.thirdweb.com/deploy/) diff --git a/public/content/translations/zh/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/zh/developers/docs/smart-contracts/formal-verification/index.md index fcbadeb3c85..7cf084c4f2f 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/formal-verification/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/formal-verification/index.md @@ -4,7 +4,7 @@ description: 以太坊智能合约的形式化验证概述 lang: zh --- -[智能合约](/developers/docs/smart-contracts/)让用户能够创建去中心化、无需信任和稳健的应用程序,给用户提供新的用例并解锁价值。 因为智能合约掌控着大量价值,对于开发者来说,安全性是一个关键考量。 +[智能合约](/developers/docs/smart-contracts/)让用户能够创建去中心化、去信任和稳健的应用程序,给用户提供新的用例并解锁价值。 因为智能合约掌控着大量价值,对于开发者来说,安全性是一个关键考量。 形式化验证是增强[智能合约安全性](/developers/docs/smart-contracts/security/)的推荐技术之一。 形式化验证采用[形式化方法](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/)指定、设计和验证程序,多年来一直用来确保关键硬件和软件系统的正确性。 @@ -20,7 +20,7 @@ lang: zh 在计算机科学中,[形式化模型](https://en.wikipedia.org/wiki/Model_of_computation)是指对计算过程的数学描述。 程序抽象成数学函数(方程),模型描述给定输入时如何计算函数的输出。 -形式化模型提供了一个抽象层次,可以在该抽象层次上对程序行为的分析进行评估。 有了形式化模型,便可以制定*形式化规范*,描述了需要的相关模型属性。 +形式化模型提供了一个抽象层次,可以在该抽象层次上对程序行为的分析进行评估。 有了形式化模型,便可以制定_形式化规范_,描述了需要的相关模型属性。 采用不同技术对智能合约建模,以便进行形式化验证。 例如,有些模型用来推理智能合约的高级行为。 这些建模技术对智能合约应用了黑盒视图,把智能合约视为接受输入然后根据这些输入执行计算的系统。 @@ -34,7 +34,7 @@ lang: zh 规范简单来说是指特定系统必须满足的技术要求。 在编程中,规范代表程序执行的总体思路(即程序应该做什么)。 -对于智能合约,形式化规范是指*属性*,即对于智能合约必须符合的要求的正式描述。 这些属性被描述成“不变量”,代表合约执行的逻辑断言,并且在任何情况下都必须无一例外始终为真。 +对于智能合约,形式化规范是指_属性_,即对于智能合约必须符合的要求的正式描述。 这些属性被描述成“不变量”,代表合约执行的逻辑断言,并且在任何情况下都必须无一例外始终为真。 因此,我们可以认为形式化规范是使用形式化语言编写的语句的集合,描述智能合约的预期执行。 规范涵盖合约的属性和定义合约在不同情况下的行为。 形式化验证的目的是确定智能合约是否具有这些属性(不变量)以及在执行过程中这些属性是否未被违反。 @@ -52,7 +52,7 @@ lang: zh 顾名思义,高级规范(又称为“面向模型的规范”)描述程序的高级行为。 高级规范把智能合约建模成一个[有限状态机](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM),有限状态机可以通过执行操作在不同的状态之间转换并使用时间逻辑定义有限状态机模型的形式化属性。 -[时间逻辑](https://en.wikipedia.org/wiki/Temporal_logic)是“用时间限定的命题的推理规则(例如,“我*总是*饿”或者“我*最终*会饿”)。” 当应用于形式化验证时,时间逻辑用来声明建模成状态机的系统的正确行为的断言。 具体而言,时间逻辑描述智能合约可以进入的未来状态以及它如何在不同状态之间转换。 +[时间逻辑](https://en.wikipedia.org/wiki/Temporal_logic)是“用时间限定的命题的推理规则(例如,“我_总是_饿”或者“我_最终_会饿”)。” 当应用于形式化验证时,时间逻辑用来声明建模成状态机的系统的正确行为的断言。 具体而言,时间逻辑描述智能合约可以进入的未来状态以及它如何在不同状态之间转换。 高级规范一般详述智能合约的两个关键时间属性:**安全性**和**活性**。 安全属性代表“任何坏事始终都不会发生”的想法,通常用来表示不变性。 安全属性可以定义常规软件要求(例如不发生[死锁](https://www.techtarget.com/whatis/definition/deadlock)),或者表达合约领域特定的属性(例如,函数访问控制的不变量、状态变量的容许值或代币转账的条件)。 @@ -64,17 +64,17 @@ lang: zh 高级规范以合约的有限状态模型作为起点,并定义该模型的所需属性。 相比之下,低级规范(又称为“面向属性的规范”)通常把程序(智能合约)建模成由数学函数集合组成的系统,并描述这类系统的正确行为。 -简言之,低级规范分析*程序跟踪*并尝试从这些跟踪中定义智能合约的属性。 跟踪是指改变智能合约状态的函数执行序列;因此,低级规范有助于规定合约内部执行的要求。 +简言之,低级规范分析_程序跟踪_并尝试从这些跟踪中定义智能合约的属性。 跟踪是指改变智能合约状态的函数执行序列;因此,低级规范有助于规定合约内部执行的要求。 低级形式化规范可以作为霍尔式属性或执行路径中的不变量来给出。 ### 霍尔式属性 {#hoare-style-properties} -[霍尔逻辑](https://en.wikipedia.org/wiki/Hoare_logic)提供了一套形式化规则来推理程序(包括智能合约)的正确性。 霍尔式属性使用霍尔三元组 {_P_}_c_{_Q_} 表示,其中 _c_ 代表程序,_P_ 和 _Q_ 是 _c_(即程序)状态的谓词,它们正式描述成*前置条件*和*后置条件*。 +[霍尔逻辑](https://en.wikipedia.org/wiki/Hoare_logic)提供了一套形式化规则来推理程序(包括智能合约)的正确性。 霍尔式属性使用霍尔三元组 {_P_}_c_{_Q_} 表示,其中 _c_ 代表程序,_P_ 和 _Q_ 是 _c_(即程序)状态的谓词,它们正式描述成_前置条件_和_后置条件_。 -前置条件是描述函数正确执行所需条件的谓词;用户调用合约必须满足该要求。 后置条件是描述函数在正确执行时所达成条件的谓词;用户在调用函数后可以期待该条件为真。 在霍尔逻辑中,*不变量*是一个在函数执行时保留的谓词(即它不改变)。 +前置条件是描述函数正确执行所需条件的谓词;用户调用合约必须满足该要求。 后置条件是描述函数在正确执行时所达成条件的谓词;用户在调用函数后可以期待该条件为真。 在霍尔逻辑中,_不变量_是一个在函数执行时保留的谓词(即它不改变)。 -霍尔式规范可以保证*部分正确性*或*完全正确性*。 如果在函数执行前前置条件为真,并且在执行终止时后置条件也为真,则合约函数的实现为“部分正确”。 如果在函数执行前前置条件为真,保证执行可以终止,并且当执行终止时后置条件为真,就可以得到完全正确性的证明。 +霍尔式规范可以保证_部分正确性_或_完全正确性_。 如果在函数执行前前置条件为真,并且在执行终止时后置条件也为真,则合约函数的实现为“部分正确”。 如果在函数执行前前置条件为真,保证执行可以终止,并且当执行终止时后置条件为真,就可以得到完全正确性的证明。 获得完全正确性的证明很难,因为有些执行在终止前可能会延迟,或者根本不会终止。 也就是说,执行是否终止可以说是一个有争议的问题,因为以太坊的燃料机制阻止程序无限循环(执行要么成功终止或者因为“燃料耗尽”错误而结束)。 @@ -100,7 +100,7 @@ lang: zh - 如果用户未给提案投票,可以要求退款 -执行轨迹级属性的示例可以是*“没有存入资金的用户无法对提案投票”*或*“未对提案投票的用户始终应该可以要求退款”*。 这两个属性断言优先执行次序(在存入资金*之前*无法投票和给提案投票*之后*无法要求退款)。 +执行轨迹级属性的示例可以是_“没有存入资金的用户无法对提案投票”_或_“未对提案投票的用户始终应该可以要求退款”_。 这两个属性断言优先执行次序(在存入资金_之前_无法投票和给提案投票_之后_无法要求退款)。 ## 智能合约的形式化验证技术 {#formal-verification-techniques} @@ -110,7 +110,7 @@ lang: zh 模型检查要求创建系统(即合约)的抽象数学表示并使用根植于[命题逻辑](https://www.baeldung.com/cs/propositional-logic)的公式表示该系统的属性。 这简化了模型检查算法的任务,即证明一个数学模型满足给定的逻辑公式。 -形式化验证的模型检查主要用来评估时间属性,后者描述合约在一段时间内的行为。 如前所述,智能合约的时间属性包括*安全*和*活性*。 +形式化验证的模型检查主要用来评估时间属性,后者描述合约在一段时间内的行为。 如前所述,智能合约的时间属性包括_安全_和_活性_。 例如,与访问控制有关的安全属性(例如,_只有合约的所有者才能调用 `selfdestruct`_)可以用形式化逻辑来编写。 此后,模型检查算法能验证合约是否满足此形式化规范。 @@ -120,7 +120,7 @@ lang: zh 定理证明是一种程序(包括智能合约)正确性的数学推理方法。 它涉及将合约系统的模型以及其规范转换成数学公式(逻辑语句)。 -定理证明的目的是验证这些语句之间的逻辑等价性。 “逻辑等价性”(又称为“逻辑双向蕴含”)是指两个语句之间的一种关系类型,即*当且仅当*语句二为真时,语句一才能为真。 +定理证明的目的是验证这些语句之间的逻辑等价性。 “逻辑等价性”(又称为“逻辑双向蕴含”)是指两个语句之间的一种关系类型,即_当且仅当_语句二为真时,语句一才能为真。 关于合约模型及其属性的语句之间的必要关系(逻辑等价性)被表述为一个可证明的语句(称为定理)。 使用形式化推理系统,自动化定理证明器可以验证该定理的有效性。 也就是说,定理证明器可以确证智能合约模型与其规范完全相符。 @@ -130,9 +130,9 @@ lang: zh ### 符号执行 {#symbolic-execution} -符号执行是一种通过使用*符号值*(例如 `x > 5`)而不是*具体值*(例如 `x == 5`)执行函数来分析智能合约的方法。 作为一种形式化验证技术,符号执行用来形式化推理合约代码中的执行轨迹级属性。 +符号执行是一种通过使用_符号值_(例如 `x > 5`)而不是_具体值_(例如 `x == 5`)执行函数来分析智能合约的方法。 作为一种形式化验证技术,符号执行用来形式化推理合约代码中的执行轨迹级属性。 -符号执行把执行轨迹表示成针对符号输入值的数学公式,也称为*路径谓词*。 [SMT 求解器](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories)用来检查路径谓词是否“可满足”(即存在一个满足公式的值)。 如果可以满足脆弱路径,SMT 求解器将产生一个具体值,将执行引向该路径。 +符号执行把执行轨迹表示成针对符号输入值的数学公式,也称为_路径谓词_。 [SMT 求解器](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories)用来检查路径谓词是否“可满足”(即存在一个满足公式的值)。 如果可以满足脆弱路径,SMT 求解器将产生一个具体值,将执行引向该路径。 假设智能合约的函数把 `uint` 值 (`x`) 作为输入,并且当 `x` 大于 `5` 且小于 `10` 时回滚。 使用正常测试程序寻找一个触发错误的 `x` 值需要运行数十个测试用例(或者更多),而且不保证能实际找到一个触发错误的输入。 @@ -170,7 +170,7 @@ function safe_add(uint x, uint y) returns(uint z){ 然而,这种方法无法证明不在样本里的输入值的正确执行。 因此,测试合约可能有助于检测到漏洞(即是否一些代码路径在执行过程中未能返回预期结果),但是**它无法确证没有漏洞存在**。 -相反,形式化验证可以形式化证明智能合约在无限执行范围内满足要求,而*无需*运行合约。 这需要制定精确描述正确合约行为的形式化规范并开发合约系统的形式化(数学)模型。 然后,我们可以按照形式化证明程序来检查合约模型与其规范是否一致。 +相反,形式化验证可以形式化证明智能合约在无限执行范围内满足要求,而_无需_运行合约。 这需要制定精确描述正确合约行为的形式化规范并开发合约系统的形式化(数学)模型。 然后,我们可以按照形式化证明程序来检查合约模型与其规范是否一致。 通过形式化验证,验证合约的业务逻辑是否满足要求的问题就变成一个能被证明或否定的数学命题。 通过形式化证明一个命题,我们可以使用有限的步骤验证无数个测试用例。 通过这种方式,形式化验证有更好的前景,可以证明依据规划合约的功能正确。 @@ -232,7 +232,7 @@ function safe_add(uint x, uint y) returns(uint z){ - [网站](https://www.certora.com/) - [相关文档](https://docs.certora.com/en/latest/index.html) -**Solidity SMTChecker** - _Solidity 的 SMTChecker 是一个基于 SMT(可满足性模理论)和 Horn 求解的内置模型检查器。 它在编译期间确认合约源代码是否符合规范并静态检查是否违反了安全属性。_ +**Solidity SMTChecker** - _Solidity 的SMTChecker 是一个基于 SMT(可满足性模理论)和 Horn 求解的内置模型检查器。 它在编译期间确认合约源代码是否符合规范并静态检查是否违反了安全属性。_ - [GitHub](https://github.com/ethereum/solidity) diff --git a/public/content/translations/zh/developers/docs/smart-contracts/index.md b/public/content/translations/zh/developers/docs/smart-contracts/index.md index 9295b96b5e3..68d9a4b758c 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/index.md @@ -8,13 +8,13 @@ lang: zh 智能合约只是一个运行在以太坊链上的一个程序。 它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。 -智能合约也是一个[以太坊帐户](/developers/docs/accounts/),我们称之为合约帐户。 这意味着它们有余额,可以成为交易的对象。 但是,他们无法被人操控,他们是被部署在网络上作为程序运行着。 个人用户可以通过提交交易执行智能合约的某一个函数来与智能合约进行交互。 智能合约能像常规合约一样定义规则,并通过代码自动强制执行。 默认情况下,您无法删除智能合约,与它们的交互是不可逆的。 +智能合约也是一个[以太坊帐户](/developers/docs/accounts/),我们称之为合约帐户。 这意味着它们有余额,可以成为交易的对象。 但是,他们无法被人操控,他们是被部署在网络上作为程序运行着。 个人用户可以通过提交交易执行智能合约的某一个函数来与智能合约进行交互。 智能合约能像常规合约一样定义规则,并通过代码自动强制执行。 默认情况下,你无法删除智能合约,与它们的交互是不可逆的。 ## 前置要求 {#prerequisites} -如果您刚刚入门或寻找技术含量较低的介绍,我们推荐我们的[智能合约简介](/smart-contracts/)。 +如果你刚刚入门或寻找技术含量较低的介绍,我们推荐我们的[智能合约简介](/smart-contracts/)。 -确保在您已深入了解[帐户](/developers/docs/accounts/)、[交易](/developers/docs/transactions/)和[以太坊虚拟机](/developers/docs/evm/),然后再开始学习智能合约。 +确保在你已深入了解[帐户](/developers/docs/accounts/)、[交易](/developers/docs/transactions/)和[以太坊虚拟机](/developers/docs/evm/),然后再开始学习智能合约。 ## 数字自动售货机 {#a-digital-vending-machine} @@ -67,7 +67,7 @@ contract VendingMachine { ## 无需准入性 {#permissionless} -任何人都可以编写智能合约并将其部署到区块链网络上。 您只需要学习如何用[智能合约语言编码](/developers/docs/smart-contracts/languages/),并有足够的以太币来部署您的合约。 部署智能合约在技术上是一笔交易,因此就像你需要为简单的以太币转账支付燃料费一样,你也需要为部署智能合约支付[燃料费](/developers/docs/gas/)。 但是,合约部署的燃料成本要高得多。 +任何人都可以编写智能合约并将其部署到区块链网络上。 你只需要学习如何用[智能合约语言编码](/developers/docs/smart-contracts/languages/),并有足够的以太币来部署你的合约。 部署智能合约在技术上是一笔交易,因此就像你需要为简单的以太币转账支付燃料费一样,你也需要为部署智能合约支付[燃料费](/developers/docs/gas/)。 但是,合约部署的燃料成本要高得多。 以太坊提供了对开发者友好的智能合约编程语言: @@ -88,7 +88,7 @@ contract VendingMachine { 智能合约本身无法获取有关“现实世界”事件的信息,因为它们无法从链下来源检索数据。 这意味着它们无法对现实世界中的事件作出响应。 这是设计使然。 因为依赖外部信息可能会影响共识,而共识对安全性和去中心化而言十分重要。 -然而,对于区块链应用来说,能够使用链下数据非常重要。 解决方案是[预言机](/developers/docs/oracles/),它们是将链下数据引入并使其可供智能合约使用的工具。 +然而,对于区块链应用程序来说,能够使用链下数据非常重要。 解决方案是[预言机](/developers/docs/oracles/),它们是将链下数据引入并供智能合约使用的工具。 智能合约的另一个限制是最大合约大小。 智能合约最大可达 24 KB,否则会消耗完燃料。 可以使用[钻石模式](https://eips.ethereum.org/EIPS/eip-2535)来规避它。 @@ -98,7 +98,7 @@ contract VendingMachine { ## 智能合约资源 {#smart-contract-resources} -**OpenZeppelin 合约\*\*** - _安全智能合约开发库。_\*\* +**OpenZeppelin 合约**** - _安全智能合约开发库。_** - [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) - [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) @@ -108,4 +108,4 @@ contract VendingMachine { - [Coinbase:什么是智能合约?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) - [Chainlink:什么是智能合约?](https://chain.link/education/smart-contracts) -- [视频:智能合约的简介](https://youtu.be/ZE2HxTmxfrI) +- [视频:智能合约简介](https://youtu.be/ZE2HxTmxfrI) diff --git a/public/content/translations/zh/developers/docs/smart-contracts/languages/index.md b/public/content/translations/zh/developers/docs/smart-contracts/languages/index.md index adae2e4b722..3813e795caa 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/languages/index.md @@ -4,7 +4,7 @@ description: 两种主要的智能合约语言(Solidity 和 Vyper)的概述 lang: zh --- -关于以太坊的一个重要方面是,智能合约可以使用相对友好的开发者语言编程。 如果您熟悉 Python 或任何[大括号语言](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages),可以找到一种语法熟悉的语言。 +关于以太坊的一个重要方面是,智能合约可以使用相对友好的开发者语言编程。 如果你熟悉 Python 或任何[大括号语言](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages),可以找到一种语法熟悉的语言。 最受欢迎和维护得最好的两种语言是: @@ -13,11 +13,11 @@ lang: zh 更有经验的开发者也可能想要使用 Yul:一种用于[以太坊虚拟机](/developers/docs/evm/)的中间语言,或者是 Yul+ 语言,这是一种 Yul 扩展。 -如果您很好奇,喜欢帮助测试仍在大力发展的新语言,则可以尝试使用 Fe,这是一种新兴的智能合约语言,目前仍处于起步阶段。 +如果你很好奇,喜欢帮助测试仍在大力发展的新语言,则可以尝试使用 Fe,这是一种新兴的智能合约语言,目前仍处于起步阶段。 ## 前提条件 {#prerequisites} -如果已经有编程语言(特别是关于 JavaScript 或 Python)知识,可以帮助您体验到智能合约语言的差异。 同时,我们建议您在深入理解语言差异之前,先理解作为概念的智能合约。 [智能合约简介](/developers/docs/smart-contracts/)。 +如果已经有编程语言(特别是关于 JavaScript 或 Python)知识,可以帮助你体验到智能合约语言的差异。 同时,我们建议你在深入理解语言差异之前,先理解作为概念的智能合约。 [智能合约简介](/developers/docs/smart-contracts/)。 ## Solidity {#solidity} @@ -25,8 +25,8 @@ lang: zh - 受 C++ 影响最深的大括号编程语言。 - 静态类型(编译时已知变量类型)。 - 支持: - - 继承(您可以拓展其它合约)。 - - 库(您可以创建从不同的合约调用的可重用代码 - 就像静态函数在其它面向对象编程语言的静态类中一样)。 + - 继承(你可以拓展其它合约)。 + - 库(你可以创建从不同的合约调用的可重用代码 - 就像静态函数在其它面向对象编程语言的静态类中一样)。 - 复杂的用户自定义类型。 ### 重要链接 {#important-links} @@ -35,7 +35,7 @@ lang: zh - [Solidity 语言网站](https://soliditylang.org/) - [Solidity 示例](https://docs.soliditylang.org/en/latest/solidity-by-example.html) - [GitHub](https://github.com/ethereum/solidity/) -- [Solidity Gitter Chatroom](https://gitter.im/ethereum/solidity) 桥接到 [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Solidity Gitter Chatroom](https://gitter.im/ethereum/solidity/) 桥接到 [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) - [备忘单](https://reference.auditless.com/cheatsheet) - [Solidity 博客](https://blog.soliditylang.org/) - [Solidity Twitter](https://twitter.com/solidity_lang) @@ -81,7 +81,7 @@ contract Coin { } ``` -这个示例应该能让您感觉到 Solidity 合约语法是什么样子的。 关于函数和变量的详细描述,[请查看文档](https://docs.soliditylang.org/en/latest/contracts.html)。 +这个示例应该能让你感觉到 Solidity 合约语法是什么样子的。 有关函数和变量的详细说明,[请参阅文档](https://docs.soliditylang.org/en/latest/contracts.html)。 ## Vyper {#vyper} @@ -90,7 +90,7 @@ contract Coin { - 小而且易懂的编译器代码 - 高效的字节码生成 - 为了让合约更安全和易于审核,特意提供比 Solidity 少的功能。 Vyper 不支持: - - 修饰符 + - 修改器 - 继承 - 内联汇编 - 函数重载 @@ -197,11 +197,11 @@ def endAuction(): send(self.beneficiary, self.highestBid) ``` -这个例子应该让您了解 Vyper 合约语法是什么样的。 有关函数和变量的详细说明,[请参阅文档](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction)。 +这个例子应该让你了解 Vyper 合约语法是什么样的。 有关函数和变量的详细说明,[请参阅文档](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction)。 ## Yul 和 Yul+ {#yul} -如果您是以太坊的新手并且尚未使用智能合约语言进行任何编码,我们建议您开始使用 Solidity 或 Vyper。 只有在您熟知智能合约安全最佳做法和使用 EVM 的具体细节后,才可以查看 Yul 或 Yul+。 +如果你是以太坊的新手并且尚未使用智能合约语言进行任何编码,我们建议你开始使用 Solidity 或 Vyper。 只有在你熟知智能合约安全最佳做法和使用 EVM 的具体细节后,才可以查看 Yul 或 Yul+。 **Yul** @@ -245,7 +245,7 @@ def endAuction(): } ``` -如果您已经熟悉智能合约,可以在 [此处找到 Yul 中的完整 ERC20 实例](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example)。 +如果你已经熟悉智能合约,可以在 [此处找到 Yul 中的完整 ERC20 实例](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example)。 ## Fe {#fe} @@ -289,13 +289,13 @@ contract GuestBook: 与任何其他编程语言一样,它主要是关于为合适的工作以及个人喜好选择合适的工具。 -如果您还没有尝试过任何一种语言,请考虑以下几点: +如果你还没有尝试过任何一种语言,请考虑以下几点: ### Solidity 的优点是什么? {#solidity-advantages} -- 如果您是初学者,这里有很多教程和学习工具。 在[通过编码学习](/developers/learning-tools/)部分了解更多相关信息。 +- 如果你是初学者,这里有很多教程和学习工具。 在[通过编码学习](/developers/learning-tools/)部分了解更多相关信息。 - 提供出色的开发者工具。 -- Solidity 拥有庞大的开发人员社区,这意味着您很可能会很快找到问题的答案。 +- Solidity 拥有庞大的开发人员社区,这意味着你很可能会很快找到问题的答案。 ### Vyper 的优点是什么? {#vyper-advatages} @@ -306,7 +306,7 @@ contract GuestBook: ### Yul 和 Yul+ 的优点是什么? {#yul-advantages} - 简单而实用的低级语言。 -- 允许更接近原始 EVM,这有助于优化合约的 gas 使用量。 +- 允许更接近原始 EVM,这有助于优化合约的燃料使用量。 ## 语言比较 {#language-comparisons} diff --git a/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md index cffc7abb8b4..25760538010 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/libraries/index.md @@ -4,7 +4,7 @@ description: lang: zh --- -您无需从头开始编写项目中的每一个智能合约 我们有许多开源代码的智能合约库可为您的项目提供可重复利用的构建块,从而使您不必重新开始。 +你无需从头开始编写项目中的每一个智能合约 我们有许多开源代码的智能合约库可为你的项目提供可重复利用的构建块,从而使你不必重新开始。 ## 前置要求 {#prerequisites} @@ -12,11 +12,11 @@ lang: zh ## 资料库中的内容 {#whats-in-a-library} -您通常可以在智能合约库中找到两种构建模块:可以添加到合约中的可复用代码,与各种标准的实现。 +你通常可以在智能合约库中找到两种构建模块:可以添加到合约中的可复用代码,与各种标准的实现。 ### 行为 {#behaviors} -当编写智能合约时,您很可能会发现自己在写重复的代码。 比如说在智能合约中指派一个*管理员*地址执行受保护的操作,或添加一个紧急*暂停*按钮以应对预料不到的问题。 +当编写智能合约时,你很可能会发现自己在写重复的代码。 比如说在智能合约中指派一个_管理员_地址执行受保护的操作,或添加一个紧急_暂停_按钮以应对预料不到的问题。 智能合约库通常提供这些行为的可复用实现方式为[标准库](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries)或在 solidity 中通过[继承](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance)的方式实现。 @@ -37,7 +37,7 @@ contract Ownable { } ``` -在您的合约中使用这个构建模块,您需要先导入它,然后在您自己的合约中扩展它。 这个将会允许您使用 `Ownable` 合约提供的修饰符来保护您的函数。 +在你的合约中使用这个构建模块,你需要先导入它,然后在你自己的合约中扩展它。 这个将会允许你使用 `Ownable` 合约提供的修改器来保护你的函数。 ```solidity import ".../Ownable.sol"; // Path to the imported library @@ -50,19 +50,19 @@ contract MyContract is Ownable { } ``` -另一个比较受欢迎的例子是 [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) 或[DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html)。 这些库(与基础合约不同)提供了语言本身不具有的带有溢出检查的算术函数。 使用这些库而不是本地的算术操作可以来防止您的合约出现溢出错误,这些错误可能会导致灾难性的后果! +另一个比较受欢迎的例子是 [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) 或[DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html)。 这些库(与基础合约不同)提供了语言本身不具有的带有溢出检查的算术函数。 使用这些库而不是本地的算术操作可以来防止你的合约出现溢出错误,这些错误可能会导致灾难性的后果! ### 标准 {#standards} -为了促进[可组合性和互操作性](/developers/docs/smart-contracts/composability/),以太坊社区已经以**以太坊意见征求**的形式定义了几个标准。 您可以在[标准](/developers/docs/standards/)部分阅读更多关于他们的信息。 +为了促进[可组合性和互操作性](/developers/docs/smart-contracts/composability/),以太坊社区已经以**以太坊意见征求**的形式定义了几个标准。 你可以在[标准](/developers/docs/standards/)部分阅读更多关于他们的信息。 -当将以太坊意见征求作为您的合约的一部分时,更好的做法是寻找已有的标准去实现而不是试图推出您自己的方式。 许多智能合约库包含了最流行的以太坊意见征求标准的实现。 例如,普遍存在的 [ERC20 同质化通证标准](/developers/tutorials/understand-the-erc-20-token-smart-contract/)可在 [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md) [DappSys](https://github.com/dapphub/ds-token/) 和 [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20) 中找到。 此外,一些以太坊意见征求还提供规范实现作为以太坊意见征求本身的一部分。 +当将以太坊意见征求作为你的合约的一部分时,更好的做法是寻找已有的标准去实现而不是试图推出你自己的方式。 许多智能合约库包含了最流行的以太坊意见征求标准的实现。 例如,普遍存在的 [ERC20 同质化通证标准](/developers/tutorials/understand-the-erc-20-token-smart-contract/)可在 [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md) [DappSys](https://github.com/dapphub/ds-token/) 和 [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20) 中找到。 此外,一些以太坊意见征求还提供规范实现作为以太坊意见征求本身的一部分。 值得一提的是,一些以太坊意见征求不是独立的,而是对其他以太坊意见征求的补充。 例如, [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) 为 ERC20 添加了一个扩展,以提高其可用性。 ## 如何添加库 {#how-to} -始终参考您所包含的库的文档,以获得关于如何将其包含在您的项目中的具体说明 一些 Solidity 合约库使用 `npm` 来打包,所以您可以直接 `npm` 安装它们。 大多数[编译](/developers/docs/smart-contracts/compiling/)合约的工具会在您的 node_modules 中查找智能合约库,所以您可以做以下工作。 +始终参考你所包含的库的文档,以获得关于如何将其包含在你的项目中的具体说明 一些 Solidity 合约库使用 `npm` 来打包,所以你可以直接 `npm` 安装它们。 大多数[编译](/developers/docs/smart-contracts/compiling/)合约的工具会在你的 `node_modules` 中查找智能合约库,所以你可以做以下工作。 ```solidity // This will load the @openzeppelin/contracts library from your node_modules @@ -73,17 +73,17 @@ contract MyNFT is ERC721 { } ``` -无论您使用哪种方法,当包括一个库时,总是要注意[语言](/developers/docs/smart-contracts/languages/)的版本。 例如,如果您用 Solidity 0.5 编写您的合约,您就不能使用 Solidity 0.6 的库。 +无论你使用哪种方法,当包括一个库时,总是要注意[语言](/developers/docs/smart-contracts/languages/)的版本。 例如,如果你用 Solidity 0.5 编写你的合约,你就不能使用 Solidity 0.6 的库。 ## 何时使用 {#when-to-use} -为您的项目使用智能合约库有几个好处。 首先,它为您提供了现成的构建模块,您可以将其纳入您的系统,而不必自己编码,从而节省了您的时间。 +为你的项目使用智能合约库有几个好处。 首先,它为你提供了现成的构建模块,你可以将其纳入你的系统,而不必自己编码,从而节省了你的时间。 安全性也是一个重要的优点。 开源智能合约库也经常受到严格审查。 鉴于许多项目都依赖于它们,社区有强烈的动机来对它们持续审计。 在应用程序代码中发现错误比在可重用的合约库中发现错误要常见得多。 一些库还接受了[外部审计](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audit),以提高安全性。 -然而,使用智能合约库有可能将您不熟悉的代码纳入您的项目。 导入一个合约并将其直接包含在您的项目中是很诱人的,但如果没有很好地理解该合约的作用,您可能会由于一个意外的行为而无意中在您的系统中引入一个问题。 一定要确保阅读您要导入的代码的文档,然后在使其成为您的项目的一部分之前审查代码本身。 +然而,使用智能合约库有可能将你不熟悉的代码纳入你的项目。 导入一个合约并将其直接包含在你的项目中是很诱人的,但如果没有很好地理解该合约的作用,你可能会由于一个意外的行为而无意中在你的系统中引入一个问题。 一定要确保阅读你要导入的代码的文档,然后在使其成为你的项目的一部分之前审查代码本身。 -最后,在决定是否包括一个库时,要考虑其总体使用情况。 一个被广泛采用的方案的好处是有一个更大的社区和更多的眼睛来关注它的问题。 在使用智能合约进行建设时,安全应该是您的首要关注点! +最后,在决定是否包括一个库时,要考虑其总体使用情况。 一个被广泛采用的方案的好处是有一个更大的社区和更多的眼睛来关注它的问题。 在使用智能合约进行建设时,安全应该是你的首要关注点! ## 相关工具 {#related-tools} @@ -98,18 +98,18 @@ contract MyNFT is ERC721 { - [相关文档](https://dappsys.readthedocs.io/) - [GitHub](https://github.com/dapphub/dappsys) -**HQ20 -** **_一个带有合约、库和案例的 Solidity 项目,帮助您为现实世界建立功能齐全的分布式应用。_** +**HQ20 -** **_一个带有合约、库和案例的 Solidity 项目,帮助你为现实世界建立功能齐全的分布式应用。_** - [GitHub](https://github.com/HQ20/contracts) -**thirdweb Solidity SDK -** **_提供了构建自定义智能合约所需的工具,能够高效地完成_** +**thirdweb Solidity SDK - ** **_提供了高效构建自定义智能合约所需的工具_** - [相关文档](https://portal.thirdweb.com/solidity/) - [GitHub](https://github.com/thirdweb-dev/contracts) ## 相关教程 {#related-tutorials} -- [以太坊开发者的安全考虑](/developers/docs/smart-contracts/security/) _- 构建智能合约时的安全考虑教程,包括库的使用。_ +- [以太坊开发者的安全考虑](/developers/docs/smart-contracts/security/) _– 构建智能合约时的安全注意事项教程,包括库的使用。_ - [了解 ERC-20 代币智能合约](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _- 关于 ERC20 标准的教程,由多个库提供。_ ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md index 5ceb6b99567..7121cb184fd 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/security/index.md @@ -4,9 +4,9 @@ description: 安全的以太坊智能合约构建准则概述 lang: zh --- -智能合约极为灵活,能够控制大量的价值和数据,并在区块链上运行基于代码的不可改变逻辑。 因而,一个由无需信任的去中心化应用程序构成的生态系统应运而生且充满活力,它具备了许多传统系统所没有的优势。 同时,这也给攻击者提供了利用智能合约中的漏洞来获利的机会。 +智能合约极为灵活,能够控制大量的价值和数据,并在区块链上运行基于代码的不可改变逻辑。 因而,一个由去信任的去中心化应用程序构成的生态系统应运而生且充满活力,它具备了许多传统系统所没有的优势。 同时,这也给攻击者提供了利用智能合约中的漏洞来获利的机会。 -公共区块链(比如以太坊)使智能合约的安全性问题变的更加复杂。 已部署的合约代码*通常*无法更改因而不能给安全问题打补丁,并且由于这种不可变性,从智能合约中盗取的资产极难追踪并且绝大多数无法挽回。 +公共区块链(比如以太坊)使智能合约的安全性问题变的更加复杂。 已部署的合约代码_通常_无法更改因而不能给安全问题打补丁,并且由于这种不可变性,从智能合约中盗取的资产极难追踪并且绝大多数无法挽回。 虽然统计数据有所差异,但据估计,由于智能合约的安全缺陷而被盗窃或丢失的资产总额肯定超过了 10 亿美元。 其中包括几次著名事件,比如 [DAO 攻击事件](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/)(360 万个以太币被盗,按照当前价格计算总金额超过 10 亿美元)、[Parity 多重签名钱包攻击事件](https://www.coindesk.com/30-million-ether-reported-stolen-parity-wallet-breach)(黑客窃取了 3000 万美元)以及 [Parity 钱包冻结问题](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether)(价值超过 3 亿美元的以太币遭到永久锁定)。 @@ -26,7 +26,7 @@ lang: zh #### 所有权模式 {#ownable-pattern} -在所有权模式中,在合约创建过程中将地址设置为合约的“所有者”。 受保护的函数都分配有 `OnlyOwner` 修饰符,这样可以确保合约在执行函数之前验证调用地址的身份。 从合约所有者以外的其他地址调用受保护的函数,始终会被回滚,阻止不必要的访问。 +在所有权模式中,在合约创建过程中将地址设置为合约的“所有者”。 受保护的函数都分配有 `OnlyOwner` 修改器,这样可以确保合约在执行函数之前验证调用地址的身份。 从合约所有者以外的其他地址调用受保护的函数,始终会被回滚,阻止不必要的访问。 #### 基于角色的访问控制 {#role-based-access-control} @@ -120,13 +120,13 @@ contract VendingMachine { ### 6. 实施可靠的灾难恢复计划 {#implement-disaster-recovery-plans} -设计安全的访问控制、使用函数修饰符以及其他建议能够提高智能合约的安全性,但这些并不能排除恶意利用的可能性。 构建安全的智能合约需要“做好失败准备”,并制定好应变计划有效地应对攻击。 适当的灾难恢复计划应包括以下部分或全部内容: +设计安全的访问控制、使用函数修改器以及其他建议能够提高智能合约的安全性,但这些并不能排除恶意利用的可能性。 构建安全的智能合约需要“做好失败准备”,并制定好应变计划有效地应对攻击。 适当的灾难恢复计划应包括以下部分或全部内容: #### 合约升级 {#contract-upgrades} 虽然以太坊智能合约默认是不可变的,但通过使用升级模式可以实现一定程度的可变性。 如果重大缺陷导致合约不可用并且部署新逻辑是最可行的选择,有必要升级合约。 -合约升级机制的原理有所不同,但“代理模式”是智能合约升级最常见的方法之一。 代理模式将应用程序的状态和逻辑拆分到*两个*合约中。 第一个合约(称为“代理合约”)存储状态变量(如用户余额),而第二个合约(称为"逻辑合约")存放执行合约函数的代码。 +合约升级机制的原理有所不同,但“代理模式”是智能合约升级最常见的方法之一。 代理模式将应用程序的状态和逻辑拆分到_两个_合约中。 第一个合约(称为“代理合约”)存储状态变量(如用户余额),而第二个合约(称为"逻辑合约")存放执行合约函数的代码。 帐户与代理合约互动,代理合约通过[`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries)的低级调用将所有功能调用分发给逻辑合约。 与普通的消息调用不同,`delegatecall()` 确保在逻辑的合约地址上运行的代码是在调用合约的语境下执行。 这意味着逻辑合约将始终写入代理的存储空间(而非自身存储空间),并且 `msg.sender` 和 `msg.value` 的原始值保持不变。 @@ -146,7 +146,7 @@ contract VendingMachine { 3. 可以访问紧急停止功能的实体,可将布尔变量设置为 `true`。 为防止恶意行为,对此功能的调用可以限制给一个可信地址(如合约所有者)。 -一旦合约操作触发紧急停止,某些函数将无法调用。 这是通过把一些函数包装在引用该全局变量的修饰符中实现的。 以下[示例](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol)描述了该模式在合约中的实现: +一旦合约操作触发紧急停止,某些函数将无法调用。 这是通过把一些函数包装在引用该全局变量的修改器中实现的。 以下[示例](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol)描述了该模式在合约中的实现: ```solidity // 本代码未经专业审计,对安全性和正确性不做任何承诺。 如需使用,风险自负。 @@ -192,7 +192,7 @@ contract EmergencyStop { - 布尔值 `isStopped` 开始时求值为 `false`,但当合约进入紧急模式时求值为 `true`。 -- 函数修饰符 `onlyWhenStopped` 和 `stoppedInEmergency` 检查 `isStopped` 变量。 `stoppedInEmergency` 用于控制在合约有漏洞时应该无法访问的函数(如 `deposit()`)。 对这些函数的调用将仅仅进行回滚而已。 +- 函数修改器 `onlyWhenStopped` 和 `stoppedInEmergency` 检查 `isStopped` 变量。 `stoppedInEmergency` 用于控制在合约有漏洞时应该无法访问的函数(如 `deposit()`)。 对这些函数的调用将仅仅进行回滚而已。 `onlyWhenStopped` 用于在紧急情况下应该可调用的函数(如 `emergencyWithdraw()`)。 此类函数可以帮助解决问题,因此它们不在“受限制函数”之列。 @@ -259,7 +259,7 @@ contract Victim { 2. 将资金发送给调用地址 3. 将其余额重置为 0,防止用户再提取 -`Victim` 合约中的 `withdraw()` 函数遵循“检查-交互-效果”模式。 它*检查*执行所需的条件是否满足(例如,用户的以太币余额是否为正值)并通过向调用者的地址发送以太币来执行*交互*,然后再应用交易的*效果*(例如减少用户的余额)。 +`Victim` 合约中的 `withdraw()` 函数遵循“检查-交互-效果”模式。 它_检查_执行所需的条件是否满足(例如,用户的以太币余额是否为正值)并通过向调用者的地址发送以太币来执行_交互_,然后再应用交易的_效果_(例如减少用户的余额)。 如果从外部帐户调用 `withdraw()`,该函数将按预期执行:`msg.sender.call.value()` 向调用方发送以太币。 然而,如果 `msg.sender` 是智能合约帐户调用 `withdraw()`,使用 `msg.sender.call.value()` 发送资金还将使存储在该地址的代码运行。 @@ -286,7 +286,7 @@ contract Victim { 2. 将 1 个以太币存入 Victim 合约 3. 提取存储在该智能合约中的 1 个以太币 -这里没有什么问题,只是 `Attacker` 有另一个函数,如果传入的 `msg.sender.call.value` 调用剩余的燃料超过 40000,它就再次调用 `Victim` 中的 `withdraw()` 函数。 这使得 `Attacker` 能够重入 `Victim` 合约并在第一次调用 `withdraw` 函数结束*之前*提取更多资金。 这个循环如下所示: +这里没有什么问题,只是 `Attacker` 有另一个函数,如果传入的 `msg.sender.call.value` 调用剩余的燃料超过 40000,它就再次调用 `Victim` 中的 `withdraw()` 函数。 这使得 `Attacker` 能够重入 `Victim` 合约并在第一次调用 `withdraw` 函数结束_之前_提取更多资金。 这个循环如下所示: ```solidity - Attacker 的外部帐户使用 1 个以太币调用 `Attacker.beginAttack()` @@ -320,9 +320,9 @@ contract NoLongerAVictim { } ``` -该合约对用户的余额执行*检查*,应用 `withdraw()` 函数的*效果*(将用户的余额重置为 0)并继续执行*交互*(将以太币发送到用户的地址)。 这确保了合约在外部调用之前更新其存储空间,消除了导致第一次攻击的重入攻击的条件。 `Attacker` 合约可能仍然可以回调 `NoLongerAVictim`,但由于 `balances[msg.sender]` 已设置为 0,额外的提取将引发错误。 +该合约对用户的余额执行_检查_,应用 `withdraw()` 函数的_效果_(将用户的余额重置为 0)并继续执行_交互_(将以太币发送到用户的地址)。 这确保了合约在外部调用之前更新其存储空间,消除了导致第一次攻击的重入攻击的条件。 `Attacker` 合约可能仍然可以回调 `NoLongerAVictim`,但由于 `balances[msg.sender]` 已设置为 0,额外的提取将引发错误。 -另一种方案是使用互斥锁(通常称为“mutex”),它锁定一部分合约状态直到函数调用完成。 互斥锁是通过布尔变量实现的,该变量在函数执行之前设置为 `true`,在调用完成后回滚为 `false`。 如下面的例子所示,使用互斥锁可以防止函数在初始调用仍在进行时不受到递归调用,从而有效地阻止重入攻击。 +另一种方案是使用互斥锁(通常称为“mutex”),它锁定一部分合约状态直到函数调用完成。 互斥锁是通过布尔变量实现的,该变量在函数执行之前设置为 `true`,在调用完成后回滚为 `false`。 如下面的例子所示,使用互斥锁可以防止函数在初始调用仍在进行时不受到递归调用,从而有效地阻止重入攻击。 ```solidity pragma solidity ^0.7.0; @@ -466,17 +466,17 @@ contract Attack { - **[Fork Checker](https://forkchecker.hashex.org/)** - _免费的在线工具,用于检查所有关于分叉合同的现有信息。_ -- **[ABI 编码器](https://abi.hashex.org/)** - _免费在线服务,用于编码您的 Solidity 合约函数和构造函数参数。_ +- **[ABI 编码器](https://abi.hashex.org/)** - _免费在线服务,用于编码你的 Solidity 合约函数和构造函数参数。_ ### 智能合约监测工具 {#smart-contract-monitoring-tools} -- **[OpenZeppelin Defender Sentinels](https://docs.openzeppelin.com/defender/sentinel)** - _一种用于自动监测和响应智能合约中事件、函数和交易参数的工具。_ +- **[OpenZeppelin Defender Sentinels](https://docs.openzeppelin.com/defender/v1/sentinel)** - _一种用于自动监测和响应智能合约中事件、函数和交易参数的工具。_ - **[Tenderly Real-Time Alerting](https://tenderly.co/alerting/)** - _一种在智能合约或钱包发生异常或意外事件时,为你获取实时通知的工具。_ ### 智能合约的安全管理工具 {#smart-contract-administration-tools} -- **[OpenZeppelin Defender Admin](https://docs.openzeppelin.com/defender/admin)** - _进行智能合约管理的管理界面,包括控制访问、升级和暂停功能。_ +- **[OpenZeppelin Defender Admin](https://docs.openzeppelin.com/defender/v1/admin)** - _用于智能合约管理的管理界面,包括访问控制、升级和暂停功能。_ - **[Safe](https://safe.global/)** - _在以太坊上运行的智能合约钱包,需要最少人数批准交易后交易才能进行 (M-of-N)。_ @@ -538,7 +538,7 @@ contract Attack { - **[Solidity 模式](https://fravoll.github.io/solidity-patterns/)** - _面向智能合约编程语言 Solidity 的安全模式和最佳实践实用合集。_ -- **[Solidity 文档:安全性注意事项](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _用 Solidity 编写安全智能合约的准则。_ +- **[Solidity文档:安全性注意事项](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _用Solidity编写安全智能合约的准则。_ - **[智能合约安全验证标准](https://github.com/securing/SCSVS)** - _旨在确立智能合约安全性标准的第十四部分检查清单,面向开发者、架构师、安全审核者和供应商。_ diff --git a/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md b/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md index a2a91bca9ef..87ff12a3c9c 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/testing/index.md @@ -4,9 +4,9 @@ description: 测试以太坊智能合约的技术和注意事项概述。 lang: zh --- -公共区块链(如以太坊)是不可变的,这使得在部署后修改智能合约代码变得很困难。 虽然存在用于执行“虚拟升级”的[合约升级模式](/developers/docs/smart-contracts/upgrading/),但这些模式很难实现,并且需要社会共识。 此外,升级只能修复*已*发现的错误 — 如果攻击者先发现了漏洞,你的智能合约就面临被利用的风险。 +公共区块链(如以太坊)是不可变的,这使得在部署后修改智能合约代码变得很困难。 虽然存在用于执行“虚拟升级”的[合约升级模式](/developers/docs/smart-contracts/upgrading/),但这些模式很难实现,并且需要社会共识。 此外,升级只能修复_已_发现的错误 — 如果攻击者先发现了漏洞,你的智能合约就面临被利用的风险。 -因此,在将智能合约[部署](/developers/docs/smart-contracts/deploying/)到主网之前进行测试是确保[安全性](/developers/docs/smart-contracts/security/)的最低要求。 有许多用于测试合约和评估代码正确性的技术,你可以根据需求进行选择。 然而,由不同工具和方法组成的测试套件对于捕捉合约代码中的细微或重大安全缺陷比较理想。 +因此,在将智能合约[部署](/developers/docs/smart-contracts/deploying/)到主网之前进行测试是确保[安全性](/developers/docs/smart-contracts/security/)的最低要求。 有许多用于测试合约和评估代码正确性的技术,你可以根据需求进行选择。 然而,由不同工具和方法组成的测试套件很适合捕捉合约代码中的细微或重大安全缺陷。 ## 前提条件 {#prerequisites} @@ -16,21 +16,21 @@ lang: zh 智能合约测试是验证智能合约代码是否按预期工作的过程。 测试对于检查特定智能合约是否满足可靠性、可用性和安全性的要求非常有用。 -虽然具体的方法可能各不相同,但大多数测试方法都要求执行智能合约的一个小样本数据。 如果合约样本数据能产生正确的结果,就可以认为它能正常运行。 大多数测试工具提供了编写和执行[测试用例](https://en.m.wikipedia.org/wiki/Test_case)的资料,用于检查合约的执行是否与预期结果相符。 +虽然具体的方法可能各不相同,但大多数测试方法都要求使用合约要处理的少量样本数据执行智能合约。 如果合约样本数据能产生正确的结果,就可以认为合约能正常运行。 大多数测试工具提供了编写和执行[测试用例](https://en.m.wikipedia.org/wiki/Test_case)的资源,用于检查合约的执行是否与预期结果相符。 ### 为什么测试智能合约很重要? {#importance-of-testing-smart-contracts} -由于智能合约通常管理高价值的金融资产,因此即使是很小的编程错误也往往会导致[用户遭受巨大的损失](https://rekt.news/leaderboard/)。 但是严格的测试可以帮助您在部署到主网之前发现智能合约代码中的缺陷问题,并对其进行修复。 +由于智能合约通常管理高价值的金融资产,因此即使是很小的编程错误也往往会导致[用户遭受巨大的损失](https://rekt.news/leaderboard/)。 但是严格的测试可以帮助你在部署到主网之前,及早发现智能合约代码中的缺陷和问题,并进行修复。 尽管发现错误后可以对合约进行升级,但升级很复杂,而且如果处理不当可能会[导致错误](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/)。 进一步升级合约会削弱不可变性原则,并给用户增加额外的信任假设。 相反,对合约进行全面测试的计划可以减轻智能合约的安全风险,并减少在部署后执行复杂逻辑升级的需求。 ## 测试智能合约的方法 {#methods-for-testing-smart-contracts} -测试以太坊智能合约的策略可以分为两大类:**自动化测试**和**手动测试**。 自动化测试和手动测试各有独特的优点和权衡,但你可以将二者结合起来,创建强大的测试计划来分析你的合约。 +以太坊智能合约的测试方法可以分为两大类:**自动化测试**和**手动测试**。 自动化测试和手动测试各有独特的优点和权衡,但你可以将二者结合起来,创建强大的测试计划来分析你的合约。 ### 自动化测试 {#automated-testing} -自动化测试使用工具来自动检查智能合约代码的执行错误。 自动化测试的好处在于使用[脚本](https://www.techtarget.com/whatis/definition/script?amp=1)来指导对合约功能的评估。 脚本测试可以按计划重复运行,人工干预极少,因此自动化测试比手动测试更高效。 +自动化测试使用工具来自动检查智能合约代码的执行错误。 自动化测试的好处在于使用[脚本](https://www.techtarget.com/whatis/definition/script?amp=1)来指导对合约功能的评估。 脚本化测试可以按计划重复运行,人工干预极少,因此自动化测试比手动测试更高效。 自动化测试特别适用于以下情况:测试重复且耗时;手动执行困难时;容易出现人为错误时;或涉及评估关键合约功能时。 但是自动化测试工具可能存在缺陷 — 它们可能会忽略某些错误并产生一些[误报](https://www.contrastsecurity.com/glossary/false-positive)。 因此,理想的方法是结合自动化测试与手动测试。 @@ -38,9 +38,9 @@ lang: zh 手动测试需要人工辅助,在分析智能合约的正确性时,涉及逐个执行测试套件中的每个测试用例。 这与自动化测试不同,在自动化测试中,你可以同时在合约上运行多个独立的测试,并获得显示所有失败和通过的测试的报告。 -手动测试可以由单个人员按照涵盖不同测试场景的书面测试计划进行。 你还可以在指定的时间段内,让多个个人或团体与智能合约进行交互,作为手动测试的一部分。 测试者将对比合约的实际行为与预期行为,将任何差异标记为错误。 +手动测试可以由单个人员按照包含不同测试场景的书面测试计划进行。 你还可以在指定的时间段内,让多个个人或团体与智能合约进行交互,作为手动测试的一部分。 测试人员将对比合约的实际行为与预期行为,将任何差异标记为错误。 -高效的手动测试需要大量的资源(技能、时间、金钱和精力),由于人为错误的存在,在执行测试时可能会错过某些错误。 但手动测试也有其好处,例如,人工测试人员(例如审计员)可以凭直觉来检测自动化测试工具可能忽略的边缘情况。 +高效的手动测试需要大量的资源(技能、时间、金钱和精力),由于人为错误的存在,在执行测试时可能会错过某些错误。 但手动测试也有好处,例如,人工测试人员(例如审计员)可以凭直觉来检测自动化测试工具可能忽略的边缘情况。 ## 智能合约的自动化测试 {#automated-testing-for-smart-contracts} @@ -52,7 +52,7 @@ lang: zh #### 智能合约单元测试的准则 {#unit-testing-guidelines} -##### 1. 理解你的合约业务逻辑和工作流程。 +##### 1. 理解你的合约业务逻辑和工作流程 在编写单元测试之前,了解智能合约提供的功能以及用户如何访问和使用这些函数很有帮助。 这对于运行 [happy path 测试](https://en.m.wikipedia.org/wiki/Happy_path)特别有用,该测试用于确定合约中的函数是否对有效的用户输入返回正确的输出。 我们将使用这个(简化版)的[拍卖合约](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction)示例来解释此概念。 @@ -108,37 +108,36 @@ function auctionEnd() external { } ``` -这是一个简单的拍卖合约,用于在竞标期间接收竞标。 如果 `highestBid` 增加,先前的最高出价者将收到他们的钱;一旦竞标期结束,`beneficiary` 调用合约以获取他们的钱。 +这是一个简单的拍卖合约,用于在竞标期间接收竞标。 如果 `highestBid` 增加,先前的最高出价者将收到他们的钱;一旦竞标期结束,`beneficiary` 调用合约以收取他们的钱。 对这样的合约进行的单元测试将涵盖用户在与合约交互时可能调用的不同函数。 一个例子是进行单元测试,检查用户是否能够在拍卖进行期间出价(即调用 `bid()` 成功),或者检查用户是否能够出价高于当前的 `highestBid`。 -了解合约的操作流程还有助于编写单元测试,以检查执行是否满足要求。 例如,拍卖合约规定,在拍卖结束时(即当 `auctionEndTime` 小于 `block.timestamp` 时),用户无法进行竞标。 因此,开发者可能会运行一个单元测试,检查当拍卖结束时(即当 `auctionEndTime` > `block.timestamp` 时)对 `bid()` 函数的调用成功还是失败。 +了解合约的运行流程还有助于编写单元测试,以检查执行是否满足要求。 例如,拍卖合约规定,在拍卖结束时(即当 `auctionEndTime` 小于 `block.timestamp` 时),用户无法进行竞标。 因此,开发者可能会运行一个单元测试,检查当拍卖结束时(即当 `auctionEndTime` > `block.timestamp` 时)对 `bid()` 函数的调用成功还是失败。 ##### 2. 评估与合约执行相关的所有假设 -重要的是记录关于合约执行的任何假设,并编写单元测试来验证这些假设的有效性。 除了提供对意外执行的保护之外,测试断言还迫使你思考可能破坏智能合约安全模型的操作。 一个有用的技巧是不仅要进行“正向测试”,还要编写负向测试,检查函数对错误的输入是否会失败。 +重要的是记录关于合约执行的任何假设,并编写单元测试来验证这些假设的有效性。 除了提供对意外执行的保护之外,测试断言还迫使你思考可能破坏智能合约安全模型的操作。 一个有用的技巧是不仅要进行“正向测试”,还要编写负面测试,检查函数对错误的输入是否会失败。 -许多单元测试框架允许你创建断言,即简单的语句,用于说明合约的能力和限制,并运行测试以验证这些断言在执行过程中是否成立。 在运行负面测试之前,对之前描述的拍卖合约进行开发的开发人员可以对其行为做出以下断言: +许多单元测试框架允许你创建断言,即简单的语句,用于说明合约的能力和限制,并运行测试以验证这些断言在执行过程中是否成立。 在运行负面测试之前,对之前描述的拍卖合约进行开发的开发者可以对其行为做出以下断言: - 当拍卖结束或尚未开始时,用户无法进行竞标。 -- 如果竞拍合约中的出价低于可接受的阈值,合约将会回滚。 +- 如果竞价低于可接受的阈值,合约将会回滚。 -- 未能赢得竞标的用户将获得其资金的退款。 +- 未能赢得竞标的用户将获得其资金的退款 -**注意**:测试假设的另一种方法是编写测试,触发合约中的[函数修饰符](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers),特别是 `require`、`assert` 和 `if...else` 语句。 +**注意**:测试假设的另一种方法是编写测试,触发合约中的[函数修改器](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers),特别是 `require`、`assert` 和 `if...else` 语句。 -##### 3. 测量代码覆盖率 +##### 3. 度量代码覆盖率 [代码覆盖率](https://en.m.wikipedia.org/wiki/Code_coverage)是一种测试指标,用于跟踪在测试过程中执行的代码分支、行数和语句数量。 测试应该具有良好的代码覆盖率,否则你可能会遇到“误报”,即合约通过了所有的测试,但代码中仍存在漏洞。 记录高代码覆盖率,可以确保智能合约中的所有语句/函数都经过了足够的正确性测试。 ##### 4. 使用完善的测试框架 -运行智能合约单元测试时所使用的工具质量至关重要。 理想的测试框架是经常进行维护的框架;提供有用的功能(例如,日志记录和报告功能);并且必须经过其他开发人员广泛使用和审核。 +运行智能合约单元测试时所使用的工具质量至关重要。 理想的测试框架需经常进行维护;提供有用的功能(例如,日志记录和报告功能);并且必须经过其他开发者广泛使用和审核。 单元测试框架用于对 Solidity 智能合约进行单元测试,提供不同语言的选择(主要是 JavaScript、Python 和 Rust)。 请参阅下面的指南,了解如何开始使用不同的测试框架运行单元测试: -- **[使用 Truffle 运行单元测试](https://trufflesuite.com/docs/truffle/testing/testing-your-contracts/)** - **[使用 Brownie 运行单元测试](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - **[使用 Foundry 运行单元测试](https://book.getfoundry.sh/forge/writing-tests)** - **[使用 Waffle 运行单元测试](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests)** @@ -150,13 +149,13 @@ function auctionEnd() external { 虽然单元测试可以独立调试合约函数,但集成测试会将智能合约的各个组件作为一个整体进行评估。 集成测试可以检测到跨合约调用或同一智能合约中不同函数之间的交互引起的问题。 例如,集成测试可以帮助检查诸如[继承](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance)和依赖注入等功能是否正常工作。 -如果合约采用模块化架构或在执行过程中与其他链上合约进行接口交互,集成测试非常有用。 一个运行集成测试的方法是在特定的高度上[分叉区块链](/glossary/#fork)(使用像 [Ganache](https://trufflesuite.com/docs/ganache/) 或 [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks) 这样的工具),并模拟你的合约与部署的合约之间的交互。 +如果合约采用模块化架构或在执行过程中与其他链上合约进行接口交互,集成测试非常有用。 一种运行集成测试的方法是在特定的高度[让区块链分叉](/glossary/#fork)(使用 [Forge](https://book.getfoundry.sh/forge/fork-testing) 或[安全帽](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks)等工具),并模拟你的合约与已部署合约之间的交互。 -分叉的区块链将与主网类似,具有包含关联状态和余额的账户。 但是它只是一个沙盒式的本地开发环境,举例来说这意味着你不需要真正的以太币进行交易,同时你的更改也不会影响真实的以太坊协议。 +分叉的区块链将与主网的行为类似,其帐户具有关联的状态和余额。 但是它只是一个沙盒式的本地开发环境,举例来说这意味着你不需要真正的以太币进行交易,同时你的更改也不会影响真实的以太坊协议。 ### 基于属性的测试 {#property-based-testing-for-smart-contracts} -基于属性的测试是一种检查智能合约是否满足一些定义的属性的过程。 属性是关于合约行为的断言,预期在不同的场景中始终保持为真。智能合约属性的一个例子可以是“合约中的算术运算永不溢出或下溢”。 +基于属性的测试是一种检查智能合约是否满足一些定义的属性的过程。 属性是关于合约行为的断言,预期其行为在不同的场景中始终保持为真。智能合约属性的一个例子可以是“合约中的算术运算永不溢出或下溢”。 **静态分析**和**动态分析**是执行基于属性的测试的两种常见技术,它们都可以验证程序代码(此例中的智能合约)是否满足一些预定义的属性。 有些基于属性的测试工具提供预定义的合约属性规则,并根据这些规则检查代码,而其他工具则允许你为智能合约创建自定义属性。 @@ -164,13 +163,13 @@ function auctionEnd() external { 静态分析器接受智能合约的源代码作为输入,并输出结果,声明合约是否满足某个属性 与动态分析不同,静态分析不涉及执行合约来分析其正确性。 静态分析则可以推断智能合约在执行过程中可能采取的所有路径(即通过检查源代码的结构来确定合约在运行时的操作意义)。 -[Linting](https://www.perforce.com/blog/qac/what-lint-code-and-why-linting-important) 和[静态测试](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis)是对合约运行静态分析的常见方法。 两者都需要分析合约执行的低级表示,例如编译器输出的[抽象语法树](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree)和[控制流图](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/)。 +[Linting](https://www.perforce.com/blog/qac/what-lint-code-and-why-linting-important) 和[静态测试](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis)是对合约运行静态分析的常见方法。 两者都需要分析合约执行的低级表现,例如编译器输出的[抽象语法树](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree)和[控制流图](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/)。 在大多数情况下,静态分析对于检测合约代码中的安全问题非常有用,例如使用不安全的结构、语法错误或违反编码标准。 然而,静态分析器通常被认为在检测更深层次的漏洞方面不够准确,并且可能会产生过多的误报。 #### 动态分析 {#dynamic-analysis} -动态分析生成智能合约函数的符号输入(例如,在[symbolic execution](https://en.m.wikipedia.org/wiki/Symbolic_execution)中)或具体输入(例如,在[fuzzing](https://owasp.org/www-community/Fuzzing)中),以查看是否存在任何执行跟踪违反特定属性。 这种基于属性的测试形式与单元测试不同,因为测试用例涵盖多种场景,并且由程序处理测试用例的生成。 +动态分析生成智能合约函数的符号输入(例如,在[symbolic execution](https://en.m.wikipedia.org/wiki/Symbolic_execution)中)或具体输入(例如,在[fuzzing](https://owasp.org/www-community/Fuzzing)中),以查看是否存在任何执行轨迹违反特定属性。 这种基于属性的测试形式与单元测试不同,因为测试用例涵盖多种场景,并且由程序处理测试用例的生成。 [模糊测试](https://halborn.com/what-is-fuzz-testing-fuzzing/)是一种用于验证智能合约中任意属性的动态分析技术的示例。 模糊测试工具使用随机或畸形的变化调用目标合约中的函数,以对预定义的输入值进行测试。 如果智能合约进入错误状态(例如,断言失败),问题会被标记,并在生成的报告中包含驱动执行进入脆弱路径的输入。 @@ -184,7 +183,7 @@ function auctionEnd() external { ### 对智能合约运行基于属性的测试的准则 {#running-property-based-tests} -运行基于属性的测试通常始于定义你希望在智能合约中进行验证的一个属性(例如,[整数溢出](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)的缺失)或一组属性。 在编写属性测试时,你可能需要定义一个数值范围,以便于程序生成用于交易输入的数据。 +运行基于属性的测试通常始于定义你希望在智能合约中进行验证的一个属性(例如,[整数溢出](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow)的缺失)或一组属性。 在编写属性测试时,你可能需要定义一个数值范围,程序可以在此范围生成用于交易输入的数据。 配置正确后,属性测试工具将使用随机生成的输入执行你的智能合约函数。 如果存在任何断言违规情况,你应该获得一份报告,其中包含违反正在评估的属性的具体输入数据。 请参阅下面的指南,了解如何使用不同的工具开始运行基于属性的测试: @@ -197,13 +196,13 @@ function auctionEnd() external { ## 智能合约的手动测试 {#manual-testing-for-smart-contracts} -在开发后期,经常会进行智能合约手动测试,而这通常在运行自动化测试之后进行。 这种测试形式将智能合约作为一个完全集成的产品进行评估,以验证其是否按照技术要求的规定顺利运行。 +在开发后期,经常会进行智能合约手动测试,而这类测试通常在运行自动化测试之后进行。 这种测试形式将智能合约作为一个完全集成的产品进行评估,以验证其是否按照技术要求的规定顺利运行。 ### 在本地区块链上测试合约 {#testing-on-local-blockchain} -虽然在本地开发环境中进行的自动化测试可以提供有用的调试信息,但你需要了解你的智能合约在生产环境中的行为。 然而,部署到主要的以太坊链上会产生燃料费用,更不用说如果你的智能合约仍然存在错误,你或你的用户可能会损失真实的资金。 +虽然在本地开发环境中进行的自动化测试可以提供有用的调试信息,但你需要了解你的智能合约在生产环境中的行为。 然而,部署到以太坊主链上会产生燃料费用,更不用说如果你的智能合约仍然存在错误,你或你的用户可能会损失真金白银。 -在本地区块链(也称为[开发网络](/developers/docs/development-networks/))上测试你的合约是测试主网的推荐替代方法。 本地区块链是在你的计算机上本地运行的以太坊区块链副本,模拟以太坊执行层的行为。 因此,你可以编程交易与合约进行交互,而不会产生重大的开销。 +在本地区块链(也称为[开发网络](/developers/docs/development-networks/))测试你的合约是在主网上测试的推荐替代方法。 本地区块链是在你的计算机本地运行的以太坊区块链副本,模拟以太坊执行层的行为。 因此,你可以编程交易与合约进行交互,而不会产生大量开销。 在本地区块链上运行合约可以作为一种有用的手动集成测试的方式。 [智能合约具有高度的可组合性](/developers/docs/smart-contracts/composability/),使你能够与现有协议进行集成,但你仍需要确保这种复杂的链上交互能够产生正确的结果。 @@ -211,23 +210,23 @@ function auctionEnd() external { ### 在测试网上测试合约 {#testing-contracts-on-testnets} -测试网络或测试网的运行方式与以太坊主网完全相同,唯一的区别在于它使用没有现实价值的以太币 (ETH)。 在[测试网](/developers/docs/networks/#ethereum-testnets)上部署你的合约意味着任何人都可以与之交互(例如,通过 dapp 的前端界面),而无需承担资金风险。 +测试网络或测试网的运行方式与以太坊主网完全相同,唯一的区别在于它使用没有现实价值的以太币 (ETH)。 在[测试网](/developers/docs/networks/#ethereum-testnets)上部署你的合约意味着任何人都可以与之交互(例如,通过去中心化应用程序的前端界面),而无需承担资金风险。 这种手动测试形式对于从用户角度评估应用程序的端到端流程非常有用。 在这里,测试人员还可以进行试运行,并报告与合约的业务逻辑和整体功能有关的任何问题。 -在本地区块链上进行测试后,部署到测试网是理想的选择,因为测试网更接近以太坊虚拟机的行为。 因此,许多以太坊原生项目通常会在测试网上部署去中心化应用,以在真实环境条件下评估智能合约的运行。 +在本地区块链上进行测试后,部署到测试网是理想的选择,因为测试网更接近以太坊虚拟机的行为。 因此,许多以太坊原生项目通常会在测试网上部署去中心化应用程序,以在真实环境条件下评估智能合约的运行。 [更多关于以太坊测试网的信息。](/developers/docs/development-networks/#public-beacon-testchains) ## 测试与形式化验证 {#testing-vs-formal-verification} -虽然测试有助于确认合约返回某些数据输入的预期结果,但它不能最终证明测试期间未使用的输入也是如此。 因此,测试智能合约无法保证“功能正确性”(即无法证明程序在*所有*输入值集合上都按照要求运行)。 +虽然测试有助于确认合约返回某些数据输入的预期结果,但它不能最终证明测试期间未使用的输入也是如此。 因此,测试智能合约无法保证“功能正确性”(即无法证明程序在_所有_输入值集合上都按照要求运行)。 -形式化验证是一种通过检查程序的形式模型是否与形式规范相匹配来评估软件正确性的方法。 形式化模型是对程序的抽象数学表述,而形式化规范则定义了程序的属性(即关于程序执行的逻辑断言)。 +形式化验证是一种通过检查程序的形式模型是否与形式规范相匹配来评估软件正确性的方法。 形式模型是对程序的抽象数学表述,而形式规范则定义了程序的属性(即关于程序执行的逻辑断言)。 由于属性以数学术语编写,因此可以使用逻辑推理规则验证系统的形式(数学)模型是否满足规范。 因此,形式化验证工具被称为能够提供系统正确性的“数学证明”。 -与测试不同,形式化验证可以用于验证智能合约的执行是否满足*所有*执行情况的形式化规范的要求(即,没有缺陷),而无需使用样本数据来执行。 这不仅减少了运行数十个单元测试所花费的时间,而且在发现隐藏的漏洞方面也更加有效。 话虽如此,形式化验证技术在实施难度和实用性上存在一定的变化程度。 +与测试不同,形式化验证可以用于验证智能合约的执行是否满足_所有_执行情况的形式规范的要求(即,没有缺陷),而无需使用样本数据来执行。 这不仅减少了运行数十个单元测试所花费的时间,而且在发现隐藏的漏洞方面也更加有效。 话虽如此,形式化验证技术在实施难度和实用性上存在一定的变化程度。 [更多关于智能合约的形式化验证的信息。](/developers/docs/smart-contracts/formal-verification) @@ -235,13 +234,13 @@ function auctionEnd() external { 正如前面提到的,严格的测试很少能够保证合约中没有错误;形式化验证方法可以提供更强的正确性保证,但目前使用起来困难且成本相当高昂。 -尽管如此,您仍可通过进行独立的代码审查来进一步增加捕获合约漏洞的可能性。 [智能合约审计](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/)和[漏洞奖金计划](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)是让他人分析你的合约的两种方式。 +尽管如此,你仍可通过进行独立的代码审查来进一步增加捕获合约漏洞的可能性。 [智能合约审查](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/)和[漏洞奖励](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)是让他人分析你的合约的两种方式。 -审计由具有在智能合约中发现安全漏洞和开发不良实践案例经验的审计师进行。 审核通常包括对整个代码库进行测试(可能包括形式验证)以及手动审查。 +审查由具有在智能合约中发现安全漏洞和开发不良实践案例经验的审查人员进行。 审核通常包括对整个代码库进行测试(可能包括形式化验证)以及手动审查。 -相反,漏洞奖金计划通常涉及向发现智能合约漏洞并向开发者披露的个人(通常称为[白帽黑客]())提供财务奖励的做法。 漏洞奖金类似于审计,因为它涉及要求其他人帮助发现智能合约中的缺陷。 +相反,漏洞奖励计划通常涉及向发现智能合约漏洞并向开发者披露的个人(通常称为[白帽黑客](https://en.wikipedia.org/wiki/White_hat_(computer_security)))提供财务奖励的做法。 漏洞奖励类似于审查,因为它涉及要求其他人帮助发现智能合约中的缺陷。 -主要的区别在于漏洞奖金计划对更广泛的开发者/黑客社区开放,并吸引了一批具有独特技能和经验的道德黑客和独立安全专业人员。 与主要依赖可能拥有有限或狭窄专业知识的团队的智能合约审计相比,这可能是一个优势。 +主要的区别在于漏洞奖励计划对更广泛的开发者/黑客社区开放,并吸引了一批具有独特技能和经验的道德黑客和独立安全专业人员。 与主要依赖可能拥有有限或狭窄专业知识的团队的智能合约审查相比,这可能是一个优势。 ## 测试工具和库 {#testing-tools-and-libraries} @@ -255,15 +254,13 @@ function auctionEnd() external { - **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _用于以太坊智能合约测试的断言库。 确保你的合约按预期运行!_ -- **[Truffle 测试](https://hardhat.org/hardhat-runner/docs/guides/test-contracts#testing-contracts)** - _自动化测试框架让合约测试变得轻而易举。_ - - **[Brownie 单元测试框架](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _Brownie 采用了 Pytest,这是一个功能丰富的测试框架,让你只需使用最少的代码即可编写小型测试,并能有效地扩展以用于大型项目,而且具有很强的可扩展性。_ -- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry 提供了 Forge,这是一个快速灵活的以太坊测试框架,能够执行简单的单元测试、燃料优化检查和合约模糊测试。_ +- **[Foundry 测试](https://github.com/foundry-rs/foundry/tree/master/forge)** - _Foundry 提供了 Forge,这是一个快速灵活的以太坊测试框架,能够执行简单的单元测试、燃料优化检查和合约模糊测试。_ - **[Hardhat 测试](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _基于 ethers.js、Mocha 和 Chai 的智能合约测试框架。_ -- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _基于 Python 的智能合约开发和测试框架,以以太坊虚拟机为目标。_ +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _基于 Python 的智能合约开发和测试框架,针对太坊虚拟机。_ ### 基于属性测试的工具 {#property-based-testing-tools} @@ -271,7 +268,7 @@ function auctionEnd() external { - **[Slither](https://github.com/crytic/slither)** - _基于 Python 的 Solidity 静态分析框架,用于查找漏洞、增强代码理解以及为智能合约编写自定义分析。_ -- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _用于执行 Solidity 智能合约编程语言的风格和安全最佳实践的 Linter。_ +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _用于执行Solidity 智能合约编程语言的风格和安全最佳实践的 Linter。_ #### 动态分析工具 {#dynamic-analysis-tools} @@ -287,14 +284,12 @@ function auctionEnd() external { ## 相关教程 {#related-tutorials} -- [如何为 Truffle 测试设置 Travis 或 Circle 持续集成 (CI)](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) - [不同测试产品的概述和比较](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ - [如何使用 Echidna 测试智能合约](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) - [如何使用 Manticore 查找智能合约漏洞](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) -- [如何使用 Slither 发现智能合约漏洞](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [如何使用Slither发现智能合约漏洞](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [如何模拟测试 Solidity 合约](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) -- [如何将 Truffle 测试迁移至 OpenZeppelin 测试环境](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) -- [如何在部署到网络后测试智能合约](https://fulldecent.blogspot.com/2019/04/testing-deployed-ethereum-contracts.html) +- [如何利用 Foundry 在 Solidity 中运行单元测试](https://www.rareskills.io/post/foundry-testing-solidity) ## 延伸阅读 {#further-reading} diff --git a/public/content/translations/zh/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/zh/developers/docs/smart-contracts/upgrading/index.md index 7a6a6492f91..23590b5f85e 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/upgrading/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/upgrading/index.md @@ -6,9 +6,9 @@ lang: zh 以太坊上的智能合约是在以太坊虚拟机 (EVM) 中运行的自执行程序。 这些程序在设计上不可变,这意味着一旦部署合约,就无法对业务逻辑进行任何更新。 -尽管不可变性对于智能合约的信任性、去中心化和安全性是必要的,但在某些情况下,它可能具有一定的缺点。 例如,不可变的代码可能会使开发者无法修复存在漏洞的合约。 +尽管不可变性对于智能合约的去信任性、去中心化和安全性是必要的,但在某些情况下,它可能具有一定的缺点。 例如,不可变的代码可能会使开发者无法修复存在漏洞的合约。 -然而,对改进智能合约的研究不断加强,导致引入了几种升级模式。 这些升级模式使开发者能够通过将业务逻辑放置在不同的合约中来升级智能合约(同时保持不可变性)。 +然而,随着对改进智能合约的研究力度不断加强,引入了几种升级模式。 这些升级模式使开发者能够通过将业务逻辑放置在不同的合约中来升级智能合约(同时保持不可变性)。 ## 前提条件 {#prerequisites} @@ -18,11 +18,11 @@ lang: zh 智能合约升级涉及更改智能合约的业务逻辑,同时保留合约的状态。 重要的是要澄清,可升级性和可变性并不是相同的概念,尤其是在智能合约的背景下。 -你仍然无法更改在以太坊网络上部署的地址上的程序。 但是你可以更改与用户交互时执行的智能合约代码。 +你仍然无法更改在以太坊网络地址上部署的程序。 但是你可以更改与用户交互时执行的智能合约代码。 这可以通过以下方式完成: -1. 创建智能合约的多个版本并从旧合约到新合约实例迁移状态(即数据)。 +1. 创建智能合约的多个版本并从旧合约向新合约的实例迁移状态(即数据)。 2. 创建独立的合约以存储业务逻辑和状态。 @@ -36,7 +36,7 @@ lang: zh 合约迁移是基于版本控制的概念,即创建和管理相同软件的独特状态。 合约迁移涉及部署现有智能合约的新实例,并将存储和余额转移到新合约中。 -新部署的合约将有空的存储空间,使你能够从旧合约中恢复数据并将其写入新的实现。 之后,您将需要更新与旧合约交互的所有合约,以反映新地址的变更。 +新部署的合约将有空的存储空间,使你能够从旧合约中恢复数据并将其写入新的实现。 之后,你需要更新与旧合约交互的所有合约,以反映新地址的变更。 合约迁移的最后一步是说服用户改为使用新合约。 新合约版本将保留用户的余额和地址,从而保持不可变性。 如果这是一个基于代币的合约,你还需要与交易所联系,废弃旧合约并使用新合约。 @@ -46,7 +46,7 @@ lang: zh ### 升级机制 #2:数据分离 {#data-separation} -升级智能合约的另一种方法是将业务逻辑和数据存储分离为不同的合约。 这意味着用户与逻辑合约进行交互,而数据存储在存储合约中。 +升级智能合约的另一种方法是将业务逻辑和数据存储分离到不同的合约中。 这意味着用户与逻辑合约进行交互,而数据存储在存储合约中。 逻辑合约包含当用户与应用程序进行交互时执行的代码。 它还保存了存储合约的地址,并与之进行交互以获取和设置数据。 @@ -60,9 +60,9 @@ lang: zh ### 升级机制 #3:代理模式 {#proxy-patterns} -代理模式还使用数据分离,将业务逻辑和数据保存在单独的合约中。 不过,在代理模式中,存储合约(称为代理)会在代码执行过程中调用逻辑合约。 这与数据分离法相反,即逻辑合约调用存储合约。 +代理模式还使用数据分离,将业务逻辑和数据保存在单独的合约中。 不过,在代理模式中,存储合约(称为代理)会在代码执行过程中调用逻辑合约。 这与数据分离方式相反,即逻辑合约调用存储合约。 -这是代理模式中的原理: +下面介绍代理模式的原理: 1. 用户与代理合约进行交互,代理合约存储数据,但不保存业务逻辑。 @@ -74,7 +74,7 @@ lang: zh 摘自 [Solidity 文档](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries): -> _存在一种消息调用的特殊变体,名为 **delegatecall**,它与消息调用相同,但是目标地址的代码在调用合约的语境(即地址)下执行,并且 `msg.sender` 和 `msg.value` 不会更改其值。\_\_这意味着合约在运行时可以从不同的地址动态加载代码。 存储、当前地址和余额仍参考调用合约,只是代码取自被调用地址。_ +> _存在一种消息调用的特殊变体,名为 **delegatecall**,它与消息调用相同,但是目标地址的代码在调用合约的语境(即地址)下执行,并且 `msg.sender` 和 `msg.value` 不会更改其值。__这意味着合约在运行时可以从不同的地址动态加载代码。 存储、当前地址和余额仍参考调用合约,只是代码取自被调用地址。_ 每当用户调用函数时,代理合约就会调用 `delegatecall`,因为它内置了一个 `fallback` 函数。 在 Solidity 编程中,当函数调用与合约中指定的函数不匹配时,将执行[回退函数](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function)。 @@ -82,7 +82,7 @@ lang: zh 代理合约在默认情况下是不可变的,但可以创建更新了业务逻辑的新逻辑合约。 然后,只需更改代理合约中引用的逻辑合约的地址即可执行升级。 -通过将代理合约转向新的逻辑合约,用户调用代理合约函数时执行的代码就会发生变化。 这样,我们就可以在不要求用户与新合约进行交互的情况下,升级合约的逻辑。 +通过将代理合约指向新的逻辑合约,用户调用代理合约函数时执行的代码就会发生变化。 这样,我们就可以在不要求用户与新合约进行交互的情况下,升级合约的逻辑。 代理模式是一种流行的智能合约升级方法,因为它消除了与合约迁移相关的困难。 但是,代理模式的使用更为复杂,如果使用不当,可能会带来严重缺陷,例如[函数选择器冲突](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357)。 @@ -94,9 +94,9 @@ lang: zh 在这种情况下,主合约包含核心业务逻辑,但与其他智能合约(“卫星合约”)进行接口交互,以执行某些功能。 该主合约还存储每个卫星合约的地址,并可在卫星合约的不同实现之间切换。 -你可以构建一个新的卫星合约,并为主合约配置新地址。 这允许你更改智能合约的*策略*(即实现新的逻辑)。 +你可以构建一个新的卫星合约,并为主合约配置新地址。 这允许你更改智能合约的_策略_(即实现新的逻辑)。 -虽然策略模式与前面讨论的代理模式类似,但其不同之处在于,用户交互的主合约中包含了业务逻辑。 使用这种模式可以让你有机会在不影响核心基础架构的情况下对智能合约进行有限的更改。 +虽然策略模式与前面讨论的代理模式类似,但不同之处在于,与用户交互的主合约中包含了业务逻辑。 使用这种模式可以让你有机会在不影响核心基础架构的情况下对智能合约进行有限的更改。 这种模式的主要缺点是它主要适用于推出小规模升级。 此外,如果主合约被泄露(如被黑客攻击),则无法使用此升级方法。 @@ -104,7 +104,7 @@ lang: zh 钻石模式可以说是代理模式的改进。 钻石模式不同于代理模式,因为钻石代理合约可以将函数调用委托给多个逻辑合约。 -钻石模式中的逻辑合约被称为*“切面”* 。 要使钻石模式发挥作用,你需要在代理合约中创建一个映射,将[函数选择器](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector)映射到不同的“切面”地址。 +钻石模式中的逻辑合约被称为_“切面”_ 。 要使钻石模式发挥作用,你需要在代理合约中创建一个映射,将[函数选择器](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector)映射到不同的“切面”地址。 当用户调用函数时,代理合约会检查映射,以找到负责执行该函数的“切面”。 然后,它会调用 `delegatecall`(使用回退函数),并将调用重定向到相应的逻辑合约。 @@ -114,19 +114,19 @@ lang: zh 2. 所有智能合约(包括代理模式下使用的逻辑合约)的大小限制为 24KB,这可能是一个限制 — 特别是对于需要更多函数的复杂合约。 钻石模式通过在多个逻辑合约中拆分函数,轻松解决了这一问题。 -3. 代理模式采用了一种一揽子的访问控制方法。 可访问升级功能的实体能够更改*整个*合约。 但是,钻石模式支持模块化权限方法,可以限制实体升级智能合约中的某些功能。 +3. 代理模式采用了一种一揽子的访问控制方法。 可访问升级功能的实体能够更改_整个_合约。 但是,钻石模式支持模块化权限方法,可以限制实体升级智能合约中的某些功能。 [更多关于钻石模式的信息](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w)。 ## 升级智能合约的优缺点 {#pros-and-cons-of-upgrading-smart-contracts} -| 优点 | 缺点 | -| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | -| 智能合约升级可以更轻松地修复部署后阶段发现的漏洞。 | 智能合约的升级否定了代码不变性的理念,这对去中心化和安全性都有影响。 | -| 开发者可以使用逻辑升级为分布式应用程序添加新功能。 | 用户必须相信开发者不会随意修改智能合约。 | -| 由于漏洞可以快速修复,因而智能合约升级可以提高终端用户的安全性。 | 将升级功能编程到智能合约中又增加了一层复杂性,并增加了出现严重缺陷的可能性。 | -| 合约升级为开发人员提供了更广阔的空间来试验不同的功能和不断改进分布式应用程序。 | 升级智能合约的机会可能会促使开发人员更快启动项目,但在开发阶段不进行尽职审查。 | -| | 智能合约中不安全的访问控制或中心化会让恶意行为者更容易执行未经授权的升级。 | +| 优点 | 缺点 | +| --------------------------------------- | -------------------------------------- | +| 智能合约升级可以更轻松地修复部署后阶段发现的漏洞。 | 智能合约的升级否定了代码不变性的理念,这对去中心化和安全性都有影响。 | +| 开发者可以使用逻辑升级为去中心化应用程序添加新功能。 | 用户必须相信开发者不会随意修改智能合约。 | +| 由于漏洞可以快速修复,因而智能合约升级可以提高最终用户的安全性。 | 将升级功能编程到智能合约中又增加了一层复杂性,并增加了出现严重缺陷的可能性。 | +| 合约升级为开发者提供了更广阔的空间来试验不同的功能和不断改进去中心化应用程序。 | 升级智能合约的机会可能会促使开发者更快启动项目,但在开发阶段不进行尽职审查。 | +| | 智能合约中不安全的访问控制或中心化会让恶意行为者更容易执行未经授权的升级。 | ## 升级智能合约的考量 {#considerations-for-upgrading-smart-contracts} @@ -134,15 +134,15 @@ lang: zh 2. 升级智能合约是一项复杂的活动,需要高度谨慎以防止引入漏洞。 -3. 通过下放实施升级的流程,减少信任假设。 可能的策略包括使用[多重签名钱包合约](/developers/docs/smart-contracts/#multisig)来控制升级,或要求[去中心化自治组织的成员](/dao/)投票批准升级。 +3. 通过分散实施升级的流程,减少信任假设。 可行策略包括使用[多重签名钱包合约](/developers/docs/smart-contracts/#multisig)来控制升级,或要求[去中心化自治组织的成员](/dao/)投票批准升级。 4. 了解合约升级所涉及的费用。 例如,在合约迁移过程中,将状态(如用户余额)从旧合约复制到新合约可能需要不止一次交易,这意味着更多的燃料费用。 5. 考虑实施**时间锁**来保护用户。 时间锁指的是对系统变更强制执行的延迟。 时间锁可与多重签名治理系统相结合,以控制升级:如果拟议的操作达到了所需的批准阈值,则该操作将在预定的延迟期过后才会执行。 -如果用户不同意拟议的更改(如逻辑升级或新的收费方案),时间锁会给他们一些时间退出系统。 如果没有时间锁,用户就需要相信开发人员不会在没有事先通知的情况下对智能合约进行任意更改。 这样做的缺点是,时间锁限制了快速修补漏洞的能力。 +如果用户不同意拟议的更改(如逻辑升级或新的收费方案),时间锁会给他们一些时间退出系统。 如果没有时间锁,用户就需要相信开发者不会在没有事先通知的情况下对智能合约进行任意更改。 缺点是,时间锁限制了快速修补漏洞的能力。 -## 更多资源 {#resources} +## 资源 {#resources} **OpenZeppelin 升级插件 - _一套用于部署和保护可升级智能合约的工具。_** @@ -161,5 +161,5 @@ lang: zh - [智能合约升级的现状](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) - Santiago Palladino - [升级 Solidity 智能合约的多种方法](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) - Crypto Market Pool 博客 - [学习:升级智能合约](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) - OpenZeppelin 文档 -- [Solidity 合约可升级性的代理模式:透明代理与 UUPS 代理](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) - Naveen Sahu +- [实现 Solidity 合约可升级性的代理模式:透明代理与 UUPS代理](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) - Naveen Sahu - [钻石升级如何运作](https://dev.to/mudgen/how-diamond-upgrades-work-417j) - Nick Mudge diff --git a/public/content/translations/zh/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/zh/developers/docs/smart-contracts/verifying/index.md index a012b351ac8..edf98cdd826 100644 --- a/public/content/translations/zh/developers/docs/smart-contracts/verifying/index.md +++ b/public/content/translations/zh/developers/docs/smart-contracts/verifying/index.md @@ -4,7 +4,7 @@ description: 以太坊智能合约源代码验证概述 lang: zh --- -[智能合约](/developers/docs/smart-contracts/)被设计成“无需信任”,即用户无需信任第三方(例如,开发者和团体)便可与智能合约交互。 无需信任的一个必要条件就是用户和其他开发者必须能够验证智能合约的源代码。 而验证源代码能够向用户和开发者保证已发布的合约代码和以太坊区块链上运行的代码相同。 +[智能合约](/developers/docs/smart-contracts/)被设计成“去信任”,即用户去信任第三方(例如,开发者和团体)便可与智能合约交互。 去信任的一个必要条件就是用户和其他开发者必须能够验证智能合约的源代码。 而验证源代码能够向用户和开发者保证已发布的合约代码和以太坊区块链上运行的代码相同。 区分“源代码验证”和“[形式化验证](/developers/docs/smart-contracts/formal-verification/)”很重要。 源代码验证指的是验证用高级语言(例如 Solidity)编写的智能合约的给定源代码是否能编译成在合约地址执行的相同字节码,下文将会详细说明。 而形式化验证则是验证智能合约的正确性,即验证合约行为是否符合预期。 合约验证尽管要视上下文而定,但是通常是指源代码验证。 @@ -14,13 +14,13 @@ lang: zh 为检测差异,源代码验证会对智能合约的源代码与合约创建过程中使用的编译字节码进行比较处理。 由于广告合约代码与区块链上运行的代码可能不同,因此验证智能合约极为重要。 -智能合约验证不需阅读机器代码就能让合约通过其编写所使用的高级语言表现出的行为受到调查。 函数、值以及变量名和评论与编译和部署的原始源代码一般是相同的。 这就让代码阅读变得更加容易了。 源验证还对代码文档做出了规定,以便最终用户了解智能合约的用途。 +通过智能合约验证,用户无需阅读机器代码就能通过编写合约所使用的高级语言来研究合约的行为。 函数、值以及变量名和评论与编译和部署的原始源代码一般是相同的。 这就让代码阅读变得更加容易了。 源代码验证还对代码文档做出了规定,以便最终用户了解智能合约的用途。 ### 什么是完全验证? {#full-verification} -源代码的某些部分不会影响编译好的字节代码,如评论和变量名。 也就是说两段变量名和评论都不同的源代码能验证同一份合约。 这样一来,恶意行为者便能在源代码中添加欺骗性评论或给出误导性变量名,也能用与原始源代码不同的源代码来验证合约。 +源代码的某些部分不会影响编译好的字节码,如评论和变量名。 也就是说两段变量名和评论都不同的源代码能验证同一份合约。 这样一来,恶意行为者便能在源代码中添加欺骗性评论或给出误导性变量名,也能用与原始源代码不同的源代码来验证合约。 -要想避免这种情况,可以在字节码中添加额外数据作为源代码准确性的*加密保障*和编译信息的*指纹*。 必要的信息可以在 [Solidity 合约元数据](https://docs.soliditylang.org/en/v0.8.15/metadata.html)中找到,并且此文件的哈希值附在了合约的字节码中。 你可以在[元数据训练场](https://playground.sourcify.dev)中检查运行情况。 +要想避免这种情况,可以在字节码中添加额外数据作为源代码准确性的_加密保障_和编译信息的_指纹_。 必要的信息可以在 [Solidity 合约元数据](https://docs.soliditylang.org/en/v0.8.15/metadata.html)中找到,并且此文件的哈希值附在了合约的字节码中。 你可以在[元数据训练场](https://playground.sourcify.dev)中检查运行情况。 元数据文件包含有关合约的编译信息,合约中包括源文件和源文件的哈希值。 也就是说,一旦有任何源文件中的编译设置甚至是某个字节有所更改,整个元数据文件也会发生变化。 因此,附在字节码上的元数据文件的哈希值也会变化。 也就意味着只要合约的字节码和所附元数据哈希值与给定的源代码和编译设置相匹配,我们就能确定这就是原始编译中所使用的源代码,丝毫不差。 @@ -28,21 +28,21 @@ lang: zh ## 为什么源代码验证如此重要? {#importance-of-source-code-verification} -### 无需信任 {#trustlessness} +### 去信任 {#trustlessness} -无需信任可以说是智能合约和[去中心化应用程序 (dapps)](/developers/docs/dapps/) 的先决条件。 智能合约是“不可变”的,无法更改;合约只会执行部署时代码中定义的业务逻辑。 这意味着开发者和企业在以太坊上部署合约后无法篡改合约代码。 +去信任可以说是智能合约和[去中心化应用程序 (dapp)](/developers/docs/dapps/) 的最重要的先决条件。 智能合约是“不可变”的,无法更改;合约只会执行部署时代码中定义的业务逻辑。 这意味着开发者和企业在以太坊上部署合约后无法篡改合约代码。 -为了让智能合约无需信任,合约代码应可供独立验证。 虽然每份智能合约的编译字节码都可以在区块链上公开获取,但低级语言对于开发者和用户来说都难以理解。 +为了让智能合约去信任,合约代码应可供独立验证。 虽然每份智能合约的编译字节码都可以在区块链上公开获取,但低级语言对于开发者和用户来说都难以理解。 -项目通过公布其合约源代码来减少信任假设。 但这也带来了另一个问题:公布的源代码与合约字节码是否一致难以验证。 在这种情况下,无需信任的价值便不复存在,因为用户必须相信开发人员在将合约部署到区块链上之前不会更改合约的业务逻辑(即更改字节码)。 +项目通过公布其合约源代码来减少信任假设。 但这会导致另一个问题:很难验证发布的源代码是否与合约的字节码匹配。 在这种情况下,去信任的价值便不复存在,因为用户必须相信开发者在将合约部署到区块链上之前不会更改合约的业务逻辑(即更改字节码)。 -源代码验证工具可保证智能合约的源代码文件与汇编代码一致。 这样就形成了一个无需信任的生态系统,用户不会盲目信任第三方,而是先验证代码再将资金存入合约。 +源代码验证工具可保证智能合约的源代码文件与汇编代码一致。 这样就形成了一个去信任的生态系统,用户不会盲目信任第三方,而是先验证代码再将资金存入合约。 ### 用户安全 {#user-safety} 智能合约通常涉及大量质押资金。 这就需要更高的安全保证,并在使用智能合约前对其逻辑进行验证。 问题在于,不法开发者可以通过在智能合约中插入恶意代码来欺骗用户。 如果不进行验证,恶意智能合约就可能存在[后门](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts)、矛盾的访问控制机制、可被利用的漏洞以及其他危害用户安全的问题,而这些问题甚至难以察觉。 -公布智能合约的源代码文件可以让审计人员等相关人员更容易评估合约,预防潜在攻击。 通过多方独立验证智能合约,用户可以获得更加强有力的安全性保障。 +公布智能合约的源代码文件可以让审查人员等相关人员更容易评估合约,预防潜在攻击向量。 通过多方独立验证智能合约,用户可以获得更加强有力的安全性保障。 ## 如何验证以太坊智能合约的源代码 {#source-code-verification-for-ethereum-smart-contracts} @@ -50,13 +50,13 @@ lang: zh ![智能合约源代码验证示意图](./source-code-verification.png) -验证智能合约基本上包含以下步骤: +智能合约验证基本上包含以下步骤: 1. 向编译器输入源文件和编译设置。 2. 编译器输出合约字节码 -3. 获取给定地址下已部署合约的字节码 +3. 获取给定地址处已部署合约的字节码 4. 比较已部署的字节码与重新编译的字节码。 如果代码匹配,将通过给定的源代码和编译设置进行合约验证。 @@ -74,19 +74,19 @@ lang: zh Etherscan 允许你根据原始数据有效载荷(源代码、库地址、编译器设置、合约地址等)重新编译合约字节码。 如果重新编译的字节码与链上合约的字节码(和构造函数参数)相关联,那么[合约就通过了验证](https://info.etherscan.com/types-of-contract-verification/)。 -一旦通过验证,你的合约源代码将获得“已验证”标签,并发布在 Etherscan 上供他人审计。 它还会被添加到[已验证合约](https://etherscan.io/contractsVerified/)部分 — 这是包含已验证源代码的智能合约的存储库。 +一旦通过验证,你的合约源代码将获得“已验证”标签,并发布在 Etherscan 上供他人审查。 它还会被添加到[已验证合约](https://etherscan.io/contractsVerified/)部分 — 这是包含源代码已验证的智能合约的存储库。 -Etherscan 是最常用的合约验证工具。 但是,Etherscan 的合约验证有一个缺点:它无法比较链上字节码和重新编译字节码的 **元数据哈希值**。 因此,Etherscan 中的匹配结果是部分匹配。 +Etherscan 是最常用的合约验证工具。 但是,Etherscan 的合约验证有一个缺点:它无法比较链上字节码和重新编译字节码的**元数据哈希值**。 因此,Etherscan 中的匹配结果是部分匹配。 -[有关在 Etherscan 上验证合约的更多信息](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327)。 +[更多关于在 Etherscan 上验证合约的信息](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327)。 ### Sourcify {#sourcify} -[Sourcify](https://sourcify.dev/#/verifier) 是另一种用于验证开源和去中心化合约的工具。 它不是区块浏览器,只能在[不同的基于以太坊虚拟机的网络](https://docs.sourcify.dev/docs/chains)上验证合约。 它充当公共基础设施,作为其他工具的构建基础,旨在使用元数据文件中的 [ABI](/developers/docs/smart-contracts/compiling/#web-applications) 和 [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) 注释来实现更人性化的合约交互。 +[Sourcify](https://sourcify.dev/#/verifier) 是另一种用于验证开源和去中心化合约的工具。 它不是区块浏览器,只能在[不同的基于以太坊虚拟机的网络](https://docs.sourcify.dev/docs/chains)上验证合约。 它充当公共基础设施,作为其他工具的构建基础,旨在使用元数据文件中的[应用程序二进制接口](/developers/docs/smart-contracts/compiling/#web-applications)和 [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) 注释来实现更人性化的合约交互。 -与 Etherscan 不同,Sourcify 支持与元数据哈希值完全匹配。 经过验证的合约在 HTTP 和 [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs) 上的[公共存储库](https://docs.sourcify.dev/docs/repository/)中访问,这是一种去中心化的[内容寻址](https://web3.storage/docs/concepts/content-addressing/)存储。 由于附加的元数据哈希值是 IPFS 哈希值,因此可以通过 IPFS 获取合约的元数据文件。 +与 Etherscan 不同,Sourcify 支持与元数据哈希值完全匹配。 经过验证的合约在超文本传输协议和 [星际文件系统](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs) 上的[公共存储库](https://docs.sourcify.dev/docs/repository/)中访问,这是一种去中心化的[内容寻址](https://web3.storage/docs/concepts/content-addressing/)存储。 由于附加的元数据哈希值是 IPFS 哈希值,因此可以通过 IPFS 获取合约的元数据文件。 -此外,人们还可以通过 IPFS 检索源代码文件,因为这些文件的 IPFS 哈希值也可以在元数据中找到。 可以通过应用程序接口或[用户界面](https://sourcify.dev/#/verifier)或使用插件提供元数据文件和源文件来验证合约。 Sourcify 监控工具还会监查新区块上的合约创建情况,并尝试验证合约是否在 IPFS 上公布了元数据和源文件。 +此外,人们还可以通过星际文件系统检索源代码文件,因为这些文件的星际文件系统哈希值也可以在元数据中找到。 可以通过应用程序接口或[用户界面](https://sourcify.dev/#/verifier)或使用插件提供元数据文件和源文件来验证合约。 Sourcify 监控工具还会监查新区块上的合约创建情况,并尝试验证合约是否在 IPFS 上公布了元数据和源文件。 [有关在 Sourcify 上验证合约的更多信息](https://blog.soliditylang.org/2020/06/25/sourcify-faq/)。 diff --git a/public/content/translations/zh/developers/docs/storage/index.md b/public/content/translations/zh/developers/docs/storage/index.md index 0e0411a385c..4a8a6bf826b 100644 --- a/public/content/translations/zh/developers/docs/storage/index.md +++ b/public/content/translations/zh/developers/docs/storage/index.md @@ -52,7 +52,7 @@ lang: zh ### 其他注意事项 {#additional-consideration} -星际文件系统是一个储存和访问文件、网站、应用程序和数据的分布式系统。 虽然它没有内置激励计划,但可以与上述任何基于合同的激励解决方案一起使用,以获得更长期的持久性。 另一个将数据持久存储在星际文件系统上的办法是与某项固定服务(表示将您的数据固定在某处)一起使用。 您甚至可以运行自己的星际文件系统节点来为该网络做出贡献,从而将您和/或他人的数据免费持久地存储在星际文件系统上。 +星际文件系统是一个储存和访问文件、网站、应用程序和数据的分布式系统。 虽然它没有内置激励计划,但可以与上述任何基于合同的激励解决方案一起使用,以获得更长期的持久性。 另一个将数据持久存储在星际文件系统上的办法是与某项固定服务(表示将你的数据固定在某处)一起使用。 你甚至可以运行自己的星际文件系统节点来为该网络做出贡献,从而将你和/或他人的数据免费持久地存储在星际文件系统上。 - [星际文件系统](https://docs.ipfs.io/concepts/what-is-ipfs/) - [Pinata](https://www.pinata.cloud/)_(星际文件系统固定服务)_ @@ -83,7 +83,7 @@ SWARM 是一种去中心化的数据存储和分发技术,具有存储激励 ### 去中心化 {#decentrality} -没有有效的工具来衡量平台的去中心化程度,但一般来说,您可能想使用那些没有某种形式的身份验证的工具来证明平台并未中心化。 +没有有效的工具来衡量平台的去中心化程度,但一般来说,你可能想使用那些没有某种形式的身份验证的工具来证明平台并未中心化。 不使用身份验证的去中心化工具: diff --git a/public/content/translations/zh/refi/index.md b/public/content/translations/zh/refi/index.md index 400350b67be..932cdac3fbd 100644 --- a/public/content/translations/zh/refi/index.md +++ b/public/content/translations/zh/refi/index.md @@ -76,4 +76,4 @@ summaryPoint3: 一种可以大幅扩展生态效益资产的工具,例如经 - [碳货币及其在经济体系中的地位的高层概览](https://www.klimadao.finance/blog/the-vision-of-a-carbon-currency) - [小说《The Ministry for the Future》(未来部)描写了一种锚定碳的货币在应对气候变化中发挥的作用。](https://en.wikipedia.org/wiki/The_Ministry_for_the_Future) - [扩大自愿碳市场工作组 (TSVCM) 的详细报告](https://www.iif.com/Portals/1/Files/TSVCM_Report.pdf) -- [CoinMarketCap 术语表中有关再生金融的条目,由 Kevin Owocki 和 Evan Miyazono 撰写](https://coinmarketcap.com/alexandria/glossary/regenerative-finance-refi) +- [CoinMarketCap 术语表中有关再生金融的条目,由Kevin Owocki 和 Evan Miyazono 撰写](https://coinmarketcap.com/alexandria/glossary/regenerative-finance-refi) diff --git a/src/intl/zh/common.json b/src/intl/zh/common.json index 995b26658b2..530670b16e7 100644 --- a/src/intl/zh/common.json +++ b/src/intl/zh/common.json @@ -107,7 +107,7 @@ "grants": "资助", "grant-programs": "生态系统资助计划", "guides": "指南", - "guides-hub": "指南中心", + "guides-hub": "操作方法指南", "history-of-ethereum": "以太坊的历史", "home": "首页", "how-ethereum-works": "以太坊如何运作", diff --git a/src/intl/zh/page-gas.json b/src/intl/zh/page-gas.json new file mode 100644 index 00000000000..1d5494ac24b --- /dev/null +++ b/src/intl/zh/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "以太坊的燃料费:如何运作?", + "page-gas-meta-description": "了解以太坊的燃料:如何运作并支付较少的燃料费", + "page-gas-hero-title": "燃料费", + "page-gas-hero-header": "网络费用", + "page-gas-hero-button-1-content": "什么是燃料?", + "page-gas-hero-subtitle-1": "以太坊上的网络费用称为燃料。", + "page-gas-hero-subtitle-2": "燃料为以太坊提供动力。", + "page-gas-summary-title": "概览", + "page-gas-summary-item-1": "以太坊上的每一笔交易都需要支付少量处理费用", + "page-gas-summary-item-2": "这类费用称为“燃料”费", + "page-gas-summary-item-3": "燃料费随网络拥塞状况变化", + "page-gas-what-are-gas-fees-header": "什么是燃料费?", + "page-gas-what-are-gas-fees-text-1": "可以把以太坊看成一个大型计算机网络,人们可以在以太坊上进行发送信息或运行程序等任务。正如现实世界中一样,完成这些任务需要能量。", + "page-gas-what-are-gas-fees-text-2": "在以太坊中,每个计算操作都设定有“燃料”价格。燃料费是指在交易中所执行操作的总费用。发送交易或运行智能合约时,需要支付燃料费才能处理。", + "page-gas-how-do-i-pay-less-gas-header": "如何支付较少燃料费?", + "page-gas-how-do-i-pay-less-gas-text": "尽管以太坊上较高的燃料费有时无法避免,但你可以应用以下策略减少费用:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "安排交易时间", + "page-gas-how-do-i-pay-less-gas-card-1-description": "就像错峰出行不太拥堵且更实惠一样,在北美睡眠时间使用以太坊往往更优惠。", + "page-gas-how-do-i-pay-less-gas-card-2-title": "等待费用下降", + "page-gas-how-do-i-pay-less-gas-card-2-description": "根据以太坊的拥塞程度,燃料价格每 12 秒上下波动一次。燃料价格高时,只需在交易前等待几分钟可能会看到支付的费用显著下降。", + "page-gas-how-do-i-pay-less-gas-card-3-title": "使用二层网络", + "page-gas-how-do-i-pay-less-gas-card-3-description": "二层网络链在以太坊上构建,费用更低且处理的交易更多。对于无需在以太坊主网进行的交易,它们是节省费用的不错选择。", + "page-gas-try-layer-2": "尝试二层网络", + "page-gas-what-causes-high-gas-fees-header": "是什么造成了高昂的燃料费?", + "page-gas-what-causes-high-gas-fees-text-1": "只要以太坊上的计算量(燃料)超过一个特定阈值,燃料费就开始上涨。超过阈值的燃料越多,燃料费增加越快。", + "page-gas-what-causes-high-gas-fees-text-2": "较高的费用可能由以下因素造成:热门去中心化应用程序或非同质化代币、去中心化交易所周期性增加的交易量,或者高峰时段的海量用户活动等。", + "page-gas-what-causes-high-gas-fees-text-3": "在部署前,以太坊上的开发者应谨慎优化其智能合约的用法。如果许多人都在使用一个编写拙劣的智能合约,将消耗更多燃料并可能无意中造成网络拥塞。", + "page-gas-want-to-dive-deeper": "还想深入探索?", + "page-gas-check-out-the-developer-docs": "查看开发者文档。", + "page-gas-attack-of-the-cryptokitties-header": "谜恋猫攻击", + "page-gas-attack-of-the-cryptokitties-text": "2017 年 11 月,人气项目谜恋猫启动。该项目人气暴涨,造成了严重网络拥塞和极高的燃料费。谜恋猫带来的挑战加剧了寻找以太坊扩容解决方案的紧迫性。", + "page-gas-why-do-we-need-gas-header": "为何需要燃料?", + "page-gas-why-do-we-need-gas-text": "燃料是保障以太坊安全和处理交易的关键要素。燃料在许多方面发挥作用:", + "page-gas-benefits-1-description": "燃料可帮助以太坊防范女巫攻击,阻止恶意行为者通过欺诈活动压垮网络。", + "page-gas-benefits-2-description": "因为计算耗费燃料,通过进行昂贵的交易,无意间或恶意对以太坊进行垃圾邮件攻击在经济上都是不值得的。", + "page-gas-benefits-3-description": "对任何时间可执行的计算量设定硬性限制可避免以太坊被压垮,有助于确保网络始终可访问。", + "page-gas-how-is-gas-calculated-header": "如何计算燃料?", + "page-gas-advanced": "高级", + "page-gas-how-is-gas-calculated-text-1": "支付的总燃料费由以下几部分组成:", + "page-gas-how-is-gas-calculated-item-1": "基础费:由网络设定,必须支付才能进行交易", + "page-gas-how-is-gas-calculated-item-2": "优先费:可选择支付的小费,目的是激励节点运营者添加你的交易", + "page-gas-how-is-gas-calculated-item-3": "使用的燃料单位*记得我们说过燃料代表计算吗?复杂操作(例如与智能合约交互)比简单操作(例如发送交易)使用更多燃料。", + "page-gas-how-is-gas-calculated-list-item-1": "* 查看图 1 了解不同类型的交易使用多少燃料", + "page-gas-how-is-gas-calculated-text-2": "燃料费计算公式:使用的燃料单位 *(基础费 + 优先费)。大多数钱包计算燃料用量并以更直观的方式显示。", + "page-gas-table-figure": "图1:交易类型使用的燃料", + "page-gas-table-header-1": "交易类型", + "page-gas-table-header-2": "使用的燃料单位", + "page-gas-table-item-1-transaction-type": "发送以太币", + "page-gas-table-item-2-transaction-type": "发送 ERC-20 代币", + "page-gas-table-item-3-transaction-type": "转移和非同质化代币", + "page-gas-table-item-4-transaction-type": "在 Uniswap 兑换代币", + "page-gas-faq-header": "常见问题", + "page-gas-faq-question-1-q": "谁获得了我的交易的燃料费?", + "page-gas-faq-question-1-a-1": "大部分燃料费(基础费)被协议销毁(烧毁)。如果交易中包含优先费,会交给提出你的交易的验证者。", + "page-gas-faq-question-1-a-2": "可以在燃料开发者文档中阅读此过程的详细描述。", + "page-gas-faq-question-2-q": "我是否需要用以太币支付燃料费用?", + "page-gas-faq-question-2-a-1": "是的。以太坊上的所有燃料费都必须用原生货币以太币支付。", + "page-gas-faq-question-2-a-2": "有关以太币的更多信息", + "page-gas-faq-question-3-q": "什么是 gwei?", + "page-gas-faq-question-3-a-1": "在大多数钱包或燃料追踪器中,你将看到燃料价格用“gwei”计量。", + "page-gas-faq-question-3-a-2": "Gwei 只是较小的以太币计量单位,像是美分与美元的关系,区别是 1 以太币等于 10 亿 gwei。在涉及极少量以太币时,Gwei 很有用。", + "page-gas-use-layer-2": "使用二层网络" +} diff --git a/src/intl/zh/page-what-is-ethereum.json b/src/intl/zh/page-what-is-ethereum.json index 0abdbaa51ad..702b4ca8031 100644 --- a/src/intl/zh/page-what-is-ethereum.json +++ b/src/intl/zh/page-what-is-ethereum.json @@ -84,7 +84,7 @@ "page-what-is-ethereum-more-on-energy-consumption": "更多关于能源消耗的信息", "page-what-is-ethereum-energy-consumption-chart-legend": "年能源消耗量,单位为亿千瓦时/年", "energy-consumption-chart-global-data-centers-label": "全球数据中心", - "energy-consumption-gold-mining-cbeci-label": "黄金开采", + "energy-consumption-gold-mining-cbeci-label": "开采金矿", "energy-consumption-chart-btc-pow-label": "比特币工作量证明", "energy-consumption-chart-netflix-label": "Netflix", "energy-consumption-chart-eth-pow-label": "以太坊工作量证明", From c49a434284e9ee0147c819d29aef859360ead50f Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 15:39:57 -0700 Subject: [PATCH 371/478] Chinese traditional import Feb 20 (Homepage, Essentials, Exploring, Use Ethereum, Use cases, Staking, Learn pages, Learn hub & guides, Roadmap) --- .../translations/zh-tw/bridges/index.md | 16 ++-- .../content/translations/zh-tw/dao/index.md | 16 ++-- .../zh-tw/decentralized-identity/index.md | 22 +++-- .../content/translations/zh-tw/defi/index.md | 38 ++++---- .../content/translations/zh-tw/desci/index.md | 28 +++--- .../content/translations/zh-tw/eips/index.md | 14 +-- .../zh-tw/energy-consumption/index.md | 52 +++++----- .../translations/zh-tw/governance/index.md | 4 +- .../index.md | 2 +- .../guides/how-to-id-scam-tokens/index.md | 4 +- .../how-to-revoke-token-access/index.md | 2 +- .../zh-tw/guides/how-to-swap-tokens/index.md | 4 +- .../zh-tw/guides/how-to-use-a-bridge/index.md | 4 +- .../zh-tw/guides/how-to-use-a-wallet/index.md | 4 +- .../translations/zh-tw/guides/index.md | 2 +- .../content/translations/zh-tw/nft/index.md | 58 ++++++----- .../content/translations/zh-tw/refi/index.md | 48 +++++----- .../roadmap/account-abstraction/index.md | 70 +++++++------- .../zh-tw/roadmap/beacon-chain/index.md | 25 +++-- .../zh-tw/roadmap/danksharding/index.md | 52 +++++----- .../zh-tw/roadmap/future-proofing/index.md | 18 ++-- .../translations/zh-tw/roadmap/index.md | 26 ++--- .../translations/zh-tw/roadmap/merge/index.md | 93 +++++++++--------- .../zh-tw/roadmap/merge/issuance/index.md | 42 ++++---- .../translations/zh-tw/roadmap/pbs/index.md | 18 ++-- .../zh-tw/roadmap/scaling/index.md | 24 ++--- .../roadmap/secret-leader-election/index.md | 26 ++--- .../zh-tw/roadmap/security/index.md | 12 +-- .../roadmap/single-slot-finality/index.md | 26 ++--- .../zh-tw/roadmap/statelessness/index.md | 38 ++++---- .../zh-tw/roadmap/user-experience/index.md | 16 ++-- .../zh-tw/roadmap/verkle-trees/index.md | 48 +++++----- .../translations/zh-tw/security/index.md | 5 +- .../zh-tw/smart-contracts/index.md | 20 ++-- .../zh-tw/social-networks/index.md | 12 +-- .../translations/zh-tw/staking/dvt/index.md | 12 +-- .../translations/zh-tw/staking/pools/index.md | 19 ++-- .../translations/zh-tw/staking/saas/index.md | 13 +-- .../translations/zh-tw/staking/solo/index.md | 23 ++--- .../zh-tw/staking/withdrawals/index.md | 56 +++++------ .../content/translations/zh-tw/web3/index.md | 26 ++--- .../zh-tw/zero-knowledge-proofs/index.md | 16 ++-- src/intl/zh-tw/common.json | 2 +- src/intl/zh-tw/learn-quizzes.json | 12 +-- src/intl/zh-tw/page-dapps.json | 94 +++++++++++++++--- src/intl/zh-tw/page-developers-index.json | 14 +-- src/intl/zh-tw/page-eth.json | 2 +- src/intl/zh-tw/page-gas.json | 64 +++++++++++++ src/intl/zh-tw/page-get-eth.json | 37 ++++--- src/intl/zh-tw/page-languages.json | 7 +- src/intl/zh-tw/page-layer-2.json | 7 +- src/intl/zh-tw/page-learn.json | 4 +- src/intl/zh-tw/page-roadmap-vision.json | 22 ++--- src/intl/zh-tw/page-run-a-node.json | 4 +- src/intl/zh-tw/page-stablecoins.json | 2 +- .../zh-tw/page-staking-deposit-contract.json | 6 +- src/intl/zh-tw/page-staking.json | 70 +++++++------- .../zh-tw/page-upgrades-get-involved.json | 26 ++--- src/intl/zh-tw/page-upgrades-index.json | 96 +++++++++---------- src/intl/zh-tw/page-upgrades.json | 12 +-- src/intl/zh-tw/page-wallets-find-wallet.json | 11 ++- src/intl/zh-tw/page-what-is-ethereum.json | 6 +- 62 files changed, 852 insertions(+), 700 deletions(-) create mode 100644 src/intl/zh-tw/page-gas.json diff --git a/public/content/translations/zh-tw/bridges/index.md b/public/content/translations/zh-tw/bridges/index.md index afc5e0a93b4..e25bc6c5781 100644 --- a/public/content/translations/zh-tw/bridges/index.md +++ b/public/content/translations/zh-tw/bridges/index.md @@ -6,7 +6,7 @@ lang: zh-tw # 區塊鏈跨鏈橋 {#prerequisites} -_第三代網際網路已發展成由一層和二層網路擴容解決方案組成的生態系統,每個解決方案都有獨特的功能和取捨。 隨著區塊鏈協定數量的增加,[跨鏈移動資產的需求也隨之增加]()。  為了滿足此需求,我們需要跨鏈橋。_ +_Web 3 已發展成由一層和二層網路擴容解決方案組成的生態系統,每個解決方案都有獨特的功能和取捨。 隨著區塊鏈協定數量的增加,[跨鏈移動資產的需求也隨之增加](https://dune.xyz/eliasimos/Bridge-Away-(from-Ethereum))。 為了滿足此需求,我們需要跨鏈橋。_ @@ -30,7 +30,7 @@ _第三代網際網路已發展成由一層和二層網路擴容解決方案組 跨鏈橋能實現以下幾點: -- 跨鏈傳送資產和資訊 +- 資產和資訊的跨鏈轉移。 - 使去中心化應用程式能取得多種區塊鏈的優勢,因此增強區塊鏈的能力(因為協定現在在設計上有更多的創新空間)。 - 能讓使用者存取新的平台,並徹底善用不同區塊鏈的優勢。 - 能讓來自不同區塊鏈生態系統的開發者相互合作,並為使用者建立新平台。 @@ -57,7 +57,7 @@ _第三代網際網路已發展成由一層和二層網路擴容解決方案組 ### 擁有原生加密資產 {#own-native} -假設你想擁有原生比特幣 (BTC),但你的資金只存在於以太坊主網上。 要在以太坊上獲得比特幣,你可以購買包裝比特幣 (WBTC)。 然而,WBTC 是以太坊網路原生的 ERC-20 代幣,這表示它是以太坊版本的比特幣,而不是比特幣區塊鏈上的原始資產。 要擁有原生比特幣,你必須使用跨鏈橋將資產從以太坊轉移到比特幣。 這將會橋接 WBTC 並轉換為原生比特幣。 或者,你可能擁有比特幣,並希望在以太坊去中心化金融協定中使用它。 這將需要以另一種方式橋接,從比特幣到 WBTC,然後可將 WBTC 作為以太坊上的資產。 +假設你想擁有原生比特幣 (BTC),但你的資金只存在於以太坊主網上。 要在以太坊上獲得比特幣,你可以購買包裝比特幣 (WBTC)。 然而,WBTC 是以太坊網路原生的 ERC-20 代幣,這表示它是以太坊版本的比特幣,而不是比特幣區塊鏈上的原始資產。 要擁有原生比特幣,你必須使用跨鏈橋將資產從以太坊轉移到比特幣。 這將會橋接包裝比特幣並轉換為原生比特幣。 或者,你可能擁有比特幣,並希望在以太坊去中心化金融協定中使用它。 這將需要以另一種方式橋接,從比特幣到包裝比特幣,然後可將包裝比特幣作為以太坊上的資產。 你也可以使用 中央化交易所 完成上述所有操作。 但是,除非你已有資金在交易所內,否則會涉及多個步驟,而你可能會覺得使用跨鏈橋比較好。 @@ -69,11 +69,11 @@ _第三代網際網路已發展成由一層和二層網路擴容解決方案組 跨鏈橋具有許多不同的設計類型和複雜度。 通常,跨鏈橋分為兩類,即受信任和去信任跨鏈橋。 -| 受任跨鏈橋 | 去信任跨鏈橋 | -| --------------------------------------------------------------------------------------- | ---------------------------------------------------------- | -| 受信任跨鏈橋倚賴一個中心實體或系統來運作。 | 去信任跨鏈橋利用智慧型合約及演算法來運行。 | -| 在資金監管及跨鏈橋的安全性方面,具有許多信任假設。 使用者大多有賴於跨鏈橋運營商的聲譽。 | 屬於去信任,即跨鏈橋的安全性與底層區塊鏈的安全性相同。 | -| 使用者需放棄對其加密資產的控制。 | 透過智慧型合約,去信任跨鏈橋讓使用者能繼續控制他們的資金。 | +| 受任跨鏈橋 | 去信任跨鏈橋 | +| -------------------------------------------- | ----------------------------- | +| 受信任跨鏈橋倚賴一個中心實體或系統來運作。 | 去信任跨鏈橋利用智慧型合約及演算法來運行。 | +| 在資金監管及跨鏈橋的安全性方面,具有許多信任假設。 使用者大多有賴於跨鏈橋運營商的聲譽。 | 屬於去信任,即跨鏈橋的安全性與底層區塊鏈的安全性相同。 | +| 使用者需放棄對其加密資產的控制。 | 透過智慧型合約,去信任跨鏈橋讓使用者能繼續控制他們的資金。 | 簡而言之,我們可以說受信任跨鏈橋具有信任假設,去信任跨鏈橋則是將信任最小化,不必在底層領域之外做出新的信任假設。 這些術語可做這樣的解釋: diff --git a/public/content/translations/zh-tw/dao/index.md b/public/content/translations/zh-tw/dao/index.md index e8e3e165802..eced44cfeb8 100644 --- a/public/content/translations/zh-tw/dao/index.md +++ b/public/content/translations/zh-tw/dao/index.md @@ -28,13 +28,13 @@ summaryPoint3: 一個將資產投入特定事業的安全場所。 ### 比較 {#dao-comparison} -| 去中心化自治組織 | 傳統組織 | -| -------------------------------------------------- | ------------------------------------------------------ | -| 通常是扁平組織,而且完全民主。 | 通常等級嚴明。 | -| 任何更改都需要成員投票決定後才能實施。 | 視組織結構而定,可能由部分人進行決策,也可能投票表決。 | -| 不需要可信的中間人便能自動統計投票、執行結果。 | 如果允許投票,會在內部計票,而且投票結果必須人工執行。 | -| 以去中心化方式自動提供服務(例如慈善基金的分配)。 | 需要人工處理,或集中管控自動處理,易受操縱。 | -| 所有活動皆完全公開透明。 | 活動通常是隱密進行,公開程度有限。 | +| 去中心化自治組織 | 傳統組織 | +| ------------------------- | --------------------------- | +| 通常是扁平組織,而且完全民主。 | 通常等級嚴明。 | +| 任何更改都需要成員投票決定後才能實施。 | 視組織結構而定,可能由部分人進行決策,也可能投票表決。 | +| 不需要可信的中間人便能自動統計投票、執行結果。 | 如果允許投票,會在內部計票,而且投票結果必須人工執行。 | +| 以去中心化方式自動提供服務(例如慈善基金的分配)。 | 需要人工處理,或集中管控自動處理,易受操縱。 | +| 所有活動皆完全公開透明。 | 活動通常是隱密進行,公開程度有限。 | ### 去中心化自治組織範例 {#dao-examples} @@ -73,7 +73,7 @@ summaryPoint3: 一個將資產投入特定事業的安全場所。 #### 知名案例 {#governance-example} -[以太坊域名服務](https://claim.ens.domains/delegate-ranking)——以太坊域名服務持有者可將其選票分配給積極代表他們參與活動的社群成員。 +[以太坊名稱服務](https://claim.ens.domains/delegate-ranking) — 以太坊名稱服務持有者可將其選票分配給積極代表他們參與活動的社群成員。 ### 自動交易治理 {#governance-example} diff --git a/public/content/translations/zh-tw/decentralized-identity/index.md b/public/content/translations/zh-tw/decentralized-identity/index.md index 48626d9f6c0..1532567f458 100644 --- a/public/content/translations/zh-tw/decentralized-identity/index.md +++ b/public/content/translations/zh-tw/decentralized-identity/index.md @@ -15,11 +15,11 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 然而,傳統的身分管理系統長期以來一直依賴於中心化中間機構來發行、持有和控制你的身分識別和[身分證明](#what-are-attestations)。 這意味著你無法掌控自己身分的相關資訊,也無法決定誰能夠存取你的個人身分資訊 (PII),以及各方擁有多大的訪問權限。 -為了解決這些問題,我們在以太坊等公共區塊鏈上構建了去中心化身分系統。 去中心化身分允許每個人管理他們的身分相關資訊。 借助去中心化身分解決方案,*你*可以建立身分識別、聲明和持有你的身分證明,而無需依賴于中央機構,例如服務提供方或是政府。 +為了解決這些問題,我們在以太坊等公共區塊鏈上構建了去中心化身分系統。 去中心化身分允許每個人管理他們的身分相關資訊。 借助去中心化身分解決方案,_你_可以建立身分識別、聲明和持有你的身分證明,而無需依賴於中央機構,例如服務提供方或是政府。 ## 什麼是身分認同? {#what-is-identity} -身分意味著個人的自我意識,由獨特的特徵定義。 身分是指作為一個*個體*,即一個獨特的人類實體。 身分也可以是指其他非人類的實體,例如組織或機構。 +身分意味著個人的自我意識,由獨特的特徵定義。 身分是指作為一個_個體_,即一個獨特的人類實體。 身分也可以是指其他非人類的實體,例如組織或機構。 ## 什麼是身分識別? {#what-are-identifiers} @@ -37,7 +37,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 身分證明是由一個實體提出的關於另一個實體的聲明。 如果你居住在美國,你的駕駛執照是由機動車輛管理局(一個實體)發布,它證明你(另一個實體)在法律上允許駕駛汽車。 -身分證明與身分識別不同。 身分證明*包含*用於指向特定身分的身分識別,並聲明與此身分相關的屬性。 因此,你的駕駛執照具有身分識別(姓名、出生日期、地址),但也是關於你合法駕駛權利的證明。 +身分證明與身分識別不同。 身分證明_包含_用於指向特定身分的身分識別,並聲明與此身分相關的屬性。 因此,你的駕駛執照具有身分識別(姓名、出生日期、地址),但也是關於你合法駕駛權利的證明。 ### 什麼是去中心化身分識別? {#what-are-decentralized-identifiers} @@ -57,7 +57,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 ### 2. 去中心化資料儲存 {#decentralized-datastores} -區塊鏈充當可驗證的資料註冊系統:一個開放、去信任和去中心化的資訊存儲庫。 公共區塊鏈的存在使得不再需要將身分識別儲存在中心化的註冊系統上。 +區塊鏈充當可驗證的資料註冊系統:一個開放、去信任和去中心化的資訊儲存庫。 公共區塊鏈的存在使得不再需要將身分識別儲存在中心化的註冊系統上。 如果任何人需要確認去中心化身分識別的有效性,他們可以在區塊鏈上查找相關的公鑰。 這與需要由第三方進行驗證的傳統身分識別不同。 @@ -97,7 +97,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 ### 鏈上身分證明 {#onchain-attestations} -鏈上身份證明保存在以太坊區塊鏈上的[智慧型合約](/developers/docs/smart-contracts/)中。 智慧型合約(充當註冊系統)將身分證明對應到相關的鏈上去中心化身分識別(公鑰)。 +鏈上身份證明保存在以太坊區塊鏈上的[智慧型合約](/developers/docs/smart-contracts/)中。 智慧型合約(充當註冊系統)將身分證明對應到相關的鏈上去中心化身分識別(公開金鑰)。 以下範例展示了鏈上身分證明在實踐中的使用方式: @@ -109,7 +109,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 ### 靈魂綁定代幣和身分 {#soulbound} -[靈魂綁定代幣](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)(不可轉讓的非同質化代幣)可以用於收集特定錢包的獨有資訊。 這有效地創建了綁定到特定以太坊地址的唯一鏈上身分,這可能包括代表成就的代幣(例如完成某些特定的線上課程或在遊戲中超過分數門檻)或社區參與代幣。 +[靈魂綁定代幣](https://vitalik.ca/general/2022/01/26/soulbound.html)(不可轉讓的非同質化代幣)可以用於收集特定錢包的獨有資訊。 這有效地創建了綁定到特定以太坊地址的唯一鏈上身分,這可能包括代表成就的代幣(例如完成某些特定的線上課程或在遊戲中超過分數門檻)或社區參與代幣。 ## 去中心化身分的好處 {#benefits-of-decentralized-identity} @@ -135,7 +135,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 [使用以太坊登入](https://login.xyz/)功能將允許伺服器能夠確認使用者的以太坊帳戶,並從他們的帳戶地址中獲取所需的身分證明。 這意味著使用者無需記住冗長的密碼,就能夠訪問平台和網站,進而改善使用者的線上體驗。 -### 2. “了解你的客戶”驗證 {#kyc-authentication} +### 2. 「認識客戶」驗證 {#kyc-authentication} 許多線上服務的使用,需要提供個人的身分證明和憑證,例如駕駛執照或國家護照。 但這種方式是有問題的,因為使用者的私人資訊有可能會被洩露,並且服務提供商無法驗證身分證明的真實性。 @@ -153,14 +153,15 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 ## 使用去中心化身分 {#use-decentralized-identity} -有許多雄心勃勃的項目使用以太坊作為去中心化身分解決方案的基礎: +有許多雄心勃勃的專案使用以太坊作為去中心化身分解決方案的基礎: - **[以太坊名稱服務 (ENS)](https://ens.domains/)** - _一個去中心化的鏈上命名系統,適合機器可讀的識別符號,例如以太坊錢包地址、內容雜湊值和中繼資料。_ -- **[SpruceID](https://www.spruceid.com/)** - _去中心化身分項目,它允許使用者使用以太坊帳戶和以太坊名稱服務個人資料來控制數位身分,而不是依賴第三方服務。_ +- **[SpruceID](https://www.spruceid.com/)** - _去中心化身分專案,它允許使用者使用以太坊帳戶和以太坊名稱服務個人資料來控制數位身分,而不是依賴第三方服務。_ - **[以太坊證明服務 (EAS)](https://attest.sh/)** - _一種去中心化分類帳/協議,用於對任何事物進行鏈上或鏈下證明。_ - **[人性證明](https://www.proofofhumanity.id)** - _人性證明 (PoH) 是建立在以太坊上的社交身分驗證系統。_ - **[BrightID](https://www.brightid.org/)** - _一個去中心化的開源社交身分網路,旨在通過創建和分析社交圖譜來改革身分驗證。_ - **[人格證明護照](https://proofofpersonhood.com/)** - _一個去中心化的數位身分聚合器。_ +- **[walt.id](https://walt.id)** — _一種使開發者和組織能夠利用自主權身份、非同質化代幣/魂縛代幣的開源去中心化身份及錢包基礎設施。_ ## 延伸閱讀 {#further-reading} @@ -170,6 +171,7 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 - [什麼是以太坊 ERC725? 區塊鏈上的自我主權身分管理](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ - [區塊鏈如何解決數位身分問題](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ - [什麼是去中心化身分以及你為什麼需要關心?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- [去中心化身份簡介](https://walt.id/white-paper/digital-identity) — _Dominik Beron_ ### 影片 {#videos} @@ -177,9 +179,11 @@ summaryPoint3: 多虧了加密技術,使用者現在擁有了再次發行、 - [使用以太坊和去中心化身分登錄 Ceramic、IDX、React 和 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _YouTube 使用教學,作者 Nader Dabit,介紹如何構建身分管理系統,透過以太坊錢包建立、讀取和更新使用者個人資料。_ - [BrightID - 以太坊上的去中心化身分](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Bankless 播客節目討論 BrightID,一個以太坊上的去中心化身分解決方案_ - [鏈外互聯網:去中心化身分 & 可驗證憑證](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Evin McMullen 在 EthDenver 2022 的演講 +- [Verifiable Credentials Explained(可驗憑證說明)](https://www.youtube.com/watch?v=ce1IdSr-Kig) - 由 Tamino Baumann 主持演示的 YouTube 講解視頻 ### 社群 {#communities} - [GitHub 上的 ERC-725 聯盟](https://github.com/erc725alliance) — _在以太坊區塊鏈上管理身分的 ERC725 標準的支持者_ - [SpruceID Discord 伺服器](https://discord.com/invite/Sf9tSFzrnt) — _研究使用以太坊登錄的愛好者和開發者社群_ - [Veramo Labs](https://discord.gg/sYBUXpACh4) — _一個開發人員社區,致力於為應用程式構建可驗證資料的框架_ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _由開發者和構建者組成的社區,致力於開發各個行業的去中心化身份應用案例_ diff --git a/public/content/translations/zh-tw/defi/index.md b/public/content/translations/zh-tw/defi/index.md index 53364371494..96bc37de61a 100644 --- a/public/content/translations/zh-tw/defi/index.md +++ b/public/content/translations/zh-tw/defi/index.md @@ -22,7 +22,7 @@ summaryPoint3: 基於所有人都可以編寫的開放原始碼技術。 -## 去中心化金融 vs 傳統金融 {#defi-vs-tradfi} +## 去中心化金融與傳統金融 {#defi-vs-tradfi} 了解去中心化金融潛力的一種最佳方法是了解目前存在的問題。 @@ -37,15 +37,15 @@ summaryPoint3: 基於所有人都可以編寫的開放原始碼技術。 ### 比較 {#defi-comparison} -| 去中心化金融 | 傳統金融 | -| -------------------------------------------------------------- | -------------------------------------------------------------------------- | -| 你的資金由你自己持有。 | 你的資金由企業持有。 | -| 由你自行管控資金流向及使用方式。 | 你必須相信企業不會不當管理你的資金,例如借貸給高風險借款人。 | -| 移轉資金只需要幾分鐘的時間。 | 支付可能因為人工處理而得花上幾天時間。 | -| 交易活動為匿名方式。 | 金融活動與你的身分綁定。 | -| 去中心化金融對所有人開放。 | 使用金融服務必須申請。 | -| 市場永遠開放。 | 員工需要休息,因此市場會關閉。 | -| 奠基於透明的系統 ── 所有人都能查看產品資料及檢查系統運作狀況。 | 金融機構完全是黑箱作業:你不能要求查看他們的放貸記錄、資產管理記錄等資訊。 | +| 去中心化金融 | 傳統金融 | +| ------------------------------- | ------------------------------------- | +| 你的資金由你自己持有。 | 你的資金由企業持有。 | +| 由你自行管控資金流向及使用方式。 | 你必須相信企業不會不當管理你的資金,例如借貸給高風險借款人。 | +| 移轉資金只需要幾分鐘的時間。 | 支付可能因為人工處理而得花上幾天時間。 | +| 交易活動為匿名方式。 | 金融活動與你的身分綁定。 | +| 去中心化金融對所有人開放。 | 使用金融服務必須申請。 | +| 市場永遠開放。 | 員工需要休息,因此市場會關閉。 | +| 奠基於透明的系統──所有人都能查看產品資料及檢查系統運作狀況。 | 金融機構完全是黑箱作業:你不能要求查看他們的放貸記錄、資產管理記錄等資訊。 | 探索去中心化金融應用程式 @@ -133,7 +133,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 今天,資金的借與貸都是圍繞著相關個人進行。 銀行在放款前,需要知道你是不是真的有能力償還貸款。 -去中心化借貸則不需任何一方表明身分即可運作。 相對地,借款者必須提供抵押品,如果無法償還,抵押品就會自動歸貸款者所有。 有些貸款者甚至接受以非同質化代幣作為抵押品。 非同質化代幣為獨特資產(如繪畫)的契據。 [深入了解非同質化代幣](/nft/) +去中心化借貸則不需任何一方表明身分即可運作。 然而,借款者必須提供抵押品,如果無法償還,抵押品就會自動歸貸款者所有。 有些貸款者甚至接受以非同質化代幣作為抵押品。 非同質化代幣為獨特資產(如繪畫)的契據。 [更多非同質化代幣相關資訊](/nft/) 透過這種方式,不必接受徵信調查或提供私人資訊也能借款。 @@ -143,7 +143,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 #### 納稅效益 {#tax-efficiencies} -借款可以讓你獲得需要的資金,而無需出售以太幣(此行為會被課稅)。 相對地,你可以使用以太幣作為抵押品以借貸穩定幣。 如此一來,你便可以在保有以太幣的情況下,獲得所需的現金流。 穩定幣是需要現金時的最佳選擇,因為穩定幣的價值不像以太幣一樣易於波動。 [深入了解穩定幣](#stablecoins) +借款可以讓你獲得需要的資金,而無需出售以太幣(此行為會被課稅)。 但是,你可以使用以太幣作為抵押品以借貸穩定幣。 如此一來,你便可以在保有以太幣的情況下,獲得所需的現金流。 穩定幣是需要現金時的最佳選擇,因為穩定幣的價值不像以太幣一樣易於波動。 [深入了解穩定幣](#stablecoins) #### 閃電貸 {#flash-loans} @@ -245,7 +245,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 以太坊是群眾募資的理想平台: -- 潛在的資助者可以來自任何地方 ── 以太坊及其代幣對世界上所有人開放。 +- 潛在的資助者可以來自任何地方──以太坊及其代幣對世界上所有人開放。 - 過程完全透明,因此籌資者可以證明已經募集了多少資金。 你甚至可以在經過一段時間後追蹤資金的運用情況。 - 募資者可以設定自動退款條件,例如在特定截止期限前未達到最低金額時。 @@ -274,7 +274,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 去中心化保險的目標是使保險更加便宜、理賠更快速,同時更為透明。 隨著自動化程度的提高,保險價格可以更加低廉,理賠也可以更加快速。 用以決定索賠的資料完全透明。 -和其他軟體一樣,以太坊產品也可能受到錯誤或入侵的威脅, 因此目前這個領域有許多保險產品將重點放在保護使用者不會損失資金上。 然而,若干專案開始涵蓋了生活中可能遇到的各種大小意外保障。 Etherisc 的農作物保險就是個很好的例子,這項產品的目標在於[保護肯亞小農對抗乾旱及洪災](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc)。 去中心化保險可以為買不起傳統保險的農民提供更實惠的保障。 +和其他軟體一樣,以太坊產品也可能受到錯誤或入侵的威脅, 因此目前這個領域有許多保險產品將重點放在保護使用者不會損失資金上。 然而,若干專案開始涵蓋生活中可能遇到的各種大小意外保障。 Etherisc 的農作物保險就是個很好的例子,這項產品的目標在於[保護肯亞小農對抗乾旱及洪災](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc)。 去中心化保險可以為買不起傳統保險的農民提供更實惠的保障。 查看保險去中心化應用程式 @@ -296,22 +296,22 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 去中心化金融使用加密貨幣及智慧型合約來提供服務,不需透過中間機構。 在今日的金融體系下,金融機構是交易的保證人。 你的資金是透過金融機構流通,因此賦予了這些機構巨大的權利。 此外,世界上還有數十億人甚至無法使用銀行帳戶。 -在去中心化金融,智慧型合約取代了交易中的金融機構。 智慧型合約是一種以太坊帳戶,可以持有資金並根據特定條件發送/退還資金。 智慧型合約上線後就沒有人可以篡改,它會永遠依照設定的方式運作。 +在去中心化金融中,智慧型合約在交易中取代了的金融機構。 智慧型合約是一種以太坊帳戶,可以持有資金並根據特定條件發送/退還資金。 智慧型合約上線後就沒有人可以篡改,它會永遠依照設定的方式運作。 一份用來發放津貼或零用錢的合約可以設定為每週五從 A 帳戶匯款至 B 帳戶。 只要 A 帳戶還有所需的資金,合約就會持續執行。 沒有人能篡改合約,將 C 帳戶設為收款人藉以竊取資金。 合約也會公開,供所有人檢查及審核。 這意味著不良合約通常很快就會受到社群監控。 -確實,這也意味著目前需要仰賴以太坊社群中能閲讀程式碼的技術人員。 以開放原始碼為基礎的社群會協調開發人員參與監控,但這種需求會隨著時間而趨緩,因為智慧型合約會變得越來越容易閲讀,同時也有其他可以證明程式碼可信度的方法誕生。 +確實,這也意味著目前需要仰賴以太坊社群中能閲讀程式碼的更為精通技術的成員。 以開放原始碼為基礎的社群會約束開發者,但這種需求會隨著時間而趨緩,因為智慧型合約會變得越來越容易閲讀,同時也有其他可以證明程式碼可信度的方法誕生。 ## 以太坊及去中心化金融 {#ethereum-and-defi} 以太坊為去中心化金融提供了良好的基礎,原因包括: -- 以太坊或部署在以太坊上的智慧型合約不屬於任何人所有 ── 這讓所有人都有機會使用去中心化金融, 也意味著沒有人可以變更規則。 +- 以太坊或部署在以太坊上的智慧型合約不屬於任何人所有──這讓所有人都有機會使用去中心化金融, 也意味著沒有人可以變更規則。 - 所有去中心化金融產品都使用著相同的語言:以太坊。 這意味著許多產品可以合作無間地共同運作。 你可以在某個平台上出借代幣,然後透過完全不同的應用程式,在不同的市場中兌換帶有利息的代幣。 這就像可以將銀行的忠誠度點數兌現。 -- 代幣和加密貨幣全都建立在以太坊這個共享帳本上 ── 追蹤交易和所有權全都交給以太坊處理。 -- 以太坊可以實現完全的金融自由 ── 大多數產品不會保管你的資金,控制權完全操之在己。 +- 代幣和加密貨幣全都建立在以太坊這個共享帳本上──追蹤交易和所有權全都交給以太坊處理。 +- 以太坊可以實現完全的金融自由──大多數產品不會保管你的資金,控制權完全操之在己。 你可以把去中心化金融想成好幾層: diff --git a/public/content/translations/zh-tw/desci/index.md b/public/content/translations/zh-tw/desci/index.md index 9866bd0b873..47a29913a51 100644 --- a/public/content/translations/zh-tw/desci/index.md +++ b/public/content/translations/zh-tw/desci/index.md @@ -18,7 +18,7 @@ summaryPoint3: 以開放科學運動為原則。 去中心化科研的目標是創建一個生態系統,鼓勵科學家公開分享研究計畫,在開放任何人輕易獲得甚至參與研究的同時,肯定該科學家的貢獻。 去中心化科研的理念是:所有人都有獲得科學知識的權利,因此科學研究過程應該透明化。 去中心化科研正在開創一種更去中心化且廣泛的科學研究模型,使其更能抵抗中心化管理機構的審查與控制。 去中心化科研的目標是,藉由融資、科研工具與交流渠道的去中心化,為跳脫框架的新點子開創出一個能夠欣欣向榮的環境。 -去中心化科研獎勵可重複性,因而能激發更廣泛多元的融資方案(從[去中心化自治組織](/dao/)、[平方募資](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)到群眾募資等),以及更容易獲得的資料與方法。 +去中心化科研允許更多樣化的資金來源(從[去中心化自治組織](/dao/)、[二次方捐贈](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)到衆籌等等),讓數據和方法更易獲取,并提供可重複性的激勵措施。 ### Juan Benet - 去中心化科研運動 @@ -28,16 +28,16 @@ summaryPoint3: 以開放科學運動為原則。 這份有待補充的清單列出了科學領域中的關鍵問題,以及去中心化科研所能提供的協助方案 -| **去中心化科研** | **傳統科研** | -| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -| 使用平方募資或去中心化自治組織等機制的公眾決定了資金的去向。 | 小型、封閉、中心化團體負責管控資金去向。 | -| 你能夠與世界各地的同儕展開活潑的合作。 | 合作計畫受資助方和所屬機構限制。 | -| 資金決策在線上進行且透明度高。 會探索全新的融資機制。 | 資金決策較為耗時且透明度不足。 融資機制有限。 | -| 利用 Web3 基礎單元更簡單且公開地分享實驗室服務。 | 分享實驗室資源的過程較為遲緩且透明度不足。 | -| 利用 Web3 基礎單元研發出可靠、透明且能與全球共享的全新發表模式。 | 只能藉由既有途徑發表研究,而這些途徑通常被認為缺乏效率、帶有偏見且有剝削傾向。 | -| 你可以藉由同儕審查工作獲得代幣與聲望。 | 同儕審查工作是無償的,只有商業出版商能獲益。 | -| 你產生的知識產權 (IP) 歸你所有且能根據透明條款加以分配。 | 你產生的知識產權歸屬於你所在的機構。 知識產權無法透明地獲得。 | -| 所有研究步驟將在鏈上公佈,無論研究成功與否,所有研究資料均在鏈上共享。 | 出版社不夠公正,導致研究者傾向只分享成功的實驗。 | +| **去中心化科研** | **傳統科研** | +| ----------------------------------- | --------------------------------------- | +| 使用平方募資或去中心化自治組織等機制的公眾決定了資金的去向。 | 小型、封閉、中心化團體負責管控資金去向。 | +| 你能夠與世界各地的同儕展開活潑的合作。 | 合作計畫受資助方和所屬機構限制。 | +| 資金決策在線上進行且透明度高。 會探索全新的融資機制。 | 資金決策較為耗時且透明度不足。 融資機制有限。 | +| 利用 Web3 基礎單元更簡單且公開地分享實驗室服務。 | 分享實驗室資源的過程較為遲緩且透明度不足。 | +| 利用 Web3 基礎單元研發出可靠、透明且能與全球共享的全新發表模式。 | 只能藉由既有途徑發表研究,而這些途徑通常被認為缺乏效率、帶有偏見且有剝削傾向。 | +| 你可以藉由同儕審查工作獲得代幣與聲望。 | 同儕審查工作是無償的,只有商業出版商能獲益。 | +| 你產生的知識產權 (IP) 歸你所有且能根據透明條款加以分配。 | 你產生的知識產權歸屬於你所在的機構。 知識產權無法透明地獲得。 | +| 所有研究步驟將在鏈上公佈,無論研究成功與否,所有研究資料均在鏈上共享。 | 出版社不夠公正,導致研究者傾向只分享成功的實驗。 | ## 以太坊與去中心化科研 {#ethereum-and-desci} @@ -60,7 +60,7 @@ summaryPoint3: 以開放科學運動為原則。 - 可重複的研究結果可由相同的團隊使用相同的方式多次達成。 - 可複製的研究結果可由不同的團隊以相同的實驗方案達成。 -全新的 Web3-內建工具可以確保科學發現以可重複性與可複製性為基礎。 我們可將優質的科學融入到學術界的技術體系中。 Web3 有能力驗證原始資料、計算引擎以及應用結果等分析要素。 共識系統的美妙之處在於,當這些要素由可靠的網路機制維護運作時,所有網絡參與者都可以負責再次運算並驗證每一項結果。 +全新的 Web3-內建工具可以確保科學發現以可重複性與可複製性為基礎。 我們可將優質的科學融入到學術界的技術體系中。 Web3 有能力驗證原始資料、計算引擎以及應用結果等分析要素。 共識系統的美妙之處在於,當這些要素由可靠的網路機制維護運作時,所有網路參與者都可以負責再次運算並驗證每一項結果。 ### 資金來源 {#funding} @@ -78,7 +78,7 @@ Web3 廣泛試驗過去中心化自治組織和 Web3 開發的不同激勵模型 [IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) 還是將正在進行的實驗之資料庫去中心化的關鍵,還可以插入非同質化代幣與 [DeFi](/defi/) 金融化(從資產分割到借貸池與價值評估)。 它還允許如 [VitaDAO](https://www.vitadao.com/) 這樣的去中心化自治組織等鏈上原生實體直接在鏈上進行研究。 不可轉移的[「靈魂綁定」代幣](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)的出現,允許個人證明他們的經驗和證書與他們的以太坊地址相關聯,因而也可能在去中心化科研中發揮重要作用。 -### 資料存儲、存取和架構 {#data-storage} +### 資料儲存、存取和架構 {#data-storage} 使用 Web3 模式可使人們更容易獲得科學資料,分佈式儲存使研究能在災難性事件中倖存下來。 @@ -103,7 +103,7 @@ Web3 廣泛試驗過去中心化自治組織和 Web3 開發的不同激勵模型 - [OceanDAO:管理資料相關科學資金的去中心化自治組織](https://oceanprotocol.com/dao) - [Opscientia:開放的去中心化科研工作流程](https://opsci.io/research/) - [LabDAO:在電腦中折疊蛋白質](https://alphafodl.vercel.app/) -- [Bio.xyz:為你的生物技術去中心化自治組織或去中心化科研項目募資](https://www.molecule.to/) +- [Bio.xyz:為你的生物技術去中心化自治組織或去中心化科研專案募資](https://www.bio.xyz/) - [ResearchHub:發布科學成果並與同行交流](https://www.researchhub.com/) - [VitaDAO:藉由受贊助的長壽研究協議獲得資金](https://www.vitadao.com/) - [Fleming Protocol:推動協作生物醫學發現的開源式資料經濟](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/zh-tw/eips/index.md b/public/content/translations/zh-tw/eips/index.md index cb882af2f5e..5db0d1a72cf 100644 --- a/public/content/translations/zh-tw/eips/index.md +++ b/public/content/translations/zh-tw/eips/index.md @@ -8,21 +8,21 @@ lang: zh-tw ## 什麼是以太坊改進提案? {#what-are-eips} -[以太坊改進提案 (EIP)](https://eips.ethereum.org/) 是一種標準,用於指定以太坊的潛在新功能或流程。 以太坊改進提案中包含擬定變更的技術規格,相當於以太坊社群的「真相來源」。 以太坊的網路更新和應用程式標準乃透過以太坊改進提案流程商討和制定。 +[以太坊改進提案 (EIP)](https://eips.ethereum.org/) 是一種標準,用於明定以太坊的潛在新功能或流程。 以太坊改進提案中包含擬定變更的技術規範,相當於以太坊社群的「事實來源」。 以太坊的網路升級和應用程式標準乃透過以太坊改進提案流程商討和制定。 -以太坊社群的任何人皆可建立以太坊改進提案。 [EIP-1](https://eips.ethereum.org/EIPS/eip-1) 中附有以太坊改進提案撰寫準則。 以太坊改進提案主要應簡明介紹技術規範並概述變更誘因。 以太坊改進提案作者負責在社群內尋求共識並記錄不同意見。 由於提出優秀以太坊改進提案的技術門檻很高,根據過往經驗,大部分以太坊改進提案的作者都是應用程式或者協定開發者。 +以太坊社群的任何人皆可建立以太坊改進提案。 [EIP-1](https://eips.ethereum.org/EIPS/eip-1) 中附有以太坊改進提案撰寫準則。 以太坊改進提案主要應簡明介紹技術規範並概述變更誘因。 以太坊改進提案作者負責在社群內尋求共識並記錄不同意見。 由於提出優秀以太坊改進提案的技術門檻很高,根據過往經驗,通常大部分以太坊改進提案的作者都是應用程式或者協定開發者。 ## 以太坊改進提案為什麼很重要? {#why-do-eips-matter} -以太坊改進提案對於確定如何實作變更以及確保將變更記錄在以太坊上至關重要。 人們依之擬定變更、針對變更展開辯論並採納更新。 [有多種類型的以太坊改進提案](https://eips.ethereum.org/EIPS/eip-1#eip-types),包括核心以太坊改進提案(針對影響共識且要求進行網路升級的低層級協議變更,如 [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559))和以太坊提案請求(針對應用程式標準,如 [EIP-20](https://eips.ethereum.org/EIPS/eip-20) 和 [EIP-721](https://eips.ethereum.org/EIPS/eip-721))。 +以太坊改進提案對於確定如何實作變更以及確保將變更記錄在以太坊上至關重要。 人們依之擬定變更、針對變更展開辯論並採納變更。 [有多種類型的以太坊改進提案](https://eips.ethereum.org/EIPS/eip-1#eip-types),包括核心以太坊改進提案(針對影響共識且要求進行網路升級的低層級協定變更,如 [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559))和以太坊開發者公開徵求意見(針對應用程式標準,如 [EIP-20](https://eips.ethereum.org/EIPS/eip-20) 和 [EIP-721](https://eips.ethereum.org/EIPS/eip-721))。 每次網路升級包含一組以太坊改進提案,網路上的每個[以太坊用戶端](/learn/#clients-and-nodes)都必須實作。 也就是說,為了與以太坊主網上的其他用戶端保持共識,用戶端開發者需要確保他們皆已實作所需的以太坊改進提案。 -以太坊改進提案提供變更的技術規範,不僅如此,以太坊還以其為單位推行治理舉措:任何人皆可擬定以太坊改進提案,然後社群中的各個利害關係人將對此展開辯論,以確定是否應將其作為標准採納或包含在網路升級中。 由於非核心以太坊改進提案不一定被所有應用程式採納(例如,可以建立不實作 EIP-20 的同質化代幣),而核心以太坊改進提案必須被廣泛採納(因全數節點必須升級才能成為同一網路的一部分),與非核心以太坊改進提案相比,核心以太坊改進提案需要社群內達成更廣泛的共識。 +以太坊改進提案提供變更的技術規範,不僅如此,以太坊還以其為單位推行治理舉措:任何人皆可擬定以太坊改進提案,然後社群中的各個利害關係人將對其展開辯論,以確定是否應將其作為標准採納或包含在網路升級中。 由於非核心以太坊改進提案不一定被所有應用程式採納(例如,可以建立不實作 EIP-20 的同質化代幣),而核心以太坊改進提案必須被廣泛採納(因全數節點必須升級才能成為同一網路的一部分),與非核心以太坊改進提案相比,核心以太坊改進提案需要社群內達成更廣泛的共識。 ## 以太坊改進提案演進史 {#history-of-eips} -[以太坊改進提案 (EIP) GitHub 資源庫](https://github.com/ethereum/EIPs)於 2015 年 10 月建立。 以太坊改進提案流程基於[比特幣改進提案 (BIP)](https://github.com/bitcoin/bips) 流程,而後者又是基於 [Python 增強提案 (PEP)](https://www.python.org/dev/peps/) 流程。 +[以太坊改進提案 (EIP) GitHub 存放庫](https://github.com/ethereum/EIPs)於 2015 年 10 月建立。 以太坊改進提案流程基於[比特幣改進提案 (BIP)](https://github.com/bitcoin/bips) 流程,而後者又是基於 [Python 增強提案 (PEP)](https://www.python.org/dev/peps/) 流程。 以太坊改進提案編輯負責審查以太坊改進提案的技術健全性、格式問題,以及修正拼音、文法及程式碼樣式方面的錯誤。 2015 至 2016 年底,Martin Becze、Vitalik Buterin、Gavin Wood 等人擔綱初代的以太坊改進提案編輯。 @@ -46,7 +46,7 @@ lang: zh-tw 倘有興趣成為以太坊改進提案編輯,請詳閱 [EIP-5069](https://eips.ethereum.org/EIPS/eip-5069)。 -以太坊改進提案編輯決定提案何時可成為以太坊改進提案,並且會幫助以太坊改進提案作者推進提案。 [Ethereum Cat Herders](https://www.ethereumcatherders.com/) 會協助安排以太坊改進提案編輯與社群之間的會議(請參見 [EIPIP](https://github.com/ethereum-cat-herders/EIPIP))。 +以太坊改進提案編輯決定提案何時可成為以太坊改進提案,並且會幫助以太坊改進提案作者推進提案。 [以太坊牧貓人組織](https://www.ethereumcatherders.com/)會協助安排以太坊改進提案編輯與社群之間的會議(請參見 [EIPIP](https://github.com/ethereum-cat-herders/EIPIP))。 完整的標準化流程以及圖表請見 [EIP-1](https://eips.ethereum.org/EIPS/eip-1) @@ -54,7 +54,7 @@ lang: zh-tw 若有興趣進一步瞭解以太坊改進提案,請參閱[以太坊改進提案網站](https://eips.ethereum.org/)和 [EIP-1](https://eips.ethereum.org/EIPS/eip-1)。 以下為一些實用連結: -- [EIP 完整清單](https://eips.ethereum.org/all) +- [以太坊改進提案完整清單](https://eips.ethereum.org/all) - [所有以太坊改進提案類型的說明](https://eips.ethereum.org/EIPS/eip-1#eip-types) - [所有以太坊改進提案狀態的說明](https://eips.ethereum.org/EIPS/eip-1#eip-process) diff --git a/public/content/translations/zh-tw/energy-consumption/index.md b/public/content/translations/zh-tw/energy-consumption/index.md index 0d93937f023..d487b73f5ac 100644 --- a/public/content/translations/zh-tw/energy-consumption/index.md +++ b/public/content/translations/zh-tw/energy-consumption/index.md @@ -8,56 +8,58 @@ lang: zh-tw 以太坊是講求綠色環保的區塊鏈。 以太坊的[權益證明](/developers/docs/consensus-mechanisms/pos)共識機制,使用以太幣而非[能源來維持網路的安全性](/developers/docs/consensus-mechanisms/pow)。 以太坊全球網路的能耗約為[每年 0.0026 太瓦/時](https://carbon-ratings.com/eth-report-2022)。 -以太坊能源消耗的估算方式,是由 [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com) 的研究而來。 他們由下往上估算以太坊網路的電力消耗與碳足跡([查看報告](https://carbon-ratings.com/eth-report-2022))。 他們測量了不同節點的電力消耗,這些節點具有不同的硬體和用戶端軟體配置。 以太坊網路年度電力消耗之估計值為 **2,601(兆瓦/時)**(0.0026 太瓦/時);套用區域特定碳強度因素後,等同一年碳排放為 **870 公噸二氧化碳當量**。 該值會隨著節點加入或離開網路而變化 - 你可使用[劍橋區塊鏈網路永續性指標](https://ccaf.io/cbnsi/ethereum)(注意:他們使用稍微不同的方法估計,詳情請見官網)提供的滾動式七天平均估計值持續追蹤。 +以太坊能源消耗的估算方式,是由 [CCRI (Crypto Carbon Ratings Institute)](https://carbon-ratings.com) 的研究而來。 這項研究由下而上估算了以太坊網路的電力消耗量和碳足跡 ([請參閲報告](https://carbon-ratings.com/eth-report-2022))。 他們測量了不同節點的電力消耗,這些節點具有不同的硬體和用戶端軟體配置。 以太坊網路年度電力消耗之估計值為 **2,601(兆瓦/時)**(0.0026 太瓦/時);套用區域特定碳強度因素後,等同一年碳排放為 **870 公噸二氧化碳當量**。 該值會隨著節點加入或離開網路而變化 - 你可使用[劍橋區塊鏈網路永續性指標](https://ccaf.io/cbnsi/ethereum)(注意:他們使用稍微不同的方法進行估計,詳情請見官網)提供的滾動式七天平均估計值持續追蹤。 -要從實際的背景來考慮以太坊的能耗,我們可以比較某些其他產業的年度估計值。 這有助於我們更加了解以太坊的估計值是高還是低。 +要深入瞭解以太坊的能耗,我們可以將其與一些其他產品與產業的年度估計值進行比較。 這有助於我們更加了解以太坊的估計值是高還是低。 -圖表展示了以太坊年度能耗估計值與其他幾個產業的比較(單位:太瓦時/年)。 此處提供的估計值來自 2023 年 5 月取用的公開資訊,下表亦提供來源連結: +上圖比較了以太坊與其他幾種產品和產業的估計能源消耗(單位為太瓦時/年)。 此處提供的估計值來自 2023 年 7 月取用的公開資訊,下表亦提供來源連結。 -| | 年度能耗(太瓦時) | 相較於權益證明以太坊 | 來源 | -| :------------------------ | :----------------: | :------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 全球資料中心 | 200 | 77,000 倍 | [來源](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | -| 淘金 | 131 | 50,000 倍 | [來源](https://ccaf.io/cbnsi/cbeci/comparisons) | -| 比特幣 | 131 | 50,000x | [來源](https://ccaf.io/cbnsi/cbeci/comparisons) | -| 工作量證明以太坊 | 78 | 30,000 倍 | [來源](https://digiconomist.net/ethereum-energy-consumption) | -| Youtube(僅考慮直接消耗) | 12 | 4600 倍 | [來源](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf) | -| 美國電競產業 | 34 | 13,000 倍 | [來源](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | -| 網飛 | 0.451 | 173 倍 | [來源](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | -| PayPal | 0.26 | 100 倍 | [來源](https://app.impaakt.com/analyses/paypal-consumed-264100-mwh-of-energy-in-2020-24-from-non-renewable-sources-27261) | -| AirBnB | 0.02 | 8 倍 | [來源]() | -| 權益證明以太坊 | 0.0026 | 1 倍 | [來源](https://carbon-ratings.com/eth-report-2022) | +| | 年度能耗(太瓦時) | 相較於權益證明以太坊 | 來源 | +|:----------- |:----------:|:----------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| 全球資料中心 | 190 | 73,000 倍 | [來源](https://www.iea.org/commentaries/data-centres-and-energy-from-global-headlines-to-local-headaches) | +| 比特幣 | 149 | 53,000 倍 | [來源](https://ccaf.io/cbnsi/cbeci/comparisons) | +| 開採金礦 | 131 | 50,000 倍 | [來源](https://ccaf.io/cbnsi/cbeci/comparisons) | +| 美國電競產業\* | 34 | 13,000 倍 | [來源](https://www.researchgate.net/publication/336909520_Toward_Greener_Gaming_Estimating_National_Energy_Use_and_Energy_Efficiency_Potential) | +| 工作量證明以太坊 | 21 | 8,100 倍 | [來源](https://ccaf.io/cbnsi/ethereum/1) | +| Google | 19 | 7,300 倍 | [來源](https://www.gstatic.com/gumdrop/sustainability/google-2022-environmental-report.pdf) | +| 網飛 | 0.457 | 176 倍 | [來源](https://assets.ctfassets.net/4cd45et68cgf/7B2bKCqkXDfHLadrjrNWD8/e44583e5b288bdf61e8bf3d7f8562884/2021_US_EN_Netflix_EnvironmentalSocialGovernanceReport-2021_Final.pdf) | +| PayPal | 0.26 | 100 倍 | [來源](https://s202.q4cdn.com/805890769/files/doc_downloads/global-impact/CDP_Climate_Change_PayPal-(1).pdf) | +| AirBnB | 0.02 | 8 倍 | [來源](https://s26.q4cdn.com/656283129/files/doc_downloads/governance_doc_updated/Airbnb-ESG-Factsheet-(Final).pdf) | +| **權益證明以太坊** | **0.0026** | **1 倍** | [來源](https://carbon-ratings.com/eth-report-2022) | -要準確估計能耗是很複雜的,尤其是當測量對象具有複雜的供應鏈時,或具有會影響效率的部署細節時。 以網飛和 Youtube 為例。 其能源消耗估計值隨以下條件而變化:是否只包含用以維護系統及傳遞內容給使用者所消耗的能量(_直接支出_),還是包含產出內容、經營企業辦公室、廣告等等(_間接支出_)所需的能量消耗。 間接耗能也可包括終端使用者裝置使用內容所需的能源,例如電視、電腦及手機,其又取決於使用的裝置而定。 +\*包含終端使用者裝置,如:個人電腦、筆電及遊戲機。 -這個問題在 [Carbon Brief](https://www.carbonbrief.org/factcheck-what-is-the-carbon-footprint-of-streaming-video-on-netflix) 上有一些詳細的討論。 上表中,網飛報告值包含了他們自己報告的*直接*和*間接*耗能。 Youtube 只提供其*直接*耗能的估計值,約為 [12 太瓦時/年](https://www.gstatic.com/gumdrop/sustainability/google-2020-environmental-report.pdf)。 +要準確估計能耗是很複雜的,尤其是當測量對象具有複雜的供應鏈時,或具有會影響效率的部署細節時。 例如,Netflix 和 Google 的能源消耗估計值隨以下條件而變化:是否只包含用以維護系統及傳遞內容給使用者所消耗的能量(_直接能耗_),還是包含產出內容、企業辦公室運營、廣告等等(_間接能耗_)所消耗的能量。 間接能耗也包括電視、電腦及手機等終端使用者裝置使用內容所消耗的能源。 -上面的表格與圖表,也包含了與比特幣及工作量證明以太坊的比較。 需注意的是,工作量證明的能耗並非固定,而是每天都會改變。 工作量證明以太坊所使用的數值,來自[合併](/roadmap/merge/)(升級為權益證明)的前夕,由 [Digiconomist](https://digiconomist.net/ethereum-energy-consumption) 所預測。 [劍橋區塊鏈網路永續指標](https://ccaf.io/cbnsi/ethereum/1)等其他來源,其估計的能耗更低得多(接近 20 太瓦/年)。 比特幣能耗量的估計值,在不同來源之間也有很大的差異,此主題引發了很多複雜的[辯論](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/),不僅是能源消耗量方面,還包括能源的來源和相關道德問題。 能源消耗不一定與環境足跡精準對應,因為不同專案可能使用不同的能源,例如較小或較大比例的再生能源。 舉例來說,[劍橋比特幣電力消耗指標](https://ccaf.io/cbnsi/cbeci/comparisons)指出,天然氣燃除原本會在運送或散佈時損耗的或電力,理論上可以作為比特幣網路需求的驅動來源。 以太坊的永續性路線,是以環保方案取代網路高耗能的部分。 +上述能耗估計值的比較並非完美。 間接能耗的總量因來源而異,且往往未包含終端使用者裝置使用的能源。 每個潛在來源都包含了關於測量對象的更多資訊。 -你可以在[劍橋區塊鏈網路永續性指標的官網](https://ccaf.io/cbnsi/ethereum),瀏覽許多產業的能耗與碳排放估計值。 +上面的表格與圖表,也包含了與比特幣及工作量證明以太坊的比較。 需注意的是,工作量證明網路的能耗不是固定的,而是每天都會改變。 不同來源的能耗估計值也各有差異。 此主題引發了深入的[爭論](https://www.coindesk.com/business/2020/05/19/the-last-word-on-bitcoins-energy-consumption/),不僅討論了耗能,還包括能量來源以及相關的道德問題。 能源消耗不一定與環境足跡精準對應,因為不同專案可能使用不同的能源,例如較小或較大比例的再生能源。 舉例來說,[劍橋比特幣電力消耗指標](https://ccaf.io/cbnsi/cbeci/comparisons)指出,運行比特幣網路所需的能量理論上等同於天然氣燃除或電力輸送時損失的部分。 以太坊的永續性路線,是以環保方案取代網路高耗能的部分。 + +你可以在[劍橋區塊鏈網路永續性指標網站](https://ccaf.io/cbnsi/ethereum),瀏覽許多產業的能耗與碳排放估計值。 ## 每筆交易能耗估計值 {#per-transaction-estimates} -許多文章估算了區塊鏈「每筆交易」的能耗。 這可能會產生誤導,因為提出和驗證區塊所需的能量與其中的交易數量無關。 每筆交易每個單位的能耗,意味著交易越少,能耗越少,反之亦然,但事實並非如此。 此外,每筆交易的估計值,很大程度上取決於區塊鏈的交易吞吐量是如何定義的,並且可以透過調整這個定義來使估計值看起來更大或更小。 +許多文章估算了區塊鏈「每筆交易」的能耗。 這可能會產生誤導,因為提出和驗證區塊所需的能量與其中的交易數量無關。 若以單筆交易作為計算能耗的單位,意味交易越少能耗將越低,反之亦然,但事實並非如此。 此外,每筆交易的估計值,很大程度上取決於區塊鏈的交易吞吐量是如何定義的,並且可以透過調整這個定義來使估計值看起來更大或更小。 -例如,在以太坊上,交易吞吐量不僅是基礎層的交易吞吐量,也是所有「[二層網路](/layer-2/)」卷軸之交易吞吐量的總和。 二層網絡通常不列入計算,但考慮排序者消耗的其他能量(少量)及其處理的交易量(大量),很可能會大幅降低每筆交易的估計值。 這就是比較跨平台每筆交易能耗的數據時,可能產生誤導的原因之一。 +例如,在以太坊上交易的吞吐量不僅包含了基礎層的吞吐量,還包含了「[二層網路](/layer-2/)」卷軸的交易吞吐量總和。 二層網路通常不列入計算,但考慮排序者消耗的額外能量(少量)及其處理的交易量(大量),很可能會大幅降低每筆交易的估計值。 這就是為什麼跨平臺比較每筆交易能耗可能產生誤導的原因之一。 ## 以太坊的碳債 {#carbon-debt} 目前以太坊的能耗非常低,但並非一直都是如此。 以太坊一開始使用工作量證明,其環境成本比現在的權益證明機制大了許多。 -最一開始,以太坊就計劃要實現以權益證明為基礎的共識機制,但為了不犧牲安全性和去中心化,許多年專注投入研發工作。 因此,一開始網路採用了工作量證明機制。 工作量證明要求礦工使用運算硬體來計算數值,過程中會消耗能源。 +最一開始,以太坊就計劃要實現以權益證明為基礎的共識機制,但為了同時確保安全性和去中心化,需要花費多年專注投入研發工作。 因此,一開始網路採用了工作量證明機制。 工作量證明要求礦工使用運算硬體來計算數值,過程中會消耗能源。 ![比較以太坊合併前後的能源消耗,以左方的艾菲爾鐵塔(高度 330 公尺)象徵合併前的高能耗,以及右方 4 公分高的樂高小玩偶,象徵合併後大幅降低的能源消耗](energy_consumption_pre_post_merge.png) -根據 CCRI 估算,合併使以太坊年度電力消耗降低了 **99.988%** 以上。 同樣,以太坊碳足跡減少了約 **99.992%**(從 11,016,000 噸減至 870 噸二氧化碳當量)。 正確來看,減少的碳排放就如同從艾菲爾鐵塔的高度下降到小塑膠玩偶的高度,如上圖所示。 因此,保護以太坊網路的環境成本大幅降低。 同時,網路的安全性相信也已得到改善。 +根據 CCRI 估算,合併使以太坊年度電力消耗降低了 **99.988%** 以上。 同樣,以太坊碳足跡減少了約 **99.992%** (從 11,016,000 噸減至 870 噸二氧化碳當量)。 如上圖所示,從這一角度來看,減少的碳排放就如同從艾菲爾鐵塔的高度下降到小塑膠玩偶的高度。 因此,確保以太坊網路安全性的環境成本大幅降低。 同時,網路的安全性相信也已得到改善。 ## 綠色應用程式層 {#green-applications} -即使以太坊能耗極低,以太坊上仍有穩定成長及高度活躍的[**再生金融 (ReFi)**](/refi/) 廣大社群。 再生金融應用程式使用去中心化金融組件,來建構具有積極外部影響、進而使環境受益的金融應用程式。 再生金融是[「solarpunk」](https://en.wikipedia.org/wiki/Solarpunk)這項廣大運動的一部分,該運動與以太坊緊密結合,目標是將技術進步與環境管理結合。 以太坊去中心化、無需許可,且具有可組合性,這些特性使其成為再生金融和 solarpunk 社群理想的基礎層。 +即使以太坊能耗極低,以太坊上仍有穩定成長及高度活躍的[**再生金融 (ReFi)**](/refi/) 廣大社群。 再生金融應用程式使用去中心化金融組件來構建具有積極外部影響、有益於環境的金融應用程式。 再生金融是[「solarpunk」](https://en.wikipedia.org/wiki/Solarpunk)這項廣大運動的一部分,該運動與以太坊緊密結合,目標是將技術進步與環境管理結合。 以太坊具有去中心化、無需許可以及可組合性的特性,這些特性使其成為再生金融和 solarpunk 社群理想的基礎層。 -[Gitcoin](https://gitcoin.co) 等 Web 3 原生公共財募資平台,舉辦氣候募資輪,以促進以太坊應用程式層開展具環保意識的構建。 透過開發這些倡議(以及[去中心化科研](/desci/)等等),以太坊正成為一項對環境及社會具有淨正效益的科技。 +[Gitcoin](https://gitcoin.co) 等 Web 3 原生公共財募資平台,舉辦氣候募資輪,以促進以太坊應用程式層開展具環保意識的構建。 透過開發這些倡議 (以及[去中心化科研](/desci/)等等),以太坊正成為一項對環境及社會具有淨正效益的科技。 如果你認為此頁內容能更加準確,請提出議題或提取請求 (PR)。 呈現在此頁面上的統計數據皆是基於公開數據的估計值 - 它們不代表 ethereum.org 團隊或以太坊基金會的官方聲明或承諾。 diff --git a/public/content/translations/zh-tw/governance/index.md b/public/content/translations/zh-tw/governance/index.md index 7da27c6f562..5118183203e 100644 --- a/public/content/translations/zh-tw/governance/index.md +++ b/public/content/translations/zh-tw/governance/index.md @@ -75,13 +75,13 @@ _注意:任何人都能參與多個組別,例如,協定開發者可以支 > 此階段可能產生以下結果: -> - 未來升級網路時會考慮此 以太坊改進提案 +> - 未來升級網路時會考慮此以太坊改進提案 > - 將請求進行技術變更 > - 如果非當務之急,或相對於開發工作而言,改善程度不夠顯著,可能會被拒絕 3. **朝最終提案進行迭代:**收到所有利益相關方的回饋意見後,你很可能需要對初始提案進行修改,以提高安全性或更加滿足多種使用者的需求。 當以太坊改進提案納入你認為必須納入的所有變更,你需要再次提供給協定開發者。 之後將進入此流程的下個步驟;或是出現新的問題,提案必須再迭代一輪。 -4. **網路升級中納入以太坊改進提案**:假設以太坊改進提案已核准、測試及實作,以太坊改進提案會被安排為網路升級的一部分。 由於網路升級的協調成本很高(每個人需同步升級),升級通常會將以太坊改進提案綁搭在一起。 +4. **網路升級中納入以太坊改進提案**:假設以太坊改進提案已核准、測試及實作,以太坊改進提案會被安排為網路升級的一部分。 由於網路升級的協調成本很高(每個人需同步升級),升級通常會將以太坊改進提案綁搭在一起。 5. **網路升級啟動**:啟動網路升級後,以太坊改進提案將能在以太坊網路上線。 _注意:網路升級通常會先在測試網上啟動,之後才在以太坊主網上啟動。_ diff --git a/public/content/translations/zh-tw/guides/how-to-create-an-ethereum-account/index.md b/public/content/translations/zh-tw/guides/how-to-create-an-ethereum-account/index.md index 2261fe338d5..6b7293761a4 100644 --- a/public/content/translations/zh-tw/guides/how-to-create-an-ethereum-account/index.md +++ b/public/content/translations/zh-tw/guides/how-to-create-an-ethereum-account/index.md @@ -20,7 +20,7 @@ lang: zh-tw 如果你第一次使用,可以在「找到一個錢包」頁面選擇「加密貨幣新手」篩選條件,得知哪些錢包應含有適合新手使用的所有必要功能。 -![「選擇一個錢包」頁面的篩選選項](./wallet-box.png) +![「選擇錢包」頁面的篩選選項](./wallet-box.png) 另有其他設定檔篩選條件可滿足你的需求。 下面是常用錢包的一些例子,在信任任何軟體之前,你應該先做些功課。 diff --git a/public/content/translations/zh-tw/guides/how-to-id-scam-tokens/index.md b/public/content/translations/zh-tw/guides/how-to-id-scam-tokens/index.md index 8fb59587430..229e4bbe032 100644 --- a/public/content/translations/zh-tw/guides/how-to-id-scam-tokens/index.md +++ b/public/content/translations/zh-tw/guides/how-to-id-scam-tokens/index.md @@ -55,7 +55,7 @@ contentPreview=''> - **正規擁有者**。 詐騙代幣通常會空投大量餘額到預計是真代幣正規擁有者的地址。 - 我們再次以 `wARB` 為例。 [大概 16% 的代幣](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82?a=0x1c8db745abe3c8162119b9ef2c13864cd1fdd72f)由公開標籤為 [Arbitrum Foundation: Deployer](https://etherscan.io/address/0x1c8db745abe3c8162119b9ef2c13864cd1fdd72f) 的地址所擁有。 這*並不是*一個假的地址;它真的是[在以太坊主網上部署真 ARB 合約](https://etherscan.io/tx/0x242b50ab4fe9896cb0439cfe6e2321d23feede7eeceb31aa2dbb46fc06ed2670)的地址。 + 我們再次以 `wARB` 為例。 [大概 16% 的代幣](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82?a=0x1c8db745abe3c8162119b9ef2c13864cd1fdd72f)由公開標籤為 [Arbitrum Foundation: Deployer](https://etherscan.io/address/0x1c8db745abe3c8162119b9ef2c13864cd1fdd72f) 的地址所擁有。 這_並不是_一個假的地址;它真的是[在以太坊主網上部署真 ARB 合約](https://etherscan.io/tx/0x242b50ab4fe9896cb0439cfe6e2321d23feede7eeceb31aa2dbb46fc06ed2670)的地址。 因爲一個地址的 ERC-20 餘額為 ERC-20 合約儲存的一部分,合約開發者可以透過合約將其指定為想要的形式。 合約也可能禁止轉帳,使正規使用者無法擺脫詐騙代幣。 @@ -92,6 +92,6 @@ contentPreview=''> 只要世界上存在價值,就會有嘗試挪為自用的詐騙犯,且在一個去中心化的世界裡,除了你,沒有任何人可以保護你。 希望你記住這幾點,幫助你區別正規代幣和詐騙: - 詐騙代幣會模仿正規代幣,且可以使用同樣的名稱、符號等等。 -- 詐騙代幣*無法*使用相同的合約地址。 +- 詐騙代幣_無法_使用相同的合約地址。 - 正規代幣地址的最佳來源是該代幣的發行機構。 - 若無,你可以使用常見且可信的應用程式,例如 [Uniswap](https://app.uniswap.org/#/swap) 和 [Etherscan 區塊瀏覽器](https://etherscan.io/)。 diff --git a/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md b/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md index 0ade65d34b8..f334b8d4098 100644 --- a/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md +++ b/public/content/translations/zh-tw/guides/how-to-revoke-token-access/index.md @@ -29,7 +29,7 @@ lang: zh-tw 進入網站後,點擊「連接錢包」。 網站也會提示你連接你的錢包。 -確保你的錢包和網站使用的是同一網路。 你會看到與所選網絡相關的智慧型合約。 例如,如果你連接的是以太坊主網,那你將只能看到以太坊合約,而来自其他鏈,如 Polygon 的合约不會在此出現。 +確保你的錢包和網站使用的是同一網路。 你會看到與所選網路相關的智慧型合約。 例如,如果你連接的是以太坊主網,那你將只能看到以太坊合約,而来自其他鏈,如 Polygon 的合约不會在此出現。 ## 步驟 3:選擇一個你想要撤銷的智慧型合約 diff --git a/public/content/translations/zh-tw/guides/how-to-swap-tokens/index.md b/public/content/translations/zh-tw/guides/how-to-swap-tokens/index.md index 99e29852ef6..9fe4ea4e0c3 100644 --- a/public/content/translations/zh-tw/guides/how-to-swap-tokens/index.md +++ b/public/content/translations/zh-tw/guides/how-to-swap-tokens/index.md @@ -8,11 +8,11 @@ lang: zh-tw 你是否厭倦了尋找一個能列出你喜歡的所有代幣的交易所? 你可以使用去中心化交易所兌換大部分代幣。 -代幣兌換是指在以太坊網絡上交換兩種不同的資產,例如將以太幣兌換成 DAI(一種 ERC-20 代幣)。 這個過程高效且便宜。 你需要一個加密錢包來兌換代幣。 +代幣兌換是指在以太坊網路上交換兩種不同的資產,例如將以太幣兌換成 DAI(一種 ERC-20 代幣)。 這個過程高效且便宜。 你需要一個加密錢包來兌換代幣。 **先決條件:** -- 擁有一個加密錢包,你可以跟隨以下指引:[如何:「註冊」以太坊帳戶](/guides/how-to-register-an-ethereum-account/) +- 若擁有一個加密錢包,你可以關注以下教程:[如何:「註冊」以太坊帳戶](/guides/how-to-create-an-ethereum-account/) - 在你的錢包中添加資金 ## 1. 連接你的錢包到所選擇的去中心化交易所 (DEX) diff --git a/public/content/translations/zh-tw/guides/how-to-use-a-bridge/index.md b/public/content/translations/zh-tw/guides/how-to-use-a-bridge/index.md index f508ee2e37c..cabbc96244c 100644 --- a/public/content/translations/zh-tw/guides/how-to-use-a-bridge/index.md +++ b/public/content/translations/zh-tw/guides/how-to-use-a-bridge/index.md @@ -10,10 +10,10 @@ lang: zh-tw **先決條件:** -- 擁有一個加密錢包,你可以跟隨以下指引:[如何:「註冊」以太坊帳戶](/guides/how-to-register-an-ethereum-account/) +- 擁有一個加密錢包,你可以跟隨以下指引:[如何:「註冊」以太坊帳戶](/guides/how-to-create-an-ethereum-account/) - 在你的錢包中添加資金 -## 1. 決定你要使用哪一個二層網路 +## 1. 決定你要使用哪一個二層網路 在我們的[二層網路頁面](/layer-2/)上,你可以更深入地了解不同的專案與重要連結。 diff --git a/public/content/translations/zh-tw/guides/how-to-use-a-wallet/index.md b/public/content/translations/zh-tw/guides/how-to-use-a-wallet/index.md index 204875f28c5..e24a9ca1fae 100644 --- a/public/content/translations/zh-tw/guides/how-to-use-a-wallet/index.md +++ b/public/content/translations/zh-tw/guides/how-to-use-a-wallet/index.md @@ -6,7 +6,7 @@ lang: zh-tw # 如何使用錢包 -學習如何使用錢包的所有基本功能。 如果你還沒有錢包,請閱讀我們的指南[如何建立以太坊帳戶](/guides/how-to-create-an-ethereum-account/)。 +學習如何使用錢包的所有基本功能。 如果你還沒有錢包,請查看[如何建立以太坊帳戶](/guides/how-to-create-an-ethereum-account/)。 ## 打開你的錢包 @@ -51,7 +51,7 @@ lang: zh-tw 1. 訪問任何專案的網站。 2. 如果專案的登陸頁面只是描述該專案的靜態網頁,你應可點擊選單中的「開啟應用程式」按鈕,這麼做會將你導引至實際的應用程式頁面。 -3. 如你已在應用程式頁面,請選擇「連接」。 +3. 進入應用程式後,按一下「連接」。 ![讓使用者透過錢包連接到網站的按鈕](./connect1.png) diff --git a/public/content/translations/zh-tw/guides/index.md b/public/content/translations/zh-tw/guides/index.md index 92fa27cfb8f..e01dc109d28 100644 --- a/public/content/translations/zh-tw/guides/index.md +++ b/public/content/translations/zh-tw/guides/index.md @@ -22,6 +22,6 @@ lang: zh-tw ## 使用以太坊 -1. [如何橋接代幣到二層網絡?](/guides/how-to-use-a-bridge/) - 以太坊交易是否太過昂貴? 可以考慮轉而使用以太坊擴容方案,即二層網絡。 +1. [如何橋接代幣到二層網路?](/guides/how-to-use-a-bridge/) - 以太坊交易是否太過昂貴? 可以考慮轉而使用以太坊擴容方案,即二層網路。 2. [如何兌換代幣](/guides/how-to-swap-tokens/) - 你想要兌換為其他代幣嗎? 本簡潔指南將為你演示如何操作。 diff --git a/public/content/translations/zh-tw/nft/index.md b/public/content/translations/zh-tw/nft/index.md index 9d9102e63a7..997e89f884d 100644 --- a/public/content/translations/zh-tw/nft/index.md +++ b/public/content/translations/zh-tw/nft/index.md @@ -14,38 +14,32 @@ summaryPoint3: 由建置於以太坊區塊鏈上的智慧型合約提供支援 ## 什麼是非同質化代幣? {#what-are-nfts} -每個非同質化代幣都是獨一無二的代幣。 每個非同質化代幣都有不同的屬性(非同質性),它們的稀缺性是可以驗證的。 這與 ERC-20 代幣有明顯分別,其中一組中的每一個代幣都一樣,且具有相同屬性(同質化)。 你不會在乎你錢包內的特定美鈔,因為它們都長得一樣且價值相同。 但你*確實會*在意你自己持有的特定非同質化代幣,因為它們不同於其他的資產,全都有各自的屬性(非同質化)。 +每個非同質化代幣都是獨一無二的代幣。 每個非同質化代幣都有不同的屬性(非同質性),它們的稀缺性是可以驗證的。 這與以太幣和其他基於以太坊的代幣(例如 USDC)不同,後者的每一個代幣都一樣且具有相同的特性(「同質化」)。 你不會在乎你錢包內的其中一張鈔票(以太幣),因為它們都一樣且價值相同。 但你_確實會_在意你自己持有的特定非同質化代幣,因為它們不同於其他的資產,全都有各自的屬性(非同質化)。 -每個非同質化代幣的獨特性使藝術品、收藏品,甚至房地產等等事物能夠代幣化,即一個特定的唯一非同質化代幣對應到現實世界的一些特定且獨一無二的物品或數位物品。 資產的所有權受到太坊區塊鏈的保障 – 沒有人可以修改所有權紀錄,或以複製/貼上的方式新增一個非同質化代幣。 +每個非同質化代幣的獨特性使藝術品、收藏品,甚至房地產等等事物能夠代幣化,即一個特定的唯一非同質化代幣對應到現實世界的一些特定且獨一無二的物品或數位物品。 資產的所有權可以在以太坊區塊鏈上公開驗證。 ## 資產網路 {#internet-of-assets} -非同質化代幣和以太坊解決了網際網路上現存的某些問題。 在一切事物均邁向數位化的同時,以不受中心化組織控制的方式複製實體物品屬性(如稀有度、獨特性、所有權證明) 的需求也隨之產生。 舉例來說,透過非同質化代幣,你可以擁有某音樂的 mp3 檔,其非某公司特定音樂應用程式專屬的音樂;又或者,你可以擁有可自行販賣或交換的社交媒體帳戶名稱,而平臺供應商無法任意從你手上奪走。 +非同質化代幣和以太坊解決了網際網路上現存的某些問題。 隨著一切變得越來越數位化,有需求以不受中心組織控制的方式來複製實體物品的屬性,例如稀缺性、唯一性和所有權證明。 舉例來說,透過非同質化代幣,你可以在所有基於以太坊的應用程式上擁有某個音樂 mp3 檔 的所有權,不必綁定於單一公司特定的音樂 App 上,如 Spotify 或 Apple Music。 你可以擁有可販售或兌換的社交媒體帳號,且無法被平臺提供者任意奪走。 相較於我們大多數人今天使用的網際網路,非同質化代幣網際網路的特色如下... ### 比較 {#nft-comparison} -| 非同質化代幣網際網路 | 目前的網際網路 | -| ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -| 你擁有自己的數位資產! 只有你可以販售或交換這些資產。 | 你向某些組織租用某資產。 | -| 非同質化代幣具有數位獨特性,每個非同質化代幣皆獨一無二。 | 正品和實體複本往往無法區分。 | -| 非同質化代幣的所有權儲存在區塊鏈上供任何人驗證。 | 數位物品的所有權紀錄儲存在由機構控制的伺服器上–由他們說了算。 | +| 非同質化代幣網際網路 | 目前的網際網路 | +| ---------------------------------------------------- | ---------------------------------------------------------- | +| 你擁有自己的數位資產! 只有你可以販售或交換這些資產。 | 你從某些機構租借資產後,資產隨時可能被奪走。 | +| 非同質化代幣具有數位獨特性,每個非同質化代幣皆獨一無二。 | 正品和實體複本往往無法區分。 | +| 非同質化代幣的所有權儲存在區塊鏈上供任何人驗證。 | 數位物品的所有權紀錄儲存在由機構控制的伺服器上–由他們說了算。 | | 非同質化代幣都是以太坊上的智慧型合約。 這表示以太坊上的其他智慧型合約及應用程式中都能輕易使用這些代幣! | 擁有數位物品的公司通常需要自己的「防火牆防禦地區」(指電信業者或服務供應商擁有控制應用、內容與媒體的能力)基礎架構。 | -| 內容創作者可以在任何地點出售自己的作品,還能進入全球市場。 | 創作者依賴其使用的平台所提供的基礎架構和發佈通路。 這些通常會受到使用條款和地理限制的約束。 | -| 非同質化代幣創作者可以保留自身作品的所有權,並將版稅計費直接編程進非同質化代幣的合約。 | 音樂串流服務等平台分到大部分的銷售利潤。 | - -## 非同質化代幣如何運作? {#how-nfts-work} - -如同任何在以太坊上發行的代幣,非同質化代幣同樣以智慧型合約發行。 智慧型合約符合其中一個非同質化代幣標準(常見的有 ERC-721 或 ERC-1155),其定義了合約中有哪些函式。 合約可建立(「鑄造」)非同質化代幣,並將它們指派給特定持有者。 合約中定義的所有權是將特定的非同質化代幣映射到特定地址。 非同質化代幣具有識別碼,通常也有與它相關聯的元數據,因此可使特定代幣具有唯一性。 - -當某人建立或鑄造非同質化代幣時,他們其實是在執行智慧型合約中的某個函式,合約會將某個特定的非同質化代幣分配給他們的地址。 此資訊記錄在合約的儲存空間中,它也是區塊鏈的一部分。 智慧型合約的創作者可以在合約中撰寫額外邏輯,舉例來說:限制非同質化代幣的總供應量,或定義每當代幣被轉移時,應付多少版稅給創作者。 +| 內容創作者可以在任何地點出售自己的作品,還能進入全球市場。 | 創作者依賴其使用的平台所提供的基礎架構和發佈通路。 這些通常會受到使用條款和地理限制的約束。 | +| 非同質化代幣創作者可以保留自身作品的所有權,並將版稅計費直接編程進非同質化代幣的合約。 | 音樂串流服務等平台分到大部分的銷售利潤。 | ## 非同質化代幣有哪些用途? {#nft-use-cases} -非同質化代幣有許多用途,例如: +非同質化代幣有許多用途,包括: - 證明你參加過某活動 - 證明你完成一堂課程 @@ -58,23 +52,37 @@ summaryPoint3: 由建置於以太坊區塊鏈上的智慧型合約提供支援 - 去中心化的網際網路網域名稱 - 去中心化金融中的抵押品 -或許你是位藝術家,想透過非同質化代幣分享你的作品,同時不失去對藝術品的控制權,並因中介而使你的收益受損。 你可以建立一份新合約,並明訂非同質化代幣的數量、它們的屬性,以及連到某些特定藝術品的連結。 作為藝術家,你可以將你應得的版稅編程進智慧型合約(如:每當某非同質化代幣被轉移時,將銷售價格的 5% 撥給合約持有者)。 由於你擁有部署合約的錢包,你隨時也都能證明是你建立了那些非同質化代幣。 你的買家可輕易證明他們擁有賣家收藏品的正版非同質化代幣,因為他們的錢包地址與賣家智慧型合約中的代幣相關聯。 他們可以在以太坊生態系統中使用,並可信任代幣的真實性。 +或許你是位藝術家,想透過非同質化代幣分享你的作品,同時不失去對藝術品的控制權,並且不會因中介而損失收益。 你可以建立一份新合約,並明訂非同質化代幣的數量、屬性,以及連到某些特定藝術品的連結。 作為藝術家,你可以將你應得的版稅編程進智慧型合約 (如:每當非同質化代幣被轉移時,將銷售價格的 5% 撥給合約持有者)。 由於你擁有部署該合約的錢包,你隨時也都能證明是你建立了那些非同質化代幣。 你的買家可輕易證明他們擁有賣家收藏品的正版非同質化代幣,因為他們的錢包地址與賣家智慧型合約中的代幣相關聯。 他們可以在以太坊生態系統中使用非同質化代幣,並可信任代幣的真實性。 -又或者以體育賽事的門票為例, 如同賽事主辦者可以決定要販售幾張門票,非同質化代幣的創作者也可以決定要發行幾份複製品。 有時可能是完全相同的複製品,例如 5000 張普通門票; 有時可能會製作好幾種極為類似,但各不相同的複製品,例如指定席的票券。 此類票券可以在不需要給票務員付款的情況下進行點對點買賣,買家可以隨時檢查合約地址,以確保票券的真實性。 +又或者以體育賽事的門票為例, 如同賽事主辦者可以決定要販售幾張門票,非同質化代幣的創作者也可以決定要發行幾份複製品。 有時可能是完全相同的複製品,例如 5000 張普通門票; 有時可能會製作好幾種極為類似,但各自略有不同的複製品,例如指定席的票券。 此類票券可以在不需要給票務員付款的情況下進行點對點買賣,買家可以隨時檢查合約地址,以確保票券的真實性。 -在 ethereum.org 上,非同質化代幣用於證明人們對我們的 GitHub 儲存庫有所貢獻,或者參加了會議,我們甚至有自己的非同質化代幣網域名稱。 如果你對 ethereum.org 有所貢獻,就可以領取出席證明協議的非同質化代幣。 某些加密貨幣聚會使用出席證明協議作為入場門票。 [深入了解如何貢獻](/contributing/#poap)。 +在 ethereum.org 上,非同質化代幣被用來證明大家對我們的 Github 儲存庫做出了有意義的貢獻(對網站進行編程、撰寫或修改文章等等)、翻譯我們的文字内容,或參加了我們的社群電話會議,以及我們甚至擁有專屬的非同質化代幣域名。 如果你對 ethereum.org 有所貢獻,就可以領取出席證明協定 (POAP) 的非同質化代幣。 某些加密貨幣聚會使用 POAP 作為入場門票。 [深入了解如何貢獻](/contributing/#poap)。 -![ethereum.org 出席證明協議](./poap.png) +![ethereum.org POAP](./poap.png) -此網站也有一個由非同質化代幣提供支援的替代網域名稱:**ethereum.eth**。 我們的 `.org` 位址是由網域名稱系統 (DNS) 供應商集中管理,而 ethereum`.eth` 則是透過以太坊名稱服務 (ENS) 於以太坊註冊, 為我們所有,且由我們管理。 [查看我們的以太坊名稱服務 (ENS) 記錄](https://app.ens.domains/name/ethereum.eth) +此網站也有一個由非同質化代幣提供支援的替代網域名稱:**ethereum.eth**。 我們的 `.org` 位址是由網域名稱系統 (DNS) 供應商集中管理,而 ethereum`.eth` 則是透過以太坊名稱服務 (ENS) 於以太坊註冊, 為我們所有,且由我們管理。 [查看我們的以太坊名稱服務記錄](https://app.ens.domains/name/ethereum.eth) -[深入了解以太坊名稱服務](https://app.ens.domains) +[更多以太坊名稱服務相關資訊](https://app.ens.domains) +## 非同質化代幣如何運作? {#how-nfts-work} + +與以太坊區塊鏈上的任何數位物品一樣,非同質化代幣是透過一種稱爲「智慧型合約」的基於以太坊的特殊電腦程式所建立。 這些合約遵循諸如 ERC-721 或 ERC-1155 的特定規則,這些標準將決定該合約的用途。 + +非同質化代幣智慧型合約的一些關鍵用途: + +- **建立非同質化代幣:**能製造新的非同質化代幣。 +- **分配所有權:**透過將非同質化代幣連結到特定的以太坊地址來追蹤其擁有者。 +- **為每一個非同質化代幣分配一個 ID:**每一個非同質化代幣都擁有一個獨一無二的編號。 此外,通常還會附加一些額外信息(元數據),描述該非同質化代幣所代表的含義。 + +當人們「建立」或「鑄造」非同質化代幣時,他們主要是在告訴智慧型合約將特定非同質化代幣的所有權賦予他們。 該資訊被安全和公開地儲存在區塊鏈中。 + +此外,合約創作者可以添加額外的規則。 可以限制某種非同質化代幣的製造數量或者決定每當非同質化代幣易手時都應獲得一小筆版稅。 + ### 非同質化代幣的安全性 {#nft-security} -以太坊的安全性來自權益證明。 以太坊系統被設計成以經濟制度抑制惡意行為,這讓以太坊得以防竄改。 這也讓非同質化代幣得以成真。 一旦包含你的非同質化代幣交易的區塊最終化,攻擊者要改變它,就得花費數百萬以太幣。 任何運行以太坊軟體的人皆能立即偵測到對非同質化代幣進行的欺詐性篡改,且惡意行為者也會遭到經濟處罰及驅逐。 +以太坊的安全性來自權益證明。 以太坊從經濟性的角度抑制惡意行為,這讓以太坊得以防竄改。 這也讓非同質化代幣得以成真。 一旦包含你的非同質化代幣交易的區塊最終化,攻擊者要改變它,就得花費數百萬以太幣。 任何運行以太坊軟體的人皆能立即偵測到對非同質化代幣進行的欺詐性篡改,且惡意行為者也會遭到經濟處罰及驅逐。 與非同質化代幣有關的安全問題最常與釣魚詐騙、智慧型合約漏洞或使用者錯誤(如無意間洩漏私密金鑰)有關,所以良好的錢包安全性對非同質化代幣持有者十分重要。 @@ -84,7 +92,7 @@ summaryPoint3: 由建置於以太坊區塊鏈上的智慧型合約提供支援 ## 了解更多 {#further-reading} -- [非同質化代幣的入門指南](https://linda.mirror.xyz/df649d61efb92c910464a4e74ae213c4cab150b9cbcc4b7fb6090fc77881a95d) – _Linda Xie,2020 年 1 月_ +- [非同質化代幣入門指南](https://linda.mirror.xyz/df649d61efb92c910464a4e74ae213c4cab150b9cbcc4b7fb6090fc77881a95d) – _Linda Xie,2020 年 1 月_ - [Etherscan 的非同質化代幣追蹤器](https://etherscan.io/nft-top-contracts) - [ERC-721 代幣標準](/developers/docs/standards/tokens/erc-721/) - [ERC-1155 代幣標準](/developers/docs/standards/tokens/erc-1155/) diff --git a/public/content/translations/zh-tw/refi/index.md b/public/content/translations/zh-tw/refi/index.md index 9169278f088..b9ba404a152 100644 --- a/public/content/translations/zh-tw/refi/index.md +++ b/public/content/translations/zh-tw/refi/index.md @@ -1,34 +1,34 @@ --- title: 再生金融 (ReFi) -description: 再生金融概覽及當前使用案例。 +description: 再生金融概觀及當前使用案例。 lang: zh-tw template: use-cases emoji: ":recycle:" sidebarDepth: 2 image: /future_transparent.png alt: "" -summaryPoint1: 建立在可再生原則上的替代性金融系統。 -summaryPoint2: 使用以太坊嘗試解決全球協調危機,如氣候變遷。 +summaryPoint1: 建立在再生原則上的替代性經濟體系 +summaryPoint2: 嘗試使用以太坊解決全球協調危機,如氣候變遷 summaryPoint3: 大幅擴展生態效益資產(如已驗證碳權)的工具 --- -## 再生金融 (ReFi) 是什麼? {#what-is-refi} +## 什麼是再生金融 (ReFi)? {#what-is-refi} -**再生金融 (ReFi)** 是建立在區塊鏈上的一整套想法及工具,目標是建立可再生經濟,而非榨取或剝削式經濟。 榨取式系統最終會耗盡可用資源並崩潰;若沒有再生機制,這套系統便缺乏恢復力。 再生金融在此假設下運作:貨幣的價值創造必須脫離以非永續的手段,從我們星球及社群抽取資源。 +**再生金融 (ReFi)** 是建立在區塊鏈上的一整套想法及工具,目標是建立再生經濟,而非榨取或剝削式經濟。 榨取式系統最終會耗盡可用資源並崩潰;若沒有再生機制,這套系統便缺乏恢復力。 再生金融在此假設下運作:貨幣價值的創造必須脫離以非永續的手段,從我們星球及社群抽取資源。 相對的,再生金融的目標是透過建立再生循環以解決環境、公共或社會問題。 這些系統為參與者創造了價值,同時也有益於生態系統及社群。 -再生經濟的概念由[資本研究機構](https://capitalinstitute.org) (Capital Institute) 的 John Fullerton 率先提出,此概念為再生金融的基礎之一。 他提出了組成底層系統健康的八個關聯原則: +再生金融的其中一個基礎是由 Capital Institute 的 John Fullerton 所提出的再生經濟概念。 他提出了支撐系統健康的[八項相互關聯的原則](https://capitalinstitute.org/8-principles-regenerative-economy/): ![八個關聯原則](./refi-regenerative-economy-diagram.png) -再生金融項目透過[智慧型合約](/developers/docs/smart-contracts/)及[去中心化金融 (DeFi)](/defi/) 應用程式來實現這些原則,從而獎勵可再生行為,例如復原衰退的生態系統及促進氣候變遷及生物多樣性減損等國際性議題的大規模合作。 +再生金融專案透過[智慧型合約](/developers/docs/smart-contracts/)及[去中心化金融 (DeFi)](/defi/) 應用程式來實現這些原則,從而獎勵可再生行為,例如復原衰退的生態系統及促進氣候變遷及生物多樣性減損等國際性議題的大規模合作。 -再生金融也和[去中心化科研 (DeSci)](/desci/) 運動重疊,此運動將以太坊當成融資、創建、審查、融資、儲存及傳播科學知識的平臺。 去中心化科研工具有益於開發可驗證的再生活動導入及監控之標準及實踐,例如:植樹、消除海洋中的塑膠垃圾,或復原衰退的生態系統等再生活動。 +再生金融也和[去中心化科研 (DeSci)](/desci/) 運動重疊,此運動將以太坊當成融資、創建、審查、信貸、儲存及傳播科學知識的平臺。 去中心化科研工具有益於開發可驗證的再生活動實作及監控之標準及實踐,例如:植樹、消除海洋中的塑膠垃圾,或復原衰退的生態系統等再生活動。 ## 碳權代幣化 {#tokenization-of-carbon-credits} -**[自願性碳交易市場 (VCM)](https://climatefocus.com/so-what-voluntary-carbon-market-exactly/)** 是為項目融資的一種機制,該項目必須對碳排放產生經驗證的正向影響,能減少持續進行中的碳排放,或消除大氣中已排放的溫室氣體。 這些項目在經過驗證後會收到稱為「碳權」的資產,他們可將其出售給願意支持氣候行動的個人或組織。 +**[自願性碳交易市場 (VCM)](https://climatefocus.com/so-what-voluntary-carbon-market-exactly/)** 是為專案融資的一種機制,此等專案必須對碳排放產生經驗證的正向影響,能減少持續進行中的碳排放,或消除已排放到大氣中的溫室氣體。 此等專案在經過驗證後會收到稱為「碳權」的資產,碳權可出售給願意支持氣候行動的個人或組織。 除了自願性碳交易市場外,也有若干政府批准的官方碳交易市場(「規範市場」),目標是透過特定司法管轄區(如國家或地區)的法律或法規來制定碳權價格,控制可分配的許可供應量。 規範市場能獎勵其司法管轄區內的汙染排放者減少碳排放,但無法消除已被排放的溫室氣體。 @@ -40,40 +40,40 @@ summaryPoint3: 大幅擴展生態效益資產(如已驗證碳權)的工具 4. 交易速度太慢 5. 缺乏可擴容性 -將自願性碳交易市場過渡到以區塊鏈為基礎的新**數位碳交易市場 (DCM)** 可能是一個升級現有碳權驗證、交易及消費技術的好機會。 區塊鏈允許公開驗證數據、更廣泛的使用者存取權,以及更高的流動性。 +將自願性碳交易市場過渡到以區塊鏈為基礎的新**數位碳交易市場 (DCM)** 可能是一個升級現有碳權驗證、交易及消費技術的好機會。 區塊鏈允許公開可驗證的資料、更廣泛的使用者存取權,以及更高的流動性。 -再生金融項目採用區塊鏈科技來緩解傳統市場遇到的諸多問題: +再生金融專案採用區塊鏈科技來緩解傳統市場遇到的諸多問題: - **流動性集中於少數流動池中**,任何人都能在裡面自由交易。 大型組織或個人可以直接在流動池中交易,不用手動尋找買家/賣家,也不需要支付參與費用或預先註冊。 -- **所有交易都記錄在公開的區塊鏈上**。 數位碳交易市場中一出現碳權,每筆交易活動的路徑永遠都能被追蹤。 +- **所有交易都記錄在公開的區塊鏈上**。 數位碳交易市場中一出現碳權交易,每筆交易活動的路徑永遠都能被追蹤。 - **交易幾乎即時完成**。 透過傳統市場獲得大量碳權可能會花上數天或數週的時間,但在數位碳交易市場中只需幾秒即可實現。 -- **交易活動不需要中間人**,中間人還會向你收取高額費用。 根據分析公司的統計,數位碳權[與同等的傳統碳權相比,成本降低了 62%](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne)。 +- **交易活動不需要中間人**,中間人還會向你收取高額費用。 根據分析公司的資料,數位碳權[與同等的傳統碳權相比,成本降低了 62%](https://www.klimadao.finance/blog/klimadao-analysis-of-the-base-carbon-tonne)。 - **數位碳交易市場既可擴張**,亦可滿足個人及跨國公司的需求。 ### 數位碳交易市場的核心元件 {#key-components-dcm} 當前的數位碳交易市場由四個主要元件所組成: -1. [Verra](https://verra.org/project/vcs-program/registry-system/) 和 [Gold Standard](https://www.goldstandard.org/) 等登記處可確保建立碳權的項目可信、可靠。 他們也運用資料庫來記錄數位碳權的來源,碳權可在其中轉移或用罄(註銷)。 +1. [Verra](https://verra.org/project/vcs-program/registry-system/) 和 [Gold Standard](https://www.goldstandard.org/) 等登記處可確保建立碳權的專案可信、可靠。 他們也運用資料庫來記錄數位碳權的來源,碳權可在其中轉移或用罄(註銷)。 -一波建立於區塊鏈的創新項目正試圖顛覆該領域的現有企業。 +一波建立於區塊鏈的創新專案正試圖顛覆該領域的現有企業。 -2. 碳權跨鏈橋,又稱 代幣轉換器,提供了將碳權由傳統登記處轉移到數位碳交易市場的技術。 著名例子包括 [Toucan Protocol](https://toucan.earth/)、[C3](https://c3.app/)和[Moss.Earth](https://moss.earth/)。 -3. 整合服務是一種向使用者端提供碳減排和/或移除碳權的服務,讓使用者可以宣稱碳權對環境的效益,並與全世界分享他們對氣候行動的支持。 +2. 碳權跨鏈橋,又稱 代幣轉換器,提供了代表傳統登記處中的碳權並將其轉移到數位碳交易市場的技術。 著名例子包括 [Toucan Protocol](https://toucan.earth/)、[C3](https://c3.app/) 和 [Moss.Earth](https://moss.earth/)。 +3. 整合服務是一種向使用者端提供碳減排和/或移除碳權的服務,讓使用者可以宣稱碳權對環境的效益,並與全世界分享他們對氣候行動的支援。 -像是 [Klima Infinity](https://www.klimadao.finance/infinity) 和 [Senken](https://senken.io/) 提供了第三方開發的各種項目,並在既定標準(如 Verra)下發行;其他如 [Nori](https://nori.com/) 就只提供了以其自家碳權標準開發的特定項目,由他們發行這些項目,他們也為之準備了自己的專門市場。 +像是 [Klima Infinity](https://www.klimadao.finance/infinity) 和 [Senken](https://senken.io/) 提供了第三方開發的各種專案,並在既定標準(如 Verra)下發行;其他如 [Nori](https://nori.com/) 就只提供了以其自家碳權標準開發的特定專案,由他們發行這些專案,他們也為之準備了自己的專門市場。 -4. 基礎設施促使碳交易市場整體供應鏈的影響和效益隨之擴張。 [KlimaDAO](http://klimadao.finance/) 將流動性當成公共財(允許任何人以透明的價格買賣碳權)供應,透過獎勵來提高碳交易市場和碳註銷(指碳權的配額永久減少)的吞吐量,並提供簡單易用的可交互運作工具來存取相關數據,以及收購和註銷各種代幣化碳權。 +4. 基礎設施促使碳交易市場整體供應鏈的影響和效益隨之擴張。 [KlimaDAO](http://klimadao.finance/) 將流動性當成公共物品(允許任何人以透明的價格買賣碳權)供應,透過獎勵來提高碳交易市場和碳註銷(指碳權的配額永久減少)的吞吐量,並提供簡單易用的可交互運作工具來存取相關資料,以及收購和註銷各種代幣化碳權。 -## 超越碳交易市場的再生金融 {#refi-beyond} +## 碳交易市場以外的再生金融 {#refi-beyond} -雖然整體來說,目前各界對碳交易市場極為重視,且此領域中,特別看重從自願性碳交易市場轉換到數位碳交易市場,但「再生金融」一詞並不囿限於碳。 碳權以外的其他環境資產均可被開發和代幣化,這表示其他外部成本也可以在未來經濟體系的基礎層中被定價。 此外,再生式的經濟模型也可用於其他領域,如使用 [Gitcoin](https://gitcoin.co/) 等平方融資平臺為公共財融資。 以開放參與及公平分配資源為核心精神的組織讓每個人都能資助開源軟體項目和教育、環保和社群導向項目。 +雖然整體來說,目前各界對碳交易市場極為重視,且此領域中,特別看重從自願性碳交易市場轉換到數位碳交易市場,但「再生金融」一詞並不囿限於碳。 碳權以外的其他環境資產均可被開發和代幣化,這表示其他外部成本也可以在未來經濟體系的基礎層中被定價。 此外,再生式的經濟模型也可用於其他領域,如使用 [Gitcoin](https://gitcoin.co/) 等二次方融資平臺為公共物品融資。 以開放參與及公平分配資源為核心精神的組織讓每個人都能資助開源軟體專案和教育、環保和社群導向專案。 -透過將資本由搾取式的做法轉向成再生循環的金錢流,對那些提供了社會、環境,或公共利益,以及可能難以夠過傳統金融取得資金的項目及公司來說,他們因而能順利發展,並更快、更輕鬆地為社會產生正向外部影響。 轉變到此融資模式也開啟了更包容的經濟體系,各種背景的人都可以成為主動參與者,而非僅僅是被動的觀察者。 再生金融是以太坊的願景,可作為一種行動協調機制,解決人類及地球上所有生命正面臨的現存挑戰——並作為新經濟典範的基礎層,促進更包容且更永續的未來數百年。 +透過將資本由搾取式的做法轉變成再生循環的金錢流,對那些提供了社會、環境,或公共利益,以及可能難以透過傳統金融取得資金的專案及公司來說,他們因而能順利發展,並更快、更輕鬆地為社會產生正向外部影響。 轉變到此融資模式也開啟了更包容的經濟體系,各種背景的人都可以成為主動參與者,而非僅僅是被動的觀察者。 再生金融是以太坊的願景,可作為一種行動協調機制,解決人類及地球上所有生命正面臨的現存挑戰 — 並作為新經濟典範的基礎層,促進更包容且更永續的未來數百年。 ## 關於再生金融的延伸閱讀 -- [深入了解代幣化碳權及其在經濟中的地位](https://www.klimadao.finance/blog/the-vision-of-a-carbon-currency) -- [小說《未來部門》(Ministry for the Future),描繪了代幣化碳權在對抗氣候變遷上起到的作用。](https://en.wikipedia.org/wiki/The_Ministry_for_the_Future) +- [碳貨幣及其在經濟中的地位概觀](https://www.klimadao.finance/blog/the-vision-of-a-carbon-currency) +- [小說《未來部門》(Ministry for the Future),描繪了碳貨幣在對抗氣候變遷上起到的作用。](https://en.wikipedia.org/wiki/The_Ministry_for_the_Future) - [Taskforce 針對擴張自願性碳交易市場所撰的詳細報告](https://www.iif.com/Portals/1/Files/TSVCM_Report.pdf) - [由 Kevin Owocki 和 Evan Miyazono 針對再生金融所建的 CoinMarketCap 術語列表](https://coinmarketcap.com/alexandria/glossary/regenerative-finance-refi) diff --git a/public/content/translations/zh-tw/roadmap/account-abstraction/index.md b/public/content/translations/zh-tw/roadmap/account-abstraction/index.md index 6dcef3ef7f1..64ed2d74e59 100644 --- a/public/content/translations/zh-tw/roadmap/account-abstraction/index.md +++ b/public/content/translations/zh-tw/roadmap/account-abstraction/index.md @@ -10,23 +10,23 @@ summaryPoints: # 帳戶抽象 {#account-abstraction} -使用者使用外部帳戶 (**[Externally Owned Accounts, EOA](/glossary/#eoa)**) 與以太坊互動。 這是開啟交易或執行智慧型合約的唯一方法, 限制了使用者與以太坊互動的方式。 舉例而言,它使得批次處理交易變得困難,並且要求使用者始終保持一定的以太幣餘額來支付 Gas 費用。 +使用者使用**[外部帳戶 (EOA)](/glossary/#eoa)** 與以太坊互動。 這是開啟交易或執行智慧型合約的唯一方法, 限制了使用者與以太坊互動的方式。 舉例而言,它使得批次處理交易變得困難,並且要求使用者始終保持一定的以太幣餘額來支付燃料費用。 -帳戶抽象能夠解決這些問題,藉助它,使用者可以透過編程,靈活地將更高的安全性和更好的使用體驗帶到其帳戶中。 這可以透過兩種方式實現:[更新外部帳戶](https://eips.ethereum.org/EIPS/eip-3074),這樣他們可以由智慧型合約控制;[更新智慧型合約](https://eips.ethereum.org/EIPS/eip-2938),這樣他們可以開啟交易。 兩個選項皆須更動以太坊協定。 還有第三條路徑涉及新增[第二個獨立的交易系統](https://eips.ethereum.org/EIPS/eip-4337),以便與現有協定並行運行。 無論選取哪條路徑,結果都是經由智慧型合約錢包存取以太坊,不管是作為現有協定一部分的本地支援或是藉由附加交易網路。 +帳戶抽象能夠解決這些問題,藉助它,使用者可以透過編程,靈活地將更高的安全性和更好的使用體驗帶到其帳戶中。 這可以透過兩種方式實現:[升級外部帳戶](https://eips.ethereum.org/EIPS/eip-3074),這樣它們可以由智慧型合約控制;[升級智慧型合約](https://eips.ethereum.org/EIPS/eip-2938),這樣他們可以發起交易。 兩個方案皆須變更以太坊協定。 還有第三條路徑涉及新增[第二個獨立的交易系統](https://eips.ethereum.org/EIPS/eip-4337),以便與現有協定並行運行。 無論選取哪條路徑,結果都是經由智慧型合約錢包存取以太坊,不管是作為現有協定一部分的本地支援或是藉由附加交易網路。 智慧型合約錢包為使用者帶來諸多好處,包括: - 自行定義靈活的安全性規則 - 遺失金鑰時恢復帳戶 -- 安全地與信任的裝置或個人共用帳戶 -- 幫助別人支付 Gas 費用,或者讓別人幫忙支付自己的 Gas 費用 -- 同時批量處理交易(例如一次性核准或交換) +- 安全地與受信任的裝置或個人共用帳戶 +- 幫助別人支付燃料費用,或者讓別人幫忙支付自己的燃料費用 +- 同時批量處理交易(例如一次性核准並執行兌換) - 為去中心化應用程式和錢包開發者提供更多機會來創新使用者體驗 目前,這些優勢並未得到本地的支援,因為只有外部帳戶 ([EOA](/glossary/#eoa)) 才能開啟交易。 外部帳戶純粹只是公開-私密金鑰對。 它們的作用原理為: -- 如果你有私密金鑰,就可以在以太坊虛擬機 (EVM) 內*做任何事情* -- 如果沒有私密金鑰,就*什麼事也做不了*。 +- 如果你有私密金鑰,就可以在以太坊虛擬機 (EVM) 內_做任何事情_ +- 如果沒有私密金鑰,就_什麼事也做不了_。 遺失的金鑰無法找回,竊賊可以利用被盜的金鑰立即存取帳戶中的所有資金。 @@ -36,91 +36,91 @@ summaryPoints: ## 超越種子助記詞 {#beyond-seed-phrases} -現今的帳戶使用依據種子助記詞計算出的私密金鑰來保護。 任何有權存取種子助記詞的人皆可輕鬆發現保護帳戶的私密金鑰,並取得其保護之所有資產的存取權限。 遺失的私密金鑰和種子助記詞將永遠無法恢復,所控制的資產亦將永遠凍結。 即使對於專家使用者來說,保管這些種子助記詞也很困難,且助記詞網路釣魚是使用者被騙的最常見方式之一。 +現今的帳戶使用依據種子助記詞計算出的私密金鑰來保護。 任何有權存取種子助記詞的人皆可輕鬆發現保護帳戶的私密金鑰,並取得其保護之所有資產的存取權限。 遺失的私密金鑰和種子助記詞將永遠無法恢復,所控制的資產亦將永遠凍結。 即使對於專家使用者來說,保管這些種子助記詞也很困難,且種子助記詞網路釣魚是使用者被騙的最常見方式之一。 帳戶抽象將使用智慧型合約來持有資產和授權交易,從而解決這個問題。 然後可以用客製化邏輯裝飾這些智慧型合約,以使其盡可能安全並為使用者量身訂製。 最終,你依舊使用私密金鑰來管控對帳戶的存取,但安全網可以讓你的管理工作變得更輕鬆、更安全。 -例如,可以將備份金鑰新增至錢包中,以便在主金鑰遺失或意外暴露時,能夠在獲得備份金鑰許可的情況下,用新的安全金鑰取代主金鑰。 你可以透過不同方式保護這些金鑰,或者將它們分配給受信任的監護人。 如此,小偷便更難完全控制你的資金。 同樣,你可以向錢包新增規則,以減少主金鑰洩露時的影響,舉例來說,你可以允許透過單一簽名來驗證小額交易,而大額交易則需要多位經驗證簽署者的批准。 智慧型合約錢包還有其他方法可以幫助你阻止竊賊,例如,可以使用白名單來阻止每筆交易,除非交易是傳送到受信任的地址或是透過你預先批准的多個金鑰進行驗證。 +例如,可以將備份金鑰新增至錢包中,以便在主金鑰遺失或意外暴露時,能夠在獲得備份金鑰許可的情況下,用新的安全金鑰取代主金鑰。 你可以透過不同方式保護這些金鑰,或者將它們分配給受信任的監護人。 如此,竊賊便更難完全控制你的資金。 同樣,你可以向錢包新增規則,以減少主金鑰洩露時的影響,舉例來說,你可以允許透過單一簽名來驗證小額交易,而大額交易則需要多位經驗證簽署者的批准。 智慧型合約錢包還有其他方法可以幫助你阻止竊賊,例如,可以使用白名單來阻止每筆交易,除非交易是傳送到受信任的地址或是透過你預先批准的多個金鑰進行驗證。 ### 可以內建到智慧型合約錢包中的安全邏輯範例: - **多重簽名授權**:可以在多個受信任的人員或裝置之間共用授權憑證。 然後可以對合約進行設定,要求交易超過某個預設值時,必須得到一定比例(例如 3/5)的可信方的授權。 舉例來說,高額交易可能需要行動裝置和硬體錢包的批准,或者需要分配予可信家庭成員的帳戶的簽名。 -- **帳戶凍結**:若裝置遺失或受到威脅,可以從另一台授權裝置鎖定帳戶,從而保護使用者的資產。 +- **帳戶凍結**:若裝置遺失或受到入侵,可以從另一台授權裝置鎖定帳戶,從而保護使用者的資產。 - **帳戶恢復**:裝置遺失或忘記密碼? 在目前的範例中,這意味著你的資產可能永遠凍結。 有了智慧型合約錢包,你可以設定一些預先核准的帳戶來授權新裝置並重設存取權限。 -- **設定交易上限**:指定每日門檻,規定每天/每週/每月可以從帳戶轉出多少資金。 這意味著,即使攻擊者確實取得存取你帳戶的存取權限,也不能立即耗盡所有內容,並且你將有機會凍結和重設存取權限。 -- **建立白名單**:只允許目的地為你確信安全的地址的交易。 這代表*即使*你的私密金鑰遭竊,攻擊者也無法將資金傳送到非白名單的目標帳戶。 這些白名單需要多個簽名才能更改,因此攻擊者無法將自己的地址新增至名單,除非他們有權存取你的多個備份金鑰。 +- **設定交易限制**:指定每日閾值,以控制每日/週/月可以從帳戶轉出多少金額。 這意味著,即使攻擊者確實取得存取你帳戶的存取權限,也不能立即提領所有內容,並且你將有機會凍結和重設存取權限。 +- **建立白名單**:只允發送交易到你確認安全的地址。 這代表_即使_你的私密金鑰遭竊,攻擊者也無法將資金傳送到非白名單的目標帳戶。 這些白名單需要多個簽名才能更改,因此攻擊者無法將自己的地址新增至名單,除非他們有權存取你的多個備份金鑰。 ## 更好的使用者體驗 {#better-user-experience} -帳戶抽象可以提供**更好的整體使用者體驗**和**改進的安全性**,因為它在協定層級新增了對智慧型合約錢包的支援。 最重要的原因是,它將為智慧型合約、錢包和應用程式的開發者提供更大的自由,以我們可能無法預見的方式創新使用者體驗。 帳戶抽象帶來的一些明顯改進包括捆綁交易以提高速度和效率。 舉例來說,簡單的兌換原本應該是一鍵操作,但現在它需要簽署多個交易,以批准各個代幣的支出,接著才能執行兌換。 帳戶抽象透過允許交易捆綁消除了這種摩擦。 此外,捆綁交易可以精確批准每筆交易所需的代幣的正確價值,然後在交易完成後撤銷批准,從而提供額外的安全性。 +帳戶抽象可以提供**更好的整體使用者體驗**和**改進的安全性**,因為它在協定層級新增了對智慧型合約錢包的支援。 最重要的原因是,它將為智慧型合約、錢包和應用程式的開發者提供更大的自由,以我們可能無法預見的方式創新使用者體驗。 帳戶抽象帶來的一些明顯改進包括捆綁交易以提高速度和效率。 舉例來說,簡單的兌換原本應該是一鍵操作,但現在卻需要簽署多個交易,以批准各個代幣的支出,接著才能執行兌換。 帳戶抽象透過允許交易捆綁消除了這種分歧。 此外,捆綁交易可以精確批准每筆交易所需的代幣的正確價值,然後在交易完成後撤銷批准,從而提供額外的安全性。 -透過帳戶抽象,Gas 管理也得到很大的改進。 應用程式不僅可以支付使用者的 Gas 費用,還可以用以太幣以外的代幣支付 Gas 費用,讓使用者不必為了支付交易手續費而保留以太幣餘額。 這可以透過在合約內將使用者的代幣換成以太幣,然後使用以太幣支付 Gas 費用來實現。 +透過帳戶抽象,燃料管理也得到很大的改進。 應用程式不僅可以支付使用者的燃料費用,還可以用以太幣以外的代幣支付燃料費用,讓使用者不必為了支付交易手續費而保留以太幣餘額。 這可以透過在合約內將使用者的代幣換成以太幣,然後使用以太幣支付燃料費用來實現。 - + -Gas 管理是以太坊使用者遇到的主要難題之一,主要原因是以太幣是唯一可用於支付交易手續費的資產。 想像一下,如果你的錢包中都是 USDC,沒有以太幣。 你無法移動或兌換這些 USDC 代幣,因為不能支付 Gas 費用。 也不能將 USDC 換成以太幣,因為這本身就需要消耗 Gas。 必須從交易所或其他地址將更多以太幣傳送至你的帳戶,才能解決這個問題。 有了智慧型合約錢包後,你可以輕鬆地用 USDC 支付 Gas 費用,解放帳戶。 你不必再在所有帳戶中保留以太幣餘額。 +燃料管理是以太坊使用者遇到的主要難題之一,主要原因是以太幣是唯一可用於支付交易手續費的資產。 想像一下,如果你的錢包中都是 USDC,沒有以太幣。 你無法移動或兌換這些 USDC 代幣,因為不能支付燃料費用。 也不能將 USDC 換成以太幣,因為這本身就需要消耗燃料。 必須從交易所或其他地址將更多以太幣傳送至你的帳戶,才能解決這個問題。 有了智慧型合約錢包後,你可以輕鬆地用 USDC 支付燃料費用,解放帳戶。 你不必再在所有帳戶中保留以太幣餘額。 -帳戶抽象也允許去中心化應用程式開發者在 Gas 管理方面發揮創意。 舉例來說,你每個月或許可以為最愛的去中心化交易所支付一筆固定費用,以實現無限制的交易。 去中心化應用程式也可能代你支付所有 Gas 費用,作為對你使用其平台的獎勵,或作為嚐鮮優惠。 當協定層面支援智慧型合約錢包時,開發者將更容易在 Gas 方面實現創新。 +帳戶抽象也允許去中心化應用程式開發者在燃料管理方面發揮創意。 舉例來說,你每個月或許可以為最喜愛的去中心化交易所支付一筆固定費用,以實現無限制的交易。 去中心化應用程式也可能代你支付所有燃料費用,作為對你使用其平台的獎勵,或作為入網優惠。 當協定層面支援智慧型合約錢包時,開發者將更容易在燃料方面實現創新。 可信會話還可能變革使用者體驗,特別是像遊戲這樣的應用程式,大量小額交易可能需要在短時間內獲得批准。 逐一批准交易將破壞遊戲體驗,但永久批准又不安全。 智慧型合約錢包可以在固定時間內核准某些特定交易,比如特定金額或地址的交易。 -考慮購買如何隨著帳戶抽象而改變也非常有意思。 目前,必須使用已預先存入足夠數量代幣的錢包,每筆交易才能獲得批准和執行。 透過帳戶抽象,體驗比較像大家熟悉的線上購物,使用者只要將物品放入「購物車」並按一下結帳按鈕,即可一次性購買所有商品,所需的所有邏輯皆由合約處理,而非使用者。 +考慮購買過程如何隨著帳戶抽象而改變也非常有意思。 目前,必須使用已預先存入足夠數量代幣的錢包,每筆交易才能獲得批准和執行。 透過帳戶抽象,體驗比較像大家熟悉的線上購物,使用者只要將物品放入「購物車」並按一下結帳按鈕,即可一次性購買所有商品,所需的所有邏輯皆由合約處理,而非使用者。 -這些只是帳戶抽象提升使用者體驗的幾個例子,還有更多我們沒有想像到的使用場景。 帳戶抽象將開發者從現今的外部帳戶限制中解放,讓他們將 web2 的優點帶進 web3,而不必犧牲自我託管的權利,亦無需絞盡腦汁發明新的使用者體驗。 +這些只是帳戶抽象提升使用者體驗的個別例子,還有更多我們沒有想像到的使用場景。 帳戶抽象將開發者從現今的外部帳戶限制中解放,讓他們將 web2 的優點帶進 web3,而不必犧牲自我託管的權利,亦無需絞盡腦汁發明新的使用者體驗。 ## 帳戶抽象將如何實作? {#how-will-aa-be-implemented} -目前市面上已經有智慧型合約錢包了,但因為以太坊虛擬機還不支援,要實作它們非常有挑戰性。 相對的,它們依賴於在標準以太坊交易上新增多相對複雜的程式碼。 透過允許智慧型合約開啟交易,不在鏈下而是在以太坊智慧型合約中處理必要的邏輯,以太坊可以改變上述情況。 將邏輯放進智慧型合約也提高了以太坊的去中心化程度,因為有了它之後,便不需要錢包開發者運行的「中繼器」將使用者簽署的訊息轉換為常規以太坊交易。 +目前市面上已經有智慧型合約錢包了,但因為以太坊虛擬機還不支援,要實作它們非常有挑戰性。 相對的,它們依賴於在標準以太坊交易中包裝相對複雜的程式碼。 透過允許智慧型合約開啟交易,不在鏈下而是在以太坊智慧型合約中處理必要的邏輯,以太坊可以改變上述情況。 將邏輯放進智慧型合約也提高了以太坊的去中心化程度,因為有了它之後,便不需要錢包開發者運行的「中繼器」將使用者簽署的訊息轉換為常規以太坊交易。 -EIP-2771 引入了元交易的概念,允許第三方在不更改以太坊協定的情況下支付使用者的 Gas 費用。 這個想法是使用者簽署的交易會送到「轉發者」合約中。 轉發者是可信任的實體,會在將交易傳送到 Gas 中繼器之前驗證交易是否有效。 這在鏈下完成,因此無需支付 Gas 費用。 Gas 中繼器將交易送到「接收者」合約,支付必要的 Gas 費用,以使交易可在以太坊上執行。 如果「接收者」知道和信任「轉發者」,交易即會執行。 這種模式使得開發者可以輕鬆為使用者實現無 Gas 交易。 +EIP-2771 引入了元交易的概念,允許第三方在不更改以太坊協定的情況下支付使用者的燃料費用。 這個想法是讓使用者簽署的交易會送到「轉發者」合約中。 轉發者是可信任的實體,會在將交易傳送到燃料中繼器之前驗證交易是否有效。 這在鏈下完成,因此無需支付燃料費用。 燃料中繼器將交易送到「接收者」合約,支付必要的燃料費用,以使交易可在以太坊上執行。 如果「接收者」知道和信任「轉發者」,交易即會執行。 這種模式使得開發者可以輕鬆為使用者實現無燃料交易。 - + -EIP-4337 是以去中心化方式實現本地智慧型合約錢包支援的第一步,無需更動以太坊協定。 不是修改共識層來支援智慧型合約錢包,而是在正常的交易流言協定中單獨新增一個系統。 這個更高級別的系統圍繞一個名為 UserOperation 的新物件建構,該物件將使用者的行為以及相關簽名打包在一起。 接下來,這些 UserOperation 物件會被廣播到專用記憶體池中,驗證者會將他們打包成「捆綁交易」。 捆綁交易代表許多單獨的 UserOperations 序列,可以像普通交易一樣包含在以太坊區塊中,並且可以由驗證者使用類似的費用最大化選取模型來選擇。 +EIP-4337 是以去中心化方式實現本地智慧型合約錢包支援的第一步,無需變更以太坊協定。 不是修改共識層來支援智慧型合約錢包,而是在正常的交易廣播協定中單獨新增一個系統。 這個更高級別的系統圍繞一個名為 UserOperation 的新物件建構,此等物件將使用者的操作以及相關簽名打包在一起。 接下來,這些 UserOperation 物件會被廣播到專用記憶體池中,驗證者會將其打包成「捆綁交易」。 捆綁交易代表許多單獨的 UserOperations 序列,可以像普通交易一樣包含在以太坊區塊中,並且可以由驗證者使用類似的費用最大化選取模型來選擇。 -EIP-4337 也會改變錢包的運作方式。 這些功能將外包給稱為「入口點」的全域錢包合約,而不是每個錢包重新實作常見但複雜的安全邏輯。 這將處理支付費用、執行 EVM 程式碼等操作,以便錢包開發者可以專注於提供出色的使用者體驗。 +EIP-4337 也會改變錢包的運作方式。 這些功能將外包給稱為「入口點」的全域錢包合約,而不是每個錢包重新實作常見但複雜的安全邏輯。 此合約將處理支付費用、執行以太坊虛擬機程式碼等操作,以便錢包開發者可以專注於提供出色的使用者體驗。 -注意 EIP-4337 進入點合約已於 2023 年 3 月 1 日部署至以太坊主網。 你可以在 Etherscan 上查看此合約。 +注意 EIP-4337 入口點合約已於 2023 年 3 月 1 日部署至以太坊主網。 你可以在 Etherscan 上查看此合約。 - + -EIP-2938 的目標是藉由引入一種新的交易類型 AA_TX_TYPE 來更新以太坊協定,包含三個欄位:noncetargetdata,其中 nonce 是交易計數器,target 是進入點合約地址,data 是 EVM 位元組碼。 若要執行這些交易,需要新增兩個新的指令(又稱操作碼)到 EVM:NONCEPAYGASNONCE 操作碼會追蹤交易序列,PAYGAS 則會計算並從合約餘額中提取執行交易所需的 Gas 費用。 這些新功能使得以太坊能夠在本地支援智慧型合約錢包,因為以太坊協定已內建必要的基礎設施。 +EIP-2938 的目標是藉由引入一種新的交易類型 AA_TX_TYPE 來更新以太坊協定,包含三個欄位:noncetargetdata,其中 nonce 是交易計數器,target 是入口點合約地址,data 是以太坊虛擬機位元組碼。 若要執行這些交易,需要新增兩條新的指令(又稱作業碼)到以太坊虛擬機:NONCEPAYGASNONCE 操作碼會追蹤交易序列,PAYGAS 則會計算並從合約餘額中提取執行交易所需的燃料費用。 這些新功能使得以太坊能夠在本地支援智慧型合約錢包,因為以太坊協定已內建必要的基礎設施。 -請注意,EIP-2938 目前尚未啟用。 社群目前偏好 EIP-4337,因其不要求更動協定。 +請注意,EIP-2938 目前尚未啟用。 社群目前偏好 EIP-4337,因其不要求變更協定。 -EIP-3074 的目標是更新以太坊的外部帳戶,方法是允許它們將控制權委託給智慧型合約。 這意味著智慧型合約邏輯可以批准源自外部帳戶的交易。 這可以讓一些功能成為可能,如 Gas 贊助和批次交易。 要使其可用,必須新增兩個新的操作碼到 EVM:AUTHAUTHCALL。 透過 EIP-3074,無需合約即可獲得智慧型合約錢包的優勢;相反,一種稱為「調用者」的特定類型的無狀態、無信任、不可升級的合約會處理交易。 +EIP-3074 的目標是更新以太坊的外部帳戶,方法是允許它們將控制權委託給智慧型合約。 這意味著智慧型合約邏輯可以批准源自外部帳戶的交易。 這可以讓一些功能成為可能,如燃料贊助和批次交易。 要使其可行,必須新增兩個新的作業碼到以太坊虛擬機:AUTHAUTHCALL。 透過 EIP-3074,無需合約即可獲得智慧型合約錢包的優勢;相反,一種稱為「調用者」的特定類型的無狀態、無信任、不可升級的合約會處理交易。 -請注意,EIP-3074 目前尚未啟用。 社群目前偏好 EIP-4337,因其不要求更動協定。 +請注意,EIP-3074 目前尚未啟用。 社群目前偏好 EIP-4337,因其不要求變更協定。 ## 目前進度 {#current-progress} -智慧型合約錢包早已可用,但需要更多升級才能讓它們盡可能去中心化及無需許可。 EIP-4337 是成熟的提案,且不需要對以太坊協定做任何更動,所以可以快速實作。 然而,改變以太坊協定的升級目前尚未積極開發,因此這些更改可能需要更長的時間才能發佈。 也有可能帳戶抽象透過 EIP-4337 完美實現,也就不需要更動任何協定了。 +智慧型合約錢包早已可用,但需要更多升級才能讓它們盡可能去中心化及無需許可。 EIP-4337 是成熟的提案,且不需要對以太坊協定做任何變更,所以可以快速實作。 然而,改變以太坊協定的升級目前尚未積極開發,因此這些更改可能需要更長的時間才能發佈。 也有可能帳戶抽象透過 EIP-4337 完美實現,也就不需要變更任何協定了。 ## 了解更多 {#further-reading} - [erc4337.io](https://www.erc4337.io/) - [來自 Devcon Bogota 的帳戶抽象小組討論](https://www.youtube.com/watch?app=desktop&v=WsZBymiyT-8) -- [來自 Devcon Bogota 的《為何帳戶抽象對去中心化應用程式來說是革命性的改變》](https://www.youtube.com/watch?v=OwppworJGzs) +- [來自 Devcon Bogota 的「為何帳戶抽象對去中心化應用程式來說是革命性的改變」](https://www.youtube.com/watch?v=OwppworJGzs) - [來自 Devcon Bogota 的「帳戶抽象 ELI5」(譯註:ELI5 是「把我當五歲小孩和我解釋」的英文縮寫,指用簡單易懂的方式解釋)](https://www.youtube.com/watch?v=QuYZWJj65AY) -- [Vitalik 的《帳戶抽象之路》筆記](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) -- [Vitalik 關於社交恢復錢包的部落格文章](https://vitalik.eth.limo/general/2021/01/11/recovery.html) +- [Vitalik 的「帳戶抽象之路」筆記](https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap#Transaction-inclusion-lists) +- [Vitalik 關於社交恢復錢包的部落格文章](https://vitalik.ca/general/2021/01/11/recovery.html) - [EIP-2938 筆記](https://hackmd.io/@SamWilsn/ryhxoGp4D#What-is-EIP-2938) - [EIP-2938 文檔](https://eips.ethereum.org/EIPS/eip-2938) - [EIP-4337 筆記](https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a) - [EIP-4337 文檔](https://eips.ethereum.org/EIPS/eip-4337) - [EIP-2771 文檔](https://eips.ethereum.org/EIPS/eip-2771) -- [《帳戶抽象的基本概念》 --「帳戶抽象是什麼」第一部分](https://www.alchemy.com/blog/account-abstraction) +- [「帳戶抽象的基本概念」 -- 什麼是帳戶抽象,第一部分](https://www.alchemy.com/blog/account-abstraction) diff --git a/public/content/translations/zh-tw/roadmap/beacon-chain/index.md b/public/content/translations/zh-tw/roadmap/beacon-chain/index.md index 99a268e8d5f..29b5e354810 100644 --- a/public/content/translations/zh-tw/roadmap/beacon-chain/index.md +++ b/public/content/translations/zh-tw/roadmap/beacon-chain/index.md @@ -4,38 +4,37 @@ description: 瞭解信標鍊 - 將權益證明引入以太坊的升級。 lang: zh-tw template: upgrade image: /upgrades/core.png -alt: summaryPoint1: 信標鏈將權益證明引入以太坊生態系統。 summaryPoint2: 信標鏈已於 2022 年 9 月與原先的以太坊工作量證明鏈合併。 -summaryPoint3: 信標鏈引入共識邏輯和區塊流言協定,現在可保護以太坊安全。 +summaryPoint3: 信標鏈引入共識邏輯和區塊廣播協定,現在可保護以太坊安全。 --- 信標鏈於 2020 年 12 月 1 日發佈,並於 2022 年 9 月 15 日透過合併正式將權益證明確定為以太坊的共識機制。 -## 信標鏈是什麼? {#what-is-the-beacon-chain} +## 什麼是信標鏈? {#what-is-the-beacon-chain} -信標鍊是 2020 年推出的原始權益證明區塊鏈的名稱。 信標鏈的作用是在以太坊主網上啟用權益證明共識邏輯之前,確保它健全且可永續存在。 因此,它與原先的工作量證明以太坊一起運行。 信標鏈是「空」區塊鏈,但在以太坊上,要從工作量證明過渡到權益證明,需要指示信標鏈接受來自執行用戶端的交易資料,將它們打包進區塊,並使用基於權益證明的共識機制,將它們整合成一個區塊鏈。 與此同時,原始的以太坊用戶端關閉挖礦、區塊廣播和共識邏輯,將它們全部交給信標鏈。 這個事件稱為[合併](/roadmap/merge/)。 一旦合併發生,即不再有兩個區塊鏈。 相反,只有一個權益證明以太坊,每個節點現在需要兩個不同的用戶端。 信標鏈目前是共識層,是處理區塊流言(註:gossip,一種分散式協定)和共識邏輯的共識用戶端點對點網路,而原始用戶端則形成執行層,負責傳播流言和執行交易,以及管理以太坊狀態。 這兩層可以用引擎 API 相互通訊。 +信標鍊是 2020 年推出的原始權益證明區塊鏈的名稱。 信標鏈的作用是在以太坊主網上啟用權益證明共識邏輯之前,確保它健全且可永續存在。 因此,它與原先的工作量證明以太坊一起運行。 信標鏈是「空」區塊鏈,但在以太坊上,要從工作量證明過渡到權益證明,需要指示信標鏈接受來自執行用戶端的交易資料,將它們打包進區塊,並使用基於權益證明的共識機制,將它們整合成一條區塊鏈。 與此同時,原始的以太坊用戶端關閉挖礦、區塊廣播和共識邏輯,將它們全部交給信標鏈。 這個事件稱為[合併](/roadmap/merge/)。 合併後,即不再有兩條區塊鏈。 相反,只有一個權益證明以太坊,每個節點現在需要兩個不同的用戶端。 信標鏈目前是共識層,是處理區塊廣播和共識邏輯的共識用戶端對等網路,而原始用戶端則形成執行層,負責廣播和執行交易,以及管理以太坊狀態。 這兩個層可以用引擎應用程式介面相互通訊。 ## 信標鏈可以做什麼? {#what-does-the-beacon-chain-do} -信標鏈是帳戶帳本的名稱,在以太坊[質押者](/staking/)開始驗證真正的以太坊區塊前,信標鏈會指揮並協調這些質押者。 但它並不處理交易或智慧型合約互動,因為這些事是在執行層完成的。 信標鏈負責區塊和證明處理、運行分叉選擇演算法、管理獎勵和懲罰等事務。 請參閱[節點架構頁面](/developers/docs/nodes-and-clients/node-architecture/#node-comparison)瞭解更多內容。 +信標鏈是帳戶帳本的名稱,在以太坊[質押者](/staking/)開始驗證真正的以太坊區塊前,信標鏈會指揮並協調這些質押者。 但它並不處理交易或智慧型合約互動,因為這些事是在執行層完成的。 信標鏈負責區塊和證明處理、執行分叉選擇演算法、管理獎勵和懲罰等事務。 請參閱[節點架構頁面](/developers/docs/nodes-and-clients/node-architecture/#node-comparison)瞭解更多內容。 ## 信標鏈的影響 {#beacon-chain-features} ### 質押簡介 {#introducing-staking} -信標鏈將[權益證明](/developers/docs/consensus-mechanisms/pos/)引入以太坊。 這可以保證以太坊的安全,驗證者可以在此過程中賺取更多以太幣。 實際上,你需要使用質押以太幣來啟用驗證者軟體。 身為質押者,你將運行在鏈中建立及驗證新區塊的軟體。 +信標鏈將[權益證明](/developers/docs/consensus-mechanisms/pos/)引入以太坊。 這可以保證以太坊的安全,驗證者可以在此過程中賺取更多以太幣。 實際上,你需要使用質押以太幣來啟用驗證者軟體。 身為質押者,你將執行在鏈中建立及驗證新區塊的軟體。 -質押的目的與[挖礦](/developers/docs/mining/)相似,但在很多方面有所不同。 挖礦需要大量的前期支出,包括強大的硬體和能耗,從而產生規模經濟並促進中心化。 挖礦也不需要將任何資產鎖倉以作為抵押品,這限制了協定在攻擊發生後懲罰作惡者的能力。 +質押的目的與[挖礦](/developers/docs/mining/)相似,但在很多方面有所不同。 挖礦需要大量的前期支出,包括強大的硬體和高能耗,從而產生規模經濟並促進中心化。 挖礦也不要求將任何資產鎖定以作為抵押品,這限制了協定在攻擊發生後懲罰作惡者的能力。 相較於工作量證明,過渡到權益證明後,以太坊的安全性和去中心化程度大幅提升。 參與網路的人越多,去中心化程度和安全性越高,抵禦攻擊的能力也越強。 使用權益證明作為共識機制是[我們現在擁有的安全、環保、可擴容的以太坊](/roadmap/vision/)的基石。 - 若有興趣成為驗證者或幫助保護以太坊安全,請瞭解有關質押的更多資訊。 + 若有興趣成為驗證者或幫助保障以太坊安全,請瞭解有關質押的更多資訊 ### 針對分片進行設定 {#setting-up-for-sharding} @@ -44,7 +43,7 @@ summaryPoint3: 信標鏈引入共識邏輯和區塊流言協定,現在可保 權益證明的優點是,在任何時間都擁有所有經核准區塊產生者的註冊表,每個人都各自質押以太幣。 此註冊表奠定了分而治之的基礎,同時也可靠地劃分了具體的網路責任。 -這種責任與採用工作量證明時的責任相反。採用工作量證明時,礦工對網路沒有義務,可以隨時停止挖礦並永久關閉其節點軟體,而不需承擔後果。 此外,也沒有已知區塊提交者的註冊表,並且沒有可靠的方法來安全地劃分網路責任。 +這種責任與採用工作量證明時的責任有很大的不同。採用工作量證明時,礦工對網路沒有義務,可以隨時停止挖礦並永久關閉其節點軟體,而不需承擔後果。 此外,也沒有已知區塊提交者的註冊表,並且沒有可靠的方法來安全地劃分網路責任。 [更多分片相關更多資訊](/roadmap/danksharding/) @@ -54,7 +53,7 @@ summaryPoint3: 信標鏈引入共識邏輯和區塊流言協定,現在可保 ### 信標鏈和合併 {#merge-and-beacon-chain} -起初,信標鏈獨立於以太坊主網而存在,但兩者已於 2022 年合併。 +起初,信標鏈獨立於以太坊主網存在,但兩者已於 2022 年合併。 合併 @@ -62,7 +61,7 @@ summaryPoint3: 信標鏈引入共識邏輯和區塊流言協定,現在可保 ### 分片與信標鏈 {#shards-and-beacon-chain} -僅當採用權益證明共識機制時,分片才能安全地進入以太坊生態系統。 已與主網「合併」的信標鏈引入了質押,為未來擴容以太坊所需的分片機制鋪平道路。 +僅當採用權益證明共識機制時,分片才能安全地進入以太坊生態系統。 已與主網「合併」的信標鏈引入了質押,為未來進一步擴展以太坊所需的分片機制鋪平道路。 分片鏈 @@ -70,6 +69,6 @@ summaryPoint3: 信標鏈引入共識邏輯和區塊流言協定,現在可保 ## 衍生閱讀 -- [關於以太坊未來升級的更多資訊](/roadmap/vision) -- [關於節點架構的更多資訊](/developers/docs/nodes-and-clients/node-architecture) +- [更多以太坊未來升級相關資訊](/roadmap/vision) +- [更多節點架構相關資訊](/developers/docs/nodes-and-clients/node-architecture) - [關於權益證明的更多資訊](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/zh-tw/roadmap/danksharding/index.md b/public/content/translations/zh-tw/roadmap/danksharding/index.md index 00723233f01..927cf151e69 100644 --- a/public/content/translations/zh-tw/roadmap/danksharding/index.md +++ b/public/content/translations/zh-tw/roadmap/danksharding/index.md @@ -4,80 +4,80 @@ description: 瞭解 Proto-Danksharding 和 Danksharding - 兩種依序完成以 lang: zh-tw summaryPoints: - Danksharding 是一項多階段升級,旨在提升以太坊的可擴容性和容量。 - - 在第一階段 Proto-Danksharding,將資料 blob 新增到區塊中 - - 資料 blob 為卷軸提供了一種更便宜的方式來將資料發佈到以太坊,這些成本可以作為較低的交易費用轉嫁給使用者。 - - 隨後,完整的 Danksharding 將在部分節點之間分散驗證資料 blob 的責任,進一步將以太坊擴容至每秒超過 100,000 筆交易。 + - 在第一階段 Proto-Danksharding,將資料二進位大型物件新增到區塊中 + - 資料二進位大型物件為卷軸提供了一種更便宜的方式來將資料發佈到以太坊,這些成本可以作為較低的交易費用轉嫁給使用者。 + - 隨後,完整的 Danksharding 將在部分節點之間分攤驗證資料二進制大對象的責任,進一步將以太坊擴容至每秒處理超過 100,000 筆交易。 --- # Danksharding {#danksharding} -**Danksharding** 可讓以太坊成為真正可擴容的區塊鏈,但需要進行一些協定升級才能實現這一目標。 **Proto-Danksharding** 是該過程中的一個中間步驟。 兩者的目標都是讓二層網路上的交易對使用者來說盡可能便宜,並且應該將以太坊擴容到每秒 >100,000 筆交易。 +**Danksharding** 可讓以太坊成為真正可擴容的區塊鏈,但需要進行一些協定升級才能實現這一目標。 **Proto-Danksharding** 是該過程中的一個中間步驟。 兩者的目標都是讓二層網路上的交易對使用者來說盡可能便宜,並且應該將以太坊擴容到每秒處理 >100,000 筆交易。 -## Proto-Danksharding 是什麼? {#what-is-protodanksharding} +## 什麼是 Proto-Danksharding? {#what-is-protodanksharding} -Proto-Danksharding 又稱 [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844),是使[卷軸](/layer2/#rollups)新增資料到區塊更便宜的方法。 這個名稱來自提出這個想法的兩位研究人員:Protolambda 和 Dankrad Feist。 目前,由於卷軸在 `CALLDATA` 中發佈交易,因此卷軸的使用者交易成本受到限制。 這個成本很高,因其由所有以太坊節點處理並永遠存在於鏈上,即使卷軸只需要短暫使用這些資料。 Proto-Danksharding 引入了可傳送並附加到區塊的資料 blob(註:二進位大型物件)。 這些 blob 中的資料無法被以太坊虛擬機存取,並且會在一段固定時間(1 到 3 個月)後自動刪除。 這表示卷軸可以更便宜地傳送資料,並以更便宜的交易形式將節省的費用轉給最終使用者。 +Proto-Danksharding 又稱 [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844),是使[卷軸](/layer2/#rollups)新增資料到區塊更便宜的方法。 這個名稱來自提出這個想法的兩位研究人員:Protolambda 和 Dankrad Feist。 目前,由於卷軸在 `CALLDATA` 中發佈交易,因此卷軸的使用者交易成本受到限制。 這個成本很高,因為資料由所有以太坊節點處理並永遠存在於鏈上,即使卷軸只需要短暫使用這些資料。 Proto-Danksharding 引入了可傳送並附加到區塊的資料二進位大型物件。 這些二進位大型物件中的資料無法被以太坊虛擬機存取,並且會在一段固定時間(1 到 3 個月)後自動刪除。 這表示卷軸可以更便宜地傳送資料,並以更便宜的交易形式將節省的費用轉給終端使用者。 - + -卷軸是指批次鏈下處理交易,然後將結果發佈到以太坊以實現以太坊擴容。 卷軸有兩個必要元件:資料與執行檢查。 資料指卷軸處理的完整交易序列,用於產生發佈到以太坊的狀態改變。 執行檢查指讓某些誠實的參與者(「證明者」)重新執行這些交易,以確保提出的狀態改變正確無誤。 要完成執行檢查,交易資料必須存在夠長時間,以便任何人都可以下載並檢查。 這意味著證明者可以識別並質疑卷軸排序者的任何不誠實行為。 然而,它並不需要永久可用。 +卷軸是指在鏈下批次處理交易,然後將結果發佈到以太坊以實現以太坊擴容。 卷軸有兩個必要元件:資料與執行檢查。 資料指卷軸處理的完整交易序列,用於產生發佈到以太坊的狀態變更。 執行檢查指讓某些誠實的參與者(「證明者」)重新執行這些交易,以確保提出的狀態變更正確無誤。 要完成執行檢查,交易資料必須存在足夠長時間,以便任何人都可以下載並檢查。 這意味著證明者可以識別並質疑卷軸排序者的任何不誠實行為。 然而,資料並不需要永久可用。 - + -卷軸在鏈上發佈對其交易資料的承諾,並在資料 blob 中提供實際資料。 這表示證明者可以確認承諾是否有效,或質疑其認為錯誤的資料。 在節點層面,資料的 blob 儲存在共識用戶端中。 共識用戶端證明自己已經看過資料,且資料已在網路上傳播。 如果永久儲存資料,這些用戶端會膨脹並導致對運行節點的硬體要求過高。 反之,資料每 1 到 3 個月會從節點中自動刪除。 共識用戶端證明顯示證明者有足夠的機會驗證資料。 實際資料可由卷軸操作者、使用者或其他人儲存在鏈下。 +卷軸在鏈上發佈對其交易資料的承諾,並在資料二進位大型物件中提供實際資料。 這表示證明者可以確認承諾是否有效,或質疑其認為錯誤的資料。 在節點層面,資料的二進位大型物件儲存在共識用戶端中。 共識用戶端證明自己已經看過資料,且資料已在網路上傳播。 如果永久儲存資料,這些用戶端會膨脹並導致對運行節點的硬體要求過高。 反之,資料每 1 到 3 個月會從節點中自動刪除。 共識用戶端的證明顯示證明者有足夠的機會驗證資料。 實際資料可由卷軸運營商、使用者或其他人儲存在鏈下。 -### 如何驗證 blob 資料? {#how-are-blobs-verified} +### 如何驗證二進位大型物件資料? {#how-are-blobs-verified} -卷軸會將它們執行的交易發佈在資料 blob 中。 它們還會發佈一則對資料的「承諾」。 它們透過將多項式函式擬合到資料來做到這一點。 之後可在任意點計算此函式。 舉例來說,若我們定義一個非常簡單的函式 `f(x) = 2x-1`,可以計算出 `x = 1`、`x = 2`、`x = 3` 時對應的結果分別為 `1, 3, 5`。 證明者會將相同的函式套用到資料上,並在相同的點進行計算。 如果原始資料改變,函式將不相同,因此每個點的計算結果值也會不同。 事實上,承諾和證明會更複雜,因為它們被套用在加密函式中。 +卷軸會將它們執行的交易發佈在資料二進位大型物件中。 它們還會發佈一則對資料的「承諾」。 它們透過將多項式函式擬合到資料來做到這一點。 之後可在任意點計算此函式。 舉例來說,若我們定義一個非常簡單的函式 `f(x) = 2x-1`,可以計算出 `x = 1`、`x = 2`、`x = 3` 時對應的結果分別為 `1, 3, 5`。 證明者會將相同的函式套用到資料上,並在相同的點進行計算。 如果原始資料改變,函式將不相同,因此每個點的計算結果值也會不同。 事實上,承諾和證明會更複雜,因為它們被包裝到加密函式中。 -### KZG 是什麼? {#what-is-kzg} +### 什麼是 KZG? {#what-is-kzg} -KZG 代表 Kate-Zaverucha-Goldberg,這是三位將資料 blob 縮小至[加密「承諾」](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html)的[原始創作者名字的縮寫](https://link.springer.com/chapter/10.1007/978-3-642-17373-8_11)。 必須驗證卷軸提交的資料 blob,以確保卷軸不會出錯。 這涉及證明者重新執行 blob 中的交易以檢查承諾是否有效。 這與執行用戶端使用 Merkle 證明檢查一層網路上的以太坊交易是否有效,概念上相同。 KZG 是將多項式方程與資料擬合的另一種證明。 承諾會在一些保密資料點計算多項式。 證明者將對資料擬合相同的多項式,並以相同數值進行計算,以確認結果是否相同。 這是一種驗證資料的方法,與某些卷軸以及最終由以太坊協定的其他部分使用的零知識技術相容。 +KZG 代表 Kate-Zaverucha-Goldberg,這是三位將資料二進位大型物件縮小至[加密「承諾」](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html)的[原始創作者名字的縮寫](https://link.springer.com/chapter/10.1007/978-3-642-17373-8_11)。 必須驗證卷軸提交的資料二進位大型物件,以確保卷軸不會出錯。 這涉及證明者重新執行二進位大型物件中的交易以檢查承諾是否有效。 這與執行用戶端使用 Merkle 證明檢查一層網路上的以太坊交易是否有效,概念上相同。 KZG 是將多項式方程與資料擬合的另一種證明。 承諾會在一些保密資料點計算多項式。 證明者將對資料擬合相同的多項式,並以相同數值進行計算,以確認結果是否相同。 這是一種驗證資料的方法,與某些卷軸以及最終由以太坊協定的其他部分使用的零知識技術相容。 -### KZG 儀式是什麼? {#what-is-a-kzg-ceremony} +### 什麼是 KZG 儀式? {#what-is-a-kzg-ceremony} -KZG 儀式是以太坊社群中許多人共同產生秘密隨機數字字串的一種方式,可用於驗證某些資料。 這非常重要,此字串或數字是未知的,且任何人都無法重新建立。 為了確保這點,每個儀式參與者都會收到前一位參與者傳來的字串。 接著他們將建立一些新的隨機值(例如允許瀏覽器測量滑鼠的移動),並將其與先前收到的字串混合。 然後他們會把新的值傳給下一位參與者,接著從本地機器中銷毀這個值。 只要其中一個儀式參與者是誠實的,那麼最終的值對攻擊者來說就是未知。 EIP-4844 KZG 儀式向公眾開放,數萬人參加新增自己的熵(指一種隨機值)。 參與者 100% 不誠實的行動,才可能破壞這個儀式。 站在參與者的視角,如果他們知道自己是誠實的,則不需要信任任何人,因為他們知道自己可確保儀式安全(他們自己已滿足 n 分之一誠實參與者的要求)。 +KZG 儀式是以太坊社群中許多人共同產生秘密隨機數字字串的一種方式,可用於驗證某些資料。 此數字字串是未知的,且任何人都無法重新建立,這一點很重要。 為了確保這點,每個儀式參與者都會收到前一位參與者傳來的字串。 接著他們將建立一些新的隨機值(例如允許瀏覽器測量滑鼠的移動),並將其與先前收到的字串混合。 然後他們會把新的值傳給下一位參與者,接著從本地機器中銷毀這個值。 只要其中一個儀式參與者是誠實的,那麼最終的值對攻擊者來說就是未知。 EIP-4844 KZG 儀式向公眾開放,數萬人參加新增自己的熵(指一種隨機值)。 全部參與者都進行不誠實的行為,才可能破壞這個儀式。 站在參與者的視角,如果他們知道自己是誠實的,則不需要信任任何人,因為他們知道自己可確保儀式安全(他們自己已滿足 n 分之一誠實參與者的要求)。 -當卷軸在 blob 中發佈資料時,會提供在鏈上發佈的「承諾」。 這項承諾是在某些點對資料進行多項式擬合計算的結果。 這些點由 KZG 儀式中產生的隨機數字定義。 然後,證明者可以在相同點計算多項式以驗證資料;如果得出的值相同,則資料是正確的。 +當卷軸在二進位大型物件中發佈資料時,會提供在鏈上發佈的「承諾」。 這項承諾是在某些點對資料進行多項式擬合計算的結果。 這些點由 KZG 儀式中產生的隨機數字定義。 然後,證明者可以在相同點計算多項式以驗證資料;如果得出的值相同,則資料是正確的。 -如果有人知道用於承諾的隨機位置,他們就很容易產生能在這些特定點擬合的新多項式(即「碰撞」)。 這表示他們可以從 blob 新增或移除資料,並且仍然提供有效的證明。 為了避免這種事,他們實際上不是向證明者提供實際的秘密位置,而是使用橢圓曲線接收包裹在加密「黑盒子」中的位置。 這些方法有效地擾亂了這些值,使原始值無法被逆向工程,但透過一些聰明的代數證明者和驗證者,仍然可以在其代表的點上計算多項式。 +如果有人知道用於承諾的隨機位置,他們就很容易產生能在這些特定點擬合的新多項式(即「碰撞」)。 這表示他們可以從二進位大型物件新增或移除資料,並且仍然提供有效的證明。 為了避免這種情況,實際上不是向證明者提供實際的秘密位置,證明者實際收到的是使用橢圓曲線包裝在加密「黑盒子」中的位置。 這些方法有效地擾亂了這些值,使原始值無法被逆向工程,但透過一些聰明的代數方法,證明者和驗證者仍然可以在其代表的點上計算多項式。 - Danksharding 和 Proto-Danksharding 都不遵循傳統的「分片」模型,旨在將區塊鏈分成多個部分。 分片鏈不再是以太坊開發藍圖的一部分。 相反,Danksharding 使用跨 blob 的分散式資料採樣來實現以太坊擴容。 這在實作上容易很多。 此模型有時又稱「資料分片」。 + Danksharding 和 Proto-Danksharding 都不遵循傳統的「分片」模式,此模式旨在將區塊鏈分成多個部分。 分片鏈不再是以太坊開發藍圖的一部分。 相反,Danksharding 使用跨二進位大型物件的分散式資料採樣來實現以太坊擴容。 這在實作上容易很多。 此模型有時又稱「資料分片」。 ## Danksharding 是什麼? {#what-is-danksharding} -Danksharding 完全實現了從 Proto-Danksharding 開始的卷軸擴容。 Danksharding 將在以太坊上為卷軸提供大量空間,用於轉存壓縮的交易資料。 這表示以太坊可以輕鬆支援數百個獨立的卷軸,並實現每秒數百萬筆交易。 +Danksharding 完全實現了從 Proto-Danksharding 開始的卷軸擴容。 Danksharding 將在以太坊上為卷軸提供大量空間,用於轉存壓縮的交易資料。 這表示以太坊可以輕鬆支援數百個獨立的卷軸,並實現每秒處理數百萬筆交易。 -其工作原理是將附加到區塊的 blob 從 Proto-Danksharding 中的 1 個擴展到完整 Danksharding 中的 64 個。 所需的其餘變更都是對共識用戶端操作方式的更新,使得它們能夠處理新的大 blob。 這些變更有部分已在開發藍圖上,用於獨立於 Danksharding 的其他目的。 舉例來說,Danksharding 要求先實作提交者-建置者分離。 這是一個升級,它將跨不同驗證者建置區塊和提交區塊的任務分開。 同樣,Danksharding 需要資料可用性採樣,但開發不儲存太多歷史資料的輕量級用戶端(「無狀態用戶端」)也需要資料可用性採樣。 +其工作原理是將附加到區塊的二進位大型物件從 Proto-Danksharding 中的 1 個擴展到完整 Danksharding 中的 64 個。 所需的其餘變更都是對共識用戶端操作方式的更新,使得它們能夠處理新的大二進位大型物件。 這些變更有部分已在開發藍圖上,用於獨立於 Danksharding 的其他目的。 舉例來說,Danksharding 要求先實作提交者-建置者分離。 這是一個升級,它將不同驗證者建置區塊和提出區塊的工作分開。 同樣,Danksharding 需要資料可用性採樣,但開發不儲存太多歷史資料的輕量級用戶端(「無狀態用戶端」)也需要資料可用性採樣。 -提交者-建置者分離是為了防止單一驗證者必須為 32MB 的 blob 資料產生昂貴的承諾和證明。 這對個人質押者很傷,因為他們需要花費更多資金購買更強大的硬體,將降低去中心化程度。 相反,專門的區塊建置者會負責這項昂貴的計算工作。 之後,區塊提交者即可廣播他們的區塊。 區塊提交者會直接選擇收益最大的區塊。 所有人都能經濟快速地驗證 blob,表示所有一般驗證者皆可檢查區塊建置者的行為是否誠實。 這允許在不犧牲去中心化的情況下處理大型 blob。 錯誤行事的區塊建置者可能被強制退出網路並罰沒,其他人會補上他的位置,因為區塊建置是高收益的活動。 +提交者-建置者分離是為了防止單一驗證者必須為 32MB 的二進位大型物件資料產生昂貴的承諾和證明。 這為家庭質押者帶來很大的壓力,因為他們需要花費更多資金購買更強大的硬體,這會降低去中心化程度。 相反,專門的區塊建置者會負責這項昂貴的計算工作。 之後,區塊提交者即可廣播他們的區塊。 區塊提交者會直接選擇收益最大的區塊。 所有人都能經濟快速地驗證二進位大型物件,表示所有普通驗證者皆可檢查區塊建置者的行為是否誠實。 這允許在不犧牲去中心化的情況下處理大型二進位大型物件。 錯誤行事的區塊建置者可能被強制退出網路並罰沒,其他人會補上他的位置,因為區塊建置是高收益的活動。 - + -驗證者需要進行資料可用性採樣才能快速有效地驗證 blob 資料。 透過資料可用性採樣,驗證者可以非常確定 blob 資料可用且正確提交。 每個驗證者都可以隨機採樣幾個資料點並建立證明,這意味著驗證者無需檢查整個 blob。 任何資料缺漏的情況都可被快速發現且 blob 會遭拒。 +驗證者需要進行資料可用性採樣才能快速有效地驗證二進位大型物件資料。 透過資料可用性採樣,驗證者可以非常確定二進位大型物件資料可用且正確提交。 每個驗證者都可以隨機採樣幾個資料點並建立證明,這意味著驗證者無需檢查整個二進位大型物件。 任何資料缺漏的情況都可被快速發現且二進位大型物件會遭拒。 ### 目前進度 {#current-progress} -完整的 Danksharding 還需要幾年的時間。 不過,Proto-Danksharding 應該很快就會實作。 截至本文撰寫時止(2023 年 2 月),KZG 儀式仍然保持開放並且已吸引 50,000 多位貢獻者。 Proto-Danksharding 的 [EIP](https://eips.ethereum.org/EIPS/eip-4844) 已經成熟,規範已達成一致,客戶已經實作原型,目前正在測試並準備投入生產。 下一步是在公共測試網上實作這些變更。 可以透過 [EIP 4844 準備狀態檢查清單](https://github.com/ethereum/pm/blob/master/Breakout-Room/4844-readiness-checklist.md#client-implementation-status)取得最新資訊。 +完整的 Danksharding 還需要幾年的時間才會實作。 不過,Proto-Danksharding 應該很快就會實作。 截至本文撰寫時止(2023 年 2 月),KZG 儀式仍然保持開放並且已吸引 50,000 多位貢獻者。 Proto-Danksharding 的 [EIP](https://eips.ethereum.org/EIPS/eip-4844) 已經成熟,規範已達成一致,客戶已經實作原型,目前正在測試並準備投入生產。 下一步是在公共測試網上實作這些變更。 可以透過 [EIP 4844 準備狀態檢查清單](https://github.com/ethereum/pm/blob/master/Breakout-Room/4844-readiness-checklist.md#client-implementation-status)取得最新資訊。 ### 了解更多 {#further-reading} @@ -86,6 +86,6 @@ Danksharding 完全實現了從 Proto-Danksharding 開始的卷軸擴容。 Dank - [Dankrad、Proto 和 Vitalik 討論 Danksharding](https://www.youtube.com/watch?v=N5p0TB77flM) - [KZG 儀式](https://ceremony.ethereum.org/) - [Carl Beekhuizen 在 Devcon 的可信任設定演講](https://archive.devcon.org/archive/watch/6/the-kzg-ceremony-or-how-i-learnt-to-stop-worrying-and-love-trusted-setups/?tab=YouTube) -- [關於 blob 資料可用性採樣的更多資訊](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [關於二進位大型物件資料可用性採樣的更多資訊](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) - [Dankrad Feist 的 KZG 承諾和證明演講](https://youtu.be/8L2C6RDMV9Q) - [KZG 多項式承諾](https://dankradfeist.de/ethereum/2020/06/16/kate-polynomial-commitments.html) diff --git a/public/content/translations/zh-tw/roadmap/future-proofing/index.md b/public/content/translations/zh-tw/roadmap/future-proofing/index.md index caae65f8811..b8f1a040dbc 100644 --- a/public/content/translations/zh-tw/roadmap/future-proofing/index.md +++ b/public/content/translations/zh-tw/roadmap/future-proofing/index.md @@ -9,23 +9,23 @@ template: roadmap 開發藍圖的有些部分在短期內並不是一定要用於擴容或保護以太坊,其目的是為以太坊未來的長期穩定性與可靠性奠定基礎。 -## 抗量子技術 {#quantum-resistance} +## 抗量子性 {#quantum-resistance} -當量子計算成為現實的時候,有一部分用於保護當今以太坊的密碼學技術將會受到攻擊。 儘管量子電腦可能還需幾十年的時間才能對現代密碼學構成真正的威脅,但建立以太坊的目的是確保未來幾個世紀的安全。 這意味著,我們應該盡速[在以太坊部署抗量子技術](https://consensys.net/blog/developers/how-will-quantum-supremacy-affect-blockchain/)。 +當量子計算成為現實的時候,有一部分用於保護當今以太坊的密碼學技術將會受到攻擊。 儘管量子電腦可能還需幾十年的時間才能對現代密碼學構成真正的威脅,但建立以太坊的目的是確保未來幾個世紀的安全。 這意味著,我們應該盡速讓[以太坊具抗量子性](https://consensys.net/blog/developers/how-will-quantum-supremacy-affect-blockchain/)。 -目前以太坊開發者遇到的挑戰是,現在的權益證明協定高度仰賴非常高效的簽名方案(即 BLS)來匯集有效區塊上的投票。 這種簽名方案可以被量子電腦破解,但其他抗量子替代方案又不夠有效率。 +目前以太坊開發者遇到的挑戰是,現在的權益證明協定仰賴非常高效的簽名方案(即 BLS)來匯集有效區塊上的投票。 這種簽名方案可以被量子電腦破解,但其他抗量子替代方案效率不高。 -眾所周知,以太坊中多個地方用於產生加密密鑰的[「KZG」承諾方案](/roadmap/danksharding/#what-is-kzg)不具抗量子能力。 目前,這個風險是使用「可信設定」來規避的,其中許多使用者會產生無法被量子電腦逆向工程的隨機性。 然而,理想的解決方案還是引入量子安全密碼學。 現在有兩種能夠有效替代 BLS 方案的主流方案:[STARK 簽名](https://hackmd.io/@vbuterin/stark_aggregation)和[網格簽名](https://medium.com/asecuritysite-when-bob-met-alice/so-what-is-lattice-encryption-326ac66e3175)。 這些方案仍處於研究與試驗開發階段。 +眾所周知,以太坊中多處用於產生加密密鑰的[「KZG」承諾方案](/roadmap/danksharding/#what-is-kzg)不具抗量子能力。 目前,這個風險是使用「受信任設定」來規避的,即許多使用者會產生無法被量子電腦逆向工程的隨機性。 然而,理想的解決方案還是引入量子安全密碼學。 現在有兩種能夠有效替代 BLS 方案的主流方案:[STARK 簽名](https://hackmd.io/@vbuterin/stark_aggregation)和[網格簽名](https://medium.com/asecuritysite-when-bob-met-alice/so-what-is-lattice-encryption-326ac66e3175)。 這些方案仍處於研究與試驗開發階段。 - 閱讀 KZG 與可信設定相關資訊 + 閱讀 KZG 與受信任設定相關資訊 ## 更便捷、更高效的以太坊 {#simpler-more-efficient-ethereum} -複雜性使得產生錯誤及漏洞的機率提高,導致攻擊者有機可乘。 然而,開發藍圖中也包括精簡以太坊、移除歷經好幾次升級後已不再需要或可以改進的程式碼。 對開發者來說,更精簡、單純的程式碼庫更容易維護和理解。 +複雜性使得產生錯誤及漏洞的幾率提高,導致攻擊者有機可乘。 然而,開發藍圖中也包括精簡以太坊、移除歷經好幾次升級後已不再需要或可以改進的程式碼。 對開發者來說,更精簡、單純的程式碼庫更容易維護和理解。 -業界將對[以太坊虛擬機 (EVM)](/developers/docs/evm) 進行多項更新,以使其更簡單、更高效。 其中包括[移除 SELFDESTRUCT 操作碼](https://hackmd.io/@vbuterin/selfdestruct),這是一個不常用且已不需要的指令,某些情況下可能帶來危險,特別是和以太坊未來升級的儲存模型一起使用時。 此外,以太坊用戶端仍然支援一些舊的交易類型,現在完全可以移除。 Gas 的計算方式也有改進空間,可以引入更高效的演算法來進行一些加密運算。 +業界將對[以太坊虛擬機 (EVM)](/developers/docs/evm) 進行多項更新,以使其更簡單、更高效。 其中包括[移除 SELFDESTRUCT 作業碼](https://hackmd.io/@vbuterin/selfdestruct),這是一個不常用且已不需要的指令,某些情況下可能帶來危險,特別是和以太坊未來升級的儲存模型一起使用時。 此外,以太坊用戶端仍然支援一些舊的交易類型,現在完全可以移除。 燃料的計算方式也有改進空間,可以引入更高效的演算法來進行一些加密運算。 -同樣,目前以太坊用戶端的其他部分也可以進行更新。 其中一個範例是,目前執行和共識用戶端使用的是不同類型的資料壓縮方案。 若能在整個網路上統一壓縮方案,在用戶端之間分享資料會變得更簡單直覺。 +同樣,目前以太坊用戶端的其他部分也可以進行更新。 其中一個範例是,目前執行和共識用戶端使用的是不同類型的資料壓縮方案。 若能在整個網路上統一壓縮方案,在用戶端之間分享資料會變得更簡單直觀。 ## 目前進度 {#current-progress} @@ -33,6 +33,6 @@ template: roadmap **了解更多** -- [Gas](/developers/docs/gas) +- [燃料](/developers/docs/gas) - [以太坊虛擬機](/developers/docs/evm) - [Data structures](/developers/docs/data-structures-and-encoding) diff --git a/public/content/translations/zh-tw/roadmap/index.md b/public/content/translations/zh-tw/roadmap/index.md index db8f286786f..095bc4589fa 100644 --- a/public/content/translations/zh-tw/roadmap/index.md +++ b/public/content/translations/zh-tw/roadmap/index.md @@ -7,7 +7,7 @@ image: /roadmap/roadmap-main.png alt: "以太坊開發藍圖" summaryPoints: buttons: - - label: 進一步升級 + - label: 更多升級 toId: 即將發生的變化 - label: 過往的升級 to: /history/ @@ -59,16 +59,16 @@ buttons: -以太坊的開發藍圖主要是研發人員多年努力的成果,因為協定的技術性非常強,不過任何有想法與動力的人皆可參與。 理念通常始於論壇上的討論,比如 [ethresear.ch](https://ethresear.ch/)、[以太坊魔術師](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) 或以太坊研發 Discord 伺服器。 它們可能是對新發現的漏洞的回應、在應用層工作的組織提出的意見(比如去中心化應用程式和交易所),或是對最終使用者已知問題的解決辦法(比如成本或交易速度)。 當這些理念成熟之後,可以作為 [以太坊改進提案] 提出 (https://eips.ethereum.org/)。 這一切都是公開進行的,因此社群中的每個人都可以隨時發表意見。 +以太坊的開發藍圖主要是研發人員多年努力的成果,因為協定的技術性非常強,不過任何有想法與動力的人皆可參與。 創意通常始於論壇上的討論,比如 [ethresear.ch](https://ethresear.ch/)、[Ethereum magicians](https://ethereum-magicians.org/) 或以太坊研發 Discord 伺服器。 它們可能是對新發現的漏洞的回應、在應用程式層工作的組織提出的意見(比如去中心化應用程式和交易所),或是對終端使用者已知問題的解決辦法(比如成本或交易速度)。 當這些理念成熟之後,可以作為 [以太坊改進提案] 提出 (https://eips.ethereum.org/)。 這一切都是公開進行的,因此社群中的每個人都可以隨時發表意見。 [有關以太坊管理體系的更多資訊](/管理體系/) -

        ETH2 是什麼?

        +

        什麼是以太坊 2?

        -

        在轉向權益證明之前,「Eth2」一詞通常用於描述以太坊的未來,但現在已被逐步淘汰,取而代之的是更精確的術語。它最初用來區分轉換到權益證明之前和之後的以太坊網路,有時指不同的以太坊用戶端(執行用戶端有時稱為 ETH1 用戶端,共識用戶端有時稱為 ETH2 用戶端)。

        +

        在過渡到權益證明之前,「以太坊 2」一詞通常用於描述以太坊的未來,但現在其已被逐步淘汰,取而代之的是更精確的術語。它最初用來區分過渡到權益證明之前和之後的以太坊網路,有時指不同的以太坊用戶端(執行用戶端有時稱為以太坊 1 用戶端,共識用戶端有時稱為以太坊 2 用戶端)。

        @@ -82,13 +82,13 @@ buttons: 以太坊會在接下來的六個月實作部分升級(比如質押提款);其他的優先級較低,未來 5-10 年內可能不會實作(比如抗量子性)。 給出每次升級的精確時間很難預測,因為許多開發藍圖上的事項是並行處理的,並以不同速度開發。 升級的緊迫性也會隨著時間的推移而變化,這取決於外部因素(例如,量子電腦的效能和可用性突然提升可能導致抗量子密碼學的實作更加緊急)。 -可以將以太坊的發展類比為生物進化。 相較於抗拒改變的網路,能夠適應新挑戰及維持健康的網路更可能成功,不過隨著網路的效能、可擴容性和安全性越來越高,需要對協定進行的變更也會減少。 +可以將以太坊的發展類比為生物進化。 相較於抗拒改變的網路,能夠適應新挑戰及維持健康的網路更有可能成功,不過隨著網路的效能、可擴容性和安全性越來越高,需要對協定進行的變更也會減少。 ## 升級時我需要做什麼嗎? {#do-i-have-to-do-anything-when-there-is-an-upgrade} -升級往往不會影響最終使用者,除了提供更好的使用者體驗和更安全的協定,或許還提供更多與以太坊互動的選項。 最終使用者並不需要主動參與升級,也不需要做任何事來保護資產。 節點營運者需要更新他們的用戶端,為升級做好準備。 有些升級可能帶來適用於應用程式開發者的變更。 舉例來說,完成歷史記錄到期升級之後,應用程式開發者可從新來源取得歷史資料。 +升級往往不會影響終端使用者,除了提供更好的使用者體驗和更安全的協定,或許還提供更多與以太坊互動的選項。 終端使用者並不需要主動參與升級,也不需要做任何事來保護資產。 節點營運商需要更新他們的用戶端,為升級做好準備。 有些升級可能帶來適用於應用程式開發者的變更。 舉例來說,完成歷史記錄到期升級之後,應用程式開發者可從新來源取得歷史資料。 -## The Verge、The Splurge 等等將如何? {#what-about-the-verge-splurge-etc} +## 邊際 (The Verge)、誇耀 (The Splurge) 等等將如何? {#what-about-the-verge-splurge-etc} [Vitalik Buterin 提出了以太坊發展藍圖的願景](https://twitter.com/VitalikButerin/status/1588669782471368704),發展藍圖上的事項被分為多個類別,根據各自對以太坊架構的影響相互關聯。 其中包括: @@ -96,7 +96,7 @@ buttons: - 激增 (The Surge):透過卷軸和資料分片進行與可擴容性相關的升級 - 災厄 (The Scourge):與最大可提取價值的抗審查性、去中心化和協定風險相關的升級 - 邊際 (The Verge):使得驗證區塊更容易的升級 -- 淨化 (The Purge):有助降低運行節點的運算成本和簡化協定的升級 +- 淨化 (The Purge):有助降低運行節點的計算成本和簡化協定的升級 - 誇耀 (The Splurge):不屬於上述類別的其他升級 我們決定不使用這些術語,因為想使用更簡單、更以使用者為中心的模型。 雖然我們使用以使用者為中心的語言,但願景仍然與 Vitalik 提出的願景相同。 @@ -105,13 +105,13 @@ buttons: 分片是指將以太坊區塊鏈分割,使部分驗證者只需負責所有資料中的一小部分。 這原本是以太坊的擴容方式。 然而,二層網路卷軸的發展速度比預期快得多,並且已經提供大量擴容,並且 Proto-Danksharding 實作後將提供更多功能。 這意味著已不再需要「分片鏈」,並且已將其從開發藍圖中刪除。 -## 在尋找特定的技術更新嗎? {#looking-for-specific-technical-upgrades} +## 在尋找特定的技術升級嗎? {#looking-for-specific-technical-upgrades} -- [Danksharding](/roadmap/danksharding) - Danksharding 透過新增資料的 blob(註:二進位大型物件)到以太坊區塊中,使二層網路卷軸的成本大大降低。 -- [質押提款](/staking/withdrawals) - 上海/卡佩拉在以太坊上升級啟用了質押提款,允許人們解套質押的以太幣。 +- [Danksharding](/roadmap/danksharding) - Danksharding 透過新增資料的二進位大型物件到以太坊區塊中,使二層網路卷軸的成本大大降低。 +- [質押提款](/staking/withdrawals) - 上海/卡佩拉升級在以太坊上啟用了質押提款,允許人們解鎖質押的以太幣。 - [單一時隙最終確定性](/roadmap/single-slot-finality) - 無需等待十五分鐘,就可以在同一時隙內提出並最終確定區塊。 這對於應用程式來說更方便,也更難被攻擊。 - [提交者-建置者分離](/roadmap/pbs) - 讓不同的驗證者承擔區塊建置和區塊提交任務,為以太坊達成共識建立了一種更公平、更抗審查且更有效的方式。 - [秘密領導者選舉](/roadmap/secret-leader-election) - 可以使用巧妙的密碼學來確保目前區塊提交者的身分不被公開,從而保護他們免遭某些類型的攻擊。 - [帳戶抽象](/roadmap/account-abstraction) - 帳戶抽像是一類升級,支援以太坊上原生的智慧型合約錢包,而不必使用複雜的中間件。 -- [Verkle 樹](/roadmap/verkle-trees) - Verkle 樹是一種資料結構,可用於在以太坊上啟用無狀態用戶端。 這些「無狀態」用戶端只需少量的儲存空間,但仍然能夠驗證新區塊。 -- [無狀態](/roadmap/statelessness) - 無狀態用戶端可以驗證新區塊,不必儲存大量資料。 這將提供運行節點的所有好處,而成本僅為目前的一小部分。 +- [沃克爾樹](/roadmap/verkle-trees) - 沃克爾樹是一種資料結構,可用於在以太坊上啟用無狀態用戶端。 這些「無狀態」用戶端只需少量的儲存空間,但仍然能夠驗證新區塊。 +- [無狀態](/roadmap/statelessness) - 無狀態用戶端不需要大量資料,即可驗證新區塊。 這將提供運行節點的所有好處,而成本僅為目前的一小部分。 diff --git a/public/content/translations/zh-tw/roadmap/merge/index.md b/public/content/translations/zh-tw/roadmap/merge/index.md index 90fc78d7ad5..8b085cd4c44 100644 --- a/public/content/translations/zh-tw/roadmap/merge/index.md +++ b/public/content/translations/zh-tw/roadmap/merge/index.md @@ -1,12 +1,11 @@ --- title: 合併 -description: 瞭解「合併 - 當以太坊主網採用權益證明時」的相關資訊 +description: 瞭解「合併 - 當以太坊主網採用權益證明時」的相關資訊。 lang: zh-tw template: upgrade image: /upgrades/merge.png -alt: summaryPoint1: 以太坊主網使用權益證明,但以前並非總是如此。 -summaryPoint2: 從原本的工作量證明機制到權益證明的升級稱之為「合併」(The Merge) +summaryPoint2: 從原本的工作量證明機制到權益證明的升級稱為「合併」。 summaryPoint3: 合併指原本的以太坊主網與稱為信標鏈的獨立權益證明區塊鏈合併,現在作為一條鏈存在。 summaryPoint4: 合併將以太坊的能耗降低了大約 99.95%。 --- @@ -15,25 +14,25 @@ summaryPoint4: 合併將以太坊的能耗降低了大約 99.95%。 「合併」已於 2022 年 9 月 15 日執行。 這使得以太坊完全過渡到權益證明共識,正式棄用工作量證明並將能耗降低大約 99.95%。 -## 「合併」是什麼? {#what-is-the-merge} +## 什麼是「合併」? {#what-is-the-merge} 合併指將以太坊的原始執行層(自[創世](/history/#frontier)以來就存在的主網)與其新的權益證明共識層「信標鏈」結合在一起。 它減少了對能源密集型挖礦的需求,而是藉由質押的以太幣來確保網路安全。 這是實現以太坊「更高的可擴容性、安全性和永續性」願景的真正令人興奮的一步。 -一開始,[信標鏈](/roadmap/beacon-chain/)與[主網](/glossary/#mainnet)是分別發佈的。 以太坊主網及其所有帳戶、餘額、智慧型合約以及區塊練狀態繼續受到[工作量證明](/developers/docs/consensus-mechanisms/pow/)的保護,即使信標鏈使用[權益證明](/developers/docs/consensus-mechanisms/pos/)並行運作。 合併完成即表示這兩個系統最終結合在一起,權益證明永久取代工作量證明。 +一開始,[信標鏈](/roadmap/beacon-chain/)與[主網](/glossary/#mainnet)是分別上線的。 以太坊主網及其所有帳戶、餘額、智慧型合約以及區塊練狀態繼續受到[工作量證明](/developers/docs/consensus-mechanisms/pow/)的保護,即使信標鏈使用[權益證明](/developers/docs/consensus-mechanisms/pos/)並行運作。 合併完成即表示這兩個系統最終結合在一起,權益證明永久取代工作量證明。 -將以太坊想像成一艘宇宙飛船,還未完全準備好星際旅行就已經升空。 以太坊社群藉由信標鏈打造全新的引擎與堅固的外殼。 經過大量的測試後,是時候在飛行旅途中以熱插拔的方式將舊引擎更換為新引擎了。 這將全新且更高效的引擎合併到現有的飛船中,使之能夠進行長達數光年的太空之旅。 +將以太坊想像成一艘宇宙飛船,還未完全準備好星際旅行就已經升空。 以太坊社群藉由信標鏈打造全新的引擎與堅固的外殼。 經過大量的測試後,是時候在飛行旅途中以熱插拔的方式將舊引擎更換為新引擎了。 全新且更高效的引擎合併到現有的飛船中,使之能夠進行長達數光年的太空之旅。 ## 與主網合併 {#merging-with-mainnet} 從創世到合併之前,工作量證明一直保護著以太坊主網的安全。 這使得我們都習慣的以太坊區塊鏈於 2015 年 7 月誕生,並具備所有熟悉的功能——交易、智慧型合約、帳戶等。 -在以太坊整個發展歷程中,開發者們一直在為最終從工作量證明過渡到權益證明努力準備著。 2020 年 12 月 1 日,信標鏈作為主網的獨立區塊鏈建立,與主網並行運行。 +在以太坊整個發展歷程中,開發者們一直在為最終從工作量證明過渡到權益證明努力準備著。 2020 年 12 月 1 日,信標鏈作為獨立於主網的區塊鏈建立,與主網並行運行。 -信標鏈原本並沒有處理主網的交易, 而是透過商定活躍的驗證者及其帳戶的餘額來就其自己的狀態達成共識。 廣泛的測試完成後,就是讓信標鏈就真實資料達成共識的時候了。 合併之後,信標鏈會成為所有網路資料的共識引擎,包含執行層的交易以及帳戶餘額。 +信標鏈原本並沒有處理主網的交易, 而是透過商定活躍的驗證者及其帳戶的餘額就其自己的狀態達成共識。 廣泛的測試完成後,就是讓信標鏈就真實資料達成共識的時候了。 合併之後,信標鏈會成為所有網路資料的共識引擎,包含執行層的交易以及帳戶餘額。 -合併代表正式轉用信標鏈作為區塊生產引擎。 挖礦不再是生產有效區塊的方式。 相反,權益證明驗證者已擔任這個角色,現在負責處理所有交易的有效性及提交區塊。 +合併代表正式轉用信標鏈作為區塊生產引擎。 挖礦不再是生產有效區塊的方式。 相反,權益證明驗證者已擔任這個角色,現在負責處理所有交易的有效性及提出區塊。 合併中,歷史記錄不會丟失。 隨著主網與信標鏈合併,以太坊的所有交易記錄也已一併整合。 @@ -45,13 +44,13 @@ summaryPoint4: 合併將以太坊的能耗降低了大約 99.95%。 **合併並不會對持有者或使用者造成任何影響。** -*再次提醒:*作為以太幣或其他以太坊數位資產的使用者或持有者,以及非節點運行質押者,**在合併前,你並不需要針對自己的資金或錢包採取任何行動**。以太幣還是原本的以太幣。 並沒有所謂的「舊以太幣」/「新以太幣」或「ETH1」/「ETH2」,而且合併前後錢包的使用方式也完全一樣。若有人告訴你其他的說法,那他很可能是個騙子。 +_再次提醒:_作為以太幣或其他以太坊數位資產的使用者或持有者,以及非節點運行質押者,**在合併前,你並不需要針對自己的資金或錢包採取任何行動**。以太幣還是原本的以太幣。 並沒有所謂的「舊以太幣」/「新以太幣」或「以太坊 1」/「以太坊 2」,而且合併前後錢包的使用方式也完全一樣。若有人告訴你其他的說法,那他很可能是個騙子。 -儘管不再使用工作量證明,以太坊自從創世以來的完整歷史記錄將完整保留,不會因為轉用權益證明而有所改變。 合併前即存在於錢包的所有資金,合併之後一樣可用。 **無須採取任何行動即可升級。** +儘管不再使用工作量證明,以太坊自從創世以來的完整歷史記錄將完整保留,不會因為過渡到權益證明而有所改變。 合併前即存在於錢包的所有資金,合併之後一樣可用。 **無須採取任何行動即可升級。** -[關於以太坊安全性的更多資訊](/security/#eth2-token-scam) +[更多以太坊安全性相關更多資訊](/security/#eth2-token-scam) -### 節點營運者與去中心化應用程式開發者 {#node-operators-dapp-developers} +### 節點營運商與去中心化應用程式開發者 {#node-operators-dapp-developers} 1. 同時運行共識用戶端及執行用戶端;合併之後,無法再使用取得執行資料的第三方端點。 2. 使用共用的 JWT 金鑰來驗證執行與共識用戶端,以便他們能夠安全地通訊。 - 3 設定「收費」地址以接收賺取的礦工費小費/礦工可提取價值 (MEV)。 +3 設定「費用接收」地址以接收賺取的交易費小費/最大可提取價值 (MEV)。 在完成上述兩點以前,你的節點會顯示為「離線」,直到兩個層皆同步且通過驗證為止。 -若未設定「收費」地址,驗證者仍舊可以如常行事,但你將無法賺取未銷毀費用小費,以及原本可以在驗證者提交的區塊中賺取的礦工可提取價值。 +若未設定「費用接收」地址,驗證者仍舊可以如常行事,但你將無法賺取未銷毀費用小費,以及原本可以在驗證者提出的區塊中賺取的最大可提取價值。 合併以前,執行用戶端(例如 Geth、Erigon、Besu 或 Nevermind)可以接收、正確驗證以及廣播藉由網路傳播的區塊。 _合併之後_,執行有效負載中包含的交易之有效性現在也取決於其所在的「共識區塊」的有效性。 -因此,完整的以太坊節點現在同時需要執行用戶端與共識用戶端。 這兩個用戶端使用新的引擎 API 協同運作。 引擎 API 需要使用 JWT 金鑰進行驗證,該金鑰會提供給兩個用戶端來支援安全通訊。 +因此,以太坊全節點現在同時需要執行用戶端與共識用戶端。 這兩個用戶端使用新的引擎應用程式介面協同運作。 引擎應用程式介面需要使用 JWT 金鑰進行驗證,該金鑰會提供給兩個用戶端來支援安全通訊。 主要行動事項包括: - 除共識用戶端之外,還要安裝執行用戶端 -- 利用共用的 JWT 金鑰來驗證執行用戶端和共識用戶端,這樣他們就可以安全地同彼此溝通。 +- 利用共用的 JWT 金鑰來驗證執行用戶端和共識用戶端,這樣它們就可以安全地同彼此通訊。 若未完成上述事項,你的節點將會顯示為「離線」狀態,直到兩個層皆同步且通過驗證為止。 -合併過程中共識機制亦發生變更,包括以下方面的相關更動:< +合併過程中共識機制亦發生變更,包括以下方面的相關變更:<
        • 區塊結構
        • @@ -102,7 +101,7 @@ id="developers">
        • 安全標頭定案區塊的概念
        -更多資訊請閱讀 Tim Beiko 的部落格文章:合併如何影響以太坊的應用層。 +更多資訊請閱讀 Tim Beiko 的部落格文章:合併如何影響以太坊的應用程式層
        @@ -117,41 +116,41 @@ id="developers"> ## 關於合併的誤解 {#misconceptions} -以太坊的節點有兩種類型:可以提交區塊;無法提交區塊。 +以太坊的節點有兩種類型:可以提出區塊;無法提出區塊。 -提交區塊的節點僅佔以太坊節點總數的一小部分。 這一類別中包含工作量證明 (PoW) 下的挖礦節點及權益證明 (PoS) 下的驗證者節點。 這一類別必須要付出經濟資源(例如工作量證明下 GPU 的算力,或是權益證明下的以太幣質押)來換取不時提交下一個區塊並賺取協定獎勵的能力。 +提出區塊的節點僅佔以太坊節點總數的一小部分。 這一類別中包含工作量證明 (PoW) 下的挖礦節點及權益證明 (PoS) 下的驗證者節點。 這一類別必須要付出經濟資源(例如工作量證明下 GPU 的雜湊算力,或是權益證明下的質押以太幣)來換取不時提出下一個區塊並贏取協定獎勵的能力。 -除了具有 1-2 TB 可用儲存空間和網際網路連線的消費級電腦之外,網路上的其他節點(即其他大多數)不需要付出任何經濟資源。 這些節點並不會提交區塊,但仍然會在保護網路安全中扮演很重要的角色,它們透過偵聽新區塊並根據網路共識規則在到達時驗證其有效性,讓所有區塊提交者負責。 如果區塊有效,節點會繼續將其廣播到網路上。 如果區塊無效,無論什麼樣的原因,節點軟體會將其視為無效並停止其傳播。 +除了具有 1-2 TB 可用儲存空間和網際網路連線的消費級電腦之外,網路上的其他節點(即其他大多數)不需要付出任何經濟資源。 這些節點並不會提出區塊,但仍然會在保護網路安全中扮演很重要的角色,它們透過偵聽新區塊並根據網路共識規則在其到達時驗證其有效性,讓所有區塊提議者負責。 如果區塊有效,節點會繼續將其廣播到網路上。 如果區塊無效,無論什麼樣的原因,節點軟體會將其視為無效並停止其傳播。 -在任一共識機制(工作量證明或權益證明)下,任何人都可以運行非區塊生產節點;如果可以,強烈推薦所有使用者都這麼做。 運行節點不只對以太坊非常有價值,還可以為運行節點的個人帶來額外的好處,例如提高安全性、隱私性和抗審查能力。 +在任一共識機制(工作量證明或權益證明)下,任何人都可以執行非區塊生產節點;如果可以,強烈推薦所有使用者都這麼做。 運行節點不只對以太坊非常有價值,還可以為運行節點的個人帶來額外的好處,例如提高安全性、隱私性和抗審查能力。 -任何人都能夠運行自己的節點對於維持以太坊網路的去中心化絕對至關重要。 +任何人都能夠執行自己的節點對於維持以太坊網路的去中心化絕對至關重要。 -關於運行自己節點的更多資訊 +執行自己節點的更多相關資訊 -Gas 費用是網路需求相對於網路容量的產物。 合併後,我們棄用了工作量證明,轉而採用權益證明共識機制,但並沒有顯著改變任何直接影響網路容量或吞吐量的參數。 +燃料費用是網路需求相對於網路容量的產物。 合併後,我們棄用了工作量證明,轉而採用權益證明共識機制,但並沒有顯著改變任何直接影響網路容量或吞吐量的參數。 -根據以卷軸為中心的開發藍圖,我們主要專注於擴容二層網路上的使用者活動,同時讓一層網路主網成為針對卷軸資料儲存進行最佳化的安全去中心化結算層,以協助使卷軸交易成本呈指數級下降。 轉用權益證明是實現這點的關鍵前導步驟。 關於 Gas 和費用的更多資訊。 +根據以卷軸為中心的開發藍圖,我們主要專注於擴展二層網路上的使用者活動,同時讓一層網路主網成為針對卷軸資料儲存進行最佳化的安全去中心化結算層,以協助使卷軸交易成本呈指數級下降。 轉用權益證明是實現這點的關鍵前導步驟。 更多燃料和費用相關資訊。 -交易的「速度」可以透過多種方式衡量,包括包含在區塊中的時間和最終化時間。 兩者的改變都非常細微,使用者不太會注意到。 +交易的「速度」可以透過多種方式衡量,包括添加到區塊中的時間和最終確定的時間。 兩者的改變都非常細微,使用者不太會注意到。 過往採用工作量證明時,目標是約每 13.3 秒產生一個新區塊。 採用權益證明時,時隙恰好每 12 秒發生一次,每個時隙都是驗證者發佈區塊的機會。 多數時隙都有區塊,但不一定全部都是這樣(如驗證者離線)。 採用權益證明時,區塊的產生頻率比工作量證明高出約 10%。 這是非常細微的改變,使用者不太可能注意到。 -權益證明引入了先前不存在的交易最終性的概念。 在工作量證明中,交易後經過的每個區塊會讓區塊逆轉的難度指數型加大,但機率並不完全為零。 在權益證明下,區塊會捆綁進驗證者投票的時期(每 6.4 分鐘含有 32 個提交區塊的機會)。 當一個時期結束時,驗證者投票決定該時期是否「合法」。 如果驗證者們同意該時期合法,它會在下個時期最終確定。 取消最終確定的交易在經濟上不可行,因為需要取得和銷毀超過三分之一的總質押以太幣。 +權益證明引入了先前不存在的交易最終確定性的概念。 在工作量證明中,交易後經過的每個區塊會讓區塊逆轉的難度指數型加大,但機率並不完全為零。 在權益證明下,區塊會捆綁進驗證者投票的時期(每 6.4 分鐘含有 32 個提出區塊的機會)。 當一個時期結束時,驗證者投票決定該時期是否「已證明」。 如果驗證者們同意該時期已證明,它會在下個時期最終確定。 取消最終確定的交易在經濟上不可行,因為需要取得和銷毀超過三分之一的質押以太幣總量。 @@ -159,38 +158,38 @@ contentPreview="False. Though some slight changes exist, transaction speed is mo title="誤解:「合併啟用了質押提款功能。」" contentPreview="False, but staking withdrawals have since been enabled via the Shanghai/Capella upgrade."> -合併初期,質押者僅能賺取區塊提案的小費和礦工可提取價值收益。 這些獎勵被計入驗證者控制的非質押帳戶(又稱收費地址),且立即可用。 這些獎勵與執行驗證者職責的協定獎勵是分開的。 +合併初期,質押者僅能賺取提出區塊的費用小費和最大可提取價值。 這些獎勵被計入驗證者控制的非質押帳戶(稱為費用接收地址),且立即可用。 這些獎勵與執行驗證者職責的協定獎勵是分開的。 -自從上海/卡佩拉網路升級後,質押者現在可以指定提款地址,以開始接收自動支付的額外質押餘額(原本質押的 32 個以太幣以外的協定獎勵)。 此升級也使驗證者可以在退出網路時解套和收回其全部餘額。 +自從上海/卡佩拉網路升級後,質押者現在可以指定提款地址,以開始接收自動支付的額外質押餘額(原本質押的 32 以太幣以外的協定獎勵)。 此升級也使驗證者可以在退出網路時解鎖和收回其全部餘額。 -關於質押提款的更多資訊 +更多質押提款相關資訊
        -由於上海/卡佩拉升級啟用了提款功能,我們鼓勵驗證者提取其質押的 32 個以太幣以外的餘額,因為這些資金不會增加收益率,不提取會被鎖定。 根據年化報酬率(取決於質押的以太幣總量),他們可能被激勵退出驗證者,以回收其全部餘額,或者用其質押獲得的獎勵繼續質押,賺取更多以太幣。 +由於上海/卡佩拉升級啟用了提款功能,我們鼓勵驗證者提取其質押的 32 個以太幣以外的餘額,因為這些資金不會增加收益率,不提取會被鎖定。 根據年化報酬率(取決於質押的以太幣總量),他們可能激勵驗證者退出,以回收其全部餘額,或者用其質押獲得的獎勵繼續質押,賺取更多以太幣。 這裡有個重要的限制:協定限制了驗證者完全退出的速率,每個時期(每 6.4 分鐘)只有一定數量的驗證者可以退出。 此限制會根據活躍驗證者數量波動,但單日可退出網路的驗證者總數約為全部驗證者的 0.33%。 -這可以防止質押資金大規模外流。 此外,這也可以阻止潛在的攻擊者在協定執行罰沒懲處之前,獲得因犯下可罰沒的罪行,並在同一時期退出/提取所有有問題的驗證者餘額而質押的以太幣總量的很大一部分。 +這可以防止質押資金大規模外流。 此外,這也可以阻止可存取很大一部分質押以太幣總量的潛在攻擊者實施可被罰沒的違規行為,並在協定執行罰沒懲處之前,在同一時期退出/提取所有違規的驗證者餘額。 -年化報酬率也是特意設計成動態的,使得市場上的質押者可以權衡他們願意付出多少成本來協助維護網路安全。 如果速率太低,驗證者將以協定限制的速率退出。 這將逐漸提高留下的所有人的年利率,再次吸引新的或返回的質押者。 +年化報酬率也是特意設計成動態的,使得市場上的質押者可以權衡他們願意付出多少成本來協助維護網路安全。 如果速率太低,驗證者將以協定限制的速率退出。 這將逐漸提高留下的所有人的年利率,吸引新的質押者或讓老質押者迴歸。 -## “Eth2”發生了什麽? {#eth2} +## 「以太坊 2.0」怎麼了? {#eth2} -「Eth2」這個術語已被棄用。 將「Eth1」和「Eth2」合併為單一的區塊鏈後,已不需要區分這兩個以太坊網路;現在只有以太坊。 +「以太坊 2」這個術語已被棄用。 將「以太坊 1」和「以太坊 2」合併為單一的區塊鏈後,已不需要區分這兩個以太坊網路;現在只有以太坊。 為了減少混亂,社區更新了這些條款: -- “Eth1”現在是處理交易和執行的“執行層”。 -- “Eth2”現在是處理權益證明共識的“共識層”。 +- 「以太坊 1.0」現在是處理交易和執行的「執行層」。 +- 「以太坊 2.0」現在是處理權益證明共識的「共識層」。 -這些術語更新只是改變了命名慣例;這並沒有改變以太坊的目標或路線圖。 +這些術語更新只是改變了命名慣例;這並沒有改變以太坊的目標或開發藍圖。 -[瞭解更多關於“Eth2”重命名的信息](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) +[瞭解更多關於「以太坊 2.0」重命名的資訊](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/) ## 不同升級之間的關聯 {#relationship-between-upgrades} @@ -200,7 +199,7 @@ contentPreview="False. Validator exits are rate limited for security reasons."> 合併代表著信標鏈作為原始主網執行層的新共識層被正式採用。 合併後,驗證者需負責維護以太坊安全,且[工作量證明](/developers/docs/consensus-mechanisms/pow/)挖礦已不再是有效的區塊生產方式。 -相反,區塊的提交方式是驗證已質押以太幣的節點,以換取參與共識的權利。 這為包括分片在內的未來擴容升級奠定了基礎。 +相反,區塊是由質押了以太幣的驗證節點提出,以換取參與共識的權利。 這為包括分片在內的未來擴容升級奠定了基礎。 信標鏈 @@ -216,7 +215,7 @@ contentPreview="False. Validator exits are rate limited for security reasons."> 原本的計劃是,在合併前進行分片以處理擴容問題。 然而,鑑於[二層網路擴容解決方案](/layer-2/)的蓬勃發展,優先事務就是摒棄工作量證明,轉用權益證明。 -分片計劃正在迅速發展,但考慮到用於擴展交易執行的二層網路技術的興起和成功,分片計劃已轉向尋找最佳方式來分配儲存來自卷軸合約的壓縮呼叫資料的負擔,從而實現網路容量的指數級增長。 如果不轉用權益證明,這是不可能的。 +分片計劃正在迅速發展,但考慮到用於擴展交易執行的二層網路技術的興起和成功,分片計劃已轉向尋找最佳方式來分配儲存來自卷軸合約的壓縮 calldata 的負擔,從而實現網路容量的指數級增長。 如果不過渡到權益證明,這是不可能的。 分片 diff --git a/public/content/translations/zh-tw/roadmap/merge/issuance/index.md b/public/content/translations/zh-tw/roadmap/merge/issuance/index.md index e5043a79913..3b6161007b2 100644 --- a/public/content/translations/zh-tw/roadmap/merge/issuance/index.md +++ b/public/content/translations/zh-tw/roadmap/merge/issuance/index.md @@ -21,8 +21,8 @@ title="以太幣發行量總覽"> - 在過渡到權益證明前,所有礦工總計每日可得到約 13,000 個新發行的以太幣 - 在質押的以太幣總數達到 1,400 萬個的情況下,所有質押者總計每日可得到約 1,700 個新發行的以太幣 - 實際的質押獎勵會根據質押總量浮動 -- **自合併後,發行僅為每日約 1,700 個以太幣,因此總的新以太幣發行量下降了約 88%** -- 銷毀會根據網路的需求量浮動。 \_如果某天平均 Gas 價格高於 16 gwei,這會有效抵消發行給驗證者的約 1,700 個以太幣,使得當天的以太幣淨通膨率降至零或更低。 +- **自合併後,發行僅為每日約 1,700 個以太幣,因此新以太幣總發行量下降了約 88%** +- 銷毀會根據網路的需求量浮動。 _如果某天平均燃料價格高於 16 gwei,這會有效抵消發行給驗證者的約 1,700 個以太幣,使得當天的以太幣淨通膨率降至零或更低。 @@ -30,32 +30,32 @@ title="以太幣發行量總覽"> ### 執行層發行 {#el-issuance-pre-merge} -在工作量證明下,礦工只會和執行層互動,如果它們最快解出下個區塊,則會收到區塊獎勵。 自從 2019 年[君士坦丁堡升級](/history/#constantinople)後,此獎勵就被訂為每個區塊 2 個以太幣。 礦工發佈 [Ommer](/glossary/#ommer) 區塊同樣會獲得獎勵,這些區塊是未出現在最長鏈/規範鏈中的有效區塊。 每個 Ommer 的最高獎勵為 1.75 個以太幣,這些*不包含*在規範區塊頒發的獎勵之內。 挖礦是一項經濟密集型活動,歷來需要發行大量以太幣才能維持。 +在工作量證明下,礦工只會和執行層互動,如果它們最快解出下個區塊,則會收到區塊獎勵。 自從 2019 年[君士坦丁堡升級](/history/#constantinople)後,此獎勵就被訂為每個區塊 2 個以太幣。 礦工發佈[叔](/glossary/#ommer)塊同樣會獲得獎勵,這些區塊是未出現在最長鏈/規範鏈中的有效區塊。 每個 Ommer 的最高獎勵為 1.75 個以太幣,這些_不包含_在規範區塊頒發的獎勵之內。 挖礦是一項經濟密集型活動,歷來需要發行大量以太幣才能維持。 ### 共識層發行 {#cl-issuance-pre-merge} [信標鏈](/history/#beacon-chain-genesis)已於 2020 年上線。 使用權益證明的驗證者(而非礦工)會保護其安全。 信標鍊是由以太坊使用者將以太幣單向存入主網(執行層)上的智慧型合約而啟動的,信標鏈會監聽該合約,並在新鏈上為使用者鑄造同等數量的以太幣。 在合併發生之前,信標鏈的驗證者未處理交易,並且基本上就驗證者礦池本身的狀態達成了共識。 -信標鏈上的驗證者因證明鏈的狀態並提交區塊而獲得以太幣獎勵。 系統會根據驗證者的表現,在每個時期(epoch,每 6.4 分鐘)計算和分配獎勵(或懲罰)。 驗證者獎勵**明顯**低於之前根據工作量證明發行的挖礦獎勵(每大約 13.5 秒 2 個以太幣),因為操作驗證節點不會造成經濟方面的緊張,因此不需要或保證那麼高的獎勵。 +信標鏈上的驗證者因證明鏈的狀態並提出區塊而獲得以太幣獎勵。 系統會根據驗證者的表現,在每個時期(每 6.4 分鐘)計算和分配獎勵(或懲罰)。 驗證者獎勵**明顯**低於之前根據工作量證明發行的挖礦獎勵(每大約 13.5 秒 2 個以太幣),因為運行驗證節點不是經濟密集型活動,因此不需要或不保證那麼高的獎勵。 ### 合併前發行細節 {#pre-merge-issuance-breakdown} -總以太幣供給量:**大約 120,520,000 個以太幣**(2022 年 9 月合併時) +以太幣總供給量:**大約 120,520,000 個以太幣**(2022 年 9 月合併時) **執行層發行:** - 估計每 13.3 秒 2.08 個以太幣\*:每年發行**大約 4,930,000 個以太幣**。 - 導致通膨率達到**大約 4.09%**(每年 493 萬 / 總計 1.205 億) -- \*這包含了每個規範區塊 2 個以太幣,加上一段時間內來自 Ommer 區塊的平均 0.08 個以太幣。 兩者同樣花費 13.3 秒,不受[難度爆彈](/glossary/#difficulty-bomb)任何影響的基本區塊時間目標。 ([請見來源資訊](https://bitinfocharts.com/ethereum/)) +- \*這包含了每個規範區塊 2 個以太幣,加上一段時間內來自叔塊的平均 0.08 個以太幣。 兩者同樣花費 13.3 秒,不受[難度爆彈](/glossary/#difficulty-bomb)任何影響的基本區塊時間目標。 ([請見來源資訊](https://bitinfocharts.com/ethereum/)) **共識層發行:** - 以質押總量為 14,000,000 個以太幣計,發行量為大約每天 1700 個以太幣([請見來源資訊](https://ultrasound.money/)) -- 導致每年的以太幣發行量達到**大約 620,500 個**。 +- 導致每年的以太幣發行量達到**大約 620,500 個** - 導致通膨率達到**大約 0.52%**(每年 62.05 萬 / 總計 1.193 億) -總年度發行率(合併前):約 4.61% (4.09% + 0.52%)

        +總年化發行率(合併前):約 4.61% (4.09% + 0.52%)

        約 88.7% 發行的以太幣給了執行層上的礦工 (4.09 / 4.61 * 100)

        約 11.3% 發行的以太幣給了共識層上的質押者 (0.52 / 4.61 * 100)
        @@ -68,30 +68,30 @@ title="以太幣發行量總覽"> ### 共識層發行 {#cl-issuance-post-merge} -共識層的發行今天仍在繼續,就像合併前一樣,證明和提交區塊的驗證者會收到少量獎勵。 驗證者獎勵會繼續累積到共識層內管理的*驗證者餘額*中。 與可以在主網上交易的活期帳戶(「執行」帳戶)不同,這些是單獨的以太坊帳戶,不能與其他以太坊帳戶自由交易。 這些帳戶中的資金只能提款到單一的指定執行地址。 +共識層發行今天仍在繼續,就像合併前一樣,證明和提出區塊的驗證者會收到少量獎勵。 驗證者獎勵會繼續累積到共識層內管理的_驗證者餘額_中。 與可以在主網上交易的活期帳戶(「執行」帳戶)不同,這些是單獨的以太坊帳戶,不能與其他以太坊帳戶自由交易。 這些帳戶中的資金只能提領到單一的指定執行地址。 -自上海/卡佩拉升級於 2023 年 4 月完成以來,質押者已可提取這些資金。 我們鼓勵質押者取出*收益/獎勵(餘額超過 32 個以太幣)*,因為這些資金對其股權權重無益(最大為 32 個)。 +自上海/卡佩拉升級於 2023 年 4 月完成以來,質押者已可提領這些資金。 我們鼓勵質押者取出_收益/獎勵(超過 32 以太幣的餘額)_,因為這些資金對其質押權重無益(最大為 32 個)。 -質押者也可以選擇退出並提取其全部驗證者餘額。 為了確保以太坊的穩定性,驗證者同時退出的數量是有上限的。 +質押者也可以選擇退出並提領其全部驗證者餘額。 為了確保以太坊的穩定性,驗證者同時退出的數量是有上限的。 -每天可以退出的上限約為驗證者總數的 0.33%。 預設情況下,每個時期(epoch,每 6.4 分鐘,每天共 900 個)可以退出四 (4) 個驗證者。 在驗證者超過 262,144 (218) 的情況下,每額外增加 65,536 (216) 名驗證者,即可額外允許一 (1) 名驗證者退出。 舉例來說,若驗證者數量超過 327,680,則每個時期可以退出五 (5) 名(每天 1,125 名)。 活躍驗證者總數超過 393,216 時,將允許六 (6) 名退出,依此類推。 +每天可以退出的上限約為驗證者總數的 0.33%。 預設情況下,每個時期(每 6.4 分鐘,每天共 900 名)可以退出四 (4) 名驗證者。 在驗證者超過 262,144 (218) 的情況下,每額外增加 65,536 (216) 名驗證者,即可額外允許一 (1) 名驗證者退出。 舉例來說,若驗證者數量超過 327,680,則每個時期可以退出五 (5) 名(每天 1,125 名)。 活躍驗證者總數超過 393,216 時,將允許六 (6) 名退出,依此類推。 -隨著越來越多的驗證者退出,退出驗證者的最大數量將逐漸減少到下限值四個,以故意防止大量質押的以太幣同時被取出,造成不穩定。 +隨著越來越多的驗證者退出,退出驗證者的最大數量將逐漸減少到下限值四個,用於特意防止大量質押的以太幣同時被取出,造成不穩定。 ### 合併後通膨細節 {#post-merge-inflation-breakdown} -- 總以太幣供給量:**大約 120,520,000 個以太幣**(2022 年 9 月合併時) +- 以太幣總供給量:**大約 120,520,000 個以太幣**(2022 年 9 月合併時) - 執行層發行量:**0** -- 共識層發行量:同上,年度發行率**約為 0.52%**(質押總量為 1,400 萬個以太幣) +- 共識層發行量:同上,年化發行率**約為 0.52%**(質押總量為 1,400 萬個以太幣) -總年度發行率:約 0.52%

        +總年化發行率:約 0.52%

        年度以太幣發行量淨減少值:約 88.7% ((4.61% - 0.52%) / 4.61% * 100)
        ## 銷毀 {#the-burn} -與以太幣發行相反的力量是以太幣被銷毀的速度。 對於在以太坊上執行的交易,必須支付最低費用(稱為「基本費用」),具體費用根據網路活動不斷波動(逐區塊)。 此費用使用以太幣支付,且*必須*支付這筆費用,交易才被視為有效。 這筆費用會在交易過程中*銷毀*,從流通中移除。 +與以太幣發行相反的力量是以太幣被銷毀的速度。 對於在以太坊上執行的交易,必須支付最低費用(稱為「基本費用」),具體費用根據網路活動不斷波動(逐區塊)。 此費用使用以太幣支付,且_必須_支付這筆費用,交易才被視為有效。 這筆費用會在交易過程中_銷毀_,從流通中移除。 費用銷毀機制在 2021 年 8 月倫敦升級後上線,自合併以來一直維持不變。 @@ -99,17 +99,17 @@ title="以太幣發行量總覽"> 除了倫敦升級時實作的費用銷毀機制外,驗證者也可能因離線而受到懲處;更糟糕的是,他們可能因為違反威脅網路安全的特定規定而遭罰沒。 這些處罰會導致驗證者餘額中的以太幣減少,減少的金額不會直接獎勵給任何其他帳戶,而是會有效地從流通中銷毀/移除。 -### 計算通貨緊縮時的平均 Gas 價格 {#calculating-average-gas-price-for-deflation} +### 計算通縮時的平均燃料價格 {#calculating-average-gas-price-for-deflation} 如上所述,一天發行的以太幣數量取決於質押的以太幣總量。 截至本文撰寫時止,每天的發行量約為 1,700 個以太幣。 -為了確定在給定 24 小時內完全抵消此次發行所需的平均 Gas 價格,我們先計算一天中發行的區塊總數(假設一個區塊耗費的時間為 12 秒): +為了確定在給定 24 小時內完全抵消此次發行所需的平均燃料價格,我們先計算一天中發行的區塊總數(假設一個區塊出塊的時間為 12 秒): - `(1 個區塊/12 秒) * (60 秒/分鐘) = 5 個區塊/分鐘` - `(5 個區塊/分鐘) * (60 分鐘/小時) = 300 個區塊/小時` - `(300 個區塊/小時) * (24 小時/天) = 7200 個區塊/天` -每個區塊目標為 `15x10^6 gas/block`([關於 Gas 的更多資訊](/developers/docs/gas/))。 我們可以利用這一資訊解出抵消發行量需要的平均 Gas 價格(以 gwei/gas 為單位),假設每日以太幣發行量為 1700: +每個區塊目標為 `15x10^6 gas/block`([更多燃料相關資訊](/developers/docs/gas/))。 我們可以利用這一資訊解出抵消發行量需要的平均燃料價格(以 gwei/燃料為單位),假設每日以太幣發行量為 1700: - `7200 blocks/day * 15x10^6 gas/block *`**`Y gwei/gas`**`* 1 ETH/ 10^9 gwei = 1700 ETH/day` @@ -123,7 +123,7 @@ title="以太幣發行量總覽"> 我們可以簡化並將其寫為 `X` 的函式: -- `f(X) = X/108`,其中 `X` 代表每日的以太幣發行量,`f(X)` 代表抵消新發行的所有以太幣所需的 gwei/gas 價格。 +- `f(X) = X/108`,其中 `X` 代表每日的以太幣發行量,`f(X)` 代表抵消新發行的所有以太幣所需的 gwei/燃料價格。 所以舉例來說,若基於以太幣質押總量,`X`(每日以太幣發行量)升至 1800,`f(X)`(抵消發行的所有以太幣所需的 gwei)會是 `17 gwei`(取兩位有效數字) diff --git a/public/content/translations/zh-tw/roadmap/pbs/index.md b/public/content/translations/zh-tw/roadmap/pbs/index.md index b1841cfabfb..d7d8111859f 100644 --- a/public/content/translations/zh-tw/roadmap/pbs/index.md +++ b/public/content/translations/zh-tw/roadmap/pbs/index.md @@ -6,38 +6,38 @@ lang: zh-tw # 提交者-建置者分離 {#proposer-builder-separation} -目前以太坊驗證者負責建置*和*廣播區塊。 他們將從流言(註:gossip,一種分散式協定)網路監聽到的交易捆綁在一起,並打包進一個區塊,然後傳送到以太坊網路上。 **提交者-建置者分離 (PBS)** 會將這些任務分配給多個驗證者。 區塊建置者負責建立區塊,並在每個時隙將其提供給區塊提交者。 區塊提交者無法讀取區塊的內容,他們直接選擇收益最高的區塊,並將費用支付給區塊建置者,然後將區塊傳送至對等節點。 +目前以太坊驗證者負責建置_和_廣播區塊。 他們將從廣播網路監聽到的交易捆綁在一起,並打包進一個區塊,然後傳送到以太坊網路上。 **提交者-建置者分離 (PBS)** 會將這些任務分配給多個驗證者。 區塊建置者負責建立區塊,並在每個時隙將其提供給區塊提交者。 區塊提交者無法讀取區塊的內容,他們直接選擇收益最高的區塊,並將費用支付給區塊建置者,然後將區塊傳送至對等節點。 -這個升級非常重要,有幾個原因。 首先,它在協定層面建立了避免交易審查的機會。 其次,它避免了業餘愛好驗證者在競爭中被機構參與者擊敗,機構參與者能更好地最佳化區塊建置利潤。 再者,它透過 Danksharding 升級幫助以太坊擴容。 +這個升級非常重要,有幾個原因。 首先,它在協定層面建立了避免交易審查的機會。 其次,它避免了業餘愛好驗證者在競爭中被機構參與者擊敗,機構參與者能更好地最佳化其區塊建置工作的獲利能力。 再者,它透過 Danksharding 升級幫助以太坊擴容。 ## 提交者-建置者分離及抗審查性 {#pbs-and-censorship-resistance} -將區塊建置者與區塊提交者分離可使區塊建置者更難審查交易。 這是因為提交區塊前可以新增相對複雜的納入標準,以確保在區塊提交前沒有被審查。 由於區塊提交者是與區塊建置者分離的實體,承擔著保護者的角色,可阻止對區塊建置者的審查。 +將區塊建置者與區塊提交者分離可使區塊建置者更難審查交易。 這是因為可以新增相對複雜的區塊添加標準,以確保在區塊提出前沒有被審查。 由於區塊提交者是與區塊建置者分離的實體,承擔著保護者的角色,可阻止對區塊建置者的審查。 -舉例來說,可以引入包含清單,以便當驗證者知道交易但沒有看到它們包含在區塊中時,可以將這些交易強加為下一個區塊中的必備項。 包含清單由區塊提交者的本地記憶體池(其自己知道的交易清單)產生,並在區塊被提交前送到其他節點。 若包含清單中缺少任何交易,區塊提交者可以選擇拒絕區塊、在提交前加上缺漏的交易,或者直接提交區塊(其他驗證者收到時會拒絕)。 這個理念還有一個潛在的更高效版本,它斷定建置者必須充分利用可用的區塊空間,如果不這樣做,交易將從提交者的包含清單中新增。 這個領域仍在活躍的研究當中,且包含清單的最佳化設定尚未確定。 +舉例來說,可以引入包含清單,以便當驗證者知道交易但沒有看到它們包含在區塊中時,可以將這些交易強加為下一個區塊中的必備項。 包含清單由區塊提交者的本地記憶體池(其自己知道的交易清單)產生,並在區塊被提交前送到其他節點。 若包含清單中缺少任何交易,區塊提交者可以選擇拒絕區塊、在提交前加上缺漏的交易,或者直接提交區塊(其他驗證者收到時會拒絕)。 這個理念還有一個潛在的更高效版本,它斷定建置者必須充分利用可用的區塊空間,如果不這樣做,交易將從提交者的包含清單中新增。 這個領域仍在積極研究當中,且包含清單的最佳化設定尚未確定。 [加密的記憶體池](https://www.youtube.com/watch?v=fHDjgFcha0M&list=PLpktWkixc1gUqkyc1-iE6TT0RWQTBJELe&index=3)也可以在區塊被廣播後,才讓建置者與提交者知道其打包進區塊的是哪些交易。 -有權勢的組織可以對驗證者施壓,以審查特定地址收發的交易。 為應對這一壓力,驗證者會偵測交易池中已加入黑名單的地址並將其從提交的區塊中刪除。 提交者-建置者分離之後,這已不再可能,因為區塊提交者不會知道他們在區塊中廣播的是哪些交易。 對於某些個人或應用程式來說,遵守審查規則可能很重要,例如當審查規則在其所在地區成為法律時。 在這些情況下,合規性發生在應用程式級別,同時協定仍然無需許可且不受審查。 +有權勢的組織可以對驗證者施壓,以審查特定地址收發的交易。 為應對這一壓力,驗證者會偵測交易池中已加入黑名單的地址並將其從提出的區塊中刪除。 提交者-建置者分離之後,這種情況不再可能出現,因為區塊提交者不會知道他們在區塊中廣播的是哪些交易。 對於某些個人或應用程式來說,遵守審查規則可能很重要,例如當審查規則在其所在地區成為法律時。 在這些情況下,合規性發生在應用程式級別,同時協定仍然無需許可且不受審查。 ## 提交者-建置者分離和最大可提取價值 {#pbs-and-mev} -**最大可提取價值 (MEV)** 指驗證者以對自己有利的方式排列交易順序,最大程度提高自己的收益。 常見的例子包括在去中心化交易所套利掉期(例如搶先進行大宗銷售或購買)或尋找清算去中心化金融倉位的機會。 最大程度提高最大可提取價值需要復雜的技術知識和附加到一般驗證者的客製化軟體,這使得機構營運者在最大可提取價值提取方面的表現更有可能優於個人和業餘愛好者驗證者。 這表示中心化營運者的質押收益可能更高,形成一股中心化力量,抑制個人質押。 +**最大可提取價值 (MEV)** 指驗證者以對自己有利的方式排列交易順序,最大程度提高自己的收益。 常見的例子包括在去中心化交易所套利掉期(例如搶先進行大宗銷售或購買)或尋找清算去中心化金融倉位的機會。 最大程度提高最大可提取價值需要高深的技術知識和附加到一般驗證者的客製化軟體,這使得機構營運者在最大可提取價值提取方面的表現更有可能優於個人和業餘愛好者驗證者。 這表示中心化營運者的質押收益可能更高,形成一股中心化力量,抑制個人質押。 提交者-建置者分離透過重新設定最大可提取價值的經濟性解決了這個問題。 區塊提交者不需要自己搜尋最大可提取價值,只需從區塊建置者提供的許多區塊中選擇一個即可。 複雜的最大可提取價值提取作業可能是區塊建置者完成的,但獎勵歸區塊提交者所有。 這表示即使一小部分專門的區塊建置者主導了最大可提取價值提取,獎勵可能歸網路上的任何驗證者所有,包括個人質押者。 -由於複雜的最大可提取價值策略提供更高的獎勵,個人可能會被質押池吸引,而不是自己單獨質押。 將區塊建置與區塊提交分離,表示提取的最大可提取價值會分散到更多驗證者,而非集中在最高效的最大可提取價值搜尋者手上。 同時,允許專業的區塊建置者存在,消除了個人的區塊建置負擔,也避免個人自己偷取最大可提取價值,同時最大化了可以檢查區塊是否誠實的個人獨立驗證者的數量。 「證明者-驗證者不對稱性」是一個重要的概念,指的是只要有強大且最大程度去中心化的驗證者網路能夠證明區塊是誠實的,中心化區塊生產就可以接受。 去中心化是一種方法,而非最終目標,我們需要的是誠實的區塊。 +由於複雜的最大可提取價值策略提供更高的獎勵,個人可能會被質押池吸引,而不是自己單獨質押。 將區塊建置與區塊提出分離,表示提取的最大可提取價值會分散到更多驗證者,而非集中在最高效的最大可提取價值搜尋者手上。 同時,允許專業的區塊建置者存在,消除了個人的區塊建置負擔,也避免個人自己偷取最大可提取價值,同時最大程度上增加了可以檢查區塊是否誠實的個人獨立驗證者的數量。 「證明者-驗證者不對稱性」是一個重要的概念,指的是只要有強大且最大程度去中心化的驗證者網路能夠證明區塊是誠實的,中心化區塊生產就可以接受。 去中心化是一種方法,而非最終目標,我們需要的是誠實的區塊。 ## 提交者-建置者分離及 Danksharding {#pbs-and-danksharding} -Danksharding 是以太坊擴容至每秒 >100,000 筆交易並最小化卷軸使用者費用的方法。 它依賴提交者-建置者分離,因為它增加了區塊建置者的工作量,它們需要在不到 1 秒的時間內運算高達 64 MB 卷軸資料的證明。 這可能需要專門的建置者,他們可以為該任務投入相當多的硬體。 然而,在目前的情況下,由於最大可提取價值提取,區塊建置可能會越來越集中到更複雜、更強大的營運者手中。 提交者-建置者分離是接受這一現實,防止其對區塊驗證(重要部分)或質押獎勵分配施加集中力量的一種方式。 一項巨大的附帶好處是,專門的區塊建置者也願意並且能夠計算 Danksharding 所需的資料證明。 +Danksharding 是以太坊擴容至每秒處理 >100,000 筆交易並最大限度降低卷軸使用者費用的方法。 它依賴提交者-建置者分離,因為它增加了區塊建置者的工作量,它們需要在不到 1 秒的時間內計算高達 64 MB 卷軸資料的證明。 這可能需要專門的建置者,他們可以為該任務投入相當多的硬體。 然而,在目前的情況下,由於最大可提取價值提取,區塊建置可能會越來越集中到更先進、更強大的營運商手中。 提交者-建置者分離是接受這一現實,防止其對區塊驗證(重要部分)或質押獎勵分配施加集中力量的一種方式。 一項巨大的附帶好處是,專門的區塊建置者也願意並且能夠計算 Danksharding 所需的資料證明。 ## 目前進度 {#current-progress} @@ -45,7 +45,7 @@ Danksharding 是以太坊擴容至每秒 >100,000 筆交易並最小化卷軸使 ## 延伸閱讀 {#further-reading} -- [研究現狀:提交者-建置者分離的抗審查能力](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) +- [研究現狀:提交者-建置者分離之下的抗審查性](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) - [適合提交者-建置者分離的收費市場設計](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) - [提交者-建置者分離及抗審查性](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Secondary-auctions) - [包含清單](https://notes.ethereum.org/@fradamt/H1ZqdtrBF) diff --git a/public/content/translations/zh-tw/roadmap/scaling/index.md b/public/content/translations/zh-tw/roadmap/scaling/index.md index 7c93a810e02..1386e988aa0 100644 --- a/public/content/translations/zh-tw/roadmap/scaling/index.md +++ b/public/content/translations/zh-tw/roadmap/scaling/index.md @@ -1,19 +1,19 @@ --- title: 以太坊擴容 -description: 卷軸可在鏈外批次處理交易,從而降低使用者的成本。 但現今卷軸使用資料的方式還是過於昂貴,限制了交易金額的下限。 Proto-Danksharding 可以解決這個問題。 +description: 卷軸可在鏈下批次處理交易,從而降低使用者的成本。 但現今卷軸使用資料的方式還是過於昂貴,限制了交易費用的下限。 Proto-Danksharding 可以解決這個問題。 lang: zh-tw image: /roadmap/roadmap-transactions.png alt: "以太坊開發藍圖" template: roadmap --- -以太坊利用[二層網路](/layer-2/#rollups)(也稱「卷軸」)實現擴容,可批次處理交易並將輸出傳送至以太坊。 儘管成本已比以太坊主網低八倍,卷軸還有進一步最佳化的空間,進而幫助降低最終使用者的成本。 此外,卷軸還仰賴於一些中心化組件,隨著其不斷發展成熟,開發者可以移除這些組件。 +以太坊利用[二層網路](/layer-2/#rollups)(也稱「卷軸」)實現擴容,可批次處理交易並將輸出傳送至以太坊。 儘管成本已比以太坊主網低八倍,卷軸還有進一步最佳化的空間,進而幫助降低終端使用者的成本。 此外,卷軸還仰賴於一些中心化組件,隨著其不斷發展成熟,開發者可以移除這些組件。
        • 現今卷軸的成本比以太坊一層網路便宜大約 3-8 倍
        • -
        • ZK 卷軸很快會讓費用降低大約 40-100 倍
        • -
        • 以太坊即將更動,會帶來大約 100-1000 倍的擴容
        • +
        • 零知識卷軸很快會讓費用降低大約 40-100 倍
        • +
        • 以太坊即將變更,會帶來大約 100-1000 倍的擴容
        • 使用者應該能夠從成本低於 $0.001 的交易中受益
        @@ -24,24 +24,24 @@ template: roadmap ### Proto-Danksharding {#proto-danksharding} -卷軸資料會永久儲存在以太坊上,成本非常高昂。 使用者為卷軸支付的交易費用中,超過 90% 都是花在資料儲存上。 為了降低交易費用,我們可以將資料移至新的「blob」(註:二進位大型物件)臨時儲存區。 Blob 更便宜,因為它們不是永久性的,一旦不再需要,就會從以太坊中刪除。 長期儲存卷軸資料成為需要它的人的責任,例如卷軸營運者、交易所、索引服務等。 將 blob 交易新增至以太坊是「Proto-Danksharding」升級的一部分。 我們預計這一功能很快(可能在 2023 年年底)會發佈。 +卷軸資料會永久儲存在以太坊上,成本非常高昂。 使用者為卷軸支付的交易費用中,超過 90% 都是花在資料儲存上。 為了降低交易費用,我們可以將資料移至新的「二進位大型物件」臨時儲存區。 二進位大型物件更便宜,因為它們不是永久性的,一旦不再需要,就會從以太坊中刪除。 長期儲存卷軸資料成為需要它的人的責任,例如卷軸營運者、交易所、索引服務等。 將二進位大型物件交易新增至以太坊是「Proto-Danksharding」升級的一部分。 我們預計這一功能很快(可能在 2023 年年底)會發佈。 -當 blob 交易透過「Proto-Danksharding」成為以太坊協定的一部分後,可以將多個 blob 新增至以太坊區塊。 這將是以太坊吞吐量的又一次大幅(>100 倍)擴容和交易成本的縮減。 +當二進位大型物件交易透過「Proto-Danksharding」成為以太坊協定的一部分後,可以將多個二進位大型物件新增至以太坊區塊。 這將是以太坊吞吐量的又一次大幅(>100 倍)擴容和交易成本的縮減。 ### Danksharding {#danksharding} -擴展 blob 資料的第二階段很複雜,因為需要新的方法來檢查網路上可用的卷軸資料,並仰賴驗證者將其區塊構建和區塊提案職責分開。 它還需要一種方法來以加密方式證明驗證者已驗證一小部分 blob 資料。 +擴展二進位大型物件資料的第二階段很複雜,因為需要新的方法來檢查網路上可用的卷軸資料,並仰賴驗證者將其區塊構建和區塊提案職責分開。 它還需要一種方法來以加密方式證明驗證者已驗證一小部分二進位大型物件資料。 -這個第二步也稱作[「Danksharding」](/roadmap/danksharding/), 全面實作可能還需要數年時間。 Danksharding 還需要仰賴其他的技術開發,例如[將區塊構建和區塊提案分開](/roadmap/pbs),以及新的網路設計,使得網路能夠透過一次隨機採樣幾千字節來有效地確認資料可用(也稱作[資料可用性採樣,簡稱 DAS](/developers/docs/data-availability))。 +這個第二步也稱作[「Danksharding」](/roadmap/danksharding/), 全面實作可能還需要數年時間。 Danksharding 還需要仰賴其他的技術開發,例如[將區塊建置和區塊提出分開](/roadmap/pbs),以及新的網路設計,使得網路能夠透過一次隨機採樣幾千字節來有效地確認資料可用(也稱作[資料可用性採樣 (DAS)](/developers/docs/data-availability))。 -有關分片的更多資訊 +更多分片相關資訊 ## 卷軸去中心化 {#decentralizing-rollups} -[卷軸](/layer-2)已在推動以太坊擴容。 憑藉[豐富的卷軸專案生態系統](https://l2beat.com/scaling/tvl),使用者可以在有安全保證的狀況下快速實惠地完成交易。 然而,一直以來卷軸都是使用中心化排序者(先完成所有交易處理和匯總,再將結果提交至以太坊的電腦)啟動的。 這讓審查制度變得十分脆弱,因為排序者營運者可能被制裁、賄賂或者做出其他讓步。 同時,[卷軸也會採取不同方式](https://l2beat.com)驗證傳入的資料。 最好的方法是「證明者」提交欺詐證明或有效性證明,但並非所有卷軸都已存在。 即使是確實使用有效性/欺詐證明的卷軸也只使用一小部分已知的證明者。 因此,以太坊擴容的下一個關鍵步驟就是將運行排序者和證明者的責任分配給更多人。 +[卷軸](/layer-2)已在推動以太坊擴容。 憑藉[豐富的卷軸專案生態系統](https://l2beat.com/scaling/tvl),使用者可以在有安全保證的狀況下快速實惠地完成交易。 然而,一直以來卷軸都是使用中心化排序者(先完成所有交易處理和匯總,再將結果提交至以太坊的電腦)啟動的。 這樣便容易受到審查,因為排序者營運商可能被制裁、賄賂或者做出其他讓步。 同時,[卷軸也會採取不同方式](https://l2beat.com)驗證傳入的資料。 最好的方法是「證明者」提交欺詐證明或有效性證明,但並非所有卷軸都已存在。 即使是確實使用有效性/欺詐證明的卷軸也只使用一小部分已知的證明者。 因此,以太坊擴容的下一個關鍵步驟就是將運行排序者和證明者的責任分配給更多人。 -關於卷軸的更多資訊 +更多卷軸相關資訊 ## 目前進度 {#current-progress} -Proto-Danksharding 可能是較早實作的開發藍圖專案之一。 設定它所需的去中心化計算步驟已在進行當中,有些用戶端已經實作處理 blob 資料的原型。 完整的 Danksharding 可能還需要幾年的時間,因為它要求先完成其他幾個開發藍圖專案。 卷軸基礎設施的去中心化可能是一個漸進的過程,有許多不同的卷軸正在構建略有不同的系統,並將以不同的速率完全去中心化。 +Proto-Danksharding 可能是較早實作的開發藍圖專案之一。 設定它所需的去中心化計算步驟已在進行當中,有些用戶端已經實作處理二進位大型物件資料的原型。 完整的 Danksharding 可能還需要幾年的時間實作,因為它要求先完成其他幾個開發藍圖專案。 卷軸基礎設施的去中心化可能是一個漸進的過程,有許多不同的卷軸正在構建略有不同的系統,並將以不同的速率完全去中心化。 diff --git a/public/content/translations/zh-tw/roadmap/secret-leader-election/index.md b/public/content/translations/zh-tw/roadmap/secret-leader-election/index.md index 248cc17d007..349c7a47658 100644 --- a/public/content/translations/zh-tw/roadmap/secret-leader-election/index.md +++ b/public/content/translations/zh-tw/roadmap/secret-leader-election/index.md @@ -5,39 +5,39 @@ lang: zh-tw summaryPoints: - 區塊提交者的 IP 地址可被預先獲知,這讓他們很容易遭受攻擊 - 秘密領導者選舉隱藏了驗證者的身分,使得他們無法被預先獲知 - - 這個想法的擴展是在每個時隙中隨機選擇驗證者。 + - 這個想法的延伸是在每個時隙中隨機選擇驗證者。 --- # 秘密領導者選舉 {#single-secret-leader-election} -在現在基於[權益證明](/developers/docs/consensus-mechanisms/pos)的共識機制下,接下來的區塊提交者清單是公開的,且可以對應他們的 IP 地址。 這表示攻擊者可識別哪些驗證者接下來應提交區塊,並瞄準他們發動阻斷服務 (DOS) 攻擊,使他們無法及時提交區塊。 +在現在基於[權益證明](/developers/docs/consensus-mechanisms/pos)的共識機制下,接下來的區塊提交者清單是公開的,且可以對應他們的 IP 地址。 這表示攻擊者可識別哪些驗證者接下來應提出區塊,並瞄準他們發動阻斷服務 (DOS) 攻擊,使他們無法及時提出區塊。 -這可能為攻擊者帶來獲利機會。 舉例來說,為時隙 `n+1` 選取的區塊提交者可以對時隙 `n` 中的提交者進行阻斷服務攻擊,這樣一來他們就會錯過提交區塊的機會。 這將允許攻擊區塊提交者提取兩個時隙的最大可提取價值,或者獲取本應拆分到兩個區塊的所有交易,並將它們全部包含在一個區塊中,從而獲得所有相關費用。 這對家庭驗證者的影響可能比複雜的機構驗證者更大,機構驗證者可以使用更先進的方法來保護自己免受阻斷服務攻擊,因此可能成為一股中心化力量。 +這可能為攻擊者帶來獲利機會。 舉例來說,為時隙 `n+1` 選取的區塊提交者可以對時隙 `n` 中的提交者進行阻斷服務攻擊,這樣一來他們就會錯過提出區塊的機會。 這樣,發動攻擊的區塊提交者可提取兩個時隙的最大可提取價值,或者獲取本應拆分到兩個區塊的所有交易,並將它們全部添加在一個區塊中,從而獲得所有相關費用。 這對家庭驗證者的影響可能比複雜的機構驗證者更大,機構驗證者可以使用更先進的方法來保護自己免受阻斷服務攻擊,因此可能成為一股中心化力量。 -有數種方式可以解決這個問題。 其中之一是[分散式驗證者技術](https://github.com/ethereum/distributed-validator-specs),其目標是將與運行驗證者相關的各種任務分散到多台機器上,並提供冗餘性,這樣攻擊者就更難阻止在特定時隙中提交區塊。 然而,最可靠的解決方式是**秘密單一領導者選舉 (SSLE)**。 +有數種方式可以解決這個問題。 其中之一是[分散式驗證者技術](https://github.com/ethereum/distributed-validator-specs),其目標是將與運行驗證者相關的各種任務分散到多台機器上,並提供冗餘性,這樣攻擊者就更難阻止在特定時隙中提出區塊。 然而,最可靠的解決方式是**秘密單一領導者選舉 (SSLE)**。 ## 秘密單一領導者選舉 {#secret-leader-election} -秘密單一領導者選舉採用巧妙的加密技術來確保只有選定的驗證者知道他們已被選中。 這是透過讓每個驗證者提交對他們共享的秘密的承諾實現的。 這些承諾被洗牌和重新設定,確保沒有人可以將承諾對應到驗證者,但每個驗證者都知道哪個承諾屬於他們。 接著,系統會隨機選擇一個承諾。 如果驗證者偵測到他們的承諾被選中,即知道輪到自己提交區塊。 +秘密單一領導者選舉採用巧妙的加密技術來確保只有選定的驗證者知道他們已被選中。 這是透過讓每個驗證者提交其對共享金鑰的承諾實現的。 這些承諾被打亂並重新設定,確保沒有人可以將承諾對應到驗證者,但每個驗證者都知道哪個承諾屬於他們。 接著,系統會隨機選擇一個承諾。 如果驗證者偵測到他們的承諾被選中,即知道輪到自己提出區塊。 這一想法的主要實作稱為 [Whisk](https://ethresear.ch/t/whisk-a-practical-shuffle-based-ssle-protocol-for-ethereum/11763)。 其運作方式如下: -1. 驗證者對共用的秘密做出承諾。 承諾方案被設計成可以與驗證者身分綁定,但也是隨機的,因此沒有第三方可以對綁定進行反向工程,並將特定承諾連結到特定驗證者。 -2. 在一個時期 (epoch) 開始時,使用 RANDAO 隨機選擇一組驗證者,以對 16,384 個驗證者的承諾進行抽樣。 -3. 在接下來的 8182 個時隙(一天)中,區塊提交者使用自己的私有熵對部分承諾進行洗牌和隨機化。 -4. 洗牌結束後,RANDAO 用於建立有序的承諾清單。 這個清單會映射到以太坊時隙。 -5. 驗證者看到他們的承諾被附加到特定的時隙,當該時隙到來時,驗證者就需要提交一個區塊。 +1. 驗證者對共用的金鑰做出承諾。 承諾方案被設計成可以與驗證者身分綁定,但也是隨機的,因此沒有第三方可以對綁定進行反向工程,並將特定承諾連結到特定驗證者。 +2. 在一個時期開始時,使用 RANDAO 隨機選擇一組驗證者,以對 16,384 個驗證者的承諾進行抽樣。 +3. 在接下來的 8182 個時隙(一天)中,區塊提交者使用自己的私密熵對打亂部分承諾並隨機化。 +4. 打亂作業結束後,RANDAO 用於建立有序的承諾清單。 這個清單會映射到以太坊時隙。 +5. 驗證者看到他們的承諾被附加到特定的時隙,當該時隙到來時,驗證者就需要提出一個區塊。 6. 重複這些步驟,以便承諾到時隙的分配始終遠遠領先於目前時隙。 -這樣可以防止攻擊者提前知道哪個特定驗證者將提交下一個區塊,以防範阻斷服務攻擊。 +這樣可以防止攻擊者提前知道哪個特定驗證者將提出下一個區塊,以防範阻斷服務攻擊。 ## 秘密非單一領導者選舉 (SnSLE) {#secret-non-single-leader-election} -還有一個旨在建立場景的單獨提案,其中每個驗證者都有隨機的機會在每個時隙中提交一個區塊,類似於工作量證明下區塊提案的決定方式,稱為**秘密非單一領導者選舉 (SnSLE)**。 一種簡單的方法是利用 RANDAO 函式來隨機選擇目前協定中的驗證者。 RANDO 的理念是,將許多獨立驗證者提交的雜湊值混合後,產生足夠隨機的數字。 在秘密非單一領導者選舉中,這些雜湊值可用於選擇下一個區塊提交者,例如選擇數值最低的雜湊值。 可以限制有效雜湊值的範圍,以調整每個時隙中單個驗證者被選中的可能性。 假設雜湊值必須低於 `2^256 * 5 / N`,其中 `N` = 活躍驗證者的數量,任何驗證者個體在時隙中被選中的機率應該為 `5/N`。 在這個例子中,至少一個提交者在每個時隙產生有效雜湊值的機率為 99.3%。 +還有一個旨在建立一種場景的單獨提案,其中每個驗證者都有隨機的機會在每個時隙中提出一個區塊,類似於工作量證明下區塊提出的決定方式,稱為**秘密非單一領導者選舉 (SnSLE)**。 一種簡單的方法是利用 RANDAO 函式來隨機選擇目前協定中的驗證者。 RANDO 的理念是,將許多獨立驗證者提交的雜湊值混合後,產生足夠隨機的數字。 在秘密非單一領導者選舉中,這些雜湊值可用於選擇下一個區塊提交者,例如選擇數值最低的雜湊值。 可以限制有效雜湊值的範圍,以調整每個時隙中單個驗證者被選中的可能性。 假設雜湊值必須低於 `2^256 * 5 / N`,其中 `N` = 活躍驗證者的數量,任何驗證者個體在時隙中被選中的幾率應該為 `5/N`。 在這個例子中,至少一個提交者在每個時隙產生有效雜湊值的幾率為 99.3%。 ## 目前進度 {#current-progress} -秘密單一領導者選舉與秘密非單一領導者選舉均處於研究階段。 這兩種理念都還沒有最終的規範。 秘密單一領導者選舉與秘密非單一領導者選舉是競爭關係,不能同時實作。 在發佈之前,我們需要投入更多時間在研發、原型設計及公共測試網實作上。 +秘密單一領導者選舉與秘密非單一領導者選舉均處於研究階段。 這兩種理念都還沒有最終的規範。 秘密單一領導者選舉與秘密非單一領導者選舉是競爭關係,不能同時實作。 在上線之前,我們需要在研發、原型設計及公共測試網實作上投入更多時間。 ## 了解更多 {#further-reading} diff --git a/public/content/translations/zh-tw/roadmap/security/index.md b/public/content/translations/zh-tw/roadmap/security/index.md index 977b2144276..7ba09463b55 100644 --- a/public/content/translations/zh-tw/roadmap/security/index.md +++ b/public/content/translations/zh-tw/roadmap/security/index.md @@ -13,21 +13,21 @@ template: roadmap ## 質押提款 {#staking-withdrawals} -從工作量證明到權益證明的升級始於以太坊先驅將他們的以太幣「質押」到存款合約中。 質押的以太幣用於保護網路安全, 但無法解套並退還給使用者。 權益證明升級的一個關鍵環節是,允許使用者取出以太幣。 提款是全功能權益證明協定的關鍵組成部分,除此之外,允許提款對以太坊的安全性也很有益,因為它允許質押者將以太幣獎勵用於其他非質押用途。 這意味著想要流動性的使用者不必依賴流動性質押衍生品 (LSD),以免加劇以太坊的中心化。 此次升級預計於 2023 年 4 月 12 日完成。 +從工作量證明到權益證明的升級始於以太坊先驅將他們的以太幣「質押」到存款合約中。 質押的以太幣用於保護網路安全, 但無法解鎖並退還給使用者。 權益證明升級的一個關鍵環節是,允許使用者取出以太幣。 提款是全功能權益證明協定的關鍵組成部分,除此之外,允許提款對以太坊的安全性也很有益,因為它允許質押者將以太幣獎勵用於其他非質押用途。 這意味著想要流動性的使用者不必依賴流動性質押衍生品 (LSD),以免加劇以太坊的中心化。 此次升級預計於 2023 年 4 月 12 日完成。 閱讀提款的相關資訊 ## 對抗攻擊 {#defending-against-attacks} -除新增提款功能外,我們還可以對以太坊[權益證明](/developers/docs/consensus-mechanisms/pos/)協定進行其他改進。 其中之一是 [view-merge](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739),這是一種更安全的分叉選擇演算法,可讓某些複雜類型的攻擊實作難度加大。 +除新增提款功能外,我們還可以對以太坊[權益證明](/developers/docs/consensus-mechanisms/pos/)協定進行其他改進。 其中之一是[視窗合併](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739),這是一種更安全的分叉選擇演算法,可讓某些複雜類型的攻擊實作難度加大。 -縮短以太坊最終化區塊所需的時間將帶來更好的使用者體驗,並防止複雜的「重組」攻擊,即攻擊者試圖重新洗牌最近的區塊以獲取利潤或審查某些交易。 [**單一時隙最終確定性 (SSF)**](/roadmap/single-slot-finality/) 是盡力縮短最終化延遲的一種方法。 目前,攻擊者理論上可以說服其他驗證者重新設定 15 分鐘的區塊。 採用單一時隙最終確定性時,這一數值將變為 0。 使用者(從個人至應用程式乃至交易所)都將受益於快速保證其交易不會被還原,消滅整個攻擊類別會讓網路受益。 +縮短以太坊最終確定區塊所需的時間將帶來更好的使用者體驗,並防止複雜的「重組」攻擊,即攻擊者試圖重新打亂最近的區塊以獲取利潤或審查某些交易。 [**單一時隙最終確定性 (SSF)**](/roadmap/single-slot-finality/) 是盡力縮短最終確定性延遲的一種方法。 目前,攻擊者理論上可以說服其他驗證者重新設定 15 分鐘的區塊。 採用單一時隙最終確定性時,這一數值將變為 0。 使用者(從個人至應用程式乃至交易所)都將受益於快速保證其交易不會被還原,消滅整個一類攻擊會讓網路受益。 閱讀單一時隙最終確定性的相關資訊 ## 對抗審查 {#defending-against-censorship} -去中心化可避免驗證者個人或小團體影響力過大。 新的質押技術有助於確保以太坊的驗證者盡可能保持去中心化,同時保護他們免遭硬體、軟體及網路故障。 這包括跨多個節點共擔驗證者職責的軟體, 被稱為**分散式驗證者技術 (DVT)**。 分散式驗證者技術允許多台電腦共同參與驗證,增強了冗餘性和容錯能力,所以質押池被鼓勵使用分散式驗證者技術。 它還將驗證者金鑰拆分到多個系統中,而不是讓單個操作員運行多個驗證者。 這使得不誠實的操作員更難協調對以太坊的攻擊。 總結來說,分散式驗證者技術的理念是以*群體*而非個體的方式運行驗證者,從而獲得安全優勢。 +去中心化可避免驗證者個人或小團體影響力過大。 新的質押技術有助於確保以太坊的驗證者盡可能保持去中心化,同時保護他們免遭硬體、軟體及網路故障。 這包括跨多個節點共擔驗證者職責的軟體, 被稱為**分散式驗證者技術 (DVT)**。 分散式驗證者技術允許多台電腦共同參與驗證,增強了冗餘性和容錯能力,所以鼓勵質押池使用分散式驗證者技術。 它還將驗證者金鑰拆分到多個系統中,而不是讓單個運營商執行多個驗證者。 這使得不誠實的運營商更難協調對以太坊的攻擊。 總結來說,分散式驗證者技術的理念是以_群體_而非個體的方式運行驗證者,從而獲得安全優勢。 閱讀分散式驗證者技術的相關資訊 @@ -39,10 +39,10 @@ template: roadmap ## 保護驗證者 {#protecting-validators} -經驗老道的攻擊者可能有辦法識別下一輪的驗證者,透過傳送垃圾訊息阻止他們提交區塊,這被稱為**阻斷服務 (DoS)** 攻擊。 實作[**秘密領導者選舉 (SLE)**](/roadmap/secret-leader-election) 可以阻止區塊提交者提前獲知區塊內容,從而防範此類攻擊。 其作用原理為:不斷變換代表候選區塊提交者的一組加密承諾,並使用其順序來確定驗證者,以便只有驗證者預先知道自己的順序。 +經驗老道的攻擊者可能有辦法識別下一輪的驗證者,透過傳送垃圾訊息阻止他們提出區塊,這稱為**阻斷服務 (DoS)** 攻擊。 實作[**秘密領導者選舉 (SLE)**](/roadmap/secret-leader-election) 可以阻止區塊提交者提前獲知區塊內容,從而防範此類攻擊。 其作用原理為:不斷變換代表候選區塊提交者的一組加密承諾,並使用其順序來確定驗證者,以便只有驗證者預先知道自己的順序。 閱讀秘密領導者選舉的相關資訊 ## 目前進度 {#current-progress} -以太坊開發藍圖上的安全升級正處於研究的後期階段,但預計一段時間內還不會實作。 至於 view-merge、提交者-建置者分離、單一時隙最終確定性和秘密領導者選舉,下一步是最終確定規範並開始建置原型。 +以太坊開發藍圖上的安全升級正處於研究的後期階段,但預計一段時間內還不會實作。 至於視窗合併、提交者-建置者分離、單一時隙最終確定性和秘密領導者選舉,下一步是最終確定規範並開始建置原型。 diff --git a/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md b/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md index 58647c5c8d3..28aa188aef2 100644 --- a/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md +++ b/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md @@ -14,51 +14,51 @@ lang: zh-tw ## 為什麼要提高最終確定的效率? {#why-aim-for-quicker-finality} -目前完成最終確定所需的時間過長。 大部分使用者不想為此等待 15 分鐘;對於可能需要高交易吞吐量的應用程式和交易所來說,必須等待那麼長時間才能確定其交易是永久性的,也很不方便。 區塊的提交和最終確定之間存在延遲也為短期重組帶來了機會,攻擊者可以利用它來審查某些區塊或提取最大可提取價值。 處理分階段升級區塊的機制也相當複雜,並且已經多次修補以消除安全漏洞,使其成為以太坊程式碼庫中更容易出現小錯誤的部分之一。 透過將最終確定耗費的時間縮短到單一時隙,可以消除這些問題。 +目前完成最終確定所需的時間過長。 大部分使用者不想為此等待 15 分鐘;對於可能需要高交易吞吐量的應用程式和交易所來說,必須等待那麼長時間才能確定其交易是永久性的,也很不方便。 區塊的提出和最終確定之間存在延遲也為短期重組帶來了機會,攻擊者可以利用它來審查某些區塊或提取最大可提取價值。 處理分階段升級區塊的機制也相當複雜,並且已經多次修補以消除安全漏洞,使其成為以太坊程式碼庫中更容易出現小錯誤的部分之一。 透過將最終確定耗費的時間縮短到單一時隙,可以消除這些問題。 -## 去中心化 / 時間 / 開銷的權衡 {#the-decentralization-time-overhead-tradeoff} +## 去中心化/時間/開銷的權衡 {#the-decentralization-time-overhead-tradeoff} 最終確定保證不是新區塊的直接屬性;完成新區塊的最終確定需要時間。 這是因為,至少要經過佔網路以太幣質押總量 2/3 的驗證者投票(「證明」)後,區塊才會被視為已最終確定。 網路上的每個驗證節點都必須處理來自其他節點的證明,才有辦法知道某個區塊是否達到 2/3 的閾值。 -完成最終確定的時間越短,每個節點所需的運算能力就必須越強,因為節點必須更快完成證明流程。 此外,網路上存在越多驗證節點,每個區塊要處理的證明也就越多,同時也提高了所需的處理能力。 需要的處理能力越高,可以參與網路的人就越少,因為運行驗證節點所需的硬體會更貴。 增加區塊間的延遲時間會降低節點所需的運算能力,但也會延長完成最終確定的時間,因為證明流程變得更慢了。 +完成最終確定的時間越短,每個節點所需的算力就必須越強,因為節點必須更快完成證明流程。 此外,網路上存在驗證節點越多,每個區塊要處理的證明也就越多,同時也提高了所需的處理能力。 需要的處理能力越高,可以參與網路的人就越少,因為運行驗證節點所需的硬體會更貴。 增加區塊間的延遲時間會降低節點所需的算力,但也會延長完成最終確定的時間,因為證明流程變得更慢了。 -因此,需要妥善權衡開銷(運算能力)、去中心化(可參與區塊鏈驗證的節點數)和完成最終確定所需的時間。 理想的系統應實現最佳平衡:運算能力最小化、去中心化程度最大化、完成最終確定耗費的時間最小化。 +因此,需要妥善權衡開銷(算力)、去中心化(可參與區塊鏈驗證的節點數)和完成最終確定所需的時間。 理想的系統應實現最佳平衡:算力最小化、去中心化程度最大化、完成最終確定耗費的時間最小化。 以太坊目前的共識機制以下列方式平衡了這三個參數: -- **將最小質押數量設為 32 個以太幣**。 這為各節點必須處理的驗證者證明數量設定了上限,因此每個節點的計算要求也有上限。 +- **將最小質押數量設為 32 以太幣**。 這為各節點必須處理的驗證者證明數量設定了上限,因此每個節點的計算要求也有上限。 - **將完成最終確定所需的時間設為約 15 分鐘**。 這給了在一般家用電腦上運行的驗證者足夠的時間,可以安全地處理每個區塊的證明。 在目前的共識機制下,如果要縮短完成最終確定的時間,必須減少網路上驗證者的數量或者提高硬體要求。 然而,可以對證明的處理方式進行改進,從而在不新增每個節點之開銷的情況下計算更多的證明。 更高效的處理可讓最終確定在一個時隙中完成,而不用跨越兩個時期。 ## 邁向單一時隙最終確定性的路徑 {#routes-to-ssf} - + -目前的共識機制結合了來自多個驗證者(又稱委員會)的證明,減少了每個驗證者驗證區塊時所需的訊息量。 每經過一個時期(32 個時隙),每個驗證者都有一次證明機會。但在每個時隙中,只有一小部分的驗證者(又稱「委員會」)可以證明。 他們透過分割成子網,並將幾位驗證者選為「匯總者」,實現這一點。 這些匯總者會將在子網中看到的、來自其他驗證者的所有簽名合併成單一的整合簽名。 包含最大數量個別貢獻的匯總者將其匯總簽名傳遞給區塊提交者,後者將其與其他委員會的匯總簽名一起包含在區塊中。 +目前的共識機制結合了來自多個驗證者(又稱委員會)的證明,減少了每個驗證者驗證區塊時所需的訊息量。 每經過一個時期(32 個時隙),每個驗證者都有一次證明機會。但在每個時隙中,只有一小部分的驗證者(又稱「委員會」)可以證明。 他們透過分割成子網,並將幾位驗證者選為「匯總者」,實現這一點。 這些匯總者會將在子網中看到的、來自其他驗證者的所有簽名合併成單一的匯總簽名。 包含最大數量個別貢獻的匯總者將其匯總簽名傳遞給區塊提交者,後者將其與其他委員會的匯總簽名一起包含在區塊中。 -這個流程為每個驗證者提供足夠的容量,使驗證者可以在每個時期投票,因為「32 個時隙 _ 64 個委員會 _ 每個委員會 256 個驗證者 = 每個時期 524,288 個驗證者」。 截至本文撰寫時止(2023 年 2 月),一共有大約 513,000 個活躍驗證者。 +這個流程為每個驗證者提供足夠的容量,使驗證者可以在每個時期投票,因為「32 個時隙 * 64 個委員會 * 每個委員會 256 個驗證者 = 每個時期 524,288 個驗證者」。 截至本文撰寫時止(2023 年 2 月),一共有大約 513,000 個活躍驗證者。 -在這個方案下,每個驗證者只能透過在整個時期分發證明來為一個區塊投票。 然而,有一些潛在的方式可以改進此機制,使得*每個驗證者在每個時隙都有證明機會*。 +在這個方案下,每個驗證者只能透過在整個時期分發證明來為一個區塊投票。 然而,有一些潛在的方式可以改進此機制,使得每個驗證者在每個時隙都有證明機會。 自以太坊共識機制推出以來,簽名匯總方案 (BLS) 的可擴容性比原先想像的要高得多,同時用戶端處理和驗證簽名的能力也已提高。 事實證明,驗證者在單一時隙中處理大量證明是可行的。 舉例來說,有一百萬個驗證者,每個驗證者在每個時隙投票兩次,且時隙時間調整為 16 秒,為了在一個時隙中處理一百萬個證明,節點需要至少以每秒 125,000 個的速度驗證匯總簽名。 實際上,一般電腦會花費大約 500 奈秒完成一個簽名驗證,表示 125,000 個驗證可以在約 62.5 毫秒內完成,遠低於 1 秒的閾值。 -若要進一步提高效率,可以建立超級委員會,如每個時隙隨機選擇 125,000 個驗證者。 只有這些驗證者可以對區塊進行投票,因此也只有這些驗證者可以決定區塊是否完成最終確定。 這是否為一個好主意,取決於社群認為成功攻擊以太坊的成本多高。 這是因為攻擊者不需要使用質押以太幣總數的 2/3,而是用*該超級委員會*所質押以太幣的 2/3 來最終確定不誠實的區塊。 這仍然是非常活躍的研究領域,但對於一個足夠大的驗證者集合來說,首先需要超級委員會,攻擊其中一個小組委員會的成本將非常高,這似乎是合理的(範例:使用以太幣計價的攻擊成本會是 `2/3 * 125,000 * 32 = ~2.6 million ETH`)。 攻擊的成本可以透過增加驗證者集合的大小(如調整驗證者大小,使攻擊成本為 100 萬個以太幣、400 萬個以太幣、1000 萬個以太幣)來調整。 以太坊社群[初步投票](https://youtu.be/ojBgyFl6-v4?t=755)似乎顯示 100~200 萬個以太幣是可能的攻擊成本,表示每個超級委員會約有 65,536 - 97,152 個驗證者。 +若要進一步提高效率,可以建立超級委員會,如每個時隙隨機選擇 125,000 個驗證者。 只有這些驗證者可以對區塊進行投票,因此也只有這些驗證者可以決定區塊是否完成最終確定。 這是否為一個好主意,取決於社群認為成功攻擊以太坊的成本有多高。 這是因為攻擊者不需要使用質押以太幣總數的 2/3,而是用_該超級委員會_所質押以太幣的 2/3 來最終確定不誠實的區塊。 這仍然是非常活躍的研究領域,但對於一個大到首先需要超級委員會的驗證者集合來說,攻擊其中一個小組委員會的成本將非常高,這似乎是合理的(範例:使用以太幣計價的攻擊成本會是 `2/3 * 125,000 * 32 = ~2.6 million ETH`)。 攻擊的成本可以透過增加驗證者集合的大小(如調整驗證者大小,使攻擊成本為 100 萬個以太幣、400 萬個以太幣、1000 萬個以太幣)來調整。 以太坊社群[初步投票](https://youtu.be/ojBgyFl6-v4?t=755)似乎顯示 100~200 萬個以太幣是可能的攻擊成本,表示每個超級委員會約有 65,536 - 97,152 個驗證者。 然而,真正的瓶頸並不是驗證,對驗證者節點來說,真正有挑戰性的是簽名匯總。 要擴容簽名匯總可能需要提高每個子網中的驗證者數量、增加子網數量或新增額外的匯總層(如實作委員會的委員會)。 解決辦法可能包括允許專門的匯總者 - 類似於如何在提交者-建置者分離 (PBS) 和 Danksharding 下,將區塊建置和卷軸資料產生承諾外包給專門的區塊建置者。 ## 分叉選擇規則在單一時隙最終確定性中扮演什麼角色? {#role-of-the-fork-choice-rule} -今日的共識機制依賴最終確定小工具(確定是否有 2/3 的驗證者已證明某一鏈的演算法)與分叉選擇規則(當有多個選項時決定哪一鍊是正確的演算法)之間的緊密耦合。 分叉選擇演算法僅考慮最後一個完成最終確定的區塊*之後*的區塊。 在單一時隙最終確定性下,分叉選擇規則不會考慮任何區塊,因為最終確定發生在與提交的區塊相同的時隙中。 這表示在單一時隙最終確定性下,*不論*分叉選擇演算法*或*最終確定小工具,隨時都將保持活躍。 最終確定小工具會最終確定有 2/3 的驗證者上線且誠實證明的區塊。 如果一個區塊無法超過 2/3 的閾值,則分叉選擇規則會啟動,以確定要跟隨哪條鏈。 這也為不活躍洩漏機制帶來了一個機會,可以在 >1/3 的驗證者離線時恢復區塊鏈,儘管仍有些細微差異。 +目前的共識機制依賴最終確定小工具(確定是否有 2/3 的驗證者已證明某一條鏈的演算法)與分叉選擇規則(當有多個選項時決定哪一條鍊是正確的演算法)之間的緊密耦合。 分叉選擇演算法僅考慮最後一個完成最終確定的區塊_之後_的區塊。 在單一時隙最終確定性下,分叉選擇規則不會考慮任何區塊,因為最終確定發生在與提出的區塊相同的時隙中。 這表示在單一時隙最終確定性下,_不論_分叉選擇演算法_或_最終確定小工具,隨時都將保持活躍。 最終確定小工具會最終確定有 2/3 的驗證者上線且誠實證明的區塊。 若一個區塊無法超過 2/3 的閾值,則分叉選擇規則會啟動,以確定要跟隨哪條鏈。 這也為不活躍洩漏機制帶來了一個機會,可以在 >1/3 的驗證者離線時恢復區塊鏈,儘管仍有些細微差異。 ## 未解決的問題 {#outstanding-issues} -透過增加每個子網的驗證者數量以擴容匯總的問題是,它會導致點對點網路上的負載增加。 增加匯總層的問題是,它對工程師來說非常複雜,而且會增加延遲(即區塊提交者可能需要更長的時間才能收到所有子網匯總者的訊息)。 即使使用 BLS 簽名匯總,也不清楚如何處理網路上的活躍驗證者數量多於每個時隙的實際處理能力的情況。 一種潛在的解決方法是,由於所有驗證者每個時隙都會證明,並且單一時隙最終確定性下沒有委員會,因此可以完全取消 32 個以太幣的有效餘額上限,這表示管理多個驗證者的營運者可以合併他們的質押以太幣並減少運行數量,減少驗證節點需要處理的訊息數量,以說明整個驗證者集合。 這需要大型質押者同意合併其驗證者。 也可以隨時對驗證者的數量或質押的以太幣總量設定固定上限。 然而,這需要一些機制來決定哪些驗證者可以參與,哪些不行,這很可能產生不必要的副作用。 +透過增加每個子網的驗證者數量以擴容匯總的問題是,它會導致對等網路上的負載增加。 新增匯總層的問題是,它對工程師來說非常複雜,而且會增加延遲(即區塊提交者可能需要更長的時間才能收到所有子網匯總者的訊息)。 即使使用 BLS 簽名匯總,也不清楚如何處理網路上的活躍驗證者數量多於每個時隙的實際處理能力的情況。 一種潛在的解決方法是,由於所有驗證者每個時隙都會證明,並且單一時隙最終確定性下沒有委員會,因此可以完全取消 32 個以太幣的有效餘額上限,這表示管理多個驗證者的營運商可以合併他們的質押以太幣並減少運行數量,減少驗證節點需要處理的訊息數量,以說明整個驗證者集合。 這需要大型質押者同意合併其驗證者。 也可以隨時對驗證者的數量或質押的以太幣總量設定固定上限。 然而,這需要一些機制來決定哪些驗證者可以參與,哪些不行,這很可能產生不必要的副作用。 ## 目前進度 {#current-progress} -單一時隙最終確定性目前處於研究階段, 預計幾年內都不會發佈,可能在 [Verkle 樹](/roadmap/verkle-trees/)、[Danksharding](/roadmap/danksharding]) 等其他重大升級發佈之後發佈。 +單一時隙最終確定性目前處於研究階段, 預計幾年內都不會上線,可能在[沃克爾尔樹](/roadmap/verkle-trees/)、[Danksharding](/roadmap/danksharding]) 等其他重大升級發佈之後發佈。 ## 了解更多 {#further-reading} diff --git a/public/content/translations/zh-tw/roadmap/statelessness/index.md b/public/content/translations/zh-tw/roadmap/statelessness/index.md index a60400047e3..0fdb74c0845 100644 --- a/public/content/translations/zh-tw/roadmap/statelessness/index.md +++ b/public/content/translations/zh-tw/roadmap/statelessness/index.md @@ -6,9 +6,9 @@ lang: zh-tw # 無狀態、狀態過期及歷史記錄過期 {#statelessness} -能在一般硬體上運行以太坊節點對實現真正的去中心化非常重要。 這是因為運行節點讓使用者可以透過獨立執行加密檢查來驗證資訊,而不是信任第三方為他們提供資料。 透過運行節點,使用者可以將交易直接提交到以太坊點對點網路,而不必信任中介。 如果只有擁有昂貴硬體的使用者能夠使用這些功能,去中心化不可能實現。 相反,節點對於處理和記憶體的要求應該非常適度,如此才能在行動電話、微型電腦或家用電腦上運行。 +能在一般硬體上運行以太坊節點對實現真正的去中心化非常重要。 這是因為運行節點讓使用者可以透過獨立執行加密檢查來驗證資訊,而不是信任第三方為他們提供資料。 透過運行節點,使用者可以將交易直接提交到以太坊對等網路,而不必信任中介。 如果只有擁有昂貴硬體的使用者能夠使用這些功能,去中心化不可能實現。 相反,節點對於處理和記憶體的要求應該非常適度,如此才能在行動電話、微型電腦或家用電腦上運行。 -現在,對於硬碟空間的高要求是妨礙節點存取普及化的主要障礙。 這主要是因為需要儲存大量以太坊狀態資料。 此狀態資料中包含處理新區塊和交易所需的關鍵資訊。 截至本文撰寫時止,推薦使用 2TB 的固態硬碟運行以太坊全節點。 對於不刪除任何舊資料的節點,儲存需求以每週大約 14GB 的速率成長,儲存自創世以來之所有資料的存檔節點已達到接近 12 TB(截至 2023 年 2 月本文撰寫時止)。 +現在,對於硬碟空間的高要求是妨礙節點存取普及化的主要障礙。 這主要是因為需要儲存大量以太坊狀態資料。 此狀態資料中包含處理新區塊和交易所需的關鍵資訊。 截至本文撰寫時止,推薦使用 2TB 的固態硬碟運行以太坊全節點。 對於不刪除任何舊資料的節點,儲存需求以每週大約 14GB 的速率增長,儲存自創世以來所有資料的存檔節點已達到接近 12 TB(截至 2023 年 2 月本文撰寫時止)。 便宜的硬碟可以用來儲存一些較舊的資料,但相較於新區塊的產生速度還是太慢了。 為用戶端保留目前的儲存模型,同時使資料儲存更便宜和容易只是暫時性的解決方案,只能解決一部分問題,因為以太坊的狀態資料增長速度是「無限的」,也就是說儲存需求只增不減,且技術進步必須持續跟上狀態資料增長的速度。 相反,用戶端必須找到新的方法來驗證區塊和交易,而不依賴從本地資料庫查詢資料。 @@ -16,7 +16,7 @@ lang: zh-tw 有幾種方法可以減少每個節點必須儲存的資料量,每種方法都要求對以太坊的核心協定進行不同程度的更新: -- **歷史記錄過期**:允許節點拋棄早於第 X 個區塊的狀態資料,但不改變以太坊用戶端處理狀態資料的方式。 +- **歷史記錄過期**:允許節點丟棄早於第 X 個區塊的狀態資料,但不改變以太坊用戶端處理狀態資料的方式。 - **狀態過期**:允許將不常用的狀態資料設定為不活動狀態。 用戶端可以忽略不活動的資料,直到其恢復為止。 - **弱無狀態**:只有區塊提交者需要存取完整的狀態資料,其他節點可以在沒有本地資料庫的情況下驗證區塊。 - **強無狀態**:所有節點都不需要存取完整的狀態資料。 @@ -25,13 +25,13 @@ lang: zh-tw ### 歷史記錄過期 {#history-expiry} -歷史記錄過期指用戶端刪除不太可能需要的舊資料,只儲存少量歷史資料,並在新資料到達時刪除舊資料。 節點之所以需要歷史資料,原因有二:同步和滿足資料請求。 最初,用戶端必須從初始區塊同步,驗證每個連續的區塊一直到鏈頭皆正確無誤。 如今,用戶端使用「弱主觀檢查點」來啟動到鏈頭。 這些檢查點是受信任的起始點,如同初始區塊接近現在,而非以太坊的最開始。 這表示用戶端可以刪除最近的弱主觀檢查點之前的所有資訊,不失去同步到鏈頭的能力。 目前,用戶端透過從本機資料庫取得歷史資料來滿足相關請求(透過 JSON-RPC 傳送)。 然而,隨著歷史記錄過期,如果請求的資料已被刪除,這將無法實現。 提供這些歷史資料也需要一些創新的解決方案。 +歷史記錄過期指用戶端刪除不太可能需要的舊資料,只儲存少量歷史資料,並在新資料到達時刪除舊資料。 節點之所以需要歷史資料,原因有二:同步和滿足資料請求。 最初,用戶端必須從初始區塊同步,驗證一直到鏈頭為止每個連續的區塊皆正確無誤。 如今,用戶端使用「弱主觀性檢查點」來啟動到鏈頭。 這些檢查點是受信任的起始點,如同初始區塊接近現在,而非以太坊的最開始。 這表示用戶端可以刪除最近的弱主觀性檢查點之前的所有資訊,不失去同步到鏈頭的能力。 目前,用戶端透過從本機資料庫取得歷史資料來滿足相關請求(透過 JSON-RPC 傳送)。 然而,隨著歷史記錄過期,如果請求的資料已被刪除,這將無法實現。 提供這些歷史資料也需要一些創新的解決方案。 -選項之一是用戶端透過門戶網路向對等節點請求歷史資料。 門戶網路是處於開發階段的點對點網路,用於提供歷史資料,其中每個節點儲存一小部分以太坊歷史記錄,整個歷史記錄分佈在整個網路。 滿足請求的方式是,尋找儲存有相應資料的對等節點,並向它們索取資料。 或者,由於請求存取歷史資料的通常是應用程式,因此儲存歷史資料可能變成它們的責任。 以太坊上有足夠多的利他主義者願意維護歷史資料存檔。 它可能會是一個用於管理歷史資料儲存檔的 DAO,理想情況下將是所有這些選項的組合。 這些提供者可以透過多種方式提供資料,例如透過 Torrent、FTP、Filecoin 或 IPFS。 +選項之一是用戶端透過門戶網路向對等節點請求歷史資料。 門戶網路是處於開發階段的對等網路,用於提供歷史資料,其中每個節點儲存一小部分以太坊歷史記錄,整個歷史記錄分佈在整個網路。 滿足請求的方式是,尋找儲存有相應資料的對等節點,並向它們索取資料。 或者,由於請求存取歷史資料的通常是應用程式,因此儲存歷史資料可能變成它們的責任。 以太坊上有足夠多的利他主義者願意維護歷史資料存檔。 這可能會是一個用於管理歷史資料儲存檔的去中心化自治組織,理想情況下將是所有這些選項的組合。 這些提供者可以透過多種方式提供資料,例如透過 Torrent、FTP、Filecoin 或星際檔案系統。 歷史記錄過期是有爭議的,因為截至目前,以太坊一直隱式保證歷史資料的可用性。 創世以來的完全同步始終可以作為標準,即使它依賴從快照重建一些較舊的資料。 歷史記錄過期將提供這種保證的責任轉移到以太坊核心協定之外。 如果中心化組織最終介入提供歷史資料,可能引發新的審查危機。 -EIP-4444 尚未準備好發佈,但正在積極討論當中。 有趣的是,EIP-4444 面臨的挑戰並不在於技術,而主要在於社群管理。 為了實現這一點,我們需要社群的支援,不僅包括協定,還包括儲存和提供來自可信實體的歷史資料的承諾。 +EIP-4444 尚未準備好上線,但正在積極討論當中。 有趣的是,EIP-4444 面臨的挑戰並不在於技術,而主要在於社群管理。 為了實現這一點,我們需要社群的支援,不僅包括協定,還包括可信實體對於歷史資料的儲存及提供方面的承諾。 這個升級並沒有從根本上改變以太坊節點處理狀態資料的方式,只是改變了歷史資料的存取方式。 @@ -44,15 +44,15 @@ EIP-4444 尚未準備好發佈,但正在積極討論當中。 有趣的是,E 依租金過期可以是直接向帳戶收取租金,以將其保留在活動狀態資料庫中。 依時間過期可以是從上次帳戶互動開始的倒數計時,也可以是所有帳戶的定期過期。 也可能存在將基於時間和基於租金的模型結合起來的機制,例如:若個人帳戶在基於時間的過期之前支付一些小額費用,則該等帳戶會持續處於活動狀態。 在狀態過期下,需要注意的是,不活動狀態**不會刪除**,只是與活動狀態分開儲存而已。 不活動狀態可以恢復為活動狀態。 -其作用原理可能是針對特定時間週期(可能約一年)建立狀態樹。 每個新的週期開始時,都建立全新的狀態樹。 只有目前的狀態樹可以修改,其他的狀態樹都不可變。 以太坊節點預計只會儲存目前的狀態樹和下一個最近的狀態樹。 這需要一種方法來為地址新增其存在的時間週期的時間戳。 有[幾種方式](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607)可以做到這點,但主要的選項要求[加長地址](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)以容納額外資訊,同時地址越長也越安全。 開發藍圖上,這個部分被稱為[地址空間擴展](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)。 +其作用原理可能是針對特定時間週期(可能約一年)建立狀態樹。 每個新的週期開始時,都建立全新的狀態樹。 只有目前的狀態樹可以修改,其他的狀態樹都不可變。 以太坊節點應儲存目前的狀態樹和下一個最近的狀態樹。 這需要一種方法來為地址新增其存在的時間週期的時間戳。 有[幾種方式](https://ethereum-magicians.org/t/types-of-resurrection-metadata-in-state-expiry/6607)可以做到這點,但主要方案需要[加長地址](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)以容納額外資訊,同時地址越長也越安全。 開發藍圖上,這個部分被稱為[地址空間擴展](https://ethereum-magicians.org/t/increasing-address-size-from-20-to-32-bytes/5485)。 -與歷史記錄過期相似,在狀態過期下,儲存舊資料的責任將從個人使用者端移除,並交棒給其他實體,如中心化提供者、利他的社群成員或更具未來性的去中心化解決方案(例如門戶網路)。 +與歷史記錄過期相似,在狀態過期下,儲存舊資料的責任將從個人使用者處卸去,並交棒給其他實體,如中心化提供者、利他的社群成員或更具未來性的去中心化解決方案(例如門戶網路)。 -狀態過期仍在研究階段,且尚未準備好發佈。 狀態過期很可能晚於無狀態用戶端和歷史記錄過期,因為這些升級使得大多數驗證者可以輕鬆管理大型狀態。 +狀態過期仍在研究階段,且尚未準備好上線。 狀態過期很可能晚於無狀態用戶端和歷史記錄過期,因為這些升級使得大多數驗證者可以輕鬆管理大型狀態。 ## 無狀態 {#statelessness} -無狀態這個詞有點用詞不當,因為它並不意味著「狀態」的概念被消除,但確實涉及以太坊節點對狀態資料的處理方式的改變。 無狀態本身有兩種類型:弱無狀態和強無狀態。 弱無狀態會將狀態儲存的職責交給少數節點,因此多數節點可以達到無狀態化。 強無狀態完全消除了所有節點儲存完整狀態資料的需求。 弱/強無狀態兩個都為一般驗證者提供了以下好處: +無狀態這個詞有點用詞不當,因為它並不意味著「狀態」的概念被消除,但確實涉及以太坊節點對狀態資料處理方式的改變。 無狀態本身有兩種類型:弱無狀態和強無狀態。 弱無狀態會將狀態儲存的職責交給少數節點,因此多數節點可以達到無狀態化。 強無狀態完全消除了所有節點儲存完整狀態資料的需求。 弱/強無狀態兩者都為一般驗證者提供了以下好處: - 接近即時的同步速度 - 不需按順序驗證區塊 @@ -62,32 +62,32 @@ EIP-4444 尚未準備好發佈,但正在積極討論當中。 有趣的是,E ### 弱無狀態 {#weak-statelessness} -弱無狀態涉及變更以太坊節點處理狀態資料的方式,但並沒有完全消除網路上所有節點的狀態儲存需求。 相反,弱無狀態將狀態儲存的責任交棒給了區塊提交者,而網路上的所有其他節點都會驗證區塊而不儲存完整的狀態資料。 +弱無狀態涉及變更以太坊節點處理狀態資料的方式,但並沒有完全消除網路上所有節點的狀態儲存需求。 但是,弱無狀態將狀態儲存的責任交棒給了區塊提交者,而網路上的所有其他節點都會驗證區塊而不儲存完整的狀態資料。 -**在弱無狀態中,提交區塊需要存取完整的狀態資料,但驗證區塊不需要狀態資料。** +**在弱無狀態中,提出區塊需要存取完整的狀態資料,但驗證區塊不需要狀態資料。** -為此,必須先在以太坊用戶端中實作 [Verkle 樹](/roadmap/verkle-trees)。 Verkle 樹是儲存以太坊狀態資料的替代資料結構,允許小型、固定大小的「證據」在節點間傳遞,並用於驗證區塊,而不是根據本地資料庫驗證區塊。 [提交者-建置者分離](/roadmap/pbs/)也是必要的,因為這讓區塊建置者成為有更強大硬體的特化節點,這些節點需要存取完整的狀態資料。 +為此,必須先在以太坊用戶端中實作[沃克爾樹](/roadmap/verkle-trees/)。 沃克爾樹是儲存以太坊狀態資料的替代資料結構,允許小型、固定大小的「證據」在節點間傳遞,並用於驗證區塊,而不是根據本地資料庫驗證區塊。 [提交者-建置者分離](/roadmap/pbs/)也是必要的,因為這讓區塊建置者成為有更強大硬體的特殊化節點,這些節點需要存取完整的狀態資料。 -無狀態依賴區塊建置者維護完整狀態資料的副本,這樣它們才能產生用於驗證區塊的證據。 其他節點不需要存取狀態資料,驗證區塊所需的所有資訊都可以從證據中取得。 這導致了這樣一種狀況:提交區塊的成本很高,但驗證區塊很便宜,表示較少的操作者會選擇運行區塊提交節點。 然而,只要盡可能多的參與者能夠獨立驗證其提交的區塊的有效性,區塊提交者的去中心化程度就不是非常重要。 +無狀態依賴區塊建置者維護完整狀態資料的副本,這樣它們才能產生用於驗證區塊的證據。 其他節點不需要存取狀態資料,驗證區塊所需的所有資訊都可以從證據中取得。 這導致了這樣一種狀況:提出區塊的成本很高,但驗證區塊很便宜,表示較少的運營商會選擇運行區塊提出節點。 然而,只要盡可能多的參與者能夠獨立驗證所提出區塊的有效性,區塊提交者的去中心化程度就不是非常重要。 閱讀關於 Dankrad 筆記的更多資訊 區塊提交者使用狀態資料來建立「證據」,即證明區塊中的交易正在更改的狀態值的最小資料集。 其他驗證者不儲存狀態,只儲存狀態根(整個狀態的的雜湊值)。 他們會接收區塊和證據,然後用其更新自己的狀態根。 這使得驗證節點的工作變得極輕量。 -弱無狀態正處於高階研究階段,但它依賴提交者-建置者分離策略和 Verkle 樹的實作,這樣小的證據才能在節點間傳遞。 這表示弱無狀態大概還要幾年才會在以太坊主網上發佈。 +弱無狀態正處於進階研究階段,但它依賴提交者-建置者分離策略和沃克爾樹的實作,因而小的證據才能在節點間傳遞。 這表示弱無狀態大概還要幾年才會在以太坊主網上發佈。 ### 強無狀態 {#strong-statelessness} -強無狀態消除了所有節點儲存狀態資料的需求。 取而代之的是,交易會和證據一起傳送,區塊建置者可以匯集這些證據。 接著,區塊生產者負責僅儲存為相關帳戶產生證據所需的狀態。 儲存狀態的責任幾乎完全交給使用者了,因為他們會傳送證據和「存取清單」以宣告他們在和哪些帳戶及儲存密鑰互動。 +強無狀態消除了所有區塊儲存狀態資料的需求。 取而代之的是,交易會和證據一起傳送,區塊建置者可以匯集這些證據。 接著,區塊生產者負責僅儲存為相關帳戶產生證據所需的狀態。 儲存狀態的責任幾乎完全交給使用者了,因為他們會傳送證據和「存取清單」以宣告他們在和哪些帳戶及儲存金鑰互動。 這會啟用極輕量節點,不過也需要權衡,因為這會使其與智慧型合約互動更加困難。 研究者已經研究過強無狀態,但目前預計其不會成為以太坊開發藍圖的一部分。比較可能的狀況是,弱無狀態對以太坊的擴容需求來說已經足夠。 ## 目前進度 {#current-progress} -弱無狀態、歷史記錄過期和狀態過期目前都處於研究階段,預計幾年後才會正式發佈。 我們並不保證所有提案都會實作,舉例來說,如果已經先實作狀態過期,可能就不需要再實作歷史記錄過期了。 還有其他開發藍圖事項(如 [Verkle 樹](/roadmap/verkle-trees)及[提交者-建置者分離](/roadmap/pbs))需要先行完成。 +弱無狀態、歷史記錄過期和狀態過期目前都處於研究階段,預計幾年後才會上線。 我們並不保證所有提案都會實作,舉例來說,如果已經先實作狀態過期,可能就不需要再實作歷史記錄過期了。 還有其他開發藍圖事項(如 [Verkle 樹](/roadmap/verkle-trees)及[提交者-建置者分離](/roadmap/pbs))需要先行完成。 ## 了解更多 {#further-reading} @@ -99,5 +99,5 @@ EIP-4444 尚未準備好發佈,但正在積極討論當中。 有趣的是,E - [Alex Stokes 談 EIP-4444](https://youtu.be/SfDC_qUZaos) - [為什麼轉換到無狀態很重要](https://dankradfeist.de/ethereum/2021/02/14/why-stateless.html) - [原始無狀態用戶端概念筆記](https://ethresear.ch/t/the-stateless-client-concept/172) -- [關於狀態過期的更多資訊](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) -- [關於狀態過期的更多詳細資訊](https://hackmd.io/@vbuterin/state_expiry_paths#Option-2-per-epoch-state-expiry) +- [更多狀態過期相關資訊](https://hackmd.io/@vbuterin/state_size_management#A-more-moderate-solution-state-expiry) +- [更多狀態過期的詳細資訊](https://hackmd.io/@vbuterin/state_expiry_paths#Option-2-per-epoch-state-expiry) diff --git a/public/content/translations/zh-tw/roadmap/user-experience/index.md b/public/content/translations/zh-tw/roadmap/user-experience/index.md index 85fd270af11..318dc41de35 100644 --- a/public/content/translations/zh-tw/roadmap/user-experience/index.md +++ b/public/content/translations/zh-tw/roadmap/user-experience/index.md @@ -1,6 +1,6 @@ --- title: 改善使用者體驗 -description: 對大部分人而言,使用以太坊仍然是非常複雜的一件事。 為了推動普及化,以太坊必須大幅降低使用門檻——使用者必須獲得去中心化、無需許可、抗審查存取以太坊的優勢,同時體驗必須與使用傳統 web2 應用程式一樣順暢。 +description: 對大部分人而言,使用以太坊仍然是非常複雜的一件事。 為了推動普及化,以太坊必須大幅降低使用門檻 — 使用者必須獲得去中心化、無需許可、抗審查存取以太坊的優勢,同時體驗必須與使用傳統 web2 應用程式一樣順暢。 lang: zh-tw image: /roadmap/roadmap-ux.png alt: "以太坊開發藍圖" @@ -11,26 +11,26 @@ template: roadmap ## 超越種子助記詞 {#no-more-seed-phrases} -以太坊帳戶由一對用於識別帳戶(公開金鑰)和簽名訊息(私密金鑰)的金鑰保護。 私密金鑰就像主密碼,允許使用者完整存取以太坊帳戶。 對於更熟悉銀行和代使用者管理帳戶之 Web2 應用程式的人來說,這是一種不同的操作方式。 若要讓以太坊在不依賴中心化第三方的情況下被大規模採用,必須為使用者提供一種簡單直接的順暢方式來管理資產並掌控自己的資料,而無需瞭解公開-私密金鑰加密及金鑰管理方面的知識。 +以太坊帳戶由一對用於識別帳戶(公開金鑰)和簽名訊息(私密金鑰)的金鑰保護。 私密金鑰就像主密碼,允許使用者完整存取以太坊帳戶。 對於更熟悉銀行和代使用者管理帳戶之 Web2 應用程式的人來說,這是一種不同的操作方式。 若要讓以太坊在不依賴中心化第三方的情況下被大規模採用,必須為使用者提供一種簡單、直接、順暢的方式來管理資產並掌控自己的資料,而無需瞭解公開-私密金鑰加密及金鑰管理方面的知識。 為解決此問題,可採取的辦法是使用智慧型合約錢包與以太坊互動。 智慧型合約錢包確立了金鑰丟失或被盜時保護帳戶的方法,提供更好地檢測和防禦欺詐的機會,並且允許為錢包新增功能。 儘管智慧型合約錢包目前已經存在,但其建構難度還很大,因為需要以太坊協定提供更好的支援。 此額外的支援稱為帳戶抽象。 -關於帳戶抽象的更多資訊 +更多帳戶抽象相關資訊 ## 所有人都能運行的節點 運行節點的使用者不必信任第三方為其提供資料,他們無需許可即可快速、私密地與以太坊區塊鏈互動。 然而,現在運行節點需要技術知識以及大量的磁碟空間,這意味著許多人必須信任中介。 -有些升級可以讓運行節點變得更加簡單,且不需消耗如此大量的資源。 儲存資料時將改為使用更節省空間的架構,稱為 **Verkle 樹**。 同時,透過[無狀態](/roadmap/statelessness)或[資料過期](/roadmap/statelessness/#data-expiry),以太坊節點無需儲存全部以太坊狀態資料的副本,從而大大減少硬碟空間需求。 [輕節點](/developers/docs/nodes-and-clients/light-clients/)將帶來運行全節點的許多好處,並且可以在行動電話或簡單的瀏覽器應用程式中輕鬆運行。 +有些升級可以讓運行節點變得更加簡單,且不需消耗如此大量的資源。 儲存資料時將改為使用更節省空間的架構,稱為**沃克爾樹**。 同時,透過[無狀態](/roadmap/statelessness)或[資料過期](/roadmap/statelessness/#data-expiry),以太坊節點無需儲存全部以太坊狀態資料的副本,從而大大減少硬碟空間需求。 [輕節點](/developers/docs/nodes-and-clients/light-clients/)將帶來運行全節點的許多好處,並且可以在行動電話或簡單的瀏覽器應用程式中輕鬆運行。 -閱讀 Verkle 樹的相關資訊 +閱讀沃克爾樹的相關資訊 透過這些升級,可以有效地將運行節點的障礙降低至零。 使用者無需許可即能安全存取以太坊,而不必犧牲電腦或行動電話上的大量磁碟或 CPU 空間,且使用應用程式時,不必仰賴第三方存取資料或是網路。 ## 目前進度 {#current-progress} -智慧型合約錢包早已可用,但需要更多升級才能讓它們盡可能去中心化及無需許可。 EIP-4337 是一項成熟的提案,無需對以太坊協定進行任何更動。 EIP-4337 所需的主要智慧型合約已於 2023 年 3 月部署。 +智慧型合約錢包早已可用,但需要更多升級才能讓它們盡可能去中心化及無需許可。 EIP-4337 是一項成熟的提案,無需對以太坊協定進行任何變更。 EIP-4337 所需的主要智慧型合約已於 2023 年 3 月部署。 -「完全無狀態」仍處於研究階段,距離實作可能還需幾年時間。 還需要完成幾個里程碑才能實現「完全無狀態」,包括可能更快實作的資料過期。 [Verkle 樹](/roadmap/verkle-trees/)及[提案者與構建者分離](/roadmap/pbs/)等其他開發藍圖事項需要先行完成。 +「完全無狀態」仍處於研究階段,距離實作可能還需幾年時間。 還需要完成幾個里程碑才能實現「完全無狀態」,包括可能更快實作的資料過期。 [沃克爾樹](/roadmap/verkle-trees/)及[提交者與建置者分離](/roadmap/pbs/)等其他開發藍圖事項需要先行完成。 -Verkle 樹測試網已經上線運行,下一階段為先在私密、後在公開的測試網上運行已啟用 Verkle 樹的用戶端。 將合約部署至測試網或是運行測試網用戶端有助加快進度。 +沃克爾樹測試網已經上線運行,下一階段為先在私密、後在公開的測試網上運行已啟用沃克爾樹的用戶端。 將合約部署至測試網或是運行測試網用戶端有助加快進度。 diff --git a/public/content/translations/zh-tw/roadmap/verkle-trees/index.md b/public/content/translations/zh-tw/roadmap/verkle-trees/index.md index 04386d35e4c..f8029990ab3 100644 --- a/public/content/translations/zh-tw/roadmap/verkle-trees/index.md +++ b/public/content/translations/zh-tw/roadmap/verkle-trees/index.md @@ -1,53 +1,53 @@ --- -title: Verkle 樹狀結構 -description: 關於 Verkle 樹及其將如何用於升級以太坊的簡要說明 +title: 沃克爾樹 +description: 關於沃克爾樹及其將如何用於升級以太坊的簡要說明 lang: zh-tw summaryPoints: - - 瞭解 Verkle 樹是什麼 + - 瞭解沃克爾樹是什麼 - 瞭解為什麼 Verkle 樹是以太坊的有用升級 --- -# Verkle 樹狀結構 {#verkle-trees} +# 沃克爾樹 {#verkle-trees} -Verkle 樹(「向量承諾」和「Merkle 樹」混合而成的詞)是一種資料結構,可用於升級以太坊節點,以便它們可以停止儲存大量狀態資料,同時保留驗證區塊的能力。 +沃克爾樹(「向量承諾」和「梅克爾樹」混合而成的詞)是一種資料結構,可用於升級以太坊節點,以便它們可以停止儲存大量狀態資料,同時保留驗證區塊的能力。 ## 無狀態 {#statelessness} -Verkle 樹是實現無狀態以太坊用戶端的關鍵一步。 驗證下一批區塊時,無狀態用戶端無需儲存全部的狀態資料。 無狀態用戶端不使用自己的本地以太坊狀態備份來驗證區塊,而是使用「證據」來證明區塊狀態資料的真實性。 證據是執行一組特定交易所需的各種狀態資料的集合,以及證明證據確實是完整資料一部分的加密證明。 請使用證據*而非*狀態資料庫。 要做到這一點,證據必須非常短,這樣才能安全地廣播到網路上,以便驗證者能在 12 秒的時隙內及時處理。 目前的狀態資料結構還不是很合用,因為證據太大。 Verkle 樹透過啟用小的證據並消除無狀態用戶端的主要障礙之一,來解決這個問題。 +沃克爾樹是實現無狀態以太坊用戶端的關鍵一步。 驗證下一批區塊時,無狀態用戶端無需儲存全部的狀態資料。 無狀態用戶端不使用自己的本地以太坊狀態備份來驗證區塊,而是使用「證據」來證明區塊狀態資料的真實性。 證據是執行一組特定交易所需的各種狀態資料的集合,以及證明證據確實是完整資料一部分的加密證明。 請使用證據_而非_狀態資料庫。 要做到這一點,證據必須非常短,這樣才能安全地廣播到網路上,以便驗證者能在 12 秒的時隙內及時處理。 目前的狀態資料結構還不是很合用,因為證據太大。 沃克爾樹透過啟用小證據,消除無狀態用戶端的主要障礙之一,從而解決這個問題。 -以太坊用戶端目前使用的是 Patricia Merkle 樹狀資料結構,用於儲存其自身的狀態資料。 有關個人帳戶的資訊作為葉子儲存在樹上,一對對的葉子被重複散列,直到只剩下一個散列。 串接在最末尾的雜湊值被稱為「根」。 為了驗證區塊,以太坊用戶端會執行區塊中的所有交易並更新其本地狀態樹。 若本地樹的「根」與區塊提交者提出的「根」完全相同,區塊即被視為有效。因為如果區塊提交者和驗證節點執行的計算中出現任何差異,都會導致根雜湊值完全不同。 這樣做的問題是,驗證區塊鏈需要每個用戶端儲存頭塊和多個歷史區塊的整個狀態樹(Geth 中預設保留頭塊後面 128 個區塊的狀態資料)。 因此用戶端需要存取大量磁碟空間,這是在廉價、低功耗硬體上運行完整節點的障礙。 解決這個問題的辦法是將狀態樹更新為更有效的結構(Verkle 樹),這種結構可以使用短小的「證據」對資料進行濃縮再分享,而無需保存完整的狀態資料。 將狀態資料重新格式化為 Merkle 樹,是邁向無狀態用戶端的第一步。 +以太坊用戶端目前使用帕特里夏梅克爾樹樹狀資料結構,儲存其自身的狀態資料。 有關個人帳戶的資訊作為葉子儲存在樹上,向一對對葉子重複進行雜湊運算,直到只剩下一個雜湊值。 串接在最末尾的雜湊值被稱為「根」。 為了驗證區塊,以太坊用戶端會執行區塊中的所有交易並更新其本地狀態樹。 若本地樹的「根」與區塊提交者提出的「根」完全相同,區塊即被視為有效。因為如果區塊提交者和驗證節點執行的計算中出現任何差異,都會導致根雜湊值完全不同。 這樣做的問題是,驗證區塊鏈需要每個用戶端儲存頭塊和多個歷史區塊的整個狀態樹(Geth 中預設保留頭塊後面 128 個區塊的狀態資料)。 因此用戶端需要存取大量磁碟空間,這是在廉價、低功耗硬體上運行完整節點的障礙。 解決這個問題的辦法是將狀態樹更新為更有效的結構(沃克爾樹),這種結構可以使用短小的「證據」對資料進行彙總再分享,而無需保存完整的狀態資料。 將狀態資料重新格式化為梅克爾樹,是邁向無狀態用戶端的第一步。 ## 什麼是證據以及我們為什麼需要證據? {#what-is-a-witness} -驗證區塊表示重新執行區塊中的交易,將變更套用到以太坊狀態樹,並計算新的根雜湊值。 區塊通過驗證是指其計算出的狀態根雜湊值與區塊中提供的值相同(因為這表示區塊提交者真的做了他們所說的運算)。 在現今的以太坊用戶端中,更新狀態需要存取整個狀態樹,狀態樹是必須儲存在本地的大型資料結構。 證據中僅包含執行區塊中交易所需的狀態資料片段。 然後,驗證者只能使用這些片段來驗證區塊提交者是否已執行區塊交易並正確更新狀態。 然而,這意味著證據需要在以太坊網路上的對等點之間足夠快地傳輸,以便每個節點能夠在 12 秒的時隙內安全地接收和處理。 如果證據太大,有些節點可能會在下載以及與鏈同步上花費大量時間。 這是中心化的力量,因為這表示只有擁有高速網路連接的節點可以參與驗證區塊。 使用 Verkle 樹時,無需將狀態儲存在硬碟上;驗證區塊所需的*全部*資訊都包含在區塊自身中。 不幸的是,Merkle 嘗試產生的證據太大,無法支援無狀態用戶端。 +驗證區塊表示重新執行區塊中的交易,將變更套用到以太坊狀態樹,並計算新的根雜湊值。 區塊通過驗證是指其計算出的狀態根雜湊值與區塊中提供的值相同(因為這表示區塊提交者確實執行了他們所說的計算)。 在現今的以太坊用戶端中,更新狀態需要存取整個狀態樹,狀態樹是必須儲存在本地的大型資料結構。 證據中僅包含執行區塊中交易所需的狀態資料片段。 然後,驗證者只能使用這些片段來驗證區塊提交者是否已執行區塊交易並正確更新狀態。 然而,這意味著證據需要在以太坊網路上的對等點之間足夠快地傳輸,以便每個節點能夠在 12 秒的時隙內安全地接收和處理。 如果證據太大,有些節點可能會在下載以及與鏈同步上花費大量時間。 這是一種中心化的力量,因為這表示只有擁有高速網路連接的節點可以參與驗證區塊。 使用沃克爾樹時,無需將狀態儲存在硬碟上;驗證區塊所需的_全部_資訊都包含在區塊自身中。 遺憾的是,梅克爾樹產生的證據太大,無法支援無狀態用戶端。 -## 為什麼 Verkle 樹可以支援更小的證據? {#why-do-verkle-trees-enable-smaller-witnesses} +## 為什麼沃克爾樹可以支援更小的證據? {#why-do-verkle-trees-enable-smaller-witnesses} -Merkle 樹的結構導致證據非常大,以至於無法在 12 秒的時隙內在節點之間安全地廣播。 這是因為證據是將儲存在葉子中 ​​ 的資料關聯到根雜湊值的路徑。 為了驗證資料,不僅需要擁有將每個葉子連接到根的所有中間雜湊值,還需要擁有所有「兄弟」節點。 證明中的每個節點都有一個兄弟節點,它與該兄弟節點一起做雜湊運算,以建立樹中的下一個雜湊值。 牽涉的資料量十分龐大。 Verkle 樹縮短了樹的葉子與其根之間的距離,並剔除了提供兄弟節點來驗證根雜湊值的必要性,因此縮減了證據的大小。 透過使用強大的多項式承諾方案而不是雜湊式向量承諾,可以獲得更高的空間效率。 多項式承諾允許證據保持固定大小,無論其證明的葉子數量如何。 +Merkle 樹的結構導致證據非常大,以至於無法在 12 秒的時隙內在節點之間安全地廣播。 這是因為證據是將儲存在葉子中​​的資料關聯到根雜湊值的路徑。 為了驗證資料,不僅需要擁有將每個葉子連接到根的所有中間雜湊值,還需要擁有所有「兄弟」節點。 證明中的每個節點都有一個兄弟節點,它與該兄弟節點一起做雜湊運算,以建立樹中的下一個雜湊值。 牽涉的資料量十分龐大。 沃克爾樹縮短了樹的葉子與根之間的距離,並無需提供兄弟節點來驗證根雜湊值,因此縮減了證據的大小。 透過使用強大的多項式承諾方案而不是雜湊式向量承諾,可以獲得更高的空間效率。 多項式承諾允許證據保持固定大小,無論其證明的葉子數量如何。 -在多項式承諾方案下,證據大小可管理,可以輕鬆地在點對點網路上傳輸。 這使得用戶端只需極少資料即可驗證每個區塊中的狀態變更。 +在多項式承諾方案下,證據大小可管理,可以輕鬆地在對等網路上傳輸。 這使得用戶端只需極少資料即可驗證每個區塊中的狀態變更。 - + -證據大小各有差異,取決於其所含的葉子數量。 假設證據覆蓋 1000 片葉子,Merkle 樹的證據大約是 3.5MB(假設樹有 7 層)。 相同資料且在 Verkle 樹(假設樹有 4 層)中的見證者大概是 150 kB - **小了約 23 倍**。Verkle 樹中相同資料的證據(假設樹有 4 層)大約為 150 kB,**大約小 23 倍**。 證據規模的減小將使無狀態用戶端證據的規模變得可以接受。 多項式證據的大小一般在 0.128 - 1kB 之間,取決於使用哪個特定多項式承諾。 +證據大小各有差異,取決於其所含的葉子數量。 假設證據有 1000 片葉子,梅克爾樹的證據大約是 3.5MB(假設樹有 7 層)。 相同資料的證據在沃克爾(假設樹有 4 層)中大概是 150 kB - **縮減了大約 23 倍**。 證據大小的縮減將使無狀態用戶端證據小到可以接受。 多項式證據的大小一般在 0.128 - 1kB 之間,取決於使用哪個特定多項式承諾。 -## Verkle 樹的結構為何? {#what-is-the-structure-of-a-verkle-tree} +## 沃克爾樹的結構為何? {#what-is-the-structure-of-a-verkle-tree} -Verkle 樹是 `(key,value)` 對,其中鍵是 32 字節位元組要素,由 31 字節位元組的*主幹*和單一字節位元組的*後綴*組成。 這些鍵被整理為*擴展*節點和*內部*節點。 擴展節點是單一的主幹,包含 256 個具有不同後綴的子節點。 內部節點也有 256 個子節點,但可以是其他擴展節點。 Verkle 樹和 Merkle 樹結構的主要區別是,Verkle 樹更加扁平,表示將葉子連接到根的中間節點較少,因此產生證明時所需的資料更少。 +Verkle 樹是 `(key,value)` 對,其中鍵是 32 字節位元組要素,由 31 字節位元組的_主幹_和單一字節位元組的_後綴_組成。 這些鍵被整理到_擴展_節點和_內部_節點中。 擴展節點是單一的主幹,包含 256 個具有不同後綴的子節點。 內部節點也有 256 個子節點,但可以是其他擴展節點。 沃克爾樹和梅克爾樹結構的主要區別是,沃克爾樹更加扁平,表示將葉子連接到根的中間節點較少,因此產生證明時所需的資料更少。 ![](./verkle.png) -[閱讀 Verkle 樹結構的更多相關資訊](https://blog.ethereum.org/2021/12/02/verkle-tree-structure) +[閱讀沃克爾樹結構的更多相關資訊](https://blog.ethereum.org/2021/12/02/verkle-tree-structure) ## 目前進度 {#current-progress} -Verkle 樹測試網已經啟動並運行,但用戶端仍需要進行大量更新以支援 Verkle 樹。 將合約部署至測試網或是運行測試網用戶端有助加快進度。 +沃克爾樹測試網已經啟動並運行,但用戶端仍需要進行大量更新以支援沃克爾樹。 將合約部署至測試網或是運行測試網用戶端有助加快進度。 [探索 Beverly Hills Verkle 測試網](https://beverlyhills.ethpandaops.io) @@ -55,11 +55,11 @@ Verkle 樹測試網已經啟動並運行,但用戶端仍需要進行大量更 ## 了解更多 {#further-reading} -- [Dankrad Feist 在 PEEPanEIP 上對 Verkle 樹的說明](https://www.youtube.com/watch?v=RGJOQHzg3UQ) -- [Guillaume Ballet 在 ETHGlobal 上對 Verkle 樹的說明](https://www.youtube.com/watch?v=f7bEtX3Z57o) -- [「Verkle 樹如何讓以太坊變得更加精幹而簡約」Guillaume Ballet 在 Devcon 6 發表的演講](https://www.youtube.com/watch?v=Q7rStTKwuYs) +- [Dankrad Feist 在 PEEPanEIP 上對沃克爾樹的說明](https://www.youtube.com/watch?v=RGJOQHzg3UQ) +- [Guillaume Ballet 在 ETHGlobal 上對沃克爾樹的說明](https://www.youtube.com/watch?v=f7bEtX3Z57o) +- [「沃克爾樹如何讓以太坊變得更加精幹而簡約」Guillaume Ballet 在 Devcon 6 發表的演講](https://www.youtube.com/watch?v=Q7rStTKwuYs) - [Piper Merriam 談 ETHDenver 2020 的無狀態用戶端](https://www.youtube.com/watch?v=0yiZJNciIJ4) -- [Dankrad Feist 在「零知識」播客上談 Verkle 樹和無狀態用戶端](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) -- [Vitalik Buterin 談 Verkle 樹](https://vitalik.eth.limo/general/2021/06/18/verkle.html) -- [Dankrad Feist 談 Verkle 樹](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) -- [EIP 文件:Verkle 樹](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) +- [Dankrad Feist 在「零知識」播客上談沃克爾樹和無狀態用戶端](https://zeroknowledge.fm/episode-202-stateless-ethereum-verkle-tries-with-dankrad-feist/) +- [Vitalik Buterin 談沃克爾樹](https://vitalik.ca/general/2021/06/18/verkle.html) +- [Dankrad Feist 談沃克爾樹](https://dankradfeist.de/ethereum/2021/06/18/verkle-trie-for-eth1.html) +- [以太坊改進提案文件:沃克爾樹](https://notes.ethereum.org/@vbuterin/verkle_tree_eip#Illustration) diff --git a/public/content/translations/zh-tw/security/index.md b/public/content/translations/zh-tw/security/index.md index 0a48251a412..67988f27af3 100644 --- a/public/content/translations/zh-tw/security/index.md +++ b/public/content/translations/zh-tw/security/index.md @@ -24,7 +24,7 @@ lang: zh-tw 強式密碼範例:ymv\*azu.EAC8eyp8umf ``` -另一個常見的錯誤是使用容易透過[社交工程]()猜中或發現的密碼。 在密碼中使用母親娘家姓、子女或寵物的名字或出生日期,都是不安全的做法,會增加密碼遭駭的風險。 +另一個常見的錯誤是使用容易透過[社交工程](https://wikipedia.org/wiki/Social_engineering_(security))猜中或發現的密碼。 在密碼中使用母親娘家姓、子女或寵物的名字或出生日期,都是不安全的做法,會增加密碼遭駭的風險。 #### 良好密碼實務: {#good-password-practices} @@ -270,7 +270,6 @@ _注意:有些衍生的代幣/行情指示器可能代表被質押的以太幣 ### 網路安全 {#reading-web-security} -- [不該以簡訊進行雙因素驗證的原因](https://www.theverge.com/2017/9/18/16328172/sms-two-factor-authentication-hack-password-bitcoin) - _The Verge_ - [高達 3 百萬台裝置被含有惡意軟體的 Chrome 與 Edge 附加元件所感染](https://arstechnica.com/information-technology/2020/12/up-to-3-million-devices-infected-by-malware-laced-chrome-and-edge-add-ons/) - _Dan Goodin_ - [如何建立一個永遠記得住的強式密碼](https://www.avg.com/en/signal/how-to-create-a-strong-password-that-you-wont-forget) - _AVG_ - [什麼是安全金鑰?](https://help.coinbase.com/en/coinbase/getting-started/verify-my-account/security-keys-faq) - _Coinbase_ @@ -278,7 +277,7 @@ _注意:有些衍生的代幣/行情指示器可能代表被質押的以太幣 ### 加密貨幣安全 {#reading-crypto-security} - [保護自己,保護資金](https://support.mycrypto.com/staying-safe/protecting-yourself-and-your-funds) - _MyCrypto_ -- [維持加密貨幣安全性的 4 種方式](https://www.coindesk.com/tech/2021/04/20/4-ways-to-stay-safe-in-crypto/) - _CoinDesk_ +- [幣圈通訊軟體之共同資安問題](https://docs.salusec.io/untitled/web3-penetration-test/risks-in-social-media) - _Salus_ - [全民必修安全指南](https://medium.com/mycrypto/mycryptos-security-guide-for-dummies-and-smart-people-too-ab178299c82e) - _MyCrypto_ - [加密貨幣安全性:密碼與驗證](https://www.youtube.com/watch?v=m8jlnZuV1i4) - _Andreas M. Antonopoulos_ diff --git a/public/content/translations/zh-tw/smart-contracts/index.md b/public/content/translations/zh-tw/smart-contracts/index.md index a1e7b71e7cc..c8fc0c4efd7 100644 --- a/public/content/translations/zh-tw/smart-contracts/index.md +++ b/public/content/translations/zh-tw/smart-contracts/index.md @@ -6,25 +6,25 @@ lang: zh-tw # 智慧型合約簡介 {#introduction-to-smart-contracts} -智慧型合約是以太坊應用層的基本構成要素。 這些合約是儲存在區塊鏈上的電腦程式,其跟從「條件式」的設計邏輯,且保證依程式碼所定義的規則來執行,程式碼一經建立即無法變更。 +智慧型合約是以太坊應用程式層的基本構成要素。 這些合約是儲存在區塊鏈上的電腦程式,其跟從「條件式」的設計邏輯,且保證依程式碼所定義的規則來執行,程式碼一經建立即無法變更。 Nick Szabo 率先提出「智慧型合約」一詞。 他在 1994 年撰寫了[這個概念](https://www.fon.hum.uva.nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo.best.vwh.net/smart.contracts.html),並在 1996 年撰寫了[《探索智慧型合約可以做什麼》](https://www.fon.hum.uva.nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo.best.vwh.net/smart_contracts_2.html)。 -Szabo 預見了一個無需可信的中介,即能以自動化加密安全流程實現交易和業務功能的數位拍賣市場。 以太坊上的智慧型合約讓此一願景付諸實踐。 +Szabo 設想了一種數位市場,無需透過可信的中介,即能以自動化、透過加密方法保障安全的流程實現交易和業務功能。 以太坊上的智慧型合約讓此一願景付諸實踐。 ## 傳統合約內的信任 {#trust-and-contracts} -傳統合約最大的問題之一是需要值得信賴的個人來監督合約執行結果。 +傳統合約最大的問題之一是需要可信的個人來監督合約執行結果。 例如: Alice 和 Bob 進行一場自行車比賽。 Alice 和 Bob 打賭 10 美金,賭她會鸁。 而 Bob 堅信自己會鸁得比賽,因此同意打賭。 結果,Alice 把 Bob 遠遠抛在身後,她顯然鸁了。 但 Bob 拒絕支付賭注,聲稱 Alice 一定是做弊。 -這個搞笑的範例說明了非智慧型協議會發生的問題。 即使已符合協議的條件(亦即,你是比賽的獲勝者),你還得相信對方會履行協議(也就是支付賭注)。 +這個搞笑的範例說明了非智慧型協議會發生的問題。 即使已符合協議的條件(即,你是比賽的獲勝者),你還得相信對方會履行協議(也就是支付賭注)。 ## 數位自動販賣機 {#vending-machine} -用簡單的比喻來說,智慧型合約就像一台自動販賣機,只要按下特定的按鍵,就保證會得到預先設定好的商品。 +用簡單的比喻來說,智慧型合約就像一台自動販賣機,只要提供特定的輸入,就保證會得到預先設定好的輸出。 - 你選擇一個商品 - 販賣機顯示價格 @@ -32,21 +32,21 @@ Alice 和 Bob 進行一場自行車比賽。 Alice 和 Bob 打賭 10 美金, - 販賣機確認你是否投入正確的金額 - 自動販賣機掉出你要的商品 -自動販賣機只在所有需求都符合時,才會掉出你想要的商品。 如果你沒選擇商品或是投入足額的錢,自動販賣機便不會掉出你要的商品。 +自動販賣機只在所有要求都符合時,才會掉出你想要的商品。 如果你沒有選擇商品或是投入足額的錢,自動販賣機便不會掉出你要的商品。 ## 自動執行 {#automation} -智慧型合約的主要好處在於當特定條件成立時,它便會確切執行非模糊的程式碼。 你不需要等真人來詮釋或協調結果。 這消除了可信中介的需求。 +智慧型合約的主要好處在於當特定條件成立時,它便會確定執行非模糊的程式碼。 你不需要等真人來詮釋或協調結果。 因此無需可信的中介。 例如,你可以撰寫為孩子代管資金的智慧型合約,讓他們過了特定日期後才能提領該資金。 如果他們想在到期日前提領資金,智慧型合約便不會執行。 你也可以撰寫一份智慧型合約,當你付錢給汽車經銷商後,合約便會自動發給你一張數位版的車輛所有權證明。 ## 可預測的結果 {#predictability} -傳統合約的模糊之處在於它們有賴於真人自行詮釋和履約。 舉例來說,兩名法官可能會對同一張合保持不同見解,這就造成判決不一致,繼而產生不同結果。 智慧型合約消除了這種可能性。 相反地,智慧型合約依合約程式碼內所寫條件準確執行。 準確的意思是指,只要提供相同的條件,智慧型合約就會產生相同的結果。 +傳統合約的模糊之處在於它們有賴於真人詮釋和履約。 舉例來說,兩名法官可能會對同一張合約保持不同見解,這就造成判決不一致,繼而產生不同結果。 智慧型合約消除了這種可能性。 相反地,智慧型合約完全依合約程式碼內所寫條件執行。 完全的意思是指,只要提供相同的條件,智慧型合約就會產生相同的結果。 ## 公開的記錄 {#public-record} -智慧型合約對於審計和追蹤也非常有用。 由於以太坊的智慧型合約寫在公共區塊鏈上,因此任何人都能立即追蹤資產的傳送和其他相關資訊。 舉例來說,你可以查閱某人是否把錢轉到你的地址了。 +智慧型合約對於審計和追蹤也非常有用。 由於以太坊的智慧型合約寫在公共區塊鏈上,因此任何人都能立即追蹤資產的轉移和其他相關資訊。 舉例來說,你可以查閱某人是否把錢轉到你的地址了。 ## 隱私保護 {#privacy-protection} @@ -54,7 +54,7 @@ Alice 和 Bob 進行一場自行車比賽。 Alice 和 Bob 打賭 10 美金, ## 公開可見的條款 {#visible-terms} -最後,如同傳統合約,你可以在簽名同意前檢查智慧型合約裡的內容,或與合約互動。 智慧型合約的透明度擔保每個人都可以審閱它。 +最後,如同傳統合約,你可以在簽名同意前檢查智慧型合約裡的內容,或與合約互動。 智慧型合約的透明度擔保每個人都可以審查它。 ## 智慧型合約使用案例 {#use-cases} diff --git a/public/content/translations/zh-tw/social-networks/index.md b/public/content/translations/zh-tw/social-networks/index.md index 48b65028e25..ffe7cee90b4 100644 --- a/public/content/translations/zh-tw/social-networks/index.md +++ b/public/content/translations/zh-tw/social-networks/index.md @@ -21,7 +21,7 @@ summaryPoint3: 代幣和非同質化代幣創造了將內容貨幣化的新方 ### 去中心化社交網路是如何運作的? {#decentralized-social-networks-overview} -去中心化社交網路是一種[去中心化應用程式 (dApp) ](/dapps/)——由部署在區塊鏈上的[智慧型合約](/developers/docs/smart-contracts/)提供支持的應用程式。 合約程式碼充當這些應用程式的後端並定義它們的業務邏輯。 +去中心化社交網路是一種[去中心化應用程式 (dApp) ](/dapps/)— 由部署在區塊鏈上的[智慧型合約](/developers/docs/smart-contracts/)提供支持的應用程式。 合約程式碼充當這些應用程式的後端並定義它們的業務邏輯。 傳統社交媒體平台依靠資料庫來儲存用戶資訊、程式碼和其他形式的資料。 但這會產生單點故障並帶來重大風險。 例如,去年 Facebook 的伺服器[離線數小時](https://www.npr.org/2021/10/05/1043211171/facebook-instagram-whatsapp-outage-business-impact),使得用戶與平台的連線中斷,引起了許多用戶抱怨。 @@ -39,7 +39,7 @@ summaryPoint3: 代幣和非同質化代幣創造了將內容貨幣化的新方 3. 去中心化社交網路取消了「中間人」。 內容創作者對其創作內容擁有直接所有權,他們直接與追隨者、粉絲、買家和其他各方互動,雙方之間僅有智慧型合約。 -4. 由於去中心化應用程式在以太坊網路上運作,而該網路是由全球 P2P 節點網路所維持,因此去中心化社交網路不太容易受到伺服器停機和中斷的影響。 +4. 由於去中心化應用程式在以太坊網路上運作,而該網路是由全球對等節點網路所維持,因此去中心化社交網路不太容易受到伺服器停機和中斷的影響。 5. 去中心化社交平台透過非同質化代幣 (NFT)、應用程式內加密貨幣支付等,為內容創作者提供更好的貨幣化框架。 @@ -61,11 +61,11 @@ summaryPoint3: 代幣和非同質化代幣創造了將內容貨幣化的新方 [Mirror](https://mirror.xyz/) 是一個支援 web3 的寫作平台,旨在實現去中心化和為使用者所擁有。 使用者只需連接錢包即可在 Mirror 上免費閲讀和寫作。 使用者還可以收集寫作作品並訂閱他們喜歡的作者。 -在 Mirror 上發布的文章會永久儲存在去中心化存儲平台 Arweave 上,並且可以鑄造為可收集的[非同質化代幣 (NFT)](/nft/),也稱為寫作非同質化代幣。 鑄造寫作非同質化代幣對作者來說是完全免費的,並且收集發生在以太坊二層網路上——使交易變得便宜、快速且環保。 +在 Mirror 上發布的文章會永久儲存在去中心化儲存平台 Arweave 上,並且可以鑄造為可收集的[非同質化代幣 (NFT)](/nft/),也稱為寫作非同質化代幣。 鑄造寫作非同質化代幣對作者來說是完全免費的,並且收集發生在以太坊二層網路上——使交易變得便宜、快速且環保。 ### MINDS {#minds} -[MINDS](https://www.minds.com/) 是最常用的去中心化社交網絡之一。 它的運作方式與 Facebook 類似,並且已經吸引了數百萬使用者。 +[MINDS](https://www.minds.com/) 是最常用的去中心化社交網路之一。 它的運作方式與 Facebook 類似,並且已經吸引了數百萬使用者。 使用者使用平台的原生 ERC-20 代幣 $MIND 來支付物品價格。 使用者還可以透過發布熱門內容、為生態系統做出貢獻以及將其他人推薦給平台來賺取 $MIND 代幣。 @@ -92,7 +92,7 @@ Reddit 擁有[回饋式社群積分](https://cointelegraph.com/news/reddit-to-re ## 使用去中心化社交網路 {#use-decentralized-social-networks} - **[Status.im](https://status.im/)** - _Status 是安全的訊息傳遞應用程式,使用開放程式碼、點對點協議和端到端加密來保護你的訊息免受第三方的侵害。_ -- **[Mirror.xyz](https://mirror.xyz/)** - _M irror 是一個基於以太坊構建的使用者擁有的去中心化發布平台,供使用者眾籌創意、將內容貨幣化並建立高價值社群。_ +- **[Mirror.xyz](https://mirror.xyz/)** - _Mirror 是一個基於以太坊構建的使用者擁有的去中心化發布平台,供使用者眾籌創意、將內容貨幣化並建立高價值社群。_ - **[Lens Protocol](https://lens.xyz/)** - _Lens Protocol 是一個可組合和去中心化的社交圖譜,可幫助創作者在去中心化網際網路的數位花園中的任何地方擁有自己的內容。_ - **[Farcaster](https://farcaster.xyz/)** - _Farcaster 是一個充分去中心化的社交網路。 它是個支持多種用戶端的開放式協議,如電子郵件。_ @@ -106,7 +106,7 @@ Reddit 擁有[回饋式社群積分](https://cointelegraph.com/news/reddit-to-re - [區塊鏈社交媒體發展形勢概覽](https://www.gemini.com/cryptopedia/blockchain-social-media-decentralized-social-media) — _Gemini Cryptopedia_ - [區塊鏈如何解決社交媒體隱私問題](https://www.investopedia.com/news/ethereum-blockchain-social-media-privacy-problem-linkedin-indorse/) — _Prableen Bajpai_ - [社交媒體網路正在進入區塊鏈](https://businesstechguides.co/what-are-decentralized-social-networks) — _Emmanuel Awosika_ -- [社交網絡的充分去中心化](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _Varun Srinivasan_ +- [社交網路的充分去中心化](https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks) — _Varun Srinivasan_ ### 影片 {#videos} diff --git a/public/content/translations/zh-tw/staking/dvt/index.md b/public/content/translations/zh-tw/staking/dvt/index.md index af650a561a0..fdf1c52ad10 100644 --- a/public/content/translations/zh-tw/staking/dvt/index.md +++ b/public/content/translations/zh-tw/staking/dvt/index.md @@ -8,7 +8,7 @@ lang: zh-tw 分散式驗證者技術 (DVT) 是一種驗證者安全保障方法,可將金鑰管理和簽名職責分散到多方,從而減少單點故障並提高驗證者的彈性。 -它將用於保護驗證者的**私密金鑰分散**至組成一個「叢集」的**許多計算機**,以實現安全保障目的。 此方法的好處在於它讓攻擊者非常難以存取金鑰,因為金鑰並沒有完整存儲在任何一台機器上。 它還允許某些節點離線,因為必要的簽名可以由每個叢集中的一部分機器完成。 這減少了網路的單點故障,並使整個驗證者群更加可靠。 +它將用於保護驗證者的**私密金鑰分散**至組成一個「叢集」的**許多計算機**,以實現安全保障目的。 此方法的好處在於它讓攻擊者非常難以存取金鑰,因為金鑰並沒有完整儲存在任何一台機器上。 它還允許某些節點離線,因為必要的簽名可以由每個叢集中的一部分機器完成。 這減少了網路的單點故障,並使整個驗證者群更加可靠。 ![示意圖展示單個驗證者金鑰如何拆分成金鑰分片,並分散到多個具有不同組件的節點。](./dvt-cluster.png) @@ -16,9 +16,9 @@ lang: zh-tw ### 安全性 {#security} -驗證者生成兩對公私金鑰:驗證者金鑰用於參與共識,提款金鑰則用於存取資金。 雖然驗證者可以保護冷存儲中的提款金鑰,但驗證者金鑰必須 24 小時連網。 如果驗證者私密金鑰被洩露,攻擊者可以控制驗證者,從而可能導致質押者的以太幣被罰沒或遺失。 分散式驗證者技術可以幫助降低此風險。 詳情如下: +驗證者生成兩對公私金鑰:驗證者金鑰用於參與共識,提款金鑰則用於存取資金。 雖然驗證者可以保護冷儲存中的提款金鑰,但驗證者金鑰必須 24 小時連網。 如果驗證者私密金鑰外洩,攻擊者可以控制驗證者,從而可能導致質押者的以太幣遭罰沒或遺失。 分散式驗證者技術可以幫助降低此風險。 詳情如下: -透過分散式驗證者技術,質押者可以參與質押,同時冷存儲驗證者私密金鑰。 這透過加密原始的完整驗證者金鑰,然後將其分割為金鑰分片來實現。 金鑰分片存儲在線上並分發給多個節點,使驗證者可以進行分散式操作。 這是可以實現的,因為以太坊驗證者使用可附加的 BLS 簽名,這意味著可以透過將其組成部分相加以重建完整金鑰。 這使質押者能夠安全地離線保存完整、原始的「主要」驗證者金鑰。 +透過分散式驗證者技術,質押者可以參與質押,同時冷儲存驗證者私密金鑰。 這透過加密原始的完整驗證者金鑰,然後將其分割為金鑰分片來實現。 金鑰分片儲存在線上並分發給多個節點,使驗證者可以進行分散式操作。 這是可以實現的,因為以太坊驗證者使用可附加的 BLS 簽名,這意味著可以透過將其組成部分相加以重建完整金鑰。 這使質押者能夠安全地離線保存完整、原始的「主要」驗證者金鑰。 ### 無單點錯誤 {#no-single-point-of-failure} @@ -46,7 +46,7 @@ lang: zh-tw 分散式驗證者技術解決方案包含以下組成部分: -- **[Shamir 金鑰分享算法](https://medium.com/@keylesstech/a-beginners-guide-to-shamir-s-secret-sharing-e864efbf3648)** - 驗證者使用 [BLS 金鑰](https://en.wikipedia.org/wiki/BLS_digital_signature) 各 BLS「金鑰分片」(「金鑰分片」)可以組合成一個聚合金鑰(簽名)。 在分散式驗證者技術中,驗證者的私密金鑰是叢集中每個營運商的組合 BLS 簽名。 +- **[Shamir 私鑰分享算法](https://medium.com/@keylesstech/a-beginners-guide-to-shamir-s-secret-sharing-e864efbf3648)** - 驗證者使用 [BLS 金鑰](https://en.wikipedia.org/wiki/BLS_digital_signature) 各 BLS「金鑰分片」(「金鑰分片」)可以組合成一個聚合金鑰(簽名)。 在分散式驗證者技術中,驗證者的私密金鑰是叢集中每個營運商的組合 BLS 簽名。 - **[閾值簽名方案](https://medium.com/nethermind-eth/threshold-signature-schemes-36f40bc42aca)** - 確定簽名職責所需的單個金鑰分片數,例如:4 個中需要 3 個。 - **[分佈式金鑰生成 (DKG) 協議](https://medium.com/toruslabs/what-distributed-key-generation-is-866adc79620)** - 一種加密過程,用於生成金鑰分片,並將現有或新的驗證者金鑰分片分發給叢集中的節點。 - **[多方計算 (MPC)](https://messari.io/report/applying-multiparty-computation-to-the-world-of-blockchains)** - 完整的驗證者金鑰使用多方計算秘密生成。 任何單獨營運商都不知道完整的金鑰—他們只知道自己的部分(他們的「分片」)。 @@ -76,11 +76,11 @@ lang: zh-tw 藉由分散式驗證者技術,顯著降低了需要對營運商應有的信任。 **質押池讓營運商擁有質押,而無需託管驗證者金鑰**(因僅使用金鑰分片)。 分散式驗證者技術還允許將質押分散至更多營運商(例如:讓這些驗證者由多位營運商共同運行,而不是讓單個營運商管理 1000 個驗證者)。 多樣的營運商設置可確保當一個營運商故障時,其他營運商仍可驗證交易。 這提高了冗余和多樣性,從而提升了性能和彈性,同時最大限度地提高了酬勞。 -最小化單一營運信任的另一個好處是,質押池可以促進更開放的營運商參與,且無需許可。 這樣,服務商可以通過使用精選且無需許可的營運商(例如,將家庭質押人或更多小型質押人者與大型質押人配對)來降低其風險,並支持以太坊的去中心化。 +最小化單一營運信任的另一個好處是,質押池可以促進更開放的營運商參與,且無需許可。 如此一來,服務商可以使用精選且無需許可的營運商(例如,將家庭質押者或更多小型質押者與大型質押者配對)來降低其風險,並支援以太坊的去中心化。 ## 使用分散式驗證者技術的潛在弊端 {#potential-drawbacks-of-using-dvt} -- **額外組成部分** - 引入分散式驗證者技術節點會增加一個部分,該部分可能存在故障或漏洞。 要緩解這一問題,一種方法是爭取實現多個分散式驗證者技術節點,也就是多個分散式驗證者技術用戶端(類似於共識層和執行層有多個用戶端的情況)。 +- **額外組成部分** - 引入分散式驗證者技術節點會增加一個部分,該部分可能存在故障或漏洞。 要緩解此問題,一種方法是爭取實現多個分散式驗證者技術節點,也就是多個分散式驗證者技術用戶端(類似於共識層和執行層有多個用戶端的情況)。 - **營運成本** - 由於分散式驗證者技術將驗證者分佈至多個參與方,因此需要更多的節點進行操作,而不是只有一個節點,這就增加了營運成本。 - **可能會增加延遲** - 因為分散式驗證者技術利用共識協議在多個運行驗證者的節點之間達成共識,這可能會增加延遲。 diff --git a/public/content/translations/zh-tw/staking/pools/index.md b/public/content/translations/zh-tw/staking/pools/index.md index a9330c05113..a95981c8a51 100644 --- a/public/content/translations/zh-tw/staking/pools/index.md +++ b/public/content/translations/zh-tw/staking/pools/index.md @@ -15,7 +15,7 @@ summaryPoints: ## 什麼是質押礦池 {#what-are-staking-pools} -質押礦池是一種協作方式,允許擁有少量以太幣的人能夠滿足 32 個以太幣這一條件,以激活一組驗證者金鑰。 由於協定本身並不支援聯合質押這項功能,因此需要單獨建立解決方案來滿足此需求。 +質押礦池是一種協作方式,允許擁有少量以太幣的人能夠滿足 32 個以太幣此一條件,以啟動一組驗證者金鑰。 由於協定本身並不支援聯合質押這項功能,因此需要單獨建立解決方案來滿足此需求。 一些礦池使用智慧型合約運作,可以將資金存入合約,由合約以去信任的方式管理和追蹤你的質押品,並向你發放相應價值的代幣。 其他礦池可能不涉及智慧型合約,而是在鏈外調解。 @@ -35,9 +35,9 @@ summaryPoints: 以太坊協定本身並不支援聯合質押或委託質押,但考量到想要質押的以太幣不足 32 個的使用者的需求,越來越多的解決方案已經開始建立。 -每個質押池和工具,或者它們所用的智慧型合約,均由不同的團隊建立,因此有著各自的好處和風險。 質押池能夠將使用者的以太幣換成一種相應的以太幣質押代幣。 此代幣非常有用,因為它允許用戶將任意數量的以太幣兌換成等值的有收益代幣(反之亦然),流動性質押衍生品由質押在去中心化交易所的以太幣產生收益,即使實際的以太幣是質押在共識層上。 這意味著可以在有收益的質押以太幣產品和“原始以太幣”之間快速、簡單地切換,且適用的以太幣數不僅限於 32 的倍數。 +每個質押池和工具,或者它們所用的智慧型合約,均由不同的團隊建立,因此有著各自的好處和風險。 質押池能夠將使用者的以太幣換成一種相應的以太幣質押代幣。 此代幣非常有用,因為它允許使用者將任意數量的以太幣兌換成等值的有收益代幣(反之亦然),流動性質押衍生品由質押在去中心化交易所的以太幣產生收益,即使實際的以太幣質押在共識層上。 這意味著可以在有收益的質押以太幣產品和「原始以太幣」之間快速、簡單地切換,且適用的以太幣數不僅限於 32 的倍數。 -然而,這些質押以太幣代幣往往會產生類卡特爾的行為,大量質押的以太幣最終會受到少數中心化組織的控制,而不是分散到大量獨立個體中。 這為審查或價值提取創造了條件。 質押的黃金標準應始終是個人盡可能在自己的硬件上運行驗證者。 +然而,這些質押以太幣代幣往往會產生類卡特爾的行為,大量質押的以太幣最終會受到少數中心化組織的控制,而不是分散到大量獨立個體中。 這為審查或價值提取創造了條件。 質押的黃金標準應始終是個人盡可能在自己的硬體上運行驗證者。 [更多關於質押代幣風險的資訊](https://notes.ethereum.org/@djrtwo/risks-of-lsd)。 @@ -53,14 +53,14 @@ summaryPoints: -請注意,仔細選擇具有[用戶端多樣性](/developers/docs/nodes-and-clients/client-diversity/)的服務相當重要,因為它可以提高網路的安全性並降低你的風險。 如果某服務可以證明它會限制主流用戶端的使用,則稱它具有「執行層用戶端多樣性」「共識層用戶端多樣性」。 +請注意,仔細選擇具有[用戶端多樣性](/developers/docs/nodes-and-clients/client-diversity/)的服務相當重要,因為它可以提高網路的安全性並降低你的風險。 如果某服務可以證明它會限制主流使用者端的使用,則稱它具有「執行層使用者端多樣性」「共識層使用者端多樣性」。 -關於我們遺漏的質押工具,你有什麼推薦嗎? 請參閱我們的[產品刊登政策](/contributing/adding-staking-products/),如果合適,請提交以供審核。 +關於我們遺漏的質押工具,你有要推薦的嗎? 請參閱我們的[產品刊登政策](/contributing/adding-staking-products/),如果合適,請提交以供審核。 ## 常見問題 {#faq} -一般來說,ERC-20 質押代幣會發給質押者,相當於他們的質押以太幣加上酬勞的價值。 請記住,不同的礦池將通過略有不同的方法向其使用者分配質押酬勞,但主旨是共通的。 +一般來說,ERC-20 質押代幣會發放給質押者,代表他們質押的以太幣以及質押獎勵的價值。 請記住,不同的礦池將通過略有不同的方法向其使用者分配質押酬勞,但主旨是共通的。 @@ -68,18 +68,19 @@ summaryPoints: 或者,使用 ERC-20 質押代幣的質押池允許使用者在公開市場上交易該代幣,讓你可以出售質押位置,這相當於允許你「提款」,但無需實際從質押合約中移除以太幣。 -更多關於質押提款的資訊 +更多質押提款相關資訊 -這些聯合質押選項和中心化交易所之間有許多相似之處,例如能夠質押少量以太幣並將它們捆綁在一起以激活驗證者。 +這些聯合質押選項和中心化交易所之間有許多相似之處,例如能夠質押少量以太幣並將它們捆綁在一起以啟動驗證者。 -與中心化交易所不同的是,許多其他聯合質押方案採用的是智慧型合約和/或質押代幣,通常是 ERC-20 代幣。這些代幣可以保存在你自己的錢包中,並能像任何其他代幣一樣正常買賣。 透過讓你控制自己的代幣,這為你提供了一層主權和安全性,但這並不代表你能夠直接控制在后台代表你執行證明的驗證者用戶端。 +與中心化交易所不同的是,許多其他聯合質押方案採用的是智慧型合約和/或質押代幣,通常是 ERC-20 代幣。這些代幣可以保存在你自己的錢包中,並能像任何其他代幣一樣正常買賣。 透過讓你控制自己的代幣,這為你提供了一層主權和安全性,但這並不代表你能夠直接控制在後台代表你執行證明的驗證者用戶端。 當涉及到支持它們的節點時。一些聯合質押方案比其他方案更去中心化。 為了加強網路的健康和去中心化程度,我們始終鼓勵質押者選擇這樣的聯合質押服務:無需許可且實現節點營運商去中心化。 ## 延伸閱讀 {#further-reading} +- [以太坊質押目錄](https://www.staking.directory/) - _Eridian 和 Spacesider_ - [使用 Rocket Pool 進行質押 - 質押概覽](https://docs.rocketpool.net/guides/staking/overview.html) - _RocketPool 文件_ - [使用 Lido 質押以太坊](https://help.lido.fi/en/collections/2947324-staking-ethereum-with-lido) - _Lido 幫助文件_ diff --git a/public/content/translations/zh-tw/staking/saas/index.md b/public/content/translations/zh-tw/staking/saas/index.md index d8ee4519dce..76b9b462e43 100644 --- a/public/content/translations/zh-tw/staking/saas/index.md +++ b/public/content/translations/zh-tw/staking/saas/index.md @@ -32,7 +32,7 @@ summaryPoints: ## 需要考慮的事項 {#what-to-consider} -有越來越多的質押即服務供應商提供以太幣質押服務,但有各自的好處及風險。 相較於居家質押,所有質押即服務方案都需要額外的信任假設。 質押即服務可能有整合以太坊用戶端的額外程式碼,這些程式碼並不開放或無法審核。 質押即服務對於網絡的去中心化也有不利影響。 根據設定,你可能無法控制你的驗證者 - 營運商可以使用你的以太幣做出不正當行為。 +有越來越多的質押即服務供應商提供以太幣質押服務,但有各自的好處及風險。 相較於居家質押,所有質押即服務方案都需要額外的信任假設。 質押即服務可能有整合以太坊用戶端的額外程式碼,這些程式碼並不開放或無法審核。 質押即服務對於網路的去中心化也有不利影響。 根據設定,你可能無法控制你的驗證者 - 營運商可以使用你的以太幣做出不正當行為。 以下屬性指標可以用來衡量質押即服務供應商可能具備的顯著優勢或劣勢。 在選擇服務,展開質押之旅之際,請將本節作為參考,了解我們如何定義這些屬性。 @@ -48,13 +48,13 @@ summaryPoints: -切記,支援[用戶端多元化](/developers/docs/nodes-and-clients/client-diversity/)極為重要,因為這可以提高網路的安全性,降低你的風險。 如果某服務可以證明它會限制主流用戶端的使用,則稱它具有「執行層用戶端多樣性」「共識層用戶端多樣性」。 +切記,支援[用戶端多元化](/developers/docs/nodes-and-clients/client-diversity/)極為重要,因為這可以提高網路的安全性,降低你的風險。 如果某服務可以證明它會限制主流使用者端的使用,則稱它具有「執行層使用者端多樣性」「共識層使用者端多樣性」。 ### 金鑰產生器 -關於我們遺漏的質押即服務供應商,你有任何推薦嗎? 請參閱我們的[產品刊登政策](/contributing/adding-staking-products/),如果合適,請提交以供審核。 +關於我們遺漏的質押即服務供應商,你有要推薦的嗎? 請參閱我們的[產品刊登政策](/contributing/adding-staking-products/),如果合適,請提交以供審核。 ## 常見問題 {#faq} @@ -63,9 +63,9 @@ summaryPoints: -是的, 每個帳戶都包含 BLS 簽名金鑰和 BLS 提款金鑰。 為了讓驗證者證明鏈的狀態、參與同步委員會並提出區塊建議,簽名金鑰必須易於驗證者用戶端訪問。 這些金鑰必須以某種形式連線至網際網路,因此本質上可視為「熱」金鑰。 這是驗證者證明區塊鏈的必要條件,因此基於安全因素,簽名金鑰與用以移轉或提取資金的金鑰是分開的。 +是的, 每個帳戶都包含 BLS 簽名金鑰和 BLS 提款金鑰。 為了讓驗證者證明鏈的狀態、參與同步委員會並提出區塊建議,簽名金鑰必須易於驗證者用戶端存取。 這些金鑰必須以某種形式連線至網際網路,因此本質上可視為「熱」金鑰。 這是驗證者證明區塊鏈的必要條件,因此基於安全因素,簽名金鑰與用以移轉或提取資金的金鑰是分開的。 -BLS 提款金鑰用於簽署一次性訊息,說明應將質押酬勞和退出資金轉到哪個執行層帳戶。 廣播此訊息後,便不再需要 BLS 提款金鑰。 取而代之的是,資金提款的權力將被永久地委託至你所提供的地址。 這允許你透過自己的冷存儲設定一個安全的提款地址,最小化驗證者資金的風險,即使有他人控制你的驗證者的簽名金鑰。 +BLS 提款金鑰用於簽署一次性訊息,說明應將質押酬勞和退出資金轉到哪個執行層帳戶。 廣播此訊息後,便不再需要 BLS 提款金鑰。 取而代之的是,資金提款的權力將被永久地委託至你所提供的地址。 這允許你透過自己的冷儲存設定一個安全的提款地址,最小化驗證者資金的風險,即使有他人控制你的驗證者的簽名金鑰。 更新提款者憑證是啟用提款的必要步驟\*。 這個過程涉及到使用你的種子助記詞生成提款金鑰。 @@ -85,11 +85,12 @@ BLS 提款金鑰用於簽署一次性訊息,說明應將質押酬勞和退出 使用質押即服務供應商,你會將節點的運作委託給其他人。 這伴隨著節點效能不佳的風險,這是你無法控制的。 如果你的驗證者遭到罰沒,驗證者的餘額會受到罰款,驗證者也會強制從驗證者池下架。 -罰沒/退出流程完成後,這些資金將被轉移到分配給驗證者的提款地址。 需要提供提款地址才能啟用該功能。 提款地址可能在一開始存款時便已提供。 如果沒有,則需要使用驗證者提款金鑰來簽署說明提款地址的訊息。 如果未提供提款地址,資金將保持鎖定狀態,直到提供地址。 +罰沒/退出流程完成後,這些資金將被轉移到分配給驗證者的提款地址。 需要提供提款地址才能啟用該功能。 提款地址可能在一開始存款時便已提供。 如果沒有,則需要使用驗證者提款金鑰來簽署說明提款地址的訊息。 如果未提供提款地址,資金將保持鎖定狀態,直到提供地址為止。 請聯繫各質押即服務提供商,了解關於任何擔保或保險方案的詳細訊息,以及如何提供提款地址的說明。 如果你希望完全掌控你的驗證者設定,請詳細了解如何單獨質押以太幣 ## 延伸閱讀 {#further-reading} +- [以太坊質押目錄](https://www.staking.directory/) - _Eridian 和 Spacesider_ - [評估質押服務](https://www.attestant.io/posts/evaluating-staking-services/) - _Jim McDonald 2020_ diff --git a/public/content/translations/zh-tw/staking/solo/index.md b/public/content/translations/zh-tw/staking/solo/index.md index 1a4ecc28134..8c583d2af3a 100644 --- a/public/content/translations/zh-tw/staking/solo/index.md +++ b/public/content/translations/zh-tw/staking/solo/index.md @@ -17,7 +17,7 @@ summaryPoints: 單獨質押指執行一個連線至網際網路的[以太坊節點](/run-a-node/)並存入 32 個以太幣,以啟用一個[驗證者](#faq),使你能夠直接參與網路共識。 -**單獨質押提高了以太坊網路的去中心化**,使以太坊更加無懼審查並能更可靠地抵禦攻擊。 其他質押方法可能無法以同樣的方式幫助網路。 單獨質押是保護以太坊的最佳質押方案。 +**單獨質押提高了以太坊網路的去中心化**,使以太坊更加無懼審查並能更可靠地抵禦攻擊。 其他質押方法可能無法以同樣的方式協助網路。 單獨質押是保護以太坊的最佳質押方案。 以太坊節點由執行層 (EL) 用戶端和共識層 (CL) 用戶端組成。 這類用戶端是一套共同運作的軟體加上一組有效的簽名金鑰,可驗證交易和區塊、證明正確的區塊鏈頭、匯總證明並提交區塊。 @@ -41,7 +41,7 @@ summaryPoints: -在操作自己的節點時,你應該花一些時間學習如何使用你選擇的軟體, 包括閱讀相關文件,以及了解這些開發團隊的溝通管道。 +在操作自己的節點時,你應該花一些時間學習如何使用你選擇的軟體。 包括閱讀相關文件,以及了解這些開發團隊的溝通管道。 越是了解你在執行的軟體以及權益證明的運作原理,你作為質押者的風險就越小,也越容易解決節點運作過程中可能出現的問題。 @@ -59,11 +59,11 @@ summaryPoints: -硬體偶爾會出現故障,網路連線會中斷,用戶端軟體偶爾也需要升級。 節點維護是不可避免的,你偶爾需要留意, 最好能隨時掌握預期的網路升級或其他重要的用戶端升級。 +硬體偶爾會出現故障,網路連線會中斷,用戶端軟體偶爾也需要升級。 節點維護是不可避免的,你偶爾需要留意。 最好能隨時掌握預期的網路升級或其他重要的用戶端升級。 -你的酬勞和你的驗證者在線上並提供正確證明的時間成正比。 停機會導致一定程度的罰金,這和有多少其他驗證者同時離線成正比,但不會導致罰沒。 頻寬也很重要,因為如果沒有及時收到證明,酬勞就會減少。 要求可能有所差異,但建議上傳和下載速率至少都要有 10 Mb/s。 +你的酬勞與你的驗證者上線並提供正確證明的時間成正比。 停機會導致一定程度的罰金,這和有多少其他驗證者同時離線成正比,但不會導致罰沒。 頻寬也很重要,因為如果沒有及時收到證明,酬勞就會減少。 要求可能有所差異,但建議上傳和下載速率至少都要有 10 Mb/s。 @@ -81,7 +81,7 @@ summaryPoints: 在活躍期間,你將獲得以太幣獎勵,這些獎勵將定期存入你的提款地址。 -如果需要,你可以退出驗證者,如此一來就不必一直在線上,但也不會再有任何酬勞。 然後,你的餘額將被提取到你在設置過程中指定的提款地址。 +如果需要,你可以退出驗證者,如此一來就不必一直上線,但也不會再有任何酬勞。 然後,你的餘額將被提取到你在設置過程中指定的提款地址。 [更多關於提取質押代幣的資訊](/staking/withdrawals/) @@ -109,7 +109,7 @@ summaryPoints: -切記,選擇[非主流用戶端](/developers/docs/nodes-and-clients/client-diversity/)極為重要,因為這可以提高網路的安全性,降低你的風險。 可讓你設定非主流用戶端的工具稱為「多重用戶端」。 +切記,選擇[非主流用戶端](/developers/docs/nodes-and-clients/client-diversity/)極為重要,因為這可以提高網路的安全性,降低你的風險。 可讓你設定非主流使用者端的工具稱為「多重使用者端」。 ### 金鑰產生器 @@ -117,7 +117,7 @@ summaryPoints: -關於我們遺漏的質押工具,你有什麼推薦嗎? 請參閱我們的[產品刊登政策](/contributing/adding-staking-products/),如果合適,請提交以供審核。 +關於我們遺漏的質押工具,你有要推薦的嗎? 請參閱我們的[產品刊登政策](/contributing/adding-staking-products/),如果合適,請提交以供審核。 ## 探索單獨質押指南 {#staking-guides} @@ -167,7 +167,7 @@ summaryPoints: 各用戶端的效能和使用者介面可能略有不同,因為每個用戶端都是由不同的團隊使用不同程式語言開發的。 這表示沒有「最好的」用戶端。 所有生產環境的用戶端都是優秀的軟體,會執行相同的核心功能來與區塊鏈同步和互動。 -由於所有生產環境用戶端的基本功能都相同,因此實際上選擇非主流用戶端非常重要;「非主流」意指網路上大多數驗證者都「不是」使用該用戶端。 這聽起來可能有悖直覺,但執行主流或絕對主流用戶端會使你在該用戶端出現錯誤時面臨更高的罰沒風險。 執行非主流用戶端可以大幅降低這些風險。 +由於所有生產環境用戶端的基本功能都相同,因此選擇非主流用戶端其實非常重要;「非主流」意指網路上大多數驗證者都「沒」使用該用戶端。 這聽起來可能有悖直覺,但執行主流或絕對主流用戶端會使你在該用戶端出現錯誤時面臨更高的罰沒風險。 執行非主流用戶端可以大幅降低這些風險。 詳細了解為什麼用戶端多元化如此重要 @@ -175,7 +175,7 @@ summaryPoints: 雖然虛擬私人伺服器 (VPS) 可以作為家用硬體的替代品,但驗證者用戶端的實體存取和位置有其重要性。 Amazon Web Services 或 Digital Ocean 等集中式雲端解決方案提供了不必擁有和運作硬體的便利,但代價是網路集中化。 -在一個集中式雲端儲存解決方案上執行的驗證者用戶端越多,對這些使用者而言就越危險。 如果發生任何事件導致這些供應商離綫,無論是由於攻擊、監管要求,抑或僅因為電源/網際網路中斷,都將導致依賴此伺服器的所有驗證者用戶端同時離綫。 +在一個集中式雲端儲存解決方案上執行的驗證者用戶端越多,對這些使用者而言就越危險。 如果發生任何事件導致這些供應商離線,無論是由於攻擊、監管要求,抑或僅因為電源/網際網路中斷,都將導致依賴此伺服器的所有驗證者用戶端同時離線。 離線罰金與同時離線的其他驗證者數量成正比。 使用虛擬私人伺服器會大幅提高承受更嚴重的離線罰金的風險,甚至如果發生大量當機,還會增加二次懲罰或罰沒的風險。 為了將你自己的風險和網路風險降至最低,我們強烈鼓勵使用者取得並操作自己的硬體。 @@ -184,7 +184,7 @@ summaryPoints: 在信標鏈中進行任何類型的提款都需要設置提款憑證。 -新質押者在生成金鑰和存款時就設置了提款憑證。 尚未設置此憑證的現有質押者可以升級其金鑰以支持此功能。 +新質押者在生成金鑰和存款時就設置了提款憑證。 尚未設置此憑證的現有質押者可以升級其金鑰以支援此功能。 設置提款憑證後,酬勞支付(扣除初始 32 個以太幣後的累積以太幣)將定期自動分配到提款地址。 @@ -195,9 +195,10 @@ summaryPoints: ## 延伸閱讀 {#further-reading} +- [以太坊質押目錄](https://www.staking.directory/) - _Eridian 和 Spacesider_ - [以太坊用戶端的多元化問題](https://hackernoon.com/ethereums-client-diversity-problem) - _@emmanuelawosika 2022_ - [幫助用戶端多元化](https://www.attestant.io/posts/helping-client-diversity/) - _Jim McDonald 2022_ - [以太坊共識層的用戶端多元化](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) - _jmcook.eth 2022_ - [如何購買以太坊驗證者硬體](https://www.youtube.com/watch?v=C2wwu1IlhDc) - _EthStaker 2022_ - [按部就班:如何加入以太坊 2.0 測試網](https://kb.beaconcha.in/guides/tutorial-eth2-multiclient) - _Butta_ -- [以太坊 2.0 罰沒預防技巧](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) - _Raul Jordan 2020_ +- [以太坊 2 罰沒預防技巧](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) - _Raul Jordan 2020 年_ diff --git a/public/content/translations/zh-tw/staking/withdrawals/index.md b/public/content/translations/zh-tw/staking/withdrawals/index.md index d390d104742..f102feb5a09 100644 --- a/public/content/translations/zh-tw/staking/withdrawals/index.md +++ b/public/content/translations/zh-tw/staking/withdrawals/index.md @@ -7,7 +7,7 @@ image: /staking/leslie-withdrawal.png alt: 犀牛萊斯利和她的質押酬勞 sidebarDepth: 2 summaryPoints: - - 上海/卡佩拉升級支持在以太坊提款 + - 上海/卡佩拉升級支援在以太坊提款 - 驗證者營運商必須提供提款地址才能啟用 - 每隔幾天自動分發酬勞 - 完全退出質押的驗證者將收到剩餘餘額 @@ -19,7 +19,7 @@ summaryPoints: **質押提款**是指將以太幣從以太坊共識層(信標鏈)上的驗證者帳戶轉移到可以進行交易的執行層。 -只要用戶提供了提款地址,超過 32 個以太幣的**超額酬勞**將自動定期發送到每個驗證者關聯的提款地址。 使用者也可**完全退出質押**,解鎖他們的全部驗證者餘額。 +只要使用者提供了提款地址,超過 32 個以太幣的**超額酬勞**將自動定期發送到每個驗證者關聯的提款地址。 使用者也能**完全退出質押**,解鎖他們的全部驗證者餘額。 ## 質押酬勞 {#staking-rewards} @@ -29,9 +29,9 @@ summaryPoints: ### 我們是如何走到這一步的? {#how-did-we-get-here} -在過去幾年,以太坊經歷了多次網路升級,過渡到由以太幣自身提供保護的網路,而不是像以前那樣進行能源密集型挖礦。 參與以太坊共識現在被稱為「質押」,因為參與者自願鎖定以太幣,將其「質押」,以獲得參與網路的能力。 遵守規則的用戶將獲得酬勞,而試圖欺詐的用戶將受到懲罰。 +在過去幾年,以太坊經歷了多次網路升級,過渡到由以太幣自身提供保護的網路,而不是像以前那樣進行能源密集型挖礦。 參與以太坊共識現在被稱為「質押」,因為參與者自願鎖定以太幣,將其「質押」,以獲得參與網路的能力。 遵守規則的使用者將獲得酬勞,而試圖欺詐的用戶將受到懲罰。 -自 2020 年 11 月推出質押存款合約以來,一些勇敢的以太坊先驅者自願鎖定資金以激活「驗證者」,即有權按照網路規則正式證明和提交區塊的特殊帳戶。 +自 2020 年 11 月推出質押存款合約以來,一些勇敢的以太坊先驅者自願鎖定資金以啟動「驗證者」,即有權按照網路規則正式證明和提交區塊的特殊帳戶。 在上海/卡佩拉升級前,你無法使用或存取已經質押的以太幣。 但現在,你可以選擇自動將酬勞存入所選帳戶,並且可以隨時提取質押的以太幣。 @@ -47,30 +47,30 @@ summaryPoints: 每個驗證者帳戶一次只能分配一個提款地址。一旦選好地址並提交到共識層,就無法撤消或再次更改。 提交前請再次檢查所提供地址的所有權和正確性。
        -假設你的助記詞/種子助記詞在離線狀態下保持安全,沒有受到任何損害,那麼即使沒有提供提權地址,也不會對你的資金造成威脅。 如果未能添加提款憑證,以太幣只會被鎖定在驗證者帳戶中,直到提供提款地址為止。 +假設你的助記詞/種子助記詞在離線狀態下保持安全,沒有受到任何損害,那麼即使沒有提供提款地址,也不會對你的資金造成威脅。 如果未能添加提款憑證,以太幣只會被鎖定在驗證者帳戶中,直到提供提款地址為止。 ## 完全退出質押 {#exiting-staking-entirely} -在從驗證者帳戶餘額中轉出*任何*資金之前,需要提供提款地址。 +在從驗證者帳戶餘額中轉出_任何_資金之前,需要提供提款地址。 -希望完全退出質押並提取全部餘額的用戶,還必須使用驗證者金鑰簽署並廣播「自願退出」訊息,這將啟動退出質押流程。 此操作通過你的驗證者用戶端完成,並提交到你的共識節點,無需燃料。 +希望完全退出質押並提取全部餘額的使用者,還必須使用驗證者金鑰簽署並廣播「自願退出」訊息,這將啟動退出質押流程。 此操作通過你的驗證者用戶端完成,並提交到你的共識節點,無需燃料。 -驗證者退出質押的過程所需時間不同,具體取決於有多少驗證者同時退出。 完成此流程後,該帳戶將不再負責執行 ​​ 驗證者網路職責,不再有資格獲得酬勞,且他們的以太幣不再處於「質押狀態」。 此時該帳戶將被標記為完全「可提款」。 +驗證者退出質押的過程所需時間不同,具體取決於有多少驗證者同時退出。 完成此流程後,該帳戶將不再負責執行​​驗證者網路職責,不再有資格獲得酬勞,且他們的以太幣不再處於「質押狀態」。 此時該帳戶將被標記為完全「可提款」。 -一旦帳戶被標記為「可提款」,並且已提供提款憑證,用戶無需執行任何操作,靜靜等待即可。 區塊提交者將自動連續掃描賬戶,尋找符合資格的退出資金,你的帳戶餘額將在下一次掃描期間全額轉移(也稱為「全額提款」)。 +一旦帳戶被標記為「可提款」,並且已提供提款憑證,使用者無需執行任何操作,靜靜等待即可。 區塊提交者將自動連續掃描帳戶,尋找符合資格的退出資金,你的帳戶餘額將在下一次掃描期間全額轉移(也稱為「全額提款」)。 ## 何時啟用質押提款? {#when} 質押提款現已上線! 提款功能在 2023 年 4 月 12 日進行的上海/卡佩拉升級中啟用。 -上海/卡佩拉升級使之前質押的以太幣回收到常規以太坊帳戶中。 這結束了質押流動性的循環,使以太坊在構建永續、可擴展、安全的去中心化生態系統的道路上又近了一步。 +上海/卡佩拉升級讓之前質押的以太幣得以回收到常規以太坊帳戶中。 這結束了質押流動性的循環,使以太坊在構建永續、可擴展、安全的去中心化生態系統的道路上又更近一步。 - [關於以太坊歷史的更多資訊](/history/) - [關於以太坊開發藍圖的更多資訊](/roadmap/) ## 提款付款流程如何運作? {#how-do-withdrawals-work} -給定驗證者是否有資格提款,由驗證者帳戶本身的狀態決定。 在任何給定時間都不需要用戶輸入來確定帳戶是否應該發起提款—整個過程由共識層在連續循環上自動完成。 +給定驗證者是否有資格提款,由驗證者帳戶本身的狀態決定。 在任何給定時間都不需要使用者輸入來確定帳戶是否應該發起提款—整個過程由共識層在連續循環上自動完成。 ### 想透過視覺方式學習? {#visual-learner} @@ -80,10 +80,10 @@ summaryPoints: ### 驗證者「掃描」 {#validator-sweeping} -當驗證者準備提交下一個區塊時,需要建立一個提款隊列,其中最多包含 16 項符合資格的提款。 最初從驗證者索引 0 開始,根據協議規則確定該帳戶是否有符合條件的提款,如果有,則將其添加到隊列中。 提交下一個區塊的驗證者們將從上一個區塊停止的地方開始,按順序依次進行。 +當驗證者準備提交下一個區塊時,需要建立一個提款隊列,其中最多包含 16 項符合資格的提款。 最初從驗證者索引 0 開始,根據協議規則,確定此帳戶是否有符合條件的提款,如果有,則將其添加到隊列中。 提交下一個區塊的驗證者們將從上一個區塊停止的地方開始,按順序依次進行。 -想象一下指針式時鐘。 時鐘上的指針指向小時,朝一個方向前進,不會跳過任何小時,並最終在到達最後一個數字後再次回到起點。

        +想像一下指針式時鐘。 時鐘上的指針指向小時,朝一個方向前進,不會跳過任何小時,並最終在到達最後一個數字後再次回到起點。

        現在,假設時鐘不是 1 到 12,而是 0 到 N (共識層上註冊的驗證者帳戶總數,截至 2023 年 1 月超過 500,000 個)。

        時鐘上的指針指向下一個驗證者,需要檢查其是否具備提款資格。 它從 0 開始,一路前進,不跳過任何帳戶。 到達最後一個驗證者後,從頭開始繼續循環。
        @@ -94,12 +94,12 @@ summaryPoints: 1. **是否已提供提款地址?**如果未提供提款地址,則跳過該帳戶,不發起提款。 2. **驗證者是否已退出並可提款?**如果驗證者已完全退出,且已達到其帳戶被視為「可提款」的時期,則會處理全額提款。 這會將全部餘額轉移至提款地址。 -3. **有效餘額是否已滿 32?**如果帳戶有提款憑證,未完全退出,且有 32 以上的酬勞待提取,將進行部分提款,僅轉出超過 32 的酬勞至用戶提款地址。 +3. **有效餘額是否已滿 32?**如果帳戶有提款憑證,未完全退出,且有 32 以上的酬勞待提取,將進行部分提款,僅轉出超過 32 的酬勞至使用者提款地址。 在驗證者的生命週期中,驗證者營運商只執行兩項直接影響此流程的操作: - 提供提款憑證以實現任何形式的提款 -- 退出網絡,觸發全額提款 +- 退出網路,觸發全額提款 ### 燃料費 {#gas-free} @@ -113,13 +113,13 @@ summaryPoints: -| 提款數量 | 完成時間 | -| :------: | :------: | -| 400,000 | 3.5 日 | -| 500,000 | 4.3 日 | -| 600,000 | 5.2 日 | -| 700,000 | 6.1 日 | -| 800,000 | 7.0 日 | +|提款數量 |完成時間 | +| :-------------------: | :--------------: | +| 400,000 | 3.5 日 | +| 500,000 | 4.3 日 | +| 600,000 | 5.2 日 | +| 700,000 | 6.1 日 | +| 800,000 | 7.0 日 | @@ -144,7 +144,7 @@ eventName="read more"> 提款地址可以是智慧型合約(由其程式碼控制),也可以是外部所有帳戶(EOA,由私密金鑰控制)。 目前,這些帳戶無法將訊息傳回共識層,以表明驗證者憑證的更改,增加此功能會給協議增加不必要的複雜性。 -如果無法更改特定驗證者的提款地址,用戶可以選擇將智慧型合約設置為可以處理金鑰輪換的提款地址,例如保險箱。 將資金設置為自己的外部所有帳戶的用戶可以執行完全退出以提取所有質押資金,然後使用新憑證重新質押。 +如果無法更改特定驗證者的提款地址,使用者可以選擇將智慧型合約設置為可以處理金鑰輪換的提款地址,例如保險箱。 將資金設置為自己的外部帳戶的使用者可以執行完全退出以提取所有質押資金,然後使用新憑證重新質押。
        如果你參與質押池或持有質押代幣,則應向你的提供商諮詢,了解有關如何處理質押提款的詳細資訊,因為每種服務的運作方式不同。 -一般來說,用戶應該可以自由地收回其質押的以太幣,或者更改他們使用的質押提供商。 如果特定質押池變得過大,則可以退出、贖回資金,並透過較小的提供商重新質押。 或者,如果積累了足夠的以太幣,你可以在家進行質押。 +一般來說,使用者應該可以自由地收回其質押的以太幣,或者更改他們使用的質押提供商。 如果特定質押池變得過大,則可以退出、贖回資金,並透過較小的提供商重新質押。 或者,如果積累了足夠的以太幣,你可以在家進行質押 @@ -179,7 +179,7 @@ eventName="read more">
        - @@ -194,9 +194,9 @@ eventCategory="FAQ" eventAction="I operate a validator. Where can I find more information on enabling withdrawals?" eventName="read more"> -建議驗證者營運商訪問質押啟動面板提款頁面,其中可以找到關於如何準備驗證者提款的詳細資訊。 包括準備情況、活動時間安排以及有關提款如何運作的詳細資訊。 +建議驗證操作者訪問質押啟動面板提款頁面以便找到更多關於驗證者需要為提款作出的準備、活動時間,以及提款相關的詳細資訊。 -若想先在測試網上嘗試你的設置,請從訪問 Goerli 測試網質押啟動面板開始。 +若想先在測試網上嘗試你的設置,請從造訪 Goerli 測試網質押啟動面板開始。 @@ -214,5 +214,5 @@ eventName="read more"> - [EIP-4895:將提款作為操作推送至信標鏈。](https://eips.ethereum.org/EIPS/eip-4895) - [以太坊牧貓人組織 - 上海](https://www.ethereumcatherders.com/shanghai_upgrade/index.html) - [PEEPanEIP #94:與 Potuz 和 Hsiao-Wei Wang 討論質押以太幣提款(測試中)](https://www.youtube.com/watch?v=G8UstwmGtyE) -- [PEEPanEIP#68:EIP-4895:與 Alex Stokes 討論信標鏈將提款作為操作推送](https://www.youtube.com/watch?v=CcL9RJBljUs) +- [PEEPanEIP#68:EIP-4895:信標鏈推動提款操作,由 Alex Stokes 主講](https://www.youtube.com/watch?v=CcL9RJBljUs) - [了解驗證者有效餘額](https://www.attestant.io/posts/understanding-validator-effective-balance/) diff --git a/public/content/translations/zh-tw/web3/index.md b/public/content/translations/zh-tw/web3/index.md index 9bcf2928c9f..cc54bacbd40 100644 --- a/public/content/translations/zh-tw/web3/index.md +++ b/public/content/translations/zh-tw/web3/index.md @@ -1,5 +1,5 @@ --- -title: 什麼是第三代網際網路?它為什麼很重要? +title: 什麼是 Web3?它為什麼很重要? description: Web3 簡介 - 全球資訊網再進化,以及它為何很重要。 lang: zh-tw --- @@ -26,7 +26,7 @@ Berners-Lee 的發明大約在 1990 年到 2004 年之間誕生,現今稱為 ### Web 2.0:讀寫(2004 - 至今) {#web2} -隨著社交媒體平台的出現,2004 年開始進入 Web 2.0 時期。 網路不再是唯讀,演變成讀寫式。 公司不向使用者提供內容,開始提供平台,以分享使用者產生的內容,並參與使用者間的互動。 隨著上網的人數增加,少數頂級公司開始控管不成比例的網路流量和網路上所產生的價值。 Web 2.0 也催生了廣告驅動的收入模式。 使用者雖能建立內容,但並不擁有內容,或在內容貨幣化之後從中受益。 +隨著社交媒體平台的出現,2004 年開始進入 Web 2.0時期。 網路不再是唯讀,演變成讀寫式。 公司不向使用者提供內容,開始提供平台,以分享使用者產生的內容,並參與使用者間的互動。 隨著上網的人數增加,少數頂級公司開始控管不成比例的網路流量和網路上所產生的價值。 Web 2.0 也催生了廣告驅動的收入模式。 使用者雖能建立內容,但並不擁有內容,或在內容貨幣化之後從中受益。 ![用戶端-伺服器架構,代表 Web 2.0](./web2.png) @@ -38,11 +38,11 @@ Berners-Lee 的發明大約在 1990 年到 2004 年之間誕生,現今稱為 ![去中心化節點架構,代表 Web3](./web3.png) -### 什麼是 Web3 ? {#what-is-web3} +### 什麼是Web3 ? {#what-is-web3} 對於展望更美好的新網際網路,Web3 一詞包羅萬象。 Web3 的核心是利用區塊鏈、加密貨幣和非同質化代幣,以所有權的形式將權力交還給使用者。 [推特 2020 年一篇貼文](https://twitter.com/himgajria/status/1266415636789334016)說得最好:Web1 為唯讀,Web2 為讀寫,Web3 為讀-寫-擁有。 -#### 第三代網際網路的核心思想 {#core-ideas} +#### Web3 的核心思想 {#core-ideas} 要嚴格定義 Web3 是什麼雖然很困難,但 Web3 的建置有一些核心指導原則。 @@ -64,7 +64,7 @@ Web3 允許透過[非同質化代幣 (NFT) ](/nft/)直接擁有。 沒有人有
        深入了解非同質化代幣
        - 非同質化代幣的相關細節 + 更多非同質化代幣相關資訊
        @@ -74,17 +74,17 @@ Web3 允許透過[非同質化代幣 (NFT) ](/nft/)直接擁有。 沒有人有 OnlyFans 是一個由使用者產生的成人內容網站,內容創作者超過 100 萬名,其中許多人使用該平台作為他們的主要收入來源。 2021 年 8 月,OnlyFans 宣布了禁止色情內容的計畫。 此公告在平台上的創作者中引發了憤怒,他們認為他們雖幫助建立平台,但收入被剝奪。 經強烈反對後,該決定很快被推翻。 儘管創作者贏得了這場仗,但這突顯了第二代網際網路創作者的一個問題:如果你離開平台,聲譽和後續累積的成果都沒了。 -在第三代網際網路上,你的資料位於區塊鏈上。 當你決定離開某個平台,你的聲譽能隨你而行,投入另一個更清楚符合你價值的介面。 +在 Web3 上,你的資料位於區塊鏈上。 當你決定離開某個平台,你的聲譽能隨你而行,投入另一個更清楚符合你價值的介面。 -第二代網際網路要求內容創作者相信平台不會更改規則,但抗審查是第三代網際網路平台的原生特性。 +Web 2.0 要求內容製作者相信平台不會更改規則,但抗審查是 Web3 平台的原生特性。 #### 去中心化自治組織(DAOs) {#daos} -除了在第三代網際網路中擁有個人資料外,你還能利用類似公司股票的代幣,來擁有該平台,將平台作為一個集合體。 去中心化自治組織讓你能協調平台的去中心化所有權,並對其未來做出相關決策。 +除了在 Web3 中擁有個人資料外,你還能利用類似公司股票的代幣,來擁有該平台,將平台作為一個集合體。 去中心化自治組織讓你能協調平台的去中心化所有權,並對其未來做出相關決策。 根據技術定義,去中心化自治組織是一種事先商定的智慧型合約,此合約透過資源池(代幣)自動執行去中心化決策。 擁有代幣的使用者,對資源的使用方式進行投票,而程式碼會自動執行投票結果。 -然而,許多第三代網際網路社群都被定義為去中心化自治組織。 這些社群都透過程式碼實現了不同程度的去中心化和自動化。 目前,我們仍在探索去中心化自治組織是什麼,以及其未來可能如何發展。 +然而,許多 Web3 社群都被定義為去中心化自治組織。 這些社群都透過程式碼實現了不同程度的去中心化和自動化。 目前,我們仍在探索去中心化自治組織是什麼,以及其未來可能如何發展。
        了解更多關於去中心化自治組織
        @@ -97,7 +97,7 @@ OnlyFans 是一個由使用者產生的成人內容網站,內容創作者超 過去是為每個使用的平台建立一個帳戶。 例如,你可能有一個 Twitter 帳戶、一個 YouTube 帳戶和一個 Reddit 帳戶。 想更改顯示名稱或設定檔圖片? 你必須在每個帳戶中執行此操作。 在某些情況下,你可以使用社交登入,但這帶來一個熟悉的問題,亦即審查。 只要按一下,這些平台就能完全斷絕你原有的網路生活。 更糟的是,許多平台要求向其交託個人身份資訊,方能建立帳戶。 -第三代網際網路解決了這些問題,允許使用以太坊地址和以太坊域名服務設定檔,來控制你的數位身份。 使用以太坊地址能跨平台提供單一登入,而且安全、抗審查且匿名。 +Web3 解決了這些問題,允許你使用以太坊地址和 ENS 設定檔來控制你的數位身份。 使用以太坊地址能跨平台提供單一登入,而且安全、抗審查且匿名。 以太坊登入 @@ -125,13 +125,13 @@ Web2 的付款基礎設施仰賴於銀行和付款處理器,不包含那些沒 ### 教育 {#education} -第三代網際網路引入了新的典範,這些典範需學習與第二代所用不同的心理模型。 隨著 Web1.0 在 1990 年代後期越來越流行,類似的教育運動於焉而生。網路的擁護者使用一系列教育技術來教育大眾,舉凡簡單的比喻(資訊高速公路、瀏覽器、上網),甚至是[電視廣播](https://www.youtube.com/watch?v=SzQLI7BxfYI)。 Web3 並不難,但與眾不同。 利用教育計畫讓 Web2 的使用者,了解這些 Web3 典範,對其成功至關重要。 +Web3 引入了新的典範,這些典範需學習與 Web2 所用不同的心理模型。 隨著 Web1.0 在 1990 年代後期越來越流行,類似的教育運動於焉而生。網路的擁護者使用一系列教育技術來教育大眾,舉凡簡單的比喻(資訊高速公路、瀏覽器、上網),甚至是[電視廣播](https://www.youtube.com/watch?v=SzQLI7BxfYI)。 Web3 並不難,但與眾不同。 利用教育計畫讓 Web2 的使用者,了解這些Web3 典範,對其成功至關重要。 Ethereum.org 透過其[翻譯計畫](/contributing/translation-program/)為 Web3 教育做出貢獻,致力將重要的以太坊內容翻譯成盡可能越多語言。 ### 中心化基礎設施 {#centralized-infrastructure} -Web3 生態系統很年輕且發展迅速。 因此,其目前主要依賴於中心化基礎設施(GitHub、Twitter、Discord 等)。 許多第三代網際網路公司目前爭相填補這些空缺,但建立優質可靠的基礎架構需要時間。 +Web3 生態系統很年輕且發展迅速。 因此,其目前主要依賴於中心化基礎設施(GitHub、Twitter、Discord 等)。 許多 Web3 公司目前爭相填補這些空缺,但建立優質可靠的基礎架構需要時間。 ## 去中心化的未來 {#decentralized-future} @@ -143,7 +143,7 @@ Web3 是一個年輕且不斷發展的生態系統。 Gavin Wood 在 2014 年創 - [取得錢包](/wallets/) - [尋找社群](/community/) -- [探索第三代網際網路應用程式](/dapps/) +- [探索 Web3 應用程式](/dapps/) - [參與 DAO](/dao/) - [在 Web3 上構建](/developers/) diff --git a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md index cbcf887f8f1..a5146ef31eb 100644 --- a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md @@ -46,7 +46,7 @@ lang: zh-tw 以上描述了「互動式零知識證明」的結構。 早期的零知識協定採用互動式證明,證明者和驗證者必須來回溝通許多次,才能驗證陳述的有效性。 -互動式證明的運作方式,有個很好的說明範例,就是 Jean-Jacques Quisquater 的著名故事,名為[阿里巴巴的山洞故事](https://zh.wikipedia.org/zh-hant/%E9%9B%B6%E7%9F%A5%E8%Af%86%E8%Af%81%E6%98%8E#%E7%94%9F%E6%B4%Bb%E7%Af%84%E4%Be%8B)。 在這個故事中,Peggy(證明者)想要向 Victor(驗證者)證明她知道開啟一扇魔法門的密語,但不透露該密語。 +互動式證明的運作方式,有個很好的說明範例,就是 Jean-Jacques Quisquater 的著名故事,名為[阿里巴巴的山洞故事](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave)。 在這個故事中,Peggy(證明者)想要向 Victor(驗證者)證明她知道開啟一扇魔法門的密語,但不透露該密語。 ### 非互動式零知識證明 {#non-interactive-zero-knowledge-proofs} @@ -80,7 +80,7 @@ ZK-SNARK 是 **Zero-Knowledge Succinct Non-Interactive Argument of Knowledge** [多方運算 (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) 是一種在產生公共參數時能降低風險的方法。 許多參與方同時參與[受信任設定儀式](https://zkproof.org/2021/06/30/setup-ceremonies/amp/),每個人都會提供一些隨機的值來產生公共參考串。 只要一個誠實的參與方銷毀他們那部分的熵,零知識簡潔非交互式知識論證協定就能保有運算的健全性。 -受信任設定要求使用者必須在產生參數上信任參與者。 然而,ZK-STARK 的發展使得證明協定能和非信任設定搭配運作。 +受信任設定要求使用者必須在產生參數上信任參與者。 然而,零知識可擴容透明知識論證的發展使得證明協定能和非信任設定搭配運作。 #### ZK-STARKs {#zk-starks} @@ -154,13 +154,13 @@ ZK-STARK 是** Zero-Knowledge Scalable Transparent Argument of Knowledge(零 鏈上投票會導致平方募資更容易被串謀所影響:區塊鏈交易是公開的,所以行賄者可以檢查受賄者的鏈上活動,了解他們是如何「投票」的。 這使得平方募資法已不再能根據社群集體的偏好,有效進行資金分配。 -所幸,MACI(最小反串謀基礎設施)等新式解決方案使用零知識證明,使鏈上投票(例如平方募資機制)能抵禦行賄與串謀。 最小反串謀基礎設施是一組智慧型合約與指令碼,它使中央管理員(稱為「協調員」)能匯集得票數與結果,*而且不會*暴露每個人具體的投票方式。 即使如此,仍然能驗證投票是否正確,或確認某參與者是否參與該輪投票。 +所幸,MACI(最小反串謀基礎設施)等新式解決方案使用零知識證明,使鏈上投票(例如平方募資機制)能抵禦行賄與串謀。 最小反串謀基礎設施是一組智慧型合約與指令碼,它使中央管理員(稱為「協調員」)能匯集得票數與結果,_而且不會_暴露每個人具體的投票方式。 即使如此,仍然能驗證投票是否正確,或確認某參與者是否參與該輪投票。 #### 最小反串謀基礎設施如何與零知識證明搭配運作? {#how-maci-works-with-zk-proofs} 開始時,協調員會在以太坊上部署最小反串謀基礎設施智慧型合約,之後使用者能註冊他們在智慧型合約裡的公鑰,以進行投票註冊。 使用者將使用公開金鑰加密後的訊息,傳送到智慧型合約,便完成投票(必須以使用者身份相關之最新公開金鑰進行簽署,投票才有效,還有其他的標準)。 之後,協調員在投票截止後處理所有訊息、統計得票數,並在區塊鏈上驗證結果。 -在最小反串謀基礎設施中,零知識證明用於確保計算的正確性,它使協調員不可能在處理投票和計票時出錯。 因為協調員必須產生零知識簡潔非交互式知識論證證明,驗證 a) 所有訊息皆已處理正確 b) 最終結果與所有*有效*投票的總票數相互對應。 +在最小反串謀基礎設施中,零知識證明用於確保計算的正確性,它使協調員不可能在處理投票和計票時出錯。 因為協調員必須產生零知識簡潔非交互式知識論證證明,驗證 a) 所有訊息皆已處理正確 b) 最終結果與所有_有效_投票的總票數相互對應。 因此,就算未分享每位使用者的投票明細(通常都是如此),最小反串謀基礎設施也能為計票過程中計算的結果確保完整性。 這個特點有助於降低基本串謀手法的有效性。 我們可利用 Bob 賄賂 Alice 以影響投票選擇的例子,來探索這個可能性: @@ -172,11 +172,11 @@ ZK-STARK 是** Zero-Knowledge Scalable Transparent Argument of Knowledge(零 - Alice 向 Bob 展示了一筆交易,該交易顯示她將票投給了 `option B`(這張票是無效的,因為公開金鑰和她在系統裡的身份無任何關聯) - 處理訊息時,協調員會略過愛麗絲投給 `option B` 的票,而只算投給 `option A` 的票。 因此,Bob 雖嘗試賄賂 Alice 來操縱鏈上投票,但計謀失敗。 -使用最小反串謀基礎設施時,我們*確實*需信任協調員不會與行賄者串通或自行嘗試賄賂投票者。 協調員可以解密使用者的訊息(產生證明時必須如此),以便準確驗證每個人的投票方式。 +使用最小反串謀基礎設施時,我們_確實_需信任協調員不會與行賄者串通或自行嘗試賄賂投票者。 協調員可以解密使用者的訊息(產生證明時必須如此),以便準確驗證每個人的投票方式。 但在協調員保持誠實的情況下,最小反串謀基礎設施是確保鏈上投票之神聖性的強大工具。 這解釋了它在 [clr.fund](https://clr.fund/#/about/maci) 等平方募資應用程式中為何廣受歡迎,這些程式十分依賴每個個體之投票選擇的完整性。 -[深入了解最小反串謀基礎設施](https://github.com/privacy-scaling-explorations/maci/blob/master/specs/01_introduction.md)。 +[深入了解最小反串謀基礎設施](https://privacy-scaling-explorations.github.io/maci/)。 ## 使用零知識證明的缺點 {#drawbacks-of-using-zero-knowledge-proofs} @@ -192,7 +192,7 @@ ZK-STARK 是** Zero-Knowledge Scalable Transparent Argument of Knowledge(零 在零知識簡潔非交互式知識論證裡,公共參考串(公共參數)會產生一次,然後可在想要參加零知識協定的團隊中重複使用。 在參與者皆誠實的前提下,公共參數是經由受信任設定儀式建立而成。 -但使用者真的沒有任何方法能評估參與者的誠實度,使用者必須信任開發者。 零知識可擴容透明知識論證沒有信任假設,因為產生字串所採用的隨機性,是能公開驗證的。 同時,研究人員正在研究 ZK-SNARK 的非信任設定,以增加驗證機制的安全性。 +但使用者真的沒有任何方法能評估參與者的誠實度,使用者必須信任開發者。 零知識可擴容透明知識論證沒有信任假設,因為產生字串所採用的隨機性,是能公開驗證的。 同時,研究人員正在研究零知識簡潔非交互式知識論證的非信任設定,以增加驗證機制的安全性。 ### 量子計算的威脅 {#quantum-computing-threats} @@ -208,5 +208,5 @@ ZK-STARK 是** Zero-Knowledge Scalable Transparent Argument of Knowledge(零 - [零知識證明:改善區塊鏈的隱私](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_ - [零知識簡潔非交互式知識論證 — 零知識現實範例與深入探討](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_ - [零知識可擴容透明知識論證 — 建立可驗證的信任,哪怕面對量子電腦](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_ -- [如何使零知識簡潔非交互式知識論證成真之相關簡介](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_ +- [如何使零知識簡潔非交互式知識論證成真之相關簡介](https://vitalik.ca/general/2021/01/26/snarks.html) — _Vitalik Buterin_ - [零知識證明是什麼?在區塊鏈中的角色為何?](https://www.leewayhertz.com/zero-knowledge-proof-and-blockchain/)— _LeewayHertz_ diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index 74adfb3fba1..feaa654e801 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "這個使用教學對你有幫助嗎?", "feedback-widget-thank-you-title": "感謝你提供意見回饋!", "feedback-widget-thank-you-subtitle": "回答幾個問題,讓這個頁面更加完善。", - "feedback-widget-thank-you-subtitle-ext": "如果需要協助,你可以前往我們的 Discord 聯繫社群。", + "feedback-widget-thank-you-subtitle-ext": "若你需要幫助,可透過我們的 Discord 聯繫社群。", "feedback-widget-thank-you-timing": "2-3 分鐘", "feedback-widget-thank-you-cta": "開啟小調查", "find-wallet": "尋找錢包", diff --git a/src/intl/zh-tw/learn-quizzes.json b/src/intl/zh-tw/learn-quizzes.json index d69f24d1b94..edaa2e89924 100644 --- a/src/intl/zh-tw/learn-quizzes.json +++ b/src/intl/zh-tw/learn-quizzes.json @@ -62,7 +62,7 @@ "a004-d-label": "超過十次", "a004-explanation": "自上線以來,以太坊從未完全離線(停止出塊)。", "a005-prompt": "電能消耗少於以太坊的有:", - "a005-a-label": "淘金", + "a005-a-label": "開採金礦", "a005-a-explanation": "開採金礦每年耗費約 131 太瓦時。以太坊每年耗費約 0.0026 太瓦時。", "a005-b-label": "網飛", "a005-b-explanation": "Netflix 每年耗費約 0.451 太瓦時。以太坊每年耗費約 0.0026 太瓦時。", @@ -84,7 +84,7 @@ "b002-a-explanation": "首字母小寫的「bitcoin」是比特幣網路的原生加密貨幣。", "b002-b-label": "以太幣", "b002-b-explanation": "以太幣 (ETH) 是以太坊的原生加密貨幣。以太坊上所有交易費都以以太幣支付。", - "b002-c-label": "美金", + "b002-c-label": "美元", "b002-c-explanation": "在以太坊,不能使用美金(美元)或其他法定貨幣支付網路費用。", "b002-d-label": "以太坊", "b002-d-explanation": "以太坊是指網路,而以太坊的網路費用應以以太幣支付。", @@ -95,8 +95,8 @@ "b003-b-explanation": "若質押者對網路做出可疑行為,將可能損失大量以太幣,這稱為「罰沒」。", "b003-c-label": "質押者運行強大的電腦以展示工作量證明", "b003-c-explanation": "質押者並不需要強大的硬體來質押他們的以太幣。合併後以太坊已停止使用工作量證明。", - "b003-d-label": "質押者在被接受為驗證者前需經過身份驗證。", - "b003-d-explanation": "在以太坊上質押無需許可且不需要身份驗證。", + "b003-d-label": "質押者在被接受為驗證者前需經過「認識客戶」驗證。", + "b003-d-explanation": "在以太坊上質押無需許可且不需要「認識客戶」驗證。", "b004-prompt": "以太幣是有價值的,因為:", "b004-a-label": "在以太坊上進行任何操作都需要以太幣", "b004-a-explanation": "這個答案不完全正確,但它是以太幣有價值的原因之一。", @@ -319,9 +319,9 @@ "h005-prompt": "以太坊共識層以前稱為:", "h005-a-label": "工作量證明", "h005-a-explanation": "工作量證明是合併前使用的共識機制。", - "h005-b-label": "以太坊 2.0", + "h005-b-label": "以太坊 2", "h005-b-explanation": "在重新命名為共識層前,它被稱為「以太坊 2」。", - "h005-c-label": "Eth1", + "h005-c-label": "以太坊 1", "h005-c-explanation": "以太坊 1 是原執行層,而非共識層的名稱。", "h005-d-label": "質押", "h005-d-explanation": "質押是指將以太幣存入智慧型合約以協助保護區塊鏈網路的安全。" diff --git a/src/intl/zh-tw/page-dapps.json b/src/intl/zh-tw/page-dapps.json index d8070ba4e7c..01a72c2ee55 100644 --- a/src/intl/zh-tw/page-dapps.json +++ b/src/intl/zh-tw/page-dapps.json @@ -1,32 +1,48 @@ { "page-dapps-1inch-logo-alt": "1inch 標誌", - "page-dapps-dexguru-logo-alt": "DexGuru 標誌", "page-dapps-aave-logo-alt": "Aave 標誌", "page-dapps-add-button": "建議去中心化應用程式", "page-dapps-add-title": "新增去中心化應用程式", + "page-dapps-ankr-logo-alt": "Ankr 標誌", + "page-dapps-api3-logo-alt": "API3 標誌", + "page-dapps-arweave-logo-alt": "ARweave 標誌", "page-dapps-audius-logo-alt": "Audius 標誌", "page-dapps-augur-logo-alt": "Augur 標誌", "page-dapps-axie-infinity-logo-alt": "Axie Infinity 標誌", "page-dapps-balancer-logo-alt": "Balancer 標誌", "page-dapps-brave-logo-alt": "Brave 標誌", + "page-dapps-beginner-friendly-description": "以下是一些適合新手的去中心化應用程式。往下探索更多。", + "page-dapps-beginner-friendly-header": "適合新手", "page-dapps-category-arts": "藝術與時尚", "page-dapps-category-browsers": "瀏覽器", + "page-dapps-category-code-marketplaces": "程式碼市集", "page-dapps-category-collectibles": "數位收藏品", - "page-dapps-category-competitive": "競賽", + "page-dapps-category-competitive": "Web3 遊戲", "page-dapps-category-computing": "開發人員工具", - "page-dapps-category-dex": "交換代幣", - "page-dapps-category-investments": "投資", + "page-dapps-category-dex": "交易所", + "page-dapps-category-investments": "投資基金", "page-dapps-category-lending": "放款與借款", "page-dapps-category-lottery": "群眾募資", "page-dapps-category-marketplaces": "市場", "page-dapps-category-music": "音樂", "page-dapps-category-payments": "付款", "page-dapps-category-insurance": "保險", - "page-dapps-category-portfolios": "投資組合", - "page-dapps-category-trading": "交易與預期市場", + "page-dapps-category-portfolios": "投資組合管理", + "page-dapps-category-trading": "預測市場", "page-dapps-category-utilities": "工具", "page-dapps-category-worlds": "虛擬世界", + "page-dapps-category-demand-aggregator": "需求匯總", + "page-dapps-category-derivatives": "衍生品", + "page-dapps-category-liquid-staking": "流動性質押", + "page-dapps-category-bridges": "跨鏈橋", + "page-dapps-category-experiences": "經驗分享", + "page-dapps-category-guilds": "收益工會", + "page-dapps-category-avatar": "虛擬形象", "page-dapps-choose-category": "選擇類別", + "page-dapps-category-social": "社交媒體", + "page-dapps-category-content": "內容", + "page-dapps-category-messaging": "傳訊", + "page-dapps-category-identity": "身份", "page-dapps-collectibles-benefits-1-description": "當藝術在以太坊上代幣化,所有權可以證明給所有人知道。你可以追蹤藝術作品從作者到目前持有人的旅程。可以避免偽造。", "page-dapps-collectibles-benefits-1-title": "所有權是可證明的", "page-dapps-collectibles-benefits-2-description": "直接購買串流音樂或藝術品,對藝術家來說是相當公平的方式。使用以太坊,便不需要有太多的中間媒介。即使需要中間媒介,費用也不會那麼高,因為這些平台不需要支付網路基礎建設的費用。", @@ -41,10 +57,15 @@ "page-dapps-collectibles-description": "這些應用程式注重數位所有權,為創作者增加潛在收益,以及發明新的方式讓大家投資喜愛的創作者和他們創作的作品。", "page-dapps-collectibles-title": "去中心化藝術品和收藏品", "page-dapps-compound-logo-alt": "Compound 標誌", + "page-dapps-convex-logo-alt": "Convex 標誌", "page-dapps-cryptopunks-logo-alt": "加密龐克標誌", "page-dapps-cryptovoxels-logo-alt": "Cryptovoxels 標誌", + "page-dapps-cyberconnect-logo-alt": "CyberConnect 標誌", "page-dapps-dapp-description-1inch": "藉由總計最佳價格來協助你避免過高的價格滑點。", "page-dapps-dapp-description-aave": "將你的代幣借給他人以賺取利息,並可隨時取回代幣。", + "page-dapps-dapp-description-ankr": "一系列用來構建、獲利和遊戲等的 Web3 基礎設施產品,全部都在區塊鏈上。", + "page-dapps-dapp-description-api3": "第一方價格參考資料饋送源,可以讓 10 個(且持續增加)網路的去中心化應用程式連接到即時資產價格資料,包括加密貨幣和外匯價格。", + "page-dapps-dapp-description-arweave": "只需支付一次預付費用,即可永久且永續地儲存資料。", "page-dapps-dapp-description-async-art": "建立、收集和交易 #ProgrammableArt ─ 這是種分成多個「層次」(Layer) 的數位藝術,你可使用 Layer 來影響整體影像。每個 Master 和 Layer 都是 ERC721 代幣。", "page-dapps-dapp-description-audius": "去中心化串流服務平台。聽眾聆聽音樂等於為創作者創造收益,而非為品牌創造收益。", "page-dapps-dapp-description-augur": "針對運動賽事、經濟和更多世界活動的結果下賭注。", @@ -53,24 +74,34 @@ "page-dapps-dapp-description-brave": "跟他們一起瀏覽並支持你喜愛的創作者,並賺取代幣。", "page-dapps-dapp-description-cent": "社交網路讓你能藉由上傳非同質化代幣賺取資金。", "page-dapps-dapp-description-compound": "將你的代幣借給他人以賺取利息,並可隨時取回代幣。", + "page-dapps-dapp-description-convex": "Convex 允許 Curve 流動性提供者在不用鎖倉 CRV 的情況下,賺取交易手續費並領取增加的 CRV。", "page-dapps-dapp-description-cryptopunks": "對龐克進行購買、競標和出價,這是以太坊上首批出現的代幣收藏品之一。", "page-dapps-dapp-description-cryptovoxels": "在以太坊虛擬世界中,建立藝廊、開店和購買土地。", + "page-dapps-dapp-description-cyberconnect": "去中心化社交圖譜協定,幫助去中心化應用程式啟動網路效應並構建個人化社交體驗。", "page-dapps-dapp-description-dark-forest": "在無垠、程序化生成、特定加密的宇宙中征服眾多行星。", "page-dapps-dapp-description-decentraland": "在無盡探索的虛擬世界中收集、交易虛擬土地。", "page-dapps-dapp-description-ens": "使用者友善的以太坊位址名稱,以及去中心化網站。", "page-dapps-dapp-description-foundation": "投資獨一無二版本的數位藝術品,並與其他買家交易。", "page-dapps-dapp-description-gitcoin": "改善開源軟體賺取加密貨幣。", "page-dapps-dapp-description-gitcoin-grants": "為以太坊社群眾籌,放大貢獻", + "page-dapps-dapp-description-gm": "真正與創作者分享收益,集聊天、論壇和語音於一身的平台", "page-dapps-dapp-description-gods-unchained": "策略集換式卡牌遊戲。透過遊戲賺取可在現實生活販售的卡牌。", "page-dapps-dapp-description-golem": "取得共享電腦計算能力或租用你的個人資源。", + "page-dapps-dapp-description-graph": "用於查詢以太坊和星際檔案系統等網路的索引協定。", + "page-dapps-dapp-description-ipfs": "點對點的超媒體協定,旨在透過使網路可升級、有彈性且更加開放來保存和增長人類的知識。", "page-dapps-dapp-description-radicle": "確保無須中介的點對點程式碼合作。", + "page-dapps-dapp-description-kyberswap": "以最佳匯率兌換和賺取收益。", + "page-dapps-dapp-description-lido": "簡化且安全的數位資產質押。", "page-dapps-dapp-description-loopring": "為快速交易打造的點對點平台。", "page-dapps-dapp-description-marble-cards": "以統一資源定位符為基礎創作並交易獨特數位卡牌。", "page-dapps-dapp-description-matcha": "搜尋數家交易所幫助你找到最佳價格。", + "page-dapps-dapp-description-mirror": "以 Web3 為本的強大發佈平台 Mirror,突破網上寫作的界限", + "page-dapps-dapp-description-multichain": "終極的 web3 路由器。這是為任意跨鏈互動而開發的基礎設施。", "page-dapps-dapp-description-nifty-gateway": "在區塊鏈上購入頂尖藝術家、運動員、樂團及創作者之作品。", "page-dapps-dapp-description-oasis": "透過 Dai 交易、借貸與儲存,這是一種以太坊穩定幣。", "page-dapps-dapp-description-opensea": "購入、販賣,探索及交易限量版商品。", "page-dapps-dapp-description-opera": "藉由你的瀏覽器將加密貨幣傳送到商家、其他使用者及應用程式。", + "page-dapps-dapp-description-osuvox": "住在區塊鏈上的 3D 虛擬形象", "page-dapps-dapp-description-poap": "收集非同質化代幣提供你參與虛擬或實體活動的證明。使用它們參與抽獎、投票、合作活動,或者只是炫耀。", "page-dapps-dapp-description-polymarket": "根據結果下注。在資訊市場交易。", "page-dapps-dapp-description-pooltogether": "不會輸的樂透。每星期開獎。", @@ -82,12 +113,19 @@ "page-dapps-dapp-description-rotki": "尊重你隱私的開源投資組合追蹤、分析、管理,及稅金報告工具。", "page-dapps-dapp-description-krystal": "一個能夠存取所有你最喜愛的去中心化金融服務的一站式平台。", "page-dapps-dapp-description-rarible": "創作、販賣及購買代幣化收藏品。", + "page-dapps-dapp-description-rubic": "為使用者和去中心化應用程式而設的跨鏈技術聚合器。", "page-dapps-dapp-description-sablier": "即時流通資金。", + "page-dapps-dapp-description-skiff": "端對端加密,讓你在電郵、日曆、文件和檔案上的通訊更自由。", + "page-dapps-dapp-description-spatial": "建立個人的虛擬形象和 3D 世界", + "page-dapps-dapp-description-spruce": "開源技術堆疊將身份和資料的控制權歸還到使用者手中。", + "page-dapps-dapp-description-status": "旨在實現訊息自由流通、保護私密和安全對話的權利,以及促進個人主權。", "page-dapps-dapp-description-superrare": "直接從藝術家或二級市場購買數位藝術品。", + "page-dapps-dapp-description-synthetix": "Synthetix 是一個用於發行及交易合成資產的協議。", "page-dapps-dapp-description-token-sets": "能自動調整資金的加密貨幣投資策略。", + "page-dapps-dapp-description-tornado-cash": "在以太坊傳送匿名交易。", "page-dapps-dapp-description-uniswap": "輕鬆交換代幣或提供代幣賺取 % 獎勵。", - "page-dapps-dapp-description-dexguru": "面向去中心化金融交易者的不受監護式交易終端", - "page-dapps-dapp-description-synthetix": "Synthetix 是一個用於發行及交易合成資產的協議。", + "page-dapps-dapp-description-xmtp": "在區塊鏈帳戶之間傳送訊息,包括直接訊息、警報和公告等等。", + "page-dapps-dapp-description-yearn": "Yearn Finance 是一種收益聚合器,可讓個人、去中心化自治組織及其他協議存入數位資產並獲得收益。", "page-dapps-docklink-dapps": "去中心化應用程式簡介", "page-dapps-docklink-smart-contracts": "智慧型合約", "page-dapps-dark-forest-logo-alt": "Dark Forest 標誌", @@ -103,9 +141,7 @@ "page-dapps-desc": "找個以太坊應用程式試一試。", "page-dapps-doge-img-alt": "插圖:狗狗使用電腦", "page-dapps-editors-choice-dark-forest": "對抗其他玩家、征服星球,並嘗試以太坊最新擴張/隱私技術。也許你的對手已經對以太坊很熟悉。", - "page-dapps-editors-choice-description": "一些 ethereum.org 團隊現在愛不釋手的一些去中心化應用程式。在下方探索更多去中心化應用程式。", "page-dapps-editors-choice-foundation": "投資文化。向頂尖藝術家、音樂家及樂團,購買、交易,及販賣獨一無二的數位藝術品和時尚。", - "page-dapps-editors-choice-header": "編輯推薦", "page-dapps-editors-choice-pooltogether": "買張不會輸的樂透。每個星期整個票池產生的利息會傳送給幸運的贏家。你可以隨時取回你的貨幣。", "page-dapps-editors-choice-uniswap": "輕鬆交換你的代幣。社群最喜歡的功能,讓你可以與全網路的人交易代幣。", "page-dapps-ens-logo-alt": "以太坊名稱服務標誌", @@ -155,8 +191,10 @@ "page-dapps-get-started-title": "開始使用", "page-dapps-gitcoin-grants-logo-alt": "Gitcoin Grants 標誌", "page-dapps-gitcoin-logo-alt": "Gitcoin 標誌", + "page-dapps-gm-logo-alt": "gm.xyz 標誌", "page-dapps-gods-unchained-logo-alt": "Gods Unchained 標誌", "page-dapps-golem-logo-alt": "Golem 標誌", + "page-dapps-graph-logo-alt": "Graph 標誌", "page-dapps-radicle-logo-alt": "Radicle 標誌", "page-dapps-hero-header": "以太坊運行工具及服務", "page-dapps-hero-subtitle": "去中心化應用程式是蓬勃發展的應用程式,使用以太坊打破商業模型,或打造新的模型。", @@ -164,10 +202,13 @@ "page-dapps-how-dapps-work-p2": "智慧型合約完全按照程式碼運作,類似所有人都能閱覽的線上規則。想像一下自動販賣機,如果你投入足夠金額並按下正確選擇,你就能取得想要的商品。就像自動販賣機,智慧型合約也能儲存資金,跟以太坊帳戶相似,這讓程式碼能在合約與交易之間做為媒介。", "page-dapps-how-dapps-work-p3": "一旦去中心化應用程式部署到以太坊網路上,你就不能變更。去中心化應用程式由合約中寫入的邏輯管控,而非個人或公司,因此具去中心化特性。", "page-dapps-how-dapps-work-title": "去中心化應用程式原理", + "page-dapps-ipfs-logo-alt": "IPFS 標誌", + "page-dapps-kyberswap-logo-alt": "KyberSwap 標誌", "page-dapps-learn-callout-button": "開始建置", "page-dapps-learn-callout-description": "我們的社群開發者入口網站有文件、工具以及框架,幫助你打造去中心化應用程式。", "page-dapps-learn-callout-image-alt": "插圖:一隻手正在將樂高積木組成以太象徵。", "page-dapps-learn-callout-title": "學習如何建立去中心化應用程式", + "page-dapps-lido-logo-alt": "Lido 標誌", "page-dapps-loopring-logo-alt": "Loopring 標誌", "page-dapps-magic-behind-dapps-description": "去中心化應用程式感覺像是一般的應用程式。但是在幕後它們有其特殊的特性,因為它們繼承以太坊所有的超能力。以下是去中心化應用程式與一般應用程式的不同之處。", "page-dapps-magic-behind-dapps-link": "是什麼讓以太坊如此偉大?", @@ -178,11 +219,23 @@ "page-dapps-marble-cards-logo-alt": "marble.cards 標誌", "page-dapps-async-logo-alt": "Async 標誌", "page-dapps-matcha-logo-alt": "Matcha 標誌", + "page-dapps-metaverse-benefits-title": "元宇宙", + "page-dapps-metaverse-benefits-description": "以太坊的哪些特點,讓元宇宙蓬勃發展?", + "page-dapps-metaverse-benefits-1-title": "非同質化代幣", + "page-dapps-metaverse-benefits-1-description": "使用者擁有的獨一無二遊戲內物品,可在支援相同標準的虛擬世界和市集中互通。", + "page-dapps-metaverse-benefits-2-title": "使用者擁有自己的社群", + "page-dapps-metaverse-benefits-2-description": "身份為使用者所擁有,他們擁有無限的機會,在多個虛擬世界中探索和創建社交網絡。", + "page-dapps-metaverse-button": "元宇宙", + "page-dapps-metaverse-title": "元宇宙", + "page-dapps-metaverse-description": "這些應用程式的使用者能夠自由參與虛擬世界。使用者可以建立個人網絡並獲得數位資產的所有權", + "page-dapps-mirror-logo-alt": "Mirror 標誌", "page-dapps-mobile-options-header": "瀏覽其他類別", + "page-dapps-multichain-logo-alt": "Multichain 標誌", "page-dapps-nifty-gateway-logo-alt": "Nifty Gateway 標誌", "page-dapps-oasis-logo-alt": "Oasis 標誌", "page-dapps-opensea-logo-alt": "OpenSea 標誌", "page-dapps-opera-logo-alt": "Opera 標誌", + "page-dapps-osuvox-logo-alt": "OSUVOX 標誌", "page-dapps-polymarket-logo-alt": "Polymarket 標誌", "page-dapps-poap-logo-alt": "Proof of Attendance Protocol 標誌", "page-dapps-pooltogether-logo-alt": "PoolTogether 標誌", @@ -190,15 +243,24 @@ "page-dapps-ready-button": "開始", "page-dapps-ready-description": "選一個去中心化應用程式試試看", "page-dapps-ready-title": "準備好了嗎?", + "page-dapps-rubic-logo-alt": "Rubic 標誌", "page-dapps-sablier-logo-alt": "Sablier 標誌", "page-dapps-set-up-a-wallet-button": "尋找錢包", "page-dapps-set-up-a-wallet-description": "錢包是你的去中心化應用程式「登入」憑證", "page-dapps-set-up-a-wallet-title": "設定錢包", + "page-dapps-skiff-logo-alt": "Skiff 標誌", + "page-dapps-social-button": "社交", + "page-dapps-social-description": "這些應用程式專注於透過去中心化身份技術建立去中心化社交網路,讓數位身份及社交圖譜皆歸使用者所有。", + "page-dapps-social-title": "社交", + "page-dapps-spatial-logo-alt": "Spatial 標誌", + "page-dapps-spruce-logo-alt": "Spruce 標誌", + "page-dapps-status-logo-alt": "Status 標誌", "page-dapps-superrare-logo-alt": "SuperRare 標誌", "page-dapps-technology-button": "科技", "page-dapps-technology-description": "這些應用程式著重於去中心化開發者工具,融入加密貨幣系統與現有科技,及打造開源開發市場。", "page-dapps-technology-title": "去中心化科技", "page-dapps-token-sets-logo-alt": "Token Sets 標誌", + "page-dapps-tornado-cash-logo-alt": "Tornado cash 標誌", "page-dapps-uniswap-logo-alt": "Uniswap 標誌", "page-dapps-wallet-callout-button": "尋找錢包", "page-dapps-wallet-callout-description": "錢包也是去中心化應用程式之一。找一個適合你的錢包吧。", @@ -212,11 +274,17 @@ "page-dapps-more-on-nft-gaming-button": "更多關於代幣化遊戲物品", "page-dapps-dapp-description-pwn": "由以太坊上的任何代幣或非同質化代幣支持的簡式貸款。", "page-dapps-pwn-image-alt": "PWN 標誌", - "page-dapps-dapp-description-yearn": "Yearn Finance 是一種收益聚合器,可讓個人、去中心化自治組織及其他協議存入數位資產並獲得收益。", + "page-dapps-xmtp-logo-alt": "XMTP 標誌", + "opage-dapps-yearn-logo-alt": "Yearn 標誌", "page-dapps-yearn-image-alt": "Yearn 標誌", - "page-dapps-dapp-description-convex": "Convex 允許 Curve 流動性提供者在不用鎖倉 CRV 的情況下,賺取交易手續費並領取增加的 CRV。", "page-dapps-convex-image-alt": "Convex 標誌", "foundation": "基金會", "transaction-fees": "什麼是交易手續費?", - "page-wallets-get-some": "取得一些以太幣" + "page-wallets-get-some": "取得一些以太幣", + "page-dapps-dapp-description-curve": "Curve 是一間專注於穩定幣的去中心化交易所", + "page-dapps-curve-image-alt": "Curve 標誌", + "page-dapps-dapp-description-dodo": "DODO 是鏈上流動性提供者,採用了主動做市商 (PMM) 演算法。", + "page-dapps-dodo-image-alt": "DODO 標誌", + "page-dapps-dapp-description-artblocks": "Art Blocks 致力於將引人入勝的當代生成式藝術的藝術品帶入生活中", + "page-dapps-artblocks-image-alt": "Art Blocks 標誌" } diff --git a/src/intl/zh-tw/page-developers-index.json b/src/intl/zh-tw/page-developers-index.json index d1c8560efec..28b5620636c 100644 --- a/src/intl/zh-tw/page-developers-index.json +++ b/src/intl/zh-tw/page-developers-index.json @@ -7,7 +7,7 @@ "page-developers-accounts-link": "帳戶", "page-developers-advanced": "進階", "page-developers-api-desc": "使用程式庫與智慧型合約互動", - "page-developers-api-link": "後端 API", + "page-developers-api-link": "後端應用程式介面", "page-developers-block-desc": "新增至區塊鏈的異動批次", "page-developers-block-explorers-desc": "取得 Ethereum 資料的入口", "page-developers-block-explorers-link": "區塊瀏覽器", @@ -15,7 +15,7 @@ "page-developers-browse-tutorials": "瀏覽教學課程", "page-developers-choose-stack": "選擇你的堆疊", "page-developers-contribute": "貢獻", - "page-developers-dev-env-desc": "適合去中心化應用程式開發的 IDE", + "page-developers-dev-env-desc": "適合去中心化應用程式開發的整合開發環境", "page-developers-dev-env-link": "開發環境", "page-developers-discord": "加入 Discord 伺服器", "page-developers-docs-introductions": "簡介", @@ -27,12 +27,12 @@ "page-developers-frameworks-link": "開發架構", "page-developers-fundamentals": "基礎", "page-developers-gas-desc": "需要加強異動功能", - "page-developers-gas-link": "Gas", + "page-developers-gas-link": "燃料", "page-developers-get-started": "你想如何開始?", "page-developers-improve-ethereum": "協助我們推出更完善的 ethereum.org", "page-developers-improve-ethereum-desc": "如同 ethereum.org,這些文件是集社群之力完成的。如果看到任何錯誤或認為內容有改進空間,或想提供可協助 Ethereum 開發者的機會,請建立 PR。", "page-developers-into-eth-desc": "區塊鏈和 Ethereum 簡介", - "page-developers-intro-ether-desc": "加密貨幣及以太 (ETH) 簡介", + "page-developers-intro-ether-desc": "加密貨幣及以太幣簡介", "page-developers-intro-dapps-desc": "去中心化應用程式簡介", "page-developers-intro-dapps-link": "去中心化應用程式簡介", "page-developers-intro-eth-link": "Ethereum 簡介", @@ -60,7 +60,7 @@ "page-developers-node-clients-desc": "如何在網路中驗證區塊和異動", "page-developers-node-clients-link": "節點和用戶端", "page-developers-oracle-desc": "將鏈外資料傳入智慧型合約", - "page-developers-oracles-link": "Oracles", + "page-developers-oracles-link": "預言機", "page-developers-play-code": "程式碼大觀", "page-developers-read-docs": "閱讀文件", "page-developers-scaling-desc": "快速異動解決方案", @@ -75,7 +75,7 @@ "page-developers-start": "開始實驗", "page-developers-start-desc": "想先實驗再提問嗎?", "page-developers-storage-desc": "如何處理去中心化應用程式存放區", - "page-developers-storage-link": "存儲", + "page-developers-storage-link": "儲存", "page-developers-subtitle": "Ethereum 建置者手冊。取之於建置者,用之於建置者。", "page-developers-title-1": "Ethereum", "page-developers-title-2": "開發者", @@ -85,7 +85,7 @@ "page-developers-transactions-desc": "Ethereum 說明變更的方式", "page-developers-transactions-link": "異動", "page-developers-web3-desc": "開發的 web3 世界有何不同", - "page-developers-web3-link": "Web2 vs Web3", + "page-developers-web3-link": "Web2 與 Web3", "page-developers-networking-layer": "網路層", "page-developers-networking-layer-link": "網路層", "page-developers-networking-layer-desc": "以太坊網路層的簡介", diff --git a/src/intl/zh-tw/page-eth.json b/src/intl/zh-tw/page-eth.json index e09471b6a72..12940f5e18e 100644 --- a/src/intl/zh-tw/page-eth.json +++ b/src/intl/zh-tw/page-eth.json @@ -5,7 +5,7 @@ "page-eth-collectible-tokens": "可收藏代幣", "page-eth-collectible-tokens-desc": "可以用來表示可收藏的遊戲道具、數位藝術品、或其他獨特資產的代幣,一般被人們稱為非同質性代幣 (NFT)。", "page-eth-cryptography": "以密碼學保護", - "page-eth-cryptography-desc": "網路貨幣雖然新,但是受可靠的加密技術所保護。它能保障你的錢包、以太幣 (ETH)、及交易。", + "page-eth-cryptography-desc": "網路貨幣雖然新,但是受可靠的加密技術所保護。它能保障你的錢包、以太幣及交易。", "page-eth-currency-for-apps": "以太坊應用程式通用貨幣。", "page-eth-currency-for-future": "屬於未來數位世界的貨幣", "page-eth-description": "以太幣是加密貨幣,是類似比特幣的數位貨幣。如果你剛接觸加密貨幣,以下介紹以太幣與傳統貨幣的差別。", diff --git a/src/intl/zh-tw/page-gas.json b/src/intl/zh-tw/page-gas.json new file mode 100644 index 00000000000..088307b5769 --- /dev/null +++ b/src/intl/zh-tw/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "以太坊上的燃料費:它們如何運作?", + "page-gas-meta-description": "瞭解以太坊上的燃料:它們如何運作以及如何節省燃料費", + "page-gas-hero-title": "燃料費", + "page-gas-hero-header": "網路費用", + "page-gas-hero-button-1-content": "什麼是燃料?", + "page-gas-hero-subtitle-1": "以太坊上的網路費用稱爲燃料。", + "page-gas-hero-subtitle-2": "燃料驅動以太坊運作。", + "page-gas-summary-title": "總結", + "page-gas-summary-item-1": "以太坊上的每一筆交易都需要支付一小筆處理費用", + "page-gas-summary-item-2": "這些費用被稱爲“燃料”費", + "page-gas-summary-item-3": "燃料費會根據網路壅塞情況而產生變化", + "page-gas-what-are-gas-fees-header": "什麽是燃料費?", + "page-gas-what-are-gas-fees-text-1": "想像人們可以在以太坊這個龐大的電腦網路裏執行發送訊息或運行程式等任務。猶如現實世界一樣,這些任務需要能量來完成操作。", + "page-gas-what-are-gas-fees-text-2": "在以太坊中,每個運算操作都有對應的「燃料」費用。你的燃料費為該交易的操作費用總和。當你發送交易或執行智慧型合約時,你需要支付燃料費以完成操作。", + "page-gas-how-do-i-pay-less-gas-header": "如何節省燃料?", + "page-gas-how-do-i-pay-less-gas-text": "儘管以太坊的高額費用有時候是無可避免的,但你可以采用以下策略來降低費用:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "安排你的交易時間", + "page-gas-how-do-i-pay-less-gas-card-1-description": "就如同在非高峰期旅行不那麼擁擠且更爲經濟實惠一樣,當北美地區處於夜間休息的時候使用以太坊通常會更為便宜。", + "page-gas-how-do-i-pay-less-gas-card-2-title": "等待燃料價格降低", + "page-gas-how-do-i-pay-less-gas-card-2-description": "以太坊的燃料價格根據網路壅塞情況以每十二秒上下波動。當燃料價格偏高時,等待幾分鐘再進行交易可能會大幅度降低你需要支付的費用。", + "page-gas-how-do-i-pay-less-gas-card-3-title": "使用二層網路", + "page-gas-how-do-i-pay-less-gas-card-3-description": "二層網路區塊鏈建立在以太坊上,費用更低且能處理更多的交易。對於沒必要在以太坊主網路上進行的交易來説,二層網路是節省費用的佳選。", + "page-gas-try-layer-2": "嘗試二層網路", + "page-gas-what-causes-high-gas-fees-header": "什麽原因導致高燃料費?", + "page-gas-what-causes-high-gas-fees-text-1": "每當以太坊上的運算量(燃料)超過特定閾值時,燃料費就會開始上升。燃料超過這個閾值越多,燃料費增加得越快。", + "page-gas-what-causes-high-gas-fees-text-2": "高額費用可能是由諸如受歡迎的去中心化應用程式或非同質化代幣、去中心化交易所上周期性增加的交易量,或者高峰時段使用者活動量過大等因素所引起。", + "page-gas-what-causes-high-gas-fees-text-3": "以太坊上的開發者應該在部署其智慧型合約之前注意優化合約的使用。如果許多人使用編寫不佳的智慧型合約,這將消耗更多燃料并可能無意中導致網路壅塞。", + "page-gas-want-to-dive-deeper": "想要更深入瞭解嗎?", + "page-gas-check-out-the-developer-docs": "查看開發者文件。", + "page-gas-attack-of-the-cryptokitties-header": "謎戀貓的衝擊", + "page-gas-attack-of-the-cryptokitties-text": "2017 年 11 月,大受歡迎的謎戀貓專案啓動。迅速增長的人氣導致了嚴重的網路壅塞和極高的燃料費用。謎戀貓所帶來的挑戰加劇了以太坊尋找擴容解決方案的緊迫性。", + "page-gas-why-do-we-need-gas-header": "爲什麽我們需要燃料?", + "page-gas-why-do-we-need-gas-text": "燃料是保持以太坊安全和處理交易的關鍵元素。燃料在多個方面起著作用:", + "page-gas-benefits-1-description": "燃料透過防止惡意行爲者利用欺詐活動壓垮網路來維持以太坊抵禦女巫攻擊。", + "page-gas-benefits-2-description": "由於執行運算需要消耗燃料,因此無論是意外還是惡意,在以太坊上頻繁進行昂貴的交易,從經濟角度上終將難以承受。", + "page-gas-benefits-3-description": "時時刻刻對執行運算設定一個硬性上限可防止以太坊不堪重負,有助於確保網路存取始終無障礙。", + "page-gas-how-is-gas-calculated-header": "如何計算燃料?", + "page-gas-advanced": "進階", + "page-gas-how-is-gas-calculated-text-1": "你支付的總燃料費由幾個部份組成:", + "page-gas-how-is-gas-calculated-item-1": "基本費用:網路設定的必須支付的交易費用", + "page-gas-how-is-gas-calculated-item-2": "優先費:爲了激勵節點營運商包含你的交易而支付的可選小費", + "page-gas-how-is-gas-calculated-item-3": "燃料使用單位*記得我們説過燃料代表著執行的計算嗎?較爲複雜的操作(例如與智慧型合約的互動)比簡單的操作(如傳送交易)使用更多燃料。", + "page-gas-how-is-gas-calculated-list-item-1": "* 請參閲圖 1 以瞭解不同類型的交易使用多少燃料", + "page-gas-how-is-gas-calculated-text-2": "計算燃料費的公式是燃料使用單位 *(基本費用 + 優先費)。大多數錢包會計算燃料使用量并以更直觀的方式顯示。", + "page-gas-table-figure": "圖1:按交易類型所使用的燃料", + "page-gas-table-header-1": "交易類型", + "page-gas-table-header-2": "燃料使用單位", + "page-gas-table-item-1-transaction-type": "傳送以太幣", + "page-gas-table-item-2-transaction-type": "傳送 ERC-20 代幣", + "page-gas-table-item-3-transaction-type": "轉移非同質化代幣", + "page-gas-table-item-4-transaction-type": "在 Uniswap 進行兌換", + "page-gas-faq-header": "常見問題", + "page-gas-faq-question-1-q": "誰將獲得我在交易中支付的燃料費?", + "page-gas-faq-question-1-a-1": "燃料費中的主要部分,也就是基本費用會被協議銷毀(燒毀)。至於優先費用,假如包含在你的交易裏,則將支付給提出你的交易的驗證者。", + "page-gas-faq-question-1-a-2": "你可以在燃料開發者文件中瞭解該過程的詳細説明。", + "page-gas-faq-question-2-q": "我需要用以太幣支付燃料費用嗎?", + "page-gas-faq-question-2-a-1": "是的。以太坊上的所有燃料費都必須使用原生以太幣貨幣支付。", + "page-gas-faq-question-2-a-2": "有關以太幣的更多資訊", + "page-gas-faq-question-3-q": "什麽是 Gwei?", + "page-gas-faq-question-3-a-1": "在大多數錢包或燃料追蹤器中,你會看到燃料價格以「Gwei」來表示。", + "page-gas-faq-question-3-a-2": "Gwei 只是以太幣的一個較小單位,就像美元中的分,不同的是 1 以太幣等於 10 億 Gwei。每當論及極小量的以太幣時就體現出 Gwei 的用途。", + "page-gas-use-layer-2": "使用二層網路" +} diff --git a/src/intl/zh-tw/page-get-eth.json b/src/intl/zh-tw/page-get-eth.json index 6f49aeba8f0..8b0d1073a16 100644 --- a/src/intl/zh-tw/page-get-eth.json +++ b/src/intl/zh-tw/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "交易所是讓你使用傳統法定貨幣以購買加密數位貨幣的企業。它們將負責保管你的以太幣,直到你將以太幣發送至由你實際控制的錢包地址。", "page-get-eth-checkout-dapps-btn": "查看去中心化應用程式", "page-get-eth-community-safety": "社群安全議題文章", - "page-get-eth-description": "以太坊和以太幣不被任何政府或組織所控制,而是去中心化的。這代表任何人均可使用以太幣。", + "page-get-eth-description": "去中心化的以太坊不受任何組織控制。", "page-get-eth-dex": "去中心化交易所 (DEX)", - "page-get-eth-dex-desc": "如果你希望握有更多控制權,透過點對點交易購買以太幣。透過去中心化交易所,你的資金就不受中心化公司的控制。", + "page-get-eth-dex-desc": "如果你希望握有更多控制權,請透過智慧型合約購買以太坊。透過去中心化交易所,你可以交易數位資產,資金就不受中心化公司控制。", + "page-get-eth-peers": "點對點接收以太幣", + "page-get-eth-peers-desc": "一但擁有以太坊帳戶,只需要分享地址就能開始點對點接收與傳送以太幣 (以及其他代幣)。", + "page-get-eth-staking": "質押酬勞", + "page-get-eth-staking-desc": "如果你已經有一些以太幣,可以透過執行驗證程式節點來賺取更多以太幣。你會因進行驗證工作獲得以太幣報酬。", + "page-get-eth-earn": "賺取以太幣", + "page-get-eth-earn-desc": "你可以透過為 DAO 或其他會支付加密貨幣的公司工作、贏得懸賞、找出軟體漏洞等方式賺取以太幣。", + "page-get-eth-daos-link-desc": "瞭解去中心化自治組織 (DAO)", + "page-get-eth-cex-link-desc": "查看交易所清單", + "page-get-eth-staking-link-desc": "深入瞭解質押", "page-get-eth-dexs": "去中心化交易所 (DEX)", "page-get-eth-dexs-desc": "去中心化交易所是用於交易以太幣或者其他代幣的開放自由市場,直接聯繫買賣雙方。", "page-get-eth-dexs-desc-2": "它們並非藉由可信任的第三方保障交易的資金安全,而是透過程式碼。只有付款確定時,以太幣才會從賣方轉出。這樣的程式碼被稱為「智慧型合約」。", - "page-get-eth-dexs-desc-3": "這代表與中心化的交易方案相比更不受地理限制。如果有人販賣你想要的商品,賣方也接受你可以使用的支付方式,那麼你就可以進行交易。去中心化交易所可以讓你購買以太幣的途徑包括:其他代幣、PayPal,甚至是親自用現金交易。", + "page-get-eth-dexs-desc-3": "這代表相較於中心化的交易方案更不受地理限制。如果有人販賣你想要的商品,賣方也接受你可以提供的支付方式,那麼你就可以進行交易。", "page-get-eth-do-not-copy": "此為範例:請勿複製", "page-get-eth-exchanges-disclaimer": "這些資訊是我們以人工收集,如果你發現錯誤,請發郵件給", - "page-get-eth-exchanges-empty-state-text": "輸入你所在的國家或地區,查看用於交易以太幣的錢包或交易所列表", + "page-get-eth-exchanges-empty-state-text": "輸入你所居住的國家或地區,查看你可使用的錢包與交易所清單", "page-get-eth-exchanges-except": "除此之外", "page-get-eth-exchanges-header": "請問你居住於哪個國家或地區?", "page-get-eth-exchanges-header-exchanges": "交易所", "page-get-eth-exchanges-header-wallets": "錢包", - "page-get-eth-exchanges-intro": "交易所與錢包對加密貨幣的販售地區有所限制。", + "page-get-eth-exchanges-intro": "交易所在銷售加密貨幣的地區都有一定的限制。這份是在各國加密貨幣服務的說明清單。納入此處並不代表推薦,請自行研究!", "page-get-eth-exchanges-no-exchanges": "抱歉,就我們所知,尚未有任何交易所可以讓你在此國家或地區購買任何以太幣。如果你找到,可以發送郵件給", - "page-get-eth-exchanges-no-exchanges-or-wallets": "抱歉,就我們所知,尚未有任何交易所或錢包可以讓你在此國家購買以太幣。如果你找到,請通知我們", + "page-get-eth-exchanges-no-exchanges-or-wallets": "抱歉,就我們所知,尚未有任何交易所可以讓你在此國家或地區購買任何以太幣。如果你找到,可以發送郵件給", "page-get-eth-exchanges-no-wallets": "抱歉,就我們所知,尚未有任何錢包讓你可以在此國家購買以太幣。如果你找到,可以發送郵件給", "page-get-eth-exchanges-search": "輸入你的居住地...", "page-get-eth-exchanges-success-exchange": "根據不同交易所的法規要求,你在交易所的註冊請求可能需要等待幾天才能通過。", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "取得以太幣主頁橫幅圖檔", "page-get-eth-keep-it-safe": "讓你的以太幣保持安全", "page-get-eth-meta-description": "如何根據你的居住地購買以太幣,以及如何管理的相關建議。", - "page-get-eth-meta-title": "如何購買以太幣", + "page-get-eth-meta-title": "如何取得以太幣", "page-get-eth-need-wallet": "你必須擁有錢包,才能使用去中心化交易所。", "page-get-eth-new-to-eth": "剛開始接觸以太幣?這裡有一份入門指南。", "page-get-eth-other-cryptos": "使用其他加密貨幣購買", - "page-get-eth-protect-eth-desc": "如果你打算購買大量以太幣,你最好儲存在自己控制的錢包,而非交易所。因為交易所更可能遭受駭客攻擊。如果駭客取得存取權,你可能會遺失資金。所以,最好存儲在只有你自己擁有控制權的錢包。", - "page-get-eth-protect-eth-in-wallet": "使用錢包保護你的以太幣", + "page-get-eth-protect-eth-desc": "以太坊的主要特點之一,就是可以透過管理自己的帳戶來掌控個人資產。這表示你毋須將資產託付給第三方,並且可以防止受託人不誠實行為、破產或被駭的風險,不過這也表示你需自行承擔保護個人資產安全的責任。", + "page-get-eth-protect-eth-in-wallet": "將以太幣保存在你自己的錢包裡", "page-get-eth-search-by-country": "根據國家或地區搜尋", - "page-get-eth-security": "然而,這也代表你必須認真維護資金安全。不要信任銀行代管你的以太幣,你只能相信自己。", + "page-get-eth-security": "這代表你必須正視資金安全。 有了以太幣,你並非依賴銀行或公司來保管資產,而是自行承擔這個責任。", "page-get-eth-smart-contract-link": "了解更多關於智慧型合約的資訊", "page-get-eth-swapping": "用你的代幣與他人交易以太幣,反之亦然。", "page-get-eth-try-dex": "嘗試使用去中心化交易所", "page-get-eth-use-your-eth": "使用你的以太幣", "page-get-eth-use-your-eth-dapps": "現在,你已經持有了一些以太幣。你可以查看一些以太坊應用程式(去中心化應用程式)。去中心化應用程式涵蓋金融、社群媒體、遊戲,還有很多其他領域。", "page-get-eth-wallet-instructions": "遵循錢包使用指南", - "page-get-eth-wallet-instructions-lost": "如果你失去錢包的存取權,你會將無法取得資金。你的錢包應該要提供如何預防這種情況的指示。確保仔細跟從這些指示 – 在大多數情況,如果失去錢包存取權沒有人能幫助你。", + "page-get-eth-wallet-instructions-lost": "如果你失去帳戶存取權,將無法取回資金。你的錢包應該會提供防止這種情況發生的指示。請仔細遵循:在大多數情況下,若失去帳戶存取權,就沒有人能夠協助你取回。", "page-get-eth-wallets": "錢包", "page-get-eth-wallets-link": "更多關於錢包的說明", "page-get-eth-wallets-purchasing": "某些錢包讓你可以透過簽帳卡/信用卡,銀行轉帳甚至 Apple Pay 購買加密貨幣。當然,這些方法具有地域限制。", - "page-get-eth-warning": "這些去中心化交易所需要你持有一定的以太幣才能使用,因此不適合初學者。", + "page-get-eth-warning": "這些去中心化交易所需要擁有一些以太幣才可進行交易,可能不適合新手。這裡列出的只是範例,並非推薦。請務必自行做好研究!", "page-get-eth-what-are-DEX's": "去中心化交易所是什麼?", "page-get-eth-whats-eth-link": "以太幣是什麼?", - "page-get-eth-where-to-buy-desc": "你可以通過交易所或者錢包直接購買以太幣。", + "page-get-eth-where-to-buy-desc": "你可以賺取以太坊,點對點接收或從交易所與應用程式購買。", "page-get-eth-where-to-buy-desc-2": "搜索你的居住地有哪些可用服務。", - "page-get-eth-where-to-buy-title": "哪裡可以購買以太幣", + "page-get-eth-where-to-buy-title": "哪裡可以取得以太幣", "page-get-eth-your-address": "你的以太幣位址", "page-get-eth-your-address-desc": "在你下載錢包時,為你建立一個公開的以太幣位址,如下圖為一範例:", "page-get-eth-your-address-desc-3": "請將其想像為電子郵件地址,但是接收的是以太幣而非郵件。如果你想要將以太幣從交易所轉移到你的錢包,使用你的位址作為目的地。發送前請記得檢查!", diff --git a/src/intl/zh-tw/page-languages.json b/src/intl/zh-tw/page-languages.json index d43af4377e0..d0f9cc61808 100644 --- a/src/intl/zh-tw/page-languages.json +++ b/src/intl/zh-tw/page-languages.json @@ -11,12 +11,7 @@ "page-languages-want-more-header": "想查看 ethereum.org 其他語言版本嗎?", "page-languages-want-more-link": "翻譯計畫", "page-languages-want-more-paragraph": "ethereum.org 的譯者不斷地翻譯盡可能多種的語言頁面。想要查看他們目前的工作計畫或註冊成為他們的一員,請閱讀我們的", - "page-languages-filter-label": "篩選條件清單", - "page-languages-filter-placeholder": "輸入以進行篩選", - "page-languages-browser-default": "預設瀏覽器", - "page-languages-translated": "已翻譯", - "page-languages-words": "字數", - "page-languages-recruit-community": "幫助我們翻譯 ethereum.org 網站。", + "page-languages-filter-placeholder": "篩選條件", "langauge-am": "阿姆哈拉文", "language-ar": "阿拉伯文", "language-az": "亞塞拜然文", diff --git a/src/intl/zh-tw/page-layer-2.json b/src/intl/zh-tw/page-layer-2.json index 942c05bf623..3b74c548b5f 100644 --- a/src/intl/zh-tw/page-layer-2.json +++ b/src/intl/zh-tw/page-layer-2.json @@ -16,7 +16,7 @@ "layer-2-what-is-layer-2-1": "二層網路 (L2) 為描述一系列特定的以太坊擴容解決方案的統稱。二層網路為一條擴展以太坊,並承襲以太坊安全性保證的獨立區塊鏈。", "layer-2-what-is-layer-2-2": "現在讓我們再深入一點。為此,我們得先解釋一層網路 (L1)。", "layer-2-what-is-layer-1-title": "什麼是一層網路?", - "layer-2-what-is-layer-1-1": "一層網路是區塊鏈的底層。以太坊與比特幣皆屬於一層網路的區塊鏈,因為它們是整個網路的基石,讓各式各樣的二層網路得以建立在它們之上。二層網路項目的例子包括以太坊上的「卷軸」和基於比特幣的閃電網路。這些二層網路項目上的所有使用者交易活動最終都可以傳輸回一層網路區塊鏈。", + "layer-2-what-is-layer-1-1": "一層網路是區塊鏈的底層。以太坊與比特幣皆屬於一層網路的區塊鏈,因為它們是整個網路的基石,讓各式各樣的二層網路得以建立在它們之上。二層網路專案的例子包括以太坊上的「卷軸」和基於比特幣的閃電網路。這些二層網路專案上的所有使用者交易活動最終都可以傳輸回一層網路區塊鏈。", "layer-2-what-is-layer-1-2": "以太坊還充當二層網路的資料可用層。二層網路方案會將他們的交易資料發佈到以太坊上,依賴以太坊實現資料可用性。這些資料可以用來確認二層網路的狀態,或對二層網路上的交易提出爭議。", "layer-2-what-is-layer-1-list-title": "以太坊作為一層網路還包括:", "layer-2-what-is-layer-1-list-1": "節點操作者網路用於維護和驗證網路", @@ -47,7 +47,7 @@ "layer-2-rollups-2": "卷軸交易會在一層網路以外執行,但交易資料會提交到一層網路。透過將交易資料提交至一層網路,卷軸繼承了以太坊的安全性。這是因為一旦資料上傳至一層網路,要還原卷軸交易就得還原整個以太坊。目前有兩種不同的卷軸:樂觀卷軸與零知識卷軸 - 它們的主要差異就在於將此交易資料提交至一層網路的方式。", "layer-2-optimistic-rollups-title": "樂觀卷軸", "layer-2-optimistic-rollups-description": "樂觀卷軸之所以「樂觀」是因為其假定交易皆有效,但可以在必要時提出質疑。如果懷疑某交易無效,便會進行錯誤性證明,驗證是否發生無效交易。", - "layer-2-optimistic-rollups-childSentance": "關於樂觀卷軸的更多資訊", + "layer-2-optimistic-rollups-childSentance": "更多樂觀卷軸相關資訊", "layer-2-zk-rollups-title": "零知識證明卷軸", "layer-2-zk-rollups-description": "零知識證明卷軸使用有效性證明,其交易在鏈下計算,然後將壓縮後的資料提供給以太坊主網作為有效性證明。", "layer-2-zk-rollups-childSentance": "關於零知識證明卷軸的更多資訊", @@ -99,7 +99,7 @@ "layer-2-faq-question-2-description-1": "樂觀和零知識證明卷軸均可以將數百筆交易綑綁(或稱「打包」)為一層網路上的單筆交易。打包交易於一層網路之外執行,但交易資料會發布到一層網路。", "layer-2-faq-question-2-description-2": "主要區別在於將哪些資料發佈到一層網路以及如何驗證資料。有效性證明(用於零知識證明卷軸)在鏈外運行計算並發布證明,而錯誤性證明(用於樂觀卷軸)僅在懷疑存在錯誤且必須檢查錯誤時才在鏈上運行計算。", "layer-2-faq-question-2-description-3": "目前,大部分零知識證明卷軸是特定於應用程式的,而樂觀卷軸則基本上可以被廣泛應用。", - "layer-2-more-info-on-optimistic-rollups": "關於樂觀卷軸的更多資訊", + "layer-2-more-info-on-optimistic-rollups": "更多樂觀卷軸相關資訊", "layer-2-more-info-on-zk-rollups": "關於零知識卷軸的更多資訊", "layer-2-faq-question-4-title": "二層網路的風險是什麼?", "layer-2-faq-question-4-description-1": "與在以太坊主網上持有資產和直接交易相比,二層網路計畫有著額外的風險。例如,定序器可能出現故障,那你就得等待其恢復正常才能夠存取資金。", @@ -123,6 +123,7 @@ "zksync-description": "zkSync 是由 Matter Labs 推出的以使用者為中心的零知識證明卷軸平台。它是一種以太坊擴容解決方案,已在以太坊主網上線。它支援付款、交換代幣和鑄造非同質化代幣。", "zkspace-description": "ZKSpace 平台由三個主要部分所組成:使用零知識證明卷軸技術建立的二層網路自動化做市商去中心化交易所(名為 ZKSwap);名為 ZKSquare 的支付服務;以及名為 ZKSea 的非同質化代幣交易市場。", "aztec-description": "Aztec 網路是第一個在以太坊上的私有零知識證明卷軸,使去中心化應用程式能存取隱私和擴張。", + "starknet-description": "Starknet 是一個驗證卷軸二層網路。它不僅提供高流量、低燃料成本,并且保持了以太坊一層網路的安全等級。", "layer-2-note": "備註:", "layer-2-ecosystem-portal": "生態系統相關入口網站", "layer-2-token-lists": "代幣清單", diff --git a/src/intl/zh-tw/page-learn.json b/src/intl/zh-tw/page-learn.json index e53df8c1009..53bc8ce6b30 100644 --- a/src/intl/zh-tw/page-learn.json +++ b/src/intl/zh-tw/page-learn.json @@ -3,7 +3,7 @@ "toc-what-is-crypto-ethereum": "什麼是以太坊?", "toc-how-do-i-use-ethereum": "我應如何使用以太坊?", "toc-what-is-ethereum-used-for": "以太坊的用途是什麼?", - "toc-strengthen-the-ethereum-network": "強化以太坊網絡", + "toc-strengthen-the-ethereum-network": "強化以太坊網路", "toc-learn-about-the-ethereum-protocol": "了解以太坊協議", "toc-learn-about-the-ethereum-community": "了解以太坊社群", "toc-books-and-podcasts": "書與播客", @@ -11,7 +11,7 @@ "hero-subtitle": "你進入以太坊世界的學習指南,協助你理解以太坊的工作原理以及如何參與。本頁面包含了技術與非技術文章、指南和相關資源。", "hero-button-lets-get-started": "開始吧", "what-is-crypto-1": "你可能有聽過加密貨幣、區塊鏈跟比特幣。下方連結可以幫助你學習這些概念,並了解它們與以太坊的關聯性。", - "what-is-crypto-2": "加密貨幣(如比特幣)使任何人都可以轉帳至全世界。以太坊也可以做到這點,而同時,以太坊還可以執行程式碼,讓人們可以創造應用程式和機構。以太坊既有韌性又有彈性,任何電腦程式都能在以太坊上執行。了解詳細資訊及如何加入:", + "what-is-crypto-2": "加密貨幣(如比特幣)讓任何人都可以轉帳至全世界。以太坊也可以,它還能運行程式碼,使人們建立應用程式和組織。它兼具彈性與靈活性:任何電腦程式都可在以太坊上運行。了解更多詳細資訊以及如何開始:", "what-is-ethereum-card-title": "Ethereum 是什麼呢?", "what-is-ethereum-card-description": "如果你初來乍到,請從了解以太坊的重要性開始。", "what-is-ethereum-card-image-alt": "插圖:一人窺視象徵以太坊的市集。", diff --git a/src/intl/zh-tw/page-roadmap-vision.json b/src/intl/zh-tw/page-roadmap-vision.json index b36dbd54a71..6b5c3ef97c9 100644 --- a/src/intl/zh-tw/page-roadmap-vision.json +++ b/src/intl/zh-tw/page-roadmap-vision.json @@ -15,7 +15,7 @@ "page-roadmap-vision-scalability": "可擴容性", "page-roadmap-vision-scalability-desc": "以太坊需要在不增加網路節點大小的情況下,提高每秒處理的交易量。節點是儲存和運行區塊鏈的重要網路參與者。增加節點大小不切實際,因為只有擁有強大且昂貴電腦的人才能做到這一點。若要擴容,以太坊每秒需要處理更多的交易以及更多的節點。更多節點意味著更高的安全性。", "page-roadmap-vision-scalability-desc-3": "二層網路卷軸透過將交易移至鏈下並僅將摘要資料發佈到以太坊來實現以太坊擴容。這種批次處理方式增加了以太坊的吞吐量,並大幅降低了使用者的成本。", - "page-roadmap-vision-scalability-desc-4": "卷軸需要一層網路上的低成本儲存空間,讓使用者的交易盡可能便宜。這將以附加到以太坊區塊的二進制大對象的形式提供。最終,許多二進制大對象將附加到以太坊區塊上,為許多卷軸提供廉價的儲存空間。", + "page-roadmap-vision-scalability-desc-4": "卷軸需要一層網路上的低成本儲存空間,讓使用者的交易盡可能便宜。這將以附加到以太坊區塊的二進位大型物件的形式提供。最終,許多二進位大型物件將附加到以太坊區塊上,為許多卷軸提供廉價的儲存空間。", "page-roadmap-vision-security": "安全性", "page-roadmap-vision-security-desc": "計劃中的升級可提高以太坊對協同攻擊的安全性。", "page-roadmap-vision-security-desc-3": "在權益證明中,額外的安全性來自於針對攻擊的更強大加密經濟抑制措施。這是因為,在權益證明中,保護網路安全的驗證者必須將大量以太幣質押到協定中。若他們嘗試攻擊網路,協定可以自動銷毀其以太幣。", @@ -37,31 +37,31 @@ "page-roadmap-vision-title-2": "硬碟空間", "page-roadmap-vision-title-3": "太多能源", "page-roadmap-vision-trilemma-cardtext-1": "以太坊升級將使以太坊具可擴容性、安全性和去中心化性。質押降低了參與門檻並限制了規模經濟,建立了一個更大、更去中心化的網路。", - "page-roadmap-vision-trilemma-cardtext-2": "安全且去中心化的區塊鏈網路要求每個節點驗證鏈處理的每筆交易。這項龐大的工作量限制了在任何給定時間可以發生的交易數量。去中心化和安全性反映當今的以太坊鏈。", + "page-roadmap-vision-trilemma-cardtext-2": "安全且去中心化的區塊鏈網路要求每個節點驗證鏈處理的每筆交易。這項龐大的工作量限制了在任何給定時間可以進行的交易數量。去中心化和安全性體現了當今的以太坊鏈。", "page-roadmap-vision-trilemma-cardtext-3": "去中心化網路透過橫跨全節點傳送交易資訊運作 -- 全網路必須知道任何狀態變化。在去中心化網路中提升每秒交易量會帶來安全風險,因為交易越多,延遲越長,資訊傳輸時受到攻擊的可能性就越高。", "page-roadmap-vision-trilemma-cardtext-4": "增加以太坊節點的規模和處理能力能夠以安全的方式提高每秒的交易量,但硬體需求將限制誰可以做到這一點 - 這威脅到去中心化。希望分片和權益證明能夠讓以太坊透過增加節點數量(而不是節點大小)來實現擴容。", "page-roadmap-vision-trilemma-h2": "去中心化擴容之挑戰", "page-roadmap-vision-trilemma-modal-tip": "點擊下面圓圈可以更好地理解去中心化擴容的問題", "page-roadmap-vision-trilemma-p": "解決以太坊問題的一個簡單方法是使其更加中心化。但去中心化太重要了。正是去中心化賦予了以太坊中立性、抗審查性、開放性、資料所有權和近乎牢不可破的安全性。", "page-roadmap-vision-trilemma-p-1": "以太坊的願景是提高可擴容性和安全性,同時保持去中心化。要實現這三個特質是一個稱為可擴容性三難困境的問題。", - "page-roadmap-vision-trilemma-p-2": "以太坊的升級致力於解決這個三難問題,但是面臨很大的挑戰。", - "page-roadmap-vision-trilemma-press-button": "點擊三角按鈕來瞭解去中心化擴容之難題。", + "page-roadmap-vision-trilemma-p-2": "以太坊升級致力於解決這個三難問題,但是面臨很大的挑戰。", + "page-roadmap-vision-trilemma-press-button": "點擊三角形上的按鈕來更好地瞭解去中心化擴容之難題。", "page-roadmap-vision-trilemma-text-1": "去中心化", "page-roadmap-vision-trilemma-text-2": "安全性", "page-roadmap-vision-trilemma-text-3": "可擴容性", - "page-roadmap-vision-trilemma-title-1": "探索可擴容性三角難題", + "page-roadmap-vision-trilemma-title-1": "探索可擴容性三難困境", "page-roadmap-vision-trilemma-title-2": "以太坊升級及去中心化擴容", "page-roadmap-vision-trilemma-title-3": "安全性及去中心化", "page-roadmap-vision-trilemma-title-4": "去中心化及可擴容性", - "page-roadmap-vision-trilemma-title-5": "可擴容及安全性", + "page-roadmap-vision-trilemma-title-5": "可擴容性及安全性", "page-roadmap-vision-understanding": "瞭解以太坊願景", "page-roadmap-vision-upgrade-needs": "升級的必要性", - "page-roadmap-vision-upgrade-needs-desc": "2015 年推出的以太坊協定取得了令人難以置信的成功。但以太坊社群始終預計,需要進行一些關鍵升級才能釋放以太坊的全部潛力。", - "page-roadmap-vision-upgrade-needs-desc-2": "高需求正在推高交易費用,使得以太坊對一般使用者來說變得昂貴。執行以太坊用戶端所需的硬碟空間以非常快的速率增加。", - "page-roadmap-vision-upgrade-needs-desc-3": "以太坊的一系列升級將解決這些難題和其他問題。這套升級的初始代號為「寧靜」和「Eth2」,自 2014 年以來就已經成為一個研究和開發的活躍領域。", + "page-roadmap-vision-upgrade-needs-desc": "2015 年推出的以太坊協定取得了令人難以置信的成功。但以太坊社群始終期望,需要進行一些關鍵升級才能釋放以太坊的全部潛力。", + "page-roadmap-vision-upgrade-needs-desc-2": "高需求正在推高交易費,使得以太坊對一般使用者來說變得昂貴。執行以太坊用戶端所需的硬碟空間飛速增長。", + "page-roadmap-vision-upgrade-needs-desc-3": "以太坊的一系列升級將解決這些難題和其他問題。這一系列升級的初始代號為「寧靜」和「以太坊 2」,自 2014 年以來就已經成為研究和開發的活躍領域。", "page-roadmap-vision-upgrade-needs-desc-5": "既然這項技術已經成熟,這些升級將重新建構以太坊,使其更具可擴容性、安全性和永續性,使現有使用者的生活變得更好並吸引新使用者。這一切都不會改變以太坊去中心化的核心價值。", "page-roadmap-vision-upgrade-needs-desc-6": "這意味著實現以太坊的可擴容性並非一蹴而就之事。改進會隨著時間的推移逐步實現。", - "page-roadmap-vision-upgrade-needs-serenity": "檢視 2015 年的一篇探討「寧靜」的部落格", + "page-roadmap-vision-upgrade-needs-serenity": "檢視 2015 年的一篇探討「寧靜」的部落格文章", "ethereum": "Ethereum", - "page-roadmap-vision-danksharding": "有關分片的更多資訊" + "page-roadmap-vision-danksharding": "更多分片相關資訊" } diff --git a/src/intl/zh-tw/page-run-a-node.json b/src/intl/zh-tw/page-run-a-node.json index ab53553afae..9c5c0450be6 100644 --- a/src/intl/zh-tw/page-run-a-node.json +++ b/src/intl/zh-tw/page-run-a-node.json @@ -5,8 +5,8 @@ "page-run-a-node-build-your-own-min-ram": "4 到 8 GB 隨機存取記憶體", "page-run-a-node-build-your-own-ram-note-1": "查看有關權益質押的注意事項", "page-run-a-node-build-your-own-ram-note-2": "查看對於樹莓派設備的注意事項", - "page-run-a-node-build-your-own-min-ssd": "2 TB 固態硬盤", - "page-run-a-node-build-your-own-ssd-note": "需要固態硬盤滿足寫入速度。", + "page-run-a-node-build-your-own-min-ssd": "2 TB 固態硬碟", + "page-run-a-node-build-your-own-ssd-note": "需要固態硬碟滿足寫入速度。", "page-run-a-node-build-your-own-recommended": "推薦配置", "page-run-a-node-build-your-own-nuc": "第 7 代或更高版本的英特爾 NUC", "page-run-a-node-build-your-own-nuc-small": "x86 處理器", diff --git a/src/intl/zh-tw/page-stablecoins.json b/src/intl/zh-tw/page-stablecoins.json index 32838bf5fdb..01a8b17d725 100644 --- a/src/intl/zh-tw/page-stablecoins.json +++ b/src/intl/zh-tw/page-stablecoins.json @@ -63,7 +63,6 @@ "page-stablecoins-bank-apy-source-link": "來源", "page-stablecoins-bitcoin-pizza": "惡名昭彰的比特幣披薩", "page-stablecoins-bitcoin-pizza-body": "2010 年,有人以 10,000 比特幣購入 2 片披薩。當時這筆金額大約為 $41 美金,在今天價值上百萬美金。以太坊歷史上也有許多類似不堪回首的交易。穩定幣解決了這個問題,在你享用披薩的同時並保有你的以太幣。", - "page-stablecoins-category-dashboard-and-education": "儀表板和教育", "page-stablecoins-coin-price-change": "價格變化 (過去 30 天)", "page-stablecoins-crypto-backed": "由加密貨幣擔保", "page-stablecoins-crypto-backed-con-1": "與法定貨幣擔保穩定幣相比較為不安定。", @@ -129,6 +128,7 @@ "page-stablecoins-stablecoins-table-type-fiat-backed": "法定貨幣", "page-stablecoins-stablecoins-table-type-precious-metals-backed": "貴金屬", "page-stablecoins-table-error": "無法載入穩定幣,請嘗試更新頁面。", + "page-stablecoins-table-loading": "正在載入穩定幣資料...", "page-stablecoins-title": "穩定幣", "page-stablecoins-top-coins": "依據市值之穩定幣排名", "page-stablecoins-top-coins-intro": "市值為", diff --git a/src/intl/zh-tw/page-staking-deposit-contract.json b/src/intl/zh-tw/page-staking-deposit-contract.json index 26d18214d4a..734b704c2a9 100644 --- a/src/intl/zh-tw/page-staking-deposit-contract.json +++ b/src/intl/zh-tw/page-staking-deposit-contract.json @@ -3,7 +3,7 @@ "page-staking-deposit-contract-address-caption": "我們添加一些空格使得這個地址更容易閱讀", "page-staking-deposit-contract-address-check-btn": "查看存款合約地址", "page-staking-deposit-contract-checkbox1": "我已使用啟動面板來設定我的以太坊驗證者。", - "page-staking-deposit-contract-checkbox2": "我明白,我需要使用啟動面板來進行質押。簡單地向這個地址轉賬無法奏效。", + "page-staking-deposit-contract-checkbox2": "我明白,我需要使用啟動面板來進行質押。簡單地向這個地址轉帳無法奏效。", "page-staking-deposit-contract-checkbox3": "我將向其他來源核對存款合約地址。", "page-staking-deposit-contract-confirm-address": "確認展示地址", "page-staking-deposit-contract-copied": "已複製地址", @@ -16,13 +16,13 @@ "page-staking-deposit-contract-meta-title": "以太坊質押存款合約地址", "page-staking-deposit-contract-read-aloud": "大聲讀出地址", "page-staking-deposit-contract-reveal-address-btn": "展示地址", - "page-staking-deposit-contract-staking": "若要質押你的以太幣,你必須使用專屬的啟動面板產品並遵循指示。直接發送以太幣到此頁面上的地址,將不會使你成爲一個質押者,反而會導致交易失敗。", + "page-staking-deposit-contract-staking": "若要質押你的以太幣,你必須使用專屬的啟動面板產品並遵循指示。直接發送以太幣到此頁面上的地址,這並不會使你成爲一個質押者,反而會導致交易失敗。", "page-staking-deposit-contract-staking-check": "檢查這些來源", "page-staking-deposit-contract-staking-check-desc": "我們預計其中有很多的虛假地址和詐騙事件。為了安全起見,請按照此頁面上的地址核對你所使用的質押合約地址。我們建議你也使用其他可信來源進行複查。", "page-staking-deposit-contract-staking-more-link": "更多質押相關訊息", "page-staking-deposit-contract-stop-reading": "停止閲讀", "page-staking-deposit-contract-subtitle": "這是以太坊質押合約的地址。質押時,使用此頁面確認你正向正確的地址發送資金。", "page-staking-deposit-contract-warning": "仔細檢查每個字元。", - "page-staking-deposit-contract-warning-2": "向此地址發送資金將不會起作用,不會使你成為一個質押者。你必須遵循啟動面板的指示。", + "page-staking-deposit-contract-warning-2": "向此地址發送資金將不會起作用,並不會使你成為一個質押者。你必須遵循啟動面板的指示。", "page-staking-deposit-contract-title": "查看存款合約地址" } diff --git a/src/intl/zh-tw/page-staking.json b/src/intl/zh-tw/page-staking.json index dda278085d5..fb748c664eb 100644 --- a/src/intl/zh-tw/page-staking.json +++ b/src/intl/zh-tw/page-staking.json @@ -1,32 +1,32 @@ { "comp-withdrawal-comparison-current-title": "當前質押者", - "comp-withdrawal-comparison-current-li-1": "一些使用者可能在最初設置質押存款時提供了提款地址—這些用戶不需要進行其他操作", - "comp-withdrawal-comparison-current-li-2": "大多數質押者在初次存款時沒有提供提款地址,因此需要更新其提款憑據。質押啟動面板提供了有關如何執行此操作的說明", - "comp-withdrawal-comparison-current-p": "可以在此處輸入驗證者索引號,查看是否仍需要更新你的憑據(可以在你的客戶端日誌中找到):", + "comp-withdrawal-comparison-current-li-1": "一些使用者可能在最初設置質押存款時提供了提款地址—這些使用者不需要進行其他操作", + "comp-withdrawal-comparison-current-li-2": "大多數質押者在初次存款時沒有提供提款地址,因此需要更新其提款憑證。質押啟動面板提供了有關如何執行此操作的說明", + "comp-withdrawal-comparison-current-p": "可以在此處輸入驗證者索引號,查看是否仍需要更新你的憑證(可以在你的用戶端日誌中找到):", "comp-withdrawal-comparison-new-title": "新質押者(尚未存入)", - "comp-withdrawal-comparison-new-li-1": "默認情況下,希望自動啟用酬勞支付和提款功能的新質押者應在使用質押存款命令列介面工具生成驗證者金鑰時,提供他們控制的以太坊提款地址", + "comp-withdrawal-comparison-new-li-1": "預設情況下,希望自動啟用酬勞支付和提款功能的新質押者應在使用質押存款命令列介面工具生成驗證者金鑰時,提供他們控制的以太坊提款地址", "comp-withdrawal-comparison-new-li-2": "雖然並非必須,但如果在存款時如此操作,以後在解鎖資金時便無需更新這些金鑰", "comp-withdrawal-comparison-new-p": "質押啟動面板將指導你完成質押引導流程。", - "comp-withdrawal-comparison-new-link": "訪問質押啟動面板", + "comp-withdrawal-comparison-new-link": "造訪質押啟動面板", "comp-withdrawal-credentials-placeholder": "驗證者索引", - "comp-withdrawal-credentials-error": "糟糕!請核查驗證者索引號後重試。", - "comp-withdrawal-credentials-upgraded-1": "驗證者索引 {{validatorIndex}} 已準備好開始接收酬勞!", + "comp-withdrawal-credentials-error": "糟糕!請核查驗證者索引號後再重試。", + "comp-withdrawal-credentials-upgraded-1": "驗證者索引 {{validatorIndex}} 已準備開始接收酬勞!", "comp-withdrawal-credentials-upgraded-2": "鏈接至執行地址的提款憑證:", "comp-withdrawal-credentials-not-upgraded-1": "我們需要升級此驗證者。", "comp-withdrawal-credentials-not-upgraded-1-testnet": "我們需要升級此 Goerli 測試網驗證者。", "comp-withdrawal-credentials-not-upgraded-2": "程式升級說明現已發佈於質押啟動面板", "comp-withdrawal-credentials-verify-mainnet": "主網中驗證", "comp-withdrawal-credentials-verify-goerli": "Goerli 中驗證", - "page-staking-withdrawals-when": "已發布!", + "page-staking-withdrawals-when": "已上線!", "page-staking-image-alt": "質押啟動面板的 Rhino 吉祥物圖像。", "page-staking-benefits-1-title": "賺取酬勞", "page-staking-benefits-1-description": "有助於網路達成共識的行為將被給予酬勞。你將因爲運行軟體而獲得酬勞,此軟體將交易正確地分批到新區塊中並檢查其他驗證者的工作,因爲這會使得區塊鏈保持安全運作。", "page-staking-benefits-2-title": "提高安全性", "page-staking-benefits-2-description": "隨著更多的以太幣被質押,網路會變得更強大,因為需要更多的以太幣才能控制大部分網路。為了攻擊網路,你需要控制大多數驗證者,這意味著你需要控制系統中的大部分以太幣,那真的太多了!", "page-staking-benefits-3-title": "提高可持續性", - "page-staking-benefits-3-description": "質押者無須進行耗能的工作量證明計算,就可以參加網路保護工作,意味著質押節點可以極低的能耗,於較普通的硬體裏運行。", + "page-staking-benefits-3-description": "質押者無須進行耗能的工作量證明計算,就可以參加網路保護工作,意味著質押節點可以極低的能耗,於較普通的硬體運行。", "page-staking-benefits-3-link": "更多關於以太坊能源消耗的資訊", - "page-staking-description": "質押是指存入 32 個以太幣使驗證者軟體啟動的行為。作為驗證者,你將負責儲存資料、處理交易以及向區塊鏈添加新區塊。這將為所有人保證以太坊的安全,並在此過程中為你賺取新的以太幣。", + "page-staking-description": "質押是指存入 32 個以太幣使驗證者軟體啟動的行為。作為驗證者,你將負責儲存資料、處理交易,並向區塊鏈添加新區塊。這將為所有人保證以太坊的安全,並在此過程中為你賺取新的以太幣。", "page-staking-hero-title": "如何質押你的以太幣", "page-staking-hero-header": "保護以太坊的同時賺取酬勞", "page-staking-hero-subtitle": "質押是以太坊生態系統的公共財產。任何擁有任意數量以太幣的使用者都可以幫助保護網路安全並在此過程中賺取酬勞。", @@ -64,8 +64,8 @@ "page-staking-hierarchy-saas-pill-2": "你的驗證者金鑰", "page-staking-hierarchy-saas-pill-3": "委托節點運作", "page-staking-hierarchy-saas-p1": "如果你不想或不喜歡處理硬體,但仍想質押你的 32 個以太幣,質押即服務方案允許你在獲得原生區塊酬勞的同時委派困難的部分。", - "page-staking-hierarchy-saas-p2": "這些選項通常會引導你建立一組驗證者憑證,將你的簽名金輪上傳到這些憑證,並存入你的 32 個以太幣。這允許服務代表你進行驗證。", - "page-staking-hierarchy-saas-p3": "這種質押方法需要對服務提供商有一定程度的信任。為了限制對方的風險,提取以太幣的金輪通常由你自己保管。", + "page-staking-hierarchy-saas-p2": "這些選項通常會引導你建立一組驗證者憑證,將你的簽名金鑰上傳到這些憑證,並存入你的 32 個以太幣。這允許服務代表你進行驗證。", + "page-staking-hierarchy-saas-p3": "這種質押方法需要對服務提供商有一定程度的信任。為了限制對方的風險,提取以太幣的金鑰通常由你自己保管。", "page-staking-hierarchy-pools-pill-1": "質押任意數量", "page-staking-hierarchy-pools-pill-2": "賺取酬勞", "page-staking-hierarchy-pools-pill-3": "簡化程序", @@ -79,14 +79,14 @@ "page-staking-hierarchy-cex-pill-2": "最高信任假設", "page-staking-hierarchy-cex-p1": "如果你不想在自己的錢包中持有以太幣,許多中心化交易所可以提供質押服務。中心化交易所可以作為備用方案,只需花費你極少的監督或精力,就能讓你從持有的以太幣中賺取一些收益。", "page-staking-hierarchy-cex-p2": "這裡需要權衡的是,中心化提供商將大量的以太幣匯集成質押礦池,以此來運行大量的驗證者節點。這對網路及其使用者來說可能是危險的,因為它形成了一個大型的集中目標和故障點,使得網路更容易受到攻擊、產生漏洞。", - "page-staking-hierarchy-cex-p3": "如果你不願意持有自己的金輪,那也沒關係。有這些方案供你選擇。同時,請考慮查看我們的錢包頁面,開始學習如何真正保障自己的資金安全。當你準備好後,回到此頁面,嘗試所提供的自行保管聯合質押服務,提高你的質押水平。", - "page-staking-hierarchy-subtext": "你可能已經注意到,參與以太坊質押的方式有很多種。這些方案針對廣泛的使用者,最終每個方案都是獨一無二的,並且在風險、酬勞和信任假設方面各不相同。有些比其他的更去中心化、更久經考驗和/或風險更大。我們提供了有關該領域熱門方案的一些資訊,但在向任何位置發送以太幣之前,一定要自己做研究。", - "page-staking-comparison-solo-saas": "即使有了質押即服務提供商,你仍然需要存入 32 個以太幣,但不必運行硬體設備。在通常情況下,你擁有驗證者金輪的存取權限,但同時也需分享你的簽名金輪,讓營運商能夠代表你的驗證者行動。這將引入在你運行自己的硬體設備時不存在的信任層,而且與你在家中單獨質押不同,節點的地理位置分佈對質押即服務沒有太大的助益。如果你不願意操作硬體設備,但仍希望質押 32 個以太幣,那麼使用質押即服務可能是一個不錯的選擇。", + "page-staking-hierarchy-cex-p3": "如果你不願意持有自己的金鑰,那也沒關係。有這些方案供你選擇。同時,請考慮查看我們的錢包頁面,開始學習如何真正保障自己的資金安全。當你準備好後,回到此頁面,嘗試所提供的自行保管聯合質押服務,提高你的質押水平。", + "page-staking-hierarchy-subtext": "你可能已經注意到,參與以太坊質押的方式有很多種。這些方案針對廣泛的使用者,最終每個方案都是獨一無二的,並且在風險、酬勞和信任假設方面各不相同。有些比其他的更去中心化、更久經考驗且/或風險更大。我們提供了有關該領域熱門方案的一些資訊,但在向任何位置發送以太幣之前,一定要自己做研究。", + "page-staking-comparison-solo-saas": "即使有了質押即服務提供商,你仍然需要存入 32 個以太幣,但不必運行硬體設備。在通常情況下,你擁有驗證者金鑰的存取權限,但同時也需分享你的簽名金鑰,讓營運商能夠代表你的驗證者行動。這將引入在你運行自己的硬體設備時不存在的信任層,而且與你在家中單獨質押不同,節點的地理位置分佈對質押即服務沒有太大的助益。如果你不願意操作硬體設備,但仍希望質押 32 個以太幣,那麼使用質押即服務可能是一個不錯的選擇。", "page-staking-comparison-solo-pools": "單獨質押比使用質押池服務複雜許多,但享有全部以太幣酬勞,並且可以完全掌握驗證者節點的設定和安全性。聯合質押的門檻較低。使用者可以質押少量以太幣,不需要生成驗證者金鑰,且除了標準的網路連接外,不需要額外的硬體設備。流動性代幣允許質押在協議層級生效之前退出質押。如果你對這些功能感興趣,那麼聯合質押可能是一個不錯的選擇。", - "page-staking-comparison-saas-solo": "相似之處包含擁有自己的驗證者金輪而不必募集資金,但若使用質押即服務,你必須信任第三方,而第三方可能會採取惡意行為,或成為攻擊和監管的目標。如果你擔心這些信任假設或中心化風險,那麼享有質押自主權的最佳標準方式就是單獨質押。", + "page-staking-comparison-saas-solo": "相似之處包含擁有自己的驗證者金鑰而不必募集資金,但若使用質押即服務,你必須信任第三方,而第三方可能會採取惡意行為,或成為攻擊和監管的目標。如果你擔心這些信任假設或中心化風險,那麼享有質押自主權的最佳標準方式就是單獨質押。", "page-staking-comparison-saas-pools": "這與通常需要依賴他人來運行驗證者用戶端是相似的,但與質押即服務不同的是,聯合質押允許你以小額以太幣參與。如果你希望用少於 32 個以太幣進行質押,請考慮查看這些内容。", - "page-staking-comparison-pools-solo": "與單獨質押相比,聯合質押的進入門檻要低得多,但是將所有節點運作委託給第三方會帶來額外的風險和費用。單獨質押賦予了選擇質押設定的完全自主權和控制權。質押者永遠不必交出他們的金輪,並且可以在沒有中間商抽成的情況下獲得完整的酬勞。", - "page-staking-comparison-pools-saas": "兩者的相似之處在於質押者不需自行執行驗證者軟體,但與聯合質押方案不同的是,質押即服務需要存入完整的 32 個以太幣才能啓動驗證者節點。質押酬勞會累積給質押者,但通常使用該服務需要按月付費或進行其他質押。如果你更偏好自己擁有驗證者金輪,並期望至少質押 32 個以太幣,那麼使用質押即服務可能是一個不錯的選擇。", + "page-staking-comparison-pools-solo": "與單獨質押相比,聯合質押的進入門檻要低得多,但是將所有節點運作委託給第三方會帶來額外的風險和費用。單獨質押賦予了選擇質押設定的完全自主權和控制權。質押者永遠不必交出他們的金鑰,並且可以在沒有中間商抽成的情況下獲得完整的酬勞。", + "page-staking-comparison-pools-saas": "兩者的相似之處在於質押者不需自行執行驗證者軟體,但與聯合質押方案不同的是,質押即服務需要存入完整的 32 個以太幣才能啓動驗證者節點。質押酬勞會累積給質押者,但通常使用該服務需要按月付費或進行其他質押。如果你更偏好自己擁有驗證者金鑰,並期望至少質押 32 個以太幣,那麼使用質押即服務可能是一個不錯的選擇。", "page-staking-considerations-solo-1-title": "開放原始碼", "page-staking-considerations-solo-1-description": "基本程式碼為 100% 開放原始碼,可供大眾分叉和使用", "page-staking-considerations-solo-1-warning": "封閉原始碼", @@ -103,7 +103,7 @@ "page-staking-considerations-solo-4-caution": "活躍時間大於六個月", "page-staking-considerations-solo-4-warning": "最新發佈", "page-staking-considerations-solo-5-title": "去信任", - "page-staking-considerations-solo-5-description": "驗證者金輪在驗證者生命週期的任何時間點都沒有委託給任何其他人。所涉及的任何智慧型合約都沒有後門,不依賴於特殊執行權限。", + "page-staking-considerations-solo-5-description": "驗證者金鑰在驗證者生命週期的任何時間點都沒有委託給任何其他人。所涉及的任何智慧型合約都沒有後門,不依賴於特殊執行權限。", "page-staking-considerations-solo-5-warning": "受信任", "page-staking-considerations-solo-6-title": "無許可", "page-staking-considerations-solo-6-description": "使用者無需任何特殊權限即可使用該軟體或服務來運作驗證者節點", @@ -114,14 +114,14 @@ "page-staking-considerations-solo-7-valid": "輕易切換用戶端", "page-staking-considerations-solo-7-warning": "局限於一個主流用戶端", "page-staking-considerations-solo-8-title": "自我保管", - "page-staking-considerations-solo-8-description": "使用者保留對任何驗證者憑證的保管權,包括簽署和提款金輪。", + "page-staking-considerations-solo-8-description": "使用者保留對任何驗證者憑證的保管權,包括簽署和提款金鑰。", "page-staking-considerations-solo-8-warning": "第三方保管", "page-staking-considerations-solo-9-title": "經濟實惠", - "page-staking-considerations-solo-9-description": "使用者可以透過質押少於 32 個以太幣,並利用來自他人的聯合資金,來運作驗證者節點。", + "page-staking-considerations-solo-9-description": "使用者可以用少於 32 個以太幣進行質押,並利用來自他人的聯合資金,藉此運作驗證者節點。", "page-staking-considerations-solo-9-valid": "少於 32 個以太幣", "page-staking-considerations-solo-9-warning": "32 個以太幣", "page-staking-considerations-saas-4-description": "在指定的時間段內,服務已經公開並被大眾使用", - "page-staking-considerations-saas-6-description": "使用者無需任何特殊權限、帳戶註冊也無需了解你的客戶,即可參與服務", + "page-staking-considerations-saas-6-description": "使用者無需任何特殊權限、帳戶註冊或「認識客戶」驗證,即可參與服務", "page-staking-considerations-saas-6-valid": "任何人都可以加入", "page-staking-considerations-saas-6-warning": "需要許可", "page-staking-considerations-saas-7-title": "執行多元性", @@ -136,7 +136,7 @@ "page-staking-considerations-saas-8-warning": "超過 50%", "page-staking-considerations-pools-5-description": "服務不需要信任任何人來保管你的金鑰或分配酬勞", "page-staking-considerations-pools-6-title": "無許可節點", - "page-staking-considerations-pools-6-description": "服務允許任何人在無許可的情況下作為礦池的節點营运商加入", + "page-staking-considerations-pools-6-description": "服務允許任何人在無許可的情況下作為礦池的節點營運商加入", "page-staking-considerations-pools-7-description": "服務使用主流執行用戶端執行的驗證者不得超過其匯總數量的 50%", "page-staking-considerations-pools-8-title": "流動性代幣", "page-staking-considerations-pools-8-description": "提供可交易的流動性代幣來代表你質押的以太幣,保存在你自己的錢包中", @@ -146,7 +146,7 @@ "page-staking-how-solo-works-item-1": "獲取一些硬體設備:你需要執行節點來進行質押", "page-staking-how-solo-works-item-2": "同步一個執行層用戶端", "page-staking-how-solo-works-item-3": "同步一個共識層用戶端", - "page-staking-how-solo-works-item-4": "產生你的金輪並載入到你的驗證者用戶端", + "page-staking-how-solo-works-item-4": "產生你的金鑰並載入到你的驗證者用戶端", "page-staking-how-solo-works-item-5": "監控和維護你的節點", "page-staking-launchpad-widget-testnet-label": "Goerli 測試網", "page-staking-launchpad-widget-testnet-start": "開始在 Goerli 測試網上進行質押", @@ -163,8 +163,8 @@ "page-staking-stats-box-metric-1": "以太幣質押總額", "page-staking-stats-box-metric-2": "全體驗證者", "page-staking-stats-box-metric-3": "目前年利率", - "page-staking-stats-box-metric-1-tooltip": "信標鏈上的質押以太幣總值,不包含超過 32 以太幣的餘額", - "page-staking-stats-box-metric-2-tooltip": "當前在信標鏈激活的驗證者帳戶數量", + "page-staking-stats-box-metric-1-tooltip": "信標鏈上的質押以太幣總值,不包含超過 32 個以太幣的餘額", + "page-staking-stats-box-metric-2-tooltip": "當前在信標鏈啟動的驗證者帳戶數量", "page-staking-stats-box-metric-3-tooltip": "在過去 24 小時中,每個驗證者的平均按年計財務回報率", "page-staking-section-comparison-subtitle": "沒有一個解決方案可以適用所有質押,每一個質押都是獨一無二的。這裡我們將比較不同質押方式下產生的一些風險、酬勞和要求。", "page-staking-section-comparison-rewards-title": "酬勞", @@ -181,20 +181,20 @@ "page-staking-section-comparison-solo-risks-li2": "離線會有懲罰,需要花費以太幣", "page-staking-section-comparison-solo-risks-li3": "惡意行為可能導致大量的以太幣被「罰沒」並被強制驅逐出區塊鏈網路", "page-staking-section-comparison-saas-risks-li1": "風險等同於單獨質押的風險,再加上對方服務提供商帶來的風險", - "page-staking-section-comparison-saas-risks-li2": "將你的簽名金輪使用權委託給可能行惡意行為的其他人", + "page-staking-section-comparison-saas-risks-li2": "將你的簽名金鑰使用權委託給可能做出惡意行為的其他人", "page-staking-section-comparison-pools-risks-li1": "風險因使用的方法而有所不同", "page-staking-section-comparison-pools-risks-li2": "一般來說,風險由交易對方、智慧型合約和執行風險共同組成。", "page-staking-section-comparison-requirements-title": "要求", "page-staking-section-comparison-solo-requirements-li1": "你必須存入 32 個以太幣", "page-staking-section-comparison-solo-requirements-li2": "在連接到網際網路時,維護運行以太坊執行用戶端和共識用戶端的硬體設備", "page-staking-section-comparison-solo-requirements-li3": "質押啓動面板將引導你完成整個流程和硬體設備要求", - "page-staking-section-comparison-saas-requirements-li1": "存入 32 個以太幣並在幫助下產生你的金輪", - "page-staking-section-comparison-saas-requirements-li2": "安全地儲存你的金輪", + "page-staking-section-comparison-saas-requirements-li1": "存入 32 個以太幣並在幫助下產生你的金鑰", + "page-staking-section-comparison-saas-requirements-li2": "安全地儲存你的金鑰", "page-staking-section-comparison-saas-requirements-li3": "其他服務已妥善處理,但特定服務將有所不同", "page-staking-section-comparison-pools-requirements-li1": "非常低的以太幣要求,有些專案僅需 0.01 個以太幣", "page-staking-section-comparison-pools-requirements-li2": "直接從你的錢包存入到不同的聯合質押平台,或簡單地交易其中一種質押流動性代幣", "page-staking-faq-1-question": "什麼是驗證者?", - "page-staking-faq-1-answer": "驗證者是一個存在於以太坊上並參與以太坊協定共識的虛擬實體。驗證者由資金餘額、公鑰和其他屬性表示。驗證者用戶端是一個軟體,它透過持有和使用驗證者的私鑰,來代表驗證者本身執行操作。單個驗證者用戶端可以持有多個金輪對,控制多個驗證者。", + "page-staking-faq-1-answer": "驗證者是一個存在於以太坊上並參與以太坊協定共識的虛擬實體。驗證者由資金餘額、公鑰和其他屬性表示。驗證者用戶端是一個軟體,它透過持有和使用驗證者的私密金鑰,來代表驗證者本身執行操作。單個驗證者用戶端可以持有多個金鑰對,控制多個驗證者。", "page-staking-faq-2-question": "為何我需要質押資金呢?", "page-staking-faq-2-answer": "驗證者有能力為網路提交和證明區塊。為了防止不誠實行為,使用者必須將他們的資金進行質押。這允許協定懲罰惡意行為者。質押是讓你保持誠實的一種方式,因為你的行為會產生財務後果。", "page-staking-faq-3-question": "我可以購買「以太坊 2」嗎?", @@ -202,16 +202,16 @@ "page-staking-faq-3-answer-p2": "有一些衍生代幣/行情指示器可以代表質押的以太幣(即 Rocket Pool 的 rETH、Lido 的 stETH、Coinbase 的 ETH2 等)。詳細了解質押礦池", "page-staking-faq-4-question": "質押已經開始運行了嗎?", "page-staking-faq-4-answer-p1": "對,質押自 2020 年 12 月 1 日已經上線", - "page-staking-faq-4-answer-p2": "這意味著目前用戶可以進行質押以存入他們的以太幣、執行驗證者用戶端並開始賺取酬勞。", + "page-staking-faq-4-answer-p2": "這意味著目前使用者可以進行質押以存入他們的以太幣、執行驗證者用戶端並開始賺取酬勞。", "page-staking-faq-4-answer-p3": "上海/卡佩拉升級已於 2023 年 4 月 12 日完成,可實現質押提款,並結束質押流動的循環狀態。", "page-staking-faq-5-question": "何時可以提取我的質押以太幣?", "page-staking-faq-5-answer-p1": "現在即可!質押者可自由地按意願從驗證者餘額中提取他們的酬勞和/或本金。", - "page-staking-faq-5-answer-p2": "在提交區塊時,質押者還可以獲得以費用和最大可提取价值形式發放的酬勞,他們可通過設定費用接收地址立即獲得這一些酬勞。", + "page-staking-faq-5-answer-p2": "在提交區塊時,質押者還可以獲得以費用和最大可提取價值形式發放的酬勞,他們可通過設定費用接收地址立即獲得這一些酬勞。", "page-staking-faq-5-answer-link": "更多關於提取質押代幣的資訊", "page-staking-further-reading-1-link": "為何採用權益證明(2020 年 11 月)", "page-staking-further-reading-author-vitalik-buterin": "Vitalik Buterin", "page-staking-further-reading-2-link": "寧靜設計原理", - "page-staking-further-reading-3-link": "權益證明常見問答集(2017 年 12 月)", + "page-staking-further-reading-3-link": "權益證明常見問題(2017 年 12 月)", "page-staking-further-reading-4-link": "以太坊 2.0 新聞", "page-staking-further-reading-4-author": "Ben Edgington", "page-staking-further-reading-5-link": "第 33 號最終版,以太坊共識層(2022 年 1 月)", @@ -231,7 +231,7 @@ "page-staking-meta-description": "以太坊質押概覽:風險、酬勞、要求以及如何執行。", "page-staking-meta-title": "以太坊質押", "page-staking-withdrawals-important-notices": "重要通知", - "page-staking-withdrawals-important-notices-desc": "現在尚未提供提款服務,如欲瞭解更多,請閲讀以太坊 2 融合及融合後階段的常見問題。", + "page-staking-withdrawals-important-notices-desc": "現在尚未提供提款服務,如欲瞭解更多,請閲讀以太坊 2 合併及合併後階段的常見問題。", "page-upgrades-merge-btn": "合併案的相關細節", - "subscribe-to-ef-blog": "訂閱以太坊基金會博客,接收最新協議公告的電子郵件通知。" + "subscribe-to-ef-blog": "訂閱以太坊基金會部落格,接收最新協議公告的電子郵件通知。" } diff --git a/src/intl/zh-tw/page-upgrades-get-involved.json b/src/intl/zh-tw/page-upgrades-get-involved.json index db4a0ce1d0c..f3b83251abe 100644 --- a/src/intl/zh-tw/page-upgrades-get-involved.json +++ b/src/intl/zh-tw/page-upgrades-get-involved.json @@ -3,36 +3,36 @@ "page-upgrades-get-involved-btn-2": "更多權益質押相關資訊", "page-upgrades-get-involved-btn-3": "尋找錯誤", "page-upgrades-get-involved-bug": "錯誤可能包括:", - "page-upgrades-get-involved-bug-hunting": "前往搜尋錯誤", + "page-upgrades-get-involved-bug-hunting": "前往偵錯", "page-upgrades-get-involved-bug-hunting-desc": "尋找並報告共識層升級規範或用戶端本身的錯誤。最高可以贏取 50,000 美元並在排行榜上佔據一席之地。", - "page-upgrades-get-involved-bug-li": "規範非合規問題", + "page-upgrades-get-involved-bug-li": "規範不合規問題", "page-upgrades-get-involved-bug-li-2": "最終性致命錯誤", "page-upgrades-get-involved-bug-li-3": "阻斷服務 (DOS) 媒介", "page-upgrades-get-involved-bug-li-4": "和更多...", - "page-upgrades-get-involved-desc-1": "運行用戶端意味著你將積極使用以太坊。你的用戶端可幫助追蹤交易並檢查新區塊。", + "page-upgrades-get-involved-desc-1": "執行用戶端意味著你將積極使用以太坊。你的用戶端可幫助追蹤交易並檢查新區塊。", "page-upgrades-get-involved-desc-2": "如果你有以太幣,可以將其質押以成為驗證者並幫助保護網路安全。驗證者可以賺取以太幣獎勵。", - "page-upgrades-get-involved-desc-3": "加入社群測試工作!在以太坊升級發佈之前幫助進行測試、尋找錯誤並賺取獎勵。", + "page-upgrades-get-involved-desc-3": "加入社群測試工作!在以太坊升級上線之前幫助進行測試、尋找錯誤並贏取獎勵。", "page-upgrades-get-involved-ethresearch-1": "分片", "page-upgrades-get-involved-ethresearch-2": "合併", "page-upgrades-get-involved-ethresearch-3": "分片化執行", "page-upgrades-get-involved-ethresearch-4": "所有研究主題", "page-upgrades-get-involved-how": "你想如何參與其中?", - "page-upgrades-get-involved-how-desc": "更多的人運行用戶端、質押和搜尋錯誤永遠會讓以太坊社群獲益。", + "page-upgrades-get-involved-how-desc": "更多的人執行用戶端、質押和偵錯,會讓以太坊社群始終獲益。", "page-upgrades-get-involved-join": "加入研究", "page-upgrades-get-involved-join-desc": "就像以太坊的大多數事情一樣,很多研究都是公開的。這意味著你可以參與討論或者閱讀以太坊研究人員的意見。ethresear.ch 上提供有許多主題的相關資訊,包括共識升級、卷軸等。", - "page-upgrades-get-involved-meta-description": "如何參與以太坊升級:運行節點、質押、搜尋錯誤等。", - "page-upgrades-get-involved-run-clients": "運行用戶端對", - "page-upgrades-get-involved-run-clients-desc": "「用戶端」是運行區塊鏈的軟體,在以太坊,全節點需要運行這樣一對用戶端:執行層用戶端和共識層用戶端。全節點可以檢查交易,如果還質押以太幣,則可以新建區塊。每個用戶端都有自己的特性,但總體上執行相同的功能,因此希望你盡可能減少用戶端數目,以保持用戶端池的多樣性和安全性。", - "page-upgrades-get-involved-run-clients-desc-link": "有關用戶端多樣性的更多資訊。", + "page-upgrades-get-involved-meta-description": "如何參與以太坊升級:執行節點、質押、偵錯等。", + "page-upgrades-get-involved-run-clients": "執行用戶端對", + "page-upgrades-get-involved-run-clients-desc": "「用戶端」是執行區塊鏈的軟體,在以太坊,全節點需要執行這樣一對用戶端:執行層用戶端和共識層用戶端。全節點可以檢查交易,如果還質押以太幣,則可以新建區塊。每個用戶端都有自己的特性,但總體上執行相同的功能,因此我們希望你盡可能選擇非主流用戶端,以保持用戶端池的多樣性和安全性。", + "page-upgrades-get-involved-run-clients-desc-link": "更多用戶端多樣性相關資訊。", "page-upgrades-get-involved-run-clients-execution": "執行層用戶端", - "page-upgrades-get-involved-run-clients-execution-desc": "這些用戶端以前被稱為「Eth1」用户端,但這個術語已被棄用,取而代之的是「執行層」用户端。", + "page-upgrades-get-involved-run-clients-execution-desc": "這些用戶端以前稱為「以太坊 1.0」用户端,但這個術語已被棄用,取而代之的是「執行層」用户端。", "page-upgrades-get-involved-run-clients-consensus": "共識層用戶端", - "page-upgrades-get-involved-run-clients-consensus-desc": "這些用戶端以前被稱為「Eth2」用户端,但這個術語已被棄用,取而代之的是「共識層」用户端。", + "page-upgrades-get-involved-run-clients-consensus-desc": "這些用戶端以前稱為「以太坊 2.0」用户端,但這個術語已被棄用,取而代之的是「共識層」用户端。", "page-upgrades-get-involved-stake": "質押你的以太幣", "page-upgrades-get-involved-stake-desc": "你可以質押以太幣以幫助保護信標鏈安全。", "page-upgrades-get-involved-stake-eth": "質押以太幣", "page-upgrades-get-involved-subtitle": "以下是你可以為以太坊和未來升級相關工作提供幫助的所有方法。", - "page-upgrades-get-involved-title-1": "运行用户端", + "page-upgrades-get-involved-title-1": "執行用户端", "page-upgrades-get-involved-title-2": "質押你的以太幣", "page-upgrades-get-involved-title-3": "尋找錯誤", "page-upgrades-get-involved-written-c-sharp": "用 C# 編寫", @@ -43,5 +43,5 @@ "page-upgrades-get-involved-written-rust": "用 Rust 編寫", "page-upgrades-get-involved": "參與以太坊升級", "page-upgrades-get-involved-2": "加入我們", - "page-upgrades-bug-bounty-leaderboard-points": "積點" + "page-upgrades-bug-bounty-leaderboard-points": "積分" } diff --git a/src/intl/zh-tw/page-upgrades-index.json b/src/intl/zh-tw/page-upgrades-index.json index 9631fc1fef1..9dcb311a261 100644 --- a/src/intl/zh-tw/page-upgrades-index.json +++ b/src/intl/zh-tw/page-upgrades-index.json @@ -8,8 +8,8 @@ "consensus-client-nimbus-logo-alt": "Nimbus 標誌", "consensus-client-prysm-logo-alt": "Prysm 標誌", "consensus-client-teku-logo-alt": "Teku 標誌", - "page-upgrades-answer-1": "信標鏈在合併中被用作升級以太坊主網的工具。", - "page-upgrades-answer-2": "透過合併,以太坊進行了有史以來最重大的升級,從工作量證明過渡到新的權益證明共識層。", + "page-upgrades-answer-1": "在以太坊合併中,將使用信標鏈來升級以太坊主網。", + "page-upgrades-answer-2": "透過合併,以太坊進行了自誕生以來最重大的升級,從工作量證明過渡到新的權益證明共識層。", "page-upgrades-answer-4": "信標鏈被用於開發以太坊如今使用的權益證明共識。它與以太坊主網分開運行,因此開發者可以在使用它來協調實際活動之前,單獨觀察共識機制。", "page-upgrade-article-author-status": "狀態", "page-upgrade-article-author-ethmerge": "Ethmerge", @@ -25,9 +25,9 @@ "page-upgrade-article-title-sharding-consensus": "分片共識", "page-upgrade-article-title-sharding-is-great": "為什麼分片是好事:揭密技術特性", "page-upgrade-article-title-rollup-roadmap": "以卷軸為中心的開發藍圖", - "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "以太坊搭便車指南", - "page-upgrade-article-title-eip-4844": "EIP-4844:分片二進制大對象交易 (Proto-Danksharding)", - "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding 常見問題解答", + "page-upgrade-article-title-hitchhikers-guide-to-ethereum": "The Hitchhikers Guide To Ethereum", + "page-upgrade-article-title-eip-4844": "EIP-4844:分片二進位大型物件交易 (Proto-Danksharding)", + "page-upgrade-article-title-proto-danksharding-faq": "Proto-Danksharding 常見問題", "page-upgrade-article-title-sharding-das": "分片及資料可用性採樣 (DAS) 詳解", "page-upgrade-article-title-ethmerge": "Ethmerge", "page-upgrade-article-title-merge-is-coming": "合併即將開始", @@ -37,17 +37,17 @@ "page-upgrade-article-title-consensus-layer-specs": "共識層規範", "page-upgrade-article-title-engine-api-specs": "引擎應用程式介面規範", "page-upgrades-beacon-chain-date": "信標鏈於 2020 年 12 月 1 日上線", - "page-upgrades-beacon-chain-desc": "信標鏈為以太坊帶來了質押,並為未來的升級奠定了基礎。它會協調新的權益證明以太坊。", + "page-upgrades-beacon-chain-desc": "信標鏈為以太坊帶來了質押功能,並為未來的升級奠定了基礎。它會協調新的權益證明以太坊。", "page-upgrades-beacon-chain-estimate": "信標鏈已上線", - "page-upgrades-beacon-chain-title": "信標鏈(Beacon Chain)", + "page-upgrades-beacon-chain-title": "信標鏈", "page-upgrades-bug-bounty": "檢視漏洞懸賞計劃", - "page-upgrades-clients": "查看共識用戶端(以前稱為「以太坊 2」用戶端)", + "page-upgrades-clients": "查看共識使用者端(以前稱為「以太坊 2」使用者端)", "page-staking-deposit-contract-title": "查看存款合約地址", "page-upgrades-dive": "深入瞭解願景", "page-upgrades-dive-desc": "我們如何讓以太坊更具可擴容性、安全性和永續性?同時保持以太坊去中心化的核心理念。", - "page-upgrades-docking": "融合", + "page-upgrades-docking": "合併", "page-upgrades-merge-answer-1": "合併指 2022 年 9 月 15 日以太坊過渡到權益證明共識機制之時,信標鏈與主網合併,正式棄用以太坊上的工作量證明,並將以太坊的能耗降低了大約 99.95%。", - "page-upgrades-merge-btn": "更多關於合併的資訊", + "page-upgrades-merge-btn": "合併案的相關細節", "page-upgrades-merge-desc": "以太坊主網與權益證明信標鏈合併,標誌著能源密集型挖礦的結束。", "page-upgrades-merge-estimate": "合併已完成", "page-upgrades-merge-mainnet": "什麼是主網?", @@ -67,15 +67,15 @@ "page-upgrades-index-staking-step-1-desc": "若要在以太坊上質押,你需要使用啟動面板,系統將引導你完成整個流程。", "page-upgrades-index-staking-step-2": "2. 確認質押地址", "page-upgrades-index-staking-step-2-btn": "確認存款合約地址", - "page-upgrades-index-staking-step-2-desc": "質押以太代幣之前,請確保檢查並確保你的地址正確。必須先瀏覽啟動面板,再執行此操作。", - "page-upgrades-index-staking-sustainability": "更具永續性", + "page-upgrades-index-staking-step-2-desc": "質押以太幣之前,請檢查確保你的地址正確。必須先瀏覽啟動面板,再執行此操作。", + "page-upgrades-index-staking-sustainability": "提高可持續性", "page-upgrades-meta-desc": "以太坊升級概覽以及希望實現的願景。", "page-upgrades-meta-title": "以太坊升級(以前稱為「以太坊 2」)", "page-upgrades-proof-stake-link": "更多權益證明相關資訊", "page-upgrades-question-1-title": "升級將於何時上線?", "page-upgrades-question-1-desc": "以太坊正在逐步升級;上線日期不同,升級亦有所不同。", "page-upgrades-question-2-title": "信標鏈是單獨的區塊鏈嗎?", - "page-upgrades-question-2-desc": "是的。信標鏈是用於升級以太坊主網的平行權益證明區塊鏈的名稱。現在只有一個區塊鏈,由原始的以太坊區塊鏈和信標鏈合併而成。", + "page-upgrades-question-2-desc": "是的。信標鏈是用於升級以太坊主網的平行權益證明區塊鏈的名稱。現在只有一條區塊鏈,由原始的以太坊區塊鏈和信標鏈合併而成。", "page-upgrades-question-3-answer-2a": "合併對去中心化應用程式開發者的影響微乎其微,他們仍以相同的方式與以太坊互動。", "page-upgrades-question-3-answer-2a-link": "合併和去中心化應用程式開發者", "page-upgrades-question-3-answer-2b": "分片計劃仍在製定當中,但設計時會考慮二層網路卷軸。", @@ -86,32 +86,32 @@ "page-upgrades-question-4-answer-1": "目前,每當你發送交易或使用去中心化應用程式時,都在使用執行層,也稱為主網。", "page-upgrades-question-4-answer-3": "自合併以來,驗證者透過權益證明來保護整個網路的安全。", "page-upgrades-question-4-answer-6": "只要願意質押以太幣,任何人都能成為驗證者。", - "page-upgrades-question-4-answer-7": "更多權益質押相關訊息", + "page-upgrades-question-4-answer-7": "更多權益質押相關資訊", "page-upgrades-question-4-title": "什麼是執行層?", - "page-upgrades-question-4-desc": "合併之前,以太坊區塊鏈有時稱為「以太坊 1」。該術語已被逐步淘汰,取而代之的是「執行層」。", - "page-upgrades-question-5-answer-1": "若要成為網路上的驗證者,你需要質押 32 以太幣。如果沒有那麼多,或者不願意質押那麼多,可以加入質押池。這些池可以減少你需要質押的數量並賺取總獎勵的一小部分。", + "page-upgrades-question-4-desc": "合併之前,以太坊區塊鏈有時稱為以太坊 1.0。該術語已被逐步淘汰,取而代之的是「執行層」。", + "page-upgrades-question-5-answer-1": "若要成為網路上的驗證者,你需要質押 32 個以太幣。如果沒有那麼多,或者不願意質押那麼多,可以加入質押池。這些池可以減少你需要質押的數量並賺取總獎勵的一小部分。", "page-upgrades-question-5-desc": "你將需要使用質押啟動面板或加入質押池。", "page-upgrades-question-5-title": "我該如何質押?", "page-upgrades-question-6-answer-3": "以太坊基金會的 Danny Ryan 會定期更新社群:", "page-upgrades-question-6-answer-4": "ConsenSys 的 Ben Edgington 提供一份關於以太坊升級的每週通訊:", "page-upgrades-question-6-answer-5": "你還可以在 ethresear.ch 加入有關以太坊研發的討論。", "page-upgrades-question-6-title": "我需要對我的去中心化應用程式做什麼?", - "page-upgrades-question-6-desc": "儘管有一些值得注意的微小變化,但合併經過特別設計,已將對去中心化應用程式開發者的影響減至最小。", - "page-upgrades-question-6-answer-1": "熟悉合併前以太坊的去中心化應用程式開發者應該瞭解一些變化,包括區塊結構和時序、一些作業變化、鏈上隨機性來源以及時期最終確定的概念。", + "page-upgrades-question-6-desc": "儘管有一些值得注意的微小變化,但合併經過特別設計,以對去中心化應用程式開發者的影響減至最小。", + "page-upgrades-question-6-answer-1": "熟悉合併前以太坊的去中心化應用程式開發者應該瞭解一些變化,包括區塊結構和時序、一些作業碼變化、鏈上隨機性來源以及時期最終確定的概念。", "page-upgrades-question-6-answer-1-link": "合併如何影響以太坊的應用程式層", "page-upgrades-question-6-answer-2": "應用程式幾乎完全不受影響。", "page-upgrades-question-7-desc": "來自整個社群的多個不同團隊正在努力處理各種以太坊升級。", "page-upgrades-question-7-lighthouse": "Lighthouse", - "page-upgrades-question-7-lighthouse-lang": "(Rust 實作)", + "page-upgrades-question-7-lighthouse-lang": "(Rust 實作)", "page-upgrades-question-7-lodestar": "Lodestar", - "page-upgrades-question-7-lodestar-lang": "(JavaScript 實作)", + "page-upgrades-question-7-lodestar-lang": "(JavaScript 實作)", "page-upgrades-question-7-nimbus": "Nimbus", - "page-upgrades-question-7-nimbus-lang": "(Nim 實作)", + "page-upgrades-question-7-nimbus-lang": "(Nim 實作)", "page-upgrades-question-7-prysm": "Prysm", - "page-upgrades-question-7-prysm-lang": "(Go 實作)", + "page-upgrades-question-7-prysm-lang": "(Go 實作)", "page-upgrades-question-7-teams": "以太坊共識用戶端團隊:", "page-upgrades-question-7-teku": "Teku", - "page-upgrades-question-7-teku-lang": "(Java 實作)", + "page-upgrades-question-7-teku-lang": "(Java 實作)", "page-upgrades-question-7-title": "誰在建置以太坊升級?", "page-upgrades-question-7-clients": "瞭解更多以太坊用戶端相關資訊", "page-upgrades-question-8-answer-1": "以太坊升級將幫助以太坊以去中心化方式擴容,同時保持安全性並提高永續性。", @@ -122,11 +122,11 @@ "page-upgrades-question-8-desc": "我們現今使用的以太坊需要為終端使用者和網路參與者提供更好的體驗。", "page-upgrades-question-8-title": "為什麼需要升級?", "page-upgrades-question-9-answer-1": "你能發揮的最積極作用就是質押以太幣。", - "page-upgrades-question-9-answer-2": "你可能還想運行第二個用戶端以幫助提高用戶端多樣性。", + "page-upgrades-question-9-answer-2": "你可能還想運行第二種用戶端以幫助提高用戶端多樣性。", "page-upgrades-question-9-answer-3": "如果你更懂技術,可以幫助發現新用戶端中的漏洞。", "page-upgrades-question-9-answer-4": "你還可以在 ethresear.ch 上與以太坊研究人員開展技術討論。", "page-upgrades-question-9-desc": "不必精通技術即可做出貢獻。社群需要具備各種技能之人才做出貢獻。", - "page-upgrades-question-9-stake-eth": "質押以太(ETH)", + "page-upgrades-question-9-stake-eth": "質押以太幣", "page-upgrades-question-9-title": "我該如何為以太坊升級做出貢獻?", "page-upgrades-question-9-more": "尋找更多參與以太坊的一般方法", "page-upgrades-question-10-title": "什麼是「以太坊 2 階段」?", @@ -140,18 +140,18 @@ "page-upgrades-question-10-answer-6": "階段 1.5 最初計劃在分片實作之後進行,主網將作為最後一個分片新增至信標鏈。然而,隨著卷軸技術的進步,以太坊社群反而加快了從工作量證明的過渡。", "page-upgrades-question-10-answer-7": "階段 2 的計劃一直是深入研究和討論的焦點。隨著合併的到來以及二層網路解決方案的進步,目標已轉變為提供更簡化的資料分片形式,從而最大限度地提高卷軸效率。目前二層網路能夠擴展交易執行,而分片將允許以廉價且可擴容的方式在一層網路上儲存此資料的證明。", "page-upgrades-question-10-answer-8": "更多以卷軸為中心的開發藍圖的相關資訊", - "page-upgrades-question-11-title": "我可以購買以太坊 2 代幣嗎?", - "page-upgrades-question-11-desc": "不行。沒有以太坊 2 代幣,合併後你的以太幣也沒有變更。", - "page-upgrades-question-11-answer-1": "以太坊 2 品牌重塑背後的驅動力之一是一種常見的誤解,即以太幣持有者需要在合併或任何其他升級後將其以太幣遷移到「以太坊 2.0」。這不是真的,從來都不是。", + "page-upgrades-question-11-title": "我可以購買「以太坊 2」代幣嗎?", + "page-upgrades-question-11-desc": "不行。沒有「以太坊 2」代幣,合併後你的以太幣也沒有變更。", + "page-upgrades-question-11-answer-1": "「以太坊 2」品牌重塑背後的驅動力之一是一種常見的誤解,即以太幣持有者需要在合併或任何其他升級後將其以太幣遷移到「以太坊 2.0」。事實並非如此,也從未如此。", "page-upgrades-question-11-answer-2": "這種混淆經常會被詐騙者利用。", "page-upgrades-question-title": "常見問題", - "page-upgrades-question3-answer-1": "以太幣持有者不需要做任何事情。你的以太幣不需要更改或升級。幾乎肯定,會有騙局告訴你事實並非如此,所以要小心。", + "page-upgrades-question3-answer-1": "以太幣持有者不需要做任何事情。不需要更改或升級你的以太幣。要小心,肯定會有騙局告訴你需要更改或升級以太幣。", "page-upgrades-scalable": "更具可擴容性", - "page-upgrades-scalable-desc": "以太坊每秒需要支援數千筆交易,以使應用程式使用起來更快速、更便宜。", + "page-upgrades-scalable-desc": "以太坊每秒需要能夠支援數千筆交易,以使應用程式使用起來更快速、更便宜。", "page-upgrades-secure": "更加安全", - "page-upgrades-secure-desc": "以太坊需要更加安全。隨著以太坊的不斷普及,協定的安全性需要進一步提升,以抵禦各種形式的攻擊。", - "page-upgrades-shard-date": "在 2023 年至 2024 年的某個時間,分片將在合併後分多個階段進行。", - "page-upgrades-shard-desc": "Danksharding 可擴展以太坊儲存資料的能力,並與二層網路協調以擴展吞吐量並降低網路費用。Danksharding 將分多個階段推出,從 ProtoDanksharding 開始。", + "page-upgrades-secure-desc": "以太坊需要更加安全。隨著以太坊的不斷普及,需要進一步提升協定的安全性,以抵禦各種形式的攻擊。", + "page-upgrades-shard-date": "在 2023 年至 2024 年的某個時間,將在合併後分多個階段進行分片。", + "page-upgrades-shard-desc": "Danksharding 可擴展以太坊儲存資料的能力,並與二層網路協調以擴展吞吐量並降低網路費用。Danksharding 將分多個階段推出,首先推出的是 ProtoDanksharding。", "page-upgrades-shard-estimate": "預計時間:2023-2024 年", "page-upgrades-shard-lower": "更多分片相關更多資訊", "page-upgrades-shard-title": "分片", @@ -163,7 +163,7 @@ "page-upgrades-the-upgrades": "以太坊升級", "page-upgrades-the-upgrades-desc": "以太坊升級旨在提高網路的可擴容性、安全性和永續性。以太坊已於最近在安全性和永續性方面進行一些重大升級,未來還會有更多升級,尤其是在可擴容性方面。", "page-upgrades-unofficial-roadmap": "這不是正式的開發藍圖。這是我們根據現有資訊看待正在發生的事情的方式。但這就是技術,事情可以瞬間改變。因此,請不要將此視為承諾。", - "page-upgrades-upgrade-desc": "我們知道和喜愛的以太坊,更可擴容、更安全、更永續...", + "page-upgrades-upgrade-desc": "依舊是我們瞭解和喜愛的以太坊,只是更加可擴容、更安全、更永續...", "page-upgrades-upgrades": "以太坊升級", "page-upgrades-upgrades-aria-label": "以太坊升級選單", "page-upgrades-upgrades-beacon-chain": "信標鏈(Beacon Chain)", @@ -174,31 +174,31 @@ "page-roadmap-vision": "願景", "page-roadmap-vision-btn": "更多以太坊願景相關資訊", "page-roadmap-vision-desc": "為了將以太坊帶入主流並服務全人類,我們必須使以太坊更具可擴容性、安全性和永續性。", - "page-upgrades-what-happened-to-eth2-title": "「以太坊 2」怎麼了?", - "page-upgrades-what-happened-to-eth2-1": "「以太坊 2」一詞在合併之前被廣泛使用,但正在逐步淘汰,取而代之的是更精確的術語。", + "page-upgrades-what-happened-to-eth2-title": "「以太坊 2.0」怎麼了?", + "page-upgrades-what-happened-to-eth2-1": "「以太坊 2.0」一詞在合併之前被廣泛使用,但正在逐步淘汰,取而代之的是更精確的術語。", "page-upgrades-what-happened-to-eth2-1-more": "更多合併相關資訊。", - "page-upgrades-what-happened-to-eth2-2": "自從合併「以太坊 1」和「以太坊 2」後,不再有兩條不同的以太坊區塊鏈;只有一個以太坊。", - "page-upgrades-what-happened-to-eth2-3": "為了避免混淆,社群更新了這些術語:", - "page-upgrades-what-happened-to-eth2-3-1": "「以太坊 1」現在是「執行層」,負責處理交易和執行。", - "page-upgrades-what-happened-to-eth2-3-2": "「以太坊 2」現在是「共識層」,負責處理權益證明共識。", - "page-upgrades-what-happened-to-eth2-4": "這些術語更新僅變更命名規則;不會改變以太坊的目標或開發藍圖。", - "page-upgrades-what-happened-to-eth2-5": "瞭解更多「以太坊 2」重新命名的相關資訊", - "page-upgrades-why-cant-we-just-use-eth2-title": "為什麼我們不能只使用以太坊 2?", + "page-upgrades-what-happened-to-eth2-2": "自從合併「以太坊 1.0」和「以太坊 2.0」後,不再有兩條不同的以太坊區塊鏈;只有一個以太坊。", + "page-upgrades-what-happened-to-eth2-3": "為了減少混亂,社區更新了這些條款:", + "page-upgrades-what-happened-to-eth2-3-1": "「以太坊 1.0」現在是處理交易和執行的「執行層」。", + "page-upgrades-what-happened-to-eth2-3-2": "「以太坊 2.0」現在是處理權益證明共識的「共識層」。", + "page-upgrades-what-happened-to-eth2-4": "這些術語更新只是改變了命名慣例;這並沒有改變以太坊的目標或開發藍圖。", + "page-upgrades-what-happened-to-eth2-5": "瞭解更多關於「以太坊 2.0」重命名的資訊", + "page-upgrades-why-cant-we-just-use-eth2-title": "為什麼我們不直接使用「以太坊 2」?", "page-upgrades-why-cant-we-just-use-eth2-mental-models-title": "心理模式", - "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "以太坊 2品牌的一個主要問題是,它為以太坊的新使用者建立了一種破碎的心理模式。他們直覺地認為以太坊 1 在前,以太坊 2在後。或者一旦 以太坊 2 存在,以太坊 1 就不再存在。這些都不是真的。刪除以太坊 2 術語之後,我們可以讓所有未來的使用者免於陷入這種令人困惑的心理模式。", + "page-upgrades-why-cant-we-just-use-eth2-mental-models-description": "「以太坊 2.0」品牌的一個主要問題是,它為以太坊的新使用者建立了一種錯誤的思維模式。他們會直覺地認為「以太坊 1.0」在前,「以太坊 2.0」在後。或者一旦「以太坊 2.0」存在,「以太坊 1.0」就不再存在。這些想法都是不對的。刪除「以太坊 2.0」術語之後,我們可以讓所有未來的使用者免於陷入這種令人困惑的思維模式。", "page-upgrades-why-cant-we-just-use-eth2-inclusivity-title": "包容性", - "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "隨著以太坊開發藍圖的演進,以太坊 2.0 已經不能準確表述以太坊的開發藍圖。謹慎準確地選擇用詞可以讓以太坊上的內容被最廣泛的受眾理解。", + "page-upgrades-why-cant-we-just-use-eth2-inclusivity-description": "隨著以太坊開發藍圖的演進,「以太坊 2.0」已經不能準確表述以太坊的開發藍圖。謹慎準確地選擇用詞可以讓最廣泛的受眾理解以太坊上的內容。", "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-title": "防範詐騙", - "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "不幸的是,惡意行為者試圖使用以太坊 2 這一誤稱來欺騙使用者,告訴他們將以太幣換成「以太坊 2」代幣,或者他們必須在以太坊 2 升級之前以某種方式遷移以太幣。我們希望更新後的術語能夠清晰地消除這種騙局,並有助於使生態系統更加安全。", + "page-upgrades-why-cant-we-just-use-eth2-scam-prevention-description": "不幸的是,惡意行為者試圖使用「以太坊 2.0」這一誤稱來欺騙使用者,告訴他們將以太幣換成「以太坊 2.0」代幣,或者他們必須在「以太坊 2.0」升級之前以某種方式遷移以太幣。我們希望更新後的術語能夠清晰闡明涵義,來消除這種騙局,並有助於使生態系統更加安全。", "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-title": "質押清晰度", - "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "有些質押業者也用「以太坊 2」代碼代表質押在信標鏈上的以太幣。鑑於這些服務的使用者實際上並未收到「以太坊 2」代幣,這會造成潛在的混亂。不存在「以太坊 2」代幣;它僅代表他們在該特定提供者的質押中所佔的份額。", + "page-upgrades-why-cant-we-just-use-eth2-staking-clarity-description": "有些質押業者也用「以太坊 2.0」代碼代表質押在信標鏈上的以太幣。鑑於這些服務的使用者實際上並未收到「以太坊 2.0」代幣,這會造成潛在的混亂。不存在「以太坊 2.0」代幣;它僅代表他們在該特定提供者的質押中所佔的份額。", "page-upgrades-what-to-do": "你需要做什麼?", "page-upgrades-what-to-do-desc": "如果你是去中心化應用程式使用者或以太幣持有者,無需執行任何操作。如果你是開發者或想開始質押,現今可以透過多種方式參與其中。", "page-upgrades-whats-next": "什麼是以太坊升級?", "page-upgrades-whats-next-desc": "以太坊開發藍圖涉及相互關聯的協定升級,這將使網路更具可擴容性、更安全、更永續。這些升級由來自以太坊生態系統的多個團隊所建置。", "page-upgrades-whats-next-history": "瞭解之前的以太坊升級", "page-upgrades-whats-ethereum": "等等,以太坊是什麼?", - "page-upgrades-whats-new": "以太坊的下一步是什麼?", + "page-upgrades-whats-new": "以太坊的下一步動作是什麼?", "page-upgrades-security-link": "更多安全和防範詐騙相關資訊", "page-staking-deposit-contract-staking-more-link": "更多權益質押相關資訊", "docs-nav-proof-of-stake": "權益證明", diff --git a/src/intl/zh-tw/page-upgrades.json b/src/intl/zh-tw/page-upgrades.json index bc0b94e21b8..8da9195b3cd 100644 --- a/src/intl/zh-tw/page-upgrades.json +++ b/src/intl/zh-tw/page-upgrades.json @@ -1,24 +1,24 @@ { "page-upgrades-merge-infographic-el": "以太坊狀態:交易、應用程式、合約、餘額", - "page-upgrades-merge-infographic-alt-text": "信息圖:說明從工作量證明過渡到權益證明期間,信標鏈如何合併到以太坊的執行層。", - "page-upgrades-beacon-date": "已發佈!", + "page-upgrades-merge-infographic-alt-text": "資訊圖表:說明從工作量證明過渡到權益證明期間,信標鏈如何合併到以太坊的執行層。", + "page-upgrades-beacon-date": "已上線!", "page-upgrades-merge-date": "2022 年 9 月", "page-upgrades-shards-date": "~2023 年", "page-upgrades-pbs": "不在近期 - 預計在 2024/25 年", - "page-upgrades-post-merge-banner-tutorial-ood": "合併後,此使用教學將不再適用,可能無法使用。若想繼續幫忙修改,請先在 github 上提交 PR。", - "page-upgrades-post-merge-banner-governance-ood": "合併後,此頁面上的有些內容將不再適用。若想繼續幫忙修改,請先在 github 上提交 PR。", + "page-upgrades-post-merge-banner-tutorial-ood": "合併後,此使用教學將不再適用,可能無法使用。若想繼續做出貢獻,請先在 github 上提交提取要求。", + "page-upgrades-post-merge-banner-governance-ood": "合併後,此頁面上的有些內容將不再適用。若想繼續做出貢獻,請先在 github 上提交提取要求。", "page-upgrades-upgrades-guide": "以太坊升級指南", "page-upgrades-upgrades-docking": "合併", "page-upgrades-shard-title": "分片", "page-upgrades-upgrades-beacon-chain": "信標鏈", - "consensus-beaconscan-title": "信標掃描", + "consensus-beaconscan-title": "beaconscan", "consensus-beaconscan-in-title": "beaconcha.in", "consensus-beaconcha-in-desc": "開放原始碼信標鏈總管", "consensus-beaconscan-desc": "共識層信標鏈總管 - Etherscan", "consensus-become-staker": "成為質押者", "consensus-become-staker-desc": "質押現可使用!若想質押以太幣來協助保護網路安全,請先確保自己知悉相關風險。", "consensus-explore": "探索資料", - "consensus-run-beacon-chain": "運行共識用戶端", + "consensus-run-beacon-chain": "執行共識用戶端", "consensus-run-beacon-chain-desc": "以太坊需要大量用戶端協助運作。請為以太坊的共同利益一起努力!", "read-more": "閱讀更多資訊" } diff --git a/src/intl/zh-tw/page-wallets-find-wallet.json b/src/intl/zh-tw/page-wallets-find-wallet.json index 753d110b0e6..7053fc26db7 100644 --- a/src/intl/zh-tw/page-wallets-find-wallet.json +++ b/src/intl/zh-tw/page-wallets-find-wallet.json @@ -18,12 +18,12 @@ "page-find-wallet-hardware-wallet-support-desc": "可連結至硬體錢包以增強安全性的錢包", "page-find-wallet-walletconnect": "WalletConnect", "page-find-wallet-walletconnect-desc": "支援 WalletConnect 以連結至去中心化應用程式的錢包", - "page-find-wallet-rpc-importing": "遠端程式呼叫協定匯入", - "page-find-wallet-rpc-importing-desc": "支援自訂遠端程式呼叫協定端點,以連結至不同節點或網路的錢包", + "page-find-wallet-rpc-importing": "遠端程序呼叫協定匯入", + "page-find-wallet-rpc-importing-desc": "支援自訂遠端程序呼叫協定端點,以連結至不同節點或網路的錢包", "page-find-wallet-nft-support": "支援非同質化代幣", "page-find-wallet-nft-support-desc": "支援檢視非同質化代幣並與之互動的錢包", "page-find-wallet-connect-to-dapps": "連結至去中心化應用程式", - "page-find-wallet-connect-to-dapps-desc": "連結至建於以太坊網絡上的應用程式的錢包", + "page-find-wallet-connect-to-dapps-desc": "連結至建於以太坊網路上的應用程式的錢包", "page-find-wallet-staking": "權益質押", "page-find-wallet-staking-desc": "從錢包中直接質押以太幣", "page-find-wallet-swaps": "交換", @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "功能篩選條件", "page-find-wallet-footnote-1": "本頁面所列錢包並非官方認可,僅供用於參考用途。", "page-find-wallet-footnote-2": "錢包說明由錢包專案本身提供。", - "page-find-wallet-footnote-3": "我们根據我们上架政策中的標準將產品添加到本頁面。如果你想讓我們添加錢包,請在 GitHub 中提出問題。", + "page-find-wallet-footnote-3": "我們根據上市政策中的標準將產品新增到本頁面。如果你希望我們新增錢包,請在 GitHub 中提出問題。", "page-find-wallet-mobile": "行動裝置", "page-find-wallet-mobile-desc": "有行動裝置應用程式的錢包", "page-find-wallet-desktop": "桌上型電腦", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "有瀏覽器擴充功能的錢包", "page-find-wallet-device": "裝置", "page-find-choose-to-compare": "選擇比較對象", - "page-find-wallet-choose-features": "選擇功能" + "page-find-wallet-choose-features": "選擇功能", + "page-find-wallet-reset-filters": "重置篩選器" } diff --git a/src/intl/zh-tw/page-what-is-ethereum.json b/src/intl/zh-tw/page-what-is-ethereum.json index 513b35007f4..1a1fedb3ca6 100644 --- a/src/intl/zh-tw/page-what-is-ethereum.json +++ b/src/intl/zh-tw/page-what-is-ethereum.json @@ -12,7 +12,7 @@ "page-what-is-ethereum-commerce-card": "商業保障", "page-what-is-ethereum-commerce-card-desc": "顧客有安全、內建的保證,所有資金只在你同意的情況才會轉手。同樣的,開發者可以確定規則不會改變他們。", "page-what-is-ethereum-composable-card": "可組合產品", - "page-what-is-ethereum-composable-card-desc": "所有應用程式都建立在同一條區塊鏈上,有著共同的全域狀態,這意味著它們可以在彼此的基礎上開發(如同樂高積木一樣)。因此,可以提供更佳的產品和體驗以及更可靠的保障,確保沒有人可以移除應用程式所依賴的任何工具。", + "page-what-is-ethereum-composable-card-desc": "所有應用程式都建立在同一條區塊鏈上,有著共同的全域狀態,這意味著它們可以在彼此的基礎上開發(如同樂高積木一樣)。因此,可以提供更佳的產品和體驗以及更可靠的保障,確保沒有人可以移除應用程式所依賴的任何工具。", "page-what-is-ethereum-community": "以太坊社群", "page-what-is-ethereum-desc": "數位未來的基礎", "page-what-is-ethereum-explore": "探索以太坊", @@ -65,7 +65,7 @@ "page-what-is-ethereum-explore-applications": "探索應用程式", "page-what-is-ethereum-learn-defi": "了解去中心化金融 (DeFi)", "page-what-is-ethereum-who-runs-ethereum-title": "誰在運行以太坊?", - "page-what-is-ethereum-who-runs-ethereum-desc-1": "以太坊不受任何特定實體控制。只要有相互連接並按照以太坊協議運行軟體的電腦,並且這些電腦能持續新增區塊到以太坊區塊鏈上,以太坊就會存在。其中每一臺電腦都稱為「節點」。節點可以由任何人運行,但要參與保護網路,你必須質押以太幣(以太坊的原生代幣)。任何人只要擁有 32 個以太幣都可以運行節點而無需許可。", + "page-what-is-ethereum-who-runs-ethereum-desc-1": "以太坊不受任何特定實體控制。只要有相互連接並按照以太坊協議運行軟體的電腦,並且這些電腦能持續新增區塊到以太坊區塊鏈上,以太坊就會存在。其中每一臺電腦都稱為「節點」。節點可以由任何人運行,但要參與保護網路,你必須質押以太幣(以太坊的原生代幣)。任何人只要擁有 32 個以太幣都可以運行節點而無需許可。", "page-what-is-ethereum-who-runs-ethereum-desc-2": "甚至以太坊的原始程式碼也不是由單個實體生成的。任何人都可以提議對協議進行改動並討論升級。有一些以太坊協議的實作由獨立組織用多種程式語言完成。它們通常建立在開放的基礎上,並鼓勵來自社群的貢獻。", "page-what-is-ethereum-run-a-node": "運行一個節點", "page-what-is-ethereum-smart-contract-title": "什麼是智慧型合約?", @@ -84,7 +84,7 @@ "page-what-is-ethereum-more-on-energy-consumption": "更多關於能源消耗的資訊", "page-what-is-ethereum-energy-consumption-chart-legend": "年度能源消耗 (TWh/年)", "energy-consumption-chart-global-data-centers-label": "全球資料中心", - "energy-consumption-gold-mining-cbeci-label": "淘金", + "energy-consumption-gold-mining-cbeci-label": "開採金礦", "energy-consumption-chart-btc-pow-label": "比特幣工作量證明", "energy-consumption-chart-netflix-label": "網飛", "energy-consumption-chart-eth-pow-label": "以太幣工作量證明", From bda4b3683f2c08179ea73e7bd32cc8e1422283c5 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 16:11:10 -0700 Subject: [PATCH 372/478] French import Feb 20 (Homepage, Community, Foundational docs - proof-of-work, Smart contract - basics, Learn pages 2, Misc, Contributing, Tutorials I) --- .../fr/community/get-involved/index.md | 20 +- .../translations/fr/community/online/index.md | 6 +- .../fr/community/research/index.md | 7 +- .../fr/community/support/index.md | 6 +- .../fr/contributing/adding-products/index.md | 4 +- .../adding-staking-products/index.md | 2 +- .../contributing/design-principles/index.md | 2 +- .../translations/fr/contributing/index.md | 4 +- .../how-to-translate/index.md | 2 +- .../contributing/translation-program/index.md | 6 +- .../translators-guide/index.md | 2 +- .../mining/mining-algorithms/ethash/index.md | 2 +- .../docs/smart-contracts/anatomy/index.md | 2 +- .../docs/smart-contracts/deploying/index.md | 14 +- .../docs/smart-contracts/languages/index.md | 4 +- .../docs/smart-contracts/security/index.md | 6 +- .../uniswap-v2-annotated-code/index.md | 42 +- .../content/translations/fr/glossary/index.md | 1028 +++-------------- .../content/translations/fr/history/index.md | 11 +- src/intl/fr/common.json | 2 +- src/intl/fr/glossary.json | 344 ++++++ src/intl/fr/page-dapps.json | 4 + src/intl/fr/page-stablecoins.json | 1 - 23 files changed, 588 insertions(+), 933 deletions(-) create mode 100644 src/intl/fr/glossary.json diff --git a/public/content/translations/fr/community/get-involved/index.md b/public/content/translations/fr/community/get-involved/index.md index e55e1e06f64..67a03729d0c 100644 --- a/public/content/translations/fr/community/get-involved/index.md +++ b/public/content/translations/fr/community/get-involved/index.md @@ -121,18 +121,18 @@ Les « DAO » sont des organisations autonomes décentralisées. Ces groupes t - [DAOSquare](https://www.daosquare.io) [@DAOSquare](https://twitter.com/DAOSquare) - _Promouvoir le concept de DAO dans le domaine non technologique et aider les personnes à créer de la valeur grâce au DAO_ - [Développeur DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _Communauté de constructeurs qui croient en la propriété collective d'Internet_ -- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - _Collectif de développement Web3 indépendant travaillant en tant que DAO_ +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - *Collectif de développement Web3 indépendant travaillant en tant que DAO* - [DXdao](https://DXdao.eth.link/) [@DXdao](https://twitter.com/DXdao_) - _ Développement décentralisé & gouvernance des applications décentralisées (dApps) & protocoles_ -- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _Gouvernance communautaire de DAOhaus_ +- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - *Gouvernance communautaire de DAOhaus* - [Hero DAO](https://herodao.org/) [@hero_dao](https://twitter.com/hero_dao) - _Franchise de super-héros appartenant à la Communauté_ -- [LexDAO](https://lexdao.coop) [@lex_DAO](https://twitter.com/lex_DAO) - _Ingénierie juridique_ -- [Machi X](https://machix.com) [@MachiXOfficial](https://twitter.com/MachiXOfficial) - _Communauté artistique_ -- [MetaCartel](https://metacartel.org) [@Meta_Cartel](https://twitter.com/Meta_Cartel) - _Incubateur DAO_ -- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) - _Venture pour des projets de crypto pré-amorçage_ -- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) - _Mécaniques de jeu MMORPG pour la vraie vie_ -- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) - _Marques de vêtements digiphysiques_ +- [LexDAO](https://lexdao.coop) [@lex_DAO](https://twitter.com/lex_DAO) - *Ingénierie juridique* +- [Machi X](https://machix.com) [@MachiXOfficial](https://twitter.com/MachiXOfficial) - *Communauté artistique* +- [MetaCartel](https://metacartel.org) [@Meta_Cartel](https://twitter.com/Meta_Cartel) - *Incubateur DAO* +- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) - *Venture pour des projets de crypto pré-amorçage* +- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) - *Mécaniques de jeu MMORPG pour la vraie vie* +- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) - *Marques de vêtements digiphysiques* - [ΜΓΔ](https://metagammadelta.com/) (Meta Gamma Delta) [@metagammadelta](https://twitter.com/metagammadelta) - _Projets dirigés par des femmes_ -- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - _Communauté axée sur le financement du développement d'Ethereum_ -- [Guilde Raid](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - _Collectif de constructeurs Web3_ +- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - *Communauté axée sur le financement du développement d'Ethereum* +- [Guilde Raid](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - *Collectif de constructeurs Web3* À chaque fois et quelle que soit la façon dont vous contribuez à ethereum.org, pensez à respecter le [code de conduite](/community/code-of-conduct) ! diff --git a/public/content/translations/fr/community/online/index.md b/public/content/translations/fr/community/online/index.md index 08dd5672228..9173adbe6f6 100644 --- a/public/content/translations/fr/community/online/index.md +++ b/public/content/translations/fr/community/online/index.md @@ -27,10 +27,10 @@ Des centaines de milliers de passionnés d'Ethereum se rassemblent sur ces forum Le serveur Discord d'EthStaker - orientation par la communauté, éducation, soutien et ressources pour les stakeurs et stakeurs potentiels. Équipe du site web Ethereum.org - consultez et discutez du développement et du design du site web ethereum.org avec l'équipe et les membres de la communauté Discord Matos - Communauté de créateurs Web3 où les bâtisseurs, les chefs de file industriels et les passionnés d'Ethereum se rencontrent. Nous sommes passionnés par le développement du Web3, sa conception et sa culture. Venez le bâtir avec nous. -Solidity Gitter - forum de discussion pour le développement Solidity (Gitter) +Solidity Gitter - forum de discussion pour le développement Solidity (Gitter) Solidity Matrix - forum de discussion pour le développement Solidity (Matrix) -Ethereum Stack Exchange _- forum de questions-réponses_ -Peeranha _- forum de questions-réponses décentralisé_ +Ethereum Stack Exchange *- forum de questions-réponses* +Peeranha *- forum de questions-réponses décentralisé* ## YouTube et Twitter {#youtube-and-twitter} diff --git a/public/content/translations/fr/community/research/index.md b/public/content/translations/fr/community/research/index.md index 2154590bce4..eb0c091273b 100644 --- a/public/content/translations/fr/community/research/index.md +++ b/public/content/translations/fr/community/research/index.md @@ -40,9 +40,9 @@ Outre les recherches prospectives, certaines refontes fondamentales du protocole #### Lectures de référence {#background-reading} - [Introduction à la preuve d'enjeu](/developers/docs/consensus-mechanisms/pos/) -- [Papier sur Casper-FFG](https://arxiv.org/abs/1710.09437) +- [Article sur Casper-FFG](https://arxiv.org/abs/1710.09437) - [Casper-FFG expliqué](https://arxiv.org/abs/1710.09437) -- [Papier sur Gasper](https://arxiv.org/abs/2003.03052) +- [Article sur Gasper](https://arxiv.org/abs/2003.03052) #### Recherche récente {#recent-research} @@ -124,7 +124,7 @@ Un domaine particulier de la couche 2 qui nécessite davantage de recherche et d - [Introduction aux ponts blockchain](/bridges/) - [Vitalik à propos des ponts](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - [Article sur les ponts entre blockchain](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) -- [Valeur en caution dans les ponts]() +- [Valeur en caution dans les ponts](https://dune.com/eliasimos/Bridge-Away-(from-Ethereum)) #### Recherche récente {#recent-research-3} @@ -346,7 +346,6 @@ Les outils destinés aux développeurs Ethereum s'améliorent rapidement. Il y a - [Frameworks pour développeurs](/developers/docs/frameworks/) - [Liste d'outils pour développeurs de consensus](https://github.com/ConsenSys/ethereum-developer-tools-list) - [Normes de jetons](/developers/docs/standards/tokens/) -- [Biastek : Outils Ethereum](https://biastek.com/ethereum-tools/) - [CryptoDevHub : Outils EVM](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) #### Recherche récente {#recent-research-17} diff --git a/public/content/translations/fr/community/support/index.md b/public/content/translations/fr/community/support/index.md index 34f8e9ab023..d2370c1d0a0 100644 --- a/public/content/translations/fr/community/support/index.md +++ b/public/content/translations/fr/community/support/index.md @@ -30,7 +30,7 @@ Vous rencontrez un problème avec votre portefeuille ? La plupart des portefeuil - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Cette liste est non-exhaustive. Vous avez besoin d'aide pour trouver l'assistance pour un portefeuille spécifique ? Rejoignez le [Discord Ethereum.org](https://discord.gg/ethereum-org) et nous essaierons de vous aider._ +_Cette liste est non-exhaustive. Vous avez besoin d'aide pour trouver l'assistance pour un portefeuille spécifique ? Rejoignez le [Discord ethereum.org](https://discord.gg/ethereum-org) et nous tenterons de vous aider._ Vous êtes à la recherche d'un portefeuille Ethereum ? [Explorez notre liste complète de portefeuilles Ethereum](/wallets/find-wallet/). @@ -39,7 +39,7 @@ Vous êtes à la recherche d'un portefeuille Ethereum ? [Explorez notre liste co Le développement d'une application décentralisée peut être difficile. Voici quelques espaces axés sur leur création, avec des développeurs Ethereum chevronnés qui seront heureux de vous faire part de leur expérience. - [Alchemy University](https://university.alchemy.com/#starter_code) -- [Discord CryptoDevs](https://discord.gg/Z9TA39m8Yu) +- [Discord CryptoDevs](https://discord.com/invite/5W5tVb3) - [StackExchange Ethereum](https://ethereum.stackexchange.com/) - [StackOverflow](https://stackoverflow.com/questions/tagged/web3) - [Web3 University](https://www.web3.university/) @@ -53,7 +53,7 @@ Votre question concerne un outil, un projet ou une bibliothèque en particulier Voici quelques exemples connus : -- [Solidity](https://gitter.im/ethereum/solidity) +- [Solidity](https://gitter.im/ethereum/solidity/) - [ethers.js](https://discord.gg/6jyGVDK6Jx) - [web3.js](https://discord.gg/GsABYQu4sC) - [Hardhat](https://discord.gg/xtrMGhmbfZ) diff --git a/public/content/translations/fr/contributing/adding-products/index.md b/public/content/translations/fr/contributing/adding-products/index.md index f6fcea1276d..e31a56004ef 100644 --- a/public/content/translations/fr/contributing/adding-products/index.md +++ b/public/content/translations/fr/contributing/adding-products/index.md @@ -17,8 +17,8 @@ Les Dapps sont actuellement listés sur: Bien que nous appréciions les nouveaux ajouts, nous avons choisi les DApps actuelles en fonction d'une expérience que nous essayons de créer pour nos utilisateurs. Ceux-ci sont basés sur certains de nos principes de conception : -- *Inspirant* : tout ce qui est sur ethereum.org devrait offrir quelque chose de nouveau aux utilisateurs -- *Une bonne histoire* : ce qui est répertorié devrait entraîner un moment de révélation (ah, ah !) +- _Inspirant_ : tout ce qui est sur ethereum.org devrait offrir quelque chose de nouveau aux utilisateurs +- _Une bonne histoire_ : ce qui est répertorié devrait entraîner un moment de révélation (ah, ah !) - _Crédible_ : toutes les entreprises/projets doivent être légitimes pour minimiser les risques pour les utilisateurs Dans l’ensemble, **ethereum.org souhaite offrir une « expérience d’intégration transparente » aux nouveaux utilisateurs**. C'est pourquoi nous ajoutons des DApps en fonction de leur : diff --git a/public/content/translations/fr/contributing/adding-staking-products/index.md b/public/content/translations/fr/contributing/adding-staking-products/index.md index fe82d04eb29..8bd43e65139 100644 --- a/public/content/translations/fr/contributing/adding-staking-products/index.md +++ b/public/content/translations/fr/contributing/adding-staking-products/index.md @@ -87,7 +87,7 @@ Pour tout logiciel personnalisé ou contrat intelligent impliqué : Pour les produits logiciels liés à la configuration de nœuds ou de clients, la gestion ou la migration : -**Quels clients de la couche de consensus (c'est-à-dire Lighthouse, Teku, Nimbus, Prysm) sont pris en charge ?** +**Quels clients de la couche de consensus (c'est-à-dire Lighthouse, Teku, Nimbus, Prysm) sont pris en charge ?** - Quels sont les clients pris en charge ? L'utilisateur peut-il choisir ? - Ceci est utilisé pour déterminer le score « multi-client » des produits. diff --git a/public/content/translations/fr/contributing/design-principles/index.md b/public/content/translations/fr/contributing/design-principles/index.md index 91a15553b8f..39c9c3ad4e6 100644 --- a/public/content/translations/fr/contributing/design-principles/index.md +++ b/public/content/translations/fr/contributing/design-principles/index.md @@ -90,4 +90,4 @@ Vous pouvez voir nos principes de conception en action [dans l'ensemble de notre Bien que ces principes soient axés sur le site web ethereum.org, nous espérons que beaucoup d'entre eux sont représentatifs des valeurs de l'écosystème Ethereum dans son ensemble (par exemple, vous pouvez voir l'influence des [principes du livre blanc Ethereum](https://github.com/ethereum/wiki/wiki/White-Paper#philosophy)). Peut-être voudrez-vous même incorporer certains d'entre eux dans votre propre projet ! -Faites-nous part de vos réflexions sur le [serveur Discord](https://discord.gg/ethereum-org) ou en [créant un ticket](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.md&title=). +Faites-nous part de vos commentaires sur le [serveur Discord](https://discord.gg/ethereum-org) ou en [créant un ticket](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/fr/contributing/index.md b/public/content/translations/fr/contributing/index.md index ca7e5aed895..9db59b88e54 100644 --- a/public/content/translations/fr/contributing/index.md +++ b/public/content/translations/fr/contributing/index.md @@ -32,7 +32,7 @@ Le site ethereum.org, comme Ethereum plus largement, est un projet open source. - [Quizz](/contributing/quizzes/) _- Ajoutez, mettez à jour et supprimez des banques de questions de quiz pour une page pertinente_ - [Suggérer une ressource de design](/contributing/design/adding-design-resources/) _- Ajoutez, mettez à jour et supprimez des ressources de design utiles_ -_Une question ?_ 🤔 Rejoignez-nous sur notre [serveur Discord](https://discord.gg/ethereum-org) +_Des questions ? _ 🤔 Contactez nous sur notre [serveur Discord](https://discord.gg/ethereum-org). ## Comment travailler sur ethereum.org {#how-to-update-content} @@ -43,7 +43,7 @@ Toutes les mises à jour sont faites sur GitHub via le processus de demande d'ex Vous n'avez pas besoin d'autorisation pour travailler sur quoi que ce soit, mais il est toujours préférable de nous faire savoir ce que vous prévoyez de faire. Pour ce faire, vous pouvez : - commenter un ticket ou une PR sur [GitHub](https://github.com/ethereum/ethereum-org-website) ; ou -- nous envoyer un message sur notre [serveur Discord](https://discord.gg/ethereum-org). +- Laissez un message sur notre [serveur Discord](https://discord.gg/ethereum-org) Avant de contribuer, assurez-vous que vous connaissez bien : diff --git a/public/content/translations/fr/contributing/translation-program/how-to-translate/index.md b/public/content/translations/fr/contributing/translation-program/how-to-translate/index.md index 19c3eb5b442..a971d324d24 100644 --- a/public/content/translations/fr/contributing/translation-program/how-to-translate/index.md +++ b/public/content/translations/fr/contributing/translation-program/how-to-translate/index.md @@ -18,7 +18,7 @@ Pour les apprenants plus visuels, regardez la vidéo de Luka qui présente le pa Vous devrez vous connecter à votre compte Crowdin ou vous inscrire si vous n'avez pas encore de compte. Tout ce qui est nécessaire pour vous inscrire est un compte de messagerie et un mot de passe. - + Rejoindre le projet diff --git a/public/content/translations/fr/contributing/translation-program/index.md b/public/content/translations/fr/contributing/translation-program/index.md index e9a74f01123..e8eb4012849 100644 --- a/public/content/translations/fr/contributing/translation-program/index.md +++ b/public/content/translations/fr/contributing/translation-program/index.md @@ -22,7 +22,7 @@ Le programme de traduction d'ethereum.org est ouvert et n'importe qui peut y con _Rejoignez [ethereum.org Discord](/discord/) pour collaborer aux traductions, poser des questions, partager des commentaires et des idées, ou rejoindre un groupe de traduction._ - + Commencez à traduire @@ -36,8 +36,8 @@ En savoir plus sur [la mission et la vision](/contributing/translation-program/m ### Les progrès réalisés jusqu'à présent {#our-progress} -- [**5,100 +** traducteurs](/contributing/translation-program/contributors/) -- [**54** langues présentes sur le site](/languages/) +- [**5 600+** traducteurs](/contributing/translation-program/contributors/) +- [**62** langues en direct sur le site](/languages/) - [**3 millions** de mots traduits en 2022](/contributing/translation-program/acknowledgements/) diff --git a/public/content/translations/fr/contributing/translation-program/translators-guide/index.md b/public/content/translations/fr/contributing/translation-program/translators-guide/index.md index cf24ac277a5..28ef43c259a 100644 --- a/public/content/translations/fr/contributing/translation-program/translators-guide/index.md +++ b/public/content/translations/fr/contributing/translation-program/translators-guide/index.md @@ -10,7 +10,7 @@ Le guide de style pour la traduction d'ethereum.org contient les principales rec Ce document sert de guide général et n'est spécifique à aucune langue. -Si vous avez des questions, des suggestions ou des commentaires, n'hésitez pas à nous contacter à l'adresse translations@ethereum.org, à envoyer un message à @ethdotorg sur Crowdin ou à [rejoindre notre serveur Discord](https://discord.gg/ethereum-org), où vous pourrez nous envoyer un message dans le salon #translations ou contacter l'un des membres de l'équipe. +Si vous avez des questions, des suggestions ou des commentaires, n'hésitez pas à nous contacter à l'adresse translations@ethereum.org, à envoyer un message à @ethdotorg sur Crowdin ou à [rejoindre notre serveur Discord](https://discord.gg/ethereum-org), où vous pourrez nous envoyer un message dans le canal #translations ou contacter l'un des membres de l'équipe. ## Utiliser Crowdin {#using-crowdin} diff --git a/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index e31290eef6a..c91d7602500 100644 --- a/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### L'utilisation de 'SHA3' {#sha3} -Le développement d'Ethereum a coïncidé avec le développement de la norme SHA3, et le processus de normes a réalisé un changement tardif dans le remplissage de l'algorithme de hachage finalisé de sorte que les hachages Ethereum "sha3_256" et "sha3_512" ne soient pas des hashs sha3 standard, mais une variante appelée souvent « Keccak-256 » et « Keccak-512 » dans d'autres contextes. Voir la discussion en exemple [ici](https://eips.ethereum.org/EIPS-1803), [ici](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use), ou [ici](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +Le développement d'Ethereum a coïncidé avec le développement de la norme SHA3, et le processus de normes a réalisé un changement tardif dans le remplissage de l'algorithme de hachage finalisé de sorte que les hachages Ethereum "sha3_256" et "sha3_512" ne soient pas des hashs sha3 standard, mais une variante appelée souvent « Keccak-256 » et « Keccak-512 » dans d'autres contextes. Voir la discussion, par exemple [ici](https://eips.ethereum.org/EIPS/eip-1803), [ici](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use), ou [ici](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Veuillez garder cela à l'esprit, car les hachages « sha3 » sont mentionnés dans la description de l'algorithme ci-dessous. diff --git a/public/content/translations/fr/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/fr/developers/docs/smart-contracts/anatomy/index.md index dfaee8ba4b4..f155a3d96ce 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/anatomy/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/anatomy/index.md @@ -1,6 +1,6 @@ --- title: Anatomie des contrats intelligents -description: "Examen approfondi des composantes d'un contrat intelligent : les fonctions, les données et les variables." +description: 'Examen approfondi des composantes d''un contrat intelligent : les fonctions, les données et les variables.' lang: fr --- diff --git a/public/content/translations/fr/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/fr/developers/docs/smart-contracts/deploying/index.md index 4e88d73a96c..0f5365971cc 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/deploying/index.md @@ -4,7 +4,7 @@ description: lang: fr --- -Vous devez déployer vos contrats intelligents afin qu'ils soient disponibles pour les utilisateurs sur un réseau Ethereum. +Vous devez déployer votre contrat intelligent afin qu'il soit disponible pour les utilisateurs sur un réseau Ethereum. Déployer un contrat intelligent consiste à envoyer sur la blockchain une transaction contenant le code du contrat intelligent compilé sans spécifier de destinataire. @@ -20,16 +20,14 @@ Enfin, comme vous devrez compiler votre contrat avant de le déployer, assurez-v ### Ce dont vous aurez besoin {#what-youll-need} -- Le bytecode du contrat, généré par la [compilation](/developers/docs/smart-contracts/compiling/). +- Le bytecode de votre contrat - il est généré par la [compilation](/developers/docs/smart-contracts/compiling/). - Des ethers pour le gaz. Vous fixerez votre limite de gaz comme pour les autres transactions, mais sachez que les déploiements de contrats nécessitent beaucoup plus de gaz qu'un simple transfert d'ethers. - Un script de déploiement ou un plugin. - l'accès à un [nœud Ethereum](/developers/docs/nodes-and-clients/), soit en créant le vôtre, soit en vous connectant à un nœud public, soit via un [service de nœuds](/developers/docs/nodes-and-clients/nodes-as-a-service/) avec une clé d'API ### Étapes pour déployer un contrat intelligent {#steps-to-deploy} -Les étapes spécifiques dépendront des outils que vous utilisez. Par exemple, consultez la [documentation Hardhat pour deployer des contrats](https://hardhat.org/guides/deploying.html) ou la [documentation Truffle sur les réseaux et le déploiement d'applications](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment). Ce sont deux des outils les plus populaires pour le déploiement de contrats intelligents, qui impliquent la rédaction d'un script pour gérer les étapes de déploiement. - -Une fois déployé, votre contrat aura une adresse Ethereum comme les autres [comptes](/developers/docs/accounts/). +Les étapes spécifiques dépendent du cadre de développement en question. Par exemple, vous pouvez consulter la [documentation de Hardhat sur le déploiement de vos contrats](https://hardhat.org/guides/deploying.html) ou [la documentation de Foundry sur le déploiement et la vérification d'un contrat intelligent](https://book.getfoundry.sh/forge/deploying). Une fois déployé, votre contrat aura une adresse Ethereum comme les autres [comptes](/developers/docs/accounts/) et pourra être vérifié à l'aide [d'outils de vérification du code source](/developers/docs/smart-contracts/verifying/#source-code-verification-tools). ## Outils connexes {#related-tools} @@ -51,12 +49,6 @@ Une fois déployé, votre contrat aura une adresse Ethereum comme les autres [co - [GitHub](https://github.com/nomiclabs/hardhat) - [Discord](https://discord.com/invite/TETZs2KK4k) -**Truffle -** **_ Environnement de développement, infrastructure de test, pipeline de construction et autres outils_** - -- [trufflesuite.com](https://www.trufflesuite.com/) -- [Documentation sur les réseaux et le déploiement d'applications](https://www.trufflesuite.com/docs/truffle/advanced/networks-and-app-deployment) -- [GitHub](https://github.com/trufflesuite/truffle) - **thirdweb - _Déployez facilement n'importe quel contrat sur n'importe quelle chaîne compatible EVM en une seule commande_** - [Documentation](https://portal.thirdweb.com/deploy/) diff --git a/public/content/translations/fr/developers/docs/smart-contracts/languages/index.md b/public/content/translations/fr/developers/docs/smart-contracts/languages/index.md index 4865a44e51c..bd06f874e0c 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/languages/index.md @@ -1,6 +1,6 @@ --- title: Les langages des contrats intelligents -description: "Présentation et comparaison des deux principaux langages de contrat intelligent : Solidity et Vyper" +description: 'Présentation et comparaison des deux principaux langages de contrat intelligent : Solidity et Vyper' lang: fr --- @@ -35,7 +35,7 @@ La connaissance de langages de programmation comme JavaScript ou Python peut vou - [Portail Solidity](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) en jonction avec [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) +- [Solidity Gitter Chatroom](https://gitter.im/ethereum/solidity/) en jonction avec [Solidity Matrix Chatroom](https://matrix.to/#/#ethereum_solidity:gitter.im) - [Cheat Sheet](https://reference.auditless.com/cheatsheet) - [Blog Solidity](https://blog.soliditylang.org/) - [Twitter Solidity](https://twitter.com/solidity_lang) diff --git a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md index 77be68f22bb..29913b853ec 100644 --- a/public/content/translations/fr/developers/docs/smart-contracts/security/index.md +++ b/public/content/translations/fr/developers/docs/smart-contracts/security/index.md @@ -259,7 +259,7 @@ Ce contrat expose une fonction `withdraw()` pour permettre aux utilisateurs de r 2. Envoie des fonds à l'adresse d'appel 3. Réinitialise son solde à 0, empêchant les retraits supplémentaires de l'utilisateur -La fonction `withdraw()` dans le contrat `Victim` suit un modèle « checks-interactions-effects ». Il _vérifie_ si les conditions nécessaires à l'exécution sont satisfaites (c.-à-d. l'utilisateur a un solde ETH positif) et effectue l'interaction \__ en envoyant l'ETH à l'adresse de l'appelant, avant d'appliquer les \_effets_ de la transaction (c.-à-d., réduisant le solde de l’utilisateur). +La fonction `withdraw()` dans le contrat `Victim` suit un modèle « checks-interactions-effects ». Il _vérifie_ si les conditions nécessaires à l'exécution sont satisfaites (c.-à-d. l'utilisateur a un solde ETH positif) et effectue l'interaction __ en envoyant l'ETH à l'adresse de l'appelant, avant d'appliquer les _effets_ de la transaction (c.-à-d., réduisant le solde de l’utilisateur). Si la fonction `withdraw()` est appelée depuis un compte externe (Externally Orné Account, dit EOA), la fonction s'exécute comme attendu : `msg.sender.call.value()` envoie l'ETH à l'appelant. Cependant, si `msg.sender` est un compte de contrat intelligent qui appelle `withdraw()`, l'envoie de fonds en utilisant `msg.sender.call.value()` déclenchera également le code stocké à cette adresse pour l'exécuter. @@ -470,13 +470,13 @@ Si vous comptez interroger un oracle sur le prix des actifs, envisagez d'utilise ### Outils de surveillance des contrats intelligents {#smart-contract-monitoring-tools} -- **[Sentinelles de défenseur OpenZeppelin](https://docs.openzeppelin.com/defender/sentinel)** - _Un outil pour surveiller et répondre automatiquement aux événements, fonctions et paramètres de transaction sur vos contrats intelligents._ +- **[Sentinelles de défenseur OpenZeppelin](https://docs.openzeppelin.com/defender/v1/sentinel)** - _Un outil pour surveiller et répondre automatiquement aux événements, fonctions et paramètres de transaction sur vos contrats intelligents._ - **[Alerte en temps réel Tenderly](https://tenderly.co/alerting/)** - _Un outil pour recevoir des notifications en temps réel lorsque des événements inhabituels ou inattendus se produisent sur vos contrats intelligents ou portefeuilles._ ### Outils pour une administration sécurisée des contrats intelligents {#smart-contract-administration-tools} -- **[OpenZeppelin Defender Admin](https://docs.openzeppelin.com/defender/admin)** - _Interface pour gérer l'administration des contrats intelligents, y compris les contrôles d'accès, les mises à jour et la pause._ +- **[OpenZeppelin Defender Admin](https://docs.openzeppelin.com/defender/v1/admin)** - _Interface pour gérer l'administration des contrats intelligents, y compris les contrôles d'accès, les mises à jour et la pause._ - **[Safe](https://safe.global/)** - _Portefeuille à contrat intelligent fonctionnant sur Ethereum qui exige qu'un nombre minimum de personnes approuvent une transaction avant qu'elle ne puisse avoir lieu (M-of-N)._ diff --git a/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md index 76ef87e5f32..932255920d8 100644 --- a/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -202,13 +202,13 @@ Dans le cadre de l'échange de paires, le taux de change entre le jeton0 et jeto Voici un exemple simple. Notez que pour des raisons de simplicité, le tableau n'affiche que trois chiffres après la virgule et que nous ignorons le taux de change de 0,3 % et qu'ainsi, les chiffres présentés sont inexacts. | Evénement | reserve0 | reserve1 | reserve0 \* reserve1 | Taux de change moyen (jeton1 / jeton0) | -| ----------------------------------------------------- | --------: | --------: | -------------------: | -------------------------------------- | -| Configuration initiale | 1.000,000 | 1.000,000 | 1.000.000 | | -| Le trader A échange 50 jetons0 contre 47,619 jetons1 | 1.050,000 | 952,381 | 1.000.000 | 0,952 | -| Le trader B échange 10 jetons0 contre 8,984 jetons1 | 1.060,000 | 943,396 | 1.000.000 | 0,898 | -| Le trader C échange 40 jetons0 pcontre 34,305 jetons1 | 1.100,000 | 909,090 | 1.000.000 | 0,858 | -| Le trader D échange 100 jetons1 contre 109,01 jetons0 | 990,990 | 1.009,090 | 1.000.000 | 0,917 | -| Le trader E échange 10 jetons0 contre 10,079 jetons1 | 1.000.990 | 999.010 | 1.000,000 | 1,008 | +| ----------------------------------------------------- | ---------:| ---------:| ----------------------:| -------------------------------------- | +| Configuration initiale | 1.000,000 | 1.000,000 | 1.000.000 | | +| Le trader A échange 50 jetons0 contre 47,619 jetons1 | 1.050,000 | 952,381 | 1.000.000 | 0,952 | +| Le trader B échange 10 jetons0 contre 8,984 jetons1 | 1.060,000 | 943,396 | 1.000.000 | 0,898 | +| Le trader C échange 40 jetons0 pcontre 34,305 jetons1 | 1.100,000 | 909,090 | 1.000.000 | 0,858 | +| Le trader D échange 100 jetons1 contre 109,01 jetons0 | 990,990 | 1.009,090 | 1.000.000 | 0,917 | +| Le trader E échange 10 jetons0 contre 10,079 jetons1 | 1.000.990 | 999.010 | 1.000,000 | 1,008 | Comme les traders fournissent plus de jetons0, la valeur relative du jeton1 augmente et vice versa, en fonction de l'offre et de la demande. @@ -364,10 +364,10 @@ Si le temps écoulé n'est pas nul, cela signifie que nous sommes la première t Chaque accumulateur de coûts est mis à jour en tenant compte du coût le plus récent (réserve de l'autre jeton/réserve de ce jeton) multiplié par le temps écoulé en secondes. Pour obtenir un prix moyen, vous prenez le prix cumulé de deux points dans le temps et le divisez par la différence de temps entre ces deux points. Par exemple, supposons cette séquence d'événements : -| Evénement | réserve0 | réserve1 | horodatage | Taux de change marginal (réserve1 / réserve0) | DernierprixCumulé0 | -| --------------------------------------------------------- | --------: | --------: | ---------- | --------------------------------------------: | -------------------------: | -| Configuration initiale | 1.000,000 | 1.000,000 | 5.000 | 1,000 | 0 | -| Le Trader A dépose 50 jetons0 et récupère 47,619 jetons1 | 1.050,000 | 952,381 | 5.020 | 0,907 | 20 | +| Evénement | réserve0 | réserve1 | horodatage | Taux de change marginal (réserve1 / réserve0) | DernierprixCumulé0 | +| --------------------------------------------------------- | ---------:| ---------:| ---------- | ---------------------------------------------:| ----------------------------:| +| Configuration initiale | 1.000,000 | 1.000,000 | 5.000 | 1,000 | 0 | +| Le Trader A dépose 50 jetons0 et récupère 47,619 jetons1 | 1.050,000 | 952,381 | 5.020 | 0,907 | 20 | | Le Trader B dépose 10 jetons0 et récupère 8,984 jetons1 | 1.060,000 | 943,396 | 5.030 | 0,890 | 20+10\*0,907 = 29,07 | | Le Trader C dépose 40 jetons0 et récupère 34,305 jetons1 | 1.100,000 | 909,090 | 5.100 | 0,826 | 29,07+70\*0,890 = 91,37 | | Le Trader D dépose 100 jetons1 et récupère 109,01 jetons0 | 990,990 | 1.009,090 | 5.110 | 1,018 | 91,37+10\*0,826 = 99,63 | @@ -499,9 +499,9 @@ Lors du premier dépôt, nous ne connaissons pas la valeur relative des deux jet Nous pouvons nous y fier parce qu'il est dans l'intérêt du déposant de fournir une valeur égale pour éviter de perdre de la valeur à l'arbitrage. Imaginons que la valeur des deux jetons est identique mais que notre déposant a déposé quatre fois plus de **Jetons1** que de **Jetons0**. Un trader peut s'appuyer sur le fait que l'échange de paire laisse supposer qu'il est plus utile de retirer de la valeur du **Jeton0**. | Evénement | réserve0 | réserve1 | réserve0 \* réserve1 | Valeur du pool (réserve0 + réserve1) | -| ---------------------------------------------------------------------- | -------: | -------: | -------------------: | -----------------------------------: | -| Configuration initiale | 8 | 32 | 256 | 40 | -| Le Trader dépose dépose 8 jetons **Jeton0** et récupère 16 **Jetons1** | 16 | 16 | 256 | 32 | +| ---------------------------------------------------------------------- | --------:| --------:| ----------------------:| ------------------------------------:| +| Configuration initiale | 8 | 32 | 256 | 40 | +| Le Trader dépose dépose 8 jetons **Jeton0** et récupère 16 **Jetons1** | 16 | 16 | 256 | 32 | Comme vous pouvez le constater, le trader a gagné 8 jetons supplémentaires qui viennent d'une réduction de la valeur du pool, affectant le déposant qui le possède. @@ -515,12 +515,12 @@ Comme vous pouvez le constater, le trader a gagné 8 jetons supplémentaires qui Qu'il s'agisse du dépôt initial ou d'un dépôt ultérieur, le nombre de jetons de liquidité que nous fournissons est égal à la racine carrée du changement dans `reserve0*reserve1` et la valeur du jeton de liquidité ne change pas (sauf si nous obtenons un dépôt qui n'a pas de valeurs égales pour les deux types, auquel cas l'« amende » est distribuée). Voici un autre exemple avec deux jetons qui ont la même valeur, avec trois bons dépôts et un mauvais (dépôt d'un seul type de jeton, donc il ne produit aucun jeton de liquidité). | Événement | réserve0 | réserve1 | réserve0 \* réserve1 | Valeur du pool (réserve0 + réserve1) | Jetons de liquidité frappés pour ce dépôt | Jetons de liquidité totaux | Valeur de chaque jeton de liquidité | -| ------------------------------ | -------: | -------: | -------------------: | -----------------------------------: | ----------------------------------------: | -------------------------: | ----------------------------------: | -| Configuration initiale | 8,000 | 8,000 | 64 | 16,000 | 8 | 8 | 2,000 | -| Dépôt de quatre de chaque type | 12,000 | 12,000 | 144 | 24,000 | 4 | 12 | 2,000 | -| Dépôt de deux de chaque type | 14,000 | 14,000 | 196 | 28,000 | 2 | 14 | 2,000 | -| Dépôt de valeurs inégales | 18,000 | 14,000 | 252 | 32,000 | 0 | 14 | ~2,286 | -| Après arbitrage | ~15,874 | ~15,874 | 252 | ~31,748 | 0 | 14 | ~2,267 | +| ------------------------------ | --------:| --------:| ----------------------:| ------------------------------------:| -----------------------------------------:| --------------------------:| -----------------------------------:| +| Configuration initiale | 8,000 | 8,000 | 64 | 16,000 | 8 | 8 | 2,000 | +| Dépôt de quatre de chaque type | 12,000 | 12,000 | 144 | 24,000 | 4 | 12 | 2,000 | +| Dépôt de deux de chaque type | 14,000 | 14,000 | 196 | 28,000 | 2 | 14 | 2,000 | +| Dépôt de valeurs inégales | 18,000 | 14,000 | 252 | 32,000 | 0 | 14 | ~2,286 | +| Après arbitrage | ~15,874 | ~15,874 | 252 | ~31,748 | 0 | 14 | ~2,267 | ```solidity } @@ -985,7 +985,7 @@ Les fournisseurs de liquidités spécifient un minimum, généralement parce qu' Par exemple, imaginez un cas où le taux de change est d'un pour un et où le fournisseur de liquidités spécifie ces valeurs : | Paramètre | Valeur | -| -------------- | -----: | +| -------------- | ------:| | amountADesired | 1000 | | amountBDesired | 1000 | | amountAMin | 900 | diff --git a/public/content/translations/fr/glossary/index.md b/public/content/translations/fr/glossary/index.md index ede11c3f3ef..5b5b26b4ca5 100644 --- a/public/content/translations/fr/glossary/index.md +++ b/public/content/translations/fr/glossary/index.md @@ -2,1119 +2,435 @@ title: Glossaire Ethereum description: Glossaire non-exhaustif des termes (techniques ou non) liés à Ethereum lang: fr -sidebarDepth: 2 --- # Glossaire {#ethereum-glossary} - - ## \# {#section-numbers} -### Attaque des 51 % {#51-attack} + -Type d'attaque mené sur un [réseau](#network) décentralisé où un groupe prend le contrôle de la majorité des [nœuds](#node). Cela permettrait de frauder la blockchain en inversant des [transactions](#transaction) et en doublant les dépenses d'[Ether](#ether) et d'autres jetons. + ## A {#section-a} -### Compte {#account} - -Objet contenant une [adresse](#address), un solde, un [nonce](#nonce), ainsi qu'un stockage et un code facultatifs. Il peut s'agir d'un [compte de contrat](#contract-account) ou d'un [compte externe (EOA)](#eoa). - - - Comptes Ethereum - - -### Adresse {#address} - -De manière générale, il s'agit d'un [compte externe (EOA)](#eoa) ou d'un [compte de contrat](#contract-account) qui peut recevoir (adresse de destination) ou envoyer (adresse source) des [transactions](#transaction) sur la blockchain. Plus spécifiquement, il s'agit des 160 bits de droite de l'[empreinte numérique Keccak](#keccak-256) d'une [clé publique](#public-key) [ECDSA](#ecdsa). - -### Interface binaire d'application (ABI) {#abi} - -Façon standardisée d'interagir avec les [contrats](#contract-account) dans l'écosystème Ethereum, que ce soit depuis l'extérieur de la blockchain ou pour les interactions de contrat à contrat. + - - ABI - + -### Interface de programmation d'application {#api} + -Une interface de programmation d'application (API) est un ensemble de définitions permettant d'utiliser un logiciel. Une API se situe entre une application et un serveur web et facilite le transfert de données entre eux. + -### ASIC {#asic} + -Circuit intégré spécifique à l’application. Ceci fait généralement référence à un circuit intégré, personnalisé pour le minage de cryptomonnaie. + -### Assert {#assert} - -Dans [Solidity](#solidity), `assert(false)` compile en `0xfe`, un code d'opération (opcode) non valide, qui utilise tout le [carburant](#gas) restant et annule toutes les modifications. Lorsqu'une déclaration `assert()` échoue, quelque chose ne fonctionne pas du tout comme prévu, et vous devez corriger votre code. Il est conseillé d'utiliser `assert()` pour éviter les conditions qui ne doivent jamais se produire. - - - Sécurité des contrats intelligents - - -### Attestation {#attestation} - -Une affirmation faite par une entité selon laquelle quelque chose est vrai. Dans le contexte d'Ethereum, les validateurs de consensus doivent déclarer ce qu'ils pensent être l'état de la chaîne. À des moments déterminés, chaque validateur est chargé de publier différentes attestations qui rendent officielle la vue de ce validateur sur la chaîne, y compris le dernier point de contrôle finalisé et la tête actuelle de la chaîne. - - - Attestations - + ## B {#section-b} -### Frais de base {#base-fee} - -Chaque [bloc](#block) a un prix de réserve connu sous le nom de « frais de base ». Il s'agit des frais minimum de [gaz](#gas) qu'un utilisateur doit payer pour inclure une transaction dans le bloc suivant. - - - Gaz et frais - - -### Chaîne phare {#beacon-chain} - -La chaîne phare a été la blockchain qui a introduit la [preuve d'enjeu](#pos) et [les validateurs](#validator) sur Ethereum. Elle a fonctionné parallèlement au réseau principal par preuve de travail Ethereum depuis décembre 2020 jusqu'à ce que les deux chaînes soient fusionnées en septembre 2022 pour former l'Ethereum d'aujourd'hui. - - - Chaîne phare - - -### Gros-boutiste {#big-endian} - -Représentation de nombre positionnel où le chiffre le plus important est le premier en mémoire. Contraire du petit-boutisme (little-endian), où le chiffre le moins significatif arrive en premier. - -### Bloc {#block} - -Un bloc est une unité d'information groupée qui comprend une liste ordonnée de transactions et des informations liées au consensus. Les blocs sont proposés par les validateurs de preuves d'enjeu, après quoi ils sont partagés sur l'ensemble du réseau pair-à-pair, où ils peuvent facilement être vérifiés indépendamment par tous les autres nœuds. Les règles de consensus régissent le contenu d'un bloc considéré comme valide, et tout bloc invalide est ignoré par le réseau. L'ordre de ces blocs et les transactions qui s'y trouvent créent une chaîne d'événements déterministe dont la fin représente l'état actuel du réseau. - - - Les blocs - - -### Explorateur de bloc {#block-explorer} - -Une interface qui permet à un utilisateur de rechercher des informations depuis et à propos d'une blockchain. Cela inclut la récupération des transactions individuelles, l'activité associée à des adresses spécifiques et des informations sur le réseau. - -### En-têtes de bloc {#block-header} - -L'en-tête de bloc est une collection de métadonnées à propos d'un bloc et un résumé des transactions incluses dans le bloc d'exécution. - -### Propagation de bloc {#block-propagation} - -Le procédé de transmission de la confirmation d'un bloc à tous les autres nœuds au sein du réseau. - -### Proposant de bloc {#block-proposer} - -Validateur spécifique choisi pour créer un bloc dans un [créneau](#slot) particulier. - -### Récompense du bloc {#block-reward} - -C'est le total d'ether reversé au proposant ayant validé le bloc. - -### Statut du bloc {#block-status} + -Les états dans lesquels un bloc peut exister. Quelques états possibles sont : + -- proposé : le bloc a été proposé par un validateur -- programmé : les validateurs soumettent actuellement des données -- manqué/ignoré : le proposant n'a pas proposé de bloc dans le laps de temps éligible. -- orphelin : le bloc a été réorganisé par l'[algorithme de choix de fourche](#fork-choice-algorithm) + -### Durée de bloc {#block-time} + -L'intervalle de temps entre les blocs ajoutés à la blockchain. + -### Validation de bloc {#block-validation} + -Processus consistant à vérifier qu'un nouveau bloc contient des transactions et signatures valides. Il s'appuie sur la chaîne historique la plus lourde et suit toutes les autres règles de consensus. Les blocs valides sont ajoutés à la fin de la chaîne et se propagent aux autres sur le réseau. Les blocs invalides sont ignorés. + -### Blockchain {#blockchain} + -Séquence de [blocs](#block), où chacun est relié à son prédécesseur jusqu'au [bloc d'origine](#genesis-block) en référençant le hachage du bloc précédent. L'intégrité de la blockchain est crypto-économiquement sécurisée à l'aide d'un mécanisme de consensus basé sur la preuve d'enjeu. + - - Qu'est-ce qu'une blockchain ? - + -### Nœud d'amorçage {#bootnode} + -Nœuds qui peuvent être utilisés pour initier le processus Discovery lors de l'exécution d'un nœud. Les adresses de ces nœuds sont enregistrés dans le code source d'Ethereum. + -### Bytecode {#bytecode} + -Ensemble d'instructions abstraites conçues pour être exécutées efficacement par un interpréteur logiciel ou une machine virtuelle. Contrairement au code source lisible par l'homme, le bytecode est exprimé sous forme numérique. + -### Fourche Byzantium {#byzantium-fork} + -La première des deux [fourches majeures](#hard-fork) de la phase de développement [Metropolis](#metropolis). Elle comprend le report de la [bombe de difficulté](#difficulty-bomb) de Metropolis et la réduction des récompenses de bloc de l'EIP 649, l'[Ice Age](#ice-age) ayant été retardé de 1 an et la récompense de bloc réduite de 5 à 3 ethers. + ## C {#section-c} -### Casper-FFG {#casper-ffg} + -Casper-FFG est un protocole de consensus par preuve d'enjeu utilisé avec l'algorithme de choix de fourche [LMD-GHOST](#lmd-ghost) pour permettre à [des clients de consensus](#consensus-client) de s'entendre sur la tête de la chaîne phare. + -### Point de contrôle {#checkpoint} + -La [chaîne phare](#beacon-chain) est cadencée en créneaux (12 secondes) et en périodes (32 créneaux). Le premier créneau d'une période est un point de contrôle. Quand une [supermajorité](#supermajority) de validateurs atteste du lien entre deux points de contrôle, ils peuvent être [justifiés](#justification), puis, quand un autre point de contrôle est justifié en sus, ils peuvent être [finalisés](#finality). + -### Compiler {#compiling} + -Traduire du code écrit dans un langage de programmation de haut niveau (par exemple, [Solidity](#solidity)) en un langage de plus bas niveau (par exemple, le [bytecode](#bytecode) de l'EVM). + - - Compiler des contrats intelligents - + -### Comité {#committee} + -Groupe d’au moins 128 [validateurs](#validator) ayant la charge de valider des blocs dans chaque créneau. L'un des validateurs au sein du comité est l'agrégateur, responsable de l'agrégation des signatures de tous les autres validateurs au sein du comité qui s'accordent sur une attestation. A ne pas confondre avec le [comité de synchronisation](#sync-committee). + -### Infaisabilité informatique {#computational-infeasibility} + -Un processus est infaisable du point de vue informatique s'il exige de quiconque pourrait avoir un intérêt à le réaliser un temps trop long en pratique (par ex. des milliards d'années). + -### Consensus {#consensus} + -Lorsqu'une supermajorité de nœuds du réseau ont tous les mêmes blocs dans leur meilleure blockchain validée localement. À ne pas confondre avec les [règles de consensus](#consensus-rules). + -### Client de consensus {#consensus-client} - -Les clients de consensus (tels que Prysm, Teku, Nimbus, Lighthouse et Lodestar) exécutent l'algorithme de consensus de [preuve d'enjeu](#pos) d'Ethereum permettant au réseau de parvenir à un accord sur la tête de la chaîne phare. Les clients de consensus ne participent pas à la validation/diffusion des transactions ou à l'exécution des transitions d'état. Ce sont les [clients d'exécution](#execution-client) qui s'en chargent. - -### Couche de consensus {#consensus-layer} - -La couche de consensus d'Ethereum est le réseau des [clients de consensus](#consensus-client). - -### Règles de consensus {#consensus-rules} - -Règles de validation de bloc que les nœuds complets appliquent pour maintenir un consensus avec les autres nœuds. À ne pas confondre avec le [consensus](#consensus). - -### Envisagé pour inclusion (CFI) {#cfi} - -[EIP](#eip) de base qui n'est pas encore actif sur le réseau principal, les développeurs de clients étant généralement favorables à l'idée. En supposant qu'il réponde à toutes les exigences pour inclusion dans le réseau principal, il pourrait potentiellement être inclus dans une mise à jour du réseau (pas nécessairement la prochaine). - -### Fourche Constantinople {#constantinople-fork} - -Seconde partie de la phase [Metropolis](#metropolis), initialement prévue pour la mi-2018. Devait notamment inclure le passage à un algorithme de consensus hybride [preuve de travail](#pow)/[preuve d'enjeu](#pos). - -### Compte de contrat {#contract-account} - -Compte contenant du code qui s'exécute chaque fois qu'il reçoit une [transaction](#transaction) d'un autre [compte](#account) (qu'il s'agisse d'un [compte externe](#eoa) ou d'un [contrat](#contract-account)). - -### Transaction de création de contrat {#contract-creation-transaction} - -Une [transaction spéciale](#transaction) qui inclut le code d'initiation d'un contrat. Le destinataire est défini comme `null` et le contrat est déployé sur une adresse générée à partir de l'adresse de l'utilisateur et du `nonce`. qui est utilisé pour enregistrer un [contrat](#contract-account) et l'intégrer à la blockchain Ethereum. - -### cryptoéconomies {#cryptoeconomics} - -L'économie des cryptomonnaies. + ## D {#section-d} -### Đ {#d-with-stroke} - -Đ (D barré) est utilisé en ancien anglais, moyen anglais, en islandais et féroïen pour représenter la lettre majuscule « Eth ». On l'utilise dans des mots comme ĐEV ou Đapp (application décentralisée), où le Đ désigne la lettre nordique « eth ». L'eth majuscule (Ð) est aussi utilisé pour symboliser la cryptomonnaie Dogecoin. On la trouve souvent dans la littérature plus ancienne sur Ethereum mais elle est moins utilisée aujourd'hui. + -### DAG {#dag} + -DAG signifie Graphe Acyclique Orienté (Directed Acyclic Graph). Il s'agit d'une structure de données composées de nœuds et de liens entre eux. Avant la fusion, Ethereum utilisait un DAG dans son algorithme [de preuve de travail](#pow) , [Ethash](#ethash), mais celui-ci n'est plus utilisé avec la [preuve d'enjeu](#pos). + -### DApp {#dapp} + -Application décentralisée. Au minimum, il s'agit d'un [contrat intelligent](#smart-contract) et d'une interface utilisateur web. Plus généralement, une dApp est une application web qui est construite sur des services d'infrastructure de pair à pair, décentralisés et ouverts. Par ailleurs, de nombreuses applications décentralisées incluent un stockage décentralisé et/ou un protocole et une plateforme de messages. + - - Introduction aux dApps - + -### Disponibilité des données {#data-availability} + -Propriété permettant à tout noeud connecté au réseau de télécharger n'importe quelle portion de l'état qu'il souhaite. + -### Décentralisation {#decentralization} + -Action de transférer le contrôle et l'exécution des processus en dehors d'une entité centrale. + -### Organisation autonome décentralisée (DAO) {#dao} + -Entreprise ou autre organisation fonctionnant sans gestion hiérarchique. DAO peut également faire référence à un contrat intitulé « The DAO » lancé le 30 avril 2016, qui a ensuite été piraté en juin 2016. Ceci a finalement motivé une [fourche majeure](#hard-fork) (nom de code DAO) au bloc 1 192 000, qui a inversé le contrat DAO piraté et a causé la division d'Ethereum et d'Ethereum Classic en deux systèmes concurrents. + - - Organisations autonomes décentralisées (DAO) - + -### Plateforme d'échanges décentralisés (DEX) {#dex} + -Type de [DApp](#dapp) qui vous permet d'échanger des jetons avec des pairs sur le réseau. Vous avez besoin d'[ethers](#ether) pour les utiliser (pour payer les [frais de transaction](#transaction-fee)). Elles ne sont soumises à aucune restriction géographique contrairement aux plateformes d'échanges centralisés et n'importe qui peut participer. - - - Échanges décentralisés - - -### Deed {#deed} - -Voir [jeton non fongible (NFT)](#nft). - -### Contrat de dépôt {#deposit-contract} - -Passerelle de mise en jeu sur Ethereum. Le contrat de dépôt est un contrat intelligent sur Ethereum qui accepte les dépôts d'ETH et gère les soldes de validateur. Un validateur ne peut pas être activé sans le dépôt d'ETH dans ce contrat. Le contrat requiert des ETH et des données requises. Au nombre des données requises figurent la clé publique du validateur et la clé publique de retrait, signée par la clé privée du validateur. Ces données sont nécessaires pour qu'un validateur soit identifié et approuvé par le réseau de [preuve d'enjeu](#pos). - -### DeFi {#defi} - -Abréviation de « Decentralized Finance » (finance décentralisée), vaste catégorie d'[dApps](#dapp) visant à fournir des services financiers sur toute la blockchain, sans aucun intermédiaire et de sorte que toute personne ayant une connexion Internet puisse participer. - - - Finance décentralisée (DeFi) - - -### Difficulté {#difficulty} - -Paramétrage qui, dans les réseaux de [preuve de travail](#pow), contrôle, à l'échelle du réseau, le nombre de calculs moyens nécessaire pour trouver un nonce valide. La difficulté est représentée par le nombre de zéros de tête requis dans le hachage du bloc qui en résultat pour qu'il soit considéré comme valide. Ce concept est obsolète dans Ethereum depuis la transition vers la preuve d'enjeu. - -### Bombe de difficulté {#difficulty-bomb} - -Augmentation exponentielle planifiée du paramètre de [difficulté](#difficulty) de la [preuve de travail](#pow) qui a été conçue pour inciter à la transition vers la [preuve d'enjeu](#pos), réduisant les possibilités d'une [fourche](#hard-fork). La bombe de difficulté est devenue obsolète avec la [transition vers la preuve d'enjeu](/roadmap/merge). - -### Signature numérique {#digital-signatures} - -Courte chaîne de données qu'un utilisateur produit pour un document en utilisant une [clé privée](#private-key) afin que quiconque ayant la [clé publique](#public-key) correspondante, la signature et le document puisse vérifier (1) que le document a bien été « signé » par le propriétaire de cette clé privée particulière et (2) que le document n'a pas été modifié après sa signature. + -### Découverte {#discovery} - -Procédé au cours duquel un noeud du réseau Ethereum trouve d'autres nœuds auxquels se connecter. - -### Table d'empreintes numériques distribuée (DHT) {#distributed-hash-table} - -Structure de données contenant des pairs `(key, value)`, utilisée par les nœuds du réseau Ethereum afin d'identifier les pairs auxquels se connecter et déterminer les protocoles qui seront utilisés sur cette communication. - -### Double dépense {#double-spend} - -Fourche délibérée de la blockchain, où un utilisateur doté d'une quantité suffisamment importante de puissance de minage/mise envoie une transaction entraînant le déplacement d'une monnaie hors chaîne (par exemple, une sortie en monnaie fiduciaire ou un achat hors chaîne) puis réorganise la blockchain pour supprimer cette transaction. Une double dépense réussie laisse à l'attaquant ses actifs sur et hors chaîne. - ## E {#section-e} -### Algorithme de signature numérique à courbe elliptique (ECDSA) {#ecdsa} - -Algorithme cryptographique utilisé par Ethereum pour garantir que les fonds ne peuvent être dépensés que par leurs propriétaires. C'est la méthode privilégiée pour créer des clés publiques et privées. Pertinent pour la génération [d'adresse](#address) de compte et la vérification de la [transaction](#transaction). - -### Cryptage {#encryption} - -Le cryptage de données est la conversion électronique en une forme illisible exceptée par le détenteur de la clé correspondante de décryptage. - -### Entropie {#entropy} - -En cryptographie, l'entropie désigne le manque de prévisibilité ou le niveau d'aléa. Lorsqu'ils génèrent des informations secrètes, comme les [clés privées](#private-key), les algorithmes s'appuient généralement sur une source d'entropie élevée pour garantir un résultat imprévisible. - -### Période {#epoch} - -Période de 32 [créneaux](#slot), chaque créneau étant de 12 secondes, totalisant 6,4 minutes. Les [comités](#committee) de validateurs sont remaniés lors de chaque période pour des raisons de sécurité. Chaque période représente une opportunité de [finaliser](#finality) la chaîne. Chaque validateur se voit attribuer de nouvelles responsabilités au début de chaque période. - - - Preuve d'enjeu - - -### Equivocation (Ambiguïté) {#equivocation} - -Envoi par un validateur de deux messages contradictoires. Un exemple simple pourrait résider dans l'envoi de deux transactions différentes avec les mêmes références. Un autre exemple pourrait consister en la proposition de deux blocs pour le même emplacement (ou pour le même créneau). - -### Eth1 {#eth1} - -« Eth1 » est un terme qui faisait référence au réseau principal Ethereum, c'est-à-dire la blockchain actuelle basée sur la preuve de travail. Ce terme a depuis été abandonné au profit de « couche d'exécution ». [En savoir plus sur ce changement de nom](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/). - - - En savoir plus sur les mises à niveau d'Ethereum - - -### Eth2 {#eth2} + -« Eth2 » est un terme qui faisait référence à un ensemble de mises à niveau du protocole Ethereum, notamment la transition d'Ethereum vers la preuve d'enjeu. Ce terme a depuis été abandonné au profit de « couche de consensus ». [En savoir plus sur ce changement de nom](https://blog.ethereum.org/2022/01/24/the-great-eth2-renaming/). + - - En savoir plus sur les mises à niveau d'Ethereum - + -### Proposition d'amélioration d'Ethereum (EIP) {#eip} + -Document de conception visant à informer la communauté Ethereum qui décrit une nouvelle fonctionnalité proposée, ses processus ou son environnement (voir [ERC](#erc)). + - - Introduction aux EIP - + -### Service de Nom d'Ethereum (ENS) {#ens} + -Le registre ENS est un [contrat](#smart-contract) central unique qui fournit une correspondance entre des noms de domaine et des propriétaires et des résolveurs, comme décrit dans l'[EIP](#eip) 137. + -[Plus d'infos sur ens.domains](https://ens.domains) + -### Client d'exécution {#execution-client} + -Les clients d'exécution (auparavant appelés « clients Eth1 »), tels que Besu, Erigon, Go-Ethereum (Geth) ou Nethermind, sont chargés du traitement et de la diffusion des transactions, ainsi que de la gestion de l'état d'Ethereum. Ils exécutent les calculs pour chaque transaction en utilisant la [machine virtuelle Ethereum](#evm) pour s'assurer que les règles du protocole sont respectées. + -### Couche d'exécution {#execution-layer} + -La couche d'exécution d'Ethereum est le réseau des [clients d'exécution](#execution-client). + -### Compte externe (EOA) {#eoa} + -Les comptes externes (EOA) sont des [comptes](#account) contrôlés par les [clés privées](#private-key), généralement générées en utilisant une [phrase de récupération](#hd-wallet-seed). Contrairement aux contrats intelligents, les comptes externes sont des comptes ne disposant d'aucun code associé. Généralement, ces comptes sont gérés avec un [portefeuille](#wallet). + -### Demande de commentaires Ethereum (ERC) {#erc} + -Libellé donné à certaines [EIP](#eip) qui visent à définir une norme spécifique d'utilisation d'Ethereum. + - - Introduction aux EIP - - -### Ethash {#ethash} - -Algorithme de [preuve de travail](#pow) qui a été utilisé sur Ethereum avant de passer à [preuve d'enjeu](#pos). - -[En savoir plus](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash) - -### Ether {#ether} - -Cryptomonnaie native utilisée par l'écosystème Ethereum, qui couvre les coûts de [gaz](#gas) lors de l'exécution des transactions. S'écrit également sous la forme ETH ou avec son symbole Ξ qui est le caractère grec Xi en majuscule. - - - La monnaie de notre avenir numérique - - -### Événements {#events} - -Permet d'utiliser les dispositifs de journalisation de l'[EVM](#evm). Les [DApp](#dapp) peuvent repérer les événements et les utiliser pour déclencher des rappels JavaScript dans l'interface utilisateur. - - - Événements et journaux - - -### Machine Virtuelle Ethereum (EVM) {#evm} - -Machine virtuelle basée sur une pile, qui exécute du [bytecode](#bytecode). Dans Ethereum, le modèle d'exécution spécifie comment l'état du système est modifié, en fonction d'une série d'instructions en bytecode et d'un petit tuple de données environnementales. Ceci est spécifié via un modèle formel de machine d'état virtuelle. - - - Machine virtuelle Ethereum (EVM) - - -### Langage d'assemblage de l'EVM {#evm-assembly-language} - -Forme lisible par l'homme du [bytecode de l'EVM](#bytecode). + ## F {#section-f} -### Fonction de secours {#fallback-function} - -Fonction par défaut appelée en l'absence de données ou d'un nom de fonction déclaré. - -### Robinet {#faucet} - -Service exécuté via un [contrat intelligent](#smart-contract), qui distribue des fonds sous la forme d'ethers de test gratuits pouvant être utilisés sur un réseau de test. + - - Robinets de réseau de test - + -### Finalité {#finality} + -La finalité est la garantie qu'avant une heure donnée, un ensemble de transactions ne changera pas et ne pourra pas être annulé. + - - Finalité de la preuve d'enjeu - + -### Finney {#finney} + -Unité de l'[ether](#ether). 1 finney = 1015 [wei](#wei). 103 finney = 1 ether. + -### Fourche {#fork} - -Changement de protocole causant la création d'une chaîne alternative ou divergence temporelle en deux chemins de blocs potentiels. - -### Algorithme de sélection de fourche {#fork-choice-algorithm} - -Algorithme utilisé pour identifier la tête de la blockchain. Sur la couche d'exécution, la tête de la chaîne est identifiée comme celle qui présente la plus grande difficulté totale. Cela signifie que la véritable tête de la chaîne est celle qui a nécessité le plus de travail pour être minée. Sur la couche de consensus, l'algorithme observe l'accumulation des attestations en provenance des validateurs ([LMD_GHOST](#lmd-ghost)). - -### Preuve de fraude {#fraud-proof} - -Modèle de sécurité pour certaines solutions de [couche 2](#layer-2) où, pour gagner en rapidité, les transactions sont regroupées en lots ([rollups](#rollups)) et soumises sur Ethereum en une seule transaction. Les transactions sont supposées être valides, mais peuvent être contestées si une fraude est suspectée. Une preuve de fraude exécutera alors la transaction pour vérifier l'existence d'une fraude. Cette méthode augmente le nombre de transactions possibles tout en maintenant le niveau de sécurité. Certains [rollups](#rollups) utilisent des [preuves de validité](#validity-proof). - - - Rollups optimistes - - -### Frontier {#frontier} - -Phase initiale de développement à des fins de test d'Ethereum, qui a duré de juillet 2015 à mars 2016. + ## G {#section-g} -### Gaz {#gas} - -Carburant virtuel utilisé dans Ethereum pour exécuter les contrats intelligents. L'[EVM](#evm) utilise un mécanisme de comptabilité pour mesurer la consommation de gaz et limiter la consommation de ressources informatiques (voir [Turing complet](#turing-complete)). + - - Gaz et frais - + -### Limite de gaz {#gas-limit} + -Montant maximum de [gaz](#gas) qu'une [transaction](#transaction) ou qu'un [bloc](#block) peut consommer. + -### Prix du gaz {#gas-price} + -Prix en éther d'une unité de gaz spécifiée dans une transaction. - -### Bloc d'origine {#genesis-block} - -Premier bloc d'une [blockchain](#blockchain), utilisé pour initialiser un certain réseau et sa cryptomonnaie. - -### Geth {#geth} - -Version abrégée de « Go Ethereum ». L'une des implémentations les plus importantes du protocole Ethereum, programmée en Go. - -[Plus d'infos sur geth.ethereum.org](https://geth.ethereum.org/) - -### Gwei {#gwei} - -Abréviation de Gigawei, unité de l'[ether](#ether) couramment utilisée pour attribuer un prix au [gaz](#gas). 1 Gwei = 109 [wei](#wei). 109 Gwei = 1 ether. + ## H {#section-h} -### Fourche majeure {#hard-fork} - -Divergence permanente dans la [blockchain](#blockchain), aussi appelée modification de fourche majeure. Elle se produit habituellement lorsque les nœuds non mis à niveau ne peuvent pas valider les blocs créés par les nœuds mis à niveau qui appliquent des [règles de consensus](#consensus-rules) plus récentes. À ne pas confondre avec une fourche, une fourche mineure, une fourche logicielle ou une fourche Git. + -### Empreinte numérique {#hash} + -Empreinte de longueur fixe d'intrants de taille variable, produite par une fonction de hachage. (Voir [Keccak-256](#keccak-256)). + -### Puissance de hachage {#hash-rate} - -Nombre de calculs par seconde réalisé par les ordinateurs minant sur le réseau. - -### Portefeuille HD {#hd-wallet} - -[Portefeuille](#wallet) utilisant le protocole de création et de transfert de clés déterministe hiérarchique (HD). - -[Plus d'infos sur github.com](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) - -### Graine de portefeuille HD {#hd-wallet-seed} - -Valeur utilisée pour générer la [clé privée](#private-key) maîtresse et le code de chaîne maître pour un [portefeuille](#wallet) HD. Il est possible de représenter la graine de portefeuille par des mots mnémoniques, ce qui facilite la copie, la sauvegarde et la restauration des clés privées pour les utilisateurs. - -### Homestead {#homestead} - -Deuxième phase de développement d'Ethereum, lancée en mars 2016 au bloc 1 150 000. + ## I {#section-i} -### Index {#index} - -Structure réseau destinée à optimiser la sollicitation d'informations à travers la [blockchain](#blockchain) en fournissant un chemin efficace vers sa source de stockage. - -### Protocole d'échange d'adresses de clients (ICAP) {#icap} - -Encodage d'adresse Ethereum partiellement compatible avec l'encodage du numéro de compte bancaire international (IBAN), offrant un encodage polyvalent, contrôlé et interopérable pour les adresses Ethereum. Les adresses ICAP utilisent un nouveau code de pseudo-pays IBAN - XE signifiant « eXtended Ethereum », comme utilisé dans les monnaies non juridictionnelles (par exemple, XBT, XRP, XCP). - -### Ice Age {#ice-age} - -[Fourche majeure](#hard-fork) d'Ethereum au bloc 200 000 visant à introduire une augmentation exponentielle de la [difficulté](#difficulty) (aussi appelée [bombe de difficulté](#difficulty-bomb)), motivant une transition vers la [preuve d'enjeu](#pos). - -### Environnement de développement intégré (IDE) {#ide} - -Interface utilisateur qui combine généralement un éditeur de code, un compilateur, un environnement d'exécution et un débogueur. - - - Environnement de développement intégré (IDE) - - -### Problème de code déployé immuable {#immutable-deployed-code-problem} + -Une fois que le code d'un [contrat](#smart-contract) (ou celui d'une [bibliothèque](#library)) est déployé, il devient immuable. Les pratiques de développement de logiciels standard reposent sur la possibilité de corriger d'éventuels bogues et d'ajouter de nouvelles fonctionnalités. Cela représente donc un problème pour le développement de contrats intelligents. + - - Déployer des contrats intelligents - + -### Transaction interne {#internal-transaction} + -[Transaction](#transaction) envoyée depuis un [compte de contrat](#contract-account) vers un autre compte de contrat ou vers un [compte externe (EOA)](#eoa) (voir [message](#message)). + -### Émission - -Frappe de nouveaux ethers pour récompenser la proposition de bloc, l'attestation et la dénonciation. - ## K {#section-k} -### Fonction de dérivation de clé (KDF) {#kdf} - -Aussi appelée « algorithme d'étirement de mot de passe », elle est utilisée par les formats [keystore](#keystore-file) pour protéger des attaques par force brute, par dictionnaire et de table arc-en-ciel sur le chiffrement des phrases de sécurité, en hachant celles-ci de façon répétée. - - - Sécurité de contrat intelligent - - -### Keystore {#keyfile} + -La paire clé/adresse privée de chaque compte existe en tant que fichier clé unique dans un client Ethereum. Ce sont des fichiers texte JSON qui contiennent la clé privée chiffrée du compte, qui ne peut être déchiffrée qu'avec le mot de passe entré lors de la création du compte. + -### Keccak-256 {#keccak-256} - -Fonction de hachage cryptographique ([empreinte numérique](#hash)) utilisée dans Ethereum. Keccak-256 a été standardisée comme [SHA](#sha)-3. + ## L {#section-l} -### Couche 2 {#layer-2} - -Domaine de développement axé sur des améliorations de couches se situant au-dessus du protocole Ethereum. Ces améliorations sont liées aux vitesses de [transaction](#transaction), à la réduction des [frais de transaction](#transaction-fee) et à la confidentialité des transactions. - - - Couche 2 - - -### LevelDB {#level-db} + -Système open source de stockage de clé-valeur sur disque, implémenté en tant que [bibliothèque](#library) légère dédiée, disponible sur de nombreuses plateformes. + -### Bibliothèque {#library} + -Type spécial de [contrat](#smart-contract) qui n'a ni fonction de paiement, ni fonction de secours, ni stockage de données. Une bibliothèque ne peut donc ni recevoir ni détenir d'ethers, ni stocker des données. Elle sert de code déployé au préalable que d'autres contrats peuvent appeler pour obtenir un calcul en lecture seule. - - - Bibliothèques de contrats intelligents - - -### Client léger {#light-client} - -Client Ethereum qui ne stocke aucune copie locale de la [blockchain](#blockchain) ou qui ne valide aucun bloc ni aucune [transaction](#transaction). Il offre les fonctions d'un [portefeuille](#wallet), et peut créer et diffuser des transactions. + -### LMD_GHOST {#lmd-ghost} - -[L'algorithme de sélection de fourche](#fork-choice-algorithm) utilisé par les clients de consensus Ethereum pour identifier la tête de la chaîne. LMD-GHOST est l'acronyme de « dernier message produit - sous-arbre le plus lourd et gourmand observé » (Latest Message Driven Greediest Heaviest Observed SubTree), ce qui signifie que la tête de la chaîne est le bloc avec la plus grande accumulation d'[attestations](#attestation) de son histoire. - ## M {#section-m} -### Réseau principal {#mainnet} - -Appelé « mainnet » en anglais (pour « main network »), il s'agit de la [blockchain](#blockchain) principale du réseau public Ethereum. De vrais ETH, une véritable valeur et des conséquences réelles. Aussi connu sous le nom de « couche 1 » lors des discussions sur les solutions d'évolutivité de la [couche 2](#layer-2). (Voir aussi [réseau de test](#testnet)). - - - Réseaux Ethereum - - -### Mémorivore {#memory-hard} + -Les fonctions mémorivores sont des processus qui connaissent une diminution drastique de la vitesse ou de la faisabilité lorsque la quantité de mémoire disponible diminue même légèrement. L'algorithme de minage Ethereum [Ethash](#ethash) en est un exemple. + -### Arbre de Merkle Patricia {#merkle-patricia-tree} + -Structure des données utilisée dans Ethereum pour stocker efficacement les paires clés-valeurs. + -### Message {#message} + -[Transaction interne](#internal-transaction) qui n'est jamais sérialisée et qui est uniquement envoyée dans l'[EVM](#evm). + -### Appel de message {#message-call} - -Acte de transférer un [message](#message) d'un compte à un autre. Si le compte de destination est associé au code de l'[EVM](#evm), alors celle-ci sera démarrée avec l'état de cet objet et le message sera traité. - -### Metropolis {#metropolis} - -Troisième phase de développement d'Ethereum, lancée en octobre 2017. - -### Minage {#mining} - -Processus de hachage répétitif d'un en-tête de bloc lors de l'incrémentation d'un [nonce](#nonce) jusqu'à ce que le résultat contienne un nombre arbitraire de zéros binaires de tête. C'est le processus par lequel de nouveaux [blocs](#block) sont ajoutés à une [blockchain](#blockchain) de preuve de travail. Voilà comment Ethereum était sécurisé avant de passer à [la preuve d'enjeu](#pos). - -### Mineur {#miner} - -[Nœud](#node) du réseau qui trouve une [preuve de travail](#pow) valide pour de nouveaux blocs, par passes de hachage successives (voir [Ethash](#ethash)). Les mineurs ne font plus partie d'Ethereum - ils ont été remplacés par des validateurs lorsque Ethereum est passé à la [la preuve d'enjeu](#pos). - - - Minage - - -### Frapper {#mint} - -Le frappage est le processus de création de nouveaux jetons et de leur mise en circulation afin qu'ils puissent être utilisés. C'est un mécanisme décentralisé pour créer un nouveau jeton sans participation de l'autorité centrale. + ## N {#section-n} -### Réseau {#network} - -Lorsque le terme fait référence au réseau Ethereum, réseau P2P qui propage les transactions et les blocs à chaque nœud Ethereum (participant au réseau). - - - Réseaux - - -### Puissance de hachage du réseau {#network-hashrate} - -[Puissance de hachage](#hashrate) collective produite par un réseau entier de minage. Le minage sur Ethereum s'est terminé lorsque Ethereum est passé à la [preuve d'enjeu](#pos). - -### Jeton non fongible (NFT) {#nft} - -Également Norme de jetonconnu sous le nom d'« acte de propriété » ou « deed » , il s'agit d'une norme de jeton introduite par la proposition ERC-721. Les NFT peuvent être suivis et échangés, mais chaque jeton est unique et distinct. Ils ne sont pas interchangeables comme les [jetons ERC-20](#token-standard). Les NFT peuvent être des preuves de propriété d'actifs numériques ou physiques. - - - Jetons non fongibles (NFT) - - - Norme de jeton non fongible ERC-721 - + -### Nœud {#node} + -Client logiciel qui participe au réseau. + - - Nœuds et clients - + -### Nonce {#nonce} - -En cryptographie, valeur qui ne peut être utilisée qu'une seule fois. Le nonce d'un compte est un compteur de transactions propre à chaque compte, qui est utilisé pour prévenir les attaques par répétition. + ## O {#section-o} -### bloc ommer (oncle) {#ommer} - -Quand un [mineur](#miner) de preuve de travail trouve un [bloc](#block) valide, un autre mineur peut avoir publié un bloc concurrent, qui est ajouté en premier au sommet de la blockchain. Ce bloc valide, mais obsolète, peut être inclus par des blocs plus récents en tant que _bloc oncle_ et faire l'objet d'une récompense partielle. On utilise de préférence le terme « ommer », plus neutre, pour désigner le frère ou la sœur d'un bloc parent, mais on parle aussi parfois d'« oncle ». Ceci était pertinent pour Ethereum lorsqu'il était un réseau à [preuve de travail](#pow), mais les blocs oncle ne sont pas une fonctionnalité de la [preuve d'enjeu](#pos) sur Ethereum, car un seul proposant de bloc est sélectionné à chaque créneau. - -### Rollup optimiste {#optimistic-rollup} - -[Rollup](#rollups) (ou regroupement) de transactions qui utilise les [preuves de fraude](#fraud-proof) pour permettre un débit de transactions plus élevé sur la [couche 2](#layer-2) tout en bénéficiant de la sécurité apportée par le [réseau principal](#mainnet) (couche 1). Contrairement à [Plasma](#plasma), solution similaire sur la couche 2, les rollups optimistes peuvent gérer des transactions plus complexes, à savoir tout ce qui est possible au sein de l'[EVM](#evm). Ils rencontrent des problèmes de latence par rapport aux [rollups ZK](#zk-rollups), car une transaction peut être contestée par l'intermédiaire de la preuve de fraude. - - - Rollups optimistes - + -### Oracle {#oracle} + -Les oracles sont des ponts entre la [blockchain](#blockchain) et le monde réel. Ils agissent comme des [API](#api) sur la blockchain qui peuvent être interrogés pour obtenir des informations et utilisés dans des [contrats intelligents](#smart-contract). - - - Oracle - + ## P {#section-p} -### parity {#parity} - -Une des implémentations interopérables les plus importantes du logiciel client Ethereum. - -### pair {#peer} - -Ordinateurs connectés exécutant le logiciel client Ethereum qui ont des copies identiques de la [blockchain](#blockchain). - -### Réseau de pair-à-pair {#peer-to-peer-network} - -Réseau d'ordinateurs ([pairs](#peer)) collectivement capables d'exécuter des fonctionnalités sans avoir besoin de services centralisés, basés sur un serveur. - -### Plasma {#plasma} - -Solution de mise à l'échelle hors chaîne qui utilise des [preuves de fraude](#fraud-proof), comme les [rollups optimistes](#optimistic-rollups). Plasma se limite aux transactions simples comme les échanges et transferts de jetons simples. - - - Plasma - - -### Clé privée (clé secrète) {#private-key} - -Nombre secret qui permet aux utilisateurs Ethereum de prouver la propriété d'un compte ou de contrats en produisant une signature numérique (voir [clé publique](#public-key), [adresse](#address), [ECDSA](#ecdsa)). - -### Chaîne privée {#private-chain} + -Une blockchain est dite privée si on y accède en y étant autorisé, par opposition à une blockchain publique. + -### Preuve d'enjeu (PoS) {#pos} + -Méthode par laquelle un protocole de blockchain de cryptomonnaie vise à atteindre un [consensus](#consensus) distribué. La PoS demande aux utilisateurs de prouver qu'ils sont propriétaires d'une certaine quantité de cryptomonnaie (leur « mise » sur le réseau) afin de pouvoir participer à la validation des transactions. + - - Preuve d'enjeu - + -### Preuve de travail (PoW) {#pow} + -Donnée (la preuve) qui nécessite des calculs significatifs pour être trouvée. + - - Preuve de travail - - -### clé publique {#public-key} - -Nombre dérivé d'une [clé privée](#private-key) via une fonction à sens unique, qui peut être partagé publiquement et utilisé par n'importe qui pour vérifier une signature numérique créée avec la clé privée correspondante. + ## R {#section-r} -### Reçu {#receipt} - -Données renvoyées par un client Ethereum pour représenter le résultat d'une [transaction](#transaction) particulière, y compris une [empreinte numérique](#hash) de la transaction, son numéro de [bloc](#block), la quantité de [gaz](#gas) utilisée et, en cas de déploiement d'un [contrat intelligent](#smart-contract), l'[adresse](#address) du contrat. - -### Attaque par réentrance {#re-entrancy-attack} - -Attaque qui consiste en un contrat d'attaquant qui appelle une fonction du contrat de la victime de telle façon que, pendant l'exécution, la victime rappelle le contrat de l'attaquant de façon récursive. Ce type d'attaque peut se traduire par un vol de fonds, en faisant par exemple en sorte de contourner des parties du contrat de la victime qui mettent à jour les soldes ou qui comptabilisent les montants retirés. + - - Réentrance - + -### Récompense {#reward} + -Quantité d'ethers inclus dans chaque nouveau bloc en tant que récompense du réseau au [mineur](#miner) qui a trouvé la solution de la [preuve de travail](#pow). + -### Préfixe de longueur récursive (RLP) {#rlp} + -Norme d'encodage conçue par les développeurs Ethereum pour encoder et sérialiser des objets (structure de données) de complexité et de longueur arbitraires. - -### Rollups {#rollups} - -Type de solution de mise à l'échelle de [couche 2](#layer-2) qui regroupe plusieurs transactions et les soumet à la [chaîne principale Ethereum](#mainnet) en une seule transaction. Cela permet de réduire les frais de [gaz](#gas) et d'augmenter le débit des [transactions](#transaction). Il existe des rollups optimistes et des rollups ZK qui utilisent différentes méthodes de sécurité pour offrir ces avantages en termes d'évolutivité. - - - rollups - + -### RPC {#rpc} - -L'**appel de procédure à distance (RPC)** est un protocole qu'un programme peut utiliser pour solliciter un service auprès d'un programme situé sur un autre ordinateur d'un réseau dont il n'a pas besoin de connaître les détails - ## S {#section-s} -### Algorithme de hachage sécurisé (SHA) {#sha} - -Famille de fonctions de hachage cryptographique publiées par le National Institute of Standards and Technology (NIST) aux États-Unis. - -### Serenity {#serenity} - -Étape du développement d'Ethereum qui a initié un ensemble de mises à jour et de mises à l'échelle en termes de durabilité, précédemment appelées 'Ethereum 2.0', ou 'Eth2'. - - - Mises à niveau d'Ethereum - - -### Sérialisation {#serialization} - -Procédé de conversion d'une structure de données en une séquence d'octets. - -### Fragment / chaîne de fragments {#shard} + -Les chaînes de fragments sont des portions de la blockchain complète susceptibles de se trouver sous la responsabilité de sous-ensembles de validateurs. Les chaînes de fragments offriront un débit de transaction accru pour Ethereum et amélioreront la disponibilité des données pour les solutions de [couche 2](#layer-2) comme les [rollups optimistes](#optimistic-rollups) et les [rollups ZK](#zk-rollups). + - - Danksharding - + -### Chaînes latérales {#sidechain} + -Solution de mise à l'échelle qui utilise une chaîne séparée avec des [règles de consensus](#consensus-rules) différentes, souvent plus rapides. Un pont est nécessaire pour connecter ces chaînes latérales au [réseau principal](#mainnet). Les [rollups](#rollups) utilisent également les chaînes latérales, mais ils fonctionnent plutôt en collaboration avec le [réseau principal](#mainnet). + - - Chaines latérales - + -### Signature {#signing} + -Prouve cryptographiquement qu'une transaction a été approuvée par le détenteur d'une clé privée spécifique. + -### Singleton {#singleton} + -Terme de programmation informatique qui décrit un objet dont il ne peut exister qu'une seule instance. + -### Délesteur {#slasher} + -Un délesteur est une entité qui scanne les attestations à la recherche d'infractions passibles de sanctions. Les sanctions sont diffusées sur le réseau, et le proposant en consigne la preuve dans le prochain bloc. Le proposant reçoit alors une récompense pour avoir sanctionné le validateur malveillant. + -### Créneau {#slot} + -Une période de temps (12 secondes) durant laquelle de nouveaux blocs peuvent être proposés par un [validateur](#validator) dans le système de [preuve d'enjeu](#pos). Un créneau peut être vide. 32 créneaux forment une [période](#epoch). + - - Preuve d'enjeu - + -### Contrat intelligent {#smart-contract} + -Programme qui s'exécute sur l'infrastructure de calcul Ethereum. + - - Introduction aux contrats intelligents - + -### SNARK {#snark} + -Acronyme signifiant « argument de connaissance succinct et non interactif » (Succint Non-interactive Argument of Knowledge). Un SNARK est un type de [preuve de connaissance zéro](#zk-proof). + - - Rollups ZK - + -### Fourche mineure {#soft-fork} + -Divergence dans une [blockchain](#blockchain) qui se produit lorsque les [règles de consensus](#consensus-rules) changent. Contrairement à une [fourche majeure](#hard-fork), une fourche mineure est rétro-compatible ; les nœuds mis à jour peuvent valider les blocs créés par des nœuds non mis à jour tant qu'ils suivent les nouvelles règles de consensus. - -### Solidity {#solidity} - -Langage de programmation procédural (impératif) dont la syntaxe est similaire à JavaScript, C++ ou Java. Il s'agit du langage le plus populaire et le plus fréquemment utilisé pour les [contrats intelligents](#smart-contract) sur Ethereum. Il a été créé par Dr Gavin Wood. - - - Solidity - - -### Assemblage en ligne Solidity {#solidity-inline-assembly} - -Langage d'assemblage de l'[EVM](#evm) que l'on peut utiliser au sein d'un programme [Solidity](#solidity). Cette prise en charge par Solidity de l'assembleur facilite l'écriture de certaines opérations. - -### Spurious Dragon {#spurious-dragon} - -[Fourche majeure](#hard-fork) de la blockchain Ethereum, qui s'est produite au bloc 2 675 000 pour traiter plus de vecteurs d'attaque par déni de service et pour effacer l'état (voir [Tangerine Whistle](#tangerine-whistle)). C'est également un mécanisme de protection contre les attaques par rejeu (voir [nonce](#nonce)). - -### Stablecoin {#stablecoin} - -[Jeton ERC-20](#token-standard) dont la valeur est liée à celle d'un autre actif. Il existe des stablecoins liés à des monnaies fiduciaires comme le dollar, des métaux précieux comme l'or et d'autres cryptomonnaies comme le Bitcoin. - - - L'ETH n'est pas la seule crypto sur Ethereum - - -### Mettre en jeu {#staking} - -Déposer une quantité d'[ethers](#ether) (votre mise) pour devenir validateur et sécuriser le [réseau](#network). Un validateur vérifie les [transactions](#transaction) et propose des [blocs](#block) sous un modèle de consensus par [preuve d'enjeu](#pos). La mise en jeu vous incite économiquement à agir dans le meilleur intérêt du réseau. Vous obtiendrez des récompenses pour avoir mené à bien vos tâches de [validateur](#validator), mais perdrez diverses quantités d'ETH dans le cas contraire. - - - Misez votre ETH pour devenir un validateur Ethereum - - -### groupe d'enjeux {#staking-pool} - -Ensemble ETH de plus d'un validateur Ethereum utilisé pour atteindre les 32 ET nécessaires pour activer un ensemble de clés de validation. Un opérateur de nœud utilise ces clés pour participer au consensus et les [récompenses de bloc](#block-reward) sont réparties entre les validateurs participants. Les groupe d'enjeu ou la mise en jeu délégué ne sont pas natifs du protocole Ethereum, mais de nombreuses solutions ont été construites par la communauté. - - - Mise en jeu mutualisée - - -### STARK {#stark} - -Acronyme qui signifie « argument de connaissance transparent et évolutif » (Scalable Transparent Argument of Knowledge). Un STARK est un type de [preuve de connaissance zéro](#zk-proof). - - - Rollups ZK - - -### État {#state} - -Image instantanée de tous les soldes et métadonnées présents à un moment donné sur la blockchain, qui renvoie normalement à la condition d'un bloc particulier. - -### Canaux d'état {#state-channels} - -Solution de [couche 2](#layer-2) qui implique la mise en place d'un canal entre les participants pour qu'ils puissent effectuer des transactions librement et à moindre coût. Seule une [transaction](#transaction) est envoyée au [réseau principal](#mainnet) pour configurer et fermer le canal. Cela permet un débit de transactions très élevé, mais repose sur la connaissance du nombre de participants au départ et le blocage de fonds. - - - canaux d'état - - -### Supermajorité {#supermajority} - -La supermajorité est un terme qui désigne un nombre supérieur à 2/3 (66 %) de l'ether total mis en jeu pour sécuriser Ethereum. Un vote à la supermajorité est nécessaire pour que les blocs soient [finalisés](#finality) sur la chaîne phare. - -### synchronisation {#syncing} - -Processus de téléchargement de la dernière version complète d'une blockchain sur un nœud. - -### Comité de synchronisation {#sync-committee} - -Un comité de synchronisation est un groupe de [validateurs](#validator) sélectionnés aléatoirement qui est actualisé toutes les 27 heures environ. Son rôle est d'ajouter leurs signatures à des en-têtes de blocs valides. Les comités de synchronisation permettent aux [clients légers](#light-client) de garder une trace de la tête de la blockchain sans avoir besoin d'accéder à l'ensemble des validateurs. - -### Szabo {#szabo} - -Unité de l'[ether](#ether). 1 szabo = 1012 [wei](#wei), 106 szabo = 1 ether. + ## T {#section-t} -### Tangerine Whistle {#tangerine-whistle} - -[Fourche majeure](#hard-fork) de la blockchain Ethereum, qui s'est produite au bloc 2 463 000 pour modifier le calcul du [gaz](#gas) pour certaines opérations inécessitant beaucoup d'E/S et pour effacer l'état accumulé suite à une attaque par déni de service, qui exploitait le faible coût en gaz de ces opérations. - -### Difficulté Totale Terminale (TTD) {#terminal-total-difficulty} + -La difficulté totale est la somme de la difficulté de minage Ethash pour tous les blocs jusqu'à un point spécifique de la blockchain. La difficulté totale terminale est une valeur spécifique de la difficulté totale qui était utilisée comme déclencheur pour les clients d'exécution afin d'éteindre leurs fonctions de minage et permettre au réseau de basculer vers la preuve d'enjeu. + -### réseau de test {#testnet} + -Aussi appelé « testnet » (de l'anglais « test network »), il s'agit d'un réseau utilisé pour simuler le comportement du réseau principal Ethereum (voir [réseau principal](#mainnet)). + - - réseaux de test - + -### jeton {#token} + -Bien virtuel négociable défini dans les contrats intelligents sur la blockchain Ethereum. - -### Norme de jeton {#token-standard} - -Introduit par la proposition ERC-20, il fournit une structure normalisée de [contrat intelligent](#smart-contract) pour les jetons fongibles. D'autres standards ERC s'appliquent aux jetons non-fongibles ou [NFT](#nft). - - - Norme de jeton ERC-20 - - -### Transaction {#transaction} - -Données enregistrées dans la blockchain Ethereum signées par un [compte](#account) émetteur, ciblant une [adresse](#address) spécifique. La transaction contient des métadonnées comme la [limite de gaz](#gas-limit). - - - Transactions - - -### Frais de transaction {#transaction-fee} - -Frais dont il faut s'acquitter à chaque utilisation du réseau Ethereum, Exemple : envoi de fonds depuis votre [portefeuille](#wallet) ou interaction avec une [dApp](#dapp) (échange de jetons ou achat d'un objet de collection, etc.). Considérez-les comme des frais de service. Ils évolueront en fonction de l'occupation du réseau. Ceci est dû au fait que les [validateurs](#validator), les personnes chargées de traiter votre transaction, sont susceptibles de donner la priorité aux transactions dont les commissions sont plus élevées. La congestion du réseau fait grimper les prix. - -Au niveau technique, vos frais de transaction se rapportent à la quantité de [gaz](#gas) que votre transaction requiert. - -La réduction des frais de transaction est actuellement au coeur de l'actualité. Voir [couche 2](#layer-2). - -### Absence de confiance {#trustlessness} - -Capacité d'un réseau à effectuer des transactions sans qu'aucune des parties impliquées n'ait besoin de faire confiance à un tiers. - -### Turing-complet {#turing-complete} - -Concept nommé d'après le mathématicien et informaticien anglais Alan Turing. Un système de règles de traitement de données (instructions d'un ordinateur, langage de programmation ou automate cellulaire) est dit « Turing-complet » ou « universel sur le plan informatique » s'il a au moins le pouvoir des machines de Turing. + ## V {#section-v} -### Validateur {#validator} - -Dans un système de [preuve d'enjeu](#pos), [nœud](#node) chargé du stockage des données, du traitement des transactions et de l'ajout de nouveaux blocs à la blockchain. Pour activer le logiciel validateur, vous devez pouvoir [mettre en jeu](#staking) 32 ETH. - - - Preuve d'enjeu - - - Mise en jeu sur Ethereum - - -### Cycle de vie du validateur {#validator-lifecycle} + -Séquence des états dans lesquels un validateur peut exister. Elle comprend : + -- déposé : Au moins 32 ETH ont été déposés sur le [contrat de dépôt](#deposit-contract) par le validateur -- en attente : le validateur est dans la file d'activation et attend d'être accepté dans le réseau par vote des validateurs existants -- actif : en train d'attester et de proposer des blocs -- dénoncé : le validateur s'est mal comporté et a été exclu -- sortant : le validateur a été marqué pour quitter le réseau, soit volontairement, soit parce qu'il a été éjecté. + -### Preuve de validité {#validity-proof} + -Modèle de sécurité pour certaines solutions de [couche 2](#layer-2) dans lequel, pour augmenter la vitesse, les transactions sont regroupées en lots ([rollups](/#rollups)) et soumises à Ethereum en une seule transaction. Le calcul des transactions se fait hors chaîne et est ensuite fourni à la chaîne principale avec une preuve de leur validité. Cette méthode augmente le nombre de transactions possibles tout en maintenant le niveau de sécurité. Certains [rollups](#rollups) utilisent des [preuves de fraude](#fraud-proof). - - - Rollups ZK - - -### Validium {#validium} - -Solution hors chaîne qui utilise les [preuves de validité](#validity-proof) pour augmenter le débit des transactions. Contrairement à celles des [rollups ZK](#zk-rollup), les données de validium ne sont pas stockées sur la couche 1 du [réseau principal](#mainnet). - - - Validité - - -### Vyper {#vyper} - -Langage de programmation pointu dont la syntaxe est similaire à celle de Python. Conçu pour se rapprocher d'un langage purement fonctionnel. Créé par Vitalik Buterin. - - - Vyper - + ## W {#section-w} -### Portefeuille {#wallet} - -Logiciel qui conserve des [clés privées](#private-key). Il est utilisé pour accéder aux [comptes](#account) Ethereum et les contrôler, et pour interagir avec les [contrats intelligents](#smart-contract). Les clés ne doivent pas nécessairement être stockées dans un portefeuille. Elles peuvent être récupérées depuis un stockage hors ligne (une carte mémoire ou une feuille papier) pour plus de sécurité. Malgré leur nom, les portefeuilles ne stockent jamais la monnaie ni les jetons en eux-mêmes. - - - Portefeuilles Ethereum - + -### Web3 {#web3} + -Troisième version du web. Terme proposé pour la première fois par le Dr Gavin Wood, Web3 représente une nouvelle vision et une nouvelle orientation pour les applications web : passant d'applications gérées et détenues de façon centralisée à des applications construites sur des protocoles décentralisés (voir [dApp](#dapp)). - - - Web2 et Web3 - - -### Wei {#wei} - -Plus petite unité de l'[ether](#ether). 1018 wei = 1 ether. + ## Z {#section-z} -### Adresse zéro {#zero-address} - -Une adresse Ethereum, composée entièrement de zéros, qui est fréquemment utilisée comme adresse pour retirer des jetons de la circulation propriétaire. Une distinction est établie entre les jetons formellement supprimés de l'index d'un contrat intelligent via la méthode burn() et ceux envoyés à cette adresse. - -### preuve de connaissance zéro {#zk-proof} - -Une preuve de connaissance zéro (zero-knowledge proof) est une méthode cryptographique qui permet à un individu de prouver qu'une déclaration est vraie sans transmettre aucune information supplémentaire. - - - Rollups ZK - - -### Rollup ZK {#zk-rollup} + -[Rollup](#rollups) (ou regroupement) de transactions utilisant des [preuves de validité](#validity-proof) pour permettre un débit plus élevé de transactions sur la [couche 2](#layer-2), tout en bénéficiant de la sécurité offerte par le [réseau principal](#mainnet) (couche 1). Bien qu'ils ne puissent pas prendre en charge des types de transactions complexes comme le font les [rollups optimistes](#optimistic-rollups), les rollups ZK n'ont pas de problème de latence dans la mesure où les transactions sont prouvées valides à la soumission. + - - Rollups ZK - + diff --git a/public/content/translations/fr/history/index.md b/public/content/translations/fr/history/index.md index 814c52d8eec..b89288f1db1 100644 --- a/public/content/translations/fr/history/index.md +++ b/public/content/translations/fr/history/index.md @@ -310,9 +310,10 @@ La fourche Istanbul a : La fourche Constantinople a : -- protégé la blockchain d'un blocage avant [l'implémentation de la preuve d'enjeu](#beacon-chain-genesis)  ; -- optimisé le coût de [gaz](/glossary/#gas) certaines actions dans l'[EVM](/developers/docs/ethereum-stack/#ethereum-virtual-machine) ; -- ajouté la possibilité d'interagir avec des adresses qui n'ont pas encore été créées. +- Réduit les récompenses pour le [minage des blocs](/developers/docs/consensus-mechanisms/pow/mining/) de 3 à 2 ETH. +- S'assurer que la blockchain ne se fige pas avant [la mise en œuvre de la preuve d'enjeu](#beacon-chain-genesis). +- optimisé le coût de [gaz](/glossary/#gas) de certaines actions dans l'[EVM](/developers/docs/ethereum-stack/#ethereum-virtual-machine) ; +- Ajouté la possibilité d'interagir avec des adresses qui n'ont pas encore été créées. [Lire l'annonce de l'Ethereum Foundation](https://blog.ethereum.org/2019/02/22/ethereum-constantinople-st-petersburg-upgrade-announcement/) @@ -322,7 +323,7 @@ La fourche Constantinople a :
      1. EIP-145Optimise le coût de certaines actions en chaîne.
      2. EIP-1014vous permet d'interagir avec des adresses qui n'ont pas encore été créées.
      3. EIP-1052optimise le coût de certaines actions en chaîne.
      4. -
      5. EIP-1234s'assure que la blockchain ne gèle pas 'avant la preuve d'enjeu.
      6. +
      7. EIP-1234s'assure que la blockchain ne gèle pas 'avant la preuve d'enjeu et réduit les récompenses de 3 à 2 ETH par bloc.
    @@ -339,7 +340,7 @@ La fourche Constantinople a : La fourche Byzantium a : -- réduit les récompenses pour le [minage](/developers/docs/consensus-mechanisms/pow/mining/)des blocs de 5 à 3 ETH ; +- réduit les récompenses pour le [minage ](/developers/docs/consensus-mechanisms/pow/mining/)des blocs de 5 à 3 ETH ; - retardé la [bombe de difficulté](/glossary/#difficulty-bomb) d'un an ; - ajouté la possibilité d'effectuer des appels sans changement d'état vers d'autres contrats ; - ajouté certaines méthodes de cryptographie pour permettre la [mise à l'échelle de la couche 2](/developers/docs/scaling/#layer-2-scaling). diff --git a/src/intl/fr/common.json b/src/intl/fr/common.json index 2c50d192156..7a27c77a768 100644 --- a/src/intl/fr/common.json +++ b/src/intl/fr/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "Ce tutoriel vous a été utile ?", "feedback-widget-thank-you-title": "Merci pour vos commentaires !", "feedback-widget-thank-you-subtitle": "Améliorez cette page en répondant à quelques questions.", - "feedback-widget-thank-you-subtitle-ext": "Si vous avez besoin d'aide, you pouvez contacter la communauté sur notre Discord.", + "feedback-widget-thank-you-subtitle-ext": "Si vous avez besoin d'aide, vous pouvez contacter la communauté sur notre Discord.", "feedback-widget-thank-you-timing": "2-3 min", "feedback-widget-thank-you-cta": "Ouvrir l'enquête courte", "find-wallet": "Trouver un portefeuille", diff --git a/src/intl/fr/glossary.json b/src/intl/fr/glossary.json new file mode 100644 index 00000000000..c819f40b517 --- /dev/null +++ b/src/intl/fr/glossary.json @@ -0,0 +1,344 @@ +{ + "51%-attack-term": "Attaque de 51 %", + "51%-attack-definition": "Un type d'attaque sur un réseau décentralisé où un groupe prend le contrôle de la majorité des nœuds. Cela leur permettrait de frauder la blockchain en inversant des transactions et en dépensant deux fois de l'éther et d'autres jetons.", + "account-term": "Compte", + "account-definition": "Un objet contenant une adresse, un solde, un nonce, ainsi qu'un stockage et un code facultatifs. Un compte peut être un compte de contrat ou un compte externe (EOA).

    En savoir plus sur les comptes Ethereum.", + "address-term": "Adresse", + "address-definition": "Plus généralement, il s'agit d'un compte externe (EOA) ou d'un compte de contrat qui peut recevoir (adresse de destination) ou envoyer (adresse source) des transactions sur la blockchain. Plus précisément, il s'agit des 160 bits les plus à droite d'un hachage Keccak d'une clé publique ECDSA.", + "abi-term": "Interface Binaire d'Application (ABI)", + "abi-definition": "La manière standard d'interagir avec les contrats dans l'écosystème Ethereum, à la fois depuis l'extérieur de la blockchain et pour les interactions de contrat à contrat. En savoir plus sur ABI.", + "api-term": "Interface de Programmation des Applications (API)", + "api-definition": "Une interface de programmation d'application (API) est un ensemble de définitions sur la manière d'utiliser un logiciel. Une API se situe entre une application et un serveur web, et facilite le transfert de données entre eux.", + "asic-term": "ASIC", + "asic-definition": "Circuit intégré spécifique à une application. Il s'agit généralement d'un circuit intégré conçu sur mesure pour le minage de crypto-monnaies.", + "assert-term": "asset", + "assert-definition": "Dans Solidity, `assert(false)` compile vers `0xfe`, un opcode invalide, qui utilise tout le gaz restant et annule tous les changements. Quand une déclaration `assert()` échoue, quelque chose de très mauvais et d'inattendu est en train de se produire, et vous devrez corriger votre code. Vous devriez utiliser `assert()` pour éviter des conditions qui ne devraient jamais se produire. En savoir plus sur la sécurité des contrats intelligents.", + "attestation-term": "Attestation", + "attestation-definition": "Une affirmation faite par une entité que quelque chose est vrai. Dans le contexte d'Ethereum, les validateurs de consensus doivent affirmer ce qu'ils pensent être l'état de la chaîne. À certains moments, chaque validateur est responsable de la publication de différentes attestations qui déclarent formellement son point de vue sur la chaîne, y compris le dernier point de contrôle finalisé et la tête actuelle de la chaîne. En savoir plus sur les attestations.", + "base-fee-term": "Frais de base", + "base-fee-definition": "Chaque bloc, fournit un prix de réserve connu sous le nom de 'base fee'. Cela représente les frais minimum par unité de gas, qu'un utilisateur aura a payer après avoir choisi la transaction à inclure dans le bloc suivant. En savoir plus sur les frais de gas.", + "beacon-chain-term": "Chaîne phare", + "beacon-chain-definition": "La Chaîne phare est la blockchain qui a introduit la preuve d'enjeu et les validateurs dans Ethereum. Elle a fonctionné parallèlement au réseau principal Ethereum de preuve de travail de décembre 2020 jusqu'à ce que les deux chaînes soient fusionnées en septembre 2022 pour former l'Ethereum d'aujourd'hui. En savoir plus sur la Chaîne phare.", + "big-endian-term": "Big-endian", + "big-endian-definition": "Représentation positionnelle des nombres où le chiffre le plus significatif est le premier dans la mémoire. Le contraire de little-endian, où le chiffre le moins significatif est le premier.", + "block-term": "Bloc", + "block-definition": "Un bloc est une unité d'informations regroupées qui comprend une liste ordonnée de transactions et d'informations liées au consensus. Les blocs sont proposés par des validateurs de preuve d'enjeu, puis partagés sur l'ensemble du réseau pair-à-pair, où ils peuvent facilement être vérifiés de manière indépendante par tous les autres nœuds. Les règles de consensus régissent le contenu d'un bloc qui est considéré comme valide, et tout bloc non valide est ignoré par le réseau. L'ordre de ces blocs et les transactions qu'ils contiennent créent une chaîne d'événements déterministe dont la fin représente l'état actuel du réseau. En savoir plus sur les blocs.", + "block-explorer-term": "Explorateur de bloc", + "block-explorer-definition": "Une interface qui permet à un utilisateur de rechercher des informations à partir d'une blockchain et à son sujet. Cela comprend la récupération de transactions individuelles, d'activités associées à des adresses spécifiques et d'informations sur le réseau.", + "block-header-term": "Les en-têtes de bloc", + "block-header-definition": "L'en-tête de bloc est une collection de métadonnées à propos d'un bloc et un résumé des transactions incluses dans le bloc d'exécution.", + "block-propagation-term": "Propagation de bloc", + "block-propagation-definition": "Le procédé de transmission de la confirmation d'un bloc à tous les autres nœuds au sein du réseau.", + "block-proposer-term": "Proposant de bloc", + "block-proposer-definition": "Validateur spécifique choisi pour créer un bloc dans un créneau particulier.", + "block-reward-term": "Récompense du bloc", + "block-reward-definition": "C'est le total d'ether reversé au proposant d'un nouveau bloc valide.", + "block-status-term": "État du bloc", + "block-status-definition": "Les états dans lesquels un bloc peut exister. Les états possibles sont les suivants :

    • proposé : le bloc a été proposé par un validateur
    • programmé : les validateurs sont en train de soumettre des données
    • manqué/supprimé : le proposant n'a pas proposé de bloc dans le délai imparti
    • orphelin : le bloc a été réorganisé par l'algorithme de choix du fork
    .", + "block-time-term": "Durée de blocage", + "block-time-definition": "L'intervalle de temps entre les blocs ajoutés à la blockchain.", + "block-validation-term": "Validation de bloc", + "block-validation-definition": "Le processus consistant à vérifier qu'un nouveau bloc contient des transactions et des signatures valides, qu'il s'appuie sur la chaîne historique la plus lourde et qu'il respecte toutes les autres règles de consensus. Les blocs valides sont ajoutés à la fin de la chaîne et propagés aux autres membres du réseau. Les blocs non valides sont ignorés.", + "blockchain-term": "Blockchain", + "blockchain-definition": "Il s'agit d'une séquence de blocs, chacun d'entre eux étant lié à son prédécesseur jusqu'au bloc d'origine en se référant au hachage du bloc précédent. L'intégrité de la blockchain est crypto-économiquement garantie par un mécanisme de consensus basé sur la preuve de l'enjeu. Qu'est-ce qu'une blockchain ?", + "bootnode-term": "Nœud d'amorçage", + "bootnode-definition": "Les nœuds qui peuvent être utilisés pour lancer le processus de découverte lors de l'exécution d'un nœud. Les points de terminaison de ces nœuds sont enregistrés dans le code source d'Ethereum.", + "bytecode-term": "Bytecode", + "bytecode-definition": "Ensemble d'instructions abstraites conçu pour être exécuté efficacement par un interprète logiciel ou une machine virtuelle. Contrairement au code source lisible par l'homme, le bytecode est exprimé en format numérique.", + "byzantium-fork-term": "fourche Byzantium", + "byzantium-fork-definition": "Le premier de deux hard forks pour l'étape de développement Metropolis. Il comprenait l'EIP-649 Metropolis Difficulty Bomb Delay et Block Reward Reduction, où l'âge de glace a été retardé d'un an et la récompense en blocs a été réduite de 5 à 3 Ethers.", + "casper-ffg-term": "Casper FFG", + "casper-ffg-definition": "Casper-FFG est un protocole de consensus par preuve d'enjeu utilisé avec l'algorithme de choix de fourche LMD-GHOST pour permettre à des clients de consensus de s'entendre sur la tête de la chaîne phare.", + "checkpoint-term": "Point de contrôle", + "checkpoint-definition": "La chaîne phare a un tempo divisé en créneaux (12 secondes) et en époques (32 créneaux). Le premier créneau de chaque époque est un point de contrôle. Lorsqu'une supermajorité de validateurs atteste du lien entre deux points de contrôle, ceux-ci peuvent être justifiés, puis lorsqu'un autre point de contrôle est justifié par-dessus, ils peuvent être finalisés.", + "compiling-term": "Compiler", + "compiling-definition": "Traduire du code écrit dans un langage de programmation de haut niveau (par exemple, Solidity) en un langage de plus bas niveau (par exemple, le bytecode de l'EVM).Plus d'informations sur la compilation de contrats intelligents", + "committee-term": "Comité", + "committee-definition": "Un groupe d'au moins 128 validateurs chargés de valider les blocs dans chaque créneau. L'un des validateurs du comité est l'agrégateur, chargé d'agréger les signatures de tous les autres validateurs du comité qui s'accordent sur une attestation. À ne pas confondre avec le comité de synchronisation.", + "computational-infeasibility-term": "Infaisabilité informatique", + "computational-infeasibility-definition": "Un processus est infaisable sur le plan informatique s'il prenait un temps excessivement long (par exemple, des milliards d'années) pour quiconque pourrait avoir un intérêt à le mettre en œuvre.", + "consensus-term": "Consensus", + "consensus-definition": "Lorsqu'une supermajorité de nœuds du réseau dispose de tous les mêmes blocs dans la meilleure blockchain validée localement. À ne pas confondre avec les règles de consensus.", + "consensus-client-term": "Client de consensus", + "consensus-client-definition": "Les clients de consensus (tels que Prysm, Teku, Nimbus, Lighthouse, Lodestar) exécutent l'algorithme de consensus par preuve d'enjeu d'Ethereum, ce qui permet au réseau de parvenir à un accord sur la tête de la chaîne de balises. Les clients de consensus ne participent pas à la validation/diffusion des transactions ni à l'exécution des transitions d'état. Ces tâches sont effectuées par le client d'exécution.", + "consensus-layer-term": "Couche de consensus", + "consensus-layer-definition": "La couche de consensus d'Ethereum est le réseau des clients de consensus.", + "consensus-rules-term": "Règles de consensus", + "consensus-rules-definition": "Les règles de validation des blocs que les nœuds complets suivent pour rester en consensus avec les autres nœuds. À ne pas confondre avec le consensus.", + "cfi-term": "Envisagé pour inclusion (CFI)", + "cfi-definition": "Un Core EIP qui n'est pas encore actif sur le réseau pricnipal, et les développeurs de clients sont généralement favorables à l'idée. En supposant qu'il remplisse toutes les conditions d'inclusion sur le réseau principal, il pourrait être inclus dans une mise à jour du réseau (pas nécessairement la prochaine).", + "constantinople-fork-term": "Fourche Constantinople", + "constantinople-fork-definition": "La deuxième partie de l'étape Metropolis, initialement prévue pour la mi-2018. Elle devrait inclure le passage à un algorithme de consensus hybride avec preuve de travail et preuve d'enjeu, entre autres changements.", + "contract-account-term": "Compte d'un contract", + "contract-account-definition": "Compte contenant du code qui s'exécute chaque fois qu'il reçoit une transaction d'un autre compte (qu'il s'agisse d'un compte externe ou d'un contrat).", + "contract-creation-transaction-term": "Transaction de création de contrat", + "contract-creation-transaction-definition": "Une transaction spéciale qui inclut le code d'initiation d'un contrat. Le destinataire est défini à `null` et le contrat est déployé à une adresse générée à partir de l'adresse de l'utilisateur et de `nonce`, qui est utilisé pour enregistrer un contrat et l'enregistrer sur la blockchain Ethereum.", + "cryptoeconomics-term": "Cryptoéconomies", + "cryptoeconomics-definition": "L'économie des cryptomonnaies.", + "doge-d-term": "Đ", + "doge-d-definition": "Đ (D avec trait) est utilisé en vieil anglais, en moyen anglais, en islandais et en féroïen pour représenter la lettre majuscule « Eth ». Il est utilisé dans des mots comme ĐEV ou Đapp (application décentralisée), où le Đ est la lettre nordique « eth ». L'eth majuscule (Ð) est également utilisé pour symboliser la crypto-monnaie Dogecoin. On le voit couramment dans l'ancienne littérature d'Ethereum, mais il est moins utilisé aujourd'hui.", + "dag-term": "DAG", + "dag-definition": "DAG signifie Directed Acyclic Graph (graphe acyclique dirigé). Il s'agit d'une structure de données composée de nœuds et de liens entre eux. Avant la Fusion, Ethereum utilisait un DAG dans son algorithme de preuve de travail, Ethash, mais il n'est plus utilisé dans la preuve d'enjeu.", + "dapp-term": "DApp", + "dapp-definition": "Application décentralisée. Il s'agit au minimum d'un contrat intelligent et d'une interface utilisateur web. Plus généralement, une dApp est une application web construite sur des services d'infrastructure peer-to-peer ouverts et décentralisés. En outre, de nombreuses dApps incluent un stockage décentralisé et/ou un protocole et une plateforme de messages. Introduction aux dApps", + "data-availability-term": "Disponibilité des données", + "data-availability-definition": "Propriété permettant à tout noeud connecté au réseau de télécharger n'importe quelle portion de l'état qu'il souhaite.", + "decentralization-term": "Décentralisation", + "decentralization-definition": "Action de transférer le contrôle et l'exécution des processus en dehors d'une entité centrale.", + "dao-term": "Organisation autonome décentralisée (DAO)", + "dao-definition": "Une entreprise ou une autre organisation qui fonctionne sans direction hiérarchique. DAO peut également faire référence à un contrat nommé « The DAO » lancé le 30 avril 2016, qui a ensuite été piraté en juin 2016 ; cela a finalement motivé une fourche majeure (nom de code DAO) au bloc 1 192 000, qui a inversé le contrat DAO piraté et a provoqué la scission d'Ethereum et d'Ethereum Classic en deux systèmes concurrents. En savoir plus sur les organisations autonomes décentralisées (DAO)", + "dex-term": "Échange décentralisé (DEX)", + "dex-definition": "Un type de dApp qui vous permet d'échanger des jetons avec des pairs sur le réseau. Vous avez besoin d'ether pour l'utiliser (pour payer les frais de transaction) mais elles ne sont soumises à aucune restriction géographique contrairement aux plateformes d'échanges centralisés et n'importe qui peut participer.", + "deposit-contract-term": "Contrat de dépôt", + "deposit-contract-definition": "La passerelle vers le staking sur Ethereum. Le contrat de dépôt est un contrat intelligent sur Ethereum qui accepte les dépôts d'ETH et gère les soldes des validateurs. Un validateur ne peut être activé sans déposer de l'ETH dans ce contrat. Le contrat nécessite de l'ETH et des données d'entrée. Ces données d'entrée comprennent la clé publique du validateur et la clé publique du retrait, signées par la clé privée du validateur. Ces données sont nécessaires pour qu'un validateur soit identifié et approuvé par le réseau de preuve d'enjeu.", + "defi-term": "DeFi", + "defi-definition": "Abréviation de « Decentralized Finance » (finance décentralisée), vaste catégorie d'dApps visant à fournir des services financiers sur toute la blockchain, sans aucun intermédiaire et de sorte que toute personne ayant une connexion Internet puisse participer. En savoir plus sur la finance décentralisée (DeFi).", + "difficulty-term": "Difficulté", + "difficulty-definition": "Un paramètre à l'échelle du réseau dans les réseaux de preuve de travail qui contrôle la quantité de calcul moyenne nécessaire pour trouver un nonce valide. La difficulté est représentée par le nombre de zéros en tête qui sont nécessaires dans le hachage du bloc résultant pour qu'il soit considéré comme valide. Ce concept est obsolète dans Ethereum depuis la transition vers la preuve d'enjeu.", + "difficulty-bomb-term": "Bombe de difficulté", + "difficulty-bomb-definition": "Augmentation exponentielle planifiée du paramètre de difficulté de la preuve de travail qui a été conçue pour inciter à la transition vers la preuve d'enjeu, réduisant les possibilités d'une fourche. La bombe de difficulté a été supprimée lors de la Fusion.", + "digital-signatures-term": "Signature numérique", + "digital-signatures-definition": "Une courte chaîne de données qu'un utilisateur produit pour un document à l'aide d'une clé privée, de sorte que toute personne disposant de la clé publique correspondante, de la signature et du document peut vérifier que (1) le document a été « signé » par le propriétaire de cette clé privée particulière, et (2) que le document n'a pas été modifié après avoir été signé.", + "discovery-term": "La découverte", + "discovery-definition": "Procédé au cours duquel un noeud du réseau Ethereum trouve d'autres nœuds auxquels se connecter.", + "distributed-hash-table-term": "Table d'empreintes numériques distribuée (DHT)", + "distributed-hash-table-definition": "Une structure de données contenant des paires `(key, value)` utilisées par les nœuds Ethereum pour identifier les pairs auxquels se connecter et déterminer les protocoles à utiliser pour communiquer.", + "double-spend-term": "Double dépense", + "double-spend-definition": "Il s'agit d'un fork délibéré de la blockchain, dans lequel un utilisateur disposant d'une puissance minière ou d'un enjeu suffisamment important envoie une transaction déplaçant une certaine devise hors de la chaîne (par exemple, en sortant en monnaie fiduciaire ou en effectuant un achat hors de la chaîne), puis réorganise la blockchain afin de supprimer cette transaction. Une double dépense réussie laisse l'attaquant avec ses actifs sur la chaîne et hors chaîne.", + "ecdsa-term": "Algorithme de Signature Numérique à Courbe Elliptique (ECDSA)", + "ecdsa-definition": "Algorithme cryptographique utilisé par Ethereum pour garantir que les fonds ne peuvent être dépensés que par leurs propriétaires. C'est la méthode préférée pour créer des clés publiques et privées. Pertinent pour la génération d'adresses de compte et la vérification des transactions.", + "encryption-term": "Chiffrement", + "encryption-definition": "Le cryptage de données est la conversion électronique en une forme illisible exceptée par le détenteur de la clé correspondante de décryptage.", + "entropy-term": "Entropie", + "entropy-definition": "Dans le contexte de la cryptographie, manque de prévisibilité ou niveau d'erreurs. Lorsqu'ils génèrent des informations secrètes, telles que des clés privées, les algorithmes s'appuient généralement sur une source d'entropie élevée pour s'assurer que le résultat est imprévisible.", + "epoch-term": "Période", + "epoch-definition": "Une période de 32 créneaux, chaque créneau étant de 12 secondes, soit un total de 6,4 minutes. Les comités de validation sont mélangés à chaque époque pour des raisons de sécurité. Chaque époque est l'occasion de finaliser la chaîne. Chaque validateur se voit attribuer de nouvelles responsabilités au début de chaque époque. En savoir plus sur la preuve d'enjeu.", + "equivocation-term": "Ambiguïté", + "equivocation-definition": "Un validateur qui envoie deux messages qui se contredisent. Un exemple simple est celui d'un émetteur de transaction qui envoie deux transactions avec le même nonce. Un autre exemple est celui d'un proposant de bloc qui propose deux blocs à la même hauteur de bloc (ou pour le même créneau).", + "eth1-term": "Eth1", + "eth1-definition": "'Eth1' est un terme qui se réfère au réseau principal Ethereum, la blockchain de preuve de travail existante. Ce terme a depuis été abandonné au profit de la 'couche d'exécution'. En savoir plus sur ce changement de nom.", + "eth2-term": "Eth2", + "eth2-definition": "'Eth2' est un terme qui faisait référence à un ensemble de mises à jour du protocole Ethereum, y compris la transition d'Ethereum vers la preuve d'enjeu. Ce terme a depuis été abandonné au profit de la 'couche de consensus'. En savoir plus sur ce changement de nom.", + "eip-term": "Proposition d'amélioration d'Ethereum (EIP)", + "eip-definition": "Document de conception visant à informer la communauté Ethereum qui décrit une nouvelle fonctionnalité proposée, ses processus ou son environnement (voir ERC). Introduction aux EIP", + "ens-term": "Ethereum Name Service (ENS)", + "ens-definition": "Le registre ENS est un contrat central unique qui fournit une correspondance entre des noms de domaine et des propriétaires et des résolveurs, comme décrit dans l'EIP-137. En savoir plus sur ens.domains", + "execution-client-term": "Client d'exécution", + "execution-client-definition": "Les clients d'exécution (anciennement appelés « clients Eth1 »), tels que Besu, Erigon, Go-Ethereum (Geth), Nethermind, sont chargés de traiter et de diffuser les transactions et de gérer l'état d'Ethereum. Ils exécutent les calculs pour chaque transaction en utilisant la machine virtuelle Ethereum pour s'assurer que les règles du protocole sont respectées.", + "execution-layer-term": "Couche d'exécution", + "execution-layer-definition": "La couche d'exécution d'Ethereum est le réseau des clients d'exécution.", + "eoa-term": "Compte externe (EOA)", + "eoa-definition": "Les comptes détenus en externe (EOA) sont des comptes contrôlés par des clés privées, généralement générées à l'aide d'une phrase de récupération. Contrairement aux contrats intelligents, les comptes détenus en externe sont des comptes auxquels aucun code n'est associé. En général, ces comptes sont gérés par un portefeuille.", + "erc-term": "Demande de commentaires Ethereum (ERC)", + "erc-definition": "Libellé donné à certaines EIP qui visent à définir une norme spécifique d'utilisation d'Ethereum.", + "ethash-term": "Ethash", + "ethash-definition": "Algorithme de preuve de travail qui a été utilisé sur Ethereum avant de passer à la preuve d'enjeu. En savoir plus.", + "ether-term": "Ether", + "ether-definition": "La crypto-monnaie native utilisée par l'écosystème Ethereum, qui couvre les coûts du gaz lors de l'exécution des transactions. Également écrit ETH ou son symbole Ξ, le caractère Xi majuscule grec. En savoir plus sur l'éther.", + "events-term": "Événements", + "events-definition": "Permet d'utiliser les fonctions de journalisation de l'EVM. Les dApps peuvent écouter les événements et les utiliser pour déclencher des rappels JavaScript dans l'interface utilisateur. En savoir plus sur les événements et les journaux.", + "evm-term": "Machine virtuelle Ethereum (EVM)", + "evm-definition": "Une machine virtuelle basée sur une pile qui exécute du bytecode. Avec Ethereum, le modèle d'exécution spécifie comment l'état du système est modifié compte tenu d'une série d'instructions bytecode et d'un petit tuple de données environnementales. Ceci est spécifié à travers un modèle formel d'une machine d'état virtuelle. En savoir plus sur la machine virtuelle Ethereum.", + "evm-assembly-language-term": "Langage d'assemblage de l'EVM", + "evm-assembly-language-definition": "Forme lisible par l'homme du bytecode de l'EVM.", + "fallback-function-term": "Fonction de secours", + "fallback-function-definition": "Fonction par défaut appelée en l'absence de données ou d'un nom de fonction déclaré.", + "faucet-term": "Robinet", + "faucet-definition": "Service exécuté via un contrat intelligent, qui distribue des fonds sous la forme d'ethers de test gratuits pouvant être utilisés sur un réseau de test.", + "finality-term": "Finalisation", + "finality-definition": "La finalité est la garantie qu'un ensemble de transactions effectuées avant un moment donné ne changera pas et ne pourra pas être annulé. En savoir plus sur la finalité de la preuve d'enjeu.", + "finney-term": "Finney", + "finney-definition": "Une dénomination d'ether. 1 finney = 1015 wei. 103 finney = 1 ether.", + "fork-term": "Fourche", + "fork-definition": "Changement de protocole causant la création d'une chaîne alternative ou divergence temporelle en deux chemins de blocs potentiels.", + "fork-choice-algorithm-term": "Algorithme de sélection de fourche", + "fork-choice-algorithm-definition": "L'algorithme utilisé pour identifier la tête de la blockchain. Sur la couche d'exécution, la tête de la chaîne est identifiée comme étant celle qui présente la plus grande difficulté totale. Cela signifie que la véritable tête de la chaîne est celle qui a nécessité le plus de travail pour la miner. Dans la couche de consensus, l'algorithme observe les attestations cumulées des validateurs (LMD_GHOST).", + "fraud-proof-term": "Preuve de fraude", + "fraud-proof-definition": "Un modèle de sécurité pour certaines solutions de seconde couche où, pour augmenter la vitesse, les transactions sont regroupées en lots et soumises à Ethereum en une seule transaction. Elles sont présumées valides mais peuvent être contestées si une fraude est suspectée. Une preuve de fraude exécutera alors la transaction pour voir si une fraude a eu lieu. Cette méthode augmente le nombre de transactions possibles tout en maintenant la sécurité. Certains rollups utilisent des preuves de validité. En savoir plus sur les rollups optimistes.", + "frontier-term": "Frontier", + "frontier-definition": "Phase initiale de développement à des fins de test d'Ethereum, qui a duré de juillet 2015 à mars 2016.", + "gas-term": "Gaz", + "gas-definition": "Un carburant virtuel utilisé dans Ethereum pour exécuter des contrats intelligents. L'EVM utilise un mécanisme de comptabilité pour mesurer la consommation de gaz et limiter la consommation de ressources informatiques (voir Turing complet). En savoir plus sur le gaz et les frais.", + "gas-limit-term": "Limite de gaz", + "gas-limit-definition": "Montant maximum de gaz qu'une transaction ou qu'un bloc peut consommer.", + "gas-price-term": "Prix du gaz", + "gas-price-definition": "Prix en éther d'une unité de gaz spécifiée dans une transaction.", + "genesis-block-term": "Bloc d'origine", + "genesis-block-definition": "Premier bloc d'une blockchain, utilisé pour initialiser un certain réseau et sa cryptomonnaie.", + "geth-term": "Geth", + "geth-definition": "Go Ethereum. L'une des implémentations les plus importantes du protocole Ethereum, écrite en Go. En savoir plus sur geth.ethereum.org", + "gwei-term": "Gwei", + "gwei-definition": "Abréviation de gigawei, une dénomination de l'Ether, couramment utilisée pour fixer le prix du gaz. 1 gwei = 109 wei. 109 gwei = 1 Ether.", + "hard-fork-term": "Fourche majeure", + "hard-fork-definition": "Une divergence permanente dans la blockchain, également connue sous le nom de « hard-forking change ». Une telle divergence se produit généralement lorsque des nœuds non mis à niveau ne peuvent pas valider des blocs créés par des nœuds mis à niveau qui suivent des règles de consensus plus récentes. À ne pas confondre avec un fork, un soft fork, un software fork ou un Git fork.", + "hash-term": "Empreinte numérique", + "hash-definition": "Une empreinte digitale de longueur fixe d'une entrée de taille variable, produite par une fonction de hachage. (Voir keccak-256).", + "hash-rate-term": "Taux de hachage", + "hash-rate-definition": "Nombre de calculs par seconde réalisé par les ordinateurs minant sur le réseau.", + "homestead-term": "Homestead", + "homestead-definition": "Deuxième phase de développement d'Ethereum, lancée en mars 2016 au bloc 1 150 000.", + "index-term": "Index", + "index-definition": "Structure réseau destinée à optimiser la sollicitation d'informations à travers la blockchain en fournissant un chemin efficace vers sa source de stockage.", + "ide-term": "Environnement de développement intégré (IDE)", + "ide-definition": "Une interface utilisateur qui combine généralement un éditeur de code, un compilateur, un moteur d'exécution et un débogueur. En savoir plus sur les environnements de développement intégrés.", + "immutable-deployed-code-problem-term": "Problème de code déployé immuable", + "immutable-deployed-code-problem-definition": "Une fois que le code d'un contrat (ou d'une bibliothèque) est déployé, il devient immuable. Les pratiques standard de développement de logiciels reposent sur la possibilité de corriger d'éventuels bogues et d'ajouter de nouvelles fonctionnalités, ce qui représente un défi pour le développement de contrats intelligents. En savoir plus sur le déploiement des contrats intelligents.", + "internal-transaction-term": "Transaction interne", + "internal-transaction-definition": "Transaction envoyée depuis un compte de contrat vers un autre compte de contrat ou vers un compte externe (EOA) (voir message).", + "issuance-term": "Émission", + "issuance-definition": "Frappe de nouveaux ethers pour récompenser la proposition de bloc, l'attestation et la dénonciation.", + "kdf-term": "Fonction de dérivation de clé (KDF)", + "kdf-definition": "Aussi appelée « algorithme d'étirement de mot de passe », elle est utilisée par les formats keystore pour protéger des attaques par force brute, par dictionnaire et table arc-en-ciel sur le chiffrement des phrases de sécurité, en hachant celles-ci de façon répétée.", + "keystore-term": "Keystore", + "keystore-definition": "La paire clé privée/adresse de chaque compte existe sous la forme d'un fichier clé unique dans un client Ethereum. Il s'agit de fichiers texte JSON qui contiennent la clé privée cryptée du compte, qui ne peut être décryptée qu'avec le mot de passe saisi lors de la création du compte.", + "keccak-256-term": "Keccak-256", + "keccak-256-definition": "Fonction de hachage cryptographique utilisée dans Ethereum. Keccak-256 a été standardisée en tant que SHA-3.", + "layer-2-term": "Niveau 2", + "layer-2-definition": "Un domaine de développement axé sur la superposition d'améliorations sur le protocole Ethereum. Ces améliorations concernent la vitesse des transactions, les frais de transaction moins élevés et la confidentialité des transactions. En savoir plus sur la couche 2.", + "library-term": "Bibliothèque", + "library-definition": "Un type spécial de contrat qui n'a pas de fonctions payantes, pas de fonction de repli et pas de stockage de données. Il ne peut donc pas recevoir ou conserver de l'éther, ni stocker des données. Une bibliothèque sert de code précédemment déployé que d'autres contrats peuvent appeler pour des calculs en lecture seule. En savoir plus sur les bibliothèques de contrats intelligents.", + "light-client-term": "Client léger", + "light-client-definition": "Un client Ethereum qui ne stocke pas de copie locale de la blockchain, ni ne valide les blocs et les transactions. Il offre les fonctions d'un portefeuille et peut créer et diffuser des transactions.", + "lmd-ghost-term": "LMD-GHOST", + "lmd-ghost-definition": "L'algorithme de choix de fourche utilisé par les clients de consensus d'Ethereum pour identifier la tête de la chaîne. LMD-GHOST est un acronyme signifiant \"Latest Message Driven Greediest Heaviest Observed SubTree\", ce qui signifie que la tête de la chaîne est le bloc qui a accumulé le plus grand nombre d'attestations dans son histoire.", + "mainnet-term": "Réseau principal", + "mainnet-definition": "Appelé « mainnet » en anglais (pour « main network »), il s'agit de la blockchain principale du réseau public Ethereum.", + "merkle-patricia-tree-term": "Arbre de Merkle (MTP)", + "merkle-patricia-tree-definition": "Structure des données utilisée dans Ethereum pour stocker efficacement les paires clés-valeurs.", + "message-term": "Message", + "message-definition": "Transaction interne qui n'est jamais sérialisée et qui est uniquement envoyée dans l'EVM.", + "message-call-term": "Appel de message", + "message-call-definition": "La transmission d'un message d'un compte à un autre. Si le compte de destination est associé au code EVM, la VM sera démarrée avec l'état de cet objet et le message sera traité.", + "mining-term": "Minage", + "mining-definition": "Le processus de hachage répété d'un en-tête de bloc tout en incrémentant un nonce jusqu'à ce que le résultat contienne un nombre arbitraire de zéros binaires de tête. C'est le processus par lequel de nouveaux blocs sont ajoutés à une blockchain à preuve de travail. C'est ainsi qu'Ethereum était sécurisé avant de passer à la preuve d'enjeu.", + "miner-term": "Mineur", + "miner-definition": "Un nœud du réseau qui trouve une preuve de travail valide pour les nouveaux blocs, par un hachage répété (voir Ethash). Les mineurs ne font plus partie d'Ethereum - ils ont été remplacés par des validateurs lorsque Ethereum est passé à la preuve d'enjeu.", + "mint-term": "Frapper", + "mint-definition": "La frappe de monnaie est le processus qui consiste à créer de nouveaux jetons et à les mettre en circulation pour qu'ils puissent être utilisés. Il s'agit d'un mécanisme décentralisé permettant de créer un nouveau jeton sans l'intervention d'une autorité centrale.", + "network-term": "Réseau", + "network-definition": "En référence au réseau Ethereum, un réseau pair-à-pair qui propage les transactions et les blocs à chaque nœud Ethereum (participant au réseau). En savoir plus sur les réseaux.", + "network-hashrate-term": "Puissance de hachage du réseau", + "network-hashrate-definition": "Le hashrate collectif produit par l'ensemble d'un réseau de minage. Le minage sur Ethereum a été désactivé lorsque Ethereum est passé à la preuve d'enjeu.", + "nft-term": "Jeton non fongible (NFT)", + "nft-definition": "Il s'agit d'une norme de jeton introduite par la proposition ERC-721. Les NFT peuvent être suivis et échangés, mais chaque jeton est unique et distinct ; ils ne sont pas interchangeables comme les jetons ETH et ERC-20. Les NFT peuvent représenter la propriété d'actifs numériques ou physiques. En savoir plus sur les jetons non fongibles (NFT).", + "node-term": "Nœud", + "node-definition": "Un client logiciel qui participe au réseau. En savoir plus sur les nœuds et les clients.", + "nonce-term": "Nonce", + "nonce-definition": "En cryptographie, une valeur qui ne peut être utilisée qu'une seule fois. Un nonce de compte est un compteur de transactions dans chaque compte, qui est utilisé pour empêcher les attaques par rejeu.", + "ommer-term": "Bloc oncle (ommer)", + "ommer-definition": "Lorsqu'un mineur en preuve de travail trouve un bloc valide, un autre mineur peut avoir publié un bloc concurrent qui est ajouté au bout de la blockchain en premier. Ce bloc valide, mais périmé, peut être inclus par des blocs plus récents en tant qu'ommers et recevoir une récompense de bloc partielle. Le terme « ommer » est le terme de genre neutre préféré pour désigner le frère ou la sœur d'un bloc parent, mais cela est parfois également appelé « oncle ». Cela était pertinent pour Ethereum lorsqu'il s'agissait d'un réseau de preuve de travail, mais les ommers ne sont pas une caractéristique de l'Ethereum de preuve d'enjeu car un seul proposeur de bloc est sélectionné dans chaque créneau.", + "optimistic-rollup-term": "Rollup optimisé", + "optimistic-rollup-definition": "Un rollup de transactions qui utilise des preuves de fraude pour offrir un débit de transactions en seconde couche accru tout en utilisant la sécurité fournie par le reseau principal (couche 1). Contrairement au Plasma, une solution de seconde couche similaire, les rollups optimistes peuvent gérer des types de transactions plus complexes – tout ce qui est possible dans l'EVM. Cependant, ils présentent des problèmes de latence par rapport aux Zero-knowledge rollups car une transaction peut être contestée via la preuve de fraude. En savoir plus sur les rollups optimistes.", + "oracle-term": "Oracle", + "oracle-definition": "Un oracle est un pont entre la blockchain et le monde réel. Ils agissent comme des API sur la chaîne qui peuvent être interrogées pour obtenir des informations et utilisées dans les contrats intelligents. En savoir plus sur les oracles.", + "peer-term": "Pair", + "peer-definition": "Ordinateurs connectés exécutant le logiciel client Ethereum qui ont des copies identiques de la blockchain.", + "peer-to-peer-network-term": "Réseaux Pair-à-Pair", + "peer-to-peer-network-definition": "Réseau d'ordinateurs (pairs) collectivement capables d'exécuter des fonctionnalités sans avoir besoin de services centralisés, basés sur un serveur.", + "plasma-term": "Plasma", + "plasma-definition": "Une solution de mise à l'échelle hors chaîne qui utilise des preuves de fraude, comme les rollups optimistes. Plasma est limité aux transactions simples comme les transferts et les échanges de jetons. En savoir plus sur Plasma.", + "private-key-term": "Clé privée", + "private-key-definition": "Nombre secret qui permet aux utilisateurs Ethereum de prouver la propriété d'un compte ou de contrats en produisant une signature numérique (voir clé publique, adresse, ECDSA).", + "private-chain-term": "Chaîne privée", + "private-chain-definition": "Une blockchain est dite privée si on y accède en y étant autorisé, par opposition à une blockchain publique.", + "pos-term": "Preuve d'enjeu (PoS)", + "pos-definition": "Une méthode par laquelle un protocole de blockchain de crypto-monnaie vise à atteindre un consensus distribué. La preuve d'enjeu demande aux utilisateurs de prouver qu'ils possèdent un certain montant de crypto-monnaie (leur « participation » dans le réseau) afin de pouvoir participer à la validation des transactions. En savoir plus sur la preuve d'enjeu.", + "pow-term": "Preuve de travail (PoW)", + "pow-definition": "Un élément de données (la preuve) dont la découverte nécessite un calcul important. En savoir plus sur la preuve de travail.", + "public-key-term": "Clé publique", + "public-key-definition": "Nombre dérivé d'une clé privée via une fonction à sens unique, qui peut être partagé publiquement et utilisé par n'importe qui pour vérifier une signature numérique créée avec la clé privée correspondante.", + "receipt-term": "Reçu", + "receipt-definition": "Données renvoyées par un client Ethereum pour représenter le résultat d'une transaction particulière, y compris un hachage numérique de la transaction, son numéro de bloc, la quantité de gaz utilisée et, en cas de déploiement d'un contrat intelligent, l'adresse du contrat.", + "re-entrancy-attack-term": "Attaque par réentrance", + "re-entrancy-attack-definition": "Attaque consistant pour un contrat de l'attaquant à appeler une fonction d'un contrat de la victime de telle sorte qu'au cours de l'exécution, la victime appelle à nouveau le contrat de l'attaquant, de manière récursive. Cela peut entraîner, par exemple, le vol de fonds en sautant les parties du contrat de la victime qui mettent à jour les soldes ou comptent les montants des retraits. En savoir plus sur la réentrance.", + "reward-term": "Récompense", + "reward-definition": "Quantité d'ethers inclus dans chaque nouveau bloc en tant que récompense du réseau au mineur qui a trouvé la solution de la preuve de travail.", + "rlp-term": "Préfixe de longueur récursive (RLP)", + "rlp-definition": "Norme d'encodage conçue par les développeurs Ethereum pour encoder et sérialiser des objets (structure de données) de complexité et de longueur arbitraires.", + "rollups-term": "Rollups", + "rollups-definition": "Un type de solution de mise à l'échelle de la couche 2 qui regroupe plusieurs transactions et les soumet à la chaîne principale Ethereum en une seule transaction. Cela permet de réduire les coûts de gaz et d'augmenter le débit des transactions. Il existe des rollups optimistes et à connaissance nulle qui utilisent différentes méthodes de sécurité pour offrir ces gains d'évolutivité. En savoir plus sur les rollups.", + "rpc-term": "Appel de procédure distante (RPC)", + "rpc-definition": "L'appel de procédure à distance (RPC) est un protocole qu'un programme utilise pour demander un service à un programme situé sur un autre ordinateur dans un réseau sans avoir à comprendre les détails du réseau.", + "sha-term": "Algorithme de hachage sécurisé (SHA)", + "sha-definition": "Famille de fonctions de hachage cryptographique publiées par le National Institute of Standards and Technology (NIST) aux États-Unis.", + "serialization-term": "La sérialisation", + "serialization-definition": "Procédé de conversion d'une structure de données en une séquence d'octets.", + "shard-term": "Fragment / chaîne de fragments", + "shard-definition": "Les chaînes de fragments sont des sections discrètes de la blockchain totale dont des sous-ensembles de validateurs peuvent être responsables. Cela permettra d'augmenter le débit des transactions pour Ethereum et d'améliorer la disponibilité des données pour les solutions de couche 2 telles que les rollups optimistes et les rollups ZK. Plus d'informations sur danksharding.", + "sidechain-term": "Chaîne latérale", + "sidechain-definition": "Une solution de mise à l'échelle qui utilise une chaîne séparée avec des règles de consensus différentes, souvent plus rapides. Un pont est nécessaire pour connecter ces chaînes latérales au Réseau principal. Les rollups utilisent également des sidechains, mais ils fonctionnent en collaboration avec le Réseau principal. En savoir plus sur les sidechains.", + "signing-term": "Signature", + "signing-definition": "Prouve cryptographiquement qu'une transaction a été approuvée par le détenteur d'une clé privée spécifique.", + "singleton-term": "Singleton", + "singleton-definition": "Terme de programmation informatique décrivant un objet dont il ne peut exister qu'une seule instance.", + "slasher-term": "Exclure", + "slasher-definition": "Un slasher est une entité qui analyse les attestations à la recherche d'infractions pouvant faire l'objet d'un slash. Les slashs sont diffusés sur le réseau et le prochain proposant de bloc ajoute la preuve au bloc. L'auteur de la proposition de bloc reçoit alors une récompense pour la suppression du validateur malveillant.", + "slot-term": "Créneau", + "slot-definition": "Période de temps (12 secondes) pendant laquelle de nouveaux blocs peuvent être proposés par un validateur dans le système de preuve d'enjeu. Un slot peut être vide. 32 slots constituent une époque. En savoir plus sur la preuve d'enjeu.", + "smart-contract-term": "Contrat intelligent", + "smart-contract-definition": "Un programme qui s'exécute sur l'infrastructure informatique Ethereum. Introduction aux contrats intelligents.", + "snark-term": "SNARK", + "snark-definition": "Abréviation de « succinct non-interactive argument of knowledge », un SNARK est un type de preuve à connaissance nulle. En savoir plus sur les rollups ZK.", + "soft-fork-term": "Fourche mineure", + "soft-fork-definition": "Une divergence dans une blockchain qui se produit lorsque les règles de consensus changent. Contrairement à un hard fork, un soft fork est rétrocompatible ; les nœuds mis à niveau peuvent valider les blocs créés par des nœuds non mis à niveau tant qu'ils respectent les nouvelles règles de consensus.", + "solidity-term": "Solidity", + "solidity-definition": "Langage de programmation procédural (impératif) dont la syntaxe est similaire à JavaScript, C++ ou Java. Le langage le plus populaire et le plus fréquemment utilisé pour les contrats intelligents Ethereum. Créé par Gavin Wood. En savoir plus sur Solidity.", + "solidity-inline-assembly-term": "Assemblage en ligne Solidity", + "solidity-inline-assembly-definition": "Le langage d'assemblage EVM dans un programme Solidity. La prise en charge de l'assemblage en ligne par Solidity facilite l'écriture de certaines opérations.", + "stablecoin-term": "Stablecoin", + "stablecoin-definition": "Un jeton ERC-20 dont la valeur est liée à celle d'un autre actif. Il existe des stablecoins adossés à des monnaies fiduciaires comme le dollar, à des métaux précieux comme l'or et à d'autres crypto-monnaies comme le Bitcoin.", + "staking-term": "Staking", + "staking-definition": "Le dépôt d'une quantité d'ether (votre mise) pour devenir un validateur et sécuriser le réseau. Un validateur vérifie les transactions et propose des blocs sous un modèle de consensus de preuve d'enjeu. Le staking vous offre une incitation économique à agir dans le meilleur intérêt du réseau. Vous recevrez des récompenses pour l'exécution de vos tâches de validateur, mais vous perdrez des quantités variables d'ETH si vous ne le faites pas. En savoir plus sur le staking Ethereum.", + "staking-pool-term": "Pools de mise en jeu", + "staking-pool-definition": "L'ETH combiné de plus d'un staker Ethereum, utilisé pour atteindre les 32 ETH requis pour activer un ensemble de clés de validation. Un opérateur de nœud utilise ces clés pour participer au consensus et les récompenses du bloc sont réparties entre les stakers qui y contribuent. Les pools de staking ou la délégation de staking ne font pas partie du protocole Ethereum, mais de nombreuses solutions ont été élaborées par la communauté. En savoir plus sur les pools de mise en jeu.", + "stark-term": "STARK", + "stark-definition": "Abréviation de « scalable transparent argument of knowledge », un STARK est un type de preuve à connaissance nulle. En savoir plus sur les rollups ZK.", + "state-term": "État", + "state-definition": "Image instantanée de tous les soldes et métadonnées présents à un moment donné sur la blockchain, qui renvoie normalement à la condition d'un bloc particulier.", + "state-channels-term": "Canaux d'état", + "state-channels-definition": "Une solution de couche 2 où un canal est mis en place entre les participants, où ils peuvent effectuer des transactions librement et à moindre coût. Seule une transaction pour établir le canal et le fermer est envoyée au réseau principal. Cela permet un débit de transaction très élevé, mais nécessite de connaître le nombre de participants à l'avance et de bloquer les fonds. En savoir plus sur les canaux d'État.", + "supermajority-term": "Supermajorité", + "supermajority-definition": "La supermajorité est le terme utilisé pour désigner un montant dépassant les 2/3 (66 %) du nombre total d'Ether mis en jeu pour sécuriser Ethereum. Un vote à la supermajorité est nécessaire pour que les blocs soient finalisés sur la chaîne phare.", + "syncing-term": "Synchronisation", + "syncing-definition": "Le processus de téléchargement de la dernière version complète d'une blockchain sur un nœud.", + "sync-committee-term": "Comité de synchronisation", + "sync-committee-definition": "Un comité de synchronisation est un groupe de validateurs sélectionnés de manière aléatoire et rafraîchis toutes les 27 heures environ. Leur objectif est d'ajouter leurs signatures aux en-têtes de blocs valides. Les comités de synchronisation permettent aux clients légers de suivre l'évolution de la tête de la blockchain sans avoir besoin d'accéder à l'ensemble des validateurs.", + "szabo-term": "Szabo", + "szabo-definition": "Une dénomination d'ether. 1 szabo = 1012 wei. 106 szabo = 1 ether.", + "terminal-total-difficulty-term": "Difficulté Totale Terminale (TTD)", + "terminal-total-difficulty-definition": "La difficulté totale est la somme des difficultés de minage d'Ethash pour tous les blocs jusqu'à un certain point de la blockchain. La difficulté totale terminale est une valeur spécifique de la difficulté totale qui a été utilisée comme déclencheur pour que les clients d'exécution arrêtent leurs fonctions de minage et d'échange de blocs, permettant ainsi au réseau de passer à la preuve d'enjeu.", + "testnet-term": "Réseau de test", + "testnet-definition": "Aussi appelé « testnet », il s'agit d'un réseau utilisé pour simuler le comportement du réseau principal Ethereum.", + "token-term": "Jeton", + "token-definition": "Bien virtuel négociable défini dans les contrats intelligents sur la blockchain Ethereum.", + "transaction-term": "Transaction", + "transaction-definition": "Données engagées dans la blockchain Ethereum, signées par un compte d'origine, ciblant une adresse spécifique. La transaction contient des métadonnées telles que la limite de gaz pour cette transaction. En savoir plus sur les transactions.", + "transaction-fee-term": "Frais de transaction", + "transaction-fee-definition": "Des frais que vous devez payer chaque fois que vous utilisez le réseau Ethereum. Les exemples incluent l'envoi de fonds depuis votre portefeuille ou une interaction avec une dApp, comme échanger des jetons ou acheter un objet de collection. Vous pouvez considérer cela comme des frais de service. Cette commission variera en fonction de l'encombrement du réseau. Cela est dû au fait que les validateurs, les personnes responsables du traitement de votre transaction, sont susceptibles de prioriser les transactions avec des frais plus élevés – donc la congestion fait monter le prix.

    À un niveau technique, vos frais de transaction sont liés à la quantité de gaz que votre transaction nécessite.

    La réduction des frais de transaction est un sujet d'intérêt intense en ce moment. Voir Seconde Couche.", + "trustlessness-term": "Absence de confiance", + "trustlessness-definition": "La capacité d'un réseau à effectuer des transactions sans qu'aucune des parties impliquées n'ait besoin de faire confiance à un tiers.", + "turing-complete-term": "Turing-complet", + "turing-complete-definition": "Un concept nommé d'après le mathématicien et informaticien anglais Alan Turing. \nUn système de règles de traitement de données (instructions d'un ordinateur, langage de programmation ou automate cellulaire) est dit « Turing-complet » ou « universel sur le plan informatique » s'il a au moins le pouvoir des machines de Turing.", + "validator-term": "Validateur", + "validator-definition": "Un nœud dans un système de preuve d'enjeu responsable du stockage des données, du traitement des transactions et de l'ajout de nouveaux blocs à la blockchain. Pour activer le logiciel de validation, vous devez être en mesure de miser 32 ETH. En savoir plus sur la mise en jeu dans Ethereum.", + "validator-lifecycle-term": "Cycle de vie du validateur", + "validator-lifecycle-definition": "La séquence d'états dans laquelle un validateur peut exister. Cela inclut :

    • déposé : Au moins 32 ETH ont été déposés dans le contrat de dépôt par le validateur
    • en attente : le validateur est dans la file d'attente d'activation en attendant d'être voté dans le réseau par les validateurs existants
    • actif : atteste et propose actuellement des blocs
    • puni : le validateur a mal agi et est en train d'être pénalisé
    • sortie : le validateur a été signalé pour quitter le réseau, soit volontairement, soit parce qu'il a été éjecté.
    ", + "validity-proof-term": "Preuve de validité", + "validity-proof-definition": "Un modèle de sécurité pour certaines solutions de couche 2 où, pour augmenter la vitesse, les transactions sont regroupées en lots et soumises à Ethereum en une seule transaction. Le calcul des transactions est effectué en hors chaîne, puis fourni à la chaîne principale avec une preuve de leur validité. Cette méthode permet d'augmenter le nombre de transactions possibles tout en maintenant la sécurité. Certains rollups utilisent des preuves de fraude. En savoir plus sur les rollups à connaissance nulle.", + "validium-term": "Validium", + "validium-definition": "Une solution hors chaîne qui utilise des preuves de validité pour améliorer le débit des transactions. Contrairement aux rollups ZK, les données de validium ne sont pas stockées sur la couche 1 du réseau principal. En savoir plus sur le validium.", + "vyper-term": "Vyper", + "vyper-definition": "Un langage de programmation de haut niveau avec une syntaxe semblable à celle de Python. Destiné à se rapprocher d'un langage fonctionnel pur. Créé par Vitalik Buterin. En savoir plus sur Vyper.", + "wallet-term": "Portefeuille", + "wallet-definition": "Logiciel qui détient les clés privées. Elles sont utilisées pour accéder et contrôler les comptes Ethereum et interagir avec les contrats intelligents. Les clés n'ont pas besoin d'être stockées dans un portefeuille et peuvent être récupérées à partir d'un stockage hors ligne (c'est-à-dire une carte mémoire ou du papier) pour une meilleure sécurité. Malgré leur nom, les portefeuilles ne stockent jamais les pièces ou les jetons proprement dits. En savoir plus sur les portefeuilles Ethereum.", + "web3-term": "Web3", + "web3-definition": "La troisième version du web. Terme proposé pour la première fois par le Dr Gavin Wood, Web3 représente une nouvelle vision et une nouvelle orientation pour les applications web : passant d'applications gérées et détenues de façon centralisée à des applications construites sur des protocoles décentralisés. Plus sur Web3.", + "wei-term": "Wei", + "wei-definition": "La plus petite dénomination d'ether. 1018 wei = 1 ether.", + "zero-address-term": "Adresse zéro", + "zero-address-definition": "Une adresse Ethereum, composée entièrement de zéros, qui est fréquemment utilisée comme adresse pour retirer les jetons de la circulation. Une distinction est faite entre les jetons officiellement retirés de l'index d'un contrat intelligent via la méthode burn() et ceux envoyés à cette adresse.", + "zk-proof-term": "Preuve de connaissance zéro", + "zk-proof-definition": "Une preuve à connaissance nulle est une méthode cryptographique qui permet à une personne de prouver qu'une déclaration est vraie sans transmettre d'informations supplémentaires. En savoir plus sur les rollups à connaissance nulle.", + "zk-rollup-term": "Rollup ZK", + "zk-rollup-definition": "Un rollup de transactions qui utilise des preuves de validité pour offrir un débit de transactions en seconde couche accru tout en utilisant la sécurité fournie par le réseau principal (couche 1). Bien qu'ils ne puissent pas gérer des types de transactions complexes, comme les rollups optimistes, ils n'ont pas de problèmes de latence car les transactions sont prouvées valides lorsqu'elles sont soumises. En savoir plus sur les rollups Zk." +} diff --git a/src/intl/fr/page-dapps.json b/src/intl/fr/page-dapps.json index cb5476f8532..eeae0039d6e 100644 --- a/src/intl/fr/page-dapps.json +++ b/src/intl/fr/page-dapps.json @@ -115,12 +115,14 @@ "page-dapps-dapp-description-rarible": "Créez, vendez et achetez des objets de collection tokenisés.", "page-dapps-dapp-description-rubic": "Agrégateur de technologie Inter-Chain pour les utilisateurs et les dApps.", "page-dapps-dapp-description-sablier": "Diffusez de l'argent en temps réel.", + "page-dapps-dapp-description-skiff": "Email, calendrier, documents et fichiers chiffrés de bout en bout qui vous donnent le pouvoir de communiquer librement.", "page-dapps-dapp-description-spatial": "Créez votre propre avatar personnalisé et des mondes 3D", "page-dapps-dapp-description-spruce": "Pile open-source pour laisser le contrôle de l'identité et des données là où il devrait être : entre les mains des utilisateurs.", "page-dapps-dapp-description-status": "Conçu pour permettre la libre circulation de l'information, protéger le droit à des conversations privées et sécurisées, et promouvoir la souveraineté des individus.", "page-dapps-dapp-description-superrare": "Achetez des œuvres numériques directement auprès des artistes ou sur les marchés secondaires.", "page-dapps-dapp-description-synthetix": "Synthetix est un protocole pour émettre et échanger des avoirs synthétiques", "page-dapps-dapp-description-token-sets": "Stratégies d'investissement cryptographiques qui se rééquilibrent automatiquement.", + "page-dapps-dapp-description-tornado-cash": "Effectuez des transactions anonymes grâce à Ethereum.", "page-dapps-dapp-description-uniswap": "Échangez facilement des jetons ou envoyez des jetons pour des récompenses en pourcentage.", "page-dapps-dapp-description-xmtp": "Envoyez des messages entre les comptes blockchain, y compris les messages directs, les alertes, les annonces et plus encore.", "page-dapps-dapp-description-yearn": "Yearn Finance est un agrégateur de rendement. Il donne aux individus, aux DAOs et aux autres protocoles un moyen de déposer des avoirs numériques et de recevoir des intérêts.", @@ -246,6 +248,7 @@ "page-dapps-set-up-a-wallet-button": "Trouver un portefeuille", "page-dapps-set-up-a-wallet-description": "Un portefeuille est votre \"nom d'utilisateur\" pour une DApp", "page-dapps-set-up-a-wallet-title": "Configurez un portefeuille", + "page-dapps-skiff-logo-alt": "Logo Skiff", "page-dapps-social-button": "Réseaux sociaux", "page-dapps-social-description": "Ce sont des applications qui se concentrent sur la création de réseaux sociaux décentralisés en utilisant des technologies d'identité décentralisées où les identités numériques et les graphes sociaux appartiennent aux utilisateurs.", "page-dapps-social-title": "Réseaux sociaux", @@ -257,6 +260,7 @@ "page-dapps-technology-description": "Ce sont des applications qui se concentrent sur la décentralisation des outils de développement, l'intégration de systèmes de chiffrement dans la technologie existante, et la création de marchés pour le développement des logiciels libres.", "page-dapps-technology-title": "Technologie décentralisée", "page-dapps-token-sets-logo-alt": "Logo Token Sets", + "page-dapps-tornado-cash-logo-alt": "Logo de Tornado Cash", "page-dapps-uniswap-logo-alt": "Logo Uniswap", "page-dapps-wallet-callout-button": "Trouver un portefeuille", "page-dapps-wallet-callout-description": "Les portefeuilles sont également des DApps. Trouvez-en un basé sur les fonctionnalités qui vous conviennent.", diff --git a/src/intl/fr/page-stablecoins.json b/src/intl/fr/page-stablecoins.json index 97f83767742..291b10c59b8 100644 --- a/src/intl/fr/page-stablecoins.json +++ b/src/intl/fr/page-stablecoins.json @@ -63,7 +63,6 @@ "page-stablecoins-bank-apy-source-link": "Source", "page-stablecoins-bitcoin-pizza": "La célèbre pizza Bitcoin", "page-stablecoins-bitcoin-pizza-body": "En 2010, quelqu’un a acheté 2 pizzas pour 10 000 bitcoins. À l’époque, elles valaient environ 41 USD. Sur le marché d’aujourd’hui, cela représente des millions de dollars. Il existe beaucoup de transactions regrettables similaires dans l'histoire d'Ethereum. Les stablecoins résolvent ce problème, pour que vous puissiez profiter de votre pizza et conserver votre ETH.", - "page-stablecoins-category-dashboard-and-education": "Tableau de bord & Éducation", "page-stablecoins-coin-price-change": "Variation du prix des pièces (30 derniers jours)", "page-stablecoins-crypto-backed": "Crypto adossé", "page-stablecoins-crypto-backed-con-1": "Moins stable que les stablecoins adossées à la monnaie fiduciaire.", From de8ddd262302bb9d3c83a08934c26893c0d78c6a Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 16:29:43 -0700 Subject: [PATCH 373/478] Hungarian import Feb 20 (Homepage, Use cases, Community, Foundational docs - proof-of-stake, Foundational docs - proof-of-work, Whitepaper, Learn pages 2, Research pages, Misc) --- .../docs/development-networks/index.md | 2 +- public/content/translations/hu/about/index.md | 109 ++- .../translations/hu/community/online/index.md | 2 +- .../hu/community/support/index.md | 2 +- .../hu/decentralized-identity/index.md | 2 +- .../mining/mining-algorithms/ethash/index.md | 2 +- .../data-structures-and-encoding/index.md | 32 + .../patricia-merkle-trie/index.md | 261 +++++++ .../data-structures-and-encoding/rlp/index.md | 159 ++++ .../data-structures-and-encoding/ssz/index.md | 149 ++++ .../web3-secret-storage-definition/index.md | 189 +++++ .../developers/docs/networking-layer/index.md | 155 ++++ .../network-addresses/index.md | 38 + .../networking-layer/portal-network/index.md | 82 ++ .../translations/hu/enterprise/index.md | 171 ++-- .../hu/enterprise/private-ethereum/index.md | 21 +- .../translations/hu/foundation/index.md | 25 +- .../content/translations/hu/glossary/index.md | 735 +++++------------- .../content/translations/hu/history/index.md | 388 ++++++--- .../translations/hu/whitepaper/index.md | 512 ++++++------ .../consensus-mechanisms/pow/mining/index.md | 2 +- src/intl/hu/common.json | 2 +- src/intl/hu/glossary.json | 344 ++++++++ src/intl/hu/page-about.json | 20 +- src/intl/hu/page-assets.json | 69 +- src/intl/hu/page-bug-bounty.json | 201 +++-- src/intl/hu/page-index.json | 6 +- 27 files changed, 2535 insertions(+), 1145 deletions(-) create mode 100644 public/content/translations/hu/developers/docs/data-structures-and-encoding/index.md create mode 100644 public/content/translations/hu/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md create mode 100644 public/content/translations/hu/developers/docs/data-structures-and-encoding/rlp/index.md create mode 100644 public/content/translations/hu/developers/docs/data-structures-and-encoding/ssz/index.md create mode 100644 public/content/translations/hu/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md create mode 100644 public/content/translations/hu/developers/docs/networking-layer/index.md create mode 100644 public/content/translations/hu/developers/docs/networking-layer/network-addresses/index.md create mode 100644 public/content/translations/hu/developers/docs/networking-layer/portal-network/index.md create mode 100644 src/intl/hu/glossary.json diff --git a/public/content/developers/docs/development-networks/index.md b/public/content/developers/docs/development-networks/index.md index 206a1b4f29b..889adae797f 100644 --- a/public/content/developers/docs/development-networks/index.md +++ b/public/content/developers/docs/development-networks/index.md @@ -66,7 +66,7 @@ There are also two maintained public test implementations of Ethereum: Goerli an Kurtosis is a build system for multi-container test environments which enables developers to locally spin up reproducible instances of blockchain networks. -The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scaleable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Etheruem core infrastructure. +The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scaleable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Ethereum core infrastructure. - [Ethereum network package](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) diff --git a/public/content/translations/hu/about/index.md b/public/content/translations/hu/about/index.md index 64c1bf6a4c3..27ca0ada06e 100644 --- a/public/content/translations/hu/about/index.md +++ b/public/content/translations/hu/about/index.md @@ -6,49 +6,118 @@ lang: hu # Az ethereum.org-ról {#about-ethereumorg} -Az ethereum.org egy nyilvános, nyílt forráskódú anyag az Ethereum közösségnek, amihez bárki közreműködhet. Van egy kis csapatunk, amelynek feladata az oldal karbantartása és fejlesztése, amelyet a [Ethereum Alapítvány](/foundation/) támogat. +Az ethereum.org egy nyilvános, nyílt forráskódú információs forrás az Ethereum közösségnek, amelyhez bárki hozzájárulhat. Egy kicsi központi csapat dedikáltan dolgozik az oldal fenntartásán és fejlesztésén, s ebben több ezer közösségi tag segíti őket a világ minden tájáról. -## A jövőképünk {#our-vision} +## Megjegyzés a nevekkel kapcsolatban {#a-note-on-names} -### Az ethereum.org küldetése, hogy a legjobb portál legyen az Ethereum egyre növekvő közössége számára {#mission} +Általános dolog, hogy az emberek összekeverik az Ethereum világába tartozó neveket, így nem tudnak az Ethereum működéséről valós képet kapni. Az alábbiakban gyorsan összefoglalnánk, hogy mi micsoda: -Egy oktatási anyag vagyunk, melyet arra terveztek, hogy segítsen az új felhasználóknak megismerni az Ethereumot és főbb tulajdonságait. Szeretnénk: +### Ethereum {#ethereum} + +Az Ethereum egy nyilvános hálózat, egy blokklánc és egy nyílt forráskódú protokoll, melyet működtet, irányít, kezel és birtokol egy globális közösség sok tízezernyi tagja, amely fejlesztőkből, csomópontüzemeltetőkből, ETH-szel rendelkezőkből és felhasználókból áll. + +[Bővebben az Ethereumról](/what-is-ethereum/) + +[Bővebben az Ethereum irányításáról](/governance/) + +### Ether (ETH) {#ether-or-eth} + +Az Ether (melyet ETH-ként is láthat) a natív valuta, mellyel az Ethereumon tranzakciókat hajtanak végre. Az Ethereum hálózat használatáért ETH-ben kell fizetni (tranzakciós díjak formájában). Az ETH-t arra is használják, hogy a letétbe helyezés révén biztosítsa a hálózatot. Amikor arról van szó, hogy mi az Ethereum ára, akkor az ETH-re gondolnak. + +[Bővebben az ETH-ről](/eth/) + +[Bővebben az ETH letétbe helyezéséről](/staking/) + +### Ethereum Alapítvány {#ethereum-foundation} + +Egy non-profit szervezet, melyet eredetileg az ETH tömeges eladásával alapítottak meg, s az Ethereum hálózat és ökoszisztéma dedikált támogatója. + +[Bővebben az Ethereum Alapítványról](/foundation/) + +### ethereum.org {#ethereum-org} + +Egy nyilvános, nyílt forráskódú weboldal és tudásbázis az Ethereum közösség számára. Az ethereum.org oldalt egy kicsi központi csapat vezeti, melyet az Ethereum Alapítvány hozott létre, s több ezer közösségi tag közreműködik benne a világ minden tájáról. + +Ez a cikk további információkat tartalmaz az ethereum.org-ról. + +## Küldetésünk {#our-mission} + +**Az ethereum.org küldetése, hogy a legjobb portál legyen az Ethereum egyre növekvő közössége számára** + +Arra törekszünk, hogy egy könnyen érthető tudástárat építsünk minden Ethereumhoz kapcsolódó témáról, hogy az új felhasználók megismerhessék az Ethereumot és fontos koncepcióit. Szeretnénk: - elmagyarázni az Ethereumot bárkinek, akinek új ez a technológia - segíteni az új felhasználónak belekezdeni az ETH és az Ethereum használatába -- segíteni az új fejlesztőknek elkezdeni fejleszteni -- lefedni az Ethereum világában történő híreket +- segíteni az új fejlesztőknek, hogy építésbe fogjanak +- bemutatni az Ethereum világának változásait, híreit - bemutatni a közösség által készített anyagokat -- elhozni az Ethereum oktatást annyi nyelven, amennyin csak lehetséges +- lehetővé tenni az Ethereum oktatást annyi nyelven, amennyin csak lehetséges + +E küldetés elérése érdekében a csapat két elsődleges célra koncentrál az ethereum.org-on: -Van egy pár alapelvünk, melyek segítenek ezt elérni. +### 1. Javítsa az ethereum.org látogatók felhasználó élményét {#visitors} + +- A tartalom kiterjesztése új témákra, fejlesztése és frissítése +- A használhatóség és az elérhetőség fejlesztése a lokalizáció és a webfejlesztés bevált gyakorlatai által +- A felhasználói elköteleződés növelése olyan funkciókkal, mint a kérdőívek, kvízek és web3 integrációk +- A honlapot megőrizzék könnyűsúlyú és hatékonyan működő állapotában + +### 2. A közreműködők közössége növekedjen, erősödjön és alkalmas legyen {#community} + +- A honlaphoz hozzájárulók számának növelése +- A közreműködők megtartásának javítása a bevonás, elismerés és díjak révén +- A közösség tagjait alkalmassá tenni arra, hogy egyre növekvő, jelentős hozzájárulásokat tegyenek +- A közreműködés sokszínűségének elősegítése: kód, tartalom, dizájn, fordítás, moderálás +- A kódbázis modern, tiszta és jól dokumentált legyen ## Alapelveink {#core-principles} -### 1. Az ethereum.org egy portál az Ethereumra 🌏 {#core-principles-1} +A következő fő elvek segítenek nekünk teljesíteni a küldetést. -Szeretnénk felkelteni a felhasználók érdeklődését és megválaszolni a kérdéseiket. Tehát portálunknak egyesítenie kell az információkat, a "varázslatos pillanatokat" és a linkeket a kiváló közösségi forrásokhoz, amelyek odakint vannak. Tartalmunk célja, hogy egy „onboarding portál” legyünk, és ne helyettesítsük a már meglévő kiterjedt forrásokat. Szeretnénk támogatni és integrálni a közösség által felépített erőforrásokat, nagyobb láthatóságot és felfedezhetőséget biztosítva számukra. +### 1. Az ethereum.org egy portál az Ethereumra 🌏 {#core-principles-1} -[Az Ethereum közösség](/community/) ennek a középpontjában áll: nemcsak a közösséget kell szolgálnunk, hanem együtt kell működnünk velük és fel kell használnunk a visszajelzéseiket. A weboldal nem csak a mostani közösség számára szól, hanem ahhoz a közösséghez is, amihez reményeink szerint felnőhetünk. Emlékeznünk kell arra, hogy közösségünk globális, és sok nyelvből, régióból és kultúrából származó embereket tartalmaz. +Szeretnénk felkelteni a felhasználók érdeklődését és megválaszolni a kérdéseiket. Tehát portálunk egyszerre szolgáltat információkat, „varázslatos pillanatokat” és hozzáférést a közösség által létrehozott kiváló anyagokhoz. A honlap tartalma nem helyettesíti a már meglévő, kiterjedt forrásokat, hanem bevezeti a felhasználókat a témákba és elérhetővé teszi ezeket az anyagokat. Szeretnénk támogatni és integrálni a közösség által felépített tudásbázist, hogy azok láthatóbbak és felfedezhetőbbek legyenek. [Az Ethereum közösség](/community/) ennek a középpontjában áll: nemcsak a közösséget szolgáljuk, hanem együttműködünk a tagjaival és felhasználjuk a visszajelzéseiket. A weboldal nem csak a mostani közösségnek szól, hanem annak is, amelyhez reményeink szerint felfejlődhetünk. Emlékeznünk kell arra, hogy közösségünk globális, és sok nyelvből, régióból és kultúrából származó embereket tartalmaz. ### 2. Az ethereum.org folyamatosan fejlődik 🛠 {#core-principles-2} -Az Ethereum és a közösség folyamatosan fejlődik, így az ethereum.org is fejlődni fog. Emiatt van az oldalnak egyszerű design rendszere & moduláris struktúrája. Iteratív változtatásokat hajtunk végre, amikor többet megtudunk arról, hogy az emberek hogyan használják a webhelyet, és mit akar a közösség tőle. +Az Ethereum és a közösség folyamatosan fejlődik, így az ethereum.org is fejlődni fog. Emiatt van az oldalnak egyszerű dizájnrendszere & moduláris struktúrája. Iteratív változtatásokat hajtunk végre az alapján, hogy az emberek hogyan használják a webhelyet, és mit akar tőle a közösség. Nyílt forráskódúak vagyunk, s a közreműködők közösségével dolgozunk, így Ön is tehet javaslatot változtatásokra vagy segíthet is nekünk a különféle feladatokban. [Bővebben a közreműködésről](/contributing/) + +### 3. Az ethereum.org nem egy tipikus termékről szóló weboldal 🦄 {#core-principles-3} -Nyílt forráskódúak vagyunk a közreműködők közösségével, így javaslatot tehetsz változtatásokra vagy segíthetsz is nekünk. +Az Ethereum egy nagy dolog: magában foglal egy közösséget, egy technológiát, egy sor elképzelést és ideológiát, és még sok mást. Ez azt jelenti, hogy a weboldalnak sok különböző felhasználói utat kell lefednie a „fejlesztőtől kezdve, aki egy bizonyos eszközt szeretne” egészen a „újoncig, aki vett valamennyi ETH-t és nem tudja mi az a tárca”. „Mi a legjobb honlap egy blokkláncplatformnak?” – egyelőre megválaszolatlan marad, mert mi is úttörők vagyunk e területen. Egy ilyen felépítéséhez kísérletezés szükséges. -[Tudj meg többet a közreműködésről](/hu/közreműködők/) +## Az ethereum.org ütemterve {#roadmap} -### 3. Az ethereum.org nem a tipikus termék weboldal 🦄 {#core-principles-3} +Az ethereum.org csapat negyedéves ütemtervet publikál az aktuális célokról, hogy a tevékenységét elérhetőbbé tegye és elősegítse a közösségi közreműködéseket. -Az Ethereum nagy dolog: magában foglal egy közösséget, egy technológiát, egy sor ötletet és ideológiát és még sok mást. Ez azt jelenti, hogy a weboldalnak sok különböző felhasználói utat le kell fednie a "fejlesztőtől, aki egy bizonyos eszközt szeretne kifejleszteni" egészen az "újoncig, aki vett valamennyi ETH-et és még nem tudja mi az a tárca" +[Tekintse meg a 2023 Q1 (első negyedévi) ütemtervünket](https://github.com/ethereum/ethereum-org-website/issues/9090) -"Melyik a legjobb blokklánc platform weboldal?" marad a kérdés - mi úttörők vagyunk. Egy ilyen felépítéséhez kísérletezés szükséges. +**Hogy hangzik?** Nagyra értékeljük, ha visszajelzést ad az ütemtervükkel kapcsolatban! Ha bármivel kapcsolatban úgy véli, hogy foglalkoznunk kellene vele, tudassa velünk! Szívesen fogadjuk a közösség bármelyik tagjától az ötleteket és a beadott kérvényeket (PR, mint pull request). + +**Szeretne Ön is részt venni?** [Tudjon meg többet a közreműködésről](/contributing/), [kövessen minket Twitteren](https://twitter.com/ethdotorg), vagy csatlakozzon a közösségi megbeszélésekhez a [Discord szerveren](https://discord.gg/ethereum-org). ## Tervezési elvek {#design-principles} -Tervezési elveket alkalmazunk a webhely tartalmi és tervezési döntéseink irányításához: [tervezési elvek](/contributing/design-principles/). +A honlappal kapcsolatos tartalmi és dizájn jellegű megbeszéléseket a [dizájnelvek](/contributing/design-principles/) vezérlik. + +## Dizájnrendszer {#design-system} + +Egy [dizájnrendszert](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) hoztunk létre és tettünk közzé, hogy az új jellemzőket gyorsabban be tudjuk vezetni, illetve a közösség tagjai is részt tudjanak venni az ethereum.org nyilvános dizájnjában. + +Szeretne Ön is részt venni? [Kövesse a témát a Figmában](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), a [GitHub issue-knál](https://github.com/ethereum/ethereum-org-website/issues/6284) és csatlakozzon a [#design Discord csatornán](https://discord.gg/ethereum-org) folyó beszélgetésekhez. + +## Stílusútmutató {#style-guide} + +Elérhető egy [stílusútmutató](/contributing/style-guide/), hogy a tartalomírás bizonyos aspektusait összehangolja, s így a hozzájárulás folyamata is egyszerűbb lesz. + +Kérjük, hogy tekintse át az [elveinket](/contributing/design-principles/) és a [stílusútmutatót](/contributing/style-guide/), ha szeretne [hozzájárulni a honlaphoz](/contributing/). + +Ha bármi észrevétele van a dizájnelvekkel, dizájnrendszerrel és a stílusútmutatóval kapcsolatban, azt jelezze felénk! Ne feleddje, az ethereum.org a közösségért van a közösség által. + +## Álláslehetőségek {#open-jobs} + +Habár ez a honlap nyílt forráskódú és bárki dolgozhat rajta, van egy dedikált csapat az ethereum.org-hoz és más Ethereum Alapítvány webprojektekhez. -Szívesen fogadunk róluk visszajelzéseket. Ne feledd, az ethereum.org a közösségért van a közösség által. +Itt megtalálhatja az aktuális álláslehetőségeket. Ha nem lát Önhöz illeszkedő pozíciót, akkor nézzen át a [Discord szerverünkre](https://discord.gg/ethereum-org) és mondja el nekünk, hogyan szerene velünk dolgozni! -Olvasd el az elveket, ha szeretnél [közreműködni az oldalhoz](/contributing/). +Az ethereum.org csapaton túli lehetőségek is érdeklik? [Nézze meg az Ethereumhoz kapcsolódó további álláslehetőségeket](/community/get-involved/#ethereum-jobs/). diff --git a/public/content/translations/hu/community/online/index.md b/public/content/translations/hu/community/online/index.md index f3e3844b977..c657b8c372d 100644 --- a/public/content/translations/hu/community/online/index.md +++ b/public/content/translations/hu/community/online/index.md @@ -25,7 +25,7 @@ Ethereum rajongók százezrei gyűlnek össze ezeken az online fórumokon, hogy Ethereum Hackers – az ETHGlobal által üzemeltetett Discord chat: online közösség az Ethereum hackereknek világszinten CryptoDevs – Ethereum-fejlesztésre fókuszáló Discord-közösség EthStaker Discord – közösségi vezetésű útmutatás, oktatás, támogatás és források a meglévő és lehetséges letéteseknek -Ethereum.org website team – beszélgessen az ethereum.org web fejlesztésről és dizájnról a közösség tagjaival +Ethereum.org website team – beszélgessen az ethereum.org web fejlesztésről és dizájnról a közösség tagjaival Matos Discord – web3 alkotói közösség, ahol a fejlesztők, az iparági vezetők és az Ethereum rajongók találkoznak. Szenvedélyünk a web3 fejlesztés, a dizájn és a kultúra. Jöjjön és építsen velünk. Solidity Gitter – solidity fejlesztésről (Gitter) szóló csevegés Solidity Matrix – solidity fejlesztősről (Matrix) szóló csevegés diff --git a/public/content/translations/hu/community/support/index.md b/public/content/translations/hu/community/support/index.md index 2a3add460b3..8fd46804d6b 100644 --- a/public/content/translations/hu/community/support/index.md +++ b/public/content/translations/hu/community/support/index.md @@ -30,7 +30,7 @@ Gondjai vannak a tárcájával? A legtöbb tárcának van dedikált támogatói - [Argent](https://support.argent.xyz/hc/) - [MyEtherWallet](https://help.myetherwallet.com/) -_Ez nem egy teljes lista. Segítségre van szüksége, hogy megtalálja az adott tárca támogatói csapatát? Csatlakozzon az [ethereum.org Discord](https://discord.gg/rZz26QWfCg) csatornához, és megpróbálunk segíteni._ +_Ez nem egy teljes lista. Segítségre van szüksége, hogy megtalálja az adott tárca támogatói csapatát? Csatlakozzon az [ethereum.org discord](https://discord.gg/ethereum-org) csatornához, és megpróbálunk segíteni._ Ethereum-tárcát keres? [Fedezze fel az Ethereum-tárcák teljes választékát](/wallets/find-wallet/). diff --git a/public/content/translations/hu/decentralized-identity/index.md b/public/content/translations/hu/decentralized-identity/index.md index 9e06dd210fc..8d271476066 100644 --- a/public/content/translations/hu/decentralized-identity/index.md +++ b/public/content/translations/hu/decentralized-identity/index.md @@ -8,7 +8,7 @@ sidebarDepth: 2 image: /eth-gif-cat.png summaryPoint1: A hagyományos identitásrendszerek központosították az azonosítók kiadását, karbantartását és ellenőrzését. summaryPoint2: A decentralizált identitás megszünteti a centralizált harmadik felektől való függőséget. -summaryPoint3: A kriptonak köszönhetően, a felhasználóknak újra van eszközük, hogy tárolják és kezeljék a saját azonosítójukat és tanúsítványaikat. +summaryPoint3: A kriptónak köszönhetően, a felhasználóknak újra van eszközük, hogy tárolják és kezeljék a saját azonosítójukat és tanúsítványaikat. --- A virtuális identitás az életünk minden részét meghatározza napjainkban. Online szolgáltatások használata, bankszámla nyitás, szavazás a választásokon, ingatlan vásárlása, munkavállalás – mindegyikhez az identitás igazolása szükséges. diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index b14af01c475..3aad06ea2ba 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### Az SHA3 használata {#sha3} -Az Ethereum fejlesztése egybe esett az SHA3 szabvány kifejlesztésével, és a standard folyamat egy változtatást vitt véghez a végső hashalgoritmussal kapcsolatban, így az Ethereum „sha3_256” és „sha3_512” hashek nem szabványos sha3 hashek, hanem variánsok, melyre gyakran „Keccak-256” és „Keccak-512” néven hivatkoznak más kontextusban. A kapcsolódó beszélgetéseket [itt](https://eips.ethereum.org/EIPS-1803), [itt](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) vagy [itt](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057) találja. +Az Ethereum fejlesztése egybe esett az SHA3 szabvány kifejlesztésével, és a standard folyamat egy változtatást vitt véghez a végső hashalgoritmussal kapcsolatban, így az Ethereum „sha3_256” és „sha3_512” hashek nem szabványos sha3 hashek, hanem variánsok, melyre gyakran „Keccak-256” és „Keccak-512” néven hivatkoznak más kontextusban. Tekintse meg a kapcsolódó beszélgetéseket, például [itt](https://eips.ethereum.org/EIPS/eip-1803), [itt](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) vagy [itt](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Vegye figyelembe, hogy az alábbi leírás SHA3-hashekre hivatkozik az algoritmus tekintetében. diff --git a/public/content/translations/hu/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/hu/developers/docs/data-structures-and-encoding/index.md new file mode 100644 index 00000000000..df15a386ac3 --- /dev/null +++ b/public/content/translations/hu/developers/docs/data-structures-and-encoding/index.md @@ -0,0 +1,32 @@ +--- +title: Adatszerkezetek és kódolás +description: Az alapvető Ethereum adatstruktúrák áttekintése. +lang: hu +sidebarDepth: 2 +--- + +Az Ethereum nagy adatkötegeket hoz létre, tárol és mozgat. Az adatot sztenderd és memóriahatékony módon kell formázni, hogy bárki tudjon [csomópontot futtatni](/run-a-node/) viszonylag szerény, fogyasztói szintű hardveren. Ehhez az Ethereum stackben számos speciális adatstruktúra található. + +## Előfeltételek {#prerequisites} + +Ehhez érdemes áttekinteni az Ethereum és a [kliensszoftver](/developers/docs/nodes-and-clients/) alapjait. Emellett javasoljuk, hogy a hálózati réteggel és az [Ethereum Fehérkönyvvel](/whitepaper/) is ismerkedjen meg. + +## Adatstruktúrák {#data-structures} + +### Patricia Merkle-fa {#patricia-merkle-tries} + +A Patricia Merkle-fák olyan struktúrák, melyek kulcs-érték párokat kódolnak egy determinisztikus és kriptográfiailag hitelesített fastruktúrává. Ezeket kiterjedten használják az Ethereum végrehajtási rétegén. + +[Bővebben a Patricia Merkle-fákról](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) + +### Rekurzív hosszúságú prefixum (RLP) {#recursive-length-prefix} + +A rekurzív hosszúságú prefixum (RLP) egy sorozatosítási módszer, melyet kiterjedten használnak az Ethereum végrehajtási rétegén. + +[Bővebben az RLP-ről](/developers/docs/data-structures-and-encoding/rlp) + +### Egyszerű sorosítás (SSZ) {#simple-serialize} + +Az egyszerű sorosítás (SSZ) a domináns sorosítási formátum az Ethereum konszenzus rétegén, mivel kompatibilis a merklelizációval. + +[Bővebben az SSZ-ről](/developers/docs/data-structures-and-encoding/ssz) diff --git a/public/content/translations/hu/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/hu/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md new file mode 100644 index 00000000000..00ff3fb2e8c --- /dev/null +++ b/public/content/translations/hu/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -0,0 +1,261 @@ +--- +title: Merkle Patricia-fa +description: Bevezetés a Merkle Patricia-fa témájába. +lang: hu +sidebarDepth: 2 +--- + +A Merkle Patricia-fa egy kriptográfiailag hitelesített adatstruktúrát biztosít, amely az összes `(key, value)` (kulcs, érték) kötés tárolására használható. + +A Merkle Patricia-fák teljesen determinisztikusak, tehát az azonos `(key, value)` kötéssel rendelkező fák garantáltan azonosak az utolsó bájtig. Tehát ugyanazzal a gyökér-hash-sel rendelkeznek, ami a `O(log(n))` hatékonyság szent grálját biztosítja a bejegyzések, keresések és törlések esetében. Ráadásul egyszerűbb megérteni és kódolni őket, mint a bonyolultabb összehasonlításon alapuló alternatívákat, például a vörös-fekete (red-black) fákat. + +## Előfeltételek {#prerequisites} + +A jelen téma könnyebb megértése érdekben tekintse meg a [hash-ek](https://en.wikipedia.org/wiki/Hash_function), [Merkle-fák](https://en.wikipedia.org/wiki/Merkle_tree), [fák](https://en.wikipedia.org/wiki/Trie) és [sorosítás](https://en.wikipedia.org/wiki/Serialization) témákat. + +## Alapvető radix-fák {#basic-radix-tries} + +Egy alapvető radix-fában minden csomópont a következőképpen néz ki: + +``` + [i_0, i_1 ... i_n, value] +``` + +Ahol `i_0 ... i_n` az ábécé (gyakran bináris vagy hexadecimális) szimbólumait jelöli, `value` a csomópontban lévő végérték, és az `i_0, i_1 ... i_n` a slotokban lévő értékek, melyek értéke `NULL` vagy más csomópontokra (itt hash-ekre) mutató mutatók. Ez egy alapvető `(key, value)` (kulcs, érték) tárolót alkot. + +Tegyük fel, hogy egy radixfa adatstuktúráját szeretnénk használni a kulcs-érték párosok halmaza feletti sorrend tárolására. Ahhoz, hogy megtaláljuk a `dog` kulcshoz jelenleg hozzárendelt értéket a fában, először a `dog` szót alakítjuk át az ábécé betűivé (amely `64 6f 67`), majd haladunk lefelé a fában, amíg meg nem találjuk az értéket. Ez azt jelenti, hogy a gyökér-hash keresésével kezdjük egy kulcs/érték adatbázisban (DB), hogy megtaláljuk a fa gyökérpontját. Ez más (csomó)pontokra mutató kulcsok tömbjeként jelenik meg. Ehhez a `6`-os indexnél lévő értéket kulcsként használjuk, és ezt a kulcs-érték adatbázisban megkeressük, hogy megkapjuk az egy szinttel lejjebbi csomópontot. Ezután a `4`-es indexet választjuk a következő érték megkereséséhez, majd a `6`-os indexet, és így tovább, amíg egyszer végig nem követtük az utat: `gyökér -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`, ekkor megnézzük a csomópont értékét, és visszaadjuk az eredményt. + +Különbség van aközött, hogy valamit a fában vagy az alapjául szolgáló kulcs-érték adatbázisban keresünk. Mindkettő kulcs-érték elrendezést definiál, de a mögöttes adatbázis képes a kulcsok hagyományos, egylépéses keresésére. Egy kulcs keresése a fában többszöri adatbáziskeresést igényel a végső érték eléréséhez. Az adatbáziskeresést nevezzük `path` (útvonal) néven, hogy kiküszöböljük a félreérthetőséget. + +A radix-fák frissítési és törlési műveletei a következőképpen definiálhatók: + +``` + def update(node,path,value): + if path == '': + curnode = db.get(node) if node else [ NULL ] * 17 + newnode = curnode.copy() + newnode[-1] = value + else: + curnode = db.get(node) if node else [ NULL ] * 17 + newnode = curnode.copy() + newindex = update(curnode[path[0]],path[1:],value) + newnode[path[0]] = newindex + db.put(hash(newnode),newnode) + return hash(newnode) + + def delete(node,path): + if node is NULL: + return NULL + else: + curnode = db.get(node) + 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) +``` + +A „Merkle” radix-fa a csomópontok összekapcsolásával épül fel, determinisztikusan generált kriptográfiai hash digest-ek segítségével. Ez a tartalomcímzés (a kulcs-érték adatbázisban `key == keccak256(rlp(value))`) biztosítja a tárolt adatok kriptográfiai integritását. Ha egy adott fa gyökérhash-e nyilvánosan ismert, akkor aki hozzáférhet a mögöttes levél szintű adatokhoz, bizonyítékot állíthat össze arra, hogy a fa egy adott értéket tartalmaz egy adott útvonalon, azáltal hogy megadja az egyes csomópontok hash-ét, amelyek egy adott értéket a fa gyökeréhez kapcsolnak. + +Egy támadó számára lehetetlen egy nem létező `(path, value)` pár bizonyítása, mivel a gyökér-hash az összes alatta lévő hash-re épül. A mögöttes adatok módosítása megváltoztatná a gyökér-hash-t. A hash-re úgy is gondolhat, mint az adatok szerkezeti információinak tömörített reprezentációjára, amelyet a hash-függvény előképvédelme (pre-image) biztosít. + +A radix-fa egy atomnyi egységére (például egyetlen hexadecimális karakter vagy 4 bites bináris szám) „nibble”-ként hivatkozunk. Miközben az útvonalat bejárjuk egy-egy nibble mentén, a csomópontnak legfeljebb 16 gyermeke lehet addig, amíg egy `érték`-et tartalmaz. Ezért ezeket 17 hosszúságú tömbként ábrázoljuk. Ezeket a 17 elemű tömböket „elágazási csomópontoknak” nevezzük. + +## Merkle Patricia-fa {#merkle-patricia-trees} + +A radix-fáknak egy fő korláta van: nem hatékonyak. Ha egy `(path, value)` (út, érték) kötést szeretnénk tárolni, ahol az útvonal, mint az Ethereumban, 64 karakter hosszú (a `bytes32` nibble száma), akkor több mint egy kilobájtnyi extra helyre lesz szükségünk, hogy karakterenként egy szintet tároljunk, és minden keresés vagy törlés mind a 64 lépést megteszi. A bevezetett Patricia-fa megoldotta ezt a gondot. + +### Optimalizálás {#optimization} + +A Merkle Patricia-fa egy csomópontja az egyik a következőkből: + +1. `NULL` (egy üres string) +2. `branch` Egy 17 elemű csomópont `[ v0 ... v15, vt ]` +3. `leaf` Egy 2 elemű csomópont `[ encodedPath, value ]` +4. `extension` Egy 2 elemű csomópont `[ encodedPath, key ]` + +A 64 karakteres útvonalak esetén elkerülhetetlen, hogy a fa első néhány rétegének bejárása után olyan csomóponthoz érjünk, ahol legalább az út egy részén nem létezik elágazás. Annak elkerülése érdekében, hogy az útvonal mentén akár 15 ritka `NULL` csomópontot kelljen létrehozni, a lefelé haladást egy `extension` csomópont létrehozásával levágjuk, amely a `[ encodedPath, key ]` formájú, ahol `encodedPath` tartalmazza a „részleges útvonalat”, amelyet át kell ugrani (az alább ismertetett kompakt kódolással), és a `key` a következő DB-keresésre szolgál. + +Egy `level` (levél) csomópont esetében, amelyet a `encodedPath` első nibble-jében lévő flaggel jelölhetünk, az útvonal kódolja az összes korábbi csomópont útvonalrészletét, és közvetlenül megnézhetjük a `value` mezőt. + +Ez az optimalizálás azonban kétértelműséget eredményez. + +A nibble-ekben történő útvonalak bejárásakor előfordulhat, hogy páratlan számú nibble-t kell bejárnunk, de minden adat `bytes` formátumban van tárolva. Nem lehet különbséget tenni például az `1` és a `01` nibble között (mindkettőt `<01>`-ként kell tárolni). A páratlan hosszúság megadásához a részleges útvonal elé egy jelölőt (flag) kell illeszteni. + +### Specifikáció: Hexadecimális szekvencia kompakt kódolása opcionális befejezővel {#specification} + +Mind a _páratlan vs. páros fennmaradó részleges útvonalhossz_, mind a _levél vs. bővítmény csomópont_ jelölése a fent leírtak szerint bármely 2 elemű csomópont részleges útvonalának első nibble-jében található. Az eredmény így néz ki: + + hex char bits | node type partial path length + ---------------------------------------------------------- + 0 0000 | extension even + 1 0001 | extension odd + 2 0010 | terminating (leaf) even + 3 0011 | terminating (leaf) odd + +A páros fennmaradó útvonalhossz (`0` vagy `2`) esetén mindig egy `0` „kitöltő” nibble következik. + +``` + 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 now has an even length whose first nibble is the flags. + o = '' + for i in range(0,len(hexarray),2): + o += chr(16 * hexarray[i] + hexarray[i+1]) + return o +``` + +Példák: + +``` + > [ 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' +``` + +Ez a Merkle Patricia-fa egy csomópontjának megadásához szükséges bővített kód: + +``` + def get_helper(node,path): + if path == []: return node + if node = '': return '' + curnode = rlp.decode(node if len(node) < 32 else db.get(node)) + 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,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,path2) +``` + +### Példa fa {#example-trie} + +Tegyük fel, hogy egy olyan fát szeretnénk, amely négy út-érték párt tartalmaz `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coin')`, `('horse', 'stallion')`. + +Először az elérési utakat és az értékeket `bytes` formába alakítjuk át. Az alábbiakban a _útvonalak_ tényleges bájt ábrázolását `<>` jelöli, bár a _values_ a könnyebb érthetőség érdekében továbbra is stringként jelennek meg, `''` jelöléssel (ezek is `bytes` formában lennének): + +``` + <64 6f> : 'verb' + <64 6f 67> : 'puppy' + <64 6f 67 65> : 'coin' + <68 6f 72 73 65> : 'stallion' +``` + +Most létrehozunk egy ilyen fát a következő kulcs-érték párokkal a mögöttes adatbázisban: + +``` + rootHash: [ <16>, hashA ] + hashA: [ <>, <>, <>, <>, hashB, <>, <>, <>, [ <20 6f 72 73 65>, 'stallion' ], <>, <>, <>, <>, <>, <>, <>, <> ] + hashB: [ <00 6f>, hashD ] + hashD: [ <>, <>, <>, <>, <>, <>, hashE, <>, <>, <>, <>, <>, <>, <>, <>, <>, 'verb' ] + hashE: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coin' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ] +``` + +Amikor egy csomópontra egy másik csomóponton belül hivatkozunk, akkor a `H(rlp.encode(x))` szerepel, ahol `H(x) = keccak256(x) if len(x) >= 32 else x` és `rlp.encode` az [RLP](/developers/docs/data-structures-and-encoding/rlp) kódolási függvény. + +Vegyük észre, hogy egy fa frissítésekor a kulcs-érték párt `(keccak256(x), x)` egy állandó keresőtáblában kell tárolni _ha_ az újonnan létrehozott csomópont hossza >= 32. Ha a csomópont ennél rövidebb, nem kell tárolni, mivel az f(x) = x függvény megfordítható. + +## Fák az Ethereumban {#tries-in-ethereum} + +Az Ethereum végrehajtási rétegén minden Merkle-fa Merkle Patricia-fát használ. + +Egy blokk fejlécében 3 gyökér 3 fából származik. + +1. stateRoot (státuszgyökér) +2. transactionsRoot (tranzakciógyökér) +3. receiptsRoot (visszaigazolásgyökér) + +### Státuszfa {#state-trie} + +Egy globális státuszfa van, amely minden alkalommal frissül, amikor egy kliens feldolgoz egy blokkot. Ebben a `path` (útvonal) mindig: `keccak256(ethereumAddress)` és a `value` (érték) mindig: `rlp(ethereumAccount)`. Tehát egy Ethereum `account` (számla) az egy 4 elemű tömb a következőkkel: `[nonce,balance,storageRoot,codeHash]`. Ezen a ponton érdemes megjegyezni, hogy ez a `storageRoot` (tárolási fa) egy másik Patricia-fa gyökere: + +### Tárolási fa {#storage-trie} + +A tárolási fa az, ahol _minden_ szerződésadat tárolódik. Minden számlához külön tárolási fa van. Egy adott címen adott tárolási pozíción lévő értékek lekérdezéséhez szükség van a tárolási címre, a tárolt adat egész számú pozíciójára a tárolóban és a blokk azonosítójára. Ezek azután átadhatók a JSON-RPC API-ban definiált `eth_getStorageAt` paraméterként, például a 0 tárolóhelyén lévő adatok lekérdezéséhez erre a címre `0x295a70b2de5e3953354a6a8344e616ed314d7251`: + +``` +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"} + +``` + +A tároló egyéb elemeinek visszakeresése bonyolultabb, mivel először ki kell számítani a tárolási fában elfoglalt pozíciót. A pozíciót a cím és a tárolási pozíció `keccak256` hash-eként kell kiszámítani, mindkettőt balra nullákkal kitöltve 32 bájt hosszúságúra. Például az adatok pozíciója az 1-es tárolóhelyen erre a címre `0x391694e7e0b0cce554cb130d723a9d27458f9298`: + +``` +keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) +``` + +A Geth konzolban ez a következőképpen kalkulálható: + +``` +> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" +undefined +> web3.sha3(key, {"encoding": "hex"}) +"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" +``` + +A `path` (útvonal) ezért `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`. Ez már használható az adatok lekérdezésére a tároló fából: + +``` +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"} +``` + +Megjegyzés: A `storageRoot` az Ethereum számlára alapvetően üres, ha az nem egy szerződésszámla. + +### Tranzakciófa {#transaction-trie} + +Minden blokkhoz külön tranzakciós fa van, amely ismét `(key, value)` (kulcs, érték) párokat tárol. Az út: `rlp(transactionIndex)`, amely azt a kulcsot jelöli, amely megfelel egy értéknek, amelyet a következők határoznak meg: + +``` +if legacyTx: + value = rlp(tx) +else: + value = TxType | encode(tx) +``` + +Bővebb információt az [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) dokumentációban talál. + +### Visszaigazolásfa {#receipts-trie} + +Minden blokknak saját visszaigazolásfája van. A `path` (útvonal): `rlp(transactionIndex)`. A `transactionIndex` az indexe a kialakított blokkban. A visszaigazolásfát sosem frissítik. A tranzakciófához hasonlóan vannak jelenlegi és régi visszaigazolások. Egy adott visszaigazolás lekérdezéséhez visszaigazolásfából szükség van a blokkban lévő tranzakció indexére, a visszaigazoláscsomagra (payload) és a tranzakciótípusra. A visszaigazolás lehet `Receipt` típusú, amely a `TransactionType` és a `ReceiptPayload` összeadása, vagy lehet `LegacyReceipt` típusú, amely `rlp([status, cumulativeGasUsed, logsBloom, logs])` kódként van meghatározva. + +Bővebb információt az [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) dokumentációban talál. + +## További olvasnivaló {#further-reading} + +- [Módosított Merkle Patricia-fa — Hogyan menti az Ethereum a státuszt](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd) +- [Merkle-használat az Ethereumban](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/) +- [Az Ethereum-fa megértése](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) diff --git a/public/content/translations/hu/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/hu/developers/docs/data-structures-and-encoding/rlp/index.md new file mode 100644 index 00000000000..61e97c72306 --- /dev/null +++ b/public/content/translations/hu/developers/docs/data-structures-and-encoding/rlp/index.md @@ -0,0 +1,159 @@ +--- +title: Rekurzív hosszúságú prefix (RLP) sorosítás +description: Az RLP kódolás bemutatása az Ethereum végrahajtási rétegen. +lang: hu +sidebarDepth: 2 +--- + +A rekurzív hosszúságú prefixum (RLP) egy sorosítási módszer, melyet kiterjedten használnak az Ethereum végrehajtási rétegén. Az RLP a csomópontok közötti adatátvitelt szabványosítja helytakarékos formátumban. Az RLP célja a bináris adatok tetszőlegesen egymásba ágyazott tömbjeinek kódolása, és ez az elsődleges kódolási módszer, amelyet az Ethereum végrehajtási rétegén az objektumok sorosítására használnak. Az RLP célja a struktúra kódolása; bizonyos adattípusok (például sztring, float) kódolása a magasabb rendű protokollokra van bízva; de a pozitív RLP egész számokat nagy-endian bináris formában kell ábrázolni, vezető nullák nélkül (így a nulla integer ekvivalens az üres bájttömbbel). A vezető nullával rendelkező pozitív egész számok deszerializálása érvénytelen. A sztring hosszának egészértékű ábrázolását is így kell kódolni, csakúgy, mint a payloadban lévő egész számokat. + +További információkat talál [az Ethereum Sárgakönyvben (B függelék)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19). + +Ahhoz, hogy az RLP-vel kódoljunk egy szótárt, a két javasolt kanonikus forma a következő: + +- a `[[k1,v1],[k2,v2]...]` használjuk olyan kulcsokkal, melyek lexikográfiai sorrendben vannak +- a magasabb szintű Patricia-fa kódolást használjuk, mint az Ethereum + +## Definíció {#definition} + +Az RLP kódolási funkció egy elemet vesz fel. Az elem a következő lehet: + +- egy szting vagy karaktersorozat (bájttömb) az egy elem +- az elemek listája is egy elem + +Például a következők mindegyike elem: + +- egy üres sztring; +- egy sztring, amely a "cat" (macska) szót tartalmazza; +- egy lista, melyben bármennyi sztring található; +- és az ennél bonyolultabb adatstruktúrák, mint `["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"]`. + +Érdemes megjegyezni, hogy az oldal további részében a sztring kifejezés a „bináris adat bizonyos számú bájtját” jelenti; nem használunk speciális kódolást, és a sztringek tartalmát nem ismerjük. + +Az RPL kódolást a következő módon definiáljuk: + +- Egy bájt, amelynek értéke a `[0x00, 0x7f]` (decimális `[0, 127]`) tartományban van, annak RLP kódolása önmaga. +- Máskülöben, ha a sztring 0-55 bájt hosszú, az RLP-kódolás egyetlen **0x80** (decimál 128) értékű bájtból és a sztring hosszából áll, amelyet a sztring követ. Az első bájt tartománya tehát `[0x80, 0xb7]` (dec. `[128, 183]`). +- Ha a sztring több mint 55 bájt hosszú, az RLP-kódolás egyetlen bájtból áll, amelynek értéke **0xb7** (dec. 183), valamint a sztring hossza bájtokban kifejezve bináris formában, ezt követi a sztring hossza, majd a sztring. Például egy 1024 bájt hosszú sztring kódolása `\xb9\x04\x00` (dec. `185, 4, 0`), amelyet a sztring követ. Itt `0xb9` (183 + 2 = 185) az első bájt, majd az a 2 bájt `0x0400` (dec. 1024) jön, amely az aktuális sztring hosszát jelöli. Az első bájt tartománya tehát `[0xb8, 0xbf]` (dec. `[184, 191]`). +- Ha egy lista teljes payload-ja (azaz az összes RLP-kódolt elemének együttes hossza) 0-55 bájt hosszú, az RLP-kódolás egyetlen **0xc0** értékű bájtból és a payload hosszából áll, amelyet az elemek RLP-kódolásainak összekapcsolása követ. Az első bájt tartománya tehát `[0xc0, 0xf7]` (dec. `[192, 247]`). +- Ha egy lista teljes payload-ja több mint 55 bájt hosszú, az RLP-kódolás egyetlen **0xf7** értékű bájtból, valamint a payload hosszának bájtban kifejezett hosszából áll bináris formában, amelyet a payload hossza követ, majd az elemek RLP-kódolásainak összekapcsolása. Az első bájt tartománya tehát `[0xf8, 0xff]` (dec. `[248, 255]`). + +Ez kódban a következőképpen néz ki: + +```python +def rlp_encode(input): + if isinstance(input,str): + if len(input) == 1 and ord(input) < 0x80: + return input + return encode_length(len(input), 0x80) + input + elif isinstance(input, list): + output = '' + for item in input: + output += rlp_encode(item) + return encode_length(len(output), 0xc0) + output + +def encode_length(L, offset): + if L < 56: + return chr(L + offset) + elif L < 256**8: + BL = to_binary(L) + return chr(len(BL) + offset + 55) + BL + raise Exception("input too long") + +def to_binary(x): + if x == 0: + return '' + return to_binary(int(x / 256)) + chr(x % 256) +``` + +## Példák {#examples} + +- a sztring "dog" = [ 0x83, 'd', 'o', 'g' ] +- a lista [ "cat", "dog" ] = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` +- az üres sztring ('null') = `[ 0x80 ]` +- az üres lista = `[ 0xc0 ]` +- az integer 0 = `[ 0x80 ]` +- a kódolt integer 0 ('\\x00') = `[ 0x00 ]` +- a kódolt integer 15 ('\\x0f') = `[ 0x0f ]` +- a kódolt integer 1024 ('\\x04\\x00') = `[ 0x82, 0x04, 0x00 ]` +- a háromnak a [halmazelméleti ábrázolása](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers) `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` +- a sztring "Lorem ipsum dolor sit amet, consectetur adipisicing elit" = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... , 'e', 'l', 'i', 't' ]` + +## RLP dekódolás {#rlp-decoding} + +Az RLP kódolás szabályai és folyamata szerint az RLP dekódolás bemenete bináris adatok tömbjének tekinthető. Az RLP dekódolási folyamat a következő: + +1. a bemeneti adatok első bájtja (azaz előtagja) alapján dekódolja az adattípust, a tényleges adat hosszát és az eltolást; + +2. az adatok típusának és eltolásának megfelelően dekódolja az adatokat; + +3. folytatja a bemenet többi részének dekódolását; + +Ezek közül az adattípusok és az eltolás dekódolásának szabályai a következők: + +1. az adat egy sztring, ha az első bájt tartománya (az előtag) [0x00, 0x7f], és a sztring pontosan maga az első bájt; + +2. az adat egy sztring, ha az első bájt tartománya [0x80, 0xb7], és az első bájtot az a sztring követi, amelynek hossza egyenlő az első bájt mínusz 0x80; + +3. az adat egy sztring, ha az első bájt tartománya [0xb8, 0xbf], és a sztring hossza, amelynek hossza bájtokban egyenlő az első bájt mínusz 0xb7, követi az első bájtot, és a sztring követi a sztring hosszát; + +4. az adat egy lista, ha az első bájt tartománya [0xc0, 0xf7], és a lista minden olyan eleme RLP-kódolásának összekapcsolása, amelynek teljes payload-ja megegyezik az első bájttal mínusz 0xc0, az első bájtot követi; + +5. az adat egy lista, ha az első bájt tartománya [0xf8, 0xff], és a lista teljes payload-ja, amelynek hossza megegyezik az első bájttal mínusz 0xf7, követi az első bájtot, és a lista összes elemének RLP-kódolásának konkatenációja követi a lista teljes payload-ját; + +Ez kódban a következőképpen néz ki: + +```python +def rlp_decode(input): + if len(input) == 0: + return + output = '' + (offset, dataLen, type) = decode_length(input) + if type is str: + output = instantiate_str(substr(input, offset, dataLen)) + elif type is list: + output = instantiate_list(substr(input, offset, dataLen)) + output += rlp_decode(substr(input, offset + dataLen)) + return output + +def decode_length(input): + length = len(input) + if length == 0: + raise Exception("input is null") + prefix = ord(input[0]) + if prefix <= 0x7f: + return (0, 1, str) + elif prefix <= 0xb7 and length > prefix - 0x80: + strLen = prefix - 0x80 + return (1, strLen, str) + elif prefix <= 0xbf and length > prefix - 0xb7 and length > prefix - 0xb7 + to_integer(substr(input, 1, prefix - 0xb7)): + lenOfStrLen = prefix - 0xb7 + strLen = to_integer(substr(input, 1, lenOfStrLen)) + return (1 + lenOfStrLen, strLen, str) + elif prefix <= 0xf7 and length > prefix - 0xc0: + listLen = prefix - 0xc0; + return (1, listLen, list) + elif prefix <= 0xff and length > prefix - 0xf7 and length > prefix - 0xf7 + to_integer(substr(input, 1, prefix - 0xf7)): + lenOfListLen = prefix - 0xf7 + listLen = to_integer(substr(input, 1, lenOfListLen)) + return (1 + lenOfListLen, listLen, list) + raise Exception("input does not conform to RLP encoding form") + +def to_integer(b): + length = len(b) + if length == 0: + raise Exception("input is null") + elif length == 1: + return ord(b[0]) + return ord(substr(b, -1)) + to_integer(substr(b, 0, -1)) * 256 +``` + +## További olvasnivaló {#further-reading} + +- [RLP az Ethereumon](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) +- [Ethereum háttérműködése: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) +- [Coglio, A. (2020). Ethereum Rekurzív hosszúságú prefix (RLP) az ACL2-ben. arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) + +## Kapcsolódó témák {#related-topics} + +- [Patricia Merkle-fa](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) diff --git a/public/content/translations/hu/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/hu/developers/docs/data-structures-and-encoding/ssz/index.md new file mode 100644 index 00000000000..70f0154a5f9 --- /dev/null +++ b/public/content/translations/hu/developers/docs/data-structures-and-encoding/ssz/index.md @@ -0,0 +1,149 @@ +--- +title: Egyszerű sorosítás (SSZ) +description: Az Ethereum egyszerű sorosítási (SSZ) formátumának magyarázata. +lang: hu +sidebarDepth: 2 +--- + +Az **egyszerű sorosítás (SSZ)** a Beacon láncon használt sorosítási módszer. Ezt használják a konszenzusrétegben, a végrehajtási rétegben használt RLP sorosítás helyett, kivéve a társak megkeresésének protokolljánál. Az SSZ determinisztikus és hatékonyan Merkle-szerűsít. Az SSZ két komponensből áll: egy sorosítási sémából és egy Merkle-szerűsítő sémából, amelyet úgy terveztek, hogy hatékonyan dolgozzon a sorosított adatstruktúrával. + +## Hogyan működik az SSZ? {#how-does-ssz-work} + +### Sorosítás {#serialization} + +Az SSZ egy olyan sorosítási séma, amely nem önleíró – inkább egy sémára támaszkodik, amelyet előre ismerni kell. Az SSZ sorosítás célja, hogy tetszőleges összetettségű objektumokat bájtsorozatként ábrázoljon. Ez egy egyszerű folyamat az alaptípusokra. Az elemet egyszerűen hexadecimális bájtokká alakítja. Az alaptípusok a következők: + +- unsigned integerek +- Boolean-ek + +Az „összetett” típusok esetében a sorosítás bonyolultabb, mivel az összetett típus több elemet tartalmaz, amelyek különböző típusúak vagy különböző méretűek lehetnek, vagy mindkettő. Ha ezek az objektumok mind fix hosszúságúak (azaz az elemek mérete mindig állandó lesz, függetlenül a tényleges értékeiktől), akkor a sorosítás az összetett típus minden egyes elemének kis-endian bájtsztringekké történő átalakítása. Ezeket a bájtsztringeket összekapcsolják. A sorosított objektum a fix hosszúságú elemek bájtlista reprezentációját tartalmazza ugyanabban a sorrendben, ahogyan azok a deszerializált objektumban szerepelnek. + +A változó hosszúságú típusok esetében a tényleges adatok helyébe egy „eltolási” (offset) érték lép az adott elem pozíciójában a sorosított objektumban. A tényleges adatok egy halomba kerülnek a sorosított objektum végén. Az eltolási érték a halomban lévő tényleges adatok kezdetének indexe, amely a megfelelő bájtokra mutató mutatóként szolgál. + +Az alábbi példa azt szemlélteti, hogyan működik az eltolás fix és változó hosszúságú elemeket tartalmazó konténer esetében: + +```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) + +``` + +A `serialized` a következő szerkezetű lenne (itt 4 bitre van kitöltve, a valóságban 32 bitre van, és az áttekinthetőség kedvéért `int` ábrázolást használunk): + +``` +[37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4] +------------ ----------- ----------- ----------- ---------- + | | | | | + number1 number2 offset for number 3 value for + vector vector + +``` + +az áttekinthetőség érdekében sorokra osztva: + +``` +[ + 37, 0, 0, 0, # little-endian encoding of `number1`. + 55, 0, 0, 0, # little-endian encoding of `number2`. + 16, 0, 0, 0, # The "offset" that indicates where the value of `vector` starts (little-endian 16). + 22, 0, 0, 0, # little-endian encoding of `number3`. + 1, 2, 3, 4, # The actual values in `vector`. +] +``` + +Ez még mindig egyszerűsítés – a fenti ábrákon szereplő egész számok és nullák valójában bájtlistákként lennének tárolva, például így: + +``` +[ + 10100101000000000000000000000000 # little-endian encoding of `number1` + 10110111000000000000000000000000 # little-endian encoding of `number2`. + 10010000000000000000000000000000 # The "offset" that indicates where the value of `vector` starts (little-endian 16). + 10010110000000000000000000000000 # little-endian encoding of `number3`. + 10000001100000101000001110000100 # The actual value of the `bytes` field. +] +``` + +Így a változó hosszúságú típusok tényleges értékei egy halomban tárolódnak a sorosított objektum végén, a mezők rendezett listájában a megfelelő pozíciókban tárolt eltolási értékeikkel együtt. + +A speciális esetek különleges kezelést igényelnek, mint például a `BitList` típus, amelyhez a sorosítás során hosszkorlátot kell hozzáadni, majd a deszerializálás során eltávolítani azt. További részletek az [SSZ specifikációban](https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md) találhatók. + +### Deszerializáció {#deserialization} + +Az objektum deszerializációjához szükség van a sémára. A séma meghatározza a sorosított adatok pontos elrendezését, hogy minden egyes elemet egy bájtblob-ból valamilyen értelmes objektummá lehessen deszerializálni, amelynek elemei a megfelelő típusúak, értékűek, méretűek és pozíciójúak. A séma az, amely megmondja a deszerializátornak, hogy mely értékek ténylegesek, és melyek az eltolási értékek. Az objektum sorosításakor minden mezőnév eltűnik, de a séma szerinti deszerializáláskor újra létrejön. + +Tekintse meg az [ssz.dev](https://www.ssz.dev/overview) oldalt egy interakcít magyarázatért. + +## Merkle-szerűsítés {#merkleization} + +Ez az SSZ sorosított objektum ezután Merkle-szerűsíthető, azaz átalakítható ugyanazon adatok Merkle-fa reprezentációjává. Először meg kell határozni a 32 bájtos darabok számát a sorosított objektumban. Ezek a fa levelei. A levelek teljes számának 2 hatványának kell lennie, hogy a levelek összevonása végül egyetlen hash-fagyökeret eredményezzen. Ha ez magától nem így van, akkor további 32 bájtnyi nullát tartalmazó levelek kerülnek hozzáadásra. Ezt így ábrázolhatjuk: + +``` + hash tree root + / \ + / \ + / \ + / \ + hash of leaves hash of leaves + 1 and 2 3 and 4 + / \ / \ + / \ / \ + / \ / \ + leaf1 leaf2 leaf3 leaf4 +``` + +Vannak olyan esetek is, amikor a fa levelei nem egyenletesen oszlanak el, ahogy azt a fenti példa mutatja. A 4. levél például egy több elemet tartalmazó konténer lehet, amely további „mélységet” igényel a Merkle-fához, ami egy egyenetlen fát hoz létre. + +Ahelyett, hogy ezeket a faelemeket x. levélnek, x. csomópontnak stb. neveznénk, általános indexeket adhatunk nekik, kezdve a gyökérrel = 1 és balról jobbra számozva minden szinten. Ez a fentebb ismertetett általánosított index. A sorosított lista minden egyes elemének általános indexe `2**depth + idx`, ahol idx a nullával indexelt pozíciója a sorosított objektumban, a mélység (depth) pedig a Merkle-fa szintjeinek száma, amely az elemek (levelek) számának kettes bázisú logaritmusaként határozható meg. + +## Általánosított indexek {#generalized-indices} + +Az általánosított index egy egész szám, amely egy csomópontot jelöl egy bináris Merkle-fában, ahol minden csomópontnak van egy általánosított indexe `2 ** depth + index in row`. + +``` + 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... + +``` + +Ez az ábrázolás a Merkle-fa minden egyes adatához egy csomópontindexet ad. + +## Többszörös bizonyítékok {#multiproofs} + +Az általánosított indexek listájának megadása, mely egy adott elemet reprezentál, lehetővé teszi, hogy ellenőrizzük azt a hash-fa gyökerével szemben. Ez a gyökér az általunk elfogadott valóság. Bármelyik adatot ellenőrizhetjük ezzel a valósággal szemben, ha beillesztjük a Merkle-fa megfelelő helyére (amelyet az általánosított indexe határoz meg), és megfigyeljük, hogy a gyökér állandó marad-e. A [specifikációban](https://github.com/ethereum/consensus-specs/blob/dev/ssz/merkle-proofs.md#merkle-multiproofs) vannak olyan függvények, amelyek megmutatják, hogyan lehet kiszámítani a csomópontok minimális halmazát, amely egy adott általános indexkészlet tartalmának ellenőrzéséhez kell. + +Például az alábbi fa 9-es indexében lévő adatok ellenőrzéséhez szükségünk van a 8, 9, 5, 3, 1 indexben lévő adatok hash-ére. A (8,9) hash-nek meg kell egyeznie a (4) hash-sel, amely az 5-tel hash-elve a 2-t adja, amely a 3-mal hash-elve az 1-es fa gyökerét adja. Ha a 9-hez helytelen adatokat adnánk meg, a gyökér megváltozna – ezt észlelnénk, és nem tudnánk ellenőrizni az ágat. + +``` +* = data required to generate proof + + 1* + 2 3* + 4 5* 6 7 +8* 9* 10 11 12 13 14 15 + +``` + +## További olvasnivaló {#further-reading} + +- [Az Ethereum frissítése: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz) +- [Az Ethereum frissítése: Merkle-szerűsítés](https://eth2book.info/altair/part2/building_blocks/merkleization) +- [SSZ implementációk](https://github.com/ethereum/consensus-specs/issues/2138) +- [SSZ kalkulátor](https://simpleserialize.com/) +- [SSZ.dev](https://www.ssz.dev/) diff --git a/public/content/translations/hu/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md b/public/content/translations/hu/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md new file mode 100644 index 00000000000..3ee20c16c5f --- /dev/null +++ b/public/content/translations/hu/developers/docs/data-structures-and-encoding/web3-secret-storage-definition/index.md @@ -0,0 +1,189 @@ +--- +title: Web3 titkos tárhely meghatározása +description: A web3 titkos tárolás hivatalos definíciója +lang: hu +sidebarDepth: 2 +--- + +Ahhoz, hogy az Ön alkalmazása az Ethereumon működjön, használhatja a web3 objektumot, amit a web3.js könyvtár biztosít. A háttérben RPC híváson keresztül egy helyi csomóponttal kommunikál. A [web3](https://github.com/ethereum/web3.js/) bármelyik Ethereum csomóponttal működőképes, mely nyilvánossá tesz egy RPC réteget. + +A `web3` az `eth` objektumot tartalmazza: 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) keyfile + * [ 'ethersale', undefined ] Ethersale keyfile + * null invalid keyfile + */ +``` + +Ez a dokumentum a web3 titkos tárolási definíciójának **3. verzióját** dokumentálja. + +## Definíció {#definition} + +A fájl tényleges kódolása és dekódolása nagyrészt változatlan marad az 1. verzióhoz képest, kivéve, hogy a titkosítási algoritmus már nem AES-128-CBC-hez van kötve (az AES-128-CTR a minimális követelmény). A legtöbb jelentés és algoritmus hasonló az 1. verzióhoz, kivéve a `mac`, amely a származtatott kulcs bal szélső második 16 bájtjának és a teljes `ciphertextnek` a SHA3 (keccak-256) kombinációjaként van megadva. + +A titkos kulcsfájlok közvetlenül a `~/.web3/keystore` (Unix-szerű rendszerekre) és a `~/AppData/Web3/keystore` (Windows esetén) mappákban vannak tárolva. A nevük bármi lehet, de egy jó elnevezési logika a `.json`, ahol `` a titkos kulcshoz adott 128 bites UUID (a titkos kulcs címének adatvédelmet biztosító proxy). + +Minden ilyen fájlhoz tartozik egy jelszó. Egy adott `.json` fájl titkos kulcsának létrehozásához először a fájl titkosítási kulcsát kell létrehozni; ez úgy történik, hogy a fájl jelszavát fogjuk és átadjuk a `kdf` kulcs által megadott kulcskészítő függvénynek. A KDF-től függő statikus és dinamikus paraméterek a `kdfparams` kulcsban vannak leírva. + +A PBKDF2-t minden minimálisan megfelelő implementációnak támogatnia kell az alábbi módon: + +- `kdf`: `pbkdf2` + +A PBKDF2-höz a kdfparams tartalmazza: + +- `prf`: `hmac-sha256` kell legyen (talán a jövőben ki lesz terjesztve); +- `c`: iterációk száma; +- `salt`: a PBKDF-nek átadott salt; +- `dklen`: a létrehozott kulcs hossza. Muszáj, hogy >= 32 legyen. + +Miután a fájl kulcsát létrehoztuk, azt a MAC származtatásával kell ellenőrizni. A MAC-et a származtatott kulcs bal szélső második 16 bájtjának és a `ciphertext` kulcs tartalmának összekapcsolásából képzett bájttömb SHA3 (keccak-256) hash-eként kell kiszámítani: + +```js +KECCAK(DK[16..31] ++ ) +``` + +(ahol a `++` az összeadási művelet) + +Ezt az értéket össze kell hasonlítani a `mac` kulcs tartalmával; ha eltérnek, alternatív jelszót kell kérni (vagy a műveletet törölni). + +A fájl kulcsának ellenőrzése után a titkosított szöveg (a fájlban szereplő `ciphertext` kulcs) visszafejthető a `cipher` kulcs által meghatározott és a `cipherparams` kulcson keresztül paraméterezett szimmetrikus titkosítási algoritmus segítségével. Ha a származtatott kulcs mérete és az algoritmus kulcsmérete nem egyezik, akkor a származtatott kulcs nullával kitöltött, jobb szélső bájtjait kell használni az algoritmus kulcsaként. + +Minden minimálisan megfelelő implementációnak támogatnia kell az AES-128-CTR algoritmust, amelyet a következőkkel jelölnek: + +- `cipher: aes-128-ctr` + +Ez a titkosító a következő paramétereket veszi fel, amelyeket a cipherparams kulcshoz adott kulcsként kell megadni: + +- `iv`: 128 bites inicializálási vektor a titkosításhoz. + +A titkosítás kulcsa a származtatott kulcs bal szélső 16 bájtja, azaz `DK[0..15]` + +A titkos kulcs létrehozása vagy titkosítása lényegében ezen utasítások fordítottja. Győződjön meg róla, hogy a `uuid`, `salt` és `iv` valóban véletlenszerű. + +A `version` mezőn kívül, amelynek a verzió „kemény” azonosítójaként kell működnie, a megvalósítások használhatják a `minorversion` mezőt is a formátum kisebb, nem megszakított változásainak követésére. + +## Tesztvektorok {#test-vectors} + +Részletek: + +- `Address`: `008aeeda4d805471df9b2a5b0f38a0c3bcba786b` +- `ICAP`: `XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67` +- `UUID`: `3198bc9c-6672-5ab3-d9954942343ae5b6` +- `Password`: `testpassword` +- `Secret`: `7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d` + +### PBKDF2-SHA-256 {#PBKDF2-SHA-256} + +A tesztvektor `AES-128-CTR` és `PBKDF2-SHA-256` kódot használ: + +A `~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json` fájltartalma: + +```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 +} +``` + +**Köztes értékek**: + +`Derived key`: `f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551` `MAC Body`: `e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46` `MAC`: `517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2` `Cipher key`: `f06d69cdc7da0faffb1008270bca38f5` + +### Scrypt {#scrypt} + +A tesztvektor AES-128-CTR és Scrypt-et használ: + +```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 +} +``` + +**Köztes értékek**: + +`Derived key`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` `MAC Body`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` `MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` `Cipher key`: `7446f59ecc301d2d79bc3302650d8a5c` + +## Módosítások az 1. változathoz képest {#alterations-from-v2} + +Ez a verzió számos inkonzisztenciát javított ki az [itt](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst) publikált 1. verzióhoz képest. Ezek röviden: + +- A nagybetűs írásmód indokolatlan és következetlen (scrypt kisbetűs, Kdf vegyes, MAC nagybetűs). +- A cím felesleges és veszélyezteti az adatvédelmet. +- `Salt` eredendően a kulcslétrehozási függvény paramétere, és ahhoz kell hozzárendelni, nem pedig általában a kriptográfiához. +- _SaltLen_ fölösleges (a Salt-ból le lehet vezetni). +- A kulcslétrehozási függvény adott, de a titkosítási algoritmus nehezen meghatározott. +- `Version` eredendően numerikus, mégis egy sztring (a strukturált verziókezelés lehetséges lenne egy sztringgel, de egy ritkán változó konfigurációs fájlformátum esetében ez nem releváns). +- `KDF` és `cipher` fogalmilag testvérek, mégis másképp szerveződnek. +- `MAC` egy szóköz agnosztikus adatdarabon keresztül kerül kiszámításra(!) + +A formátumot úgy változtattuk meg, hogy a következő fájlt kapjuk, amely funkcionálisan megegyezik a korábban hivatkozott oldal példájával: + +```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 +} +``` + +## Módosítások az 2. változathoz képest {#alterations-from-v2} + +A 2. verzió egy korai C++ implementáció volt számos hibával. Minden lényeges dolog változatlan maradt. diff --git a/public/content/translations/hu/developers/docs/networking-layer/index.md b/public/content/translations/hu/developers/docs/networking-layer/index.md new file mode 100644 index 00000000000..6d2516a9b41 --- /dev/null +++ b/public/content/translations/hu/developers/docs/networking-layer/index.md @@ -0,0 +1,155 @@ +--- +title: Hálózati réteg +description: Bevezetés az Ethereum hálózati rétegébe. +lang: hu +sidebarDepth: 2 +--- + +Az Ethereum egy peer-to-peer hálózat több ezer csomóponttal, amelyeknek szabványosított protokollokkal kommunikálnak egymással. A hálózati réteg azon protokollok halmaza, amelyek lehetővé teszik, hogy ezek a csomópontok megtalálják egymást és információt cseréljenek. Ez magában foglalja az információk pletykálását (egy a sokhoz kommunikáció) a hálózaton keresztül, valamint a kérések és válaszok cseréjét bizonyos csomópontok között (egy az egyhez kommunikáció). Minden csomópontnak be kell tartania bizonyos hálózati szabályokat, hogy biztosítsa a megfelelő információk küldését és fogadását. + +A kliensszoftver két részből áll (végrehajtási és konszenzuskliensek), mindegyiknek különálló hálózati stackje van. A többi Ethereum-csomóponttal való kommunikáció mellett a végrehajtási és konszenzusklienseknek egymással is kommunikálniuk kell. Ez az oldal magyarázatot ad a kommunikációs protokollokról. + +A végrehajtási kliensek tranzakciókat pletykálnak a végrehajtási réteg peer-to-peer hálózatán. Ehhez titkosított kommunikáció szükséges a hitelesített társak között. Amikor egy validátort kiválasztanak blokkelőterjesztésre, a csomópont helyi tranzakciógyűjtőjéből tranzakciókat ad át a konszenzuskliensnek egy helyi RPC kapcsolaton, melyeket Beacon blokkokba csomagol. A konszenzuskliensek ezután pletykálnak a Beacon blokkokról a saját p2p hálózatukon. Ehhez két elkülönített p2p hálózat kell: az egyik összeköti a végrehajtási klienseket a tranzakciópletykával, a másik a konszenzusklienseket a blokkpletykával. + +## Előfeltételek {#prerequisites} + +E téma könnyebb megértéséhez tekintse meg az Ethereum [csomópontok és kliensek](/developers/docs/nodes-and-clients/) témáját. + +## A végrehajtási réteg {#execution-layer} + +A végrehajtási réteg hálózati protokolljai két részre oszlanak: + +- a felfedező stack: az UDP portra épül, és lehetővé teszi, hogy egy új csomópont megtalálja a társait, amelyekhez csatlakozhat + +- a DevP2P stack: a TCP port tetején helyezkedik el, és lehetővé teszi a csomópontok számára az információcserét + +A stackek párhuzamosan működnek. A felfedező stack új résztvevőket hoz a hálózatba, a DevP2P pedig lehetővé teszi ezek interakcióit. + +### Felfedezés {#discovery} + +A felfedezés a hálózatban lévő más csomópontok megtalálásának folyamata. Ez egy kis számú beöltő csomópont (bootnode) segítségével történik (amelyek címe [be van kódolva](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) a kliensbe, hogy azonnal megtalálhatók legyenek, és összekapcsolják a klienst a társaival). Ezek a betöltő csomópontok azért léteznek, hogy egy új csomópontot bemutassanak a társaiknak – nincs más céljuk, nem vesznek részt a normál kliensfeladatokban, például a lánc szinkronizálásában, és csak a kliens legelső indításakor használják őket. + +A betöltőcsomópont-csomópont interakció protokollja a [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f) egy módosított formája, amely egy [elosztott hash táblát](https://en.wikipedia.org/wiki/Distributed_hash_table) használ a csomópontlista megosztására. Minden csomópont rendelkezik ezzel a táblával, hogy a szükséges információk birtokában legyen, amikor a legközelebbi társaihoz csatlakozik. A közelség nem földrajzi, hanem a csomópont azonosítójának hasonlósága határozza meg. A csomópontoknál lévő táblázat biztonsági okokból rendszeresen frissül. Például a [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) felfedezőprotokoll csomópontjai képesek „hirdetéseket” is küldeni, amelyek megjelenítik a kliens által támogatott alprotokollokat, lehetővé téve a társak számára, hogy tárgyaljanak a protokollokról, amelyeken keresztül mindketten kommunikálni tudnak. + +A felfedezés egy ping-pong-játékkal kezdődik. Egy sikeres ping-pong „köti” az új csomópontot egy betöltő csomóponthoz. A kezdeti üzenet, amely a betöltő csomópontot figyelmezteti a hálózatba belépő új csomópont létezésére, egy `PING`. Ez a `PING` hashelt információkat tartalmaz az új csomópontra, a betöltő csomópontra és a lejárati időre vonatkozóan. A betöltő csomópont fogadja a `PING`-et, és visszaküld egy `PONG`-ot, amely tartalmazza a `PING` hash-t. Ha a `PING` és `PONG` hashek egyeznek, akkor az új csomópont és a betöltő csomópont közötti kapcsolat le van ellenőrizve, és „összekapcsolódtak”. + +Miután összekapcsolódott, az új csomópont küldhet egy `FIND-NEIGHBOURS` kérést a betöltő csomópontnak. A betöltő csomópont által visszaküldött adatok tartalmazzák azoknak a partnereknek a listáját, amelyekhez az új csomópont csatlakozhat. Ha a csomópontok nincsenek összekötve, a `FIND-NEIGHBOURS` kérés sikertelen lesz, így az új csomópont nem tud belépni a hálózatba. + +Amint az új csomópont megkapja a betöltő csomóponttól a szomszédok listáját, mindegyikükkel PING-PONG cserét kezd. A sikeres PING-PONG-ok összekötik az új csomópontot a szomszédjaival, lehetővé téve az üzenetváltást. + +``` +start client --> connect to bootnode --> bond to bootnode --> find neighbours --> bond to neighbours +``` + +A végrehajtási kliensek jelenleg a [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) felfedezőprotokollt használják, és aktív erőfeszítéseket tesznek a [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) protokollra való áttérésre. + +#### ENR: Ethereum csomópontfeljegyzés {#enr} + +A [Ethereum csomópontfeljegyzés (ENR)](/developers/docs/networking-layer/network-addresses/) egy objektum, amely három alapvető elemet tartalmaz: egy aláírást (a rekord tartalmának egy elfogadott azonosítási séma szerinti hash-e), egy sorszámot, amely a rekord változását követi, és kulcs-érték párok tetszőleges listáját. Ez egy jövőbiztos formátum, amellyel az azonosító információk könnyebben cserélhetők az új társak között, és ez az Ethereum-csomópontok preferált [hálózati cím](/developers/docs/networking-layer/network-addresses) formátuma. + +#### Miért épül a felfedezés az UDP-re? {#why-udp} + +Az UDP nem támogatja a hibaellenőrzést, a sikertelen csomagok újraküldését vagy a kapcsolatok dinamikus megnyitását és lezárását – ehelyett egy folyamatos információáramlást küld a célpontnak, függetlenül attól, hogy sikeresen fogadja-e azt. Ez a minimális funkcionalitás minimális költséget is jelent, így ez a kapcsolat nagyon gyors. A felfedezéshez, amikor egy csomópont egyszerűen csak jelezni akarja jelenlétét, hogy aztán hivatalos kapcsolatot létesítsen egy társsal, elegendő az UDP. A hálózati stack többi része számára azonban az UDP nem felel meg a célnak. A csomópontok közötti információcsere meglehetősen összetett, ezért egy teljesebb funkciójú protokollra van szükség, amely támogatja az újraküldést, a hibaellenőrzést stb. A TCP-hez kapcsolódó többletköltség megéri a többletfunkciókat. Ezért a P2P stack nagy része TCP-n keresztül működik. + +### DevP2P {#devp2p} + +A DevP2P a protokollok egész halmaza, amelyet az Ethereum a peer-to-peer hálózat létrehozásához és fenntartásához implementál. Miután az új csomópontok belépnek a hálózatba, interakcióikat a [DevP2P](https://github.com/ethereum/devp2p) stack protokolljai szabályozzák. Ezek mind a TCP-re épülnek, és magukban foglalják az RLPx transzport protokollt, a vezetékes protokollt és számos alprotokollt. [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) a csomópontok közötti munkamenetek kezdeményezését, hitelesítését és fenntartását szabályozó protokoll. Az RLPx az RLP (Rekurzív hosszúságú prefixum) segítségével kódolja az üzeneteket, ami egy helytakarékos módszer az adatok minimális struktúrába történő kódolására, hogy azokat a csomópontok közötti küldhessék. + +A két csomópont közötti RLPx kapcsolódás egy kezdeti kriptográfiai kézfogással kezdődik. Ennek során a csomópont hitelesítő üzenetet küld, amelyet a társ ellenőriz. Sikeres ellenőrzés esetén a társ egy hitelesítést igazoló üzenetet generál, amelyet visszaküld a kezdeményezőnek. Ez egy kulcscsere-folyamat, amely lehetővé teszi a csomópontok számára a privát és biztonságos kommunikációt. A sikeres kriptográfiai kézfogás után mindkét csomópont „hello” üzenetet küld egymásnak „a vezetéken”. A vezetékes protokollt a hello üzenetek sikeres cseréje indítja el. + +A helló üzenetek a következőt tartalmazzák: + +- protokoll verziója +- kliens ID +- port +- csomópont ID +- a támogatott alprotokollok listája + +Ez a sikeres interakcióhoz szükséges információ, mivel meghatározza, hogy a két csomópont milyen képességeket oszt meg egymással, és konfigurálja a kommunikációt. Létezik egy alprotokoll-tárgyalási folyamat, amelynek során az egyes csomópontok által támogatott alprotokollok listáját összehasonlítják, és a két csomópont számára közös alprotokollok használhatók a kapcsolódásban. + +A hello üzenetek mellett a vezetékes protokoll „szétkapcsolási” üzenetet is küldhet, amely figyelmeztetést ad a társnak, hogy a kapcsolat lezárul. A vezetékes protokoll PING és PONG üzeneteket is tartalmaz, amelyeket időszakosan küld a munkamenet nyitva tartása érdekében. Az RLPx és a vezetékes protokollok cseréje tehát megteremti a csomópontok közötti kommunikáció alapjait, és biztosítja a hasznos információk cseréjének keretét egy adott alprotokoll szerint. + +### Alprotokollok {#sub-protocols} + +#### Vezetékes protokoll {#wire-protocol} + +Miután a partnerek csatlakoztak, és az RLPx kapcsolódás elindult, a vezetékes protokoll határozza meg, hogy a partnerek hogyan kommunikálnak egymással. Kezdetben a vezetékes protokoll három fő feladatot határozott meg: a láncszinkronizációt, a blokkelőterjesztést és a tranzakciók cseréjét. Miután azonban az Ethereum átállt a proof-of-stake-re, a blokkelőterjesztés és a láncszinkronizáció a konszenzusréteg részévé vált. A tranzakciók cseréje továbbra is a végrehajtási kliensek hatáskörébe tartozik. A tranzakciók cseréje a függőben lévő tranzakciók csomópontok közötti cseréjére utal, hogy a bányászok kiválaszthassanak közülük néhányat a következő blokkba. Bővebb információk [itt](https://github.com/ethereum/devp2p/blob/master/caps/eth.md) érhetők el ezekről a feladatokról. Az ezeket az alprotokollokat támogató kliensek a [JSON-RPC](/developers/docs/apis/json-rpc/) segítségével teszik közzé azokat. + +#### Les (könnyű Ethereum alprotokoll) {#les} + +Ez egy minimális protokoll a könnyű kliensek szinkronizálásához. Ezt a protokollt ritkán használják, mivel a teljes csomópontoknak ösztönzés nélkül kell adatokat szolgáltatniuk a könnyű klienseknek. A végrehajtási kliensek alapértelmezett viselkedése az, hogy nem szolgálják ki a könnyű klienseket a Les-en keresztül. Bővebb információ található a Les [specifikációban](https://github.com/ethereum/devp2p/blob/master/caps/les.md). + +#### Snap {#snap} + +A [snap protokoll](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) egy opcionális kiterjesztés, amely lehetővé teszi, hogy a társak pillanatfelvételeket cseréljenek a legutóbbi státuszokról, így anélkül ellenőrizhetik a számla- és tárolási adatokat, hogy közbenső Merkle-fa csomópontokat kellene letölteniük. + +#### Wit (tanúprotokoll) {#wit} + +A [tanúprotokoll](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) egy opcionális kiterjesztés, amely lehetővé teszi a státusztanúk cseréjét a társak között, hogy a kliensek szinkronizálva legyenek a lánc elejéhez. + +#### Whisper {#whisper} + +A Whisper egy olyan protokoll, amelynek célja a biztonságos üzenetváltás biztosítsa a társak között anélkül, hogy bármilyen információt írna a blokkláncra. A DevP2P vezetékes protokoll része volt, de már elavult. Más [kapcsolódó projektek](https://wakunetwork.com/) is léteznek hasonló célokkal. + +## A konszenzusréteg {#consensus-layer} + +A konszenzuskliensek egy különálló, eltérő specifikációjú peer-to-peer hálózatban vesznek részt. A konszenzuskliensek részt kell venniük a blokkpletykában, hogy új blokkokat kaphassanak a társaiktól, és továbbíthassák azokat, amikor rájuk kerül a sor, hogy blokkot javasoljanak. A végrehajtási réteghez hasonlóan ehhez is először egy felfedező protokollra van szükség, hogy a csomópont megtalálja a társait, és biztonságos kapcsolódásokat hozzon létre a blokkok, igazolások stb. cseréjéhez. + +### Felfedezés {#consensus-discovery} + +A végrehajtási kliensekhez hasonlóan a konszenzuskliensek is [discv5](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-discovery-domain-discv5)-öt használnak UDP-n keresztül a társak megkereséséhez. A discv5 konszenzusréteg implementációja csak annyiban különbözik a végrehajtási kliensekétől, hogy tartalmaz egy illesztőt, amely a discv5-öt egy [libP2P](https://libp2p.io/) stackbe kapcsolja, elavulttá téve ezzel a DevP2P-t. A végrehajtási réteg RLPx kapcsolódásait elhagyták a libP2P zajmentes csatornáján való kézfogásért. + +### ENR-ek {#consensus-enr} + +A konszenzus csomópontok ENR-je tartalmazza a csomópont nyilvános kulcsát, IP-címét, UDP- és TCP-portjait, valamint két konszenzusspecifikus mezőt: a tanúsítást végező alhálózat bitmezőjét és az `eth2` kulcsot. Az előbbi megkönnyíti a csomópontok számára, hogy megtalálják az adott tanúsítási pletyka alhálózatokban részt vevő társaikat. Az `eth2` kulcs információt tartalmaz arról, hogy a csomópont melyik Ethereum elágazási (fork) verziót használja, így biztosítva, hogy a társak a megfelelő Ethereumhoz kapcsolódjanak. + +### libP2P {#libp2p} + +A libP2P stack a felfedezés után minden kommunikációt támogat. A kliensek tárcsázhatnak és hallgathatják az IPv4 és/vagy IPv6 protokollt az ENR-ben meghatározottak szerint. A libP2P réteg protokolljai feloszthatók a pletyka és a kérés/válasz (req/resp) domainekre. + +### Pletyka {#gossip} + +A pletyka domainbe tartozik minden információ, amelynek gyorsan kell terjednie a hálózaton. Ezek a Beacon-blokkok, bizonyítékok, tanúsítások, kilépések és kizárások. Ezt a libP2P gossipsub v1 segítségével továbbítják, ami a csomópontokon helyileg tárolt metaadatokra támaszkodik, beleértve a fogadható és továbbítandó pletykacsomagok maximális méretét. A pletyka domain további információt megtalálja [itt](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub). + +### Kérés-válasz {#request-response} + +A kérés-válasz domain olyan protokollokat tartalmaz, amelyekkel a kliensek konkrét információkat kérhetnek a társaiktól. Például bizonyos Beacon blokkok lekérése, melyek bizonyos gyökér-hash-eknek megfelelnek vagy egy slot-tartományba esnek. A válaszok mindig snappy-tömörített SSZ-kódolt bájtként érkeznek vissza. + +## Miért részesíti előnyben a konszenzuskliens az SSZ-t az RLP-vel szemben? {#ssz-vs-rlp} + +Az SSZ jelentése egyszerű sorosítás. Fix offseteket használ, amelyek megkönnyítik a kódolt üzenet egyes részeinek dekódolását anélkül, hogy a teljes struktúrát dekódolni kellene, ami hasznos a konszenzuskliens számára, mivel hatékonyan ki tudja venni a kódolt üzenetekből az információrészeket. Kifejezetten a Merkle protokollokkal való integrációra is tervezték, ami a Merkle-szerűsítés hatékonyságának növelésével jár. Mivel a konszenzusrétegben minden hash Merkle-gyök, ez jelentős javulást jelent. Az SSZ garantálja az értékek egyedi ábrázolását is. + +## A végrehajtási és konszenzuskliensek kapcsolódása {#connecting-clients} + +A konszenzus- és végrehajtási kliensek párhuzamosan futnak. Össze kell kapcsolódniuk, hogy a konszenzuskliens utasításokat adhasson a végrehajtási kliensnek, a végrehajtási kliens pedig tranzakciókötegeket adhasson át a konszenzus kliensnek, hogy azok bekerülhessenek a Beacon blokkokba. A két kliens közötti kommunikáció helyi RPC-kapcsolat segítségével valósítható meg. Egy [Engine-API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) néven ismert API határozza meg a két kliens között küldött utasításokat. Mivel mindkét kliens egyetlen hálózati identitás mögött helyezkedik el, megosztanak egy ENR-t (Ethereum csomópontfeljegyzés), amely mindkét kliens számára külön kulcsot tartalmaz (eth1 és eth2 kulcs). + +A kontrollfolyamat összefoglalása az alábbiakban látható, zárójelben a vonatkozó hálózati stackkel. + +##### Amikor a konszenzuskliens nem terjeszt elő blokkot: + +- A konszenzuskliens blokkot kap a blokkpletyka-protokollon keresztül (konszenzus p2p) +- A konszenzuskliens előzetesen validálja a blokkot, azaz biztosítja, hogy az érvényes feladótól érkezett, helyes metaadatokkal +- A blokkban lévő tranzakciókat a végrehajtási rétegnek küldik el végrehajtási csomagként (helyi RPC-kapcsolat) +- A végrehajtási réteg végrehajtja a tranzakciókat és ellenőrzi a blokkfejlécben lévő státuszt (azaz a hash-ek egyezését) +- A végrehajtási réteg visszaadja a validációs adatokat a konszenzus rétegnek, a blokk validáltnak tekinthető (helyi RPC kapcsolat) +- A konszenzus réteg hozzáadja a blokkot a saját blokkláncának fejéhez és tanúsítja azt, a tanúsítást a hálózaton keresztül küldi szét (konszenzus p2p) + +##### Amikor a konszenzuskliens blokkot terjeszt elő: + +- A konszenzuskliens értesítést kap arról, hogy ő a következő blokkelőterjesztő (konszenzus p2p) +- A konszenzusréteg meghívja a `blokk létrehozása` metódust a végrehajtási kliensben (helyi RPC) +- A végrehajtási réteg hozzáfér a tranzakciógyűjtőhöz (mempool), amelyet a tranzakciós pletykaprotokoll töltött fel (végrehajtási p2p) +- A végrehajtási kliens a tranzakciókat egy blokkba foglalja, végrehajtja a tranzakciókat és létrehoz egy blokk hash-t +- A konszenzuskliens átveszi a tranzakciókat és a blokk hash-t a végrehajtási klienstől, és hozzáadja azokat a Beacon-blokkhoz (helyi RPC) +- A konszenzuskliens a blokkot a blokkpletyka-protokollon keresztül továbbítja (konszenzus p2p) +- A többi kliens megkapja a javasolt blokkot a blokkpletyka-protokollon keresztül, és a fent leírtak szerint validálja (konszenzus p2p) + +Amint a blokkot elegendő validátor tanusította, a lánc fejéhez adják, igazolják és végül véglegesítik. + +![](cons_client_net_layer.png) ![](exe_client_net_layer.png) + +A hálózati réteg sémája a konszenzus- és végrehajtási kliensek számára, az [ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248) honlapról + +## További olvasnivaló {#further-reading} + +[DevP2P](https://github.com/ethereum/devp2p) [LibP2p](https://github.com/libp2p/specs) [Konszenzusréteg hálózati specifikáció](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) [Kademlia to discv5](https://vac.dev/kademlia-to-discv5) [Kademlia leírás](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) [Bevezetés az Ethereum p2p-be](https://p2p.paris/en/talks/intro-ethereum-networking/) [Eth1 és eth2 kapcsolata](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) [Merge és eth2 kliensrészletekről szóló videó](https://www.youtube.com/watch?v=zNIrIninMgg) diff --git a/public/content/translations/hu/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/hu/developers/docs/networking-layer/network-addresses/index.md new file mode 100644 index 00000000000..19be6166824 --- /dev/null +++ b/public/content/translations/hu/developers/docs/networking-layer/network-addresses/index.md @@ -0,0 +1,38 @@ +--- +title: Hálózati címek +description: Bevezetés a hálózati címekbe. +lang: hu +sidebarDepth: 2 +--- + +Az Ethereum csomópontoknak azonosítaniuk kell magukat néhány alapvető információval, hogy a társaikhoz tudjanak kapcsolódni. Annak érdekében, hogy a lehetséges társak értelmezni tudják ezeket az információkat, három szabványosított formátumban továbbítják, amelyeket bármely Ethereum-csomópont megérthet: multiaddr, enode vagy Ethereum Node Records (ENRs). Az ENRs az Ethereum hálózati címek jelenlegi szabványa. + +## Előfeltételek {#prerequisites} + +A jelen téma könnyebb megértéséhez érdemes megtekinteni az Ethereum [hálózati rétegéről](/developers/docs/networking-layer/) szóló oldalt. + +## Multiaddr {#multiaddr} + +Az eredeti Ethereum csomópontcím formátuma a multiaddr (a multi-addresses rövidítése) volt. A multiaddr egy egyetemes formátum a peer-to-peer hálózatokhoz. A címek kulcs-érték párokként jelennek meg, a kulcsok és az értékek perjellel vannak elválasztva. Például a multiaddr értéke a `192.168.22.27` IPv4-címmel rendelkező csomópontnak, ami a `33000` TCP-portot figyeli: + +`/ip4/192.168.22.27/tcp/33000` + +Az Ethereum csomópont esetében a multiaddr tartalmazza a csomópont azonosítót (a nyilvános kulcs hash-e): + +`/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br` + +## Enode {#enode} + +Az enode az Ethereum-csomópontok azonosítására szolgál egy URL-címformátum segítségével. A hexadecimális csomópont-ID az URL felhasználónevet tartalmazó részében van kódolva, a hoszttól @ jellel elválasztva. A hosztnév csak IP-címként adható meg; DNS nevek nem engedélyezettek. A hosztnév szakaszban szereplő port a TCP figyelő port. Ha a TCP és UDP (felfedező) portok különböznek, az UDP portot a „discport” lekérdezési paraméterként kell megadni. + +A következő példában a csomópont URL-címe egy olyan csomópontot ír le, amelynek IP-címe `10.3.58.6`, TCP-portja `30303` és UDP felfedezőportja `30301`. + +`enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301` + +## Ethereum Node Records (ENRs) {#enr} + +Az Ethereum Node Records (ENR) a hálózati címek szabványosított formátuma az Ethereumon. Ez váltotta fel a multiaddr és az enode használatát. Ezek különösen hasznosak, mert nagyobb információcserét tesznek lehetővé a csomópontok között. Az ENR tartalmaz egy aláírást, egy sorszámot és olyan mezőket, melyek az aláírások létrehozására és érvényesítésére használt azonosítási rendszert részletezik. Az ENR tetszőleges, kulcs-érték párokba rendezett adatokkal is feltölthető. Ezek a kulcs-érték párok tartalmazzák a csomópont IP-címét és a csomópont által használható alprotokollokra vonatkozó információkat. A konszenzus kliensek egy [specifikus ENR struktúrát](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) használnak a betöltőcsomópontok (bootnode) azonosítására, és tartalmaznak egy `eth2` mezőt is, amely az aktuális Ethereum elágazásról és a tanúsításpletyka alhálózatról tartalmaz információt (ez köti a csomópontot a társak egy adott csoportjához, akiknek tanúsításait aggregálják). + +## További olvasnivaló {#further-reading} + +[EIP-778: Ethereum Node Records (ENR)](https://eips.ethereum.org/EIPS/eip-778) [Hálózati címek az Ethereumban](https://dean.eigenmann.me/blog/2020/01/21/network-addresses-in-ethereum/) [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/) diff --git a/public/content/translations/hu/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/hu/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..a057cbc6177 --- /dev/null +++ b/public/content/translations/hu/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,82 @@ +--- +title: Portal Network +description: Áttekintés a Portal Network-ről, egy fejlesztés alatt álló hálózatról, mely a kevés forrással bíró klienseket támogatja. +lang: hu +--- + +Az Ethereum egy számítógépekből álló hálózat, melyek az Ethereum kliensszoftvert futtatják. Minden ilyen számítógépet csomópontnak neveznek. A kliensszoftver lehetővé teszi, hogy a csomópont adatot tudjon küldeni és fogadni az Ethereum hálózaton, s hozzá tudja ellenőrizni az adatokat az Ethereum protokollszabályokhoz. A csomópontok rengeteg historikus adatot tárolnak a merevlemezen, s az új információs csomagokat, vagyis blokkokat hozzáadják ezekhez, melyeket a hálózat többi csomópontjától kapnak. Ez azért szükséges, hogy ellenőrizhető legyen, egy csomópont a hálózat többi részével konzisztens információkat tartalmaz. Tehát a csomópontok üzemeltetéséhez sok tárhelyre van szükség. Néhány csomópont működés sok RAM-ot is igényel emellett. + +A tárhely probléma megoldására fejlesztettek könnyű csomópontokat, amelyek nem maguk tárolják az információt, hanem lekérik azt a teljes csomópontoktól. Ez ugyanakkor azt is jelenti, hogy a könnyű csomópont nem független módon ellenőrzi az információt, hanem egy másik csomópontban bízik. Emellett a teljes csomópontoknak egy extra feladatot kell ellátni, amikor kiszolgálják ezeket a könnyű csomópontokat. + +A Portal Network egy új hálózati dizájn az Ethereumon, hogy megoldja az adatelérhetőségi problémát a könnyű csomópontok esetében anélkül, hogy bízniuk kellene másban vagy a teljes csomópontot terhelnénk vele, s ehhez a szükséges információt kis darabokban osztják meg a hálózaton. + +Bővebben a [csomópontokról és kliensekről](/developers/docs/nodes-and-clients/) + +## Miért van szükség Portal Networkre? {#why-do-we-need-portal-network} + +Az Ethereum csomópontok a saját teljes vagy részleges másolatukat tárolják az Ethereum blokkláncról. Ezt a helyi másolatot használják a tranzakciók validálására, s arra, hogy a csomópont a megfelelő láncot kövesse. Ez a helybeli másolat lehetővé teszi, hogy a csomópontok független módon ellenőrizzák a bejövő adatok érvényességét és helyességét, anélkül hogy egy másik entitásban kellene megbízniuk. + +A blokklánc és a kapcsolódó státusz és megkapott adatok a csomópont merevlemezén rengeteg helyet foglalnak. Például egy 2 TB merevlemez kell egy olyan csomópont futtatásához, mely [Geth-et](https://geth.ethereum.org) használ egy konszenzusklienssel párban. A snap szinkronizálás használatával, amely csak a viszonylag friss blokkok láncadatait tárolja, a Geth kb. 650 GB lemezterületet foglal el, de kb. 14 GB/hét sebességgel növekszik (a csomópontot időszakosan vissza lehet vágni 650 GB-ra). + +Tehát a csomópont futtatása költséges lehet, mert nagy tárhelyet kell dedikálni az Ethereumnak. Az Ethereum ütemterve számos megoldást kínál erre a problémára, beleértve a [előzményadatok lejáratát](/roadmap/statelessness/#history-expiry), [státuszlejáratot](/roadmap/statelessness/#state-expiry) és [státuszmentességet](/roadmap/statelessness/). Ugyanakkor ezek bevezetésére még kell várni néhány évet. Emellett működnek [könnyű csomópontok](/developers/docs/nodes-and-clients/light-clients/), amelyek nem mentenek saját adatot a láncról, hanem a teljes csomópontoktól kérdezik le a szükséges információkat. Ekkor azonban a könnyű csomópontnak meg kell bíznia a teljes csomópontban, hogy korrekt adatot szolgáltat, s még terhet is jelent a teljes csomópontnak. + +A Portal Network célja, hogy alternatív módot biztosítson a könnyű csomópontoknak, hogy hozzájussanak az adatokhoz bizalomigény nélkül, s nem növeli jelentősen a teljes csomópontok által elvégzendő munkát. Ennek módja az Ethereum csomópontok számára, hogy az adatot másképpen kell megosztani a hálózaton. + +## Hogyan működik a Portal Network? {#how-does-portal-network-work} + +Az Ethereum csomópontok szigorú protokollt követnek abban, hogyan kommunikálnak egymással. A végrehajtási kliensek a kommunikációhoz néhány alprotokollt használnak, mint a [DevP2P](/developers/docs/networking-layer/#devp2p), miközben a konszenzuskliensek egy másik adagot, amit [libP2P](/developers/docs/networking-layer/#libp2p) néven neveznek. Ezek határozzák meg a csomópontok között átadható adattípusokat. + +![devP2P és libP2P](portal-network-devp2p-libp2p.png) + +A csomópontok emellett specifikus adatokat is tudnak adni a [JSON-RPC API](/developers/docs/apis/json-rpc/) révén, amely az a mód, ahogy az alkalmazások és tárcák cserélnek információt az Ethereum csomópontokkal. Ugyanakkor ezek egyike sem az ideális megoldás a könnyű kliensek kiszolgálására. + +A könnyű kliensek nem tudnak adatot szerezni a láncról a DevP2P vagy libP2p protokollok révén, mert ezeket szinkronizálásra és a blokkokról és tranzakciókról szóló pletykákhoz tervezték. A könnyű kliens nem akarja letölteni ezeket az információkat, mert akkor nem lenne könnyű súlyú. + +A JSON-RPC API azért nem jó, mert egy specifikus teljes csomóponton vagy egy közpinti RPC szolgáltatón múlik, hogy adatot adjon. Ekkor a könnyű kliensnek meg kellene bíznia a csomópontban vagy a szolgáltatóban, hogy az jóhiszemű, továbbá a teljes csomópontot is leterheli és nagyobb sávszélesség kell neki, ha egyszerre több könnyű kliens több kéréssel fordul hozzá. + +A Portal Network lényege, hogy újragondolja az egész dizájnt, kifejezetten a könnyedségre építve, a meglévő Ethereum kliensek tervezési korlátain kívül. + +A Portal Network lényege, hogy a jelenlegi hálózati stack legjobb részeit használja ki azáltal, hogy lehetővé teszi, hogy a könnyű kliensek számára szükséges információkat, például a historikus adatokat és a lánc fejének beazonosítását egy könnyű, DevP2P stílusú peer-to-peer decentralizált hálózaton keresztül szolgáltassák ki, amely egy [DHT-t](https://en.wikipedia.org/wiki/Distributed_hash_table) használ (hasonlóan a Bittorrenthez). + +Az ötlet lényege, hogy minden egyes csomóponthoz hozzáadnák a teljes Ethereum historikus adatainak kis részét és néhány konkrét csomóponti feladatot. Ezután a kéréseket úgy szolgálnák ki, hogy megkeresik az adatokat tároló csomópontot és azoktól lekérdezik azt. + +Ez megfordítja azt a szokásos modellt, amelyben a könnyű csomópontok egyetlen csomópontot találnak, és felkérik őket nagy mennyiségű adat szűrésére és kiszolgálására; ehelyett gyorsan megszűrik a csomópontok nagy hálózatát, amelyek mindegyike kis mennyiségű adatot kezel. + +A cél az, hogy a könnyű súlyú Portal kliensek decentralizált hálózata a következőket tegye: + +- a lánc elejét, vagyis legfrissebb állapotát kövesse +- szinkronizálja a jelenlegi és a historikus láncadatokat +- státuszadatokat szerezzen +- tranzakciókat terjesszen el +- tranzakciókat hajtson végre az [EVM](/developers/docs/evm/) révén + +Ennek a hálózati dizájnnak az előnyei: + +- csökkenti a központi szolgáltatóktól való függést +- csökkenti az internet sávszélességi igényt +- mininális vagy nulla szinkronizálásra van szükség +- a kevés erőforrással bíró eszközök számára is működne (<1GB RAM, <100 MB merevlemez, 1 CPU) + +Az alábbi ábra a meglévő kliensek azon funkcióit mutatja be, amelyeket a Portal Network biztosíthat, lehetővé téve a felhasználók számára, hogy ezeket a funkciókat nagyon alacsony erőforrásigényű eszközökön is elérjék. + +![portal network táblázat](portal-network-table2.png) + +## Alapértelmezett kliensdiverzitás {#client-diversity-as-default} + +A Portal Network fejlesztők már eleve három elkülönült klienst építenek az első naptól fogva. + +A Portal Network kliensek a következők: + +- [Trin](https://github.com/ethereum/trin): Rust nyelven írva +- [Fluffy](https://nimbus.team/docs/fluffy.html): Nim nyelven írva +- [Ultralight](https://github.com/ethereumjs/ultralight): Typescript nyelven írva + +A több független kliensimplementáció növeli az Ethereum-hálózat rugalmasságát és decentralizációját. + +Ha az egyik kliensnél problémák vagy sebezhetőségek merülnek fel, a többi kliens zavartalanul működhet tovább, megelőzve az egyetlen hibapont kialakulását. Emellett az eltérő klienshasználat elősegíti az innovációt és a versenyt, ösztönzi a fejlesztéseket és csökkenti a monokultúra kockázatát az ökoszisztémán belül. + +## További olvasnivaló {#futher-reading} + +- [A Portal Network (Piper Merriam előadása a Devconon, Bogotában)](https://www.youtube.com/watch?v=0stc9jnQLXA). +- [A Portal Network Discord csatornája](https://discord.gg/CFFnmE7Hbs) +- [A Portal Network honlapja](https://www.ethportal.net/) diff --git a/public/content/translations/hu/enterprise/index.md b/public/content/translations/hu/enterprise/index.md index 152fc757443..2c5b3ab99e7 100644 --- a/public/content/translations/hu/enterprise/index.md +++ b/public/content/translations/hu/enterprise/index.md @@ -13,9 +13,9 @@ A blokklánc alkalmazások segítenek a vállalatoknak: - Új üzleti modelleket és értékteremtő lehetőségeket kifejleszteni - Versenyképesen jövőbiztossá tenni a szervezeteiket -Vállalati blokklánc alkalmazások fejleszthetőek a nyilvános, engedély nélküli Ethereum [főhálózatra](/glossary/#mainnet) vagy privát blokkláncokra, melyek az Ethereum technológiáján alapulnak. Tudj meg többet a [privát vállalati Ethereum láncokról](/enterprise/private-ethereum/). +A vállalati blokkláncalkalmazások fejleszthetőek a nyilvános, engedély nélküli Ethereum [főhálózatra](/glossary/#mainnet) vagy privát blokkláncokra, melyek az Ethereum technológiáján alapulnak. Tudjon meg többet a [privát vállalati Ethereum láncokról](/enterprise/private-ethereum/). -## Nyilvános vs privát Ethereum {#private-vs-public} +## Nyilvános versus privát Ethereum {#private-vs-public} Csak egy nyilvános Ethereum főhálózat létezik. A főhálózatra épült alkalmazások integrálódhatnak egymással, hasonlóan ahogy az internetre épített alkalmazások egymáshoz kapcsolódhatnak, kihasználva ezzel a decentralizált blokklánc teljes potenciálját. @@ -24,136 +24,121 @@ Számos vállalat és konzorcium indított privát, engedélyköteles blokklánc ### Legfontosabb különbségek {#key-differences} - Blokklánc biztonság/megváltoztathatóság - A blokklánc ellenállását az adatmódosítás ellen a konszenzus algoritmusa határozza meg. Az Ethereum főhálózatot több ezer független csomópont együttműködése biztosítja, amelyeket egyének és bányászok vezetnek szerte a világon. A privát láncoknak általában kevés csomópontja van, amelyeket egy vagy több szervezet irányít; ezeket a csomópontokat szigorúan lehet ellenőrizni, de elég néhány felett átvenni az irányítást a lánc átírása vagy hamis tranzakciók végrehajtása érdekében. -- Teljesítmény - Mivel a vállalatok privát Ethereum láncai nagy teljesítményű csomópontokat használhatnak, speciális hardverkövetelményekkel és különböző konszenzus algoritmusokkal, például a proof-of-authority-vel, így magasabb tranzakciós átvitelt érhetnek el az alaprétegen (1. réteg). Az Ethereum főhálózaton nagy átvitel érhető el a [2. rétegű skálázási megoldások használatával](/developers/docs/layer-2-scaling/). -- Költség - A privát lánc működtetésének költségei elsősorban a lánc felállításához és kezeléséhez szükséges munkában, valamint a szerverek futtatásában mutatkoznak meg. Bár nincs költsége csatlakozni az Ethereum főhálózathoz, minden tranzakció gáz költséget von maga után, amelyet Ether-ben kell kifizetni. Tranzakció váltókat (más néven benzinkutakat) fejlesztettek, hogy a felhasználóknak és még a vállalatoknak se kelljen közvetlenül Ether-t használni a tranzakcióik során. Néhány [elemzés](https://github.com/EYBlockchain/fundamental-cost-of-ownership/blob/master/EY%20Total%20Cost%20of%20Ownership%20for%20Blockchain%20Solutions.pdf) kimutatta, hogy egy alkalmazás működtetésének teljes költsége alacsonyabb lehet a főhálózaton, mint egy privát lánc futtatásával. +- Teljesítmény - Mivel a vállalatok privát Ethereum láncai nagy teljesítményű csomópontokat használhatnak, speciális hardverkövetelményekkel és különböző konszenzusalgoritmusokkal, például a jogosítványigazolással (proof-of-authority), így magasabb tranzakciós átvitelt érhetnek el az első blokkláncrétegen (L1). Az Ethereum főhálózaton nagy átvitel érhető el a [második blokkláncréteg (L2) skálázási megoldásaival](/developers/docs/scaling/#layer-2-scaling). +- Költség - A privát lánc működtetésének költségei elsősorban a lánc felállításához és kezeléséhez szükséges munkában, valamint a szerverek futtatásában mutatkoznak meg. Bár annak nincs költsége, hogy az Ethereum főhálózathoz csatlakozzon, minden tranzakció gázköltséget von maga után, amelyet etherben kell kifizetni. Tranzakcióközvetítőket (amolyan gáztöltőállomásokat) fejlesztettek, hogy a felhasználóknak és még a vállalatoknak se kelljen közvetlenül ethert használni a tranzakcióik során. Néhány [elemzés](https://github.com/EYBlockchain/fundamental-cost-of-ownership/blob/master/EY%20Total%20Cost%20of%20Ownership%20for%20Blockchain%20Solutions.pdf) kimutatta, hogy egy alkalmazás működtetésének teljes költsége alacsonyabb lehet a főhálózaton, mint egy privát lánc futtatásával. - Csomóponti engedélyezés - Csak felhatalmazott csomópontok csatlakozhatnak a privát láncokhoz. Bárki felállíthat egy csomópontot az Ethereum főhálózatán. -- Adatvédelem - A privát láncokra írt adatokhoz való hozzáférést a hálózatra való hozzáférés korlátozásával lehet szabályozni, és alaposabban hozzáférés-szabályozással és privát tranzakciókkal. A főhálózat 1. rétegére írt minden adat bárki számára hozzáférhető, így az érzékeny információkat off-chain kell tárolni és továbbítani, vagy titkosítani kell őket. Az ilyen design minták felemelkedőben vannak (pl.: Baseline, Aztec), csakúgy mint a 2. rétegű megoldások, melyek szétválasztják és az 1.rétegen kívül kezelik az adatot. +- Adatvédelem - A privát láncok adataihoz való hozzáférést elsősorban a hálózati hozzáférés korlátozásával lehet szabályozni, kifinomultabb szinten a hozzáférés-szabályozással és privát tranzakciókkal. A főhálózat L1 rétegére írt minden adat bárki számára hozzáférhető, így az érzékeny információkat láncon kívül kell tárolni és továbbítani, vagy titkosítani kell azokat. Az ilyen dizájnminták elterjedőben vannak (például Baseline, Aztec), csakúgy mint az L2-es megoldások, melyek szétválasztják és az L1-en kívül kezelik az adatot. ### Miért építsünk az Ethereum főhálózaton {#why-build-on-ethereum-mainnet} -A vállalkozások 2016 óta kísérleteztek a blokklánc technológiával, amikor elindították a Hyperledger, a Quorum és a Corda projekteket. A hangsúly főleg a privát engedélyköteles vállalati blokkláncokra helyezkedett, de 2019-től kezdődően váltás történt a gondolkodásban az nyilvános vagy privát blokkláncok használatára az üzleti alkalmazások esetében. Egy [felmérés](https://assets.ey.com/content/dam/ey-sites/ey-com/en_gl/topics/blockchain/ey-public-blockchain-opportunity-snapshot.pdf), melyet a Forrester vezettet, kimutatta, hogy "A felmérésben résztvevők 75%-a ... látja a lehetőséget, hogy egy valószínűséggel kihasználják majd a nyilvános blokkláncokat a jövőben, és közel kétharmaduk állította azt, hogy nagy valószínűséggel. Paul Brody az EY-tól [beszélt](https://www.youtube.com/watch?v=-ycu5vGDdZw&feature=youtu.be&t=3668) a nyilvános blokkláncokra történő fejlesztés előnyeiről, mely (az alkalmazástól függően) magasabb szintű biztonságot/megváltoztathatatlanságot, transzparenciát, a tulajdonjog alacsonyabb teljes költségét, és a többi alkalmazással történő interoperabilitási képességét nyújthatja, melyek szintén a főhálózaton vannak (hálózati hatások). A közös referenciakeret megosztása a vállalkozások között elkerülhetővé teszi a különféle szegregált silók felesleges létrehozását, amelyek nem képesek kommunikálni, megosztani vagy szinkronizálni az információkat egymással. +A vállalkozások 2016 óta kísérleteztek a blokklánctechnológiával, amikor elindították a Hyperledger, a Quorum és a Corda projekteket. A hangsúly főleg a privát, engedélyköteles, vállalati blokkláncokon volt, de 2019-től kezdődően elmozdult a gondolkodás a privát irányából a nyilvános blokkláncok felé az üzleti alkalmazások esetében. Egy [felmérés](https://assets.ey.com/content/dam/ey-sites/ey-com/en_gl/topics/blockchain/ey-public-blockchain-opportunity-snapshot.pdf), melyet a Forrester vezettet, kimutatta, hogy „A felmérésben résztvevők... látják ezt a lehetőséget, s 75%-uk valószínűleg kihasználná a nyilvános blokkláncokat a jövőben, és közel egyharmaduk állította azt, hogy ennek nagy a valószínűsége.” Paul Brody az Ernst & Youngtól [beszélt](https://www.youtube.com/watch?v=-ycu5vGDdZw&feature=youtu.be&t=3668) a nyilvános blokkláncokra történő fejlesztés előnyeiről, mely (az alkalmazástól függően) magasabb szintű biztonságot/megváltoztathatatlanságot, transzparenciát, alacsonyabb birtoklási költséget, és a főhálózaton lévő többi alkalmazással történő interoperabilitási képességét nyújthatja (hálózati hatások). A közös referenciakeret megosztása a vállalkozások között elkerülhetővé teszi a szegregált rendszerek felesleges létrehozását, amelyek nem képesek kommunikálni, megosztani vagy szinkronizálni az információkat egymással. -Egy másik fejlesztés, mely a nyilvános blokkláncokra tereli a figyelmet a [2. réteg technológia](/developers/docs/layer-2-scaling/). A 2. réteg elsősorban egy skálázási technológia kategória, mely magas átvitelű alkalmazásokat tesz lehetővé a nyilvános blokkláncokon. De a 2. réteg megoldások egy [másik kihívásra is megoldást nyújthatnak, melyek a vállalati fejlesztőket régen a privát láncok választására kényszerítette](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). - -Az Baseline protokoll az egyik kulcsfontosságú projekt, amely olyan protokollt határoz meg, amely bizalmas és összetett együttműködést tesz lehetővé a vállalkozások között anélkül, hogy érzékeny adatokat hagynának a láncon. Nagy [lendületet](https://www.oasis-open.org/news/pr/baseline-protocol-achieves-key-milestone-with-release-of-v0-1-implementation-for-enterprise-) szereztek 2020 folyamán. +Egy másik fejlesztés, mely a nyilvános blokkláncokra tereli a figyelmet a [második blokkláncréteg (L2)](/developers/docs/scaling/#layer-2-scaling) elérhetősége. Az L2 elsősorban egy skálázási technológia, mely magas átvitelű alkalmazásokat tesz lehetővé a nyilvános blokkláncokon. De az L2 megoldások egy [másik kihívásokra is megoldást nyújthatnak, melyek a vállalati fejlesztőket korábban a privát láncok választására kényszerítették](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). ## Vállati fejlesztői anyagok {#enterprise-developer-resources} ### Szervezetek {#organizations} -Az Ethereum vállalkozásbarátabbá tételére irányuló egyes együttműködési törekvések különböző szervezetek munkájának eredménye: +Különféle szervezetek számtalan együttműködésen alapuló erőfeszítést tettek azért, hogy az Ethereumot vállalkozásbarátabbá tegyék: -- [Enterprise Ethereum Alliance (EEA)](https://entethalliance.org/) Az EEA lehetővé teszi a szervezetek számára, hogy bevezessék és használják az Ethereum technológiát napi üzleti tevékenységükben. Arra sarkalja az Ethereum ökoszisztémát, hogy új üzleti lehetőségeket teremtsen, felfuttassa az iparági adoptációt, valamint tanuljanak és kollaboráljanak egymással a résztvevők. Az EEA főhálózati munkacsoportja fókuszpontot jelent az üzleti vállalkozások képviselői számára, akik érdekeltek a nyilvános Ethereum főhálózaton történő építésében, valamint az Ethereum közösség tagjai számára, akik támogatni szeretnék őket. -- [Ethereum OASIS Open Project](https://github.com/ethereum-oasis/oasis-open-project) Az Ethereum OASIS Open Projekt egy OASIS Open Project, amely azért létezik, hogy semleges fórumot biztosítson a különböző érdekelt felek számára, hogy magas színvonalú specifikációkat hozzanak létre, amelyek megkönnyítik az Ethereum hosszú élettartamát, interoperabilitását és könnyű integrációját. A projekt célja világos, nyílt szabványok, magas színvonalú dokumentációk és megosztott tesztcsomagok kifejlesztése, amelyek megkönnyítik az Ethereum protokoll új funkcióit és továbbfejlesztéseit. -- [Baseline Project](https://www.baseline-protocol.org/) A Baseline Protocol egy nyílt forráskódú kezdeményezés, amely egyesíti a kriptográfia, az üzenetküldés és a blokklánc fejlesztéseit, hogy biztonságos és privát üzleti folyamatokat nyújtson alacsony költségen, az Ethereum nyilvános főhálózatán keresztül. A protokoll bizalmas és összetett együttműködést tesz lehetővé a vállalkozások között anélkül, hogy érzékeny adatokat hagyna a láncon. A Baseline Project az Ethereum OASIS Open Project egy alprojektje és a Baseline Technical Steering Committe irányítja. +- [Enterprise Ethereum Alliance (EEA)](https://entethalliance.org/) Az EEA lehetővé teszi a szervezetek számára, hogy bevezessék és használják az Ethereum technológiát napi üzleti tevékenységükben. Arra sarkallja az Ethereum ökoszisztémát, hogy új üzleti lehetőségeket jelenjenek meg, növekedjen az iparági adoptáció, valamint tanuljanak és kollaboráljanak egymással a résztvevők. Az EEA főhálózati munkacsoportja fókuszpontot jelent az üzleti vállalkozások képviselői számára, akik érdekeltek a nyilvános Ethereum főhálózaton történő építésében, valamint az Ethereum közösség tagjai számára, akik támogatni szeretnék őket. +- [Ethereum OASIS Open Project](https://github.com/ethereum-oasis/oasis-open-project) Ez egy OASIS Open Project, amely azért létezik, hogy semleges fórumot biztosítson a különböző érdekelt felek számára, hogy magas színvonalú specifikációkat hozzanak létre, amelyek megkönnyítik az Ethereum hosszú élettartamát, interoperabilitását és könnyű integrációját. A projekt célja világos, nyílt szabványok, magas színvonalú dokumentációk és megosztott tesztcsomagok kifejlesztése, amelyek megkönnyítik az Ethereum protokoll új funkcióit és továbbfejlesztéseit. +- [Baseline Project](https://www.baseline-protocol.org/) A Baseline Protocol egy nyílt forráskódú kezdeményezés, amely egyesíti a kriptográfia, az üzenetküldés és a blokklánc fejlesztéseit, hogy biztonságos és privát üzleti folyamatokat nyújtson alacsony költségen, az Ethereum nyilvános főhálózatán keresztül. A protokoll bizalmas és összetett együttműködést tesz lehetővé a vállalkozások között anélkül, hogy érzékeny adatokat hagyna a láncon. A Baseline Project az Ethereum OASIS Open Project egy alprojektje és a Baseline Technical Steering Committee irányítja. ### Termékek és szolgáltatások {#products-and-services} -- [Alchemy](https://alchemyapi.io/) _API szolgáltatásokat és eszközöket szolgáltat az Ethereum alkalmazások fejlesztéséhez és monitorozásához_ -- [Blockapps](https://blockapps.net/) _az Enterprise Ethereum implementációja, eszközök, API-ok, melyek a STRATO platformot alkotják_ -- [ConsenSys](https://consensys.net/) _számos terméket és eszközt kínál az Ethereum fejlesztésére, valamint tanácsadási és egyedi fejlesztési szolgáltatásokat_ -- [Envision Blockchain](https://envisionblockchain.com/) _az Ethereum főhálózatra szakosodott, vállalati fókuszú tanácsadási és fejlesztési szolgáltatásokat nyújt_ -- [EY OpsChain](https://blockchain.ey.com/products/contract-manager) _egy beszerzési workflow-t biztosít RFQ-k, szerződések, rendelések és számlák kiadásával az Ön megbízható üzleti partnereiből álló hálózaton keresztül_ -- [Hyperledger Besu](https://www.hyperledger.org/use/besu) _egy vállalati fókuszú nyílt forráskódú Ethereum kliens Apache 2.0 licenccel fejlesztve és Java-ban írva_ -- [Infura](https://infura.io/) _skálázható Ethereum és IPFS hálozat API hozzáférés_ -- [Provide](https://provide.services/) _infrastruktúra és API-ok vállalati web3 alkalmazásoknak_ -- [Unibright](https://unibright.io/) _egy blokklánc specialistákból, tervezőkből, fejlesztőkőből és szaktanácsadókból álló csapat több mint 20 év tapasztalattal az üzleti folyamatok és az integráció területén_ +- Az [Alchemy](https://www.alchemy.com/) _API szolgáltatásokat és eszközöket szolgáltat az Ethereum alkalmazások fejlesztéséhez és monitorozásához_ +- A [Blast](https://blastapi.io/) _egy API platform, ami RPC/WSS API-okat biztosít az Ethereum archív főhálózathoz és a teszthálózatokhoz._ +- A [Blockapps](https://blockapps.net/) _a vállalati Ethereum protokoll, az eszközök és az API-ok implementációja, melyek a STRATO platformot alkotják_ +- A [Chainstack](https://chainstack.com/) _az Ethereum főhálózatára és teszthálózataira biztosít infrastruktúrást, melyet publikus & elkülönített vevői felhőkben hosztol_ +- A [ConsenSys](https://consensys.net/) _számos terméket és eszközt kínál az Ethereum fejlesztésére, valamint tanácsadási és egyedi fejlesztési szolgáltatásokat nyújt_ +- Az [Envision Blockchain](https://envisionblockchain.com/) _az Ethereum főhálózatra szakosodott, vállalati fókuszú, tanácsadási és fejlesztési szolgáltatásokat nyújt_ +- Az [EY OpsChain](https://blockchain.ey.com/products/contract-manager) _egy beszerzési munkafolyamatot biztosít, melynek során ajánlat bekéréseket (RFQ), szerződéseket, rendeléseket és számlákat bocsát ki az Ön megbízható üzleti partnereiből álló hálózatán keresztül_ +- A [Hyperledger Besu](https://www.hyperledger.org/use/besu) _egy vállalati fókuszú, nyílt forráskódú Ethereum kliens Apache 2.0 licensszel fejlesztve és Java-ban írva_ +- Az [Infura](https://infura.io/) _egy skálázható API hozzáférés az Ethereumhoz és az IPFS hálozatokhoz_ +- A [Kaleido](https://kaleido.io/) _egy vállalati fókuszú fejlesztési platform, ami egyszerűsített blokklánc- és digitális eszköz alkalmazásokat ajánl_ +- A [NodeReal](https://nodereal.io/) _skálázható blokkláncinfrastruktúrát és API szolgáltatásnyújtókat biztosít a web3 ökoszisztémának_ +- A [Provide](https://provide.services/) _infrastruktúrát és API-okat biztosít vállalati web3 alkalmazásoknak_ +- A [QuickNode](https://www.quicknode.com/) _megbízható és gyors csomópontokat biztosít magas szintű API-okkal, mint amilyen az NFT API, Token API stb., miközben egy egységes termékcsomagot és vállalati szintű megoldásokat szállít_ +- A [Tenderly](https://tenderly.co) _egy web3 fejlesztői platform, ami okosszerződés fejlesztéshez, teszteléshez, monitorozáshoz és működtetéshez biztosít hibakeresési, megfigyelhetőségi és infrastruktúrához kapcsolódó építőelemeket_ +- A [Unibright](https://unibright.io/) _egy blokklánc specialistákból, tervezőkből, fejlesztőkőből és szaktanácsadókból álló csapat, több mint 20 év tapasztalattal az üzleti folyamatok és az integráció területén_ +- A [Zero Services GmbH](https://www.zeroservices.eu/) _ menedzselt szolgáltatásokat biztosít európai és ázsiai közös helyeken keresztül. Működteti & monitorozza az Ön csomópontjait biztonságos és megbízható módon_ +- A [Zeeve](https://www.zeeve.io/) _az Ethereumra való építéshez nyújt termékeket és eszközöket, valamint infrastruktúrát és API-okat biztosít vállalati web3 alkalmazásoknak_ ### Eszközök és könyvtárak {#tooling-and-libraries} -- [Alethio](https://aleth.io/) _Ethereum Data Analytics Platform_ -- [Epirus](https://www.web3labs.com/epirus) _Egy platform blokklánc alkalmazások fejlesztésére, telepítésére és monitorozására a Web3 Labs által_ -- [Ernst & Young's ‘Nightfall'](https://github.com/EYBlockchain/nightfall) _ eszköztár privát tranzakciókhoz_ -- [EthSigner](https://github.com/ConsenSys/ethsigner) _Tranzakció aláírási alkalmazás, amelyet egy web3 szolgáltatóval kell használni_ -- [Tenderly](https://tenderly.co/) _egy adat platform, mely valós idejű elemzéseket, figyelmeztetéseket és monitorozást kínál privát láncok támogatásával._ -- [Truffle Suite](https://trufflesuite.com) _blockchain development suite (Truffle, Ganache, Drizzle)_ +- Az [Alethio](https://explorer.aleth.io/) _egy Ethereum adatelemzési platform_ +- A [Sirato](https://www.web3labs.com/sirato) _egy adat és elemzési platform publikus és privát, Ethereum kompatibilis hálózatokhoz, melyet a Web3 Labs fejlesztett_ +- Az [Ernst & Young Nightfall](https://github.com/EYBlockchain/nightfall) _ egy eszköztár privát tranzakciókhoz_ +- Az [EthSigner](https://github.com/ConsenSys/ethsigner) _egy tranzakció aláírási alkalmazás, amelyet egy web3 szolgáltatóval kell használni_ +- A [Tenderly](https://tenderly.co/) _egy adatplatform, mely valós idejű elemzéseket, figyelmeztetéseket és monitorozást kínál támogatással együtt privát láncoknak._ +- A [Truffle Suite](https://trufflesuite.com) _egy blokkláncfejlesztési csomag (Truffle, Ganache, Drizzle)_ ### Skálázási megoldások {#scalability-solutions} -A [2. réteget](/developers/docs/layer-2-scaling/) olyan technológiák vagy rendszerek alkotják, melyek az Ethereumon (1. réteg) futnak, öröklik a biztonsági tulajdonságait az 1. rétegről és nagyobb tranzakció feldolgozási kapacitást (átvitelt) biztosítanak, alacsonyabb tranzakciós díjjal (működési költség) és gyorsabb tranzakció megerősítést, mint az 1. réteg esetében. A 2. rétegű skálázási megoldások biztonságát az 1. réteg szolgáltatja, de a blokklánc alkalmazások számára elérhetővé teszik, hogy több felhasználót, tevékenységet vagy adatot kezeljenek, mint amire az 1. réteg képes lenne. A legtöbbjük kihasználja a legutóbbi fejlődési eredményeket a kriptográfiában és zero-knowledge (ZK) bizonyítékokat használnak, hogy növeljék a teljesítményt és a biztonságot. - -Az alkalmazásod egy 2. rétegű skálázási megoldásra történő építése segíthet [megoldani sok olyan problémát, mely korábban a cégeket arra késztette, hogy egy privát blokkláncon fejlesszenek](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/), mégis megtartani a főhálózat előnyeit. - -Példák L2 megoldásokra, melyek produkcióra készek, vagy hamarosan készen lesznek: - -- Optimista összegzők (adat a láncon, csalási bizonyítékok) - - [Optimism](https://optimism.io/) - - [Offchain Labs Arbitrum Rollup](https://offchainlabs.com/) - - [Fuel Network](https://fuel.sh) -- ZK összegzők (adat a láncon, ZK érvényességi bizonyítékok) - - [Loopring](https://loopring.org) - - [Starkware](https://starkware.co) - - [Matter Labs zkSync](https://matter-labs.io/) - - [Aztec 2.0](https://aztec.network/) -- Validium (adat a láncon kívül, ZK érvényességi bizonyítékok) - - [Starkware](https://starkware.co) - - [Matter Labs zkPorter](https://matter-labs.io/) -- Plasma (adat láncon kívül, csalási bizonyítékok) - - [OMG Network](https://omg.network/) - - [Gazelle](https://gzle.io) - - [Matic Network](https://matic.network/) - - [LeapDAO](https://ipfs.leapdao.org/) -- Állapot csatornák - - [Connext](https://connext.network/) - - [Raiden](https://raiden.network/) - - [Perun](https://perun.network) -- Mellékláncok - - [Skale](https://skale.network) - - [POA Network](https://www.poa.network/) -- Hibrid megoldások, amelyek több kategória tulajdonságait ötvözik - - [Celer](https://celer.network) +A [második blokkláncréteget (L2)](/layer-2) olyan technológiák vagy rendszerek alkotják, melyek az Ethereumon (L1) futnak, öröklik a biztonsági tulajdonságait az L1-től és nagyobb tranzakciófeldolgozási kapacitást (átvitelt) biztosítanak, alacsonyabb tranzakciós díjjal (működési költség) és gyorsabb tranzakció megerősítést, mint az L1 esetében. Az L2 skálázási megoldások biztonságát az L1 szolgáltatja, de a blokkláncalkalmazások számára elérhetővé teszik, hogy több felhasználót, tevékenységet vagy adatot kezeljenek, mint amire az L1 képes lenne. A legtöbbjük a kriptográfiában és a zero-knowledge (ZK) bizonyítékok kapcsán elért fejlődési eredményeket használja, hogy növelje a teljesítményt és a biztonságot. + +Amennyiben Ön az alkalmazását egy L2 skálázási megoldásra építi, az [megoldhat több olyan problémát, mely korábban a cégeket arra késztette, hogy egy privát blokkláncon fejlesszenek](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/), mégis megtartja a főhálózat előnyeit. ## Vállalati alkalmazások a főhálózaton {#enterprise-live-on-mainnet} -Itt egy pár vállalati alkalmazás, melyek telepítve lettek a nyilvános Ethereum főhálózatra +Az alábbiakban néhány vállalati alkalmazást talál, melyek telepítve lettek a nyilvános Ethereum főhálózatra ### Fizetések {#payments} -- [Brave Böngésző](https://basicattentiontoken.org/) _a felhasználókat fizetik, hogy hirdetéseket nézzenek és a felhasználók fizetéssel támogathatják a kiadókat a Basic Attention Token segítségével._ -- [hCaptcha](https://www.hcaptcha.com/) _Bot megelőző CAPTCHA rendszer, mely fizet a weboldal működtetőnek a felhasználók által végzett munkáért, akik a gépi tanulás számára jelölik az adatokat. Már telepítve van a Cloudflare-en is._ -- [Audius](https://audius.co/) _egy streaming szolgáltatás, mely összeköti a zene rajongókat közvetlenül a művészekkel, akiket teljes egészében a rajongóik fizethetnek ki, azonnal minden egyes stream után_ +- A [Brave Browser](https://basicattentiontoken.org/) _a felhasználóknak fizet, hogy hirdetéseket nézzenek, a felhasználók pedig fizetéssel támogathatják a kiadókat a Basic Attention Token segítségével._ +- Az [hCaptcha](https://www.hcaptcha.com/) _egy Bot-megelőző CAPTCHA rendszer, mely fizet a weboldal működtetőnek a felhasználók által végzett munkáért, akik a gépi tanuláshoz megjelölik az adatokat. Már telepítve van a Cloudflare-en is._ +- Az [EthereumAds](https://ethereumads.com/) _lehetővé teszi a weboldal működtetőknek, hogy reklámhelyeket értékesítsenek és az Ethereum keresztül kapjanak érte pénzt_ ### Pénzügy {#finance} -- [Santander Bank](https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _kötvény kiadás és elszámolás_ -- [Societe Generale](https://www.societegenerale.com/en/newsroom-first-financial-transaction-settled-with-a-digital-currency) _kötvény kiadás_ -- [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _kötvény kibocsájtás és a FAT brandek tokenizálása_ -- [Sila](https://silamoney.com/) _banking és ACH fizetési infrastruktúra, mint szolgáltatás_ -- [Tinlake](https://tinlake.centrifuge.io/) _Követelések finanszírozása tokenizált valós eszközökön keresztül, mint például a számlák, jelzálogok vagy streaming jogdíjak_ -- [Kratos](https://triterras.com/kratos) _árupiaci kereskedés és pénzügyi platform, mely összeköti és lehetővé teszi az árukereskedőknek, hogy kereskedjenek és tőkét szerezzenek kölcsönzőktől közvetlenül online_ -- [Fasset](https://www.fasset.com/) _egy platform a fenntartható infrastruktúráért_ +- A [Santander Bank](https://www.coindesk.com/santander-settles-both-sides-of-a-20-million-bond-trade-on-ethereum) _kötvénykiadást és elszámolást épített_ +- A [Societe Generale](https://www.generali-investments.com/it/en/institutional/article/generali-investments-and-generali-iard-carry-out-first-market-transaction-based-on-blockchain-infrastructure) _kötvénykiadásra használja_ +- A [Cadence](https://www.forbes.com/sites/benjaminpirus/2019/10/09/fatburger-and-others-feed-30-million-into-ethereum-for-new-bond-offering/#513870be115b) _kötvénykibocsájtást és a FAT brandek tokenizálást végzi_ +- A [Sila](https://silamoney.com/) _bankolásra és ACH fizetésre ad infrastruktúra mint szolgáltatást egy stabilérmét használva_ +- A [Taurus](https://www.taurushq.com/) _tokenizált részvényeket bocsát ki_ + +### Eszköztokenizálás {#tokenization} + +- A [Tinlake](https://tinlake.centrifuge.io/) _követelések finanszírozását végzi tokenizált valós eszközökön keresztül, mint például a számlák, jelzálogok vagy műsorszolgáltatási jogdíjak_ +- A [RealT](https://realt.co/) _révén a befektetők a világ minden részéről vásárolhatnak az amerikai ingatlanpiacon a szabályozásnak megfelelő, tokenizált résztulajdont._ +- Az [AgroToken](https://agrotoken.io/en/) _ mezőgazdasági anyagokat tokenizál és kereskedik velük_ +- A [Fasset](https://www.fasset.com/) _egy platform a fenntartható infrastruktúráért_ ### Adatok notarizációja {#notarization-of-data} -- [BBVA](https://www.ledgerinsights.com/bbva-blockchain-loan-banking-tech-award/) _a véglegesített kölcsönök részletei hashelődnek és feljegyzésre kerülnek a főhálózatra_ -- [Splunk](https://www.splunk.com/en_us/blog/security/the-newest-data-attack.html) _az adatok integritása biztosítható az indexelt adatok hashének rendszeres feljegyzésével a főhálózatra_ -- [ANSA](https://cointelegraph.com/news/italys-top-news-agency-uses-blockchain-to-fight-fake-coronavirus-news) _Olaszország legnagyobb hírügynöksége, mely küzd a fake news ellen és lehetővé teszi az olvasók számára, hogy ellenőrizzék az új hírek eredetiségét a főhálózatra történő feljegyzéssel_ -- [Verizon](https://decrypt.co/46745/verizon-news-press-releases-ethereum-full-transparency) _logolja a sajtókiadványokat az Ethereumra biztosítva ezzel a vállalati elszámoltathatóságot és bizalmat_ -- [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _rögzíti az órák származását és javítását Ethereumra_ +- A [BBVA](https://www.ledgerinsights.com/bbva-blockchain-loan-banking-tech-award/) _a véglegesített kölcsönök részleteit hasheli és feljegyzi a főhálózatra_ +- A [Splunk](https://www.splunk.com/en_us/blog/security/the-newest-data-attack.html) _az adatok integritását biztosítja azzal, hogy az indexelt adatok hashét rendszeresen feljegyzi a főhálózatra_ +- Az [ANSA](https://cointelegraph.com/news/italys-top-news-agency-uses-blockchain-to-fight-fake-coronavirus-news) _Olaszország legnagyobb hírügynöksége, mely küzd a hamis hírek ellen, és a főhálózatra történő feljegyzéssel lehetővé teszi az olvasók számára, hogy ellenőrizzék az új hírek eredetiségét_ +- A [Verizon](https://decrypt.co/46745/verizon-news-press-releases-ethereum-full-transparency) _az Ethereumra naplózza a sajtókiadványokat, biztosítva ezzel a vállalati elszámoltathatóságot és bizalmat_ +- A [Breitling](https://www.coindesk.com/breitling-arianee-all-new-watches-ethereum) _rögzíti az órák származását és javítási részleteit az Ethereumra_ +- Az [EthSign](https://ethsign.xyz/) _feljegyezi az Ethereum blokkláncra az aláírt elektronikus dokumentumokat_ ### Ellátási lánc {#supply-chain} -- [CargoX](https://cargox.io/press-releases/full/cargox-becomes-first-public-blockchain-ethereum-bill-lading-provider-approved-international-group-pi-clubs) _Fuvarlevél és dokumentumátvitel szolgáltató_ -- [Morpheus.network](https://morpheus.network/) _ellátási lánc automatizálási platform, mely egy privát láncokból és a notarizált adatokat tartalmazó Ethereum főhálózatból álló hibridet vezetett be és olyan cégek használják, mint a kanadai élelmiszer, olaj & gáz elosztó Federated Co-op Ltd. és az argentín kisállat eledel Vitalcan_ -- [Minespider](https://www.minespider.com/) _ellátási lánc nyomonkövetés_ -- [ShipChain](https://shipchain.io) _Ethereum nyilvános oldallánc és vállalati rendszer az ellátási lánc láthatóságáért és megbízhatóságáért különösen a kombinált logisztika esetében_ -- [Follow Our Fibre](https://www.followourfibre.com) _viszkózus ellátási lánc nyomon követhetőség_ -- [EY OpsChain Network Procurement](https://blockchain.ey.com/products/contract-manager) _egy beszerzési workflow-ba történő belépést tesz lehetővé cégek számára RFQ-k, szerződések, rendelések és számlák kiadásával az Ön megbízható üzleti partnereiből álló hálózaton keresztül_ -- [Treum](https://treum.io/) _átláthatóságot, nyomonkövethetőséget és kereskedési lehetőséget biztosít ellátási láncoknak blokklánc technológia használatával_ +- A [CargoX](https://cargox.io/press-releases/full/cargox-becomes-first-public-blockchain-ethereum-bill-lading-provider-approved-international-group-pi-clubs) _egy fuvarlevél és dokumentumátviteli szolgáltató_ +- A [Morpheus.network](https://morpheus.network/) _egy ellátási lánc automatizálási platform, mely egy privát láncokból és a notarizált adatokat tartalmazó Ethereum főhálózatból álló hibridet vezetett be, és olyan cégek használják, mint a kanadai élelmiszer, olaj & gáz elosztó Federated Co-op Ltd. és az argentín kisállateledel gyártó Vitalcan_ +- A [Minespider](https://www.minespider.com/) _ellátási lánc nyomonkövetést biztosít_ +- Az [EY OpsChain Network Procurement](https://blockchain.ey.com/products/contract-manager) _egy beszerzési munkafolyamatot biztosít a cégek számára, melynek során ajánlat bekéréseket (RFQ), szerződéseket, rendeléseket és számlákat bocsát ki az Ön megbízható üzleti partnereiből álló hálózatán keresztül_ +- A [Treum](https://treum.io/) _átláthatóságot, nyomonkövethetőséget és kereskedési lehetőséget biztosít ellátási láncoknak blokklánctechnológia használatával_ +- A [TradeTrust](https://www.tradetrust.io/) _az elektronikus fuvarleveleket (eBLs) ellenőriz a nemzetközi szállításban_ +- A [Birra Peroni](https://www.ey.com/en_gl/news/2021/05/birra-peroni-is-the-first-industrial-organization-to-mint-unique-non-fungible-tokens-using-ey-opschain-traceability) _ minden egyes új söradaghoz NFT-t hoz létre, hogy ezzel nagyobb rálátása legyen a teljes ellátási láncra, s így nagyobb hatékonyságot érjen el_ + +### Biztosítás {#insurance} + +- Az [Arbol](https://www.arbolmarket.com/) _egy parametrikus biztosítás az időjárásból eredő kockázatok fedezésére_ +- Az [Etherisc](https://etherisc.com/) _egy decentralizált biztosítás különféle kockázatokra_ ### Hitelesítő adatok és tanúsítványok {#credentials} -- [Utah Counties](http://www.utahcounty.gov/Dept/ClerkAud/DigitalCertCopy.html) _digitális házassági tanúsítványok kiadása Ethereumon_ -- [Két olasz középiskola](https://cointelegraph.com/news/two-italian-high-schools-to-issue-digital-diplomas-with-blockchain) _digitális érettségik az Ethereum főhálózaton kibocsájtva_ -- [St. Gallen Egyetem](https://cointelegraph.com/news/swiss-university-fights-fake-diplomas-with-blockchain-technology) _pilot project diplomák hitelesítésére egy svájci egyetem által_ -- [Malta](https://cointelegraph.com/news/malta-to-store-education-certificates-on-a-blockchain) _az összes oktatási tanúsítvány rögzítve van a főhálózaton a [Hyland](https://www.learningmachine.com/)_ által -- [Pohang University of Science and Technology](https://www.theblockcrypto.com/linked/55176/south-korean-university-issues-blockchain-stored-diplomas-amid-the-spread-of-the-coronavirus) _dél-koreai egyetem, mely a frissen végzetteknek blokkláncon tárolt diplomákat ad_ -- [OpenCerts](https://opencerts.io/) _blokklánc oktatási hitelesítéseket ad ki Szingapúrban_ -- [BlockCerts](https://www.blockcerts.org/) _egy nyílt szabványt fejlesztett a blokklánc hitelesítőknek _ -- [SkillTree](http://skilltree.org/) _Online készség képzés és tanúsítványok, amelyek a lejárati triggerekkel vagy más készségekkel kapcsolatos függőségekkel konfigurálhatók_ +- [Két olasz középiskola](https://cointelegraph.com/news/two-italian-high-schools-to-issue-digital-diplomas-with-blockchain) _digitális érettségiket bocsát ki az Ethereum főhálózaton_ +- A [St. Gallen Egyetem](https://cointelegraph.com/news/swiss-university-fights-fake-diplomas-with-blockchain-technology) _ Svájcban diplomák hitelesítésére készített egy pilot projektet_ +- A [Hyland Credentials](https://www.hylandcredentials.com) _digitális diplomákat és más oktatási igazolványokat, engedélyeket és bizonyítványokat bocsát ki_ +- Az [OpenCerts](https://opencerts.io/faq) _blokkláncoktatási bizonyítványokat ad ki Szingapúrban_ +- A [BlockCerts](https://www.blockcerts.org/) _egy nyílt szabványt fejlesztett a blokklánc hitelesítőknek _ ### Eszközök {#utilities} -- [GridPlus](https://blog.gridplus.io/gridplus-is-live-in-texas-efc83c814601) _elektromos fizetések_ +- A [GridPlus](https://blog.gridplus.io/gridplus-is-live-in-texas-efc83c814601) _elektromos fizetéseket biztosít_ -Ha szeretnél valamit hozzáadni a listához, akkor nézd meg [ a közreműködési instrukciókat](/contributing/). +Ha szeretne valamit hozzáadni a listához, akkor tekintse át a [közreműködésre vonatkozó instrukciókat](/contributing/). diff --git a/public/content/translations/hu/enterprise/private-ethereum/index.md b/public/content/translations/hu/enterprise/private-ethereum/index.md index ec4b4c45239..373e257248e 100644 --- a/public/content/translations/hu/enterprise/private-ethereum/index.md +++ b/public/content/translations/hu/enterprise/private-ethereum/index.md @@ -6,22 +6,23 @@ lang: hu # Privát Ethereum vállalatoknak {#private-ethereum-for-enterprise} -Vállalati blokklánc alkalmazások fejleszthetőek a nyilvános, engedély nélküli Ethereum főhálózatra vagy privát blokkláncokra, melyek az Ethereum technológiáján alapulnak. További információkért a nyilvános Ethereum főhálózaton való fejlesztére vonatkozóan nézd meg az [Ethereum főhálózat vállalatoknak](/enterprise/) cikket. +Vállalati blokklánc alkalmazások fejleszthetőek a nyilvános, engedély nélküli Ethereum főhálózatra vagy privát blokkláncokra, melyek az Ethereum technológiáján alapulnak. A nyilvános Ethereum főhálózaton való fejlesztére vonatkozóan nézze meg az [Ethereum főhálózat vállalatoknak](/enterprise/) című cikket. ## Fejlesztői anyagok a privát vállalati Ethereumhoz {#developer-resources-private-enterprise-ethereum} ### Szervezetek {#organisations} -Az Ethereum vállalkozásbarátabbá tételére irányuló egyes együttműködési törekvéseket különböző szervezetek hozták össze: +Az Ethereum vállalkozásbaráttá tételére irányuló egyes együttműködési törekvéseket különböző szervezetek hozták össze: -- [Enterprise Ethereum Alliance](https://entethalliance.org/) Az EEA lehetővé teszi a szervezetek számára, hogy bevezessék és használják az Ethereum technológiát napi üzleti tevékenységükben. Arra sarkaljuk az Ethereum ökoszisztémát, hogy új üzleti lehetőségeket teremtsünk, felfuttassuk az iparági adoptáció valamint tanuljunk és kollaboráljunk egymással. -- [Hyperledger](https://hyperledger.org) _A Hyperledger egy olyan nyílt forráskódú kollaboratív törekvés, mely az iparágak közötti blokklánc technológiák előmozdítása érdekében jött létre. Ez egy globális együttműködés, melynek a Linux Foundation ad otthon és pénzügyi, banki, Internet of Things, ellátási lánc, a gyártás és a technológia iparági vezetői tartoznak bele. Az alapítványnak van egy pár projektre, mely az Ethereum stack-kel készült: [Besu](https://www.hyperledger.org/use/besu) és [Burrow](https://www.hyperledger.org/projects/hyperledger-burrow)._ +- [Enterprise Ethereum Alliance](https://entethalliance.org/) Az EEA lehetővé teszi a szervezetek számára, hogy bevezessék és használják az Ethereum technológiát napi üzleti tevékenységükben. Ezáltal alkalmassá tesszük az Ethereum ökoszisztémát arra, hogy új üzleti lehetőségeket jelenjenek meg, növeljük az iparági adoptációt, valamint tanuljunk és kollaboráljunk egymással. +- [Hyperledger](https://hyperledger.org) _A Hyperledger egy olyan nyílt forráskódú, kollaboratív törekvés, mely az iparágak közötti blokklánc technológiák előmozdítása érdekében jött létre. Ez egy globális együttműködés, melynek a Linux Foundation ad otthont, és különféle iparágak vezetői tartoznak bele, többek között pénzügyi, banki, dolgok internete, ellátási lánc, gyártás és technológia területéről. Az alapítványnak van néhány projektre, mely az Ethereum rendszerrel működik, mint amilyen a[Besu](https://www.hyperledger.org/use/besu) és a [Burrow](https://www.hyperledger.org/projects/hyperledger-burrow)._ ### Protokoll és infrastruktúra {#protocol-and-infrastructure} -- [Chainstack](https://chainstack.com/) _multi-cloud és multi-protokoll platform, mely egy szolgáltatásként képessé teszi a vállalkozásokat decentralizált hálózatok és szolgáltatások gyors építésére, telepítésére és kezelésére_ -- [Clearmatics Autonity](https://www.clearmatics.com/about/) _protokoll sorozat, mely p2p protokollokat implementál és kliens szoftvereket, infrastruktúrákat biztosít_ -- [Hyperledger Besu](https://www.hyperledger.org/use/besu) _Nyílt forráskódú Ethereum kliens, melyet az Apache 2.0 licensszel fejlesztettek és Java-ban írtak, számos konszenzus algortimust tartalmaz többek között a PoW-t és a PoA-t (IBFT, IBFT 2.0, Etherhash és Clique). Az átfogó engedélyező sémái kimondottan a konzorcium környezetre lettek tervezve._ -- [Hyperledger Burrow](https://www.hyperledger.org/projects/hyperledger-burrow) _moduláris blokklánc kliens engedélyköteles okosszerződés fordítóval és részben az Ethereum Virtual Machine (EVM) specifikációjára fejlesztve_ -- [Kaleido](https://kaleido.io/) _full-stack platform cross-cloud, hibrid vállalati ökoszisztémák építésére és futtatására_ -- [Quorum](https://consensys.net/quorum/) _egy Ethereum alapú, nyílt forráskódú vállalati blokklánc platform fejlett, vállalati szintű funkciókkal, melyek lehetővé teszik az adatvédelmet, engedélyezést és a teljesítményt_ +- A [Chainstack](https://chainstack.com/) _egy több felhővel és több protokollra működő platform mint szolgáltatás, mely képessé teszi a vállalkozásokat a decentralizált hálózatok és szolgáltatások gyors építésére, telepítésére és kezelésére_ +- A [Clearmatics Autonity](https://www.clearmatics.com/about/) _egy protokollsorozat, mely p2p protokollokat implementál, valamint kliens szoftvereket és infrastruktúrákat biztosít_ +- A [Hyperledger Besu](https://www.hyperledger.org/use/besu) _egy nyílt forráskódú Ethereum-kliens, melyet az Apache 2.0 licensszel fejlesztettek és Java-ban írtak, számos konszenzusalgoritmust tartalmaz, többek között a PoW-t és a PoA-t (IBFT, IBFT 2.0, Ethhash és Clique). Az átfogó engedélyező sémái kimondottan a konzorcium környezetre lettek tervezve._ +- A [Hyperledger Burrow](https://www.hyperledger.org/projects/hyperledger-burrow) _egy moduláris blokklánckliens engedélyköteles okosszerződés fordítóval, melyet részben az Ethereum Virtuális Gép (EVM) specifikációjára fejlesztettek_ +- A [Kaleido](https://kaleido.io/) _egy teljes technikai rendszert biztosító platform arra, hogy felhők közötti, hibrid vállalati ökoszisztémákat lehessen építeni és futtatni_ +- A [Quorum](https://consensys.net/quorum/) _egy Ethereum-alapú, nyílt forráskódú, vállalati blokkláncplatform fejlett, vállalati szintű funkciókkal, melyek lehetővé teszik az adatvédelmet, az engedélyezést és a megfelelő teljesítményt_ +- A [Zeeve](https://www.zeeve.io/) _az Ethereumra való építéshez nyújt termékeket és eszközöket, valamint infrastruktúrát és API-okat biztosít vállalati web3 alkalmazásoknak_ diff --git a/public/content/translations/hu/foundation/index.md b/public/content/translations/hu/foundation/index.md index 1333c4f934c..a2b8bfe1a65 100644 --- a/public/content/translations/hu/foundation/index.md +++ b/public/content/translations/hu/foundation/index.md @@ -1,6 +1,7 @@ --- title: Ethereum Alapítvány -description: Ismerd meg az Ethereum Alapítványt (EA), egy non-profit szervezetet, melynek célja az Ethereum és a hozzá kapcsolódó technológiák támogatása. +description: Ismerje meg az Ethereum Alapítványt (EF), amely egy non-profit szervezet, s célja az Ethereum és a hozzá kapcsolódó technológiák támogatása. +hideEditButton: true lang: hu --- @@ -8,26 +9,32 @@ lang: hu -Az [Ethereum Alapítvány](http://ethereum.foundation/) (EA) egy non-profit szervezet, melynek célja az [Ethereum](/what-is-ethereum/) és a kapcsolódó technológiák támogatása. +Az [Ethereum Alapítvány (EF)](http://ethereum.foundation/) egy non-profit szervezet, melynek célja az [Ethereum](/what-is-ethereum/) és a kapcsolódó technológiák támogatása. -Az EA nem egy cég, még csak nem is hagyományos non-profit. Feladatuk nem az Ethereum irányítása vagy vezetése, és ők sem az egyetlen szervezet, amely finanszírozza az Ethereumhoz kapcsolódó fontos technológiák fejlesztését. Az EF egy sokkal nagyobb [ökoszisztémának](/community/) a része. +Az Ethereum Alapítvány (EF) nem egy cég, még csak nem is hagyományos non-profit. Feladatuk nem az Ethereum irányítása vagy vezetése, és nem is az egyetlen szervezet, amely finanszírozza az Ethereumhoz kapcsolódó, fontos technológiák fejlesztését. Az EF egy sokkal nagyobb [ökoszisztémának](/community/) a része. ## Ethereum Alapítvány Kezdeményezések {#ethereum-foundation-initiatives} ### Ecosystem Támogatási Program {#ecosystem-support-program} -Az [Ecosystem Támogatási Program](https://esp.ethereum.foundation/) célja, hogy anyagi és nem anyagi támogatást nyújtson projekteknek és egyéneknek a tágabb Ethereum közösségen belül, hogy felgyorsítsa a növekedést az ökoszisztémán belül. Az Ecosystem Támogatási program az eredeti Ethereum Grants Program kibővítése, amely főként a pénzügyi támogatásra összpontosított. +Az [Ökoszisztéma Támogatási Program](https://esp.ethereum.foundation/) célja, hogy pénzügyi és nem pénzügyi támogatást nyújtson projekteknek és egyéneknek a tágabb Ethereum közösségen belül, hogy felgyorsítsa az ökoszisztéma növekedését. Az Ökoszisztéma Támogatási Program az eredeti Ethereum támogatási/ösztöndíj program kibővítése, amely főként a pénzügyi támogatásra összpontosított. -Tudj meg többet az Ecosystem Támogatási Programról, korábbi ösztöndíjasokról és az ösztöndíj jelentkezési folyamatról az [esp.ethereum.foundation](https://esp.ethereum.foundation/) oldalon. Ezenkívül megnézheted az [Ecosystem Support Program Blogot](https://blog.ethereum.org/category/ecosystem-support-program/) vagy bekövetheted az [@EF_ESP](https://twitter.com/EF_ESP) oldalt a legutóbbi hírekért és bejelentésekért. +Tudjon meg többet az Ökoszisztéma Támogatási Programról, korábbi ösztöndíjasokról és az ösztöndíj jelentkezési folyamatáról az [esp.ethereum.foundation](https://esp.ethereum.foundation/) oldalon. Ezenkívül megnézheti az [Ökoszisztéma Támogatási Program Blogját](https://blog.ethereum.org/category/ecosystem-support-program/) vagy követheti az [@EF_ESP](https://twitter.com/EF_ESP) oldalt a legfrissebb hírekért és bejelentésekért. ### Devcon {#devcon} -Az Ethereum Alapítvány 2014 óta szervezi a Devcont, az Ethereum összes fejlesztőjének, kutatójának, gondolkodójának és alkotójának éves konferenciáját. +Az Ethereum Alapítvány 2014 óta szervezi a Devcont, az Ethereum éves konferenciáját, mely egy helyre gyűjti a fejlesztőket, kutatókat, gondolkodókat és alkotókat. -Hozzáférhetsz az összes konferencia prezentáció videó tartalmához a kezdetektől az [archive.devcon.org](https://archive.devcon.org/) oldalon. +Hozzáférhet az összes konferencián elhangzó előadás videójához a kezdetektől az [archive.devcon.org](https://archive.devcon.org/) oldalon. -Tudj meg többet a [devcon.org](https://devcon.org/) oldalon, nézd meg a [Devcon Blogot](https://devcon.org/en/blogs/), vagy kövesd be az [@efdevcon](https://twitter.com/EFDevcon) oldalt a legfrissebb bejelentésekért. +Tudjon meg többet a [devcon.org](https://devcon.org/) oldalon, tekintse meg a [Devcon Blogot](https://devcon.org/en/blogs/), vagy kövesse a [@efdevcon](https://twitter.com/EFDevcon) csatornát a legfrissebb információkért. + +### Ösztöndíjas program {#fellowship-program} + +Az [Ethereum Alapítvány Ösztöndíjas Programja](https://fellowship.ethereum.foundation/) egy olyan kezdeményezés, mely a kulturális, nemzeti és gazdasági csoportok egyenlő arányú jelenlétét akarja elősegíteni. A program úgy akarja áthidalni a szakadékokat, hogy kivételes és tehetséges egyéneket azonosít és támogat, hogy lehetővé tegyék azt Ethereum fontosságát e csoportok számára, elhárítsák azokat az akadályokat, amelyek miatt a távolmaradó emberek és közösségek nem tudnak csatlakozni az Ethereum világához, pedig ők jelentik a web3 jövőjét. + +[Tudjon meg többet a fellowship.ethereum.foundation oldalon](https://fellowship.ethereum.foundation/).
    -További információkért az Alapítványról látogasd meg az [ethereum.foundation](http://ethereum.foundation/) weboldalt, vagy nézd meg az [Ethereum Foundation Blogot](https://blog.ethereum.org/) a legfrissebb EA hírekért és bejelentésekért. +További információkért az Alapítványról látogasson el az [ethereum.foundation](http://ethereum.foundation/) weboldalra, vagy nézze meg az [Ethereum Alapítvány Blogot](https://blog.ethereum.org/) a legfrissebb hírekért és bejelentésekért. diff --git a/public/content/translations/hu/glossary/index.md b/public/content/translations/hu/glossary/index.md index 206910322c6..6ccad466723 100644 --- a/public/content/translations/hu/glossary/index.md +++ b/public/content/translations/hu/glossary/index.md @@ -2,816 +2,435 @@ title: Ethereum szótár description: Szójegyzék az Ethereumhoz kapcsolódó technikai és nem technikai szavakról, a teljesség igénye nélkül lang: hu -sidebarDepth: 2 --- -# Összegzés {#ethereum-glossary} +# Szójegyzék {#ethereum-glossary} - - -## # {#section-numbers} +## \# {#section-numbers} -### 51% attack (51%-os támadás) {#51-attack} + -Egy decentralizált [hálózat](#network) ellen irányuló támadás, amikor egy csoport irányítja a [csomópontok](#node) többségét. Ez lehetővé tenné számukra, hogy meghamisítsák a blokkláncot [tranzakciók](#transaction) visszaállításával és [ether](#ether) vagy más token kétszeres elköltésével. + ## A {#section-a} -### account (számla) {#account} - -Egy objektum, mely egy [címet](#address), egy egyenleget, [egy nonce-t](#nonce), és opcionálisan tárhelyet és kódot tartalmazhat. Egy számla lehet [szerződéses számla](#contract-account) vagy egy [külső tulajdonú számla (EOA)](#eoa). - - - Ethereum számlák - + -### address (cím) {#address} + -Általánosságban ez egy [EOA-t](#eoa) vagy egy [szerződést](#contract-account) reprezentál, mely fogadhat (cél cím) vagy küldhet (eredő cím) [tranzakciókat](#transaction) a blokkláncon. Pontosabban ez egy [ECDSA](#ecdsa) [publikus kulcs](#public-key) [Keccak hashének](#keccak-256) jobb oldalra eső 160 bitje. + -### assert {#assert} + -A [Solidity-ben](#solidity), az `assert(false)` a `0xfe` opkódra fordítódik, mely egy érvénytelen opkód, ami felhasználja az összes megmaradt [gázt](#gas) és visszaállítja a változásokat. Ha egy `assert()` állítás meghiúsul, akkor valami nagyon rossz és váratlan történik, és meg kell javítanod a kódot. Az `assert()` kódot, olyan feltételek elkerülésére kell használnod, melynek soha sem szabad megtörténnie. + - - Biztonság - + -### attestation (tanúsítás) {#attestation} - -Egy validátor szavazata egy [Beacon Chain](#beacon-chain) vagy egy [shard](#shard) [blokkra](#block). A validátoroknak tanúsítaniuk kell a blokkokat, jelezve, hogy egyetértenek a blokk által javasolt állapottal. + ## B {#section-b} -### Beacon Chain {#beacon-chain} + + + -Egy Eth2 fejlesztés, mely az Ethereum hálózat koordinátora lesz. Bevezeti a [letétbizonyítékot](#proof-of-stake) és a [validátorokat](#validator) az Ethereumra. Idővel össze fog olvadni a [főhálózattal](#mainnet). + - - Beacon Chain - + -### big-endian {#big-endian} + -Helyzeti számábrázolás, ahol a legfontosabb számjegy az első a memóriában. A little-endian az ellentéte, ahol a legkevésbé jelentős számjegy az első. + -### blokk {#block} + -A szükséges információ (egy blokk fejléc) gyűjteménye a befoglalt [tranzakciókról](#transaction), és más blokk fejlécek halmaza, melyet [ommereknek](#ommer) hívunk. A blokkokat a [bányászok](#miner) adják hozzá az Ethereum hálózathoz. + - - Blokkok - + -### blokklánc {#blockchain} + -Az Ethereumban [blokkok](#block) sorozatát jelenti, melyeket a [proof-of-work](#pow) rendszer érvényesít, mindegyik kapcsolódik az előzőhöz egészen a [genezis blokkig](#genesis-block). Nincsen blokk méret határ, ehelyett [gáz limitet](#gas-limit) használunk. + - - Mi az a blokklánc? - + -### bytecode {#bytecode} + -Egy absztrakt utasításkészlet, amelyet egy szoftver fordító vagy virtuális gép általi hatékony végrehajtásra terveztek. Az emberek által is olvasható forráskóddal ellentétben a bájtkód numerikus formátumban van kifejezve. + -### Byzantium fork (Byzantium elágazás) {#byzantium-fork} + -Az első a két [hard forkból](#hard-fork) a [Metropolis](#metropolis) fejlesztési szinthgez. Tartalmazta az EIP-649 Metropolis [nehézség bomba](#difficulty-bomb) késeltetést és a blokk jutalom csökkentését, ahol az [Ice Age](#ice-age) el lett tolva 1 évvel és a blokk jutalom lecsökkent 5 etherről 3 etherre. + ## C {#section-c} -### compiling (fordítás) {#compiling} - -Egy magas szintű nyelvben (pl.: [Solidity](#solidity)) írt kód átkonvertálása egy alacsonyabb szintű nyelvre (pl.: EVM [bájtkód](#bytecode)). - - - Okos szerződések fordítása - + -### committee (bizottság) {#committee} + -Legalább 128 [validátorból](#validator) álló csoport, akiket hozzárendeltek a beacon vagy shard blokkok validálására véletlenszerűen [a Beacon Chain](#beacon-chain) által. + -### consensus (konszenzus) {#consensus} + -Ha számos csomópont (általában a legtöbb csomópont a hálózaton) ugyanazokkal a blokkokkal rendelkezik a saját lokálisan validált legjobb blokkláncukon. Nem összekeverendő a [konszenzus szabályokkal](#consensus-rules). + -### consensus rules (konszenzus szabályok) {#consensus-rules} + -A blokk érvényesítési szabályai, amelyeket a teljes csomópontok követnek, hogy más csomópontokkal konszenzusban maradjanak. Nem összekeverendő a [konszenzussal](#consensus). + -### Constantinople fork (Constantinople elágazás) {#constantinople-fork} + -A [Metropolis](#metropolis) fázis második része, eleinte 2018 közepére tervezték. Egy váltást tartalmazott volna egy hibrid [proof-of-work](#pow)/[proof-of-stake](#pos) konszenzus algoritmusra más változtatásokkal együtt. + -### contract account (szerződéses számla) {#contract-account} + -Egy számla, mely kódot tartalmaz, mely lefut, amikor kap egy [tranzakciót](#transaction) egy másik [számláról](#account) ([EOA](#eoa) vagy [szerződéses](#contract-account)). + -### contract creation transaction (szerződés létrehozó tranzakció) {#contract-creation-transaction} + -Egy speciális [tranzakció](#transaction), a [zéró címmel](#zero-address) mint a fogadó, melyet arra használunk, hogy egy [szerződést](#contract-account) regisztráljunk és rögzítsük az Ethereum blokkláncra. - -### crosslink (kereszt kapcsolat) {#crosslink} - -A kereszt kapcsolat egy összesítést ad vissza egy shard állapotáról. Így fognak a [shard](#shard) láncok kommunikálni egymással [Beacon Chain-en](#beacon-chain) keresztül a [proof-of-stake rendszerben](#proof-of-stake). - - - Proof-of-stake - + ## D {#section-d} -### Decentralized Autonomous Organization (DAO) {#dao} - -Egy olyan vállalat vagy szervezet, amely hierarchikus menedzsment nélkül működik. A DAO utalhat a "The DAO" nevű szerződésre, melyet 2016 április 30.-án indítottak, és 2016 júniusában meghackeltek; ez végül erősen motiválta a [hard forkot](#hard-fork) (DAO kódnév) az 1,192,000 blokkban, mely visszaállította a meghackelt DAO szerződést és az Ethereum és az Ethereum Classic szétválását okozta két rivális rendszerré. - - - Decentralizált autonóm szervezetek (DAO-k) - - -### Dapp {#dapp} - -Decentralizált alkalmazás. Legalább egy [okosszerződés](#smart-contract) és egy webes felhasználói felület. Tágabb értelemben egy dapp egy olyan web alkalmazás, mely egy decentralizált, peer-to-peer infrastruktúra szolgáltatásra épült. Továbbá sok dapp tartalmazhat decentralizált tárhelyet és/vagy egy üzenetküldő protokollt és platformot. - - - Bevezetés a dappokba - + -### decentralizált tőzsde (DEX) {#dex} + -Egy [dapp](#dapp) típus, mellyel tokeneket cserélhetsz a peerekkel a hálózaton. Szükséged lesz [etherre](#ether) a használatukhoz (a [tranzakciós díjak](#transaction-fee) kifizetésére) de nincsenek kitéve a földrajzi megszorításoknak, mint a centralizált tőzsdék – bárki használhatja őket. + - - Decentralizált tőzsdék - + -### deed {#deed} + -Lásd [nem felcserélhető token (NFT)](#nft) + -### defi {#defi} + -A "decentralized finance", vagyis "decentralizált pénzügy" rövidítése, amely olyan [Dappok](#dapp) széles kategóriája, melyeknek célkitűzése blokklánc alapú pénzügyi szolgáltatások létrehozása, köztes szereplők nélkül, így bárki részt vehet benne internetkapcsolattal. + - - Defi dappok - + -### difficulty (nehézség) {#difficulty} + -Egy hálózati szintű beállítás, mely beszabályozza, hogy mennyi számítás szükséges egy [proof-of-work](#pow) létrehozásához. + -### difficulty bomb (nehézség bomba) {#difficulty-bomb} + -A [proof-of-work](#pow) [nehézség](#difficulty) tervezett exponenciális megnövelése, mely motiválja a [proof-of-stake-re](#pos) történő átállást, csökkenti a [forknak](#hard-fork) a változásait + -### digitális aláírás {#digital-signatures} + -Egy rövid adat sztring, melyet egy felhasználó hoz létre egy dokumentumhoz egy [privát kulcs](#private-key) használatával úgy, hogy bárki a hozzátartozó [publikus kulccsal](#public-key), az aláírással és a dokumentummal hitelesíteni tudja, hogy (1) a dokumentumot "aláírta" a bizonyos privát kulcs tulajdonosa, és (2) a dokumentum nem változott miután aláírták. + ## E {#section-e} -### elliptikus görbe digitális aláírás algoritmus (ECDSA) {#ecdsa} + -Az Ethereum által használt kriptográfiai algoritmus, mely biztosítja, hogy a javakat csak a tulajdonosok költhetik el. + -### epoch (korszak) {#epoch} + -Egy 32 [slotból](#slot) álló periódus (6.4 perc) a [Beacon Chain](#beacon-chain)-által koordinált rendszerben. A [validátor](#validator) [bizottságokat](#committee) összekeverik minden korszakban biztonsági okokból. Minden korszakban esély van a lánc [véglelesítésére](#finality). + - - Proof-of-stake - + -### Ethereum Fejlesztési Javaslatok (EIP-k) {#eip} + -Tervezési dokumentum, amely információkat nyújt az Ethereum közösség számára, és ismerteti a javasolt új funkciót, annak folyamatait vagy környezetét (lásd [ERC](#erc)). + - - Bevezetés az EIP-kbe - + -### Ethereum Name Service (ENS) {#ens} + -Az ENS jegyzés az egyedüli, központi [szerződés](#smart-contract), mely egy leképezést szolgáltat a domén nevek és a tulajdonosok és a feloldók között, ahogy az [EIP](#eip) 137-ben elő van írva. + -[Olvass róla többet a ens.domains](https://ens.domains) + -### entrópia {#entropy} + -A kriptográfia kontextusában a megjósolhatóság hiányát vagy a véletlenszerűség mértékét jelenti. Amikor titkos információkat generálunk, mint a [privát kulcsok](#private-key), az algoritmusok általában egy magas entrópia forrásra támaszkodnak, hogy biztosítsák a kimenet megjósolhatatlanságát. + -### externally owned account (EOA) {#eoa} + -Egy emberi felhasználók által vagy számára létrehozott [számla](#account) az Ethereum hálózaton. + -### Ethereum Request for Comments (ERC) {#erc} + -Néhány [EIP-hez](#eip) tartozó címke, melyek specifikus Ethereum használati szabványokat definiálnak. + - - Bevezetés az EIP-kbe - - -### Ethash {#ethash} - -Az Ethereum 1.0 [munkabizonyíték](#pow) algoritmusa. - -[Olvass róla többet a eth.wiki oldalon](https://eth.wiki/en/concepts/ethash/ethash) - -### ether {#ether} - -Az Ethereum ökoszisztéma által használt natív kriptovaluta, mely fedezi a [gáz](#gas) költségeket tranzakciók végrehajtásakor. Írásban találkozhatunk vele ETH-ként vagy a Ξ szimbólumként is, ami a nagybetűs görög kszí karakter. - - - A digitális jövőnk valutája - - -### events (események) {#events} - -Az [EVM](#evm) logolási lehetőségeinek használatát teszi lehetővé. A [dappok](#dapp) figyelhetik az eseményeket és a használatukkal JavaScript callback függvényeket triggerelhetnek az felhasználói felületen. - - - Események és naplózások - - -### Ethereum virtuális gép (EVM) {#evm} - -Egy stack alapú virtuális gép, mely [bájtkódot](#bytecode) futtat. Az Ethereumban a lefutási modell előírja, hogyan fog a rendszerállapot megváltozni adott bájtkód sorozattól és a környezeti adatok egy kis sorától. Ez a virtuális állapot gép formális modelljében van előírva. - - - Ethereum virtuális gép - - -### EVM assembly nyelv {#evm-assembly-language} - -Az EVM [bájtkód](#bytecode) emberek számára is olvasható változata. + ## F {#section-f} -### fallback függvény {#fallback-function} - -Egy alap függvény, mely adat vagy deklarált függvény név hiánya esetén hívódik meg. - -### faucet (csap) {#faucet} - -Egy [okosszerződés](#smart-contract) által működtetett szolgáltatás, mely javakat bocsájt ki ingyenes teszt ether formájában, melyet a tesztneten lehet használni. + - - Tesztnet csapok - + -### véglegesség {#finality} + -A véglegesség a garancia arra, hogy az adott tranzakciók egy bizonyos idő előtt nem fognak megváltozni és nem lehet visszavonni őket. + - - Proof-of-work véglegesség - - Proof-of-stake véglegesség - + -### finney {#finney} + -Az [ether](#ether) egyik részegysége. 1 finney = 1015 [wei](#wei). 103 finney = 1 ether. + -### fork (elágazás) {#fork} - -Egy protokoll változtatás, mely egy alternatív lánc létrejöttét vonja magával, vagy egy átmeneti eltérés két potenciális blokk útvonal között bányászat közben. - -### fraud proof (csalási bizonyítás) {#fraud-proof} - -Bizonyos [2. réteg](#layer-2) megoldások biztonsági modellje, ahol a sebesség növelése érdekében a tranzakciókat csoportokba [összegzik](#rollups) és egy tranzakcióként továbbítják az Ethereumra. Érvényesnek feltételezzük őket, de meg lehet kérdőjelezni, ha csalást feltételezünk. Ekkor lefut egy csalási bizonyítás, mely ellenőrzi, hogy történt-e csalás. Ez a módszer növeli a lehetséges tranzakciók mennyiségét mialatt fenntartja a biztonságot. Néhány [összegző](#rollups) [érvényességi bizonyítást](#validity-proof) használ. - - - Optimista összegzők - - -### frontier {#frontier} - -Az Ethereum kezdeti teszt fejlesztési fázisa, mely 2015 júliusától 2016 márciusáig tartott. + ## G {#section-g} -### gas (gáz) {#gas} - -Egy virtuális üzemanyag, melyet az Ethereumon használunk okosszerződések végrehajtására. Az [EVM](#evm) egy könyvelési mechanizmust használ, amivel méri a gázfogyasztást és behatárolja a számítási kapacitások fogyasztását (lásd [Turing teljes](#turing-complete)). - - - Gáz és tranzakciós díjak - - -### gas limit (gáz limit) {#gas-limit} + -A [gáz](#gas) maximális mennyisége, amit egy [tranzakció](#transaction) vagy egy [blokk](#block) elfogyaszthat. + -### genesis blokk {#genesis-block} + -Egy [blokklánc](#blockchain) első blokkja, amit egy adott hálózat és a kriptovalutája elindítására használnak. + -### geth {#geth} + -Go Ethereum. Az Ethereum egyik legprominensebb implementációja Go-ban írva. - -[Olvass róla többet a geth.ethereum.org oldalon](https://geth.ethereum.org/) - -### gwei {#gwei} - -A gigawei rövidítése, az [ether](#ether) egyik részegysége, gyakran a [gáz](#gas) díjak elszámolására használjuk. 1 gwei = 109 [wei](#wei). 109 gwei = 1 ether. + ## H {#section-h} -### hard fork {#hard-fork} - -A [blokklánc](#blockchain) permanens eltérése; más néven hard-forking változás. Gyakran előfordul, amikor a nem frissített csomópontok nem tudnak blokkokat validálni, melyet a frissített csomópontok hoztak létre, akik az új [konszenzus szabályokat](#consensus-rules) követik. Nem összetévesztendő a forkkal, soft forkkal, software forkkal, vagy a Git forkkal. - -### hash {#hash} - -Egy változó méretű bemenet fix hosszúságú lenyomata, melyet egy hash függvény állít elő. (Lásd [keccak-256](#keccak-256)) - -### HD tárca {#hd-wallet} - -Egy [tárca](#wallet), mely a hierarchikus determinisztikus (HD) kulcs létrehozást és átutalási protokollt használja. + -[Olvass róla többet a github.com oldalon](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) + -### HD tárca seed {#hd-wallet-seed} + -Egy érték, melyet a master [privát kulcs](#private-key) és a master lánc kód generálásához használnak a HD [tárcáknál](#wallet). A tárca seed reprezentálható mnemonikus szavakkal, így az embereknek könnyebb lemásolni és tárolni a privát kulcsokat. - -### homestead {#homestead} - -Az Ethereum második fejlesztési fázisa, mely 2016 márciusában indult el az 1,150,000 számú blokknál. + ## I {#section-i} -### Inter-exchange Client Address Protocol (ICAP) {#icap} - -Egy Ethereum cím kódolás, mely részben kompatibilis az International Bank Account Number (IBAN) kódolással, és sokoldalú, checksum ellenőrzött és interoperábilis kódolást kínál az Ethereum címek számára. Az ICAP címek az új IBAN pszeudo-ország kódot használják- XE, mely az "eXtended Ethereum" névből következik, ahogy a nem-hivatalos valuták használják (pl.: XBT, XRP, XCP). - -### Ice Age {#ice-age} - -Egy Ethereum [hard fork](#hard-fork) a 200,000 blokknál, mely bevezeti az exponenciális [nehézségi](#difficulty) növelést (más néven[nehézségi bomba](#difficulty-bomb)), hogy a [proof-of-stake-re](#pos) való átállást motiválja. - -### integrált fejlesztői környezet (IDE) {#ide} - -Egy felhasználói felület, mely általában egy kód szerkesztőt, egy fordítót, egy runtime-ot és egy debuggert egyesít. - - - Integrált Fejlesztői Környezetek - - -### immutable deployed code problem (nem megváltoztatható kód problémája) {#immutable-deployed-code-problem} + -Amint egy [szerződés](#smart-contract) (vagy [könyvtár](#library)) kód telepítésre került, megváltoztathatatlanná válik. A standard szoftverfejlesztési gyakorlat a lehetséges bugok javítására és új funkciók hozzáadására támaszkodik, így ez egy kihívást jelent az okosszerződés fejlesztésnél. + - - Okosszerződések telepítése - + -### internal transaction (belső tranzakció) {#internal-transaction} + -Egy [tranzakció](#transaction) egy [szerződéses számláról](#contract-account) egy másik szerződéses számlára vagy egy [EOA-ra](#eoa) (lásd [üzenet](#message)). + ## K {#section-k} -### kulcsszármaztatási függvény (KDF) {#kdf} + -Más néven "jelszó nyújtó algoritmus", melyet a [keystore](#keystore-file) formátumok használnak, hogy védekezzenek a brute-force, dictionary és a szivárvány tábla támadásokkal szemben a jelszó titkosításoknál a jelszó ismételt hashelésével. + - - Biztonság - - -### keccak-256 {#keccak-256} - -Az Ethereumban használt kriptográfiai [hash](#hash) függvény. A Keccak-256 [SHA](#sha)-3-ként lett szabványosítva. - -### keystore fájl {#keystore-file} - -Egy JSON kódolású fájl, mely egy (véletlenszerűen generált) [privát kulcsot](#private-key) tartalmaz, melyet egy jelszó titkosít magasabb fokú biztonságért. + ## L {#section-l} -### layer 2 (2. réteg) {#layer-2} - -Egy fejlesztési terület, mely az Ethereum protokollra épített fejlesztési rétegekre fókuszál. Ezek a fejlesztések a [tranzakciókhoz](#transaction) sebességhez, olcsóbb[tranzakciós díjakhoz](#transaction-fee) és a privát tranzakciókhoz kapcsolódnak. - - - 2. réteg - - -### LevelDB {#level-db} - -Egy nyílt forráskódú on-disk, kulcspár tároló, mely egy könnyű, egyedi célú [könyvtárként](#library) van implementálva több kapcsolódással más platformokhoz. + -### library (könyvtár) {#library} + -Egy speciális [szerződés](#smart-contract) típus, melynek nincsenek payable függvényei, fallback függvényei vagy adattárolója. Így nem tud ethert tartani vagy kapni, illetve adatot tárolni. Egy könyvtár korábban telepített kódként szolgál, melyet más szerződések meghívhatnak read-only számítás céljából. + - - Okosszerződés könyvtárak - - -### lightweight client (könnyű kliens) {#lightweight-client} - -Egy Ethereum kliens, mely nem tárolja a [blokklánc](#blockchain) lokális másolatát, nem validál blokkokat és [tranzakciókat](#transaction). Egy [tárca](#wallet) funkcionalitását szolgáltatja és tranzakciókat tud létrehozni és közvetíteni. + ## M {#section-m} -### Mainnet (főhálózat) {#mainnet} - -A "main network" rövidítése, ez a fő nyilvános Ethereum [blokklánc](#blockchain). Valódi ETH, valódi érték, és valódi következmények. 1. rétegként is hivatkozunk rá, amikor a [2. rétegű](#layer-2) skálázhatósági megoldásokról beszélünk. (Ezenkívül lásd [tesztnet](#testnet)) - -### Merkle Patricia fa {#merkle-patricia-tree} - -Egy adat struktúra az Ethereumban, mellyel hatékonyan lehet kulcs-érték párokat tárolni. + -### message (üzenet) {#message} + -Egy [belső tranzakció](#internal-transaction), mely sosincs sorba rendezve és csak az [EVM](#evm) belül kerül elküldésre. + -### message call (üzenet hívás) {#message-call} + -Egy [üzenet](#message) átadása egyik számláról egy másikba. Ha a cél számla összeköttetésben van [EVM](#evm) kóddal, akkor a VM elindul az adott objektum állapotával és az üzenettel, mellyel meghívták. + -### Metropolis {#metropolis} + -Az Ethereum harmadik fejlesztési fázisa, mely 2017 októberében indult el. - -### miner (bányász) {#miner} - -Egy hálózati [csomópont](#node), mely érvényes [munkabizonyítékokat](#pow) keres az új blokkoknak ismételt hasheléssel (lásd [Ethash](#ethash)). - - - Bányászat - + ## N {#section-n} -### network (hálózat) {#network} - -Az Ethereum hálózatra utal, mely egy peer-to-peer hálózat, mely tranzakciókat és blokkokat terjeszt az összes Ethereum csomópont (hálózati résztvevő) számára. + - - Hálózatok - + -### nem felcserélhető token (NFT) {#nft} + -Más néven "deed", ez egy token szabvány, melyet az ERC-721 javaslat vezetett be. Az NFT-ket nyomon lehet követni és kereskedni velük, de minden egyes token egyedi és különböző; nem felcserélhetőek, mint az ERC-20 tokenek. Az NFT-k tulajdonjogot reprezentálhatnak digitális vagy fizikai eszközöknél. + - - ERC-721 Nem Felcserélhető Token Szabvány - - -### node (csomópont) {#node} - -Egy szoftver kliens, mely részt vesz a hálózatban. - - - Csomópontok és kliensek - - - - Csomópontok és kliensek - - -### nonce {#nonce} - -A kriptográfiában egy olyan érték, melyet csak egyszer lehet felhasználni. Az Ethereum kétféle nonce-ot használ -a számla-nonce a tranzakciók számlán történő nyilvántartásához szükséges, és a tranzakciók megismétlésével történő támadások megelőzésére használja a hálózat; a [munkabizonyíték](#pow)-nonce pedig az a blokkban használt véletlenszerű érték, amely [munkabizonyítékként](#pow) szolgál. + ## O {#section-o} -### ommer (vagy uncle - nagybácsi) blokk {#ommer} - -Amikor egy [bányász](#miner) talál egy érvényes [blokkot](#block), lehetséges, hogy egy másik bányász már nyilvánosságra hozott egy másik blokkot, ami előbb kerül be a blokkláncba. Ez az érvényes, ugyanakkor elavult blokk _ommerként_ bekerülhet a blokkláncba az újabb blokkok által, és részleges blokk-jutalomban részesülhet. Az "ommer" kifejezés a szülő-blokk testvér-blokkjának gender-semleges formája, de néha "uncle", azaz "nagybácsi" blokként is hivatkoznak rá. - -### Optimistic rollup (Optimistic típusú összevont tranzakciók) {#optimistic-rollup} + -Olyan [összevont tranzakció](#rollups), amely [csalási bizonyítást](#fraud-proof) használ annak érdekében, hogy növelje a [2. rétegen](#layer-2) végrehajtható tranzakciók számát, ugyanakkor a [főhálózat](#mainnet) (1. réteg) biztonsági protokollját használja. Ellentétben egy hasonló 2. réteges megoldással, a [Plasmával](#plasma), az Optimistic típusú összevont tranzakciók komplexebb tranzakciókat is képesek kezelni - az [EVM](#evm)-ben bármi lehetséges. Vannak azonban késleltetési problémái a [Zero-knowledge típusú összevont tranzakciókhoz](#zk-rollups) képest, mivel egy tranzakciót meg lehet kérdőjelezni egy csalási bizonyítással. + - - Optimista összegzők - + ## P {#section-p} -### parity {#parity} + -Az Ethereum kliens szoftver egyik legprominensebb, interoperábilis implementációja. + -### Plasma {#plasma} + -Egy [2. réteges](#layer-2)skálázási megoldás, mely [csalási bizonyításokat használ](#fraud-proof), mint az [optimista összegzők](#optimistic-rollups). A Plasma csak egyszerű tranzakciókra alkalmas, mint az egyszerű token átutalás vagy cserélés. + - - Plasma - + -### private key (secret key) / privát kulcs (titkos kulcs) {#private-key} + -Egy titkos szám, mely lehetővé teszi az Ethereum felhasználóknak, hogy bizonyítsák a tulajdonjogukat egy számlához vagy szerződéshez egy digitális aláírással (lásd [publikus kulcs](#public-key), [cím](#address), [ECDSA](#ecdsa)). + -### proof-of-stake (PoS) / letétbizonyíték {#pos} - -Egy metódus, mellyel egy kriptovaluta blokklánc protokoll eléri az elosztott [konszenzust](#consensus). A PoS utasítja a felhasználókat, hogy bizonyítsák a tulajdonjogukat egy bizonyos összegű kriptovaluta felett (a "letétük" a hálózatban) azért, hogy részt vehessenek a tranzakciók validálásában. - - - Proof-of-stake - - -### proof-of-work (PoW) / munkabizonyíték {#pow} - -Egy adatsor (a bizonyíték), melynek megtalálása jelentős mennyiségű számítást igényel. Az Ethereumban a [bányászoknak](#miner) meg kell találniuk a numerikus megoldását az [Ethash](#ethash) algoritmusnak, mely eléri a hálózati szintű [nehézségi](#difficulty) célt. - - - Proof-of-work - - -### public key (publikus kulcs) {#public-key} - -Egy a [privát kulcsból](#private-key) egy egyirányú függvénnyel származtatott szám, amelyet nyilvánosan meg lehet osztani, és bárki felhasználhatja az ehhez tartozó privát kulccsal készült digitális aláírások hitelesítéséhez. + ## R {#section-r} -### receipt (visszaigazolás) {#receipt} - -Egy Ethereum kliens által visszadott adat, mely egy adott [tranzakció](#transaction) eredményét reprezentálja, beleértve a tranzakció [hash-t](#hash), a [blokk](#block) számát, a felhasznált [gáz](#gas) mennyiséget, és, egy [okosszerződés](#smart-contract) telepítés esetében, a szerződés [címét](#address). - -### re-entrancy attack (újbóli belépés támadás) {#re-entrancy-attack} + -Egy támadás, mely során egy támadó szerződés meghívja az áldozat szerződés egyik függvényét úgy, hogy újra meghívja a függvényt lefutás közben rekurzívan. Ez például a pénz ellopását eredményezheti úgy, hogy kihagy egy pár lépést az áldozat szerződéséből, mely frissítené az egyenlegeket vagy számolná a kiutalási mennyiségeket. + - - Újbóli belépés (re-entrancy) - + -### reward (jutalom) {#reward} + -Egy minden egyes blokkban jelenlévő ether mennyiség, mely a jutalom a [bányásznak](#miner), aki megtalálta a [proof-of-work](#pow) megoldást. + -### Recursive Length Prefix (RLP) {#rlp} - -Egy Ethereum fejlesztők által megtervezett kódolási szabvány tetszőlegesen komplex és tetszőlegesen hosszú objektumok (adat struktúrák) kódolására és sorosítására. - -### rollups (összevont tranzakciók) {#rollups} - -A [2. réteg](#layer-2) skálázódásának egyik módszere, amely több tranzakciót gyűjt össze, és egyszerre, egyetlen tranzakcióban küldi el őket az [Ethereum főhálózatára](#mainnet). Ez lehetővé teszi a [gáz](#gas) költségének csökkentését, és növeli a feldolgozható [tranzakciók](#transaction) számát. Vannak Optimistic és Zero-knowledge típusú összevont tranzakciók, melyek különböző biztonsági módszert használnak, hogy elérjék a skálázási eredményt. - - - Összegzők - + ## S {#section-s} -### Serenity {#serenity} - -Az Ethereum negyedik és végső fejlesztési fázisa. - - - Ethereum 2.0 (Eth2) - - -### Secure Hash Algorithm (SHA) {#sha} - -Kriptográfiai hash függvények egy családja, melyet a National Institute of Standards and Technology (NIST) adott ki. + -### shard / shard lánc {#shard} + -Egy [proof-of-stake](#proof-of-stake) lánc, melyet a [Beacon Chain](#beacon-chain) koordinált és a [validátorok](#validator) tartják biztonságban. 64 lesz hozzáadva a hálózathoz az Eth2 shard lánc fejlesztés részeként. A shard láncok megnövelt tranzakció átvitelt tesznek majd lehetővé az Ethereumon extra adat szolgáltatással az olyan [2. réteg](#layer-2) megoldások részére, mint az [optimista összegzők](#optimistic-rollups) és az [ZK összegzők](#zk-rollups). + - - Shard láncok - + -### Sidechain (melléklánc) {#sidechain} + -Egy skálázási megoldás, mely egy különálló láncot használ másfajta, gyakran gyorsabb, [konszenzus szabályokkal](#consensus-rules). Egy áthidalás szükséges, hogy ezek a mellékláncok a [főhálózathoz](#mainnet) csatlakozzanak. Az [összegzők](#rollups) szintén mellékláncokat használnak, de ehelyett a [főhálózattal](#mainnet) együttműködve teszik ezt. + - - Mellékláncok - + -### singleton {#singleton} + -Egy számítógép programozási fogalom, mely egy olyan objektumot jelent, aminek csak egy példánya létezhet. + -### slot {#slot} + -Időperiódus (12 másodperc), amely alatt egy új [Beacon Chain](#beacon-chain) és [shard](#shard) lánc blokkot terjeszthet elő egy [validátor](#validator) a [letétbizonyíték](#proof-of-stake) alapú rendszerben. A slot lehet üres is. 32 slot tesz ki egy [epochát](#epoch). + - - Proof-of-stake - + -### smart contract (okosszerződés) {#smart-contract} + -Egy program, amelyet az Ethereum számítási infrastruktúráján lehet futtatni. + - - Bevezetés az okosszerződésekbe - + -### Solidity {#solidity} + -Egy eljárásközpontú (imperatív) programozási nyelv, amelynek szintaxisa hasonló mint a JavaScript, a C++ és a Java. Az Ethereum [okosszerződések](#smart-contract) legnépszerűbb, leggyakrabban használt programozási nyelve. Dr. Gavin Wood alkotta meg. + - - Solidity - + -### Solidity inline assembly {#solidity-inline-assembly} + -A [Solidity](#solidity) programokban használható [EVM](#evm) assembly nyelv. Az inline assembly támogatottsága a Solidity-ben megkönnyíti bizonyos műveletek írását. + -### Spurious Dragon {#spurious-dragon} + -Az Ethereum blokklánc [hard-forkja](#hard-fork), ami a 2.675.000 számú blokknál ment végbe, a szolgáltatásmegtagadási támadások kiküszöbölésének érdekében. (Lásd: [Tangerine Whistle](#tangerine-whistle)). Ezen kívül egy újrajátszási támadások elleni mechanizmust is magában foglalt (lásd: [nonce](#nonce)). + -### stablecoin (stabil értékű token) {#stablecoin} - -Olyan [ERC-20 token](#token-standard), amelynek értéke egy másik vagyontárgyéhoz van kötve. Léteznek hagyományos devizához, például dollárhoz, nemesfémekhez, például aranyhoz, és más kriptovalutákhoz, például Bitcoinhoz kötött értékű stablecoinok. - - - Az ETH nem az egyedüli kripto az Ethereumon - - -### staking (letétbe helyezés) {#staking} - -Adott mennyiségű [ether](#ether) letétbe helyezése a validátorrá válás és a [hálózat](#network) biztosításának érdekében. A validátor ellenőrzi a [tranzakciókat](#transaction), és új [blokkokat](#block) terjeszt elő a [letétbizonyíték](#pos) konszenzus-modellje alapján. A letétbe helyezés pénzügyi motivációt ad arra, hogy a hálózat érdekét szem előtt tartva járj el. A [validátori](#validator) feladatok elvégzéséért jutalomban részesülsz, de váltzó mennyiségű ETH-t veszíthetsz el, ha nem így teszel. - - - Helyezd letétbe az ETH-ed, hogy Ethereum validátorrá válhass - - -### state channels (állapot csatornák) {#state-channels} - -Egy [2. rétegű](#layer-2) megoldás, ahol egy csatorna van létrehozva a résztvevők között és ahol szabadon és kis költséggel indíthatnak tranzakciókat. Csak egy, a csatornát megnyitó és a csatornát lezáró, [tranzakció](#transaction) kerül fel a [főhálózatra](#mainnet). Ez nagyon magas tranzakció átvitelt tesz lehetővé, de a résztvevők számának előzetes ismeretére, valamint a tőke lekötésére támaszkodik. - - - Állapot csatornák - - -### szabo {#szabo} - -Az [ether](#ether) egyik címlete. 1 szabo = 1012 [wei](#wei), 106 szabo = 1 ether. + ## T {#section-t} -### Tangerine Whistle {#tangerine-whistle} - -Az Ethereum blokklánc egyik[hard-forkja](#hard-fork), mely az 2,463,000 számú blokknál történt és megváltoztatta a [gáz](#gas) számítást bizonyos I/O intenzív műveleteknél, valamint ezután törlődik a szolgáltatás megtagadás támadás után felhalmozott állapot, mely kihasználta az alacsony gáz díjakat ezeknél a műveleteknél. - -### testnet (tesztnet) {#testnet} - -A "test network", (vagyis "teszthálózat") rövidítése. A fő Ethereum hálózat (lásd: [főhálózat](#mainnet)) viselkedésének szimulálására használt hálózat. - - - Tesztnetek - - -### token standard (token szabvány) {#token-standard} - -Az ERC-20 előterjesztéssel került be a rendszerbe ez a standardizált [okosszerződési](#smart-contract) struktúra a felcserélhető tokenek kezelésére. Az egyazon szerződésből származó tokenek követhetők, eladhatók, és az [NFT](#nft)-kkel ellentétben felcserélhetők. - - - ERC-20 Token Szabvány - + -### tranzakció {#transaction} + -Az Ethereum Blokkláncra küldött, egy feladó [számla](#account) által aláírt, egy bizonyos [címet](#address) célzó adat. A tranzakció metaadatokat tartalmaz, mint például az adott tranzakció [gáz limitje](#gas-limit). + - - Tranzakciók - + -### transaction fee (tranzakciós díj) {#transaction-fee} + -Egy díj, amit minden alkalommal ki kell fizetned, amikor az Ethereum hálózatot használod. Díjat kell fizetned például akkor, ha pénzt küldesz a [tárcádból](#wallet), vagy interakcióba lépsz egy [dapp](#dapp)al, például tokeneket váltasz, vagy gyűjthető tárgyat vásárolsz. Úgy is gondolhatsz erre, mint egy szolgáltatás ára. A díj mértéke attól függően változik, hogy mennyire van leterhelve a hálózat. Ez azért van, mert a [bányászok](#miner), akik a tranzakciók feldolgozásáért felelnek, valószínűleg előrébb veszik a magasabb díjjal járó tranzakciókat - így a leterheltség felfelé mozdítja az árakat. + -Technikai szempontból a tranzakciós díj attól függ, mennyi [gázra](#gas) van szükség a tranzakciód végrehajtásához. - -A tranzakciós díjak csökkentésének témáját nagy érdeklődés övezi mostanában. Lásd: [2. réteg](#layer-2) - -### Turing complete (Turing-teljes) {#turing-complete} - -Az angol matematikus és számítástechnikus Alan Turing után elnevezett fogalom - az adatmanipulációs szabályok rendszere (például egy számítógép utasításai, egy programozási nyelv, vagy egy sejtautomata) "Turing-teljesnek" vagy számítási szempontból univerzálisnak mondható, ha bármely Turing-gép szimulálására használható. + ## V {#section-v} -### validátor {#validator} - -Egy [csomópont](#node) a [letétbizonyíték](#proof-of-stake) alapú rendszerben, amely az adattárolásért, a tranzakciók felolgozásáért, és az új blokkok blokklánchoz való hozzáadásáért felel. A validátor-szoftver aktiválásához 32 ETH-t kell [letétbe helyezned](#staking). - - - Proof-of-stake - - Letétbe helyezés az Ethereumon - - -### Validity proof (érvényességi bizonyíték) {#validity-proof} - -Egyes [2. réteges](#layer-2) megoldások biztonsági modellje, amely a feldolgozási sebesség növelésének érdekében a tranzakciókat [összevonják](/#rollups), és egyetlen tranzakció keretében küldik el az Ethereum hálózatra. A tranzakciós számítások a láncon kívül történnek, majd az érvényességük bizonyítékával együtt kerülnek fel a láncra. Ez a módszer növeli a végrehajtható tranzakciók számát, mialatt a biztonságot is fenntartja. Egyes [összesített tranzakciók](#rollups) [csalási bizonyítást](#fraud-proof) használnak. - - - Zero-knowledge összegzők - - -### Validium {#validium} + -[2. réteges](#layer-2) megoldás, amely [érvényességi bizonyítást](#validity-proof) használ a feldolgozható tranzakciók számának növelésére. A [Zero-knowledge összegzőkkel](#zk-rollup) ellentétben a Validium adat nem az 1. rétegű [főhálózaton](#mainnet) tárolódik. + - - Validium - + -### Vyper {#vyper} + -Egy magas szintű programozási nyelv Python-szerű szintaxissal. Az a célja, hogy megközelítse a tiszta funkcionális nyelvet. Vitalik Buterin készítette. - - - Vyper - + ## W {#section-w} -### wallet (tárca) {#wallets} - -Szoftver, amely a [privát kulcsokat](#private-key) tartalmazza. Az Ethereum [számlák](#account) elérésére és kezelésére, valamint az [okosszerződésekkel](#smart-contract) való interakcióra használható. A kulcsokat nem kell a tárcában tárolni, a nagyobb biztonság érdekében lehetséges offline tárhelyen (például memóriakártyán vagy papíron) őrizni azokat. Neve ellenére a tárca soha nem tartalmazza a tényleges érméket vagy tokeneket. - - - Ethereum tárcák - - -### Web3 {#web3} + -A világháló harmadik verziója. A Web3, amit először Dr. Gavin Wood írt le, új célt tűz ki a webes applikációknak - központilag birtokolt és menedzselt applikációk helyett decentralizált protokollokra épülő applikációk (lásd: [Dapp](#dapp)). + - - Web2 vs Web3 - - -### wei {#wei} - -Az [ether](#ether) legkisebb címlete. 1018 wei = 1 ether. + ## Z {#section-z} -### zero address (zéró számla) {#zero-address} - -Egy speciális, kizárólag nullákat tartalmazó Ethereum cím, amely a [szerződés létrehozó tranzakciók](#contract-creation-transaction) címzettjeként működik. - -### Zero-knowledge rollup (Nulla tudás alapú összevont tranzakció) {#zk-rollup} + -[Érvényességi bizonyítást](#validity-proof) használó tranzakciók [összevonása](#rollups), a [2. réteg](#layer-2) tranzakciófelolgozási kapacitásának, és a [főhálózat](#mainnet) (1. réteg) által nyújtott biztonság elérésének érdekében. Bár ezek nem képesek olyan komplex tranzakciókat kezelni, mint az [Optimistic típusú összevont tranzakciók](#optimistic-rollups), nincsenek késleltetési problémáik, mert a tranzakciók feltételezhetően érvényesek a hálózatra küldés pillanatában. + - - Zero-knowledge összegzők - + @@ -821,8 +440,8 @@ _Részben a [Mastering Ethereum](https://github.com/ethereumbook/ethereumbook)al -## Járulj hozzá az oldalhoz {#contribute-to-this-page} +## Járuljon hozzá az oldalhoz {#contribute-to-this-page} -Kihagytunk valamit? Valami nem helyes? Segíts nekünk jobbá tenni úgy, hogy közreműködsz ehhez a szójegyzékhez a GitHub-on! +Kihagytunk valamit? Valami nem helyes? Segítsen nekünk jobbá tenni úgy, hogy közreműködik a szójegyzék fejlesztésében a GitHubon! -[Tudj meg többet a hozzájárulásról](/contributing/adding-glossary-terms) +[Tudj meg többet a közreműködésről](/contributing/adding-glossary-terms) diff --git a/public/content/translations/hu/history/index.md b/public/content/translations/hu/history/index.md index 79fb9e55439..3f1c4cb751e 100644 --- a/public/content/translations/hu/history/index.md +++ b/public/content/translations/hu/history/index.md @@ -1,22 +1,214 @@ --- -title: Az Ethereum története -description: Az Ethereum blokklánc története a nagyobb mérföld kövekkel, kiadásokkal és forkokkal. +title: Az Ethereum története és elágazásai +description: Az Ethereum blokklánc története a nagyobb mérföldkövekkel, frissítésekkel és elágazásokkal. lang: hu sidebarDepth: 1 -isOutdated: true --- # Az Ethereum története {#the-history-of-ethereum} -Az Ethereum blokklánc összes fontos mérföldkövének, forkjának és frissítésének idővonala. +Az Ethereum blokklánc összes fontos mérföldkövének, elágazásának és frissítésének idővonala. - + -A forkok a hálózat nagyobb technikai frissítései vagy változtatásai esetében jönnek létre – általában az [Ethereum Fejlesztési Javaslatokból (EIP-k)](/eips/) származnak és megváltoztatják a protokoll "szabályait". +Az elágazások a hálózat nagyobb technikai frissítései vagy változtatásai esetében jönnek létre – általában az Ethereum fejlesztési javaslatokból (EIP) származnak és megváltoztatják a protokoll „szabályait”. -Amikor a hagyományos, központi irányítású szoftverek esetében szükséges egy frissítés, a cég csak kibocsájt egy új verziót a végfelhasználó részére. A blokkláncok máshogy működnek, mivel nincsen központi tulajdonjog. Az [Ethereum klienseknek](/developers/docs/nodes-and-clients/) kell frissíteni a szoftverjüket, hogy implementálják az új változtatásokat. Ezenkívül a blokk létrehozóknak (bányászok egy proof-of-work rendszerben, validátorok egy proof-of-stake rendszerben) és a csomópontoknak blokkokat kell létrehozniuk és az új szabályokkal szembe menően validálniuk. [Többet a konszenzus mechanizmusokról](/developers/docs/consensus-mechanisms/) +Amikor a hagyományos, központi irányítású szoftverek esetében szükséges egy frissítés, a cég csak kibocsájt egy új verziót a végfelhasználó részére. A blokkláncok máshogy működnek, mivel nincsen központi tulajdonjog. Az Ethereum-klienseknek frissíteni kell a szoftverjét, hogy az új elágazási szabályokat életbe léptessék. Ezenkívül a blokklétrehozóknak (bányászok egy proof-of-work rendszerben, validátorok egy proof-of-stake rendszerben) és a csomópontoknak blokkokat kell létrehozniuk és az új szabályokkal szembemenően kell validálniuk. Bővebben a konszenzusmechanizmusokról -Ezek a szabályváltoztatások átmeneti törést okozhatnak a hálózatban. Új blokkok jöhetnek létre az új szabályok vagy a régiek szerint. A forkokról általában előzetes egyezség születik, így a kliensek együttesen vezetik be a változtatásokat és a változásokkal rendelkező fork válik a fő lánccá. Azonban néha előfordul nézeteltérés a forkokat illetően, mely a lánc megmaradó kettészakadását eredményezi - a legismertebb ilyen eset az Ethereum Classic létrejötte volt a [DAO forkkal](#dao-fork). +Ezek a szabályváltozások létrehozhatnak egy átmeneti szétválást a hálózatban. Új blokkok jöhetnek létre az új szabályok vagy a régiek szerint. Az elágazásokról általában előzetes egyezség születik, így a kliensek együttesen vezetik be a változtatásokat és a változásokkal rendelkező elágazás válik a fő lánccá. Azonban néha előfordul nézeteltérés az elágazásokat illetően, mely a lánc megmaradó kettészakadását eredményezi – a legismertebb ilyen eset az Ethereum Classic létrejötte volt a DAO elágazással. + + + +Odaugorhat akár néhány rendkívül fontos frissítéshez: [A Beacon lánc](/roadmap/beacon-chain/); [A Merge](/roadmap/merge/); és [EIP-1559](#london) + +Az elkövetkező protokollfrissítések érdeklik? [Tudjon meg többet a következő frissítésekről az Ethereum ütemtervéből](/roadmap/). + + + +## 2023 {#2023} + +### Shanghai {#shanghai} + + + +#### Összegzés {#shanghai-summary} + +A Shanghai frissítés bevezette a letétek kivonási lehetőségét a végrehajtási rétegen. A Capella frissítéssel együtt ez lehetővé tette, hogy a blokkok kivonási műveletet fogadjanak el, amivel a letétesek ki tudják venni az ETH a Beacon láncról a végrehajtási rétegre. + + + +
      +
    • EIP-3651A COINBASE címmelegítés elkezdése
    • +
    • EIP-3855Új PUSH0 parancs
    • +
    • EIP-3860Az initkód behatárolása és mérése
    • +
    • EIP-4895A Beacon lánc kivételeket küld műveletként
    • +
    • EIP-6049ASELFDESTRUCT érvénytelenítése
    • +
    + +
    + +- [Olvassa el a Shanghai frissítés specifikációit](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/shanghai.md) + +--- + +### Capella {#capella} + + + +#### Összegzés {#capella-summary} + +A Capella frissítés a harmadik legnagyobb frissítés volt a konszenzusrétegen (Beacon lánc) és lehetővé tette a letétek kivételét. A Capella egyszerre történt a Shanghai frissítéssel, ami a végrehajtási réteget változtatta meg, s így lehetővé vált a letét kivétele. + +Ez a konszenzusréteg frissítés megengedte a letétbe helyezőknek, hogy ha a letét kezdetén nem adtak meg kivételi adatokat, akkor most megtehessék. + +Emellett bevezették az automatikus számlasöprési funkciót, ami folyamatosan átnézi a validátorok számláit, hogy van-e kifizetendő jutalom vagy teljes kivétel. + +- [Bővebben a letétek visszavonásáról](/staking/withdrawals/). +- [Olvassa el a Capella frissítés specifikációit](https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/) + + + +## 2022 {#2022} + +### Paris (a Merge) {#paris} + + + +#### Összegzés {#paris-summary} + +A Paris frissítést az váltotta ki, hogy a proof-of-work blokklánc meghaladta a [végső teljes nehézséget](/glossary/#terminal-total-difficulty), melynek mértéke 58750000000000000000000 volt. Az a 15537393. blokknál történt 2022. szeptember 15-én, így kiváltva a következő blokktól a Paris frissítést. A Paris volt [a beolvadás (Merge)](/roadmap/merge/) áttérés, melynek fő jellemzője a [proof-of-work](/developers/docs/consensus-mechanisms/pow) bányászó algoritmus és a kapcsolódó konszenzuslogika kikapcsolása, ehelyett pedig a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) bekapcsolása. Paris egyúttal frissítette a [végrehajtási klienseket](/developers/docs/nodes-and-clients/#execution-clients) (a Bellatrix-hoz hasonlóan, ami a konszenzusrétegen tette), hogy instrukciókat tudjanak fogadni a velük kapcsolódó [konszenzuskliensektől](/developers/docs/nodes-and-clients/#consensus-clients). Ehhez szükség volt arra, hogy a belső API metódusok egy új készletét, az [Engine API-kat](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) aktiválják. Ez kétségtelenül az Ethereum történetének legjelentősebb frissítése volt a [Homestead](#homestead) óta! + +- [Olvassa el a Paris frissítés specifikációit](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/paris.md) + + + +
      +
    • EIP-3675A konszenzus frissítése proof-of-stake-re
    • +
    • EIP-4399A DIFFICULTY opkód kiváltása PREVRANDAO-val
    • +
    + +
    + +--- + +### Bellatrix {#bellatrix} + + + +#### Összegzés {#bellatrix-summary} + +A Bellatrix frissítés a második betervezett frissítés volt a [Beacon láncra](/roadmap/beacon-chain), hogy előkészítse a láncot a [Merge-re](/roadmap/merge/). Ezzel a validátorok büntetései teljes értékűek lettek az aktivitás hiányára és a súlyos büntetésekre vonatkozóan. A Bellatrix szintén hozott egy frissítést az elágazásválasztás szabályaiba, hogy felkészítse a láncot a Merge-re és arra, hogy az utolsó proof-of-work blokk után az első proof-of-stake blokk következzen. A konszenzuskliensek ezzel tudatosak lettek az 58750000000000000000000 [végső teljes nehézségről](/glossary/#terminal-total-difficulty). + +- [Olvassa el a Bellatrix frissítés specifikációit](https://github.com/ethereum/consensus-specs/tree/dev/specs/bellatrix) + +--- + +### Gray Glacier {#gray-glacier} + + + +#### Összegzés {#gray-glacier-summary} + +A Gray Glacier hálózati frissítés eltolta a [nehézségbombát](/glossary/#difficulty-bomb) három hónappal. Ez a frissítés csak ezt változtatta meg, s így természetében hasonlít a [Arrow Glacier](#arrow-glacier) és a [Muir Glacier](#muir-glacier) frissítésekhez. Hasonló változtatások történtek a [Byzantium](#byzantium), [Constantinople](#constantinople) és [London](#london) hálózati frissítéseknél is. + +- [EF Blog – Gray Glacier frissítés bejelentése](https://blog.ethereum.org/2022/06/16/gray-glacier-announcement/) + + + +
      +
    • EIP-5133A nehézségbomba elhalasztása 2022. szeptemberig
    • +
    + +
    + + + +## 2021 {#2021} + +### Arrow Glacier {#arrow-glacier} + + + +#### Összegzés {#arrow-glacier-summary} + +Az Arrow Glacier hálózati frissítés eltolta a [nehézségbombát](/glossary/#difficulty-bomb) néhány hónappal. Ez a frissítés csak ezt változtatta meg, s így természetében hasonlít a [Muir Glacier](#muir-glacier) frissítéshez. Hasonló változtatások történtek a [Byzantium](#byzantium), [Constantinople](#constantinople) és [London](#london) hálózati frissítéseknél is. + +- [EF Blog – Arrow Glacier frissítés bejelentése](https://blog.ethereum.org/2021/11/10/arrow-glacier-announcement/) +- [Ethereum Cat Herders – Ethereum Arrow Glacier frissítés](https://medium.com/ethereum-cat-herders/ethereum-arrow-glacier-upgrade-e8d20fa4c002) + + + +
      +
    • EIP-4345A nehézségbomba elhalasztása 2022. júniusig
    • +
    + +
    + +--- + +### Altair {#altair} + + + +#### Összegzés {#altair-summary} + +Az Altair frissítés a [Beacon lánc](/roadmap/beacon-chain) első tervezett változtatása volt. A „szinkronizálási bizottságokhoz” adott támogatást, mint a könnyű kliensek bevezetése, valamint megnövelte a validátor nem aktivitás és súlyos büntetések mértékét, hogy előkészítse a Merge-t. + +- [Olvassa el az Altair frissítés specifikációit](https://github.com/ethereum/consensus-specs/tree/dev/specs/altair) + +#### Érdekesség {#altair-fun-fact} + +Az Altair volt az első nagyobb hálózati frissítés, aminek konkrét bevezetési ideje volt. Az összes korábbi frissítés egy adott blokkszám alapján történt a proof-of-work láncon, ahol a blokkonkénti idő változó. A Beacon láncnak nem kellett igazodnia a proof-of-work-höz, így időalapú korszakok rendszerén alapszik, amelyek 32 darab 12 másodperces slotokból állnak, s a validátorok ezekben tudnak blokkot javasolni. Így pontosan lehetett tudni, hogy mikor következik a 74.240. korszak, s az Altair élesbe lép! + +- [Blokk idő](/developers/docs/blocks/#block-time) + +--- + +### London {#london} + + + +#### Összegzés {#london-summary} + +A London frissítés bevezette az [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) változást, ami megreformálta a tranzakciós díj piacot, azzal együtt, hogyan kezelik a gázvisszatérítéseket, valamint betervezte az [Ice Age-et](/glossary/#ice-age). + +- [Ön egy dapp-fejlesztő? Feltétlenül frissítse a könyvtárakat és az eszközöket.](https://github.com/ethereum/execution-specs/blob/master/network-upgrades/london-ecosystem-readiness.md) +- [Olvassa el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2021/07/15/london-mainnet-announcement/) +- [Olvassa el az Ethereum Cat Herder magyarázatát](https://medium.com/ethereum-cat-herders/london-upgrade-overview-8eccb0041b41) + + + +
      +
    • EIP-1559Fejleszti a tranzakciós díjak piacát
    • +
    • EIP-3198Visszaküldi a BASEFEE mezőt a blokkból
    • +
    • EIP-3529Csökkenti a gázvisszatérítést az EVM műveletekre
    • +
    • EIP-3541Megakadályozza olyan szerződések telepítését, melyek 0xEF kóddal kezdődnek
    • +
    • EIP-3554Elhalasztja az Ice Age-et 2021. decemberig
    • +
    + +
    + +--- + +### Berlin {#berlin} + + + +#### Összegzés {#berlin-summary} + +A Berlin frissítés optimalizálta a gázköltséget bizonyos EVM műveleteknél, s több támogatást adott a többszörös tranzakció típusokra. + +- [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2021/03/08/ethereum-berlin-upgrade-announcement/) +- [Olvasd el az Ethereum Cat Herder magyarázatát](https://medium.com/ethereum-cat-herders/the-berlin-upgrade-overview-2f7ad710eb80) + + + +
      +
    • EIP-2565Csökkenti a ModExp gázköltséget
    • +
    • EIP-2718Könnyebb támogatást tesz lehetővé a többszörös tranzakciótípusokra
    • +
    • EIP-2929A gázköltséget megnöveli a státuszelérő opkódokra
    • +
    • EIP-2930Opcionális hozzáféréslistákat hoz létre
    • +
    @@ -24,13 +216,13 @@ Ezek a szabályváltoztatások átmeneti törést okozhatnak a hálózatban. Új ## 2020 {#2020} -### Beacon Chain genesis {#beacon-chain-genesis} +### Beacon lánc genezis {#beacon-chain-genesis} -#### Összefoglaló {#beacon-chain-genesis-summary} +#### Összegzés {#beacon-chain-genesis-summary} -A [Beacon Chain](/roadmap/beacon-chain/) biztonságos elindításához 16384 darab 32 ETH-nyi letétre volt szükség. Ez november 27.-én történt meg, vagyis a Beacon Chain a blokkok létrehozását december 1.-jén kezdte meg 2020-ban. Ez az [Eth2 vízió](/roadmap/vision/) elérésének fontos első lépése. +A [Beacon lánc](/roadmap/beacon-chain/) biztonságos elindításához 16384 darab 32 ETH-nyi letétre volt szükség. Ez november 27-én történt meg, vagyis a Beacon lánc a blokkok létrehozását 2020. december 1-jén kezdte meg. Ez az [Ethereum vízió](/roadmap/vision/) elérésének fontos első lépése volt. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2020/11/27/eth2-quick-update-no-21/) @@ -44,9 +236,9 @@ A [Beacon Chain](/roadmap/beacon-chain/) biztonságos elindításához 16384 dar -#### Összefoglaló {#deposit-contract-summary} +#### Összegzés {#deposit-contract-summary} -A letétbe helyezési szerződés bemutatta a [letétbe helyezés](/glossary/#staking) rendszerét az Ethereum ökoszisztémában. Bár [főhálózati](/glossary/#mainnet) szerződés, közvetlenül befolyásolta egy fontos [Eth2 frissítés](/roadmap/), a [Beacon Chain](/roadmap/beacon-chain/) indításának ütemezését. +A letétbe helyezési szerződés bevezette a [letétbe helyezés](/glossary/#staking) rendszerét az Ethereum ökoszisztémába. Habár ez egy szerződés a [főhálózaton](/glossary/#mainnet), közvetlen hatást gyakorolt a [Beacon lánc](/roadmap/beacon-chain/) bevezetési idejére, ami egy fontos [Ethereum frissítés](/roadmap/). [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2020/11/04/eth2-quick-update-no-19/) @@ -60,16 +252,18 @@ A letétbe helyezési szerződés bemutatta a [letétbe helyezés](/glossary/#st -#### Összefoglaló {#muir-glacier-summary} +#### Összegzés {#muir-glacier-summary} -A Muir Glacier nevű fork késleltetést vezetett be a [nehézségi bombához](/glossary/#difficulty-bomb). A blokknehézség növelése a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) konszenzus-mechanizmusában azzal fenyegetett, hogy az Ethereum használhatósága csökkenni fog, mert a tranzakciók küldése és a dappok használata több időt fog igénybe venni. +A Muir Glacier nevű elágazás késleltetést vezetett be a [nehézségi bombához](/glossary/#difficulty-bomb). A blokknehézség növelése a [proof-of-work](/developers/docs/consensus-mechanisms/pow/) konszenzusmechanizmusában azzal fenyegetett, hogy az Ethereum használhatósága csökkenni fog, mert a tranzakciók küldése és a dappok használata több időt fog igénybe venni. - [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2019/12/23/ethereum-muir-glacier-upgrade-announcement/) - [Olvasd el az Ethereum Cat Herder magyarázatát](https://medium.com/ethereum-cat-herders/ethereum-muir-glacier-upgrade-89b8cea5a210) - + -- [EIP-2384](https://eips.ethereum.org/EIPS/eip-2384) – _újabb 4,000,000 blokkal, vagy ~611 nappal késlelteti a nehézségi bomba bekövetkezését._ +
      +
    • EIP-2384Eltolta a nehézségbomba bevezetését újabb 4.000.000 blokkal vagy kb. 611 nappal.
    • +
    @@ -81,26 +275,28 @@ A Muir Glacier nevű fork késleltetést vezetett be a [nehézségi bombához](/ -#### Összefoglaló {#istanbul-summary} +#### Összegzés {#istanbul-summary} -Az Istanbul fork: +Az Istanbul elágazás: -- Bizonyos műveletek [gas](/glossary/#gas) díj optimalizálása az [EVM-ben](/developers/docs/ethereum-stack/#ethereum-virtual-machine). -- Továbbfejlesztett szolgáltatás megtagadásos támadás elleni ellenállás. -- A SNARKokon és a STARKokon alapuló [2. réteges skálázási](/developers/docs/layer-2-scaling/) megoldások teljesítményének javítása. +- Bizonyos műveletek [gázdíj](/glossary/#gas) optimalizálása az [EVM-ben](/developers/docs/ethereum-stack/#ethereum-virtual-machine). +- Fejlettebb védekezés a szolgáltatásmegtagadásos támadás ellen. +- A SNARKokon és a STARKokon alapuló [második blokkláncréteg (L2) skálázási](/developers/docs/scaling/#layer-2-scaling) megoldások teljesítményének javítása. - Az Ethereum és a Zcash közötti együttműködés bevezetése. -- Az okosszerződések kreatívabb függvényeinek lehetővé tétele. +- Az okosszerződésekben kreatívabb függvényeket tett lehetővé. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2019/11/20/ethereum-istanbul-upgrade-announcement/) - + -- [EIP-152](https://eips.ethereum.org/EIPS/eip-152) – _adatvédelmet biztosító valuták használata az Ethereumon, mint a Zcash._ -- [EIP-1108](https://eips.ethereum.org/EIPS/eip-1108) – _olcsóbb kriptográfia a [gas](/glossary/#gas) díjak csökkentésére._ -- [EIP-1344](https://eips.ethereum.org/EIPS/eip-1344) – _az Ethereum védelme a visszajátszási támadásokkal szemben a `CHAINID` [opcode](/developers/docs/ethereum-stack/#ethereum-virtual-machine) bevezetésével._ -- [EIP-1884](https://eips.ethereum.org/EIPS/eip-1884) – _opkód gáz árak optimálása a fogyasztás alapján._ -- [EIP-2028](https://eips.ethereum.org/EIPS/eip-2028) – _a CallData díjának csökkentése, hogy több adat férjen a blokkba – jó a [2. rétegű skálázásnak](/developers/docs/layer-2-scaling/)._ -- [EIP-2200](https://eips.ethereum.org/EIPS/eip-2200) – _egyéb opkód gáz változtatások._ +
      +
    • EIP-152Az Ethereum együtt tud működni az adatvédelmet megőrző valutával, mint amilyen a Zcash.
    • +
    • EIP-1108Olcsóbb kriptográfia, hogy javuljon a gázdíj.
    • +
    • EIP-1344Az Ethereumot védi az újrajátszási támadással szemben a CHAINID opkód bevezetésével.
    • +
    • EIP-1884Optimizálja az opkód gázárakat a fogyasztás alapján.
    • +
    • EIP-2028A CallData költségének csökkentése, hogy több adat férjen be a blokkokba, ami támogatja az L2 skálázást.
    • +
    • EIP-2200Más opkód gázár változtatások.
    • +
    @@ -110,22 +306,25 @@ Az Istanbul fork: -#### Összefoglaló {#constantinople-summary} +#### Összegzés {#constantinople-summary} -A Constantinople fork: +A Constantinople elágazás: +- A [blokkbányászat](/developers/docs/consensus-mechanisms/pow/mining/) jutalmának csökkentése 3 ETH-ről 2-re. - A blokklánc lefagyásának megakadályozása, mielőtt a [proof-of-stake bevezetésre kerülne](#beacon-chain-genesis). -- Bizonyos műveletek [gas](/glossary/#gas) díj optimálása az [EVM-ben](/developers/docs/ethereum-stack/#ethereum-virtual-machine). +- Bizonyos műveletek [gázdíj](/glossary/#gas) optimalizálása az [EVM-ben](/developers/docs/ethereum-stack/#ethereum-virtual-machine). - Lehetőség olyan címekkel történő interakcióra, melyek még nem jöttek létre. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2019/02/22/ethereum-constantinople-st-petersburg-upgrade-announcement/) - + -- [EIP-145](https://eips.ethereum.org/EIPS/eip-145) – _bizonyos on-chain műveletek díjának optimalizálása._ -- [EIP-1014](https://eips.ethereum.org/EIPS/eip-1014) – _lehetőség olyan címekkel történő interakcióra, melyek még nem jöttek létre._ -- [EIP-1052](https://eips.ethereum.org/EIPS/eip-1052) – _bizonyos on-chain műveletek díjának optimalizálása._ -- [EIP-1234](https://eips.ethereum.org/EIPS/eip-1234) – _A blokklánc lefagyásának megakadályozása, mielőtt a proof-of-stake bevezetésre kerülne._ +
      +
    • EIP-145Optimizálja bizonyos láncon futó működések költségét.
    • +
    • EIP-1014Lehetővé teszi az interakciót olyan szerződésekkel, melyeket még nem hoztak létre.
    • +
    • EIP-1052Optimizálja bizonyos láncon futó működések költségét.
    • +
    • EIP-1234Megakadályozza, hogy a blokklánc lefagyjon a proof-of-stake bevezetése előtt, és csökkenti a blokkjutalmat 3 ETH-ről 2-re.
    • +
    @@ -137,28 +336,30 @@ A Constantinople fork: -#### Összefoglaló {#byzantium-summary} +#### Összegzés {#byzantium-summary} -A Byzantium fork: +A Byzantium elágazás: -- A [bányászati](/developers/docs/consensus-mechanisms/pow/mining/) blokk jutalom csökkentése 5-ről 3 ETH-re. -- A [nehézségi bomba](/glossary/#difficulty-bomb) késleltetése egy évvel. -- Más szerződések is indíthatnak állapotot nem befolyásoló hívásokat. -- Bizonyos kriptográfiai metódusok hozzáadása, mely lehetővé teszi a [2. réteges skálázást](/developers/docs/layer-2-scaling/). +- A [blokkbányászat](/developers/docs/consensus-mechanisms/pow/mining/) jutalmának csökkentése 5 ETH-ről 3-ra. +- A [nehézségbomba](/glossary/#difficulty-bomb) késleltetése egy évvel. +- Bevezették azt a lehetőséget, hogy állapotot nem befolyásoló hívásokat lehet indítani más szerződések felé. +- Bizonyos kriptográfiai módszerek hozzáadása, hogy támogassa az [L2 skálázást](/developers/docs/scaling/#layer-2-scaling). [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2017/10/12/byzantium-hf-announcement/) - + -- [EIP-140](https://eips.ethereum.org/EIPS/eip-140) – _`REVERT` opkód hozzáadása._ -- [EIP-658](https://eips.ethereum.org/EIPS/eip-658) – _státusz mező hozzáadása a tranzakció nyugtákhoz, mely jelzi hogy sikeres volt-e._ -- [EIP-196](https://eips.ethereum.org/EIPS/eip-196) – _elliptikus görbe és skaláris szorzás bevezetése, mely lehetővé teszi a [ZK-Snarkokat](/developers/docs/layer-2-scaling/#rollups)._ -- [EIP-197](https://eips.ethereum.org/EIPS/eip-197) – _elliptikus görbe és skaláris szorzás bevezetése, mely lehetővé teszi a [ZK-Snarkokat](/developers/docs/layer-2-scaling/#rollups)._ -- [EIP-198](https://eips.ethereum.org/EIPS/eip-198) – _RSA aláírás hitelesítés bevezetése._ -- [EIP-211](https://eips.ethereum.org/EIPS/eip-211) – _változó hosszú visszatérítési érték támogatása._ -- [EIP-214](https://eips.ethereum.org/EIPS/eip-214) – _a `STATICCALL` opkód hozzáadása, mely lehetővé teszi az állapotot nem befolyásoló hívások indítását a többi szerződésnek._ -- [EIP-100](https://eips.ethereum.org/EIPS/eip-100) – _a nehézséget szabályozó képlet megváltoztatása._ -- [EIP-649](https://eips.ethereum.org/EIPS/eip-649) – _a [nehézségi bomba](/glossary/#difficulty-bomb) késleltetése 1 évvel és a blokk jutalom 5-ről 3-ra csökkentése._ +
      +
    • EIP-140A REVERT opkód bevezetése.
    • +
    • EIP-658A tranzakció visszaigazolásba bekerült a státuszmező, hogy mutassa a sikeres vagy sikertelen végrehajtást.
    • +
    • EIP-196Az elliptikus görbe és a skaláris szorzást bevezetése, hogy támogassa a ZK-SNARK-okat.
    • +
    • EIP-197Az elliptikus görbe és a skaláris szorzást bevezetése, hogy támogassa a ZK-SNARK-okat.
    • +
    • EIP-198Az RSA aláírásellenőrzés lehetővé tétele.
    • +
    • EIP-211A változó hosszúságú visszatérési értékek támogatása.
    • +
    • EIP-214A STATICCALL opkód bevezetése, hogy állapotot nem befolyásoló hívásokat lehessen indítani más szerződések felé.
    • +
    • EIP-100A nehézség beállítási formulájának változtatása.
    • +
    • EIP-649A nehézségbomba elhalasztása 1 évvel, s a blokkjutalom csökkentése 5 ETH-ről 3-ra.
    • +
    @@ -170,22 +371,24 @@ A Byzantium fork: -#### Összefoglaló {#spurious-dragon-summary} +#### Összegzés {#spurious-dragon-summary} -A Spurious Dragon fork volt a második válasz a szolgáltatás megtagadásos (DoS) támagásokkal szemben a hálózaton (2016 szeptember/október), mely az alábbiakat tartalmazta: +A Spurious Dragon elágazás volt a második válasz a szolgáltatás megtagadásos (DoS) támadásokkal szemben a hálózaton (2016 szeptember/október), mely az alábbiakat tartalmazta: - opkód árazás finomhangolása a jövőbeli támadások megakadályozása érdekében. -- a blokklánc állapot "leeresztésének" lehetővé tétele. +- a blokklánc állapot „leeresztésének” lehetővé tétele. - visszajátszásos támadás elleni védelem hozzáadása. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/) - + -- [EIP-155](https://eips.ethereum.org/EIPS/eip-155) – _megakadályozza, hogy az Ethereum láncról származó tranzakciókat újra lehessen küldeni egy másik láncon, például egy tesztnet tranzakciót újra küldeni a fő Ethereum hálózatra._ -- [EIP-160](https://eips.ethereum.org/EIPS/eip-160) – _az `EXP` opkód árának beállítása – megnehezíti a hálózat lelassítására irányuló törekvéseket számításilag költséges szerződés műveletekkel._ -- [EIP-161](https://eips.ethereum.org/EIPS/eip-161) – _lehetővé teszi az üres számlák törlését, melyeket a DOS támadás közben adtak hozzá._ -- [EIP-170](https://eips.ethereum.org/EIPS/eip-170) – _megváltoztatja a maximális kód méretet, mellyel egy blokkláncon lévő szerződés rendelkezhet – 24576 bájtra._ +
      +
    • EIP-155Megakadályozza, hogy egy Ethereum-láncról a tranzakciókat újra elküldjék egy alternatív láncon, például egy teszthálózati tranzakciót lejátszanak a főhálózaton.
    • +
    • EIP-160Az EXP opkód árigazítása, hogy ezáltal nehezebb legyen lelassítani a hálózatot az intenzív számítást igénylő szerződésműködésekkel.
    • +
    • EIP-161Az üres számlák eltávolítása, melyeket a szolgáltatásmegtagadási (DoS) támadások alatt hoztak létre.
    • +
    • EIP-170A láncon lévő szerződés maximális kódméretének megnövelése 24576 bájtra.
    • +
    @@ -195,34 +398,36 @@ A Spurious Dragon fork volt a második válasz a szolgáltatás megtagadásos (D -#### Összefoglaló {#tangerine-whistle-summary} +#### Összegzés {#tangerine-whistle-summary} -A Tangerine Whistle fork volt a első válasz a szolgáltatás megtagadásos (DoS) támagásokkal szemben a hálózaton (2016 szeptember/október), mely az alábbiakat tartalmazta: +A Tangerine Whistle elágazás volt a első válasz a szolgáltatásmegtagadásos (DoS) támadásokkal szemben a hálózaton (2016 szeptember/október), mely az alábbiakat tartalmazta: - az alulárazott opkódokkal kapcsolatos sürgős hálózati kérdések kezelése. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2016/10/18/faq-upcoming-ethereum-hard-fork/) - + -- [EIP-150](https://eips.ethereum.org/EIPS/eip-150) – _a gázár növelése olyan opkódoknál, melyet lehet használni a spam támadásoknál._ -- [EIP-158](https://eips.ethereum.org/EIPS/eip-158) – _csökkenti az állapot méretet nagy számú üres számlák törlésével, melyek hozzá lettek adva az állapothoz nagyon alacsony költséggel az Ethereum korábbi verziói hibái miatt._ +
      +
    • EIP-150Megnöveli azon opkódok gázköltségeit, melyeket teleszemetelési (spam) támadásokra lehet használni.
    • +
    • EIP-158Csökkenti a státuszméretet azáltal, hogy eltávolítja az üres számlákat, melyeket alacsony költségen küldtek be a státuszba a korábbi Ethereum protokoll hibái miatt.
    • +
    --- -### DAO fork {#dao-fork} +### DAO elágazás {#dao-fork} -#### Összefoglaló {#dao-fork-summary} +#### Összegzés {#dao-fork-summary} -A DAO fork volt a válasz a [2016-os DAO támadásra](https://www.coindesk.com/understanding-dao-hack-journalists), amikor egy sérülékeny [DAO](/glossary/#dao) szerződésből 3.6 millió ETH-et ürítettek le a támadás során. A fork átmozgatta a pénzt a hibás szerződésből egy [új szerződésbe](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754), aminek csak egyetlen funkciója van: kiutalás. Bárki aki veszteséget szenvedett el kiutalhatott 1 ETH-et, minden tárcájukban lévő 100 DAO tokenre. +A DAO elágazás volt a válasz a [2016-os DAO támadásra](https://www.coindesk.com/learn/understanding-the-dao-attack/), amikor egy sérülékeny [DAO](/glossary/#dao) szerződésből 3,6 millió ETH-t ürítettek le a támadás során. Az elágazás átmozgatta a pénzt a hibás szerződésből egy [új szerződésbe](https://etherscan.io/address/0xbf4ed7b27f1d666546e30d74d50d173d20bca754), amelynek csak kiutalási funkciója volt. Bárki, aki veszteséget szenvedett el, kivehetett 1 ETH-t a tárcájában lévő minden 100 DAO tokenre. -Ennek az akciónak a menetét megszavazták az Ethereum közösségen belül. Bármely ETH tulajdonos szavazhatott egy tranzakción keresztül [egy szavazási platformon](http://v1.carbonvote.com/). A fork mellett több mint a szavazók 85%-a voksolt. +Ennek az akciónak a menetét megszavazták az Ethereum közösségen belül. Bármely ETH tulajdonos szavazhatott egy tranzakción keresztül [egy szavazási platformon](https://web.archive.org/web/20170620030820/http://v1.carbonvote.com/). A fork mellett több mint a szavazók 85%-a voksolt. -Némely bányász nem volt hajlandó forkolni, mivel a DAO incidens nem a protokollból származó hibából eredt. Ők ezután létrehozták az [Ethereum Classicot](https://ethereumclassic.org/). +Némely bányász nem támogatta az elágazást, mivel a DAO incidens nem a protokollból származó hibából eredt. Ők ezután létrehozták az [Ethereum Classicot](https://ethereumclassic.org/). [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2016/07/20/hard-fork-completed/) @@ -232,17 +437,19 @@ Némely bányász nem volt hajlandó forkolni, mivel a DAO incidens nem a protok -#### Összefoglaló {#homestead-summary} +#### Összegzés {#homestead-summary} -A Homestead fork, mely a jövőbe tekintett. Számos protokoll változtatást tartalmazott és egy hálózati változtatást, mely lehetővé tette az Ethereum számára a további hálózati változtatásokat. +A Homestead elágazás a jövőbe tekintett. Számos protokollváltoztatást tartalmazott és egy hálózati változtatást, mely lehetővé tette az Ethereum számára a további hálózati változtatásokat. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2016/02/29/homestead-release/) - + -- [EIP-2](https://eips.ethereum.org/EIPS/eip-2) – _módosítja a szerződés létrehozás folyamatát._ -- [EIP-7](https://eips.ethereum.org/EIPS/eip-7) – _új opkód hozzáadása: `DELEGATECALL`_ -- [EIP-8](https://eips.ethereum.org/EIPS/eip-8) – _bevezeti a devp2p előrefelé történő kompatibilitási elvárásokat_ +
      +
    • EIP-2A szerződéslétrehozási folyamat szerkesztése.
    • +
    • EIP-7A DELEGATECALL új opkód bevezetése
    • +
    • EIP-8Bevezették a devp2p jövőkompatibilitási (forward compatibility) követelményeket
    • +
    @@ -254,11 +461,12 @@ A Homestead fork, mely a jövőbe tekintett. Számos protokoll változtatást ta -#### Összefoglaló {#frontier-thawing-summary} +#### Összegzés {#frontier-thawing-summary} -A frontier thawing fork megszüntette az 5,000-es [gáz](/glossary/#gas) limitet egy [blokkra](/glossary/#block) és beállította az alapértelmezett gáz árat 51 [gweire](/glossary/#gwei). Ez lehetővé tette a tranzakciók létrejöttét – a tranzakciók 21,000 gázt igényeltek. +A Frontier thawing elágazás megemelte az 5.000-es [gázhatárt](/glossary/#gas) [blokkonként](/glossary/#block) és beállította az alapértelmezett gázárat 51 [gweire](/glossary/#gwei). Ez lehetővé tette a tranzakciók létrejöttét, mivel azokhoz 21.000 gázra van szükség. Bevezették a [nehézségbombát](/glossary/#difficulty-bomb), hogy lehetőség legyen egy jövőbeli végleges elágazásra (hard fork) a [proof-of-stake](/glossary/#pos) mechanizmusra való áttérésnél. -[Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2015/08/04/the-thawing-frontier/) +- [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2015/08/04/the-thawing-frontier/) +- [Tekintse meg az Ethereum protokollfrissítés 1. cikket](https://blog.ethereum.org/2015/08/04/ethereum-protocol-update-1/) --- @@ -266,9 +474,9 @@ A frontier thawing fork megszüntette az 5,000-es [gáz](/glossary/#gas) limitet -#### Összefoglaló {#frontier-summary} +#### Összegzés {#frontier-summary} -A Frontier egy működő, de teljesen leegyszerűsített implementációja volt az Ethereum projektnek. Az sikeres Olympic tesztelési fázist követte. A műszaki felhasználóknak készült, kimondottan fejlesztőknek. A [blokkoknak](/glossary/#block) egy 5000-es [gáz](/glossary/#gas) limit volt beállítva. Ez a ‘kiolvasztási’ időszak lehetővé tette a bányászok számára, hogy elindítsák a tevékenységüket és a korai felhasználóknak, hogy telepítsék a klienseiket anélkül, hogy 'sietniük' kellene. +A Frontier egy működő, de teljesen leegyszerűsített implementációja volt az Ethereum projektnek. A sikeres Olympic tesztelési fázist követte. A műszaki felhasználóknak készült, kimondottan fejlesztőknek. A [blokkoknak](/glossary/#block) egy 5000-es [gázhatár](/glossary/#gas) volt beállítva. Ez a „kiolvasztási” időszak lehetővé tette a bányászok számára, hogy elindítsák a tevékenységüket, és a korai felhasználóknak, hogy telepítsék a klienseiket anélkül, hogy sietniük kellene. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2015/07/22/frontier-is-coming-what-to-expect-and-how-to-prepare/) @@ -280,29 +488,29 @@ A Frontier egy működő, de teljesen leegyszerűsített implementációja volt -A hivatalos Ether eladás 42 napig tartott. BTC-vel tudtál fizetni. +A hivatalos Ether eladás 42 napig tartott. BTC-vel lehetett érte fizetni. [Olvasd el az Ethereum Alapítvány közleményét](https://blog.ethereum.org/2014/07/22/launching-the-ether-sale/) --- -### Sárga könyv kiadása {#yellowpaper} +### Sárgakönyv kiadása {#yellowpaper} -A Sárga Könyv, melynek a szerzője Dr. Gavin Wood, az Ethereum protokoll műszaki meghatározása. +A Sárgakönyv, melynek a szerzője Dr. Gavin Wood, az Ethereum protokoll műszaki meghatározása. -[A Sárga Könyv megtekintése](https://github.com/ethereum/yellowpaper) +[A Sárgakönyv megtekintése](https://github.com/ethereum/yellowpaper) ## 2013 {#2013} -### A fehérkönyv kiadása {#whitepaper} +### A Fehérkönyv kiadása {#whitepaper} - + -A bemutatkozó kiadvány, melyet Vitalik Buterin az Ethereum alapítója adott ki 2013-ban, a projekt 2015-ös indulása előtt. +A bemutatkozó kiadvány, melyet Vitalik Buterin, az Ethereum alapítója adott ki 2013-ban, a projekt 2015-ös indulása előtt. Fehérkönyv diff --git a/public/content/translations/hu/whitepaper/index.md b/public/content/translations/hu/whitepaper/index.md index 6ff62f7f28d..d7ed722c436 100644 --- a/public/content/translations/hu/whitepaper/index.md +++ b/public/content/translations/hu/whitepaper/index.md @@ -1,57 +1,76 @@ --- title: Ethereum fehérkönyv -description: Az Ethereum bemutató kiadványa, melyet 2013-ban adtak ki az indulása előtt. +description: Az Ethereum működéséről szóló kiadvány, melyet 2013-ban adtak ki az indulása előtt. lang: hu sidebarDepth: 2 +hideEditButton: true --- # Ethereum fehérkönyv {#ethereum-whitepaper} -_Ezt a bemutató kiadványt eredetileg 2013-ban adta ki Vitalik Buterin, az [Ethereum](/what-is-ethereum/) alapítója, a projekt 2015-ös indulása előtt. Fontos megjegyezni, hogy az Ethereum sok másik közösség által vezetett, nyílt forráskódú szoftver projekthez hasonlóan, a kezdeti elindulás óta fejlődött._ +_Ezt a bemutató kiadványt eredetileg 2014-ban adta ki Vitalik Buterin, az [Ethereum](/what-is-ethereum/) alapítója, a projekt 2015-ös indulása előtt. Fontos megjegyezni, hogy az Ethereum sok másik közösség által vezetett, nyílt forráskódú szoftver projekthez hasonlóan, a kezdeti elindulás óta fejlődött._ -_Noha több éve íródott, fenntartjuk ezt a kiadványt, mert továbbra is hasznos referenciaként szolgál és pontos ábrázolást mutat az Ethereumról és annak jövőképéről. Ha többet szeretnél megtudni az Ethereum legutóbbi fejlesztéseiről és az általunk elvégzett protokoll változtatásokról, akkor ezt az [útmutatót](/learn/) ajánljuk._ +_Noha több éve íródott, fenntartjuk ezt a kiadványt, mert továbbra is hasznos referenciaként szolgál és pontos ábrázolást mutat az Ethereumról és annak jövőképéről. Ha többet szeretne megtudni az Ethereum legutóbbi fejlesztéseiről és az általunk elvégzett protokollváltoztatásokról, akkor ezt az [útmutatót](/learn/) ajánljuk._ -## Az okosszerződések és decentralizált alkalmazás platformok következő generációja {#a-next-generation-smart-contract-and-decentralized-application-platform} +[A kutatók és egyetemi oktatók, akik a (2014. decemberi) fehér könyv historikus vagy kanonikus változatát keresik, használják ezt a PDF-et.](./whitepaper-pdf/Ethereum_Whitepaper_-_Buterin_2014.pdf) -Satoshi Nakamoto 2009-ben történő Bitcoin fejlesztését gyakran a pénz és a pénznem radikális fejleményének nevezték, ez az első példa egy olyan digitális eszközre, amelynek egyszerre nincs háttér vagy [belső értéke](http://bitcoinmagazine.com/8640/an-exploration-of-intrinsic-value-what-it-is-why-bitcoin-doesnt-have-it-and-why-bitcoin-does-have-it/), valamint nincs központi kibocsájtója vagy irányítója. A Bitcoin kísérlet másik - vitathatatlanul fontosabb - része azonban az alapjául szolgáló blokklánc technológia, mint az elosztott konszenzus eszköze, és a figyelem gyorsan kezd áttérni a Bitcoin ezen másik aspektusára. A blokklánc technológia gyakran idézett alternatív alkalmazásai közé tartozik az blokkláncon lévő digitális eszközök használata az egyedi valuták és pénzügyi eszközök reprezentálására ([colored coins](https://docs.google.com/a/buterin.com/document/d/1AnkP_cVZTCMLIzw4DvsW6M8Q2JC0lIzrTLuoWu2z1BE/edit)), a mögöttes fizikai eszköz tulajdonjoga ([smart property](https://en.bitcoin.it/wiki/Smart_Property)), nem felcserélhető eszközök, mint a domén nevek ([Namecoin](http://namecoin.org)), vagy a komplexebb alkalmazások, melyek digitális javak közvetlen irányítását vonják magukkal egy tetszőleges szabályrendszert követő kód alapján ([smart contracts](http://www.fon.hum.uva.nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo.best.vwh.net/idea.html)) vagy akár blokklánc alapú [decentralizált autonóm szervezetek](http://bitcoinmagazine.com/7050/bootstrapping-a-decentralized-autonomous-corporation-part-i/) (DAO-k). Az Ethereum egy olyan beépített, teljesen kidolgozott Turing-teljes programozási nyelvvel rendelkező blokkláncot szeretne nyújtani, amely használható olyan "szerződések" létrehozására, amelyek tetszőleges állapotátmeneti funkciók kódolására használhatóak, lehetővé téve a felhasználók számára a fent leírt rendszerek bármelyikének létrehozását, valamint sok olyan más dolgot is, melyre még nem gondoltunk, egyszerűen a logika pár sornyi kódként való leírásával. +## Okosszerződés- és decentralizált alkalmazásplatform következő generációja {#a-next-generation-smart-contract-and-decentralized-application-platform} -## Bevezetés a Bitcoinba és a létező fogalmakba {#introduction-to-bitcoin-and-existing-concepts} +Satoshi Nakamoto 2009-ben történő Bitcoin fejlesztését gyakran a pénz és a pénznem radikális fejleményének nevezték, ez az első példa egy olyan digitális eszközre, amelynek egyszerre nincs mögöttes vagy [belső értéke](http://bitcoinmagazine.com/8640/an-exploration-of-intrinsic-value-what-it-is-why-bitcoin-doesnt-have-it-and-why-bitcoin-does-have-it/), valamint nincs központi kibocsájtója vagy irányítója. A Bitcoin kísérlet másik – vitathatatlanul fontosabb – része azonban az alapjául szolgáló blokklánc technológia, mint az elosztott konszenzus eszköze, és a figyelem gyorsan elkezdett áttérni ezen másik aspektusra. A blokklánc technológiát alternatív módon alkalmazzák arra, hogy a blokkláncra épülő digitális eszközök egyéni valutákat és pénzügyi eszközöket ([színes érmék](https://docs.google.com/a/buterin.com/document/d/1AnkP_cVZTCMLIzw4DvsW6M8Q2JC0lIzrTLuoWu2z1BE/edit)), fizikai eszköz tulajdonjogát ([okosingatlan](https://en.bitcoin.it/wiki/Smart_Property)), nem helyettesíthető eszközöket, például domain neveket ([Namecoin](http://namecoin.org)) képviselnek, emellett összetettebb alkalmazásokat működtetnek, amelyekben a digitális eszközöket közvetlenül egy tetszőleges szabályokat végrehajtó kódrészlet irányítja ([okosszerződések](http://www.fon.hum.uva.nl/rob/Courses/InformationInSpeech/CDROM/Literature/LOTwinterschool2006/szabo.best.vwh.net/idea.html)), vagy akár blokklánc-alapú [decentralizált autonóm szervezeteket (DAO)](http://bitcoinmagazine.com/7050/bootstrapping-a-decentralized-autonomous-corporation-part-i/) alapítanak. Az Ethereum egy olyan beépített, teljesen kidolgozott Turing-teljes programozási nyelvvel rendelkező blokkláncot szeretne nyújtani, amely használható olyan „szerződések” létrehozására, amelyek tetszőleges státuszváltozási funkciók kódolására használhatóak, lehetővé téve a felhasználók számára a fent leírt rendszerek bármelyikének létrehozását, valamint sok olyan más dolgot is, melyre még nem gondoltunk, egyszerűen pár sornyi kódba foglalva az adott logikát. -### Előzmények {#history} +## Bevezetés a Bitcoinba és kapcsolódó koncepciókba {#introduction-to-bitcoin-and-existing-concepts} -A decentralizált digitális valuta, valamint az alternatív alkalmazások, például az ingatlan-nyilvántartások fogalma évtizedek óta létezik. Az 1980-as és 1990-es évek anonim e-cash protokolljai, melyek főleg a Chaum féle vakításként ismert kriptográfiai primitívre támaszkodtak, egy magas fokú adatvédelemmel rendelkező valutát kínáltak, de a protokolloknak többnyire nem sikerült elterjedniük, mivel egy centralizált közvetítőre támaszkodtak. 1998-ban Wei Dai [b-money-je](http://www.weidai.com/bmoney.txt) vált az első javaslattá, mely bemutatta a pénz létrehozásának számítási kirakósok megoldásával történő ötletét, valamint a decentralizált konszenzust, de a javaslat kevés részletet tartalmazott arról, hogy hogyan lehetne megvalósítani a decentralizált konszenzust a gyakorlatban. 2005-ben Hal Finney bemutatta az [újrafelhasználható munkabizonyítékokat](http://nakamotoinstitute.org/finney/rpow/), egy olyan rendszert, amely a b-pénzből származó ötleteket és Adam Back számítási szempontból nehéz Hashcash rejtvényeit használta fel a kriptovaluta koncepciójának megalkotására, de az ideálistól ez is elmaradt azáltal, hogy egy megbízható számítási backendre támaszkodott. Először 2009-ben került bevezetésre a gyakorlatban egy decentralizált valuta Satoshi Nakamoto által, amely egyesítette az alapként szolgáló már létező primitíveket amik a tulajdonjog publikus kulcs kriptográfiával történő kezelésére szolgáltak, egy konszenzus algoritmussal, mely az érmék tulajdonosainak számontartására szolgál és amit "munkabizonyítéknak" nevezünk. +### Előzmények {#history} -A proof-of-work mögötti mechanizmus egy áttörés volt, mivel egyszerre két problémára is megoldást nyújtott. Egyrészt egy olyan egyszerű és mérsékelten hatékony konszenzus algoritmust biztosított, amely lehetővé teszi a hálózat csomópontjainak, vagyis a résztvevő számítógépeknek (node-ok), hogy kollektíven egyetértsenek a Bitcoin főkönyvi állapotának kanonikus frissítéseiről. Másrészt egy olyan mechanizmust biztosított, amely szabad belépést tesz lehetővé abba a konszenzus folyamatba, mely megoldja annak a politikai problémának az eldöntését, hogy ki befolyásolja a konszenzust, emellett a Sybil-támadásokat is megelőzi. Ezt úgy teszi meg, hogy a részvétel formális akadályát - mint például egy adott listán egyedi entitásként való nyilvántartásba vétel követelményét - gazdasági akadályokkal helyettesíti: egy résztvevő csomópont súlya a konszenzusos szavazási folyamatban közvetlenül arányos azzal a számítási erővel, amivel a csomópont rendelkezik. Azóta javaslattétel született egy alternatív megközelítésre, amit _letétbizonyítéknak_ hívnak, mivel a hálózaton résztvevő számítógép, vagy csomópont (node) súlyozását a valuta letétbe helyezésének arányában számítja ki, nem pedig annak számítási kapacitása alapján; a két megközelítés relatív előnyeinek megvitatása meghaladja ennek a cikknek a kereteit, de meg kell jegyezni, hogy mindkét megközelítés felhasználható egy kriptovaluta alapjaként. +A decentralizált digitális valuta, valamint az alternatív alkalmazások, például az ingatlannyilvántartások fogalma évtizedek óta létezik. Az 1980-as és 1990-es évek anonim e-cash protokolljai, melyek főleg a Chaum féle vakításként ismert kriptográfiai primitívre támaszkodtak, egy magas fokú adatvédelemmel rendelkező valutát kínáltak, de a protokolloknak többnyire nem sikerült elterjedniük, mivel egy centralizált közvetítőre támaszkodtak. 1998-ban Wei Dai [b-pénze (b-money)](http://www.weidai.com/bmoney.txt) volt az első javaslat a pénz létrehozására számítási kirakósok megoldásával és decentralizált konszenzussal, de kevés részletet tartalmazott arról, hogyan lehetne az utóbbit megvalósítani a gyakorlatban. 2005-ben Hal Finney bemutatta az [újrafelhasználható proof of work-öket (munkabizonyíték)](https://nakamotoinstitute.org/finney/rpow/), egy olyan rendszert, amely a b-pénzből származó ötleteket és Adam Back számítási szempontból nehéz Hashcash rejtvényeit használta fel a kriptovaluta koncepciójának megalkotására, de az ideálistól elmaradt azáltal, hogy egy megbízható számítási háttérre támaszkodott. Először 2009-ben került bevezetésre a gyakorlatban egy decentralizált valuta Satoshi Nakamoto által, amely egyesítette az alapként szolgáló létező primitíveket – a tulajdonjog publikus kulcs kriptográfiával történő kezelésére – egy konszenzus algoritmussal – az érmék tulajdonosainak számontartására, amelyet „proof-of-work-nek” (munkabizonyíték) nevezünk. -Itt egy blog bejegyzés Vitalik Buterintől, az Ethereum alapítójától az [Ethereum előtörténetéről](https://vitalik.eth.limo/general/2017/09/14/prehistory.html). [Itt](https://blog.ethereum.org/2016/02/09/cut-and-try-building-a-dream/) egy másik blog bejegyzés további történetekkel. +A proof-of-work mögötti mechanizmus egy áttörés volt, mivel egyszerre két problémára is megoldást nyújtott. Egyrészt egy olyan egyszerű és mérsékelten hatékony konszenzusalgoritmust biztosított, amely lehetővé teszi a hálózat csomópontjainak, vagyis a résztvevő számítógépeknek (node), hogy kollektíven egyetértsenek a Bitcoin főkönyvi állapotának kanonikus frissítéseiről. Másrészt egy olyan mechanizmust biztosított, amely szabad belépést tesz lehetővé abba a konszenzusfolyamatba, mely megoldja annak a politikai problémának az eldöntését, hogy ki befolyásolja a konszenzust, emellett a Sybil-támadásokat is megelőzi. Ezt úgy teszi meg, hogy a részvétel formális akadályát – mint például egy listán egyedi entitásként való nyilvántartás követelményét – gazdasági akadályokkal helyettesíti: egy résztvevő csomópont súlya a konszenzusos szavazási folyamatban közvetlenül arányos azzal a számítási erővel, amivel a csomópont rendelkezik. Azóta javaslattétel született egy alternatív megközelítésre, amelyet _proof-of-stake-nek (letéti bizonyíték)_ hívnak, mivel a hálózaton résztvevő számítógép vagy csomópont (node) súlyozását a valuta letétbe helyezésének arányában számítja ki, nem a számítási kapacitása alapján; a két megközelítés relatív előnyeinek megvitatása túlmutat a cikk keretein, ugyanakkor mindkét megközelítés felhasználható egy kriptovaluta alapjaként. -### Bitcoin, mint egy állapot átmeneti rendszer {#bitcoin-as-a-state-transition-system} +### Bitcoin mint egy státuszváltozási rendszer {#bitcoin-as-a-state-transition-system} ![Ethereum állapot átmenet](./ethereum-state-transition.png) -Technikai szempontból egy kriptovaluta, például a Bitcoin főkönyve egy állapot átmeneti rendszernek tekinthető, ahol van egy "állapot", amely számon tartja az összes létező bitcoin tulajdonosi státuszát, és egy "állapot átmeneti függvény", ami az állapothoz egy tranzakció hozzáadásával egy új állapotot eredményez. Például egy szabályos banki rendszerben az állapot a vagyonmérlegnek felel meg, a tranzakció egy kérvény $X összeg átmozgatására A-ból B-be, az állapot átmeneti függvény pedig csökkenti A számlájának értékét $X összeggel, valamint növeli B számlájának értékét $X összeggel. Ha az A számla kevesebb összeggel rendelkezik mint $X, akkor az állapot átmeneti függvény egy hiba jelzést ad vissza. Tehát így definiálható formálisan: +Technikai szempontból egy kriptovaluta, például a Bitcoin főkönyve egy státuszváltozási rendszernek tekinthető, ahol van egy státusz, amely számon tartja az összes létező bitcoin tulajdonosi állapotát, és egy státuszváltozási függvény, ami a státusz és a tranzakció hozzáadásával egy új státuszt eredményez. Például egy szabályos banki rendszerben a státusz a vagyonmérlegnek felel meg, a tranzakció egy kérvény $X összeg átmozgatására A-ból B-be, a státuszváltozási függvény pedig csökkenti A számlájának értékét $X összeggel és növeli B számlájának értékét $X összeggel. Ha az A számla kevesebb összeggel rendelkezik mint $X, akkor a státuszváltozási függvény hibajelzést ad vissza. Tehát így definiálható formálisan: - APPLY(S,TX) -> S' or ERROR +``` +APPLY(S,TX) -> S' or ERROR +``` A fentiekben leírt banki rendszerben: - APPLY({ Alice: $50, Bob: $50 },"küld $20 Alice-tól Bob-nak") = { Alice: $30, Bob: $70 } +```js +APPLY({ Alice: $50, Bob: $50 },"küld $20 Alice-tól Bob-nak") = { Alice: $30, Bob: $70 } +``` De: - APPLY({ Alice: $50, Bob: $50 },"küld $70 Alice-tól Bob-nak") = ERROR - -A Bitcoin "állapota" az összes érme együttvéve (műszaki nyelven "elköltetlen tranzakciós kimenetek" vagy UTXO), amelyek ki lettek bányászva és még nem lettek elköltve. Minden UTXO-nak van egy névértéke és egy tulajdonosa (melyet egy 20 bájtos cím határoz meg, mely lényegében egy kriptográfiai publikus kulcs[fn. 1](#notes)). Egy tranzakció egy vagy több bemenetet tartalmaz, és mindegyik bemenet tartalmaz egy hivatkozást egy meglévő UTXO-ra és egy kriptográfiai aláírást, amelyet a tulajdonos címéhez társított privát kulcs hoz létre, és egy vagy több kimenetet, ahol minden egyes kimenet egy új UTXO-t tartalmaz, amik aztán hozzáadódnak az állapothoz. - -Az állapot átmeneti függvény `APPLY(S,TX) -> S'` nagyjából a következő módon definiálható: - -1. Minden egyes bemenetre a `TX-ben`: - - - Ha a hivatkozott UTXO nincs benne az `S-ben`, hiba visszaadása. - - Ha a szolgáltatott aláírás nem egyezik az UTXO tulajdonosának aláírásával, hiba visszaadása. - -2. Ha az összes bemeneti UTXO egység összege kisebb, mint az összes kimeneti UTXO egység összege, hiba visszaadása. -3. `S'` visszaadása az összes bemeneti UTXO elvételével és az összes UTXO hozzáadásával. +```js +APPLY({ Alice: $50, Bob: $50 },"küld $70 Alice-tól Bob-nak") = ERROR +``` + +A Bitcoin státusza az összes érme együttvéve (technikailag az „elköltetlen tranzakciós kimenetek” vagy UTXO), amelyek ki vannak bányászva és még nem lettek elköltve. Minden UTXO-nak van egy névértéke és egy tulajdonosa (melyet egy 20 bájtos cím határoz meg, lényegében egy kriptográfiai publikus kulcs[fn1](#jegyzetek)). Egy tranzakció egy vagy több bemenetet tartalmaz, és mindegyik bemenet tartalmaz egy hivatkozást egy meglévő UTXO-ra és egy kriptográfiai aláírást, amelyet a tulajdonos címéhez társított privát kulcs hoz létre, és egy vagy több kimenetet, ahol minden egyes kimenet egy új UTXO-t tartalmaz, amik aztán hozzáadódnak a státuszhoz. + +A státuszváltozási függvény `APPLY(S,TX) -> S'` a következő módon definiálható: + +
      +
    1. + Minden egyes bemenetre a TX-ben: +
        +
      • + Ha a hivatkozott UTXO nincs benne az S-ben, hiba visszaadása. +
      • +
      • + Ha a szolgáltatott aláírás nem egyezik az UTXO tulajdonosának aláírásával, hiba visszaadása. +
      • +
      +
    2. +
    3. + Ha az összes bemeneti UTXO egység összege kisebb, mint az összes kimeneti UTXO egység összege, hiba visszaadása. +
    4. +
    5. + S visszaadása az összes bemeneti UTXO elvételével és az összes UTXO hozzáadásával. +
    6. +
    Az első lépés első fele megakadályozza, hogy a tranzakciók feladói nem létező érméket költsenek el, az első lépés második fele pedig megakadályozza, hogy a tranzakciók feladói mások érméit költsék el, a második lépés pedig az érték megőrzését hajtja végre. Ahhoz, hogy ezt fizetésnél használjuk, a protokoll a következő. Tegyük fel, hogy Alice 11,7 BTC-t szeretne Bob-nak átutalni. Először Alice megkeresi az általa birtokolt elérhető UTXO-k egy olyan halmazát, melynek összege legalább 11.7 BTC. A valóságban Alice nem fog pont 11.7 BTC-t találni; mondjuk, hogy a legkisebb, amit megtalált 6+4+2=12. Ezután elkészít egy tranzakciót ezzel a három bemenettel és két kimenettel. Az első kimenet 11.7 BTC lesz, aminek Bob címe lesz a tulajdonosa, a második kimenet pedig a maradék 0.3 BTC "visszajáró", melynek maga Alice a tulajdonosa. @@ -59,18 +78,18 @@ Az első lépés első fele megakadályozza, hogy a tranzakciók feladói nem l ![Ethereum blokkok](./ethereum-blocks.png) -Ha hozzáférnénk egy megbízható, központosított szolgáltatáshoz, ezt a rendszert jelentéktelen lenne megvalósítani; mivel ugyanezt pontosan a leírtak szerint lehetne kódolni, egy központosított, azaz centralizált szerver merevlemezén tárolva az állapotot. Azonban a Bitcoinnal egy decentralizált pénz rendszert próbálunk építeni, így az állapot átmeneti rendszert egy konszenzus rendszerrel kell kombinálnunk, hogy biztosítsuk, hogy mindenki egyetért a tranzakciók sorrendje felett. A Bitcoin decentralizált konszenzus folyamata elvárja a hálózat résztvevőitől, hogy folyamatosan tranzakciókból álló csomagokat próbáljanak készíteni, melyeket '"blokkoknak" hívunk. A hálózat nagyjából egy blokkot szándékozik gyártani minden tizedik percben, ahol minden egyes blokk tartalmaz egy időbélyeget, egy nonce-t, egy hivatkozást az előző blokkra (vagyis hash-t), és az összes olyan tranzakciót tartalmazó listát, melyek az előző blokk után következtek. Idővel egy tartós, folyamatosan növekvő "blokklánc" jön létre, mely folyamatosan frissül, hogy a Bitcoin főkönyv legutóbbi állapotát reprezentálja. +Ha hozzáférnénk egy megbízható, központosított szolgáltatáshoz, ezt a rendszert egyértelmű lenne megvalósítani; mivel pontosan a leírtak szerint lehetne kódolni egy központosított, azaz centralizált szerver merevlemezén tárolva az állapotot. Azonban a Bitcoin egy decentralizált pénzrendszert próbált kiépíteni, így a státuszváltozási rendszert egy konszenzusrendszerrel kell kombinálni, hogy biztosítsa, hogy mindenki egyetért a tranzakciók sorrendjével. A Bitcoin decentralizált konszenzus folyamata elvárja a hálózat résztvevőitől, hogy folyamatosan tranzakciókból álló csomagokat próbáljanak készíteni, melyeket '"blokkoknak" hívunk. A hálózat nagyjából egy blokkot szándékozik gyártani minden tizedik percben, ahol minden egyes blokk tartalmaz egy időbélyeget, egy nonce-t, egy hivatkozást az előző blokkra (vagyis hash-t), és az összes olyan tranzakciót tartalmazó listát, melyek az előző blokk után következtek. Idővel egy tartós, folyamatosan növekvő "blokklánc" jön létre, mely folyamatosan frissül, hogy a Bitcoin főkönyv legutóbbi állapotát reprezentálja. A blokkok érvényességét ellenőrző algoritmust az alábbi paradigma szerint lehet kifejezni: -1. Ellenőrizni, hogy a blokk által hivatkozott előző blokk létezik és érvényes. -2. Ellenőrizni, hogy a blokk időbélyege nagyobb-e, mint az előző blokké[fn. 2](#notes) és kevesebb mint 2 óra telt el azóta -3. Ellenőrizni, hogy a blokk munkabizonyítéka érvényes-e. -4. Legyen `S[0]` az előző blokk után lévő állapot. -5. Legyen `TX` a blokk tranzakciós listája `n` tranzakcióval. Minden `i-re` `0...n-1-ig`, `S[i+1] = APPLY(S[i],TX[i])` Ha bármely lépés hibát ad vissza, kilépni és false értéket visszaadni. -6. True visszaadása, és `S[n]` regisztrálása az állapotként a blokk végén. +1. Ellenőrzi, hogy a blokk által hivatkozott előző blokk létezik és érvényes. +2. Ellenőrzi, hogy a blokk időbélyege nagyobb-e, mint az előző blokké[fn2](#jegyzetek) és kevesebb mint 2 óra telt el azóta +3. Ellenőrzi, hogy a blokk proof-of-work-je érvényes-e. +4. Legyen `S[0]` az előző blokk után lévő állapot. +5. Legyen `TX` a blokk tranzakciós listája `n` tranzakcióval. Minden `i`-re `0...n-1`-ig legyen beállítva `S[i+1] = APPLY(S[i],TX[i])`. Ha bármely lépés hibát ad vissza, kilép és hamis értéket ad vissza. +6. Igaz érték visszaadása, és `S[n]` regisztrálása státuszként a blokk végén. -Lényegében a blokkban szereplő minden tranzakciónak érvényes állapot átmenetet kell biztosítania a tranzakció lefutása előtti kanonikus állapotból egy új állapotba. Fontos megjegyezni, hogy az állapot semmilyen módon nincs belekódolva a blokkba; pusztán absztrakció, amelyre a hálózat érvényesítő résztvevőjének emlékeznie kell, és bármely blokkra (biztonságosan) csak akkor számítható ki, ha a kezdeti állapotból indulunk ki, és minden tranzakciót egymás után lefuttatunk minden blokkban. Továbbá meg kell jegyezni, hogy az is számít, hogy a bányász a tranzakciókat milyen sorrendben helyezte el a blokkban; ha van két olyan A és B tranzakció a blokkban, ahol B az A által létrehozott UTXO-t költi el, a blokk akkor lesz érvényes, ha A előbb van mint B, fordítva nem. +Lényegében a blokkban szereplő minden tranzakciónak érvényes státuszváltozást kell biztosítania a tranzakció lefutása előtti kanonikus állapotból egy új állapotba. Fontos megjegyezni, hogy a státusz nincs belekódolva a blokkba; pusztán absztrakció, amelyre a hálózat érvényesítő résztvevőjének emlékeznie kell, és bármely blokkra (biztonságosan) csak akkor számítható ki, ha a kezdeti státuszból indulunk ki, és minden tranzakciót egymás után lefuttatunk minden blokkban. Továbbá meg kell jegyezni, hogy az is számít, hogy a bányász a tranzakciókat milyen sorrendben helyezte el a blokkban; ha van két olyan A és B tranzakció a blokkban, ahol B az A által létrehozott UTXO-t költi el, a blokk akkor lesz érvényes, ha A előbb van mint B, fordítva nem. A fenti listában szereplő érvényességi feltételek közül egyedül a "munkabizonyíték" szükségessége nem található meg más rendszereknél. A pontos feltétel pedig az, hogy minden blokk dupla-SHA256 hashének, melyet egy 256 bites számként kezelünk, kisebbnek kell lennie, mint egy dinamikusan beállított célérték, mely ennek az anyagnak a megírása közben 2187. Ennek a célja, hogy a blokk létrehozása számítási szempontból "nehéz" legyen, és hogy ezáltal megakadályozza a sybil-támadókat, hogy átalakítsák a teljes blokkláncot a saját érdekükben. Mivel az SHA256-ot úgy tervezték, hogy egy teljesen megjósolhatatlan álvéletlen (pszeudo-random) függvény legyen, így a blokk létrehozásának egyetlen módja a próbaszerencse (trial and error), vagyis ismételten növelni kell a nonce-t és figyelni, hogy az új hash megfelelő-e. @@ -78,14 +97,14 @@ A jelenlegi 2187-es cél esetében, a hálózatnak átlagosan \~2k UTXO minden k-ra egészen 30-ig) és az O eldönti, hogy melyik UTXO-t küldi A-nak és melyiket B-nek. -- **Az állapot hiánya** - a [Egy UTXO lehet elköltött vagy elköltetlen](https://bitcoin.org/en/glossary/unspent-transaction-output); nincs lehetőség többlépcsős szerződésekre vagy szkriptekre, amelyek minden más belső állapotot ezen túl tartana. Ez megnehezíti a többlépcsős opciós szerződések, decentralizált csereajánlatok vagy kétlépcsős kriptográfiai elköteleződési protokollok létrehozását (ami szükséges a biztonságos számítási kompenzációhoz). Ez azt is jelenti, hogy az UTXO csak egyszerű, egyszeri szerződések és nem bonyolultabb "állapottal rendelkező" szerződések, például decentralizált szervezetek létrehozására használható, és a metaprotokollok megvalósítását megnehezíti. A bináris állapot az értékvaksággal kombinálva azt is jelenti, hogy egy másik fontos alkalmazás, a kiutalási limitek beállítása, sem lehetséges. -- **Blockchain-vakság** - Az UTXO nem tud az olyan blokklánc adatokról, mint a nonce, az időbélyeg vagy az előző blokk hash. Ez súlyosan korlátozza a szerencsejátékokban és számos más kategóriában történő alkalmazásokat azáltal, hogy megfosztja a szkript nyelvet a véletlenszerűség potenciálisan értékes forrásától. +- **Turing-teljesség hiánya** - vagyis, bár van egy nagy számítási részhalmaz, amelyet a Bitcoin szkriptnyelv támogat, közel sem támogat mindent. A fő kategória a hiányzó ciklusok. Ennek az az oka, hogy elkerüljük a végtelen ciklusokat a tranzakció ellenőrzések során; elméletileg ez egy leküzdhetetlen akadály a szkriptprogramozók számára, mivel bármely ciklus szimulálható úgy, hogy egyszerűen megismételjük több alkalommal a mögöttes kódot egy „if” (ha) utasítással, de ez nagyon kis hatékonyságú szkriptekhez vezet. Például egy alternatív elliptikus görbe aláírás algoritmus implementálása valószínűleg 256 ismételt szorzási kört igényelne, mely mindegyike egyenként szerepelne a kódban. +- **Értékvakság** - nincs olyan UTXO szkript, mely képes lenne szofisztikáltan irányítani a kiutalható mennyiséget. Például egy oracle-szerződés komoly felhasználási területe a hedging szerződés, ahova A és B $1000 értékű BTC-t tesz be és 30 nappal később a szkript elküld $1000 értékű BTC-t A részére a maradékot pedig B részére. Ez egy oracle-t igényel, mely meghatározza 1 BTC értékét USD-ben, de még így is hatalmas előrelépés a bizalom és az infrastrukturális követelmények szempontjából a teljesen centralizált megoldásokhoz képest. Azonban mivel az UTXO mindent vagy semmit elven működik, ennek az egyedüli módja, ha sok UTXO-t használunk különböző egységekkel (például egy 2k UTXO minden k-ra egészen 30-ig) és az O eldönti, hogy melyik UTXO-t küldi A-nak és melyiket B-nek. +- **Státuszhiány** - az UTXO lehet elköltött vagy elköltetlen; nincs lehetőség többlépcsős szerződésekre vagy szkriptekre, amelyek megtartanak minden más belső státuszt ezen túl. Ez megnehezíti a többlépcsős opciós szerződések, decentralizált csereajánlatok vagy kétlépcsős kriptográfiai elköteleződési protokollok létrehozását (ami szükséges a biztonságos számítási kompenzációhoz). Ez azt is jelenti, hogy az UTXO csak egyszerű, egyszeri szerződések és nem bonyolultabb „státuszos” szerződések, például decentralizált szervezetek létrehozására használható, és a metaprotokollok megvalósítását megnehezíti. A bináris állapot az értékvaksággal kombinálva azt is jelenti, hogy egy másik fontos funkció, a kiutalási limitek beállítása, sem lehetséges. +- **Blokkláncvakság** - az UTXO nem tud az olyan blokkláncadatokról, mint a nonce, az időbélyeg vagy az előző blokkhash. Ez súlyosan korlátozza a szerencsejátékokban és számos más kategóriában történő alkalmazásokat azáltal, hogy megfosztja a szkript nyelvet a véletlenszerűség értékes forrásától. Így meglátásunk szerint háromféleképpen lehet fejlett alkalmazásokat fejleszteni egy kriptovalutára: új blokklánc indítása, a Bitcoin szkripting használata és egy meta protokoll fejlesztése Bitcoinra. Egy új blokklánc indítása lehetővé teszi a korlátlan szabadságot a funkciókészlet építésében, de a fejlesztési idő, a bootstrapping és a biztonság árán. A szkriptek használata egyszerűen megvalósítható és szabványosítható, de nagyon korlátozott a képességeiben, és a meta protokollok, míg egyszerűek, nehezen skálázhatóak. Az Ethereummal egy olyan alternatív keretrendszert szeretnénk létrehozni, mely még jobban megkönnyíti a fejlesztést, valamint erősebb könnyű kliens tulajdonságokkal rendelkezik, egyúttal az alkalmazásoknak egy közös gazdasági környezetet és blokklánc biztonságot biztosít. ## Ethereum {#ethereum} -Az Ethereum célja egy alternatív protokoll létrehozása decentralizált alkalmazások fejlesztésére, különböző kompromisszumokkal, amelyről úgy hisszük, hogy nagyon hasznos lesz a decentralizált alkalmazások nagy részének, különös tekintettel az olyan esetekre, ahol fontos a gyors fejlesztési idő, a biztonság a kisméretű és ritkán használt alkalmazások számára, és a különböző alkalmazások közötti nagyon hatékony együttműködés. Az Ethereum ezt úgy éri el, hogy felépíti azt, ami lényegében a végső absztrakt alapréteg: egy blokkláncot beépített Turing-teljes programozási nyelvvel, mely lehetővé teszi bárki számára az okosszerződés írást és a decentralizált alkalmazás fejlesztést, ahol létrehozhatják a saját tetszőleges tulajdonjogi szabályaikat, tranzakció formátumukat és az állapot átmeneti függvényeket. A Namecoin lecsupaszított verziója két sornyi kódból megírható, a többi protokoll, mint például a valuták és az identitás rendszerek pedig kevesebb, mint húsz sorból. Okosszerződések, olyan kriptográfiai "dobozok", melyek értéket tartalmaznak és csak akkor nyílnak ki amikor bizonyos feltételek teljesülnek, szintén építhetőek a platformra sokkal nagyobb erővel, mint amit a Bitcoin szkriptelés kínál, a Turing-teljesség, érték-tudatosság, blokklánc-tudatosság és az "állapot" hozzáadott ereje miatt. - -### Filozófia {#philosophy} - -Az Ethereum mögötti elgondolás az alábbi elveket szándékozik követni: - -1. **Egyszerűség**: az Ethereum protokollnak a lehető legegyszerűbbnek kell lennie, még az adattárolás vagy az időhatékonyság rovására is.[fn. 3](#notes) Egy átlagos programozó ideális esetben képes a teljes részletes leírást követni és implementálni,[fn. 4](#notes) annak érdekében, hogy teljes mértékben kiaknázhassuk a kriptovaluta példátlan demokratizálási potenciálját, és tovább terjesszük az Ethereum mint mindenki számára nyitott protokoll elképzelését. Az olyan optimalizálásokat, melyek a komplexitás növelésével járnak, nem szabad használni, kivéve ha az optimalizálás jelentős előnnyel jár. -2. **Univerzalitás**: az Ethereum design filozófia egyik alapvetése, hogy az Ethereumnak nincsenek "jellemző vonásai".[fn. 5](#notes) Ehelyett az Ethereum egy olyan Turing-teljes szkript nyelvet szolgáltat, mellyel a programozó bármilyen okosszerződést vagy tranzakció típust felépíthet, melyek matematikailag definiálhatóak. Szeretnéd feltalálni a saját pénzügyi származékos termékedet? Az Ethereummal megteheted. Szeretnéd létrehozni a saját valutádat? Hozd létre egy Ethereum szerződéssel. Szeretnél egy teljeskörű Daemont vagy Skynetet felállítani? Lehet, hogy szükséged lesz pár ezer összekapcsolódó szerződésre és számíts rá, hogy bőkezűen kell majd őket táplálnod, de semmi nem állíthat meg a karnyújtásnyira lévő Ethereummal. -3. **Modularitás**: az Ethereum protokoll részeit annyira modulárissá és szétválaszthatóvá kell tervezni, amennyire csak lehetséges. A fejlesztés során az a célunk, hogy egy olyan programot hozzunk létre, amiben ha valahol egy kisebb protokoll módosítást viszünk végbe, az alkalmazási verem (stack) továbbra is működni fog további módosítás nélkül. Az olyan innovációkat, mint az Ethash (lásd [Sárga Könyv Függelék](https://ethereum.github.io/yellowpaper/paper.pdf#appendix.J) vagy [wiki szócikk](https://github.com/ethereum/wiki/wiki/Ethash)), a módosított Patricia fák ([Sárga Könyv](https://ethereum.github.io/yellowpaper/paper.pdf#appendix.D), [wiki](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-Patricia-Tree)) és az RLP ([YP](https://ethereum.github.io/yellowpaper/paper.pdf#appendix.B), [wiki](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP)) különálló, funkció-teljes könyvtárként kell alkalmazni, és így is vannak alkalmazva. Ennek az az oka, hogy annak ellenére, hogy az Ethereumban használjuk őket, még ha az Ethereum nem is igényli bizonyos funkcióit, ezek a funkciók más protokollok számára is hasznosak lehetnek. Az Ethereum fejlesztést úgy kell maximálisan elvégezni, hogy a teljes kriptovaluta ökoszisztéma javát szolgálja, ne csak a sajátját. -4. **Agilitás**: az Ethereum protokoll részletei nincsenek kőbe vésve. Azonban rendkívül megfontoltak leszünk a magas szintű konstrukciók megváltoztatását illetően, mint például a [sharding ütemterv](https://ethresear.ch/t/sharding-phase-1-spec/1407/) esetében a végrehajtás absztrahálása csak az adatok konszenzusos elérhetőségével fog történni. A fejlesztési folyamat során történő későbbi számítási tesztek arra a felfedezésre vezethetnek, hogy bizonyos módosítások például a protokoll felépítésében vagy az Ethereum Virtuális Gépben (EVM) jelentős mértékben növelhetik a skálázhatóságot vagy a biztonságot. Ha találunk ilyen lehetőségeket, akkor ki fogjuk használni őket. -5. **Megkülönböztetés-mentesség** és **cenzúra-mentesség**: a protokoll nem kísérelheti meg bizonyos használati kategóriák aktív betiltását vagy megelőzését. A protokoll összes szabályozási mechanizmusát arra kell tervezni, hogy közvetlenül a károkozást szabályozza nem pedig a bizonyos nemkívánatos alkalmazásokat. Egy programozó akár egy végtelen ciklusos szkriptet is futtathat az Ethereumon, amíg hajlandó fizetni a számítási lépések tranzakciós díját. +Az Ethereum célja egy alternatív protokoll létrehozása decentralizált alkalmazások fejlesztésére, különböző kompromisszumokkal, amelyről úgy hisszük, hogy nagyon hasznos lesz a decentralizált alkalmazások nagy részének, különös tekintettel az olyan esetekre, ahol fontos a gyors fejlesztési idő, a biztonság a kisméretű és ritkán használt alkalmazások számára, és a különböző alkalmazások közötti nagyon hatékony együttműködés. Az Ethereum ezt úgy éri el, hogy felépíti azt, ami lényegében a végső absztrakt alapréteg: egy blokkláncot beépített Turing-teljes programozási nyelvvel, mely lehetővé teszi bárki számára az okosszerződés írást és a decentralizált alkalmazás fejlesztést, ahol létrehozhatják a saját tetszőleges tulajdonjogi szabályaikat, tranzakció formátumukat és a státuszváltozási függvényeket. A Namecoin lecsupaszított verziója két sornyi kódból megírható, a többi protokoll, mint például a valuták és az identitás rendszerek pedig kevesebb, mint húsz sorból. Okosszerződések, olyan kriptográfiai „dobozok”, melyek értéket tartalmaznak és csak akkor nyílnak ki, amikor bizonyos feltételek teljesülnek, szintén építhetőek a platformra sokkal nagyobb erővel, mint amit a Bitcoin szkriptelés kínál, a Turing-teljesség, értéktudatosság, blokklánctudatosság és a státusz hozzáadott értéke miatt. ### Ethereum számlák {#ethereum-accounts} -Az Ethereumban az állapotot "számláknak" nevezett objektumok alkotják, ahol minden egyes számla egy 20-bájtos címmel rendelkezik és az állapot átmenetet a számlák közötti közvetlen érték és információ átutalás végzi. Az Ethereum számlák négy mezőt tartalmaznak: +Az Ethereumban a státuszt „számláknak” nevezett objektumok alkotják, ahol minden egyes számla egy 20-bájtos címmel rendelkezik és a státuszváltozást a számlák közötti közvetlen érték és információ átadás végzi. Az Ethereum számlák négy mezőt tartalmaznak: - A **nonce**, egy számláló, mely biztosítja, hogy minden tranzakció csak egyszer kerül feldolgozásra - A számla jelenlegi **ether egyenlege** -- A számla **szerződés kódja**, ha van +- A számla **szerződéskódja**, ha van - A számla **tárhelye** (alapértelmezetten üres) -Az "Ether" az Ethereum elsődleges belső kripto-üzemanyaga és a tranzakciós díj kifizetésére lehet használni. Általánosságban kétfajta számlatípus létezik: **külső tulajdonú számlák**, melyeket privát kulcsok irányítanak és **szerződéses számlák**, melyeket a szerződés kódjuk irányít. Az külső tulajdonú számlának nincsen kódja, és az adott személy üzenetet küldhet egy külső tulajdonú számláról egy tranzakció létrehozásával és aláírásával; a szerződéses számla esetében minden esetben, amikor a szerződéses számla egy üzenetet kap aktiválódik a kódja, ennek hatására lehetővé teszi a belső tárhely írását és olvasását, új üzenetek küldését vagy szerződés létrehozást. +Az „ether” az Ethereum elsődleges, belső kriptoüzemanyaga és a tranzakciós díj kifizetésére lehet használni. Általánosságban kétfajta számlatípus létezik: **külső tulajdonú számlák**, melyeket privát kulcsok irányítanak és **szerződéses számlák**, melyeket a szerződéskódjuk irányít. Az külső tulajdonú számlának nincsen kódja, és az adott személy üzenetet küldhet egy külső tulajdonú számláról egy tranzakció létrehozásával és aláírásával; a szerződéses számla esetében minden esetben, amikor e számla üzenetet kap, aktiválódik a kódja, ami lehetővé teszi a belső tárhely írását és olvasását, új üzenetek küldését vagy szerződés létrehozását. -Fontos megjegyezni, hogy az Ethereumban a "szerződésekre" nem úgy kell tekinteni, mint amit „teljesíteni” vagy „betartani” kell; inkább "autonóm ügynökök", akik az Ethereum végrehajtási környezetében élnek, és mindig végrehajtanak egy adott kóddarabot, amikor "megböki" őket egy a üzenet vagy tranzakció, és közvetlen ellenőrzésük alatt tartják saját Ether egyenlegüket és saját kulcsérték-adatbázisukat, a tartós változók nyomon követésére. +Fontos megjegyezni, hogy az Ethereumban a szerződések nem olyan egyezmények, amelyet teljesíteni vagy betartani kell; inkább „önálló ügynökök”, akik az Ethereum végrehajtási környezetében élnek, és végrehajtanak egy adott kóddarabot, amikor beindítja azokat egy üzenet vagy tranzakció, továbbá közvetlen ellenőrzésük alatt tartják saját ether egyenlegüket és saját kulcs-érték-adatbázisukat a tartós változók nyomon követésére. ### Üzenetek és tranzakciók {#messages-and-transactions} -A "tranzakció" kifejezést az Ethereumban egy aláírt adat csomagra használjuk, ami egy külső tulajdonú számláról érkező üzenetet tartalmaz. A tranzakció a következőket tartalmazza: +A „tranzakció” kifejezést az Ethereumban egy aláírt adatcsomagra használjuk, ami egy külső tulajdonú számláról érkező üzenetet tartalmaz. A tranzakció a következőket tartalmazza: - Az üzenet címzettje - A küldőt azonosító aláírás -- Az Ether összeg, amit a küldő át akar utalni a címzettnek +- Az ether összeg, amit a küldő át akar utalni a címzettnek - Egy opcionális adat mező -- A `STARTGAS` érték, ami a tranzakció végrehajtás számítási lépéseinek maximális számát jelenti -- A `GASPRICE` érték, ami a számítási lépésenkénti díjat jelenti, amit a feladó fizet +- A `STARTGAS` érték, ami a tranzakcióvégrehajtás számítási lépéseinek maximális számát jelenti +- A `GASPRICE` érték, ami a számítás lépésenkénti díját jelenti, amit a feladó fizet -Az első három olyan alap mező, ami minden kripto valutánál megtalálható. Az adatmezőnek alapértelmezés szerint nincs funkciója, de a virtuális gép rendelkezik egy opkóddal, amelyet a szerződés használhat az adatok elérésére; mint például, amikor egy szerződés domain regisztrációs szolgáltatásként működik a blokkláncon, akkor úgy értelmezheti a hozzá érkező adatot, hogy az két "mezőt" tartalmaz, az első mező a regisztrálandó domain, a második mező pedig az IP-cím, amelyre regisztrálni kell. A szerződés elolvassa ezeket az adatokat az üzenetből, és a megfelelő helyükre helyezi el őket az adattárban. +Az első három olyan alap mező, ami minden kriptovalutánál megtalálható. Az adatmezőnek alapértelmezés szerint nincs funkciója, de a virtuális gép rendelkezik egy opkóddal, amelyet a szerződés használhat az adatok elérésére; például amikor egy szerződés domain regisztrációs szolgáltatásként működik a blokkláncon, akkor úgy értelmezheti a hozzá érkező adatot, hogy az két „mezőt” tartalmaz, az első a regisztrálandó domain, a második az IP-cím, amelyre regisztrálni kell. A szerződés elolvassa ezeket az adatokat az üzenetből, és a megfelelő helyükre helyezi azokat az adattárban. -The `STARTGAS` és `GASPRICE` mezők kritikusak az Ethereum szolgáltatás megtagadása elleni modelljében. A véletlen vagy rosszindulatú végtelen ciklusok vagy más számítási kódveszteség megelőzésének érdekében minden tranzakciónak korlátot kell szabnia arra vonatkozóan, hogy a kódfuttatás hány számítási lépést használhat. A számítás alapvető egysége a "gas"; általában egy számítási lépés 1 gas-ba kerül, de egyes műveletek magasabb gas mennyiségbe kerülnek, mert számítási szempontból drágábbak, vagy növelik az állapot részeként tárolandó adatok mennyiségét. Továbbá minden egyes tranzakciós adatban található byte után 5 gas díj is felszámításra kerül. A díjrendszer célja, hogy megkövetelje a támadótól, hogy minden általa felhasznált erőforrásért arányosan fizessen, beleértve a számítást, a sávszélességet és a tárhelyet is; ennélfogva minden olyan tranzakció esetében, amelynek eredményeként a hálózat ezeknek az erőforrásoknak bármelyikét nagyobb mennyiségben fogyasztja, az erőforrások növekedésével nagyjából arányos gas költséggel kell számolni. +A `STARTGAS` és `GASPRICE` mezők kritikusak az Ethereum szolgáltatásmegtagadás elleni védekezés modelljében. Azért, hogy megelőzzük a véletlen vagy ártó szándékú végtelen ciklusokat vagy más számítási pazarlással járó kódot, minden egyes tranzakciónak be kell állítani egy határt, hogy mennyi számítási lépést hajthat végre a kódlefutás. A számítás alapvető egysége a „gáz”; általában egy számítási lépés 1 gázba kerül, de egyes műveletek többet igényelnek, mert számítási szempontból drágábbak, vagy növelik a státuszként tárolandó adatok mennyiségét. Továbbá minden egyes tranzakciós adatban található bájt után 5 gázdíj is felszámításra kerül. A díjrendszer célja, hogy megkövetelje a támadótól, hogy minden általa felhasznált erőforrásért arányosan fizessen, beleértve a számítást, a sávszélességet és a tárhelyet is; ennélfogva minden olyan tranzakció esetében, amelynek eredményeként a hálózat ezeknek az erőforrásoknak bármelyikét nagyobb mennyiségben fogyasztja, az erőforrások növekedésével nagyjából arányos gázköltséggel kell számolni. ### Üzenetek {#messages} -A szerződéseknek meg van a lehetőségük, hogy "üzeneteket" küldjenek más szerződéseknek. Az üzenetek olyan virtuális objektumok, amik soha nincsenek szerializálva és csak az Ethereum futtatási környezetben léteznek. Az üzenet a következőket tartalmazza: +A szerződéseknek megvan a lehetőségük, hogy „üzeneteket” küldjenek más szerződéseknek. Az üzenetek olyan virtuális objektumok, amelyek nincsenek sorosítva és csak az Ethereum futtatási környezetben léteznek. Az üzenet a következőket tartalmazza: - Az üzenet küldője (magától értetődő) - Az üzenet címzettje -- Az üzenettel küldendő Ether összege -- Egy opcionális adat mező +- Az üzenettel küldendő ether összege +- Egy opcionális adatmező - A `STARTGAS` érték -Lényegében az üzenet olyan mint a tranzakció, kivéve, hogy nem a külső szereplő által lett létre hozva, hanem a szerződés által. Üzenet akkor jön létre, amikor a kódot jelenleg végrehajtó szerződés végrehajtja a `CALL` opkódot, amely előállítja és vére hajtja az üzenetet. Úgy mint a tranzakció, az üzenet is a kódja futtatására vezeti a címzett számlát. Ezáltal a szerződéseknek is ugyanúgy lehet kapcsolatuk másik szerződésekkel, mint a külső szereplőknek. +Lényegében az üzenet olyan mint a tranzakció, kivéve, hogy nem a külső szereplő, hanem a szerződés hozta létre. Üzenet akkor jön létre, amikor a kódot végrehajtó szerződés a `CALL` opkódot futtatja, amely előállítja és végrehajtja az üzenetet. A tranzakcióhoz hasonlóan az üzenet is a címzett számla kódjának lefuttatását eredményezi. Ezáltal a szerződéseknek is ugyanúgy lehet kapcsolatuk másik szerződésekkel, mint a külső szereplőknek. -Megjegyzendő, hogy a tranzakciók vagy szerződések által kiszabott gas díj vonatkozik a teljes gas összegre, amit az a tranzakció és az összes alvégrehajtási folyamat felhasznált. Például, ha egy külső szereplő A küld egy tranzakciót B-nek 1000 gas-al, és B 600 gas-t fogyaszt, mielőtt üzenetet küldene C-nek, és C belső végrehajtása 300 gas-t fogyaszt, mielőtt visszatérne, akkor B további 100 gas-t költhet, mielőtt kifogyna a gas-ból. +Megjegyzendő, hogy a tranzakciók vagy szerződések által kiszabott gázdíj a teljes gázmennyiségre vonatkozik, amit az a tranzakció és az összes végrehajtási folyamat felhasznált. Például, ha a külső szereplő A küld egy tranzakciót B-nek 1000 gázzal, és B 600 gázt fogyaszt, mielőtt üzenetet küldene C-nek, és C belső végrehajtása 300 gázt fogyaszt, mielőtt visszatérne, akkor B még további 100 gázt költhet el. -### Ethereum állapotátmenet függvény {#ethereum-state-transition-function} +### Ethereum státuszváltozási függvény {#ethereum-state-transition-function} -![Ether állapot átmenet](./ether-state-transition.png) +![Ether státuszváltozás](./ether-state-transition.png) -Az Ethereum állapotátmenet függvény, `APPLY(S,TX) -> S'` a következőképpen írható le: +Az Ethereum státuszváltozási függvény `APPLY(S,TX) -> S'` a következőképpen írható le: -1. Ellenőrizni, hogy a tranzakció jól formált-e (azaz megfelelő-e az értékek száma), az aláírás érvényes-e, és a nonce megegyezik-e a feladó számláján szereplő nonce-al. Ha nem, hiba vissza adása. -2. Kiszámítani a tranzakciós díjat a következőképpen `STARTGAS * GASPRICE`, és meghatározni a küldő címet az aláírásból. Levonni a díjat a küldő fél számla egyenlegéről és növelni a küldő fél nonce-át. Ha nincs elegendő egyenleg, hiba vissza adása. -3. Beállítani a `GAS = STARTGAS` kezdőértéket és bizonyos mennyiségű, bájtonkénti gas-t elvenni a tranzakció bájtjainak kifizetéséhez. -4. Átutalni a tranzakció értékét a küldő számlájáról a fogadó számlájára. Ha a fogadó számla még nem létezik, létrehozni azt. Ha a fogadó számla egy szerződés, futtatni a szerződés kódját, addig amíg a tranzakció teljesül, vagy ameddig a végrehajtás során elfogy a gas. -5. Ha az érték átutalás azért nem sikerült, mert a feladónak nem volt elegendő pénze, vagy a kódfuttatás során elfogyott a gas, akkor minden állapotváltozást visszavonni, kivéve a díjak kifizetését, és a díjakat a bányász számlájához hozzáadni. -6. Máskülönben az összes fennmaradó gas díjat visszatéríteni a feladónak, az elfogyasztott gas-ért fizetett díjakat pedig elküldeni a bányásznak. +1. Ellenőrzi, hogy a tranzakció jól formált-e (megfelelő az értékek száma), az aláírás érvényes-e, és a nonce megegyezik-e a feladó számláján szereplő nonce-szal. Ha nem, hiba visszaadása. +2. Kiszámítja a tranzakciós díjat a következőképpen `STARTGAS * GASPRICE`, és meghatározza a küldő címét az aláírásból. Levonja a díjat a küldő fél számlaegyenlegéről és növeli a küldő fél nonce-át. Ha nincs elegendő egyenleg, hiba visszaadása. +3. Beállítja a `GAS = STARTGAS` kezdőértéket, és bizonyos mennyiségű, bájtonkénti gázt elvesz a tranzakció bájtjainak kifizetéséhez. +4. Átutalja a tranzakció értékét a küldő számlájáról a fogadó számlájára. Ha a fogadó számla még nem létezik, létrehozza azt. Ha a fogadó számla egy szerződés, futtatja a szerződés kódját, addig amíg a tranzakció teljesül, vagy ameddig a végrehajtás során elfogy a gáz. +5. Ha az érték átutalás azért nem sikerült, mert a feladónak nem volt elegendő pénze, vagy a kódfuttatás során elfogyott a gáz, akkor minden állapotváltozást visszavon, kivéve a díjak kifizetését, majd a díjakat a bányász számlájához adja. +6. Máskülönben az összes fennmaradó gázdíjat visszatéríti a feladónak, az elfogyasztott gázért fizetett díjakat pedig elküldi a bányásznak. -Például tegyük fel, hogy a szerződés kódja: +Tegyük fel, hogy a szerződés kódja a következő: - if !self.storage[calldataload(0)]: - self.storage[calldataload(0)] = calldataload(32) +```py +if !self.storage[calldataload(0)]: + self.storage[calldataload(0)] = calldataload(32) +``` -Megjegyzendő, hogy a valóságban a szerződés alacsony szintű EVM programozási nyelven van írva; ez a példa az érthetőség kedvéért az egyik magas szintű programozási nyelven, a Serpent-en íródott, és le lehet fordítani EVM kódra. Tegyük fel, hogy a szerződés tárhelye az elején üres, és egy 10 Ether értékű tranzakciót elküldenek 2000 gas-al, 0,001 Ether gas árral, és 64 bájtnyi adattal, ahol 0-31 bájtok a `2` számot ábrázolják, és 32-63 bájtok pedig a karakterláncot ábrázolják `CHARLIE`.[fn. 6](#notes) Az állapot átmeneti függvény folyamata ebben az esetben a következőképpen alakul: +Megjegyzendő, hogy a valóságban a szerződés alacsony szintű EVM programozási nyelven van írva; ez a példa az érthetőség kedvéért az egyik magas szintű programozási nyelven, a Serpentben íródott, és le lehet fordítani EVM kódra. Tegyük fel, hogy a szerződés tárhelye az elején üres, és egy 10 ether értékű tranzakciót elküldenek 2000 gázzal, 0,001 ether gázárral, és 64 bájtnyi adattal, ahol 0-31 bájtok a `2` számot ábrázolják, és 32-63 bájtok pedig a karakterláncot ábrázolják `CHARLIE`. A státuszváltozási függvény folyamata ebben az esetben a következőképpen alakul: -1. Ellenőrizni, hogy a tranzakció érvényes és jól formált. -2. Ellenőrizni, hogy a tranzakció küldőjének van legalább 2000 \* 0,001 = 2 Ethere. Ha igen, levonni 2 Ethert a küldő számlájáról. -3. A gas = 2000 kezdőérték beállítása; feltételezve, hogy a tranzakció 170 bájt hosszú és a bájtdíj 5, levonni 850-et úgy, hogy 1150 gas maradjon. -4. További 10 Ether levonása a küldő számlájáról, és annak hozzáadása a szerződés számlájához. -5. A kód futtatása. Ebben az esetben ez egyszerű: a kód ellenőrzi, hogy a szerződés tárhelye a `2` indexen van használva, ha észreveszi, hogy nem, akkor a tárhely indexet beállítja `2` az értéket pedig `CHARLIE`. Tegyük fel, hogy ez 187 gas-ba kerül, így a fennmaradó gas összeg 1150 - 187 = 963 -6. 963 \ \* 0,001 = 0,963 Ether visszaadása a feladó fiókjába, és visszatérés az eredményül kapott állapothoz. +1. Ellenőrzi, hogy a tranzakció érvényes és jól formált. +2. Ellenőrzi, hogy a tranzakció küldőjének van legalább 2000 \* 0,001 = 2 ethere. Ha igen, levon 2 ethert a küldő számlájáról. +3. Beállítja a gáz = 2000 kezdőértéket; feltételezve, hogy a tranzakció 170 bájt hosszú és a bájtdíj 5, levon 850-et úgy, hogy 1150 gáz marad. +4. További 10 ethert levon a küldő számlájáról, és hozzáadja azt a szerződés számlájához. +5. Lefuttatja a kódot. Ebben az esetben ez egyszerű: a kód ellenőrzi, hogy a szerződés tárhelye a `2` indexen van használva; ha észreveszi, hogy nem, akkor a tárhelyindexet beállítja `2`-re, az értéket pedig `CHARLIE`-ra. Tegyük fel, hogy ez 187 gázba kerül, így a fennmaradó gáz összege 1150 - 187 = 963 +6. 963 \ * 0,001 = 0,963 ethert visszaad a feladó számlájára, és visszatérés az eredményül kapott státuszhoz. -Ha a tranzakció fogadó oldalán nem lenne szerződés, akkor a teljes tranzakciós díj egyszerűen megegyezne a megadott `GASPRICE` szorozva a tranzakció hosszával bájtokban, és a tranzakcióval együtt elküldött adatok lényegtelenek lennének. +Ha a tranzakció fogadójának oldalán nem lenne szerződés, akkor a teljes tranzakciós díj egyszerűen megegyezne a megadott `GASPRICE` szorozva a tranzakció hosszával bájtokban, és a tranzakcióval együtt elküldött adatok lényegtelenek lennének. -Megjegyzendő, hogy az üzenetek és a tranzakciók visszafordítása ugyanúgy működik: ha az üzenet végrehajtása során elfogy a gas, akkor az üzenet végrehajtása és az összes többi végrehajtás, amelyet az a végrehajtás váltott ki, visszaáll, de a szülő végrehajtásokat nem kell visszaállítani. Ez azt jelenti, hogy egy szerződés "biztonságosan" hívhat egy másik szerződést, mivel ha A G-gas-al hívja B-t, akkor A végrehajtása garantáltan legfeljebb G-gas veszteséget okoz. Végül megjegyzendő, hogy van egy műveleti kód (opcode) `CREATE`, ami létrehozza a szerződést; aminek a végrehajtási mechanikája általában hasonló a `CALL`-hoz, azaz híváshoz, azzal a kivétellel, hogy a végrehajtás kimenete határozza meg az újonnan létrehozott szerződés kódját. +Megjegyzendő, hogy az üzenetek és a tranzakciók visszafordítása ugyanúgy működik: ha az üzenet végrehajtása során elfogy a gáz, akkor az üzenet végrehajtása és az ebből következő összes többi végrehajtás visszaáll, de a „szülő végrehajtásokat” nem kell visszaállítani. Ez azt jelenti, hogy egy szerződés „biztonságosan” hívhat egy másik szerződést, mivel ha A G mennyiségű gázzal hívja meg B-t, akkor A végrehajtása garantáltan legfeljebb G mennyiségű gázveszteséget okoz. Végül megjegyzendő, hogy van egy műveleti kód, `CREATE`, ami létrehozza a szerződést; aminek a végrehajtási mechanikája általában hasonló a `CALL`-hoz vagy híváshoz, azzal a kivétellel, hogy a végrehajtás kimenete határozza meg az újonnan létrehozott szerződés kódját. -### Kód futtatás {#code-execution} +### Kódfuttatás {#code-execution} -Az Ethereum szerződésekben szereplő kód alacsony szintű, verem-alapú bájtkód nyelven íródott, amelyet "Ethereum virtuális gép kódnak" vagy "EVM kódnak" neveznek. A kód bájtok sorozatából áll, ahol mindegyik bájt egy műveletet képvisel. A kódfuttatás általában egy végtelen ciklus, ami a művelet ismételt végrehajtásából áll az aktuális programszámlálón (amely nullától kezdődik), majd eggyel növeli a programszámlálót addig, amíg el nem éri a kód végét, vagy egy hibát, illetve `STOP` vagy `RETURN` utasítást észlel. A műveletek háromféle helyhez férnek hozzá, ahol adatokat tárolhatnak: +Az Ethereum szerződésekben szereplő kód alacsony szintű, stack-alapú bájtkód nyelven íródott, amelyet Ethereum virtuális gép (EVM) kódnak neveznek. A kód bájtok sorozatából áll, ahol mindegyik bájt egy műveletet képvisel. A kódfuttatás általában egy végtelen ciklus, ami a művelet ismételt végrehajtásából áll az aktuális programszámlálón (amely nullától kezdődik), majd eggyel növeli a számlálót addig, amíg el nem éri a kód végét, vagy egy hibát, illetve ` STOP ` vagy ` RETURN ` utasítást észlel. A műveletek háromféle helyhez férnek hozzá, ahol adatokat tárolhatnak: -- A ** verem ** egy utolsóként be, elsőként ki (LIFO) tárolóhely, ahol az értékek rárakhatóak (push) és levehetőek (pop) a verem tetejéről -- ** Memória **, egy végtelenül bővíthető bájt tömb -- A szerződés hosszú távú ** tárhelye **, egy kulcs- és értéktároló. A veremtől és a memóriától eltérően, amelyek a számítás befejezése után nullázódnak, ez a tároló hosszú ideig fennmarad. +- A **stack** egy utolsóként be, elsőként ki (LIFO) tárolóhely, ahol az értékek rárakhatóak (push) és levehetőek (pop) a stack tetejéről +- **Memória **, egy végtelenül bővíthető bájttömb +- A szerződés hosszú távú ** tárhelye **, egy kulcs-érték tároló. A stack-től és a memóriától eltérően, amelyek a számítás befejezése után nullázódnak, ez a tároló hosszú ideig fennmarad. -A kód hozzáférhet a bejövő üzenet értékéhez, feladójához és adataihoz, valamint a blokk fejlécének adataihoz, és a kód egy bájt adattömböt is visszaadhat kimenetként. +A kód hozzáférhet a bejövő üzenet értékéhez, feladójához és adataihoz, valamint a blokkfejléc adataihoz, és a kód egy bájt adattömböt is visszaadhat kimenetként. -Az EVM kód formális végrehajtási modellje meglepően egyszerű. Amíg az Ethereum virtuális gép fut, teljes számítási állapota meghatározható a következő értéksorral: `(blokk_állapot, tranzakció, üzenet, kód, memória, verem, programszámláló(pc), gas)`, ahol a `blokk_állapot` az összes számlafiókot tartalmazó globális állapot, amely magában foglalja az egyenlegeket és a tárolóhelyeket. Minden egyes végrehajtási kör elején, az aktuális utasítás megtalálható a `kód`-nak (vagy 0 ha `pc >= len(code)`) a `programszámláló` -n meghatározott bájtja által, és minden utasításnak megvan a maga meghatározása abból a szempontból, hogy milyen hatással van az értéksorra. Például, `ADD` elvesz két elemet a veremből és visszarakja az összegüket, csökkenti a `gas` -t 1-el, és növeli a `programszámláló`-t 1-el, és a `SSTORE` leveszi a verem két legfelső elemét és behelyezi a második elemet a szerződés tárhelyébe az első elem által meghatározott indexen. Bár számos módja van az Ethereum virtuális gép végrehajtás optimalizálásának, futásidejű fordítással vagy másnéven röpfordítással, az Ethereum alapvető megvalósítása néhány száz kódsorban elvégezhető. +Az EVM kód formális végrehajtási modellje meglepően egyszerű. Amíg az Ethereum virtuális gép fut, teljes számítási állapota meghatározható a következő értéksorral: `(block_state, transaction, message, code, memory, stack, pc, gas)` (blokk_állapot, tranzakció, üzenet, kód, memória, stack, programszámláló (pc), gáz), ahol a `block_state` az összes számlát tartalmazó globális státusz, amely magában foglalja az egyenlegeket és a tárolóhelyeket. Minden egyes végrehajtási kör elején, az aktuális utasítás megtalálható a `code`-nak a `pc` által meghatározott bájtja által (vagy 0 ha `pc >= len(code)`), és minden utasításnak megvan a maga meghatározása abból a szempontból, hogy milyen hatással van az értéksorra. Például, `ADD` elvesz két elemet a stack-ből és visszarakja az összegüket, csökkenti a `gas`-t 1-gyel, növeli a `pc`-t 1-gyel, az `SSTORE` leveszi a stack két legfelső elemét és behelyezi a második elemet a szerződés tárhelyébe az első elem által meghatározott indexen. Bár számos módja van az Ethereum virtuális gép végrehajtás optimalizálásának, futásidejű fordítással (röpfordítás), az Ethereum alapvető megvalósítása néhány száz kódsorban elvégezhető. ### Blokklánc és bányászat {#blockchain-and-mining} -![Ethereum alkalmazás blokkdiagram](./ethereum-apply-block-diagram.png) +![Ethereum blokkdiagram alkalmazása](./ethereum-apply-block-diagram.png) -Az Ethereum blokklánc sok szempontból hasonló a Bitcoin blokklánchoz, bár vannak közöttük különbségek. A fő különbség az Ethereum és a Bitcoin között a blokklánc felépítésének tekintetében az, hogy a Bitcointól eltérően (amely csak a tranzakciós lista másolatát tartalmazza) az Ethereum blokkok tartalmazzák a tranzakciós lista és a legutóbbi állapot másolatát is. Emellett két másik érték, a blokk száma és a nehézsége is tárolva van a blokkban. Az Ethereum blokk érvényesítési algoritmusa a következő: +Az Ethereum blokklánc sok szempontból hasonló a Bitcoin blokklánchoz, bár vannak közöttük különbségek. A fő különbség az Ethereum és a Bitcoin között a blokklánc felépítésének tekintetében az, hogy a Bitcointól eltérően (amely csak a tranzakciós lista másolatát tartalmazza) az Ethereum blokkok tartalmazzák a tranzakciós lista és a legutóbbi státusz másolatát is. Emellett két másik érték, a blokk száma és a nehézsége is tárolva van a blokkban. Az Ethereum blokk validációs algoritmusa a következő: -1. Ellenőrizni, hogy az előző blokk, amire a blokk hivatkozik létezik és érvényes. -2. Ellenőrizni, hogy a blokk időbélyege nagyobb-e, mint az előző blokké és kevesebb mint 15 perc telt el azóta -3. Ellenőrizni, hogy a blokk száma, a nehézség, a tranzakció gyökér, a nagybácsi gyökér és a gas korlát (különféle alacsony szintű Ethereum-specifikus fogalmak) érvényesek-e. -4. Ellenőrizni, hogy a blokk proof-of-work-je érvényes-e. -5. Legyen `S[0]` az előző blokk után lévő állapot. -6. Legyen `TX` a blokk tranzakciós listája `n` tranzakcióval. Minden `i`-t a `0...n-1`, -ban beállítani `S[i+1] = APPLY(S[i],TX[i])`. Ha valamelyik alkalmazás hibát ad vissza, vagy a blokkban az eddig a pontig fogyasztott gáz összmennyisége túllépi a `GASLIMIT` értéket, hibát ad vissza. -7. Legyen az `S_FINAL` `S[n]`, de hozzáadva a bányásznak fizetett blokkjutalmat. -8. Ellenőrizd, hogy az `S_FINAL` állapot Merkle-fája azonos-e a blokk fejlécben megadott végleges állapottal. Ha igen, a blokk érvényes; ellenkező esetben nem az. +1. Ellenőrzi, hogy az előző blokk, amire a blokk hivatkozik, létezik és érvényes. +2. Ellenőrzi, hogy a blokk időbélyege nagyobb-e, mint az előző blokké és kevesebb mint 15 perc telt el azóta +3. Ellenőrzi, hogy a blokk száma, a nehézség, a tranzakciógyökér, az uncle-gyökér és a gázhatár (különféle alacsony szintű, Ethereum-specifikus fogalmak) érvényesek-e. +4. Ellenőrzi, hogy a blokk proof-of-work-je érvényes-e. +5. Legyen `S[0]` az előző blokk után lévő állapot. +6. Legyen `TX` a blokk tranzakciólistája `n` tranzakcióval. Minden `i`-t a `0...n-1`-ben beállítja `S[i+1] = APPLY(S[i],TX[i])`. Ha valamelyik alkalmazás hibát ad vissza, vagy a blokkban az eddig a pontig fogyasztott gáz összmennyisége túllépi a `GASLIMIT` értéket, hibát ad vissza. +7. Legyen az `S_FINAL` `S[n]`, de hozzáadva a bányásznak fizetett blokkjutalmat. +8. Ellenőrzi, hogy az `S_FINAL` állapot Merkle-fája azonos-e a blokkfejlécben megadott végleges státusszal. Ha igen, a blokk érvényes; ellenkező esetben nem az. -A megközelítés első pillantásra nagyon hatékonytalannak tűnhet, mert minden blokkal a teljes állapotot kell tárolni, de a valóságban a hatékonyság a Bitcoinéhoz hasonló. Ennek az oka, hogy az állapot a fa struktúrájában tárolódik, és minden blokk után a fa csak egy kis részét kell megváltoztatni. Így általában két szomszédos blokk között a fa túlnyomó részének azonosnak kell lennie, ezért az adatokat egyszer kell tárolni és kétszer lehet rájuk hivatkozni mutatók (azaz részfák hash-jeinek) használatával. Ennek megvalósításához egy speciális "Patricia-fának" nevezett fát használnak, beleértve a Merkle-fa koncepciójának módosítását, amely lehetővé teszi a csomópontok hatékony beillesztését és törlését, nem csak megváltoztatását. Ezen túlmenően, mivel az összes állapotinformáció része az utolsó blokknak, nincs szükség a teljes blokklánc előzmények tárolására - egy stratégia, amely, ha alkalmazható lenne a Bitcoin-ra, 5-20-szoros megtakarítást eredményezne a térben. +A megközelítés első pillantásra nagyon hatékonytalannak tűnhet, mert minden blokkal a teljes státuszt kell tárolni, de a hatékonyság a Bitcoinéhoz hasonló. Ennek az oka, hogy a státusz fastruktúrában tárolódik, és minden blokk után a fa csak egy kis részét kell megváltoztatni. Így általában két szomszédos blokk között a fa túlnyomó részének azonosnak kell lennie, ezért az adatokat egyszer kell tárolni és kétszer lehet rájuk hivatkozni mutatók (azaz részfák hash-einek) használatával. Ennek megvalósításához egy speciális „Patricia-fát” használnak, beleértve a Merkle-fa koncepciójának módosítását, amely lehetővé teszi a csomópontok hatékony beillesztését és törlését, nem csak megváltoztatását. Ezen túlmenően, mivel az összes státuszinformáció része az utolsó blokknak, nincs szükség a teljes blokkláncelőzmények tárolására – ez egy olyan stratégia, amely ha alkalmazható lenne a Bitcoin-ra, 5-20-szoros megtakarítást eredményezne a tárhelyben. -Gyakran feltett kérdés, hogy "hol" történik a szerződés kódjának végrehajtása, a fizikai hardver szempontjából. Erre egyszerű a válasz: a szerződés kódjának végrehajtási folyamata az állapotátmeneti függvény definíciójának része, amely a blokk érvényesítési algoritmus része, tehát ha egy tranzakciót hozzáadunk a `B` blokkhoz, akkor a tranzakció által létrehozott kód végrehajtását minden csomópont végrehajtja, most és a jövőben is, amelyek letöltik és érvényesítik a `B` blokkot. +Gyakran felmerül az a kérdés, hogy „hol” történik a szerződés kódjának végrehajtása a fizikai hardver szempontjából. Erre egyszerű a válasz: a szerződés kódjának végrehajtási folyamata a státuszváltozási függvény definíciójának része, amely a blokk validációs algoritmus része, tehát ha egy tranzakciót hozzáadunk a `B` blokkhoz, akkor a tranzakció által létrehozott kód végrehajtását minden csomópont végrehajtja, most és a jövőben is, amelyek letöltik és validálják a `B` blokkot. ## Alkalmazások {#applications} -Az Ethereumon általánosságban háromféle alkalmazás létezik. Az első kategória a pénzügyi alkalmazások, amelyek hatékonyabb módszereket kínálnak a felhasználóknak a pénzük kezelésére és szerződéskötésre. Ebbe beletartoznak a devizák, a derivatív pénzügyi eszközök, a fedezeti ügyletek, a takarék pénztárcák, végrendeletek, és végül akár teljes körű munkaszerződések egyes kategóriái. A második kategória a félig pénzügyi alkalmazások, amik kapcsolatosak a pénzzel, de a tevékenységeiknek van egy súlyos, nem pénzügyi oldala is; erre tökéletes példa az önérvényesítő jutalmak, a számítási problémák megoldásért. Végül vannak olyan alkalmazások, mint az online szavazás és a decentralizált irányítás, amelyek egyáltalán nem pénzügyi vonatkozásúak. +Az Ethereumon általánosságban háromféle alkalmazás létezik. Az első kategória a pénzügyi alkalmazások, amelyek hatékonyabb módszereket kínálnak a felhasználóknak a pénzük kezelésére és szerződéskötésre. Ebbe beletartoznak a devizák, a derivatív pénzügyi eszközök, a fedezeti ügyletek, a megtakarításitárcák, végrendeletek, és végül akár teljes körű munkaszerződések egyes kategóriái. A második kategória a félig pénzügyi alkalmazások, amelyek kapcsolatosak a pénzzel, de a tevékenységeiknek van egy jelentős, nem pénzügyi oldala is; erre tökéletes példa az önérvényesítő jutalmak a számítási problémák megoldásért. Végül vannak olyan alkalmazások, mint az online szavazás és a decentralizált irányítás, amelyek egyáltalán nem pénzügyi vonatkozásúak. -### Token rendszerek {#token-systems} +### Tokenrendszerek {#token-systems} -A blokkláncon való token vagyis zseton rendszereknek számos alkalmazása van, kezdve az olyan alvalutáktól, amik olyan eszközöket képviselnek, mint az USA Dollár vagy az arany, egészen a vállalati részvények, az okos tulajdont képviselő egyedi zsetonok, a biztonságos, hamisíthatatlan kuponok, és még olyan zseton rendszerekig is, amik semmilyen kapcsolatban nem állnak a hagyományos értékhez, csak a jutalmazás pontrendszereiként használják őket. A zseton rendszereket meglepően egyszerű módon létre lehet hozni az Ethereumon. Kulcsfontosságú megérteni azt, hogy a pénznem vagy a zseton rendszer alapvetően egy egy műveletből álló adatbázis: vonjon le X egységet A-ból, és adjon X egységet B-nek, azzal a feltétellel, hogy (1) A-nak a tranzakció előtt legalább X egysége volt és (2) a tranzakciót A jóváhagyta. A zseton rendszer megvalósításához mindössze annyi kell, hogy ezt a logikát beépítsék egy szerződésbe. +A blokkláncon alapuló tokenrendszereknek számos alkalmazási területe van, mint az alvaluták, amelyek olyan eszközöket képviselnek, mint az USA dollár vagy az arany, a vállalati részvények, az okos tulajdont képviselő egyedi tokenek, a biztonságos és hamisíthatatlan kuponok, vagy amelyeknél semmilyen kapcsolat sincs a hagyományos értékhez, csak ösztönzéshez használják azokat. A tokenrendszereket meglepően egyszerű módon létre lehet hozni az Ethereumon. Kulcsfontosságú megérteni azt, hogy a pénznem vagy a tokenrendszer alapvetően egy műveletből álló adatbázis: vonjon le X egységet A-tól, és adjon X egységet B-nek, azzal a feltétellel, hogy 1) A-nak a tranzakció előtt legalább X egysége volt és 2) a tranzakciót A jóváhagyta. A tokenrendszer megvalósításához mindössze annyi kell, hogy ezt a logikát beépítsék egy szerződésbe. -Az alapkód a zsetonrendszer megvalósítására Serpent programnyelven a következőképpen néz ki: +Az alapkód a tokenrendszer megvalósítására Serpent programnyelven a következőképpen néz ki: - def send(to, value): - if self.storage[msg.sender] >= value: - self.storage[msg.sender] = self.storage[msg.sender] - value - self.storage[to] = self.storage[to] + value +```py +def send(to, value): + if self.storage[msg.sender] >= value: + self.storage[msg.sender] = self.storage[msg.sender] - value + self.storage[to] = self.storage[to] + value +``` -Ez lényegében a "bankrendszer" állapotátmeneti függvényének szó szerinti megvalósítását jelenti, amely ebben a dokumentumban fentebb már le lett írva. Néhány extra kódsort hozzá kell adni, hogy biztosítsuk a pénzegységek elosztásának kezdeti lépését, néhány másik szélsőséges esetben is, és ideális esetben egy függvényt is hozzáadunk, ami lehetővé teszi másik szerződéseknek, hogy lekérdezzék egy cím számlaegyenlegét. De ennyi az egész. Elméletileg a pénznemként működő Ethereum-alapú zsetonrendszerek tartalmazhatnak egy másik fontos jellemzőt, ami a Bitcoin-alapú blokkláncon található pénzeszközöknél hiányzik: a tranzakciós díjak közvetlen fizetése ugyanabban a pénznemben. Ez úgy lehetne megvalósítható, hogy a szerződés fenntartana egy Ether egyenleget, amelyből visszatérítené a feladónak a díjakra használt Ethert, és ezt az egyenleget úgy töltené fel, hogy összegyűjti a díjakra beszedett belső valutaegységeket, és egy folyamatosan futó aukción továbbértékesíti azokat. A felhasználóknak tehát Etherrel kellene "aktiválniuk" a számláikat, de onnantól, hogy az Ether ott van, újrafelhasználható, mert a szerződés minden alkalommal visszatérítené. +Ez lényegében a „bankrendszer” státuszváltozási függvényének szó szerinti megvalósítását jelenti, amely ebben a dokumentumban fentebb már le lett írva. Néhány extra kódsort hozzá kell adni, hogy biztosítsuk a pénzegységek elosztásának kezdeti lépését, néhány másik szélsőséges esetben is, és ideális esetben egy függvényt is hozzáadunk, ami lehetővé teszi másik szerződéseknek, hogy lekérdezzék egy cím számlaegyenlegét. De ennyi az egész. Elméletileg a pénznemként működő Ethereum-alapú tokenrendszerek tartalmazhatnak egy másik fontos jellemzőt, ami a Bitcoin-alapú blokkláncon található pénzeszközöknél hiányzik: a tranzakciós díjak közvetlen fizetése ugyanabban a pénznemben. Ez úgy lehetne megvalósítható, hogy a szerződés fenntartana egy ether egyenleget, amelyből visszatérítené a feladónak a díjakra használt ethert, és ezt úgy töltené fel, hogy összegyűjti a díjakra beszedett belső valutaegységeket, és egy folyamatosan futó aukción továbbértékesíti azokat. A felhasználóknak tehát etherrel kellene „aktiválniuk” a számláikat, de onnantól, hogy az ether ott van, újrafelhasználható, mert a szerződés minden alkalommal visszatérítené. ### Pénzügyi derivatívák és stabil értékű valuták {#financial-derivatives-and-stable-value-currencies} -A pénzügyi derivatívák az "intelligens szerződés" leggyakoribb alkalmazásai, és az egyik legegyszerűbben megvalósítható kóddal. A pénzügyi szerződések végrehajtása során az a fő kihívás, hogy többségük külső árfolyamra való hivatkozást igényel; például nagyon kívánatos alkalmazás egy olyan okos szerződés, amely fedezetet ad az Ether (vagy más kriptovaluta) árfolyamingadozására az amerikai dollárral szemben, de ehhez a szerződésnek tudnia kell az ETH / USD értékét. Ennek legegyszerűbb módja egy adott fél (pl. NASDAQ) által fenntartott "adatcsatorna" szerződés, amelynek célja, hogy az adott fél képes legyen a szerződés szükség szerinti frissítésére, és egy olyan felület biztosítása, amely lehetővé teszi más szerződések számára, hogy üzenetet küldjenek a szerződésnek, és választ kapjanak, ami tratalmazza az árat. +A pénzügyi derivatívák az „okosszerződés” leggyakoribb alkalmazásai, és az egyik legegyszerűbben megvalósíthatók a kód szempontjából. A pénzügyi szerződések végrehajtása során az a fő kihívás, hogy többségük külső árfolyamra való hivatkozást igényel; például kívánatos alkalmazás egy olyan okosszerződés, amely fedezetet ad az ether (vagy más kriptovaluta) árfolyamingadozására az amerikai dollárral szemben, de ehhez a szerződésnek tudnia kell az ETH/USD értékét. Ennek legegyszerűbb módja egy adott fél (például a NASDAQ) által fenntartott „adatforrás” szerződés, amelynek célja, hogy az adott fél képes legyen a szerződés szükség szerinti frissítésére, és egy olyan felület biztosítása, amely lehetővé teszi más szerződések számára, hogy üzenetet küldjenek a szerződésnek, és a válaszban megkapják az árat. Tekintettel erre a kritikus összetevőre, a fedezeti szerződés a következőképpen nézne ki: -1. Megvárni, amíg az A fél berak 1000 Ethert. -2. Megvárni, amíg a B fél berak 1000 Ethert. -3. Az adatcsatorna szerződés lekérdezésén keresztül kiszámított 1000 Ether USD értékének rögzítése a tárolóhelyen, mondjuk, hogy ez $x. -4. 30 nap elteltével hagyni, hogy A vagy B "újraaktiválja" a szerződést úgy, hogy $x értékű Ethert küld (amelyet úgy számol ki, hogy újból lekérdezi az adatcsatorna szerződést az új árról) A-nak, a többit pedig B-nek. +1. Megvárja, amíg az A fél berak 1000 ethert. +2. Megvárja, amíg a B fél berak 1000 ethert. +3. Az adatforrás szerződés lekérdezésén keresztül kiszámított 1000 ether USD értékének rögzítése a tárolóhelyen, mondjuk, hogy ez $x. +4. 30 nap elteltével hagyja, hogy A vagy B „újraaktiválja” a szerződést annak érdekében, hogy $x értékű ethert küldjön (amelyet úgy számol ki, hogy újból lekérdezi az adatforrás szerződést az új árról) A-nak, a többit pedig B-nek. -Egy ilyen szerződés jelentős potenciállal bírna a kriptokereskedelemben. Az egyik fő probléma, amire gyakran hivatkoznak a kriptovalutával kapcsolatban, hogy ingatag az árfolyama; bár sok felhasználó és kereskedő vágyik a kriptográfiai eszközök biztonságára és kényelmére, nem biztos, hogy szembe akar nézni azzal a lehetőséggel, hogy egyetlen nap alatt elveszítheti pénzeszközei értékének 23% -át. Eddig a leggyakrabban a kibocsátó által biztosított eszközöket javasolták; annak az elképzelésnek az alapján, hogy a kibocsátó létrehoz egy pénzeszközt, ahol joga van kibocsátani és visszavonni egységeket, és mindenkinek egy egységnyi pénzeszközt ad, aki (offline) cserébe ad neki egy meghatározott, egy egységnyi alapul szolgáló eszközt (pl. arany, USA Dollár). A kibocsátó ezután megígéri, hogy az alapul szolgáló eszköz egy egységét adja annak, aki visszaküldi a kripto eszköz egy egységét. Ez a mechanizmus lehetővé teszi minden nem kriptográfiai eszköz kriptográfiai eszközzé történő emelését, feltéve, hogy a kibocsátó megbízható. +Egy ilyen szerződés jelentős potenciállal bírna a kriptokereskedelemben. Az egyik fő probléma, amire gyakran hivatkoznak a kriptovalutával kapcsolatban, hogy ingatag az árfolyama; bár sok felhasználó és kereskedő vágyik a kriptográfiai eszközök biztonságára és kényelmére, nem biztos, hogy vállalja azt a lehetőséggel, hogy egyetlen nap alatt elveszítheti pénzeszközei értékének 23%-át. Eddig a leggyakrabban a kibocsátó által biztosított eszközöket javasolták; annak az elképzelésnek az alapján, hogy a kibocsátó létrehoz egy pénzeszközt, ahol joga van kibocsátani és visszavonni egységeket, és mindenkinek egy egységnyi pénzeszközt ad, aki (offline) cserébe ad neki egy meghatározott, egy egységnyi alapul szolgáló eszközt (például arany, USA dollár). A kibocsátó ezután megígéri, hogy az alapul szolgáló eszköz egy egységét adja annak, aki visszaküldi a kriptoeszköz egy egységét. Ez a mechanizmus lehetővé teszi a nem kriptográfiai eszköz felemelését kriptográfiai eszközzé, feltéve, hogy a kibocsátó megbízható. -A gyakorlatban azonban a kibocsátók nem mindig megbízhatóak, és egyes esetekben a banki infrastruktúra túl gyenge vagy túl ellenséges ahhoz, hogy ilyen szolgáltatások létezzenek. A pénzügyi derivatívák alternatívát kínálnak. Itt ahelyett, hogy egyetlen kibocsátó biztosítaná az eszközök fedezetére szolgáló alaptőkét, a spekulánsok decentralizált piacon való fogadásai arról, hogy egy kriptográfiai referencia eszköz (pl. ETH) ára emelkedni fog-e játsszák azt a szerepet. A kibocsátóktól eltérően a spekulánsoknak nincs lehetőségük az ügylettel kapcsolatos kötelezettségük elmulasztására, mert a fedezeti szerződés letétben tartja pénzeszközeiket. Fontos megjegyezni, hogy ez a megközelítés nincs teljesen decentralizálva, mert még mindig megbízható forrásra van szükség az árjegyző szerepének betöltésére, bár már ez is vitathatatlanul hatalmas előrelépés az infrastruktúra-követelmények csökkentése szempontjából (ellentétben a kibocsátóval, az árfolyam-kiadáshoz nem szükséges licenc és valószínűleg a szólásszabadság kategóriájába sorolhatók), és a csalás lehetőségét is csökkenti. +A gyakorlatban azonban a kibocsátók nem mindig megbízhatóak, és egyes esetekben a banki infrastruktúra túl gyenge vagy túl ellenséges ahhoz, hogy ilyen szolgáltatások létezzenek. A pénzügyi derivatívák alternatívát kínálnak. Itt ahelyett, hogy egyetlen kibocsátó biztosítaná az eszközök fedezetére szolgáló alaptőkét, a spekulánsok decentralizált piacon való fogadásai arról, hogy egy kriptográfiai referencia eszköz (például az ETH) ára emelkedni fog-e játsszák ezt a szerepet. A kibocsátóktól eltérően a spekulánsoknak nincs lehetőségük az ügylettel kapcsolatos kötelezettségük elmulasztására, mert a fedezeti szerződés letétben tartja a pénzeszközeiket. Fontos megjegyezni, hogy ez a megközelítés nincs teljesen decentralizálva, mert még mindig megbízható forrásra van szükség az árjegyző szerepének betöltésére, bár már ez is hatalmas előrelépés az infrastruktúrakövetelmények csökkentése szempontjából (ellentétben a kibocsátóval, az árfolyamkiadáshoz nem szükséges engedély, és valószínűleg a szólásszabadság kategóriájába sorolhatók), és a csalás lehetőségét is csökkenti. -### Identitás és Hírnév Rendszerek {#identity-and-reputation-systems} +### Identitás- és hírnévrendszerek {#identity-and-reputation-systems} -A legkorábbi alternatív kriptovaluta, a, [Namecoin](http://namecoin.org/), egy Bitcoinhoz hasonló blokkláncot próbált meg használni egy névregisztrációs rendszer biztosításához, ahol a felhasználók a nevüket egy nyilvános adatbázisba regisztrálhatták több más adat mellett. A leggyakrabban idézett alkalmazási eset [DNS](https://wikipedia.org/wiki/Domain_Name_System) rendszerre, a domain nevek, például "bitcoin.org" (vagy a Namecoin esetében "bitcoin.bit") leképezése egy IP címre. Egyéb alkalmazási esetek például az e-mail autentikációk és a potenciálisan haladóbb reputációs rendszerek. Nézzünk egy alap szerződést, amely Namecoin-féle név regisztrációt biztosít az Ethereumon: +A legkorábbi alternatív kriptovaluta, a, [Namecoin](http://namecoin.org/), egy Bitcoinhoz hasonló blokkláncot próbált meg használni egy névregisztrációs rendszer biztosításához, ahol a felhasználók a nevüket egy nyilvános adatbázisba regisztrálhatták több más adat mellett. A leggyakrabban idézett alkalmazási eset a [DNS](https://wikipedia.org/wiki/Domain_Name_System) rendszerre, a domain nevek, például „bitcoin.org” (vagy a Namecoin esetében „bitcoin.bit”) leképezése egy IP-címre. Egyéb alkalmazási esetek például az e-mail autentikációk és a potenciálisan haladóbb reputációs rendszerek. Nézzünk egy alap szerződést, amely Namecoin-féle név regisztrációt biztosít az Ethereumon: - def register(name, value): - if !self.storage[name]: - self.storage[name] = value +```py +def register(name, value): + if !self.storage[name]: + self.storage[name] = value +``` -A szerződés nagyon egyszerű; gyakorlatilag egy adatbázis az Ethereum hálózatban, amelyhez hozzá lehet adni, de nem lehet módosítani vagy törölni belőle. Bárki regisztrálhat nevet valamilyen értékkel, majd a regisztráció örökre megmarad. Egy kifonomultabb névregisztrációs szerződésben szerepelne egy "függvény kaluzula", amely engedné a többi szerződésnek a lekérdezést, valamint a név "tulajdonosának" (azaz az első regisztrálónak) egy mechanizmust, az adat módosítására vagy a tulajdonjog átadására. Bárki hozzáadhat reputációt és web-of-trust funkcionalitást a legfelső réteghez. +A szerződés nagyon egyszerű; gyakorlatilag egy adatbázis az Ethereum hálózatban, amelyhez hozzá lehet adni, de nem lehet módosítani vagy törölni belőle. Bárki regisztrálhat nevet valamilyen értékkel, majd a regisztráció örökre megmarad. Egy kifonomultabb névregisztrációs szerződésben szerepelne egy „függvény kaluzula”, amely engedné a többi szerződésnek a lekérdezést, valamint a név „tulajdonosának” (azaz az első regisztrálónak) egy mechanizmust, az adat módosítására vagy a tulajdonjog átadására. Bárki hozzáadhat reputációt és digitális azonosító (web-of-trust) funkcionalitást az egész tetejére. ### Decentralized fájltárhely {#decentralized-file-storage} -Az elmúlt években számos népszerű online fájltárhely startup tűnt fel, amelyek közül az egyik legkiemelkedőbb a Dropbox, akik lehetővé teszik ügyfeleiknek, hogy a merevlemezük biztonsági mentését feltöltsék, majd a szolgáltatással tároltassák azt, majd a fehasználó havidíj ellenében férhet hozzá az adataihoz. Azonban ezen a ponton a fájltárhely piac relatív nem hatékony; ha megvizsgáljuk a különböző [meglévő megoldásokat](http://online-storage-service-review.toptenreviews.com/), láthatjuk, hogy különösen a "borzongások völgye", azaz a 20-200 GB szinten, ahol sem az ingyenes kvóták, sem a vállalati szintű kedvezmények nem jelennek meg, a mainstream fájltárolási költségek havi árszintje ott tart, hogy egy hónapért többet fizet az átlag felhasználó, mint egy teljes merevlemezért. Az Ethereum szerződések lehetővé teszik egy decentralizált fájl tárolási ökoszisztéma fejlesztését, ahol az egyes felhasználók kis mennyiségű pénzt kereshetnek azzal, hogy bérbeadják saját merevlemezüket és a használaton kívüli tárhelyüket, ezzel is lefelé hajtva a tárolás költségeit. +Az elmúlt években számos népszerű online tárhely startup tűnt fel, amelyek közül az egyik legkiemelkedőbb a Dropbox, akik lehetővé teszik ügyfeleiknek, hogy a merevlemezük biztonsági mentését feltöltsék, majd a szolgáltatással tároltassák azt, majd a fehasználó havidíj ellenében férhet hozzá az adataihoz. Azonban ezen a ponton a fájltárhely piac relatíve nem hatékony; ha megvizsgáljuk a különböző meglévő megoldásokat, láthatjuk, hogy különösen a „furcsa zónában”, a 20-200 GB szinten, ahol sem az ingyenes kvóták, sem a vállalati szintű kedvezmények nem jelennek meg, a mainstream fájltárolási költségek havi árszintje ott tart, hogy egy hónapért többet fizet az átlag felhasználó, mint egy teljes merevlemezért. Az Ethereum szerződések lehetővé teszik egy decentralizált fájltárolási ökoszisztéma fejlesztését, ahol az egyes felhasználók kis mennyiségű pénzt kereshetnek azzal, hogy bérbeadják saját merevlemezüket és a használaton kívüli tárhelyüket, ezzel is lefelé hajtva a tárolás költségeit. -Az ilyen eszközök kulcsfontosságú megerősítő eleme az általunk "decentralizált Dropbox szerződésnek" elnevezett megoldás. A szerződés a következő módon működik. Először a kívánt adatokat blokkokra bontjuk, adatvédelmi okokból ezeket titkosítjuk, majd egy Merkle-fát építünk belőle. Ezután létrehozunk egy szerződést azzal a szabállyal, hogy minden N blokkban a szerződés egy véletlen indexet választ ki a Merkle-fában (az előző blokk-hash segítségével a szerződés kódjából, véletlenszerűen), majd X ethert adunk az első entitásnak, hogy egy egyszerűsített fizetés hitelesítéssel lássa el a tranzakciót, például a blokk tulajdonjogát bizonyító elemmel az adott indexen a fában. Amikor egy felhasználó újra le szeretné tölteni a fájlt, egy mikrofizetési csatorna protokollt használhat (például 1 szabo 32 kilobyte adatért) a fájl lekérésére; a leginkább költséghatékony megközelítés az, amikor a fizető félnek csak a legvégén kell publikálnia a tranzakciót, ahelyett, hogy a tranzakciót egy kissé jövedelmezőbbre cserélné le ugyanazzal a nounce-al 32 kilobytonként. +Az ilyen eszközök kulcsfontosságú megerősítő eleme az általunk „decentralizált Dropbox szerződésnek” elnevezett megoldás. A szerződés a következő módon működik. Először a kívánt adatokat blokkokra bontjuk, adatvédelmi okokból titkosítjuk, majd egy Merkle-fát építünk belőle. Ezután létrehozunk egy szerződést azzal a szabállyal, hogy minden N blokkban a szerződés egy véletlen indexet választ ki a Merkle-fában (az előző blokk-hash segítségével a szerződés kódjából véletlenszerűen), majd X ethert adunk az első entitásnak, hogy egy egyszerűsített fizetés hitelesítéssel lássa el a tranzakciót, például a blokk tulajdonjogát bizonyító elemmel az adott indexen a fában. Amikor egy felhasználó újra le szeretné tölteni a fájlt, egy mikrofizetési csatorna protokollt használhat (például 1 szabo 32 kilobájt adatért) a fájl lekérésére; a leginkább költséghatékony megközelítés az, amikor a fizető félnek csak a legvégén kell publikálnia a tranzakciót, ahelyett, hogy a tranzakciót egy kissé jövedelmezőbbre cserélné le ugyanazzal a nounce-al 32 kilobájtonként. A protokoll egyik fontos jellemzője, hogy bár úgy tűnik, hogy valaki több véletlen csomópontot bíz meg azzal, hogy ne felejtse el a fájlt, a saját kockázatát a nullához közelire csökkentheti azzal, hogy a fájlt több részre bontja titkos megosztással, majd figyeli a szerződést, hogy lássa az egyes darabok továbbra is valamelyik csomópont birtokában vannak. Ha egy szerződés továbbra is fizet, akkor kriptográfiai bizonyíték van arra, hogy valaki továbbra is tárolja a fájlt. ### Decentralizált Autonóm Szervezetek {#decentralized-autonomous-organizations} -A "decentralizált autonóm szervezetek" általános koncepciója, hogy egy virtuális entitásnak, amely adott számú taggal vagy "részvényessel" rendelkezik, akár esetleg 67%-os többséggel, felhatalmazása lehet arra, hogy elköltse az entitás pénzeszközeit és módosítsa a kódját. A tagok együttesen dönthetik el, hogy a szervezet hogyan allokálja a pénzeszközöket. Egy DAO pénzeszközeinek allokálásának módszerei a pénzadománytól, fizetéseken át akár még egzotikusabb mechanizmusokig terjedhet, mint például egy belső valuta a munka elismerésére. Ez gyakorlatilag replikálja a hagyományos vállalatok vagy non-profit entitások jogi csapdáit, de a végrehajtásra kizárólag kriptográfiai blokklánc technológiát használ. Eddig a DAO-kkal kapcsolatban leginkább a kapitalista "decentralizált autonóm vállalat" (DAC) modelljéről beszéltünk, ahol a részvényesek osztalékot vagy kereskedhető részvényeket kapnak; azonban van egy alternatív, talán a "decentralizált autonóm közösség" fogalommal leírható értelmezés is, ahol a tagok egyenlő mértékben vesznek részt a döntéshozatalban, és a tagok 67%-ának beleegyezése szükséges ahhoz, hogy felvegyenek egy új tagot, vagy eltávolítsanak egy tagot. Azt a követelményt, hogy egy személy csak egy tagsággal rendelkezhet a csoportnak kollektíven kell érvényre juttatnia. +A „decentralizált autonóm szervezetek” (DAO) általános koncepciója, hogy egy virtuális entitásnak, amely adott számú taggal vagy „részvényessel” rendelkezik, akár esetleg 67%-os többséggel, felhatalmazása lehet arra, hogy elköltse az entitás pénzeszközeit és módosítsa a kódját. A tagok együttesen dönthetik el, hogy a szervezet hogyan allokálja a pénzeszközöket. Egy DAO pénzeszközeinek allokálásának módszerei a pénzadománytól, fizetéseken át akár még egzotikusabb mechanizmusokig terjedhet, mint például egy belső valuta a munka elismerésére. Ez gyakorlatilag replikálja a hagyományos vállalatok vagy non-profit entitások jogi csapdáit, de a végrehajtásra kizárólag kriptográfiai blokklánc technológiát használ. Eddig a DAO-kkal kapcsolatban leginkább a kapitalista „decentralizált autonóm vállalat” (DAC) modelljéről beszéltünk, ahol a részvényesek osztalékot vagy kereskedhető részvényeket kapnak; azonban van egy alternatív, talán a „decentralizált autonóm közösség” fogalommal leírható értelmezés is, ahol a tagok egyenlő mértékben vesznek részt a döntéshozatalban, és a tagok 67%-ának beleegyezése szükséges ahhoz, hogy felvegyenek vagy eltávolítsanak egy tagot. Azt a követelményt, hogy egy személy csak egy tagsággal rendelkezhet a csoportnak kollektíven kell érvényre juttatnia. -A DAO-k kódolásának általános leírása a következő. A legegyszerűbb megoldás egy önmagát módosító kódelem alkalmazása, amely változik, ha a tagok kétharmada egyetért egy módosítással. Bár a kód elméletileg állandó, bárki megkerülheti, és de-facto megváltoztathatja, ha a kód darabjait külön szerződésekbe foglalja, majd a módosítható tárhelyen menti el azt a címet, amit a szerződéseknek meg kell hívni. Egy ilyen DAO szerződés egyszerű implementációjában három tranzakció típus lenne, amelyeket a tranzakcióban megadott adatok különböztetnek meg: +A DAO-k kódolásának általános leírása a következő. A legegyszerűbb megoldás egy önmagát módosító kódelem alkalmazása, amely változik, ha a tagok kétharmada egyetért egy módosítással. Bár a kód elméletileg állandó, bárki megkerülheti, és de-facto megváltoztathatja, ha a kód darabjait külön szerződésekbe foglalja, majd a módosítható tárhelyen menti el azt a címet, amit a szerződéseknek meg kell hívni. Egy ilyen DAO szerződés egyszerű implementációjában három tranzakciótípus lenne, amelyeket a tranzakcióban megadott adatok különböztetnek meg: -- `[0,i,K,V]` ahol a javaslatot az `i` indexxel regisztrálják, hogy módosítsa a címet a `K` tárolási indexen `V` értékre -- `[1,i]` amely egy szavazatot regisztrál az `i` javaslat előnyben részesítésére +- `[0,i,K,V]`, ahol a javaslatot az `i` indexxel regisztrálják, hogy módosítsa a címet a `K` tárolási indexen `V` értékre +- `[1,i]` egy szavazatot regisztrál az `i` javaslat előnyben részesítésére - `[2,i]` az `i` javaslat véglegesítésére, ha elég szavazat érkezett be -A szerződésben ezután mindegyikre szerepel egy klauzula. Ezután rögzíti az összes nyitott tárolási módosítást, és azt a listát is, hogy ki szavazott rájuk. Tartalmazza a tagok listáját is. Amikor valamelyik tárolási módosításra a tagok kétharmada szavazott, a véglegesítési tranzakció hajtja végre a módosítást. Egy kifinomultabb vázban lehet beépített szavazási lehetőség is olyan funkciókra, mint például tranzakció küldése, tagok hozzáadása vagy eltávolítása, valamint lehetővé kell tenni egy [Liquid Democracy](https://wikipedia.org/wiki/Delegative_democracy)-stílusú szavazási delegálást is (azaz egyvalaki kijelölheti, hogy ki szavazzon helyette, majd a kijelölés átadható, tehát, ha A B-t bízza meg a szavazással, majd B C-t bízza meg, C határozza meg A szavazatát). A tervezés lehetővé teszi, hogy a DAO organikusan nőjjön decentralizált közösségként, és a tagok végül delegálhassák azt a feladatot egy specialistának, hogy kiszűrjék a tagokat, szemben a specialisták "jelenlegi rendszerével" akik a közösség egyes tagjait érintő változások függvényében könnyen ki- vagy beugorhatnak. +A szerződésben ezután mindegyikre szerepel egy klauzula. Ezután rögzíti az összes nyitott tárolási módosítást, és azt a listát is, hogy ki szavazott rájuk. Tartalmazza a tagok listáját is. Amikor valamelyik tárolási módosításra a tagok kétharmada szavazott, a véglegesítési tranzakció hajtja végre a módosítást. Egy kifinomultabb vázban lehet beépített szavazási lehetőség is olyan funkciókra, mint például tranzakció küldése, tagok hozzáadása vagy eltávolítása, valamint lehetővé kell tenni egy [likvíd demokrácia](https://wikipedia.org/wiki/Liquid_democracy)-stílusú szavazási delegálást is (azaz egy valaki kijelölheti, hogy ki szavazzon helyette, majd a kijelölés átadható, tehát, ha A B-t bízza meg a szavazással, majd B C-t bízza meg, C határozza meg A szavazatát). A tervezés lehetővé teszi, hogy a DAO organikusan nőjjön decentralizált közösségként, és a tagok végül delegálhassák azt a feladatot egy specialistának, hogy kiszűrjék a tagokat, szemben a specialisták „jelenlegi rendszerével” akik a közösség egyes tagjait érintő változások függvényében könnyen ki- vagy beugorhatnak. -Alternatív mód a decentralizált vállalat modell, amikor valamelyik számlán nulla vagy több részvény van, és a döntéshozatalhoz a részvények kétharmadára van szükség. Egy teljes vázban ideális esetben van egy eszközkezelő funkció, lehetőség részvények vásárlására vagy eladására szóló ajánlattételre, valamint lehetőség az ajánlatok elfogadására (lehetőség szerint a szerződésen belül egy ajánlat-egyeztető mechanizmussal). A delegálás szintén Liquid Democracy-stílusban létezik, általánosítva az "igazgatótanács" koncepciót. +Alternatív modell egy decentralizált vállalat részére, amikor valamelyik számlán nulla vagy több részvény van, és a döntéshozatalhoz a részvények kétharmadára van szükség. Egy teljes vázban ideális esetben benne van az eszközkezelő funkció, a lehetőség részvények vásárlására vagy eladására szóló ajánlattételre, valamint a lehetőség az ajánlatok elfogadására (lehetőség szerint a szerződésen belül egy ajánlategyeztető mechanizmussal). A delegálás szintén likvid demokrácia-stílusban létezik, általánosítva az „igazgatótanács” koncepcióját. ### További alkalmazások {#further-applications} -**1. Tárcák mentése**. Tegyük fel, hogy Alice biztonságban szeretné tudni pénzeszközeit, azonban aggódik amiatt, hogy veszteség éri, vagy valaki feltöri a privát-kulcsát. Ethert helyez el egy szerződésben Bobbal, egy bankkal a következőképpen: +**1. Megtakarítási tárcák**. Tegyük fel, hogy Alice biztonságban szeretné tudni pénzeszközeit, azonban aggódik amiatt, hogy veszteség éri, vagy valaki feltöri a privát kulcsát. Ethert helyez el egy szerződésben Bobbal, egy bankkal, a következőképpen: - Alice egyedül naponta legfeljebb a pénzeszközök 1%-át tudja felvenni. -- Bob egyedül naponta a pénzeszközök legfeljebb 1%-át tudja felvenni, de Alicenak lehetősége van arra, hogy tranzakciót végezzen a kulcsával és zárolja ezt a lehetőséget. +- Bob egyedül naponta a pénzeszközök legfeljebb 1%-át tudja felvenni, de Alice-nek lehetősége van arra, hogy tranzakciót végezzen a kulcsával és zárolja ezt a lehetőséget. - Alice és Bob együtt bármennyit fel tud venni. -Alicenek általában elég naponta 1%, azonban, ha Alice-nak többre van szüksége, értesítheti Bobot, és segítséget kérhet. Ha Alicet támadás éri, Bobhoz siethet, és a pénzeszközöket egy új szerződésbe tudja átmozgatni. Ha elveszíti a kulcsát, Bob tudja végül kivenni az eszközöket. Ha Bob rosszindulatúan kezd viselkedni, Alice ki tudja kapcsolni, hogy Bob pénzt vehessen fel. +Alice-nek általában elég naponta 1%, azonban, ha Alice-nek többre van szüksége, értesítheti Bobot, és segítséget kérhet. Ha Alice-t támadás éri, Bobhoz siethet, és a pénzeszközöket egy új szerződésbe tudja átmozgatni. Ha elveszíti a kulcsát, Bob tudja végül kivenni az eszközöket. Ha Bob rosszindulatúan kezd viselkedni, Alice ki tudja kapcsolni, hogy Bob pénzt vehessen fel. -**2. Termény-biztosítás**. Bárki készíthet könnyedén származtatott szerződést, ha az ár indexek helyett az időjárási adatokról érkező adat-feedet használja. Ha egy iowai farmer olyan származtatott ügyletet vásárol, ami fordítottan fizet az Iowában esett csapadék alapján, majd, ha szárazság van, a farmer automatikusan pénzhez jut, ha pedig elég eső esik, a farmer szintén jól jár, mert jó termése lesz. Ez általánosságban kiterjeszthető természeti csapásra vonatkozó biztosítással. +**2. Terménybiztosítás**. Bárki készíthet könnyedén származtatott szerződést, ha az árindexek helyett az időjárási adatokról érkező adatforrást használja. Ha egy iowai farmer olyan származtatott ügyletet vásárol, ami fordítottan fizet az Iowában esett csapadék alapján, majd, ha szárazság van, a farmer automatikusan pénzhez jut, ha pedig elég eső esik, a farmer szintén jól jár, mert jó termése lesz. Ez általánosságban kiterjeszthető természeti csapásra vonatkozó biztosítással. -**3. Egy decentralizált adat-feed**. A pénzügyi CFD-k (nyitó és záróérték közti különbség lekereskedése) esetében gyakorlatilag lehetőség van decentralizálni az adat-feed-et a következő protokollal [SchellingCoin](http://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/). A SchellingCoin gyakorlatilag a következőképpen működik: N fél beteszi a rendszerbe egy adott bázis értékét (pl. ETH/USD árfolyam), az értékeket rendezik, és mindenki, aki 25% - 75% között van egy tokent kap jutalmul. Ez a rendszer mindenkit arra ösztönöz, hogy olyan választ adjon, mint a többiek, és az egyetlen érték, amiben a játékosok nagy száma realisztikusan egyet tud érteni a nyilvánvaló alap: azaz az igazság. Ez egy decentralizált protokollt hoz létre, amely elméletileg bármilyen számú értéket adhat, ideértve az ETH/USD árát, vagy a berlini hőmérsékletet vagy egy nehéz számítási feladat eredményét. +**3. Decentralizált adatforrás**. A pénzügyi CFD-k (nyitó és záróérték közti különbség lekereskedése) esetében gyakorlatilag lehetőség van decentralizálni az adaforrást a [SchellingCoin](http://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/) protokollal. A SchellingCoin a következőképpen működik: N fél beteszi a rendszerbe egy adott bázis értékét (például ETH/USD árfolyam), az értékeket rendezik, és mindenki, aki 25-75% között van egy tokent kap jutalmul. Ez a rendszer mindenkit arra ösztönöz, hogy olyan választ adjon, mint a többiek, és az egyetlen érték, amiben a résztvevők nagy száma realisztikusan egyet tud érteni a nyilvánvaló alap: az igazság. Ez egy decentralizált protokollt hoz létre, amely elméletileg bármilyen számú értéket adhat, ideértve az ETH/USD árát, vagy a berlini hőmérsékletet vagy egy nehéz számítási feladat eredményét. -**4. Okos, több aláírásos escrow**. A Bitcoin többaláírásos tranzakciós szerződéseket is enged, ahol például adott öt kulcsból három tudja elkölteni a pénzeszközöket. Az Ethereum ennél részletesebb lehetőségeket is kínál; például ötből négy mindent el tud költeni, ötből három naponta 10%-ot, ötből kettő pedig csak napi 0,5%-t. Továbbá az Ethereum több aláírásos megoldás aszinkron - két fél különböző időben tudja regisztrálni az aláírását a blokkláncon, az utolsó aláírás küldi el automatikusan a tranzakciót. +**4. Okos, több aláírásos fedezet**. A Bitcoin többaláírásos tranzakciós szerződéseket is enged, ahol például öt kulcsból három tudja elkölteni a pénzeszközöket. Az Ethereum ennél részletesebb lehetőségeket is kínál; például ötből négy mindent el tud költeni, ötből három naponta 10%-ot, ötből kettő pedig csak napi 0,5%-ot. Továbbá az Ethereum több aláírásos megoldás aszinkron – két fél különböző időben tudja regisztrálni az aláírását a blokkláncon, az utolsó aláírás küldi el automatikusan a tranzakciót. -**5. Felhőben történő számítás**. Az EVM technológia szintén használható hitelesíthető számítási környezet létrehozására, ahol a felhasználók megkérhetnek másokat számítások végzésére, majd opcionálisan kérhetnek bizonyítékot arra, hogy a számítások adott, véletlenszerűen kiválasztott ellenőrzési pontokon pontosan lettek elvégezve. Így létre lehet hozni egy felhő alapú számítási piacot, amelyen bármelyik felhasználó részt vehet az asztali gépével, laptopjával, vagy speciális szerverével, és együtt ellenőrizhetik szúrópróbaszerűen, hogy mely biztonsági letétek használhatók annak biztosítására, hogy a rendszer megbízható (azaz a csomópontok nem tudnak nyereségesen csalni). Bár egy ilyen rendszer nem feltétlenül felel meg minden feladatra; például nehézkes olyan feladatokat elvégezni nagyméretű felhőalapú csomópontokon, amelyek magasszintű, folyamat közbeni kommunikációt igényelnek. Más feladatokat azonban sokkal könnyebb párhuzamosan végezni; például a SETI@home, folding@home és általános algoritmusokat könnyebben meg lehet valósítani ilyen platformokon. +**5. Felhőben történő számítás**. Az EVM technológia szintén használható hitelesíthető számítási környezet létrehozására, ahol a felhasználók megkérhetnek másokat számítások végzésére, majd opcionálisan kérhetnek bizonyítékot arra, hogy a számítások adott, véletlenszerűen kiválasztott ellenőrzési pontokon pontosan lettek elvégezve. Így létre lehet hozni egy felhő alapú számítási piacot, amelyen bármelyik felhasználó részt vehet az asztali gépével, laptopjával vagy speciális szerverével, és együtt ellenőrizhetik szúrópróbaszerűen, hogy mely biztonsági letétek használhatók annak biztosítására, hogy a rendszer megbízható (azaz a csomópontok nem tudnak nyereségesen csalni). Bár egy ilyen rendszer nem feltétlenül felel meg minden feladatra; például nehézkes olyan feladatokat elvégezni nagyméretű felhőalapú csomópontokon, amelyek magasszintű, folyamat közbeni kommunikációt igényelnek. Más feladatokat azonban sokkal könnyebb párhuzamosan végezni; például a SETI@home, folding@home és általános algoritmusokat könnyebben meg lehet valósítani ilyen platformokon. -**6. Peer-to-peer szerencsejáték**. Tetszőleges számú peer-to-peer szerencsejáték protokollt, például Frank Stajano és Richard Clayton [Cyberdice](http://www.cl.cam.ac.uk/~fms27/papers/2008-StajanoCla-cyberdice.pdf) protokollját, lehet megvalósítani Ethereum blokkláncon. A legegyszerűbb szerencsejáték protokoll egyszerűen egy CFD a következő blokk-hashre, ennél bonyolultabb protokollokat is lehet építeni, például szerencsejáték szolgáltatásokat nullához közeli díjakkal, ahol ki lehet zárni a csalás lehetőségét. +**6. Közvetítő nélküli (peer-to-peer) szerencsejáték**. Tetszőleges számú peer-to-peer szerencsejáték protokollt, például Frank Stajano és Richard Clayton [Cyberdice](http://www.cl.cam.ac.uk/~fms27/papers/2008-StajanoCla-cyberdice.pdf) protokollját, lehet megvalósítani Ethereum blokkláncon. A legegyszerűbb szerencsejáték protokoll egyszerűen egy CFD a következő blokk-hashre, de ennél bonyolultabb protokollokat is lehet építeni, például szerencsejáték szolgáltatásokat nullához közeli díjakkal, ahol ki lehet zárni a csalás lehetőségét. **7. Kimenetelre fogadó piacok**. Az Oracle vagy SchellingCoin környezetben futó kimenetelre fogadó piacokat könnyen meg lehet valósítani; ezek a piacok a SchellingCoin-nal együtt az első [futarchy](http://hanson.gmu.edu/futarchy.html) mainstream alkalmazássá nőhetik ki magukat a decentralizált szervezetek irányítási protokolljaként. -**8. On-chain decentralizált piacterek**, amelyek az azonosítás és elismerés rendszert használják alapként. +**8. Láncon belüli decentralizált piacterek**, amelyek az azonosítási és elismerési rendszert használják alapként. ## Egyebek és aggályok {#miscellanea-and-concerns} ### Módosított GHOST implementáció {#modified-ghost-implementation} -A "Greedy Heaviest Observed Subtree" (GHOST) innovatív protokollt Yonatan Sompolinsky és Aviv Zohar vezette be [2013 decemberében](https://eprint.iacr.org/2013/881.pdf). A GHOST mögötti motiváció az volt, hogy azokon a blokkláncokon, ahol a megerősítési idő gyors, a magas elavulási aránynak köszönhetően csökken a biztonság - mivel a blokknak bizonyos időre van szüksége a hálózaton való terjedéshez, ha A bányász kibányász egy blokkot, majd B bányász még azelőtt kibányász egy blokkot, hogy A bányász blokkja eljutna B bányászhoz, ez utóbbi blokkja feleslegessé válik, és nem járul hozzá a hálózat biztonságához. Továbbá van egy centralizációs probléma is: ha A bányász egy 30% hash-erejű bányász-pool, és B bányásznak 10% hash-ereje van, A bányásznak megvan az a kockázata, hogy az esetek 70%-ában elavult blokkot hozzon létre (mivel a fennmaradó 30% esetben A bányász hozta létre az utolsó blokkot, így azonnal bányászati adathoz jut), míg B bányász kockázata, hogy az esetek 90%-ában fog létrehozni elavult blokkot. Ezért ha a blokk intervallum elég rövid ahhoz, hogy a lejárati arány magas legyen, A jelentősen hatékonyabb lesz pusztán a mérete miatt. A két hatás kombinálásával az a blokklánc, amely gyorsan gyárt blokkokat valószínűleg vezetni fog egy bányász poolt, és elég nagy százalékot fog elfoglalni a hálózat hash-teljesítményéből, hogy de facto átvegye az irányítást a bányászási folyamat fölött. +A „Greedy Heaviest Observed Subtree” (GHOST, „mohó legsúlyosabb részfa”) innovatív protokollt Yonatan Sompolinsky és Aviv Zohar vezette be [2013 decemberében](https://eprint.iacr.org/2013/881.pdf). A GHOST mögötti motiváció az volt, hogy azokon a blokkláncokon, ahol a megerősítési idő gyors, a magas elavulási aránynak köszönhetően csökken a biztonság – mivel a blokknak bizonyos időre van szüksége a hálózaton való terjedéshez, ha A bányász kibányász egy blokkot, majd B bányász még azelőtt kibányász egy blokkot, hogy A bányász blokkja eljutna B bányászhoz, ez utóbbi blokkja feleslegessé válik, és nem járul hozzá a hálózat biztonságához. Továbbá van egy centralizációs probléma is: ha A bányász egy 30% hash-erejű bányászalap, és B bányásznak 10% hash-ereje van, akkor az A bányász elavult blokk létrehozási kockázata 70% (a fennmaradó 30%-ban az A bányász hozta létre az utolsó blokkot, így azonnal bányászati adathoz jut), míg B bányász az esetek 90%-ában fog létrehozni elavult blokkot. Ezért ha a blokkintervallum elég rövid ahhoz, hogy a lejárati arány magas legyen, az A bányász jelentősen hatékonyabb lesz pusztán a mérete miatt. A két hatás kombinálásával az a blokklánc, amely gyorsan gyárt blokkokat valószínűleg vezetni fog egy bányászalapot, és elég nagy százalékot fog elfoglalni a hálózat hash-teljesítményéből, hogy de facto átvegye az irányítást a bányászási folyamat fölött. -Ahogy Sompolinsky és Zohar is leírta, a GHOST megoldja a hálózat biztonságának elvesztését érintő első problémát azzal, hogy lejárt blokkokat is belevesz annak kiszámításába, hogy melyik lánc a "leghosszabb"; azaz nem csak a blokk szülőit és elődeit veszi figyelembe, hanem a blokk elődeinek nem élő leszármazottait is (Ethereum kifejezéssel élve "nagybácsikat") hozzáadja ahhoz a számításhoz, hogy melyik blokkon van a legtöbb proof-of-work. A centralizációval kapcsolatos második probléma megoldására túlhaladunk a Sompolinsky és Zohar által ismertetett protokollon, és blokk jutalmakat adunk az elavult blokkokra is: egy elavult blokk az alapjutalom 87,5%-át éri, míg az elavult blokkot tartalmazó unokaöccs megkapja a fennmaradó 12,5%-ot. A tranzakciós díjakat azonban nem kapják meg a nagybácsik. +Ahogy Sompolinsky és Zohar is leírta, a GHOST megoldja a hálózat biztonságának elvesztését érintő első problémát azzal, hogy lejárt blokkokat is belevesz annak kiszámításába, hogy melyik lánc a „leghosszabb”; azaz nem csak a blokk szülőit és elődeit veszi figyelembe, hanem a blokk elődeinek mellékes leszármazottait is (Ethereum kifejezéssel élve uncle/nagybácsi) hozzáadja ahhoz a számításhoz, hogy melyik blokkon van a legtöbb proof-of-work. A centralizációval kapcsolatos második probléma megoldására túlhaladunk a Sompolinsky és Zohar által ismertetett protokollon, és blokk jutalmakat adunk az elavult blokkokra is: egy elavult blokk az alapjutalom 87,5%-át éri, míg az elavult blokkot tartalmazó unokaöccs megkapja a fennmaradó 12,5%-ot. A tranzakciós díjakat azonban nem kapják meg a nagybácsik. -Az Ethereum a GHOST egy egyszerűsített verzióját implementálja, amely hét szintre megy le. A részletes meghatározást lásd itt: +Az Ethereum a GHOST egy egyszerűsített verzióját implementálta, amely hét szintre megy le. Ez a következőképpen néz ki: - Egy blokknak meg kell határoznia egy szülőt, és 0 vagy több nagybácsit -- Egy `B` blokkban lévő nagybácsinak a következő tulajdonságokkal kell rendelkeznie: -- Közvetlen leszármazottnak kell lennie a `k`-adik generációs `B` ősnek, ahol `2 <= k <= 7`. -- Nem lehet a `B` őse -- Egy nagybácsinak érvényes blokk fejlécnek kell lennie, de nem kell korábban hitelesített vagy érvényes blokknak lennie -- A nagybácsinak különböznie kell a korábbi blokkokban szereplő nagybácsiktól, illetve az ugyanabban a blokkban lévő más nagybácsiktól (nincs-dupla-szerepeltetés) -- Minden`U` nagybácsihoz a `B` blokkban, a `B` bányász további 3,125%-ot kap a coinbase jutalmához, és az U bánász 93,75% standard coinbase jutalomban részesül. +- Egy B blokkban lévő nagybácsinak a következő tulajdonságokkal kell rendelkeznie: + - Közvetlen leszármazottnak kell lennie a k-adik generációs B ősnek, ahol 2 <= k <= 7. + - Nem lehet a B őse + - Egy nagybácsinak érvényes blokkfejléccel kell rendelkeznie, de nem kell korábban hitelesített vagy érvényes blokknak lennie + - A nagybácsinak különböznie kell a korábbi blokkokban szereplő nagybácsiktól, illetve az ugyanabban a blokkban lévő más nagybácsiktól (nincs dupla szerepeltetés) +- Minden U nagybácsihoz a B blokkban, a B bányász további 3,125%-ot kap a jutalmához, és az U bányász 93,75% sztenderd jutalomban részesül. A GHOST limitált verzióját, ahol legfeljebb 7 generációig szerepelhet nagybácsi, két ok miatt használtuk. Először is a korlátlan GHOST túl sok komplikációval járna annak kiszámításában, hogy egy adott blokkban mely nagybácsik érvényesek. Másodsorban a korlátlan GHOST, ahogy az Ethereumban használják, nem ösztönzi a bányászt, hogy a fő láncon bányásszon a nyilvános támadó által használt lánc helyett. ### Díjak {#fees} -Mivel minden blokkláncban közzétett tranzakció költséget ró a hálózatra a letöltés és a hitelesítés miatt, szükség van valamilyen szabályozó mechanizmusra, általában tranzakciós díjak beiktatását, hogy meg lehessen akadályozni a rosszindulatú viselkedést. A Bitcoinban is alkalmazott alapértelmezett megközelítés szerint tisztán önkéntes díjakra van szükség, ami a bányászokra támaszkodik abban, hogy őrizzék a biztonságot és dinamikus minimumokat állítsanak be. Ezt a megközelítést nagyon kedvezően fogadták a Bitcoin közösségben, különösen azért, mert "piaci-alapú", meghagyja a keresletet és a kínálatot a bányászok és a tranzakciók küldői között, és így meghatározza az árat. A probléma ezzel az érveléssel az, hogy a tranzakciók feldolgozása nem piac; bár intuitívan vonzó a tranzakció feldolgozását olyan szolgáltatásként értelmezni, amelyet a bányász kínál küldőnek, a valóságban minden olyan tranzakció, amelyhez bányász kell a hálózat minden csomópontján fel kell dolgozni, így a tranzakció feldolgozási költségének jelentős részét külső felek fizetik, és nem a bányász hozza meg azt a döntést, hogy foglalkozik-e vele vagy sem. Így nagyon valószínű a "közlegelő tragédiája" típusú problémák előfordulása. +Mivel minden blokkláncban közzétett tranzakció költséget ró a hálózatra a letöltés és a hitelesítés miatt, szükség van valamilyen szabályozó mechanizmusra, általában tranzakciós díjak beiktatására, hogy meg lehessen akadályozni a rosszindulatú viselkedést. A Bitcoinban is alkalmazott alapértelmezett megközelítés szerint tisztán önkéntes díjakra van szükség, ami a bányászokra támaszkodik abban, hogy őrizzék a biztonságot és dinamikus minimumokat állítsanak be. Ezt a megközelítést nagyon kedvezően fogadták a Bitcoin közösségben, különösen azért, mert az „piaci alapú”, megengedi, hogy a bányászok és a tranzakciók küldői közötti keresletet és kínálatot határozza meg az árat. A probléma ezzel az érveléssel az, hogy a tranzakciók feldolgozása nem piac; bár intuitív módon vonzó a tranzakció feldolgozását olyan szolgáltatásként értelmezni, amelyet a bányász kínál küldőnek, a valóságban minden olyan tranzakció, amelyhez bányász kell a hálózat minden csomópontján fel kell dolgozni, így a tranzakció feldolgozási költségének jelentős részét külső felek fizetik, és nem a bányász hozza meg azt a döntést, hogy foglalkozik-e vele vagy sem. Így nagyon valószínű a „közlegelők tragédiája" típusú problémák előfordulása. Azonban úgy tűnik, hogy a piaci alapú mechanizmus ezen hibája, amikor pontatlan egyszerűsítő feltételezéssel élnek, mágikusan megszünteti saját magát. Az érvelés a következő. Tegyük fel, hogy: -1. Egy tranzakció `k` művelethez vezet, `kR` jutalmat kínál minden olyan bányásznak, aki szerepel benne, ahol az `R` értéket a küldő állítja be, és az `k` és `R` (durván) már előre látható a bányász oldalán. -2. Egy művelet feldolgozásához szükséges költség `C` bármely csomóponton (azaz az összes csomópont hatékonysága azonos) -3. `N` bányász csomópont van, mindegyik pontosan ugyanannyi feldolgozási teljesítménnyel (azaz `1/N` az összesből) -4. Nincs nem-bányászó teljes csomópont. +1. Egy tranzakció `k` művelethez vezet, `kR` jutalmat kínál minden olyan bányásznak, aki szerepel benne, ahol az `R` értéket a küldő állítja be, és az `k` és `R` (nagyjából) már előre látható a bányász oldalán. +2. Egy művelet feldolgozásához szükséges költség `C` bármely csomóponton (azaz az összes csomópont hatékonysága azonos) +3. `N` bányász csomópont van, mindegyik pontosan ugyanannyi feldolgozási teljesítménnyel (azaz `1/N` az összesből) +4. Nincs nem bányászó teljes csomópont. Egy bányász akkor hajlandó feldolgozni a tranzakciót, ha a várható jutalom nagyobb, mint a költség. Így a várható jutalom `kR/N` mivel a bányásznak `1/N` esélye van feldolgozni a következő blokkot, és a bányász feldolgozási költsége `kC`. Következésképpen a bányászok olyan tranzakciókban fognak részt venni, ahol `kR/N > kC`, vagy `R > NC`. Ne feledjük, hogy `R` a küldő által műveletenként biztosított díj, amely alulról korlátozza azt az előnyt, amit a küldő a tranzakcióból nyer, és az `NC` pedig a műveletet feldolgozó teljes hálózat költsége. Következésképpen a bányászok csak olyan tranzakcióban érdekeltek, amelyen a teljes haszonelvű előny nagyobb, mint a költség. -Azonban a valóságban számos fontos eltérés mutatkozik a feltételezésektől: +Azonban a valóságban a feltételezésektől számos fontos eltérés mutatkozik: -1. A bányász nagyobb költséget fizet a tranzakció feldolgozásáért mint a többi, hitelesítést végző csomópont, mivel az extra hitelesítéshez szükséges idő késlelteti a blokk terjedését, és növeli annak az esélyét, hogy a blokk elavulttá válik. -2. Így létezik nem-bányászó teljes csomópont. -3. A bányászati teljesítmény eloszlás a gyakorlatban radikálisan egyenlőtlenné válhat. -4. A spekulánsok, politikai ellenségek és őrültek, akiknek a használati függvényei a hálózatra nézve káros elemeket tartalmaznak okosan olyan szerződéseket készíthetnek, amelyekben a költségeik sokkal alacsonyabbak, mint a többi hitelesítő csomópont által fizetett költségek. +1. A bányász nagyobb költséget fizet a tranzakció feldolgozásáért mint a többi, hitelesítést végző csomópont, mivel az extra hitelesítéshez szükséges idő késlelteti a blokk terjedését, és növeli annak az esélyét, hogy a blokk elavulttá válik. +2. Tehát létezik nem bányászó teljes csomópont. +3. A bányászati teljesítmény eloszlás a gyakorlatban radikálisan egyenlőtlenné válhat. +4. A spekulánsok, politikai ellenségek és őrültek, akiknek a használati függvényei a hálózatra nézve káros elemeket tartalmaznak okosan olyan szerződéseket készíthetnek, amelyekben a költségeik sokkal alacsonyabbak, mint a többi hitelesítő csomópont által fizetett költségek. -(1) olyan tendenciát biztosít a bányásznak, hogy kevesebb tranzakcióba vonódjon bele, és (2) növeli az `NC` értékét; következésképpen ez a két hatás legalább részben kiírtja egymást.[Hogyan?](https://github.com/ethereum/wiki/issues/447#issuecomment-316972260) (3) és (4) a fő probléma; megoldásukra egy egyszerű lebegő sapkát alkalmazunk: egyetlen blokkon sem lehet több művelet mint a hosszú távú exponenciális mozgóátlag `BLK_LIMIT_FACTOR` -szorosa. Különösképpen: +(1) olyan tendenciát biztosít a bányásznak, hogy kevesebb tranzakcióba vonódjon bele, és (2) növeli az `NC` értékét; következésképpen ez a két hatás legalább részben kiírtja egymást.[Hogyan?](https://github.com/ethereum/wiki/issues/447#issuecomment-316972260) (3) és (4) a fő probléma; megoldásukra egy egyszerű lebegő limitet alkalmazunk: egyetlen blokkon sem lehet több művelet mint a hosszú távú exponenciális mozgóátlag `BLK_LIMIT_FACTOR`-szorosa. Különösképpen: - blk.oplimit = floor((blk.parent.oplimit \* (EMAFACTOR - 1) + - floor(parent.opcount \* BLK\_LIMIT\_FACTOR)) / EMA\_FACTOR) +```js +blk.oplimit = floor((blk.parent.oplimit \* (EMAFACTOR - 1) + +floor(parent.opcount \* BLK\_LIMIT\_FACTOR)) / EMA\_FACTOR) +``` -A `BLK_LIMIT_FACTOR` és `EMA_FACTOR` állandó, beállításuk jelenleg 65536 és 1,5, amely további elemzés után változhat. +A `BLK_LIMIT_FACTOR` és `EMA_FACTOR` állandó, beállításuk 65536 és 1,5 jelenleg, amely további elemzés után változhat. -Van még egy faktor, ami megszünteti a nagy blokkméretek iránti elköteleződést a Bitcoinban: a nagy blokkok terjedési ideje hosszabb, és így nagyobb eséllyel válnak elavulttá. Az Ethereumban a sok gázt fogyasztó blokkoknak is több időre van szüksége a terjedéshez, mivel egyrészt fizikailag hosszabbak, másrészt több időbe telik az állapot átmenet tranzakciók feldolgozásának validálása. Ez a késleltetési negatív ösztönző jelentős a Bitcoin esetében, de kevésbé az az Ethereum világában a GHOST protokoll miatt; következésképpen a szabályozott blokk limitekre való támaszkodás stabilabb alapkonfigurációt tesz lehetővé. +Van még egy faktor, ami megszünteti a nagy blokkméretek iránti elköteleződést a Bitcoinban: a nagy blokkok terjedési ideje hosszabb, és így nagyobb eséllyel válnak elavulttá. Az Ethereumban a sok gázt fogyasztó blokkoknak is több időre van szüksége a terjedéshez, mivel egyrészt fizikailag hosszabbak, másrészt több időbe telik a státuszváltozási tranzakciók feldolgozásának validálása. Ez a késleltetési negatív ösztönző jelentős a Bitcoin esetében, de kevésbé az az Ethereum világában a GHOST protokoll miatt; következésképpen a szabályozott blokklimitekre való támaszkodás stabilabb alapkonfigurációt tesz lehetővé. -### Számítási és Turing-teljesség {#computation-and-turing-completeness} +### Számítás és Turing-teljesség {#computation-and-turing-completeness} -Fontos megjegyezni, hogy az Ethereum virtuális gép Turing-teljes; azaz az EVM kód minden olyan számítást képes titkosítani, amelyet rejtve lehet elvégezni, ideértve a végtelen hurkokat is. Az EVm kód a hurkokat kétféleképpen teszi lehetővé. Egyfelől a `JUMP` utasítás lehetővé teszi a programnak, hogy visszaugorjon egy korábbi pontra a kódban, míg a `JUMPI` utasítás feltételhez kötött ugrást hajt végre, lehetővé téve a `while x < 27: x = x * 2` típusú állításokat. Másodsorban a szerződések más szerződéseket is meghívhatnak, ami potenciálisan lehetővé teszi a rekurzión keresztül történő hurkok alkalmazását. Ez természetesen egy problémát eredményez: a kártékony felhasználók lényegében le tudják állítani a bányászokat és a teljes csomópontokat azzal, hogy végtelen hurokba lépésre kényszerítik őket? A probléma a számítástechnikában megakadás problémaként ismert jelenség miatt jelentkezik: általánosságban nem lehet megmondani, hogy egy adott program mikor akad meg. +Fontos megjegyezni, hogy az Ethereum virtuális gép Turing-teljes; azaz az EVM-kód minden olyan számítást képes titkosítani, amelyet rejtve lehet elvégezni, ideértve a végtelen hurkokat is. Az EVM-kód a hurkokat kétféleképpen teszi lehetővé. Egyfelől a `JUMP` utasítás lehetővé teszi a programnak, hogy visszaugorjon egy korábbi pontra a kódban, míg a `JUMPI` utasítás feltételhez kötött ugrást hajt végre, lehetővé téve a `while x < 27: x = x * 2` típusú állításokat. Másodsorban a szerződések más szerződéseket is meghívhatnak, ami potenciálisan lehetővé teszi a rekurzión keresztül történő hurkok alkalmazását. Ez természetesen egy problémát eredményez: a kártékony felhasználók le tudják állítani a bányászokat és a teljes csomópontokat azzal, hogy végtelen hurokba lépésre kényszerítik őket? Ez a helyzet a számítástechnikában megakadásproblémaként ismert: általánosságban nem lehet megmondani, hogy egy adott program mikor akad meg. -Mint azt az állapot átmenet részben is leírtuk, a megoldásunk úgy működik, hogy egy tranzakcióban be kell állítani a maximálisan engedélyezett számítási lépések számát, és ha a futtatás tovább tart, a számítást visszatérítik, azonban díjat is kell fizetni. Az üzenetek hasonlóképpen működnek. A megoldás mögött húzódó motiváció bemutatására nézzük az alábbi példákat: +Mint azt a státuszváltozási részben is leírtuk, a megoldásunk úgy működik, hogy egy tranzakcióban be kell állítani a maximálisan engedélyezett számítási lépések számát, és ha a futtatás tovább tart, a számítást visszatérítik, azonban díjat kell fizetni. Az üzenetek hasonlóképpen működnek. A megoldás mögötti motiváció bemutatására nézzük az alábbi példákat: -- Egy támadó létrehoz egy szerződést, amely végtelen hurkot futtat, majd egy tranzakciót küld a bányásznak, amely aktiválja a hurkot. A bányász feldolgozza a tranzakciót, futtatja a végtelen hurkot, majd megvárja, amíg elfogy a gáz. Bár a futtatás kifogy a gázból és félúton megáll, a tranzakció továbbra is érvényes, és a bányász bekéri a díjat a támadótól minden számítási lépésért. +- Egy támadó létrehoz egy szerződést, amely végtelen hurkot futtat, majd egy tranzakciót küld a bányásznak, amely aktiválja a hurkot. A bányász feldolgozza a tranzakciót, futtatja a végtelen hurkot, majd megvárja, amíg elfogy a gáz. Bár a futtatás közben kifogy a gáz és félúton megáll, a tranzakció továbbra is érvényes, és a bányász bekéri a díjat a támadótól minden számítási lépésért. - Egy támadó egy nagyon hosszú végtelen hurkot hoz létre azzal a szándékkal, hogy a bányász olyan sokáig végezze a számítást, hogy a számítás végére pár új blokk is kikerüljön, és így lehetetlenné váljon a bányásznak a tranzakció belefoglalása, hogy díjat számíthasson fel. Azonban a támadónak be kell küldenie egy `STARTGAS` értéket, amely korlátozza a futtatásban használható számítások számát, így a bányász már előre tudni fogja, hogy a számítás jelentősen több lépésből fog állni. -- Egy támadó valami ilyesmit kódot lát a szerződésben `send(A,contract.storage[A]); contract.storage[A] = 0`, és pont annyi gázzal küldi el a tranzakciót, hogy futtatni lehessen az első lépést, de a másodikat már ne (azaz meglegyen a levétel, de az egyenleg ne csökkenjen le). A szerződés létrehozójának nem kell azon aggódnia, hogy védekezzen az ilyen támadások ellen, mivel, ha a futtatás félúton megáll, azok vissza lesznek térítve. -- Egy pénzügyi szerződés úgy működik, hogy kilenc tulajdonost illető adat -feed középértékét veszi a kockáztok minimalizálása érdekében. Amikor egy támadó átvesz egy adat-feed-et, amelyet úgy tervetek, hogy módosítható legyen a DAO részben ismertetett változó-cím-meghívás mechanizmuson keresztül, és átkonvertálja úgy, hogy végtelen hurokban fusson, és így megpróbál kikényszeríteni olyan próbálkozásokat amelyek pénzeszközöket kérnek a pénzügyi szerződéstől amíg ki nem fogy a gáz. Azonban a pénzügyi szerződésekben be lehet állítani gázkorlátot az üzeneten, és így meg lehet előzni a problémát. +- Egy támadó valami ilyesmit kódot lát a szerződésben `send(A,contract.storage[A]); contract.storage[A] = 0`, és pont annyi gázzal küldi el a tranzakciót, hogy futtatni lehessen az első lépést, de a másodikat már ne (azaz meglegyen a levétel, de az egyenleg ne csökkenjen le). A szerződés létrehozójának nem kell azon aggódnia, hogy védekezzen az ilyen támadások ellen, mivel ha a futtatás félúton megáll, azok vissza lesznek térítve. +- Egy pénzügyi szerződés úgy működik, hogy kilenc tulajdonos adatforrásának középértékét veszi a kockáztok minimalizálása érdekében. Amikor egy támadó átvesz egy adatforrást, amelyet úgy tervetek, hogy módosítható legyen a DAO részben ismertetett változó-cím-meghívás mechanizmuson keresztül, átkonvertálja úgy, hogy végtelen hurokban fusson, és így megpróbálja kikényszeríteni azokat a próbálkozásokat, amelyek pénzeszközöket kérnek a pénzügyi szerződéstől, amíg ki nem fogy a gáz. Azonban a pénzügyi szerződésekben be lehet állítani gázkorlátot az üzeneten, és így meg lehet előzni a problémát. -A Turing-teljesség alternatívája a Turing-nem-teljesség, ahol a `JUMP` és `JUMPI` nem létezik, és egyszerre csak egy szerződéspéldány létezhet a hívás-stackben. Ezzel a rendszerrel a korábban ismertetett díjrendszer és a megoldásunk hatékonyságával kapcsolatos bizonytalanságok nem feltétlenül szükségesek, mivel a szerződés futtatásának költségét annak mérete korlátozza be. Továbbá a Turing-nem-teljesség nem túl nagy limitáció; az általunk kitalált összes szerződés példa közül csupán egyhez volt szükség hurokra, és még ez az egy hurok is eltávolítható egy egysoros kódrészlet 26 ismétlésével. A Turing-teljesség súlyos implikációi, valamint a korlátozott haszon alapján, miért nincs egyszerűen egy Turing-nem-teljesség nyelv? A valóságban azonban a Turing-nem-teljesség messze van a probléma elegáns megoldásától. Hogy megértsük miért, nézzük meg a következő szerződéseket: +A Turing-teljesség alternatívája a Turing-nem-teljesség, ahol a `JUMP` és `JUMPI` nem létezik, és egyszerre csak egy szerződéspéldány létezhet a hívás-stackben. Ezzel a rendszerrel a korábban ismertetett díjrendszer és a megoldásunk hatékonyságával kapcsolatos bizonytalanságok nem feltétlenül szükségesek, mivel a szerződés futtatásának költségét annak mérete korlátozza be. Továbbá a Turing-nem-teljesség nem túl nagy limitáció; az általunk kitalált összes szerződés példa közül csupán egyhez volt szükség hurokra, és még ez az egy hurok is eltávolítható egy 26-szor ismételt, egysoros kódrészlettel. A Turing-teljesség súlyos implikációi, valamint a korlátozott haszon alapján, miért nincs egy Turing-nem-teljesség nyelv? A valóságban a Turing-nem-teljesség messze van a probléma elegáns megoldásától. Nézzük meg a következő szerződéseket, hogy ennek okát megértsük: - C0: call(C1); call(C1); - C1: call(C2); call(C2); - C2: call(C3); call(C3); - ... - C49: call(C50); call(C50); - C50: (futtasson egy lépést a programból, majd rögzítse a változtatást a tárhelyen) +```sh +C0: call(C1); call(C1); +C1: call(C2); call(C2); +C2: call(C3); call(C3); +... +C49: call(C50); call(C50); +C50: (futtasson egy lépést a programból, majd rögzítse a változtatást a tárhelyen) +``` -Most, küldjön egy tranzakciót A-nak. Így 51 tranzakcióban van egy olyan szerződésünk, amely akár 250 számítási lépést is magában foglalhat. A bányászok megpróbálhatják már jóelőre kiszűrni ezeket a logikai bombákat, ha értéket tartanak minden szerződés mellett, amely meghatározza, hogy legfeljebb mennyi számítási lépést vehet fel, és kiszámítják ezt azokhoz a szerződésekhez, amelyek rekurzívan hívnak más szerződéseket, azonban ez arra kényszerítené a bányászokat, hogy letiltsák azokat a szerződéseket, amelyek más szerződéseket hoznak létre (mivel a fenti 26 szerződés létrehozása és futtatása könnyedén egy szerződésbe gyúrható). Másik problematikus pont, hogy az üzenet címmezője egy változó, tehát általánosságban idő előtt nem lehet megmondani, hogy milyen más szerződést fog meghívni egy adott szerződés. Ezért összességében meglepő következtetésre jutottunk: A Turing-teljességet meglepően könnyű kezelni, valamint a Turing-teljesség hiányát hasonlóképpen meglepően nehéz kezelni, kivéve, ha ugyanezeket a vezérlőket alkalmazzuk - de ebben az esetben miért ne legyen a protokoll Turing-teljes? +Küldjön egy tranzakciót A-nak. Így 51 tranzakcióban van egy olyan szerződésünk, amely akár 250 számítási lépést is magában foglalhat. A bányászok megpróbálhatják már előre kiszűrni ezeket a logikai bombákat, ha értéket tartanak minden szerződés mellett, amely meghatározza, hogy legfeljebb mennyi számítási lépést vehet fel, és kiszámítják ezt azokhoz a szerződésekhez, amelyek rekurzívan hívnak más szerződéseket, Ez azonban arra kényszerítené a bányászokat, hogy letiltsák azokat a szerződéseket, amelyek más szerződéseket hoznak létre (mivel a fenti 26 szerződés létrehozása és futtatása könnyedén egy szerződésbe gyúrható). Másik problematikus pont, hogy az üzenet címmezője egy változó, tehát általánosságban idő előtt nem lehet megmondani, hogy milyen más szerződést fog meghívni egy adott szerződés. Ezért összességében meglepő következtetésre jutottunk: a Turing-teljességet meglepően könnyű kezelni, valamint a Turing-teljesség hiányát hasonlóképpen meglepően nehéz kezelni, kivéve, ha ugyanazokat a kontrollokat alkalmazzuk – de ebben az esetben miért ne legyen a protokoll Turing-teljes? -### Valuta és kiadás {#currency-and-issuance} +### Valuta és kibocsátás {#currency-and-issuance} -Az Ethereum rendszerben saját beépített valuta, az ether szolgál kettős célt, egyfelől egy elsődleges likviditási réteget biztosít a különböző digitális eszközök közötti hatékony váltáshoz, másfelől pedig fontos mechanizmust biztosít a tranzakciós költségek fizetésére. Kényelmi szempontból, valamint elkerülve a későbbi vitákat (lásd a jelenlegi mBTC/uBTC/satoshi vitát a Bitcoin-ban), a névértékeket előre felcímkézzük: +Az Ethereum rendszerben saját beépített valuta, az ether kettős célt szolgál, egyfelől egy elsődleges likviditási réteget biztosít a különböző digitális eszközök közötti hatékony váltáshoz, másfelől fontos mechanizmust biztosít a tranzakciós költségek fizetésére. Kényelmi szempontból, valamint elkerülve a későbbi vitákat (lásd a jelenlegi mBTC/uBTC/satoshi vitát a Bitcoin kapcsán), a névértékeket előre felcímkézzük: - 1: wei - 1012: szabo - 1015: finney - 1018: ether -Ez a "dollár" és "cent", illetve a "BTC" és "satoshi" koncepció kibővített változataként értelmezhető. A közeljövőben az "ether" lesz használatos a hagyományos tranzakciókra, a "finney" a mikrotranzakciókra, a "szabo" és "wei" pedig a díjak és protokoll implementációkkal kapcsolatos technikai értekezésekben; a fennmaradó címletek pedig később lehetnek hasznosak, és jelenleg nem szerepelnek a kliensekben. +Ez a „dollár” és „cent”, illetve a „BTC” és „satoshi” koncepció kibővített változataként értelmezhető. A közeljövőben az „ether” lesz használatos a hagyományos tranzakciókra, a „finney” a mikrotranzakciókra, a „szabo” és a „wei” pedig a díjakkal és protokollimplementációkkal kapcsolatos technikai értekezésekben; a fennmaradó címletek pedig később lehetnek hasznosak, és jelenleg nem szerepelnek a kliensekben. -A kiadási modell a következő: +A kibocsátási modell a következő: -- Az Ether mint valuta egy BTC-hez viszonyítva 1000-2000 ether árfolyamon fog forogni; ez a mechanizmus az Ethereum szervezet forrásait biztosítja, valamint ezzel lehet fizetni a fejlesztésekért, amelyet más platformon, például a Mastercoin-on és az NXT-n már sikerrel használtak. A korai vásárlók nagyobb kedvezményekben részesülnek. Az eladásból kapott BTC-ket teljes mértékben a fejlesztők fizetésére és javadalmazására fordítják, valamint különböző for-profit és non-profit projektekbe fektetik az Ethereum és kriptovaluta ökoszisztémában. -- A teljes értékesített összeg (60102216 ETH) 0.099x-át a szervezet kapja a korai hozzájárulók kompenzálására, valamint ETH-ban denominált költségekre fordítják a genesis blokk előtt. +- Az ether mint valuta egy BTC-hez viszonyítva 1000-2000 ether árfolyamon fog forogni; ez a mechanizmus az Ethereum szervezet forrásait biztosítja, valamint ezzel lehet fizetni a fejlesztésekért, amelyet más platformon, például a Mastercoinon és az NXT-n már sikerrel használtak. A korai vásárlók nagyobb kedvezményekben részesülnek. Az eladásból kapott BTC-ket teljes mértékben a fejlesztők fizetésére és javadalmazására fordítják, valamint különböző profitot célzó és non-profit projektekbe fektetik az Ethereum és kriptovaluta ökoszisztémában. +- A teljes értékesített összeg (60102216 ETH) 0.099x-ét a szervezet kapja a korai hozzájárulók kompenzálására, valamint az ETH-ben denominált költségekre fordítják a genezisblokk előtt. - A teljes értékesített összeg 0,099x részét hosszú távú tartalékba helyezik. - A teljes értékesített összeg 0,26x része a bányászokhoz kerül évente, örökre ezután a pont után. -| Csoport | induláskor | 1 év után | 5 év után | -| ------------------------------------- | ---------- | --------- | --------- | -| Valuta egység | 1,198X | 1,458X | 2,498X | -| Vásárlók | 83,5% | 68,6% | 40,0% | -| Értékesítés előtt elköltött tartalék | 8,26% | 6,79% | 3,96% | -| Értékesítés után felhasznált tartalék | 8,26% | 6,79% | 3,96% | -| Bányászok | 0% | 17,8% | 52,0% | +| Csoport | Indításkor | Egy év után | Öt év után | +| --------------------------------- | ---------- | ----------- | ---------- | +| Pénznemegységek | 1,198 X | 1,458 X | 2,498 X | +| Vevők | 83,5% | 68,6% | 40,0% | +| Eladás előtt felhasznált tartalék | 8,26% | 6,79% | 3,96% | +| Eladás után felhasznált tartalék | 8,26% | 6,79% | 3,96% | +| Bányászok | 0% | 17,8% | 52,0% | -**Hosszú távú kínálati növekedési ütem (százalék)** +#### Hosszú távú kínálati növekedési ütem (százalék) -![Ethereum infláció](./ethereum-inflation.png) +![Ethereum-infláció](./ethereum-inflation.png) -_A lineáris valuta kibocsátások ellenére, hasonlóan a Bitcoin-hoz időről időre a kínálati növekedési ütem nulla felé tart_ +_A lineáris valutakibocsátások ellenére, a Bitcoinhoz hasonlóan, a kínálati növekedési ütem nulla felé tart._ -A fenti modellben két választási lehetőség van (1) egy felnagyítási-pool megléte és mérete, és (2) egy állandóan növekvő lineáris kereslet, szemben a Bitcoin esetében látható felső korlátos kínálattal. A felnagyítási-pool indoklása a következő. Ha nincs felnagyítási-pool, és a lineáris kibocsátás 0,217x-re csökken az infláció biztosítására, akkor az ether teljes mennyisége 16,5%-al lesz kevesebb, és minden egység 19,8%-al értékesebb lenne. Következésképpen a 19,8%-os egyensúlyban több ethert vásárolnak az értékesítés folyamán, így minden egység megőrzi korábbi értékét. A szervezet ezután 1,198x BTC-vel rendelkezik, amit két szeletre lehet bontani: az eredeti BTC és a további 0,198x rész. Következésképpen a helyzet _pontosan megegyezik_ a nagyítással, van azonban egy fontos különbség: a szervezetnél csupán BTC van, és így nincs ösztönözve arra, hogy támogassa az ether mértékegység értékét. +A fenti modellben két fő választási lehetőség van: 1) egy felnagyítási alap megléte és mérete; és 2) egy állandóan növekvő lineáris kínálat megléte, szemben a Bitcoin esetében látható felső korlátos kínálattal. A felnagyítási alap indoklása a következő. Ha nincs felnagyítási alap, és a lineáris kibocsátás 0,217x-re csökken az azonos mértékű infláció biztosítására, akkor az ether teljes mennyisége 16,5%-kal lesz kevesebb, és így minden egység 19,8%-kal értékesebb lesz. Következésképpen az egyensúlyban 19.8%-kal több ethert vásárolnak az értékesítés folyamán, így minden egység megőrzi korábbi értékét. A szervezet ezután 1,198x BTC-vel rendelkezik, amelyet két szeletre lehet bontani: az eredeti BTC és a további 0,198x-es rész. Következésképpen a helyzet _pontosan megegyezik_ a nagyítással, van azonban egy fontos különbség: a szervezetnél csupán BTC van, és így nincs ösztönözve arra, hogy támogassa az ether mértékegység értékét. -Az állandó lineáris keresletnövekedés modell csökkenti a jelentő vagyonkoncentráció kockázatát a Bitcoinban, és lehetőséget biztosít a jelen és jövő vásárlóinak, hogy reális esélyük legyen valuta egységeket venni, ugyanakkor erősen ösztönöznek arra, hogy még több ethert vegyenek és tartsanak, mivel a "kereslet növekedési üteme" százalékosan idővel a nulla felé közelít. Azt is feltételezzük, hogy mivel óvatlanság, haláleset stb. miatt mindig van, aki elveszti a coinjait, és ez százalékosan is modellezhető az éves kínálat függvényében, a teljes forgalomban lévő valutakészlet végül a veszteség arányával elosztott éves kiadás értékével azonos értéken stabilizálódik (például ha a veszteség aránya 1%, amint a kínálat 26X, 0,26X lesz bányászva és 0,26x veszik el évente, és létrejön az egyensúly). +Az állandó lineáris keresletnövekedési modell csökkenti a Bitcoin esetében sokak által túlzónak tartott vagyonkoncentráció kockázatát, és lehetőséget biztosít a jelenlegi és jövőbeli vásárlóknak, hogy reális esélyük legyen valutaegységeket venni, ugyanakkor erősen ösztönöz arra, hogy még több ethert vegyenek és tartsanak, mivel a „keresletnövekedési ütem” százalékos értéke továbbra is idővel a nulla felé közelít. Azt is feltételezzük, hogy mivel óvatlanság, haláleset stb. miatt mindig van, aki elveszti az érméit, és ez százalékosan is modellezhető az éves kínálat függvényében, a forgalomban lévő teljes valutakészlet végül a veszteség arányával elosztott éves kibocsátás értékével azonos értéken stabilizálódik (például, ha a veszteség aránya 1%, akkor amint a kínálat eléri a 26X-t, évente 0,26X lesz bányászva és 0,26X veszik el, és létrejön az egyensúly). -Ne feledjük, hogy a jövőben valószínű, hogy az Ethereum proof-of-stake modellre vált a biztonság érdekében, és évi nulla és 0,05X közé csökken a kiadásra vonatkozó követelmény. Abban az esetben, ha az Ethereum szervezet elveszíti pénzeszközeit, vagy valamilyen más okból kifolyólag eltűnik, nyitva hagyunk egy "társadalmi szerződést": mindenkinek joga van létrehozni egy jövőbeli Ethereum verziót, azzal a feltétellel, hogy az ether mennyiségének `60102216 * (1.198 + 0.26 * n)` kell lennie, ahol az `n` a z évek számát jelöli a genesis blokk után. A létrehozók szabadon értékesíthetik crowd-sell formájában, illetve meghatározhatják a PoS-által hajtott kínálat növekedés és a maximálisan engedélyezett kínálat bővülés különbségét részben vagy egészben a fejlesztés költségeinek lefedésére. Azok a frissítések, amelyek nem felelnek meg a társadalmi szerződés követelményeinek forkolhatók a követelményeknek megfelelő verziókba. +Ne feledjük, hogy a jövőben valószínű, hogy az Ethereum proof-of-stake modellre vált a biztonság érdekében, és évi nulla és 0,05X közé csökken a kibocsátásra vonatkozó követelmény. Abban az esetben, ha az Ethereum szervezet elveszíti pénzeszközeit, vagy valamilyen más okból kifolyólag eltűnik, nyitva hagyunk egy „társadalmi szerződést”: mindenkinek joga van létrehozni egy jövőbeli Ethereum-verziót azzal a feltétellel, hogy az ether mennyisége legfeljebb `60102216 * (1,198 + 0,26 * n)` lehet, ahol az `n` a genezisblokk utáni évek számát jelöli. A létrehozók a proof-of-stake által hajtott kínálatnövekedés és a maximálisan engedélyezett kínálatbővülés különbségét részben vagy egészben szabadon értékesíthetik tömeges eladás (crowd-sell) formájában, illetve kioszthatják a fejlesztés költségeinek lefedésére. Azok a frissítések, amelyek nem felelnek meg a társadalmi szerződés követelményeinek, jogosan elágaztathatók a követelményeknek megfelelő verziókba. ### A bányászat centralizálása {#mining-centralization} -A Bitcoin bányászati algoritmusa úgy működik, hogy a bányászok SHA256 számításokat végeznek a blokk fejléc kissé módosított verzióin egymás után több milliószor, amíg végül egy csomópont egy olyan verzióhoz ér, amelynek hash értéke kevesebb mint a cél (jelenleg körülbelül 2192). Azonban ez a bányászati algoritmus a centralizáció két formájára sérülékeny. Először is a bányászati ökoszisztémát az ASIC-ok (alkalmazásspecifikus integrált körök), az erre a célra tervezett számítógép chipek dominálják, és ezért ezek többezerszer hatékonyabbak a Bitcoin bányászat során. Ez azt jelenti, hogy a Bitcoin bányászat már egyáltalán nem decentralizált és az egyenlőségen alapuló tér, és több millió dolláros tőkére van szükség ahhoz, hogy hatékonyan részt lehessen venni benne. Másodsorban a legtöbb Bitcoin bányász gyakorlatilag nem lokálisan validálja a blokkokat; hanem helyette egy centralizált bányász-poolra támaszkodnak a blokk fejlécek megadásakor. Ez a probléma azonban még rosszabb: a tartalom írásakor a legjobb három bányász-pool indirekt módon a feldolgozási teljesítmény körülbelül 50%-át irányítja, bár ezt némiképp enyhíti az a tény, hogy a bányászok átválthatnak egy másik pool-ra, ha a pool vagy a koalíció 51%-os támadással próbálkozik. +A Bitcoin bányászati algoritmusa úgy működik, hogy a bányászok SHA256-számításokat végeznek a blokkfejléc kissé módosított verzióin egymás után több milliószor, amíg végül egy csomópont egy verzióhoz ér, amelynek hash-értéke kisebb mint a cél (jelenleg körülbelül 2192). Azonban ez a bányászati algoritmus a centralizáció két formájával szemben sérülékeny. Először is a bányászati ökoszisztémát az ASIC-ok (alkalmazásspecifikus integrált körök) az erre a célra tervezett számítógép-chipek dominálják, és ezért ezek több ezerszer hatékonyabbak a Bitcoin-bányászat során. Ez azt jelenti, hogy a Bitcoin-bányászat már egyáltalán nem decentralizált és egyenlőségen alapuló tér, és több millió dolláros tőkére van szükség ahhoz, hogy hatékonyan részt lehessen venni benne. Másodsorban a legtöbb Bitcoin-bányász gyakorlatilag nem helyileg validálja a blokkokat; helyette egy centralizált bányászalapra támaszkodik a blokkfejlécek megadásakor. Ez a probléma azonban még rosszabb: a jelen tartalom írásakor a legjobb három bányászalap indirekt módon a feldolgozási teljesítmény körülbelül 50%-át birtokolja, bár ezt némiképp enyhíti az a tény, hogy a bányászok átválthatnak egy másik alapra, ha az alap vagy a koalíció 51%-os támadással próbálkozik. -Az Ethereumban jelenleg az a szándék, hogy olyan bányászati algoritmust használjanak, ahol a bányászoknak véletlenszerűen kell adatot lekérniük az állapotról, ki kell számítaniuk néhány random kiválasztott tranzakciót a blokklánc utolsó N blokkjáról, és vissza kell adniuk az eredmény hashjét. Ennek két fontos előnye van. Először is az Ethereum szerződésekben bármilyen számítás lehet, így egy Ethereum ASIC lényegében egy általános számításra használt ASIC - azaz egy jobb CPU. Másodszor a bányászatnak hozzá kell férnie a teljes blokklánchoz, ami arra kényszeríti a bányászokat, hogy a teljes blokkláncot tárolják, és legalább képesnek kell lenniük minden tranzakció hitelesítésére. Emiatt nincs szükség centralizált bányászati-poolokra; bár a bányászati-poolok továbbra is betöltik azt a legitim szerepet, hogy kizárják a jutalom elosztás véletlenszerűségét, ezt a funkciót egyenlően el tudják látni a peer-to-peer poolok, központi irányítás nélkül. +Az Ethereumban jelenleg az a szándék, hogy olyan bányászati algoritmust használjanak, amelyben a bányászoknak véletlenszerűen kell adatot lekérniük a státuszból, ki kell számítaniuk néhány véletlenszerűen kiválasztott tranzakciót a blokklánc utolsó N blokkjáról, és vissza kell adniuk az eredmény hash-ét. Ennek két fontos előnye van. Először is az Ethereum-szerződésekben bármilyen számítás lehet, így egy Ethereum ASIC lényegében egy általános számításra használt ASIC – azaz egy jobb CPU. Másodszor, a bányászathoz hozzá kell férni a teljes blokklánchoz, ami arra kényszeríti a bányászokat, hogy a teljes blokkláncot tárolják, és legalább képesnek kell lenniük minden tranzakció hitelesítésére. Emiatt nincs szükség centralizált bányászati alapokra; bár a bányászati alapok továbbra is betöltik azt a legitim szerepet, hogy kiegyenlítik a jutalomelosztás véletlenszerűségét – ezt a funkciót ugyanígy el tudják látni a peer-to-peer alapok központi irányítás nélkül. -Ez a modell még nincs tesztelve, és szembejöhetnek még nehézségek bizonyos okos optimalizálások elkerülése terén, amikor a szerződés futtatást bányászati algoritmusként használják. Azonban ennek az algoritmusnak egyik érdekes funkciója, hogy bárki "megmérgezheti a kutat", ha nagyszámú szerződést vezet be a blokkláncra, azért, hogy megakasszon bizonyos ASIC-okat. Az ASIC gyártók számára léteznek gazdasági ösztönzők arra, hogy ezzel a trükkel megtámadják egymást. Ezért az általunk fejlesztett megoldás végeredményben egy adaptív humán gazdasági megoldás, és nem pusztán technikai. +Ez a modell még nincs tesztelve, és szembejöhetnek még nehézségek az okos optimalizálások elkerülése okán, amikor a szerződésvégrehajtást bányászati algoritmusként használják. Azonban ennek az algoritmusnak egyik érdekes funkciója, hogy bárki „megmérgezheti a kutat”, ha nagyszámú szerződést vezet be a blokkláncra kifejezetten azért, hogy megakasszon bizonyos ASIC-okat. Az ASIC gyártók számára léteznek gazdasági ösztönzők arra, hogy ezzel a trükkel megtámadják egymást. Ezért az általunk fejlesztett megoldás végeredményben egy adaptív, gazdasági, humán megoldás, és nem pusztán technikai. ### Méretezhetőség {#scalability} -Az Ethereummal kapcsolatos gyakori aggály a méretezhetőség kérdése. A Bitcoinhoz hasonlóan az Ethereumnak megvan az a hibája, hogy a hálózatban minden csomópontnak fel kell dolgoznia a tranzakciókat. A Bitcoin esetében a jelenlegi blokklánc mérete körülbelül 15 GB, ami óránként mintegy 1 MB-vel nő. Ha a Bitcoin hálózatnak másodpercenként 2000 Visa tranzakciót kellene feldolgoznia, akkor három másodpercenként nőne 1 MB-val (1 GB óránként, 8 TB évente). Az Ethereumon is hasonló növekedési tempó figyelhető meg, amelyet még rosszabbá tesz az a tény, hogy számos alkalmazást futtatnak az Ethereum blokkláncán, szemben azzal, hogy a Bitcoin csak egy valuta, azonban javít rajta az, hogy az Ethereum teljes csomópontjainak csak az állapotot és nem a teljes blokklánc előzményt kell tárolniuk. +Az Ethereummal kapcsolatos gyakori aggály a skálázhatóság kérdése. A Bitcoinhoz hasonlóan az Ethereumnak is megvan az a hibája, hogy a hálózatban minden csomópontnak fel kell dolgoznia a tranzakciókat. A Bitcoin esetében a jelenlegi blokklánc mérete körülbelül 15 GB, ami óránként mintegy 1 MB-tal nő. Ha a Bitcoin hálózatnak másodpercenként 2000 Visa-tranzakciót kellene feldolgoznia, akkor három másodpercenként nőne 1 MB-tal (1 GB óránként, 8 TB évente). Az Ethereumon is hasonló növekedési tempó figyelhető meg, amelyet még nehezít az, hogy az Ethereum blokkláncán számos alkalmazást futtatnak, míg a Bitcoin egy valuta; ugyanakkor javítja a helyzetet, hogy az Ethereum teljes csomópontjainak csak a státuszt és nem a teljes blokkláncelőzményt kell tárolniuk. -A nagyméretű blokklánccal a centralizáció kockázata a fő probléma. Ha a blokklánc mérete mérete mondjuk 100 TB-ra nő, a legvalószínűbb forgatókönyv szerint csak nagyon kevés nagyvállalat tud majd teljes csomópontot futtatni, az összes hagyományos felhasználó pedig könnyű SPV-csomópontokat fog használni. Egy ilyen helyzetben felmerülhet a lehetséges aggály, hogy a teljes csomópontok összefoghatnak, és megállapodnak abban, hogy profitábilis módon csaljanak (például módosítsák a blokkok után járó jutalmat, vagy BTC-t adjanak maguknak). A könnyű csomópontok nem tudják ezt azonnal felismerni. Természetesen legalább egy becsületes teljes csomópont valószínűleg létezne, és a csalás kiderülése után néhány órával már a Reddit is tele lenne a hírrel, azonban ezen a ponton ez már túl késő lenne: a normál felhasználókon múlna, hogy szervezetten tiltólistára tegyék az adott blokkokat, azonban ez a koordinációs probléma jelentős és eléggé megoldhatatlan helyzetet teremtene, hasonlóan egy sikeres 50%-os támadás indításához. A Bitcoin esetében ez jelenleg probléma, de létezik rá blokklánc módosítási [javaslat Peter Todd-tól](https://web.archive.org/web/20140623061815/http://sourceforge.net/p/bitcoin/mailman/message/31709140/) amely enyhítene a problémán. +A nagyméretű blokklánccal a centralizáció kockázata a fő probléma. Ha a blokklánc mérete mérete mondjuk 100 TB-ra nő, a legvalószínűbb forgatókönyv szerint csak nagyon kevés nagyvállalat tud majd teljes csomópontot futtatni, az összes hagyományos felhasználó pedig könnyű SPV-csomópontokat fog használni. Egy ilyen helyzetben felmerülhet a lehetséges aggály, hogy a teljes csomópontok összefoghatnak, és megállapodhatnak abban, hogy profitábilis módon csaljanak (például módosítsák a blokkok után járó jutalmat, vagy BTC-t adjanak maguknak). A könnyű csomópontok nem tudják ezt azonnal felismerni. Természetesen legalább egy becsületes teljes csomópont valószínűleg létezne, és a csalás kiderülése után néhány órával már a Reddit is tele lenne a hírrel, azonban ezen a ponton már túl késő: a normál felhasználókon múlna, hogy szervezetten tiltólistára tegyék az adott blokkokat, ez a koordinációs probléma jelentős és szinte megoldhatatlan helyzetet teremt, hasonlóan egy sikeres 51%-os támadáshoz. A Bitcoin esetében ez jelenleg probléma, de létezik rá egy blokkláncmódosítási [javaslat Peter Toddtól](https://web.archive.org/web/20140623061815/http://sourceforge.net/p/bitcoin/mailman/message/31709140/), amely enyhít a problémán. -A közeljövőben az Ethereum két további stratégiát fog használni a probléma megoldására. Először a blokklánc alapú bányászati algoritmusok miatt legalább minden bányász rá lesz kényszerítve, hogy teljes csomópont legyen, ami alacsonyabb korlátot hoz létre a teljes csomópontok viszonylatában. Másodszor, és még fontosabb módon egy közbenső állapot fa gyökeret szerepeltetünk a blokkláncban a tranzakciók feldolgozása után. Még akkor is, ha a blokk validálása centralizált, addig, amíg van becsületes csomópont, a centralizációs probléma megkerülhető a protokoll validálásával. Ha egy bánász érvénytelen blokkot tesz közzé, vagy a blokk nincs megfelelően formázva, vagy az `S[n]` állapot pontatlan. Mivel az `S[0]` kódnak pontos, kell lennie egy első `S[i]` állapotnak, ami hibás ott, ahol az `S[i-1]` pontos. A hitelesítő csomópont megadja az `i` indexet egy "proof of invalidity" (érvénytelenségi bizonyíték) bizonyítékkal, ami olyan Patricia fa csomópontokból áll, amelyeknek fel kell dolgozniuk a `APPLY(S[i-1],TX[i]) -> S[i]` kifejezést. A csomópontok használni tudják ezeket a Patricia csomópontokat a számítás egy részének futtatásához, és látni fogják, ha a generált `S[i]` nem egyezik a megadott `S[i]` értékkel. +Az Ethereum két további stratégiát fog használni a probléma megoldására. Először a blokkláncalapú bányászati algoritmusok miatt legalább minden bányász rá lesz kényszerítve, hogy teljes csomópont legyen, ami alacsonyabb korlátot hoz létre a teljes csomópontok viszonylatában. Másodszor, ami még fontosabb, egy közbenső státuszfagyökeret szerepeltetünk a blokkláncban a tranzakciók feldolgozása után. Még akkor is, ha a blokk validálása centralizált, amíg van becsületes hitelesítő csomópont, a centralizációs probléma megkerülhető a protokoll validálásával. Ha egy bánász érvénytelen blokkot tesz közzé, akkor a blokk nincs megfelelően formázva, vagy az `S[n]` státusz pontatlan. Mivel az `S[0]` kód pontos, kell lennie egy első `S[i]` státusznak, amely hibás ott, ahol az `S[i-1]` pontos. A hitelesítő csomópont megadja az `i` indexet egy érvénytelenségi bizonyítékkal (proof of invalidity), amely olyan Patricia-facsomópontokból áll, amelyeknek fel kell dolgozniuk az `APPLY(S[i-1],TX[i]) -> S[i]` kifejezést. A csomópontok használni tudják ezeket a Patricia-csomópontokat a számítás egy részének futtatásához, és látni fogják, ha a generált `S[i]`nem egyezik a megadott `S[i]` értékkel. -Egy másik, kifinomultabb támadásban rosszindulatú bányászok félkész blokkokat publikálnak, így a teljes információ nem is létezik annak megállapítására, hogy a blokk érvényes-e. A megoldás egy kihívásra reagáló protokoll: a hitelesítő csomópont cél tranzakciós indexek formájában "kihívásokat" adnak ki, majd amikor visszakapnak egy csomópontot, egy könnyű csomópont mindaddig érvénytelennek tekinti a blokkot, amíg egy másik csomópont, egy bányász, vagy egy másik hitelesítő vissza nem ad Patricia csomópont készleteket igazolva az érvényességet. +Egy másik, kifinomultabb támadásban rosszindulatú bányászok félkész blokkokat publikálnak, így a teljes információ nem is létezik annak megállapítására, hogy a blokk érvényes-e. A megoldás egy kihívásra reagáló protokoll: az ellenőrző csomópontok céltranzakciós indexek formájában „kihívásokat” adnak ki, majd amikor visszakapnak egy csomópontot, egy könnyű csomópont mindaddig érvénytelennek tekinti a blokkot, amíg egy másik csomópont, egy bányász vagy egy másik hitelesítő, vissza nem ad Patricia-csomóponti alkészleteket, igazolva az érvényességet. ## Következtetés {#conclusion} -Az Ethereum protokollt eredetileg egy frissített kriptovaluta verziónak tekintették, ami haladó funkciókat is kínált, például blokkláncon lévő escrow-t, kivételi korlátokat, pénzügyi szerződéseket, szerencsejáték piacokat és hasonlókat egy nagyon általánosított programnyelven. Az Ethereum protokoll nem "támogatja" közvetlenül az alkalmazásokat, azonban a Turin-teljesség programnyelv megléte azt jelenti, hogy tetszőleges mennyiségű szerződés hozható létre bármilyen tranzakció típushoz vagy alkalmazáshoz. Még érdekesebb az Ethereummal kapcsolatban, hogy az Ethereum protokoll sokkal több puszta valutánál. A decentralizált fájl tárolással, számításokkal és kimenetelre fogadó piacokkal kapcsolatos protokollok több tucat hasonló koncepció mellett magukban rejtik a számítási ipar hatékonyságnövelésének potenciálját, és masszív lökést adnak más peer-to-peer protokolloknak egy korábban nem látott gazdasági réteg hozzáadásával. Végezetül pedig jelentős számú alkalmazás van, amely egyáltalán nem foglalkozik pénzzel. +Az Ethereum protokollt eredetileg egy frissített kriptovaluta-verziónak tekintették, amely haladó funkciókat is kínált, például blokkláncon lévő fedezetet, kivételi korlátokat, pénzügyi szerződéseket, szerencsejátékpiacokat és hasonlókat egy nagyon általánosított programnyelven. Az Ethereum-protokoll nem „támogatná” közvetlenül az alkalmazásokat, azonban a Turing-teljes programnyelv megléte azt jelenti, hogy tetszőleges mennyiségű szerződés hozható létre bármilyen tranzakciótípushoz vagy alkalmazáshoz. Még érdekesebb az Ethereummal kapcsolatban, hogy az Ethereum-protokoll sokkal több puszta valutánál. A decentralizált fájltárolással, számításokkal és hírtőzsdei piacokkal kapcsolatos protokollok a több tucat hasonló koncepció mellett magukban rejtik a számítási ipar jelentős hatékonyságnövelésének potenciálját, és masszív lökést adnak más peer-to-peer protokolloknak egy korábban nem látott gazdasági réteg hozzáadásával. Végezetül pedig jelentős számú alkalmazás van, amely egyáltalán nem foglalkozik pénzzel. -Az Ethereum protokollban implementált tetszőleges állapot átmenet függvény koncepciója egyedi potenciált rejtő platformot kínál; szemben a zártvégű, egycélú protokollokkal, amelyeket egy bizonyos típusú alkalmazásra fejlesztenek az adattárolás, pénzügy vagy szerencsejáték világában, az Ethereum egy alapvetően nyílt végű koncepció, és hiszünk abban, hogy kiválóan szolgál nagyon sok pénzügyi és nem pénzügyi protokoll alapozó rétegeként az elkövetkező években. +Az Ethereum-protokollban implementált tetszőleges státuszváltozási függvény koncepciója egyedi potenciált rejtő platformot kínál; szemben a zárt végű, egycélú protokollokkal, amelyeket egy bizonyos típusú alkalmazásra fejlesztenek az adattárolás, pénzügy vagy szerencsejáték világában, az Ethereum egy alapvetően nyílt végű koncepció, és hiszünk abban, hogy kiválóan szolgál sok pénzügyi és nem pénzügyi protokoll alaprétegeként az elkövetkező években. ## Jegyzetek és további olvasnivaló {#notes-and-further-reading} ### Jegyzetek {#notes} -1. A kifinomult olvasó észreveheti, hogy gyakorlatilag egy Bitcoin cím az elliptikus görbe nyilvános kulcs hash-e, és nem a nyilvános kulcs maga. Azonban gyakorlatilag teljesen legitim kriptográfiai terminológia a pubkey hash nyilvános kulcsként történő hivatkozása. Ez azért van, mert a Bitcoin kriptográfiáját tekinthetjük egy egyedi digitális aláírás algoritmusnak, ahol a nyilvános kulcs az ECC pubkey hashjéből áll, az aláírás az ECC pubkey és az ECC aláírás együttesen, a hitelesítő algoritmusban pedig az aláírásban lévő ECC pubkey-t a nyilvános kulcsként rendelkezésre bocsátott ECC pubkey hashhel vetik összes, majd az ECC aláírást az ECC pubkey értékével hitelesítik. -2. Gyakorlatilag a 11 előző blokk mediánja. -3. Az Ethereum protokollnak egyszerűnek és praktikusnak kell lennie, de elképzelhető, hogy viszonylag összetettnek kell lennie, például méretezhetőnek, hogy internalizálni lehessen a tárolás költségeit, a sávszélességet és I/O-t a biztonság, adatvédelem és átláthatóság stb. érdekében. Ahol a komplexitás elengedhetetlen, a dokumentációnak a lehető legegyértelműbbnek, átfogóbbnak és naprakészebbnek kell lennie, így bárki, aki nem járatos az Ethereumban meg tudja tanulni és szakértővé válhasson. -4. Lásd az Ethereum Virtuális Gépről szóló [Sárgakönyvet](https://ethereum.github.io/yellowpaper/paper.pdf) (amely hasznos specifikációkat tartalmaz, és referenciaként szolgálhat azoknak, akik a nulláról szeretnének Ethereum klienst építeni), továbbá számos témakör ismertetése is megtalálható az [Ethereum wiki oldalán](https://github.com/ethereum/wiki/wiki), például a shard- fejlesztés, fő fejlesztés, dapp fejlesztés, kutatás, Casper K&F, és hálózati protokollok. A kutatásról és a lehetséges jövőbeli implementációkról lásd: [ethresear.ch](https://ethresear.ch). -5. Ennek egy másik kifejezési módja az absztrakció. A [legfrissebb roadmap](https://ethresear.ch/t/sharding-phase-1-spec/1407/67) az absztrakt futtatás megtervezése, ahol a futtató motoroknak nem feltétlenül kell követniük egy kanonizáló specifikációt, de például testreszabható egy adott alkalmazáshoz vagy egy shard-hoz. (A futtató motorok heterogénsége nincs explicite leírva a roadmapban. Létezik heterogén sharding, amelyet Vlad Zamfir foglalt koncepcióba.) -6. Belső értelmezésben a 2 és "CHARLIE" szám, ez utóbbi big-endian bázis 256 reprezentáció. A számok 0-tól legfeljebb 2256-1-ig terjedhetnek. +1. A kifinomult olvasó észreveheti, hogy gyakorlatilag egy Bitcoin cím az elliptikus görbe nyilvános kulcs hash-e, és nem a nyilvános kulcs maga. Azonban gyakorlatilag teljesen legitim kriptográfiai terminológia a pubkey hash nyilvános kulcsként történő hivatkozása. Ez azért van, mert a Bitcoin kriptográfiáját tekinthetjük egy egyedi digitális aláírásalgoritmusnak, ahol a nyilvános kulcs az ECC pubkey hashéből áll, az aláírás az ECC pubkey és az ECC aláírás együttesen, a hitelesítő algoritmusban pedig az aláírásban lévő ECC pubkey-t a nyilvános kulcsként rendelkezésre bocsátott ECC pubkey hash-sel vetik összes, majd az ECC aláírást az ECC pubkey értékével hitelesítik. +2. Gyakorlatilag a 11 előző blokk mediánja. +3. Belső értelmezésben a 2 és „CHARLIE” szám, ez utóbbi nagy-endian bázis 256 reprezentáció. A számok 0-tól legfeljebb 2256-1-ig terjedhetnek. ### További olvasnivaló {#further-reading} -1. [Valódi érték](http://bitcoinmagazine.com/8640/an-exploration-of-intrinsic-value-what-it-is-why-bitcoin-doesnt-have-it-and-why-bitcoin-does-have-it/) -2. [Okos-tulajdonság](https://en.bitcoin.it/wiki/Smart_Property) -3. [Okosszerződések](https://en.bitcoin.it/wiki/Contracts) -4. [B-pénz](http://www.weidai.com/bmoney.txt) -5. [Újrahasznosítható proof-of-work](http://www.finney.org/~hal/rpow/) -6. [Biztonságos tulajdonság címek tulajdonosi rendelkezéssel](http://szabo.best.vwh.net/securetitle.html) -7. [Bitcoin fehérkönyv](http://bitcoin.org/bitcoin.pdf) -8. [Namecoin](https://namecoin.org/) -9. [Zooko háromszög](https://wikipedia.org/wiki/Zooko's_triangle) +1. [Valódi érték](http://bitcoinmagazine.com/8640/an-exploration-of-intrinsic-value-what-it-is-why-bitcoin-doesnt-have-it-and-why-bitcoin-does-have-it/) +2. [Okos tulajdonság](https://en.bitcoin.it/wiki/Smart_Property) +3. [Okosszerződések](https://en.bitcoin.it/wiki/Contracts) +4. [B-pénz](http://www.weidai.com/bmoney.txt) +5. [Újrahasznosítható proof-of-work](https://nakamotoinstitute.org/finney/rpow/) +6. [Biztonságos tulajdonságcímek tulajdonosi rendelkezéssel](https://nakamotoinstitute.org/secure-property-titles/) +7. [Bitcoin fehérkönyv](http://bitcoin.org/bitcoin.pdf) +8. [Namecoin](https://namecoin.org/) +9. [Zooko-háromszög](https://wikipedia.org/wiki/Zooko's_triangle) 10. [Colored coins fehérkönyv](https://docs.google.com/a/buterin.com/document/d/1AnkP_cVZTCMLIzw4DvsW6M8Q2JC0lIzrTLuoWu2z1BE/edit) 11. [Mastercoin fehérkönyv](https://github.com/mastercoin-MSC/spec) 12. [Decentralizált autonóm vállalatok, Bitcoin Magazine](http://bitcoinmagazine.com/7050/bootstrapping-a-decentralized-autonomous-corporation-part-i/) -13. [Egyszerűsített fizetés hitelesítés](https://en.bitcoin.it/wiki/Scalability#Simplifiedpaymentverification) -14. [Merkle fák](https://wikipedia.org/wiki/Merkle_tree) -15. [Patricia fák](https://wikipedia.org/wiki/Patricia_tree) +13. [Egyszerűsített fizetéshitelesítés](https://en.bitcoin.it/wiki/Scalability#Simplified_payment_verification) +14. [Merkle-fák](https://wikipedia.org/wiki/Merkle_tree) +15. [Patricia-fák](https://wikipedia.org/wiki/Patricia_tree) 16. [GHOST](https://eprint.iacr.org/2013/881.pdf) 17. [StorJ és Autonóm ügynökök, Jeff Garzik](http://garzikrants.blogspot.ca/2013/01/storj-and-bitcoin-autonomous-agents.html) -18. [Mike Hearn az Okos tulajdonságokról a Turing Fesztiválon](http://www.youtube.com/watch?v=Pu4PAMFPo5Y) +18. [Mike Hearn az Okos tulajdonságokról a Turing Fesztiválon](https://www.youtube.com/watch?v=MVyv4t0OKe4) 19. [Ethereum RLP](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP) -20. [Ethereum Merkle Patricia fák](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-Patricia-Tree) -21. [Peter Todd a Merkle összeg fákról](http://sourceforge.net/p/bitcoin/mailman/message/31709140/) +20. [Ethereum Merkle-Patricia-fák](https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-Patricia-Tree) +21. [Peter Todd a Merkle-összegfákról](https://web.archive.org/web/20140623061815/http://sourceforge.net/p/bitcoin/mailman/message/31709140/) -_A fehérkönyv történetéről lásd: https://github.com/ethereum/wiki/blob/old-before-deleting-all-files-go-to-wiki-wiki-instead/old-whitepaper-for-historical-reference.md_ +_A fehérkönyv történetét tekintse meg ezen [a wiki](https://github.com/ethereum/wiki/blob/old-before-deleting-all-files-go-to-wiki-wiki-instead/old-whitepaper-for-historical-reference.md) oldalon._ -_Az Ethereum sok másik közösség által vezetett, nyílt forráskódú szoftver projekthez hasonlóan, a kezdeti elindulás óta fejlődött. Ha többet szeretnél megtudni az Ethereum legutóbbi fejlesztéseiről és az általunk elvégzett protokoll változtatásokról, akkor ezt az [útmutatót](/learn/) ajánljuk._ +_Az Ethereum, hasonlóan sok más közösség által vezetett, nyílt forráskódú szoftverprojekthez, a kezdeti elindulás óta sokat fejlődött. Ha többet szeretnél megtudni az Ethereum legutóbbi fejlesztéseiről és az általunk elvégzett protokollváltoztatásokról, akkor ezt az [útmutatót](/learn/) ajánljuk._ diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md index 5eb4f08e938..5d32213258b 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -43,7 +43,7 @@ Para conhecer ainda mais a rentabilidade da mineração, use uma calculadora de O seguinte fornece uma visão geral de como as transações foram mineradas na prova de trabalho Ethereum. Uma descrição análoga deste processo para a prova de participação Ethereum pode ser encontrada [aqui](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [ conta ](/developers/docs/accounts/). +1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [conta](/developers/docs/accounts/). 2. O usuário transmite a solicitação de transação para toda a rede Ethereum de algum [nó](/developers/docs/nodes-and-clients/). 3. Ao ouvir tomar conhecimento da nova solicitação de transação, cada nó na rede Ethereum adiciona a solicitação ao seu mempool local, uma lista de todas as solicitações de transação sobre as quais eles têm conhecimento que ainda não foram confirmadas na blockchain em um bloco. 4. Em algum ponto, um nó de mineração agrega várias dezenas ou centenas de solicitações de transação a um [bloco](/developers/docs/blocks/) potencial, de uma forma que maximiza as [taxas de transação](/developers/docs/gas/) que eles ganham enquanto ainda estão abaixo do limite de gás de bloco. Então, o nó de mineração: diff --git a/src/intl/hu/common.json b/src/intl/hu/common.json index c7470004b58..1b186ca91bf 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "Hasznosnak találta az útmutatót?", "feedback-widget-thank-you-title": "Köszönjük a visszajelzést!", "feedback-widget-thank-you-subtitle": "Tedd jobbá ezt az oldalt egy pár kérdés megválaszolásával.", - "feedback-widget-thank-you-subtitle-ext": "Ha segítségre van szüksége, akkor a Discordunkon veheti fel a kapcsolatot közösségünkkel.", + "feedback-widget-thank-you-subtitle-ext": "Ha segítségre van szüksége, akkor a Discordunkon veheti fel a kapcsolatot közösségünkkel.", "feedback-widget-thank-you-timing": "2–3 perc", "feedback-widget-thank-you-cta": "Rövid kérdőív megnyitása", "find-wallet": "Tárca keresése", diff --git a/src/intl/hu/glossary.json b/src/intl/hu/glossary.json new file mode 100644 index 00000000000..2f28d06c97b --- /dev/null +++ b/src/intl/hu/glossary.json @@ -0,0 +1,344 @@ +{ + "51%-attack-term": "51%-os támadás", + "51%-attack-definition": "Egy olyan támadás a decentralizált hálózaton, ahol a csoport irányítást szerez a csomópontok többsége felett. Ezáltal képesek meghamisítani a blokkláncot azáltal, hogy visszafordítanak tranzakciókat és többször elköltik ugyanazt az ethert és más tokeneket.", + "account-term": "Számla", + "account-definition": "Egy olyan objektum, ami tartalmaz egy címet, egyenleget, egy nonce-t, valamint opcionális tárhelyet és kódot. Egy számla lehet szerződésszámla vagy egy külső tulajdonú számla (EOA).

    Bővebben az Ethereum számlákról.", + "address-term": "Cím", + "address-definition": "Általánosságben egy külső tulajdonú számlát (EOA) vagy egy szerződésszámlát képvisel, ami képes fogadni (cél cím) vagy küldeni (forrás cím) tranzakciókat a blokkláncon. Specifikusabban egy elliptikus görbe digitális aláírás algoritmust használó (ECDSA) publikus kulcs Keccak hash-ének 160 bite.", + "abi-term": "Alkalmazás bináris interfész (ABI)", + "abi-definition": "A szerződésekkel való interakció sztenderd módja az Ethereum ökoszisztémában, a blokkláncon kívüli és a szerződések közötti kapcsolat esetében is. Bővebben az ABI-ról.", + "api-term": "Alkalmazás programozási felület (API)", + "api-definition": "Az Alkalmazás programozási felület (API) definíciók kötege arról, hogyan lehet használni egy szoftverrészt. Az API az alkalmazás és a webszerver között helyezkedik el, s az ezek közötti adatátadást teszi lehetővé.", + "asic-term": "ASIC", + "asic-definition": "Alkalmazásspecifikus intergált körök. Ez általában egy integrált körre vonatkozik, mely személyre szabottan készült a kriptovaluta bányászatához.", + "assert-term": "asset", + "assert-definition": "A Solidity programozási nyelvben az assert(false) a „0xfe” érvénytelen operációs kódra lesz átfordítva, ami felhasználja az összes maradék gázt és visszafordítja a változtatásokat. Amikor egy assert() parancs hibára fut, akkor valami nagyon rossz és váratlan történik, és a fejlesztőknek meg kell javítaniuk a kódot. Az assert() parancsot arra kell használni a programban, hogy sohe ne történhessenek meg bizonyos események. Bővebben az okosszerződésbiztonságról.", + "attestation-term": "Tanúsítás", + "attestation-definition": "Egy entitás állítása arról, hogy valami igaz. Az Ethereum kontextusában a konszenzusvalidátorok egy állítást tesznek arról, hogy mi a lánc státusza. Előre meghatározott időben minden egyes validátor felel azért, hogy tanúsításokat adjon, ami hivatalosan igazolja, hogy ő mit lát a láncon, beleértve a legutóbbi befejezett ellenőrzési pontot és a lánc aktuális elejét. Bővebben a tanúsításokról.", + "base-fee-term": "Alapdíj", + "base-fee-definition": "Minden blokknak vagy egy alapvető ára, az alapdíj. Ez az a minimális gázdíj, amit a felhasználó azért fizet, hogy a tranzakciója bekerülhessen a következő blokkba. Bővebben a gázról és a díjakról.", + "beacon-chain-term": "Beacon lánc", + "beacon-chain-definition": "A Beacon lánc az a blokklánc volt, ami bevezette a proof-of-stake (letéti igazolás) mechanizmusát és a validátorokat az Ethereumra. Egyszerre futott a proof-of-work (munkaigazolás) mechnizmuson alapuló Ethereum főhálózattal 2020. decembertől addig, amíg a két lánc össze nem olvadst 2022. szeptemberben, ezzel kialakítva a mai Ethereumot. Bővebben a Beacon láncról.", + "big-endian-term": "Nagy a végén (Big-endian)", + "big-endian-definition": "Pozíciós számábrázolás, ahol a legfontosabb számjegy az első a memóriában. Ennek ellentéte a kicsi a végén (little-endian), ahol a legkevésbé fontos számjegy az első.", + "block-term": "Blokk", + "block-definition": "A blokk az információ összekötegelt egysgése, amely a tranzakciók listáját és konszenzussal kapcsolatos információkat tartalmaz. A blokkokat a proof-of-stake (letéti igazolás) alapú validátorok javasolják, majd megosztják azt a teljes közvetítő nélküli (peer-to-peer) hálózattal, ahol könnyen ellenőrizhetik azt független csomópontok (node). A konszenzusszabályok irányítják, hogy egy blokk tartalma mitől lesz érvényes, s az érvénytelen blokkokat kizárják a hálózatból. Ezen blokkok sorrendje és a bennük lévő tranzakciók az események meghatározott láncát alkotják, mely a végén a hálózat jelenlegi státuszát mutatja. Bővebben a blokkokról.", + "block-explorer-term": "Block explorer", + "block-explorer-definition": "Egy interfész, ami lehetővé teszi a felhasználóknak, hogy információt szerezzenek a blokkláncból és a blokkláncról. Ezek lehetnek egyéni tranzakciók, bizonyos címekre vonatkozó tevékenységek és a hálózatra vonatkozó adatok.", + "block-header-term": "Blokkfejléc", + "block-header-definition": "A blokkfejléc a blokkról szóló metaadatok gyűjteménye és a végrehajtási csomagba bekerült tranzakciók összegzése.", + "block-propagation-term": "Blokkelőterjesztés", + "block-propagation-definition": "Az a folyamat, amikor egy kialakított blokkot elküldenek a hálózat összes többi csomópontjának.", + "block-proposer-term": "Blokkelőterjesztő", + "block-proposer-definition": "Egy adott validátor, akit kiválasztottak a blokk előterjesztésére egy meghatározott slotban.", + "block-reward-term": "Blokkjutalom", + "block-reward-definition": "Egy adott mennyiségű ether, melyet a blokk előterjesztője kap egy új, érvényes blokkért.", + "block-status-term": "Blokkstátusz/állapot", + "block-status-definition": "A blokk lehetséges státuszai vagy állapotai. Ezek lehetnek:

    • javasolt: a blokkot előterjesztette egy validátor
    • betervezett: a validátorok éppen előterjesztik az adatot
    • kihagyott/átugrott: az előterjesztő nem javasolt blokkot a rendelkezésre álló időben
    • elárvult: a blokkot kiszervezte az elágazásválasztás algoritmusa
    ", + "block-time-term": "Blokk idő", + "block-time-definition": "Az az időintervallum, ami a blokklánchoz adódó blokkok között van.", + "block-validation-term": "Blokkvalidáció", + "block-validation-definition": "Az az ellenőrzési folyamat, hogy az új blokk érvényes tranzakciókat és aláírásokat tartalmaz, a legmérvadóbb historikus láncra épül, s követi az összes konszenzusszabályt. Az érvényes blokkokat a hozzáillesztik a lánchoz és így küldik szét a hálózaton. Az érvényteleneket kizárják.", + "blockchain-term": "Blokklánc", + "blockchain-definition": "Blokkok sorozata, ahol minden egyed blokk az azt megelőzőhöz kapcsolódik egészen a genezis blokkig azáltal, hogy meghivatkozza az előző blokk hash-ét. A blokklánc integritását kriptogazdaságilag biztosítják a proof-of-stake-en (letéti igazolás) alapuló konszenzusmechanizmus által. Mi az a blokklánc?", + "bootnode-term": "Betöltő csomópont (Bootnode)", + "bootnode-definition": "Az a csomópont, amelyet egy csomópont futtatásánál arra használnak, hogy felfedezze a többi csomópontot a hálózatban. Ezen csomópontoknak a végpontjai rögzítve vannak az Ethereum forráskódjában.", + "bytecode-term": "Bájtkód", + "bytecode-definition": "Egy absztrakt parancskészlet, melyet arra terveztek, hogy egy szoftverfordító vagy egy virtuális gép hatékonyan végre tudja azt hajtani. Az ember által olvasható forráskódokhoz képest a bájtkód számokkal fejeződik ki.", + "byzantium-fork-term": "Byzantium elágazás", + "byzantium-fork-definition": "A két végleges elágazás (hard fork) egyike, amely a Metropolis fejlesztési szintre vonatkozott. Beletartozott az EIP-649 Metropolis nehézségi bomba (Difficulty Bomb) késleltetés és blokkjutalom csökkentés, amikor a jégkorszakot elhalasztották 1 évvel és a blokkjutalom 5 etherről 3-ra változott.", + "casper-ffg-term": "Casper FFG", + "casper-ffg-definition": "A Casper-FFG egy proof-of-stake (letéti igazolás) konszenzusprotokol, melyet együtt használnak az LMD-GHOST elágazásválasztási algoritmussal, hogy a konszenzuskliensek megegyezésre jussanak a Beacon lánc elejét illetően.", + "checkpoint-term": "Ellenőrzési pont", + "checkpoint-definition": "A Beacon lánc egy olyan ütem szerint működik, mely slotokra (12 másodperc) és korszakokra/epoch-okra (32 slot) van felosztva. Minden korszak első slotja egy ellenőrzési pont. Amikor a validátorok túlnyomó többsége tanúsítja a két ellenőrzési pont közötti kapcsolatot, akkor ezek érvényesíthetőek, és amikor egy újabb ellenőrzési pont lesz érvényesítve ezek után, akkor ezeket véglegesíteni lehet.", + "compiling-term": "Átfordítás", + "compiling-definition": "Egy magas szintű nyelvben (mint amilyen a Solidity) írt kód átkonvertálása egy alacsonyabb szintű nyelvre (mint amilyen az EVM bájtkód). Bővebben az okosszerződések átfordításáról", + "committee-term": "Bizottság", + "committee-definition": "A validátorok legalább 128 tagot számláló csoportja, amely a blokkvalidálást végzi egy-egy slotban. Az egyik validátor lesz az az aggregátor, aki a bizottság összes validátorának aláírását, akik pozitív módon tanúsították a blokkot, össze kell gyűjtse. Ne tévesszük össze a szinkronizálási bizottsággal.", + "computational-infeasibility-term": "Számítási megvalósíthatatlanság", + "computational-infeasibility-definition": "Egy folyamat számításilag nem lehetséges, ha olyan hosszú ideig (például évmilliárdokig) kellene annak futtatnia, akit esetleg érdekelhet ennek elvégzése.", + "consensus-term": "Konszenzus", + "consensus-definition": "Amikor a hálózaton lévő csomópontok túlnyomó többsége ugyanazokat a blokkokat tárolja a lokálisan validált, legjobb blokkláncként. Ne tévesszük össze a konszenzusszabályokkal.", + "consensus-client-term": "Konszenzuskliens", + "consensus-client-definition": "A konszenzuskliensek (mint amilyen a Prysm, Teku, Nimbus, Lighthouse, Lodestar) futtatják az Ethereum proof-of-stake (letéti igazolás alapú) konszenzusalgoritmusát, melynek révén a hálózat képes megegyezésre jutni a Beacon lánc elejét illetően. A konszenzuskliensek nem vesznek részt a tranzakciók validálásában/elterjesztésében vagy a státuszváltások végrehajtásában. Ezt a végrehajtási kliensek végzik.", + "consensus-layer-term": "Konszenzusréteg", + "consensus-layer-definition": "Az Ethereum konszenzusrétege a konszenzuskliensek hálózata.", + "consensus-rules-term": "Konszenzusszabályok", + "consensus-rules-definition": "A blokkvalidációs szabályok, melyeket a teljes csomópontok követnek, hogy konszenzusban maradjanak a többi csomóponttal. Ne tévesszük össze magával a konszenzussal.", + "cfi-term": "Bevezetését megfontolták (CFI)", + "cfi-definition": "Egy olyan központi Ethereum fejlesztési javaslat (EIP), amely még nem elérhető a főhálózaton, de a kliensfejlesztők általában pozitívan állnak hozzá az adott elképzeléshez. Ha teljesíti a főhálózatra való bekerülés összes kritériumát, akkor talán egy hálózatfrissítéssel (nem feltétlen a következővel) elérhetővé válik.", + "constantinople-fork-term": "Constantinople elágazás", + "constantinople-fork-definition": "A Metropolis szakasz második része, melyet eredetileg 2018-tól terveztek. Ebben egy olyan megoldásra terveztek áttérni, ami egy hibrid proof-of-work (munkaigazolás)/proof-of-stake (letéti igazolás) konszenzusalgoritmus, több más változással együtt.", + "contract-account-term": "Szerződéses számla", + "contract-account-definition": "Egy számla, mely kódot tartalmaz, mely lefut, amikor kap egy tranzakciót egy másik számlától (külső tulajdonú számla (EOA) vagy szerződéses).", + "contract-creation-transaction-term": "Szerződéslétrehozó tranzakció", + "contract-creation-transaction-definition": "Egy speciális tranzakció, ami egy szerződés létrehozókódját tartalmazza. A fogadó nullára van állítva és a szerződés telepítésre kerül egy olyan címre, amit a felhasználó címe és egy nonce ad ki. Arra használják, hogy regisztráljanak egy szerződést és rögzítsék azt az Ethereum blokkláncon.", + "cryptoeconomics-term": "Kriptogazdaságtan", + "cryptoeconomics-definition": "A kriptovaluták gazdaságtana.", + "doge-d-term": "Đ", + "doge-d-definition": "Đ (egy D egy vonással) betű a régi angol, középangol, izlandi és feröeri nyelvek része, ahol a nagy betűs „Eth”-t jelent. Olyan szavakban használják, mint ĐEV (fejlesztés) vagy Đapp (decentralizált alkalmazás), ahol a Đ az északi “eth” betű. Emellett a Dogecoin kriptovaluta szimbólumának is használták. A használata a régi Ethereum szakirodalomban jellemző, de ma már kevésbé elterjedt.", + "dag-term": "DAG", + "dag-definition": "A DAG az irányított aciklikus gráf (Directed Acyclic Graph) rövidítése. Ez egy olyan adatstruktúra, amely csomópontokból és az azok közötti kapcsolatokból áll össze. Az egybeolvadás (Merge) előtt az Ethereum egy ilyet használt a proof-of-work algoritmusban, az Ethash-t, de ez többé már nem szükséges a proof-of-stake mechanizmusnál.", + "dapp-term": "Dapp", + "dapp-definition": "Decentralizált alkalmazás. Minimum egy okosszerződésből és egy webes felhasználói interfészből áll. Általában egy webes alkalmazás, ami egy nyílt, decentralizált, közvetítő nélküli (peer-to-peer) infrastruktúraszolgáltatásra épül. Emellett számos dapp tartalmaz decentralizált tárhelyet és/vagy üzenetküldési protokollt és platformot.Bevezetés a dappokba", + "data-availability-term": "Adatelérhetőség", + "data-availability-definition": "A státusz tulajdonsága, hogy a hálózathoz kapcsolódó bármelyik csomópont le tudja tölteni a státusz bármelyik specifikus részét.", + "decentralization-term": "Decentralizáció", + "decentralization-definition": "Az a koncepció, hogy a folyamatosk irányítását és végrehajtását ne egy központi entitás végezze.", + "dao-term": "Decentralizált autonóm szervezetek (DAO-k)", + "dao-definition": "Egy vállalat vagy más szervezet, ami hierarchikus irányítás nélkül működik. A DAO utalhat a „The DAO” nevű szerződésre is, melyet 2016 április 30-án indítottak, és 2016 júniusában meghackeltek; ez végül erősen motiválta a végleges elágazást (hard fork) DAO kódnéven az 1.192.000. blokkban, mely visszaállította a meghackelt DAO szerződést és az Ethereum és az Ethereum Classic szétválását okozta két rivális rendszerré. Bővebben a decentralizált autonóm szervezetekről (DAO-k)", + "dex-term": "Decentralizált tőzsde (DEX)", + "dex-definition": "Egy fajta decentralizált alkalmazás (dapp), amellyel tokeneket lehet átváltani a hálózaton lévő társakkal. A használatukhoz szükség van etherre (a tranzakciós díjak kifizetésére), de nincsenek kitéve a földrajzi megszorításoknak, mint a centralizált tőzsdék – bárki használhatja őket.", + "deposit-contract-term": "Letéti szerződés", + "deposit-contract-definition": "Az Ethereumon való letétbe helyezés alapja. Ez egy olyan okosszerződés az Ethereumon, ami ETH letétet fogad el és kezeli a validátorok egyenlegeit. A validátort nem lehet addig aktiválni, amíg ebbe a szerződésbe nem kötötte le a kellő ETH összeget. A szerződésnek ETH és bemenő adatok kellenek. Utóbbi a validátor publikus kulcsa és a kivétel publikus kulcsa, melyet a validátor privát kulcsa ír alá. Ezekre szükség van ahhoz, hogy egy validátort beazonosítson és jóváhagyjon egy proof-of-stake hálózat.", + "defi-term": "DeFi", + "defi-definition": "A decentralizált pénzügyek (DeFi) a dappok széles kategóriája, melyek célkitűzése blokklánc alapú pénzügyi szolgáltatások biztosítása köztes szereplők nélkül, így bárki részt vehet benne, aki internetkapcsolattal rendelkezik. Bővebben a decentralizált pénzügyekről (DeFi)", + "difficulty-term": "Nehézség", + "difficulty-definition": "Egy hálózati szintű beállítás a proof-of-work hálózatoknál, mely azt irányítja, hogy átlagosan mennyi számítás szükséges egy érvényes nonce megtalálásához. A nehézséget a kezdő nullák száma mutatja, melyekre a blokk-hash-ben van szükség, hogy az érvényes legyen. Ezt a koncepciót kivezették, amikor az Ethereum átállt a proof-of-stake mechanizmusra.", + "difficulty-bomb-term": "Nehézség bomba", + "difficulty-bomb-definition": "A proof-of-work nehézség tervezett exponenciális megnövelése, hogy ezzel motiválják a proof-of-stake-re történő átállást, és csökkentsék az elágazás valószínűségét. A nehézség bombát a beolvadás (Merge) érvénytelenítette.", + "digital-signatures-term": "Digitális aláírás", + "digital-signatures-definition": "Egy rövid adatsor, melyet egy felhasználó hoz létre egy dokumentumhoz egy privát kulcs használatával úgy, hogy bárki a hozzátartozó publikus kulccsal, az aláírással és a dokumentummal hitelesíteni tudja, hogy (1) a dokumentumot „aláírta” a bizonyos privát kulcs tulajdonosa, és (2) a dokumentum nem változott miután aláírták.", + "discovery-term": "Felfedezés", + "discovery-definition": "Az a folyamat, mellyel az Ethereum csomópontok megtalálják a többi csomópontot, hogy azokkal kapcsolódjanak.", + "distributed-hash-table-term": "Megosztott hash-tábla (DHT)", + "distributed-hash-table-definition": "Adatstruktúra, mely (kulcs, érték) párokat használ, az Ethereum csomópontok ezzel azonosítják be a társaikat, akikkel kapcsolódnak és hogy milyen protokollon kommunikáljanak.", + "double-spend-term": "Dupla költés", + "double-spend-definition": "Szándékos blokkláncelágazás, amikor egy felhasználó kellően nagy mennyiségű bányászati erővel/letéttel rendelkezik, egy olyan tranzakciót küld, mellyel a láncon kívülre mozgat valamennyi valutát (például fiat pénzbe teszi vagy láncon kívüli vásárlást végez), majd átrendezi a blokkláncot, hogy eltávolítsa a tranzakciót. Egy sikeres duplaköltés után a támadónek a láncon és a láncon kívül is megmarad ugyanaz az eszköze.", + "ecdsa-term": "Elliptikus görbe digitális aláírás algoritmus (ECDSA)", + "ecdsa-definition": "Egy kriptográfiai algoritmus, melyet az Ethereum arra használ, hogy a pénzügyi eszközöket csak azok tulajdonosai tudják elkölteni. Ez a publikus és privát kulcsok előállításának preferált módja. A számlacím létrehozáshoz és a tranzakció ellenőrzéshez szükséges.", + "encryption-term": "Titkosítás", + "encryption-definition": "A titkosítás az elektronikus adat átalakítása egy olyan formába, mely nem olvasható senkinek, kivéve annak, aki rendelkezik a megfelelő visszafejtő kulccsal.", + "entropy-term": "Entrópia", + "entropy-definition": "A kriptográfia kontextusában az előrejelezhetőség hiánya vagy véletlenszerűség. Amikor titkos információkat generálunk, mint a privát kulcsok, az algoritmusok általában egy magas entrópiaforrásra támaszkodnak, hogy biztosítsák a kimenet megjósolhatatlanságát.", + "epoch-term": "Korszak", + "epoch-definition": "Egy 32 slot-ból álló periódus, melyben minden slot 12 másodperc, összességében 6,4 perc. A validátorbizottságokat megváltoztatják minden korszakban biztonsági okokból. Minden korszakban lehetőség van arra, hogy a lánc véglegesedjen. Minden korszak elejént a validátorokhoz új felelősségeket rendelnek. Bővebben a proof-of-stake-ről", + "equivocation-term": "Kétértelműség", + "equivocation-definition": "A validátor két egymásnak ellentmondó üzenetet küld. Egyszerű példa rá, amikor a tranzakció küldője két tranzakciót küld ugyanazzal a nonce-szal. Vagy amikor a blockelőterjesztője két blokkot javasol ugyanakkor a blokkméretre (vagy ugyanarra a slotra).", + "eth1-term": "Eth1", + "eth1-definition": "Az „Eth1” kifejezés az Ethereum főhálózatára vonatkozott, a proof-of-work blokkláncra. Ezt ma már végrehajtási rétegnek nevezik. Tudjon meg többet errről a változásról.", + "eth2-term": "Eth2", + "eth2-definition": "Az „Eth2” kifejezés az Ethereum protokoll több frissítésére vonatkozott, beleértve a proof-of-stake mechanizmusra való átállást is. Ezt ma már konszenzusrétegnek nevezik. Tudjon meg többet errről a változásról.", + "eip-term": "Ethereum fejlesztési javaslat (EIP)", + "eip-definition": "Tervezési dokumentum, amely információkat nyújt az Ethereum közösség számára, és ismerteti a javasolt új funkciókat, annak folyamatait vagy környezetét (lásd ERC). Bevezetés az EIP-ekbe", + "ens-term": "Ethereum Name Service (ENS)", + "ens-definition": "Az ENS jegyzék egy központi szerződés, mely a domain nevek alapján megadja a tulajdonosokat és a megoldókat, ahogy EIP-137-ben le van írva. Tudjon meg többet az ens.domains oldalon", + "execution-client-term": "Végrehajtási kliens", + "execution-client-definition": "A végrehajtási kliensek (korábban Eth1 kliensek), mint amilyen a Besu, Erigon, Go-Ethereum (Geth), Nethermind, a tranzakciók feldolgozását és elterjesztését végzik, s kezelik az Ethereum státuszát. Lefuttatják az összes tranzakcióra a számítást az Ethereum virtális gépet használva, hogy biztosítsák a protokoll szabályainak követését.", + "execution-layer-term": "Végrehajtási réteg", + "execution-layer-definition": "Az Ethereum végrehajtási rétege a végrehajtási kliensek hálózata.", + "eoa-term": "Külső tulajdonú számlák (EOA)", + "eoa-definition": "A külső tulajdonú számlák (EOA) olyan számlák, amelyeket privát kulcsokkal kontrollálnak, melyeket általában egy kulcsmondatból generálnak. Az okosszerződésekkel ellentében a külső tulajdonú számlákhoz nem tartozik semmilyen programkód. Ezeket általában a tárcák segítségével kezelik.", + "erc-term": "Ethereum Request for Comments (ERC)", + "erc-definition": "Néhány EIP-hez tartozó címke, melyek specifikus Ethereum használati szabványokat definiálnak.", + "ethash-term": "Ethash", + "ethash-definition": "Egy proof-of-work algoritmus, amelyet az Ethereumon használtak a proof-of-stake mechanizmusra való áttérés előtt. Tudjon meg többet", + "ether-term": "Ether", + "ether-definition": "Az Ethereum ökoszisztéma natív kriptovalutája, mely a tranzakciók végrehajtásához szükséges gázdíjak kifizetésére szolgál. Írható még a következő módokon: ETH, Ξ szimbólum, a görög Xi jele. Bővebben az etherről.", + "events-term": "Események", + "events-definition": "Az EVM naplózási lehetőségekhez szükséges. A dappok felismerik az eseményeket és JavaScript callback-ek elindítására használják azokat a felhasználói interfészen. Bővebben az eseményekről és a naplózásról", + "evm-term": "Ethereum virtuális gép (EVM)", + "evm-definition": "Egy stack-alapú virtuális gép, ami bájtkódot hajt végre. Az Ethereumon a végrehajtási modell adja meg, hogy a rendszerstátusz hogyan változik, figyelembe véve a bájtkód utasítások sorozatát és egy kis tuple környezeti adatot. Ezt a virtuális státuszgép formális modelljén keresztül specifikálják. Bővebben az Ethereum virtuális gépről.", + "evm-assembly-language-term": "EVM assembly nyelv", + "evm-assembly-language-definition": "Az EVM bájtkód emberek számára is olvasható változata.", + "fallback-function-term": "Fallback függvény", + "fallback-function-definition": "Egy alapfüggvény, mely adat vagy deklarált függvény név hiánya esetén hívódik meg.", + "faucet-term": "Faucet (csap)", + "faucet-definition": "Egy okosszerződés által működtetett szolgáltatás, mely javakat bocsájt ki ingyenes teszt ether formájában, melyet a tesztneten lehet használni.", + "finality-term": "Véglegesség", + "finality-definition": "A véglegesség egy biztosíték arra, hogy a tranzakciók kötege egy adott idő előtt nem fognak megváltozni és nem lehet azokat visszafordítani. Bővebben a proof-of-stake véglegességről.", + "finney-term": "Finney", + "finney-definition": "Az ether denominációja. 1 finney = 1015 wei. 103 finney = 1 ether.", + "fork-term": "Elágazás", + "fork-definition": "Egy protokoll változtatás, mely egy alternatív lánc létrejöttét vonja magával, vagy egy átmeneti eltérés két potenciális blokkútvonal között.", + "fork-choice-algorithm-term": "Elágazásválasztási algoritmus", + "fork-choice-algorithm-definition": "Az az algoritmus, ami beazonosítja a blokklánc elejét. A végrehajtási rétegen a lánc feje az, amelyikhez a legnagyobb nehézség tartozik. Ez azt jelenti, hogy a lánc valódi feje az, amelyiket a legnagyobb munkával bányászták ki. A konszenzusrétegen az algoritmus a validátorok tanúsításainak összességét vizsgálja (LMD_GHOST).", + "fraud-proof-term": "Fraud proof (csalási bizonyítás)", + "fraud-proof-definition": "Egy biztonsági modell egy bizonyos második blokkláncréteg (L2) megoldáshoz, ahol a sebesség meggyorsítása érdekében a tranzakciókat összecsomagolják kötegekbe és beküldik az Ethereumra egyetlen tranzakcióban. Ezekről azt feltételezik, hogy érvényesek, de meg lehet azokat kérdőjelezni, ha csalás történt. Ez a módszer növeli a tranzakciók mennyiségét, miközben fenntartja a biztonságot. Néhány rollup érvényességi bizonyítékokat használ. Bővebben az optimista rollupokról.", + "frontier-term": "Frontier", + "frontier-definition": "Az Ethereum kezdeti teszt fejlesztési fázisa, mely 2015 júliusától 2016 márciusáig tartott.", + "gas-term": "Üzemanyag", + "gas-definition": "Egy virtuális üzemanyag, melyet az Ethereumon használnak az okosszerződések végrehajtására. Az EVM egy kalkulációs mechanizmust használ, hogy mérje a gázfogyasztást és behatárolja a számítási kapacitás felhasználását (tekintse meg a Turing teljes szócikket). Bővebben a gázról és a díjakról.", + "gas-limit-term": "Gázhatár", + "gas-limit-definition": "A gáz maximális mennyisége, melyet egy tranzakció vagy egy blokk elfogyaszthat.", + "gas-price-term": "Gázár", + "gas-price-definition": "Etherben kifejezett ára az egységnyi gáznak, melyet a tranzakcióban határoznak meg.", + "genesis-block-term": "Genezisblokk", + "genesis-block-definition": "Egy blokklánc első blokkja, amit egy adott hálózat és a kriptovalutája elindítására használnak.", + "geth-term": "Geth", + "geth-definition": "Go Ethereum. Az Ethereum protokoll egyik legfontosabb implementációja, melyet Go nyelven írtak. Tekintse meg a geth.ethereum.org oldalt további információért", + "gwei-term": "Gwei", + "gwei-definition": "A gigawei rövidítése, ami az ether denominációja, melyet általában a gázárak meghatározására használnak. 1 gwei = 109 wei. 109 gwei = 1 ether.", + "hard-fork-term": "Végleges elágazás (hard fork)", + "hard-fork-definition": "A blokkláncban bekövetkező állandó eltérést, más néven hard-forking változás. Akkor történhet, amikor a nem frissített csomópontok nem tudnak blokkot validálni, melyeket a frissített csomópontok készítenek, melyek már újabb konszenzusszabályokat követnek. Ne tévesszük össze az elágazás (fork), soft fork, szoftver fork vagy Git fork fogalmakkal.", + "hash-term": "Hash", + "hash-definition": "A változó mérteű bemeneti adat fix méretű ujjlenyomata, melyet egy hash függvény hoz létre. (Tekintse meg akeccak-256 bejegyzést).", + "hash-rate-term": "Hash arány", + "hash-rate-definition": "A hash-kalkulációk száma másodpercenként azon számítógépek által, melyek bányászó szoftvert futtatnak.", + "homestead-term": "Homestead", + "homestead-definition": "Az Ethereum második fejlesztési fázisa, mely 2016 márciusában indult el az 1.150.000. számú blokknál.", + "index-term": "Index", + "index-definition": "Egy hálózati struktúra, mely optimalizálja az információlekérést a blokkláncegészéből azáltal, hogy egy hatékony utat ad mutat az információ tárhelyére.", + "ide-term": "Integrált fejlesztői környezet (IDE)", + "ide-definition": "Egy felhasználói interfész, mely általában kombinálja a kódszerkesztőt, átfordítót, kódfuttatást és hibakeresést. Bővebben az integrált fejlesztői környezetekről.", + "immutable-deployed-code-problem-term": "Nem megváltoztatható kód problémája", + "immutable-deployed-code-problem-definition": "Amint egy szerződés (vagy egy könyvtár) kódja telepítve lett, az megváltoztathatatlan. A bevett szoftverfejlesztői gyakorlat arra támaszkodik, hogy ki lehet javítani a hibákat és lehet új jellemzőket adni, ezért az okosszerződésfejlesztőknek ez kihívást jelent. Bővebben az okosszerződések telepítéséről.", + "internal-transaction-term": "Belső tranzakció", + "internal-transaction-definition": "Egy tranzakció egy szerződéses számláról egy másik szerződéses számlára vagy egy EOA-ra (lásd üzenet).", + "issuance-term": "Kibocsátás", + "issuance-definition": "Az új ether kibocsátása (minting) a blokkjavaslatok jutalmához, tanúsításért és a visszaélés bejelentésért.", + "kdf-term": "Kulcsszármaztatási függvény (KDF)", + "kdf-definition": "Más néven \"jelszó nyújtó algoritmus\", melyet a keystore formátumok használnak, hogy védekezzenek a brute-force, dictionary és a szivárvány tábla támadásokkal szemben a jelszó titkosításoknál a jelszó ismételt hashelésével.", + "keystore-term": "Kulcstároló", + "keystore-definition": "Minden számláa privát kulcs/cím párja benne van egy Ethereum kliens kulcsfile-jában. Ezek JSON szöveges file-ok, melyek tartalmazzák a számla titkosított privát kulcsát, melyet csak a számlalétrehozásnál megadott jelszóval lehet visszafejteni.", + "keccak-256-term": "Keccak-256", + "keccak-256-definition": "Kriptográfiai hash-függvény, melyet az Ethereum használ. Keccak-256-öt SHA-3 formában szabványosították.", + "layer-2-term": "2. réteg", + "layer-2-definition": "Egy fejlesztési terület, mely arra fókuszál, hogy az Ethereum protokoll tetejére egy új réteget hozzon létre. Ezek a fejlesztések elhoznák a gyorsabb tranzakciókat, olcsóbb tranzakciós díjakat és a tranzakciók adatvédelmét. Bővebben az L2-ről.", + "library-term": "Könyvtár", + "library-definition": "Egy különleges szerződéstípus, melynek nincs fizetési és fallback funkciója, illetve adattára se. Ezért nem is tud ethert kapni vagy tartani, vagy bármilyen adatot tárolni. A könyvtár egy korábban telepített kód, amit meghívnak a szerződések számításokért csak olvasási (read-only) funkcióban. Bővebben az okosszerződéskönyvtárakról.", + "light-client-term": "Könnyű kliens", + "light-client-definition": "Egy olyan Ethereum kliens, mely nem tárolja a blokkláncn lokális másolatát, s nem validál blokkokat és tranzakciókat. Egy tárca funkcióját adja, s képes létrehozni és szétküldeni tranzakciókat.", + "lmd-ghost-term": "LMD-GHOST", + "lmd-ghost-definition": "Az elágazásválasztási algoritmus, melyet az Ethereum konszenzuskliensei használnak arra, hogy beazonosítsák a lánc fejét. Az LMD-GHOST annak a rövidítése, hogy „Latest Message Driven Greediest Heaviest Observed SubTree”, ami azt jelenti, hogy a lánc feje vagy eleje az a blokk, amely az összes közül a legtöbb összeadódó tanúsítással rendelkezik.", + "mainnet-term": "Mainnet", + "mainnet-definition": "A főhálózat (main network) rövidítése, ami a fő nyilvános Ethereum blokklánc.", + "merkle-patricia-tree-term": "Merkle Patricia fa (MPT)", + "merkle-patricia-tree-definition": "Egy adatstruktúra az Ethereumban, mellyel hatékonyan lehet kulcs-érték párokat tárolni.", + "message-term": "Üzenet", + "message-definition": "Egy belső tranzakció, mely sosincs sorba rendezve és csak az EVM-en belül kerül elküldésre.", + "message-call-term": "Üzenethívás", + "message-call-definition": "Egy üzenet átadása egyik számlától a másiknak. Ha a célszámla az Ethereum virtuális gép (EVM) kódjához kapcsolódik, akkor az elindul annak az objektumnak a státuszával és reagál az üzenetre.", + "mining-term": "Bányászat", + "mining-definition": "A blokkfejléc ismételt hash-elési folyamata, mely növeli a nonce értékét addig, amíg az eredmény egy tetszőleges számot ad bináris nullákkal kezdve. Így kerülnek be az új blokkok a proof-of-work blokkláncba. Ez volt az Ethereum korábbi működése, mielőtt áttért a proof-of-stake mechanizmusra.", + "miner-term": "Bányász", + "miner-definition": "Egy hálózati csomópont, amely érvényes proof-of-work-öt (munkaigazolás) talál egy új blokkra azáltal, hogy ismételten hash-el (nézze meg az Ethash bejegyzést). A bányászok már nem részei az Ethereumnak, a helyüket validátorok vették át, amikor az Ethereum áttért a proof-of-stake mechanizmusra.", + "mint-term": "Kibocsátás (mint)", + "mint-definition": "A kibocsátás az új tokenek létrehozási és bevezetési folyamata, így azok használhatóvá válnak. Ez egy decentralizált mechanizmus az új token kiadásra bármilyen központi hivatal nélkül.", + "network-term": "Hálózat", + "network-definition": "Az Ethereum hálózat, ami egy olyan közvetítőmentes vagy társközi (peer-to-peer) hálózat, mely tranzakciókat és blokkokat terjeszt az összes Ethereum csomópont (hálózati résztvevő) számára. Bővebben a hálózatokról.", + "network-hashrate-term": "Hálózati hash-ráta", + "network-hashrate-definition": "A teljes bányászati hálózat által létrehozott hash-ráta. Az Ethereumon a bányászatot (proof-of-work, munkaigazolás) leváltotta a proof-of-stake (letéti igazolás) rendszere.", + "nft-term": "Nem helyettesíthető token (NFT)", + "nft-definition": "Ez egy token-szabvány, melyet az ERC-721 javaslat vezetett be. Az NFT-k követhetőek és lehet velük kereskedni, ugyanakkor minden egyes token egyedi és megkülönböztethető; nem lehet azokat felcserélni, mint az ETH és más ERC-20-as tokenek esetében. Az NFT-k digitális vagy fizikai eszközök feletti tulajdonjogot képviselnek. Bővebben a nem helyettesíthető tokenekről (NFT).", + "node-term": "Csomópont (node)", + "node-definition": "Egy szoftverkliens, mely részt vesz a hálózatban. Bővebben a csomópontokról és a kliensekről.", + "nonce-term": "Nonce", + "nonce-definition": "A kriptográfiában egy olyan érték, melyet csak egyszer lehet használni. Egy számla nonce az egy tranzakciószámláló minden számlánál, mellyel meg lehet akadályozni az újrajátszási támadásokat.", + "ommer-term": "Ommer (uncle) blokk", + "ommer-definition": "Amikor egy proof-of-work (munkaigazolás) mechanizmus bányásza talált egy érvényes blokkot, egy másik bányász talán beküldött egy ezzel versenyző blokkot, amelyet először tettek hozzá a blokklánc elejéhez. Ez az érvényes, de elévült blokk bekerülhet az újabb blokkokba ommer-ként (a szülőblokk testvére) és részleges blokkjutalmat lehet érte kapni. Ez a kifejezés a semleges megfogalmazása a szülőblokk testvérére vonatkozóan, de néha nagybácsinak (uncle) is nevezik. Ez addig volt érvényes az Ethereumon, amíg az egy proof-of-work hálózat volt, de a proof-of-stake rendszerben már nincsenek jelen, mert minden slotban egy adott blokkjavaslattevő van.", + "optimistic-rollup-term": "Optimistic típusú összevont tranzakciók", + "optimistic-rollup-definition": "Tranzakciók összegzése (rollup), mely csalási bizonyítékokat használ, hogy megnövekedett második blokkláncréteg (L2) tranzakcióátvitelt nyújtson, s eközben a főhálózat (L1) által biztosított biztonságot élvezi. A Plasmához képes, mely egy hasonló L2 megoldás, az optimista rollup összetettebb tranzakciótípusokat is képes kezelni, bármit, ami az Ethereum virtuális gép (EVM) számára lehetséges. A zero-knowledge rollup-okhoz képest van egy késleltetési problémájuk, mivel a tranzakciókat meg lehet kérdőjelezni a családi bizonyítékkal. Bővebben az optimsta rollupokról.", + "oracle-term": "Oracle", + "oracle-definition": "Az oracle egy híd a blokklánc és a kinti világ között. Láncon belüli API-okként működnek, melyektől információt lehet lekérni és az okosszerződésekben használni azokat. Bővebben az oracle-ökrőlblokkláncról ugyanolyan másolattal rendelkeznek.", + "peer-to-peer-network-term": "Közvetítőmentes (peer-to-peer) hálózat", + "peer-to-peer-network-definition": "Számítógépek hálózata (társak), melyek együttesen képesek funkciók vagy függvények végrehajtására központi, szerveralapú szolgáltatások nélkül is.", + "plasma-term": "Plasma", + "plasma-definition": "Egy láncon kívüli skálázási megoldás, mely csalási bizonyítékokat használ, ahogy az optimista rollupok. A plasma egyszerű tranzakciókat tud végrehajtani, mint a tokenek küldése vagy átváltása. Bővebben a plasmáról.", + "private-key-term": "Privát kulcs", + "private-key-definition": "Egy titkos szám, mely lehetővé teszi az Ethereum felhasználóknak, hogy bizonyítsák a tulajdonjogukat egy számlához vagy szerződéshez egy digitális aláírással (lásd publikus kulcs, cím, ECDSA).", + "private-chain-term": "Privát lánc", + "private-chain-definition": "Egy teljesen privát blokklánc, melyhez engedélyezett hozzáférés kell, s nem használhatja azt bárki nyilvánosan.", + "pos-term": "Proof-of-stake (PoS)", + "pos-definition": "Egy olyan módszer, mellyel egy kriptovaluta blokkláncprotokoll képes elérni a konszenzust. A PoS arra kéri a felhasználókat, hogy rendelkezzenek a kriptovaluta egy bizonyos mennyiségével (ez a letétjük a hálózatban) ahhoz, hogy részt vehessenek a tranzakciók validálásában. Bővebben a proof-of-stake mechanizmusról.", + "pow-term": "Proof-of-work (PoW)", + "pow-definition": "Egy adatrész (a bizonyíték), melynek megtalálásához jelentős számítási kapacitás szükséges. Bővebben a proof-of-work mechanizmusról.", + "public-key-term": "Nyilvános kulcs", + "public-key-definition": "Egy a privát kulcsból egy egyirányú függvénnyel származtatott szám, amelyet nyilvánosan meg lehet osztani, és bárki felhasználhatja az ehhez tartozó privát kulccsal készült digitális aláírások hitelesítéséhez.", + "receipt-term": "Visszaigazolás", + "receipt-definition": "Egy Ethereum kliens által visszküldött adat, mely egy adott tranzakció eredményét reprezentálja, beleértve a tranzakció hash-t, a blokk számát, a felhasznált gáz mennyiségét, és egy okosszerződés telepítésénél a szerződés címét.", + "re-entrancy-attack-term": "Újrabelépési támadás", + "re-entrancy-attack-definition": "Egy olyan támadás, melynek során a támadó szerződés meghívja az áldozatszerződés egy függvényét úgy, hogy a végrehajtás közben az áldozat meg fogja hívni a támadószerződést megint, rekurzív módon. Ezzel például ki lehet szivárogtatni a pénzeszközöket az áldozatszerződésből, mert az átugorja azt a lépést, amikor az egyenleget frissítené vagy számolni tudná a kivett összeget. Bővebben az újrabelépésről.", + "reward-term": "Jutalom", + "reward-definition": "Az új blokkban jelenlévő ether mennyiség, melyet a hálózat ad jutalomként a bányásznak, aki megtalálta a proof-of-work megoldást.", + "rlp-term": "Rekurzív hosszúságú prefixum (RLP)", + "rlp-definition": "Egy Ethereum fejlesztők által megtervezett kódolási szabvány tetszőlegesen komplex és tetszőlegesen hosszú objektumok (adatstruktúrák) kódolására és sorosítására.", + "rollups-term": "Összegzők", + "rollups-definition": "Egy második blokkláncréteg (L2) típusú skálázási megoldás, ami összekötegel számtalan tranzakciót és beküldi azt az Ethereum főhálózatra egyetlen tranzakcióként. Ezáltal csökkenthető a gázdíj és növelhető a tranzakció átviteli mennyiség. Léteznek optimista és zero-knowledge (nullaismeret-alapú) rollupok, melyek különböző biztonsági módszereket használnak arra, hogy ezek a skálázási előnyök eléhetőek legyenek. Bővebben a rollupokról.", + "rpc-term": "Remote procedure call (RPC)", + "rpc-definition": "A Remote procedure call (RPC) egy olyan protokoll, melyet egy program használ arra, hogy szolgáltatást kérjen a hálózatban lévő másik számítógépen tárolt programtól anélkül, hogy meg kellene értenie a hálózat részleteit.", + "sha-term": "Biztonságos hash-algoritmus (Secure Hash Algorithm, SHA)", + "sha-definition": "A kriptográfiai hash-függvények egy családja, melyet a Sztenderdek és Technológiák nemzetiközi intézménye (National Institute of Standards and Technology, NIST) adott ki.", + "serialization-term": "Sorosítás", + "serialization-definition": "Az a folyamat, mely egy adatstruktúrát bájtok sorozatává alakít át.", + "shard-term": "Shard / shard lánc", + "shard-definition": "A shard láncok egy teljes blokklánc elkülönült szekciói, melyekért a validátorok egy alcsoportja felel. Ez megnövekedett átviteli kapacitást tudna adni az Ethereumnak és fejlesztené az L2 megoldások adatelérhetőségét, mint amilyenek az optimista rollupok és a ZK-rollupok. Bővebben a dankshardingról.", + "sidechain-term": "Sidechain (melléklánc)", + "sidechain-definition": "Egy skálázási megoldás, amely egy elkülönült láncot használ eltérő, gyakran gyorsabb Konszenzusszabályokkal. A mellékláncokat híddal lehet hozzákapcsolni a főhálózathoz. A rollupok is használnak mellékláncokat, de ezek együttesen működnek a főhálózattal. Bővebben a mellékláncokról.", + "signing-term": "Aláírás", + "signing-definition": "Kriptográfiailag igazolják, hogy egy tranzakciót jóváhagyott egy specifikus privát kulcs tulajdonosa.", + "singleton-term": "Singleton (egyke)", + "singleton-definition": "Egy számítógépprogramozási fogalom, mely egy olyan objektumot jelent, amelynek csak egy példánya létezhet.", + "slasher-term": "Slasher (büntető)", + "slasher-definition": "A slasher egy olyan entitás, amelyik átnézi a tanúsításokat és súlyost büntetés magával vonó hibákat keres. A büntetéseket szétküldik a hálózaton, s a következő blokkelőterjesztő hozzáteszi a bizonyítékot a blokkhoz. A blokkot javasló ezután jutalmat kap, hogy megbüntette a rosszhiszemű validátort.", + "slot-term": "Slot", + "slot-definition": "Egy időtartam (12 másodperc), melynek során új blokkot tud előterjeszteni a validátor a proof-of-stake (letéti igazolás) rendszerben. A slot lehet üres is. 32 slot tesz ki egy korszakot (epoch). Bővebben a proof-of-stake mechanizmusról.", + "smart-contract-term": "Smart contract", + "smart-contract-definition": "Egy program, ami az Ethereum számítási infrastruktúráján kerül végrehajtásra. Bevezetés az okosszerződésekbe.", + "snark-term": "SNARK", + "snark-definition": "A SNARK (succinct non-interactive argument of knowledge) egy fajta zero-knowledge (nullaismeret-alapú) bizonyíték. Bővebben a zero-knowledge rollupokról.", + "soft-fork-term": "Ideiglenes elágazás (soft fork)", + "soft-fork-definition": "Eltérés a blokkláncban, ami akkor történik, amikor a konszenzusszabályok megváltoznak. A végleges elágazáshoz (hard fork) képest ez visszafelé kompatibilis; a frissített csomópontok képesek validálni a blokkokat, melyeket a nem frissített csomópontok készítenek, ha azok követik az konszenzusszabályokat.", + "solidity-term": "Solidity", + "solidity-definition": "Egy procedurális (imperatív) programozási nyelv, melynek szintaxa hasonló a JavaScript, C++ vagy Java nyelvekhez. Ez a legnépszerűbb és legtöbbet használt nyelv az Ethereum okosszerződésekre. Dr. Gavin Wood hozta létre. Bővebben a Solidity-ről.", + "solidity-inline-assembly-term": "Solidity inline assembly", + "solidity-inline-assembly-definition": "EVM assembly nyelv egy Solidity programban. Könnyebb bizonyos műveleteket megírni, mivel a Solidity támogatja az inline assembly-t.", + "stablecoin-term": "Stabil érme", + "stablecoin-definition": "Egy ERC-20-as token, melynek értéke egy másik eszköz értékéhez van kötve. Néhány stabil érmét fiat vagy hagyományos valuták támogatnak, mint amilyen a dollár, nemesfémek, mint az arany, és más kriptovaluták, mint a Bitcoin.", + "staking-term": "Letétbe helyezés", + "staking-definition": "Egy bizonyos mennyiségű ether lekötése (letét), hogy a felhsználó validátor legyen és biztosítsa a hálózatot. A validátor ellenőrzi a tranzakciókat és blokkokat javasol a proof-of-stake (letéti igazolás) konszenzusmodellje szerint. A letétbe helyezés egy gazdasági ösztönző, hogy a hálózat legjobb érdeke szerint működjön a felhasználó. A validátor feladatainak elvégzéséért jutalmat kap, de elmulasztásáért veszít az ETH egyenlegéből. Bővebben az Ethereum letétbe helyezésről.", + "staking-pool-term": "Staking pool", + "staking-pool-definition": "Több Ethereum letétbe helyező ETH egyenlegét kombinálja, hogy elérje a 32 ETH összeget, ami a validátor kulcsok aktiválásához szükséges. A csomópont működtetője ezeket a kulcsokat használja, hogy részt vegyen a konszenzusban, a blokkjutalmakat pedig elosztják a hozzájárulást adó letétesek között. A letéti alapok vagy a letétbe helyezés delegálása nem natív az Ethereum protokoll számára, de a közösség sokféle megoldást létrehozott már. Bővebben a letéti alapokról.", + "stark-term": "STARK", + "stark-definition": "A STARK (scalable transparent argument of knowledge) egy fajta zero-knowledge (nullaismeret-alapú) bizonyíték. Bővebben a zero-knowledge rollupokról.", + "state-term": "Állapot", + "state-definition": "Az összes egyenleg és adat pillanatképe a blokklánc egy időpillanatában, mely általában egy adott blokk állapotára utal.", + "state-channels-term": "Állapotcsatornák", + "state-channels-definition": "Egy L2 megoldás, ahol a csatornát a résztvevők között állítják fel, s így szabadon és olcsón tudnak tranzakciókat végezni. Csak egy tranzakciót küldd a főhálózatnak, hogy felállította és lezárta a csatornát. Ez magas tranzakció átvitelre képes, de azon alapszik, hogy a résztvevők számát előre kell tudni és a pénzeszközöket le kell zárni. Bővebben a státuszcsatornákról.", + "supermajority-term": "Túlnyomó többség", + "supermajority-definition": "A túlnyomó többség a teljes letétbe helyezett ether 2/3-ot (66%) meghaladó mennyisége, mely az Ethereumot biztosítja. A blokkok véglegesedéséhez a túlnyomó többség szavazatára van szükség a Beacon láncon.", + "syncing-term": "Szinkronizálás", + "syncing-definition": "Az a folyamat, amikor letöltik a blokklánc utolsó verziójának összes adatát egy csomópontra.", + "sync-committee-term": "Szinkronizálási bizottság", + "sync-committee-definition": "A szinkronizálási bizottság a validátorok véletlenszerűen kiválasztott csoportja, mely kb. minden 27 órában frissül. A céljuk az, hogy az érvényes blokkfejlécekhez hozzátegyék az aláírásukat. A szinkronizálási bizottság lehetővé teszi, hogy a könnyű kliensek követni tudják a blokklánc fejét anélkül, hogy hozzáférnének a teljes validátorszetthez.", + "szabo-term": "Szabo", + "szabo-definition": "Az ether denominációja. 1 szabo = 1012 wei. 106 szabo = 1 ether.", + "terminal-total-difficulty-term": "Végső teljes nehézség (TTD)", + "terminal-total-difficulty-definition": "A teljes nehézség az Ethash bányászati nehézség összege az összes blokkra a blokklánc egy adott pontjáig. A végső teljes nehézség ennek egy kijelölt értéke volt, mely elindította a végrehajtási klienseknél, hogy kikapcsolják a bányászó és blokkpletykáló funkcióikat, így a hálózat át tud térni a proof-of-stake mechanizmusra.", + "testnet-term": "Teszthálózat", + "testnet-definition": "Egy olyan hálózat, melyen az Ethereum főhálózatának viselkedését lehet szimulálni.", + "token-term": "Token", + "token-definition": "Egy virtuális eszköz, mellyel kereskedni lehet, s az Ethereum blokkláncon okosszerződésekben van meghatározva.", + "transaction-term": "Tranzakció", + "transaction-definition": "Egy elköteleződés az Ethereum blokkláncon, melyet egy küldő számla írt alá, és egy meghatározott címre irányul. A tranzakció tartalmaz metaadatokat, mint amilyen a gázhatár az adott tranzakcióra. Bővebben a tranzakciókról.", + "transaction-fee-term": "Tranzakciós díj", + "transaction-fee-definition": "Az Ethereum hálózat használatért fizetendő díj. Például, amikor pénzeszközöket küld valaki atárcájából, vagy egy decentralizált alkalmazással (dapp) való interakciót végez, mint tokenek átváltása vagy egy gyűjthető tárgy megvétele. Ez olyan, akár egy szolgáltatási díj. Ez a díj változik a hálózat leterheltsége szerint. Ennek az az oka, hogy a validátorok, akik a tranzakciókat feldolgozzák, előreveszik a magasabb díjjal rendelkező tételeket, ezért a leterheltség megnöveli az árakat.

    Technikailag a tranzakciós díj ahhoz kapcsolódik, hogy az adott művelethez mennyi gázra van szükség.

    A tranzakciós díjak csökkentése jelenleg az egyik célkitűzés. Tekintse meg az L2 bejegyzést.", + "trustlessness-term": "Bizalomigénytől mentes", + "trustlessness-definition": "A hálózat azon képessége, hogy tranzakciókat úgy tud közvetíteni, hogy a résztvevő feleknek nem kell megbízniuk egy harmadik félben.", + "turing-complete-term": "Turing-teljes", + "turing-complete-definition": "Az angol matematikus és számítástechnikus, Alan Turing, után elnevezett fogalom – az adatmanipulációs szabályok rendszere (például egy számítógép utasításai, egy programozási nyelv vagy egy sejtautomata) „Turing-teljesnek” vagy számítási szempontból univerzálisnak mondható, ha bármely Turing-gép szimulálására felhasználható.", + "validator-term": "Validátor", + "validator-definition": "Egy csomópont a proof-of-stake rendszerben, melynek feladata az adattárolás, tranzakciók feldolgozása és új blokkok hozzáadása a blokklánchoz. A validátorszoftver aktiválásához letétbe kell helyezni 32 ETH-t. Bővebben a letétbe helyezésről az Ethereumon.", + "validator-lifecycle-term": "Validátoréletciklus", + "validator-lifecycle-definition": "A státuszok sorozata, melyek a validátorra vonatkoznak. Ezek lehetnek:

    • a letétet elhelyezte: a validátor a 32 ETH-t elhelyezte a letéti szerződésebe
    • függőben: a validátor az aktiválási sorban vár, hogy a hálózat validátorai beszavazzák
    • aktív: tanúsítást végez és blokkokat javasol
    • megbüntetve: a validátor nem megfelelő viselkedése miatt súlyos büntetésben és kizárásban részesül
    • kilépő: a validátort megjelölték, hogy kilép a hálózatból, önként vagy kizárás miatt.
    ", + "validity-proof-term": "Érvényességi bizonyíték", + "validity-proof-definition": "Egy biztonsági modell egy bizonyos második blokkláncréteg (L2) megoldáshoz, ahol a sebesség meggyorsítása érdekében a tranzakciókat összecsomagolják kötegekbe és beküldik az Ethereumra egyetlen tranzakcióban. A tranzakciószámítást a láncon kívül végzik és a főláncnak egy érvényességi bizonyítékot adnak. Ez a módszer növeli a tranzakciók mennyiségét, miközben fenntartja a biztonságot. Néhány rollup csalási bizonyítékot használ. Bővebben a zero-knowledge rollupokról.", + "validium-term": "Validium", + "validium-definition": "Egy láncon kívüli megoldás, amely érvényességi bizonyítékokat használ, hogy növelje a tranzakció átvitelt. A zero-knowledge rollupokhoz képes a validium adatai nincsenek a főhálózaton (L1) tárolva. Bővebben a validiumokról.", + "vyper-term": "Vyper", + "vyper-definition": "Egy magasz szintű programozési nyelv, melynek szintaxisa a Pythonhoz hasonlít. A cél vele az, hogy közelebb kerüljön egy tisztán függvény alapú/funkcionális nyelvhez. Vitalik Buterin hozta létre. Bővebben a Vyperről.", + "wallet-term": "Tárca", + "wallet-definition": "Egy szoftver, amely privát kulcsokat tárol. Arra használják, hogy elérjék és irányítsák az Ethereum számlákat, valamint interakciót végezzenek okosszerződésekkel. A kulcsokat nem kell a tárcában tárolni, a biztonság érdekében érdemes inkább offline tartani (például memóriakártyán vagy papírra felírva). A neve ellenére a tárca nem tárol pénzt vagy tokeneket. Bővebben az Ethereum tárcákról.", + "web3-term": "Web3", + "web3-definition": "A web harmadik változata. Először Dr. Gavin Wood javasolta a web3 kifejezést, mely új célt és fókuszt tűz ki a webes alkalmazásoknak – a központilag birtokolt és menedzselt alkalmazások helyett decentralizált protokollokra épülők legyenek Bővebben a web3-ról.", + "wei-term": "Wei", + "wei-definition": "Az ether legkisebb denominációja. 1018 wei = 1 ether.", + "zero-address-term": "Zérócím", + "zero-address-definition": "Egy Ethereum cím, mely cska nullából áll, s gyakran használják arra, hogy tokeneket vonjanak ki a körforgásból. A különbség van aközött, hogy egy tokent hivatalosan kivontak egy okosszerződés indexéből a burn() metódussal, vagy elküldték erre a címre.", + "zk-proof-term": "Zero-knowledge (nullaismeret-alapú) bizonyíték", + "zk-proof-definition": "A zero-knowledge bizonyíték egy kriptográfiai módszer, mellyel egy egyén képes bizonyítani, hogy egy állítás igaz anélkül, hogy bármilye információt szolgáltatna. Bővebben a zero-knowledge rollupokról.", + "zk-rollup-term": "Nulla tudás alapú összevont tranzakció", + "zk-rollup-definition": "Tranzakciók összegzése (rollup), mely érvényességi bizonyítékokat használ, hogy megnövelje az L2 tranzakcióátvitelt, miközben a főhálózat (L1) által kínált biztonságot megtartja. Habár nem tudnak összetett tranzakciótípusokat kezelni, mint az optimista rollupok, de nincs bennük késleltetési probléma, mert a tranzakciók bizonyítottan érvényesek a beküldés pillanatában. Bővebben a zero-knowledge rollupokról." +} diff --git a/src/intl/hu/page-about.json b/src/intl/hu/page-about.json index e5d0586e04e..e6d02a34173 100644 --- a/src/intl/hu/page-about.json +++ b/src/intl/hu/page-about.json @@ -9,18 +9,28 @@ "page-about-li-4": "bevezetett", "page-about-link-1": "A könyvtár forráskódja az \"MIT License\" által engedélyezett", "page-about-link-2": "GitHub", - "page-about-link-3": "A folyamatban lévő feladatok teljes listájának megtekintése a GitHub-on", + "page-about-link-3": "A folyamatban lévő feladatok teljes listájának megtekintése a Github-on", "page-about-link-4": "Csatlakozzon a Discord szerverünkhöz", "page-about-link-5": "Lépj velünk kapcsolatba a Twitteren", - "page-about-link-6": "A bevezetett feladatok teljes listájának megtekintése a GitHub-on", - "page-about-link-7": "Hiba jelentése a GitHub-on", + "page-about-link-6": "A bevezetett feladatok teljes listájának megtekintése a Github-on", + "page-about-link-7": "Hiba jelentése a Github-on", "page-about-p-1": "Az ethereum.org megalapítása óta a működésünk átláthatóságára törekszünk. Ez az egyik alapértékünk, mert hiszünk abban, hogy a transzparencia a meghatározó alappillére az Ethereum sikerének.", "page-about-p-2": "Az általunk használt", "page-about-p-3": "az elsődleges projektmenedzsment eszközünk. Feladatainkat 3 kategóriába szervezzük:", - "page-about-p-4": "Mindent megteszünk, hogy a közösséget tájékoztassuk a feladatok aktuális állapotáról.", + "page-about-p-4": " Mindent megteszünk, hogy a közösséget tájékoztassuk a feladatok aktuális állapotáról.", "page-about-p-5": "Bevezetett feladataink.", "page-about-p-6": "A bevezetésre váró feladataink.", "page-about-p-7": "Befejezett feladatok.", "page-about-p-8": "Fejlesztési javaslatod van az ethereum.org-al kapcsolatban? Szívesen együttműködnénk!", - "page-what-is-ethereum-energy-consumption-chart-legend": "Éves energiafogyasztás TWh/évben" + "page-what-is-ethereum-energy-consumption-chart-legend": "Éves energiafogyasztás TWh/évben", + "page-upgrades-post-merge-banner-governance-ood": "Az oldalon található tartalmak egy része a beolvadás után már nem naprakész. Ha szeretne segíteni, kérjük, küldjön egy bejelentést (PR-t).", + "energy-consumption-chart-global-data-centers-label": "Globális adatközpontok", + "energy-consumption-chart-airbnb-label": "AirBnB", + "energy-consumption-gold-mining-cbeci-label": "Aranybányászat", + "energy-consumption-chart-btc-pow-label": "BTC PoW", + "energy-consumption-chart-netflix-label": "Netflix", + "energy-consumption-chart-eth-pow-label": "ETH PoW", + "energy-consumption-chart-gaming-us-label": "Számítógépes játék (USA)", + "energy-consumption-chart-paypal-label": "PayPal", + "energy-consumption-chart-eth-pos-label": "ETH PoS" } diff --git a/src/intl/hu/page-assets.json b/src/intl/hu/page-assets.json index 3b7b2f2e72f..3c65e513d10 100644 --- a/src/intl/hu/page-assets.json +++ b/src/intl/hu/page-assets.json @@ -1,36 +1,61 @@ { "page-assets-bazaar": "Ethereum bazár", + "page-assets-beacon-chain": "Beacon Chain", "page-assets-blocks": "Építőkockák", + "page-assets-dao": "DAO", + "page-assets-defi": "DeFi", + "page-assets-merge": "Az egyesítés", "page-assets-doge": "Doge dappokat használ", "page-assets-download-artist": "Szerző:", "page-assets-download-download": "Letöltés", "page-assets-enterprise": "Vállalati Ethereum", "page-assets-eth": "Ether (ETH)", - "page-assets-eth-diamond-color": "ETH gyémánt (szín)", - "page-assets-eth-diamond-glyph": "ETH gyémánt (karakter)", - "page-assets-eth-diamond-gray": "ETH gyémánt (szürke)", - "page-assets-eth-diamond-purple": "ETH gyémánt (lila)", - "page-assets-eth-diamond-white": "ETH gyémánt (fehér)", - "page-assets-eth-glyph-video-dark": "ETH karakter videó (sötét)", - "page-assets-eth-glyph-video-light": "ETH karakter videó (világos)", - "page-assets-eth-logo-landscape-gray": "ETH logo táj (szürke)", - "page-assets-eth-logo-landscape-purple": "ETH logo táj (lila)", - "page-assets-eth-logo-landscape-white": "ETH logo táj (fehér)", - "page-assets-eth-logo-portrait-gray": "ETH logo portré (szürke)", - "page-assets-eth-logo-portrait-purple": "ETH logo portré (lila)", - "page-assets-eth-logo-portrait-white": "ETH logo portré (fehér)", - "page-assets-eth-wordmark-gray": "ETH szójel (szürke)", - "page-assets-eth-wordmark-purple": "ETH szójel (lila)", - "page-assets-eth-wordmark-white": "ETH szójel (fehér)", + "page-assets-eth-diamond-color": "ETH-gyémánt (színes)", + "page-assets-eth-diamond-glyph": "ETH-gyémánt (karakter)", + "page-assets-eth-diamond-gray": "ETH-gyémánt (szürke)", + "page-assets-eth-diamond-purple": "ETH-gyémánt (lila)", + "page-assets-eth-diamond-white": "ETH-gyémánt (fehér)", + "page-assets-eth-diamond-colored": "ETH-gyémánt (színezett)", + "page-assets-eth-diamond-colored-svg": "ETH-gyémánt (színezett, SVG)", + "page-assets-eth-glyph-video-dark": "ETH-karakter, videó (sötét)", + "page-assets-eth-glyph-video-light": "ETH-karakter, videó (világos)", + "page-assets-eth-logo-landscape-gray": "ETH-logó, fekvő (szürke)", + "page-assets-eth-logo-landscape-purple": "ETH-logó, fekvő (lila)", + "page-assets-eth-logo-landscape-white": "ETH-logó, fekvő (fehér)", + "page-assets-eth-logo-portrait-gray": "ETH-logó, álló (szürke)", + "page-assets-eth-logo-portrait-purple": "ETH-logó, álló (lila)", + "page-assets-eth-logo-portrait-white": "ETH-logó, álló (fehér)", + "page-assets-eth-wordmark-gray": "ETH-szójel (szürke)", + "page-assets-eth-wordmark-purple": "ETH-szójel (lila)", + "page-assets-eth-wordmark-white": "ETH-szójel (fehér)", "page-assets-ethereum-brand-assets": "Ethereum márkanév", - "page-assets-h1": "ethereum.org eszközök", - "page-assets-hero": "ethereum.org hős ", - "page-assets-hero-particles": "ETH részecske kép", + "page-assets-finance": "Pénzügy", + "page-assets-future": "Jövő", + "page-assets-h1": "ethereum.org anyagok", + "page-assets-hero": "ethereum.org-hős", + "page-assets-hero-panda": "ethereum.org hős a Merge pandával", + "page-assets-merge-panda": "Merge panda", + "page-assets-merge-panda-svg": "Merge panda SVG", + "page-assets-hero-particles": "ETH-részecskék, kép", "page-assets-historical-artwork": "Történelmi műalkotás", "page-assets-illustrations": "Illusztrációk", - "page-assets-meta-desc": "Fedezd fel és töltsd le az Ethereum és ethereum.org márkaneveket, ábrákat és médiátartalmakat.", - "page-assets-meta-title": "Ethereum márkanév", + "page-assets-impact": "Hatás", + "page-assets-infrastructure": "Infrastruktúra", + "page-assets-leslie-the-rhino": "Leslie, a rinocérosz", + "page-assets-meta-desc": "Fedezze fel és töltse le az Ethereumhoz és ethereum.org-hoz tartozó márkaneveket, illusztrációkat és médiatartalmakat.", + "page-assets-meta-title": "Ethereum márkaeszközök", + "page-assets-mainnet": "Mainnet", "page-assets-page-assets-solid-background": "Telt háttér", "page-assets-page-assets-transparent-background": "Átlátszó háttér", - "page-assets-robot": "Robot tárca" + "page-assets-robot": "Robot tárca", + "page-assets-sharding": "Sharding", + "page-assets-hackathon": "Hackathon", + "page-assets-learn-hero-name": "Futurisztikus egyetem", + "page-assets-community-hero-name": "Közösségi találkozó", + "page-assets-quizzes-hero-name": "Végtelen játszótér", + "page-assets-developers-hero-name": "Építjük a jövőt", + "page-assets-garden-name": "Az Ethereumi kert", + "page-assets-roadmap-hero-name": "A jövőbe vezető utak", + "page-assets-layer-2-hero-name": "Az Ethereum építése", + "page-assets-guides-hero-name": "Ethereum-laboratórium" } diff --git a/src/intl/hu/page-bug-bounty.json b/src/intl/hu/page-bug-bounty.json index de7cfceea4b..19716f69c30 100644 --- a/src/intl/hu/page-bug-bounty.json +++ b/src/intl/hu/page-bug-bounty.json @@ -1,95 +1,136 @@ { - "page-upgrades-bug-bounty-annotated-specs": "kommentált specifikáció", - "page-upgrades-bug-bounty-annotations": "Hasznos lehet megnézni a következő annotációkat:", - "page-upgrades-bug-bounty-client-bugs": "Eth2 kliens bugok", - "page-upgrades-bug-bounty-client-bugs-desc": "A kliensek fogják futtatni a Beacon Chaint, amint a fejlesztés megtörténik. A klienseknek egy specifikációban meghatározott logikai halmazt kell követniük és biztonságosnak kell lenniük potenciális támadásokkal szemben. A bugokat, amiket szeretnénk megtalálni a protokoll implementációhoz kapcsolódnak.", - "page-upgrades-bug-bounty-client-bugs-desc-2": "Kizárólag a Lighthouse, Nimbus, Teku és a Prysm bugjai vannak figyelembe véve ennél a vadászatnál. Több klienst is hozzá fogunk adni, amint teljesítik az auditokat és gyártásra készen állnak.", - "page-upgrades-bug-bounty-clients": "A vadászatban szereplő kliensek", - "page-upgrades-bug-bounty-clients-type-1": "specifikáció nem-megfelelési problémák.", - "page-upgrades-bug-bounty-clients-type-2": "váratlan összeomlások vagy szolgáltatásmegtagadási (DOS) sérülékenységek.", - "page-upgrades-bug-bounty-clients-type-3": "bármilyen probléma, ami javíthatatlan konszenzus törést okoz a hálózat többi része számára.", - "page-upgrades-bug-bounty-docking": "dokkolás", - "page-upgrades-bug-bounty-email-us": "Küldj e-mailt nekünk:", + "page-upgrades-bug-bounty-annotated-specs": "jegyzettel ellátott specifikáció", + "page-upgrades-bug-bounty-annotations": "Hasznos lehet megnézni a következő jegyzeteket:", + "page-upgrades-bug-bounty-client-bugs": "Klienshibák", + "page-upgrades-bug-bounty-client-bugs-desc": "A kliensek futtatják az Ethereum-hálózatot, követniük kell a specifikációban meghatározott logikát, és biztonságban kell lenniük a potenciális támadásokkal szemben. Az általunk keresett hibák a protokollimplementációhoz kapcsolódnak.", + "page-upgrades-bug-bounty-client-bugs-desc-2": "Jelenleg a végrehajtási réteg kliensei (Besu, Erigon, Geth és Nethermind) és a konszenzus réteg kliensei (Lighthouse, Lodestar, Nimbus, Teku és Prysm) szerepelnek a Bug Bounty Programban. További kliensek is bekerülhetnek a programba, amint befejezik az ellenőrzéseket és készen állnak a használatra. Jelenleg a c-kzg-4844 és a go-kzg-4844 is szerepel a hibavadászprogramban.", + "page-upgrades-bug-bounty-clients": "A vadászatban részt vevő kliensek", + "page-upgrades-bug-bounty-clients-type-1": "A specifikációnak nem felel meg a működés", + "page-upgrades-bug-bounty-clients-type-2": "Váratlan összeomlások, távoli kódfuttatással (RCE) vagy szolgáltatásmegtagadással (DOS) kapcsolatos sérülékenységek", + "page-upgrades-bug-bounty-clients-type-3": "Bármilyen probléma, amely javíthatatlan konszenzustörést okoz a hálózat többi részével szemben", + "page-upgrades-bug-bounty-misc-bugs": "Solidity-hibák", + "page-upgrades-bug-bounty-misc-bugs-desc": "A hatókör tartalmával kapcsolatos további részletekért tekintse meg a Solidity SECURITY.MD állományt.", + "page-upgrades-bug-bounty-misc-bugs-desc-2": "A Solidity nem tartalmaz biztonsági garanciákat a nem megbízható bemeneti adatok fordításával kapcsolatban, továbbá nem jár jutalom azért, ha a solc fordító rossz szándékkal generált adatok miatt leáll.", + "page-upgrades-bug-bounty-deposit-bugs": "A letéti szerződés hibái", + "page-upgrades-bug-bounty-deposit-bugs-desc": "A Beacon lánc letéti szerződésének specifikációi és forráskódja része a hibavadászprogramnak.", + "page-upgrades-bug-bounty-docking": "beolvadás", + "page-upgrades-bug-bounty-email-us": "Küldjön e-mailt:", "page-upgrades-bug-bounty-help-links": "Hasznos linkek", - "page-upgrades-bug-bounty-hunting": "Bug vadászat szabályok", - "page-upgrades-bug-bounty-hunting-desc": "A bug vadászat program egy kísérleti és diszkrecionális jutalomprogram aktív Ethereum közösségünk számára, hogy ösztönözze és megjutalmazza azokat, akik segítenek a platform fejlesztésében. Nem egy verseny. Tudnod kell, hogy bármikor lemondhatjuk a programot, és a díjazást az Ethereum Alapítvány bug vadászati panele határozza meg. Továbbá nem adhatunk jutalmakat olyan egyéneknek, akik szankciós listákon szerepelnek, vagy szankciós listákon lévő országokban élnek (pl. Észak-Korea, Irán stb.). Az adózásért teljes mértékben te vagy felelős. Minden díjra a vonatkozó törvények vonatkoznak. Végül a tesztelés nem sérthet semmilyen törvényt, és nem sérthet olyan adatokat, amelyek nincsenek a birtokodban.", - "page-upgrades-bug-bounty-hunting-leaderboard": "Bug vadászat ranglista", - "page-upgrades-bug-bounty-hunting-leaderboard-subtitle": "Találj Eth2 bugokat és kerülj fel ranglétrára", - "page-upgrades-bug-bounty-hunting-li-1": "Azok a problémák, amelyeket már más felhasználó beküldött vagy ismertek a specifikáció és kliens karbantartóknak, nem számítanak be a vadászat díjazásába.", - "page-upgrades-bug-bounty-hunting-li-2": "Sérülékenységek nyilvános közzététele alkalmatlanná teszi azt a vadászatban.", - "page-upgrades-bug-bounty-hunting-li-3": "Az Ethereum Alapítvány kutatói és az Eth2 kliens csapatok alkalmazottai nem vehetnek részt a díjazásban.", - "page-upgrades-bug-bounty-hunting-li-4": "Az Ethereum vadászati program a díjak meghatározásánál több változót is figyelembe vesz. A jogosultság, a pontszám és a díjjal kapcsolatos feltételek meghatározása az Ethereum Alapítvány bug vadászati testületének kizárólagos és végső döntése.", - "page-upgrades-bug-bounty-leaderboard": "Teljes ranglista megtekintése", - "page-upgrades-bug-bounty-leaderboard-points": "pontok", - "page-upgrades-bug-bounty-ledger-desc": "A Beacon Chain specifikáció részletezi a design indoklását és az Ethereum javasolt változásait a Beacon Chain fejlesztésen keresztül.", - "page-upgrades-bug-bounty-ledger-title": "A Beacon Chain specifikáció bugjai", - "page-upgrades-bug-bounty-meta-description": "Áttekintés az Eth2 bug vadászati programról: információ a bekapcsolódásról és a díjazásról.", - "page-upgrades-bug-bounty-meta-title": "Eth2 bug vadászati program", - "page-upgrades-bug-bounty-not-included": "Nem tartalmazza", - "page-upgrades-bug-bounty-not-included-desc": "A shard láncok és a dokkolási fejlesztések még aktív fejlesztés alatt állnak és emiatt nem tartalmazza őket ez a vadászati program.", - "page-upgrades-bug-bounty-owasp": "OWASP módszer megtekintése", - "page-upgrades-bug-bounty-points": "Továbbá az EF pontokat ad a következők alapján:", - "page-upgrades-bug-bounty-points-error": "Hiba betöltés közben... kérjük frissítsd az oldalt.", - "page-upgrades-bug-bounty-points-exchange": "Pont beváltás", - "page-upgrades-bug-bounty-points-loading": "Adatok betöltése...", - "page-upgrades-bug-bounty-points-payout-desc": " Az Ethereum Alapítvány ETH-ben vagy DAI-ban fizeti ki az USD értékét.", - "page-upgrades-bug-bounty-points-point": "1 pont", - "page-upgrades-bug-bounty-points-rights-desc": "Az Ethereum Alapítvány fenntartja az előzetes bejelentés nélkül történő változatás jogát.", - "page-upgrades-bug-bounty-points-usd": "2 USD", + "page-upgrades-bug-bounty-hunting": "A hibavadászat szabályai", + "page-upgrades-bug-bounty-hunting-desc": "A hibavadászprogram egy kísérleti és önkéntes alapú jutalomprogram az aktív Ethereum-közösségünk számára, hogy ösztönözze és megjutalmazza azokat, akik segítenek a platform fejlesztésében. Ez nem egy verseny. Tudnia kell, hogy bármikor lemondhatjuk a programot, és a díjazásról az Ethereum Alapítvány hibavadászati testülete dönt. Továbbá nem adhatunk jutalmakat olyan egyéneknek, akik szankciós listákon szerepelnek, vagy szankciós listákon lévő országokban élnek (pl. Észak-Korea, Irán stb.). A helyi jogszabályok megkövetelik, hogy ellenőrizzük az Ön kilétét. Az adózásért teljes mértékben Ön felel. Minden díj a vonatkozó jogszabályok hatálya alá tartozik. Végül a tesztelés nem sérthet semmilyen jogszabályt, nem veszélyeztethet más tulajdonát képező adatokat, és csak helyben működő teszthálózatokon végezhető.", + "page-upgrades-bug-bounty-hunting-leaderboard": "A konszenzusréteg hibavadászranglistája", + "page-upgrades-bug-bounty-hunting-execution-leaderboard": "A végrehajtási réteg hibavadászranglistája", + "page-upgrades-bug-bounty-hunting-leaderboard-subtitle": "Találjon hibát a konszenzusrétegben, és kerüljön fel a ranglistára", + "page-upgrades-bug-bounty-hunting-execution-leaderboard-subtitle": "Találjon hibát a végrehajtási rétegben, és kerüljön fel a ranglistára", + "page-upgrades-bug-bounty-hunting-li-1": "Nem jogosít vadászjutalomra a POC nélküli probléma, vagy az, amelyet egy másik felhasználó már benyújtott, vagy amelyet a specifikáció- és klienskarbantartók már ismernek.", + "page-upgrades-bug-bounty-hunting-li-2": "Egy sebezhetőség után nem jár jutalom, ha azt nyilvánosan közzéteszik.", + "page-upgrades-bug-bounty-hunting-li-3": "Az Ethereum Alapítvány munkavállalói és szerződött felei, illetve a hibavadász program hatókörébe tartozó klienscsapatok kizárólag pontokat gyűjthetnek a program keretein belül, de pénzügyi jutalomban nem részesülhetnek.", + "page-upgrades-bug-bounty-hunting-li-4": "Az Ethereum hibavadászprogram a jutalmak meghatározásánál több tényezőt is figyelembe vesz. A jogosultságról, a pontszámról és a díjjal kapcsolatos feltételekről az Ethereum Alapítvány hibavadászati testülete saját hatáskörben hoz végleges döntést.", + "page-upgrades-bug-bounty-leaderboard": "A teljes ranglista megtekintése", + "page-upgrades-bug-bounty-leaderboard-list": "Hibavadászranglista", + "page-upgrades-bug-bounty-leaderboard-points": "pontszám", + "page-upgrades-bug-bounty-ledger-desc": "Az Ethereum-specifikáció részletesen leírja a végrehajtási és a konszenzusréteg tervezése során figyelembe vett szempontokat.", + "page-upgrades-bug-bounty-ledger-title": "Specifikációs hibák", + "page-upgrades-bug-bounty-meta-description": "Az Ethereum hibavadászprogramjának áttekintése: részvételi feltételek és jutalominformáció.", + "page-upgrades-bug-bounty-meta-title": "Ethereum hibavadászprogram", + "page-upgrades-bug-bounty-not-included": "Hatókörön kívüli", + "page-upgrades-bug-bounty-not-included-desc": "Csak a hatókörön belüli besorolásban szereplő célok vesznek részt a hibavadászprogramban. Ez azt jelenti, hogy például az infrastruktúra – a weblapok, DNS-címek, emailek stb. – nem része a hibavadászatnak. Az ERC20-szerződéshez kapcsolódó hibák általában véve nem vesznek részt a hibavadászatban. Mindazonáltal ilyen esetekben segíthetünk kapcsolatba lépni az érintett felekkel, például a szerzőkkel vagy tőzsdékkel. Az ENS-t az ENS Alapítvány kezeli, és a hibavadászat hatókörén kívül esik. Szintén kívül esnek azok a gyenge pontok, amelyeknél a felhasználónak nyilvánossá kellene tenni egy API-t, mint amilyen a JSON-RPC vagy a Beacon API.", + "page-upgrades-bug-bounty-owasp": "Az OWASP-módszer megtekintése", + "page-upgrades-bug-bounty-points": "Az Ethereum Alapítvány (EF) a következők alapján is jutalmaz:", + "page-upgrades-bug-bounty-points-error": "Hiba történt az adatok betöltése közben… frissítse az oldalt.", + "page-upgrades-bug-bounty-points-exchange": "Pontok beváltása", + "page-upgrades-bug-bounty-points-loading": "Adatok betöltése…", + "page-upgrades-bug-bounty-points-payout-desc": "Az Ethereum Alapítvány ETH-ben vagy DAI-ban fizeti ki az USD-értéket.", + "page-upgrades-bug-bounty-points-point": "1 pont", + "page-upgrades-bug-bounty-points-rights-desc": "Az Ethereum Alapítvány fenntartja az előzetes bejelentés nélküli változtatás jogát.", + "page-upgrades-bug-bounty-points-usd": "2 USD", "page-upgrades-bug-bounty-quality": "A leírás minősége", - "page-upgrades-bug-bounty-quality-desc": ": Magasabb jutalom jár a tiszta, jól megfogalmazott beadványokért.", - "page-upgrades-bug-bounty-quality-fix": "A javítás minősége, ha tartalmazza: Magasabb díj jár az olyan beadványokért, melyek világosan leírják a probléma javítását.", + "page-upgrades-bug-bounty-quality-desc": ": magasabb jutalom jár az egyértelmű, jól megfogalmazott beadványokért.", + "page-upgrades-bug-bounty-quality-fix": "A javítás minősége, ha tartalmazza: magasabb díj jár az olyan beadványokért, amelyek világosan leírják a probléma javításának módját.", "page-upgrades-bug-bounty-quality-repro": "Reprodukálhatóság minősége", - "page-upgrades-bug-bounty-quality-repro-desc": ": Kérjük adj meg teszt kódot, scripteket és részletes instrukciókat. Minél egyszerűbb előteremtenünk és hitelesítenünk a sérülékenységet, annál nagyobb a díj.", - "page-upgrades-bug-bounty-questions": "Kérdések?", - "page-upgrades-bug-bounty-rules": "Szabályok elolvasása", - "page-upgrades-bug-bounty-slogan": "Eth2 bug vadászatok", - "page-upgrades-bug-bounty-specs": "Teljes specifikáció elolvasása", - "page-upgrades-bug-bounty-specs-docs": "Specifikáció dokumentumok", - "page-upgrades-bug-bounty-submit": "Bug beküldése", - "page-upgrades-bug-bounty-submit-desc": "Minden egyes megtalált bugért pontokat kapsz. A pontok mennyisége függ a bug súlyosságától. Az Ethereum Alapítvány (EF) meghatározza a súlyosságot az OWASP módszer alkalmazásával.", - "page-upgrades-bug-bounty-subtitle": "Nyerj akár 50 000 USD-t és egy helyet a ranglétrán Eth2 protokoll és kliens bugok megtalálásával.", - "page-upgrades-bug-bounty-title": "Nyitott a beadványokra", + "page-upgrades-bug-bounty-quality-repro-desc": ": a jutalomjogosultsághoz az elképzelés működését igazolni is kell (Proof of Concept, POC). Kérjük, adja meg a tesztkódot, szkripteket és részletes instrukciókat is. Minél egyszerűbb reprodukálnunk és ellenőriznünk a sérülékenységet, annál nagyobb a jutalom.", + "page-upgrades-bug-bounty-questions": "Kérdése van?", + "page-upgrades-bug-bounty-rules": "Szabályok áttekintése", + "page-upgrades-bug-bounty-slogan": "Hibavadászprogram", + "page-upgrades-bug-bounty-specs": "Konszenzusréteg specifikációk", + "page-upgrades-bug-bounty-execution-specs": "Végrehajtási réteg specifikációk", + "page-upgrades-bug-bounty-specs-docs": "Specifikációdokumentumok", + "page-upgrades-bug-bounty-submit": "Hiba beküldése", + "page-upgrades-bug-bounty-submit-desc": "Minden megtalált és érvényes hibáért jutalmat kap. A kapott jutalom összege a hiba súlyosságától függ. A hibák súlyosságát az OWASP kockázatminősítési modellel összhangban, az Ethereum-hálózatra gyakorolt hatás és bekövetkezés valószínűsége alapján számítjuk ki.", + "page-upgrades-bug-bounty-subtitle": "Keressen akár 250 000 USD-t, és kerüljön fel a ranglistára – találjon olyan hibát a protokollban, a kliensben vagy a Solidityben, amely hatással van az Ethereum-hálózatra.", + "page-upgrades-bug-bounty-title": "Fogadjuk a beadványokat", "page-upgrades-bug-bounty-title-1": "Beacon Chain", - "page-upgrades-bug-bounty-title-2": "Fork választás", + "page-upgrades-bug-bounty-title-2": "Elágazásválasztás", "page-upgrades-bug-bounty-title-3": "Solidity letéti szerződés", - "page-upgrades-bug-bounty-title-4": "Peer-to-peer hálózatok", - "page-upgrades-bug-bounty-type-1": "biztonságot/véglegesítést megtörő bugok.", - "page-upgrades-bug-bounty-type-2": "szolgáltatásmegtagadás (DOS) vektorok", - "page-upgrades-bug-bounty-type-3": "inkonzisztencia a feltételezésekben, például olyan szituációk, ahol helyesen cselekvő validátorok kerülnek megvágásra.", - "page-upgrades-bug-bounty-type-4": "számítási vagy paraméter inkonzisztenciák.", - "page-upgrades-bug-bounty-types": "Bug típusok", - "page-upgrades-bug-bounty-validity": "Érvényes bugok", - "page-upgrades-bug-bounty-validity-desc": "Ez a bug vadászati program az Eth2 Beacon Chain core specifikációban és a Prysm, Lighthouse, valamint Teku kliens implementációkban található bugokra fókuszál.", + "page-upgrades-bug-bounty-title-4": "Közvetítőmentes (peer-to-peer) hálózatok", + "page-upgrades-bug-bounty-type-1": "Biztonságot/véglegességet megtörő hibák", + "page-upgrades-bug-bounty-type-2": "Szolgáltatásmegtagadási (DOS) vektorok", + "page-upgrades-bug-bounty-type-3": "Inkonzisztencia a feltételezésekben, például olyan szituációk, ahol a becsületesen eljáró validátorok letétjét megvághatja a rendszer", + "page-upgrades-bug-bounty-type-4": "Számítási vagy paraméterinkonzisztenciák", + "page-upgrades-bug-bounty-types": "Hibatípusok", + "page-upgrades-bug-bounty-validity": "Hatáskörön belül", + "page-upgrades-bug-bounty-validity-desc": "A hibavadászprogramunk teljesen felöleli a folyamatot: a protokollok (például a blokklánckonszenzus-modell, az átutalási és p2p-protokollok, proof-of-stake stb.) stabilitásától és a protokoll/megvalósítás megfelelőségétől kezdve a hálózatbiztonságig és a konszenzusintegritásig. A klasszikus kliensbiztonság és a kriptográfiai primitívek (blokktitkosítók) biztonsága egyaránt része a programnak. Kétség esetén kérdéseit a bounty@ethereum.org címre várjuk.", "page-upgrades-bug-bounty-card-critical": "Kritikus", - "page-upgrades-bug-bounty-card-critical-risk": "Kritikus kockázatú bug beadása", + "page-upgrades-bug-bounty-card-critical-risk": "Kritikus kockázatú hiba beadása", "page-upgrades-bug-bounty-card-h2": "Közepes", "page-upgrades-bug-bounty-card-high": "Magas", - "page-upgrades-bug-bounty-card-high-risk": "Magas kockázatú bug beadása", - "page-upgrades-bug-bounty-card-label-1": "1000 pontig", - "page-upgrades-bug-bounty-card-label-2": "2000 DAI-ig", - "page-upgrades-bug-bounty-card-label-3": "5000 pontig", - "page-upgrades-bug-bounty-card-label-4": "10 000 DAI-ig", - "page-upgrades-bug-bounty-card-label-5": "10 000 pontig", - "page-upgrades-bug-bounty-card-label-6": "20 000 DAI-ig", - "page-upgrades-bug-bounty-card-label-7": "25 000 pontig", - "page-upgrades-bug-bounty-card-label-8": "50 000 DAI-ig", - "page-upgrades-bug-bounty-card-li-1": "Kisebb hatás, közepes valószínűség", - "page-upgrades-bug-bounty-card-li-2": "Közepes behatás, alacsony valószínűség", - "page-upgrades-bug-bounty-card-li-3": "Magas hatás, alacsony valószínűség", + "page-upgrades-bug-bounty-card-high-risk": "Magas kockázatú hiba beadása", + "page-upgrades-bug-bounty-card-label-1": "legfeljebb 1000 pont", + "page-upgrades-bug-bounty-card-label-2": "legfeljebb 2000 USD", + "page-upgrades-bug-bounty-card-label-3": "legfeljebb 5000 pont", + "page-upgrades-bug-bounty-card-label-4": "legfeljebb 10 000 USD", + "page-upgrades-bug-bounty-card-label-5": "legfeljebb 10 000 pont", + "page-upgrades-bug-bounty-card-label-6": "legfeljebb 50 000 USD", + "page-upgrades-bug-bounty-card-label-7": "legfeljebb 25 000 pont", + "page-upgrades-bug-bounty-card-label-8": "legfeljebb 250 000 USD", + "page-upgrades-bug-bounty-card-li-1": "Kicsi hatás, közepes valószínűség", + "page-upgrades-bug-bounty-card-li-2": "Közepes hatás, alacsony valószínűség", + "page-upgrades-bug-bounty-card-li-3": "Nagy hatás, alacsony valószínűség", "page-upgrades-bug-bounty-card-li-4": "Közepes hatás, közepes valószínűség", - "page-upgrades-bug-bounty-card-li-5": "Alacsony hatás, magas valószínűség", - "page-upgrades-bug-bounty-card-li-6": "Magas hatás, közepes valószínűség", + "page-upgrades-bug-bounty-card-li-5": "Kicsi hatás, magas valószínűség", + "page-upgrades-bug-bounty-card-li-6": "Nagy hatás, közepes valószínűség", "page-upgrades-bug-bounty-card-li-7": "Közepes hatás, magas valószínűség", - "page-upgrades-bug-bounty-card-li-8": "Magas hatás, magas valószínűség", + "page-upgrades-bug-bounty-card-li-8": "Nagy hatás, magas valószínűség", "page-upgrades-bug-bounty-card-low": "Alacsony", - "page-upgrades-bug-bounty-card-low-risk": "Alacsony kockázatú bug beadása", - "page-upgrades-bug-bounty-card-medium-risk": "Közepes kockázatú bug beadása", + "page-upgrades-bug-bounty-card-low-risk": "Alacsony kockázatú hiba beadása", + "page-upgrades-bug-bounty-card-medium-risk": "Közepes kockázatú hiba beadása", "page-upgrades-bug-bounty-card-subheader": "Súlyosság", "page-upgrades-bug-bounty-card-subheader-2": "Példa", - "page-upgrades-bug-bounty-card-text": "Egy támadó néha egy csomópontot olyan állapotba hozhat, ami miatt a validátor által elvégzett minden száz igazolásból egy kiesik", - "page-upgrades-bug-bounty-card-text-1": " Egy támadó sikeresen végrehajthat \"eclipse\" támadásokat olyan csomópontokon, melyek 4 vezető nulla bájtos peer-idvel rendelkeznek", - "page-upgrades-bug-bounty-card-text-2": "Van egy konszenzus bug két kliens között, de nehéz vagy nem praktikus a támadó számára beindítani a támadást.", - "page-upgrades-bug-bounty-card-text-3": " Van egy konszenzus bug két kliens között és a támadó számára triviális beindítani a támadást.", - "page-upgrades-question-title": "Gyakran ismételt kérdések" + "page-upgrades-bug-bounty-card-text": "A támadó néha olyan állapotba tud hozni egy csomópontot, amely miatt a csomópont egy validátor által kiadott minden 100 tanúsításból egyet kihagy.", + "page-upgrades-bug-bounty-card-text-1": "A támadó sikeres „eclipse” vagy elszigetelési támadásokat tud végrehajtani olyan csomópontokon, amelyek peer-azonosítójának elején négy nulla áll", + "page-upgrades-bug-bounty-card-text-2": "A támadó sikeresen particionálni tudja a hálózat nagy részeit, és egy támadó számára triviális dolog kiváltani a sebezhetőséget.", + "page-upgrades-bug-bounty-card-text-3": "A támadó képes sikeres távoli kódvégrehajtást folytatni egy többségi kliensen, és egy támadó számára triviális dolog kiváltani a sebezhetőséget.", + "page-upgrades-question-title": "Gyakran ismételt kérdések", + "bug-bounty-faq-q1-title": "Hogy néz ki egy jó sebezhetőségi beadvány?", + "bug-bounty-faq-q1-contentPreview": "Tekintsen meg egy valódi példát a minőségi sebezhetőségi beadványra.", + "bug-bounty-faq-q1-content-1": "Leírás: Távoli szolgáltatásmegtabadás a nem validáló blokkokat felhasználva", + "bug-bounty-faq-q1-content-2": "Támadási szcenárió: Egy támadó olyan blokkokat tud küldeni, amelyeket nagy számítási kapacitást igényelnek (a maximális gasLimit-et), de nem rendelkeznek proof-of-work-kel. Ha a támadó állandóan küldi ezeket, akkor az áldozatul eső csomópontot 100% CPU használatra kényszeríti.", + "bug-bounty-faq-q1-content-3": "Hatás: A támadó visszaél a CPU használatta a távoli csomópontokon, mely valószínleg teljes szolgálatmegtagadást (DoS) eredményez.", + "bug-bounty-faq-q1-content-4": "Komponensek: Go kliens v0.6.8 verzió", + "bug-bounty-faq-q1-content-5": "Reprodukálás: Küldjön egy blokkot a Go csomópontnak, amely sok tranzakciót tartalmaz, de nincs érvényes proof-of-work.", + "bug-bounty-faq-q1-content-6": "Részletek: A blokkok a Process(Block, dontReact) módszerrel validálnak. Ez a módszer komoly CPU-intenzív feladatokat végez, mint a tranzakciók végrehajtása (sm.ApplyDiff), és utána igazolja a proof-of-work-öt (sm.ValidateBlock()). Ez lehetővé teszi a támadónak, hogy magas számítási kapacitású blokkokat küldjön (a maximális gasLimit-et), de ne legyen proof-of-work. Ha a támadó állandóan küldi ezeket a blokkokat, akkor az áldozatul eső csomópontot 100% CPU használatra kényszeríti.", + "bug-bounty-faq-q1-content-7": "Megoldás: Az ellenőrzések sorrendje legyen fordítva.", + "bug-bounty-faq-q2-title": "A hibavadászprogram egy adott időszakra szól?", + "bug-bounty-faq-q2-contentPreview": "Nem.", + "bug-bounty-faq-q2-content-1": "Jelenleg nincs a programnak egy végidőpontja. A legfrissebb hírekért tekintse meg az Ethereum Alapítvány blogot.", + "bug-bounty-faq-q3-title": "Hogyan fizetik ki a jutalmakat?", + "bug-bounty-faq-q3-contentPreview": "A jutalmakat ETH-ben vagy DAI-ban fizetik ki.", + "bug-bounty-faq-q3-content-1": "A jutalmakat ETH-ben vagy DAI-ban fizetik ki, miután a beadványt validálták, általában néhány nap múlva. A helyi szabályozások miatt Önnek igazolnia kell a személyazonosságát. Emellett szükség van az ETH címre is.", + "bug-bounty-faq-q4-title": "Eladományozhatom a jutalmamat?", + "bug-bounty-faq-q4-contentPreview": "Igen!", + "bug-bounty-faq-q4-content-1": "Odaadhatjuk a jutalmát egy Ön által választott, megalapozott jótékonysági szervezetnek.", + "bug-bounty-faq-q5-title": "Jelentettem egy problémát / sebezhetőséget, de nem kaptam rá választ.", + "bug-bounty-faq-q5-contentPreview": "Kérjük, hogy adjon néhány napot, hogy válaszoljunk a beadványára.", + "bug-bounty-faq-q5-content-1": "Az a célunk, hogy minél gyorsabban válaszoljunk a beadványokra. Kérjük, hogy lépjen velünk kapcsolatba a bounty@ethereum.org emailcímen, ha egy vagy töb nap alatt nem érkezik válasz.", + "bug-bounty-faq-q6-title": "Anonim szeretnék maradni / Nem szeretném, hogy a nevem a ranglistán megjelenjen.", + "bug-bounty-faq-q6-contentPreview": "Megteheti, de emaitt talán nem lesz jogosult a díjakra.", + "bug-bounty-faq-q6-content-1": "Az anonim módon vagy álnéven beadott kérvények rendben vannak, de az ETH/DAI jutalmakat nem lehet ily módon megszerezni. Ezekhez szükség van a valódi névre és a személyazonosság igazolására. A jutalom eladományozásához ugyanakkor nem kell igazolni semmit.", + "bug-bounty-faq-q6-content-2": "Kérjük, hogy jelezze, ha a nevét / becenevét nem szeretné látni a ranglistán.", + "bug-bounty-faq-q7-title": "Mit jelentenek a ranglistán szereplő pontok?", + "bug-bounty-faq-q7-contentPreview": "Minden megtalált sebezhetőség / probléma egy adott pontszámot kap", + "bug-bounty-faq-q7-content-1": "Minden megtalált sebezhetőség / probléma egy adott pontszámot kap. A hibavadászok a ranglistán a teljes pontszámukkal vannak besorolva.", + "bug-bounty-faq-q8-title": "Rendelkeznek PGP kulccsal?", + "bug-bounty-faq-q8-contentPreview": "Igen, a további információkért nyissa le.", + "bug-bounty-faq-q8-content-1": "Kérjük, használja a AE96 ED96 9E47 9B00 84F3 E17F E88D 3334 FA5F 6A0A kódot", + "bug-bounty-faq-q8-PGP-key": "PGP kulcs" } diff --git a/src/intl/hu/page-index.json b/src/intl/hu/page-index.json index e816555fc01..bc039ebaa1d 100644 --- a/src/intl/hu/page-index.json +++ b/src/intl/hu/page-index.json @@ -27,7 +27,7 @@ "page-index-what-is-ethereum-image-alt": "Egy bazárba kukucskáló ember képe, amely az Ethereumot reprezentálja.", "page-index-defi": "Igazságosabb pénzügyi rendszer", "page-index-defi-description": "Ma emberek milliárdjai nem tudnak bankszámlát nyitni, mások fizetéseit blokkolják. Az Ethereum decentralizált pénzügyi (DeFi) rendszere soha nem áll meg vagy diszkriminál. Csupán internetkapcsolattal pénzt küldhet, fogadhat, kölcsönözhet, kamatoztathat és akár továbbíthat is bárhol a világon.", - "page-index-defi-button": "Fedezze fel a DeFit", + "page-index-defi-button": "Fedezze fel a DeFi-t", "page-index-defi-image-alt": "ETH-szimbólumot kínáló kezek illusztrációja.", "page-index-internet": "Nyílt internet", "page-index-internet-description": "Manapság úgy férhetünk hozzá az „ingyenes” internetszolgáltatásokhoz, ha átadjuk a személyes adataink feletti ellenőrzést. Az Ethereum-szolgáltatások alapértelmezés szerint szabadon használhatók – csak egy pénztárca szükséges hozzá. Ez ingyenes és könnyen beállítható, Ön irányíthatja, és személyes adatok nélkül működik.", @@ -54,8 +54,8 @@ "page-index-network-stats-total-eth-staked-explainer": "A jelenleg letétbe helyezett és a hálózatot biztosító ETH teljes mennyisége.", "page-index-network-stats-tx-day-description": "A mai tranzakciók", "page-index-network-stats-tx-day-explainer": "A hálózaton sikeresen feldolgozott tranzakciók száma az elmúlt 24 órában.", - "page-index-network-stats-value-defi-description": "A DeFiben zárolt érték (USD)", - "page-index-network-stats-value-defi-explainer": "A decentralizált pénzügyi (DeFi-) alkalmazásokban, az Ethereum digitális gazdaságban található pénzmennyiség.", + "page-index-network-stats-value-defi-description": "A DeFi-ban zárolt érték (USD)", + "page-index-network-stats-value-defi-explainer": "A decentralizált pénzügyi (DeFi) alkalmazásokban, az Ethereum digitális gazdaságban található pénzmennyiség.", "page-index-network-stats-nodes-description": "Csomópontok", "page-index-network-stats-nodes-explainer": "Az Ethereumot több ezer önkéntes működteti szerte a világon, csomópontok formájában.", "page-index-touts-header": "Fedezze fel az ethereum.org oldalt", From 867f1c250a4d5f98abac7db5fd9878deb89e391a Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 16:38:36 -0700 Subject: [PATCH 374/478] Indonesian import Feb 20 (Essentials, Use Ethereum, Use cases, --- .../id/decentralized-identity/index.md | 6 +- public/content/translations/id/desci/index.md | 4 +- public/content/translations/id/refi/index.md | 2 +- src/intl/id/page-developers-index.json | 2 +- src/intl/id/page-gas.json | 64 +++++++++++++++++++ src/intl/id/page-get-eth.json | 37 +++++++---- src/intl/id/page-languages.json | 14 ++-- src/intl/id/page-layer-2.json | 1 + src/intl/id/page-wallets-find-wallet.json | 9 +-- 9 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 src/intl/id/page-gas.json diff --git a/public/content/translations/id/decentralized-identity/index.md b/public/content/translations/id/decentralized-identity/index.md index f74fbd257db..4d20538b14a 100644 --- a/public/content/translations/id/decentralized-identity/index.md +++ b/public/content/translations/id/decentralized-identity/index.md @@ -151,7 +151,7 @@ Identitas terdesentralisasi dapat membantu menciptakan komunitas daring yang beb Serangan Sybil mengacu pada individu manusia yang menipu suatu sistem untuk berpikir bahwa mereka adalah beberapa orang untuk meningkatkan pengaruhnya. [Aplikasi grant-giving](https://gitcoin.co/grants/) yang menggunakan [voting kuadrat](https://www.radicalxchange.org/concepts/plural-voting/) rentan terhadap serangan Sybil ini karena nilai grant meningkat ketika lebih banyak orang memilihnya, mendorong pengguna untuk membagi kontribusi mereka mewakili banyak identitas. Identitas terdesentralisasi membantu mencegah hal ini dengan meningkatkan bobot pada setiap peserta untuk membuktikan bahwa mereka benar-benar manusia, meski sering kali tanpa harus mengungkapkan informasi pribadi tertentu. -## Identitas terdesentralisasi {#use-decentralized-identity} +## Gunakan identitas terdesentralisasi {#use-decentralized-identity} Ada banyak proyek ambisius yang menggunakan Ethereum sebagai landasan untuk solusi identitas terdesentralisasi, diantaranya: @@ -161,6 +161,7 @@ Ada banyak proyek ambisius yang menggunakan Ethereum sebagai landasan untuk solu - **[Proof of Humanity (PoH)](https://www.proofofhumanity.id)** - _Bukti Kemanusiaan adalah sistem verifikasi identitas sosial yang dibangun di Ethereum._ - **[BrightID](https://www.brightid.org/)** - _Jaringan identitas sosial open source yang terdesentralisasi, berupaya mereformasi verifikasi identitas melalui pembuatan dan analisis grafik sosial._ - **[Proof-of-personhood Passport](https://proofofpersonhood.com/)** - _Aggregator identitas digital terdesentralisasi._ +- **[walt.id](https://walt.id)** — _Infrastruktur identitas dan dompet sumber terbuka terdesentralisasi yang memungkinkan pengembang dan organisasi mengoptimalkan manfaat identitas mandiri dan NFT/SBT._ ## Bacaan lebih lanjut {#further-reading} @@ -170,6 +171,7 @@ Ada banyak proyek ambisius yang menggunakan Ethereum sebagai landasan untuk solu - [Apa itu Ethereum ERC725? Manajemen Identitas Mandiri di Rantai Blok](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ - [Bagaimana Rantai Blok Dapat Memecahkan Masalah Identitas Digital](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ - [Apa Itu Identitas Terdesentralisasi Dan Mengapa Anda Harus Peduli?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ +- Pendahuluan tentang Identitas Terdesentralisasi — _Dominik Beron_ ### Video {#videos} @@ -177,9 +179,11 @@ Ada banyak proyek ambisius yang menggunakan Ethereum sebagai landasan untuk solu - [Masuk dengan Ethereum dan Identitas Terdesentralisasi dengan Ceramic, IDX, React, dan 3ID Connect](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Tutorial YouTube tentang membangun sistem manajemen identitas untuk membuat, membaca, dan memperbarui profil pengguna menggunakan dompet Ethereum mereka oleh Nader Dabit_ - [BrightID - Identitas Terdesentralisasi di Ethereum](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Episode podcast Bankless membahas BrightID, solusi identitas terdesentralisasi untuk Ethereum_ - [Internet Di Luar Rantai: Identitas yang terdesentralisasi & Kredensial yang Dapat Diverifikasi](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Presentasi EthDenver 2022 oleh Evin McMullen +- [Penjelasan tentang Kredensial Terverifikasi](https://www.youtube.com/watch?v=ce1IdSr-Kig) - Video penjelasan di YouTube dengan demo oleh Tamino Baumann ### Komunitas {#communities} - [Aliansi ERC-725 di GitHub](https://github.com/erc725alliance) — _Pendukung standar ERC725 untuk mengelola identitas pada rantai blok Ethereum_ - [Server Discord SpruceID](https://discord.com/invite/Sf9tSFzrnt) — _Komunitas untuk para penggemar dan pengembang yang bekerja pada sign-in dengan Ethereum_ - [Lab Veramo](https://discord.gg/sYBUXpACh4) — _Komunitas developer yang berkontribusi membangun kerangka kerja untuk memungkinkan verifikasi data untuk aplikasi_ +- [wailt.id](https://discord.com/invite/AW8AgqJthZ) — _Komunitas pengembang dan pembuat sistem mengerjakan berbagai kasus penggunaan identitas terdesentralisasi pada berbagai industri_ diff --git a/public/content/translations/id/desci/index.md b/public/content/translations/id/desci/index.md index 6cf927d6e1a..2fe1718e641 100644 --- a/public/content/translations/id/desci/index.md +++ b/public/content/translations/id/desci/index.md @@ -18,7 +18,7 @@ Ilmu pengetahuan terpusat (DeSci) adalah gerakan yang bertujuan untuk membangun DeSci bertujuan untuk menciptakan ekosistem di mana para ilmuwan mendapatkan insentif untuk berbagi penelitian mereka dan menerima pengakuan atas karya mereka, sambil memungkinkan siapa pun untuk dengan mudah mengakses dan berkontribusi pada penelitian tersebut. DeSci membuat gagasan bahwa pengetahuan ilmiah harus dapat dilihat oleh semua orang dan bahwa proses penelitian ilmiah harus transparan. DeSci menciptakan model penelitian ilmiah yang lebih terdesentralisasi dan disebarkan, sehingga lebih tahan terhadap sensor dan kontrol oleh otoritas pusat. DeSci berharap menciptakan lingkungan di mana gagasan baru dan tidak konvensional dapat berkembang dengan desentralisasi akses ke pendanaan, perangkat ilmiah, dan saluran komunikasi. -Sains terdesentralisasi memungkinkan sumber pendanaan yang lebih beragam (dari [DAO](/dao/), [sumbangan kuadratik](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) hingga crowdfunding dan lainnya), akses data dan metode yang lebih mudah diakses, dan memberikan insentif untuk produktibilitas. +Dengan ilmu terdesentralisasi, dapat diperoleh sumber pendanaan yang lebih beragam (dari [DAO](/dao/), [sumbangan kuadratik](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) hingga pendanaan kolektif dan lainnya), data dan metode yang lebih mudah diakses, serta dengan memberikan insentif untuk keterulangan. ### Juan Benet - Gerakan DeSci @@ -103,7 +103,7 @@ Jelajahi proyek-proyek dan bergabunglah dengan komunitas DeSci. - [OceanDAO: Pendanaan yang diatur oleh DAO untuk ilmu pengetahuan terkait data](https://oceanprotocol.com/dao) - [Opscientia: alur kerja ilmu pengetahuan terbuka dan terdesentralisasi](https://opsci.io/research/) - [LabDAO: Melipat protein secara in-silico](https://alphafodl.vercel.app/) -- [Bio.xyz: dapatkan pendanaan untuk proyek bioteknologi atau proyek DeSci Anda melalui DAO](https://www.molecule.to/) +- [Bio.xyz: dapatkan pendanaan untuk proyek bioteknologi atau proyek DeSci Anda melalui DAO](https://www.bio.xyz/) - [ResearchHub: Unggah hasil ilmiah dan terlibat dalam percakapan dengan rekan-rekan sejawat](https://www.researchhub.com/) - [VitaDAO: Terima pendanaan melalui perjanjian penelitian yang disponsori untuk penelitian kelangsungan hidup](https://www.vitadao.com/) - [Fleming Protocol: ekonomi data sumber terbuka yang mendukung penemuan biomedis kolaboratif](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) diff --git a/public/content/translations/id/refi/index.md b/public/content/translations/id/refi/index.md index 1a733fa04fa..cfe9f4bc43f 100644 --- a/public/content/translations/id/refi/index.md +++ b/public/content/translations/id/refi/index.md @@ -18,7 +18,7 @@ summaryPoint3: Alat untuk meningkatkan skala aset manfaat ekologi secara drastis Sebaliknya, ReFi bertujuan untuk memecahkan masalah lingkungan, komunal, atau sosial dengan menciptakan siklus regeneratif. Sistem ini menciptakan nilai bagi para partisipan-partisipan sekaligus memberi manfaat bagi ekosistem dan masyarakat. -Salah satu dasar dari ReFi adalah konsep ekonomi regeneratif yang dipelopori oleh John Fullerton dari [Capital Institute](https://capitalinstitute.org). Dia mengusulkan delapan prinsip yang saling berhubungan yang mendasari kesehatan sistemik: +Salah satu fondasi ReFi adalah konsep ekonomi regeneratif yang dirintis oleh John Fullerton dari Capital Institute. Ia mengusulkan [delapan prinsip saling terkait](https://capitalinstitute.org/8-principles-regenerative-economy/) yang melandasi kesehatan sistemis: ![Delapan prinsip yang saling terhubung](./refi-regenerative-economy-diagram.png) diff --git a/src/intl/id/page-developers-index.json b/src/intl/id/page-developers-index.json index a9eb6098f7b..519f6c22d13 100644 --- a/src/intl/id/page-developers-index.json +++ b/src/intl/id/page-developers-index.json @@ -58,7 +58,7 @@ "page-developers-networks-desc": "Gambaran umum Jaringan Utama dan jaringan pengujian", "page-developers-networks-link": "Jaringan", "page-developers-node-clients-desc": "Bagaimana cara blok dan transaksi diverifikasi di jaringan", - "page-developers-node-clients-link": "Node dan klien", + "page-developers-node-clients-link": "Simpul dan Klien", "page-developers-oracle-desc": "Memasukkan data off-chain ke dalam kontrak pintar Anda", "page-developers-oracles-link": "Oracle", "page-developers-play-code": "Bermain dengan kode", diff --git a/src/intl/id/page-gas.json b/src/intl/id/page-gas.json new file mode 100644 index 00000000000..74ec5ebbda0 --- /dev/null +++ b/src/intl/id/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Biaya gas pada Ethereum: Bagaimana cara kerjanya?", + "page-gas-meta-description": "Pelajari tentang gas di Ethereum: bagaimana cara kerjanya dan cara mengurangi biaya gas yang dibayar", + "page-gas-hero-title": "Biaya gas", + "page-gas-hero-header": "Biaya jaringan", + "page-gas-hero-button-1-content": "Apa itu gas?", + "page-gas-hero-subtitle-1": "Biaya jaringan di Ethereum disebut gas.", + "page-gas-hero-subtitle-2": "Gas adalah bahan bakar yang menggerakkan Ethereum.", + "page-gas-summary-title": "Ringkasan", + "page-gas-summary-item-1": "Setiap transaksi di Ethereum memerlukan suatu bentuk pembayaran dalam jumlah kecil untuk prosesnya", + "page-gas-summary-item-2": "Berbagai biaya ini dikenal sebagai biaya ‘gas'", + "page-gas-summary-item-3": "Biaya gas berubah sesuai dengan kepadatan jaringan", + "page-gas-what-are-gas-fees-header": "Apa itu biaya gas?", + "page-gas-what-are-gas-fees-text-1": "Bayangkan Ethereum sebagai jaringan komputer besar yang menjadi tempat orang melakukan tugas seperti mengirim pesan atau menjalankan program. Seperti halnya di dunia nyata, berbagai tugas tersebut membutuhkan energi agar dapat diselesaikan.", + "page-gas-what-are-gas-fees-text-2": "Pada Ethereum, setiap tindakan komputasional memiliki harga \"gas\" yang telah ditetapkan. Biaya gas Anda adalah jumlah biaya dari berbagai tindakan dalam transaksi Anda. Saat Anda mengirim transaksi atau menjalankan kontrak pintar, Anda membayar biaya gas untuk memprosesnya.", + "page-gas-how-do-i-pay-less-gas-header": "Bagaimana cara mengurangi biaya gas yang dibayar?", + "page-gas-how-do-i-pay-less-gas-text": "Meskipun biaya lebih tinggi terkadang tak dapat dihindari di Ethereum, ada beberapa strategi yang dapat digunakan untuk mengurangi biaya:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Atur waktu transaksi Anda", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Seperti halnya bepergian di luar jam sibuk akan lebih sepi dan terjangkau biayanya, Ethereum juga umumnya lebih murah ketika wilayah Amerika Utara sedang dalam waktu tidur.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Tunggu hingga biaya gas turun", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Harga gas naik dan turun setiap dua belas detik berdasarkan seberapa tinggi tingkat aktivitas di Ethereum. Saat harga gas sedang tinggi, menunggu beberapa menit lagi sebelum melakukan transaksi dapat menurunkan biaya yang dibayarkan secara signifikan.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Menggunakan lapisan ke-2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Rantai Lapisan-2 dikembangkan berdasarkan Ethereum sehingga menawarkan biaya lebih rendah dan menangani lebih banyak transaksi. Rantai tersebut adalah pilihan penghematan biaya yang baik untuk transaksi yang tidak harus dilakukan pada jaringan utama Ethereum.", + "page-gas-try-layer-2": "Coba lapisan ke-2", + "page-gas-what-causes-high-gas-fees-header": "Apa yang menyebabkan tingginya biaya gas?", + "page-gas-what-causes-high-gas-fees-text-1": "Setiap kali jumlah komputasi (gas) di Ethereum melebihi ambang tertentu, biaya gas mulai meningkat. Makin jauh ambang ini dilampaui, makin cepat pula peningkatan biaya gas.", + "page-gas-what-causes-high-gas-fees-text-2": "Peningkatan biaya dapat disebabkan oleh hal-hal seperti dapps atau NFT yang populer, peningkatan perdagangan di DEX secara berkala, atau lonjakan tinggi aktivitas pengguna pada jam sibuk.", + "page-gas-what-causes-high-gas-fees-text-3": "Pengembang di Ethereum seharusnya memperhatikan hal ini dengan mengoptimalkan penggunaan kontrak pintarnya sebelum menyebarkannya. Jika kontrak pintar dengan penulisan yang buruk digunakan oleh banyak orang, kontrak tersebut akan menghabiskan lebih banyak gas dan dapat mengakibatkan kepadatan jaringan tanpa disengaja.", + "page-gas-want-to-dive-deeper": "Ingin mengetahui lebih mendalam?", + "page-gas-check-out-the-developer-docs": "Lihat dokumentasi pengembang.", + "page-gas-attack-of-the-cryptokitties-header": "Serangan Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "Pada bulan November 2017, proyek CryptoKitties yang populer diluncurkan. Lonjakan popularitasnya yang cepat menyebabkan kepadatan jaringan yang signifikan dan biaya gas yang luar biasa tinggi. Tantangan yang ditimbulkan oleh CryptoKitties mendorong kebutuhan yang mendesak untuk menemukan solusi peningkatan skala Ethereum.", + "page-gas-why-do-we-need-gas-header": "Mengapa kita membutuhkan gas?", + "page-gas-why-do-we-need-gas-text": "Gas adalah elemen kritis dalam menjaga keamanan Ethereum dan memproses transaksi. Gas membantu dalam banyak hal:", + "page-gas-benefits-1-description": "Gas menjaga ketahanan Ethereum dari serangan Sybil dengan mencegah para penjahat memadati jaringan dengan aktivitas yang curang.", + "page-gas-benefits-2-description": "Karena komputasi membutuhkan gas, tindakan mengirim spam ke Ethereum dengan transaksi bernilai tinggi, baik secara tidak sengaja maupun dengan maksud jahat, tidak mendapat insentif finansial.", + "page-gas-benefits-3-description": "Batas keras untuk jumlah komputasi yang boleh dilakukan dalam satu kesempatan akan mencegah meluapnya kapasitas Ethereum sehingga membantu memastikan ketersediaan jaringan untuk diakses.", + "page-gas-how-is-gas-calculated-header": "Bagaimana gas dihitung?", + "page-gas-advanced": "Tingkat Lanjut", + "page-gas-how-is-gas-calculated-text-1": "Jumlah biaya gas yang Anda bayar terdiri dari beberapa bagian:", + "page-gas-how-is-gas-calculated-item-1": "Biaya dasar: biaya yang ditetapkan oleh jaringan yang harus dibayarkan untuk sebuah transaksi", + "page-gas-how-is-gas-calculated-item-2": "Biaya prioritas: tip opsional untuk memberikan insentif pada operator simpul agar memasukkan transaksi Anda", + "page-gas-how-is-gas-calculated-item-3": "Unit gas yang digunakan*: Ingat pernyataan sebelumnya bahwa gas menunjukkan komputasi? Tindakan yang lebih kompleks, seperti berinteraksi dengan kontrak pintar, menggunakan lebih banyak gas daripada tindakan yang sederhana, seperti mengirimkan transaksi.", + "page-gas-how-is-gas-calculated-list-item-1": "* Lihat Gambar 1 untuk melihat seberapa banyak gas yang digunakan oleh berbagai jenis transaksi", + "page-gas-how-is-gas-calculated-text-2": "Rumus untuk menghitung biaya gas adalah unit gas yang digunakan * (biaya dasar + biaya prioritas). Sebagian besar dompet akan menghitung penggunaan gas dan menampilkannya dengan cara yang lebih mudah dipahami.", + "page-gas-table-figure": "Gambar 1: Penggunaan gas berdasarkan jenis transaksi", + "page-gas-table-header-1": "Jenis transaksi", + "page-gas-table-header-2": "Unit gas yang digunakan", + "page-gas-table-item-1-transaction-type": "Mengirim ETH", + "page-gas-table-item-2-transaction-type": "Mengirim token ERC-20", + "page-gas-table-item-3-transaction-type": "Transfer dan NFT", + "page-gas-table-item-4-transaction-type": "Menukarkan di Uniswap", + "page-gas-faq-header": "Pertanyaan umum", + "page-gas-faq-question-1-q": "Siapa yang menerima pembayaran biaya gas dalam transaksi saya?", + "page-gas-faq-question-1-a-1": "Sebagian besar biaya gas—biaya dasar— dimusnahkan oleh protokol (dibakar). Biaya prioritas, jika disertakan dalam transaksi Anda, akan diberikan ke validator yang mengajukan transaksi Anda.", + "page-gas-faq-question-1-a-2": "Anda dapat membaca deskripsi terperinci tentang proses ini di dokumentasi pengembang gas.", + "page-gas-faq-question-2-q": "Apakah saya perlu membayar gas di ETH?", + "page-gas-faq-question-2-a-1": "Ya. Semua biaya gas di Ethereum harus dibayar menggunakan mata uang asli ETH.", + "page-gas-faq-question-2-a-2": "Selengkapnya tentang ETH", + "page-gas-faq-question-3-q": "Apa itu gwei?", + "page-gas-faq-question-3-a-1": "Pada sebagian besar dompet atau pelacak gas, harga gas akan menggunakan denominasi ‘gwei’.", + "page-gas-faq-question-3-a-2": "Gwei hanyalah sebuah unit ETH yang lebih kecil, seperti halnya pecahan sen pada dolar, dengan perbedaan bahwa 1 ETH sama dengan 1 miliar gwei. Gwei berguna jika menyangkut jumlah ETH yang sangat kecil.", + "page-gas-use-layer-2": "Menggunakan lapisan ke-2" +} diff --git a/src/intl/id/page-get-eth.json b/src/intl/id/page-get-eth.json index af36abbac4a..cd2c84cb861 100644 --- a/src/intl/id/page-get-eth.json +++ b/src/intl/id/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Bursa adalah bisnis yang memungkinkan Anda membeli kripto menggunakan mata uang tradisional. Mereka memiliki wewenang atas ETH yang Anda beli sampai Anda mengirimkannya ke dompet yang Anda kendalikan.", "page-get-eth-checkout-dapps-btn": "Cari tahu dapp", "page-get-eth-community-safety": "Postingan komunitas terkait keamanan", - "page-get-eth-description": "Ethereum dan ETH tidak dikendalikan oleh pemerintah atau perusahaan mana pun - mereka terdesentralisasi. Ini berarti ETH terbuka untuk digunakan semua orang.", + "page-get-eth-description": "Ethereum tidak dikendalikan oleh satu organisasi tunggal - tetapi terdesentralisasi.", "page-get-eth-dex": "Pertukaran Terdesentralisasi (DEX)", - "page-get-eth-dex-desc": "Jika Anda menginginkan kontrol lebih, beli ETH peer-to-peer. Dengan DEX, Anda dapat berdagang tanpa memberikan kendali atas dana Anda ke perusahaan terpusat.", + "page-get-eth-dex-desc": "Jika menginginkan kendali lebih, beli ETH dengan menggunakan kontrak pintar. Dengan DEX, Anda dapat melakukan perdagangan aset digital tanpa perlu memberikan kendali atas dana Anda kepada perusahaan yang terpusat.", + "page-get-eth-peers": "Terima ETH dari rekan sejawat Anda", + "page-get-eth-peers-desc": "Setelah memiliki akun Ethereum, Anda hanya perlu membagikan alamat Anda untuk mulai mengirim dan menerima ETH (dan token lainnya) secara peer-to-peer.", + "page-get-eth-staking": "Imbalan penaruhan", + "page-get-eth-staking-desc": "Jika sudah memiliki ETH, Anda dapat memperolehnya lagi dengan menjalankan simpul validator. Anda dibayar dalam ETH untuk melakukan pekerjaan verifikasi ini.", + "page-get-eth-earn": "Dapatkan ETH", + "page-get-eth-earn-desc": "Anda dapat memperoleh ETH dengan bekerja untuk DAO atau perusahaan yang membayar dengan kripto, memenangkan hadiah, menemukan bug perangkat lunak, dan lainnya.", + "page-get-eth-daos-link-desc": "Pelajari tentang DAO", + "page-get-eth-cex-link-desc": "Lihat daftar bursa", + "page-get-eth-staking-link-desc": "Pelajari selengkapnya tentang staking", "page-get-eth-dexs": "Pertukaran Terdesentralisasi (DEX)", "page-get-eth-dexs-desc": "Bursa terdesentralisasi adalah pasar terbuka untuk ETH dan token lainnya. Mereka menghubungkan pembeli dan penjual secara langsung.", "page-get-eth-dexs-desc-2": "Alih-alih menggunakan pihak ketiga yang terpercaya untuk mengamankan dana dalam transaksi, mereka menggunakan kode. ETH penjual hanya akan ditransfer ketika pembayaran dijamin. Jenis kode ini dikenal sebagai kontrak pintar.", - "page-get-eth-dexs-desc-3": "Ini berarti lebih sedikit batasan geografis dibandingkan dengan alternatif terpusat. Jika seseorang menjual apa yang Anda inginkan dan menerima metode pembayaran yang dapat Anda berikan, Anda siap melakukannya. DEX memungkinkan Anda membeli ETH dengan token lain, PayPal, atau bahkan pengiriman tunai secara langsung.", + "page-get-eth-dexs-desc-3": "Hal ini berarti terdapat lebih sedikit pembatasan geografis dibandingkan dengan alternatif terpusat. Jika seseorang menjual barang yang Anda inginkan dan menerima metode pembayaran yang dapat Anda berikan, proses dapat dilanjutkan.", "page-get-eth-do-not-copy": "Contoh: Jangan disalin", "page-get-eth-exchanges-disclaimer": "Kami mengumpulkan informasi ini secara manual. Jika Anda menemukan sesuatu yang salah, beri tahu kami di", - "page-get-eth-exchanges-empty-state-text": "Masukkan negara tempat tinggal Anda untuk melihat daftar dompet dan bursa yang dapat Anda gunakan untuk membeli ETH", + "page-get-eth-exchanges-empty-state-text": "Masukkan negara tempat tinggal Anda untuk melihat daftar bursa yang mungkin dapat Anda gunakan", "page-get-eth-exchanges-except": "Kecuali", "page-get-eth-exchanges-header": "Di negara mana kamu tinggal?", "page-get-eth-exchanges-header-exchanges": "Bursa", "page-get-eth-exchanges-header-wallets": "Dompet", - "page-get-eth-exchanges-intro": "Bursa dan dompet memiliki batasan di mana mereka dapat menjual kripto.", + "page-get-eth-exchanges-intro": "Bursa perdagangan membatasi tempat yang boleh menjual kripto. Ini adalah daftar indikasi layanan yang dianggap beroperasi di setiap negara. Penyertaan sesuatu di sini tidak berarti mendukungnya - Anda seharusnya menelitinya sendiri!", "page-get-eth-exchanges-no-exchanges": "Maaf, kami tidak tahu bursa apa pun yang memungkinkan Anda membeli ETH dari negara ini. Jika Anda tahu, beri tahu kami di", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Maaf, kami tidak tahu bursa atau dompet apa pun yang memungkinkan Anda membeli ETH dari negara ini. Jika Anda tahu, beri tahu kami di", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Maaf, kami tidak tahu bursa apa pun yang memungkinkan Anda membeli ETH dari negara ini. Jika Anda tahu, beri tahu kami di", "page-get-eth-exchanges-no-wallets": "Maaf, kami tidak tahu dompet apa pun yang memungkinkan Anda membeli ETH dari negara ini. Jika Anda tahu, beri tahu kami di", "page-get-eth-exchanges-search": "Ketik di mana Anda tinggal...", "page-get-eth-exchanges-success-exchange": "Hal ini dapat memakan waktu beberapa hari untuk mendaftar di bursa karena pemeriksaan hukum mereka.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Dapatkan gambar tokoh ETH", "page-get-eth-keep-it-safe": "Menjaga ETH Anda tetap aman", "page-get-eth-meta-description": "Cara membeli ETH berdasarkan tempat tinggal Anda dan saran tentang bagaimana cara merawatnya.", - "page-get-eth-meta-title": "Cara membeli ETH", + "page-get-eth-meta-title": "Cara mendapatkan ETH", "page-get-eth-need-wallet": "Anda akan membutuhkan dompet untuk menggunakan DEX.", "page-get-eth-new-to-eth": "Baru mengenal ETH? Berikut ini ringkasan untuk membantu Anda memulai.", "page-get-eth-other-cryptos": "Beli dengan koin kripto yang lain", - "page-get-eth-protect-eth-desc": "Jika Anda berencana membeli banyak ETH, Anda mungkin ingin menyimpannya di dompet yang Anda kendalikan, bukan di bursa. Itu karena bursa kemungkinan besar menjadi target peretas. Jika seorang peretas mendapatkan akses, Anda bisa kehilangan dana. Selain itu, hanya Anda yang memiliki kendali atas dompet Anda.", - "page-get-eth-protect-eth-in-wallet": "Lindungi ETH Anda di dalam dompet", + "page-get-eth-protect-eth-desc": "Salah satu fitur utama Ethereum adalah Anda memegang kendali atas aset sendiri dengan mengelola akun sendiri. Hal ini berarti Anda tidak perlu mempercayakan aset Anda ke pihak ketiga sehingga Anda terlindung dari kustodian yang bertindak tidak jujur, menghadapi kebangkrutan, atau mengalami peretasan. Namun, hal tersebut juga berarti bahwa Anda bertanggung jawab atas keamanan Anda sendiri.", + "page-get-eth-protect-eth-in-wallet": "Simpan ETH dalam dompet Anda sendiri", "page-get-eth-search-by-country": "Cari berdasarkan negara", - "page-get-eth-security": "Tetapi ini juga berarti Anda harus memperhatikan keamanan dana Anda dengan serius. Dengan ETH, Anda tidak mempercayai bank untuk menjaga uang Anda, percayakan pada diri Anda sendiri.", + "page-get-eth-security": "Hal ini berarti Anda harus serius memperhatikan keamanan dana Anda. Dengan ETH, Anda tidak mempercayakan aset Anda untuk dijaga oleh bank atau perusahaan, melainkan mengambil tanggung jawab untuk diri sendiri.", "page-get-eth-smart-contract-link": "Lebih lanjut tentang kontrak pintar", "page-get-eth-swapping": "Tukar token Anda dengan ETH orang lain. Dan sebaliknya.", "page-get-eth-try-dex": "Coba DEX", "page-get-eth-use-your-eth": "Gunakan ETH Anda", "page-get-eth-use-your-eth-dapps": "Karena sekarang Anda telah memiliki beberapa ETH, lihat beberapa aplikasi Ethereum (dapp). Ada dapp untuk keuangan, media sosial, aktivitas game, dan banyak kategori lainnya.", "page-get-eth-wallet-instructions": "Ikuti instruksi dompet", - "page-get-eth-wallet-instructions-lost": "Jika Anda kehilangan akses ke dompet, Anda akan kehilangan akses ke dana Anda. Dompet harus memberi instruksi kepada Anda untuk melindungi dari hal ini. Pastikan untuk mengikutinya dengan hati-hati – dalam banyak kasus, tidak ada yang dapat membantu Anda jika kehilangan akses ke dompet Anda.", + "page-get-eth-wallet-instructions-lost": "Jika akses ke akun Anda hilang, akses ke dana juga akan hilang. Dompet Anda seharusnya memberikan instruksi tentang cara melindungi diri dari hal ini. Pastikan untuk mengikuti petunjuk tersebut dengan hati-hati – dalam kebanyakan kasus, tidak ada yang dapat membantu jika Anda kehilangan akses ke akun Anda.", "page-get-eth-wallets": "Dompet", "page-get-eth-wallets-link": "Selengkapnya tentang dompet", "page-get-eth-wallets-purchasing": "Beberapa dompet memungkinkan Anda membeli kripto dengan kartu debit/kredit, transfer bank, atau bahkan Apple Pay. Pembatasan geografis berlaku.", - "page-get-eth-warning": "DEX ini bukan diperuntukan untuk pemula karena Anda memerlukan beberapa ETH untuk menggunakannya.", + "page-get-eth-warning": "DEX bukan untuk pemula karena diperlukan sejumlah ETH untuk menggunakannya. Ini hanya contoh, bukan produk yang didukung. Lakukan penelitian Anda sendiri!", "page-get-eth-what-are-DEX's": "Apa itu DEX?", "page-get-eth-whats-eth-link": "Apa itu ETH?", - "page-get-eth-where-to-buy-desc": "Anda dapat membeli ETH dari bursa atau dari dompet secara langsung.", + "page-get-eth-where-to-buy-desc": "Anda dapat menghasilkan ETH, menerimanya dari rekan Anda, atau membelinya melalui bursa dan aplikasi.", "page-get-eth-where-to-buy-desc-2": "Periksa layanan mana yang dapat Anda gunakan berdasarkan tempat tinggal Anda.", - "page-get-eth-where-to-buy-title": "Dimana membeli ETH", + "page-get-eth-where-to-buy-title": "Tempat untuk mendapatkan ETH", "page-get-eth-your-address": "Alamat ETH Anda", "page-get-eth-your-address-desc": "Saat Anda mengunduh dompet, itu akan membuat alamat ETH publik untuk Anda. Berikut ini contoh tampilan alamatnya:", "page-get-eth-your-address-desc-3": "Anggap ini seperti alamat email Anda, tetapi bukan surat, alamat ini dapat menerima ETH. Jika Anda ingin menukar ETH dari bursa ke dompet, gunakan alamat Anda sebagai tujuan. Pastikan untuk selalu memeriksa ulang sebelum Anda mengirim!", diff --git a/src/intl/id/page-languages.json b/src/intl/id/page-languages.json index 675edc5b658..677324df678 100644 --- a/src/intl/id/page-languages.json +++ b/src/intl/id/page-languages.json @@ -11,16 +11,14 @@ "page-languages-want-more-header": "Ingin melihat ethereum.org dalam bahasa lain?", "page-languages-want-more-link": "Program Penerjemahan", "page-languages-want-more-paragraph": "Penerjemah ethereum.org selalu menerjemahkan halaman ke dalam sebanyak mungkin bahasa. Untuk melihat apa yang mereka kerjakan sekarang atau untuk mendaftar bergabung dengan mereka, baca tentang", - "page-languages-filter-label": "Daftar filter", - "page-languages-filter-placeholder": "Ketik untuk memfilter", - "page-languages-browser-default": "Browser default", - "page-languages-translated": "diterjemahkan", - "page-languages-words": "kata", - "page-languages-recruit-community": "Bantu kami menerjemahkan ethereum.org.", + "page-languages-filter-placeholder": "Filter", + "langauge-am": "Amharik", "language-ar": "Bahasa Arab", "language-az": "Bahasa Azerbaijan", + "langauge-be": "Belarus", "language-bg": "Bahasa Bulgaria", "language-bn": "Bahasa Bengali", + "language-bs": "Bosnia", "language-ca": "Bahasa Katalan", "language-cs": "Bahasa Ceko", "language-da": "Bahasa Denmark", @@ -37,6 +35,7 @@ "language-hi": "Bahasa Hindi", "language-hr": "Bahasa Kroasia", "language-hu": "Bahasa Hongaria", + "language-hy-am": "Armenia", "language-id": "Bahasa Indonesia", "language-ig": "Bahasa Igbo", "language-it": "Bahasa Italia", @@ -44,12 +43,14 @@ "language-ka": "Bahasa Georgia", "language-kk": "Bahasa Kazakh", "language-km": "Bahasa Khmer", + "language-kn": "Kannada", "language-ko": "Bahasa Korea", "language-lt": "Bahasa Lithuania", "language-ml": "Bahasa Malayalam", "language-mr": "Bahasa Marathi", "language-ms": "Bahasa Malaysia", "language-nb": "Bahasa Norwegia", + "language-ne-np": "Nepali", "language-nl": "Bahasa Belanda", "language-pcm": "Bahasa Pidgin Nigeria", "language-fil": "Bahasa Filipina", @@ -65,6 +66,7 @@ "language-sw": "Bahasa Swahili", "language-ta": "Bahasa Tamil", "language-th": "Bahasa Thailand", + "language-tk": "Turkmen", "language-tr": "Bahasa Turki", "language-uk": "Bahasa Ukraina", "language-ur": "Bahasa Urdu", diff --git a/src/intl/id/page-layer-2.json b/src/intl/id/page-layer-2.json index 27093293e39..eb0e912ddda 100644 --- a/src/intl/id/page-layer-2.json +++ b/src/intl/id/page-layer-2.json @@ -123,6 +123,7 @@ "zksync-description": "zkSync adalah platform Rollup zk yang berfokus pada pengguna dari Matter Labs. Ini adalah solusi penskalaan untuk Ethereum, sudah berjalan di Jaringan Utama Ethereum. Ini mendukung pembayaran, pertukaran token, dan penciptaan NFT.", "zkspace-description": "Platform ZKSpace terdiri dari tiga bagian utama: bursa AMM DEX lapisan ke-2 yang menggunakan teknologi Rollup ZK bernama ZKSwap, layanan pembayaran bernama ZKSquare, dan pasar NFT bernama ZKSea.", "aztec-description": "Jaringan Aztec adalah Rollup zk pribadi pertama di Ethereum, memungkinkan aplikasi terdesentralisasi untuk mengakses privasi dan skala.", + "starknet-description": "Starknet adalah Rollup Validitas Lapisan ke-2. Starknet menyediakan keluaran proses yang tinggi, biaya gas yang rendah, dan menjaga tingkat keamanan Lapisan ke-1 Ethereum.", "layer-2-note": "Catatan:", "layer-2-ecosystem-portal": "Portal Ekosistem", "layer-2-token-lists": "Daftar Token", diff --git a/src/intl/id/page-wallets-find-wallet.json b/src/intl/id/page-wallets-find-wallet.json index 220c5319da8..69962dd1771 100644 --- a/src/intl/id/page-wallets-find-wallet.json +++ b/src/intl/id/page-wallets-find-wallet.json @@ -50,10 +50,10 @@ "page-find-wallet-features": "Fitur", "page-find-wallet-security": "Keamanan", "page-find-wallet-smart-contract": "Kontrak pintar", - "page-find-wallet-check-out": "Lihat juga", + "page-find-wallet-check-out": "Lihat", "page-find-wallet-info-updated-on": "info diperbarui pada", "page-find-wallet-showing-all-wallets": "Tampilkan semua dompet", - "page-find-wallet-showing": "Menampilkan ", + "page-find-wallet-showing": "Menampilkan", "page-find-wallet-wallets": "dompet", "page-find-wallet-iOS": "iOS", "page-find-wallet-android": "Android", @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "Fitur filter", "page-find-wallet-footnote-1": "Dompet yang tercantum di halaman ini bukan dukungan resmi, dan disediakan hanya untuk tujuan informasi.", "page-find-wallet-footnote-2": "Deskripsi mereka telah disediakan oleh proyek dompet itu sendiri.", - "page-find-wallet-footnote-3": "Kami menambahkan produk ke halaman ini berdasarkan kriteria kami kebijakan daftar. Jika Anda ingin kami menambahkan dompet, kirim issue di GitHub.", + "page-find-wallet-footnote-3": "Kami menambahkan produk ke halaman ini berdasarkan kriteria dalam kebijakan pendaftaran kami. Jika Anda menginginkan penambahan dompet dari kami, ajukan persoalan ini di GitHub.", "page-find-wallet-mobile": "Seluler", "page-find-wallet-mobile-desc": "Dompet dengan aplikasi seluler", "page-find-wallet-desktop": "Desktop", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Dompet dengan ekstensi browser", "page-find-wallet-device": "Perangkat", "page-find-choose-to-compare": "Pilih untuk membandingkan", - "page-find-wallet-choose-features": "Pilih fitur" + "page-find-wallet-choose-features": "Pilih fitur", + "page-find-wallet-reset-filters": "Atur ulang filter" } From 3c4670402ec892911424d5a09522f061b75060b5 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 16:54:50 -0700 Subject: [PATCH 375/478] Italian import Feb 20 (Homepage, Essentials) --- src/intl/it/common.json | 23 ++++++-- src/intl/it/page-gas.json | 64 +++++++++++++++++++++++ src/intl/it/page-get-eth.json | 37 ++++++++----- src/intl/it/page-wallets-find-wallet.json | 5 +- src/intl/it/page-wallets.json | 2 +- src/intl/it/page-what-is-ethereum.json | 2 +- 6 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 src/intl/it/page-gas.json diff --git a/src/intl/it/common.json b/src/intl/it/common.json index 75d193fe02a..e59e0a59bea 100644 --- a/src/intl/it/common.json +++ b/src/intl/it/common.json @@ -1,7 +1,16 @@ { - "account-abstraction": "Astrazione account", "about-ethereum-org": "Informazioni su ethereum.org", "about-us": "Chi siamo", + "adding-desci-projects": "Aggiungere progetti DeSci", + "adding-developer-tools": "Aggiungere strumenti per sviluppatori", + "adding-exchanges": "Aggiungere borse", + "adding-glossary-terms": "Aggiungere termini dal glossario", + "adding-layer-2s": "Aggiungere Livelli 2", + "adding-products": "Aggiungere prodotti", + "adding-staking-products": "Aggiungere prodotti di staking", + "adding-wallets": "Aggiungere portafogli", + "account-abstraction": "Astrazione account", + "acknowledgements": "Riconoscimenti", "aria-toggle-search-button": "Attiva/Disattiva pulsante di ricerca", "aria-toggle-menu-button": "Attiva/Disattiva pulsante menu", "beacon-chain": "La Beacon Chain", @@ -12,6 +21,8 @@ "community-hub": "Hub della community", "community-menu": "Menu Community", "contact": "Contatti", + "content-buckets": "Categorie di contenuti", + "content-resources": "Risorse di contenuto", "content-standardization": "Standardizzazione dei contenuti", "contributing": "Contributi", "contributors": "Hanno contribuito", @@ -28,6 +39,8 @@ "decentralized-social-networks": "Social network decentralizzati", "decentralized-science": "Scienza Decentralizzata (DeSci)", "defi-page": "Finanza decentralizzata (DeFi)", + "design": "Progettazione", + "design-principles": "Principi di progettazione", "devcon": "Devcon", "developers": "Sviluppatori", "developers-home": "Home degli sviluppatori", @@ -94,11 +107,11 @@ "grants": "Sovvenzioni", "grant-programs": "Programma di supporto dell'ecosistema", "guides": "Guide", - "guides-hub": "Hub delle guide", + "guides-hub": "Guide esplicative", "history-of-ethereum": "Storia di Ethereum", "home": "Home page", "how-ethereum-works": "Come funziona Ethereum", - "how-to-register-an-ethereum-account": "Come \"registrare\" un conto di Ethereum", + "how-to-create-an-ethereum-account": "Come \"creare\" un conto di Ethereum", "how-to-revoke-token-access": "Come revocare l'accesso dei contratti intelligenti ai tuoi fondi di criptovalute", "how-to-swap-tokens": "Come scambiare token", "how-to-use-a-bridge": "Come collegare i token al livello 2", @@ -128,6 +141,7 @@ "loading-error-try-again-later": "Impossibile caricare i dati. Riprovare più tardi.", "logo": "logo", "mainnet-ethereum": "Rete principale Ethereum", + "merge": "Fusione", "more": "Altro", "nav-developers": "Sviluppatori", "nav-developers-docs": "Documentazione per sviluppatori", @@ -164,6 +178,7 @@ "search-box-blank-state-text": "Pronti, partenza, cerca!", "search-eth-address": "Questo sembrerebbe un indirizzo Ethereum. Non forniamo dati specifici per gli indirizzi. Prova a cercarlo su un esploratore di blocchi come", "search-no-results": "Nessun risultato per questa ricerca", + "security": "Sicurezza", "single-slot-finality": "Finalità del singolo slot", "statelessness": "Assenza di stato", "see-contributors": "Visualizza chi ha contribuito", @@ -181,6 +196,7 @@ "start-here": "Inizia da qui", "style-guide": "Guida di stile", "solo": "Staking in solo", + "support": "Supporto", "terms-of-use": "Condizioni d'uso", "translation-banner-body-new": "Stai visualizzando questa pagina in inglese perché non l'abbiamo ancora tradotta. Aiutaci a tradurre il contenuto.", "translation-banner-body-update": "C'è una nuova versione di questa pagina, ma al momento è solo in inglese. Aiutaci a tradurre l'ultima versione.", @@ -191,6 +207,7 @@ "translation-banner-no-bugs-title": "Nessun bug qui!", "translation-banner-no-bugs-content": "Questa pagina non è stata tradotta. Per il momento, è stata intenzionalmente lasciata in inglese.", "translation-banner-no-bugs-dont-show-again": "Non mostrare più", + "translation-program": "Programma di Traduzione", "try-using-search": "Prova a utilizzare la ricerca per trovare ciò che stai cercando, o", "tutorials": "Tutorial", "up": "Su", diff --git a/src/intl/it/page-gas.json b/src/intl/it/page-gas.json new file mode 100644 index 00000000000..01663f98856 --- /dev/null +++ b/src/intl/it/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Commissioni sul gas di Ethereum: come funzionano?", + "page-gas-meta-description": "Approfondisci il gas su Ethereum: come funziona e come pagare meno in commissioni sul gas", + "page-gas-hero-title": "Commissioni sul gas", + "page-gas-hero-header": "Commissioni di rete", + "page-gas-hero-button-1-content": "Cos'è il gas?", + "page-gas-hero-subtitle-1": "Le commissioni della rete su Ethereum sono dette gas.", + "page-gas-hero-subtitle-2": "Il gas è il carburante che alimenta Ethereum.", + "page-gas-summary-title": "Riepilogo", + "page-gas-summary-item-1": "Ogni transazione su Ethereum richiede una piccola forma di pagamento per l'elaborazione", + "page-gas-summary-item-2": "Queste commissioni sono note come commissioni sul 'gas'", + "page-gas-summary-item-3": "Le commissioni sul gas cambiano a seconda della congestione di rete", + "page-gas-what-are-gas-fees-header": "Cosa sono le commissioni sul gas?", + "page-gas-what-are-gas-fees-text-1": "Pensa a Ethereum come a una grande rete di computer, in cui le persone possono svolgere mansioni, come inviare messaggi, o eseguire programmi. Proprio come nel mondo reale, queste mansioni richiedono energia per essere compiute.", + "page-gas-what-are-gas-fees-text-2": "Su Ethereum, ogni azione di calcolo ha un dato prezzo del \"gas\". Le tue commissioni sul gas sono il costo totale delle azioni nella tua transazione. Quando invii una transazione, o esegui un contratto intelligente, paghi in commissioni sul gas per elaborarla.", + "page-gas-how-do-i-pay-less-gas-header": "Come faccio a pagare meno gas?", + "page-gas-how-do-i-pay-less-gas-text": "Sebbene talvolta le commissioni più alte su Ethereum siano inevitabili, esistono delle strategie che puoi utilizzare per ridurre il costo:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Esegui transazioni tempestive", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Proprio come viaggiare durante le ore di fuori picco è meno affollato e più economico, Ethereum è generalmente più economico da utilizzare quando il Nordamerica sta dormendo.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Attendi il calo del costo del gas", + "page-gas-how-do-i-pay-less-gas-card-2-description": "I prezzi del gas aumentano e diminuiscono ogni dodici secondi a seconda di quanto Ethereum è congestionato. Quando i prezzi del gas sono elevati, attendere alcuni minuti prima di effettuare una transazione potrebbe comportare un significativo calo in ciò che paghi.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Usa il livello 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Le catene di livello 2 sono basate su Ethereum, e offrono così commissioni inferiori e la gestione di più transazioni. Sono una buona scelta per risparmiare sulle commissioni per le transazioni che non devono sulla rete principale di Ethereum.", + "page-gas-try-layer-2": "Prova il livello 2", + "page-gas-what-causes-high-gas-fees-header": "Cosa causa le commissioni sul gas elevate?", + "page-gas-what-causes-high-gas-fees-text-1": "Ogni volta che la quantità di calcolo (gas) su Ethereum supera una certa soglia, le commissioni sul gas iniziano a salire. Più il gas supera questa soglia, più rapidamente aumentano le commissioni sul gas.", + "page-gas-what-causes-high-gas-fees-text-2": "L’aumento delle commissioni maggiori potrebbe esser causato ad esempio da dapp popolari o NFT, scambi incrementati periodicamente sulle DEX, o una notevole attività degli utenti negli orari di punta.", + "page-gas-what-causes-high-gas-fees-text-3": "Gli sviluppatori su Ethereum dovrebbero occuparsi dell'ottimizzazione dell'utilizzo dei propri contratti intelligenti, prima della loro distribuzione. Se molte persone utilizzano un contratto intelligente scritto male, consumerà più gas e potrebbe causare involontariamente la congestione della rete.", + "page-gas-want-to-dive-deeper": "Desideri approfondire?", + "page-gas-check-out-the-developer-docs": "Consulta le documentazioni per sviluppatori.", + "page-gas-attack-of-the-cryptokitties-header": "Attacco dei Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "A Novembre 2017 è stato lanciato il popolare progetto CryptoKitties. Il suo rapido picco di popolarità ha causato una significativa congestione della rete, e commissioni sul gas estremamente elevate. Le difficoltà poste da CryptoKitties hanno fatto emergere con maggiore urgenza la necessità di trovare soluzioni di ridimensionamento di Ethereum.", + "page-gas-why-do-we-need-gas-header": "Perché necessitiamo del gas?", + "page-gas-why-do-we-need-gas-text": "Il gas è un elemento critico per mantenere sicuro Ethereum ed elaborare le transazioni. Il gas aiuta in molti modi:", + "page-gas-benefits-1-description": "il gas consente a Ethereum di resistere agli attacchi Sybil, impedendo agli utenti malevoli di sopraffare la rete con attività fraudolente.", + "page-gas-benefits-2-description": "Poiché il calcolo costa del gas vi è un disincentivo finanziario a riempire Ethereum di transazioni costose, per errore o intenzionalmente.", + "page-gas-benefits-3-description": "Un limite rigido sulla quantità di calcolo eseguibile in una sola volta impedisce che Ethereum sia sopraffatto, contribuendo a garantire che la rete sia sempre accessibile.", + "page-gas-how-is-gas-calculated-header": "Com'è calcolato il gas?", + "page-gas-advanced": "Avanzate", + "page-gas-how-is-gas-calculated-text-1": "La commissione sul gas totale che paghi si compone di alcune parti:", + "page-gas-how-is-gas-calculated-item-1": "Commissione di base: una commissione impostata dalla rete che deve essere pagata per una transazione", + "page-gas-how-is-gas-calculated-item-2": "Commissione prioritaria: una mancia facoltativa per incentivare gli operatori del nodo a includere la tua transazione", + "page-gas-how-is-gas-calculated-item-3": "Unità di gas utilizzate*: ricordi che abbiamo detto che il gas rappresenta il calcolo? Azioni più complesse, come interagire con un contratto intelligente, consumano più gas di quelle semplici, come inviare una transazione.", + "page-gas-how-is-gas-calculated-list-item-1": "* Vedi la Figura 1 per visualizzare quanto gas è utilizzato da diversi tipi di transazioni", + "page-gas-how-is-gas-calculated-text-2": "La formula per calcolare una commissione sul gas è unità di gas utilizzate * (commissione di base + commissione prioritaria). Gran parte dei portafogli calcolerà l'utilizzo del gas visualizzandolo in un modo più semplice.", + "page-gas-table-figure": "Figura 1: Gas utilizzato per tipo di transazione", + "page-gas-table-header-1": "Tipo di transazione", + "page-gas-table-header-2": "Unità di gas utilizzate", + "page-gas-table-item-1-transaction-type": "Inviare ETH", + "page-gas-table-item-2-transaction-type": "Inviare token ERC-20", + "page-gas-table-item-3-transaction-type": "Trasferimento e NFT", + "page-gas-table-item-4-transaction-type": "Scambio su Uniswap", + "page-gas-faq-header": "Domande frequenti", + "page-gas-faq-question-1-q": "Chi riceve la commissione sul gas nella mia transazione?", + "page-gas-faq-question-1-a-1": "Gran parte della commissione sul gas, la commissione di base, viene distrutta dal protocollo (bruciata). La commissione prioritaria, se inclusa nella tua transazione, sarà data al validatore che ha proposto la tua transazione.", + "page-gas-faq-question-1-a-2": "Puoi leggere una descrizione dettagliata del procedimento nella documentazione sul gas per sviluppatori.", + "page-gas-faq-question-2-q": "Devo pagare il gas in ETH?", + "page-gas-faq-question-2-a-1": "Sì. Tutte le commissioni sul gas di Ethereum devono essere pagate nella valuta nativa ETH.", + "page-gas-faq-question-2-a-2": "Scopri di più su ETH", + "page-gas-faq-question-3-q": "Cos'è gwei?", + "page-gas-faq-question-3-a-1": "In gran parte dei portafogli o tracciatori di gas, vedrai i prezzi del gas denominati in 'gwei'.", + "page-gas-faq-question-3-a-2": "Gwei è semplicemente un'unità più piccola di ETH, proprio come i centesimi per gli euro, con la differenza che 1 ETH equivale a 1 miliardo di gwei. Gwei è utile quando si parla di importi molto ridotti di ETH.", + "page-gas-use-layer-2": "Usa il livello 2" +} diff --git a/src/intl/it/page-get-eth.json b/src/intl/it/page-get-eth.json index a6b24466734..b779ee16d06 100644 --- a/src/intl/it/page-get-eth.json +++ b/src/intl/it/page-get-eth.json @@ -9,23 +9,32 @@ "page-get-eth-cex-desc": "Le borse sono aziende che consentono di acquistare criptovalute usando valute tradizionali. Hanno la custodia su tutti gli ETH che acquisti fino a quando li invii a un portafoglio che controlli.", "page-get-eth-checkout-dapps-btn": "Scopri le dapp", "page-get-eth-community-safety": "Post della community sulla sicurezza", - "page-get-eth-description": "Ethereum ed ETH non sono controllati da nessun governo o azienda, sono decentralizzati. Significa che gli ETH possono essere utilizzati da tutti.", + "page-get-eth-description": "Ethereum non è controllato da nessuna singola organizzazione - è decentralizzato.", "page-get-eth-dex": "Borse decentralizzate (DEX)", - "page-get-eth-dex-desc": "Se vuoi più controllo, compra ETH peer-to-peer. Con una DEX puoi acquistare e vendere senza dare a un'azienda centralizzata il controllo dei tuoi fondi.", + "page-get-eth-dex-desc": "Se desideri avere più controllo, compra ETH usando contratti intelligenti. Con DEX puoi scambiare risorse digitali senza mai dare il controllo dei tuoi fondi a un'azienda centralizzata.", + "page-get-eth-peers": "Ricevi ETH dai tuoi pari", + "page-get-eth-peers-desc": "Da quando avrai un conto di Ethereum, tutto quello che ti servirà è condividere il tuo indirizzo per cominciare a inviare e ricevere ETH (e altri token) tra pari.", + "page-get-eth-staking": "Ricompense di staking", + "page-get-eth-staking-desc": "Se possiedi già abbastanza ETH, puoi guadagnarne ulteriori gestendo un nodo validatore. Verrai pagato per fare questo lavoro di verifica in ETH.", + "page-get-eth-earn": "Ottieni ETH", + "page-get-eth-earn-desc": "Puoi ottenere ETH lavorando per DAO o aziende che pagano in criptovalute, vincendo ricompense, trovando bug del software e altro.", + "page-get-eth-daos-link-desc": "Scopri di più sulle DAO", + "page-get-eth-cex-link-desc": "Visualizza un elenco di borse", + "page-get-eth-staking-link-desc": "Maggior informazioni sullo staking", "page-get-eth-dexs": "Borse decentralizzate (DEX)", "page-get-eth-dexs-desc": "Le borse decentralizzate sono piazze aperte in cui scambiare ETH e altri token. Collegano direttamente acquirenti e venditori.", "page-get-eth-dexs-desc-2": "Invece di sfruttare una terza parte attendibile per salvaguardare i fondi nella transazione, utilizzano il codice. L'ETH del venditore sarà trasferito solo quando il pagamento è garantito. Questo tipo di codice è noto come contratto intelligente.", - "page-get-eth-dexs-desc-3": "Tutto questo significa che ci sono meno restrizioni geografiche rispetto alle alternative centralizzate. Se qualcuno vende ciò che cerchi e accetta un metodo di pagamento fornisci, puoi procedere. Con le DEX puoi acquistare ETH con altri token, Paypal o anche contanti di persona.", + "page-get-eth-dexs-desc-3": "Questo significa che ci sono minori restrizioni geografiche che con alternative centralizzate. Se qualcuno sta vendendo quello che desideri e accetta i metodi di pagamento che fornisci, sei pronto per andare avanti.", "page-get-eth-do-not-copy": "Esempio: Non copiare", "page-get-eth-exchanges-disclaimer": "Abbiamo raccolto questa informazione manualmente. Se trovi qualcosa di sbagliato, faccelo sapere:", - "page-get-eth-exchanges-empty-state-text": "Inserisci il tuo paese di residenza per vedere una lista di portafogli e borse che puoi usare per acquistare ETH", + "page-get-eth-exchanges-empty-state-text": "Inserisci il tuo paese di residenza per vedere un elenco di borse che potresti essere in grado di utilizzare", "page-get-eth-exchanges-except": "Eccetto", "page-get-eth-exchanges-header": "In che paese vivi?", "page-get-eth-exchanges-header-exchanges": "Borse", "page-get-eth-exchanges-header-wallets": "Portafogli", - "page-get-eth-exchanges-intro": "Borse e portafogli hanno restrizioni sul luogo di vendita delle criptovalute.", + "page-get-eth-exchanges-intro": "Le borse hanno delle restrizioni riguardo al luogo dove si possono vendere le criptovalute. Questo è un elenco indicativo di servizi concepiti per operare in ogni paese. L'inclusione in questo elenco non è necessariamente un'approvazione - Bisogna fare delle ricerche in proprio!", "page-get-eth-exchanges-no-exchanges": "Siamo spiacenti, non conosciamo borse che ti permettano di acquistare ETH da questo paese. Se tu le conosci, faccelo sapere:", - "page-get-eth-exchanges-no-exchanges-or-wallets": "Siamo spiacenti, non conosciamo borse o portafogli che ti permettano di acquistare ETH da questo paese. Se tu li conosci, faccelo sapere:", + "page-get-eth-exchanges-no-exchanges-or-wallets": "Siamo spiacenti, non conosciamo borse che ti permettano di acquistare ETH da questo paese. Se tu le conosci, faccelo sapere:", "page-get-eth-exchanges-no-wallets": "Siamo spiacenti, non conosciamo portafogli che ti permettano di acquistare ETH da questo paese. Se tu li conosci, faccelo sapere:", "page-get-eth-exchanges-search": "Digita dove vivi...", "page-get-eth-exchanges-success-exchange": "La registrazione a una borsa può richiedere diversi giorni a causa dei controlli legali da eseguire.", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Ottieni l'immagine dell'eroe di ETH", "page-get-eth-keep-it-safe": "Proteggere i tuoi ETH", "page-get-eth-meta-description": "Come acquistare ETH a seconda di dove vivi e consigli su come prendersene cura.", - "page-get-eth-meta-title": "Come acquistare ETH", + "page-get-eth-meta-title": "Come ottenere ETH", "page-get-eth-need-wallet": "Ti servirà un portafoglio per usare una DEX.", "page-get-eth-new-to-eth": "Alle prime armi con ETH? Ecco una panoramica per muovere i primi passi.", "page-get-eth-other-cryptos": "Acquista con altre criptovalute", - "page-get-eth-protect-eth-desc": "Se prevedi di acquistare molti ETH, potresti volerli conservare in un portafoglio che controlli, anziché in una borsa. Questo perché una borsa potrebbe esser bersaglio di hacker. Se un hacker ottiene l'accesso, potresti perdere i tuoi fondi. Al contrario, solo tu puoi controllare il tuo portafoglio.", - "page-get-eth-protect-eth-in-wallet": "Proteggi i tuoi ETH in un portafoglio", + "page-get-eth-protect-eth-desc": "Una delle caratteristiche principali di Ethereum è che si mantiene il controllo delle proprie risorse gestendo il proprio conto. Questo significa che non occorre affidare le proprie risorse a terze parti, e si è protetti dal fatto che un custode possa comportarsi in modo disonesto, fallire o venire hackerato. Tuttavia, comporta anche che bisogna assumersi la responsabilità per la propria sicurezza.", + "page-get-eth-protect-eth-in-wallet": "Tieni i tuoi ETH nel tuo portafoglio", "page-get-eth-search-by-country": "Cerca per paese", - "page-get-eth-security": "Ma questo significa anche che devi prendere sul serio la sicurezza dei tuoi fondi. Con ETH, non ti affidi a una banca perché controlli il tuo denaro, ti affidi a te stesso.", + "page-get-eth-security": "Questo significa che devi prendere sul serio la sicurezza dei tuoi fondi. Con ETH, non ti affidi a una banca o a un'azienda perché controlli le tue risorse, ti assumi la responsabilità per te stesso.", "page-get-eth-smart-contract-link": "Di più sui contratti intelligenti", "page-get-eth-swapping": "Scambia i tuoi token per gli ETH di altre persone. E viceversa.", "page-get-eth-try-dex": "Prova una DEX", "page-get-eth-use-your-eth": "Usa i tuoi ETH", "page-get-eth-use-your-eth-dapps": "Ora che possiedi alcuni ETH, dai un'occhiata ad alcune applicazioni di Ethereum (dapp). Esistono dapp per la finanza, social media, videogiochi e molte di altre categorie.", "page-get-eth-wallet-instructions": "Segui le istruzioni del portafoglio", - "page-get-eth-wallet-instructions-lost": "Se perdi l'accesso al tuo portafoglio, perderai l'accesso ai tuoi fondi. Il tuo portafoglio dovrebbe darti le istruzioni per evitarlo. Assicurati di seguirle attentamente; in gran parte dei casi, nessuno può aiutarti se perdi l'accesso al tuo portafoglio.", + "page-get-eth-wallet-instructions-lost": "Se perdi l'accesso al tuo conto, perderai l'accesso ai tuoi fondi. Il tuo portafoglio dovrebbe darti le istruzioni per evitarlo. Assicurati di seguirle attentamente; in gran parte dei casi, nessuno può aiutarti se perdi l'accesso al tuo conto.", "page-get-eth-wallets": "Portafogli", "page-get-eth-wallets-link": "Di più sui portafogli", "page-get-eth-wallets-purchasing": "Alcuni portafogli, ti consentono di acquistare criptovalute con una carta di debito/credito, bonifico bancario o persino Apple Pay. Si applicano le limitazioni geografiche.", - "page-get-eth-warning": "Queste DEX non sono per principianti, poiché avrai bisogno di ETH per usarle.", + "page-get-eth-warning": "Queste DEX non sono per principianti, in quanto avrai bisogno di diversi ETH per usarle. Questi sono solo esempi, non prodotti approvati. Fai le tue ricerche!", "page-get-eth-what-are-DEX's": "Cosa sono le DEX?", "page-get-eth-whats-eth-link": "Cos'è l'ETH?", - "page-get-eth-where-to-buy-desc": "Puoi acquistare ETH direttamente dalle borse o dai portafogli.", + "page-get-eth-where-to-buy-desc": "Puoi guadagnare ETH, riceverli dai tuoi pari o comprarli da borse e app.", "page-get-eth-where-to-buy-desc-2": "Controlla quali servizi puoi usare in base al luogo in cui vivi.", - "page-get-eth-where-to-buy-title": "Dove acquistare ETH", + "page-get-eth-where-to-buy-title": "Dove ottenere ETH", "page-get-eth-your-address": "Il tuo indirizzo ETH", "page-get-eth-your-address-desc": "Quando scarichi un portafoglio, ti verrà creato un indirizzo ETH pubblico, che si presenta così:", "page-get-eth-your-address-desc-3": "Puoi considerarlo come un indirizzo email, su cui invece delle email riceverai ETH. Se vuoi trasferire ETH da una borsa al tuo portafoglio, usa questo indirizzo come destinazione. Controlla sempre due volte prima di confermare l'invio!", diff --git a/src/intl/it/page-wallets-find-wallet.json b/src/intl/it/page-wallets-find-wallet.json index 29796ae0a2c..c269f61cd81 100644 --- a/src/intl/it/page-wallets-find-wallet.json +++ b/src/intl/it/page-wallets-find-wallet.json @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "Filtri di funzionalità", "page-find-wallet-footnote-1": "I portafogli elencati su questa pagina non sono sponsorizzazioni ufficiali e sono messi a disposizione per soli scopi informativi.", "page-find-wallet-footnote-2": "Le loro descrizioni sono state fornite dagli stessi progetti dei portafogli.", - "page-find-wallet-footnote-3": "Aggiungiamo prodotti a questa pagina secondo i criteri nella nostra politica di elencazione. Se vorresti che aggiungessimo un portafoglio, apri un ticket su GitHub.", + "page-find-wallet-footnote-3": "Aggiungiamo prodotti a questa pagina secondo i criteri nella nostra politica di elencazione. Se vorresti che aggiungessimo un portafoglio, apri un ticket su GitHub.", "page-find-wallet-mobile": "Mobile", "page-find-wallet-mobile-desc": "Portafogli con app mobili", "page-find-wallet-desktop": "Desktop", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Portafogli con estensioni per browser", "page-find-wallet-device": "Dispositivo", "page-find-choose-to-compare": "Seleziona per confrontare", - "page-find-wallet-choose-features": "Seleziona le funzionalità" + "page-find-wallet-choose-features": "Seleziona le funzionalità", + "page-find-wallet-reset-filters": "Ripristina filtri" } diff --git a/src/intl/it/page-wallets.json b/src/intl/it/page-wallets.json index c96fcf0ec5d..6a74e6c55e7 100644 --- a/src/intl/it/page-wallets.json +++ b/src/intl/it/page-wallets.json @@ -62,6 +62,6 @@ "page-wallets-your-ethereum-account-desc": "Il tuo portafoglio è la tua finestra al tuo conto Ethereum: il tuo saldo, lo storico delle transazioni e altro. Ma puoi cambiare fornitore dele portafoglio in qualsiasi momento.", "page-wallets-your-login": "Il tuo login per le applicazioni Ethereum", "page-wallets-your-login-desc": "Il tuo portafoglio ti consente di collegarti alle applicazioni usando il tuo conto Ethereum. È come un login che puoi utilizzare in molte applicazioni.", - "additional-reading-how-to-create-an-ethereum-account": "Come creare un conto Ethereum", + "additional-reading-how-to-create-an-ethereum-account": "Come creare un conto di Ethereum", "additional-reading-how-to-use-a-wallet": "Come utilizzare un portafoglio" } diff --git a/src/intl/it/page-what-is-ethereum.json b/src/intl/it/page-what-is-ethereum.json index 0093552a3e1..21d653181d8 100644 --- a/src/intl/it/page-what-is-ethereum.json +++ b/src/intl/it/page-what-is-ethereum.json @@ -79,7 +79,7 @@ "page-what-is-ethereum-criminal-activity-desc-2": "Secondo i risultati chiave di un rapporto recente dell'Europol, l'Agenzia dell'Unione europea per la Cooperazione delle Forze dell'Ordine, le cripto sono usate molto meno delle valute legali per scopi criminali:", "page-what-is-ethereum-criminal-activity-desc-3": "\"L'uso delle criptovalute per attività illecite sembra interessare solo una piccola parte dell'economia complessiva della criptovaluta e sembra essere comparativamente inferiore alla quantità di fondi illeciti coinvolti nella finanza tradizionale.\"", "page-what-is-ethereum-energy-title": "E il consumo energetico di Ethereum invece?", - "page-what-is-ethereum-energy-desc-1": "Il 15 settembre 2022, Ethereum ha eseguito l'aggiornamento della fusione per la transizione di Ethereum da proof-of-work a proof-of-stake.", + "page-what-is-ethereum-energy-desc-1": "Il 15 settembre 2002, Ethereum ha eseguito l'aggiornamento della fusione per la transizione di Ethereum da proof-of-work a proof-of-stake.", "page-what-is-ethereum-energy-desc-2": "Il Merge è stato l'aggiornamento più grande di Ethereum, e ha ridotto il consumo di energia richiesto per proteggere l'ecosistema del 99.95%, creando un network più sicuro per un costo minore. Ethereum adesso è una Blockchain \"low-carbon\", mentre aumenta la propria sicurezza e scalabilità.", "page-what-is-ethereum-more-on-energy-consumption": "Maggiori informazioni sul consumo energetico", "page-what-is-ethereum-energy-consumption-chart-legend": "Consumo di energia annuale in TWh/anno", From 2f4ae2998240c87c28d20843bd2bc56122f6d77f Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 16:59:26 -0700 Subject: [PATCH 376/478] Nigerian Pidgin import Feb 20 (Essentials) --- src/intl/pcm/page-gas.json | 64 ++++++++++++++++++++++ src/intl/pcm/page-get-eth.json | 35 +++++++----- src/intl/pcm/page-wallets-find-wallet.json | 9 +-- src/intl/pcm/page-wallets.json | 2 +- src/intl/pcm/page-what-is-ethereum.json | 2 +- 5 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 src/intl/pcm/page-gas.json diff --git a/src/intl/pcm/page-gas.json b/src/intl/pcm/page-gas.json new file mode 100644 index 00000000000..77c8df3e6bd --- /dev/null +++ b/src/intl/pcm/page-gas.json @@ -0,0 +1,64 @@ +{ + "page-gas-meta-title": "Gas fees on Ethereum: how dem dey wok?", + "page-gas-meta-description": "Make yu learn about gas on Ethereum: how dem dey wok and how to pay less for gas fees", + "page-gas-hero-title": "Gas fee", + "page-gas-hero-header": "Netwok fee", + "page-gas-hero-button-1-content": "Wetin bi gas?", + "page-gas-hero-subtitle-1": "Netwok fees on Ethereum na im dem dey koll gas.", + "page-gas-hero-subtitle-2": "Gas na di fuel wey dey make Ethereum wok.", + "page-gas-summary-title": "Summary", + "page-gas-summary-item-1": "Every transacshon on Ethereum nid one smoll type of payment to process am", + "page-gas-summary-item-2": "Na dis fees dem dey koll 'gas' fee", + "page-gas-summary-item-3": "Gas fees dey shanj base on netwok palava", + "page-gas-what-are-gas-fees-header": "Wetin bi gas fees?", + "page-gas-what-are-gas-fees-text-1": "Make yu tink of Ethereum as one big komputa netwok wia pipol fit dey do tins like send mesaj abi dey run programs. Just like for real world, dis dem wok nid enagi to do dem.", + "page-gas-what-are-gas-fees-text-2": "For Ethereum, ish komputashonal akshon get one set \"gas\" price. Yor gas fees na di total cost for di akshon for yor transakshon. Wen you send one transakshon abi run one smart kontract, yu go pay gas fees to process am.", + "page-gas-how-do-i-pay-less-gas-header": "How I go pay smoll gas?", + "page-gas-how-do-i-pay-less-gas-text": "As pesin nor fit afoid higher fees for Ethereum sometaims, e get some ways yu fit yus ridus di cost:", + "page-gas-how-do-i-pay-less-gas-card-1-title": "Make yu taim yor transakshons", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Just like pesin wey dey travel off-peak nor get plenti pipol and nor too cost, Ethereum dey generally cheap to wella wen pipol for North America dey sleep.", + "page-gas-how-do-i-pay-less-gas-card-2-title": "Make yu wait for gas to go down", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Gas price dey go upandan for every twelve seconds base on e dey busy rish for Ethereum. Wen gas prices dey high, to dey wait just for few minute bifor makin transakshon fit make yu si big drop in wetin yu pay.", + "page-gas-how-do-i-pay-less-gas-card-3-title": "Make yu yus Layer 2", + "page-gas-how-do-i-pay-less-gas-card-3-description": "Dem build Ethereum ontop Layer-2 chains, e dey give very smoll fees and dey handol more transakshons. Dem be gud shoise to save on fees for transakshons wey nor nid to hapun on di main Ethereum netwok.", + "page-gas-try-layer-2": "Make yu try layer 2", + "page-gas-what-causes-high-gas-fees-header": "Wetin dey kause high gas fees?", + "page-gas-what-causes-high-gas-fees-text-1": "Weneva di kalkulashon (gas) for Ethereum dey pass one kain level, gas fees go start to dey rise. Di more di gas go pass dis level, de faster gas fees dey inkrease.", + "page-gas-what-causes-high-gas-fees-text-2": "Popular dapps abi NFTs fit make fees dey higher, everytaim inkrease for trade on DEXs, abi one kain plenti numba of pipol wey dey yus am for di peak times.", + "page-gas-what-causes-high-gas-fees-text-3": "Pipol wey divelop Ethereum supose take kia to make dia smart contracts wok wella bifor dem bring am komot. If plenti pipol de yus smart contract wey dem nor write wella, im go chop more gas and im fit kause netwok palava kwik-kwik.", + "page-gas-want-to-dive-deeper": "Shey yu want enta wella?", + "page-gas-check-out-the-developer-docs": "Make yu shek di divelopa dokument.", + "page-gas-attack-of-the-cryptokitties-header": "Atak of di Cryptokitties", + "page-gas-attack-of-the-cryptokitties-text": "For november 2017, dem launch di pupola CryptoKitties project. Di kain pipol wey like am make am get plenti netwok palava and make am get high gas fees. Di shalenj wey CryptoKitties kause speed am up to dey find solushon to make Ethereum grow wella.", + "page-gas-why-do-we-need-gas-header": "Why wi nid gas?", + "page-gas-why-do-we-need-gas-text": "Gas na one ogbonge element to dey yus kip Ethereum and dey process transakshons. Gas dey helep for many ways:", + "page-gas-benefits-1-description": "Gas dey kip Ethereum safe as im dey prevent wayo pipol from enterin di netwok wella wit dem korup aktivitis.", + "page-gas-benefits-2-description": "Bikos kalkulashon dey make gas cost plenti, and dey make Ethereum get transakshons wey dey too high, weda by asident abi by wayo, e nor dey enkoraj finanshialy.", + "page-gas-benefits-3-description": "One hard-limit for di amount to dey kalkulate dat fit hapun at any taim dey prevent pipol to dey ova yus Ethereum, as im dey helep to make sure sey pipol fit yus di netwok always.", + "page-gas-how-is-gas-calculated-header": "How dem dey kalkulate gas?", + "page-gas-advanced": "Waya Pass", + "page-gas-how-is-gas-calculated-text-1": "Di total gas fee yu dey pay is made up of few pats:", + "page-gas-how-is-gas-calculated-item-1": "Base fee: one fee set by di netwok wey pipol fit yus pay for transakshon", + "page-gas-how-is-gas-calculated-item-2": "Priority fee: one opshon tip to dey incentiviz node operators to add yor transakshon", + "page-gas-how-is-gas-calculated-item-3": "Units of gas dem don yus*: shey yu rimemba wi tok sey gas reprisent komputashon? Plenti akshons wey hard, like to dey meet wit one smart contract, dey yus more gas pass simpol ones, like to dey send one transakshon.", + "page-gas-how-is-gas-calculated-list-item-1": "* Make yu si Figor 1 to si how much gas difrent types of transakshon dey yus", + "page-gas-how-is-gas-calculated-text-2": "Di formula wen kalkulatin one gas fee na units for gas yuse * (base fee + priority fee). All wallets go kalkulate gas yus and show am for inside diret way.", + "page-gas-table-figure": "Figor 1: Gas yus by transakshon type", + "page-gas-table-header-1": "Transakshon type", + "page-gas-table-header-2": "Units of gas yus", + "page-gas-table-item-1-transaction-type": "To dey send ETH", + "page-gas-table-item-2-transaction-type": "To dey send ERC-20 tokens", + "page-gas-table-item-3-transaction-type": "To dey transfer and NFT", + "page-gas-table-item-4-transaction-type": "To dey swap on Uniswap", + "page-gas-faq-header": "Kweshon wey pipol dey ask", + "page-gas-faq-question-1-q": "Who dem pay di gas fee for mai transakshon?", + "page-gas-faq-question-1-a-1": "Di maority na gas fee—di base fee— dey distroy by di protokol (burned). Di priority fee, if dem add am for yor transakshon, dem go give am for de validator wey propose yor transakshon.", + "page-gas-faq-question-1-a-2": "You fit rid detail diskripshon of di process inside di gas divelopa dokument.", + "page-gas-faq-question-2-q": "Shey I supose pay gas in ETH?", + "page-gas-faq-question-2-a-1": "Yes. Yu supose pay all gas fees on Ethereum in di native ETH currency.", + "page-gas-faq-question-2-a-2": "More on ETH", + "page-gas-faq-question-3-q": "Wetin bi gwei?", + "page-gas-faq-question-3-a-1": "For plenti wallets abi gas trackas, yu go si gas price denominated as 'gwei'.", + "page-gas-faq-question-3-a-2": "Gwei na just one smolla unit of ETH, just as pennies bi to dollars, wit di difrens wey bi 1 ETH ekwols 1 billion gwei. Gwei dey yusful wen wi dey tok about amounts of ETH wey smoll wella.", + "page-gas-use-layer-2": "Make yu yus Layer 2" +} diff --git a/src/intl/pcm/page-get-eth.json b/src/intl/pcm/page-get-eth.json index 7422356f8ff..490334aa769 100644 --- a/src/intl/pcm/page-get-eth.json +++ b/src/intl/pcm/page-get-eth.json @@ -9,21 +9,30 @@ "page-get-eth-cex-desc": "Ekshanj na biznes wey go alow yu buy crypto wit normal money. Dem get pawa on top any ETH wey yu buy ontil yu send am go yor own wallet.", "page-get-eth-checkout-dapps-btn": "Shek dem dapps", "page-get-eth-community-safety": "Komunity posts on sekurity", - "page-get-eth-description": "Gofament of kompany nor dey kontrol Ethereum abi ETH - dem dey desentralize. E mean say ETH's dey open for evryone to yus.", + "page-get-eth-description": "Any singol organizashon nor dey Ethereum - im dey desentralize.", "page-get-eth-dex": "Desentralize ekshanj (DEXs)", - "page-get-eth-dex-desc": "If yu wont dey kontrol, make yu buy ETH peer to peer. Wit DEX yu fit trade am and yu nor go give any kompany yor money.", + "page-get-eth-dex-desc": "If you wont more control join, buy ETH make yu yus smart kontrats. Wit one DEX yu fit trade digital assets witout givin kontrol of yor money to one sentralize kompany.", + "page-get-eth-peers": "Make yu risiv ETH from una peers", + "page-get-eth-peers-desc": "Wons yu don get one Ethereum akant, all yu nid do na make yu shia yor address to bigin dey send and to dey risiv ETH (and oda tokens) peer-to-peer.", + "page-get-eth-staking": "Staking rewards", + "page-get-eth-staking-desc": "If yu don get som ETH bifor, yu fit dey make more money as yu dey run one validator node join. Dem go pay yu for doing dis verifikashon wok for ETH.", + "page-get-eth-earn": "Mak yu earn ETH", + "page-get-eth-earn-desc": "Yu fit dey earn ETH if yu dey wok for DAOs abi kompany wey dey pay crypto, dey win bounties, dey find software bugs and more join.", + "page-get-eth-daos-link-desc": "Make yu learn about DAOs", + "page-get-eth-cex-link-desc": "See one list for ekshanj", + "page-get-eth-staking-link-desc": "Make yu learn more on how to dey stak", "page-get-eth-dexs": "Decentralized exchanges (DEXs)", "page-get-eth-dexs-desc": "Desentralize ekshanj na open market for ETH and oda tokens. Dem dey konet buyers and sellers straight.", "page-get-eth-dexs-desc-2": "Insted make yu yus anoda pesin to safeguard funds on top yor transakshons, dem dey yus kode. De seller ETH go komot wen de payment don konfam. Na dis kain kode dem dey koll smart kontract.", - "page-get-eth-dexs-desc-3": "E mean say dem nor dey look yor lokashon. If pesin dey sell wetin yu wont buy and dem fit kolet money wey yu fit pay, una go run di transakshon. DEXs fit let yu buy ETH wit oda tokens, Papal abi even if na kash you hold.", + "page-get-eth-dexs-desc-3": "Dis mean sey small geographical blokaj fit dey pass sentralize alternatives. If one person dey sell wetin yu wont and gri for one payment metod yu fit provide, yu fit kontinu.", "page-get-eth-do-not-copy": "Eksampol: Nor kopy am", "page-get-eth-exchanges-disclaimer": "Na hand wi take kolet dis info. If yu si say somtin nor koret, let us sabi for", - "page-get-eth-exchanges-empty-state-text": "Enta di kountry wey yu dey stay to si one list of wallets and ekshanjis wey yu fit yus buy ETH", + "page-get-eth-exchanges-empty-state-text": "Enta yor kountry wey yu dey stay to see list of ekshanj wey yu fit yus", "page-get-eth-exchanges-except": "Eksept", "page-get-eth-exchanges-header": "Wich kountry you dey stay?", "page-get-eth-exchanges-header-exchanges": "Eshanjis", "page-get-eth-exchanges-header-wallets": "Wallets", - "page-get-eth-exchanges-intro": "Ekshanjis and wallets get som place wia dem fit sell crypto.", + "page-get-eth-exchanges-intro": "Ekshanj get some places yu nor fit sell crypto to. Dis na na list wey dey show savis wey dey operate for ish kountry. Endorsement nor dey inside hia - make yu do yor own research!", "page-get-eth-exchanges-no-exchanges": "Nor vex, wi nor sabi any ekshanjis wey fit alow yu buy ETH from dis kountry. If yu sabi, make wi sabi", "page-get-eth-exchanges-no-exchanges-or-wallets": "Nor vex, wi nor sabi any ekshanjis wey fit alow yu buy ETH from dis kountry. If yu sabi, make wi sabi", "page-get-eth-exchanges-no-wallets": "Nor vex, wi nor sabi any wallets wey fit alow yu buy ETH from dis kountry. If yu do, make wi sabi", @@ -36,30 +45,30 @@ "page-get-eth-hero-image-alt": "Make yu get ETH hero imaj", "page-get-eth-keep-it-safe": "Make yu kip yor ETH safe", "page-get-eth-meta-description": "Hau yu fit buy ETH based on wia yu dey live and hau yu go take kip am.", - "page-get-eth-meta-title": "Hau yu fit buy ETH", + "page-get-eth-meta-title": "How yu fit get ETH", "page-get-eth-need-wallet": "Yu go nid wallet to yus one DEX.", "page-get-eth-new-to-eth": "Yu dey new to ETH? Here na wetin fit make yu stat.", "page-get-eth-other-cryptos": "Make yu buy wit oda crypto", - "page-get-eth-protect-eth-desc": "If yu get plan to buy plenty ETH yu go wont kip am for wallet wey yu get kontrol ova, nor bi ekshanj. Bikos hackers dey target ekshanj. If dem enta, yu fit luz yor money. But na only yu get kontrol of yor wallet.", - "page-get-eth-protect-eth-in-wallet": "Protet yor ETH inside wallet", + "page-get-eth-protect-eth-desc": "One of di ogbonge features for Ethereum bi sey yu go dey kontrol yor own asset as yu dey manaj yor own akant. Dis mean sey yu nor nid trust anoda person wit yor asset, and yu dey safe from anoda person wey want do wayo, goin luzin everytin wey yu get. Howeva, im also mean sey na yu dey in sharge for yor own sekurity.", + "page-get-eth-protect-eth-in-wallet": "Make yu kip yor ETH for yor own wallet", "page-get-eth-search-by-country": "Mak yu search by kountry", - "page-get-eth-security": "But e mean say yu gat take di sekurity of yor money sirios. Wit ETH, yu nor dey trust bank to helep yu look afta yor money, na yorsef yu go trust.", + "page-get-eth-security": "Dis mean sey yu nid to take di sekurity for yor money wella. Wit ETH, yu nor dey trust bank abi kompany to look afta yor assset, na yu dey do dat for yorsef.", "page-get-eth-smart-contract-link": "More on smart kontracts", "page-get-eth-swapping": "Swap yor tokens for anoda pesin ETH. And vice versa.", "page-get-eth-try-dex": "Try one DEX", "page-get-eth-use-your-eth": "Yus yor ETH", "page-get-eth-use-your-eth-dapps": "Nau wey yu get some ETH, shek some Ethereum aplikashon (dapps). Dem bi dapps for finans, soshial media, gamin and plenti difren kategoris.", "page-get-eth-wallet-instructions": "Folow wallet instrushon", - "page-get-eth-wallet-instructions-lost": "If yu luz asess to yor wallet, yu go luz all yor money. Yor wallet supose to give yu instrukshon on hau yu fit take afoid dis. Make sure say yu folow doz instrukshons well -- norbody gor fit helep yu if yu luz asess to yor wallet.", + "page-get-eth-wallet-instructions-lost": "If yu luz kontrol of yor akant, yu go luz yor money. Yor wallet supose tell yu how to dey protect am. Make yu dey folow dem kiafuly - for plenti cases, nor one fit helep yu if yu nor fit enta yor akant.", "page-get-eth-wallets": "Wallets", "page-get-eth-wallets-link": "More on wallets", "page-get-eth-wallets-purchasing": "Some wallet fit alow yu buy crypto wit yor debit/credit kard, even bank transfer abi Apple Pay. Im dipend on wia yu dey live.", - "page-get-eth-warning": "Dis DEXs nor bi for beginnas as yu go nid some ETH to yus dem.", + "page-get-eth-warning": "Dis dem DEXs nor dey for biginas as yu go nid some ETH to yus dem. Dis na just eksampols, nor bi products wey wi don stamp. Make yu do yor own research!", "page-get-eth-what-are-DEX's": "Wetin bi DEXs?", "page-get-eth-whats-eth-link": "Wetin bi ETH?", - "page-get-eth-where-to-buy-desc": "Yu fit buy ETH from ekshanjis abi from wallets diret.", + "page-get-eth-where-to-buy-desc": "Yu fit earn ETH, risiv am from yor peers, abi buy am from ekshanjis and apps.", "page-get-eth-where-to-buy-desc-2": "Shek wich savis yu fit yus based on wia yu dey live.", - "page-get-eth-where-to-buy-title": "Wia yu go buy ETH", + "page-get-eth-where-to-buy-title": "Wia to get ETH", "page-get-eth-your-address": "Yor ETH address", "page-get-eth-your-address-desc": "Wen yu download wallet, e go kreate publik ETH address for yu. Si hau dis go look like:", "page-get-eth-your-address-desc-3": "Rizin am like yu email address, but insted make yu risiv mail, yu go risiv ETH. If yu wan transfa ETH from ekshanj to yor wallet, yus yor address as di destinashon. Make sure say yu shek am wella bifor yu send am o!", diff --git a/src/intl/pcm/page-wallets-find-wallet.json b/src/intl/pcm/page-wallets-find-wallet.json index 502fe5ebf0d..7da6e81dbcb 100644 --- a/src/intl/pcm/page-wallets-find-wallet.json +++ b/src/intl/pcm/page-wallets-find-wallet.json @@ -49,8 +49,8 @@ "page-find-wallet-token-support": "Token suport", "page-find-wallet-features": "Features", "page-find-wallet-security": "Security", - "page-find-wallet-smart-contract": "Smart contract", - "page-find-wallet-check-out": "Check out", + "page-find-wallet-smart-contract": "Smart kontrat", + "page-find-wallet-check-out": "Shek out", "page-find-wallet-info-updated-on": "info wey dey updated on", "page-find-wallet-showing-all-wallets": "To dey show all di wallets", "page-find-wallet-showing": "As e dey show", @@ -81,7 +81,7 @@ "page-find-wallet-feature-filters": "Feature filtas", "page-find-wallet-footnote-1": "Wallets wey dem list for dis page nor get official endorsements, and dem dey provided only for informashional purposes.", "page-find-wallet-footnote-2": "Di wallet projects don already provide dia diskripshon demsefs.", - "page-find-wallet-footnote-3": "Wi add prodcuts to dis page based on di kriteria wey dey awa listin policy. If yu go like add new wallet, you fit raise issue for di GitHub.", + "page-find-wallet-footnote-3": "Wi add products to dis page based on di kriteria wey dey inside awa listin policy. If yu go like add new wallet, yu fit raise issue for di GitHub.", "page-find-wallet-mobile": "Mobile", "page-find-wallet-mobile-desc": "Wallet wey get mobile apps", "page-find-wallet-desktop": "Desktop", @@ -90,5 +90,6 @@ "page-find-wallet-browser-desc": "Wallets wey get browser Eksepshon", "page-find-wallet-device": "Device", "page-find-choose-to-compare": "Make yu shuse to kompia", - "page-find-wallet-choose-features": "Shuse features" + "page-find-wallet-choose-features": "Shuse features", + "page-find-wallet-reset-filters": "Make yu reset filters" } diff --git a/src/intl/pcm/page-wallets.json b/src/intl/pcm/page-wallets.json index 6b80e39722f..7297af1434b 100644 --- a/src/intl/pcm/page-wallets.json +++ b/src/intl/pcm/page-wallets.json @@ -28,7 +28,7 @@ "page-wallets-keys-to-safety": "Key wey you fit yus kip yor crypto safe", "page-wallets-manage-funds": "One App wey yu fit manaj yor funds", "page-wallets-manage-funds-desc": "Yor wallet go show yor balans, transashon history and e go give yu hau you fit take send/risiv funds. Some wallet dey do more things.", - "page-wallets-meta-description": "Wetin yu nid sabi yus Ethereum wallets for.", + "page-wallets-meta-description": "Wetin yu nid sabi yus ethreum wallets for.", "page-wallets-meta-title": "Ethereum wallets", "page-wallets-mobile": "Mobile aplikashons wey fit make yu asess yor money from anywia", "page-wallets-more-on-dapps-btn": "More on dapps", diff --git a/src/intl/pcm/page-what-is-ethereum.json b/src/intl/pcm/page-what-is-ethereum.json index db9b5287c5e..2f7546b469b 100644 --- a/src/intl/pcm/page-what-is-ethereum.json +++ b/src/intl/pcm/page-what-is-ethereum.json @@ -65,7 +65,7 @@ "page-what-is-ethereum-explore-applications": "Kome shek aplikashons", "page-what-is-ethereum-learn-defi": "Kom learn about DeFi", "page-what-is-ethereum-who-runs-ethereum-title": "Who dey run Ethereum?", - "page-what-is-ethereum-who-runs-ethereum-desc-1": "Ethereum nor dey unda di kontrol of any paticula pipol abi tin. E dey exist anytaim wen komputas wey konet dey run software wey dey follow d Ethereum protocol and dey add to di Ethereum blockchain. Ish of dis komputas dem sabi as node. Anybody fit run nodes, aldoh if yu wont patisipate for sikurin di netwok, yu go nid stake ETH (Ethereum’s native token). Anybody wey get 32 ETH fit do dis without any pamishon.", + "page-what-is-ethereum-who-runs-ethereum-desc-1": "Ethereum nor dey unda di kontrol of any paticula pipol abi tin. E dey exist anytaim wen komputas wey konet dey run software wey dey follow d Etereumd protocol and dey add to di Ethereum blockchain. Ish of dis komputas dem sabi as node. Anybody fit run nodes, aldoh if yu wont patisipate for sikurin di netwok, yu go nid stake ETH (Ethereum’s native token). Anybody wey get 32 ETH fit do dis without any pamishon.", "page-what-is-ethereum-who-runs-ethereum-desc-2": "Even di Ethereum sorse kode nor dey kome from one singol entity. Anybody fit sujest shanges to di protokol and diskus upgrades. Dem get plenti implimentashon of di Ethereum protocol wey dey come from independent organizashons for diferen programin languaj, and dem usually dey built for di open and dey enkoraj kontribushons from di komunity.", "page-what-is-ethereum-run-a-node": "Run node", "page-what-is-ethereum-smart-contract-title": "What are smart contracts?", From 4823e38a0333843f0b42e0b07ea34954d13ee0e0 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 17:06:58 -0700 Subject: [PATCH 377/478] Polish import Feb 20 (Essentials, Use cases, Learn hub & guide) --- src/intl/pl/learn-quizzes.json | 2 +- src/intl/pl/page-gas.json | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/intl/pl/learn-quizzes.json b/src/intl/pl/learn-quizzes.json index 19551e48a34..5a8530cfed6 100644 --- a/src/intl/pl/learn-quizzes.json +++ b/src/intl/pl/learn-quizzes.json @@ -155,7 +155,7 @@ "d001-a-label": "Portfel mobilny", "d001-a-explanation": "Portfele mobilne przechowują klucze prywatne na urządzeniu mobilnym, które zazwyczaj posiada połączenie z internetem i może być zagrożone przez inne oprogramowanie.", "d001-b-label": "Portfel sprzętowy", - "d001-b-explanation": "Klucze prywatne portfela sprzętowego są przechowywane na dedykowanym urządzeniu, które może być przechowywane bez internetu oraz są odizolowane od innych aplikacji na Twoich urządzeniach.", + "d001-b-explanation": "Klucze prywatne portfela sprzętowego są przechowywane na przeznaczonym do tego urządzeniu, które może być odcięte od internetu, oraz są odizolowane od innych aplikacji na Twoich urządzeniach.", "d001-c-label": "Portfel internetowy", "d001-c-explanation": "Portfele internetowe są mniej bezpieczne niż portfele sprzętowe, ponieważ klucze prywatne są przechowywane na urządzeniu podłączonym do internetu.", "d001-d-label": "Portfel komputerowy", diff --git a/src/intl/pl/page-gas.json b/src/intl/pl/page-gas.json index 209bb4b3ba8..47e6ce3a664 100644 --- a/src/intl/pl/page-gas.json +++ b/src/intl/pl/page-gas.json @@ -1,6 +1,6 @@ { - "page-gas-meta-title": "Opłaty za gaz na Ethereum: jak działają?", - "page-gas-meta-description": "Dowiedz się o gazie na Ethereum, o tym, jak działa i jak płacić mniejsze opłaty za gaz", + "page-gas-meta-title": "Opłaty za gaz w Ethereum: jak działają?", + "page-gas-meta-description": "Dowiedz się więcej o gazie w Ethereum: jak działa i jak płacić za niego mniejsze opłaty", "page-gas-hero-title": "Opłaty za gaz", "page-gas-hero-header": "Opłaty sieciowe", "page-gas-hero-button-1-content": "Co to jest gaz?", @@ -8,40 +8,40 @@ "page-gas-hero-subtitle-2": "Gaz jest paliwem zasilającym Ethereum.", "page-gas-summary-title": "Podsumowanie", "page-gas-summary-item-1": "Każda transakcja na Ethereum wymaga niewielkiej płatności, aby została przetworzona", - "page-gas-summary-item-2": "Te opłaty są znane jako opłata za „gaz”", + "page-gas-summary-item-2": "Te opłaty są znane jako opłaty za „gaz”", "page-gas-summary-item-3": "Opłaty za gaz zmieniają się w zależności od przeciążenia sieci", "page-gas-what-are-gas-fees-header": "Czym są opłaty za gaz?", - "page-gas-what-are-gas-fees-text-1": "Pomyśl o Ethereum jak o dużej sieci komputerowej, w której ludzie mogą wykonywać zadania, takie jak wysyłanie wiadomości lub uruchamianie programów. Podobnie jak w prawdziwym świecie, zadania te wymagają energii do ich wykonania.", - "page-gas-what-are-gas-fees-text-2": "W Ethereum każde działanie obliczeniowe ma ustaloną cenę „gazu”. Twoje opłaty za gaz to całkowity koszt działań w Twojej transakcji. Kiedy wysyłasz transakcję lub uruchamiasz inteligentny kontrakt, płacisz opłaty za gaz, aby dane działanie zostało przetworzone.", + "page-gas-what-are-gas-fees-text-1": "Pomyśl o Ethereum jak o dużej sieci komputerowej, w której ludzie mogą wykonywać zadania, np. wysyłać wiadomości lub uruchamiać programy. Podobnie jak w prawdziwym świecie wykonanie tych zadań wymaga energii.", + "page-gas-what-are-gas-fees-text-2": "W Ethereum każde działanie obliczeniowe ma ustaloną cenę „gazu”. Twoja opłata za gaz to całkowity koszt działań w Twojej transakcji. Kiedy wysyłasz transakcję lub uruchamiasz inteligentny kontrakt, uiszczasz opłatę za gaz, aby działanie zostało przetworzone.", "page-gas-how-do-i-pay-less-gas-header": "Jak płacić mniej za gaz?", - "page-gas-how-do-i-pay-less-gas-text": "Chociaż wyższe opłaty za Ethereum są czasami nieuniknione, istnieją strategie, których możesz użyć, aby obniżyć koszty:", + "page-gas-how-do-i-pay-less-gas-text": "Chociaż wyższe opłaty w Ethereum są czasami nieuniknione, istnieją strategie, które pozwalają obniżyć koszty:", "page-gas-how-do-i-pay-less-gas-card-1-title": "Planuj czas transakcji", - "page-gas-how-do-i-pay-less-gas-card-1-description": "Podobnie jak podróżowanie poza sezonem wiąże się z mniejszym zatłoczeniem i bardziej przystępnymi cenami, tak Ethereum jest generalnie tańsze w użyciu, gdy Ameryka Północna śpi.", + "page-gas-how-do-i-pay-less-gas-card-1-description": "Podobnie jak podróżowanie poza sezonem wiąże się z mniejszym tłokiem i bardziej przystępnymi cenami, tak Ethereum jest generalnie tańsze w użyciu, gdy Ameryka Północna śpi.", "page-gas-how-do-i-pay-less-gas-card-2-title": "Poczekaj na spadek cen gazu", - "page-gas-how-do-i-pay-less-gas-card-2-description": "Ceny gazu rosną i spadają co dwanaście sekund w zależności od zatłoczenia Ethereum. Gdy ceny gazu są wysokie, odczekanie zaledwie kilku minut przed dokonaniem transakcji może spowodować znaczny spadek ceny.", + "page-gas-how-do-i-pay-less-gas-card-2-description": "Ceny gazu rosną i spadają co dwanaście sekund w zależności od ruchu w Ethereum. Gdy są wysokie, zaledwie kilka minut odczekania przed dokonaniem transakcji może wystarczyć, by znacząco spadły.", "page-gas-how-do-i-pay-less-gas-card-3-title": "Używanie warstwy 2", "page-gas-how-do-i-pay-less-gas-card-3-description": "Łańcuchy warstwy 2 są zbudowane na Ethereum, oferując niższe opłaty i obsługując więcej transakcji. Są dobrym wyborem, aby zaoszczędzić na opłatach za transakcje, które nie muszą odbywać się w głównej sieci Ethereum.", "page-gas-try-layer-2": "Wypróbuj warstwę 2", "page-gas-what-causes-high-gas-fees-header": "Co powoduje wysokie ceny za gaz?", - "page-gas-what-causes-high-gas-fees-text-1": "Gdy tylko ilość obliczeń (gazu) w Ethereum przekroczy określony próg, opłaty za gaz zaczynają rosnąć. Im bardziej gaz przekracza ten próg, tym szybciej rosną opłaty za gaz.", - "page-gas-what-causes-high-gas-fees-text-2": "Wyższe opłaty mogą być spowodowane przez rzeczy takie jak popularne zdecentralizowane aplikacje lub NFT, okresowo zwiększony handel na DEX lub przytłaczającą liczbę aktywności użytkowników w godzinach szczytu.", - "page-gas-what-causes-high-gas-fees-text-3": "Deweloperzy na Ethereum powinni zadbać o optymalizację wykorzystania swoich inteligentnych kontraktów przed ich wdrożeniem. Jeśli wiele osób korzysta ze słabo napisanego inteligentnego kontraktu, będzie on zużywał więcej gazu i może nieumyślnie spowodować przeciążenie sieci.", + "page-gas-what-causes-high-gas-fees-text-1": "Gdy tylko ilość obliczeń (gazu) w Ethereum przekroczy określony próg, opłaty za gaz zaczynają rosnąć. Im bardziej ten próg jest przekroczony, tym szybciej rosną opłaty za gaz.", + "page-gas-what-causes-high-gas-fees-text-2": "Wyższe opłaty mogą być spowodowane przez takie rzeczy jak popularne zdecentralizowane aplikacje lub NFT, okresowo zwiększony handel na DEX lub przytłaczającą liczbę aktywności użytkowników w godzinach szczytu.", + "page-gas-what-causes-high-gas-fees-text-3": "Deweloperzy w Ethereum powinni zadbać o optymalizację wykorzystania swoich inteligentnych kontraktów przed ich wdrożeniem. Jeśli wiele osób korzysta ze słabo napisanego inteligentnego kontraktu, będzie on zużywał więcej gazu i może nieumyślnie spowodować przeciążenie sieci.", "page-gas-want-to-dive-deeper": "Chcesz zagłębić się w temat?", "page-gas-check-out-the-developer-docs": "Zapoznaj się z dokumentacją dla deweloperów.", "page-gas-attack-of-the-cryptokitties-header": "Atak Cryptokitties", - "page-gas-attack-of-the-cryptokitties-text": "W listopadzie 2017 r. wystartował popularny projekt CryptoKitties. Jego gwałtowny wzrost popularności spowodował znaczne przeciążenie sieci i niezwykle wysokie opłaty za gaz. Wyzwania stawiane przez projekt CryptoKitties przyspieszyły pilną potrzebę znalezienia rozwiązań do skalowania Ethereum.", + "page-gas-attack-of-the-cryptokitties-text": "W listopadzie 2017 r. wystartował popularny projekt CryptoKitties. Gwałtowny wzrost jego popularności spowodował znaczne przeciążenie sieci i niezwykle wysokie opłaty za gaz. Wyzwania stawiane przez CryptoKitties zwiększyły potrzebę znalezienia rozwiązań do skalowania Ethereum.", "page-gas-why-do-we-need-gas-header": "Dlaczego potrzebujemy gazu?", - "page-gas-why-do-we-need-gas-text": "Gaz jest kluczowym elementem zapewniającym bezpieczeństwo Ethereum i przetwarzanie transakcji. Gaz pomaga na wiele sposobów:", - "page-gas-benefits-1-description": "Gaz sprawia, że Ethereum jest odporne na atak Sybil, uniemożliwiając złośliwym podmiotom przeciążanie sieci nieuczciwymi czynnościami.", + "page-gas-why-do-we-need-gas-text": "Gaz jest kluczowym elementem zapewniającym bezpieczeństwo Ethereum i przetwarzanie transakcji. Pomaga na wiele sposobów:", + "page-gas-benefits-1-description": "Gaz sprawia, że Ethereum jest odporne na atak Sybil, uniemożliwiając złośliwym podmiotom przeciążanie sieci nieuczciwymi aktywnościami.", "page-gas-benefits-2-description": "Ponieważ obliczenia kosztują gaz, spamowanie Ethereum drogimi transakcjami, zarówno przypadkowo, jak i złośliwie, jest finansowo utrudnione.", "page-gas-benefits-3-description": "Twardy limit ilości obliczeń, które można wykonać w danym momencie, zapobiega przeciążaniu Ethereum, pomagając zapewnić stałą dostępność sieci.", "page-gas-how-is-gas-calculated-header": "Jak obliczany jest gaz?", "page-gas-advanced": "Zaawansowane", "page-gas-how-is-gas-calculated-text-1": "Całkowita opłata za gaz składa się z kilku części:", - "page-gas-how-is-gas-calculated-item-1": "Opłata podstawowa: opłata ustalana przez sieć, którą należy uiścić za transakcję", + "page-gas-how-is-gas-calculated-item-1": "Opłata podstawowa: ustalana przez sieć opłata, którą należy uiścić za transakcję", "page-gas-how-is-gas-calculated-item-2": "Opłata priorytetowa: opcjonalny napiwek zachęcający operatorów węzłów do uwzględnienia Twojej transakcji", - "page-gas-how-is-gas-calculated-item-3": "Ilość zużytego gazu*: pamiętasz, jak mówiliśmy, że gaz reprezentuje obliczenia? Bardziej złożone działania, takie jak interakcja z inteligentnym kontraktem, zużywają więcej gazu niż proste, takie jak wysyłanie transakcji.", - "page-gas-how-is-gas-calculated-list-item-1": "* Sprawdź Tabelę 1, aby zobaczyć, ile gazu zużywają różne rodzaje transakcji", + "page-gas-how-is-gas-calculated-item-3": "Ilość zużytego gazu*: pamiętasz, jak mówiliśmy, że gaz reprezentuje obliczenia? Bardziej złożone działania, takie jak interakcja z inteligentnym kontraktem, zużywają więcej gazu niż te proste, takie jak wysłanie transakcji.", + "page-gas-how-is-gas-calculated-list-item-1": "* W Tabeli 1 możesz sprawdzić, ile gazu zużywają różne rodzaje transakcji", "page-gas-how-is-gas-calculated-text-2": "Wzór na obliczenie opłaty za gaz to: ilość zużytego gazu * (opłata podstawowa + opłata priorytetowa). Większość portfeli oblicza zużycie gazu i wyświetla je w prostszy sposób.", "page-gas-table-figure": "Tabela 1: Zużycie gazu według rodzaju transakcji", "page-gas-table-header-1": "Rodzaj transakcji", From ae2b4625b06ca26d891e5cdd2b62754740a5213a Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:17:31 -0800 Subject: [PATCH 378/478] revert: string regressions / english strings --- src/intl/ko/common.json | 4 +-- src/intl/ko/page-gas.json | 56 --------------------------------------- 2 files changed, 2 insertions(+), 58 deletions(-) diff --git a/src/intl/ko/common.json b/src/intl/ko/common.json index d7de7046e1c..165bd0c7902 100644 --- a/src/intl/ko/common.json +++ b/src/intl/ko/common.json @@ -96,7 +96,7 @@ "feedback-card-prompt-tutorial": "이 튜토리얼이 도움이 되셨나요?", "feedback-widget-thank-you-title": "피드백을 주셔서 감사합니다!", "feedback-widget-thank-you-subtitle": "몇 가지 질문에 답하여 이 페이지를 개선해 주세요.", - "feedback-widget-thank-you-subtitle-ext": "도움이 필요하다면 Discord에서 커뮤니티를 활용해 보십시오.", + "feedback-widget-thank-you-subtitle-ext": "도움이 필요하다면 Discord에서 커뮤니티를 활용해 보십시오.", "feedback-widget-thank-you-timing": "2–3분", "feedback-widget-thank-you-cta": "짧은 공개 설문조사", "find-wallet": "지갑 찾기", @@ -107,7 +107,7 @@ "grants": "지원금", "grant-programs": "생태계 지원금 프로그램", "guides": "가이드", - "guides-hub": "How-to guides", + "guides-hub": "가이드 허브", "history-of-ethereum": "이더리움 연혁", "home": "홈", "how-ethereum-works": "이더리움의 작동 원리", diff --git a/src/intl/ko/page-gas.json b/src/intl/ko/page-gas.json index bed3fa03513..f8b3dba2626 100644 --- a/src/intl/ko/page-gas.json +++ b/src/intl/ko/page-gas.json @@ -1,64 +1,8 @@ { - "page-gas-meta-title": "Gas fees on Ethereum: how do they work?", - "page-gas-meta-description": "Learn about gas on Ethereum: how they work and how to pay less in gas fees", - "page-gas-hero-title": "Gas fees", - "page-gas-hero-header": "Network fees", "page-gas-hero-button-1-content": "가스란 무엇인가요?", - "page-gas-hero-subtitle-1": "Network fees on Ethereum are called gas.", - "page-gas-hero-subtitle-2": "Gas is the fuel that powers Ethereum.", "page-gas-summary-title": "요약", - "page-gas-summary-item-1": "Every transaction on Ethereum requires a small form of payment to process", - "page-gas-summary-item-2": "These fees are known as ‘gas’ fee", - "page-gas-summary-item-3": "Gas fees change based on network congestion", - "page-gas-what-are-gas-fees-header": "What are gas fees?", - "page-gas-what-are-gas-fees-text-1": "Think of Ethereum as a large computer network where people can do tasks like sending messages or running programs. Just like in the real world, these tasks require energy to get done.", - "page-gas-what-are-gas-fees-text-2": "In Ethereum, each computational action has a set \"gas\" price. Your gas fees are the total cost of the actions in your transaction. When you send a transaction or run a smart contract, you pay in gas fees to process it.", - "page-gas-how-do-i-pay-less-gas-header": "How do I pay less gas?", - "page-gas-how-do-i-pay-less-gas-text": "While higher fees on Ethereum are sometimes inevitable, there are strategies you can use to reduce the cost:", - "page-gas-how-do-i-pay-less-gas-card-1-title": "Time your transactions", - "page-gas-how-do-i-pay-less-gas-card-1-description": "Just like travelling off-peak is less crowded and more affordable, Ethereum is generally cheaper to use when North America is asleep.", - "page-gas-how-do-i-pay-less-gas-card-2-title": "Wait for gas to go down", - "page-gas-how-do-i-pay-less-gas-card-2-description": "Gas prices go up and down every twelve seconds based on how congested Ethereum is. When gas prices are high, waiting just a few minutes before making a transaction could see a significant drop in what you pay.", "page-gas-how-do-i-pay-less-gas-card-3-title": "레이어 2 사용", - "page-gas-how-do-i-pay-less-gas-card-3-description": "Layer-2 chains are built atop Ethereum, offering lower fees and handling more transactions. They're a good choice to save on fees for transactions that don't need to happen on the main Ethereum network.", - "page-gas-try-layer-2": "Try layer 2", - "page-gas-what-causes-high-gas-fees-header": "What causes high gas fees?", - "page-gas-what-causes-high-gas-fees-text-1": "Whenever the amount of computation (gas) on Ethereum exceeds a certain threshold, gas fees begin to rise. The more the gas exceeds this threshold, the quicker gas fees increase.", - "page-gas-what-causes-high-gas-fees-text-2": "Higher fees could be caused by things like popular dapps or NFTs, periodically increased trading on DEXs, or an overwhelming number of user activity at peak times.", - "page-gas-what-causes-high-gas-fees-text-3": "Developers on Ethereum should take care to optimise their smart contracts usage before deploying. If lots of people are using a poorly written smart contract, it will consume more gas and could inadvertently cause network congestion.", - "page-gas-want-to-dive-deeper": "Want to dive deeper?", - "page-gas-check-out-the-developer-docs": "Check out the developer docs.", - "page-gas-attack-of-the-cryptokitties-header": "Attack of the Cryptokitties", - "page-gas-attack-of-the-cryptokitties-text": "In November 2017, the popular CryptoKitties project was launched. Its rapid spike in popularity caused significant network congestion and extremely high gas fees. The challenges posed by CryptoKitties accelerated the urgency of finding solutions for scaling Ethereum.", - "page-gas-why-do-we-need-gas-header": "Why do we need gas?", - "page-gas-why-do-we-need-gas-text": "Gas is a critical element in keeping Ethereum secure and processing transactions. Gas helps in many ways:", - "page-gas-benefits-1-description": "Gas keeps Ethereum sybil-resistant by preventing malicious actors from overwhelming the network with fraudulent activities.", - "page-gas-benefits-2-description": "Because computation costs gas, spamming Ethereum with expensive transactions, either accidentally and maliciously, is financially disencentivised.", - "page-gas-benefits-3-description": "A hard-limit on the amount of computation that can be done at any one time prevents Ethereum from being overwhelmed, helping to ensure the network is always accessible.", - "page-gas-how-is-gas-calculated-header": "How is gas calculated?", "page-gas-advanced": "고급", - "page-gas-how-is-gas-calculated-text-1": "The total gas fee you pay is made up of a few parts:", - "page-gas-how-is-gas-calculated-item-1": "Base fee: a fee set by the network that has to be paid for a transaction", - "page-gas-how-is-gas-calculated-item-2": "Priority fee: an optional tip to incentivise node operators to include your transaction", - "page-gas-how-is-gas-calculated-item-3": "Units of gas used*: remember we said gas represented computation? More complex actions, like interacting with a smart contract, use more gas than simple ones, such as sending a transaction.", - "page-gas-how-is-gas-calculated-list-item-1": "* See Figure 1 to see how much gas different types of transactions use", - "page-gas-how-is-gas-calculated-text-2": "The formula for calculating a gas fee is units of gas used * (base fee + priority fee). Most wallets will calculate gas usage and display it in a more straight-forward way.", - "page-gas-table-figure": "Figure 1: Gas used by transaction type", - "page-gas-table-header-1": "Transaction type", - "page-gas-table-header-2": "Units of gas used", - "page-gas-table-item-1-transaction-type": "Sending ETH", - "page-gas-table-item-2-transaction-type": "Sending ERC-20 tokens", - "page-gas-table-item-3-transaction-type": "Transferring and NFT", - "page-gas-table-item-4-transaction-type": "Swapping on Uniswap", - "page-gas-faq-header": "Frequency asked questions", - "page-gas-faq-question-1-q": "Who gets paid the gas fee in my transaction?", - "page-gas-faq-question-1-a-1": "The majority is gas fee—the base fee— is destroyed by the protocol (burned). The priority fee, if included in your transaction, will be given to the validator who proposed your transaction.", - "page-gas-faq-question-1-a-2": "You can read a detailed description of the process in the gas developer docs.", - "page-gas-faq-question-2-q": "Do I need to pay gas in ETH?", - "page-gas-faq-question-2-a-1": "Yes. All gas fees on Ethereum must be paid in the native ETH currency.", "page-gas-faq-question-2-a-2": "ETH에 대해 자세히 알아보기", - "page-gas-faq-question-3-q": "What is gwei?", - "page-gas-faq-question-3-a-1": "In most wallets or gas trackers, you will see gas prices denominated as ‘gwei’.", - "page-gas-faq-question-3-a-2": "Gwei is just a smaller unit of ETH, just as pennies are to dollars, with the difference being that 1 ETH equals 1 billion gwei. Gwei is useful when talking about very small amounts of ETH.", "page-gas-use-layer-2": "레이어 2 사용" } From a0dd13be6c009a2cf6ea1fbb07b81191fd9694c3 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:38:13 -0800 Subject: [PATCH 379/478] fix: whitespace/markdown syntax fr import --- .../fr/community/get-involved/index.md | 22 +++++++++---------- .../content/translations/fr/history/index.md | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/public/content/translations/fr/community/get-involved/index.md b/public/content/translations/fr/community/get-involved/index.md index 67a03729d0c..66dd715d425 100644 --- a/public/content/translations/fr/community/get-involved/index.md +++ b/public/content/translations/fr/community/get-involved/index.md @@ -121,18 +121,18 @@ Les « DAO » sont des organisations autonomes décentralisées. Ces groupes t - [DAOSquare](https://www.daosquare.io) [@DAOSquare](https://twitter.com/DAOSquare) - _Promouvoir le concept de DAO dans le domaine non technologique et aider les personnes à créer de la valeur grâce au DAO_ - [Développeur DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _Communauté de constructeurs qui croient en la propriété collective d'Internet_ -- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - *Collectif de développement Web3 indépendant travaillant en tant que DAO* +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - _Collectif de développement Web3 indépendant travaillant en tant que DAO_ - [DXdao](https://DXdao.eth.link/) [@DXdao](https://twitter.com/DXdao_) - _ Développement décentralisé & gouvernance des applications décentralisées (dApps) & protocoles_ -- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - *Gouvernance communautaire de DAOhaus* +- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _Gouvernance communautaire de DAOhaus_ - [Hero DAO](https://herodao.org/) [@hero_dao](https://twitter.com/hero_dao) - _Franchise de super-héros appartenant à la Communauté_ -- [LexDAO](https://lexdao.coop) [@lex_DAO](https://twitter.com/lex_DAO) - *Ingénierie juridique* -- [Machi X](https://machix.com) [@MachiXOfficial](https://twitter.com/MachiXOfficial) - *Communauté artistique* -- [MetaCartel](https://metacartel.org) [@Meta_Cartel](https://twitter.com/Meta_Cartel) - *Incubateur DAO* -- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) - *Venture pour des projets de crypto pré-amorçage* -- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) - *Mécaniques de jeu MMORPG pour la vraie vie* -- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) - *Marques de vêtements digiphysiques* +- [LexDAO](https://lexdao.coop) [@lex_DAO](https://twitter.com/lex_DAO) - _Ingénierie juridique_ +- [Machi X](https://machix.com) [@MachiXOfficial](https://twitter.com/MachiXOfficial) - _Communauté artistique_ +- [MetaCartel](https://metacartel.org) [@Meta_Cartel](https://twitter.com/Meta_Cartel) - _Incubateur DAO_ +- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) - _Venture pour des projets de crypto pré-amorçage_ +- [MetaGame](https://metagame.wtf) [@MetaFam](https://twitter.com/MetaFam) - _Mécaniques de jeu MMORPG pour la vraie vie_ +- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) - _Marques de vêtements digiphysiques_ - [ΜΓΔ](https://metagammadelta.com/) (Meta Gamma Delta) [@metagammadelta](https://twitter.com/metagammadelta) - _Projets dirigés par des femmes_ -- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - *Communauté axée sur le financement du développement d'Ethereum* -- [Guilde Raid](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - *Collectif de constructeurs Web3* +- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - _Communauté axée sur le financement du développement d'Ethereum_ +- [Guilde Raid](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - _Collectif de constructeurs Web3_ -À chaque fois et quelle que soit la façon dont vous contribuez à ethereum.org, pensez à respecter le [code de conduite](/community/code-of-conduct) ! +À chaque fois et quelle que soit la façon dont vous contribuez à ethereum.org, pensez à respecter le [code de conduite](/community/code-of-conduct)! diff --git a/public/content/translations/fr/history/index.md b/public/content/translations/fr/history/index.md index b89288f1db1..599357519ef 100644 --- a/public/content/translations/fr/history/index.md +++ b/public/content/translations/fr/history/index.md @@ -340,7 +340,7 @@ La fourche Constantinople a : La fourche Byzantium a : -- réduit les récompenses pour le [minage ](/developers/docs/consensus-mechanisms/pow/mining/)des blocs de 5 à 3 ETH ; +- réduit les récompenses pour le [minage](/developers/docs/consensus-mechanisms/pow/mining/)des blocs de 5 à 3 ETH ; - retardé la [bombe de difficulté](/glossary/#difficulty-bomb) d'un an ; - ajouté la possibilité d'effectuer des appels sans changement d'état vers d'autres contrats ; - ajouté certaines méthodes de cryptographie pour permettre la [mise à l'échelle de la couche 2](/developers/docs/scaling/#layer-2-scaling). From 90e26e6c00ea19a3ead20468281f735cc6b5b243 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:41:51 -0800 Subject: [PATCH 380/478] fix: spelling and whitespace bugs --- public/content/developers/docs/development-networks/index.md | 2 +- .../developers/docs/consensus-mechanisms/pow/mining/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/development-networks/index.md b/public/content/developers/docs/development-networks/index.md index 206a1b4f29b..9e7c76efc66 100644 --- a/public/content/developers/docs/development-networks/index.md +++ b/public/content/developers/docs/development-networks/index.md @@ -66,7 +66,7 @@ There are also two maintained public test implementations of Ethereum: Goerli an Kurtosis is a build system for multi-container test environments which enables developers to locally spin up reproducible instances of blockchain networks. -The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scaleable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Etheruem core infrastructure. +The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scalable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Ethereum core infrastructure. - [Ethereum network package](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md index 5eb4f08e938..5d32213258b 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -43,7 +43,7 @@ Para conhecer ainda mais a rentabilidade da mineração, use uma calculadora de O seguinte fornece uma visão geral de como as transações foram mineradas na prova de trabalho Ethereum. Uma descrição análoga deste processo para a prova de participação Ethereum pode ser encontrada [aqui](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [ conta ](/developers/docs/accounts/). +1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [conta](/developers/docs/accounts/). 2. O usuário transmite a solicitação de transação para toda a rede Ethereum de algum [nó](/developers/docs/nodes-and-clients/). 3. Ao ouvir tomar conhecimento da nova solicitação de transação, cada nó na rede Ethereum adiciona a solicitação ao seu mempool local, uma lista de todas as solicitações de transação sobre as quais eles têm conhecimento que ainda não foram confirmadas na blockchain em um bloco. 4. Em algum ponto, um nó de mineração agrega várias dezenas ou centenas de solicitações de transação a um [bloco](/developers/docs/blocks/) potencial, de uma forma que maximiza as [taxas de transação](/developers/docs/gas/) que eles ganham enquanto ainda estão abaixo do limite de gás de bloco. Então, o nó de mineração: From 56750e0f281ae8939eeafb90ec478ada497435cf Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:48:29 -0800 Subject: [PATCH 381/478] fix: header level nesting, add custom header id cannot nest h5 in h2 --- .../translations/hu/developers/docs/networking-layer/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/hu/developers/docs/networking-layer/index.md b/public/content/translations/hu/developers/docs/networking-layer/index.md index 6d2516a9b41..8573bc7ccee 100644 --- a/public/content/translations/hu/developers/docs/networking-layer/index.md +++ b/public/content/translations/hu/developers/docs/networking-layer/index.md @@ -125,7 +125,7 @@ A konszenzus- és végrehajtási kliensek párhuzamosan futnak. Össze kell kapc A kontrollfolyamat összefoglalása az alábbiakban látható, zárójelben a vonatkozó hálózati stackkel. -##### Amikor a konszenzuskliens nem terjeszt elő blokkot: +### Amikor a konszenzuskliens nem terjeszt elő blokkot: - A konszenzuskliens blokkot kap a blokkpletyka-protokollon keresztül (konszenzus p2p) - A konszenzuskliens előzetesen validálja a blokkot, azaz biztosítja, hogy az érvényes feladótól érkezett, helyes metaadatokkal @@ -134,7 +134,7 @@ A kontrollfolyamat összefoglalása az alábbiakban látható, zárójelben a vo - A végrehajtási réteg visszaadja a validációs adatokat a konszenzus rétegnek, a blokk validáltnak tekinthető (helyi RPC kapcsolat) - A konszenzus réteg hozzáadja a blokkot a saját blokkláncának fejéhez és tanúsítja azt, a tanúsítást a hálózaton keresztül küldi szét (konszenzus p2p) -##### Amikor a konszenzuskliens blokkot terjeszt elő: +### Amikor a konszenzuskliens blokkot terjeszt elő: - A konszenzuskliens értesítést kap arról, hogy ő a következő blokkelőterjesztő (konszenzus p2p) - A konszenzusréteg meghívja a `blokk létrehozása` metódust a végrehajtási kliensben (helyi RPC) From ca332bc1373feb78a6c844c0163de8a00e99aea3 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 20 Feb 2024 17:49:28 -0700 Subject: [PATCH 382/478] Spanish import Feb 20 (Tutorials II, Tutorials III, Tutorials IV) --- .../docs/development-networks/index.md | 2 +- .../index.md | 92 +- .../tutorials/all-you-can-cache/index.md | 867 +++++++++ .../create-and-deploy-a-defi-app/index.md | 481 +++++ .../index.md | 99 + .../index.md | 163 ++ .../index.md | 127 ++ .../erc-721-vyper-annotated-code/index.md | 632 +++++++ .../tutorials/erc20-annotated-code/index.md | 796 +++++++++ .../erc20-with-safety-rails/index.md | 213 +++ .../index.md | 154 ++ .../index.md | 105 ++ .../index.md | 1585 +++++++++++++++++ .../hello-world-smart-contract/index.md | 103 +- .../index.md | 149 ++ .../index.md | 106 ++ .../index.md | 693 +++++++ .../index.md | 515 ++++++ .../index.md | 238 +++ .../how-to-use-tellor-as-your-oracle/index.md | 84 + .../index.md | 177 ++ .../index.md | 110 ++ .../index.md | 272 +++ .../logging-events-smart-contracts/index.md | 66 + .../index.md | 241 +++ .../index.md | 147 ++ .../developers/tutorials/nft-minter/index.md | 874 +++++++++ .../index.md | 1277 +++++++++++++ .../reverse-engineering-a-contract/index.md | 744 ++++++++ .../tutorials/run-node-raspberry-pi/index.md | 296 ++- .../secure-development-workflow/index.md | 56 + .../tutorials/send-token-etherjs/index.md | 212 +++ .../index.md | 206 +++ .../index.md | 94 + .../developers/tutorials/short-abi/index.md | 656 +++++++ .../index.md | 94 + .../index.md | 194 ++ .../index.md | 1138 ++++++++++++ .../index.md | 313 ++++ .../token-integration-checklist/index.md | 84 + .../index.md | 15 +- .../tutorials/using-websockets/index.md | 249 +++ .../index.md | 298 ++++ .../index.md | 202 +++ .../index.md | 203 +++ .../tutorials/yellow-paper-evm/index.md | 264 +++ .../consensus-mechanisms/pow/mining/index.md | 2 +- 47 files changed, 15396 insertions(+), 292 deletions(-) create mode 100644 public/content/translations/es/developers/tutorials/all-you-can-cache/index.md create mode 100644 public/content/translations/es/developers/tutorials/create-and-deploy-a-defi-app/index.md create mode 100644 public/content/translations/es/developers/tutorials/deploying-your-first-smart-contract/index.md create mode 100644 public/content/translations/es/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md create mode 100644 public/content/translations/es/developers/tutorials/eip-1271-smart-contract-signatures/index.md create mode 100644 public/content/translations/es/developers/tutorials/erc-721-vyper-annotated-code/index.md create mode 100644 public/content/translations/es/developers/tutorials/erc20-annotated-code/index.md create mode 100644 public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md create mode 100644 public/content/translations/es/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md create mode 100644 public/content/translations/es/developers/tutorials/guide-to-smart-contract-security-tools/index.md create mode 100644 public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md create mode 100644 public/content/translations/es/developers/tutorials/how-to-implement-an-erc721-market/index.md create mode 100644 public/content/translations/es/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md create mode 100644 public/content/translations/es/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md create mode 100644 public/content/translations/es/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md create mode 100644 public/content/translations/es/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md create mode 100644 public/content/translations/es/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md create mode 100644 public/content/translations/es/developers/tutorials/interact-with-other-contracts-from-solidity/index.md create mode 100644 public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md create mode 100644 public/content/translations/es/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md create mode 100644 public/content/translations/es/developers/tutorials/logging-events-smart-contracts/index.md create mode 100644 public/content/translations/es/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md create mode 100644 public/content/translations/es/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md create mode 100644 public/content/translations/es/developers/tutorials/nft-minter/index.md create mode 100644 public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md create mode 100644 public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md create mode 100644 public/content/translations/es/developers/tutorials/secure-development-workflow/index.md create mode 100644 public/content/translations/es/developers/tutorials/send-token-etherjs/index.md create mode 100644 public/content/translations/es/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md create mode 100644 public/content/translations/es/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md create mode 100644 public/content/translations/es/developers/tutorials/short-abi/index.md create mode 100644 public/content/translations/es/developers/tutorials/smart-contract-security-guidelines/index.md create mode 100644 public/content/translations/es/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md create mode 100644 public/content/translations/es/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md create mode 100644 public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md create mode 100644 public/content/translations/es/developers/tutorials/token-integration-checklist/index.md create mode 100644 public/content/translations/es/developers/tutorials/using-websockets/index.md create mode 100644 public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md create mode 100644 public/content/translations/es/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md create mode 100644 public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md create mode 100644 public/content/translations/es/developers/tutorials/yellow-paper-evm/index.md diff --git a/public/content/developers/docs/development-networks/index.md b/public/content/developers/docs/development-networks/index.md index 206a1b4f29b..889adae797f 100644 --- a/public/content/developers/docs/development-networks/index.md +++ b/public/content/developers/docs/development-networks/index.md @@ -66,7 +66,7 @@ There are also two maintained public test implementations of Ethereum: Goerli an Kurtosis is a build system for multi-container test environments which enables developers to locally spin up reproducible instances of blockchain networks. -The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scaleable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Etheruem core infrastructure. +The Ethereum Kurtosis package can be used to quickly instantiate a parameterizable, highly scaleable, and private Ethereum testnet over Docker or Kubernetes. The package supports all major Execution Layer (EL) and Consensus Layer (CL) clients. Kurtosis gracefully handles all local port mappings and service connections for a representative network to be used in validation and testing workflows relating to Ethereum core infrastructure. - [Ethereum network package](https://github.com/kurtosis-tech/ethereum-package) - [Website](https://www.kurtosis.com/) diff --git a/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index ab6137a1a99..d3fa3e1521b 100644 --- a/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -4,9 +4,7 @@ description: Una introducción al desarrollo de Ethereum, especialmente útil pa author: Marc Garreau lang: es tags: - - "Empezar" - "python" - - "cadena de bloques" - "web3.py" skill: beginner published: 2020-09-08 @@ -22,10 +20,10 @@ Esta entrada pretende ser accesible a un amplio abanico de desarrolladores. [Se Supuestos: -- sabe cómo usar una terminal, -- ha escrito unas cuantas líneas de código en Python, +- Sabe cómo moverse en un terminal, +- Ha escrito unas cuantas líneas de código en Python, - Tiene la versión 3.6 o superior de Python instalada en su computadora (se recomienda el uso de un [entorno virtual](https://realpython.com/effective-python-environment/#virtual-environments)), y -- ha utilizado `pip`, el instalador de paquetes de Python. Si una de las suposiciones previas no encajan, o no planeas reproducir el código en este artículo, puede ser que no tengas ningún inconveniente leyendo este articulo. +- ha utilizado `pip`, el instalador de paquetes de Python. De nuevo, aunque no reúna todos estos requisitos, o no tenga pensado reproducir el código de este artículo, es probable que pueda seguirlo sin problemas. ## Expliquemos brevemente en qué consisten las cadenas de bloques {#blockchains-briefly} @@ -36,7 +34,6 @@ Hay muchas maneras de describir Ethereum, pero en su esencia es una cadena de bl "number": 1234567, "hash": "0xabc123...", "parentHash": "0xdef456...", - "miner": "0xa1b2c3...", ..., "transactions": [...] } @@ -44,7 +41,7 @@ Hay muchas maneras de describir Ethereum, pero en su esencia es una cadena de bl Cada [bloque](/developers/docs/blocks/) tiene una referencia al bloque anterior; el `parentHash` es el hash a ese bloque previo. -Nota: Ethereum hace un uso regular de las funciones hash para producir valores de tamaño fijo («hashes»). Los hashes desempeñan un importante papel en Ethereum; por ahora, puede considerarlos como identificadores únicos. + ![Un diagrama que representa a la cadena de bloques incluyendo datos dentro de cada bloque](./blockchain-diagram.png) @@ -60,11 +57,11 @@ Este nuevo conjunto de tecnologías descentralizadas ha generado nuevas herramie Los desarrolladores de Python que quieran interactuar con Ethereum seguramente quieran usar [Web3.py](https://web3py.readthedocs.io/). Web3.py es una biblioteca que simplifica la forma en la que puede conectarse a un nodo de Ethereum para luego enviar y recibir datos de él. -Nota: «nodo de Ethereum» y «cliente de Ethereum» se usan de forma indistinta. En cualquier caso, se refiere al software que ejecuta un participante de la red Ethereum. Este software puede leer los datos de un bloque, recibir actualizaciones cuando se añaden nuevos bloques («minería») y emitir nuevas transacciones, entre otras opciones. + Los [clientes de Ethereum](/developers/docs/nodes-and-clients/) pueden configurarse para que sean accesibles por [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP o Websockets, por lo que Web3.py necesitará reflejar esta configuración. Web3.py se refiere a estas opciones de conexión como **proveedores**. Tendrá que elegir uno de los tres proveedores para vincular la instancia de Web3.py a su nodo. -![Un diagrama que muestra cómo web3.py usa IPC para conectar su aplicación a un nodo de Ethereum](./web3py-and-nodes.png) +![Diagrama que muestra cómo web3.py usa IPC para conectar su aplicación a un nodo de Ethereum](./web3py-and-nodes.png) _Configure el nodo de Ethereum y Web3.py para que se comuniquen por el mismo protocolo (IPC en este diagrama)._ @@ -104,21 +101,23 @@ pip install 'web3[tester]' ¡Ya está listo para comenzar! +Nota: El paquete `web3[tester]` funciona hasta la versión de Python 3.10.xx + ## Crear un proceso aislado {#spin-up-a-sandbox} -Abra un nuevo entorno de Python escribiendo `ipython` en su terminal. Esto es comparable a escribir `python`, pero tiene más funciones. +Abra un nuevo entorno de Python ejecutando `ipython` en su terminal. Esto es comparable a ejecutar `python`, pero tiene más funciones. ```bash ipython ``` -Esto imprimirá información sobre las versiones de Python e IPython que están instaladas. Después, verá que la terminal está esperando que escriba algo: +Esto imprimirá información sobre las versiones de Python e IPython que ejecute. Después, verá un mensaje esperando que escriba algo: ```python In [1]: ``` -Ahora mismo está viendo una consola interactiva de Python. Es, esencialmente, un proceso aislado que puede usar para jugar. Si ha llegado hasta aquí, es hora de importar Web3.py: +Ahora está viendo una consola interactiva de Python. Básicamente es un sandbox, o entorno de pruebas, para experimentar. Si ha llegado hasta aquí, es hora de importar Web3.py: ```python In [1]: from web3 import Web3 @@ -126,9 +125,9 @@ In [1]: from web3 import Web3 ## Presentamos el módulo Web3 {#introducing-the-web3-module} -Además de ser una entrada a Ethereum, el módulo [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) ofrece algunas prácticas funciones. Vamos a explorar un par de ellas. +Además de ser una puerta de enlace a Ethereum, el módulo [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) ofrece algunas prácticas funciones. Exploremos algunas. -En una aplicación que interactúe con Ethereum, normalmente necesitará convertir las denominaciones de las monedas. El módulo Web3 proporciona un par de métodos de ayuda para este proceso: [fromWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.fromWei) y [toWei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toWei). +En una aplicación que interactúe con Ethereum, normalmente necesitará convertir las denominaciones de las monedas. El modulo Web3 proporciona un par de métodos de ayuda solo para esto [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) y [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei). Nota: los ordenadores son especialmente poco precisos en el cálculo de decimales. Para solucionarlo, los desarrolladores suelen almacenar cantidades de dólares en centavos. Por ejemplo, un artículo con un precio de 5,99 $ puede almacenarse en la base de datos como 599. @@ -141,21 +140,21 @@ Se usa un patrón similar cuando se manejan transacciones en ether. No ob -Pruebe convirtiendo algunos valores a y desde wei. Tenga en cuenta que [hay nombres para muchas de las denominaciones](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) entre ether y wei. Una de las más conocidas es **gwei**, ya que es como suelen representarse las comisiones de las transacciones. +Pruebe convertir algunos valores a y desde wei. Tenga en cuenta que [hay nombres para muchas de las denominaciones](https://web3py.readthedocs.io/en/stable/examples.html#converting-currency-denominations) entre ether y wei. Una de las más conocidas es **gwei**, ya que es como suelen representarse las comisiones de las transacciones. ```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') ``` -Otros métodos de utilidad en el módulo Web3 incluyen conversores de formato de datos (p. ej., [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), ayudantes de dirección (p. ej., [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) y funciones hash (p. ej., [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Explicaremos muchos de estos en próximos tutoriales. Para ver todos los métodos y funciones disponibles, utilice el autocompletador de IPython escribiendo `Web3`. y presionando la tecla de tabulación dos veces después del período. +Otros métodos de utilidad en el módulo Web3 incluyen conversores de formato de datos (p. ej., [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), ayudantes de dirección (p. ej., [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)) y funciones hash (p. ej., [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak)). Explicaremos muchos de estos más adelante en la serie. Para ver todos los métodos y funciones disponibles, utilice el autocompletador de IPython escribiendo `Web3` y presionando la tecla Tab dos veces después del punto. ## Hable con la cadena {#talk-to-the-chain} -Los métodos de conveniencia son encantadores, pero pasemos a la cadena de bloques. El siguiente paso es configurar Web3.py para comunicarse con un nodo Ethereum. Aquí tenemos la opción de utilizar los proveedores IPC, HTTP o Websocket. +Los métodos de conveniencia son encantadores, pero pasemos a la cadena de bloques. El siguiente paso es configurar Web3.py para establecer comunicación con un nodo Ethereum. Aquí tenemos la opción de utilizar los proveedores IPC, HTTP o Websocket. No seguiremos este camino, pero un ejemplo de flujo de trabajo completo utilizando el proveedor HTTP podría ser este: @@ -164,34 +163,34 @@ No seguiremos este camino, pero un ejemplo de flujo de trabajo completo utilizan - Haga que Web3 se conecte al nodo a través de HTTP, en `localhost:8545`. `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` - Use la instancia `w3` para interactuar con el nodo. -Si bien es una forma «real» de hacerlo, el proceso de sincronización lleva horas y es innecesario si solo quiere un entorno de desarrollo. Web3.py expone un cuarto proveedor para este propósito, el **EthereumTesterProvider**. Este proveedor de pruebas se vincula a un nodo de Ethereum simulado con permisos relajados y dinero falso para jugar. +Si bien es una forma "real" de hacerlo, el proceso de sincronización lleva horas y es innecesario si solo quiere un entorno de desarrollo. Web3.py expone un cuarto proveedor para este propósito, el **EthereumTesterProvider**. Este proveedor de pruebas se vincula a un nodo de Ethereum simulado con permisos relajados y dinero falso para experimentar. ![Un diagrama que muestra el EthereumTesterProvider vinculando su aplicación web3.py a un nodo simulado de Ethereum](./ethereumtesterprovider.png) _El EthereumTesterProvider se conecta a un nodo simulado y es práctico para entornos de desarrollo rápidos._ -Ese nodo simulado se llama [eth-tester](https://github.com/ethereum/eth-tester) y lo instalamos como parte del comando `pip install web3[tester]`. Configurar Web3.py para utilizar este proveedor de pruebas es tan simple como: +Ese nodo simulado se llama [eth-tester](https://github.com/ethereum/eth-tester) y lo instalamos como parte del comando `pip install web3[tester]`. Configurar Web3.py para utilizar este proveedor de pruebas es así de sencillo: ```python In [4]: w3 = Web3(Web3.EthereumTesterProvider()) ``` -¡Ya está listo para navegar por la cadena! Eso no es algo que la gente suela decir. Me lo acabo de inventar. Veamos rápidamente en qué consiste. +¡Ya está listo para navegar por la cadena! Eso no es algo que la gente suela decir. Me lo acabo de inventar. Veamos rápidamente de qué se trata. ## Explicación rápida {#the-quick-tour} -Lo primero de todo es comprobar que funciona: +Lo primero de todo es hacer una verificación: ```python -In [5]: w3.isConnected() +In [5]: w3.is_connected() Out[5]: True ``` -A decir verdad, desde que usamos el proveedor de pruebas, esta no es una prueba muy valiosa, pero si falla, existe la posibilidad de que escriba algo incorrecto cuando instancie la variable `w3`. Compruebe dos veces que haya incluído los paréntesis internos, es decir:`Web3.EthereumTesterProvider()`. +A decir verdad, como usamos el proveedor de pruebas, esta no es una prueba muy valiosa, pero si falla, es muy posible que haya escrito algo incorrecto al instanciar la variable `w3`. Compruebe bien que haya incluido los paréntesis internos, es decir: `Web3.EthereumTesterProvider()`. ## Punto n.º1 de la explicación: [cuentas](/developers/docs/accounts/) {#tour-stop-1-accounts} -Por conveniencia, el proveedor ha creado algunas cuentas y las ha cargado previamente con ether de prueba. +Por conveniencia, el proveedor de prubas creó algunas cuentas y las cargó previamente con ether de prueba. Primero, veamos una lista de las cuentas: @@ -202,19 +201,19 @@ Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] ``` -Si ejecuta este comando, debería ver una lista de diez cadenas que comienzan con `0x`. Cada uno es una **dirección pública** y es, más o menos, análoga al número de cuenta de una cuenta corriente. Esa es la dirección que le daría a alguien que quisiera enviarle ether. +Si ejecuta este comando, debería ver una lista de diez cadenas que comienzan con `0x`. Cada una es una **dirección pública** y es, de alguna manera, análoga al número de cuenta de una cuenta corriente. Esa es la dirección que le daría a alguien que quisiera enviarle ether. -Como se ha mencionado, el proveedor ha cargado previamente cada una de estas cuentas con ether de prueba. Veamos cuánto hay en la primera cuenta: +Como se ha mencionado, el proveedor de pruebas ha cargado previamente cada una de estas cuentas con ether de prueba. Veamos cuánto hay en la primera cuenta: ```python In [7]: w3.eth.get_balance(w3.eth.accounts[0]) Out[7]: 1000000000000000000000000 ``` -¡Un montón de ceros! Antes de que vaya corriendo a un banco falso, recuerde la lección sobre las denominaciones de monedas que le enseñamos antes. Los valores de ether se representan en la menor denominación: wei. Convierte eso a ether: +¡Un montón de ceros! Antes de que vaya corriendo a un banco falso, recuerde la lección sobre las denominaciones de monedas que vimos antes. Los valores de ether se representan en la menor denominación: wei. Convierta eso a ether: ```python -In [8]: w3.fromWei(1000000000000000000000000, 'ether') +In [8]: w3.from_wei(1000000000000000000000000, 'ether') Out[8]: Decimal('1000000') ``` @@ -222,7 +221,7 @@ Un millón de ether de prueba; nada mal. ## Parada n.º2 de la explicación: datos de bloque {#tour-stop-2-block-data} -Echemos un vistazo al estado de esta cadena de bloques de prueba: +Echemos un vistazo al estado de esta cadena de bloques simulada: ```python In [9]: w3.eth.get_block('latest') @@ -237,27 +236,27 @@ Out[9]: AttributeDict({ Veremos que aparece mucha información sobre un bloque, pero lo más importante es: -- El número del bloque es cero, al margen de cuando se haya configurado el proveedor de pruebas. A diferencia de la red Ethereum, que mina un nuevo bloque cada 15 segundos —aproximadamente—, esta simulación le esperará hasta que le pida que haga algo. +- El número del bloque es cero, al margen de cuando se haya configurado el proveedor de pruebas. A diferencia de la red real de Ethereum, que añade un nuevo bloque cada 12 segundos, esta simulación esperará hasta que usted le dé algo de trabajo que hacer. - `transactions` es una lista vacía debido a lo que decimos arriba: aún no hemos hecho nada. Este primer bloque es un **bloque vacío**, usado solo para iniciar la cadena. - Observe que `parentHash` es simplemente un montón de bytes vacíos. Esto significa que es el primer bloque en la cadena, también conocido como un **bloque génesis**. ## Parada n.º3 de la explicación: [transacciones](/developers/docs/transactions/) {#tour-stop-3-transactions} -Estamos estancados en el bloque cero hasta que haya una transacción por minar, así que vamos a proporcionarle una. Envíe unos cuantos ether de prueba desde una cuenta a otra: +Estamos estancados en el bloque cero hasta que haya una transacción pendiente, así que démosle una. Envíe algo de ether de prueba desde una cuenta a otra: ```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 }) ``` -Este suele ser el momento en el que espera varios segundos para que su transacción sea minada en un nuevo bloque. El proceso completo suele ser de esta manera: +Este es típicamente el punto donde esperaría varios segundos para que su transacción se incluya en un nuevo bloque. El proceso completo suele ser algo así: -1. Envíe una transacción y mantenga el hash de la transacción. Hasta que se mine, la transacción aparecerá como «pendiente». `tx_hash = w3.eth.send_transaction({ … })` -2. Espere a que la transacción sea minada: `w3.eth.wait_for_transaction_receipt(tx_hash)` +1. Envíe una transacción y mantenga el hash de la transacción. Hasta que el bloque que contiene la transacción sea creado y emitido, la transacción estará “pendiente”. `tx_hash = w3.eth.send_transaction({ … })` +2. Esperar a que la transacción se incluya en un bloque: `w3.eth.wait_for_transaction_receipt(tx_hash)` 3. Continúe con la lógica de la aplicación. Para ver la transacción satisfactoria: `w3.eth.get_transaction(tx_hash)` Nuestro entorno simulado añadirá la transacción en un nuevo bloque de manera instantánea, por lo que podremos ver inmediatamente la transacción: @@ -275,22 +274,25 @@ Out[11]: AttributeDict({ }) ``` -Aquí encontrará algunos detalles que le resultarán familiares: las casillas `from`, `to` y `value` deben coincidir con el contenido de nuestra consulta `send_transaction`. El otro aspecto tranquilizador es que esta transacción se ha incluido como la primera transacción (`'transactionIndex': 0`) dentro del bloque número 1. +Aquí encontrará algunos detalles que le resultarán familiares: los campos `from`, `to` y `value` deben coincidir con el contenido de nuestra consulta `send_transaction`. El otro aspecto tranquilizador es que esta transacción se incluyó como la primera transacción (`'transactionIndex': 0`) dentro del bloque número 1. -También podemos verificar fácilmente el éxito de esta transacción al revisar los balances de las dos cuentas implicadas. Deben haber pasado tres ether de una cuenta a otra. +También podemos verificar fácilmente el éxito de esta transacción revisando los saldos o balances de las dos cuentas implicadas. Deben haber pasado tres ether de una cuenta a otra. ```python -In [12]: w3.eth.get_balance(w3.eth.accounts[0]) -Out[12]: 999996999999999999969000 +Entrada[12]: w3.eth.get_balance(w3.eth.accounts[0]) +Salida[12]: 999996999979000000000000 -In [13]: w3.eth.get_balance(w3.eth.accounts[1]) -Out[13]: 1000003000000000000000000 +Entrada[13]: w3.eth.get_balance(w3.eth.accounts[1]) +Salida[13]: 10000030000000000000000 ``` -¡El último parece ser correcto! El balance ha pasado de 1.000.000 a 1.000.003 ether. Pero ¿qué pasó con la primera cuenta? Parece que perdió algo más de tres ether. Desafortunadamente, nada en esta vida es gratis; hacer uso de la red pública de Ethereum requiere compensar a las personas que cumplen con su tarea. Se ha tomado de la cuenta una pequeña comisión por la transacción, dejando la cantidad de la transacción al orden dd 31000 wei. +¡El último parece ser correcto! El saldo ha pasado de 1.000.000 a 1.000.003 ether. Pero, ¿qué pasó con la primera cuenta? Parece que perdió algo más de tres ether. Desafortunadamente, nada en esta vida es gratis; hacer uso de la red pública de Ethereum requiere compensar a las personas que cumplen con su rol de apoyo. Se dedujo una pequeña comisión de transacción de la cuenta que envió la transacción: esta comisión es la cantidad de gas quemado (21.000 unidades de gas para una transferencia de ETH) multiplicada por una tarifa base que varía según la actividad de la red más una propina que va al validador que incluye la transacción en un bloque. + +Más información sobre el [gas](/developers/docs/gas/#post-london) Nota: en la red pública, el precio de las comisiones por transacción se basa en la demanda de la red y en la rapidez con la que se desee procesar una transacción. Si quiere saber cómo se calculan las comisiones, lea mi artículo anterior, en donde describo cómo se incluyen las transacciones en un bloque. + ## Tómese un respiro {#and-breathe} -Después de todo lo que hemos aprendido hasta ahora, es un buen momento para hacer una pausa. Todavía hay mucho por indagar, por lo que continuaremos explorando en la parte dos de esta serie. Algunos conceptos que trataremos posteriormente: conectarse a un nodo real, contratos inteligentes y tókenes. ¿Tiene alguna pregunta? Si la tiene, adelante, ¡pregúntemela! Sus comentarios ayudarán a definir el camino a seguir. Puede hacer comentarios a través de [Twitter](https://twitter.com/wolovim). +Después de todo lo que hemos aprendido hasta ahora, es un buen momento para hacer una pausa. Todavía hay mucho por indagar, por lo que continuaremos explorando en la parte 2 de esta serie. Algunos conceptos que trataremos posteriormente: conectarse a un nodo real, contratos inteligentes y tokens. ¿Tiene alguna pregunta? Si la tiene, adelante, ¡pregúntemela! Sus comentarios ayudarán a definir el camino a seguir. Puede hacer solicitudes a través de [Twitter](https://twitter.com/wolovim). diff --git a/public/content/translations/es/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/es/developers/tutorials/all-you-can-cache/index.md new file mode 100644 index 00000000000..b99c564cc15 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/all-you-can-cache/index.md @@ -0,0 +1,867 @@ +--- +title: "Todo lo que pueda almacenar en una memoria caché" +description: Aprenda a crear y usar un contrato de almacenamiento en caché para transacciones acumuladas más baratas. +author: Ori Pomerantz +tags: + - "capa 2" + - "guardar en caché" + - "almacenamiento" +skill: intermediate +published: 2022-09-15 +lang: es +--- + +Cuando se utilizan rollups (o acumulaciones), el coste de un byte en la transacción es mucho más caro que el coste de una ranura de almacenamiento. Por lo tanto, tiene sentido almacenar en caché la mayor cantidad de información posible en la cadena. + +En este artículo, aprenderá a crear y usar un contrato de almacenamiento en caché de tal manera que cualquier valor de parámetro que se pueda usar varias veces se almacenará en caché, y estará disponible para su uso (después de la primera vez) con un número mucho menor de bytes, y cómo cancelar el código de cadena que utiliza esa caché. + +Si quiere omitir el artículo y ver el código fuente, [lo encontrará aquí](https://github.com/qbzzt/20220915-all-you-can-cache). La pila de desarrollo es [Foundry](https://book.getfoundry.sh/getting-started/installation). + +## Diseño general {#overall-design} + +En aras de la simplicidad, asumiremos que todos los parámetros de la transacción tienen una longitud de `uint256`, 32 bytes. Cuando recibamos una transacción, analizaremos cada parámetro de la siguiente manera: + +1. Si el primer byte es `0xFF`, tome los siguientes 32 bytes como valor de parámetro y escríbalos en la caché. + +2. Si el primer byte es `0xFE`, tome los siguientes 32 bytes como valor de parámetro, pero _no_ lo escriba en la caché. + +3. Para cualquier otro valor, tome los cuatro bits superiores como el número de bytes adicionales, y los cuatro bits inferiores como los bits más significativos de la clave de caché. He aquí algunos ejemplos: + + | Bytes en calldata | Clave de caché | + |:----------------- | --------------:| + | 0x0F | 0x0F | + | 0x10,0x10 | 0x10 | + | 0x12,0xAC | 0x02AC | + | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | + +## Manipulación de caché {#cache-manipulation} + +La caché se implementa en [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol). Vamos a repasarlo línea por línea. + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + + +contract Cache { + + bytes1 public constant INTO_CACHE = 0xFF; + bytes1 public constant DONT_CACHE = 0xFE; +``` + +Estas constantes se utilizan para interpretar los casos especiales en los que proporcionamos toda la información y queremos que se escriba en la caché o no. Escribir en la caché requiere dos operaciones [`SSTORE`](https://www.evm.codes/#55) en ranuras de almacenamiento no utilizadas hasta el momento a un coste de 22.100 de gas cada una, por lo que lo hacemos opcional. + +```solidity + + mapping(uint => uint) public val2key; +``` + +Un [mapeo](https://www.geeksforgeeks.org/solidity-mappings/) entre los valores y sus claves. Esta información es necesaria para codificar los valores antes de enviar la transacción. + +```solidity + // Location n has the value for key n+1, because we need to preserve + // zero as "not in the cache". + uint[] public key2val; +``` + +Podemos usar una matriz para el mapeo de claves a valores porque asignamos las claves, y por simplicidad, lo hacemos secuencialmente. + +```solidity + function cacheRead(uint _key) public view returns (uint) { + require(_key <= key2val.length, "Reading uninitialize cache entry"); + return key2val[_key-1]; + } // cacheRead +``` + +Leer un valor de la caché. + +```solidity + // Write a value to the cache if it's not there already + // Only public to enable the test to work + function cacheWrite(uint _value) public returns (uint) { + // If the value is already in the cache, return the current key + if (val2key[_value] != 0) { + return val2key[_value]; + } +``` + +No tiene sentido poner el mismo valor en la caché más de una vez. Si el valor ya está ahí, simplemente devuelva la clave existente. + +```solidity + // Since 0xFE is a special case, the largest key the cache can + // hold is 0x0D followed by 15 0xFF's. If the cache length is already that + // large, fail. + // 1 2 3 4 5 6 7 8 9 A B C D E F + require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + "cache overflow"); +``` + +No creo que alguna vez tengamos una caché tan grande (aproximadamente 1,8\*1037 entradas, lo que requeriría alrededor de 1027 TB para almacenar). Sin embargo, tengo la edad suficiente para recordar que ["640 kB siempre sería suficiente"](https://quoteinvestigator.com/2011/09/08/640k-enough/). Esta prueba es muy barata. + +```solidity + // Write the value using the next key + val2key[_value] = key2val.length+1; +``` + +Añada la búsqueda inversa (del valor a la clave). + +```solidity + key2val.push(_value); +``` + +Añade la búsqueda hacia adelante (desde la clave hasta el valor). Debido a que asignamos valores secuencialmente, podemos añadirlos después del último valor de la matriz. + +```solidity + return key2val.length; + } // cacheWrite +``` + +Devuelve la nueva longitud de `key2val`, que es la celda donde se almacena el nuevo valor. + +```solidity + function _calldataVal(uint startByte, uint length) + private pure returns (uint) +``` + +Esta función lee un valor de Calldata de longitud arbitraria (hasta 32 bytes, el tamaño de la palabra). + +```solidity + { + uint _retVal; + + require(length < 0x21, + "_calldataVal length limit is 32 bytes"); + require(length + startByte <= msg.data.length, + "_calldataVal trying to read beyond calldatasize"); +``` + +Esta función es interna, por lo que si el resto del código está escrito correctamente, estas pruebas no son necesarias. Aunque tampoco es que cuesten tanto, así que podríamos tenerlas. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Este código está en [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html). Lee un valor de 32 bytes de los Calldata. Esto funciona incluso si los Calldata se detienen antes de `startByte+32` porque el espacio no inicializado en EVM se considera cero. + +```solidity + _retVal = _retVal >> (256-length*8); +``` + +No queremos necesariamente un valor de 32 bytes. Esto elimina el exceso de bytes. + +```solidity + return _retVal; + } // _calldataVal + + + // Read a single parameter from the calldata, starting at _fromByte + function _readParam(uint _fromByte) internal + returns (uint _nextByte, uint _parameterValue) + { +``` + +Lea un solo parámetro de los Calldata. Tenga en cuenta que necesitamos devolver no solo el valor que leemos, sino también la ubicación del siguiente byte, porque la longitud de los parámetros puede variar de 1 byte a 33 bytes. + +```solidity + // The first byte tells us how to interpret the rest + uint8 _firstByte; + + _firstByte = uint8(_calldataVal(_fromByte, 1)); +``` + +Solidity intenta reducir el número de errores al prohibir [conversiones de tipo implícito potencialmente peligrosas](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions). Una degradación, por ejemplo, de 256 bits a 8 bits, debe ser explícita. + +```solidity + + // Read the value, but do not write it to the cache + if (_firstByte == uint8(DONT_CACHE)) + return(_fromByte+33, _calldataVal(_fromByte+1, 32)); + + // Read the value, and write it to the cache + if (_firstByte == uint8(INTO_CACHE)) { + uint _param = _calldataVal(_fromByte+1, 32); + cacheWrite(_param); + return(_fromByte+33, _param); + } + + // If we got here it means that we need to read from the cache + + // Number of extra bytes to read + uint8 _extraBytes = _firstByte / 16; +``` + +Toma el [nibble](https://en.wikipedia.org/wiki/Nibble) inferior y combínalo con los otros bytes para leer el valor de la caché. + +```solidity + uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) + + _calldataVal(_fromByte+1, _extraBytes); + + return (_fromByte+_extraBytes+1, cacheRead(_key)); + + } // _readParam + + + // Read n parameters (functions know how many parameters they expect) + function _readParams(uint _paramNum) internal returns (uint[] memory) { +``` + +Podríamos obtener el número de parámetros que tenemos de los propios Calldata, pero las funciones que nos invocan, saben cuántos parámetros esperan. Es más fácil dejar que nos lo digan. + +```solidity + // The parameters we read + uint[] memory params = new uint[](_paramNum); + + // Parameters start at byte 4, before that it's the function signature + uint _atByte = 4; + + for(uint i=0; i<_paramNum; i++) { + (_atByte, params[i]) = _readParam(_atByte); + } +``` + +Lea los parámetros hasta obtener el número que necesite. Si nos pasamos el final de los Calldata, `_readParams` esta revertirá. + +```solidity + + return(params); + } // readParams + + // For testing _readParams, test reading four parameters + function fourParam() public + returns (uint256,uint256,uint256,uint256) + { + uint[] memory params; + params = _readParams(4); + return (params[0], params[1], params[2], params[3]); + } // fourParam +``` + +Una de las principales ventajas de Foundry es que permite escribir las pruebas en Solidity ([ver más adelante Probar la caché](#testing-the-cache)). Esto hace que las pruebas unitarias sean mucho más fáciles. Esta es una función que lee cuatro parámetros y los devuelve, de manera que la prueba puede verificar si son correctos. + +```solidity + // Get a value, return bytes that will encode it (using the cache if possible) + function encodeVal(uint _val) public view returns(bytes memory) { +``` + +`encodeVal` es una función que activa el código fuera de la cadena para ayudar a crear los Calldata que utilizan la caché. Esta recibe un único valor y devuelve los bytes que lo codifican. Esta función es una `view`, por lo que no requiere una transacción y cuando se activa externamente no cuesta gas. + +```solidity + uint _key = val2key[_val]; + + // The value isn't in the cache yet, add it + if (_key == 0) + return bytes.concat(INTO_CACHE, bytes32(_val)); +``` + +En la [EVM](/developers/docs/evm/) se asume que todo el almacenamiento sin inicializar son ceros. Por tanto, si buscamos la clave para un valor que no está ahí, obtenemos un cero. En ese caso, los bytes que lo codifican son `INTO_CACHE` (por lo que estará en la caché la próxima vez), seguido de un valor real. + +```solidity + // If the key is <0x10, return it as a single byte + if (_key < 0x10) + return bytes.concat(bytes1(uint8(_key))); +``` + +Los bytes individuales son los más fáciles. Solo usamos [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat) para convertir un tipo `bytes` en una matriz de bytes que puede tener cualquier longitud. A pesar del nombre, funciona bien cuando se le proporciona un solo argumento. + +```solidity + // Two byte value, encoded as 0x1vvv + if (_key < 0x1000) + return bytes.concat(bytes2(uint16(_key) | 0x1000)); +``` + +Cuando tenemos una clave que es inferior a 163, podemos expresarla en dos bytes. Primero convertimos `_key`, que es un valor de 256 bits, a un valor de 16 bits y usamos la lógica o para añadir el número de bytes adicionales al primer byte. Luego lo convertimos en un valor de `bytes2`, que se puede convertir en `bytes`. + +```solidity + // There is probably a clever way to do the following lines as a loop, + // but it's a view function so I'm optimizing for programmer time and + // simplicity. + + 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))); +``` + +Los otros valores (3 bytes, 4 bytes, etc.) se manejan de la misma manera, solo con diferentes tamaños de campo. + +```solidity + // If we get here, something is wrong. + revert("Error in encodeVal, should not happen"); +``` + +Si hemos llegado aquí, quiere decir que tenemos una llave que no es inferior a 16\*25615. Pero `cacheWrite` limita las claves, por lo que ni siquiera podemos llegar a 14\*25616 (que tendría un primer byte de 0xFE, por lo que se vería como `DONT_CACHE`). Tampoco nos costaría mucho añadir una prueba en caso de que un futuro programador introduzca un error. + +```solidity + } // encodeVal + +} // Cache +``` + +### Probar la caché {#testing-the-cache} + +Una de las ventajas de Foundry es que [te permite escribir pruebas en Solidity](https://book.getfoundry.sh/forge/tests), lo que facilita la escritura de pruebas unitarias. Las pruebas para la clase `Cache` son [aquí](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol). Dado que el código de prueba es repetitivo, como suelen ser las pruebas, este artículo solo explica las partes interesantes. + +```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"; +``` + +Esto es solo la norma que es necesaria para usar el paquete de prueba y `console.log`. + +```solidity +import "src/Cache.sol"; +``` + +Necesitamos saber el contrato que estamos probando. + +```solidity +contract CacheTest is Test { + Cache cache; + + function setUp() public { + cache = new Cache(); + } +``` + +La función `setUp` se activa antes de cada prueba. En este caso, solo creamos una nueva caché, para que nuestras pruebas no se afecten entre sí. + +```solidity + function testCaching() public { +``` + +Las pruebas son funciones cuyos nombres comienzan por `test`. Esta función comprueba la funcionalidad básica de la caché, escribiendo valores y leyéndolos de nuevo. + +```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); +``` + +Así es como se hacen las pruebas reales, utilizando las funciones [`assert...`](https://book.getfoundry.sh/reference/forge-std/std-assertions). En este caso, comprobamos que el valor que escribimos es el mismo que leemos. Podemos descartar el resultado de `cache.cacheWrite` porque sabemos que las claves de caché se asignan de forma lineal. + +```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); + } +``` + +Primero escribimos cada valor dos veces en la caché y nos aseguramos de que las claves sean las mismas (lo que significa que la segunda escritura no ocurrió realmente). + +```solidity + for(uint i=1; i<100; i+=3) { + uint _key = cache.cacheWrite(i); + assertEq(_key, i); + } + } // testRepeatCaching +``` + +En teoría, podría haber un error que no afecte a las escrituras consecutivas en caché. Así que aquí hacemos algunas escrituras que no son consecutivas y vemos que los valores aún no se han reescrito. + +```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) +``` + +Lee una palabra de 256 bits desde un búfer de `bytes de memoria`. Esta función de utilidad nos permite verificar que recibimos los resultados correctos cuando ejecutamos una activación de la función que utiliza la caché. + +```solidity + { + require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + uint256 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } +``` + +Yul no admite estructuras de datos más allá de `uint256`, por lo que cuando usted se refiere a una estructura de datos más sofisticada, como el búfer de memoria `_bytes`, se obtiene la dirección de esa estructura. Solidity almacena valores de `bytes de memoria` como una palabra de 32 bytes que contiene la longitud, seguida de los bytes reales, por lo que para obtener el número de bytes `_start` necesitamos calcular `_bytes+32+_start`. + +```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; +``` + +Algunas de las constantes que necesitamos probar. + +```solidity + function testReadParam() public { +``` + +Llame a `fourParams()`, una función que utiliza `readParams`, para probar que podemos leer los parámetros correctamente. + +```solidity + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; +``` + +No podemos usar el mecanismo ABI normal para llamar a una función usando la caché, por lo que necesitamos usar el mecanismo de bajo nivel [`
    .call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses). Ese mecanismo toma una memoria de `bytes` como entrada, y la devuelve (así como un valor booleano) como salida. + +```solidity + // First call, the cache is empty + _callInput = bytes.concat( + FOUR_PARAMS, +``` + +Es útil que el mismo contrato admita tanto funciones en caché (para activaciones directamente desde transacciones) como funciones no en caché (para activaciones desde otros contratos inteligentes). Para ell, tenemos que seguir confiando en el mecanismo Solidity para activar la función correcta, en lugar de poner todo en [una función `fallback`](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function). Esto hace que la composición sea mucho más fácil. Un solo byte sería suficiente para identificar la función en la mayoría de los casos, por lo que estamos desperdiciando tres bytes (16\*3=48 gas). Sin embargo, mientras escribo esto, esos 48 de gas cuestan 0,07 centavos, que es un coste razonable de un código más simple y menos propenso a errores. + +```solidity + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), +``` + +El primer valor: una bandera que dice que es un valor completo que debe escribirse en la caché, seguido de los 32 bytes del valor. Los otros tres valores son similares, con la salvedad de que `VAL_B` no están escritos en la caché y `VAL_C` es tanto el tercer parámetro como el cuarto. + +```solidity + . + . + . + ); + (_success, _callOutput) = _cacheAddr.call(_callInput); +``` + +Aquí es donde realmente llamamos al contrato `Cache`. + +```solidity + assertEq(_success, true); +``` + +Esperamos que la activación tenga éxito. + +```solidity + assertEq(cache.cacheRead(1), VAL_A); + assertEq(cache.cacheRead(2), VAL_C); +``` + +Comenzamos con una caché vacía y luego añadimos `VAL_A` seguido de `VAL_C`. Esperaríamos que la primera tuviera la clave 1 y que la segunda tuviera 2. + +``` + assertEq(toUint256(_callOutput,0), VAL_A); + assertEq(toUint256(_callOutput,32), VAL_B); + assertEq(toUint256(_callOutput,64), VAL_C); + assertEq(toUint256(_callOutput,96), VAL_C); +``` + +La salida son los cuatro parámetros. Aquí verificamos que es correcto. + +```solidity + // Second call, we can use the cache + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value in the Cache + bytes1(0x01), +``` + +Las claves de caché por debajo de 16 son solo un byte. + +```solidity + // Second value, don't add it to the cache + cache.DONT_CACHE(), + bytes32(VAL_B), + + // Third and fourth values, same value + bytes1(0x02), + bytes1(0x02) + ); + . + . + . + } // testReadParam +``` + +Las pruebas después de la activación son idénticas a las posteriores a la primera activación. + +```solidity + function testEncodeVal() public { +``` + +Esta función es similar a `testReadParam`, salvo que en lugar de escribir los parámetros explícitamente usamos `encodeVal()`. + +```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 +``` + +La única prueba adicional en `testEncodeVal()` es verificar que la longitud de `_callInput` es correcta. Para la primera activación es 4+33\*4. Para la segunda, donde cada valor ya está en la caché, es 4+1\*4. + +```solidity + // Test encodeVal when the key is more than a single byte + // Maximum three bytes because filling the cache to four bytes takes + // too long. + function testEncodeValBig() public { + // Put a number of values in the cache. + // To keep things simple, use key n for value n. + for(uint i=1; i<0x1FFF; i++) { + cache.cacheWrite(i); + } +``` + +La función `testEncodeVal` anterior solo escribe cuatro valores en la caché, por lo que [la parte de la función que se ocupa de los valores de varios bytes](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) no está marcada. Pero ese código es complicado y propenso a errores. + +La primera parte de esta función es un bucle que escribe todos los valores de 1 a 0x1FFF en la caché en orden, por lo que podremos codificar esos valores y saber a dónde van. + +```solidity + . + . + . + + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(0x000F), // One byte 0x0F + cache.encodeVal(0x0010), // Two bytes 0x1010 + cache.encodeVal(0x0100), // Two bytes 0x1100 + cache.encodeVal(0x1000) // Three bytes 0x201000 + ); +``` + +Pruebe con los valores de un byte, dos bytes y tres bytes. No probamos más allá de eso, porque llevaría demasiado tiempo escribir suficientes entradas de pila (al menos 0 x 10000000, aproximadamente un cuarto de mil millones). + +```solidity + . + . + . + . + } // testEncodeValBig + + + // Test what with an excessively small buffer we get a revert + function testShortCalldata() public { +``` + +Pruebe lo que sucede en el caso anormal en el que no haya suficientes parámetros. + +```solidity + . + . + . + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, false); + } // testShortCalldata +``` + +Dado que se revierte, el resultado que deberíamos obtener es `false`. + +``` + // Call with cache keys that aren't there + function testNoCacheKey() public { + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), + + // Second value + bytes1(0x0F), + bytes2(0x1234), + bytes11(0xA10102030405060708090A) + ); +``` + +Esta función obtiene cuatro parámetros perfectamente legítimos, excepto que la caché está vacía, por lo que no hay valores para leer. + +```solidity + . + . + . + // Test what with an excessively long buffer everything works file + function testLongCalldata() public { + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; + + // First call, the cache is empty + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_A), + + // Second value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_B), + + // Third value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_C), + + // Fourth value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_D), + + // And another value for "good luck" + bytes4(0x31112233) + ); +``` + +Esta función envía cinco valores. Sabemos que el quinto valor se ignora porque no es una entrada de caché válida, lo que habría causado una reversión si no se hubiera incluido. + +```solidity + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, true); + . + . + . + } // testLongCalldata + +} // CacheTest + +``` + +## Una aplicación de muestra {#a-sample-app} + +Escribir pruebas en Solidity está muy bien, pero al fin y al cabo una DApp tiene que ser capaz de procesar solicitudes de fuera de la cadena para ser útil. Este artículo muestra cómo usar el almacenamiento en caché en una DApp con `WORM`, que significa «Write Once, Read Many». Si aún no se ha escrito una clave, puede escribirle un valor. Si la clave ya está escrita, se obtiene una reversión. + +### El contrato {#the-contract} + +[Este es el contrato](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol). En su mayoría repite lo que ya hemos hecho con `Cache` y `CacheTest`, por lo que solo cubrimos las partes que son interesantes. + +```solidity +import "./Cache.sol"; + +contract WORM is Cache { +``` + +La forma más fácil de usar `Cache` es heredarlo en nuestro propio contrato. + +```solidity + function writeEntryCached() external { + uint[] memory params = _readParams(2); + writeEntry(params[0], params[1]); + } // writeEntryCached +``` + +Esta función es similar a `fourParam` en `CacheTest` anterior. Debido a que no seguimos las especificaciones de ABI, es mejor no declarar ningún parámetro en la función. + +```solidity + // Make it easier to call us + // Function signature for writeEntryCached(), courtesy of + // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3 + bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3; +``` + +El código externo que activa a `writeEntryCached` tendrá que construir manualmente los Calldata, en lugar de usar `worm.writeEntryCached`, porque no seguimos las especificaciones de ABI. Tener este valor constante hace que sea más fácil escribirlo. + +Tenga en cuenta que a pesar de que definimos `WRITE_ENTRY_CACHED` como una variable de estado, para leerla externamente es necesario usar la función getter para ella, `worm.WRITE_ENTRY_CACHED()`. + +```solidity + function readEntry(uint key) public view + returns (uint _value, address _writtenBy, uint _writtenAtBlock) +``` + +La función de lectura es una `view`, por lo que no requiere una transacción y no cuesta gas. Como resultado, no hay ningún beneficio en usar la caché para el parámetro. Con las funciones de vista, lo mejor es utilizar el mecanismo estándar que es más simple. + +### El código de prueba {#the-testing-code} + +[Este es el código de prueba para el contrato](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol). Una vez más, echemos un vistazo a lo que es interesante. + +```solidity + function testWReadWrite() public { + worm.writeEntry(0xDEAD, 0x60A7); + + vm.expectRevert(bytes("entry already written")); + worm.writeEntry(0xDEAD, 0xBEEF); +``` + +[Esto (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) es como especificamos en una prueba de Foundry que la siguiente activación debe fallar, e informamos de la razón del fallo. Esto se aplica cuando usamos la sintaxis `.()` en lugar de construir los Calldata y activar el contrato utilizando la interfaz de bajo nivel (`.call()`, etc.). + +```solidity + function testReadWriteCached() public { + uint cacheGoat = worm.cacheWrite(0x60A7); +``` + +Aquí nos basamos en que `cacheWrite` devuelve la clave de la caché. Nno es algo que esperábamos usar en la producción, porque `cacheWrite` cambia el estado y, por lo tanto, solo se puede llamar durante una transacción. Las transacciones no tienen valores de retorno, si tienen resultados, se supone que esos resultados se emiten como eventos. Por lo tanto, el valor de retorno `cacheWrite` solo es accesible desde el código en cadena, y el código en cadena no necesita almacenamiento en caché de parámetros. + +```solidity + (_success,) = address(worm).call(_callInput); +``` + +Así es como le decimos a Solidity que, si bien `.call()` tiene dos valores de retorno, solo nos importa el primero. + +```solidity + (_success,) = address(worm).call(_callInput); + assertEq(_success, false); +``` + +Dado que usamos la función de bajo nivel `
    .call()`, no podemos usar `vm.expectRevert()` y tenemos que mirar el valor de éxito booleano que obtenemos de la activación. + +```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); +``` + +Esta es la forma en que verificamos que el código [emite un evento correctamente](https://book.getfoundry.sh/cheatcodes/expect-emit) en Foundry. + +### El cliente {#the-client} + +Una cosa que no se consigue con las pruebas de Solidity es un código JavaScript para cortar y pegar en su propia aplicación. Para escribir ese código, implementé WORM en [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli), [Optimism](https://www.optimism.io/) nueva red de prueba. Está en la dirección [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a). + +[Puede ver el código JavaScript para el cliente aquí](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js). Para usarlo: + +1. Clone el repositorio de git: + + ```sh + git clone https://github.com/qbzzt/20220915-all-you-can-cache.git + ``` + +2. Instale los paquetes necesarios: + + ```sh + cd javascript + yarn + ``` + +3. Copie el archivo de configuración: + + ```sh + cp .env.example .env + ``` + +4. Edite `.env` en su configuración: + + | Parámetro | Valor | + | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | MNEMONIC | El mnemotécnico de una cuenta que tiene suficiente ETH para pagar una transacción. [Puede obtener ETH gratis para la red Optimism Goerli aquí](https://optimismfaucet.xyz/). | + | OPTIMISM_GOERLI_URL | La URL a Optimism Goerli. La terminal pública, `https://goerli.optimism.io`, tiene una tasa limitada pero suficiente para lo que necesitamos aquí | + +5. Ejecute `index.js`. + + ```sh + node index.js + ``` + + Esta aplicación de ejemplo escribe primero una entrada en WORM, mostrando los Calldata y un enlace a la transacción en Etherscan. Luego lee esa entrada y muestra la clave que utiliza y los valores de la entrada (valor, número de bloque y autor). + +La mayor parte del cliente es una DApp JavaScript normal. Así que, de nuevo, solo repasamos las partes interesantes. + +```javascript +. +. +. +const main = async () => { + const func = await worm.WRITE_ENTRY_CACHED() + + // Need a new key every time + const key = await worm.encodeVal(Number(new Date())) +``` + +Una ranura determinada solo se puede escribir una vez, por lo que usamos la marca de tiempo para asegurarnos de no reutilizar las ranuras. + +```javascript +const val = await worm.encodeVal("0x600D") + +// Write an entry +const calldata = func + key.slice(2) + val.slice(2) +``` + +Ethers espera que los datos de la activación sean una cadena hexadecimal, `0x` seguida de un número par de dígitos hexadecimales. Como `key` y `val` comienzan por `0x`, tenemos que eliminar esos encabezados. + +```javascript +const tx = await worm.populateTransaction.writeEntryCached() +tx.data = calldata + +sentTx = await wallet.sendTransaction(tx) +``` + +Al igual que con el código de prueba de Solidity, no podemos activar a una función en caché normalmente. En su lugar, necesitamos usar un mecanismo de nivel inferior. + +```javascript + . + . + . + // Read the entry just written + const realKey = '0x' + key.slice(4) // remove the FF flag + const entryRead = await worm.readEntry(realKey) + . + . + . +``` + +Para leer las entradas podemos usar el mecanismo normal. No es necesario usar el almacenamiento en caché de parámetros con las funciones `view`. + +## Conclusión {#conclusion} + +El código de este artículo es una prueba de concepto, el propósito es hacer que la idea sea fácil de entender. Para un sistema listo para la producción, es posible que se deseen implementar algunas funciones adicionales: + +- Manejar valores que no son `uint256`. Por ejemplo, cadenas. +- En lugar de una caché global, tal vez tenga una asignación entre los usuarios y las cachés. Diferentes usuarios usan diferentes valores. +- Los valores utilizados para las direcciones son distintos de los utilizados para otros fines. Tener una caché separada solo para las direcciones podría ser oportuno. +- Actualmente, las claves de caché están en un algoritmo de «el primero en llegar se lleva la clave más pequeña». Los primeros dieciséis valores se pueden enviar como un solo byte. Los siguientes 4.080 valores se pueden enviar como dos bytes. Los siguientes valores de cerca de un millón son de tres bytes, etc. Un sistema de producción debe mantener los contadores de uso en las entradas de la caché y reorganizarlos de modo que los dieciséis _valores más comunes_ sean de un byte, los siguientes 4.080 valores más comunes de dos bytes, etc. + + Sin embargo, esta es una operación potencialmente peligrosa. Imagine la siguiente secuencia de eventos: + + 1. Noam Naive activa `encodeVal` para codificar la dirección a la que quiere enviar tókenes. Esa dirección es una de las primeras utilizadas en la aplicación, por lo que el valor codificado es 0 x 06. Esta es una función `view`, no una transacción, así que está entre Noam y el nodo que usa, y nadie más lo sabe. + + 2. Owen Owner ejecuta la operación de reordenación de la caché. Muy pocas personas realmente usan esa dirección, por lo que ahora está codificada como 0 x 201122. Un valor diferente, 1018, se asigna 0 x 06. + + 3. Noam Naive envía sus fichas a 0 x 06. Van a la dirección `0x0000000000000000000000000de0b6b3a7640000`, y como nadie conoce la clave privada de esa dirección, están atrapados allí. Noam _no está contento al respecto_. + + Hay formas de resolver este problema y el problema relacionado con las transacciones que están en la zona de espera durante el reorden de la caché, pero debe ser consciente de ello. + +He demostrado el almacenamiento en caché aquí con Optimism, porque soy un empleado de Optimism y este es el rollup que mejor conozco. Pero debería funcionar con cualquier rollup que cobre un coste mínimo por el procesamiento interno, de modo que, en comparación, escribir los datos de la transacción en L1 sea el mayor gasto. diff --git a/public/content/translations/es/developers/tutorials/create-and-deploy-a-defi-app/index.md b/public/content/translations/es/developers/tutorials/create-and-deploy-a-defi-app/index.md new file mode 100644 index 00000000000..220d76e5e08 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/create-and-deploy-a-defi-app/index.md @@ -0,0 +1,481 @@ +--- +title: Crear e implementar una aplicación DeFi +description: Depositar tokens ERC20 en el contrato inteligente y los Tokens de la granja de Menta +author: "strykerin" +tags: + - "solidez" + - "defi" + - "web3.js" + - "truffle" + - "ganache" + - "smart contracts" +skill: intermediate +lang: es +published: 2020-12-31 +source: github.com +sourceUrl: https://github.com/strykerin/DeFi-Token-Farm +--- + +En este tutorial construiremos una aplicación DeFi con Solidity donde los usuarios pueden depositar un token ERC20 en el contrato inteligente y les acuñará y transferirá Farm Tokens. Los usuarios pueden retirar más tarde sus tokens ERC20 quemando su Farm Token en un contrato inteligente y los tokens ERC20 se transferirán de nuevo a ellos. + +## Instalar Truffle y Ganache {#install-truffle-and-ganache} + +Si es la primera vez que escribe un contrato inteligente, deberá configurar su entorno. Vamos a utilizar dos herramientas: [Truffle](https://www.trufflesuite.com/) y [Ganache](https://www.trufflesuite.com/ganache). + +Truffle es un entorno de desarrollo y marco de pruebas para desarrollar contratos inteligentes para Ethereum. Con Truffle es fácil construir e implementar contratos inteligentes en la cadena de bloques. Ganache nos permite crear una cadena de bloques ethereum local para probar contratos inteligentes. Simula las características de la red real y las primeras 10 cuentas se financian con 100 ether de prueba, lo que hace que la implementación y las pruebas de contratos inteligentes sean gratuitas y fáciles. Ganache está disponible como una aplicación de escritorio y una herramienta de línea de comandos. Para este artículo usaremos la aplicación de escritorio UI. + +![Aplicación de escritorio de interfaz de caché](https://cdn-images-1.medium.com/max/2360/1*V1iQ5onbLbT5Ib2QaiOSyg.png)_Aplicación de escritorio Ganache UI_ + +Para crear el proyecto, ejecute los siguientes comandos + +```bash +mkdir your-project-name +cd your-project-name +truffle init +``` + +Esto creará un proyecto en blanco para el desarrollo y despliegue de nuestros contratos inteligentes. La estructura del proyecto creado es la siguiente: + +- `contracts`: Carpeta para los contratos inteligentes (escritos en Solidity) + +- `migraciones`: Carpeta para los scripts de despliegue + +- `test`: Carpeta para probar nuestros contratos inteligentes + +- `truffle-config.js`: Archivo de configuración Truffle + +## Crear el token ERC20 {#create-the-erc20-token} + +Primero necesitamos crear nuestro token ERC20 que utilizaremos para apostar en el contrato inteligente. Para crear nuestro fungible token, primero necesitamos instalar la librería OpenZeppelin. Esta librería contiene las implementaciones de estándares como ERC20 y ERC721. Para instalarlo, ejecute el comando: + +```bash +npm install @openzeppelin/contracts +``` + +Utilizando la librería OpenZeppelin podemos crear nuestro token ERC20 escribiendo a `contracts/MyToken.sol` con el siguiente código de solidez: + +```solidity +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MyToken is ERC20 { + constructor() public ERC20("MyToken", "MTKN"){ + _mint(msg.sender, 1000000000000000000000000); + } +} +``` + +En el código de arriba en: + +- Linea 3: Importamos el contrato ERC-20.sol desde openzeppelin que contiene la implementación para este token estándar. + +- Linea 5: Heredamos desde el contrato ERC-20.sol. + +- Linea 6: Estamos llamando al contructor ERC20.sol y pasando los parametros del nombre y simbolo como `"MyToken"` y `"MTKN"` respectivamente. + +- Linea 7: Estamos minteando y transfiriendo 1 millon de tokens para la cuenta que esta desplegando el contrato inteligente (estamos usando los 18 decimales por defecto del token ERC20, eso significa que si queremos mintear 1 token, lo podes representar como 1000000000000000000, 1 con 18 ceros). + +Debajo podemos ver la implementacion del constructor del ERC20.sol, donde `_decimals` campo esta establecido en 18: + +```solidity +string private _name; +string private _symbol; +uint8 private _decimals; + +constructor (string memory name_, string memory symbol_) public { + _name = name_; + _symbol = symbol_; + _decimals = 18; +} +``` + +## Compilar el Token ERC20 {#compile-the-erc20-token} + +Para compilar nuestro contrato inteligente, primer debemos verificar la versión de nuestro compilador solidity. Puedes verificarla ejecutando el comando: + +```bash +truffle version +``` + +La version por defecto es `Solidity v0.5.16`. Ya que nuestro token está escrito usando la versión de solidity `0.6.2`, si corremos el comando para compilar nuestros contratos obtendremos un error de compilación. En orden para especificar qué versión del compilador de solidity usar, vaya al archivo `truffle-config.js` y establezca la versión deseada del compilador como se ve a continuación: + +```javascript +// Configure your compilers +compilers: { + solc: { + version: "^0.8.0", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } + } +} +``` + +Ahora podemos compilar nuestro contrato inteligente ejecutando el siguiente comando: + +```bash +truffle compile +``` + +## Desplegar Token ERC20 {#deploy-erc20-token} + +Despues de compilar, ahora podemos desplegar nuestro token. + +En la carpeta de `migrations`, crear un archivo llamado `2_deploy_Tokens.js`. Este archivo es donde vamos a desplegar tanto nuestro Token ERC20 y nuestro contrato inteligente FarmToken. El siguiente código se utiliza para desplegar nuestro contrato MyToken.sol: + +```javascript +const MyToken = artifacts.require("MyToken") + +module.exports = async function (deployer, network, accounts) { + // Deploy MyToken + await deployer.deploy(MyToken) + const myToken = await MyToken.deployed() +} +``` + +Abre Ganache y selecciona la opción "Quickstart" (comienzo rápido) para comenzar una blockchain local de Ethereum. Para desplegar nuestro contrato, ejecutar: + +```bash +truffle migrate +``` + +La dirección utilizada para desplegar nuestros contratos es la primera de la lista de direcciones que Ganache nos muestra. Para verificarlo, podemos abrir la aplicacion de escritorio Ganache y podemos verificar que el saldo de ether para nuestra primera cuenta ha sido reducido debido al costo del ether para desplegar nuestros contratos inteligentes: + +![Aplicación de escritorio Ganache](https://cdn-images-1.medium.com/max/2346/1*1iJ9VRlyLuza58HL3DLfpg.png)_Aplicación de escritorio Ganache_ + +Para verificar que 1 millón de tokens de MyToken han sido enviados a la dirección del desplegador, podemos usar la consola de Truffle para interactuar con nuestro contrato inteligente implementado. + +> [Truffle Console es una consola básica e interactiva que se conecta con cualquier cliente de Ethereum.](https://www.trufflesuite.com/docs/truffle/getting-started/using-truffle-develop-and-the-console) + +Para poder interactuar con nuestro contrato inteligente, ejecuta el siguiente comando: + +```bash +truffle console +``` + +Ahora podemos escribir los siguientes comandos en la terminal: + +- Obtener el contrato inteligente: `myToken = await MyToken.deployed()` + +- Obtener la formación de cuentas de Ganache: `accounts = await web3.eth.getAccounts()` + +- Obtener el balance de la primera cuenta: `balance = await myToken.balanceOf(accounts[0])` + +- Formatear el saldo a partir de 18 decimales: `web3.utils.fromWei(balance.toString())` + +Al ejecutar los comandos de arriba, veremos que la primera dirección tiene de hecho 1 millón de MyTokens: + +![La primera dirección tiene 1000000 MyTokens](https://cdn-images-1.medium.com/max/2000/1*AQlj9A7dw-qtY4QAD3Bpxw.png) + +_La primera dirección tiene 1000000 MyTokens_ + +## Crear contrato inteligente FarmToken {#create-farmtoken-smart-contract} + +El contrato inteligente FarmToken tendrá 3 funciones: + +- `balance()`: Obtener el saldo MyToken en el contrato inteligente FarmToken. + +- `deposit(uint256 _amount)`: Transferir MyToken en nombre del usuario al contrato inteligente FarmToken luego mintear y transferir FarmToken al usuario. + +- `retiro (uint256 _amount)`: Quemar FarmTokens del usuario y transferir MyTokens a la dirección del usuario. + +Veamos el constructor de FarmToken: + +```solidity +pragma solidity ^0.6.2; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract FarmToken is ERC20 { + using Address for address; + using SafeMath for uint256; // As of Solidity v0.8.0, mathematical operations can be done safely without the need for SafeMath + using SafeERC20 for IERC20; + + IERC20 public token; + + constructor(address _token) + public + ERC20("FarmToken", "FRM") + { + token = IERC20(_token); + } +``` + +- Líneas 3-6: Importamos los siguientes contratos de openzeppelin: IERC20.sol, Address.sol, SafeERC20.sol y ERC20.sol. + +- Línea 8: El FarmToken heredará del contrato ERC20. + +- Líneas 14-19: El constructor de FarmToken recibirá como parámetro la dirección del contrato MyToken y asignaremos su contrato a nuestra variable pública llamada `token`. + +Vamos a implementar la función `balance()`. No recibirá ningún parámetro y devolverá el saldo de MyToken en este contrato inteligente. Se implementa como se muestra a continuación: + +```solidity +function balance() public view returns (uint256) { + return token.balanceOf(address(this)); +} +``` + +Para la función `deposito (uint256 _amount)`, recibirá como parámetro la cantidad que el usuario quiere depositar y minteara y transferirá FarmTokens al usuario: + +```solidity +function deposit(uint256 _amount) public { + // Amount must be greater than zero + require(_amount > 0, "amount cannot be 0"); + + // Transfer MyToken to smart contract + token.safeTransferFrom(msg.sender, address(this), _amount); + + // Mint FarmToken to msg sender + _mint(msg.sender, _amount); +} +``` + +Para la función `de retiro (uint256 _amount)`, recibiremos como parámetro la cantidad de FarmTokens que el usuario desea grabar y luego transferir la misma cantidad de MyTokens de vuelta al usuario: + +```solidity +function withdraw(uint256 _amount) public { + // Burn FarmTokens from msg sender + _burn(msg.sender, _amount); + + // Transfer MyTokens from this smart contract to msg sender + token.safeTransfer(msg.sender, _amount); +} +``` + +Ahora desplegaremos nuestro contrato inteligente. Para hacerlo, regresaremos al archivo `2_deploy_Tokens.js` y agregaremos el nuevo contrato que se va a implementar: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (deployer, network, accounts) { + // Deploy MyToken + await deployer.deploy(MyToken) + const myToken = await MyToken.deployed() + + // Deploy Farm Token + await deployer.deploy(FarmToken, myToken.address) + const farmToken = await FarmToken.deployed() +} +``` + +Tenga en cuenta que al desplegar FarmToken, pasamos como parámetro la dirección del contrato desplegado MyToken. + +Ahora, ejecuta `truffle compile` y `truffle migrate` para desplegar nuestros contratos. + +Probemos nuestro contrato inteligente. En lugar de usar la `consola de truffle` para interactuar con nuestro contrato inteligente, crearemos un script para automatizar este proceso. Crea una carpeta llamada `scripts` y añade el siguiente archivo `getMyTokenBalance.js`. Comprobará el saldo de MyTokens en el contrato inteligente FarmToken: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (callback) { + myToken = await MyToken.deployed() + farmToken = await FarmToken.deployed() + balance = await myToken.balanceOf(farmToken.address) + console.log(web3.utils.fromWei(balance.toString())) + callback() +} +``` + +Para ejecutar este script, ejecute el siguiente comando: + +```bash +truffle exec .\scripts\getMyTokenBalance.js +``` + +Obtendremos el resultado esperado, que es 0. Si recibes un error sobre el FarmToken indicando que aún no está desplegando, se debe a que la red de Truffle no ha recibido la última versión del código de tu contrato. Cierra Ganache, vuelve a iniciarlo y asegúrate de ejecutar `truffle migrate`. + +Ahora, vamos a depositar MyToken en el contrato inteligente. Puesto que la función `deposit(uint256 _amount)` llama a la función `safeTransferFrom` desde el ERC20, el usuario debe aprobar primero el contrato inteligente para que este pueda transferir MyToken en nombre del usuario. Así que, en el siguiente guión, primero ejecutaremos este paso de aprobación y luego llamaremos a la función: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (callback) { + const accounts = await new web3.eth.getAccounts() + const myToken = await MyToken.deployed() + const farmToken = await FarmToken.deployed() + + // Returns the remaining number of tokens that spender will be allowed to spend on behalf of owner through transferFrom. + // This is zero by default. + const allowanceBefore = await myToken.allowance( + accounts[0], + farmToken.address + ) + console.log( + "Amount of MyToken FarmToken is allowed to transfer on our behalf Before: " + + allowanceBefore.toString() + ) + + // In order to allow the Smart Contract to transfer to MyToken (ERC-20) on the accounts[0] behalf, + // we must explicitly allow it. + // We allow farmToken to transfer x amount of MyToken on our behalf + await myToken.approve(farmToken.address, web3.utils.toWei("100", "ether")) + + // Validate that the farmToken can now move x amount of MyToken on our behalf + const allowanceAfter = await myToken.allowance(accounts[0], farmToken.address) + console.log( + "Amount of MyToken FarmToken is allowed to transfer on our behalf After: " + + allowanceAfter.toString() + ) + + // Verify accounts[0] and farmToken balance of MyToken before and after the transfer + balanceMyTokenBeforeAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenBeforeFarmToken = await myToken.balanceOf(farmToken.address) + console.log("*** My Token ***") + console.log( + "Balance MyToken Before accounts[0] " + + web3.utils.fromWei(balanceMyTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance MyToken Before TokenFarm " + + web3.utils.fromWei(balanceMyTokenBeforeFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenBeforeAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenBeforeFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken Before accounts[0] " + + web3.utils.fromWei(balanceFarmTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance FarmToken Before TokenFarm " + + web3.utils.fromWei(balanceFarmTokenBeforeFarmToken.toString()) + ) + // Call Deposit function from FarmToken + console.log("Call Deposit Function") + await farmToken.deposit(web3.utils.toWei("100", "ether")) + console.log("*** My Token ***") + balanceMyTokenAfterAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenAfterFarmToken = await myToken.balanceOf(farmToken.address) + console.log( + "Balance MyToken After accounts[0] " + + web3.utils.fromWei(balanceMyTokenAfterAccounts0.toString()) + ) + console.log( + "Balance MyToken After TokenFarm " + + web3.utils.fromWei(balanceMyTokenAfterFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenAfterAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenAfterFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken After accounts[0] " + + web3.utils.fromWei(balanceFarmTokenAfterAccounts0.toString()) + ) + console.log( + "Balance FarmToken After TokenFarm " + + web3.utils.fromWei(balanceFarmTokenAfterFarmToken.toString()) + ) + + // End function + callback() +} +``` + +Para ejecutar este script: `truffle exec .\scripts\transferMyTokenToFarmToken.js`. Deberías ver en la consola: + +![salida de transferMyTokenToFarmToken.js](https://cdn-images-1.medium.com/max/2000/1*MoekE2QCw7vB98u5dl7ang.png) + +_salida de transferMyTokenToFarmToken.js_ + +Como podemos ver, la primera cuenta del contrato inteligente ya tiene FarmTokens lo que indica que hemos depositado con éxito MyTokens. + +Para poder retirar: + +```javascript +const MyToken = artifacts.require("MyToken") +const FarmToken = artifacts.require("FarmToken") + +module.exports = async function (callback) { + const accounts = await new web3.eth.getAccounts() + const myToken = await MyToken.deployed() + const farmToken = await FarmToken.deployed() + + // Verify accounts[0] and farmToken balance of MyToken before and after the transfer + balanceMyTokenBeforeAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenBeforeFarmToken = await myToken.balanceOf(farmToken.address) + console.log("*** My Token ***") + console.log( + "Balance MyToken Before accounts[0] " + + web3.utils.fromWei(balanceMyTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance MyToken Before TokenFarm " + + web3.utils.fromWei(balanceMyTokenBeforeFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenBeforeAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenBeforeFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken Before accounts[0] " + + web3.utils.fromWei(balanceFarmTokenBeforeAccounts0.toString()) + ) + console.log( + "Balance FarmToken Before TokenFarm " + + web3.utils.fromWei(balanceFarmTokenBeforeFarmToken.toString()) + ) + + // Call Deposit function from FarmToken + console.log("Call Withdraw Function") + await farmToken.withdraw(web3.utils.toWei("100", "ether")) + + console.log("*** My Token ***") + balanceMyTokenAfterAccounts0 = await myToken.balanceOf(accounts[0]) + balanceMyTokenAfterFarmToken = await myToken.balanceOf(farmToken.address) + console.log( + "Balance MyToken After accounts[0] " + + web3.utils.fromWei(balanceMyTokenAfterAccounts0.toString()) + ) + console.log( + "Balance MyToken After TokenFarm " + + web3.utils.fromWei(balanceMyTokenAfterFarmToken.toString()) + ) + + console.log("*** Farm Token ***") + balanceFarmTokenAfterAccounts0 = await farmToken.balanceOf(accounts[0]) + balanceFarmTokenAfterFarmToken = await farmToken.balanceOf(farmToken.address) + console.log( + "Balance FarmToken After accounts[0] " + + web3.utils.fromWei(balanceFarmTokenAfterAccounts0.toString()) + ) + console.log( + "Balance FarmToken After TokenFarm " + + web3.utils.fromWei(balanceFarmTokenAfterFarmToken.toString()) + ) + + // End function + callback() +} +``` + +Para ejecutar este script: `truffle exec .\scripts\withdrawMyTokenFromTokenFarm.js`. Como podemos ver a continuación, hemos recuperado con éxito los MyTokens y quemado los FarmTokens: + +![salida de DropMyTokenFromTokenFarm.js](https://cdn-images-1.medium.com/max/2000/1*jHYlTFg0NgGbhASpsRvc0w.png) + +_salida de withdrawMyTokenFromTokenFarm.js_ + +## Referencias {#references} + +[Contratos - Documentos OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/) + +[Sweet Tools for Smart Contracts | Truffle Suite](https://www.trufflesuite.com/) + +[Ganache | Truffle Suite](https://www.trufflesuite.com/ganache) + +[¿Qué es DeFi? Una guia para principiantes (Actualizado 2021) (99bitcoins.com)](https://99bitcoins.com/what-is-defi/) + +[DeFi - La tabla de clasificación de finanzas descentralizadas en DeFi Llama](https://defillama.com/) diff --git a/public/content/translations/es/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/es/developers/tutorials/deploying-your-first-smart-contract/index.md new file mode 100644 index 00000000000..3d759ea76f4 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -0,0 +1,99 @@ +--- +title: Implementación de su primer contrato inteligente +description: Una introducción para ejecutar su primer contrato inteligente en la red de prueba de Ethereum +author: "jdourlens" +tags: + - "contratos inteligentes" + - "remezcla" + - "solidity" + - "implementación" +skill: beginner +lang: es +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Supongo que está tan emocionado como nosotros de [implementar](/developers/docs/smart-contracts/deploying/) e interactuar con su primer [contrato inteligente](/developers/docs/smart-contracts/) en la cadena de bloques de Ethereum. + +No se preocupe; como es nuestro primer contrato inteligente, lo implementaremos en una [red de prueba local](/developers/docs/networks/), de modo que no cueste nada publicarlo y pueda experimentar tanto cuanto quiera. + +## Escribir nuestro contrato {#writing-our-contract} + +El primer paso es [visitar Remix](https://remix.ethereum.org/) y crear un nuevo archivo. En la parte superior izquierda de la interfaz de Remix, añada un nuevo archivo e introduzca el nombre de archivo que quiera. + +![Añadir un nuevo archivo en la interfaz de Remix](./remix.png) + +En el nuevo archivo, vamos a pegar el siguiente código: + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.5.17; + +contract Counter { + + // Public variable of type unsigned int to keep the number of counts + uint256 public count = 0; + + // Function that increments our counter + function increment() public { + count += 1; + } + + // Not necessary getter to get the count value + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Si está acostumbrado a programar, puede adivinar fácilmente lo que hace este programa. Aquí hay una explicación línea por línea: + +- Línea 4: Definimos un contrato con el nombre `Counter`. +- Línea 7: Nuestro contrato almacena un entero sin firma llamado `count` que empieza con 0. +- Línea 10: La primera función modificará el estado del contrato e incrementará (`increment()`) nuestra variable `count`. +- Línea 15: La segunda función es solo un getter para poder leer el valor de nuestra variable `count` fuera de nuestro contrato inteligente. Nótese que, como definimos la variable `count` como pública, esto no es necesario, sino que se muestra como ejemplo. + +Esto es todo para nuestro primer y simple contrato inteligente. Como es sabido, parece una clase de lenguajes OOP (programación orientada a objetos) como Java o C++. Ahora es momento de experimentar con nuestro contrato. + +## Implementación del contrato {#deploying-our-contract} + +Como escribimos nuestro primer contrato inteligente, vamos a implementarlo en la cadena de bloques para poder experimentar con él. + +[Implementar nuestro contrato inteligente en la cadena de bloques](/developers/docs/smart-contracts/deploying/) consiste simplemente en enviar una transacción que incluya el código del contrato inteligente compilado sin especificar ningún destinatario. + +Primero [compilaremos el contrato](/developers/docs/smart-contracts/compiling/) haciendo clic en el ícono Compile situado en la parte izquierda: + +![El ícono Compile en la barra de herramientas de Remix](./remix-compile-button.png) + +Luego haga clic en el botón Compile: + +![El botón Compile en el compilador de solidity de Remix](./remix-compile.png) + +Puede optar por seleccionar la opción "Auto Compile" para que el contrato siempre se compile cuando guarde el contenido en el editor de texto. + +Luego, navegue a la pantalla de implementación y ejecución de transacciones: + +![El ícono Implementar en la barra de herramientas de Remix](./remix-deploy.png) + +Una vez que esté en la pantalla de "Deploy and run", compruebe que el nombre del contrato aparezca y haga clic en Deploy. Como puede ver en la parte superior de la página, el entorno actual es "JavaScript VM", lo que significa que desplegaremos e interactuaremos con nuestro contrato inteligente en una cadena de bloques de prueba local para poder probar más rápido y sin ningún costo. + +![El botón Deploy en el compilador de solidity de Remix](./remix-deploy-button.png) + +Una vez que haya pulsado el botón “Deploy”, verá que su contrato aparece en la parte inferior. Haga clic en la flecha de la izquierda para expandir y ver el contenido de nuestro contrato. Esta es nuestra variable `counter`, nuestra función `increment()` y el getter `getCounter()`. + +Si hace clic en el botón `count` o `getCount`, se recuperará el contenido de la variable `count` del contrato y se mostrará. Como aún no hemos invocado la función `increment`, debería mostrarse 0. + +![El botón Function en el compilador de solidity de Remix](./remix-function-button.png) + +Llamemos ahora a la función `increment` haciendo clic en el botón. Verá los registros de las transacciones que se realizan, en la parte inferior de la ventana. Verá que los registros son diferentes cuando pulsa el botón para recuperar los datos en lugar del botón `increment`. Es porque leer datos en la cadena de bloques no necesita ninguna transacción (escritura) o tarifa. Porque solo modificar el estado de la cadena de bloques requiere hacer una transacción: + +![Un registro de transacciones](./transaction-log.png) + +Después de presionar el botón de incremento que generará una transacción para llamar a nuestra función `increment()`, si volvemos a hacer clic en los botones de conteo o getCount, leeremos el estado recién actualizado de nuestro contrato inteligente con la variable de conteo siendo mayor que 0. + +![Nuevo estado actualizado del contrato inteligente](./updated-state.png) + +En el siguiente tutorial, veremos [cómo puede añadir eventos a sus contratos inteligentes](/developers/tutorials/logging-events-smart-contracts/). El registro de eventos es una forma conveniente de depurar su contrato inteligente y entender lo que sucede al llamar a una función. diff --git a/public/content/translations/es/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/es/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md new file mode 100644 index 00000000000..f148ce0d60a --- /dev/null +++ b/public/content/translations/es/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -0,0 +1,163 @@ +--- +title: "Reducir el tamaño de los contratos para luchar contra el límite de tamaño del contrato" +description: '¿Qué puede hacer para evitar que sus contratos inteligentes sean demasiado grandes?' +author: Markus Waas +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "almacenamiento" + - "truffle" +skill: intermediate +published: 2020-06-26 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/max-contract-size +--- + +## ¿Por qué hay un límite? {#why-is-there-a-limit} + +El [22 de noviembre de 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/) el hard-fork Spurious Dragon introdujo [EIP-170](https://eips.ethereum.org/EIPS/eip-170), que agregó un límite de tamaño del contrato inteligente de 24.576 bytes. Para usted, como desarrollador de Solidity, esto significa que cuando añada más y más funcionalidad a su contrato, en algún momento alcanzará el límite y al realizar la implementación verá el error: + +`Advertencia: El tamaño del código del contrato excede los 24576 bytes (un límite introducido en el Spurious Dragon). This contract may not be deployable on Mainnet. Considere habilitar el optimizador (con un valor de "ejecución" bajo), desactivar las cadenas de reversión, o utilizar librerías.` + +Este límite se introdujo para prevenir ataques de denegación de servicio (DOS). Cualquier llamada a un contrato es relativamente barata en términos de gas. Sin embargo, el impacto de una llamada al contrato para nodos Ethereum aumenta desproporcionadamente dependiendo del tamaño del código del contrato llamado (leer el código del disco, preprocesar el código, agregar datos a la prueba Merkle). Cada vez que uno se encuentre en una situación en la que el atacante requiera pocos recursos para causar mucho trabajo a los demás, obtiene el potencial para ataques de DOS. + +Originalmente esto era un problema menor porque el tamaño natural de un contrato es el límite de gas de un bloque. Obviamente, un contrato debe implementarse dentro de una transacción que contenga todo el código de bytes del contrato. Si incluye solo esa transacción en un bloque, puede usar todo ese gas, pero no es infinito. Desde la [Actualización London](/history/#london), el límite de gas de un bloque ha podido variar entre 15 millones y 30 millones de unidades dependiendo de la demanda de la red. + +## Asuma el reto {#taking-on-the-fight} + +Desafortunadamente, no hay una manera fácil de obtener el tamaño del código de bytes de sus contratos. Una gran herramienta que lo ayudará es el complemento [truffle-contract-size](https://github.com/IoBuilders/truffle-contract-size) si usa Truffle. + +1. `npm instalador truffle-contrato-tamaño` +2. Añadir el complemento a _truffle-config.js_: `plugins: ["truffle-contract-size"]` +3. Ejecutar `truffle run contract-size` + +Esto le ayudará a averiguar cómo sus cambios están afectando los tamaños totales del contrato. + +A continuación veremos algunos métodos ordenados según su posible impacto. Piénsalo en términos de pérdida de peso. La mejor estrategia para que alguien alcance su peso deseado (en nuestro caso 24kb) es centrarse primero en los métodos de gran impacto. En la mayoría de los casos, basta con corregir la dieta para conseguirlo, pero a veces se necesita un poco más. Luego puedes añadir algo de ejercicio (impacto medio) o incluso suplementos (impacto bajo). + +## Gran impacto {#big-impact} + +### Separe sus contratos {#separate-your-contracts} + +Este debería ser siempre su primera estrategia. ¿Cómo puede separar el contrato en múltiples contratos más pequeños? Por lo general, esto lo obliga a crear una buena estructura para sus contratos. Desde el punto de vista de la legibilidad del código, siempre se prefieren los contratos más pequeños. A la hora de dividir los contratos, plantéese lo siguiente: + +- ¿Qué funciones deben ir juntas? Cada conjunto de funciones quizás resulte mejor en su propio contrato. +- ¿Qué funciones no requieren la lectura del estado del contrato o solo un subconjunto específico del estado? +- ¿Se puede dividir el almacenamiento y la funcionalidad? + +### Bibliotecas {#libraries} + +Una forma sencilla de mover el código de funcionalidad más allá del almacenamiento es usar una [biblioteca](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries). No declare las funciones de la biblioteca como internas, ya que que se [agregarán al contrato](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking) directamente durante la compilación. Pero si utiliza funciones públicas, estas estarán en realidad en un contrato de biblioteca separado. Considere el uso de [for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for) para que el uso de las bibliotecas sea más conveniente. + +### Proxies {#proxies} + +Una estrategia más avanzada sería un sistema de proxy. Las bibliotecas utilizan `DELEGATECALL` en la parte trasera, lo que simplemente ejecuta la función de otro contrato con el estado del contrato invocante. Eche un vistazo a [esta entrada de blog](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) para aprender más sobre los sistemas de proxy. Le darán mayor funcionalidad, por ejemplo, permiten la actualización, pero también añaden mucha complejidad. No los añadiría solo para reducir el tamaño de los contratos, a menos que sea su única opción por cualquier razón. + +## Impacto medio {#medium-impact} + +### Elimine funciones {#remove-functions} + +Esta debería ser la opción obvia. Las funciones aumentan el tamaño de un contrato. + +- **Externas**: A menudo añadimos muchas funciones de visualización por motivos de conveniencia. Eso está muy bien hasta que alcance el límite de tamaño. Es así que tal vez quiera considerar eliminar todas excepto las absolutamente esenciales. +- **Internas**: También puede eliminar funciones internas/privadas y simplemente insertar el código en la medida en que la función sea invocada solo una vez. + +### Evite variables adicionales {#avoid-additional-variables} + +Un simple cambio como este: + +```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); +} +``` + +implica una diferencia de **0,28 kb**. Es posible que pueda encontrar muchas situaciones similares en sus contratos y que las cantidades sean significativas. + +### Acorte los mensajes de error {#shorten-error-message} + +Los mensajes largos de revertir y, en particular, muchos mensajes diferentes de revertir pueden inflar el contrato. En su lugar, use códigos de error cortos y decodifíquelos en su contrato. Un mensaje largo puede ser mucho más corto: + +```solidity +require(msg.sender == owner, "Only the owner of this contract can call this function"); + +``` + +```solidity +require(msg.sender == owner, "OW1"); +``` + +### Utilice errores personalizados en lugar de mensajes de error + +Los errores personalizados se introdujeron en [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/). Son una excelente manera de reducir el tamaño de sus contratos, porque están codificados con ABI como selectores (al igual que las funciones). + +```solidity +error Unauthorized(); + +if (msg.sender != owner) { + revert Unauthorized(); +} +``` + +### Considere un valor de ejecución bajo en el optimizador {#consider-a-low-run-value-in-the-optimizer} + +También puede cambiar la configuración del optimizador. El valor por defecto de 200 significa que intenta optimizar el código de bytes como si una función fuera llamada 200 veces. Si lo cambia a 1, básicamente le indicará al optimizador que actúe de manera optimizada en el caso de ejecutar cada función una sola vez. Una función optimizada para ejecutarse solo una vez significa que está optimizada para la implementación misma. Tenga en cuenta que **esto incrementa el [costo del gas](/developers/docs/gas/) por ejecutar las funciones**, así que tal vez no quiera inclinarse por esta opción. + +## Pequeño impacto {#small-impact} + +### Evite pasar estructuras a funciones {#avoid-passing-structs-to-functions} + +Si usa el [ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2), puede ayudar a no pasar estructuras a una función. En vez de pasar el parámetro como una estructura... + +```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); +} +``` + +... pase directamente los parámetros requeridos. En este ejemplo ahorramos **0,1 kb**. + +### Declare la visibilidad correcta de las funciones y variables {#declare-correct-visibility-for-functions-and-variables} + +- ¿Funciones o variables que solo sean invocadas desde el exterior? Declárelas como `externas` en lugar de `públicas`. +- ¿Funciones o variables que solo sean invocadas desde dentro del contrato? Declárelas como `privadas` o `internas` en lugar de `públicas`. + +### Elimine modificadores {#remove-modifiers} + +Los modificadores, especialmente cuando se utilizan demasiado, podrían tener un impacto significativo en el tamaño del contrato. Considere eliminarlos y utilizar funciones. + +```solidity +modifier checkStuff() {} + +function doSomething() checkStuff {} +``` + +```solidity +function checkStuff() private {} + +function doSomething() { checkStuff(); } +``` + +Estos consejos deberían ayudarlo a reducir significativamente el tamaño de un contrato. Una vez más, no me canso de decirlo, siempre y cuando sea posible, haga hincapié en la división de los contratos para lograr un mayor impacto. diff --git a/public/content/translations/es/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/es/developers/tutorials/eip-1271-smart-contract-signatures/index.md new file mode 100644 index 00000000000..da69649fe4b --- /dev/null +++ b/public/content/translations/es/developers/tutorials/eip-1271-smart-contract-signatures/index.md @@ -0,0 +1,127 @@ +--- +title: "EIP-1271: Firma y verificación de firmas de contratos inteligentes" +description: Una visión general de la generación y verificación de la firma de contrato inteligente con EIP-1271. También recorremos la implementación de EIP-1271 utilizada en Safe (anteriormente Gnosis Safe) para proporcionar un ejemplo concreto para que los desarrolladores de contratos inteligentes puedan construir. +author: Nathan H. Leung +lang: es +tags: + - "EIP-1271" + - "contratos inteligentes" + - "verificación" + - "firma" +skill: intermediate +published: 2023-01-12 +--- + +El estándar [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) permite que los contratos inteligentes verifiquen las firmas. + +En este tutorial, damos una visión general de las firmas digitales, los antecedentes de EIP-1271 y la implementación específica de EIP-1271 utilizada por [Safe](https://safe.global/) (anteriormente Gnosis Safe). En conjunto, esto puede servir como punto de partida para implementar el EIP-1271 en sus propios contratos. + +## ¿Qué es una firma? + +En este contexto, una firma (más precisamente, una «firma digital») es un mensaje, además de ser algún tipo de prueba de que el mensaje provino de una persona/remitente/dirección específica. + +Por ejemplo, una firma digital podría tener el siguiente aspecto: + +1. Mensaje: "Quiero iniciar sesión en este sitio web con mi cartera de Ethereum." +2. Firmante: Mi dirección es `0x000... ` +3. Prueba: Aquí hay alguna prueba de que yo, `0x000... `, en realidad creé todo este mensaje (esto es generalmente algo criptográfico). + +Es importante tener en cuenta que una firma digital incluye tanto un «mensaje» como una «firma». + +¿Por qué? Por ejemplo, si me diera un contrato para firmar, y luego cortara la página de firma y le devolviera solo mis firmas sin el resto del contrato, el contrato no sería válido. + +De la misma manera, ¡una firma digital no significa nada sin un mensaje asociado! + +## ¿Por qué existe EIP-1271? + +Con el fin de crear una firma digital para su uso en cadenas de bloques basadas en Ethereum, por lo general se necesita una clave privada secreta que nadie más sabe. Esto es lo que hace que su firma sea suya (nadie más puede crear la misma firma sin el conocimiento de la clave secreta). + +Su cuenta de Ethereum (p. ej., su cuenta de propiedad externa/EOA) tiene una clave privada asociada a esta y suele utilizarse cuando un sitio web o una DApp le solicita una firma (p. ej., para «Iniciar sesión con Ethereum»). + +Una aplicación puede [verificar una firma](https://docs.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) creada utilizando una biblioteca de terceros como ethers.js [sin conocer su clave privada](https://en.wikipedia.org/wiki/Public-key_cryptography) y tener plena confianza en que _tú_ usted creó la firma. + +> De hecho, porque las cuentas de propiedad externa utilizan la criptografía de clave pública, ¡estas pueden ser generadas y verificadas **fuera de la cadena**! Así es como funciona la votación DAO sin gas: en vez de enviar votos en la cadena, las firmas digitales pueden ser creadas y verificadas fuera de la cadena utilizando bibliotecas criptográficas. + +Mientras las cuentas de propiedad externa tienen una clave privada, las cuentas de contratos inteligentes no tienen ningún tipo de clave privada o secreta (entonces el «Inicio de sesión con Ethereum», entre otros, no funcionan de manera nativa sin las cuentas de contratos inteligentes). + +El problema que EIP-1271 busca solucionar: ¿cómo podemos decir que la firma de un contrato inteligente es válida si el contrato inteligente no tiene algún «secreto» que pueda incorporar en la firma? + +## ¿Cómo funciona EIP-1271? + +Los contratos inteligentes no tienen claves privadas que se puedan utilizar para firmar mensajes. ¿Entonces cómo podemos saber si una firma es auténtica? + +Bueno, ¡una idea es que podemos _preguntar_ al contrato inteligente si una firma es auténtica! + +Lo que EIP-1271 hace es normalizar esta idea «preguntando» a un contrato inteligente si una firma proporcionada es válida. + +Un contrato donde se implementa EIP-1271 debe tener una función llamada `isValidSignature` que tiene lugar en un mensaje y una firma. Luego, el contrato puede ejecutar algo de lógica de validación (aquí la especificación no hace valer algo en específico) y luego devuelve un valor indicando si la firma es válida o no. + +Si `isValidSignature` devuelve un resultado válido, es como si el contrato hablara y dijera: «¡Sí, apruebo esta firma + mensaje!». + +### Interfaz + +Aquí está la interfaz exacta en la especificación EIP-1271 (hablaremos sobre el parámetro `_hash` abajo, pero por ahora, considérleo como el mensaje que se está verificando): + +```jsx +pragma solidity ^0.5.0; + +contract ERC1271 { + + // bytes4(keccak256("isValidSignature(bytes32,bytes)") + bytes4 constant internal MAGICVALUE = 0x1626ba7e; + + /** + * @dev Should return whether the signature provided is valid for the provided hash + * @param _hash Hash of the data to be signed + * @param _signature Signature byte array associated with _hash + * + * MUST return the bytes4 magic value 0x1626ba7e when function passes. + * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5) + * MUST allow external calls + */ + function isValidSignature( + bytes32 _hash, + bytes memory _signature) + public + view + returns (bytes4 magicValue); +} +``` + +## Implementación EIP-1271 de ejemplo: Safe + +Los contratos pueden implementar `isValidSignature` de varias maneras, la especificación no dice mucho sobre la implementación exacta. + +Un contrato destacado que implementa EIP-1271 es Safe (previamente Gnosis Safe). + +En el código de Safe, `isValidSignature` [se implementa](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol) para que las firmas se creen y comprueben en [de dos maneras:](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support): + +1. Mensajes en cadena + 1. Creación: un propietario seguro crea una nueva transacción segura para «firmar» un mensaje, pasando el mensaje como dato en la transacción. Una vez que suficientes propietarios han firmado la transacción para alcanzar el umbral multifirma, la transacción se transmite y se ejecuta. En la transacción, hay una función segura activada cuando añade el mensaje a un listado de mensajes «aprobados». + 2. Verificación: activa `isValidSignature` en el contrato Safe y pasa el mensaje por verificar como el parámetro del mensaje y [un valor vacío para el parámetro de firma](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (ej: `0x`). Safe verá que el parámetro de firma está vacío y en vez de verificar criptográficamente la firma, sabrá que debe continuar y revisar si el mensaje se encuentra en el listado de mensajes «aprobados». +2. Mensajes fuera de la cadena: + 1. Creación: un propietario seguro crea un mensaje fuera de cadena, luego solicita a otros propietarios seguros que cada uno firme el mensaje individualmente hasta que haya una cantidad suficiente de firmas para superar el umbral de aprobación multifirma. + 2. Verificación: activa `isValidSignature`. En el parámetro mensaje, pasa el mensaje por verificar. En el parámetro firma, pasa las firmas de cada propietario seguro de manera concatenada. Safe revisará que haya suficientes firmas para cumplir el umbral **y** que cada firma es válida. Si lo es, devuelve un valor indicando que la verificación de la firma se realizó correctamente. + +## ¿Qué es exactamente el parámetro `_hash`? ¿Por qué no pasar el mensaje completo? + +Puede que haya notado que la función `isValidSignature` en la [interfaz EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) no toma el mensaje en sí mismo, en su lugar toma un parámetro `_hash`. Esto significa que en vez de pasar completamente el mensaje arbitrariamente a `isValidSignature`, para un hash de 32-bytes del mensaje (generalmente keccak256). + +Cada byte de Calldata, p- ej., datos del parámetro función pasados a la función de un contrato inteligente, [ cuesta 16 gas (4 gas en si hay cero bytes)](https://eips.ethereum.org/EIPS/eip-2028), por lo que puede ahorrar mucho gas si el mensaje es largo. + +### Especificaciones previas de EIP-1271 + +Hay especificaciones EIP-1271 en varias partes que tienen una función `isValidSignature` con un primer parámetro del tipo `bytes` (longitud arbitraria, en vez de una longitud fija de `bytes32`) y el parámetro nombre `message`. Esto es una [versión anterior](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206) del estándar EIP-1271. + +## ¿Cómo debería implementar EIP-1271 en mis propios contratos? + +Aquí la especificación tiene un final muy abierto. La implementación Safe tiene algunas buenas ideas: + +- Puede considerar firmas EOA del «propietario» del contrato como válidas. +- Podría almacenar un listado de mensajes del aprobador y sólo considerar aquellos que sean válidos. + +A fin de cuentas, ¡depende de usted, porque es el desarrollador del contrato! + +## Conclusión + +[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) es un estándar versátil que permite a los contratos inteligentes verificar firmas. Esto abre la puerta para que los contratos inteligentes actúen más como EOA, por ejemplo, proporcionando una manera de «Iniciar sesión con Ethereum» para trabajar con contratos inteligentes, e implementarse de varias manereas (Safe tiene una implementación interesante y nada convencional que debería considerar). diff --git a/public/content/translations/es/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/es/developers/tutorials/erc-721-vyper-annotated-code/index.md new file mode 100644 index 00000000000..ecfbfaf4fbb --- /dev/null +++ b/public/content/translations/es/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -0,0 +1,632 @@ +--- +title: "Una explicación del contrato ERC-721" +description: El contrato ERC-721 de Ryuya Nakamura y cómo funciona +author: Ori Pomerantz +lang: es +tags: + - "vyper" + - "ERC-721" + - "python" +skill: beginner +published: 2021-04-01 +--- + +## Introducción {#introduction} + +La norma [ERC-721](/developers/docs/standards/tokens/erc-721/) sirve para mantener la propiedad de los tókenes no fungibles (o NFT). Los tókenes [ERC-20](/developers/docs/standards/tokens/erc-20/) actúan como mercancía, porque no hay diferencia entre tókenes individuales. En contraste, los tókenes ERC-721 están diseñados para activos similares, pero no identicos, tales como [catcartoons](https://www.cryptokitties.co/) o títulos a diferentes piezas de bienes inmuebles. + +En este artículo analizaremos [el contrato ERC-721 de Ryuya Nakamura](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy). Este contrato está escrito en [Vyper](https://vyper.readthedocs.io/en/latest/index.html), un lenguaje de contrato similar a Python diseñado para hacer más difícil escribir código inseguro que en Solidity. + +## El contrato {#contract} + +```python +# @dev Implementation of ERC-721 non-fungible token standard. +# @author Ryuya Nakamura (@nrryuya) +# Modified from: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy +``` + +Comentarios en Vyper, como en Python, empiezan con un hash (`#`) y continúan hasta el final de la línea. Comentarios que incluyen `@` los usan [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) para producir documentación legible. + +```python +from vyper.interfaces import ERC721 + +implements: ERC721 +``` + +La interfaz ERC-721 está integrada en el lenguaje Vyper. [Puede ver la definición del código aquí](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py). La definición de la interfaz está escrita en Python, en lugar de Vyper, porque las interfaces se utilizan no solo dentro de la cadena de bloques, sino que también al enviar a la cadena de bloques una transacción desde un cliente externo, que puede estar escrito en Python. + +La primera línea importa la interfaz, y la segunda especifica que la estamos implementando aquí. + +### La interfaz de receptor ERC721 {#receiver-interface} + +```python +# Interface for the contract called by safeTransferFrom() +interface ERC721Receiver: + def onERC721Received( +``` + +ERC-721 soporta dos tipos de transferencia: + +- `transferFrom`, que permite al remitente especificar cualquier dirección de destino y responsabiliza al remitente de la transferencia. Esto significa que puede transferir a una dirección no válida, en cuyo caso el NFT se pierde para siempre. +- `safeTransferFrom`, que comprueba si la dirección de destino es un contrato. Si es así, el contrato ERC-721 le pregunta al contrato receptor si quiere recibir el NFT. + +Para responder a `safeTransferFrom`, se solicitará un contrato receptor que implemente `ERC721Receiver`. + +```python + _operator: address, + _from: address, +``` + +La dirección `_from` es el dueño actual del token. La dirección `_operador` es la que solicitó la transferencia (estos dos no pueden ser los mismos, debido a permisos). + +```python + _tokenId: uint256, +``` + +Las ID del token ERC-721 son de 256 bits. Normalmente se crean al cifrar una descripción de lo que sea representara el token. + +```python + _data: Bytes[1024] +``` + +La solicitud puede tener hasta 1.024 bytes de datos de usuario. + +```python + ) -> bytes32: view +``` + +Para prevenir casos en los que un contrato acepte accidentalmente una transferencia, el valor de retorno no es un booleano, si no 256 bits con un valor específico. + +Esta función es una ` view`, lo que significa que puede leer el estado de la cadena de bloques, pero no modificarla. + +### Eventos {#events} + +[Los eventos](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) se emiten para informar a los usuarios y servidores fuera de la cadena de bloques de eventos. Tenga en cuenta que el contenido de los eventos no está disponible para los contratos en la cadena de bloques. + +```python +# @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are +# created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any +# number of NFTs may be created and assigned without emitting Transfer. At the time of any +# transfer, the approved address for that NFT (if any) is reset to none. +# @param _from Sender of NFT (if address is zero address it indicates token creation). +# @param _to Receiver of NFT (if address is zero address it indicates token destruction). +# @param _tokenId The NFT that got transferred. +event Transfer: + sender: indexed(address) + receiver: indexed(address) + tokenId: indexed(uint256) +``` + +Esto es similar a una transferencia de ERC-20, excepto que informamos de un `tokenId` en lugar de una cantidad. Nadie tiene la dirección cero, así que convencionalmente la utilizamos para informar de la creación y destrucción de tókenes . + +```python +# @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero +# address indicates there is no approved address. When a Transfer event emits, this also +# indicates that the approved address for that NFT (if any) is reset to none. +# @param _owner Owner of NFT. +# @param _approved Address that we are approving. +# @param _tokenId NFT which we are approving. +event Approval: + owner: indexed(address) + approved: indexed(address) + tokenId: indexed(uint256) +``` + +La aprobación de una norma ERC-721 es similar a una autorización para el ERC. Se permite una dirección específica para transferir un token específico. Esto da un mecanismo para que los contratos respondan cuando aceptan un token. Los contratos no pueden escuchar eventos, así que si solo transfiere el token a ellos, estos no lo sabrán. De esta manera el propietario de envía primero una aprobación y luego envía una solicitud al contrato: «He aprobado la transferencia del token X, hágalo por favor...». + +Esta es una opción de diseño para hacer que la norma ERC-721 sea similar la norma ERC-20. Debido a que los tókenes ERC-721 no son fungibles, un contrato también puede identificar que obtuvo un token específico mirando la propiedad del token. + +```python +# @dev This emits when an operator is enabled or disabled for an owner. The operator can manage +# all NFTs of the owner. +# @param _owner Owner of NFT. +# @param _operator Address to which we are setting operator rights. +# @param _approved Status of operator rights(true if operator rights are given and false if +# revoked). +event ApprovalForAll: + owner: indexed(address) + operator: indexed(address) + approved: bool +``` + +A veces es útil tener un _operator_ que pueda administrar todos los tókenes de una cuenta de un tipo específico (aquellos que administra un contrato específico), similar a un poder notarial. Por ejemplo, querría dar tal poder a un contrato que comprueba si no me he puesto en contacto con él durante seis meses. Y si así lo desea, distribuye mis activos a mis herederos (si uno de ellos lo solicita, los contratos no pueden hacer nada sin ser invocados por una transacción). En ERC-20 sólo podemos dar una alta asignación a un contrato de herencia, pero eso no funciona para ERC-721 porque los tókenes no son fungibles. Este es el equivalente. + +El valor `approved` nos dice si el evento es para una aprobación o la retirada de una aprobación. + +### Variables de estado {#state-vars} + +Estas variables contienen el estado actual de los tókenes: cuáles están disponibles y quién los posee. La mayoría de estos son objetos de `HashMap`, [, asignaciones unidireccionales que existen entre dos tipos](https://vyper.readthedocs.io/en/latest/types.html#mappings). + +```python +# @dev Mapping from NFT ID to the address that owns it. +idToOwner: HashMap[uint256, address] + +# @dev Mapping from NFT ID to approved address. +idToApprovals: HashMap[uint256, address] +``` + +Las identidades del usuario y del contrato en Ethereum vienen representadas por direcciones de 160-bits. Estas dos variables mapean desde identificadores de tókenes a sus propietarios y aquellos aprobados para transferirlos (máximo uno para cada uno). En Ethereum, los datos no inicializados siempre son cero, así que si no hay ningún propietario o transferidor aprobado, el valor para ese token es cero. + +```python +# @dev Mapping from owner address to count of his tokens. +ownerToNFTokenCount: HashMap[address, uint256] +``` + +Esta variable tiene el recuento de tókenes para cada propietario. No hay mapeo de propietarios a tókenes, así que la única manera de identificar los tókenes que posee un propietario específico es mirar el historial de eventos de la cadena de bloques y ver los eventos apropiados de `Transfer`. Podemos usar esta variable para saber cuando tenemos todos los NFT y no necesitamos mirar aún más a tiempo. + +Tenga en cuenta que este algoritmo sólo funciona para interfaces de usuario y servidores externos. El código en ejecución en la cadena de bloques no puede leer eventos pasados. + +```python +# @dev Mapping from owner address to mapping of operator addresses. +ownerToOperators: HashMap[address, HashMap[address, bool]] +``` + +Una cuenta puede tener más de un operador único. Un simple `HashMap` es insuficiente para llevar un seguimiento de ellos, porque cada clave conduce a un único valor. En su lugar, puede utilizar `HashMap[address, bool]` como el valor. Por defecto, el valor para cada dirección es `False`, lo que significa que no es un operador. Puede establecer valores a `True` según sea necesario. + +```python +# @dev Address of minter, who can mint a token +minter: address +``` + +Hay que crear nuevos tókenes de alguna manera. En este contrato hay una única entidad que puede hacerlo, el `minter`. Es probable que esto sea suficiente para un juego, por ejemplo. Para otros propósitos, podría ser necesario crear una lógica de negocio más complicada. + +```python +# @dev Mapping of interface id to bool about whether or not it's supported +supportedInterfaces: HashMap[bytes32, bool] + +# @dev ERC165 interface ID of ERC165 +ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7 + +# @dev ERC165 interface ID of ERC721 +ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd +``` + +[ERC-165](https://eips.ethereum.org/EIPS/eip-165) especifica un mecanismo para un contrato para divulgar cómo las aplicaciones pueden comunicarse con él, con qué ERC concuerda. En este caso, el contrato se ajusta a ERC-165 y ERC-721. + +### Funciones {#functions} + +Estas son las funciones que implementan ERC-721. + +#### El constructor {#constructor} + +```python +@external +def __init__(): +``` + +En Vyper, como en Python, la función constructora se llama `__init__`. + +```python + """ + @dev Contract constructor. + """ +``` + +En Python, y en Vyper, también puedes crear un comentario especificando una cadena multilínea (que comienza y termina en `"""`), y no usarla de ninguna manera. Estos comentarios también pueden incluir [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html). + +```python + self.supportedInterfaces[ERC165_INTERFACE_ID] = True + self.supportedInterfaces[ERC721_INTERFACE_ID] = True + self.minter = msg.sender +``` + +Para acceder a variables de estado se usa `self.` (otra vez, igual que en Python). + +#### Funciones View {#views} + +Estas son funciones que no modifican el estado de la cadena de bloques y que, por lo tanto, pueden ejecutarse libremente si se invocan externamente. Si las funciones de vista (View) se invocan mediante un contrato y todavía tienen que ejecutarse en cada nodo y por lo tanto cuestan gas. + +```python +@view +@external +``` + +Estas palabras clave antes de una definición de función que empiezan con un signo en la pantalla (`@`) se llaman _decoraciones_. Y especifican las circunstancias en las que se puede activar una función. + +- `@view` especifica que esta función es una vista. +- `@external` especifica que esta función en concreto puede activarse por transacciones y por otros contratos. + +```python +def supportsInterface(_interfaceID: bytes32) -> bool: +``` + +A diferencia de Python, Vyper es un [lenguaje tipeado estático](https://wikipedia.org/wiki/Type_system#Static_type_checking). No se puede declarar una variable o un parámetro de función sin identificar el [tipo de datos](https://vyper.readthedocs.io/en/latest/types.html). En este caso, el parámetro de entrada es `bytes32`, un valor de 256 bits (que es el tamaño de la palabra nativa de la [máquina virtual de Ethereum](/developers/docs/evm/)). La salida es un valor booleano. Por costumbre, los nombres de los parámetros de función comienzan por un guión bajo (`_`). + +```python + """ + @dev Interface identification is specified in ERC-165. + @param _interfaceID Id of the interface + """ + return self.supportedInterfaces[_interfaceID] +``` + +Devuelve el valor del HashMap `self.supportedInterfaces`, que se establece en el constructor (`__init__`). + +```python +### VIEW FUNCTIONS ### +``` + +Estas son las funciones de vista que hacen que la información sobre los tókenes esté disponible para los usuarios y otros contratos. + +```python +@view +@external +def balanceOf(_owner: address) -> uint256: + """ + @dev Returns the number of NFTs owned by `_owner`. + Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. + @param _owner Address for whom to query the balance. + """ + assert _owner != ZERO_ADDRESS +``` + +Esta línea [verifica](https://vyper.readthedocs.io/en/latest/statements.html#assert) que `_owner` no es cero. Si lo es, hay un error y el funcionamiento se revierte. + +```python + return self.ownerToNFTokenCount[_owner] + +@view +@external +def ownerOf(_tokenId: uint256) -> address: + """ + @dev Returns the address of the owner of the NFT. + Throws if `_tokenId` is not a valid NFT. + @param _tokenId The identifier for an NFT. + """ + owner: address = self.idToOwner[_tokenId] + # Throws if `_tokenId` is not a valid NFT + assert owner != ZERO_ADDRESS + return owner +``` + +En la máquina virtual de Ethereum (EVM) cualquier almacenamiento que no tenga un valor almacenado en ella es cero. Si no hay ningún token en `_tokenId`, entonces el valor de `self.idToOwner[_tokenId]` es cero. En ese caso la función se revierte. + +```python +@view +@external +def getApproved(_tokenId: uint256) -> address: + """ + @dev Get the approved address for a single NFT. + Throws if `_tokenId` is not a valid NFT. + @param _tokenId ID of the NFT to query the approval of. + """ + # Throws if `_tokenId` is not a valid NFT + assert self.idToOwner[_tokenId] != ZERO_ADDRESS + return self.idToApprovals[_tokenId] +``` + +Tenga en cuenta que `getApproved` _puede_ dar cero como valor. Si el token es válido, aparece `self.idToApprovals[_tokenId]`. Si no hay aprobador, ese valor es cero. + +```python +@view +@external +def isApprovedForAll(_owner: address, _operator: address) -> bool: + """ + @dev Checks if `_operator` is an approved operator for `_owner`. + @param _owner The address that owns the NFTs. + @param _operator The address that acts on behalf of the owner. + """ + return (self.ownerToOperators[_owner])[_operator] +``` + +Esta función verifica si `_operator` tiene permitido administrar todos los tókenes de `_owner` de este contrato. Debido a que puede haber múltiples operadores, se trata de un HashMap de dos niveles. + +#### Funciones auxiliares de transferencia {#transfer-helpers} + +Estas funciones implementan operaciones que son parte de la transferencia o la gestión de tókenes. + +```python + +### TRANSFER FUNCTION HELPERS ### + +@view +@internal +``` + +Esta decoración `@internal` significa que solo se puede accedeer a la función desde otras funciones dentro del mismo contrato. Por costumbre, los nombres de los parámetros de función comienzan por un guión bajo (`_`). + +```python +def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: + """ + @dev Returns whether the given spender can transfer a given token ID + @param spender address of the spender to query + @param tokenId uint256 ID of the token to be transferred + @return bool whether the msg.sender is approved for the given token ID, + is an operator of the owner, or is the owner of the token + """ + 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 +``` + +Hay tres formas en las que se puede permitir que una dirección transfiera un token: + +1. La dirección es el dueño del token. +2. La dirección está aprobada para gastar ese token. +3. La dirección es un operador para el propietario del token. + +La función anterior puede ser una vista, porque no cambia el estado. Para reducir los costos operativos, cualquier función que _pueda_ ser una vista _debería_ ser una vista. + +```python +@internal +def _addTokenTo(_to: address, _tokenId: uint256): + """ + @dev Add a NFT to a given address + Throws if `_tokenId` is owned by someone. + """ + # Throws if `_tokenId` is owned by someone + assert self.idToOwner[_tokenId] == ZERO_ADDRESS + # Change the owner + self.idToOwner[_tokenId] = _to + # Change count tracking + self.ownerToNFTokenCount[_to] += 1 + + +@internal +def _removeTokenFrom(_from: address, _tokenId: uint256): + """ + @dev Remove a NFT from a given address + Throws if `_from` is not the current owner. + """ + # Throws if `_from` is not the current owner + assert self.idToOwner[_tokenId] == _from + # Change the owner + self.idToOwner[_tokenId] = ZERO_ADDRESS + # Change count tracking + self.ownerToNFTokenCount[_from] -= 1 +``` + +Cuando hay un problema con una transferencia se revierte la activación. + +```python +@internal +def _clearApproval(_owner: address, _tokenId: uint256): + """ + @dev Clear an approval of a given address + Throws if `_owner` is not the current owner. + """ + # Throws if `_owner` is not the current owner + assert self.idToOwner[_tokenId] == _owner + if self.idToApprovals[_tokenId] != ZERO_ADDRESS: + # Reset approvals + self.idToApprovals[_tokenId] = ZERO_ADDRESS +``` + +Cambie el valor solo si es necesario. Las variables de estado viven en el storage. Escribir al almacenamiento es una de las operaciones más caras que hace la EVM (máquina virtual de Ethereum) (en términos de [gas](/developers/docs/gas/)). Por lo tanto, es una buena idea minimizarlo, incluso si escribir el valor existente tiene un alto coste. + +```python +@internal +def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address): + """ + @dev Execute transfer of a NFT. + Throws unless `msg.sender` is the current owner, an authorized operator, or the approved + address for this NFT. (NOTE: `msg.sender` not allowed in private function so pass `_sender`.) + Throws if `_to` is the zero address. + Throws if `_from` is not the current owner. + Throws if `_tokenId` is not a valid NFT. + """ +``` + +Tenemos esta función interna, porque hay dos maneras de transferir tókenes (regulares y seguros), pero solo queremos una única ubicación en el código donde lo hacemos para simplificar la auditoría. + +```python + # Check requirements + assert self._isApprovedOrOwner(_sender, _tokenId) + # Throws if `_to` is the zero address + assert _to != ZERO_ADDRESS + # Clear approval. Throws if `_from` is not the current owner + self._clearApproval(_from, _tokenId) + # Remove NFT. Throws if `_tokenId` is not a valid NFT + self._removeTokenFrom(_from, _tokenId) + # Add NFT + self._addTokenTo(_to, _tokenId) + # Log the transfer + log Transfer(_from, _to, _tokenId) +``` + +Para emitir un evento en Vyper, utiliza una instrucción de registro `log` ([ver aquí para más detalles](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging)). + +#### Funciones de transferencia {#transfer-funs} + +```python + +### TRANSFER FUNCTIONS ### + +@external +def transferFrom(_from: address, _to: address, _tokenId: uint256): + """ + @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved + address for this NFT. + Throws if `_from` is not the current owner. + Throws if `_to` is the zero address. + Throws if `_tokenId` is not a valid NFT. + @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else + they maybe be permanently lost. + @param _from The current owner of the NFT. + @param _to The new owner. + @param _tokenId The NFT to transfer. + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Esta función le permite transferir a una dirección arbitraria. A menos que la dirección sea un usuario, o un contrato que sepa cómo transferir tókenes, cualquier token que usted transfiera se quedará atascado en esa dirección e inutilizable. + +```python +@external +def safeTransferFrom( + _from: address, + _to: address, + _tokenId: uint256, + _data: Bytes[1024]=b"" + ): + """ + @dev Transfers the ownership of an NFT from one address to another address. + Throws unless `msg.sender` is the current owner, an authorized operator, or the + approved address for this NFT. + Throws if `_from` is not the current owner. + Throws if `_to` is the zero address. + Throws if `_tokenId` is not a valid NFT. + If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if + the return value is not `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + NOTE: bytes4 is represented by bytes32 with padding + @param _from The current owner of the NFT. + @param _to The new owner. + @param _tokenId The NFT to transfer. + @param _data Additional data with no specified format, sent in call to `_to`. + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +Es mejor hacer la transferencia primero, porque si hay un problema lo revertiremos de todos modos, para que todas las operaciones de la activación se cancelen. + +```python + if _to.is_contract: # check if `_to` is a contract address +``` + +Primero compruebe si la dirección es un contrato (si tiene código). De lo contrario, asuma que es una dirección de usuario y que el usuario podrá usar el token o transferirlo. No obstante, no se confíe con una falsa sensación de seguridad. Puede perder tókenes, incluso con `safeTransferFrom`, si los transfiere a una dirección cuya clave privada nadie conozca. + +```python + returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) +``` + +Invoque al contrato de destino para ver si puede recibir tókenes ERC-721. + +```python + # Throws if transfer destination is a contract which does not implement 'onERC721Received' + assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32) +``` + +Si el destino es un contrato, pero no acepta tókenes ERC-721 (o que decidió no aceptar esta transferencia en particular), reviertalo. + +```python +@external +def approve(_approved: address, _tokenId: uint256): + """ + @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address. + Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. + Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP) + Throws if `_approved` is the current owner. (NOTE: This is not written the EIP) + @param _approved Address to be approved for the given NFT ID. + @param _tokenId ID of the token to be approved. + """ + owner: address = self.idToOwner[_tokenId] + # Throws if `_tokenId` is not a valid NFT + assert owner != ZERO_ADDRESS + # Throws if `_approved` is the current owner + assert _approved != owner +``` + +Por lo general, si usted no quiere un aprobador, nombre la dirección cero, no a usted mismo. + +```python + # Check requirements + senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender + senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender] + assert (senderIsOwner or senderIsApprovedForAll) +``` + +Para establecer una aprobación usted puede ser el propietario, o un operador autorizado por el propietario. + +```python + # Set the approval + self.idToApprovals[_tokenId] = _approved + log Approval(owner, _approved, _tokenId) + + +@external +def setApprovalForAll(_operator: address, _approved: bool): + """ + @dev Enables or disables approval for a third party ("operator") to manage all of + `msg.sender`'s assets. It also emits the ApprovalForAll event. + Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP) + @notice This works even if sender doesn't own any tokens at the time. + @param _operator Address to add to the set of authorized operators. + @param _approved True if the operators is approved, false to revoke approval. + """ + # Throws if `_operator` is the `msg.sender` + assert _operator != msg.sender + self.ownerToOperators[msg.sender][_operator] = _approved + log ApprovalForAll(msg.sender, _operator, _approved) +``` + +#### Acuñar nuevos tokens y destruir las existentes {#mint-burn} + +La cuenta que creó el contrato es el `minter`, el súper usuario autorizado a acuñar nuevos NFT. Sin embargo, ni siquiera se le permite quemar los tókenes existentes. Solo el propietario, o una entidad autorizada por el propietario, puede hacerlo. + +```python +### MINT & BURN FUNCTIONS ### + +@external +def mint(_to: address, _tokenId: uint256) -> bool: +``` + +Esta función siempre muestra `True`, porque si la operación falla se revierte. + +```python + """ + @dev Function to mint tokens + Throws if `msg.sender` is not the minter. + Throws if `_to` is zero address. + Throws if `_tokenId` is owned by someone. + @param _to The address that will receive the minted tokens. + @param _tokenId The token id to mint. + @return A boolean that indicates if the operation was successful. + """ + # Throws if `msg.sender` is not the minter + assert msg.sender == self.minter +``` + +Sólo el minter (la cuenta que creó el contrato ERC-721) puede acuñar nuevos tókenes. Esto puede ser un problema en el futuro si queremos cambiar la identidad del minter. En un contrato de producción, es deseable una función que permita al minter transferir privilegios de minter a otra persona. + +```python + # Throws if `_to` is zero address + assert _to != ZERO_ADDRESS + # Add NFT. Throws if `_tokenId` is owned by someone + self._addTokenTo(_to, _tokenId) + log Transfer(ZERO_ADDRESS, _to, _tokenId) + return True +``` + +Por lo general, el acuñar nuevos tókenes cuenta como una transferencia desde la dirección cero. + +```python + +@external +def burn(_tokenId: uint256): + """ + @dev Burns a specific ERC721 token. + Throws unless `msg.sender` is the current owner, an authorized operator, or the approved + address for this NFT. + Throws if `_tokenId` is not a valid NFT. + @param _tokenId uint256 id of the ERC721 token to be burned. + """ + # Check requirements + assert self._isApprovedOrOwner(msg.sender, _tokenId) + owner: address = self.idToOwner[_tokenId] + # Throws if `_tokenId` is not a valid NFT + assert owner != ZERO_ADDRESS + self._clearApproval(owner, _tokenId) + self._removeTokenFrom(owner, _tokenId) + log Transfer(owner, ZERO_ADDRESS, _tokenId) +``` + +Cualquiera a quien se le permita transferir un token puede quemarlo. Mientras que una quema parece equivalente a transferira la dirección cero, la dirección cero no recibe el token. Esto nos permite liberar todo el almacenamiento que se utilizó para el token, lo que puede reducir el coste del gas de la transacción. + +# Utilizar este contrato {#using-contract} + +En contraste con Solidity, Vyper no tiene herencia. Esta es una elección de diseño deliberada para hacer el código más claro y por lo tanto más fácil de asegurar. Así que para crear su propio contrato Vyper ERC-721, utilice [este contrato](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) y modifíquelo para implementar la lógica de negocio que desee. + +# Conclusión {#conclusion} + +A modo de recapitulación, he resumido algunas de las ideas más importantes de este contrato: + +- Para recibir tokens ERC-721 con una transferencia segura, los contratos tienen que implementar la interfaz `ERC721Receiver`. +- Incluso si utiliza una transferencia segura, los tókenes todavía pueden atascarse si los envía a una dirección cuya clave privada no se conozca. +- Cuando hay un problema con una operación, es una buena idea usar `revert` en la activación, en lugar de que solo aparezca un valor de fallo. +- Las tókenes ERC-721 existen cuando tienen un propietario. +- Existen tres maneras de ser autorizados para transferir un NFT. Puede ser el propietario, ser aprobado para un token específico, o ser un operador para todos los tókenes del propietario. +- Los eventos pasados solo son visibles fuera de la cadena de bloques. El código ejecutándose dentro de la cadena de bloques no puede verlos. + +Ahora vaya a implementar contratos seguros de Vyper. diff --git a/public/content/translations/es/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/es/developers/tutorials/erc20-annotated-code/index.md new file mode 100644 index 00000000000..a61174e072a --- /dev/null +++ b/public/content/translations/es/developers/tutorials/erc20-annotated-code/index.md @@ -0,0 +1,796 @@ +--- +title: "Una explicación del contrato ERC-20" +description: '¿Qué tiene el contrato OpenZeppelin ERC® y por qué está ahí?' +author: Ori Pomerantz +lang: es +tags: + - "solidity" + - "erc-20" +skill: beginner +published: 2021-03-09 +--- + +## Introducción {#introduction} + +Uno de los usos más comunes para Ethereum es que un grupo cree un token intercambiable, en cierto sentido su propia moneda. Estos tókenes normalmente siguen un estándar, el [ERC-20](/developers/docs/standards/tokens/erc-20/). Este estándar permite escribir herramientas, como reservas de liquidez y carteras, que funcionan con todos los tókenes ERC-20. En este artículo analizaremos la implementación de [OpenZeppelin Solidity ERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol), así como la [definición de interfaz](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol). + +Este es un código fuente anotado. Si quiere implementar ERC-20, [lea este tutorial](https://docs.openzeppelin.com/contracts/2.x/erc20-supply). + +## La Interfaz {#the-interface} + +El propósito de un estándar como ERC-20 es permitir la implementación de muchos tókenes y que sean interoperables a través de aplicaciones, como carteras e intercambios descentralizados. Para lograr esto, creamos una [interfaz](https://www.geeksforgeeks.org/solidity-basics-of-interface/). Cualquier código que necesite usar el contrato de tókenes puede usar las mismas definiciones en la interfaz y ser compatible con todos los contratos de token que lo usan, ya sea una cartera como MetaMask, una DApp como etherscan.io, o un contrato diferente como la reserva de liquidez. + +![Illustración de la interfaz ERC-20](erc20_interface.png) + +Si usted es un programador experto, problablemente recuerde haber visto estructuras similares en [Java](https://www.w3schools.com/java/java_interface.asp) o incluso en [archivos en encabezado C](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html). + +Esta es la deinición de la [Interfaz ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) de OpenZeppelin. Es una derivación del [estándar legible por humanos](https://eips.ethereum.org/EIPS/eip-20) al código de Solidity. Por supuesto, esta interfaz por si sóla no define _como _ hacer nada. Esto se explica en el código fuente del contrato a continuación. + +  + +```solidity +// SPDX-License-Identifier: MIT +``` + +Se supone que los archivos de Solidity incluyen un identificador de licencia. [Puede ver la lista de licencias aquí](https://spdx.org/licenses/). Si necesita una licencia diferente, indíquelo en los comentarios. + +  + +```solidity +pragma solidity >=0.6.0 <0.8.0; +``` + +El lenguaje de Solidity sigue evolucionando rápidamente, y las nuevas versiones pueden que no sean compatibles con el antiguo código ([ver aquí](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html)). Por lo tanto, es una buena idea especificar no solo una versión mínima del lenguaje, sino también una versión máxima: la última con la que probara el código. + +  + +```solidity +/** + * @dev Interfaz del estándar ERC20 como se define en el EIP. + */ +``` + +El `@dev` en el comentario es parte del [formato NatSpec](https://docs.soliditylang.org/en/develop/natspec-format.html), utilizado para producir documentación desde el código fuente. + +  + +```solidity +interface IERC20 { +``` + +Por convención, los nombres de interfaz comienzan por `I`. + +  + +```solidity + /** + * @dev Devuelve la cantidad de tokens en existencia. + */ + function totalSupply() external view returns (uint256); +``` + +Esta función es `external`, lo que significa [que sólo puede ser activada desde fuera del contrato](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2). Devuelve el suministro total de tókenes en el contrato. Este valor se devuelve utilizando el tipo más común en Ethereum, 256 bits sin firma (256 bits es el tamaño nativo de la palabra de la EVM). Esta función también es una `view`, lo que significa que no cambia el estado, así que se puede ejecutar en un solo nodo en lugar de tener cada nodo en la cadena de bloques ejecutándolo. Este tipo de función no genera una transacción y no cuesta [gas](/developers/docs/gas/). + +**Nota:** En teoría puede parecer que el creador de un contrato puede hacer trampas al devolver una oferta total menor que el valor real, haciendo que cada token parezca más valioso de lo que realmente es. Sin embargo, ese temor ignora la verdadera naturaleza de la cadena de bloques. Todo lo que pasa en la cadena de bloques puede verificarse en cada nodo. Para lograrlo, cada maquína de contrato, código de lenguaje y almacenamiento está disponible en cada nodo. Aunque no está obligado a publicar el código de Solidity para su contrato, nadie le tomaría en serio, a menos que publicase el código fuente y la versión de Solidity con la que se compiló, para que pueda verificarlo con respecto al código de lenguaje de la máquina que proporcionó. Por ejemplo, vea [este contrato](https://etherscan.io/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD#code). + +  + +```solidity + /** + * @dev Devuelve la cantidad de tokens tenidos por `cuenta`. + */ + function balanceOf(address account) external view returns (uint256); +``` + +Como indica su nombre, `saldoDe` devuelve el saldo de una cuenta. Las cuentas de Ethereum son identificadas en Solidity usando el tipo de `dirección `, el cual contiene 160 bits. También es `externo` y `vista`. + +  + +```solidity + /** + * @dev Mueve `monto` de tokens de la cuenta del cliente a `beneficiario`. + * + * Devuelve un valor boolean indicando si la operación fue exitosa o no. + * + * Emite un evento {Transfer}. + */ + function transfer(address recipient, uint256 amount) external returns (bool); +``` + +La función `transfer` transfiere tókenes de la persona que lo invoca a una dirección diferente. Esto incluye un cambio de estado, así que no es una `vista`. Cuando un usuario llama está función genera una transacción y cuesta gas. También emite un evento, `Transferir`, para informar a todos en la cadena de bloques del evento. + +La función tiene dos resultados distintos, una para cada tipo de activación: + +- Usuarios que invocan la función directamente desde una interfaz de usuario. Normalmente, el usuario envía una transacción y no espera una respuesta, lo que podría tomar una cantidad indefinida de tiempo. El usuario puede ver lo que ocurrió buscando el recibo de la transacción (que se identifica por el hash de la transacción) o buscando el evento `Transferir`. +- Otros contratos, que invocan la función como parte de una transacción general. Esos contratos obtienen resultados inmediatos, porque se ejecutan en la misma transacción, así que pueden usar el valor de retorno de la función. + +El mismo tipo de resultados lo obtienen las otras funciones que cambian el estado del contrato. + +  + +Las licencias permiten que una cuenta utilice algunos tókenes que pertenecen a un propietario diferente. Esto es útil, por ejemplo, para los contratos que actúan como vendedores. Los contratos no pueden controlar eventos, así que si un comprador transfiriera tókenes al contrato del vendedor directamente ese contrato no sabría si se ha pagado. En cambio, el comprador permite al contrato de vendedor utilizar una cierta cantidad, y el vendedor transfiere esa cantidad. Esto se hace a través de una función que invoca el contrato de vendedor, por lo que el contrato de vendedor puede saber si ha salido bien. + +```solidity + /** + * @dev Devuelve el número restante de tokens que `spender` será + * permitido gastar en nombre de `owner` a través de {transferFrom}. Esto es + * cero por defecto. + * + * Este valor cambia cuando {approve} o {transferFrom} son llamados. + */ + function allowance(address owner, address spender) external view returns (uint256); +``` + +La función `allowance` permite a cualquiera consultar cuál es la asignación que una dirección (`owner`) permite que otra dirección (`spender`) se utilice. + +  + +```solidity + /** + * @dev Establece `amount` como la autorización de `spender` sobre los tokens del que llama. + * + * Devuelve un valor booleano indicando si la operación fue exitosa o no. + * + * IMPORTANTE: Ten en cuenta que cambiar una asignación con este método conlleva el riesgo + * que alguien puede usar tanto el antiguo como el nuevo permiso por desgracia + * orden de transacción. Una posible solución para mitigar esta carrera + * la condición es reducir primero la autorización del gasto a 0 y establecer el + * valor deseado después: + * https://github. om/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emite un evento {Approval}. + */ + function approve(address spender, uint256 amount) external returns (bool); +``` + +La función `approve` crea una asignación. Asegúrate de leer el mensaje sobre cómo se puede abusar de él. En Ethereum usted controla el orden de sus propias transacciones, pero no puede controlar el orden en el que se ejecutarán las transacciones de otras personas, a menos que no envíe su propia transacción hasta que vea que se ha producido la transacción del otro lado. + +  + +```solidity + /** + * @dev mueve `amount` tokens desde`sender` a `recipient` usando el + * mecanismo de autorización. `amount` es entonces deducido de la autorización + * del llamante. + * + * Devuelve un valor booleano indicando si la operación fue exitosa o no. + * + * Emite un evento {Transfer}. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); +``` + +Por último, `transferirDesde` lo utiliza el gastador para utilizar realmente la asignación. + +  + +```solidity + + /** + * @dev Emitido cuando `value` tokens son movidos de una cuenta (`from`) a + * otro (`to`). + * + * Ten en cuenta que `valor` puede ser cero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `valor` es el nuevo permiso. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} +``` + +Estos eventos se emiten cuando cambia el estado del contrato ERC-20. + +## El contrato real {#the-actual-contract} + +Este es el contrato real que implementa el estándar ERC-20, [tomado desde aquí](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). No está pensado para ser usado tal cual, pero puede [heredarlo](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm) para pasarlo a algo utilizable. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.8.0; +``` + +  + +### Importar declaraciones {#import-statements} + +Además de las definiciones de interfaz de arriba, la definición del contrato importa otros dos archivos: + +```solidity + +import "../../GSN/Context.sol"; +import "./IERC20.sol"; +import "../../math/SafeMath.sol"; +``` + +- `GSN/Context.sol` reúne las definiciones que se necesita utilizar [OpenGSN](https://www.opengsn.org/): un sistema que permite a los usuarios sin ether usar la cadena de bloques. Tenga en cuenta que esta es una versión antigua, si desea integrar con OpenGSN [utilice este tutorial](https://docs.opengsn.org/javascript-client/tutorial.html). +- [La biblioteca SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/)que se utiliza para añadir y restar sin excesos. Esto es necesario, porque de lo contrario una persona podría tener un token, gastar dos tókenes y luego tener 2^256-1 tókenes. + +  + +Este comentario explica la finalidad del contrato. + +```solidity +/** + * @dev Implementación de la interfaz {IERC20}. + * + * Esta implementación es agnótica a la forma en que se crean los tokens. Esto significa que + * tiene que añadirse un mecanismo de suministro en un contrato derivado usando {_mint}. + * Para un mecanismo genérico ver {ERC20PresetMinterPauser}. + * + * TIP: Para una escritura detallada vea nuestra guía + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * Hemos seguido las pautas generales de OpenZeppelin: las funciones se revierten en su lugar + * de devolver `falso` en caso de fallo. Este comportamiento es sin embargo convencional + * y no entra en conflicto con las expectativas de las aplicaciones ERC20. + * + * Adicionalmente, se emite un evento de {Approval} en llamadas a {transferFrom}. + * Esto permite a las aplicaciones reconstruir el permiso para todas las cuentas solo + * escuchando dichos eventos. Otras implementaciones del EIP no pueden emitir + * estos eventos, ya que no son requeridos por la especificación. + * + * Finalmente, las funciones no estandarizadas {decreaseAllowance} y {increaseAllowance} + * han sido añadidas para mitigar los ya conocidos problemas relacionados sobre configurar asignaciones. Ver {IERC20-approve}. + */ + +``` + +### Composición del contrato {#contract-definition} + +```solidity +contract ERC20 is Context, IERC20 { +``` + +Esta línea especifica la herencia, en este caso de `IERC20` desde arriba y `Context` para OpenGSN. + +  + +```solidity + + using SafeMath for uint256; + +``` + +Esta línea une la biblioteca `SafeMath` al tipo `uint256`. Puede encontrar esta biblioteca [aquí](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol). + +### Definiciones de variables {#variable-definitions} + +Estas definiciones especifican las variables de estado del contrato. Hay variables declaradas commo `privadas`, pero eso solo significa que otros contratos en la cadena de bloques no pueden leerlas. _No hay secretos en la cadena de bloques_, el software en cada nodo tiene el estado de cada contrato en cada bloque. Convencionalmente, a las variables de estado se les llama `_`. + +Las primeras dos variables son [mapeos](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), es decir, que se comportan aproximadamente igual que [matrices asociativas](https://wikipedia.org/wiki/Associative_array), con la salvedad de que las claves son valores numéricos. El almacenamiento solo se asigna para entradas que tienen valores diferentes del predeterminado (cero). + +```solidity + mapping (address => uint256) private _balances; +``` + +El primer mapeo, `_balances`, son direcciones y sus respectivos balances de este token. Para acceder al saldo, utilice esta frase: `_balances[
    ]`. + +  + +```solidity + mapping (dirección => mapping (dirección => uint256)) private _allowances; +``` + +Esta variable, `_allowances`, almacena las asignaciones explicadas anteriormente. El primer índice es el propietario de los tókenes, y el segundo es el contrato con la asignación. Para acceder a la dirección A puede gastar desde la dirección B de la cuenta, utilice `_allowances[B][A]`. + +  + +```solidity + uint256 private _totalSupply; +``` + +Como el nombre sugiere, esta variable mantiene un seguimiento del suministro total de tókenes. + +  + +```solidity + string private _name; + string private _symbol; + uint8 private _decimals; +``` + +Estas tres variables se utilizan para mejorar la legibilidad. Las dos primeras son autoexplicativas, pero `_decimals` no lo es. + +Por un lado, ethereum no tiene variables de punto flotante o fraccionales. Por otro lado, a los humanos les gusta poder dividir tókenes. Una de las razones por las que la gente se decantó por el oro como moneda fue que era difícil hacer intercambios cuando alguien quería comprar «gato por liebre». + +La solución es llevar un registro de enteros, pero cuenta en lugar del token real un token fraccional que es cercano a no valer nada. En el caso del ether, el token fraccional se llama wei, y 10^18 wei es igual a un ETH. Al cierre de este artículo, 10.000.000.000.000 wei es aproximadamente un centavo de dólar estadounidense o euro. + +Las aplicaciones necesitan saber cómo mostrar el saldo de tókenes. Si un usuario tiene 3.141.000.000.000.000.000 wei, ¿es eso 3,14 ETH? 31.41 ETH? ¿3,141 ETH? En el caso del ether se define 10^18 wei para el ETH, pero para su token puede seleccionar un valor diferente. Si dividir el token no tiene sentido, puede usar un valor de `_decimals` de cero. Si desea utilizar el mismo estándar que ETH, utilice el valor **18**. + +### El constructor {#the-constructor} + +```solidity + /** + * @dev Establece los valores para {name} y {symbol}, inicializa {decimals} con + * un valor predeterminado de 18. + * + * Para seleccionar un valor diferente para {decimals}, use {_setupDecimals}. + * + * Los tres de estos valores son inmutables: sólo pueden establecerse una vez durante + * construcción. + */ + constructor (string memory name_, string memory symbol_) public { + _name = name_; + _symbol = symbol_; + _decimals = 18; + } +``` + +Se le llama constructor cuando se crea el contrato por primera vez. Convencionalmente, los parámetros de la función se llaman `_`. + +### Funciones de la interfaz de usuario {#user-interface-functions} + +```solidity + /** + * @dev Devuelve el nombre del token. + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * Por ejemplo, si `decimales` es igual a `2`, un saldo de tokens `505` debe + * ser mostrado a un usuario como `5,05` (`505 / 10 ** 2`). + * + * Los tokens generalmente optan por un valor de 18, imitando la relación entre + * ether y wei. Este es el valor que usa {ERC20}, a menos que {_setupDecimals} sea llamado +*. + * + * NOTA: Esta información sólo se utiliza para fines de _visualización_: en + * ninguna manera afecta a la aritmética del contrato, incluyendo + * {IERC20-balanceOf} y {IERC20-transfer}. + */ + function decimals() public view returns (uint8) { + return _decimals; + } +``` + +Estas funciones, `name`, `symbol` y `decimals` ayudan a las interfaces de usuario a conocer su contrato, para que puedan mostrarlo correctamente. + +El tipo de retorno es `memoria de cadena`, lo que significa que devuelve una cadena que se almacena en la memoria. Las variables, como cadenas, pueden almacenarse en tres ubicaciones: + +| | Tiempo de vida | Acceso al contrato | Coste del gas | +| -------------- | ------------------------- | ------------------ | ------------------------------------------------------------------------------- | +| Memoria | Activación de una función | Leer/Escribir | Decenas o centenas (más altas para ubicaciones más altas) | +| Calldata | Llamada a función | Sólo lectura | No se puede utilizar como tipo de retorno, solo un tipo de parámetro de función | +| Almacenamiento | Hasta que cambie | Leer/Escribir | Alta (800 para leer, 20.000 para escribir) | + +En este caso, `memory` es la mejor opción. + +### Leer información del token {#read-token-information} + +Estas son funciones que proporcionan información sobre el token, ya sea el suministro total o el saldo de una cuenta. + +```solidity + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } +``` + +La función `totalSupply` devuelve el suministro total de tókenes. + +  + +```solidity + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view override returns (uint256) { + return _balances[account]; + } +``` + +Leer el saldo de una cuenta. Ten en cuenta que cualquiera puede obtener el saldo de otra persona. No tiene sentido intentar ocultar esta información, porque está disponible en cada nodo de todos modos. _No hay secretos en la cadena de bloques._ + +### Transferir tókenes {#transfer-tokens} + +```solidity + /** + * @dev See {IERC20-transfer}. + * + * Requisitos: + * + * - `destinatario` no puede ser la dirección cero. + * - el llamante debe tener un saldo de al menos `amount`. + */ + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { +``` + +La función `transfer` se invoca para transferir tókenes desde la cuenta del remitente a otra diferente. Nótese que aunque devuelve un valor booleano, ese valor es siempre **verdadero o true**. Si la transferencia falla el contrato revierte la activación. + +  + +```solidity + _transfer(_msgSender(), recipient, amount); + return true; + } +``` + +La función `_transfer` hace el trabajo actual. Es una función privada que solo pueden activar otras funciones del contrato. Convencionalmente, a las funciones privadas se les llama `_`, al igual que las variables de estado. + +Normalmente, en Sodity usamos `msg.sender` para el remitente del mensaje. Sin embargo, eso rompe [OpenGSN](http://opengsn.org/). Si queremos permitir transacciones sin etherless con nuestro token, necesitamos usar `_msgSender()`. Devuelve `msg.sender` para transacciones normales, pero para las transacciones si ether devuelve el firmante original y no el contrato que reenvió el mensaje. + +### Funciones de asignación {#allowance-functions} + +Estas son las funciones que implementan la funcionalidad de asignación: `allowance`, `approve`, `transferFrom` y `_approve`. Adicionalmente, la implementación de OpenZeppelin va más allá de los estándares básicos para incluir algo de funcionalidad que mejora la seguridad: `increaseAllwance` y `decreaseAllowance`. + +#### La función de «allowance» {#allowance} + +```solidity + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view virtual override returns (uint256) { + return _allowances[owner][spender]; + } +``` + +La función `allowance` permite a todos revisar cualquier asignación. + +#### La función de «approve» {#approve} + +```solidity + /** + * @dev See {IERC20-approve}. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 amount) public virtual override returns (bool) { +``` + +Esta función se invoca para crear una asignación. Es similar a la función `transfer` que se encuentra más arriba: + +- Esta función solo invoca una función interna (en este caso, `_approve`) que hace el verdadero trabajo. +- La función devuelve `true` (si tiene éxito) o revierte (si no lo tiene). + +  + +```solidity + _approve(_msgSender(), spender, amount); + return true; + } +``` + +Usamos funciones internas para minimizar la cantidad de lugares donde suceden los cambios de estado. _Cualquier_ función que cambia el estado es un potencial riesgo de seguridad que necesita ser auditado por cuestiones de seguridad. De esta manera tenemos una menor probabilidad de hacerlo mal. + +#### La función transferFrom {#transferFrom} + +Esta es la función que un gastador llama para gastar en asignación. Esto requiere dos operaciones: transferir la cantidad gastada y reducir la asignación por esa cantidad. + +```solidity + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}. + * + * Requirements: + * + * - `sender` and `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + * - the caller must have allowance for ``sender``'s tokens of at least + * `amount`. + */ + function transferFrom(address sender, address recipient, uint256 amount) public virtual + override returns (bool) { + _transfer(sender, recipient, amount); +``` + +  + +La activación de la función `a.sub(b, "message")` hace dos cosas. Primero, calcula `a-b`, que es la nueva asignación. En segundo lugar, comprueba que este resultado no es negativo. Si es negativo la llamada se revierte con el mensaje proporcionado. Tenga en cuenta que cuando una activación revierte cualquier procesamiento realizado previamente durante esa activación se ignora, por lo tanto, no necesitamos deshacer la `_transfer`. + +```solidity + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, + "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +#### Adiciones de seguridad a OpenZeppelin {#openzeppelin-safety-additions} + +Es peligroso establecer una asignación diferente de cero a otro valor distinto de cero, porque solo controla el orden de sus propias transacciones y no las de nadie más. Imagine que tiene dos usuarios: Alice que es ingenua y Bill que es un tramposo. Alice quiere algún servicio de Bill, que piensa que cuesta cinco tókenes, por lo que le da a Bill una asignación de cinco tókenes. + +Entonces algo cambia y el precio de Bill sube a diez tókenes. Alice, quien todavía quiere el servicio, envía una transacción que establece la asignación de Bill a diez. En el momento en que Bill ve esta nueva transacción en el fondo de transacciones envía una transacción que gasta los cinco tókenes de Alice y tiene un mayor precio de gas por lo que se minará más rápido. De esa manera Bill puede gastar los primeros cinco tókenes y luego, una vez que se extraiga la nueva asignación de Alice gastará diez más por un precio total de quince tókenes. Más de lo que Alicia quería autorizar. A esta técnica se le llama [anticiparse](https://consensys.github.io/smart-contract-best-practices/attacks/#front-running). + +| Transacción de Alice | Nonce de Alice | Transacción de Bill | Nonce de Bill | Asignación de Bill | Ingresos totales de Bill procedentes de 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 | + +Para evitar este problema. estas dos funciones (`increaseAllowance` y `decreaseAllowance`) le permiten modificar la autorización en una cantidad específica. Así que si Bill ya había gastado cinco tókenes, solo podrá gastar cinco más. Dependiendo del momento, hay dos maneras en las que esto puede funcionar y en ambas Bill acaba recibiendo solo diez tókenes: + +A: + +| Transacción de Alice | Nonce de Alice | Transacción de Bill | Nonce de Bill | Asignación de Bill | Ingresos totales de Bill procedentes de 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: + +| Transacción de Alice | Nonce de Alice | Transacción de Bill | Nonce de Bill | Asignación de Bill | Ingresos totales de Bill procedentes de 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 Atomically increases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } +``` + +La función `a.add(n)` es una adición segura. En el caso poco probable de que `a`+`b`>=`2^256` no se sume de la manera normal en que la adición lo hace. + +```solidity + + /** + * @dev Atomically decreases the allowance granted to `spender` by the caller. + * + * This is an alternative to {approve} that can be used as a mitigation for + * problems described in {IERC20-approve}. + * + * Emits an {Approval} event indicating the updated allowance. + * + * Requirements: + * + * - `spender` cannot be the zero address. + * - `spender` must have allowance for the caller of at least + * `subtractedValue`. + */ + 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; + } +``` + +### Funciones que modifican la información del token {#functions-that-modify-token-information} + +Estas son las cuatro funciones que hacen el verdadero trabajo: `_transfer`, `_mint`, `_burn` y `_approve`. + +#### La función \_transfer {#\_transfer} + +```solidity + /** + * @dev Moves tokens `amount` from `sender` to `recipient`. + * + * This is internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * Requirements: + * + * - `sender` cannot be the zero address. + * - `recipient` cannot be the zero address. + * - `sender` must have a balance of at least `amount`. + */ + function _transfer(address sender, address recipient, uint256 amount) internal virtual { +``` + +Esta función, `_transfer`, transfiere tókenes de una cuenta a otra. La invocan ambas funciones `transfer` (para transferencias desde la cuenta propia del emisor) y `transferFrom` (para usar asignaciones que transfieran desde la cuenta de alguien más). + +  + +```solidity + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); +``` + +Actualmente, nadie poseé la dirección cero en Ethereum (es decir, nadie conoce una clave privada cuya clave pública conocida se transforma en la dirección cero). Cuando las personas usan esa dirección, usualmente es un error del programa, por lo que fallamos si la dirección cero es usada como el emisor o receptor. + +  + +```solidity + _beforeTokenTransfer(sender, recipient, amount); + +``` + +Hay dos maneras de usar este contrato: + +1. Usarlo como plantilla para su propio código. +1. [Herédalo](https://www.bitdegree.org/learn/solidity-inheritance) y sobrescribir sólo aquellas funciones que necesite modificar. + +El segundo método es mucho mejor pues el código ERC de OpenZeppelin ya ha sido auditado y demostrado ser seguro. Cuando utiliza la herencia queda claro cuáles son las funciones que modifica, y para confiar en su contrato, la gente sólo necesita auditar esas funciones específicas. + +A menudo es útil realizar una función cada vez que los tókenes cambian de mano. Sin embargo,`_transfer` es una función muy importante y es posible escribirla de forma insegura (ver abajo), así que lo mejor no anularlo. La solución es `_beforeTokenTransfer`, una función de [gancho](https://wikipedia.org/wiki/Hooking). Puede anular esta función y se activará en cada transferencia. + +  + +```solidity + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); +``` + +Estas son las líneas que en realidad hacen la transferencia. Note que no hay **nada** entre ellas y que restamos la cantidad transferida desde el emisor antes de agregarla al receptor. Esto es importante, porque si se invocó un contrato diferente de por medio, este se pudo usar para engañar a este contrato. De esta manera la transferencia es atómica, nada puede suceder en medio. + +  + +```solidity + emit Transfer(sender, recipient, amount); + } +``` + +Finalmente, emite un evento `Transfer`. Los eventos no son accesibles por los contratos inteligentes, pero el código en ejecución fuera de la cadena de bloques puede escuchar eventos y reaccionar a ellos. Por ejemplo, una billetera puede mantener un registro de cuando el propietario obtiene más tokens. + +#### Las funciones \_mint y \_burn {#\_mint-y-\_burn} + +Estas dos funciones (`_mint` y `_burn`) modifican el suministro total de tókenes. Son internas y no hay ninguna función que las invoque en este contrato, entonces sólo son útiles si las hereda desde un contrato y añade su propia lógica para decidir en qué condiciones quiere acuñar nuevos tóekens o quemar los existentes. + +**NOTA:** cada token ERC-20 tiene su propia lógica de negocio que dicta la administración del token. Por ejemplo, un contrato de suministro fijo solo podría activar `_mint` en el constructor y nunca activar `_burn`. Un contrato que vende tókenes activará `_mint` cuando se pague y, presumiblemente, active `_burn` en cierto punto para evitar una inflación galopante. + +```solidity + /** @dev Creates `amount` tokens and assigns them to `account`, increasing + * the total supply. + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * Requirements: + * + * - `to` cannot be the zero address. + */ + 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); + } +``` + +Asegúrese de actualizar `_totalSupply` cuando la cantidad total de tókenes cambie. + +  + +``` + /** + * @dev Destroys `amount` tokens from `account`, reducing the + * total supply. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * Requirements: + * + * - `account` cannot be the zero address. + * - `account` must have at least `amount` tokens. + */ + 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); + } +``` + +La función `_burn` es casi idéntica a `_mint`, excepto que esta va en otra dirección. + +#### La función \_approve {#\_approve} + +Esta es la función que actualmente especifica asignaciones. Observe que esta permite especificar una asignación que es mayor al balance actual de la cuenta del propietario. Esto es correcto, porque el saldo se revisa en el momento de la transferencia y puede ser diferente del saldo cuando se creó la asignación. + +```solidity + /** + * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + */ + 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; +``` + +  + +Emite un evento `Approval`. Dependiendo de cómo se escriba la aplicación, se le puede informar al contrato gastador sobre la aprobación, ya sea por el propietario o por un servidor que escucha a estos eventos. + +```solidity + emit Approval(owner, spender, amount); + } + +``` + +### Modificar la variable Decimals {#modify-the-decimals-variable} + +```solidity + + + /** + * @dev Sets {decimals} to a value other than the default one of 18. + * + * WARNING: This function should only be called from the constructor. Most + * applications that interact with token contracts will not expect + * {decimals} to ever change, and may work incorrectly if it does. + */ + function _setupDecimals(uint8 decimals_) internal { + _decimals = decimals_; + } +``` + +Esta función modifica la variable `_decimals` que sirve para decirle a las interfaces de usuario cómo deben interpretar la cantidad. Debería activarla desde el constructor. Sería desleal activarla desde cualquier punto subsecuente y las aplicaciones no están diseñadas para manejarla. + +### Hooks {#hooks} + +```solidity + + /** + * @dev Hook that is called before any transfer of tokens. This includes + * minting and burning. + * + * Calling conditions: + * + * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens + * will be to transferred to `to`. + * - when `from` is zero, `amount` tokens will be minted for `to`. + * - when `to` is zero, `amount` of ``from``'s tokens will be burned. + * - `from` and `to` are never both zero. + * + * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. + */ + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } +} +``` + +Esta es la función gancho a ser llamada durante las transferencias. Aquí está vacía, pero si necesita hacer algo puede sobrescribirla. + +# Conclusión {#conclusion} + +Para revisión, he aquí hay algunas de las ideas importantes en este contrato (en mi opinión, porque usted puede pensar de otra manera): + +- _No hay secretos en la cadena de bloques._. Cualquier información a la que un contrato inteligente pueda acceder está disponible para todo el mundo. +- Puedes controlar el orden de tus propias transacciones, pero no cuando ocurren las transacciones de otras personas. Esta es la razón por la que cambiar una asignación puede ser peligroso, por que permite que el gastador gaste la suma de ambos permisos. +- Valores del tipo `uint256` se envuelven alrededor. En otras palabras_ 0-1=2^256-1_. Si no se desea ese comportamiento, tiene que comprobarlo (o use la biblioteca SafeMath, que lo hace en su nombre). Tome en cuenta que esto cambió en [ Solidity 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html). +- Haz todos los cambios de estado de un tipo específico en un lugar en específico, porque esto facilita la auditoría. Esta es la función que tenemos, por ejemplo, `_approve`, la cual se invoca mediante `approve`, `transferFrom`, `increaseAllowance` y `decreaseAllowance` +- Los cambios de estado deben ser atómicos, sin otra acción de por medio (como puedes ver en `_transfer`). Esto se debe a que durante el cambio de estado tiene un estado inconsistente. Por ejemplo, entre el momento en que deduce desde el saldo del emisor y el momento en que añade al saldo del receptor, hay menos tókenes en existencia de los que debería. Se podría abusar de esto potencialmente, si hay operaciones entre ellos, especialmente inivocadas a un contrato diferente. + +Ahora que ha visto cómo se escribe un contrato ERC-20 de OpenZeppelin y especialmente cómo se hace más seguro, escriba sus propias aplicaciones y contratos seguros. diff --git a/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md new file mode 100644 index 00000000000..909cf1672da --- /dev/null +++ b/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md @@ -0,0 +1,213 @@ +--- +title: ERC-20 con mecanismos de seguridad +description: Cómo ayudar a las personas a evitar errores tontos +author: Ori Pomerantz +lang: es +tags: + - "erc-20" +skill: beginner +published: 2022-08-15 +--- + +## Introducción {#introduction} + +Una de las cosas más positivas de Ethereum es que no hay una autoridad central que pueda modificar o deshacer sus transacciones. Y, sin embargo, una de las grandes trabas de Ethereum es que no hay una autoridad central con el poder de deshacer los errores del usuario o las transacciones ilícitas. En este artículo, descubrirá algunos de los errores comunes que los usuarios cometen con los tókenes [ERC-20](/developers/docs/standards/tokens/erc-20/), al igual que cómo crear contratos ERC-20 que ayuden a los usuarios a evitar esos errores, o le otorguen algo de poder a una autoridad central (por ejemplo, para congelar cuentas). + +Observe que aunque utilizaremos el contrato del token ERC-20 [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20), este artículo no lo explica en gran detalle. Puede encontrar [aquí](/developers/tutorials/erc20-annotated-code) esta información. + +Si quieres ver el código fuente completo: + +1. Abre el [IDE Remix](https://remix.ethereum.org/). +2. Haga click en el ícono github de clonar (![clone github icon](icon-clone.png)). +3. Cone el repositorio de GitHub `https://github.com/qbzzt/20220815-erc20-safety-rails`. +4. Abre **contratos > erc20-safety-rails.sol**. + +## Creando un contrato ERC-20 {#creating-an-erc-20-contract} + +Antes de agregar la funcionalidad del riel de seguridad, necesitamos un contrato ERC-20. En este artículo usaremos [el Asistente de Contratos de OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Ábrelo en otra ventana del navegador y sigue estas instrucciones: + +1. Selecciona **ERC-20**. +2. Ingresa estos ajustes: + + | Parámetro | Valor | + | ----------------- | ---------------- | + | Nombre | SafetyRailsToken | + | Símbolo | SAFE | + | Premint | 1000 | + | Características | Ninguno | + | Control de acceso | Ownable | + | Upgradability | Ninguno | + +3. Desplácese hasta arriba y haga click en **Open in Remix** (Abrir en Remix, para Remix) o en **Download** (Descargar) para utilizar un entorno diferente. Doy por sentado que está usando Remix, si usa algo diferente, realice únicamente los cambios apropiados. +4. Ahora tenemos un contrato ERC-20 totalmente funcional. Puedes expandir `.deps` > `npm` para ver el código importado. +5. Compile, despliegue y familiarícese con el contrato para ver si funciona como un contrato ERC-20. Si necesitas aprender cómo utilizar Remix, [usa este tutorial](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth). + +## Errores comunes {#common-mistakes} + +### Los errores {#the-mistakes} + +Los usuarios algunas veces envían tokens a la dirección incorrecta. Como no podemos leer sus mentes para saber lo que hacían, hay dos tipos de error que suceden mucho y son fácilmente detectables: + +1. Envianr los tókenes a la dirección propia del contrato. Por ejemplo, [el token OP de Optimism](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) gestionado para acumular [más de 120.000](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042#tokentxns) tókenes OP en menos de dos meses. Esto representa una cantidad significativa de poder que, supuestamente, las personas perdieron. + +2. Enviar los tókenes a una dirección vacía, que no corresponde a una [cuenta de propiedad externa](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) o a un [contrato inteligente](/developers/docs/smart-contracts). Como no tenemos las estadísticas de la frecuencia con la que esto sucede, [un incidente podría haber costado 20.000.000 tókenes](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595). + +### Evitar transferencias {#preventing-transfers} + +El contrato ERC-20 de OpenZeppelin incluye [ un gancho `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368), que se invoca antes de transferir un token. Por defecto, este gancho no hace nada, pero podemos dotarle de nuestra propia funcionalidad, como los chequeos que revierten si hay algún problema. + +Para usar este gancho, añada esta función antes de la constructora: + +```solidity + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal virtual + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + } +``` + +Algunas partes de esta función pueden resultarle nuevas si no está muy familiarizado con Solidity: + +```solidity + internal virtual +``` + +La palabra clave `virtual` significa que como hemos heredado funcionalidades de `ERC-20` y anulado esta función, otros contratos pueden heredarla de nosotros y anular esta función. + +```solidity + override(ERC20) +``` + +Debemos especificar de manera explícita que estamos [anulando](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) la definición del token ERC20 de `_beforeTokenTransfer`. Por lo general, las definiciones explícitas son mucho mejores, desde una perspectiva de seguridad, que las implícitas. No podemos olvidar que hemos hecho algo si lo tenemos a la vista. Esta es también la razon por la que necesitamos especificar qué `_beforeTokenTransfer` de la superclase estamos anulando. + +```solidity + super._beforeTokenTransfer(from, to, amount); +``` + +Esta línea llama la función de `_beforeTokenTransfer` del contrato o los contratos heredados que la tienen. En este caso, eso es solo `ERC20`, `Ownable` no tiene este gancho. Aunque actualmente `ERC20._beforeTokenTransfer` no hace nada, lo invocamos en caso de que se le añada alguna funcionalidad en el futuro (y así decidimos implementar nuevamente el contrato, porque los contratos no cambian una vez implementados). + +### Codificar los requisitos {#coding-the-requirements} + +Queremos añadir estos requisitos a la función: + +- La dirección `to` no puede ser igual a `address(this)`, la dirección propia del contrato ERC-20. +- La dirección `to` no puede estar vacía, esta debe ser: + - Unas cuentas de propiedad externa (EOA). No podemos revisar si una dirección es una EOA directamente, pero podemos revisar el saldo de ETH de una dirección. Las EOAs casi siempre tienen un balance, incluso si ya no se encuentran en uso - es difícil vaciarlas hasta el último wei. + - Un contrato inteligente. Probar si una dirección es un contrato inteligente es un poco complicado. Hay un código de operación que revisa la longitud externa del código, llamado [`EXTCODESIZE`](https://www.evm.codes/#3b), pero no está disponible directamente en Solidity. Debemos usar [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html), que es un ensamblaje de EVM, para tal fin. Hay otros valores que podemos usar desde Solidity ([`
    .code` y `
    .codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), pero cuestan más. + +Repasemos el nuevo código línea por línea: + +```solidity + require(to != address(this), "Can't send tokens to the contract address"); +``` + +Este es el primer requisito, revisa que `to` y `this(address)` no sean lo mismo. + +```solidity + bool isToContract; + assembly { + isToContract := gt(extcodesize(to), 0) + } +``` + +Así es como revisamos si una dirección es un contrato. No podemos recibir salidas directamente de Yul, en vez de esto, definimos una variable para almacenar el resultado (`isToContract` en este caso). Según el funcionamiento de Yul, cada código de operación se considera una función. Por tanto, primero invocamos [`EXTCODESIZE`](https://www.evm.codes/#3b) para obtener el tamaño del contrato y después [`GT`](https://www.evm.codes/#11) para revisar que no sea cero (estamos trabajando con números enteros sin firmar, por lo que no puede ser negativo). Luego escribimos el resultado en `isToContract`. + +```solidity + require(to.balance != 0 || isToContract, "Can't send tokens to an empty address"); +``` + +Finalmente, tenemos la revisión verdadera para direcciones vacías. + +## Acceso administrativo {#admin-access} + +Algunas veces es útil tener un administrador que puede deshacer los errores. Para reducir el potencial de abuso, este administrador puede ser una [multifirma](https://blog.logrocket.com/security-choices-multi-signature-wallets/), por lo que varias personas deben estar de acuerdo con una acción. En este artículo tenemos dos características administrativas: + +1. Congelar y descongelar cuentas. Esto puede ser útil, por ejemplo, cuando una cuenta puede verse afectada. +2. Limpieza de activos. + +Los fraudes algunas veces envían tókenes fraudulentos al contrato de un token real para obtener la legitimidad. Por ejemplo, [consulte aquí](https://optimistic.etherscan.io/token/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe?a=0x4200000000000000000000000000000000000042). El contrato ERC-20 legítimo es [0x4200....0042](https://optimistic.etherscan.io/address/0x4200000000000000000000000000000000000042). El fraude que pretende ser legítimo es [0x234....bbe](https://optimistic.etherscan.io/address/0x2348b1a1228ddcd2db668c3d30207c3e1852fbbe). + +También puede que las personas envíen tókenes ERC-20 legítimos a nuestro contrato por error, lo cual es otra razón para querer tener una manera de eliminarlos. + +OpenZeppelin proporciona dos mecanismos para activar el acceso administrativo: + +- Los contratos [`Ownable`](https://docs.openzeppelin.com/contracts/4.x/access-control#ownership-and-ownable) tienen un único dueño. Las funciones que tiene el [modificador](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `onlyOwner` sólo las puede activar el propietario. Los dueños pueden transferir la propiedad a otra persona o renunciar a esta completamente. Los derechos de todas las otras cuentas son generalmente idénticos. +- Los contratos [`AccessControl`](https://docs.openzeppelin.com/contracts/4.x/access-control#role-based-access-control) tienen [control de acceso basado en roles (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control). + +Para simplificar la explicación, en este artículo utilizaremos `Ownable`. + +### Congelar y descongelar contratos {#freezing-and-thawing-contracts} + +Congelar y descongelar contratos requiere varios cambios: + +- El [mapeo](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) de direcciones a [booleanos](https://en.wikipedia.org/wiki/Boolean_data_type) para hacer un seguimiento de las direcciones que están congeladas. Todos los valores son inicialmente cero, el cual interpretan como falso los booleanos. Esto es precisamente lo que queremos; ya que, por defecto, las cuentas no están congeladas. + + ```solidity + mapping(address => bool) public frozenAccounts; + ``` + +- [Eventos](https://www.tutorialspoint.com/solidity/solidity_events.htm) para informar a cualquier interesado cuando una cuenta se congela o descongela. Desde un punto de vista técnico, no se requieren eventos para estas acciones, aunque le ayudan al código fuera de la cadena a ser capaz de escuchar estos eventos y saber lo que está ocurriendo. Se considera una buena práctica en contratos inteligentes, emitirlos cuando sucede algo que puede ser relevante para alguien más. + + Los eventos están indexados, por tanto, es posible buscar totas las veces que una cuenta se ha congelado o descongelado. + + ```solidity + // When accounts are frozen or unfrozen + event AccountFrozen(address indexed _addr); + event AccountThawed(address indexed _addr); + ``` + +- Funciones para el congelamiento y descongelamiento de cuentas. Al ser estas dos funciones son prácticamente idénticas, solo hablaremos de la función para congelar. + + ```solidity + function freezeAccount(address addr) + public + onlyOwner + ``` + + Las funciones marcadas como [`públicas`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) pueden activarse desde otros contratos inteligentes o directamente mediante una transacción. + + ```solidity + { + require(!frozenAccounts[addr], "Account already frozen"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); + } // freezeAccount + ``` + + Si la cuenta ya está congelada, revierte. De lo contrario, congélela y `emit` un evento. + +- Cambie `_beforeTokenTransfer` para evitar que el dinero pase desde una cuenta congelada. Tenga en cuenta que el dinero todavía puede transferirse a la cuenta congelada. + + ```solidity + require(!frozenAccounts[from], "The account is frozen"); + ``` + +### Limpieza de activos {#asset-cleanup} + +Para publicar tókenes ERC-20 retenidos por este contrato, necesitamos activar una función en el contrato del token al que pertenece, siendo [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) o [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve). En este caso no tiene sentido el gasto de gas en asignaciones, también podemos transferir directamente. + +```solidity + function cleanupERC20( + address erc20, + address dest + ) + public + onlyOwner + { + IERC20 token = IERC20(erc20); +``` + +Esta es la sintaxis necesaria para crear un objeto para un contrato cuando recibimos la dirección. Podemos hacer esto porque tenemos la definición para tokens ERC20 como parte del código fuente (ver la línea 4) y ese archivo incluye [la definición para IERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol), la interfaz para un contrato ERC20 de OpenZeppelin. + +```solidity + uint balance = token.balanceOf(address(this)); + token.transfer(dest, balance); + } +``` + +Se trata de una función de limpieza, por lo que supuestamente no queremos dejar ningún token. En lugar de obtener el saldo del usuario manualmente, también podríamos automatizar el proceso. + +## Conclusión {#conclusion} + +Esta no es una solución perfecta, ya que no existe una solución perfecta para un problema ocurrido cuando un usuario hace un fallo. Sin embargo, usar este tipo de comprobaciones puede al menos prevenir algunos errores. La capacidad de congelar cuentas, a pesar de ser peligrosa, puede utilizarse para limitar el daño de ciertos actos de piratería, negando al hacker los fondos robados. diff --git a/public/content/translations/es/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/es/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md new file mode 100644 index 00000000000..ab43816b64f --- /dev/null +++ b/public/content/translations/es/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -0,0 +1,154 @@ +--- +title: Claves para desarrolladores principiantes en Ethereum +description: "Esta es una guía de ayuda a principiantes para comenzar a desarrollar en Ethereum. Te enseñaremos los fundamentos: desde montar una terminal de conexión API, a solicitar una línea de comando pasando por ensamblar tu primer script en Web3. ¡No se necesita experiencia en desarrollo de blockchain!" +author: "Elan Halpern" +tags: + - "JavaScript" + - "ethers.js" + - "nodos" + - "consulta" + - "Alchemy" +skill: beginner +lang: es +published: 2020-10-30 +source: Medio +sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f +--- + +![Logotipos de Ethereum y Alchemy](./ethereum-alchemy.png) + +Esta es una guía de ayuda a principiantes para comenzar a desarrollar en Ethereum. En este turorial utilizaremos [Alchemy](https://alchemyapi.io/), la plataforma líder de desarrolladores de cadena de bloques que permite desarrollar a millones de usuarios desde el 70 % de las aplicaciones más populares de cadena de bloques, incluyendo Maker, 0x, MyEtherWallet, Dharma y Kyber. Alchemy nos dará acceso a una terminal de conexión API en la cadena Ethereum para que podamos leer y escribir transacciones. + +¡Te guiaremos desde el registro con Alchemy hasta escribir tu primer script para Web3! ¡No se necesita experiencia en desarrollo de cadena de bloques! + +## 1. Regístrate de manera gratuita en Alchemy {#sign-up-for-a-free-alchemy-account} + +Crear una cuenta con Alchemy es fácil, [regístrate gratis aquí](https://auth.alchemyapi.io/signup). + +## 2. Crear una aplicación de Alchemy {#create-an-alchemy-app} + +Para comunicarte con la cadena Ethereum y utilizar los productos de Alchemy, necesitas una clave API para autenticar tus peticiones. + +Puedes [crear claves API desde el panel de control](http://dashboard.alchemyapi.io/). Para crear una nueva clave, navega hasta «Crear aplicación» como se muestra a continuación: + +¡Queremos expresar nuestro agradecimiento especial a [_ShapeShift_](https://shapeshift.com/) _por dejarnos mostrar su panel!_ + +![Panel de Alchemy](./alchemy-dashboard.png) + +Rellene los datos de «Crear aplicación» para obtener su nueva clave. También podrá ver otras aplicaciones que haya creado anteriormente y las que haya hecho su equipo. Extraiga las claves existentes haciendo clic en «Ver clave» para cualquier aplicación. + +![Crear una aplicación con la captura de pantalla de Alchemy](./create-app.png) + +También puede extraer las claves de API existentes pasando el cursor por «Apps» y seleccionando una. Usted puede «Ver clave» aquí, así como «Editar aplicación» a la lista blanca de dominios específicos, ver varias herramientas de desarrolladores y analíticas. + +![Gif que muestra a un usuario cómo extraer las claves de la API](./pull-api-keys.gif) + +## 3. Hacer una solicitud en la línea de comandos {#make-a-request-from-the-command-line} + +Interactuar con la cadena de bloques de Ethereum a través de Alchemy usando JSON-RPC y curl. + +Para solicitudes manuales, recomendamos interactuar con `JSON-RPC` a través de solicitudes `POST`. Simplemente pase el encabezado `Content-Type: application/json` y su consulta como el cuerpo `POST` con los siguientes campos: + +- `jsonrpc`: la versión JSON-RPC, por el momento sólo `2.0` es compatible. +- `method`: el método ETH API. [Ver referencia sobre API.](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) +- `params`: una lista de parámetros a pasar al método. +- `id`: la ID de su solicitud. La devolverá la respuesta para que pueda hacer un seguimiento de a qué solicitud pertenece una respuesta. + +He aquí un ejemplo que puede ejecutar desde la línea de comandos para recuperar el precio actual del gas: + +```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}' +``` + +_**NOTA:** Sustituya [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo) con su propia clave API `https://eth-mainnet.alchemyapi.io/v2/**tu-clave-api`._ + +**Resultados:** + +```json +{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 } +``` + +## 4. Configurar su cliente Web3 {#set-up-your-web3-client} + +**Si tienes un cliente existente,** cambia tu URL actual del proveedor de nodos a una URL de Alchemy con tu clave API: `“https://eth-mainnet.alchemyapi.io/v2/your-api-key"` + +**_NOTA:_** Los scripts a continuación necesitan ejecutarse en un **contexto de nodo** o **guardarse en un archivo**no se ejecutarán desde la línea de comandos. Si aún no tiene instalado un nodo o npm, consulte esta rápida [guía de configuración para Macs](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs). + +Hay infinidad de [bibliotecas en Web3](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) que puede integrar con Alchemy, no obstante, le recomendamos usar [Alchemy Web3](https://docs.alchemy.com/reference/api-overview), una sustitución para Web 3, ensamblada y configurada para funcionar a la perfección con Alchemy. Le proporciona múltiples ventajas, como reintentos automáticos y un soporte sólido para WebSocket. + +Para instalar AlchemyWeb3.js, **vaya al directorio de su proyecto** y ejecute: + +**Con Yarn:** + +``` +yarn add @alch/alchemy-web3 +``` + +**Con NPM:** + +``` +npm install @alch/alchemy-web3 +``` + +Para interactuar con la infraestructura del nodo de Alchemy, ejecute en NodeJS o añada esto a un archivo JavaScript: + +```js +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3( + "https://eth-mainnet.alchemyapi.io/v2/tu-clave-api" +) +``` + +## 5. Escriba su primer script en Web3! {#write-your-first-web3-script} + +Ahora entremos en materia con una pequeña programación en Web 3: escribiremos un simple script que imprima el último número de bloque de la red principal de Ethereum. + +**1. Si aún no lo ha hecho, en su terminal, cree un nuevo proyecto con un directorio y cd en él:** + +``` +mkdir web3-example +cd web3-example +``` + +**2. Instale el vínculo de Alchemy Web3 (o cualquier Web3) en su proyecto si aún no lo ha hecho:** + +``` +npm install @alch/alchemy-web3 +``` + +**3. Cree un archivo llamado `index.js` y añada el siguiente contenido:** + +> En última instancia, debería reemplazar `demo` por su clave API del HTTP Alchemy. + +```js +async function main() { + const { createAlchemyWeb3 } = require("@alch/alchemy-web3") + const web3 = createAlchemyWeb3("https://eth-mainnet.alchemyapi.io/v2/demo") + const blockNumber = await web3.eth.getBlockNumber() + console.log("The latest block number is " + blockNumber) +} +main() +``` + +¿No está familiarizado con las funciones Async? Échele un vistazo a este [post en Medium](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c). + +**4. Ejecútelo en su terminal usando un nodo** + +``` +node index.js +``` + +**5. ¡Ahora debería ver el último resultado de número de bloque en su consola!** + +``` +El último número de bloque es el 11043912 +``` + +**¡Guau! ¡Enhorabuena! Acaba de escribir su primer script en Web3 utilizando Alchemy 🎉** + +¿No sabe por dónde seguir ahora? ¡Pruebe a implementar su primer contrato inteligente y entrar en materia con algo de programación de Solidity en nuestra [Guía sobre contratos inteligentes abierta a todos los públicos](https://docs.alchemyapi.io/tutorials/hello-world-smart-contract) o pruebe su panel de conocimiento con la [aplicación de prueba del panel](https://docs.alchemyapi.io/tutorials/demo-app)! + +_[Regístrese gratis en Alchemy](https://auth.alchemyapi.io/signup), eche un vistazo a nuestra [documentación](https://docs.alchemyapi.io/) y para estar al tanto de las últimas novedades, síganos en [Twitter](https://twitter.com/AlchemyPlatform)_. diff --git a/public/content/translations/es/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/es/developers/tutorials/guide-to-smart-contract-security-tools/index.md new file mode 100644 index 00000000000..6a183ed7694 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -0,0 +1,105 @@ +--- +title: Una guía de herramientas de seguridad para contratos inteligentes +description: Una descripción general de tres técnicas diferentes de prueba y análisis de programas +author: "Trailofbits" +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "seguridades" +skill: intermediate +published: 2020-09-07 +source: Desarrollar contratos seguros +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis +--- + +Vamos a usar tres técnicas distintas para el análisis de pruebas y programas: + +- **Análisis estático con [Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/).** Todas las rutas del programa se abordan y analizan al mismo tiempo, a través de diferentes presentaciones del programa (por ejemplo, control-flow-graph). +- **Fuzzing (auditorías de seguridad) con [Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/).** El código se ejecuta con una generación pseudoaleatoria de transacciones. El fuzzer tratará de encontrar una secuencia de transacciones para infringir una propiedad determinada. +- **Ejecución simbólica con [Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/).** Una técnica de verificación formal, que traduce cada ruta de ejecución a una fórmula matemática, en la que se pueden comprobar las restricciones superiores. + +Cada técnica tiene ventajas y obstáculos que serán útiles en casos específicos: + +| Técnica | Herramienta | Uso | Velocidad | Errores perdidos | Falsas alarmas | +| -------------------------------- | ----------- | --------------------------------- | --------- | ---------------- | -------------- | +| Análisis estáticos | Slither | CLI & scripts | segundos | moderado | bajo | +| Fuzzing (auditoría de seguridad) | Echidna | Propiedades de Solidity | minutos | bajo | ninguno | +| Ejecución simbólica | Manticore | Propiedades de Solidity & scripts | horas | ninguno | ninguno | + +si todas las rutas son exploradas sin tiempo de espera + +**Slither** analiza los contratos en segundos, sin embargo, el análisis estático puede conducir a falsas alarmas y será menos adecuado para comprobaciones complejas (ej., controles aritméticos). Ejecute Slither a través de la API para acceder a los detectores incorporados o a través de la API para comprobaciones definidas por el usuario. + +**Echidna** necesita funcionar durante varios minutos y solo producirá verdaderos positivos. Echidna comprueba las propiedades de seguridad proporcionadas por el usuario, escritas en Solidity. Podría perderse errores, ya que se basa en una exploración aleatoria. + +**Manticore** realiza el análisis de «peso más pesado». Al igual que Echidna, Manticore verifica las propiedades proporcionadas por el usuario. Necesitará más tiempo para funcionar, pero puede demostrar la validez de una propiedad y no comunicará falsas alarmas. + +## Flujo de trabajo sugerido {#suggested-workflow} + +Comience con los detectores incorporados de Slither para asegurarse de que no haya errores simples ahora o que se introduzcan más tarde. Utilice Slither para comprobar propiedades relacionadas con la herencia, dependencias variables y problemas estructurales. A medida que vaya creciendo el código, utilice Echidna para probar propiedades más complejas de la máquina de estado. Revise de nuevo Slither para desarrollar comprobaciones personalizadas para protecciones no disponibles de Solidity, como la protección contra una función que se anula. Por último, utilice Manticore para realizar una verificación específica de las propiedades de seguridad crítica, por ejemplo, operaciones aritméticas. + +- Utilice el CLI de Slither para detectar problemas comunes. +- Utilice Echidna para probar propiedades de seguridad de alto nivel de su contrato. +- Utilice Slither para escribir comprobaciones estáticas personalizadas. +- Utilice Manticore una vez que desee una garantía profunda de las propiedades de seguridad críticas. + +**Una aclaración sobre las pruebas unitarias**. Las pruebas unitarias son necesarias para construir software de alta calidad. Sin embargo, estas técnicas no son las más adecuadas para encontrar defectos de seguridad. Se suelen utilizar para probar comportamientos positivos del código (ej., que el código funciona como se esperaba en el contexto normal), mientras que los defectos de seguridad tienden a residir en casos extremos que los desarrolladores no consideraron. En nuestro estudio de docenas de revisiones de seguridad de contratos inteligentes, [la cobertura de prueba unitaria no tuvo efecto en el número o gravedad de defectos de seguridad](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/) que encontramos en el código de nuestro cliente. + +## Determinar propiedades de seguridad {#determining-security-properties} + +Para probar y verificar eficazmente su código, debe identificar las áreas que necesitan atención. Como sus recursos destinados a seguridad son limitados, es importante hacer frente a las partes débiles o de alto valor de su código base para optimizar su esfuerzo. El modelado de amenazas puede ser útil. Considere revisar: + +- [Evaluaciones de riesgo rápidas](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (nuestro enfoque preferido cuando hay poco tiempo) +- [Guía de modelos de amenazas del sistema central de datos](https://csrc.nist.gov/publications/detail/sp/800-154/draft) (también conocido como NIST 800-154) +- [Modelos de amenazas de Shostack](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.) +- [Uso de afirmaciones](https://blog.regehr.org/archives/1091) + +### Componentes {#components} + +Saber lo que quiere comprobar también le ayudará a seleccionar la herramienta correcta. + +Las áreas extensas que suelen ser relevantes para los contratos inteligentes incluyen: + +- **Máquina de estado.** La mayoría de los contratos pueden representarse como una máquina de estado. Considere comprobar que (1) No se puede alcanzar un estado no válido, (2) si puede alcanzarse un estado válido, y (3) ningún estado retiene el contrato. + + - Echidna y Manticore son las herramientas para favorecer la prueba de especificaciones de las máquinas del estado. + +- **Controles de acceso.** Si tu sistema tiene usuarios privilegiados (por ejemplo, un propietario, controladores...) debes asegurarte de que (1) cada usuario solo pueda realizar las acciones autorizadas y (2) ningún usuario pueda bloquear acciones de un usuario más privilegiado. + + - Slither, Echidna y Manticore pueden comprobar si hay controles de acceso correctos. Por ejemplo, Slither puede comprobar que sólo las funciones de la lista blanca carecen del modificador onlyOwner. Echidna y Manticore son útiles para un control de acceso más complejo, como un permiso dado sólo si el contrato alcanza un estado determinado. + +- **Operaciones aritméticas.** Comprobar la integridad de las operaciones aritméticas es crucial. Sin embargo, usar `SafeMath` en todas partes es un buen paso para prevenir el flujo excesivo/deficiente. Debe tener en cuenta otros defectos aritméticos, incluidas las cuestiones del redondeo y de los fallos que retienen el contrato. + + - Manticore es la mejor opción en este caso. Echidna se puede usar si la aritmética está fuera del alcance del solucionador SMT. + +- **Corrección de herencia.** Los contratos de Solidity dependen en gran medida de la herencia múltiple. Errores como una función en paralelo sin llamada `super` y una orden de linearización de c3 mal interpretadas pueden cometerse fácilmente. + + - Slither es la herramienta perfecta para garantizar la detección de estos problemas. + +- **Interacciones externas.** Los contratos interactúan entre sí, y algunos contratos externos no deben ser de confianza. Por ejemplo, si su contrato se basa en oráculos externos, ¿seguirá siendo seguro si la mitad de los oráculos disponibles están en peligro? + + - Manticore y Echidna son la mejor opción para probar las interacciones externas con sus contratos. Manticore tiene un mecanismo integrado para cerrar contratos externos. + +- **Conformidad estándar.** Los estándares Ethereum (por ejemplo, ERC20) tienen un historial de defectos en su diseño. Tenga en cuenta las limitaciones del estándar sobre el que está construyendo. + - Slither, Echidna y Manticore le ayudarán a detectar desviaciones de un estándar determinado. + +### Hoja de trucos para selección de herramientas {#tool-selection-cheatsheet} + +| Componente | Herramientas | Ejemplos | +| ----------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Máquina de estado | Echidna, Manticore | | +| Control de acceso | Slither, Echidna, Manticore | [Ejercicio 2 de Slither](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/slither/exercise2.md), [Ejercicio 2 de Echidna](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/Exercise-2.md) | +| Operaciones aritméticas | Manticore, Echidna | [Ejercicio 1 de Echidna](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/Exercise-1.md), [Ejercicios 1-3 de Manticore](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | +| Corrección de herencia | Slither | [Slither ejercicio 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/slither/exercise1.md) | +| Interacciones externas | Manticore, Echidna | | +| Cumplimiento estándar | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | + +Se tendrán que revisar otras áreas dependiendo de sus objetivos, aunque estas áreas de enfoque generales son un buen comienzo para cualquier sistema de contratos inteligentes. + +Nuestras auditorías públicas contienen ejemplos de propiedades verificadas o probadas. Piense en leer las secciones de `Pruebas automáticas y verificación` de los siguientes informes para revisar las propiedades de seguridad del mundo real: + +- [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/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md new file mode 100644 index 00000000000..84f75bd493a --- /dev/null +++ b/public/content/translations/es/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -0,0 +1,1585 @@ +--- +title: 'Contrato inteligente de Hello World para principiantes: Fullstack' +description: Tutorial introductorio para redactar e implementar un contrato inteligente sencillo en Ethereum. +author: "nstrike2" +tags: + - "solidity" + - "hardhat" + - "alchemy" + - "contratos inteligentes" + - "implementación" + - "blockexplorer" + - "frontend" + - "transacciones" +skill: beginner +lang: es +published: 2021-10-25 +--- + +Si es nuevo en el desarrollo de la cadena de bloques y no sabe por dónde empezar o cómo implementar e interactuar con contratos inteligentes, esta guía está hecha a su medida. Exploraremos la creación e implementación de un contrato simple e inteligente en la red de prueba de Goerli utilizando [MetaMask](https://metamask.io), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org) y [Alchemy](https://alchemyapi.io/eth). + +Necesitará una cuenta de Alchemy para completar este tutorial. [Regístrese para obtener una cuenta gratuita](https://www.alchemy.com/). + +En cualquier momento que le surjan dudas, ¡no dude en ponerse en contacto con el canal [Discord de Alchemy](https://discord.gg/gWuC7zB). + +## Parte 1: Cree e implemente su contrato inteligente usando Hardhat {#part-1} + +### Conéctarse a la red de Ethereum {#connect-to-the-ethereum-network} + +Hay muchas maneras de hacer solicitudes a la cadena Ethereum. Para simplificar, usaremos una cuenta gratuita en Alchemy, una plataforma de desarrollo de cadena de bloques y una API que nos permite comunicarnos con la cadena Ethereum sin ejecutar un nodo nosotros mismos. Alchemy también tiene herramientas de desarrollo para el control y el análisis. Las abordaremos en este tutorial y así entenderemos los entresijos de nuestra implementación de contratos inteligentes. + +### Cómo crear su aplicación y clave de API {#create-your-app-and-api-key} + +Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API con una aplicación. Esto le permitirá hacer solicitudes a la red de pruebas de Goerli. Si no está familiarizado con las redes de prueba, puede [leer la guía de Alchemy para elegir una red](https://docs.alchemyapi.io/guides/choosing-a-network). + +En el panel de Alchemy, busque el menú desplegable **Apps** en la barra de navegación y haga clic en **Create App**. + +![Crear la aplicación Hola, mundo](./hello-world-create-app.png) + +Dele a su aplicación el nombre '_Hello World_' y escriba una breve descripción. Seleccione **Staging** como su entorno y **Goerli** como su red. + +![Crear App visualizar Hola, mundo](./create-app-view-hello-world.png) + +_Nota: asegúrate de seleccionar **Goerli**, o este tutorial no funcionará._ + +Haga clic en **Create app**. Su aplicación aparecerá en la siguiente tabla. + +### Cómo crear una cuenta en Ethereum {#create-an-ethereum-account} + +Necesita tener una cuenta de Ethereum para enviar y recibir transacciones. Utilizaremos MetaMask, una cartera virtual en el navegador que permite a los usuarios gestionar la dirección de su cuenta de Ethereum. + +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la “red de prueba Goerli” en la parte superior derecha (para no operar con dinero real). + +### Paso 4: Añadir ether de un faucet {#step-4-add-ether-from-a-faucet} + +Para implementar su contrato inteligente en la red de prueba, necesitará algunos ETH falsos. Para obtener ETH en la red Goerli, vaya a un grifo de Goerli e introduzca la dirección de su cuenta de Goerli. Observe que los grifos de Goerli pueden ser poco fiables recientemente. En la [página de prueba de redes](/developers/docs/networks/#goerli) verá un listado de opciones para probar: + +_Nota: debido a la congestión de la red, esto puede llevar un tiempo. _ `` + +### Paso 5: Comprobar su balance {#step-5-check-your-balance} + +Para volver a comprobar que hay ETH en su cartera, hagamos una solicitud [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando la herramienta de compositor de [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). Esto devolverá la cantidad de ETH a nuestra cartera. Si desea ampliar esta información, eche un vistazo al breve tutorial de [Alchemy sobre cómo usar la herramienta de compositor](https://youtu.be/r6sjRxBZJuU). + +Introduzca la dirección de su cuenta de MetaMask y haga clic en **Send request**. Verás una respuesta que se parece al fragmento de código a continuación. + +```json +{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } +``` + +> _Nota: este resultado está en wei, no en ETH. Wei se usa como la denominación más pequeña de Ether._ + +¡Fiu! Nuestro dinero de prueba está ahí sano y salvo. + +### Paso 6: Iniciar nuestro proyecto {#step-6-initialize-our-project} + +En primer lugar, tendremos que crear una carpeta para nuestro proyecto. Vaya a su línea de comandos e introduzca lo siguiente. + +``` +mkdir hello-world +cd hello-world +``` + +Ahora que estamos dentro de nuestra carpeta de proyecto, usaremos `npm init` a fin de inicializar el proyecto. + +> Si aún no tiene npm instalado, siga [estas instrucciones para instalar Node.js y npm](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm). + +Para el propósito de este tutorial, no importa cómo responda a las preguntas de inicialización. Así respondimos nosotros, a modo de referencia: + +``` +package name: (hello-world) +version: (1.0.0) +description: hello world smart contract +entry point: (index.js) +test command: +git repository: +keywords: +author: +license: (ISC) + +About to write to /Users/.../.../.../hello-world/package.json: + +{ + "name": "hello-world", + "version": "1.0.0", + "description": "hello world smart contract", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +Apruebe el package.json y listo. + +### Paso 7: Descargar Hardhat {#step-7-download-hardhat} + +Hardhat es un entorno de desarrollo para compilar, implementar, probar y depurar su software de Ethereum. Ayuda a los desarrolladores cuando crean contratos inteligentes y dApps localmente antes de la implementación en la cadena real. + +Dentro de nuestro proyecto `hello-world`, ejecute: + +``` +npm install --save-dev hardhat +``` + +Revise esta página para obtener más información acerca de las [intrucciones de instalación](https://hardhat.org/getting-started/#overview). + +### Paso 8: Crear proyecto Hardhat {#step-8-create-hardhat-project} + +Dentro de nuestra carpeta de proyectos `hello-world`, ejecute: + +``` +npx hardhat +``` + +Debería aparecer un mensaje de bienvenida y la opción de seleccionar lo que desee hacer. Seleccione «create an empty hardhat.config.js»: + +``` +888 888 888 888 888 +888 888 888 888 888 +888 888 888 888 888 +8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 +888 888 "88b 888P" d88" 888 888 "88b "88b 888 +888 888 .d888888 888 888 888 888 888 .d888888 888 +888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. +888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 + +👷 Welcome to Hardhat v2.0.11 👷‍ + +What do you want to do? … +Create a sample project +❯ Create an empty hardhat.config.js +Quit +``` + +Esto generará un archivo `hardhat.config.js` en el proyecto. Lo utilizaremos más adelante en el tutorial para especificar la configuración de nuestro proyecto. + +### Paso 9: Añadir carpetas de proyecto {#step-9-add-project-folders} + +Para mantener el proyecto organizado, vamos a crear dos carpetas nuevas. En la línea de comandos, vaya al directorio raíz de su proyecto `hello-world` y escriba: + +``` +mkdir contracts +mkdir scripts +``` + +- `contratos/` es donde mantendremos nuestro archivo de código del contrato inteligente Hola, mundo +- `scripts/` es donde mantendremos los scripts para implementar e interactuar con nuestro contrato + +### Paso 10: Escribir nuestro contrato {#step-10-write-our-contract} + +Puede que se esté preguntando que cuándo vamos a escribir el código. ¡Ahora es el momento! + +Abra el proyecto hello-world en su editor favorito. Los contratos inteligentes se suelen escribir más comunmente en Solidity, que usaremos para escribir nuestro contrato inteligente + +1. Vaya a la carpeta `contratos` y cree un nuevo archivo llamado `HelloWorld.sol` +2. A continuación se muestra un ejemplo del contrato inteligente de Hello World que usaremos para este tutorial. Copie el contenido a continuación en el archivo `HelloWorld.sol`. + +_Nota: asegúrese de leer los comentarios para entender lo que hace este contrato._ + +``` +// Especifica la versión de Solidity, utilizando la versión semántica. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity >=0.7.3; + +// Defines a contract named `HelloWorld`. +// Un contrato es una colección de funciones y datos (su estado). Una vez desplegado, un contrato reside en una dirección específica en la blockchain de Ethereum. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Emitted when update function is called + //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. + event UpdatedMessages(string oldStr, string newStr); + + // Declares a state variable `message` of type `string`. + // Las variables de estado son variables cuyos valores se almacenan permanentemente en el almacenamiento del contrato. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + string public message; + + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Los constructores se utilizan para inicializar los datos del contrato. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + message = initMessage; + } + + // A public function that accepts a string argument and updates the `message` storage variable. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Este es un contrato inteligente básico que almacena un mensaje en el momento de la creación. Se puede actualizar activando la función `update`. + +### Paso 11: Conectar MetaMask & Alchemy a su proyecto {#step-11-connect-metamask-alchemy-to-your-project} + +Hemos creado una billetera de Metamask, una cuenta de Alchemy y escrito nuestro contrato inteligente, ahora es momento de conectarlos entre sí. + +Cada transacción enviada desde su cartera requiere una firma con su clave privada única. Para proporcionar este permiso a nuestro programa, podemos almacenar de forma segura nuestra clave privada en un archivo de entorno. También almacenaremos una clave de API para Alchemy aquí. + +> Si quiere ahondar sobre el envío de transacciones, consulte [este tutorial](https://docs.alchemyapi.io/alchemy/tutorials/sending-transactions-using-web3-and-alchemy) sobre el envío de transacciones usando web3. + +Primero, instale el paquete dotenv en su directorio de proyecto: + +``` +npm install dotenv --save +``` + +A continuación, cree un archivo `.env` en el directorio raíz del proyecto. Añade tu clave privada de MetaMask y la URL de la API de HTTP Alchemy. + +Su archivo de entorno debe llamarse `.env` o no se reconocerá como un archivo de entorno. + +No lo nombre `process.env` o `.env-custom` ni nada más. + +- Siga [estas instrucciones](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) para exportar su llave privada +- Abajo se le indica cómo obtener la API URL de HTTP Alchemy + +![](./get-alchemy-api-key.gif) + +Su `.env` debería verse así: + +``` +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PRIVATE_KEY = "tu-clave privada-metamask" +``` + +Para conectarlos efectivamente a nuestro código, vincularemos estas variables en nuestro `hardhat.config.js` en el paso 13. + +### Paso 12: Instalar Ethers.js {#step-12-install-ethersjs} + +Ethers.js es una biblioteca que facilita la interacción y la realización de solicitudes a Ethereum agrupando [métodos JSON-RPC estándar](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc) con métodos más fáciles para el usuario. + +Hardhat nos permite integrar [plugins](https://hardhat.org/plugins/) para obtener herramientas adicionales y una funcionalidad ampliada. Aprovecharemos el complemento [Ethers plugin](https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html) para la implementación por contrato. + +En el directorio de su proyecto, teclee: + +```bash +npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" +``` + +### Paso 13: Actualizar hardhat.config.js {#step-13-update-hardhat.configjs} + +Hasta ahora hemos añadido varias dependencias y plugins, por lo que ahora necesitamos actualizar `hardhat.config.js` para que nuestro proyecto sepa de todas ellas. + +Actualice su `hardhat.config.js` para que muestre el siguiente texto: + +```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}`], + }, + }, +} +``` + +### Paso 14: Compilar nuestro contrato {#step-14-compile-our-contract} + +Para asegurarnos de que todo funciona correctamente hasta ahora, compilemos nuestro contrato. La función `compile` está incluida dentro de las funciones por defecto de hardhat. + +Desde la linea de comandos, ejecute: + +```bash +npx hardhat compile +``` + +Es posible que reciba una advertencia sobre el `identificador de licencia SPDX no proporcionado en el archivo de origen`, pero no hay necesidad de preocuparse por eso, ¡esperemos que todo lo demás se vea bien! Si no es así, siempre puede escribir un mensaje en [Alchemy discord](https://discord.gg/u72VCg3). + +### Paso 15: Escribir nuestro script de despliegue {#step-15-write-our-deploy-script} + +Ahora que nuestro contrato está escrito y nuestro archivo de configuración está listo, es momento de escribir nuestro script de implementación del contrato. + +Vaya a la carpeta `scripts/` y cree un nuevo archivo llamado `deploy.js`, agregando los siguientes contenidos: + +```javascript +async function main() { + const HelloWorld = await ethers.getContractFactory("HelloWorld") + + // Start deployment, returning a promise that resolves to a contract object + const hello_world = await HelloWorld.deploy("Hello World!") + console.log("Contract deployed to address:", hello_world.address) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) +``` + +Hardhat hace un trabajo increíble al explicar lo que hace cada una de estas líneas de código en su [tutorial de contratos](https://hardhat.org/tutorial/testing-contracts.html#writing-tests), aquí hemos asumido sus explicaciones. + +```javascript +const HelloWorld = await ethers.getContractFactory("HelloWorld") +``` + +Una `ContractFactory` en ethers.js es una abstracción utilizada para implementar nuevos contratos inteligentes, por lo que `HelloWorld` aquí es una [factory](https://en.wikipedia.org/wiki/Factory_(object-oriented_programming)) para las instancias de nuestro contrato de Hello World. Cuando se utiliza el complemento `hardhat-ethers` `ContractFactory` y `Contract`, las instancias se conectan al primer firmante (propietario) de forma predeterminada. + +```javascript +const hello_world = await HelloWorld.deploy() +``` + +Llamar a `deploy()` en un `ContractFactory` iniciará el despliegue y devolverá un `Promesa` que se resuelve en un objeto `Contract`. Este es el objeto que tiene un método para cada una de nuestras funciones de contrato inteligente. + +### Paso 16: Desplegar nuestro contrato {#step-16-deploy-our-contract} + +¡Por fin estamos listos para desplegar nuestro contrato inteligente! Desde la linea de comandos, ejecute: + +```bash +hardhat npx ejecuta scripts/deploy.js --network goerli +``` + +Debería mostrarse algo parecido a esto: + +```bash +Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 +``` + +**Por favor, guarde esta dirección**. Lo usaremos más adelante en el tutorial. + +Si vamos a la dirección [Ropsten etherscan](https://goerli.etherscan.io) y buscamos la dirección de nuestro contrato, podremos comprobar que se ha desplegado correctamente. El objeto de la transacción tendrá un aspecto parecido a esto: + +![](./etherscan-contract.png) + +La dirección `from` debe coincidir con la dirección de su cuenta de MetaMask y la dirección `To` dirá **Contrcat creation**. Si hacemos clic en la transacción, veremos la dirección de nuestro contrato en el campo `to`. + +![](./etherscan-transaction.png) + +¡Felicidades! Acabas de implementar un contrato inteligente en una red de pruebas de Ethereum. + +Para entender lo que está pasando internamente, vayamos a la pestaña de Explorer en nuestro [panel Alchemy](https://dashboard.alchemyapi.io/explorer). Si tienes varias aplicaciones de Alchemy, asegúrate de filtrar por aplicación y selecciona **Hello World**. + +![](./hello-world-explorer.png) + +Aquí verás un puñado de métodos JSON-RPC que Hardhat/Ethers hizo bajo el capó para nosotros cuando llamamos a la función `.deploy()`. Dos métodos importantes aquí son [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), que es la solicitud para escribir nuestro contrato en la cadena Goerli, y [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), que es una solicitud para leer información sobre nuestra transacción dado el hash. Para obtener más información sobre el envío de transacciones, consulte [nuestro tutorial sobre el envío de transacciones utilizando Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/). + +## Parte 2: Interactúa con tu contrato inteligente {#part-2-interact-with-your-smart-contract} + +Ahora que hemos implementado con éxito un contrato inteligente en la red Goerli, aprendamos a interactuar con él. + +### Crear un archivo interact.js {#create-a-interactjs-file} + +Este es el archivo donde escribiremos nuestro script de interacción. Utilizaremos la biblioteca Ethers.js que instalaste anteriormente en la Parte 1. + +Dentro de la carpeta `scripts/`, cree un nuevo archivo llamado `interact.js` y agregue el siguiente código: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS +``` + +### Actualiza tu archivo .env {#update-your-env-file} + +Utilizaremos nuevas variables de entorno, por lo que tenemos que definirlas en el archivo `.env` que [creamos anteriormente](#step-11-connect-metamask-&-alchemy-to-your-project). + +Tendremos que añadir una definición para nuestra Alchemy `API_KEY` y la `CONTRACT_ADDRESS` donde se desplegó su contrato inteligente. + +Su archivo `.env` debería tener un aspecto similar a esto: + +```bash +# .env + +API_URL = "https://eth-goerli.alchemyapi.io/v2/" +API_KEY = "" +PRIVATE_KEY = "" +CONTRACT_ADDRESS = "0x" +``` + +### Toma tu contrato ABI {#grab-your-contract-ABI} + +Nuestro contrato [ABI (Interfaz Binaria de Aplicación)](/glossary/#abi) es la interfaz para interactuar con nuestro contrato inteligente. Hardhat genera automáticamente un ABI y lo guarda en `HelloWorld.json`. Para usar el ABI, tendremos que analizar el contenido añadiendo las siguientes líneas de código a nuestro archivo `interact.js`: + +```javascript +// interact.js +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") +``` + +Si quiere ver la ABI puede hacerlo en su propia consola: + +```javascript +console.log(JSON.stringify(contract.abi)) +``` + +Para ver su ABI impreso en la consola, vaya a su terminal y ejecute: + +```bash +npx hardhat run scripts/interact.js +``` + +### Crea una instancia de tu contrato {#create-an-instance-of-your-contract} + +Para interactuar con nuestro contrato, necesitamos crear una instancia de contrato en nuestro código. Para hacerlo con Ethers.js, tendremos que trabajar con tres conceptos: + +1. Proveedor: un proveedor de nodos que te da acceso de lectura y escritura a la cadena de bloques +2. Firmante - representa una cuenta de Ethereum que puede firmar transacciones +3. Contrato: un objeto Ethers.js que representa un contrato específico desplegado en cadena + +Utilizaremos el contrato ABI del paso anterior para crear nuestra instancia del contrato: + +```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 +) +``` + +Obtenga más información sobre proveedores, firmantes y contratos en la documentación de [ethers.js](https://docs.ethers.io/v5/). + +### Lee el mensaje de inicio {#read-the-init-message} + +Recuerda cuando implementamos nuestro contrato con el `initMessage = "¡Hola mundo!" `? Ahora vamos a leer ese mensaje almacenado en nuestro contrato inteligente e imprimirlo en la consola. + +En JavaScript, las funciones asíncronas se utilizan al interactuar con las redes. Para obtener más información sobre las funciones asíncronas, [lea este artículo de medium](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff). + +Utilice el siguiente código para llamar a la función `mensaje` en nuestro contrato inteligente y leer el mensaje de inicio: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) +} +main() +``` + +Después de ejecutar el archivo usando `npx hardhat run scripts/interact.js` en la terminal, deberíamos ver esta respuesta: + +``` +The message is: Hello world! +``` + +¡Felicidades! Acaba de leer con éxito los datos de los contratos inteligentes de la cadena de bloques de Ethereum, ¡así se hace! + +### Actualizar el mensaje {#update-the-message} + +En lugar de solo leer el mensaje, ¡también podemos actualizar el mensaje guardado en nuestro contrato inteligente utilizando la función `update`! Muy chido, ¿verdad? + +Para actualizar el mensaje, podemos llamar directamente a la función `update` en nuestro objeto Contract instanciado: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("This is the new message.") + await tx.wait() +} +main() +``` + +Tenga en cuenta que en la línea 11, hacemos una llamada a `.wait()` en el objeto de transacción devuelto. Esto garantiza que nuestro script espere a que la transacción se mine en la cadena de bloques antes de salir de la función. Si la llamada `.wait()` no está incluida, es posible que el script no vea el valor `message` actualizado en el contrato. + +### Lee el nuevo mensaje {#read-the-new-message} + +Deberías poder repetir el [paso anterior](#read-the-init-message) para leer el valor actualizado del `mensaje`. ¡Tómese un momento y vea si puede hacer los cambios necesarios para imprimir ese nuevo valor! + +Si necesitas una pista, así es como debería ser tu archivo `interact.js` en este momento: + +```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 - you +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// contract instance +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("this is the new message") + await tx.wait() + + const newMessage = await helloWorldContract.message() + console.log("The new message is: " + newMessage) +} + +main() +``` + +¡Ahora solo ejecuta el script y deberías poder ver el mensaje antiguo, el estado de la actualización y el nuevo mensaje impreso en tu terminal! + +`hardhat npx ejecuta scripts/interact.js --network goerli` + +``` +The message is: Hello World! +Updating the message... +The new message is: This is the new message. +``` + +Mientras ejecuta ese script, puede notar que el paso `Actualice el mensaje...` tarda un tiempo en cargarse antes de que se cargue el nuevo mensaje. Eso se debe al proceso de minería; si tiene curiosidad sobre el seguimiento de las transacciones mientras se están minando, visite el [mempool de Alchemy](https://dashboard.alchemyapi.io/mempool) para ver el estado de una transacción. Si se elimina la transacción, también es útil comprobar [Goerli Etherscan](https://goerli.etherscan.io) y buscar el hash de su transacción. + +## Parte 3: Publica tu contrato inteligente en Etherscan {#part-3-publish-your-smart-contract-to-etherscan} + +Hiciste todo el trabajo duro para dar vida a tu contrato inteligente; ¡ahora es el momento de compartirlo con el mundo! + +Al verificar su contrato inteligente en Etherscan, cualquiera puede ver su código fuente e interactuar con su contrato inteligente. ¡Empecemos! + +### Paso 1: Genera una clave API en tu cuenta de Etherscan {#step-1-generate-an-api-key-on-your-etherscan-account} + +Se necesita una clave API de Etherscan para verificar que es el propietario del contrato inteligente que está intentando publicar. + +Si aún no tienes una cuenta de Etherscan, [regístrate para obtener una cuenta](https://etherscan.io/register). + +Una vez que haya iniciado sesión, busque su nombre de usuario en la barra de navegación, pase el cursor sobre él y seleccione el botón **Mi perfil**. + +En tu página de perfil, deberías ver una barra de navegación lateral. En la barra de navegación lateral, seleccione **Teclas API**. A continuación, presione el botón "Añadir" para crear una nueva clave de API, nombre su aplicación **hello-world**y presione el botón **Crear nueva clave de API**. + +Su nueva clave de API debería aparecer en la tabla de claves de API. Copia la clave de la API en tu portapapeles. + +A continuación, tenemos que añadir la clave de la API de Etherscan a nuestro archivo `.env`. + +Después de añadirlo, tu archivo `.env` debería verse así: + +```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" +``` + +### Contratos inteligentes desplegados por Hardhat {#hardhat-deployed-smart-contracts} + +#### Instalar hardhat-etherscan {#install-hardhat-etherscan} + +Publicar su contrato en Etherscan usando Hardhat es sencillo. Primero tendrás que instalar el complemento `hardhat-etherscan` para empezar. `hardhat-etherscan` verificará automáticamente el código fuente del contrato inteligente y el ABI en Etherscan. Para añadir esto, en el directorio `hello-world` se ejecuta: + +```text +npm install --save-dev @nomiclabs/hardhat-etherscan +``` + +Una vez instalado, incluya la siguiente declaración en la parte superior de su `hardhat.config.js`, y agregue las opciones de configuración de Etherscan: + +```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: { + // Your API key for Etherscan + // Obtain one at https://etherscan.io/ + apiKey: ETHERSCAN_API_KEY, + }, +} +``` + +#### Verifique su contrato inteligente en Etherscan {#verify-your-smart-contract-on-etherscan} + +Asegúrese de que todos los archivos estén guardados y de que todas las variables `.env` estén configuradas correctamente. + +Ejecute la tarea `verificar`, pasando la dirección del contrato y la red a donde está desplegada: + +```text +npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!' +``` + +Asegúrese de que `DEPLOYED_CONTRACT_ADDRESS` sea la dirección de su contrato inteligente implementado en la red de pruebas de Goerli. Además, el argumento final (`'¡Hola mundo!' `) debe ser el mismo valor de cadena utilizado [durante el paso de despliegue en la parte 1](#write-our-deploy-script). + +Si todo va bien, verás el siguiente mensaje en tu terminal: + +```text +Successfully submitted source code for contract +contracts/HelloWorld.sol:HelloWorld at 0xdeployed-contract-address +for verification on Etherscan. Waiting for verification result... + + +Successfully verified contract HelloWorld on Etherscan. +https://goerli.etherscan.io/address/#contracts +``` + +¡Felicidades! ¡Tu código de contrato inteligente está en Etherescan! + +### ¡Echa un vistazo a tu contrato inteligente en Etherscan! {#check-out-your-smart-contract-on-etherscan} + +Cuando navegue al enlace proporcionado en su terminal, ¡debería poder ver su código de contrato inteligente y ABI publicado en Etherscan! + +**Wahooo - ¡lo hiciste campeón! ¡Ahora cualquiera puede llamar o escribir a tu contrato inteligente! ¡Estamos deseando ver lo que construyes a continuación!** + +## Parte 4 - Integración de su contrato inteligente con la interfaz {#part-4-integrating-your-smart-contract-with-the-frontend} + +Al final de este tutorial, sabrás cómo: + +- Conecta una cartera MetaMask a tu dapp +- Leer los datos de su contrato inteligente utilizando la API [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) +- Firmar transacciones de Ethereum usando MetaMask + +Para este dapp, usaremos [React](https://reactjs.org/) como nuestro marco de interfaz; sin embargo, es importante tener en cuenta que no pasaremos mucho tiempo desglosando sus fundamentos, ya que nos centraremos principalmente en llevar la funcionalidad Web3 a nuestro proyecto. + +Como requisito previo, debes tener una comprensión de React a nivel principiante. Si no, recomendamos completar el tutorial oficial [Introducción a React](https://reactjs.org/tutorial/tutorial.html). + +### Clone los archivos de inicio {#clone-the-starter-files} + +Primero, vaya al [hello-world-part-four repositorio de GitHub](https://github.com/alchemyplatform/hello-world-part-four-tutorial) para obtener los archivos de inicio de este proyecto y clonar este repositorio en su máquina local. + +Abra el repositorio clonado localmente. Tenga en cuenta que contiene dos carpetas: `archivos de inicio` y `completado`. + +- `archivos de inicio`- **estaremos trabajando en este directorio**, conectaremos la interfaz de usuario a su billetera Ethereum y al contrato inteligente que publicamos en Etherscan en [Parte 3](#part-3). +- `completed`Contiene todo el tutorial completado y solo debe usarse como referencia si te quedas atascado. + +A continuación, abra su copia de `starter-files` en su editor de código favorito y luego navegue hasta la carpeta `src`. + +Todo el código que escribiremos permanecerá en la carpeta `src`. Editaremos el componente `HelloWorld.js` y los archivos JavaScript `util/interact.js` para dar a nuestro proyecto la funcionalidad Web3. + +### Echa un vistazo a los archivos iniciales {#check-out-the-starter-files} + +Antes de empezar a codificar, exploremos lo que se nos proporciona en los archivos de inicio. + +#### Ejecute su proyecto de react {#get-your-react-project-running} + +Comencemos por ejecutar el proyecto React en nuestro navegador. La belleza de React es que, una vez que tenemos nuestro proyecto corriendo en el navegador, cualquier cambio que guardemos será actualizado en vivo en el navegador. + +Para ejecutar el proyecto, navegue hasta el directorio raíz de la carpeta `starter-files`, y ejecute `npm install` en su terminal para instalar las dependencias del proyecto: + +```bash +cd starter-files +npm install +``` + +Una vez que hayan terminado de instalarse, ejecute `npm start` en su terminal: + +```bash +npm start +``` + +Al hacerlo, debería abrir [http://localhost:3000/](http://localhost:3000/) en su navegador, donde verá la interfaz de nuestro proyecto. Debe consistir en un campo \(un lugar para actualizar el mensaje almacenado en su contrato inteligente\), un botón "Conectar cartera" y un botón "Actualizar". + +Si intentas hacer clic en cualquiera de los botones, te darás cuenta de que no funcionan, eso es porque todavía tenemos que programar su funcionalidad. + +#### El componente `HelloWorld.js` {#the-helloworld-js-component} + +Volvamos a la carpeta `src` de nuestro editor y abramos el archivo `HelloWorld.js`. Es muy importante que entendamos todo en este archivo, ya que es el componente principal en React en el que trabajaremos. + +En la parte superior de este archivo, notará que tenemos varias declaraciones de importación que son necesarias para que nuestro proyecto se ejecute, incluida la biblioteca React, los ganchos useEffect y useState, algunos elementos del `./util/interact.js` (¡los describiremos con más detalle pronto!), y el logotipo de Alchemy. + +```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" +``` + +A continuación, tenemos nuestras variables de estado que actualizaremos después de eventos específicos. + +```javascript +// HelloWorld.js + +//State variables +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [message, setMessage] = useState("No connection to the network.") +const [newMessage, setNewMessage] = useState("") +``` + +Esto es lo que representa cada una de las variables: + +- `walletAddress`: cadena que almacena la dirección de la billetera del usuario +- `status`- una cadena que almacena un mensaje útil que guía al usuario sobre cómo interactuar con el dapp +- `mensaje` - una cadena que almacena el mensaje actual en el contrato inteligente +- `newMessage` - una cadena que almacena el nuevo mensaje que se escribirá en el contrato inteligente + +Después de las variables de estado, verá cinco funciones no implementadas: `useEffect` ,`addSmartContractListener`, `addWalletListener` , `connectWalletPressed` y `onUpdatePressed`. Explicaremos lo que hacen a continuación: + +```javascript +// HelloWorld.js + +//called only once +useEffect(async () => { + //TODO: implement +}, []) + +function addSmartContractListener() { + //TODO: implement +} + +function addWalletListener() { + //TODO: implement +} + +const connectWalletPressed = async () => { + //TODO: implement +} + +const onUpdatePressed = async () => { + //TODO: implement +} +``` + +- [`useEffect`](https://reactjs.org/docs/hooks-effect.html)- este es un gancho de React que se llama después de renderizar su componente. Debido a que tiene una matriz vacía `[]` prop pasada a ella \(ver línea 4\), solo se llamará en el _primer_ renderizado del componente. Aquí cargaremos el mensaje actual almacenado en nuestro contrato inteligente, llamaremos a nuestros oyentes de contrato inteligente y billetera, y actualizaremos nuestra interfaz de usuario para reflejar si una billetera ya está conectada. +- `addSmartContractListener`- esta función configura un oyente que vigilará el evento `UpdatedMessages` de nuestro contrato de HelloWorld y actualizará nuestra interfaz de usuario cuando se cambie el mensaje en nuestro contrato inteligente. +- `addWalletListener`- esta función configura un oyente que detecta cambios en el estado de la cartera MetaMask del usuario, como cuando el usuario desconecta su cartera o cambia de dirección. +- `connectWalletPressed`- esta función se llamará para conectar la cartera MetaMask del usuario a nuestra dapp. +- `onUpdatePressed` - esta función se llamará cuando el usuario quiera actualizar el mensaje almacenado en el contrato inteligente. + +Cerca del final de este archivo, tenemos la interfaz de usuario de nuestro componente. + +```javascript +// HelloWorld.js + +//the UI of our component +return ( +
    + + + +

    Current Message:

    +

    {message}

    + +

    New Message:

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

    {status}

    + + +
    +
    +) +``` + +Si escaneas este código con cuidado, te darás cuenta de dónde usamos nuestras diversas variables de estado en nuestra interfaz de usuario: + +- En las líneas 6-12, si la billetera del usuario está conectada \(es decir, `walletAddress.length > 0`\), mostramos una versión truncada del usuario `walletAddress` en el botón con el ID "walletButton;", de lo contrario, simplemente dice "Connect Wallet". +- En la línea 17, mostramos el mensaje actual almacenado en el contrato inteligente, que se captura en la cadena `message`. +- En las líneas 23-26, utilizamos un [componente controlado](https://reactjs.org/docs/forms.html#controlled-components) para actualizar nuestra variable de estado `newMessage` cuando cambia la entrada en el campo de texto. + +Además de nuestras variables de estado, también verá que las funciones `connectWalletPressed` y `onUpdatePressed` se llaman cuando se hace clic en los botones con los ID `publishButton` y `walletButton` respectivamente. + +Por último, abordemos dónde se ha añadido este componente `HelloWorld.js`. + +Si va al archivo `App.js`, que es el componente principal de React que actúa como contenedor para todos los demás componentes, verá que nuestro componente `HelloWorld.js` se inyecta en la línea 7. + +Por último, pero no menos importante, echemos un vistazo a un archivo más proporcionado para usted, el archivo `interact.js`. + +#### El archivo `interact.js` {#the-interact-js-file} + +Debido a que queremos prescribir el paradigma [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), querremos un archivo separado que contenga todas nuestras funciones para administrar la lógica, los datos y las reglas de nuestro dapp, y luego poder exportar esas funciones a nuestro frontend \(nuestro componente `HelloWorld.js`\). + +👆🏽¡Este es el propósito exacto de nuestro archivo `interact.js`! + +Vaya a la carpeta `util` en su directorio `src`, y se dará cuenta de que hemos incluido un archivo llamado `interact.js` que contendrá todas nuestras funciones y variables de interacción de contratos inteligentes y cartera. + +```javascript +// interact.js + +//export const helloWorldContract; + +export const loadCurrentMessage = async () => {} + +export const connectWallet = async () => {} + +const getCurrentWalletConnected = async () => {} + +export const updateMessage = async (message) => {} +``` + +Notará en la parte superior del archivo que hemos comentado el objeto `helloWorldContract`. Más adelante en este tutorial, dejaremos de comentar este objeto e instanciaremos nuestro contrato inteligente en esta variable, que luego exportaremos a nuestro componente `HelloWorld.js`. + +Las cuatro funciones no implementadas después de nuestro objeto `helloWorldContract` hacen lo siguiente: + +- `loadCurrentMessage` - esta función maneja la lógica de cargar el mensaje actual almacenado en el contrato inteligente. Hará una llamada _read_ al contrato inteligente de Hello World utilizando la [API de Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3). +- `connectWallet` - esta función conectará el MetaMask del usuario a nuestra dapp. +- `getCurrentWalletConnected` - esta función comprobará si una cuenta de Ethereum ya está conectada a nuestra dapp al cargar la página y actualizará nuestra interfaz de usuario en consecuencia. +- `updateMessage` - esta función actualizará el mensaje almacenado en el contrato inteligente. Hará una llamada _write_ al contrato inteligente de Hello World, por lo que la cartera de MetaMask del usuario tendrá que firmar una transacción de Ethereum para actualizar el mensaje. + +Ahora que entendemos con qué estamos trabajando, ¡vamos a averiguar cómo leer de nuestro contrato inteligente! + +### Paso 3: Lea de su contrato inteligente {#step-3-read-from-your-smart-contract} + +Para leer de su contrato inteligente, tendrá que configurar con éxito: + +- Una conexión API a la cadena Ethereum +- Una instancia cargada de su contrato inteligente +- Una función para llamar a su función de contrato inteligente +- Un oyente para estar atento a las actualizaciones cuando cambien los datos que esté leyendo del contrato inteligente + +Parecen demasiados pasos, ¡pero no te preocupes! ¡Te indicaremos como realizar cada uno de ellos paso a paso! :\) + +#### Establecer una conexión API con la cadena Ethereum {#establish-an-api-connection-to-the-ethereum-chain} + +Recuerdas cómo en el apartado 2 de este tutorial, utilizamos nuestra [llave de Alchemy Web3 para leer desde nuestro contrato inteligente](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)? También necesitaras una llave de Alchemy Web3 en tu dapp para leer de la cadena de bloques. + +Si aún no lo tienes, instala primero [Alchemy](https://github.com/alchemyplatform/alchemy-web3) ingresando al directorio de raíz de `starter-files` y ejecutando el siguiente código en tu terminal: + +```text +npm install @alch/alchemy-web3 +``` + +[ Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) está construido sobre [Web3](https://docs.web3js.org/), de esta manera proporciona metodos mejorados de la API y otros beneficios importantes para que tu vida como desarrollador de Web3 sea mucho más fácil. Se diseñó para requerir una configuración mínima, por lo que puede comenzar a usarla en su aplicación de inmediato. + +Luego, instala la librería [dotenv](https://www.npmjs.com/package/dotenv) en tu directorio de proyectos, así tendremos un lugar seguro para almancenar nuestra clave de la API una vez que lo obtengamos. + +```text +npm install dotenv --save +``` + +Para nuestra dapp, ** utilizaremos nuestra clave para la API de Websockets ** en lugar de nuestra clave para la API HTTP, ya que nos permitirá configurar un listener que detectará cuando el mensaje guardado en el contrato inteligente cambie. + +Una vez que tengas la clave de la API, crea un archivo `.env` en tu directorio de raíz y agregale tu url de Alchemy Websockets. Acontinuación, tu archivo `.env` debería verse así: + +```javascript +REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/ +``` + +¡Estamos listos para poner en marcha nuestra Alchemy Web3 endpoint en nuestra dapp! Volvamos de nuevo a nuestro `interact.js`, que se encuentra anidada dentro de nuestro archivo `util` y agrega el siguiente código al comienzo del archivo: + +```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; +``` + +Primero importamos la clave Alchemy de nuestro archivo `.env` y luego pasamos nuestro `alchemyKey` a `createAlchemyWeb3` para establecer nuestra Alchemy Web3 endpoint. + +Una vez listo el endpoint, ¡es momento de cargar nuestro Contrato inteligente! + +#### Carga de tu Contrato inteligente Hello World {#loading-your-hello-world-smart-contract} + +Para cargar tu Contrato inteligente Hello World, necesitaras la dirección del contrato y ABI, puedes encontrar ambos en Etherscan si has completado previamente [ la parte 3 de este tutorial.](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan) + +#### Cómo obtener tu contrato ABI de Etherscan {#how-to-get-your-contract-abi-from-etherscan} + +Si omitiste la parte 3 de este tutorial, puedes utilizar el contrato Hello World con dirección [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). Puedes encontrar su ABI [aquí](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code). + +Se necesita un contrato ABI para especificar qué función utilizará un contrato y para asegurar que la función devolverá datos en el formato esperado. Una vez que hayamos copiado nuestro contrato ABI, lo guardaremos como un archivo JSON que se llamará `contract-abi.json` en tu directorio `src`. + +Tu contrato -abi.json deberá ser guardado en tu carpeta src. + +Con la dirección de nuestro contrato ABI y AlchemyWeb3 endpoint, podemos utilizar el [contract method](https://docs.web3js.org/api/web3-eth-contract/class/Contract) para cargar una instancia de nuestro Contrato inteligente. Importa tu contrato ABI dentro del archivo `interact.js` y agrega la direción de tu contratro. + +```javascript +// interact.js + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" +``` + +Ahora podemos suprimir comentario de nuestra variable `helloWorldContract`, y cargar el contrato inteligente utilizando nuestro AlchemyWeb3 endpoint: + +```javascript +// interact.js +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +A modo de repaso, las primeras 12 lineas de tu `interact.js` ahora deberían verse así: + +```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 +) +``` + +Ahora que tenemos cargado nuestro contrato, ¡podemos implementar nuestra función `loadCurrentMessage`! + +#### Implementación de `loadCurrentMessage` en tu archivo `interact.js` {#implementing-loadCurrentMessage-in-your-interact-js-file} + +Esta función es muy sencilla. Haremos una simple llamada async Web3 para así leer de nuestro contrato. Nuestra función devolverá el mensaje almacenado en el contrato inteligente: + +Actualiza el `loadCurrentMessage` en tu archivo `interact.js` de la siguiente manera: + +```javascript +// interact.js + +export const loadCurrentMessage = async () => { + const message = await helloWorldContract.methods.message().call() + return message +} +``` + +Dado que queremos mostrar este contrato inteligente en nuestra UI, actualizemos la función `useEffect` en nuestro componente `HelloWorld.js` de la siguiente manera: + +```javascript +// HelloWorld.js + +//called only once +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) +}, []) +``` + +Recuerda, solo queremos que nuestro `loadCurrentMessage` sea llamado una sola vez durante la primera renderización del componente. Pronto implementaremos `addSmartContractListener` para que actualice automáticamente la UI cada vez que cambie el mensaje en el contrato inteligente. + +Antes de profundizar sobre nuestro listener, ¡revisemos lo que tenemos hasta ahora! Guarda tus archivos `HelloWorld.js` y `interact.js` y luego ve a [http://localhost:3000/](http://localhost:3000/) + +Notaras que el mensaje actual ya no dice "Sin conexión a la red". En su lugar reflejará el mensaje almacenado en el contrato inteligente. ¡Fantástico! + +#### Ahora, tu UI debería reflejar el mensaje almacenado en el contrato inteligente {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract} + +Hablando del listener... + +#### Implementa `addSmartContractListener` {#implement-addsmartcontractlistener} + +Si haces memoria, en el archivo `HelloWorld.sol` que redactamos en [ la parte 1 de esta serie de tutoriales](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract), recordaras que existe un evento de contrato inteligente que se llama `UpdatedMessages` y que se emite una vez que la función `update` es utilizada \(ver lineas 9 y 27\): + +```javascript +// HelloWorld.sol + +// Specifies the version of Solidity, using semantic versioning. +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.3; + +// Defines a contract named `HelloWorld`. +// Un contrato es una colección de funciones y datos (su estado). Una vez desplegado, un contrato reside en una dirección específica en la blockchain de Ethereum. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //Emitted when update function is called + //Smart contract events are a way for your contract to communicate that something happened on the blockchain to your app front-end, which can be 'listening' for certain events and take action when they happen. + event UpdatedMessages(string oldStr, string newStr); + + // Declares a state variable `message` of type `string`. + // Las variables de estado son variables cuyos valores se almacenan permanentemente en el almacenamiento del contrato. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. + string public message; + + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Los constructores se utilizan para inicializar los datos del contrato. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). + message = initMessage; + } + + // A public function that accepts a string argument and updates the `message` storage variable. + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +Los eventos del contrato inteligente son una forma de comunicar que ha pasado algo \(es decir, hubo un _event_\) en la blockchain que repercutió en tu aplicación front-end. Podría tratarse de un 'listening' para eventos específicos y , al mismo tiempo, sobre las medidas de acción a implementar cuando ocurren. + +La función `addSmartContractListener` prestará atención a nuestro evento de contrato inteligente Hello World `UpdatedMessages`, y actualizará nuestro UI para que muestre el nuevo mensaje. + +Modifica `addSmartContractListener` de la siguiente manera: + +```javascript +// HelloWorld.js + +function addSmartContractListener() { + helloWorldContract.events.UpdatedMessages({}, (error, data) => { + if (error) { + setStatus("😥 " + error.message) + } else { + setMessage(data.returnValues[1]) + setNewMessage("") + setStatus("🎉 Your message has been updated!") + } + }) +} +``` + +Desmenucemos lo que pasa cuando el listener detecta un evento: + +- Si ocurre un error al momento de emitir el evento, este se verá reflejado en la UI a través de nuestra variable de estado `status`. +- Caso contrario, utilizaremos el objeto devuelto `data`. `data.returnValues` es un arreglo indexado a cero donde el primer elemento almancena el mensaje anterior, mientras que el segundo elemento almacena el mensaje actualizado. En conjunto, en un evento eficaz colocaremos nuestro string `message` al mensaje actualizado, resetearemos el string `newMessage`, y actualizaremos nuestra variable de estado `status` para que refleje que un nuevo mensaje se ha publicado en nuestro contrato inteligente. + +Por último, ejecutemos nuestro listener en nuestra función `useEffect` para que se inicialize en la primera devolución del componente `HelloWorld.js`. Entonces, tu función `useEffect` debería verse así: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() +}, []) +``` + +Ahora que podemos leer de nuestro contrato inteligente, también ¡sería genial descifrar cómo podemos escribirlo! Sin embargo, para escribir en nuestra dapp, primero debemos tener una wallet de Ethereum conectada a la misma. + +Por lo tanto, la próxima cuestión que abordaremos será crear nuestra wallet de Ethereum \(MetaMask\) para luego conectarla con nuestra dapp. + +### Paso 4: Crea tu wallet de Ethereum {#step-4-set-up-your-ethereum-wallet} + +Para poder escribir en la chain de Ethereum, los usuarios deben firmar las transacciones utilizando la clave privada de su wallet virtual. Para este tutorial, utilizaremos [MetaMask](https://metamask.io/), una billetera virtual en el browser que se utiliza para administrar la dirección de tu cuenta de Ethereum, ya que hace que la firma de esta transacción sea bastante simple para el usuario final. + +Si quiere más información sobre cómo funcionan las transacciones en Ethereum, eche un vistazo a [esta página](/developers/docs/transactions/) de Ethereum Foundation. + +#### Descargar MetaMask {#download-metamask} + +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando estes creando una cuenta, o si ya tienes una, asegurate de cambiar de “Goerli Test Network” en la parte superior \(para que no se trate de dinero real\). + +#### Añada ether a partir de un grifo {#add-ether-from-a-faucet} + +Necesitaremos algunos Eth falsos para poder firmar una transacción en la blockchain de Ethereum. Para obtener Eth puedes ir a [FaucETH](https://fauceth.komputing.org) e ingresar la direcciíon de tu cuenta Goerli, haz click en “Request funds”, luego selecciona “Ethereum Testnet Goerli” y por último, haz click en el botón “Request funds” nuevamente. Debería ver el Eth en su cuenta de MetaMask poco después. + +#### Revisa tu saldo {#check-your-balance} + +Para verificar que nuestro saldo esté ahí, realicemos una solicitud [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando la [herramienta de compositor de 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). Esto devolverá la cantidad de Eth en nuestra billetera. Después de introducir la dirección de su cuenta de Metamask y hacer clic en «Send Request» (Enviar Solicitud), debería ver una respuesta como esta: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**NOTA:** Este resultado esta en wei, no en eth. Wei se usa como la denominación más pequeña de Ether. La conversión de wei a eth es: 1 eth = 10¹⁸ wei. Entonces si convertimos 0xde0b6b3a7640000 a decimal, obtenemos 1\*10¹⁸, que equivale a 1 eth. + +¡Fiu! Nuestro dinero de prueba está ahí sin problemas. 🤑 + +### Paso 5: Conectate a tu UI en MetaMask {#step-5-connect-metamask-to-your-UI} + +Ahora que nuestra billetera de MetaMask está configurada, vamos a conectar nuestra dapp a ella. + +#### Función `connectWallet` {#the-connectWallet-function} + +En nuestro archivo `interact.js`, implementaremos la función `connectWallet`, el cual podremos ejecutar en nuestro componente `HelloWorld.js` posteriormente. + +Procedamos a modificar `connectWallet` como se muestra a continuación: + +```javascript +// interact.js + +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Write a message in the text-field above.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

    +
    + ), + } + } +} +``` + +Entonces ¿Qué hace exactamente este extenso código? + +Bueno, en primer lugar, verifica que `window.ethereum` este habilitado en tu navegador. + +`window.ethereum` es una API global inyectada por MetaMask y otros proveedores de billeteras que permite a los sitios web solicitar las cuentas de Ethereum de los usuarios. Si es aprobado, puede leer información de la blockchain a la que está conectado el usuario y sugerir que este firme mensajes y transacciones. Revise la [documentación de MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) para obtener más información. + +Si `window.ethereum` _no está_ presente, eso significa que MetaMask no está instalado. Esto resulta en la devolución de un objeto JSON, donde el `address` devuelto es una cadena vacía y el objeto JSX `status` muestra que el usuario debe instalar MetaMask. + +Ahora, si `window.ethereum` _está_ presente, las cosas se ponen interesantes. + +Al utilizar un try/catch loop, intentaremos conectarnos a MetaMask ejecutando + +window.ethereum.request({ method: "eth_requestAccounts" });. La invocación de esta función abrirá MetaMask en el navegador, donde se le solicitará al usuario conectar su billetera a su dapp. + +- Si el usuario decide conectarse, `method: "eth_requestAccounts"` devolverá un arreglo que contiene todas las direcciones de cuenta del usuario que se conectaron a la dapp. De igual manera, nuestra función `connectWallet` devolverá un objeto JSON que contine la _primera_ `address` de este arreglo \(ver la línea 9\) y un mensaje de `status` que solicita al usuario escribir un mensaje al contrato inteligente. +- Si el usuario rechaza la conexión, el objeto JSON tendrá una cadena vacía para la `address` devuelta y un mensaje de `status` donde se refleje que el usuario rechazó la conexión. + +Una vez escrita la función `connectWallet`, el siguiente paso es ejecutarlo en nuestro componente `HelloWorld.js`. + + + +#### Agrega la función `connectWallet` a tu componente de UI `HelloWorld.js` {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component} + +Dirígitete a la función `onnectWalletPressed` en `HelloWorld.js`, y actualizalo de la siguiente manera: + + + +```javascript +// HelloWorld.js + +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + + +¿Notas como gran parte de nuestra funcionalidad se abstrae de nuestro componente `HelloWorld.js` del archivo `interact.js`? ¡Esto es así para cumplir con el paradigma M-V-C! + +En `connectWalletPressed`, simplemente hacemos una llamada en espera a nuestra función `conectWallet` importada y, utilizando su respuesta, actualizamos nuestras variables `status` y `walletAddress` a través de sus hooks de estado. + +Guardemos ambos archivos \(`HelloWorld.js` and `interact.js`\) y probemos nuestra UI. + +Abre tu navegador con el link [http://localhost:3000/](http://localhost:3000/), y presiona el botón "Conectar Wallet" en el margen superior derecho de la página. + +Si tiene MetaMask instalado, se le debería solicitar conectar su billetera a su dapp. Acepte la invitación para establecer la conexión. + +Deberías poder visualizar que, ahora, el botón de wallet muestra que tu dirección está conectada. ¡Fantástico! + +A continuación, pruebe actualizar la página... esto es extraño. Nuestro botón de billetera nos está solicitando conectar MetaMask, aunque ya está conectado... + +¡No tengas miedo! Podemos solucionarlo facilmente, implementando `getCurrentWalletConnected` (¿entiendes?). Esto verificará si ya existe una dirección conectada a nuestra dapp y, en consecuencia, actualizará nuestra UI. + + + +#### Función `getCurrentWalletConnected` {#the-getcurrentwalletconnected-function} + +Actualiza tu función `getCurrentWalletConnected` en el archivo `interact.js` como se muestra a continuación: + + + +```javascript +// interact.js + +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 Write a message in the text-field above.", + } + } else { + return { + address: "", + status: "🦊 Connect to MetaMask using the top right button.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

    +
    + ), + } + } +} +``` + + +Este código es _bastante_ similar a la función `connectWallet` que escribimos en el paso anterior. + +La principal diferencia es que, en vez de llamar al método `eth_requestAccount`, que abre MetaMask para que el usuario conecte su billetera, aquí llamamos al método `eth_accounts`, que simplemente devuelve un arreglo que contiene las direcciones de MetaMask que se encuentran conectadas a nuestra dapp. + +Para ver esta función, lo podemos ejecutar en nuestra función `useEffect` de nuestro componente `HelloWorld.js`: + + + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + + +Note que usamos la respuesta de nuestra llamada a `getCurrentWalletConnected` para actualizar nuestras variables de estado `walletAddress` y `status`. + +Una vez que agregues este código, refrescaremos la ventana de nuestro navegador. + +¡Magnífico! El botón debería decir que está conectado y mostrar una vista previa de la dirección de su billetera conectada, incluso después de actualizar la página. + + + +#### Implementa `addWalletListener` {#implement-addwalletlistener} + +El último paso en la configuración de la billetera de dapp es implementar el oyente de billetera para que nuestra interfaz se actualice cuando el estado de la billetera cambie, por ejemplo, cuando el usuario se desconecte o cambie de cuenta. + +En tu archivo `HelloWorld.js`, modifica tu función `addWalletListener` como se ve a continuación: + + + +```javascript +// HelloWorld.js + +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Write a message in the text-field above.") + } else { + setWallet("") + setStatus("🦊 Connect to MetaMask using the top right button.") + } + }) + } else { + setStatus( +

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

    + ) + } +} +``` + + +En este punto, apuesto a que ni siquiera necesitas de nuestra ayuda para entender lo que ocurre. Pero, para ser más exhaustivos, desglosémoslo rápidamente: + +- Primero, nuestra función verifica si `window.ethereum` está habilitado \(esto es si MetaMask está instalado\). + - Si no lo está, simplemente establecemos nuestra variable de estado `status` a una cadena JSX que solicite al usuario instalar MetaMask. + - Si está habilitado, configuramos el oyente `window.ethereum.on("accountsChanged")` en la línea 3, que escucha cambios de estado en la billetera de MetaMask, incluyendo cuando el usuario conecte una cuenta adicional a la dapp, cambie de cuenta o desconecte una cuenta. Si hay por lo menos una cuenta conectada, la variable de estado `walletAddress` es actualizada como la primera cuenta en el arreglo `accounts` devuelto por el oyente. De lo contrario, `walletAddress` se establece como cadena vacía. + +Por último, debemos ejecutarlo en nuestra función `useEffect`: + + + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + + +¡Y eso es todo! Hemos terminado de programar toda la funcionalidad de nuestra wallet exitosamente! Nuestra última tarea es actualizar el mensaje almacenado en nuestro contrato inteligente. + + + +### Paso 6: Implementa la función `updateMessage` {#step-6-implement-the-updateMessage-function} + +¡Hemos legado final! En el `updateMessage` de tu archivo `interact.js`, haremos lo siguiente: + +1. Asegurate de que el mensaje que deseas publicar en nuestro contrato inteligente sea válido +2. Firmamos la transacción utilizando MetaMask +3. Ejecuta esta función desde nuestro componente frontend `HelloWorld.js` + +No nos llevará mucho ¡terminemos esta dapp! + + + +#### Manejo de errores de entrada {#input-error-handling} + +Tiene sentido tener algún chequeo de error en el input al comienzo de la función. + +Queremos que nuestra función retorne rápido si, no existe una extensión de MetaMask instalada, no existe una wallet conectada \(i.e. the `address` es un string vacío\), o `message` también es un string vacío. Agreguemos el siguiente chequeo de error a `updateMessage`: + + + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } +} +``` + + +Ahora que cuenta con un chegueo de error adecuado ¡ha llegado el momento de firmar la transacción con MetaMask! + + + +#### Firma de nuestra transacción {#signing-our-transaction} + +Si ya estás cómodo con las transacciones tradicionales web3 de Ethereum, el código que escribiremos a continuación te resultará bastante familiar. Debajo de tu código de chequeo de error, agrega lo siguiente a `pdateMessage`: + + + +```javascript +// interact.js + +//set up transaction parameters +const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: address, // must match user's active address. + data: helloWorldContract.methods.update(message).encodeABI(), +} + +//sign the transaction +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
    + ℹ️ Once the transaction is verified by the network, the message will be + updated automatically. +
    + ), + } +} catch (error) { + return { + status: "😥 " + error.message, + } +} +``` + + +Veamos qué es lo que ocurre. Primero, establezcamos los parámetros para nuestra transacción: + +- `to` especifica la dirección del receptor \(nuestro contrato inteligente\) +- `from` muestra quién firma la transacción, la variable `address` muestra lo que pasamos a la función +- `data` contiene la ejecución del método `update` de nuestro contrato inteligente Hello World, que recibe la variable de tipo cadena `message` como una entrada + +Luego, realizamos una ejecución en espera, `window.ethereum.request`, donde le pedimos a MetaMask que firme la transacción. Ten en cuenta que, en las lineas 11 y 12, especificamos nuestro método ETH `eth_sendTransaction` y le pasamos `transactionParameters`. + +En este punto, MetaMask se abrirá en el navegador y solicitará al usuario firmar o rechazar la transacción. + +- Si la transacción tiene éxito, la función devolverá un objeto de JSON donde el string JSX `status` le pedirá al usuario que revise Etherscan para obtener más información sobre su transacción. +- Si la transacción falla, la función devolverá un objeto JSON donde el string `status` transmitirá el mensaje de error. + +Entonces, nuestra función `updateMessage` debería verse así: + + + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + //input error handling + if (!window.ethereum || address === null) { + return { + status: + "💡 Connect your MetaMask wallet to update the message on the blockchain.", + } + } + + if (message.trim() === "") { + return { + status: "❌ Your message cannot be an empty string.", + } + } + + //set up transaction parameters + const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: address, // must match user's active address. + data: helloWorldContract.methods.update(message).encodeABI(), + } + + //sign the transaction + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + View the status of your transaction on Etherscan! + +
    + ℹ️ Once the transaction is verified by the network, the message will + be updated automatically. +
    + ), + } + } catch (error) { + return { + status: "😥 " + error.message, + } + } +} +``` + + +Por último, necesitamos conectar nuestra función `updateMessage` a nuestro componente `HelloWorld.js`. + + + +#### Conecta `updateMessage` al frontend `HelloWorld.js` {#connect-updatemessage-to-the-helloworld-js-frontend} + +Nuestra función `onUpdatePressed` deberá realizar una ejecución en espera a la función importada `updateMessage` y modificar la variable de estado `status` para que muestre si funcionó o falló nuestra transacción: + + + +```javascript +// HelloWorld.js + +const onUpdatePressed = async () => { + const { status } = await updateMessage(walletAddress, newMessage) + setStatus(status) +} +``` + + +Es simple y claro. Y adivina qué... ¡TU DAPP ESTÁ TERMINADA! + +¡Adelante, ve a probar el botón **Update**! + + + +### Crea tu propia dapp personalizada {#make-your-own-custom-dapp} + +¡Bravo! ¡Has llegado al final del tutorial! A modo de repaso, esto es lo que aprendiste: + +- como conectar una wallet de MetaMask a tu proyecto dapp +- Leer los datos de su contrato inteligente utilizando la API [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) +- Firmar transacciones de Ethereum usando MetaMask + +Ya estás preparado para aplicar los conocimientos que adquiriste en este tutorial, y así, crear tu propio proyecto dapp personalizado! De más está decir que, ante cualquier duda, puedes pedirnos ayuda en [AlchemyDiscord](https://discord.gg/gWuC7zB). 🧙‍♂️ + +Cuando finalice este tutorial, cuéntenos cómo fue su experiencia o comparta algún comentario etiquetándonos en Twitter [@alchemyplatform](https://twitter.com/AlchemyPlatform). diff --git a/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md index 371b40c82fc..68068a799a4 100644 --- a/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md +++ b/public/content/translations/es/developers/tutorials/hello-world-smart-contract/index.md @@ -1,24 +1,31 @@ --- -title: Contrato inteligente de Hola, mundo para principiantes +title: Contrato inteligente Hello World para principiantes description: Tutorial introductorio para redactar e implementar un contrato inteligente sencillo en Ethereum. author: "elanh" tags: - - "solidity" + - "solidez" - "Hardhat" - "alchemy" - "contratos inteligentes" - - "empezar" - "implementación" skill: beginner lang: es published: 2021-03-31 --- -Si es nuevo en el desarrollo de cadena de bloques y no sabe por dónde empezar, o si solo quiere entender cómo implementar e interactuar con contratos inteligentes, esta es su guía. Abordaremos cómo crear e implementar un contrato inteligente sencillo en la red de prueba Ropsten usando una billetera virtual ([MetaMask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) y [Alchemy](https://alchemyapi.io/eth) (no se preocupe si aún no entiende lo que significa todo esto, lo explicaremos). +Si es nuevo en el desarrollo de cadena de bloques y no sabe por dónde empezar, o si solo quiere entender cómo implementar e interactuar con contratos inteligentes, esta es su guía. Abordaremos cómo crear e implementar un contrato inteligente sencillo en la red de prueba Goerli usando una billetera virtual ([Metamask](https://metamask.io/)), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/) y [Alchemy](https://alchemyapi.io/eth) (no se preocupe si aún no entiende lo que significa todo esto: lo explicaremos). -En la parte 2 de este tutorial veremos cómo interactuar con nuestro contrato inteligente una vez implementado y en la parte 3 trataremos cómo publicarlo en Etherscan. +> **Advertencia** +> +> 🚧 Aviso de baja +> +> Para toda esta guía, se está usando la red de prueba Goerli para crear e implementar un contrato inteligente. Sin embargo, tenga en cuenta que la Ethereum Foundation ha anuciado que [Goerli pronto se dará de baja](https://www.alchemy.com/blog/goerli-faucet-deprecation). +> +> Recomendamos usar [Sepolia](https://www.alchemy.com/overviews/sepolia-testnet) y el [grifo de Sepolia](https://sepoliafaucet.com/) para este tutorial. -Si tiene alguna pregunta, no dude en consultar [Alchemy Discord](https://discord.gg/gWuC7zB)! +En la [parte 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract) de este tutorial repasaremos cómo podemos interactuar con nuestro contrato inteligente una vez que se implemente aquí, y en [parte 3](https://docs.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) mostraremos cómo publicarlo en Etherscan. + +Si tiene alguna pregunta, no dude en consultar el [Discord de Alchemy](https://discord.gg/gWuC7zB). ## Paso 1: Conectarse a la red Ethereum {#step-1} @@ -26,13 +33,13 @@ Hay muchas maneras de hacer solicitudes a la cadena Ethereum. Por simplicidad, u ## Paso 2: Crear su aplicación (y llave API) {#step-2} -Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API creando una aplicación. Esto nos permitirá hacer peticiones a la red de pruebas de Ropsten. Si no está familiarizado con las redes de pruebas, revise [la página](/developers/docs/networks/). +Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API creando una aplicación. Esto nos permitirá hacer solicitudes a la red de prueba Goerli. Si no está familiarizado con las redes de prueba, revise [esta página](/developers/docs/networks/). -1. Navegue a la página «Crear App» en su tablero Alchemy pasando el cursor sobre «Apps» en la barra de navegación y haciendo clic en «Crear App». +1. Navegue a la página «Crear app» (Crear aplicación) en su tablero Alchemy pasando el cursor sobre «Apps» en la barra de navegación y haciendo click en «Crear app». ![Crear la aplicación Hola, mundo](./hello-world-create-app.png) -2. Designe a su aplicación «Hola, mundo», y escriba una breve descripción, seleccione «Staging» para el ambiente (usado para la contabilidad de tu aplicación), y escoja «Ropsten» para su red. +2. Nombre su aplicación “Hello World”, ofrezca una descripción corta, seleccione “Staging” para el entorno (usado para la contabilidad de su aplicación) y seleccione “Goerli” para la red. ![Crear App visualizar Hola, mundo](./create-app-view-hello-world.png) @@ -40,44 +47,44 @@ Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API cr ## Paso 3: Crear una cuenta Ethereum (dirección) {#step-3} -Necesitamos tener una cuenta Ethereum para enviar y recibir transacciones. Para este tutorial, usaremos MetaMask, una cartera virtual en el navegador usada para manejar la dirección de su cuenta Ethereum. Más información en [transacciones](/developers/docs/transactions/). +Necesitamos tener una cuenta Ethereum para enviar y recibir transacciones. Para este tutorial, usaremos Metamask, una cartera virtual en el navegador usada para manejar la dirección de su cuenta Ethereum. Más información sobre las [transacciones](/developers/docs/transactions/). -Puede descargar y crear una cuenta MetaMask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o ya tenga una, asegúrese de cambiar a la «Red de pruebas de Robsten» en la parte superior derecha ( para que no tratemos con dinero real). +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la “red de prueba Goerli” en la parte superior derecha (para no operar con dinero real). -![ejemplo de MetaMask Ropsten](./metamask-ropsten-example.png) +![ejemplo de Metamask Ropsten](./metamask-ropsten-example.png) ## Paso 4: Agregar ether de un Faucet {#step-4} -Para desarrollar nuestro contrato inteligente en la red de prueba, necesitaremos ETH de prueba. Para obtener sus ETH de prueba, puede ir a [Ropsten faucet](https://faucet.dimensions.network/) e introducir la dirección de su cuenta de Ropsten, y hacer click en «Enviar Ropsten ETH». Puede llevar algo de tiempo recibir su ETH de prueba debido a la congestión de la red. ¡Deberían aparecer los ETH en su cuenta de MetaMask poco después! +Para implementar nuestro contrato inteligente en la red de prueba, necesitaremos algo de Eth falso. Para obtener Eth puede ir al [grifo de Goerli](https://goerlifaucet.com/), iniciar sesión en su cuenta de Alchemy e introducir la dirección de su billetera; luego haga clic en "Send Me Eth." para enviárselo. Puede llevar algo de tiempo recibir el Eth de prueba debido a la congestión de la red. (Al momento de escribir esto, el envío tardó cerca de 30 minutos). Debería ver su Eth en su cuenta de MetaMask a la brevedad. ## Paso 5: Comprobar su balance {#step-5} -Para comprobar que nuestro balance este ahí, hagamos una solicitud de [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance)usando [la herramienta de composición de 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). Esto hará que aparezca la cantidad de ETH en nuestra billetera. Después de introducir la dirección de su cuenta de MetaMask y hacer click en «Enviar Solicitud», debería ver una respuesta como esta: +Para comprobar que nuestro balance este ahí, hagamos una solicitud de [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando [la herramienta de composición de 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). Esto hará que aparezca la cantidad de ETH en nuestra billetera. Después de introducir la dirección de su cuenta de Metamask y hacer click en «Enviar Solicitud», debería ver una respuesta como esta: ```json { "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } ``` -> **NOTA:**Este resultado es en wei no en ETH. Wei se usa como la denominación más pequeña de ether. La conversión de Wei a ETH es: 1 ETH = 1018wei. Entonces si queremos convertir 0x2B5E3AF16B1880000 a decimales obtenemos 5\*10¹⁸, que es igual a 5 ETH. -> -> ¡Fiu! Nuestro dinero de prueba esta todo ahí . +> **NOTA:** Este resultado es en wei, no en ETH. Wei se usa como la denominación más pequeña de Ether. La conversión de wei a ETH es: 1 eth = 1018 wei. Entonces si queremos convertir 0x2B5E3AF16B1880000 a decimales, obtenemos 5\*10¹⁸, que equivale a 5 ETH. +> +> ¡Fiu! Nuestro dinero de prueba está todo ahí . ## Paso 6: Iniciar nuestro proyecto {#step-6} -Primero, necesitaremos crear un a carpeta para nuestro proyecto. Vaya a su línea de comando y teclee: +Primero, necesitaremos crear una carpeta para nuestro proyecto. Vaya a su línea de comando y escriba: ``` mkdir hello-world cd hello-world ``` -Ahora que estamos dentro de nuestra carpeta de proyecto, utulizaremos `npm init` a fin de inicializar el proyecto. Si no tiene instalado npm, siga [estas instrucciones](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (también necesitaremos Node.js así que ¡descárgueselo también!). +Ahora que estamos dentro de nuestra carpeta de proyecto, usaremos `npm init` a fin de inicializar el proyecto. Si no tiene instalado npm, siga [estas instrucciones](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) (también necesitaremos Node.js, así que descárgueselo también). ``` npm init ``` -Realmente no importa la respuesta que dé a las preguntas de instalación, aquí le mostramos cómo lo hicimos nosotros: +Realmente no importa cómo responda las preguntas de instalación; aquí le mostramos cómo lo hicimos nosotros: ``` package name: (hello-world) @@ -104,13 +111,13 @@ About to write to /Users/.../.../.../hello-world/package.json: } ``` -Aprueba el paquete.json y ¡estamos listos para comenzar! +Apruebe el package.json y listo. -## Paso 7: Descargar [Hardhat](https://hardhat.org/getting-started/#overview){#step-7} +## Paso 7: Descargar [Hardhat](https://hardhat.org/getting-started/#overview) {#step-7} -Hardhat es un entorno de desarrollo para compilar, desplegar, probar y depurar su software Ethereum. Ayuda a los desarrolladores para construir contratos inteligentes y dApps localmente antes de desplegarlos en la cadena en vivo. +Hardhat es un entorno de desarrollo para compilar, implementar, probar y depurar su software de Ethereum. Ayuda a los desarrolladores cuando crean contratos inteligentes y dApps localmente antes de la implementación en la cadena real. -Dentro de nuestro proyecto `hello-world` ejecuta: +Dentro de nuestro proyecto `hello-world`, ejecute: ``` npm install --save-dev hardhat @@ -171,26 +178,26 @@ Abra el proyecto Hola, mundo en su editor favorito (nosotros preferimos [VSCode] ```solidity // Especifica la versión de Solidity, utilizando la versión semántica. -// Más información: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragmma -pragma solidity ^0.5.10; +// Learn more: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.0; -// Define un contrato llamado `HelloWorld`. -// Un contrato es una colección de funciones y datos (su estado). Una vez desplegado, un contrato reside en una dirección específica en la blockchain de Ethereum. Más información: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +// Defines a contract named `HelloWorld`. +// Un contrato es una colección de funciones y datos (su estado). Una vez desplegado, un contrato reside en una dirección específica en la blockchain de Ethereum. Learn more: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html contract HelloWorld { - // Declara una variable de estado `message` del tipo `string`. - // Las variables de estado son variables cuyos valores se almacenan permanentemente en el almacenamiento del contrato. La palabra clave `public` hace que las variables sean accesibles desde fuera de un contrato y crea una función que otros contratos o clientes pueden llamar para acceder al valor. + // Declares a state variable `message` of type `string`. + // Las variables de estado son variables cuyos valores se almacenan permanentemente en el almacenamiento del contrato. The keyword `public` makes variables accessible from outside a contract and creates a function that other contracts or clients can call to access the value. string public message; - // Similar a muchos idiomas orientados a objetos basados en clases, un constructor es una función especial que sólo se ejecuta cuando se crea un contrato. - // Los constructores se utilizan para inicializar los datos del contrato. Más información: https://solidity.readthedocs.io/es/v0.5.10/contracts.html#constructors - constructor(string memory initMessage) public { + // Similar to many class-based object-oriented languages, a constructor is a special function that is only executed upon contract creation. + // Los constructores se utilizan para inicializar los datos del contrato. Learn more:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { - // Acepta un argumento de cadena `initMessage` y establece el valor en la variable de almacenamiento `message` del contrato). + // Accepts a string argument `initMessage` and sets the value into the contract's `message` storage variable). message = initMessage; - } + } - // Una función pública que acepta un argumento de cadena y actualiza la variable de almacenamiento `message`. + // A public function that accepts a string argument and updates the `message` storage variable. function update(string memory newMessage) public { message = newMessage; } @@ -199,13 +206,13 @@ contract HelloWorld { Es un contrato inteligente muy sencillo que almacena un mensaje al momento de la creación y puede actualizarse con la función `update`. -## Paso 11: Conectar MetaMask & Alchemy a su proyecto {#step-11} +## Paso 11: Conectar Metamask & Alchemy a su proyecto {#step-11} -Hemos creado una billetera de MetaMask, una cuenta de Alchemy y escrito nuestro contrato inteligente, ahora es momento de conectarlos entre sí. +Hemos creado una billetera de Metamask, una cuenta de Alchemy y escrito nuestro contrato inteligente, ahora es momento de conectarlos entre sí. Cada transacción enviada desde su billetera virtual requiere una firma utilizando su clave privada única. Para proporcionar este permiso a nuestro programa, podemos almacenar de manera segura nuestra clave privada (y clave Alchemy API) en un archivo de entorno. -> Para saber más sobre el envío de transacciones, consulte[este tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sobre el envío de transacciones usando web3. +> Si quiere ahondar sobre el envío de transacciones, consulte [este tutorial](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) sobre el envío de transacciones usando web3. Primero, instale el paquete dotenv en su directorio de proyecto: @@ -213,7 +220,7 @@ Primero, instale el paquete dotenv en su directorio de proyecto: npm install dotenv --save ``` -Después, cree un archivo `.env` en el directorio raíz de nuestro proyecto, y añádale la llave inteligente de MetaMask y la API URL de HTTP Alchemy. +Después, cree un archivo `.env` en el directorio raíz de nuestro proyecto, y añádale la llave inteligente de Metamask y la API URL de HTTP Alchemy. - Siga [estas instrucciones](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) para exportar su llave privada - Abajo se le indica cómo obtener la API URL de HTTP Alchemy @@ -225,8 +232,8 @@ Copie la API URL Alchemy Su `.env` debería verse así: ``` -API_URL = "https://eth-ropsten.alchemyapi.io/v2/your-api-key" -PRIVATE_KEY = "your-metamask-private-key" +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PRIVATE_KEY = "tu-clave privada-metamask" ``` Para conectarlos efectivamente a nuestro código, vincularemos estas variables en nuestro `hardhat.config.js` en el paso 13. @@ -266,10 +273,10 @@ const { API_URL, PRIVATE_KEY } = process.env; */ module.exports = { solidity: "0.7.3", - defaultNetwork: "ropsten", + defaultNetwork: "goerli", networks: { hardhat: {}, - ropsten: { + goerli: { url: API_URL, accounts: [`0x${PRIVATE_KEY}`] } @@ -330,7 +337,7 @@ Ejecutar `deploy()` en una `ContractFactory` iniciará el despliegue, y obtendr ¡Por fin estamos listos para desplegar nuestro contrato inteligente! Desde la linea de comandos, ejecute: ``` -npx hardhat run scripts/deploy.js --network ropsten +hardhat npx ejecuta scripts/deploy.js --network goerli ``` Debería mostrarse algo parecido a esto: @@ -339,11 +346,11 @@ Debería mostrarse algo parecido a esto: Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 ``` -Si vamos a la dirección [Ropsten etherscan](https://ropsten.etherscan.io/) y buscamos la dirección de nuestro contrato, podremos comprobar que se ha desplegado correctamente. El objeto de la transacción tendrá un aspecto parecido a esto: +Si vamos a la [Goerli etherscan](https://goerli.etherscan.io/) y buscamos la dirección de nuestro contrato, podremos comprobar que se ha implementado correctamente. El objeto de la transacción tendrá un aspecto parecido a esto: ![contrato etherscan](./etherscan-contract.png) -La dirección `From` debe coincidir con su cuenta de MetaMask y la dirección de envío especificará «creación de contrato», pero al hacer click en la transacción veremos nuestra dirección en el campo `To`: +La dirección `From` debe coincidir con su cuenta de Metamask y la dirección de envío especificará «creación de contrato», pero al hacer click en la transacción veremos nuestra dirección en el campo `To`: ![transacción etherscan](./etherscan-transaction.png) @@ -351,7 +358,7 @@ La dirección `From` debe coincidir con su cuenta de MetaMask y la dirección de Para entender lo que está pasando internamente, vayamos a la pestaña de Explorer en nuestro [panel Alchemy](https://dashboard.alchemyapi.io/explorer). Si tiene varias aplicaciones de Alchemy, asegúrese de filtrar por aplicación y seleccionar «Hola, mundo». ![Explorador Hola, mundo](./hello-world-explorer.png) -Aquí verá un puñado de ejecuciones JSON-RPC que Hardhat/Ethers hizo internamente por nosotros cuando ejecutamos a la función `.deploy()`. Dos solicitudes importantes a tener en cuenta aquí son [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), que es la solicitud de escribir nuestro contrato en la cadena Ropsten, y [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash) que es una solicitud para leer información sobre nuestra transacción a partir de un hash (un patrón típico cuando realizamos transacciones). Para saber más sobre el envío de transacciones, consulte el siguiente tutorial [Enviar transacciones usando Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) +Aquí verá un puñado de ejecuciones JSON-RPC que Hardhat/Ethers hizo internamente por nosotros cuando ejecutamos a la función `.deploy()`. Dos solicitudes importantes aquí son [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), que es la solicitud para escribir nuestro contrato en la cadena de Goerli, y [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), que consiste en una solicitud para obtener la información de nuestra transacción de acuerdo con un hash proporcionado (un patrón típico cuando realizamos transacciones). Para saber más sobre el envío de transacciones, consulte el siguiente tutorial [Enviar transacciones usando Web3](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) Aquí acaba la parte 1 de este tutorial, en la parte 2, [Interacción con nuestro contrato inteligente](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#part-2-interact-with-your-smart-contract), actualizaremos nuestro mensaje inicial, y en la parte 3 [Publicación de nuestro contrato inteligente en Etherscan](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#optional-part-3-publish-your-smart-contract-to-etherscan), veremos como publicar para que todo el mundo sepa cómo interactuar con él. diff --git a/public/content/translations/es/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/es/developers/tutorials/how-to-implement-an-erc721-market/index.md new file mode 100644 index 00000000000..428577b2118 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -0,0 +1,149 @@ +--- +title: Cómo implementar un mercado ERC-721 +description: Cómo poner elementos tokenizados a la venta en un tablero descentralizado de avisos clasificados +author: "Alberto Cuesta Cañada" +tags: + - "contratos inteligentes" + - "erc-721" + - "solidity" + - "tókenes" +skill: intermediate +lang: es +published: 2020-03-19 +source: Hackernoon +sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9 +--- + +En este articulo, les mostraré cómo codificar Craiglist para la cadena de bloques de Ethereum. + +Antes de Gumtree, Ebay y Craigslist, los tableros de clasificados estaban hechos principalmente de corcho o papel. Había carteles de anuncios clasificados en los pasillos de las escuelas, periódicos, farolas, escaparates. + +Todo eso cambió con Internet. El número de personas que podían ver un tablero, fue multiplicado por muchas órdenes de magnitud. Con eso, el mercado que representa se hizo mucho mas eficiente y escalable globalmente. Ebay es un negocio masivo que tiene sus orígenes en estos tableros de anuncios clasificados físicos. + +Con la cadena de bloques, estos mercados están listos para cambiar de nuevo, permíteme mostrarte cómo. + +## Monetización {#monetization} + +El modelo de negocio de una junta pública de clasificaciones de blockchain tendrá que ser diferente del de Ebay y de la empresa. + +Primero, esta [el ángulo de descentralización](/developers/docs/web2-vs-web3/). Las plataformas existentes necesitan mantener sus propios servidores. Una plataforma descentralizada es mantenida por sus usuarios, por lo que el costo de correr la plataforma central cae a cero para el propietario de la plataforma. + +Luego está el front-end, el sitio web o interfaz que da acceso a la plataforma. Aquí hay muchas opciones. Los dueños de la plataforma pueden restringir el acceso y obligar a todos a utilizar su interfaz, cobrando una cuota. También pueden decidir abrir el acceso (Poder a la gente!) y dejar que cualquiera construya interfaces a la plataforma. O los dueños pueden decidir cualquier enfoque en medio de esos dos extremos. + +_Los líderes empresariales con mayor visión a la mía, sabrán como monetizar esto. Todo lo que veo es que esto es diferente del status quo y probablemente rentable._ + +Además, existe el ángulo de automatización y pagos. Algunas cosas pueden ser muy [efectivamente tokenizadas](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) e intercambiadas en un tablero de clasificaciones. Los activos tokenizados se transfieren fácilmente en una cadena de bloques. Los métodos de pago altamente complejos se pueden implementar fácilmente en una cadena de bloques. + +Sólo estoy aprovechando una oportunidad de negocio aquí. Una tabla clasificada sin gastos de funcionamiento puede ser implementada fácilmente, con complejas rutas de pago incluidas en cada transacción. Estoy seguro de que alguien saldrá con una idea sobre para que usar esto. + +Estoy feliz contruyendolo. Echemos un vistazo al código. + +## Implementación {#implementation} + +Hace algún tiempo iniciamos un [repositorio de código abierto](https://github.com/HQ20/contracts?ref=hackernoon.com) con implementaciones de ejemplos de casos de negocio y otras cosas, por favor, eche un vistazo. + +El código de este [Tablón de Clasificados de Ethereum](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) está ahí, por favor úsalo y abusa de él. Solo hay que tener en cuenta que el código no ha sido auditado y hay que hacer la debida comprobación antes de dejar que el dinero entre en él. + +Los fundamentos del tablero no son complejos. Todos los anuncios en el tablero serán sólo una estructura con unos pocos datos: + +```solidity +struct Trade { + address poster; + uint256 item; + uint256 price; + bytes32 status; // Open, Executed, Cancelled +} +``` + +Así que hay alguien que publica el anuncio. Un artículo a la venta. Un precio para el artículo. El estado de la operación, que puede ser abierta, ejecutada o cancelada. + +Todas estas operaciones se guardarán en un mapeo. Porque todo en Solidity parece ser un mapeo. También porque es conveniente. + +```solidity +mapping(uint256 => Trade) public trades; +``` + +El uso de un mapeo sólo significa que tenemos que llegar a una identificación para cada anuncio antes de publicarlo, y necesitaremos saber la identificación de un anuncio antes de poder operar en él. Hay múltiples maneras de tratar esto, ya sea en el contrato inteligente o en el front-end. Por favor, pregunte si necesita algunos datos. + +A continuación se plantea la cuestión de cuáles son esos artículos con los que tratamos, y cuál es esa moneda que se utiliza para pagar la transacción. + +Para los artículos, sólo vamos a pedir que implementen la interfaz [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com), que realmente es sólo una forma de representar artículos del mundo real en una blockchain, aunque [funciona mejor con activos digitales](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com). Vamos a especificar nuestro propio contrato ERC721 en el constructor, lo que significa que cualquier activo en nuestro tablón de anuncios necesita haber sido tokenizado de forma anticipada. + +Para los pagos, vamos a hacer algo parecido. La mayoría de los proyectos de blockchain definen su propia criptomoneda [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com). Otros prefieren utilizar uno convencional como el DAI. En este tablón de anuncios, sólo tienes que decidir en la construcción cuál será tu moneda. Fácil. + +```solidity +constructor ( + address _currencyTokenAddress, address _itemTokenAddress +) public { + currencyToken = IERC20(_currencyTokenAddress); + itemToken = IERC721(_itemTokenAddress); + tradeCounter = 0; +} +``` + +Ya lo estamos consiguiendo. Tenemos anuncios, artículos para comercializar y una moneda para hacer pagos. Hacer un anuncio significa poner un artículo en un depósito (escrow) para mostrar que lo tiene y que no lo ha publicado dos veces, posiblemente en un tablero diferente. + +El siguiente código hace exactamente eso. Pone el artículo en depósito, crea el anuncio, hace algunas gestiones. + +```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"); +} +``` + +Aceptar la comercialización significa elegir un anuncio (comercializar), pagar el precio y recibir el objeto. El código de abajo recupera una operación. Comprueba su disponibilidad. Paga el objeto. Recupera el objeto. Actualiza el anuncio. + +```solidity +function executeTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require(trade.status == "Abierto", "El comercio no está abierto."); + currencyToken.transferFrom(msg.sender, trade.poster, trade.price); + itemToken.transferFrom(address(this), msg.sender, trade.item); + trades[_trade].status = "Ejecutado"; + emit TradeStatusChange(_trade, "Ejecutado"); +} +``` + +Por último, tenemos la opción de que los vendedores cancelen una operación antes de que el comprador la acepte. En algunos modelos, los anuncios estarían publicados en cambio durante un período de tiempo antes de que caduquen. Es su elección, dependiendo del diseño de su mercado. + +El código es muy similar al usado para ejecutar una operación, solo que no hay moneda y el artículo vuelve a quien publicó el anuncio. + +```solidity +function cancelTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require( + msg.sender == trade.poster, + "Trade can be cancelled only by poster." + ); + require(trade.status == "Open", "Trade is not Open."); + itemToken.transferFrom(address(this), trade.poster, trade.item); + trades[_trade].status = "Cancelled"; + emit TradeStatusChange(_trade, "Cancelled"); +} +``` + +Eso es todo. Ha llegado al final de la implementación. Es bastante sorprendente lo compactos que son algunos conceptos de negocio cuando se expresan en código, y este es uno de esos casos. Revise el contrato completo [en nuestro repositorio](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol). + +## Conclusión {#conclusion} + +Los tableros de anuncios clasificados son una configuración de mercado común que creció enormemente con Internet, convirtiéndose en un modelo de negocio altamente popular con unos pocos ganadores monopolísticos. + +Los tableros de anuncios clasificados también resultan ser una herramienta fácil de replicar en un entorno de cadena de bloques, con características muy específicas que harán posible un desafío a los gigantes existentes. + +En este artículo, he tratado de conectar la realidad del negocio de los tableros de anuncios clasificados con la implementación tecnológica. Este conocimiento debería ayudarle a crear una visión y un mapa de ruta para la implementación si tiene las habilidades adecuadas. + +Como siempre, si quiere crear algo divertido y le gustaría recibir algún consejo, [envíeme un mensaje](https://albertocuesta.es/), será bienvenido. Siempre estoy encantado de ayudar. diff --git a/public/content/translations/es/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/es/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md new file mode 100644 index 00000000000..9b87f91c40f --- /dev/null +++ b/public/content/translations/es/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -0,0 +1,106 @@ +--- +title: Cómo simular contratos inteligentes de Solidity para probarlos +description: '¿Por qué debería burlarse de sus contratos al probarlos?' +author: Markus Waas +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "pruebas" + - "simular" +skill: intermediate +published: 2020-05-02 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/mocking-contracts +--- + +[Los objetos simulados](https://wikipedia.org/wiki/Mock_object) son un patrón de diseño común en la programación orientada a objetos. Viene de la antigua palabra francesa «mocquer» con el significado de «reírse de algo» y evolucionó a «imitar a algo real» que es, en realidad, lo que hacemos en programación. Por tanto, ríase todo lo que quiera de sus contratos inteligentes si quieres, pero simúlelos siempre que pueda. ¡Le simplifica la vida! + +## Pruebas unitarias de contratos con simulaciones {#unit-testing-contracts-with-mocks} + +Simular un contrato significa básicamente crear una segunda versión del contrato que se comporta de manera muy similar al original, pero de una forma que el desarrollador puede controlar fácilmente. A menudo suele uno acabar con contratos complejos cuando lo único que quiere es [ hacer pruebas unitarias en partes pequeñas del contrato.](/developers/docs/smart-contracts/testing/). El problema es: ¿qué sucedería si esta pequeña parte requiere un estado de contrato muy específico que es complicado para comenzar? + +Puede escribir una lógica de configuración de prueba compleja cada vez que el contrato se encuentre en el estado requerido, o escriba una simulación. Simular un contrato es fácil con herencia. Simplemente crea un segundo contrato simulado que hereda del original. Ahora puede sobrescribir funciones a su imitación. Veámoslo mejor poniendo un ejemplo. + +## Ejemplo: ERC20 privado {#example-private-erc20} + +Usamos el ejemplo de un contrato ERC-20 que tiene un tiempo inicial privado. El propietario puede administrar usuarios privados y solo ellos estarán autorizados a recibir tókenes al principio. Una vez transcurrido un periodo específico, cualquiera podrá usar los tókenes. Si le pica la curiosidad, estamos usando el hook [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks) de los nuevos contratos v3 de OpenZeppelin. + +```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: invalid recipient"); + } + + function _validRecipient(address to) private view returns (bool) { + if (isPublic()) { + return true; + } + + return isPrivateUser[to]; + } +} +``` + +Y ahora vamos a simularlo. + +```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; + } +} +``` + +Recibirás uno de los siguientes mensajes de error: + +- `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.` +- `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.` + +Ya que estamos usando la nueva versión 0.6 de Solidity, tenemos que añadir la palabra clave `virtual` para funciones que puedan ser sobrescritas y sobrescribir para la función de sobrescribir. Entonces, añadámoslas a ambas funciones `isPublic`. + +Ahora, en sus pruebas unitarias, puede usar `PrivateERC20Mock` en su lugar. Cuando quiera probar el comportamiento durante un tiempo privado de uso, utilice `setIsPublic(false)` al igual que `setIsPublic(true)` para probar el tiempo público de uso. Por supuesto, en nuestro ejemplo también podemos usar únicamente [ayudas de tiempo](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) para cambiar los tiempos según corresponda. Esperamos que la idea de simular le haya quedado ahora clara y puede imaginar situaciones en las que todo no es tan sencillo como simplemente hacer avanzar el tiempo. + +## Simular varios contratos {#mocking-many-contracts} + +Puede volverse un tanto caótico si tiene que crear otro contrato para cada imitación única. Si esto le preocupa, puede revisar la biblioteca [MockContract](https://github.com/gnosis/mock-contract). Le permite sobrescribir y cambiar los comportamientos de los contratos sobre la marcha. Sin embargo, esto solo funciona para simular la activación de otro contrato, por lo que no funcionará para nuestro ejemplo. + +## Simular puede ser aún más eficaz {#mocking-can-be-even-more-powerful} + +Los poderes de la simulación no terminan aquí. + +- Añadir funciones: no solo sobrescribir una función específica es útil, también lo es añadir funciones adicionales. Un buen ejemplo para los tókenes es contar con una función adicional `mint` para permitir a cualquier usuario consiga los nuevos tókenes sin coste. +- Uso en redes de prueba: cuando implemente y pruebe sus contratos en redes de pruebas junto con su DApp, considere el usar una versión simulada. Evita el tener que sobreescribir las funciones, a menos que sea realmente necesario. Al fin y al cabo, se trata de probar la lógica real. Pero agregar, por ejemplo, una función de reinicio puede ser útil para simplemente restablecer el contrato a su estado inicial, sin requerir un nuevo despliegue. Obviamente, no haría eso en un contrato de red principal. diff --git a/public/content/translations/es/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/es/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md new file mode 100644 index 00000000000..695e39d0c43 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -0,0 +1,693 @@ +--- +title: Cómo utilizar Echidna para probar contratos inteligentes +description: Cómo utilizar Echidna para probar smart contracts automáticamente +author: "Trailofbits" +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "seguridades" + - "pruebas" + - "auditorías de seguridad" +skill: advanced +published: 2020-10-04 +source: Desarrollando smart contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna +--- + +## Instalación {#installation} + +Echidna se puede instalar a través de docker o por medio del binario precompilado. + +### Echidna a través de docker {#echidna-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_El comando de arriba ejecuta eth-security-toolbox en un docker que tiene acceso a tu directorio actual. Puedes cambiar los archivos desde tu host y correr las herramientas dentro de los archivos desde docker_ + +Dentro de docker, ejecuta: + +```bash +solc-select 0.5.11 +cd /home/training +``` + +### Binario {#binary} + +[https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0) + +## Introducción a las auditorías de seguridad basadas en propiedades {#introduction-to-property-based-fuzzing} + +Echidna es un auditor basado en propiedades, está descrito en nuestros blogposts anteriores ([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 (auditoría de seguridad) {#fuzzing} + +[Fuzzing](https://wikipedia.org/wiki/Fuzzing) es una técnica conocida en la comunidad de la seguridad. Esta consiste en la generación de entradas que son más o menos aleatorias para encontrar errores en el programa. Se sabe que software tradicional (como [AFL](http://lcamtuf.coredump.cx/afl/) o [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) son herramientas eficientes para encontrar errores. + +Más allá de la generación de insumos aleatorios, existen muchas técnicas y estrategias para generar insumos validos, que incluyen: + +- Obtener retroalimentación de cada ejecución y generación de guías usándola. Por ejemplo, si una entrada recién generada conduce al descubrimiento de una nueva ruta, puede tener sentido generar nuevas entradas más cercanas a ella. +- Generando la entrada respetando una restricción estructural. Por ejemplo, si su entrada contiene un encabezado con una suma de control, tendrá sentido dejar que el fuzzer genere una entrada que valide la suma de control. +- Uso de entradas conocidas para generar nuevas entradas: si tienes acceso a un gran conjunto de datos de entrada válida, tu fuzzer puede generar nuevas entradas a partir de ellos, en lugar de comenzar la generación desde cero. Estas se conocen usualmente como _seeds_. + +### Fuzzing basado en propiedades {#property-based-fuzzing} + +Echidna pertenece a una familia específica de fuzzer: fuzzing basado en propiedades inspiradas en [QuickCheck](https://wikipedia.org/wiki/QuickCheck). En contraste a un fuzzer de legado que intentará encontrar bloqueos, Echidna intentará romper invariantes definidas por el usuario. + +En smart contracts, las invariantes son funciones de Solidity, que pueden representar cualquier estado incorrecto o inválido al que el contrato pueda llegar, incluyendo: + +- Control de acceso erróneo: el atacante se convierte en el propietario del contrato. +- Estado de máquina incorrecto: fichas pueden ser transferidas mientras el contrato está en pausa. +- Aritmética incorrecta: el usuario puede rebasar su saldo y obtener fichas gratis ilimitadas. + +### Probando una propiedad con Echidna {#testing-a-property-with-echidna} + +Veremos cómo probar un smart contract con Echidna. El objetivo es el siguiente 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; + } +} +``` + +Supondremos que esta ficha debe tener las siguientes propiedades: + +- Cualquier persona puede tener como máximo 1000 fichas +- La ficha no puede ser transferida (no es una ficha ERC20) + +### Escribe una propiedad {#write-a-property} + +Las propiedades de Echidna son funciones de Solidity. Una propiedad debe: + +- No tener ningún argumento +- Devolver `true` si es exitosa +- Que su nombre comience con ` echidna ` + +Echidna va a: + +- Automáticamente generar transacciones arbitrarias para probar la propiedad. +- Reportar cualquier transacción que lleve a una propiedad a devolver ` false ` o arrojar un error. +- Descartar efectos secundarios al llamar a una propiedad (es decir, si la propiedad cambia una variable de estado, se descarta después de la prueba) + +La siguiente propiedad comprueba que el llamador no tenga más de 1000 fichas: + +```solidity +function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; +} +``` + +Usa herencia para separar tu contrato de tus propiedades: + +```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) implementa la propiedad y hereda de la ficha. + +### Inicia un contrato {#initiate-a-contract} + +Echidna necesita un [constructor](/developers/docs/smart-contracts/anatomy/#constructor-functions) sin argumento. Si tu contrato necesita una inicialización específica, debes hacerlo en el constructor. + +Hay algunas direcciones específicas en Echidna: + +- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72` la cual llama al constructor. +- `0x10000`, `0x20000`, y `0x00a329C0648769a73afAC7F9381e08fb43DBEA70` que llama de forma aleatoria a las otras funciones. + +No necesitamos ninguna inicialización en particular en nuestro ejemplo actual, como resultado, nuestro constructor está vacío. + +### Ejecuta Echidna {#run-echidna} + +Echidna se inicial con: + +```bash +echidna-test contract.sol +``` + +Si contract.sol contiene varios contratos, puedes especificar el objetivo: + +```bash +echidna-test contract.sol --contract MyContract +``` + +### Resumen: Probando una propiedad {#summary-testing-a-property} + +A continuación se resume la ejecución de echidna en nuestro ejemplo: + +```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 descubrió que la propiedad se viola si se llama a ` backdoor `. + +## Filtrado de funciones para llamar durante una campaña fuzzing {#filtering-functions-to-call-during-a-fuzzing-campaign} + +Veremos cómo filtrar las funciones a ser "fuzzed". El objetivo es el siguiente 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); + } +} +``` + +Este pequeño ejemplo obliga a Echidna a encontrar una secuencia determinada de transacciones para cambiar una variable de estado. Esto es difícil para un fuzzer (se recomienda utilizar una herramienta de ejecución simbólica como [Manticore](https://github.com/trailofbits/manticore)). Podemos ejecutar Echidna para verificar esto: + +```bash +echidna-test multi.sol +... +echidna_state4: passed! 🎉 +Seed: -3684648582249875403 +``` + +### Filtrando funciones {#filtering-functions} + +Echidna tiene problemas para encontrar la secuencia correcta para probar este contrato porque las dos funciones de reinicio (`reset1` y `reset2`) establecerán todas las variables de estado a `false`. Sin embargo, podemos usar una función especial de Echidna para crear un blacklist de la función de reinicio o para crear un whitelist con las funciones `f`, `g`, `h` y `i`. + +Para incluir funciones en la blacklist, podemos usar este archivo de configuración: + +```yaml +filterBlacklist: true +filterFunctions: ["reset1", "reset2"] +``` + +Otro enfoque para filtrar funciones es enumerar las funciones incluidas en la whitelist. Para ello, podemos utilizar este archivo de configuración: + +```yaml +filterBlacklist: false +filterFunctions: ["f", "g", "h", "i"] +``` + +- `filterBlacklist` es `true` de forma predeterminada. +- El filtrado se realizará únicamente por nombre (sin parámetros). Si tienes `f()` y `f(uint256)`, el filtro `"f"` coincidirá con ambas funciones. + +### Ejecuta Echidna {#run-echidna-1} + +Para ejecutar Echidna con un archivo de configuración `blacklist.yaml`: + +```bash +echidna-test multi.sol --config blacklist.yaml +... +echidna_state4: failed!💥 + Call sequence: + f(12) + g(8) + h(42) + i() +``` + +Echidna encontrará la secuencia de transacciones para falsificar la propiedad casi de inmediato. + +### Resumen: Filtrando funciones {#summary-filtering-functions} + +Echidna puede incluir funciones en una blacklist o una whitelist para llamar durante una campaña de fuzzing utilizando: + +```yaml +filterBlacklist: true +filterFunctions: ["f1", "f2", "f3"] +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +Echidna comienza una campaña de fuzzing, ya sea "blacklisting" `f1`, `f2` y `f3` o solo los llama, según al valor del booleano (tipo de dato lógico) `filterBlacklist`. + +## Cómo probar la afirmación de Solidity con Echidna {#how-to-test-soliditys-assert-with-echidna} + +En este breve tutorial, mostraremos cómo usar Echidna para probar la verificación de afirmaciones en contratos. Supongamos que tenemos un contrato como este: + +```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); + } +} +``` + +### Escribe una afirmación {#write-an-assertion} + +Queremos asegurarnos de que `tmp` sea menor o igual que `counter` después de devolver su diferencia. Podríamos escribir una propiedad de Echidna, pero tendremos que almacenar el valor `tmp` en algún lugar. En su lugar, podríamos usar una afirmación como esta: + +```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); + } +} +``` + +### Ejecuta Echidna {#run-echidna-2} + +Para habilitar la prueba de fracaso de la afirmación, crea un [archivo de configuración de Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +checkAsserts: true +``` + +Al ejecutar este contrato en Echidna obtenemos los resultados esperados: + +```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 +``` + +Como puedes ver, Echidna informa de un error de afirmación en la función `inc`. Es posible agregar más de una afirmación por función, pero Echidna no puede distinguir cual afirmación falló. + +### Cómo y cuándo utilizar afirmaciones {#when-and-how-use-assertions} + +Las afirmaciones pueden usarse como alternativas a propiedades explícitas, especialmente si las condiciones a verificar están directamente relacionadas con el uso correcto de alguna operación `f`. Agregar afirmaciones luego de un poco de código hará que la verificación suceda inmediatamente después de la ejecución: + +```solidity +function f(..) public { + // some complex code + ... + assert (condition); + ... +} + +``` + +Por el contrario, el uso de una propiedad explícita de echidna ejecutará transacciones de forma aleatoria y no hay una manera fácil de asegurar exactamente cuándo esta se comprobará. Es posible utilizar esta alternativa: + +```solidity +function echidna_assert_after_f() public returns (bool) { + f(..); + return(condition); +} +``` + +Sin embargo, existen algunos problemas: + +- Falla si `f` se declara como `internal` o `external`. +- No está claro qué argumentos deben usarse para llamar a `f`. +- Si `f` se revierte, la propiedad fallará. + +En general, recomendamos seguir la [recomendación de John Regehr](https://blog.regehr.org/archives/1091) sobre cómo utilizar las afirmaciones: + +- No forces ningún efecto secundario durante la verificación de afirmaciones. Por ejemplo: `assert(ChangeStateAndReturn() == 1)` +- No hagas afirmaciones obvias. Por ejemplo `assert(var >= 0)` donde `var` es declarado como `uint`. + +Por último, **no utilices** `require` en lugar de `assert`, ya que Echidna no podrá detectarlo (pero el contrato se revertirá de todos modos). + +### Resumen: verificación de afirmaciones {#summary-assertion-checking} + +A continuación, se resume la ejecución de echidna en nuestro ejemplo: + +```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 descubrió que la aserción en `inc` puede fallar si se llama a esta función varias veces con argumentos grandes. + +## Recolectar y modificar un corpus de Echidna {#collecting-and-modifying-an-echidna-corpus} + +Veremos cómo recopilar y utilizar un corpus de transacciones con Echidna. El objetivo es el siguiente 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; + } + +} +``` + +El ejemplo a continuación obliga a Echidna a encontrar ciertos valores para cambiar una variable de estado. Esto es difícil para un fuzzer (se recomienda utilizar una herramienta de ejecución simbólica como [Manticore](https://github.com/trailofbits/manticore)). Podemos ejecutar Echidna para verificar esto: + +```bash +echidna-test magic.sol +... + +echidna_magic_values: passed! 🎉 + +Seed: 2221503356319272685 +``` + +Sin embargo, aún podemos usar Echidna para recolectar el corpus cuando ejecutemos esta campaña de fuzzing. + +### Recolectando un corpus {#collecting-a-corpus} + +Para habilitar la recolección de un corpus, crea un directorio de corpus: + +```bash +mkdir corpus-magic +``` + +Y un [archivo de configuración de Echidna](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +coverage: true +corpusDir: "corpus-magic" +``` + +Ahora podemos ejecutar nuestra herramienta y verificar el corpus recopilado: + +```bash +echidna-test magic.sol --config config.yaml +``` + +Echidna aún no puede encontrar los valores mágicos correctos, pero podemos ver el corpus que recopiló. Por ejemplo, uno de estos archivos era: + +```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" + } +] +``` + +Claramente, esta entrada no provocará la falla en nuestra propiedad. Sin embargo, en el siguiente paso veremos cómo modificarla para ello. + +### Sembrando un corpus {#seeding-a-corpus} + +Echidna necesita ayuda para lidiar con la función `magic`. Vamos a copiar y modificar la entrada para usar los parámetros adecuados para ella: + +```bash +cp corpus/2712688662897926208.txt corpus/new.txt +``` + +Modificaremos `new.txt` para llamar a `magic (42,129,333,0)`. Ahora, podemos volver a ejecutar Echidna: + +```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 + +``` + +En esta ocasión, encontró que la propiedad es violada inmediatamente. + +## Encontrando transacciones con alto consumo de gas {#finding-transactions-with-high-gas-consumption} + +Veremos cómo encontrar las transacciones con un alto consumo de gas utilizando Echidna. El objetivo es el siguiente 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; + } + +} +``` + +Aquí `expensive` puede tener un gran consumo de gas. + +Actualmente, Echidna siempre necesita una propiedad para probar: aquí `echidna_test` siempre devuelve `true`. Podemos ejecutar Echidna para verificar: + +``` +echidna-test gas.sol +... +echidna_test: passed! 🎉 + +Seed: 2320549945714142710 +``` + +### Midiendo el consumo de gas {#measuring-gas-consumption} + +Para activar el consumo de gas con Echidna, creamos un archivo de configuración `config.yaml`: + +```yaml +estimateGas: true +``` + +En este ejemplo, también reduciremos el tamaño de la secuencia de la transacción para que los resultados sean más fáciles de entender: + +```yaml +seqLen: 2 +estimateGas: true +``` + +### Ejecuta Echidna {#run-echidna-3} + +Una vez que tenemos el archivo de configuración creado, podemos ejecutar Echidna así: + +```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 + +``` + +- El gas que se muestra es una estimación proporcionada por [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-). + +### Filtrando llamadas de reducción de gas {#filtering-out-gas-reducing-calls} + +El tutorial sobre **funciones de filtrado para llamar durante una campaña de fuzzing** anterior muestra cómo eliminar algunas funciones de sus pruebas. +Esto puede ser fundamental para obtener una estimación precisa del gas. Considera el siguiente ejemplo: + +```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; + } +} +``` + +Si Echidna puede llamar a todas las funciones, no encontrará fácilmente transacciones con un alto costo de gas: + +``` +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 +``` + +Eso es porque el costo depende del tamaño de ` addrs ` y las llamadas aleatorias tienden a dejar el vector casi vacío. Sin embargo, incluir `pop` y `clear` en un blacklist nos da mejores resultados: + +```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 +``` + +### Resumen: Buscando transacciones con alto consumo de gas {#summary-finding-transactions-with-high-gas-consumption} + +Echidna puede encontrar transacciones con un alto consumo de gas utilizando la opción de configuración `estimateGas`: + +```yaml +estimateGas: true +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +Echidna reportará una secuencia con el consumo máximo de gas para cada función, una vez finalizada la campaña de fuzzing. diff --git a/public/content/translations/es/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/es/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..69bee3261fc --- /dev/null +++ b/public/content/translations/es/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -0,0 +1,515 @@ +--- +title: Cómo usar Manticore para encontrar errores en contratos inteligentes +description: Cómo usar Manticore para encontrar automáticamente errores en contratos inteligentes +author: Trailofbits +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "seguridades" + - "pruebas" + - "verificación formal" +skill: advanced +published: 2020-01-13 +source: Desarrollando smart contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore +--- + +El objetivo de este tutorial es mostrar cómo se usa Manticore para encontrar errores automáticamente en los contratos inteligentes. + +## Instalación {#installation} + +Manticore requiere >= python 3.6. Se puede instalar a través de pip o usando docker. + +### Manticore a través de docker {#manticore-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_El comando de arriba ejecuta eth-security-toolbox en un docker que tiene acceso a tu directorio actual. Puedes cambiar los archivos desde tu host y correr las herramientas dentro de los archivos desde docker_ + +Al estar en el docker, ejecute: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### Manticore a través de pip {#manticore-through-pip} + +```bash +pip3 install --user manticore +``` + +Se recomienda solc 0.5.11. + +### Ejecutando un script {#running-a-script} + +Ejecutando un script python con python 3: + +```bash +python3 script.py +``` + +## Introducción a la ejecución simbólica dinámica {#introduction-to-dynamic-symbolic-execution} + +### Descripción breve de la ejecución simbólica dinámica {#dynamic-symbolic-execution-in-a-nutshell} + +La ejecución simbólica dinámica (DSE) es una técnica de análisis de programas que explora un espacio de estados con un alto grado de conciencia semántica. Esta técnica se basa en el descubrimiento de "rutas del programa" representadas con fórmulas matemáticas denominadas `path predicates`. Conceptualmente, esta técnica opera en predicados de ruta en dos pasos: + +1. Contruyéndolos con restricciones sobre la entrada del programa. +2. Usándolos para generar entradas del programa para ejecutar las rutas asociadas. + +Este enfoque previene falsos positivos porque todos los estados de programa identificados se pueden activar durante la ejecución concreta. Por ejemplo, si el análisis encuentra un desbordamiento de enteros, se garantiza que sea reproducible. + +### Ejemplo de predicado de ruta {#path-predicate-example} + +Para conocer el funcionamiento de la DSE, considere el siguiente ejemplo: + +```solidity +function f(uint a){ + + if (a == 65) { + // A bug is present + } + +} +``` + +Como `f()` contiene dos rutas, una DSE construirá dos predicados de ruta diferentes: + +- Ruta 1: `a == 65` +- Ruta 2: `Not (a == 65)` + +Cada predicado de ruta es una fórmula matemática que puede ser dada a un [resolutor de SMT](https://wikipedia.org/wiki/Satisfiability_modulo_theories), que intentará resolver la ecuación. En `Path 1`, el resolutor dirá que la ruta puede ser explorada con `a = 65`. En `Path 2`, el resolutor puede dar a `a` cualquier valor distinto de 65, por ejemplo, `a = 0`. + +### Verificación de propiedades {#verifying-properties} + +Manticore permite control pleno sobre toda la ejecución de cada ruta. Como resultado, permite añadir restricciones arbitrarias a casi cualquier cosa. Este control permite la creación de propiedades en el contrato. + +Considere el siguiente ejemplo: + +```solidity +function unsafe_add(uint a, uint b) returns(uint c){ + c = a + b; // sin protección de desbordamiento + return c; +} +``` + +Aquí solo hay un camino para explorar en la función: + +- Ruta 1: `c = a + b` + +Usando Manticore se puede comprobar si hay desbordamiento y añadir restricciones al predicado de ruta: + +- `c = a + b AND (c < a OR c < b)` + +Si es posible encontrar un valor de `a` y `b` donde el predicado de ruta de arriba sea factible, significa que se ha encontrado un desbordamiento. Por ejemplo, el solucionador puede generar la entrada `a = 10 , b = MAXUINT256`. + +Si considera una versión corregida: + +```solidity +function safe_add(uint a, uint b) returns(uint c){ + c = a + b; + require(c>=a); + require(c>=b); + return c; +} +``` + +La fórmula asociada con la comprobación de desbordamiento sería: + +- `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)` + +Esta fórmula no se puede resolver; en otro estadio esto es una **prueba** de que en `safe_add`, `c` siempre aumentará. + +DSE es una potente herramienta que puede verificar restricciones arbitrarias en el código. + +## Ejecutando bajo Mantícora {#running-under-manticore} + +Veamos cómo explorar un contrato inteligente con la API Manticore. El objetivo es el siguiente 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(); + } + } +} +``` + +### Ejecute una exploración independiente {#run-a-standalone-exploration} + +Ejecute Manticore directamente en el contrato inteligente con el siguiente comando (`project` que puede ser un Solidity File o un roject directory): + +```bash +$ manticore project +``` + +Obtendrá una salida de casos de prueba como esta (el orden puede cambiar): + +``` +... +... 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... +``` + +Sin información adicional, Manticore va a explorar el contrato con nuevas transacciones simbólicas hasta que no haya nuevas rutas en el contrato. Manticore no ejecutará nuevas transacciones después de una fallida (por ejemplo: después de una reversión). + +Manticore mostrará la información en un directorio `mcore_*`. Entre otros, encontrará en este directorio: + +- `global.summary`: cobertura y advertencias del compilador +- `test_XXXX.summary`: cobertura, última instrucción, balance de cuenta por caso de prueba +- `test_XXXX.tx`: lista detallada de transacciones por caso de prueba + +Aquí Manticore encuentra 7 casos de prueba que corresponden (el orden de nombres de archivo puede cambiar): + +| | Transacción 0 | Transacción 1 | Transacción 2 | Resultado | +|:--------------------:|:--------------------:|:------------------:| ------------------ |:---------:| +| **test_00000000.tx** | Creación de contrato | f(!=65) | f(!=65) | DETENER | +| **test_00000001.tx** | Creación de contrato | función de reserva | | REVERTIR | +| **test_00000002.tx** | Creación de contrato | | | REGRESAR | +| **test_00000003.tx** | Creación de contrato | f(65) | | REVERTIR | +| **test_00000004.tx** | Creación de contrato | f(!=65) | | DETENER | +| **test_00000005.tx** | Creación de contrato | f(!=65) | f(65) | REVERTIR | +| **test_00000006.tx** | Creación de contrato | f(!=65) | función de reserva | REVERTIR | + +_Resumen de exploración f(!=65) muestra f llamada con cualquier valor diferente a 65._ + +Como se ve, Manticore genera un caso de prueba único para cada transacción exitosa o revertida. + +Use la marca `--quick-mode` si desea una exploración rápida de código (deshabilita los detectores de errores, el cálculo de gas, ...) + +### Manipular un contrato inteligente a través de la API {#manipulate-a-smart-contract-through-the-api} + +Esta sección describe los detalles para manipular un contrato inteligente a través de la API de Manticore Python. Se puede crear un nuevo archivo con la extensión python `*.py` y escribir el código necesario agregando los comandos API (los básicos que se describen a continuación) en este archivo y luego ejecutarlo con el comando `$ python3 *.py`. También puede ejecutar los siguientes comandos directamente en la consola python, ejecutando el comando `$ python3`. + +### Creación de cuentas {#creating-accounts} + +Lo primero es iniciar un nuevo blockchain con los siguientes comandos: + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() +``` + +Se crea una cuenta sin contrato con [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account): + +```python +user_account = m.create_account(balance=1000) +``` + +Se despliega un Solidity contract usando [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract): + +```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) +``` + +#### Resumen {#summary} + +- Puedes crear cuentas de usuario y contratos con [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) y [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract). + +### Ejecución de transacciones {#executing-transactions} + +Manticore admite dos tipos de transacción: + +- Transacción en bruto (raw): se exploran todas las funciones +- Transacción con nombre: solo se explora una función + +#### Transacción en bruto {#raw-transaction} + +La transacción en bruto se ejecuta usando [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction): + +```python +m.transaction(caller=user_account, + address=contract_account, + data=data, + value=value) +``` + +El invocante, la dirección, los datos o el valor de la transacción pueden ser tanto concretos como simbólicos: + +- [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) crea un valor simbólico. +- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) crea un array de bytes simbólico. + +Por ejemplo: + +```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) +``` + +Si los datos son simbólicos, Manticore explorará todas las funciones del contrato durante la ejecución de la transacción. Es útil ver la explicación de la función Fallback en el artículo [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) para entender cómo funciona la selección de funciones. + +#### Transacción con nombre {#named-transaction} + +Las funciones pueden ejecutarse a través de su nombre. Para ejecutar `f(uint var)` con un valor simbólico, de user_account y con 0 ether, use: + +```python +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var, caller=user_account, value=0) +``` + +Si `value` de la transacción no se especifica, es 0 por defecto. + +#### Resumen {#summary-1} + +- Los argumentos de una transacción pueden ser concretos o simbólicos +- Una transacción en bruto explorará todas las funciones +- La función puede ser llamada por su nombre + +### Workspace {#workspace} + +`m.workspace` es el directorio usado como directorio de salida para todos los archivos generados: + +```python +print("Results are in {}".format(m.workspace)) +``` + +### Terminar la exploración {#terminate-the-exploration} + +Para detener la exploración, use [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize). No se deben enviar más transacciones cuando se llama a este método, y Manticore genera casos de prueba para cada una de las rutas exploradas. + +### Resumen: ejecutar con Manticore {#summary-running-under-manticore} + +Reuniendo los pasos previos, obtenemos: + +```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("Results are in {}".format(m.workspace)) +m.finalize() # stop the exploration +``` + +Todo el código de arriba que encuentra en [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) + +## Obtener throwing paths {#getting-throwing-paths} + +Ahora generaremos entradas específicas para las rutas que plantean una excepción en `f()`. El objetivo sigue siendo el contrato inteligente [`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(); + } + } +} +``` + +### Uso de información de estado {#using-state-information} + +Cada ruta ejecutada tiene un estado en la cadena de bloques. Un estado está listo o es aniquilado, lo que significa que alcanza una instrucción THROW o REVERT: + +- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): la lista de estados que están listos (no ejecutaron un REVERT/INVALID) +- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): lista de estados aniquilados +- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): todos los estados + +```python +for state in m.all_states: + # do something with state +``` + +Puede acceder a la información de estado. Por ejemplo: + +- `state.platform.get_balance(account.address)`: el saldo de la cuenta +- `state.platform.transactions`: la lista de transacciones +- `state.platform.transactions[-1].return_data`: los datos devueltos por la última transacción + +Los datos devueltos por la última transacción son un array que puede convertirse en un valor con ABI.deserialize, por ejemplo: + +```python +data = state.platform.transactions[0].return_data +data = ABI.deserialize("uint", data) +``` + +### Cómo generar testcase {#how-to-generate-testcase} + +Use [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) para generar el testcase: + +```python +m.generate_testcase(state, 'BugFound') +``` + +### Resumen {#summary-2} + +- Se puede iterar sobre el estado con m.all_state +- `state.platform.get_balance(account.address)` devuelve el saldo de la cuenta +- `state.platform.transactions` devuelve la lista de transacciones +- `transaction.return_data` corresponde a los datos devueltos +- `m.generate_testcase(state, name)` genera entradas para el estado + +### Resumen: obtener Throwing Path {#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. reate_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account. (symbolic_var) + +## Comprobar si una ejecución termina con un REVERT o un INVALID +para el estado en m. erminated_states: + last_tx = state.platform. ransactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + print('Throw found {}'.format(m.workspace)) + m.generate_testcase (estate, 'ThrowFound') +``` + +Todo el código anterior que puede encontrar en el [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) + +_Note que podríamos haber generado un script mucho más simple, ya que todos los estados devueltos por terminated_state tienen REVERT o INVALID en su resultado: este ejemplo solo estaba destinado a demostrar cómo manipular la API._ + +## Adición de restricciones {#adding-constraints} + +Veremos cómo restringir la exploración. Supondremos que la documentación de `f()` indica que la función nunca es llamada con `a == 65`, así que cualquier error con `a == 65` no es un error real. El objetivo sigue siendo este contrato inteligente [`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(); + } + } +} +``` + +### Operadores {#operators} + +El módulo sobre [Operadores](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) facilita la manipulación de restricciones y provee, entre otras cosas: + +- Operators.AND, +- Operators.OR, +- Operators.UGT (sin firma mayores que), +- Operators.UGE (sin firma mayores que o iguales a), +- Operators.ULT (sin firma menores que), +- Operators.ULE (sin firma menores o iguales a). + +Para importar el módulo, use: + +```python +operadores de importación desde manticore.core.smtlib +``` + +`Operators.CONCAT` se usa para concatenar un array a un valor. Por ejemplo, el return_data de una transacción necesita cambiarse a un valor para ser comprobado contra otro valor: + +```python +last_return = Operadors.CONCAT(256, *last_return) +``` + +### Restricciones {#state-constraint} + +Puede usar restricciones globalmente o para un estado específico. + +#### Restricción global {#state-constraint} + +Use `m.constran(constraint)` para agregar una restricción global. Por ejemplo, puede llamar a un contrato desde una dirección simbólica y restringir esta dirección para que sean valores específicos: + +```python +symbolic_address = m.make_symbolic_value() +m.restricint(Operators.OR(simbólico == 0x41, symbolic_address == 0x42)) +m.transaction(caller=user_account, + address=contract_account, + data=m.make_symbolic_buffer(320), + value=0) +``` + +#### Restricción de estado {#state-constraint} + +Use [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) para añadir una restricción a un estado específico. Se puede usar para restringir el estado después de su exploración para verificar alguna propiedad en él. + +### Restricción de verificación {#checking-constraint} + +Use `solver.check(state.restricints)` para saber si una restricción todavía es viable. Por ejemplo, esto restringirá symbolic_value para que sea diferente de 65 y comprobará si el estado es todavía viable: + +```python +state.constrain(symbolic_var != 65) +if solver.check(state.restricints): + # el estado es factible +``` + +### Resumen: adición de restricciones {#summary-adding-constraints} + +Al añadir restricción al código anterior, se obtiene: + +```python +from manticore.ethereum import ManticoreEVM +from manticore.core.smtlib.solver import Z3Solver + +solver = Z3Solver. nstance() + +m = ManticoreEVM() + +con open("example.sol") as f: + source_code = f.read() + +user_account = m. reate_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m. ake_symbolic_value() +contract_account.f(symbolic_var) + +no_bug_found = True + +## Comprueba si una ejecución termina con un REVERT o un INVALID +para el estado en m. erminated_states: + last_tx = state.platform.transactions[-1] + if last_tx. esult en ['REVERT', 'INVALID']: + # no consideramos que la ruta sea un == 65 + condición = symbolic_var ! 65 + si m. enerate_testcase(state, name="BugFound", only_if=condition): + print(f'error encontrado, los resultados están en {m.workspace}') + no_bug_found = False + +if no_bug_found: + print(f'No se encontró error') +``` + +Todo el código anterior que se puede encontrar en [`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/es/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/es/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..72a3c492fe6 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -0,0 +1,238 @@ +--- +title: Cómo usar Slither para encontrar errores en contratos inteligentes +description: Cómo usar Manticore para encontrar errores automáticamente en contratos inteligentes +author: Trailofbits +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "seguridades" + - "pruebas" + - "análisis estático" +skill: advanced +published: 2020-06-09 +source: Desarrollando smart contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither +--- + +## Cómo usar Slither {#how-to-use-slither} + +El objetivo de este tutorial es mostrar cómo usar Slither para encontrar errores de manera automática en los contratos inteligentes. + +- [Instalación](#installation) +- [Uso de línea de comandos](#command-line) +- [Introducción al análisis estático](#static-analysis): breve introducción al análisis estático +- [API](#api-basics): descripción de la API de Python + +## Instalación {#installation} + +Slither usa Python >= 3.6. Puede ser instalado a traves de pip o usando docker. + +Slither a través de pip: + +```bash +pip3 install --user slither-analyzer +``` + +Slither a través de docker: + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox +``` + +_El comando de arriba ejecuta eth-security-toolbox en un docker que tiene acceso a su directorio actual. Puede cambiar los archivos desde su host y correr las herramientas dentro de los archivos desde el docker._ + +Dentro del docker, ejecute: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### Ejecución de un script {#running-a-script} + +Para ejecutar un script de python con python 3: + +```bash +python3 script.py +``` + +### Línea de comandos {#command-line} + +**Línea de comandos vs. scripts definidos por el usuario.** Slither viene con un conjunto de detectores predefinidos que encuentran muchos errores comunes. Al llamar a Slither desde la línea de comandos, se ejecutarán todos los detectores sin necesidad de tener conocimientos detallados de análisis estático: + +```bash +slither project_paths +``` + +Además de los detectores, Slither tiene capacidades de revisión de código por medio de [impresoras](https://github.com/crytic/slither#printers) y [herramientas](https://github.com/crytic/slither#tools). + +Use [crytic.io](https://github.com/crytic) para acceder a los detectores privados y a la integración con GitHub. + +## Análisis estático {#static-analysis} + +Las capacidades y el diseño del framework de análisis estático de Slither han sido descritos en entradas de blog ([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/)) y en un [documento académico](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf). + +El análisis estático existe en distintas formas. Lo más probable es que se dé cuenta de que compiladores como [clang](https://clang-analyzer.llvm.org/) y [gcc](https://lwn.net/Articles/806099/) dependen de estas técnicas de investigación, pero también sustenta ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) y herramientas basadas en métodos formales como [Frama-C](https://frama-c.com/) y [Polyspace](https://www.mathworks.com/products/polyspace.html). + +No vamos a repasar aquí en detalle las técnicas de análisis estático y el investigador. En cambio, nos centraremos en lo necesario para entender cómo funciona Slither y así poder utilizarlo de forma más eficaz para encontrar errores y entender el código. + +- [Representación del código](#code-representation) +- [Análisis de código](#analysis) +- [Representación intermedia](#intermediate-representation) + +### Representación del código {#code-representation} + +A diferencia del análisis dinámico, que se basa en una única ruta de ejecución, el análisis estático se basa en todas las rutas a la vez. Para ello, se basa en una representación de código diferente. Los dos más comunes son el árbol de sintaxis abstracta (AST) y el gráfico de flujo de control (CFG). + +### Árboles de sintaxis abstracta (AST) {#abstract-syntax-trees-ast} + +Los AST se utilizan cada vez que el compilador analiza el código. Es probablemente la estructura más básica sobre la que se puede realizar un análisis estático. + +En pocas palabras, un AST es un árbol estructurado en el que, normalmente, cada hoja contiene una variable o una constante, y los nodos internos son operadores u operaciones de flujo de control. Considere el siguiente código: + +```solidity +function safeAdd(uint a, uint b) pure internal returns(uint){ + if(a + b <= a){ + revert(); + } + return a + b; +} +``` + +El AST correspondiente se muestra en: + +![AST](./ast.png) + +Slither utiliza el AST exportado por solc. + +Si bien es sencillo de construir, el AST es una estructura anidada. A veces, esto no es lo más sencillo de analizar. Por ejemplo, para identificar las operaciones usadas por la expresión `a + b <= a`, primero debe analizarla `<=` y luego `+`. Un enfoque común es utilizar el llamado patrón de visitantes, que navega por el árbol recursivamente. Slither contiene un visitante genérico en [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py). + +El siguiente código utiliza `ExpressionVisitor` para detectar si la expresión contiene una adición: + +```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 is the expression to be tested +print(f'The expression {expression} has a addition: {visitor.result()}') +``` + +### Gráfico de flujo de control (CFG) {#control-flow-graph-cfg} + +La segunda representación de código más común es el gráfico de flujo de control (CFG). Como su nombre indica, es una representación basada en un gráfico que expone todas las rutas de ejecución. Cada nodo contiene una o varias instrucciones. Los bordes en el gráfico representan las operaciones de flujo de control (if/then/else, loop, etc). El CFG de nuestro ejemplo anterior es: + +![CFG](./cfg.png) + +El CFG es la representación sobre la que se construye la mayoría de los análisis. + +Existen muchas otras representaciones de código. Cada representación tiene ventajas y desventajas según el análisis que se quiera realizar. + +### Análisis {#analysis} + +El tipo de análisis más sencillo que se puede realizar con Slither es el análisis sintáctico. + +### Análisis de sintaxis {#syntax-analysis} + +Slither puede explorar los diferentes componentes del código y su representación para encontrar inconsistencias y defectos usando un enfoque del tipo coincidencia de patrones. + +Por ejemplo, los siguientes detectores buscan problemas relacionados con la sintaxis: + +- [Sombreado (shadowing) de variable de estado](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): itera sobre todas las variables de estado y verifica si hay sombra de una variable de un contrato heredado ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) + +- [Interfaz ERC20 incorrecta](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): busca firmas de funciones ERC20 incorrectas ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) + +### Análisis semántico {#semantic-analysis} + +En contraste con el análisis de sintaxis, un análisis semántico profundizará y analizará el “significado” del código. Esta familia incluye algunos amplios tipos de análisis. Conducen a resultados más potentes y útiles, pero también son más complejos de escribir. + +Los análisis semánticos se usan para las detecciones de vulnerabilidad más avanzadas. + +#### Análisis de dependencias de datos {#fixed-point-computation} + +Se dice que una variable `variable_a` tiene una dependencia de datos de `variable_b` si hay una ruta para la cual el valor de `variable_a` está influenciado por `variable_b`. + +En el siguiente código, `variable_a` depende de `variable_b`: + +```solidity +// ... +variable_a = variable_b + 1; +``` + +Slither viene con capacidades de [dependencia de datos](https://github.com/crytic/slither/wiki/data-dependency), gracias a su representación intermedia (se verá en una sección posterior). + +Se puede encontrar un ejemplo de uso de dependencia de datos en [detector de equidad estricta peligrosa](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities). Aquí Slither buscará una comparación estricta de equidad con un valor peligroso ([incorrec_strict_equality. y#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)) e informará al usuario que debe usar `>=` o `<=` en lugar de `==` para impedir que un atacante atrape el contrato. Entre otros, el detector considerará peligroso el valor de retorno de una llamada a `balanceOf(address)` ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)) y usará el motor de dependencias de datos para rastrear su uso. + +#### Cómputo de punto fijo {#fixed-point-computation} + +Si su análisis explora el CFG y sigue las aristas, o bordes, es probable que vea nodos ya visitados. Por ejemplo, si un bucle se presenta como se muestra a continuación: + +```solidity +for(uint i; i < range; ++){ + variable_a += 1 +} +``` + +Su análisis necesitará saber cuándo detenerse. Hay dos estrategias principales aquí: (1) iterar en cada nodo un número finito de veces, (2) calcular un _punto de fijación_. Un punto fijo, o fixpoint, básicamente significa que el análisis de este nodo no proporciona ninguna información significativa. + +Un ejemplo de punto fijo puede estar en los detectores de reentrada: Slither explora los nodos y busca llamadas externas, escribir y leer para almacenar. Una vez que haya alcanzado un punto fijo ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), detiene la exploración y analiza los resultados para ver si una reentrada está presente a través de diferentes patrones de reentrada ([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)). + +Escribir análisis utilizando un cálculo de punto fijo eficiente requiere una buena comprensión de cómo el análisis propaga su información. + +### Representación intermedia {#intermediate-representation} + +Una representación intermedia (IR) es un lenguaje que pretende ser más susceptible al análisis estático que el original. Slither traduce Solidity a su propio IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR). + +Entender SlithIR no es necesario si solo desea escribir comprobaciones básicas. Sin embargo, será útil si tiene pensado escribir análisis semánticos avanzados. Los resultados de [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) y [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa) le ayudarán a entender cómo se traduce el código. + +## Aspectos básicos de la API {#api-basics} + +Slither tiene una API que le permite explorar los atributos básicos del contrato y sus funciones. + +Para cargar una base de código: + +```python +from slither import Slither +slither = Slither('/path/to/project') + +``` + +### Exploración de contratos y funciones {#exploring-contracts-and-functions} + +Un objeto de `Slither` tiene: + +- `contracts (list(Contract)`: lista de contratos +- `contracts_derived (list(Contract)`: lista de contratos que no son heredados por otro contrato (subconjunto de contratos) +- `get_contract_from_name (str)`: retorna un contrato a partir de su nombre + +Un objeto `Contract` tiene: + +- `name (str)`: nombre del contrato +- `functions (list(Function))`: lista de funciones +- `modifiers (list(Modifier))`: lista de funciones +- `all_functions_called (list(Function/Modifier))`: lista de todas las funciones internas accesibles para el contrato +- `inheritance (list(Contract))`: lista de los contratos heredados +- `get_function_from_signature (str)`: retorna una función desde su firma +- `get_modifier_from_signature (str)`: retorna un modificador desde su firma +- `get_state_variable_from_name (str)`: retorna una StateVariable desde su nombre + +Una `Function` o un objeto `Modifier` tiene: + +- `name (str)`: nombre de la función +- `contract (contract)`: el contrato donde se declara la función +- `nodes (list(Node))`: lista de los nodos que componen el CFG de la función/modificador +- `entry_point (Node)`: punto de entrada del CFG +- `variables_read (list(Variable))`: lista de variables a leer +- `variables_written (list(Variable))`: lista de variables escritas +- `state_variables_read (list(StateVariable))`: lista de variables de estado a leer (subconjunto de variables a leer) +- `state_variables_written (list(StateVariable))`: lista de variables de estado escritas (subconjunto de variables escritas) diff --git a/public/content/translations/es/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/es/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md new file mode 100644 index 00000000000..d6744b8f702 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -0,0 +1,84 @@ +--- +title: Cómo configurar el contador como tu servidor +description: Una guía para comenzar a integrar el oráculo contador en tu protocolo +author: "Contador" +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "oráculos" +skill: beginner +published: 2021-06-29 +source: Documentos Tellor +sourceUrl: https://docs.tellor.io/tellor/ +--- + +Pregunta: Su protocolo esta casi terminado, pero necesita de un oracle para tener acceso a datos off-chain..¿Qué necesitas? + +## Prerrequisitos (fáciles) {#soft-prerequisites} + +Este post pretende hacer que el acceso a una alimentación de oráculo sea lo más directo y sencillo posible. Dicho esto, estamos asumiendo lo siguiente sobre tu nivel de habilidad de codificación para centrarnos en el aspecto del oráculo. + +Supuestos: + +- puedes navegar por un terminal +- tienes npm instalado +- sabes cómo usar npm para gestionar dependencias + +Tellor es un oráculo en vivo y de código abierto listo para su implementación. Esta guía para principiantes está aqui para demostrar la facilidad con la que uno puede implementar y poner en marchar Tellor, proporcionando a tu proyecto con un oracle completamente decentralizado y resistente a la censura. + +## Resumen {#overview} + +Tellor es un sistema de oráculo donde las partes pueden solicitar el valor de un punto de datos fuera de la cadena (ej. BTC/USD) y los mineros compiten para agregar este valor a un banco de datos en cadena, accesible por todos los contratos ingeligentes de Ethereum. Las entradas a este banco de datos están aseguradas por una red de mineros participativa. Tellor utiliza mecanismos de incentivos criptoeconómicos, recompensando las presentaciones honestas de datos de los mineros y castigando a los malos actores por medio de la emisión del token de Tellor, Tributes (TRB) y un mecanismo de disputa. + +En este tutorial abarcaremos: + +- Configurar el kit de herramientas inicial que necesitarás para ponerte en marcha. +- Pasar por un ejemplo sencillo. +- Listar las direcciones de la testnet de pruebas de redes en las que actualmente puedes probar Tellor. + +## Usando Tellor {#usingtellor} + +Lo primero que querrás hacer es instalar las herramientas básicas necesarias para usar Tellor como tu oráculo. Usa [este paquete](https://github.com/tellor-io/usingtellor) para instalar los Contratos de Usuario de Tellor: + +`npm install usingtellor` + +Una vez instalado esto permitirá a sus contratos heredar las funciones del contrato 'UsingTellor'. + +¡Genial! Ahora que las herramientas están listas, continuemos con un pequeño ejercicio donde solicitaremos el precio de bitcoin: + +### Ejemplo BTC/USD {#btcusd-example} + +Heredar el contrato de UsingTellor, pasando la dirección de Tellor como argumento constructor: + +Le mostramos un ejemplo: + +```solidity +import "usingtellor/contracts/UsingTellor.sol"; + +contract PriceContract is UsingTellor { + uint256 public btcPrice; + + //This Contract now has access to all functions 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)); + } +} +``` + +Para un listado completo de direcciones de contrato visite [aquí](https://docs.tellor.io/tellor/the-basics/contracts-reference). + +Para la facilidad de uso, el repositorio UsingTellor incluye una versión del contrato de[patio de juegos de Tellor](https://github.com/tellor-io/TellorPlayground) para una integración más fácil. Visite [aquí](https://github.com/tellor-io/sampleUsingTellor#tellor-playground) para un listado de funciones útiles. + +Para una implementación más robusta del oráculo de Tellor, revise el listado completo de funciones disponibles [aquí](https://github.com/tellor-io/usingtellor/blob/master/README.md). diff --git a/public/content/translations/es/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/es/developers/tutorials/interact-with-other-contracts-from-solidity/index.md new file mode 100644 index 00000000000..4a5dcdde355 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -0,0 +1,177 @@ +--- +title: Interactúe con otros contratos desde Solidity +description: Cómo implementar un contrato inteligente desde un contrato existente e interactuar con él +author: "jdourlens" +tags: + - "contratos inteligentes" + - "Solidity" + - "remix" + - "implementación" + - "capacidad de composición" +skill: advanced +lang: es +published: 2020-04-05 +source: EthereumDev +sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +En los tutoriales anteriores aprendimos mucho sobre [cómo implementar su primer contrato inteligente](/developers/tutorials/deploying-your-first-smart-contract/) y agregar algunas funciones como [control de acceso con modificadores](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) o [manejo de errores en Solidity](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/). En este tutorial aprenderemos cómo implementar un contrato inteligente desde un contrato existente e interactuar con él. + +Vamos a hacer un contrato que permita a cualquiera tener su propio contrato inteligente de `Counter` mediante la creación de una fábrica para tal propósito: se llamará `CounterFactory`. En primer lugar, aquí tenemos el código del contrato inteligente `Counter` inicial: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "You're not the owner of the contract"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "You need to use the factory"); + _; + } + + 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++; + } + +} +``` + +Tenga en cuenta que modificamos ligeramente el código del contrato para controlar la dirección de la fábrica y la dirección del contrato del propietario. Al hacer una llamada al código de un contrato desde otro contrato, msg.sender hará referencia a la dirección de la fábrica del contrato. Este es **un punto realmente importante que hay que entender**, ya que utilizar un contrato para interactuar con otros contratos es una práctica común. Por tanto, se debería prestar a atención a quién es el remitente en casos complejos. + +Por esta razón, también añadimos un modificador `onlyFactory` que se asegure de que la función de cambio de estado solo pueda ser invocada por la fábrica que pasará el invocador inicial como parámetro. + +Dentro de nuestro `CounterFactory` que administrará todos los demás Counters, agregaremos un mapeo que asociará a un propieatario con la dirección de este contrato de contador: + +```solidity +mapping(address => Counter) _counters; +``` + +En Ethereum, los mapeos, o mappings, son equivalentes a los objetos en JavaScript: permiten asociar una clave de tipo A a un valor de tipo B. En este caso, asociamos la dirección de un propietario con la instancia de su contador. + +La instanciación de un Contador nuevo para alguien se verá de la siguiente manera: + +```solidity + function createCounter() public { + require (_counters[msg.sender] == Counter(0)); + _counters[msg.sender] = new Counter(msg.sender); + } +``` + +Primero, revisaremos si la persona en cuestión ya es propietaria de un contador. Si ese no es el caso, instanciaremos un nuevo contador pasando su dirección al constructor de `Counter` y asignar la instancia recientemente creada al mapeo. + +Para obtener el conteo de un Contador específico, se verá así: + +```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)); +} +``` + +La primera función revisa si el contrato del Contador existe para una dirección proporcionada y luego llama al método `getCount` desde la instancia. La segunda función, `getMyCount`, es solo un extremo corto para pasar el msg.sender directamente a la función `getMyCount`. + +La función `increment` es bastante similar, pero pasa el emisor de la transacción original al contrato `Counter`: + +```solidity +function increment() public { + require (_counters[msg.sender] != Counter(0)); + Counter(_counters[msg.sender]).increment(msg.sender); + } +``` + +Note que si es llamado muchas veces, nuestro contador podría ser víctima del desbordamiento, u overflow. Debe usar la [biblioteca SafeMath](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) tanto como sea posible para evitar esta situación. + +Para implementar nuestro contrato, necesitará proporcionar el código de `CounterFactory` y el `Counter`. Al realizar la implementación, por ejemplo, en Remix, deberá seleccionar CounterFactory. + +Este es el código completo: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "You're not the owner of the contract"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "You need to use the factory"); + _; + } + + 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)); + } + +} +``` + +Luego de la compilación, en la sección de implementación de Remix, debe seleccionar la fábrica a implementar: + +![Seleccionar la fábrica a implementar en Remix](./counterfactory-deploy.png) + +Luego puede experimentar con su fábrica de contratos y revisar el valor cambiante. Si desea invocar el contrato inteligente desde una dirección diferente, necesitará cambiar la dirección en la selección de Cuenta en Remix. diff --git a/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md new file mode 100644 index 00000000000..dbb869a3ca0 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md @@ -0,0 +1,110 @@ +--- +title: Comience a desarrollar DApp frontend con create-eth-app +description: Un resumen de cómo usar create-eth-app y sus aplicaciones +author: "Markus Waas" +tags: + - "crear-eth-app" + - "interfaz" + - "javascript" + - "ethers.js" + - "The Graph" + - "defi" +skill: beginner +lang: es +published: 2020-04-27 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/create-eth-app +--- + +En el artículo anterior revisamos [el panorama global de Solidity](https://soliditydeveloper.com/solidity-overview-2020) y mencionamos [create-eth-app](https://github.com/PaulRBerg/create-eth-app). Ahora descubrirá como usarla y qué aplicaciones tiene integradas, además de otras ideas para ampliar su utilidad. Lanzada por Paul Razvan Berg, el fundador de [Sablier](http://sablier.com/), esta aplicación le permitirá comenzar su desarrollo en el frontend y tiene varias integraciones entre las que podrá seleccionar. + +## Instalación {#installation} + +La instalación requiere Yarn 0.25 o una versión más reciente (`npm install yarn --global`). Es tan simple como ejecutar: + +```bash +yarn create eth-app my-eth-app +cd my-eth-app +yarn react-app:start +``` + +Esto usa [create-react-app](https://github.com/facebook/create-react-app) implicitamente. Para ver su app, navegue a `http://localhost:3000/`. Cuando esté listo para empezar con la producción, cree un minipaquete con yarn build. Una posible opción para hospedar esta página es en [Netlify](https://www.netlify.com/). Puede crear un repositorio GitHub, añadirlo a Netlify, configurar el comando de build y ¡ya está! Tu app se hospedará y estará disponible para todos. ¡Y todo ello completamente gratis! + +## Características {#features} + +### React & create-react-app {#react--create-react-app} + +En primer lugar, el núcleo de la aplicación React y todas las características adicionales que provee _create-react-app_. Usar estas tecnologías de por sí es una gran alternativa, incluso si no quiere integrar Ethereum. [React](https://reactjs.org/) hace que construir una interfaz interactiva sea realmente sencillo. Quizá no sea tan fácil para los principiantes como [Vue](https://vuejs.org/), pero es el más usado, tiene más funcionalidades y lo más importante es que tiene miles de bibliotecas disponibles. _Create-react-app_ hace que comenzar sea muy sencillo, al incluir: + +- React, JSX, ES6, TypeScript, soporte para sintaxis de Flow. +- Funcionalidades adicionales de programación, como ES6 y posteriores como el operador «spread» para objetos. +- CSS con prefijo automático, para que no tengas que usar Webkit ni ningún otro prefijo. +- Un ejecutor de test unitarios rápido e interactivo con soporte por defecto para informes de cobertura. +- Un servidor de desarrollo que le advierte de errores frecuentes. +- Un script que empaqueta los JS, CSS y las imágenes para produccion, anadiendo hashes y sourcemaps. + +_Create-eth-app_ en concreto hace uso del nuevo [efecto «hooks»](https://reactjs.org/docs/hooks-effect.html). Este método permite escribir componentes funcionales muy pequenos y eficaces. En la sección Apollo más abajo, podrá ver cómo se utilizan en _create-eth-app_. + +### Espacios de trabajo de Yarn {#yarn-workspaces} + +[Los espacios de trabajo de Yarn](https://classic.yarnpkg.com/en/docs/workspaces/) le permiten tener varios paquetes, pero siendo capaz de gestionarlos todos desde la carpeta raíz e instalar dependencias para todos ellos a la vez usando `yarn install`. Esto cobra especial importancia en paquetes adicionales más pequeños, como los usados para gestionar direcciones de contratos inteligentes/ABI (dan información sobre dónde y qué contratos inteligentes implementó y cómo comunicarse con ellos) o la integración de gráficos. Ambos ejemplos son parte de `create-eth-app`. + +### ethers.js {#ethersjs} + +A pesar de que [Web3](https://docs.web3js.org/) es todavia la opcion más usada, [ethers.js](https://docs.ethers.io/) ha ido ganando terreno como alternativa en el último año y viene integrada en _create-eth-app_. Puede trabajar en ella, cambiarse a Web3 o tal vez plantearse el actualizar a [ethers.js v5](https://docs-beta.ethers.io/) que casi ha dejado de estar en beta. + +### The Graph {#the-graph} + +[GraphQL](https://graphql.org/) es una alternativa para manejar datos, en vez de la [API Restful](https://restfulapi.net/). Presenta varias ventajas frente a la API Restful, especialmente en lo referente a los datos de la cadena de bloques descentralizada. Si le interesa profundizar más al respecto, eche un vistazo a [GraphQL permitirá la web descentralizada](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). + +Normalmente, conseguirá los datos directamente de su contrato inteligente. ¿Quieres saber la hora de la última operación? Tan solo escriba `MyContract.methods.latestTradeTime().call()` que obtiene los datos de un nodo de Ethereum a su DApp. Pero, ¿qué pasa si se necesitan cientos de puntos de datos diferentes? Eso resultaría en centenares de solicitudes de datos al nodo, con su [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) cada una de ellas, lo que ralentizaría e inutiliaría a su DApp. Una alternativa sería instalar una función de obtención en su contrato que devuelva varios datos a la vez. Aunque no siempre es lo ideal. + +O también puede que le interese obtener datos históricos. Quiere saber no sólo la fecha de la última operación, sino también la de todas las operaciones que haya realizado alguna vez. Puede utilizar el paquete de subgrafo de _create-eth-app_, leer la [documentación](https://thegraph.com/docs/define-a-subgraph) y adaptarlo a sus propios contratos. Si busca contratos inteligentes populares, puede que incluso ya exista un subgrafo. Compruebe el [explorador de subgrafo](https://thegraph.com/explorer/). + +Una vez tenga un subgrafo, este le permitirá escribir una sencilla consulta en su DApp que recupera todos los datos importantes de la cadena de bloques, incluyendo los datos históricos que necesita, solo con activar esta funcionalidad una vez. + +### Apollo {#apollo} + +Gracias a la integración con [Apollo Boost](https://www.apollographql.com/docs/react/get-started/), puedes integrar fácilmente el grafo en tu dapp de React. Especialmente al usar [hooks de React y Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), obtener datos es tan sencillo como escribir una única consulta GraphQL en su componente: + +```js +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +## Plantillas {#templates} + +Además de eso, puede instalar numerosas plantillas. Hasta el momento, puede utilizar la integración con Aave, Compound, UniSwap o Sablier. Todos aportan importantes servicios con direcciones de contratos inteligentes, además de integraciones con subgrafos listos para utilizarse. Simplemente añada la plantilla al comando de creación, como `yarn create eth-app my-eth-app --with-template aave`. + +### Aave {#aave} + +[Aave](https://aave.com/) es un mercado descentralizado de préstamo de dinero. Los depositantes proporcionan liquidez al mercado a cambio de obtener ingresos pasivos, mientras que los prestatarios pueden pedir prestado con garantías. Una característica única de Aave son los [préstamos flash](https://docs.aave.com/developers/guides/flash-loans) que le permiten pedir prestado dinero sin ningún tipo de garantía, siempre y cuando lo devuelva en la siguiente transacción. Esto puede ser útil por ejemplo para tener dinero extra para transacciones de arbitrage. + +Los tókenes que le han reporado intereses se llaman _aTokens_. + +Cuando integra Aave con _create-eth-app_, ya obtiene una [integración de subgrafo](https://docs.aave.com/developers/getting-started/using-graphql) por defecto. Aave usa The Graph y le ofrece varios subgrafos listos para utilizarlos en [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) y la [red principal](https://thegraph.com/explorer/subgraph/aave/protocol) [con](https://thegraph.com/explorer/subgraph/aave/protocol) o [sin](https://thegraph.com/explorer/subgraph/aave/protocol-raw) formato. + +![Meme de préstamo Flash Aave – "Síííí, si pudiera mantener mi préstamo flash más de una transacción, sería genial"](./flashloan-meme.png) + +### Compound {#compound} + +[Compound](https://compound.finance/) es similar a Aave. La integración ya incluye el nuevo [subgrafo Compound v2](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Sorprendentemente, a los tókenes que pueden ganar intereses, aquí se les llama _cTokens_. + +### Uniswap {#uniswap} + +[Uniswap](https://uniswap.exchange/) es un sistema de intercambio descentralizado (DEX). Los usuarios que aporten liquidez pueden ganar comisiones, aportando los tókenes o el ether requeridos para ambos lados de una operación. Es de uso generalizado y, por lo tanto, tiene una de las mayores cantidades de liquidez para una gama muy amplia de tókenes. Puede integrarlo fácilmente en su DApp para, por ejemplo, permitir a los usuarios intercambiar sus ETH por DAI. + +Por desgracia, al cierre de editorial de este artículo, la integración es sólo para Uniswap v1 y no para el [v2 publicado recientemente](https://uniswap.org/blog/uniswap-v2/). + +### Sablier {#sablier} + +[Sablier](https://sablier.com/) le permite a los usuarios emitir pagos. En vez de un solo día de pago, puede recibir su dinero constantemente sin ninguna administración adicional después de la configuración inicial. La integración incluye su [propio subgrafo](https://thegraph.com/explorer/subgraph/sablierhq/sablier). + +## ¿Y ahora qué? {#whats-next} + +Si quiere hacer consultas sobre _create-eth-app_, diríjase al [servidor de la comunidad de Sablier](https://discord.gg/bsS8T47), donde puedes ponerse en contacto con los autores de _create-eth-app_. Como algunos de los próximos pasos que desee dar, es posible que quiera integrar un entorno de desarrollo de IU como [Material UI](https://material-ui.com/), escribir consultas GraphQL de los datos que necesite y preparar la implementación. diff --git a/public/content/translations/es/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/es/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md new file mode 100644 index 00000000000..cf78823addb --- /dev/null +++ b/public/content/translations/es/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -0,0 +1,272 @@ +--- +title: Aprende temas fundamentales de Ethereum con SQL +description: Este tutorial ayudara a los lectores a comprender conceptos fundamentales de Ethereum incluyendo transacciones, bloques y gas consultando datos en cadena con el lenguaje de consulta estructurada (SQL). +author: "Paul Apivat" +tags: + - "SQL" + - "Consultando" + - "Transacciones" +skill: beginner +lang: es +published: 2021-05-11 +source: paulapivat.com +sourceUrl: https://paulapivat.com/post/query_ethereum/ +--- + +Muchos tutoriales de Ethereum estan dirigidos a desarrolladores, pero hacen falta recursos educativos para analistas de datos o para personas que quieren ver datos on-chain sin tener que ejecutar un cliente o nodo. + +Este tutorial ayuda a los lectores a entender los conceptos fundamentals de Ethereum, incluyendo transacciones, bloques y gas consultando datos on-chain con el lenguaje de consulta estructurada (SQL) a través de una interfaz proporcionada por [Dune Analytics](https://dune.xyz/home). + +Los datos on-chain pueden ayudarnos a entender Ethereum, la red y como una económia para el poder compuacional y debería de servir como una base para entender los cambios a los que se enferenta Ethereum a dia de hoy (p.e. el aumento de los costos de gas) y, más importante, discuciones sobre soluciones de escalabilidad. + +### Transacciones {#transactions} + +El viaje de un usuario en Ethereum comienza con la inicialización de una cuenta controlada por el usuario o de una entidad con un saldo ETH. Hay dos tipos de cuentas - las controladas por los usuarios o un contrato inteligente (ver [ethereum.org](/developers/docs/accounts/)). + +Cualquier cuenta puede ser vista en un explorador de bloques como [Etherscan](https://etherscan.io/). Los exploradores de bloques son un portal a los datos de Ethereum. Muestran en tiempo real datos en bloques, transacciones, mineros, cuentas y otra actividad on-chain. (Ver [here](/developers/docs/data-and-analytics/block-explorers/)). + +De todos modos, un usuario puede desear consultar los datos directamente para conciliar la información brindada por los exploradores de bloques externos. [Dune Analytics](https://duneanalytics.com/) proporciona esta capacidad a cualquier persona con algún conocimiento de SQL. + +Para referencia, la cuenta de contrato Inteligente para la Fundación Ethereum (FE) puede consultarse en [Etherscan](https://etherscan.io/address/0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae). + +Una cosa a tener en cuenta es que todas las cuentas, incluidas las FE's, tienen una dirección pública que se puede utilizar para enviar y recibir transacciones. + +El saldo de la cuenta en Etherscan comprende transacciones regulares y transacciones internas. Las transacciones internas, a pesar de su nombre, no son _ transacciones reales_ que cambian el estado de la cadena. Son transferencias de valor iniciadas al ejecutar un contrato ([source](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions)). Dado que las transacciones internas no tienen firma, **no están** incluidas en la cadena de bloques y no se pueden consultar con Dune Analytics. + +Por lo tanto, este tutorial se centrará en las transacciones regulares. Esto puede ser consultado como tal: + +```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 +``` + +Esto generará la misma información que se proporciona en la página de transacciones de Etherscan. A modo de comparación, aquí están las dos fuentes: + +#### Etherscan {#etherscan} + +![](./etherscan_view.png) + +[Página de contratos de EF's en Etherscan.](https://etherscan.io/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) + +#### Dune Analytics {#dune-analytics} + +![](./dune_view.png) + +Puedes encontrar el panel [aquí](https://duneanalytics.com/paulapivat/Learn-Ethereum). Haz click en la tabla para ver el comando (también ver arriba). + +### Rompiendo transacciones {#breaking_down_transactions} + +Una transacción enviada incluye varias piezas de información incluyendo ([fuente](/developers/docs/transactions/)): + +- **Receptor**: La dirección receptora (identificada como "to") +- **Firma**: Mientras las claves privadas del emisor firman una transacción, lo que podemos consultar con SQL es la dirección pública del emisor ("from"). +- **Valor**: Esta es la cantidad de ETH transferida (ver la columna `ether`). +- **Datos**: Esta es la información arbitraria que ha sido troceada (ver la columna `data`) +- **LímiteDeGas**: Cantidad máxima de unidades de gas que puede consumir la transacción. Las unidades de gas representan pasos computacionales +- **maxPriorityFeePerGas**: la cantidad máxima de gas que se incluirá como recompensa para el minero +- **maxFeePerGas** - la cantidad máxima de gas que se pagará para la transacción (inclusiva de baseFeePerGas y maxPriorityFeePerGas) + +Podemos consultas esass piezas específicas de información para transacciones a la dirección pública de la Fundación Ethereum: + +```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 +``` + +### Bloques {#blocks} + +Cada transacción cambiará el estado de la máquina virtual de Ethereum ([EVM](/developers/docs/evm/)) ([fuente](/developers/docs/transactions/)). Las transacciones son transmitidas a la red para ser verificadas e incluidas en un bloque. Cada transacción es asociada con un número de bloque. Para ver la información, podemos consultar un número de bloque en específico: 12396854 (el bloque más reciente de las transacciones realizadas por la Fundación Ethereum al momento de escribir este artículo, 11/5/21). + +Además, cuando consultamos los dos siguientes bloques,podemos ver que cada bloque contiene el hash del anterior (ej: hash padre), ilustrando cómo la cadena de bloques es formada. + +Cada bloque contiene una referencia a su bloque padre. Esto es mostrado abajo entre las columnas de `hash` y `parent_hash` ([fuente](/developers/docs/blocks/)): + +![parent_hash](./parent_hash.png) + +Esta es la [consulta](https://duneanalytics.com/queries/44856/88292) en Dune Analytics: + +```sql +SELECT + time, + number, + hash, + parent_hash, + nonce +FROM ethereum."blocks" +WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856 +LIMIT 10 +``` + +Podemos examinar un bloque al consultar el tiempo, número de bloque, dificultad, hash, hash padre y el nonce. + +Lo único no cubierto por esta consulta es la _lista de transacción_, que requiere una consulta por separado abajo y el _estado raíz_. Un nodo completo o archivado almacenará todas las transacciones y estado de transiciones, permitiendo a los clientes consultar el estado de la cadena en cualquier momento. Porque esto requiere un espacio amplio, poremos separar la información de la cadena de la información del estado: + +- Información de la cadena (listado de bloques, transacciones) +- Información de estado (resultado del estado de transición de cada transacción) + +El estado de raíz falla en esto último y es información _implícita_ (no almacenada en la cadena), mientras la información de la cadena es explícita y almacenada en la propia cadena ([fuente](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored)). + +Para este tutorial, nos enfocaremos en la información en la cadena que _puede_ ser consultada con SQL a través de Dune Analytics. + +Como se mencionó anteriormente, cada bloque contiene un listado de transacciones, que podemos consultar al filtrar por un bloque en específico. Probaremos el bloque más reciente, 12396854: + +```sql +SELECT * FROM ethereum."transactions" +WHERE block_number = 12396854 +ORDER BY block_time DESC` +``` + +Aquí está el resultado de la consulta en Dune: + +![](./list_of_txn.png) + +Al este único bloque ser agregado a la cadena, cambia el estado de la máquina virtual de Ethereum ([EVM](/developers/docs/evm/)). A veces docenas o centenares de transacciones son verificadas a la vez. En este caso en específico, 222 transacciones se incluyeron. + +Para ver cuántas fueron exitosas, poremos agregar otro filtro al contador de transacciones exitosas: + +```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 +``` + +Para el bloque 12396854, de un total de 222 transacciones, 204 fueron verificadas con éxito: + +![](./successful_txn.png) + +Las solicitudes de transacciones ocurren docenas de veces por segundo, pero los bloques son consignados aproximadamente una vez cada 15 segundos ([fuente](/developers/docs/blocks/)). + +Para ver que hay un bloque producido aproximadamente cada 15 segundos, podemos tomar el número de segundos en un día (86400) dividido entre 15 para obtener un promedio estimado del número de bloques por día (~ 5760). + +El cuadro para los bloques de Ethereum producidos por día (2016 - presente) es: + +![](./daily_blocks.png) + +El número promedio de bloques producidos a diario durante este periodo es ~5,874: + +![](./avg_daily_blocks.png) + +Las consultas Sql son: + +```sql +# query to visualize number of blocks produced daily since 2016 + +SELECT + DATE_TRUNC('day', time) AS dt, + COUNT(*) AS block_count +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 + +# average number of blocks produced per day + +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 +``` + +El número promedio de bloques producidos por día desde 2016 es ligeramente superior que el número en 5,874. Alternativamente, dividiendo 86400 secundos por 5874 bloques promedio resulta en 14.7 segundos o aproximadamente un bloque cada 15 segundos. + +### Gas {#gas} + +Los bloques están delimitados en tamaño. El tamaño máximo de bloque es dinámico y varía de acuerdo a la demanda de la red entre 12,500,000 y 25,000,000 unidades. Los límites son requeridos para prevenir arbitrariamente los tamaños largos de bloques, lo que estresa a los nodos completos en términos de espacio en disco y requisitos de velocidad ([fuente](/developers/docs/blocks/)). + +Una manera de conceptualizar el límite de gas de un bloque es pensar en esto como el **suministro** de espacio de bloques disponible en las transacciones grupales. El límite de gas de los bloques puede ser consultado y visualizado desde 2016 hasta el presente: + +![](./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 +``` + +Entonces ahí está el gas actual utilizado a diario para pagar por la computación realizada en la cadena de Ethereum (ej: enviando transacciones, llamando un contrato inteligente, minteando un NFT). Esta es la **demanda** para el espacio de bloques disponibles en Ethereum: + +![](./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 +``` + +También podemos yuxtaponer estos dos gráficos juntos para ver cómo **la demanda y el suministro** se alínean: + +![gas_demand_supply](./gas_demand_supply.png) + +Por lo tanto, podemos comprender el precio de gas como una función de demanda para el espacio de bloques de Ethereum, de acuerdo al suministro disponible. + +Finalmente, puede que queramos consultar el promedio diario del precio de gas para la cadena de Ethereum, sin embargo, hacerlo puede resultar en un tiempo especialmente largo de consulta, por lo que filtraremos nuestra consulta a la cantidad promedio de gas pagado por transacción por la Fundación Ethereum. + +![](./ef_daily_gas.png) + +Podemos ver los precios de gas pagados por todas las transacciones hechas a la dirección de la Fundación Ethereum a lo largo de los años. Aquí está la consulta: + +```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 +``` + +### Resumen {#summary} + +Con este tutorial, compremdemos los conceptos fundamentales de Ethereum y cómo funciona el blockchain de Ethereum consultando y obteniendo una idea de datos on-chain. + +El panel que contiene todo el código utilizado en este tutorial se puede encontrar [aquí](https://duneanalytics.com/paulapivat/Learn-Ethereum). + +Para más usos de datos para explorar web3 [encuéntrame en Twitter](https://twitter.com/paulapivat). diff --git a/public/content/translations/es/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/es/developers/tutorials/logging-events-smart-contracts/index.md new file mode 100644 index 00000000000..158b27cb8a4 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/logging-events-smart-contracts/index.md @@ -0,0 +1,66 @@ +--- +title: Registrar datos de contratos inteligentes con eventos +description: Una introducción eventos en contratos inteligentes y cómo pueden utilizarse para registrar datos. +author: "jdourlens" +tags: + - "contratos inteligentes" + - "remix" + - "solidity" + - "eventos" +skill: intermediate +lang: es +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/logging-data-with-events/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +En Solidity, los contratos inteligentes pueden envíar [eventos](/developers/docs/smart-contracts/anatomy/#events-and-logs). Las DApps o cualquier aplicación conectada a la API JSON-RPC de Ethereum, puede escuchar estos eventos y obrar según corresponda. El evento también puede indexarse, para que el historial de eventos se pueda buscar más adelante. + +## Eventos {#events} + +El evento más común en la cadena de bloques de Ethereum en el cierre de redacción de este artículo es el evento de transferencia que emiten los tókenes ERC20 cuando alguien transfiere tókenes. + +```solidity +event Transfer(address indexed from, address indexed to, uint256 value); +``` + +La firma del evento se declara dentro del código del contrato y se puede emitir con la palabra clave emitida. Por ejemplo, el evento de transferencia registra quién envió la transferencia (_de_), a quién (_para_) y cuántos tókenes se transfirieron (_valor_). + +Si regresamos a nuestro programa contador del contrato inteligente y decidimos registrar el valor cada vez que cambie. Dado que este contrato no pretende ejecutarse, sino que sirve de base para construir otro contrato ampliándolo, se le llama contrato abstracto. En el caso de nuestro ejemplo de contador, sería de la manera siguiente: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + event ValueChanged(uint oldValue, uint256 newValue); + + // Private variable of type unsigned int to keep the number of counts + uint256 private count = 0; + + // Function that increments our counter + function increment() public { + count += 1; + emit ValueChanged(count - 1, count); + } + + // Getter to get the count value + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +Tenga en cuenta que: + +- **Línea 5**: declaramos nuestro evento y su contenido, el valor antiguo y el nuevo. + +- **Línea 13**: cuando incrementamos nuestra variable de conteo, emitimos el evento. + +Si ahora desplegamos el contrato y seleccionamos la función de incremento, veremos que Remix lo mostrará automáticamente, si hace clic en la nueva transacción dentro de los registros con nombre. + +![Captura de pantalla de Remix](./remix-screenshot.png) + +Los registros son realmente útiles a la hora de depurar sus contratos inteligentes, pero también son importantes si construye aplicaciones utilizadas por diferentes personas. También facilitan los análisis para averiguar y entender cómo se utiliza su contrato inteligente. Los registros generados por transacciones se muestran en exploradores de bloques populares y también puede utilizarlos, por ejemplo, para crear scripts fuera de la cadena para escuchar eventos específicos y emprender acciones cuando ocurran. diff --git a/public/content/translations/es/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/es/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md new file mode 100644 index 00000000000..c0b55391e78 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -0,0 +1,241 @@ +--- +title: Pruebas de Merkle para la integridad de los datos fuera de línea +description: Asegurar la integridad de los datos en la cadena para los datos que se almacenan, sobre todo, fuera de la cadena. +author: Ori Pomerantz +tags: + - "almacenamiento" +skill: advanced +lang: es +published: 2021-12-30 +--- + +## Introducción {#introduction} + +Idóneamente, nos gustaría guardar todo en el almacenamiento de Ethereum, el cual se guarda en miles de computadoras y tiene una disponibilidad extremadamente alta (los datos no pueden ser censurados) e integridad (los datos no pueden ser modificados de una manera no autorizada), sin embargo almacenar una palabra de 32 bytes suele costar 20.000 gas. En el momento de redactar este artículo, el coste actual es de 6,60 $. A 21 centavos por byte esto es demasiado costoso para muchos usos. + +Para resolver este problema, el ecosistema de Ethereum desarrolló [muchas formas alteranativas de almacenar datos de una manera decentralizada](/developers/docs/storage/). Usualmente involucran compensar entre disponibilidad y precio. Sin embargo, normalmente se asegura la integridad. + +En este artículo, descubrirá **cómo** asegurar la integridad de los datos sin almacenar los datos en la cadena de bloques, usando [Pruebas de Merkle](https://computersciencewiki.org/index.php/Merkle_proof). + +## ¿Cómo funciona? {#how-does-it-work} + +En teoría podríamos almacenar el hash de los datos en cadena y enviar todos los datos en transacciones que lo requieran. No obstante, sigue siendo demasiado caro. Un byte de data a una transacción cuesta alrededor de 16 gas, actualmente cerca de medio centavo, o aproximadamente 5 dólares por kilobyte. A 5.000 $ por megabyte, esto sigue siendo demasiado caro para muchos usos, incluso sin el coste añadido de acelerar los datos. + +La solución consiste en acelerar repetidamente diferentes subconjuntos de los datos, de forma que para los datos que no necesite enviar, pueda simplemente enviar un hash. Esto se hace utilizando un árbol Merkle, una estructura de datos en arbol donde cada nodo es un hash de los nodos debajo: + +![Árbol de Merkle](tree.png) + +El hash en la raíz es la única parte que necesita almacenarse en cadena. Para demostrar un determinado valor, proporcione todos los hash que necesitan combinarse con él para obtener la raíz. Por ejemplo, para probar `C` proporcionas `D`, `H(A-B)`y `H(E-H)`. + +![Prueba del valor de C](proof-c.png) + +## Implementación {#implementation} + +[El código de muestra se proporciona aquí](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity). + +### Código fuera de la cadena {#off-chain-code} + +En este artículo, utilizamos JavaScript para los cálculos fuera de la cadena. La mayoría de las aplicaciones descentralizadas tienen su componente fuera de la cadena en JavaScript. + +#### Crear la raíz de Merkle {#creating-the-merkle-root} + +Primero necesitamos proporcionar la raíz de Merkle a la cadena. + +```javascript +const ethers = require("ethers") +``` + +[Utilizamos la función hash del paquete ethers](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256). + +```javascript +// The raw data whose integrity we have to verify. The first two bytes a +// are a user identifier, and the last two bytes the amount of tokens the +// user owns at present. +const dataArray = [ + 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, + 0xface0070, 0xbad00080, 0x060d0091, +] +``` + +Codificar cada entrada en un único entero de 256 bits resulta en un código menos legible que el de JSON, por ejemplo. Sin embargo, esto significa un procesamiento significativamente menor para recuperar los datos en el contrato, unos costes de gas mucho menores. [Puede leer JSON en la cadena](https://github.com/chrisdotn/jsmnSol), aunque no es muy aconsejable, si se puede evitar. + +```javascript +// The array of hash values, as BigInts +const hashArray = dataArray +``` + +En este caso para empezar nuestros datos son valores de 256 bits, por que no se necesita ningún procesamiento. Si utilizamos una estructura de datos más compleja, como cadenas, necesitamos asegurarnos de que hacemos hash los datos primero para obtener una matriz de hashes. Tenga en cuenta que esto también es porque no nos importa que los usuarios conozcan la información de otros usuarios. De lo contrario, habríamos tenido que hacer hash para que el usuario 1 no sepa el valor para el usuario 0, el usuario 2 no sabrá el valor del usuario 3, etc. + +```javascript +// Convert between the string the hash function expects and the +// BigInt we use everywhere else. +const hash = (x) => + BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) +``` + +La función hash de ethers espera obtener una cadena de JavaScript con un número hexadecimal, como `0x60A7`, y responde con otra cadena con la misma estructura. Sin embargo, para el resto de código es más fácil usar `BigInt`, para convertir a una cadena hexadecimal y viceversa. + +```javascript +// Symmetrical hash of a pair so we won't care if the order is reversed. +const pairHash = (a, b) => hash(hash(a) ^ hash(b)) +``` + +Esta función es simétrica (hash de un [xor](https://en.wikipedia.org/wiki/Exclusive_or) b). Esto significa que cuando revisamos la prueba de Merkle no debemos preocuparnos sobre si el valor de la prueba debe ser colocado antes o después del valor calculado. La revisión de la prueba de Merkle se realiza en la cadena, así que cuanto menos necesitemos hacer, mejor. + +Advertencia: la criptografía es más complicada de lo que parece. La versión inicial de este artículo tuvo la función de hash `hash(a^b)`. Y no muy nada **atinado**, porque esto significaba que si conocía los valores legítimos de `a` y `b`, podría usar `b' = a^b^a'` para probar cualquier valor deseado de `a'`. Con esta función tendrías que calcular `b'` tal que `hash(a') ^hash(b')` es igual a un valor conocido (la siguiente rama en el camino a la raíz), lo que es más difícil. + +```javascript +// The value to denote that a certain branch is empty, doesn't +// have a value +const empty = 0n +``` + +Cuando el número de valores no es un entero potencia de dos, necesitamos manejar ramas vacías. La manera en que este programa lo hace es colocando cero como marcador de posición. + +![Árbol Merkle con ramas faltantes](merkle-empty-hash.png) + +```javascript +// Calculate one level up the tree of a hash array by taking the hash of +// each pair in sequence +const oneLevelUp = (inputArray) => { + var result = [] + var inp = [...inputArray] // To avoid over writing the input // Add an empty value if necessary (we need all the leaves to be // paired) + + 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 +``` + +La función «escala» un nivel en el árbol Merkle al hacer hash de los pares de valores en la capa actual. Observe que esta no es la implementación más eficiente, porque podríamos haber evitado copiar el resultado y solo añadir `hashEmpty` cuando sea apropiado en el bucle, pero este código está optimizado para una mejor lectura. + +```javascript +const getMerkleRoot = (inputArray) => { + var result + + result = [...inputArray] // Climb up the tree until there is only one value, that is the // root. // // If a layer has an odd number of entries the // code in oneLevelUp adds an empty value, so if we have, for example, // 10 leaves we'll have 5 branches in the second layer, 3 // branches in the third, 2 in the fourth and the root is the fifth + + while (result.length > 1) result = oneLevelUp(result) + + return result[0] +} +``` + +Para obtener la raíz, escalamos hasta que solo quede un valor. + +#### Cómo crear una prueba de Merkle {#creating-a-merkle-proof} + +Una prueba de Merkle son los valores que se mezclan junto con el valor que se demuestra para recuperar la raíz de Merkle. Por lo general, el valor para probar está disponible a partir de otros datos, por eso prefiero proporcionarlo de manera separada, en vez de como una parte del código. + +```javascript +// A merkle proof consists of the value of the list of entries to +// hash with. Because we use a symmetrical hash function, we don't +// need the item's location to verify the proof, only to create it +const getMerkleProof = (inputArray, n) => { +    var result = [], currentLayer = [...inputArray], currentN = n + +    // Until we reach the top +    while (currentLayer.length > 1) { +        // No odd length layers +        if (currentLayer.length % 2) +            currentLayer.push(empty) + +        result.push(currentN % 2 +               // If currentN is odd, add with the value before it to the proof +            ? currentLayer[currentN-1] +               // If it is even, add the value after it +            : currentLayer[currentN+1]) + +``` + +Unimos `(v[0],v[1])`, `(v[2],v[3])`, etc. Encontes, para valores pares necesitamos el siguiente, y para valores impares, el anterior. + +```javascript +        // Move to the next layer up +        currentN = Math.floor(currentN/2) +        currentLayer = oneLevelUp(currentLayer) +    }   // while currentLayer.length > 1 + +    return result +}   // getMerkleProof +``` + +### Código en la cadena {#on-chain-code} + +Por último, tenemos el código que comprueba la prueba. El código en la cadena se escribe en [Solidity](https://docs.soliditylang.org/en/v0.8.11/). La optimización es más importante aquí porque el gas es relativamente caro. + +```solidity +//SPDX-License-Identifier: Public Domain +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; +``` + +Escribí esto usando el [entorno de desarrollo Hardhat](https://hardhat.org/), que nos permite tener [resultados de la consola desde Solidity](https://hardhat.org/tutorial/debugging-with-hardhat-network.html) mientras desarrollamos. + +```solidity + +contract MerkleProof { +    uint merkleRoot; + +    function getRoot() public view returns (uint) { +      return merkleRoot; +    } + +    // Extremely insecure, in production code access to +    // this function MUST BE strictly limited, probably to an +    // owner +    function setRoot(uint _merkleRoot) external { +      merkleRoot = _merkleRoot; +    }   // setRoot +``` + +Establecer y obtener funciones para la raíz de Merkle. Permitir que cualquiera actualice la raíz de Merkle es una _idea totalmente desaconsejable_ en un sistema de producción. Aquí lo hago con el objetivo de la simplicidad en el código de ejemplo. **No lo haga en un sistema donde la integridad de los datos realmente importe**. + +```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)); +    } +``` + +Esta función genera un par hash. Solo es la traducción de Solidity del código de JavaScript para `hash` y `pairHash`. + +**Nota**: Este es otro caso de optimización para la lectura. Basado en la [definición de función](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm), es posible almacenar los datos como un valor [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) y evitar las conversiones. + +```solidity +    // Verify a Merkle proof +    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 +``` + +En notación matemática, la verificación de prueba de Merkle dice así: `H(proof_n, H(proof_n-1, H(proof_n-2, ... H(proof_1, H(proof_0, value))...)))`. Este código lo implementa. + +## Las pruebas de Merkle y los rollups no se mezclan {#merkle-proofs-and-rollups} + +Las pruebas de Merkle no funcionan bien con las acumulaciones o [rollups](/developers/docs/scaling/#rollups). La razón es que los rollups escriben todos los datos de la transacción en L1, pero los procesa en L2. El costo de enviar una prueba de Merkle con una transacción se promedia en 638 de gas por capa (actualmente, un byte en un llamado de datos cuesta 16 de gas si es diferente a cero y 4 si es cero). Si tenemos 1024 palabras de datos, una prueba de Merkle requiere diez capas o un total de 6380 de gas. + +Veamos como ejemplo a [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m), escribir L1 cuesta alrededor de 100 gwei en gas y L2 cuesta 0,001 gwei en gas (ese es un precio normal, puede aumentar con la congestión). Entonces para el coste de un gas L1 podemos gastar mil de gas en L2. Asumiendo que no hemos sobrescrito el almacenamiento, esto significa que podemos escribir alrededor de cinco palabras en el almacenamiento en L2 para el precio de un gas L1. Para una única prueba de Merkle podemos escribir el total de 1.024 palabras en el almacenamiento (asimiendo que se pueden calcular en la cadena para empezar, en vez de proporcionarlas en la transacción) y todavía tenemos la mayoría del gas restante. + +## Conclusión {#conclusion} + +En la vida real puede que nunca implemente árboles de Merkle por su cuenta. Hay bibliotecas bien conocidas y auditadas que puede utilizar y, por lo general, es mejor no implementar criptográficos primitivos por su cuenta. Pero espero que ahora comprenda mejor las pruebas de Merkle y pueda decidir cuándo es mejor usarlas. + +Note que mientras las pruebas de Merkle preservan la _integridad_, no preservan la _disponibilidad_. Saber que nadie puede adueñarse de sus activos es una pequeña consolación si el almacenamiento de datos decide desactivar el acceso y no puede construir un árbol de Merkle para acceder a estos. Por tanto, es mejor usar los árboles de Merkle con algún tipo de almacenamiento descentralizado, como IPFS. diff --git a/public/content/translations/es/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/es/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md new file mode 100644 index 00000000000..c07d326fc07 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -0,0 +1,147 @@ +--- +title: Monitoreando Geth con InfluxDB y Grafana +description: +author: "Mario Havel" +tags: + - "clientes" + - "nodos" +skill: intermediate +lang: es +published: 2021-01-13 +--- + +Este tutorial le ayudará a configurar el monitoreo de su nodo Geth para que pueda comprender mejor su rendimiento e identificar problemas potenciales. + +## Pre requisitos {#prerequisites} + +- Ya deberías estar ejecutando una instancia de Geth. +- La mayoría de los pasos y ejemplos son para el entorno linux, el conocimiento básico de la terminal será útil. +- Echa un vistazo a este video resumen del conjunto de métricas de Geth: [Monitorización de una infraestructura Ethereum por Péter Szilágyi](https://www.youtube.com/watch?v=cOBab8IJMYI). + +## Monitorización {#monitoring-stack} + +Un cliente de Ethereum recopila muchos datos que pueden ser leídos en forma de una base de datos cronológica. Para facilitar el monitoreo, usted puede alimentar esto en software de visualización de datos. Hay varias opciones disponibles: + +- [Prometheus](https://prometheus.io/) (pull model) +- [InfluxDB](https://www.influxdata.com/get-influxdb/) (modelo push) +- [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/) + +También hay [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter), una opción preconfigurada con InfluxDB y Grafana. Puedes configurarlo fácilmente usando docker y [Ethbian OS](https://ethbian.org/index.html) para RPi 4. + +En este tutorial configuraremos su cliente Geth para enviar datos a InfluxDB para crear una base de datos y Grafana para crear una visualización gráfica de los datos. Hacerlo manualmente le ayudará a entender el proceso mejor, modificarlo, e implementarlo en diferentes entornos. + +## Configurando InfluxDB {#setting-up-influxdb} + +Primero, vamos a descargar e instalar InfluxDB. Varias opciones de descarga se pueden encontrar en [Influxdata release page](https://portal.influxdata.com/downloads/). Elige el que se adapte a tu entorno. También puede instalarlo desde un [repositorio](https://repos.influxdata.com/). Por ejemplo en la distribución basada en Debian: + +``` +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 +``` + +Después de instalar InfluxDB, asegúrese de que se está ejecutando en segundo plano. Por defecto, es accesible en `localhost:8086`. Antes de usar el cliente `influx`, tienes que crear un nuevo usuario con privilegios de administrador. Este usuario servirá para una gestión de alto nivel, creando bases de datos y usuarios. + +``` +curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES" +``` + +Ahora puede utilizar el cliente influx para ingresar [InfluxDB shell](https://docs.influxdata.com/influxdb/v1.8/tools/shell/) con este usuario. + +``` +influx -username 'username' -password 'password' +``` + +Directamente comunicándose con InfluxDB en su shell, puede crear bases de datos y usuario para las métricas geth. + +``` +create database geth +create user geth with password choosepassword +``` + +Verificar entradas creadas con: + +``` +show databases +show users +``` + +Deja el shell de InfluxDB. + +``` +exit +``` + +InfluxDB se está ejecutando y configurado para almacenar métricas de Geth. + +## Preparando Geth {#preparing-geth} + +Después de configurar la base de datos, necesitamos habilitar la recolección de métricas en Geth. Presta atención a `METRICS AND STATS OPTIONS` en `geth --help`. Se pueden encontrar múltiples opciones, en este caso queremos que Geth envíe datos a InfluxDB. La configuración básica especifica el endpoint donde InfluxDB es accesible y la autenticación para la base de datos. + +``` +geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword" +``` + +Estos parámetros pueden ser añadidos a un comando que inicia el cliente o guardados en el archivo de configuración. + +Puede verificar que Geth está enviando datos con éxito, por ejemplo listando métricas en la base de datos. Deja el shell de InfluxDB: + +``` +use geth +show measurements +``` + +## Configurando Grafana {#setting-up-grafana} + +El siguiente paso es instalar Grafana que interpretará los datos gráficamente. Siga el proceso de instalación para su entorno en la documentación de Grafana. Asegúrese de instalar la versión OSS si no desea otra cosa. Ejemplo de pasos de instalación para las distribuciones de Debian utilizando el repositorio: + +``` +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 +``` + +Cuando tengas a Grafana funcionando, debería ser accesible en `localhost:3000`. Utilice su navegador preferido para acceder a esta ruta, luego inicie sesión con las credenciales predeterminadas (usuario: `admin` y contraseña: `admin`). Cuando se le solicite, cambie la contraseña por defecto y guárdela. + +![](./grafana1.png) + +Serás redirigido a la página principal de Grafana. Primero, configura tus datos de origen. Haga clic en el icono de configuración de la barra izquierda y seleccione "Fuentes de datos". + +![](./grafana2.png) + +No hay ninguna fuente de datos creada todavía, haga clic en "Añadir fuente de datos" para definir una. + +![](./grafana3.png) + +Para esta configuración, seleccione "InfluxDB" y proceda. + +![](./grafana4.png) + +La configuración de la fuente de datos es bastante directa si está ejecutando herramientas en la misma máquina. Necesita configurar la dirección de InfluxDB y los detalles para acceder a la base de datos. Consulte la siguiente imagen. + +![](./grafana5.png) + +Si todo está completado e InfluxDB es alcanzable, haga click en "Save and test" y espere que se muestre la confirmación. + +![](./grafana6.png) + +Grafana ahora está configurado para leer datos de InfluxDB. Ahora necesitas crear un panel que se encargará de interpretarla y mostrarla. Las propiedades de los paneles están codificados en archivos JSON que pueden ser creados por cualquier persona y fácilmente importados. En la barra lateral, haga click en "Create and Import". + +![](./grafana7.png) + +Para un panel de monitoreo de Geth, copie el ID de [este panel](https://grafana.com/grafana/dashboards/13877/) y péguelo en la "página de Importación" de Grafana. Luego de guardar el panel, debería verse así: + +![](./grafana8.png) + +Puedes modificar tus paneles. Cada panel puede ser editado, movido, removido o agregado. Puedes cambiar tus configuraciones. ¡Tú decides! Para leer más sobre el funcionamiento de los paneles, consulte la [documentación de Grafana](https://grafana.com/docs/grafana/latest/dashboards/). También puede que muestres interés en [Alerting](https://grafana.com/docs/grafana/latest/alerting/). Esto te permite configurar notificaciónes de alertas para cuando las métricas alcancen ciertos valores. Varios canales de comunicación están soportados. diff --git a/public/content/translations/es/developers/tutorials/nft-minter/index.md b/public/content/translations/es/developers/tutorials/nft-minter/index.md new file mode 100644 index 00000000000..9ce858d109e --- /dev/null +++ b/public/content/translations/es/developers/tutorials/nft-minter/index.md @@ -0,0 +1,874 @@ +--- +title: Tutorial de minteador de NFT +description: En este tutorial, creará un minteador de NFT y aprenderá cómo crear una dapp de pila completa conectando su contrato inteligente a un frontend de React por medio de Metamask y herramientas web3. +author: "smudgil" +tags: + - "solidity" + - "NFT" + - "alchemy" + - "contratos inteligentes" + - "frontend" + - "Pinata" +skill: intermediate +lang: es +published: 2021-10-06 +--- + +Uno de los mayores desafíos para los desarrolladores que vienen de un entorno web2 es averiguar cómo conectar su contrato inteligente a un proyecto de frontend e interactuar con él. + +Creando un minteador de NFT —una interfaz de usuario sencilla donde puede introducir un enlace a su activo digital, un título y una descripción—, aprenderá como: + +- Establecer conexión con MetaMask a través del proyecto de frontend +- Invocar métodos de contrato inteligente desde su frontend +- Firmar transacciones usando MetaMask + +En este tutorial, usaremos [React](https://reactjs.org/) como framework de frontend. Debido a que este tutorial se centra principalmente en el desarrollo web3, no vamos a dedicar mucho tiempo a profundizar en los fundamentos de React. En su lugar, nos enfocaremos en aportar funcionalidad a nuestro proyecto. + +Como requisito previo, debe tener una comprensión básica de React, es decir, cómo funcionan los componentes, props, useState/useEffect y las llamadas a funciones básicas. Si nunca ha oído hablar de alguno de esos términos antes, tal vez quiera revisar este [tutorial de introducción a React](https://reactjs.org/tutorial/tutorial.html). Para los alumnos más visuales, recomendamos encarecidamente esta excelente serie de videos [Tutorial completo de React moderno](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) de Net Ninja. + +Y si aún no lo ha hecho, definitivamente necesitará una cuenta de Alchemy para completar este tutorial, así como crear cualquier cosa en la cadena de bloques. Regístrese para obtener una cuenta gratuita [aquí](https://alchemy.com/). + +Sin más preámbulos, ¡comencemos! + +## Aspectos básicos sobre creación de NFT {#making-nfts-101} + +Antes de incluso empezar a experimentar con el código, es importante entender se qué se trata crear un NFT. Implica dos pasos: + +### Publicar un contrato inteligente de NFT en la cadena de bloques de Ethereum {#publish-nft} + +La mayor diferencia entre los dos estándares de contrato inteligente de NFT es que ERC-1155 es un estándar multitoken e incluye funcionalidad por lotes, mientras que ERC-721 es un estándar de un solo token, por lo tanto solo permite la transferencia de un token a la vez. + +### Invocar la función de minteo {#minting-function} + +Generalmente, esta función de minteo requiere pasar dos variables como parámetros, primero el `recipient`, que especifica la dirección que recibirá su NFT recién minteado, y luego el `tokenURI` del NFT, una cadena que resuelve a un documento JSON que describe los metadatos del NFT. + +Los metadatos de un NFT son realmente lo que le dan vida, permitiéndole tener propiedades como nombre, descripción, imagen (o un activo digital diferente) y otros atributos. Este es un [ejemplo de un tokenURI](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2), el cual contiene los metadatos de un NFT. + +En este tutorial, vamos a centrarnos en la parte 2, donde invocaremos la función de minteo de un contrato inteligente de NFT existente utilizando nuestra interfaz de usuario de React. + +[Aquí hay un enlace](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) al contrato inteligente de NFT ERC-721 que invocaremos en este tutorial. Si quiere aprender cómo lo hicimos, le recomendamos que revise nuestro otro tutorial [Cómo crear un NFT](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft). + +Bien, ahora que entendemos cómo es crear un NFT, ¡clonemos nuestros archivos de inicio! + +## Clone los archivos de inicio {#clone-the-starter-files} + +Primero, vaya al [repositorio de GitHub nft-minter-tutorial](https://github.com/alchemyplatform/nft-minter-tutorial) para obtener los archivos de inicio de este proyecto. Clone este repositorio en su entorno local.= + +Cuando abra el repositorio clonado `nft-minter-tutorial`, notará que contiene dos carpetas: `minter-starter-files` y `nft-minter`. + +- `minter-starter-files` contiene los archivos de inicio (esencialmente la interfaz de usuario de React) para este proyecto. En este tutorial, **trabajaremos en este directorio** para que vea cómo dar vida a esta UI conectándola a su billetera de Ethereum y a un contrato inteligente de NFT. +- `nft-minter` contiene todo el tutorial completado y está disponible como **referencia** ** si se estanca.** + +A continuación, abra su copia de `minter-starter-files` en su editor de código y luego vaya a la carpeta `src`. + +Todo el código que escribiremos permanecerá en la carpeta `src`. Editaremos el componente `Minter.js` y escribiremos archivos javascript adicionales para dar a nuestro proyecto funcionalidad Web3. + +## Paso 2: Revisar nuestros archivos de inicio {#step-2-check-out-our-starter-files} + +Antes de empezar a programar, es importante comprobar lo que ya se nos ha proporcionado en los archivos de inicio. + +### Ejecute su proyecto de react {#get-your-react-project-running} + +Comencemos por ejecutar el proyecto React en nuestro navegador. La belleza de React es que, una vez que tenemos nuestro proyecto corriendo en el navegador, cualquier cambio que guardemos será actualizado en vivo en el navegador. + +Para ejecutar el proyecto, vaya al directorio raíz de la carpeta `minter-starter-files` y ejecute `npm install` en su terminal para instalar las dependencias del proyecto: + +```bash +cd minter-starter-files +npm install +``` + +Una vez que hayan terminado de instalarse, ejecute `npm start` en su terminal: + +```bash +npm start +``` + +Al hacerlo, se debería abrir http://localhost:3000/ en el navegador, donde verá el frontend de nuestro proyecto. Debe constar de 3 campos: un lugar para introducir un enlace al activo de su NFT, uno para introducir el nombre del NFT y otro para proporcionar una descripción. + +Si intenta hacer clic en los botones "Connect Wallet" o "Mint NFT", notará que no funcionan: es porque todavía necesitamos programar su funcionalidad. :\) + +### El componente Minter.js {#minter-js} + +**NOTA:** Asegúrese de estar en la carpeta `minter-starter-files` y no en la carpeta `nft-minter`. + +Volvamos a la carpeta `src` en nuestro editor y abramos el archivo `Minter.js`. Es muy importante que entendamos todo en este archivo, ya que es el componente principal en React en el que trabajaremos. + +En la parte superior de este archivo, tenemos nuestras variables de estado que actualizaremos después de eventos específicos. + +```javascript +//State variables +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [name, setName] = useState("") +const [description, setDescription] = useState("") +const [url, setURL] = useState("") +``` + +¿Nunca escuchó hablar de variables de estado o hooks de estado de React? Échale un vistazo a [estos](https://reactjs.org/docs/hooks-state.html) documentos. + +Esto es lo que representa cada una de las variables: + +- `walletAddress`: cadena que almacena la dirección de la billetera del usuario +- `status`: cadena que contiene un mensaje para mostrar en la parte inferior de la interfaz de usuario +- `name`: cadena que almacena el nombre del NFT +- `description`: cadena que almacena la descripción del NFT +- `url`: cadena que actúa como enlace al activo digital del NFT + +Después de las variables de estado, verá tres funciones no implementadas: `useEffect`, `connectWalletPressed` y `onMintPressed`. Notará que todas estas funciones son `async`, ¡eso es porque vamos a hacer llamadas asincrónicas de API en ellas! Sus nombres son epónimos con sus funcionalidades: + +```javascript +useEffect(async () => { + //TODO: implement +}, []) + +const connectWalletPressed = async () => { + //TODO: implement +} + +const onMintPressed = async () => { + //TODO: implement +} +``` + +- [`useEffect`](https://reactjs.org/docs/hooks-effect.html): este es un hook de React que es invocado después de renderizar su componente. Debido a que tiene un prop `[]` de array vacío que se pasa a él (ver línea 3), solo se lo invocará en el _primer_ render del componente. Aquí llamaremos a nuestro oyente de billetera y otra función de billetera para actualizar nuestra interfaz de usuario a fin de reflejar si una billetera ya está conectada. +- `connectWalletPressed`: esta función será invocada para conectar la billetera en MetaMask del usuario a nuestra dapp. +- `onMintPressed`: esta función será invocada para mintear el NFT del usuario. + +Cerca del final de este archivo, tenemos la interfaz de usuario de nuestro componente. Si analiza este código cuidadosamente, notará que actualizamos nuestras variables de estado `url`, `name` y `description` cuando la entrada en sus campos de texto correspondientes cambian. + +También verá que `conectWalletPressed` y `onMintPressed` son invocadas cuando se hace clic en los botones con los ID `mintButton` y `walletButton`. + +```javascript +//the UI of our component +return ( +
    + + +

    +

    🧙‍♂️ Alchemy NFT Minter

    +

    + Simply add your asset's link, name, and description, then press "Mint." +

    +
    +

    🖼 Link to asset:

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

    🤔 Name:

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

    ✍️ Description:

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

    {status}

    +
    +) +``` + +Finalmente, abordemos dónde se añade este componente Minter. + +Si va al archivo `App.js`, que es el componente principal de React que actúa como contenedor de todos los demás componentes, verá que nuestro componente Minter se inyecta en la línea 7. + +**En este tutorial, solo editaremos el `archivo Minter.js` y añadiremos archivos en nuestra carpeta `src`.** + +Ahora que entendemos con qué estamos trabajando, configuremos nuestra billetera de Ethereum. + +## Configure su billetera de Ethereum {#set-up-your-ethereum-wallet} + +Para que los usuarios puedan interactuar con su contrato inteligente, necesitarán conectar su billetera de Ethereum a su dapp. + +### Descargar MetaMask {#download-metamask} + +Para este tutorial, usaremos Metamask, una cartera virtual en el navegador usada para manejar la dirección de su cuenta Ethereum. Si desea más información sobre cómo funcionan las transacciones en Ethereum, eche un vistazo a [esta página](/developers/docs/transactions/). + +Puede descargar y crear una cuenta Metamask gratis [aquí](https://metamask.io/download.html). Cuando esté creando una cuenta, o si ya tiene una, asegúrese de cambiar a la "Red de prueba Ropsten" en la parte superior derecha \(para no usar dinero real\). + +### Añada ether a partir de un grifo {#add-ether-from-faucet} + +Para mintear nuestros NFTs (o firmar cualquier transacción en la cadena de bloques de Ethereum), necesitaremos algo de Eth de prueba (de mentira). Para obtener el Eth, puede ir al [grifo de Ropsten](https://faucet.ropsten.be/) e introducir la dirección de su cuenta de Ropsten y dar clic en "Send Ropsten Eth". Debería ver el Eth en su cuenta de MetaMask poco después. + +### Compruebe su saldo {#check-your-balance} + +Para verificar que nuestro saldo esté ahí, realicemos una solicitud [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) usando la [herramienta de compositor de 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). Esto devolverá la cantidad de Eth en nuestra billetera. Después de introducir la dirección de su cuenta de Metamask y hacer clic en «Send Request», debería ver una respuesta como esta: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**NOTA:** Este resultado esta en wei, no en eth. Wei se usa como la denominación más pequeña de Ether. La conversión de wei a eth es: 1 eth = 10¹⁸ wei. Entonces si convertimos 0xde0b6b3a7640000 a decimal, obtenemos 1\*10¹⁸, que equivale a 1 eth. + +¡Fiu! Nuestro dinero de prueba está ahí sin problemas. + +## Conecte Metamask a su UI {#connect-metamask-to-your-UI} + +Ahora que nuestra billetera de MetaMask está configurada, vamos a conectar nuestra dapp a ella. + +Debido a que queremos prescribir al paradigma [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller), vamos a crear un archivo separado que contenga nuestras funciones para gestionar la lógica, los datos y las reglas de nuestra dapp, para luego pasar estas funciones a nuestro frontend (nuestro componente Minter.js). + +### Función `connectWallet` {#connect-wallet-function} + +Para hacer eso, vamos a crear una nueva carpeta llamada `utils` en el directorio `src` y agregaremos un archivo llamado `interact.js` dentro de esta, que contendrá todas las funciones de interacción de nuestra billetera y contrato inteligente. + +En nuestro archivo `interact.js`, escribiremos una función `connectWallet`, que luego importaremos y llamaremos en nuestro componente `Minter.js`. + +En el archivo `interact.js`, añada lo siguiente: + +```javascript +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 Write a message in the text-field above.", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

    +
    + ), + } + } +} +``` + +Analicemos lo que hace este código: + +Primero, nuestra función revisa si `window.ethereum` está activado en su navegador. + +`window.ethereum` es una API global inyectada por MetaMask y otros proveedores de billeteras que permite a los sitios web solicitar las cuentas de Ethereum de los usuarios. En caso de aprobación, puede leer información de la cadena de bloques a la que el usuario se encuentra conectado y sugerir al usuario que firme mensajes y transacciones. Revise la [documentación de MetaMask](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) para obtener más información. + +Si `window.ethereum` _no está_ presente, eso significa que MetaMask no está instalado. Esto resulta en la devolución de un objeto JSON, donde el `address` devuelto es una cadena vacía y el objeto JSX `status` muestra que el usuario debe instalar MetaMask. + +**Muchas de las funciones que escribamos mostrarán objetos JSON que podemos usar para actualizar nuestras variables de estado y UI.** + +Ahora, si `window.ethereum` _está_ presente, las cosas se ponen interesantes. + +Usando un bucle try/catch, trataremos de conectar con MetaMask invocando `[window.ethereum.request({ method: "eth_requestAccounts" });](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts)`. La invocación de esta función abrirá MetaMask en el navegador, donde se le solicitará al usuario conectar su billetera a su dapp. + +- Si el usuario elige conectarla, `method: "eth_requestAccounts"` devolverá un arreglo que contiene todas las direcciones de la cuenta del usuario que están conectadas a la dapp. De igual manera, nuestra función `connectWallet` devolverá un objeto JSON que contine la _primera_ `address` de este arreglo \(ver la línea 9\) y un mensaje de `status` que solicita al usuario escribir un mensaje al contrato inteligente. +- Si el usuario rechaza la conexión, el objeto JSON tendrá una cadena vacía para la `address` devuelta y un mensaje de `status` donde se refleje que el usuario rechazó la conexión. + +### Agregue la función connectWallet a su componente Minter.js {#add-connect-wallet} + +Ahora que hemos escrito esta función `connectWallet`, vamos a conectarla con nuestro componente `Minter.js`. + +Primero, tenemos que importar nuestra función a nuestro archivo `Minter.js` agregando `import { connectWallet } from "./utils/interact.js";` en la parte superior del archivo `Minter.js`. Las primeras 11 líneas de `Minter.js` deberían lucir así: + +```javascript +import { useEffect, useState } from "react"; +import { connectWallet } from "./utils/interact.js"; + +const Minter = (props) => { + + //State variables + const [walletAddress, setWallet] = useState(""); + const [status, setStatus] = useState(""); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [url, setURL] = useState(""); +``` + +Luego, dentro de nuestra función `connectWalletPressed`, llamaremos a nuestra función `connectWallet` de la siguiente manera: + +```javascript +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +¿Nota cómo gran parte de nuestra funcionalidad es abstraída de nuestro componente `Minter.js` del archivo `interact.js`? ¡Esto es así para cumplir con el paradigma M-V-C! + +En `connectWalletPressed`, simplemente hacemos una llamada en espera a nuestra función `conectWallet` importada y, utilizando su respuesta, actualizamos nuestras variables `status` y `walletAddress` a través de sus hooks de estado. + +Ahora, guardemos ambos archivos `Minter.js` e `interact.js`, y probemos nuestra UI. + +Abra el navegador en localhost:3000 y presione el botón "Connect Wallet" en la parte superior derecha de la página. + +Si tiene MetaMask instalado, se le debería solicitar conectar su billetera a su dapp. Acepte la invitación para establecer la conexión. + +Debería ver que el botón de billetera ahora muestra que su dirección está conectada. + +A continuación, pruebe actualizar la página... esto es extraño. Nuestro botón de billetera nos está solicitando conectar MetaMask, aunque ya está conectado... + +¡No se preocupe! Podemos solucionarlo con facilidad implementando una función llamada `getCurrentWalletConnected`, que revisará si ya hay una dirección conectada a nuestra dapp y actualizará nuestra interfaz como corresponda. + +### La función getCurrentWalletConnected {#get-current-wallet} + +En su archivo `interact.js`, agregue la siguiente función `getCurrentWalletConnected`: + +```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: "👆🏽 Write a message in the text-field above.", + } + } else { + return { + address: "", + status: "🦊 Connect to MetaMask using the top right button.", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

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

    +
    + ), + } + } +} +``` + +Este código es _muy_ silimar a la función `connectWallet` que escribimos previamente. + +La principal diferencia es que, en vez de llamar al método `eth_requestAccount`, que abre MetaMask para que el usuario conecte su billetera, aquí llamamos al método `eth_accounts`, que simplemente devuelve un arreglo que contiene las direcciones de MetaMask que se encuentran conectadas a nuestra dapp. + +Para ver esta función en acción, vamos a llamarla en la función `useEffect` de nuestro componente `Minter.js`. + +Como hicimos para `connectWallet`, debemos importar esta función de nuestro archivo `interact.js` a nuestro archivo `Minter.js`: + +```javascript +import { useEffect, useState } from "react" +import { + connectWallet, + getCurrentWalletConnected, //import here +} from "./utils/interact.js" +``` + +Ahora, simplemente la llamamos en nuestra función `useEffect`: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +Note que usamos la respuesta de nuestra llamada a `getCurrentWalletConnected` para actualizar nuestras variables de estado `walletAddress` y `status`. + +Una vez agregado este código, pruebe actualizar la ventana del navegador. El botón debería decir que está conectado y mostrar una vista previa de la dirección de su billetera conectada, incluso después de actualizar la página. + +### Implemente addWalletListener {#implement-add-wallet-listener} + +El último paso en la configuración de la billetera de dapp es implementar el oyente de billetera para que nuestra interfaz se actualice cuando el estado de la billetera cambie, por ejemplo, cuando el usuario se desconecte o cambie de cuenta. + +En el archivo `Minter.js`, agregue una función `addWalletListener` que luzca así: + +```javascript +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 Write a message in the text-field above.") + } else { + setWallet("") + setStatus("🦊 Connect to MetaMask using the top right button.") + } + }) + } else { + setStatus( +

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

    + ) + } +} +``` + +Analicemos rápidamente lo que sucede aquí: + +- Primero, nuestra función verifica si `window.ethereum` está habilitado \(esto es si MetaMask está instalado\). + - Si no lo está, simplemente establecemos nuestra variable de estado `status` a una cadena JSX que solicite al usuario instalar MetaMask. + - Si está habilitado, configuramos el oyente `window.ethereum.on("accountsChanged")` en la línea 3, que escucha cambios de estado en la billetera de MetaMask, incluyendo cuando el usuario conecte una cuenta adicional a la dapp, cambie de cuenta o desconecte una cuenta. Si hay por lo menos una cuenta conectada, la variable de estado `walletAddress` es actualizada como la primera cuenta en el arreglo `accounts` devuelto por el oyente. De lo contrario, `walletAddress` se establece como cadena vacía. + +Finalmente, debemos llamarlo en nuestra función `useEffect`: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +¡Y voilá! ¡Hemos completado la programación de nuestra funcionalidad de billetera! ¡Ahora que nuestra billetera está configurada, veamos cómo mintear nuestro NFT! + +## Aspectos básicos sobre metadatos de NFT {#nft-metadata-101} + +Recordemos los metadatos de NFT sobre los que hablamos en el Paso 0 de este tutorial: dan vida a un NFT, permitiendo que tenga propiedades, tales como un activo digital, un nombre, una descripción y otros atributos. + +Vamos a tener que configurar estos metadatos como objeto JSON y almacenarlo para poder pasarlos como parámetro `tokenURI` cuando invoquemos la función `mintNFT` de nuestro contrato inteligente. + +El texto en los campos "Link to Asset", "Name" y "Description" comprenderá las diferentes propiedades de los metadatos de nuestro NFT. Formatearemos estos metadatos como un objeto JSON, pero hay un par de opciones para almacenar este objeto JSON: + +- Podríamos almacenarlo en la cadena de bloques de Ethereum; sin embargo, hacer esto puede ser muy caro. +- Podríamos almacenarlo en un servidor centralizado, como AWS o Firebase. Pero esto iría en contra de nuestro espíritu de descentralización. +- Podríamos usar IPFS, un protocolo descentralizado y red entre pares para almacenar y compartir datos en un sistema de archivos distribuido. Como este protocolo es descentralizado y gratuito, es nuestra mejor opción. + +Para almacenar nuestros metadatos en IPFS, usaremos [Pinata](https://pinata.cloud/), una conveniente API de IPFS y kit de herramientas. En el siguiente paso, explicaremos exactamente cómo hacer esto. + +## Use Pinata para fijar sus metadatos en IPFS {#use-pinata-to-pin-your-metadata-to-IPFS} + +Si no tiene una cuenta de [Pinata](https://pinata.cloud/), cree una cuenta gratuita [aquí](https://pinata.cloud/signup) y complete los pasos para verificar su correo electrónico y su cuenta. + +### Cree su clave de API de Pinata {#create-pinata-api-key} + +Navegue a la página [https://pinata.cloud/kets](https://pinata.cloud/keys), luego seleccione el botón "New Key" en la parte superior, establezca el widget de Administrador como habilitado y asigne un nombre a su clave. + +Luego verá una ventana emergente con la información de su API. Asegúrese de guardar estos datos en un lugar seguro. + +Ahora que nuestra clave está configurada, vamos a agregarla a nuestro proyecto para poder usarla. + +### Cree un archivo .env {#create-a-env} + +Podemos almacenar de manera segura nuestra clave y secreto de Pinata en un archivo de entorno. Vamos a instalar el [paquete dotenv](https://www.npmjs.com/package/dotenv) en el directorio del proyecto. + +Abra una nueva pestaña en su terminal \(separada de la que está ejecutando local host\) y asegúrese de que estar en la carpeta `minter-starter-files`; luego ejecute el siguiente comando en el terminal: + +```text +npm install dotenv --save +``` + +A continuación, cree un archivo `.env` en el directorio raíz de `minter-starter-files` ingresando lo siguiente el la línea de comandos: + +```javascript +vim.env +``` + +Esto abrirá el archivo `.env` en vim \(un editor de texto\). Para guardarlo, presione "esc" + ":" + "q" en el teclado en dicho orden. + +A continuación, en VSCode, navegue a su archivo `.env` y agregue su clave de API y secreto de API de Pinata a este, de la siguiente manera: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +``` + +Guarde el archivo y luego estará listo para iniciar la escritura de la función para subir los metadatos JSON a IPFS. + +### Implemente pinJSONToIPFS {#pin-json-to-ipfs} + +Afortunadamente para nosotros, Pinata tiene una [API específicamente para subir datos JSON a IPFS](https://pinata.cloud/documentation#PinJSONToIPFS) y un práctico ejemplo de JavaScript con axios que podemos usar, con algunas ligeras modificaciones. + +En la carpeta `utils`, vamos a crear otro archivo llamado `pinata.js` y luego importar su secreto y clave de Pinata desde el archivo .env de la siguiente manera: + +```javascript +require("dotenv").config() +const key = process.env.REACT_APP_PINATA_KEY +const secret = process.env.REACT_APP_PINATA_SECRET +``` + +A continuación, pegue el código adicional que se encuentra abajo en su archivo `pinata.js`. ¡No se preocupe, explicaremos lo que significa todo esto! + +```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` + //making axios POST request to Pinata ⬇️ + 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, + } + }) +} +``` + +Entonces, ¿qué hace este código exactamente? + +Primero, importa [axios](https://www.npmjs.com/package/axios), un cliente HTTP basado en promesas para el navegador y node.js, que usaremos para hacer una solicitud a Pinata. + +Luego, tenemos nuestra función asíncrona `pinJSONToIPFS`, que toma un `JSONBody` como su entrada, además de la clave y secreto de la API de Pinata en su encabezado, todo para hacer una solicitud POST a su API de `pinJSONToIPFS`. + +- Si esta solicitud POST es exitosa, nuestra función devuelve un objeto JSON con el booleano `success` como verdadero y la `pinataUrl` donde fueron fijados nuestros metadatos. Usaremos esta `pinataUrl` devuelta como la entrada `tokenURI` a la función de minteo de nuestro contrato inteligente. +- Si esta solicitud POST falla, la función devuelve un objeto JSON con el booleano `success` como falso y una cadena `message` que muestra el error. + +Como sucede con los tipos de retorno de la función `connectWallet`, estamos devolviendo objetos JSON para poder usar sus parámetros con la finalidad de actualizar nuestras variables de estado e interfaz. + +## Suba el contrato inteligente {#load-your-smart-contract} + +Ahora que tenemos una manera de cargar los metadatos de nuestro NFT a IPFS a través de la función `pinJSONToIPFS`, necesitaremos una manera de cargar una instancia del contrato inteligente para invocar su función `mintNFT`. + +Como se mencionó previamente, en este tutorial usaremos [este contrato inteligente de NFT existente](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE); sin embargo, si desea aprender cómo lo hicimos o crear uno por su cuenta, recomendamos consultar nuestro otro tutorial [Cómo crear un NFT](https://docs.alchemyapi.io/alchemy/tutorials/how-to-create-an-nft). + +### ABI del contrato {#contract-abi} + +Si ha examinado nuestros archivos en detalle, habrá notado que en nuestro directorio `src` hay un archivo `contract-abi.json`. Un ABI es necesario para especificar qué función invocará un contrato y para asegurar que la función devolverá datos en el formato esperado. + +Tambien necesitaremos una clave de API de Alchemy y la API Web3 de Alchemy para establecer conexión con la cadena de bloques de Ethereum y cargar nuestro contrato inteligente. + +### Cree su clave API de Alchemy {#create-alchemy-api} + +Si todavía no tiene una cuenta de Alchemy, [cree una cuenta gratuita aquí](https://alchemy.com/?a=eth-org-nft-minter). + +Una vez que haya creado una cuenta de Alchemy, puede generar una clave de API creando una aplicación. Esto nos permitirá hacer solicitudes a la red de pruebas de Ropsten. + +Vaya a la página "Create App" en el panel de Alchemy colocando el cursor sobre "Apps" en la barra de navegación y haciendo click en "Create App". + +Asigne un nombre a la aplicación (nosotros elegimos "Mi primer NFT"), ofrezca una descripción, seleccione "Staging" para el Entorno usado para la contabilidad de la aplicación y seleccione "Ropsten" para la red. + +¡Haga clic en «Crear app» y ya está! Su aplicación debería aparecer en la siguiente tabla. + +¡Genial! Ahora que hemos creado la URL HTTP de la API de Alchemy, cópiela en el portapapeles... + +… y luego vamos a agregarla al archivo `.env`. En definitiva el archivo .env debe lucir así: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ +``` + +Ahora que tenemos nuestro ABI de contrato y la clave de API de Alchemy, estamos listos para cargar nuestro contrato inteligente usando [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3). + +### Configure el terminal y contrato de Alchemy Web3 {#setup-alchemy-endpoint} + +Primero, si aún no lo tiene, necesita instalar [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) navegando al directorio de inicio: `nft-minter-tutorial` en el terminal: + +```text +cd .. +npm install @alch/alchemy-web3 +``` + +A continuación, regresemos a nuestro archivo `interact.js`. En la parte superior del archivo, agregue el siguiente código para importar la clave de Alchemy desde el archivo .env y configurar su terminal de Alchemy Web3: + +```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) está construido sobre [Web3](https://docs.web3js.org/), de esta manera proporciona metodos mejorados de la API y otros beneficios importantes para que tu vida como desarrollador de Web3 sea mucho más fácil. Se diseñó para requerir una configuración mínima, por lo que puede comenzar a usarla en su aplicación de inmediato. + +Ahora, agreguemos nuestro ABI de contrato y la dirección del contrato a nuestro archivo. + +```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" +``` + +Una vez que tengamos ambos, estamos listos para comenzar con el código de nuestra función de minteo. + +## Implemente la función mintNFT {#implement-the-mintnft-function} + +Dentro del archivo `interact.js`, vamos a definir nuestra función, `mintNFT`, que de forma epónima minteará nuestro NFT. + +Debido a que realizaremos varias llamadas asíncronas \(a Pinata para fijar los metadatos a IPFS, a Alchemy Web3 para cargar nuestro contrato inteligente y a MetaMask para firmar las transacciones\), nuestra función también será asíncrona. + +Las tres entradas a nuestra función serán la `url` de nuestro activo digital, `name` y `description`. Agregue la siguiente firma de función debajo de la función `connectWallet`: + +```javascript +export const mintNFT = async (url, name, description) => {} +``` + +### Manejo de errores de entrada {#input-error-handling} + +Naturalmente, tiene sentido tener algún tipo de manejo de errores de entrada en el inicio de la función, por lo que podemos abandonar esta función si nuestros parámetros de entrada son incorrectos. Dentro de nuestra función, agreguemos el siguiente código: + +```javascript +export const mintNFT = async (url, name, description) => { + //error handling + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Please make sure all fields are completed before minting.", + } + } +} +``` + +Básicamente, si cualquiera de los parámetros de entrada son una cadena vacía, devolvemos un objeto JSON donde el booleano `success` es falso y la cadena `status` muestre que deben completarse todos los campos en nuestra UI. + +### Subir los metadatos a IPFS {#upload-metadata-to-ipfs} + +Una vez sabemos que sepamos que nuestros metadatos están formateados correctamente, el siguiente paso es ponerlos en un objeto JSON y subirlos a IPFS a través del `pinJSONToIPFS` que escribimos. + +Para hacer eso, primero necesitamos importar la función `pinJSONToIPFS` en el archivo `interact.js`. En la parte superior de `interact.js`, vamos a agregar: + +```javascript +import { pinJSONToIPFS } from "./pinata.js" +``` + +Recuerde que `pinJSONToIPFS` toma un cuerpo JSON. Antes de hacer una invocación, necesitaremos formatear los parámetros `url`, `name` y `description` en un objeto JSON. + +Actualicemos nuestro código para crear un objeto JSON llamado `metadata` y luego hacer un llamado a `pinJSONToIPFS` con este parámetro de `metadata`: + +```javascript +export const mintNFT = async (url, name, description) => { + //error handling + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Please make sure all fields are completed before minting.", + } + } + + //make metadata + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //make pinata call + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 Something went wrong while uploading your tokenURI.", + } + } + const tokenURI = pinataResponse.pinataUrl +} +``` + +Note que guardamos la respuesta de nuestra llamada a `pinJSONToIPFS(metadata)` en el objeto `pinataResponse`. Luego, analizamos este objeto para buscar errores. + +Si hay un error, devolvemos un objeto JSON donde el booleano `success` es falso y nuestra cadena `status` transmita que nuestra llamada falló. De lo contrario, extraemos el `pinataURL` de `pinataResponse` y lo almacenamos como variable `tokenURI`. + +Ahora es momento de cargar nuestro contrato inteligente usando la API web3 de Alchemy que inicializamos en la parte superior de nuestro archivo. Agregue la siguiente línea de código al final de la función `mintNFT` para establecer el contrato en la variable global `window.contract`: + +```javascript +window.contract = await new web3.eth.Contract(contractABI, contractAddress) +``` + +Lo último por agregar en nuestra función `mintNFT` es nuestra transacción de Ethereum: + +```javascript +//set up your Ethereum transaction +const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: window.ethereum.selectedAddress, // must match user's active address. + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //make call to NFT smart contract +} + +//sign the transaction via MetaMask +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + + txHash, + } +} catch (error) { + return { + success: false, + status: "😥 Something went wrong: " + error.message, + } +} +``` + +Si ya está familiarizado con las transacciones de Ethereum, notará que la estructura es muy similar a lo que ha visto. + +- Primero establecemos los parámetros de las transacciones. + - `to` especifica la dirección del receptor \(nuestro contrato inteligente\) + - `from` especifica el firmante de la transacción \(la dirección conectada del usuario a MetaMask: `window.ethereum.selectedAddress`\) + - `data` contiene el llamado al método `mintNFT` de nuestro contrato inteligente, que recibe nuestro `tokenURI` y la dirección de la billetera del usuario, `window.ethereum.selectedAddress` como entradas +- Luego hacemos una llamada de espera, `window.ethereum.request`, donde le solicitamos a MetaMask firmar la transacción. Fíjese que en esta solicitud estamos especificando nuestro método eth \(eth_SentTransaction\) y pasando nuestros `transactionParameters`. En este punto, MetaMask se abrirá en el navegador y solicitará al usuario firmar o rechazar la transacción. + - Si la transacción es exitosa, la función devolverá un objeto JSON donde el booleano `success` es establecido como verdadero y la cadena `status` solicita al usuario revisar Etherscan para ver más información sobre la transacción. + - Si la transacción falla, la función devolverá un objeto JSON donde el booleano `success` es establecido en falso y la cadena `status` muestra el mensaje de error. + +En definitiva nuestra función `mintNFT` debería lucir así: + +```javascript +export const mintNFT = async (url, name, description) => { + //error handling + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗Please make sure all fields are completed before minting.", + } + } + + //make metadata + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //pinata pin request + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 Something went wrong while uploading your tokenURI.", + } + } + const tokenURI = pinataResponse.pinataUrl + + //load smart contract + window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract(); + + //set up your Ethereum transaction + const transactionParameters = { + to: contractAddress, // Required except during contract publications. + from: window.ethereum.selectedAddress, // must match user's active address. + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //make call to NFT smart contract + } + + //sign transaction via MetaMask + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Check out your transaction on Etherscan: https://ropsten.etherscan.io/tx/" + + txHash, + } + } catch (error) { + return { + success: false, + status: "😥 Something went wrong: " + error.message, + } + } +} +``` + +¡Es una función gigante! Ahora solo necesitamos conectar nuestra función `mintNFT` a nuestro componente `Minter.js`... + +## Conecte minterNFT a nuestro frontend Minter.js {#connect-our-frontend} + +Abra el archivo `Minter.js` y actualice la línea `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` al inicio a: + +```javascript +import { + connectWallet, + getCurrentWalletConnected, + mintNFT, +} from "./utils/interact.js" +``` + +Finalmente, implemente la función `onMintPressed` para hacer una llamada en espera a su función `mintNFT` importada y actualice la variable de estado `status` para reflejar si nuestra transacción se realizó correctamente o falló: + +```javascript +const onMintPressed = async () => { + const { status } = await mintNFT(url, name, description) + setStatus(status) +} +``` + +## Implemente el NFT a un sitio web {#deploy-your-NFT} + +¿Está preparado para implementar su proyecto para que los usuarios interactúen? Revise [este tutorial](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) para implementar el Minteador en un sitio web. + +Un último paso... + +## Tome el mundo de la cadena de bloques por asalto {#take-the-blockchain-world-by-storm} + +¡Solo bromeaba! Ha llegado al final del tutorial. + +Para recapitular, al crear un minteador de NFT, ha aprendido correctamente cómo: + +- Conectar a MetaMask a través del frontend de su proyecto +- Llamar a métodos de contrato inteligente desde tu frontend +- Firmar transacciones usando MetaMask + +Seguramente le gustaría poder mostrar los NFT minteados a través de su dapp en su billetera, así que asegúrese de revisar nuestro tutorial rápido [Cómo ver su NFT en su billetera](https://docs.alchemyapi.io/alchemy/tutorials/how-to-write-and-deploy-a-nft-smart-contract/how-to-view-your-nft-in-your-wallet). + +Como siempre, si tiene alguna pregunta, estamos aquí para ayudarlo en el [Discord de Alchemy](https://discord.gg/gWuC7zB). Estamos ansiosos de ver cómo aplica lo que aprendió en este tutorial en sus proyectos. diff --git a/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md new file mode 100644 index 00000000000..040e57893b4 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -0,0 +1,1277 @@ +--- +title: "Paseo por el contrato estándar de puente en Optimism" +description: '¿Cómo funciona el puente estándar para Optimism? ¿Por qué funciona de esta forma?' +author: Ori Pomerantz +tags: + - "solidity" + - "puente" + - "capa 2" +skill: intermediate +published: 2022-03-30 +lang: es +--- + +[Optimism](https://www.optimism.io/) es un [Rollup Optimista](/developers/docs/scaling/optimistic-rollups/). Los Rollups Optimistas pueden procesar transacciones por un precio mucho más bajo que la red Mainnet de Ethereum (también conocido como capa 1 o L1) porque las transacciones sólo son procesadas por unos pocos nodos, en lugar de cada nodo de la red. Al mismo tiempo, los datos se escriben en L1 para que todo pueda ser probado y reconstruido con todas las garantías de integridad y disponibilidad de Mainnet. + +Para utilizar activos L1 en Optimism (o cualquier otra L2), los activos deben ser [puenteados](/bridges/#prerequisites). Una manera de lograr esto es que los usuarios bloqueen activos (ETH y [tokens ERC-20](/developers/docs/standards/tokens/erc-20/) son los más comunes) en L1, y recibir activos equivalentes a usar en L2. Eventualmente, quien acabe poseyéndolos puede querer puentearlos de vuelta a la L1. Al hacer esto, los activos se queman en L2 y luego se liberan al usuario en L1. + +Así es como funciona el [puente estándar Optimism](https://community.optimism.io/docs/developers/bridge/standard-bridge). En este artículo pasamos por el código fuente de ese puente para ver cómo funciona y estudiarlo como un ejemplo de código de Solidity bien escrito. + +## Flujos de control {#control-flows} + +El puente tiene dos flujos principales: + +- Depósito (de L1 a L2) +- Retiro (de L2 a L1) + +### Flujo de depósito {#deposit-flow} + +#### Capa 1 {#deposit-flow-layer-1} + +1. Si se deposita un ERC-20, el depósito le da al puente una asignación para gastar la cantidad depositada +2. El depositante llama al puente L1 (`depositERC20`, `depositERC20To`, `depositETH`, o `depositETHTo`) +3. El puente L1 toma posesión del activo puentado + - ETH: El activo es transferido por el depositante como parte de la llamada + - ERC-20: El activo es transferido por el puente a sí mismo utilizando la asignación proporcionada por el depósito +4. El puente L1 utiliza el mecanismo de mensajes de dominio cruzado para llamar a `finalizeDeposit` en el puente L2 + +#### Capa 2 {#deposit-flow-layer-2} + +5. El puente L2 verifica que la llamada a `finalizeDeposit` esté legitimada: + - Procede del contrato de mensajes de dominio cruzado + - Era originalmente del puente en L1 +6. El puente de L2 comprueba si el contrato de token ERC-20 en L2 es el correcto: + - El contrato L2 informa de que su contraparte L1 es la misma de la que provienen los tokens del L1 + - El contrato L2 informa que soporta la interfaz correcta ([usando ERC-165](https://eips.ethereum.org/EIPS/eip-165)). +7. Si el contrato L2 es el correcto, llámelo para acuñar el número apropiado de tokens a la dirección apropiada. Si no, inicie un proceso de retiro para permitir al usuario reclamar las fichas en L1. + +### Flujo de retiro {#withdrawal-flow} + +#### Capa 2 {#withdrawl-flow-layer-2} + +1. Aquél que realiza el retiro llama al puente L2 (`withdraw` or `withdrawTo`) +2. El puente L2 quema el número apropiado de tokens pertenecientes a `msg.sender` +3. El puente L2 utiliza el mecanismo de mensajes entre dominios para llamar a `finalizeETHWithdrawal` o `finalizeERC20Withdrawal` en el puente L1 + +#### Capa 1 {#withdrawl-flow-layer-1} + +4. El puente L1 verifica que la llamada a `finalizeETHWithdrawal` o `finalizeERC20Withdrawal` sea legítima: + - Procede del mecanismo de mensajes cruzados entre dominios + - Era originalmente del puente en L2 +5. El puente L1 transfiere el activo apropiado (ETH o ERC-20) a la dirección apropiada + +## Código de capa 1 {#layer-1-code} + +Este es el código que se ejecuta en L1, la Red Principal Ethereum. + +### IL1ERC20Bridge {#IL1ERC20Bridge} + +[Esta interfaz está definida aquí](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol). Incluye funciones y definiciones requeridas para puentear tokens ERC-20. + +```solidity +// SPDX-License-Identifier: MIT +``` + +[La mayor parte del código de Optimism está liberado bajo la licencia MIT](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-). + +```solidity +pragma solidity >0.5.0 <0.9.0; +``` + +Al instante de esta escritura la última versión de Solidity es 0.8.12. Hasta que la versión 0.9.0 sea liberada, no sabemos si este código es compatible con él o no. + +```solidity +/** + * @title IL1ERC20Bridge + */ +interface IL1ERC20Bridge { + /********** + * Events * + **********/ + + event ERC20DepositInitiated( +``` + +En la terminología de puente de Optimism _deposit_ significa transferir de L1 a L2, y _withdrawal_ significa transferir de L2 a L1. + +```solidity + address indexed _l1Token, + address indexed _l2Token, +``` + +En la mayoría de los casos, la dirección de un ERC-20 en L1 no es la misma dirección del ERC-20 equivalente en L2. [Puedes ver la lista de direcciones de tokens aquí](https://static.optimism.io/optimism.tokenlist.json). La dirección con `chainId` 1 está en L1 (Red Principal) y la dirección con `chainId` 10 está en L2 (Optimism). Los otros dos valores `chainId` son para la red de pruebas Kovan (42) y la red de pruebas Optimistic Kovan (69). + +```solidity + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +Es posible agregar notas a las transferencias, en cuyo caso se añaden a los eventos que las reportan. + +```solidity + event ERC20WithdrawalFinalized( + address indexed _l1Token, + address indexed _l2Token, + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +El mismo contrato de puente maneja las transferencias en ambas direcciones. En el caso del puente L1, esto significa inicialización de depósitos y finalización de retiros. + +```solidity + + /******************** + * Public Functions * + ********************/ + + /** + * @dev get the address of the corresponding L2 bridge contract. + * @return Address of the corresponding L2 bridge contract. + */ + function l2TokenBridge() external returns (address); +``` + +Esta función no es realmente necesaria, porque en L2 es un contrato predesplegado, así que siempre está en la dirección `0x4200000000000000000000000000000000000010`. Está aquí por simetría con el puente L2, porque la dirección del puente L1 _no_ es trivial de conocer. + +```solidity + /** + * @dev deposit an amount of the ERC20 to the caller's balance on L2. + * @param _l1Token Address of the L1 ERC20 we are depositing + * @param _l2Token Address of the L1 respective L2 ERC20 + * @param _amount Amount of the ERC20 to deposit + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function depositERC20( + address _l1Token, + address _l2Token, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +El parámetro `_l2Gas` es la cantidad de gas L2 que la transacción puede gastar. [Hasta cierto límite (alto), es gratuito](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), así que a menos que el contrato ERC haga algo realmente extraño a la hora de acuñar, no debería ser un problema. Esta función se encarga del escenario común, donde un usuario puentea activos a la misma dirección en una cadena de bloques diferente. + +```solidity + /** + * @dev deposit an amount of ERC20 to a recipient's balance on L2. + * @param _l1Token Address of the L1 ERC20 we are depositing + * @param _l2Token Address of the L1 respective L2 ERC20 + * @param _to L2 address to credit the withdrawal to. + * @param _amount Amount of the ERC20 to deposit. + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function depositERC20To( + address _l1Token, + address _l2Token, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +Esta función es casi idéntica a `depositERC20`, pero le permite enviar el ERC-20 a una dirección diferente. + +```solidity + /************************* + * Cross-chain Functions * + *************************/ + + /** + * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the + * L1 ERC20 token. + * This call will fail if the initialized withdrawal from L2 has not been finalized. + * + * @param _l1Token Address of L1 token to finalizeWithdrawal for. + * @param _l2Token Address of L2 token where withdrawal was initiated. + * @param _from L2 address initiating the transfer. + * @param _to L1 address to credit the withdrawal to. + * @param _amount Amount of the ERC20 to deposit. + * @param _data Data provided by the sender on L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +Los retiros (y otros mensajes de L2 a L1) en Optimism son un proceso de dos pasos: + +1. Una transacción iniciante en L2. +2. Una finalización o reclamación de transacción en L1. Esta transacción debe ocurrir después de que finalice el [periodo de desafío de falta](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) para la transacción L2. + +### IL1StandardBridge {#il1standardbridge} + +[Esta interfaz está definida aquí](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol). Este archivo contiene definiciones de eventos y funciones para ETH. Estas definiciones son muy similares a las definidas en `IL1ERC20Bridge` arriba para ERC-20. + +La interfaz de puente está dividida entre dos archivos porque algunos tokens ERC-20 requieren un procesamiento personalizado y no pueden ser manejados por el puente estándar. De esta manera el puente personalizado que maneja tal token puede implementar `IL1ERC20Bridge` y no tener que puentear también ETH. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +import "./IL1ERC20Bridge.sol"; + +/** + * @title IL1StandardBridge + */ +interface IL1StandardBridge is IL1ERC20Bridge { + /********** + * Events * + **********/ + event ETHDepositInitiated( + address indexed _from, + address indexed _to, + uint256 _amount, + bytes _data + ); +``` + +Este evento es casi idéntico a la versión ERC-20 (`ERC20DepositInitiated`), excepto sin las direcciones L1 y L2 del token. Lo mismo es válido para otros eventos y las funciones. + +```solidity + event ETHWithdrawalFinalized( + . + . + . + ); + + /******************** + * Public Functions * + ********************/ + + /** + * @dev Deposit an amount of the ETH to the caller's balance on L2. + . + . + . + */ + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable; + + /** + * @dev Deposit an amount of ETH to a recipient's balance on L2. + . + . + . + */ + function depositETHTo( + address _to, + uint32 _l2Gas, + bytes calldata _data + ) external payable; + + /************************* + * Cross-chain Functions * + *************************/ + + /** + * @dev Complete a withdrawal from L2 to L1, and credit funds to the recipient's balance of the + * L1 ETH token. Since only the xDomainMessenger can call this function, it will never be called + * before the withdrawal is finalized. + . + . + . + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +### CrossDomainEnabled {#crossdomainenabled} + +[Este contrato](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) es heredado por ambos puestes ([L1](#the-l1-bridge-contract) y [L2](#the-l2-bridge-contract)) para enviar mensajes a la otra capa. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +/* Interface Imports */ +import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; +``` + +[Esta interfaz](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) le dice al contrato cómo enviar mesajes a la otra capa, usando el mensajero de dominio cruzado. Este mensajero de dominio cruzado es un sistema completamente diferente, y merece su propio artículo, que espero escribir en el futuro. + +```solidity +/** + * @title CrossDomainEnabled + * @dev Helper contract for contracts performing cross-domain communications + * + * Compiler used: defined by inheriting contract + */ +contract CrossDomainEnabled { + /************* + * Variables * + *************/ + + // Messenger contract used to send and receive messages from the other domain. + address public messenger; + + /*************** + * Constructor * + ***************/ + + /** + * @param _messenger Address of the CrossDomainMessenger on the current layer. + */ + constructor(address _messenger) { + messenger = _messenger; + } +``` + +El único parámetro que el contrato necesita saber, la dirección del mensajero de dominio cruzado en esta capa. Este parámetro se establece una vez, en el constructor, y nunca cambia. + +```solidity + + /********************** + * Function Modifiers * + **********************/ + + /** + * Enforces that the modified function is only callable by a specific cross-domain account. + * @param _sourceDomainAccount The only account on the originating domain which is + * authenticated to call this function. + */ + modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) { +``` + +La mensajería entre dominios es accesible por cualquier contrato en la cadena de bloques donde se esté ejecutando (ya sea la Red Principal de Ethereum u Optimism). Pero necesitamos que el puente de cada lado _sólo_ confíe en ciertos mensajes si provienen del puente del otro lado. + +```solidity + require( + msg.sender == address(getCrossDomainMessenger()), + "OVM_XCHAIN: messenger contract unauthenticated" + ); +``` + +Solo se pueden confiar en los mensajes del mensajero transversal apropiado (`messenger`, como ves a continuación). + +```solidity + + require( + getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount, + "OVM_XCHAIN: wrong sender of cross-domain message" + ); +``` + +La forma en que el mensajero de dominio cruzado proporciona la dirección que envió un mensaje con la otra capa es [la `.xDomainMessageSender()` función](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128). Siempre y cuando se llame en la transacción que fue iniciada por el mensaje puede proporcionar esta información. + +Tenemos que asegurarnos de que el mensaje que recibimos vino del otro puente. + +```solidity + + _; + } + + /********************** + * Internal Functions * + **********************/ + + /** + * Gets the messenger, usually from storage. This function is exposed in case a child contract + * needs to override. + * @return The address of the cross-domain messenger contract which should be used. + */ + function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) { + return ICrossDomainMessenger(messenger); + } +``` + +Esta función devuelve el mensajero de dominio cruzado. Utilizamos una función en lugar de la variable `messenger` para permitir que los contratos que heredan de ésta usen un algoritmo para especificar qué mensajero de dominio cruzado usar. + +```solidity + + /** + * Sends a message to an account on another domain + * @param _crossDomainTarget The intended recipient on the destination domain + * @param _message The data to send to the target (usually calldata to a function with + * `onlyFromCrossDomainAccount()`) + * @param _gasLimit The gasLimit for the receipt of the message on the target domain. + */ + function sendCrossDomainMessage( + address _crossDomainTarget, + uint32 _gasLimit, + bytes memory _message +``` + +Finalmente, la función que envía un mensaje a la otra capa. + +```solidity + ) internal { + // slither-disable-next-line reentrancy-events, reentrancy-benign +``` + +[Slither](https://github.com/crytic/slither) es un analizador estático que Optimism ejecuta en cada contrato para buscar vulnerabilidades y otros potenciales problemas. En este caso, la siguiente línea dispara dos vulnerabilidades: + +1. [Eventos de reentrada](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) +2. [Reentrada benigna](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) + +```solidity + getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit); + } +} +``` + +En este caso no estamos preocupados sobre reentradas ya que sabemos que `getCrossDomainMessenger()` devuelve una dirección confiable, incluso si Slither no tiene manera de saberlo. + +### El contrato de puente L1 {#the-l1-bridge-contract} + +[El códgo fuente para este contrato está aquí](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; +``` + +Las interfaces pueden ser parte de otros contratos, por lo que tienen que soportar una amplio rango de versiones de Solidity. Pero el puente en sí es nuestro contrato, y podemos ser estrictos con qué versión de Solidity utiliza. + +```solidity +/* Interface Imports */ +import { IL1StandardBridge } from "./IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; +``` + +[IL1ERC20Bridge](#IL1ERC20Bridge) y [IL1StandardBridge](#IL1StandardBridge) están explicados arriba. + +```solidity +import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol"; +``` + +[Esta interfaz](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) nos permite crear mensajes para controlar el puente estándar en L2. + +```solidity +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[Esta interfaz](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) nos permite controlar contratos ERC-20. [Puedes leer más al respecto aquí](/developers/tutorials/erc20-annotated-code/#the-interface). + +```solidity +/* Library Imports */ +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +``` + +[Como se explicó más arriba](#crossdomainenabled), este contrato se utiliza para mensajear entre capas. + +```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) tiene las direcciones para los contratos en L2 que siempre tienen la misma dirección. Esto incluye el puente estándar en L2. + +```solidity +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +``` + +[Utilidades de dirección de OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol). Se utiliza para distinguir entre las direcciones del contrato y las que pertenecen a cuentas de propiedad externa (EOA). + +Tenga en cuenta que esta no es una solución perfecta, porque no hay forma de distinguir entre llamadas directas y llamadas hechas del constructor de un contrato, pero al menos nos permite identificar y prevenir algunos errores de usuario comunes. + +```solidity +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +``` + +[El estándar ERC-20](https://eips.ethereum.org/EIPS/eip-20) soporta dos formas para que un contrato reporte fallido: + +1. Revertir +2. Devolver `false` + +Manejar ambos casos complicaría nuestro código, así que en su lugar utilizamos[SafeERC20`de OpenZeppelin`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol), el cual asegura[que todos los fallos resulten en una reversión](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96). + +```solidity +/** + * @title L1StandardBridge + * @dev The L1 ETH and ERC20 Bridge is a contract which stores deposited L1 funds and standard + * tokens that are in use on L2. It synchronizes a corresponding L2 Bridge, informing it of deposits + * and listening to it for newly finalized withdrawals. + * + */ +contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled { + using SafeERC20 for IERC20; +``` + +Esta línea es cómo especificamos usar el envoltorio `SafeERC20` cada vez que usamos la interfaz `IERC20`. + +```solidity + + /******************************** + * External Contract References * + ********************************/ + + address public l2TokenBridge; +``` + +La dirección de [L2StandardBridge](#the-l2-bridge-contract). + +```solidity + + // Maps L1 token to L2 token to balance of the L1 token deposited + mapping(address => mapping(address => uint256)) public deposits; +``` + +Un [mapeo](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) doble como éste es la forma en que se define una [matriz bidimensional dispersa](https://en.wikipedia.org/wiki/Sparse_matrix). Los valores en esta estructura de datos se identifican como `deposit[L1 token addr][L2 token addr]`. El valor por defecto es cero. Sólo las celdas que están configuradas en un valor diferente se escriben en el almacenamiento. + +```solidity + + /*************** + * Constructor * + ***************/ + + // This contract lives behind a proxy, so the constructor parameters will go unused. + constructor() CrossDomainEnabled(address(0)) {} +``` + +Para poder actualizar este contrato sin tener que copiar todas las variables en el almacenamiento. Para ello usamos un [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy), un contrato que usa [`delegatecall`](https://solidity-by-example.org/delegatecall/) para transferir llamadas a un contacto separado cuya dirección se almacena en el contrato proxy (cuando actualice se le dice al proxy que cambie esa dirección). Cuando usas `delegatecall` el almacenamiento sigue siendo el almacenamiento del contrato _de llamada_, para que los valores de todas las variables del estado del contrato no se vean afectados. + +Un efecto de este patrón es que el almacenamiento del contrato que es el _called_ de `delegatecall` no se utiliza y por tanto, los valores del constructor que le son pasados no importan. Esta es la razón por la que podemos proporcionar un valor sin sentido al constructor `CrossDomainEnabled`. También es la razón por la que la inicialización a continuación es independiente del constructor. + +```solidity + /****************** + * Initialization * + ******************/ + + /** + * @param _l1messenger L1 Messenger address being used for cross-chain communications. + * @param _l2TokenBridge L2 standard bridge address. + */ + // slither-disable-next-line external-function +``` + +Esta [prueba Slither](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) identifica funciones que no son llamadas desde el código del contrato y por lo tanto podrían declararse `external` en lugar de `public`. El coste de gas de `external` puede ser menor, porque pueden ser proporcionadas con parámetros en los datos de llamada. Las funciones declaradas `public` deben ser accesibles desde el contrato. Los contratos no pueden modificar sus propios datos de llamada, por lo que los parámetros deben estar en memoria. Cuando tal función se llama externamente, es necesario copiar los datos de llamada a la memoria, lo que cuesta gas. En este caso la función sólo se llama una vez, por lo que la ineficiencia no nos importa. + +```solidity + function initialize(address _l1messenger, address _l2TokenBridge) public { + require(messenger == address(0), "Contract has already been initialized."); +``` + +La función `initialize` debe ser llamada una única vez. Si la dirección del mensajero de dominio cruzado L1 o el token de puente L2 cambia, creamos un nuevo proxy y un nuevo puente que lo llame. Es poco probable que esto ocurra, excepto cuando se actualiza todo el sistema, algo muy raro. + +Tenga en cuenta que esta función no tiene ningún mecanismo que restringe _quién_ puede llamarlo. Esto significa que en teoría un atacante podría esperar hasta que despliegue el proxy y la primera versión del puente y luego [front-run](https://solidity-by-example.org/hacks/front-running/) para llegar a la función `initialize` antes de que el usuario legítimo lo haga. Pero hay dos métodos para prevenir esto: + +1. Si los contratos se despliegan no directamente por un EOA sino [en una transacción que tiene otro contrato que los crea](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595) el proceso completo puede ser atómico, y terminar antes de que se ejecute cualquier otra transacción. +2. Si falla la llamada legítima a `initialize` siempre es posible ignorar el proxy recién creado y el puente, y crear uno nuevo. + +```solidity + messenger = _l1messenger; + l2TokenBridge = _l2TokenBridge; + } +``` + +Estos son los dos parámetros que el puente necesita conocer. + +```solidity + + /************** + * Depositing * + **************/ + + /** @dev Modifier requiring sender to be EOA. This check could be bypassed by a malicious + * contract via initcode, but it takes care of the user error we want to avoid. + */ + modifier onlyEOA() { + // Used to stop deposits from contracts (avoid accidentally lost tokens) + require(!Address.isContract(msg.sender), "Account not EOA"); + _; + } +``` + +Esta es la razón por la que necesitábamos las utilidades de `Address` de OpenZeppelin. + +```solidity + /** + * @dev This function can be called with no data + * to deposit an amount of ETH to the caller's balance on L2. + * Since the receive function doesn't take data, a conservative + * default amount is forwarded to L2. + */ + receive() external payable onlyEOA { + _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes("")); + } +``` + +Esta función existe con fines de prueba. Tenga en cuenta que no aparece en las definiciones de la interfaz - no es para uso normal. + +```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); + } +``` + +Estas dos funciones son envolturas alrededor de `_initiateETHDeposit`, la función que gestiona el depósito ETH actual. + +```solidity + /** + * @dev Performs the logic for deposits by storing the ETH and informing the L2 ETH Gateway of + * the deposit. + * @param _from Account to pull the deposit from on L1. + * @param _to Account to give the deposit to on L2. + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function _initiateETHDeposit( + address _from, + address _to, + uint32 _l2Gas, + bytes memory _data + ) internal { + // Construct calldata for finalizeDeposit call + bytes memory message = abi.encodeWithSelector( +``` + +La forma en que funcionan los mensajes entre dominios es que el contrato de destino es llamado con el mensaje como sus datos de llamada. Los contratos de Solidity interpretan siempre que sus datos de llamada están de acuerdo con [las especificaciones ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html). La función de Solidity [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) crea esos datos de llamada. + +```solidity + IL2ERC20Bridge.finalizeDeposit.selector, + address(0), + Lib_PredeployAddresses.OVM_ETH, + _from, + _to, + msg.value, + _data + ); +``` + +El mensaje aquí es llamar a [la función `finalizeDeposit`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) con estos parámetros: + +| Parámetro | Valor | Significado | +| ----------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | +| \_l1Token | address(0) | Valor especial para representar ETH (que no es un token ERC-20) en L1 | +| \_l2Token | Lib_PredeployAddresses.OVM_ETH | El contrato L2 que administra ETH en Optimism, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (este contrato es sólo para uso interno de Optimism) | +| \_from | \_from | La dirección en L1 que envía el ETH | +| \_to | \_to | La dirección en L2 que recibe el ETH | +| amount | msg.value | Cantidad de wei enviados (que ya ha sido enviado al puente) | +| \_data | \_data | Fecha adicional a adjuntar al depósito | + +```solidity + // Send calldata into L2 + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); +``` + +Enviar el mensaje a través del mensajero de dominio cruzado. + +```solidity + // slither-disable-next-line reentrancy-events + emit ETHDepositInitiated(_from, _to, msg.value, _data); + } +``` + +Emitir un evento para informar de cualquier aplicación descentralizada que escuche esta transferencia. + +```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); + } +``` + +Estas dos funciones son envolturas alrededor de `_initiateERC20Deposit`, la función que gestiona el depósito ERC-20 actual. + +```solidity + /** + * @dev Performs the logic for deposits by informing the L2 Deposited Token + * contract of the deposit and calling a handler to lock the L1 funds. (e.g. transferFrom) + * + * @param _l1Token Address of the L1 ERC20 we are depositing + * @param _l2Token Address of the L1 respective L2 ERC20 + * @param _from Account to pull the deposit from on L1 + * @param _to Account to give the deposit to on L2 + * @param _amount Amount of the ERC20 to deposit. + * @param _l2Gas Gas limit required to complete the deposit on L2. + * @param _data Optional data to forward to L2. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function _initiateERC20Deposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) internal { +``` + +Esta función es similar a la función `_initiateETHDeposit` anterior, con algunas diferencias importantes. La primera diferencia es que esta función recibe las direcciones del token y la cantidad a transferir como parámetros. En el caso de ETH la llamada al puente ya incluye la transferencia del activo a la cuenta del puente (`msg.value`). + +```solidity + // When a deposit is initiated on L1, the L1 Bridge transfers the funds to itself for future + // withdrawals. safeTransferFrom also checks if the contract has code, so this will fail if + // _from is an EOA or address(0). + // slither-disable-next-line reentrancy-events, reentrancy-benign + IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount); +``` + +Las transferencias de tokens ERC-20 siguen un proceso diferente de ETH: + +1. El usuario (`_from`) le da una autorización al puente para transferir los tokens apropiados. +2. El usuario llama al puente con la dirección del contrato de token, la cantidad, etc. +3. El puente transfiere los tokens (a sí mismo) como parte del proceso de depósito. + +El primer paso puede ocurrir en una transacción separada de los dos últimos. Sin embargo, ejecutar front-running no es un problema porque las dos funciones que llaman a `_initiateERC20Deposit` (`depositERC20` y `depositERC20To`) solo llaman a esta función con `msg.sender` como el parámetro `_from`. + +```solidity + // Construct calldata for _l2Token.finalizeDeposit(_to, _amount) + bytes memory message = abi.encodeWithSelector( + IL2ERC20Bridge.finalizeDeposit.selector, + _l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + + // Send calldata into 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; +``` + +Añade la cantidad de tokens depositados a la estructura de datos de `depósitos`. Puede haber varias direcciones en L2 que correspondan con el mismo token ERC-20 L1, por lo que no es suficiente con usar el saldo del puente del token ERC-20 L1 para hacer un seguimiento de los depósitos. + +```solidity + + // slither-disable-next-line reentrancy-events + emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data); + } + + /************************* + * Cross-chain Functions * + *************************/ + + /** + * @inheritdoc IL1StandardBridge + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +El puente L2 envía un mensaje al mensajero de dominio cruzado L2 que causa que el mensajero de dominio cruzado L1 llame a esta función (una vez que [la transacción que finaliza el mensaje](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions) se envía en L1, por supuesto). + +```solidity + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +Asegúrate de que este es un mensaje _legítimo_, proveniente del mensajero de dominio cruzado y que se origina con el token de puente L2. Esta función se utiliza para retirar ETH del puente, así que tenemos que asegurarnos de que sólo es llamada por el llamador autorizado. + +```solidity + // slither-disable-next-line reentrancy-events + (bool success, ) = _to.call{ value: _amount }(new bytes(0)); +``` + +La forma de transferir ETH es llamar al recipiente con la cantidad de wei en el `msg.value`. + +```solidity + require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); + + // slither-disable-next-line reentrancy-events + emit ETHWithdrawalFinalized(_from, _to, _amount, _data); +``` + +Emitir un evento sobre el retiro. + +```solidity + } + + /** + * @inheritdoc IL1ERC20Bridge + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +Esta función es similar a la función `finalizeETHWithdrawal` anterior, con los cambios necesarios para los tokens de ERC-20. + +```solidity + deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount; +``` + +Actualizar la estructura de datos de `depósitos`. + +```solidity + + // When a withdrawal is finalized on L1, the L1 Bridge transfers the funds to the withdrawer + // 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); + } + + + /***************************** + * Temporary - Migrating ETH * + *****************************/ + + /** + * @dev Adds ETH balance to the account. This is meant to allow for ETH + * to be migrated from an old gateway to a new gateway. + * NOTE: This is left for one upgrade only so we are able to receive the migrated ETH from the + * old contract + */ + function donateETH() external payable {} +} +``` + +Hubo una implementación anterior del puente. Cuando pasamos de la implementación a ésta, tuvimos que mover todos los activos. Los tokens ERC-20 pueden moverse sin más. Sin embargo, para transferir ETH a un contrato necesitas la aprobación de ese contrato, que es lo que `donateETH` nos proporciona. + +## Tokens ERC-20 en L2 {#erc-20-tokens-on-l2} + +Para que un token ERC-20 se ajuste al puente estándar, necesita permitir el puente estándar, y _solo_ el puente estándar, para acuñar el token. Esto es necesario porque los puentes deben garantizar que el número de tokens que circulan en Optimism sea igual al número de tokens que se encuentran bloqueados dentro del contrato de puente L1. Si hay demasiados tokens en L2 algunos usuarios no podrían puentear sus activos de vuelta a L1. En lugar de un puente de confianza, esencialmente recrearíamos [banca de reserva fraccionaria](https://www.investopedia.com/terms/f/fractionalreservebanking.asp). Si hay demasiados tokens en L1, algunos de esos tokens permanecerían bloqueados dentro del contrato de puente para siempre porque no hay forma de liberarlos sin quemar los tokens de L2. + +### IL2StandardERC20 {#il2standarderc20} + +Todos los tokens ERC-20 en L2 que utilicen el puente estándar deben proporcionar [esta interfaz](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol), que tiene las funciones y eventos que el puente estándar necesita. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[La interfaz estándar de ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) no incluye las funciones `mint` y `burn`. Esos métodos no son requeridos por [el estándar ERC-20](https://eips.ethereum.org/EIPS/eip-20), lo que deja sin especificar los mecanismos para crear y destruir tokens. + +```solidity +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +``` + +[La interfaz ERC-165](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) se utiliza para especificar que funciones proporciona un contrato. [Puedes leer el estándar aquí](https://eips.ethereum.org/EIPS/eip-165). + +```solidity +interface IL2StandardERC20 is IERC20, IERC165 { + function l1Token() external returns (address); +``` + +Esta función proporciona la dirección del token L1 que está puenteado a este contrato. Tenga en cuenta que no tenemos una función similar en la dirección opuesta. Tenemos que ser capaces de puentear cualquier token L1, independientemente de que el soporte a L2 se haya planificado o no cuando se implementó. + +```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); +} +``` + +Funciones y eventos para acuñar (cear) y quemar (destruir) tokens. El puente debe ser la única entidad que puede ejecutar estas funciones para asegurar que el número de tokens es correcto (igual al número de tokens bloqueados en L1). + +### L2StandardERC20 {#L2StandardERC20} + +[Esta es nuestra implementación de la interfaz `IL2StandardERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol). A menos que necesite algún tipo de lógica personalizada, debería utilizar esta. + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +``` + +[El contrato OpenZeppelin ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol). Optimism no cree en reinventar la rueda, especialmente cuando la rueda está bien auditada y necesita ser lo suficientemente fiable como para mantener los activos. + +```solidity +import "./IL2StandardERC20.sol"; + +contract L2StandardERC20 is IL2StandardERC20, ERC20 { + address public l1Token; + address public l2Bridge; +``` + +Estos son los dos parámetros de configuración adicionales que requerimos, y ERC-20 normalmente no lo hace. + +```solidity + + /** + * @param _l2Bridge Address of the L2 standard bridge. + * @param _l1Token Address of the corresponding L1 token. + * @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; + } +``` + +Primero llamamos al constructor del contrato del que heredamos (`ERC20(_name, _symbol)`) y luego establecemos nuestras propias variables. + +```solidity + + modifier onlyL2Bridge() { + require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn"); + _; + } + + + // 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; + } +``` + +Esta es la manera en que [ERC-165](https://eips.ethereum.org/EIPS/eip-165) funciona. Cada interfaz es un número de funciones soportadas, y se identifica como la [exclusiva o](https://en.wikipedia.org/wiki/Exclusive_or) de los [selectores de funciones ABI](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) de esas funciones. + +El puente L2 utiliza ERC-165 como comprobación de la cordura para asegurarse de que el contrato ERC-20 al que envía activos es un `IL2StandardERC20`. + +**Nota:** No hay nada que impida que un contrato deshonesto proporcione respuestas falsas a `supportsInterface`, por lo que se trata de un mecanismo de comprobación de salubridad, _no_ de un mecanismo de seguridad. + +```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); + } +} +``` + +Sólo el puente L2 puede acuñar y quemar activos. + +`_mint` y `_burn` están actualmente definidos en el [contrato OpenZeppelin ERC-20](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn). Ese contrato simplemente no los expone externamente, porque las condiciones para acuñar y quemar tokens son tan variadas como el número de maneras de usar ERC-20. + +## Código Puente L2 {#l2-bridge-code} + +Este es el código que ejecuta el puente sobre Optimism. [La fuente de este contrato está aquí](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; + +/* Interface Imports */ +import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol"; +import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol"; +``` + +La interfaz [IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) es muy similar a la [L1 equivalente](#IL1ERC20Bridge) que vimos arriba. Hay dos diferencias significativas: + +1. En L1 usted inicia depósitos y finaliza retiros. Aquí usted inicia retiros y finaliza depósitos. +2. En L1 es necesario distinguir entre ETH y tokens ERC-20. En L2 podemos usar las mismas funciones para ambos porque internamente los saldos ETH en Optimism son manejados como un token ERC-20 con la dirección[0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD000](https://optimistic.etherscan.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000). + +```solidity +/* Library Imports */ +import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; + +/* Contract Imports */ +import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol"; + +/** + * @title L2StandardBridge + * @dev The L2 Standard bridge is a contract which works together with the L1 Standard bridge to + * enable ETH and ERC20 transitions between L1 and L2. + * This contract acts as a minter for new tokens when it hears about deposits into the L1 Standard + * bridge. + * This contract also acts as a burner of the tokens intended for withdrawal, informing the L1 + * bridge to release L1 funds. + */ +contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { + /******************************** + * External Contract References * + ********************************/ + + address public l1TokenBridge; +``` + +Mantener un registro de la dirección del puente L1. Tenga en cuenta que en contraste con el equivalente L1, aquí _necesitamos_ esta variable. La dirección del puente L1 no es conocida de antemano. + +```solidity + + /*************** + * Constructor * + ***************/ + + /** + * @param _l2CrossDomainMessenger Cross-domain messenger used by this contract. + * @param _l1TokenBridge Address of the L1 bridge deployed to the main chain. + */ + constructor(address _l2CrossDomainMessenger, address _l1TokenBridge) + CrossDomainEnabled(_l2CrossDomainMessenger) + { + l1TokenBridge = _l1TokenBridge; + } + + /*************** + * Withdrawing * + ***************/ + + /** + * @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); + } +``` + +Estas dos funciones inician retiros. Tenga en cuenta que no hay necesidad de especificar la dirección del token L1. Se espera que los tokens L2 nos digan la dirección equivalente en L1. + +```solidity + + /** + * @dev Performs the logic for withdrawals by burning the token and informing + * the L1 token Gateway of the withdrawal. + * @param _l2Token Address of L2 token where withdrawal is initiated. + * @param _from Account to pull the withdrawal from on L2. + * @param _to Account to give the withdrawal to on L1. + * @param _amount Amount of the token to withdraw. + * @param _l1Gas Unused, but included for potential forward compatibility considerations. + * @param _data Optional data to forward to L1. This data is provided + * solely as a convenience for external contracts. Aside from enforcing a maximum + * length, these contracts provide no guarantees about its content. + */ + function _initiateWithdrawal( + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) internal { + // When a withdrawal is initiated, we burn the withdrawer's funds to prevent subsequent L2 + // usage + // slither-disable-next-line reentrancy-events + IL2StandardERC20(_l2Token).burn(msg.sender, _amount); +``` + +Ten en cuenta que _no _ dependemos del parámetro `_from` sino de `msg.sender` que es mucho más difícil de falsificar (imposible, por lo que sé). + +```solidity + + // Construct calldata for l1TokenBridge.finalizeERC20Withdrawal(_to, _amount) + // slither-disable-next-line reentrancy-events + address l1Token = IL2StandardERC20(_l2Token).l1Token(); + bytes memory message; + + if (_l2Token == Lib_PredeployAddresses.OVM_ETH) { +``` + +En L1 es necesario distinguir entre ETH y tokens ERC-20. + +```solidity + message = abi.encodeWithSelector( + IL1StandardBridge.finalizeETHWithdrawal.selector, + _from, + _to, + _amount, + _data + ); + } else { + message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + } + + // Send message up to L1 bridge + // 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 Function: Depositing * + ************************************/ + + /** + * @inheritdoc IL2ERC20Bridge + */ + function finalizeDeposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +Esta función es llamada por `L1StandardBridge`. + +```solidity + ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) { +``` + +Asegúrese de que la fuente del mensaje es legítima. Esto es importante porque esta función llama a `_mint` y podría ser usada para entregar tokens que no están cubiertos por los tokens que el puente posee en L1. + +```solidity + // Check the target token is compliant and + // verify the deposited token on L1 matches the L2 deposited token representation here + if ( + // slither-disable-next-line reentrancy-events + ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) && + _l1Token == IL2StandardERC20(_l2Token).l1Token() +``` + +Comprobaciones de sanidad: + +1. La interfaz correcta está soportada +2. La dirección del contrato ERC-20 L2 en L1 coincide con la fuente L1 de los tokens + +```solidity + ) { + // When a deposit is finalized, we credit the account on L2 with the same amount of + // tokens. + // 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); +``` + +Si las comprobaciones de sanidad se superan, finaliza el depósito: + +1. Acuña los tokens +2. Emite el evento apropiado + +```solidity + } else { + // Either the L2 token which is being deposited-into disagrees about the correct address + // of its L1 token, or does not support the correct interface. + // This should only happen if there is a malicious L2 token, or if a user somehow + // specified the wrong L2 token address to deposit into. + // In either case, we stop the process here and construct a withdrawal + // message so that users can get their funds out in some cases. + // There is no way to prevent malicious token contracts altogether, but this does limit + // user error and mitigate some forms of malicious contract behavior. +``` + +Si un usuario realizó un error detectable mediante el uso de la dirección de token L2 incorrecta, queremos cancelar el depósito y devolver los tokens en L1. La única vía de hacerlo desde L2 es enviar un mensaje que tenga que esperar el período del desafío de falta, pero eso es mucho mejor para el usuario que perder los tokens permanentemente. + +```solidity + bytes memory message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + _l1Token, + _l2Token, + _to, // switched the _to and _from here to bounce back the deposit to the sender + _from, + _amount, + _data + ); + + // Send message up to L1 bridge + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l1TokenBridge, 0, message); + // slither-disable-next-line reentrancy-events + emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data); + } + } +} +``` + +## Conclusión {#conclusion} + +El puente estándar es el mecanismo más flexible para las transferencias de activos. Sin embargo, debido a que es tan genérico no siempre es el mecanismo más fácil de utilizar. Especialmente para retiros, la mayoría de los usuarios prefieren usar [puentes de terceros](https://www.optimism.io/apps/bridges) que no esperen el periodo de desafío y no requieren una prueba de Merkle para finalizar el retiro. + +Estos puentes normalmente funcionan teniendo activos en L1, que proporcionan inmediatamente por una pequeña tarifa (a menudo menor que el costo del gas para un retiro de puente estándar). Cuando el puente (o la gente que lo ejecuta) anticipa quedarse corto en activos L1 transfiere suficientes activos de L2. Como se trata de retiros muy grandes, el coste de la retirada se amortiza sobre una gran cantidad y es un porcentaje mucho menor. + +Esperemos que este artículo le haya ayudado a entender más sobre cómo funciona la capa 2, y cómo escribir el código de Solidity de manera clara y segura. diff --git a/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md new file mode 100644 index 00000000000..104af390c9c --- /dev/null +++ b/public/content/translations/es/developers/tutorials/reverse-engineering-a-contract/index.md @@ -0,0 +1,744 @@ +--- +title: "Aplicación de ingeniería inversa en un contrato" +description: Cómo entender un contrato cuando no tiene el código fuente +author: Ori Pomerantz +lang: es +tags: + - "evm" + - "códigos de operación" +skill: advanced +published: 2021-12-30 +--- + +## Introducción {#introduction} + +_No hay secretos en la cadena de bloques_, todo lo que sucede es consistente, verificable y se encuentra públicamente disponible. Idealmente, [los contratos debieran tener su codigo fuente publicado y verificado en Etherscan](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code). Sin embargo, [este no siempre es el caso](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code). En este articulo puede aprender cómo aplicar ingenieria inversa a los contratos revisando el contrato sin su código fuente, [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f). + +Hay compiladores inversos, pero no siempre producen [resultados utilizables](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f). En este artículo aprenderá a realizar ingeniería inversa manualmente y entender un contrato a partir de [los códigos de operación](https://github.com/wolflo/evm-opcodes), así como a interpretar los resultados de un decompilador. + +Para poder entender este artículo, ya debería conocer los conceptos básicos de la EVM y estar al menos un poco familiarizado con el ensamblador de EVM. [Puede leer sobre estos temas aquí](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e). + +## Preparar el código ejecutable {#prepare-the-executable-code} + +Puede obtener los códigos de operación yendo a Etherscan para el contrato, haciendo clic en la pestaña **Contract** y luego en **Switch to Opcodes View**. Obtendrá una vista que mostrará un código de operación por línea. + +![Vista de código de operación de Etherscan](opcode-view.png) + +Sin embargo, para poder entender los saltos, necesita saber en qué parte del código se encuentra cada código de operación. Para ello, una forma es abrir una hoja de cálculo de Google y pegar los códigos de operación en la columna C. [Puede omitir los siguientes pasos haciendo una copia de esta hoja de cálculo ya preparada](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing). + +El siguiente paso es obtener las ubicaciones correctas del código para entender los saltos. Pondremos el tamaño del código de operación en la columna B y la ubicación (en hexadecimal) en la columna A. Escriba esta función en la celda `B1` y luego cópiela y péguela para el resto de la columna B, hasta el final del código. Después de hacer esto, puede ocultar la columna B. + +``` +=1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) +``` + +Primero, esta función agrega un byte para el código de operación en sí y luego busca `PUSH`. Los códigos de operación push son especiales porque necesitan tener bytes adicionales para el valor que se está empujando. Si el código de operación es `PUSH`, extraemos el número de bytes y lo añadimos. + +En `A1` ponga el primer desplazamiento, cero. Luego, en `A2`, ponga esta función y vuelva a copiarla y pegarla para el resto de la columna A: + +``` +=dec2hex(hex2dec(A1)+B1) +``` + +Necesitamos que esta función nos dé el valor hexadecimal porque los valores que se empujan antes de los saltos (`JUMP` y `JUMPI`) se nos dan en valor hexadecimal. + +## El punto de entrada (0x00) {#the-entry-point-0x00} + +Los contratos siempre se ejecutan desde el primer byte. Esta es la parte inicial del código: + +| Offset | Código de operación | Pila (después del código de operación) | +| ------:| ------------------- | -------------------------------------- | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | Vacío | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE<4 | +| C | JUMPI | Vacío | + +Este código hace dos cosas: + +1. Escribe 0x80 como valor de 32 bytes en las ubicaciones de memoria 0x40-0x5F (0x80 se almacena en 0x5F, y 0x40-0x5E son todos ceros). +2. Leer el tamaño de los datos de llamada. Normalmente, los datos de llamada de un contrato de Ethereum siguen [la ABI (interfaz binaria de la aplicación)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html), que como mínimo requiere cuatro bytes para el selector de funciones. Si el tamaño de los datos de la llamada es inferior a cuatro, se salta a 0x5E. + +![Diagrama de flujo de esta porción](flowchart-entry.png) + +### El controlador en 0x5E (para datos de llamadas que no son ABI) {#the-handler-at-0x5e-for-non-abi-call-data} + +| Offset | Código de operación | +| ------:| ------------------- | +| 5E | JUMPDEST | +| 5F | CALLDATASIZE | +| 60 | PUSH2 0x007c | +| 63 | JUMPI | + +Este fragmento comienza con un `JUMPDEST`. Los programas de EVM (máquina virtual de Ethereum) lanzan una excepción si salta a un código de operación que no sea `JUMPDEST`. Luego mira el CALLDATASIZE y si es "verdadero" (es decir, distinto de cero), salta a 0x7C. Veremos esto a continuación. + +| Offset | Código de operación | Pila (después del código de operación) | +| ------:| ------------------- | ----------------------------------------------------------------------------------- | +| 64 | CALLVALUE | [Wei](/glossary/#wei) proporcionado por la llamada. Llamado `msg.value` en Solidity | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | Storage[6] CALLVALUE 0 6 CALLVALUE | + +Así que cuando no hay datos de llamada, leemos el valor de Storage[6]. Todavía no sabemos cuál es este valor, pero podemos buscar transacciones que el contrato haya recibido sin datos de llamada. Las transacciones que solo transfieren ETH sin ningún dato de llamada (y, por lo tanto, ningún método) tienen en Etherscan el método `Transfer`. De hecho, [la primera transacción que recibió el contrato](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) es una transferencia. + +Si miramos en esa transacción y hacemos clic en **Click to see More**, vemos que los datos de llamada, llamados datos de entrada, están de hecho vacíos (`0x`). Tenga en cuenta también que el valor es de 1,559 ETH, lo que será relevante más adelante. + +![Los datos de la llamada están vacíos](calldata-empty.png) + +A continuación, haga clic en la pestaña **State** y expanda el contrato en el que estamos haciendo ingeniería inversa (0x2510...). Puede ver que `Storage[6]` cambió durante la transacción, y si cambia Hex a **Number**, verá que se convirtió en 1.559.000.000.000.000.000, el valor transferido en wei (añadí los puntos para mayor claridad), correspondiente al valor del contrato siguiente. + +![El cambio en Storage[6]](storage6.png) + +Si miramos los cambios de estado causados por [otras transacciones `Transfer` del mismo período](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange), vemos que `Storage[6]` realizó un seguimiento del valor del contrato durante un tiempo. Por ahora lo llamaremos `Value*`. El asterisco (`*`) nos recuerda que aún no _sabemos_ lo que hace esta variable, pero no puede ser solo para rastrear el valor del contrato porque no hay necesidad de usar el almacenamiento, que es muy caro, cuando puede obtener el saldo de sus cuentas usando `ADDRESS BALANCE`. El primer código de operación empuja la dirección del contrato. El segundo lee la dirección en la parte superior de la pila y la reemplaza con el saldo de esa dirección. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | --------------------------------------------- | +| 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE | +| 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE | +| 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 74 | JUMP | | + +Seguiremos rastreando este código en el destino de salto. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------------------------- | +| 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | + +El `NOT` es bitwise, por lo que invierte el valor de cada bit en el valor de llamada. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------------------------------------------- | +| 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AE | ISZERO | Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AF | PUSH2 0x01df | 0x01DF Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1B2 | JUMPI | | + +Saltamos si `Value*` es menor que 2^256-CALLVALUE-1 o igual. Esto parece lógica para evitar el desbordamiento. Y, de hecho, vemos que después de algunas operaciones sin sentido (escribir en la memoria está a punto de eliminarse, por ejemplo) en el desplazamiento 0x01DE, el contrato se revierte si se detecta el desbordamiento, que es un comportamiento normal. + +Tenga en cuenta que tal desbordamiento es extremadamente improbable, porque requeriría que el valor de llamada más `Value*` sea comparable a 2^256 wei, alrededor de 10^59 ETH. [El suministro total de ETH, al momento de escribir esto, es inferior a doscientos millones](https://etherscan.io/stat/supply). + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------- | +| 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE | +| 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE | +| 1E3 | JUMP | | + +Si llegamos aquí, obtenga `Value* + CALLVALUE` y salte al desplazamiento 0x75. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | --------------------------------- | +| 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE | +| 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE | +| 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | + +Si llegamos aquí (lo que requiere que los datos de la llamada estén vacíos), añadimos a `Value*` el valor de la llamada. Esto es consistente con lo que decimos que hacen las transferencias `Transfer`. + +| Offset | Código de operación | +| ------:| ------------------- | +| 79 | POP | +| 7A | POP | +| 7B | DETENER | + +Finalmente, borre la pila (no es necesario) e indique el final exitoso de la transacción. + +En resumen, aquí hay un diagrama de flujo del código inicial. + +![Diagrama de flujo del punto de entrada](flowchart-entry.png) + +## El controlador en 0x7C {#the-handler-at-0x7c} + +No puse a propósito en el encabezado lo que hace este controlador. El punto no es enseñarle cómo funciona este contrato específico, sino cómo aplicar ingeniería inversa a los contratos. Aprenderá lo que hace de la misma manera que yo, siguiendo el código. + +Llegamos aquí desde varios lugares: + +- Si hay datos de llamada de 1, 2 o 3 bytes (desde el desplazamiento 0x63) +- Si se desconoce la firma del método (de los desplazamientos 0x42 y 0x5D) + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------------- | +| 7C | JUMPDEST | | +| 7D | PUSH1 0x00 | 0x00 | +| 7F | PUSH2 0x009d | 0x9D 0x00 | +| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | +| 84 | SLOAD | Storage[3] 0x9D 0x00 | + +Esta es otra celda de almacenamiento, una que no pude encontrar en ninguna transacción, por lo que es más difícil saber lo que significa. El siguiente código lo hará más claro. + +| Offset | Código de operación | Pila | +| ------:| ------------------------------------------------- | ------------------------------- | +| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff Storage[3] 0x9D 0x00 | +| 9A | AND | Storage[3]-as-address 0x9D 0x00 | + +Estos códigos de operación truncan el valor que leemos de Storage[3] a 160 bits, la longitud de una dirección de Ethereum. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------- | +| 9B | SWAP1 | 0x9D Storage[3]-as-address 0x00 | +| 9C | JUMP | Storage[3]-as-address 0x00 | + +Este salto es superfluo, ya que vamos al siguiente código de operación. Este código no es tan eficiente en materia de gas como podría ser. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------- | +| 9D | JUMPDEST | Storage[3]-as-address 0x00 | +| 9E | SWAP1 | 0x00 Storage[3]-as-address | +| 9F | POP | Storage[3]-as-address | +| A0 | PUSH1 0x40 | 0x40 Storage[3]-as-address | +| A2 | MLOAD | Mem[0x40] Storage[3]-as-address | + +Al principio del código establecimos Mem[0x40] en 0x80. Si miramos 0x40 más adelante, vemos que no lo cambiamos, por lo que podemos asumir que es 0x80. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------------- | +| A3 | CALLDATASIZE | CALLDATASIZE 0x80 Storage[3]-as-address | +| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | +| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 Storage[3]-as-address | +| A7 | CALLDATACOPY | 0x80 Storage[3]-as-address | + +Copie todos los datos de la llamada a la memoria, comenzando en 0x80. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------------------------------------------------------------------------- | +| A8 | PUSH1 0x00 | 0x00 0x80 Storage[3]-as-address | +| AA | DUP1 | 0x00 0x00 0x80 Storage[3]-as-address | +| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AD | DUP6 | Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AE | GAS | GAS Storage[3]-as-address 0x80 CALLDATASIZE 0x00 0x00 0x80 Storage[3]-as-address | +| AF | DELEGATE_CALL | | + +Ahora las cosas están mucho más claras. Este contrato puede actuar como [proxy](https://blog.openzeppelin.com/proxy-patterns/), llamando a la dirección en Storage[3] para que haga el trabajo real. `DELEGATE_CALL` llama a un contrato separado, pero permanece en el mismo almacenamiento. Esto significa que el contrato delegado, para el que somos un proxy, accede al mismo espacio de almacenamiento. Los parámetros de la llamada son: + +- _Gas_: Todo el gas restante +- _Called address_: Storage[3]-as-address +- _Call data_: Los bytes CALLDATASIZE a partir de 0x80, que es donde ponemos los datos de llamada originales +- _Return data_: Ninguno (0x00 - 0x00); obtendremos los datos de devolución por otros medios (ver más abajo) + +| Offset | Código de operación | Pila | +| ------:| ------------------- | --------------------------------------------------------------------------------------------- | +| B0 | RETURNDATASIZE | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B5 | RETURNDATACOPY | RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | + +Aquí copiamos todos los datos de retorno al búfer de memoria a partir de 0x80. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| B6 | DUP2 | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B7 | DUP1 | (((call success/failure))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B8 | ISZERO | (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| B9 | PUSH2 0x00c0 | 0xC0 (((did the call fail))) (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BC | JUMPI | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BD | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BE | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| BF | REGRESAR | | + +Así que después de la llamada copiamos los datos de retorno en el búfer 0x80 - 0x80+RETURNDATASIZE, y si la llamada tiene éxito, entonces devolvemos (`RETURN`) con exactamente ese búfer. + +### DELEGATECALL fallido {#delegatecall-failed} + +Si llegamos aquí, a 0xC0, significa que el contrato al que llamamos se revirtió. Como solo somos un proxy de ese contrato, queremos devolver los mismos datos y también revertirlos. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------------------------------------------------------------------------------- | +| C0 | JUMPDEST | (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| C1 | DUP2 | RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| C2 | DUP5 | 0x80 RETURNDATASIZE (((call success/failure))) RETURNDATASIZE (((call success/failure))) 0x80 Storage[3]-as-address | +| C3 | REVERTIR | | + +Así que hacemos `REVERT` con el mismo búfer que usamos para `RETURN` antes: 0x80 - 0x80+RETURNDATASIZE + +![Diagrama de flujo de llamada a proxy](flowchart-proxy.png) + +## Llamadas a ABI {#abi-calls} + +Si el tamaño de los datos de la llamada es de cuatro bytes o más, esta podría ser una llamada ABI válida. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------------- | +| D | PUSH1 0x00 | 0x00 | +| F | CALLDATALOAD | (((First word (256 bits) of the call data))) | +| 10 | PUSH1 0xe0 | 0xE0 (((First word (256 bits) of the call data))) | +| 12 | SHR | (((first 32 bits (4 bytes) of the call data))) | + +Etherscan nos dice que `1C` es un código de operación desconocido, porque [se añadió después de que Etherscan escribiera esta función](https://eips.ethereum.org/EIPS/eip-145) y no la han actualizado. Una [tabla actualizada de códigos de operación](https://github.com/wolflo/evm-opcodes) nos muestra que esto es un cambio a la derecha (shift right). + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------------------------------------------------------------------------------------------------- | +| 13 | DUP1 | (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | +| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((first 32 bits (4 bytes) of the call data))) (((first 32 bits (4 bytes) of the call data))) | +| 19 | GT | 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | +| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>first-32-bits-of-the-call-data (((first 32 bits (4 bytes) of the call data))) | +| 1D | JUMPI | (((first 32 bits (4 bytes) of the call data))) | + +Al dividir las pruebas de coincidencia de firma del método en dos de esta forma, esto ahorra la mitad de las pruebas en promedio. El código que inmediatamente sigue esto y el código en 0x43 siguen el mismo patrón: `DUP1` los primeros 32 bits de los datos de llamada, `PUSH4 (((method signature>`, ejecutar `EQ` para revisar la equidad y luego `JUMPI` si la firma del método coincide. Aquí están las firmas del método, sus direcciones y, si se conoce, la [definición de método correspondiente](https://www.4byte.directory/): + +| Método | Firma del método | Offset para saltar | +| -------------------------------------------------------------------------------------- | ---------------- | ------------------ | +| [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 | + +Si no se encuentra ninguna coincidencia, el código salta al [controlador de proxy en 0x7C](#the-handler-at-0x7c), con la esperanza de que el contrato en el que somos proxy tenga una coincidencia. + +![Diagrama de flujo de llamadas ABI](flowchart-abi.png) + +## splitter() {#splitter} + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ----------------------------- | +| 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 | REVERTIR | | + +Lo primero que hace esta función es comprobar que la llamada no haya enviado ETH. Esta función no es [`pagable`](https://solidity-by-example.org/payable/). Si alguien nos envió ETH, debe ser un error, y queremos revertir (`REVERT`) para evitar tener ETH que no puedan recuperar. + +| Offset | Código de operación | Pila | +| ------:| ------------------------------------------------- | --------------------------------------------------------------------------- | +| 10F | JUMPDEST | | +| 110 | POP | | +| 111 | PUSH1 0x03 | 0x03 | +| 113 | SLOAD | (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 114 | PUSH1 0x40 | 0x40 (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 116 | MLOAD | 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 12C | SWAP1 | 0x80 0xFF...FF (((Storage[3] a.k.a the contract for which we are a proxy))) | +| 12D | SWAP2 | (((Storage[3] a.k.a the contract for which we are a proxy))) 0xFF...FF 0x80 | +| 12E | AND | ProxyAddr 0x80 | +| 12F | DUP2 | 0x80 ProxyAddr 0x80 | +| 130 | MSTORE | 0x80 | + +Y 0x80 ahora contiene la dirección del proxy + +| Offset | Código de operación | Pila | +| ------:| ------------------- | --------- | +| 131 | PUSH1 0x20 | 0x20 0x80 | +| 133 | ADD | 0xA0 | +| 134 | PUSH2 0x00e4 | 0xE4 0xA0 | +| 137 | JUMP | 0xA0 | + +### El código E4 {#the-e4-code} + +Esta es la primera vez que vemos estas líneas, pero se comparten con otros métodos (ver más abajo). Así que llamaremos al valor de la pila X y simplemente recordaremos que en `splitter()` el valor de esta X es 0xA0. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ----------- | +| 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 | REGRESAR | | + +Por lo tanto, este código recibe un puntero de memoria en la pila (X) y hace que el contrato haga `RETURN` con un búfer que es 0x80 - X. + +En el caso de `splitter()`, esto devuelve la dirección para la que somos un proxy. `RETURN` devuelve el búfer en 0x80-0x9F, que es donde escribimos estos datos (desplazamiento 0x130 arriba). + +## currentWindow() {#currentwindow} + +El código en los desplazamientos 0x158-0x163 es idéntico al que vimos en 0x103-0x10E en `splitter()` (aparte del destino `JUMPI`), por lo que sabemos que `currentWindow()` tampoco es `payable`. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------------- | +| 164 | JUMPDEST | | +| 165 | POP | | +| 166 | PUSH2 0x00da | 0xDA | +| 169 | PUSH1 0x01 | 0x01 0xDA | +| 16B | SLOAD | Storage[1] 0xDA | +| 16C | DUP2 | 0xDA Storage[1] 0xDA | +| 16D | JUMP | Storage[1] 0xDA | + +### El código DA {#the-da-code} + +Este código también se comparte con otros métodos. Así que llamaremos al valor de la pila Y y simplemente recordaremos que en `currentWindow()` el valor de esta Y es Storage[1]. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ---------------- | +| 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 | + +Escriba Y en 0x80-0x9F. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------- | +| E1 | PUSH1 0x20 | 0x20 0x80 0xDA | +| E3 | ADD | 0xA0 0xDA | + +Y el resto ya está explicado [arriba](#the-e4-code). Así que salta a 0xDA, escribe la parte superior de la pila (Y) en 0x80-0x9F y devuelve ese valor. En el caso de `currentWindow()`, devuelve Storage[1]. + +## merkleRoot() {#merkleroot} + +El código en los desplazamientos 0xED-0xF8 es idéntico al que vimos en 0x103-0x10E en `splitter()` (aparte del destino `JUMPI`), por lo que sabemos que `merkleRoot()` tampoco es `payable`. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------------- | +| F9 | JUMPDEST | | +| FA | POP | | +| FB | PUSH2 0x00da | 0xDA | +| FE | PUSH1 0x00 | 0x00 0xDA | +| 100 | SLOAD | Storage[0] 0xDA | +| 101 | DUP2 | 0xDA Storage[0] 0xDA | +| 102 | JUMP | Storage[0] 0xDA | + +Lo que sucede después del salto [ya lo descubrimos](#the-da-code). Así que `merkleRoot()` devuelve Storage[0]. + +## 0x81e580d3 {#0x81e580d3} + +El código en los desplazamientos 0x138-0x143 es idéntico al que vimos en 0x103-0x10E en `splitter()` (aparte del destino `JUMPI`), por lo que sabemos que esta función tampoco es `payable`. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ------------------------------------------------------------ | +| 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 | + +Parece que esta función toma al menos 32 bytes (una palabra) de datos de llamada. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | -------------------------------------------- | +| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19F | REVERTIR | | + +Si no recibe los datos de la llamada, la transacción se revierte sin ningún dato de devolución. + +Veamos qué sucede si la función _sí_ obtiene los datos de llamada que necesita. + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ---------------------------------------- | +| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | + +`calldataload(4)` es la primera palabra de los datos de llamada _después_ de la firma del método + +| Offset | Código de operación | Pila | +| ------:| ------------------- | ---------------------------------------------------------------------------- | +| 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 | Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 174 | DUP2 | calldataload(4) Storage[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 175 | LT | calldataload(4))`, y otro es `isClaimed()`, así que parece un contrato de airdrop. En lugar de ver el resto opcode por opcode, podemos [probar el decompilador](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), que produce resultados utilizables para tres funciones de este contrato. La ingeniería inversa de los otros se deja como ejercicio para el lector. + +### scaleAmountByPercentage {#scaleamountbypercentage} + +Esto es lo que el decompilador nos da para esta función: + +```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) +``` + +Las primeras pruebas `require` que tienen los datos de la llamada, además de los cuatro bytes de la firma de la función, al menos 64 bytes, suficientes para los dos parámetros. Si no, obviamente hay algo mal. + +La declaración `if` parece comprobar que `_param1` no es cero y que `_param1 * _param2` no es negativo. Probablemente sea para evitar casos de wrap around. + +Por último, la función devuelve un valor escalado. + +### claim {#claim} + +El código que crea el decompilador es complejo, y no todo es relevante para nosotros. Voy a omitir algo de eso para centrarme en las líneas que creo que proporcionan información útil. + +```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' +``` + +Aquí vemos dos cosas importantes: + +- `_param2`, aunque se declara como `uint256`, es en realidad una dirección +- `_param1` es la ventana reclamada, que tiene que ser `currentWindow` o anterior. + +```python + ... + if stor5[_claimWindow][addr(_claimFor)]: + revert with 0, 'Account already claimed the given window' +``` + +Así que ahora sabemos que Storage[5] es una serie de ventanas y direcciones, y si la dirección reclamó la recompensa por esa ventana. + +```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' +``` + +Sabemos que `unknown2eb4a7ab` es en realidad la función `merkleRoot()`, por lo que este código parece que está verificando una [prueba de merkle](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5). Esto significa que `_param4` es una prueba de merkle. + +```python + call addr(_param2) with: + value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei + gas 30000 wei +``` + +Así es como un contrato transfiere su propio ETH a otra dirección (contrato o de propiedad externa). Lo llama con un valor que es la cantidad a transferir. Así que parece que se trata de un airdrop de ETH. + +```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 +``` + +Las dos últimas líneas nos dicen que Storage[2] también es un contrato al que llamamos. Si [miramos la transacción del constructor](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange), vemos que este contrato es [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), un contrato de Ether envuelto (Wrapped Ether) [cuyo código fuente se subió a Etherscan](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code). + +Así que parece que el contrato intenta enviar ETH a `_param2`. Si puede hacerlo, genial. Si no, intenta enviar [WETH](https://weth.io/). Si `_param2` es una cuenta de propiedad externa (EOA), siempre puede recibir ETH, pero los contratos pueden negarse a recibir ETH. Sin embargo, WETH es ERC-20 y los contratos no pueden negarse a aceptarlo. + +```python + ... + log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) +``` + +Al final de la función vemos que se genera una entrada de registro. [Mire las entradas de registro generadas](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) y filtre el tema que comienza con `0xdbd5...`. Si [hacemos clic en una de las transacciones que generaron dicha entrada](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274), vemos que, de hecho, parece una reclamación: la cuenta envió un mensaje al contrato en el que estamos haciendo ingeniería inversa y como retribución obtuvo ETH. + +![Transacción de reclamación (claim)](claim-tx.png) + +### 1e7df9d3 {#1e7df9d3} + +Esta función es muy similar a [`claim`](#claim) arriba. También comprueba una prueba de merkle, intenta transferir ETH a la primera y produce el mismo tipo de entrada de registro. + +```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) +``` + +La principal diferencia es que el primer parámetro, la ventana para hacer el retiro, no está ahí. En su lugar, hay un bucle sobre todas las ventanas que se podrían reclamar. + +```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 +``` + +Así que parece una variante de `claim` que reclama todas las ventanas. + +## Conclusión {#conclusion} + +A estas alturas debería saber cómo entender los contratos cuyo código fuente no esté disponible, utilizando los códigos de operación (u opcodes) o, cuando funcione, el decompilador. Como es evidente en la longitud de este artículo, la ingeniería inversa de un contrato no es trivial, pero, en un sistema donde la seguridad es esencial, es una habilidad importante poder verificar que los contratos funcionen según lo previsto. diff --git a/public/content/translations/es/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/es/developers/tutorials/run-node-raspberry-pi/index.md index 667dd81163c..74fc1fe5e9a 100644 --- a/public/content/translations/es/developers/tutorials/run-node-raspberry-pi/index.md +++ b/public/content/translations/es/developers/tutorials/run-node-raspberry-pi/index.md @@ -1,267 +1,185 @@ --- title: Cómo convertir su Raspberry Pi 4 en un nodo simplemente con la tarjeta MicroSD -description: Actualice su Raspberry Pi 4, a través de un cable de ethernet, conecte el disco SSD y encienda el dispositivo para convertir la Raspberry Pi en un nodo Ethereum completo ejecutando la capa de ejecución, o la capa de consenso (cadena de baliza / validador) +description: Flashee su Raspberry Pi 4, conecte un cable Ethernet, conecte el disco SSD y encienda el dispositivo para convertir la Raspberry Pi 4 en un nodo Ethereum completo + validador author: "EthereumOnArm" tags: - - "clients" + - "clientes" - "capa de ejecución" - "capa de consenso" - "nodos" lang: es skill: intermediate -published: 2020-05-07 -source: r/ethereum -sourceUrl: https://www.reddit.com/r/ethereum/comments/gf3nhg/ethereum_on_arm_raspberry_pi_4_images_release/ +published: 2022-06-10 +source: Ethereum on ARM +sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ --- -**TL;DR**: Actualice su Raspberry Pi 4, a través de un cable de ethernet, conecte el disco SSD y encienda el dispositivo para convertir la Raspberry Pi en un nodo Ethereum completo ejecutando la capa de ejecución, o la capa de consenso (cadena de baliza / validador) +**Ethereum on Arm es una imagen personalizada de Linux que puede convertir una Raspberry Pi en un nodo de Ethereum.** -[Más información acerca de las actualizaciones de Ethereum](/roadmap/) +Para usar Ethereum on Arm para convertir una Raspberry Pi en un nodo de Ethereum, se recomienda el siguiente hardware: -Primero, veamos un poco de contexto. Como saben, nos hemos encontrado con algunos problemas de memoria [[1]](/developers/tutorials/run-node-raspberry-pi/#references) con la imagen de Raspberry Pi 4 ya que Raspbian OS todavía está en 32 bits [[2]](/developers/tutorials/run-node-raspberry-pi/#references) (al menos a nivel de usuario). Si bien preferimos seguir con el sistema operativo oficial, llegamos a la conclusión de que, para resolver estos problemas, debemos migrar a un sistema operativo nativo de 64 bits - -Además, los clientes de consenso no admiten binarios de 32 bits, por lo que el uso de Raspbian excluiría a Raspberry Pi 4 de ejecutar un nodo de capa de consenso (y la posibilidad de apuesta). - -De modo que, tras varias pruebas, ahora lanzamos 2 imágenes diferentes basadas en Ubuntu 20.04 de 64bits las ediciones de [[3]](/developers/tutorials/run-node-raspberry-pi/#references): capa de ejecución y de capa de consenso. - -Básicamente, ambas son la misma imagen e incluyen las mismas características que las imágenes basadas en Raspbian. Pero están configuradas para ejecutar el programa de capa de ejecución o programa de capa de consenso por defecto. - -**Las imágenes se encargan de todos los pasos necesarios**, desde la configuración del entorno y el formato del disco SSD hasta la instalación y ejecución del software Ethereum, así como del inicio de la sincronización de la cadena de bloques. - -## Características principales {#main-features} - -- Basado en Ubuntu 20.04 64bit -- Fragmentación y formato automático del disco USB -- Añade memoria de intercambio (módulo del núcleo ZRAM + un archivo de intercambio) basada en el trabajo Armbian [[7]](/developers/tutorials/run-node-raspberry-pi/#references) -- Cambia el nombre de host a uno parecido a «ethnode-e2a3e6fe» basado en hash MAC -- Ejecuta el software como un servicio de sistema y comienza a sincronizar la cadena de bloques -- Incluye un repositorio APT para instalar y actualizar el software Ethereum -- Incluye un panel de control basado en Grafana / Prometeo - -## Software incluido {#software-included} - -Ambas imágenes incluyen los mismos paquetes, la única diferencia entre ellas es que la versión de ejecución ejecuta Geth por defecto y la versión de consenso ejecuta la cadena de baliza Prysn por defecto. - -### Clientes de ejecución {#execution-clients} - -- Geth [[8]](/developers/tutorials/run-node-raspberry-pi/#references): 1.9.13 (binario oficial) -- Parity [[9]](/developers/tutorials/run-node-raspberry-pi/#references): 2.7.2 (binario oficial) -- Nethermind [[10]](/developers/tutorials/run-node-raspberry-pi/#references): 1.8.28 (compilación cruzada) -- Hyperledger Besu [[11]](/developers/tutorials/run-node-raspberry-pi/#references): 1.4.4 (compilado) - -### Clientes de consenso {#consensus-clients} - -- Prysm [[12]](/developers/tutorials/run-node-raspberry-pi/#references): 1.0.0-alpha6 (binario oficial) -- Lighthouse [[13]](/developers/tutorials/run-node-raspberry-pi/#references): 0.1.1 (compilado) - -### Entorno de desarrollo Ethereum {#ethereum-framework} - -- Swarm [[14]](/developers/tutorials/run-node-raspberry-pi/#references): 0.5.7 (oficial binario) -- Raiden Network [[15]](/developers/tutorials/run-node-raspberry-pi/#references): 0.200.0~rc1 (oficial binanrio) -- IPFS [[16]](/developers/tutorials/run-node-raspberry-pi/#references): 0.5.0 (oficial binario) -- Statusd [[17]](/developers/tutorials/run-node-raspberry-pi/#references): 0.52.3 (compilado) -- Vipnode [[18]](/developers/tutorials/run-node-raspberry-pi/#references): 2.3.3 (binario oficial) - -## Guía de instalación y uso {#installation-guide-and-usage} - -### Hardware y configuración recomendados {#recommended-hardware-and-setup} - -- Raspberry 4 (modelo B) - 4GB -- Tarjeta MicroSD (16 GB clase 10 mínimo) -- Disco SSD USB 3.0 (ver sección de almacenamiento) +- Raspberry 4 (modelo B 8 GB), Odroid M1 o Rock 5B (8 GB/16 GB de RAM) +- Tarjeta MicroSD (16 GB clase 10 como mínimo) +- Disco USB 3.0 mínimo SSD de 2 TB o un SSD con una carcasa USB a SATA - Alimentación eléctrica - Cable de Ethernet -- Redirección del puerto 30303 (capa de ejecución) y redirección de puerto 13000 (capa de consenso) [[4]](/developers/tutorials/run-node-raspberry-pi/#references) -- Una caja con disipador y ventilador (opcional pero encarecidamente recomendado) -- Teclado USB, pantalla y cable HDMI (microHDMI) (opcional) - -## Almacenamiento {#storage} - -Necesitará un disco SSD para ejecutar los clientes de Ethereum (sin una unidad SSD no hay ninguna posibilidad de sincronizar la cadena de bloques de Ethereum). Hay 2 opciones: +- Reenvío de puertos (consulte los clientes para obtener más información) +- Una carcasa con disipador de calor y ventilador +- Teclado USB, monitor y cable HDMI (micro-HDMI) (Opcional) -- Utilice un disco SSD portátil USB como el Samsung T5 Portable SSD. -- Use una caja de disco duro externo USB 3.0 con un disco SSD. En nuestro caso usamos un Inateck 2.5 Hard Drive Enclosure FE2011. Asegúrese de comprar una caja con un chip compatible con UAS, en particular, uno de estos: JMicron (JMS567 o JMS578) o ASMedia (ASM1153E). +## ¿Por qué ejecutar Ethereum on ARM? {#why-run-ethereum-on-arm} -En ambos casos, evite obtener discos SSD de baja calidad ya que es un componente clave del nodo y puede afectar drásticamente al rendimiento (y tiempos de sincronización). +Las placas ARM son computadoras pequeños y flexibles y muy asequibles. Son buenas opciones para ejecutar nodos de Ethereum porque son baratos, pueden configurarse para que todos sus recursos se centren solo en el nodo, lo que los hace eficientes, consumen bajas cantidades de energía y son físicamente pequeños para encajar discretamente en cualquier hogar. También es muy fácil hacer funcionar los nodos porque la MicroSD de la Raspberry Pi simplemente se puede flashear con una imagen preconstruida, sin necesidad de descargar o crear software. -Tenga en cuenta que necesita conectar el disco a un puerto USB 3.0 (azul) +## ¿Cómo funciona? {#how-does-it-work} -## Descarga e instalación de las imágenes {#image-download-and-installation} +La tarjeta de memoria de la Raspberry Pi se flashea con una imagen preconstruida. Esta imagen contiene todo lo necesario para ejecutar un nodo Ethereum. Con una tarjeta flasheada, todo lo que el usuario tiene que hacer es encender la Raspberry Pi. Todos los procesos necesarios para ejecutar el nodo se inician automáticamente. Esto funciona porque la tarjeta de memoria contiene un sistema operativo (SO) basado en Linux sobre el cual se ejecutan automáticamente procesos a nivel de sistema que convierten la unidad en un nodo Ethereum. -### 1. Descargue las imágenes de ejecución y capa de consenso {#1-download-execution-or-consensus-images} +Ethereum no se puede ejecutar usando el popular sistema operativo Linux Raspberry Pi "Raspbian" porque Raspbian todavía utiliza una arquitectura de 32 bits que lleva a los usuarios de Ethereum a tener problemas de memoria y los clientes de consenso no admiten binarios de 32 bits. Para resolver esto, el equipo de Ethereum on Arm migró a un sistema operativo nativo de 64 bits llamado "Armbian". - - Descargue la imagen de la capa de ejecución - +**Las imágenes se encargan de todos los pasos necesarios**, desde la configuración del entorno y el formato del disco SSD hasta la instalación y ejecución del software de Ethereum, así como del inicio de la sincronización de la cadena de bloques. -sha256 7fa9370d13857dd6abcc8fde637c7a9a7e3a66b307d5c28b0c0d29a09c73c55c +## Nota sobre los clientes de ejecución y de consenso {#note-on-execution-and-consensus-clients} - - Descargue la imagen de la capa de consenso - +La imagen de Ethereum on Arm incluye clientes de ejecución y consenso precreados como servicios. Un nodo Ethereum requiere que ambos clientes estén sincronizados y ejecutándose. Solo tiene que descargar y flashear la imagen y luego iniciar los servicios. La imagen está precargada con los siguientes clientes de ejecución: -sha256 74c0c15b708720e5ae5cac324f1afded6316537fb17166109326755232cd316e +- Geth +- Nethermind +- Besu -### 2. Actualice la imagen {#2-flash-the-image} +y los siguientes clientes de consenso: -Inserte la tarjeta microSD en su ordenador de sobremesa / portátil y descargue el archivo (por ejemplo, la capa de ejecución): - -```bash -wget https://ethraspbian.com/downloads/ubuntu-20.04-preinstalled-server-arm64+raspi-eth1.img.zip -``` +- Lighthouse +- Nimbus +- Prysm +- Teku -Nota: Si no se siente cómodo con la línea de comandos o si está ejecutando Windows, puede usar [Etcher](https://etcher.io) +Debe elegir uno de cada uno para ejecutar: todos los clientes de ejecución son compatibles con todos los clientes de consenso. Si no selecciona explícitamente un cliente, el nodo volverá a sus valores predeterminados, Geth y Lighthouse, y los ejecutará automáticamente al encender la placa. Debe abrir el puerto 30303 en su router para que Geth pueda encontrar y conectarse a los pares, o peers. -Abra un terminal y compruebe el nombre del dispositivo MicroSD en ejecución: +## Descargar la imagen {#downloading-the-image} -```bash -sudo fdisk -l -``` +La imagen de Raspberry Pi 4 Ethereum es una imagen "plug and play" que instala y configura automáticamente tanto los clientes de ejecución como los de consenso, configurándolos para que interactúen entre sí y se conecten a la red Ethereum. El usuario solo debe iniciar sus procesos con un simple comando. -Debería ver un dispositivo llamado mmcblk0 o sdd. Descomprima y actualice la imagen: +Descargar la imagen de Raspberry Pi de [Ethereum on Arm](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) y verificar el hash SHA256: -```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 +# Del directorio que contiene la imagen descargada +shasum -a 256 ethonarm_22.04.00.img.zip +# Hash debe salir: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f ``` -### 3. Inserte la MicroSD en la Raspberry Pi 4. Conecte un cable Ethernet y el disco SSD vía USB (asegúrese de que está usando un puerto azul). {#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. Encienda el dispositivo {#4-power-on-the-device} +Tenga en cuenta que las imágenes de las placas Rock 5B y Odroid M1 están disponibles en la [página de descargas](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html) de Ethereum on Arm. -El sistema operativo Ubuntu arrancará en menos de un minuto, pero **tendrá que esperar aproximadamente 10 minutos** para permitir que el script realice las tareas necesarias para convertir el dispositivo en un nodo de Ethereum y reiniciar el Raspberry. +## Flashear la MicroSD {#flashing-the-microsd} -Dependiendo de la imagen que use, se ejecutará: +La tarjeta MicroSD que se utilizará para la Raspberry Pi debe insertarse primero en una computadora de escritorio o portátil para flashearla. Luego, los siguientes comandos de terminal flasherán la imagen descargada en la tarjeta SD: -- Cliente de ejecución: Geth como cliente predeterminado de sincronización de la cadena de bloques -- Cliente de consenso: Prysm como cliente predeterminado de sincronización de la cadena de baliza (red de prueba Goerli) - -### 5. Inicio de sesión {#5-log-in} - -Puede iniciar sesión a través de SSH o usando la consola (si tiene una pantalla y un teclado conectados) +```shell +# check the MicroSD card name +sudo fdisk -l -```bash -User: ethereum -Password: ethereum +>> sdxxx ``` -La primera vez que inicie sesión, se le pedirá que cambie la contraseña, por lo tanto, tendrá que iniciar sesión dos veces. - -### 6. Abra el puerto 30303 para Geth y 13000 si está ejecutando la cadena de baliza de Prysm. Si no sabe cómo hacerlo, teclee en Google «reenvío de puertos» seguido de su modelo de router. {#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. Obtenga la salida de la consola {#7-get-console-output} - -Puede ver lo que está pasando en segundo plano escribiendo: +Es muy importante que el nombre sea correcto porque el siguiente comando incluye `dd`, que borra completamente el contenido existente de la tarjeta antes de grabar la imagen en ella. Para continuar, vaya al directorio que contiene la imagen comprimida: -```bash -sudo tail -f /var/log/syslog +```shell +# unzip and flash image +unzip ethonarm_22.04.00.img.zip +sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress ``` -**Enhorabuena. Ahora está ejecutando un nodo completo en su Raspberry Pi 4.** +La tarjeta ahora está flasheada, por lo que se puede insertar en la Raspberry Pi. -## Sincronización de la cadena de bloques {#syncing-the-blockchain} +## Iniciar el nodo {#start-the-node} -Seguidamente tendrá que esperar a que la cadena de bloques se sincronice por completo. En el caso de la capa de ejecución, llevará varios días en función de factores concretos, pero puede esperar aproximadamente 5-7 días. +Con la tarjeta SD insertada en la Raspberry Pi, conecte el cable Ethernet y el SSD, y luego encienda las unidades. El sistema operativo arrancará y comenzará a realizar automáticamente las tareas preconfiguradas que convierten a la Raspberry Pi en un nodo Ethereum, incluida la instalación y creación del software del cliente. Esto probablemente tardará de 10 a 15 minutos. -Si está ejecutando la capa de consenso en la red de prueba Goerli la sincronización con la cadena de la baliza puede llevar entre 1 y 2 días. Recuerde que necesitará configurar el validador más adelante para poder iniciar el proceso de apuesta. [Cómo ejecutar el validador de la capa de consenso](/developers/tutorials/run-node-raspberry-pi/#validator) +Una vez que todo esté instalado y configurado, inicie sesión en el dispositivo a través de una conexión ssh o utilizando el terminal directamente si hay un monitor y un teclado conectados a la placa. Utilice la cuenta `ethereum` para iniciar sesión, ya que tiene los permisos necesarios para iniciar el nodo. -## Paneles de control {#monitoring-dashboards} - -En esta primera versión, hemos incluido 3 paneles de control basados en Prometheus [[5]](/developers/tutorials/run-node-raspberry-pi/#references) / Grafana [[6]](/developers/tutorials/run-node-raspberry-pi/#references) para controlar el nodo y los datos de los clientes (Geth y Besu). Puede acceder a través de su navegador web: - -```bash -URL: http://your_raspberrypi_IP:3000 -User: admin +```shell +User: ethereum Password: ethereum ``` -## Cambiar de cliente {#switching-clients} - -Todos los clientes se ejecutan como un servicio de sistema. Esto es importante, porque si surge un problema, el sistema iniciará el proceso automáticamente. - -Las cadenas de baliza Geth y Prysm se ejecutan por defecto (en función de lo que esté sincronizando, de la capa de ejecución o de consenso) por lo tanto, si quiere pasar a otros clientes (de Geth a Nethermind, por ejemplo), tendrá que parar y desactivar primero Geth y activar e iniciar el otro cliente: +El cliente de ejecución predeterminado, Geth, se iniciará automáticamente. Puede confirmar esto comprobando los registros utilizando el siguiente comando de terminal: -```bash -sudo systemctl stop geth && sudo systemctl disable geth +```sh +sudo journalctl -u geth -f ``` -Comandos para activar e iniciar cada cliente de ejecución: +El cliente de consenso debe iniciarse explícitamente. Para hacer esto, primero abra el puerto 9000 en su enrutador para que Lighthouse pueda encontrar y conectarse a otros pares. A continuación, habilite e inicie el servicio Lighthouse: -```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 +```sh +sudo systemctl enable lighthouse-beacon +sudo systemctl start lighthouse-beacon ``` -Clientes de consenso: +Compruebe el cliente utilizando los registros: -```bash -sudo systemctl stop prysm-beacon && sudo systemctl disable prysm-beacon -sudo systemctl start lighthouse && sudo systemctl enable lighthouse +```sh +sudo journalctl -u lighthouse-beacon ``` -## Cambiar parámetros {#changing-parameters} +Tenga en cuenta que el cliente de consenso se sincronizará en unos minutos porque utiliza la sincronización de puntos de control. El cliente de ejecución tardará más, posiblemente varias horas, y no se iniciará hasta que el cliente de consenso haya terminado la sincronización (esto se debe a que el cliente de ejecución necesita un objetivo con el que sincronizarse, que proporciona el cliente de consenso sincronizado). -Los archivos de configuración de los clientes están ubicados en el directorio /etc/ethereum/. Puede editar estos archivos y reiniciar el servicio systemd para guardar cambios. La única excepción es Nethermind que, además, tiene un archivo de configuración de Mainnet ubicado aquí: +Con los servicios de Geth y Lighthouse funcionando y sincronizados, ¡su Raspberry Pi es ahora un nodo de Ethereum! Es más común interactuar con la red Ethereum utilizando la consola Javascript de Geth, que se puede conectar al cliente de Geth en el puerto 8545. También es posible enviar comandos con formato de objetos JSON utilizando una herramienta de solicitud como Curl. Vea más detalles en la [documentación de Geth](https://geth.ethereum.org/). -```bash -/etc/nethermind/configs/mainnet.cfg -``` +Geth está preconfigurado para informar métricas a un panel de control de Grafana que se puede ver en el navegador. Los usuarios más avanzados podrían querer usar esta función para controlar el estado de su nodo navegando a `ipaddress:3000`, pasando `user: admin` y `passwd: ethereum`. + +## Validadores {#validators} -Los datos de los clientes de la cadena de bloques se almacenan en la cuenta principal de Ethereum de la siguiente manera (no se olvide de incluir el punto antes del nombre del directorio): +También se puede añadir opcionalmente un validador al cliente de consenso. El software validador permite que su nodo participe activamente en el consenso y proporciona a la red seguridad criptoeconómica. Obtendrá una recompensa por este trabajo en ETH. Para ejecutar un validador, primero debe tener 32 ETH, que deben depositarse en el contrato de depósito. **Este es un compromiso a largo plazo; todavía no es posible retirar este ETH**. El depósito se puede hacer siguiendo la guía paso a paso en el [Launchpad](https://launchpad.ethereum.org/). Haga esto en una computadora de escritorio/portátil, pero no genere claves; esto se puede hacer directamente en la Raspberry Pi. -### Capa de ejecución {#execution-layer} +Abra un terminal en la Raspberry Pi y ejecute el siguiente comando para generar las claves de depósito: -```bash -/home/ethereum/.geth -/home/ethereum/.parity -/home/ethereum/.besu -/home/ethereum/.nethermind +``` +sudo apt-get update +sudo apt-get install staking-deposit-cli +cd && deposit new-mnemonic --num_validators 1 ``` -### Capa de consenso {#consensus-layer} +¡Guarde la frase mnemotécnica de manera segura! El comando anterior generó dos archivos en el almacén de claves del nodo: las claves del validador y un archivo de datos de depósito. Los datos de depósito deben subirse a la plataforma de lanzamiento, o lanzador, por lo que deben copiarse desde la Raspberry Pi al escritorio/portátil. Esto se puede hacer utilizando una conexión ssh o cualquier otro método de copiar/pegar. -```bash -/home/ethereum/.eth2 -/home/ethereum/.eth2validators -/home/ethereum/.lighthouse -``` +Una vez que el archivo de datos de depósito esté disponible en el ordenador que ejecuta la plataforma de lanzamiento, se puede arrastrar y soltar en el `+` en la pantalla de la plataforma de lanzamiento. Siga las instrucciones de la pantalla para enviar una transacción al contrato de depósito. -## Nethermind y Hyperledger Besu {#nethermind-and-hyperledger-besu} +De vuelta en la Raspberry Pi, se puede iniciar un validador. Esto requiere importar las claves del validador, establecer la dirección para recopilar recompensas y luego iniciar el proceso del validador preconfigurado. El siguiente ejemplo es para Lighthouse: las instrucciones para otros clientes de consenso están disponibles en los documentos de [Ethereum on Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/): -Estos 2 excelentes clientes de ejecución han terminando por ser buenas alternativas a Geth y Parity. Cuanta más diversidad haya en la red, mejor, probándolos contribuye a mejorar la salud de la red. +```shell +# import the validator keys +lighthouse account validator import --directory=/home/ethereum/validator_keys -Ambos necesitan más pruebas, así que experimente a sus anchas con ellos e informe de su opinión. +# set the reward address +sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf -## Cómo ejecutar el validador de consenso (apuestas) {#validator} +# start the validator +sudo systemctl start lighthouse-validator +``` -Una vez que la cadena de baliza de la red de pruebas Goerli está sincronizada, puede ejecutar un validador en el mismo dispositivo. Necesitará seguir [estos pasos de participación](https://prylabs.net/participate). +¡Muy bien, ahora tiene un nodo y un validador de Ethereum completos ejecutándose en una Raspberry Pi! -La primera vez, necesita crear manualmente una cuenta ejecutando el binario «validador» y configurando una contraseña. Una vez que haya completado este paso, puede agregar la contraseña a `/etc/ethereum/prysm-validator.conf` e iniciar el validador como un servicio systemd. +## Más detalles {#more-details} -## Apreciamos sus comentarios {#feedback-appreciated} +Esta página le brindó una descripción general de cómo configurar un nodo y un validador de Geth-Lighthouse usando Raspberry Pi. Hay instrucciones más detalladas disponibles en el sitio web [Ethereum-on-Arm](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html). -Hemos puesto mucho trabajo en la configuración del Raspberry Pi 4 como un nodo completo de Ethereum ya que sabemos que la base de usuario masiva de este dispositivo puede tener un impacto muy positivo en la red. +## Agradecemos sus comentarios {#feedback-appreciated} -Por favor, tenga en cuenta que esta es la primera imagen basada en Ubuntu 20.04 por lo que puede que haya algunos errores. Si es así, abra un problema en [GitHub](https://github.com/diglos/ethereumonarm) o contáctenos en [Twitter](https://twitter.com/EthereumOnARM). +Sabemos que la Raspberry Pi tiene una enorme base de usuarios que podría tener un impacto muy positivo en la salud de la red Ethereum. Profundice en este tutorial, intente ejecutar en redes de prueba, eche un vistazo a Ethereum on Arm GitHub, dé su opinión, plantee problemas y solicitudes de pull, y ayude a avanzar en la tecnología y la documentación. ## Referencias {#references} -1. [geth se bloquea repetidamente con SIGSEGV](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 \* **Tenga en cuenta que OpenEthereum [ha quedado obsoleto](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) y no tiene mantenimiento.** Úselo con precaución y, preferiblemente, cambie a otra implementación de cliente. -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/es/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/es/developers/tutorials/secure-development-workflow/index.md new file mode 100644 index 00000000000..5a499d4c4b3 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/secure-development-workflow/index.md @@ -0,0 +1,56 @@ +--- +title: Lista de verificación de seguridad de los contratos inteligentes +description: Un flujo de trabajo recomendado para escribir contratos inteligentes seguros +author: "Trailofbits" +tags: + - "contratos inteligentes" + - "seguridades" + - "solidity" +skill: intermediate +lang: es +published: 2020-09-07 +source: Desarrollando smart contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md +--- + +## Lista de verificación de desarrollo de contratos inteligente {#smart-contract-development-checklist} + +Le indicamos un proceso altamente eficiente que le recomendamos seguir cuando escriba sus contratos inteligentes. + +Compruebe cualquier problema de seguridad conocido: + +- Revisa tus contratos con [Slither](https://github.com/crytic/slither). Tiene más de 40 detectores integrados para vulnerabilidades comunes. Ejecútelo en cada comprobación con un nuevo código y asegúrese de obtener un informe limpio (o utilice el modo de cribado para silenciar ciertos problemas). +- Revise sus contratos con [Crytic](https://crytic.io/). Comprueba 50 problemas que Slither no revisa. Crytic puede ayudar a que su equipo se mantenga a la cabecera, al descubrir fácilmente problemas de seguridad en Pull Requests en GitHub. + +Tenga en cuenta las características especiales de su contrato: + +- ¿Sus contratos pueden mejorarse? Revise su código de mejora para errores con [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) o [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/). Hemos documentado 17 formas en que las actualizaciones pueden fallar. +- ¿Sus contratos pretenden ajustarse a los ERC? Compruébalos con [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance). Esta herramienta identifica instantáneamente las desviaciones de seis especificaciones comunes. +- ¿Tienes pruebas unitarias en Truffle? Compleméntelos con [`slither-prop`](https://github.com/crytic/slither/wiki/Property-generation). Genera automáticamente un robusto conjunto de propiedades de seguridad para las funciones de ERC20 basadas en su código específico. +- ¿Se integra con tókenes de terceros? Revise nuestra [lista de verificación de integración de tókenes](/developers/tutorials/token-integration-checklist/) antes de depender de contratos externos. + +Inspeccione visualmente las características de seguridad críticas de su código: + +- Revise la impresión en consola [heredance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) de Slither. Evite problemas de operaciones en paralelo involuntarias y de linearización C3. +- Revise la impresion en consola [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) de Slither. Informa de la visibilidad de las funciones y los controles de acceso. +- Revise la impresion en consola [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) de Slither. Informa de los controles de acceso sobre las variables de estado. + +Documente propiedades de seguridad críticas y utilice generadores de pruebas automatizados para evaluarlas: + +- Aprende a [documentar propiedades de seguridad para su código](/developers/tutorials/guide-to-smart-contract-security-tools/). Es difícil al principio, pero es la actividad más importante para lograr un buen resultado. También es un requisito previo para utilizar cualquiera de las técnicas avanzadas en este tutorial. +- Defina propiedades de seguridad en Solidity, para su uso con [Echidna](https://github.com/crytic/echidna) y [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). Concéntrese en su máquina de estado, controles de acceso, operaciones aritméticas, interacciones externas y conformidad con los estándares. +- Defina las propiedades de seguridad con [la API Python de Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/). Concéntrese en la herencia, dependencias variables, controles de acceso y otras cuestiones estructurales. +- Ejecute sus pruebas de propiedad en cada comando commit con [Crytic](https://crytic.io). Crytic puede consumir y evaluar pruebas de propiedad de seguridad para que todos los miembros de su equipo puedan ver fácilmente que pasan por GitHub. Las pruebas fallidas pueden bloquear los commits. + +Por último, tenga en cuenta los problemas que las herramientas automatizadas no pueden encontrar fácilmente: + +- Falta de privacidad: todos los demás pueden ver sus transacciones mientras están en cola de espera. +- Transacciones en ejecución frontal +- Operaciones criptográficas +- Interacciones arriesgadas con componentes DeFi externos + +## Pedir ayuda {#ask-for-help} + +[El horario de oficina de Ethereum](https://calendly.com/dan-trailofbits/ethereum-office-hours) funciona cada martes por la tarde. Estas sesiones individuales de una hora de duración son una oportunidad para hacernos cualquier pregunta que tenga sobre la seguridad, solucionar problemas usando nuestras herramientas y obtener comentarios de expertos sobre su enfoque actual. Le ayudaremos a trabajar con esta guía. + +Únase a nuestro Slack: [Pirateando el imperio](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw). Siempre estamos disponibles en los canales #crytic y #ethereum si tiene alguna duda. diff --git a/public/content/translations/es/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/es/developers/tutorials/send-token-etherjs/index.md new file mode 100644 index 00000000000..cd4dd34a040 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/send-token-etherjs/index.md @@ -0,0 +1,212 @@ +--- +title: Enviar tokens usando ethers.js +description: Guía para principiantes sobre el envío de tokens usando ethers.js. +author: Kim YongJun +tags: + - "ETHERS.JS" + - "ERC-20" + - "TOKENS" +skill: beginner +lang: es +published: 2021-04-06 +--- + +## Enviar token usando ethers.js(5.0) {#send-token} + +### En este tutorial aprenderá: {#you-learn-about} + +- Cómo importar ethers.js +- Cómo transferir tokens +- Cómo establecer el precio del gas según la situación de tráfico de la red + +### Para comenzar {#to-get-started} + +Para comenzar, primero debemos importar la biblioteca de ethers.js en nuestro javascript Incluya ethers.js(5.0) + +### Instalación {#install-ethersjs} + +```shell +/home/ricmoo> npm install --save ethers +``` + +ES6 en el navegador + +```html + +``` + +ES3(UMD) en el navegador + +```html + +``` + +### Parámetros {#param} + +1. **`contract_address`**: la dirección del contrato del token (se necesita la dirección cuando el token que quiere transferir no es ether) +2. **`send_token_amount`**: la cantidad que quiere enviar al receptor +3. **`to_address`**: la dirección del receptor +4. **`send_account`**: la dirección del que envía +5. **`private_key`**: la clave privada del remitente para firmar la transacción y tranferir los tokens + +## Aviso {#notice} + +`signTransaction(tx)` se eliminó porque `sendTransaction()` lo hace internamente. + +## Procedimientos de envío {#procedure} + +### 1. Conectarse a la red de prueba (testnet) {#connect-to-network} + +#### Establecer el proveedor (Infura) {#set-provider} + +Conectarse a la red de prueba Ropsten + +```javascript +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") +``` + +### 2. Crear una billetera {#create-wallet} + +```javascript +let wallet = new ethers.Wallet(private_key) +``` + +### 3. Conectar la billetera a la red {#connect-wallet-to-net} + +```javascript +let walletSigner = wallet.connect(window.ethersProvider) +``` + +### 4. Obtener el precio actual de gas {#get-gas} + +```javascript +window.ethersProvider.getGasPrice() // gasPrice +``` + +### 5. Definir la transacción {#define-transaction} + +Estas variables definidas a continuación dependen del `send_token()` + +### Parámetros de transacción {#transaction-params} + +1. **`send_account`**: dirección del emisor de tokens +2. **`to_address`**: dirección del receptor de tokens +3. **`send_token_amount`**: la cantidad de tokens a enviar +4. **`gas_limit`**: límite de gas +5. **`gas_price`**: precio del gas + +[Vea a continuación cómo usar](#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. Transferir {#transfer} + +```javascript +walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("Send finished!") +}) +``` + +## Cómo utilizarlo {#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 +) +``` + +### ¡Éxito! {#success} + +![imagen de transacción realizada con éxito](./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) { + // general token send + let contract = new ethers.Contract( + contract_address, + send_abi, + walletSigner + ) + + // How many tokens? + let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) + console.log(`numberOfTokens: ${numberOfTokens}`) + + // Send tokens + contract.transfer(to_address, numberOfTokens).then((transferResult) => { + console.dir(transferResult) + alert("sent token") + }) + } // ether send + 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("Send finished!") + }) + } catch (error) { + alert("failed to send!!") + } + } + }) +} +``` diff --git a/public/content/translations/es/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/es/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md new file mode 100644 index 00000000000..be56d31b4e8 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -0,0 +1,206 @@ +--- +title: Enviar transacciones usando la Web3 +description: "Esta es un guia apta para principiantes sobre cómo enviar transacciones de Ethereum usando la Web3. Hay tres pasos esenciales para enviar una transacción a la cadena de bloques de Ethereum, que son: crear, firmar y emitir. Analizaremos los tres." +author: "Elan Halpern" +tags: + - "transacciones" + - "web3.js" + - "alchemy" +skill: beginner +lang: es +published: 2020-11-04 +source: Documentos de Alchemy +sourceUrl: https://docs.alchemy.com/alchemy/tutorials/sending-txs +--- + +Esta es un guia apta para principiantes sobre cómo enviar transacciones de Ethereum usando la Web3. Existen tres pasos esenciales para enviar una transacción a la blockchain de Ethereum: crear, firmar y emitir. Explicaremos los tres pasos y esperamos responder a cualquier duda que puedas tener. En este tutorial, usaremos [Alchemy](https://www.alchemy.com/) para enviar nuestras transacciones a la red de Ethereum. Puede [crear una cuenta de Alchemy aquí](https://auth.alchemyapi.io/signup). + +**NOTA:** Esta guía es para firmar sus transacciones en el _backend_ para su aplicación. Si quiere integrar la firma de sus transacciones en el frontend, consulte[Integrar Web3 con un proveedor de navegador](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider). + +## Los fundamentos {#the-basics} + +Como la mayoría de desarrolladores de cadena de bloques cuando comienzan, es posible que haya indagado sobre cómo enviar una transacción (algo que debería ser muy sencillo) y que se haya topado con una gran cantidad de guías, cada una de ellas diciendo cosas diferentes, que le dejan a uno un poco aturdido y confundido. Por lo tanto, si se encuentra en esa situación, no desespere. ¡Todos lo hemos pasado por ello en algún momento! Así que, antes de comenzar, aclaremos algunos puntos: + +### 1\. Alchemy no almacena sus claves privadas {#alchemy-does-not-store-your-private-keys} + +- Esto significa que Alchemy no puede firmar ni enviar transacciones en su nombre. Es así por motivos de seguridad. Alchemy nunca le pedirá que comparta su clave privada, ni tampoco debería compartir nunca su clave privada con un nodo alojado (ni con nadie). +- Puede leer desde la cadena de bloques usando la API del nucleo de Alchemy, pero para escribirlo, necesitará usar algo más para firmar sus transacciones antes de enviarlas mediante Alchemy (esto es lo mismo para cualquier otro [servicio de nodo](/developers/docs/nodes-and-clients/nodes-as-a-service/)). + +### 2\. ¿Qué es un «signatario»? {#what-is-a-signer} + +- Los firmantes firmarán las transacciones por usted con su clave privada. En este tutorial, nosotros usaremos [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) para firmar nuestra transacción, aunque también puede usar cualquier otra biblioteca Web 3. +- En el frontend, un buen ejemplo de firmante sería [MetaMask](https://metamask.io/), que firmará y enviará las transacciones en su nombre. + +### 3\. ¿Por qué tengo que firmar mis transacciones? {#why-do-i-need-to-sign-my-transactions} + +- Todo usuario que quiera enviar una transacción en la red Ethereum debe firmarla (utilizando su clave privada), para validar que la transacción proviene de quien afirma proceder. +- Es sumamente importante proteger esta clave privada, ya que tener acceso a ella otorga el control absoluto de su cuenta de Ethereum y le permite a usted (o a cualquier persona con acceso) realizar transacciones en su nombre. + +### 4\. ¿Cómo puedo proteger mi clave privada? {#how-do-i-protect-my-private-key} + +- Hay muchas formas de proteger tu clave privada y de utilizarla para enviar transacciones. En este tutorial utilizaremos un archivo `.env`. Sin embargo, también puede utilizar un proveedor independiente que almacene claves privadas, utilizar un banco de claves u otras opciones. + +### 5\. ¿Cuál es la diferencia entre `eth_sendTransaction` y `eth_sendRawTransaction`? {#difference-between-send-and-send-raw} + +`eth_sendTransaction` y `eth_sendRawTransaction` son funciones de la API de Ethereum que emiten una transacción en la red de Ethereum para que se añada a un nuevo bloque. Se diferencian en cómo gestionan la firma de las transacciones. + +- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) se utiliza para enviar transacciones _sin firmar_, lo que significa que el nodo al que se envía debe gestionar su clave privada para que pueda firmar la transacción antes de difundirla en la cadena. Dado que Alchemy no almacena las claves privadas de los usuarios, no utilizamos este método. +- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) se utiliza para emitir las transacciones que ya han sido firmadas. Esto significa que primero debes usar [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction), y luego enviar el resultado a `eth_sendRawTransaction`. + +Cuando se utiliza web3, se puede acceder a `eth_sendRawTransaction` a través de la función [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction). + +Esto es lo que vamos a usar en este tutorial. + +### 6\. ¿Qué es la biblioteca Web3? {#what-is-the-web3-library} + +- Web3.js es una biblioteca de «wrappers» o programas que rodean las funciones estándar JSON-RPC que son muy comunes en el desarrollo de Ethereum. +- Hay muchas blibiotecas en Web3 para diferentes lenguajes. En este tutorial usaremos [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) que está desarrollado en JavaScript. Puede consultar [aquí](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) otras opciones, como [ethers.js](https://docs.ethers.org/v5/). + +Bien, ahora que ya hemos resuelto algunas de estas dudas, comencemos con el tutorial. ¡No dude preguntar sus dudas en cualquier momento a través del canal [discord](https://discord.gg/gWuC7zB) de Alchemy! + +### 7\. ¿Cómo enviar transacciones seguras, privadas y con gas optimizado? {how-to-send-secure-gas-optimized-and-private-transactions} + +- [Alchemy tiene un conjunto de API para transacciones](https://docs.alchemy.com/reference/transact-api-quickstart). Puede usarlas para enviar transacciones reforzadas, simular transacciones antes de que ocurran, enviar transacciones privadas y transacciones con gas optimizado. +- También puede utilizar la [API de Notify](https://docs.alchemy.com/docs/alchemy-notify) para recibir alertas cuando su transacción se toma desde la zona de espera y se añade a la cadena. + +**NOTA:** Para consultar esta guía, debe tener una cuenta de Alchemy, una dirección de Ethereum o una cartera MetaMask, NodeJs, y npm instaladas. De lo contrario, siga estos pasos: + +1. [Cree una cuenta gratuita de Alchemy](https://auth.alchemyapi.io/signup) +2. [Crea una cuenta de Metamask](https://metamask.io/) (u obtenga una dirección de Ethereum) +3. [Siga estos pasos para instalar NodeJs y NPM](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs) + +## Pasos para enviar su transacción {#steps-to-sending-your-transaction} + +### 1\. Crea una aplicación de Alchemy en la red de pruebas de Sepolia {#create-an-alchemy-app-on-the-sepolia-testnet} + +Vaya a su [panel de control de Alchemy](https://dashboard.alchemyapi.io/) y cree una nueva aplicación, seleccionando Sepolia (u otra red de pruebas) para su red. + +### 2\. Solicitar ETH desde un grifo Sepolia {#request-eth-from-sepolia-faucet} + +Sigue las instrucciones en el [faucet (o grifo) Sepolia de Alchemy](https://www.sepoliafaucet.com/) para recibir ETH. Asegúrese de incluir su dirección Ethereum de **Sepolia** (desde MetaMask) y no otra red. Después de seguir las indicaciones, compruebe dos veces que ha recibido los ETH en su cartera. + +### 3\. Crea un nuevo directorio de proyecto y `cd` en él {#create-a-new-project-direction} + +Cree un nuevo directorio de proyecto desde la ventana de comandos (terminal para macs) y navega hasta ella: + +``` +mkdir sendtx-example +cd sendtx-example +``` + +### 4\. Instale Alchemy Web3 (o cualquier biblioteca en Web3) {#install-alchemy-web3} + +Ejecute el siguiente comando en el directorio del proyecto que instalará [Alchemy Web3](https://docs.alchemy.com/reference/api-overview): + +Observe que si quiere utilizar la biblioteca de ethers.js, [debe seguir estas instrucciones](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum). + +``` +npm install @alch/alchemy-web3 +``` + +### 5\. Instala dotenv {#install-dotenv} + +Utilizaremos un archivo `.env` para almacenar de manera segura nuestra clave API y clave privada. + +``` +npm install dotenv --save +``` + +### 6\. Cree el archivo `.env` {#create-the-dotenv-file} + +Cree un archivo `.env` en el directorio de su proyecto y añada lo siguiente (sustituyendo "`your-api-url`" y "`your-private-key`") + +- Para encontrar la URL de la API de Alchemy, vaya a la página de información de la aplicación que acaba de crear en su panel de control, haga clic en «Ver clave» en la esquina superior derecha y obtenga la URL HTTP. +- Para encontrar su clave privada utilizando Metamask, consulte esta [guía](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key). + +``` +API_URL = "your-api-url" +PRIVATE_KEY = "your-private-key" +``` + + +¡No exponga su .env! Asegúrese de que nunca comparte ni expone su archivo .env con nadie, si ello conlleva revelar sus secretos. Si está haciendo un control de la versión, añada .env a un archivo gitignore. + + +### 7\. Cree el archivo `sendTx.js` {#create-sendtx-js} + +Vale, ahora que su información confidencial ya está protegida en un archivo `.env`, iniciemos la programación. Para nuestro ejemplo de envío de transacción, enviaremos ETH de vuelta al grifo Sepolia. + +Cree un archivo `sendTx.js`, que es donde configuraremos y enviaremos nuestra transacción de muestra, y añádale las siguientes líneas de código: + +``` +async function main() { + require('dotenv').config(); + const { API_URL, PRIVATE_KEY } = process.env; + const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); + const web3 = createAlchemyWeb3(API_URL); + const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: replace this address with your own public address + + const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // nonce starts counting from 0 + + const transaction = { + 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // faucet address to return eth + 'value': 1000000000000000000, // 1 ETH + 'gas': 30000, + 'nonce': nonce, + // optional data field to send message or execute smart contract + }; + + const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY); + + web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) { + if (!error) { + console.log("🎉 The hash of your transaction is: ", hash, "\n Check Alchemy's Mempool to view the status of your transaction!"); + } else { + console.log("❗Something went wrong while submitting your transaction:", error) + } + }); +} + +main(); +``` + +Asegúrese de reemplazar la dirección en la **línea 6** por su propia dirección pública. + +Ahora, antes de pasar a la ejecución de este código, hablaremos sobre algunos de los componentes. + +- `nonce`: la especificación del nonce se utiliza para hacer un seguimiento del número de transacciones enviadas desde su dirección. La necesitamos por motivos de seguridad y para evitar [ataques repetitivos](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce). Para conocer el número de transacciones enviadas desde su dirección, utilizamos [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount). +- `transaction`: la transacción tiene algunos aspectos que debemos especificar. + - `to`: Es la dirección a la que queremos enviar ETH. En este caso, estamos enviando ETH de regreso al [grifo Sepolia](https://sepoliafaucet.com/) al que inicialmente le solicitamos. + - `value`: Esta es la cantidad que deseamos enviar, especificada en Wei, donde 10^18 Wei = 1 ETH + - `gas`: hay numerosas formas de determinar la cantidad correcta de gas que se debe incluir en la transacción. Incluso, Alchemy tiene un [webhook del precio de del gas](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) que informa cuando el precio del gas se encuentra dentro de un límite determinado. Una buena práctica para transacciones en la red principal consiste en consultar una calculadora de gas como [ETH Gas Station](https://ethgasstation.info/) para determinar la cantidad correcta de gas por añadir. La cantidad mínima de gas que utiliza una operación en Ethereum es de 21.000; por tanto, y para asegurarnos de que nuestra transacción se ejecute, añadiremos 30.000. + - `nonce`: consulte la definición anteriormente mencionada. Nonce empieza a contar desde cero. + - [OPTIONAL] datos: utilizado para enviar información adicional con su transferencia, o para activar un contrato inteligente ―no requerido para transferencias de saldo― consulte la nota de abajo. +- `signedTx`: para firmar nuestro objeto de transacción utilizaremos el método `signTransaction` con nuestra `PRIVATE_KEY` +- `sendSignedTransaction`: una vez que tenemos una transacción firmada, podemos enviarla para que se incluya en un bloque posterior utilizando `sendSignedTransaction` + +**Una nota sobre los datos** Hay dos tipos principales de transacciones que se pueden enviar en Ethereum. + +- Transferencia de saldo: enviar ETC de una dirección a otra. No se requiere ningún campo de datos, sin embargo, si desea enviar información adicional junto a su transacción, puede incluir esa información en formato HEX en este campo. + - Por ejemplo, digamos que queremos escribir el hash de un documento IPFS a la cadena de Ethereum para darle una fecha y hora inmutable. Nuestro campo de datos debe mostrarse como datos: `web3.utils.toHex(‘IPFS hash‘)`. Ahora cualquiera puede consultar la cadena y ver cuándo se añadió el documento. +- Transacción de contrato inteligente: ejecute algún código de contrato inteligente en la cadena. En este caso, el campo de datos debería tener la función inteligente que desee ejecutar, junto a cualquier parámetro. + - Para un ejemplo práctico, consulte el paso 8 en este [Tutorial abierto a todos los públicos](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction). + +### 8\. Ejecuta el código usando `node sendTx.js` {#run-the-code-using-node-sendtx-js} + +Navegue hasta la terminal o línea de comandos y ejecute: + +``` +node sendTx.js +``` + +### 9\. Consulta tu transacción en el Mempool {#see-your-transaction-in-the-mempool} + +Abra la página de la [Zona de espera](https://dashboard.alchemyapi.io/mempool) en su panel de control de Alchemy y filtre la aplicación que creó para encontrar su transacción. Aquí es donde podemos ver la transición de nuestra transacción desde un estado pendiente a un estado acuñado (si tiene éxito) o a un estado descartado si no tiene éxito. Asegúrese de conservarlo en «Todos» para reflejar las transacciones «acuñadas», «pendientes» y «descartadas». También puede buscar su transacción por transacciones enviadas a la dirección `0x31b98d14007bdee637298086988a0bbd31184523` . + +Para ver los detalles de su transacción una vez que la haya encontrado, seleccione el hash de tx, que debería llevarle a una pantalla parecida a esta: + +![Captura de pantalla de la Zona de espera](./mempool.png) + +Aquí puede ver su transacción en Etherscan pulsando el icono dentro de un círculo rojo. + +**¡Enhorabuena! Acabas de realizar tu primera transacción en Ethereum con Alchemy 🎉** + +_Si desea ver comentarios y sugerencias sobre esta guía, envíe un mensaje a Elan en el canal [Discord](https://discord.gg/A39JVCM) de Alchemy._ + +_Publicado originalmente en [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/es/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/es/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md new file mode 100644 index 00000000000..bdeebf488ae --- /dev/null +++ b/public/content/translations/es/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md @@ -0,0 +1,94 @@ +--- +title: Configura web3.js para utilizar el blockchain de Ethereum en JavaScript +description: Cómo usar un contrato inteligente para interactuar con un token a través del lenguaje Solidity. +author: "jdourlens" +tags: + - "web3.js" + - "javascript" +skill: beginner +lang: es +published: 2020-04-11 +source: EthereumDev +sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +En este tutorial, veremos cómo comenzar con [web3.js](https://web3js.readthedocs.io/) para interactuar con el blockchain de Ethereum. Web3.js se puede utilizar tanto en frontends como en backends para leer datos del blockchain, realizar transacciones e incluso implementar smart contracts. + +El primer paso es incluir web3.js en tu proyecto. Para usarlo en una página web, puedes importar la biblioteca directamente usando un CDN como JSDelivr. + +```html + +``` + +Si prefieres instalar la biblioteca para usarla en un proyecto de backend o frontend que usa compilación, puedes instalarla usando npm: + +```bash +npm install web3 --save +``` + +Luego, para importar Web3.js a una secuencia de comandos de Node.js o a un proyecto de frontend de Browserify, puedes utilizar la siguiente línea de JavaScript: + +```js +const Web3 = require("web3") +``` + +Ahora que incluimos la librería en el proyecto, necesitamos inicializarla. Tu proyecto necesita ser capaz de comunicarse con cadena de bloques. La mayoría de las bibliotecas de Ethereum se comunican con un [nodo](/developers/docs/nodes-and-clients/) a través de llamadas RPC. Para iniciar nuestro proveedor de web3, crearemos una instancia de Web3 pasando como constructor el URL del proveedor. Si tienes un nodo o una [instancia de ganache ejecutándose en tu computadora](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/), se verá así: + +```js +const web3 = new Web3("http://localhost:8545") +``` + +Si te gustaría acceder directamente a un nodo rentado, puedes encontrar opciones en [ nodos como servicio.](/developers/docs/nodes-and-clients/nodes-as-a-service). + +```js +const web3 = new Web3("https://cloudflare-eth.com") +``` + +Para probar que nuestra instancia Web3 se ha configurado correctamente, trataremos de recuperar el último número de bloque usando la función `getBlockNumber`. Esta función acepta una devolución de llamada como parámetro y devuelve el número de bloque como un número entero. + +```js +var Web3 = require("web3") +const web3 = new Web3("https://cloudflare-eth.com") + +web3.eth.getBlockNumber(function (error, result) { + console.log(result) +}) +``` + +Si ejecutas este programa, simplemente imprimirá el último número de bloque: la parte superior del blockchain. También puedes usar las llamadas de función `await/async` para evitar anidar las devoluciones de llamadas en el código: + +```js +async function getBlockNumber() { + const latestBlockNumber = await web3.eth.getBlockNumber() + console.log(latestBlockNumber) + return latestBlockNumber +} + +getBlockNumber() +``` + +Puedes ver todas las funciones disponibles en la instancia Web3 en [la documentación oficial de web3.js](https://docs.web3js.org/). + +La mayoría de las bibliotecas Web3 son asíncronas porque, en segundo plano, la biblioteca realiza llamadas JSON RPC al nodo que devuelve el resultado. + + + +Si estás trabajando en el navegador, algunas billeteras inyectan directamente una instancia Web3 y deberías tratar de usarla cuando sea posible, especialmente si planeas interactuar con la dirección Ethereum del usuario para hacer transacciones. + +Aquí está el fragmento para detectar si una billetera MetaMask está disponible y probar activarla si lo está. Más tarde, te permitirá leer el saldo del usuario y permitirle validar las transacciones que te gustaría que hicieran en el blockchain de Ethereum: + +```js +if (window.ethereum != null) { + state.web3 = new Web3(window.ethereum) + try { + // Request account access if needed + await window.ethereum.enable() + // Accounts now exposed + } catch (error) { + // User denied account access... + } +} +``` + +Existen alternativas a web3.js como [Ethers.js](https://docs.ethers.io/) y son muy usadas. En el siguiente tutorial, veremos [cómo escuchar fácilmente los nuevos bloques entrantes en el blockchain y ver lo que contienen](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/). diff --git a/public/content/translations/es/developers/tutorials/short-abi/index.md b/public/content/translations/es/developers/tutorials/short-abi/index.md new file mode 100644 index 00000000000..7671522a18e --- /dev/null +++ b/public/content/translations/es/developers/tutorials/short-abi/index.md @@ -0,0 +1,656 @@ +--- +title: "ABIs cortas para la Optimización de Calldata" +description: Optimizando contratos inteligentes para Optimistic Rollups +author: Ori Pomerantz +lang: es +tags: + - "capa 2" +skill: intermediate +published: 2022-04-01 +--- + +## Introducción {#introduction} + +En este artículo aprenderá sobre [optimistic rollups](/developers/docs/scaling/optimistic-rollups), el coste de transacciones en ellos, y cómo esa estructura de coste diferente requiere que optimicemos para cosas diferentes que en la Red principal de Ethereum. También aprenderá a implementar esta optimización. + +### Divulgación completa {#full-disclosure} + +Soy un empleado a tiempo completo de [Optimism](https://www.optimism.io/), así que los ejemplos de este artículo se ejecutarán en Optimism. Sin embargo, la técnica explicada aquí debería funcionar igual de bien para otros rollups. + +### Terminología {#terminology} + +Cuando se discuten rollups, el término 'capa 1' (L1) se utiliza para Mainnet, la red de producción Ethereum. El término 'capa 2' (L2) se utiliza para rollup o cualquier otro sistema que se base en L1 para la seguridad, pero realiza la mayor parte de su procesamiento fuera de cadena. + +## ¿Cómo podemos reducir aún más el coste de las transacciones en L2? {#how-can-we-further-reduce-the-cost-of-L2-transactions} + +[Los Optimistic rollups](/developers/docs/scaling/optimistic-rollups) tienen que preservar un registro de cada transacción histórica para que cualquiera pueda pasar por ellos y verificar que el estado actual es correcto. La forma más barata de obtener datos en el Ethereum Mainnet es escribirlos como datos de llamada. Esta solución fue elegida por [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) y [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups). + +### Coste de transacciones en L2 {#cost-of-l2-transactions} + +El coste de las transacciones en L2 se compone de dos componentes: + +1. Procesamiento en L2, que generalmente es extremadamente barato +2. Almacenamiento L1, que está vinculado a los costes de gas de La Red Principal + +Mientras escribo esto, en Optimism el costo del gas en L2 es 0.001 [Gwei](/developers/docs/gas/#pre-london). Por otra parte, el coste del gas en L1 es de aproximadamente 40 gwei. [Puedes ver los precios actuales aquí](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m). + +Un byte de calldata cuesta 4 de gas (si es cero) o 16 de gas (si es cualquier otro valor). Una de las operaciones más caras en la EVM es escribir en el almacenamiento. El coste máximo de escribir una palabra de 32 bytes para almacenar en L2 es de 22100 gas. Actualmente, esto es 22.1 gwei. Así que si podemos guardar un único byte cero de calldata, podremos escribir unos 200 bytes en el almacenamiento y aún así saldremos adelante. + +### El ABI {#the-abi} + +La gran mayoría de las transacciones acceden a un contrato desde una cuenta de propiedad externa. La mayoría de los contratos están escritos en Solidity e interpretan su campo de datos por [la interfaz binaria de la aplicación (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding). + +Sin embargo, el ABI fue diseñado para L1, donde un byte de datos de llamada cuesta aproximadamente lo mismo que cuatro operaciones aritméticas, y no para L2, donde un byte de datos de llamada cuesta más de mil operaciones aritméticas. Por ejemplo, [aquí está una transacción de transferencia de ERC-20](https://kovan-optimistic.etherscan.io/tx/0x7ce4c144ebfce157b4de99d8ad53a352ae91b57b3fa06d8a1c79439df6bfa998). Los datos de llamada se dividen así: + +| Sección | Longitud | Bytes | Bytes consumidos | Gas consumido | Bytes necesarios | Gas necesario | +| --------------------- | --------:| -----:| ----------------:| -------------:| ----------------:| -------------:| +| Selector de funciones | 4 | 0-3 | 3 | 48 | 1 | 16 | +| Ceros | 12 | 4-15 | 12 | 48 | 0 | 0 | +| Dirección de destino | 20 | 16-35 | 0 | 0 | 20 | 320 | +| Monto | 32 | 36-67 | 17 | 64 | 15 | 240 | +| Total | 68 | | | 160 | | 576 | + +Explicación: + +- **Function selector**: Contrato con menos de 256 funciones, para que podamos distinguirlos con un solo byte. Estos bytes suelen ser distintos de cero y, por lo tanto, [cuesta dieciséis de gas](https://eips.ethereum.org/EIPS/eip-2028). +- **Ceros**: estos bytes son siempre cero porque una dirección de veinte bytes no requiere una palabra de treinta y dos bytes para contenerla. Bytes que contienen cuatro gas de costo cero ([ver el yellow paper](https://ethereum.github.io/yellowpaper/paper.pdf), Apéndice G, pag. 27, el valor de `G``txdatazero`). +- **Amount**: Si asumimos que en este contrato `decimals` es dieciocho (el valor normal) y la cantidad máxima de tokens que transferiremos será 1018, obtenemos una cantidad máxima de 1036. 25615 > 1036, entonces quince bytes serán suficientes. + +Un desperdicio de 160 en gas en L1 normalmente es insignificante. Una transacción cuesta al menos [21.000 de gas](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), por lo que un 0,8% adicional no importa. Sin embargo, en L2 las cosas son diferentes. Casi todo el costo de la transacción es escrito en L1. Además de los datos de llamada de la transacción, hay 109 bytes de encabezado de transacción (dirección de destino, firma, etc.). Por lo tanto, el costo total es `109*16+576+160=2480`, y estamos desperdiciando alrededor del 6,5 % de eso. + +## Reducir costes cuando no controlas el destino {#reducing-costs-when-you-dont-control-the-destination} + +Suponiendo que no tienes control sobre el contrato de destino, aún puedes usar una solución similar a [ésta](https://github.com/qbzzt/ethereum.org-20220330-shortABI). Repasemos los archivos relevantes. + +### Token.sol {#token-sol} + +[Este es el contrato de destino](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol). Es un contrato ERC-20 estándar, con una característica adicional. Esta función `faucet` permite a cualquier usuario obtener algún token para usar. Haría inútil un contrato de producción de ERC-20, pero hace la vida más fácil cuando existe un ERC-20 sólo para facilitar las pruebas. + +```solidity + /** + * @dev Gives the caller 1000 tokens to play with + */ + function faucet() external { + _mint(msg.sender, 1000); + } // function faucet +``` + +[Puede ver un ejemplo de la implementación de este contrato aquí](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8). + +### CalldataInterpreter.sol {#calldatainterpreter-sol} + +[Este es el contrato al que se supone que deben llamar las transacciones con datos de llamada más cortos](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol). Vamos a repasarlo línea por línea. + +```solidity +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + + +import { OrisUselessToken } from "./Token.sol"; +``` + +Necesitamos la función token para saber cómo llamarla. + +```solidity +contract CalldataInterpreter { + + OrisUselessToken public immutable token; +``` + +La dirección del token del que somos proxy. + +```solidity + + /** + * @dev Specify the token address + * @param tokenAddr_ ERC-20 contract address + */ + constructor( + address tokenAddr_ + ) { + token = OrisUselessToken(tokenAddr_); + } // constructor +``` + +La dirección del token es el único parámetro que debemos especificar. + +```solidity + function calldataVal(uint startByte, uint length) + private pure returns (uint) { +``` + +Leer el valor desde el calldata. + +```solidity + uint _retVal; + + require(length < 0x21, + "calldataVal length limit is 32 bytes"); + + require(length + startByte <= msg.data.length, + "calldataVal trying to read beyond calldatasize"); +``` + +Vamos a cargar una sola palabra de 32 bytes (256 bits) en la memoria y eliminar los bytes que no forman parte del campo que queremos. Este algoritmo no funciona para valores de más de 32 bytes y, por supuesto, no podemos leer más allá del final de los datos de llamada. En L1 puede que sea necesario saltarse estas pruebas para ahorrar gasolina, pero en L2 el gas es extremadamente barato, lo que permite realizar cualquier control de seguridad que podamos imaginar. + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +Podríamos haber copiado los datos de la llamada a `fallback()` (ver más abajo), pero es más fácil usar [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html), el lenguaje ensamblador del EVM. + +Aquí usamos [el código de operación CALLDATALOAD](https://www.evm.codes/#35) para leer los bytes `startByte` a `startByte+31` en la pila. En general, la sintaxis de un código de operación en Yul es `(,...)`. + +```solidity + + _retVal = _retVal >> (256-length*8); +``` + +Sólo los bytes de `length` más significativos forman parte del campo, por lo que [desplazamiento a la derecha](https://en.wikipedia.org/wiki/Logical_shift) para obtener deshacerse de los otros valores. Esto tiene la ventaja adicional de mover el valor a la derecha del campo, por lo que es el valor en sí mismo en lugar del valor multiplicado por 256algo. + +```solidity + + return _retVal; + } + + + fallback() external { +``` + +Cuando una llamada a un contrato de Solidity no coincide con ninguna de las firmas de función, llama [la función `fallback()`](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function) (suponiendo que exista una). En el caso de `CalldataInterpreter`, _cualquier_ llamada llega aquí porque no hay ningún otro `external` o `public` funciones. + +```solidity + uint _func; + _func = calldataVal(0, 1); +``` + + +Lea el primer byte del calldata, que nos dice la función. Hay dos razones por las que una función no estaría disponible aquí: + +1. Las funciones que son `pure` o `view` no cambian el estado y no cuestan gas (cuando se llaman fuera de la cadena). No tiene sentido tratar de reducir su costo de gas. +2. Funciones que dependen de + +`msg.sender`. +El valor de `msg.sender` será la dirección de `CalldataInterpreter`, no la persona que llama. + +Desafortunadamente, [mirando las especificaciones ERC-20](https://eips.ethereum.org/EIPS/eip-20), esto deja solo una función, `transfer`. Esto nos deja con sólo dos funciones: `transfer` (porque podemos llamar a `transferFrom`) y `faucet` (porque podemos transferir los tokens a quien haya llamado a nosotros). + + + +```solidity + + // Call the state changing methods of token using + // information from the calldata + + // faucet + if (_func == 1) { +``` + + +Una llamada a `faucet()`, que no tiene parámetros. + + + +```solidity + token.faucet(); + token.transfer(msg.sender, + token.balanceOf(address(this))); + } +``` + + +Después de llamar a `token.faucet()` obtenemos tokens. Sin embargo, como contrato de proxy, no **necesitamos** tokens. El EOA (externally owned account) o o contrato que nos llama lo hace. Entonces transferimos todos nuestros tokens a quien nos llamó. + + + +```solidity + // transfer (assume we have an allowance for it) + if (_func == 2) { +``` + + +La transferencia de tokens requiere dos parámetros: la dirección de destino y la cantidad. + + + +```solidity + token.transferFrom( + msg.sender, +``` + + +Solo permitimos que las personas que llaman transfieran tokens de su propiedad + + + +```solidity + address(uint160(calldataVal(1, 20))), +``` + + +La dirección de destinación empieza en byte #1 (byte #0 es la función). Como una dirección, es de 20 bytes de largo. + + + +```solidity + calldataVal(21, 2) +``` + + +Por este contrato en particular asumimos que el número máximo de tokens que alguien querría transferir en 2 bytes (menos que 65536). + + + +```solidity + ); + } +``` + + +En general, una transferencia toma 35 bytes de datos de llamada: + +| Sección | Longitud | Bytes | +| --------------------- | --------:| -----:| +| Selector de funciones | 1 | 0 | +| Dirección de destino | 32 | 1-32 | +| Monto | 2 | 33-34 | + + + + +```solidity + } // fallback + +} // contract CalldataInterpreter +``` + + + + +### prueba.js {#test-js} + +[Esta unidad de prueba de JavaScript](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) nos muestra cómo usar este mecanismo (y cómo verificar si funciona correctamente). Voy a asumir que entendiste [chai](https://www.chaijs.com/) y [ethers](https://docs.ethers.io/v5/) y solo voy a explicar específicamente las partes para aplicar un contrato. + + + +```js +const { expect } = require("chai"); + +describe("CalldataInterpreter", function () { + it("Should let us use tokens", async function () { + const Token = await ethers.getContractFactory("OrisUselessToken") + const token = await Token.deploy() + await token.deployed() + console.log("Token addr:", token.address) + + const Cdi = await ethers.getContractFactory("CalldataInterpreter") + const cdi = await Cdi.deploy(token.address) + await cdi.deployed() + console.log("CalldataInterpreter addr:", cdi.address) + + const signer = await ethers.getSigner() +``` + + +Empezamos implementando ambos contratos. + + + +```javascript + // Get tokens to play with + const faucetTx = { +``` + + +No podemos usar las funciones de alto nivel que normalmente usamos (como `token.faucet()`) para crear transacciones, porque no seguimos el ABI. En cambio, tenemos que construir la transacción por nuestra cuenta y después enviarla. + + + +```javascript + to: cdi.address, + data: "0x01" +``` + + +Hay dos parámetros necesarios que debemos proporcionar para la transacción: + +1. `to`, la dirección de destino. Este es el contrato intérprete de calldata. + +2. `data`, el calldata por enviar. En caso de un llamado de grifo, la información es un único byte, `0x01`. + + + +```javascript + + } + await (await signer.sendTransaction(faucetTx)).wait() +``` + + +Llamamos al [método `sendTransaction` del firmante](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) porque ya especificamos el destino (`faucetTx.to`) y necesitamos que la transacción sea firmada. + + + +```javascript +// Check the faucet provides the tokens correctly +expect(await token.balanceOf(signer.address)).to.equal(1000) +``` + + +Aquí verificamos el balance. No es necesario ahorrar gas en las funciones `view`, por lo que las ejecutamos con normalidad. + + + +```javascript +// Give the CDI an allowance (approvals cannot be proxied) +const approveTX = await token.approve(cdi.address, 10000) +await approveTX.wait() +expect(await token.allowance(signer.address, cdi.address)).to.equal(10000) +``` + + +Otorgue al intérprete de calldata la autorización para realizar transferencias. + + + +```javascript +// Transfer tokens +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +``` + + +Crea una transacción de transferencia. El primer byte es "0x02", seguido por la dirección de destino y finalmente la cantidad (0x0100, que es 256 en decimal). + + + +```javascript + await (await signer.sendTransaction(transferTx)).wait() + + // Check that we have 256 tokens less + expect (await token.balanceOf(signer.address)).to.equal(1000-256) + + // And that our destination got them + expect (await token.balanceOf(destAddr)).to.equal(256) + }) // it +}) // describe +``` + + + + +### Ejemplo {#example} + +Si quieres ver esos archivos en acción sin ejecutarlas por ti mismo, sigue estos enlaces: + +1. [Despliegue de `OrisUselessToken`](https://kovan-optimistic.etherscan.io/tx/1410744) a [la dirección `0x950c753c0edbde44a74d3793db738a318e9c8ce8`](https://kovan-optimistic.etherscan.io/address/0x950c753c0edbde44a74d3793db738a318e9c8ce8). +2. [Despliegue de `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1410745) a [la dirección `0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55`](https://kovan-optimistic.etherscan.io/address/0x16617fea670aefe3b9051096c0eb4aeb4b3a5f55). +3. [Llama a `faucet()`](https://kovan-optimistic.etherscan.io/tx/1410746). +4. [Llama a `OrisUselessToken.approve()`](https://kovan-optimistic.etherscan.io/tx/1410747). Este llamado debe ir directamente al contrato del token porque el procesamiento depende de `msg.sender`. + +5. [Llama a `transfer()`](https://kovan-optimistic.etherscan.io/tx/1410748). + + + +## Reduciendo el costo cuando controlas el contrato de destino {#reducing-the-cost-when-you-do-control-the-destination-contract} + +Si controlas el contrato de la dirección de destino puedes crear funciones para omitir las revisiones de `msg.sender` porque confían en el intérprete de calldata. [Aquí puedes ver un ejemplo de cómo esto funciona en la rama de `control-contract`](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract). + +Si el contrato sólo ha respondido a transacciones externas, podemos arreglárnoslas teniendo sólo un contrato. Sin embargo, eso puede romper la [capacidad de composición](/developers/docs/smart-contracts/composability/). Es mejor tener un contrato que responda a llamados normales ERC-20 y otro contrato que responda a transacciones con llamados cortos de datos. + + + +### Token.sol {#token-sol-2} + +En este ejemplo podemos modificar `Token.sol`. Esto nos permite tener un número de funciones que sólo el proxy podría llamar. Aquí están las nuevas partes: + + + +```solidity + // The only address allowed to specify the CalldataInterpreter address + address owner; + + // The CalldataInterpreter address + address proxy = address(0); +``` + + +El contrato ERC-20 necesita conocer la identidad del proxy autorizado. Sin embargo, no podemos establecer esta variable en el constructor, porque aún no conocemos el valor. El contrato es instanciado primero porque el proxy espera la dirección del token en su constructor. + + + +```solidity + /** + * @dev Calls the ERC20 constructor. + */ + constructor( + ) ERC20("Oris useless token-2", "OUT-2") { + owner = msg.sender; + } +``` + + +La dirección del creador (llamada `owner`) es almacenada aquí porque esa es la única dirección permitida para establecer el proxy. + + + +```solidity + /** + * @dev set the address for the proxy (the CalldataInterpreter). + * Can only be called once by the owner + */ + function setProxy(address _proxy) external { + require(msg.sender == owner, "Can only be called by owner"); + require(proxy == address(0), "Proxy is already set"); + + proxy = _proxy; + } // function setProxy +``` + + +El proxy tiene acceso privilegiado, porque puede omitir las revisiones de seguridad. Para asegurarnos que podemos confier en el proxy solo le permitimos al `owner` llamar esta función y solo una vez. Una vez que `proxy` tiene un valor real (diferente a cero), ese valor no puede cambiar, incluso si el propietario decide volverse pícaro o el mnemotécnico para este es revelado, entonces todavía estamos seguros. + + + +```solidity + /** + * @dev Some functions may only be called by the proxy. + */ + modifier onlyProxy { +``` + + +Esta es una [función `modifier`](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), esta modifica la manera en que operan otras funciones. + + + +```solidity + require(msg.sender == proxy); +``` + + +Primero, verificamos que nos ha llamado el proxy y nadie más. Si no, `revert`. + + + +```solidity + _; + } +``` + + +En caso de ser así, ejecutamos la función que modificamos. + + + +```solidity + /* Functions that allow the proxy to actually proxy for accounts */ + + function transferProxy(address from, address to, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _transfer(from, to, amount); + return true; + } + + function approveProxy(address from, address spender, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _approve(from, spender, amount); + return true; + } + + function transferFromProxy( + address spender, + address from, + address to, + uint256 amount + ) public virtual onlyProxy() returns (bool) + { + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + return true; + } +``` + + +Esas son tres operaciones que normalmente requieren que el mensaje proviene directamente de la entidad transfiriendo tokens o aprovando una autorización. Aquí tenemos una versión proxy de estas operaciones que: + +1. Es modificada por `onlyProxy()`, por lo que nadie cuenta con la autorización de controlarlo. +2. Obtiene la dirección que normalmente sería `msg.sender` como un parámetro adicional. + + + +### CalldataInterpreter.sol {#calldatainterpreter-sol-2} + +El intérprete de calldata es casi idéntico al que se encuentra arriba, con la excepción de que las funciones de proxy reciben un parámetro `msg.sender` y no es necesaria una asignación para `transfer`. + + + +```solidity + // transfer (no need for allowance) + if (_func == 2) { + token.transferProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // approve + if (_func == 3) { + token.approveProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // transferFrom + if (_func == 4) { + token.transferFromProxy( + msg.sender, + address(uint160(calldataVal( 1, 20))), + address(uint160(calldataVal(21, 20))), + calldataVal(41, 2) + ); + } +``` + + + + +### Test.js {#test-js-2} + +Hay algunos cambios entre el anterior código de prueba y este. + + + +```js +const Cdi = await ethers.getContractFactory("CalldataInterpreter") +const cdi = await Cdi.deploy(token.address) +await cdi.deployed() +await token.setProxy(cdi.address) +``` + + +Necesitamos decirle al contrato ERC-20 en cual proxy debe confiar + + + +```js +console.log("CalldataInterpreter addr:", cdi.address) + +// Need two signers to verify allowances +const signers = await ethers.getSigners() +const signer = signers[0] +const poorSigner = signers[1] +``` + + +Para revisar `approve()` y `transferFrom()` necesitamos un segundo firmante. Lo llamaremos `poorSigner` porque no obtiene alguno de nuestros tókens (por supuesto, no es necesario contar con ETH). + + + +```js +// Transfer tokens +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +await (await signer.sendTransaction(transferTx)).wait() +``` + + +Debido a que el contrato ERC-20 confía en el proxy (`cdi`), no necesitamos una asignación para retransmitir transferencias. + + + +```js +// approval and 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() + +// Check the approve / transferFrom combo was done correctly +expect(await token.balanceOf(destAddr2)).to.equal(255) +``` + + +Prueba las dos nuevas funciones. Toma en cuenta que `transferFromTx` requiere dos direcciones como parámetros: el dador de la asignación y el receptor. + + + +### Ejemplo {#example-2} + +Si quieres ver esos archivos en acción sin ejecutarlas por ti mismo, sigue estos enlaces: + +1. [Despliegue de `OrisUselessToken-2`](https://kovan-optimistic.etherscan.io/tx/1475397) en la dirección [`0xb47c1f550d8af70b339970c673bbdb2594011696`](https://kovan-optimistic.etherscan.io/address/0xb47c1f550d8af70b339970c673bbdb2594011696). +2. [Despliegue de `CalldataInterpreter`](https://kovan-optimistic.etherscan.io/tx/1475400) en la dirección[`0x0dccfd03e3aaba2f8c4ea4008487fd0380815892`](https://kovan-optimistic.etherscan.io/address/0x0dccfd03e3aaba2f8c4ea4008487fd0380815892). +3. [Llamar a `setProxy()`](https://kovan-optimistic.etherscan.io/tx/1475402). +4. [Llamar a `faucet()`](https://kovan-optimistic.etherscan.io/tx/1475409). +5. [Llamar a `transferProxy()`](https://kovan-optimistic.etherscan.io/tx/1475416). +6. [Llamar a `approveProxy()`](https://kovan-optimistic.etherscan.io/tx/1475419). +7. [Llamar a `transferFromProxy()`](https://kovan-optimistic.etherscan.io/tx/1475421). Tome en cuenta que este llamado proviene de una dirección diferente a las anteriores, `poorSigner` en el lugar de `signer`. + + + +## Conclusión {#conclusion} + +[Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) y [Arbitrum](https://developer.offchainlabs.com/docs/special_features) están buscando algunas maneras de reducir el tamaño del calldata escrito a L1 y por lo tanto el costo de las transacciones. Sin embargo, como proveedores buscando por soluciones genéricas, nuestras habilidades están limitadas. Como el desarrollador dapp, tienes conocimiento específico de la aplicación, lo que te permite optimizar tu calldata mejor a como lo harías en una solución genérica. Con un poco de suerte, este artículo puede ayudarte a encontrar la solución ideal a tus necesidades. diff --git a/public/content/translations/es/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/es/developers/tutorials/smart-contract-security-guidelines/index.md new file mode 100644 index 00000000000..b3d0a2d9b6a --- /dev/null +++ b/public/content/translations/es/developers/tutorials/smart-contract-security-guidelines/index.md @@ -0,0 +1,94 @@ +--- +title: Directrices de seguridad de contratos inteligentes +description: Lista de directrices de seguridad para tener en cuenta al crear una Dapp +author: "Trailofbits" +tags: + - "solidity" + - "contratos inteligentes" + - "seguridad" +skill: intermediate +lang: es +published: 2020-09-06 +source: Desarrollando smart contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md +--- + +Siga estas recomendaciones generales para crear contratos inteligentes más seguros. + +## Directrices de diseño {#design-guidelines} + +El diseño del contrato debe ser verse con antelación, antes de escribir cualquier línea de código. + +### Documentación y especificaciones {#documentation-and-specifications} + +La documentación se puede escribir en diferentes niveles y debe actualizarse al implementar los contratos: + +- **Una descripción sencilla del sistema** que indique lo que hacen los contratos y cualquier suposición en la base de código. +- **Esquema y diagramas arquitectónicos**, incluyendo las interacciones con el contrato y la máquina de estado del sistema. Las [impresoras de Slither](https://github.com/crytic/slither/wiki/Printer-documentation) pueden ayudar a generar estos esquemas. +- **Documentación de código minuciosa**; el [formato Natspec](https://solidity.readthedocs.io/en/develop/natspec-format.html) puede usarse para Solidity. + +### Cálculo en cadena vs. fuera de cadena {#on-chain-vs-off-chain-computation} + +- **Mantenga todo el código que se pueda fuera de cadena.** Mantenga una capa en cadena pequeña. Preprocese datos con código fuera de la cadena de tal manera que la verificación en cadena sea simple. ¿Necesito una lista ordenada? Ordene la lista fuera de la cadena y luego solo compruebe su orden dentro de la cadena. + +### Capacidad de mejora {#upgradeability} + +Analizamos diferentes soluciones de mejora en [nuestra entrada de blog](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/). Tome una decisión deliberada de si admitir la capacidad de mejora o no antes de escribir cualquier código. La decisión influirá en cómo estructurar el código. En general, se recomienda: + +- **Favorecer la [migración de contratos](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) sobre la mejora o actualización.** El sistema de migración tiene muchas de las mismas ventajas que el sistema actualizable, sin sus desventajas o inconvenientes. +- **Utilizar el patrón de separación de datos por sobre delegatecallproxy.** Si el proyecto tiene una clara separación de abstracción, la mejora mediante la separación de datos requerirá solo de unos pocos ajustes. delegatecallproxy requiere conocimientos sobre la EVM y es altamente propenso a errores. +- **Documentar el procedimiento de migración/actualización antes de la implementación.** Si tiene que reaccionar bajo presión sin ninguna directriz, cometerá errores. Escriba el procedimiento a seguir con antelación. Debe incluir: + - Las llamadas que inician los nuevos contratos + - Dónde se almacenan las claves y cómo acceder a ellas + - Cómo revisar la implementación. Desarrolle y pruebe un script posterior a la implementación. + +## Guías de implementación {#implementation-guidelines} + +**Busque simplicidad ante todo.** Use simpre la solución más simple que se adapte a su propósito. Cualquier miembro del equipo debería ser capaz de entender la solución. + +### Composición de funciones {#function-composition} + +La arquitectura del código base debería hacer que el código sea fácil de revisar. Evite opciones arquitectónicas que disminuyan la capacidad de razonar acerca de la corrección. + +- **Divida la lógica de su sistema**, ya sea a través de múltiples contratos o agrupando funciones similares (por ejemplo, autenticación, aritmética, ...). +- **Escriba pequeñas funciones con un propósito claro.** Esto facilitará la revisión y permitirá la prueba de componentes individuales. + +### Herencia {#inheritance} + +- **Mantenga la herencia manejable.** La herencia debe utilizarse para dividir la lógica; sin embargo, el proyecto debe apuntar a minimizar la profundidad y el ancho del árbol de herencia. +- **Use la [impresora de herencia](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) de Slither para comprobar la jerarquía de los contratos.** La impresora de herencia ayudará a revisar el tamaño de la jerarquía. + +### Eventos {#events} + +- **Registre todas las operaciones cruciales.** Los eventos ayudarán a depurar el contrato durante el desarrollo y monitorearlo después de la implementación. + +### Evite inconvenientes conocidos {#avoid-known-pitfalls} + +- **Tenga presente los problemas de seguridad más comunes.** Hay muchos recursos en línea para aprender sobre problemas comunes, tales como [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/) o [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/). +- **Tenga en cuenta las secciones de advertencias de la [documentación de Solidity](https://solidity.readthedocs.io/en/latest/).** Las secciones de advertencias lo informarán sobre el comportamiento no obvio del lenguaje. + +### Dependencias {#dependencies} + +- **Use bibliotecas bien probadas.** Importar código de bibliotecas bien probadas reducirá la probabilidad de escribir código con errores. Si desea escribir un contrato ERC20, use [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20). +- **Use un administrador de dependencias; evite copiar y pegar código.** Si confía en una fuente externa, entonces debe mantenerla actualizada con la fuente original. + +### Pruebas y verificación {#testing-and-verification} + +- **Escriba pruebas unitarias minuciosas.** Un amplio conjunto de pruebas es crucial para crear software de alta calidad. +- **Escriba verificaciones y propiedades de [Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) y [Manticore](https://github.com/trailofbits/manticore) personalizadas.** Las herramientas automatizadas ayudarán a garantizar la seguridad del contrato. Revise el resto de esta guía para aprender a escribir verificaciones y propiedades eficientes. +- **Use [crytic.io](https://crytic.io/).** Crytic se integra con Github y proporciona acceso a detectores privados de Slither, además de ejecutar comprobaciones de propiedades personalizadas desde Echidna. + +### Solidez {#solidity} + +- **Inclínese por Solidity 0.5 por sobre las versiones 0.4 y 0.6.** Solidity 0.5 es más seguro y tiene mejores prácticas incorporadas que la versión 0.4. Solidity 0.6 ha demostrado ser demasiado inestable para la producción y necesita tiempo para madurar. +- **Use una versión estable para compilar; use la última versión para comprobar si hay advertencias.** Compruebe que el código no tenga problemas reportados con la última versión del compilador. Sin embargo, Solidity tiene un ciclo de liberación rápido y un historial de errores del compilador, así que no se recomienda la última versión para la implementación (ver [recomendación de versión de solc](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) de Slither). +- **No use ensamblado en línea.** El ensamblado requiere conocimientos sobre la EVM. No escriba código de EVM si no _domina_ el Yellow Paper. + +## Directrices para la implementación {#deployment-guidelines} + +Una vez que el contrato haya sido desarrollado e implementado: + +- **Monitoree sus contratos.** Mire los registros y esté listo para reaccionar en caso de que un contrato o una billetera se vean comprometidos. +- **Agregue la información de su contacto a [blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts).** Esta lista ayuda a terceros a contactarlo si se descubre una falla de seguridad. +- **Proteja las billeteras de usuarios privilegiados.** Siga las [mejores prácticas](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) si almacena llaves en billeteras de hardware. +- **Tenga un plan de respuesta a incidentes.** Considere que los contratos inteligentes pueden verse vulnerados. Incluso si los contratos están libres de fallas, un atacante puede tomar el control de las claves del propietario del contrato. diff --git a/public/content/translations/es/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md b/public/content/translations/es/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md new file mode 100644 index 00000000000..b86c07ad283 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/solidity-and-truffle-continuous-integration-setup/index.md @@ -0,0 +1,194 @@ +--- +title: "Configuración de Solidity y Truffle de integración continua" +description: Cómo configurar Travis o Circle CI para pruebas de Truffle junto con conplementos útiles +author: Markus Waas +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "pruebas" + - "truffle" + - "ganache" +skill: intermediate +published: 2020-06-05 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/continuous-integration +--- + +La integración continua (CI) con Truffle es genial para el desarrollo una vez que se implementa un conjunto básico de pruebas. Le permite realizar pruebas muy largas, asegurarse de que todas las pruebas pasen antes de combinar una [solicitud de pull](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) y llevar un seguimiento de varias estadísticas utilizando herramientas adicionales. + +Utilizaremos el [Truffle Metacoin Box](https://www.trufflesuite.com/boxes/metacoin) para configurar nuestra integración continua. Puede elegir Travis CI o Circle CI. + +## Configurar Travis CI {#setting-up-travis-ci} + +Añadir [Travis CI](https://travis-ci.org/) es sencillo. Solo necesitará añadir un archivo de configuración `.travis.yml` a la carpeta raíz del proyecto: + +```yml +language: node_js +node_js: + - 10 + +cache: npm + +before_script: + - echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p + +script: + - npm test +``` + +Lo estamos manteniendo simple por ahora y sólo estamos ejecutando el script de prueba que ejecuta las pruebas individuales de Truffle. Pero tenemos un problema, no habrá una blockchain disponible en la máquina Travis CI. Una solución simple para esto es `npm install ganache-cli` y simplemente ejecutarlo antes de la prueba. Puedes hacer esto al agregar un guión basj con la línea npx `ganache-cli > 7dev/null` y antes de `llamada de prueba truffle npx`. El [ejemplo completo de bash script](https://github.com/gorgos/Truffle-CI-Example/blob/master/scripts/run_tests.sh). + +## Configurando Circle CI {#setting-up-circle-ci} + +[CircleCI](https://circleci.com/) requiere un archivo config más grande. El comando adicional [`npm ci`](https://docs.npmjs.com/cli/ci.html) es automáticante hecho en Travis. Instala las dependencias más rápido y más seguras que `npm install` lo hace. Otra vez usamos el mismo guión de la versión Travis para ejecutar ganache-cli antes de las pruebas. + +```yml +version: 2 + +aliases: + - &defaults + docker: + - image: circleci/node:10 + + - &cache_key_node_modules + key: v1-node_modules-{{ checksum "package-lock.json" }} + +jobs: + dependencies: + <<: *defaults + steps: + - checkout + - restore_cache: + <<: *cache_key_node_modules + - run: + name: Install npm dependencies + command: | + if [ ! -d node_modules ]; then + npm ci + fi + - persist_to_workspace: + root: . + paths: + - node_modules + - build + - save_cache: + paths: + - node_modules + <<: *cache_key_node_modules + + test: + <<: *defaults + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Unit tests + command: npm test + +workflows: + version: 2 + everything: + jobs: + - dependencies + - test: + requires: + - dependencies +``` + +## Añadiendo el plugin de eth-gas-reporter {#adding-the-eth-gas-reporter-plugin} + +El puglin de eth-gas-reporter es muy útil para llevar el rastro de los costos de las funciones de gas de tu contrato inteligente. Tenerlo en tu CI seguirá siendo útil para mostrar diferencias cuando se agreguen la solicitud de pull. + +### Paso 1: Instalar el plugin de eth-gas-reporter y comprobantes de código {#step-1-install-the-eth-gas-reporter-plugin-and-codechecks} + +```bash +npm install --save-dev eth-gas-reporter +npm install --save-dev @codechecks/client +``` + +### Paso 2: Agrega el plugin a la configuración de moca adentro de tu truffle-config.js {#step-2-add-the-plugin-to-the-mocha-settings-inside-your-truffle-configjs} + +[Ver opciones](https://github.com/cgewecke/eth-gas-reporter#options) + +```js +module.exports = { + networks: { ... }, + mocha: { + reporter: 'eth-gas-reporter', + reporterOptions: { + excludeContracts: ['Migrations'] + } + } +}; +``` + +### Paso 3: Agrega comprobantes de código.yml para el directorio de raíz de tu proyecto {#step-3-add-a-codechecksyml-to-your-projects-root-directory} + +```yml +checks: + - name: eth-gas-reporter/codechecks +``` + +### Paso 4: Ejecuta el comprobante de código después del comando de prueba {#step-4-run-codechecks-after-the-test-command} + +```bash +- npm test +- npx codechecks +``` + +### Paso 5: Crear una cuenta de comprobación de código {#step-5-create-a-codechecks-account} + +- Crea una cuenta con [Codechecks](http://codechecks.io/). +- Agrega el repositorio de GitHub. +- Copia el secreto y agrega el `CC_SECRET=COPIED SECRET` a tu CI (vea aquí para [Travis](https://docs.travis-ci.com/user/environment-variables/), aquí para [CircleCi](https://circleci.com/docs/2.0/env-vars/#setting-an-environment-variable-in-a-project)). +- Ahora adelante y crea una solicitud de pull. + +Eso es todo. Ahora tú encontrarás un buen reporte acerca de los cambios en los costos del gas de tú solicitud de pull. + +![Ejemplo de los reportes de gas](./gas-reports.png) + +## Agregando el plugin solidity-coverage {#adding-the-solidity-coverage-plugin} + +Con el plugin solidity-coverage puedes chequear cuanto de tu rutas de código están cubiertas por tús pruebas. Agregar esto a tu CI lo hace muy conveniente para usar una vez que se coloca. + +### Paso 1: Crea un proyecto de metacoin e instala herramientas de cobertura {#step-1-create-a-metacoin-project-and-install-coverage-tools} + +```bash +npm install --save-dev truffle coveralls solidity-coverage +``` + +### Paso 2: Agregar solidity-coverage a la matriz de plugins en truffle-config.js {#step-2-add-solidity-coverage-to-the-plugins-array-in-truffle-configjs} + +```js +module.exports = { + networks: {...}, + plugins: ["solidity-coverage"] +} +``` + +### Paso 3: Agrega los comandos de cobertura al .travis.yml o Circle CI config.yml {#step-3-add-the-coverage-commands-to-the-travisyml-or-circle-ci-configyml} + +```bash +- npx truffle run coverage +- cat coverage/lcov.info | npx coveralls +``` + +Cobertura de solidity comienza su propio ganache-cli, así que no tenemos que preocuparnos de esto. Sin embargo, no remplaces el comando de prueba normal, la cobertura de ganache-cli funciona diferente y es por lo tanto no reemplazable para ejecutar pruebas unitarias regulares. + +### Step 4: Agrega el repositorio a los coveralls {#step-4-add-repository-to-coveralls} + +- Crea una cuenta con [Coveralls](https://coveralls.io/). +- Agrega el repositorio de GitHub. +- Ahora adelante y crea una solicitud de pull. + +![Ejemplo de coverall](./coverall.png) + +## Otras ideas {#further-ideas} + +- [MythX](https://mythx.io/): Con MythX puedes automáticamente analizar la seguridad de tu contrato inteligente. Entonces tiene mucho sentido [agregar esto a tu CI](https://blog.mythx.io/howto/mythx-and-continuous-integration-part-1-circleci/). +- [Linting](https://wikipedia.org/wiki/Lint_%28software%29): Un buen código puede ser aplicado hasta cierto grado con herramientas de linting. [Eslint](https://eslint.org/) trabaja genial para JavaScript, es [fácil de configurar](https://eslint.org/docs/user-guide/getting-started), mientras que [Solhint](https://protofire.github.io/solhint/) puede ser usadao por solidity. +- Pruebas largas: Algunas veces es posible que desees agregar pruebas extremas, ej., pruebas a contratos con cientos de usuarios. Esto toma mucho tiempo. En lugar de ejecutar esos en cada ejecución de prueba, agregalos al CI. + +Ahí lo tienes. Integración continua es una estrategía muy útil para su desarrollo. Puedes chequear un ejemplo completo en [Truffle-CI-Example](https://github.com/gorgos/Truffle-CI-Example). Solo asegurate de remover Circle-CI o Travis, ¡uno es suficiente! diff --git a/public/content/translations/es/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md b/public/content/translations/es/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md new file mode 100644 index 00000000000..46a88da1df9 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/testing-erc-20-tokens-with-waffle/index.md @@ -0,0 +1,1138 @@ +--- +title: Prueba de tokens ERC-20 con Waffle +description: Aprende cómo probar smart contracts en Solidity y utiliza comparadores de smart contracts con Waffle. +author: Vladislav Starostenko +tags: + - "waffle" + - "contratos inteligentes" + - "solidity" + - "pruebas" + - "erc-20" +skill: intermediate +lang: es +published: 2020-10-16 +--- + +En este tutorial aprenderás como: + +- Escribir pruebas para smart contracts con Waffle +- Usar algunos de los matchers populares para probar smart contracts con Waffle + +Supuestos: + +- sabes cómo usar una terminal, +- puedes crear un proyecto nuevo en `JavaScript`, +- has escrito líneas de código en `Solidity`, +- has escrito pruebas en `JavaScript`, +- has usado `yarn` o `npm`, o el instalador de paquetes de JavaScript. + +Si una de las suposiciones previas no encajan, o no planeas reproducir el código en este artículo, puede ser que no tengas ningún inconveniente leyendo este articulo. + +## Un vistazo a Waffle {#a-few-words-about-waffle} + +[Waffle](https://getwaffle.io) es la biblioteca más avanzada para escribir y probar smart contracts. + +Funciona con ethers-js, un [API de JavaScript](/developers/docs/apis/javascript/). + +¡Puedes leer más detalles en la [documentación de Waffle](https://ethereum-waffle.readthedocs.io/en/latest/#waffle-documentation)! + +## Tutorial rápido {#the-quick-tutorial} + +Lo primero es lo primero, crea un nuevo proyecto `JavaScript` o `TypeScript` ( Utiliza `TS`, pero si utilizas `JS` no hay problema) : + +Algo como esto: + +
    +package.json + + { + "name": "tutorial", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "scripts": { + "test": "export NODE_ENV=test && mocha", + "lint": "eslint '{src,test}/**/*.ts'", + "lint:fix": "eslint --fix '{src,test}/**/*.ts'", + "build": "waffle" + }, + "devDependencies": { + "@types/mocha": "^5.2.7", + "@typescript-eslint/eslint-plugin": "^2.30.0", + "@typescript-eslint/parser": "^2.30.0", + "eslint": "^6.8.0", + "eslint-plugin-import": "^2.20.2", + "ethers": "^5.0.17", + "mocha": "^7.1.2", + "ts-node": "^8.9.1", + "typescript": "^3.8.3" + } + } + +
    + +
    +tsconfig.json + + { + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": [ + "ES2018" + ], + "module": "CommonJS", + "moduleResolution": "node", + "outDir": "dist", + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ES2018" + } + } + +
    + +
    +.gitignore + + node_modules + build + +
    + +
    +.eslintrc.js + + module.exports = { + "env": { + "es6": true + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "sourceType": "module" + }, + "rules": { + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-member-accessibility": [ + "error", + { + "accessibility": "no-public", + "overrides": { + "parameterProperties": "off" + } + } + ], + "@typescript-eslint/indent": [ + "error", + 2, + { + "ArrayExpression": 1, + "CallExpression": { + "arguments": 1 + }, + "FunctionDeclaration": { + "body": 1, + "parameters": 1 + }, + "FunctionExpression": { + "body": 1, + "parameters": 1 + }, + "ImportDeclaration": 1, + "MemberExpression": 1, + "ObjectExpression": 1, + "SwitchCase": 1, + "VariableDeclarator": 1, + "flatTernaryExpressions": false, + "ignoreComments": false, + "outerIIFEBody": 1 + } + ], + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "multiline": { + "delimiter": "semi", + "requireLast": true + }, + "singleline": { + "delimiter": "semi", + "requireLast": false + } + } + ], + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "args": "none", + "ignoreRestSiblings": true, + "vars": "all" + } + ], + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-useless-constructor": "error", + "@typescript-eslint/no-var-requires": "warn", + "accessor-pairs": "error", + "array-bracket-spacing": [ + "error", + "never" + ], + "arrow-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "block-spacing": [ + "error", + "always" + ], + "brace-style": [ + "error", + "1tbs", + { + "allowSingleLine": true + } + ], + "camelcase": "off", + "comma-dangle": [ + "error", + { + "arrays": "never", + "exports": "never", + "functions": "never", + "imports": "never", + "objects": "never" + } + ], + "comma-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "comma-style": [ + "error", + "last" + ], + "computed-property-spacing": [ + "error", + "never" + ], + "constructor-super": "error", + "curly": [ + "error", + "multi-line" + ], + "dot-location": [ + "error", + "property" + ], + "eol-last": "error", + "eqeqeq": [ + "error", + "always", + { + "null": "ignore" + } + ], + "func-call-spacing": [ + "error", + "never" + ], + "generator-star-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "handle-callback-err": [ + "error", + "^(err|error)$" + ], + "import/default": "off", + "import/named": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": false + } + ], + "import/no-unresolved": "off", + "indent": "off", + "key-spacing": [ + "error", + { + "afterColon": true, + "beforeColon": false + } + ], + "keyword-spacing": [ + "error", + { + "after": true, + "before": true + } + ], + "linebreak-style": [ + "error", + "unix" + ], + "lines-between-class-members": [ + "error", + "always", + { + "exceptAfterSingleLine": true + } + ], + "max-len": [ + "error", + { + "code": 120 + } + ], + "new-cap": [ + "error", + { + "capIsNew": false, + "newIsCap": true + } + ], + "new-parens": "error", + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-caller": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "error", + "no-const-assign": "error", + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ], + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-args": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-boolean-cast": "error", + "no-extra-parens": [ + "error", + "functions" + ], + "no-fallthrough": "error", + "no-floating-decimal": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-implied-eval": "error", + "no-inner-declarations": [ + "error", + "functions" + ], + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-iterator": "error", + "no-label-var": "error", + "no-labels": [ + "error", + { + "allowLoop": false, + "allowSwitch": false + } + ], + "no-lone-blocks": "error", + "no-misleading-character-class": "error", + "no-mixed-operators": [ + "error", + { + "allowSamePrecedence": true, + "groups": [ + [ + "==", + "!=", + "===", + "!==", + ">", + ">=", + "<", + "<=" + ], + [ + "&&", + "||" + ], + [ + "in", + "instanceof" + ] + ] + } + ], + "no-mixed-spaces-and-tabs": "error", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": [ + "error", + { + "max": 1, + "maxEOF": 0 + } + ], + "no-negated-in-lhs": "error", + "no-new": "error", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-symbol": "error", + "no-new-wrappers": "error", + "no-obj-calls": "error", + "no-octal": "error", + "no-octal-escape": "error", + "no-path-concat": "error", + "no-proto": "error", + "no-prototype-builtins": "error", + "no-redeclare": [ + "error", + { + "builtinGlobals": false + } + ], + "no-regex-spaces": "error", + "no-return-assign": [ + "error", + "except-parens" + ], + "no-return-await": "error", + "no-self-assign": "error", + "no-self-compare": "error", + "no-sequences": "error", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-this-before-super": "error", + "no-throw-literal": "error", + "no-trailing-spaces": "error", + "no-unexpected-multiline": "error", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": [ + "error", + { + "defaultAssignment": false + } + ], + "no-unreachable": "error", + "no-unsafe-finally": "error", + "no-unsafe-negation": "error", + "no-use-before-define": [ + "error", + { + "classes": false, + "functions": false, + "variables": false + } + ], + "no-useless-call": "error", + "no-useless-catch": "error", + "no-useless-computed-key": "error", + "no-useless-escape": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-whitespace-before-property": "error", + "no-with": "error", + "object-curly-spacing": [ + "error", + "never" + ], + "object-property-newline": [ + "error", + { + "allowMultiplePropertiesPerLine": true + } + ], + "one-var": [ + "error", + { + "initialized": "never" + } + ], + "operator-linebreak": [ + "error", + "after", + { + "overrides": { + ":": "before", + "?": "before" + } + } + ], + "padded-blocks": [ + "error", + { + "blocks": "never", + "classes": "never", + "switches": "never" + } + ], + "prefer-const": [ + "error", + { + "destructuring": "all" + } + ], + "prefer-promise-reject-errors": "error", + "quote-props": [ + "error", + "as-needed" + ], + "quotes": [ + "error", + "single" + ], + "rest-spread-spacing": [ + "error", + "never" + ], + "semi": [ + "error", + "always" + ], + "semi-spacing": [ + "error", + { + "after": true, + "before": false + } + ], + "space-before-blocks": [ + "error", + "always" + ], + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } + ], + "space-in-parens": [ + "error", + "never" + ], + "space-infix-ops": "error", + "space-unary-ops": [ + "error", + { + "nonwords": false, + "words": true + } + ], + "spaced-comment": [ + "error", + "always", + { + "block": { + "balanced": true, + "exceptions": [ + "*" + ], + "markers": [ + "*package", + "!", + ",", + ":", + "::", + "flow-include" + ] + }, + "line": { + "markers": [ + "*package", + "!", + "/", + ",", + "=" + ] + } + } + ], + "symbol-description": "error", + "template-curly-spacing": [ + "error", + "never" + ], + "template-tag-spacing": [ + "error", + "never" + ], + "unicode-bom": [ + "error", + "never" + ], + "use-isnan": "error", + "valid-typeof": [ + "error", + { + "requireStringLiterals": true + } + ], + "wrap-iife": [ + "error", + "any", + { + "functionPrototypeMethods": true + } + ], + "yield-star-spacing": [ + "error", + "both" + ], + "yoda": [ + "error", + "never" + ] + }, + "overrides": [ + { + "files": [ + "test/**/*.ts" + ], + "rules": { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-var-requires": "off", + "no-unused-expressions": "off", + "prefer-promise-reject-errors": "off", + "import/no-extraneous-dependencies": [ + "error", + { + "devDependencies": true + } + ] + } + } + ] + } + +
    + +## Paso #1: Instala Waffle en tu proyecto [Link](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#installation) {#step-1-install-waffle-in-your-project} + +Para comenzar, instala `ethereum-waffle`. En este tutorial usaré `yarn`, para instalar `ethereum-waffle`: + +```bash + yarn add --dev ethereum-waffle +``` + +## Paso #2: Escribe un contrato inteligente [Link](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-a-contract) {#step-2-write-a-smart-contract} + +En este tutorial, usaré [ERC20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/ded2b0a55c9c13731963ab7b85a70c8e73504bab/contracts/token/ERC20/ERC20.sol) de [OpenZeppelin](https://openzeppelin.com). + +Por lo tanto, añade `OpenZeppelin` instalándolo con `yarn`: + +```bash + yarn add @openzeppelin/contracts -D +``` + +Luego crea el contrato `BasicToken.sol` en el directorio `src`: + +```solidity +pragma solidity ^0.6.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +// Example class - a mock class using delivering from ERC20 +contract BasicToken is ERC20 { + constructor(uint256 initialBalance) ERC20("Basic", "BSC") public { + _mint(msg.sender, initialBalance); + } +} + +``` + +## Paso #3: Compila tu contrato inteligente [Link](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#compiling-the-contract) {#step-3-compile-your-smart-contract} + +Para compilar tu contrato inteligente, agrega la siguiente entrada en el `package.json` de tu proyecto: + +```json +{ + "scripts": { + "build": "waffle" + } +} +``` + +También, agrega el archivo `waffle.json` en el directorio principal de tu proyecto. + +Un ejemplo de la configuración de `waffle.json`: + +```json +{ + "compilerType": "solcjs", + "compilerVersion": "0.6.2", + "sourceDirectory": "./src", + "outputDirectory": "./build" +} +``` + +Puedes leer más acerca de la configuración de Waffle [here](https://ethereum-waffle.readthedocs.io/en/latest/configuration.html#configuration). + +Luego ejecuta `yarn build` para compilar tu contrato inteligente. + +Deberías ver que Waffle ha compilado tu contrato y ha ubicado la salida JSON resultante dentro del directorio `build`. + +
    +BasicToken.json + + { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialBalance", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60806040523480156200001157600080fd5b506040516200153938038062001539833981810160405260208110156200003757600080fd5b81019080805190602001909291905050506040518060400160405280600581526020017f42617369630000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f42534300000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000cc92919062000389565b508060049080519060200190620000e592919062000389565b506012600560006101000a81548160ff021916908360ff16021790555050506200011633826200011d60201b60201c565b5062000438565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620001d560008383620002fb60201b60201c565b620001f1816002546200030060201b62000f2d1790919060201c565b6002819055506200024f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200030060201b62000f2d1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b505050565b6000808284019050838110156200037f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003cc57805160ff1916838001178555620003fd565b82800160010185558215620003fd579182015b82811115620003fc578251825591602001919060010190620003df565b5b5090506200040c919062000410565b5090565b6200043591905b808211156200043157600081600090555060010162000417565b5090565b90565b6110f180620004486000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461025f57806370a08231146102c557806395d89b411461031d578063a457c2d7146103a0578063a9059cbb14610406578063dd62ed3e1461046c576100a9565b806306fdde03146100ae578063095ea7b31461013157806318160ddd1461019757806323b872dd146101b5578063313ce5671461023b575b600080fd5b6100b66104e4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f65780820151818401526020810190506100db565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017d6004803603604081101561014757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610586565b604051808215151515815260200191505060405180910390f35b61019f6105a4565b6040518082815260200191505060405180910390f35b610221600480360360608110156101cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105ae565b604051808215151515815260200191505060405180910390f35b610243610687565b604051808260ff1660ff16815260200191505060405180910390f35b6102ab6004803603604081101561027557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069e565b604051808215151515815260200191505060405180910390f35b610307600480360360208110156102db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610751565b6040518082815260200191505060405180910390f35b610325610799565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036557808201518184015260208101905061034a565b50505050905090810190601f1680156103925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ec600480360360408110156103b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061083b565b604051808215151515815260200191505060405180910390f35b6104526004803603604081101561041c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610908565b604051808215151515815260200191505060405180910390f35b6104ce6004803603604081101561048257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610926565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561057c5780601f106105515761010080835404028352916020019161057c565b820191906000526020600020905b81548152906001019060200180831161055f57829003601f168201915b5050505050905090565b600061059a6105936109ad565b84846109b5565b6001905092915050565b6000600254905090565b60006105bb848484610bac565b61067c846105c76109ad565b6106778560405180606001604052806028815260200161102660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061062d6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006107476106ab6109ad565b8461074285600160006106bc6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6109b5565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b5050505050905090565b60006108fe6108486109ad565b846108f98560405180606001604052806025815260200161109760259139600160006108726109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b6001905092915050565b600061091c6109156109ad565b8484610bac565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806110736024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610fde6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061104e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610fbb6023913960400191505060405180910390fd5b610cc3838383610fb5565b610d2e81604051806060016040528060268152602001611000602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dc1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290610f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610edf578082015181840152602081019050610ec4565b50505050905090810190601f168015610f0c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015610fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122081c840f087cef92feccb03fadc678b2708c331896ec5432b5d4c675f27b6d3e664736f6c63430006020033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1539 CODESIZE SUB DUP1 PUSH3 0x1539 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4261736963000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4253430000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xCC SWAP3 SWAP2 SWAP1 PUSH3 0x389 JUMP JUMPDEST POP DUP1 PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xE5 SWAP3 SWAP2 SWAP1 PUSH3 0x389 JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x5 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP POP POP PUSH3 0x116 CALLER DUP3 PUSH3 0x11D PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST POP PUSH3 0x438 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH3 0x1C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH3 0x1D5 PUSH1 0x0 DUP4 DUP4 PUSH3 0x2FB PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH3 0x1F1 DUP2 PUSH1 0x2 SLOAD PUSH3 0x300 PUSH1 0x20 SHL PUSH3 0xF2D OR SWAP1 SWAP2 SWAP1 PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH3 0x24F DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH3 0x300 PUSH1 0x20 SHL PUSH3 0xF2D OR SWAP1 SWAP2 SWAP1 PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH3 0x37F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x3CC JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3FD JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3FD JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3FC JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x3DF JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x40C SWAP2 SWAP1 PUSH3 0x410 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x435 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x431 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x417 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x10F1 DUP1 PUSH3 0x448 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3A0 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x46C JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1B5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x23B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x4E4 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 0xF6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x123 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 PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x586 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x19F PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x221 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2AB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x69E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x307 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x751 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x325 PUSH2 0x799 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 0x365 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x34A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x392 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 PUSH2 0x3EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x83B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x452 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x41C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x908 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4CE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x926 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x57C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x551 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x57C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x55F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x59A PUSH2 0x593 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5BB DUP5 DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH2 0x67C DUP5 PUSH2 0x5C7 PUSH2 0x9AD JUMP JUMPDEST PUSH2 0x677 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1026 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x62D PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x747 PUSH2 0x6AB PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x742 DUP6 PUSH1 0x1 PUSH1 0x0 PUSH2 0x6BC PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x831 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x806 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x831 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x814 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8FE PUSH2 0x848 PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x8F9 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1097 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 PUSH2 0x872 PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x91C PUSH2 0x915 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA3B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1073 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xAC1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFDE PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xC32 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x104E PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xCB8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFBB PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCC3 DUP4 DUP4 DUP4 PUSH2 0xFB5 JUMP JUMPDEST PUSH2 0xD2E DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1000 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xDC1 DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 GT ISZERO DUP3 SWAP1 PUSH2 0xF1A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD 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 0xEDF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEC4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0C 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 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 SUB SWAP1 POP DUP1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0xFAB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST POP POP POP JUMP INVALID GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220746F20746865207A65726F2061 PUSH5 0x6472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH2 0x7070 PUSH19 0x6F766520746F20746865207A65726F20616464 PUSH19 0x65737345524332303A207472616E7366657220 PUSH2 0x6D6F PUSH22 0x6E7420657863656564732062616C616E636545524332 ADDRESS GASPRICE KECCAK256 PUSH21 0x72616E7366657220616D6F756E7420657863656564 PUSH20 0x20616C6C6F77616E636545524332303A20747261 PUSH15 0x736665722066726F6D20746865207A PUSH6 0x726F20616464 PUSH19 0x65737345524332303A20617070726F76652066 PUSH19 0x6F6D20746865207A65726F2061646472657373 GASLIMIT MSTORE NUMBER ORIGIN ADDRESS GASPRICE KECCAK256 PUSH5 0x6563726561 PUSH20 0x656420616C6C6F77616E63652062656C6F77207A PUSH6 0x726FA2646970 PUSH7 0x735822122081C8 BLOCKHASH CREATE DUP8 0xCE 0xF9 0x2F 0xEC 0xCB SUB STATICCALL 0xDC PUSH8 0x8B2708C331896EC5 NUMBER 0x2B 0x5D 0x4C PUSH8 0x5F27B6D3E664736F PUSH13 0x63430006020033000000000000 ", + "sourceMap": "142:152:5:-:0;;;177:115;8:9:-1;5:2;;;30:1;27;20:12;5:2;177:115:5;;;;;;;;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;177:115:5;;;;;;;;;;;;;;;;2013:141:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2093:4;2085:5;:12;;;;;;;;;;;;:::i;:::-;;2117:6;2107:7;:16;;;;;;;;;;;;:::i;:::-;;2145:2;2133:9;;:14;;;;;;;;;;;;;;;;;;2013:141;;252:33:5::1;258:10;270:14;252:5;;;:33;;:::i;:::-;177:115:::0;142:152;;7835:370:2;7937:1;7918:21;;:7;:21;;;;7910:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7986:49;8015:1;8019:7;8028:6;7986:20;;;:49;;:::i;:::-;8061:24;8078:6;8061:12;;:16;;;;;;:24;;;;:::i;:::-;8046:12;:39;;;;8116:30;8139:6;8116:9;:18;8126:7;8116:18;;;;;;;;;;;;;;;;:22;;;;;;:30;;;;:::i;:::-;8095:9;:18;8105:7;8095:18;;;;;;;;;;;;;;;:51;;;;8182:7;8161:37;;8178:1;8161:37;;;8191:6;8161:37;;;;;;;;;;;;;;;;;;7835:370;;:::o;10695:92::-;;;;:::o;874:176:1:-;932:7;951:9;967:1;963;:5;951:17;;991:1;986;:6;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;1035:8;;;874:176;;;;:::o;142:152:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;" + }, + "deployedBytecode": { + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461025f57806370a08231146102c557806395d89b411461031d578063a457c2d7146103a0578063a9059cbb14610406578063dd62ed3e1461046c576100a9565b806306fdde03146100ae578063095ea7b31461013157806318160ddd1461019757806323b872dd146101b5578063313ce5671461023b575b600080fd5b6100b66104e4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f65780820151818401526020810190506100db565b50505050905090810190601f1680156101235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61017d6004803603604081101561014757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610586565b604051808215151515815260200191505060405180910390f35b61019f6105a4565b6040518082815260200191505060405180910390f35b610221600480360360608110156101cb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105ae565b604051808215151515815260200191505060405180910390f35b610243610687565b604051808260ff1660ff16815260200191505060405180910390f35b6102ab6004803603604081101561027557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061069e565b604051808215151515815260200191505060405180910390f35b610307600480360360208110156102db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610751565b6040518082815260200191505060405180910390f35b610325610799565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036557808201518184015260208101905061034a565b50505050905090810190601f1680156103925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ec600480360360408110156103b657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061083b565b604051808215151515815260200191505060405180910390f35b6104526004803603604081101561041c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610908565b604051808215151515815260200191505060405180910390f35b6104ce6004803603604081101561048257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610926565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561057c5780601f106105515761010080835404028352916020019161057c565b820191906000526020600020905b81548152906001019060200180831161055f57829003601f168201915b5050505050905090565b600061059a6105936109ad565b84846109b5565b6001905092915050565b6000600254905090565b60006105bb848484610bac565b61067c846105c76109ad565b6106778560405180606001604052806028815260200161102660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061062d6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006107476106ab6109ad565b8461074285600160006106bc6109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6109b5565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b5050505050905090565b60006108fe6108486109ad565b846108f98560405180606001604052806025815260200161109760259139600160006108726109ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6109b5565b6001905092915050565b600061091c6109156109ad565b8484610bac565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806110736024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610fde6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061104e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610fbb6023913960400191505060405180910390fd5b610cc3838383610fb5565b610d2e81604051806060016040528060268152602001611000602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e6d9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dc1816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f2d90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290610f1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610edf578082015181840152602081019050610ec4565b50505050905090810190601f168015610f0c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015610fab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122081c840f087cef92feccb03fadc678b2708c331896ec5432b5d4c675f27b6d3e664736f6c63430006020033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x39509351 GT PUSH2 0x71 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x25F JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x3A0 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x406 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x46C JUMPI PUSH2 0xA9 JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x197 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1B5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x23B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xB6 PUSH2 0x4E4 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 0xF6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xDB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x123 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 PUSH2 0x17D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x147 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x586 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x19F PUSH2 0x5A4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x221 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5AE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x243 PUSH2 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x2AB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x69E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x307 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x751 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x325 PUSH2 0x799 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 0x365 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x34A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x392 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 PUSH2 0x3EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x3B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x83B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x452 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x41C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x908 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4CE PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x926 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x57C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x551 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x57C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x55F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x59A PUSH2 0x593 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x5BB DUP5 DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH2 0x67C DUP5 PUSH2 0x5C7 PUSH2 0x9AD JUMP JUMPDEST PUSH2 0x677 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1026 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x62D PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x747 PUSH2 0x6AB PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x742 DUP6 PUSH1 0x1 PUSH1 0x0 PUSH2 0x6BC PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x831 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x806 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x831 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x814 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8FE PUSH2 0x848 PUSH2 0x9AD JUMP JUMPDEST DUP5 PUSH2 0x8F9 DUP6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1097 PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x1 PUSH1 0x0 PUSH2 0x872 PUSH2 0x9AD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x9B5 JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x91C PUSH2 0x915 PUSH2 0x9AD JUMP JUMPDEST DUP5 DUP5 PUSH2 0xBAC JUMP JUMPDEST PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xA3B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1073 PUSH1 0x24 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xAC1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x22 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFDE PUSH1 0x22 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xC32 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x104E PUSH1 0x25 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xCB8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xFBB PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xCC3 DUP4 DUP4 DUP4 PUSH2 0xFB5 JUMP JUMPDEST PUSH2 0xD2E DUP2 PUSH1 0x40 MLOAD DUP1 PUSH1 0x60 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1000 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xE6D SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xDC1 DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0xF2D SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 DUP4 GT ISZERO DUP3 SWAP1 PUSH2 0xF1A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD 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 0xEDF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEC4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF0C 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 REVERT JUMPDEST POP PUSH1 0x0 DUP4 DUP6 SUB SWAP1 P + +
    + +## Paso #4: Compila tu contrato inteligente [Link](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) {#step-4-test-your-smart-contract} + +### Paso #4.1: Instala Waffle en tu proyecto [Link](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) {#step-4-1} + +Después de haber creado con éxito un Contrato Inteligente, podemos probarlo. Utilizaremos `Waffle` para hacerlo. + +Las pruebas en `Waffle` se escriben usando `Mocha` junto con `Chai`. Podemos usar un entorno de prueba diferente, pero los emparejadores `Waffle` solo funcionan con `Chai`. + +Por lo tanto, necesitamos añadir `Chai` a nuestras dependencias : + +```bash + yarn add --dev mocha chai +``` + +### Paso #4.2: Escribe un contrato inteligente de prueba [Link](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) {#step-4-2} + +Para escribir nuestra prueba necesitamos crear el archivo `BasicToken.test.ts` en nuestro directorio de pruebas. + +```ts +import { expect, use } from "chai" +import { Contract } from "ethers" +import { deployContract, MockProvider, solidity } from "ethereum-waffle" +import BasicToken from "../build/BasicToken.json" + +use(solidity) + +describe("BasicToken", () => { + const [wallet, walletTo] = new MockProvider().getWallets() + let token: Contract + + beforeEach(async () => { + token = await deployContract(wallet, BasicToken, [1000]) + }) +}) +``` + +Por lo tanto, utilizamos el método `deployContract` de `Waffle`para desplegar nuestro token. Como argumentos, debemos pasar `wallet`, el archivo json compilado de nuestro contrato y el balance por defecto. + +`Waffle` también nos permite crear una `wallet`, lo que hace muy sencillo desplegar un contrato. + +Puede leer más sobre `monedero` [aquí](https://ethereum-waffle.readthedocs.io/en/latest/basic-testing.html?highlight=wallet#getting-wallets) y puede leer más sobre la función de despliegue [aquí](https://ethereum-waffle.readthedocs.io/en/latest/basic-testing.html?highlight=wallet#deploying-contracts). + +Vamos a escribir una prueba simple para comprobar el balance de nuestra cartera. Desde que enviamos el valor 1000 durante el despliegue de nuestro contrato, el saldo de nuestra cartera debe ser de 1000 tokens, que podemos comprobar en la primera prueba. + +```ts +it("Assigns initial balance", async () => { + expect(await token.balanceOf(wallet.address)).to.equal(1000) +}) +``` + +Para ejecutar la prueba usa `yarn test` + +### Paso #4.3 Emisión de eventos [Enlace al documento](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html?highlight=changeBalance#emitting-events) {#step-4-3} + +En este tutorial, quiero mostrarte los emparejadores más útiles de `Waffle`, así que comencemos con el primero. + +`Waffle` nos permite probar qué eventos se emiten. + +En este tutorial, probaré el método `transfer` de nuestro contrato. + +En esta prueba, haré una transferencia de una cartera a otra y comprobaré si el evento de `transfer` fue llamado. + +```ts +it("Transfer emits event", async () => { + await expect(token.transfer(walletTo.address, 7)) + .to.emit(token, "Transfer") + .withArgs(wallet.address, walletTo.address, 7) +}) +``` + +Además, una gran ventaja de este emparejador es que podemos comprobar con qué argumentos se llamó este evento añadiendo `withArgs` a nuestra prueba. + +¡Esto nos permitirá estar seguros de que nuestra función se llama correctamente! + +### Paso #4.4 Revertir con mensaje [Enlace al documento](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html?highlight=changeBalance#revert-with-message) {#step-4-4} + +`Waffle` nos permite probar qué eventos se emiten. + +Utilizaremos `revertedWith` matcher en nuestra prueba para comprobarlo. + +Podemos escribir una prueba en la que realizaremos una transferencia por una cantidad mayor que la que tenemos en nuestra cartera. Y luego comprobaremos si la transacción se ha revertido con el mensaje exacto! + +```ts +it("Can not transfer above the amount", async () => { + await expect(token.transfer(walletTo.address, 1007)).to.be.revertedWith( + "VM Exception while processing transaction: revert ERC20: transfer amount exceeds balance" + ) +}) +``` + +### Paso #4.5 Cambiar token-balance [Enlace al documento](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html?highlight=changeBalance#change-balance) {#step-4-5} + +`¡Waffle` nos permite comprobar si hay cambios en los balances de las carteras! + +Podemos usar el comparador `changeTokenBalance` para verificar el cambio de balance o el `changeTokenBalances` para una cuenta múltiple. + +El emparejador puede aceptar `números`, `cadenas` y `números` como un cambio de balance. mientras que la dirección debe especificarse como una cartera o un contrato. + +Vamos a escribir la siguiente prueba: + +```ts +it("Send transaction changes receiver balance", async () => { + await expect(() => + wallet.sendTransaction({ to: walletTo.address, gasPrice: 0, value: 200 }) + ).to.changeBalance(walletTo, 200) +}) +``` + +Lo anterior es una prueba para una única cartera. + +Y el siguiente para múltiples carteras: + +```ts +it("Send transaction changes sender and receiver balances", async () => { + await expect(() => + wallet.sendTransaction({ to: walletTo.address, gasPrice: 0, value: 200 }) + ).to.changeBalances([wallet, walletTo], [-200, 200]) +}) +``` + +Se espera que la transacción se pase como callback (necesitamos comprobar el saldo antes de la llamada) o como una respuesta de la transacción. + +## Felicidades {#congratulations} + +**¡Felicidades! Lo has conseguido a través de mi tutorial. Has dado tu primer gran paso para probar contratos inteligentes con Waffle.** + +**Código de este tutorial que puedes encontrar [aquí](https://github.com/VladStarostenko/tutorial-for-ethereum-org-website).** + +**Más documentación sobre `Waffle` disponible [aquí](https://getwaffle.io).** diff --git a/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md b/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md new file mode 100644 index 00000000000..b5f98195750 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/the-graph-fixing-web3-data-querying/index.md @@ -0,0 +1,313 @@ +--- +title: "The Graph: Corrección de consultas de datos web3" +description: La cadena de bloques es como una base de datos pero sin SQL. Todos los datos están ahí, pero no hay forma de acceder a ellos. Déjeme mostrarle cómo solucionar este problema con The Graph y GraphQL. +author: Markus Waas +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "consultar" + - "The Graph" + - "crear-eth-app" + - "reaccionar" +skill: intermediate +published: 2020-09-06 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/thegraph +--- + +Esta vez ahondaremos un poco más en The Graph, que esencialmente se convirtió en la pila estándar para el desarrollo de dApps el pasado año. Veamos primero cómo haríamos las cosas de la manera tradicional... + +## Sin The Graph... {#without-the-graph} + +Vamos con un ejemplo simple para fines ilustrativos. A todos nos gustan los juegos, así que imagine un juego simple en el que los usuarios hacen apuestas: + +```solidity +pragma solidity 0.7.1; + +contract Game { + uint256 totalGamesPlayerWon = 0; + uint256 totalGamesPlayerLost = 0; + event BetPlaced(address player, uint256 value, bool hasWon); + + function placeBet() external payable { + bool hasWon = evaluateBetForPlayer(msg.sender); + + if (hasWon) { + (bool success, ) = msg.sender.call{ value: msg.value * 2 }(''); + require(success, "Transfer failed"); + totalGamesPlayerWon++; + } else { + totalGamesPlayerLost++; + } + + emit BetPlaced(msg.sender, msg.value, hasWon); + } +} +``` + +Digamos en en nuestra dApp queremos mostrar las apuestas totales, las victorias/derrotas totales y también actualizarlo si alguien juega de nuevo. El enfoque sería este: + +1. Obtener `totalGamesPlayerWon`. +2. Obtener `totalGamesPlayerLost`. +3. Suscribirse a eventos `BetPlaced`. + +Podemos escuchar el evento [en Web3](https://docs.web3js.org/api/web3/class/Contract#events) como se muestra a la derecha, pero esto requiere manejar algunos casos. + +```solidity +GameContract.events.BetPlaced({ + fromBlock: 0 +}, function(error, event) { console.log(event); }) +.on('data', function(event) { + // event fired +}) +.on('changed', function(event) { + // event was removed again +}) +.on('error', function(error, receipt) { + // tx rejected +}); +``` + +Ahora bien, esto sigue estando bien para nuestro sencillo ejemplo. Pero digamos que ahora queremos mostrar las cantidades de partidas ganadas o perdidas solo para el jugador actual. Bueno, no tenemos suerte; sería mejor implementar un nuevo contrato que almacene esos valores y permita recuperarlos. Ahora imagine un contrato inteligente y una dapp mucho más complicados; las cosas se pueden descontrolar rápidamente. + +![Uno no consulta simplemente](./one-does-not-simply-query.jpg) + +Se puede ver que esto no es lo más adecuado: + +- No funciona para contratos ya implementados. +- Genera costos de gas extra para almacenar dichos valores. +- Se requiere otra invocación para recuperar los datos para un nodo de Ethereum. + +![Eso no es lo suficientemente bueno](./not-good-enough.jpg) + +Veamos ahora una mejor solución. + +## Déjeme presentarle GraphQL {#let-me-introduce-to-you-graphql} + +Primero hablemos de GraphQL, que fue originalmente desarrollado e implementado por Facobook. Puede que esté familiarizado con el tradicional modelo de API tipo Rest. Ahora, imagine que pudiera escribir la consulta para los datos que le interesen exactamente: + +![API de GraphQL vs. API tipo REST](./graphql.jpg) + + + +Las dos imágenes representan en términos generales la esencia de GraphQL. Con la consulta de la derecha podemos definir exactamente qué datos queremos, así que ahí recibimos todo en una única solicitud y nada más que exactamente lo que necesitamos. Un servidor de GraphQL maneja la obtención de todos los datos requeridos, por lo que es increíblemente fácil de usar desde el lado del consumidor del frontend. [Esta es una buena explicación](https://www.apollographql.com/blog/graphql-explained-5844742f195e/) de cómo exactamente el servidor gestiona una consulta si usted está interesado. + +Ahora, con ese conocimiento, vayamos finalmente al campo de la cadena de bloques y The Graph. + +## ¿Qué es The Graph? {#what-is-the-graph} + +Una cadena de bloques es una base de datos descentralizada, pero, a diferencia de lo habitual, no tenemos un lenguaje de consulta para esta base de datos. Las soluciones para recuperar datos son complejas o completamente imposibles. The Graph es un protocolo descentralizado destinado a indexar y consultar datos de la cadena de bloques. Y puede que haya adivinado: es usar GraphQL como lenguaje de consulta. + +![The Graph](./thegraph.png) + +Los ejemplos son siempre la mejor manera de entender algo, así que utilicemos The Graph para nuestro ejemplo de GameContract. + +## Cómo crear un subgraph {#how-to-create-a-subgraph} + +La definición de cómo indexar datos se denomina subgraph. Requiere tres componentes: + +1. Manifiesto (`subgraph.yaml`) +2. Esquema (`schema.graphql`) +3. Mapeo (`mapping.ts`) + +### Manifiesto (`subgraph.yaml`) {#manifest} + +El manifiesto es nuestro archivo de configuración y define: + +- qué contratos inteligentes se deben indexar (dirección, red, ABI...) +- a qué eventos se debe escuchar +- otros aspectos a escuchar, como llamadas a funciones o bloques +- las funciones de mapeo invocadas (ver `mapping.ts` abajo) + +Puede definir múltiples contratos y manejadores (handlers) aquí. Una configuración típica tendría una carpeta de subgraphs dentro del proyecto Truffle/Hardhat con su propio repositorio. Luego puede referenciar fácilmente el ABI. + +Por razones de conveniencia también puede querer usar una herramienta de plantillas como mustache. Luego creará un `subgraph.template.yaml` e insertará las direcciones con base en las últimas implementaciones. Para una configuración de ejemplo más avanzada, vea por ejemplo el [repositorio de subgraphs de Aave](https://github.com/aave/aave-protocol/tree/master/thegraph). + +La documentación completa se puede obtener [aquí](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest). + +```yaml +specVersion: 0.0.1 +description: Placing Bets on Ethereum +repository: - GitHub link - +schema: + file: ./schema.graphql +dataSources: + - kind: ethereum/contract + name: GameContract + network: mainnet + source: + address: '0x2E6454...cf77eC' + abi: GameContract + startBlock: 6175244 + mapping: + kind: ethereum/events + apiVersion: 0.0.1 + language: wasm/assemblyscript + entities: + - GameContract + abis: + - name: GameContract + file: ../build/contracts/GameContract.json + eventHandlers: + - event: PlacedBet(address,uint256,bool) + handler: handleNewBet + file: ./src/mapping.ts +``` + +### Esquema (`schema.graphql`) {#schema} + +El esquema es la definición de datos de GraphQL. Le permitirá definir qué entidades existen y sus tipos. Los tipos admitidos de The Graph son: + +- Bytes +- ID +- String +- Boolean +- Int +- BigInt +- BigDecimal + +También puede utilizar entidades como tipo para definir relaciones. En nuestro ejemplo definimos una relación de uno a muchos del jugador a las apuestas. El ! significa que el valor no puede estar vacío. La documentación completa se puede consultar [aquí](https://thegraph.com/docs/en/developing/creating-a-subgraph/#the-subgraph-manifest). + +```graphql +type Bet @entity { + id: ID! + player: Player! + playerHasWon: Boolean! + time: Int! +} + +type Player @entity { + id: ID! + totalPlayedCount: Int + hasWonCount: Int + hasLostCount: Int + bets: [Bet]! +} +``` + +### Mapeo (`mapping.ts`) {#mapping} + +El archivo de mapeo de The Graph define nuestras funciones que transforman los eventos entrantes en entidades. Está escrito en AssemblblyScript, un subconjunto de Typescript. Esto significa que puede ser compilado en WASM (WebAssembly) para una ejecución más eficiente y portátil del mapeo. + +Tendrá que definir cada función mencionada en el archivo `subgraph.yaml`, así que en nuestro caso necesitamos solo una: `handleNewBet`. Primero tratamos de cargar la entidad Player desde la dirección del remitente como id. Si no existe, crearemos una nueva entidad y la llenaremos con valores iniciales. + +Luego creamos una nueva entidad Bet. El id para esto será `event.transaction.hash.toHex() + "-" + event.logIndex.toString()`, garantizando siempre un valor único. Usar solo el hash no es suficiente, ya que alguien podría estar llamando a la función placeBet varias veces en una transacción a través de un contrato inteligente. + +Por último, podemos actualizar la entidad Player con todos los datos. Los arrays no pueden empujarse directamente, sino que necesitan ser actualizados como se muestra aquí. Utilizamos el id para referenciar la apuesta. `.save()` es necesario al final para almacenar una entidad. + +La documentación completa puede obtenerse aquí: https://thegraph.com/docs/en/developing/creating-a-subgraph/#writing-mappings. También puede añadir salida de registro al archivo de mapeo; consulte [aquí](https://thegraph.com/docs/assemblyscript-api#api-reference). + +```typescript +import { Bet, Player } from "../generated/schema" +import { PlacedBet } from "../generated/GameContract/GameContract" + +export function handleNewBet(event: PlacedBet): void { + let player = Player.load(event.transaction.from.toHex()) + + if (player == null) { + // create if doesn't exist yet + player = new Player(event.transaction.from.toHex()) + player.bets = new Array(0) + player.totalPlayedCount = 0 + player.hasWonCount = 0 + player.hasLostCount = 0 + } + + let bet = new Bet( + event.transaction.hash.toHex() + "-" + event.logIndex.toString() + ) + bet.player = player.id + bet.playerHasWon = event.params.hasWon + bet.time = event.block.timestamp + bet.save() + + player.totalPlayedCount++ + if (event.params.hasWon) { + player.hasWonCount++ + } else { + player.hasLostCount++ + } + + // update array like this + let bets = player.bets + bets.push(bet.id) + player.bets = bets + + player.save() +} +``` + +## Uso en el frontend {#using-it-in-the-frontend} + +Usando algo como Apollo Boost, puede integrar de forma sencilla The Graph en su dapp de React (o Apollo-Vue). Especialmente al usar hooks de React y Apollo, la obtención de datos es muy simple: solo requiere escribir una única consulta de GraphQl en su componente. Una configuración típica podría ser la siguiente: + +```javascript +// See all subgraphs: https://thegraph.com/explorer/ +const client = new ApolloClient({ + uri: "{{ subgraphUrl }}", +}) + +ReactDOM.render( + + + , + document.getElementById("root") +) +``` + +Y ahora podemos escribir por ejemplo una consulta como esta. Esto nos va a traer como resultado + +- cuántas veces ganó el usuario actual +- cuántas veces perdió el usuario actual +- una lista de marcas de tiempo con todas sus apuestas anteriores + +Todo en una sola solicitud al servidor de GraphQL. + +```javascript +const myGraphQlQuery = gql` + players(where: { id: $currentUser }) { + totalPlayedCount + hasWonCount + hasLostCount + bets { + time + } + } +` + +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +![Magia](./magic.jpg) + +Pero nos estaría faltando una última pieza del rompecabezas y es el servidor. Puede ejecutarlo usted mismo o usar el servicio alojado. + +## El servidor de The Graph {#the-graph-server} + +### Graph Explorer, el servicio alojado {#graph-explorer-the-hosted-service} + +La forma más fácil es utilizar el servicio alojado. Siga las instrucciones que figuran [aquí](https://thegraph.com/docs/en/deploying/deploying-a-subgraph-to-hosted/) para implementar un subgraph. Para muchos proyectos puede encontrar subgraphs existentes en el [explorador](https://thegraph.com/explorer/). + +![The Graph Explorer](./thegraph-explorer.png) + +### Correr tu propio nodo {#running-your-own-node} + +Alternativemente, puede ejecutar su propio nodo. Consulte la documentación [aquí](https://github.com/graphprotocol/graph-node#quick-start). Una razón para hacer esto podría ser usar una red no admitida por el servicio alojado. Las redes actualmente admitidas se [pueden encontrar aquí](https://thegraph.com/docs/en/developing/supported-networks/). + +## El futuro descentralizado {#the-decentralized-future} + +GraphQL también soporta streams para eventos entrantes nuevos. Estos son admitidos en The Graph a través de [substreams](https://thegraph.com/docs/en/substreams/) que actualmente están en versión beta abierta. + +En [2021](https://thegraph.com/blog/mainnet-migration/), The Graph inició su transición a una red descentralizada de indexación. Puede leer más sobre la arquitectura de esta red descentralizada de indexación [aquí](https://thegraph.com/docs/en/network/explorer/). + +Dos aspectos clave son: + +1. Los usuarios pagan a los indexadores por las consultas. +2. Los indexadores apuestan Graph Tokens (GRT). diff --git a/public/content/translations/es/developers/tutorials/token-integration-checklist/index.md b/public/content/translations/es/developers/tutorials/token-integration-checklist/index.md new file mode 100644 index 00000000000..09255d44e09 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/token-integration-checklist/index.md @@ -0,0 +1,84 @@ +--- +title: Lista de verificación de integración de tokens +description: Una lista de verificación de cosas a considerar cuando interactuamos con tokens +author: "Trailofbits" +lang: es +tags: + - "solidity" + - "contratos Inteligentes" + - "seguridades" + - "tókenes" +skill: intermediate +published: 2020-08-13 +source: Desarrollando smart contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/token_integration.md +--- + +Siga esta lista de verificación al interactuar con tokens arbitrarios. Asegúrese de comprender los riesgos asociados con cada elemento y de justificar cualquier excepción a estas reglas. + +Por conveniencia, todas las Slither [utilities](https://github.com/crytic/slither#tools) pueden correr directamente en una dirección de Token, como: + +[Usa el tutorial de Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) + +```bash +slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken +``` + +Para continuar siguiendo esta lista, tienes que tener esta producción desde Slither para token: + +```bash +- slither-check-erc [target] [contractName] [optional: --erc ERC_NUMBER] +- slither [target] --print human-summary +- slither [target] --print contract-summary +- slither-prop . --contract ContractName # requires configuration, and use of Echidna and Manticore +``` + +## Consideraciones generales {#general-considerations} + +- **El contrato tiene una revisión de seguridad.** Evite interactuar con contratos que carezcan de revisión de seguridad. Chequee el largo del asesoramiento (alias "nivel de esfuerzo"), la reputación de la firma de seguridad, y el número y la gravedad de los hallazgos. +- **Usted ha contactado a los desarrolladores.**Usted tiene que alertar al equipo de un incidente. Busque los contactos apropiados en [ blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts). +- **Tienen una lista de correo de seguridad para anuncios importantes.** El equipo debe avisar a los usuarios (¡como tú!) cuando cuestiones críticas son encontradas o cuando suceda una actualización. + +## Conformidad de ERC {#erc-conformity} + +Slither incluye una utilidad, [slither-check-erc](https://github.com/crytic/slither/wiki/ERC-Conformance), esa revisión busca la conformancia de una token en base a los estándares ERC. Utilice slither-check-erc para revisar eso: + +- ** Transfer y transferFrom devuelven un booleano.** Varios tokens no devuelven un booleano en estas funciones. Como resultado, sus llamadas en el contrato pueden fallar. +- **Las funciones de nombre, decimales y signos aparecen si se utilizan.** Estas funciones son opcionales en el standard ERC20 y podrían no estar presentes. +- **Los decimales dan como resultado un uint8.** Varios tokens incorrectos devuelven un uint256. Si este es el caso, asegúrese de que el valor devuelto es inferior a 255. +- **El token mitiga lo conocido [condición de carrera ERC20](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729).** El estándar tiene una condición conocida como carrera ERC20 que debe ser mitigada para prevenir que atacantes se roben tokens. +- **El token no es un token ERC777 y no tiene ninguna llamada de función externa en transferencia y transferFrom.** Las llamadas externas en las funciones de transferencia pueden llevar a reentradas. + +Slither incluye una utilidad, [slither-prop](https://github.com/crytic/slither/wiki/Property-generation), que genera pruebas individuales y propiedades de seguridad que pueden descubrir muchas fallas comunes de ERC. Usa slither-prop para revisar que: + +- **El contrato ha superado todas las pruebas individuales y las características de seguridad de slither-prop.** Ejecuta las pruebas individuales generadas, después revisa las características con [Echidna](https://github.com/crytic/echidna) y [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html). + +Por último, hay ciertas características que son difíciles de identificar automáticamente. Revisión de estas condiciones a mano: + +- **Transfer y transferFrom no deben cobrar.** Los token deflacionarios pueden llevar a un comportamiento inesperado. +- **Se tiene en cuenta el interés potencial obtenido con el token.** Algunos tokens distribuyen interés a los portadores de token. Este interés podría quedar atrapado en el contrato si no se tiene en cuenta. + +## Composición de contrato {#contract-composition} + +- **El contrato evita complejidad innecesaria.** El token debe ser un contrato simple; un token con código complejo requiere un estándar mas alto de revisión. Usa [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#human-summary) de Slither para identificar código complejo. +- **El contrato utiliza SafeMath.** Los contratos que no utilicen SafeMath requieren un estándar mas alto de revisión. Inspecciona el contrato a mano para el uso de SafeMath. +- **El contrato solo tiene pocas funciones no relacionada con tokens.** Las funciones no relacionadas a tokens aumentan la posibilidad de algún problema en el contrato. Usa [contract-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither para examinar mas ampliamente el código usado en un contrato. +- **Un token posee solo una dirección.** Los tokens con puntos de entrada múltiples para actualizaciones del balance pueden romper la contaduría interna basada en la dirección (ej: `balances[token_address][msg.sender]` podría no reflejar el balance actual). + +## Privilegios de propietario {#owner-privileges} + +- **El token no se puede actualizar.** Los contratos actualizables pueden cambiar sus reglas con el tiempo. Usa [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither para determinar si el contrato es actualizable. +- **El dueño tiene capacidades limitadas de mintear información.** Dueños con intenciones maliciosas o comprometidas pueden abusar de su capacidad de mintear. Usa [human-summary printer](https://github.com/crytic/slither/wiki/Printer-documentation#contract-summary) de Slither para revisar la capacidad de minteo y considera revisar manualmente el código. +- **El Token no puede ser pausado.** Los dueños con intenciones maliciosas o comprometidas pueden atrapar contratos que dependen de tokens pausables. Identifique el código pausable a mano. +- **El dueño no puede poner en la lista negra al contrato.** Los dueños maliciosos o comprometidos pueden atrapar contratos que dependen de tokens en la lista negra. Identifique características de lista negra a mano. +- **El equipo detrás del token es reconocido y puede ser responsabilizado por abuso.** Los contratos con equipos de desarrollo anónimo, o que residan en refugios legales requieren un estándar mas alto de revisión. + +## Escasez de tokens {#token-scarcity} + +Las revisiones de problemas de escasez de tokens requieren una revisión manual. Comprueba si hay estas condiciones: + +- **Ningún usuario posee la mayor parte del suministro.** Si unos pocos usuarios poseen la mayoría de los tokens, pueden influir en las operaciones en función de la repartición del token. +- **El suministro total es suficiente.** Los tokens con un suministro total bajo pueden ser manipuladas fácilmente. +- **Los tokens se encuentran en más que algunos pocos exchanges.** Si todos los tokens están en un solo exchange, la vulneración del exchange puede comprometer el contrato asociado al token. +- **Los usuarios comprenden los riesgos asociados a fondos grandes o préstamos flash.** Los contratos que dependen del saldo de token deben tomar en consideración a atacantes con grandes fondos o ataques a través de préstamos flash. +- **El token no permite minteos flash**. Los minteos flash pueden provocar oscilaciones sustanciales en el saldo y el suministro total, que requieren un control estricto y exhaustivo del desbordamiento en el funcionamiento del token. diff --git a/public/content/translations/es/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md b/public/content/translations/es/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md index 1e106070236..c4b971b77ea 100644 --- a/public/content/translations/es/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md +++ b/public/content/translations/es/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/index.md @@ -1,12 +1,11 @@ --- title: Transferencias y aprobación de tókenes ERC-20 desde un contrato inteligente en Solidity -description: Cómo usar un contrato inteligente para interactuar con un token a través del lenguaje Solidity. +description: Cómo utilizar un contrato inteligente para interactuar con un token usando el lenguaje Solidity author: "jdourlens" tags: - - "smart contracts" - - "tókenes" + - "contratos inteligentes" + - "tokens" - "solidity" - - "Empezar" - "erc-20" skill: intermediate lang: es @@ -18,7 +17,7 @@ address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" En el tutorial anterior, se estudió [la anatomía de un token ERC-20 en Solidity](/developers/tutorials/understand-the-erc-20-token-smart-contract/) sobre la cadena de bloques de Ethereum. En este artículo veremos cómo usar un contrato inteligente para la interacción con un token, usando el lenguaje de programación Solidity. -Para el contrato inteligente, se crea un intercambio descentralizado de prueba en donde un usuario puede operar con Ethereum en el recién implementado [token ERC](/developers/docs/standards/tokens/erc-20/). +Para este contrato inteligente, crearemos un exchange descentralizado realmente falso donde un usuario pueda intercambiar ether por nuestro recientemente implementado [token ERC-20](/developers/docs/standards/tokens/erc-20/). Para este tutorial usaremos el código que escribimos en el tutorial anterior como punto de partida. El DEX representará una instancia del contrato en su constructor y perfeccionará las operaciones de: @@ -95,7 +94,7 @@ contract ERC20Basic is IERC20 { require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner]-numTokens; - allowed[owner][msg.sender] = allowed[owner][msg.sender]+numTokens; + allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens; balances[buyer] = balances[buyer]+numTokens; emit Transfer(owner, buyer, numTokens); return true; @@ -197,7 +196,7 @@ function sell(uint256 amount) public { } ``` -Si todo funciona correctamente, se deberían ver 2 eventos ( `Transfer` [transferencia] y `Sold` [vendido]) en la transacción y el saldo de tókenes y balance de Ethereum actualizados. +Si todo funciona, debería ver 2 eventos (un `Transfer` y `Sold`) en la transacción, además de su saldo de tokens y saldo de ether actualizados. ![Dos eventos en la transacción: transferencia y vender](./transfer-and-sold-events.png) @@ -277,7 +276,7 @@ contract ERC20Basic is IERC20 { require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner]-numTokens; - allowed[owner][msg.sender] = allowed[owner][msg.sender]+numTokens; + allowed[owner][msg.sender] = allowed[owner][msg.sender]-numTokens; balances[buyer] = balances[buyer]+numTokens; emit Transfer(owner, buyer, numTokens); return true; diff --git a/public/content/translations/es/developers/tutorials/using-websockets/index.md b/public/content/translations/es/developers/tutorials/using-websockets/index.md new file mode 100644 index 00000000000..dd19b2701ec --- /dev/null +++ b/public/content/translations/es/developers/tutorials/using-websockets/index.md @@ -0,0 +1,249 @@ +--- +title: Uso de WebSockets +description: Guía de uso de WebSocets y Alchemy para hacer solicitudes JSON-RPC y suscribirse a eventos. +author: "Elan Halpern" +lang: es +tags: + - "Alchemy" + - "websockets" + - "consulta" + - "JavaScript" +skill: beginner +source: Documentos de Alquimia +sourceUrl: https://docs.alchemyapi.io/guides/using-websockets +published: 2020-12-01 +--- + +Esta es una guía de nivel básico sobre el uso de WebSockets y Alchemy para hacer solicitudes a la cadena de bloques de Ethereum. + +## WebSockets Vs. HTTP {#websockets-vs-http} + +A diferencia de HTTP, con WebSockets no necesita hacer solicitudes continuamente cuando quiere información específica. Los WebSockets mantienen una red de conexión para usted (si se hace correctamente) y escuchan para hacer cambios. + +Como con cualquier conexión de red, no debe asumir que un WebSocket permanecerá abierto para siempre sin interrupción, pero el manejo correcto de las conexiones caídas y la reconexión a mano puede ser complicado. Otra desventaja de los WebSockets es que no se obtienen códigos de estado HTTP en la respuesta, sino solo el mensaje de error. + +​[Alchemy Web3](https://docs.alchemy.com/reference/api-overview) automáticamente agrega manejo para fallas y reintentos de WebSocket sin necesidad de configuración. + +## Pruébelo {#try-it-out} + +La forma más fácil de probar WebSockets es instalar una herramienta de línea de comando para hacer soliciudes WebSocket como [wscat](https://github.com/websockets/wscat). Usando Wsact, puede enviar solicitudes así: + +_Nota: Si tiene una cuenta de Alchemy, puede reemplazar `demo` con su propia clave de API. [Regístrese para obtener una cuenta gratuita de Alchemy aquí](https://auth.alchemyapi.io/signup)._ + +``` +wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo + +> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"} + +< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0} + +``` + +## Cómo usar WebSockets {#how-to-use-websockets} + +Para comenzar, abra un WebSocket usando la URL de WebSocket para su aplicación. Puede encontrar la URL de WebSocket de su aplicación abriendo la página de la aplicación en [su panel de control](https://dashboard.alchemyapi.io/) y haciendo clic en "View Key". Tenga en cuenta que la URL de su aplicación para WebSockets es diferente de su URL para solicitudes HTTP, pero ambas se pueden ver haciendo clic en "View Key". + +![Dónde puede encontrar la URL de WebSocket en su panel de control de Alchemy](./use-websockets.gif) + +Puede usar cualquiera de las API listadas en la [Referencia de API de Alchemy](https://docs.alchemyapi.io/documentation/alchemy-api-reference/) a través de WebSocket. Para ello, utilice la misma carga útil que se enviaría como el cuerpo de una solicitud HTTP POST, pero en su lugar envíe esa carga a través del WebSocket. + +## Con Web3 {#with-web3} + +Traspasar a WebSockts mientras se usa una biblioteca cliente como Web3 es simple. Simplemente pase la URL de WebSocket en lugar de la URL HTTP cuando instancie a su cliente Web3. Por ejemplo: + +```js +const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key") + +web3.eth.getBlockNumber().then(console.log) // -> 7946893 +``` + +## Subscripción API {#subscription-api} + +Cuando se conecta a través de un WebSocket, puede utilizar dos métodos adicionales: `eth_subscribe` y `eth_unsubscribe`. Estos métodos le permitirán escuchar eventos particulares y será notificado inmediatamente. + +### `eth_subscribe` {#eth-subscribe} + +Crea una nueva subscripción para eventos específicos. [ Más información acerca de `eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe). + +#### Parámetros {#parameters} + +1. Tipos de subscripción +2. Parámetros opcionales + +El primer argumento específica el tipo de evento el cuál se escucha. El segundo argumento contiene opciones adicionales las cuales dependen del primer argumento. Las diferentes de tipos de descripciones, sus opciones y sus cargas útiles se describen a continuación. + +#### Regresa {#returns} + +El ID de subscripción: Este ID se adjuntará a cualquier evento, y también será usado para cancelar la subscripción usando `eth_unsubscribe`. + +#### Eventos de suscripción {#subscription-events} + +Mientras la subscripción este activa, recibirá eventos los cuales son objetos en los siguientes campos: + +- `jsonrpc`: Always "2.0" +- `method`: Always "eth_subscription" +- `parámetro`: Un objeto con los siguientes campos: + - `subscription`: El ID de suscripción devuelto por la llamada `eth_subscription` que creó esta suscripción. + - `result`: Un objeto el cuál varia dependiendo del tipo de subscripción. + +#### Tipos de subceipciones {#subscription-types} + +1. `alchemy_newFullPendingTransactions` + +Devuelve la información de transacción para todas las transacciones que se agregan al estado pendiente. Este tipo de suscripción se suscribe a transacciones pendientes, similares a la llamada web 3 estándar `web3.eth. ubscribe("pendingTransactions")`, pero difiere en que emite _información completa de la transacción_ en lugar de solo el hash de la transacción. + +Ejemplo: + +```json +> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]} + +< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"} +< { + "jsonrpc":"2.0", + "method":"eth_subscription", + "params":{ + "result":{ + "blockHash":null, + "blockNumber":null, + "from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f", + "gas":"0x1adb0", + "gasPrice":"0x7735c4d40", + "hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf", +"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000", + "nonce":"0x0", + "to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40", + "transactionIndex":null, + "value":"0x0", + "v":"0x26", + "r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b", + "s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"}, + "subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8" + } + } + +``` + +2. `nuevas Cabezas` + +Emite un evento en cualquier momento en que se añade un nuevo encabezado a la cadena, incluyendo durante una reorganización en cadena. + +Cuando se produce una reorganización en cadena, esta suscripción emitirá un evento que contiene todas las nuevas cabeceras de la nueva cadena. En particular, esto significa que puede ver múltiples cabeceras emitidas con la misma altura, y cuando esto suceda, la cabecera posterior debe ser tomada como la correcta después de una reorganización. + +Ejemplo: + +```json +> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]} + +< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"} +< { + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "result": { + "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773", + "gasLimit": "0x47e7c4", + "gasUsed": "0x38658", + "logsBloom": +"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x084149998194cc5f", + "number": "0x1348c9", + "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701", + "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378", + "timestamp": "0x56ffeff8", + "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f" + }, + "subscription": "0x9ce59a13059e417087c02d3236a0b1cc" + } +} + +``` + +3. `registros` + +Emite registros los cuales son parte de bloques recién agregados que coinciden con los filtros de criterio. + +Cuando se produce una reorganización en cadena, los registros que son parte de los bloques de la cadena antigua se emitirán de nuevo con la propiedad `eliminada` establecida en `verdadero`. Además, se emiten registros que son parte de los bloques de la nueva cadena, lo que significa que es posible ver registros para la misma transacción varias veces en el caso de una reorganización. + +Parámetros + +1. Un objeto con los siguientes campos: + - `dirección` (opcional): una cadena que representa una dirección o una formación de dichas cadenas. + - Sólo se emitirán registros creados a partir de una de estas direcciones. + - `topics`: una formación de especificadores de temas. + - Cada especificador de tema es `null`, una cadena que representa un tema, o una formación de cadenas. + - Cada posición en la formación que no es `null` restringe los registros emitidos a solo aquellos que tienen uno de los temas dados en esa posición. + +Algunos ejemplos de especificaciones de temas: + +- `[]`: Cualquier tema permitido. +- `[A]`: A en una primera posición (y cualquier cosa después). +- `[null, B]`: Cualquier cosa en la primera posición y B en la segunda posición (y cualquier cosa después). +- `[A, B]`: A en la primera posición y B en segunda posición (y cualquier cosa después). +- `[[A, B], [A, B]]`: (A o B) en primer posición y (A o B) en segunda posición ( y cualquier cosa después). + +Ejemplo: + +```json +> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]} + +< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"} +< { + "jsonrpc": "2.0", + "method": "eth_subscription", + "params": { + "subscription": "0x4a8a4c0517381924f9838102c5a4dcb7", + "result": { + "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", + "blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04", + "blockNumber": "0x29e87", + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003", + "logIndex":"0x0", + "topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"], + "transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4", + "transactionIndex": "0x0" + } + } +} + +``` + +### `eth_unsubscribe` {#eth-unsubscribe} + +Cancela una suscripción existente para que no se envíen más eventos. + +Parámetros + +1. ID de suscripción, como se devuelve previamente desde una llamada a `eth_subscribe`. + +Regresa + +`verdadero` si una suscripción fue cancelada con éxito, o `falso` si no existe ninguna suscripción con el ID dado. + +Ejemplo: + +**Solicitud** + +``` +curl https://eth-mainnet.alchemyapi.io/v2/your-api-key +-X POST +-H "Content-Type: application/json" +-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}' + + +``` + +**Resultado** + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +--- + +[Regístrese con Alchemy](https://auth.alchemyapi.io/signup) gratis, vea [nuestra documentación](https://docs.alchemyapi.io/), y para las últimas noticias, síganos en [Twitter](https://twitter.com/AlchemyPlatform). diff --git a/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md new file mode 100644 index 00000000000..5a02a57cd90 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -0,0 +1,298 @@ +--- +title: "Waffle: Llamadas dinámicas de simulación y prueba de contratos" +description: Tutorial avanzado de Waffle para el uso de simulaciones dinámicas y pruebas de llamadas a contratos +author: "Daniel Izdebski" +tags: + - "waffle" + - "contratos inteligentes" + - "solidity" + - "pruebas" + - "simular" +skill: intermediate +lang: es +published: 2020-11-14 +--- + +## ¿De qué trata este tutorial? {#what-is-this-tutorial-about} + +En este tutorial aprenderás como: + +- utilizar simulación dinámica +- comprobar las interacciones entre contratos inteligentes + +Supuestos: + +- ya sabes como escribir un contrato inteligente simple en `Solidity` +- ya sabes utilizar `JavaScript` y `TypeScript` +- ya has hecho otrod tutoriales de `Waffle` o sabes algunas cosas sobre él + +## Simulación dinámica {#dynamic-mocking} + +¿Por qué es útil la simulación dinámica? Bueno, porque nos permite escribir pruebas unitarias en lugar de pruebas de integración. ¿Y eso, qué significa? Significa que no tenemos que preocuparnos por las dependencias de los contratos inteligentes, por lo que podremos probarlos de forma aislada. Déjame mostrarte cómo puedes hacerlo. + +### **1. Proyecto** {#1-project} + +Antes de comenzar debemos preparar un proyecto simple node.js: + +```bash +mkdir dynamic-mocking +cd dynamic-mocking +mkdir contracts src + +yarn init +# or if you're using npm +npm init +``` + +Comencemos agregando dependencias de typescript y prueba - mocha & chai: + +```bash +yarn add --dev @types/chai @types/mocha chai mocha ts-node typescript +# or if you're using npm +npm install @types/chai @types/mocha chai mocha ts-node typescript --save-dev +``` + +Ahora agreguemos `Waffle` y `ethers`: + +```bash +yarn add --dev ethereum-waffle ethers +# or if you're using npm +npm install ethereum-waffle ethers --save-dev +``` + +La estructura de tu proyecto debería verse así: + +``` +. +├── contracts +├── package.json +└── test +``` + +### **2. Contrato inteligente** {#2-smart-contract} + +Para comenzar una simulación dinámica, necesitamos un contrato inteligente con dependencias. No te preocupes, ¡yo me encargo! + +Aquí hay un contrato inteligente simple escrito en `Solidity` cuyo único proposito es comporbar si somos ricos. Utiliza el token ERC20 para comprobar si tenemos suficientes tokens. Ponlo en `./contracts/AmIRichAlready.sol`. + +```solidity +pragma solidity ^0.6.2; + +interface IERC20 { + function balanceOf(address account) external view returns (uint256); +} + +contract AmIRichAlready { + IERC20 private tokenContract; + uint public richness = 1000000 * 10 ** 18; + + constructor (IERC20 _tokenContract) public { + tokenContract = _tokenContract; + } + + function check() public view returns (bool) { + uint balance = tokenContract.balanceOf(msg.sender); + return balance > richness; + } +} +``` + +Como queremos utilizar la simulación dinámica no necesitamos el ERC20 completo, por eso estamos utilizando la interfaz de IERC20 con sólo una función. + +¡Es hora de construir este contrato! Para ello utilizaremos `Waffle`. Primero, debemos crear un archivo de configuración simple `waffle.json` que especifique las opciones de compilación. + +```json +{ + "compilerType": "solcjs", + "compilerVersion": "0.6.2", + "sourceDirectory": "./contracts", + "outputDirectory": "./build" +} +``` + +Ahora estamos listos para crear el contrato con Waffle: + +```bash +npx waffle +``` + +Fácil, ¿verdad? En la carpeta `build/` aparecieron dos archivos correspondientes al contrato y la interfaz. Los utilizaremos luego para las pruebas. + +### **3. Pruebas** {#3-testing} + +Creemos un archivo llamado `AmIRichAlready.test.ts` para estas pruebas. Antes que nada, tenemos que gestionar las importaciones. Las necesitaremos luego: + +```typescript +import { expect, use } from "chai" +import { Contract, utils, Wallet } from "ethers" +import { + deployContract, + deployMockContract, + MockProvider, + solidity, +} from "ethereum-waffle" +``` + +Excepto para las dependencias JS, necesitaremos importar o crear el contrato y la interfaz: + +```typescript +import IERC20 from "../build/IERC20.json" +import AmIRichAlready from "../build/AmIRichAlready.json" +``` + +Waffle utiliza `chai` para las pruebas. Sin embargo, antes de utilizarlo, debemos insertar los emparejadores de Waffle en el propio chai: + +```typescript +use(solidity) +``` + +Necesitamos implementar una función `beforeEach()` que restablezca el estado del contrato antes de cada prueba. Pensemos primero en lo que necesitamos allí. Para implementar un contrato necesitaremos dos cosas: un monedero y un contrato ERC20 ya implementado para utilizarlo como argumento del contrato `AmIRichAlready`. + +Primero creamos el monedero: + +```typescript +const [wallet] = new MockProvider().getWallets() +``` + +Luego debemos desplegar un contrato ERC20. Aquí está la parte difícil - sólo tenemos una interfaz. Esta es la parte en que Waffle viene a salvarnos. Waffle tiene una función mágica `deployMockContract()` que crea un contrato usando únicamente el _abi_ de la interfaz: + +```typescript +const mockERC20 = await deployMockContract(wallet, IERC20.abi) +``` + +Ahora con el monedero y el ERC20 desplegado, podemos continuar con la implementación del contrato `AmIRichAlready`: + +```typescript +const contract = await deployContract(wallet, AmIRichAlready, [ + mockERC20.address, +]) +``` + +Con todo eso, nuestra función `beforeEach()` está terminada. Hasta aquí, tu archivo `AmIRichAlready.test.ts` debería verse así: + +```typescript +import { expect, use } from "chai" +import { Contract, utils, Wallet } from "ethers" +import { + deployContract, + deployMockContract, + MockProvider, + solidity, +} from "ethereum-waffle" + +import IERC20 from "../build/IERC20.json" +import AmIRichAlready from "../build/AmIRichAlready.json" + +use(solidity) + +describe("Am I Rich Already", () => { + let mockERC20: Contract + let contract: Contract + let wallet: Wallet + + beforeEach(async () => { + ;[wallet] = new MockProvider().getWallets() + mockERC20 = await deployMockContract(wallet, IERC20.abi) + contract = await deployContract(wallet, AmIRichAlready, [mockERC20.address]) + }) +}) +``` + +Escribamos las primera prueba del contrato `AmIRichAlready`. ¿De qué crees que debería ser nuestra prueba? ¡Sí, tienes razón! Deberíamos comprobar si ya somos ricos :) + +Pero espera un segundo. ¿Cómo sabrá nuestro contrato simulado que valores devolver? No hemos implementado ninguna lógica para la función `balanceOf()`. Nuevamente, Waffle nos puede ayudar. Nuestro contrato simulado tiene algunas cosas nuevas: + +```typescript +await mockERC20.mock..returns() +await mockERC20.mock..withArgs().returns() +``` + +Con este conocimiento podemos, finalmente, escribir nuestra primera prueba: + +```typescript +it("returns false if the wallet has less than 1000000 tokens", async () => { + await mockERC20.mock.balanceOf.returns(utils.parseEther("999999")) + expect(await contract.check()).to.be.equal(false) +}) +``` + +Separemos esta prueba en partes: + +1. Establecimos nuestro contrato ERC20 para devolver siempre un balance de 999999 tokens. +2. Comprobar si el método`contract.check()` devuelve `false`. + +Estamos listos para liberar a la bestia: + +![Pasando una prueba](test-one.png) + +Así que la prueba funciona, pero... todavía hay margen de mejora. La función `balanceOf()` siempre devolverá 999999. Podemos mejorarla especificando un monedero para el cual la función devolverá algo, como un contrato real: + +```typescript +it("returns false if the wallet has less than 1000001 tokens", async () => { + await mockERC20.mock.balanceOf + .withArgs(wallet.address) + .returns(utils.parseEther("999999")) + expect(await contract.check()).to.be.equal(false) +}) +``` + +Hasta el momento, sólo probamos el caso donde aún no somos suficientemente ricos. Probemos el opuesto esta vez: + +```typescript +it("returns true if the wallet has at least 1000001 tokens", async () => { + await mockERC20.mock.balanceOf + .withArgs(wallet.address) + .returns(utils.parseEther("1000001")) + expect(await contract.check()).to.be.equal(true) +}) +``` + +Ejecutas las pruebas... + +![Pasando dos pruebas](test-two.png) + +... ¡y aquí está! Nuestro contrato parece funcionar según lo previsto :) + +## Probando llamadas de contrato {#testing-contract-calls} + +Veamos lo que hicimos hasta ahora. Probamos la funcionalidad de nuestro contrato `AmIRichAlready` y parece estar funcionando correctamente. Esto significa que terminamos, ¿verdad? ¡No exactamente! Waffle nos permite probar nuestro contrato aún más. ¿Pero cómo? Bueno, en el arsenal de Waffle tenemos `calledOnContract()` y los matchers `calledOnContractWith()`. Siempre nos permitirán corroborar si nuestro contrato llamó al contrato simulado ERC20. Aquí hay una prueba básica con uno de estos matchers: + +```typescript +it("checks if contract called balanceOf on the ERC20 token", async () => { + await mockERC20.mock.balanceOf.returns(utils.parseEther("999999")) + await contract.check() + expect("balanceOf").to.be.calledOnContract(mockERC20) +}) +``` + +Incluso podemos ir más allá y mejorar esta prueba con los otros matchers de los que te hablé: + +```typescript +it("checks if contract called balanceOf with certain wallet on the ERC20 token", async () => { + await mockERC20.mock.balanceOf + .withArgs(wallet.address) + .returns(utils.parseEther("999999")) + await contract.check() + expect("balanceOf").to.be.calledOnContractWith(mockERC20, [wallet.address]) +}) +``` + +Vamos a comprobar si las pruebas fueron correctas: + +![Pasando tres pruebas](test-three.png) + +Genial, todas las pruebas están verdes. + +Probar las llamadas de contrato con Waffle es muy fácil. Y aquí está la mejor parte. ¡Estos emparejadores trabajan tanto con contratos normales como simulados! Esto se debe a que Waffle registra y filtra las llamadas EVM en lugar de introducir código, como en el caso de las librerías de prueba populares para otras tecnologías. + +## La Línea de Llegada {#the-finish-line} + +¡Felicidades! Ahora sabes como usar Waffle para probar las llamadas de contrato y contratos simulados de forma dinámica. Hay características mucho más interesantes que descubrir. Recomiendo revisar la documentación de Waffle. + +La documentación de Waffle está disponible [aquí](https://ethereum-waffle.readthedocs.io/). + +El código fuente de este tutorial puedes econtrarlo [aquí](https://github.com/EthWorks/Waffle/tree/master/examples/dynamic-mocking-and-testing-calls). + +Otros tutoriales que podrían interesarte: + +- [Probar contratos inteligentes con Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) diff --git a/public/content/translations/es/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md b/public/content/translations/es/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md new file mode 100644 index 00000000000..cc1f32a7538 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/index.md @@ -0,0 +1,202 @@ +--- +title: "Tutorial de Waffle \"Hola, Mundo\" con hardhat y ethers" +description: Haga su primer proyecto de Waffle con hardhat y ethers.js +author: "MiZiet" +tags: + - "waffle" + - "contratos inteligentes" + - "solidity" + - "pruebas" + - "hardhat" + - "ethers.js" +skill: beginner +lang: es +published: 2020-10-16 +--- + +En este tutorial de [Waffle](https://ethereum-waffle.readthedocs.io), aprenderemos cómo configurar un proyecto de contrato inteligente simple "Hola, Mundo" usando [hardhat](https://hardhat.org/) y [ethers](https://docs.ethers.io/v5/). Luego aprenderemos cómo añadir una nueva funcionalidad a nuestro contrato inteligente y cómo hacer pruebas con Waffle. + +Empecemos con la creación de un nuevo proyecto: + +```bash +yarn init +``` + +o + +```bash +npm init +``` + +y la instalación de los paquetes necesarios: + +```bash +yarn add -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai +``` + +o + +```bash +npm install -D hardhat @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai +``` + +El siguiente paso es crear un proyecto de hardhat de muestra ejecutando `npx hardhat`. + +```bash +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 + +👷 Bienvenido a Hardhat v2.0.3 👷‍ + +? ¿Qué es lo que quieres hacer? … +❯ Cree un proyecto de muestra +Cree un hardhat.config.js vacío +Renunciar +``` + +Seleccione `Create a sample project`. + +La estructura del proyecto debería verse así: + +``` +MyWaffleProject +├── contracts +│ └── Greeter.sol +├── node_modules +├── scripts +│ └── sample-script.js +├── test +│ └── sample-test.js +├── .gitattributs +├── .gitignore +├── hardhat.config.js +└── package.json +``` + +### Ahora hablemos de algunos de estos archivos: {#now-lets-talk} + +- Greeter.sol: nuestro contrato inteligente escrito en solidity; + +```solidity +contract Greeter { +string greeting; + +constructor(string memory _greeting) public { +console.log("Deploying a Greeter with greeting:", _greeting); +greeting = _greeting; +} + +function greet() public view returns (string memory) { +return greeting; +} + +function setGreeting(string memory _greeting) public { +console.log("Changing greeting from '%s' to '%s'", greeting, _greeting); +greeting = _greeting; +} +} +``` + +Nuestro contrato inteligente se puede dividir en tres partes: + +1. constructor: donde declaramos una variable de tipo cadena llamada `greeting`; +2. función greet: una función que devolverá el `greeting` al ser invocada; +3. función setGreeting: una función que nos permite cambiar el valor de `greeting`. + +- sample-test.js: nuestro archivo de pruebas + +```js +describe("Greeter", function () { + it("Should return the new greeting once it's changed", async function () { + const Greeter = await ethers.getContractFactory("Greeter") + const greeter = await Greeter.deploy("Hello, world!") + + await greeter.deployed() + expect(await greeter.greet()).to.equal("Hello, world!") + + await greeter.setGreeting("Hola, mundo!") + expect(await greeter.greet()).to.equal("Hola, mundo!") + }) +}) +``` + +### El siguiente paso consiste en compilar nuestro contrato y ejecutar pruebas: {#compiling-and-testing} + +Las pruebas de Waffle usan Mocha (un framework de pruebas) con Chai (una biblioteca de afirmaciones). Todo lo que tiene que hacer es ejecutar `npx hardhat test` y esperar a que aparezca el siguiente mensaje. + +```bash +✓ Should return the new greeting once it's changed +``` + +### Todo se ve bien hasta ahora, vamos a añadir un poco más de complejidad a nuestro proyecto {#adding-complexity} + +Imagine una situación en la que alguien añade una cadena vacía como saludo. No sería un saludo cálido, ¿cierto? +Asegurémonos de que eso no suceda: + +Queremos usar `revert` de solidity cuando alguien pase una cadena vacía. Algo bueno es que podemos probar esta funcionalidad fácilmente con el emparejador de chai de Waffle `to.be.revertedWith()`. + +```js +it("Should revert when passing an empty string", async () => { + const Greeter = await ethers.getContractFactory("Greeter") + const greeter = await Greeter.deploy("Hello, world!") + + await greeter.deployed() + await expect(greeter.setGreeting("")).to.be.revertedWith( + "Greeting should not be empty" + ) +}) +``` + +Parece que nuestra nueva prueba no pasó: + +```bash +Deploying a Greeter with greeting: Hello, world! +Changing greeting from 'Hello, world!' to 'Hola, mundo!' + ✓ Should return the new greeting once it's changed (1514ms) +Deploying a Greeter with greeting: Hello, world! +Changing greeting from 'Hello, world!' to '' + 1) Should revert when passing an empty string + + + 1 passing (2s) + 1 failing +``` + +Vamos a implementar esta funcionalidad en nuestro contrato inteligente: + +```solidity +require(bytes(_greeting).length > 0, "Greeting should not be empty"); +``` + +Ahora, nuestra función setGreeting se ve así: + +```solidity +function setGreeting(string memory _greeting) public { +require(bytes(_greeting).length > 0, "Greeting should not be empty"); +console.log("Changing greeting from '%s' to '%s'", greeting, _greeting); +greeting = _greeting; +} +``` + +Vamos a ejecutar pruebas de nuevo: + +```bash +✓ Should return the new greeting once it's changed (1467ms) +✓ Should revert when passing an empty string (276ms) + +2 passing (2s) +``` + +¡Enhorabuena! Lo logró :) + +### Conclusión {#conclusion} + +Hicimos un proyecto sencillo con Waffle, Hardhat y ethers.js. Aprendimos a crear un proyecto, añadir una prueba e implementar nuevas funcionalidades. + +Para ver más excelentes emparejadores de chai para probar su contrato inteligente, consulte los [documentos oficiales de Waffle](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html). diff --git a/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md new file mode 100644 index 00000000000..8b03bddf19a --- /dev/null +++ b/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -0,0 +1,203 @@ +--- +title: Probar el contrato inteligente de forma sencilla con la biblioteca Waffle +description: Tutorial para principiantes +author: Ewa Kowalska +tags: + - "contratos inteligentes" + - "Solidity" + - "Waffle" + - "pruebas" +skill: beginner +lang: es +published: 2021-02-26 +--- + +## En este tutorial aprenderá a: {#in-this-tutorial-youll-learn-how-to} + +- Evalúa los cambios en el saldo de la billetera +- Probar la emisión de eventos con argumentos especificos. +- Verificar que una transacción se ha revertido. + +## Supuestos {#assumptions} + +- Puede crear un nuevo proyecto JavaScript o TypeScript. +- Tiene experiencia básica con las pruebas en JavaScript. +- Ha utilizado algunos gestores de paquetes como yarn o npm. +- Posee conocimientos muy básicos de contratos inteligentes y Solidity. + +# Introducción {#getting-started} + +Este tutorial explica una configuración de prueba y se ejecuta utilizando yarn, pero no pasa nada si prefiere hacerlo con npm, ya proporcionaré las indicaciones apropiadas a la documentación oficial de Waffle[](https://ethereum-waffle.readthedocs.io/en/latest/index.html). + +## Instalar las dependencias {#install-dependencies} + +[Añada](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#installation) las dependencias ethereum-waffle y de typescript a las dependencias de desarrollo de su proyecto. + +```bash +yarn add --dev ethereum-waffle ts-node typescript @types/jest +``` + +## Ejemplo de contrato inteligente {#example-smart-contract} + +Durante el tutorial trabajaremos con un sencillo ejemplo de contrato inteligente: EtherSplitter. Permite casi se manera similar que cualquiera envíe algunos wei y, eventualmente, los divida entre dos receptores por defecto. La función dividida requiere que la cantidad de wei sea un número entero, de lo contario se revertirá. Para ambos receptores realiza una transferencia de wei, seguida a la emisión de un evento de transferencia. + +Añada el fragmento de código de EtherSplitter en `src/EtherSplitter.sol`. + +```solidity +pragma solidity ^0.6.0; + +contract EtherSplitter { + address payable receiver1; + address payable receiver2; + + event Transfer(address from, address to, uint256 amount); + + constructor(address payable _address1, address payable _address2) public { + receiver1 = _address1; + receiver2 = _address2; + } + + function split() public payable { + require(msg.value % 2 == 0, 'Uneven wei amount not allowed'); + receiver1.transfer(msg.value / 2); + emit Transfer(msg.sender, receiver1, msg.value / 2); + receiver2.transfer(msg.value / 2); + emit Transfer(msg.sender, receiver2, msg.value / 2); + } +} +``` + +## Compilar el contrato {#compile-the-contract} + +Para [compilar](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#compiling-the-contract) el contrato, añada las siguientes líneas al archivo de package.json: + +```json +"scripts": { + "build": "waffle" + } +``` + +A continuación, cree el archivo de configuración de Waffle en el directorio de raíz del proyecto `waffle.json` y después pegue ahí la siguiente configuración: + +```json +{ + "compilerType": "solcjs", + "compilerVersion": "0.6.2", + "sourceDirectory": "./src", + "outputDirectory": "./build" +} +``` + +Ejecute `yarn build`. Como resultado, el directorio `build` aparecerá con el contrato compilado de EtherSplitter en formato JSON. + +## Configuración de la prueba {#test-setup} + +Para hacer pruebas con Waffle se tienen que utilizar los emparejadores de Chai y Mocha, por lo que necesita [añadirlos](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests) a su proyecto. Actualice su archivo package.json y añada la línea de `test` en la parte de scripts: + +```json +"scripts": { + "build": "waffle", + "test": "export NODE_ENV=test && mocha -r ts-node/register 'test/**/*.test.ts'" + } +``` + +Si quiere [ejecutar](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#running-tests) sus pruebas, simplemente ejecute `yarn test` . + +# Pruebas {#testing} + +Seguidamente cree el directorio `test` y un nuevo archivo `test\EtherSplitter.test.ts`. Copie el fragmento de abajo y péguelo en nuestro archivo de prueba. + +```ts +import { expect, use } from "chai" +import { Contract } from "ethers" +import { deployContract, MockProvider, solidity } from "ethereum-waffle" +import EtherSplitter from "../build/EtherSplitter.json" + +use(solidity) + +describe("Ether Splitter", () => { + const [sender, receiver1, receiver2] = new MockProvider().getWallets() + let splitter: Contract + + beforeEach(async () => { + splitter = await deployContract(sender, EtherSplitter, [ + receiver1.address, + receiver2.address, + ]) + }) + + // add the tests here +}) +``` + +Unas breves aclaraciones antes de que empecemos. El `MockProvider` incluye una simulación de la cadena de bloques. También permite que las carteras simuladas funcionen para hacer la prueba del contrato EtherSplitter. Podemos obtener hasta diez carteras aplicando el método de `getWallet()` en el proveedor. En el ejemplo, obtendremos tres carteras para el emisor y dos receptores. + +A continuación, declaramos una variable llamada «splitter»: este es nuestro contrato simulado EtherSplitter. Se crea antes de la ejecución de una única prueba a través del método `deployContract`. Este método simula la implementación de un contrato desde la cartera pasado como el primer parámetro (en nuestro caso, la cartera del emisor). El segundo parámetro es el ABI y el código de bytes del contrato de prueba: aquí pasamos el archivo json o el contrato EtherSplitter compilado desde el directorio `build`. El tercer parámetro es una matriz con los argumentos del constructor del contrato, que en nuestro caso, son las dos direcciones de los receptores. + +## ChangeBalances {#changebalances} + +Primero, revisamos si el método dividido realmente cambia el saldo de las carteras de los receptores. Si dividimos 50 wei desde las cuentas de los emisores, esperaríamos que los saldos de ambos receptores aumentaran 25 wei. Usaremos el comparador `changeBalances` de Waffle: + +```ts +it("Changes accounts balances", async () => { + await expect(() => splitter.split({ value: 50 })).to.changeBalances( + [receiver1, receiver2], + [25, 25] + ) +}) +``` + +Como primer parámetro del emparejador, enviamos una matriz de carteras receptoras; y como segundo parámetro, una matriz de aumentos esperados en las cuentas correspondientes. Si queremos revisar el balance de una billetera en específico, también podemos usar el comparador `changeBalance`, que no requiere el envío de matrices como en el ejemplo anterior: + +```ts +it("Changes account balance", async () => { + await expect(() => splitter.split({ value: 50 })).to.changeBalance( + receiver1, + 25 + ) +}) +``` + +Tenga en cuenta que en ambos casos `changeBalance` y `changeBalances`, enviamos la función dividida como devolución de llamada, porque el emparejador necesita acceder al estado de saldos antes y después de la llamada. + +A continuación, probaremos si el evento de transferencia se emitió después de cada transferencia de wei. Cambiaremos a otra máquina desde Waffle: + +## Emit {#emit} + +```ts +it("Emits event on the transfer to the first receiver", async () => { + await expect(splitter.split({ value: 50 })) + .to.emit(splitter, "Transfer") + .withArgs(sender.address, receiver1.address, 25) +}) + +it("Emits event on the transfer to the second receiver", async () => { + await expect(splitter.split({ value: 50 })) + .to.emit(splitter, "Transfer") + .withArgs(sender.address, receiver2.address, 25) +}) +``` + +El emparejador `emit` nos permite revisar si un contrato ha emitido un evento al recurrir a un método. Como parámetros del emparejador `emit`, proporcionamos el simulacro de contrato que predecimos para emitir el evento, junto al nombre de ese evento. En nuestro caso, el simulacro de contrato es `splitter` y el nombre del evento: `Transfer`. También podemos verificar los valores precisos de los argumentos con los que se emitió el evento: enviamos tantos argumentos al emparejador `withArgs` como lo espera nuestra declaración de evento. En el caso del contrato EtherSplitter, enviamos las direcciones del emisor y del receptor, junto a la cantidad de wei transferida. + +## revertedWith {#revertedwith} + +Como último ejemplo, comprobaremos si se revirtió la transacción en caso de número impar de wei. Usaremos el emparejador `revertedWith`: + +```ts +it("Reverts when Vei amount uneven", async () => { + await expect(splitter.split({ value: 51 })).to.be.revertedWith( + "Uneven wei amount not allowed" + ) +}) +``` + +Si la prueba sale bien, nos garantizará que se ha revertido la transacción. Sin embargo, también debe haber una coincidencia exacta entre los mensajes que hemos enviado en la declaración `require` y el mensaje que esperamos en `revertedWith`. Si regresamos al código del contrato EtherSplitter, en la declaración `require` para la cantidad de wei, proporcionamos el mensaje: «no se permite una cantidad impar de wei». Esto coincide con el mensaje que esperamos en nuestra prueba. Si no coinciden, será que la prueba ha salido mal. + +# Enhorabuena! {#congratulations} + +¡Acabas de dar tu primer gran paso para probar los contratos inteligentes con Waffle! Puede que también te interesen otros tutoriales de Waffle: + +- [Probar ERC20 con Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) +- [Waffle: Llamadas dinámicas de simulación y prueba de contratos](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) +- [Tutorial de Waffle "Hola, Mundo" con hardhat y ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) diff --git a/public/content/translations/es/developers/tutorials/yellow-paper-evm/index.md b/public/content/translations/es/developers/tutorials/yellow-paper-evm/index.md new file mode 100644 index 00000000000..bc791dd91c5 --- /dev/null +++ b/public/content/translations/es/developers/tutorials/yellow-paper-evm/index.md @@ -0,0 +1,264 @@ +--- +title: Explicación de las especificaciones de la EVM del Yellow Paper +description: Explicación de la parte del Yellow Paper, las especificaciones formales de Ethereum, que explican la máquina virtual de Ethereum (EVM). +author: "qbzzt" +tags: + - "evm" +skill: intermediate +lang: es +published: 2022-05-15 +--- + +El [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) es la especificación formal de Ethereum. Excepto donde esté modificado por el [proceso de EIP](/eips/), contiene la descripción exacta de cómo funciona todo. Está escrito como un papel matemático que incluye términos que podrían no ser tan familiares para los programadores. En este papel aprenderá cómo leerlo y, por extensión, otros papeles matemáticos relacionados. + +## ¿Qué Yellow Paper? {#which-yellow-paper} + +Como sucede con casi todo en Ethereum, el Yellow Paper evoluciona conforme avanza el tiempo. Para hacer referencia a una versión específica, he publicado [la versión actual al momento de escribir este artículo](yellow-paper-berlin.pdf). Los números de sección, página y ecuación que utilizo se referirán a esa versión. Es una buena idea tenerlo abierto en una ventana diferente mientras le este documento. + +### ¿Por qué la EVM? {#why-the-evm} + +La versión original del Yellow Paper se escribió al inicio del desarrollo de Ethereum. Describe el mecanismo de consenso original basado en prueba de trabajo que se usaba originalmente para asegurar la red. Sin embargo, Ethereum acabó con la prueba de trabajo y comenzó a utilizar el consenso basado en prueba de participación en septiembre de 2022. Este tutorial se enfocará en las partes del Yellow Paper que definen la Máquina Virtual de Ethereum (EVM). La EVM no resultó modificada por el cambio a la prueba de participación (a excepción del valor de retorno del código de operación DIFFICULTY). + +## 9. Modelo de ejecución {#9-execution-model} + +Esta sección (p. 12-14) incluye la mayor parte de la definición de la EVM. + +El término _estado de sistema_ incluye todo lo que necesita saber sobre el sistema para ejecutarlo. En una computadora típica, esto significa la memoria, los registros de contenido, etc. + +Una [máquina de Turing](https://en.wikipedia.org/wiki/Turing_machine) es un modelo computacional. Esencialmente, es una versión simplificada de una computadora que, según se ha probado, cuenta con la misma capacidad de realizar cálculos que una computadora normal (todo lo que una computadora puede calcular una máquina de Turing puede calcular y viceversa). Este modelo facilita probar varios teoremas sobre qué es y qué no es computable. + +El término [Turing-complete](https://en.wikipedia.org/wiki/Turing_completeness) hace referencia a una computadora que puede realizar los mismos cálculos que una máquina de Turing. Las máquinas de Turing pueden entrar en bucles infinitos, y la EVM no, porque el gas se agotaría, por lo que sería solo quasi-Turing-complete. + +## 9.1. Fundamentos básicos {#91-basics} + +Esta sección proporciona los fundamentos básicos de la Máquina Virtual de Ethereum (EVM) y cómo se compara con otros modelos computacionales. + +Una [máquina apiladora](https://en.wikipedia.org/wiki/Stack_machine), o stack machine, es una computadora que almacena datos intermedios no en registros, sino en una [**pila**](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)). Esta es la arquitectura preferida para máquinas virtuales porque es sencilla de implementar, lo que significa que los errores y las vulnerabilidades de seguridad son menos probables. La memoria en la pila se divide en palabras de 256 bits. Esto se eligió porque es conveniente para las operaciones criptográficas centrales de Ethereum como el hash Keccak-256 y los cómputos de curva elíptica. El tamaño máximo de una pila es de 1024 bytes. Cuando se ejecutan códigos de operación (opcodes), estos usualmente reciben sus parámetros de la pila. Hay códigos de operación específicos para reorganizar elementos en la pila, tales como `POP` (elimina un objeto de la parte superior de la pila), `DUP_N` (elemento enésimo duplicado en la pila), etc. + +La EVM también cuenta con un espacio volátil llamado **memoria** que es utilizado para almacenar datos durante la ejecución. Esta memoria está organizada en palabras de 32 bytes. Todas las ubicaciones de memoria están inicializadas en cero. Si ejecuta este código [Yul](https://docs.soliditylang.org/en/latest/yul.html) para agregar una palabra en la memoria, este completará 32 bytes de memoria rellenando el espacio vacío en la palabra con ceros, es decir, crea una palabra con ceros en las ubicaciones 0-29, 0x60 a 30 y 0xA7 a 31. + +```yul +mstore(0, 0x60A7) +``` + +`mstore` es uno de los tres códigos de operación proporcionados por la EVM para interactuar con la memoria: carga una palabra en la memoria. Los otros dos son `mstore8`, que carga un único byte en la memoria, y `mload`, que mueve una palabra de la memoria a la pila. + +La EVM también tiene un modelo de **almacenamiento** no volátil que es mantenido como parte del estado del sistema; esta memoria se organiza en conjuntos de palabras (a diferencia de las matrices de bytes direccionables por palabras en la pila). Este almacenamiento es donde los contratos guardan datos persistentes; un contrato solo puede interactuar con su propio almacenamiento. El almacenamiento se organiza en asignaciones o mapeos clave-valor. + +Aunque no se menciona en esta sección del Yellow Paper, también es útil conocer que hay un cuarto tipo de memoria. **Calldata** es una memoria de solo lectura direccionable por bytes utilizada para almacenar el valor transmitido con el parámetro `data` de una transacción. La EVM tiene códigos de operación específicos para gestionar `calldata`. `calldatasize` devuelve el tamaño de los datos. `calldataload` carga los datos en la pila. `calldatacopy` copia los datos en la memoria. + +La [arquitectura Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) estándar almacena código y datos en la misma memoria. La EVM no sigue este estándar por razones de seguridad: compartir memoria volátil hace posible el cambio del código del programa. En vez de eso, el código se guarda en el almacenamiento. + +Solo hay dos casos donde el código es ejecutado desde la memoria: + +- Cuando un contrato crea otro contrato (utilizando [`CREATE`](https://www.evm.codes/#f0) o [`CREATE2`](https://www.evm.codes/#f5)), el código para el constructor del contrato viene de la memoria. +- Durante la cración de _cualquier_ contrato, el código del constructor se ejecuta y luego devuelve el código del contrato real, también desde la memoria. + +El término ejecución excepcional significa una excepción que hace que la ejecución del contrato actual se detenga. + +## 9.2. Resumen de las tarifas {#92-fees-overview} + +Esta sección explica cómo se calculan las tarifas de gas. Hay tres costos: + +### Costo de códigos de operación {#opcode-cost} + +El costo inherente del código de operación específico. Para obtener este valor, busque el grupo de costo del código de operación en el Apéndice H (p. 28, debajo de la ecuación (327)) y busque el grupo de costo en la ecuación (324). Esto le proporcionará una función de costo, que en la mayoría de los casos utiliza parámetros del Apéndice G (p. 27). + +Por ejemplo, el código de operación [`CALLDATACOPY`](https://www.evm.codes/#37) es miembro del grupo _Wcopy_. El costo del código de operación para ese grupo es _Gverylow+Gcopy×⌈μs[2]÷32]_. Revisando el Apéndice G, podemos ver que ambas constantes son 3, lo que nos da _3+3×⌈μs[2]÷32⌉_. + +Todavía necesitamos descifrar la expresión _⌈μs[2]÷32⌉_. La parte más externa, _⌈ \ ⌉_, es la función de techo, una función que, al darle un valor, devuelve el entero más pequeño que no sea más pequeño que el valor. Por ejemplo, _⌈2.5⌉ = ⌈3⌉ = 3_. La parte interior es _μs[2]÷32_. Viendo la sección 3 (Convenciones) en la p. 3, _μ_ es el estado de la máquina. El estado de la máquina es definido en la sección 9.4.1 de la p. 13. De acuerdo con esa sección, uno de los parámetros de estado de la máquina es _s_ para la pila. Al colocar todos juntos, parece que _μs[2]_ es la posición n.º 2 en la pila. Viendo el [código de operación](https://www.evm.codes/#37), la posición 2 en la pila es el tamaño de los datos en bytes. Viendo los otros códigos de operación en el grupo Wcopy, [`CODECOPY`](https://www.evm.codes/#39) y [`RETURNDATACOPY`](https://www.evm.codes/#3e), también tienen un tamaño de datos en la misma ubicación. Entonces, _⌈μs[2]÷32⌉_ es la cantidad de palabras de 32 bytes requerida para almacenar la información copiada. Colocando todo junto, el costo inherente de [`CALLDATACOPY`](https://www.evm.codes/#37) es de 3 gas más 3 por palabra de datos copiados. + +### Costo de ejecución {#running-cost} + +El costo de ejecutar el código que estamos llamando. + +- En el caso de [`CREATE`](https://www.evm.codes/#f0) y [`CREATE2`](https://www.evm.codes/#f5), el constructor para el nuevo contrato. +- En el caso de [`CALL`](https://www.evm.codes/#f1), [`CALLCODE`](https://www.evm.codes/#f2), [`STATICCALL`](https://www.evm.codes/#fa) o [`DELEGATECALL`](https://www.evm.codes/#f4), el contrato que llamamos. + +### Costo de expandir la memoria {#expanding-memory-cost} + +El costo de expandir la memoria (si es necesario). + +En la ecuación 324, este valor se escribe como _Cmemi')-Cmemi)_. Mirando la sección 9.4.1 nuevamente, vemos que _μi_ es la cantidad de palabras en la memoria. Así que _μi_ es la cantidad de palabras en la memoria antes del código de operación, y _μi'_ es la cantidad de palabras en la memoria luego del código de operación. + +La función _Cmem_ es definida en la ecuación 326: _Cmem(a) = Gmemory × a + ⌊a2 ÷ 512⌋_. _⌊x⌋_ es la función de piso, una función que, al darle un valor, devuelve el entero más grande que no sea más grande que el valor. Por ejemplo, _⌊2.5⌋ = ⌊2⌋ = 2._ Cuando _a < √512_, _a2 < 512_ y el resultado de la función de piso es cero. Así, para las primeras 22 palabras (704 bytes), el costo aumenta de manera lineal con la candidad requerida de palabras en la memoria. Más allá de ese punto, _⌊a2 ÷ 512⌋_ es positivo. Cuando la memoria requerida es suficientemente alta, el costo del gas es proporcional a la cantidad de memoria elevada al cuadrado. + +**Note** que estos factores solo influyen en el costo _inherente_ del gas; no se toman en cuenta el mercado de tarifas o las propinas a los validadores que determinan cuánto debe pagar el usuario final; esto es solo el costo bruto de ejecutar una operación en particular en la EVM. + +[Más información sobre el gas](/developers/docs/gas/). + +## 9.3. Entorno de ejecución {#93-execution-env} + +El entorno de ejecución es una tupla, _I_, que incluye información que no es parte del estado de la cadena de bloques o la EVM. + +| Parámetro | Código de operación para acceder a los datos | Código de Solidity para acceder a los datos | +| --------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | +| _Ia_ | [`ADDRESS`](https://www.evm.codes/#30) | `address(this)` | +| _Io_ | [`ORIGIN`](https://www.evm.codes/#32) | `tx.origin` | +| _Ip_ | [`GASPRICE`](https://www.evm.codes/#3a) | `tx.gasprice` | +| _Id_ | [`CALLDATALOAD`](https://www.evm.codes/#35), etc. | `msg.data` | +| _Is_ | [`CALLER`](https://www.evm.codes/#33) | `msg.sender` | +| _Iv_ | [`CALLVALUE`](https://www.evm.codes/#34) | `msg.value` | +| _Ib_ | [`CODECOPY`](https://www.evm.codes/#39) | `address(this).code` | +| _IH_ | Campos de encabezado de bloque, como [`NUMBER`](https://www.evm.codes/#43) y [`DIFFICULTY`](https://www.evm.codes/#44) | `block.number`, `block.difficulty`, etc. | +| _Ie_ | Profundidad de la pila de llamadas para llamadas entre contratos (incluida la creación de contratos) | | +| _Iw_ | ¿La EVM tiene permitido cambiar de estado o se está ejecutando estáticamente? | | + +Algunos otros parámetros son necesarios para comprender el resto de la sección 9: + +| Parámetro | Definido en la sección | Significado | +| --------- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| _σ_ | 2 (p. 2, ecuación 1) | El estado de la cadena de bloques | +| _g_ | 9.3 (p. 13) | Gas restante | +| _A_ | 6.1 (p. 8) | Subestado acumulado (cambios programados para cuando la transacción finalice) | +| _o_ | 9.3 (p. 13) | Salida: el resultado devuelto en caso de transacción interna (cuando un contrato llama a otro) y llamadas a funciones de visualización (cuando simplemente pregunta por información, por lo que no hay necesidad de esperar por una transacción) | + +## 9.4. Descripción general de ejecución {#94-execution-overview} + +Ahora que tenemos todas las cuestiones preliminares, finalmente podemos empezar a trabajar en cómo funciona la EVM. + +Las ecuaciones 137-142 nos brindan las condiciones iniciales para ejecutar la EVM: + +| Símbolo | Valor inicial | Significado | +| ---------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| _μg_ | _g_ | Gas restante | +| _μpc_ | _0_ | Contador del programa, la dirección de la siguiente instrucción a ejecutar | +| _μm_ | _(0, 0, ...)_ | Memoria, inicializada en todos ceros | +| _μi_ | _0_ | Ubicación más alta de memoria usada | +| _μs_ | _()_ | La pila, inicialmente vacía | +| _μo_ | _∅_ | La salida, vacía hasta y a menos que nos detengamos con datos de devolución ([`RETURN`](https://www.evm.codes/#f3) o [`REVERT`](https://www.evm.codes/#fd)) o sin ellos ([`STOP`](https://www.evm.codes/#00) o [`SELFDESTRUCT`](https://www.evm.codes/#ff)). | + +La ecuación 143 nos dice que hay cuatro posibles condiciones en cada momento específico durante la ejecución y qué se debe hacer con ellas: + +1. `Z(σ,μ,A,I)`. Z representa una función que prueba si una operación crea una transición de estado no válida (ver [detención excepcional](#942-exceptional-halting)). Si se evalúa como True, el nuevo estado es idéntico al anterior (excepto que se quema/usa gas) porque los cambios no se han implementado. +2. Si el código de operación ejecutado es [`REVERT`](https://www.evm.codes/#fd), el nuevo estado es el mismo que el anterior, se pierde algo de gas. +3. Si la secuencia de operaciones es finalizada, como lo indica un [`RETURN`](https://www.evm.codes/#f3)), el estado es actualizado al nuevo. +4. Si no estamos en una de las condiciones finales 1-3, continuar con la ejecución. + +## 9.4.1. Estado de la máquina {#941-machine-state} + +Esta sección explica el estado de la máquina con mayor detalle. Especifica que _w_ es el actual código de operación. Si _μpc_ es menor que _||Ib||_, la longitud del código, entonces ese byte (_Ibpc]_) es el código de operación. De lo contrario, el código de operación es definido como [`STOP`](https://www.evm.codes/#00). + +Como esta es una [máquina de pila](https://en.wikipedia.org/wiki/Stack_machine), necesitamos mantener un registro de la cantidad de objetos que salieron (_δ_) y entraron (_α_) a causa de cada código de operación. + +## 9.4.2. Detención excepcional {#942-exceptional-halt} + +Esta sección define la función _Z_, que especifica cuando tenemos una finalización anormal. Se trata de una función [booleana](https://en.wikipedia.org/wiki/Boolean_data_type), así que usa [_∨_ para un o lógico](https://en.wikipedia.org/wiki/Logical_disjunction) y [_∧_ para un y lógico](https://en.wikipedia.org/wiki/Logical_conjunction). + +Tenemos una detención excepcional si cualquiera de estas condiciones es verdadera: + +- **_μg < C(σ,μ,A,I)_** Como vimos en la sección 9.2, _C_ es la función que especifica el costo del gas. No hay suficiente gas para cubrir el siguiente código de operación. + +- **_δw=∅_** Si el número de elementos que aparecen para un código de operación no está definido, entonces el código de operación en sí no está definido. + +- **_|| μs || < δw_** Desbordamiento de la pila, no hay suficientes elementos en la pila para el actual código de operación. + +- **_w = JUMP ∧ μs[0]∉D(Ib)_** El código de operación es [`JUMP`](https://www.evm.codes/#56) y la dirección no es un [`JUMPDEST`](https://www.evm.codes/#5b). Los saltos _solo_ son válidos cuando el destino es un [`JUMPDEST`](https://www.evm.codes/#5b). + +- **_w = JUMPI ∧ μs[1]≠0 ∧ μs[0] ∉ D(Ib)_** El código de operación es [`JUMPI`](https://www.evm.codes/#57), la condición es verdadera (no es cero), por lo que el salto debería ocurrir, y la dirección no es un [`JUMPDEST`](https://www.evm.codes/#5b). Los saltos _solo_ son válidos cuando el destino es un [`JUMPDEST`](https://www.evm.codes/#5b). + +- **_w = RETURNDATACOPY ∧ μs[1]+μs[2]>|| μo ||_** El código de operación es [`RETURNDATACOPY`](https://www.evm.codes/#3e). En este código de operación, el elemento de pila _μs[1]_ es el desplazamiento desde donde leer en el búfer de datos de retorno, y el elemento de pila _μs[2]_ es la longitud de datos. Esta condición ocurre cuando intenta leer más allá del fin del búfer de datos de retorno. Note que no hay una condición similar para la llamada de datos o para el código en sí. Cuando trata de leer más allá del final de esos búferes obtiene ceros. + +- **_|| μs || - δw + αw > 1024_** + + Desbordameinto de pila. Si la ejecución del código de operación resultará en una pila con más de 1024 elementos, abortar. + +- **_¬Iw ∧ W(w,μ)_** ¿Estamos corriendo estáticamente ([¬ es negación](https://en.wikipedia.org/wiki/Negation) y _Iw_ es verdadero cuando tenemos permitido cambiar el estado de la cadena de bloques)? Si es así y estamos intentando una operación de cambio de estado, esto no puede suceder. + + La función _W(w,μ)_ es definida más tarde en la ecuación 150. _W(w,μ)_ es verdadero si una de estas condiciones es verdadera: + + - **_w ∈ {CREATE, CREATE2, SSTORE, SELFDESTRUCT}_** Estos códigos de operación cambian el estado, ya sea creando un nuevo contrato, almacenando un valor o destruyendo el contrato actual. + + - **_LOG0≤w ∧ w≤LOG4_** Si somos llamados estáticamente, no podemos emitir entradas de registro. Los código de operación del registro están todos en un rango entre [`LOG0` (A0)](https://www.evm.codes/#a0) y [`LOG4` (A4)](https://www.evm.codes/#a4). El número que figura luego del código de operación del registro especifica cuántos temas contiene la entrada de registro. + - **_w=CALL ∧ μs[2]≠0_** Puede invocar otro contrato cuando está estático, pero, si lo hace, no puede transferir ETH a este. + +- **_w = SSTORE ∧ μg ≤ Gcallstipend_** No puede correr [`SSTORE`](https://www.evm.codes/#55), a menos que tenga más que Gcallstipend (definido como 2300 en el Apéndice G) gas. + +## 9.4.3. Validez de destino de salto {#943-jump-dest-valid} + +Aquí definimos formalmente qué son los códigos de operación [`JUMPDEST`](https://www.evm.codes/#5b). No podemos simplemente buscar el valor de byte 0x5B, porque podría estar dentro de un PUSH (y, por lo tanto, datos y no un código de operación). + +En la ecuación (153) definimos una función, _N(i,w)_. El primer parámetro, _i_, es la ubicación del código de operación. El segundo, _w_, es el código de operación en sí. Si _w∈[PUSH1, PUSH32]_, eso significa que el código de operación es un PUSH (los corchetes definen un rango que incluye los extremos). En ese caso el siguiente código de operación está en _i+2+(w−PUSH1)_. Para [`PUSH1`](https://www.evm.codes/#60) necesitamos avancar de a dos bytes (el propio PUSH y el valor de un byte), para [`PUSH2`](https://www.evm.codes/#61) necesitamos avanzar de a tres bytes, porque es un valor de dos bytes, etc. Todos los demás códigos de operación de la EVM son solo de un byte de longitud, así que en todos los otros casos _N(i,w)=i+1_. + +Esta función se usa en la ecuación (152) para definir _DJ(c,i)_, que corresponde al [conjunto](https://en.wikipedia.org/wiki/Set_(mathematics)) de todos los destinos de salto válidos en el código _c_, comenzando con la ubicación del código de operación _i_. Esta función es definida de manera recursiva. En caso de ser _i≥||c||_, significa que nos encontramos en o después del final del código. No encontraremos más destinos de salto, por lo que solo devolvemos el conjunto vacío. + +En todos los otros casos, nos fijamos en el resto del código dirigiéndonos al siguiente código de operación y obteniendo el conjunto que se inicia desde este. _c[i]_ es el actual código de operación, así que _N(i,c[i])_ es la ubicación del siguiente código de operación. _DJ(c,N(i,c[i]))_ es, por lo tanto, el conjunto de destinos de salto válidos que inicia en el siguiente código de operación. Si el actual código de operación no es un `JUMPDEST`, solo devolvemos ese conjunto. Si es `JUMPDEST`, debemos incluirlo en el conjunto de resultados y devolverlo. + +## 9.4.4. Detención normal {#944-normal-halt} + +La función de detención _H_ puede devolver tres tipos de valores. + +- Si no estamos en un código de operación de detención, devolver _∅_, el conjunto vacío. Por costumbre, este valor es interpretado como un Booleano falso. +- Si tenemos un código de operación de detención que no produce una salida (ya sea [`STOP`](https://www.evm.codes/#00) o [`SELFDESTRUCT`](https://www.evm.codes/#ff)), devolver una secuencia con tamaño de cero bytes como el valor de devolución. Note que esto es muy diferente al conjunto vacío. Este valor significa que la EVM realmente se ha detenido, solo que no hay datos de devolución para leer. +- Si tenemos un código de operación de detención que produce una salida (ya sea [`RETURN`](https://www.evm.codes/#f3) o [`REVERT`](https://www.evm.codes/#fd)), devolver la secuencia de bytes especificada por ese código de operación. Esta secuencia es tomada de la memoria, el valor en la parte superior de la pila (_μs[0]_) es el primer byte, y el valor luego de este (_μs[1]_) es la longitud. + +## H.2. Conjunto de instrucciones {#h2-instruction-set} + +Antes de ir a la subsección final de la EVM, 9.5, veamos las instrucciones en sí. Están definidas en el Apéndice H.2 que comienza en la p. 29. Todo lo que no esté especificado que debe cambiar con ese código de operación debe continuar igual. Las variables que sí cambian están especificadas como \'. + +Por ejemplo, veamos el código de operación [`ADD`](https://www.evm.codes/#01). + +| Valor | Nemotecnia | δ | α | Descripción | +| -----:| ---------- | - | - | --------------------------------------------------------- | +| 0x01 | ADD | 2 | 1 | Operación de suma. | +| | | | | _μ′s[0] ≡ μs[0] + μs[1]_ | + +_δ_ es la cantidad de valores que resaltamos de la pila. En este caso dos, porque estamos agregando los dos valores de la parte superior. + +_α_ es la cantidad de valores que enviamos de regreso. En este caso uno, la suma. + +Entonces la nueva parte superior de la pila (_μ′s[0]_) es la suma de la anterior parte superior de la pila (_μs[0]_) y el valor anterior debajo de esta (_μs[1]_). + +En lugar de repasar todos los códigos de operación con una "lista de ojos vidriosos", este artículo explica solo aquellos códigos de operación que introducen algo nuevo. + +| Valor | Nemotecnia | δ | α | Descripción | +| -----:| ---------- | - | - | ---------------------------------------------------------------------------------------------------------- | +| 0x20 | KECCAK256 | 2 | 1 | Computación del hash Keccak-256. | +| | | | | _μ′s[0] ≡ KEC(μms[0] . . . (μs[0] + μs[1] − 1)])_ | +| | | | | _μ′i ≡ M(μis[0],μs[1])_ | + +Este es el primer código de operación que accede a la memoria (en este caso, solo lectura). Sin embargo, podría expandirse más allá de los límites actuales de la memoria, por lo que necesitamos actualizar _μi._ Esto lo hacemos usando la función _M_, definida en la ecuación 328 de la p. 29. + +| Valor | Nemotecnia | δ | α | Descripción | +| -----:| ---------- | - | - | -------------------------------------------- | +| 0x31 | BALANCE | 1 | 1 | Obtener el saldo de la cuenta proporcionada. | +| | | | | ... | + +La dirección cuyo saldo necesitamos encontrar es _μs[0] mod 2160_. La parte superior de la pila es la dirección, pero, debido a que las direcciones solo son de 160 bits, calculamos el valor [modulo](https://en.wikipedia.org/wiki/Modulo_operation)2160. + +Si _σ[μs[0] mod 2160] ≠ ∅_, significa que hay información sobre esta dirección. En ese caso, _σ[μs[0] mod 2160]b_ es el saldo de esa dirección. Si _σ[μs[0] mod 2160] = ∅_, significa que esta dirección no está inicializada y el saldo es cero. Puede ver el listado de campos de información de la cuenta en la sección 4.1 de la p. 4. + +La segunda ecuación, _A'a ≡ Aa ∪ {μs[0] mod 2160}_, está relacionada con la diferencia en costo entre el acceso al almacenamiento en caliente (almacenamiento al que se ha accedido recientemente y es probable que esté almacenado en caché) y el almacenamiento en frío (almacenamiento al que no se ha accedido y es probable que esté en almacenamiento más lento que es más caro de recuperar). _Aa_ es el listado de direcciones accesadas previamente por la transacción, que deberían por lo tanto ser más baratas de acceder, como se define en la sección 6.1 de la p. 8. Puede leer más sobre este tema en [EIP-2929](https://eips.ethereum.org/EIPS/eip-2929). + +| Valor | Nemotecnia | δ | α | Descripción | +| -----:| ---------- | -- | -- | -------------------------------------------- | +| 0x8F | DUP16 | 16 | 17 | Duplicar el decimosexto elemento de la pila. | +| | | | | _μ′s[0] ≡ μs[15]_ | + +Note que para usar cualquier elemento de la pila, necesitamos resaltarlo (pop), lo que significa que también necesitamos resaltar todos los elementos de la pila arriba de este. En el caso de [`DUP`](https://www.evm.codes/#8f) y [`SWAP`](https://www.evm.codes/#9f), esto significa tener que resaltar y después empujar hasta dieciséis valores. + +## 9.5. El ciclo de ejecución {#95-exec-cycle} + +Ahora que tenemos todas las partes, finalmente podemos comprender cómo el ciclo de ejecución de la EVM es documentado. + +La ecuación (155) dice que dado el estado: + +- _σ_ (estado de la cadena de bloques global) +- _μ_ (estado de la EVM) +- _A_ (subestado, cambios que sucederán cuando la transacción finaliza) +- _I_ (entorno de ejecución) + +El nuevo estado es _(σ', μ', A', I')_. + +Las ecuaciones (156)-(158) definen la pila y el cambio en esta debido a un código de operación (_μs_). La ecuación (159) es el cambio en el gas (_μg_). La ecuación (160) es el cambio en el contador del programa (_μpc_). Finalmente, las ecuaciones (161)-(164) especifican que los otros parámetros permanecen iguales, a menos que sean explícitamente cambiados por el código de operación. + +Con esto, la EVM está completamente definida. + +## Conclusión {#conclusion} + +La notación matemática es precisa y permite que el Yellow Paper especifique cada detalle de Ethereum. Sin embargo, tiene algunas desventajas: + +- Solo puede ser comprendida por humanos, lo que implica que las [pruebas de cumplimiento](https://github.com/ethereum/tests) se deben escribir manualmente. +- Los programadores comprenden el código computacional. Pueden comprender o no la notación matemática. + +Quizá por estas razones, las nuevas [especificaciones de capas de consenso](https://github.com/ethereum/consensus-specs/blob/dev/tests/core/pyspec/README.md) están escritas en Python. Hay [especificaciones de capas de ejecución en Python](https://ethereum.github.io/execution-specs), pero no están completas. Hasta y a menos que todo el Yellow Paper también se traduzca a Python o un lenguaje similar, el Yellow Paper continuará en servicio y es útil saber leerlo. diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md index 5eb4f08e938..5d32213258b 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -43,7 +43,7 @@ Para conhecer ainda mais a rentabilidade da mineração, use uma calculadora de O seguinte fornece uma visão geral de como as transações foram mineradas na prova de trabalho Ethereum. Uma descrição análoga deste processo para a prova de participação Ethereum pode ser encontrada [aqui](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos). -1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [ conta ](/developers/docs/accounts/). +1. Um usuário escreve e assina uma solicitação de [transação](/developers/docs/transactions/) com a chave privada de alguma [conta](/developers/docs/accounts/). 2. O usuário transmite a solicitação de transação para toda a rede Ethereum de algum [nó](/developers/docs/nodes-and-clients/). 3. Ao ouvir tomar conhecimento da nova solicitação de transação, cada nó na rede Ethereum adiciona a solicitação ao seu mempool local, uma lista de todas as solicitações de transação sobre as quais eles têm conhecimento que ainda não foram confirmadas na blockchain em um bloco. 4. Em algum ponto, um nó de mineração agrega várias dezenas ou centenas de solicitações de transação a um [bloco](/developers/docs/blocks/) potencial, de uma forma que maximiza as [taxas de transação](/developers/docs/gas/) que eles ganham enquanto ainda estão abaixo do limite de gás de bloco. Então, o nó de mineração: From c8fc6c2aaaff8aef592ba0868ab7484f21d24445 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:54:41 -0800 Subject: [PATCH 383/478] fix: md link syntax --- public/content/translations/id/decentralized-identity/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/id/decentralized-identity/index.md b/public/content/translations/id/decentralized-identity/index.md index 4d20538b14a..3b451cc89bc 100644 --- a/public/content/translations/id/decentralized-identity/index.md +++ b/public/content/translations/id/decentralized-identity/index.md @@ -171,7 +171,7 @@ Ada banyak proyek ambisius yang menggunakan Ethereum sebagai landasan untuk solu - [Apa itu Ethereum ERC725? Manajemen Identitas Mandiri di Rantai Blok](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _Sam Town_ - [Bagaimana Rantai Blok Dapat Memecahkan Masalah Identitas Digital](https://time.com/6142810/proof-of-humanity/) — _Andrew R. Chow_ - [Apa Itu Identitas Terdesentralisasi Dan Mengapa Anda Harus Peduli?](https://web3.hashnode.com/what-is-decentralized-identity) — _Emmanuel Awosika_ -- Pendahuluan tentang Identitas Terdesentralisasi — _Dominik Beron_ +- [Pendahuluan tentang Identitas Terdesentralisasi](https://walt.id/white-paper/digital-identity) — _Dominik Beron_ ### Video {#videos} From 6a924f5fd50654f6d32bfbe9c57533d224fa03b7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:08:17 -0800 Subject: [PATCH 384/478] revert: merge year change --- src/intl/it/page-what-is-ethereum.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/it/page-what-is-ethereum.json b/src/intl/it/page-what-is-ethereum.json index 21d653181d8..0093552a3e1 100644 --- a/src/intl/it/page-what-is-ethereum.json +++ b/src/intl/it/page-what-is-ethereum.json @@ -79,7 +79,7 @@ "page-what-is-ethereum-criminal-activity-desc-2": "Secondo i risultati chiave di un rapporto recente dell'Europol, l'Agenzia dell'Unione europea per la Cooperazione delle Forze dell'Ordine, le cripto sono usate molto meno delle valute legali per scopi criminali:", "page-what-is-ethereum-criminal-activity-desc-3": "\"L'uso delle criptovalute per attività illecite sembra interessare solo una piccola parte dell'economia complessiva della criptovaluta e sembra essere comparativamente inferiore alla quantità di fondi illeciti coinvolti nella finanza tradizionale.\"", "page-what-is-ethereum-energy-title": "E il consumo energetico di Ethereum invece?", - "page-what-is-ethereum-energy-desc-1": "Il 15 settembre 2002, Ethereum ha eseguito l'aggiornamento della fusione per la transizione di Ethereum da proof-of-work a proof-of-stake.", + "page-what-is-ethereum-energy-desc-1": "Il 15 settembre 2022, Ethereum ha eseguito l'aggiornamento della fusione per la transizione di Ethereum da proof-of-work a proof-of-stake.", "page-what-is-ethereum-energy-desc-2": "Il Merge è stato l'aggiornamento più grande di Ethereum, e ha ridotto il consumo di energia richiesto per proteggere l'ecosistema del 99.95%, creando un network più sicuro per un costo minore. Ethereum adesso è una Blockchain \"low-carbon\", mentre aumenta la propria sicurezza e scalabilità.", "page-what-is-ethereum-more-on-energy-consumption": "Maggiori informazioni sul consumo energetico", "page-what-is-ethereum-energy-consumption-chart-legend": "Consumo di energia annuale in TWh/anno", From 281e543e00b2d36a8da92ae38509546c08c77a7d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:11:15 -0800 Subject: [PATCH 385/478] fix: Ethereum spelling --- src/intl/pcm/page-wallets.json | 2 +- src/intl/pcm/page-what-is-ethereum.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/intl/pcm/page-wallets.json b/src/intl/pcm/page-wallets.json index 7297af1434b..6b80e39722f 100644 --- a/src/intl/pcm/page-wallets.json +++ b/src/intl/pcm/page-wallets.json @@ -28,7 +28,7 @@ "page-wallets-keys-to-safety": "Key wey you fit yus kip yor crypto safe", "page-wallets-manage-funds": "One App wey yu fit manaj yor funds", "page-wallets-manage-funds-desc": "Yor wallet go show yor balans, transashon history and e go give yu hau you fit take send/risiv funds. Some wallet dey do more things.", - "page-wallets-meta-description": "Wetin yu nid sabi yus ethreum wallets for.", + "page-wallets-meta-description": "Wetin yu nid sabi yus Ethereum wallets for.", "page-wallets-meta-title": "Ethereum wallets", "page-wallets-mobile": "Mobile aplikashons wey fit make yu asess yor money from anywia", "page-wallets-more-on-dapps-btn": "More on dapps", diff --git a/src/intl/pcm/page-what-is-ethereum.json b/src/intl/pcm/page-what-is-ethereum.json index 2f7546b469b..b6edcc2345f 100644 --- a/src/intl/pcm/page-what-is-ethereum.json +++ b/src/intl/pcm/page-what-is-ethereum.json @@ -65,7 +65,7 @@ "page-what-is-ethereum-explore-applications": "Kome shek aplikashons", "page-what-is-ethereum-learn-defi": "Kom learn about DeFi", "page-what-is-ethereum-who-runs-ethereum-title": "Who dey run Ethereum?", - "page-what-is-ethereum-who-runs-ethereum-desc-1": "Ethereum nor dey unda di kontrol of any paticula pipol abi tin. E dey exist anytaim wen komputas wey konet dey run software wey dey follow d Etereumd protocol and dey add to di Ethereum blockchain. Ish of dis komputas dem sabi as node. Anybody fit run nodes, aldoh if yu wont patisipate for sikurin di netwok, yu go nid stake ETH (Ethereum’s native token). Anybody wey get 32 ETH fit do dis without any pamishon.", + "page-what-is-ethereum-who-runs-ethereum-desc-1": "Ethereum nor dey unda di kontrol of any paticula pipol abi tin. E dey exist anytaim wen komputas wey konet dey run software wey dey follow d Etereum protocol and dey add to di Ethereum blockchain. Ish of dis komputas dem sabi as node. Anybody fit run nodes, aldoh if yu wont patisipate for sikurin di netwok, yu go nid stake ETH (Ethereum’s native token). Anybody wey get 32 ETH fit do dis without any pamishon.", "page-what-is-ethereum-who-runs-ethereum-desc-2": "Even di Ethereum sorse kode nor dey kome from one singol entity. Anybody fit sujest shanges to di protokol and diskus upgrades. Dem get plenti implimentashon of di Ethereum protocol wey dey come from independent organizashons for diferen programin languaj, and dem usually dey built for di open and dey enkoraj kontribushons from di komunity.", "page-what-is-ethereum-run-a-node": "Run node", "page-what-is-ethereum-smart-contract-title": "What are smart contracts?", From f9e35294b74e26b34d9837cacc665a589efb1a58 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:15:09 -0800 Subject: [PATCH 386/478] fix: whitespace, name capitalization --- src/intl/hu/page-about.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/intl/hu/page-about.json b/src/intl/hu/page-about.json index e6d02a34173..1a93297472c 100644 --- a/src/intl/hu/page-about.json +++ b/src/intl/hu/page-about.json @@ -9,15 +9,15 @@ "page-about-li-4": "bevezetett", "page-about-link-1": "A könyvtár forráskódja az \"MIT License\" által engedélyezett", "page-about-link-2": "GitHub", - "page-about-link-3": "A folyamatban lévő feladatok teljes listájának megtekintése a Github-on", + "page-about-link-3": "A folyamatban lévő feladatok teljes listájának megtekintése a GitHub-on", "page-about-link-4": "Csatlakozzon a Discord szerverünkhöz", "page-about-link-5": "Lépj velünk kapcsolatba a Twitteren", - "page-about-link-6": "A bevezetett feladatok teljes listájának megtekintése a Github-on", - "page-about-link-7": "Hiba jelentése a Github-on", + "page-about-link-6": "A bevezetett feladatok teljes listájának megtekintése a GitHub-on", + "page-about-link-7": "Hiba jelentése a GitHub-on", "page-about-p-1": "Az ethereum.org megalapítása óta a működésünk átláthatóságára törekszünk. Ez az egyik alapértékünk, mert hiszünk abban, hogy a transzparencia a meghatározó alappillére az Ethereum sikerének.", "page-about-p-2": "Az általunk használt", "page-about-p-3": "az elsődleges projektmenedzsment eszközünk. Feladatainkat 3 kategóriába szervezzük:", - "page-about-p-4": " Mindent megteszünk, hogy a közösséget tájékoztassuk a feladatok aktuális állapotáról.", + "page-about-p-4": "Mindent megteszünk, hogy a közösséget tájékoztassuk a feladatok aktuális állapotáról.", "page-about-p-5": "Bevezetett feladataink.", "page-about-p-6": "A bevezetésre váró feladataink.", "page-about-p-7": "Befejezett feladatok.", From 2dfc878bf2108ad6dde7f9159d78ca0965073ed1 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Tue, 20 Feb 2024 17:21:05 -0800 Subject: [PATCH 387/478] revert: `featured` class; use FeaturedText --- .../es/developers/docs/programming-languages/delphi/index.md | 4 ++-- .../es/developers/docs/programming-languages/dot-net/index.md | 2 +- .../es/developers/docs/programming-languages/golang/index.md | 2 +- .../es/developers/docs/programming-languages/java/index.md | 2 +- .../es/developers/docs/programming-languages/python/index.md | 2 +- .../es/developers/docs/programming-languages/ruby/index.md | 2 +- .../es/developers/docs/programming-languages/rust/index.md | 2 +- .../a-developers-guide-to-ethereum-part-one/index.md | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/public/content/translations/es/developers/docs/programming-languages/delphi/index.md b/public/content/translations/es/developers/docs/programming-languages/delphi/index.md index 56885d21a30..29f86306d85 100644 --- a/public/content/translations/es/developers/docs/programming-languages/delphi/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/delphi/index.md @@ -5,11 +5,11 @@ lang: es incomplete: true --- - + Utiliza Ethereum para crear aplicaciones descentralizadas (o "dapps"), que aprovechan las ventajas de las criptomonedas y la tecnología de blockchain. Estas dapps pueden ser fiables, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Pueden controlar los activos digitales para crear nuevos tipos de aplicaciones financieras. Estas aplicaciones pueden ser descentralizadas, lo que significa que ninguna entidad o persona las controla y, por lo tanto, son prácticamente imposibles de censurar. diff --git a/public/content/translations/es/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/es/developers/docs/programming-languages/dot-net/index.md index 15fb82657d1..63a50d602af 100644 --- a/public/content/translations/es/developers/docs/programming-languages/dot-net/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/dot-net/index.md @@ -5,7 +5,7 @@ lang: es incomplete: true --- - +Aprende cómo desarrollar para Ethereum mediante proyectos y herramientas basados en .NET Utiliza Ethereum para crear aplicaciones descentralizadas (o "dapps"), que aprovechan las ventajas de las criptomonedas y la tecnología de blockchain. Estas dapps pueden ser confiables, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Pueden controlar los activos digitales para crear nuevos tipos de aplicaciones financieras. Estas aplicaciones pueden ser descentralizadas, lo que significa que ninguna entidad o persona las controla y, por lo tanto, son prácticamente imposibles de censurar. diff --git a/public/content/translations/es/developers/docs/programming-languages/golang/index.md b/public/content/translations/es/developers/docs/programming-languages/golang/index.md index dc143489638..55c10e8c8c2 100644 --- a/public/content/translations/es/developers/docs/programming-languages/golang/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/golang/index.md @@ -5,7 +5,7 @@ lang: es incomplete: true --- - +Aprende a desarrollar para Ethereum mediante proyectos y herramientas basados en Go Usa Ethereum para crear aplicaciones descentralizadas (o "dapps"). Estas dapps pueden ser confiables, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Son descentralizadas, lo que significa que funcionan en una red de punto a punto, y no hay un único punto de fracaso. Ninguna entidad o persona las controla y es casi imposible censurarlas. Pueden controlar los activos digitales para crear nuevos tipos de aplicaciones. diff --git a/public/content/translations/es/developers/docs/programming-languages/java/index.md b/public/content/translations/es/developers/docs/programming-languages/java/index.md index 2fa80c28064..06379a63918 100644 --- a/public/content/translations/es/developers/docs/programming-languages/java/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/java/index.md @@ -5,7 +5,7 @@ lang: es incomplete: true --- - +Aprende cómo desarrollar para Ethereum mediante proyectos y herramientas basados en Java Utiliza Ethereum para crear aplicaciones descentralizadas (o "dapps"), que aprovechan las ventajas de las criptomonedas y la tecnología de blockchain. Estas dapps pueden ser fiables, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Pueden controlar los activos digitales para crear nuevos tipos de aplicaciones financieras. Estas aplicaciones pueden ser descentralizadas, es decir, ninguna entidad o persona las controla y, por lo tanto, son prácticamente imposibles de censurar. diff --git a/public/content/translations/es/developers/docs/programming-languages/python/index.md b/public/content/translations/es/developers/docs/programming-languages/python/index.md index 56b14d792c9..d243db26053 100644 --- a/public/content/translations/es/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/python/index.md @@ -5,7 +5,7 @@ lang: es incomplete: true --- - +Aprende cómo desarrollar para Ethereum mediante proyectos y herramientas basados en Python Utiliza Ethereum para crear aplicaciones descentralizadas (o "dapps"), que aprovechan las ventajas de las criptomonedas y la tecnología de blockchain. Estas dapps pueden ser confiables, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Pueden controlar los activos digitales para crear nuevos tipos de aplicaciones financieras. Estas aplicaciones pueden ser descentralizadas, lo que significa que ninguna entidad o persona las controla y, por lo tanto, son prácticamente imposibles de censurar. diff --git a/public/content/translations/es/developers/docs/programming-languages/ruby/index.md b/public/content/translations/es/developers/docs/programming-languages/ruby/index.md index 0f082a7691c..5ec548ac9b8 100644 --- a/public/content/translations/es/developers/docs/programming-languages/ruby/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/ruby/index.md @@ -5,7 +5,7 @@ lang: es incomplete: false --- - +Aprende cómo desarrollar para Ethereum mediante proyectos y herramientas basados en Rust. Utiliza Ethereum para crear aplicaciones descentralizadas (o "dapps"), que aprovechan las ventajas de las criptomonedas y la tecnología de blockchain. Estas dapps pueden ser trustless, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Controlan activos digitales para crear nuevos tipos de aplicaciones financieras. Estas aplicaciones pueden ser descentralizadas, es decir, ninguna entidad o persona las controla y, por lo tanto, son prácticamente imposibles de censurar. diff --git a/public/content/translations/es/developers/docs/programming-languages/rust/index.md b/public/content/translations/es/developers/docs/programming-languages/rust/index.md index 8281f77c43f..c12cd6fdec5 100644 --- a/public/content/translations/es/developers/docs/programming-languages/rust/index.md +++ b/public/content/translations/es/developers/docs/programming-languages/rust/index.md @@ -5,7 +5,7 @@ lang: es incomplete: true --- - +Aprende cómo desarrollar para Ethereum mediante proyectos y herramientas basados en Rust Utiliza Ethereum para crear aplicaciones descentralizadas (o "dapps"), que aprovechan las ventajas de las criptomonedas y la tecnología de blockchain. Estas dapps pueden ser fiables, lo que significa que, una vez implementadas en Ethereum, siempre se ejecutan tal y como se programaron. Pueden controlar los activos digitales para crear nuevos tipos de aplicaciones financieras. Estas aplicaciones pueden ser descentralizadas, es decir, ninguna entidad o persona las controla y, por lo tanto, son prácticamente imposibles de censurar. diff --git a/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md index d3fa3e1521b..7830222486d 100644 --- a/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md +++ b/public/content/translations/es/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -41,7 +41,7 @@ Hay muchas maneras de describir Ethereum, pero en su esencia es una cadena de bl Cada [bloque](/developers/docs/blocks/) tiene una referencia al bloque anterior; el `parentHash` es el hash a ese bloque previo. - +Nota: Ethereum hace un uso regular de las funciones hash para producir valores de tamaño fijo («hashes»). Los hashes desempeñan un importante papel en Ethereum; por ahora, puede considerarlos como identificadores únicos. ![Un diagrama que representa a la cadena de bloques incluyendo datos dentro de cada bloque](./blockchain-diagram.png) @@ -57,7 +57,7 @@ Este nuevo conjunto de tecnologías descentralizadas ha generado nuevas herramie Los desarrolladores de Python que quieran interactuar con Ethereum seguramente quieran usar [Web3.py](https://web3py.readthedocs.io/). Web3.py es una biblioteca que simplifica la forma en la que puede conectarse a un nodo de Ethereum para luego enviar y recibir datos de él. - +Nota: «nodo de Ethereum» y «cliente de Ethereum» se usan de forma indistinta. En cualquier caso, se refiere al software que ejecuta un participante de la red Ethereum. Este software puede leer datos de bloques, recibir actualizaciones cuando se agregan nuevos bloques a la cadena, transmitir nuevas transacciones y más. Técnicamente, el cliente es el software y el nodo es la computadora que ejecuta el software. Los [clientes de Ethereum](/developers/docs/nodes-and-clients/) pueden configurarse para que sean accesibles por [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP o Websockets, por lo que Web3.py necesitará reflejar esta configuración. Web3.py se refiere a estas opciones de conexión como **proveedores**. Tendrá que elegir uno de los tres proveedores para vincular la instancia de Web3.py a su nodo. From e91b336c4b30f22f90cd795b31f3622857f922fd Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:45:41 +0000 Subject: [PATCH 388/478] Use header as H1 if title missing --- src/components/Hero/HubHero/index.tsx | 30 +++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/components/Hero/HubHero/index.tsx b/src/components/Hero/HubHero/index.tsx index 968940a3662..0b917acbef4 100644 --- a/src/components/Hero/HubHero/index.tsx +++ b/src/components/Hero/HubHero/index.tsx @@ -13,8 +13,8 @@ const HubHero = ({ buttons, }: CommonHeroProps) => { if (buttons && buttons.length > 2) { - throw Error( - "Can not have more than two call-to-action buttons in this hero component." + throw new Error( + "Cannot have more than two call-to-action buttons in this hero component." ) } @@ -49,21 +49,25 @@ const HubHero = ({ backdropBlur={{ xl: "base" }} wordBreak="break-word" > - - {title} - + {title ? ( + + {title} + + ) : null} - {header} + + {header} + {description} @@ -77,4 +81,4 @@ const HubHero = ({ ) } -export default HubHero +export default HubHero; From 0d8bb14ba0c32a83309a82a856845981d1e999eb Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 13:46:27 +0000 Subject: [PATCH 389/478] Fix error syntax --- src/components/Hero/HubHero/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Hero/HubHero/index.tsx b/src/components/Hero/HubHero/index.tsx index 0b917acbef4..05770a716e5 100644 --- a/src/components/Hero/HubHero/index.tsx +++ b/src/components/Hero/HubHero/index.tsx @@ -14,7 +14,7 @@ const HubHero = ({ }: CommonHeroProps) => { if (buttons && buttons.length > 2) { throw new Error( - "Cannot have more than two call-to-action buttons in this hero component." + "Can not have more than two call-to-action buttons in this hero component." ) } @@ -81,4 +81,4 @@ const HubHero = ({ ) } -export default HubHero; +export default HubHero From 5748953fb9b402b1104b89256a4aa4f058865eb3 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:17:40 +0000 Subject: [PATCH 390/478] Add H1 to bug bounty page --- src/pages/bug-bounty.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/pages/bug-bounty.tsx b/src/pages/bug-bounty.tsx index 4723c938309..e6a75d3d3d0 100644 --- a/src/pages/bug-bounty.tsx +++ b/src/pages/bug-bounty.tsx @@ -5,6 +5,7 @@ import { serverSideTranslations } from "next-i18next/serverSideTranslations" import { Box, Center, + Heading, ListItem, UnorderedList, useColorModeValue, @@ -103,18 +104,21 @@ const Subtitle = (props: ChildOnlyProp) => ( const SloganGradient = (props: ChildOnlyProp) => ( - {props.children} + + {props.children} + ) From b5b0200407e9d713abf83680bd673729d158e7e9 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:27:56 +0000 Subject: [PATCH 391/478] Add H1 to zero knowledge proofs pages --- public/content/translations/de/zero-knowledge-proofs/index.md | 2 +- public/content/translations/es/zero-knowledge-proofs/index.md | 2 +- public/content/translations/fa/zero-knowledge-proofs/index.md | 2 +- public/content/translations/fil/zero-knowledge-proofs/index.md | 2 +- public/content/translations/fr/zero-knowledge-proofs/index.md | 2 +- public/content/translations/hi/zero-knowledge-proofs/index.md | 2 +- public/content/translations/hu/zero-knowledge-proofs/index.md | 2 +- public/content/translations/it/zero-knowledge-proofs/index.md | 2 +- public/content/translations/ja/zero-knowledge-proofs/index.md | 2 +- public/content/translations/pl/zero-knowledge-proofs/index.md | 2 +- .../content/translations/pt-br/zero-knowledge-proofs/index.md | 2 +- public/content/translations/ru/zero-knowledge-proofs/index.md | 2 +- public/content/translations/tr/zero-knowledge-proofs/index.md | 2 +- public/content/translations/uk/zero-knowledge-proofs/index.md | 2 +- .../content/translations/zh-tw/zero-knowledge-proofs/index.md | 2 +- public/content/translations/zh/zero-knowledge-proofs/index.md | 2 +- public/content/zero-knowledge-proofs/index.md | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/public/content/translations/de/zero-knowledge-proofs/index.md b/public/content/translations/de/zero-knowledge-proofs/index.md index 1b6e11d2316..986b91b2318 100644 --- a/public/content/translations/de/zero-knowledge-proofs/index.md +++ b/public/content/translations/de/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Eine nicht-technische Einführung in Null-Wissen-Beweise für Anfä lang: de --- -## Was sind Null-Wissen-Beweise? {#what-are-zk-proofs} +# Was sind Null-Wissen-Beweise? {#what-are-zk-proofs} Ein Null-Wissen-Beweis ist eine Methode, um die Gültigkeit einer Aussage zu beweisen, ohne die Aussage selbst offenzulegen. Der „Beweisanführer“ ist die Partei, die versucht, eine Aussage zu beweisen, während der „Verifizierer“ für die Validierung der Aussage verantwortlich ist. diff --git a/public/content/translations/es/zero-knowledge-proofs/index.md b/public/content/translations/es/zero-knowledge-proofs/index.md index 7c3355f6aa7..5dd6b4331ba 100644 --- a/public/content/translations/es/zero-knowledge-proofs/index.md +++ b/public/content/translations/es/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Introducción no técnica a pruebas de conocimiento cero para princ lang: es --- -## ¿Qué son las pruebas de conocimiento cero? {#what-are-zk-proofs} +# ¿Qué son las pruebas de conocimiento cero? {#what-are-zk-proofs} Una prueba de conocimiento cero es una forma de probar la validez de una sentencia sin revelar la sentencia en sí. El "probador" (también conocido como tirador de pruebas) es la parte que intenta probar o demostrar una afirmación, mientras que el "verificador" es el responsable de validarla. diff --git a/public/content/translations/fa/zero-knowledge-proofs/index.md b/public/content/translations/fa/zero-knowledge-proofs/index.md index 0859706939d..1df97ca54b6 100644 --- a/public/content/translations/fa/zero-knowledge-proofs/index.md +++ b/public/content/translations/fa/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: یک مقدمه غیرتخصصی درباره اثبات دانش lang: fa --- -## اثبات دانش صفر چیست؟ {#what-are-zk-proofs} +# اثبات دانش صفر چیست؟ {#what-are-zk-proofs} اثبات دانش صفر، روشی برای اثبات اعتبار یک گزاره بدون افشای خود گزاره است. «ثابت کننده» طرفی است که تلاش می کند ادعایی را ثابت کند، در حالی که «تایید کننده» مسئولیت تایید آن ادعا را دارد. diff --git a/public/content/translations/fil/zero-knowledge-proofs/index.md b/public/content/translations/fil/zero-knowledge-proofs/index.md index d0f39b461e5..64f9df3aa6c 100644 --- a/public/content/translations/fil/zero-knowledge-proofs/index.md +++ b/public/content/translations/fil/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Isang hindi teknikal na panimula sa mga zero-knowledge proof para s lang: fil --- -## Ano ang mga zero-knowledge proof? {#what-are-zk-proofs} +# Ano ang mga zero-knowledge proof? {#what-are-zk-proofs} Ang zero-knowledge proof ay isang paraan para patunayan ang validity ng isang pahayag nang hindi ipinapakita ang mismong pahayag. Ang ‘prover’ ang partidong sumusubok na patunayan ang isang pahayag, samantalang ang ‘verifier’ ang responsable sa pag-validate ng claim. diff --git a/public/content/translations/fr/zero-knowledge-proofs/index.md b/public/content/translations/fr/zero-knowledge-proofs/index.md index faf22b6fd6f..0ffe42025cb 100644 --- a/public/content/translations/fr/zero-knowledge-proofs/index.md +++ b/public/content/translations/fr/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Une introduction non technique aux preuves à divulgation nulle de lang: fr --- -## Que sont les preuves à divulgation nulle de connaissance ? {#what-are-zk-proofs} +# Que sont les preuves à divulgation nulle de connaissance ? {#what-are-zk-proofs} Une preuve à divulgation nulle est un moyen de prouver la validité d'une information sans révéler l'information elle-même. Le « prouveur » est la partie qui tente de prouver une affirmation, tandis que le « vérificateur » est responsable de la validation de l'affirmation. diff --git a/public/content/translations/hi/zero-knowledge-proofs/index.md b/public/content/translations/hi/zero-knowledge-proofs/index.md index 9c03b14abf8..3293cb39a95 100644 --- a/public/content/translations/hi/zero-knowledge-proofs/index.md +++ b/public/content/translations/hi/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: शुरुआती लोगों के लिए शून् lang: hi --- -## शून्य ज्ञान प्रमाण क्या होते है? {#what-are-zk-proofs} +# शून्य ज्ञान प्रमाण क्या होते है? {#what-are-zk-proofs} शून्य ज्ञान प्रमाण एक तरीका है जिससे किसी कथन की वैधता साबित करते हैं बिना उस कथन को उजागर किए। 'सिद्धकर्ता' वह पक्ष है जो एक दावे को साबित करने की कोशिश करते हैं, वहीं 'सत्यापनकर्ता' वह पक्ष है जो दावे को मान्यता देने के जिम्मेदार होते हैं। diff --git a/public/content/translations/hu/zero-knowledge-proofs/index.md b/public/content/translations/hu/zero-knowledge-proofs/index.md index dead07c9fe6..e548b01b01a 100644 --- a/public/content/translations/hu/zero-knowledge-proofs/index.md +++ b/public/content/translations/hu/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: A zero-knowledge bizonyítékok nem technikai bemutatása kezdők s lang: hu --- -## Mik azok a zero-knowledge (nullaismeret-alapú) bizonyítékok? {#what-are-zk-proofs} +# Mik azok a zero-knowledge (nullaismeret-alapú) bizonyítékok? {#what-are-zk-proofs} A zero-knowledge bizonyíték annak módja, hogy egy állítás érvényességét úgy igazoljuk, hogy magát az állítást nem fedjük fel. A bizonyító próbálja az állítást elfogadtatni, miközben az ellenőrző felelős annak validálásáért. diff --git a/public/content/translations/it/zero-knowledge-proofs/index.md b/public/content/translations/it/zero-knowledge-proofs/index.md index 75822492f72..df8faa39f59 100644 --- a/public/content/translations/it/zero-knowledge-proofs/index.md +++ b/public/content/translations/it/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Un introduzione "non tecnica" per i principianti sulle prove a cono lang: it --- -## Cosa sono le prove a conoscenza zero? {#what-are-zk-proofs} +# Cosa sono le prove a conoscenza zero? {#what-are-zk-proofs} Una prova a conoscenza zero è un modo per provare la validità di una dichiarazione senza rivelarla. Il 'dimostratore' è la parte che tenta di provare una rivendicazione, mentre il 'validatore' è responsabile della sua convalida. diff --git a/public/content/translations/ja/zero-knowledge-proofs/index.md b/public/content/translations/ja/zero-knowledge-proofs/index.md index cb2f09e84d0..0d68f3767f2 100644 --- a/public/content/translations/ja/zero-knowledge-proofs/index.md +++ b/public/content/translations/ja/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: 一般向けのゼロ知識証明入門 lang: ja --- -## ゼロ知識証明とは何か {#what-are-zk-proofs} +# ゼロ知識証明とは何か {#what-are-zk-proofs} ゼロ知識証明は、証明したい主張そのものを明らかにすることなく、主張の妥当性を証明する方法です。 主張を証明しようとする側を「証明者」とよび、主張の検証に責任を持つ側を「検証者」とよびます。 diff --git a/public/content/translations/pl/zero-knowledge-proofs/index.md b/public/content/translations/pl/zero-knowledge-proofs/index.md index dffae9ed019..895b442e28e 100644 --- a/public/content/translations/pl/zero-knowledge-proofs/index.md +++ b/public/content/translations/pl/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Nietechniczne wprowadzenie do dowodów wiedzy zerowej dla początku lang: pl --- -## Czym są dowody wiedzy zerowej? {#what-are-zk-proofs} +# Czym są dowody wiedzy zerowej? {#what-are-zk-proofs} Dowód o wiedzy zerowej to sposób na udowodnienie ważności stwierdzenia bez ujawniania samego stwierdzenia. „Udowadniający” jest stroną próbującą udowodnić twierdzenie, podczas gdy „weryfikator” jest odpowiedzialny za walidację twierdzenia. diff --git a/public/content/translations/pt-br/zero-knowledge-proofs/index.md b/public/content/translations/pt-br/zero-knowledge-proofs/index.md index 6aafda6c72a..9c379a7d0cd 100644 --- a/public/content/translations/pt-br/zero-knowledge-proofs/index.md +++ b/public/content/translations/pt-br/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Uma introdução não técnica às provas de conhecimento zero para lang: pt-br --- -## O que são provas de conhecimento zero? {#what-are-zk-proofs} +# O que são provas de conhecimento zero? {#what-are-zk-proofs} Uma prova de conhecimento zero é uma forma de provar a validade de uma afirmação sem a revelar. O “provador” é a parte que tenta provar uma reivindicação, enquanto o “verificador” é responsável pela validação da reivindicação. diff --git a/public/content/translations/ru/zero-knowledge-proofs/index.md b/public/content/translations/ru/zero-knowledge-proofs/index.md index 4fa23655a2e..d8e621feb71 100644 --- a/public/content/translations/ru/zero-knowledge-proofs/index.md +++ b/public/content/translations/ru/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Введение в доказательства с нулевым lang: ru --- -## Что такое доказательства с нулевым разглашением? {#what-are-zk-proofs} +# Что такое доказательства с нулевым разглашением? {#what-are-zk-proofs} Доказательство с нулевым разглашением — это способ доказать действительность утверждения без раскрытия самого утверждения. Доказывающий — сторона, которая пытается доказать заявление, а проверяющий отвечает за проверку заявления. diff --git a/public/content/translations/tr/zero-knowledge-proofs/index.md b/public/content/translations/tr/zero-knowledge-proofs/index.md index 53678f092c1..5a7067c66fe 100644 --- a/public/content/translations/tr/zero-knowledge-proofs/index.md +++ b/public/content/translations/tr/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Yeni başlayanlar için sıfır bilgili ispatlara teknik olmayan bi lang: tr --- -## Sıfır bilgili ispatlar nelerdir? {#what-are-zk-proofs} +# Sıfır bilgili ispatlar nelerdir? {#what-are-zk-proofs} Sıfır bilgili ispat, ifadenin kendisini açığa çıkarmadan bir ifadenin geçerliliğini kanıtlamanın bir yoludur. "Kanıtlayıcı", bir iddiayı kanıtlamaya çalışan taraftır, "doğrulayıcı" ise iddiayı doğrulamaktan sorumludur. diff --git a/public/content/translations/uk/zero-knowledge-proofs/index.md b/public/content/translations/uk/zero-knowledge-proofs/index.md index ce0a6e0b69f..cdf90013abc 100644 --- a/public/content/translations/uk/zero-knowledge-proofs/index.md +++ b/public/content/translations/uk/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: Ознайомлення з поняттям доказу з нул lang: uk --- -## Що таке доказ із нульовим розголошенням? {#what-are-zk-proofs} +# Що таке доказ із нульовим розголошенням? {#what-are-zk-proofs} Доказ із нульовим розголошенням — це спосіб доведення правдивості твердження без розкриття самого твердження. Сторона, що доводить, — це особа, яка намагається довести твердження, а сторона, що перевіряє, відповідає за перевірку правдивості твердження. diff --git a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md index a5146ef31eb..1c904cc40da 100644 --- a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: 零知識證明的非技術性介紹,適合新手閱讀。 lang: zh-tw --- -## 什麼是零知識證明? {#what-are-zk-proofs} +# 什麼是零知識證明? {#what-are-zk-proofs} 零知識證明能證明某陳述有效、卻又無需揭示陳述本身。 「證明者」是試圖證明主張的一方,「驗證者」則負責驗證該主張。 diff --git a/public/content/translations/zh/zero-knowledge-proofs/index.md b/public/content/translations/zh/zero-knowledge-proofs/index.md index ec74c288e55..90f7b4e64b1 100644 --- a/public/content/translations/zh/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: 面向初学者的非技术性零知识证明介绍 lang: zh --- -## 什么是零知识证明? {#what-are-zk-proofs} +# 什么是零知识证明? {#what-are-zk-proofs} 零知识证明是能够在不披露声明本身的情况下,验证声明有效性的一种方法。 “证明者”是试图证明声明的一方,而“验证者”则负责验证声明。 diff --git a/public/content/zero-knowledge-proofs/index.md b/public/content/zero-knowledge-proofs/index.md index a045a3a2ef1..b2978b10f90 100644 --- a/public/content/zero-knowledge-proofs/index.md +++ b/public/content/zero-knowledge-proofs/index.md @@ -4,7 +4,7 @@ description: An non-technical introduction to zero-knowledge proofs for beginner lang: en --- -## What are zero-knowledge proofs? {#what-are-zk-proofs} +# What are zero-knowledge proofs? {#what-are-zk-proofs} A zero-knowledge proof is a way of proving the validity of a statement without revealing the statement itself. The ‘prover’ is the party trying to prove a claim, while the ‘verifier’ is responsible for validating the claim. From 7940093f051b2718b9b67e7ad29abebbad5d80bb Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:31:23 +0000 Subject: [PATCH 392/478] Add H1 to content standardization pages --- .../contributing/style-guide/content-standardization/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/content/contributing/style-guide/content-standardization/index.md b/public/content/contributing/style-guide/content-standardization/index.md index fb92e55c25f..1d52685f12a 100644 --- a/public/content/contributing/style-guide/content-standardization/index.md +++ b/public/content/contributing/style-guide/content-standardization/index.md @@ -4,6 +4,8 @@ description: Guide to use consistent terminology in content writing lang: en --- +# Content standardization {#content-standardization} + This style guide aims to standardize certain aspects of writing content to make the contribution process smoother. ## Use American English {#american-english} From a0f5f6bfb184a00e570f3e4966ba1eecb4566935 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:25:56 +0000 Subject: [PATCH 393/478] Add H1 to adding design resources pages --- .../contributing/design/adding-design-resources/index.md | 2 ++ .../de/contributing/design/adding-design-resources/index.md | 2 ++ .../es/contributing/design/adding-design-resources/index.md | 2 ++ .../fr/contributing/design/adding-design-resources/index.md | 2 ++ .../it/contributing/design/adding-design-resources/index.md | 2 ++ .../pt-br/contributing/design/adding-design-resources/index.md | 2 ++ .../tr/contributing/design/adding-design-resources/index.md | 2 ++ 7 files changed, 14 insertions(+) diff --git a/public/content/contributing/design/adding-design-resources/index.md b/public/content/contributing/design/adding-design-resources/index.md index 4666100ad8e..c04ff949870 100644 --- a/public/content/contributing/design/adding-design-resources/index.md +++ b/public/content/contributing/design/adding-design-resources/index.md @@ -4,6 +4,8 @@ description: Guidelines and requirements to ensure quality of design materials o lang: en --- +# Adding design resources {#adding-design-resources} + Anybody can suggest new design materials to the [Design and UX in web3 page](/developers/docs/design-and-ux/). Be aware that the focus of this page is on providing user value to aspiring web3 designers. The design section is not there to advertise your services, products, or platforms. 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 f295e7f13d0..6cc547b3500 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,6 +4,8 @@ description: Richtlinien und Anforderungen zur Gewährleistung der Qualität von lang: de --- +# Design-Ressourcen hinzufügen {#adding-design-resources} + Jeder kann neue Designmaterialien für die Seite [Design und UX in web3](/developers/docs/design-and-ux/) vorschlagen. Seien Sie sich bewusst, dass der Schwerpunkt dieser Seite darauf liegt, angehenden web3-Designern einen Mehrwert zu bieten. Der Designbereich ist nicht dazu da, um für Ihre Dienstleistungen, Produkte oder Plattformen zu werben. diff --git a/public/content/translations/es/contributing/design/adding-design-resources/index.md b/public/content/translations/es/contributing/design/adding-design-resources/index.md index 78a48940a41..4cc870fbf92 100644 --- a/public/content/translations/es/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/es/contributing/design/adding-design-resources/index.md @@ -4,6 +4,8 @@ description: Pautas y requerimientos para asegurar la calidad de los materiales lang: es --- +# Añadiendo recursos de diseño {#adding-design-resources} + Cualquiera puede sugerir nuevos materiales de diseño para la [página de diseño y experiencia del usuario en Web3](/developers/docs/design-and-ux/). Tenga en cuenta que la finalidad de esta página es proporcionar valor a los usuarios que aspiran ser diseñadores en Web3. La sección de diseño no está ahí para que la uses para anunciar tus servicios, productos o plataformas. diff --git a/public/content/translations/fr/contributing/design/adding-design-resources/index.md b/public/content/translations/fr/contributing/design/adding-design-resources/index.md index 9ed41c42376..3643266e869 100644 --- a/public/content/translations/fr/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/fr/contributing/design/adding-design-resources/index.md @@ -4,6 +4,8 @@ description: Directives et exigences pour garantir la qualité des matériaux de lang: fr --- +# Ajout de ressources de conception {#adding-design-resources} + Toute personne peut suggérer de nouveaux matériaux de conception à la page [Design et UX dans le web3](/developers/docs/design-and-ux/). Il est important de noter que l'objectif de cette page est de fournir une aide aux utilisateurs aspirant à devenir des concepteurs web3. Cette section n'est pas destinée à faire la publicité de vos services, produits ou plateformes. diff --git a/public/content/translations/it/contributing/design/adding-design-resources/index.md b/public/content/translations/it/contributing/design/adding-design-resources/index.md index a2f7b400f08..f696b61a581 100644 --- a/public/content/translations/it/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/it/contributing/design/adding-design-resources/index.md @@ -4,6 +4,8 @@ description: Linee guida e requisiti per assicurare la qualità dei materiali di lang: it --- +# Aggiungere risorse di progettazione {#adding-design-resources} + Chiunque può suggerire nuovi materiali di progettazione per il [design e l'UX nella pagina Web3](/developers/docs/design-and-ux/). Si prega di notare che questa pagina si occupa di fornire il valore dell'utente agli aspiranti designer in Web3. La sezione di progettazione non serve per pubblicizzare i tuoi servizi, prodotti o piattaforme. diff --git a/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md b/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md index 29f23778127..95aa42d318c 100644 --- a/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/pt-br/contributing/design/adding-design-resources/index.md @@ -4,6 +4,8 @@ description: Diretrizes e requisitos para garantir a qualidade dos materiais de lang: pt-br --- +# Adicionando recursos de design {#adding-design-resources} + Qualquer pessoa pode sugerir novos materiais de design para a página de [Design e UX na web3](/developers/docs/design-and-ux/). Esteja ciente de que o foco desta página é fornecer valor ao usuário para candidatos a designers web3. A seção de design não está lá para anunciar seus serviços, produtos ou plataformas. diff --git a/public/content/translations/tr/contributing/design/adding-design-resources/index.md b/public/content/translations/tr/contributing/design/adding-design-resources/index.md index 13173c761f7..4932e988af9 100644 --- a/public/content/translations/tr/contributing/design/adding-design-resources/index.md +++ b/public/content/translations/tr/contributing/design/adding-design-resources/index.md @@ -4,6 +4,8 @@ description: Ethereum.org'daki tasarım materyallerinin kaliteli olmasını sağ lang: tr --- +# İçerik kaynaklarını ekle {#adding-design-resources} + Herkes [Web3 sayfasında tasarım ve kullanıcı deneyimi](/developers/docs/design-and-ux/) için yeni tasarım materyalleri önerebilir. Bu sayfanın, hevesli web3 kullanıcıları için değer sunmaya odaklandığını unutmayın. Tasarım bölümü, hizmetleriniz, ürünleriniz ya da platformlarınızın reklamını yapmak için değildir. From 90d220a032faf528e19af36b31395efb6bec16e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Wed, 21 Feb 2024 12:29:41 -0300 Subject: [PATCH 394/478] chore: remove Brave wallet data --- src/data/wallets/wallet-data.ts | 47 --------------------------------- 1 file changed, 47 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 1cb1e141a44..ba8f1d63dab 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -535,53 +535,6 @@ const walletData: WalletData[] = [ "https://framelabs.notion.site/Getting-Started-Guide-775a95edec3244ce80e118ead8ea6516", documentation: "", }, - { - last_updated: "June 22, 2022", - name: "Brave Wallet", - image: BraveImage, - brand_color: "#fe1f02", - url: "https://brave.com/wallet", - wallet_live_date: "November 2021", - active_development_team: true, - languages_supported: ["en"], - twitter: "https://twitter.com/brave", - discord: "", - reddit: "https://www.reddit.com/r/brave_browser", - telegram: "", - ios: true, - android: true, - linux: false, - windows: false, - macOS: false, - firefox: false, - chromium: true, - hardware: false, - open_source: true, - repo_url: "https://github.com/brave/brave-core/ ", - non_custodial: true, - security_audit: ["asked if these are available"], - scam_protection: true, - hardware_support: true, - walletconnect: false, - rpc_importing: true, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: true, - layer_2: true, - gas_fee_customization: true, - ens_support: true, - erc_20_support: true, - eip_1559_support: true, - buy_crypto: true, - withdraw_crypto: false, - multisig: false, - social_recovery: false, - onboard_documentation: - "https://wallet-docs.brave.com/, https://support.brave.com/hc/en-us/articles/4415497656461-Brave-Wallet-FAQ", - documentation: - "https://wallet-docs.brave.com/, https://support.brave.com/hc/en-us/articles/4415497656461-Brave-Wallet-FAQ", - }, { last_updated: "June 22, 2022", name: "MetaMask", From c2b4b3ebd0cbfdecb5d6eae80029c56011fa3bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Wed, 21 Feb 2024 12:30:31 -0300 Subject: [PATCH 395/478] chore: remove MyCrypto wallet data --- src/data/wallets/wallet-data.ts | 66 --------------------------------- 1 file changed, 66 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index ba8f1d63dab..299a4eacb9a 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -947,72 +947,6 @@ const walletData: WalletData[] = [ onboard_documentation: "https://hc.foxwallet.com/docs/", documentation: "https://hc.foxwallet.com/docs/faq", }, - { - last_updated: "June 24, 2022", - name: "MyCrypto", - image: MyCryptoImage, - brand_color: "#FFFFFF", - url: "https://mycrypto.com", - wallet_live_date: "Feb, 2018", - active_development_team: true, - languages_supported: [ - "en", - "de", - "el", - "es", - "fi", - "fr", - "hu", - "id", - "it", - "jp", - "nl", - "no", - "pl", - "pt", - "ru", - "ko", - "tr", - "vi", - "zh", - "zh-tw", - ], - twitter: "https://twitter.com/mycrypto", - discord: "", - reddit: "", - telegram: "", - ios: false, - android: false, - linux: true, - windows: true, - macOS: true, - firefox: false, - chromium: false, - hardware: false, - open_source: true, - repo_url: "https://github.com/MyCryptoHQ", - non_custodial: true, - security_audit: [""], - scam_protection: false, - hardware_support: true, - walletconnect: true, - rpc_importing: true, - nft_support: false, - connect_to_dapps: true, - staking: false, - swaps: true, - layer_2: true, - gas_fee_customization: true, - ens_support: true, - erc_20_support: true, - eip_1559_support: true, - buy_crypto: true, - withdraw_crypto: false, - multisig: false, - social_recovery: false, - onboard_documentation: "https://blog.mycrypto.com", - documentation: "", - }, { last_updated: "June 24, 2022", name: "Pillar", From 4b97780d0808be2a109605a30398c1a2d65f6b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Wed, 21 Feb 2024 12:31:14 -0300 Subject: [PATCH 396/478] chore: remove ShapeShift wallet data --- src/data/wallets/wallet-data.ts | 46 --------------------------------- 1 file changed, 46 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 299a4eacb9a..44bde2d7a1a 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -2426,52 +2426,6 @@ const walletData: WalletData[] = [ documentation: "https://tahowallet.notion.site/Taho-Knowledge-Base-4d95ed5439c64d6db3d3d27abf1fdae5", }, - { - last_updated: "2023-05-01", - name: "ShapeShift Wallet", - image: ShapeShiftImage, - brand_color: "#386FF9", - url: "https://app.shapeshift.com/", - wallet_live_date: "2020-07-01", - active_development_team: true, - languages_supported: ["en", "es", "pt", "fr", "de", "tr", "ru", "uk"], - twitter: "https://twitter.com/shapeshift", - discord: "https://discord.gg/shapeshift", - reddit: "", - telegram: "https://t.me/shapeshiftofficial", - ios: true, - android: true, - linux: false, - windows: false, - macOS: false, - firefox: false, - chromium: false, - hardware: false, - open_source: true, - repo_url: "https://github.com/shapeshift/hdwallet", - non_custodial: true, - security_audit: ["https://www.defisafety.com/app/pqrs/108"], - scam_protection: false, - hardware_support: true, - walletconnect: true, - rpc_importing: false, - nft_support: true, - connect_to_dapps: true, - staking: true, - swaps: true, - multichain: true, - layer_2: true, - gas_fee_customization: true, - ens_support: true, - erc_20_support: true, - eip_1559_support: true, - buy_crypto: true, - withdraw_crypto: true, - multisig: false, - social_recovery: false, - onboard_documentation: "https://shapeshift.zendesk.com/hc/en-us/", - documentation: "https://docs.shapeshift.com/", - }, { last_updated: "2023-07-19", name: "Phantom", From 5fbed7514a59f24c5e3d00c8d06d8dd6b4574654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Wed, 21 Feb 2024 12:32:13 -0300 Subject: [PATCH 397/478] chore: remove Status wallet data --- src/data/wallets/wallet-data.ts | 71 --------------------------------- 1 file changed, 71 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 44bde2d7a1a..590deed218e 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -1514,77 +1514,6 @@ const walletData: WalletData[] = [ onboard_documentation: "https://learn.rainbow.me/", documentation: "", }, - { - last_updated: "June 30, 2022", - name: "Status", - image: StatusImage, - brand_color: "#4360DF", - url: "https://status.im/", - wallet_live_date: - "Status Mobile has been available in beta since 2017, with the 1.0 version released in Feb 2020.", - active_development_team: true, - languages_supported: [ - "ar", - "bn", - "de", - "el", - "en", - "es", - "ph", - "fr", - "hi", - "id", - "it", - "jp", - "ko", - "my", - "nl", - "pl", - "pt", - "pt-br", - "ru", - "tr", - "vi", - "zh", - "zh-tw", - ], - twitter: "https://twitter.com/ethstatus", - discord: "https://discord.gg/HGSAcAHGMA", - reddit: "https://www.reddit.com/r/statusim/", - telegram: "", - ios: true, - android: true, - linux: false, - windows: false, - macOS: false, - firefox: false, - chromium: false, - hardware: false, - open_source: true, - repo_url: "https://github.com/status-im/", - non_custodial: true, - security_audit: ["https://github.com/status-im/status-security#audits"], - scam_protection: true, - hardware_support: true, - walletconnect: true, - rpc_importing: true, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: false, - multichain: false, - layer_2: true, - gas_fee_customization: true, - ens_support: true, - erc_20_support: true, - eip_1559_support: true, - buy_crypto: true, - withdraw_crypto: false, - multisig: false, - social_recovery: false, - onboard_documentation: "https://status.im/faq/", - documentation: "https://our.status.im/", - }, { last_updated: "June 30, 2022", name: "Aktionariat", From e4c579f49019b661645282dca1300ef66a0119e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Wed, 21 Feb 2024 12:32:50 -0300 Subject: [PATCH 398/478] chore: remove Web3Auth wallet data --- src/data/wallets/wallet-data.ts | 47 --------------------------------- 1 file changed, 47 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 590deed218e..5dcb51b4095 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -1271,53 +1271,6 @@ const walletData: WalletData[] = [ onboard_documentation: "", documentation: "https://support.guarda.com/", }, - { - last_updated: "September 14, 2022", - name: "Web3Auth", - image: Web3AuthImage, - brand_color: "#0364ff", - url: "https://web3auth.io", - wallet_live_date: "Jan, 2022", - active_development_team: true, - languages_supported: ["en", "de", "ja", "ko", "zh", "es"], - twitter: "https://twitter.com/web3auth", - discord: "https://discord.gg/web3auth", - reddit: "", - telegram: "https://t.me/web3authdev", - ios: true, - android: true, - linux: false, - windows: true, - macOS: true, - firefox: true, - chromium: true, - hardware: false, - open_source: true, - repo_url: "https://github.com/web3auth/web3auth", - non_custodial: true, - security_audit: ["https://web3auth.io/docs/overview/key-management/audits"], - scam_protection: false, - hardware_support: true, - walletconnect: true, - rpc_importing: true, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: false, - multichain: true, - layer_2: true, - gas_fee_customization: true, - ens_support: true, - erc_20_support: true, - eip_1559_support: true, - buy_crypto: true, - withdraw_crypto: false, - multisig: true, - social_recovery: false, - onboard_documentation: "https://web3auth.io/docs/overview/what-is-web3auth", - documentation: "https://web3auth.io/docs/", - mpc: true, - }, { last_updated: "June 24, 2022", name: "Bridge wallet", From 49b54f4ee82e7ccb7d187a95a81ebfabaa401b8c Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:34:33 +0000 Subject: [PATCH 399/478] Add H1 to community code of conduct pages --- public/content/community/code-of-conduct/index.md | 2 ++ .../content/translations/de/community/code-of-conduct/index.md | 2 ++ .../content/translations/el/community/code-of-conduct/index.md | 2 ++ .../content/translations/es/community/code-of-conduct/index.md | 2 ++ .../content/translations/fa/community/code-of-conduct/index.md | 2 ++ .../content/translations/fr/community/code-of-conduct/index.md | 2 ++ .../content/translations/hu/community/code-of-conduct/index.md | 2 ++ .../content/translations/it/community/code-of-conduct/index.md | 2 ++ .../content/translations/pl/community/code-of-conduct/index.md | 2 ++ .../translations/pt-br/community/code-of-conduct/index.md | 2 ++ .../content/translations/ru/community/code-of-conduct/index.md | 2 ++ .../content/translations/tr/community/code-of-conduct/index.md | 2 ++ .../translations/zh-tw/community/code-of-conduct/index.md | 2 ++ .../content/translations/zh/community/code-of-conduct/index.md | 2 ++ 14 files changed, 28 insertions(+) diff --git a/public/content/community/code-of-conduct/index.md b/public/content/community/code-of-conduct/index.md index 8f14a5f8c52..0d57d4a237c 100644 --- a/public/content/community/code-of-conduct/index.md +++ b/public/content/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: The basic standards that we strive for across ethereum.org spaces. lang: en --- +# Code of conduct {#code-of-conduct} + ## Mission {#mission} To develop and maintain the most comprehensive and accessible knowledge hub for Ethereum. 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 e2332654972..3829b15aa86 100644 --- a/public/content/translations/de/community/code-of-conduct/index.md +++ b/public/content/translations/de/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Die grundlegenden Standards, die wir für alle Bereiche von ethereu lang: de --- +# Verhaltenskodex {#conduct-intro} + ## Mission {#mission} Die Entwicklung und Pflege der umfassendsten und barrierefreien Wissensplattform für Ethereum. diff --git a/public/content/translations/el/community/code-of-conduct/index.md b/public/content/translations/el/community/code-of-conduct/index.md index 322a1e10894..fb669a51e13 100644 --- a/public/content/translations/el/community/code-of-conduct/index.md +++ b/public/content/translations/el/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Τα βασικά πρότυπα που επιδιώκουμε σε lang: el --- +# Κώδικας Δεοντολογίας {#conduct-intro} + ## Αποστολή {#mission} Να αναπτύξει και να διατηρήσει τον πιο ολοκληρωμένο και προσβάσιμο κόμβο γνώσης για το Ethereum. diff --git a/public/content/translations/es/community/code-of-conduct/index.md b/public/content/translations/es/community/code-of-conduct/index.md index 4a07faf31db..a3bf1acb53b 100644 --- a/public/content/translations/es/community/code-of-conduct/index.md +++ b/public/content/translations/es/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Los estándares básicos por los que nos esforzamos en todos los es lang: es --- +# Código de conducta {#conduct-intro} + ## Misión {#mission} Desarrollar y mantener el centro de conocimiento más completo y accesible para Ethereum. diff --git a/public/content/translations/fa/community/code-of-conduct/index.md b/public/content/translations/fa/community/code-of-conduct/index.md index cfea8ebd12e..50c1b45311f 100644 --- a/public/content/translations/fa/community/code-of-conduct/index.md +++ b/public/content/translations/fa/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: استانداردهای اصلی که ما در کل فضای ethe lang: fa --- +# آیین‌نامه رفتاری {#conduct-intro} + ## مأموریت {#mission} توسعه و حفظ جامع‌ترین و دسترس‌پذیرترین مرکز دانش برای شبکۀ اتریوم. diff --git a/public/content/translations/fr/community/code-of-conduct/index.md b/public/content/translations/fr/community/code-of-conduct/index.md index 91eb91d9bea..05c07e6c81e 100644 --- a/public/content/translations/fr/community/code-of-conduct/index.md +++ b/public/content/translations/fr/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Les normes de base que nous nous efforçons de respecter dans les e lang: fr --- +# Code de conduite {#conduct-intro} + ## Mission {#mission} Développer et maintenir le centre de connaissances le plus complet et le plus accessible pour Ethereum. diff --git a/public/content/translations/hu/community/code-of-conduct/index.md b/public/content/translations/hu/community/code-of-conduct/index.md index 064d6c5f54b..b9627c28fb6 100644 --- a/public/content/translations/hu/community/code-of-conduct/index.md +++ b/public/content/translations/hu/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Alapvető szabályok az ethereum.org oldalain. lang: hu --- +# Magatartási szabályok {#conduct-intro} + ## Misszió {#mission} A legátfogóbb és legelérhetőbb tudásközpont kifejlesztése és fenntartása az Ethereum számára. diff --git a/public/content/translations/it/community/code-of-conduct/index.md b/public/content/translations/it/community/code-of-conduct/index.md index 4e20dda63e7..681da5f76c5 100644 --- a/public/content/translations/it/community/code-of-conduct/index.md +++ b/public/content/translations/it/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Gli standard di base che ci impegniamo a rispettare negli spazi di lang: it --- +# Codice di condotta {#conduct-intro} + ## Missione {#mission} Sviluppare e mantenere l'hub più completo ed accessibile di conoscenza Ethereum. diff --git a/public/content/translations/pl/community/code-of-conduct/index.md b/public/content/translations/pl/community/code-of-conduct/index.md index 8745b2e7fa2..1246d70ab5f 100644 --- a/public/content/translations/pl/community/code-of-conduct/index.md +++ b/public/content/translations/pl/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Podstawowe standardy, do których dążymy w przestrzeniach ethereu lang: pl --- +# Kodeks postępowania {#conduct-intro} + ## Misja {#mission} Rozwijanie i utrzymanie najbardziej obszernego i dostępnego centrum wiedzy na temat Ethereum. diff --git a/public/content/translations/pt-br/community/code-of-conduct/index.md b/public/content/translations/pt-br/community/code-of-conduct/index.md index 97f86892aa1..3bd57493bab 100644 --- a/public/content/translations/pt-br/community/code-of-conduct/index.md +++ b/public/content/translations/pt-br/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: As normas básicas que buscamos nos espaços do ethereum.org. lang: pt-br --- +# Código de Conduta {#conduct-intro} + ## Missão {#mission} Desenvolver e manter o centro de conhecimento mais abrangente e acessível para o Ethereum. diff --git a/public/content/translations/ru/community/code-of-conduct/index.md b/public/content/translations/ru/community/code-of-conduct/index.md index 0aba8eb2731..d88f9b9e47f 100644 --- a/public/content/translations/ru/community/code-of-conduct/index.md +++ b/public/content/translations/ru/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Базовые стандарты, которых мы старае lang: ru --- +# Нормы поведения {#conduct-intro} + ## Цель {#mission} Разработать самый полный и доступный центр знаний об Ethereum и поддерживать его функционирование. diff --git a/public/content/translations/tr/community/code-of-conduct/index.md b/public/content/translations/tr/community/code-of-conduct/index.md index 8fea828a03b..8525b4750b5 100644 --- a/public/content/translations/tr/community/code-of-conduct/index.md +++ b/public/content/translations/tr/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: Ethereum.org alanlarında ulaşmaya çalıştığımız basit stand lang: tr --- +# Davranış kuralları {#conduct-intro} + ## Misyon {#mission} Ethereum için en kapsayıcı ve erişilebilir bilgi merkezini kurmak ve sürdürmek. diff --git a/public/content/translations/zh-tw/community/code-of-conduct/index.md b/public/content/translations/zh-tw/community/code-of-conduct/index.md index 10db533599d..04240c38b78 100644 --- a/public/content/translations/zh-tw/community/code-of-conduct/index.md +++ b/public/content/translations/zh-tw/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: 我們在 ethereum.org 努力追求的基本標準。 lang: zh-tw --- +# 行為守則 {#conduct-intro} + ## 使命 {#mission} 開發及維護最詳盡、最易存取的以太坊知識中心。 diff --git a/public/content/translations/zh/community/code-of-conduct/index.md b/public/content/translations/zh/community/code-of-conduct/index.md index 8a6de0a2dcf..853e5deaec8 100644 --- a/public/content/translations/zh/community/code-of-conduct/index.md +++ b/public/content/translations/zh/community/code-of-conduct/index.md @@ -4,6 +4,8 @@ description: 我们在以太坊社区中严格恪守的准则 lang: zh --- +# 行为守则 {#conduct-intro} + ## 使命 {#mission} 开发和维护最全面、触手可及的以太坊知识中心。 From 79b127dad5eecf9cab13f652212453da526e053b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Wed, 21 Feb 2024 12:36:15 -0300 Subject: [PATCH 400/478] chore: remove unused wallets images --- public/wallets/brave.png | Bin 2557 -> 0 bytes public/wallets/mycrypto.png | Bin 1161 -> 0 bytes public/wallets/shapeshift.png | Bin 52272 -> 0 bytes public/wallets/status.png | Bin 1180 -> 0 bytes public/wallets/web3auth.png | Bin 1931 -> 0 bytes src/data/wallets/wallet-data.ts | 5 ----- 6 files changed, 5 deletions(-) delete mode 100644 public/wallets/brave.png delete mode 100644 public/wallets/mycrypto.png delete mode 100644 public/wallets/shapeshift.png delete mode 100644 public/wallets/status.png delete mode 100644 public/wallets/web3auth.png diff --git a/public/wallets/brave.png b/public/wallets/brave.png deleted file mode 100644 index 772c0f22e2c60827ce4cc968850c30eb080dae51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2557 zcmV+_10RQRZ|9({em2v;p%KyKv|6WA@r;-0`DC+0JIRF3v3v^OWQvfm8 z+p`-_1d(m(qmlJ<00009a7bBm000XU000XU0RWnu7ytkXFG)l}RCt`Vn~9R6I1GkK zItgUWWz2oO|6^{+#^6ITbkd{LPR(p5eED@*Hgpu7SsW#0S?2J{<$s11wk1(~dbta{ zcd5+975a79>w97xy|g}?SZqw&Zr>8)=(fpIIEz^9DtF7D-x1^J`JciOA+#0pqPTxc zlsru|c~YJm!=m8#_$%UL$0?ePEF2z(*W(+3P!NQ|ow@s!Z_MO#iHVDIa>h*=P*@cF z{TcBnKmv)B1uqKDe?^SrSpE@j1*mDhLlK35D|o>L9vL_Sims`6=NFobs6@PZfFhRc+~ zjfnG!xYw=XvfYplu|@-I!%L&%-2t%or1_D+sT?qbUBtf$0c5m0S!U!6d(naKpIu(&rBzK+$#Mv@AmpHY}r{JB=6@=zTN1ZyLu=;MI7KeUDbF zezO>0!Z|Em2h~emA>-1QS!-Cv2Q9J7k+OLBEmT@J^=V~(m#Rv8wOSaoVJ?8NbrPPn zZ87UE4o$W7eEJMjM7OMIWkH*2`}WHEY=?ohZMH37cx_0ZzEOwj_=s^>9pvr<`TdPV zY};~x#o6lO_Dc0~=R+q$-H8*wHElbD41}!Gklxc zu+4=x3kx=)bt>2>FUy^{3*dR13w@UX*|6D@i;iHLu8!~Y8th0EFd%xoErd~IE>R}Y zy2Oe`R}X?-qW0)!EqF}h%x~NO?u8s;*SNt!Jecz5Fj6WMk9H88G{*fe$1tn*yf@@z&1 za6c+yfdd8eh6Zs~V-%rqaBc^EO}HrqtORCNzX(5WTg5v98|*);#N>Oq}b*(rsn>VvKi`Ay)=b_NF6T-Cf2&925y1Zp?#B&2%^8N>T3=)$5weT!A8ub?hWu8 zk)tA{kT8Mx^jMncAO;418AIyF0xNwtg#LjW4FreEEG3*Ou)=Wf)1q?*3WRR6)geI? zm_q*<20w`C{uH*QN2hVd0{tF8hIcoF_?+R_yKXu*I=koXvkU1dL zx0st?{#6hwzP31J)vVzq`2;iwKHjeZI& zScz5YZCeiBpo<@~&=Zp3O0@QY*W8&Q1EOVgB~qtwf{oO33CcoG^5ILA=~j2U1T$R7 zof+NNF8I{1516UKxGck;z`EvBd7s2^>sk1~!p}yYt{7?BnDsH`{sEU`XO9g&&wN@n zm8uU2pYx;@VszDCOB*%QZ1;ZpZKMg=`}DcU6NzeQgVCy+Gc~n+BQQFR;&v{yPD=?> z;u-LD<-yO#xlgx~s1qP3h8fSPq0*?_lc*5ye(AZ^I9UDes2}7#uRTc{N4KBvf&4O0 zK29DaUUTXF7mt|7QT+H;Ve+d7%wzg-w`)KS53ohQGdz&jfcFo6D zUHb3jDZ4!kV9oizlXr+T6#i>@%5D!${MYg#X>thx-d}ajOVC%6$cKM^|JnZmkZ4Xe TWvkdN00000NkvXXu0mjfGz{j5 diff --git a/public/wallets/mycrypto.png b/public/wallets/mycrypto.png deleted file mode 100644 index 2358abc7a44e22b6a0d2aa501f1751d7404821d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161 zcmV;41a|w0P)kR3mIZj01$dSPc$WoumIZj0JgvDb00008bW%=J{{TzICFh-b-55sC00009a7bBm z000&x000&x0ZCFM@Bjb=14%?dRCt{2n^}^BI1E5#ZNC4Fr+`ixY;6Qc&s2?m1A2JX z8fa&P8M_jR004*(X-DQ$DxeNSr4=-akRsm=#7+l#`3M**>5$+JdDzM+e1Atxw zUS7VC2v73B*gEhi4`w1f%Y%ss5A$GLM|fs``b4<@{7r%$kl`5-c7QkBXSR?H3^$By zuAwKSs#4mjP+7p$Jz{jfNI5guXaFVOW{!>g)ux^bnSol_)-1^;)O1oIozTNEGKfbb zq@EfcfKS)3Pkm?5QK(vgyhC_sKfR@SL6K&s2qai{x zK$Ev4dcL3rLxf;}4)1;G`aZq-Lj-?-F7JmJ#SrA4MR2V|z*}F5V;1tP26$#S|5c>+GGvVDS5o1ol*rR)opeT%1ss=~R!VQci zoL*%m5&E&~hHPmSnHPda)!1OZ6{ZR8$?Kv)j*g(LSs9l$!#J#;_PyD(C7`* zu4!V0r%6o+u;B5e|VPaqua7qHJ-5vt2VfhKJ|Ju(T)27FR#pHB)G_OYu!%u*SO9U?yEe zBevO)b9BSW4qU^vbQ%ozp0Rf;KI@69Eg(%#VqQspeFr46h1_|ryGTrrJw<7gy^K-V zhdg+tP4e5VLd<#cN(>bWKsm8sn>0)Aogr3iA-;i?5=l&~@TicWtr9Cd*e7U9RUn^O z;!!QhULn?s@OS{$3SADd=J>TEuvW@5i8arb2Vk)nYY=O^ex}$J5^FpQ=pYefHYYec)h z8KeK(+FRPa#9nDp>R)bAYWESb+-4@E>6QRIfU>py5LUxmBfr~e+?t*!HIW1<5UGBX;NfiJ4A|9@D7NSD7q boYU|RD<~W#SF~*~00000NkvXXu0mjfYl;mN diff --git a/public/wallets/shapeshift.png b/public/wallets/shapeshift.png deleted file mode 100644 index 679b1a29cda1130ae147dff4890a807dc34357c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52272 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 diff --git a/public/wallets/status.png b/public/wallets/status.png deleted file mode 100644 index 1c65198a221b2de1fc19c466340477c54658c1f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180 zcmV;N1Y`S&P)#H{Aqglo~inK29&D+ z000VfQchC<7XSavOQ`mGDKw@$?*IS*32;bRa{vGi!~g&e!~vBn4jTXf1NlirK~#90 z)tl{-ogfT`F`x(ndjD73!EcWS0wQhSAD!JZyL~1Jgb=cfC96^GD%G%WrP{s|Lc%U7 zMAx_K8(80og9LEGg6R6fP}PeE&gBzPj@hiVJL?B3`Vui!y$r+7O!?YO)zNS}RCaHW zjkk_UJCIE-FB!KX`z)Li88|NqATs>gXX3mhK&p|=Ws~PfBt^27`Q|N>Alo|b%yDZ6 zh15}bugzN|X~beYpb-o5fI=+FgE+A;4`Rf=G|wxrJ6iZeEyim;Fb{mr!LpoykBFjT z0KMdM7!`ad_2|$%=|$lm5``S%y#kXzh=aYlwi1nw zM=@!M>IpM%C0ZR_s3`_UcpNqHd`=}K8PAJoc#h&JhpVzYj`?)Ys6Cx$qdY$FDYk49 z&OsB5-wJe?g(B6X+QoT109<`aUZWI;dSSrLr}V1?!J#~8VV4v_Z7DpCE}AWfa^c& z7%CIVg(!L>e6IDyYmZWw3@o=9bk)!bL-LY=t&@RXW{8z2-9T6_GwQS38FmF0FMxE1 z!g0yRd`eq1bce!rG3?V+o;>wv zb4v0>zu}-ye?!#@R8W>Xx?$uTTTbm)6^J2Z1{?`tS#~lEYWCa3~jwSr=9&@Um)o_Y-)|#8r7WPV&OQouY?H$|}7M#*-vFuT2ao z0rE0Qp8V=7+Qg6&SQb|;nHTrqYl!RuUS@+?-WCR+ddOoWNYg zVV28Y&DHSjBY%b3aHf7DzW)_Cl;B90MU&LG2t)t zsK{}r*&2(CZ|*Fh#Tqs%&mJ~ zpywS!7OYYk1vq-Zj$sobzb}ke9 z{Mdw2N@qkRMyDfhStHJY+sRY!w;2JZukw{5H?<)F=mJiOiEU{+2VMb@Gj$Z8HzGI1 z?;g+xfcJB6SZBoLi@}>vZB1wqOAlC*1oeQJ4DBZUY#g#hZ!#149+z*l&p^_|MqG$& zOz5)Eu?Z#ksar940@WHNZW1LrsrOOnl^x`RiCWQ^EL`HgL7~DG!~?q8?FbMlN=X*vXOB3xfwjeO9}q_~ytodQCTBz)ERwUl z4;UbHI>1Ld#l}`*qNh3s7#L9pzK)`zD;c|Hml^U^T9W{u$$ikPwW@gr=&9(!pM z349Q*#J&xy3lG@&MN2Iyi30TNQ!LYji_Qd!a|^ zhXLNN+EXxBxBa4l=nD8A z0oeSEqjG8uUquy&E1r*vBmp-)FyfLh{Yqgx11E*vCIv;*YxJI!s=Qa7PD>Hx7KA0Z z10${qpW+%tl{f6x;(&vj(PfiK%f4$-W>;f7&c{K)g1tqg^tQTynYy4}8(V2T(@AIZ zULV(J6>hrYp>Naa)S{h6KeVHm4JkKdlVBIuXtCP?$MDSJ3V!cq?@T>BwJ5uR%9T)5 zfk^LwAuyuZO#r80x5#=SI)-XEWwP5GQz(y&`!JS6! zsX|n%14`n?gisGFi|Yop9IhNi@q^QD22~O!V|6*TA?@vXP>^P}CsF*EA}+brr1jMI zeGi}5u(97VN!}(LQ4C5A2yQr0YfW{CTsI2H_5|&&G)~c%+zKCDKvKX)yh8Ap;wGth zL6uFcwvec}*jO=s=8XV@{WLZr4aiVIxc&;NAkSyrHCVE7~*Q{c&$>d=Z9gndJL}b_T`T(Z#IUe7}3UR#6`6#oo@m1j+1` z#gT9@<6DUA+%0hS79u-)vu^7C7cQM8L?ChL^bsOEk7q7v9(O7*z>C~ee!!8L06fPJ zbw}KE9kz5ST)?ya3O5@T*wQp~vHi<*@Z8ZWvrBw>xxwvM-s(|e<`?9Od%DT&3LG=^ z&Nk9eZFI(xCoz}yz1yvH+_koyLbT7Z;z6?@=gBWMkc+3s!CVhr);wy5b7JOy(8|uSd=2(k{sRR~s4Vaf RGBN-F002ovPDHLkV1f Date: Wed, 21 Feb 2024 15:37:06 +0000 Subject: [PATCH 401/478] Add H1 to events pages --- public/content/community/events/index.md | 2 +- public/content/translations/ca/community/events/index.md | 2 +- public/content/translations/de/community/events/index.md | 2 +- public/content/translations/el/community/events/index.md | 2 +- public/content/translations/es/community/events/index.md | 2 +- public/content/translations/fa/community/events/index.md | 2 +- public/content/translations/fr/community/events/index.md | 2 +- public/content/translations/hu/community/events/index.md | 2 +- public/content/translations/id/community/events/index.md | 2 +- public/content/translations/it/community/events/index.md | 2 +- public/content/translations/ja/community/events/index.md | 2 +- public/content/translations/nl/community/events/index.md | 2 +- public/content/translations/pl/community/events/index.md | 2 +- public/content/translations/pt-br/community/events/index.md | 2 +- public/content/translations/ro/community/events/index.md | 2 +- public/content/translations/ru/community/events/index.md | 2 +- public/content/translations/sw/community/events/index.md | 2 +- public/content/translations/tr/community/events/index.md | 2 +- public/content/translations/uk/community/events/index.md | 2 +- public/content/translations/zh-tw/community/events/index.md | 2 +- public/content/translations/zh/community/events/index.md | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/public/content/community/events/index.md b/public/content/community/events/index.md index 6f898d0d1f9..3a089efe45d 100644 --- a/public/content/community/events/index.md +++ b/public/content/community/events/index.md @@ -5,7 +5,7 @@ lang: en hideEditButton: true --- -## Upcoming events {#events} +# Upcoming events {#events} **Every month, there are major Ethereum events around the world.** Consider attending one near you to meet more people in the community, learn about employment opportunities, and develop new skills. diff --git a/public/content/translations/ca/community/events/index.md b/public/content/translations/ca/community/events/index.md index 1192af3342a..33cb1e26af7 100644 --- a/public/content/translations/ca/community/events/index.md +++ b/public/content/translations/ca/community/events/index.md @@ -4,7 +4,7 @@ description: Com involucrar-se amb la comunitat Ethereum. lang: ca --- -## Pròxims esdeveniments {#events} +# Pròxims esdeveniments {#events} **Cada mes, hi ha un gran nombre d'esdeveniments Ethereum a tot el món.** Teniu en consideració assistir a un que estigui a prop per conèixer més gent dins la comunitat, descobrir oportunitats de feina i desenvolupar noves habilitats. diff --git a/public/content/translations/de/community/events/index.md b/public/content/translations/de/community/events/index.md index 0fa15014662..ea6d7664a1b 100644 --- a/public/content/translations/de/community/events/index.md +++ b/public/content/translations/de/community/events/index.md @@ -5,7 +5,7 @@ lang: de hideEditButton: true --- -## Kommende Veranstaltungen {#events} +# Kommende Veranstaltungen {#events} **Jeden Monat finden auf der ganzen Welt große Ethereum-Veranstaltungen statt.** Besuchen Sie doch eine Veranstaltung in Ihrer Nähe, so lernen Sie andere aus der Community kennen und können sich über mögliche Karrierechancen informieren und neue Kompetenzen aufbauen. diff --git a/public/content/translations/el/community/events/index.md b/public/content/translations/el/community/events/index.md index 95c7206c016..382c0b546d6 100644 --- a/public/content/translations/el/community/events/index.md +++ b/public/content/translations/el/community/events/index.md @@ -5,7 +5,7 @@ lang: el hideEditButton: true --- -## Προσεχείς εκδηλώσεις {#events} +# Προσεχείς εκδηλώσεις {#events} **Κάθε μήνα, πραγματοποιούνται εκδηλώσεις του Ethereum σε όλο τον κόσμο.** Μπορείτε να παρακολουθήσετε μια εκδήλωση κοντά σας για να γνωρίσετε περισσότερους ανθρώπους της κοινότητας, να μάθετε για τις ευκαιρίες απασχόλησης και να αναπτύξετε νέες δεξιότητες. diff --git a/public/content/translations/es/community/events/index.md b/public/content/translations/es/community/events/index.md index 9556c96f5ea..38f4f753c17 100644 --- a/public/content/translations/es/community/events/index.md +++ b/public/content/translations/es/community/events/index.md @@ -5,7 +5,7 @@ lang: es hideEditButton: true --- -## Próximos eventos {#events} +# Próximos eventos {#events} **Cada mes, se celebran grandes eventos de Ethereum en todo el mundo.** Plantéese asistir a alguno cerca suyo para conocer a más gente en la comunidad, aprender sobre oportunidades de empleo y desarrollar nuevas habilidades. diff --git a/public/content/translations/fa/community/events/index.md b/public/content/translations/fa/community/events/index.md index 42452e9287c..373618a54a3 100644 --- a/public/content/translations/fa/community/events/index.md +++ b/public/content/translations/fa/community/events/index.md @@ -5,7 +5,7 @@ lang: fa hideEditButton: true --- -## رویدادهای پیش‌رو {#events} +# رویدادهای پیش‌رو {#events} **هر ماه، رویدادهای مهم اتریوم در سرتاسر جهان برگزار می‌شود.** شرکت در یکی از رویدادهای نزدیک به خود را در نظر داشته باشید تا با افراد بیشتری در جامعه آشنا شوید، درباره فرصت‌های شغلی اطلاع کسب کنید و مهارت‌های جدید را توسعه دهید. diff --git a/public/content/translations/fr/community/events/index.md b/public/content/translations/fr/community/events/index.md index 4de2ddda52f..e149ee771b1 100644 --- a/public/content/translations/fr/community/events/index.md +++ b/public/content/translations/fr/community/events/index.md @@ -5,7 +5,7 @@ lang: fr hideEditButton: true --- -## Évènements à venir {#events} +# Évènements à venir {#events} **Chaque mois, il y a des événements Ethereum majeurs dans le monde entier.** Envisagez d'assister à un événement près de chez vous pour rencontrer plus de personnes dans la communauté, en savoir plus sur les opportunités d'emploi et développer de nouvelles compétences. diff --git a/public/content/translations/hu/community/events/index.md b/public/content/translations/hu/community/events/index.md index 11362bc8b54..5ed7c4c3d3d 100644 --- a/public/content/translations/hu/community/events/index.md +++ b/public/content/translations/hu/community/events/index.md @@ -5,7 +5,7 @@ lang: hu hideEditButton: true --- -## Közelgő események {#events} +# Közelgő események {#events} **Minden hónapban részt vehet Ethereum-eseményeken a világ bármely pontján.** Vegyen részt egy Önhöz közel eső eseményen, hogy találkozzon a közösség tagjaival, megismerje a munkalehetőségeket és új képességeket fejlesszen. diff --git a/public/content/translations/id/community/events/index.md b/public/content/translations/id/community/events/index.md index 0f5dbd6f527..6aced63ea22 100644 --- a/public/content/translations/id/community/events/index.md +++ b/public/content/translations/id/community/events/index.md @@ -5,7 +5,7 @@ hideEditButton: true lang: id --- -## Aksi mendatang {#events} +# Aksi mendatang {#events} **Setiap bulan, ada aksi besar Ethereum di seluruh dunia.** Pertimbangkanlah untuk menghadiri salah satunya di dekat area Anda untuk bertemu dengan lebih banyak orang di komunitas, mendapatkan informasi tentang lowongan pekerjaan, dan mengembangkan keahlian baru. diff --git a/public/content/translations/it/community/events/index.md b/public/content/translations/it/community/events/index.md index 8c301d3e7ec..d16f6c4ed27 100644 --- a/public/content/translations/it/community/events/index.md +++ b/public/content/translations/it/community/events/index.md @@ -5,7 +5,7 @@ lang: it hideEditButton: true --- -## Eventi in arrivo {#events} +# Eventi in arrivo {#events} **Ogni mese, ci sono importanti eventi Ethereum in tutto il mondo.** Prendi in considerazione di partecipare a un evento vicino a te per incontrare altre persone nella community, conoscere le opportunità di lavoro e sviluppare nuove competenze. diff --git a/public/content/translations/ja/community/events/index.md b/public/content/translations/ja/community/events/index.md index 1be0a7dc594..abd0ac8cc04 100644 --- a/public/content/translations/ja/community/events/index.md +++ b/public/content/translations/ja/community/events/index.md @@ -5,7 +5,7 @@ lang: ja hideEditButton: true --- -## 今後のイベント {#events} +# 今後のイベント {#events} **毎月、世界各地でメジャーなイーサリアムのイベントが行われています。**お近くで開催されているイベントに参加し、コミュニティの人々と出会い、採用情報や新しいスキルを学んでみませんか? diff --git a/public/content/translations/nl/community/events/index.md b/public/content/translations/nl/community/events/index.md index d312985668b..28b92e715af 100644 --- a/public/content/translations/nl/community/events/index.md +++ b/public/content/translations/nl/community/events/index.md @@ -5,7 +5,7 @@ lang: nl hideEditButton: true --- -## Aankomende evenementen {#events} +# Aankomende evenementen {#events} **Elke maand zijn er grote Ethereum-evenementen over de hele wereld.** Overweeg om er in de buurt een bij te wonen om meer mensen in de gemeenschap te ontmoeten, te leren over kansen op werk en nieuwe vaardigheden te ontwikkelen. diff --git a/public/content/translations/pl/community/events/index.md b/public/content/translations/pl/community/events/index.md index 6806f66165f..f863402ee8b 100644 --- a/public/content/translations/pl/community/events/index.md +++ b/public/content/translations/pl/community/events/index.md @@ -5,7 +5,7 @@ lang: pl hideEditButton: true --- -## Nadchodzące wydarzenia {#events} +# Nadchodzące wydarzenia {#events} **Co miesiąc, na całym świecie, mają miejsce różne wydarzenia i eventy Ethereum.** Weź pod uwagę możliwość wzięcia udziału w jednym z nich, niedaleko Ciebie, poznaj różne ścieżki kariery i rozwijaj swoje umiejętności. diff --git a/public/content/translations/pt-br/community/events/index.md b/public/content/translations/pt-br/community/events/index.md index 247e246b4cc..3c9525a51ed 100644 --- a/public/content/translations/pt-br/community/events/index.md +++ b/public/content/translations/pt-br/community/events/index.md @@ -5,7 +5,7 @@ lang: pt-br hideEditButton: true --- -## Próximos eventos {#events} +# Próximos eventos {#events} **Todos os meses há grandes eventos da Ethereum ao redor do mundo.** Considere participar de um perto de você para conhecer pessoas que fazem parte da comunidade, aprender sobre oportunidades de emprego e desenvolver novas habilidades. diff --git a/public/content/translations/ro/community/events/index.md b/public/content/translations/ro/community/events/index.md index dcea31a63e8..cdcfe13c902 100644 --- a/public/content/translations/ro/community/events/index.md +++ b/public/content/translations/ro/community/events/index.md @@ -4,7 +4,7 @@ description: Cum să vă implicați în comunitatea Ethereum. lang: ro --- -## Evenimente apropiate {#events} +# Evenimente apropiate {#events} **În fiecare lună au loc evenimenteEthereum majore în întreaga lume.** Gândiți-vă să participați la unul ce se desfășoară în apropiere, pentru a vă întâlni cu mai multe persoane din comunitate, pentru a afla despre oportunități de angajare și pentru a vă dezvolta noi competențe. diff --git a/public/content/translations/ru/community/events/index.md b/public/content/translations/ru/community/events/index.md index c05cdfaac04..14dfc31894b 100644 --- a/public/content/translations/ru/community/events/index.md +++ b/public/content/translations/ru/community/events/index.md @@ -5,7 +5,7 @@ lang: ru hideEditButton: true --- -## Предстоящие мероприятия {#events} +# Предстоящие мероприятия {#events} **Каждый месяц по всему миру проводятся крупные мероприятия Ethereum.** Посетите одно из ближайших к вам, чтобы познакомиться с другими участниками сообщества, узнать о возможностях трудоустройства и развить новые навыки. diff --git a/public/content/translations/sw/community/events/index.md b/public/content/translations/sw/community/events/index.md index 7bdcfc8468d..4cfd03e9b23 100644 --- a/public/content/translations/sw/community/events/index.md +++ b/public/content/translations/sw/community/events/index.md @@ -4,7 +4,7 @@ description: Jinsi ya kushiriki kwenye jamii ya Ethereum. lang: sw --- -## Matukio yajayo {#events} +# Matukio yajayo {#events} **Kila mwezi, kuna matukio muhimu ulimwenguni kote.** Fikiria kuhusu kushiriki mkutano mmoja ulio jirani na wewe ukutane na watu wengi walio kwenye jamii, jifunze juu ya kupata fursa za kazi na jenga ujuzi mpya. diff --git a/public/content/translations/tr/community/events/index.md b/public/content/translations/tr/community/events/index.md index 316213d5e22..d6b3411e1ea 100644 --- a/public/content/translations/tr/community/events/index.md +++ b/public/content/translations/tr/community/events/index.md @@ -5,7 +5,7 @@ lang: tr hideEditButton: true --- -## Gelecek etkinlikler {#events} +# Gelecek etkinlikler {#events} **Her ay dünya çapında büyük Ethereum etkinlikleri olur.** Toplulukta daha fazla insanla tanışmak, istihdam fırsatları hakkında bilgi edinmek ve yeni beceriler geliştirmek için bunlardan birine katılmayı düşünebilirsiniz. diff --git a/public/content/translations/uk/community/events/index.md b/public/content/translations/uk/community/events/index.md index 91d5331be1d..690dd543a32 100644 --- a/public/content/translations/uk/community/events/index.md +++ b/public/content/translations/uk/community/events/index.md @@ -5,7 +5,7 @@ lang: uk hideEditButton: true --- -## Майбутні події {#events} +# Майбутні події {#events} **Щомісяця в усьому світі відбуваються значущі заходи спільноти Ethereum.** Подумайте про відвідування такої події поруч із вами, щоб зустріти більше людей зі спільноти, дізнатися про можливості працевлаштування та отримати нові навички. diff --git a/public/content/translations/zh-tw/community/events/index.md b/public/content/translations/zh-tw/community/events/index.md index 24cb71fb3ae..a8fecb8cae6 100644 --- a/public/content/translations/zh-tw/community/events/index.md +++ b/public/content/translations/zh-tw/community/events/index.md @@ -5,7 +5,7 @@ lang: zh-tw hideEditButton: true --- -## 即將開始的活動 {#events} +# 即將開始的活動 {#events} **每個月,世界各地都會舉辦重大的以太坊活動。**考慮參加你附近的活動,結識更多社群成員,了解就業機會,並培養新技能。 diff --git a/public/content/translations/zh/community/events/index.md b/public/content/translations/zh/community/events/index.md index f6d248ceea8..79260f8b713 100644 --- a/public/content/translations/zh/community/events/index.md +++ b/public/content/translations/zh/community/events/index.md @@ -5,7 +5,7 @@ lang: zh hideEditButton: true --- -## 活动预告 {#events} +# 活动预告 {#events} **每个月,世界各地都会举办大型以太坊活动。**你可以考虑参加附近的一个活动,认识更多的社区成员,了解就业机会,并培养新的技能。 From 9f65cf043c4538f403b609603e70025860c09546 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:38:49 +0000 Subject: [PATCH 402/478] Add H1 to translatathon page --- .../contributing/translation-program/translatathon/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/content/contributing/translation-program/translatathon/index.md b/public/content/contributing/translation-program/translatathon/index.md index ea7a49adca1..94b42ca629f 100644 --- a/public/content/contributing/translation-program/translatathon/index.md +++ b/public/content/contributing/translation-program/translatathon/index.md @@ -4,6 +4,8 @@ description: Join the first ethereum.org Translatathon to contribute to ethereum lang: en --- +# Ethereum.org Translatathon {#introduction} + Welcome to the first ever ethereum.org Translatathon! A translatathon is a collaborative and competitive hackathon-style event where individuals and teams compete for prizes by translating ethereum.org content into different languages. From 1e58c46690faaa57820a2cb8f01fa5e5ee1dfacd Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:40:33 +0000 Subject: [PATCH 403/478] Add H1 to tutorials template --- src/pages/developers/tutorials.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/developers/tutorials.tsx b/src/pages/developers/tutorials.tsx index bba63a2f74e..51e29a4ecb3 100644 --- a/src/pages/developers/tutorials.tsx +++ b/src/pages/developers/tutorials.tsx @@ -217,6 +217,7 @@ const TutorialPage = ({ )} /> Date: Wed, 21 Feb 2024 08:28:32 -0800 Subject: [PATCH 404/478] build: rm manifest app previews, rm assets --- .../manifest-homepage-screenshot-mobile.png | Bin 1976475 -> 0 bytes .../assets/manifest-homepage-screenshot.png | Bin 3563843 -> 0 bytes public/manifest.json | 14 -------------- 3 files changed, 14 deletions(-) delete mode 100644 public/assets/manifest-homepage-screenshot-mobile.png delete mode 100644 public/assets/manifest-homepage-screenshot.png diff --git a/public/assets/manifest-homepage-screenshot-mobile.png b/public/assets/manifest-homepage-screenshot-mobile.png deleted file mode 100644 index 319e45b3955454cfe684cd7ed735b1a08a0da163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1976475 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%0AA%!oqLuQ2 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 Ge*@CJ^2WE8TUOe1I@Y_2WSPunnm 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�G-~E-B^{>jj4CbCA(be%}d9ESLoN|h*mlx+_ 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

    UZY7X{!yq*P{f^ z%jmH+=HW4&ly<`uFYMPgCDdBUvY0`(wv5Xc$#Gya;13cnw_w z?TYaNP31g&{y2-NlWgBw#MaTZ`MGlEi&YH8v&e|Xq1pyJ*oXS#f8Ik-h+SzWHMifH zLimKeyK%}_V6UmGIjht?bU_Sz=4%KEcM)Et&0tM|*bWFqgc_$Ic9LBB1Q7biCV>5Y zzv~E&2xJ#)+sV}P`@^qAV;)`oiL;EPkxa@;DMdi4hhcok&arMHRJgfoWyvpCnw zaat^@;@3gRhbCT@v2XDe|M+NtaG8c#A%yr@&faT)<{mWQxrXoi>=&-n(>NKn?UN~) zudm~*=aFJWM_&v+F#@0QfR{K(18rQl1`o4v4J*PWZWY5GbonYQx45cYGROo{7@jt} zzmE-3OmKDhT$4?dtk_n0z?|=Cw9RRF+c?TJZU?v6YF#pT*JWP2@89>Q#NN6lZ*q&U zJH#|MrcJ-KH7*o7hB&w2;-yK1glGn`Jy*pJ@`Q^SdmN&2bTl4vspkOd zfVB?FQyklC(^gGy>-E{~w-dGJ!JVbbP)6v-?F&K(UMqLBsU|pS1s_#2n-z2q${j#P z5W-p%?XrB3Xhl{NIr(vdGS4Z*bc`&oskBnY>6HX z+wmeqG+C8lnLrx{=Sq2K7y1%7=t({lxe_4?m^7U9g_P9Kk$>>y!L%h4pNXGEpuYuS z!%=xKn7#Q`;3sTbX8el>52j0ae}h7%-8eg>Y#ay*HKfb_eC_m69N>&sNZpkYo#oul1+F%D{v+tUOzM#Yt~3d5eb@Py-{Ptmf~*JujO<8)#H%A?;k)qUwZ}l}6Jg zo{Jx9GdRG>{;=}NtT!=;V4&u}L|!G`UB|UNs?)DwW8u~PQbU})i^|J{I~nt@?<4N! zVIPgN)#d&2^Z)N|`R#u`WC7v|Cl(Kv&p5&Oi=TZKtIXTf|50phT)lCt+oROgBS6#b6>W6k9o*VDlyM%{+v=5tzj@E&_Iy4Iz zH(Z(i2$mxb(Pud3U+|w|~1ETiFf{ZkG2x(BM5|H(=OT ze{YzHnR;1Q$yUSH_f{QkSV@dy6l`eDWu5JNR&Wm&bPJpF7kN(YdxQVzM<~Za{>#l} z7M(DBt8J$y8)(FfKP@DDY%UKz47<`C=;vh5G8p6V5_gl>x7P`B_6ej)JSX|uhqJF) zT}8W>1zzVU=LTjF46vhz`NH#DA2!bm`i;NUdWjq;7P9RoodC;2oK!n}@p9@{=^msd zqcPSrD($(R$NB^QclWTIXEr>6a_c($oov48o5wX>|e!PCEY zwvG^rGT&RKeRJ4{iX19_O-`$gcM%1s3+${jy$rv$Mp#ToJ$m$z`SebNbqnnUPAAUJsDX zj4>ZY(-B@LMmY=RsUnB3PC1G3tv?DJt>clW7m&ZFEs$@u$mOZl#m!AM89g`(q4neo z03{mnEBTa#IENlVO<(g0wO)$1SAB0q>v!xUkN=k!Rac&1cZfcT$r+VN2Bh#Xl>SxN*6B6&Ez9&UAr}ARA^MLNGuC0%8I}(TV!Z6$~vB6F^fTeNvi+mjh5c3tx`W zD0Ic>%g??nJDaOzVeVXc_x4n|ba9jnaFUF{2po4Kn`!R*#M?xYefO&+wlEJMAiP#? zzICB2a#HLwwy7IO3^9nzQJj#(TkasNFSsrm z7C8L+p53S!n92Jwn(x>1v?bU+W>L?+bZG_ptnu5xcHA4$frG3d9r*EdLq)p~cH|Xo zRxG00-6MUs5WM?od7b=hG0}A5r6%Y!0#`3Hkvz8TZ2K~REOYEOm=*wr#cos$Oa`49 zC4;h^XF5Awh9q;+*Z9rV?ht;#Y+68l_G8*k>B}tv;e&9%Nw{#y#DNInSMv(kd&P-Q78IBlrhIGbB7~keRU@$0AbKIV%Y{xVkc28MTJ#Om|Kemm^ zL1;eY$-GB>6A+q)48SMsd>(Svf1l%jF>Xd0?XfuNb$nn1kbl-O5qVkEeb&C1JzE*A zC=~@Gy;2u+1DSi=vieW|`7W0y+$;C7HC%?5%P;RdD5KLH3Bz9Xm3QANE0|W8=cw^K z6aP6hr$<<596>w#%t@Ue#5mDPL}Rp^QC9xMvqus~`9WuRx?Utc`@Su#Glb&Rjhiw4 zIR0AhR`&igeEDO$bRs>;TqKW+^<)2W(C7D2O2^EE(_#7N02`8#q85A&eiAPcH#Vb< zRblmjMyURbe@q_y$5eph`!g&q-{6?qGNySRm7o6nGwg;wLFn>Rj^93_UcbWv<#rk7 z^vyTMwI6w43MV+cfsCg9k%X$Gq4?; z1YBUXv~A95E$i2Q#@EK~Hrlv**oRZy#I_PDv6T_svU` zjb}xTboGs=I2sT>EkdLrpeD@d#%++yyQZy?5~gEg#<5X09<1l$*ZuH>67MGN)@q5A?l@5k{M0&i5J?91H zQZpPip7O#MHXTMs=y$OuQVwDpkJVkT?D|FBR+Q~mI`hw0*5TH_@*d2*dFc$S6Z?aQ z9{X4*xA zPcsn1+)=0`8((#PQ_4E9r28*FQr?=Y%A;mXb19dKKc$=Ph zDp^gSs1uv93IGK~{Pr_x1Lydmxr{xSs~6k&n>m`H9jH*2$l8bfxn_>Ldj%jci0LUo zSHC_-fHll|Fv4sn(UcSS+^oXSbi~URk^QvcLP+Ej3VeYyk^N7Em^bFs+@z{IDj1N7 zn_)D)Tzm?Ip9RZ*0oFgY^1Z>Bodp)n2!_i(#xEb=e;kb913Ji?w>WM&r=*j>il$9M zr^;&?8jUmYtE+oxn%zfhp_JQizfI>_;A-%(vWo;o!GgrF;$xR7;3W2nC?SSzl zo;Sb-15T;|g9wy7r0Tx&KNu;nqqO0d>D7+(GYFua9~Su9Y!qrzre+gm5EczA5|{|b zdtOTpY~Ga~d;RsUw>(MP8Vz6_*ZmMDU3=zxc%A!WWm-gq5P5qNbRtg6;#~CjG=J0h zREW3AQEvqo+glh{MZ&Kia^!?T9NSKF4X%yKjuBd2z~aCy8!Y!|BHyohZp?J&4A+guDl;?WR@06#j&@nzYY zvz=v(Zlb~XE$;98+3=V_b=;ky)wL&O2ce!jE;H^rt8Y%b5wjDR+V(c;*BslQU?5pU zz1!WsDDHF6m9{cxZ%N*T*=U$JcC#6PLt6^C(XylH{ql=fw$-GS7+Al;Ypw~X`m}9< z4Vm`c=-X2AJP*vE+JIsZFrx;hlkEH}q@nx0AY#BFyge%bQ;1zWeYqe%`B3R3JYD78`dZ#8Vaq{Ko~{MJZ_0=6;;uc z$0{IncP)3=2)Mur%L%u;M%I=2`m??JYv0Z90uZl(SEG!mSOL{_y_=uUPL!T^^)tx{ z^f-nVF{nZp2S`|U3gCHnk|cd&{Gi^V4Oox(JNm_-4Dq6_k&wr?1jGrmX^ArqSN;fa zgZag6ZVC!%vsWiBsXXL0JCo+`#%mNdc{0=8w#YhB&sihH+5Wd}?9rVKjb}>VS#(b! zupbpS>UopE#4P(vsJEHcjdRX0}u-MBeNGhw8RK>JfFtKot6p&OLZ+kiJYa=V2h%=nnMLQlk{Z!1g7D8bA^+9QtXYJ!UOHW$9_a=iHH za39{_eFihEf5$`Ha(s5D$F<8)8-MA?X>S)j zNf@p@Tb&>uq7BP)yUHj%2uZ&9?7ae_;U+IphT>dbc}kDu6+kad4nR32x5~$NzF;A8t-SleJE-V#Y;zH;_R&(H;*m8mNU^KMJM4%_0VRMq?qpaeU;{MX zgW%$ygG}V7pAm4DAr{xX=XLN=lIZ*d0+P5cG%Y4J8zhyD&IOQ8nnya``vR2+N}Bje z;)Lou3rAq&B_ZM@0R4@auDu#$xVv)Q0W!+aB46+n*Ax^|emH^+un9RXh#vUK&_nP_ zS=DmdIi^2SN%NsWr%QB3r0TP}~FCDmq(<4Ia zcjB5g)$^(`dWi{W>HBehpKpN?f25N}YPs03{QB3!OduIZ*7p$}V81H_g_)}puQmFN z0@_(@49;@R{1k?Ubz&;KfT>4y!d6hU?oJR|yyMtV0ro=d70CAmwop4k`zAJp;s@bbKhf&&sg2>n2Q53P120qnP zJ!DdOj9ua5lf80wG*!O;_P5J-{)hL!&?9Lhnb7)If*j<@jl)~;jC6o3+#V{y<@%IM`9pc5W4zFH9h*KmlbJjv+7 zbr{K14W@NNo-tR));1L|$}JJQyV`2oi+Okq4#KeRb`|cTIWxj7q2TMB*)@R*4HyB7 z(G)gm z_ksYm4rA;^IAxSNG)J*oyLT-oY&S~dc(dzIU6MWD{afMsYW}7Vhkt$>;NqS60mmfO zKy~ia(ltS`sWJ!O^4CBGPWajueD`^g3;%OL`DrT?=9jx#%7KVUlYaWZqZ>m+pMz6B zTDIL#4yd4FeE?lO>1KU6S7d6Fb0tCc6L;SFcr;IiJd2A9Xwj|HCOodHW|?ZuP6TQ! zl5Ha#Q-D4-HI4Ad%Q)-@IiGE?UiYV^m)y2l>q@bQrVs9L%HoT=56Xi_Yw&_`1Z_)P z+eDnT*&fY}!Y)b`wPvFUx$y5#y&Q25lkm z8=08qNVKQ=E^#u%8-u4%I-zcWVZYfykw?MiqeoA<*yL#(sTSVU2OxWMe&%0sZTPwlU&Wln`qmcZU+ne#UUH#{ z5YG9vzfs05PkBtEg+A`QjJovbaFnhlv@Q&4Jtp#F?w!*(q-emjf5&(weBOJQ*7d4s zm%)7^7rtdKuo^ToA{Z+90wqrT}3qwz3kXs6bX*hM$2=EZ}W;Rsz5R z9dc3T!KtIN`Dmv+yo104iTYJ+5q#_2Yp9{ROkxp1Q3Ki_ntdQPJQ8_x ztSZH`*g%-aF3$EI22*8N)PVqmVTrPA;)AO&4U^fAqpGfL3pC2CM1{pR2o|h z1rXaY!DMiNRvHOL-qbJ91!&rg_tggF7Rw_HxGtjUpt*%&W?@?x({ zR%r;4`wa8N>0TzZwW;UDjXnng5wB*fpRVCG00YkqHA1WPEPo`be;SPZ?3XG1dk}g_ z2J*nyyyYjy%;@bKYSre>PX;QecaobsN<_AOicbaYPOA0fWT`Q0ix)rn3w_dKH`9ZmHG^fP%^x#VqMt8qep;I^5sM=c|g81NvA@bpbt?w zF^&_A(n zyAYSm@wNQ>lK7soQa^Gr$67#PkOH~}L$h|@&l z97l6A*uLjt{j^LK?h6ggLMu#xqhpBUhXNH(ASp<+2oznTF7MpFSr*a6^KufkCRzDmqws*E z-Kz-KSl4cD0_ZsArSHFW1+BYDXwCYT6B&~n10NqoFm7hZ49qK9=Kzrci@>d|cjE)> zjHax^S(n=7a605F!)24xYhI+X%I(7&-X{QWIbeS3#>x!Giz ziLZjgDYAp7+`8;#Dtl;wdP(LE1^2?J5$f#*_eM-(3S)`||K!vpYkxLKXh%aM2sf1- zf&3Xqn@>;BtV3`noLv-=U~RNtF|{0nPF|5RA^PL9!Gv}_vyZoU_KAILW$%h3?O1B0 zq7}&`sMNSmNammF=%&q(;y4d$H;l+8e z8z%|~CqlM`b}wyU3eD1q3D%a#pCTvlcPxsv9%DrKk=7GV!nEwtL2bhkXgi94$`a|% zOgs@aKgKPcvZ1b$khtlLnVUQEoaW;T_Uz=SGGdR)^XWKtMn(}F ztzob39*f%{q}o$uC|N0u=-9Lnx-wBP&BdkeV8Q${}5JHeuVEfS^t%f(% zVw>IeYVj!=tF@UBjN3;nKJ*BBI+;=MF~-reQ3SXS#NmRDrpf{dLs}|qwL{;(w~1hD zg1SCqS7j`2bh?DCLbY%nK7JBLQB~z$!@%n5+5wEpTagZ7u1MZtOjAhT60e%y3m;Ng zT&#f?QRRg|e(OLdDwAmXDJWcBJ&c{18#i*dp;6QJmiFd6n(ZPEhTj6u=bR*^uhOev zN*cel{uQcP7t+NhcE0*;ceYVod&b8L|72#FHc}?+7p8fcK=Eh=tOdFtS(GDUo{!TC zD2$3@efo$#*5E}}nOF1gmp|cTKG{E8vV1liD@|(~GJe3K-elTMAfmr&=ich)!a$zd zAV~TUtkd7@H}a$NPJ#Lac1g5nq`;~hCvYT*sp2Plc}^!#t5K(Bp*%E88D6jXA2B`e z`gAfh1cV6IkNG*6OJ^siF4E-R<1irwtz%4pJzf(e;!n0=xGL`soIykWBv)v8nnS=T}vzmj55qQ`-0G9W?>3Qi$z1{3rMIQNVd<<=P#-0T<|1Prk^T^s{=l znI~z}`R;>l`rTvfcR#?7i_Wgil)w7xx5{7r?d|gZ2OMczfG07>NIv)VmFZRI6l)d6 z0Oz|33|$1vS3RjQg92Gb4VS`*PD(!ObaJ<-?MKfpcVR7ya zsg7T1JJ*ZpnCD_E?v&F^7fcaE`)hJiLWkx!q}|_F8|5@K(55-{;<_Q)Tt>?E6@F=^ z!wnhh5pd>}GmQ(<8L<*jVP1PTrUK9Q<8SEuJk(pI_P`~t=zVrxJO$*OPFr$o*xY;abhkXX z{|KIwcPF@3UO^M@%H>P+{h4TIYL;zm?BwN?>#H0w-ehflP!?v!$`Z$luVaczjk`%V zvz-)bBS#rY2q$PW;2mQ@;Gcy^nM=O=H=7J;Y2Y!A$Oj3?Q%mp~v>l&raFa5}i=V9T zlmjZ(b~S?L^8)q<7rLj)Kf%eyv@* zcKWh5b{?|pHHD6cXcgLarE$bLAMrdYy>RijG*O~~SOZ*#_^ws#KaN+Ej4N|oC_9Hq zvN0~X3H$VbvJIs91qHzHIMM}9)V1aI7i&!Xxd5@E$P?7j=N2Fi9GWQaFB0P=@`v5ss8{B|K7iZ=3R3c=0*! zGHp&A0%rz58$dApV7_A6aU?K}1G#o0v;(n#Hm18oS)xwdi(UceAnVS68cqr*CXs5# z?QsA$wPSSFiyekD+QA9O*;XIjFTWUi3Y|B& z;dhB!v9Fc4-+8-Szec;cu>ey(D-XE+`tH58^62pc7}sj~;)}6zjqo?FUoLNQYg7o+ zq_+g9KOa#S=6a4)dVQTP@BpD`CkzJK<=9x?jhnw>x3nVD(DyT#L9`2d3(msz3ZzH6 zMr+%oLURi%!^xyMKuy&d!rtm zcX-U~fa8IASrQu&!Cb$&lz3$&>+~Tzle4(grpS)f`b5@Law>6^f7x|5w$7LjKPn&o z{8#0_{q$#Ll)2ekTpsiv{?mUb-~Ik21caQrnMXjyDGvK+@T}lueORxo>|a~P@?Z*2 z8}?EY7xHe5x!F9t%;}0){BlwQ4G}MVJ3$z?%&CiE?1qi7aU+ut?r$XoKW9v5o)&hz z;M+TB!o+QyjNzV!(Ps4MC_ly)|AqD^YmYH_ySH5)#irFE3oF0p%jhyT$*9cO97OQ9 zw$9+salf6Nt+K@l5OK9lxZ$;pW|Egcj&M5X(9ONm$y~R9+N-Kj=j_>L5w>Dh!}W!m z($Yi|A8mmea~Da-i+0?d+s6EsvS<4y5U1ev@W?T{-Ef-zF}&t$tn;Y0Sc|BY;k?OtfPKxWnB$ByGJTwascou8wF)1)9JU#!S{n%8`iDG(Za$G8 z?>=AXdTGQUU8HFrFHC%Kpy_i~ndRudw_KWE2pR{#P)`3_2K-}VGzMQhc}fL~B>#`w z(npz3g-}RgaMH){FLRQ7a`KG&Qk&Fcrqa93tGUFIexv}>IkE^X%y~hFLdDGg%i#Y` z;TAGndwG6=GKSos69-TI_gRZRq2GS-#r^Uavs@mrc0j#~Jt>b3UtVD&K%N7^6tH<> z?6Xh5hp{WRE9Uhxq1Bb_tH{vL?cK{roz}LpmI$ya`=9iaPTc|zA92K54j&hGmRC{a! ztZ`$pN24D-+MpiUa7Pe0zp#YOR0V@*4$dOWh|6xEkpdYyt|+!;bCo|a$y6})?sahRlNffqd8Fp(!(uU;%P$Ei-1eb{+So@Ekw zqgwLmlyfC77!ILSMo>oAqDcP;>fjo(EeUOO{{T~5qo4C`5NL<9c>Z+lxxfWHqg!0# zolYACGEO2;QEkWVL^VpBa}ftoiP*ORC@62_p)+kCmq(xPlqXzbGJLXIzV~N;UT)r4 ziG^_(-3PI(6dPAogx^Q|Lv*ZT&c0*!0t1_Gp^`h#?Z9a6myJC;h;co(O!|g7&&Gt~ z3BDFoO+!1YZJ1Xx45non4yh0;Ul&I^f;>v##RlgpUdr*6yT5v7XI7;%Z#hl`99$fR ztQ-ZCk*COkYZDYo%Qyl|&7rZ6eS%X|k71bDDmX?E=VCXAEn&~OKpl9g#RyI|_V7Fx z(a%IF%S;(kQ^{#5|3vA6Bz><8l`g8>HZ6l3R7h*EMXgYzwG#*ZC6%4?kc%0#J?J2# zJ%b=&&A{Z=gN@hQ-Y#EWESHvM%i-QcdH2@ka`na}3~Dqc9Zw!Ugt6{~R-C&WOUswT zsOtX5b!2inOh;$cad zcxk~64cYadZ5T#Z8ni7W_Oy7o*Ipjjs~ z{W_nKX5dc;FS(er2nQi|cn3P=K%&>_qY?>}Do3_qI(uz>YA8TCz_#Es| zaZmd+93x?%w7&$edw%o_Vf@MSwjBc^ugh>3r`S@*tdIh~NfzLfEU@HzE-h4em`Cf{v3QvEj3;Ci zrYTrZ)6Tpn(Mp_0kT8cZrJW3ks_o$V^;fZUN*cA}*tOUeJzU_#pAd*LZ=FP_?M7K> z^cbUpXzL{F>DckRR)OPfukG?4^I`s|VcE0~BTkJZy<^NZZyVdQaLjKBw>Pf zUE)O@VS9{r;?c^mzeSiUC1+!8u64d_ZQj|&r{I~S>pIa08u$zV=2{)E-85}((_%EZ zExON!i*XuU+gkJY-I8S)6Owtvyl)^qVKM0;egLzT^AgGR;KzJPjaMnLxwVmP{%8)3 zSXy4BA?O88RIK+{=TT>I3)&G+a;bQ+i#)?iNj5eR>a#9w$6DuR=gPIKSJ4DUu!HbR#h(L&=&Mgx%htv^ zn-bXWWFyYQzt=CJJ&AINT9oq$=M=V0p(LQZWCTs6q0k}}i!PyahUywfv|F7>*(2svv%6G@7YebT-OKZXtO zB4Ab1+lx%;$`KxM8qwRc)lb0ikFBxmT7<4&|J}Af4!?;b(3CCgl%tg$c{T#}qd)(R ze5HEyS73^RZP?$-I+X$3v831{=vlAG0He* zZvHV}u)RonyaTrek#SI&O+!>o`yh4)@!XiK7#J6q(IS`Vzv-LhHc;NA-!5{w(G9M; zZkjcb0U=6u6}sr$h0&R(ARN>bU?uZ&vPr>c_^Xfi%f}x*L}O|l8w5k;d*8Vk8ih8f zWNE@cA{x*tlDuytIQ#Uo9d1@+A%(rd%WqueDAPjWXni?F5CR#=H*simaR3U02o(>% z<5&QzuPJ`2^2TjqJT0s^hjCm6k!(DvO{7HPFd97zObYA*UO}kN%Sxg%@U1LQcn&I2 zVU_~_VSfq=i5q33_Uzz72n{2phUjo}C<}&jjF4*=M$90|V#~qGiX!@ei*K_gKk@Df z@1g<{w}AwFn5Xq619n#@cGd*`GLC3xFh+M|?a5_H8u>C%ME11F7t0Jh*?4dhiJJB5+4Ak~+?j zUV(1MXyR>_&p!J+cRn6(Goji69{JOd7Z*u~P%(EBs3}M<#_ewxEt`LaMTD>J zPtDZ46uhe`HZzkKmTblDECN1kr`QBFw7d(mpI|#-8T&6|uFi3Su+_D4=%>?X*8yV7 z-RIN@)kdMVZ49)z47!A2yGo{$p&74Vui38wL3-c2V4j`SbVK{OwY*#W$Wx}%0wSu6 zsGr6+<13srARwE+ky^Y?cI~z0VI1Ehj~eJ?PzLEgOA=whfX%z%Q~O~97${}jjH5@! z8K?u&+c&jQG=(<7D2s?d9XKw+T{KvS$*TgW#Uf4i>$FAE3YPViMNa{rnuyu=LAW}@ ztv#K8;|EaT>I{!39^Qs6FSFeZ(mmt+A^f#imOkmmkt}$Od_bNPM_$m7nqqM!t+g|l zBeErP%;`JHVjIxK-)`VQ%!tCDY-3&X9W#fKsL2aYGzWm%+e+u|=3Ph`YCYqDgJVuFO zYT9Kp_HF-)iR?2e{^apHQ^5Wn?Y=^?Gx2NfJo{D(2<2%Tn>*#xFTBw2VfooFKcb%Y z%at3`95H?$A>o_l`#-oEhVf+~;Q-Khe)6Y)SOdSg561)N@ougjA#ggz9##kp6#~(q z-AwY9Rp)??q0Vi+^erxrgDg_XHXm~wzaSz*CGk$3ymX4BDOG;@geh#OB=IbE{PoX>IEjU`V4 zd7;5P8jo=?po!Xmn3Cn4Z3xm?cGgoH&C?^Z^2s>!-mxW zwE`Ivf+!@mm^s&q0tY>kSDABl0x?}pWV??~d_q$(gv88wgj-$IFG;e_T#)laXlPr> zKFF8@9AzE}E9=s^qT%|PV-3u{+<=F7gm!#@6@_tjVEQ)49Eg%1!oSeF@0&RGBc1<_ ztX`A{Ndun%0WQvm`{42oAY-fc+-k%w0*)hhY*Sm~%ScqMCVe^HxEj zLUsjMu1WV0*gRR?h~}BKy-t&QcAy z=foR`)A^9ExG~{xlr@2y1_!h|+n{{?%iKT|V5y<3!aBVEppwcKO9GK8}uZ>#h0n?Qcz#?HA5GQdbhEdrVRyr?KGUo{HPZvHwe?i8Lwp$_|f_1 zU_2W2_vrEI(GJ=`sA6N>b`eduEjr3NJ0fb_t+9*q5Nh($C&T#T{I zP)#Kb(>gGCL56C|r__hN)3jL+S->2IEI(lvg3R_EOwP0cKp1_d<6zSmP`8afOTt?A z8qm@_8}G|~BCROPFv-8+)7oT~Q{2zxX-RvLXs@Krq7N3{IGMDi@6+Ktp;{K^Wq(l! z;tjje*J^V6x4*zgKYpTNpK*RI{U_O_TVNpX3507};e?IDSO8hphFiiA|8T^YnP-{J zAid2;zqm+)N%?%_Q9ET#`r15dnH%m6FX>|tFhf$|(Ro~>8sFWuPRJX*Zs63LUCZAW{T)^e&Gm!e-$2Ww~%{tB}@|NoEwEB2Y! zIF&M7-hS_`^25KmS$^=Bm*Ygm;u2EKcyi=sm&V#?Xj4^)TL>K{Id+{&7esHxFeQ=X|9Js|3JqC^ehK-OR{Y%Hbir<&w)tPiu4zaV z?SW_5V6Gq1$bKcwn;YRKSxqTvv)D054IcTSNsJdKXTZ$w7?beprLTQgSlzj#@j6+w ztTMe{z-rD>@4RcU+8F3}*H8a$SbG;v_r3dl9v^2gp=lJ^Cp>Wp*d(;>&JZ|x(T?i} zwV`a2+NC=^&GsJjAzqIjW_W>fE$rOYKIwY0xwN5v$hyXpH{J>^PA&ASd^Va}Nb>0v zpoQQWLDE4Rrkh++;;~`Zl&(WZhMl9Yl$$r-;ItM3{5ge4_T6KS7C*wy{zH!HuG7y) z5UNe17{%ovC~GXuO@zHU*RP}4DFu4aJafxh%D-Y_kEjmMhMR3s{QSwkhR`6CaLOXo zkY3-|ERR>WP_R)WaKG#z#2Z6?GP8JvHMRB+xhx6o&0Jp$7pBgkA-RbLvr0K$aH7(Z zw<2pkY-VAZ%S`9X6xz&c1e>SwzZ2vYiFZl^<5WT*PbGq*z6#ohQC87g9;smd7<#Hr zs-W1TxGM0_1-sQiY`ICcL(7>z!P-V66Qg{ovufR_(SB@hfWCZM^GcU#6cDP}Exz{0 zShIno_0gcV=S7IAE$!HIh*_l2nl{pN5;&%eBBYm-*zdGyK68X}2^$*GN6BBRoATDyOPz3H}?eQL+=We-*MD)#@i!@eul}xWjph%EM zjV~;+WPr~j0>A$3K8vVQE^+4n(lw;tz&M1H2SX%c>_VBCcN=E3F7XP8*^E>A?oOB5 zSuB(x>L|o-_6!wv`twYF*i=L{I*uz4S4N?r&*Qg94v~$cQ`a=lKbv zUWp4`b5PEKIcO#NJ!iy@hvg@aF@&#+Xn%UedtAN%MVPZi-9o8IZ9VJU$$+HGV2G19 zP>Y@!F6*mf<;mmG*af?bf!TG0u?rmCU91LIr>EJS#jv#Ki%N8c!04;~6O~spp`}6y zH9n_d!n3Ha??Q_;j!|Dju<5|6z*U3cmKRmYK#f(6a#(Q zm1G;mtf?UTPeL&%Z+@7tRf^u>YG14G)e~kC3HUU}#3g~W_ZD;T8U1$9>$m<&zLfci zcI=8W;fx88P(iKV*2Fjc;#oiA{Y(A?orNXMf^iL$>S7lAhh3U0;w4wKSL*RJuq zia8OE>A>5)tc+zn)avsb>+nzRE2MyR$4_44k(k$(AAE%*c(tJ61@II%{~Xul47&$I zY?5!6`wt$WMfkAXd%&WT+cB@*S}Je8bG3Z`FK(3&zJ0mex;=-`ivGr;(|4VzRm5!`beasJlEpRa|q7iMB9~xUo^;`igfz3^?ODw^KkE`4FkWABfmKNMO9c%efBenu|B{ zLpbHS&$ULFB{7rgTuU1-C>{QZX|JCduM@u}`_jii`Xs}JX^eM%zU+GJe3EXw2K#)v z3p0q~@TUi`PtR;)DwtsF6w^?aQ-zT&?A$MMcY%G#14ig=*pcq*vOa%^{$cD0MPgyaa?IHtXi9de4z`gaD~rwb@XVT%tF zP*d0$RcR)r6>@>b3tH|xgM1aCz=?PNLzwvI`pu)o;>pR%J(!q^B?{g)SUV~#RJrB| zS`UqL;T#u{&VcVMzo{7%5JD)z86q7UFVNKfB0b}cvCY+w^K;v#b?fOu>3G6#1ce3rsOoT0Y{_te zYi+`3^nm7ZLEQ6Rk%k8A{3iH@jW_ZGm}GuV#?sp0=0dI!e2&t%)8BP3fYYM6apXm- z^0+8-4Tz+I>tvSeevgQ=>BV}-4G+yA_zNv_+MM`_Aw}VD!?n>{>eu2$2G*+{#;YEF zldff)yn}GZC-TcRe$;HFi0J0!&vZdp6u?{)W#u+tJc-rUR?#1#*93x$#({S<4gl`% zoN-2m2y6;^#GSP(li(m&{|HO^DM9#B#G@sDmqJLN0&K? zt!e$|31o#~YKraBkZlAfq_HwGrKz)g(%IA(4gyB$CooaCs6+FxFUF7biusLuLHwGm z_mIZo7RPq!DdK$IMWX_@)(jkvz3J-8mF2RGO-ZHjUg^#JEu8V9OyF!gk;d!m8^MTU z2axa~b(YamwdgMVy&`^bZXT8G8Gf_a>RILYl#5TEVw3O*I};P-7Iv_%-?&7+?7nhD z`N|dIV<`6Cy$2X@easQ|bp$Zp)Vaiwp_>b(I9pa+GTRPiA@ZT4tP_p zT8j?Q(XKjG*d`Vd+JEU>H78I4Z^iQ z=`uUR`~kP+AGlqdkLkM3SS{~*9T4Iy7@ z1HwS~YxB|YZly{JJ7{X#u;UH)~Wv5VCS$IgG_}>Y< z=(P(a6T}=TUb|s6ZSZ&f6aVZ}_EWxP#y!UvMJ2gV3A=E#2N$^qlxL5QddAHr6D(kc z2zM%GecELD5T2z^5A-W~5yx8Wz?WuLZr&=P$^92UTq-~M=WFHv{(pX1{@4HgC*=;j z`2MGlxrAY_-2UK=GI?vcoVg&Ojkl6n467^PzM?XHv$AcJ?YAP|MwvgQNd)K*^&2nz zW|jRlE)5M_ZsqwMH4RqRPB>otp#0=te_lSndj}qHRBpd>rTqK<^n>y@|L$D`gx;j< zyf*tr^bac1+U@m~eigsQ1^-P@Yi-vw7Zk4Y3CA?;`yI2n>iltvjpJc#BRKayI?78E zW*8?fuV9l4Q!X3We%gX^M+g;NGiX+*PT7O^c&f-_m%?!G1QY1cGq*Z0_P30j%93k?Xl5v>@jD`;Ux#I zQQFKeX^>-FmohzIU*n7Ol+em!?A5%HKj)imxQq1wLI&+MtC88`FVdn@mCjdOKr2*i zbQ&lIafKCgbzdS<1#m7w`;`6@)W3q=rd8Tt8b@K58b@Kv82p9Z(ppE-wvS@xtw!q4 znTgw*TeKYV+4avkSwGycSdjNY_XD5vW}9hs9`N{%XD5HZ19rpHd|JT*u6(|qfisj0 z29b!HVQI1|bKF7rwS`vg(PiwuyTPe@2JZ$`h#Bstw3rARfU#WzEM0o80#8 zNvS#P-6=q`TEAK+e(l$CqR->y+*15@xx7OG<~lb5KjviG>gpPs3A?o4sSpm{xP}%X zr`e{sfp&NM3`Lc#^6fT!FaO)EY_HwGFm{O36GmbBYG0eY2hfJur2v>qeE=O zOp|N5Vy=7*Ps?=dLWQR%s;JT6X%;}u>TH9+f?2v@;I|T&sP-%_Y18RPaE1}b_h@kE z;$`fhP==?6S%wR;fqUfDgoOdTMtH%)tO5=%feX#vjUd};mjy*0#LTAvJ4n`7*L~Wh zR2~xJLI<`fOw#H)){fL=m~1m|g_{9K`4gL6A=t4V`gCdhHt-E_Ca~NBmyS8Mxg?DD z^o~4@0cFc0wT}h=X`YVnr4_lN+G|3*sj%Iz0lt zPf5n0pn^js&nbOYB|R}bKJ z?&_ccgE~7y9aV>r>_nk5|4{lZOAI^V+g4pxr?G#tHBQ_AO@7s8z@$goa;xHe4jL zyWrkxJ2f*K@$4enVX-a9@O44`1_&Uw?Lk<^&$toa@Mt#)C(F^^Z7;To=9+)|ZqJrs z`=%WBl}ek`E5p}|;k4Xx*X9(=rF*JzVCbx2x0XkyXUW;yEe!ymFa zvpikid*|))(XUp^ozI?fbN$CB@ScO@Tovr@84?Tb@%(;MrL$X!H`##08!aE>lDo!n{2i7J#ehQdDS z4_hnu*%bfm^UupK?>q=C57>YC>wowC^6vX9<q}+<04~W8mJNT1@a+ckCG# zVU}&0p4M`n_@Dx{uCP@dubkn&zB62(!v9xT;Pz&`t#22 z{3TEs%w^!KPK5{j+Q%Rq^8*@%(cgdgw5U-(fe&7`U+pG)vT2v2lSlN4HY~RyCXIT@ z2VOk7JdM!l@#9tcju-WvmM3UTYj@R+Zv`h)oTjoJJ+EsF0Q{Xkq_5@dVIE}#Ei?kL zC%Cp=9%14^Ejw-KO;68qvgG4RMV*6x`W5}#M_p$wV0!?Np!?i1K zgfMZAqtr88qNxd-5l+Xc-Q04vj*?zEpG%dahL1I&6GsToGvo{L4xeJ`xre6XV}zFv zxq(>wgL^1F4KWuU<(m6TT&6M&pPHIMFv!NMo6sI1_QI905y|{=V`G=ocH6)*9on9A z*c{|Sx=~M`x%S3Pm1YnW=A5FiBOeSoMnj9X>X2s}P~+Ni1~|% zaXfnLdz|{Bvc1Lq5Psn$P~G-vRywH=oW(X8nPeUjc;O%8nJUvdf7GtzCYrFWhZpDb zCTU?sdk+LJ1l04iu3T1VYHkk=OxM<-5h;+0Q>)L+xtDa{MY5=H7V|6cGHH~p8%qEL zxTcV2O;V>**cGu4DO?;pMMl)1OU0w&(l)vzo^l>H$wEm@(3OaB>9ENv!f}yT4Qpla znf#ji0!F@zY)cq1kXzwlK@5n+xKIP9ATj=R5e2amN1F`3PK21{93kkq|JlRx6z#7i z)L!4jkonCUiwr6X2_1Zm?GGU#PqipcFqC@4jXa-x@~Hgc<9nQ+KjsK4SBT$SibgL+ zHnLX9HdZ0@N*o<3VHyw`dcx+P1Wc(mcvEl(HSHX#t>qAp(i;sx%|dtBHTKWI;m^T? zN}7OKlB|r9Zk!^h^%%4z9|e&%$`~M{RCaO#h!4W?s2^ftNVF2+1@%a4ML3v+reydV z35S2u%2&Fd(q(8M48e!%y)=*hQylY`dDsY}ApI!Myos02eiRKHrs=T?CqUksgw9}u zcmFh6`1JAFg4N@VG`~&N-q5?W65=!ek^__YKFS zxltOE$>;$g>ZALe@#1fK_x?6`KC>V7f_mSECES*m^)5c~Gc=KlXo))!B1!F2JqQ(g zW@nZSbPdSwV1B~y`v%YRJ1!Mz4UcbYs}d*P&A$`egCMU|JAtt~7<}|M(}QQ&z@dWV zJ0jGIV`A&>kV!z;+`|y@$qC!t^4uCp;k!bl)S}D08+{TxVT!r*g-_Veaa|n6LE2`z zoTvo-O!gW&ON4?3Wkyqk_AG6j)O%!M0s*0$P80BESz>U+TG*(oD31_y?U`Rm*L=6= z)}>BT_vpokz5Rf^)n0Uht1)kHaW}WnY#?KWcy2JM&FF%0oc9>edwHJAJ96shXYR2$ zp}r^?X)~WQCQt__P7V<)lgE+#2)^&+I`RhB+B5><>rjOapN5Oy?#=nTe3=a%`0%9_ zE%I6)eQfl+}YbfP{?uQ>o>|G$9g6)H=$NeOgo^-nY;1OJ?k=a z$oUCQAsG~VXK%?6q_pWl5@KEHpLlLQYS{V~UkvE_*t;oI-u zJ0G zH;_(DJMm<5n+-TuEZP8`V(#doRetS!+jNdG3PH@pu~UA(<7IsCeAfV)zZqf7aSYgE zZn=XUFV`%N+uA|2KGpWI`zR3E+k<~$BYKDp-dMa@@5UwEg)xu#4T`U*8H>tKtvp5< zK3?qlW8I76eO002o9!^yQu2=&LnUObHs>5JwB_fm-5S)K3vub92XIV#n-J~D1g z-3f@YDO(-qxa=%~^)m#8+TiQeuZ6?qqkeRJ8cglnjUixj%Ik?f`<14q>{s5LJI#fE zDuzTkyI=y=i~h76jPn~Mq&+C4@(47?Z|TdM8~m_?zrBs%4+R(LySV6yvqj8ZEd;H+accWHW#rVWu9aXI=$d+^Yd}(&^+d?oSUk61kq@7%=c;Bu`UqLK(*Ep zQM5VQU%e0&{|Ba2Acg zN$BZCaSH6^g}YovqTNCTWu8`aqhp`2VT6R*1f4_caMV+0tc~NAYa66OLK&O?!8hdc zwAA2Zct+8J>J|pB8u9oOVKEbra(FQdpzwAkO*~-coe#80!nSsh5m2rpZ__q;$Hjcj zysO{&@J>`-gQ(#p`MPnV|07|Q9_AnYg_xOLKV1hz_qCUeX>I??Hi9;WT%5d@ruRZ- zUh29_S>r+yAzo;FR*=&+nEGe|9Id z1Xr$1m223YvlLd4gSOgB4nE#&W{1Kf7WQ_!5Tx-fJ~2?Zz_1)H;CKYeh7%zM5O+vw zfZrY;IAg&cFsZO{r1G;4Udu4Xb5ff&U<0)5u$8$a_hvMobFZVPxeNklW; zB<`s0F0C@dWd})Np=FzyK4U1E5LXdpNLtb5(`F7Ye8gIrV;vSC*sz1v=Nz{t-=r=a&Gq_$CB@U`lS47?~IA! zEH^w|F5mk0`{mN**>dZxS>g_%D*hCKG?(S@ymRLsYX|Pt+ zaZZ5;)mrMz2du0TJQb>NaTSwU2POx*1$M$_qAnYrfldX`1acC+Tc7sL7C$uwZO{FJ z_^!Wc(!U?>cZO#s4X*I|?+x>OCM?^>ARNH=T&8Uvop{FR;MQX3-SSHu^^sP!97g1q z+O@W>gy~awf;4@?JBPc78O=Yq=n+9fn+$zaM$f8FyC7lg+(<-qa^z1w(@+*v2!0^C zyLSo;?Pn(li3)rs@TgrS=mhK`XVo~neGJ6G)Du%N%1Lofej}oP2#^k;aeJr_2_iyv(C0+@)m@eLS5tb_?bg-Xb0G(k|!Aq#5TTH?Nis@{Zl@5)- z2`%6!o20I5-mP{GtjQ7|!Zjgbf7)S_^QYY7x)^g$;ziA2if&ZYR zRp4c4zrF`!eDlAarAaHZG|VIY-a?og5y8Ku&v<@-Q)n zfMdpQa*BXl>IN&rt$WVZodevwztPVi@UtcCREYw@1LlFwt+lT<#r%*HgR$v51b^;1 zK*`2ES}9ExVrl0~p5jqE1yRmnx6mw7fH;edK-S-${A1&Yx?^ZPr2ceg0MM?N#_Fwd z$95O!al0~%XJmL5f5#l+s6b(Qehk5tFXdeAd}DDXVY_;5Yr4|CjXRD#G0$?)CM?FJ zioE8V_8B`-DvU8R6*jWO^6n!Da=<{BnuQ2&JB7}rp?u9h9!~} zHZYRTi6emdMhh2OPqX%2Ugn}mPGWhAC4}7KYhLlE!U&&EG5D50x@J`y%A3Izq#sZZ zYGt{`SXo&>$Tbz=ZUlxlm<7NMLLK}PzjWf6W$vahw515T^A&W)-}nkFw>UO@|NeIQ z0{O(F$4{6S@566LIQe*upBF`4ig}iT*V2OV_WJ<;$12JPFM+HbrdT$|ZJpIgQ4pB%`=AS@8Hc8zvJlH3f@m5IWygfO_I(r|?4wWq-`RVDA>eiYKpzL{;f$p(sf0 zEtH2(z4%4Da?Qm@2pplk{vNAcU0(;s723q*5Mm0U>!K}3MP_YA`!~v9v~H4T-rGDq zH`go9omhgZO|IkHf2DZgd`cE+tvU)BV{{La42a(9f^1iyIv$zn+HgwwxS`l z+CSpLf0=HU*EG3E-;0I43so2%8H}@F3vDx=4p`bGAm>=ndK3Ylq$;#2geb7Oml;i_6NJJH6#kyb9PQu{%w>ta+xw<3j8ebry%hUyg-M^mzNT7 z+Y-M+ex`8}=jd&j8jOSlM*ml5CW9&DeEx5h8 zR{r%T|H2{_`-L1aURk*eV;wKw{qEan9v%{BAK~Iw2sYQ&))+jd%QcMbUc0)Cu#Fue zcElXm0+%SIb>3QVc>Kf=dYMd~bfqs;jt1GowY2epUoZilmUGaVwkGNYP!kcaAGyyjdXYLW8UI;0 zRG*CimyD_9)rBig^nKz)9ufP?|MY}{6?Opll4OA&c~!PilVqy{vrKKl`R`Y7vx=L6 zVy$re@DLjy>+T3rpT*<*v{rcy6Q;2F36s}PP(DYo(K1RSc4FluBLfnkFtxLz4a?bC zk00*>hX%?20Vm$@H~Wv1F$HT5C{cAHi;HwTWALeTkAScAk0q!Gm`~^RnQQ}D7h>9a zlJ6>9O@2MYZo?G(N1LTl7t)>hw&!R&62z=nBYr6xU8X_lX zmp@@(U!^~7BCvM{c4~IM%*2GZ)iJhRfa;?2(Nm7BYz>!1goR7&Mtc;c4No<@=R6v1 zd@^|e@d*Tm)|35SIvl}=rGYo59r4@e$ecV$p{XVbEUP^T7V`Qz>!yp9Oa}TghjTx66C)EtF60?3W+^%YAIKam(xf_pq#7MWc%G|I&@C+}P*wKC~K4%AeSz6sC30 zzpTUf%y;1H+gz}{0VG<;AJelDK+3fDq?sEVqqJ*zLh=Q9RX0|nQ%mO)IPJ3=+$DVT z|As!#v)^R25J1v6w}e2!SCl^x8QFfE6u5hTz5I+#^gA3g-bB0R#;uj|kKcK(eCPWd z!GCM9T)jSrJ#OlNIZd!b(#7+4qGPM9KjaE(Ww?M41bNiX&Cwa=L2j&gc>w#XeZE+e z%PXa)_UYWzaSpk|1$k};IqusRPLU#cfx`rG)DSXWjP*nqLQ~LFN7@S8M<_VV;{1e# zxMPsE3>}}2kJwnpPPDDSivUJPQIa_G1Phw+Yy?gKLz5HF^r0wPt0SKk=?jYd%Dq6( zHky~2xGrMcvP?Qr=jX$9#373#=VQG&6veU*jP2ZCjVH~kb$;knP)YH<~038nW30 zh|p_a;Ec?}ymGUFIVWN2KBCI^3MEomksMtE+@H+5OWrKPIH6uG$-*q zF{b9&`qmNJ>6@%Mv_0tMpa{pQuQBMqfW5>CCS0S;p|m@wmZ#?89OUEXT!{s0{10az z3ySJ5njjza3{O35Q`xR+621*oIBH}BT9u3|&gVyC3mrzE{NDt_3_EODXaKuIz8locTMp5I{ z8e|M>0?L#{HGiT+tUwDmu4`fj0}Yj9S>QNjSL2zLb|{^q*b<^bg2Cr&M61mxj4BGy zf*W6Q(!p4EV-=^Rc}l;5OvlBQN+Kx)$U^J@K_Y~ocK=oH|nMWfvn zg&ZCWb~2_Du2s-=Q8xUf#}teD2^PzC)+01b-MtHE9o7NT_|j$URTOqzx;k(#$2JXSo#j>-HS3-(2JeHQlF5nC-!Sj4MZzV?*K;1;*tp|!Pg z8M}xpTv@NW_9P5-Y>EM-z-U?Ua~w!brPx)*zQL?UNGXd(X_E%EVBa@IogZm6-pE-+C~SIbw1E8_+Aj5Py|yu=(XPSwnLRS;VUcT=ud4K~ zN4~9zNsS-~fAF(EI1e;f{*xy*>fIzMO5vr`tZfAzz^y;=VHZ*G?F{9u_jPM>CO36oA2 z*^`5f{<*FZ{6%qE;+Kij;=U%&Ry@%;kACOdadVDaKHcbX5O5AelfIC2@@6&MV%`p~ zJ)n|Mc8bNHhWa&0bOLXm#ZHuVa1}U4KOv4v2hN8bFVtWZJ+*LLA80~miH(h2PE>hY zvd7J)X$Nis#^R3j3eL{XavuF`fs*E}`t$4c{fmqZz5%%%Z($~F(^rgJwMjSqLn7E>3X2^#ZwdBdh5LN$aR_ zB-oaF&4f>VMp-ketT2MPC@% z8r)6uJp^aF*sEJZQ1}!9+&1evPy5U-&&K@;3kx&M?^2+>wXuy&Mb?Z63isGR7#l_~ z$mt+&FurnS0U;sg3%pRu3yNa)srZFlA)XjXN!vpz=;KJvUgduCr0iRFt@^24URq1Xt&UdVK%s&WXqe6 z<3tj4Wv)7la?k9-974tEsKe-AFh$XEjUX?wPc`jFsntS?oCZYb7UX#;(kpg81t|#rT{XjYDkW=yqr&v$p-$~ zH*!sdat1=WJVgbMF&1Ib2L@6+=L0;l%+P`NSbHc-;ynn{#YMmFcLgbbOnH&HvnH?W zKw;Qky3RUsd{OQa_dL*kkB_Ix&$XLevc@NEpx`H96`ctERAlv&061x8Je~Dn4O`#o zXPo+$fxyTdqUNI#q!jWs(!`7ge(%7_aLcX7hS7*aI0puPW@E}?rJ5t}B7@3Y-UbX9 z^4vzy@&&4aqu3+7dS$fSdV@s(olxP6IEh+N-uFmvqc3rT&rg5;0Ar_IfP(b=(hY9x z;h5Qx+k7Bo&Mq2HDUie<368%}WA#0Kf;f>(qLZzfHWD#YWlB?+*01<6pc~0b6-k+^ zM-hhYNW?K;RYCV$v7z2ON@c1hs=@h5j7(2Y6CZ)$Fq6GgR7DR^Yj+1`A3Fsq37L!K zwDAWcVU!(lpki{NN`0>f8r2M|>)}UwJ7BNm0ZSUTn9qCCFu+|k<0+1!2F;%rH7OA| zD)c;J0FRx%Hi(i=e9SV*ZlmiUz^k@j7GO^ETo0dyYAtVO80F^OMlBt*3%P-s^xhur z1BN&{HVMt0DMMpiurxbm~Z1PtjiyF^R#*UJIN*j8cw z4>@N1kejSN|Mb)H09EdV#g%gD%5{W>EL7jWRNj4enE_M6a5W6l)Zsvsb^5om1WlM}0k;FIKXoDc%l+C$&~^OuiAA^=!F_BA&cUB_xA48f%L*23m+_ zUvE4I(gpoIP6AotL&{B{O)}0#j@kk);;6msH^6SS6@4-487Pb^!H+;j(-F|7E0f}#U*LV!(3JS#s(g&|RrEVST)FAJ-6p(tM%Q2xzAL&}}cH_L~=_@w;oqYu#zS;y|+Qu+J8`)>K+U*0a? z{qsd^adT?G-C^_0hb$>v^1FP`zb)^s-v#dt-It7h0fav&FUP(qHfe$dfVr&w*`jCt z#JB?A@o1%5Px4jyw+l3wI!hWfco-)q&=#7M_X{Wn8;Ht)tzgDAk9;^z01!CB=8)s= z<)yK*J<6@h8$&GIx%6b1@tU}f5spWW&taFgQa5>4m(*sa@3Yuk0Hy zn)Z?3IG>S>hV{asi*#3T6BjTLU{~{}Fe74;5ueaojm-Tz-)GDY zK*A?b$J1BmV9veNVv^?erEd2%zDh9gFMhvYkkTmF!L3re*#8)@NIxj zVEm%KjFY|@8GkjjT(_A_=&@Fb_%&^f-_557LeTAlr*Rs5K%|QoAV)yb*GMf#DX25J zCGpGkaf|~#Bg9bQv>Z%82y}E~RD}*T)eaBQVndsD$Rm6`B#0X>(`G)@J?4bt zdbBUsM(@3MyIi`YT|pWFa*i!D_wIeRS)M*2-o_f*#M{_79p`xQa=Fe%XIqIlg)<7Eb;Y8|DPb>tnu zh32jwR<2wwOUs<9#8#r4<#D_j?MCg_d*gA~=I4@)U4%)Vu=LWPrK<}(u{o$FbF3#h z$_&G+=mgI8s}SCkm*bTfIheJ4!SBmlfC15< z8TEcl=Xoi-D{Sj6G?&4{wSoRl%-b?|k;jgaXu2}XJ58WW`~ zH0NnqByNCsMn`ZE<-ILlMJkA8IKUhMI1XPP-rFo+-1)4$_r_d#?`_V|WAANrgpP&4 zEbUWdhYF-A(J7MBt!-=p+-EX{ZNejjY>U^>__~5xDg$|_j@x<2M8;yv3)G?&m~oUf zaPcfQSW+1jmZ%!OcaVr9$T372m$LDrFUDXZ;gsN6mTV9KG7F_&WaePVi*(Ug327za zDV;WUADLWes8yI_z*dN;P;&}l%_u7&?G(Dxsn*;H21+$7D$Nc!TKeS4Low!v^$ePD z?n>7DvlipSxQ+JWDM~Nn#K($t&^%;PvkOxh7zoY*iTV_}WM+W%k`c9Ob`KOfS$641 zqKp`H6h!k68uG^*jqFrm$BW$;_*Xj8ihCsI#Q|t_6$TB{+t@zBp!ZI>u{j4Fyd}+M z$jUt?3z^8Qg^=aXzfqq6Y`(e6Lnoq!JXSTr4RRyH7=5K-uV5&D3zc&Pf*Pg1`}wEk z@uPb%VpO!aV#0bwUaV$XdIOp zxLx!o@$81^lVwSI7$yxpE@(7%RxAX`)J5amYnFuMMAP;Gg$s5zpt_k7r#r*T+Mj zOxwa=)P`Gn(QNVCvlsRfFXq_C#snRo4(vqDLBs(-f!;Rlg8l*zh-re!__?Xz5n=~| z&0|&NJtSw7^W7XJHcu(O_OO6A-daj@MuYLD)k9Qatl29xO zn%z|}LT0t04+{N%3WfA#KTA|-si1-z+9g2)5WoQAXWF~h{k(Vj{W4G8d+swm4gd!L z>%DtSoibTjSyfqCSy{9dI1122y?2C$30IB1;~qmr;2b}_9jDc%v9FQO z`xkc>4vzb`-{m%Pu^=YKw8bZj>u3)ymiIrrTkgp}aJbtg7A;?T`PK5B@6MJRFU^-P(=mR>>=F`rrhN}1HeItyO{W(EuO26s%inrQBomKRTQ4gYWe2|-W zVa+XiBj-5%6CnszYB41-j0O=xT*jZU{Y*dOP-HXlm;FqW3*Q(?826d569^U{CS~&7 zF^6HnY5?sd?aWq<_v82$E?qO!H?%T&pe#M@wAr1`tT=C#8NY?WuM=a z%W?0}`4d8e-09FQaPV!kC5JX6MIS|eF0A@<;4^+_B8-=Lm?x?7T=}J(KXy}A6F)Ud z-Ci5>O2SwAaqeiAk!hziCfrUTznY;i1gsH-aJYC6IP$#--3=F^zzz3q2%jjgg{baW zp4Gd37hcnm56}g^@-g4Zf!>{KrhjUZQTY5GX*6XDQ#s5>Se}d%WH+{1JUwv7M8lsP zM@r<8nLC~gK@Xk|-q*hxJeu=Kd0iJFmsiK-p7ken3P)Q z*_|`gH9N+x-(cJDB)nRfWSYdJ)(&!t`?0liokK#l*y5`oX+hiWR~O=>;|aDHPq0w! zVUmM`nin7w>!w{lfh;b9g@3>m6`)7`@d;eW_lNc%bI)hb7Rxhi)+zK`Ra2A2grTuH zC_&-@Oo~5d1+>0JPsuRr|_a~FYbr9LrEd> z1P1Ch1Vr#knnDYOBg??2NP}y_?Rz}M)#nfn8ZL^GU!6-dqDTB|c<;1*!nrF(denuG z+@pr{u>b%-07*naRQTk#&-`OsIRxccW1gh;r1}aWkZkfbj(M3*XO1Zxt?!08%MmS{ z&{#wd1auL=MIHMW`;E-63HY3wX+=6*mGcB#l+C{5RNAeXA5W7+qWtu8&f`3dd2i1{ zwYqq!Q9NCFd6~m<0N$4D&Yhj1#wIf_~53PQcBsE~?fSqEVj zB034m&xA)aeD(;YrMLB&IFDItQ~(@Jb6BI}nZm-X7iJ_eFB%lV4Tj>206Os$prnhu zM=%1Lq2E>(_si3V9Dn}wS-JZA*UL*cFVM(LOC$cUQbGhYflmk)86|}oq_H6R$4=a5 zw;z;|nOP1nxyULjjfBxwMwXltNv_P9DKRZXJh@)af7@`w1 zebORuX!Q`sNu!z?u~on{P0BF*6#gjyAS(Wpntb*smv*Eye5$uw<3?CY$?eFXS}C?Q zz}F#!!?7JXgv6xBK(@WT#zYt`Fgni(R=5jRjQuoWv;JrFo1= z|14Cr#dgA{9BqFet-@!^*mZb{ox*2MRGEmfC0RqZ^E}Va&LMa^K#;q{iWK&QPz_jF zRX*5*Ld*O*V5vj?zCYC8hXVJ-^2@(T>blwVMiNtx3ViPXfTl3s* zla1HcyqROKt9i8Z?Fm6Squsa5+e#+B^+X^%-|cvH@yy*Q;dK&uLEBjoiDysIQ-gSw z?UIKK@@c0uGxZww2~pS422wJnc?vz6OkL=H*Pc$pLn6vLh>Q6vB79J1XaSnX|mc@x@W;GUAF)kgF2H zF553t!zk-6@x#@JCcNXc^R%3gHEBfs8X#lT@&+v!ow|xXj%U!`al+{QC>C@hKqM5& z^rlqD=H5DsQ$-U2F&3xrBx82s3s&TqSJ{GiB7l8MCtL?A%amcO*YWo@ZFJJ&A+)}T z+lgHhZ}JKplBnFgVf-A$_Nj*DL3{~9%%Jdh4z4Y{{sDL%`nB!t3HT0$ZxzDU-E=wt z#ea|M#O?8IUb-Lall0)Cvb>y!2x&HI5$(Lk9HuFc zrVwfh+un0?v*kR8s(PsAU_Y9X2nC;^z4zqtW5TU5uSI*9?a|XSbL9ej#R9)!`+(Sv z=vEbYMdq9pOJs)6RYFj!cGtN$S&hJZx=V0Ofg%D}Wev`bE1<$z z6+E0X$9sYrVd^*QTRO|~WgMS_rl_L`XI*8$2n*_?U*s0)*1P3aAZnj#c=-z3xI!zS zW{kA1(6mOOC3Z(q5R*OIH6NcFripzljOoTgsQ8B%V!`HEm^1Tjhl_O5BjqUy<7!N? zdU{)KhY-KQlD{*`4AK>5Zf$X>1F0%kP)SHF^ghOv5cWY|E(|zH^<-(wCqD&$_)-9>FYx(2KhQrh9kIW-ACnD zLE!{85*Ip?v+`NW>N=*`TVjBR1a%c{aM{IMZFc!|716BqP%c%~J zsW%_uTOAz|c@jTH7$cYsIaMiL6+5IQry4EL0UH=KFlqRnNEdGNvm`lx6yav4bRl5F+E$8oj^q8&N9O{Brq1!^HG1@xEsZx^+ zG@cCHXU82_u=CEk5a)>!-i3>Ib4fh;1g$nl)kDz;uKU;$KaO_c7)RZ2L3M$DiCQw{ATw=jRb>UtGX; z1s(jfHUYDI2~yIeAf?N1^{wZgU`Bl@c$}M?0@thH<}kJvx(aRmw_TJKkEFmTHbr;) z%_v%k9DCmgMtb5zMG>|GNg2ZW(=c|7kTo%-5fKc z2JR+8Eu(GB!Gp060hT{#6I*p|3vhx^ow3c^K{W2>!LNdr46{tNbnZtY2#+@}-g$Sy zLT9}TqiN)z>~{tc`oa+E$6#O}LsvRcXpap&Xyo(yf{gXcxhBM!R)SOM$#Fm-;UR~H zY|{_y&_BA8=4rwR2}Lg7WsV*_T0(fv${=d{9x_ES!4r!Bm^heZTZs5GZTs+4tMgLzri2sF&5TRx^)tcopSl5B&& zL^Kma7!FU#)K=0kLdJQvuS|04oZHkKKWs7S>b-gWoLj|91nVI_eMr@MXY7)8MqnVU z>vizq$#|Yt=eD~e1a16hUtxk3_DJ-XbLnYQ(sSftS!;Q-4>+0I*}%k?=CiauI#$Zn zYklR<|NKgM>+PBHhwr~ye)JQzZoYrF{QU3#uH5_dYPovz)pF(LRRo6Ekmb;{-2-ic zIx=_jPl(RW_auzJZ9cV5>b;f^oKSJ%+I~RZpdM!8IR3lol1{Q05noA1(Nl@2B=kT{ z^!+{&%zj4!y^Zea(>)fuSIc`Jepv24xW%@z#q#DmFP1mnzENI(<0^dZ2)u%Z=;1_U z#murM?ej0&ndb4TKaocb@T&meL}tGtk6MPTrk;}YyqJCV)AH=HNKS(IXOiuLGCMlP z5f~yQaGRC8gJ7S-xtKT1&T?$K;R)O?lAr2AU%W zjBE14uy7$*916`0Y0G3Y@hZod<7pvu|Nuc zB+B>SorZ2eTEb;DuLdV2B+TBclUxpycEf zhikZ~O8s>sX5MiXpz4SpDdE@l7F=m!d3gtAjb4bb4CuRBBQv`SHyrSJ-#{Tg0V;KnbSQ$QLsD(( zC2(oQS`aQllNKWcc1io8kw$pwTa#-Bjke>QqQQm4VYK+hU4N%|&RshAF#zu&jORW; z9~$kJbZrxcGk)9y9@F8SpKZR7}-X7 zYL*fG*u`{eT0Ak|$T@A`s}OXLx0F{aojF}HCCqk`z5e}lH1TgFGJ z+YqiY#|V=MMJ-YBhwVbci)-%gl=W^d{`IR!$Df5$_^o1>^IGd9@aZRoGK^LId{fS& zBGx(Z<6OwaGUWz}iR`ECBjpF3Q*NI(iXBAQ2Z~-g zE4$F)?x2ye_~21FL?ZgijcetF>$7EH7BzuGX3q!$* zmwOK%hX&yJOB3Z1TQVf7Xsi^JayGC8PVf;mP1X2~0N&Es35rF$qqgydI6_4hKZ%4l z5a0<;`w$U`34%2};#mm|0lOj)d$yxu%$4{i9cf57IdSu~iEZ?l{2DOA;&F(kjAh=Z zP0Lg&_R;Q?8Y}axcC0;Iq7qzDBP<@ zv`L=gjN^pVyP7J`H~_@KSwb73p?Pd~mOT)VDYVk6Fe=qH?+vySFFr*GfSsNN7^i6X zHEP6z_*u!Z#?%x#H-deI;TbFxp5xTfHEatq04y#e2*B{{7!!De0&f3xyI&$#8wa)X zsx=T**uW`>31HGo)|bLlPg@$sprqTwr(h6QHxSOT!n1(@VFzu#2Y2q2$JEz2lh7Hq zB9Dzub9y%_=?G3&R(4s5Qu2=$=!o6P`&{#3xyuNP=+}D90VK;+6Y7Px@$C&#gFg2jxFJNnw*#ApZNsl^ z7%cY=T520;#ws8mcMB6+2GnM)E(cJfX8X!?;+6iCRT?UB5EXfad}-{wJ1nY6Hi)p_ zLDtS%SHE^@2_S^S75%hP*vh*GvgfA`Gp+Q@KBWeTq<`s`ld0oF=V-azGVh?{Dwj-; z+lHNJX&l~xER54ruzvfLLl{*UCjG1i4}o%`=1Z#Qg9G}GVba+_<98RK?KX=`O9%ng z`nK$D{a9Mr0^ck^(f2=Oi=c*sWrDRW>7gaVEbN3s?mWw0{_&KM_49iPs;7)Mv{r^U~2vG@bipqAt=f?g^uiMlwYL2L1SMyKpT2-F1nFT7G#Nop=%1_ABvg>aqD8 zVScABpao1tkwr}qe2Z>^!-#i@6#Rj^J$T=Bw8$Snc~ai{;8FSX_EUt``a)ZDGkp2N zAhpZ#oJcL&xBrX-vaCx4190e!*&4skiFPi)Wm@v>3Qbgk*gxDsD0mc_Qfj|DW^Hp= zjkwodUq339LN6s(6FJQui1!5P)mzPiiK~T58K^P^A2uY@B z!($^T!LZOfO*rpk*d&zS>{FqMds0CcYZaF2<2?Zt*yacGqWwB|7p`tB$6~byjksfO z8$Y)fqk>Z=*{L^+P|~f%<7fn)V{5hoAWvf6&@2|a?A&Q5udBwS=gYbsc?cNY;WsFc zrvRL`qt;(6T&3nx2zCN}0@(C*y>&zxi4zJ7)NLObhaAH)WTEK4lE$MQ;9chkCZ|Rk z^7N=X=_(qf{(%M3c0L|i6E0}okAy_t<6=u_S~HiCBAr7uAV!>ei4=(DJyXl{>vIj4 zzTLO>ll0)BHDSk*-9Pq2Aq=z3BIxs+VJs9*p{7E<5OVT<8r;uI(=w_BZGy3|h&HXl zxQNq+g&?U#=)sBPM;~UKBhR@&;Os(%?auU~4+>mcpH>6mY@5mf14gcVr?^P5)bR8@ z^Nh1K=yP4Pa$(2!XvriL;DEb5;(BnA(-Cqg^)^EzAOkv=i0=#_p1A2kP&mk{+X34&9+vwL zpOjH-2%NvfiAd+QQ3o^>j;0WWO-&pHCinwWCGHq79DKu%Zxk?KH4hPKGIlWW&AFha_<08$N#`ISlGD3Cr(z*h>oqY5Nl?-R{zeMi*yVn^7W;+vZJnGLxpd)FR>+fGx8oo%~@e#*EN}X%VNhT;d8?676AosPaYq#>Vu&0auYMC z+-J%|nG~qSB!z~!fO`1CrOR}RhpZ5BJow5o4EPojZ?*{1NvgfKfSp0@1D->}a0rG> z1G7|S^XoPSbEqz8rg;fU5C$5QjN&=$Z_Hqu@Dla{+)n%i74L_So|T7>A5r%8Xhbt? z8+!4@mr!4yFE`lswtb!f2wNEU?%ic8GKZu*A{>=_5%_LgKZ>G?*(cs-aHV*F?R8XkUto8s2 zfq2V-N`Dt!$e*8Shih=*#MSoX>b`l`JPcFekOn%aI|a9y;IIA~3n%n>P9iorAyNar zqX<|h5Zc?WPSNi0 zG`MvRZ&_vgh6Q(k^JHTMkJihRr*1vbOu`X{qi33JHofI{taB{fU`2Rqi!+F+qbath z%pfQnMN?c26I-)?;Y57k_KPC8iPy>Yw0PaLr6ucGrYk05FqE6npXG7&)Me8~xw+Gd zJ4t`72jC(ThrMvT3RRVd``qnoPb))4J9*8rMGT442fP#(PEBck;as_X?Miw3%}eFw z7q`p*^_Txt{_3xPjF$IfP8eN;R$gX&IbS9)8F3C8GBug1;AnaCFQLin$^3tteF7V2 z7SKgfZ3@}H1j7i5+Wp3v5r0cRB&{@5+(CqNleClLCTutTkLGk%R(8t$`-^D1eu$v( zn*@_YgE9`R!*Bdx=FXc}x3a`yK5cYH!-ZrgUT6<6soh z>5SX)<&?{5pq~=#pUbP#RHbLjyw5^s+CP??O#a1UxIpL0vxkS9agPH-L}>$j*fXR5 zN&CsU2v~=gTE1GN&MoTCTC99phi)qg6EWr%u>j&cqe~SvP1e@XK9gsb-=eN*pz=?l zeMh^GexTLSmB-8r7Ao zN(st5Y=6Wjj&`k9Z>TU(2MD9YHB zUAhiuHJ;)E9Z}xIP1x#m5XU*rR74Bzi{qwjzBTa5iVp! z(2^~gc%J7p!z)d2!a&v z>o7-mZ{I_s@J_i2!~X5JUWt=}`jCV+?TLHVj0l#bQ0zyWaDY{Ty>jQyvzW+Td*K2? zLK?@I(n~dKP~AtuABAQxkzk1^d6Pf>BE&xe2vKOZ#s@)`pSw(T5U)`n{3sJ)guVlWdHND$ci{(!z0jNPK z9OCoyoM~%kZ3hiIx9G02MR$t{{mjuwCr#67CuLrq=(@pHj4kYksa+L=a7C-(n+V>l z3b*S{vc>rP`6*7nL|}JWn+r#%W8WxS>kHAySK0Qwwt*Vyj43-li0J?GWI`#}_Sh>1JIWI!P8|CAVZ!=+d8n!1U5!78|OZf{gur+Q*tr%v! zI`XU35`X|nQ$2x5pS9^YKd+!8)z6ooEddXPZAT{}iMTX4G`y(YMuOsCqo7#`7EaeMY<{1E8xkR%tr$do1oRs}Ma{B_7+J@pl(v{SsUb5&R98F#2l?)**~ki-8j60a&A~EiNZKuiGEr4C zvF7vZx{DD;h0rY6fJt{-mW+!l&Tgq~RTJ&nH%%w>q1DSOFvg|l_a+!5nOM-ztkXBG zv0A*f$%)YGt1w>(*c;n|GN!|02$}i`zdjHQ*fxEVb>f1D3m^Rm)z(-Dk@=-VPi+T7 z0FU%0zOz2~W`5+ggP_o3G^SYy7^huptEw49fXipch%brFZY6djX2WgXNw6Zu9-LP- zT*hIzLpvI+{7vXjZI%s;T~A^!(SE=vz0}f8{!2euCVnnTAa_+38ROL;YezA(2YmKM zUnIvSu^u2g1x(-O)wB&Qk2W*YU%vM}wvddxR<2!}E!*Ab94;fLsFf#!T#DZiOE8KKM{j4rq zk>dJy(lz{PQipVm6D49wMDY_>@+`~+;R|-y3A0i@{OIRwX}d>**e{oFPL=OnyHS4d zr*D;)Ut1`UBa=OG+({ymGS$=FS^f<$ok*>4tqQaIv2Duq+b-Fx5$)#m>{<~!>Hao7 zv~biamQ`v0=~pLVZa199#Ed2|)C|`wk>h&IC7L9XXQu9{|6wM%E($vzNS?%nLF<<} z3w_N#a~^yU0`$YDav)!mm%Bn@yl=sB>f<-QTAFbYEJ0?02Tfn7WxvPZAP*9|lANXb z55i+Ca_+@nj_FOw`JTniT@HrpxQrgJvggvY6ITxdNc+#7kf%P#Bbc6ZKw+@ntFv|c zuD{NmT=GTE?V`QYUahz6I|?Zq!L7iAX+1To9P;FU`km}||!`=Rl;bHp~}&GPWUeKZNNY0NhDA(WoZ&%qna zb8r-bLbZBFSybkqHV!`+WkwdzWGR)#E*9S{PS8j%PvFKR$DT1xyY|VYNt}(*q5StDt)Q8CsESD_&Y!V$Qskyf8>rV{qQXGKu3> z<8!>bSkA11MQW&!{M`~Ps+277788n?C(!;v;}+ihdkhB&!^?HsSdPDXH z&6pd}Nv}HV+?__%W@*$BAF~`a)EB#3Jj-jnw%bOumFFd4M1R#eVQXYd)hq6SyB?qB z#mMcC6pG21bHlwo6%VpJ?GQ$ETv7IwiU8n@@kun!=m5z#vx|O?=RsG# zJWS%i?U}%*&@fKyWw|BbCDLICtUx}U#SRmwCu}?Jr{P_|?%vBUP9oS4csrYPBcB>88po%vyNh<&+&rhRPIJ;18c}1Y+>as*kuE9> zw7YOYo;l80B$1T_w%UP4+DHAt?VSXICV1A~nujqAal*DI_h}QeYW%kA zDC?H`F?#(#A^}U2Uf0`9GQ)01opj2FujEXp=9_6I?yKMNL@i%_OE`{yukX=LErb!; zE((T6y|=#|d#>#&i%dH0q$*M(j%Dz{3qOO>z}^12jUe6a#=)RAak73br;81$kjs!d zxMvFHYZ*PMI2dXP;g}Owt|)oRZU`WGkABbWd9Lt8XAdLcfg2(Gu9-CH8P@m?4vGI` z8T~3=#bZ+>AH|2-)7k@c8?YbM0Q6uG`^2{EQ~`zc1anu|h8s^;y+#>CA$5d>Y+Yip zWuH1&KU{}lbc+UCkkRx|Ll@;j248Sa8um?Ud5ps_y4}dhM;M!?UhMM#SwN=0J-oy$ zz-n`MTR&SuV2(Y((i5%6u_5AWwB{r1#qDF#Rrrq~zWExr8pIbfYP~l_!>i>Pk-8V* zO6Zu>(r2pCAFGZK!8Xj5E9Yuk2cyu?(y?s1iG9f@P+soceNuk*liNUnRy-@+*RNm1 zp6f8H-U^#w1_bYH@B{WNcrC3!JSPI5>hR5wKp!_y-h5-0yobqqu-v`7jOP1BdH(~n z3_iP6R+rYxg{$*rp5F|%V+UZ8Y?Dp`JA-Fr*Un!UzKmZd`r`;{d|D!H$e+mB#8#>rBDd~5VTXui(C2eYmlE>Z&7XN_~+Q2BK7dOGaQ9D(s4J^>rgPadt( z9-h$G?E%kuY)nt1B|VyDIF62!nS3LCPA|DN)3_jRLUo9@^QDG3aj*4YwGK1x&P;QF z9%Ex{$wI*AFjP}9|7aWd$o{(hco>PIW-C$&fXP|V2;;kBFOx2}8k>NVJ=2M?x=qhsFUT-c2&; z$GeaR=RhKoWXvm@JUicN3M6348OyY?Z_qEt_xO17l977+9YA{l&wW2Fw1 zV?^=n!wg4&?6tr^lV!{$`DpaEvt9W!o_(eZCN7)@Ps;l_I?Q3!39(Li;cXv^Y z;;>NdG7chRIwn>KchEMaVycPEUD=6RlnQ)3)W`BRB-KPs%vuBXTWMP`#}(U)yOxL=lP86M zVTz2lXckqOO}U(cCUKUgiNGI~VjmYchKAHC)G5S{t;E!wa=0V#B4U)SSx*MD&cl3z zgQWg@RIc(Tx?L41)JPmu^KB3YTNT9-w!uk!YCSqI98%dSaVA28kG-w+vh-w;mAN5K zEF3G>t_q~uWVuZ)NRW)}+l^uuzenW9i(BR0_nu&nZnsQem+kHEz7C^>U%*09m%H!$HEubET57-h=X7T5@?B&r;FZhsbPBE*(YaE{?9!!r z1rnB;vULFW9UqA)9(=LGRfDy$VaNb8&A}kot_>iR+>R~DpM7?(Ji31m?ZHEg&kmL= zSFV*S*RGb=U%g6P1QzRuYP3WZ(i)E}a_W**3MwVCtYcGNNj~hKCvGC_}Uh;zfNm1(&WnC@@jO znRZP)o^4|a`Flbd`nk?D&W;ipH2GvQiTmg0Aq;KUj9Kff10P9PiYA9hJbR7Ir{@}l z?eRJBVt%&Qntnpq3uk^4HU?e#2DS9IQRk4U3LAkipe`QJoC4vlxO>`{W&mPvZIbh5 zKPHpiRd26l&bWrxcHu4^a9w4ytBIyh`ob&TrG;2Tp^xJ!zU%KV(r8wY+%o5&XWqYZ z*UChgg>@J0w`~l)TNbql$JvhJHZa?Pldp{83T8r=rO9$AJl8*%5STB8ev_`eVoz0D zG@BTJUSB^d8m2D4d8VkmE8=<9)u>GWUZ>4#a zj@H-~;zGp{1K|uO951lF#YF^$M_@^f_k^@wTZOJ(r`^v8X1=;JJ~!XQQ}*k@h|y{9 zV-I)(`r2hs59S00An1e`S)z#gr7o3Lr55>sk3PCn{=@$ zxpL!0`du_QK`DLPu`D_TsU_?EUi0WFaZ?8olK9fFh44N%*N*^Xg41JPW8tWj$B*{Q z|MI{7P5F<1_4D#KKlxF)bp1wo>9tqOo4@xh4yJ-hr0!j$b8PPrl?g}Vj2yniB}bJS z;doK2|2OHL#T0@5(peMIM)VhU96=%J*A10nfAg-Vl|VmB{d|{`N5fLHu7dl>&wlCI z@<#dKP@OE;rzk_z;!^85ydn@HffB#wehkyJB7TveXzx(&!r!BsW0H4Vi zyl=qNN%MIA_5E`L)PTRn`^oa3%v`wJ;ZBC=`WUubPHi;J!DGgjQ@+TO<=0Fz`kj^! zY%LSF9OIohIpJcq6JxkM(+t;lky>r?!Yqz+ z;MvguT7(viY^~YE87~$l3X<^nRWE=g7nqtD3!pvxTv%RQ-i+O5?l{v7m5LgNeJIAv zoG%yW*%`@PPy6;RZicxV1dD5&czpi>WqQJi#|Se=*#R>(g$bMaIqn?VIVrCK?Gr~j z5%)F?;|rC)+ywLE+Dqul zFL&b5Ho0~kL2$q+k|2EH6K~Zent8Lp+`j$&IvqDE+yacR1Wk-|9wsL7lQKo390!XGKbii9uO++wu+co*&WkU(o zQNq=94e4{OkT&U7Ri2LcKD>b3bY$0;PMo9>O+e zsaPA*`m{F*Bo?44M+_Lk$1`#N^FYY&%$2<%C@q^%Z!}b`qYJ@0hdx z+l)^8xdzoQ>n|b6`ptX-XAOjbPa@gzr6cc#P}}g-bd6j6vy=&6#;0SHE;B$pcjGm1 zG#~!&JJH@%Pj~F91WVt%QiAIupJrc$F8S~8RuAm-r*piRTi{Z@x?gw1h|V;IPjuy@CXfN znWoe-%SqoMThB%iu4&L(tr7=Osdf)I*Vj1>nHBLN2AVnh6&5etQl?tJFt?d(@tNa7 zQzv?a1Nh@!^;7HK4bmW?#`WHKWqmhoN;>3|@!X1hj<&xe?ZK5fzz+_(#ly(YaVDTU zHJs(EWwJk~Uz(dMFTL_c`Qd-QTmJ5c_shp0{pa%SA73xu`QBB2SIXt99{xmfHlM~d zB#Eb)RERS}OHk=KgEwW1uubqL9bq(GX(ZYo{+ReJ=PwSF|Nh^-S+3ulEkF9FyXCXH zoNoB=)ADzJ`K+A33{2OqmANYmXr{Be&A3!gu(O{}CP|*eOuWQ{FSvx!r)KESuXW(y zOH_ZifCxEIYvyX~H1RAtwuXiH&Z>C2rWI&%plU_L{bm$IR%gL|82e{4X zgYA!5oLn!M9@)Z<_Gjgj+jq*HhY!(I?knH_lUK`)moAn+`2O|s`kUC}Mxz#4NOzJ& zMwNsk`*wrq!6pIQB-isTKSV2s<|@s5XU(`gymweW{9wEM!w)|$KY#aj`4k?b^zU-Q z@?{n;U&QRm4E-5BhLzfb3p3Hf^y`Ou_uDteb;h@|KiB-hLY}sUQ|mwTJ%Re3B)c!2r_Mtg?r+|+v>o)#J*bEm z@e=+N+Phj&?hL^=<_|H~)E;%3AN$hxs2XpXUd z4nEgAA)FO8pGmv%Y;Mu+L^9(-#sMzsXP>!G*u00AQ!%2}LpQ_biF7vE<*|&(D&+v< zn2lM$_WG#&7mdw1nNXO&S+8wq?{y2ig3Nd5bTyx&fY&X~ue|yqf)ceFwcR$t4v(X9 z=Qd;f;$!B4Y-`@xM9{{8XPAqc-~geCQRaTwEkrKE+)cZq6aupV<`(<|PnKWcgB$^% zQ&;iL`6)lf0a9RmHwRh5r)!?Tt+wlH z`(bN;Wp$06gInyNaS@m8`7ly5Y?)T(;apG?HYyk>BM`8dH`w2UqJXQxk+O*p)Db4| zraufw$SZg@uEM@(hrBwZ=lslj_Hovif*#veDDD^!XFk@m_(r3P%k`ta`(Nn>#F=vktDY&C&#;GXrYl z*<_?+6}2T6sgCo#ZD5OvOam*N=U^HC7Dn zvsL0Vwn_{lB$}L^g#n{cQtC}QZ#65GOI6|$iX>vNV(s9foK_|Sft{Z3(v^sFbs{R0 zcjHA|Bl(?lB@)YHT7K(;n3a4VM8SEF$d<#f5KS}KI3dWij7%CNNX!%-631wQXJv=L z0uNO|?Q{0=+~<_M7!N6+Qr@}(7u%a7P9$rJf?8i9!Pt773CA}d&8;)&G{NglSn?-a zoz&{**4>2idxYm%VpJngjX$@0)z0U+$(RZiVE7?4{amqga(PyqfZxg@zyJgFBr5=8 zO!n6~?N=Jy+(H1o#BukNn_-J^b{g#?RI`T>n9N}>a2G-1*5)YNZZH7rQSvYyhez1Z z*gC={neo^nIKj4GH0)f-QqZVcbV!A>8wKJ(V&Fm=s&*F+qt~?ZJx1IW4h966!D%L& zy9mgqH?(oqUmh*4glhZ}FzoFjGy;YxGz-SacYbn)6(vu)qt(DfZe#OvX$e(&29RY2 z#aRT1)6;0sGPt=lSs}c*l8$GlvA;OCRc_HfR!~!4roBva;xb?)%mj4&lZF%&YO8IG z6SUmok@&X#W!dsQ>$mzvfls*{|NeZs=_b&QSL5{hb;CN?HJ~+~mHxc<(z9u_;cunV zeT=8my5Me*6R@VmM8-g*(7PRxqFf)!@=B5}v%aa&N}_rjFx71t{-9qxjb%w&Q*?o-4fK zt@bL3NBb}B3X9LCpx+FTe@Rf-mUZ2_$@-19$73u;c$Y|>9CC|=Z2FJ2^$m>SudvM+ ztrZUH+t}SG6XYz$0 zd_Mf&h_7F-9A753xRf7slAQ~IIUlmGJ=jBYnZq0Pm#sakPQMW-`^rF2`1}vLQt)EC ziN!SsZeQyK94PG3)QK(^Ws(LfCE6bu#-Gtc7}DS_dR+737vs150zw!EfZhe@NIoyd z#W~U5Lr5skAZ(3ye&og7aUQ~H7`G=!F#_-m;#@$NbG`J7_kgWQ&2;TJTk*2ez4}d1 zxirDMsqkc>s=r}$kq$i*@A^dC`0$*I=@2olkxorCd9T{$=M1F}KiL-1k zo?^~-4wXCw`6`DboiIrv$GWH+xCo3{zAUy9gaC{gy)=kiDHhPQmFFRLYb-#oaKiEm z!p}AM%N^$N14EctgWsP(DaFGJhnbUV4|$sf=FLs)>Qk;&%wuh$QK_KFj$=s8Tgo-! ziN`G153>VqU?ixe?0POkBWDnn6ch?y10*op_kfPLhIe1ZH)Nj3sMig&D%jUFe@ap*(<{>pJ zB-A9JG8WsVyqkhN#~YRQ)I7C(K|)cS{}%uNKmbWZK~w=7Kp`YhfG8j_R}3P+8`S3s z^x~M>fp#ncq!f5F0!e~lC20w#vaY}>@0ueVv@uktG(IBZVRbVk#C`PKc-h7_)F&UT zAS~R7!d$+9rWA%lqj3gc37l!!_=L_wO!g5JE+NQSe2O+0s|PP!zKqK5TmZI5qol~> zVF3gb!U58#Uuwg&1>B2-=m+l>G78clQLOL{1qNLLMuH}@c7 zvmjnS;Vgf|HSdO^jpo)u2|$=+wnK&8H2B%c3$qpMq*kGlM@}mwJVZjghbo!2Wh_VR zO9v(vJt9xjZacG=81@-(C5~_r$jI%G&2!^t@s#GfrOpZxCnsG^z&rRQh(#1bWZ(3N>}d8-+mw4q$QurpA=vwNaS%vJ7B6()ULh+#By|V;oxSY|j7 zXPK3yr)+1x_wX^3(8pyA7^cwtnTvsAhHbpF2-2oeF`tSRrd3y?uphX>Da7|MD*MUC zD(b!n>oA;p;lfPBo95)GNtT%uFxVX(9-@YB=iC5au@i!#1ehzO(?GR7DNeL2w3#8@ ziJ4g@3Oj5`T4&|x8T9(y8#c8*`Q#(+_dwQR zxqkIhdExq{a^uDoR@+kWVLlV6q0h|P76xe}yJ5$3^xPQ2fRGd#1X^;->rrSeI(W~_ zv9%e2tM!+3O38Sx8k{+3M%2#5aMsId?ks3uYHijPB^@wmztC#NO~$s9hz}Kg+_PNyHLmyx>nJO- z9(=RA=VYc*dn??RdNjihaA(G}-%_yd>4H0rkZ=@(8`|p(!M&ZU0N2#$v>Yrw=;RT7 zfPXEZP=|umQ@>3+BVeCwsu@BpIh$-vEn~KJ2_%f?{@srF_=zHmvg1n1F$SL zy>XMJ!ZrFU`YOjIdL|JScQr)U5frRrPv*+`Sqx%Nae#@d;glKNb(pC@e1Lz(CCio{ zkK;U{iEr&-XQXr@oN<8HYH)bdRLBwdkRcLRuITq89PW?RYRjFDpk3$7sd=CLU{+VJ za&jLBNPYUz0XETwFbDAfAqDmUA1#-E{LwGUzxu*f33zska)6NDyx@^CzN zOcLJ6(ky(b07QAJpLbk@$;ZwWzoyt3lX%*}y?$d9O{y#9d+%IEgL|#~^$jOh^UY{>yPVN+(i(n_Li_1+qSmJNgy8g5R+}pzJdAj;~uR_$_go@lStoxBTeG zKjXl;TV)P=m+$=ETjh`b^gHES-#y3923GhnlM*{@q(}O(&l_)!L-5>pfRh#_&8QW- z3SO3$?tscTjh^_@HW~tEDX^mvPvy!bw2-= z)pIS{ukr3!A+H-k6!7UH@&UZpJ{tdrJ=!S0MxcJpSuq4N9!g`$2UXk0mBPG-aeVq1 z7qExm;bVcOMSgBsp2U`%W3@CKKigA;F@;PY^r9q?J2GOvMVcp^@$i(jk%w?mF@z%nY-WAy0?$Z zZQAf*EJAvi$TmX0i33c=sEB#YWjqxaSg2!eq>c9p?d~BYw2w7oi@mbG%Z{w4<<>10 zIoMvT-M>kcE3RL^ip}>cC{YlQ|4nwZJ$}N@Ep~6+zyA8y>VoN#a&mYX#Qrq`!3*@UHD1A(LKn3MSK$Aip#bs}ImNT( zH4chHdld((yJV(g0>?9&uvy~)z%+@IZ+8_itwWd z28Ye(+afvpj!*AurK5hlwV%mI#j-qatu5vhkwo*Iy7flC{W5Z zNIybE(4bwVFUAbQ_Q5p6!#tGYkvA~Zt@s9w`8;jcLrFpjMa>_aLB*5y(6{($x+jG4 zq1DFxnskE>2-n9qbKXO-%$dt5_|U$!?RgLlVZ*ka@nlI3It6QgZ9f~)LPsTX7mr?} zXk1N$egJydVFAb8Si$R^nQl!BJd=n#wLt^V)T07y)Av`MkLDNo`p|LRm)uP@#$3gd zu5L7LeHC&r1l*DM=DTfKDWl6#zo8{RsO) z<#C6TB$sx|r=Q$sa6CfbaTPmkvrG)sp3-oIli`3e@L_xPESy6$H&h+Ie_z4M3L1Qe z2z$<#^Q?fne_F}3m1#q9D_#I>3cTxV*fy$oYbreK?*)K<13`RLIAR4GFKq^<;LbEG zu>Y#en!e7)Xxe@-zG%VIhaiHu*E9{r_fQeHC&K@b78j=~n;dBda(Rr3BTOGPaR-SxTU}DcD zvp$RF$0(-{&#_XpNtj)Pi90lk$4{|`iBRy-;}wK|6Gelzqc9tT7=yipMytlVw>Rd> zI)m8`%kNvPfZcwyS?)es56#XCZ26sM(m#s<>oEkGLoj#!eF`6_9UB86aKlkQ4X(q_ zx9Si50e#?-zOD?-kCy523+3{KNmh}B54(b_lzsT#$7qtWr4dcP1y;pedAfdsiT3=f ztc+n#Y|Rz4Wo#MVW*hz!wlB}3i8IT#<0;CcF;?vxE<_#Nz5AeCJpV!np%OaagkX2U zn}hif!pS*t!2p`@8!AYVt27X=J(m=?^>`h7v3(r#;x!naz*YBSZAUfq@w9z!hpEpQ zPT;y})ik{KhHHO0`?Iy<*KQ5FzRYIo%aMr zo2S__@8KIdd#h0_M(wUAl{G4^ubcQu> zEhqrnjzid0+j0%_mF~8Xns_$>;Sd7t%Iv^UdJ->O1q>%!eK7~%VL{q6aYZv?2kf>t z;_A?YN#Cb@Mwlp|C4g9d(gTK&DKrpt>>g^uk9kcoe+?LJwL*{X68aP%! zY2SAaM#ug+hEVQ7cY)7dysBN`HU(`RI_aBY#dwwlhAA|eH6olPqmG(CJa8nG|M?n) zGV#bD{d%4ouebrMmEI28{`}nM$cVURE`x`LBsiIbF_&@MgQ?#Dp=wUZtf*D32Bxw6 zC3QA0r{5l!;72P{8#|wTvQ-{D`up<3AAVTA_4d{B z-S50uUVeF$ewneHDhyCfh(t4WUvN?W>QnFesq?w}+VfP~i|b)(61esG)mLHY$FG;S z-kK;Metf!$Ol7oqVT;Z_;qXzO zKp?#(r5>*^zZ~~7&Of(18z$?*(uhBK3;Q3LWBHWd78lH~1w0K6_&M>41!XE&gY@?~ zUGuZg?v~qV5H3D_Sf=ME%76Pm{#WJox6hZGFP|@0Utl-Ge1Dk6skp2|8;P<^H|R^0Ob`LwoQ+`SioboFvL56x-1+V&>!#3#k*6{pF3fUn<}K zR}1B(msvy^r!90EcxLf0*Iy0>9D8EnpT(H{edjbyzd&6%hmgnjmwiU9*k4ZG--uL# zM(OgQuQ*kcvDNX_aou)MOYA-P4To+TqT^HG#Q6Ml;!=LZ!`fT~jVV`?emA8I@4UhZ zbZF;vh}(o}j*(>aXJ(KSd-`-UYx1)_>5T49FE!UxY>3ln9mewW8P}Q!pPPa_uiZzs zTq2hJOw1K+*ZCJij5!HZ{ztya6UXD{UJM(&BO!z96aQw6)4!co14;P%J>Y90CQ*~u zgfLP8Dd36SVe+-k-4&*_w~!kuTt=lHvFnVj_Gio5PTys55k(*bL(;+;!Zhu!Yp3q% z;!+5R#mx2V*VqAui79qs4P(#HLFm(uAI1D=jjg+Ilhhe%@s!l5f8;LJliV%s#l?;y0MB3;NZ zth-1bSV=1+7Qt*}O{Kt&=b#-zMuBo%P>5!zARRBbh()p76&ZDpcdcXj8D$X;38}Q@ zNBM1GfO1GL+9Gk??W1y$GKo+$qMfJ>Cmwcapc`!I4?#T7Oh03>)$Q3#eIjjXL)hiz zJseOVg~Rh01{65bPbd(Re{{~@rcujb%~+&F1*IZ#l+BONbx~Uxf=BbTZ?+%k^aU0* zzKJ_Bd5(*4e3w5EAHv{#Z->*h>G~rbFDKKf>E?Y4ns~;^-z%JOJ%S)ap>j4>0I5NF z)D5$!KcN{m%`!pTV+a?|fj8%iYh-G9=mz7AkA3j3yv($uH``_4I?@EM)@^uYTZo#b z%()}Zpl)cE1{z!u-Ztt!siYqfMF9L8@OZZE^TrlgyY+y-;<1*+la5IW0QwQ`955kR zWi{Y#83B>6zI+ow2U21WQaDgmu5QcXkyv?3GAsDI9MHg4%1=LiM1x#G{dO1|LbFKd zJ=xWeHUOpVSs?QY$9n+fEHFq({8WKr11}{um<6+-PTnI9rH>Ak@Om7H4W0Q}NW3k3 zo z=x<@3A15YHV>`pcKL+Ut-8yO+1u%+Y{Y4{*x2UuD5X6F@kcK);BUWotfx_G@1L@8b zt6wYS(UT=?7cR%@+cGC{uCsb}_3B=^aA_)Rb()M<$O?vW*U&hlGXOpZ ztjXzfbizk;8q<77yAq?hySta6DF>(kk?*L*D`cf3RC{xJ232+jqpq{TQySns-kAk$ zb_1UJl(-0l9Q&TM-A%I{rlEUc9M8Ar*^Nh0$fWuo%cOa23VZs;GkkmDIW15p)vVfX zkoeH`tW1}P>^xHeF}Wm`r{=D)dZ@PaC|XJftRlLdbr_8~2VPxXP1v%ASI;H<=n(wW zhP)jpaLLyY^mjXnc973`W`IEeCWE2@@7SL3IWfMms$L9fRy!`$ACY30>OAp)0gQ`hc)YqOQ9hpf6+>WtuqDXXOpDi!+ zui|uo-!S+*$4{G$Lm(pr)2AkUwx?OTDEj7G*pr1JzH|36f;coUIo#y@`5Uajb0RD} z!JWHn<<7kw`odCvuz9|`_B!@mFR;yqxUu7egrs|_kcU=5+Bj&ut5?NjLYKZ$QUq%y zLGjDTd2J$1msekzMp%eZbF@MK4h^jL-sdo^TL`e}WA`voah{WEr{*zq9W+M$2OVZr z1Z)i|H`HTjEn%V=AQg;K_|-%8i1k`@l4?DB|dr)&xS z;5OTN-}~S(2In8L)ohsw;eL7TTbIfo|JhsR^|v$yVjtASkhp8pNcYQEe-hL>M(kl1 z%f;GHK3pq5{qdvnpZ@COa{JTAWu4tP3-b$QW`Z3A=dkf~xD^7-fBWaJm$%=UF6S>H zz-hMleRW9wCFWTeke^n#w6VPz6JB}Ua1ev^q!yc#IqT7hxRbHpM(23rm>S#ic$Ri^ zR+i(tU5-i`;!0s)Z7UHjaAW&%aw=cLbBF(qgqp_H@Zyb^<8GXw9OHQ6xWi{A01?ty z`iE9c<1f77go_u2g~I37*x*SlOEf+s@KOVtPLp28yZQQgH)l>d$667P{BGt0mlEHc zX6i3|0kh!(j`;kAFUFS={nfHMA2kzYGo9^x!58L z!*dX8n0`V~xWTS2rRM`2cR#{hU;@)vlfZh8`GA5Z>D#s<53Z(GKq-JcrQE=FgGW>V z_lCxuwg;aR5wefTa^<{E0baI&ES}?f$Tgz;=4Uv{6M69*!Z~S7RMhrIJEa|}+c1J4 zub(#SVn`nX*npY(+XGo{IaQlflw1FyF&wxI;G#?cPt*-nV|k;9aHQbC1#8={+Lqf0 zV#UA3J>l>p`G7sXofaljJ`q(9g9~Gj1}_SPQ}L{R^?uxC8T4&uXWMXbBHOO>3cmXb zdOMzm@7;7vNP+04ThO78UFJe5P(3Z4eG>8na1=Wgha2+0&sfo|snu=KAX9OJ2(q0JIdDbKQDEeV)S0DVy z$dQ25OyUp;WFQS9c!DtG3}a z`Wl2+hprm7n_JDpY_z$yxVVVwI4a?xLhTkU;NY8h$_w|1lxg|syQgrbfoHXWAgG2@ z3Ib~ZE`wml;Xo2wm0@lN(5l=)8&zh@$*w1+P0`tU2!#9fw-EZRv)Z%5wnVk}o?ui~ z!OS$<;V#EX$&(y@!fC~m!{yRACs1LRYIlcIsutJFqlehHc!q%bvwLBj{4!gT{lzwB z2BFDnC(uG#-(lmTivMeoWopELKN~GAm_fxAWNF1t_A1)33kwV7=8e5jLHA^=haC3v z!TZk;3=X0-IL~(IO9<8%%D2D$S_o5?mybf|ehbaP4?g+`?Z7z(Csbn!>dFX7_V>2w zq>}-a=@Qp!OFer0l)Bo*7Mq7uXcyAcPZPQ%MX53r3q29_ED6{}xpifO zL11zcqr_}$-{e%aL+IBPau+Hxu8h+fZ3zR&3>L0#$)xIRQ?W_}^QAUhygPU{RVED4 z=Q3yqL%UC-20%YYf5V;7@gMaKU|sr*j~N0)?695I6|r$nrwvA;`}qqzS&}SG2SF84 zt=PgPL$QG{e+#WP%j1?KPw^gu$)X@bb@~;75t5|w^e$V;Si55YA8J4CV#izs@ba`e|HCC*s=A=vS(3h?PNXY z)i@g*U}8T!&Nh*Y^eLnCFP1BdFTH2wRcsizjwuGq*6Bi7CxqU=LPtI^Q05pW^Bvn2 zpwo2>!)#OMyIUIChfzbTFix*`JF?8+F{ly?$2{A`AOQR|TWHYQd;NU*pZ@1RDgWF5 z{x{{PKYPmJ%xt-K;|1#DTWA)3Qf}S*ti1o>U!tA$X8G5D`fB+%|K?@vw>l<~h6pt? zK|eLqgu$!>_xaj$74{m{du{sB=85QCgXY(-jg)`)-@IAgdGnR>-iO=eZ+`gm^4>>x z%U^%+i}Latuap;Gd#PM|=_W?WUG2yAGTc|R-I%xvLAuP#cYl#%Q^OUC>fepiMEwTb zPQoO<6nfad?9w-A8o)_j7pva@u)h`v?XuL`%ks+B*-vh4?6Ih~RsQZrKZ903#nj1S zc@3KQlRy0Z^3L}zl$T$bC|9m~>Y)8^0wdo1okt94cxyZ(8ho~>)0p@S_qd9LNkW>PK>+BdpVAUy{O>#9UJOAqMgcb@UtWjeainh z*6*^Ywz0th6!7DF`{RW}W;=blCPFlMBJWb^(YE7rv>_A1jccX#;;>wdp;S7G?yAqfnY6j`0;KW{c4!XKgT^j z0D@r*OMdYS&Vcy_1GQULL3r#2S$W3dFUlI5j1{{uUYlgAIk=DeDSno_uO5!=J_EY>nV zn_#hbgvH{1go%BJnyZonw1$`~g3L-YwJa5riDznxPEnyrKU^k;$LUV0U__Pvr-`?zM-Ya{M5;lG_=JQTltL&f5x`l(hzSJJY3%O@4EU@ z?-{TAJ?YT-2T~Sj7j00sJiDXDwk?!ryTmUM!->aO9HQS*PT>}Mh5+ha92=yj)kMf> z;q4dai^@Y%SSkOJ?JR1espA^O1zWW(x0oj`qvZ4i^J_=g5E)^2rRY#$LPkU(woJ5V zfhepEjFXQ_aONrA;}9Q$3A;|(J76v#9)r%fODAf5#@)jBZvf*HN7yaDPFyDK#OKiB zjStSK{4*g1hW;ILyvh#7D(`;w7}elg1m4AP@@RSaB~LUmL5V__*LpWw?b1DlDSPju zC*{_ih9RpJSE7ExMtJ z(;Kq$X0ZboJh+17L|MbDo7*Yjwpj7}NVtbtNq?Ko7$-a)uXYB1Pnvamh3y6C)| zg^NG_)P_62hJc4G?1H}#a#;bS6P>FVgV_*=toxNQ;2Nak9$_os*5(v~7i>JRGPRAi z)SX9Y-qG26+VLbdG1T&#q70*`sL!(9*pr;s==e9+&@yB{&o+7AK`Ztl+I+Jd9x^vG z8S3v-sG5qp-TX2w%8sAEZ0Zf*?er~=Ur+fI!SFXkb?rQ& zqWNI9*vEwi6-@208cLm`F8+-E?GTOXQMNN49Lz>I%U~N!yA!5s{g_BRLi4H8F4G;S zRoe&~XK3>uf)R10N$p$nwh0-(!kIAQ8D+~nOrqjX-#}*=lV8y&>2dfT>wAnm~k}-?+jP|b zK^C4L(8Plb&mQ>I4$l+|6COW2oGo!2k=5JZrHlkJP*#6=iA*hFH{j6t0GCR0Hf6rKii2WaQO ziD9Xlvz_0ps3uI%AFor;{Ohkzly|;$1%~?ob0QxzaNH=DuoL+DQHA7cOA4_Tnq$rJs+MfBeZEw98k@2S0hYJh=0uT)uu44a4&={Aeq{Jg0r* zW*j2TY%!T;7a?tk>bGz5U94uib4ZidN=99z)!#Q6{x1%j?X&iOmMw%i%xcw!S!HY7 zT{KocyUkYK+xMBku5zH>aQWBY#s=YcuA%{Zk)19qI?kv`6D)`acFMCQ+y}j z2VyAyZL5riUTsJFOxoN6m+dQg!gg`hCLH4=SldkHf3m+x5|UR=jl-NH>1(sHJ!Ct} zXBPrh5^xcZb#}hVLu4AKT~$>3N~UlS11F(cgZX8y(@mCkEHT4kKh*b zS=b2Y1U<(8fTIgY2POmg!`W@bcprXT`1f6YAiw$E^i?D!9J;npP+r1_VJ@rNsU-{% zny-;x7nYii^VHKuspuaC=5rk)KN1*bPBa8>qiy}1w~+&O$P_?y%1v6k%*7On4HD(tNyqhV8Kg3}J2b~nSk z4}>f%AuI!2=aUsS!H>myfhL_Oj$wI~HN7K zkZ*Q(T1Soz3h#&bor?u`=eXiEQiBIabB!qSi@WfO`^0y9>j8(iWI1S8@WlP_N6wAa zYEvlVw-CSuA&?e#OXCb#SmiGrKSN`V_@N*K454Y8r6*jvG)d;Rb(Lc{(9k?^L~mSR zkLUC^{o~GJJBQf!z#_H^?<2FyZO#q8PQ+=Y(Ig+)hIiIuH^1Y#S=?6qW1pQvXs2@o z+OV%n8m@tAyu3UA$gS(-M&EcefPj$uVbBh+laJJrQ$%oVy}9k15>FKyuYSV#|h6$Ri9in#yg%4qHKKghO`vtq@+Id!NIpkq>&i&Yju@WWW z938QToz6wIOVylrkUG0cC*f-AF9dWJi03GRiQ_D|Y<=b_QX7BK#dD}%iy&WggjdMs zdlIy$09q1|sMRiT2AsHQVu6ro?8J>^_-Ja`kbUMake#>_fi@sd+wEhuN_$rjVDEg%>p&%fZ6Q;5stK? zMgrH_dG;fK8>hidFqzv!5aV{km8B(qtXOeE>DDe=li3P-j=ZKBXteitVd0QT{}6PB zy)h2k+1XiuA?FaD#itya@~o_CfOdJOOh4U(p0~>dgo+C@%>Z~nhrgi|OtRJJOMO?N z68OdikX-PpbrXl4pjAe!GECt{&_tNwM64?prZ~BH9kupVwl+OstFao9j~HZt@6v^G z{pKKBhutoBk?^!h03R_kh{f!@=0mNQb{aCp z8kau6@O@vO+tUe4+@|;Gz|@Iz+CxQYlb^3N*XSQzU5>5B2%$6#E*-iOs~yl01Zc5} z7P)1ANh>$|_?cDEGmT%Npu#M1w#Nj_6XZ0QtTv?D(8iYbWH|ciqZFQcTCs}hQXtpTnY=V62md@^JM|8r}_IA%SZ41y!`CLha7ftr@Zz03+4B}r(x;K9O8tH z*?A7NvG1yrfL8heM(dK8`hvJ39dV%Zj&ef4JHIf1o!G0`ahohxE>D;L_dmT~e(@gL zk?*7JyUKQC1k+bum?af0@p9=TGNiE?rJ61m3x|TYmoTR{4kj@+pUwAjp2QTwc0)wY>G( z&GPn}Zy;PBCfo+w=?1t{GAI6B+SX6O ziP}hM`lJ_P`P3N8X<(*dlgLrcG%{V=iHalc6!0Jo7d^Yq7$CT5OVvMk1SZ(ptPNg+ z?*=iZ{kMV*7x>~&W`oYqkkQw3H*{@BXH2gml$RPO(l#b(`_py0jd)G}{1Q+bImrXh zBopvRywmvC3{hi8@|{bQUAzmA@dJN+@ICz!whm04*e4$%ehUYEFbDEk+KP6u)VX>5 zgu4TK;y4z3nd>MlmzUe$M>}w2x?JE;xcT$gQHM8H@!<&zh!5{CvBmfv{N8r7DYXYL zy2}e&^5ZCbsPQIVj_f4mHocQ!V$Ew}t#XrHJct7$4#3wzKhWPY=AV`@r}gC7I`W6r z5N3L~hKG&JUc;R0W}^Kkm*4tMZUF8*>!F0`A}^sGG1wXg%R?d6M323;v~_F)Ul~9t0#>{2~ng zhVy&I2;Y!*n2KRlt!5#|as6NgDv;AX&m{)6_XljIl;;Ip-?Q1C%4Ui_mfr zJ@C>ECOzn+<|crFbmD%N?zI`_u-Vp#v zfTT!@a=X&%XlG{k%wJt;wWG6VR)!Kq1CfMx?Y%4SUC;ML+f9y3 zZ~+OQL(`S$wVjC1k&dY)g=^au`Qakf(LANF2`wXM0|Vnj;RjYa8tj#M8f~^kbR*Dv zg>A=AKXsJKZv?{di^2znOcRY}+%*{P$v~S3WiT*5h|L$4hQ?_a&@wK2^IOE@(2XFb z9S)N|7Sl9WN2K7cIU? zI)o8m8BU|4Xy@>p^dyZyR$dI`!JYDnv?*T(0zC*0C)pmTEr=bo?H&MQn?c$dhC`P* zVRq^2GFq&CF~IiJ<0({EN7>Fedt!=?VT{4YNra4>2pQ2bMAPu%mD^|<+$>{g1|6rv zIu2}YZ)#-J)yd=$X-TGPZkoIW2L@5hsXRouhTazJsM=1d(zC62k$Rx<+xzouNu9e# zXL&g~oN2c29Y1y)fg$!dPO34vQ_f$w$rk^6lmpu$>3nC(Ae_`VDw~~BbU^a6zotQ{ zLB8~zvZ&5{=)9Z7`d+`+dXfI^lCIw~`hNc!r-u2w`@!%DllmDnhhvf8 zzwq5wK^J&Jr{v}Iiz`8OO)brrj%&?B#_ zgijD&9o&tKC?p3jI-^RTc8Di@GGUx~v#Vx|5duPa)0Hs4s69By%B)*p71(RUT>s<^ zxz$p@&vuumXbiYIC>&!!!$I8=+OrDtwQYMuf3|hFl4*?4GItQb%I@+ewqY<4IZRvC zdxSQJ6OV;H#QSWQ2OTk4gKl=vK`Zc2nk5!NO;Cve479Cnq=tuA*h*#lyuC+%gb9QJ zG>vOtk^=_w1@_?Qz-rZ#?zT2Cv^`XgV;^t8RaeU)YO7@?S2YZgG2>eEA2exv9(zlo zMUc#ek9zV8l)U6mU)!xN+GPhS{r&c#+KpuJM89CZ_t;vkK=%lISZR~-I}!qpE^}<2 zn-@G@d})mSVVVO&`pT{OtL3-9rGFp!9$I|k<;=6#Qk(i-xqEZ2T)TLyT)TUt-1@s; zm-jySp#12EuaqBrpRKO20gQPViMxnGTLm7E9CLBrxXH<`yL;}2u>I_C@;(()fk0>& zRlz|gxtjU{7~<#7i#l1akfJ^{af1K(pa4=~Mrdu-fZU@h6V~80ECZsbl(vnuf*qlK zY>yL+6n(fj(I}V~;pDi+kj<~DI7(TUJ@I!+`%k$syq2l|fB!gy6Bb8cW>mbu%AVi6{A9I#ycRm1s7`Q>@3vCfRLx21TNw*f#7~XrB4bMHGeZv&gZ#!vZ+k ze#ejjOi!UOG|3_>3n2{MkOLr=>T-PIn9?%IvAb=uwJL~>uQc}?v#q#0b9|tLMBPvV zuQEnoU@UiwgHvu}_i%v)U&nKOoc1&^b1KZ+jAE*47_&`X9G1th5@imRO;V7!j2Rpk zz@4{i=4O!b=>R_ltBh9|OS_eo=UsTm`Msk(XJqCzvDQbySs)(I!6&?%51%1z@Ri%A ztCM%K?J#$Qvn`=aauFB~ilEX#|BP=LRsI&HJ8pVIK!uPOJb8_|MDQPJX<|kD;c8Sm z_sBzPtTW0)tUv7TjC6qOdk&66s7TE<(HKv8ckCcHh#&g7nT|K?zHG3~*LiR9iu4?an*L zyUHR0(I#9Q-u@>clC5yUvQ5vn%`)4MZ?M@lBg6-W5hfwD85rxuAUzpj;&Q}on`lM#pn0e9P3^69 zt8HMVB*%74e$ULHbhYG|($V9^xlL3+z-w+G93Dg=4a?i^ zOd41@CFZ`Ym?iwIY&J)J)(IyYRY{Bkkg#fc6=y5GtBzJY2O8Rm(hgs&Dj3al6F^++ zqg!ufpjv4nkV%=yAx=1ME2^sncG77Npfj*>O>I96nM^hBQ5sLx#ua=hD72z!Gp`-K z!IbcoXGEvla#Om&f0Rx3C#|ILj%R72Cej|-EtE=Z&8DPz0&WmbTA3WB3GcZA7^^cz zr@-P9wA2P#R4x^z?7-MAt(yGmav$4_v7Lf&ZEX%s0vi1V4l9Bt&U*ImSl!6U`qxYl<~lU zckA9XD`X^2S)&XGn3xaJ0FGiDSX+ws=DMj94lKbD?MSyJdoYOxbo&MnQerb>WOS=6 zVH0Cvj?C zvYs6DuW6)z4O7!-^PS)2JsZI~Fl*yzyxT_3urI>Ng~APKX}cy|wdZ2nHgBe3U2_XdclQwC7)FW zeuho>t^i_!0oA!41iaGEZ`SB`If8f-eq%#z5>7Jb^^N zMJ?q`pnl-KKR_$wVGs6S8HZ~fC`7=TNWwJjFr#2u6VATIKUej0E3yM2>x`{hTZRhYHCSUL!SPq&T!`MzL zG__6d>ERUHnGx)~4VB-#+gm>P=vKLL=XSaH5%ytj-9@|XT$$md#gR$&pAv5m=CS1t& z7^lONn98|)qny8Vl|FqQ!TE0a*0;`;=U+O79l{gX$>wBk?E7IZd7rbsAMPIc;qc)2 zik{d8##}rQ@Y<#Im^gp-@vZWyry1YFbjrX;IeYSSdFs@ua^}=&#wzqJ;HCEZrx&gx zWWN9(?v%4nA1mMe{uzXujAhW6Rd_Ftx0&*hsC@I`cc6eJZyyqx<=nUEi=xj)qp+8W zkOu#qQ%7GLh5b7u_In&P+fmz7nU4I@8PqD6{Ur5|3ATy`+V--|m2RDNO6@@B7dtUt z%CU`em&06zErai8bNg1urqaB^x0Eum7~>Eje7HCYsRyT|xX+ec-1!;E@AZLaAH%!( z7GTq-xf-S!Nj6AEoQPK=)l7jWUiQA#<(IrBlp3~%Xy1)zzt~!!YJYm-r#jvXfnXC$ zc+$nfiShvjX`DiV#7Yw{S}arxeVqkz7l+-UqD{NH2}bis3mgivflcHA?7|HqkkiiH z-8IZDF|S%hBXonUzYmbuOdtpvXO1(2vdFl?I?PEq@9aWhC`M}1GDy*kbj-InLBQ;N z1KlWlW}O5@V25Igi}$P8z*}bCw}>elO~))Te|1-44-42M3^GR8Z8pkp0EHz6JZvXM z3B$uK8M`ekfTssfAUsoW6Jr+|;2{n*>2n)2<9(9hCy|m~p+VQk#{$Wwctu}Xg#RsJ zp#+xBX0G9vAUfXipk)zR=Uo>hFp7VTpYS3+UtNe-Naz^P#d#0q3^|HgX!u3_B)o8x zlUe6NUJ`{D-m&WN#)N!M8UUI`AVUM^%bX?)wD|nhXfw%D-7{&{C z;~8II;SI0xT?Hy$A9D6%{Tx20*&??{2aWfI5}$y!&)1h0efaD)dAF?h@Kce-JWJmw zkB4F&@E{3OF$>|yp!G&tK0H2-kOcGou=6mR5$5`R$SLd>);FBPC=-)w+s>qVLq5QP zkEA0Xr1BJZK3ex%Z6jqM?QKs@R(VLYU*s-{YFP*)1LRIzW8i=#8i~|MKx?<^UdJ4hcu@O|^$FVzvQQh13%jHX#$P31C zhsMkFu~X2cAB~@3wj-0 z{49Vk?jDBQhGG8vo-{m|UWThYD7me}<~!)$5Z(q*mvDfUFVV4CY6RA&<0-?|fuCQq zDB)d#OWw+NYo2<@DR5)hnbcsnJmBj21{$p%F5{MZ0UJ-jp#$O+AZ8aFaD^E^E-&jN-8UF}r+$ImchhGK2JzzKQs=qV8OvY%^?FjlgkK!lvOiel~ zBwVBJZZIHoA~1@8-fbIhbFeY9&ZaXlVvwO)UbIYn5~g)G%SAzxD*u>1Yj4I2Rj&BY256+3@}a zs zJ|T=LJ?!v{wEY$j4+lBuQ-hhXFnyQFs_S^nkA}%U%lx^J6AM-JJ9R+3i5(Yr4A|Q# z+caF{x5DJ!3D##zP+GW1c=Y&4`IA3+747ZSa_Pc{<T zqMUqshW2>AoPYPD^8Ux4m7o3e1B4UV0Tl## z<-Om0M7`@SFFbn=P1|pm=MVx;Pk9O`yhfZA4qdr)bp`F$3*}?#*K;rTs+ElZ06+jq zL_t)YVXO4%^2%$oaX^r}lfH5PeiX3%bV2OM5rkayfgyx|iEQ)s;5(Ve$(?ND@5wpk z-!BheHYNK@c{2JE^6a?FpM7w2LrrGAX@ zj^PeLt~G{>bb#I>YCd=kddDRJ=vRe;wMnB&WuNRkj4rSGx5fkEA&_*2uVcP;qRvUG zb0*m2z45YNAmN~gbIgp#9fX2T5iaqr?U!EdF;fIM^kQ0pj~y7Uj(rXde28ZV2y3RB z?=jv5=}uS~t_eVR52>^b^KeK7g6r&d((W4ydd>K$!~q}on8&#Ltfz;v$5hh&du-cX zyiJ@r7D0O0MK)B10{Uy(7?;K zK81uRBe8w<=KXaJd0aq)aFKB{_N5Vw^|FdT&DQ6cqcdfSos5Ghl34bdrde2IJ2Hn| z-se>21q7L^EXvEzDgewNqZq{mm*$=xIMAU%)?OUyC{YHvFjMgp6Y&BqaI|!2_4B3i z%y|W2s5hY*+a_=31z}d~Ky3Ww9O0;hlzaoP1#=}_PzgF5LAgq;L2aj2?ZG%@nPA!& zTt}gb;X30~mWPp-gqb7iojfegN6@BJF0vQ03GSqkd@CY3X6P}q@-*-?cNLk$D~F!s zU0@N~OU2xJB7E9P24A+B3d78M&SiwY-$^PJlpL!?+hRigOVpO@e5nw;r@!$mvoUN) zj$&_Ic~Q-WAoj!3r^8jyEpU1`Cs1*Uaj8lkjB6n2Y)ZVc_*ynU*|W;Kt_%qL?X}@Cl=4&VIuI^XXXB_ z+huoazWmK!|39p}pDAy>d8WMb(s8sXP|Iy9yc2yP?V)zQxVT+@^V^H%!sTli%iJ!f z*w%BD34#QV83*B%h=*z;$jH1_CJp`X(Sb0}1~L6HN)Hj0HphN%xU)||34)ae%y7(z zbfpfUGVFeDeoU^-f#1}8k)y2?7QCdicQXG{#!6t3Bw6&!Z)*L7Yi<@sw?abRL6Zv< zl5qT+j$Zx*l#QSSH!@7dpS4RS*kF6ChEkXNwWsxV)8>&6?uTLez8(G;i-aP(~UCb ztHNTBV;`lVaKgXE0STL~g0WJx&dSlk5~}4`4!?Q37du(Q7|$I;0EoSb;ej%JoM#Ue zIdv3`L<}gi8nwoWUDs~UmD|`g93LAj({y$-(<5jnVr(~TKa#juSvK%Lxd3ag(gU3R z#B*y>DPM7ji*~~Lq1Dkz4ENHY9GjhGJKUKvPv^Bry7PCh2k&b)LK`g}e!`(!QE#+0 zroAEuVB>VS)`#k9dP(u>d)Qs99`7t`;Uq5^HlLH9Gj8W|`s6j^X1R3wCk){}xf521 z*g)Cm=ya(UHEnsk?e@bCzOXPFmvL$s%B+59?g8It%5z^HY@8h|VFF=gX*mRgQ&00d#GhNGrwzGweERxWVP%!m1p%E+ik)!a?g~gOU?isD zFAQG=2A;wfSL;iyk8$U-$vQaD4oP)>t2k7@$KDBSa!wbQYgZo}6Z-mlZe;0J?XdLr%~--v<94 z_+1+H_A0=$Bh(hEHgXxrk*R>gJ!PSp_MCt{CwrOk_4h_CqW;yx&=4DQyzj>|v{OwCD zBF>jrU!5(le(QL7`PGxu1#E$_AR^87;j#}e3E1|iPoGOx0$RVINNAOs&r_#*Nsj{~ zPXBRv@7;N}P|qWrxmP~=?Jv>xdZ(Oy?&)#@dvR08CJ~OZIt+bHCkIhLs)-BiiQK^m zpNsVqLG27=Ta~p|{>v|sDi`yveNFq@9u}I^%y%N+c0N~}>b?E-p{FMZ@=%;F>rpd7 zn$)V`kKhx^beqX5atCZrUM!z}c9}A~OZlcwb86RQ6CxtSl4oKo6!PeS?5Fh9Rd80aP6?tHiRsq!^eut zzFN@4GwwmB-!P^wCa?*viKIT}2jUSz3GYP6mfe^M)#+af3-_hM_e@`yCS?x9r;f#H ze7w`~O$fHix`WUX3VDT4P&vX>zviVi2B|`V8mfN(yu0I&h|`MLdZ2t7j2f?4X!jX! z=jZN*~cSS}rk)Snc z=&yF9&T)16^8&(34}_3gkelx{9AQ;Rs?Pcn`3IkBqQQZd<4)_^1M0eq1d-J!*G$v+ zYAY@;qZP^mjM~~MN2-t?f6uU4|2)aronAu-qNA-21%ND<$3tnpW^u&aq}}E;v>}L} zb>^YALFv=J8pgSe@eQM(ba>buSJFXP6-qwYZrBbf8;SXvvJrwM*BhpzRcLrYD3+76 zEO%l#c9&-?cjZQT*pwyD&v2Agq)Ism(c&f;3Kl##;OOLMLjWuCVMa|qZtUWcc`3q( zpm@dvOlFk|bsvqVd$+Em^}(cSe1gLu?y+@(En^;C-i?q2;fa-ha#DLp+Ncu=P7dM( z*H1pZjv>)`)PK7W5{?r_p`vMfF~vZ~!~!`p?=QBT;7rS zn~;1<#`HO9X)}PY-y@9ql7fC$BPc6s*oQ(REYbiA%A@7lj|o3gk{+!PJk(E}e$BIG zExg(h8}`u^uBMjIy^6QYBR$=cHiQ68;cO?4ha}5)Xu-r&dt*+#tD0_vHL`h#A2i_Z zM8*8uC@FYVZ93B6*$So$I&#;TX9z!SXkbdqE$L|q@U!y>*nHv6YvA99+V37(LEFRd z&YGtRGm)oZT}Mc}zP(=V&F8A8C$3Jg<#&XR%+sES&?4*~*rAizC`T23R_bvSDrTwk(5eNSW>Uh>usW%W{X@_zKTbDzW$B`o&3^r&7k)%1u zh=VMME}o(NCi5QRgy~9>gOYyW)NT8sBxcrOzgwR)tY!G>nyk0{;u8UC8ALb(QFpYP zw7sp+OS)GG+&hWX;awjMYX4z-pj{e;)~?dVK{~+oRO8rc9QDs_Bj6a3vmIi! zTY-CTA=8mD9`_iOZlYDVgn)mYL4(edi#3MbO6U0c>O4_`pSii=gZy2#d7(xiwxA=uEPnStX9hc zy$s$4`lo=OC%zAkaw7cv{qpHm+E%s+UA?(nE@NBv#pkA3G|{*@?Hk1$IA^9IS$#Mh zJHK{P;?Ph8GF$~Uj-62#eU8nropW}koIF0y;$|Nw9&zIQ6kPQoGcCU5#|x z7inQO!Uam5IN=cin(uLIVAnXEpFZ!oiMlV?0XUth?+fP(VY8)iK^aX68YyiN&CRbc z0bC3_es}IEB-}wOlmkItJ6B$N^I5c3(G)pKR_rpNK`sBo&}pUl*pIDH?T5gPSMJ*N z_CU|8SLVw_PBH%YgL~!brMqY!uaw>g1LgFYqwx7@v*(oNgY$JA|({fOA`96oQ zT)nZ#!7JCw^oghXd?7Qk#A??o2SDmAkR24x3A6-9-P?p z)9ZXwkm3%WU00NtQT@;DV8oWQ#$~VNI4H~+(RaA0rcf}(9kLt0Xh$HF!X>vmx`W7Z zNUPH&m>N3H6P;)58?&_1%lfID(L)$ql$6fZiA&1~nwPeZb%-%Y)1Y-U%^|$`YrvvX2Q~0Ax0ks;ao-B91m9Kv&HMlz^n9; z-E3Xa#L^fRJ3_Hynk~kRlNA^aDclMZVl<2~zZOuY6aD2rq80w?BBDqY=Bd@dl1a*>@jD<{FHVFHKk?T6%PP$ll&lL} z>VaE$BR)4nMNXBr@nUTK($jdB3FBD;v785e(`-l=^+#KYA#{S*w-I)D61i=Uf&~0f2a> z!Jp%A67qucCG!!Btj6nb;$jd@8foLw9S&9Nup`*#Jhp*?b%a&$*2kib!a}FXnT&X} z!#)nES#o=}+IF4e{?0gt5pH#nawZ>RYL$Gn(J1fq!Hf1A$qNQbOq$@4hGTKfG3;vY z4Gs0~2b3F$WDG?u&0-kFgHd7uhA7!;6OOX7C~b-@z*tN+ z1M(qx)I3k}v5~S}G;djo4Ii2oWCu?WlpHw+Tf940?%ceACe7{gy*FMj&p(Yu z!1Z?ktgRJ}IA3Iy292l5sowJDTW7mC2?wGv!!sv1DGH{M7w%40oj{VUAWjm8#pi>ZFIw63PvQVp~S;rSAh~cO;wbE5?iY?qk>0v^v z@KVNgGHJo7#@mIIU)ri_>K=C5DJD;*R-G|?gCU6D!^c?R!AJD+OAY(*U9zQwS`Z19 zV%*2j`(sHB9n42?_Rqufocew8Xq?tH%U0rE%L;sgQf#Y_3JFrRIS4)>?~*Qs zHt>b~tRI7_A@Vph%U0*vVKfY8StZ-xl*T1Aey*^3wpni8x*Pa8_;TB4PtPWek!t(x zG7e$~d?+m=G^J)4Wd~P7eEvNeaLVS3#cQW&3JIf~mhV$E{nEfl?kc#1P5sJkFmYd zm8)$uvTS=)DIdn3rJX^<;$j(ChgbEUi_@Z02s|=8gun^yFD9Hd z4;hMUlW()@@1gGmF;83Al<`0)ZI@c(I!HwTJ#d-Ld~U8$JGszrqt&Nza<@=##U$1h zECrm}MybWv2GL}s6Ple+)D1kPv61Y3@snDjVS4MVh~B=-K|gG9*`nQcdx|s|g06kE z>skLRy2&4sAs}#<4*3-veBl@0xx^>FN_W#2-@pW7`F_TGO^Eq2jU-i zZ3FXzeVTm9L`_Xl7Wq~f%y`nDTW_#fSO&=(^Rg)Cc3ff-FGzx?sY|bfSjx#$__2-U zop+CxpZ@EW^4W)<;`dY-4euMH?l2y(|L$VH(!gY2IXi_0-wQ`EXL6fUUN4r9-~X7? zkuPGywX6K)|N6u7XMg&9`N@waI9-sMCyPn@nyB~cf)>6Qpn87(y#{Sc26~{yNI(3- zi-YBvX9mk#Z=EPV|M|u8fBp5pmQOyrT5eptUM_!fyFB&W%jL{7XUjB)U-YmoUVhw; zK|XY4>=N1@4I=VMv?(ogsDt>KcGE5U#7`>LJCDD!ixe6t3EPQJIPO&4GD4qjKc^`S z^PX)o_a;~yg-+an`_T7x$R~OdwMPI6{^DyVkLec}RL|%&A>hQ=n?8*!1Suupq=>g z6AtGaVaDV^`MbZpTz>lB-z%Sd@L8E*jPcyl&y?@~2VF4#LC@$RBcE2p;A@7g8=NGn z=1a^^8X;cIt8Ix*;x@F{<>Xrr7dY7UX?kgdiO=dP<7Ov6hdAM>_~H1+?S#32l}NVG zZywTDAXFq0qow6%U!LQN3SO9&lXJ7My+)3VTjL8ZMhCTCHQ#IedXIJ;U^STWD^Ae| zG{mTVK+G#6fS9Gz&+myr#twJ@t8m-t)kxkG+w5D6S5vNEny}4Ho{dG)5Kwgn&v@dX ztB{8NzAkW?q9V+yYN7-VGxyl4NM_QMjoc>4z+7>qrXDTu4aR@}>alNy!TE zEGKz0{JE&P$ncSQfTnC%lxIHBOIavWKvKgFP1+jU8|tCk_rq3q6ilEKc!{I3jWK!|sZp?>s z$CcxcOegt2B64wFzv=EtI(45P?=n3gwSxI1{oNw3;8>gSE=CL@W3h<|*;0fyZaZF5 z%Ma-nbn?x7$8M~oT|?Tazm`?YHK=%tFgyrpo!yM{bITmgh$7P17U>7c_N825$SU$i z2zV*W9p?KnxMAzDmL3Hh^__bZ4}{M%FZg8nf~(_X50RAO{+z?qILXYUVVU?%ko@e& z=CM@yHch4|Vf2G5gkqv@|5O>jJS>j~aHBO?O9P2KxzdBle z^5fGSZZaIewe9xqJD1D9oj*?@&mocjae1TnISyqQr$Rp{mo9CV8@E;&_zaX&2pCVE z?kh91APW+Etg4E%bkKonyy~Tsu+gXlV~LkPGLN85CJf`95GM9alLfqkQ118AJa!z~ z$q>D;;}B%yA`?Ubl7HzMA@WMnf$z`=_A=OZyt6%3wpOqk;Pzx176r+-?%gZ5?%YB+ zp&h|t1QiG=Sdkc;oCxj8qo}m6E~C+hJ+jS>)pF&=Jp>!~2!pVk2FY#AQ&R|#;J03x z&nl~6IvVOM-Joe;2EOq^{@Au`(aVcg&wh}d;vfgNS*|iDyF0gvu<||vqjA3Wpvk6@ zeYXP0#K!lUbjBm#rVuUOf+SL*rmb%dH1hkGxf(y}jTIHwhMjdN{iJ~o1ie}|`5z^d zzQo19;*)UdmoJW|I8|7Y=o4Nd9&vL;IMYwOpc?~LX}yksR(pgBg`)#DPgDSfg*Nmx zw>8Pw20-2LE>7~GPBN%!zXl(9;FIU#qq zNKJ)taHJi&7_b*%(g*c5LHu zjKMMr^yEbD+41s1|8v+8I?9&io8|hYYvt{CE}}to+&TAbc{At-XobP zh)yJ0ShPGJ_Gx`O^dX9rFS+Fgno!rLr@Igq9_8fwAC}9P*AYZ5mfyT{yWF_&LAi1D zvog)8xhJ1G$tlSvOaCxKIR^3eQxZ>JvsI1>mvAFhTjzX^aYo}CpIVnkVgC4XZAE|R zL3sX*pT7_oQtq||escjgZ4@>&_j8l_+yKCRj5B%=d_SD%N5H4uZa3cv+u}mwQNPU5 z2AbVhuA!-S>1H{9`38OPd>EVm?hjrq&%ZFpK_#QuB%H$jFxq!Rj@d|-EZ4Gr42F^= zUEtagazDyJ((tPO+-;UNu&MgVC-=*ToT&ZoZ?2b5Ke}5ODwH35_ebT~bD9`QJ6*#p znA>;6K|{2!j$7>@w71!8g)JklPsSe>j>svvAdf3KoKXE}Y97<>(|D$gGPZQtBtHY$&Ka?*`HKvbqp z7R$6VxV<|{`-jFD-p)0ms=}!5mgz@Iv@_cib#^tDfE zDRh9W_0eE<8;(_0SD4RYXMY(JL_6EFfX_u~=UI`4p+QdkqWthRIlordYNM*BVf{!1 z`!@NYg(C0u*&x}@aTj=`QzN(23t*j*jEKucsEFnpa1G?IBEncj zV_e0{ATfRdytL4iio&#&MNX1k#iSDxXf-{z828N0v8c-!afG?j*^?9H`0Ob2AT+ty z0eFN3Li;gQ1cl-xlF?N zZ-zGv18lu`HUhAzNcLGOB`YXYVJj9Vm=nh~VfqNmM>&nQhFzpKs-VINPFx#BCg;f3 zg^(vSvW)Bxt<#nXL8E>p5MI+yr1%%EbsIE7E~F(R`zv8&=36P7vq&q7lDsGfnZoYw z7)F6x+oNOJYGhMN=kBQql*ts_#$hIU^Er}e!aT{%yzC%E-Q4srn+14wlJWU)&@JP) zaqUdM6Sg7LHf>;hmQV8#H?zZoWg{>5Fpf3{QTE#@NH$2#lh5HOALkE)C`3$P z8}sPQG(vZ_>$7Xn29**DR2eZqP!mXgjB)?~A}KTqfx*wM*B+F+%N#Arwn@UR<+g*u zl67rQQ+9$}MR^t9#9R6WZ{y)Sk=Gc{N)LB+aWGJ`Jq>8mh25EDePIu~g!2q^mdm-b zljViy$I5FjkAuiKljE*3hXK)hNceBwxKyrPyHYM)Jk4or<4Ei$%8i>V<)cqAE_!dH z9A{8{?zz(((tyAY`zjjOWNkaL5QA4UAVI{+A1)agT+Bg3Ss86d>flskj!v5hA*m;x zb=C?Y{v4uIcHwR-P@JI5gwy(Hp>Ya(Gzw9u1PDGbUHn5Z6-gwKnBxOK@o^I2b|_)^ zQ!!ErxfR}uW701L@{hZx z5=~FDqQeB*g9lVfQmE!BMK-GDHv}Z$VA6pQtPV-tM&H^WA&10Wz5#jj+aXejf5TU3VMcvGB6)aJ`!QEVdOW?(& zalp_+z}IPVznM zHgK=`v`lPcG|;V`4F{uk;MQ-Qb;bJbHoj<+$i8u{-+s&X$$SDEbZt9aJyJujw~xUT zrS9;lQZ1nhBL|W|7t{1-ee$4^db)75Tebl_ z^w9CB;TT$TF1+xIK@KsSTG;~WgT4>D4nJ`vQ3tdxy11oziLD_H4B`IJwjQMpsZn4o zagb&@TV)5d4s23vAl=MC+ev4g!kWOvcL6p26%+4S2lxOk{?(wBJB=v)nyB$iwCI#w z-SvZfafEF*L)7^P^tuX;=NEREB(V(#KiCDnNE9MMEJB%h#uwffcNL>2kC_tzcr~I} zh9Cuw^4BhhgvqN43mv5P(db6|BJPh!!eXp$fUW2+y?nG>x_qL1@c#9(c>i{}d8xNd z9c2qLgL${Rx}urJ88Tv@rW?>)ADf(ITrf@_+FurKUn`$po@a4nnf8=1#{6!1?zs^( ztp{0vq&;QqWIrK#lqN!1ue!K?|gWz zT)TC@+`crAg2V>DoicN3hE?lf7PBB);ALIr4+N8L6)|uQ#@vVblOy@1L&CeHt3b-+ ztw**;*7H?t0=eDi0TT}w@jA=%;pE!+c=+2F@Ch)`Kr-ljH(`G16&~>^1Le1vJTkOc zMg#T^g2DGby3AJfYm6`NASCQ5r=OlKKmMcV%4@HWmosP3j2#9JWf|khM=@}dO5Or7 zk;&KQ)(YZ#4Z=Mhxj4vno3W=Xd-CV4n+xSvzqnRD`tWwSa`7HK&|l7+I9|T<>MIBd zC$Mom5MzDIBsG@-0+RG5aE;se5VT*pUoKs{#`toveESbxEib-2%>g`&8{OP-5HArF znecBt==+WPiYXxNa~FUN0i$EXivhNKXtTVtr%<1n| zW;GNY8#{)MpyB{?K#afR1BsiI<1P<8%5k{m#D@Ud1mu?E7bER=t#Md{AyiWt&6ja} z4Kj2fS>x2Oa*i5)*(4d$~dHf=+w|W;ENb(gkLMI{Rw2>bij{S zqssFxf^MKK>w=;@F5NsKcmahMwMP{SADx**NXVg*{SwHT8`Q9V#6Y>hQ#|;~hB-!a zz+!BmVhF!2m`l6Vt7{wB6kK8)#r%qG#?DFAFzg%Rpo+1{kTHy4htNg*9kdk}>B~Ir zcwupgogN&*$ynBOM=&Kd%3kR4akLE?YYaI5gZOcVn`9x6P8;p7Wn;_2U4J^S&Kvir z+m@?ibX#g^5+Te6_)1dg;W(l-?O42*efk@g{>ibSWABzDtq{U7mIy&1 z-y^M{8tn@~6Fp$rxe+c7+GzT3!$uJYQt_E^=@+|-$ZX7w@r!XScpEg*FdTS^P5p@% zsRRsh_d`#USMwK{o}9C)mYIkq+;k&QUO z3n!pQx%w?Ik3fkIH1)wn>0NBehBl*NvwWJIHbC2P^{5adG?`1&PqttCV>JcRz&QLS zpFpXY)1z2Tz8zzeh6JkFGb+I}v!`}!91f|xVQRdLv0KfBLEEf0ZxOsf#@Yqz2k*Lo zo@F5~xLA@rX?aIkm`0P9jYbVCUqq&1D7?c3ES?PW065kQ`vIAtpZP7bf^58G3YmWy zqZ`++VPoYYhL;%yeeVaam9uBGF$8iDS}=9eV)oXhbF;|a`vfb zFerVeyo2H9h2_2S(#&yAntK*|0Avm9qG9ANy~I^wL?xqy6W=JR$Yd1=*%8Z322g+% zmAeTY+=#!iWM;HaLo=?p<&G$t45@^WVopHaJ{S`?zC~pgu7f^^rdCL(@`9ZNGi_mO z%zuXi4fGQpB;%P2P6n`0>S{z}41epg!cN0GvE8Pzy?2Kbd6!qq7)D=BGYT`Hv@b%n zA+Xcao?Qqan)KQen|Ap61gep*YX3u8=MNlephNBv27jxq6Z6n2q9brp@%he1Av+T& z)}l!et)WjOE^aX2Fx$2U(85#LVkIyM=gy`iokM_XnL#(VX;Z%fC(8lUB0o_s_)Aw| z1Py~edg9jpOvo}BV^|M~)_6W(S^(FCV^O_ft8 z(1sc7FQcwt^-|rs!!PUnfLvXONF7!nPZMXxxRM>%cD% zY+=bakz}$#{uY)|(`N-(yD`()fg6Chw$VnH9>$7JmWL3?+SbIkgcqqqewub5Vh{-c z=3LyO9ndSB@rWf1!#eQM2N?c^Uk2pbgpGUhp>))Ig7%I)A=&M__K6RW7&zS*l{FR` zR#yix8}I<3KX};L2_uArnL==v1!WRnr)%H`iO6f>0aYNb?WXpUkILWvzweiy{rp1t!CSAEAAIjj z`OddB4?*9Jl4g+2__+3>7%w6drRkS1=Aur3mmow_H;rApH%BMRGtYgu{OaxFoTSTP z6z^Usw=REHu3qr`e7?b9y@ZUFJIEGlo_Gv7EDJBs{O_*G?gldCVo_JSM<_ zPgyRelg@iS+fTaCs_oB3CU{*8qL4#(*J@}0r~91gy=bKgQM=wLYcC%?C8 z0*xBqdsNcMcPsNGH4lnU);l?MMOB5H%`SYdx`WLs#FMs}SxpMg?b!P~B zo6nbL&ppLB01bh$zR z#h0dn=N+#e>N-$8^!qoSUl9dp3+b3NcNALyDSWrMd8k(Oixj9WQjSrRPxkZQSA@pb z07e#1MsG8_Pv%7}SKAE*;>co{8|I?o2J?fM_#3Ek=GSqN{i6#`Zlwidbiu%khi4=cOU6w^|=#=NJq6L)x2*FCnSWO%^DHvL-W53+!VCd54SaW{5Ub}xPxGDgPmRT<<{-Hj7K(!j!7R*j-5F^jQ~Xf z;YifMJ^VK|kFW)KB@Uas%Z@g8qwFva8)9eI1Sc2I9z9w{v4!khGsg&_s*$$)a+n(# z2_+wJ6Enyh&iu&&zS=%puk$&x;dsb$&@bw~&%WT}J;oBeRr!T;P1h3rsD`I)IV?zB zfjaKb=HGcKBn>%(<6RyL!$%PaT(XitRe6fYA#~(>D)cnzW)fV%i(oo&H;Muz`$Ruv z-bh>c{N(58hxw3W)dsHdiEDn8XC_~phm04~6Tbt~SNK`^8?1lhp6xF%yTTzApALST6h7=U8yn0 z3*`1kO!OVwHOMvjF@Ebu{&&!}^#I5A0Z-IJZe{*tHX`}0 zn*=2Pu4U?b6F%lW%M>Qx_(4?mM&G@)Ue2?H!V_S}vBC7*vuCjdI2^(XwVDhk5Hs}* z-+sLLV;bNd2G-MbD%}j~w%ImW5DrdpFvMu-g#fE;%jlvas~Rd3+mKj(W~wp>C`2a2 zMgP_}(sGih5Kq4#l7VnCm4DO&zIlyiPcBo=+K~oli*l2F+)NE zo)tquSdGtNGPN zFt-gA0~Yy5)oThixX?0^eigp)fp414nj*B%iWZFzuzYhHx+IaO95jfxtE7Eu4$dGT z(cT#L-PT#zT0>j##-00U4KAZX-GfRnS}^>yO{S{!aqP8?VE1Bq34^)(cGl3XNEA58E;1FYpL^m`w(}Woel|f2=Zed+>=ov{e@96x{;g zq?sM4+bxz6?khkWi9>#v zTsQ5C>8Vww(0FHOhVYrH?S+i#%2W#O(_eLbHLQA>(JDxcMF|t@aKfwxw}mHu{$SsI zE(YARY1;^R)MN-}`uv13$Pu#Kz$=aFCTZm^;KB47KwfvHk3qlqI>1)AsC_*LSEgs@ z)0%XPObi4~Lnxi@0CJt5T6|_0(g!K3atJN%VsB=H_SG#SeF&)Bdf;L~97?4P7I1Tb zp?yyI$(3P+wbC^PK9&+-&3zjKcu!B#4IT_sy}+}0%b$S-<7Hfrhi6K4gl4$&n-4$k~kTO>q#7>1RrD4>S^7CKgyHHjT&Eb~7L1uXdSE zW8FTv1>s0AGXh}>T>FsPXIY~RYhRYGO>9v1iyC;O8aiq_90AcEYlkmQAwh~dtSiHG)^=?_X zyIB79?Th8|m8<2KZ;zDMUps~7;%s^L*$L{R{R5C1qDHPn=u5iZ?!KzZY}+48|h3+4Tf7s}l2D`-95E+ZGl%IvA5W$HMKNi$JYa#MaL8x*2<_ST-o1`p&c$-~Hj5pYGkNapOXbYz8SGuo z&?byWf5C={W;|k@1Aw4GFxr?v_yGs{%$LtD-eCLwo$}HfC(93h_;fk<^e8sCs5kaC z9q6?1KFqK6@tcRQngVH3h;|3S59n`epDS;K5QRRp)_cSJzB}>mbaJQT0_Po?9#LVy z{$Q6$)C084yQrAi?xOZ!BiZ3(W7~9Xy=~J6x;P$A9wnie#>98|-Z6#!cfx48qz-8L z=$J%Yyw|$d3e>>$-LxI!XvSqL?3~f309ya*7+!?X$iqw=HwRK)4+0KkGGcy9I60mm zLPxr`TtUMQLPn07gln8^hqFIu%}b2a5s$ZhuEy0fQOwjF>-(+3*%!%g1P-u-i7`Zi6s*W>YClQV> zN<$*sNawUCx5gIH1?Eim<~hB10f7mMII(N6mop6*0}M0I8b{e;5L<+f57!hZdcrb? zlBj*X<{XXj;RA$@<5M%tInf#%LO7_sa27hZD9c?nhoppgCGp6sG~%aLpMpX=KzBSS zbW?4whEpJ8dD9g|Sq0q*tE?ep7mm4ue)&BMRGJEdyzp6hfd|`p@Se&=!c#yhA*>TS zh6B!KQ|GowENCXK{A^dm&&996FG0jNKLH~1#65V=5+IFS%#Y;4KX{q&kza5QHg5pn z%?A-9o@x1NSZTtu#V0O06`q3kco+AGMjRt$Oac)>A?eooF1Gqs$~tx|kDWM)ZU0er z+L=ZI%d${Fx);0otiM$DOiyS{nvw7$F5+g|=1<;~PxTu{kw#@2q9 zIW?l)5t#D}znM*4gzJQ-f8^hf`Q7I6NXV8LKQmCRa1P>O-Ex=O_AW9r%u&rRESD}1 zn{$^B#5Jv;anOSDkhh4VW^&^dWg`lP&AJR3`B?iT{pCG(hS@4O1~;x$3Fgki4!)MR zg`uD@_+LRK-&d(?J*#LdnbSD^1O)HjTP>GaF;~bn$zW${YMNDOwwJChVyJvJ>_;i3 z+-C1}cMrDNj!BB!>gO)=1rP{ri)T$DGsNh8S`66OSVXw()h`D$Dz;|>&ztVUyHy2Bz9 zD#&9ReF(5zZM77(ZS0wlv>X95oy@O-5w)rmwC=eoi>B5dbl;)X6sCg+aWQSnLwgbm zbGKM#384W(8yi}Wde8PIGpJEdiEh4=3FK$!YdUyYA+5Zmz^YAjw}jO%OECs7@WBWM zaaC`3khF|lj@>R+w^mlzYK(F5MJA322FF>IoSoUG;X}0@Vfpk7+my$#`@~7bb8LrN zn#15Or*hqYuo+reOKfkR((VB2@}tBZhF)=8I=tlMIq|g)!W9w$o`V}v>DP{!nqA#! z>MYX8v-(EIry=)PsbIUeCz5q>>X(x%^B!fkugn8r&;qWA{F_2`hVSHq>c9UkPf1(u zgokR6jUz=vK+^%_U>aG*9RVnpTJF_1<0Ss+*ZEvSJ^J3szxjN4{MO*A1C*>%>!^IE zpl}#o96{i#)`}Xh!E4ZB6CPfHN9396Oiuw})D8F-_6z42p^rAn?HtyHO*DM=*s@`3 zr;`Ri=6f@c22O3$>@fTm_!7{t(Js+WRQl>C2-8=Xwn=?)@NE4`PKUcl*ToM7UK`-P zL*4SwA5RI>Zk?S9CEUQ2Ybxhtnqu)pE)dC(#N;6WhhTd{;VXjpd29ytAxIiP3rFFo zo!bsuVAo=+%Vr2+J=yI+v`w@TaU5GQ1hkcpx@E%9Cf?<7Do7uTO@l+z z<>;|##tpM*B`SpZs9d>zt^DS_t#bJqr`z7gE*855W@vLKs5e8}p%WlKL4J9cB@+}8 zP;@T9=27@(&kl1?#xRsfe7Vh-{2TlUWz}qk7-uP@~q*%PMm%h*cHEq zBLiQ}_w10L5DwDc?#84Wp`Uh>FclRhS7;N%R1h78i$^Xj9-Lz+*xN)?pue9!+X?_Z zVERDU$2i^7{+uz0{i&{wZ{nr7L|X+cC;oM86JR1r8)mKR?uIbkSTrT_!FIqlJo+vg zWxqxFMOlFdbBBi(sar|#5YG*+O`3ZrXgDiv_f`1)3VI)YJlVqF$6r+oj%vz z)-k4nYx6H5ZHHqX2t9YQr@zZ34&LhcQ-f$QRI8_9YWov!pIAP<`Z|H8hlKQR}bwp|GrQ& z;VYg@6F=wRk&ZN_ey?M1S4AKf)dzYxJSN6PW=8--YMk>C&k1k=Gx(1*Dqjcd3%>?_ z#GPzJ+ZCps2;Gb6u72!wK>il2h`K-N7Bu0VC|pd^mU&06%Y* zbILC4ziBI3{06_3u436W~cLr0h(#Q_>h{(%QVc3$h78lQG>Am+MAEYb@?N8)^e z(hn3aQn+e2n%og4M7>PBJi!c9Yc}wKB|0(l)Sr zD0YP(nswl&!AdfV&|?iviA4tMlL&j+HbzV_Y0zoG37om;uf~a$!oBqhQj8Gaz4`#X z#czpK_njSVk+DkTHs0y!K~{bcX7F)~j>Lx3&MA!B0@zMQ(SWqyQ#dFcc^4lC+~y$~ zx?m&yX;b(b=C{tX45rpSUu$(+&Sl=mNp}>S?Xp+exf+6X-!FIwmRH#=M z7t8$hd*wRzsz%u+=_<)Ildee&k$T$K)Wj^B8xv?1Z9_v(+`3mT-X5=MP@puvM{_h^98 zbi6Udgqc&n*y1-i2~V+lqN6X4&PbbSL7#?BmO)d+2o;6W`X2QtV&{dRS+{r%fhsWS zz%T1$rI~Qj1q>tNI^k75)2|aB-)p!UCLz^p`+M~fmrNqlFuUFiul$c4g~;9~>I#nExECH^@c`nP&&i8weuvz!cg% z;tR$`->s$_*mH64tZ;CMr9SOYAnFqR_;n&3)Q+~*1d{eXJ*g9>^faclSX^EX`!lxr zZWkIJ8G$!hOhMqf;y@6!ogEB(IN(rYxf`3GIuB1;LtTB4IMIiLY4Bwm>j+mb!Ed}6 z#!3(G&Q15vCySPlxd}be+iH0w9KyUBad>)vjLU7w@ z!%UqTFM}Tbb#{hrzL(?ot9Ndc&(7a1KmFoahS%ra-0R# zkx3%Z_wUfBY|$3W0=5;x>IC0zpEAXETV#wc;s6}ZI?+7QhD86!t2`>5@QUs)#vam* zE=SD1PS?(fPZhaL)d4Q^O*?cJPSCEqzQKvpH_8VezRx7`b{S->`Qtx*rF{3TGvy^T zI%kg#V;hpZxM0&s%g1J+e(Xq}B-6KkgBZFtvO!1tOi!PuJ1@WZ*{$;S&o6OU$$7RN zuVKHkr@Z<48|C?D&v2^o2{d3l@sq4Lw!~RKlCy*zFTgZCx3YH8-t91!SScTV@@ZMe zuF_xp?|)dn{njiC@|b_%1l^ESM`$j(4%{mC2Rt*}H`lL>0#RCAyu0mK%?yjddTKrM zUKjSA59}|auMCZ^6cF85IP)RS+blq9qt@RZEB*Fc=5>h0(J+BTWn=iO&O}TohZ*0D zv+$iK5+^Kq-ATU-t9kevu$qKyb95enGLI(O0-9m#t20?oh?g|>>e$tOp1BMHsXTBg z14Nq{G|zAm*bLxoubme<)=FiM^siUv9$}-9eobLz%qNZ8#J3!sjAy&wz~`pFf!b}d zegMZoyQhkOnw;g_L1(=&F&<&(m$);j#{*4*zu^p=COgew^&<{In z`8UQXO{QYO2E1a-AwxPYS8(hPrgO*R5yte+@paNH=u1#Fi1mr@5GZLx{@R3%u+BE! zk&`x_6=Z_1i-zLn&N=3|n<&$4s`vsQx)^KyOYO1bUCY5kFf9;NKv-;)j*N;(RE@IO z&1gG=i}`RO8Z0HZ`6?cIgwWUwS-$!KCx4E>7!#9zR!!gKU()l5xM2rTFwiU)Km^D$ zzi`qelL;ZA5UjlNjDn^kJ)U%}ka-XDT=Qk&{uuQcg|bjpBW&Y5BvB=r7}LWK$(N3l zfNwB=BJ>z%9M6AHKzO99k8uPVs|c5Ow&6edp}LO8>gByARFft`CX5O@nya((wBAG6QpCXo$6AKG3{sN9S3%Pn6eisMR;6|Rav+a&D63@qBmvMrmq!oE3eoT&` zQOgP3eDHHsY5@baE376tppd3+IdkjY79EK~P8O{QCv7Q4G)JUpw~aRpqZ&64QI6uB zj=PWYLwzKgUh;*jMovE6PA3k=Q-jn7ktCA-k&GY7hn0-7_vY$LKLey51g_dZ>47e; zpl$RIl|4E+d1_^agY6Qr_sh`Vlh0_L!(5eLR#`&R#s0ycI)yW_7Nws$H9raOe~I0AEWbuA6Ye1<8cc- z7FpRF(;gx=8SFR}!n%c2Ax4rZd9$^GD{;d4VCIu9(LltTer^BoYA!X5!YN{PehR#+ zNAQ&d50_K`@KeQmvs%}{VJ~G!@diApf+K}%PkIW`A|@}Lj`jJFo2r-FhV#7{BA?FzGdbDT>H{4 zmbTv`pBf|r$Ndp4Q%x?cuzKbxk#64~#E@|hhdr$_7~DVzD7`!gAshvM@?)maNr#GB#YEymIt#6mE^=x(2SVYvMdury$wz*%d>gOO;8cj~ z%B8~Lake+8SsZq6NuYyO2>-1;3HpX8Cm^lx2^7Y4A=cC`GMlW2eTtIx{yOBc%Q z>B+F=H$Zz=O+T1=yN5|C%iqD{ww;{(-lw(#E3#uO$lSfbfm2K}&tF+V{d;s$2ui{MqacBe>EY-YDDP$42%F^Q7|IcbChBi>u|%&1+?A zb*0?9IaOvj338GN&9Gx2#t^P6*n7!?lFUA{wx`J_72$@U_4NzgJ9FNC4%{g$dD8{N zO#4Yj2wy1iLjseRTEG12bJLhbAHuuisJr)>MBZ7XJn!>cLO{5Lz3I*J@*4=?UYstk zeft!)A}7ny6T{#S7}--QMi$%od>DbCbmM&(U29zN+8-?1D#j_dZf=!NKE7Li%{KT? zKUgStZfun9-LdlAQzy#FlOmkTj_2(h0IS-Y0QyOC0#_-R!1sME7Xve#Af=JlPDCEeavXyuZ zTzwQz^UPp6KE&J^R31>b)u7Zjlp7)pc_FB6mj8klMq=PY)-Cxt$ z>o^pB@UC(ng`+AZxCqgyNgNTqKs(1JYT=oN`MU+)B31 zNk|G|G;|BLBu6Hcu#*8vV14r03T`7VvQ9c;i?2Dv$=K%Bt#UH61>ykQa5+aez6}(2 zfLb`NfK?|!qY=j6hD`NiiR+dpVOd_=57^fUap36qnWP#w{dAT}zPXVmelURcv>YqY z&&KJ2s#b^K5STVvE(Dm!j`|OL*yx7o~U-MT5d{0){ z5`ZK&yp_DqZHUaeTuIVD;kHw)?|~T?nJF00GKF5!EL;R=9wENA-j=Mu2+1}uII)V5 zZ5vhgezvCf1Jv?WIJZebY_TGsIHpMmU>72pB6JW*$1%Mr@CY9t|jE zWG82Xukl?45FQTGgP>NSiIRNZ-PRa`7V)LAGCjXV$CHo)wksBc9B6W6Y#RL6z;TV0 zi}h%f?%%~QBg{5AHHL;52bvt6K^t?ZOwRItq6_VV4NeMQWSi2>a%XYA+`MzE++&4h zhVWBpZO(AIvL_}Fs(}_M(-@E~d2eRgQ@a*foa@0}=(BW?Y(3suMRWHuw47tL2AeSO z;u!Wor_eB*;fQrLK{ehSjW2n~@~!-VhkQwSb@GTbJNO z4KJEY>Y7^(&{Bg~+OT!ibq^JsMYMHYMU&@eXD6t0w5Qm>(HsD)JMemHJS2}q3k$U5 z;mp6O)bta>>Z7mpOLQ_!9@fM&We^Jl#ErpH^a~l^Yw|_Y5l4FXL0>g^t#fJ;E4=7# z`iyqTkikeQ(`!TgkAJFkX=9=fKmKh;ZBG;=_c1Bn=+P#l13k20nPlx@%eA06sOG)2 z2`(Xvl}~N|?fd`iPhKmZeRi>2`|xVHa{f~3=QKC9Y-w6!upS+t$%acF4*p{WJQnhR z(=*arjt?IzC$Isya{mFR$zDfT^8u$2pD!PO`Y~gXqvb#UmGx)<^CxVBLZ}GJyaN=R zzG}+LXTo$GfC2=X#L^GK6C@P z;~`!0iyRZedA@Da7A>)G_{sS@<-?CJp;>p4$>D05oE|MNz4BD~^S^o(;n{KC9S1~J zZQ8m@yUx@O=A=c;CXnAd{WAQ%!L=bk)*+z6lO^nTfAG$H`G>#%xcu$k{8Q=P!!GeO zhwHrYMtSM^G1{x-H{*qNGwl{RO~R6#Wtu5j_Po&cdRwMnxp3undHXlNMROLx zku5)^ui%IGwKj8mV=D`sVp7ra-Ni3d~$I-b8UCgiREZ3+tg}NFc+> z>+Q1niV^u8z=@N%S?BHhwh&ruFg}Sx2ArEPc(>gTd$9;RY~NL{s^bgiT#iY$iL-_< zXN6q>+uPH$=PnvKqoZA<@zs8JclSW_AGVkJM;+kVKE(xB?~YOY-c%04IPS`}N`bq$ zgaFFg1dxQ`cO$i`S3G~-#W|X0d+ftp_{y>qv%_4cf2L&%=H$HMdRQ#|BEOx{9~ChC zo3Tp=(8Fr7WmcWfApjzd^r)OBmVQfY^>4eNE3a+()=>4%oXX(wYB};iUUyM`Q5(#8 zZ8tj!G;y?zQjvl_wKGRpG}jc5yJjpCN{k=#DTIlu@Q8K<=MdK1n_DV(&?sAGN7P>F zV_w3d;W2E>GFKTJmroSV>@bf}Q_%w@(IDi&Ez{^_`>5NCM;LbxqIsz1pgR=Q0yO`c zr3q74plqM-_`!U-z#cZ)sITcq{~^tSPc2O%L$FXng1H={%iEzkTt*m~=gbEBv%oM0A&I2?tq_TmBTF|jD-c-d*r6D&)lQJ;D z4Vba57yP?P&+#v^!~{g*;$z-K++69zFZvVdk5_(`4}BN!nkP|8VCF^HhxE`Xyo)^X zTF$X$0X5G38qoB7B*915iI^n~U)l;xJ$?InMS zU;P~(J>hz7$k9MbI@oMf7h!yl2XHgL$SW*7(Ni1t0rl+xZL{SRZ7$*6p%9vaL^X~e zq_-y6qC5#3^3aflSrLeDqF&@1|@qbDTQ&ZC2PP*e-I7twDECtHov$r`xWr%(42q0@0ahY_C#3=w!8Z1Qs%( zmD$YNVYr1OG7QnSnP6-4&STfLp(SD5Gt+AY!^sR1K&Ez56DsFQ8YK=yQQ)Y5bcV#w zjtSw9@$e@}gnMbgU*ZnZ7)c-=X>?d!Biyd%T2l>VVDX5rL3}DPxH#Y@sm7^w!HN|^ zuQeD;siguMPx+0CMp>P#!X8IQ8@NP4%a*#TRIW=t~kWRavZ zv%Kt3b2n))m)N#*{*znKY?Ez;rboF&*&$S8ML;_imaBqgHRFVqpx_wG9QsM)dcX~% z3c}EcgZCy{NtVC7HZc4@*n1Nvy^`a=uh3}ped21|#|#FTdxo4DQY1xlCCiHNMyzH3 zla6pW!VWuPBdm~imn&HmS0raR_Y7um-)I1R-`#+Jzsy(P_qx%TV?~KWdJE|9y;nz8 zR#w)Pm6hcH$K(e5Y=qLoi&xZU5_i>$)moD00$0+7#wq299OYFYE96~ABhZUp6c~z; ze^=h=-|E_d!u$MLfx95WupcE$)d9}WynV$YD6XLv)pz?d%Vl|!4%Y1!b+0`-d0Pp%0<1xfUlJ=4 zyE~&Ti^uGkDnL;~(Da7NV*~xvA*)Cy#nnYPz|~5~i%$43vjiE@oW!oUV-L*eBcFk^ zutI3*O9P<3*=Nd!tE&j!2FF+o?4{i?Aka4qASf8LZJ@ta#HJ^_jG+Wp8NbKn^z5w~c4^EZb219eH^UYd zW)mgbB|pck3>9xKC5~g?eH2bRI^K-z?y!?7Y38lT)#QQoWjP%iCb-k%<(EtO@sCe3 zA6VyR*elpF!kG2Ifig6K_5uC+V>SWN2F-PD_0rF^)sL6&!Js9aiqNQ#-D-9Z292B+vV5qT`Zsc`a!vK^?Et?$}44xi#Ns&4n#jr z$z$9|a|N}`c!FpwNF%eS@u)cL{;U}74DFW51%g7@oS&$v0L5!I&q}@%+_(8|V5Vk^ zwd=TT+o%08XZrH;gYxmG*ZBJ!{#q>KoL>2hKlxF4vE8}V8gk!-*Fz0SZ{gbdoPuD z-Z{&-pMq}FMA|mWdOX7k`zwNA5*<3qC@K2mM@MYO`J2%xW9TSM$u5A3Rzp_fd+_PP^tr6z=WAhU+O5kJKC- zVx!SZWjuu=A*ZK_&xMf>ALQCelP+qx#-$(5oe|1!u&J`NtniTbMg57tw%X)Z$27+m z=M3_lB->)%(8n=U=ibhREx+>&`N_KTyN7wD8}(}XD-ZB*lXhX6K81LEo5nV8{MZEY z8GMuVAgtUpMqUv@LfcNp-2gA=tU__(g#RB&b@@KCtu0Z7B;MTLX*BYlxy${y61 z>&9=A?fOuLk!BAN^1_F% z{X2MxUk6M@w&M}-+>BV5TR>2`NMEUmDa)2+$<+YwGAYSDoijvR@KT`ZyZ5lk%?9)% zE=wIj_F+9VpdC}Bob|ZQNj07IzXzeb{aM&?x8JsItuGPgzwOz&QnsQDOFHS4lNiBc z(tJgo_c9Ohw52@Ylv_m?H#>xbp0vd!Y zHoZiomj8 zxWtar0vF%x?I%^x9EdRX76NNEi|jOeqOVerNT+1Y=?CMgLd}ZaN{I44;TSuC@vaoy zcO~Xqc1(8M3UZ>cd4rb%6JXMj$Ia7pWP76Vxp+-}h`NsagoLN{%+rOlw!9R?iiZs4 z1Z$ASE^p+ZNhgXXmx6b9F^5Odn1mk`G7KV^bbwt$-G0Gc540;6x%o@mEh~?(gSd9T zjL}hyGZ{NDft@=B*1cRIJ;>m?vVm6OqiF;wXbh5m?*xMMRRn^Q>j)PIu>FF{KK4Tv zLR0fec`!XsJ7s_$oTu~TCTj+D@f=4OV_igt4T}VyH?&LMk!Iaa#oCkxP+^;sMmt^Q zxD0B-pN`ffdu9OPyN8))#kZZeZCpo-*7I%y+DTT1Sldx1x6Jm5FvWP`d^vshf6*vb8Z@Ou#3q-u`4 zL+o*iMQ(2&8yroWY4i;ckcduLt(zu4-n#;zE@uDoZz3S(-^L}ihg zeX>Fh`N?BkYLoXdS&_$M^MgOA<7o73p2qT^^N*W88#$V1hCXhLGEtLH=_-(#7c6Zxw@Y6uBu|mQY@_t;GTe zFqJIN&g+|mRD5dOidWm;{xJPF=^G!;EXLnmZneIC;{i7sW2%OeCnvZW@r9T6mmmG< z^X0i04ur-g-DuD^Qa=Od-EyqhJpJtA73ug1y72T?=;`Uja_jnB`TV09G*=&$YnNuw z^1zJFq2uK^$Ba*(JYJ>_V@nIZ3f}EBaB~u3v*_a4u1`bkQPn=t^ut}o=1)JrT;{OJ z`oj6M2u4qov(N2^Ct?jrOr5EAbKNrR7W&`({skytRRsUpAKG_y^Kg-D|EG4W>l=r& zTHnq}f1ge~6lS_9?h$`C##9Dy40W>W#cFN>g?(cCdCKKn-4eL*86~03+E=(=uU*ZY zyRaf-{^EEjDQpcy%Q-c4*o#ei1B9fDXZ@fJIRA9KtLXsqjO$FG2_ANd~Dv%a2dl47g%_4=f)Q64UQ#y1Fe7K zXao)+!10)A(ug`?spfjjwUTDZ2AN0o53p{7KgE2Hf{SLYR-NVj2F_?r_OX#^z1Suw zrX&h%BRk8u3&`pv44rK%;px!{ZQj$*HK58SeN1$`srm`B3+s6kp|iX|aUx^L+u&i_ zKrRC*Z5zQ4@+o{Eo=?yMeoTD@6POej(vF^*a3e@t9uz3nCwfVEGSW|>qsQzmpqI_= z0iXCL&)$RFFnE7$zN{|HV0?V0oIW;CzW>JaVPt z{MN=q2o5p$X#&`X?N4vgiVhbB_url|>(TNc zxI?fbO&%-R757Gv8aq#ZGg7J55ym{JW2?m@(&j@A00(SHuNwORnx*ogM>%_Wm-iG( z%46=PSROUbo}ei+%kkn~gc$OHWl#lZ5;vkC*}4%E;?a= zzr`-VBX;T55HQ9rE{oGc2lk^Se2PUahNzKx%FFx@7bHU%Z@JVu^k4E%hXFET>o+EH zlu0KqSXRGc@UF>(pHYk!4#@GWQT#|+8@bE-JNdW!oqQfZeg{9owa#_EJLu`GTQ@UC zndA&|bTT$U;SpPJOa|<DQcjx`7}<@ zlke)Hej=h_;t38Q677Nyzh$#{Qin?j3Ktf)0{16d<17Ze;D}vAIw7^@j3{sG{O!`# z((QCoBpHR2QKUA`-Pl5k7>!r+9bV+eKl4{$t^JwVnTLVLFxr|24sqKZyMfLpvVZ1D zL51Kh@**1;J}D`1mx+yiM#k;F zzR{(ZuZ>x}Hy-Z7M<6fOw?|#1sD1UJV+YVS!#Lop=gXy!ZX($E zvi$9Tez*M7uSz+OeZ;@|tDls&-<~SZKZoXm@c6TBP(6X)(-bf>ossK%c*IYGQWKv3 zmeaq=Qo{D{#S0_l_|XxLrk=$V3z~)RUM|1>?Pul6wM{N)nJgDxeW{!}cd|^fnYzy6 zA%x##S$iE}?(W(FzCVrU?&&frT|z8`)ST$Hod(Re0M*T-jZfD%Y3O&e=pdQ`2D8xo z!PRTi8pJKmWL_&T+f;#L@EK{p3gGwUzI^O zmi1qIO#7H&m%|kWJqp1itMwWqR6R@HyYEU!3c^Hi~?*8N|E7 z57!-gvF~m^!iXN8h<>@o3R>}HcwI~rw9V-s8-vcT2ywas$>XmR(SSgp%mFM(~1AD%Ks$=jzf5oLLkOG?VmzBfy%7 zawFAs)7-2#56=d_9GhapizCD&DYv+sL^EU$xWRalHEs_!+{gDH=2rS6oPKgs%!@n8 zl8O*l$GdjLsWsBW z8SWg}>Em9)Jtb**)qpfY2(^N?#!VU+PvNWDz^>Em2W)duek$IzN${)nK^n^wH1?hP z_Jj?E3E1*}@IQ9Los)+^PMJt-lDKZREC_O0FX@E67n_s!_j9ZD=yI%!Q$QTSPyN7( zQC0&&aB4fFu%Hsohxl38d{6)Ss~_3NT+>r1x+t432JV(9JdFTk=}a7>=`;~%`tYmi z4cG=pd|Ix7VgIILNxytc{W~WVey+7@4w+WDfu<}}9vWl~F@+M)=p-9AgSpzW-!o5- z|64u<(wkfetngeOh_)Xf6`xzb(vR{Z%aIQ)gId%*@K*4YyavzN8Uzey5S}ssVJRW? zDPEF0{D}FGqyN1xzXVf|^x7paRM?B=-~f{%jBq35bKvM0XnyQ&gSBBpumm#nzOuHw zmyY5=nSQWXM#c}87hX8ZQHrUupJOCWj50G9cof7zCb+`X^F`e`mK2uM6zQaAWuAZ$-ZX@ON|?9?oQzj-uptLDVC!tGDHNb% z5m)|M0$wpxYNOA|gcnmd#;WCKgBt8xELSd$mf2~H0Hbv%J^?GCiY-oPjf)pz3Ap1~ z16$7~3|^qp$qUZR&a}Bmp%rzvSDW4z^*Ya)elwb!952UMgiTCvwV*x?{A@U4ot}E{ zWAS+4z$Cl>YLMQC_DP3`()@_NP65E^*d7+y+$w~I+flSDo zRED+#gR*)CLQ=^v{Yb{IVI-0-j1y6*72w5Z!$svTRv%YC3(NQIkNExtf z36@QGKKY4iiH=tU2$${=hVJ1Q^bn}K&mPSSzN1iLBncW%XUa5{Os4^x2&PcUtRtSfAaO|uOTU1OP)P^W%c*L{Y$qq*BX#KP-A`VQ!ov|MAeD))vIgevriwD_ul=iT>9cJ7t$=06NgTe zli+pk%&Bsmi~A5#t2?{NmCcY-`>s@BQ{; zF8iA--}}MI^41SV%Yi91&|L&l=B5ceP5JGms}$Jo`-k;aYqizWP=N1V$>c-X#znj~ z*&GMf85h<#GUmL?OABHHo63`~vaSAp>Oz`2kF{_1h^-snUaTfn`@z4LIeT1KBF=bf znkTurK5MNc{?T0Yf;T;?#*~K!N{uyrXv891whiHvo1YLR$7XX)=+e+dw5M^hiZh?4 zIX3b2a~_HrTur^8y>FYVbAMZ3b+xO}OW}f2pb)zF&i`zWK=U1fRI^MuA7kxCy8IJn zg`3ZWUHwQ83|*`VjoSouV~}MBp@f@}nuMfHA)|e}eWlR&0YLJ;kTPx;C*!2A@uhFh zW9(OJ2p|YZ8sbkx``a2nggQngBlERS_T7FDd2X12(tOGTOnA(4yYM3Bi_|DI*AcY5 zPoFr<@ySuv5bNAlJX3Dmo`Dv7nUigmE7u>w1}dX4kHtjH#Gzy5=xMYEx!f%-8{yIs z*N4%ki2`_vzw@o?#B+jm%*cpL#hjPINaM$kJ)xz>6!i}P{eoOg`9cUyrBs?*{-jAl zP8vgN;ybgbIaWTZbnN0G?SYqrU-gcsYavG&|3@6YqoweSbpaVWZU@nuI?R})q8(I$ zjp3a!GGNs)Ghxs4* z;R(a^M2Vk3O&CE7zf7Gj=_eAD9ij&ug2X`@DEPELlp#Ikcl+vKxrObz{n#9jlWbf9 zD{diY0czHZScIe^MWSKKD<3lYFK5FnTdnpuv z$C0<3eSV5lyPjGSAAKXC#0~tSZ4*1zE%e{vX&i~;gEWz@lONu;DG*S|81apZ%SX~Y z@WUh0ns4At9X8o7&QFwH?oeRBU_e<#lL_KzC+gVLC_7Fjq|>MaiIn6!cY&y4Dsy8M zn{xA8XhYf2EO1nkozeaNsa=(WllX~NWDXOEOiGPeF;hDGu554?h?w@uO+gj9MYjCZ zMp=ac5vRhUVY#rk1MqSanrGx`-nGy^&0Ac8WJI-z^AYGFrq4OJfWjQRy_FTL9Z+ioVOe&51 zvzSVtqqy55wmygx^x)~j%j3rG;wh~jqH(Jw6~!SuirPwAUu_gh#QU&u5_TS&h*6}b zT%7_0jxNS?u^Bi04wznHbdn@+4}MEthz?97Vs?`FW*tJGCNIBZ;4m8a=r4acX$b1^ zZKIVICJDO~QFeJozLft#fV50uaCo#HY0m)<)A&GQ@9q#eg#l*9TOGec%;K? z^wT$plyOh2CODs|p zEcJ!`885j|Wn7`H^t3rjmsjK-szJe;_kn|h39sszw^!~&<=yPbmn91_$auO zqiSsNa&h29JZ%&37f8)A~Zh4JYD+NJ_HdD2)r>FIFPaTO0&x-IWcxGyzM$MY!0wj9a@A4#yzUIz@-B85@i$#%qW_%gY-}K z(YEt&!JNEPCqchpQbVLow@FEAMqD8odZ$t4;1RwaB+P zN@L&cV#l^Sz($&;2G*Dmc{$6*<^WLTs&rAW_AA?5Cv=TiCT3BnZC)LWNo>uq4jS%`Hqcr>RN&7K>6VhPhpzmUb%%<;k{co!$#EsjG6CI z_zF#>Rpcjm0?md_@!nw4A)SjMg)n$fp92%z49{-t2pd-Y2%E28>MeI}-KU?tU+&yd z$h?m2z^U@`OV|iR;G@tys)gh^moSs;50WNrIZ8J6ydE8CkXf`#Fr|mQRngVU_lQUw4+Dg{IA*A7VtHvYhOQ`A1 zVz1}wwOJOK56j*AY$kH7>omt~-}=FG<;{0amJ2T(pxo3k<&JCx(*@OJQ_JgT#A;{X zeXr4WMydWhEgyccPr)5*-DX z(oz17K}y_ej+Iz=ByEGd5o(rlZY(q@kme0;-hvj_@0SO&Gvz1WyHMVEiyOP2WBz1Y zVeEdYyQum6Q9NrUB=zc7XZ)s&@^6Q>-=#8xlz4@mbvAw-!yFeJ_qBzk=8i%E$KY7M z&;Vo&+wRWs_F2WM^w?JZ>e)`zM5sYEeth%eyhXDbYKX0Kq*H;RbnU0#9sqYu=j7au z$dL%FgO9VPX=mjew&Qq}Kf@FSu$=EZM`^_fIF8A##r%tY-OiwKwsAMvVjRZL?4Ryq zvJXnWP@%%_^h-!xc!KpS=Kap6qvL3bWnkl+XZsf&3-Dq?2AEy!yD) z!s&8(@whRZyOrb4O!;|l?IYo`U}(bp8}xdqvWToAKNi=33-P< z`7`Ak$|ht1agBq_@huL*Z@cs}9hu>R{?@f0A@K8QnSf-bxP$?0`~pX{2dp$AR>95_ z=1%RlVS5Ou0oeJEkg|UkrLm4d-bLTZQc&&}FMcw2U4-g7c`6R9M6JP6^QnC3`;4e1o7q*Z=ILG!B z9&|Mh;Wdrr>Xz8Bq=lOx18DOpzi_@zm40JqRLdhi@}+#3f07T)P9Qzg!|E~Rw} zo~;kdC$CDa_(`lRbktrDIqJdy>)5oKsp`FlJ>`3M5k5Sa=2C^;atJ}+p@S^q$|42j zNLC!06t9FYOx)K-J1*Cezc6-l@2pnhEoMqK@(lHrW=7_R%wxdsI5oOzt45#|+!Xo)_{75hh z3v(FC-NR%ZyN$$_CLV1Q7sJ(hi%!Ww0($7LK+}d}T;M2}l@Jl^9n#GGeEV%U&wi4|mZLE~nMezzkb!p+PplTu2U9x(t zOCGf>WZ2?SaR&ySDDn{oSXA=q#kOc;?z~yo%S`N4x9h{m*YJ^JWmQ2TD*bowK0q6R zqX4T*K`ZK|`ZYn#qaw83_n-R}?UfA8GjnL#a11>{Z+vCe`YDbLvFrd%Z23~)meFcd z$89e_a=;j40+hy=fr`I_m2l*p=w}cL`b>WXC$uGaF#DS1_kb?4{3(j+q5n`YpZ%+C z5L^iMFFN+XTipHYx-R9@F8&iNKEAN+`$8xwJ%3jI;S*$yiqw0}))9G;bK?ci_x z{&YS<4%pB=jy!SveN-Eqv;o_t`NiNx-nM&>1K)qZF&MOAF=Sc}9^wK4?L;yOjXER? zpMhp1e-{5m#=wu>BkHu^UhZMz`v4ji-+%iYLeeA5 z1LQ%=EN)pJruw6BQGQC&@JhQ(dez{z|99@aBFfWYialM*L*GODbUonuAeAW`!xfOZ zE^u98!hfc#dG7#I>DF!Y@=pG(dc-(PL%8^~O|m&cKdmVw_6)%)`xTkF(}p|nE98y` z@j-(B&QJ0JGPG?}4q$#B8avWMM^bOoTwP^z?THr>s%e&ebfh834O53PZB5OZ?n?&vot| z@JpM=rgME4b3#hu5#+5nfnz-?gk(UiuAxIESJKx)Tjn$iWt()J=6X_jf)|3g{xc85 zoU6+}-nkH$loD=QY3${d3Y=142F2?fl8nSN>H}I=8HMohjCl3~u9>V2h2vGeA>5D^ zfTP;A;^c`8<6Cd~CETWvmXW^-&-k(4B)xvZj&(0Rh=$?3#51Wwhb)n7b?dXWyjrmuWb>g}i60hmBn>_`I{iyl4Ph{MghV<8s__ zMUe7E#*ajiI)B`}P>Xd8;r4{58$BgQy%|3iRGC#P#r9W7&;YjhuBR08Q6JW4P_PwW zg6f_D)Bb7=URS>01+NM|ty)1P{w7Qy(rrmoZzuz?hgz;(9VU%8gXj2RJ=h=G79e}j zKC+HEE9+0{MgOd?yr9)FN`6QafAV;iM;@@8RWVLpwT|l%bid621KCXV7M!Rue9 zH-6wqfKTBo9NXaL(Sr8OBDdgZ(@q?MPk6LlU0_ykVLXc&+v)1NI8|qdCa!f5ss8OJ z(4+A=7gjq&)z=|z$L(FPb?F*_K8)OQqLwtUW21w$6QPsX7Ljx&^-msfchd_t=4Q~+ z!l3s$lJu2%I=4Mb&?`GBJ3u=^X%yurwfRWfT3@2!clh~%vpMTbV|`h_q2<+-Av;3K zOFnyhxp_K}vY{xz&d!d+QB3p82*OLgp#TUt9Xv7*U(9Qrw5Bt@?ZwX7Zv}0fO5pFPdT(Ye8 zP&AD=^6g-3TkyC*t>`ELM7NKS_)*&Uv1Coznr~_4F1me`uFib)mFJoEUr7mY5JQ=>%_u^WvDU^YSlC(wg1B+Ebd^;wdjhwEx=2 z34=cBGmd!CZerZ0e_df*-Pr6!fHzwH^rt7$DqARbrnkz)k3K6e51ucR17q|n^o#K? zdd;Yz?Eka(Ft3j55Z8LFwds>~4;}-IVMos&DkGEo%8}EP<>CE1<;L_{`CtF{Uz8Wl za1{9Y!_09`mZK+n%jAKC+UdqSnY3TbyOn=^Z+o?)H}Ce7)!9||4m$rCEN{NS0_))M z^2)2d*f6|RKKpXI-1_2TT=sHc>S#HA?rfRlLX>{Yb8IPbq+A|LPM5qJe2qsN1$*Ci zoSh8kyvA|BdDC9TYXx@-dox}`%K*`a+JM~lXxfu;o4RnKt`K1ryPbD$&xQ8r=Ll*a zJe)@Bbg8`h{j=qT7msjp#{q*IT)uaExm>w4S1w;?^QHtjPpo~`KL`JY)w&>(Fx~Iw z%^tx&hAQ|w*DuZ&v|Hu|mzq~DByI1Sli>kR13e}o0)a;>yG0#zJ`CL9Tst}5vi@>O zrT|DDCy6-NjW}moV*vDIQeWQ~eC_79Z6I5$#fXgxR?cB-n8ZoTrp+`tIxkQj;X>az zl=J5{3CvTNK6L??aeD)}YUsqe2hYg2N$A`+j!i=c{dJL?AC&>pD}ODQajJHrIb>Oz z3^VyR{!Mu1+hn{WWmHK7)$q(u3^PqPUtuNU7Qmh;3J~#BXkcm*GHdH%6^$-$E1u&> z@e)E;>qRAybp>_^^^Q!@|FBs*&L((h5poJ?9Knp6%hKO5OO(~5*6hk*E;4=b!f~_@ zIVr=Oi`?iQJ()DeoQYFU)WIh9{^Mp|*BcOBf$s*&37)F+M2nYN#buw=aVQCyK|>eo zE&mi=vSx4AUc#$&vSh)`7oJccY`nUuE@^}rG?QcjPaZ|^O#Efy8`rg%^E=}O1qlz6 zJmyIwF}`{7($rMKG`@dT%PwFjTAf^09v{u)$-l8=ZG%8FT#_ z<1*Q&z$#u~$n0@yJU|LL^ARZdc}zP6hr|sWoc||3MVa`Lu5kk~{?al^>EuBC0qVEw z*jfhVBGP$X*wkwkJc&)r;qebVNl49*7J)1#={8n5ak|2M5F6H)F5N{5N#&GV%mJpj z^lbu@Wy8#?A0vcXDj&Xgr+jwtPPxg3;^P0iSbl?fnvwDTGRD08$bqqP`uKrzo(pzQ zofP+8F-n@~4JQ8$-CpS1TxQL*19ihH`Wb|dEip{7dU+X0t zAfk^V+|A-tqDsE5yr%r3%7S9Ug}C<1h6~&AB4ix+OFR9o>uguDlx@;WCpmR^A? zcXz1R*>e7cAC~8zKSE-wJc(r?BtQp2gdLBc^rJ=ATW&My|LCJHsFVe4qa9)re5@Qg z#O_VMyGrgT2EWt5_{fC^2^oxf znLzhD=`|^ET)g$E{!hGMY6c9`YkMs_{A?^yRm2sqs)3e`*TyPg$d_^pL!_({Vd|$d zAJeMEmiE3BoQQ;>JR`18D^dJWrKJ+R&VEo8S~{X=jJ99XL^>atNApQO_%(kGWFKGa znr7cgOLKpA8t@C0c{rKyf{P($$S(S%T^qlhK$@gc7PUmBSFOjudq)EOJnrPNS#9RI z!!$%A8dZA&TNKts?PRS3J7F2SV(+&?f_m$$J2-Kqf`$-_ADF+E-THol!OzF2Ez7f^ z2}gW8P;r!xJbDq5^%z+t10}LhIC0Iw<7+(rxdY|yo8Jmx(rCYnBlwYqZs!?CEnvuK zY&;cm+tA!eBA6SP6W$g~y+-*TA)JHj%JISd@UaaXrr@@?y&TQj*Neaqa{vnFhKG9N z7=VI{G0XyJ&%*&-x;H3`aN{b)_>>pczv*qEV z`M_%dTP1sXxHT6Q@R5-ijf}r~Qeq`PYiG ztpsiV3Pcz{4u-7ZIf$j7@v46y67kKb8(v{m42%yxd|FpYrxa`$Q$KG2-_W)Xb=coK zfKV09Cr2k-En?jfvwyVx)ck}SlXK$Nc45xCz<{!-ojAbpjscE&hrkz>#S2ae!Pi$Y^}i`{7qurtXVgV#s7JY)dD zMvOraF~$O9sP1kraqHebn0gqkLuna&8So+^)Z|(DM#KBDbGnYS7NBM$=&{ES4 zVc*oY!$w4CSkh;%XnFyV=Idw6(m!4;UtGC_2Hhm~`TENs_8z%< zKI$n+mi>urt*d=I5z-@md8Y#PiOCS;cFwT}$>sQ=!7_1Rs7#$c%u(d=a`WP)PBiPg*op9Ub49_mSrp1P@@QiLFP@~lLdWVxFmoDGs zqK=y!HNHU~w^dG^nJ7R0vlr1K!QTLyGG+o~R)%|kq%AK;#qIrU&>My)-mJ4uBbI}?%moul7z6$vqw1W#l z)PEJ8IaU(6Jghvb|Mqy!H58sa#?J5~>LccX;2<-x14luqJWr-ac3PHbttrB;NuOm%qC~k+-}k zN?VBvV?61y!6}9ww6@&5>1W{Tqf@hAX5>sr9%ZR*WE;?K-rKz6LmV_$keYsBPn?n} zsEIb*O5l9gO?u;}prc;@ux%dijwT{;3e+JV@*ut9L`)FvlAg zy`Jb1hj2}vzGn#%w)K;LO^86-1rcBb882V!95m)1>GiFCYkCv4-z$*p+x==GT?1>M z0G@#=1Pi=~%3Gwd&r(p}qFz4m7UB7ME>%RU`w{jBJzb@p%0AW?{cKo`jf{pJ`ojk& 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

    N3_E;}18W^?d|j-0k39wyyiH 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�XT+A&6-YVZ|0n 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%0D;gX6vM@+F*qh>cxXE!>x4Z%l@C7u=kk8=bxx9{v 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.Pm8!u)3ZtrF6rdFu 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

    m*yBk| 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 diff --git a/public/assets/manifest-homepage-screenshot.png b/public/assets/manifest-homepage-screenshot.png deleted file mode 100644 index a09426f4b1ab543922c52b4b7106106b585b456d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3563843 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

    ;p%v^`Nq1@sTujfc@yv>ruW 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

    Z~E2XtQuIE+hsEgk_%)-yVBmoq{h6ncjuQ5?u^G zT6T~)BYTi84W7UtFWZ)KAElV0zd=984Cx>py@Wf*Qg3Xp?WP`$(Ag@=GHH&%{OAa6 zjvYE4YZq^hW_I`9^^rNb!@q(fjBLJtlq+6;eIpC*wM5^W6bmmL5d%vO046wv+;i{! zE6~yQv-m%YqdD2x-?!l7Y_sKX8HMP9M>fZcuXqH&taJeAcjgEHQ*_JiyYva+!x5PfqJ70MDM9y0uld$ZagIliS;|c}Ya* z1M>3Ytqyb61ZJ$1Z@7%->FmT^&MABsPJ^V$mwfw^^pupB==EXplX&(e4>kPfSR+50 z10M68JeE`-ZH_S(X&)wi7S3O*%6Z1QM3yP>Ysxp$4*o3cjFesCJ>^u}pcqFb@Iz_d zw=COjS-_CSXy6qFVU%yIP+p+%$zzT`jt{oO9gS%hq8{sVMm=2sNSl#M*d@Pa@jiC* zZ^jnb1s!iLPQn$ja&=9-^5m*G#)h1h4kvNC9vtT`n!?d$gXs%hV)Lr~vE=m)$kE5R z?@oO!F}9LpCwdKtt?W8JT6dJ{t+P4CjT;<`7EL9}-Y_D#os3sr*}|^dJuLnYW)oOt ztXW$He;m#uYn|77_hEsIZg`SV^nC|c#D$CI#H_PMFefy|3q%b#afIX7E}TFFHPRu6 zN*?=5>L>V;R>A-PKmbWZK~!RfcKWQHzI~wjNId_@ia0`K(W`MJ=-ux$I^}Z4-tMvJ z(mAxXJN5yNdV6CN4nkuInLi8L>mH8E+k)KPmm@2O5W>Gx)S?UQ1;$e+PoZPAVoT^q zRD&Tn0uM!x>jAHGEEo~oYS1H()E#Fb2i*o-8v&p@j=|k<>@-AvBl@_|Y}k<>)6w9+)(BB*z}k!Zy(p8w*DVf_tM;evYGB z=gs$+h7Pe~8+!1!787}{4jP@xqYrPsaZ-HhZjO7HQS1_Pp=1wE$KU<#8XN$Y$4MLj z<}c{UCWW(zpf()bG{xgT-xQBMQbn5v#AiM~J+8RQ$O`bbG|9_vh?4{=o|OOkMn2w8 z)WPq3VZ4O>Dl&Q8WI^7X%YE!M7#xaro(ap%WI#klc?ST8Cm>U!S_e+`0vy$7}d-p)Vb zwYYOE)z+wuZR3V&95rfK80-=gCXQwic@Va%9=XtG@}fmWIpsS``QTo^4y!b@AuY`F zyLKIk)oX}!aOemdboyf}8jDT5FE+3u@V8dV?^w%hR+VeG3{)OV^=ye%+Up7-;PF;$U!9}&CO6AiN($EHqQu)VNBZUi=jKK-!y zmYBGZwV1n4G;=h`F`NYsM=iECjGZwEo5K*I0ajqk>4>AL^ISTjITxf;JP^Rdg?zzC z%A7eT(2soQa}ia@Mg_kJXK9GcJUQnv?mEY*e-uZCF>ho}QfCJ5kh3T^|4~3T zgFh)2kw)1qWj-DVhjpeLlkdm{fa*C`Zqy~KMC^+m%xx9WsvG*6Utc zp_eJkBgdy~N1b^*75US_k}+RBL3>ppyCRnfmsq25x!FOu0YH5-<$n>tfAc$k>r~-< zFYZ#eE{y?sZyEkb`Boc~m@pkpDUeWn18iB>&`zPu=6r3#rCsWq6jLnZmY#`^EJ&Pz z{#<3b$2)`XQ#fta6H&I|l+M<)pTf+q?2rzV)IkXr z%!e$>GZGe=0kuK#f(Tx|l5gM_<^SH1?3vYafcM3Z<(K&YC@MqW^kqmsm7!fmOxiF(_0{-Zv}a?AI*wgb_r zZlxX3%@`g{#*_;gT98$6xa-k1`m+(RdpGPq(5(JcD@V;NfK_aMU3qh{#1r7)nCx@y^&(APT}L z@aEtF0@7GR1>!jyN`65i7Zu8=ZBc=N)K1z9H5=cUcTNyR;i7{Z5(WO%E0;5x%ZtVh*>f;#%xf;&3zWMrT@t?oCC~-o{Y?b`bI+SlH~L%b0OfO&DnWur>FoPVn#Gm&UJ ze7HTHdU|X8!?zwsU>y*D{Kt34S?6GOqC!7jMVksdRp|i0Q3?0r0C3Tj^W)A>&tkA9 zvIR!hOe;N0cm)x_?WgEq$)h~;U;d|lJDz-F9Xa6eO!}VjvZE~j>9OQsoD(c?<-{Yu z^WNP_8u_va`I*T>198D;lx;_#4D$$6`O3L~`g1oGlB{&gkqAC?kXM^*Vt}tfP}sR` zZ!~b;@Q9%UVmu1gl!=64VO16md4f)-KQgSGx0koVtPKcwiF@5qV6g9^HjHy{a z^<>rpmJ*uFVEy`c;!MyTV>-n#&QsjG{|LKtYohLGLyQ_#zbEv_3>WnTtnw8#|?&P;^hB zl%vRCbU(1aJ)V4GW4!+ACU$$b;7~C^>;EOKnYi9yd@&gp!39pB;y5 zPs9#(fzO^bFmAdT#qg|wgtag5@7N-HzW!!&{Ka3~$HHkHi|UtRfFB4v8}XiR%!S&W zJGZe*`UsH;?jZboA3}AVh#&sob5VKH7;K&@+aQ><&%|XMUoUoeoWeUL4MXWlzS76YOShWPEUeh@A^v zS~>S|Lfmlkf_MlI|J@uh(u1Ao^^LW0{*{yB{7a|Dmi7DMS&R<#?5gU9U^<(fBA@=! zJkEGrO_=(Z+B(M?d@||@I4*(eRox?#)06h^C!}d^N2cf8sk&X=*c|s6Qb8V_QVDZ zPa_em2jY;hJ?5W135SJgv7BfWk3akp3;na=j!(~yy~r+);mC3Fa1a4tcFdYPGIsAg z6i+|8j4;i|IRZcjfSaOnvb)uhb!u8Ty5LQAIPHonuA4(-fqC)HD}=v%;tlAbXLomY zY4k%;+!+fnYF&Ey%-FK-NWA*;>KMXKoXf7C8>d)Uc;en=apF+1V0NnY5Doy>#r$)I z#v9MV?zm4K!sDFRA(6$DYk)zD*M~^hbp4~@@NV1-@a5Ha)v#?y00d3$H;d><720ZgTP z@sSJr)(sxgkgvQbgu)>~ln42px(xLc3--LDysU?Qk>!%F2vv?kj9lb`mvS|1i30#Q z1|}mEINv35p}%lzxJYH3w&gj`$bBw;DO)CvG6Q+2ulOmfd~9IxIPpkj#XT=_Asb?* zqKZP>L9IMa5zS>#j2zl2_H#7RE*HQWk>6O-wVByV_%0hNQfJV>#LG0c0KZDNZS`_z zf;9C`yh+>SH|12*T4?FY#Xr(2L;JK?NFxn{M4lH2b4sx+k9OOVT#N>%g%bzwk;zq@ z?PS)Oh9ufb)rlAR)lz&=;GPzdM?~oqlR6stb76+GxuEAeey3xGbvZVq>`zJD+mc*J zBAq~$<#o`I_>#YpAL-jV07y^EFpqsObp`?ClGnVPo70Jc$Lf};gIK(kCHy?Y4bJQH*2mt7o5dfH%(_z3Iluz~o_k5?J#Rp!%kxn=zxHQgr+F5i}tY&^c_bucWF3tqyax+0}fzK-sBCCtaeuy?wn)XRA5_Wnocxo5VGSqA}>k29UOmhq@KAGUh4pT zauG@(DNDZX$n&JB{kqh*8Hm75(Oxm>dp~sGY$iQ zIuN-a4fKgav2limJhcw5d`2F@OZ|_sq?>xDb*1wK_qjvJGI^GG6js|$L5U;AImaq$ zPndM}$o|H|G^l3zrW9^cfd^smNEMB8%^DvW$Ggbu?8s?l4%3MS!4KF9Xv=Mv653_b zp^q^wnV9lGRob1zseM`a9N&w+NS)C5bXzlF%1`In@*RkPRei9D=ygr>#e^nd61G+m zO8Vr1(%g}bXuw>aOF&iPPukI-tUGzcR+exf3FWmi?kzJbp&a?jzLC!T3IUX-Q%$l8 z?;(W$v#mmxxZ}rZ@Ri(`^r!R^9OiS!cmq!6>y~bfI*uv2^R{Vm8P3!FS%@zF&Zaj;39AK9O?n6bO5;j z;f?XqD?8%$n`gwLOGe?SX;^8YHBsr}XCC{8GxX2yU&&6(4MYLEAur-l)S<`dPu#!knqOPeVCvw6650v<$Ao_5;i!!*o8RjvVXqcTtM)l;2rb zMj5dP9y-tETtb<`SB$%~&(52fgr}gTJw~yiGwHHS`G>wKf44I3ICklj<}pKgR7LW* z?Pi=Q^?%E{X^xoN#L)oT zqw!dW=ryQ4&bfpI{BzhvJgO%;UTZ9WwJMgeXnwSokpC`NjqFV{w3!^;&=#xV!=p!z zgGc1UUTth(s*H;kPQlT>3$kn#i_qHujdQI>kHB&J1d#v^MxToQ$ivMnfE{HFJDpMJ z=&I@TH+5!ZoWE!i8+)4KiHDb?YaYo+5oeu0nka$lSu~V3iq}LX$jb!+jtV(`xDiK& z^|6UIUVhd5m@;DkJHFS&W{%RDLAeVrpMVV;+w5cOa1gKK_>1X8VjGUmPsG2f!|?V% z?3fj_=NQrb8rZPX7blhBQ8}S!?%eOxsUoVjcS29yfgO4uc8lYMtuH}B?nl4#{N#3I zzot`-=r@J4?erO=Iqra?eGb;*d>c* zqcac7h-Pb6?u{AK$HiwqH#z3a1<5ePQRMb-escxKuU5x_L)d5r^&%SGR3ZRWvY^^M z`H*RsMastb=kINZ`+vHa=%Rh%nrlbIr?9!soi_l7G2MI1snpX#{{t83O$`M*t{jFB1sk!}nIjkH5DmMiUj`W1pH73(g(R zVvjmWa)(_v^{=g4kH+7X8~|>)eHzgQMiFU%1zJ1Jzmcn$W1RDdNP&~+`t?<@lMN8v zIZAEHR2Tn;!KWTcm0iSc@&Ui3k)Is2O0d5B%((Y;w{Pw^#3N9rr_O1Z9I{Z2R> zoE=wzSDtdN_ITVn`sJn_`(r1YfI4^Y#Syt97|;6S2;@#}dDYU2`A0k3P8^H2VneDs zemr_{49lporXNVZLHf-ojYhRm)}c)jl6fuX5Ej#N9#MYcnFXI&gl7)RYP37}LwQ9A zk&~Raa;#LCu?h0Kx)N!%y|{C}D2I0nSQMQJojWWSSZudCvwEs!qb~HlBaT|Kba4z4 z>A;t3y@lM6_m44mPFMVv~nutM5@%(P!*m{7?9cdeT-vU2bGbdjUMz)m=X&nhPyt zOBjahay|(Uf3~cCJAV4L|4=vp zJh0>hcCca*Qg0MJ6Rk~SY2gJyP7MqI>-%Iz3nWj{MZf^Y@+F|ebZqI`%}&-vhwaFD zy`73q3t%Gg81XuepKL*)Q(#BXRoG>q%7KDnBuGIh0VlW$2F@dd4L?S>rA{bk6Dkp? zDhIPDfF(3rCJX`~V8xerpo1s*!rO%TB%xf^t;3tE_E_{EJ|udx`(Ka4uD~ecxhp6Q zd8AL`0iyz|?Q=j<0atmj*kT8S9hMu~Z96oe=w+#wOAEM6BOkdX5EM$LPoh8=;iFqx z6y>6Xf;XIH`Hcg>N+JL}ygF+3Y>8WLzyW{-{oHj%V$+j~9|hhWtM?H0RtJEG5O~i& zZxjvy7qQzLMT?YEbS}tJiw6F0D}Ws70PyrPTjD$4euA^D zhQ*)!$%i@T+6h8FDvGeH%d3V0-&xhbj@`9!|HEtJiW|<4JMWnqCvhz4#5tTfU;&%- zG<`8~K_l+Voy*C>K2Qwg;+Be_^_dA0m~6F|cuIcB!gyc@6)4N6jP(9OBR7m~XJ&dk zzx*Q~6ov#FP{2|ywA|Nnu%lcRQ=JDiO8TrYfZ2HJhEJ`!5s#%qoD;Nrdo57`;QQW$ zFC)y;i8x{GAi`I2t`LhF9SEh8o!t(f zSHZ)jn_vD)WSqeW&9E*OclE3!-2E072kY=+>`S=u*|QPcIb&VH-GMJ#Z&urY6F@ai z02?;$ii7N47|^eG%$hkmy}}KJR$z*>XMPl5yj$}xgY|*9`xW4lPfLIqYS%^NZQJ(a z2(UYOW%8u4EJjyCGl(mGY-=(`xghWJp+DYpz2CFWVW#GmG?H z*b!5S2XOC%ZS98B@t6Po5$5&^#@)H>X4n^tfo15>k$9kYVqty-Q2{35j~h!3Wt!zGI*#MM{L#z|mhy!H0mc=gZ6@n9^A!m9~w zevJEhI5>?X^!*ML=andKt?}_soENvyER7ppGL04(9oPhIgMq zNXAdzGa1}BB<>FrhOsY(f^9f7yz%M|A{Y?zJa={=Aa-w#vo4+*XDt{X-~0A+(Y;e& zc1sK<1o`HefAQEjXW`6POSFNvU)&P?2nX46`c#aX*e8DHOXtMnk1vZ~{N#0<-fkyS z!0346oz?7!-^AQEJSI+?5nXTqs6SpGyVh@wHiWVHb7v9};SF}s507EY=c|^ki{V3u z#Z9-*i>CI&9JR2NXag-6C@+X!oIAOm-TB835gz_@GxRteXP+|z+I5BQn_}pAA|`y| zd=^nE;@O9GvFQFvOqxEDGX*clNw6jQ^=Xd@<9f#HFK>yT{d6UBS2tu3A~+nWBUIaf zxbD_@oTb+q5C8Zjj8jeViQl^-diLcQfJc_Z(F4tK!9_$Sm_3Z61rEpak1xlO;V_Ht zQ8)lhA<7DKL32X~X#EBu8MnoS7te}|E;u{Zt=t{Ic=$EitKn1w5yEKOu~>8s5e4Q} z#@gk3_KPEPy*doNPT9U;OHIvEcmSv0?d191@nsZqBCc zz{0B?(WqDh2KR|!qXx!aLc-Qzm}$pA(4C!%r`bi*n-h}GK5tUYK6^s+9?%UL2HY{X zcrLLrk&cqiOD-hlm}H-&T)S#2aZD5C86xLYhcDjS_s!={x}1LyWSIJLzD+{~bETfq zsW@oRv^*zCWIi1Lm_du(qVA@XhcS8gC8ENd87R+qIBSR?jKdBVWN@RG?BHmDUAqp_@9I-tt{gXv@n~3v>{ZqlP|MTN;W*AYt5;XYb1$uj z20e&G(4V>XWE|jJ!7de?mpWz~Q71S<6;;!P1T(8h7-~7`;S&Wb{=3-h%$f@%Rs`VA z{3+`wuTp0k8B*9P7BML;`BQ*Sy9Ee5gW;6N^Z;kwCZ>$om&v#C){T=q)~P#nDjF4wR9)8Hd`6m@%mvyV*{0zH&nx#rV(in=b{b zpuafcpGvI?y^DgvVu2~oB>emWH_0!VTEGi9!BV!PfLGvrkQHQkw!!(^aRc<^Z`CcJla-Drq<6d(X$nALcPSfn%2NN&{(`b(hlV03dAgqR#nA zGuva?@+;{faRDgfpT7;=+`mtcm^-TrP8-aTge`C2>|c-IGD`wOyUMzZSkAtk^#h}@ z+j!v;P03(XVLjlBsrXUxmK48LpW%{4*VpOF->F^w72IVy+ujH5V1?mpPUqMrqk znMwpdKfs-RQCdk8X+>G`tGs5b$VFP-m&T!Xc&NpD-bxy)em zu^b1akuy~C1;2BgF(cQzV+rta-{x3GIT_(cCQIZ{5ASU2DRj&A%eKX_nmQZ+rpLt> z4PzHByXQ^7`|U*LdiJ^1=vXJ?oO9;JB^MC^fbihLC7j1jw8xKs_7*zUp}6p(IYf)W z0e~n`MfL(FN-E^xN4LgvFK&)oZk!g27LG;^Dmws};@wL_@}Z+m9ACDEg{if1^GzJL zwqP*j%4?=0`WK6EPd&R6xuKEs=cmSqF%_{FU9gTw1I@@AI-hmYp+>})_?2vllY$Qm zyjh%h5?hIDZs6i11YJD)MKMPgykVayI|2$!j(H?kjz~TQze#h`mF5Ha!370zT7V+m zsUm5HJOKYd{p@=>C~DXSc*ZK}ls%<@Et?_@i`{d|6p~chmieI*yyEVCFYP`B>nr8) zjPx3WX#nXd7nq81R9px@X>tysR?-SU$}))?c~Xiy-gS;+wXLxReZvK`N$f74IB7I; zaeX}d_=?!JVK4F>=VG5TJQiFsK8BC(#e#n4sO6}qcV5^T%ir1>Cr>n@dk>0vI4_SF z+b@>BzAZKpJ)qf@2o}A^61siSqRB)Z8%4PN!$hH27YETthH{jiVD8#ojp{};OOAAF zB+nu2haEb%#^h-5aWp^Z!8&M^3wt4|a?Io{Q#pnsW(YcC# zn)8s&Wspzaz(#Pou|q6>V|OfmbsG*26*zW}#~HpUmM`6jJlTq)`DAqA(XpP022cHB z1@l4!yVfsG8`|16yRn%a#Ks0M0^^`TeTn)unIrwiMj!f)M{#Z5yq_cN>Y{4fG32d? zfdhx&G%x@s-jjJmz)9@l?ucw>-Y9m5%A*m}W()_G2{?aqlqR<8EtIosXKkFo+50q( z3muUgJ@&w;U(Jm@;>8!1u_L%WuDWg>GDj~W7Hq?IR-Fsp?Tl}Id$*ut&x?|-bPC>#K0#AW}&2ms1+H3x_Q@U2zx_#=DcLpP3!yFNLUh3x*=ap)Z)?|rUP zS3$oDVA#PC0Gn~-Fap37>=s06VBO-30|5P?4cl>5)rt7V|9mZ0Ek7N%+%|*gilbuW zXz>A!enUO)Q}zGRN5vH14i7aDVRRoGO={BK#9VcJVBK@#i@DbrnZ1ZYTQUDf-&bA^l?F#1X8K^kI>-l(*bg($`}{*;chbc5K~4 ze{POJILD12-Ji&_y_2tu)|PX4sip#1-28?sM}Ftv6wnyz+B#z+Y9Xp^J<aALzT zs-jPf95a##g8kt?Y%7*!7XCTbAA)AviJn`v_i!9%9jl^W1?dN}agGgAEQ~vswdoY8 zfS~MPe&moWCout5a$`JfFs#3~6q*ISjZ!$|RW~N?1+2l1(%6-Zf+!S+1 zf=N}>$lR85ikVYZvJmo>I*9oxi4V_sRZf!&xuv;MxGgIk3)nPZc=QVTaxeO1R~_GZ z-$*2=2IOeh6G2VRhbe;rqk5?GU80))?ZlDJz=;s#Y=WE}S z&pEuPNXRL{I?Tg+(@3NI=Oo1?-ZDBI?^>959n0MqT-N>5#zKCJPu%b$<$UTX=3rZy zZwq@2^bj`fVd=C>`Ray7OLL91klnS(6mlh|BWz$qg2Z0kQ~n05dSr~_Ed0Bf8ND{6QgJdJZSe|x)C>D(aUJ@aKp#^)54u%}z6M+hqe zrW`1p8xGihm-^DM>Ix9ZTpRMSI_5v@{oFE3v{-xmp7UVvd?*vz^9yV zndD7=p*`|T%9K3gfAXGvz&4k4@Ra*_X*ru$y%|6I+P^P304%MC7Nr8nkO;FB1wk|g znOq}R4j0sGpeQ)%7!3)a8wEG_n-O$ca099f zye?Ka73mt$Zs4L=ts0XsL3AquRUb<1??nv1WDdy)Q+bRajv()*tm#v*CylPE?CDfKJD3x1ltV$OoDxXLM+>fVomH`A z^{MzVv6PP;#&Y_OS@GNd@iK4+u1V!5GxCGlvwijZI^v;+w#4I4Y=|4KpNav%;`a;& z9B}`ZOZrl2{_Z;+@nu}=dy?UkpS+Y4s}mCUmL+O`-b-ASlZ!Il$36R8UHtiI>$;e zzOv}jxGU(*u_&WS1)=c5SX3l?Z=Rf>0Y7O3oEwi!_s%C9kHuLw1*T3IMf~T%D0+$Y z#JJ3qHkV&6$QszV*w2Ei?Q}DYuv<(TKP)B@U$`#@1eLgghVm}x9drGRE4#8NxcDh9 zDjEBgoFr(+8vvV)b^BqwwZu7}!l_=|tg~>W8O22=$BD7V6kO}}G;m^fZ?16Q+>qR&e+C%8?2i*S1;u4Ur0>&gAnn`N$VTe{7Q&63SSK97yvYdaSclSHd5`_} zv#(z+Y+MLw8L|tX*%a?>yK%RUu)*)f*5QMvP-?T0hD-fgc9Ax2+{a@2C<|?3XK}({ z8}755sQR$@KgZ&^86&fH-0G#Zoy5bu9 z?Mz3GeLV*_j-@H5rV0!N0uLD75k96&9v5Rd*`NT`-qAOfuiPJFMoNP{W79^IYE7N# zPQBsiLFo8QeC}7Trr!p~t1s2zh2Tx*rk1$-u8Z+1FpEX`zW9fKScw6^af}9r#)ocO zm=?)j`m-Nlt$#ND@Q-eb#hl!J;zzsL%zg(&LhtzS9gCUsdJ#ro1NE)JYe2vF(?9zp zn}410zyFsgZ=3h20mJqLSBL)C#-rCEF>dC|} zJAt%%D!%Z0H=*#s1Hd=lh(+_4#%=e^iVa(LbDCirrxb?9_$kw)k~m0RC|4SZ2f260 zu9!D_Mr_%(kq`oXQIbq&vwUmvz}xPc8~uhx{OE^kV#}IioMv4dLr0CoI0QFqyXxXh z%W2w=tIE;CF=Xf$hmUZgWm0W?yL>6P33RWZ!yyZM=ia|1o37#MM_X;RHt` z^}QBdEliN-YMC{SQNs?HzFX{X z*b-m--=HH50P408GUws9W5>orgbGkPE95m@c3ySEeE7+USn=ke*tC8dv@#CEtllVF z>tpit;lMs4h79YC$cM36jw!j0a-MRKa~5UEka(ALmEVkV=*r~Ip=Dl0OACHYeiv(w zcmEVIyt$Vc5tfyB6w-B#>7{Ju0?1g=yh<4hlFP*&%NgXg_S~S?yTv{{glGuV%tnij zx++~Hlh=7&#ZkhPa3L#FTy7i-2hS9$1y@S7W@fX6=r2uQ+PtfVkpvJl&u~@HFAG&%VWiz5zv{ zVMY4k#iZV#tBq-FMJ{7&3AcCkC+Q0I%X8MP`stG+Fvq z&MD**k)VuImQ^Y}UX}gnS4!FWKCuInR3YwK!Lr@wQ%*X|;#7JNhba&7t=uqTa5qkt z*V3027)Nvv?~t@C*wS7=Y$qJnLk2G8?Oc!pv*jgRzHY0Sl}^%f)tK9u?je9*E&R-@eVrjCRxY$?Mj#{;|T4e{v4 zqJm=LHcPSvl+DN1Bp!fS`co;8CkK)HTtvFtr~=2#%7iLp06Y1z$_F>+Q;f7E+YKDf zb(WkbJ-qiF-}Z+^(!8w4PRKTrIxpV2CNfQ)@( zihd?7|B{|4CD)pQN_ypOieMeZSm#G!IKe%2`OkJH9N;hOMcbi1%<-HjHhnE__(=Jt zvCY}HJeF2$Ps-2yE|l=rD~$tHiQdk!@n}2B1_0SN*6ezK{I<(ByTF%*q)$IJ$hf+P z)L=ollIF5P;iApvl`f=n^NDBSwLJcdQ~#MI7yZ^t<04fvOPs>MJxT5 zbWzlq8>7&;k7#NMXx|kjWIgnS@H>vht;RUc9nwwW2HF!3sYJ}Oi(;%(1D6Z{H8N0+H0`In2`Fti=4l=@A)wGH{p>$!BnP&-2=4u# zc%T52=Dp*K8w~(d)-iB%4lBkG{VuP8rQ23xU!GT20o{o!@kxmVf8&>QVzJgC!pxH= zl&RPCsdy?3Uw92n)}P~rboQJ5ty0Skc@@o~(eiasU%*(DZ4XdX)@2G|af~}Q-2_i1 zA?3)w&x2!p5f%EF+`JTr)I)n=$2N>jcfKgEpc6|hXoP}gIHWJemo;)n-9jtABBqWe zW;RN|gT$oYe+;jcc#cf?M1*B#88(#M+)Yn3yI|ZzG$n z-$QoYx^;8har=ibv>b#I8%)@@yx+`P8md(iaaQ68RiG<_pU6mvSU@ zn!H0{2wE|(V@0wldv{8mwJ4yYd3F>Q%x>0Z2a|VB!IRy! zADqj=x+R|Bz|!7rEvYA~Wc{-MI=bxgi3!`v6}!;$90L3vYyx47bF!IreM^p$-h}7# zFit0i+%%qW0wZGd=+T6}X(G(zk(hVs=$J*g*k!NoiMKG=j>=X%rp<_pFUK%oG@G`# z?#`2dqQL>>H(gl?9Ua`;60g6!nRf1uDU-&>gz*zNV0D<2w>vl`J&gG8OQJ^&M%GVm z!1#S78;LX7?;ph|AvrcG^8*W+z{KI3zhW%{rZ$qEbYS9?goQoT-ogNQzT7LRu z4hWs-9S=XYme8ztHrU%O4Z>&58JT#g+j%_KBA@xp)VS{Y!IWFgnzV%w0J!#l^iXnNH7|c`fbi_@Ju$$wrzw}yc z-q0=Xx_fTiddCQK%|%;_v_DzLFXNpC4~KO7zf~9bP3S)Q#018UYg5BVrFfg|E{@x_zwi&!bNmlHqd)^sU0>e?bq@MNwl8)-tiYk0A-{0-`9VhN-4e|1mt4?%vyo zC&y#Cncb^z{}?uML=5)iKjX`p2o9X|ZD`VCM^2?d!U1%Z-3SlTA8*Hl@#fpNpCLV! zlPH<`a&6&+&;M+Za}T`Sxv#u-P6i`*VvTQGRF?75h&yGqqA9L#a{a+=Syu7h`N+L2 zuatL6bA@eI<|(j5;aug-N$XX{v}K~ky16O%9RpPvGN(%>Ti4VcEP*>_{PkYwe3g+p zkW<@`S&WUY!Jlg%QEgFqV1aU->kL~XpHrz|+q1EhYdSMz-Oih&b4{o0SjcM3{R)tl znTbgcauZ&gOPQuGuU#!S%P@f%WJqLo9hhrH9;fF@9_PMH(j?dc$0>`O-}a_F$qy%B zs|R?e;Dm!RQ|_}(z$thM1MiD2u&wTwf-f@lWWLwkzhPaK7hKbNFzGbC%_;{LS>lxAJyX^DM0p`RwqH1NU1Y8cnJ(?hwjqcVx+M3E z_y=4`bKopJ586iMHi}AmEw@=PQiy?ScxGKyo+5$f-Edc~O8M3`faTg(;*zqI7u{@6 zJ%@cwQPNoU3%^r0!GQ0E42QY^52BU%spZsvEqZ2~VVIQD>?O1iiax{FXTM^AKxxHB zy>L@EI8U8duA%Hk1-Vk2%Y-DIi75MCyoz&R%?*5jQ|@a! zkzV=J@BB)fOCLoWEnE30^`+G17_~g>-?r|pc=&&o3;-To-AXwYOAh}7T*3>2weU!x zSLIphUzrJrY!kjm{8XYql|V|z^pTq{rqi`m1;nB|iryFk^kDJkb5F>(V+GYpECu!_ zu`+SiWpFXbk|?sYsyIo!uf1%5ojG+ZMhxr?!imFhx+OO)$07`kz>2G1|K2cnY{MZ` z=r@VN4pL#-$|+7`i63$k32V|r2ro6gvFIYU_5j?q3R}UXsF!x6uuT~fz6(}iby1X? zvA~&%A7GOS}YBnAL$Sg6&6?ux(p+sAR!-V_gfbZLC>=IOY@C<^VE*T41>bTBCX`2VlT?0WebRf5kX+a}W`w28DD$2&ELVkZ8UVmpwC0kDxEbLl zrHspXqd9P;wXCyLj`>9Z?Gh}l&5{QBUBs*b*XH5g{D}+3!|5i3eT0s>?e)Y4Z%452 z&xR&KI|5)Yti_UE$S17QZWFGB5AHw0A_HNFMaQ(sLt+X>0E3JXWK+X#)rL%n9tmGC>LPx;r?ryFXT~*_}LQ z_MAyE5ts%JVsltGNc6XLSWEdT*Zq@E%Wr=O zXT_`;Bhp$|>&Wu;{@8i%N%_Yw&o}LHl1joXL1kOBf8?=@QQchaWs`Lurw%u98r{wL zUE7c5W>_z*Wc&4FQ<8Ys2RISm+5+t()OY8EtyeSNB!(ayPnbBEP1x-zWN7Kziw(QO zhflJ}b|i+d8FtB~Q`yYK{XD|-o;{7sC!FwRv$LgzQ~wwNcw)3T;mk%JMq|fuO)39( zJ~8gRF_ltrQqi4xpaKiw{&)*$MY-D=0|pI--`5f|Y=11}q{C-_bqV1F&c@&Ur}7hl|rmz8C)mXI$KCQOPeu9`_Z>p5Bcc6{(dOXGL{UJ#e{r zHva5Sp2l;^Zrmd-z(wCe@N*m&d@r*(*cku$4?h?8+}D@I_L_M3TiaqMC;8_s9T&IW zH6OQzXF2t~CQdXqu<<`N?!W(1JZLa-!u3z#Ks+3^qg;#@<~AfazdddHuAQ zd-1qf{`U5G@64jhb*)@Dv*a~io%A1uC4#F%Nl@BpxcQ`7xo z_3MrCwSRaF7k{JTp8Id0?Z#*9%y2<2$bS6fnppA9{^;9tSPEJvTMlASwivhT6XLON zt&4ZwT^W}WWAVBh=ERD(abw8|j46!SYj2#3F+*j%`C?tX_~SQ;+1Neq`xpiQGYHp% zQc7tfA103ePA()jCKqF-i)Th2y*9ppg<-R(v0D86Px{G#`TFETTWqE z@^*9|z=@CBFX9A97vY1}M}NE~xCmOa?)CVs-@79gUpf*6UPb)yd&^?Oih4XNu}C41 z7iu(4_E*Ja*G%J~jKRQgE; zKa47k=VU^T@sc1bzfL#2JamrGLbxpCGA-qt#Z2lHk_#didCFpEmFg9Ad0`uB7~}G8 z4dh%T6^kq8K;~>e<;B!Fyh+s3PjlzWA1hFFoW!_8Z&SF2RkP3B;8H-iTmZPRN+FzA zDbF!Sra+(V0A^qz37`N6a+Zd1O}O_wcH{(Jsc<`cx-lNO|4L5D;Y|w9ELKs)cshBq zEmp0n$MyaW=1}8!2dAMT?*7Q-C`kt*k9LdKUt6Aw!g=$ia0;j&JnuMj+Gavzwa3y+ z7ZG}A0ES-&pPG*#v_KrK<4=#oDOz^mv1SnD<`c_?7)k`cy>H7b>PR zG!}Wqr;9bOoL5O_pB9^6p3c-D5xK<0SN1EX8t@*`qq;pNjqio=OmBE38!Q?wu(8ZE zm-JM?P@)a%ByTR_>4>Bc`;L0g(iSQPw;J2BO=A5Cjd_5GPo`5g1MXalD0{QcIFFp5 zy|#UBy4)Z%KkXORe8z9r0L4Z^0b7~Yvl^Q&{ZO{03wNioCO{Z>PkGFbiL!37WLsP; z0>5}saZ}0S$9;cLkn*57tWpDsOh-T!WIzzZyqKr`xX*m{9k8eSLeZccN;`OzH~|6R zqfjCXkhrm~#1Amq&9p4bDDZ6?XodNlgz1q!#Ijv9yEg{d?Xj!=bR2JyR}=;S;x*G# zka-LXk@vurmlg1YD){in^!ZIYz`yvFwsNsgGUa72pLtoP`NUt!uE4JX%gszvs7T5U z4Hx7*(~!f(uJmkPX+rr}4+#}~d%8bmWZ+77&O_(`06+jqL_t)~SP2>>QHNIl_K&bQ zHZ8Pa) zH^h{%?1zHh^8^Pt??geSml3;)s-Zh@36J$;wVE_>EAfRurnfciiJkq$Zx$cvvRe~FndpNBU{B!8lh^79*5a+95M zY?~XqNk6==hQ5lv1;&J*m$WgBU6@0E!T>;6sK*AS5d_L?u;u<)LFeL!wur+tboU+_ zNuHI^*}ekbsZbJTcv#}X;mSKv#uv0~K58? zIsWE(3G#G*>4-|h8=vwn+dz6xBdNp{4h!f8T{~ZC>>_UM8xr#?6X&002jyd|-aeooT4F0{7zNAO=J)y}XfAx-Gb5pG_#CVR#n- zslMcDMgI6MMzCAAZHuK#=EtQ=rw}Hq*x0u}P3WB4&XK9t-Z~MFKfNMux^8k@dD&yy|7(7v)C`G`w8El-sdyxblx<{0^QSuQH~ zjk2fxVi7sN^TYm=*UK~Pcjtm?mAIs}pPaACw4j?@E6}J#no3cZvap{fZ3#4BDh@IE zpqQJejd_iG;4i|LKvyXpVXm&ed3LmP9*ZXlk9J@uihSmq0Rwume!{E6sGjKQ_OSWi zK;QMEYr3=kZlW#VnR?wM7w~E};Rg)t#e8`t4eJIE9148x=y>kD?q86_Ljq&c=yIChRu-AoWgi<Q^%gYdy$D7IkdHiQ~P5v zEN+TdUfqJ{faB;HJxP0(@SX$Xb8L8Db6Fo~q#xn-cE#7fxh9saK-U2^OyJOhp3553 z14DIu`cu>5h8suX39&kLG++MP^&Cpr4}Wcs4}EAhr~4=49ib;1Phu1JnOFAV{ox<~ zX=6P6o!9W7H#t20fBWsj@vhJVm|Eh=A8v|ge^4I-u-1R@S7*hQ*J%J?ZVA*Y36<}n z%nKhC{Hz=6|MvI?JODiLg9CBz{nIempM)+L*Zhdk4)vdQId(0XVTl32t_%S%iIBM; ze{ecs6oxX+F3byWvMqSJ_$v$mwr{S&0AL=*21D_(pzhW$=MT}f^##JU}_ql9Xoz1 zJ#W-;a=sVqnd#F;$Ak&P2y@UKe*Jz6#8oHwIePRohl!40z*El{slqsBWQ-r(zjT-q zVo9ngGBR4ZmjQeIBzC0D_hdqnr5q3cbYH~-N89j3um}BS1?$j}7$gj5jot^(lWDA3 zD$5N=JqRA!cM{JchokXSGkUTCF%nM=gNFCX(3xeugnZlep`m|rUIDC>gPCiTAC$k8 z1M-=0o1VdudkZwjxh>aAK3DE%BC>VLn$C5ZmIs-R=OoK{PEd{rT&DPLo6A}vH8<_z@@t@KYb`*=Cu=R`>|^U^l! zb%Q-O*H+Lx z4N7+9Wy`T`35a>Xwa=Vib4`#?n26^lqiz~byKFc31!fJ0IqzJ$;5oqW9;Wg^Azuii zGA@u(aN^p+tdFwPt@Xm7rJtMs%#&VcSgSO%zj~UnAWwHKm~xCr5eEKSzBox-O4<&L z>@yNkE;rdX;wSM*CQTQXCF|9ZIKpD zEBd|cAK~+5A!qRnnsCgV_n@?}@jf@=`Dyzz)Fk;moR@pK;LkMb9xOKd(z+9QVuWy_ zpvn*ldYRA&Kv_@&OL2A@+fU4NA{5YtJF>NZhvV6bq*fY#eQmtFE4e0l*cUG?U>M<(ISkJm0oc{m-5~XNigZRBRx| z@jdr0jgLKW2|`>^dp7guDU39UC)4sn@@c_({PD-P#h3o#WlpdSiQoLKOWBwjnZ^Z0 zx#lQe@3pr4;Jt5!x1){ca2vfjzVekPupXWs|MkDzj!PUDF2x|sKBI_i6N7l$wiEGn z+-pDm-1fNbuFK-{|6x`to?Gxpp-Ub@ZYA?L5A8V`)9MLYuzyq%NbfF|WLh$uJgLuj zZU#D{8QkT`EYp&%7{Dd^vJA>q`EEKVs$6K%a2G)`*}{VaUMG03qF%bP4C}BzE!Xj9 zbxAg)OV^?$8j?wvS6a(j$!{K+cbAqnSe+b02&vn#7q0-v*bwcH+pe*=H6O?+XpI2O zRiaCNwYHtbHFyI;$ZkRcG{rbvMNi>m>~P#h_aF?J)2*E=oIm}NYPl#ki6A)+w4CsX zGEO$)^rPbt4LK>{!u!C`aIyXmj8#fx* z3~P{dUu4U_U?acFWBh_wzrde~l~VmB9Q{jZNMfok#`qBoq27FZJsV2RF%j$XiCA_I zAJ#7|{hT-wKV=*jJ@_w6`-R@yZ+?W6VUd?K+<2@bPtCijbrK%EiCFZ@aE-lx->Eoo z;AqlvZLJ0;g=@KC!v|sPF*pwFZH>C!Ct?tEIDOVQ=-^DOShkhZ`J=H^pB~S@@EUVV zN8ES+6`Wchjs^bac=^RuSf~$+Pk;J)PK;|&>PC0L?^-#*K9wHxVA7FG33L&j)tKZ~p%6xxxIm|L2n^ zMb5}f7n9p} zY>5SzjE(DWy9lob2iTBb4sRL|GZ)R{6nIUvV$@W(Z3iBOj;F$_55^&#cx4zgx+-qG zV-B0g<6`}?qw&>$cmxkAW8=P$-hkUk;<*ztp@MnkECvtDh^hF-OIvYkh`<1jKykkZ z->d0)Hm<#8Zd`ul<>0YkIDh?^Iq}xvKQmypSwOTzh)xyMK!J~ zF;IAAXSC97sDe;3onfA9BR+gjyb;`jSA?4QyT5rH936pHE|0~RPl|z@*wzT7kWn1R z#X!!vhTd1XS*gaw=X~VtrgeN@$a%|ilT(GWlX8=aVw0ONJ=nPUiL970wVY4+R1v2j z7kAFJ<#IC*G80NXc}ns>U^GO{5ax~fb9-PY)D>HIo@DU|;X0p_mju*IIS83_C*y#e zR4GKtoVh4=-sR)w0iqw{0NIoU88bJZYEJHS#!lv{gY~=Oh7Zh%3FC=-Nw|c5^yett z?(3%WpWrhKexnDcb|*%x_r5aUIKlQP$l#xu-=$B(;}#`QJ@B-SBKN2L6Rdi8oeZ<*mUhr~3$*)j=4k z0i3ECJ8=S={{xWaZHLRpGQO1wlq?q3MhHqc+E7x zp_^@)y6KC}FMe}h10Qk2I%y&|G+iLI#)zSuhQ)AKWo{iOYuZq{c0rqIP)U7Rzx>z! z%AVy3{}VjFm1kTGAxB9w%174cm1#-|g(yjpJSymmg)(g*U#B~BUe*VUwqJQp7|QD% zmHArND?dp;Y0Xa-WjNuV$n>;DJc~CHXPVs9V}4=SCtNP5 zT}xPWmEI~C2fRw7lk?DC4daWVp+nrn+J4}6k>~GRQ1h~=%^Gc%{K~P#$1x;aKKGw+ ziWn~|wswC&=>{) z@RNmeYcT+5Ve=9X09^>^#FZSw!u0ngL*9_4FG_x7KPR1aTpu+z*7q`iyN4G@#6zXMHze* zG>QUGC1AoYUvOLqkBeP&Gv3QT3?WfT-_@i>#TIzk2f$()@r;&9*t0iEo8dkOxyd^X zIg}m2JNcjeo!vqj`J8P_eq5B0WhXvM{g878MTl4V34h5$8RSoohtzEs*mbF-17GGz zwk>=ptJAxII5Q#7l)d?pbdWG{=Qzs#;U^prJ_fI)>|8Bpec4E|N#*|IvLV!0NkZw} ze$lW(W?)s)ncvn~7`M3*2!4?t2K4P2Q^pgjfs;Q6@S<_N721Uhnl`hTjWWrRbmDkS zyz$&JQ=Z_5yvxgRZX3k)Ir_#qqSB9WnStl2Gb62hRNg8Mo!9&pN5*n@pzB6f{+4t@ zv3f#CTBDd^t}5{}%C?QxjZeb_tV|`2{dNqVH?OIS;|Ck#zPo0`CY|uuBG=y<0IbIFa8oR~7`gYdX{-l~hh4mkc6qP#m}7?VD*cKxp3px9 z{&F+l0(j>C%uiYs+xCI!EyMX=J}1x6fU6txwZ zWjj-@02KSr@{>;ZQSfeIBR?OF`U;-K4_n|D@cJ*u4dtE{Uh_gfa^h@=%_O5Twfvo- zLYakr)-F89Sh0=LgKc#DQXBX3q5>Xe`S#Q2ViRknH(%HY{2g&62FuguvvEA2Jw`zf zeZa}vFYSpRJ+cGich>5J-n;nn8L{Zn@zHRsA)a`6WgOZKjD#N=&q?HY^CzSKIf;zB z6S?+0^6_9~?K9|ZPh+6pKihv2oo)x|S@y+r;+FF;H`Vl7+NptV^NASDTITu>T^T*A z3Fr3Ave<-gC{dmyZ9gPim^ul1b7svNCDl`m}9>T^E9-*zRId<(j z0#Cp*CLsxX_Bw}A#IBTa#*H132X{1HKS;Qrm8-UJAfOQ)1u?|Ojl%f1nS(Ni;>s)L z5f)$q`09+;U*8t%)*eBJf#C)op8ECaicj1(F7CNweDvzmmwD-UeCNB{;_;`BWO&XY zL-FE3SP)JMf#-qoiI2^}K%;-oq0Of{(dxucmL4&7{K+3rcz@;Z*JDg@Anv|zDn70$SY2Bh-UwRCJbxpQ(rTD*r4^6%pZl1ys?b(=U?EhRJwc{DGL6|1~x9l4`WQTedmEV$cg^$ zy@$q_@f=_!#BNW#^mSt*FtuEt;fiO|Gpvmpfd`M(7!M61bjp~?<5PhI^tdsvuL0-Xuedovm3hzsjtz7kH>%}!Syo=iMYu5%UBM9yW-{Yp{z z7*1>}Z;5y3Rp+b0SH%9hwz?o%HEZj?zhns%K)BNGEE|^4Y-3ENTR367WCey@u<_r zH#Pu*0Il=Vi!b$C{wS}1rJG7J+tzN>Aug4@iUaY$$T)LS6c)#n;Wga`Iw4vF%;zT5Kn^Y)rB}f{@<#YSOA`%3Cd3nj`uiwA%$tDEA5AFU-;TYY@`V~gXnpP8RZV#tGZmg^tt z<*!zvJ9o9jLl19eBVZG!(MAyh;A%E6JT)hb{P{OrmZ>o9rqo~k^^ zfr}6ti-O8+{dtPDyabsa3We?M=i>)I+!lZFm#@V5@nhl(U${6fBX)OpbyYtBYdPmn zuf?(s9z4s&)g}x8eu$!dR{Z{dz5|zBPB3LgT$E{_IH_*gay-8F^)>Ot(_4w5yf8ld z#f$MCfii`Eh5*p&rx`yfozSuqX?C7;i&Wv@u2xeIji@;Hq@QDe9%0;2f&E@$Rymp2 z82-C?AoG+CTzpFlc?u2MG9I8aQ}(@zR|a>n$SdegJbT{>&8P$vJu*7KWo?d4>vi%k z20Kpy+YOnVaD-jBfIZ#BFfmlSnS!F_7^eVsY}*}8$67ea+9RgozIxo)0W7*|bHdkP z$MIlI;_mPvgpr+lh{1h42KDcWH-M2bc4U8)S~9B=T_#}mTlwMvFbbwj%d)&FPR)78 zzwC52O}naN*Pf&42|(+|snaIm;(9o4=6W*0F@aHrNkOrtfYXQrc=cF~i{%3cjxffF zKR0t6-UEiB%qVEzJVh-c!S1j<`7rN)aer*NFbRt={VPz}SS~$%9N;AN`c2!2pWKA8 zQ=ha@oiL8D3|h2Gnu!@RSne;louz&fDu^>DwRZT*83f^zC)r3pb}B7m*Q{%b9ow65 zT}_CGW6hlGC-(elHsayO1Be$ndQ6X)GjA#eV?EdyImb!lVJvievZ1~nxB6RS`b;)^ zalxmR@5A4I1={5l+~RS#AjGI-%XWCz6)}A_uGnAQge(0O8IS(6pS>P;d9@karxqzw zYtbJ+cPO@OKElZY;;{pAM|(#qc67PjZ$M?b^6N?bz~<8x;QkyZYx}anSjlF1GXt(Q zd+`v8gB2_GVrk#Vn84K_ecZkK`7~y!t?tCNHw(=9-QhWWI0^I0D_e=B_YN*M1LKt` z;OHb9c{}6Rzi?%I;**Q;Y~XCqVgLhx|Nh^ejVB)8$t@=(aAkPsJ&ULxh1pl|0&w&| z{Q7U+6!+uO@9SSXjF*!);o)a+Cq4~#_vgUF4&vhVjZgo|WwCJ4;5dVFC1*Q|-@cd+y)E*v_^sf&T|t^TnR36d*zooq z=JRP7e;kj7rXBHn|NUbzfsKTRlhu1Je@FbAQtWWY1cg3R1rIOZ;4qKjfk7?TpauGEb{PImx0&5F=xrb-1w_t z*JEpSJ$HeV-UlM09aC_u?FJUybFK)Z_Y7DHPy;qjUkzE<$j@DDsZ>W?1;5C6x!J1$Df21sb3qF2Iv3?)BIhLXAwcK+ zC{J)PVquORikBv<8IP5mMsq{YdDXdF0k?|y*$VP`nu=#BU^BU?OfUGnY=(J=qN-U) z&Yi*LC3Ef8U8ka{g*lt@<+@I?DR?_4bF1=J{eHeno{0}W#!F!Ez1}FkuIrkwx<1OGA9tQ9(03X%$ zY2&ejF@F3+#^(80zG^oL^5z&kd_s&Mj6@H{i}I|ptFpc2q+DT(={Kc`oPxn=fggae zOL&+II5OnMKlreJT#)7lFn!TYi)ny!QPT|sE01I>LFy3ZT4SCAaP|v*;RbhCR~zH1 zGA54gjmz?2yf(+NCN0#v!)KIx$SjQfEBXXjxO}b%;R4%*ko5?kO8=yz6m$yEU26zx zvB^s*z@B&rzX;}tS4m7KaOcQ&mFBh?9 z6mNVq*ffuiM1N}8{SD4^vuAqSldip~{~U%Zxv-O-!Br)S3}qca{b@R?L>}RMp$E2GS#pY%)M%|`mThzt}$NvW#M(t-$~< zfv1c=$4d5j!e6ve7D2*-<|s227glEnT3)FPQWdz#G~QXZJW1M;2gye)lUm82@67L5 z;=Rm3ekndPceYnl7h_k2llYLo(rjRstV%FI+j;<4Fh}o0r!)R;8z&OaBkNn0gdqxD z7g(Na_M&f~NB)(%G~WqZ6*w`i?Us%cUsRQ_1G9N@td=s8B=MSQtva7i z5ZPbiPSAaCVlv8OA$`UZ>A+pCZ?Yb5g~w;Y3Z0b7b1W7H(ght^M=JHiJ7Zp)CQX;d zgr`W;dx5y5ec1*9k)C*#v;jcQYjz)1!h=(|&Lp;*p;~Gi-;{6P`rN*=gMgGT+K^@9 z^@O$UBn$w0U_`i|&C7-pr0v!-bt#S|v!!7LUVsb>N6k53Q3~}_HoR3HtM?2yeKlaH zWKHHNV>gI%Bb_pei`uDLdXjF{XPiY5SOpzqTYa8$Fes;@vL^)jgI8{#0?=9J-|T${}IB26)G@F?@xW|hMQ{}+E1Y9)D=4WqNOjis^gP)ef^(xedfSN67$yJKO4ITOF(NH4W-~E`Df1!H*Kn;DCDkBs@OL%vNDJ-kHE|p_QC$ z+PJa~cc7c&!?#T0GZW8gtgmD&T)I7dlbG$B*>Fz-01O258fN(xavB}ZLl3WD{c#xG z&0N+3V>le*+~E6CU8Hl<YyhB9N*Zuw`DC#! z{@Hgnz&Wmvacpl%7BLM8m8EnHnykfl{FmQTBqf-Jzw#Ep9aGeiMq1tj#5r}DwyD%e z53JZ$rfidESsDJw8!I8bdfucj#~6?8eslTE&dmOnwv)a|lRquhGP=cKjP&1r9#{Pv z56855!#UYMmyIg)uzlIkAJLsP#@Tr8@vZUPle^+%6GrZHhvJ=Wc8s0W4;R}<;;HYh zibFf0<#T7)xE`9Pl8>J}$$IW6x@PJDD7|j!y1Os>oi=pDX`qJde?tr`!3&n_&W#)E z*&MHD9gpz^thyI^gG;Zzn2qb<@zxs~W8JD<03b@MLP)kD|>z7(BPkNEy$t77HKwRlTg zj66Sz4dT7%)#}h6v~#Mr7B6xGV=7?}h72Bn7sAuAYQ=WE{57WDwkIAhhYohbxe9&u zi8KJ1J!@=SbInw|6Q0BS*A6!K>te>7F>xtt{=It%(Z)LbF#0aTkj- zI5%#;b4rZI5ZXBh>cCsVc|4jm$3K2$10D{S#Xa}j!e>HEV58kl{)UD#=y0~jQ;+S& z$ftjN`tvj6st*ii9(4R!i+75G+;}$bx^EJC1oTVHO_>)sGBpMOh5+~*3;;H) zIZs<>#)t33b^aLJdjV|k)$#B7ql~L^odrBT)mzaCywTOwpJX!}FA*Kh>F$5(@%=9WWL}3cH*sKe_wJ*y8Qu0N4wg#Wvu9xxGK^F6 zdRWT#6nPa-+whopwDB}vI*!C%JdgD5(KBWfR(AA=KFDj%!w6bZfwUl#1Y`bt|0=`r z{u6)6EB&~aaPl;V=nkI5?f+5Mx_BGKGvC+=W0`YV-@D75Wjp`iWf0xNN!qXnFP^*W z@Z{IghB1GCJYaI*gRljt?-BeQBgjC=6>bnJohoZ6lQ1phdeIO_raQ~aTo2}?WgD17 zNSB-C%xO*sQb4xMydcH-(VxXb>MG3#rcD$m&oC$CFipP6{KCLDU8bRql;J4Fb+>Cv zWiDmQG!7-BIwPk=0oFiXk+COoa!>XXsyV3RI_wPl6=ygg+`)w2Ng8z@xkqUufyGVn z+!(h!>U3>K#vI)_=Vk@@h>D6jZI}iC?)mt;kOhHF1aMIe7x;0$_a52Hcf~v@uAC#7 z$4z5m{@Z4M$hVZwlD7b3%6haTH@?LWu;uzL=l7z{l!eIWfd=bH-3sa4Be7sTS-Bol zl+44TC0$h)9$zZ?^kvh(7yCD!n^7ikf31~$EKmQ7vo6ZTEK)-=P?c>{p7lm~ z);8HTWgz>+=XxdZ#J%;Oqc3vb1~_so@J+@dE$OWrROSAbZ8D7l5Krkd3h)-$Qyg%Y zd6k19&RoBxj1H|RVFki{O`&5v(3t?Ey%?!@PkfICV;a74dBOmY>DM1zjuvkn;m4l&(0AbZ%cBR zb%|HrNtf2)n5dx8Y8yd2?eAhXF5o12wpp@;^8h|?S)1_1W&0er)(Ec?0l<~8QI~TW zJ(O*f_ABKPz?$XTAA$xxx37IG9{HbT4*=`h&$~fsKe}JBk{ihj8D?a`A37KQ+)i3i$3 zEaP?vI5%N+QHxaE*l--B{m$r%CH`eg=i;*56KS5_BtA;xNrb0USS`0BAhz?}ny?SR zVss#iR_pDJkhp*UvDmq9Ukn&Miqny}`O)PW9cmLS%r@DO6a*z+Zc?dL40Y1--v1(t z^zRWh1>`ew6hvWOlha;^j?~Gd>^ujMMidz%0wn9s!!@b|ssg};-We>;x36u9m!Di0 zCk}6k2kxF7zwzr=Fj)(s1ZVyJ&*76B*L8cu5l!P0VN%$+wde(!fb5Hn}=%YGH? zpZCgELrm?QV14JEmiY3QA7_zwoVZO_#J%^-L+G|$McaP9G9^_ZhDIp23qi_F!0-QH zYZ?Gdn>IPV@EeO_$r8LVz}WsRuu6)1_MVMLAKe_^`OXtL$^XG0+!Hfq%0QAVlSXVl zRZ}ssTR-`W)4eRK_rl|}Ku=jJjvPeX&MrT3g%_>r3tnS*L!b}keXcW{HU0taBAZE#`xfh|vt0b4Z$$264;2o4nc z>yELRu?qyXv!Oo(0eu*o8e0F>0IO{&%C!7u;v?;^-_J&09VK+cB*xLSiNr2qBSXtQ z>9fQQsMV{ud;gn9GHgEr1|$NXR$kp|7*n+fO2=bo-9b)69!KC|qXY}=v7>R@W{3jE zDwq9fewqA9HdS`+I*7Y?c2RjYXU_PTI(1Z9#4)6NL@mWQq%!WZVvG3&UXF|8>c9Yy zTt5{m+F5?#q~NV>-a@Roci&yZDV6q^J7-3oTJAr<{vvtuu2PBb<$v#oFaAGV<}Y7A z71Hv{;+y17TIF$PjJi`z9k|wFF;drr1$;g5Z{!3haUa?AH$+P%Zu5Kf?#t%#_!u#4 z47Ao9*K>k>_B<4xSjKCWKXO!`=))#;18%(^d3aU4fm^$|b0@|vw{qGWq5mKMujd(Z z)tn?49M@jElttk)arHGzWAP;uac#FTo_=B#LVch3$VZmqC14bFqWD8Gx_xUCF805l zt}llp_*bG`ZD%eygD{|LVR>_p9-fS^gb&wZUD+NpXU&K?bEl``Y~-+N6jiuv=5+Y- z6^G-c7q>HBb+uQ?qW=hP`s>;7?-my=nu3ym%`b%c`J7?9uHQy5D0ia-6c zPZ1KOH6DKW^*DjMx1O~G59C-$XGd#HnA|-+@tLJ@(c+QJG13XvfZI>8`M(aAg?rP= zc*gAE7!k~m#Y@JrF@KJDab37XYs1i{J>Ge99bN#MIms{v9y<;TW=ucyu>>v!M`~y>Lw2bUCf&`FQ&~J5#MBgHBCyHh&;)?R63GQ?x%t^Pi`UyX?5*lM+K=d zAS;n|qG`fE z6k|h}qxxlNoB@Ld;Q;`nmWKMc?%IW%)ES)fmT(?n9DnU=kH+xf{o|Ue2;ne#2yLQZ z=UKi^pd5JP4Z>qAUmXuVcuS0BOxKiT1M5%kLwuitMpmxejYp$>am&ruAP>9HU{0lu zbsJjZspmIDMeR@&2gtctIlB-@`5t^_8=Oe#G+X7O&32ZroUwiFBR=vxJ$1EVNTl3j zA7w^x;sVi0Cr@6x=y1^lR^8|oWwqcn``Egq5B^CXJ@7~{8ATw68c=eyMm?vMS(2rU zBP|q4`9iKPLne%Va?#2|;~k1KC7iUjr)_!Bhee;Mrlof%~jY_?;ks~)5@{|Y}b0Jxh?QDa6<%U>-nLybVYNk9Fv2HfFF7pJb zZ73T6D6e{@jK|M(F)Ub)GnDd^P~wk4p}+TFXY4e~-~F;gl8y4ecykc>8yt`&>47gw zq3xxR**)KUgVJ{$CfYwBu`2-M~f55 z^qut0Z~x``5tvhfLt5LE;|ut6(}#wo{ACUV zw%K~p6{vN~|43rr8n!RjGf8N|#XErzu54$4A4&jEJU3k;jQ;00qtWJ3xSL%?zvO`e z)0l_0RMW>AZt=6|HyM;=+hE6L7HIm+ku)L9&Jh|k*jN5God!MjkvzaLDlIrh1x=il z`$*U=R-;qf9R)JyT2808k{{n$D9xDUrGw6oyoeLNk(uXf0?~T$|4}C8R}vQfcZ)c&T#Tvdv>>h;M1jfA)=kgi*d> z*%FfQ<>oj5DI3`Trpj_CD~4-I)P_Lwit2z6xWz~6jmYEkY-i^3 z4-aTWu}SPp+eO<+n{aq%StheYZmr3_@+QmTcj~AtEi1F!;yS~jn#~vr?%1?7?)c#3 zxb5Z{oRaL3vW_VZ95@~?zPO%Kl;!H1&-@yQ&we3_ay<}F*BsO}V zUPU{K8j8Q3q#I25B(e>Y{@si{VtnryU;h? zc7Xu^324hlaR?5O8uC0O5QGry%>qezwjFCcYMj? z0D(LEkx%9qX#V@LQ{{&wvZc8R!1#aP0DznpfF9L<4!GnUVui=n>HOfoH9L_Ci#X9 zthv!i)eu9wrK6KI=oCWM&4?X4565dSt|ep_p$3>Ed$1WkYr*Ka`06P!X2O7Cc(59jptVe|s4(Lo;ucgzFb2t7;34I7S(&Z(;AW^~wi z<5bzN7t1TIoDvHbjzZ_r6;D3#78{2<M8~IX9q#?V{c7aq*&ac$Zxo^Jb6Y z09I$LSaml3>FZnLbqo)PFA|qsJ}W+S>tuAw$m&Ds2f{kYa}7!P_kX(q-NWG+G`K51 z`tb#%n@C&TxPy4;$79F4;)y4ZayaX4`nMsz_{ERlsc!xL>-Vn{v&(in(GF{$3HonPz1xH zJDz}lvW#+RMP8Z#t#`u%Kz)4s>sw+h^Yi_m)C0hU}-O1yphk@%axcq3M? z=tAE#IqrF2JO`BelNRBKQ~*`3;NSV%y8UX9KiVpZbU?>@Q51 zh__96QL@dGmpQe9Se2v3O=6r3%fmg=XF-j~X~?Ljn%mP$z&`e> z4iRFo3XdKWF&-K=y023Y7cv%emUEQ-oa+;LG^Hq`A?3p3oHv;FXkYSv-K8skfFH4t z@*S^~WpW-82<9~TQQj*nr@ZTwM0%b(zxdB|B(#z=5=cR(B=hJLq=JhW199fQQ2jHYGjSX#wOwPF-;S(OD zoJ@h-T2|Qrz(;wo81U6ODd$_C>yFefSSID?A92bj`wzK888ZLTk7?vr6wi8uWb|hh zANK>hgEKd>-BUf?(!pV#j@)09B0x@-lLiM=ll9w1>Q6b58l)d#_ujr11BL9PtiUtZ z5a^HeGLZ%V;sXpMJxGU^3((~?pyj0@Gw3%=t*=WAeL=P+rYe(^aE{46^S=+Cq7aKO6AI+X31LlEe`}eJoAL1f_zm>sRjd~q;1o=QQc$O~+_+D` zN`oO`^$*Bku`U8qu?PYk8cF2jvvP{&p#ahl08QfKVJZ?3c)$bkCTnn$RE^t7ZYaZ; z%%>1&w94qjt+MW&_v4!7M8mOIfWR|<{)ki**nzfIVzDobbJIpgitwIn>eir)_jwx& zk@dJ8-d0Dvq0u8^^n}q-rQ(Bh)}Q5wpe&4zQt7}Y!%;aTfmum0__N9qPC&M81Xn7$ zb7MAfQ?$KM2AP$TO=tPkVp-m&K?S&}0hZ!q0vpe5#I9XQ47MlMMMcNK_)RwdZ@pz= ziM}k{%SKZYx4M1Zytyg9@y+$|5+`D>xps2=&hK1>t84lt(~1rIwSYkg{?3aU(sMEVnY1UAKl7Ensl2ePW<@WHfbHWXKy>k z0$bxDHb5@AW_CRA`2}=7r*|Qe0mR_x%O;1$7#b;P2%yWEE|_pG_<%=iHW&5A=aTVA z8!}r5cjA?AnVl6DN=zpv6pT&)(0rLWW$boFxYk&bT6vuL?McU6lolKWr7P(`oV1gZ z3pD8~2bK)*EQ=joia4$^rXn!_XLK$!~~f9&4QX4>Yu=)~RH z(1CqpGM4pIIN{$1t9}}juv@0MbZqa(-Po3mTd}Hcim4Muve|@%^FSO@R)`lC&JbRi z-VzR;0(J2ZI!O3=QYfSxL%;_dm{{<%8aKwBv1w~vY~H?~Fdcnj;limgW7-HNJjZOQ z?9v1zT%F)#^X9{`cHK^lhdKypKnQ_ZV^B8e?ZA4AahjR)j~MwyUqbHn^TQ$?gZ>nD zH*Bm+H*&^VoIQI|%$qZoP3B^gOl!6S>2 z%h=~x2NRg?bUGM6`}TFP+252KkK4BGWud+U!Iq6JJ`gdq-G)0otnx3K%tF--u^LX# z?v0hpx5dXkb}Ngznt1$)Eu7we1FQR6aI-!t1)cAGcSXj(yX^Amar+$$V+AK?;wc&i z002M$NklNPQmQ`Q=jZQ8OMw|U#y>~6&q4eo(XpU2qj9D=&@ z(s{g7pqL=^%#c9?^CbEB37lfUOO1kmcPv?lVi<7p1gBPh{3;9c{p4@Qg9a||arrlX z+<3;nULBgSLWb(A&oC)h#ee+m55+AX1P@Nf;*_y{LIVIi06fk~idGB&dSRS%QmyK6PGB$qn(0b;uLosgpv=}#O z3Wgn6x3Q_V7q1AXQMxFHq=8};r&gv6WpjOLOqde!=p$?5hYu}_t1iC=#l$4yMpiQq zsAj|EKa2hY#DIL8`F8i_gV1bM3>elu?)&)7q{HI^?(<)KZW%hZT6oty7Ipi-xR$Jm4}Ij)^my>d*WQkX zgU4dl!qMP-31g^=xu_ckTy62ni)*klKgJ203Dj8`8&>XsAIzg2BjS5McqoQo)bgp% zeUSF`!x*Iv1AtYrYyHU>J!~xV25vkzZUGO-a21?@Bh9aU@y6J=rU|!-FW~K>S6p)G zf|vkpYuvz$lc64rQ(lFTsTI1yxEsa3a~>)b-+HcboG?Sue<}AP{rasC>#52%j5U=B zST?}e3i+rO!MwY1U-|E*z4A?N)G%oj>?)ZJ^M$gRa;pmz3=bUG$Wm3DF0Y}Cs>%+G zAmKACVs`FoCWH$3r9Ud*FI1TGW6qgQJk*u48|+Oes+r@RHF6_~N=eSeJm_26XBel0 z2O476_RV;7=n;40U1845LAiK6dh{$|7j|$8cVFCe<3+q5K%H4-hAjH_x1T1A)quF{ zvRQc=!*|66Z@~cI^*8JB0R&y%02HwhM z#P$}->z!lWMWkyH7g^5Tj!!qS1kZYft6aBq0lJi?xMOBK%0JZa zJmCU8=f>z#qf)&9^jQUDKllcMSuCzg=`J7sbyuGT%wTJesi6L z8Y0{1qSM8`Ao|V)=o!{Tjv+&@G2LbRd~c6gwz$yCRc*qK3G*f&Mj~o=N9>x z2lhQE&9?FY7*xJOOW6*`y7W-=X*JLIPg^WOJh&BSSNI#m`xJhiMi1~78BbwY1pa8N z8%`QxtH99PN7?m%x~iuP=iTBYfl7^Hd}s_PEN)Pz`%Kcw-|Ww_camJ^mFUpLytoCR z{Lno3Gq{kRfmUTeDn}@%Ql7>7*IsOA-D{feJoAK5Dr&O7#iOz;=}`a`8_%vI^i~ux zxPPyhGpi~NA3TF0EgtpSs=zt4LHYJ|Dr&%txED{(IU4$kNcpTE9y0<+OMTfN@>J-~ z{jWqgnRO}bdR0CT$>aUR%`(!FCi{xS9q>qbG*1|Z^czG|!D*^0G?U$+_wy)0od2Zf z>{QcHhRSL4NH2cd$Jw3vOt|e?KlTgnX}2`37pH0r;)J2oNrm((aU5s%L%~a213_19vV(O|ur!;rBYyG&cd#2F`=}o7Y_Sc_-wG{spKis={by3 z^?u^6)r1yjw!~k;65As=!zFgnti7#L9U-}VtPgHi-2nZa@1Jp6AJar6r(Oyrh zsOS?G;Y=8^za2lqSI{p-CR{Ec9ovi&aHg^genXv|tcBG9RS@<gMHLN zs52YZqZT7&=Vr^Nz&yAhe+CXuFC}hycb0yy+fpA*M;hYZJ7&hEOYoZ4s~8j3yLa!A z`0)#C;US$I&R7^%TsjQ>2<;SB>d__dw;x)`+NLoL0OqiP=t+IsS6syp!v{Y9@*&)c zuZdf3m=f1qIW~0x7s&?XFGSU-tl=Medn=u6sz*2I&WCLQ!k!C#;=#-$#Mdbpl|XQXZfdKAIu z#H$zgN(Zu|8pjJg*TGuK*{1NiLU)ti&3)&O>=zO%e?MlEUaFWQoF{bgTpIqg z9a!Nd%8JT)j-jMq=Pc?po&3Nulo@P)1%^o#j!|Hh&m6;3!}@pk#oA?@?C11sPh6Z_ za^0A?_NM7E1Fu122*at7$cwKWWP^1hM#?AI^csmLvdL^{5w-!`uU>gDmc6<;&NS6< z+MV%A*)1(?slP4sX*LAj09>Ou)jo36NMzfcdEm>ramti|arHHGsGF1dE9!8Uzn9Hu z4)XNtg`r3za!Rkb`PRj8s+|x8FB3Yk5zhd&1-ZCe%)fXN2H)e;^O|s-J#>@$X514|H%8_{CndOY3D%QdtBp3ut-OwRyjkn*}9IfcB z^-6d-1_lEM^ouns4`W2I23>Yjj2=6RLj@JNHW!xO#4%`VX=1#0lD1Fs`ctP);N`Gi zT>F8GI4ICJ)~>FPXPw2rVkMY56`*l)}WVIxd%gplh991%$z+HZwS)}M|hGj zhpUC$#DUjLyg5tq`w32V3LqH}~T?tUiw8IjkCwgqK`g5nuQ`;pFBFM+R$+ zHEYhrH@>ljHOOw#xSk%44rWH&e9JhzmO*b2GHAiLxrH!s>+p294;{z(_{1j`#4YHk zM~o^q-9aa7-cAez8seY7zJd+@6Y(FucoW`2hS3L(s)!96kH&Yuvl35whtW4q#sk2t zSb9bOqyzbgJol$wX6BV+S^451UNQgi@7Li?pds$MdmY88I2}sCkf(=E==7LuSlI@T>ft z4}UR#N=+$)RlfCG=nA+C$n6`O(E(3uIMN#1&|}xvAB4tw5(01{-hc~_63%_e-7>j6 zj16YOSZw>hse2D_y^iBBd(hiO?*IX!6NO+WMT%7{A}NXzDXNg_QdD9)j*~x$W7+wW zIF^4qPUKk4l4Hw~Y)TX*c2cAy7O;1s_uhNE7xx0VxVS*xclMkQ07=Qo^EmmHbMN?ot>R+Gqba+wj(!QjV!4xW=tI))A{tr>*g_(h0cxb?d=y*{@|`%q1c&omG8Xe z!O`A8+6N5b-0d*#&9)(HS%wUI1M>2|{fDr@WeUdnLvs%2oLm^DRL`^*kGyNwV!Xgc zrhRyE?8m0M$ulO#m~lh0;KZU&Cxv5_=^S@RmvRfBqyjhdF6$Gb5lZiF-_QJ&BGI;- z3%Irh26GF?!QAXzhdIzVj))aM>KmL-xW-pjuZNp-< zFV5p!hnZ&{PtLot)7^2{NhYKdH)w6R9YY&DAdc28@6Ec**PP3jFf)*5QpZ$Y~>sq{xwPFkU(u2rJU6%-5cmGZfgkR<(av31Sn=tb?gxmaB*#*y% zZyhI<`Ow(;rTFKuRKl^YiJEIs%gKZM;wLu`BrjMRE`IVo<;csj)rO2>!i3G^vecD| z10cBMXVOVP;opXCFo=2g}*$rnWJW~G3;^9Xq}>0G5H zDp#rd)D6Ox-C6s(29v&NTu)huk+6$=hr-nKBHVxJpL040!(;M_X{@Wn3H*&CFACc^ zrTs-7XUw}y1C3W=0B~n*0C3kUEt%RzlndWPHqp&SZ&)sx$WV7O62(r$on8uEQ_w_a zGMWX~<(d`h!dIrYAy`O)Ac~fr3bD!rAQy}vWEc`|ES3(VVD6J2UA3sNJ%C4mW)vnZ z7y#_pasb!Bn_~z{uFEc&l4q?Z16B-R0j+%N&Pt>HO9Lb95a*)4f!pErTX)28CShYx zTJ}URnoI|26jqvEVo1UiuplVRa!`YoFJb0e^RYaTnvaW)6j;(p6@{*yB8*M>ONT>j z(x){y<&~x?3}h|^H#{;~A%$fIekU&H)-5^`Pvg%2Xxpavo!`2Wg%dlu9DjIUa`&#> zA7Y~Y@++I!S@s4>uKn?mkDMR>`d`n^&NLe(Us=hGl*0Mt7bxZt0Q2T|#@D}oKh~>T z;$t7X42$gZaW!s(kQP$lAG*ZPtHK#3gl(AMACI5lw*N0M0C?v+FN)vzq86K+*#yV} z_Cy&=`nUhKe)l3sdE&{n@weZ3DyB{v8DIYLdr^YgsT3R`d&2Zrnb4Zm2hsz;kMCa; z=Up)?KK7dzA$Y@J1m1?LasShug>0|14pMO2nnnN|OF;+G>4J*^z=evPv<+3Eqn$;K zv3z7*!!V^yfQKEBR-(3_oUjm<6HI>73e9Gf0IJRpLfFu=4}v+|?IG{jG#&r56R{&A zZ(WcY*3(ghFrPKZ5nO2-bWZT4LaH1fZEy0aLJV-y)edVc7L*LU2tC#=-w>O0gM_eW z`ZRX>a&A(8EOv!gIL--?0}B)Ut@~odG8ce5*~!;0&SKFs1vhTJab1SFm>6W5l2U%5 zOimm!z;DVAzDh)`cWFb*;Fq${E4IQXt60b_Ubc=tsDqOeT2m&$?cxj z;JW*zmzQ8EzMIMJIMQI{J(e9Eww=s4W1svW8mC^3c&7&cIy_0Ey6rjGtY8=QGtbUT z3-VdGxjKup;zo{W%DzH=IZ+1`sv?-hZ4|LCdm|tdz3I#T!-yp%wODQ?x?IVlxa1@E zGz}JIC|K9Eag4~Oc#6gMOE0g%#lK3zo*Yr~PJWxP${j*kj>p`2FJRDhTHJp7dAKa^ zhlhZ@@gsJZJon6U7FzF#PkwqbZt_un-#0gIyy5!z$Vbn_Fr|0gcMoTozqpnK?v%Ls zeKX>5c7}ZGo4>$SU+?(Z*FR2QxHA6g+jCGtjm{nat!*vDSs1%_wV{YbG5y(#vHI=> zULEvvkHs8Zy6au$%YXDvT>K4&Hx+c_P6@@oxP+@SmDF@xi?pSwQJKJQrE zdFPV&?|=EzxbpIw;(WXeJaGRLC?GWe=$C!RNRBIb@B3$RZry2FWg2GOd(Yx{;J#OB zlN=s@jGcl<55`&SjJWxhnbChxpLq1KWijWO*Dy|?pP{quk8tG^pZZWV?`?~RA9#%Z zx_jJy$2;TFt4@y<2uSX`YhG+w)e^I&oz3wM`(h(*Jco_$8)L_hqTGk_NC92fYO#Ba z1zR_KlMU>Tmm2!I-FtT+Av=s=#w9Gk2FLR+%#9Z4K61?IxESzscu zYeRv*A7Rw4oM1W*Pn>c(>2}A#&RqzjW^#7vIq}RdwqktnB)E*_GbYQ@uXmql*}W(B zFdsOgK>)0L?D&xwKBj-X=l$ohlYS^33+AFIpBIzHO~GyC;OL86OSK~QrTqtTu6ox# zv5MUk^Ilp{Vmv^gD7)5O<@M@*P7k{upn^IZ2O zSmy8AbvWJh&pLMqiwY!E(79Ll{?XprgT9sX>st54xfjjEtHOl%>AlavZ>=%=T+Xw@ zC1gkEA%scrXG;%^v2g9kS$9*WO=3sPz*zXkqL_e@=Fbj6@rw zA$IdTvk)VlX6AeE#n{s^UI9V3bXED2`{&1+4ehymQ4au?OBfn$*ymcV{_Ln~Zf-&8 z4*xsyQeMxx_Q(_aqaz$4lFuBeb+Gjy^}qy*f|#}!=QUXaR9VtcflFWFxpQmJ-e%?# zWzI5q$Y9!AJA6XBXRdJ&*HRtArEeQLs5^!bO$dK`#uj!g_v}5GzIk6BGvY3*kI@=5s3j2Mo}q6$UNfKl{&Y1D26bE|y8( z2bv9FM;iJ8%6XXe+z}KPuERJarJa1p-5quwv(|oyV=rjqmdiC_4`^>Y5w=Eny`a|- z>Y+V_2W72fUe0p$rjyD=+PL$Q{utk?WIPOxD!qEK(@qa3woUoaF+$#!S1j9M^7eQM zNR#|wKa~6eUacI-V;^Ms4|2STY4S)p<{kqFH>EOTA8tW36z`*l9C-Ec!9yrGnfLQ) z#VbthCeeOQBY=7xC;sxf3ddgL<=Mpc$pZ&9WmY2u@>K>GKD_I>F44s*PXyOFH)Aw!y&fA^*TqP}T<@`UhMjYMB|`!~_IxrRLo zo%=E87>+^WaE{E{u|p49hglzC#7zGy{_=tz89HbypatE@69a=L6ecP>+MtL0V_%Ut zqDWOSrV!5E@a`z+*VH%hY{BriFMW7Zzb4w|;b_@^AlsIP&AqAj-kg)Xmwv$VI+wTK zR#?{;;c8DbD+;QPu&XX7BYc}rmJ2#q9*>i;tx0cC&-&~^{i%R$hv%$sca9GLck4n= zP0pt@R?~ps@L_guk(SnxX_Rkxj943S%x4&eo;}DTj|s%k(>!gf#*=Tj<)d&-{-X^r z*RdZSGGYjA4IHrW^ppGw3zzmy8gS|Z4TcOJ0FGUm_q5Pr4&@jyW(;FIa*k%kyUyc% z8H>8(73&~lTyu_R_E+xg>EK+?zRFk(l%f84ltMDc56ZwN}NdrFT#g1W(k zdhXd6pAT>%Lt;vi<>9Usx!XMtERV;ZS`i<*<*f7oFmO<z!~>74jumV7aV*uKG{|w+o9!r%${~9N#A&c39`tLu z2?<)AEC^RlsXJ6-n13R5@j>?t37B-1E^a)k{+O~9I;OXpA?wG zlJ?zN1zA7xR4a2)jW*=xPpTgiudgh!N= zC}XW@DP;*HE%i=*Fc@VcAI1mUuk$$PT~!q%-@6G)0rTM_ShB!R0_f1I9eulPM*{(Q z$UeSY@)Yb~KN`!+@gbGRM|&$It$Y~H=CJ(j$_C$_F*9t?cXbid%T(Q)NuZBue`A%o_l&_?A&|^%_05un8)G#`sCDgZ!YE`oyn2*z zt~KWc8a4Dr7DpA)gLh>^$J7`)Vi>OJ7qCvzRemSO0-lDu_6aD{_o5_U3%v)hex1sC z^$-TMt1wP!kJ;ysV$Ihb50^XBi(XUzLD|0^Xxo$S|3|aie)!0N)H$*}cFgzUC^wC7 zZ1d(j7|#Ryc6G3x+D!l1ilO#oysAyb4gC6e<;D5*YsjU}o5EaR1iOxR$GSD!8GlEy zN#V?BqMUQ*E+FnkAYt%7X*_gl!cbug?X?^0l0n&jcSF&5{&{D_dFPA+=UwsK^Q@z{ zZ|6vXvygY318?t%`|f?29slhd2RAsToY9Z6GEZO=!p8M`V)=?~^d-kRE^b;}c+okO zl_SKSUBLL%iWdRAZd^M(CS#Pr6dGgxZFrtr#(Ho!{Bbx)8gZI%w(O?lfJ9KShjqB{OE^s_L$h);ih z1{(%E9z;$&A?Kdpcb823;VHH>^+BD+a#=3Cvl6A2TZxMs=EP2U0rpKfS%zf=YBuSD* z81Lu_!|n424WGOwID^)w9ihq3{cICyMQzU{og5zlpXQE*z<6+SM!gq2_A z-uZ#+Q_LDsEVjpLjOdoH-iG0HJ4Y{$LVhw0*=#@Nn9N;7BI7&9!HYG0)v7hyQ2uYh zYgbq1bK_(Dv{BK-W=88w)w}M%?TxelH!UC>=bb}1MmV={tW&__ddUbyzrbAC`5md% zJIMgXXZoLGSEurK=LmetoK0R5IQfaDM0332<3p|ofR|$s@5=~L=#@yB#{3!AU`I0{ z4jc+m&7WyE_pA#T=X!J8N`Kcq?lR~7LB^(ojF*R*J9oGX8{AUYLRp+kIVW^^! zNCf^Jf*mXMdeDve-f_k)=d8}bGD=1eeaBrs5>?bp>@VfbGUt;4rCch!jUg=OvC4~% zkWV|$zR&OiDd&07Mt?s%uCp2Rfk z;uv&727tkKdWR)R3!5LB@mAf=e8BaFd<)ow<-PC)m+Kn>#3##Xc*TF@lK7g66#2d! zi&J#HQbLbP!YbTfz6A^vP^E6Tu}s2uo~bOtw{;m(?_>WYZWQPkvN_jL%C?!UiAv^O zuNjhO2$PTWq@kg-#v&TsCQp%JF*FbZaVRv+y0vIoZuk!Vk>#7*0SlqBzHM z?8;3jq|s>FBLMFD%I}=;0AQgrmr||*6#Q*)B!M_~Ft*o1mSo<7Z6al-lZ}mqjFTrj z!L*h@(_+Fnc77=UL2%RsC7-*mb!*$i1ZQwR1ZAwBv?6wA)HZ~K zE0=F$;kzp?zj$h#F?CE9IFS%*aLhpv_}QMs-aLtLgdN>)yv~Gkf8$D`N+V#9X)e-;=wv<(ABdk!BW<}Xs})jP zr<;!pI?G*{sFMY(1^|cg0I-Oik_+Mk@1Gw3>R()qa8684y2J;#F2+`^YGY@+JK-1O zW_nEg?!SE(ljdTLnZ>A*os#|}P>oyQrLY0{)6XB@AAj>V529!qz-}}ri3k}WiJ$+q z%fgE+JOm55yZ-UVx5QVzGKY?=Z~WG8y(6xH+^+kCsl0DDz3-s|Bzj%6o*%8}91Q!GUl>%3x}= z956@=92bvvvT0P3l|}&_$PD8n+3jduWMX zyh!J3+Xh6&%}(110&x!Gc1I(d^{Y2QhpxEzKMh6DXcVP=$z1-kw9*wk;Nt_hEZVqX zD`#zQ0EeUO=p7fcr;m;SSnYS~iny4LjpB3JzWn8`fG7_Mk#yt7d__*M_=`5~J%Y|x{ z>4~3HaH)bTJWoXW^}0*?KqKkZj<9RV(k(F$&j-6vx{gQLdg-NS#c8cWBUqVt#um;Sd+Ei6SRb!t(cBJ?bxWbtba>;! zi_S<3*uVYGGYIep;aYBLy!g_y^znO9;$IY3Uo(>(_RaCYz4PMfIZNZ?AA5h?{;@If zz3)9A_n?d&f}r3F|MV)(vmX@?J}^I?MrnWk1(V`^x17frc$?#!UwZ`i{}bbD-*^v$ zeV6zTe=rC58#ov4oiTjGpm^*N@WQ*mlxf4_LwB5mTfYei^^U|}{P{z%6s7#{{+o}+ zZMTg>KwLUGSyEo7n?{L$G`{z@TjDRjbsueF0`C8=!X^LfiSI0qo!GZ;M=DY~kJ56w zpddk@;TSLg<%a#lL|luVi%Y=XeY#?FaG1VmL#$Yi5_l&{eKnT+?oy_@ zXzaGP<4o+fZtRRd`cL<;>wXh7KWJFI1RUTv*>?2SG#NwknMUY`Mx`@!)1BT_{IIJED1A{+BvUR34%4q%Qg;-p6taKl!or{{#tXgrB1~e| zW;%t|Dm~nZ(gPamc|l?KT4>mYayRf4WPNqepZ6Km8JAysMqG9oo*`b^g0aI-Ig4>h zoIYi8970Lw*kI4Sebe^Xg=@C%DDd6EIY2tyG%K!n_i)ZPoF5PU@P)YMipx;K4?#%O zN?)eJO96Q=gtJ{@;aprhKEH)JLNP+0ch$8hf~NwjhwXqP5uRO!u$=PHk9WtV+;m)} zo`3$C(Sk>br=ENrgS3{IG-X^|%MOcvO|4nql$1Wc4}I9?Shj2vg0smnVZt(9g^Y`fFP##LmoALQpInHif%nE$ z*H32AyCq)ah>C6N_OY{O0LBEPPy`(2e8{y3E_)*=?LZOLJwE)Y>v3hjBVL#@R~;#B zcS1}>_|&c2;iO;o3@3H!ISD0@(W=xj*g5gH|8e}vdgsvvllStrV~)b@oVdahITsZI zV~LZ0C)0+xe#>#3clG5MXjm>b4U})pn>>W=3OC2nsta?m!OSaR7LJtbGA8&qR~3k3 za2Y3s>m0D)RN$M!zCc(loLj$P-Ksc`vrlh*|9L2RhNQq@@BU-B(p-xh?k#cMHRtA8 zi`kC=VhILB4?prGyL891yKQO=8-_x+=m-*ry%+$@d1fuUbmqtBK6f)708qNXmjyTS zwfNw<1>?J?@er|f+y1y61AtMZ;4k|O-mP2T8uxP4$?kpZ+Ds+7bfQesBrkpw5KYy> zDCz`3ag>P8U8$I?C*djJW_FUaQm~x@b#Rgv*0qJj z2xQSgS&Q#nn^2DA69QE{`;Nxy7j-WUB&z?G)qLO(!hB{a)8I>m`Tki~3M`Jozd6Tm z;8ftaPO?lQlJgyIb=SxPH!dQJ;>LVc!dbRlqlgi4RFZeHR&wW4_LI_^cV6b7n93~B zCg+S)>WTS6flazKg0Yl;N?f=sM3mntosB=nyjQ!7bTNIOL55gv{{&jq^_;Jx-r(M z5X-hrXO^jxcBPEQNj?LY?8gc!3BF`2j>6(a;wfHbzHX$_Px#7qcH%OPh6~oaiX)F3 z$~GZ<=qkh%AaR##RRS!somlStrQK>U=ekytpFFOVm36oM4ir%r4K@Fmbm3(VxH!V7s121$>kiTL`@m-!?v zBqtxH0+Od{Gs4k|!MTCqr7tE)!H;stQ@qNn7%cOSypz7*A{~eVzS5j%3QwS;8C&0E zo%m+i3^NTM-&+Kcv0c>bHZxX8YQ99tG8KASA5u9>Wnp~HkA=yIJQ?3)#Py+CyHE=H z0oPYWDc%)+>x$u^Yaz=bKDH;z?^-)|n3KFH(#56Jv+KB|p}285P88lGQ!})@{Ml#Z z`U$vMUwm7E&L8!bWO;>S+wj+VBPjbe;ThLF4KGLBQ9~}46OQyUFVgVd`y9JTmi5dl z;g&WmTlJaOOwZEm8_YsWj(y=?bID$1?cd^{P0SPwqeihV=HO@VH47 z#XH0ESBlu)sya`_m$)qWznf@2nFUC;wSTJJC_zW&N=J6c;GgD2wqxwy;1| zHtSTnYMf%9rIAE83_1K0OY^ebs?^nEN*;N^bB+bP%(XvbR@SwHiX})sDQVro)5W%u zVV0{H3>YVASLMM^CdhbJ6nV(kW&Gr^su#zdWAqJMHe$34>`$-`Iv2&P?qrjefZ2~x z^mEUzV25Ng-r1(bB^M1v@LYHR^zhK<5dbe?;Iap!X*`DE0bn3*-N}+Gzr0D=-NTP< zh{t}hIBvap7T&bR5wFOlGD7_Yx>omg6pKILXtyLtGo-$-2Dzr>z5o8 zzapCyQ*t7`EGse^MBDz&+j^D$a;)VMBQN_*i;}`4!i8%8WRQ8uhhpKCbDQK3FeRPy z8JlMv*Lap^_s-5(wy-t!;#F(VU=%go4&vF3V@{?HU|mmN0*_+i$&S`T?DS{HIlIBf zVeC5V+$M~uFw8s9i(Tv+@sQ91z8V#qHtb=(+|2qF;~I>_PQ$aqkfHrqf9%G{wgq{{ zM6pArvpx-wH2l2a!s!@l9OD?Qz&oQ~Y)!V4$HM3l5^)^1{MzmT@w4^M#S;2m`+O8eDph~S8W zuB{k3jK+)HNaWu`*bFx?R<7C~KmF-^j`QQ#yeVhWX3jMrNCEtmswa2GFaY@{G;}pCn9OV6Bl=d9ifOm&xyd93jbHIDv zb6R}#qvzn&pnvk0eaeaz+c^SYVLbLIhB#x7$HzZ)Rxtn=-A6V`1L1%JSsmfUAh+o^SSZV&o^;w#JKpvZ_dWkUZs35teddj@+C7S3|kZ4 zDE73+Uww0aJb2IMxc%d2ATOHC@e3HCr~HJ7Zv!ja17O-Pnz{SV)p7UVufx0H06YLp zk8>{=&OEy$s&Tb%-n{7$9sr(>h4YT%sc?3@?*pSLyL~2EyiFc&!TWz(K=vxoRD-c# z{kI!lUyl*!o*2PVu4kV$H6~5MJDpb7T+SnYy)P@czAD0=9F)D0eJvXR@lvs5>1OmF z>nQ)xm^fi9?PVMW_D!^1d&P3um&+@M&^>I%SYRzK{|_|p#|RzIOyfu5@_$h75=Mwb z|3)uPg&N;nN>0K7ntgYM7r1^4**`iD`id@TIJ0CWvcQeonPhdRUmTyFKisrb=5O@3 zPP74akT$ky(*ee_tsJq2*An`hv8RuTu^3DB!E1xZLZT`Kx*n*|H)J30`i$_LT!26| zC^_z{Lr~}7c&OpB@0?{9B{jI3NM$O0squ?$!SaF*MKBNk%leObVe0A>EGV<#lU~<| zm-ANFp}?|V_S?}-AWk!!M>t-JOIhc!7H9pV(YAd+PZSn?Sl9GH!AF#=7mWoEr*R$Q zxpQgfV6hl922f} z=t9f*l-57-FhG=Z-33f+BcdO4>dU-R4}Pxy4pE+F`mRqGjj36!5i~fF6%lBXzY3IW1ag>p zcxyZt;dU+#+AanifScg_CM;g`2H>@Q`(a!?ZD!KBIj+Ke>U7Sv&Bc-M3-TFHnu>%$ zUMi>d?dxEIv@OkYR-ltH7mm7cZ)Xr+{(5sf@!NaV{U8dM&iM4FFF{c>fey`VWu%(A{}8lO-;0m#dR}~SfBfe^ zdy;(G<2N~j>c$%;vTMjXI5qySda~R*b{&fc9$X&Z`pXAn#vDj*{Z6*{5T@JA}?up@zTMMUAdN>87NCHm>s$u zlqL<9;YPZ+`(rCzxp*d4))Pxy;x*DV@BonazG%GU{@3{eU-|IR z;iIu(ljpIoqmSIqq<>JHjbdGQU-qMo;#4;$7r8E8BTiLUCEQRxb%N?w8hdLk*#?&_ z>p+vlMS-4kE^^T)8bAI#4Ei_*2% zvrliv?cN*gmO73r{L9$g)e(RGU+)9PrSX;jc3$TD`@j2QJoMl~timtF0ANV`^x=i< z7TAFBs6VdWXLD}dEDRS8#W%nCx9rF~5MTK(pQYa%O}kIhBlZyUwq2$LXPa5u5r=}1QlI~~}u|FLVa zm_Ew6e2>L$3~JtS)tT)0Kbsv6J6VXMG~B)?aqGcuvR)Wx%|4%_H_jP}tIh5);f($m z;Nh7D!?Y!wKi)}4sKBO!T}F;e_MrpV6+Qu@A^XfGcFiztpua@PM?-b@L+{@Gz|FZq z2a5re`0R?>xoZ!`8%r?s*~3v5v)R?l&SZFC<*JQXMk8_IEW&QxdND@!fS;Lrpwk$H zaA-8=s14*`(hiJZ7QD734iMLVuM6kDck9z0=Up-(uD$*u7JNJ7$3K389cV-2s_Whr zYy!`Pl~%MnH}8wrpIsVzF@Wd+V2?C7=fbHmdFC)&DLxwuUS1Xd{5L-p@4a;(J0Iz@ zT}bfncr8!7`tp{z>+j~WI{+gN#*6pdbWwczb5nBcKg4A72Y0@}Vti}X^`uF|FisgB z=bt;4cFGxw-+VgeLHBE}yBwaL#O~BGud>5;C*{gj``G!hDCW=G1dk79g4u>gjH@`# zf^!lPa;CBeTDmFl!G{*cBM&WMH;lU(kHeFL;xnJQG0$#%`q?G%mw)*%!j+rZy)p@5 z(u=Vc9>(EAOrAV6ZvEg{7{m;ZpZ{zd=f1vzP{gBe+Ts$t2V8Z{bPOEU#T&0Ii7T%- zgB=#<(7(|3bCO91U^AhP?Gv1AdU@|faJhJP-1oz9nely@Eei&5{PA)eHQYI&b2jHr z&W#)^_;2J>;_{t=nIymJIHFN-s75Kl^T{!rn<_iO6ukZAlhH`ba0*Se_-4Uv|LF^^ zx?G7LbATm_cOwj%AJ<=Z76S6I?AFC-h4gzl-}#l-R#V4Y;@#I=kVY1X34k;Jc>Iay z+1WM?p*h}lFf^>z7+LO?mZS0N8@LR8;T7C!UXS;hw;BM5>oyesa}W}4#uLCtKYBAp z1{xz492YFy9FIM*7`LC(LXQ*0g|4Z%qyx8>$=@SbK-*@t%D0%t%ANlF_G0dBJi~Lm zrvBJ4Q|9vI1rAL7&r4EOdXO_62r|)y7|t&BI6NQ)ex}Y2HrP*D_9!z$qTl( zoJ$iY>(TcBsrf3WK7tpvUkQu(6u;J|LCH(RF&}x{g=i0i5%Q$%`mnn>$xCIiaok0y z>*@ltq)YrQ0GGNNKZ!T^cp=|N81ATc>`j^w-Cr+p2Xv;%8{P@ckBWg*>>D2)MV8la za4O{~VdCf|8mXtN?gf&#@?7WPvzPINS(n8K(yq{4xFw$7CMh|Tn-1pdw(WGcZUipV zskqe0&0WRVDr7nn+UGYe@9SrQR)7;Pb(X=f}Mm1I5uDt@2A6ivUkpMN!2K z)J(j=K|aYm1j4K2L8EYqv-RbpZOvUi;+Agn!B53iwqfFkukGEs7N$66rByJJp9})s z#F+OAT8yXAPaFyrFfTrFmt4B+b3dmmhJLK3<3c zlCI7Xk{+!0Qqi0-2{Qrr?#!?cRzR!4s#o3KRKD5P8H$oN$P$wdt|2W?1p*$S36CN#aB9M3~w22SJJ?=i7z+yrKMcL zsOVAA)?M!6ldir&R2hJ4U3oXh9?}wLE(yqV~pvggL0%iUVvYDHI*E`ByNpQ16N^E zR}J2_->BlYuq*MUmo_qAWd87x*?2J;jGV1zXf{^tK8PXW(lh`#^UUdS#igU!r43(@ zi8yHhaMxY0GPmA@Tko^uB9xay23N8^P!SpF>CWUQpWPLYJUTyaeD~D2@=^>1bX_YR zCtu)iyWX(rV0`!Qo<|wHfqBiX=>eb#V_&1&KfUOLzK2Rz7KdO9$F>0~|B{8N!IX_;*q8XJ~;PNS=hk3_qsu||T~=8VW? zf2=1A=N7h;Bg`o@H1^{P7Snpc6$`@#HCj9e50S>4oj_*iRRrppUrZ(%E>68^zj|H4E~^ z*IwR>0rVc;xkG;|3i*A|=?L*=#Km}c-H+Fzr=D7ZVfh~B!4r`w9LXKNhY^sTK4Dx; zn|3;D$1NB@?~aM=t{*jWGzJITnPacRi%9WIbjI{1yy{(!7rNdt=h@X5T`#1*`p4u+ zQ*&*+X%lT=$2JVxhsV3FnZ7RE8t zX&VF574)V}9r5r(o8rFvUx6OSF#wnm&imhZV+HHdT``p-7p}b?FLIP|@xpBwk}ru3 z8##|0S>l)x?RWsWByRn{6l4i))XCxa?%yoScD5hoNpNz zi;DNSlgG-sE*ifwHF?;-$iq8vv;OUG>H%O| zeC*@X@enx~Zw2rnYveMTl=zMG)r~l`Gq~P+*Sh$@cUNJ&(l0*onaTjb@rJAP6QzBu zT(KJ&)HAVUL6^AY1GD0`kI6<{F8}~Q07*naRIp2X0{PI0-_oB|dHkdORAqiUc-by_ zueaJY@c*)98)6?arBNeCBDWm}Z#OZ1(&s_@|Lu6b9fJSMVHUQ&s z6ni>S!Kg*i>wNFcnb&bMYL4SFb_bhCHqlot!gJ&1?FaDyIxr?oIt^t$UU4gLCgSb7 z!1?ulymPHzw+lJX);NIonW3Xc#2AdE1`O%V23f}_=SP&4kMjC1bmXiY1VDd{=E{c1 zy*dFgvTmKf8`u8awjpx9O}!NDLF4}83>tY982y^#r22`ROMzU58%Ey3(;z@4tnT;C zT0NL^80B~7qy9~WgJtqI=Wvdd{sBB&py56<8SY7*{n^|*0L83xWXC%_IJ7YbW?vGZ z%eo~!QduV2p}G<)yvzc84=f7TjWI@p_~Q&n?J2auyB@emFJ0q1z-HMrgy7Sd(-G6q z;s8{c%*zb&(Yh$>MAzyXhv;P}d4?$BZIY6T8k2O@8WY=-EVu9c@T$zMNRZwo{57%f zs&d!&sZ-;XZ=LI>VIx#^ZqtQ%hMp&!+or9cyhWZFk3QKdcl~2Kv_@(J4^+d15pKJ% z9gzF>X=?Gm`pKu(g2{WQ@~kdK`}jngRkkGXIg~x zSYT$BE6WFDe(UuLZ<5ZkN2U`;(%0=xz`0h$gPO-XdBlJl_XTb#>UQXSb=4va0RHPg zFCGBydW}(@*A^t19wstlOK!#5M3N(jWutWQWW^SQN*vve8{dNT04Xb?L*h|Go^5#) z1%QoG1*Hbo=}CYzx*)d_C5V^qrepw0NFFx871Yiy3Q&zu;e zP;}`A)VOxwx{5o9Yq|rtwbLz{pe&nbTkgk2VH*~g%_w_YVT55=U=ANWiq3Wb7N=C9 zlLd?I7X{H}DW%HJFDu#y-ifb_EM;U2BT)_2uYC^80^y~d6N7wVQtoAdJl_E(k>6wt zJ5A$BJ3D>22?Z=?oxQRrevZrQeLL2&BlXPq-G6lzN|nsX-0~77Kx8>LvfJ>^A1sag z?wcQ1T{S6w@Aoc_5n4xcRcPjYoi-nS$(M!>?d@G~qjfaC{*C*vu-qA+_~d1r$#xC` zYs>LV68=vFTPH5;pLuRa{22xSx+eTh-0)v{#TYEm|JPvK=WpA7jN=3rqu{tV&S9bY zr7wLb&N;U>0HD6)L-2K=va?yg{!o1X?-s|McfTH&UVnbv@x}9^D~g?>_%97E8{fB&)CYIBeG!J+rrTL)>fTCsnJHLSdXa;NgQ1nd$2|FwOj+mFGmMfv4X>6LM3Wf& z%jx3iZUlGz5R~cUtzx+)T`HpI4{gkf2T<F}uHz@+-i3;xG&PMRjh2}En~xyC*c$UuE-LtX$3?T*fjuD&ilh_&<;tx1 zvT+;Ocu`0AHU1TCKJCn&6xys;X--c&` zA@TVy+z{tp*c0pgBk@Q7{%+iNkBRrQbN|JcUyqfm*ToGto}bUnxYxe#$BW`;oGCw% zV?F-x%eUoDl0W_9`zdR;_~d7B(T@fE%P(w;d+&aO!nLEsd?#3Ti*J1OVFUw15y!g`Z zT^*Arxr^FXD38+?=sVV~J%Dl5(zx^c^JyFX!D}45Z&$>~k;hmZUxCnKLiWA)-m{ec zf^+Wr3`DrGl5^z-vsgSY)@@jW5MW=rW?R2uF9HxIbiD_nOdX9I?9n+!ZQit+EL-C0 zYfva60GZ9Moc=7D2XgF6JBye9^dBF<;9xoK_AW!vGCBVAPhY}C?H-N+xGLU#-DH%- zJL9|Gc?h9`3w3uqwxe*KihyPcE<+v1IRt70SqflvR&RWV`OAa?v5 zVK?)>*t&jiES|e6)~wiy=YpYe8D}isa{CN+<{XXruP?`CC9#G62)B$dvTlv+QM=kV<7#@qfI)EpSIjNV z?$C!{G59&w^&rLzr^g2nZglCsKfe3j7nnaBdjp>PDL=X6&g)!^Jc>2lJ?69~d ze&e4_#l5$#mmPx??slO~G{+DAeqQ|SXA9ER`Bhg>L%?xSjKPp2+qBrwptV+i=Gisz zlOMl%byQ3XaA9J}!{-Z@q;-4z`NyU|XE;|T*p znDyirQZQJ%@^mjSkaj$somDkvgXU@}>fBGb~plF9RB>3kcs;p)MZsG79&?%x;W(gZy}9U)TU% z!X&KWCogI$Fja)|*cA(K@p;S57qBB|NYcctTicGs8@ME0L!Wl}C1<7woh&!} zuzq6)28+LlS&XCSpF0JidEW+2OnV4{`QoMf;;A_=#s_b^oSiYaF=PSL7#+opc-wb0 z$1~3?&Ye8B-+oiW06^@P;qLU|pUq=_I|ak5(~8j^iJZsQg)e1i)XX`9qyCAj9@*>h z)OYpJoxP%9Dui61h|rtswb1ZHyo4^|rsd;pUfg7`nN*i)6Q1#aU*>QH$Bdg_b!^{r zFWfrF^z}WzZ;GC86e3tY%aQmHsq7l|b>RWSYZ_#t>ML>MKFetNy{ZgPewXRRfmkTM{&IKRI6BSMN^=H%uV)uP?dJc3s8KGF9*E za@F`&QB0LrjZgjTZ^rS9k35kuPLAk1p6h%X@vAr`PiwEh%3vZ_uM=JhKnN@A!aCCe zm+wa0lgs8jKMm4(Z(Fr*vmFb!G`-}Q91jxr3Q$c0BR1}RS6vNW^0|tW@wm5))_KCK zp7}{Q2IttrO{2bfX=?PKQ zxHYcg(nv~RBVHyebjtX~s$Tk>{Z}R|*=E~I97~!;*?8?$x5dPX2SL?&2}bmUkr(g9 z%RuRvp*}aR60f8&j(9s)DiQ4SGC5y@OuBNPbk9V*ufhu?(j^RjLCPq3HEs$H*_Re< z2spJ28DC(esj?_A{I1}Li=X^5pE|t4H_Ln?Ro;~}IkG35G|(hn@`X72SCzX?TIX*Z zFZ0Q~YW#Tiwl0ddUZ(S^Q7lglbWed%zsuiK5*ku6GT3_0-;7wk8qeN%B{G(&+~m0O zcIoPb8I3Q2o7|srTS#kQ_3UlZ+#th9CchYFJ~f{iuX^om#;XI~!rQ!V#sk@$IU8_; zyeU3-%k;SP;!(_B5LEjIpzS+a;>o8L$I3M=an9LiasD0{(@fxuV?Ofs9sm?UY{7u_@9umR zm(Hv4Y;<#6c>d7b#bwzvID3T+K=(hq0>h#nasBmYvc?;n_+%TBrzH>ts7OmHE`st$ zqVb>ouK=q{l|7N~5PJ;73 z4XiL+a{VGai%`?TUrt29V0{m}XxTx_QAe}R9KyN}8ZkI&v>-t=64=3US3iAdWjy)B z{1`lBNWA~ni&!Uf1OPHbjh;3$7k*~W&UoROb;t;IA@}TvS!WMnXZ5U@G-(uTj_vWY zN0;E`5bpxWYj@z;ar0)5SBsAHn&xpYJ9q7j!Grt7q=}>PVs;Ske(R7!wSu?29IWL! zao2ts3h>d$emhX2FN{}S+J;N+5pmHali>vn+UG20hySKfX@2=-XT^2bjYn3X{H(~b zC1)Elzf~M>_w1b27y-b47{8x){#h7fpUoN{7v$?P!hT>CF7_8X(SkFO4K#7w z1#&Ca_qToEIy_zu!r*s7y!P4x*4k6?jCfXDebo@wlEIDun?Pj0@52~wZ;S^XnooOf zVe>&#TyfdOsaTsok7HzywQ#iFnRrY<4uCg>r{*kYGu%#Op2*gF?_-16h4HCR%?6i) z&;|pXzg`h9y@p{0G6$Beap`3vBwZ7 zs-{zq<<{bxt^%gC3)cI)@c{7G-&zn4-Mbm3{3JFxcswwM(~1SFcK9X;`6w9M+r#&6 ziNF8OayEsqzNH)&AQ!TnCnxpDqNPiA#Ml4gxtRaj(YS%*4sQSWBxI0-Q~6w4&fDPn zb{YR8g=Mdh{Yy6tOYj7W;(z(djR}3igfYmm#;~)!Peb0B4dNdu@BedPtR*fws^pvU zggyt^;)3{#zBlkbXVH0RC8q;S}S z2pz*P=ZSpO6O=V^V9re3)FPh$v==|Ydf zx%G!pS{|j2fJna9GeEK^tap_4x#)pr{-n;0cu7ghsRsa!1~dRTj>U90?p4UA!2@a4 za=39>EwajEUW+C8k`I5DRXX@l_n3yNyz@CrWSx;l4*+hE%&@w=bq4_sIR=A| zz)+`^Re?;LOw#K?&NrOs6JHuu1bvS{w0<1xN^Fcq+Ofj&r&W%440?9uLja`Zk*J-SEj{ z@~ws(@{+nVCn)N$ETf*R^oZIWot<7K`spne+5sLOLodumW1uFlq6(rOc(7a|4f%?Z ziF_xlsyCn<^0kfdD7a?Xh@SI7;99p?zr^t*oFWjbGCpmJ5?bD zX$?W#;?)60B2JzQ30Arq_k|6~lIZeY>=P!xp3$e0(n_=A&_%-`CUr+~Q`~_c-Tk{; zqOFCq{m5+~=U`}Mn~YEqM_hH|X{V&(%EqChQ(m#N8a-+RgzHKNjj{kY5XW(qJ96x3 z6d^;g+9tjYR!ZiFFVf__3@uT~uXrs0KCk__Yot_4R!2rpZwLTNfveSI{#A#P_-Q5L zABf4oWl>E2+$SwL17^vqyW?l~ydL{^twRueX8hjoUQ-zW$dpxqOP1LCO7JAXSj9({aGT=AX@<0D@~wYEpF%OBX!T=xa**~Nd?f=|XI|zh$&GJ4 z$ra(4*7a3%OLNHaihTDvpWuUH?>?WeLZJAFLo zMi0kjAOpF1d6}(k*E8(auGtbhHgAkEcmS9@VFWJGT*TA6VErTH!oPJYe*sb(08j~~ z2&FtptjxqRcf|_>E|a$Gk5%io#J1ggQE*Pj@Pl)&=?`q<5+G5sUcld-4r{QoT!Gu` z!-v~q;>6)GbH*fgYo2t3K%zo^nK7xWG8z1T%Ox*q9k`FPq?WDN%;Iq+3fkUSiO*yq zFcNF`oVuJ+wu-_Pb?cIr(84p+7Ic&xhPq2~D@xS4^R{7SycOmC_E?D(_g>D58#ZhV zZKfCQ^akN-d}8jJz^rl^2e$_0>J1GAC`#(n^+#Y}Sm0RNKca359^uhSUKYWM@dM^wEW?&J&KNc-m z%Yc0hmxO)dpM35X%Fu=~_P@lx{8u-`Z~W5>QOfttF~d^ZtT5C^aIg*|fjI~&7?->C zhmIZW%5I5&_FI?7^*2t&NUBGC>swE=&|k%vgsVK-R{y4Bar+&Y#793q1*IUK5ilCs zz71FFFSc@C8OnAH+V(ed1~mEfW|G&&8H0y7sBh4q-Z6BjuEToAh*5oU!8rwQBm?7~ zAI|~*jVSyt#W-MgeD$jfu^3~N@+F~U z49eS%vEIusZf0k|qnuyfj zb<<+njFDvRsL%yhmF@9&-+3HCUGJDaV>Z8sV$0?=2waD~!jJEhCgKgUc9F!_85%O2<3E+o}6k;FPceTGqAj?GIU-sZ^3R1I$nwof9OiQX$;EUk9A3%KY8ukc>p8ICG1Sv zjiJYT(g48eh1a4b+nL|Yi!tNRU{}Ox%$3PF`L&`8NY;j3CB@r)*JUkf8u=SF9}3M~ z9M*M_DNZDN8=zHO(r3N=iUjo{y5v>oZq_GdQ1MmH7${$vZ=V!{s1>RwaH&8QC>1Qi z3~q#(jzayzG^)Xx!21fG57li3mzQ)$H) zEkEMv{EK)d_v@r9n_8*NDvmJ<%$ll=9O|Tks_%i-cz?=W34L>Zi9`bjx1+%Q@(0Y1eY=!U}s~1_jLs0zulF+ zH4uf%m57wv@?Fvwa3xMn|2kIYQt?3rg;(Mz4#p~_FLmj2of~DU&@<{Om{$ByV*BlN z0(yBq5mu+owr?;2=2CDyiFS#TeGgrqaYTx+1|AJ8NR!#sdDb~pIh&@wt$y?8q%_JW z-X7MUU4zIJ!zN=p}Fgq2)6q@<2%Fi*iQQQ*zCVcC>3%>c( z09ndk_|Rm9(&CgC1obwfH^QpyOmtG1aWZzf$yAvRm~~M0eHpL7tf`-1GBPi#tE@+X zS>aTNzwK|02QN#W1+|(V@+lv9oAf<7GZOob@Vd11+fo$*uS1M_;{L6;)I3`9FX@DD z%o@7z>Z|Zgc`{N(kyDuI&H0(WhFQZYzgZdNym0GPyk*7!C-Zho=!?4o1m?bd8P^ih5 zJ{!(+2Ksx_WxVQb32nr!>!bu1sD&>|ip+sv5vkH-ecxyy&o^TGd9%7#E(L+TF+uGX3oPS?>vvU2cBE$_h zDR9;zpvH~PSvjf#_&&%Ch7KDN1My6C1X)W@4*-1VmK5*N`@s3OIG|@-T5E@6f#r;27ig&Ty zdCvU^&d0vty))z58%}4f*clJszn&fGTVfbHVh0ZF7i;jaw_|4;ICf?2c^YvJqde+B z)-WDLUN@BR8&Ghw)?%I5*2+6})pqHAAg;UNqWJLbXCN2sg*-s7Y8bYx-W=m`i$448 zX~=MU#F9lEp|)}@%G_>viyV!2iOIP6$CKY+V~y#Y&_V)?)G(TxM;)p zVGthNrs93Bi5>pSG05E*rz2y!^omJw`s864EVRY5Pp-mP0;OR8{>UnN*&Ng;x^{|JJJj6vSoYI)9th=XR!{P#>Rtnxe;O9xKVgjI1@g?h~||Q z(0&`9Te`5ZsX0D$>&1ABn}uAjHC}&34*<*Y0I)gsvtIAnx06jXL*f&k@OZ{i$TZ|X z)|0FyzxmbI;^#lz1#Xk@usAs;PwS72Q^r*m$eJF5eHA?Y@IdJ1t~3sUfs)5*%Wdpf ze-b(DkMCLu&|dMG&tV{R?dX*2=X|EYpao{*+r|MO+784;Z=Zkj?WMq36F1#lj1eYI zR570n*+_QsO__@*BaFEJ?)CBgzh1)ee@Eg&7!O=^^<-o)8fIrJ%x1{uPUKd5NTlbS!W`9;aRtvMIfsWh(z9IIlUMiE4{!|ivdO>8=>tdEJh3}gv$3b;P}dmBv6y2y!ekJJIO?d3nGi|jCbn%m_F}ZND>s20N69xD zm;YnXK{YkeZ-f6)27*)`V~Les9_g3Wr%8ZbShYAm%Z-BIWIqe|)O%T2^;4;gM*f!T zyc{z`9sqm`IJ` zZy^#{>yQx2u2%(>##v_iar@ZBk*LPbD+|Y6=2hTlv9o-@;l0^AZe~s=rzH<}`zNn6 z4LJf2*w>b$nMgx9J=TqADcb~j%0(EsK;(qigLdFC^6H&C8Ap|z_Cw*XH;>*bt`E8jUOgar*zP2v_3S!JhXEpFTghR;_kc)( z@ar6*D>C0saPK5P%aa}x$y5BZu7RCK!h$AP+Ns-{YxvBoRx_IMed|{Tn zlTSg`?8Py82h605{B#^XE`5GUtbABKpE77${ffEIoiG6S!D|PyH&an>8ND(=A}zBD zB>&U0!O0zH5I}qh0^>;_mELAt;80-#DoG(KwG40(wI@?ql_0XMn=5d5*8{~tdI#Y3 zv7=qm_0!JHJ5Wlr(kPCnW#iBx17R4?Y?n!NhjEzajDpod03(AI7vCbtWfiqhjgLREgB^TxnQS%3zx#JL;<9N_#?|cuQS!>V ztL}f1R>83@f8}M4evEe_t_*7RuV3F8fBYxU zF_}FQpZh0g#ub;3p^knfz_+|~AlbG1SUmF6mGRgA{SkJjPej>wE4wVAIjtr;p}OFt z*6rB*`8(n}-+djoberRnYtO|1;5;f8-lZOCC*VfM!%fz+HB|AtO&A?ro}<(kj}a=~ zt$Qtl+i=0&PNz}M^|5v-c~wwd4GBY<<~cF&d@Y=iXO7ch*f(j(M%3gV9+O6P^j@yJ zgqK!AcK+~rZ2&;m&r1p^KZ4br4SC+n7W zN>Yo_&SGpAuCh0+*}(n57%_A}Orp(vk}4T+I&I5f~0kLutbK;t*FVnWp66L!mo&|My(d zA8d=~gTuI$+JX_ln&cU+V`t95MI$?_>2B=0v&@C|Re%1LlG>*c(fY?_&PLqKsqla8 zwKZ7Yva6rPsOKmT8Z;=TpD~#ot&?Nk{GC|Z?uhr&UtM$&JLI<>Wmo)?c>1ZixZ~-^ zqIgPt=JOYzEbojj|HlUrLUqQ(iDOtO?qqSj7x(GsqOd+M7A;;MfA`(zWB0aB3=4Y3 zm;dy3tZ3N*|A!CY+U#I_kzMOkri_gT@12Jcz~byb&pLM;JFL%)2kv{Bx?UFl?Q0)q zhsf#dy6+PI=HL7%wgBt&(`Tf+xYa8+QN^9`OD`{*GSy(-+S+d_}+J4L&3d|w%iT6 z9FOa7m=d4+{KXhx^vSxRwPzo+Y9;Rc9^J(b-qoCSxrOq#&<>BWi-NWU?;SX>k1-6d z7wmNCJa&X#!b78H_omo`;6N9RAO6S%EV|FerQ!Ox^Uf!*b{`b~{C7TxoB1xBsrOPm z^VGU%W@mfTfQXyle*s4;%*vtSsV6qaefPW&Z5{1##Z9y0hFi~Ofo~OKIg8-Kyq)0e z-QF2<=u@Bj`I6}07dL~0dm!{#9s^h~-Ta=bW74ESSeEzajK*H{LyV`bozdLf9((t- zAXMnU)!<-UG%6`*XEKSm5zLp@u5Cf+uoGIYWS9CTtfTv5IB_1k63$=}#F$3s=g78c zywK!(DrE?}^yDxfO3V zcVKWa7y|(3PQ;~ibfK6nuIeA{q@B>NLx^_g-@lqI?{|LZN`y@qVPrRC17#jT``gCu z{f!&;^R91tlYpGWp;3xQHelo8evY^Y5V$zOY{K=G@p4EY_w3G@q}i9-@LO7rBUsv# zXG*^G(#qJkcR#x{M#Kj{a$#I~)zrji-(Gfj{a_yMA{WAQLlM9YXTiObv9T>~dhZP4 z&cq35DDfdm3AVm0kNptv;3wa@`V>Rr2)W)KkyEAs$n34X9u&{ zf|1YjFJMrzZx3^~OXz2cTT4^#*>?;NL=VU4kptuMOV47iG9(w%i5?LSUim1#)jQ5iXuS11U_BP5=Ac5xm7P#XX+Ey(h(UbjCUW!KfnF_Y8#K!1)%VPxQA zN%+h0t&HzU9|%;KbI0?*v)yab+PDWMtFq6tYbWxi-W)|oHrc1O80w91qB<<2}!$jehM z0sz>cMIk^V#>vr>M+~UwR!UJ~G>T>}bt2KK?+fM)xHXIuk%jAP64-a-WtpmS)PS;n ztJnTixHLk{yh>u$)omkQTEL$i&i#pa#!f2nYg(SokB@7(1P1)5z* zCCF4nHN%XOzkU_URB7vXnQtQs>Fi)jY~kl!g+sl@5voyK>PxeV#3g#htrGgax=wBv z8Dtdc>~Hmx;V0djhoAa8>$3)3UL=fUnL0e|3A| z-Yh5(m;Wk@46-jZ%+eQn)c81eEU>NRQqu*>TfW85xFtHT3k)AKyna!Et}?2?)PX)a zLv>DdBCKYO8fNm?$?s3ew~AHqX`Op1v?UO(Sk;J@d{P;dK|IrEWoX6!NlTEZQ`G5e zNGB270%UtDoMdkNl`Qhz+kI8d^AwZ{o^KcX9}06G*agLXGoGcE;N_|V7vSeIf5B@P z0*)*LU(FbjK8xY)qGh<}o<1dA_YWHa-FYW3E5G@{59gp<*%8-pOxqhIndG_T zF$@4W7UA(ZJL2I-=fzFepAlDGUV8wj3vG@CsN%7$I}ULKzzeujUmJJa&Jh550ML^d zu}rZFPi#MXe0^+0c6aHetZQeE$~kr-4j~nMX5S-NQK|k;p;w(XQM~fe_|=s>&V3_V zT>%un{PB`Vjtv^j`kSRlp0cChWBL6Eg~z0<0Qtx^2@*nD_sK^2t{^QZ`QDF1Q65jk zuKRuLdfm9GjrB8%FXWbO2U?l`x#m%@qayS`8juUmtCa)m_wL!x`n{ah>=!;>i$3vVpjzwek4RUPbxc5AS}L;J$u%8UVDl9*bvj{eJfkG0a}u zjvVO-YmaI1?)OYXk<7XF%bVk#AFYYS3-)k?R)6xR?m5zN|K1Kf2=s_SL;B}#$et+F zhYcOXx|5A!$c2Xu9h$UQvl=gTh@Fq)9dO*~!`Kx*8wL0f49&Z+1AZ-v^aZJa8-M!g z>};QbyY#-u0hrIfG8ek;$K$|A4DTnv`<&l>I?6?4C;jkTpc3lemN(^+Dug&FKl(HLo&d zm6zvpOu)baeOV)~Lq@fU_10k4*F$M%8(1HpaK822G_-$?=I|pm>NCsbhl>pdXAOtWGyg(HCvxpy=G&qUcDQ7 zu~zKU79YOto$;AZV<0i^KrCO}1+Q}}<0)hl+xHztF3^cb)!}#@yg07K007Z?^6Yv% z1%C4{UWw=D9EkVad`8^bAAG^H_8ZG2)1bpy(M zx3NxMwQ^nT+_9S@DEh`36UWAAJV)cKlD?G=qMAEf_LE2OLa$QyzH>fTsAIogdi=v2 zwYeKZm{lCRu%06|5JbkPv13u@kB9*Si(yFi|KdYd`|%LD0S_i?)^Cr!9C0}SuP9^b zQ-`oQsu#-3Zr$mjQ5YUmv2GuV(l=!pbm)$`_UkpT>8d_!SK&KXZX^^>bpyQVWVfT< zsOx8G;=C!neDhufYwl_%9}U9X_|k=Z9Sa;6Qb)(&lVh0j6cw+&G%r56QJD8d58*ok zMUsZ?pT<7eEl@8UL5f#UJ%Tze*bk}vKTHKtg#4J)flgf2Cpte>L3>mK2nQAclQ!#s zcQp^EzJ!H^8~w@|@n{E#DxKVs-GxslZ9oGBmCA``GadZxV$k?RWJI)^E1hmuDsnYp!OxfZn8GJgI3j&$*}@7o~}?yDI-9+nk#~Y<1CIiK_&#etDMW6pIf=YW()Yc(pGZQav_6 zgMtGXmmOgKqG5HD%`^J=yrniVJtN2P;v!pE2SNt-x z;E=Q-u6n?(^e5fXJxMY|&s^%(_+W%W1yGmrA#)=Nl5+NhNBQ{8P2upTd|2y+J23>2 zPT4(io4AOAXpyIIlFZVWFkxB;mLYYI(%Q%XDD6rfrJTIi1Hj$?wekS)Lks{cR(CQJ zune4veUP@`7Q`zD9d6B7MoPuD1fl?1N4Nu8=o$c+#PbQ0e7;wULU1tv02uisWh*!$ zrh-%@s0fNr^PbjNw_+o^{}0EI{(WK?6PI!0hjD&#KPuHThshK;?MIHF{4dt660k28 ztbO~^`MNzYaVkU>EqCQfB-%{6yIqX6WeW=E(c?$Qh%v*-n2rLx?R0eE;5`1Q6=7M( z%Po^WJ3u%Bs&N(N70Ej>^=S)!)gJ_AOf@Mjze+S9-de7RwWqZ9o z>rKuNEMO8~~ts=JH8_kPqJHk99i15daGbb@bK0c@zUc8|Tqp5m#S57NK5)BSC-S zRnjCQWLYJx%>if(hY@eS*%*KH$FJhW+Zw<8OP9s%oPFKLoofGv3t1L>_n(cYpI*nA z)=$R;GbY3z{O@r8mrqdw+fo$5ot!;~X5t z7~x2}nkj`4_!mW&$m`&Op$-Rt9MtIC4%9~pSMAv%Iu&^yO%9qQH>!Yw+BVf+CkHd+ zLG~FK-AEV;JHyt%R=nq%k9`MFz{0OdUKA^crU#k=B6sbJD`m@<{_6xkIY99fjQNxB zYILv-D8q%MdF+P@cZF+r1fr9NtgGbbQz^luopkW5Fzk?dK6vByLve85ejFhP{Y}U; zKLhBSdihxl{{@g9*cNqcG_65^$ zdKix}8RMWl*j}9~Z+Vh!?mHeIX9qyTrb8L}Z2p2q!p1k^y?PWm%Fgtm7MdU#Jhfd-2V?R!|#N5?{hZ3@as2|ZfN}e?>~iu!IAid zU%UpR_mFs;BT`;|eqHvJnX^W+AikQAfollA{loa`-+qR0@}p3ebc+Au51xqm@9bfL zG?KEq;COI|c0SF*p&ljDT%v+(B}~x9_|jMI=FGmqOj_x)l7K(Whup=mG5-3?^I3f0 zc!qrM-lH|Hzj1Q>;xAnp(>Z3~C_!}o^iST5CrEebAPNc$ZkJy^EI$8*%W#AkW*16& zI)72+Lf*l;*rczjJPeswd#nn_dl zwse+IL391}(~;ARt?<|$+F~8&AFky*$R-qbM>$^S3}+cmpE*1}{t2SR;BR-9$-(MX zd*iuh*P<-hLz-hKk_N_A*G%BNzfnXw=wIu5>?~aYH?DB$uY&W-FRa5+?yk7uhF&R4$^^`|SFqaW97}2v38pZt;3{@( zEMKvM<0q!W>)jkJl2=L(bqu0EJ4OHky-3c#l$h@1unmOCFHqrE3cVbr5{7(NCggmR zHdD)sT+ZXxtvwhoy|{&)C;MZ&ZaFcAQ5$2o?1LSZv@?d^&mJhwDP zkDq~K)+o*i&7A(>5|DgY1DMc+c8J0`9@cb#I`$6SaA)^VIdEax20wU=7MlQKF0Yp-)h`0x3h z5DJ*u8vuCU4#%4+L3!xk@~e7YvPypEVqWLoNSlJY54|f3XR2nM+EdGC-eqSg5WFo3 z+5w(}n;HMvKMCFZ;^h||Pnrm$uu2VhjR7n6sXa~DRe3co$!9s2Z=}itfk4qIwbZdiOSo8mw&}MizWTLptmz85+Mf!jmP=3_o}YXA?liUXT>I5HiF^e{Duz4a`xC%bpxaBX{YVrm z9K5OJe>a#aSBFd_OcZ!z_Do;PWUBnhkJ_WE_}aHmYp|*})g$3m&-i{nR_*Y*{Om~2 zAA8Az8qDM$em4?M{n=;M;y8OCKK7BBaW!GQ(}7WJ`QJ>q^jBY7$Ijxttg9;r0C`VP z8r|A(0ChK5ZzK;GT%08n_VQ*2~Tssq4w=08_nH5teDp*inOXp|?kobwi_ zHGZw#@Ks%=t7uXyKGE=5PNVo1rk|`%0i0}`ZSK8wb?(Y{1y5&Z^(W>_0|!5nX8bX^ zc|D)rosSwvR9H8&Zqk6;52tVE_-tIy$c4?#M1yG2>@+TC3eJ|FN zgvMnp>@le3RS&CPQe9IUI;Yh2qAyU7J&=tbef#yrAi=tacOEf%{`A2yiM2z&zICY+ z7{nRyI;m^0JHop7)mL}n=)MAng5L4L+vdatb6j^tY}wSx+F}hmz?WeZs*5YG8qHC8 z(>SVcAPxdu*s*(<7qvX(p`z{{AI4&cDj4?!kM5I9q=i1SRMf@T~88HU@ z&&HJIqaL-lmmTdBpyM&tsZDX`-BaVX4^2dW+ylq%qwIojTq2 zBHq;04X;_V3I5*=uXIB{ihi5L#s_cbn2xK*<(lo~mp8*N$BAChi`~z4F??{hm^_JH z&7((VM{F+Yj?QgB+2!L&I2>nmsD1RR7-%k?#^@i*Eqbq|)FxqV2)=UI|`SIEdhl$!S zh0ytvIhKJP&+v&?H7CfPLFdT+QC?*qa6P(j-|=|nsdX6cH{syXCw}%9r^k)AR1pAb ziQn%Fw6f3gt&vQphrjufn?d#wZ4qaLPfWsD0vmw4FMq;S^dC>ybruEk|Q>UAb)%0dR<(E;PI?FZ8dNNNCS}qTF-Qi{zU#8P87gF zgZiXV-(BJA<28(GY}QCyb|TY?s>-<#=Q%i~ky*xdjfP@CUe*pEhRSQpbTe++)1b|1 z>L_7giIkP{g)EV>p3K&~8@7hxEZ}p>wz3!{3NB>U$mvZ|0X)IgO3I5Goh`p?ydW*` zl>VxxG4=l9WLXKf4Io87Q()?~Szp$vAFjSFc{k5_AnDTT2=){fqCjS0Tg-||8 z{hme}`+~YOjsJ*JjJe>0eANNKa&m0c_8}c9tJbZlXrT*F^O6s;Jj!rg%Kya0C=Kp~ zGri6dXL&FAt&;&Ha`Pth0BtB)7r=^e+WDZNaPmpQv`&;$Yd2x)r{polJ&0nXky?ia z^|HsLbX}scW|KIT8gZnh4|EeN!J>FX;+1&hV<9Qn2W;VkgRtelbX+ihV&ykOVuao&8cp=*w!ckux;`s zncV198V5LbJdUQZPPU`^I~iKg!UN6h;6_1JFV?$Px9BU6@tZ6eRpJO6R*%4ItqIq5 zl-?TSsVNgIqa?K9RMDBanscO7YbwLR+wmlAWMV81z_eu1N;=nY$vXN*^r&kW8nG*% zQ^2kCwRvzQjYJXM2=;agA8Nm9a6ch@lgFnnDVW%bn6PgUI`#!(;~(Kgz6Nc`k*|JJWNm^bSIN zH#O{v!F~I2_V~ycPFUu8!eTH_&dcl_FF}i|bdf2&&vI&syjQTv%rdJBoUPjr5|Xu< zU64Ivzz~lCpls@44YGk?3hO1olNZUG{0SVtb9WztHu0veU0^Pfpd6M7YQ}s!D;+Qe z1N2o$W=8_igkeKL2k9z}6K@8HeOsAeKF0!V(VKD04dV%Ie=7=RJD1&{subS0WSN~={A+hS>SAXSd42F}KY}+>f z`pbd7iIBRFJ+X$+*H7R8Fgbqj_wHfGZ5c!qc-3XuE-<%kJHf(rbv*dU(zy1vi{qo8 zJ3o#x(eKu!Tk^lWVhRB7|Ax5w}77l0p8&~*z&CUkd}Wb0O^-S*u%Rxm1wAU>e9*4wL%G=Nslfa z0PNk|3qg1~qh$Z$iG#&y7M;G=DM1GSz2xc`81%HW-=~luU$zr@vN7b}tPA)7{v-o< z1G|>DH*Cwu1Y<`Ij){a+ayNa3KsKL^%$1>$w(e$U><-S?W)jBY^Rzg1WJY;v}4Jc zxyf$(dtTU@wRp@jX*Sf&)Tv`xJdH>LtbE` z2K>?Z)xsdSmb2U!E?k|1zMgZwm$@NGEiY{4_0 zg)$149-M1Ge&WP%qC0BT@EA3^J|>LsLLcr#7_zhRcVB&jh4qTK`|gY4&O2vPejSVa zmGR6E7BIflvq0?2S?AXh*1vcB<)6P3ufMh$um8)~WleO6?VIAp8_rJ$fH&XT5dZXz zSK)ak_uX3K*4wAVNAJB1L;kZY<`2g&;sBtx^OKJ+CY*m0Xm^W|?1I1fma91fuo2_i zLm2Zv7q{O&5+3Qy`R@zkpT4<>{xOsZ!w{5T7}7abrXJ7KetrA0nBT|ZsdxPS*KY$3 zp5HXT-AJ0OS$QP>@gJ7OqmL{nf7ckq`RlXi48>{bTF$&P#21lLmK=yb`;#}~?YH)z zylJJLeTXb@QGDW)(mz zQ2TeBE&tB^HEH<&_$M#K>%VtA|Kf&tj4RX;2>})7QC~J_CASXV>mnQFT}t(IHP+!`pAY@w2+++L?BS0 z^z3OApdRr3@u&x*h-6Vm2+ScwD41~Gxad#adi1D|ddBT-)MdfzE29mi$Yqya z$b!0CJp0@aa4wh?S6?%cFpccsz!}A%KzUUhCY*qQC491bcQZV)lpQfs;=1dHCtui? zygXhd^_TvPUw!Ks!YGCURc@}@lMe9RuJ z*arVzUb~AI;uqnWR=)Gl&e|rA%-9FzU zj~Mvg{OJV`J)}c7aPpaRE9nK-&bOaqhta^e^b(v(a0IBvDe*Yed^+AF?CINYFO1KA<^vq#gbYN+ zSfp2C!Jqd!0F1%`K;HCPylh+UxEnEgIp2Nwc>62 zT%d`ZZ{%@l&ZoL^uEecfMO^I44?6pA1h|R%No}5OGC>QNR{9Ed->dF($Qx1xq0O!X`1|)I23LW zSIaU_o@plx9`HC9@k!ePB=NP$tgDypR{CeDe`$N=K;c_uiF0Bv;dxo-ET>jqd0Sr1 zI+Dmd;%m9qCA0Co>I3Dz(8_elN#ajA;*(`l@8kuZi*NDL&*IzvWV(cIDblUb(&zp* zPyV)!(gS?Fl2`do8dxp`RqM&bmS@r=cNo;@XkCiKIW$!O)rcX@%THjFRvuGE6dCMV zhkxL2-PBbS{&$QjI7>$_%gcUDTFZ5wWIi4Cbz=6c=%hm_CgI9!g?6Onpa07^X`kf@ z8LB#qkMy_L?3E~pk9K*wkpSa2g zKFe?5*eeqz&%{ODj(CY*wk^MXQ1C5j@_CkB>XG~e!s1fWNkh_7UbeIOg=5it*=~S` zkHC-1ep7AwNW5xvB6$r@^CbkI)Sg*3&l46uOkBHcYag7}>yGboU(v`GC^RT|n78nc zveLT9Cz+&H#{@0igvD3ZzlM%;j>N8ZZ+#2zk9=p6Y>BEmiI3;6KJxhbcmW#tqjxAL)_wN>CQ&1x||aJw*C? z;JZXp+q8kBFYkzpE-VoMtdmCNm8cc-dt zyN|V53x?@aAf{qCTOWiK%r~38p785v*aVST9$qUM8kNN9Ml*N8Hw)bFtT-U7*TK8o`M6X<* zzw-Ph&UoLz4*HXE^|dqEh%qqMuI4DUE~jJK1%ooend_$m2M%)#TT2>s+?aHd#+Lq` zS>M>i1`rI_(pm+)Yv?{~y6S_`Ybv{sT`P{^Z0(aQ>>4?5e%;2StWl4~BsPCse)(8- z$9mM=Y1aNt@%@LEVrbuqE@2cqs^{VqK7=(fb5&@&V%ed1jHr6c7K0zV_|LXs5Mgdy z-=iNpwR^L{fe`vU(*eWHF&qjuiBxv_Q2J|Y*c<>-OItdB2< zY145qz%bQFM8E|L_JPML422D>zx#3a`vq~~yh-WszG)-psS|mwp@9u1gzP?v6MnCr zJut5J$W1dRi5z$E@bPrM7(8ew5%)a)@^oB%15Wa{j?XBwFaKy$tXRAq-4`2&SUZ6! zyV5(eqn_RVL>V-)-5wlqj8@kJJ;7u`x6hn8Ic3(;C4}i;w*{WU`GIxpO*f5U%{7I7 z+l9>o>)6P&hP6SrxRGNpuDNnF^zEI_9(y?2JLkj)KQIiv8eIg#$-#qX;;Vl(AESFCM=VT?k9h%O^g~ z%YNtQz=4x&*w_%?e{du7fnM>s|292txW%z}SFp7&H`{H&f&D9gxhP(J z@o0RSqYUo*#Kagr5+iH}{a?v(?yuzw->&`iV~relw+82kv+*&G0J!vuQRobcOfiRP z-NU$j`%%hy1E-X>xa*$j@ROn2+4{*{ijyFTJ^oFA- zH)9i$!sChBF&RgPfdji2<9`kPbLmgS7LJ$mKVrh~_bwAr7X{Nu2bI9BO+Rca$| z8I^H&Q*&(DwucRC2RL@RbBrcp?T9f$qYm4F6}~T*Hb^`okr)QII*e!JI#h7432!P2z9U3t#SZp zpUY658zgi7Z#mq9GPoB!X*^^TH~_~m`09nak)|7f5VhsQyL6BcM^My$k@Hy_CacLG zt0wNk=1=MyY!o_u&P92SqM*=|_h;C~D9%(>SIjQ^*g4O~EG<)MX?t3q9Vm2RhnNgdoicFgo|W(xxP3HZrP8>XCKOTql`9W zk9?b8sHkXUoq;4hl4mH}4Y8~&c}3ZbCt0S?&~wrO5?&i~qvUnUt88S>bviTd*E8qq zO(dXR^tW!bkMpZz&XeGSR%C|9CFn>Y0%D;vn2~hk@6%Z5H3fIW`0qw>oe@eS+P_I5 zuaGb2i_!(US-*;RT+?N}$R-(W8yz=vIx*Uk(d%7vbYp&G0%`8LSlkn)b&v`8U*G_N zAC@6~3XMR5x7xzfY)wPwoF7>7U8b`iNk#h*slgzz$*2p-GlHm9LDO@rykSCYHi>0XB4$MlFX8i3EL3EqJX=?kc;}); zHj=QZOr%1FA<6vIS|g>QM-1cNiC$&MV8ev$Wa4$09ghPDXFF{w27vJcAt*+_T7?n- zIK1C=u6eAyCDkr|in$=1z#bsX*@jKKV&B0dDE#{}ka9*76WKb9((brP;bJA}T&hr0 zQDq0?9jwbgYE6e#u;^ilvSsdR>UWcT^mou z%g?Ng4J#JK2XCH&1HjG2m}DIifOP_&Ma?@{^ysEaqKExV0=_SpNcy1pDrEb}aF2=8W72 z9#~2!{>3qV{K)wH=jX*$R}N)j{;z>~4qw}_ksY<)e{^+x<*y%uPbS50|Mo{??i{?C z5nv906&kQ5f-jgv9F1>&b9sD^Fj+UU-O$ zec_pR{1JKZ@;f~dtrwpZN~F)pg2EMCb1){UI9sm#H22OkE@E(#Uu(Fvj0l}hM* zll7t>JK*MkFRs9lAHj&c!a!(JkK-(8c5cP+hezf~&g~vVxVWj4hqEJm07BVCZGmsO z>TH@C_cK}D9L)z0$3V{in{nRom^yJt8oaESV!2G9?NjHjRG#H+^;D$F@5GDIrV~;( zLqic-Y2~_|IAENO33!1|ojQu}@qNIz)L*`p_avofk*_4o{JOPUfZmC;V+gfeoB)b4 z!E!9v{zXYS@|ALZR$dmkruxrzSx@nnMknCKbsKkbPTZDMIt=5?xoPK(Vv$bBM6uA4E~zY5Rwq8=yMH86nP_8*Kded!hOX^PMM%+)wBbc*MmTf&a}vy|Tt z#nGWSZ|Zb-xedeI6Y2}bM8PDj) zX9;g{<&`7jum9#o44mwiVB({fyF2@zd1^!a{nzHRd;LI+hi5;4qtf*^OhFb7$VsrY ze&B%>@%MkXm^vJdeuQzq4TpuF`?OI%VHQ@LAJ5sLTQ=uo*&N6oC)yDD561ZjQMXg5V{e^2zC<;L^<@pdI(xoX*v>c3!=1rttGgt(kh#&oMMKtZ&7gNp~8n?ki7hOCCrN+^C z=zA+UE3yIpZi^WhJROh^klvZys8N05l1s;=GGrOb%)RV7IC$t-^y=3?`V)Gs|DXZj z!cLeYt+9FC4(fd%6){t$jfj_DeGW&0?s4CJSFmGSxptg3FAJ-jBQbfj-zX83ud7!! zF(IudEMUJ>#z|X-1e8au(D)1r8g~`g&j_ulM=t!AN<hb)dgOQyjP!73uo}?69>cJCT7U_!f=@BHh-w)>P3y$EJI-Uai}bP{XIY6D zzDq|VW$AGiWEvD46Eg}3JF7NtJ{l`mEF*;G#c|1n?zFc*usdca4gjyL!`Y0TM<2Q* z$3>bghwuY906h5M^C<6d0JwN6@~AIupQu?fee6`8zxmeN3*s}MzKyV)?y8~260dei z*PXi$5dmO%i2!i#?J-&hfFy9l@>PxT_*08<))_{7aeM>)(kM{2tx38;PvS3 zveZoSdJ zINk$1TH#&uyVyZ(hxIia)*JtU3S-aQJ?}FA!)X}%=!PVU%E$s5^-=8r6MsUZM z%5(dTX{3pL0hZ6c*vifmdDMQ=3e8>E=b3#xbAo9f@MBpgT2Jzhor1MC>xlwe5{h%x zN34wNI_X^Hwf{Sg>L}!zP9vgy*7qr+0Af@YVWeXPv`gbGu*KW9YL8|HeCcUl5{8O& z=_QX8UP8qofAJBP@016^kS|VB5A)}o8(6)dnQfvBgr&%bY~hD8KpM%5mLr+vLE-6S z>^LtkccabaU3*;0B-f&RY+pO5ZQO^5bJo+gkO$;_@y(Ew&>{_^(4d~NK^dF#Ztl%% zd0x`Na(kfMQEqsSqv>onl@-NMmF%49rJr)B!^FK$ANA8YS@tm8j8*!@8nn41Ib`urL2>8+_fm*+qcD2 z18*HPRKcgg$a1Ww{oQu3Jj?N&>jrty^G)UBBg`AS0jG>z@*(4CjbG$7>1N)nD|n{U z3V6vA;*#? za>DVQyl9(C82Qw8atsnzeq>V_Qq>j{p5J9&$uAdmrZF$L2-AL(S@~nRrm@XRKLroy zSlXDfNL%_D<=H=|N1;QR10;^%W8J*OSDIR)<&`$Gzj?2+4V-|l3>48G81U>bDo}O! z5^w1y(&}V{r|nI9%7qR4qs_x5GUSuhwrUaS9sR5 zKlAuXXeAsk;rPqBitXmmDPJ22jH-~oJG|RHX`Qkr;X3ZquE59;qb39r;FDkENBP%h zwwd*kMn-pA$?kp)y7zr#MqGK>FpL+)0YEw&(MU^Fs}(Ev;eb0CBjX6pVi$_!gKuG< z2OnA->oHPZdhu)`osB2_y6r)N+9gjMKTgE67k0(d&n}A(-imSbDjWa?baViy5|_Dh z6AsAVesBSX*G)uE`cPcN`QyDX#z8*tj##*8cYObebr`@{7qZrvFuq^zc-KMHXamO> zmz~9VFCxLx{ z(BnETpJYrHmOK0R?#Ivp9&O0eeS10D?gUZMXhTR&+fooZ3!Mh!4;9zSFV{};mE&$Y zC9?K3bZslNW1~B;3*D1%(Nn3P979<83+7BD%3D46jIH#A!96=?R*?VLBii@tu8Gv=pYbj2t(TE}hr9P()6deXeOH+F1g?ZTX}`H;>KC(v0C zW}dnl`uH@_=AtueCmRsFoyU0Yb7zd!wHTh7Sw`mq9s}?bxv^R;}0>n~92dnCO0Gvkbgt zYeL`&lLz1sJ%)Ae_Smxi2%-NuigHYMHc&Li+Etthet?wdwNvtgt4IBv$8P`gI9k9X z>(;H^1+CDVvldtXsorY#1yh;3osPHOT1r3Ilg{wB+&Y1E^$61T;0S|tv4Eorh7ai( z_YiII)|=343}L=^qH{)*``dq58E?!d>K$|Y(PLPTUpbR@Jb^R!1~vh8!q7c3LnJp4 zowMy!Q`}1gfY1K)40J**I9{CLC_|1JAUbXzLaTQn(q|7g>)dqnOx7~v(5XRcqHiA9 z*BW2>tG8K`@8u}JiE-bjrW6MNmku=@T}@i}pw`LDmptX?0QCGJ&ODEPZzJ>ZUh$cq zKR>R&c^EXZLn>!V`U0o=%|r5f`BfYM4yFUZYcCxoQs4CW*e51njKu+fHBSd1nWy?= z`Cb~BANuyD_@{qd&$_)nK1n2mi!U9m@ z91R>REvBT+n}5rn8Xl6U`dL9L)pzDluGC2x&0!nH=k996S<>)tqcgs3gZ#u4b$ zMiHgfbxJxLiUwtAOm(bsj-e6Nu}U;kw(;EgXGRPrT^gQE?|jlZ3Gb^lo%NC)i7|t5 zn*%3fTh2-(l8i4rfNMB*VC~9y>HDI4%GWkZ`5}$O(LZF(D8h_&IlnNCcmT%o+-2?g z>%Gw*cw~%v)RT0aqpbOkATWq@Jz*3IBO%vAEAOvTT+vg?Oj z%YctCa$ZiFgeRUrP3I2u(a!DDIG-LQq~)dQG>MiUz@dBT5^ zQm25#9T+yFOe0Qb85^?<(@8`0b?E>gkGK?tW}RstO_*uKhi*NIY}1!;|K0geOwRk9 zuX)ky10+d{Pq^<=T3D`7dExN^0`LwS| z13%<3aea%*93>+)6f#9D9^^V z$0xmjajr3>SJjb0i+3c-k0G~gMjP1f(ngr-t!t0OOHVNYT(=_bxOE0c0Nj*bqSivD zvs%(2d6oJZTKfCnZ-{@q|1HAeoJj|O>#i%|d_gVK`nQ&`{QOCOsqZO59<5n>I==Mf zCn<$<;y!f=XV#8SAzyGv1bz~P_kS)4AWsV{_wd8(FzCHT=&K3wg)dylZa5q~63_R~ z`hHJ^)wHKA9({Z*XLLV_0dQ*k?(f`z7p;a9JN&s^_GQ)#oPTvBzVQtm09FtI;F7ra zbF)|_rKn2*p8_2MBc1?Igr>AEi$`g1#}-il!W*7n?b&&r+tL$*szSzS0LL)c7~U(p z6M5P&YUBigwo+gk^2aigPkb*pid0~zs8(2~@`s0|FOi@371jAEhTy{!J_-Zby^Vp; zzLmVim+%H#z_0RpN0przb7Q`(m+&W>5?a!ilJUjI# z#e|7{Q5tQH#~xci7{UXD#OoiQ`|O9<)!l~yH{$DmzXW6Z0?tgo5F`Hu^z&|bqpytT z2vZ+KYpAO`K^VR%@oT?!O?>McgsQ*)v0QMUI(?i_+Uww*2^gxv(9{)TRX@=n24lPgO&@d%#L9x`2T>>vW-w;nc z_B_gYkK^gdcyb(r{p7g!zM1SO>W?f|fpi8(oSpI5;|p`qHe>n>oJz*A&~8GpxF#ly z9~vKKcXbzbEIdm{^R=rt#MDWnEJvZ1RF9k#S9jmBXNM})JX-jyEqsnl-V?yibcP>cJ9vn2iBp{@jpfJhP+hP z^DdR$PGoBXlJlfgUMquTBbX^8AXQDzeHs9G?_A1HE6!;e@`Yi)_E~q%0Zpa1osY|B z&bPee&y?#Rr?ObXmXk~DM!!{X9NfMY-^NSU`derVuUY3d}Ji4dP2jA_h;-~-lU zIZk(T5Mc~!B@C%`P{}M!YE?)a#nZ_%0P>?E-#MnTU0jWpQRbbsc_d?}3t(|~x1ab+ zK=Cn@skkevy?Ri0FAdMm#VkYG_|b@=aj`d!9n$(Zv{Mmonw-=p(Yd1_%Wy2z(B@9N zGPXNrs??{h(9L?K5eY%6^4vD=(xpBXhzC)^-1pJTIRaoL3Up{in{VBABwl=Z4LiLK z#E0*?62)4dgk{&>N9f#de)9+H_UawiTy+7C0E4KXxLBLA`)ld)1MJRwJ?{PJwJ~9Q ze`rqKYVRRO(tCH~A>{PRjLdQ$4gf{~aEzl>2u->!en@E5&YVlyn_Yc%-5B#}FYBId zRijfY^goG_*t%Os>nx2lnpn;W=+*{rsc>~(;{-wlsBmmcjTG{!Ff~3(Bh&gmX$j0+ zJSW}Z9o~7l(6YYL-}aIhYzM2@4PFF5@^$tJ-kZ;LM$ThMlyJZ$=RWcnvQZ}wc~&Eo z$^en_y+*9U|16Ioka$^^Fw*eJZ|69c?RcO3!EfK$Cp6GiykWkKmL{)*k9p)@^T=n? zP)8g2N!-O(qn&-D^jn=;P$I*d%KUUX;kS8v;GkeW4FE_Wqozf z@Y`p8%qtz;Az^yqX8-5j%Qo%?P3_m_6Ngkwoo>9BR!J{01~1DM z7wfFtlees!m$dVlaHLHd$$4%$70oqL7WncseG9PioOCpeijFLUJf;(W6_S=AeDTb3 z=&P3F@64Nhq!{LPpm9u+E*dALnQa63Oe;N9h}j2pq*Im@8Bxj9!VA*ZGUPei#B!9g z;^dfR+2Wj`slmtJUK;2sUiF>)XXsPkn#VqD-O|`C?fGZfOO%d{Uc#fNP$~;Si@P71w~F&P9Vz7 zbb71lB~)75#`0dNq@|R0lOD=`FJZfetlCLrD*kbU2XB)85P~`&KcpE53RgV+i}(Sw+hEHzcFkiw4{yYRj<;YbZ9`vQYYbxVc#+^eM1>)dpl-W7yFAebgn608NQdg7FnpwbUsz;CpnXM%zwHYQS+Q*)y1do zn;jS9(5z#Ob+$(PF}%F;>YCJ-%$hYlF28gzJ1CP3)&L`T#CIQF5=)k>j7#Rtj;pSk znohFWJxJkYT@c^#&XN=H$fNV)Mt1*SedQ>25gX~Oq-p<~xS=P&sQ%zXOIV9;hX`NRG% ze}Ect!FJ&XX_F6YeOqG?GXQ8)pLEJi9qeE{Mi}ZthdIL?$H=2N8XP>-oK7k7mE$in z6Z9~>;UUhX#b`PZM~6QBJQrOV-JSIgMo*02rOz|}MbY1XK;Miyce)K&M~^axBsw2! zk}h59;_!h^v2)uo);UM%TR8u!rvh>7R!=%3T=ndQY~|ArYuDJZ!!dmJA!I#A^buvR z523)Vx9g-Aencd`r{*)?oW{=OOWE+$Ii7!RajaRf2S=&ob9L9073;N;y*+=$qZ0vE2;QiTYFdIWW96`AD&2jL+De@hS^JWYnQU#F? z2GO5b^Pj=OaQaMl@C|eZhtLN#re1i;`6FW9W#@Ao!EhYk`{3Zgu3t79v=Tkf%fIrX z#)Kh5x@1JtfBO0xv1$pC2jJB+otksE>!}kxF|aeAh0l7T9~{DZ`^=f67%3ZL*6a%~ z-VVo*yA3_bagH_U3GXuZV?Cuq!OWQxaq>Sv#Jkn-cYlsIoDp*`><`YJiL%(hMvDc} zzju9n^urg&Z8r}>=X;#>RA<(;d*f>u@LzoG1a)CvN#D5a^64>pZ132#VKX|47MzNw z(*Avj?6`#EJU6g@xh6jQ>6!3GYrOSZbNs{KuZ+fh2V?A{{%mL<>LCu_*IqY`O%MHO zOJp=5nm1v9{t^xV^WQukx8FG}KK>~q0Q63oC4ZJnN_o@%ARi}x@oINtOFaF=+Ialo z&GhjB@w2}$Bd)(?C^9Pt+vM|ea5}*9CzoIL;T_wL#8Nwh4T{@>g%hiY0;Z ze+Km)8pB68ev~5qU4LtJ5zXqSa5|!!<@53=4mS-rjjUX`8Ar<2+^8@OJh+2ifDY~4j9k^MLp)yK>kQ(^*+PdPoRD(AQdkYhN3 z?qai&{b>&oJ_q#e8?&a5i*Y0RAyd>3AhfvNOBZGxwX$i%l>4O}O52N}wk+0-@chB% zlQ>`O;}{wuh~j%RWaQ8o$5EYw2K7RAIe(!R{BI%ZjZRVxI7{th^P5qD2M!$?qsKA! zaYRZN*5eKr+J>rTa`vW?H0NlH7mVaNzYt%aIS)PKpbHwr+_7^{v3V|INyqq+XYpp8?tj&g3_sZ zv>U2&N}EWIwWOuYocnMu?x4hnx}keJL%tj<6C{ACSI*hJ=hiu8`+SZ%7@1pqtaGj) zNCUQ++jN$r1BRE57Zj7}?fRzD_?vSpSxs7V5805{;z3=wXZsCDEwFB39_@Mc-HF&E z-<-fswx>zrKA2$tXJJV4#FGrLym%KQpaK`-cry{IQV)>XPuXE)n= zR6;AxC2#=XXnX4BMKSFk=gJgCnaqdn6RfqQfotbHQk&oEJBx!~={rKn`Mi0=8y;zI zhf)Id)2I&ZNMrh3w?h6*?-Stq&->J|kfzKP{mv4S4!kax<(LK{m$eGG0?&1r#}#OI zv(J$N)vOgN=_%1n1tu`cx&_*1e|4Rpt_0l%w#rSb=EvXupEU=7hZY{AP0FHQpf*`S zhJs*11&e^4#9DSPX5>lVGk;#67m#E)Zy%09g|*eVp&5n%Xt4krb!IImBP8PUJ_m5w2`yJ z*KOENH8`h)$&lWX`A#Mq4oS|5tkqs!(W#BW+^4maKfulo1 zXP6(GdDh9*QPPFZSp+G?)2ezXDQFGRfD>ibJCz^VTVPO7_S1>*QU`Xl#p^#>5liR4 z88=@$C4T>Z`{27B005Z(D4&*K!NytDPwj}W|Kof-rjNyM|JDZxkv1%ur?xJCe=_~p zQ>aVZ9Y5YVUU;!J{`PA|0O*`XlxwaUlLmk+QDXj^FBhK0!}!T3x5S_R*-I>bI4k?} z7su6C;dRM6{oevr7TeFn{D;qNjxYb!vkN0{EoOun&|M>6XkU; zcEuP1$3E(rH%FMXouVH(Sf!wWH%iB+^%R6DT;LNFK?+v;f-A06v}Bo-p3VdCFaMk@ znO|jHDhp@_6)*B-8+`5AZAnA$k>PF2Ql7Qo5&gLYFJ6@Ya#`d!ZXwG zz0U_57ryQ9stnK)s47TNZOU4*UL zN=G@x(E&p;5`ZD;>*|mj2$YmB^qQo-#pIPW0x`bxX9W|S>@z%fprs|4a2<*jYq#Nj zeh6c3|6E8-p6L0^Mfqa>8cMX$*)%*ZUc4d0GY!VQ`9i$WCr#*&H#qHVaT212Ll#}T z`>*nqb+r!A#~tl&ytx9$p6x8eN5-7llUan;;lY2L1^Gd|x!3aE;{sHy_DMSRV&~Rf zcVB`bc|2n6L_GHB3Jkl8p?mjKJluZAy!iCbOi!i2{a;_knd0*?0$&h!eRwt#(t08Q ztm6Flg$&KTP{^{={^~LDh0k9Tk3YT_L)a4-!sle0ufe!GdgSQ1^;UPR?}%?d@Cr(> zzDz2+$KmEZ@!8LOie0Yj!|s3ft;Mf=;Y0CrKhHUs$O4E( z-BFNmuKZWO`XW&W8aa>qDh&Hqv75-gKtG^=Nn1ttU;f1_I5aGTSMXy0?3L`gpMlrD zyS7i`M6eGBf%%+;xPk@dfVk(LTSDi6Mw|tfF4;+c?#jYO#~BnG=o+0)xqDPYN$w`K z=_tta?03>mkFe|JCC-{3K6+GKcgsalha#s5|bT9>jOQ9 z|=2L&yipEayH5w;UUkrQSO^cB1T%hoV**NW^S2@{5PN4=h6?gamNWW;CIr zoTqvB9dlzMJJAe@D!g60PsFQlY(QzbCqDGSOHizxa{$=0uPyGs|A}+}xbB)c%xecT zrpi0zbIhH2%u!x^@lBjxu88sD*}XvD&-Y>ld~w}P1b|nNDSqFJ1Hj1PF7}d~@y1(g zk&`PJgU4kAfF3CA+$o=nSn6Z_3SFcZjwC3Y%Z_2@Gt^ZIIqHKEFrB|^;FKQBJ6JeX zJmtLEXU?6ar~HvTPELROuBsd9>SNt_M57X74=PHP31db zn$|iATlwIYMhqe#oKyWl69)+W4VqtS|OZOhMi@cxFQiMeXicFO^ zOPl9>nCC^dEB9IVQKscrGRiuoynavJEw|96&?sS%*B$x7%lFAMX5<;qOPiLpWNBCW z5^rq}c}N~hezqQ5mMi^rNJxH{H{@;7+OC#SWL=TV+~%`vU*D6zs+(!Ogy&WAn!$(u z=bt$GPQJ|iysW+RJJa&z+SZ-3c>x!cQeKlS+ep~LD$vfADZLUW=wuq(Ryk#z{Rq+L zgMj45m zLD8FIH2HPFk>2UVr#^^ww4Jk`((kRSd`eQT3YP*|TDEh9@4>_VE-!i6{#AX>(X+re zZ9;K!#+7%Jl^2DTe6^}lia3gcxQLTC(mKEB zdy(+$MC+P9tzS&WDZS9mUDT4=F;S?cU;3@=P}WyGYHJkwmNtPpU z4Ii9zwajHp_7F*HUGhvX9H_T79KgZ8cicfZ@!_MpM9Yz*F_0*vol(?Ei{*=t#ShU_ z?cTLJ#!c!K6DAEz-qM+W9c#6H`#2&Fr-9QrS0n0io^+ntiFM{6jL73-7&~7*mQme@ zM#BRKn+WB8BgZE6VNJCyp2i^n7lOFuwz+ZbO&F&JFz-o+B<2_DVxVL0Dzj@yA_?n% z8>9S324k3H^T7Hwhhxct7IyV-iRQ!m!M`{FD6>wSI2z+d4JF#&T-IUr@%H?sv2^K1 zbVXxW&rL!{(}#7nZDFJ|%4N&v+O;i2_}j~|cZcG%(RplKnzkRI`o-fI_3qdIIFTnt zL+5eqNI%M&Zc}bt=s#dooIhhcn}c?+mTW?%)#J3$L`1xCL>L?&Qzo*Osw2WwR>C<& z9sL2`Vgtlm9FeekO(PD^on!o@@kCgdfWvxU^avcSz>#%^wC;uhLT4zmyQ6-|qSpBS zcjw2tl?Ty7odidsF!b&hCy#fDLpXf2v1S-OVo+Rl^)z_68NKQv#_GYe!!-De-O9T; z>Xz^ty?gh;$h?>N^ikf8CmO&6j>2dn>fajLvtL|y-7F&O^^1+{K7Qf(x6wU!j(hIB zDDJpzXbc%}6#38@-ABYjk2S?NFlz7Gbr`wSDdx@_4~>SPKiCsnHXgxXJSK*Y=#Q~< z84dyK<6|GWExoam3mbvI9m%deWmrU^F2aWq4p-nP9w612;X z`0`)89g7#7LDzGBeB#rSV&W7W0PKFGsboMBNkVnF?8km~?rMoA9$gzxJ-UU^^@HMP zfARdd?xrE|FhID@!LafD)Zi%J`7aD*rQz`Z_RC9vwJSdQu}L^1OihOe`$F<;0`t$g zD`h1GxNH33?`(+&zP>I74rz;z;mB~!^%LmJI{cS1)h}Akj_u9yr9Xe2s1jY`?t5m& zhwf&x6UQ)QcX)Rd&lU9V{bkWy)=^#WQ8tuq-F^r?&ek|`=wQq^e+tni#^=Tci%uLe z$A5)CWgdZq&OT^sC#m_it{#!Hfe4dp)-|B}I|Tm?i8-?-vEhWZFl+1_q2vKBhELM8 z((m0gvIAMv93yd9IiIMmBZmz@UNT?QhJ#Ek{L`_aBy#ofd6{RME>ls)8SFzXY~pF$ zdz_vB2V(o~1DrV8m53r^iNZ1hxy5)NY>%TeH;vmzs|8Vrc0e>XvhSC37 z*1)i=9oR&YVesuNS!%8RwK+&eqG2u|kERZu#?51&7<9?17=&J>k97eTZ3w5KTh2cc zV(pJrBd_aR>!SleS#y>7l*a=w(&YTr=q)*aCQr^WplhxpZ6R>+O4-ajM?<7$5DkEx zm=pJ6?$U?oLGEfdsz8g88tGR?YI8hpqn=VuJ;Afpa?REZkgEkc+!)a^Yn?p`)x+8~~hy@G*(c zgh)E)c&STp{XzY*O{i10L2Ybg)GB3AQ9xv!EK01zwL2R{-5=6hBQ~}|byTh3b`0LK zZ?`(PXWpDq#DxJ8)f`V8a-GC?UgGFHn7VgnKCQu9`Q%&B%XShs@lU!Hp`4Bs84Uos zpbnyL1zh=?T$ObaNXl>?8Nt9Y-nB5L)C~05auO{mYB@P?rcOx*@#mBL<5&PLM!YKP zP2fA@Ikiu39i5Qb*twc=S?e#pI!1+q`BDuyVV1?vM4W z)TTJ>1#|&)(3mjY)VbXWJ91d(v42oj;jy}1uY?~ zR;*Y{r^5(2X#xt`;i<^ov}H%^YTD0!_aL;(pcp-VOe#lJN(v*Zg&UILI^1dC=;H)g z;n@`>Y8$l6u!;~pX-2&uQMsfQj0tH|`0D^5lUa8e(S?-`5(?SCJG;5DQ@s7+>R9yV zYjMLh6XN%O??WgDNLc>Y>L$Y|+&Xb?w4v~~U{rgX-Kw4Ax4(ER=N1z&0dVrdzy4DB zi4eyD;OS>t;_trp1b7~epZ(kwamVe`QDi~~=$@V6Uk|iBrF?Y)PuiDWYKlMplNT}A z4US*_<+&J!hS0gQdhKcdr5}=NFADXio?ed;?r{{y{o=QN^S-$AuKv&!`q~3)mu*jT zv#>ZE_Y(o&Aq<%_2*LYFjCw=Is5qp{Nh}iDiEWdlb^a&{;j*|yNXz`06gu$3RyG73 zOY|Jvdto5zgU6ym-t$}zAH~~PTrjA3t~Wg?`;X!?f52GGQFvbZOY!^x2l0USIkQ#kI8@<*6n;6NkS1H# zMgp~p1`2m+ZGPKbA@AUm;aXtiPJH%pUfsIYo0)(eiZP=G$Ltv_9EKB~jtPp64qjx> zaCy6S?2CpiTjLlD#r_yDr%fG8^Z?ETXR_3l^SzxUrI4)Ut8$B5xylnECO);c;ENWh zW9KeAme+1$61F+RKhDFrIDPu4T(l)$0H#a`pc(CM__w9Yw!{t=NWF0S(J(%9MsYT> zyre@Z_`l%a!q;tvUgFY-ykyz-*v4X}YvOb;;z zz$;x^Q5swkx8E@dL)+b`FR~A6tPzcoBooKY(G|c<|eALdS>?eduzIOqiYC_D-C)H0&qT z{&vFe&(5&oNS_?kiNGH}cycYq?Nyu=ekA%6mVO2fD|0zZyiaco0E|O#y|x<%k4>?A z$L<(1a3J2f-D3aVqbQR>lu1%6P8?^uwjlF*#4r8&PsP~DJ@AcoheX%dxaL4S`M{#s zg5vAiE2e?#1?``H8z&c-FJ?ho}Y*y-uIm8&_RBD;++1u@mKm z7q-NckH3g4>_s$(yVAJ-`kODu0rr$#GQC@5i>!_UBLDdsB%gf0`x}y!*GA zOy)a3rhC7u<8#3%r*x?Dx#GEk@AtdX3Ri%&=N)k{Uq>8GmX{f7c$mIj-c{xJuJ+#a zDV9m+qb$pB?>nT)a=CZR@X9amy%BD0Y<9@Cyqc(Qhf%?E0&M2|HZS>vWnCPT%!7`Dg4MJQ;Wc_D7Q^+KF& zMx?UUw7VKxairQ<8~|>=Bu0+lEKMrtn5hH6KRxgaV`IO#^70uOp3pI=&<^Ftkux!W z!ET~_yvdCFKC}5wT6V~sW%4q4i|4-T z@H(Ma{F$^6kXMI9`Mk>5;r+YH;=Qjr!l>}bZ}WqjR|n8}pLu-Vv5cymOi}yed!D!R zZ1uSI+}jF9@^1ExE8_>f0qYU&Ub&mUs+X(s?6%UdfpDNg5Un)9G>R!ZK`Lr@61=j+ehu`Ow99q#qZ2pJ*%a!WPOES z4P?o~P3EaRd~cfeax2)T6E62vTEE}-ssPvCzn3oW%HIKgJB`f8$7Qlt_5&osk0}doRlU8h>S2;9YxT@;<-gxv?Rb^j^4D@}?<*OTa;Re(-kZey6^yD3lli;4 z|FJYCFdtu)T+Bzcaw~W~>v$zR9_0J#g+QvShI93(BkU^4`@zoiwX#iTIbNpy*Ip*g zZ2W2G_X>_cOi(MMf}6DUG0!W!ep1;LEd`aAu!Z@a>%I9axE160KC@b8EpL^_TX8QH zseRWHk+yZY_BsxCiP_gW%x-@fx`Jo5cD7}T5NJ{$lpn%f`8uv!EF-tXGoOcbLP7@b0GsV`09Zmqxs7r8WwUSsn3%^xS$=yRK}228t8X66BZ+Rk3FF!o z7@9f%+%)gHNNd>n-56TF@vXO64{l~&b9Y=kZ$LT#RJAo~!HchKXI-%eC*{fDJ(#&& zO*2rztiG);pQw z;9$4w@t#>KQQ%r%^0rUncv9T8pqGOX5!TBE@YMC zY*g8MmUZ)zc;ofutU1QUlu0vU`BI`M5<%+YKQlKjzh+qO4m^IWjkD=DV?3#gxVhGsm(yW@hege)_4EG5?*F9H&Oqy*p>e%sG7slPyuy?V)dyNC?(6 zLZl4OnP=7~`#p3teDA^ir&!B1;_&?j5de0wUL6tFUVSY(1R@@^9H)K{y<49(@2OiiHaj?@KPZjL4K@-M>E=WWns5RL{gxNGLu-Z~S1{k0{rVFSC5Pj)4;!w{ke zjLu!-%a=B?&h1L1h@R**HnA4p5g-59&FCMdp_ADf&p*41&mJ}{9p;$5^WvV5%t43J zCv};&yM`gx;!TaG;wyhKKhu8T_KE2LFv)bOYnG~Bev>Ib-j~b1=V#UG#`x|7i{r%~ z?uoIZ#>db7@(dhN2K~zp013u*kYrNF{a;%Z4}5cNTz}($_#_)r&YLzId8U)P zNLMAF`!=tF0N=0p{)1cMTVG!v6L7Nm)aTBN3op_M!G2)+vfk1-wR!XY_|jjz5ewcr zi7tm|h8#68aWZ`i`IE)e(w{5k-|ywR`lFL%;w0t9&Cx#Y*1RurWKD88arkvy4dmPjrykzslw6p zItzHb<=S;yG5&8#ee~oBW8yqEd=2#2J9nw8JIjTd5V#=2nBf{UDvDnUK2~K%Kre1r4LZD-MJ9OEOp(-)UpxosOH@Ml#ZkdMNJ8 zQJ6$OMvvOJCy~xD{(F4V5h5`h!%-o3{G$c*Xyx26ixE=(O!OE}bY$@IUEu}GQNM*X z1)6G;kPJB%k)m>_&j??(`~7iI8ZkY=++HohVNDB zCO7h}Q-pQ5UDGz1<00fnScq5J>?$P)^hlbC2YLN1t%V7A9#T<0z1Vr(zgG{&0^6J@ z5g7iP*&ucdnz_M7Ck+uu+amH6toiU4m=!$R!H=)xCF|$LoPsZplfJ-mVk1e+&&T#P zpW*pEE7AZ1*g!*b}CNVHM&?=KH{JQW<>{)w;6@+oZFk+U@x6$8$T9S zY`{Dtt(&O)VNT_YpL*)j3t82ZV^c8u#gcbki~r|~H3xw2zSWE@5^*R-f$5c@F_A(% zLsF#5t`jG+0vB1S>s6SAdS(T(11HnKpiB;nM-sw?*&p@GiV07e*bs1T63qs0+|k4t zyj!9hme5HE*csC~S7l%?jGAY00N8`!c5^oB`O_vcP!B7m%gnV)qW<_r8RE-7o599D zeDEY;lsQ8T&&!FNB{O}-SSDYDLS`axj4)qYwoumk1`I66qn#H*i8887oS`f`*-1?`BSsv*M9X1yqKv;R#V6pVHvhnCyZg7^Na!Rp@$d6rI(J4 zFaG!IV%%7F+el**^U1vC{AVuGDddhE?Zg6a54+``VK;4$_=R7%B5t@IhlrYyUYh>% zSHZDkq4J4OJrDZ%7n|Zw|MW$6sE&(Y`sJA!UP`w5m!Nhm6LJzBh$8?VTg^`0$2cEo zM*QyY-Vx_dQ&<#O1q*quO!gWYj-!BQviRMFG53lYao^8h7WMtztg!FpkILYu#A}1W~0O-l2zds&JMBt(y;U$e1@KHjQ97pg2 z1^j9VW`oKf;)@s-VLsXQO+vb}JS-kbWe`dsKwA4!3NVOv7T(j?p92~9_J~F~g z023BO>qfo}3fI)hz$K!ax$63B3Go{zT$kL6_x zR>d$DU>DDs5)(N)z9+74WszR+wH(jw+`&S5!@3QeWwn=y-mtjp(pfQbFrlh(0!U{J z>j93^0(6o-JmM;UlTdko?vJ6;&$JOigUAHyH#HLFV+VunNsO}7G3-ymC|Y>K$xn^c z`QsP^%X-d=Texr)yCPa*?rgk~ubIluU;4Ji`6)>7yDI-&x&L{8SxYBW2myW?e()$t zh8JGk6%P?UeKF^>yMXFe*E7QkUV7PFoB)Q#MXlbIMB?bxf_(XSTz8#EI&?x& zb%y&V8A~|hed<;>Z;DY?|bh5RTm7BJu}blc)#wy{{Q>Fd(S=h z+;h`O*Pn+GBE9+A=J?Nl{tCj5^@RQ!9KZW}cSEb*D52ZsnDFBBOF0(c148N_OeNjt zFqk+GrSs;k2jY9*dx7WxtK#4OoBs(9_P!KM)D9NdjTitt{p6~6_L*gQE@=CX$5?O^ z`nn6k8-yHV8B4FcW_k=C*A)f$)|mg++StDSAf5;q+oAlH=X)T4X-^2U0|$1*RX3dz zw|@mMe~usMh)2Wjt;f><;KMgI#*qF4F(m7Oq0U+??03akXHASRed$_^FS=0nsrb+T z`R6F+x5nj{UBr2Kv+(rqi1L3U5enWU)a4NbO_!5rO#IDXKS5hX{PypDieo1RV1U7R z{ph@SckUt#zB*%kHKm0=tH+sbnzWW;eaWg`?V;mJTiX#}H z5$E%*TD2$s@gH91oXDL-o4AH!JUH*X(=q0etMN=AeEKUZ@d!Bx?~IMR?jbz;c|B6l z=luRR-*_cHn70Z3=#QY_G6Xy);5tfkF#0;xTBs;Sad-&sgWl7Dk8D8SlP%ifAt z1+&7#r1_igd{bv6Y~~ge?aXt|xmyT{`UdCcHZ<;!TRw9k<5kU@gm=64o{YyHW!+OZ7@^?!TKGUQ zDY)!sEPm_lE%DC01@W8r-GBiApf*LA>X(PLL_DEVBZ@6Ys^R;wKYTcv*)wNi)BH zvcC2M^7-EMg0B^k4>OI=`Lyi=ZS$MHs(0IRd}e!8&xBE>Gr#%#lg~)xcPq}mtFBB~ z(hDo$nvdVUs-9)CTG}eB-wD?rysOe=nLgw4*~ejgQo0IGD~_4yqwuRVZE;KZJn)%+ zGCvRVxzB1>mA4>S9#(joHtFX#pH}z@w50WK+vim|38PK9nXbAwkD03b8eUcZX?VL`reziR}FTi;kkLLewB6SeP-cLmg{$IoX+ydRpzn+i^q-)H%{mL{Jk622+veO2M*Gt>CVtNJzpzooBN z?Y7+HUlSI<;*j}GU;CZkZSo}^wcORa+HLEX&%Hj5OFnN?hG~43v@%Z(=hGOO;G?*h z$1BG_f0*xMS1XRZ%inyr^7hBlR<{+d)tH@NYx%1*)pwP)s;6mN>tLdae*Uc0DdBN% z9v|ggQtMCLeo{3~)25csbQQd|8HAn1_=lV7zBO(2+!t-G>V4uw8o#UGnJj_U%B;by z_{jI>&$4RpOT|h73Y^yyy-NlDvgNy2Kb#Stx?*gGkHQ)|PFDF(f=Q zF1ctpVU^9VT%bd2NAB{#gKx6m+JO=FS#j<;b-d$6kE3L zifgYJ&+!ApQ!be$W}1)DsfLPVkS6)j!70iAk=q0L8R#JLG5%SVjt7Vpn(jHgk+cj$5?uD)Rs$G(lu^L!V)zcU{A@jJ*i zy2O3IePNt+UY}GXD(h(=QsvW6tcbTLXUy0kgub6bDDiEC=RX*CeR+1Ad(lAT9ue=n zy$?hBr!bNj7E>mk85`Gee)PfmxCGhTWpgGI!K{V7`O0|txn*&zr8m;1!$c|@6}R0v z9i?Y4_EnpS8n7OPaRYmOk7Xh{6KM>|@BQ!*!#R4fjtFdf+0S>3Yi^htm&_T7!xLVb zFn)TGL8x43BIwUO5pA05Y3Q$9Sa}$ySHz~Z&GFXj8`$f9fDEUFBj=`~upW-bdpA7S zcfmtj+0%P$n(_zAM=^8)kMut56+g$31Hbi^^9bq9(LnUIoMUWaK3E%DGp%W)Ri1ntIVNZ{3L zHl{cI5ab2Nk-zmoQFZ4RW?)1P4MwXRE|)yv(C%B$C|!2$1REPnqWvdSHC#kF;D z*WKq~m@qg!FQt*P2n_%>Z#jekz`OCr%llD=PsE7De)3;u0I-fd_hSz&iRYdsBIUqg z@mm-GTygbalq02Ovd?FsRj*A1@`-mSITr- z6MyVS=H;2ntw$eRANLahVB7=^0H$C7z%c~M+H(=gzzyIsGG4Jgb+Hy>M z{x|CAbNw(*Q7A5s6-Rxnuz%KVRYzfzGMz^c5V3F>e7JheI+Qr=k)cdRW^j0NfUPC2z4vgft-bVWoR^lv7>SDSR(7EV3Y_URX)7g%tzNrFF7}7-D ziuLlHien>=Qk0}mc+TmWhUeLSyb(vsO_*ecqJa$(%IgxgUMFY`4x3u=UPljP2zz-$ zzO((LzXkwa!j})MtK}rF+#8DD26X+Bkq{Cg=`DKTY@NjsT9S*g8oKZ!qg|nwQg?p> z!4XnFft0+`tcD9eEZ#QB65xaOwyR28NUaW2XKshTGzO554DqoHk+!34X2%O2k{EPuO&wK(-qTg6>2!>WNI+ z8Bh|04Fjm`oDNES zJlAB;j-7-N-xA$Ge$vFzF^;o;`w*%?UN^m7s#^T6!6LH1LMYVPU((0{Puj>>#p+1?vDY$ zRfIF|m-t&mYZiX~x=R$q*?rJYAJ~Ew?sH7Wr{cH2dRcttrm0vPTQl&@@_!X1@oRh4 z8h}SmmUiaH*~EPP>#t*gF@^Bkvx!zvy!KD0Y@7d+e}g7r%}(Jtx*h|7XR-L~5`Xf? z_u^S+I6Y}qNSb^~8yW3%31^;t_j~Wh^K2royy1el<0~`c2n&Vw8fDlHz_gwC0}N`Z zC6G;G#{))Qw5NmEF}&>=!Lt1=%RwXCM_liUtl;Q?hWBmY@Svl1_dA z4FEDv@+>dqQ;9~~+Wv0xvfo%go;%2=0YF;8VMPdCG<0xs7S&RD&PpOQ@^&@{s~0b4 z0FM|txED&p5o`>5vnBz)IMpuey?=ibmhh`MM{a8j8`LWe;a4PSoY1v5A|&~UtRaT|2F@jUZQ zn-9i&^H(wkY>!dH2gC*E&c-;w%|xM1na$ebARhm6FUK$YiF9ddJQZ{2ZX^1}O1xJ$ zq>!Lfhh9ts6PYA>u-IM1hGr}q(Tn0IKYSKNFCqC*zK$N-J8r)VZ_=5g;`P_o#Ul^S zXTxgb6ZpH&Q53INvJoGKW&5sp=;0UeCO;K--+eJ5*(b!JMO!(ieF0;_k)+90Pz=TUZ>O#MAz43`y$a(MO*rD#(nu`l?IfKmF;GOqhK! z2soP!!ea1hM#;VlkMM3p4>>=syMAgcS+qO;{LkMcEOtHTPz}KIWGC;gi?9C9_&g_a zFN(Lf-ddM!K9aK%w-KhRI}6zH3Og4o+F@_ zT;znE=Q`5+oQ&UjcWZp-+w)?<``etH55@>j#~!@)FTHeDeC_uyfLA+%Z!?|(hq9gv@$l{6uSd+e;;i&^ zf9;p|}!3+l@C*i)9NA#IuhtW^Ub0sL5W0=o=R!Mi0jeeqn6gv@LGF z{i^uvJ)=3|-4L0aPmXf_$@>?@{MR;=P-E?nK=-2QF?!7+W{j$6a^bir``d$02Ow_=2SzNl=eh z^ia-zoR-xnVcU^$+Ygy;~-uux zGlIdS$-S5lUHfG7=dkCnnd1)69Mf_b<+Ve#m%;-%#f=xkEx$hbvY)zC@T!JM%Q27l z_GK>xP;MsjmOti6m^Hw{kssw}6PfpTEsya0Ek74;jq={-eoR~aPJC+5EWqcj7wNn# zTfwd6d?bIHdI-n-RXvVUzDjK)Dp;QN@mso;F+RcZtfUj}Q5LTnpi0B)-aI}_n(^Cm zgw=)hnXtXD;QGz~ynJq(h>!WDtBY&#>Pp{aTFcAoT9%tO*TR)xs;rA6qZqyL{HsK( zI1dBH(X5SffyVJOM~MKi1_9nqjsQ3pUN0U1jv0IQpNxkeei0#Te}v|fI0~Ro)+zDh z&q2bezWr`JW61pY%6&ut7}c%S8d{{PdhA2s`YwHL!^WMIe^rba<|e-I-)o%R`_4Pd z8&cDD6bCP9V?J;FnYXof z+~y^(na{`mHj%uWd3h!-$7oycVw|<+qy_61%IyZd@lTqgiltZPzfh11AY~r@|9PHZWpgA36F(Y#((plu3NU1IAj{v zRfWD4k6X6z^8?6CPg=k8;+@w=>cBheYMY6-xMp2V=cksxf?L6=>QUVb*Q^AQ!cx}t^nfGn;o5eDD+=_?%QMH}> zJ?SI8d?v2>x|XJb#oN59_VMQ9?^>C>B+b879Zc)xchWt)9*+ts91 z{>;OJfs*U(I^~)~+n4x~Vu(MFa~@&L5y$Gv z_tY&Jg0Bju@AJ2>gyDlWm+z{NkF(zXsFmkC>s`^sR|$`2Uc&TKT@}9w$Fj1_TA`WF zwA_E>d3lr|61KlcSCx}l$Wz@{b<7NH{`lT2+qlhqn9q1u(W}UJPLHXXi9c=gmpRe( zZMl*zHF{U|tZtgL1C?&)_j&%E3++**2(#x z!l^W`k76vf7iq3S-}aBPhjJpm;if2j-Nx=)%F#R|5bLNdthLL^68dO}vWtv0pqBSrgIPdROaW zOExLzrXzEi|KX8%4ld!agKUp+=N2)%vpHf%V)JZ0wUYPHd5$mU3?{fDy}(%7v}+vJ=nPZ zK)m!K(b?Wzh0%2rD0IV!xj*}=J}5FrqHG=?brZT{nB1PdQxTvlg|Ho#E;xqL@Iz>{ zEiSuqT+I2@6xN)2=5LB89$CVEaR7UZbK{Iz9AyK87_qd0BRZdWbalM__7e6+!!U53 zg6I5tq74uM;NF>W;ibc4%LZurqc;fGzZ9BY${KMZA@x^b0I)f(ynY;p2GjBSZy-eb z`zUEQvpeaBjDv9T9QAhlowG1lAlkxf%VX|qJ7OOZ2lVP3J8n2ft4)Hg>tf{!JlZ*u za{s<&6!<4NkGcy64#SCdMmX^^hsRL%ch#C)`bpPjj?Y`Vcss&(oHXhN5n6p9b?uD7 z{ysvtFNt?BbPbLSJY)K7!q$(9<;y=H^4%)-`5oCe4TAn12~*w`FM1*ZVBo(S*=nyI zorxqz^v$~_A|Jvljecai*+#aN{lUndFBp#gfyM0gwz8+3h1dQ-q9e=)r!8^cmv4eU zMj^ZClybFS{Bk4v!VfV>IZinJaYO_-i1ErU`uj1~z*AV?<0Q3Z8|~U7zQ7TE7hHg1 zks~c?9GGj){m2qMOW0?KJ&lp}iQVtfyT$?s6oG*iM5u0$?qR z$|fQyTtvS1F&86`4QuK#gkVjMFuel~V;+fl<4x0%lZ+%y2YAop7C$7s`B?TGeTX8k zmo$c!9}gXeU?{RP9)4u5ERS5^a*od22VIxpyfA=c6ekm5U_VDnY>WwGy2rg30GvIW zGZdiSNt81O8~SrB>Y8}^mmgpZupilD`#AsNvvHUhMO$ve0D!1{7YxGy8Bghcoml(s zk2M=NaO7>TXxi5==DxB85#zqN;j>eS{5S<8|~$x%u}o5iHFys!0p8m0Mm$cF$5m0#*r$Isr^(}fhQct zzP&{3`2IgGiKlIZT(h>r0F& z=Maq}*YTEF`n+p4@%_hd&W{(L-9=v?1m6znC>+42BK;zzunPgaUw`0tin~~El#7Sn?j$JWi;DDGmnUMTMwdmFv!qHfQ z&$&GHB?-XXwNG_lBbYLF2OvgNM$L56TY&-7qUGB%dhf8|qmdnt!U3r#GI+-*#t0XA zq}QR(_SvvuN7U~+h`yj_jI0|T!^ZT*X|x0H_lv&U@q{kC>>W@H_Q!4Bqzn6wq28Bx!|(!nPemw+yRX)*h}u zik?F}l6HRcQ5SGhr9R(Ivz>w4OHX#3s+=o0(UG~~FmyorsFN8BlQaMTah)2|0DyFP z#4@<1Le@18V~9Ep71B!jz4Q&PDhH_4%@TuUJ zWjI$_E`Ox2l}>%4Pi;@W1(P}(?s8pDvOH#!ydKe@)j@mL!j2qbVA1Xr*H9qZ@OjVE!q zY!|&b2CXMbYmd@)&D%(%goY-LJ3_Z~+)&z-1KF}qS$B1F%J1YK@l3frV?f@k=Yo#M zJhz56GctjSuVN@cyYjDG;LlGDF~qI(OE4vW(poxDG4+GVI?}_kvKF=KI2rjwKB|5E zUHFN|;?2Ef3R4zJ*+)XLY)Gk`iEsI>-60Kdcz{9{ih~Duaj(JCLKwP!ty?Eg3H3NW$FaRJ8K&-g`OGUj`ah*a>IPD}K z!`!>Mv42>R6h6^NX}uy+V4{bx3REq5(#nY6HiS%;7N%8MaLO?{!}g8aWAmzYSQmF8 ztj#z)JqHt_83nEc6d)HMGbHtj>apJaBL$p;cF{ z*odNh3k$y<2>QoyR+bjJP%N)1eW^o3(^0Hs4`2kaFT)(;yd7P7^oYTP-xt_MrdTDx7}gJBW<6=7#8z6dKwOUU=EbKM(NTBD z@BQv&Y|=)jLBuB-05A}2-f}d4`qLHh*kd1X*3{Ve_y6t^1ka4T6j2+iN;Ut9zp|Et z>7hgI;;E;1$9KN-G>iF$xbMC>oZ)w?MfO{7?TNqmi&tpF z<0$GbitDZ&i=zB=x{qZ46*uzXenN@A_{zHYhktmM4M$IoO1OvU5qfz`>q7U+0KoIG z)~;f6?L#8E_jmk#@gS2)d zv3<~J2=*VX%}Q;>1)w?0@Xc*j8+r&QjbTW;dBgr#@XjJCd_2aC;tVG&=|_+1P1vL) zW@fW}JV$%)UX1{-nBKfOh7If!Gf+ZLn>3V#h9z>AToo^((7&!+8<;mM|{$j^F=- zOX7z=dX@+PJMk31gnqdL!Aw(JK4%un=mx^WKNpvA{@fq^+fQR4^ah^)TjLx;;%yXXKFw`}Z6nn!)?AYBlAYJ(2!$ zX}tUPc8+FwCMHf982{@Z-b_@0p7HR{UWjE&pv(B-7>HcJrfM+C(ACgkE<&Z6@_RUa){fR2_*dq&L@#57noQNTxzx~skS-3PlShxrr zuV)-NfN{ebqEoc6DL;uN|LC~&^XJFd37rt$AXxn2QX)ls2v47isgoxV+2TyXV8Y87 zsT^j4pE-LZ1_S59?;YX)jR?~|#L|}W884c49U5aS=P#af9!D;mjZw)^+O*vv_<%5* zSgNM+BXgN&YIow^dCf=^F8-Q{(jXso>(-UU8ONN!Y@QYD8QiWFymz5)1R&3YY)!8*1+%(2V8pgxM$rvzqN4Q zx*LS9-7w>3oOI3B$@v4`7QT@ga_z>NPdsdM>r#X}wE=~vmha}&^5lQ7T(~-~@YY9Z zolO=ubJp!BcpW-)i1u+4sb@TqEt(F2gNkCKcQA+0Je15E>=Yt=i?Ye_gM>d+Q zZt16;Np9G&=4{Wdtbc7+&kOI=sXJjA_p?Ua8Mobf5e7s9(y&L|x91T6YY?>Vj+;0F zz(^W7NrHGig7aVe;&sxG;@E&uEYxelHB#7?4J^mspT7s;`&>MnuKq{_0Ow0sA!)sX z2mo&|#%!zKPd~UJhH(UdOIb*b0ozuDY?K1%Bqkbno5Ji@IxnP*PS)3 z^>=-qXE(zyo{284N?R0qmA2rhD|uB~!q;8k<=kA6Uw$#Y_a!_Xn`G`=4!0oO>z2GA z-&sfdK?j7>^1kOrw-74Ukg+|nR`%E#(+SJSVW#&SS+A?`uOe5;VViD)i{W|gNb zNaIBNi~Q%>+J4gsyshUE!ZCI2+BMtT5Nh__!{BKDZ{OaCP4p4xc?*PIo#`|FZh~ip z(*@kU2W;(|J|q7?PkFy5^mN^no^qM4@ZDit<`Q3cQ7;ACLLRk#(oVke$~9Mh*EX}Y z`b$^)vb69#@r-fy zAd}~;kNIsQ>nd!o)^UyElMd3D=Zysz5O{(Ss| zJnvXt=pel6BTQ)^&7_I-5=UXkf9A=$X8SS*^W1j!N}2)7ImW)>yprXBl;d=sX9#{2 zK`n$Y&A_oRNaC1nWFMxl%M;?FutdHWM=$TC&uKouLzA(q6FeY3(#9~nek z_~j*^SSQQ!vQOBK86Y>kgG$Je1qr7vRv2Ko+j$MvzUO84| zQd08Y_wtVas>pR3?Axwgkljck+cHy7hH1UBpW8mUzL$3PKjD)mae;2oT6(z_=}iCj zJaYS`YZal`o|b8Uu&>K2RXdfs6!$4M&_#Z# z#vy5#NK)^VOL&*GC~z%5)AHQ@A^#pe!Wr{;2%k97IlgfFjF>(J`2>Q)D%}CX*=qo> z7>9|86UWDumvg54UlY?a$)jKY%$^ezv9B5$^dQip>p# zW!{5AtUpJBa>N_irDHq74Xbc&X=bja&Rx5*{_WTu-fWMd@eyQXd-6>6^&5AvSJ;QL zX&>jccSVUeF7)mn!+ve((4Nt^4@Wrm?!=r#{{uVwpV*4C^jY|BV?6S}2jt%wS6nqU zKE<(a9f&~o#%mkn`KOo1&_NU8?k`S{ag*rV$T>G}J`~FrAB?wO+r;ru^>NnOqhf5` z*!W=nM%G8ocoNTuvo9EgQvXJhMoIjk7;Nvv2%RW`c%pXf*aMoiuy=$fq7mMlMfA22I3uj2 zPwpk(*qA(dRN~XfUiz4O681>zkc%{N+yFfo&+7v@S1B`W!t?O(Q9XH2L{}6OGiTSK z^gbgdPU?a;-3gS>bMXxBhX?s^_Szd`_3|yz%zmX$uWr<@KRB=_JK9LQ4~wg=nu)i& zN87E5=bwLjh!o815p?vGwL;9To+M~jv#Be|6b@adf+gG9ua3oWLvBa zb==A|hBU2}W07U~Tgue~-#R6qS`UyZdjd%TH9^)@SGC4cUYctW2Afl?Sr~@V(-ipX zVWg4od76e3xeoy6Gys5ZQX&7<_GRKDjzwo8E;U?zM%iU=0FN=oyLJ?^dk)v2(uq}E z(mGe0l14gbB~6*6B9D8yQ_!bl^yGt`8*)QtARRxM^A58{Im!GcucgjMdbkkf5|(W( zpSYGx@BUmn*7m{Rkn3wPGjWAKzY{l}C+)bGuiW3dFiILw$K3bQe)3oz1MM@$Sq%Ur ze;Qnm8#kq%2regCdCo=j#;!HtFPv(Qvfl}9#FdOWW1^_xsDYP+cEmUUtKB7Ii|@Y5;T~g%wy=vbeug7BLFsOEl%pa+@Gqa zkZ#JHvTXn$KgmZK{XyDFZ^oPwu|PUWDC$s}kh<{BYEutC)?ZzLbeFa%*J8p*(uzF) zfxrr41G9Z_mGZ+CfnDn3NCo2GTZ^(_vY6-*bR*jgyRNZA{zEX z3TlygU~fZgUb#NnVLdc`^5~d4Z4k&8p{r>n0jU$W!!W`&7Vv9VZ)PJ(D4esVaCTHr zDkUlNk3VXcxh&hw>#?X$3oXuN!9r{Jh(Vm$H9Q6kb6=Uw`d#!eT(lRCWrr(AsYo3`>^oMe(#4FWgm} zi8V0(=-*t9@@8<-KxKHTnE8JFCDWyFi1TljtvDKg_qV^q8?_OI&G~WDrzgQ!RR{ca za4fIwRp=lxhL2(#j0Fpt@z{L@x}1#P`RZA5#T6qGcH3P4)Ne>n+YnmqnHBN9@Bfmc z52nSR{ps~J#W5WXf+ru*K^$-$JT`7@MuD}AbLQs9gjs}${_2G>gmZQkhIL@@%|X`A z2R~=$gGE3&>FA`B0ux5C6d=|*xcprPP56~I&wsK(PN0TL$19OO)VFsx!Z?)y>JST` zMhpR3I0NPcR!uo6WS^6EMUW#ODjcogYmy+}IIyX}FB71sN!K#4r1hBm#l8PLnnFQ@ zb&*%)1Np8Ka7mQUbFy`yqd%L%=mR+(P*Qaq0!5G$z6Q2~PQ~ZqCU48arbyuy_gV(- z;w-wYcqs1JvN;C!>rNjZ8RH1iq%j0t2K)tTyD&jE9E$a8w&O9p4MU3-ESvksEY5x! zJdjPis~$ciM}6AM4?Q=HP*5#+v;oV?Mw;zDvxSHHl5*a1^r$s%rh(BLBa>PS^gEOZI(^ zH`Ie>M)7|VCFc&#vi|_(@>ck%FP62#@t)@#F+#Er8iJ6Sh$EXgcmBKIc^Tt?y+j+i zhx#|+t^Eep_9}Od5u$KZ+d`G5THx5u}>y)(Z1-NzA1jHGg1I9vN5-TcYoJ;J!Icye@)|M;iZu(2J;Ce7A@IyAEM@sj|mZ57N7pic|grW=M(aNZOohZK0Mc+r~p@Dfj=sqeCjS&Q8%s& z$1Gfk01R(|w+_Tle*6+bi{=7hO_^!Nr*fi#o-dukVfT(I1ZBG1LX2 z^YBr9*zoPfg7OgWi5@g@FajW=0`*n6bC7YP8G5q;p)8fi8b``!DHw<6RF*m>D?E0L zbPTRGUM^r2fV-wrA!Zu+)HQ`^gmWyF>}!2q8L%oRyIA(FAAwug6hf81x1Ox+;j+I6XrgJ{_<=QuyT)(xWY-n zzsh14+~OfDhTL5L`8?+*I#_!3frV=#>urTPBRscGhfvVi*%Zu|4H`6LVK1Il*W-24 zKxK|&x_F)bI1f4_GFMTjBbG}B^K@ga=2)$=P}-<4$ntqtDTu6tN(Je!;#q~A^=W~3 zr9-ZXX$zGx>FELOlhz%(VH^rC@%;ANE{Jh;edyN(<*h{Pc+(>Q4(=st(uL{$G>z zy}l$30PeiwCWNpx0|4H?{^pu^_J#S3fxR=VZ)c7Q$#ef$3kX1C2kYyGrUgE6j8j=7 zZCpp#zP6`ruaSjxQTZZoNJG=O@lzq0zoCiidueG^gsmc0KGc{5w3BA$>4H+pO|>-C zD8(pP?k8+R4J=aWPdfJ`!mj8qZTxNZHCD1OsVwOX-sW@7YTK(k&3yDR@o>E&?$*)% zq|r$#Wq{ue!JTUv@os58LOS*>&`5Z~RS9NZY2lux1-e;J;TEMdP^p`EN!L_fLDNcc zB_8q;RfBg_dbrkM4&a}-l=h@XSvS{CtPO$h7*P5Nm94=SrthVb{YIk{@eqb-bCXX0 z%k}`i`12CMHbzR|(T#CHSecd|=FReW=XfG5&6{mVzN$Rw?j_FR#;e4^d)v)R91b-z zhGKvrEh;`rLjjmu#hCO@+<+(Ts&v9DYv)2E%acEaQR+(q%Bt#adnj0|VA!w4Sw+0- z+(Hv_Fn7p9&ViOuXvChBiC)|_7Lo`3I97|JYhq!TKHG`3zAPjM`B1j$Ywec2O?!whuM3W}rI-Ds@N(gUoa@P_!ac_$+F#narV_HaO81N|KtBQ; zc!_HaW5&#Barq_4 z%=-Jv_r*i|rw_i3S1igzjsQ6C+&UEJmL)}HDEop+lH>8%Q>!=vU{!pM$YfVsN~C~~ z8vwATlOB2&*Y9kJAO2)6%C>cJ=bfJ=0>D7L!R#CIS-W_D!S;BZW6!8C1Li3)ZDzL^JFa{5 zB(i4*U`SJi)Qt#ERc`1kgdG-niu}QKrgOn-^yO?rS9-xx2wumJf13iC6k#K7U*Qh~h|ui7T|sXe=&!fRLMT2Bm1 zJW|rJkhbj56=lgu_HqX>>~5kj^uXC`5aR*f_a28pJC3Uh_M{_YENku)C!2^KcrZTv zumvOUqOehR+Yy6u_e$+MG{uGIpTT~nJ+hqDC>3_+-mn9E@Ft8FT9CoXr*2%1pJ1** zLDRPn{Ls_=n(JA|BKjJiuJGX)A_iV?@mORhMuH<6-t!Idy>HEfR~i{>F}B9Yq6Pdr zu@{`q@v>*1H5ndg;%I`U;Bz#tzy2b;n+N0Yurq%7%zN-P1{5R4;&ie*)^AvjmvOK+ zCQ{$uwy6k%>nD)C>S}41lJs zmp!!21-%*ek@@V4#~(&!{fn(JWYCEC%I{8(%dQy2oKJe&#OkzW%|_y3?M33kI89sE zZ)=Qi{_XsD;g@^U0N@LE7XyGiWBN3JHV6oXN&tf?l8BaTYexX|jC;O3l?VVHc~F&I z#xa#IYuE0Nzxm78W5tqAar3Ry;vfySC3t?L3wwaGKcy z|KsdP?5~?lOe{sJ>+a_cQ#CUuRgRYIpfi@un z>zPIlb#;9?N(RF^JpWlva6y0mIydY)aFk;wH*ws@y6B8Nc>3hA%mIe{ckk=E#x`Yq zr_FO7Gq(bXy!h6UO#MkdbFIbC?EJ2)+?yYaMJu)w`X9q#_PWDIkEWju1RwXT&hZ5o z6_NXpqpihZW+l-qo0)qD4;x8z&HgcPFop;i38|oSts$eQPKPzQ;nL}BMM*8Hq9W_4 zhy^|8X4g;Jt>jvpC64O@>z~A+T&tORn5(@^pGsJ8E9(LACS(M?q z;H-AjTibKtrLoUlhq(>`673^g)*#$>rS67eS9hU@w(s^6Nu~iODp#c$${##E3Rzg{ z4)SAt{8+AyDZQz`^=4I`bSd4FG?qu&3Rl;EsZ3=ZbkcPg*-t{l#5VIM*3g)I{^Nyj zeGia)#;e-JJ+Li5%gaRkcCM#f_qED#gyA~50I9)qO%Cq1f{IsGhZa!awf#+D>Lq*i zz<7{(&|?zx=59oudXSL+M>QHwY-|t5=u$r)iJP>~@+m7v6L2c@pnTK7Pu5PQwQZg} z1^&`iT}(csfKtywN9&P!`IGIMJj@L=&1lx>1=9e<_sn~ioJ(wJ%8#TXFnE;)0Pgv+ zomfxH*ZI#j<5ql9`4671^MwNtQAm2q1IerC;Ovv>45yw895m2Z`QH=W;wj#%b3KIK zwwb-+F_mwubBvho`tOtm6!2v`J{iG4{F0|EiyP>k@&w9vU9WCS{FDE|_yjT@EG&~( zBp=9RyGSP+pwJfl;0I}&ZIV?0mX)F2_Uqh>@ILoNl&hf+En4=N)X7~#jRZn24Pk3Q zlOzamC@l9O%4+Pp?(K?kIY~qg+>&NV%+fv@{D1%n_@plQ1akQf80K^)f*1XiHHdw$ z8J^P!vWYq51V*T**vq=VwC}E2^maV-H#Gx*hZh{8PYR4KX{WO?Y}oSb5Ne--CHE~7 z!-`342*m+AIp9eY(*VPc+MYAaH!eRKFFd&{Hf{KTb7UvQ zAN}E##Q;D-GUa)dL6%Jq1^|l}V*v1@#qr$pD_LOn#dCHJ8-wBSFjyrmOPOV)m6FjUs>#J z+I%>E_Oq4oI*Z z$0{~RTl*)R=4P$PcM=I;3yQY}i~xq>nJ|(NPu8$wx6^4*?=eZYlP_Og?0LHHv4Pho-f_R`RoJn-uOkVT)sW#%sDS^`1B0= zQxoUbFN*ix-A=g|6Q13(v3JH-|J4nIL!3ugc!VeyU5TKvLo8mpl8|`i?D_ZSy~3C< zj4|Slc=h$e@uz?KeLNca!X4f|1QzK%HT!n^Ys%TexU1<8x`77s=T_&V8>bIVX?|tuGjxKng zxuqv`J_nEcNogglpk>S$JZ%}L{nwer^b60gVDq~q>bK~{+zufWVb5mFAawU4HtpL< zb27es?=9fnmGc5$K-hGU{)RG_!Qm91=Vue9?w&7RjIg2$3dMTP^L&v7{mJFTI7&~@k+;YoBX+{6^Q_JHQPvY@& z_4OEm42x&+bXd4xMbvTb`4_)uM^{MSA)>zk(ZkMTgv6tf-ztF3ucEsPICZ1$fI)bU;=fZ5BFgMWxV$fJ z#LIsyA^$pHAS1r@+YiTEZ!^vvs2KnZQTgh-cAO{ZdgaxaGHGPYnmL;OYZL@B@z%UX zs+u={2l?m4m%n%|$8Nw&j1QT_KO{2Ub_@Vse}f1j+xEvD7yyjG0DvWT(&_crmobhn z1g8lZeW!a@Hu4y~sH`xz%47LaTKU^`zilVo(s-BOC5l29+Wkn<#rD^8UVf>RNb+Xo zY3VbgU)aW7p`}W5l|O#VA9~1JwqDKVlb_|$@Z6$P_K&4hD1cramFuI1Q<**5fR`+;pGy$>8XnC;b@ zNJg$Lh3`0HyVwqiBlzTR=w=&QCnGZWOc=I}ANxhF0eN2CTfS{BJ{3&c%}ug(b&Z(D z52VvmwX}1AZ94Os*59SPGOknxCi$Ls*4@7Dm|^>>Otl{3Dj!RG^J}Ezvoglg&*2}} zzSc7p?YyJ7?Azuk0FC=VO@Dm zIu+}M_vBsYf<&2@@}&GE9G`hfPsh-T_9|)3=XyY795d}t_B%bn%UoqyL~NlSn5H}Z zN7@TJ=bnUL3Q!2+SlXGnuh7S~?f^`}h2oh?)6vhmq$11lURj3oo=R-T4?{LuFZ;jB z%`}RDcH-#AcNH&5BMm_0A=@YS*YXy$u}zY%sCXIxBwdKYhS#<{Bte8@|8bs_j+P~# zIX^lt$iKFaw6JWS+XtO9y{xD7v@N8kZ7V%|=GY=F#limJoRxbqo)?&m0m@8lNAe`U zFkYCyC>DwVhjf;woRd^$TbBLd7||ZO6FI~Do^zc_YQ`|fTlqzNH3ASXVM-%;z_z!g z#HI8X#$4W|LR*>v+wzypoxmMH|0SZv3Bk)dl>eH1vI;JwVP-gNo38aq( ziyo)xn4+Mz862#GG?xZtd?<5|<5KhC_VFf$hI@&i_#1bgO$hOR(6FrQ+&Anb3f@bv zEQ=K@IRfAeyxgxCjiD{bNOZy~NH-D9H{Or-? z@ycs!;`YzYiYqR|0DwJ)@Dx!x;r><;r>tiJMS-LOTlbkoc zFg9-75EoxEF}=~7kXJnR=m!~={faqP5*cl53>wP32z?)WWLdoY;&P5TY+(;I24ng< z@H~hjku%(9OpZ_AIy!a}jo^phek1nn>K3=$ab`@L)i>t8u{`F#vy12iBM8Snfqm|& zc;@Hp;@vm5V0=6VWA0t-UpBUUs{7PL`ROcn;kQ!_hE2uj@4^V#v?>^-Gowd z=#WVn{p}?C+cSwma3S)M=~KJJxY0xyMF~px&(P9MO-6ld7c7ezv)a+mx5a{`4Y7M4 z4p1BR(PrCX^2GLdTK8ff+YuR99etc=WJJA~_s&tGP|RmM*%>$AqH)V4>RRSo`>Wlb zZjgpG-^2jm#b@@$HP_eG3;=K@XuDU*4xR%>{wlYn-wR{Kiaqhr0}JD|7q_!lsf+tC z0J!+_ezXPaA+wzxB5L`w^j27oplRe#-x%NeyM;u{&;Vd6#y8_i1OS(Tzv9X<$NbE_ zk3P6A?*G9mA~^Jj-?(=Q5dg{&0PfjD0#tL3-o{ZO-~QWoFo-#p#~$3m5fr1wIv@NO zh-Rr3w!W=W_{^)i_qX%0WgNu#d)2D#I4f)tGn_j{rh~^o zE$rvF#pa!RqD#+y7kUjStWT6uulB5xV)wf)8PzM#guKVmu!jVRfG5LUdX)fHV6G6tT ze+o<(+#R=26Cg9Kl}~xXEd~bW1wMHUoi8x{@{Bt3$#DPdbJXv2#*xT!52I+-fbcN< zavZ)X{2;zkmv(XQ%0KCxQLxBleXXYTtM;naC&wz#%es?3+sh4WDK4eWg2lK#$IJ%$K(sG0HoH(S*7&>u$TE)GEDOM&sl9 zIeRqqk*?YPe5dY=b~0ZY1z0HUDnH6+rc<`b(3(}DM$iy6f80 z>$iH*Tk&wK0l-2c08pZgnH~ZV%S|Ds7lkR38dM(O>OT#wD8on!k@92MiX2R2P8u#B zC-?A<{MkS}OhKMy0saJo?tVN)>o=^8Nu2q84jz4m-h^z)h@eVliNv=M;Y80`^K9f5 z%hzYP=+UExMcuez>5-QMngw$m1NX*87WvzD6M7m8EeJAf_+S>_!?FJC%?2`?z9dfg zwVxmR5*u65&QD)vg4i0X*6)aJeVHI8j*QMsKGMpD*UDTxWxjGj(JV&F`lf~)zmqxb z3_c}IZnmLU3R7(*!j`XD)EqB7v4}IXR>vK9-u~;aU6{&aQUO80z~jHna+pvxAAY!( zklKsmjn~?@RS6UPsZF{CvVV0#QTvR@_v3VjQL6i#uUe3?TU5+0CoXYB?;JYl)n zgmP{Siq{z!5)CC(GGww^N#jx(EcgjSvu*o+i~zRedF8#?P>*BG8N-;>8!K^(v`xyD zl&bx1eOSHxZ~Lx50e#%BHam)O$T=MOa0a}#JAU-TSKzIXJtJ@cM>O zufu3)-n$F&GFh0RMt}QvZe+Y`;dqCK5W*e9OL_{zuzmF5!O*uIp#`^c>-lFI~a8|XK1Mj z69&ZZ{N5$-XeW+a_%PmjV*|!DEeOI-QD!G1OpM})p0h9xLh-^#*tsJMY|VxF?HnQP zT|Ay-PF2|N#RyBgOJB!7)(~m9#e3Q)Hw%olUOA^QmgeG_#w&t(=dz-pQULAc`!e1Z z7!LO?zEwClw%W!j0vxLfEO|nuaalyG0P?pR6OcZ zb8$?5)4B-C%`89Vp%oq<8b-Oqgl&nY0Br2JFO- zJFjZ)tu`GcihwjXcfnDdEy&HHbapLfovgc?1M6YWw%u~W4qld#i~Fn}bpyt!_T6H^ zhxM^^*}Ay)S_}Zj67~<{KF5R|LdT& z#<%f|2^uN*+EOb6fclI8a4*I@BS&DI27aKBFftK8^;Yl*fGtF(y5sXVW&{A|FDdiE z2OHvzSLY)foQ{{oD7>vuFtkGf;^f9<+c-a`;hycvbMJFK0ZpX0%9z|V@jhvhdDsNQ zAGV?YY^UTUk&>3A^^&%xD}oAF6!JKj(Lg@8E~b_5ZL3UBgO}?D9uyuG7wcXlo`BlE z<6b_|D_5NKjMZyX+{}}kXud7Stnzz$QMwSM&f;l)^SX9Q0f_miyJ>lxw5p7StIb)d zU!nrsL@LV@=L&|H7J8IASZ^=iCoa~Df6^#_QEs*g?@Qg`u_UL@%R6zBi{#m3My#sA z6#vpU#aRxZZb^TSPcWn{>)BMkm9fFJuK)bbHs^ir&45$kBQA-kz)G|7ML9mS0z9)^ zFX2>%1-{ERHA(G#!fL&@?7|b(`|4Z3fXaM6%Q}gpzrn|1UB`Ma{`rLWh3>U+w!*uH zb7@~`Del57?P}i_R<5g|Rnn5V4pNInsRJ;QrI{ZT5_kz741p(J@{s(cM1gv-PxQ*Q zHs6+QBD2afHI%absy^s*>zRWW2^^{%=fu}_LE@KC<)_*hFKo+`CW)4~$a}V9d0y&W zGPd@!8XUhI=gpgAC1v?9g;L^7{mo;)7k^NM-nLCv9vllNGDDiFVol#_SrJtRs5u2(RMXuNh1#SLHFxkRbLXi<+k>FE6-(Hx8m(H zapTIr{7&BVIiLKU<&eNfd<7M{Aimp23pU;8|G~-Pb9nq z}x0BKV7Jp+JqMl+#)ZeiU95p<0{qOn#Nlj!0EISW@9VX$_xSE`O7^ z?a?(kGFk7WlViR2@K9BbydnH@l@d*pu=(S!EFWHxUeZT; z`z+g%d-2aTj^ifj<<-`*;bH4w8ll;LlV;vgjvpgpmXfRjIF#bemiMCL$9Kw-K)K{4 zm;Ftn6UT}YIYJupNf@@Q_>-4U_Co-bzEs8w%lEx=kMNa$9Y8_&%u5?%(bC;<`z>dn zm>h;MR-;Sc0Cz7(X1)5_ay(J@683#kTtUe8K?4&(P)8|4KYs9MAFv;&XaC4vWR?m< zImXMs<(FQpPd~c}Bj9E6=^KE90YHDEkyZ51 zKzh_U7RZJRKG+^lKD~;FR_)^E>n6pFX?>uJY=_g#<|9OwTpx4iZHW(w__b>n`x-o< zhoYRh;Ih$i;Uy#35A-C>ZlbTfi9y2{j<%Z~XPntPL%SQ!dH%bbW6}Jbv2oo#=FX#W z(WNuv&fl0xSmz?|(I{i{I*vd1@q%IiaPcI9kgGT{c4kgwqEFa>4m*)bFY z{O5i#Kb9;!h(dBwTz|`W>faJS|JiE7&hLzwL?ql=zmB5}HnYDa0@Uz9?5P&Tx(%BM zBTrcJ9(`i@qIwj(C^f$_6N7^8(Rkn_$Dq9%Z@%#X1{)W|r#a(&{1gp}b*?(fv5god zEZY-XHZ{ji&ZOVAc_(XF9H#~ji;FIs$fEr)#{OGTbo62GIR!pCLA1REv2*(l>U(+I z__+yq?X|=sKUo|L=I%hTP2@fHu{(F|fTxeKPnr~0Uk@DCqAxtNHQsz>5s?a-q$7y1U1HUm72`-i%|&(Ecdm z4q*JgG@gHHCr(;~=l?AS2>BisIEs`HfMaym_01_NWXY&Gi|a4 zL(3*;-4_`lVX+$z(urCy(ijm}UP*}m(Y=t*Za^NhD8`PS5TE(%St$#6{f+g|Z!=2F z-h}7p_`cnnVnCk`@wuDN<;ab}(X-p(*nOaLJoDTpi~#0iJU0ND28OlGO&EBb;%JU8 zc>ec@y0LxJkoW+7XFE}DckOJ>BQFLI?iv%u4Tz@0L{%V?f&zhUM9AB)VOtF7hY`Un zoDR@&M@ikQ-B03e)SCHr;=_F}q-CuqZ;d>==|F`YTO zV`7|r?ojAloAZIeu#@w^P7G7N`}gx=-dh|$dHwjfF9D|IVx_(kQRm~-ZpSJhh zwvxrM`C#L59AGw}{NKP(*DWK&O`kdxKJiF83n(x$-@oWTHNv*ySX+;AuZpCh;V|RN z?%1?(7jner=s#!x4q-zuZt0t{znnsA{Nh}tvUwX07b});jqUaO(s@JU`H{ou&Nd7JA6*AKZCsjVMuHP>T)i(y8{0bc6K zm}phd+a+?np=^l%rZk6Z?$lMugHGq;szA zEh-s@@gV75UQQbcNkrWVe1d0gFGfJsEB(-en>JQm$D&R8mI6s*JYFoI+-Td zXwXFEx9?I$RnW?EGa>U7Sj#y1%)I3)aDdJ~-tpd5wsm$*oO>D8^hSZOF#DuRVRb*| zP=4xosmA0gmforG|7Dmw5uF9>=V`AEZc#6omqc&hh{yI zgKJpgS~U$O@Db7LUuRf(K^B+)WjE`PZ6KclLtJI(vd#v1@dqDj2u(_V;!$Zwl9ndm z32o^6S~GLQZ|Gt@l6T#plD-q;zkTyKbjba)Ws*iYpkzsY7nG9pexS&YdhUj~?0+=gb}(lO_y- z`3k&jfz08(d24Ve*D#$s@qRM2^uE3OvGf~)x9SiUP(5LW;?dO9*vx{g0U>?yR2axY zbj+AxF?a|jkzRr;fA|)D!Oy4vl#hf{8YUn6sLta`}7PL+t0dW8QOXHzOm&B)T zyfALPcVZmUbAmRIU5`S4+erfe+t7Bgfz9u^H9||A_~Wq`*#>khQs(4uLI>=UP8jqP z(%K!(CxrIQ;$2uU^k8GrowH(`Y_;5JLQ&p?7yKzU`%Y9zFW_a)8bRnywZV%AwLwIK z0sEicO!Ao>T}x>NQvgrn13SJtDRIb&7`zPsll@&dE+WiBip00ZG}g<8$wi8b3hL&o zw5p<9X_W#C>nvk{uak*5r2>UPNIEtiI1+nVJniBP_oHlJ1`q5*D7Rr)JoiHR%py0v zC&AlA4dcVX{TKmk*v#g#K95frKW0cwLh(M3Gy6KQfh;N^YxC zC$TDhCQb_fdYt~N-ikwYeZ0E9D}ycHiHC{Z^seE0wquxF*0!z(XuiXVLcRVJ67@gM&9W|XlTV!`_xSmg9Y zA$u?_;XjKP$Arl}315d-2VM=cXI+H%00vnN+vB%?2QTi=x8382aX{QJc-JTWokmD%?b>6Q z;NOUU$x5ssOoTZ<4S|cE%rzzUi>Ft)smBK&xC5#2Y}Qe<0qHZV-p#dT&+T-7jopwU z&fwrNWav=0HX*ak^7WRDdBroQ%P13e;TXIvt>>&S{`i*OgyzcPDQF*8+Uu|FrhfC$ zaLKTl*G#dLv^oTd>TJN!-Zo}RhNTUFsK?k+*)_~H8B`W?kp0Kiwtw3x>&v=1GJA;i z@0W^Hc8Lqv)z?YeP~%VqX6*a+3k^ZJe_<>)vcYf-Ff4LNaAe;6YzPH89N$<%V@!3@W@|uurT}70f-RUo9>0pi zFs(R>cQMmpxVGw#LFWBNKm19GlAEvGZM#q!hDle=6GiqX-%BumX%5r8>hqY=@)t#j z(kLtr)E7N#e-@s!f&f4txZ->K7{Mn=*sFM?kcYxpgaYgUKfr2_<8!1yMGuM<4rA?M zj>QGph8JI30$3s|p>T=P`FqI6W9x&yM|pMl93m-s+f(#FBwsyA7uQ7$BaSM(^{2FP zJu8mZK+iXh$eTBp_H=}`U}kgMt}~eW--ZCd)wu8&!nh8akL49;@#A~5u%N(}ES`pz zTHi4D0J97t>~qh)s|4o$27Bbe#l*vHgVt%`5w;(W zQ87YAYt|wFz~1b>``QHng!gd>%d1yzw9zBRxCNbFDQtWgt15uQQC)huRo`L+YIhPY z|L%_gpSbOXTYC+M^z9WM+AT^3tN=||>r9~RyiVg>yuJx+&&m%Pb5Pfj@6d-N`kI*EWU}MQHfkr!-+d7aBlV>Z|^^qF3EQ zdEzpAh(a%OMd@Pz+?B!!6WoPMj88na0-%u2$C&DeSFbKUM#X5uN%3R6+TsyE&N+ss z_l|WON9a&B7r+VWqI^T*@Z$Ky0c}B!n1@D)w&4itxZK^5Vb+A)3xH&3Kk?U&Bl9`5A_mZKr~4y`>R`36t{UfhQi zAB5g@_h&f&ueJNg!d$FT)NmufX&;IICpxG^rFeib+1qce?gQ%Icd z;<{9n0RMuBQ5G@m=+$96deldIe&FS86kr9Mlp^FB!;j+xSo#*_8v-u)?HD(}Q+}$e z_GlgR33+rZX^7XJMmWY{alYI=N%SpxRxH75hp!M4`}a^P!Sw)#$xj44$|9qU{ zhMxHGV1CHdg9z|>#$O0;OQwLfmyk9N;@*WlV>F8R7RF+@$IogbF|69l$xElpGZhAo zPdVqr6>p!gja&2WuG@1k@jsk%ZP3gYCZ*+dxER_8&8y03H1jd*p57jl|W!R$8r2lrpmVxq4edi z?So;un=`{LE&z~*;J?1AwEGW~+Z%7?A@Fc_qMPDz-N; zufOTTLQj{(es1oy6YcTeV-Gh9x)pRHS;ooFYqe*8whcz=F-*~q!*v^i&nHS?Uz;9FIRuo(itgNOF9erS1@R}?wD=!T{9U=;VVH{RTa3G+>q zcb+})smX4Y^0imC*xv2cHuLHnTY7soXO>F)<+J-OclTM&B;(O)-_L%r03rBKU_!m0 zz4gX!m|2BrGGj8oYl7us;Z0UgKl!;SHgOsP09D|P#`Q|vsHOKAhQ@vlf)Rr_!zH@a zgOkUlrQgGq0?y;w@4((-Xb6WWTMgw#s2qK`6f7-FoHzmP*uHk`_+dMI_@Ip*n?acu z+W3hnws!p)d-{i~*luQ^(VLCyh0_Q-oU&|8bhMiT*ko+Hk9DQ_r0@1!2jvm>NIE*h|2=0hY-ihL0Z8-{eNGsi_hn zmTDBrlL)0yX6*O6){=ArS$QsVGix#@$nHZ(|8iu4soK z=v!G)Voel!@xqDr;JqVIl)*JsbE@sx-(XLCe?3ABwd8}lQedAucLs%`8qS*CU7#ir z`laYvRn-lAlSQQSPOD9aUY5vM=$ny=AVenpznh&rSqPoJ0t;lgb+~CXmKm{p0+~R} zv@M$&><3S7p$>{%0AT4&xNndJ01@@*0sf0tVKt1??|vf)04%vN8v%fk2mk~>=|t=> z&xUku^P32X?3+}l$4^wF7_!G!y@^|cp;`9$7bF0H5CL_5Aq;=*^b>Gl3j!Ua&c65U zomiSIvPT{ri&aQj00{J+_W8bjP7)yHuS-mtS6(~`ed+-9)7>6M0ALn00M~fdS^xme zI}(;ID5$k3zrE46ZK%h(RRQL3IC%gP#!&;2VJFs@i){hGWVm8CPc~* zsy#K0;#XB6EPz7E(W3>>k1G+5N{1#m2dGdliR%$;8R|G&XUv8Y!Ec* zjKTfrEAVw-E~q_SNKmwOI;Qvl@p>EYLDWaoy~T9(F2Req2)Z=>bU9NVSbBBALE)k+Sv)@;k0tnx=^|DRsw;7(5IU-HpNHKKd0@hOyWW5yZ8gVhou$TKWSO7AT_vR zqWsuPK~Xq0!pyFPH&F|NQG5y*e$E{Aw0w8!0m!+|i{1qad;${w;%7I{GtSV<#|hiV zdNjtOG|tpl<$#QYTY=!?Ph|*#5Wpr-@jN|uAE%@biZLYck_H->>O-yX!UXVIcx5h+ z1V!l=;(Pe{2Qa?N5FV;?;PT|^#(P(AOS&E&qByx^9_Z${V8+rDV zk@zq4A1RgylJb{OhLk*|tf1qjPBzL*N|!p+NuWHObBPNdNDOW%SkeK!9#nn7G6V`V zRJ7b9s0sC>dRJ9Q5Jc6g{-`>0p$MV`#Rcurz>d6BKA{l{00bofzA8+00M2e5KtLTw z?y5ZTlDN45K+GFb{_3Or2~jB=_&J4m;y0=Pb|+CPeB_?$TL_j&AfX-vs?b)K-~^@j zKb1@Qh!w5&)obYEDyEm#^H7~ATz3WdE*oh9;jH|`yNlaZ&+2~~KhZItI8mLFkM6k%_taH-(7b)eQ-hMD_|j*_S3GtSek*!4Qs1NfTR0D> zJfP-q1zYc0$Byh?hXBAI!4n^DU7p)^R`n7JqNrj%3N1RV8rcg-2loo3VBR@ZVE%c- z5?4|WL7IqkRFoz`bzDy?WXM#PGh|8I$OgS6zru?0@+|`sL<^9j9Rzb;X3x9_tK@!# zbfG5NLo^AU#vIiCeVD5{+rR{zx3dkrL+eoRAJbjZ;DY=V1JVKNyh{AhG_ z=!^0Q@H_vKf~YD3=9BPezW)I31kl#*gPE<2VHwt|4<>WHtb$F$(t#u+uEFN@2rjBK zm0g`g`Rku1eV@Q6qB^PSSJLu67|$nI;n8M$|E+zNcW5VmWOM9K{>uU;9MwDc06)}B zxJ#ox_aK^}Pv_d}Fy^LC>4yNoA~tpiC~$el^QVvV17vV)Vu9SZzuCU|t>w4^D6xkh zo@@8qJ(+q22PP|Z>R&q8WR)w=3Glv|U67?Fykbo%O(1CMS&gS$@(nppVf6PPAu{;7Y8=+2(qQZZfK zlgUsUc*Uzh$_|47NI@x$`U~(hij__;#POb`nT0<|_jIGLcVn@Z89*Pio`@7$fWY7T zoXSOVZ#VGOzZR8~NkqZ{KHdQttR9etES0Orr*G2zy>G)y1f-@TASg~WzEvNtZ6XXA z56b&Iv#k>*6j9w44ecuYx0e)`BAioA9XH!x%)5;ljkzTk&QT=d5+Bqs4}A`kWrZ9- z^O>|8G5OTrCX5|og9l(r6O+bdM0{PUmyf=@nH*^?G~KPZ^eocm1(wgoPG;jqfyZS0 zw#hFu*@yWn0;}rIM}Q$0Gf{cRi~T@6ZfqtS(*7L4f(rqq`FFWG7B9{u3e!!vRX`9q zcC6BNq9O6&nv*d2^B~Cdv+V4V-Ufa8wV=(A38OOw;>Tv&ieEqZiA%zK{*-A0>`vT! zSZfm6+uLm?zSd(b2{2{cdb1)+}!*Vg*_2VCIK|^F9%;Jf-D)|Kr@Bc!)Shm}!90Kf(zqcI0q_{kQ-6DjEv-ab%$zpVQaA z@`uwf9Y35hF$T4PqSfen_z7&bzx|&(A;`RqmcwKO1?B-W-TRbxuc(pYs=Q*Gb*y_L zs{1HNe+(NenUvZOf3Onf{~4?+U=H%esc0Pxp#PhjieHAA%nw%`v> zvDp@0Kgw>oB?s#OeK_1z+KbEfqj7%>JcqL>siM!EbWQvR#r((LqpURi^5wl)tJ#Pz z!bB|pTuuM1vvnVCu#CQmSem)j&4nIB!0+Z;=1@0iQ?K1>=Nqb72PfDgk4&SUlI;6G zIATvd^F9I>^C9#c@jA=O8ipyx0yZ}N?4J9l&>ns1d*zrJ+{L)aXFrgER?uk(Fbg4E zo`Mi^%BD_}@IfJSd6V6F_jD`;b+s2?z@oy=A~vyo-2D0Y2?Oo-zdRRd{1kiUsZD$< zA>9ZB6QVG7Zaz=(thv|s20Z(Q(Zd8s{V&8PC?rr|d^wDefy4H7Bc$_86;H`Mi35vMhP#Ig zNPBQt;{+qX^)FEreG6raK?-Jv#O+{0u#Z*6^^Dre5*I=6lw2?s7O$@!{nB7N}@P)3_w_94BARqq++g!%UM&~YP_63K){hKt2oCTd=MfqraC{dG;#p|-oz=wKj-RqH`?%F*)|>_wO%PA zltB0l#fyI9H{Dg*P~x~9J4RJoczbB)5hv>yf#=YcNq=D^=gW;SZRO?N7x3s?I8=tcXB^k_)Ax{ZfZ6#y`ldW|#c}oQI7IPdd=&0+ z!CU#n&mR68{>054gK5uGScR_5ve#6uuqryeLsJ44v-eH z6U>wbxLU{c?&vstgr7;{8s!8kPsIsk1hzIM{O8Hj2s=L~ad(83Mvq={1?szgMS}Db zgGccG=5dG_is*3^Q|}tV@hH~2Ykr7;>+qxg>M00_(g&C!Zh#Nqpq zqsVcbwr|QNy4u>IExusHUjY%&AfWA`{Uc9p_2YQQaoX#i)4ls_@mQmCgUOxZW z7Nae%821?87%$-(e`|{z;S%Rfj1F0KgsnP?<{BSN`WDSof=ii0Y+*(`Ui73Zgooeo zt}lwv#Y!=C{|b!h?d&z~L$PE2HN)7yNCP^IZ3(=u{$LMGx>`)-V6Pq{d5`bLpY}l z7?@#W#>0HZJbeD~^S1s26b_ndQTE8T8#%YuRMy$EXdSQr0Lx`P((RGY%&>(w4neTG z2bRss?Dbdn+WOT6R#A!>ceK=IUOmbl!$sxTNeK}4v7&{k`21t7_8bBL$BrGv#aRy8 z^pkA=oT6(fYsO4*rk6C!d-dsxi>*@#1Ee8zya-|I z25?$!dokaC+buWSy$_GEE}Yq3esPl>*jYglV|kLXLdJ%eX?rJzI5oS6i@X zgxzw_ScFjf+SYaXwsGA78=9SBx1xcbIW!4|bc^lWmTw!@me>(Ylb4}1q5hGc(Z@CX zP#=Y25pPuaZ>V2$9RUrhkum&;I4`O$ua2FwKju9=tRrl}oo3ZmIo7Kn}< zDYqxSvCejGKF=5#Yxh1l9Kn`UXd{}RH17%9wu0*=x`byae^@KEH<0_9^FBu$K3t4q z5!O)=BAEpJaWuj*ZVEpTY=Lnpm@(|%?z_s_fUAu&SQ0r5jqC(G6gU7j0_Csq<4`;q zK>g95!#*(-Rf_l#c7`0v9V zm2hb1^|0LXLIO<2L3@+`<6<=i*on3Tt-X44te8OE@9DLf^))5a%lFD1>6_qWx z6c$f5oMHH+)}o$yVEzhL?)b)B?3TwI4spCJUQ89=|0HlBQ|zh+;i0zHvo4wGcb**S zR3D94GFKbOYMW}$c{Qqc%Hex5J!>ulNwrg}_@UsCg78BUO0Y@n4T6;r*cu2(h$krR zb>;46>%Glr6)|Li*_AwH$+0WvGPSn)bSr#2LOc(#zgyvFNZ>>GXuVMxw5O2(K;R(~ z22MWT@XeXM3>Hpxsz}81R36%qiCOUDx5P3@&V%OfB}XC`0X1W$MF0%Hlx97heSpax$YYk&MAgRGBLcbR-*5oHms64MD zN7fnoQKj&i4=O<@g`|>1K#>1Abrubo57^QO{=?N1|CUin)2}A(znpXnf z;Tx4oXHW|He<>?Fi_pPIJCR>v%?KR~96rQ`jTl171A$)+sg9aJJ%+*L+eg0hL3K+# zYj~@TCGq2v7>(lQ?bIMvnsAzbBCw$+w7p(3D>2|= z7XVLw|24{;V}JEmx7x^TCK9jT08Fsd`PFBR<(-8Ax!ayuw$tXqti1oTGpt7{fQTBT zm#AY6W^mPfsAr{DnN`<}ZAVdUrA18N{bTgq7Z8Q>Pm`4fqx?2X3adMd2Wa`Fg;#cy)0Cw+SDbt)E8A)UAmJ;3wX**ZUT5HPuK1T4=qx@ z&=AkfQ!5)a46rmotB(r-;oglgB;U6UNXZrCpLPxZuEfd4g2(vLgRC#+>JpF;3kyrA z!*iHjDntN9LI5(YHVBIW(2iAmhM)DFTuQ% zrFIx=13K{K_Md3V03I>$+-4%eOOK|-c_wDl;rg^NaGN^p*S_=4bVRFjgDu(Qa8@f!ly@bHGovuYK(v2qxLI z4>kDfG)!Fgq}5|w?|WeYKKaCMd+V*Omd%0Yfd}Tn7#>QW7cMgA-N*s=s6F@8ddi+) z^RCUbPk;6rh)pRRuv-xT*lO>;mxoC|_4$avO=k-ldfE`Okzn&T3=QI&Z<}mm#`T2> zo#1~m!S~KPxoF$JPyd(on{Jpkl+V*1Fc~Xs@{BQd^L-O-cur62f?s+U;L}7vyn5=g z;82a#U^20;8YZ<>VuhzKjLKBj)GoLu$fZB+M~E&74TFA|*sF3ad1f^4Z(6TfS{mIY z$8F%X^v2N;I1-rCi?D>Sox@uL2fMyVOdo<+GQj@gFK*(nhe`ZA_?Gx04_>20h z?y>YKAEHlDC*`JjyknnLpP-xb7vgxo_k^8(lnrqdOLKV}9Oc^yW~Y=6Uva`**(o38 zt@OI$GVs`jkC)BADuQPf-c)8iIRFn5?jfB%_(u;HT)nly^mt+aq%6bN5Y>OzKAZrXqyM`tEh-84=1|Rq9{km-d7gJUI?sa4o_3fA_tO2*AuilK~3=9B>5Vv|Ipe zJj_^<3xKOH5CF(8Y_{dgS1}$kF~JGZT&6cUGYL>J{jPEldQ zbEpUU6#u;J7nC%9(Y{S7N$W7e^F{4Ibj8yZXXWsYk%^7 z6XBv~?T0SLJ;K=m#qb4GF?DD0)YBC*3ZFth(Q{n3b{G!gqMx{L#kpM+p+i6%S3w=0 zV=OyF{k0#xpT`B@F1&Qb;d+nr?ufI0SHuo!^m-9)5$qU-;^^x99zw%!$Gqe4j&LtX z8{^&X5Km_q zKgs!;9l_;U<~X%C5JYu(o$q6F`SLNY{cs{0q{_2F+BEn*cgDR^Xl>@MwN?Ada4DRp zsH}DD?;A)Xn1SdFe8nZH&YdE<`F5K$vHx@Vx)*^*8l3WPuKm3T0|KmbK#zprAD$X@ zOGDbPr{Hhg%L-2NeJ){Y5vP)q@vEMi;wZ_-y!OQ+SUHgo93@~Nm~s6J7m*@#uInNy z5->Whe@;9Bn*Mn~sTZ$>=#Zo~)4K{7dTn?M@uM+MkU~9Af$_^LjVDrtBvCuJMTp{k z^eyhE08l2N8SW9-%L4HJOM5#eF%lhOdwBF7=kZZ6cFEPn5t=Cbdco4pC5anZhZg;o#k9?wmotuB>^=MM}CE1f|| z`jt2HEcZw)+Qw7RJnzqbS#zbz#~!An8VdmUEkAyieF_2qb2y);MR@RCmKUFT<^%TA z6}IrY>FlGkaET|nOBg0`S>&E_!`2$kha2tMxtX?b{%|*I9Wy089`KZ>n)Y;Aojvp1 zdbB=|aaO$3W+DI}D|_lZOmQf>)FEts0$=n8VE!YdTvKK((ELV?#oEzi1RlquIgMFv zDXMJQP-ZVZe-JlGr)=)^gV5NWXSE2m|Ln&bZ9CTS(t7rf1OTvZkkJDn?kWTT_PGUs zb2a#WM%!UXW-1!_l>fT^OlF#QF-M=*V$VOd4ej^CcFlruxN@3e`*sx}489rW{&~Ca z!6mpEONXI<#(wgn)poY3x1S|67Y`bkZYj7MJALLTjQXDJ-4@yj7o7eO;pG$1*gj!* z-8RbW@x+jN*;~nfgJqaZ?KB$qgcVa$?DH0ahBxF z29bE|#C}-ptF(PP&TtkPY7aj?*>a{NBNTw!hu4nSYrou%Wzl-Odck13=aEU!E(Y4# zRmW}R+goke$R75lSBV zrLTwW-F22T?K)S;%FfmqKA$sDEwsI{oWuJ#L?Hy%gU@fI z{&wO5ps%Il3Q%rdd#5$ot+$N9s#^}iv{m-h(_3(NS3sT;0LX#nkcCUudVBi0eYRoa z3EaFkLpK;=3$7bMKQ?F~hoM(Au)pp}AF0G*U~ii(Zo^g0tC|cWF>oUI@*t$c6e_5$e|*B5R8S2DCyq z9b(sBJJx2;9&WW&T@jeyPaPby#Y<84&>40}GO!qczL+q7Fds=d;5!Hayt(3xEol<~ zkoLZ486D>U(zUHldem4}1eAelny`*>7^@bCp@XK_V^{!KxMYyi@GrTT`DD@lqxnob zhN`M2`|%GB;MU^=mME}B@GA%aXp8sKvJ=p!_M-ug0Kg|lqi}Mu0D$NNhYp^xZ~x0$ z+r6#D-DlkQ&~VEh)suaX%B*s#f;wCZ(xo{!sspXM+CMhXW<`vr{Rd89R=$KjmWHd9 zQJnYsvUk&-N(tKl=;c4x1?rm9Wi~&*u-cBG#ecfEoVfv)uA_%QV;#oWl)#wwqO2SI zD!%+ymz2~%pUKCKWT9(UkHjSZ$V~V-tS?=elc7X=WNQ5*>O}P?M6@=l$0wm2gBxJZ z$GJy}>`X;1b8%m^{xh+J+Sig(gA$<9Na0g^^wVc*u`pAN#n^J|mXvHmvWD6~T-YWc z45Zzi@1=dSPX?gl?aTlOJOpJ*{?WUmLLo)#6Msm`cA~z@>agOeG`?=D@imB4A-Yrq z7Dw&*MJrO=Sj*Wh@hVKwi6isu;!%XPUVCye!TAR)SK=XGq5y(-BDxQIzKaJTt^ZW^ z02-ckFlObBw*jWMGn&bu3;TO77x?MS?R*0Ukj^y@Uvc>7^#V*U3;BsY?^^a0C8l)+ znpEH$E1m=ZTxdY`AlzgT0=lm13Q!?0-}>=Fe5LUd0J!SiaeWpWDQ)dD}|%t=v*fu0M&u^ zOl`{6KvaE6;6YO}oe4AiUK-|7)p>v!>WX?0K(7b6LF7BFq%gNe;LK|9bPf<-gtL%R zEY6qIn%7-uZ^3E5ydA*H>C38b(#X1i+FS0L6F@{RB$AU7_=7hLo{b0u)i5u}S_0e~ z_HVeMRo|r@L;KK!oH;HSnj3%%PJw?5R>adKCcCH60h7z)s7{4qXnx1rG3K4xB9ZEy z@7$G2?coR1Xbh?EhOy#R?$4edK!czJbwfEte^AqDtO*uD9ESO?e#^6Hr-AuTdxz%p zZ|>57ZWqq$UR$9&z*9cLU1_Bpt3PS|r&4!);A6|=zuH`5@+|uk@dz6bK53TK1C@p{ z1h;2udjL`Q67tdfcOEMy-mc_vbngax?q4GTfETs}0RYdOGN|HI0cvc8`GBWH1p73t zhVqUp`1($Rs$!+R?h_laH0iiDyE=h7Jn&R0bUkZ0*J`JZ6>X#i#*=i|6VO{E%UEX#kO#{=+b$Ghs4W>Ca0V21aOa%o?X8BefXErv-$g;)eoi zWDA}Op|HzcYHWQ|8DLzqc;sQi<{+*B%4%VN^dDd&VE!eEUP5L2fJI^kl1b=XN=tYv z9aKzz9;qF5o)9KKtLjDav*(k7H#!l|celLU23z&oUMo7j-|j_1`~UmHYgjxT8R|(m zg^MaCUt<%2Y1!uw*$Xdhx2tClu|NOwc`#RCI4fW8r7Ev3C01{}!Ua4D031Brj0=Du z0Pp|;01rQe0D#=tf`2IC6<}QElW>*Af-ReC?4SPOJ)h9N_(i0!7Y+^Oi^@g~IRsky zGLRTV45ZU%T3{$1gsJo@=E8>CUw-vo%xkF+s_oi<`5;vMqsPwLPoLUlzj$G{U3{2@?$@X~HsL%H#@-<%=2-JquqbG!BFlvDNSSp!OA0 zyir6uCbR?*--HA)H4!)wk3^d6x>Khv1i<1VKj`OKP^uvES7Q>d6{&NXua~(OZ5p(Y zX&i#Emr=M$lfMy3a*Z`cKk>kwxO$BjZB1Y*V|Pi!aEU3e>eXbSKP`eH;Hi6PVF~uK{ z$r{Vxpp`i!1B)GO^wN2*uS?@io7%h+ zXVBC<#wNakan_G9Hy*7{{6PDr#j7Kj>01U^Z`2vUx+g(s#)TnIAdYr@RDI~*ZxRm{i%W^rKZ?)h5{k!=F z@#MAlZT`GDY+!oY)@^9~_i08WdNw8od)w1k-8hwBVD~?;)bH=Uv%wZET!IPxGWx<< zn>1|@W%t}O zx@}%mRjZmr6E7-gvETc`zq*gV|N6%dfhyG~1D&nts(d`)r1~KHk{r&%0Z7WwE zq)#W=Ew@g$#W&zD4`P8VgJ>gAhozhMR-QyU{e8wgeg}Kj+wXq`vzD_5(so@j$GFW_ zuR4YRfDZM++!F=2)HH|=_^Pa-UP|d-BeOFQ9GHPddj@lg@AV+OoyUp*CK@;GhY*HF z57sQMnLF7|=2u~caSsHm*>?Tyqbwr}*hw0zNQi=0D+Gj=#;#V2kI!TK&)D{Lm^Fit zb^Z0DDZ>~nb0lM;d^5y^T-W@WG;ut0^%2Zt9>w&3=>G}H+ORco2x+9B^s~iFWJYix z{qKxD_Z+?o5isc4t2CPv7T_O!ldX7tA0|1oScB@Bqt4JzhGBu`DlFR!a!JSa>x=Af{`Ng9D3aBLZf+KG z_Ux%>eQadkQDwK?Hq+)W7=tx~LQMH@uspPd#*LfKdWMh1jQ$Ykrr100zQH&d?*yeC z+xO6JeIbI(f&g^F-dnZKX3iW>ze>T+=_)tr`S7Eo8T;MwkGKk#7iTg1E&+pPcePPl z-IYB@hHIL%VwSGDyu@6JmmF_H zK}8^LIfTrOn-4K}7uy}T-(W)#0PrP~Z^!e_Fz;-%ky+%yI@!CI)?SWUZ9r6%wi?q5 z7YQ$WeRREDHt9tlu9VM3k^h4OI@Xc!?)?5AjNb3EzhVt&trqbh?%O_gX+yQ5_rka< zdb9H4AGmwC2qbK>xJ2-7f*>d&u=Y#}*7;a_aG7<~-aeRsY;fX+r17;klV*ta{@PpD z)z$Ofgr*x7dC1@_XVyCGXg4|WCGJ^#(OFH1b7_CAy|?ht+|b1S-_O!aCK}6nR^GaF z=1@NI5SO5V;xxdhS3K?6bsljIi>O@MhbJIBEP(^TmK7ZB&yyf@>bxP-r>Y8>ZWL)J z8Ou8ov{NS4_)gY*lZaq}_7=)3DN)3+*uOVKMeGVEK(Li&u?RpC0O&^fd=En!Y4?P) z1#JROf}#A{+lQyN`cNL>n|?!6b%?F9t0JOHutGzIy41Vs;dj^n`x=P10l&#s;{QF? z{}DOHJ-Bl}C0vzv(cVw-;<#~t?~Hdxm>M_yWBw>bgMay($L+vT1OTx9HgkG90z#3- z97#&cYVCs$_rbWSM(B2e&6NNE763w9Vr2*cfS*780dr2hU3cA7_CJ`C$5g+Doe#YT z4KWhdZ^qR3^38Vr0?w2Y0KnvPh!f*ZWab-@BMQ&dL7!Ozvl7c;_uU0^J)Jp;Gxymh zD=MnCZQIK@lNO*|Edl&6Mo@4ATyS|&qm4s?vO_;dbXRX*Cq2cZ#_5@(3r z^T2%Qj}7+oA8)ZO>kq+*?PCu@4NQMPbyKVn%UdvQ*gZQBv}eE+>YZr1(Y`){&4@61Nf;iSF!))w6E z4aRlcRR}mFV*>uTz4r1R8<0L8#`{PFNjE|x%0uhO3^l2iZf9O~!&jBIiu3uf2fA{EFRHiXiIM3x?R;4^M!ZJiykiI*Fpd4$BwZ#3sIIKSK=bNiTQ{7sS6|xBdB51s@_hg_jGJ#9 zi^b8AZvF0+<;7U}%*E1Lu`>_9@}=2!)wCq`-Y4zFSMp#Mp62|OgtdUl2!Ra7mEb`v zXmPG??92JFk#(%j-4|XxXBw7Zd*f#v>s%!T&?m6VfYmOY(`#U8SE5NS%cseyiJTMr zxTfc@tPC56FZRr=-q5Lg*nmOZT<}|r_IF@jzx@0TJ68eS2TkC9eS6sb_l!a~K}unX zoMVsSu40F46)(BrTIAA>$-}H~|L!Pal-d#M>dfi0(A2~Q(O8vWaH9<#l!Vm^EI$lRM@ZwOm6RQ~>z53- zJMNrhS=rKZ_u=4aw2ao^O5r=-*lMpYKVvuG0^p%f;sO8*0Af%DxPIfO;~b?|1{Fb? z&T1q8@HTb$+)?T;)jsw499wYx0N<;`sXNXkaaep0>v0GY!R?9s=@*^F6(BJExfC6ac5qU)YO@!;G4y2b?nK5_R%yX$^@ z(PwF&b>W;BPaPrq~& zHijVBBa0^5XRE$tX^V3>^t7VFaw~v7U4wRaN?NLG{ikD1S~Mpy{s9^AAf5Vv==oyE zN5P?Ui8-iPgoiz-@Ydd!y*(eK`P{@FUf)D3*SSJ_>=~pKWuTRP)Z%5E3u{%0E*`z_+oxLZXvrM03aOT2RTni6B%&C5N+izT%oR%RCT7h z0tjtM{c!e4qM?!{Ai;S?KG&tZdk&sK6?}kNnAkE|Ps@b%As^U0UKaUbZ{aN1Ro?-w z{JkZ-(5k=Cj*6_d6QeIrslxV7X$7tgrYIQ8mP8ay$g3Wm5QimAwg;A z3e70E!V^TPv^VGHLN{CN7C8eAii++{{7qzn#jn&VZp+%^U zl+lqr8|~SzM=k)~+FL_eNJw%KG<@};fa^Sc%V7hA(Otz_0MpC#4Y2t**MTOBtK-(n@ql;iK zJFj72g_!Cf9*YMrM;zbp`l3HIrdrEmhI_|s2x-6KG>V|X3R9MipL~uTJ5>(#BZZB5 zCd?Xow-zQEyqS*Om4;jQ`c0kV&H1Q`@oFr&_)w%~`$%S&|CMR76aw=kvj)YBXBr_|m4;;T0zJneIfERE9@V)Q7f|l=8`x+JiBsr_W<^w8# zp-k$NhS@eO06euD0f3!0fAMsC35uyO{lg+a1E2!xUbUvI0TYJPxpiWIBYj zq(mR&HEb5^8N5z>qyXwaVZo2fM`j9xswN>A-xNeRC_n$^WeJm{#)Xe};wY}e(s)t1 z6;E>k2^G(!u!J}7J~0B$wS8DbwJ@mzsyBN!q?NFP_id!ol(*&uZv*1`q(pqV7?BUQ zX2y~PAJ5_cr2y^wilQRsmU_z`Ih+GaHVnj6FKY~6@hd9NA%Jrd=I$vLPVK_{V z0T3Rf*`#_^zT~0ILE7gM$1eN?Y@;zGyj4cpm*olxz8*+~)+5|=3ay6%4uL5)9n*dz z*?{(fu@m}yfTOW|4(kkgC(1E1cNh)n(;T4sB4LiNz|7tp9;i#<@b7S`w$;4IVsOC2 zl>3UKwrtr(q~j~ld>C%mE}Uw!=itu~h36*Br$71K4{h!0BI>%ymfSqnKKZGsmWxlh z=bqVuwS@$eDXs&#_@QI5{>H}kSG8+E5m}WZ(Gj^KIm^lSv#Zj29 z@7m(US7WAeFihq*Z9v8_HlDo@x;SgIuNlk22BBfwJ_rp1k@oGwfffOPKmLS$;fq7O z|Go6m8T;lp-ewHfxXYM7{G(YM_Huk)RCB7+d5hA4&$ID*>ZfaA!kxB7i|5dmFx!43 z0RZ)3`Ydxu4Giw*eodn8u$4 zu_zO%X*P(OYQTl52(1n_RN&A4^#uR`KmbWZK~z&-R*&iX6#Mbd*4ulS?!57iCAQ#} zkqD`QFhqEb`4(*g8X@ds$#KofJX`U?8at0xfgv0+|Jor)&dm)B_j_z$aaF;R_g#3{@LjaZ{tXQR*#`O`nX55b>i`_n&r8b51j z9wuVmvj!Zdq}%5|do{u+5)cz}^*nv)u>Jpk_a1ZJFsrOV%lg(E@PXOK-dnxWvPbl> zyY7@J|9-Z1&0%}G~y0Zm^#{y%ItY)<(vU!EEH~jFnl`-&s4Ddx*7iJeG*A z!hJ@rojAV79(`mn!Z0QFt#7|-U;KmLvpeqUYh}3E_|cQAt>9!62lgE1=d-qP!#?Ih z2$~2I_2iJ)pTqnS;K>){aLh}N#kE2v+9KD?9c|O542IyNuLr6vb;+KyK=X=nnz z+@-bVqI8`jcZRF)G0gb>QE(KGzboO=IorIH z@tJB{vvx0YbGhAn&n*a{1>&^!FvpLV+WS}l7?Cy7CglvZ-aWP3l&rNXC#s;fwh_Q6 zOplkmLdjzsFB#=y1$M~)W5vH*B;lj$Qg~nKTS)csf8%odU?mw1@7KRoIU;bsyZuHr z(0QMy)(O2pJ)Zrn<}lV}5hpxc8(Jn{wtxQ3?=-E>$I|-InY9sVZ)xqT#l_s0JF3dc z8V=!Dzu~{VV-0ka+g7k-x{AY5PH2qU5zhC>ZYzAP7DJqL?@GKZ|X)44~b zR8@+wAVCM68x;^+HjuVgqI^E~N`?rOLOhwcL?D1OpDYg~6PC(8TZAp0fs}s_gq?LZ z()o#3*H+P9I?xhS3R;A@E3~A_p%(Ij`Q6K;Xz`^w5t6^V{@rVUnr^$|8uw);3ia>t zhqjpi*&kG@OBE`vjZ1yIT$!0OyuT`KN4PPJ7-q-x9mC>y9lsOS28st>MfN{k(qu1V z0pJiO^&h-X768&YM`>7Y?<19~o~W$0l%oGqk&R+Per?mt%f@-oi|~>!Asp!~5BX@1DTg z-%cAjF4^w9cM$^a4fczt-b8pg-OjPDm6a86Mx0@buIIdsiv5mlSeaUN#By_wfp-1K(zSCk?&&q_hFonL|inWPtXx^8ye&UJ`CVEOz3#M}G=qux3K8{3lzX;1&xvcS3 zzV=A5tF;A7c->NXVBMuG{WzZ|qvhK(t%s%d>V|+rKbv|Ln#&W?5E?+>{`5KbU;pMS zd#tVsp}zA~obQI(XFfgE7A@=z+(fkfPob2B6$kp_g6poc$gImo_kH zGJ{z+Ws$Ow^%^Ci=46y=DzQ>90A;957|h49YH$*zkR)hAsZ9QeIo82N5dpV&>rP8Z9B9UYsIZ*9DU~-+YoY* z0Kf=)=urs(T*(4JG!JP4VytV9k(-g%SM0adZ<$gI<)w7RtClLdgE|M&pR{O-_Z#-gAxgz{={ zMkFRQl~)1)#YJ_vJy?hJkOsRIfuOtY8;16H5N5huKJnbEeyM$-giVgq=KJ@bV2;J2 zDN2x2ri_Jl0~1=zAui3KzP}NYKA~QWzeoHn{0VI$A%`a1cAmzS%Q2Yk^)`5L214&y zD2%YqFs@WSrwvmywtiT|taod6hv~0Ubj!pl$;jb@pxt1(3QHAgZ1p|$KBu>P*{@tL zZi1Vfnwqinio(lbl(vqd=yjekK4|bz#`F;D(-+s!>`6t_Ri6}nuNj?TL$#Rw)XK&J2G+9YcHt^%LKtirL8epsuC0Nc-U~;4Lf#TMy3f@pR&k z5l*lyhp8^SK9tVO$^xnVxfV(yNn2fe_n=`M!jy;ag$0|-^P`VBGZ}a~L#W>Lu6(43 zs!WxS_S52HsLRQxxCF7pA8Ejia4mGgdU#~2zpkX`A+XGZ3$R>qPz556APZl?)V=Kt zLR>NNRUfJYKO014i_j&#kWv{`_evjND9m{gpf9>5pS(VG&WP(tVfxe61ma>Yi}^3* zOmCB@J!KJ5M=@9q)Q9>V9aXdn$Bl0)vNZ9%zY!!x zH$@@6fY3Sli|a9H_LGqMWtebLHtNA2{f!W>EARl<7W#yGMG|MYUihh(MG53M5UfL3 z0;@r_2$nRtG>KvKoq2fEo7- zwPjE^4GeeZ)lpxqw2SvsVEMUHd@JG#c&I;}J5kmJF9}Add>)@?iNGigLxb;>UF{AW zkK?sM{7_M(QH3k5U@J2Cl8^T9EN($UF1YAiAqV0rBgNN0PwD|4)}B0ca_{JBT#p#XQ~Hm%)X{}k zoE?p?N-sn!bNAj;Rt7_I6n<=`UzNp#6<}#GQ~N6y$AbsqsCRFC9@KGk*wJ^DNFNm@ z{M4cJQk;)=p*BbFd}s?7jIh7?pSQ9h4V~N5C>@uIq=8#j-hwt_f&KW$n}~N7P57HI zg*?c=ca{0YsD9~wr0NL4!Cd%5beV43wd=fn>su>uc~E2zKQb2+*VB=-72cYht^@;w zRB3G&WeN@E3#27)4VslO?Th!B*V%)Zxv8F8a}8T_nMWm-Zn5 zumU3d1k8TlfnW9x0ss*(^+7Fg5&-zg&v)7jNP6FP*IfJjm!`OMP}uO%E@3!?g*G%r zs4j3*`)IQ5riD@e_^#&C7}1=j29;@iEi5{O`hrCywUH+7xF4zhd|}r&l0g^q+GI}F z8{e2HAP)LOLt?eB%BnIbiuzL^ED8@#q;5%miU@4*5Zw4u4D~(F3mB?rO|D_`IV_)117 zfNe~`$4f%m4i}{%&roAbzkCVh^EpkEYS$#B)6lF&KxxbN{g@!?iRr_uY|5koXfVqZ zYFxK!0X9o8ItvSHIIJIGQ(xr7+a)lYhYjn=0fIhAcK?=_@)Xu$upYr&-Kuwr?S<#p zqAA{JITJHsE|0_KT_y_b$Y>Fx`N)H4!*6%9e-fOiJy(gzuakDoHDheyqM5c6&46D#yBtE%1hhJ) z+tW|IMSJzaJar#7+$Hz~oWO>$2~G1{%;^oZ^gbC7d^XvazI2m)`46+a8c&^UvA_B2 zS8ers9BTXYvOoGSb6{GJ3jzR&p}yoX`Qbrk)--M;I0b*5OFiJ%Z4}xZA(UDy&g|Y* zZh!d~@1kvA2C-xw!b@Yo2T5@L)l=^xo=G!r7(O1$O6p-6Z^Kvo0r0@ZMPj`@_V^;q z%w;lP??pr8FzyY+B+!PV!7>IV+oPYyO2GArcIs5KeeWMu+hN?!%(yBO-}RH2C;Pkf zv_`Yj;wg^Cko-%Pm$uq>zxTRr-F4jVeDGGgdI@e1`m))@{JbWru9*I7#qGn%Lsj;I zgd+~4#n&okL#=)4GxO*RnGms#*sII;VdAfe{*hvJwU`}7;xGZ%0?cBTh$j2UNrUaW zr8$0>UGx4nEC`&kl}Y08wlV zCN~dR(aF8GaPCn1AAfb9?K{+9fAzJW(Vvr;lh32wP-~BUY99U`Cqbm5kjz6TPS)BF z=+nzyJj`afKbxF$xCXexEfyR*dJrv!379RM2;r#3UPh~=;M5_z^Ny(qp^ULV{qL_6 ze;^tSL+OuOA!uEN@I{p!g5WZJY7WH4sklDai}d+H``l+2yUEFKe&-!~^wW>q{f`W? z0|!srvrnOQQ;zS&euE)`(8tlLNJvPApx0=_M-4$!2|v4j0VAJ{PNJdgoQ&)F9XWau;(@6zOs?qVI7$!HVH^e2%|+hL?b) zxLWk$w3mqTae}lMdZDhA&qo3J4RN>#{H1a68j02`RkP0cxl>)Li+es)7rE z%;69KYCx608V9=z09FlOKik^V`;pp4*T<<}uZ0l(*Zx&LA1AMm%0Rg2>I|fgT?`w9_dAQ*_5PxlbP zK}_vFeekyn^WIJ8b5DhPB%(r?UW6k(C{Q}UQ$!t|S+qB1l@%dKm@7^wf)}%`ym1#) zXvb%d6@EfKeAf4lad_6Z3%(OYRtt2A!KL!(D53pr0|YGXHAHw6lV5+%WEWxp7w!tH zs;YtLTTeYUxX?f&g7C__8OnnQboDY@SbfeJ{rcc%3&xO`{W>@3tkkWGm@qw@A&~^Z zttW!LsXcqZ?C1e82@6X61ttX6)Tr(rs(bDt%=wv01yIH53dJF-=m9)Ko$5CV^N5{) zuJo;Q+~2*&HPE@%ysqP_k0R;yH{DLe`Tcg><5GKRJD}tx?eMPem%BQ`(3m1#+n%W- z+&JE);CP}=AEG?llJV|AqUj+dc&gf7;OtRc*3CYJWyk4L(>O0CkbOvZ0^#7zvsWDq^Gut+5P^l+ zxB<+BxQxKG=BQ@ef4ccy&QUTsd+JmT+WZIX9rCVW-kE~{@q>?E50mr*u@-zM7w_fEu*y9EEbV!9t(Uf66qc5xmY zG1abLGMRH?rM>dR4#moEX|0fw+ zL+sPI0JvsB-?q6S%q2?D`BLftL$uS9QW*2!+F`G~Qj7-w_(%XiLizC=(>cA$5W+-5 zd1+Z5b3(3-7@5LZe=Ncl16}aYa{vkL`b8H$U3|`d_{0`0YgF2z8;0Ax4~|5rggu}$ z;{@>1`RR-1w(9C8=8SSXa3BvFM>WDR18wT$Y%D*d`MxXS-$YQ9Du#J!xJ3A^yTsR! zZ|~gPV&ic~S6_NB^6I^-otUo33OPTPecj2#K(ap8L_P>Bl zNJDz@J0#faWl~%vi2fX3Jx7<95kwS6Fm)-N9$g7h?+lKZH>B@MG3bH<+;ygKhPxw795Q03K^=+bqxM1R zk;9U3^?DL`d4E;v)V~pYd^XGy|jO~Csgc?B5YKpa((+ESTnjc_GcA;iZx z&mNl7!C%pox7Pu8LOnq5x>V;bz#%vSp)mdO?DLxfxIDUk6z(C!jlU_3XVrl&)ti|9 z%1iLQet1^@5dI#GG`jnD!t~}%5FY)TuYbT%dgUqn^kMtPHTJ*%?2F9H!>!AKa*Y_m z$z8y`V^Nu^=+GcMC>^a8OEdWg!t`C2rxOCa$CaQ|gb1`tA1G>VO|u=s?C^0mC4DiA zJAL{{CfA-25YTK^&nC7cFk(pt0ydt-F9!^YPZ}t8HUpmXJk1B`iU;ZS0^nhYPMxB96_seD;wc-`?LRk z14QYdZ4w4lgg{i1IQ>O;!DF}5P~X+ouB)~0KJhY=JLfPRzQ8{5i5yHh3gi zKzYS~3RG7Pb)v~k0szaGAF!`~V>SNc=G$lS={0(EAdYDP)%9_()uyT#jk;G}$+ho1 zu>x(&5!BN?Hf^f3Y1AL1iUOGGNsFkoha~{;((=9dI$L62`0{87eXTB~6rt$3)7u>n zP3V#$lfaGl1b)O%(`XbiN?CZg?))hqUB1?E*L)}G8?`h4{Z0t~XlunMOoLeQnX^JQ z5m|&rU7`_sK16m2CxZ1wi-h3mSNAX&G=3u3`r=jTUp~+h!oHlB)(~qRT*`KRtk6sAIHLBvuLVP_^)y)qG0;s!(9u5`hYeXG7A$ThBOUz zX79bX8wP(q8olW-ptCFs6XU6D)P#fME*y9)#|+vLr0Y-S9kyW*6lS5pJ8TH%nJ}*h zIg`06%nzPO+4v=7V$AujIuf41Rz0>N1c0|x_Y<`@_k?ZOv=4@10)2EgLL~z@C?f>m z^`h82H;9OZxEjbb>Q_E3fB67&l%eNlaK z7KOpnX#eYP-?R@uIKpC>hz9;lOtrzlM2M!M0)Ktm^O+9{@!>YxUVUY+NlKmB21(Yg zjN^sWdpec_)}SR(ju!Mx_h0_nYujxw=B7XY#RY7fxCX=c2xCKC$E%d@7uW2C^?cD= z43H0X%oBTdSJ>bE-K(}{%?TTa3Hv|#;~QaSBNf%!0HGS!E%!iV>; zzA)5JLwI@J>+&qV?&r=QV|U(l6&6;C@d23Y!WzkF{WT!*-@9*ueeNrF*obK|?bl>K z`PM4SW6f-7JcpLUXb418@fDZh{Vr^dL*bg6n2cDozx~8}_Tk38_KAmXvul=)v>v_j z4a@|@R>=}DVP98XXYVZEZ?8VL*7~Q7VC~houe2|Ic`*cr!Qi^x-hJl?Wu>kFtvS@k zJrjmDSJs{FP0Bg^O5O?qX((nL3-Ft{!;W#l>WU_OLYG8Li6vqgA(6gV!dh9u!LK)3 zLQ|Q0k73%g%F=obfho`pVnZ<|qR!d0390rcfAWy6`moBr_k(4uKWGB>Xt2j0pMx3D z9GIJIp4sr7Z|;F+bb@W0+(`Q<7E4tnA$V5+XUOJhSb_W|LZEt%$^M)V*qg0afrW~aI`@V9kc~=pP2+LBxvjPO04*5SZ@Bk6MO~xr3i8SDCn{`2X^VNIyqc1A0@j&`ZlN^C(h-{ z5(Bw145f}Cs9ECJzW(W(2ZXu5zA4dOT)x}(xJsXYoCH z_uUI1?4>e}SYsGVMMW+4%r9QU++(`UpNrXAd=F}Uk8`d-@Mi70QwYm!Ljd5`-~xa( zN9&ZwiV!R=u0#M}k6QqE@WI=I0DvN}ylvim*w(zi#imW3V$&xNXFeD80096mQCq1f zU|d=yjKlTZ`HJJk_xOAKexZB4#lI9Rg~f5>yWn()8xI&Si^4m6Q`E~|9pOch zVpwq+@4I>-uA`zK^=IuNI;W5G<+>`BIB_;mSTD#fZET6;Cis1Nn}myfi{rxQQ3R@c3-gF)W4_$I)Gv z;s#itr}Q4Gdw}V%h|@8?qQt|YV_P{$0t7h@_b`>u;kN%Mj;ciaby+H^ti*KYxkk=^ z4V*6<5x|g^BQDO^L`$%@6y`-mMYXq`irm~RD-3KzXwTG?WY)|SXYT3zDS=!Gfu{9N zW&bMI1bt~Exg(%2@aM!mC(d~(K^PLKHtYIxM8p1H<2g)&G4_`zh!;tvx%g@ijnhZq z_2Gi~)dMaDaK(^zn3syyp7*7`wufCAN_)KD#=xP`i0 zdWC;f9v7sIGbE87J#E`V6f=I0Sn9758sYNSi*4Q7-JFZMLubS7UuiYWm_9c9>S_3sAH_I_K85wIVZ(dEnC*o* zdQ7En*>Bk+(h&3=feG{!7;RPd%jfpM>^{XDkFwFcAu#3_pm@||&p*4(wyeuTqdWn@ zfPr?`15<7Mq;&RXXYK7b_F#Rp5yqU%#lv)eZ>#l4sj*Lf_7=_(DV*t1073xZ`DZqB z=09LFas7AI^s6`r6=9KSn@ydO219-kmOE?g$KQV&jqzT%513`gIZJO|S7>L7YHJZNP-5qRroW5yGKYj(pz6vT!Nr5_ekwzTIE5UH z;f${vZ<`or;UQj6B)Ug_v^kz(zua(yNQxty{(OTlMLiIgb5l^e{3M4YE@iw z&78RD=Gi#rKqruOH#D4zul?gvA^>Orz!3mO0QeaLfbtyon~pu>r!-~{9`#Q=wwCd< z1)9(=?)&15JOV()P4W~{hBCn^(VgO}D9FDm+4k?RkAMEh z$Hg2eayv&2OhVSKVdsYdE+8x(D{EExzjiI-Xw8n~OI3(ZpFWy#4!=p*Xd7B^WMv@B zCHVX2BB7k{SNQ$Q*7?Eo%HwP5PR7~|+i54qI^YyClgN;hCJbPXA;_i~1+_1Rf->L+ z!hx?LD#m;7ttSF*D>@5sIu7MOw6`OMIE6MvhcW9CL&e9x<;ypxf0;sKUm{jDcf?_& zI^JEiC2EMIF?{533~@#<=X820V3*Hy-SMd1J$sMD=B>M#w{^^u(M0SRg-i*ak`l2m zV}4Px#<|F?$x_JdDaNH=K3CR~qzQ|>bk;xxxkcfXjBo*cv0t!m6Q`HDSe-}& z<<&M7rRJwV9_LN635*#%v>khSEH_GN%QUZvh085$`kMHxB-8gcbxnLbuFbDpUN7jA z!X(4)Co8ceF8(+dQ(RSgmF$Htd0x&|{G^q_=0jieoicV|@fjJDKNOHs8uM8mptL`0 zH{i*a{1JcNiy8BopR3S$@Y9F+zVzI8d@`-yKK74AWrr0gVPxh*%TC2PY05=8HWEcX zOL)N(_h~Qy?U2T*uua{K#hB4_McE{1pBuH zhd2WQBfE9P%T8FN137$(qO%-ti#!6xe=EwiT2CpVK=VI8JhPts%a=39tDH8m%8!(r znkTQKeObQmEUsK0H@3(Aw2W+L>7D&x>DdqYO{R^YR~KPn zx(`p=1t??YqP!6UB^W-k%rf4}3G5p`OdQ5T3yQqA->#0o{+kz24h@Rm{LR@|>Gm%c zE*h2X%hdnRe9=mHkMDhd zB_5>j$HE&H#GUs|i_3lhb0$kpViGkA!(Pw+l(;H9vVWyr_&Np4>2)o`F;Wm2jbH z#saF2(D}{aQKhw(P+I+o;%SoiYq5)$raj3IiO9 zq9V`y5iwe^N%S(D3Z_Y?? zE$F<&YA|n()nZ)p{-!v%=Mc)lZZV!v$&)4wB~)?|D%4`KD9Sns&Du=VfHkYuV}ac@ z&OK`)=?4-%MXNi)Y(rr+1jxFnw*!5pAyaV`_$u`hePy5J$Odk_3OEby(4l%F0j!I? z2WqikoyZXr6Y=`$K^wAX$&rYrO!|b4*R~yp3E%uK1|`SwnwSgoOZa6%$d%BMaFoZk zCHN7V0;2L0pPzmzM2-=Mr3Mmjzts}o`sT|R8*FA=DXgyGe7Np$^|jOE%7xHI zUd+aPR@{I8Gk7_iiZNp+fxqh9NPp_yi(9Aw)mI-{!V=J8!HhgcZo0j z=D8ecFom*&Go+y5|D`oj9{&(Vi{!jmH6&@?}BSMUZ*b}c+9m_qM@BRAqLl`wWcJ1FC zjf6YA^`3=s&Lu+wxeeYT)$ztl8)MC~opBr?|47ccyz+|q2$WV4R&!G_$<57;jJ3`f zT6L!%F-E|!rf(lTCt3*k*h(~q8{%)ivI4xVgdWz%1?P_eXBV-S^`ZV|=1>@2LeYvTUzy%DttHa_>6i{rX$hhS)d z!P!?C@7=~j6+D;uICw;Gwuv(s*KZ;G|4f8?y%9VvkD1f@#DDyqi{qz{ze{A9mk{9H z68C<7Ql4k`$d8xDiQ|1RQZX#_u?&Z)cVi1en@Lm0B0yPAbbyZWM}P2fV6KX9eEnr2 z>Fi;>pbt7W5dmO8-1q4Pas9O;>APm=d`r@FH+^2xe(zFQ!Cj6>|M0#rjC5`A-iHNk z^SPgbkMdoSp1*k&`7DBxeOaoDn{tv;I_hqJ_kmaWJl8fJo6Gx53T={?$#v5#&RN!H@mXqS0b21c z6P%H^Tu$PaJPeR*=m%kQ8$x@y8WB$4|M2o$8}7LMBG!k#jBnrIA%!~bv z0e87Ad-fj1$l!g1)-^-`xSkM;uEBr}s$YF=6~;J=HX$|s|UO#1^@}273EFw zRWveJvhst(W&4jaaYXBjap~LB{Z{V7@|Y0D;@DueyrX4KTXbMQa zqSSX;p1sUF(-mn=Q*>-mp7&*#gwy`Bzl!=yiTPRFlXD|! zx$PE}VckmQC1~7dos>{6ui*1E2ezI9R&IXgIt{vaNuH>^%d)?X%nt&hU1@%C3rFqPYPJdxGndCbFTz1 zmH5y3BVXu1EyG{n%d}#@xa>Lco&0F-mEc7=stHk5eon#1X$&cA+Ju6qfwP@e=F5B4 z)iuPy!-rW1Y8m$(F=lH*;ZK}ja`r@F+>_&_y5jBHnf2N=sS?lfJ}CU_i6}LUwX1Kx z-mEEIPynzWQ{YF=GF;*+FWXbTFTXG0vv_|xPm$sOTYqip8O_fj@!=Mh(b4{0z9C^T zE=$>XE^pVun%a!Q&?sxJgLQ;F+`D&ghVb^xNFxczYkMR@T}>@KAT$jiOy8?_9~2zW zO7=4ug#kXRU*F#Jbq|zNgrlsgz)%$LU|6MMTcbe$iW;oB9hLHW30`R}wOpT+;VkB8 zLCX<)0#!c_oDe`3@?SIaAR-RY|AnhrNn_}zb!wEc%q#KVtoi`Vg7zxl>Vam|$z zpnKhuhmZ;%!7J0_ur^`PJZt9UIRD&%c=(s$Cej<OwzR4=_K^KX(Sa%t-dS#rmAJ zQkiEpV^hUm^+-In=$*LY^6_!e1ta16;dx5(Fk!Pk_qfNI{~IbUsIX@r}f8qYtyI$n5YDIVJ6;_iDdL=o8+zWxa3 zv#*XTAwsZEJ`}AAX19#r9!LeF=sTqvO#3uL%=Xfa2EWhIN1+nnPfl=A7LmWftfB!e%Bh>!-ICeN?dxytWBm1pU+s-z z{T)KqAEitT>o6=o_q@5W;DQNw1n-U4Us*zg$CI1^K7;kUf+&j^Y#gtSPkbE5rs+e8 zw(w58yY#&nK4fs*e*1ZZpYMZ_z`A(!ryFDc!4A=lD2PJ_bcz4)r3>QHi-*R)A@h6g zm7_78J^7F!T~WZV!H~N(u1B$b%|Z;a*~iuqouC56e`OW?FmxMs6TYG?9(r_h{P>YA zQPsCc+;qnz3?~N0o*l;-U+d$w7uQ51d)})T4vfzuADKG~Tz4nJTh8SQqQ*7E_aE30 zZ!Ez$!(AA6tW4*YsZ&SB?wyD6mL^&p=cM-G22F=EDyX>k?KU=58Nm+;~;_?!+nPEDgKqP4Q;KY${d99zgg+QpUwtL(Xx~`AoCpdiLfzvk z1JF>tvZ|Fm@<^OHE{n@9>zRA{uYF}{Jp07nSa>Z40QZiIaTAFEAbsX4415Z@nGbSJ zEZ&J4Y18J-$Ks(MEsxh;-ivX~r1fL)h_Tcqcwe(cn^oePFhT=(%7kLTZ_OiLLY(Ku*Lqs?|+_!Goj*O@iQ7pzXhDS2* zO2-F~=70Vrw7GcmE#Lp)M)|&U*?D=Dzl|W(2|C#l%W;xew{aT|T)i+bX$zUBY(=|kr*RY;XtChihNlao+78UogR=jSN{i@5ashVmn8jwvcxCs1Y%dC)A?1fHJz$t#~C7=7n(opb7t~}P* z^2uj(UkwH_#J@T&V9R=ezu5QkOo416C78%XJt!HKGi&&oq*tiqr?$A1Ba%80lOdTUulNw%6^mA3!VV zOnFCMb%2f!_bB4F7&GRlTp>hfbqb?3g5Z;phKOrEWv_m9GL|DgDMk=U4;(pyin8q^ zl4Rb5f&3j3Z$9$}FU6BxKpiP}1b3$O%JO~3Kl{<=)aZ+ha-DrkKXv4VW4bGYt9K6~ z#`GjQTLsRObaPF^iKt~yURGjfzgl(apZ#Kl+>8QE(f)S)XtbSuL<8(s^XFI*8q!ci z`{nZ-4?GcJ&vjY2r8}d1QE!eS^`mijQ-_-9s7S6oq`6(jCwsN#@6?(lsgjMf>yn$|l zZeg@n*HV&Kh<4_k@BmBFfRwd@3+IY`X^rIblMVKP??_+JEAj(>9!W1=fo;w5*W=rN zSvmsXkyS@^t}85@7zirKY&5N+c9Cw$MWH#6oPMQ&p6xExYJ~#j;7g?Djr5FX(KYHh zgJs92ZP5uW*7QjuV)Ep{$xJKg6ES&7-7L?7e_bx|kSHi%66c=fbMQc2ti_t|C`y27 zb2!5Xi{67ZjaViVBIG2*hcvb&86xml9-u0Wi$QH?&|cm-=w!~kBn~Ppi##g@bC}&J<=UlUk2w{8cp0yfV(??Cv{0HxHystRTEuF#s@|%;}^}RP$9V@=Sh-Fyr+k zi-MSNg8EyW*ghv+ww$`1xQ+oMDil|1G7MJZ0%lL<`7YF_@lD2I5w}iyr2d@i*--K%4ggAnfKx22c@~da3vwFD+eIc7 z{eWRRO6BsRwiZ6fp7A(y1+F0~jG}Kyua|{_4SXXmY$BZc``PZ-keFba$v*PUe^WvZW zX%QReiumm3F2y5cKkrr$6~P(NIin_AeeDzs2>Qjp{hQ~%?~KoV_LFh*Ekolk{^GHC z|Gio^r)_cW`4jNon1nKR7snB7BP`lD&cjAZ5t}ja`S&q)tYP(nr~pmz*MIpcirV#Y z;YCB^OTT??TyWv %HXCA1~(e!-t|AAC4Vd1RCs1?#P^Z^LL}fBfm6JcV-MIN=Z% za4gD{q+cBwXF0yGIzFku>-8=1!2NHb&~E@=(+CqeFTVM$A2Paou+g22@z^#5)4gKc zn2E7%=ZP& ziBFt^psPn3g?O&qvUm2N^xGKAR&0!6;|9g;_gx%gW)6pp&-~VPG4s4((Mbn*U_1njFF(CGUVY}>=)h)hB;Ewl)BT5zWSC#+{0S5^ z%}pQ^Sm2DA_YJIf&74!&JLa85M1=QtVPvrj&y4QzTVK2aV~3%5{ndfnmL!^lr7*I5GgvGYF_S)HT z@x=ofua6P!VsG4Y?`PuHyEy`2{h{#e&)qv=-WU|a*|b(w5;}D47Q8`+bC%y^gm#M% zkW7rb@0cI^_I71Gevy28pnrxhmM^G_@ngEg=k8koyc5z3(z(~aZzb>Wiag$w#u3gZ zX-jjno*^gFfTt4+q~~#V#+WCWRcNkfDXZM7tK)!Auq2*cce?RhhFV6uo^aMxl~t5; zGS6|=P(_bcJzopjNKX1tqb%1d4N6p^xHkAZy=h(VNStdL6Gob)@tB^Q4GoPjv7TYr z31ysNppS!}LU65DW_LE7Ue2p7ox3JX4H!#Wmay0s>y$*F(723rt|`{%M}x_xrY1bu zdy*G8S!aaLcPCK>xn9~HekQCfFxS##>lQv0j&AgX+ROCvT-IkE+fiR%&su`uj8NU3 z!JRK%=UnH@Yrf^0z5>IvmXj6nqsNxP{~f2VFJgV_L%(I|8M))Fw>Ra{Cf8njULFBp zKC3@?i14vLd^$#r92n=~JvL;JVKWOj#6w+uEA!wW1^{niP<0vJHuRI0gV&1%FoI+4Ib^Z^Y=4V`BDZ^+uaO&b>Xtqi zed;`rS7N23E>{Y9VR;aFw0xGkEEjrzlaU=OT~GbRc(e`nqvho0x~MWsvVJ$~WX!UB zpV3ReZ_@T$?0Hwp?=yKg6^k0QkqxD=Q5y>WtcCg2h0ZO;P%%bxd;*+#>^J9~`NWA~ z&7JFpspBUXFSrWDI%Cgz$>USMvyI*-M+iO{+u}U=A_|pv5*GVPoaG*Z-}a|<`mT)6 zV%`+Ex1aJoxOC3Aw{xspMv+$@jn;!$%Sd_v!<+rU{4Mtni4sm>6|auhgwMH1It@e} zPu=jI&kZx_ZJS>8-r0XG%p-Z@3KX-3`Ap`C-_nc%JB-bQ!L}BinRucE1#5b()?@Tq zTkm$utp1IYit={>Cy%&%Z`=O=>zBiT!~JJ35zJHOrSBcfK5$KP zT)AJ=XtVt#gEAJvQgui`j? z9u-CxQs~kfnmK?q!gCh8k%u`^qA$(RJo{IAm)#6BC!qaF#~kmJ@0jkyJoR#3<``jO z6#I8!bx!$R7+iOuPS-K(Fpcl^1ooK`CakEju`y{`MTN=>Xd#J{M$vHFlWT8*nym9U zYpoH=q}9b*OhgOTN#SuWckkXk*D7ICSSc;Hz8*YxZsqZg)Zu;7Z~CAZ*EEMZ3z>w} znY9oc+ivUeoxFmE@6rnEw|%*uP(Dq|GL7_b65hpk(raN5X4@-2BJC7b>7CD{!P26H zi#mj*z*!-9FV=k9QqWxScxE36Uyd8#mEJj~avh`n(z_IhNxXP2pW!%5?@fL;Kuc_! zJVS;Kg_cNvHN*!j@`?l623%b@pHun52`rGrjkLz`pbR1V47hD?@-&VQ(nC=WWzZ^%rEL}NnFw$DNx+TNaUwFZYxbS=o1=0YZ zoXB;p5Vr3-(3~=?2OfMY_U*2ZF=HpjEqBh0a|sLHcK~OcL(7-GwI?2VU^PbOCwM*{ z83~38FK&q)TWaI_TSmtn_s&Hr+B>#yuZ_okye3|KZZ~_;lZ3_ZA2;4|4o)K7*hgb9 z@YLEkdbndupVb@1_W3B|2gLTB2T+E-7suEqEg-7iV0fx0o_YfwYd?|m?uq#eh(N;m z)eSYR@%$4T(|dZzpnzL&4I8eZssLFsMU3_?_jk^4()`{U>I`JfbJOxp-Y{ z+aR6j$?<9&y@ud?7~b5wc5h7&>~7sEiH^2CuDfm_#{46Q4z~?Y+Km_;jOQ4=DY0wE z0SwERMm;jdn{U2}C}*9BB=sf=?O_}f(2ZmJh?vk&g*W!}7)brEzOp>FZaByu`JDLJ zZIffbu#QoU@#+0U&wKTy4Jhc_V(i53ala z+lj`oh9lhEBUa^61g$5JB2SqJ?dXH-brZC`Ca${jZ1#7Pa2D7XPd~Ggu~x%auZW?8 zJH=%eO^TZc+25!4vG~DHHpTOcYhuhe3~%QS=NQDjL~YoCfx&?Io32LK-vdMY<;=?l_Sn7R;K6$M`8qt4 zdm;lF4SYkO>x3@n7>_^0cv15kDj_o^% z&bWg$h5ZzBP~)4+NjqXhWkzk>xbXn_<&023bvYShIP&76i)Nsp9l}unn`80I8k>y8 zIb?3^=E&DI81C0`E_*NJ6n*+sF-IGsrhXrCnTojLiitRUOp6zv-j1QmP7DA>#GUtY z1i&Q1;j<ln z(ig}ZGT^58#(!TKiyq#EoO)v1`N>JlEggoaIm`Lk!XT%4NqZjt(N>PU*Alk@;U}C4RQ5#V=yQhi!lZJGx+`TB}{Vm7H=I!Cs^{% zdc4bPkaG+qvL$EF59`Ief)~#{iZK2xeC6`~-}@F~`^(Ed{4h+VzBF03&Tn}%_!eZ* zyLMsVgs1)PeaJn>Pl$PQh;D$hR5#Yjf}bzSQ$~6W$Ba#z_7KH!8~2SdVeEjILo|f` z7@&3O`9+uM3e)JuL3o|L4As^)Wqjp zV!Z3YuY!*M38Qs%lnLUwdIM`zamYtcy;x4VKjrn(n#v@-4zHK^PoYwAFHQPfa(0DnmOst+)+t_jrxPsb2VnSNKAq|R?$AB;QN6)kSH?gS_^8DYzXs)h6M*HOf?73D z$?-{Dg-n9}0Y34ZW6XMl&N1ab`Y_wQo<0Ik+R7aF*@Jd$ z)>qEs?_am8fGIciOqlxm6NHgEfaTaW&Xwtjl4nk^ek9ST#e$;&kKh((3`A7IAXc(> zm{4g+1@0U)c9>X{XxpiFSSKva>yLJfw_jNsOJ9367G5$5&-SZWz=WY>Fkwb6F~)d+ ziR8@V$9BfIzx_50Z%h2qA6-T0@*$a~)J=I`9KUO8sl z^L{kM3^^22Z75x~#y@}UIhd**@t^P?|pAoJn*9x zao(kKI%=coVrU8HxnzAHpPGA?O?g#}cu~M#J5z+&=p2fTl zq38)b*2#oL7|=O}oa_*4z4}u?Pg#WkxnNv`SD+N2oFJXB0$HX{_^eyJm58!TK_>(h zo$;c{asXa>P~fA~9@|ZQX)Opd;gJ{`1!!21%!74`6UzoZDosM?LZo$7A`;URNbKIUL(pD`#Oa)xFOI+}MigVMC9BaV{W@l{Pz8@TTbjcJfct^oB zB*#LTMY}A)W*AEFy_Fj{?b`i#9bASNc_Za-!B6>SP)OLF(gd;_4C-UZi+>me>ZFPBtq3+5#QlF!bJ~nrY)z~^m88L!kO8Q=bk}0 z1I`&>gy5W&G%e3P1Y9fB2n?5CDu!>^bz!Q(Pa!XX)WD z^_5eE;v8#h)>OxT|Jt&6;_;0Lct*zcH=Y}3pVyCdOrft!GyfPXa%9W#g#Y0KOEF40 zin5_^Oq($-=ghLDs|mF?i#|QU`S82Q*Bz#*IjRuYT!mM^VZp!mjinfu?TKq{njM#4 zHz&H`RYPQ@*t)(kUO~XIiii&Vt9s*ca5hGCgJRv<-LZppXvg*=oa=cc>YHogqN``b zE%%%q{YLhQ7MVkYn4OtZb%)#Hff0$*@?Mai@;!A>_8aNrwRqlpi0JMGm3Hr9X)`v3u^=6 z*CzMG>jlr0fkyE-LZ1MLKzF}EA6hHfWOl$nVLzTX2N95TB4WfGi~xob8uM8;;jQuc z&s`J41`m%XpLi?YdUH8Kfc|mWWiwf0x)2FtBSs?_@eH04J9lkDs5X}{oTKq_dLz9? z2Mip9P^=~z>uWO7$CT-PG5C0!GdK5etiUJZwoeY@c#<`FX5s!lC+PQngk>DXX67W` z7aI}EOipjZciwq1zVI6hu(%oLfrBNR5exM}NYV z_U+dRuP7Ki&WCIv;(`K&E(m)?tP1Efa@P_C#Ho0v{8XHlW`s0fx-L_$qSN0BbL8z@&kBVh<>tCCy=SU% zZyrA?Ey`u6BsQOyLhBT4muRmFKg(;v&>{Ine#^{z?8QKu<*k<+-kv+iog(32`ZG zmK)I1ZA1iNi9mpOF@`;!6DSqv2<>V^fQv9>_wKm-(m4oNIWmHDQl=WBbbRZZkKvtK z8JAo#7y3Mq@_6BU>O6)Q(wlGXCW64*@hPHgj2+W2*L_!G@#|$dd-fOsU=@aG$A|#H z5dcHvD|x|Z*8&no2W>*{jc zP!KTNm-17LC-7juJ2o`5X>QQ~0;L@5yc<~YqEUqNs&h#}<9HVza!e|yC=hs=ueo1p zOF=HL(`co+B`7{vam{ysWf(6=Yo4b?d zBzSHikDF!N>m2e@DJsoTfhN9G))jk~LXm0x!f1b`@-DN9+k%hPP{NM_R=s3;a`X+| zh`~iS6taV%gT1mn8WPpu$?sXSwRMdc-Lba8=Qg1m1K^Cp5SaK-hlo4 z6ETK~Apfkli}=ZL*G|)Wjb-n|J#vUmkZRp*rH^sRA6>Dk=mq_cnD}8gWYDgemv5Z#kg{)A{`>deN&K>8g zm-(b43Mid3j(H7YoY%RAk|zzO`A#DkCb5cb=dx?2WhafGL~)RGmO<&gcyOI|UP?c6 z&XeBXmf>7;%p2iCS}m;3Mc+$hG#a!J>7IC(k`;Spl9n#%OJ00gw{Ry6w9!jiCLOaa zD){9UGz6kK^oJ>+anc5G=sV#NPr~56{74z5gcTYuJ<_m9_ysKKIp4W{%hQlg1W9j% zKkF|)OZpND1D;1K)KYnyO%qZ^wbO zRU9~0#J{DcQI!48KiiV@l??V(VN7A)YJer~gvYTfG|CdB-Sl;-9>-C~l$uiyeP`JP zo{G9G)3laj-TuurLELe5)HnhdgioA{Q}Lx@QzNP7mM(-lZpL`3Q`~vm>^S=@j;!+t zBT!7S@G#AIR1*PUOAXQ3PDcQs+N@Mhr5`-_2FH3HBU;yN(hP@|gExUG0803p5um@l zv<`3eC2{#BqvMhbFaW@KK83DSWO*LT_~g@D;+5A>CN%Zn>ga&S%3X4qfjEw!vLTsdxd&J>#vDdFaW6L zT<1Z!$W%=`7xSX+TXSPLHa=f&jRp^*IN zm*dF63cQ*xh`}S<;>kzfiCtSz$aHp})y&$}jmUkykwg`6utfBty(dHds$hu;NX&2jThH*t3R@%ZtNUPSIVG5QQp;lB!AYbXW; zGoWiN@#1q!@lrpALBPdv1&ZmazJ&q6_rLiL_}UIm@Z9TvBCcbfIcDsHShi$0#{0Wt z`s_i_jguHv5W(tjR~&wNvF@UHKd)EZ`pLP-a{6#)`{r1J0YE(h>x%BJG3%UOamS}F zh$$1RDEj~g0E~-cJ>ffg(w9fsv3cW8 z3>aG2dyeKvH;f7TRic>Q9?w0qihW}P0|f)>u8o|V-WMm6u5su<4Mq?hh_pzUZeZMm zarT-u`{PJ0{5gEuxG^{toI^POQ9T&XHOMSZ#ge5BgvRd^XAya!wx)?=BepWjj>m#? zD`Of404mH{PQd@=5SQ+DMiJDCEaw>B!4)xe)&u`aLoj+60^e0lTi$2gLTSt1xxR*ookSA3`Id1+0GN>TPTs3L{|ib2 zGJPOXIpdOcZQXVx9{DjxQarl{Lxs`tnJ-L>b1&!z-7415q$OwM`I$0!;EH|ZNOOGs zYb)Zhhjzy8cTKQIALT!4OqG z+uBKO#t*>f^Zyx_ke9DB@#Qn$`QiB)$vg+W8alLo1JOq|Z%^K99MM{*qRbzNGQS%# zYMWW+CG4wXHAHw_i-8FSEODwajPN=U<$T{h7^bn_b%bXs&{3+7{KZvBHg;hBID(VP-Z;ekuIkl?2qmL19vTQREIy6ZsH5~ij*28qK) z4v&FD*?*|i)@>e@TPi<|i|_g?V0>7S`4oL^fv%Z;V5jn93Wsp=hi=BKm%Ul?l`QzK z<^EHquU^5@@}f$`m*T9*1;&_9sEpVd3J+~&-zqH1oO2&T`TQ*L65O~orLInRw0EHm zmF!Ea*#C7UssbDU$0D2pPwwq#1w~n^I)YB*IR(&UPktkJw>E;pg|~be^#IlfAg!Oe zpbxFIAtMiGIw0r0NsJ6B&(VVOR4sJEXri{H`Y>`X_=4_4?4nv=X<=~pYdK4B)^(9 z!heC=0$-*V+gzsMQ>68$P}3}UGmn^1)2=~s=FO`44R{U?>+o_cDST>^XA~Fg?M?4% z`9$%aNvKlgze|!lzBq6!QH7=Oko1(p!&2S?9(7% zFnm3t0`}?1D^UKQ0&mAj+YAiJuTx85=xX`)g5#C8$pZ@lZ5I9xB7?nxFshSk=Vf^= z%&7=>u9W6aw%u~XQ&AG{xVLZloi$Npfwycal~_BqiZ>Zg@MS0Pw}6TC){{oXv@7|0 z-+_12m{uG+7KL5el5G@%>??7_d?=EVhxA^K6~|3y=A^+TdJ$!!7rc-3) z##|GKRDYC<1Las&dhYWmBLG-G?{hD~x7}tZD|WJfNSx2ax9xYYVLRphi*|u)l5JS= zT0HQ#zl|~M=;*NO;K{aTERO52=uN`lrjUl1P$u0?ts6BJfMP*mi-;@_GCL|aQ?%7F zYDL}{wnY70N0iwOc=YbZ;;R!Aed?saoToi7EyD`@6iA{r$}Qbz%P8#E<`UE83mEw? z<8S~bbTtdv5iDJ&v$)TkJsia*3T~nR)X}jubZQGd>Y%oR>^%2pISfnB#AOaDkx^>C zLPre%mb|(SWy+Gc1?AaqeEuvtR2US{I>-u`DAF;Io@I|M+K~|e2J~-@KmNn3IE$PJ z09-d`?9Re&TFy$jRohlDI?eb_QPNTI1PzZT41um#2j}yM8sn0 zqV6}(?{d0Y=mBabvtc3KSqxmNA!Rvfo(wCaKqVnW7otRuWh0}8USZe+4EE^yk-_* z*?PrS{_Yt(4Ehij?_(GaaGbzjzlZ|6A-(dhy>2!Z@qk)n@#^AD2qSvI)b`};zTs?qHenFb4SY{0N`q(Z z?Tcgd$)K^7asBPH5e`g>XE5S==E)aOR9D59e)rZGIIb%esL&>8*ZLKQ;pAu{RQR4^2oO6c9)VckmGv}@~GgqZ3U0H`u)OU!LC>Ou? zjVEIC@Luu9U%nfIjP(c-)};qsAC!_8Up57yzyvmP2p9+tx{eTPyNH@nhml}qPmYw~ zEc;P}iM;G%b7IuQ-VjR=1fIG;2ec%vKG+nim+p_JAAUP&#&x$}5@%mD1R)jP>o7Vi z-mH#SpIsA7NxUYe#6XM#URit?uD(Dx8TupHGSI)?~d2#Q;aaMY^xyxf{fX~6-Ohs`{e>$~wJIeMf4A<$&PN^V53v?qT54?ck~sCRtlo3Arx z4?vr1lFlngkqB!?9&B9g#N65(_-9MJn7O1&atF27Vm2|Dk>Kp zhxG_~^y<>1)!z+x#2!0#Ec!6M^z8DP#$Ga>jf9ER^UE>W1H-rq40E8C`OI`GPCbUf z_l-@Qv&<#qs0X~t3Zn|B2+VcENe97F`K#BP^jkhp<)4Cl?_K|_Ps4=<;FK=wf#`Z5 zJcUP^v=m;GXa$8}9_F4kKo2@S+RR_}aMR;ouWOat6Ss8 zKYlhwjTji`oIM%C8@*=4zQyC^%n<;~-a8a8FMgdP0ItC3t%v|nVr8W z;yJ_-0C(OHBL=&E^8y4cU$G;eeQ`O;&{2eN?T6Q^g=5i9)P-ggtCa{lvR}cIV?e=$ z0zZ|m;!s>w(0AfTkIln}t6Be`(a;z1W*?-Gj<(u=j;*dJ@0*!Nt}#`FgX;n^YHJ&l zcNsFYf40#m3o4~lRyPu=U0Uf_v(KuC!D_!9t*%Xcd&Eqy-g?3^LV52W`Cb*mM~@cs zKyUqwMg&6a$4ZpIjf_2&%jtnnKj-Er`^?aOD$d2T5xkDj4hcMK3VcDK{K0b)o~t(@ z*?K|`j^R~&M=BtXtI+1Yg56=^fr=*@Ve7?_MiE?oYT?(?N1Ff^q8e^tpB#VqaaKY&oZtU(ICdZ9$>gTkePg+x3U%HMHoxn89qQ{3dNvETDm zX)G0qOxJ$#{){B;k54~6vv9_2!gBiJ~X zn-PvGz>+Sx|FLG*uwKvu%lBDdj*8H*#JBFRq>ma0I7e+v&c9Un6CH=SWf|u4SR&_* zv{&zUCS=Y%_fOqP@7mOy5dj$RUgWV-*G=cA_4v_yRGQ`-t;Fa~y5W24&OKb-yB|~V z10O*-u9MPM^Lgd|)^uF1SAdx5UE5s)a*c&f38(o)tl!1@iqNVAi@bnWdVZL2_WbCgJMC*rQ# z=Ea;@Jy{QICVd3XYA_^!{dJDVB6R(#O`OkuX6lr| zc!N>9eCllM{7?nB{#!R}Cw$wQ8|;KD(9w88UFtc}JRoRBauzV2h^aLm_u z45;xUfBK#1#@W?3-+Xb5pIm_<@iq*3-yp)%{J7`y(__#G))#R5&g*;G3oJuMQHhuI z&^(gB=rT9lIvXSGgK_`2UdCBtM11ax=S4-&4mW<*r>!83MmTYUf9@30Tr1#g2ey6ObS zCd?(0*(eO1x4}~$@tqXO4`EFP)C8sVhf8Y>3wvuP53-=a?{gc$@_; z*1W$Xc5mMsGiDAz<~lGAL(i8lJruil5iJh+*zl1(W8oDe;I9WVo(rSS&6@&4@vTWu zX3d$v812q}atCv|n&SxuVkkZ?kK^*(d&jM7Lt9%nc=%(;QZ~oI>Pn7R;F!g0hQVvJ z5moUZeflnYnccZxTtGCu-bAbG)JX$P<~{VMk$GN=L2qqcS3HdyQNr(l?>reZh{`3c zTDNu^ipb;X1l6}+PiSu)G$ojCW8p!oFm_*-P7z%dVK0p4czGxElG{p*Vr(tMavhgSzJ$Ra1un&5)tUnZ_|58i+8q4P%jA=``4* zTNTFw%#6EHhL0cLBYCl$sO3M>125@8`z3Aaz&`0jJohwCAwSsy-`A64_NK-~mk~J- z8k%&ZJ$>os17%pGYe8UG(HQ^oPs`)UpYD%Oerj^ue)oht0>Cng>f3K9sHi*P;W6S- z`f)4sbwi9LqT(m-o6LMO0)UjXl%INy0I*|MV|?}RUybEUFd8D_#V76@iLnNT@8B|N z9_i&f>Y;f%b{ve=Yj-ernuq|`i?IJ=kO}m~NDA3aC}nI%P#IC>=cWAxB`MplCCbY-j%D7w6@@+yhW&>ON6v^rF~@f3S?#jrn1@wk z|JaBF&f(a(_fX)Q8hwf4(ti;9WSmkuqbOIwn~DHdhmP!HRH(aPxz5|wxt2r2bdD1| z_an+4-AB8(bx)N0){;Q7Set1W<(StN`ZxI=@_Fxo&wu=&NUApte1Y}B8|Yi4Hj|?H zW*reWfpIWdhUww=(wm%eKD@r0036k-0&R0V;$tR&NgV)scaxc zS~2ycqLg<6VmnmenAUxpRjWvDg?aH+xou=44Y2a5A&SV(P5Wc-j-%kd4qk>l%q0x~ z+TdkQFoEU2)ENvK&_BlEm^5s7Ka7~*)rh3xxY2MOKPCnd1ygd)H(=LDK%IoNBuAU@ zQ=YOP`z!mJ_!2|@ zg@q(P_x1#eqMO9 zA8aEH@T2a{yzXZl)ap;v4cSj=1YqI7ony;EZyNAiDA@T)W}vlTURhQFjQF*M4q1}3 zM#IzcTbWWPK0Jyp1hfbZV@*m0&O;(U|h;)UHyXZ&jE59$dhewPjM;zq=t7Fh3LM%pFkm*R|Z-5bm za z&~*UP@Z3lhAY=u$hD(I|RO@Ib*(t1JPBeFnZR@v00|M5Gqld)Isly=3c%xBYUO8aJ zS<%Z$L=xkr_rDfjMO#Y%7hnUU7OYeIO9k0{!^fFk1Ay;*_x*U_ z$E)JJ%jd+MUzi)6S(G44iF+r!f{qj*!!0NzD6Hm-MXn%R5GV?hIIG~W8Yfxt&&p`C z9|t+_+|asEX82qml|N)GLIn9N3!$un5b15!9YSHbhB=iWx_~%j3@-#UL;+wSBLs_< zmM)IS45E%j?6_l10-5zNhxs-w5U>s)`Oi8rigFL&_kvSN75O}J_)1H zPNsFHWbSsc(b~s?#b$75-t%ek}Nnc&}r=WzVVs+X2vzwjffXt*cSirx33~d=tNoP5+!6cY3kSvUWHLaU%aK4 z;qku}AzUk)*Ul(ECt{E^Bfj(Pw@_N{jIVy}PK1A5<1aY|VC&Wf3=}$XKHg-E55{JM zffXw@AUNz!-kSK!zq%Pg24V3S=k~|SRW0$ifBP`wr5@UGXE?`HumC~8_rAZFO?QBgg@o)I#KzqvR~k+zB!tXs-am+d zW*xBZVtn_25$~0PzmtS5yzlc15xR8a48v{l+FPrmQ?ItT{tiMJUOY3_tf-D3eCydb z!VxpS@$c@AITu$&TQ>lq+&f=HX8v)d;)cS``{JAUs^M zm=KOnzC|Bau`Z6~xRog}5<`dW8xaWpcv?JkHuz7uVfzPF!*2 zxOn;bjR?m#P(4sHn$w(Ei3o+hI2e8PewtmMdmk8u2V3VX|)W^mk-oH zK;AIRqcZX8*fW2zP8MaAh4DqX1*7W5&2_@Hz)Tt_*j6_LDyMCO#sD(%rZKJSQMQ5h z*tXm(Ss_=!Q@KvdccEw`ul4y!gI3oh%2xny9V#_)o#$Tod{!u@;TyoC_$um9;fN3u ze&W^FcOrn^f?)fcm^hvY02ptW<|q+c-d(cHd zLhFvlh^dNq=HdeO1|qPmBI3r&i(iY|ZoLcxHp+$X%h&t?{H(({`!Zf%doTpJ>&_bs z1Au~kjCbGDn{E|jbPk3p!=XL&7r9jSy4I(FvVfR+mdTE`SoBmJfWW7g<`_|dd?Glf%Gb@0liAh zV!!3M_bU3Cx&bozS;{Y9MVwDRt2lEWt28pL<6kaNc;)-#?Y!(u0dYKO*pLD#o@lsW zk13eR@ya*FhWZv?DFMCy$2I*+v=m9(*- zpUzq6B$xGSbmRPU9n%9}XmjoXYbt?BRS2_+Ich%J;n*+ea54X#lhP0Ol3iJ!i}f;7 zGoRr>$>S&2Ib|!G}5idE8LOV3JmI7!RvqVrvvDxH!h_}m7V*Y#GoP2dlghg9~XR? zuqc4d^`X>X_QmP?Od*Qw<1$@WC|DSGByJ1TBwnQ9C#1RbpFB^QkFsu(6*!?j@oE`9 zv}`ZmTb^{+0I##g})&zaGW_U=HUsdxTK|ge9rCT1*7WO`Ov` zbH-G>{PohbbUzqHbjohi1+ghS8kkDqr)bp#AlnT5i@325mtXbp8La?hn?f? zH+RMpk6>J0*8@dCANHn%iQm%z|JEAU-oz0AoKrtxLa*4l{a8E-zyHR|L>@gB(HjHg zi!PmlA^O-@!M^m72bV`pwNb~a**lyUH{3jdz5RZ8cnko#bdQgJ{F0b5vy!vf_oEzq z4d;X59D8rj&RjEfgejV(LY#LF+d8|Tbt z4|CUK1iW?e5J!itTBflI28K8d3>rKzjg5}h9E$TU7{l=k9oR3v3ZAcuS<^96c!l;i z?~5z0ofI=>jgM9D?ME5D4v*Ffj`ln&ma->(`iYhCv763~E)`Aii*IA_IWlg*V4!s-4iV;mY+P~OXq+of#*+_kjCHFHG3GD?IYGq55fS&Y51u!# z7fu7<>)S8Hh#|A$+8ZVk(zY(1$BTdM3PR8~!JjEhW?wT9=Y@}d;n4sv=z_=m6rz<*!jPgna~$5Cxw3y>8&Ly^0{7NhJc38CXB&>;$bNW`gK@*h#>B0+ zPA8&(`xO`!CV+I{6mp*x7+U-gMgN+$jWK)P#JKU};~3{%iGr|~z2Hisx7EfMf9pDq zw&;st7_^V^pL31z@BS=}7*BSB=V@h}SI0vSZ6V^_e$o~6ZOD+pDAtK8(7!S^ZrqA; zbT2ZHQOFd=G50pnFKgrc^DZG;+~9cajqR~~`AWj@4?@v835S=X6R1u0olWZ3H{>I%f=?J^*Y8O``M$)gqB7;M85BTYaMd4s<`K~Q)2FX zVStvI)#TK1f^oZv$ZG%m4@AXW-pV+bicDY>GDr-tC|}SRGVI?@#CDEuSiNQ&JVhgL zjOG}({v1ch+4j({Tnc|7eysG@^Rk^Di?MfaZEV=E6WV)-abJlnW=xC)=RJF}4{~Um zkPk~M%J~zF&7&yjan3q)IK77_jUUNTkA0z?%40#C3e+;j&6|5-Z_3w)k>=imz52;6 zvF~6V&RP3eQ;s1QWo!=~9K%O3$Dy++M?7=(%tL*`Dj(;!?UIKEk<`O_1HR=W)njOMV!u#iD*jEA zONOW>v-SE>&zcUZr1h2M_>bbL$1%fmeuy(iQ}W#u>U;T1pXF4eEFapwG*kete2YAV zQIy6cz0oyQbO+(obsRkD(A9(iK;av1U6dt0fb}G4tb?q1C11}oVVD2UF`x2B9%Y*- zmUoWJGHlk9t+Kt~#q0^JWeX@7Gy0%%98wniHjl-j>3J`HKtcASZFO&<%&--p+xTRi zlqHXBDe?;>&N*g2VJjPG6!4J9asg7jnJ3dYzDR5Tdy|F}P$Ok`J)rwl9+RM+j`^$6 zL_Kn@1`GgBoSi%%CPN@i7c0Pt4|Xi4FJ@a6+qGw654-epwz^Td9wc@x=43E zxbG^ZvHXpz-iROm!+$6Y0G`{>)TW|LWnzUMECAm^0Sz$JwJ?cpjAh!a#=lnV<|h|D ze(2?!#EnkLwwuy14dPFL{Y{sDyO}~4^|94XQSN4d0o3O0C#j*R!*VOgYip^MCY>%$o)P z57Fjt{@Wv1PtT7(`_qphGz2(jXTn$zKCXlWv_9nJP|XO!G3`tuB7CbPsNqx)H2 zj)P)87%D%37JOikU`W*5ushGv001H&(efM~XQWJ}=ZN$~cwwbY5Vcyuu{1!SPg)mY zyi;L99u@ZvIT?r~t+p%cckUHlF{yk&FyP)`g~xutF(-wj4&R^Ejb)OnXtb zxGcQ+$qh^{I$HR(cS&iXa}MOfCJdyL_@-j7fe>^5vRblx&3}p*P0`y=8Td@5|Sr%W< zhG6}MJ!uWxh%wOUk%QC1eHdY>;6ID1tdD%w462ewY~FMvo_=aeJoD6MHg)xQHB3Yq zG@j7V%UE!0;)-jg#w93K2M?}HVaK9}mLm+QM)5g=bM?B#4}SOr=bTT93l?08C-UPk z!vkQfhC{2~X0tZ{uZQ_;iktAJU&`jQHU8iauY-xNjBotw_W0L-eUP%xjT=#HJ^M7_ z{@4KO#n^vf=eYCkiEMc1gWIO~`oF9p4B=~7+)qTw!?}yw5E^jw!tA-D@N_+h^79C5 zKxZ~+g=PE4Z@xB`F582b#ZTf-|LoRSaKT7I(7%Ks!al94LwQL@j8-}}7_P|T>r8Y`^)f7xB2>5jWj9kEjFlawxg}*h|0sCFZ^818*rr zov0g~bwo4x(Sxhv=_gl%r@nFX$Im8A;fVOjj}7m>7~#oCj4;Myz%+_8%v5waUkJC4 zqT|gscX5oun|Op;uAb8NE$2esIFm4kQ*&*7g)p0YkJiN83&+RV=Z}vA2(zC3>56#q z$rUm0tT}P{4HIJ6SdLO)GphmEL5`Q$hO)i}!3@hVVJdsah%p1On8jO`F!)_C(9vqy z_17poo-f9PM}Wm<3B0}b>=uMy&&K>YV_8#f1kN_b#CjMzBMS6lgLaU!5qEROVl@g( zJWitwzHV08tfI#|FYYo;7bo{Mnx`#MAU-eBpEdLNtJ>d5-7tmKua&%c2es z;d?$c53ht7c<*&Y5YiOi{m%OM=D)rT4MyP9r8a)|_im+Mx)9mn6_oM)z$Kw6j~ME6 zeEiPuT)}$Uz>yoTU^wu0eBldUid*j>V#cHI5?x>=;qAtw=pTcUe<#Y`19+lLKnPPo z#D{nA&bcJ+xNB6r{PGqeY#_|qU&s9D5qI2u7U3Nya;(5+gp5mL;NT&Q_o?yBGr)xM zxw1zqp+1KYWn&nEG@_hv&SVwqSQnYb_Cal57Id)~tp&{}25m8JeV)HFTYE-m3j@16 z%uRDfIpxQvQ=cYFR!-9PtKi$(e8e+001Gysx?HqAOgT0w_QP`fIcwt1^$FOmlnPc9;#z4SW9@x zLkKUg%Oe1!e_oq5?~hkrc@J7V1Ht?V<`pHE+LTR6B3Gm>{uVDw*?*=F%_Aq^b=p`V zfAXi`B{GwZ_bM0UJ(*9p&j+W=^1euFB7b?6#&r320dVoE{I^_>ze@z$WM_`ktT^BM zhl}#cMfx*0@7{Q^&KI?wk%9uVn$n{)-ei_`u*$HUnXa7JZxen5zO$fw&FrL{?4xqt zY*0DH=_1NS76tpBe5GUsCszFMX&LYBu$I#0*Xc|NV*4xGPrYiK)%cHTe1)5ru>%aFNPo#m11`!JUHJ~thNhKliDzJ{P!aBaEM^>;8HM&*r zUW9%|kd^Hy@nZ61Wze(jr+=J=&lF{l&$vA!!3S=CZV?|y@$2!Uyl4I}yk|7E=(}GM zT+20`k3oK2&iz zpJ`Hv)}F+KWxga|@~5B_XSS7x?RA%Lik!YVU0r+q#p9pT z2EL*!o+P359|BbXi~lBW7*AwX*hBZsuz9lwqnsi>R8ar2@<#TsC*haWA&i`cU|I+O zO!8bx_iTQinw`h2`hm&VFY5u1ed)dFJMurlRnhZ09+{ zZ2P#7GhRMIwQ3g-4IT`t*vbX$_lMfsZy&}YJr@CjAz&^HbPoZsk zJr}gDXwJR~@ZU-i?DXcWQf@b_83t0clZ9X|F65bp)-%kHt;?i>LcV4ZDv{vc(k zg&%Q=bMycNwn?myLfdGx+t<&cZmst63tMr;a1%bUlTZLSZ0%j;w)P7kgQch1-rYr( zxjzf~B%vrj1x4^8l#{b<)tXuGYb)&VkyDlm3fXOUOmX4wR$Le4pt!$e@j_dJkM;x< z4DxfO0I<&$o?<9)b!|Dq=kX{ePjq4UzJ0lz;{{FIVMX~x2(_1ia8?V-W;NFTlkCQ| zBkV$Pi*0@-$8xf8+r}i<*jz<@I_;4!--LDkK+ZRX_WUolTI%RIwjLq;r9N%;!8=De zBi6wL9{~?a*3o%%kxt6Kkn)apenl*bR3#VMP~gt7T_5H`n`WE6Xsj*9*L)+^z3;t! z+;X!nSVwC#dxlQ?!fi8b)yh=bxdL>zBb;HYI4j|v5e4r1K(ttK;}GU#byoF7SqOKb zWS(s=Z}Km$TeHZf>V}x+jo|Ns+tL}p&3j1 z$+%2NgP+!Jo3L8{c+B0fRiqbXcicG@rJPY9iWS*M+XVgJ#o2o% zZIS^$vJSpbksUrz!2Yet)~=fXPXk4Q2|~!}u@;LQni8(Kg7u&t0pS+-5wAR-!y3}p zzVh|SC;$wn9T`klP9s6=tI|;_+6~rYMfvP6axhlOww0>}+ry7e;d~X$XP=rBBjpI^ zM)9Lxc`+9ypVN%r{`TlsK>&~f0KEI4=MaH>r2vqXU1|ULcf0K1o@Q4hdg#$~_&+Eb zztT)3B@D(@t}KjQ{$?i-OvA{-H2Wye-pgrqGDk7 z&y;|GTm{lbL}*)FT4y==m7p*;yFo?r@MQROI#UQePB8)@ zZ#DcfDa)6Xf)>L*uTS6pHUz8xM0mq};U$YHFN=O50ZY&-;h}iX8pwzTy)TG&?t5?! z^AZ^9p}UYn(NMfS3FySbR<8_Rv!1fAl+YSU0`-)^0&yc1mMp=I>3ApMF<&~0lC1KK zTs)TD=w$@}YQ(uoE^@_k7czj(L~!OouE8J>8Ij}xLSmGQy#_u_^xanar_c{XKmSL% zt^hz>=lzqvc!e~X*S8M>aLFlLS(9@5o=RbPrgExrohlSULS{YmwV%3mLO?106$_C8 z_oB@$HH?!nHhp>`b6Y?52`Io)ZjBkCZnd)4uEC8*-r0*Nt(7A*9e~@Pu{I3%EmCxK z84Cn$b6EgFc&yA-4mZ$KAypnPffN8#yMTT{c~nlxA9?}5F6(Q#QPvuVYz`)GJ#vyp z${}=U>3+CnJt?^SLv-h#D>ytgBT3lsxLPYSW5=cp!} z3Dl=Tbf!Q_6hct8ZaFIHUZOloSN~K|Zy$n@kdGDhK}Te!vD^TMdMRI>O+=GUGzeS~ zg1)D-xC*B}r*w3$z8IV(y9q}}CLEW-iC3k@SO0>e1-(Gr1Er%cdj`pr>Zz0XR4vHy z5El`Gbh$(yFEa_KZ|k}E8WL(K1f)}-Aa9ignNSc)vH7jA9!Ft_6B#EShmfvh!?y|; zDgd~WN+4AA@JdgHXb^yuM0ey)DmPI~3IC&+Amk2GaQ{un6h~DVFbSbR z0Qy#k=iBK;IxalrcPnlM@=ljpZF!lcVwpI7>L_47fN)fSJ-kXyT>r@*uY^C+>;D*+ zw9{0uNawszxH(wHGh z`Pa|}QB@B#iWvB6JpT9U=wtc#eE#U|V{FDw*!}CL+wcG0jR=GT8g~<3#UcTvaS`9x z@4Q>Y2Jx+b8Wz)QVBFvP_(a+SIAHJBS~?1!d;k}J4>w-{qGQ~DCtYx44NJ^?T(GIvCiV1M!$fQFW=q~&&^j=m-A2s9aM z@>V{*nRG&pDxZAFPx-1@1I_0^6G;Wsyg;tOWXUAfg#cZf93K`+M=6UYg!2s(dARl< z&x5T{P+x5*)Cj7xCN-}+VO?WMVW|Vz^PD%(&O>q={N@q6pmxSk6N0%~e0x@1xZsOZ zDhed&<3@1UL%_;ptuz!@ut7Dz@E7D2qBu|rbY~nI?PF|g${?UKl`x&h-Dw16QclX3 zzkER?ef!^_45FK!2pXsbWRr4W$E0;yfDb9P?M$qDCnNk$5R-&@dJRcHO)B{GB9sQs zqBKy!VY)v8&8bsT*)$Ie4oeE>8B-#Pm6KbKzrQ0u)}5eD`q|W}vk{UGvQwwd+L0rN zID9O`vS22b1PEtYoKGGr!5`fxSTIFl0k90H_B#6!t~=uT4n>H6FM`Oe2!Z14p1Wtk zblD5^TD`4XHxI4w6x+J>h~?#-MuU5SJ%W$F!v~w~&%XO}Ke&GJi}$+q#MZ3`5$0E6 zkr!k4-ap=c_xI+xa!TgDYWs`7coQZLFo5Hx1G{*h!%&OO1%f_hRDUcI@Q)UifPg<6 z0qyzlIwR_w4(;WKqq5EijX;1Y{3(er|7iqSC!54{gsVC4S{gac^jNf=M zU5bFnFTxVO%~r3TZTH?cgTqA>0=P~r19lMR6m%H~WaJ_c4q#HjK=I8N4SK#rR_n*G zNY7yoO~bOX5k^EAmMd}4@dn`ON8)#~%ywdZF@TNnk{hS8QN3j6@MrkUPq*RzqTR+% z8EMG~`TOBRamsWU0cnF7Ksu08SGpR;WEK^tIg4^LZ%cbLN(unX6ABk>B|J$B?kE|!~7z)dc+ zS@Tob{4~SN0Xpt@G3(n!_YqbPvwhIO!M1kwLiQWDDmZ$8DW$-g|#HOo`(*Yvu%m_KOgv4`s97%M}@(e(Iz> z{j*GHgumZDHLd_qRT+ibjGeT+6d&7Q3bospzBC878sizW&Gyg#e87JA!}si4PyAO~ zvo?W#y4!Z|IE%m2d6X>E+}2=8v~<}h5EZ0} zOj~Py(2V5Yx(}Xd#?oe9Jvex!yWr|6)Co5H;TwGuGm=*LE)1_RcKHhCL?!Oed%nA3 z9~Z<3)4CjAcfTTyD+6BpS0tZnzr6D46KQ`PM0-|9#E{k3R0bo2(cXMW^yRXykwk2*O zN-@V_+-}>pgMPjS1%QFhJks2zOT|%fD_|Dx-jn4}llR$BiVQ0Ff}=K`CVTHn`E7@GWorwmU@RUHCg#Pp`=Da%z#s zk+i~283qos=*~+o!gRUS`yM~__R5O@-C?d5kN~2OFTz1=Z+3!TU7RrOuv>&w>HZyN z5q>K|_%e*_?|KAK`MR(0N00a2?}D2!L`agb|8y5Wa^ufcEd>lCU6FU>VfaqT6X}W| zJi0ul6_B@)^!25)xAyZ5>~UJL77!wWV8HdMW3N_$#g8og#gG!R!T=bCLQDw|53tt3 zJ%M1vt@{M8k^eki>O-UfU49_er^>oe`vyZdw`A)QlO=+{C3kmXT53IMfr zb?k?m=-2g}k8y88ppda9Yizj~i3j6Uu1MlhY7w-*;NxX6D#%Qo)pU6lJ|}3$sX_$L z^%cq9A4DDpFC%}$HVWJ9ikH_2(=)xEVZ(GZkgg8X{Z0`g@4YPDlVLFa!t{buS6B^& zrJ@LTEdvd8;K#7}=Is9!-GMY%ef2k9<nT z)fepkJEz&A`N{NII%uSM^75-uaFmOoR$H`qwk=r%!k7#zxRkal0KBjbfouZ`0CQa_ zH(?;WuB(dP3=eU~?rPik)=^uDJETO=u(spcavSc^YU(=?1`Kk(gp`|aTs|Mfq6B*# zrS#)R&M~&IwvTJKn{QcYtJjXT#9@7GKfcsAzLE=6c{@IyF@8Y#KXJ$i&I?Cv_QC-m z04zfIH^_2x1<`)UvX0x6-5nFylgEMV1_Hn~X)}k39N--F$npTd2PLED8X-Yd|%S(pz8FzyX|Zn-M;BVM)9Yp$X^U zXSO3qUgPfK_Uz8IKJgdr_Pa@Q_-GfDp2U6FvgM;u5Kc!){H*QTns2w?wUoMDw4*1m zV9pT2K?aK8Em(RV;~XgjfJL@)Z88cFoT&~q+H=1=05WKTD}`pC&ILg(1qF|(C_~qA zhRO4BBfs-~dch;OX$cnR=izbGq5y!w!8)wWi<)iot2uTqyNeFhEKDHJC zc>?X4XU{*q-G(Plv%84XJFbt^`JdEKm&c!#=Ah;T*my-5!5@E_>=e7)cyM>42~Z zJLYi?yY2TOp_sqs`|ccw+GW-hTU>J@d>ytl47`a3jR-Y~zfcWvQuVzw`Aq zwqp5kgp$Nj2Zw=P--PSG_ww!e=l0_wEY?=6nr+Kh4`+X0Wv@JY(hlz{#rl1S{qDDy z0cW1z)_yMBBf8d(0uUTC50u)e(-$}^>l})*{ONMu)%lp3IV;`Hp=fbBD+^x9KzKZf z7<+(*$VO=4;xU{t>M+1KZWl`MRUO|3+Cdz3?#nr`g|()yL!66WCoAkrU7TTi#e!m2 ziQ>v2+!D;9Ju#%%afbFbyZ4@1xb_3V0kpig-a3VGLIHg0k?@FzxT3Pwwy|T!z-Q}Y zrNtHSN-OBkX?8QN8~f8PyZ2;srpRWGHk7eA!=}$l#$8tnh#Wa~^vE&RycoM_EeaC1 zWPpY@fVGd6?W(!p@}#UaS4tUe_Mr?CUO3C1ufIKp0>JXs$(-54HA1sZj|;l?ytINS zooaY9PyO^b3O@x{=8pv(aH5SG-H&t#?Pa*SAeZMyo#W&J;8_#^#*T}#FFrOA{uN3H z;@gMO$+sN_OD+fiKLP>ZlUXb`I$Lb9u$Cbdof5kfo=M;OvQ;RjnO9ZfFrI z)WLWZBFE{h0uVk+;CXj)mK|#2#wOF}a9tG528%?!?)u~FliHmhk@H3HOlL&4YkC3EiS9X&wZ2)N*roK zl9Eum>dU!9NlWl8jyt!^8RDVC;%0sbmP3gtRVS6!d2AF%LOMNkzC7=}&yuzv?InPe zj7xGK3CCp_E!qeHPCR_oN43#&rRS~$c%txn9#A3DQlN?3PO2pL zdM;%w?=PYc&(y6HPPA2TmMo^b?@>O%sf zp(XT1p+vkTMuv_lkn9%WH^NJGhRBN>eH(LE``A0V72S^A5gl}KOtO1K`< zNwN}0Snx!+*JQ&LoL29i6c+03WKy?49jHPh_Ojuc+6`n4#1T+h$O&(@rVP*=hh|+j| zY7jwu=yDiK#pgcgJpTCC`^S4hgt#m>UEPi?l8l)m=$-w^`9NblgD!j%bsIvsx!&?wAP&91R6ZOYyFg8sqx zKk`BK#1jkAQcZOYLWS{ueVr70K2{$Sl-wI{p0cNZzR{K~nri>^dv}6Zpg}}PH5r#T zBk6(`$bq-Qo_y+{eYC5{Zd$+8?tN?mlN$bpadqJn4uOMG2LsEk<-KEveH>^F`nSe_ z`my`jU=nbvcxV!mMUzI59(5+1e~2UDH?58QS(6D#FgUfisUt`*uLMvY^$9`JJfGAh z-Sa|evQm9C-4TU9T5v9*+0cgpo&ZF*gxj*9Qom|K!$^n#^8X{@zb0%gO1(OR2|F#5a`9R}YiaenLfc(-ZKyNljK4wWzbX7eAg&!6rO%{Z4$VbYhMbnvN6f_!| zg%i6F2~_@IW2Aa84RSmcUD6p*4 z#gsD+>&!F`OT%HTpb<$OJ6P1uo&&n@jWa0UoT2Rvi~bqFj;0}m&Oumy&?Zd6%He?< zZ1U6u=AB9k)|*3PlfCsi{s`OS5n!&w61xg?jd#%wZ|6{Z8*z^^zqSGMzk)+b5vT%( z5K5)PESS&cJeT~o*un*4fm6R1x_8=BPi0~;y~F0uUjZcfB*y9?d=TcdHW&w=G4}i4 zUWn_C0Wb|(5p@Pqj7-9eKUoch&MbLlzM77f?=S(s0N7?Q8Q=B$q1j6oM{t@cSmiO~OO4#B) zBvBMc*&+u;pa!fsrrDkAr`bgiDmJ}$5T{*n_;XwZ6GssG?Y8x;Y%DyEvgv9A`Vz?q zFtdwqn2Lq{1RFjU7ZPkT=rZ1OrLe;A@;;`qU2(piLwvb!kcW>arFFM8ekjQ_qx^Q*zW-Nm+v8vRL(nwhaj)|} zb4d+a{gbewX`}yF!<nP!j$?kPg%otH zuaFozzGexq-D*7bT7`RqDtZPa}J@yEq5 zANQfWi1pCa6z24xkt!Uwe=iO!N@4SJv4WtW|(h^?i+^gwMj#gugEb4ayY8zWiP>!dMD@`OTI0k(7D{jXd%%j~2e{ znMTh*K~C3y`{}S(KKYDaEMQv0+z+L;sa&F&N~P!O_xglufS4>|d~1GE8|eI?XFkU$ z9&r?3pYTV3@E5EtdaRfJt$STp{0JUh>#@@Ad0jKwH6Qkjb*=lJ312&bo*|UN5))AZV1E?HK2FLmQUH#P#VSx^AlNDfZQ8REk$iiU_Fr||Gs(}JfYGd3z;RA_HokJ)4)48)P`}es$0eeCzX(MD zvrTVh+L_bAzW(MrhFkH4THAmty(9bTt)&sBdjDu=4tJrHkeWK!?tX9&ipRo9WwYW8y!Wnp|eFzd@e%^V`?Bh@*PPGr-%Cqh7pTl**63<cIfC4 z%8+3Udcwd0|Ed{%O1~Vc@jZ zZn_D#Z1VO(=hX^WR&~iXynfm?ypjnrOgt{;=GxMgBd~lfw^yG#4t<+Jnj2@2d}*Q$ zhYu0D(rst}^^raNM_Ws9qk)@^ymB|Fx&&iS219bCDBeqY#z5R)oI_Fk5C$qka1EKx znY`X=YO8J594yBZqHG&y_Utot2=QBSRWJu3TC(lme-0i}5xftCsY7X#(kjjYWiITL zmH(KrQ5bZrVvO|yVJ;H|fqeKaQ|$rz*+kF*jvOgLseyJq-2!^vDEJl8Sn3wAPXH++ zwjWAv^|-VsrynMOgfRmpfHc;;M$Ro~Y}c;yHVk(Ht2x(@pl8WD<@VI)&Y`}T&nhVU|D zWcPg9ojW%{&6TsRtM*yJ!(ZdyD+%n@yOgFK*RoY82<4nDvs_%7!quhiaYHd-B8P%l2IUnBq97~|BoR{&?f9RwGjEmiQ0{>bP!fbB2*+r zH`Ef<#Jk1{9GB8n7>ncU^+ zT?l{&ff$>Zl*m3TKy7iJp~91=!)znSi=y9(l`W&QD9R|oo_O5oG&rAM7P;PXstD~Z z0iF!?WSHBbI?*s-+(0ashq^v{tI@)rl3%T_hkfz*mxc0$F_v zsfz3(A1sY|&Q=m3tsurFaFyY%WOZ29BhVHZUB1ALgoZv~D4+NNl07(?iK9H-T3YKr zWmDNz6&*Q(KC3aKJFk@U@>ND5rFb}G4BAeMW|b%gok1C<0yNQ7jPsT(1=4?%G%ZAf z;1DB@mD5mhxYI{`$WuqELDwlpVeJyU##GQbVE|J;wT=6VC!CC#6zdXcsXQ*Y_H^`A zw9{X?NJ4Q6i~o4$w>X%udhF2k>`7#ZD?|ZT$eivp;x<*pLZ>3EHZ)-1`(kD;J@(|(D$D*K_=q6Mj z$>5OlG7hB#E3^b5$w~09O}3Jf0sx8nnjxC0u92C8veK`4rtYLXRCY%g5%Ez12&79? zlrm5XKSz>~(?Mlbx*msk8rR-WL|1<29NS|r{O{ij6aZd1+)Q|BXQ*S73CZ=LCkQHg z0Fz2QLTvfcQAe$75H!5}WT+GPG)9IRAgUDPq&zCHw6q%0?kmW_S9Zlkn>I1krl8Ry z|1hDJliENqkkvpCiP*!35A{x{2KGUsR{3>bL1ltcsE0*L7puO(=q7KHz@tZZeV%U`>@1R!~JFxRMRM*-kO6AAz) ztP4M2-+p3+tz9!r{f74t&dVZ71(!P3sjM1=amUcw&PGr_*8cd9S2O9-k<})VaG&do zL^Xj(0bt7(gdk6DVt}<`*|-?1;qk5&M3aBcOC`LVyV_O#NYF2P_Ey>VzrWStuD?ICjufF^auwOIrYkfPG(ey>76=oeF6iCbV30A#7`Pn`@ z0HoW>+ZWosUzv=M3m?NkZeaC;xsBtj%#oCvD{tBrt~ z$h!`y5CmqNgxfr%?)v9jOSQG$`-B+0i&DE%Zq{uEyNVD@4jMDcTYo~ugJ5zbxD-p6 zAi9`j6;AK8C2?AjhEi9#vkb>$;9jT!Q(Qj=? z*?K|S-Y^b;#L6kO3;4<#l{OMzX&E*GW_KKi2+_|g%$NGUHm@guOV0%&P}+X!>0@!( zG0GCL3Xl@dE3X`~&A=tb#R1cQ>tahyP2>=G);{{^0E#$+?JHl!AKa9IXry=9#!cIO z9!?pNitn~UU=dsFOZYvXF(=yo;Ya(>jz7&NeLfoGcBo_*#c1iigr zax9>Ys_nUFKd_WxgYCQDy&r*Ne|&qj+IRl@8(1;4+6^lfyEXJNEHcW=F2Fn(gaW`4 zpwd%)9OrWg|D*r=9S)UMHh4e^ht4Xy`Bs<(KsL%%L196;Wu2#`?*nrUxtJYe$|jiU}LP)xXBPe1h`hytyk89ZU*#&LMo{1<5= zZF1}C7`LoVg9b~&rT-dJ-iU+>etCGsx$062`i5U)i;k*3Sq?n+p1mcw6ggyv50zSd zEg2$EPZ`+{c)KaUyH8@Xt$6|et7t~Hq3N0l6y%QWr*OY;mNJgAb+_QhefltqWfLIg z@ZQ~p_OqXCXQMM1sKxOxi>s}mFb_sUtSyJJR#jbTJNIQ;%D9ns??Y>Vp&I~f6x!y; z+U&_6ZE_f)F{4vBd=*(Q2KQ8$KeHC4+8CG!edxROxMpaJr=E6 zCJ_2|udZmuGups8ZT8|*Td~@ycm?qWMWB}?7vr?{}p8frOl zcEngG{xW-AlD}LXY}#n+R+LImP=xkkxK~xx!AwhlfwuxU{#q>ZkDy707Zkp{=r_`^jZ$vlz}!lx!wNozuaL3`Ik@t*oUCD3OaPzZMUb{@BaQGXcO-~ zP=EI1A^X7(KA^8Z>Pj7Z_Uy)wB|gpL2QUZ1JQH=Mdn;oS)KM+npCj=l%z?#q|^diNvm{~8C^>-k~Gp6`{;)xQ<4=d&>0 zZ~Avgv+LF4v+JyVK?ie2W@e=wIB*Q*#n~`K2D^fkQm?G+a0GygiZa|1&4=08&(~Jv zScU??Yp;K3X{p0eCQ5e(irO?>Baoe1)|na@se3?gVg4TjlqCXGFIA*ynybWMk>!(+ zWgfWyHpVRbclx^W-}?!Sy4^?EQ!PXp6jU1el3OJ7Ohkq0z9I>C|NcBTSJUz8G=g>B zOXTaR`lR+B3Kt2hB(8`Sd2n^o-E+FiMT9Hjh;)(lS%gst-;en1b^rK&tjF6c<3tMJ zUp)$Qt#rFzUsb3u?e53j0mC;vz6lh*j_f^xmpz|Hf-9WT48!X&ae|-M9`!wgD)^_b zAVhaKzX?`SkyQJ^76ko*NEb4S`~r(1EVnRC&8@5zHLl?v5A0?#u$qG69Z083P9DlU zhLsKdHx_FGorgq16<>dX<_dCk`g5zAcr83o&uV^pP77k{ZzS*)ciO~;*X8#;!-j9K zpk?<%ZhEvu$PDfII=m0c5&jD5r6n+cdJMkBkPLj2qreJ-)R`49mDLZ!)^ja=-+Tw< z)pMQ6g%l^4%yuz`_$`K!_Q)ZWq|yqQKkV)~55)J2_H(+FGz6y`1LURL(TT3wM=QR< zd3R?2Bmbac8pvWn=TGGkFmZzZr1%n8tDZ_zWfEgZm(q|Ro9%x0<>~5O_mjvE5(wXU zpY8sAMM#h3eIxQX(i0=8>ESiPN8W~CmqV!3`sgb%L3Y1X0rVosL3aupj-qgmxN>d? zLq*z|pXgt^#itm~<)D+*)YQ3>OkI5gd&pYPU2UtgVZy)!6oeCj5l`TQiwn*wQrLED z4~i%Hgf#N|AiM4=T%+n?h#udO`tn4zx&9S~yE07p>)LOxm)d8A*84E!>!tDQc>Y=C z{`W6a*zdxeuhsv;cmLvV%{Nq82mr660I=nwlXeH_i?^(u=x9Wm8`NP>oGi7sQ2?mM zZP@bV3)}^OTr2uqMaPsqz{?weWzWt5)_!p=48reW3Ji~Y(m6n;SxSaS>KmqvSY(|aIp%>({_0D|mYAR8tkpr3Bj zW)A_Ot_aBREY4dOZQzhzxU$3gdVCV7O1tp;+-dhbun@T6fe1wFfz;oJYqC}woidqu zuM^aQGbop%pr6#&wxM8Oe-YPa?bWtw^&Ilcu>9g;gw+zpCW1P!obyS&y}Dtq9X(hK z6E@D4E>E`m9$p0c*pm2JSP#4Kd*8QjZ(Fc90|bDnoMSH8KmYv}Pzhq7%~%x0^K9VIM!N}x z>iE6`?W6b3S{Z`gTko8}89l>xZY{TWK)#$aF9RfnVk~pdV3j=ui}dL*oEtzkJK*l( zZoOrtt%P?d1%S8TEamLK4_@L76jp~~t$zrCe;f+U6X5sNV_2&=V;j_2J_ z^GzUd(0Y9F;w5|G`BR`gTtKOM6#4Xr&v1gZw9Xy_!QkebWk8~it60740tx^xzj_M6 zcP4!5D9{(?g3>n%!-@iX=Z#Zve}-b5umGhCS^pDxBsYC!$oIgA&34&a8uJ z)7kKpMzhv*Vgyo%kwq5P(XEtYKILo2^AL( zgYCFrjORR$vdOw3%pWx%t`)zm%><&eV?|jatSHx@6%bi zjF~!18k}J1V^c8PkZTCZnHUIu4wMLsQAYbokn4jdLa<=Z0$pe%M`)s0LbzyY#Z3qb zCs_!WOAze$LQ!kb>YDxrku%C6Jb4M15^Lb5RBJ7;`KL)Qgr( z!Y~e02HY&G@LnI{>hiKsF7J2b(T;M*`GQV6fQypyizOiN;A(Ru#$5z-$pK{x{wcP` zzT_&j4b&DYfFzRoD{E{`gCU~16tmjt$4zc{8w#*Rd!|DZwr8d7$wunyPk}a9-BH~A6>_Ym;a2}CIf5tLb_;iozP<>f=0sxIoQY80oV->Pi_7XZ(P3IH1pHPa8s zOaVzlA7$R9%F!&+DiXsz0f?7q3NPzz`N(VHBR>XhG`t3qgxH<}ok1qdC51IWPyvyP zU*I`F@{S!d2u6h7DgB@kYHAxDDk~1?yh)SBk!?_Mh4>G1sYj|<5z1U$E=}(8Wmyc| zvwX6`zqN5pT!Vqf(O9KPiK)g!TnH0PmH_?PT=a%c%`j7HP^f4D+WZoOOB1-Rs4g^9 zPq*0?v~Melv2eV9rake^d1$ve<@lr44lWf3 z|AQ@PY9?VdISXs!p$z2DSH3VC$cM19(VoY8c=P6Mb^{P>-}~+tIN)iJl2N3x`cl4v zra5%@g8lsI1GZ!D1^jC-wEMp{83hhD<_N|$iSb{(-zOZ!cO`(J129G+6DNbqEz_B} zoS~-GSc90c;u>PS?_!`zpzVTd@7L-JS`;V<@qCk@0Z%zKaS_nn5NN`2O(@ZV{56S7 zK&duSxpW0_d8zjhO~?^~jd81U;;Em+YuwV`v^mhGL<#_nOiF?#6I@y^CL}2iIOCAX z)fcA-owPVuk4wDKi$P~{DW}RqEb)<;rbaZ$nlJG^@CsG5FuG}iIgl~Z97SDi7A3M_0 zQj^f0j`8?J7r9x;+7WtJbC@c&+Nugm8#&Y_0mD2T==FF|6MCaosFv`t%AH@4FO^!C zXrwFnQb;ZO&;yL78lXWxIe>;buvEz-lJVs?$wrR?8VfJeUE7Fj=|>3s%k{4?1F z9GWIrYHBjV$Rhgj0p@`g{L;;5OiV^;p~yCDIN-`s>+ik+82@o-RyK3c1}R|U77q5k z@D)EBZF=V0oB~^a_axi{OkyrLVb9>ZZtR%ZSSU1dK*>gVU>QE_Cjv`<1mRH$zT75p zpp54rxEsbxt$p*Gw;%w`@Mizv-)7rWKih(T`83Kl-hBj~0je%7Eylj~JM-+}hk@N^ zeiKCMFP}Zj0cM zYN)S>ncvAlS!K#QC#e5VfZWRkpeeP%XHIgE ziba`VD1yQhb^#&qs@vz0GtCV{h71OogY~Ja-d2;&f(1kD`DYH> zVc^Y$QWK5EKrc4-<6sV~xofITn>W&3c`zF>M%2?8!;J4<%r|?t=Gm6bhw$s!j7IPj zTe5tj4NC5-#SW&0T9t!lNsCp&0Q~ralU9&jWi414U1C9HD*~N6&{!NmTcjX}Vy)d# z2s5$61`HbDt^-O-Dq+MoVx=(!CdWt{KLPd({@sRRnNeI^V}JD*yX~D#dE^t%0e?7_ z8%u2O-g5is!{aazDrnmw_Sjcv!N{5bEGLQ-Rm~t_9JRmu>yNNNT8^S#3yK1z)Jya6 zB^X7WFh(bF7#;^h25XR_v-aR4Yhb1&+CTj5X7)=-Fa+n=2U|Yo09s}D+`kZE?gZQX z=4q694x@oSn0c-RL0P+f``h>0gvrrZZdafHu-i(Cnte=kbk=crO2h~1eCjnEOPhE$ zn3}6ZuFHEie)$#leEsOz+k>~i{rhi40d24aakv)Z1ypFj6rXEAuFImm)&phi0 z0BcsxVI3Ig>!FtZ3Y3gqeEEGFgGI!m1rxC7!5W(O)I6m*sR3xi!^bM!qV0kES2BO& zmz0B#Z}&CX5Jra@DFA%D<0J=dDFECG(^$KU;N9UP1-4_?VW47}gJ+DUFKX@#`pdr+ z4L*N5L9e_VKIoa3fB*LGUqpeBoZVy$9%#J_ugiCz3LFOUZ@mrnl#w*}a>zdRX4>P) zw`?1SR4Ln)gXVVeVm%g|wJ_J}S^Il2@8Zu9##=w&Xon^aav0m8AX*5{Ut2wO*Z<$w zHPQ%cb*;272k#k*r{T{?0RQQGR+W>{7nx6$rtbYxSZ)Jm4Qmkt*u(KydxwB_+(R#+ zA86gwz4q!lpt8sfnaU&ohQWS4U?lYG-=BS0Bj=q~_8GYJi{W&`#zJ9KHVOBI z&Y)RGd+|mTpnD-88z86t!7Vrq}C{6hwj2&;cQ;kjn6%a_RRWQnwuzCz0(~br+As{hmLN@j6$eApSPISKw*9Pk9)4YplRK8-&`9%X|TQX)+aEy5^OCB*psFY zvO@<8feg>GvpF>ge&X$cFW!VODjI0_g9y=Ua2L1G5#-JnQ@ykKs-{|i8-hXeOBeFFyhKCGo zwy*rot(?75uqv$vJ?*6J+gXnCLbIihAA%rwnYAHgc<1fyu0SmWgIn%cXnkUv?9je* zAf2@`_Ti1N26SYl%4xRs-C|Gya6AW0B{=DZ>6rt(B6T-7$tx;YZpTM3=AQPTmhi9aj4yX z=N#)3(`37L?nA&7&$(=grHtugA8tKmhcnN>Be?-fxh`A+977qq1ovktw(6$ooL5I; z#1jJ=S|!TVN9+W?>_?4Cw;NVX!{uj%?f!TlN*y2u;3{o+irGw*8D>u#3c>_yBj;o7 zrGxb_nBjC1)l}EOdGhr)@(|7!u^tXaaiKqF&U37-weU8V!y8FtPG+1CR}d-1p5 zJ8#dvuop$!Huxp8ZPwgm&fF($2MQ#qBPZH_{l8F-xdDIUgx4z841aCg$NBdB^9Su< zW*zH)qM!BKFv3xrYaMH9szca60@Q=~DAd>3p#w*4U_V)nPqwm(I+SnDIO^MoQHcoU zi>urRK>HFbEe40X25%Er*HJK zb+?YQd+wXf+GO_X>*vV(W6r;0L8YC8+slEB^C;3kZ+mtfbw!>fiznC@ADV2lXAhwL zA&Q@Gf;P}J6wX1F6-|uq(JpVyA5G6cI1u`*wMG0%SaWEKL;P7p*UFpg3|k>xN)A-o(U zBDqIaR=NHCUvIawXK)d+ewNKz&=&)a0>(_ejl`%(D3HU42d*HLudmZ#0@o|Zzt?m6 zv|p4byw$ggr}3hz$BxX~NXlEKrH$~+vrq(Uq>hO;9z&H8Bcv!3;qfXS(X}6yz$+)G z3Z;_*5GSi_96Zg*6Gnr;(ih$|gm&S&@}hmkViKrpx>Q74UAHP0PYWJ`D*(XY_C3FNOJpkkf_UY=|0BGz(wSe}W(jJU z;sW76ilcGlud_%qeAp&r06KR_QA+uVYaqf%aILz?Dq1(9y7u8(hdhWjt0FSb^znT< z;r%h~s?!Mt@;GWI7+_vUp{eFYWvOZDRh zn(&`X>FERAJEA}@?XdlOK~2few~13HVN^9DST7|6fL9pAQ#~jjXBNekEKNL9DgnKP zT#gYWeIgD6X4SS4qn(BZ5D}n_)6#PlN5v`Ov<^rUsVnbQG}TWZ$zvoKcG(RCQ`;!6 z`iSZv#ACIU*Gt79wuHDH5KzKe-g<(fqZ^d+%uA~}6IyYlq@ZUWorhwdy5N?2J2E(V zsb5JjEtwBLo#tdsz6iwWqkf4Vr0VA_^=YTE(!k2>L@(yEcnksuG8f9#o8-Msob4`R zDBsxB#yC`pT-ucQM`aA=7_D2E*hKRym=Cmph}1{p)%%(vtK9m~(6Zl^GJp^;r0gMj zDTo(`x^#-}`oTkesSkLXY9yXX$v~f6TmU@#gC_z6fDH#*7{6o?q~Z;&W>QDxk5`h~ z(=lR!81KtMjhg@jW+HhL5XbdE;Woh}l0}r56B7P+w&BYO2(H4jSvC>I`pg;Q*jOP@ zQKzFUDxRzvN=q-IS(c5aBhbQA)1B}R6YgbExZjLRgRusG%?A#gwR31b4IiIsqwq~G ztBWWxUcDhyaV$saFoR&44dk#D4Lk|FAs8?nOiqG{=x|L#tu(nOn(e*Uj{-Aw-0r-6 zqW$Tg+{B`*DP665nLz3Qn!5$}{rn3j@r!)SZo6%={qc9^GXQKrlfS9Z2_hs^I9-=x z2EVWMS4^UI2KA{^o%le03s~}Edl*>dhaQ^CVI+v*1MymsKjWFo+S1ZxTecS2-~Qb; zOHCb(1>`K7J9h}}|M|)nW}&pI(CYo*gFJ*a?*T6wZ-4fukJ|L<(sB}=A|dJD>aSwj z=bmk_Up@n30FZR+)-OQ;U=qj{tt{#qUH+dhCPj#+$-^fy;%hMRFAoP?2Z+XJBhm(4?eA2+cz# z0Bvl-a%oXgf|_U*Mw6L*!U(EduP7MftQ|pLFUD*vzQvf`$wyjAbyy4w#e;2)FCf0i zuo2M2AsT6}2neSKn!w0INs^z!O54qq5%{gT`{Ygl3B^@DU7{6~ak_XpDSLEekyJTk z2`}XcLCg3ij5@Yc2h~fAuMTJ@Myh%{T{y^}v|Tfb_d0Dk_Tyg z@C|HCN|L2>$WIy)&momdGHp)RYwJjW$ zXIL7W@&o(Mpfz8L0CSo>fC9kAjoJ2(|G3izCyWPLZUkxV#M&Ski1QnPR*$xyKDmR6 zT*Cj}B7~O}2ehWRA}>;1JH zcG!qemkRt^|IOcQx3@Q*hOw;<*a|abmVNc>b8Y14KDKpBp}q9NF%Gje&{jpWs=w{FX}Bhs0$u3y^kr=j z#H962KYdmAA8#wPS5O`(y-)^CXW8BN!t59s>*MKcPJ{jVcb{hL!~i{ikEO9DYAn6^ z`U!gvUyZ}l2H6)LTwvp|2oRb}OKpd3dhU$v+p!-8!#y?(pOYJ2+5^hMdDaQW3~NX% zn~vUCI>^s*bJHalAtP+T(%E+O@NuguZU7a74H5*)J8}Qo*B2QI4P@Y(Q zOirSl)9`mU2wL<)LE$u30mo1jXhdL;K%X7RT7>2&g72jWF&8aOrY~mMvBM|XaQA18 zm&P%E2~+xE`9IATtQu!A3ACC1G54q!Xl{yTQz;=q8_btoAD*)h-#lck^(}Ve>KV5D z=BYLyk+H+!u(#$;<_OIrr;jyRNq!A$AE*Q;3$6M>Bbt_dfTbK|_uW4W%emh6%ct{D zV#&nS#00lqIM4X+>S|?g(!|EU3B|I0AS_JBC*f>={||qE$Ub-{+Yd+gJTTu@t{QJI zzqH@`Tm$|OXTZSx#I&>fIUsMuRgxS=lhpm-VWMF779tj5vmPE3E?8bwhNX5eA?WT7Bc$vnCarY++=GC3YRT;K=*bLXJ|z?d2EYgGUUs`lHz z|EDMr^qpWYLihMoHoW%@(B&5%Lw^XY?Vk40+K;ufZ=w-(p*W!C;do1L9s4p`Y*lvbVaU6;d;qmGa3U%W5z2S z2@w7a6V-d|IdzuPp21PO*n8-?7)OC+O&ej@o3byK#heDL{C``1%Fwy>1 z%G_eOh}j^)y@d3!aVVui$7c55ES%t$u4=U;TTB65Oi}a+}o- zs#Xl;P4AFw^{gxyq3q5Yps|S}5zwW$=Q8l?{GG-YbkQCDNUcKl$yS|11>f*~UI} zILlq)Tvv^C^D!(cFWHxHH8p1@f-A*{9tF|Y9zRxlbmD%k1xXR`%h%fN$}s{SlU)vyCsG z0ZpvQ#!nq$_dbBjJM@;G`Q`fv@Y?LIdvCBA)013q^$H3A*$C7pWXxbJnH@cT++od= z5gzT>mW7}*2A*4uD`pGbvK-ViSxfg%KuLJP5)`{Hat=O$Qg15nidh3n>`RZ`g#z&q ztEy?iqCU%ZY%R75lrd95WLvpv5ke3w826oE?nanVaRE06=?JS5EDJ$y5sKmxs>#Z< zgELaXz&POTr`gOo$*d1mb`li5!gKg{k4vx;_!GlNciF92-uLU9U>|>&4{B%=3IOA5 zI7<5)u*^SkxCy?%e9JG$L0FwwF@D@C=mmK~Ou9O`H~+G(N@t=#NkgpBZC+_5JNACO6yKJ15zi z+eU!^(2B+OX};^(1ISfcxfSArehCWb4?cpy0(0B5Ki^?34N{1JZ_rg|dv_<>k03`k0&^d|ruflr!2yO)`-2h<84e7RM@mO3R#M|*><+gd#0gM|e zEo1U%TnJ3GoYUtqctGiWX@=c%Z<@`X(ccEM$7R_FW<7ONb!0B}MgQ=pk@vdae6KRZqUsU6Jg>Qaij?J4h2sE*5+_~nm&ug|7C|9goHyOp_ z{`SeQak`P`WJ(P>m%mwHtH#QPX)qyNA1cmuUxFz8Iv5WSzCwFn~ zslzZ~l-;;|s?$-faWZjDuxEER27_HFB~P-uKzU3`3YgH^8u|sD!uBXVUuSQ}1iO>EbhrWFdC6rO{zd!&$xxY_1b+h(X%wHjn2X~C^ly2lrUbiQReD^uR5IYqu{}U02ZaaGW=`k?dKHs zVaij#yfXv^@btoB>IIxX_SsP&MKoI;=iFQb`mM;9hK)`~fgZjpyhArmQ&=LlqNrSn z8_7HrrAk0zf^ldmqsQWsGRb04Qgw)L_Tu7~tFr7ek%Mwi{zBrF0zk0Af)?zJ#oq&{ z#rn`kyzHvCx+Zp$N6A$*-+OLb(r|142{-*Z6y-}JG^R$z* zf0qRD6hplCQ2r&^fcE>!PtUYJj7IV&i~qjtrDNgkY0oS)Wx{0Z=SmbH_ILFAKPisLdw5bRESMm-ig2-4;dHUEV zy0;DKdHe7-{HHuz_z(S5PYG6~m>mfG0|C6Zr-Z}&Q<0R0UyL0{@AQ)NM8bcaZ&X}Y z#NegS7W9wi@^Ct1NiZu~hv!b6t<*-Up!W&lIQ?}F&~sAOIF+@%_^mDv@o`0-DnDUl zIj?rpnMwrHc~o+upj)UH$S@NH8O|B~`*G%kekzxc%xXb!Z$?gcN%AL^g*xbL=fZvJ z;5AUQsaz2S0H*=zX^jhz5R?}bRQ|+J8Cf z+v8H#-qcMB6FQgmL#{R`AgQirOe!$`0w zKL;I5*v)L5vQHo^ifXmR3&#P=Br7MCIBZ-AfjbdARROD$gO<-|d=rhK3Mw-M@)q)+ zzX5;LF`)zfD>vt&WggA4=s`pAS2o5sebUZR#l2p1oZbkgqv@ntHwFQZDFzzjip2pR zDDo=|EnCo#&OX{?@4s=>N(!=20GNOpxJU72 zHNn2~okbCafq;aN-Y-S{)mK3Ob|%bISsf?U@I9 z1EmKhmUrLFLjhnr7Mg?Xi6<7>jc8TFSM)x2b-e5SRyUEB(q15Ae){8W_=|2u(DoHH zTwz>kvFLX;JxsPP`OAqAN&QcggC?mU4beom z(3*ra8S1?zFQ1I~tqE5GH??yor(aEsQWS9QG2$w`CVEeg#9R}L#?*VC^d(r-aQD0k zPkQ`xp_trlv}=)88XAD4cgd}Rfnaq+uxzX2H6j3%2f=3J+4NYcJ zIH{?_x=V8+nW%@VvcW_c)J>UaE|8*w%B)FA#wugiL{`S01?ATy=rkj5ZpAFs zVjyVlYM5)~2yN>tt87UBzBYC87$!ME(gtly(yAt7wTr`jnVmt?x)%b@X@r|HF@+7K zk`~0N^43Qg^Osw{3%_}$wAbtrKEEsPOKDZb~sor+_OgmP| zFN3gxAQ)P%zkeBi+>&e?R>h?tA$;kvS!ipIMG@#Mu;<%s^vGGZVD3zNJ~eEG}{&|oR1(M!Q{rBXqVU7Pk!+pyJP2AvAwSO*X&f(T zut2IG2)W?gSv1Fgaul}retVJ<}3+MDO#pK%KCg;78qw%gC2+J%t)2!0S(*dt$_ z401!P{qmRlZ0DXFgy)k`0GMyFC_Sieo;^`-Klxv8f=Uv@!5^j=N@bhgM44mIa1a}k znU9NM`V=r1#BjhK#o<)$BhHIJPD@#qY2(m<+O(_>MMU*``C}fDEdQ1ZZP}{f4xvf$ z{n9}~!si3~%V1DWPa*o{?Wlo<0ytrlIFb*7+)>5m+T`L5nJCnj6gl!?gT1u>O7cV%+;4b z5)ed^rV#D*1#c#_l5^R0w&U%Sc6@KXYx$<5>@s!AG>59(v*#20;-hyXEZv1AM~N+4 zHW$Ua!JxvNK(LR6&!t%Wpi8-InjOeI2NdNg-<;lb%T(H7y1n|!KA`H#V4T$3jW=Y# z09s&+m$Fx39rt*ro@`q_Jce6EoE@9I4s|MvFZo&r+XeE-8UFi1|>9YDWMoPeKIkezfDpKr1qI|Zj%1&rzvg#4J! z=%Rh30Pxbw?>Yj&;zf+D9tr@O*`!Fid+&K%6&$tpOdcO>0pVrm5g4S)+$Dw-W&&8YNCyc@^V`4wnJJ)2;HpcHx*uzw z#aiR8bU;!muV}=ItODlpMSSX(G52?|9}gHRqec$H#Rb+)BZfGn z?W^*==Fjee^mrSl+2fIdUE^_&5WnJ9ky(edNAv9bJ_zp?8q`17!Af9t34tvB`Z&N# z$*;Pm8rrn!ybaP!3qG@J`EKyFO?4Clz}HmnRY1kpepwdx@-G_8VMb>Hg_96m0)1yV zc=lrW$Ra=3kGgP|bhJ)N=&yZzUnEw70B_#H<4 z*MF;QR~N&d@vs?a$V&Xu);BcKCQ#r? zPY$^=O+z*!f<@TH~KM@ zl8=E@Hv|671oo`ValF+$Q&!et?|oQdFK*ZmTz)ZUjbwZLTPt1Rc-OW(Ao%k+yP%|> z5|7~MIOqK~{MD~RFx-SC?>4*h-Wiq-bnrVU47W86w3}|5YI7E$6n_jwYy6kzo~g2w zv}n8kVce#T9ca%zvmF6mvwdOxQY>*3IX5?eyaocmnKlHKGaW(h;~hs`u{Qskt>m<;29tl)>=VcCG%vvTSbfgFQuwc zV~3+m)kfY$?n1ADGg323#Y_dSRHo%+_XbUE z0Rr4CYws$tn{S^-JEh@v4|IYzj<_}dZMRDSV350Bcn(Cs!n2p`E04`b!Kj7y+l@v2 zK=>2WSPPo5)IWw|MTJcqKhpl&f4dP^gVFXEf4PNyW-E#ZlkKM4NAtb~7XVrCc-w9I zR9TW2+reWcHh1At6admKC-1yH^Rulsxc_8ZwR*Bu;y!NQ{!HevLA388=y=KA+I$%0 zkV1R#p>-%Nq%i;WvbSE(x6LR==jD~K2K0vJlkK)Ur(!_R&yF0rh_HJnZXXIjH(h6= zQpVceoqISxmD>IHEU~-SkHgxSc~Sf=I`@@40(!IlGhfP`#mgJcfR1>UxX~yR3}+2$ zLGhu$GT7gI`w!-0e86Fp@H#&i7GJWbety(G+IiU0r=&W4dvUgX^YtSrrh`m)_bv9N zM^aGGSLk3Sy@(;hs|e;d;2t73yP5KUL^muJqoi~M#3SrtWsRLWSpb?t6|Mq@BV12G z0YSdf8$p8^!TK15@aqhzb>Q}30?(^K#jD3iY6cMgBizk~_8)oYIxz~!wfEjT!@A45 z3^aQ~LoNI+8BYwfGpEnM2ObJ?E2s%&QH}_C1f?EQMEL^!d{$5md9*OCZ%?$w{#wNzAr;?*rKugoN!M*W0tt9>jPr7lrhhoJ%Ko zJC!2<-2PFHojrRNzW-4B(w8(Afo5kf>1#N(5}`D|Xe|~3z`L8z*lRDJbEAXDzcCe9 zea3^BL$>m6WvFPygu?3<*k5RO!T>VG@cjjqhjbLY;^-5R(i2Zhf%s^Z zpe3F>T?}tB&l2LgZ2F|JHWs0~go;9LlnB~eosO&aa(-&0C}H+=hagOkuXY$i6;+*< zl~Zat`K8vUFD@3QjE5JK=zMAM%9WndXk^YTDyXvTb46CmJ~Sa|C<;``Agc^y@2oJSnU{a2B{P{M zwv#yS-HvTAZs3Lsy>}35pn`fY22rp^kGND1Auss8&Lo#E-CeWX-s}Lus}A#5Xwqk?Uurcc(Ia4%58lrhEVCi zB$YE3wpi?iQi_mlh;xb3sj|o?tQk~D-(;?h<4|HfIa<*p-dI6_rhk9L~}bnsRhCV zoqb$Jqx=9=d1Q0l!=9vi!@P==PljHfZ$bf#OM#sf2D*{E$~$Wk<17!+naG9`!7H)@ zD-_+KPue)IbtA;?McGCbOP1rFTm>u6Y+i4q4;q7B&e57rE^wkAbyjvA{VQSjxLZhM)0O4|5QU z|2n)ai6_{{Sjw*7*MUf%WZ1@_dzpft$`{T_F+`sB)KB*?p+*N#h5U@4-f3_g_b5Ya zkLIzX2r$&y&lLdF7vYijf_usmA71#Ww9)4Y)LDcAKz|5;M>n@Ix5GdQSPmR2aA2zA z08!P&p{d|VkG2Ug#v?$S4Is{V1_+c4B56$&AWqg0Z~H(g1X3w(!SZ21j%6cYA){d` z+b_Oa5tJ1nC@U>1VWN*`vB(KXOo#f@h1CDG|7zAb&|}#wdu_wUT~=DvWI1_w0T6Ky z6GJOIV+jU@j|*ynaU24fL^epd(Hw~TKTWizHn~~E3UX(wz4ijGg^v-V?b6Bi?QboI zFlO=yOZD+;1uG$s6aY@40B``8PCMMH@Y~;BLI?m=cqV!D-XDJKpD_8_J7R79`bGqT ztFaPk!X?-eyYAC7+zp(B+&-~Bwv6bDC~VIBmS&8EO>b|gvA_Sj^=N8lFK9rzYFqe(!u3XuyfG98Ug4pMVqVh8-(zMFC(B?(g>6 z1u*BYxnmOAbDd0>K=`Z00F|}`*h!no=Y->~7+}l;2Y#e@o;%UNQxODm@1x)P$Rma` z!dL+09w^{Iz;D+uV@_$)aO-{+FyB(?l-5w;iZ*WH1nVnp2ZsQT7AS2XnwLTXEt*1y~y(daumH~4u1EMT}JZg@16YE5?NB<^uZ2@}tIwJY`seUx{M7&Y+E(KJ9kb?|T7;bgY|5n3 zrg+PmJ95e5ib$Tn4~zLaw4IM~n8jVySlr05UJVujPhprJe7Y*~#2$(%JNtL`6qV=)Ij@b|Y=?!8h zC0ITh;)C#%a`I#aR-`pB5_)klKGtr$>0Dcc_IDfW>sk&Uk3PH}B?;W8n=BrPF^!Aq zH(uX``?gXnji=ck{m&)1E32_@eSHlT4I?huL_!9v$DMyFo(Vqqy#C=24H`bn7hp8f_U&NRHiT^8eL$*P|6*fh9?jeeI8zqE(I? zcwDV%stGOvqb>)j-}q1e6L2s3+fzq>eDrsutp1mwnNEndp@6h=Cz|ZPcpnY_O_n70 zdj%8iyvxvXpOtFmMI7QEe$~oRPP_W@d3H5!CF8NWmok@dRQT#d0r-E40I(v|Wj#|* z%)pml+>hJBEp!4G@hc0lWSC?H1(|5ax7$Dd;0fk&uYKdsKIO#OQ_s9-MTD?ehR27C zubo4zc;+RVm+!oC)E@oWI-4=6!2aY<&Ote3Gurxx?2?NY+4;C{Y(uN{(4hthh+dcq zSqK!5x>Z6VL>(##cIDOQ!@#S+8^A%dv02OFQ+=+*#&m#V8TRF`U18&<#4-0_{`Vz7 zOv|%Jfa!bh)Drh{x5srZD42xXzckkBcW~udgO$*D`|KU(6U(#Po_S%d4b9E8RoBeH zRo8IVDb`7SAPxljKIW&wdx${QI;2C_t}QjT;gth+1Oa$gXFCj#v39u>Sf->}2lx^X z40~WoXdMxJV-Xm{vj!Z%<>4DI?6ZA4ieOL>t|cx7P3R013$tNnoI{Mprx6(R*ylcf zKFTvAV0QJ{wyl-6?v?G}gP-C&;IN|`^uO91UyY)-+0c-OHSHQEQmgR{T$}?02FPu;_|EscmG#2 z*BekK`ITLJ?R*$$OMqjQJ@oK8!W0;ciN&lz!|?!c(Dv*p!Add}LC9&l`IdPo_~f8% zYxdKhuCbz{MRlzQ`EDr{ z4mT)D5gy=)$JgUdF$=4s2`~>)IMEnt4JB_Q%&fOIloCQ`_gRx7KnV3=f4C5 zgdQJr>6Jc^T_~n>yHLBT3U`gAClEf=`FSiBdNeyb8$nPe%;-U^HN#LIl`uL8V|`Hp z$Ao4PjP%-sxBYvzKlwfWs4-_>XBQZG9!>HQug=ct_i97*(rtepezc<`+=_e3PH0gb zw0mG$H8izwRwc}g7y~43ZD~XKhC@6I5}?GnEe>Wp*6W-b*g@IzrJc+~g$78%;(a8R zb{QG+FeM>B^b!+KG`c)a$@QepeS!(3uJ5h-t@-J&BDIt6Y9yb2*wNPLd!4m)>34MP z@CURe(EiG&I#h_#=`6tHC%x0vd`I7%`HqyJG<-x$OQBfV+-0cBfEaV;jF+jh&gAj7 zk~X>=xl$iWdb0MF_lQ#wW}E1CmG2%U2rp2Ln{ataIE9r`H=hnRJGEDz?oN44P{ugx|Kje)@u^-R@ zWIR!>@K>3EroQ^W{m1{;Km85+U_o@9vjZP}17j(WoIH6N#%Bd{vmGWpo&u_?P_k&H zuY_PkIGdG~iFc|T6auoHhISlNv1&FS^j|Q!DMUX)|Zxq8?9j6XWb6yjZm~ zB-(2)ayG$DYAU*s4NX-ZVx(~TOxuAMwi1*YZ@J?f%N`YLtDo6!2k{)Y2-o(@FC2@o zw1%_UUe4}KgghI8#qLrYIjq<2yB9a}i5+-qTVN9>U_p;{@lz-O6dgWgvuC0JkkyOV z$&J1?Uw+vo_SX8NSn3zS>~7>dJDxM~WE9}a>2EQvi$_D-kF_nEO0n*5MX6vO-V-aa zFn$$5@eI56#zI`Tx1#L5$2PuQW1YBY&&?lfV{=DX8Nyugc5c1>T&qBl?&X&^vZrwF zXve^ZeOF6PGCWhACB<7BIf^iZBZeSwJ8U&obqI-I$S0&>q|spoGl$x8R{&_W_unZ) z34O3#dHpm5%CYv$W4mqhyR|4d&qjIZ7#mHMt-2gf4s&vWSA~ZFXm4x7t^EpHzG4)f z9_sDxe}0u?=_va=p81Akowlc**-TiuE`-Xt>|3W@Xk1^5;=!a*_NRZk9N}$(eeZAA zL5p_Ud6!PW13(@M&>e&TIDj&CuU)V*kM+FCo?pAya>h)x+YsO$Ifgs+U%X~1ad{{w z%t3%xg*S<#C|Qh!$5)6V`AK{ErR|nCE*ay16&Nqb!%QFefJHl=1xh(zb#}Ib7pHCB z!hE~p>IIfZT=`9#8VQf~D&ZSrQ0Sgxbu}juIPJ#5Jr5x_VeS?W2Q>}y|}X|rZ)j}L2Md3mq>{O4HmZ{K6H7LK?1 z3umBEQh^fp2J6D3-krBzX*b@GZA0;5r%SnN>-$iwIEn{=op$7K6R;gl*nm6)#+krZ z*70~ziqC={aDee71jL*%@OoNNXz#?+;#l0PXK=ng$R5xH{1#a~{Pefq+K3W*zTHB6 z`)pj>>#W|=j2G3{P9WIF6U097CUy{fr!I^*GC5OZV-QdTA2`$QxP30?&J247rG&LF z?Eu!@^l_{$UNjuVo)LsUOhkF+5MBb_A?(F6_&m9`ZQDWk3&((s_#E=?WGG%tu+QB^ zn7@K}+S_9fKU(ae0Fsi1qd0(Py1B!tC*Jn$slzkhPH2QiyM?)V$t8q&WR5#T#X#fI zU-7N$YCBy4;MpgNTmj%tDF9r62LNaih0Oh^-AwtTm)0Wj4Hd5Mo}cU>yj}&ovPpK` zjhv0~04Ra{M_pkJ(;KG>h&kSF5B+KvWz_`*06b7+WSs2*Kzzp-_ZE5YPd3^cC^i-1 z72&GuC)u2N!@;|t%&FQwy2g)c#eej(0Q(QNkY`SWgoaCwP~X^r(LpKvx1wIkNLn!s zofi#0!7b+*JV5B=IB0#*&?-|NJyf1DXb%+)t#!>$6Qq%V(mnh#p(J#d;8b|%#I*1f zK)8V1^YT;ms4VW1sVgG|8BrQ%4VvA7=h7AwNL$&2I}yD0idU{S3e=>Rd_Z*sp&=PW zu!|tq0PCBd5~|9pn|BY|-36#R#`v6}Ed8TiDJQsM1Nq2CcFHD`dlyh~oTs!#R9AJ{ z?wysKE$f{>ykKE2XGkf400DU78fTj3Fr|5Z@smpsQeOr4SiDZ)0rCA(_dYib4*(+x zWfBvQQ6B4oE4`9g@Rwns;F-o*YydKibk3*}3A7+rltE_~aG_;BXb(BvC!6qRtvI^mk_^v$nya;WCD#!PmUgS3j@h(Ba7SGe*wIe@DO9w)CJ)R^!Rs+kcrWAaCc!3!?r^{pv*tNKd>l3UrUyG}sM7NhW$oeLv0lQ0H2~=ZrEr z_~dgzWpI(!ahLRxhe_T=20@0tXbkwNf5JW5D_BV(L-;5d1ep|RXa_&}Ry(K{&wR1e zqu(k^a92q(MinloA8Mz|sZhA#kw8n-39S!&bAC_J*_3l<8lG{;>g!)U-bq>`9wuTj z099hGdUTj}sRdl5b^NDLJ#k#%eS$043pSF4p~NE?DFx|W`2iRUR=RvV`73XFnyU^M zpR4MVC!wDzhs*+u#z}LA1w-?kSFBU?i#m!30r13+{y2C5czkOII7gv0u77fnS(h01 z8gOUG3nF^XSF|}=J``hoV0t2Mg%R?Tro5~TEx;|7NZxZ7&4$rQYy>SVbXY~`QfFj^ zTmrFNUS5Lc>;%h2NGBH+x_t8Z-53IJ-EE`3J^J@OsFO%y+R?EBw;AE9HL-Sye&Xp!c?^f{B- zv;U4i>USkB?4Csv`E!`mBWIlje`bi)6#npxmrNuAezErsYQTA znNL_es2!kd2~A)#&p?AP14~6I1ZcsK*NGOizBKht0|RGx(kQiAjSFjna40OKszYmn zZ+0Z|1(~)+=dAjzMOH3C)%G41-WUxOWl3vML`5i5FjKj44o6pTAQ8)91a=gv9;+c* zNCgmZU4jx9W(Yn2Os-cP#sF4}x#DZq;|8i6P4tH9TFZcWmOFO1O~uN8IGW5F2Q^2P zi|MJ@R>ege^ed~-z)#`un`7g~3W)LmHzjYM8o@J0f)9C5 z$3wt2+SVP1t&;fiLkV-Db#5FX0py}cUNCmx!tWbje~dK~e2XF0Gh=xQ_u?8?U({ny zb3h($pF%J_Wis*9(1d*Cp}n}9-wht5F;=a1-SrD`OE=2id=s~HTleB-FW>$GZy`#zT66Rr-6P%s+Id~UF;VW;hz-?|7*{IO`gSJ_Yg^&J=wT^#N%M0>571Lf0p`|b1X zo8MdxBbH4AIBnu^^n)KfM{KVqlq2$CWJp;Cf$8nD>`PxQU_1k!(PS989DW}^fTjN? zEGepO<@w|7i(fs5gL4iCg+{yk?v3^^ z-rP?5L^R`v;R+9dgo&I!O$N#*E^|T%#a)T`; zB*ZN!UR0ulwtHsfHcBGk@x@A7*cZ!f521G2h)p_l&@c}AgK^Ej)h>robkW5VV3NzyQfq22Ou}aH zx0uixxC}ksMw?QZ2Q66dPeMszE_>x+6jJsvubSNY|IRxXx`mLiOj_;t{c@ZA;QOoX ze|+^@SXier4$mSqsbTc66AY4%-R|$6&$85P1GY7&&~FYZ(fGm-#8Qzx(Q?RB!{Lr`|4MhvL+;iKmX(glznianuBn}UC*DHGCn)>=acK-4FXaC z*tod{#^eqZbLQJP6f+Vy7zlToQ9#+TqXebQU5z?*OHg?_GQ9ley8 zsL+#?qcv~mu5x?*tu53s+h)zcmFn+Bv;Dh)>XU;1qaYyU)5YA^e&-u1UlP#P)}6vK zu#)(&EeJZQ+`_$=vqxq|I*hw4yaExAe5kCA5d?9j6TK%oRJf^fqNvBOGuK)5oq70w zf2X#7xcsv^5GgWRoqlS0Q$9V@x3(Y1IrkdVjJw{3#%2^IJ6Q9XD=0eDK!bH5e0HlH z=&EjBbhF{8-t;uqP?#K@Skox}b0*B+LBtJ}rMj3IQU;c$ezY#ZBn2AU&j^vm=$W^N zHYi>6(ldV&fuVkj`J->ut$yeVdH5S{!b3eLp$p|n?0YQF&W4p}kw8xenq29%TBuy7 z(LH@g!|j=i1ga`po!BC}oUZi>LK*&yGDBIR-60ip1N{i~@Wh)=Zj~EpAi01)bT+hr zzvqvXzom5Hit9XAsEL;57WQk-L@bc9a6sPk_*EWJO*TBqW-Pwiww)-e> zqiNIu>N#`y1Aij;I1UR|&~~z{Yk(Pl@?--ZWh(K?fnW>;7Db*&&&WhkXC#8B0l;7| zG(!?Dqvvh zU?|t21pNwb@gI2jEi9;OptV<_lsg)J3u#-5?5b-pWJ$=j4R0PqVA;z$n}{JoC37|r zA?!qA!xzDeNwm*?nKRLZczfZQ!^FBjYSXaRUVc$7Ap#l*0kF@lhtESGea#IEESYoh zFYkR10nh=?zbkFU^0AzE+VKFe1*Q0IyxbLHIhu}=`))fxNU?L~uf!8whixYgeSHJ2 z=GlX|Ts{q7 zGM}}*#h%6M-|*4X>@#;wvWC`LyZ_!-Ej@lbp4z6MNOFubcNw7y$0JCbg6D-3cw*az zLPxgUfLnPP2Z+z`@(U&Q+*1cRbEYBmNk*~t1oTRs<>igR^1jd}OwOWT_4dRgub~`} zfuMRc=fN_BK&S26s|qnr%7@Pb{(`&FHNSsN=b5jsd~eyJbJl*mo1Q?)V<2a+1O)XJ zz#|6*fLRDU0pJ!_0GMJU@vJER*J;k}$BwnZ`^4z$S;9XaXKq4- zNMIwF^>U6LGr9x*1p?g3gAwo-6MAejc-0BNXsk^wNW!B;s!g6eojHM_*WGJ5Kjh#o zVipQH^?1-bWX%om?%-wh5dt`W`~c1)lU<;n#(Cl}iZ%D#^PU@WO`SHvR<0b6vhpD3 zL#)RG+3~U}yn@WMJMJvRlZ19?fbW+^1?&gF&5bAufy2+>$w2(9J3c?vR-8Y~l`12N zf9sdlF`dJN+yDA6TL>3Y2VbfH1$h*!-2=eKXBR$17qd6ub3gQ}J+6>(?G2MqW*9*m z7|`&agc9;1kgjOApZsWp?b*@CdAj9;Fki zTF;!PO}TQh9TjrA08SmIZQ`@(*5?=BTE3;EBEqv9p{DrvqEfZUxRDTvU3NyV6jNNh zI(fu&I+l0hgG=D2eZZ}QRUq|<|F3!_BOoVXF9|V0A2OhK(`5BeIc->Gx1cx&Tb**m z)#sa!8>Bd;CoVCByX3Q*P4O6&OjSKP)+9AQegqSG_@hC)~7z^*1q2=6w z(GH;}+VFTPx`HP0p}lG(#k+z84|yE=!Ho+>HRdjx4Cfhg0VeVTFJ%?Xqy)eW06*xv z@&iAe{glQPr%9-@kj~7SPh@wQP^9Y67SaYq3c(Iqodb%-+2uG4pbKv4q2Q`=_)FCq zFI5Qckk-$Qw8!y@Ubx~48H7)s&<_xyy)r)SqaIyI6_78;3$v{LF#?6wlF>FtF>7q+ z3?^^T$bck2iG>CfKFRn{2IM~91OQ5L;j~~09Mx}ERN#$dXA;0m-a|5)63#Gm0md?a z)IQG_Zj~s3`Qz=UKNJNYnml~mfY$r3e$dBAA2eTB8Y0R8Qc9C@NsxVML(#lZxspHW z+~zIjndYp|X^c>%za-BZKF>*~en|c##SU({51&2^1k`2%v!Q&0hdS^~UbMv*Q5l`g z!6pm}v^HrU(>#>&yN{t3N^d{SQJX18GI^En7j05og$u$DSB_8`+M~3Bq1qVIXslJ7 zcrnaX;N!|kU-AI(_z(XmC;&XU ztrNIw$OS$c=AhFrEqW0E^IT&YtdvOMwT9GU93)}+mm;QpPb@L4P7=%MpyiFp#=>bT zM5MIibhxG`UbbpLD1h6^V?`CNbz3-NB8@=-fX1uTkdCiEfXl~~Ka2^mMT4oj4Qsul zR#o3@!*fSj4vG!Q+K9B^D;=;9{A6w8J=KAqWhFko&xQXPSlpx{Je5-K^H1)zjqki= z7o9iBzWd#aeQ^y60LrNmQJrG&;VSu92il>iW=ZJ?!q2ClR~sum0*A}na9@(50m#mr}^--E#vrirR<`2BfSf@?8Ny zT8mx>n*aUlpw(6yisc@MGS~w#MH7^`C+Dx4IVQq<}Um96oHz>#ZKrL#Q%2C;hkxEbKgVq3+ zKxw~C%B3CNW*#WLYSgBq-9m~pUL6aiijcR1DCQ`M7UDJz%_l4BtRBtO)5Jy_j%EK; z4%*qcqLY%1HhI-8qDqzsUjQCyH0Kl+=I!>)Kf4%fAz7r(sR=3;RzSHnk+G}Ff8&IHaJ*a-p9h^wecxX&Kpo2+o2?mHd`ejmC- zA^Rmv(dV~Z1nF}Y{Xk1mrqTPpAS_I6s z_QcQMwkFo`OD>#Y7b7elIuxx)5KGH|+U0}~4HXV*s)=Fi?UAq=+Tp<7lY~^*gHX2= z215!lC3~@wDPVaRWN*IlzGVzRnFF^=rxQDEDdjID1b~5)D*j|yqdoYuH?evzvE}D1 zvd`RBh~W7-l;x`ImYXlI-Ygb+~&!!X%c0xi{j;|2503$P-HFF$?{t7}k?13TC<&3D_ z-d2yLck#t@Jyv55n%(>MHxasJ4Vt2<_Nf~e+9dXvM4VA*jsh9}F|X-~4i@pT#1-c0 zTH^eze{l!OBi;6?YZlr(+=K1gUT&{Gw-al?cAGvw&sJS|jtybmKGoN530P2iY&9VR zdumTNA1vg1A-qoDX6)r>kJ$cgMV1nuPHl>>+-T>aBzMJC)0rpo;GscMbNbxXu3~x0 z&EXbc+R@o&*I>PW-ucs+A6posBQ^=<(igup$5vgM@3GZ1nsxOZ%#ZDa=U9s+_BR0c zX>fNnmM&>_>un2IqqFR(C%160InLg-1jbd0J@mjESmyOIudieePPXrTZ!`7ovZX5u z@KjI;BT$w(`#C@*Blt~*d0K>P$CW6^jHawId*X>TglCv-pT2g6ZFu{*J^ava7(&Br z@wt;>TzauD6R(B%C&Nq+7sfYiME3+_|%aLu|P%McHS}=t15Pz1z8~-d=w7ZC3!8HwTxR zD2Qs!*O+N-Q5dbGtWU44f6p#kwTQeZ7H|mh_mMOztQxnVZ@;sj5HfXk?KKx$&IlbE zD2M&O2*%?ZZ*H+EQ?b~Yn!_Pk`2!8$4f*8He+vi%dQ3u|T1-R^?Ev#SeXG1mK7^moD)>wt!BBL<}ybBPMggOFc) zvM7t>)KvOD$TA0}1!Y{=I#RCjgFUpdl;H*pPf(&n(9j62(#|t6xX zJqYIZNCDs?T%V8eb>f*Px7yy_Z7Ay&aON0l+jkrw^uQh~oVFA?KLY{(4*FMRIip5m z**qCuR24^tCM@qqK}+}H0iXzvX}NauZPQRvs73+cbp+ozcI9<5tzh;5gxN=JHP+rG z$C^Eq-Cz{xTAK0Rf$~{QY$xvI3-Ah%i-q=KEXPk+7mCcz#RmT3KS%+47z)gjr;H^u zT?LymqsXuTKgI2#H5%p_SG*hz++SwR^dDG6x9fy zVI=KOLWo?%`qycn#yi@LH;#oT*=2wCcke=HHru%v4P1Kl1QY*MhX=N!R?|=p{70dvlx=UVE5R#61>OWkN7tCAj_{U{5}AfWGZOa9xOC zGTq8bO7L)qH-YOX+oA>8gx?Vc2UOS2#wrNR^+11OY}c+HJOCU-dH0A7B0hN<=IO$z z@#9CL=#2+}SqLG?QdHao&XyCdpxheU>VW$sTd;5{VH_F>SFi=8_A0yW=1WkDhfg#_ zys=Q{-n~5-7wpA*>OKsb(k(ZC0^`$-kn$*WNIPB-W?5d|1g!cu(V`|4PbQ$~)eY{R zKrohy!oWayC{@e}#&pJP_CZ|o6AtVqgxWXXG66cD80^dyUG308Tej2@s;&q{^b`EX z`7l<6@`{ z($swBWIDY0<9Jx8g|~+23qe9cLOY%pGVSx9Bc#Oq3~;i~e)7}pggU^RT}CV+^(NcQ z*`qxq;(PBB8V%k@e(q@d@>gcT<4N%~1F-rMBv46c*iOvk^{9(ao7glYKMzr2gbfKHTB#@p4OCd6o-JPiorBDfZk>+i?b z8(#ir{Z+5Sr8_CeDulub!iScjw9$@%Pj+?|Yw;L72!m_zSfg}=fFW5!ZEYLI59KJh zoN&H*9>V!NjHU)Qc8QoE4tB0sw6nmZ%EB$KCDIMi=0Mh`~j_3;?0)kf)_%BqYmr30F_y=D!tzV>{ zOsa6Hlt5X@SglN)IFh-RhZkDyd-Mq*{)rP^@UoA)SDV5alP!<6EQsA{5EV*bnnL0< z%1uEat9ErDH|zj5c>G7`yB4aZrJ};nH7?k1oMWPxMpD2VMri?jf!7 zskxV;is0;LA`&Wf*vA+HF4ZMDk37w(KzWpvtA9U>(r<;I_VENxsz>J|d5TrMdKrHv z1Anb$I#bAl1f&*xWMq?k%lbWrwO7#77zQKZPWS0akH>8Rezpbz=a6{}g!j zs;>)pwM$M$n0DdXX_#$N;L-RTjM6#80EVBKphbb zg@d$N>4c*J52P51K`lv62WE!jh|)9kv>~JyeEmEv!v@twCt{f+ymc9w%2E|ar2z0x z|05^>Jb?m$02G86bbnle_#=SnlEKy7~l~m6K`AFlSmhKq&JM=>kkXcxrYBLJASv zdk&Xa;(!5!0?0uLB85Ktv?865KL|CIUcyenM-xpU0peJIlQ;yNER93Ec)#u1w$U!V zgxJ5|SjM8Ng@!>?AsQ$yM+!h&gGJ;Th}HXv*`1u!WPkDJ7uj+&q4i#6D>;x4c|GUH z{n0qF$#loyit04hj4wDbe$!3o5bJgtM5@N~Yj54s9GD#6YDewCJ>GiO^v~ zpk3;k7NyYCNPGPUn{EZ3*aO8H6A}x(AR(;~6wbnO6IKMdB*55fz^rEab9 z(%L2zhn@g#sq~R`C8^WC^u-J8x*PIvO&5dksszpN?HmC5V1P_SK)C~$)iZ}agVlPL zGs4xs+S*h0_+$HsnZBRHRv(A#6c{5h_T9g{5Uu_+2SFH5jVa8blcy+qD`|;azG4ao z$2@fp97QNm-|h3Trlu8!%r?iD2@~@WPLG0ti7o%vM|X{0Lo&&PTshxTZX z3%Do&govCNsRGgjC#Z$+y zF6AIJW>2(Xk$`eW1@Y@HUxMaswk2VmsJ`oPCo77wl3HqvgV4?*EX{x*EGC6wZvEi@ zJcnz-ddtttg?V)fE%#7oOh(@hxk`SS)XQi92}_UP03A zfd>xbE#Nh~?at+djTmpw;huBjyH(8RLadA8vEX=vF&YI&#vB$?yJ-(s4@JkC&0+^`-q=)?JX0u5n*m-|m8> zMqCxvqg*XF>D}xbqJiboUvNl6z%T1?aN>?x_xyZTlJwOeOh zmi%y0v6GbiRvYxVpRSMgSHRYL(E$D5A%jZvz9^$#qA$;U0+2(!DpyxX8p;d>N1yp? zPoa7~c!j*tXVG7t%=<;@`k}h{iarl_XOA37{3WS?vtRm68P4qETlBnlS+w$*(mZM4 z8R$0BZ+|Z;AaX|S@15%Og1v0rIo++SY9JqPr?*9Pu-*#?^whKXIYRNXyRqaDOr_w_ zjQd5=nB6cI)n+LK$a6p^$^tqWB!kJN3ReqH@I8h-xnzaPvV3XOKwbE_8baOk{0Q>Mr>?gGShKH)wxA3A_R zBi7B;cn0Vo6jUwrM|($`w-+61=*(mUZG#acWuq8?C$qFzU;y+55HC}I#Rxj9em(l+ z`fmyW;ZzhE18xbQs%tt>hDMS0P@P?WO$Y&?up2tR=zTdc>t9{B+e#67$#wgZ#o5dm z@JL00I}Ok{k36;+W#MwHnrCAzI@;6na(;ekpT?3yh###}i zE?s^OYw-Y-jdA^cTs;wgLn*E{eiP>%-! zl&sIqwmp0C?Do<=n>J}Fdqq0J(5(m@s!(#yL7+T|Gs;Q2-)6bv2EwCi$J7>a=vIs(4S*V&(CKc$E)fq zMObgQSOH2A%T~_B^0waOMWGW$zSv5ut{88ZUptBYE8W(#iHkTG(Mf`q35? zL27LNxg+h0>!#AKcoYCoV#b>D5)=RsLwh*Qr1Y^U0L-?LJbK{X^_I{(*3T=ub{zp% zDs1+G5$wH$lY6a%^Ip7Nd&^YH9O8nBViYJIz5jhHK0;jeWm8ak$YJg8u}$xm+Pf&P zS7F^dX~IOi2zt2u_(}WqGjAdQ%0_5E4uRou_V_A0f8|6JSqiY^hn@i*0n_;#MSYN3 z{H$F&d+e9@?X%5WkKwUlfO}IZI#S_=YG3?90cX7tjAK0BA}UF@6;E7smN7WqE=9R~ z;o^y$rJHT_b33e~soHM8`C`HYq8Q_$F%YDny!+Bi6}ZMf$Qs?t`FSh?s6>>0i!i1- z&Y+*hqr_k5Qakh2KHqNG5 zcITb*Q0UDJJXpt}U|GAGum(>(y&nY@JXXdK?hlLoRNP{BwpaTZ;|3IEa`RH{-FM4S zpg7Fjh_y>E9gD!b&q~TQ_XcA85@WBwR>b+e2gP!X3=+~XWH^o@d^6*ggwU}Weqjq| zjRhEkO@P1DXFvVPPWoC#NWx}9T;_Amos2?DI>uck@V1KBYlqsGzFbK7$`s#^eM}-l zqBW)!JYV;6u|4_7A;t*>fG7<)JWiib+mp?gcD*8kI_?eWqeKE-%p5tg~tsO4H zQw9oS$!UamgjbuLGZb9La|-!ILy9JBXz0d600L)>ySmv|(lZC4%re*&d*xZP4;hLf zgOY$x#H8p{3D88`$z8e|+c|@fG?Xd9r$SfCGT4QQG~1PKNu#z?nwO)!PyBVal!u;@ z@KtWLg-d=OK*?65fUVm3lasGHBJWw<;yb)zluzIY>u8`ryyOQunyx zJOXA)Olv7ieU%}aV5V|i$w9Aqr{+Q?c=F#MxBjgyT^J&=|CkuClzmq@2%xR)j+Uhq!MXv3&XaOnna3S%q?Yg^SAia#&@q1yD*#g4l^}6+<1PS zOO(+=LU`-NrA0>K^{HGHps}S>JoCJiCA`r`gCzN(cu`RUEXht7VnKp)twJvYH{g}Q z9Fj6m2fWZWWF4LGvH1_~Nq(a8bq)qoq%c9flKZNuqAeV#;HeY<`bZZ;M)fn&qR=+_ zPR*fT5-tIImm}-jI}uLaYYc0laXZ-`B{PbnFY%;zJYhb@%1Z)sARXnBbZ|4l z6-h^U&-?UM9A_Wc^1$&R0sgF;{`4^Zb+>aGjP3|5TK4h)e5ckXytA1%Q9} zT2KIZd<%h*XqaBQKp&)XtuH#HmZ-WOy`#a3xeijYoz3cGVSy_NRZ$!3h_$4olMOzb>^(YeNmLxn6jo46DH{9He6G&%b>Ugl2}P z@v_x8PfcCX%>MQ_|9}f1SyxxAZNgpF-FN>QE!jkbPYZ3)LNp@-@9Z}-eZ=qIgqLtf zlK{dGq5Wfz?Xi2YKpsK-v#)X>S-NxtjLIk+KBBmfc%->d*MNoctA_~zu$I_wW9+Z~ z@~RNWS^X8h>WjSk)@E0N0>Fb0?z2Z9+iCNc7TWc9&BWrA4N;47fnRP#+)G$zihq{40u1cEMk13)dT4XrR~mT5s%St`tl2Fi3eP&d$`-7uZlCA4WuIYJAK z*QejyYY`6GkJQF99}^!N3RD9HJT7g((umZ@H$WCzEvVAC?1vTUqzs^ZT5!Ej0uKFh z7c_cK9dwzt^PGEm5@>}{*nn%kisEvMgJ8>rIhL0PD-r zEVs;*UYkd3z%e<4=%dP$OEkXyqqU5-^a_7{I~DRUsvo_XdZR>+T{pfLnE5~2m`>g%stV7K2j z5y4@yZQtI4aCsXs+xA2Fi+Mw6Fi^wZu~&#UV(zruBu;CVQLhk%zZ)FfKu$ zorFN)lzrg~OR%=c^SLEF(4}rm@$EQn&K1XS=rCCvvJUA5IM;=8h2G1-PWkaVVh|QV z&^KFN?obZ5ih-Bq!cjr)qc0V7_S+Bs)-TniIx4Hskl$X$`fvbO-6ar;99X92+N?!b zCln5|WJ094yC?{ZI1Zqv348Lu-Ro@UdxvcC{25qc&$PUJ4%FZnnCWxWnbNA>g>9+} zEYP|EjHI|BfC*+*6&*03j@nCWH-lqoSYb?bSB-Mz8be(%iKlGo?M4Ib>j+-KBgk@X(JZnh!MlsQ<|v10}bR9TMVOS{`|2B*ui<4(nJ3J z%)5X3$LEs*i&}fkAL(w zOq-b~nzaJWCM;3r*zy(m#JwxGS8$;j6PJRAjx1=I?GTS$)NvOsQIlzVjQ#M32eHoB z2yu=f z4qLJETn;e}CQhfsqI^ z<%4sC$DdsPW(a5xg%D>xY}=`Lmm5(4n8&(11c9pN018kjV{Y7d6b5o7R#NkD(~4IL zElMm5HCWC)_~2T1t+-_IG~Q+TAQNF0 z2S}+DUU1W50BBR>=`O)yU|n_nZ8pZM*27JS4P2V|T%vl1Hy4cjyr`tj zZn=J@&74lCAsg6a1UNyiZ{5qtjFn`3CgfU9tiE70!>uOxkaIn z5^T%+`)yqAc>Bs9&4NkYX-_?})wXXsiBs(^fa~}HjGuv?4-ii`;fh}Az6hZ7EdwKOKM7=i?z*O+)`5 zI}R;23i@q4$~2g_$95pZOoQI9h40)$sIZlG&eDOb94I{eVu!uG4y8`cG0QF(YkLUQ zwEC$dt^kleAeB9qH3h|i9K3d=rDWnEYPU@-97QOD;haBC*ip`Q=<0;ItTiqUk9ve+ z8=DWW6yaORu`?C{fIYK+^I&8D%55-maT=vG(_RfYFrDvH_Q20yx6bBaHY95}e1Iy#6ZF~q#X0QbZMJUhVLVa| zwOj6*WfKb$+yZwGinRCt{58tXvQ@bIKWE7h6eBQ#zzf@feJAbpSB_zva2!F=C_*`m zv+XE}93!;dq$zoply;hS7g-L9w4c6uj$N>FIQ0fR4%jY)X3f>&$wI!v6#($8y6LEg z`N>3hSjKsFNLHGC^(!+8pPESqj3d^bAOzed+rF#CM&R}B^6Lsvs2FF5_Mb$-VjI?k zgf6{p6|_G}1Q;BNj@iAZ0q>$4vF7hY_&*WFk}NxXq>N8FV=%zyLDh*$>P69<@OTP2 zA;XJt7$lUGRN{@In)!foW^xiC6KgovWwR#@$4lK-aI}%L-%4AtY$OT?!9yqwb#G&v zHrHX$wAZ$5Jq`~&-FX88QSxlTmH+TznRs)UhG&cs@DMr(A&EB%T&AyBF@iH`zSE8J zC{tgTfdYHAm6Vp@1);!lbH@=ru!7J8@?r=r#eUe@(uno{Wc%Xhh|N8s&+h)o4tPu_ ztOn)&sRd&&R+z>Z4YWgt%JG131U^oxefG0c?7|BPFM{yKw=*pvVHqKGM!UVpTz>AU zV<G<9_->;H^!dxT!N_PTt#NuCmNG6K!_ zTZ#}$h=yMMY$*x^`v@l(Pgsg6Hg91L^fNd_8$x#Nxv`8%vxflKx7+N>tEQq{Gm;Ph z2&a|wL-l;>jg@%Q)zvL{@vXM1+B%C*NwFc>DBui|QA-m03iWUX zK8^67SsG;mM6 zfA@BV!l%wX-3TEihtt7L@`WIo4LIgqkq`)6RvXoR8STjfZ+J#q=wmQUgm^@3DVO3h z5mp@%u*%qum;-#IAQ9;UNFbh|E`#rIZp7P3=(Y5W zIGZ_dgiV|>h#>)H)FY+rZY-GP;pgaqRt)0GtsBp@QvT~Aj(R7a6T92sv-ZZ5Z?Mfk z0ZvAW3G_KVMegf^p`rMhQiN^m!nlX#$SPlaM?W*r?>^22F~Gw;AV{77Oe825utAS- zHc=n+pR$E3T9bGY#!mg`w+tBt@4)X7EE!q#MTVj%dM_w|BHyjNw5rv`4E0l(R z4mZaq;Y)ZX_(~ZhoOx)Us^R1EAhiv6dx&;bNf8XLX_n1t&KFK`PZ=NNR zPN5dk_{iOUFY8wu@{Q)!)7Awn`Zzzk428-h43A+j#Zz_9tK?OSbP1RGP{tFSgesaJ zh(R2OsfJX7iC%=d{k+6}fxZ;agfA+GguK>5srNb?hV?zHEy7i=k7TZ3qx5_nrTODB zBy}D>nB+RHs6bgRZ=!t3i&T%}s^+rSM~Oa8( zi8GD8T;Voi(F~C>Y%|Id$o(D9|oKz2571adM}xl z`s7}(Nh5FBaq>h!9|SH>r!k-_I^#;trTOZ3$NR8;1sriuc^>-cJa}3{zg+o&{;Moq zE-TY$feS}>zi&@O6#yRD+@^Xr@i(df06+jqL_t)9=b>OA<%2+BlZcGGZA)8MQ z22qu%V;b1gan=TrT3uFVX<+bzxf5Z&6WoIWgp|=n=m8~A28>WF0QVD*tF5gO7r0nL zjU0&esRmKC{^ws>$aTOLbHiP?f1q80YNVYGV0Bbz$DonE3c_YH8n|@`Oh)C8v7xx7 ziA5`|zi$9dNUXt=CXHa|n}wjQdJqJiAU5|~FYh5%@*cbV(rNb1uP;Gk8n_3r2LO>@ ztq=pPti02nc>Iv9eqkS0kYnxJ-(CbmEF=&^OlYV}ZS;!$*GK;mqII$%h+u_Q=TTR%GA?|LfamMmEc0FQ8ByXW5bEiZSZef4V#XfqxFaCZ~E)UPwY zqEA2g4N5vg{l&G1&_?|=Zq0_G_;3^Mwo$kMjskJGG%mmzILQOR0}t%Br=Ho%foZ9I z=JVq@%(nSrqpgvF3X?$-g8$n0T-eSyY4h-fo#(+qM#)*u_?)6}EyVtu$r`k!G-ou% z(r#i=i9p{cFlDHZ%m%MV3w|6MyV@1iIYn#8bXB!n)WLIw3kb_(;P}3tc>tC)MTk z`QoZYH7x2PBDC?UOp#GjcVsv{P_A(i05^(pB6b|w`nTV@$Zol99Ind}IsBcrS6?mWkiQiR=3W~%B-i%s-bGC5dG?*} z7TS=ZL4c|?O`!nx?Wu7^19>?ahR}5OoNO#VvK$|@E``kx*lYX(3WIw**E^m84H&Y_ z6A~oiD@;7vqGPojoR4t0Y;l*w<4_(OhX%5=k#$9(s<8>{CpZ37Z*(7itBtzTCA=#y z>m^3zc6)Qf0o;kzxht{hb0*lh$vHL{PaznPSPwYj+OXtJL?~ZV+GqFQy~bKw?1Ed?NL&$I22DF zf8?;OUA>b&05sYVkL7xrWOKuh?L{N^nZWww^nK8)2?blUr`9kw@C@3)RddW2Gqdd3QXGD|)h zgI%6I_DmIog10{^w9K!%NKnxy;H-TkIEiziB5cvBDA2 zm(hiiMwXp_K>>`BTwIr(vit7aZ~ywwZ=(E@<3fYs*(taeoabQ?)~zGPBQY39jvVKf zL&uKoVBZ;TKm4bg*)O4;fcHQB<9-y)wgAT|HfwesAqe*2ai9jP?|dw*Do{Y`wQqlC zl`9*3|8IZIh@=p@hp-y#1Hby^>%?G8vI{O;hJ{Y0J^A!Ycmo&>ljR(Be9K z_wTDl{LTx;sXXqNX|;BJ($V@y%ni8+MZ}L{P72VL=#57 zLyLTk=ZSuW)Zt0=xj)m(GYLGQ+7CGdtxVV@l2>_(1_Q9YGQc8pb)Jfnn{-4 z-O#~e(5f7{{YyhZaUfRxq8*Z8_+_LkbU_097)%Zr)Dna^6VR(>E|6FBulg?dY2Nl< z0K(g;KeQ=;pIH(~<8vic?QQ?i@Q}~5M$_w;rw?^R%kzh7kJ9ll%tUtPXg(Ff^}!h) zp80d~MAL?Jo;doa|J|ATyc(Jk+MztUK2*Nf`_XAa-blm98R|c~U+UGF68#N-oZj$y z^(5r?zoBv7j%ZsV-S>1#tvdSGC&phmpc1|1f}0celqQ-dQj=PsqLoV3sZ4p9(mBtW zC5*q$Ub2*LY3YDABX%kZs5LN;J8^X@Z;J9N(1)Ne6?#jtnbT1K$VkUEG>Ro+3Zg787K0Hxd&gxJ9LnZdsemIvuj=qb&{-~0pg@t}c;i!-w ztt}|cU^(1S--7Z?BZ9+5_mq)#h6ePv zRY}fji{FN}o{a}8>67cf8U!>>QM?LcD4dZ?@F$<$hfutdvrd66S(F2vEK5txFGE<^ zZ0q0H3ty=N0snM6XTcC$JS)H6;=vOh&clywBE(D^`%4z(HNr<}MW{avuS0owJsM=i zSW7=in5>Btu_i}pdCTTqcqm(dz%5&hwJwh%g@E5RSwGG z$FLCIi-5h=^2Vp505FZ}6YNbamF4;HW;_7Qn44uCoV6Z(aHqZb`untVv0ZTuXNcHt z1cF=a(B2MsON203J{ZqPMfSqeyKE#1y|ZRbBG&M`oN13DWX-`6doso(Cs`xf*<(_O z*p9X_B33%>>#%x7koaiq0&s{zmrJpQZxt~BFbI4}R z9gG6NJj(8YFSs9Nh1YF%!94rI=kWkgkY+ExMqKzOiV2g08~F4%1hPkM~1Nf|wO z0C>lW53=^2(s{Vc=FA^si&l(*$53JGUOY%>#T>igjv1CW39l_}G4?i!2v0vj__WNi zwtVGuEPqi}OzVY*taEV;o*k;}&9e{FlIbjEqZ8YBGsw!|@j*-WT zWs~e?tlbq7Ks>Gpwu7%+q9efVU3*U3uO2*r^2dHxiX1$682xTWpgqvOMhJk#ixc3* z^b#iE07}<;5c+o0_ayt&r>Ei7V!Z9!c@m59EtZwZ8TihN!PP--kzZckYfnD4&%-dL zrf1uXLX={l&vxwCV<~ApDAF%Ln03n5uGxl5>{|Ab!6@%{!0Q-|g7{=tFh6kM2(t@e z7xY^-!r4JtL&3}O?g1b!uGqf(r3>uB^GD%{BccF62gNEZE$tvwL9spk^lo6Jjw5Vi z-;xj@j&sKV6BbX&8!6yf|{%gs%)8*W@in20#|PbIi??@9%t7|XB+j(iD5W&8MkErlbtXKq9{c&-+wApqjjpIU90j^%cmS9=YdAD1 zN*k{iF$T$Y#~l;x(p7|J;4H5#Jh~RCpT&ezc=oAXDD;%U`^vVvzBJvIoiF7GF*CG( zDt#D5-TmgJJxjcvs;XA|$&a_9m{DaneP)u~crzXVMiSN$B>1=@v<9kt@sQWPP)-Pd zy*7MAoLztOWSfiEM|md^9K&iTo@^{$I|-@z!#CjzrlV{>%PzTW80%di20~laLamQy zUmxH8vs3;5e;;kfS@rWsPtg~I7g=xn50;>WQis*{AdKfmW9XCxjzCYt0(Uw^v=$kf zntSZf5fqpX5yk=apFRulX-(iTsn`0$CG zhr6ris;_36qJ>il@;R4jn z9(YdT+j}};2zdgZSKnkHjSE86T@b^cg~$9>8GQJ!%Ee1gqV7~^&1Cu;FM^DGenx`t zCP8;MF1`EUcL|8Xvp76kX@R3iza;4NFu1fsiqEQB-i76bQwS~(yy|-|9}SV*uS*CS zgYreN{ub9j??_8{VEqy=T^}_j{N+wJDpP%=9*t`sWz^%1@L0(SXaYQHQGO-{qq(_5 z5aMG@Gce41f!0BzMpHyJ;YknU5w{G3;U<*7PtnINcppu*>~RSL*)wu%8pbS&SucUC z!m_c{0T0phC=no^kc^=ZWEB+EPOW#6llV6aqg1|eC(vl~H4*)tClg5)cne{W3b8(8+T>7ps zc(VF$18&`{WAZu?g93ow$%CG((Zy%=K2yHn;b$?mIdqLYxWMNu)k|3z%6sJjpEyJC zOK^>GKDk~A*Z7X)=dOQ@bnj)7#*I5E-({eDYo44r_VIv(I>QTxHNVs@;hbP29=F=< zbBof$d<%1eVpO4zv&KENL-o;L;3F>}N{PQFyaEK_zvK;qmps`@4&8wlT*0iJMM>Tz zv?!`=u51C!^^cbL9;0^ZcT_&0wZW%}(kTz`l){xC)OOmSX6bCI8wvk?4Wh3u=c788 z^F{jaFc5yJB+^KRsy;a`QI4*l{Gi9wMVVeN2{jCAzAi}(H2*4LI6Cxu~lQs zrW>gsQm_loxEF$G0Tv)*d{osq2`e=i(jI}C)5xJ3Mr2oWolP5`O^mJ4f=Rd}0X^$d z=hg3%XdoZhUry_~-2*@-F>$@4H1fZ~CD$&Ml^h7rI+Hs+xyl3zk)}mE$8T=+Tu&VE z+|}21+k0F0TLo5xqsQmj$k9VU6b3H}3$R0*NAz+5uNN)kpd7Sys!Dq7omcnUk$qe3 zQZ$ag_01Jdko#bs)eMHnH;dw9?e2PN&FXztj$SSRXW=U0F!{iP zC;&XW*RH;PseS%y6Rim*WIO%sLWth21(p7V%q&1^vpzf*u^`a-;>-&{F`k2{;-*Nm zEhqr6X;85%0I)!5QP&m6qU;MCh5009(&>#B2Tws^(!lbKndhga)xjk=3qRBdU!a8` z{+pMYxcYEuVeseNYm8N@HYzP7QUK8Wm2g|hwTH+PfWV_oOazXep##9?8;Fra7F)TA zX_7Yp7JU&Du?)Tz8nxHU_f?KE)JHx-Z`CDus5x?xqzz1(SIR^aTw#LjzW6D9KcPee zeBtDs;2`ZTpHJ#5m-ju~I{a0>lm)^@Dw2iX0B)-AvDZ9N-+ZH>3=uPO6X6{9 zPWcu6=DBVGbO28RR-H*`t+v=3ZydID>keTFfmZp*F$gYm-M!Q1tp~8+%%k6lXw2g} zi8c)x4pXK4q}83Qv2&N?+HIemk88C$`|fuh!1dnccK&&}Xy!jo?4x$O<(8Eksz=%C z)th1XmD`uUx*WIWqp?n{=TN#8MgegZJ2b}KcEb&G?at3mMpHY@QSOo)Yf5nGxZWmU zv2owM({0q~RA2u*rj*kvu+XoXO9hD$;eOwqa|mMbpfD!GX3oqa+`|Qgg1CF+5S%r9 z2wM0Zwr0&yXEr?kxg}U@R@=)krq1HR^@^LO*urbaSt5!Sny=uc*v8k3?Dgm0v@u!9 z%=ybHzmf0@FA=kEl--8)`QV{R*2dUXdZEKN>1@IoETTqll_N}u6JmJk{h~Je?|?zg zDShd@9UnAukYA10i}Svr$Qd^f_jWlpZ3b~6QEKo?KrGY)^Pwn)wd5!j!FaL@VACv5he?J2yk%RW~i+e09YaFo^=MxjY&|Y1!*5=M1WuN-gGCNby zX+QqaN*IsjcG(Ope3-{hpULB3geQ&cR9n0x+m>B38s!ZbVYmR(_|c_x!AT_i@MoX= z`Ta4VJ&g9m?{6=$9lQ2p1vJA(fp;-=b)7!l#NO#Bb8$5;Lg&Lg3vS67w8Sm!w5OhW z0|s%5EsQDvXxK1*b=AQj-oCTcHf`Bv58k&F`brEgoFjdxG#bXm#no8(AF#799(^BJxsOV7VIgSmrIQp$!Nv#Q3X)Y47d`5r`;GuDo8!sy`Ni zhR&D$Q0hv=6>AK8XIaGbi<2@#zu>`uB~NRKXg+%BR{KI-(Y>|~$v*Gt8UH-FBP9ww zFQS>0(J!r;;VzoWfBUoWB8HxL1V$#=i&+A6-Lgc=5WL~tM}VbL!+*YHbRe9xajvSbZ@~Lj zGfaKC4<>9teGB{W^Q@mOtj~lGU~d(}8Ag^beW0HqgK=>S9VX!xH+5hViYO?cD5L~w zc-_^k$Q14m1iP*-$fFM~dFV+l{_!-Cgr2c0_r)~7<4*l1-bx$$bH(zNQt?^ViHeE_ z6lmD9az>M~b7BGt0h%v3XDBR!<_dL_cr&UoP$hR>J%u_*-C&76CvAZCKd0m00rn@a z{-7984~1TeQlrMfISg=KefY zOxwE~H|Z#-#3%M~;b#>zDrKC0Sgc)n1DWq)!aHHKDOU^tSKc=5O{@7J`j*{@*;FDF_kDl0$5WKf7y=fw@ zoLg+$duMGp0`p}Eqf1Lp+tb9B@1Hio9(;U?^@?q_Cx1q$guSgOB%OD~sVlCUXw#sd zgZ9oWwARVP=St}pH z9sNeUFB~~k<(>ta8bD~D20}w*L5(qX>KLIMXw&`ojz@Wc5Rb0(8l`v*FdD<=_{gyi zJXajEweK8Y4)4nxI23OR^~{MqiElp%zDlYcJlqQZ;{#$*7qCY$8xBsS05EaVDBBA! z<(<_#Eo;~X``qJ8v4~HESBemMbrD`o4`N~2gy3ong7W^rTEw~fjLn^wZui|kALXkH zwr*_!*7`fKwC9`*UoDN0H1p<9L5aic(4nJv4I^Y=uQ=xK^KK9_IX8#r2Z8?-g7;-8 z0AxT<5dlqT6$VwEwrgi4e4In}-llSRnJw@eP)I@G-`w25`M1B__dpJKA81=PpS9!Jdu{!iVrV+cLjcTKKu9zeRjozg>bCAgp7>zovGxq&`IMD4*^hs?+um4F z;tBwFqX3YR5yyBT(MM!gF`{kl8C1(VYsy>!V8FmmTYgWD3m=05fU;8ospJ75?_`br z@VgsPKIv<>FVD5>ZyJP$t&7SSDmPre1NLZ=KlpbP22~UqirmZUh+kcJx*VRuS^b>gy@U= zUEwUOB;ihoj_wk~O=@9}Qo@{e^u#$gz>7;tbwkP2G~hrHEeJ}btkBMU(C7+gWrPi_ zLjj=^!<9i8WTg|HHAVsn@x!QHykuQ&eGDI3#%Yo%U68RGuh;^@^#xY`>kO}xfduZ# z*8$&A-l{#3ID$$5af!ynAJ^Vg^rY_&_J=MbaGp2Mbm(@15)itj?R={Zjs;+Fat>94 z2+}(*lkjAKpMugwyoXQ_UWhY};Qu@p*-`>%#i$PbR3N25=fiQ&Iq3qt?Jn;Ef>l=U zYLj53P22{aJ$Yoj_bmuY7`?*T^i84~U0>B~J(SYiy}4>bu~@*FjKD z=e>KGAiJs(uM7o66xRb;SqjR3tVe{^lCo?KUfgQ&z7-qG+LYcOLqp)>UmIRI>*2B2 z)HVbq2Xsh^&o>WMg$Wla;jtmKRfTW?f`3tlLv0jn3WHtWi191?Tk&3kEKqbtW@-!b3GjF&{)qaKd8vX>eZZso zj{NFkwL!QLg}HnWx>X;m2=#H8x0F86t>9C6`u0m@lSknXv zs9rsnk^qlAjW8uFUa%AUw%`FEq5$yp2bgvWI0maA7N8PV${JaT+g-3pr2^Ci4ZzO8 zkf2WxwxA_ZhGu5j=~5fWB0u-C(OA_YTmleBig%o2Ap$4v%9;Gno~c2j?kq7WV~IJG z!(swP1fpXsB>hwVRSdC1hmKo0?vN;D}ImpCQ4$-eaEt8EUhj8wKy6p>8b$SP9EZ+-zD8&J8{ug6M% z1+;M99(!zoU5g?@oLlKf`}Q~Ue)N+7uwZdPECQXiYfrcbfHC0bQ8c+HkdPz z*V3?(0)Q-sVRo5Og5lji>{bXy8OB70w=D;1;I*7Pmk25uxXKt8M!T@ zETt1JM7UgT&BJqTaCB)x(|FN51V|_vKnUD;%qP<5@Su0TxM)$P4vkwpf1<(G%W83# z+tP@oOgS^p4I-w_$@4-6fG$ zXVouQ9RU9NH$OH1c3}Bm-x!PF{v4L}`#De^bv)0VGnMchIk@r}VBf?-|2(nS7cX9l zo4`{XsLO5W@WE{U+U#_}SzP(_viX-2U+>||Y!|}jZ+_ziw{lp1`y?# z1OfC|dt=phJ8^`oRbt0@T-lqiN@-qOTT?C(v4$5oumHp2YUF?S0sP* zrE=+!=9~Qd5`qf8xOfLL34>r|UCYmoKA%Ro;AwT%@p2wpCj!g=7JFAZVw`9k`9_Kcxz#^3>~jInT?UY6rFBpd_%XDjFp2#~~X&YA_BecMNyK(tKyZWYa)&~ZG_83GL zuq|&NwY4kuTOIV7J3Yr1F3lmH`99nA{(hUcaE2|rBiH&5fys{GQvKY9pRWrX7>uwq zg-5HfK-q664&p8jOPL;WJAejdJIwlF!-v{fJZH2JXRNT`1nY1q45dUu=*)wWG}sOw zuS5V_No@5Tdk^9M3r}rhK1jl1WEeEx+sZ0y_>|CY;%~xukzio^2PYUaQ(=6Zgjur4 zX3omMGHNT9Q)keG&tfCni@2ouDCOkX-~8=N4nE9DfGX?4FMaVnd*hAccJr;XvG$L} z{r_gt#}Oi65dzx%^f}51U%QdDyTQKtzo7#IM5qDd_|Tep{CMYfB$q4EHLcZ-Muz?q_E7;#5Yma1Y- zmd1vqdKr)|#j~*?tcQ@^Zsht}X0OGVlX{>zG;UA-i|3FF9 zzapLw_W{qk`sLy~(N_!ep5lE=K~5I(QeHZbpi=#ql*D?56?|HnT>N9%3&TZjOSP@k zKv!*D#eS?7DM$A!0!#F<|MXJ35=Ch??0 z*10P}S@>&zs89td{Zn9o^>gcM2_)kY{L8{K29H#+9MGMvA$lm-$DXzs{tIvdlu@_> zuukn7B)k-^qVRPA{-GP+ON6Z9jq)gOG@WkzNB2ab?5;JI1YP*(hWM~g0bbyVj=$)$ z=6T7+rOTIxcO8KO^xa?bSo!oTT2aF8I4rdA8^~rBi(lZ@0YK z%ll9MT$)o)^+a`qdP3T0dR2T8XG;Cy>mpu4e_br^!zuZ#Vgc}C%L9&ZW)u`uP_n77 zhgn%uj}`BE_Y_c5jq)#Jjuq6;B(j7|hl!a?IE^F}Rg(CQ$3?BYP=v4n;){f%T@-@f zY;*KY1g36318{;cg3OP=Soh?f&L4EECDK6khsI$O0>_$~X4=t+1)b)QIs``b&Tkno z00n>nNtTqHNLx^@VLpjv+-V()t~ZV`FOxc=)%bU$q7T=9DS)5+`jcZo{S@sh%_W+n zFEA&=FIrtl7`S4)mHqkLS!vKR-1123QiP%#HWC7$u+d$D&z(&O06YNb2&Q>BC;%L` z=U&`xhmO?S^jVW_#_W;oyYubH{z5_*jpZy!Z1WQ*?0Vvcw_m8@ocS)^0WRmPJp#q% zW1LTGQC=m!I9@rL2=mgw8XW?VpMb^xvv+V2ky9Isa?J((O!Ff4+398el_&NS`EfKR-E!i zs93U6U>L;NB$in1B}Em?*SLIcZNeHn7e&6I#Hz>gI^Gb9^~FP2C480`&Kn~*qhoPR z$h?kL!UV7{km6EO5(?8X4E7!^Si}w@tr+l?Hh&T4xtlIyoh3&4FHv^bwaxzGGY|5N zzD7X)+G~0C{0jx}Pf}0-=)>HXZxhGG+G7u2f#rEW&Qb05%O?x$XTRKMBXSZv^ug&< z)plfWjZK}Di2^_duImf!mxKmv?Hq&x03qCBtL^z;Bj7$pcsk}$DH>gM4KCw{#}HC< zkDWMNVRPrqwj1vpV*@#xRGjT3WWf9MT_JAUM**u@{>gm8a-s~und-V5r(w;VNIN@i z-|kxCyl=+>yBgSVn;X+$i?7bLF{4JKi#>5H!E!_sq| zge=In6|e7w58Vr1VHR{&$9b*J9>RM3=9@>`x{WpVlb>$GYg`5J^t36LrE!iOZy7@e z+2-|UP^8#zGjikX(~m8&kt6$XzOTkx+*WuG4G8~p@OU=_uN5VBV9zOdN_|nd7>f)3 zZ0n!g%gz?H*-w79&sMA?^dXkB32{j%_fNJ|low8%$Rjicam`T@7Y|nR@&uF#iU@Jg zqw_Qh0M~NP%s}`m-d325)g}pc^79C7`m2)|7o1?v)c_wtp%mj$ux!91MV#Gt-*`NE zsJ}1@!7IlelvWm8KF=O`Xo6*B^~94H^T8X3?Dg07!W-+4SKjG(s7Qo=bkz5rV@8eV z91>&Ow{2%UTtLx%KFSc~;Gz(oX{+^wFFbL|V7%aE(pN1QpA_)jZV%j-ZOd;Th4KSo z51kk169|3L1EuwPd;OIIwr+I^v_0G&dK?(%V!2P-f&xHv!SQM7;vb68S`_vTcoRn9 z<%u8eK{@Aamjb}xjDB9u#Z2Ar!hR!^(Zg1~cGjLE1i+ACF@yjZYtt_aVF>g-tbaQ1 z$+KF${op$r?8H&RVJx3w*WWzI!v<*IqqLV^5g;#p_(%Mu`n5X~qL>e0-qzK%*@?Vj zyn___o2(IpCmET6C4XF(^11*NP08K<*`hi^9TMBUq6DRzM9YRRITSgFc*DK$XpF@2 zH`=3GFJ7eK3NYwsDj{G`+-i4PQAv%REGV}U!kQ%GfnZe5Xb;KZ;UAO-AX*T{onvek zps-L5&$ds$c+&J|uEO90gRK}Wb`{g!J#?xfZCaom9kGH@8}FI8JK?3mE(^Rrpz#EN z#wc>ZpZbre;Qo(^oOv4Q49}$8AeNafe)=EruNerwhPvx?$;J35`2h|=#q4&N-19EH zd1V)m+)1AwT6=}x-niP2h1VPp-zgr?f!a4Wa~^8IO1qh}Q3o(6?55To36Xu>70+Cm zfkA?4Z>QSB2lip8BY^4h2OOOTul~FfKIHyfh)`Q(0O+prdFT6El_L2RJh~q6)5KF% zRiYqGM(Sz_cZ26s>QY(Y`vQO{4Bd&m)8voAvrGo_ae}Wo`T3R1AB8BeowH1Mi}U78 zWUUP$9UPfJqIp2{QP+sk(4h+3vn|h(`li~Ft48~}+Xi2^6?$nx=-&u3B!dWWNuVx| z#~=b8pqImYx0qK8X|G_{KjD!7T}fY5M(zo2e;8c$+809JDg?Mt~VpZGrZT5_88Q+m^Shep0$2pNEnIU-E1$j~mS>O~|uF2;~h-YPaeTax{ijzWPge z1#iNagz>_Ua44D+PF?u}I0TLJ-pMCegC_?n=JK|xeEti6D%Z=_OJ!8GDj)f{LX<#s z&?x2e%4J;CBlx^;LUP9=sCHWP@j-s2@ehR_M*-l4Z$}gWp54)mfg?bJEeDbWVrt9U zS3*p=Y?f9`FHMXT>HtA-jvP(qxSKnhch*`tC{G+agbhC0smN?JAVUk(3SHhpziVn} zWy5lgm{%oO#--cT86*9d3>mDLZ=ftWB9b9&6onm{LNvfK%I|A6n*! zQKx`IG@|P3JFyNsgaSal4Ie!c?b$R&2!l%#tP>G~O5a`=-~5kiskp#}P3NgY&9-jU zeyb@zVGrFu!ybKvSoPpt*)CqxM`m?PH8I)NtS+`Ef4v(9MWcQBD@%bJ_uRY_kvrJj zUy}V|L0xxhpBB9a^g>==Rmnzp74Mo+0Jt1M%ET_s+O7=0<0jOpzk)L0P6`0b9a#K! z+Bd$jhJ#2Vo70I7tKf`Y9|vAp7Zu~e`Gpq`+7my11!3D1`zkJ#$Bvc79hyoSw9yNC zlmb9OVH1MW!}j#^du;l=@%G@SFGD!f(~{W0%8jVJ0MxUgZRT6|@^GO+$NrBGu!Eo& zCJ*|9*T%<0`5~b6G>em0%?QPK5QXb5)^sP(j{iAz5>o%bX2kxpwT8*lYPgg$D z>b|>RyoWX!j8CtZQLjnQaZQ=Zs|}SV$1p)KNvSS<1fB2=oUXLsd8L@bScjgaA(hY% z4Ln@$sP|-9twp$lxuFdhG?8nJgz{7r)IueiW!CcaUX^bQ)Ft3C(id$^?DVoP zXj%*_N-FFuny_tH17)CzJ!Vt}hfQ4Hu^|&+>Otvwl$KQ?W|C02K&XY)}!Hmh(k~+2e|2W$89rw6aDr(#kksk2IdKI zqBBR@)-4Cvq_Xgxl#U2w&IXF`&Y3 zxM306lH+jg_5tqYw%h&p&9uMxi$&lK!EIH$edQlk!{n4^bze4XdG@)_Ot-7ABDOnl zHY0f7x39*2@$>z*dd(5&D;}CICrrj82q1+Er2-eiH4USy!WABOwL9`uDKFlB8@!F~#XTp=3# z`8E)DX1Csbg^ivt*kWOBT#y15?&^JG$6$u4d<;TO))V3K$^F&#vwvM}EwyL_vVP^} zX4=));^90jZw#xn6mpHQZ6|+ExRrk4*)0t;ND(wyEL~2m_*+ieE~jg>|Hre&}v-Kajt<0=&q3D z&)M`a2Z(XKYe&2N6y>P`;;PM@H4#^VQ*7*nWS=j*&-tTrcJHaS|M!2tNazGYPCT@L z16u-?AO%=u?6IWu-gey`vp6`9hPhU2t6tt?`>`a*89T!6e*ALF$cpuiD~2enYgM-H z^?i15*BR!~el}&+2)p6#DXd@3_S5gIg5lR<4}akXn~XdCSUeC&34w5))=Zd%Rt`ss zRaI5eWc#)k+JU|0cCNUFF(TzWJeHitItJ}@#g9`=%PRWeOu=azily5UTuY7`hjuyc zZ{;rSXFpjBL#%|DYpKk297v`g!u}M5yk!V!W9$oGxXKnU=@0Ii$smmi6iUAI_iy70zQnG-aSjZ{9`yTm z1P94j*UZ2b;|DN!dfMN9@p>5Z)%K0AKZz3Dbo;x%o57*`B;kB^Q0{2lxKDS*p;Gn% zpZ?snXzM52Q@=c68`tf_eRcy(oN2cF?y=rqD_%v(2#c;x)}qW2#7Mn=9`QocY(!QP zGz=a1Tm^g)x`>V?C!J6Je0&T*lUm!hY^$_4*Q`gOWF{^@hatEO4D@rvXMKO$38%m7 zubqhpfCR>&HtEExtR^(cvv0v5Pqo=I$HIWryv(%1d(Dhe0C;~}G4t3?lLA2IFwK2h zL%E_;D+$Z6nA^PNDApVmgn(J<9sqQp(!S!*;bMDl^B%0wK2ZSp_?`L(PN~jS5Bqnh zOSd|AdADkwWi308AX2XIrF>LL4BQgARxYpNKra{g2p~~D9E1=ubJ$=P;`N0Y5qJfG zI5cPb75$F<{CHmuQ6wn^h?uw>+UkSwfk)UBa-zRKD!0nlzFZ((yrMrs8!mmPmPP203{m)^Xz`he zAK`hloQoxg_u;q7^%_VY@?Si!L}8ESRC&=fdZypey8T=c!S}`I(Yiy~fnO2M5y~IR zR~kV;S#F!_(+CPA~LM^d=w#hxW^2$VhGlBjI~%WRieNmi_F&Z(6I7E z#%v5;0i_h6P!v)MPzb05)_`P`0~C%!q1E)!e!$_Nsz{RrUij$QC6{9_@o8x7mYh; z-70f1{|oT`p3VCt`R|JX^--X2^`X-Oe_R3J%>p}ckp08W6Kv*m;wVQ#7^#md5Kc+~ z;P}Z}6u~DDA|L|+rf5NZ925Yae(oq?0Cw0JcsVoYOtGv{$#(R}G4{^2Scy*LY}sLX zdHJ~RN1->}i1)n(FIO{MV0&Oc#x>=&PGdUD^uuL&1>VGph{ukpBJ|i3%l26474J7F zjtxlbfoHPGjIku!x;c-vq{Hrc2qo=_DF|h&*b{HY61c<`T`|XQzjG|E_1kULiXC?J zU<2N~rr0frJA$UZ?46|m zKs@oxcwdwD;4ST!KiP~i#92ZEEJOhy%idjg()R8-jklVEDd83P`jS9y&Xiypg_*&+p-mLG$YcC>JJVMj7bj6Ct zP@yxHewYU8QM%qt2tm$SL`7!KYGb^nxFvZ@YrXR;i@TJ48F+HWtt zT40kA9xnhN#}A*i;|J<&Hay#92%}FGoUxyyTu@Tp*B-z~C?&1MUU_ymO5j)>wlvy= ziNmmzo=Exawr>4ycej7t^;g=WrRf&Ondn?0A+i2rJ2*T^+Z8G+#uc&R63*jNJ{x5P zDFDQ?uaH~bPR`qB?e&)rfYTb39-6`P99uAd4E*FG+q7Y)4W{27e&9;HJ|sgc&}tz6 zFzs?Lp5EKoxY|oA(jE7`<=)MJ~o} z@Wuu>tq2*`zgtZhuzh%rIO~cGlQ1|KH8vH6j!KjU&RR{C_DZ;MCLGPA+)>Qeh1S}9 z%FhEgLRW(Z!y8j!T+z8*VaHy1smPvw>Hs{^8u<5|IePX1Z|6B{wA(%Kk8Zko4E!9! z`0AvsAdEv|;t;$ZOvF$u(bq+t@qhNS?RW)ju+d|4_@u!v&9~Ex$?@aHF{TIDmQ5P( zXHX`XZk5zoNH_zziEQhImk!P^*J!jx(&43MVnnZoDo7+-MP`0|YieYqufG z{Wn)0wNm?<7n_x!w2RctRzP zf(P)QC;&J`h;O`AA`(1rb7Q6NYhqBR9PDQEbw#)MAxvyH<73=(Dw*Wx1= z6xZ8{Q{`5V@o4|F!SKY=P-;oSAWEAJN&yhxU#VZE;tPF(6I{U<+e4u40 ztY=!=!tZc^2s~w;z^Y@O1uTzSPwSiq&RP?A<>8(7b80~+3S90TK=ZStzT%ZIM+bJF z>fkp-sc^qCx)V=Y3IHmL(a4@r=}D&#JZBjR>LY_Tg)ftAKxI*~KWEEmiR>49bAFRx zv=Jq@M)2NBIk3km1Dt^`<#3)QXlAl!^P60|{)xo?OK42BxsuAsKIPWksx&(Q;!jYuibEAR_Gl|<2Mr_M>DBNt}V4);<(`7YmK;&X2a zz^dL>8~q}k#+dR+K|nO>xa3>7lEQ=11_b~plRk5q5q0XhQtRV9dFEQdBL1*&9IW;w z%c5LhbEOlZ1Nu{+1{iqHBds;g4*>6at}Y2m`TWo&nH>LOV=nj_B<~3QdSl!Q4%&dR zLF0~n#d&b1ap#IJ8ms)%IG0k4&W>Ih6*`>iD;{{8^^WJ_!He#qed}!t5b!?ooP1QE z#(STLXYKO{6{{_hcj+IsIFeMBk8kq3fxgcQ{}&aNA>_#hI4Uc6T<&Y zVork-DF85OdK=Z@;M&W8z(oimdUcKyFBZY44maC|Hx61;T_KvLb6ty4a{{z*@#0>k zh;T~~gunD6F1=pZh43oPzVxLf2oMw>1&otV-@3YI4^MvcuRxPU?)nWa_Qb!hpgooL z$Ri8vwp*t#*{B5i@)AIPvkW~6b%wv8UIu~&I`8sNwb(!Z^V={QlI%eaa#M3tFKJuI z^}FE}6TSqE-dA2BR`U;EvP?8||L5P`WmjD_fU=~S)2+1>C@s!Y1x@x83II<%x7TJb znr!!cDwj#B-TE;JB_-i*6eSOBBs6)uds18`DPKG7ZB=nR*M#SbG3lfLpi2q>Zq-gb zniz$2^{ZbRSHe91`yg1?B-0M?64oiHPd1dV;)PaC#9f+2q7A2&P?Y{Eof1MZKJkbN z>6;qzY0}grA*CKoP?`XI@>Ll=ctd_o6x#5p?A}a>t_|nqFtIpIvbX?#0^>SP8j4KJ z3XdRdUxfyc6|#hga;>QneIw*;27S=ECLnm$4oA?mBN^oi3~flX>CmJpdKbPl@o91M zjSEEzb;5-*2p7C`_*IX?PCkd-6)U)>O!bKnD!jYUQ}wA#%F%Zli=$AkgNY{FRy5qp zh&@$$riA-O8$2)>=EP7onF&}!5DyW^G&QT#CYTwrt}Q!TWSrS?0XNV_5ZYrv|2UXr z!gcT&;Wbg8Cgone2VgCnZ_hll5g~P(Em<-T7j9F~cJ715d!_yBcQ?a;IfsStjkfo| z5e^t7^hLb4B@SyGDUGxs5S>Wu^y_aLPdOXxgZEFPNjcLNE*x&VcI{--REU6b9x=wJ zAUNM{hY#<-ef@0v%fGxF$OXp*duPL07P0;uBpYq}_Kmijn2$@Ym?$y_XT4P@< zzYgJZybVYlh}-TmTsEdyXP-tJmpk0%UNO!H-3Y^gIGGzu?5)>V*qygtW}kXwp*{WN zDGuvvVMI+q0U#GoGzpZ|?o8=+=s7bp)ioQ#93bR~-ZjpIXN@DxLt*2jv8JbfxL~}g z@7KOnZfoA$0W(B#EMx3e>bQK-C>RBdO%iLY$&z!;>QnY3!mP}kbGcoKRm`D7dA5H? zK1}j@n>sJsuD*G)Grc#xlMho2K{p!O%kRC)#!esLZpGNA+UXN@SpE|Oac>dhO~75S zEQIp6KQtdpiCFvIKW-ofVV*6<+rf>?r&|ivBjvcDJ6F_T#f4boRW{mC6m+Ie8IF}g zZ##z4$D4S)s74r?);|pext>;4dyaD35u9gZt(S(oz7ni4PBBjV*yUG@#qA-kKle4E z@ba3SJ6mV-X3w&r2xAW&K8!^IjKK-xP~;e82lp4*jvWUqdsHUgTM*1v71<5fFTuj8 z1}4-o7j*TBL1`eh({8_GqCN6(E}HDo`KAZ?&)e6&x{^b8i!Hul7OveY7~h9&CWoLg zqer9IvCWkf{`zmPwSxyv*pt6pWjEiljBp;~pk+b_ys#5DhT~Yn$1!I2GS^nyBadH= zl}w8LpRd1#2c-u3vKjhZXjfhhWA6AVdt)UYgYui92iz0)ZNgQg;T>QMj2~h%PESYK zPP7n4--pMuXyudZ<6%H+jhHHLzJ&q|N*%Y{G~1?4MFBt-bPU0Y$~OA|1(@>kQd@TQ zOoa1^j3Zx(pihMWSYyL7`rDk@<6->D1AxY?Mkbo@gaFvK{T#ym5A5LwmlDFX{0r2s<^$(v) z9j8y^OMRt1tTfPDTZz$!0A2H)-22NC`8<0q3C)v}lVQH4!>mrh1vyr_DCLFmOJVxY zT;H`H*Anm%>#LrAyh~7V`Cc*XeIg)7>SE2~uzVh-miD~5udQw&>_rJ~I;*o43*T zb0qaGiQe%qvd%fky7%_$7nh3VpRa+Gsn^kUF(mLL0e8yBdtJ(-OE`7rTl7WOcPK}D zQQw<-rIE~$e9`{sUSAYc_1(w4qWOJ)-wm!%R=0ldR-o$E`So|zbICj4iPocH0(jwX z6c<8XXwyaDqh&Z=qp*?RF~LJU*Z#q;@G#u}mcJ@rAHgE{RZ{d>6sqo7qcF?WYLo#I z-aFNJUiF{K2n;S@0-P?!O$6pBQ%*nKTaq?*T-46*pd^cd`9~RFSM&*Rj8}$LHPN}-~T2UQ2$))BlW!~ObP(6t;~nVbHr}CZVcAk zV-N~+#u9zakn2exz&0agWx0dtqIFz|Zu-2ZpH&>jt_c*U*5~H}e1wqu&B7~2FEjv4l@lXR# zvY6-R8P6AN7_r|K*ZhjB@M=1wuN9u?z}5IBD=ROcj)m}>hEvuF6cRWO!0cewf??mt znIYY7Sv~{n?KFFDU5Ty1kf#`rryXq|SCShp^+6206}h~=fLWnJ_sH9bLU$w*1HP)N z%7zf`Z4lw3N=i!bMA~3u5Xz24z_S0~AzUSw;Jq-8^|t{J4G5Sg~4)D*M8p-;8iP-L2nNt}L>ro;<;M6bo4xflpC-*dtkh%d{zn&J zHQr&bKDP(>aP5pxea`%GcGE4Bn19>sopt-!7c}5y4o_-xQxKG!9of@t&yfG%{)6y4 zdLTp|iSPnJMmw;~&9H0nHpeuIVL&BH9lcS2Oe5r8k-hWwLC*fgcubgLS6@Aza%)h! z-@zHW)~>l~HlYs3pnM;T_XSQ#v_t$Lg`|{a^QO&ZoT>LAfF^WBQifGlG(piQop2KWLk<6^MEE z?keQGS_!@k<&bzn@r{BHi3|3^gM^lt&t88t#vZZmr6tf&D7Jxi?$};$zy8Hu+qx|e zzEJ`K)xM0AHh2)#cJqxB?cRGPGp^$CURREw{{UmK$v*R$iFWI)gmwkVrKKpw|9l^w zA&RiFP9p3^Ea!|8LOFE63z~}O$u!%#^$6h(c0#kMEQs*pT6$PQ|0HYbXu&GGhbuzM z-M5sG`}dExKl^O1EnX;h{6OnxoB*|`t%?x2Z@+oMUVZ)~XZHkq7zKdESEJa9;Dy(} z{SqF19g|Q=XCcD*5dvWKsxtQgaM!&bR{=o#q#pL_3x$NOIEn{DJS99L4*+TK?g9Y* zm-=+xJ9)CkzW42ocI;pul#C|X&9`Tu9Mm_o?YBewM|mTZM6W37L_-R{Raw)2}AiQ@3(3*}SnZ-VB#5+kbVdah;DI|>LIUA5X(552$7&^Ew{X(zN zhuTj$^Q(KM(Lw|S&$Z9;BLsh>L?f5l!Y}%ds87r1)mETj^95H_oHy zx%Pa$F#XpalFBe(lVDYXS@MEh2@hRK7{+ri?&WSg9^P&o{5A2{TS?of5O46<+N5|O zHv+;L<+-qvZ=GMntyd_3UP>caUBFL$o=);PV4?ibCX#5Pe|^A=TekP@jBC|H%2@Z1T-q#>z22J64LHu?khT8jDg(*n~8j11O-Ba*XyzeAxHEap&j+NJOJo& zLr&pIeGndSPg+phi9FBG9Nz6tWn>V3$qx-mg`kbHr5w_mJPIQ#ML)>}yz$f-Xo>PD z-(^Rl8Tw6gPcQW^<;f^c#*e-E;WPm5r2M52&3#EDBQBk#N$Ns>Db+NyUs4kkwuFXx z`@(pTai;*JB#j5^jb6f|E{$!`n|q9a4g{BQ0<`phB)yM+Xp34^uH%eyouRN9fL6E7$@o0LFi6a(u`bK)-eQdk$2B zDxAZ)V_XZ@q66VcW1=roau671m0=PNZ~?wb86vR@+{#_{V9k8oeM`Hjkk%!;cQEO;L>+GvSu9)Q8-8`-Kb9l*Xy!T`-Zf9a2LOb73X*q1DClCW{Fw9N~Hr2)5 zD;4AdS_7yWjjp_t#U2Ywag{QNb1H!S@U1i#Ge&^^<9+#|8AJ<&608e%Z9k4Sa*XA& zu}j1KO$Y-Zc)+}WF2be(BK$NV+}Mv5YB3tl0|w)=i5TOWETsV81VcJ?q0-WI+<_~4 zOSo347dR-K++T0+tlWptBhT)=JJ&w{*;#1534=}tp(DVl2C6jc&f@<1h3Ajr-f1VB zuyhmvuC(lIB$bi$s!Nyh|7VwQApYG4+uH5NPrL@>qsAUWNORqF6JS36XSqN8zFW=Q z(nL1l7jO|(WZ(YQJ2r9Rczf)zNqoyn?jn4`ldj(dugWUJ((?6H$L!yKypp)#!|f|y zx`VRNG7Ixwz>_+Yk~Ap>4**B)7q~6Uo-o87_}n};y11-?0SgbuU5+NRF;Yw(O-PM$ zqk=1Wody{Amz5Q;QOQ> zX=8NqP)TxUt#8+E6H+2q_sPKrwrUlvl0SnNkL^1gBNPV;u;O}daUVPYl`}`081b$%`wdpG#fmj zFd-!eaHUDh8E}FZ{0L8dG#I$rg$&x@UI^3xX6R1sbV#E`o}uCR)hz29I!%70S9^sc z;n*+Lp@G1q_bO9viqua1mY0q&d9%c*T;Py)-32uI>WE2OcD9_cRt;Piu!G^mD=f3XK+7WXG78xvF05?%(N6-^e9H3>eqx1WXz*Idc_mhzLA52 zwE2^9Pd)+#5M1}+_Ud^Qb-w?Db;M`8-bRfa2@S6S=lx)W48Yxb83*tYmX)1_7Vb$7 zW9RKA+{M52;wIa)@fdFEmf6FPjI&o?S;ryr1e^KE2mz-t2OL9?zum6KTKsSR>IzrZ zQGYbDF;i^%@`_g5w|^h=^iY^O!@NJWNHAT)d}${xUa5WkpH{Kyz}49g9t1XG6r#Be zw*IeObW^uW)D*qK9jHU#OgMm36&%#}xE0p4spC;<%5r53ZI0Bv@MzrS-U}}ru+^(c zSJz|%hYYY>+)!S5-8>i|JyGDQw|zVFaDzU`a;6N#;-EK{<7n`6K+YPSW>?-g88U#G zg~0Ch=eOGCw+IU|Zy_4-xQO4h2}|r_xappXySF(UR01tPSm3kGnKcRVxPT>|DnrEH zd_B)ryt0RP?eyCSaN5&~i%JpD59V1ZbZ`!OK-(ItcX7@?f;SQ*q_i*4Y9>YlzL5KZ-F)OwnKMwk;d?!<PtBj)tPN#kwgm<)vcF)%xtZ0mb?TR>BI;@EL8()vL= zC$U;M3losIa@19c`?%VgGMMof?9-pQ2}XRJJ@eEGVn0^kE#oR%h{D6c!>1XOJFJNK z?Nf87V>OXtufM*H^-4n7a*x-36-><4Z^9Hkh(!()Q|~^_#45|Mzy2E-W)r2L!dPNF z>3idbGW*A`t%8A>VzXw?z{TPbU?_kgG|MuEq}w;YxtR@Vl6~&a7Zaaz1(r2=_N{L{ zVq?b*wtxB73f4zLQB1{iK*C_|cX5E~W1so_b#68F?>}6NX7mM=SX%7Chp)D*tPJLX z9d7;K+}H~tVIm$H2EfoMLWBPdbIDNq+CMF|$x~B(6RfRWpcPT`C)e+ffnX)^-17%u z#-4;Jw*WyqOjQo`n%`>an_at4G3Eu=v!FzdSCowqJ5+`q%v6Eh8=-7lcCHNvdWd7sYu8#zQb*|vO~!i6GRjGx6!m@6H24EDJeOL^V~q-C5#jd?Ebj-ly#?E z6KbobHfX=0c``C2_#GA+9b#3j_QDeCb_r?)m_F>mv=7sv+%x-gZo4(a1%TJ6nMp7w!)Tla!1`ab&o;X3tP&pzt9 zB(2goC>PU5^Xcs2uT?jfo=4y5cX+IKA)U_L-O!^X;Ub~n3DrdFxfHf2s9svMzG!y7 zl|Oj#3iYZqhb2;WB&mOW7|y_)W0mcKKhhs6gB(g9VAFlKlJuin`J$z+I!UIplDA6} zC6~WbiTn($6;(vbrY@&BeJiu_^6@!XijnQ`GV0kMU_r`QmbU=8Mo-}$9x{6-!<)D?ZH1kq=qt^PXl zR7yKFwax7F@XA?>KMQ)nWlDYb+SED91o#9xAjS;cU{<`mttK6ZSLC9(wEst19ndue`7c zpt)%LjhlXo$0HEQSV}P~@gx4C_893MqDbEoZCD;l#Nfgl7ai0G+`jSu%pw zS&K$mJc8CeTT3htZ)(j=WyECH`6JtQ?>l0tX*^SNR+vA@m^Me=Yw}` z*_DHcTR-21XZ5w(`c`}8`9qt`@kFOS%pIM0DD{t0OR8v&X-=PwjciZeH$_& z-e%0n#G?WN>f;Rvz{jFkoW)+C459H}LOpcYT@TE`^FR{<-946nw3YK?Ef(Di z+w1V;+JJ|>-p=r^!n!^$PnOU{kTPB-5(Zc`hFbk%FQE7^0gnSCPc?CG> zVOK0ABp_ba`eHu6;jJ?$qn9C!&$QXIhT03y=G(9EfG{wv7oOhc;~_2ug^+`Ia5zpl ziY&aF&hl^yK3_)0p06L=?>o?LKl#Nj&fzB!>W^lxmyMChIgC0^!mq*mV|+Xz;Krah zY4-lsErj#Rv4Lnb`IUMRIm;p2e4`0^RXTp|i6u^1YZLbn}u z<&s?Zze5OxS3(GbZFpQ{ZO39W5yj4o;ThK4(agT=JZnV?&~&hut#Wz5XFmhHGokse zOT@4Lcol`Wx(=_6FFk#X2Y7Dy^mr6_GT@O&c0dX(Tfe!ud44@s8W~enRkzyDo;YAD zfcwsSMq!=;(ZnV;e&JgeNjTOcA>z^J)`J|8C^I(p90MLF_b$D)) z%AiT1-G21lt+sVjoh`j4+wQzK%SPuUu^z&4y`&nIt&bjF@*-6KfBA3s+ElG-)EqAU ztUSdXK7wU+UIEtrDR`Y5&zUmGy@y3X6Fth9q#h%sGbofFMs`tMNl3^cNtQb)i*+9l zD1x>nS5~xGUVbqO04NjlFc}4@!Gs=2#51E}vG)YnAk0^di~&`z!vx>jQ%N4u z&OD(pp~J9b#tdQ4qjN*x2O~73KLh`rGC6BVKBK1jQG|q|4-ZE`{!VEnaQPmPZ_%CV zlVDanW$~`r5qW;i>-wiUMHI@(Nx))(DGud@1kOSVYo@-Dp=dLE#8&c1IY|c_waFO; z5rXQ3x#)XD@?Su1B5$Qs2os+V>xE<*E~J&r4Y<^os!@DWVIc^4BMb(R5#8^GCMdCR z>NSD`1nm?r#qMB8D8*V{@^PZm;kos-$x|{2aXW-i z;8GePonYrnL>Vxm-)gHM)j6rBl@d-=;ag8*belCK%SKHYL_Z=U0Ys)S$GHnRNiPfu zJsluf;JA!|bW&oHv4n>bmV7|%Qm2ww?Q+!UAy-cwY=u0^aK#ZN(>?EmPqkUJ6us2P zUXI?=9vM%%T!*CcG~sOn7%zc*lD)T6o(qb3F3ylF_SGLwKdK2>$r$=bcqU&TjCVW? zF@kYqm1=m=jTl!*NyK>#8o$Dc#vv8B0syc`d7+cO);T^Z zdvm-wPJo|%t7t?}375i!o@qZT{smwDTpm8e@1c4hS8i}mf4l5T{lI&*%P*mxGS!re z=T_hZK6O(M)j>ZAUL{gawL@5;I@--&#(rx%?L%f6TxvTxJK{jQfomVCj|g)(#x^TD?eLmgom+dlhG1m!4N_E0-%JUBxP2? z{30I$x6dao^7oNZtH``J$P zqzq;1hARqj`1MhLy>TqshTCTp0RC+y7Cb%e!3Sp%OKk`=@KJgGlV_nwU{(9kwMD@9 z<{KyMJH%5OKQ6~U|7X+CV#X3qG_6ZG2zS2|UMm zc_!gHG=^FjP%YB*hKA(=T;szR7R_8#qyg(a#J&1gi-wp$g29FPj2kKVwbIwxJgD?& zUusg;#0rL(NSG|46HPiQQ+ZwB&EVH>XNpmiaHIo@;P8o<-;jh)g!&d1T^KEVQobzB zI#4dqW?xpKQUK88KhiF>L3N7me5~-im(0MaS5JKtNTu`?2gwfH>fti{R3Uh1x6xU| z1sp$|O|xPa(GQ-9zrbEy)dFMV6z<1Q+aQ=?({e{+(J6}`P0s4?uz_NVCzo7o(dlUU ztB+b*`*Bb|XW#zUm)#r1-~9F8V1o8AH9@)m5cfA&Umw= z%LT{0lE!e+*=Afy=CQdvY$HcyA<&wLf|(8@J&0r0V*l~e4~Vn4ms0xTVhUyl-WA3o z%+R0<3ekfA2`${2*f7(=z89N56 z^;E1IUa?0XT4HxEpJYFI;v{qBMq7r}{q4(hJ!H!2)q7F?SdV2{vOW6f%{FhrK(wY? zSWm;`tOKbwNWMX(<1{8TMqD64ow6z|In#o``Be^krx6lP#f{=jd-vUU886Kopy%3U zv$B1EEEk;X)^b38@=e@grrQ;ZuSDR!8v$gA#UfC@;r3ZJ7v@4S?hDtf*l&k-pSJN+ zM%Y7yph$q(qdE5ieYtgQp{-r{K5(?6%s{vR+@DKR7Fj%D1z7q}7%DDk$C78W?fT#V z9xfKxoW)~tqj}s;oq)O5j;l-<4wbkGEiEl$9qx^_Njk~^ST$r1wzY3;B}4~tFLC#o zmYR&BS0Qo93b3YaCYE#xhuDD#QsrJ7X2=!uPzpE;ljbPiVrF6yGZH~oD;7^D@N}@3 za$2#PPH}~wxcDT}mZAtUmbn1y3FtzWBORTsxC~6TM;^-Cp)#O3hPadS>nrl@ zpZ;Mb)=u-WWEn^N%T2&i00US4ExTv zSKIp^oPn;UP+mXVv*)l)pPog(Oa;D!#4Oy;JQRb=RorzxzJP;53hq32*dgLzcHo9> z6xLH>vegj_^0}whfwM9!aR%DspI!{!2Z9UYYjb$hG#|#b55iCWd~6J$49J1y*H75$0GXikicjD}oC~ z^@GM|b#)t-{Y7|v*kg}>>N>2)Sy@l=@>IZzpj zQ-`3R12%Ua7D#`ryf6=3$)H;o^p(+Mf; z-y&-ub$L+?mLUAr^XN17pn}EAkK!*XvUxhbqwBIi z3ok<5y8qCnw7!1xylWhTo9KPCtnOuZ6(N`+KZFmZQF{LS748Fm^e$QkH(f>O#_Nh^ zivCvmZmB$PqVly${udc0_4PeXsM1 zU>E+h2Ui*T%@^O$8Q0vs%&@CYTZbF!>=Yn4cUs2*=i^tV9zZI|G>B%L1U zihk>*KGENLrz`TCFO4}>sJ)uJYE|Qo^&AR5d8Z0o0k^rio^xMc8<{=CvSHj0OijdU z55X-KNE(wWi7)@CxS0Bg8Wj>rF~fo z6R{pFMW7ICStB!{$1={W@pz;d1h1=_aomho0l749v$cd2t13k?`+U8P7&X}Ld-yU0 z@O|tpER~NPXtnWUC$c8BW4*kS^L-NnojA@cW8ulQa@IJ-*+QgxxVTz0Ehj5C} zaaf$k#o3P-h`3QNcQ64M7^IJZ3zc*J1M*Dp4~y^Ca` zBsvg-7dTSnt}HDPcJ|rz8`V!Pug=&<00W7-Um|gtdJ0c=Yt}fIW-Qq z?U%DZ?dS92iZ|-)dq3EOV7`w{oH`V~N0F7DZm}yCN?4u=eU#dhPaS677-Y-un`EWs z#rE>k+ud72zr;3Mdc#x%;3!z{Jxx65BPdb~vYR+Frl+Iu0VDq9XOEy5Qs5pY?z?9U zJgI*6{L6=J$DV^&(+}nxINS0ORKN86`*^!L=^nH0y!RSc$k@NP!robPz>SiYEX9jn zVv4O_n@?YyBes36&6(NXJvO|t@+jwP@xJ8EQ@k|hE_lzG!{t(ZFpA*ymIPnx)1R4) zGI+B6@~JcI?T@$tnAV9aml2A9IQC71Ia;$a&w8}s?co0DczJ2ZP-3gSyRm{ZUY1?4 zWIReRRkoe*U&9b4-+AXayL{nL=pwo{`4D7?h4Cn(jF(B>@G1o$xWT?XgED+uS)x9#YQNh^{e>1t@~ny?apB|JV0O-^dmV zMSuRr#kSa0C`sIV&v;z)#~}=^Mgiamo)c>bPcYK%zH2P&5T1GQPWJ5crwHqj&vMWg z{3Oyx<#_sSvMb4d>uuT2-}?D4@HG44DL0rIfRe%_JW!m!&_t~ELU>Viw2!b9c=WrG z@DummGtRO{YIW##F@FdH)d=q2T7AM^dm#_rb`l`~#@nJL0})7IIutCX_5^e+RufEfQkE&D2=< z%JcxdQYi_Dk9@AI(S`p-#pOOhrVklp>4XP}M*$iZE$wP|p`mKh`NV~H+I+#cj`EDP zFOvcQr6R}!Vqlfv)f=S)vOfHj(T?LwkJx|7+TR7ch+$ya^N@WW{3$gZ1~-4WR59r# z@O0YKS|~WQhvcJYq5-D^-&B&2?-=A}N$}6*@?Z0Q6Z^v&LP#o98ZX_N--UwIBVM`6 zQbpofQQc)@NBY+W&+0VcM0V_8ZNYG7{HW0=01UQv_~`*y&S#Ei z@JmKVt@49cHuo+YP&z39$mmbXbaKz{`}7E{N@gi~QN3f$_eT!2-W)mu)wjpQuvh6mNtnN zxkNX@3$N)5XarhBWDFfb*U+Nqw-17HS^P_=9UqSpG2@{f`jIhaGh@AlGS5Tr>RW1w z(2)OdI&xVK@JRtc{9nm}XsLH4065$(pAn#Rmd;$xL)M{y28X$p{Gt`o2(3_s_pdU8yuEqp{fA`_DOM-9>YXj>_P_Q*Iaf+v-$d`=s*Tm8?yD+@?z!f_k= z!cpTb428=JqGTOjCh&@GaM$nj;J6mW2$8}Qb-3(a$sK0N?x;&*W##k7&=|1E1HiN2 z{qqn4;Mwg>%pZD90sPf~^n*V4A-S@oGjFtvKhify5DpxnAoz4a zE%A(Yxckj%)6m8okQ6%8Q7Vk-68=Kxszcg9_;D7zgSbKJLww?49Gv4)`Z7*}8w|Bk z0%8%MG+0E?o$4udqTaD^<{fOdcV0ha)#Z8iz`fJiluz=7JM>YcPSTP^a}0}oI~&Qv z_WFvwxSSeiU;N@M25JB;>WV_S)HeP7?U#tPlSQg0F1zXxPACLGjXmS_{H=@&`Uo$ zBZirz7aPESC~YKj2#i7KKA^p>bg+vpq zHsr2hM*_K`4~#-h0KzG$8Dmg`<5z>#X+!1liQ-(}-S0K|s01IUASJj65mknNt~n`1 z6Y7(zSuw;!d)jmeCU?_9749_v+Vw>i%zJLt%>zxq(!7-WqC|w2acER&qtu8MjNGWS zFz$t4NgxEX8lnZl8E~R$UWJXlCM8W`0p4~NYb}O7S(0 zzZ4==wyrME8RT<(@=W;T2W4uZ&?2J;JlCqBy47ylsJTxroO-g^X+ojlOu;!jb@DXs znmTPLApypY9?oHocyhE^bT4$MY+3#sJwkjm6b6!Ut2LHQ?Syf|u=pX}g%)qG7$weJ z6FR_#^+21yD$!Q1&VzaK3j}0k z=2S(hO0)+|;H{Cd_Vzmma9ei_Ymd=(#o`Hg&xqv!yTxAT@ZV0qO+%}B>2=dAb5uWT zX7kXS&1u!SPW#R`p0SM{E^V;EMBi`||l5PDevi5<)lISN{IjtYdXHB0IxA``N33 zGak3?oA5eN%)S(lHjD*XZBCk$Xy5qfYdKsJ=c@Vw3L86NS{%oN1e2Y{3Wu6DgvtHz zurU@5|BRuj)cXqY2p8H_glYKhw>IMi;wTm;lX1^KnKBcw+Sq3AtlespbI04g_bX1g z)>S-E&{3L0qVtC1l4ts@`GTSC<5-)&mAEGXAqv$x61zYW^WmgfNp~MPd(zSLrTJHQ|cHQk$hz&Z>HoSer-d+W+ zV5D7l%UoM>Q?_*|v&J>KsBIXcHy~*&yj~K|jic*Qw(j z_LF~o1sZO$hd+CzO`kUmD8Gah8vJ%IBWnX2*{y6hk_j!5FM*Q0AMEg_2w@OtPN1|Bq#DXQRj* zUtiye1VrDb*tuKveQ=xsm#(FPb|Fj*kPxWp!V>{H87 zRLejC-~&7p!hhe#nIFnL3Lm4rp!|uF$u`R!I46Y#i(Pl~k)=#eA z69deZ+QYoI^0>WA2!Pveor{9T2&{=9RIbv}7A){j!o;n#>zS(urANF&@b37@W?X1) zK=?lr#jz}eLcC*{3#)ApEHT@${x5-9y&Ywdt1Np2)*8%bJ|k)(j!fL8FfHHPbPyqO z1))K%CnODr4wws?pFY@ej4}uTFl!d>_=bNH0zjSeC%UwT(Rs}CgoeNa&(UK+=-+_H zm)5o>lz@`3lt^=hzd@`&QZQy3RF+HDUH!gzY2DPNzu`^yzy9iyKLR3})=T!ck)_{D z&|AUEE(L)@C+>CYvHq$<2zbV-@Jb*BsXol*2?_Bq++z_I^+QO5budb|eE?W{#y&Ax zYeHL9p6};qc=P}-CX??o92~7xBqF1S!czVG^S!6mD;30hXM!m`I%anFAK0 zZ4>0`;@sSgH;Loj&CMp8 z>Nv4%%d#w6maSfp5R#B+0?|SAUS=4k_s%rnet+lrzr!F|j&nDgyZia*h5!8D|NB1W zJm;yW2T)a8lI0xNhM?Hm z2SqK|0X~NW_wTyYMz#0y%P|vs6z;=cr3+~<<KU42bom6o+2d_2y1_PjlC z&s3W@RzlH`L`lnWIlmq{u;2_X=BG`zd2Cc-_G88^Il$c`VvvVG_<=!z<=(D8bPqJXcp z44}rwCTL&0X5uv_4TXS`l0sbMr&!L&!O&V|&=#q94#T5Ybsg^WjgVdwP{2HBTh{I& zM)eg~nU89HxkZSZMGHqD&~LD2?ref~#e)Vs4Yf-`^@{3JyaYfr zoKJ%N*iUaXW3y4gjT)29dCj8c>J4h z_dYP5bEK4*Pua!~%RSuO(wne^#wcsm3eJNYj@q5K4?zK7A$xZsJg_Yo3*ot-B7ymg z3wXR&*~Lm?+o!{8T!7L9-stF)_tv)B_y2jl#lxc=g?s1Icr&cU`@_;D6X7%R`}A>p z27{W57jx{PN9S=?sIXUly~9o%I%hd!Q|!(Mr(+d9*fy>?g&Xoyw(y#4ycy;ptiMRO zw=(|6B)9!U5H8suZs|l|#YM_1Pt9gX)>#!d^vD>z6Z^y$P%9>bn&A)1h-FWM8yskCd z+pnL3Htm7eg^37a+6c?IgK^pmZwT`dIw#nNAM7CXMH3d{69_jq5~02fNHp^_tHK%^ z)?J-Ndg28DxBb5o?bZf-c(BXBK!gwj2M!j)FYCiN%SKruk5gzynj^9Ss3L_4d;zj-c>g zh*4LveeLTD@h+fHWIY%^E%1B~;#sxPJ#e(1LwMXT9xrEeQI_xTwE8p8oUx~Wal|Ui zDy<(@<+HDtjJ0+H#wy3?qgtn@uUpD^cxW!(^ir620ZKpIxg;oH;|yLcUVml3z4PW- zl=cVPV_%(Qi#<0N)XJpVvSP9G&2h0)63%tm@{*COib-ZR6CL6059jU@c0p!FYQah_YlN z!cJE}Ao+QiYT|MAMz|*9HBBrD@FW0{Ku{pbn)`zKmG^<4E%4!iQjwqUIp@0Jm(FbJ zF!8ndI1SEE@w7Wo(x$}l96%)~_NEJQ`tU>JAsRyzOnsa#;j6^~gxJ>d6fL2xth7@I zH!9&RY%VL6rn*(HH`Lqc z>432}=Q81@o&K!GoqkO@igfVAq`WQ9wNk*ASGIWM8EKq1GqW&QOA=;NzDI z`_(<7r8EzPFHXQH1?XEiRC;+o_AY15sVX~%kxm(*INRKFiNg4fpES^AI{n}wD*TK0 zq2P`X=onS`D1xCFa^L`RwykGCev{3bHXg4J>F^IbfJw+!v%`5e@HqMH{i%KfQkAP= z2;wD6aN#ic^x8B|{1RU@%u~l1{nv}OxbR8bol z;4>A^TYXay{G%WUc!UeYn!T|NgF+aiv`cR6JtVV=;x|?MI2R5sG7ep)1Z*-AV}!CN z07wj{+<5&$n9qrD<2d(uMSFF5JAqYWNhp`6Y9F`sAuaSYdLEtUe7rDbynE;`^`ZLD zjbT|cy^S6471VyUfxdQOwc|U?1r>V%1p#dv4gmS3?4qCI8wZcAHk!VS?-aZv zh-a^6)Dups7P(Ff9(5#}*7>3b^Dfpzra$ngdcjS*#Q%^t6w!2&HA!}&cB`F{@L%Xs zeqCx)7f(TH=`}DmF#rHS07*naRJ*8bjd`_QY4p#>DG#)EP&^ILSO6mCypJNKOaBBo!|=f^D87!fAjC;{w?<0KXp?8a3Hh@ z3V0H!Z~>)7RKGPTJjO5xQRlnxkT^{RN6W32L%`_VRGTqc|xXdR}ZNjuqH{%YfJ%n4)vKV4ok2p8;{2>Mr1-hx~0oxaIW&KrmOUScjg zp%iOV)HF{`3Ca)rrwgiW=SKw$-UJ&Cp`6wqEnog=APA>gjO6Y^gILNB7wOnA*vQ`@ z1%MV?O9+69;-hG2PqP2?M~mEQPo)bkmEnVnd&Z^}7k9VN#*!gC z?XbW3A0MDOcG|xBwJUA;@`(^TjKA0wq4m=t4ds;M0bm7$=Mz793vU9s2tMyXds)J6 z7GK7&hM~$(y%NqGJ5g`Hd}gn`LD+!nmM^fozcAM7(CqESK{?dUf}jnK^+TFT3EIS2 zfVGh)uz^Zwt_`b+_#tg9SgtihpNB<&nqqbO7@~3)#?w)XdCxMAd=_gaj|q6scQ zeavb6#2T%IQn*&xx|G)YCx#p?4$jEZJ77Lf1A73I1n49Lew9Uj{%KR-fzM+hL|TKs zQ3*j>{kYVASH_|YEwY}6`R<1sl1P(LVFA#KV4)?pWwJa8fLHpn0YPm88&W%qcTWx@ z@=Bo?ID%P>-(J+OMb68jd~SSm(*`H_{4gPS1v?+1#1#OPM}Rq)^o`09j+Bl|9t4ED zc!azZ!(8IgdWA+EW^6yXZsn0x^vmnRlhuTtnPB z5He!KKzHBYpEyQJ6{{MJ@HPnO2HgKuSV>_4UI0>YjW-DwbTBonjnb%F8C0+E+#?B% z+za+NRs>tNY_mrmUPx$-rS`RNyo2_BrOlW*4+Ve&%!6}w=kl3sVi~vx-)*JkMRxx~ z*I|{=&%X12KVu6PjI$p+zQ~EipZw^6J^!0sHaTxBt`2kT!%f7&!+qCxzk8qEa1&P3 zRIBw${oud@hcM?>bbJeULY#1_5y0@qLa~#zCTOtvaE?Q?X5#MEK;Trs#L2??WTwqul4FSw#2p+o_Ny}X%ldbz3krUFogQq8!w!(m!EqPPb*j2{rAp>KM4J0Wh8Ti)U@ax)TWZHBN>5a|lVA z?XUj&R$H=ku)F{M)9*Zw26-`?c|Z2jKD3^B!a*v5`80tzjsuDD{?0qEVZm^X%|USd zH-EJX=1)0Hlc{_rp_J6eUVC|`tzEav=3|BN(B~KPjCF{4sRKr|_o`b1p}+`d8u;*| zk6T!`Hmu9HUp=#)@!#9N`3K8w=1dOTxE6c$usGTc^Q^}A&|x`4nGY#2i%#0$0mNRsZwA&c195*>4L*kdt(VP!X^_3 zb@$F)^kEJCik4}@dAs_WDJXv|u$eQoCaEo9FBZPnt|_tq_Ptkew|6D;d4L@~zMJ{k z2W7Vf2=&{r@+U4R)=^*k#!`FcS8uxF&p&?uizxXFV$WSiJhURq&dzZmLJcv&Z@%d| zU~jW$o>_tBZzB71Gu|h1VR+26T|3X9{E!dqajsmJH89zh-ay!aGeyK7-NUTz%UEMf zl0OdSF=FWBpEtcAf!OjYKJLRM(Ju%r1Lt@987CF~D7 zVTxXd8+aIKB2bk-Ok%G?t{pdRK5VD+%Tdg{8Kyd#%YQ+?i}cZ@uX9*=6%``@B%bD3Jj^IQudEFf0%g?bAvSVk7D|<3 zWCd;SunuWg;G)y@Pvu;yK`%lDVeeFm=!)IN>i4Jqh)vzcmwt#<%<*moM}f{daujN(jk>Ju~s{h zLLEGf)h`-WXGWcc#rTO}3g?|zITWDtVxV_JUcL8^s`F|>TU7Tauh7;gkKTKm`Hs%# zRNR%#-|zb!jQK!)Dhl!DI|6UfNtpm zo+6lm(_vHU%i+6(&&%IM=>;dscnJ5LjUtm|Ggb*6XTG#p?#iNV??h5yrNDtHk8uo3O_5WUwNj6F`o6#%Y^21 zrD}frdp-Aj7u=JS7$IAP}S5(pE5Pc%qXAk}-F%aQ7Dn}$wt)X}^I@@S}{Wlw+ z$!hJ&tEXVCmudU=D70D`R?#T6jLP7gbH-{a+Sn_SEv0`eg0*YyBhIMD4^?xn9g3o3 z4Rmd}!y<;bl#*o(&=XhFg9c@AF3Q3pm6+9OafGuPf`GjeW#SCW9XSR|u4V+yl{S3j z0L#xmY;E;*cEgfuY$N9(_`JAlpJHPODYMBy7^2l%5`k(()*~>%N)R#$NvP&$eRmzuy%JmMqCb z@tbqlrenBnuf*E1uibv@1ca&m5sGhsZcVZ;e`7wh-37t`Y`2{sR#|f+dp&%V36q8q zu3#*4s@UFt7iDG)Z{y+{?7`11^Y*VpsX=bkHP_`SRclRadp!c`IJ@bV#db!Dq${=| z>?^dJZkT5eKQhtdyKnfQ(4KqYxSfMpd<|~O6*6ws8^=iBU|)Q6BD}<0cvn5`7r)qN zt5)qtV0<2L9+|#pCnh%AHCN#&47zCIcnLsz*y=USC;)t5iFm{uKDs{&;ziclXoRRE zB;6guSO=PjCx6_w?X0%zZ<)$kQGsWIV|MmrCn4PWfV)X3D5u$`HS`0<5;L#phcUwp zyosb?1V*UA@4s$oi6iXGUz&mPL7Kbh{mqL3JBk>1dT44caV6ZG+^M*^pGf;o5H@fxG~Xbs|7Sq+XJHAi-9@`V_#0+n*!yH~ zQ4Wvc*MuW|`|V=pUpBNRwCUp^C!jq?q+$5b&qKuJ3?GI9z-0KlX|#{>RHR?p z)wFLZOr_bo?>5+vf4mdL_cD%U@d#>K@t~Mx_uiYw_#DDnuMv-_NA11$PC_H}vTuF+ zdX!nx;79kc4>z}=0I<&$K(+t0w^zddND zExB$maKr>Ou^gZJ#YB~oT5)l`{rF#YF^{UT%Abfb3?2XmC3EiUj-yaYSPgy0c6>>h z|FsuS+p|v}MroiI9snlT6$^%*?H&xTs z7oQ64|GF1y6rVQQau!9QL%8s-tZabB=+C$x#+*ra@0G#mDWugJr_i9sP88vp<0M7` zt+@QpVy+CatbXb@I+`n3=W0*zlaoL5vFs8#emaAYZ!vKBNcb)RWg&gC@8B7$ZD_~X zV-Si+g9u~DnFhS->?SfmmcErJvLC}6bP--%Sp6~5$;3m+06YZrbyw)}+#%jY5b}oe zyPwq=Pa07!08{leNWH4EU8qmrOBnCMYnX_Bgo=#^%@gsDg#(zhe!dfX+|PLuzO!~- zbj1crB%Slb$$LS2quR@Vb+_vCGoXG@K@S9sag4{F;z2?qDO{2)wpDE_o)8p1trdZR zIKz^$IFFt6OP--+*(;hzv`?e}pr!~WF{r5;e8A)8y8}zR3n2M|OA&>4yehNtRl^Ib zV9%(8c01QtZ|Nv{#bMakPJ3JlTd-4U0!kkJ2KGn6qCb6;VsRc$Ak0sv!)Sv9++7V7 zuIMWn_q$LMc?bmqH*LL0C~%bgP9HC`Gwicf(2i}uJ78cE1_*>XoP)Oq&bIQ3>&T{! zVA9LJ$as-K<&h(mD7=*u{-?zTqIfe6Z?0K*u<3z^9`&!zpqhW8rF1@V5a&TOk0P?pHmuOXQtADf9pi z^_}V$o`U;&;1MqQ=N9dxRT|M(S{O7BH2w6<>ykGXaHQtBtc*J4TUqBdg+nVPqdwI;+M@PS7ESRhkg}n@8uP-x zrx9;Na5C35g(QoY(nF-26G{de?=O`r{81ZY(er_us6X^reI*5e=eraDwl~uUvcRM9 zG!*azr#Dg^q6NXV@u)!BI((5PxVbxXyuupM#vM00!)8ny;ug!RbeywPqs;;~L*m4{(?dCp6}RBq6W5~Dx^BpQ^L(r_n0xztf=Rg{)n z|Lw4;Lt^PXF@K`+!tb6CDy=L|`&hs`u?!u{fsFW;#H>*FM|r(d9S$$R;W@!#xD%r2 zJPUBnn4y+F00jVPZ!ifokhB=dB3dPNpammHgJuoT5(m1fsE2J?gU0lMZFc+36YP(^ zeYGFZ9NY-4v_-c%l$|=&Xutl=ek_0w*^(t=@BnZX8h=bACGbDpG6@O4#e~M3f7I_$Yw6ev-`d>8{!5$YSGt!EkazbF{llW$)>n62`sY7FlzXZW}O7hEE2dA zX=Xt_2SKgvyN4{vwfNIX(vFfF5lvhku*mDV|M&4B%Ti5rX)~(gpmh}L)|haiIg5W- z1Xyac>Zl(z&Qy>lI``5V{LrFBjE{TuPJY3U9ER3O)*A^3)do+m5_s;A0z1IVn}W*s*eAT}!k5x% zeyJMnB?R{kmLIO=NIhEIRj>M9{VBLu?pQlvlE4tCB}RBfNg0;MFeL_N+NhC3&}L8d z&=8^Eu!z@Tale262`rq6`A!V9yzwJ!1YQFYdu#1f-|1Vi8Zvw8OD<-(?%I23>O9LKIvk+V}tN1v~}h z*bn|?5$Tic-BmScb8le7L#R1)2*gkY7JRk1c0*z3^W)GS7j7=$Uf9r(2|W@06^3+y z({K~(t=Nx$$FIxF*Drknd_JyYzx34iAB|^*enCOI{pEjON2mmd6(;ha?4gXCUY5ZD z_UaoaV2P52HvnyVc)+kEt1dck-~X%Utr82CX_F@tgK{z!__g-ttNVyqRc#~34YZrF zUZ0XT*j|1%A2)QbU>)cfKqeNe)7#a}u^;o~}w=J6w5VtVfzW9}EA<~nvD(Jw~ z-mAF$YhrFB+0D1k$30=DGlvfBD`3q?W?gOol0a?0vi@03_P2k3huv_4m?amnFt4?Z z8*s1r_93k4>luqE%P^i3VWtj8h%Hx)J9ex^5n+*gTzTrr!)WSnrTjcwem5=xn-Wn9 z*@*?i3F0BnM5BKaV@u<(o%zW61JF85IG*{VaVNotgz@sebLMoF{rqQZ5nPtpt+y^k z(PW%6nv+<2ckU>(7hl-UUKeM#-7yw@1jxMfCcnW)>N1U6_w8T6A{ttV!XRyyhwYb^{BW^ zsxN_fPYPMWG1;ci9OO6~J+?ng3HI;zN2$6H9;1u&U3yYZ~@F$D7MqDFKM3_Fu#*X8VuQgUU z2mc>zD6{|iz1LtoUco|y+r^W633rrc-}w4`XPp1)SB3Wa>znM6$L_K<>sG_aJZ69Y zj}NoX474Bpa2?7nXK?>HkTr?5mvR>_SU~uJ<5o(Vc855ZHWyZ3L}K`hu-_8g19e-ak6RCAuEL8 zbNAghQHS>9KtFETa+L9Nkoci^0GKk2{W;9C=)4*$>9eoj8w1{Z0r8$EtX+N^HdFdn zeROI6Y((+t)aeRnowM{+1&r}l=%Zv5I>G0=KX*I+B@>B3{*R>eHx;z1&az6TuQ2 z2+HM;qUYU8i6znM>aalo>yeI9bq$>eAKRQ^Q;Kkol+QnUN8$PiQ~ssaXx;K$syn>z$|IQknNG8u>!?HLNG~InHk7AyAwS9d zir@|J!?R1h8=9*$UZ=170nW?HiQyzxWT-d#!ME}T)bY1_TAu5-!yq`j<>|VOJy(9E zjo{R`))B`+EU})s`%bCaTJ*ByHnOX&}V6ADw#kXJZRzsJf5bt*?}O!)IqLckSuG4@oS#(68A(<-sV zEGsPy3`O?&O6ZOAFm4ji%9C(iZhNx_XK}7fLpY@QC!EA!WZVaM90ISGKU@K(a3B5# zD8jwo{#!4>tdBe!wqtRm&~Igg2#~^Oad8!ACmdK4pL`JEt8#O*QDT76kH<7$*MtwR zuv^W#g(h-X9j8jr?Y(|}cKt8Ifas~S#f|pj%LfsL7TNM!$J@1dH%rGunwX*LYbgM1 z*m%fJq5v>u%0xT>48mYXdq)q>94+?${N=lL;IP@mDdP}4HQ*hq(5gz>5jG7amUdtE zJcamV3=bG!HH{^9^KIAQI{uvP`0y~p7CNHs987Fz3C2e&v1^+V6j3u??0O-*OJPhA znhneOA;U6kSZ+V}K#`o-4_GFkOw)+aDjzRg^4eET_|XA&-8It@x_^iZdV|)RYB{5O z6RZ0KVaE#G!uyIV2BU0$HCEg0?mceTf#bG#=`B`X++v6J;kvx8g}Ena;0wS67VklP zh~5ao<`6#Xp+~Pl0ilOI^YjjAqC@P7{Ry!&jWb^xZr6_?Xs$zWmPR&+uxdP*InBWI-=En@ynffPr$u9O2e(KJ@LGt^T~O; z@%kYs3S431@c^LZ?X7p45QuNLbSy?Q@CbO~*m3w8Np}0Psdxdv8v~Z&PyPHb{EJ$< z@%HKPJ1cGViUWkx>uC#@jI;SmM?izr+gg;c3k&dSHldH*buWt7lLpwvjf(&Nj!han z1%AgI=qy~$H(j*fyl~9cZaiSQC>%_lGL0||6?l9*X4hUbobZPeP`urbV!~mYG9%X( zFPT6L_$J%(;Ss_|)IxJ6u+GMDZb?RognKOi7ZKiW(!{>3sXbAE$NT8^Lfg8H!ONbI zj`zAMj5zwCaCJAHFy_ojv^U?WM#&%_<%oJ;Vijs)))i8IIBV-xoq->e&N(g<1+Jsu zt=g_#x|qI8KxuambU$bQ+h#ypkHJ$x@T%dwv}k?v#W?ICazorid*6OL-=6!;QQAQm zz_Hnkz#g`H7a=BbiJr||8aX-(3)>=;-w8SQ*fe+v{ZK53(Q3YIs!)wwgp06}ckFCO zK)=UB5wtLdm=ek;y(r>YAug!uF&=Z=X#h(1x ze!OI`uCq_|>{*MOdz9rLz7i#%K|Urb@mTTVOGS*^jVP}4#?t{b&QKHsKG+2P(gS0z z1-5J%o^ASta~I8Y)@4}G1gD@i!X2EqHLFkC%fC5^&?dni{>nI8a{VCY6ol08xVm-< z7Ah$ZNde$TKa>JM6$${8?A`}QLq{h$U(mOg7>*qEl&f_{i`+%lA@PJ?!o%UO@n|q| zREm8LC7GGC2f0i_XQfb=cnr{7ctv^YCwmE}QEqckWO;ya0aK<9^t18h;6^p+X&1DY zC;9*SOGQ&;R}E?hfQq*yEBgI-0jx(MYWT1$yguYQeJQ>z%eq6NeB$|*mbc=KtOVnd zLih{qHiGoISlwszmA5+aR6&eiT{U&p=`Es8{}wDHxyX7$EM2Qd0p--$N<7^aV^~Kh z2>2PfxxqN2rv!PPUWO>0D4Ep5_o%RnhI;D-tx`)>(x`f{q|Qvg2U_ab{_yE+~`c5;?2mthv6MM_JdBioyyAullg`m#rkMBy)svf#^k$AMwm zD@=BF_9jecHGHP*gv7ajS8V z>Oy7pzxO?D08gPV?$vmbt4-=-Z=&Q5G*_md>Q}X2bf+XC;kSB-e58TBsF9}v7&kh* za!-G`qy!i>SVeP4q9?BuIw$#g0{rpHaprlE31RW&<@SJ|Dw#*1ms!h@BV9m2K(Z@& z0!+b*J(Y2kfOj5cX=KhcLZeF|_X5fj3im0f#h3Ll4KCaYT>U2S1g_(QFK7qJ95okY zD5}1Qyy>Z39!H)`-g>o*CUt@zDSo)|CTpek1C0e;B=NfSTdRC8c+WjhdI2mhDY&RT z$iTprP%i^jr~5#i(_TUu&nSd;@TEV%=F0yR9>P_VSAEHT5a(wy`VG0-c|4n{hx+g= zo%Ko~5hT1tMdgDqgAjJCtT(|;&`5+?_{3A|H3hwJ_$#jmosyGe^KQ(x4<28C9V- z-t&b&de(v_)ag?t#B(Yl#&s4Nh$8_qr1$#hC_$k~s^7o;0;*UYo|UZ9@&70VP$ucxuTb$AaPIN>h1r0G5mH{ThV2oOl4G*^ce$~q*S7OuBkym-l3EtYfK5Swyi&GC8rPC=kA?LJm~S- zJ3;&hh^ILEwwV%V}VY}_NDfTDdneEnnTDStB4&9}U+(6 z(+^hS+Nsd)xmyYVvn)dj09si-j>}IJruy`W0m`?2NdZ8Il{elvi2}fS8^s3nt#8h> zdGoNu3<_?sl9XCklt29H{+IcPHR=Ui>YgNa`6`$s{q4Jdb`NgD&}3&;292+fL!~Kw zDe=)>#f{gmeuG8ktdaJ>muH|Mgv)l?qndn3fBB)i^&$q|(fkCP{ z*TN3p$Ob6Jsf5VBiui=r;>o5(BK_l+H$`>$1lNMXKaB_NF0NSw&RvMlgpJc7nCF_{ zftf{qjUOozX!%no@$n-Ig$NcuL{P34mvHe=d1!++Z7~L=nBa_8m8-=J*aU|bEge8q zrWO$4PK3J0FX6qk%-pRA9q5{*Is{Nw0vk&TZujKsTl2kxHa8(0X@RKswNh264h?$8 zga8Gz!m*IS0w<=I7JgTVp?RJBc8x<|a3MbFB(x9h(#9n%Qr=NO8*$btmQ7diX>5jt zQ*Cu+465j0Bhr}FMnx{ihj1%+g_};=qz%WB#g{fOpkW@;78nEhCki0kYjAhl56jJ5 zm~!bT0ZlWE>eznr( z&K+jo|Cg&dSf#L*cGy4s?Yp*Z>sd=p8|>Em9i7d%aEFkYgEl1u%IMJp=-V*9`Eq>m z_dop7Q1IcvcK{>$B~bJvT%L|U8sjZ37w~FOWpAv+_2P#`XqP71)HxGvJTbHne00)I zK^QN*cAVXKPaeB>7)!l5&DIdF@$dfIb5>E#V5Yq&@n@tL%1!!g9~5Jy2t*jj_DgWf z_u6|{Z!|Y{qP3iYwrd_5_!qGhKLT;v0z)kxx9y4co&S7|O`9PtSXo&mff&y5)7kh^tTk4c2Pcz zhUK$u>2+g$UiQ!dTjN_w0L)FTv!$gCSg3TuKuU(OmS{D&pneCp=3dwbOpTmAL{W=)!R4iTp;KBLnf`{oTcbKYPC zpiTDr^SkW$!BU&I2o3(*CRj>3Fo3@TLQ_2V)D{SXVq1LuB$NgwTmS67q7zwfSbtcj zd;~C$d}J^ed!a;CQ*_auf9gX!ysOwQGQDM)&^I#yW)_NFS|>3FLrjKpV~dd!|FBp^iP}}J#+?FqUTT$nQM7d2HWmE`FIxC&0bcA5PqWFfB$@x zN&31HoACMmd&Tx&zW1_?9J!cslTg^$Ygb)0z`ped3+Sad`}MPD?a3!s*o`+Yg;-WB z_Y)|TJc?q~K&&@b!+^oUDJPeMHCDLs7nsKr?9DfKxboahH!j3$z;g(A$Js3A!n$=^ zVR#KhSUd*BfMbmFDw{fO0*t;rcwmqhilLmh%541j@mTxxz-{RXJJ*c6&xPacbDy7s zVnU|lSj+#VSxA>$_CtO2*%dH=AcX0*>BBPIbsmBNJKaWO^@itI2!I|ahMebl0sBFj zUA=e;?wwQpSfH_9ReJ&JtCg08HN;g5r^2XF%uAK(Gl7_iW`~c~+4>Ee?XEi(xdMO` z5H+T}KeSD8m6X-Na65pdT^-g&H@gBr*pCeN|Ho__V|?Dc*)}aw01%<$g@pW{{r!D0 z5crzQzR0-X<$125m`6jVp)9i&EAgtSz!KVA`hOPBjIEj0DzO zonI&-D(3eECjb&lO#$7&`)!5kwU{_kYHVZ;JaY!d9GdY}#F*8Yr5Ryf99~gU`Vf8~ z0qg!g+AA{fc!S$Yh|DBnS4QJc=dVE533kq$PM`(=boSDv^N^HR^&MSKd`3TF-x`bh zbkT^8PaQwQIPH3_l6-9r&%4HOs1D3usz*gf@1s2G8~+Egg8(+{Ingtv_wzO7g_Hq6 zFI6zb;EYulgPwNA;O(l<;n28_VP>)IoFohDj=Tln25^(d| z(Z&iQ zE5I$lylnD{j^nBSj_UJDV)X>*0xmDBTr?UVF$ksnuXAn(=gc}h6g4#x?;D;M_z8kFw%G z_$!QA-W8l}x4-xcLPNHWKscF$qFaF-I&j*WaXpPz}bEdrDdr2Wm>C9xm~w38!Pxcd*aDWoQvY^&U>d}J)VT6?r~eQGM{+4 zJ#oc9#_qgxB4rRSocQj~zp@_Jf=vqo=&2|fkF;Y)NlO^f zb0{MZ8jR)ph(0L3V}FKPd{%fUfgayJCf~>|9CNOnG6>A!8}Woh zxPWJhBer(KK@>l-P`aOD+c%#DzsCrtg`4^V6IwmNMS zLi^o#eQ3r5Un>2WglDC6#?p1y%!bd{pEb4>0kvUqT1JSqli)s)^>nb0y@rN5JOn`H zrZrnteLQ$hVQjS%U%B1pFCJr4p^;7;KVutL7ZGNzkC)%jSiw4%Mks_U=+{~-<3B=i zBHkYQ+%!BF41u>0_KvVFGl{z|dA`rcP)NpG=fK4&@}Gd;6%XHFpq;^s*I5L*1MucH ziEv?sjD>dijGz1bWV>Ve5MV_KK3X#UJM3HHBOJoJ>f=A&Zks+h1}>OmiSe|nw_UX; z+wQw(6fkEHqO2B!G3eKGXYH$Bxy_bblj-={xTz8M{)e1?QMk~tW7AP)7;QJ+Fp9Ys z_^LRtgFY$8=xPHv>B0EB5_&TcuZ#zwPkY(IMU(M}kbz)ETSfpf2BNQI5?bj5(%gLB z*1nf-FFkt#o?E;i`o27q6OQtKgm9_wBu9t)m& zVlRdSrO@5!_Ta;KIhZ~O1%PgS(FLw*`duyPO89%-bd?sn(U&fLx1cnB;>20-U&y|E z(FLw!#|(t#NM*gFwE}~Ln$K-mw-%nQ#^w4c_(OG;NeH^JqwwH^2aLY7BhJm;RjNLp zy!2GXsjQGn=O0ulv`QNCSJ$uspKTa{lDS}RQt;PA60wdkK) ztF!id|G`_=IX|4nIDav2^xS`|K|&L0^+fM<4sdwW^9tICUv6UUcOqKy33bKyb4*z=ry+u;A}nc~W~qWE*_ zWIf(XO7Sqz%R>N+9vzPt3Y5oD)Pu_|=)KWh3IG^C zd$9kxrwIChq_mG!!_!g-m3bbQ4G8)$mKcTf1HaWj)C)9TuV9nazQ(1b4Lak;WU@Y1 ze7p&V#Gu#M?t!p57(Ghn!6=UPvv{$o(BG*jWMON}oW|WhpK}sut1j}&`-2RBk?6p$ zrcbCyVaH?;sWIuvV&h4CJ>`*%M=(gfAvB66lvqZqv2tjR`M8JX=m`u`R0(e9wTf$= zt5l5(N3qXmrC0IdQ{wDAgtH){%k!OI0Di%zdte4;dDl>7!i#8ptqGDf_Ee#QOE}jp zusBrw_A#&Y^lu!e#tE>iF1=G50;0I**89!xceAc`FHe40ZiX^nCQd=hiR+6 z^K_Kw?N!zu3bpgji56u2O6#%>xmBhy@_iz1@VCozS0B=eG z;QQ;r%H$;Qa2NJ%GF9H2Nf_01#`ga4kGZ z0pPXQPNQYK%Vu0L#vc8~G~7|Q`k}K+z|3sX!shU^Am~m)>YgAbj+vGuffO2x+9+fp z-wq(>IGju4NVD()1EQ0GAPsVKmsqe6N(rg-L0EJ{I(24PoVBnp=g6;Q(ms!rLDb*+ zXan>GQG<;KzQ`*r`1OMl&pOx<6ly?&Jh&2)G%O(F-5HiUfoDL499m}`M&+)5Koo&w}TMTZ~ZTg(KS<}r`7 zpt%cw@TnoMdkqiaR^P(2G}R=K*FvipNjh*y_#ZqMXrq&~gfe+1Jo&+i!hAzjyJ&km zc+gsF<=qDxPudTEwA$*i{J!q`+wIj? z))9-h*8b{$+=Kvc2tz8)p8eHs1h@NOm}nzO!0IB&?t9=$8!)&Y0>8v&&6wa;1%2g? ziZ%ms?2m5#V=wh_bU7T+kLX1VpPZWsWzb1{^a?E2*INOx{bVCDXYm|caLs79PF(%k zZri`>BnklIZP^3U?0g*k%-D(Vk!WX+pSK_W-SbvMY{uc)!-)A#e8AEoj~(CH7Ki1^ za9e!sB-^(y-!`n?V`(U8eeo+-!GId>hk1=F4M-`PG$G*MvgI_M0JgIRC)zdF&a>=c znSSW}#Z#ND_-q6H--c%ZT%8f`P_bSsD$m-yD~8*bzB~ot?EsWBG?%odmZ9BWO02wA zgh8o{t&6sL^-0D=3$Em6x%JCit5(3cXv50p%l5&B8hdl)Dik^8=eU?1nrH?rj6&5zw>Ua0yp`acsfFwZU&AWTB`08snEx*FXO~Xt`hhsdWta|m3y+e6&A$`}wb8Qk##Do;qJY1+SJ(*`( z(^!F6LxgNrK(fMQU?bg$(#N|m?`0pXwlU)d+uTJtmYvJ_!VhTj(9sD~u)&&IVU)9O zo;*@y6-D#|!uks+VS)jbtpl+yN!72#C5!9CKmXaR)K}o-o0n>4s;lSdI|0+ z2ietEk3m6TI*JNd3jJ~~o;f~%7|UbcYmKY5JMS6;0|&REO~#xpgz@*fT`_+S)>tP{ zG%2^g|A)`vX=Z@^=<&6LAE-nKm+AXbKfGM@L;2yuO&<|sbPqI;Er_6=qbQ@&<-9vhReNy2oj3$3X;m1WgJQ*8*TC8#l)r@4CB6u_UvE`R@l_3 z!*Go{38qaB)&klCG!bJnGxilt(a*jE2DFdq9J6y*qpe)|J_-Ocad%0~M0XnrV~aEH zf&FK(U@Nf&S583DHO==&rYB?Xg1w9ffRQMLD#XWt0VuU-AM)`JAw$fvy$8^W-?-K8 zy?ZeV0^K|SglVFr2$^ef(YqfePCW`qw{$50s1D8j4I6gj{&5_ZPlMUBbZ*p~`>aES z>8`8WQ15!?H+u2$3*2=*4maBOic%lF;w-n@XMh{{IM|J8uFfhDeFF&d~d<(8{7mC+7 z5S+2Mo-Nc8U=3~Y^1I*sBgOG zahRgUbS0#GZ%>#L^T z@YV?%!1?(RT!UYGT{i9O;QV#Wo_Oj#%DxF^Y&^;a$NemvlG4W}<>lD$QE7OVtg<~j z&qANIu$Lp`y#IPUfMy`5-H8JCacGWScKwZWEq8QZXo@4YYwKC8(ULif5iS5lZN;_z z$A8)g>=kzX%?oieA7|^|KMo(E7=a%_Sf0++lE?Bb}u|SG@{%< z_ys)tulv-N8a*sd)V9$s;LUIwA;7O-X|*h?>Lw&vR7_DA2m8?T*% z5PZj3IUYS10|$>Y{xa-Z z6mX}`Ldh9g@trr0qHIy+`?xHh(^EU~UNH_{Qao)e!(gb1^ADbmpdVBEq*_W!I*K06 z)_~P?&z@K!_ijenf*A5chT=}0GhJz|&09FyX2YL6TTp5rtVU>A8WiUH^oheA|0K@d zNz9e~R*R>(TW=eWG6RY+Ba>0ZpkDNoh<5Me1EyBZ}Vwu0wy)BBXV(GQ&y!~B*VLl`a1cJlIa_{TuFaV@jI+BG076>j5nn$)zs{cc z;Wpd3wbhnhpJR95kJ8N;Jij3jb(p#X7K8cU=PSa&r3&;!=X-^WJAJYU;cKA_qI2;g zIeY|`^y!H%boU%2)|xLqNq%9i?LpzGwyM(l!&4Xq-(o2AXgqbnLmd$5C!7sj9X3rfA}kML$9-SID6MZhZLMCM*#pO z$ChSjBa{X4n3|r|mwuOEQwsXEhy)#D7+vUW}#QJaa=h%JET28^n_jdlGqK=ST68~QrD1{BZ- zMeu-n;fZeKSi;2+!d60D4J^qcgcp_LFsLEI3GI}jp4|Uq;^#(k>Z|h|@hCFYp$JxJ zeK_mQo;MQZz@ShlFSrukY7DCFD#$T_C6M?XjfB!|gE!Yu&p0|+1JAFBM;b%wcgZ)@ zE*~2}BkO6&LR7xsbECmnT7jyz3SyNnS%%hEDFE=8a@E)LFYjD2g>*b8$K@$Zi4M|8B$0?LL3k9-;#gxv ztLrQ-o|I^E!Kl9S^29Ht9LNeh2uJ}aJQtb(+XdTvIm*;WE@W4|K2O4Xjd$UORGyBk zx(y%d@&2H)xJUtjXId|H2|mpe!RJaEeEZB{TsiUt2>0qI;Zh&Lr9W;Az=JsW#l1DR z_^>RyCm%>5Z>QwRQvPd(4$-o45#O3{TH*o%H0n~d5(9R=hyV%)=)>9AM{Sa4# zjo&9bWk`!p8idg$0DIG5xvi+iwQp@*ofEJF2BgtROhVNG9Ns=P2tYLG^bwOt%qhLs zL}`->qB=mB;?j3wA`1m&h%itZUl8;%R)+Fw@lu>&f5_iN4x!2`w{}6GNGqvV15at9 zGI}CVD#Nvj2=acoR#8k7jS^X0gAxu#2o-@(u2wn_G?Zg`S&EC+rgk>4q&^&i;{(pX z0bqF9!eQ{VAa@`1y6V&b;t&?!yAPoi;%)zq(^h!upe?&`ynP4l-2@JU6cK?h2>C(( z@VC19qP_JN@xPwijT^Q&``&kN;1EhIawQR(V)e#uc<||$29e^%96Ce@fPa1iE$~8n z@PYYw0GRDs;9ivf`Lr@rsXo!A#G!AsNCgFe6ZVh)xE{ge5EKAry8?jPcj=1qcYk*2 zt?mS8ZT&@Cv-UI|0NzK)+83+KJJ6!$aO|5-7#~Wj(zHOF!3~{40K9;r#8uZ$v9JAK zb1bP37-Y6fqff|;1l-CcEj;1b#|N`jEJz(b^wQkLS@$*sTAYg|Wg z>z!|8l*OnG^9ooshds5*5iI=I*w?t%BCStwAI|2)-0_PvO6%=q_`4RA+8}sTkIEE) zu}e)7S~@ulsqDaHjll@qs@AnCl}86qVAT9oW1VSB0x3_Z7u*v=Y+aBr-{-%BO?ff! zgj&5*xpLTE;!coywS9n2bt@0o=QzRBZ<5fY#uheK^nS~mzO!JJnt z@^h_e_RVj+i>FHp+P=xfN$If4wMlxV7(na)`nZPhaeD7*^b?B6R&Oo zmY>s@>wR!5Uu{2o5)1hc3MivD2k*WRL38b@rK!XN+mDs4gAC4Vwuy=5izhQlu9o$DOJNk0mjNx|ET{A6bTsr;HWUF4> z#b#DwS6@HbZn`heI(l#@v4DYKnlOGW z@wv0H{5Wer{?T?jcK96DGZWY&&tp-uAFJ%4_J@CTy}kBov8{UheG~xlY}u`O)Kz9L zy{P!{)vTSF2)M7n3xGU71fob5rxKE{U3bjhe0>k&ko`F&6;0e!#$0ch9kp&9|K+bP zBBpaZ<3;n6`6cAzjbhu@GAzvxSXE^U3MeVKr7d%JV$-MRLG0u5u&u`Kcw~XiyJ`p? zfKW16`4Pg%3fyE)u%$OovlOgkgu0fhR(s~j5A36DCv5&zb8HzQ7&7H;0NhB+TL&)@ z89Io$Ry5UX-H2y!R+e>=ugo^Td(=wLR9N2hVRrLflWf$aeptcCWhjTf+IB1mh_luY zhyE}b^N&?q#aY~W;x!=us4Qpb)6s-^xOoPGa^jbw5q;uBv%U1vIvbMR9~b!3I5Q*? z+Tn<8!(zGuw`dB-p|A=HY4Y^bThS(Mv+w@-9k$|)Ev_+t^NkA-+75>aDR)@f$2!qs zFUQ*dupK^l((8Ee!Npj(jK#ucm#trS8ik$_Fmlc!$W1{RWVT&>O%{qR7x4g4XpjH! zb-Q}W5{ThrFxYDCFaPomT%l%Q&9L6i&=!KAapu5P8=CpO7~9QF<@W7Ac*GTbp8VO< z2<_*v-LwPSM_6f~m@sMz@gI*e=dpSsMrKQErG5VMSHTR(w7>rE&(P-UY~kW8h^u5g zXH*8anfXO1dt{)PFc;UNL;Q>pCZ!Mk|EMM5|EPMj_vz@j6)T#TUwI2}F0*m_I+Ae# zb;ABtUDJ+Y$SIg_<+v@Kfkg%$02tibVG4`S<2hnI47FU=<6+D(5y{}1g-`@$18y;Q zepJC++s1iosgIjaga80rVoYw>aKIG-?z?Xpb;LG6zKU3@)~(y=p&}+v8uFO}z^9Ea zU*CV*OTCCLojhU}H`=f0erL>AR@LK5v&P-%H#QOa2--qtqwH+Cy+jZ~I2Q@&;>92& zqs~XlueC4S#md#g-}CB%<>TpNFLb^ZELAmi#7S;;E8VKv{AMG64=;rU1s&V@=DD@V6n{wr2?C`#o8I2_;n)H$uIe(F$) zK)h3~_M+H9GD@Rzqqao#JKQl?qjZ8loX|sh<@-T$_$`|}6}rHk_F z-p|LvqYBobbr|)=F{PWXD=N>c3ytY|ryI`^!)>T9^l7M1^@ik1(*3=DdvURErMe{4 z_fkn8@M>h(r@BCWsr6#xxzNA+IUrhIPJZi=6q6f>JFPgm zwY7~{S+%n6$nv=-9@pR*KqRHZ#2+#Q1s?b)skk1KC7M7KXo4lWLKRU(m%al&l(Kv3 zC|CFID9@#I{)9hK`(UF0X9M8@;D6u&r3!^3DWxZ48J#sC6>Gpu52cm@oMKAGP#mj7 zD~zs7<;PyczEqn&djDx@Vo5*y`kffic&$WO`SyGHSPNI!9m^)$%&D0{0YLo;ddtch zY#rx|f-@~J;`3YqK%s=1pl_dl=?DVGwOGI22yde=d?GC935C=S6IP)N4J*PNgx2>U z0FLX~V84832Oh8j&qP8dc{fxYQn=T8EAM+9D7d7j$J;H-CbAb1-e_YX=a>s9?`Gj$ zu?dChTIdD5=?s+8E+H}z(6G1#+yVCGFX!3fs|P~Mcc3JD%KrKB)zCrEK$(N>$f08>ITxUCn@m`MJexE<3wR4` z)4F`CuR(FUy@7CBgsEJVOWgFmct|^qLQYS-i%qwjQFs8@cf|JWD8-XlKdiqeAPgM^ zPvD|G4qdnD!`)b^U&~a@ux*=9xD|OKUNNKq@aUrxID7ZDZ9A~q$1A~R=&R%;S$Ah6 zOh)mC(1KC~8b3bMZn%CFXZj1alJk92OBycg`=iKxnEkuPzWAlwMTPo7MgX=!D*c02oLp zJVF3WOySHRK{DPlpFP67?qDtKv{CRB?^-?qT45Bl!g*V_wg6gbALpPHy9EXC1}w_A zY~04#b_xpX6XDM_*eXKkeMAU0_4hP9BHVb(mEaYFrI$C@gwYr68(&$1_q0^n(i0)Y zMSFjJ5ncec5whfmNKoK`pB*RyYHUDIEhe_)hLbu zp(ygwajb5O@v3kGMk3IdtjU|Uv@(A3nfIkw|7Q{!Ajf9Sgy*gHP`3COg0~UD^A8`# z?@P) z>g)PBpFYBwTlL187V$Pi0TkhAl;E)4e))@I_R34A@s5y#vd$R#9UidPt;{5h3e-;l zpp6y|r*7X_Sz^z~1HeGDdmf^%@c@v>7*Uq6m%~4V?{EM<)DM5~0pT~2Z23J??Do5} zF|L5e?g>e(O9ghX%OC#F{Bdl>3ZUTFPkEcIKso6ko(W6wIMx@#q*0>=yGOZHDPYm| z=+Y6U71!7$B~>U85fTM_4esB^a)x3p-medQ5E)jf;Aju#P94b=ou~W{ADqKIH!vLEB=b=c5kzOCgv5-I_Wnl0ccFQ;hD~e%En89+?5A_!}x%IOxg}! z>ckXJnK}x~9^KE3l;r$u-cf?zdpV?mj0rSQ)SqM&{X;TUM9yebhw<%acTE!ta6WG= zsj?`Kc;m|FMff{EA$HMAq;mR1)u}B1t+G6SEG_wKSUZm&t#pMZNXrnu0gtm8X~>z> zk7_vSgb-y7fB4p8-ia5XwXdqCnSG8h5QL%1=r_P7;Ay1)AgvD}k3bMUon~UZ3D1H{ z{5s7`DFJvadG!l&y;Fq2*@tI|PU@XJZ4~QhCLVQEMu0=UN_rWWkC-ia!g3@?>!n^9HEYTBs z*4nBNz$iMjw9~d`=j(L{ACfOHp7oJ@QgHcL_WCFUVUqp@ISh&ibhtc@$SAXo`1X<` zXk1BFOA!vMltkps*%jNVLvyg5{;sa0ZalEN!V>)`Ub#L3R)T+p9Y~b72Jou++Clk} zeQ4gP?V`o}qCq~^`Bs0(OMu?U@C*$bf5&F!@)yZA+tE6ZBBMMitA*+(9~0!4z+7Gz zWIRce`3PIgd(vpUT;#l#fZ;?MUPQDecXYHc?==?jh=8oM0q-a0@Q$Ekr(CQ@<@c5x zmA3RiqTT}D)we3%4SB(r!o~K+07BzeA*iHy9p)UcQI^78DAa_!VrcxxXLI?N_Gyw{B(KVo3|*PjrzNL%+phQiCMW>> z`QNPp&njFUjSzuBD60@n%yTUqI@C^mc<;6HL+-$(Wu(Pf5V;}%heK%)BLm^U(TfS9 z_&SuQipeTKr2wE=+X1q50MkHBMmVm{(gctexwL#l6sS6%sA>T9NH8aj8wv9y&{Bu$ zw;)hclN897OV+-eJ0CGkQMFC(IF3|=sZn_r`#I%rpD!CA4jCy!{G$>|0au&Y*Eh><`+lg)ZddUJDTU zqf)du^UyV(G&UvZ*Vt2f33ua}XqpntJ>28q0*J=ypyrxB0IMP8%uz2V0H!ijivOp6 z)?w1|P|tmg={3*&ckH>p6nsk0n25DA%;S(=aQNYipSmd4|7sBn_p$LP#PGn!vy#N} zX}OR~ny}#Tm;&7;ks6`@{ZQ+Zi40@Z3OhB%Uj=g@4F0C0z=L$owerHQ9YZsY6gny@S` zuMsJyeYpMC$IKV&>^M=;oi_V`uyr7uoHV9#2Ibha2* zf6u@05gscJ*_3J50$(Cp+ONYX8D&dgB8(p04@Q0(g5+v@{<*!je?PIqvCLl1T>bht zr$8iN$*|`LL}9Cq%o#zs!?DQe!@(iI>J4_N|6~8ede-r*n)O@V(#E=Z=uj;d3j6H6 z)rYaZ*G8RTwaqm)eIeEr56!TCC^(!rT5bSpK$X95zr4$ePuCFZaEje{Zyp{1wDz;^ zqglFkMX|l{(gtg3XotCwN9@S4cI4T;D_y{X|+#rt2wMmnSy#*1rX3cSX{0CdHHfcoAJD6cf8>|)~ z@+^D!(W&yR3hu@Y_C%xshcMzQ7%cDNOHtQ=SW z&pt~W`7LLytyzo$X|u}{2r=0PBoJqE5nc?2fNza^VP1Pbv7|UG738<0bnuZ2#xHcr z;wHfsT|E^>)d<$>m#zP>e)h<>u}mgj-rAMNZ1tPFtsgNvZ@HT|i!&*cVbu!Gcdb8T zZ>`vDeTl=k{Qku@c50TPcfp?MJxxD>W9F(0|9!FHa7E@~7*QL+$%#W1cCHSFGK?@; z{$IOns>cG&FQ~v;sM#t@o5|bT#^vF8i1CmRk2M@x!v{VpwavJXEXptOFa$ZnGO;e1 z1oLi`ZQoIkLfaEC{rcKBzjYr91c_Kltbu{h1dhN^N2}%K$=YEOR!fS5c$jpzv(~T~ z5*Kd@UL!KoIcMl}#v&vlL?MliAFZKp4}tBv(OJ}0z}W4HLdakkM@I%=H z5CebuC->N{ogFY=p2J(k0<3!raiews&jVM$be)JYLOz<<1VY6+skj4D8A648cKz!Z&>D3KS2`o;f<%CDZ+A<2S^8I2)?mTV z%)TFof>kE_YCn{Rl33SqrH!ERh&`by4W~A*Ue9!?PCnshm{`giE~Vi<`l*Nhh#ux!Wk(7CdZlcaiVZM$ z7JnEkOAiEx&Z1sV_qM5w?v;6N&v7{ru}A(Do9o<%yxr^hUFj~pi)xH;rE)$2hYryZ zB4|(dvFZ3%wMr2c=Jydj6nn|D(1({2DLu8thBi1+AyGYkFH~R3?{B@5%gfMnp;>M4 zGX1Q=Lz3ya>Q#h9fgPTRT>|auOzBOKOHtb2#*Ah-g)Y7 z??MXwjmii>2p6Fa<6k;JmpOZiN!5l2v1Swk&v)|O)C65# z2c6!=zLUVY1SQXmRA>=G1Z4I>=~EV%v1+_ths^I{(8r$Y>vCASz36ru!5^iMz0zZ4 z=hCfc8m&k2I8ug($g=Wk!UHtAB7hXKwN4JgD@qoYyJ?&a;lX)3V?}s5zx_{C|G%E{ zx99)tsW1@6Is$$aqhEXT7-x+__)8P83|0tFc?k^oEhr>h+M4}X2)1KTG2Q0Q>JN{j z2ky~3?8iUdX>YIIP8|CsE=-aDF1}Y1ecptkbQ%5M3XRjBxbAbY#5McTk9TlZ!r-Sb zZn=Aj4+3qAvU{5tukhitUWJ-zJC5_RT=So1|L$)$-a6GrP3(hruj96DQxQk+ei$rOBJ3TA z62KJOxBrAIN3_7uo;7E*We>-Lz=30gHYh~^pKkZui-7jtF@)(bdl^OTXMgP(6 zyo6V^0|%R#-zn_zW#G5fzV_7{>_#l;d&PCyE3fUd6)TAs-#-V}@k8zK5j+DHp0+PM za=R_NB@4Q-7SEfjImZk``54-xtdcYALE2yE!j@Za&9;X>KNI7j6tPHb<=gf4lmC~! z_W-Z!xbA%yK@uzg2!H?!K!OB2*t^)pB2m3slGVFy#U)Pc+?$(r6FcQ5agrB1ZnEPd ztM}d|QjH=hl3?!zAV2^_@4dd?f6dtdL`im%_g=pDCEma}XYbiFYx>NZRqxN`EL0Bt zv>id$G`sWmIksVa7C3MlY4b1{zaL?rR9nAskrkI60Vh2H<9Lm&TrmM5g;IMJf$}2< z<>GL#Em}SfA!w|goo=vAZ)~+|t{7)`-M-LW(LsuZUWyO<+!}lE(H&@$HsY6kG3#9% zXYYM>{;CA~@|V_fZXaN;yjEaOJ-H9K2t*+`uyXBW&OY5}!qLrjPUlS-F%n_%ZUo+|Xy?(kZv8B@|A*SiygCH$_aZ=1 zXKQGurK{6uqXK*P^)psk(#2Wb!1-|vuwVujFm_{g>yTY@^;+mRXoXK50v-I^b?Th; ztKXyMq?D8P?ya%M9y<&Tr<}9ecwaNOZ9fHF9BZS*ktyxlZlBNi%0$Z>bM0iIbBHuS zr3ooZbHb5?cUDy3YH(LOLIo!fe#pnw?pRy13M+b8os_~`eqoz!`>2dLRAMWZ<#2Yy zxhb@V<0m?BUt8}Cs_g6(=oG2U3+=<2x0Dm@VcqngEb#W`v$zVVqJ2l>>zj3bGz=Ba z^=;7ig(<|t08WJVm5d9Up)g$Hp|`h@x0GZ=E3B&Qz={P{^tKgqCQrwt{yb<6BYaQL zrh>ex&lPPD+6y7E1*WXlvDimzS|e@_A9<({y2ud(;c;_t69NF4K>$GS1CFA**rkf- zLmtx9ed*akd+-;BEfW_MH{UVC79pe}`lWhM`6@GM&*$zaMgZU)XbXw<`CAv*)d&D& zj%UqOoM;o&?f>hS%F0DqH78|tr?d>Kq-a|goh@h2PlonAku?gp3&Rm8*D+Ml`A8U} zrn&_;A6k3Pf={&LRt`Y{gjZ5HqXkSuSQf4wU63828SO9=mMD-=$9t3+=!iq z9x4HVhSqLN8#9h|V;s!71jeBH40U!{UdD&Dxm6JwMY{xpe5!SD5%wO^4bb8`yzL1s2rC2^! z6iFbR5l2GDH;ExUMtD+yD|nPsad{#7wuBF4fk0!DN1wm4jw3+>T@mj=OlOUC)gkcU z0!*(EWm0riS@qL{p2fp=S~r2tw1$AL`5(?*aaIB?@#w)K>tyeoI3bM>7Df^JP+xjp z4om=J7iq)Qd*hE{8duUU$Bq}Umo(VK8Ch6k7|VJp{vT1uRCRV7I5eWSiTYLL6HOyx zY(o8pE{6gR?xG8D?;zI#)7YCQL7z^=#U|cXXnz3}&ubuS5Om6N=y;XlEvb$09Dz*7vLv-~Q)=q`dUmlm?D9YXo0jcH|HGvg7)l4if${fJrbuxV%Yk@yng zO$VVASrirzj%VKKY^DBp_u14*ZaI8hD~-yfNaUfpaTZ)<*SkLr0sybQeY{5vpx646 z06^qBqy>aeQU;!o%oN8Ph&Yn$P(ihs*FtoX892-VK=>NMCWLuOt&C(UB9oAk;D=k) zR6_-XUvY+j)C@s-K?A)W)07%?KJXbhDzwU@o(qBjq-Nwv%bz+CFAPo%SS<=_EZ5=& zzI@Jj-l`YrhoS8+>2#G%1G62cN1d3L(SWD#DT~TT&VFgYrLoCMXrUIZ8VNAC zMl}s0lj>@hA(&AaiZ)Fg*jIgRfIWmkrUR8Uj0KM$mymX15rtA`$j4t|;xHEgh+uVL zs`=!JE{OTZIZ)->=dN8~-+(zFrkxY!JV!DmV|9<I>AOIjs z0N(Gag$ns^xYXNX?l!j!;4oE(pW>IOcQZ_^)pqq&vpC3v$^UNvV#8-fho5e-sM_L1|ud&a6VH(Iwi!Ul}>V)!z1ytpwVd*!0G;Re?{iuCR z<4_BRZ-#`+7s+r5z%X9D&l#W%EIdt2WJw`ujtP_&2m*i^)r&mHN$)h*90B59*8pJo z0?vD{i<0mWd@a772smNWCoYSY$|eCApF50e2c<8S-Jha-Nlq~wKKTZME)jXHd871Q zTC`~o&nrwrt&5&U(0s1(tIbLR6u#jwM}#`dM`a?ufHZelCfMM*tqDR_a}4>{qUQ^g z%BF0+sVRrbOk)U^+Js_wedQWJ>x~OM(2rhclDa=r!h0o!)vkPeQB@lOSOPv;EPazy zJ80n0KO#CPy5^_G2Q~F{s#}=467yOcf> zb6|9@%B@P(BJo-PBeDz)={W5EOdOYnl=wIsGm7;QhN6(ko}Lujy{FoK_24@YV@_g@ zdo8{J7a_?@`*Of;Y8r@Cf4=?WcQ-=-n8{i>f&=3Fb}jzYXU@cL8-CU#`8#OPSj@;PN(u(?By4C;~zj}C+t-a`cyZ)XWYh@37@v+^uk9sd&HQg>p z+h^4Hp?)~cJ6vH;qd{L)UPIiKcHUYvVi1Z@PWtl>=f}|=H8S(C8v&c*6ScPa<-@jj z+X+h?k`6&K1z`p>N8;Nd!pw!(HX4G#0YAvfjf130GtjmjffbH12m$2Gg26R%B#c)y zb7`NvBV|@Ve^1U%L$hTGb7UmKU(YfR&e}J>aVMrAhaf!mhGnCzJA=c|{(Z-o*A2F6 z)%o;IHw2(pAbw7_>u*?NqsD4~XAm$RToRKub3}}BBH!Qnn5o?S_7U6p(MjTf)WVQU zNtHQN5Y2%wX>XW?dC>V-3;~%&0B$?JI{)(9Z&4PReXn60&9(dPTV(IQ(`di^#detY zEsUSxVNbADU^OF5a-LoHxmnEfMznZd#eDx#Oh<0B;fZ>;24Riyn32SMrz~(RVK2f}e%qPej=$k6!aGP#(yT&$^Rwn}1LmO{jAOG`_F_&E|SsYIVM5qNKI0nz&E*E#Kf&SNZ6?~mh} z0;1&l=vE)@#bm380n!dWRfRdnQug+`dNhQ=H-!gEuvr$)MvqSApgqi8=IG2KK}C%d z!PXf{6WoizmzH8*p2c<4cp*Si<-&8L!!a+2&mZXoLxs^gsQCIn5sXT?*oqs!~11Y9bY&YrQy5T*oNAwQK& z^CIM@^5{AkP_T>}7i0T~W-#=XM6duJ1cs*Sr{6p|Q zb}5e#&>xoH$6n|>992a1)W0Xu7oU(WmY>piv*|08--9SmU;8-}KO6J{?pLOe+`s#U zhI|4n1xNKGKLR6MyMG=bu?oqUWDM$ER94*!RwNjpINol$=>wuCzoK+1Z~r#bz2N9l z9FG?jJ^BrAV_-wMeXNr%%Br_r33K?dvIfvzJCE$~6-O|Yag@2|;eoyRcu-UZqLQ<| z!h20ku4d>Lb|5eq}!M8 zTWpIEDE;Zb9!0D8gk?`2%YM>}w9u2J5GY3 zn@9j)gxzv;4#L8zC<>gk%?MY=W4)}gp$`18-G1+Dm)V6_78}I*_bK}HxfhEdULzRI z{L0VAw0UByec_%!?1;q{HKc`KXqoBEx@$%>64XKQh3(BaQ7U$;<8M%SA!;_6cTsutH$j>F50B^ z;4gE)aj=Sa@{p}RKN)KeYi;7Bcsp>Y5z7O)_TJ`7#zG6$98wT0n1!pmG~93HVVU3v zYvK@FzkW8Bu##cYmq2GZgJyja;|xJfn4e-M4UJF2`d)?QW94+^%5gBDr-CoVllNIH z{_W#j*Ni2_Ikx=#F_xEi#@>Ddn7ps4oBz-*9tcCGkw&shhppaBg`jc37yKgAw} z6-F_+KqQ5$4aZgL$W+|bz*J<3cSV#Im`UB3YVPbnn;8aRbw#VYwpqA1&8AKteE zs&uq}B_!4Z?Ly42RQ8Dk=Wkp<5I2x#5Al%5Kw2;QsUKcJ{iQil|lZaVdxISax^PE zV@0ez6`H}#;+N(KPk!#v9gh+&pmSrmy;7?Dq#%;cDPquze(mQL(eE@27%$S= z*4R;d3bz&=N9N0gSji8z_7&0RHFgQ&1GS1`sFb1yk|VHDWCcb73`q&(h(Rt|m}ok! zz-r^{C6GExi3Y8j_3lse+y*vrA0E01 zofrCxJQSB`Y8@YEq$Ujds|V8O5VVB{)nL7=q6Al^wFsQyQ*A z))`0qA+0gWSnVnvtSlu-aZ>dWk2C>XUbwTA`I-^-*Vq&tLgQYR0E9z}cd7o01W#0S z2EW7AIY6$s#1yZ=3W1pN%1_L8xhNKF@ku1Wp+u}7YCN|{aG8(biT|SfWa(P8vJucBrNkvmVSxt?P~IyK!R!B#g0#DR zqC9dRq`50z@leh?>Z8aqjkhClLm4%{XbU2!jw+w#wC*JUqW05!@ti^*C_sW{;-xX> znCQb1q}F&5jaTcL+JO`ek#*D&Z^`R^(ljfh*IxkvVr?a7jaZhDj5HAy^s@VuJYKVQ@*xLhzN5Hy*#rOZVz5rBNkyuS?G! zSI;~|bx^R<(N2CTz4DP3uMjE4^|}$RG>WTB?ZBA#y6V}J6G!jk(Y_ZPnF8{%_)Fpv zrc3bEZb~HI!GgtDb@)`x+fnKD@uYkSj$o@T6&}?~?Qr;Tt82mT+_ei6v-9kK{J|O~ z7M;xC(4g{5FkWm-061WeJ+aSL zV8ZQ&yXV@#VOsoSWu)#x7Ff%}_~BWLfgnj3MGI`4IOl}8WQ`^xou>^^Qh`I6} zgTJpan+t@`af= zTFkXLYT(Lbh>#As0uWrK@qtB{78&)cK3c$(pEmgj3GzjcG|EqliQ;Q;sT^)j2E@lp zOt_Xg%|kVcr`L8$n`qP1;;wcO!$SyW0*iGb2LzQ@))1Q53|d)`x>Rlf^zs9b-%wT+ zER1W-3FV=UMw^iC)lEV)6kqM3HE4h^GTx~jl*SqTOh%Pab(K_Q=2eNKw3~%Jdo64KB*LXzrFIptK@PA*%VuK2eTAJm-f2Jn=}&Cd;t6)kUFRdApW+$>uRNV=r;eV*mB(zm z;>LL}idkDAIvzrx;^7~^ZOyeJAaz*I%;`QR@*lH?F_*<}mu z=G${XC^S!yM&)oU(?uen$~UD-EFY9dkJO=+|2EnHO|Cv@KaO1;mGwGSyd09K_%E&wjkk4)3o+^Lz!wk32hh zdcR%uxrKJ`y(?h`pTcDL2bh{n!o1*0%;TFq_w*qU?Mmj9kQ(`@9Asbn{TpoQc?lfu zyYcVU4P&_x-;~u@Cpck6_(o)?W3Fx(1g`nE;eyFNF2v;48s>*4-b;#C>%jJ{r|ePu z1Gb9J=6KA!U zrQ7t%5qtBw9cakRw>!Uno()N1y(6D!{o>Xu@4`izr%crH;%0mCpRU`$04Ya zX-!PD;xc^7)>YY}r88{liW&HtD}p##hG}j5baDu-t>kct2|TS^Y3V5lT+FihivnZy z4E5gf&H+1qumC@xnEl_djInhbO^ZEP*|-6GBMBz|t5|1Zd*WBHB;C7qfoHGq<}5Uk8&i z#lHO)57DNx@s-tr(2$509WV~6AXcS7L>R@oa2jGvscVd1b@f79zaa}@1@dOQil(Yp z`nO*`U+8kQ+91~LKa2ptVl?$r=qC+p4p*2Z-LVrwA!BvphJ}o$AON6u#iiZ${PS<4 zxi%gRqDdbU0MK4uk6+AfAC+KzX@}i?=cQP07|xswI9G4eGycjrSbp%~VKk2_5!$%a z1ps1OHv7m?+y2oZ_K~G-{xm^2n@XlV>9<#`1!9x<+`&z--e`_Xd#1Lb4fkJ|)5oNK zc{yf>u>dwAS&XaE^eg5oM-F#kN9~~>+eV|N_H6tsmT&Ze$9}i5m%Ts2TcZ9_S+r)V zJUWERq+Jz6?~;-V#!EB%e=}z=T+j@WPw-UAl*+h*NCI9Ww-gbaP(a~YtYJEA09R|T z7lg8Clqk@d=KKoJRNAm|hdQV%x;(BPcrScW<<%>NJ4k=>sQtde+Noive4}#3z<4|l z>ur~S@2Wh}6%NZ@*bx6y^9iw)>SF=`Bok9SY9K->PY>)Sk|ZMYo5% zqj471CHCy;`&EFH{mUBNJHX%YrMQ6eI;k?Dt^{}<8WUb(hZ4nA$#sRc2&E74LR^i_ z-mVbvb1qLo1f>b-=zA@Y{jMmP@E<|w?fHg4sGMI2sxVaL+9M@7 z5quQO09ZUqMHpbjh+(e9EohhYKimhe;pnt>u@ia6NYRSs5AV!--k^I0YNZTP3RKr~K8H#t+(XiqbtpUxgW=ug z`M&gG3Ctu37YuNX(^YGxV|`&5ZV^v$#yVz6D16B}N(JZA%E~62G&z<2$)+tc>4%|= z-zxj?{XA!ITyWte1mv+WF=V(ir(S(!KNcBU5CE8Gi&u_9DGT=kuVXO{TE(P^36y&p zf|r=AW~^L$&1Adz=9y^!!%UZ@)_&`hRxiye|Kow0^5Iwaw6SaOLvL+@nO<1Xji3RH zur{<~vGVl>?OReT^Tecr*)?`7)~3=ii#!yoaD&B^Xm@S!8m!K$@mM*54GoL)Xq=of zL!)Rx7@!67>^h%}8Z(6S2$rL)*MJa9YYW<-SfG&Q!!aoMX`!86(l(E$?Yd9^Yyl7M0sn*(T*#cp<4hz$mfSH0DuL6TX1pl`AifL07%SUoQ9`x zsfYUwf++Yu@T+km1*-bGHmo^RL+2}YoIfjT6l>-b6hE+}1HC%n3W3+s(9l8LO5zr< z*Vbd5BmrTe49m($w#0Y|aRhwE$*!?7{if1(qL^5ZwTxnfjq`EMSOE<*J|WRECuE_a z&AgEUq+l_qMe{D^+*AOwx}pYcXOv5lQ(@pDD3F+p7Ba3b|kvxwv#1iEotmnnD%3^ z(m-E|FGUH&|6sWQvf4R-hc#`(z|&-UTrO3#H;AWJSJwr-y9rmzSbL}_gV~89OMEwH z=HXZ&nZf!sg7>v{?C2SULZFc{E{5TPZg|2F@Kp&5ac)JMc?kRWaOS#%)|=5*7j7Xd z5?Y5+N2EEBK@&d6bT&rZ4@=#syyO+=W!nE@?|B!+>kn6eyzh9a@+hq$s;(-t(uA*2C-Ie{ZuR!iv*LNg zP+!3pOkG|sp4A?LqjqxGgsF_`6uncsME#+30>>-X27Z-B^;BHFQ=YN+`sKB^i^4(a zocEP;v3 z{ei`v&kc%I*`w;6*NdAdo|3695>z;K5{CYh2k~#e1*y+j_D6rXJ|LFVthc5l6byB6 zQBjARk9zL;y|!V)6a)ZPIkR5n4;cu$t|+(g^oehxX%lV6XURM7wj;s(BAZ;T-F4SW zOk80Bzy$yT^6-hYp9qNZ3@!@wvk0L-)H%hFlk`j;+B``P7H zy({sj{OYU6-37onOdEac&p!_%O-Le(bktd~b`qaFFRzIM=^;M5EN3A|`xlqn7>Mj* z1`3f7V&JotG``vSj8=V_=xjzo0#=*41PX+}1R)FeO~VQx!c;s9^>8-DRD9Y=8dnw% z8jzl@lN1#jfutziCq1jJa2d^cz=0%%jcO39iKG#gr~9C!lO5^dS&^l=?h6j#J#668 zmeWwn@$gVO1Q!iYbX+^^dGvIAWx72?&MIX6c6u z>gIl4wBk_)jT1Kk#KD&4BaWoJ0+OJNC7mYi#$oI(2}qa?cXKLn*1`(d1R-0SiWu+G zVjIjsMS1xc;oH{(A|^V_L*_+JUktUrDf+;mhqzK?&ADYAgW(k?B*$*bMmzh8fqxA!q=IkTe9`)Xz|j zBl)dSFM&94(2_-t?jB5*zj)ZTZhg}E6?PTJ`+92l$c?UpOIA+5L! zxf)Y(qbRH9k=hQX5t8Buu>_ERy2KAe)2C;liJAfN1}y~2`JZyBI9!@mx>bA1eBGwa z<@U2*e1vdAKE;i<(ODzxl4};)I@}!W*wSME@-IKNIg7LH*1OiaIjG&3Sby!geMrOB zBb`6fF1vn#C7?ynSlebVK9y^mUpYuSk8%NktgLZ9?yE41EHkPD8EZ~JX3%28hPm2l z-}uH2n0}L1zO33vGyf3GHT+P`%Z5>x?dypeNoJN`!sWul2ph4$2QPub14uCtqNT#CzqgZMh!?VA4AU%wXSK7taPkNTVuA*rpskv?v>FMsVi z_K6gixa>iIL8h~|Y^ky*9^Zr2fD#wPS#sWZyY-Iq5K3T7Gaw`k7m!!oGuBxnH2(JH z7T9Bt?6iW@t+rvqN|^5{_QRjNXjQCVfBLQ4Ab<_E2OoG7UtRh5Xw0!o5mp#KEeVD) z2h>xQw&_(&ljjxN?|kiMo3k>(+6G9NMQa%A3IAF*wZ_QeKpbPg4#L?sv|3*H)h5eK z&9cicS!aij9kHs0dK;dU2mz#weP_5`eAPnBSv1n{OyJf_8tc04Y<`t(-Mk;I49s40 zFcsr#=IqI~06%^cr;cz9gH5j-u!Fk`aKn);fo05M9)jV2r6ngxd*cB?B+4w-$f%N({8_WDW>0R?I%Bx zHcvCn9OqUZzV%n1gZR^IfAU8Uu^-KVQP|>=w=>WhC@n95fheNMVx+TE?VZiL@N;+= z!ezSs!5>^^tItoTuh~oKv)^8QEughj!fdl?P=3ghf2Dzq1bTvR=$%UBw!3SII_FFGPD-Dx( zj4kg24LkwiQ-tQ-JMZpy&5E0Dx&ohIz@Pitp(~6 zE|&EOROlxK2GHEZA}K5ijDmXO_{$KJ!sxZmNs@GLV(qO!lcpSv9!bnsR@Sq23nw67 zaJOU_XrpmKAb}oPI}=)SEiILgL5g3Fd&sB2r9(VlicHZjrvCzMb95I!2|PQW4)6;WVR*U(2% zne@!%WmE*!E0iS^GgfaN9KPay$`#)AwS(#lNP+WTwMl3LudIXajQ~8Q*GKU^tzrm3 z?26v$F@j6X=xyv*KOwAtd3y8ZZ3vI$5rgk}3NZ~W(Fa4%u{x+=eWeL-qB8ZuSNTb; zGN_FmuI>p}TD5DBCS&iV&;Zqm-@1==6g|i*r44Gu*6}*+^6&e+&85le3}TO-Q6^T>-rj|0{+@7lr5HNznBW||1Pv$ z2#LYu!Jm0l*>x5cv#OA@P;oJ5Cxn;cu|y=Ml7s-pj7ow*g>WZ)X{q6th{x-d(fFgy-?Wd_>w)6q8HYp+qZ;^LvM36%ijZ^6Q8 z9Qs?pZ3`W*mg~(iqX)s*-)Prfonqh}*p5KRnG71A{+U+c^q?#H# zZP9{Ju63W2Ga80`F=qbvK!=KlxmwTpz0hWw-;>YZ@*gW@3?SyOmWH+lGxR5dcWH z9ovq>6ly|Uqvtk3Vq=*M3zfl|Vy+7dvhG7%TxSwvp-axJt~m9UmOS z4WMXGxQ{>se$kRFe7sKpUru&9$<{3=vEG-5aCDYkiGtIFY|3I-0N7KAn}NMBF}rNt z#`#!<7=~c=QQP)z34X*=5Zst(+1aV~;fDvn!v@>$eto%JuwevvA!}Ce8WrY}>f~#` z<`y_x0~YzD5F~nBV`D40d=s>W7K9195F+n!frbj)PSn@dvp%-7hKs%h4ARF9fPOK! z9cC*wC7>n9J!Kr0B1S@c8kdw>V>Q5&|p|PANXqLRbxDXrbSe(exh8_-aF7 z{w!lX8GJdOxnJq@&RMe%KuxExtlP~nNB1Fca%g`AbhR$lbzIM(*fL}on(4G_-f@|+ z?t&hHrK&Lqfeb=p9Nbo}Fq0BeS^wJ*WI?z9#dd(TBVpSk=D5Ae}@lNxaCfXjTl^7^s(v6m2nIy~0ty+6Xb z`i1lKAHAfhTY;j($&>Wg=~C9rPMb723k#qVnA0e;C>z#M;U7X5>p8dN3afgst?yi^>|tZh%|Ox%SlQ8aMmj3?o(=*_oV$MnOA} zkd`Jd#ekmI!5&eAvRx@O9DH^UXHOqHl6VLou&!uUxF)NpsKRqdB>YzA4c`w~A5!6HuF7q%7 zCg!x(J;xDaxSyk%%8I;&tLt*XY+(BnU#hR4VR%!<=FRi!SBl*@gFcDXq8Mu%^c?^LgnJX7VU4j^h z>i9aOBVz*AL6T9Hl0_cD)0$Qb&cO1{-o)I5&RSQG<~uI(>cL5?a50dKK$wIqw1^_>LgYHB;#lS}N-zCvrkD`w`{4AQ6DNGuBs zgzm~p5aZ2|kk00tE~IDGu3mNF(6pkPK5K@adlD8JS{IOx2C#E=+ALB32PUVvPUDVCpQ2MxLO%yb7o0# z0Kt6EG<@k^#Z+(hjs=xPfw3y+He7n)|2(Sy_&&G09a4a)zH{J8tcy_?%%Y6o$7yJ05&SDqZY_gwVnj%OLg?6-jTs z&-hhe>FHzH(m!6`Xe{_k#p=zX_dfP2KnZ~TUSE2QK2f0J_ZCm@V*sM0AA8>~Q04r1 zI=$>Ix!;G7kZ1qy6->R0KCvuAojqm0FCsY{eR*LFLEaB=iS?x*0KnkYxn>-+P?>UAE<=~mH4#R6NqEVQ5pM)FoQJOHB)NL`Co~^>^{@(No^ceou%W+P; z0Eklr99ZTk~ zR7Zt7>`=atB;+kV=6((i4?nyY0`rG<@g;LGZGRC56xGqEheIW{fM_q|z|dw7KXSlc zcww(ya>-0IfLDSHX)#sQ{srnQzXSP{FD+=S+xVw$b_)O>htNl# zlJuOQ{`q>#vRKBs*20@_6xesa`#uOvDw>Z=IsD-QfCEck>7ulKA?E=1O}(zZ2TKK~ zu>kP8BN2c0XZP6Zl`!}yqc5bf`a2<&b}GQ6-6M}3wTCfZyH47qn0-Hz!(D6${|SRVdUSk8*#^hlISIY+Ewl_ z)aGgjN$_e-(4oJJhErb7xaYkPBq4t)uxss;UcwXItVv`a+JkgLFtym_L0i-)br=UAun%+!-7wF|#c* zK19>i&B0GZ{Gu~umUrSLuFzX-4(EEty%nhDF z;}51?4w?sp20``X@Fzb?2M?ctXG2XSo#&O{_Lr&5M^h!;U@Pp$I*<)zI}W*-FMu*9zsNlZQpXj-hBQ5zThzfxqJ!&0Q22sTnQFF ze)_{#to#gGB?FT*#A%nS1?}f95H-yet?4~zL1R?QMkI9Epa1!-XnAX#1+#V! zJn*`0L&J9M+C})-UWFEnB)tPdnt!Uz{_byHK?9v}%{=G^N!HxbL}TT+G!tsbQDvALv6*1#Rz(pVR@n)Vhdv|GYMkRG0Y(zvu}L!cH3|vZfY>& z=K?_xF}8eAhPE-j?2nWpSv$fuUW|$N8)rc@V9qiq24a4xxf!GtL6#Ais+Z7!1OUn~ zC-};X2Ve;2fh0_W={43~eEoGBhX2Gn?z$X}fgUV1yaf@U0iT&GZPohejL8PuvAw{K zfuPspY9|Zg$bDbC#NufB_8!z5n0)ap@LEILSwkgo6OYtzBW@qIzFTDPy}sR=IV9Y0 z^;MK5!5)3`IU9!`#1*R-Krqa=eYwZb!pOF(Z(Cx?XfepB6wQw813uUD+pP?frh7g* zZif$?;=oaBSqRvyxnK@vN+)1av%@yMcF^{Hbb>K46rw{5d)cKBOOjxgz6Nos&c6JW zRcOLz+t2=WFWNr4ZP~Ip5OkK>cmMe%ms-B>tGu6p)Gq5tkWg3m@ux*4_K`3}9KtK7 zjPuwPG6n5s09v5HKd7^?w5Q4@+oH(Bi#sUzG{=Q({1JQnT)Muhy-E3Rm1iQ z0BqT2x88gqW>gc|J2lRDsgE+}I)f?t&F>%p#hkh6rYn&sXI~Zy!28!<--Q6eG1jhC znBblGTLA!Xu~@@-BPu|@m<{zeAlI>q~Ve$gSBupL`8%; zT`HWkO3wc5eZy@pXn#Rx>Am{QFFiz8EHDb{jS~Y&xCA4m@h@VU7-q%A6>fr7Yqf*| z<;!ov#7Sf zIuX!x&QLnxoYDEraW19dUzhKv{0dJK4yZJ`fbPHHS$TzL{Y3YkR)tY~r56A$l|i_w zmr>;;%;9)ikD`pDB6xt(J6sh_@BE{75Z)Z%emsTpR5`vBra$$4DNY1ap`P}f zFonmkN#Cks1t&B>Qfi-G>)m zZatHc@b54N!dUe3=~e8#|L_#b^zr)ZU37&yc`n|TN+0G!h!M421V^DBJE|;Yi{dND zi^`Yas11}pO6z4*gzz%7r{ea)3VG7Q4oK%wMGcoH@>_b`fBmh`Wx)&|#qxF{ZwC_+ z^R03yPFTxCjBG+HxwaNT04!0}V}7(5H+MRlCSj6!%oqr#BN8nIivV)jDD%(3)Muz8 zkj}ZHlAimfuiRcBZ#~N5sn3lYn#Nxd0Td9t1OZO81dFkxcDA$(P3k7flL&(~!^UGR zD;;5g;hdqhuf?YBIpzB8zCWD zH%;cu(`o-RfTMt7h_F}u_!bCK^2iVikRUrWIk+rdA zE;?@(`0jAd4kvlnXm{S01AN>e!Pu)qF!#IP-%pwHIk(g^dK)~TN76QhhIIsY`5#}os zPGjZO*X!+vKmG_o2CN~#_`UP?rFQid;}Lov46bU7pHh49k%KU3$1?^}IgjpwXW>rIxlz+psjqa6zmjWDbmV9p*s+5pqP2K=(wam}O0&cGC7oyO`$7jy(f$r(q(uv{R9DRd-+ zp@v|sAUQc1K^tkeqe+c<{1hy-2|cJs@FX5u(8NgyeRIA%dbG=)f9?P#?NhK4H`fv@&>rI%r=`&L2HK=4^k-5hn%=`~%Czy8 zcdW@CeP}zv=_hQ(O039!ewt0qVP5WQvX`({QH4+VWveFG1s6(_Jq|dnwv9F(JW%dA z5-}y-jDW^*SdYn;4P$Z?LO>*wuQJyDJYRi&`|Y6Imx3*(Z8zL@Im5pcbcVG_t>l z>Dq%3y#(<)JFv>f`WDaHF?Q5Qe5Xq>qywvpT?m7i3nDCEIo@ebBXNf^6neYrB)mEv z26yS%9((A4kL>h`cDwqz1$M=?quHxuH8Jd)balWH{5LRVH4=1%@4jCT{54;KC1$pm z|CJSWcI;RoiaX_$B@w~@$xf4TWjyK=!=%_#yJ5PvBaBgou+kadPvwSV<_rV{P)3V` z=IFFt`c$Zj%H(K+pMj#n#Nbf?f5&e-8W+{IEv!AImWM!e+~8p_{wHACUBWp!bFgQi zbfPnh&MOj{K7Q(q)uZ$_B0bHDh+$MVoQg`~hy&fba+M5_U{ zay*{$C?lO^{GDgwxQ+Tk=N&)5b1!^H{VKr|tszv)$_uNl3;~SMX#LNeJ{q?>C~lEG zZv{1EtY3ff7ycB!R4V1qFOgL~&q2Z5S3$$xwwpBqVV=o3tmWf?4L!46iv;+l#9Rhb zISGtP>puw#0icaO=9*b&8{us<32ueZ}DG1e%94X!n`!OYyB_ZLp14OUo%v+6R(<8XBIkNYxHM5RpO-N<` z9cKw6he2b+?MRF_5S<@m1Bq%=SAA4hufA7WIndCYZ}o~gioc*VF7&~;k}_bVD5$ui zS*ja#K7?~ZACi#&4(4bBuC1!E5LgG@pa&(LaR{4DpPYe`-WckGvdHd3taZ)I#fhxF zSl(q_(WO3CF`}!->BEHeUa|L45U^B6{b{UeLOAZvy+3<80Ss|G2USp)g2RyWTQ59e z5onL#4~nQO`c+``QSiqSDPkyte)-c57B0mjL}2(0b>-d1z=l0P1cvz$Vk({@s-95- z6+VI;)~O63B+%`>5J2sslo(9lV88;xbPd@tFpat6+4!vhxe9HnM5BemLd}tB~jV>>K5wiWr!wR zRG^ToH*OUC$zK*2V4|dlCTxQ}03%@Ef!%iHm2>Tn|M+4UG}^R6yY^2jW>QH>2QC0O zXkY+Thpc zSeQFu!YJD#(YO}}ip6M`vyAx6X(42Phit9F7T z<~T?c3~l)(2`2A@mV99Rdu>C#HIMnz#-|O>wdz6kaAx$}85SnYi7F_vz5e!LC>Z9g$0R`Gi z!%r3qbQ6#}9fUM52%;DgPUxW^j!+R-?Wp=|WA9NLaWAt)Y8$2VcxoT&OHAQAF!rS# z9)u|5e@I%so%ERsGKgojzYugM+7iDKX5XQGN6|pXBs*Hj6UV37WEci%X_yGs0pFp? zcP~EMN~-L1e!ewe!fz&rq&YLkL695Fp_clBQmS52Sv0tOogu7;b#UOoVHAOS_h2Ca z6IuZQ7|6jAlV3#*wsZFxJ9?s;L-1UD{7rzF3PYW4P@kw?8pdKQ96M2jkkN4tO068+ zM{)Sif;|J8C9WTC;n&b5_4*o<|Qm(db0ZMB&&+%Nn5 zJnE2Uxm#-O;a|Rtum+~?QpR8+9zu;Is+bS1fv(9){yH=aL+GI!?T@&gdd#ukj^;RH zg2LCcru^zxZ`=Ft9s|i9gIUUj9EPW`o@(AeTy5yGzyCj5@HL2kdD=|^Hx>9elg8ET z`I&YxE?ZhSkUshNCJvBo_RVizf)K%MZ%!c;8h<45>%%QrFM(Oy-8K|0@H=e#o)Y`V ze|`{i@#o`@aS58_Ww>?NO1}&wuZb|{OAsnZv@d`4d>FaS_MLzD(Dv@m$4vcwwtOWf z=Q-qQjg<-bkG9p=vrq5EoMjQj-r)!cOtTwro$p#IY6NKxY}o zzJFi2J@xoOh*oIfBf(t+QD^C@grSKPGN=3~OKU6WcxMF3z3eJiuE`6n9et(SJ$ z(S00#(VUTgs3|$w5Ey1#G6#)c{rCfK{blS^xpwUMKD*}&7ueeMlhLRc46z2&UQM0&{l?F3%mka3Bdu2* z9RuyMj++pN0Lfgt`<_KkC@d*%wR`S*3Ks$4AUtmTVEdClU1b|K zOt5!072A(~fCf=+F?r+va>Hc%^S{JxL`AoKJut>4k?zwk9nqDI?y{N;lH~GJL9f-yLFZZK0RO>+Q zo?3*Kw%DZ?En@8)!*~mOU?l=4+qa)USfj))+PD;raa;g|R|tM|x&XkGN$FT#fZ&KP zM4xl44q7+sAOh~#Rcu>6{K)RU<1+f=lL7$B|Loa1T&5g!Uwb#+c)1Gzu(kX8zGcf{ zTmT$|NVyF2vHzVc0H_6ZF;Jshf7C-1pq-E>=Bn0V?fp(T!*pQ*8Wtx`K%}THhiE<2 z#%GR(=`X@|dcb>?6wtzo!d!^uBhZ=~`h40Iz3(l1mNE`?^fQx}5uB#qqz&N|)5BPU$xCS^ zK%gKej%k17BU~#modf<6-U|oOx+_dF!10okt)GL0hsLVrI1Aws16A-ufRj+FF2~n^ zBD$U41p*m+1mzKo&>pdP1PC?LyKWJM*h4)Y>FEiF=U*fWbyGP7L4d-&hpT*q`a5nE z=Fwv9CKw8fAbK4X*n0uf`znT$E3OLW=|ejyO(;VIU*%BQ`|7RuQ9R}5^;bIn)Lx-n zeQ|o@s=WT^AbY=}{GtHG*A>Bu!lN+#3ioxm-0Pem+$gjSr2`3y{K7^sLKz%_zWfUL zMy;i$2{83Cl!3E?kBQJWA=M|pLuvcMH4dq2tR2-Vf~WU<^{bmADXuP+KjayUqV)bI zeCsxr)Zs?;3gLZi5!&B#a(EF8l}Gt`x>(!!888G3jK5P6m65j%@#Xp`w3EUqry{Ck z{D-mY74y8JHjeU8o?hlywIeu`)?Y+pO3xvl3aLxK`fyHQpOP8zN`x|taS>33fKvk+ zx$?7`mW=zKjC2G^(V#}-OUyHA@<|X`BQ2V{4oYC7D-=0AF&ASu(c5498^!iWp&Fct z#E`B9uPOzvDTNW%>`cE&Qzn?Sr&2H*J`{~kF(q{gNB92VK7=S#!1|v0y$J6V#jk#G zqM-jyzp*y2tZuVs@i+gVTU9_PD%L2QZaC%6{id>(J61!uhL) za|DcP1hU&P>pv8x`}Ao;?T(vfBY2SsLq+>$7{59f>U{q6Gq_E7Xb<$i3UJGjSpCXD zv1f|U%k3YPamH`AchPQNw`Qzef9*`pFu`p7!;kC%_iN_dF~mkBb|Kh11w3*tg8n$V zgHH4Oi>FcQc>{|<)9sd<=W{OX;mm{3z*}cvDvrk_|3U-+MmnuVee((e0N?xJHam9s zsGGdM{kFvjEsWv}6Ng)*c6;Z&0{hj2hrm}x!=O$8hsr}Zxq((2c_T5FBsYhJ@&qpeEpfd@};_Ug2R5h*ZF&R{iRp#A>W z)-(1JoTgG-+-;9Me$-xi^$0F0q-+5rxTzi{G0FqCF0h5mQtibjPTDJ2Ovpsg_Tr68 zye)?zaG-7DU|b_Esl+@= z8zlh`7_*g~wsUI@uIGvwi)I@ynM)gYA;|tZw7ojJ`r0*?IVQv2e@FB90DUpiuDW)q z&EQN&_6RyO*)M*w0|9^+ZKE2vhwbF?BK*#ep2hB1C8+2l!MownZ#NaGEqva`7PJanW8L4~te{fUGAIM%YprLitC zE}<(jg81-9d@&kTx`2b|a2j3Vz4lTuo;x@roUQ1vL&tF4gUR;cNht`HWFaiUSe3$% zfH9f0hgX!hT0So63X7_&u?;#XxW$CYgRgUHJ9k4sbfs_{Pw_)CNI=5WansS*ZYK_%vTpb?Ghup9&Q5XVLbabN zp&ydOE{!42u{TU1iWgcY2AmL8nTAF19Tz_c`BXO!vgvasT1NH=1U=-In=wNfhd`T7 zpuc53N|r7~`vaWreQJI;^V9KnQO<$x!d1LS8rV{`?c_R8!S$`}S3U1Dru1V*svy zP^y_Q0;`}XBhoJedc@OEUo)GW&IlZadK}@R)%zJmZ9&Dojrj^fLb3d4v4P5u-yWTb zC}V^V!!mK&rS^FBC<6w;qfRSBA*;Nw1R8F$jlm+v^VZ8tZmxhOTO>CU_gLg_STs_#=v0iSa>%AO+p45@i)tAQ4M0&-?qxQy+ zr3jNG7C{j;PxaV4QV3FgxiqHrE`p)xF~BOaKG7?MJD3n7mP{cE@Py%>H~ypn+#4Q? z7a}VGAI}*0#3!Ee>FrB@OMqt{(gvv1fwH0z3yE0Eb*Xvsf%ot(bk~iOQlFo=knAcp+}Agt2*jag(>`(UOtTwKra5R66{a^^kTHjn7FY4tR-1jteAfPX};Syu)EYj7_JfDXJfSopf z4flzncl;%``;EUUI`WnfDQ4N=fUhmf+Ou!4J5@;-#Wsi zdh;hUl7qCl6Gxi!(&81NK#b3BOhJj6=YQ1K|0qMWKsm}mxZqH2823mJ@=3raSaOmO zZ3H6ltyfdmi9iGgB9(zMt4vW{<6zcOAjj1J<7HI&^}A3S2EMFp4%O2Y)>Wc&@L z!f2zaAfG;v1X=}CO}t|W03lajX}tO?m0e?w159Vv5PYN~F%3hww7kr+VKS{2yI}iZ4|HnVGnV93h`F0Mp z5G>z)>j2E&BUVP*iPJ|CcOLE+#@Zu4-Osz7Fm7e*4 zYnM7A7ncq9fB$VvB6cAFaJy~IJ!^me55Iz-mfL8~I3HS}Ig`(e@!LY9W4%o1*XyAT0_gIJs>r!7+PZ#kQT_B3ZQ$pma+ zVW<7|U;oVAu-tz8`5@(K6iNO#k#;ZXw5OgpY;V4?2jW*cbFC~7%jTf^XWzOWpLMkm+FrFdG$1~I?<&igH^z>jY5mfZJFTU?);@RJayxJB zWVCOzHikK=Lx&D+!&y_x3OcX|&}N7B)53gcnp%b&2cXG%bZa=>NUu@ZmDF_Ly!_?$( zd+@;*(elr;^H;4zP-BI=RM6qw-6b~*}eBX4YFocP%XV$2?S9DkM>r-ejl6DMX21W<89v|c`_gL& z6;>iBRBu;Zz0$t;rI|4PTCg&dYcIcglr>(?)Y>4lV;XV73VrhI3PD40$~A`jpoqr z={^UvmgerRu@|0y%Vy6S&%4=f0U&Bu?U^FH@7hyl@4x>c763M)rIPG|a=q=YImD;< zY>mD59s&TRwFnno4kJf|kkHJ>kC$WFVHd)cb8YUN@n}^t|JXmY2mIH*)HqzeF^1dl zO}O??U4FO^w<5H=#y>u(^YThuh)dRDrb0-ZJSh_swgX-0MzOVLhc*mpdpAXa)#tP3 zMJ!uS<;@==YYeG7w0A3{m3>7fC5z8i*y(~&m?PDUBi3?=Ga^1t%z}`Xj44e_y~?+* z2uy*guJpo00Os&{7H~e^-~IYr=4TZaKBR&WraA?tk8mHQ6G6mF%X$-FDmE{9Ec$S>Aj%3pc2cZK)d3%tV$?Hk?e*Y7>Wr)1DCNO?H1OXcN?V0d_} z{q-i~-PdNJ{87H1^kZo$f}n*L{@wq+FStJ(9}mij43*y}8c84=a38GRK8c0<8&6MM z0QG+_xGq#eT+IhvQU0oTxMFqmvCY^ef?HUNl}Ygxrszr$rHaZMwY?%J9??JL3S+=u z5L^;zd1(5swz26G>;P81jvm3{n?|G zCxbIUz6~GT3=@2oUASSqk84OQFwZ;e@4mCy&q+hkt}ZPr0DgvDb^Tm4AQNCR6x*{1 z05nvYoAbZqqD;<1XY6spib`rpr#akisiP2_LAhfHX2^4Lrok9bfKmJb{-BPuVtYDz^uIm20J(C&xk$$eEFB8`qDs#q-h;$kzFs$;rR`2zPLvdGaYt>mvYg z>{tu#53&#dm~QKE^(BpD(a-iBYDKW(Ra-QFgx!R-g)GjQrRClB%aoQUfc9e33S6rxE5RhUYg84 z9`FEJRrvmowqtc6pYzaKga&e89>>E3!qQbm3oZao*)Ja0kJW+^Fwc{5KT_@f$z}1d zvqNU+lQ6qK(=fJ%AjB~{4bweo_)sjcWkJ(i!MuiH$~vP-t#KKxH@o-L*+Y-y+Xq__ zn!wstYg@gYzcL8{fDH%$kUwqO$~pX%*NW`nM-i0RU&lFW2#nA+nB|>z9>N}1UB3#= z)j{^c)4Ofou6?u>E*I9##DsmKGvD?fD8nf6fc3^(hwZIR zyU=DIW6M`90BvkSC}f}2RP-RcumGW?;nZg*%-%Bl-LGAXb-huvvHDR;9z8H)JM94Q z_v}4oC-TnP@e>kmLioXwSjW;GH=j3uIu@m1sF7znRtZLp!M`|+eywrU%+K6iMR-GO z#ccmeX z%j?SXKOlh+LP7`-Ac_jT_iAiYjEymFxW_e)?bO-H?vzX>li8X1?apg2QAk`QXBx8M77?)MSGi6@!gZ~xd$9{B3}e4ppubI(1upNil# z|L7^&{5a#N%f@DBa@NnFZ57@ttbt(UOI|x^OHp3lmwSYHteVg$sWu&#|D#YY@7qUs zGvVoqZ5Fi0j1&NT;EA8j+UdA35XH@eQ;QJ417Uu-?MHZ9S*=hF!z~AXeHx)0WbgnK z-{eR*U07UY$MFJjs{EYAC13zGezc7kGZ+hRl#68uM_M1>WYHSqJZn7_Ta3kAyc6+! z^-upb7b=5<5!Yh9-ypbuuObc<}qdi=pPsG>dfDz_1+D+#;6+ljh@B3}l z8JNOLyk_x*`_L9L+LL0MnoHp<>fs|cbM99dU-$9rXCUQM3i3*mU*`+)>4lSuirxt( zJh$F5oa5ZpDzCQ^lzSaRx=!#@enI2QKdwm7)yKWZo@Bl3*DH~54#Q|;g}sQ;D-`c% z2NkLQDIn@i?hTZC@!bQSseI~HTZ_S&&Z}*zr*Kw>K(62hlZ8`hxeN4#toACtivbu2*AO9w6%p(Nd20s&nP#golW;$tciGpOS&njlBPccGMcR zH}@3t|1muFjfNjH62r89UOpv;i}s0ilkVSs;~mJW0mc`1FqP$uqro_o6=3IMSX0B5T@)W-u61w>G|ya4{t z@4d5YU}@7AJy$w0RWwlvIWc^6C=;_^-x?swtBs@&xQo&%4^JIffQiAcFPO@!va}dz z;S+OTn?1!9)8wu4lt$V(!a;6lButT3QUotzsH%KveCb=4EOB)&n7Z`Wrv=p|_7Ou$ z@Y>K44!Ec;p4`jO9Ir!53zJ|1R>acY^>P6w7=bAiU^}j)*L&qt`4R5TY~qEBCLX@oI@ug|q5i-$m;7=GPIDr5JLU&CANRL-Gi{f0yK_~RQm;LWwa`@7ZN zPHGF!3W%T)D6KWc&TX~lUO2*mbgwPGVwT-<{}ijiEpnee#A2s|$>opwgu5An5Z*6X zFnx0ZEUhaNhU-N;3zPpM}RGtRf;*JtAmZ61kQn(Nl`Ss@an_j+m}u+SJJ-u0DxQ~ zIg^X}Xmce60pad6;hC7OTFeE@h3UZ2Z!P#5fBLx9H1Auruxi`@H;&DKRxdG*Ro5sV3U=uwJsEU}M1s**6xzuS57zi$!`n@H9kK zH^;#>`h+vT`QMk!+Gw;e2`G-ZIBo9!pR&a0@-d=$NE>B-v_sogglwu?Wce5B30e$3 z@r}HF0S@?XI&=YFWYES=${2d-FjP;`fPbQ^To1)le@gWH=ZHIa{4f^&XzdQ+Kr|U` zz|1j2U1L*p5N)*KZfr!e_CTH$6_nrsAkpT{9BVnaHNs0L^8u5NI)Ww$E>{5X8`@t$ z{G+chzv_1@mdnB6*vS%0A2Hl!&zXwF!4Q}q;eaZ#3Q_g3R%la#RrH=c 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

    =yD^r&9sSdU%fcqUv;^h;j=WI6 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

    y1RPvKn7XL{L^yN?4t=M*yxxL~b`=Dw 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

    H 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 z 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 z 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 -V%>J$wKk7 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�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 LStfXV&VVErxtJ&z>fI%Cyp2Z2;`|J7vL%6 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

    $S@LPh%Y@=U>@<)= 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�NigQ5paojVpG3ysRH^L&5yDuRO=O&T}by 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

      9Ywi2{LU(Dk4$4tUTEe!zSz|x_ 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ÐWk{x{O20W%$kd!8b+NQ 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

      +x|JfL= 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%0D-VX>v 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


      B7xWJsDvCsq_qMNpL?k!TNg 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

      paGBHq4c0|l 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 z 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

      S&6;ET_EzN6y(LaZgYp%ld{<$Mn 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�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�sYh6+&@_%YMJ|6;uI;zAZi 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
      - {description} {pros && ( diff --git a/src/pages/stablecoins.tsx b/src/pages/stablecoins.tsx index 0ee2ae11126..3aac37309c0 100644 --- a/src/pages/stablecoins.tsx +++ b/src/pages/stablecoins.tsx @@ -600,6 +600,9 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { + + {t("page-stablecoins-algorithmic-disclaimer")} + {t("page-stablecoins-top-coins-intro")}{" "} {t("page-stablecoins-top-coins-intro-code")} @@ -713,16 +716,16 @@ const StablecoinsPage = ({ markets, marketsHasError }) => { /> ))} - -

      - {t("page-stablecoins-research-warning-title")} -

      - {t("page-stablecoins-research-warning")} -

      {t("page-stablecoins-types-of-stablecoin")}

      + +

      + {t("page-stablecoins-research-warning-title")} +

      + {t("page-stablecoins-algorithmic-disclaimer")} +
      From 4bdedb9412ae6cf26c3531aa4c21efe34f577395 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 21 Feb 2024 16:51:09 -0700 Subject: [PATCH 407/478] cleanup --- src/components/StablecoinBoxGrid.tsx | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/components/StablecoinBoxGrid.tsx b/src/components/StablecoinBoxGrid.tsx index b740677a307..356d2badf00 100644 --- a/src/components/StablecoinBoxGrid.tsx +++ b/src/components/StablecoinBoxGrid.tsx @@ -1,9 +1,7 @@ import { useState } from "react" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" -import { FaExclamation } from "react-icons/fa6" -import { HiOutlineSpeakerphone } from "react-icons/hi"; -import { Box, Flex, HStack,Icon,Text,useColorModeValue } from "@chakra-ui/react" +import { Box, Flex, useColorModeValue } from "@chakra-ui/react" import { ChildOnlyProp } from "@/lib/types" @@ -41,7 +39,6 @@ interface ILink { type GridItemProps = { description: string - disclaimer: string columnNumber: number rowNumber: number emoji: string @@ -68,23 +65,6 @@ const OpenTitle = ({ title }: { title: string }) => { ) } -const Disclaimer = ({ disclaimer }: { disclaimer: string }) => { - - return ( - - - - {/* */} - - {disclaimer} - - - - - ) - -} - const Title = ({ title }: { title: string }) => { return ( @@ -320,7 +299,6 @@ const StablecoinBoxGrid = ({ items }: StablecoinBoxGridProps) => { title={item.title} emoji={item.emoji} description={item.description} - disclaimer={item.disclaimer || ''} pros={item.pros} cons={item.cons} links={item.links} From 9b062bc13d3241b2969363cada4d1c8ff49e336d Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 21 Feb 2024 16:51:50 -0700 Subject: [PATCH 408/478] remove extra space --- src/components/StablecoinBoxGrid.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/StablecoinBoxGrid.tsx b/src/components/StablecoinBoxGrid.tsx index 356d2badf00..463e2b09610 100644 --- a/src/components/StablecoinBoxGrid.tsx +++ b/src/components/StablecoinBoxGrid.tsx @@ -196,7 +196,7 @@ const GridItem = ({
      {isOpen && (
      - + {description} {pros && ( From 2bdc88663c443733d57a2c94c47af15f7ac92981 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Wed, 21 Feb 2024 18:08:14 -0800 Subject: [PATCH 409/478] i18n: import latest common.json from Crowdin Locales: am, ca, fi, fil, gl, he, hi, hr, ka, km, kn, ko, ml, ml, mr, ms, nb, nl, pcm, pt, pt-br, ro, ru, se, sk, sl, sr, sw, ta, th, tr, uk, ur, vi --- src/intl/am/common.json | 145 ++++++++++++++++++++--- src/intl/bn/common.json | 2 +- src/intl/ca/common.json | 144 +++++++++++++++++++++-- src/intl/fi/common.json | 229 ++++++++++++++++++++++++++++++++++--- src/intl/fil/common.json | 153 ++++++++++++++++++++++--- src/intl/gl/common.json | 215 ++++++++++++++++++++++++++++++++-- src/intl/he/common.json | 197 ++++++++++++++++++++++++++----- src/intl/hi/common.json | 154 ++++++++++++++++++++++--- src/intl/hr/common.json | 123 ++++++++++++++++++-- src/intl/ja/common.json | 12 +- src/intl/ka/common.json | 143 ++++++++++++++++++++--- src/intl/km/common.json | 131 +++++++++++++++++++-- src/intl/kn/common.json | 143 ++++++++++++++++++++--- src/intl/ko/common.json | 163 +++++++++++++++++++++++--- src/intl/ml/common.json | 216 +++++++++++++++++++++++++++++++--- src/intl/mr/common.json | 151 ++++++++++++++++++++---- src/intl/ms/common.json | 156 ++++++++++++++++++++++--- src/intl/nb/common.json | 194 ++++++++++++++++++++++++++++--- src/intl/nl/common.json | 148 ++++++++++++++++++++++-- src/intl/pcm/common.json | 140 ++++++++++++++++++++--- src/intl/pt-br/common.json | 139 ++++++++++++++++++++-- src/intl/pt/common.json | 146 ++++++++++++++++++++--- src/intl/ro/common.json | 153 ++++++++++++++++++++++--- src/intl/ru/common.json | 131 +++++++++++++++++++-- src/intl/se/common.json | 171 +++++++++++++++++++++++---- src/intl/sk/common.json | 133 +++++++++++++++++++-- src/intl/sl/common.json | 135 ++++++++++++++++++++-- src/intl/sr/common.json | 143 +++++++++++++++++++++-- src/intl/sw/common.json | 136 ++++++++++++++++++++-- src/intl/ta/common.json | 151 ++++++++++++++++++++---- src/intl/th/common.json | 132 +++++++++++++++++++-- src/intl/tk/common.json | 2 +- src/intl/tr/common.json | 136 ++++++++++++++++++++-- src/intl/uk/common.json | 156 +++++++++++++++++++++++-- src/intl/ur/common.json | 188 +++++++++++++++++++++++++++--- src/intl/vi/common.json | 146 +++++++++++++++++++++-- 36 files changed, 4670 insertions(+), 487 deletions(-) diff --git a/src/intl/am/common.json b/src/intl/am/common.json index 29d53a9fa22..4e32f12a422 100644 --- a/src/intl/am/common.json +++ b/src/intl/am/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "የመለያ ረቂቅ", "about-ethereum-org": "ስለ Ethereum.org", "about-us": "ስለ እኛ", + "adding-desci-projects": "Desci ፕሮጀክቶችን በማከል ላይ", + "adding-developer-tools": "ማበልጸጊያ መሳሪያዎችን በማከል ላይ", + "adding-exchanges": "ልውውጦችን በማከል ላይ", + "adding-glossary-terms": "የመዝገበ ቃላት አባባሎችን በማከል ላይ", + "adding-staking-products": "የስታኪንግ ምርቶችን በማከል ላይ", + "adding-wallets": "ዋሌቶችን በማከል ላይ", + "account-abstraction": "የመለያ ረቂቅ", + "acknowledgements": "እውቅና", "aria-toggle-search-button": "የመፈለጊያ ቁልፍን ቀያይር", "aria-toggle-menu-button": "የማውጫ ቁልፍን ቀያይር", "beacon-chain": "ቢከን ሰንሰለት", "bridges": "የብሎክቼይን ድልድዮች", - "clear": "አጽዳ", - "close": "ዝጋ", + "bug-bounty": "ሽልማት", + "build": "ይገንቡ", + "build-menu": "DeFiን ይገንቡ", + "clear": "ያጽዱ", + "close": "ይዝጉ", "community": "ማህበረሰብ", "community-hub": "የማህበረሰብ ማዕከል", "community-menu": "የማህበረሰብ ማውጫ", - "contact": "ማግኛ", + "contact": "እውቂያ", + "content-buckets": "የይዘት ማከማቻ", + "content-resources": "የይዘት መረጃ ማዕከል", "content-standardization": "የይዘት መደበኛነት", "contributing": "አስተዋጽኦ ማድረግ", "contributors": "አስተዋጽኦ ያደረጉ ሰዎች", @@ -27,7 +39,10 @@ "decentralized-identity": "ያልተማከለ ማንነት", "decentralized-social-networks": "ያልተማከሉ ማህበራዊ አውታረ-መረቦች፡፡", "decentralized-science": "DeSci - ያልተማከለ ሳይንስ", + "description": "ለnav ንጥል መግለጫ", "defi-page": "DeFi - ያልተማከለ ፋይናንስ", + "design": "ንድፍ", + "design-principles": "የንድፍ መርሆች", "devcon": "የገንቢዎች ጉባኤ (Devcon)", "developers": "ገንቢዎች", "developers-home": "የገንቢዎች መነሻ-ገፅ", @@ -75,7 +90,7 @@ "ethereum-protocol": "የኢቲሪየም ፕሮቶኮል", "ethereum-security": "የኢቲሪየም ደህንነትና ማጭበርበርን መከላከል", "ethereum-support": "የኢቲሪየም ድጋፍ", - "ethereum-wallets": "Ethereum Wallets", + "ethereum-wallets": "የኢቴርየም ቦርሳዎች", "ethereum-whitepaper": "የኢቲሪየም ነጭ ወረቀት", "feedback-widget-prompt": "ይህ ገፅ አግዞዎታል?", "feedback-card-prompt-page": "ይህ ገፅ አግዞዎት ነበር?", @@ -83,22 +98,22 @@ "feedback-card-prompt-tutorial": "ይህ ስልጠና አግዞዎት ነበር?", "feedback-widget-thank-you-title": "ለአስተያየተዎ እናመሰግናለን!", "feedback-widget-thank-you-subtitle": "ጥቂት ጥያቄዎችን በመመለስ ይህን ገፅ ከዚህ የተሻለ ያድርጉ፡፡", - "feedback-widget-thank-you-subtitle-ext": "እርዳታ ከፈለጉ በDiscord ላይ ያለዉን ማህበረሰብ ማግኘት ይችላሉ፡፡", + "feedback-widget-thank-you-subtitle-ext": "እርዳታ ከፈለጉ ማህበረሰቡን በእኛ <ዲስኮርዶች ላይ ማግኘት ይችላሉ።", "feedback-widget-thank-you-timing": "2–3 ደቂቃ ", "feedback-widget-thank-you-cta": "የፈጣን ንግድ ዳሰሳ ጥናት", "find-wallet": "ቦርሳ ያግኙ", "future-proofing": "የወደፊቱን-ማረጋገጫ", - "get-eth": "ኤቴሪየም(ETH) ያግኙ", + "get-eth": "ETHን ያግኙ", "get-involved": "ይሳተፉ", "get-started": "ጀምር", "grants": "ፍቃዶች", "grant-programs": "የስነ-ምህዳረ ፍቃድ ፕሮግራሞች", "guides": "መመሪያዎች", - "guides-hub": "የመመሪያዎች ማዕከል", + "guides-hub": "እንዴት ለሚለው ጥያቄ መመሪያ", "history-of-ethereum": "የኢቲሪየም ታሪክ", "home": "መነሻ-ገጽ", "how-ethereum-works": "ኢቲሪየም እንዴት ይሰራል", - "how-to-register-an-ethereum-account": "ለኢቲሪየም መለያ እንዴት \"መመዝገብ\" ይቻላል", + "how-to-create-an-ethereum-account": "የኢቲሪየም መለያ እንዴት \"መፍጠር\" ይቻላል", "how-to-revoke-token-access": "እንዴት በእርሰዎ ክሪፐቶ ገንዘብ ላይ ፈቃድ ያለውን ዘመናዊ ውል መሻር ይቻላል", "how-to-swap-tokens": "ቶከኖችን እንዴት መለዋወጥ ይቻላል", "how-to-use-a-bridge": "እንዴት ቶከኖችን ወደ ንብርብር 2 ማሻገር ይቻላል", @@ -128,10 +143,107 @@ "loading-error-try-again-later": "ዳታ መጫን አልተቻለም፣ ትንሽ ቆይተው ይሞክሩ፡፡", "logo": "አርማ", "mainnet-ethereum": "የኢቲሪየም ዋና አውታረ-መረብ", + "merge": "መደባለቅ", "more": "ተጨማሪ", - "nav-developers": "ገንቢዎች", + "nav-about-description": "ለEthereum ማህበረሰብ ይፋዊ፣ ክፍት ምንጭ ፕሮጀክት", + "nav-advanced-description": "የበለጠ ውስብስብ ርዕሶችን ይማሩ", + "nav-advanced-label": "የላቀ", + "nav-basics-description": "የEthereum መሰረታዊ ነገሮችን ይረዱ", + "nav-basics-label": "መሰረታውያን", + "nav-bridges-description": "Web3 ወደ አንደኛ ደረጃ L1 ብሎክ ቼይን እና L2 የምጣኔ መፍትሄዎች ሥነ-ምህዳር ተለውጧል", + "nav-builders-home-description": "ለEthereum የገንቢዎች መመሪያ—በገንቢዎች፣ ለገንቢዎች።", + "nav-builders-home-label": "የገንቢዎች መነሻ", + "nav-contribute-description": "እርዳታ ከፈለጉ፣ ይህ ይመራዎታል", + "nav-contribute-label": "ለ ethereum.org አስተዋጽኦ ማበርከት", + "nav-dao-description": "ያለ ማዕከላዊ ባለስልጣን በአባል ባለቤትነት ያሉ ማህበረሰቦች", + "nav-dapps-description": "Ethereumን በመጠቀም የበለጸጉ የመተግበሪያዎች ስነ-ምህዳርን ያስሱ", + "nav-defi-description": "ለባህላዊው የፋይናንስ ገበያ ዓለም አቀፋዊና ክፍት አማራጭ", + "nav-desci-description": "አሁን ላለው የሳይንስ ሥርዓት ዓለም አቀፋዊና ክፍት አማራጭ", + "nav-desoc-description": "ለማህበራዊ መስተጋብር እና ይዘት ፈጠራ በብሎክቼይን ላይ የተመሰረቱ መድረኮች", "nav-developers-docs": "የገንቢዎች ሰነዶች", + "nav-developers": "ገንቢዎች", + "nav-did-description": "የእርስዎን ልዩ ያልተማከሉ መለያዎች ይስጡ እና ባለቤት ይሁኑ", + "nav-docs-description": "Ethereumን ለመረዳት እና በእሱ ለመገንባት የሚያግዙ ሰነዶች", + "nav-docs-design-description": "የልዩ web3 ዲዛይን ፈተናዎች፣ ምርጥ ልምዶች እና የተጠቃሚ ምርምር ግንዛቤዎች መግለጫ", + "nav-docs-design-label": "የUX/UI ዲዛይን መሰረታዊ ነገሮች", + "nav-docs-foundation-description": "በEthereum ላይ ለማዳበር ዋና መሰረታዊ ነገሮች", + "nav-docs-foundation-label": "መሰረታዊ ርዕሰ ጉዳዮች", + "nav-docs-overview-description": "የእርስዎ መነሻ ለገንቢ ሰነዶች", + "nav-docs-stack-description": "የEthereum ቁልል ሁሉንም ዝርዝሮች ይረዱ", + "nav-docs-stack-label": "የኢቲሪየም ስታክ", + "nav-eip-description": "አዲስ ባህሪያትን ወይም ሂደቶችን የሚገልጹ ደረጃዎች", + "nav-eip-label": "የEthereum ማሻሻያ ፕሮፖዛል (EIPዎች)", + "nav-emerging-description": "ለEthereum ሌሎች አዳዲስ የጉዳዩ ጥቅሞችን ይወቁ", + "nav-enterprise-description": "ለEthereum የንግድ መተግበሪያዎች", + "nav-ethereum-org-description": "ይህ ድረ ገጽ በማህበረሰብ የሚመራ ነው - ይቀላቀሉን እና እርስዎም ያዋጡ", + "nav-ethereum-wallets-description": "ከEthereum መለያዎ ጋር መገናኛ መተግበሪያ", + "nav-events-description": "ያልተማከለ እና ለማንኛውም ሰው የመሳተፍ ነፃነት", + "nav-events-irl-description": "በየወሩ በአካል እና በመስመር ላይ ዋና ዋና የEthereum ዝግጅቶች አሉ", + "nav-events-label": "ማህበረሰቦች እና ዝግጅቶች", + "nav-events-online-description": "በመቶ ሺዎች የሚቆጠሩ የEthereum አድናቂዎች በእነዚህ የመስመር ላይ ማህበረሰቦች ውስጥ ይጠለላሉ", + "nav-find-wallet-description": "ዋሌቶች ክሪፕቶ እንዲጠቀሙ ያስችሉዎታል", + "nav-find-wallet-label": "ዋሌትዎን ይምረጡ", + "nav-gas-fees-description": "የETH ግብይት ክፍያዎች እንዴት ይሰላሉ", + "nav-get-eth-description": "የEthereum መተግበሪያዎችን ለመጠቀም ኤተር (ETH) ያስፈልግዎታል", + "nav-get-started-description": "Ethereum ለመጠቀም የመጀመሪያ እርምጃዎችዎ", + "nav-governance-description": "የEthereum ፕሮቶኮልን ማሻሻል ውስጥ የተካተተው ሂደት", + "nav-grants-description": "የእርዳታ የገንዘብ ድጋፍ ፕሮግራሞችን በሚሰጡ ፕሮጀክቶች ላይ በማህበረሰባችን የተሰበሰበ ዝርዝር", + "nav-guide-create-account-description": "ማንኛውም ሰው በማንኛውም ጊዜ በኪስ ቦርሳ በነጻ የEthereum መለያ መፍጠር ይችላል", + "nav-guide-create-account-label": "የኢቲሪየም አካውንት እንዴት መፍጠር ይቻላል", + "nav-guide-revoke-access-description": "በEthereum ስነ ምህዳር ውስጥ ካሉ ዘመናዊ ኮንትራቶች እና መተግበሪያዎች ጋር ሲገናኙ ደህንነትዎን ይጠብቁ", + "nav-guide-revoke-access-label": "የዘመናዊ ኮንትራት መዳረሻን እንዴት መሻር እንደሚቻል", + "nav-guide-use-wallet-description": "የዋሌት ሁሉንም መሰረታዊ ተግባራት እንዴት እንደሚሠሩ ይወቁ", + "nav-guide-use-wallet-label": "ቦርሳ እንዴት መጠቀም ይቻላል", + "nav-guides-description": "ለመጀመር የሚያግዙ ተግባራዊ የደረጃ በደረጃ መመሪያዎች", + "nav-guides-label": "እንዴት እንደሚደረጉ መመሪያዎች", + "nav-history-description": "የሁሉም ዋና ዋና ፎርኮች እና ዝመናዎች የጊዜ መስመር", + "nav-history-label": "የEthereum ቴክኒካዊ ታሪክ", + "nav-layer-2-description": "ለEthereum ርካሽ እና ፈጣን ግብይቶች", + "nav-learn-by-coding-description": "በEthereum ለመሞከር የሚረዱዎት መሳሪያዎች", + "nav-local-env-description": "የእርስዎን የEthereum ልማት ቁልል ይምረጡ እና ያቀናብሩ", + "nav-mainnet-description": "የድርጅት ብሎክቼይን መተግበሪያዎች በይፋዊው Ethereum ዋና መረብ ላይ ሊገነቡ ይችላሉ", + "nav-nft-description": "ማንኛውንም ልዩ የሆነ ነገር የሚወከልበት መንገድ እንደ Ethereum-ተኮር ንብረት", + "nav-open-research-description": "ከEthereum ዋነኛ ጥንካሬዎች አንዱ ንቁ የምርምር ማህበረሰቡ ነው", + "nav-open-research-label": "ምርምሩን ይክፈቱ", + "nav-overview-description": "ሁሉም ነገሮች Ethereum ትምህርት", + "nav-overview-label": "አጠቃላይ እይታ", + "nav-participate-overview-description": "እንዴት መሳተፍ እንደሚቻል አጠቃላይ እይታ", "nav-primary": "ዋነኛ", + "nav-quizzes-description": "Ethereumን እና ክሪፕቶከረንሲዎችን ምን ያህል እንደሚረዱ ይወቁ", + "nav-quizzes-label": "እውቀትዎን ይፈትሹ", + "nav-refi-description": "በመልሶ ማልማት መርሆዎች ላይ የተገነባ አማራጭ የኢኮኖሚ ስርዓት", + "nav-research-description": "Ethereumን ለማሻሻል ጥቅም ላይ የዋሉ ሂደቶች", + "nav-research-label": "ምርምር እና እድገት", + "nav-roadmap-description": "ለEthereum የበለጠ መስፋፋት፣ ደህንነት እና ዘላቂነት ያለው መንገድ", + "nav-roadmap-future-description": "Ethereumን እንደ ጠንካራ እና ያልተማከለ አውታረ መረብ ማጠናከር", + "nav-roadmap-future-label": "የወደፊቱን-ማረጋገጫ", + "nav-roadmap-label": "ዕቅድ", + "nav-roadmap-scaling-description": "የግብይት ወጪዎችን እና ፍጥነትን የበለጠ ለመቀነስ የአውታረ መረብ ዝመናዎች", + "nav-roadmap-security-description": "Ethereum ለወደፊቱ ሁሉንም አይነት ጥቃቶች የሚቋቋም መሆኑን ማረጋገጥ", + "nav-roadmap-security-label": "Ethereum ለወደፊቱ ሁሉንም አይነት ጥቃቶች የሚቋቋም መሆኑን ማረጋገጥ", + "nav-roadmap-ux-description": "Ethereumን መጠቀም ቀላል መሆን አለበት", + "nav-run-a-node-description": "የአውታረ መረቡን ደህንነት በማገዝ ሙሉ በሙሉ ሉዓላዊ ይሁኑ", + "nav-security-description": "ክሪፕቶከረንሲ ሲጠቀሙ ምርጥ ልምዶችን ይማሩ", + "nav-smart-contracts-description": "የEthereum ሥነ-ምህዳር መሰረታዊ ማነቆዎች", + "nav-stablecoins-description": "Stablecoins በቋሚ እሴት ላይ ለመቆየት የተነደፉ የEthereum ቶከኖች ናቸው", + "nav-stake-description": "Ethereumን ለማስጠበቅ ሽልማቶችን ያግኙ", + "nav-stake-label": "ስቴክ", + "nav-staking-home-description": "ስቴክ ለማድረግ የተለያዩ አማራጮች አጠቃላይ እይታ", + "nav-staking-home-label": "የቀብድ ማስያዝ የፊት-ገፅ", + "nav-staking-pool-description": "ከሌሎች ጋር በመቀላቀል በማንኛውም የETH መጠን ስቴክ ያድርጉ እንዲሁም ሽልማቶችን ያግኙ", + "nav-staking-pool-label": "የተዋሃዱ ቀብዶች", + "nav-staking-saas-label": "በአገልግሎት ስቴክ ማድረግ", + "nav-staking-solo-label": "የብቻ ስታኪንግ", + "nav-start-building-description": "ለአዲስ መጪዎች ጠቃሚ መረጃ", + "nav-translation-program-description": "ethereum.org ወደ ሁሉም ቋንቋዎች ለመተርጎም የትብብር ጥረት", + "nav-tutorials-description": "የተመረጡ የማህበረሰብ አጋዥ ስልጠናዎች ዝርዝር", + "nav-use-cases-description": "ለEthereum አጠቃቀም የተለያዩ ሀሳቦችን ያግኙ", + "nav-what-is-ether-description": "የEthereum መተግበሪያዎች መገበያያ ገንዘብ", + "nav-what-is-ethereum-description": "Ethereumን ልዩ የሚያደርገው ምን እንደሆነ ይረዱ", + "nav-what-is-web3-label": "Web3 ምንደን ነው?", + "nav-what-is-web3-description": "ደንቦቹን ከሚወስኑት የተማከሉ ሞኖፖሊዎች አማራጭ", + "nav-whitepaper-description": "በ2014 በቪታሊክ ቡቴሪን የተፃፈው ዋናው የEthereum ነጭ ወረቀት", + "nav-zkp-description": "መግለጫውን ራሱ ሳይገልጥ የመግለጫውን ትክክለኛነት የሚያረጋግጥበት መንገድ", "nft-page": "NFTs - የማይተኩ ቶከኖች", "nfts": "NFTዎች", "no": "አይደለም", @@ -140,6 +252,7 @@ "page-developers-aria-label": "የገንቢዎች መነሻ-ገጽ", "page-index-meta-title": "መነሻ-ገጽ", "page-last-updated": "ገፁ በቅርብ ጊዜ የዘመነው", + "participate-menu": "መሳተፊያ ምናሌ", "pbs": "የፕሮፖሰር-ገንቢ መለያየት", "pools": "የተዋሃዱ ቀብዶች", "privacy-policy": "የግላዊነት ፖሊሲ", @@ -150,10 +263,11 @@ "refresh": "አባኮዎትን ገጹን ያድሱ፡፡", "return-home": "ወደ መነሻ-ገፅ ይመለሱ", "roadmap": "የኢቲሪየም ፍኖተ ካርታ", + "research": "ምርምር", + "research-menu": "የምርምር ምናሌ", "resources": "የትርጉም ምንጮች", "regenerative-finance": "ReFi - መልሶ ማልሚያ ፋይናንስ", "run-a-node": "ኖድ ማንቀሳቀስ ይጀምሩ", - "rollup-component-website": "Website", "rollup-component-developer-docs": "የገንቢዎች ሰነዶች", "rollup-component-technology-and-risk-summary": "የቴክኖሎጂ እና የስጋት ማጠቃለያ", "scaling": "ማሳደግ", @@ -168,19 +282,16 @@ "statelessness": "ይዞታ አልባነት", "see-contributors": "አስተዋጽዖ አበርካቾችን ይመልከቱ", "set-up-local-env": "ሎካል ኢንቫይሮመንተ ያዘጋጁ", - "sharding": "Sharding", "show-all": "ሁሉንም አሳይ", "show-less": "ቀንሰህ አሳይ", "site-description": "ኢቴሪየም ለገንዘብ እና አዲስ ዓይነት መተግበሪያዎች የሚውል ዓለም አቀፍ፣ ያልተማከለ መድረክ ነው። \nበኢቴሪየም ላይ ገንዘብን የሚቆጣጠር ኮድ መጻፍ ይችላሉ፣ እና በዓለም ላይ በየትኛውም ቦታ የሚገኙ መተግበሪያዎችን መገንባት ይችላሉ።.", - "site-title": "ethereum.org", "skip-to-main-content": "ወደ ዋናው ይዘት ይዝለሉ", "smart-contracts": "ስማርት ኮንትራቶች", "stablecoins": "ስቴብልኮይኖች", "stake-eth": "ETHን ያስይዙ", "staking": "ቀብድ ማስያዝ", "start-here": "እዚህ ጋር ይጀምሩ", - "style-guide": "Style guide", - "solo": "የብቸኛ ቀብዶች", + "solo": "የብቻ ስታኪንግ", "terms-of-use": "የአጠቃቀም መመሪያ", "translation-banner-body-new": "ይህን ገጽ ገና ስላልተረጎምነው በእንግሊዝኛ እያዩት ነው። ይህንን ይዘት ለመተርጎም ይርዱን።", "translation-banner-body-update": "የዚህ ገጽ አዲስ ስሪት አለ ግን አሁን በእንግሊዝኛ ብቻ ነው። የቅርብ ጊዜውን ስሪት ለመተርጎም ይረዱን።", @@ -191,17 +302,19 @@ "translation-banner-no-bugs-title": "አዚህ ምንም ችግር የለም!", "translation-banner-no-bugs-content": "ይህ ገጽ እየተተረጎመ አይደለም። ለጊዜው ይህ ገጽ በእንግሊዝኛ ብቻ እንዲሆን ትተነዋል።", "translation-banner-no-bugs-dont-show-again": "ድጋሚ እንዳታሳይ", + "translation-program": "የትርጉም ፕሮግራም", "try-using-search": "የሚፈልጉትን ለማግኘት ይፈልጉ የሚለውን ይጠቀሙ ወይም", "tutorials": "ስልጠናዎች", "up": "ወደ ላይ", + "use": "ጥቅም", "use-ethereum": "ኢቲሪየምን ይጠቀሙ", "use-ethereum-menu": "የኢቲሪየም ማውጫን ይጠቀሙ", + "use-menu": "የጥቅም ምናሌ", "user-experience": "የተጠቃሚው ልምድ", "verkle-trees": "የቨርክል ዛፎች", "wallets": "ቦርሳዎች", "we-couldnt-find-that-page": "ያሉትን ገፅ ልናገኝ አልቻልንም", "web3": "Web3 ምንደን ነው?", - "web3-title": "Web3", "website-last-updated": "ድህረ-ገጹ ለመጨረሻ ጊዜ የተሻሻለበት", "what-is-ether": "Ether (ETH) ምንድን ነው?", "what-is-ethereum": "ኢቴርየምን ምንድን ነው?", diff --git a/src/intl/bn/common.json b/src/intl/bn/common.json index dccbbcca89b..0f59184a56c 100644 --- a/src/intl/bn/common.json +++ b/src/intl/bn/common.json @@ -40,7 +40,7 @@ "decentralized-social-networks": "বিকেন্দ্রীভূত সামাজিক নেটওয়ার্ক", "decentralized-science": "DeSci - ডিসেন্ট্রালাইজড সায়েন্স", "description": "ন্যাভ আইটেমের জন্য বর্ণনা", - "defi-page": "DeFi - বিকেন্দ্রীভূত অর্থ ", + "defi-page": "DeFi - বিকেন্দ্রীভূত অর্থ", "design": "ডিজাইন", "design-principles": "ডিজাইনের মূলনীতি", "devcon": "Devcon", diff --git a/src/intl/ca/common.json b/src/intl/ca/common.json index 5bdba3095b7..058140420aa 100644 --- a/src/intl/ca/common.json +++ b/src/intl/ca/common.json @@ -1,17 +1,30 @@ { - "account-abstraction": "Abstracció del compte", "about-ethereum-org": "Quant a ethereum.org", "about-us": "Sobre nosaltres", + "adding-desci-projects": "Afegint Projectes Desci", + "adding-developer-tools": "Afegint Eines per a Desenvolupadors", + "adding-exchanges": "Afegint Cases de Canvi", + "adding-glossary-terms": "Afegint termes al glossari", + "adding-layer-2s": "Afegint Capa 2", + "adding-staking-products": "Afegint Productes d'Apilament", + "adding-wallets": "Afegint Carteres", + "account-abstraction": "Abstracció del compte", + "acknowledgements": "Agraïments", "aria-toggle-search-button": "Mostrar el botó de cerca", "aria-toggle-menu-button": "Mostrar el botó del menú", "beacon-chain": "La Cadena de Balisa", "bridges": "Ponts que interconnecten les Blockchains", + "bug-bounty": "Recompensa d'error", + "build": "Construïu", + "build-menu": "Menú de construcció", "clear": "Netejar", "close": "Tancar", "community": "Comunitat", "community-hub": "Centre comunitari", "community-menu": "Menú Comunitat", "contact": "Contacte", + "content-buckets": "Cubells de contingut", + "content-resources": "Recursos de contingut", "content-standardization": "Estandardització de contingut", "contributing": "Contribucions", "contributors": "Col·laboradors", @@ -27,7 +40,10 @@ "decentralized-identity": "Identitat descentralitzada", "decentralized-social-networks": "Xarxes socials descentralitzades", "decentralized-science": "DeSci - Ciència descentralitzada", + "description": "Descripció per a l'element de navegació", "defi-page": "FiDe - Finança decentralitzada", + "design": "Disseny", + "design-principles": "Normes de disseny", "devcon": "Devcon", "developers": "Desenvolupadors", "developers-home": "Pàgina d'inici per a desenvolupadors", @@ -63,7 +79,7 @@ "ethereum-bug-bounty": "Veure el programa de recompenses per errors", "consensus-when-shipping": "Quan es llençarà?", "ethereum-upgrades": "Millores d'Ethereum", - "ethereum-brand-assets": "Actius de la marca Ethereum", + "ethereum-brand-assets": "Actius de marca d'Ethereum", "ethereum-online": "Comunitats en línia", "ethereum-events": "Esdeveniments d'Ethereum", "ethereum-foundation": "Fundació Ethereum", @@ -75,7 +91,7 @@ "ethereum-protocol": "Protocol d'Ethereum", "ethereum-security": "Seguretat i prevenció d'estafes a Ethereum", "ethereum-support": "Assitència d'Ethereum", - "ethereum-wallets": "Carteres Ethereum", + "ethereum-wallets": "Carteres d'Ethereum", "ethereum-whitepaper": "Informe d'Ethereum", "feedback-widget-prompt": "Heu trobat útil aquesta pàgina?", "feedback-card-prompt-page": "Ha estat útil aquesta pàgina?", @@ -86,7 +102,7 @@ "feedback-widget-thank-you-subtitle-ext": "Si necessiteu ajuda, podeu connectar-vos a la nostra comunitat en el nostre Discord.", "feedback-widget-thank-you-timing": "2 - 3 minuts", "feedback-widget-thank-you-cta": "Obrir l'enquesta breu", - "find-wallet": "Trobar una cartera", + "find-wallet": "Trobeu una cartera", "future-proofing": "Pensant en el futur", "get-eth": "Aconseguiu ETH", "get-involved": "Participeu", @@ -94,11 +110,10 @@ "grants": "Subvencions", "grant-programs": "Programes de subvencions per a l'ecosistema", "guides": "Guies", - "guides-hub": "Hub de les guies", + "guides-hub": "Guies pràctiques", "history-of-ethereum": "Història d'Ethereum", "home": "Inici", "how-ethereum-works": "Com funciona Ethereum", - "how-to-register-an-ethereum-account": "Com \"registrar\" un compte d'Ethereum", "how-to-revoke-token-access": "Com revocar l'accés a contractes intel·ligents als vostres fons criptogràfics", "how-to-swap-tokens": "Com intercanviar tokens", "how-to-use-a-bridge": "Com pontar tokens a la Layer 2", @@ -128,18 +143,119 @@ "loading-error-try-again-later": "No es poden carregar les dades. Torna-ho a provar més tard.", "logo": "logotip", "mainnet-ethereum": "Xarxa principal d'Ethereum", + "merge": "Fusionar", "more": "Més", - "nav-developers": "Desenvolupadors", + "nav-about-description": "Un projecte públic i de codi obert per a la comunitat Ethereum", + "nav-advanced-description": "Coneixeu els temes més complexos", + "nav-advanced-label": "Avançat", + "nav-basics-description": "Compreneu les bases de Ethereum", + "nav-basics-label": "Bàsics", + "nav-bridges-description": "Web3 ha evolucionat cap a un ecosistema de cadenes de blocs primàries L1 i solucions d'escalat L2", + "nav-builders-home-description": "Manual del desenvolupador per a Ethereum; de desenvolupadors, per a desenvolupadors", + "nav-builders-home-label": "Inici del constructor", + "nav-contribute-description": "Si voleu ajudar, això us guiarà", + "nav-contribute-label": "Col·laborar amb ethereum.org", + "nav-dao-description": "Comunitats de propietat dels membres sense autoritat centralitzada", + "nav-dapps-description": "Exploreu un ric ecosistema d'aplicacions usant Ethereum", + "nav-defi-description": "Una alternativa global i oberta al mercat financer tradicional", + "nav-desci-description": "Una alternativa global i oberta al sistema científic actual", + "nav-desoc-description": "Plataformes basades en cadenes de blocs per a la interacció social i la creació de contingut", "nav-developers-docs": "Documents per a desenvolupadors", + "nav-developers": "Desenvolupadors", + "nav-did-description": "Emeteu i posseïu els vostres identificadors descentralitzats únics", + "nav-docs-description": "Documents per a ajudar-vos a entendre i construir amb Ethereum", + "nav-docs-design-description": "Descripció dels desafiaments de disseny, les millors pràctiques i els coneixements de recerca d'usuaris únics de web3", + "nav-docs-design-label": "Fonaments del disseny UX/UI", + "nav-docs-foundation-description": "Fonaments bàsics per a desenvolupar en Ethereum", + "nav-docs-foundation-label": "Temes bàsics", + "nav-docs-overview-description": "Lloc on trobareu la documentació de desenvolupadors", + "nav-docs-stack-description": "Compreneu tots els detalls de la pila Ethereum", + "nav-docs-stack-label": "Pila Ethereum", + "nav-eip-description": "Estàndards que especifiquen noves característiques o processos", + "nav-eip-label": "Propostes de millora d'Ethereum (EIP)", + "nav-emerging-description": "Coneixeu altres casos d'ús més nous per a Ethereum", + "nav-enterprise-description": "Aplicacions empresarials per a Ethereum", + "nav-ethereum-org-description": "Aquest lloc web l'impulsa la comunitat, uniu-vos a nosaltres i contribuïu també", + "nav-ethereum-wallets-description": "Una aplicació per a interactuar amb el vostre compte de Ethereum", + "nav-events-description": "Descentralització i llibertat de participació per a tothom", + "nav-events-irl-description": "Cada mes hi ha grans esdeveniments Ethereum en persona i en línia", + "nav-events-label": "Comunitats i esdeveniments", + "nav-events-online-description": "Centenars de milers d'entusiastes de Ethereum organitzen aquestes comunitats en línia", + "nav-find-wallet-description": "Les carteres us permeten utilitzar criptomonedes", + "nav-find-wallet-label": "Trieu la vostra cartera", + "nav-gas-fees-description": "Com es calculen les taxes per transacció ETH?", + "nav-get-eth-description": "Necessiteu ether (ETH) per a usar aplicacions Ethereum", + "nav-get-started-description": "Primers passos per a usar Ethereum", + "nav-governance-description": "El procés d'actualització del protocol Ethereum", + "nav-governance-label": "Governança", + "nav-grants-description": "Una llista verificada per la nostra comunitat sobre projectes que ofereixen programes de finançament de subvencions", + "nav-guide-create-account-description": "Qualsevol pot crear un compte de Ethereum en qualsevol moment, de manera gratuïta amb una aplicació de cartera", + "nav-guide-revoke-access-description": "Mantingueu-vos segur quan interactueu amb contractes i aplicacions intel·ligents en l'ecosistema de Ethereum", + "nav-guide-revoke-access-label": "Com revocar l'accés al contracte intel·ligent", + "nav-guide-use-wallet-description": "Apreneu a utilitzar totes les funcions bàsiques d'una cartera", + "nav-guide-use-wallet-label": "Com utilitzar la cartera", + "nav-guides-description": "Guies pràctiques pas a pas per a ajudar-vos a començar", + "nav-guides-label": "Guies pràctiques", + "nav-history-description": "Una cronologia de totes les bifurcacions i actualitzacions principals", + "nav-history-label": "Història tècnica de Ethereum", + "nav-layer-2-description": "Transaccions més barates i ràpides per a Ethereum", + "nav-learn-by-coding-description": "Eines que us ajuden a experimentar amb Ethereum", + "nav-local-env-description": "Trieu i configureu la vostra pila de desenvolupament Ethereum", + "nav-mainnet-description": "Les aplicacions de cadena de blocs empresarials es poden construir en la xarxa Principal pública de Ethereum", + "nav-nft-description": "Una forma de representar quelcom únic com ara un actiu basat en Ethereum", + "nav-open-research-description": "Una de les principals fortaleses de Ethereum és la seva comunitat de recerca activa", + "nav-open-research-label": "Obrir recerca", + "nav-overview-description": "Tot Ethereum educació", + "nav-overview-label": "Resum", + "nav-participate-overview-description": "Informació general sobre com participar", "nav-primary": "Primari", + "nav-private-description": "Recursos de desenvolupador per a empreses privades Ethereum", + "nav-quizzes-description": "Descobriu el bé que enteneu Ethereum i les criptomonedes", + "nav-quizzes-label": "Poseu a prova els vostres coneixements", + "nav-refi-description": "Un sistema econòmic alternatiu basat en principis regeneratius", + "nav-research-description": "Processos utilitzats per a millorar Ethereum", + "nav-research-label": "Recerca i desenvolupament", + "nav-roadmap-description": "El camí cap a una major escalabilitat, seguretat i sostenibilitat per a Ethereum", + "nav-roadmap-future-description": "Solidificació de Ethereum com una xarxa robusta i descentralitzada", + "nav-roadmap-future-label": "Pensant en el futur", + "nav-roadmap-label": "Full de ruta", + "nav-roadmap-scaling-description": "Actualitzacions de xarxa per a reduir encara més els costos de transacció i la velocitat", + "nav-roadmap-scaling-label": "Transaccions més barates", + "nav-roadmap-security-description": "Assegurar-se que Ethereum es manté resistent a tota mena d'atacs en el futur", + "nav-roadmap-security-label": "Seguretat millorada", + "nav-roadmap-ux-description": "L'ús de Ethereum ha de simplificar-se", + "nav-run-a-node-description": "Esdeveniu plenament sobirans mentre ajudeu a protegir la xarxa", + "nav-security-description": "Apreneu les millors pràctiques en usar criptomonedes", + "nav-smart-contracts-description": "Els pilars fonamentals de l'ecosistema Ethereum", + "nav-stablecoins-description": "Les monedes estables són tokens d'Ethereum dissenyades per mantenir un valor fix", + "nav-stake-description": "Guanyeu recompenses per fer Ethereum més segur", + "nav-stake-label": "Posar diners", + "nav-staking-home-description": "Una visió general de les diferents opcions d'apilament", + "nav-staking-home-label": "Inici de l'apilament", + "nav-staking-pool-description": "Poseu diners i guanyeu recompenses amb qualsevol quantitat d'ETH unint-vos amb altres usuaris", + "nav-staking-pool-label": "Apilament en grup", + "nav-staking-saas-label": "Apilament amb un servei", + "nav-staking-solo-label": "Apilament en solitari", + "nav-start-building-description": "Informació útil per als nouvinguts", + "nav-translation-program-description": "Un esforç de col·laboració per a traduir ethereum.org a tots els idiomes", + "nav-tutorials-description": "Llista verificada de tutorials de la comunitat", + "nav-use-cases-description": "Descobriu diferents idees per a l'ús de Ethereum", + "nav-what-is-ether-description": "La moneda de les aplicacions d'Ethereum", + "nav-what-is-ethereum-description": "Comprendre el que fa que Ethereum sigui especial", + "nav-what-is-web3-label": "Què és la Web3?", + "nav-what-is-web3-description": "Una alternativa als monopolis centralitzats que dicten les regles", + "nav-whitepaper-description": "L'informe tècnic original de Ethereum escrit per Vitalik Buterin en 2014", + "nav-zkp-description": "Una manera de provar la validesa d'una declaració sense revelar la pròpia declaració", "nft-page": "NFT - Tokens no fungibles", "nfts": "Els NFT", "no": "No", "on-this-page": "En aquesta pàgina", "open-research": "Obrir recerca", - "page-developers-aria-label": "Menú de Desenvolupadors", + "page-developers-aria-label": "Menú per a desenvolupadors", "page-index-meta-title": "Inici", "page-last-updated": "Última actualització de la pàgina", + "participate": "Participeu", + "participate-menu": "Menú de participació", "pbs": "Separació proposant-constructor", "pools": "Apilament en grup", "privacy-policy": "Política de privadesa", @@ -150,13 +266,15 @@ "refresh": "Actualitzeu la pàgina.", "return-home": "Retorna a l’inici", "roadmap": "Full de ruta d'Ethereum", + "research": "Recercra", + "research-menu": "Menú de recerca", "resources": "Recursos de traducció", "regenerative-finance": "ReFi - Finances regeneratives", "run-a-node": "Executeu un node", "rollup-component-website": "Pàgina web", "rollup-component-developer-docs": "Documents per a desenvolupadors", "rollup-component-technology-and-risk-summary": "Resum de la tecnologia i el seu risc", - "scaling": "Escalant", + "scaling": "Escalat", "saas": "Servei d'apilament", "search": "Cercar", "search-ethereum-org": "Cerca a ethereum.org", @@ -164,10 +282,11 @@ "search-box-blank-state-text": "Cerqueu en altres llocs!", "search-eth-address": "Això sembla una adreça d’Ethereum. No proporcionem dades específiques a adreces. Proveu de cercar-ho en un explorador de blocs com", "search-no-results": "No s'han trobat resultats per a la vostra cerca", + "security": "Seguretat", "single-slot-finality": "Finalitat d'una sola ranura", "statelessness": "Apatrídia", "see-contributors": "Mostra col·laboradors", - "set-up-local-env": "Configurar l'entorn local", + "set-up-local-env": "Configureu l'entorn local", "sharding": "Fragmentació", "show-all": "Mostrar-ho tot", "show-less": "Mostra'n menys", @@ -179,8 +298,8 @@ "stake-eth": "Aposteu ETH", "staking": "Apilament", "start-here": "Comença aquí", - "style-guide": "Style guide", "solo": "Apilament en solitari", + "support": "Suport", "terms-of-use": "Condicions d'ús", "translation-banner-body-new": "Esteu veient aquest pàgina en anglès perquè encara no l'hem traduïda. Ajudeu-nos a traduir aquest contingut.", "translation-banner-body-update": "Hi ha una nova versió d'aquesta pàgina, però actualment només està en anglès. Ajudeu-nos a traduir l'última versió.", @@ -191,11 +310,14 @@ "translation-banner-no-bugs-title": "No conté errors!", "translation-banner-no-bugs-content": "Aquesta pàgina no està essent traduïda. De moment hem deixat aquesta pàgina intencionadament en anglès.", "translation-banner-no-bugs-dont-show-again": "No ho mostris de nou", + "translation-program": "Programa de traducció", "try-using-search": "Proveu d'utilitzar la lupa per trobar el que esteu buscant o", "tutorials": "Tutorials", "up": "Amunt", + "use": "Utilitzar", "use-ethereum": "Utilitzar Ethereum", "use-ethereum-menu": "Utilitzar menú d'Ethereum", + "use-menu": "Menú d'ús", "user-experience": "Experiència d'usuari", "verkle-trees": "Arbres de Verkle", "wallets": "Carteres", diff --git a/src/intl/fi/common.json b/src/intl/fi/common.json index 676bbd0d2c1..aa26783b865 100644 --- a/src/intl/fi/common.json +++ b/src/intl/fi/common.json @@ -1,28 +1,70 @@ { "about-ethereum-org": "Lue ethereum.org:sta", "about-us": "Lue meistä", + "adding-desci-projects": "DeSci-projektien lisääminen", + "adding-developer-tools": "Kehittäjätyökalujen lisääminen", + "adding-exchanges": "Vaihtopörssien lisääminen", + "adding-glossary-terms": "Sanastotermien lisääminen", + "adding-staking-products": "Panostamistuotteiden lisääminen", + "adding-wallets": "Lompakoiden lisääminen", + "account-abstraction": "Tilien erotteleminen", + "acknowledgements": "Kiitokset", "aria-toggle-search-button": "Paina hakupainiketta", "aria-toggle-menu-button": "Paina valikkopainiketta", "beacon-chain": "Beaconketju", "bridges": "Lohkoketjusillat", + "bug-bounty": "Löytöpalkkio bugeista", + "build": "Rakenna", + "build-menu": "Rakennusvalikko", + "clear": "Tyhjennä", + "close": "Sulje", "community": "Yhteisö", "community-hub": "Yhteisökeskus", "community-menu": "Yhteisövalikko", "contact": "Ota yhteyttä", + "content-buckets": "Sisältösangot", + "content-resources": "Sisältöresurssit", + "content-standardization": "Sisällön standardisointi", "contributing": "Osallistu projektiin", "contributors": "Avustajat", "contributors-thanks": "Kaikki, jotka ovat myötävaikuttaneet tähän sivuun – kiitos!", "cookie-policy": "Evästekäytäntö", "copied": "Kopioitu", "copy": "Kopio", + "danksharding": "Danksharding", + "dao-page": "DAO:t - Hajautetut autonomiset organisaatiot", "dark-mode": "Tumma", "data-provided-by": "Tietolähde:", "decentralized-applications-dapps": "Dapps - Hajautetut sovellukset", + "decentralized-identity": "Hajautettu identiteetti", + "decentralized-social-networks": "Hajautettu sosiaalinen verkosto", + "decentralized-science": "DeSci - Hajautettu tiede", + "description": "Navigointinimikkeen kuvaus", + "defi-page": "DeFi - Hajautettu rahoitus", + "design": "Suunnittelu", + "design-principles": "Suunnitteluperiaatteet", "devcon": "Devcon", "developers": "Kehittäjät", "developers-home": "Kehittäjien etusivu", "docs": "Dokumentit", + "docsearch-to-select": "Valitaksesi", + "docsearch-to-navigate": "Navigoidaksesi", + "docsearch-to-close": "Sulkeaksesi", + "docsearch-search-by": "Hakuperuste", + "docsearch-start-recent-searches-title": "Uusimmat", + "docsearch-start-no-recent-searches": "Ei viimeaikaisia hakuja", + "docsearch-start-save-recent-search": "Tallenna tämä haku", + "docsearch-start-remove-recent-search": "Poista tämä haku historiasta", + "docsearch-start-favorite-searches": "Suosikki", + "docsearch-start-remove-favorite-search": "Poista tämä haku suosikeista", + "docsearch-no-results-text": "Ei tuloksia kohteelle", + "docsearch-no-results-suggested-query": "Yritä etsiä", + "docsearch-no-results-missing": "Pitäisikö tämän kyselyn antaa tuloksia?", + "docsearch-no-results-missing-link": "Kerro meille.", + "docsearch-error-title": "Ei voitu hakea tuloksia", + "docsearch-error-help": "Tarkista verkkoyhteytesi.", "documentation": "Dokumentaatio", + "down": "Alas", "ecosystem": "Ekosysteemi", "edit-page": "Muokkaa sivua", "ef-blog": "Ethereum Foundation -säätiön blogi", @@ -32,9 +74,10 @@ "enterprise-menu": "Yritysvalikko", "esp": "Ekosysteemin tukiohjelma", "eth-current-price": "Nykyinen ETH-kauppahinta (USD)", + "ethereum-basics": "Ethereumin perusteet", + "ethereum-bug-bounty": "Ethereumin virhepalkkiojärjestelmä", "consensus-when-shipping": "Milloin se julkaistaan?", "ethereum-upgrades": "Ethereumin päivitykset", - "ethereum-brand-assets": "Ethereum-mediapankki", "ethereum-online": "Verkkoyhteisöt", "ethereum-events": "Ethereum-tapahtumat", "ethereum-foundation": "Ethereum Foundation -säätiö", @@ -42,20 +85,37 @@ "ethereum-glossary": "Ethereum-sanasto", "ethereum-governance": "Ethereumin hallinnointi", "ethereum-logo": "Ethereum-logo", + "ethereum-roadmap": "Ethereum-tiekartta", + "ethereum-protocol": "Ethereum-protokolla", "ethereum-security": "Ethereumin turvallisuus ja huijausten ehkäisy", "ethereum-support": "Ethereum-tuki", "ethereum-wallets": "Ethereum-lompakot", "ethereum-whitepaper": "Ethereum-tietopaketti", - "find-wallet": "Etsi lompakko", - "get-eth": "Hanki ETH:ta", + "feedback-widget-prompt": "Onko tämä sivu hyödyllinen?", + "feedback-card-prompt-page": "Oliko tämä sivu hyödyllinen?", + "feedback-card-prompt-article": "Oliko tämä artikkeli hyödyllinen?", + "feedback-card-prompt-tutorial": "Oliko tästä ohjeesta hyötyä?", + "feedback-widget-thank-you-title": "Kiitos palautteestasi!", + "feedback-widget-thank-you-subtitle": "Tee tästä sivusta vieläkin parempi vastaamalla muutamaan kysymykseen.", + "feedback-widget-thank-you-subtitle-ext": "Ota yhteyttä Discord-yhteisöömme, jos tarvitset apua.", + "feedback-widget-thank-you-timing": "2–3 minuuttia", + "feedback-widget-thank-you-cta": "Avaa lyhyt kysely", + "find-wallet": "Valitse lompakko", + "future-proofing": "Tulevaisuusvarmentaminen", + "get-eth": "Hanki Ethereitä", "get-involved": "Tule mukaan", - "get-started": "Aloittaminen", + "get-started": "Näin pääset alkuun", "grants": "Avustukset", "grant-programs": "Ekosysteemin avustusohjelmat", - "guides-and-resources": "Yhteisön ohjeet ja resurssit", + "guides": "Oppaat", + "guides-hub": "How-to-oppaat", "history-of-ethereum": "Ethereumin historia", "home": "Etusivu", "how-ethereum-works": "Kuinka Ethereum toimii", + "how-to-revoke-token-access": "Miten voit perua älysopimuksen pääsyn kryptovaroihisi", + "how-to-swap-tokens": "Miten tokeneita vaihdetaan", + "how-to-use-a-bridge": "Miten voit silloittaa rahakkeita tasolle 2", + "how-to-use-a-wallet": "Miten lompakkoa käytetään", "image": "kuva", "in-this-section": "Tässä osiossa", "individuals": "Yksityishenkilöille", @@ -66,8 +126,10 @@ "languages": "Kielet", "last-24-hrs": "Viimeiset 24 tuntia", "last-edit": "Viimeksi muokattu", + "layer-2": "Taso 2", "learn": "Opi", "learn-by-coding": "Opi koodaamalla", + "learn-hub": "Oppimiskeskus", "learn-menu": "Opi-valikko", "learn-more": "Opi lisää", "less": "Vähemmän", @@ -76,31 +138,163 @@ "loading": "Ladataan...", "loading-error": "Latausvirhe.", "loading-error-refresh": "Virhe, päivitä sivu.", + "loading-error-try-again-later": "Tietojen lataaminen epäonnistui. Yritä uudelleen myöhemmin.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Yhdistä", "more": "Lisää", + "nav-about-description": "Julkinen, avoimen lähdekoodin projekti Ethereum-yhteisölle", + "nav-advanced-description": "Opiskele monimutkaisia aiheita", + "nav-advanced-label": "Edistyneille", + "nav-basics-description": "Ymmärrä Ethereumin perusteet", + "nav-basics-label": "Perusteet", + "nav-bridges-description": "Web3 on kehittynyt ekosysteemiksi, jossa on tason 1 peruslohkoketjuja ja tason 2 skaalausratkaisuita", + "nav-builders-home-description": "Ethereum-kehittäjän opas – kehittäjiltä kehittäjille", + "nav-builders-home-label": "Kehittäjän etusivu", + "nav-contribute-description": "Jos haluat auttaa, tämä opastaa sinua", + "nav-contribute-label": "Ethereum.org-sivuston avustaminen", + "nav-dao-description": "Jäsenten omistamat yhteisöt ilman keskitettyä määräysvaltaa", + "nav-dapps-description": "Tutki sovellusten rikasta ekosysteemiä käyttämällä Ethereumia", + "nav-defi-description": "Globaali ja avoin vaihtoehto perinteisille rahoitusmarkkinoille", + "nav-desci-description": "Globaali ja avoin vaihtoehto nykyiselle tiedejärjestelmälle", + "nav-desoc-description": "Lohkoketjupohjaiset alustat sosiaalista vuorovaikutusta ja sisällön luomista varten", + "nav-developers-docs": "Kehittäjien dokumentit", + "nav-developers": "Kehittäjät", + "nav-did-description": "Myönnä ja omista omia hajautettuja tunnisteitasi", + "nav-docs-description": "Ymmärrä Ethereumia ja Ethereumissa rakentamista näiden dokumenttien avulla", + "nav-docs-design-description": "Kuvaus uniikeista web3:n suunnitteluhaasteista, parhaista käytännöistä ja käyttäjätutkimusten oivalluksista", + "nav-docs-design-label": "UI/UX-suunnittelun perusteet", + "nav-docs-foundation-description": "Ethereum-kehittämisen ydinperusteet", + "nav-docs-overview-description": "Etusivusi kehittäjän dokumenteille", + "nav-docs-stack-description": "Tutustu Ethereum-pinon yksityiskohtiin", + "nav-eip-description": "Uusia ominaisuuksia tai prosesseja määrittelevät standardit", + "nav-eip-label": "Ethereum-parannusehdotukset (EIP:t)", + "nav-emerging-description": "Tutustu muihin uudempiin Ethereumin käyttötapauksiin", + "nav-enterprise-description": "Liiketoimintasovellukset Ethereumille", + "nav-ethereum-org-description": "Tämä verkkosivusto on yhteisölähtöinen – liity mukaan ja osallistu", + "nav-ethereum-wallets-description": "Pysy yhteydessä Ethereum-tiliisi sovelluksen kautta", + "nav-events-description": "Hajauttaminen ja osallistumisvapaus kaikille", + "nav-events-irl-description": "Joka kuukausi järjestetään merkittäviä Ethereum-tapahtumia sekä livenä että verkossa", + "nav-events-label": "Yhteisöt ja tapahtumat", + "nav-events-online-description": "Sadattuhannet Ethereum-harrastajat kerääntyvät näihin verkkoyhteisöihin", + "nav-find-wallet-description": "Lompakoiden avulla voit käyttää kryptoa", + "nav-find-wallet-label": "Valitse lompakkosi", + "nav-gas-fees-description": "Kuinka etherin (EHT) transaktiomaksut lasketaan", + "nav-get-eth-description": "Tarvitset etheriä (EHT) käyttääksesi Ethereum-sovelluksia", + "nav-get-started-description": "Ensiaskeleet Ethereumin käyttöön", + "nav-governance-description": "Ethereum-protokollan päivittämiseen liittyvä prosessi", + "nav-governance-label": "Hallinto", + "nav-grants-description": "Yhteisömme luoma lista apurahaohjelmia tarjoavista projekteista", + "nav-guide-create-account-description": "Kuka tahansa voi luoda Ethereum-tilin milloin tahansa ilmaiseksi lompakkosovelluksella", + "nav-guide-revoke-access-description": "Älysopimusten ja sovellusten turvallinen käyttö Ethereumin ekosysteemissä", + "nav-guide-revoke-access-label": "Kuinka perua pääsy älysopimukseen", + "nav-guide-use-wallet-description": "Opi käyttämään kaikkia lompakon perustoimintoja", + "nav-guide-use-wallet-label": "Miten lompakkoa käytetään", + "nav-guides-description": "Käytännölliset ja vaiheittaiset oppaat, joilla pääset alkuun", + "nav-guides-label": "How to -oppaat", + "nav-history-description": "Aikajana kaikista merkittävistä haarautumista ja päivityksistä", + "nav-history-label": "Ethereumin tekninen historia", + "nav-layer-2-description": "Halvemmat ja nopeammat transaktiot Ethereumille", + "nav-learn-by-coding-description": "Kokeile Ethereumin käyttöä työkaluilla", + "nav-local-env-description": "Valitse ja luo omat Ethereum-kehitystyökalusi", + "nav-mainnet-description": "Julkisessa Ethereumin pääverkossa voidaan rakentaa lohkoketjusovelluksia yrityksille", + "nav-nft-description": "Tapa esittää ainutlaatuisia asioita digitaalisena Ethereum-omaisuuseränä", + "nav-open-research-description": "Yksi Ethereumin suurimmista vahvuuksista on sen aktiivinen tutkimusyhteisö", + "nav-open-research-label": "Avion tutkimus", + "nav-overview-description": "Kaikki Ethereum-kouluttautumisesta", + "nav-participate-overview-description": "Katsaus osallistumiseen", + "nav-primary": "Ensisijainen", + "nav-quizzes-description": "Selvitä, kuinka hyvin tunnet Ethereumin ja kryptovaluutat", + "nav-quizzes-label": "Testaa tietosi", + "nav-refi-description": "Uudistaville periaatteille rakennettu vaihtoehtoinen talousjärjestelmä", + "nav-research-description": "Ethereumin kehitysprosessit", + "nav-research-label": "Tutkimus ja kehittämistoiminta", + "nav-roadmap-description": "Kohti skaalautuvampaa, turvallisempaa ja vastuullisempaa Ethereumia", + "nav-roadmap-future-description": "Ethereumin vakiinnuttaminen voimakkaana ja hajautettuna verkostona", + "nav-roadmap-future-label": "Tulevaisuusvarmentaminen", + "nav-roadmap-label": "Etenemissuunnitelma", + "nav-roadmap-scaling-description": "Transaktiokuluja ja -nopeutta vähentävät verkkopäivitykset", + "nav-roadmap-security-description": "Varmistetaan, että Ethereum kestää tulevaisuudessa kaikenlaiset hyökkäykset", + "nav-roadmap-security-label": "Paranneltu turvallisuus", + "nav-roadmap-ux-description": "Ethereumin käytön pitää olla yksinkertaista", + "nav-run-a-node-description": "Auta edelläkävijänä verkon suojaamisessa", + "nav-security-description": "Tutustu kryptovaluutan käytön parhaisiin käytäntöihin", + "nav-smart-contracts-description": "Ethereum-ekosysteemin olennaiset rakennuspalikat", + "nav-stablecoins-description": "Vakausvaluutat ovat Ethereum-rahakkeita, joiden arvo on suunniteltu pysymään vakaana", + "nav-stake-description": "Ansaitse palkkioita Ethereum-verkoston suojaamisesta", + "nav-stake-label": "Steikkaus", + "nav-staking-home-description": "Eri vaihtoehtoja steikkaukseen", + "nav-staking-home-label": "Steikkaus etusivu", + "nav-staking-pool-description": "Steikkaa ja ansaitse palkkioita pienelläkin ether-summalla yhdessä muiden kanssa", + "nav-staking-pool-label": "Yhdistetty panostus", + "nav-staking-saas-description": "Kolmannen osapuolen solmupiste-operaattorit käsittelevät toimintaa omalla varmentajallaan.", + "nav-staking-saas-label": "Steikkaus palvelun kautta", + "nav-staking-solo-description": "Ylläpidä kotilaitteistoa ja lisää turvallisuutta sekä Ethereum-verkon hajauttamista.", + "nav-staking-solo-label": "Panostus soolona", + "nav-start-building-description": "Tarpeellista tietoa aloittelijoille", + "nav-translation-program-description": "Yhteistyöprojekti ethereum.org-sivuston kääntämiseksi kaikille kielille", + "nav-tutorials-description": "Huolellisesti valikoituja yhteisöoppaita", + "nav-use-cases-description": "Löydä erilaisia ideoita Ethereumin käyttöön", + "nav-what-is-ether-description": "Ethereum-sovelluksissa käytetty valuutta", + "nav-what-is-ethereum-description": "Oivalla, mikä tekee Ethereumista erityisen", + "nav-what-is-web3-label": "Mikä on Web3?", + "nav-what-is-web3-description": "Vaihtoehto sääntöjä saneleville keskitetyille monopoleille", + "nav-whitepaper-description": "Alkuperäisen Ethereum-tietopaketin kirjoitti Vitalik Buterin vuonna 2014", + "nav-zkp-description": "Tapa todistaa väittämän oikeellisuus paljastamatta itse väittämää", + "nft-page": "NFT:t - Ei-vaihdettavat poletit", + "nfts": "NFT:t", "no": "Ei", "on-this-page": "Tällä sivulla", + "open-research": "Avion tutkimus", + "page-developers-aria-label": "Kehittäjien valikko", + "page-index-meta-title": "Etusivu", "page-last-updated": "Sivu viimeksi päivitetty", + "participate": "Osallistu ja osallista", + "participate-menu": "Osallistumisvalikko", + "pbs": "Ehdottajan ja kehittäjän erottaminen", + "pools": "Yhdistetty panostus", "privacy-policy": "Tietosuojakäytäntö", "private-ethereum": "Yksityinen Ethereum", + "product-disclaimer": "Tuotteet ja palvelut on lueteltu viitteeksi Ethereum-yhteisölle. Tuotteen tai palvelun sisällyttäminen ei edusta suositusta ethereum.org-verkkosivuston tiimiltä tai Ethereum Foundation -säätiöltä.", + "quizzes-title": "Kyselykeskus", + "quizzes": "Kyselyt", "refresh": "Lataa sivu uudelleen.", + "return-home": "palaa etusivulle", + "roadmap": "Ethereum-tiekartta", + "research": "Tutkimus", + "research-menu": "Tutkimusvalikko", + "resources": "Käännöstyökalut", "run-a-node": "Aja solmu", + "rollup-component-website": "Verkkosivusto", + "rollup-component-developer-docs": "Kehittäjien dokumentit", + "rollup-component-technology-and-risk-summary": "Teknologia ja riskien tiivistelmä", + "scaling": "Skaalaus", + "saas": "Staking as a service -palvelu", "search": "Hae", + "search-ethereum-org": "Hae osoitteesta ethereum.org", + "secret-leader-election": "Salainen johtajan vaali", "search-box-blank-state-text": "Etsi pois!", "search-eth-address": "Tämä näyttää Ethereum-osoitteelta. Emme anna osoitekohtaisia tietoja. Kokeile etsiä sitä lohkoselaimella, kuten", "search-no-results": "Haullasi ei löytynyt tuloksia", + "security": "Turvallisuus", + "single-slot-finality": "Single-slot-ratkaisevuus", + "statelessness": "Maattomuus", "see-contributors": "Katso osallistujat", "set-up-local-env": "Asenna paikallinen ympäristö", - "sharding": "Sirpaleketjut", + "sharding": "Sirpalointi", "show-all": "Näytä kaikki", "show-less": "Näytä vähemmän", "site-description": "Ethereum on maailmanlaajuinen, hajautettu alusta rahaa ja uudenlaisia sovelluksia varten. Ethereumin avulla voit kirjoittaa rahaa säätelevää koodia ja rakentaa sovelluksia kaikkialle maailmaan.", "site-title": "ethereum.org", "skip-to-main-content": "Siirry pääsisältöön", "smart-contracts": "Älysopimukset", - "stablecoins": "Vakausvaluutat", + "stablecoins": "Vakaat kryptovaluutat", + "stake-eth": "Steikkaa ETH", "staking": "Panostaminen", + "start-here": "Aloita tästä", + "style-guide": "Tyyliopas", + "solo": "Panostus soolona", + "support": "Tuki", "terms-of-use": "Käyttöehdot", "translation-banner-body-new": "Katselet tätä sivua englanniksi, koska emme ole vielä kääntäneet sitä. Auta meitä kääntämään tämä sisältö.", "translation-banner-body-update": "Tästä sivusta on uusi versio, mutta se on tällä hetkellä vain englanniksi. Auta meitä kääntämään uusin versio.", @@ -108,17 +302,26 @@ "translation-banner-button-translate-page": "Käännä sivu", "translation-banner-title-new": "Auta kääntämään tämä sivu", "translation-banner-title-update": "Auta päivittämään tämä sivu", + "translation-banner-no-bugs-title": "Täällä ei ole virheitä!", + "translation-banner-no-bugs-content": "Tätä sivua ei ole käännetty. Olemme tarkoituksellisesti jättäneet tämän sivun toistaiseksi englanniksi.", + "translation-banner-no-bugs-dont-show-again": "Älä näytä uudestaan", + "translation-program": "Käännösohjelma", + "try-using-search": "Kokeile hakua, jotta löydät etsimäsi, tai", "tutorials": "Tutoriaalit", + "up": "Ylös", + "use": "Käytä", "use-ethereum": "Käytä Ethereumia", "use-ethereum-menu": "Käytä Ethereumia -valikko", + "use-menu": "Käyttövalikko", + "user-experience": "Käyttäjäkokemus", + "verkle-trees": "Verkle-puut", "wallets": "Lompakot", + "we-couldnt-find-that-page": "Sivua ei valitettavasti löytynyt", + "web3": "Mikä on Web3?", "website-last-updated": "Sivusto viimeksi päivitetty", - "what-is-ether": "Mikä on ether (ETH)?", + "what-is-ether": "Mikä on Ether (ETH)?", "what-is-ethereum": "Mikä on Ethereum?", - "defi-page": "DeFi - Hajautettu rahoitus", - "dao-page": "DAO:t - Hajautetut autonomiset organisaatiot", - "nft-page": "NFT:t - Ei-vaihdettavat poletit", + "withdrawals": "Panostamisen nostot", "yes": "Kyllä", - "page-index-meta-title": "Etusivu", - "page-developers-aria-label": "Kehittäjien valikko" + "zero-knowledge-proofs": "Nollatietotodistukset" } diff --git a/src/intl/fil/common.json b/src/intl/fil/common.json index 5060416bc44..36d8dcc0b92 100644 --- a/src/intl/fil/common.json +++ b/src/intl/fil/common.json @@ -1,17 +1,26 @@ { - "account-abstraction": "Account abstraction", "about-ethereum-org": "Tungkol sa ethereum.org", "about-us": "Tungkol sa amin", + "adding-desci-projects": "Pagdaragdag ng Mga Desci Project", + "adding-developer-tools": "Pagdaragdag ng Mga Tool ng Developer", + "adding-exchanges": "Pagdaragdag ng Mga Exchange", + "adding-glossary-terms": "Pagdaragdag ng Mga Termino sa Glossary", + "adding-staking-products": "Pagdaragdag ng Mga Produkto sa Staking", + "adding-wallets": "Pagdaragdag ng Mga Wallet", + "acknowledgements": "Mga pagkilala", "aria-toggle-search-button": "I-toggle ang button sa paghahanap", "aria-toggle-menu-button": "I-toggle ang button ng menu", "beacon-chain": "Beacon Chain", "bridges": "Mga blockchain bridge", + "build-menu": "Menu ng build", "clear": "I-clear", "close": "Isara", "community": "Komunidad", "community-hub": "Hub ng komunidad", "community-menu": "Menu ng Komunidad", "contact": "I-contact", + "content-buckets": "Mga Content Bucket", + "content-resources": "Mga Resource ng Content", "content-standardization": "Pag-standardize ng content", "contributing": "Pag-contribute", "contributors": "Mga Contributor", @@ -27,7 +36,10 @@ "decentralized-identity": "Decentralized na identity", "decentralized-social-networks": "Mga decentralized na social network", "decentralized-science": "DeSci - Decentralized science", + "description": "Paglalarawan para sa nav item", "defi-page": "DeFi - Decentralized finance", + "design": "Disenyo", + "design-principles": "Mga Alituntunin ng Disenyo", "devcon": "Devcon", "developers": "Mga Developer", "developers-home": "Home ng mga developer", @@ -51,7 +63,7 @@ "documentation": "Dokumentasyon", "down": "Pababa", "ecosystem": "Ecosystem", - "edit-page": "I-edit ang pahina", + "edit-page": "Ayusin ang pahina", "ef-blog": "Blog ng Ethereum Foundation", "eips": "Mga Mungkahi sa Pagpapaganda ng Ethereum", "energy-consumption": "Pagkonsumo ng enerhiya ng Ethereum", @@ -59,11 +71,11 @@ "enterprise-menu": "Enterprise Menu", "esp": "Ecosystem Support Program", "eth-current-price": "Kasalukuyang presyo ng ETH (USD)", - "ethereum-basics": "Basics ng Ethereum", + "ethereum-basics": "Mga pangunahing kaalaman sa Ethereum", "ethereum-bug-bounty": "Ethereum bug bounty program", "consensus-when-shipping": "Kailan ito masi-ship?", "ethereum-upgrades": "Mga pag-upgrade ng Ethereum", - "ethereum-brand-assets": "Mga assset ng Ethereum brand", + "ethereum-brand-assets": "Mga brand assset ng Ethereum", "ethereum-online": "Mga online na komunidad", "ethereum-events": "Mga kaganapan sa Ethereum", "ethereum-foundation": "Ethereum Foundation", @@ -71,11 +83,11 @@ "ethereum-glossary": "Glossary ng Ethereum", "ethereum-governance": "Pamamahala sa Ethereum", "ethereum-logo": "Logo ng Ethereum", - "ethereum-roadmap": "Lalakbaying daan ng Ethereum", + "ethereum-roadmap": "Roadmap ng Ethereum", "ethereum-protocol": "Protocol ng Ethereum", "ethereum-security": "Seguridad ng Ethereum at pag-iwas sa scam", "ethereum-support": "Suporta sa Ethereum", - "ethereum-wallets": "Mga Ethereum wallet", + "ethereum-wallets": "Mga wallet ng Ethereum", "ethereum-whitepaper": "Ethereum Whitepaper", "feedback-widget-prompt": "Nakakatulong ba ang page na ito?", "feedback-card-prompt-page": "Nakatulong ba ang page na ito?", @@ -83,7 +95,7 @@ "feedback-card-prompt-tutorial": "Nakatulong ba ang tutorial na ito?", "feedback-widget-thank-you-title": "Salamat sa iyong feedback!", "feedback-widget-thank-you-subtitle": "Pagandahin ang page na ito sa pamamagitan ng pagsagot ng ilang tanong.", - "feedback-widget-thank-you-subtitle-ext": "Kung kailangan mo ng tulong, puwede kang makipag-ugnayan sa community sa aming Discord.", + "feedback-widget-thank-you-subtitle-ext": "Kung kailangan mo ng tulong, puwede kang makipag-ugnayan sa komunidad sa aming Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Buksan ang maikling survey", "find-wallet": "Maghanap ng wallet", @@ -98,7 +110,7 @@ "history-of-ethereum": "Kasaysayan ng Ethereum", "home": "Home", "how-ethereum-works": "Paano gumagana ang Ethereum", - "how-to-register-an-ethereum-account": "Paano \"magrehistro\" ng Ethereum account", + "how-to-create-an-ethereum-account": "Paano \"gumawa\" ng Ethereum account", "how-to-revoke-token-access": "Paano bawiin ang access sa smart contract sa iyong mga pondo sa crypto", "how-to-swap-tokens": "Paano mag-swap ng mga token", "how-to-use-a-bridge": "Paano madadala ang mga token sa layer 2", @@ -115,11 +127,11 @@ "last-edit": "Huling pag-edit", "layer-2": "Layer 2", "learn": "Matuto", - "learn-by-coding": "Matuto sa pamamagitan ng pag-code", + "learn-by-coding": "Matuto sa pamamagitan ng coding", "learn-hub": "Learn Hub", "learn-menu": "Menu ng pag-aaral", "learn-more": "Matuto pa", - "less": "Mas kaunti", + "less": "Bawasan ang nakikita", "light-mode": "Light", "listing-policy-disclaimer": "Ang lahat ng produktong nakalista sa page na ito ay hindi opisyal na ineendorso, at ibinibigay lang ang mga ito para sa mga layuning pang-impormasyon. Kung nais mong mag dagdag ng produkto o magbigay ng feedback sa mga polisiya, mangyaring magsumite ng issue sa GitHub.", "loading": "Naglo-load...", @@ -128,10 +140,108 @@ "loading-error-try-again-later": "Hindi mai-load. Subukang muli mamaya.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", - "more": "Higit pa", - "nav-developers": "Mga Developer", + "merge": "I-merge", + "more": "Tumingin pa", + "nav-about-description": "Isang pampubliko, open-source na proyekto para sa komunidad ng Ethereum", + "nav-advanced-description": "Matutuhan ang mas kumplikadong mga paksa", + "nav-advanced-label": "Advanced", + "nav-basics-description": "Nauunawaan ang mga pangunahing kaalaman ng Ethereum", + "nav-basics-label": "Pangunahing Kaalaman", + "nav-bridges-description": "Umunlad ang web3 at naging ecosystem ng primary L1 blockchains at L2 scaling solutions", + "nav-builders-home-description": "Isang manual ng builder para sa Ethereum—gawa ng mga builder, para sa mga builder", + "nav-builders-home-label": "Bahay ng builder", + "nav-contribute-description": "Kung gusto mong tumulong, gagabayan ka nito", + "nav-contribute-label": "Nakikibahagi sa ethereum.org", + "nav-dao-description": "Mga komunidad ng miyembro na walang sentralisadong awtoridad", + "nav-dapps-description": "Tuklasin ang isang mayamang ecosystem ng mga app gamit ang Ethereum", + "nav-defi-description": "Isang pandaigdigan at bukas na alternatibo sa tradisyonal na pinansyal na merkado", + "nav-desci-description": "Isang pandaigdigan at bukas na alternaribo sa kasalukuyang sistema ng siyentipiko", + "nav-desoc-description": "Mga blockchain-based na platform para sa social interaction at paggawa ng content", "nav-developers-docs": "Developers docs", + "nav-developers": "Mga Developer", + "nav-did-description": "Ibigay at maging may-ari ng iyong natatanging decentralized na mga identifier", + "nav-docs-description": "Mga dokumento upang tulungan kang maunawaan at gumawa sa Ethereum", + "nav-docs-design-description": "Paglalarawan ng mga natatanging web3 design challenge, pinakamagandang gawain at mga pananaw sa pananaliksik ng user", + "nav-docs-design-label": "Mga pangunahing kaalaman sa UX/UI design", + "nav-docs-foundation-description": "Mga pangunahing batayan upang umunlad sa Ethereum", + "nav-docs-overview-description": "Ang tahanan mo para sa mga dokumento ng developer", + "nav-docs-stack-description": "Maunawaan ang lahat ng detalye ng Ethereum stack", + "nav-eip-description": "Mga pamantayan na tumutukoy ng mga bagong feature o proseso", + "nav-eip-label": "Mga pagsusulong para sa pagpapabuti ng Ethereum (EIPs)", + "nav-emerging-description": "Malaman ang ibang mas bagong mga kaso ng paggamit para sa Ethereum", + "nav-emerging-label": "Mga bagong use case", + "nav-enterprise-description": "Mga gamit sa negosyo ng Ethereum", + "nav-ethereum-org-description": "Kinokontrol ng komunidad ang website na ito—sumali sa amin at magbahagi rin", + "nav-ethereum-wallets-description": "Isang app upang makipag-ugnayan sa iyong Ethereum account", + "nav-events-description": "Desentralisasyon at kalayaan na makilahok para sa lahat", + "nav-events-irl-description": "Bawat buwan ay mayroong personal at online na malalaking Ethereum event", + "nav-events-label": "Mga komunidad at event", + "nav-events-online-description": "Libo-libong mahilig sa Ethereum ang nangunguna sa mga online na komunidad na ito", + "nav-find-wallet-description": "Pinahihintulutan ka ng mga wallet na gumamit ng crypto", + "nav-find-wallet-label": "Pumili ng wallet", + "nav-gas-fees-description": "Paano kinakalkula ang mga bayad sa transaksyon ng ETH", + "nav-get-eth-description": "Kailangan mo ng ether (ETH) para magamit ang mga Ethereum application", + "nav-get-started-description": "Ang mga una mong hakbang sa paggamit ng Ethereum", + "nav-governance-description": "Ang proseso na ginagamit sa pagpapaunlad ng protokol ng Ethereum", + "nav-governance-label": "Pamamahala", + "nav-grants-description": "Isang piniling listahan ng aming komunidad sa mga proyekto na nagbibigay ng mga programa sa paghahandog ng salapi", + "nav-guide-create-account-description": "Maaaring gumawa ng Ethereum account nang libre ang kahit sino, kahit kailan gamit ang isang wallet app", + "nav-guide-create-account-label": "Paano \"gumawa\" ng Ethereum account", + "nav-guide-revoke-access-description": "Manatiling ligtas sa tuwing nakikipag-ugnayan sa mga smart na kontrata at application sa Ethereum ecosystem", + "nav-guide-revoke-access-label": "Paano bawiin ang access sa smart na kontrata", + "nav-guide-use-wallet-description": "Alamin kung paano gamitin ang lahat ng pangunahing function ng isang wallet", + "nav-guide-use-wallet-label": "Paano gumamit ng wallet", + "nav-guides-description": "Praktikal na mga gabay upang tulungan kang makapagsimula", + "nav-guides-label": "Sundin kung paano at ang mga gabay", + "nav-history-description": "Isang timeline ng lahat ng malalaking fork at update", + "nav-history-label": "Teknikal na kasaysayan ng Ethereum", + "nav-layer-2-description": "Mas mura at mabilis na mga transaksyon para sa Ethereum", + "nav-learn-by-coding-description": "Mga tool na tutulong sa iyong mag-eksperimento sa Ethereum", + "nav-local-env-description": "Piliin at itakda ang iyong Ethereum development stack", + "nav-mainnet-description": "Puwedeng buuin ang mga enterprise blockchain application sa pampublikong Ethereum Mainnet", + "nav-nft-description": "Isang paraan para katawanin ang kahit anong natatangi bilang Ethereum-based asset", + "nav-open-research-description": "Ang isa sa mga pangunahing kalakasan ng Ethereum ay ang aktibo nitong komunidad sa pananaliksik", + "nav-open-research-label": "Open research", + "nav-overview-description": "Edukasyon sa lahat ng mga bagay sa Ethereum", + "nav-participate-overview-description": "Pangkalahatang-ideya sa kung paano makilahok", "nav-primary": "Primary", + "nav-quizzes-description": "Malaman kung paano mo lubos na nauunawaan ang Ethereum at mga cryptocurrency", + "nav-quizzes-label": "Subukan ang iyong kaalaman", + "nav-refi-description": "Isang alternatibong sistema ng ekonomiya na ginawa batay sa mga prinsipyong regenative", + "nav-research-description": "Mga ginamit na proseso upang mapahusay ang Ethereum", + "nav-research-label": "Pananaliksik at pag-unlad", + "nav-roadmap-description": "Ang landas tungo sa higit na scalability, seguridad at sustainability para sa Ethereum", + "nav-roadmap-future-description": "Pagpapatibay ng Ethereum bilang isang malakas at desentralisadong network", + "nav-roadmap-future-label": "Pag-future proof", + "nav-roadmap-label": "Roadmap", + "nav-roadmap-scaling-description": "Mga update sa network upang mas mapababa ang gastos sa transaksyon at bilis", + "nav-roadmap-security-description": "Tinitiyak na manatiling makababangon ang Ethereum sa lahat ng uri ng pag-atake sa hinaharap", + "nav-roadmap-security-label": "Mas pinahusay na seguridad", + "nav-roadmap-ux-description": "Kailangang pasimplehin ang paggamit ng Ethereum", + "nav-run-a-node-description": "Maging ganap na sovereign habang tumutulong na i-secure ang network", + "nav-security-description": "Matutuhan ang pinakamagandang mga gawain kapag ginagamit ang cryptocurrency", + "nav-smart-contracts-description": "Ang pangunahing bumubuo ng Ethereum ecosystem", + "nav-stablecoins-description": "Ang stablecoins ay mga Ethereum token na dinisenyong magkaroon ng hindi nababagong halaga", + "nav-stake-description": "Magkaroon ng mga reward para sa pag-secure ng Ethereum", + "nav-stake-label": "Stake", + "nav-staking-home-description": "Isang pangkalahatang-ideya ng iba't ibang opsyon sa pag-stake", + "nav-staking-home-label": "Staking home", + "nav-staking-pool-description": "Mag-stake at makakuha ng mga reward sa anumang halaga ng ETH sa pamamagitan ng pagsama sa iba", + "nav-staking-pool-label": "Pooled staking", + "nav-staking-saas-description": "Ang mga third-party node operator ang nangangasiwa sa operasyon ng iyong validator client", + "nav-staking-saas-label": "Pag-stake nang may serbisyo", + "nav-staking-solo-description": "Patakbuhin ang home hardware at personal na magdagdag sa seguridad at decentralization ng Ethereum network", + "nav-staking-solo-label": "Solo staking", + "nav-start-building-description": "Kapaki-pakinabang na impormasyon para sa mga baguhan", + "nav-translation-program-description": "Isang sama-samang pagsisikap upang isalin ang ethereum.org sa lahat ng wika", + "nav-tutorials-description": "Isang piniling listahan ng mga tutorial ng komunidad", + "nav-use-cases-description": "Matuklasan ang iba't ibang ideya ng paggamit ng Ethereum", + "nav-what-is-ether-description": "Ang currency ng mga Ethereum app", + "nav-what-is-ethereum-description": "Maunawaan kung bakit naging espesyal ang Ethereum", + "nav-what-is-web3-label": "Ano ang Web3?", + "nav-what-is-web3-description": "Isang alternatibo sa sentralisadong monopolyo na nagdidikta ng mga panuntunan", + "nav-whitepaper-description": "Ang orihinal na whitepaper ng Ethereum na isinulat ni Vitalik Buterin noong 2014", + "nav-zkp-description": "Isang paraan para patunayan ang validity ng isang pahayag nang hindi ipinapakita ang mismong pahayag", "nft-page": "NFT - Mga non-fungible token", "nfts": "NFTs", "no": "Hindi", @@ -140,6 +250,8 @@ "page-developers-aria-label": "Menu ng mga Developer", "page-index-meta-title": "Home", "page-last-updated": "Huling na-update ang page", + "participate": "Sumali", + "participate-menu": "Menu ng pakikilahok", "pbs": "Paghihiwalay ng tagamungkahi at tagabuo", "pools": "Pooled staking", "privacy-policy": "Patakaran sa privacy", @@ -150,9 +262,11 @@ "refresh": "Paki-refresh ang pahina.", "return-home": "bumalik sa home", "roadmap": "Roadmap ng Ethereum", + "research": "Pananaliksik", + "research-menu": "Menu ng pananaliksik", "resources": "Mga resource sa translation", "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Mag-run ng node", + "run-a-node": "Magpatakbo ng Node", "rollup-component-website": "Website", "rollup-component-developer-docs": "Developer docs", "rollup-component-technology-and-risk-summary": "Buod ng teknolohiya at risk", @@ -164,6 +278,7 @@ "search-box-blank-state-text": "Hanapin!", "search-eth-address": "Mukhang isang Ethereum address ito. Hindi kami nagbibigay ng data na partikular sa mga address. Subukang hanapin ito sa isang block explorer tulad ng", "search-no-results": "Walang resulta sa iyong hinahanap", + "security": "Seguridad", "single-slot-finality": "Pagiging pinal ng single-slot", "statelessness": "Kawalan ng estado", "see-contributors": "Tingnan ang mga contributor", @@ -172,15 +287,14 @@ "show-all": "Ipakita lahat", "show-less": "Magpakita ng mas kaunti", "site-description": "Ang Ethereum ay isang pandaigdigan at decentralized na platform para sa pera at mga bagong uri ng mga application. Sa Ethereum, maaari kang magsulat ng code na kumokontrol sa pera, at bumuo ng mga application na naa-access saanman sa mundo.", - "site-title": "ethereum.org", "skip-to-main-content": "Lumaktaw sa main content", "smart-contracts": "Mga smart contract", - "stablecoins": "Stablecoins", + "stablecoins": "Mga Stablecoin", "stake-eth": "Mag-stake ng ETH", "staking": "Staking", "start-here": "Magsimula dito", - "style-guide": "Style guide", "solo": "Solo staking", + "support": "Support", "terms-of-use": "Mga tuntunin ng paggamit", "translation-banner-body-new": "Tinitingnan mo ang pahinang ito sa English dahil hindi pa namin ito naisalin. Tulungan kaming isalin ang nilalamang ito.", "translation-banner-body-update": "May bagong bersyon ng page na ito ngunit nasa English lang ito ngayon. Tulungan kaming isalin ang pinakabagong bersyon.", @@ -191,14 +305,17 @@ "translation-banner-no-bugs-title": "Walang mga bug dito!", "translation-banner-no-bugs-content": "Ang pahinang ito ay hindi isinasalin. Sinadya naming iwan ang pahinang ito sa Ingles sa ngayon.", "translation-banner-no-bugs-dont-show-again": "Huwag nang ipakita ulit", + "translation-program": "Translation Program", "try-using-search": "Subukang gamitin ang paghahanap upang mahanap kung ano ang iyong hinahanap o", "tutorials": "Mga tutorial", "up": "Pataas", + "use": "Gamitin", "use-ethereum": "Gumamit ng Ethereum", "use-ethereum-menu": "Gamitin ang Ethereum menu", - "user-experience": "User experience", + "use-menu": "Menu ng paggamit", + "user-experience": "Karanasan ng user", "verkle-trees": "Verkle trees", - "wallets": "Mga Wallet", + "wallets": "Mga wallets", "we-couldnt-find-that-page": "Hindi namin mahanap ang page na iyon", "web3": "Ano ang Web3?", "web3-title": "Web3", diff --git a/src/intl/gl/common.json b/src/intl/gl/common.json index 7aded72466e..a88581ca929 100644 --- a/src/intl/gl/common.json +++ b/src/intl/gl/common.json @@ -1,28 +1,70 @@ { "about-ethereum-org": "Acerca de ethereum.org", "about-us": "Sobre nós", + "adding-desci-projects": "Engadindo proxectos DeSci", + "adding-developer-tools": "Engadindo ferramentas para desenvolvedores", + "adding-exchanges": "Engadindo intercambios", + "adding-glossary-terms": "Engadindo termos ó glosario", + "adding-staking-products": "Engadindo produtos de participación", + "adding-wallets": "Engadindo carteiras", + "account-abstraction": "Abstracción de conta", + "acknowledgements": "Agradecementos", "aria-toggle-search-button": "Cambiar botón de busca", "aria-toggle-menu-button": "Cambiar botón de menú", "beacon-chain": "Cadea de Baliza", "bridges": "Pontes de Blockchain", + "bug-bounty": "Recompensa de erro", + "build": "Construír", + "build-menu": "Menú Construír", + "clear": "Borrar", + "close": "Pechar", "community": "Comunidade", "community-hub": "Centro de Comunidade", "community-menu": "Menú de Comunidade", "contact": "Contacto", + "content-buckets": "Series de contido", + "content-resources": "Recursos de contido", + "content-standardization": "Normalización do contido", "contributing": "Contribuír", "contributors": "Contribuidores", "contributors-thanks": "A todos os que contribuíron a esta páxina, grazas!", "cookie-policy": "Política de cookies", "copied": "Copiado", "copy": "Copiar", + "danksharding": "Danksharding", + "dao-page": "DAO en inglés - Organizacións Autónomas Descentralizadas", "dark-mode": "Escuro", "data-provided-by": "Orixe de datos:", "decentralized-applications-dapps": "Dapps - Aplicacións descentralizadas", + "decentralized-identity": "Identidade descentralizada", + "decentralized-social-networks": "Redes sociais descentralizadas", + "decentralized-science": "DeSci - Ciencias descentralizadas", + "description": "Descrición dun elemento de navegación", + "defi-page": "DeFi - Finanzas descentralizadas", + "design": "Deseño", + "design-principles": "Principios de deseño", "devcon": "Devcon", "developers": "Programadores", "developers-home": "Menú para programadores", "docs": "Documentos", + "docsearch-to-select": "Para seleccionar", + "docsearch-to-navigate": "Para navegar", + "docsearch-to-close": "Para pechar", + "docsearch-search-by": "Buscar por", + "docsearch-start-recent-searches-title": "Recente", + "docsearch-start-no-recent-searches": "Non hai buscas recentes", + "docsearch-start-save-recent-search": "Gardar esta busca", + "docsearch-start-remove-recent-search": "Eliminar esta busca do historial", + "docsearch-start-favorite-searches": "Favorito", + "docsearch-start-remove-favorite-search": "Eliminar esta busca de favoritos", + "docsearch-no-results-text": "Sen resultados para", + "docsearch-no-results-suggested-query": "Intentar buscar por", + "docsearch-no-results-missing": "Considera que esta consulta debería amosar resultados?", + "docsearch-no-results-missing-link": "Fáganolo saber.", + "docsearch-error-title": "Non se atoparon resultados", + "docsearch-error-help": "Pode que desexe revisar a súa conexión de rede.", "documentation": "Documentación", + "down": "Baixar", "ecosystem": "Ecosistema", "edit-page": "Editar páxina", "ef-blog": "Blog da Fundación Ethereum", @@ -32,6 +74,7 @@ "enterprise-menu": "Menú Empresa", "esp": "Programa de soporte do ecosistema", "eth-current-price": "Prezo actual de ETH (USD)", + "ethereum-bug-bounty": "Programa de caza de erros de Ethereum", "consensus-when-shipping": "Cando se envía?", "ethereum-upgrades": "Melloras de Ethereum", "ethereum-brand-assets": "Activos de marca de Ethereum", @@ -42,20 +85,37 @@ "ethereum-glossary": "Glosario de Ethereum", "ethereum-governance": "Gobernanza de Ethereum", "ethereum-logo": "Logotipo de Ethereum", + "ethereum-roadmap": "Folla de ruta de Ethereum", + "ethereum-protocol": "Protocolo de Ethereum", "ethereum-security": "Seguridade en Ethereum e prevención de fraudes", "ethereum-support": "Soporte de Ethereum", "ethereum-wallets": "Carteiras de Ethereum", "ethereum-whitepaper": "Informe de Ethereum", + "feedback-widget-prompt": "É útil esta páxina?", + "feedback-card-prompt-page": "Foi útil esta páxina?", + "feedback-card-prompt-article": "Foi útil este artigo?", + "feedback-card-prompt-tutorial": "Foi útil este tutorial?", + "feedback-widget-thank-you-title": "Grazas polos vosos comentarios!", + "feedback-widget-thank-you-subtitle": "Faga que esta páxina sexa aínda mellor contestando unhas preguntas.", + "feedback-widget-thank-you-subtitle-ext": "Se precisa axuda, pode poñerse en contacto coa comunidade en Discord.", + "feedback-widget-thank-you-timing": "2-3 min", + "feedback-widget-thank-you-cta": "Abrir unha breve enquisa", "find-wallet": "Buscar carteira", + "future-proofing": "Preparado para o futuro", "get-eth": "Obter ETH", "get-involved": "Participar", "get-started": "Comezar", "grants": "Permisos", "grant-programs": "Programas para permisos do ecosistema", - "guides-and-resources": "Guías e recursos para a comunidade", + "guides": "Guías", + "guides-hub": "Guías prácticas", "history-of-ethereum": "Historia de Ethereum", "home": "Inicio", "how-ethereum-works": "Como funciona Ethereum", + "how-to-revoke-token-access": "Como anular o acceso a contratos intelixentes ós seus fondos en criptomoedas", + "how-to-swap-tokens": "Como intercambiar tokens", + "how-to-use-a-bridge": "Como pasar os tokens á capa 2", + "how-to-use-a-wallet": "Como usar unha carteira", "image": "imaxe", "in-this-section": "Nesta sección", "individuals": "Usuarios", @@ -66,8 +126,10 @@ "languages": "Idiomas", "last-24-hrs": "Últimas 24 horas", "last-edit": "Última edición", + "layer-2": "Capa 2", "learn": "Información", - "learn-by-coding": "Aprender mediante codificación", + "learn-by-coding": "Aprende programando", + "learn-hub": "Centro de aprendizaxe", "learn-menu": "Menú de información", "learn-more": "Máis información", "less": "Menos", @@ -76,31 +138,159 @@ "loading": "Cargando...", "loading-error": "Erro de carga.", "loading-error-refresh": "Erro. Actualice a páxina.", + "loading-error-try-again-later": "Non se puideron cargar os datos. Inténteo de novo máis tarde.", "logo": "logotipo", "mainnet-ethereum": "Rede principal de Ethereum", + "merge": "Fusionar", "more": "Máis", + "nav-about-description": "Un proxecto público de código aberto para a comunidade Ethereum", + "nav-advanced-description": "Coñeza os temas máis complexos", + "nav-advanced-label": "Avanzado", + "nav-basics-description": "Entenda o esencial de Ethereum", + "nav-basics-label": "Conceptos básicos", + "nav-bridges-description": "Web3 evolucionou nun ecosistema de cadeas de bloques primarios de capa 1 e solucións de escalabilidade de capa 2", + "nav-builders-home-description": "Un manual de construtores para Ethereum. De construtores para construtores.", + "nav-builders-home-label": "Inicio dos construtores", + "nav-contribute-description": "Se quere axudar, isto diralle como", + "nav-contribute-label": "Colaborar con ethereum.org", + "nav-dao-description": "Comunidades propiedade dos membros sen autoridade centralizada", + "nav-dapps-description": "Explore un rico ecosistema de aplicacións con Ethereum", + "nav-defi-description": "Unha alternativa aberta e global ó mercado financeiro tradicional", + "nav-desci-description": "Unha alternativa aberta e global ó sistema científico actual", + "nav-desoc-description": "Plataformas baseadas en cadeas de bloques para a interacción social e a creación de contido", + "nav-developers-docs": "Documentación para o desenvolvedor", + "nav-developers": "Programadores", + "nav-did-description": "Cree e sexa propietario dos seus identificadores descentralizados propios", + "nav-docs-description": "Documentación de axuda para entender e construír en Ethereum", + "nav-docs-design-description": "Descrición dos retos de deseño únicos de Web3, mellores prácticas e investigacións dos usuarios", + "nav-docs-design-label": "Elementos de deseño esenciais da experiencia de usuario e da IU", + "nav-docs-foundation-description": "Elementos esenciais para desenvolver en Ethereum", + "nav-docs-foundation-label": "Temas fundamentais", + "nav-docs-overview-description": "O lugar onde atopar documentación de programadores", + "nav-docs-stack-description": "Entender todos os detalles da pila de Ethereum", + "nav-docs-stack-label": "Stack de Ethereum", + "nav-eip-description": "Normas que especifican novas características ou procesos", + "nav-eip-label": "Propostas de mellora de Ethereum", + "nav-emerging-description": "Coñecer outros casos de uso máis recentes de Ethereum", + "nav-enterprise-description": "Aplicacións empresariais para Ethereum", + "nav-ethereum-org-description": "Este sitio web está impulsado pola comunidade: únase a nós e contribúa tamén", + "nav-ethereum-wallets-description": "Unha aplicación para interactuar coa sua conta de Ethereum", + "nav-events-description": "Descentralización e liberdade para que todo o mundo participe", + "nav-events-irl-description": "Cada mes teñen lugar grandes eventos de Ethereum en persoa e en liña", + "nav-events-label": "Comunidades e eventos", + "nav-events-online-description": "Centos de miles de entusiastas de Ethereum conciben estas comunidades en liña", + "nav-find-wallet-description": "As carteiras permítenlle usar criptomoedas", + "nav-find-wallet-label": "Elixa a súa carteira", + "nav-gas-fees-description": "Como se calculan as comisións por transacción das ETH", + "nav-get-eth-description": "Precisa ether (ETH) para empregar as aplicacións de Ethereum", + "nav-get-started-description": "Os seus primeiros pasos para usar Ethereum", + "nav-governance-description": "O proceso implicado na actualización do protocolo de Ethereum", + "nav-governance-label": "Gobernanza", + "nav-grants-description": "Unha lista seleccionada pola nosa comunidade de proxectos que ofrecen programas de financiamento mediante bolsas", + "nav-guide-create-account-description": "Calquera pode crear unha conta de Ethereum en calquera momento, gratuitamente, a través dunha aplicación de carteira", + "nav-guide-revoke-access-description": "Interactúe con contratos intelixentes e aplicacións no ecosistema de Ethereum de forma segura", + "nav-guide-revoke-access-label": "Como revocar o acceso a contratos intelixentes", + "nav-guide-use-wallet-description": "Domine o funcionamento de todas as funcións básicas da súa carteira", + "nav-guide-use-wallet-label": "Como usar unha carteira", + "nav-guides-description": "Guías prácticas paso a paso para axudalo a comezar", + "nav-guides-label": "Guías prácticas", + "nav-history-description": "Unha cronoloxía das actualizacións e bifurcacións principais", + "nav-history-label": "Historia técnica de Ethereum", + "nav-layer-2-description": "Transaccións máis rápidas e baratas para Ethereum", + "nav-learn-by-coding-description": "Ferramentas que lle permiten experimentar con Ethereum", + "nav-local-env-description": "Elixa e configure a súa pila de desenvolvemento de Ethereum", + "nav-mainnet-description": "As aplicacións de cadea de bloques para empresa pódense construír na rede principal e pública de Ethereum", + "nav-nft-description": "Unha forma de representar calquera cousa única como un activo baseado en Ethereum", + "nav-open-research-description": "Unha das principais fortalezas de Ethereum é a súa comunidade de investigación activa", + "nav-open-research-label": "Abrir investigación", + "nav-overview-description": "Recursos educativos de Ethereum", + "nav-participate-overview-description": "Resumen de como participar", + "nav-primary": "Primario", + "nav-quizzes-description": "Descubra en que medida entende Ethereum e as criptomoedas", + "nav-quizzes-label": "Poña a proba os seus coñecementos", + "nav-refi-description": "Un sistema económico alternativo baseado en principios rexenerativos", + "nav-research-description": "Procesos empregados para mellorar Ethereum", + "nav-research-label": "Investigación e desenvolvemento", + "nav-roadmap-description": "O principio para unha maior adaptabilidade, seguridade e sostibilidade para Ethereum", + "nav-roadmap-future-description": "Reforzar Ethereum como unha rede descentralizada e sólida", + "nav-roadmap-future-label": "Preparado para o futuro", + "nav-roadmap-label": "Folla de ruta", + "nav-roadmap-scaling-description": "Actualizacións de rede para reducir aínda máis os custos de transaccións e a velocidade", + "nav-roadmap-security-description": "Asegurarse de que Ethereum segue resistindo a todo tipo de ataques no futuro", + "nav-roadmap-security-label": "Seguridade mellorada", + "nav-roadmap-ux-description": "O uso de Ethereum debe simplificarse", + "nav-run-a-node-description": "Sexa completamente autónomo mentres axuda a protexer a rede", + "nav-security-description": "Aprenda as mellores prácticas con respecto ó uso de criptomoedas", + "nav-smart-contracts-description": "Os bloques de construción fundamentais do ecosistema de Ethereum", + "nav-stablecoins-description": "As moedas estables son os tokens de Ethereum deseñados para manterse a un valor fixo", + "nav-stake-description": "Gañe recompensas por protexer a Ethereum", + "nav-stake-label": "Participar", + "nav-staking-home-description": "Unha presentación das distintas opcións de participación", + "nav-staking-pool-description": "Participe e gañe recompensas con calquera cantidade de ETH ó unirse a outros", + "nav-staking-pool-label": "Participación agrupada", + "nav-staking-saas-label": "Participar cun servizo", + "nav-staking-solo-label": "Participación individual", + "nav-start-building-description": "Información útil para os que acaban de chegar", + "nav-translation-program-description": "Un esforzo conxunto para traducir ethereum.org a todos os idiomas", + "nav-tutorials-description": "Unha lista coidadosamente elaborada de tutoriais da comunidade", + "nav-use-cases-description": "Descubra diferentes ideas de uso de Ethereum", + "nav-what-is-ether-description": "A divisa das aplicacións de Ethereum", + "nav-what-is-ethereum-description": "Comprender que é o que fai que Ethereum sexa especial", + "nav-what-is-web3-label": "Que é Web3?", + "nav-what-is-web3-description": "Unha alternativa ós monopolios centralizados que establecen as normas", + "nav-whitepaper-description": "O documento técnico orixinal de Ethereum escrito por Vitalik Buterin en 2014", + "nav-zkp-description": "Unha forma de demostrar a validez dunha declaración sen ter que revelala", + "nft-page": "NFTs - Tokens non funxibles", + "nfts": "NFT", "no": "Non", "on-this-page": "Nesta páxina", + "open-research": "Abrir investigación", + "page-developers-aria-label": "Menú para programadores", + "page-index-meta-title": "Inicio", "page-last-updated": "Última actualización da páxina", + "participate": "Participa", + "participate-menu": "Menú Participar", + "pbs": "Separación do creador de propostas", + "pools": "Participación agrupada", "privacy-policy": "Política de privacidade", "private-ethereum": "Ethereum privado", + "product-disclaimer": "Os produtos e servizos enuméranse para a comodidade da comunidade Ethereum. A inclusión dun produto ou servizo non implica a súa recomendación por parte do equipo do sitio web ethereum.org nin da Fundación Ethereum.", + "quizzes-title": "Centro de cuestionarios", + "quizzes": "Cuestionarios", "refresh": "Por favor, actualice a páxina.", + "return-home": "volver ó inicio", + "roadmap": "Folla de ruta de Ethereum", + "research": "Investigación", + "research-menu": "Menú Investigación", + "resources": "Recursos de tradución", "run-a-node": "Executar un nó", + "rollup-component-website": "Website", + "rollup-component-developer-docs": "Documentación para desenvolvedores", + "rollup-component-technology-and-risk-summary": "Resumo da tecnoloxía e riscos", + "scaling": "Dimensionamento", + "saas": "Participación como servizo", "search": "Buscar", + "search-ethereum-org": "Buscar ethereum.org", + "secret-leader-election": "Elección de líder secreto", "search-box-blank-state-text": "Buscar noutro sitio!", "search-eth-address": "Isto parece un enderezo de Ethereum. Nós non fornecemos datos específicos para enderezos. Intente buscalo nun explorador de bloques como", "search-no-results": "Sen resultados para a súa busca", + "security": "Seguridade", + "single-slot-finality": "Finalidade dunha soa rañura", + "statelessness": "Apátrida", "see-contributors": "Ver colaboradores", "set-up-local-env": "Configurar ambiente local", - "sharding": "Cadeas de fragmentos", "show-all": "Mostrar todo", "show-less": "Mostrar menos", "site-description": "Ethereum é unha plataforma global e descentralizada para diñeiro e novos tipos de aplicacións. En Ethereum, pode escribir código que controle o diñeiro e construír aplicacións accesibles desde calquera parte do mundo.", - "site-title": "ethereum.org", "skip-to-main-content": "Ir ao contido principal", "smart-contracts": "Contratos intelixentes", "stablecoins": "Stablecoins", + "stake-eth": "Facer stake de ETH", "staking": "Staking", + "start-here": "Comezar aquí", + "solo": "Participación individual", + "support": "Soporte", "terms-of-use": "Termos de uso", "translation-banner-body-new": "Está a ver esta páxina en inglés porque aínda non a traducimos. Axúdenos a traducir este contido.", "translation-banner-body-update": "Existe unha nova versión desta páxina, pero polo momento só existe en inglés. Axúdenos a traducir a versión máis recente.", @@ -108,16 +298,25 @@ "translation-banner-button-translate-page": "Traducir páxina", "translation-banner-title-new": "Axude a traducir esta páxina", "translation-banner-title-update": "Axude a actualizar esta páxina", + "translation-banner-no-bugs-title": "Aquí non hai erros!", + "translation-banner-no-bugs-content": "Esta páxina non está a ser traducida. Deixamos esta páxina intencionalmente en inglés de momento.", + "translation-banner-no-bugs-dont-show-again": "Non amosar de novo", + "translation-program": "Programa de tradución", + "try-using-search": "Intente usar o buscador para atopar o que está a procurar ou", "tutorials": "Titoriais", + "up": "Subir", + "use": "Uso", "use-ethereum": "Usar Ethereum", "use-ethereum-menu": "Usar o menú de Ethereum", + "use-menu": "Menú Uso", + "verkle-trees": "Árbores Verkle", "wallets": "Carteiras", + "we-couldnt-find-that-page": "Non conseguimos atopar esta páxina", + "web3": "Que é Web3?", "website-last-updated": "Última actualización da web", "what-is-ether": "Que é o ether (ETH)?", "what-is-ethereum": "Que é Ethereum?", - "defi-page": "DeFi - Finanzas descentralizadas", - "dao-page": "DAO en inglés - Organizacións Autónomas Descentralizadas", - "nft-page": "NFTs - Tokens non funxibles", + "withdrawals": "Retiradas de participación", "yes": "Si", - "page-index-meta-title": "Inicio" + "zero-knowledge-proofs": "Probas de coñecemento cero" } diff --git a/src/intl/he/common.json b/src/intl/he/common.json index d0b492a23f4..0078e8169ad 100644 --- a/src/intl/he/common.json +++ b/src/intl/he/common.json @@ -1,17 +1,30 @@ { - "account-abstraction": "הפשטת חשבון", "about-ethereum-org": "אודות ethereum.org", "about-us": "אודותינו", + "adding-desci-projects": "הוספת פרויקטים Desci", + "adding-developer-tools": "הוספת כלי פיתוח", + "adding-exchanges": "הוספת בורסות", + "adding-glossary-terms": "הוספת מונחים למילון מונחים", + "adding-staking-products": "הוספת מוצרי סטייקינג", + "adding-wallets": "הוספת ארנקים", + "account-abstraction": "הפשטת חשבון", + "acknowledgements": "תודות", "aria-toggle-search-button": "החלף את לחצן החיפוש", "aria-toggle-menu-button": "החלף את לחצן התפריט", "beacon-chain": "Beacon Chain", "bridges": "גשרי בלוקצ'יין", + "bug-bounty": "תוכנת תמריצים לזיהוי שגיאות", + "build": "בנה", + "build-menu": "בנה תפריט", "clear": "נקה", "close": "סגור", "community": "קהילה", "community-hub": "בית הקהילה", "community-menu": "הקהילה", "contact": "צור קשר", + "content-buckets": "קטגוריות החומרים", + "content-resources": "משאבי תוכן", + "content-standardization": "סטנדרטיזציה של תוכן", "contributing": "תורמים", "contributors": "משתתפי הפרויקט", "contributors-thanks": "לכל מי שתרם לדף זה - תודה!", @@ -19,21 +32,45 @@ "copied": "מועתק", "copy": "העתק", "danksharding": "דנקסהארדינג", + "dao-page": "DAOs - ארגונים אוטונומיים מבוזרים", "dark-mode": "כהה", "data-provided-by": "מקור הנתונים:", "decentralized-applications-dapps": "Dapps - יישומים מבוזרים", + "decentralized-identity": "זהות מבוזרת", + "decentralized-social-networks": "רשת חברתית מבוזרת", "decentralized-science": "DeSci - מדע מבוזר", + "description": "תיאור פריט ניווט", + "defi-page": "DeFi - פיננסים מבוזרים", + "design": "עיצוב", + "design-principles": "עקרונות העיצוב", "devcon": "Devcon", "developers": "מפתחים", "developers-home": "דף הבית של מפתחים", - "docs": "מסמכים", - "documentation": "דוקומנטציה", + "docs": "תיעוד", + "docsearch-to-select": "לבחור", + "docsearch-to-navigate": "לעבור", + "docsearch-to-close": "לסגור", + "docsearch-search-by": "חיפוש לפי", + "docsearch-start-recent-searches-title": "לאחרונה", + "docsearch-start-no-recent-searches": "לא נמצאו חיפושים אחרונים", + "docsearch-start-save-recent-search": "שמור את החיפוש הזה", + "docsearch-start-remove-recent-search": "מחק את החיפוש הזה מהיסטורית חיפושים", + "docsearch-start-favorite-searches": "מועדף", + "docsearch-start-remove-favorite-search": "מחק חיפוש זה מהחיפושים המעודפים", + "docsearch-no-results-text": "אין תוצאות עבור", + "docsearch-no-results-suggested-query": "תנסה לחפש", + "docsearch-no-results-missing": "האם אתה מאמין שהמשפט צריך להחזיר תשובות?", + "docsearch-no-results-missing-link": "תודיע לנו.", + "docsearch-error-title": "לא ניתן להשיג תוצאות", + "docsearch-error-help": "ייתכן שתרצה לבדוק את חיבור האינטרנט שלך.", + "documentation": "תיעוד", + "down": "מטה", "ecosystem": "סביבת האקולוגיה", - "edit-page": "ערוך עמוד", + "edit-page": "דף עריכה", "ef-blog": "בלוג קרן אתריום", "eips": "הצעות לשיפור אטריום", "energy-consumption": "צריכת האנרגיה של אתריום", - "enterprise": "יוזמה", + "enterprise": "עסק", "enterprise-menu": "תפריט מיזם", "esp": "תוכנית תמיכה מערכת אקולוגית ", "eth-current-price": "מחיר ETH עכשווי (USD)", @@ -48,9 +85,11 @@ "ethereum-glossary": "מילון מונחי אטריום", "ethereum-governance": "הפיקוח של אתריום", "ethereum-logo": "לוגו אטריום", + "ethereum-roadmap": "מפת הדרכים של אתריום", + "ethereum-protocol": "פרוטוקול אתריום", "ethereum-security": "אבטחה של אתריום ומניעת הונאה", "ethereum-support": "תמיכת אתריום", - "ethereum-wallets": "ארנקי אטריום", + "ethereum-wallets": "ארנקי אתריום", "ethereum-whitepaper": "דפי הסבר אטריום", "feedback-widget-prompt": "האם הדף הזה מועיל?", "feedback-card-prompt-page": "האם הדף הזה עזר לך?", @@ -58,7 +97,7 @@ "feedback-card-prompt-tutorial": "האם המדריך הזה היה מועיל?", "feedback-widget-thank-you-title": "תודה על המשוב שלך!", "feedback-widget-thank-you-subtitle": "תעשה את הדף הזה אפילו יותר טוב אם תענה על כמה שאלות.", - "feedback-widget-thank-you-subtitle-ext": "אם אתה צריך עזרה, אתה יכול ליצור איתנו קשר בDiscord.", + "feedback-widget-thank-you-subtitle-ext": "אם נדרשת לך לעזרה, ניתן לפנות לקהילה בDiscord שלנו.", "feedback-widget-thank-you-timing": "2-3 דקות", "feedback-widget-thank-you-cta": "פתח שאלון קצר", "find-wallet": "محفظة", @@ -68,20 +107,18 @@ "get-started": "התחל", "grants": "מענקים", "grant-programs": "תוכנית מענקים של המערכת האקולוגית", - "guides-and-resources": "מדריכים ומשאבים של הקהילה", "guides": "מדריכים", - "guides-hub": "מרכז מדריכים", + "guides-hub": "מדריכים פרקטיים", "history-of-ethereum": "היסטוריה של אתריום", "home": "דף הבית", "how-ethereum-works": "איך אתריום עובד", - "how-to-create-an-ethereum-account": "איך \"לרשום\" חשבון אתריום", "how-to-revoke-token-access": "איך לבטל גישה של חוזה חכם לכספי הקריפטו שלך", "how-to-swap-tokens": "איך להחליף אסימונים", "how-to-use-a-bridge": "איך לגשר אסימונים לשכבה 2", "how-to-use-a-wallet": "איך להשתמש בארנק", "image": "איור", "in-this-section": "במדור זה", - "individuals": "יחיד", + "individuals": "יחידים", "jobs": "משרות", "kraken-logo": "לוגו של קראקן", "language-resources": "משאבי שפה", @@ -90,8 +127,9 @@ "last-24-hrs": "24 השעות האחרונות", "last-edit": "עריכה אחרונה", "layer-2": "שכבה 2", - "learn": "למדו", + "learn": "למד", "learn-by-coding": "למדו דרך תכנות", + "learn-hub": "מרכז למידה", "learn-menu": "תפריט למידה", "learn-more": "למדו עוד", "less": "פחות", @@ -100,33 +138,140 @@ "loading": "טוען...", "loading-error": "שגיאת טעינה.", "loading-error-refresh": "שגיאה, נא לרענן את העמוד.", + "loading-error-try-again-later": "לא ניתן לטעון מידע. נא לנסות שוב.", "logo": "לוגו", "mainnet-ethereum": "אתריום ב-Mainnet", + "merge": "מיזוג", "more": "יותר", - "nav-developers": "מפתחים", + "nav-about-description": "פרויקט פומבי עם קוד פתוח לקהילת אתריום", + "nav-advanced-description": "עיין בנושאים מורכבים יותר", + "nav-advanced-label": "מתקדם", + "nav-basics-description": "תבין את היסודות של אתריום", + "nav-basics-label": "יסודות", + "nav-bridges-description": "Web3 התפתחה למערכת אקולוגית של בלוקצ'יין בשכבה 1 ופתרונות, שניתן לעשות להם סקיילינג, בשכבה 2", + "nav-builders-home-description": "מדריך בונה באתריום - שנכתב ע\"י בונים ולבונים", + "nav-builders-home-label": "בית הבונים", + "nav-contribute-description": "אם ברצונך לעזור, הוא ידריך אותך", + "nav-contribute-label": "תרומה ל-ethereum.org", + "nav-dao-description": "קהילות בבעלות חברי הקהילות ללא סמכות מרכזית", + "nav-dapps-description": "גלה מערכת אקולוגית עשירה של אפליקציות ע\"י שימוש באתריום", + "nav-defi-description": "חלופה גלובלית ופתוחה לשוק הפיננסי המסורתי", + "nav-desci-description": "חלופה גלובלית ופתוחה למערכת המדעית הנוכחית", + "nav-desoc-description": "פלטפורמות המבוססות על בלוקצ'יין לאינטראקציה חברתית ויצירת תוכן", "nav-developers-docs": "מסמכי מפתחים", + "nav-developers": "מפתחים", + "nav-did-description": "הנפק את המזהים המבוזרים הייחודיים שלך ותהיה בעלים שלהם", + "nav-docs-description": "המסמכים לעזרתך כדי שתבין את אתריום ותבנה איתו", + "nav-docs-design-description": "תיאור האתגרים לעיצוב ייחודי ב-web3, שיטות עבודה הטובות ביותר, ותובנות במחקר של המשתמשים", + "nav-docs-design-label": "יסודות עיצוב UX/UI", + "nav-docs-foundation-description": "יסודות הליבה של פיתוח באתריום", + "nav-docs-overview-description": "הבית שלך למסמכי המפתח", + "nav-docs-stack-description": "תבין את כל הפרטים של אתריום", + "nav-eip-description": "התקנים המגדירים את התכונות או תהליכים החדשים", + "nav-eip-label": "הצעות לשיפור אתריום (EIP)", + "nav-emerging-description": "למד על מקרי שימוש חדשים אחרים באתריום", + "nav-enterprise-description": "אפליקציות עסקיות לאתריום", + "nav-ethereum-org-description": "האתר מונע ע\"י קהילה - הצטרף אלינו ותרום גם כן", + "nav-ethereum-wallets-description": "האפליקציה כדי לתקשר עם חשבון האתריום שלך", + "nav-events-description": "ביזור וחופש להשתתף לכל אחד", + "nav-events-irl-description": "כל חודש ישנם אירועים גדולים הקשורים לאתריום אופליין ואונליין", + "nav-events-label": "קהילות ואירועים", + "nav-events-online-description": "מאות אלפי חובבי אתריום משתתפים בקהילות האלה אונליין", + "nav-find-wallet-description": "הארנקים מאפשרים להשתמש במטבעות קריפטו", + "nav-find-wallet-label": "בחר את הארנק שלך", + "nav-gas-fees-description": "איך מחושבות עמלות עבור עסקאות עם שימוש ב-ETH", + "nav-get-eth-description": "כדי להשתמש באפליקציות אתריום נדרש אתריום (ETH)", + "nav-get-started-description": "הצעדים הראשונים שלך לשימוש באתריום", + "nav-governance-description": "התהליך המעורב בעדכון פרוטוקול אתריום", + "nav-governance-label": "פיקוח", + "nav-grants-description": "רשימת הפרויקטים המפוקחים ע\"י הקהילה שלנו, אשר מספקים תוכניות מימון באמצעות מענקים כספיים", + "nav-guide-create-account-description": "כל אחד יכול ליצור חשבון אתריום בכל עת בחינם עם אפליקציית ארנק", + "nav-guide-revoke-access-description": "תישארו מאובטחים כאשר אתם מתקשרים עם חוזים חכמים ואפליקציות במערכת אקולוגית של אתריום", + "nav-guide-revoke-access-label": "איך לשחזר גישה לחוזה חכם", + "nav-guide-use-wallet-description": "למד איך להפעיל את כל הפונקציות הבסיסיות של ארנק", + "nav-guide-use-wallet-label": "איך להשתמש בארנק", + "nav-guides-description": "מדריכים מעשיים צעד אחר צעד שיעזרו לך להתחיל", + "nav-guides-label": "מדריכים שמסבירים איך לעבוד", + "nav-history-description": "ציר הזמן של כל הפורקים ועדכונים העיקריים", + "nav-history-label": "היסטוריה טכנית של אתריום", + "nav-layer-2-description": "עסקאות זולות ומהירות יותר עם אתריום", + "nav-learn-by-coding-description": "הכלים שעוזרים לך לנסות את אתריום", + "nav-local-env-description": "בחר והגדר את ערכת פיתוח של אתרריום שלך", + "nav-mainnet-description": "אפליקציות עסקיות לעבודה עם בלוקצ'יינים ניתן לבנות ברשת Mainnet הציבורית של אתריום", + "nav-nft-description": "דרך להציג משהו ייחודי בתור נכס המבוסס על אתריום", + "nav-open-research-description": "אחד היתרונות העיקריים של אתריום הוא הקהילה המחקרית הפעילה", + "nav-open-research-label": "פתח מחקר", + "nav-overview-description": "כל הדברים בהדרכה בנושא אתריום", + "nav-participate-overview-description": "סקירה כללית על אופן השתתפות", "nav-primary": "עיקרי", + "nav-quizzes-description": "גלה עד כמה אתה מבין אתריום ומטבעות קריפטו", + "nav-quizzes-label": "בדוק את הידע שלך", + "nav-refi-description": "מערכת כלכלית חילופית הנבנית על עקרונות התחדשות", + "nav-research-description": "התהליכים שהיו בשימוש כדי לשפר אתריום", + "nav-research-label": "מחקר ופיתוח", + "nav-roadmap-description": "הדרך לסילומיות, בטיחות וקיימות של אתריום", + "nav-roadmap-future-description": "חיזוק אתריום כרשת חזקה ומבוזרת", + "nav-roadmap-future-label": "הגהה בעתיד", + "nav-roadmap-label": "מפת דרך", + "nav-roadmap-scaling-description": "עדכוני רשת להנמיך עוד יותר את העלויות ולהגביר מהירות", + "nav-roadmap-security-description": "כדי לוודא שאתריום יישאר עמיד בפני כל מיני התקפות בעתיד", + "nav-roadmap-security-label": "בטיחות משופרת", + "nav-roadmap-ux-description": "יש לפשט את השימוש באתריום", + "nav-run-a-node-description": "תהפוך להיות ריבון מוחלט בזמן ביצוע עזרה לאבטחת הרשת", + "nav-security-description": "למד שיטות עבודה הכי טובות בעת שימוש במטבעות קריפטו", + "nav-smart-contracts-description": "אבני הבניין הבסיסיות של המערכת האקולוגית של אתריום", + "nav-stablecoins-description": "מטבעות יציבים הם אסימוני אתריום שנועדו להישאר בעלי ערך קבוע", + "nav-stake-description": "הרוויחו פרסים על הבטחת אתריום", + "nav-stake-label": "הסכום הנעול", + "nav-staking-home-description": "סקירה כללית של אפשרויות שונות עבור סטייקינג", + "nav-staking-pool-description": "בצע סטייקינג ותרוויח פרסים עם כל סכום של אתריום ע\"י הצטרפות לאחרים", + "nav-staking-pool-label": "הפקדה מאוחדת", + "nav-staking-saas-label": "ביצוע סטייקינג באמצעות שירות", + "nav-staking-solo-label": "הפקד לבד", + "nav-start-building-description": "מידע שימושי למתחילים", + "nav-translation-program-description": "מאמץ משותף לתרגם את ethereum.org לכל השפות", + "nav-tutorials-description": "הרשימה המפוקחת של מדריכי הקהילה", + "nav-use-cases-description": "גלה רעיונות שימוש באתריום שונים", + "nav-what-is-ether-description": "מטבע אפליקציות אתריום", + "nav-what-is-ethereum-description": "תבין מה עושה אתריום מיוחד", + "nav-what-is-web3-label": "מה זה Web3?", + "nav-what-is-web3-description": "חלופה למונופולים העיקריים המכתיבים את הכללים", + "nav-whitepaper-description": "הספר הלבן המקורי של אתריום שנכתב על ידי ויטליק בוטרין בשנת 2014", + "nav-zkp-description": "דרך להוכיח את התקפות של אמירה מבלי לחשוף את ההצהרה עצמה", + "nft-page": "NFTs - אסימונים לא ניתנים לשינוי", "nfts": "NFTs", "no": "לא", "on-this-page": "בדף זה", "open-research": "פתח מחקר", + "page-developers-aria-label": "תפריט המפתחים", + "page-index-meta-title": "דף הבית", "page-last-updated": "הדף עודכן לאחרונה", + "participate-menu": "תפריט השתתפות", "pbs": "הפרדה של המציע-בונה", + "pools": "הפקדה מאוחדת", "privacy-policy": "מדיניות הפרטיות", "private-ethereum": "אתריום פרטי", + "product-disclaimer": "המוצרים והשירותים מפורטים כאפשרויות עבור קהילת אתריום. הכללת מוצר או שירות אינה מייצגת אישור של צוות האתר ethereum.org, או של קרן אתריום.", + "quizzes-title": "צומת חידונים", + "quizzes": "חידונים", "refresh": "נא לרענן את העמוד.", "return-home": "חזרה לדף הבית", "roadmap": "מפת הדרכים של אתריום", + "research": "מחקר", + "research-menu": "תפריט מחקר", + "resources": "משאבי תרגום", "run-a-node": "הפעל נוד", "rollup-component-website": "אתר אינטרנט", "rollup-component-developer-docs": "מדריכי מפתחים", "rollup-component-technology-and-risk-summary": "תקציר טכנולוגיה וסיכונים", - "scaling": "Scaling", + "saas": "הפקדה בתור שירות", "search": "חיפוש", + "search-ethereum-org": "חפש ב-ethereum.org", "secret-leader-election": "בחירת מנהיג בחשאי", "search-box-blank-state-text": "חפש!", "search-eth-address": "זה נראה כמו כתובת אתריום. אנחנו לא מספקים מידע על כתובות מסיומות. נסה לחפש בחוקרי בלוק", "search-no-results": "לא נמצאו תוצאות לחיפוש", + "security": "אבטחה", "single-slot-finality": "סופיות של משבצת אחת", "statelessness": "ללא מדינה", "see-contributors": "צפה בכל התורמים", @@ -135,15 +280,14 @@ "show-all": "הצג הכל", "show-less": "הצג פחות", "site-description": "אתריום הוא פלטפורמה גלובלית מבוזרת לכסף ולסוגים חדשים של יישומים. על גבי הפלטפורמה של אתריום ניתן לכתוב קוד ששולט על כסף ולבנות יישומים נגישים בכל מקום בעולם.", - "site-title": "ethereum.org", "skip-to-main-content": "דלג לתוכן העיקרי", "smart-contracts": "חוזים חכמים", "stablecoins": "מטבעות יציבים", + "stake-eth": "ETH להימור", "staking": "מפקיד", + "start-here": "התחל כאן", "solo": "הפקד לבד", - "saas": "הפקדה בתור שירות", - "pools": "הפקדה מאוחדת", - "withdrawals": "משיכות הימור", + "support": "תמיכה", "terms-of-use": "תנאי שימוש", "translation-banner-body-new": "אתה רואה עמוד זה באנגית מכיוון שעוד לא תירגמנו אותו. עזור לנו לתרגם את התוכן הזה.", "translation-banner-body-update": "יש גרסה חדשה יותר של הדף הזה אבל הוא כרגע זמין רק באנגלית. עזור לנו לתרגם את הגרסה העדכנית.", @@ -154,26 +298,23 @@ "translation-banner-no-bugs-title": "אין כאן באגים!", "translation-banner-no-bugs-content": "הדף הזה לא הולך להיות מתורגם כעת. השארנו דף זה באנגלית בכוונה לעת עתה.", "translation-banner-no-bugs-dont-show-again": "אל תציג שוב", + "translation-program": "תוכנית תרגום", "try-using-search": "נסה להשתמש בחיפוש כדאי למצוא מה שאתה מחפש", "tutorials": "הדרכות", + "up": "למעלה", + "use": "השתמש", "use-ethereum": "השתמשו באתריום", "use-ethereum-menu": "השתמש באתריום", - "user-experience": "User experience", + "use-menu": "תפריט שימוש", "verkle-trees": "עצי ורקל", "wallets": "ארנקים", "we-couldnt-find-that-page": "לא הצלחנו למצוא עמוד זה", "web3": "מה זה Web3?", "web3-title": "Web3", "website-last-updated": "אתר האינטרנט עודכן לאחרונה", - "what-is-ether": "מה זה אתר (ETH)?", + "what-is-ether": "מה זה אית'ר (ETH)?", "what-is-ethereum": "מה זה אתריום?", - "defi-page": "DeFi - פיננסים מבוזרים", - "dao-page": "DAOs - ארגונים אוטונומיים מבוזרים", - "nft-page": "NFTs - אסימונים לא ניתנים לשינוי", - "decentralized-social-networks": "רשת חברתית מבוזרת", - "decentralized-identity": "זהות מבוזרת", + "withdrawals": "משיכות הימור", "yes": "כן", - "zero-knowledge-proofs": "הוכחות אפס ידע", - "ethereum-roadmap": "מפת הדרכים של אתריום", - "page-index-meta-title": "דף הבית" + "zero-knowledge-proofs": "הוכחות אפס ידע" } diff --git a/src/intl/hi/common.json b/src/intl/hi/common.json index 43f5797f6e8..c0dd7a97810 100644 --- a/src/intl/hi/common.json +++ b/src/intl/hi/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "खाता ऐब्स्ट्रैक्शन", "about-ethereum-org": "ethereum.org के बारे में", "about-us": "हमारे बारे में", + "adding-desci-projects": "Desci प्रोजेक्ट जोड़ना", + "adding-developer-tools": "डेवलपर टूल जोड़ना", + "adding-exchanges": "एक्सचेंज जोड़ना", + "adding-glossary-terms": "ग्लॉसरी के शब्द जोड़ना", + "adding-staking-products": "स्टेकिंग प्रोडक्ट जोड़ना", + "adding-wallets": "वॉलेट जोड़ना", + "account-abstraction": "खाता ऐब्स्ट्रैक्शन", + "acknowledgements": "पावतियाँ", "aria-toggle-search-button": "खोज बटन टॉगल करें", "aria-toggle-menu-button": "मेनू बटन टॉगल करें", "beacon-chain": "बीकन चेन", "bridges": "ब्लॉकचेन ब्रिज", + "bug-bounty": "बग बाउंटी", + "build": "बिल्ड", + "build-menu": "बिल्ड मेनू", "clear": "स्पष्ट करें", "close": "बंद करे", "community": "कम्युनिटी", "community-hub": "सामुदायिक फ़ोरम", "community-menu": "कम्युनिटी मेनू", "contact": "संपर्क करें", + "content-buckets": "कंटेंट बकेट", + "content-resources": "कंटेंट संसाधन", "content-standardization": "अंतर्वस्तु मानकीकरण", "contributing": "सहयोग करना", "contributors": "योगदानकर्ता", @@ -27,7 +39,10 @@ "decentralized-identity": "विकेन्द्रीकृत पहचान", "decentralized-social-networks": "विकेन्द्रीकृत सोशल नेटवर्क", "decentralized-science": "DeSci - विकेंद्रित विज्ञान", + "description": "नेविगेशन आइटम का ब्यौरा", "defi-page": "DeFi - विकेन्द्रीकृत वित्त", + "design": "डिज़ाइन", + "design-principles": "डिज़ाइन सिद्धांत", "devcon": "डेवकॉन", "developers": "डेवलपर", "developers-home": "डेवलपर के लिए मुखपृष्ठ", @@ -59,11 +74,11 @@ "enterprise-menu": "एंटरप्राइज़ मेनू", "esp": "इकोसिस्टम सहायता कार्यक्रम", "eth-current-price": "वर्तमान ETH मूल्य (USD)", - "ethereum-basics": "Ethereum की मूल बातें", + "ethereum-basics": "इथेरियम की मूल बातें", "ethereum-bug-bounty": "इथेरियम बग बाउंटी कार्यक्रम", "consensus-when-shipping": "यह कब शिप हो रहा है?", "ethereum-upgrades": "एथेरियम के अपग्रेड", - "ethereum-brand-assets": "इथेरियम ब्रांड संपत्ति", + "ethereum-brand-assets": "इथेरियम ब्रांड की संपत्ति", "ethereum-online": "ऑनलाइन समुदाय", "ethereum-events": "एथेरियम इवेंट्स", "ethereum-foundation": "Ethereum फाउंडेशन", @@ -75,7 +90,7 @@ "ethereum-protocol": "इथेरियम प्रोटोकॉल", "ethereum-security": "Ethereum सुरक्षा और धोखाधड़ी से रोकथाम", "ethereum-support": "एथेरियम सपोर्ट", - "ethereum-wallets": "Ethereum वॉलेट", + "ethereum-wallets": "इथेरियम वॉलेट", "ethereum-whitepaper": "Ethereum व्हाइटपेपर", "feedback-widget-prompt": "क्या यह पृष्ठ सहायक है?", "feedback-card-prompt-page": "क्या यह पेज सहायक था?", @@ -83,7 +98,7 @@ "feedback-card-prompt-tutorial": "क्या यह ट्यूटोरियल सहायक था?", "feedback-widget-thank-you-title": "आपकी प्रतिक्रिया के लिए धन्यवाद!", "feedback-widget-thank-you-subtitle": "कुछ सवालों के जवाब देकर इस पेज को और बेहतर बनाएं।", - "feedback-widget-thank-you-subtitle-ext": "अगर आपको मदद चाहिए, तो आप हमारे Discord पर समुदाय से संपर्क कर सकते हैं।", + "feedback-widget-thank-you-subtitle-ext": "अगर आपको मदद चाहिए तो आप हमारे Discord पर कम्युनिटी से संपर्क कर सकते हैं।", "feedback-widget-thank-you-timing": "2–3 मिनट", "feedback-widget-thank-you-cta": "लघु सर्वेक्षण खोलें", "find-wallet": "वॉलेट खोजें", @@ -94,11 +109,11 @@ "grants": "अनुदान", "grant-programs": "इकोसिस्टम ग्रांट प्रोग्राम", "guides": "मार्गदर्शक", - "guides-hub": "मार्गदर्शक केंद्र", + "guides-hub": "कैसे-करें मार्गदर्शिकाएं", "history-of-ethereum": "Ethereum का इतिहास", "home": "मुखपृष्ठ", "how-ethereum-works": "Ethereum कैसे काम करता है", - "how-to-register-an-ethereum-account": "एथेरियम खाते को \"पंजीकृत\" कैसे करें", + "how-to-create-an-ethereum-account": "इथेरियम खाते को कैसे \"बनाएं\"", "how-to-revoke-token-access": "अपने क्रिप्टो कोष के लिए स्मार्ट अनुबंध के प्रवेश को कैसे रद्द करें", "how-to-swap-tokens": "टोकन कैसे स्वैप करें", "how-to-use-a-bridge": "टोकन को दूसरी परत से कैसे जोड़े", @@ -116,7 +131,7 @@ "layer-2": "परत 2", "learn": "सीखें", "learn-by-coding": "कोडिंग द्वारा सीखें", - "learn-hub": "लर्न केंद्र", + "learn-hub": "लर्न हब", "learn-menu": "सीखने का मेनू", "learn-more": "अधिक जानें", "less": "कम", @@ -128,10 +143,112 @@ "loading-error-try-again-later": "डेटा लोड नहीं किया जा सका। बाद में फिर से कोशिश करें।", "logo": "लोगो", "mainnet-ethereum": "Ethereum का मुख्य नेटवर्क", + "merge": "मर्ज करें", "more": "अधिक", - "nav-developers": "डिवेलपर्स", + "nav-about-description": "एथेरियम कम्युनिटी के लिए एक पब्लिक, ओपन-सोर्स प्रोजेक्ट", + "nav-advanced-description": "ज़्यादा जटिल विषयों को जानें", + "nav-advanced-label": "उन्नत", + "nav-basics-description": "एथेरियम की बुनियादी बातों को समझें", + "nav-basics-label": "बुनियादी बातें", + "nav-bridges-description": "Web3 विकसित होकर प्राइमरी L1 ब्लॉकचेन और L2 स्केलिंग सॉल्यूशन का एक इकोसिस्टम बन गया हैं", + "nav-builders-home-description": "एथेरियम का एक बिल्डर्स मेनू—बिल्डरों द्वारा, बिल्डरों के लिए", + "nav-builders-home-label": "बिल्डर्स होम", + "nav-contribute-description": "अगर आप मदद करना चाहते हैं, तो यह आपको गाइड करेगा", + "nav-contribute-label": "Ethereum.org में योगदान", + "nav-dao-description": "केंद्रीकृत प्राधिकरण के बिना सदस्य के स्वामित्व वाली कम्युनिटी", + "nav-dapps-description": "एथेरियम का इस्तेमाल करके ऐप्स के एक रिच इकोसिस्टम को एक्सप्लोर करें", + "nav-defi-description": "परंपरागत वित्तीय बाज़ार का एक वैश्विक, खुला विकल्प", + "nav-desci-description": "मौजूदा वैज्ञानिक प्रणाली का एक वैश्विक, खुला विकल्प", + "nav-desoc-description": "सामाजिक संपर्क और सामग्री निर्माण के लिए ब्लॉकचेन-आधारित प्लेटफ़ॉर्म", "nav-developers-docs": "डिवेलपर्स डॉक्यूमेंट", + "nav-developers": "डेवलपर", + "nav-did-description": "अपने अद्वितीय विकेन्द्रीकृत पहचानकर्ता जारी करें और उनके मालिक बनें", + "nav-docs-description": "एथेरियम को समझने और बनाने में आपकी मदद करने वाले दस्तावेज़", + "nav-docs-design-description": "अनोखे web3 डिज़ाइन से जुड़ी चुनौतियों, सबसे अच्छे तरीकों और यूज़र रिसर्च इनसाइट का ब्यौरा", + "nav-docs-design-label": "UX/UI डिज़ाइन की बुनियादी बातें", + "nav-docs-foundation-description": "एथेरियम पर विकसित करने की मुख्य बुनियादी बातें", + "nav-docs-foundation-label": "मूलभूत विषय", + "nav-docs-overview-description": "डिवेलपर से जुड़े दस्तावेज़ों के लिए आपका घर", + "nav-docs-stack-description": "एथेरियम स्टैक का सारा विवरण समझें", + "nav-docs-stack-label": "इथेरियम स्टैक", + "nav-eip-description": "नए फ़ीचर और प्रोसेस के बारे में बताने वाले मानक", + "nav-eip-label": "एथेरियम सुधार प्रस्ताव (EIP)", + "nav-emerging-description": "एथेरियम के दूसरे नए उपयोग से जुड़े मामलों के बारे में जानें", + "nav-emerging-label": "उभरते उपयोग के मामले", + "nav-enterprise-description": "एथेरियम के लिए बिज़नेस एप्लिकेशन", + "nav-ethereum-org-description": "यह वेबसाइट कम्युनिटी से चलती है—हमसे जुड़ें और योगदान भी दें", + "nav-ethereum-wallets-description": "आपके एथेरियम खाते के साथ इंटरैक्ट करने वाला ऐप", + "nav-events-description": "विकेंद्रीकरण और किसी के लिए भी भाग लेने की आज़ादी", + "nav-events-irl-description": "हर महीने व्यक्तिगत और ऑनलाइन बड़े एथेरियम इवेंट्स होते हैं", + "nav-events-label": "कम्युनिटी और इवेंट्स", + "nav-events-online-description": "एथरियम को लेकर उत्साह रखने वाले सैकड़ों-हजारों उत्साही पिता शामिल हैं", + "nav-find-wallet-description": "वॉलेट आपको क्रिप्टो का इस्तेमाल करने देते हैं", + "nav-find-wallet-label": "अपना वॉलेट चुनें", + "nav-gas-fees-description": "ETH लेनदेन शुल्क की गणना कैसे की जाती है", + "nav-get-eth-description": "एथेरियम एप्लिकेशन का इस्तेमाल करने के लिए आपको एथर (ETH) की ज़रूरत होती है", + "nav-get-started-description": "एथेरियम का इस्तेमाल करने के लिए आपके पहले कदम", + "nav-governance-description": "इस प्रोसेस में एथेरियम प्रोटोकॉल को अपग्रेड करना शामिल है", + "nav-governance-label": "गवर्नेंस", + "nav-grants-description": "ग्रांट फ़ंडिंग प्रोग्राम उपलब्ध कराने वाले प्रोजेक्ट पर हमारी कम्युनिटी द्वारा क्यूरेट की गई लिस्ट", + "nav-guide-create-account-description": "कोई भी व्यक्ति किसी भी समय, किसी वॉलेट ऐप की मदद से एथेरियम खाता मुफ़्त में बना सकता है", + "nav-guide-create-account-label": "इथेरियम खाते को कैसे बनाएं", + "nav-guide-revoke-access-description": "एथेरियम इकोसिस्टम में स्मार्ट अनुबंधों और एप्लिकेशन के साथ इंटरैक्ट करते समय सुरक्षित रहें", + "nav-guide-revoke-access-label": "स्मार्ट अनुबंध का एक्सेस निरस्त कैसे करें", + "nav-guide-use-wallet-description": "किसी वॉलेट के सभी बुनियादी फ़ंक्शन के काम करने का तरीका जानें", + "nav-guide-use-wallet-label": "वॉलेट का उपयोग कैसे करें", + "nav-guides-description": "शुरुआत करने में आपकी मदद के लिए व्यावहारिक चरण-दर-चरण गाइड", + "nav-guides-label": "कैसे-करें गाइड", + "nav-history-description": "सभी बड़े फ़ोर्क और अपडेट की टाइमलाइन", + "nav-history-label": "एथेरियम का तकनीकी इतिहास", + "nav-layer-2-description": "एथेरियम के लिए सस्ते और तेज़ लेनदेन", + "nav-learn-by-coding-description": "एथेरियम के साथ प्रयोग करने में आपकी मदद करने वाले उपकरण", + "nav-local-env-description": "अपना एथेरियम डेवलपमेंट स्टैक चुनें और सेट अप करें", + "nav-mainnet-description": "एंटरप्राइज़ ब्लॉकचेन एप्लिकेशन पब्लिक एथेरियम मेननेट पर बनाए जा सकते हैं", + "nav-nft-description": "किसी भी अनोखी चीज़ को एथेरियम-आधारित एसेट के तौर पर पेश करने का तरीका", + "nav-open-research-description": "एथेरियम की प्रमुख खूबियों में से एक है इसकी एक्टिव रिसर्च कम्युनिटी", + "nav-open-research-label": "शोध खोलें", + "nav-overview-description": "एथेरियम से जुड़ी शिक्षा के बारे में सबकुछ", + "nav-overview-label": "अवलोकन", + "nav-participate-overview-description": "भाग लेने के तरीके के बारे में खास जानकारी", "nav-primary": "प्राथमिक", + "nav-private-description": "निजी उद्यम एथेरियम के लिए विकासकर्ता संसाधन", + "nav-quizzes-description": "पता करें कि आप एथेरियम और क्रिप्टोकरेंसी को कितनी अच्छी तरह समझते हैं", + "nav-quizzes-label": "अपनी जानकारी को परखें", + "nav-refi-description": "रिजेनेरेटिव प्रिंसिपल्स पर बना एक वैकल्पिक इकोनॉमिक सिस्टम", + "nav-research-description": "एथेरियम को बेहतर बनाने के लिए इस्तेमाल की जाने वाली प्रोसेस", + "nav-research-label": "रिसर्च और डेवलपमेंट", + "nav-roadmap-description": "एथेरियम के लिए ज़्यादा स्केलेबिलिटी, सुरक्षा और स्थिरता का रास्ता", + "nav-roadmap-future-description": "एथेरियम को एक तेज़ और विकेंद्रीकृत नेटवर्क की तरह मज़बूत बनाना", + "nav-roadmap-future-label": "फ़्यूचर-प्रूफ़िंग", + "nav-roadmap-label": "रोडमैप", + "nav-roadmap-scaling-description": "लेनदेन के खर्चों और गति को और भी कम करने के लिए नेटवर्क से जुड़े अपडेट", + "nav-roadmap-security-description": "यह पक्का करना कि एथेरियम भविष्य में सभी तरह के हमलों को लेकर लचीला बना रहे", + "nav-roadmap-security-label": "बेहतर सुरक्षा", + "nav-roadmap-ux-description": "एथेरियम के इस्तेमाल को आसान बनाने की ज़रूरत हैं", + "nav-run-a-node-description": "नेटवर्क को सुरक्षित करने में मदद करते समय पूरी तरह से आत्मनिर्भर बनना", + "nav-security-description": "क्रिप्टोकरेंसी का इस्तेमाल करते समय सबसे अच्छे तरीकों को जानना", + "nav-smart-contracts-description": "एथेरियम इकोसिस्टम के बुनियादी बिल्डिंग ब्लॉक", + "nav-stablecoins-description": "स्टेबलकॉइन एक तय कीमत पर बने रहने के लिए डिज़ाइन किए गए एथेरियम टोकन हैं", + "nav-stake-description": "एथेरियम को सुरक्षित करने के लिए रिवॉर्ड जीतें", + "nav-stake-label": "स्टेक", + "nav-staking-home-description": "स्टेकिंग के अलग-अलग विकल्पों के बारे में खास जानकारी", + "nav-staking-home-label": "स्टेकिंग होम", + "nav-staking-pool-description": "दूसरों के साथ जुड़कर स्टेक करें और ETH की कितनी भी राशि के रिवॉर्ड जीतें", + "nav-staking-pool-label": "संयोजित स्टेकिंग", + "nav-staking-saas-description": "तीसरे पक्ष के नोड ऑपरेटर आपके सत्यापनकर्ता क्लाइंट के संचालन को संभालते हैं", + "nav-staking-saas-label": "किसी सेवा के साथ स्टेक करना", + "nav-staking-solo-description": "होम हार्डवेयर चलाएं और व्यक्तिगत रूप से इथेरियम नेटवर्क की सुरक्षा और विकेंद्रीकरण में जोड़ें", + "nav-staking-solo-label": "एकल स्टेकिंग", + "nav-start-building-description": "नए लोगों के लिए उपयोगी जानकारी", + "nav-translation-program-description": "Ethereum.org का सभी भाषाओं में अनुवाद करने की एक सहयोगी कोशिश", + "nav-tutorials-description": "कम्युनिटी ट्यूटोरियल की क्यूरेट की गई लिस्ट", + "nav-use-cases-description": "एथेरियम के इस्तेमाल के अलग-अलग तरीके जानें", + "nav-what-is-ether-description": "एथेरियम ऐप्स की करेंसी", + "nav-what-is-ethereum-description": "समझें कि एथेरियम को क्या चीज़ खास बनाती हैं", + "nav-what-is-web3-label": "Web3 क्या है?", + "nav-what-is-web3-description": "नियमों को निर्धारित करने वाले केंद्रीकृत एकाधिकार का एक विकल्प", + "nav-whitepaper-description": "विटालिक बूटरिन द्वारा 2014 में लिखा गया ओरिजनल एथेरियम व्हाइट पेपर", + "nav-zkp-description": "किसी कथन का खुलासा किए बिना उस कथन की वैधता साबित करने का एक तरीका", "nft-page": "NFT - नॉन-फंजिबल टोकन", "nfts": "NFTs", "no": "नहीं", @@ -140,6 +257,8 @@ "page-developers-aria-label": "डेवलपर के मेन्यू", "page-index-meta-title": "मुखपृष्ठ", "page-last-updated": "पृष्ठ अंतिम बार अपडेट किया गया", + "participate": "भाग लें", + "participate-menu": "भाग लेने का मेनू", "pbs": "प्रस्तावक-निर्माणकर्ता पृथक्करण", "pools": "संयोजित स्टेकिंग", "privacy-policy": "गोपनीयता नीति", @@ -150,9 +269,11 @@ "refresh": "कृपया पेज को रिफ्रेश करें।", "return-home": "होम पेज पर लौटें", "roadmap": "एथेरियम दिशानिर्देश", + "research": "रिसर्च", + "research-menu": "रिसर्च मेनू", "resources": "अनुवाद के संसाधन", "regenerative-finance": "ReFi - रीजेनेरेटिव फाइनेंस", - "run-a-node": "नोड चलाएँ", + "run-a-node": "नोड चलाएं", "rollup-component-website": "वेबसाइट", "rollup-component-developer-docs": "डिवेलपर डॉक्यूमेंट", "rollup-component-technology-and-risk-summary": "टेक्नोलॉजी और जोखिम का सारांश", @@ -164,6 +285,7 @@ "search-box-blank-state-text": "खोज करें!", "search-eth-address": "यह Ethereum पते की तरह दिखता है। हम पते के लिए विशिष्ट डेटा प्रदान नहीं करते हैं। ब्लॉक एक्सप्लोरर पर खोज करने का प्रयास करें, जैसे", "search-no-results": "आपकी खोज का कोई परिणाम नहीं है", + "security": "सुरक्षा", "single-slot-finality": "सिंगल-स्लॉट अन्तिम स्थिति", "statelessness": "स्तिथि हीनता", "see-contributors": "योगदानकर्ताओं को देखें", @@ -175,12 +297,12 @@ "site-title": "ethereum.org", "skip-to-main-content": "मुख्य सामग्री पर जाएँ", "smart-contracts": "स्मार्ट अनुबंध", - "stablecoins": "स्टेबलकॉइन", + "stablecoins": "स्थिर कॉइन", "stake-eth": "स्टेक ETH", "staking": "स्टेकिंग", "start-here": "यहाँ से शुरू करें", - "style-guide": "Style guide", "solo": "एकल स्टेकिंग", + "support": "सपोर्ट", "terms-of-use": "उपयोग की शर्तें", "translation-banner-body-new": "आप इस पृष्ठ को अंग्रेज़ी में देख रहे हैं क्योंकि हमने अभी तक इसका अनुवाद नहीं किया है। इस सामग्री का अनुवाद करने में हमारी सहायता करें।", "translation-banner-body-update": "इस पृष्ठ का एक नया संस्करण है लेकिन अभी यह केवल अंग्रेजी में है। नवीनतम संस्करण का अनुवाद करने में हमारी सहायता करें।", @@ -191,20 +313,22 @@ "translation-banner-no-bugs-title": "इसमें कोई बग नहीं है!", "translation-banner-no-bugs-content": "इस पेज का अनुवाद नहीं किया जा रहा है। हमने इस पेज को जानबूझकर अंग्रेज़ी में छोड़ा है।", "translation-banner-no-bugs-dont-show-again": "फिर से न दिखाएँ", + "translation-program": "अनुवाद कार्यक्रम", "try-using-search": "आप जो चीज़ ढूँढ रहे हैं, उसके लिए खोज का उपयोग करके देखें या", "tutorials": "ट्यूटोरियल", "up": "ऊपर", + "use": "इस्तेमाल", "use-ethereum": "Ethereum का प्रयोग करें", "use-ethereum-menu": "Ethereum मेनू का प्रयोग करें", - "user-experience": "User का अनुभव", + "use-menu": "मेनू का इस्तेमाल करें", + "user-experience": "यूज़र का अनुभव", "verkle-trees": "वर्कल ट्री", "wallets": "वॉलेट", "we-couldnt-find-that-page": "हमें यह पेज नहीं मिल सका", "web3": "Web3 क्या है?", - "web3-title": "Web3", "website-last-updated": "वेबसाइट अंतिम बार अपडेट की गई", "what-is-ether": "ईथर (ETH) क्या है?", - "what-is-ethereum": "Ethereum क्या है?", + "what-is-ethereum": "इथेरियम क्या है?", "withdrawals": "स्टेकिंग निकालना", "yes": "हाँ", "zero-knowledge-proofs": "शून्य-ज्ञान प्रमाण" diff --git a/src/intl/hr/common.json b/src/intl/hr/common.json index 6790cfd3a3f..3171b483a7d 100644 --- a/src/intl/hr/common.json +++ b/src/intl/hr/common.json @@ -5,8 +5,6 @@ "adding-developer-tools": "Dodavanje alata za razvojne programere", "adding-exchanges": "Dodavanje mjenjačnica", "adding-glossary-terms": "Dodavanje pojmova", - "adding-layer-2s": "Adding Layer 2s", - "adding-products": "Adding Products", "adding-staking-products": "Dodavanje ulagačkih proizvoda", "adding-wallets": "Dodavanje novčanika", "account-abstraction": "Apstrakcija računa", @@ -15,6 +13,9 @@ "aria-toggle-menu-button": "Gumb za izbornik", "beacon-chain": "Beacon Chain", "bridges": "Blockchain mostovi", + "bug-bounty": "Nagrada za pogrešku", + "build": "Izgradnja", + "build-menu": "Gradivni izbornik", "clear": "Obriši", "close": "Zatvori", "community": "Zajednica", @@ -38,6 +39,7 @@ "decentralized-identity": "Decentraliziran identitet", "decentralized-social-networks": "Decentralizirane društvene mreže", "decentralized-science": "DeSci - Decentralizirana znanost", + "description": "Opis navigacijske stavke", "defi-page": "DeFi - Decentralizirane financije", "design": "Dizajn", "design-principles": "Principi dizajna", @@ -72,11 +74,10 @@ "enterprise-menu": "Izbornik poduzeća", "esp": "Program potpore ekosustavu", "eth-current-price": "Trenutačna cijena ETH (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Ethereum program nagrađivanja lova na pogreške", "consensus-when-shipping": "Kada kreće?", "ethereum-upgrades": "Ethereum nadogradnje", - "ethereum-brand-assets": "Sredstva marke Ethereum", + "ethereum-brand-assets": "Imovina marke Ethereum", "ethereum-online": "Zajednice na internetu", "ethereum-events": "Ethereum događaji", "ethereum-foundation": "Zaklada Ethereum", @@ -88,7 +89,7 @@ "ethereum-protocol": "Ethereum protokol", "ethereum-security": "Sigurnost Ethereuma i sprječavanje prijevara", "ethereum-support": "Ethereum podrška", - "ethereum-wallets": "Novčanici Ethereum", + "ethereum-wallets": "Ethereumovi novčanici", "ethereum-whitepaper": "Ethereumova tehnička dokumentacija", "feedback-widget-prompt": "Je li ova stranica korisna?", "feedback-card-prompt-page": "Je li ova stranica bila korisna?", @@ -107,11 +108,10 @@ "grants": "Stipendije", "grant-programs": "Programi stipendiranja ekosustava", "guides": "Vodiči", - "guides-hub": "How-to guides", + "guides-hub": "Vodiči sa smjernicama", "history-of-ethereum": "Povijest Ethereuma", "home": "Početna", "how-ethereum-works": "Kako Ethereum radi", - "how-to-create-an-ethereum-account": "How to \"create\" an Ethereum account", "how-to-revoke-token-access": "Kako pametnom ugovoru oduzeti pravo pristupa vašim kripto sredstvima", "how-to-swap-tokens": "Kako zamijeniti tokene", "how-to-use-a-bridge": "Kako premostiti tokene na 2. sloj", @@ -143,9 +143,104 @@ "mainnet-ethereum": "Glavna mreža Ethereum", "merge": "Spoji", "more": "Više", - "nav-developers": "Programeri", + "nav-about-description": "Javni projekt otvorenog izvornika za zajednicu Ethereuma", + "nav-advanced-description": "Upoznajte složenije teme", + "nav-advanced-label": "Napredno", + "nav-basics-description": "Razumijevanje temelja Ethereuma", + "nav-basics-label": "Osnove", + "nav-bridges-description": "Web3 razvio se u ekosustav primarnih L1 lanaca blokova i L2 rješenja za skaliranje", + "nav-builders-home-description": "Graditeljski priručnik za Ethereum – od graditelja, za graditelje", + "nav-builders-home-label": "Dom za gradiitelje", + "nav-contribute-description": "Ako želite pomoći, ovo će vam pokazati put", + "nav-contribute-label": "Doprinesite web-mjestu ethereum.org", + "nav-dao-description": "Zajednice u vlasništvu svojih članova bez centraliziranog nadzornog tijela", + "nav-dapps-description": "Istražite bogati ekosustav aplikacija uz Ethereum", + "nav-defi-description": "Globalna, otvorena alternativa tradicionalnom financijskom tržištu", + "nav-desci-description": "Globalna, otvorena alternativa trenutačnom znanstvenom sustavu", + "nav-desoc-description": "Platforma temeljena na blokovima lanaca za društvene interakcije i izradu sadržaja", "nav-developers-docs": "Dokumenti za programere", + "nav-developers": "Programeri", + "nav-did-description": "Izradite i posjedujte vlastite jedinstvene, decentralizirane identifikatore", + "nav-docs-description": "Dokumenti koji će vam pomoći da razumijete Ethereum i gradite njime", + "nav-docs-design-description": "Opis jedinstvenih izazova, najboljih praksi i uvida u korisnička istraživanja za web3 dizajn", + "nav-docs-design-label": "Temelji dizajna korisničkog iskustva/sučelja", + "nav-docs-foundation-description": "Osnovne razvoja na Ethereumu", + "nav-docs-foundation-label": "Temeljne teme", + "nav-docs-overview-description": "Vaš dom dokumentacije za razvojni tim", + "nav-docs-stack-description": "Razumijevanje svih pojedinosti Ethereumovih stogova", + "nav-docs-stack-label": "Ethereumovi stogovi", + "nav-eip-description": "Standardi koji definiraju nove značajke ili postupke", + "nav-eip-label": "Prijedlozi za poboljšanje Ethereuma (EIP)", + "nav-emerging-description": "Upoznajte novije slučajeve upotrebe Ethereuma", + "nav-enterprise-description": "Poslovne primjene Ethereuma", + "nav-ethereum-org-description": "Ovo web-mjesto pokreće zajednica – pridružite nam se i doprinesite svojim sudjelovanjem", + "nav-ethereum-wallets-description": "Aplikacija za interakciju sa svojim Ethereum računom", + "nav-events-description": "Decentralizacija i sloboda sudjelovanja za sve", + "nav-events-irl-description": "Svakog mjeseca dostupni su značajni Ethereumovi događaji, na mreži ili na lokaciji", + "nav-events-label": "Zajednice i događaji", + "nav-events-online-description": "Stotine tisuća Ethereumovih entuzijasta sudjeluju u ovim mrežnim zajednicama", + "nav-find-wallet-description": "Novčanici vam omugućuju korištenje kriptovalutom", + "nav-find-wallet-label": "Odaberite svoj novčanik", + "nav-gas-fees-description": "Kako se izračunavaju naknade za transakcije ETH-om", + "nav-get-eth-description": "Za upotrebu Ethereum aplikacija potreban vam je ether (ETH)", + "nav-get-started-description": "Prvi koraci u radu s Ethereumom", + "nav-governance-description": "Postupak nadogradnje Ethereumovog protokola", + "nav-governance-label": "Upravljanje", + "nav-grants-description": "Odabrani popis zajednice o projektima koji omogućuju programe ulaganja", + "nav-guide-create-account-description": "Uz aplikaciju Novčanika svatko može besplatno izraditi Ethereum račun", + "nav-guide-revoke-access-description": "Ostanite zaštićeni dok surađujete s pametnim ugovorima i aplikacijama Ethereum ekosustava", + "nav-guide-revoke-access-label": "Kako uskratiti pristup pametnom ugovoru", + "nav-guide-use-wallet-description": "Upoznajte sve osnovne funkcije novčanika", + "nav-guide-use-wallet-label": "Kako koristiti novčanik", + "nav-guides-description": "Praktične, detaljne upute za prve korake", + "nav-guides-label": "Vodiči sa smjernicama", + "nav-history-description": "Vremenski plan svih značajnih ažuriranja", + "nav-history-label": "Tehnička povijest Ethereuma", + "nav-layer-2-description": "Jeftinije i brže transakcije Ethereuma", + "nav-learn-by-coding-description": "Alati pomoći u eksperimentiranju s Ethereumom", + "nav-local-env-description": "Odaberite i postavite svoj stog za razvoj Ethereuma", + "nav-mainnet-description": "Poslovne aplikacije za lance blokova mogu se graditi na javnoj glavnoj mreži Ethereuma", + "nav-nft-description": "Način prikaza bilo čega jedinstvenog u obliku imovine temeljene na Ethereumu", + "nav-open-research-description": "Jedna od primarnih prednosti Ethereuma aktivna je istraživačka zajednica", + "nav-open-research-label": "Otvori istraživanje", + "nav-overview-description": "Sve o obuci za Ethereum", + "nav-participate-overview-description": "Pregled kako sudjelovati", "nav-primary": "Primarni", + "nav-private-description": "Resursi za programere za Ethereum kod privatnih poduzeća", + "nav-quizzes-description": "Saznajte koliko dobro razumijete Ethereum i kriptovalute", + "nav-quizzes-label": "Provjerite svoje znanje", + "nav-refi-description": "Alternativni ekonomski sustav građen na principima regeneracije", + "nav-research-description": "Postupci poboljšanja Ethereuma", + "nav-research-label": "Istraživanje i razvoj", + "nav-roadmap-description": "Put do skalabilnijeg, sigurnijeg i održivijeg Ethereuma", + "nav-roadmap-future-description": "Učvršćivanje Ethereuma kao čvrste i decentralizirane mreže", + "nav-roadmap-future-label": "Osiguranje za budućnost", + "nav-roadmap-label": "Plan razvoja", + "nav-roadmap-scaling-description": "Ažuriranja mreže kako bi se dodatno smanjili troškovi i ubrzale transakcije", + "nav-roadmap-security-description": "Otpornost Ethereuma na sve vrste napada u budućnosti", + "nav-roadmap-security-label": "Poboljšana sigurnost", + "nav-roadmap-ux-description": "Upotreba Ethereuma mora biti pojednostavljena", + "nav-run-a-node-description": "Kako postati potpuno neovisan i pri tome zaštititi mreže", + "nav-security-description": "Upoznajte najbolje prakse u radu s kriptovalutama", + "nav-smart-contracts-description": "Temeljni gradbeni blokovi Ethereumovog ekosustava", + "nav-stablecoins-description": "Stabilne kovanice Ethereumovi su tokeni osmišljeni za zadržavanje fiksne vrijednosti", + "nav-stake-description": "Zaradite nagrade za zaštitu Ethereuma", + "nav-stake-label": "Ulaganje", + "nav-staking-home-description": "Pregled različitih mogućnosti ulaganja", + "nav-staking-pool-description": "Udružujte se s drugima i ulažite i zarađujte nagrade sa svakom vrijednosti ETH", + "nav-staking-pool-label": "Skupljeni staking", + "nav-staking-saas-label": "Ulaganje s uslugom", + "nav-staking-solo-label": "Samostalan staking", + "nav-start-building-description": "Korisne informacije za početnike", + "nav-translation-program-description": "Suradnja u prevođenju web-mjesta ethereum.org na sve jezike", + "nav-tutorials-description": "Odabrani popis praktičnih vodiča zajednice", + "nav-use-cases-description": "Otkrijte različite ideje kako se koristiti Ethereumom", + "nav-what-is-ether-description": "Valuta Ethereum aplikacija", + "nav-what-is-ethereum-description": "Što Ethereum čini posebnim", + "nav-what-is-web3-label": "Što je Veb3?", + "nav-what-is-web3-description": "Alternativa centraliziranim monopolima koji diktiraju pravila", + "nav-whitepaper-description": "Originalna tehnička dokumentacija Ethereuma autora Vitalika Buterina iz 2014.", + "nav-zkp-description": "Način kako potvrditi valjanost potvrde bez njezina otkrivanja", "nft-page": "NFT-ovi - Nezamjenjivi tokeni", "nfts": "NFT - nezamjenjivi tokeni", "no": "Ne", @@ -154,6 +249,8 @@ "page-developers-aria-label": "Programerski izbornik", "page-index-meta-title": "Početna", "page-last-updated": "Posljednje ažuriranje stranice", + "participate": "Sudjelovanje", + "participate-menu": "Izbornik sudjelovanja", "pbs": "Razdvojenost predlagača i graditelja", "pools": "Skupljeni staking", "privacy-policy": "Pravila privatnosti", @@ -164,6 +261,8 @@ "refresh": "Osvježite stranicu.", "return-home": "vrati doma", "roadmap": "Plan razvoja Ethereuma", + "research": "Istraživanje", + "research-menu": "Izbornik istraživanja", "resources": "Resursi prevođenja", "regenerative-finance": "ReFi - Regenerativne financije", "run-a-node": "Raditi node-a", @@ -190,11 +289,10 @@ "site-title": "ethereum.org", "skip-to-main-content": "Preskoči na glavni sadržaj", "smart-contracts": "Pametni ugovori", - "stablecoins": "Stablecoins", + "stablecoins": "Stabilne kovanice", "stake-eth": "Ulog ETH", "staking": "Ulaganje", "start-here": "Počnite ovdje", - "style-guide": "Style guide", "solo": "Samostalan staking", "support": "Podrška", "terms-of-use": "Uvjeti korištenja", @@ -211,16 +309,17 @@ "try-using-search": "Pokušajte pomoću pretraživanja pronaći ono što tražite ili", "tutorials": "Praktični vodiči", "up": "Gore", + "use": "Upotreba", "use-ethereum": "Upotrijebi Ethereum", "use-ethereum-menu": "Upotrijebi Ethereumov izbornik", - "user-experience": "User experience", + "use-menu": "Izbornik upotrebe", "verkle-trees": "Verkle stabla", "wallets": "Novčanici", "we-couldnt-find-that-page": "Nismo mogli pronaći tu stranicu", "web3": "Što je Veb3?", "web3-title": "Web3", "website-last-updated": "Posljednje ažuriranje stranice", - "what-is-ether": "Što je ether (ETH)?", + "what-is-ether": "Što je Ether (ETH)?", "what-is-ethereum": "Što je Ethereum?", "withdrawals": "Povlačenje uloga", "yes": "Da", diff --git a/src/intl/ja/common.json b/src/intl/ja/common.json index 20c399a2e72..bfff2afd021 100644 --- a/src/intl/ja/common.json +++ b/src/intl/ja/common.json @@ -34,15 +34,15 @@ "copied": "コピー済み", "copy": "コピー", "danksharding": "ダークシャーディング", - "dao-page": "分散型自律組織(DAO)", + "dao-page": "DAO - 分散型自律組織", "dark-mode": "ダーク", "data-provided-by": "データソース:", - "decentralized-applications-dapps": "分散型アプリケーション(dapps)", + "decentralized-applications-dapps": "Dapps - 分散型アプリケーション", "decentralized-identity": "分散型アイデンティティ", "decentralized-social-networks": "分散型ソーシャルネットワーク", - "decentralized-science": "分散型サイエンス(DeSci)", + "decentralized-science": "DeSci - 分散型サイエンス", "description": "ナビゲーションアイテムの説明", - "defi-page": "分散型金融(DeFi)", + "defi-page": "DeFi - 分散型金融", "design": "デザイン", "design-principles": "デザイン原則", "devcon": "Devcon", @@ -255,7 +255,7 @@ "nav-what-is-web3-description": "中央集権的な独占企業がルールを決定することに対する代替案", "nav-whitepaper-description": "2014年にヴィタリック・ブテリンによって書かれたオリジナルのイーサリアムのホワイトペーパー", "nav-zkp-description": "証明したい主張そのものを明らかにすることなく、主張の妥当性を証明する方法", - "nft-page": "非代替性トークン(NFT)", + "nft-page": "NFT - 非代替性トークン", "nfts": "NFT", "no": "いいえ", "on-this-page": "このページ", @@ -278,7 +278,7 @@ "research": "リサーチ", "research-menu": "リサーチメニュー", "resources": "翻訳のリソース", - "regenerative-finance": "再生金融(ReFi)", + "regenerative-finance": "ReFi - 再生金融", "run-a-node": "ノードの運用", "rollup-component-website": "ウェブサイト", "rollup-component-developer-docs": "デベロッパー向け文書", diff --git a/src/intl/ka/common.json b/src/intl/ka/common.json index 4474a5bd290..fb618fb1e3d 100644 --- a/src/intl/ka/common.json +++ b/src/intl/ka/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "ანგარიშის ამოღება", "about-ethereum-org": "ethereum.org-ის შესახებ", "about-us": "ჩვენს შესახებ", + "adding-desci-projects": "Desci პროექტების დამატება", + "adding-developer-tools": "პროგრამისტის ხელსაწყოების დამატება", + "adding-exchanges": "გაცვლების დამატება", + "adding-glossary-terms": "ლექსიკონის ტერმინების დამატება", + "adding-staking-products": "სტეიკინგის პროდუქტების დამატება", + "adding-wallets": "საფულეების დამატება", + "account-abstraction": "ანგარიშის ამოღება", + "acknowledgements": "ცნობები", "aria-toggle-search-button": "ძიების ღილაკი", "aria-toggle-menu-button": "მენიუს ღილაკი", "beacon-chain": "Beacon ჯაჭვი", "bridges": "ბლოკჩეინის ხიდები", + "bug-bounty": "Ჯილდო ბაგის აღმოჩენისათვის", + "build": "დეველოპმენტი", + "build-menu": "ააგეთ მენიუ", "clear": "გასუფთავება", "close": "დახურვა", "community": "საზოგადოება", "community-hub": "საზოგადოების ცენტრი", "community-menu": "საზოგადოების მენიუ", "contact": "კონტაქტი", + "content-buckets": "შინაარსის ნაერთები", + "content-resources": "შინაარსის რესურსები", "content-standardization": "კონტენტის სტანდარტიზაცია", "contributing": "შეიტანე წვლილი", "contributors": "კონტრიბუტორები", @@ -20,14 +32,17 @@ "copied": "დაკოპირებულია", "copy": "კოპირება", "danksharding": "დენკშერდინგი", - "dao-page": "DAO - დეცენტრალიზებული ავტონომიური ორგანიზაციები-ები", + "dao-page": "DAO - დეცენტრალიზებული ავტონომიური ორგანიზაციები -ები", "dark-mode": "ბნელი", "data-provided-by": "მონაცემთა წყარო:", "decentralized-applications-dapps": "Dapps - დეცენტრალიზებული აპლიკაციები", "decentralized-identity": "დეცენტრალიზებული იდენტობა", "decentralized-social-networks": "დეცენტრალიზებული სოციალური ქსელი", "decentralized-science": "DeSci - დეცენტრალიზებული მეცნიერება", + "description": "ნავიგაციის საგნის აღწერა", "defi-page": "DeFi - დეცენტრალიზებული ფინანსები", + "design": "დიზაინი", + "design-principles": "დიზაინის პრინციპები", "devcon": "Devcon", "developers": "დეველოპერები", "developers-home": "დეველოპერების მთავარი", @@ -59,7 +74,6 @@ "enterprise-menu": "კომპანიის მენიუ", "esp": "ეკოსისტემის მხარდაჭერის პროგრამა", "eth-current-price": "ETH მიმდინარე ფასი (აშშ დოლარი)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "ეთერეუმის ხარვეზების ბოუნტი პროგრამა", "consensus-when-shipping": "როდის არის მიწოდება?", "ethereum-upgrades": "ეთერეუმის განახლებები", @@ -83,22 +97,22 @@ "feedback-card-prompt-tutorial": "დაგეხმარა ეს სახელმძღვანელო?", "feedback-widget-thank-you-title": "მადლობა გამოხმაურებისთვის!", "feedback-widget-thank-you-subtitle": "გააუმჯობესეთ ეს გვერდი რამდენიმე კითხვაზე პასუხის გაცემით.", - "feedback-widget-thank-you-subtitle-ext": "თუ დახმარება გჭირდებათ, შეგიძლიათ დაუკავშირდეთ საზოგადოებას ჩვენს Discord-ზე.", + "feedback-widget-thank-you-subtitle-ext": "დახმარების საჭიროების შემთხვევაში, შეგიძლიათ დაუკავშირდეთ საზოგადოებას ჩვენ Discord-ზე.", "feedback-widget-thank-you-timing": "2–3 წუთი", "feedback-widget-thank-you-cta": "გახსენით მოკლე გამოკითხვა", "find-wallet": "იპოვე საფულე", "future-proofing": "პერსპექტივა", - "get-eth": "იყიდე ეთერეუმი", + "get-eth": "მიიღე ETH", "get-involved": "ჩაერთე", - "get-started": "დაიწყე", + "get-started": "დაწყება", "grants": "გრანტები", "grant-programs": "ეკოსისტემის საგრანტო პროგრამები", "guides": "სახელმძღვანელოები", - "guides-hub": "სახელმძღვანელოების ჰაბი", + "guides-hub": "ინსტრუქციები", "history-of-ethereum": "ეთერეუმის ისტორია", "home": "მთავარი", "how-ethereum-works": "როგორ მუშაობს ეთერეუმი", - "how-to-register-an-ethereum-account": "როგორ \"დავარეგისტრიროთ\" ეთერეუმის ანგარიში", + "how-to-create-an-ethereum-account": "Როგორ \"შევქმნათ\" ეთერიუმის ექაუნთი", "how-to-revoke-token-access": "როგორ გააუქმოთ თქვენს კრიპტოზე ჭკვიანი კონტრაქტის წვდომა", "how-to-swap-tokens": "როგორ გადავცვალოთ ტოქენები", "how-to-use-a-bridge": "როგორ გავხიდოთ ტოქენები მე-2 დონეზე", @@ -128,11 +142,105 @@ "loading-error-try-again-later": "მონაცემებზე წვდომა შეუძლებელია. კვლავ სცადეთ მოგვიანებით.", "logo": "ლოგო", "mainnet-ethereum": "ეთერეუმის მაინნეტი", + "merge": "შერწყმა", "more": "მეტი", - "nav-developers": "დეველოპერები", + "nav-about-description": "ეთერეუმის საზოგადოებისათვის განკუთვნილი საჯარო, ღია კოდის პროექტი", + "nav-advanced-description": "შეიტყვეთ მეტი კომპლექსური თემის შესახებ", + "nav-advanced-label": "დამატებით", + "nav-basics-description": "ეთერეუმის საფუძვლების გააზრება", + "nav-basics-label": "ძირითადი საკითხები", + "nav-bridges-description": "Web3-მა განიცადა ევოლუცია და იქცა პირველადი L1 ბლოქჩეინებისა და L2 სკალირების გადაწყვეტების ეკოსისტემად", + "nav-builders-home-description": "ეთერეუმის დეველოპერის სახელმძღვანელო - დეველოპერები დეველოპერებისთვის", + "nav-builders-home-label": "დეველოპერის მთავარი გვერდი", + "nav-contribute-description": "თუ დახმარება გჭირდებათ, შეგიძლიათ ამით იხელმძღვანელოთ", + "nav-contribute-label": "ethereum.org-ის კონტრიბუცია", + "nav-dao-description": "ცენტრალიზებული ხელმძღვანელობის არმქონე წევრების მფლობელობაში არსებული საზოგადოებები", + "nav-dapps-description": "ეთერეუმის გამოყენებით გამოიკვლიეთ აპების მდიდარი ეკოსისტემა", + "nav-defi-description": "ტრადიციული ფინანსური ბაზრის გლობალური, ღია ალტერნატივა", + "nav-desci-description": "მიმდინარე სამეცნიერო სისტემის გლობალური, ღია ალტერნატივა", + "nav-desoc-description": "ბლოკჩეინზე დაფუძნებული პლატფორმები სოციალური ინტერაქციისა და კონტენტის შექმნისათვის", "nav-developers-docs": "დეველოპერების დოკუმენტაცია", + "nav-developers": "დეველოპერები", + "nav-did-description": "შექმენით და იქონიეთ თქვენი უნიკალური დეცენტრალიზებული იდენტიფიკატორები", + "nav-docs-description": "დოკუმენტები, რომლებიც დაგეხმარებათ ეთერეუმის გამოყენებით დეველოპმენტის გააზრებაში", + "nav-docs-design-description": "უნიკალური web3 დიზაინის გამოწვევების, საუკეთესი პრაქტიკებისა და მომხმარებლის კვლევის ინსაითების აღწერა", + "nav-docs-design-label": "UX/UI დიზაინის საფუძვლები", + "nav-docs-foundation-description": "ეთერეუმზე დეველოპმენტის ძირეული საფუძვლები", + "nav-docs-overview-description": "დეველოპერის დოკუმენტების თქვენი მთავარი გვერდი", + "nav-docs-stack-description": "ეთერეუმის სტეკის ყველა დეტალის გააზრება", + "nav-eip-description": "ახალი ფუნქციების თუ პროცესების მაკონკრეტებელი სტანდარტები", + "nav-eip-label": "ეთერეუმის წინადადებები და შეთავაზებები (EIP-ები)", + "nav-emerging-description": "ეთერეუმის სხვა უფრო ახალი გამოყენების ქეისების გაცნობა", + "nav-enterprise-description": "ეთერეუმის ბიზნეს აპლიკაციები", + "nav-ethereum-org-description": "ვებსაიტი იმართება საზოგადოების მიერ—შემოგვიერთდით და მიიღეთ მონაწილეობა", + "nav-ethereum-wallets-description": "თქვენი ეთერეუმის ანგარიშთან ინტერაქციის აპლიკაცია", + "nav-events-description": "ნებისმიერი თქვენგანისათვის დეცენტრალიზაცია და მონაწილეობის თავისუფლება", + "nav-events-irl-description": "ყოველთვიურად იმართება ეთერეუმის ღონისძიებები, როგორც დასწრებული ასევე ონლაინ ფორმატით", + "nav-events-label": "საზოგადოებები და ღონისძიებები", + "nav-events-online-description": "ეთერეუმის ასობით ათასი ენთუზიასტი მამაა ამ ონლაინ საზოგადოებაში", + "nav-find-wallet-description": "საფულეები გაძლევთ კრიპტოს გამოყენების საშუალებას", + "nav-find-wallet-label": "აირჩიეთ თქვენი საფულე", + "nav-gas-fees-description": "როგორ ითვლება ETH ტრანზაქციის გადასახადები", + "nav-get-eth-description": "გჭირდებათ ეთერი (ETH) ან ეთერეუმის აპლიკაციის გამოყენება", + "nav-get-started-description": "ეთერეუმის გამოყენებისკენ გადადგმული თქვენი პირველი ნაბიჯები", + "nav-governance-description": "პროცესი, რომელიც გამოიყენებოდა ეთერეუმის პროტოკოლის გაახლებაში", + "nav-governance-label": "მმართველობა", + "nav-grants-description": "ჩვენი საზოგადოების კურატორის ზედამხედველობით შექმნილი სია პროექტებზე, რომლებიც უზრუნველყოფენ დაფინანსებს პროგრამების უფლებას", + "nav-guide-create-account-description": "საფულის აპის გამოყენებით, ეთერეუმის ანგარიშის შექმნა ნებისმიერ დროს, ნებისმიერ ადამიანს უფასოდ შეუძლია", + "nav-guide-create-account-label": "Როგორ შევქმნათ ეთერიუმის ექაუნთი", + "nav-guide-revoke-access-description": "ეთერეუმის ეკოსისტემაში სმარტ კონტრაქტებსა და აპლიკაციებთან ინტერაქციისას შეინარჩუნეთ უსაფრთხოება", + "nav-guide-revoke-access-label": "როგორ უნდა გავაუქმოთ სმარტ კონტრაქტზე წვდომა", + "nav-guide-use-wallet-description": "შეიტყვეთ, თუ როგორ მუშაობს საფულის ყველა საბაზისო ფუნქცია", + "nav-guide-use-wallet-label": "როგორ გამოვიყენოთ საფულე", + "nav-guides-description": "პრაქტიკული ნაბიჯ-ნაბიჯ სახელმძღვანელო, რომელიც საწყისი ეტაპისთვის დაგეხმარებათ", + "nav-guides-label": "ინსტრუქციები", + "nav-history-description": "ყველა მთავარი ფორკისა და განახლების დროის ხაზი", + "nav-history-label": "ეთერეუმის ტექნიკური ისტორია", + "nav-layer-2-description": "ეთერეუმის უფრო იაფი და სწრაფი ტრანზაქციები", + "nav-learn-by-coding-description": "იარაღები, რომლებიც დაგეხმარებათ ეთერეუმით ექსპერიმენტირებისთვის", + "nav-local-env-description": "აირჩიეთ და მოაწყვეთ თქვენი ეთერეუმის დეველოპმენტის სტეკი", + "nav-mainnet-description": "კომპანიის ბლოკჩეინ აპლიკაციების ჩაშენება შესაძლებელია ეთერეუმის საჯარო მეინნეტზე", + "nav-nft-description": "საშუალება წარმოაჩინოს რაიმე უნიკალური, როგორც Ethereum-ზე დაფუძნებული აქტივი", + "nav-open-research-description": "ეთერეუმის ერთ-ერთი უმთავრესი სიძლიერე მისი აქტიური კვლევითი საზოგადოებაა", + "nav-open-research-label": "ღია კვლევა", + "nav-overview-description": "ეთერეუმის ყოვლისმომცველი საგანმანათლებლო რესურსი", + "nav-participate-overview-description": "მიმოხილვა იმის შესახებ, თუ როგორ უნდა მიიღოთ მონაწილეობა", "nav-primary": "ძირითადი", - "nft-page": "NFT - შეუცვლელი ტოკენები-ები", + "nav-quizzes-description": "შეიტყვეთ, თუ რამდენად კარგად იაზრებთ ეთერეუმსა და კრიპტოვალუტებს", + "nav-quizzes-label": "შეამოწმეთ თქვენი ცოდნა", + "nav-refi-description": "რეგენერაციულ პრინციპებზე დაფუძნებული ალტერნატიული ეკონომიკური სისტემა", + "nav-research-description": "ეთერეუმის გაუმჯობესებისთვის გამოყენებული პროცესები", + "nav-research-label": "კვლევა და განვითარება", + "nav-roadmap-description": "ეთერეუმის მეტი მასშტაბირებისკენ, დაცულობისა და მდგრადობისკენ მიმავალი გზა", + "nav-roadmap-future-description": "ეთერეუმის, როგორც მტკიცე და დეცენტრალიზებული ქსელის გამყარება", + "nav-roadmap-future-label": "პერსპექტივა", + "nav-roadmap-label": "რუკა", + "nav-roadmap-scaling-description": "ქსელის განახლებები, გამიზნული ტრანზაქციული ხარჯების დამატებით შემცირებისა და სისწრაფისთვის", + "nav-roadmap-security-description": "იმის უზრუნველყოფა, რომ ეთერეუმი სამომავლოდ ყველა ტიპის შემოტევების მიმართ შეუღწევადი დარჩება", + "nav-roadmap-security-label": "გაუმჯობესებული უსაფრთხოება", + "nav-roadmap-ux-description": "ეთერეუმის გამოყენება უნდა გამარტივდეს", + "nav-run-a-node-description": "გახდით მთლიანად სრულუფლებიანი, როცა ეხმარებით ქსელის დაცულად გახდომაში", + "nav-security-description": "შეიტყვეთ საუკეთესო გამოცდილებების შესახებ, კრიპტოვალუტის გამოყენებისას", + "nav-smart-contracts-description": "ეთერეუმის ეკოსისტემის მთავარი ფუნდამენტი", + "nav-stablecoins-description": "სთეიბლქოინები წარმოადგენს ეთერეუმის ტოკენებს, რომლებიც შექმნილია ფიქსირებულ მნიშვნელობაზე დასარჩენად", + "nav-stake-description": "ეთერეუმის დაცვისათვის მიიღეთ ჯილდოები", + "nav-stake-label": "სტეიკი", + "nav-staking-home-description": "სტეიკინგის სხვადასხვა ვარიანტის მიმოხილვა", + "nav-staking-pool-description": "სხვებთან შეერთებით, ეთერეუმის ნებისმიერი რაოდენობა განათავსეთ სტეიკად და მიიღეთ ჯილდო", + "nav-staking-pool-label": "გაერთიანებული სტეიკინგი", + "nav-staking-saas-label": "სერვისით სტეიკინგი", + "nav-staking-solo-label": "სოლო სტეიკინგი", + "nav-start-building-description": "სასარგებლო ინფორმაცია ახალი წევრებისათვის", + "nav-translation-program-description": "ურთიერთთანამშრომლობითი ძალისხმევა ethereum.org-ის ყველა ენაზე გადათარგმნის კუთხით", + "nav-tutorials-description": "საზოგადოების სასწავლო ვიდეოების კურირებული სია", + "nav-use-cases-description": "აღმოაჩინეთ ეთერეუმის გამოყენების განსხვავებული იდეები", + "nav-what-is-ether-description": "ეთერეუმის აპლიკაციების ვალუტა", + "nav-what-is-ethereum-description": "გაიგეთ, რა ხდის ეთერეუმს განსაკუთრებულს", + "nav-what-is-web3-label": "რა არის WEB3?", + "nav-what-is-web3-description": "ცენტრალიზებული მონოპოლიების ალტერნატივა, რომელიც კარნახობს წესებს", + "nav-whitepaper-description": "თავდაპირველი ეთერეუმის დოკუმენტი, რომელიც დაწერილია ვიტალიკ ბუტერინის მიერ, 2014 წელს", + "nav-zkp-description": "განაცხადის ვალიდურობის დამტკიცების გზა ისე, რომ არ მოხდეს თავად განაცხადის გამჟღავნება", + "nft-page": "NFT - შეუცვლელი ტოკენები -ები", "nfts": "NFT-ები", "no": "არა", "on-this-page": "ამ გვერდზე", @@ -140,6 +248,7 @@ "page-developers-aria-label": "დეველოპერების მენიუ", "page-index-meta-title": "მთავარი", "page-last-updated": "გვერდი ბოლოს განახლდა", + "participate-menu": "მონაწილეობის მენიუ", "pbs": "შეთავაზების შემქმნელის გამიჯვნა", "pools": "გაერთიანებული სტეიკინგი", "privacy-policy": "კონფიდენციალურობის პოლიტიკა", @@ -150,13 +259,15 @@ "refresh": "გთხოვთ განაახლეთ გვერდი.", "return-home": "დაბრუნება მთავარზე", "roadmap": "ეთერეუმის საგზაო რუკა", + "research": "კვლევა", + "research-menu": "კვლევის მენიუ", "resources": "თარგმნის რესურსები", "regenerative-finance": "ReFi - Რეგენერატიული ფინანსები", - "run-a-node": "კვანძის გაშვება", + "run-a-node": "ქსელის ჩაშვება", "rollup-component-website": "ვებგვერდი", "rollup-component-developer-docs": "დეველოპერის დოკუმენტაცია", "rollup-component-technology-and-risk-summary": "ტექნოლოგია და რისკის შეჯამება", - "scaling": "სუბიექტები ქსელში, რომლებსაც შეუძლიათ ბალანსის შენარჩუნება და ტრანზაქციების გაგზავნა", + "scaling": "მასშტაბირება", "saas": "სტეიკინგი როგორც სერვისი", "search": "ძიება", "search-ethereum-org": "ძიება ethereum.org-ზე", @@ -164,6 +275,7 @@ "search-box-blank-state-text": "მოძებნე!", "search-eth-address": "ეს ჰგავს Ethereum-ის მისამართს. ჩვენ არ გავცემთ მისამართებზე სპეციფიკურ მონაცემებს. სცადეთ მოიძიოთ ინფორმაცია ისეთ ბლოკ ექსპლორერში, როგორიცაა", "search-no-results": "თქვენმა ძებნამ შედეგი არ გამოიღო", + "security": "უსაფრთხოება", "single-slot-finality": "საბოლოო ცალკე სლოტი", "statelessness": "გაუფორმებლობა", "see-contributors": "იხილეთ კონტრიბუტორები", @@ -172,15 +284,14 @@ "show-all": "ყველაფრის ჩვენება", "show-less": "ნაკლების ჩვენება", "site-description": "Ethereum არის გლობალური, დეცენტრალიზებული პლატფორმა ფინანსური თუ სხვა ახალი ტიპის აპლიკაციებისთვის. Ethereum-ზე შეგიძლიათ დაწეროთ კოდი, რომელიც აკონტროლებს ფულს და შექმნათ აპლიკაციები, რომლებიც ხელმისაწვდომი იქნება მსოფლიოს ნებისმიერ წერტილში.", - "site-title": "ethereum.org", "skip-to-main-content": "ძირითად მასალაზე გადასვლა", "smart-contracts": "ჭკვიანი კონტრაქტები", "stablecoins": "სტაბილური ქოინები", "stake-eth": "დაასტეიკე ETH", "staking": "სტეიკინგი", "start-here": "დაიწყე აქ", - "style-guide": "Style guide", "solo": "სოლო სტეიკინგი", + "support": "მხარდაჭერა", "terms-of-use": "მოხმარების წესები", "translation-banner-body-new": "თქვენ ხედავთ ამ გვერდს ინგლისურად, რადგან ის ჯერ არ გვითარგმნია. დაგვეხმარეთ ამ გვერდის თარგმნაში.", "translation-banner-body-update": "ეს გვერდის ახალი ვერსიაა, ამიტომ ის ამჟამად მხოლოდ ინგლისურ ენაზეა. დაგვეხმარეთ ახალი ვერსიის თარგმნაში. ", @@ -191,12 +302,14 @@ "translation-banner-no-bugs-title": "აქ არ არის ბაგი!", "translation-banner-no-bugs-content": "ეს გვერდი არ ითარგმნება. ჩვენ სპეციალურად დავტოვეთ ეს გვერდი ინგლისურად.", "translation-banner-no-bugs-dont-show-again": "აღარ მაჩვენო", + "translation-program": "თარგმნის პროგრამა", "try-using-search": "სცადეთ საძიებოს გამოყენება, რათა იპოვოთ ის, რასაც ეძებთ", "tutorials": "გაკვეთილები", "up": "მაღლა", + "use": "გამოყენება", "use-ethereum": "ეთერეუმის გამოყენება", "use-ethereum-menu": "ეთერეუმის მენიუს გამოყენება", - "user-experience": "User experience", + "use-menu": "გამოიყენეთ მენიუ", "verkle-trees": "\"Verkle\" ხეები", "wallets": "საფულეები", "we-couldnt-find-that-page": "გვერდი არ მოიძებნა", diff --git a/src/intl/km/common.json b/src/intl/km/common.json index b36b5c62de7..2dfca119496 100644 --- a/src/intl/km/common.json +++ b/src/intl/km/common.json @@ -1,17 +1,27 @@ { - "account-abstraction": "Account abstraction", "about-ethereum-org": "អំពី ethereum.org", "about-us": "អំពី​ពួក​យើង", + "adding-desci-projects": "ការបន្ថែមគម្រោង Desci", + "adding-developer-tools": "ការបន្ថែមឧបករណ៍អ្នកអភិវឌ្ឍន៍", + "adding-exchanges": "ការបន្ថែមការប្តូរ", + "adding-glossary-terms": "ការបន្ថែមវាក្យសព្ទសទ្ទានុក្រម", + "adding-staking-products": "ការបន្ថែមផលិតផលភ្នាល់", + "adding-wallets": "ការបន្ថែមកាបូប", + "acknowledgements": "ការទទួលស្គាល់", "aria-toggle-search-button": "បិទបើកប៊ូតុងស្វែងរក", "aria-toggle-menu-button": "បិទបើកប៊ូតុងមីនុយ", "beacon-chain": "ខ្សែសង្វាក់ Beacon", "bridges": "ស្ពាន Blockchain", + "build": "បង្កើត", + "build-menu": "ម៉ឺនុយបង្កើត", "clear": "សម្អាត", "close": "បិទ", "community": "សហគមន៍", "community-hub": "មជ្ឈមណ្ឌលសហគមន៍", "community-menu": "ម៉ឺនុយសហគមន៍", "contact": "ទំនាក់ទំនង", + "content-buckets": "ធុងមាតិកា", + "content-resources": "ធនធានមាតិកា", "content-standardization": "ស្តង់ដារមាតិកា", "contributing": "ការរួមចំណែក", "contributors": "អ្នករួមចំណែក", @@ -27,7 +37,10 @@ "decentralized-identity": "អត្តសញ្ញាណវិមជ្ឈការ", "decentralized-social-networks": "បណ្តាញសង្គមវិមជ្ឈការ", "decentralized-science": "DeSci - វិទ្យាសាស្ត្រវិមជ្ឈការ", + "description": "ការពណ៌នាសម្រាប់ធាតុ nav", "defi-page": "DeFi - ហិរញ្ញវត្ថុវិមជ្ឈការ", + "design": "ការរចនា", + "design-principles": "គោលការណ៍នៃការរចនា", "devcon": "Devcon", "developers": "អ្នកអភិវឌ្ឍន៍", "developers-home": "ផ្ទះរបស់អ្នកអភិវឌ្ឍន៍", @@ -59,7 +72,6 @@ "enterprise-menu": "ម៉ឺនុយសហគ្រាស", "esp": "កម្មវិធីជំនួយប្រព័ន្ធអេកូឡូស៊ី", "eth-current-price": "តម្លៃ ETH បច្ចុប្បន្ន (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "កម្មវិធី Ethereum Bug Bounty ", "consensus-when-shipping": "តើការដឹកជញ្ជូននៅពេលណា?", "ethereum-upgrades": "ការអាប់គ្រេដ Ethereum", @@ -90,15 +102,14 @@ "future-proofing": "ការធានាអនាគត", "get-eth": "ទទួលយក ETH", "get-involved": "ចូលរួម", - "get-started": "ចាប់ផ្ដើម", + "get-started": "តោះ! ចាប់ផ្ដើម", "grants": "ជំនួយ", "grant-programs": "កម្មវិធីជំនួយប្រព័ន្ធអេកូឡូស៊ី", "guides": "ការណែនាំ", - "guides-hub": "មជ្ឈមណ្ឌលណែនាំ", + "guides-hub": "របៀបណែនាំ", "history-of-ethereum": "ប្រវត្តិ Ethereum", "home": "ទំព័រដើម", "how-ethereum-works": "របៀបដែល Ethereum ដំណើរការ", - "how-to-register-an-ethereum-account": "របៀប \"ចុះឈ្មោះ\" គណនី Ethereum", "how-to-revoke-token-access": "របៀបដកហូតការចូលប្រើមូលនិធិគ្រីបតូរបស់អ្នកពីកិច្ចសន្យាឆ្លាតវៃ។", "how-to-swap-tokens": "របៀបប្រើ swap tokens", "how-to-use-a-bridge": "របៀបផ្ទេរកាក់ទៅស្រទាប់ទី 2", @@ -128,10 +139,103 @@ "loading-error-try-again-later": "មិនអាចផ្ទុកទិន្នន័យបានទេ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។", "logo": "រូបសញ្ញា", "mainnet-ethereum": "Mainnet Ethereum", - "more": "ច្រើនទៀត", - "nav-developers": "អ្នកអភិវឌ្ឍន៍", + "merge": "បញ្ចូលគ្នា​", + "more": "ច្រើនជាង", + "nav-about-description": "គម្រោងប្រភពបើកចំហ សាធារណៈ សម្រាប់សហគមន៍ Ethereum", + "nav-advanced-description": "ស្វែងយល់អំពីប្រធានបទ​ស្មុគស្មាញបន្ថែមទៀត", + "nav-advanced-label": "កម្រិតខ្ពស់", + "nav-basics-description": "ស្វែងយល់អំពីមូលដ្ឋានគ្រឹះរបស់ Ethereum", + "nav-basics-label": "មូលដ្ឋាន", + "nav-bridges-description": "Web3 បានវិវត្តទៅជាប្រព័ន្ធអេកូឡូស៊ីនៃប្លុកឆែន L1 បឋម និងដំណោះស្រាយពង្រីក L2", + "nav-builders-home-description": "សៀវភៅណែនាំរបស់អ្នកអភិវឌ្ឍសម្រាប់ Ethereum — ដោយអ្នកអភិវឌ្ឍ សម្រាប់អ្នកអភិវឌ្ឍ", + "nav-builders-home-label": "ផ្ទះរបស់អ្នកអភិវឌ្ឍ", + "nav-contribute-description": "ប្រសិនបើអ្នកត្រូវការជំនួយ ជំនួយនេះអាចជួយអ្នកបាន", + "nav-contribute-label": "ការចូលរួមចំណែកដល់ ethereum.org", + "nav-dao-description": "សហគមន៍ដែលគ្រប់គ្រងដោយសមាជិក ដោយគ្មានអាជ្ញាធរនៅកណ្តាល", + "nav-dapps-description": "រុករកប្រព័ន្ធអេកូឡូស៊ីដ៏សម្បូរបែបនៃកម្មវិធីដោយប្រើ Ethereum", + "nav-defi-description": "ជម្រើសជាសកល បើកចំហចំពោះទីផ្សារហិរញ្ញវត្ថុប្រពៃណី", + "nav-desci-description": "ជម្រើសជាសកល បើកចំហចំពោះប្រព័ន្ធវិទ្យាសាស្ត្របច្ចុប្បន្ន", + "nav-desoc-description": "ថ្នាលដែលមានមូលដ្ឋានលើប្លុកឆែនសម្រាប់អន្តរកម្មសង្គម និងការបង្កើតមាតិកា", "nav-developers-docs": "ឯកសារអ្នកអភិវឌ្ឍន៍", + "nav-developers": "អ្នកអភិវឌ្ឍន៍", + "nav-did-description": "ចេញ និងធ្វើជាម្ចាស់ឧបករណ៍កំណត់អត្តសញ្ញាណវិមជ្ឈការតែមួយគត់របស់អ្នក", + "nav-docs-description": "ឯកសារដើម្បីជួយអ្នកយល់ និងអភិវឌ្ឍជាមួយ Ethereum", + "nav-docs-design-description": "ការពណ៌នាអំពីបញ្ហាប្រឈមនៃការរចនា web3 តែមួយគត់ ការអនុវត្តល្អបំផុត និងការយល់ដឹងអំពីការស្រាវជ្រាវអ្នកប្រើប្រាស់", + "nav-docs-design-label": "មូលដ្ឋានគ្រឹះ​អំពីការរចនា UX/UI", + "nav-docs-foundation-description": "មូលដ្ឋានគ្រឹះជាស្នូលដើម្បីអភិវឌ្ឍលើ Ethereum", + "nav-docs-overview-description": "ផ្ទះរបស់អ្នក​សម្រាប់​ឯកសារអ្នកអភិវឌ្ឍន៍", + "nav-docs-stack-description": "ស្វែងយល់ពីព័ត៌មានលម្អិតទាំងអស់នៃ stack របស់ Ethereum", + "nav-eip-description": "ស្ដង់ដារ​ដែល​បញ្ជាក់មុខងារ​ ឬ​ដំណើរការ​ថ្មី", + "nav-eip-label": "សំណើកែលម្អ Ethereum (EIP)", + "nav-emerging-description": "ស្វែងយល់ពីករណីប្រើប្រាស់ថ្មីជាងនេះផ្សេងទៀតសម្រាប់ Ethereum", + "nav-enterprise-description": "កម្មវិធី​អាជីវកម្មសម្រាប់ Ethereum", + "nav-ethereum-org-description": "គេហទំព័រនេះមានការជំរុញពីសហគមន៍ សូមចូលរួមជាមួយពួកយើង និងរួមចំណែកផងដែរ", + "nav-ethereum-wallets-description": "កម្មវិធីមួយដើម្បីធ្វើអន្តរកម្មជាមួយគណនី Ethereum របស់អ្នក", + "nav-events-description": "វិមជ្ឈការ និងសេរីភាពក្នុងការចូលរួមសម្រាប់មនុស្សគ្រប់រូប", + "nav-events-irl-description": "ជារៀងរាល់ខែមានព្រឹត្តិការណ៍ Ethereum សំខាន់ៗដោយជួបផ្ទាល់ និងតាមអ៊ីនធឺណិត", + "nav-events-label": "សហគមន៍ និងព្រឹត្តិការណ៍", + "nav-events-online-description": "មានឪពុកដែលជាអ្នកចូលចិត្ត Ethereum រាប់រយពាន់នាក់នៅក្នុងសហគមន៍អនឡាញទាំងនេះ", + "nav-find-wallet-description": "កាបូបដែលអាចឱ្យអ្នកប្រើគ្រីបតូ", + "nav-find-wallet-label": "ជ្រើសរើសកាបូបរបស់អ្នក", + "nav-gas-fees-description": "តើថ្លៃសេវាប្រតិបត្តិការ ETH ត្រូវបានគណនារបៀបណា", + "nav-get-eth-description": "អ្នកត្រូវការ ether (ETH) ដើម្បីប្រើកម្មវិធី Ethereum", + "nav-get-started-description": "ជំហានដំបូងរបស់អ្នកក្នុងការប្រើ Ethereum", + "nav-governance-description": "ដំណើរការពាក់ព័ន្ធនឹងការធ្វើឱ្យប្រសើរឡើងនូវពិធីការ Ethereum", + "nav-governance-label": "អភិបាលកិច្ច", + "nav-grants-description": "បញ្ជីត្រៀមទុកដោយសហគមន៍របស់យើងលើគម្រោងដែលផ្តល់កម្មវិធីផ្តល់មូលនិធិជំនួយ", + "nav-guide-create-account-description": "គ្រប់គ្នាអាចបង្កើតគណនី Ethereum នៅពេលណាក៏បាន ដោយមិនគិតថ្លៃជាមួយកម្មវិធីកាបូប", + "nav-guide-revoke-access-description": "រក្សាសុវត្ថិភាពនៅពេលធ្វើអន្តរកម្មជាមួយកិច្ចសន្យាឆ្លាតវៃ និងកម្មវិធីនៅក្នុងប្រព័ន្ធអេកូឡូស៊ី Ethereum", + "nav-guide-revoke-access-label": "របៀបដកសិទ្ធិចូលប្រើកិច្ចសន្យាឆ្លាតវៃ", + "nav-guide-use-wallet-description": "រៀនពីរបៀបដំណើរការមុខងារមូលដ្ឋានទាំងអស់របស់កាបូប", + "nav-guide-use-wallet-label": "របៀបប្រើកាបូប", + "nav-guides-description": "ការណែនាំជាជំហានៗជាក់ស្តែង ដើម្បីជួយអ្នកចាប់ផ្តើម", + "nav-guides-label": "របៀបណែនាំ", + "nav-history-description": "គ្រោងពេលវេលានៃការបំបែក និងការអាប់ដេតសំខាន់ៗទាំងអស់", + "nav-history-label": "ប្រវត្តិបច្ចេកទេស​របស់ Ethereum", + "nav-layer-2-description": "ប្រតិបត្តិការថោកជាង និងលឿនជាងមុនសម្រាប់ Ethereum", + "nav-learn-by-coding-description": "ឧបករណ៍ដែលជួយអ្នកសាកល្បងជាមួយ Ethereum", + "nav-local-env-description": "ជ្រើសរើស និងរៀបចំ stack អភិវឌ្ឍន៍ Ethereum របស់អ្នក", + "nav-mainnet-description": "កម្មវិធី blockchain សម្រាប់សហគ្រាសអាចត្រូវបានបង្កើតឡើងនៅលើ Ethereum Mainnet សាធារណៈ", + "nav-nft-description": "មធ្យោបាយដើម្បីតំណាងឱ្យអ្វីដែលប្លែកពីគេជាទ្រព្យសកម្មដែលផ្អែកលើ Ethereum", + "nav-open-research-description": "ចំណុចខ្លាំងសំខាន់មួយនៃ Ethereum គឺសហគមន៍ស្រាវជ្រាវសកម្មរបស់ខ្លួន", + "nav-open-research-label": "បើកការស្រាវជ្រាវ", + "nav-overview-description": "ការអប់រំ Ethereum មានទាំងអស់", + "nav-participate-overview-description": "ទិដ្ឋភាពទូទៅអំពីរបៀបចូលរួម", "nav-primary": "បឋម", + "nav-quizzes-description": "ស្វែងយល់ពីរបៀបដែលអ្នកយល់ Ethereum និងរូបិយប័ណ្ណគ្រីបតូ", + "nav-quizzes-label": "សាកល្បងចំណេះដឹងរបស់អ្នក", + "nav-refi-description": "ប្រព័ន្ធសេដ្ឋកិច្ចជំនួសដែលបង្កើតឡើងនៅលើគោលការណ៍បង្កើតឡើងវិញ", + "nav-research-description": "ដំណើរការដែលប្រើដើម្បីកែលម្អ Ethereum", + "nav-research-label": "ការស្រាវជ្រាវ និងអភិវឌ្ឍន៍", + "nav-roadmap-description": "ផ្លូវទៅកាន់ការពង្រីក សុវត្ថិភាព និងចីរភាពកាន់តែច្រើនសម្រាប់ Ethereum", + "nav-roadmap-future-description": "ការពង្រឹង Ethereum ឱ្យក្លាយជាបណ្តាញដ៏រឹងមាំ និងវិមជ្ឈការ", + "nav-roadmap-future-label": "ការធានាអនាគត", + "nav-roadmap-label": "ផែនទីបង្ហាញផ្លូវ", + "nav-roadmap-scaling-description": "ការអាប់ដេតបណ្តាញ ដើម្បីកាត់បន្ថយថ្លៃសេវាប្រតិបត្តិការ និងល្បឿនបន្ថែមទៀត", + "nav-roadmap-security-description": "ធ្វើឱ្យប្រាកដថា Ethereum រក្សាភាពធន់នឹងការវាយប្រហារគ្រប់ប្រភេទនាពេលអនាគត", + "nav-roadmap-security-label": "សន្តិសុខប្រសើរឡើង", + "nav-roadmap-ux-description": "ការប្រើ Ethereum ចាំបាច់ត្រូវធ្វើឱ្យសាមញ្ញ", + "nav-run-a-node-description": "ក្លាយ​ជា​អធិបតេយ្យ​ពេញលេញ ស្រប​ដែល​ជួយ​ធានាដល់​បណ្តាញ", + "nav-security-description": "ស្វែងយល់ពីការអនុវត្តល្អបំផុតនៅពេលប្រើរូបិយប័ណ្ណគ្រីបតូ", + "nav-smart-contracts-description": "ប្លុកនៃការបង្កើតជាមូលដ្ឋានគ្រឹះនៃប្រព័ន្ធអេកូឡូស៊ី Ethereum", + "nav-stablecoins-description": "Stablecoins គឺជាថូខិន Ethereum ដែលត្រូវបានរចនាឡើងដើម្បីរក្សាតម្លៃថេរ", + "nav-stake-description": "ទទួលបានរង្វាន់សម្រាប់ការធានា Ethereum", + "nav-stake-label": "ភ្នាល់", + "nav-staking-home-description": "ទិដ្ឋភាពទូទៅនៃជម្រើសផ្សេងៗសម្រាប់ការភ្នាល់", + "nav-staking-pool-description": "ភ្នាល់ និងទទួលបានរង្វាន់ជាមួយនឹងទឹកប្រាក់ណាមួយនៃ ETH ដោយចូលរួមជាមួយអ្នកដទៃ", + "nav-staking-pool-label": "ការភ្នាល់រួមបញ្ចូលគ្នា", + "nav-staking-saas-label": "ការភ្នាល់ដោយប្រើសេវាកម្ម", + "nav-staking-solo-label": "ការភ្នាល់ទោល", + "nav-start-building-description": "ព័ត៌មានសំខាន់ៗសម្រាប់អ្នកចូលរួមថ្មី", + "nav-translation-program-description": "ការខិតខំប្រឹងប្រែងរួមគ្នាដើម្បីបកប្រែ ethereum.org ឱ្យបានគ្រប់ភាសាទាំងអស់", + "nav-tutorials-description": "បញ្ជីត្រៀមទុកនៃការបង្រៀនសហគមន៍", + "nav-use-cases-description": "ស្វែងយល់ពីគំនិតផ្សេងៗគ្នាសម្រាប់ការប្រើ Ethereum", + "nav-what-is-ether-description": "រូបិយប័ណ្ណរបស់កម្មវិធី Ethereum", + "nav-what-is-ethereum-description": "ស្វែងយល់ពីអ្វីដែលធ្វើឱ្យ Ethereum មានលក្ខណៈពិសេស", + "nav-what-is-web3-label": "តើ Web3 ជាអ្វី?", + "nav-what-is-web3-description": "ជម្រើសជំនួសចំពោះភាពផ្តាច់មុខបែបមជ្ឈការដែលកំណត់ច្បាប់", + "nav-whitepaper-description": "ក្រដាសស Ethereum ដើមដែលសរសេរដោយ Vitalik Buterin នៅឆ្នាំ 2014", + "nav-zkp-description": "របៀបបញ្ជាក់សុពលភាពនៃសេចក្តីថ្លែងការណ៍ដោយមិនបង្ហាញសេចក្តីថ្លែងការណ៍ខ្លួនឯង", "nft-page": "NFTs - ថូខិនដែលមិនអាចផ្លាស់ប្តូរបាន", "nfts": "NFTs", "no": "ទេ", @@ -140,6 +244,7 @@ "page-developers-aria-label": "ម៉ឺនុយអ្នកអភិវឌ្ឍន៍", "page-index-meta-title": "ទំព័រដើម", "page-last-updated": "ទំព័របានធ្វើបច្ចុប្បន្នភាពចុងក្រោយ", + "participate-menu": "ម៉ឺនុយចូលរួម", "pbs": "ការបែងចែករវាង អ្នកស្នើសុំ - អ្នកបង្កើត", "pools": "ការភ្នាល់រួមបញ្ចូលគ្នា", "privacy-policy": "គោលការណ៍​ឯកជនភាព", @@ -150,9 +255,11 @@ "refresh": "សូមផ្ទុកទំព័រឡើងវិញ។", "return-home": "ត្រលប់ទៅទំព័រដើម", "roadmap": "ផែនទីបង្ហាញផ្លូវ Ethereum", + "research": "ស្រាវជ្រាវ", + "research-menu": "ម៉ឺនុយស្រាវជ្រាវ", "resources": "ធនធានបកប្រែ", "regenerative-finance": "ReFi - ហិរញ្ញវត្ថុបង្កើតឡើងវិញ", - "run-a-node": "ដំណើរការ node", + "run-a-node": "ដំណើរការnode", "rollup-component-website": "វែបសាយ", "rollup-component-developer-docs": "ឯកសារអ្នកអភិវឌ្ឍន៍", "rollup-component-technology-and-risk-summary": "សង្ខេបបច្ចេកវិជ្ជា និងហានិភ័យ", @@ -164,6 +271,7 @@ "search-box-blank-state-text": "ស្វែងរកដោយប្រុងប្រយ័ត្ន!", "search-eth-address": "វាមើលទៅដូចជាអាសយដ្ឋាន Ethereum ។ យើងមិនផ្តល់ទិន្នន័យជាក់លាក់ចំពោះអាសយដ្ឋានទេ។ ព្យាយាមស្វែងរកវានៅលើកម្មវិធីរុករកប្លុកដូចជា", "search-no-results": "គ្មានលទ្ធផលសម្រាប់ការស្វែងរករបស់អ្នកទេ។", + "security": "សន្តិសុខ", "single-slot-finality": "ការបញ្ចប់តែមួយស្លត", "statelessness": "ភាពមិនរក្សាទិន្នន័យ", "see-contributors": "មើលអ្នករួមចំណែក", @@ -172,15 +280,14 @@ "show-all": "បង្ហាញ​ទាំងអស់", "show-less": "បង្ហាញតិច", "site-description": "Ethereum គឺជាវេទិកាវិមជ្ឈការសកល សម្រាប់រូបិយប័ណ្ណនិងជាកម្មវិធីបែបថ្មី។ នៅលើ Ethereum អ្នកអាចសរសេរកូដត្រួតពិនិត្យលុយ និងបង្កើតកម្មវិធីដែលអាចចូលប្រើប្រាស់បានគ្រប់ទីកន្លែងក្នុងពិភពលោក។", - "site-title": "ethereum.org", "skip-to-main-content": "រំលងទៅមាតិកាចម្បង", "smart-contracts": "កិច្ចសន្យាឆ្លាតវៃ", "stablecoins": "Stablecoins", "stake-eth": "តម្កល់​ ETH", "staking": "ការភ្នាល់", "start-here": "ចាប់​ផ្តើ​ម​នៅ​ទីនេះ", - "style-guide": "Style guide", "solo": "ការភ្នាល់ទោល", + "support": "គាំទ្រ", "terms-of-use": "ល័ក្ខខ័ណ្ឌនៃការប្រើប្រាស់", "translation-banner-body-new": "អ្នកកំពុងមើលទំព័រនេះជាភាសាអង់គ្លេស ដោយសារយើងមិនទាន់បានបកប្រែវានៅឡើយ។ ជួយយើងបកប្រែខ្លឹមសារនេះ។", "translation-banner-body-update": "មានកំណែថ្មីនៃទំព័រនេះ ប៉ុន្តែវាជាភាសាអង់គ្លេសឥឡូវនេះ។ ជួយយើងបកប្រែកំណែចុងក្រោយបំផុត។", @@ -191,12 +298,14 @@ "translation-banner-no-bugs-title": "គ្មានកំហុសនៅទីនេះទេ!", "translation-banner-no-bugs-content": "ទំព័រនេះមិនត្រូវបានបកប្រែទេ។ យើងបានដាក់ទំព័រនេះជាភាសាអង់គ្លេសដោយចេតនានៅពេលនេះ។", "translation-banner-no-bugs-dont-show-again": "កុំបង្ហាញម្តងទៀត", + "translation-program": "កម្មវិធីបកប្រែ", "try-using-search": "សាកល្បងប្រើការស្វែងរកដើម្បីស្វែងរកអ្វីដែលអ្នកកំពុងស្វែងរក ឬ", "tutorials": "ការបង្រៀន", "up": "ឡើង​លើ", + "use": "ប្រើ", "use-ethereum": "ប្រើ Ethereum", "use-ethereum-menu": "ប្រើម៉ឺនុយ Ethereum", - "user-experience": "User experience", + "use-menu": "ម៉ឺនុយប្រើប្រាស់", "verkle-trees": "Verkle trees", "wallets": "កាបូប", "we-couldnt-find-that-page": "យើង​រក​មិន​ឃើញ​ទំព័រ​នោះ​ទេ", diff --git a/src/intl/kn/common.json b/src/intl/kn/common.json index 11009f753e6..a4359e960d2 100644 --- a/src/intl/kn/common.json +++ b/src/intl/kn/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "ಅಕೌಂಟ್-ಅಬ್ಸ್ಟ್ರಾಕ್ಷನ್", "about-ethereum-org": "Ethereum.org ಬಗ್ಗೆ", "about-us": "ನಮ್ಮ ಬಗ್ಗೆ", + "adding-desci-projects": "Desci ಪ್ರಾಜೆಕ್ಟ್‌ಗಳನ್ನು ಸೇರಿಸುವುದು", + "adding-developer-tools": "ಡೆವಲಪರ್ ಟೂಲ್ಸ್ ಸೇರಿಸುವುದು", + "adding-exchanges": "ಎಕ್ಸ್‌ಚೇಂಜ್‌ಗಳನ್ನು ಸೇರಿಸುವುದು", + "adding-glossary-terms": "ಗ್ಲೋಸರಿ ಪದಗಳನ್ನು ಸೇರಿಸುವುದು", + "adding-staking-products": "ಸ್ಟ್ಯಾಕಿಂಗ್ ಉತ್ಪನ್ನಗಳನ್ನು ಸೇರಿಸುವುದು", + "adding-wallets": "ವ್ಯಾಲೆಟ್‌ಗಳನ್ನು ಸೇರಿಸುವುದು", + "account-abstraction": "ಅಕೌಂಟ್-ಅಬ್ಸ್ಟ್ರಾಕ್ಷನ್", + "acknowledgements": "ಸ್ವೀಕೃತಿಗಳು", "aria-toggle-search-button": "ಹುಡುಕಾಟ ಬಟನ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ", "aria-toggle-menu-button": "ಮೆನು ಬಟನ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ", "beacon-chain": "ಬೀಕನ್ ಚೈನ್", "bridges": "ಬ್ಲಾಕ್‌ಚೈನ್ ಸೇತುವೇಗಳು", + "bug-bounty": "ಬಗ್ ಬೌಂಟಿ", + "build": "ನಿರ್ಮಾಣ", + "build-menu": "ನಿರ್ಮಾಣ ಸೂಚಿ", "clear": "ಅಳಿಸು", "close": "ಮುಚ್ಚು", "community": "ಸಮುದಾಯ", "community-hub": "ಸಮುದಾಯದ ಮೆನು", "community-menu": "ಸಮುದಾಯದ ಮೆನು", "contact": "ಸಂಪರ್ಕ", + "content-buckets": "ವಿಷಯ ಬಕೆಟ್‌ಗಳು", + "content-resources": "ವಿಷಯ ಸಂಪನ್ಮೂಲಗಳು", "content-standardization": "ವಿಷಯ ಮಾನಕೀಕರಣ", "contributing": "ಕೊಡುಗೆ ನೀಡುತ್ತಿದೆ", "contributors": "ಕೊಡುಗೆದಾರರು", @@ -21,13 +33,16 @@ "copy": "ನಕಲು", "danksharding": "ಡ್ಯಾಂಕ್‌ಶಾರ್ಡಿಂಗ್", "dao-page": "ಡಿಎಒಗಳು - ವಿಕೇಂದ್ರೀಕರಿತ ಸ್ವಯಂಚಾಲಿತ ಸಂಸ್ಥೆಗಳು", - "dark-mode": "ಕತ್ತಲು / ಅಂಧಕಾರದ", + "dark-mode": "ಗಾಢ", "data-provided-by": "ಡೇಟಾ ಮೂಲ:", "decentralized-applications-dapps": "Dapps - ವಿಕೇಂದ್ರೀಕೃತ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು", "decentralized-identity": "ವಿಕೇಂದ್ರೀಕರಿತ ಗುರುತು", "decentralized-social-networks": "ವಿಕೇಂದ್ರೀಕರಿತ ಸಾಮಾಜಿಕ ಜಾಲಗಳು", "decentralized-science": "ಡಿಸೈ - ವಿಕೇಂದ್ರೀಕರಿತ ವಿಜ್ಞಾನ", - "defi-page": "ಡಿಫೈ - ವಿಕೇಂದ್ರೀಕರಿತ ಹಣಕಾಸು", + "description": "ಸಂಚರಣೆಯ ವಿವರ", + "defi-page": "DeFi - ವಿಕೇಂದ್ರೀಕರಿತ ಹಣಕಾಸು", + "design": "ವಿನ್ಯಾಸ", + "design-principles": "ವಿನ್ಯಾಸ ತತ್ವಗಳು", "devcon": "ಡೆವ್ಕಾನ್", "developers": "ಡೆವೆಲಪರ್", "developers-home": "ಡೆವಲಪರ್‌ಗಳ ಮುಖಪುಟ", @@ -47,23 +62,21 @@ "docsearch-no-results-missing": "ಈ ಪ್ರಶ್ನೆಗೆ ಫಲಿತಾಂಶಗಳು ಬರಬೇಕೆಂದು ನೀವು ನಂಬುತ್ತೀರಾ?", "docsearch-no-results-missing-link": "ನಮಗೆ ತಿಳಿಸಿ.", "docsearch-error-title": "ಫಲಿತಾಂಶಗಳನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ", - "docsearch-error-help": "ನೀವು ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಬಯಸುತ್ತೀರಿ.", + "docsearch-error-help": "ನೀವು ನಿಮ್ಮ ನೆಟ್‍ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಬಯಸುತ್ತೀರಿ.", "documentation": "ದಾಖಲೆ", "down": "ಕೆಳಗೆ", "ecosystem": "ಪರಿಸರ ವ್ಯವಸ್ಥೆ", "edit-page": "ಪುಟ ಸಂಪಾದಿಸಿ", - "ef-blog": "ಎಥೆರಿಯಂ ಫೌಂಡೇಶನ್ ಬ್ಲಾಗ್", - "eips": "ಎಥೆರಿಯಂ ಸುಧಾರಣಾ ಪ್ರಸ್ತಾವನೆಗಳು", + "ef-blog": "ಇಥಿರಿಯಂ ಫೌಂಡೇಶನ್ ಬ್ಲಾಗ್", + "eips": "ಇಥಿರಿಯಂ ಸುಧಾರಣಾ ಪ್ರಸ್ತಾವನೆಗಳು", "energy-consumption": "ಇಥಿರಿಯಮ್ ಶಕ್ತಿಯ ಬಳಕೆ", "enterprise": "ಉದ್ಯಮ", "enterprise-menu": "ಎಂಟರ್ಪ್ರೈಸ್ ಮೆನು", "esp": "ಪರಿಸರ ವ್ಯವಸ್ಥೆ ಬೆಂಬಲ ಕಾರ್ಯಕ್ರಮ", "eth-current-price": "ಪ್ರಸ್ತುತ ETH ಬೆಲೆ (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "ಇಥಿರಿಯಮ್ ಬಗ್ ಬೌಂಟಿ ಪ್ರೋಗ್ರಾಂ", "consensus-when-shipping": "ಇದು ಯಾವಾಗ ಶಿಪ್ಪಿಂಗ್?", "ethereum-upgrades": "ಇಥಿರಿಯಮ್ ನವೀಕರಣಗಳು", - "ethereum-brand-assets": "Ethereum brand assets", "ethereum-online": "ಆನ್ ಲೈನ್ ಸಮುದಾಯಗಳು", "ethereum-events": "ಇಥಿರಿಯಮ್ ಘಟನೆಗಳು", "ethereum-foundation": "ಇಥಿರಿಯಮ್ ಫೌಂಡೇಶನ್", @@ -75,7 +88,7 @@ "ethereum-protocol": "ಇಥಿರಿಯಮ್ ಪ್ರೊಟೋಕಾಲ್", "ethereum-security": "ಇಥಿರಿಯಮ್ ಭದ್ರತೆ ಮತ್ತು ಹಗರಣ ತಡೆಗಟ್ಟುವಿಕೆ", "ethereum-support": "ಇಥಿರಿಯಮ್ ಬೆಂಬಲ", - "ethereum-wallets": "ಇಥಿರಿಯಮ್ ವ್ಯಾಲೆಟ್ ಗಳು", + "ethereum-wallets": "ಇಥಿರಿಯಮ್ ವ್ಯಾಲೆಟ್‍ಗಳು", "ethereum-whitepaper": "ಇಥಿರಿಯಮ್ ಶ್ವೇತಪತ್ರ", "feedback-widget-prompt": "ಈ ಪುಟವು ಸಹಾಯಕವಾಗಿದೆಯೇ?", "feedback-card-prompt-page": "ಈ ಪುಟವು ಸಹಾಯಕವಾಗಿದೆಯೇ?", @@ -94,11 +107,10 @@ "grants": "ಅನುದಾನಗಳು", "grant-programs": "ಪರಿಸರ ವ್ಯವಸ್ಥೆ ಅನುದಾನ ಕಾರ್ಯಕ್ರಮಗಳು", "guides": "ಮಾರ್ಗದರ್ಶಿಗಳು", - "guides-hub": "ಮಾರ್ಗದರ್ಶಿ ಕೇಂದ್ರ", + "guides-hub": "ಗೈಡ್ಸ್ ಹೇಗೆ", "history-of-ethereum": "ಇಥಿರಿಯಮ್ ನ ಇತಿಹಾಸ", "home": "ಹೋಮ್", "how-ethereum-works": "ಇಥಿರಿಯಮ್ ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ", - "how-to-register-an-ethereum-account": "ಇಥಿರಿಯಮ್ ಖಾತೆಯನ್ನು \"ನೋಂದಾಯಿಸುವುದು\" ಹೇಗೆ", "how-to-revoke-token-access": "ನಿಮ್ಮ ಕ್ರಿಪ್ಟೋ ಫಂಡ್ಗಳಿಗೆ ಸ್ಮಾರ್ಟ್ ಕಾಂಟ್ರಾಕ್ಟ್ ಪ್ರವೇಶವನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವುದು ಹೇಗೆ", "how-to-swap-tokens": "ಟೋಕನ್ ಗಳನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳುವುದು ಹೇಗೆ", "how-to-use-a-bridge": "ಟೋಕನ್ ಗಳನ್ನು ಲೇಯರ್ 2 ಗೆ ಹೇಗೆ ಸೇತುವೆ ಮಾಡುವುದು", @@ -128,10 +140,105 @@ "loading-error-try-again-later": "ಡೇಟಾ ಲೋಡ್ ಮಾಡಲು ಅಸಮರ್ಥವಾಗಿದೆ. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.", "logo": "ಲೋಗೋ", "mainnet-ethereum": "ಮೈನೆಟ್ ಇಥಿರಿಯಮ್", + "merge": "ವಿಲೀನಗೊಳಿಸಿ", "more": "ಇನ್ನಷ್ಟು", - "nav-developers": "ಡೆವೆಲಪರ್", + "nav-about-description": "ಎಥೆರಿಯಮ್ ಸಮುದಾಯಕ್ಕೆ ಒಂದು ಸಾರ್ವಜನಿಕ, ಮುಕ್ತ ಸಂಪನ್ಮೂಲ ಯೋಜನೆಯಾಗಿದೆ", + "nav-advanced-description": "ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾದ ವಿಷಯಗಳನ್ನು ಕಲಿಯಿರಿ", + "nav-advanced-label": "ಮುಂದುವರೆದ", + "nav-basics-description": "ಎಥೆರಿಯಮ್ಮಿನ ಮೂಲಭೂತ ಅಂಶಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಿ", + "nav-basics-label": "ಮೂಲಭೂತ ಅಂಶಗಳು", + "nav-bridges-description": "ವೆಬ್3ಯು ಪ್ರಾಥಮಿಕ ಎಲ್1 ಬ್ಲಾಕ್ ಚೈನ್ಗಳು ಮತ್ತು ಎಲ್2 ಸ್ಕೇಲಿಂಗ್ ಪರಿಹಾರಗಳ ವ್ಯವಹಾರ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯಾಗಿ ವಿಕಸನಗೊಂಡಿದೆ", + "nav-builders-home-description": "ಎಥೆರಿಯಮ್ಗಾಗಿ ನಿರ್ಮಿತರ ಕೈಪಿಡಿ - ನಿರ್ಮಿತರಿಂದ, ನಿರ್ಮಿತರಿಗಾಗಿ", + "nav-builders-home-label": "ನಿರ್ಮಿತರ ಮನೆ", + "nav-contribute-description": "ನೀವು ಸಹಾಯ ಮಾಡಲು ಬಯಸಿದರೆ, ಇದು ನಿಮಗೆ ಮಾರ್ಗದರ್ಶನ ನೀಡುತ್ತದೆ", + "nav-contribute-label": "Ethereum.org ಗೆ ಕೊಡುಗೆ ನೀಡು", + "nav-dao-description": "ಕೇಂದ್ರೀಕೃತ ಅಧಿಕಾರವಿಲ್ಲದ ಸದಸ್ಯ-ಮಾಲೀಕತ್ವದ ಸಮುದಾಯಗಳು", + "nav-dapps-description": "ಎಥೆರಿಯಮ್ ಬಳಸಿ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಸಮೃದ್ಧ ವ್ಯವಹಾರ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯನ್ನು ಅನ್ವೇಷಿಸಿ", + "nav-defi-description": "ಸಾಂಪ್ರದಾಯಿಕ ಹಣಕಾಸು ಮಾರುಕಟ್ಟೆಗೆ ಜಾಗತಿಕ, ಮುಕ್ತ ಪರ್ಯಾಯ", + "nav-desci-description": "ಪ್ರಸ್ತುತ ವೈಜ್ಞಾನಿಕ ವ್ಯವಸ್ಥೆಗೆ ಜಾಗತಿಕ, ಮುಕ್ತ ಪರ್ಯಾಯ", + "nav-desoc-description": "ಸಾಮಾಜಿಕ ಸಂವಹನ ಮತ್ತು ವಿಷಯ ಸೃಷ್ಟಿಗಾಗಿ ಬ್ಲಾಕ್ಚೈನ್ ಆಧಾರಿತ ವೇದಿಕೆಗಳು", "nav-developers-docs": "ಡೆವಲಪರ್‌ಗಳ ಮುಖಪುಟ", + "nav-developers": "ಡೆವೆಲಪರ್", + "nav-did-description": "ನಿಮ್ಮ ಅನನ್ಯ ವಿಕೇಂದ್ರೀಕೃತ ಗುರುತಿಸುವಿಕೆಗಳನ್ನು ವಿತರಿಸಿ ಮತ್ತು ಹೊಂದಿರಿ", + "nav-docs-description": "ಎಥೆರಿಯಮ್ನೊಂದಿಗೆ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ಮತ್ತು ನಿರ್ಮಿಸಲು ನಿಮಗೆ ಸಹಾಯಕ್ಕೆ ಬೇಕಾಗುವ ದಾಖಲೆಗಳು", + "nav-docs-design-description": "ಅನನ್ಯ ವೆಬ್3 ಸವಾಲಾತ್ಮಕ ವಿನ್ಯಾಸಗಳು, ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು ಮತ್ತು ಬಳಕೆದಾರರ ಸಂಶೋಧನಾ ಒಳನೋಟಗಳ ವಿವರಣೆ", + "nav-docs-design-label": "UX/UI ವಿನ್ಯಾಸದ ಮೂಲಭೂತ ಅಂಶಗಳು", + "nav-docs-foundation-description": "ಎಥೆರಿಯಂನಲ್ಲಿ ಅಭಿವೃದ್ಧಿಪಡಿಸಲು ಬೇಕಾದ ಪ್ರಮುಖ ಮೂಲಭೂತ ಅಂಶಗಳು", + "nav-docs-overview-description": "ಡೆವಲಪರ್ ದಾಖಲೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಮನೆ", + "nav-docs-stack-description": "ಎಥೆರಿಯಮ್ ಸ್ಟಾಕಿನ ಎಲ್ಲಾ ವಿವರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಿ", + "nav-eip-description": "ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳು ಅಥವಾ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ ಮಾನದಂಡಗಳು", + "nav-eip-label": "ಇಥಿರಿಯಂ ಸುಧಾರಣಾ ಪ್ರಸ್ತಾವನೆಗಳು(ಇಸುಪ್ರ ಗಳು)", + "nav-emerging-description": "ಎಥೆರಿಯಮ್ನ ಇತರ ಹೊಸ ಬಳಕೆಯ ಪ್ರಕರಣಗಳನ್ನು ತಿಳಿದುಕೊಳ್ಳಿ", + "nav-enterprise-description": "ಎಥೆರಿಯಮ್ಗಾಗಿ ವ್ಯವಹಾರ ಅಪ್ಲಿಕೇಶನ್ಗಳು", + "nav-ethereum-org-description": "ಈ ಜಾಲತಾಣವು ಸಮುದಾಯ ಪ್ರೇರಿತವಾಗಿದೆ - ನಮ್ಮೊಂದಿಗೆ ಸೇರಿ ಹಾಗೂ ಕೊಡುಗೆ ನೀಡಿ", + "nav-ethereum-wallets-description": "ನಿಮ್ಮ ಎಥೆರಿಯಮ್ ಖಾತೆಯೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲು ಒಂದು ಅಪ್ಲಿಕೇಶನ್", + "nav-events-description": "ವಿಕೇಂದ್ರೀಕರಣ ಮತ್ತು ಯಾರಿಗಾದರೂ ಭಾಗವಹಿಸುವ ಸ್ವಾತಂತ್ರ್ಯ", + "nav-events-irl-description": "ಪ್ರತಿ ತಿಂಗಳು ವೈಯಕ್ತಿಕವಾಗಿ ಮತ್ತು ಆನ್ಲೈನ್ನಲ್ಲಿ ಬಹಳ ಎಥೆರಿಯಮ್ ಕಾರ್ಯಕ್ರಮಗಳು ನಡೆಯುತ್ತವೆ", + "nav-events-label": "ಸಮುದಾಯಗಳು ಮತ್ತು ಕಾರ್ಯಕ್ರಮಗಳು", + "nav-events-online-description": "ಈ ಆನ್ಲೈನ್ ಸಮುದಾಯಗಳಲ್ಲಿ ಲಕ್ಷಾಂತರ ಎಥೆರಿಯಮ್ ಉತ್ಸಾಹಿಗಳ ತಂದೆ", + "nav-find-wallet-description": "ಕ್ರಿಪ್ಟೊವನ್ನು ಬಳಸಲು ವಾಲೆಟ್ಗಳು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತವೆ.", + "nav-find-wallet-label": "ನಿಮ್ಮ ವಾಲೆಟ್ಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ", + "nav-gas-fees-description": "ಎಥ್ ವಹಿವಾಟು ಶುಲ್ಕಗಳನ್ನು ಹೇಗೆ ಲೆಕ್ಕ ಹಾಕಲಾಗುತ್ತದೆ", + "nav-get-eth-description": "ಎಥೆರಿಯಮ್ ಅನ್ವಯಿಕೆಗಳನ್ನು ಬಳಸಲು ನಿಮಗೆ ಎಥೆರ್ (ಎಥ್) ನ ಅಗತ್ಯವಿದೆ", + "nav-get-started-description": "ಎಥೆರಿಯಮ್ ಅನ್ನು ಬಳಸಲು ನಿಮ್ಮ ಮೊದಲ ಹಂತಗಳು", + "nav-governance-description": "ಎಥೆರಿಯಮ್ ಶಿಷ್ಟಾಚಾರವನ್ನು ಮೇಲ್ದರ್ಜೆಗೇರಿಸುವಲ್ಲಿ ಒಳಗೊಂಡಿರುವ ಪ್ರಕ್ರಿಯೆ", + "nav-grants-description": "ಅನುದಾನ ಧನಸಹಾಯ ಕಾರ್ಯಕ್ರಮಗಳನ್ನು ಒದಗಿಸುವ ಯೋಜನೆಗಳ ಕುರಿತು ನಮ್ಮ ಸಮುದಾಯದಿಂದ ಸಂಗ್ರಹಿಸಲಾದ ಪಟ್ಟಿ", + "nav-guide-create-account-description": "ಯಾರಾದರೂ ಯಾವುದೇ ಸಮಯದಲ್ಲಿ, ವ್ಯಾಲೆಟ್ ಅಪ್ಲಿಕೇಶನ್ನೊಂದಿಗೆ ಉಚಿತವಾಗಿ ಎಥೆರಿಯಮ್ ಖಾತೆಯನ್ನು ರಚಿಸಬಹುದು", + "nav-guide-revoke-access-description": "ಎಥೆರಿಯಮ್ ವ್ಯವಹಾರ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯಲ್ಲಿ ಸ್ಮಾರ್ಟ್ ಒಪ್ಪಂದಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸುವಾಗ ಸುರಕ್ಷಿತವಾಗಿರಿ", + "nav-guide-revoke-access-label": "ಸ್ಮಾರ್ಟ್ ಕಾಂಟ್ರಾಕ್ಟ್ ಪ್ರವೇಶವನ್ನು ರದ್ದುಪಡಿಸುವುದು ಹೇಗೆ", + "nav-guide-use-wallet-description": "ವಾಲೆಟಿನ ಎಲ್ಲಾ ಮೂಲಭೂತ ಕಾರ್ಯಗಳನ್ನು ಹೇಗೆ ನಿರ್ವಹಿಸಬೇಕು ಎಂಬುದನ್ನು ತಿಳಿಯಿರಿ", + "nav-guide-use-wallet-label": "ವ್ಯಾಲೆಟ್ ಬಳಸುವುದು ಹೇಗೆ", + "nav-guides-description": "ನಿಮಗೆ ಪ್ರಾರಂಭಿಸಲು ಸಹಾಯ ಮಾಡಲು ಬೇಕಾದ ಪ್ರಾಯೋಗಿಕ ಹಂತ-ಹಂತದ ಮಾರ್ಗದರ್ಶಿಗಳು", + "nav-guides-label": "ಮಾರ್ಗದರ್ಶನ ಮಾಡುವುದು ಹೇಗೆ", + "nav-history-description": "ಎಲ್ಲಾ ಪ್ರಮುಖ ಫೋರ್ಕ್ಗಳ ಮತ್ತು ನವೀಕರಣಗಳ ಟೈಮ್ಲೈನ್", + "nav-history-label": "ಎಥೆರಿಯಮ್ನ ತಾಂತ್ರಿಕ ಇತಿಹಾಸ", + "nav-layer-2-description": "ಎಥೆರಿಯಂಗೆ ಅಗ್ಗದ ಮತ್ತು ವೇಗದ ವಹಿವಾಟುಗಳು", + "nav-learn-by-coding-description": "ಎಥೆರಿಯಮ್ನೊಂದಿಗೆ ಪ್ರಯೋಗ ಮಾಡಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುವ ಉಪಕರಣಗಳು", + "nav-local-env-description": "ನಿಮ್ಮ ಎಥೆರಿಯಮ್ ಅಭಿವೃದ್ಧಿ ಸ್ಟ್ಯಾಕ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿ ಮತ್ತು ಹೊಂದಿಸಿ", + "nav-mainnet-description": "ಎಂಟರ್ಪ್ರೈಸ್ ಬ್ಲಾಕ್ಚೈನ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಸಾರ್ವಜನಿಕ ಎಥೆರಿಯಮ್ ಮೇನ್ನೆಟ್ನಲ್ಲಿ ನಿರ್ಮಿಸಬಹುದು", + "nav-nft-description": "ಇಥಿರಿಯಮ್ ಆಧಾರಿತ ಆಸ್ತಿಯಾಗಿ ಅನನ್ಯವಾದ ಯಾವುದನ್ನಾದರೂ ಪ್ರತಿನಿಧಿಸುವ ಒಂದು ಮಾರ್ಗ", + "nav-open-research-description": "ಎಥೆರಿಯಮ್ನ ಪ್ರಾಥಮಿಕ ಸಾಮರ್ಥ್ಯಗಳಲ್ಲಿ ಒಂದು ಅದರ ಸಕ್ರಿಯ ಸಂಶೋಧನಾ ಸಮುದಾಯವಾಗಿದೆ", + "nav-open-research-label": "ಮುಕ್ತ ಸಂಶೋಧನೆ", + "nav-overview-description": "ಎಲ್ಲ ವಿಷಯಗಳು ಎಥೆರಿಯಮ್ ಶಿಕ್ಷಣ", + "nav-participate-overview-description": "ಹೇಗೆ ಭಾಗವಹಿಸಬೇಕು ಎಂಬುದರ ಕುರಿತು ಅವಲೋಕನ", "nav-primary": "ಪ್ರಾಥಮಿಕ", + "nav-quizzes-description": "ನೀವು ಎಥೆರಿಯಮ್ ಮತ್ತು ಕ್ರಿಪ್ಟೋಕರೆನ್ಸಿಗಳನ್ನು ಎಷ್ಟು ಚೆನ್ನಾಗಿ ಅರ್ಥಮಾಡಿಕೊಂಡಿದ್ದೀರಿ ಎಂಬುದನ್ನು ಕಂಡುಕೊಳ್ಳಿ", + "nav-quizzes-label": "ನಿಮ್ಮ ಜ್ಞಾನವನ್ನು ಪರೀಕ್ಷಿಸಿ", + "nav-refi-description": "ಪರ್ಯಾಯ ಆರ್ಥಿಕ ವ್ಯವಸ್ಥೆಯು ಪುನರುತ್ಪಾದಕ ತತ್ವಗಳ ಮೇಲೆ ನಿರ್ಮಾಣವಾಗಿದೆ", + "nav-research-description": "ಎಥೆರಿಯಮ್ ಅನ್ನು ಸುಧಾರಿಸಲು ಬಳಸಲಾಗುವ ಪ್ರಕ್ರಿಯೆಗಳು", + "nav-research-label": "ಸಂಶೋಧನೆ ಮತ್ತು ಅಭಿವೃದ್ಧಿ", + "nav-roadmap-description": "ಎಥೆರಿಯಂಗೆ ಹೆಚ್ಚು ಸ್ಕೇಲೆಬಿಲಿಟಿ, ಭದ್ರತೆ ಮತ್ತು ಸುಸ್ಥಿರತೆಯ ಹಾದಿ", + "nav-roadmap-future-description": "ಎಥೆರಿಯಮ್ ಅನ್ನು ದೃಢವಾದ ಮತ್ತು ವಿಕೇಂದ್ರೀಕೃತ ಜಾಲವಾಗಿ ಒಗ್ಗೂಡಿಸುವುದು", + "nav-roadmap-future-label": "ಭವಿಷ್ಯ-ನಿರೋಧಕ", + "nav-roadmap-label": "ಮಾರ್ಗಸೂಚಿ", + "nav-roadmap-scaling-description": "ವಹಿವಾಟಿನ ವೆಚ್ಚ ಮತ್ತು ವೇಗವನ್ನು ಮತ್ತಷ್ಟು ಕಡಿಮೆ ಮಾಡಲು ಜಾಲಬಂಧ ನವೀಕರಣಗಳು", + "nav-roadmap-security-description": "ಭವಿಷ್ಯದಲ್ಲಿ ಎಲ್ಲಾ ರೀತಿಯ ದಾಳಿಗಳಿಗೆ ಎಥೆರಿಯಮ್ ಸ್ಥಿತಿಸ್ಥಾಪಕತ್ವವನ್ನು ಹೊಂದಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುವುದು", + "nav-roadmap-security-label": "ಭದ್ರತೆಯನ್ನು ಹೆಚ್ಚಿಸಲಾಗಿದೆ", + "nav-roadmap-ux-description": "ಎಥೆರಿಯಮ್ ಬಳಕೆಯನ್ನು ಸರಳೀಕರಿಸಬೇಕಾಗಿದೆ", + "nav-run-a-node-description": "ಜಾಲಬಂಧವನ್ನು ಭದ್ರಪಡಿಸಿಕೊಳ್ಳಲು ಸಹಾಯ ಮಾಡುವಾಗ ಸಂಪೂರ್ಣ ಸಾರ್ವಭೌಮತ್ವವನ್ನು ಹೊಂದಿರಿ", + "nav-security-description": "ಕ್ರಿಪ್ಟೋಕರೆನ್ಸಿಯನ್ನು ಬಳಸುವಾಗ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಕಲಿಯಿರಿ", + "nav-smart-contracts-description": "ಎಥೆರಿಯಮ್ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯ ಮೂಲಭೂತ ಬುಲ್ಡಿಂಗ್ ಬ್ಲಾಕ್ಗಳು", + "nav-stablecoins-description": "ಸ್ಥಿರ ನಾಣ್ಯಗಳು ಸ್ಥಿರ ಮೌಲ್ಯದಲ್ಲಿ ಉಳಿಯಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾದ ಎಥೆರಿಯಮ್ ಟೋಕನ್ಗಳಾಗಿವೆ", + "nav-stake-description": "ಎಥೆರಿಯಮ್ ಅನ್ನು ಭದ್ರಪಡಿಸಿಕೊಂಡಿದ್ದಕ್ಕಾಗಿ ಬಹುಮಾನಗಳನ್ನು ಗಳಿಸಿ", + "nav-stake-label": "ಸ್ಟೇಕ್", + "nav-staking-home-description": "ಸ್ಟೇಕಿಂಗ್ಗಾಗಿ ವಿವಿಧ ಆಯ್ಕೆಗಳ ಅವಲೋಕನ", + "nav-staking-home-label": "Staking ಮುಖಪುಟ", + "nav-staking-pool-description": "ಇತರರೊಂದಿಗೆ ಸೇರುವ ಮೂಲಕ ಯಾವುದೇ ಪ್ರಮಾಣದ ಇ. ಟಿ. ಎಚ್. ನೊಂದಿಗೆ ಪಾಲುದಾರಿಕೆ ಮಾಡಿಕೊಳ್ಳಿ ಮತ್ತು ಬಹುಮಾನಗಳನ್ನು ಗಳಿಸಿ", + "nav-staking-pool-label": "ಪೂಲ್ಡ್ Staking", + "nav-staking-saas-description": "ಮೂರನೇ ಪಕ್ಷದ ನೋಡ್ ಆಪರೇಟರ್ ಗಳು ನಿಮ್ಮ ವ್ಯಾಲಿಡೇಟರ್ ಕ್ಲೈಂಟ್ ನ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ನಿರ್ವಹಿಸುತ್ತಾರೆ", + "nav-staking-saas-label": "ಸೇವೆಯೊಂದಿಗೆ ಸ್ಟಾಕಿಂಗ್", + "nav-staking-solo-description": "ನಿಮ್ಮ ಮನೆಯ ಹಾರ್ಡ್‌ವೇರ್ ಅನ್ನು ಚಲಾಯಿಸಿ ಮತ್ತು ವೈಯಕ್ತಿಕವಾಗಿ ಎಥೆರಿಯಂ ನೆಟ್‌ವರ್ಕ್‌ನ ಭದ್ರತೆ ಮತ್ತು decentralization ಗೆ ಸೇರಿಸಿ", + "nav-staking-solo-label": "ಏಕವ್ಯಕ್ತಿ Staking", + "nav-start-building-description": "ಹೊಸಬರಿಗೆ ಉಪಯುಕ್ತ ಮಾಹಿತಿ", + "nav-translation-program-description": "Ethereum.org ಅನ್ನು ಎಲ್ಲಾ ಭಾಷೆಗಳಿಗೆ ಭಾಷಾಂತರಿಸಲು ಸಹಯೋಗದ ಪ್ರಯತ್ನ", + "nav-tutorials-description": "ಸಮುದಾಯ ಬೋಧನೆಗಳ ಕ್ಯುರೇಟೆಡ್ ಪಟ್ಟಿ", + "nav-use-cases-description": "ಎಥೆರಿಯಮ್ ಬಳಕೆಗೆ ವಿವಿಧ ವಿಚಾರಗಳನ್ನು ಕಂಡುಕೊಳ್ಳಿ", + "nav-what-is-ether-description": "ಎಥೆರಿಯಮ್ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಕರೆನ್ಸಿ", + "nav-what-is-ethereum-description": "ಎಥೆರಿಯಮ್ ಅನ್ನು ಯಾವುದು ವಿಶೇಷವಾಗಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಿ", + "nav-what-is-web3-label": "Web3 ಎಂದರೇನು?", + "nav-what-is-web3-description": "ನಿಯಮಗಳನ್ನು ನಿರ್ದೇಶಿಸುವ ಕೇಂದ್ರೀಕೃತ ಏಕಸ್ವಾಮ್ಯಗಳಿಗೆ ಪರ್ಯಾಯ", + "nav-whitepaper-description": "2014ರಲ್ಲಿ ವಿಟಾಲಿಕ್ ಬ್ಯೂಟೆರಿನ್ ಬರೆದ ಮೂಲ ಎಥೆರಿಯಮ್ ಶ್ವೇತಪತ್ರ", + "nav-zkp-description": "ಹೇಳಿಕೆಯನ್ನು ಬಹಿರಂಗಪಡಿಸದೆ ಹೇಳಿಕೆಯ ಸಿಂಧುತ್ವವನ್ನು ಸಾಬೀತುಪಡಿಸುವ ಒಂದು ಮಾರ್ಗ", "nft-page": "NFTs - ಶಿಲೀಂಧ್ರವಲ್ಲದ ಟೋಕನ್ ಗಳು", "nfts": "NFTs", "no": "ಇಲ್ಲ", @@ -140,6 +247,7 @@ "page-developers-aria-label": "ಅಭಿವರ್ಧಕರ ಮೆನು", "page-index-meta-title": "ಹೋಮ್", "page-last-updated": "ಪುಟವನ್ನು ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ", + "participate-menu": "ಭಾಗವಹಿಸುವ ಮೆನು", "pbs": "ಪ್ರಪೋಸರ್-ಬಿಲ್ಡರ್ ಪ್ರತ್ಯೇಕತೆ", "pools": "ಪೂಲ್ಡ್ Staking", "privacy-policy": "ಗೌಪ್ಯತೆ ನೀತಿ", @@ -150,10 +258,10 @@ "refresh": "ದಯವಿಟ್ಟು ಪುಟವನ್ನು ತಾಜಾ ಮಾಡಿ.", "return-home": "ಮುಖಪುಟ ಹಿಂತಿರುಗಿ", "roadmap": "ಇಥಿರಿಯಮ್ ಮಾರ್ಗಸೂಚಿ", + "research": "ಸಂಶೋಧನೆ", + "research-menu": "ಸಂಶೋಧನಾ ಮೆನು", "resources": "ಅನುವಾದ ಸಂಪನ್ಮೂಲಗಳು", "regenerative-finance": "ReFi - ಪುನರುತ್ಪಾದಕ ಹಣಕಾಸು", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "ಡೆವಲಪರ್ ಡಾಕ್ಸ್", "rollup-component-technology-and-risk-summary": "ತಂತ್ರಜ್ಞಾನ ಮತ್ತು ಅಪಾಯದ ಸಾರಾಂಶ", "scaling": "ಅಗತ್ಯನುಸಾರ", @@ -168,18 +276,15 @@ "statelessness": "ಸ್ಥಿತಿ ರಹಿತತೆ", "see-contributors": "ಕೊಡುಗೆದಾರರನ್ನು ನೋಡಿ", "set-up-local-env": "ಸ್ಥಳೀಯ ಪರಿಸರವನ್ನು ಸ್ಥಾಪಿಸಿ", - "sharding": "Sharding", "show-all": "ಎಲ್ಲವನ್ನೂ ತೋರಿಸು", "show-less": "ಕಡಿಮೆ ತೋರಿಸು", "site-description": "\"ಎಥೆರಿಯಂ ಹಣ ಮತ್ತು ಹೊಸ ರೀತಿಯ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಜಾಗತಿಕ, ವಿಕೇಂದ್ರೀಕೃತ ವೇದಿಕೆಯಾಗಿದೆ. ಎತೆರಿಯಮ್, ನೀವು ಹಣವನ್ನು ನಿಯಂತ್ರಿಸುವ ಕೋಡ್ ಅನ್ನು ಬರೆಯಬಹುದು ಮತ್ತು ಪ್ರಪಂಚದಲ್ಲಿ ಎಲ್ಲಿಯಾದರೂ ಪ್ರವೇಶಿಸಬಹುದಾದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಬಹುದು\".", - "site-title": "ethereum.org", "skip-to-main-content": "ಮುಖ್ಯ ವಿಷಯಕ್ಕೆ ಬಿಟ್ಟುಬಿಡಿ", "smart-contracts": "ಸ್ಮಾರ್ಟ್ ಕಾಂಟ್ರಾಕ್ಟ್ ಗಳು", "stablecoins": "ಸ್ಟೇಬಲ್‍ಕಾಯಿನ್‍‍ಗಳು", "stake-eth": "ETH ಸ್ಟೇಕ್ ಮಾಡಿ", "staking": "Staking", "start-here": "ಇಲ್ಲಿ ಪ್ರಾರಂಭಿಸಿ", - "style-guide": "Style guide", "solo": "ಏಕವ್ಯಕ್ತಿ Staking", "terms-of-use": "ಬಳಕೆಯ ನಿಯಮಗಳು", "translation-banner-body-new": "ನೀವು ಈ ಪುಟವನ್ನು ಇಂಗ್ಲಿಷ್ ನಲ್ಲಿ ನೋಡುತ್ತಿದ್ದೀರಿ ಏಕೆಂದರೆ ನಾವು ಇನ್ನೂ ಅದನ್ನು ಅನುವಾದಿಸಿಲ್ಲ. ಈ ವಿಷಯವನ್ನು ಭಾಷಾಂತರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡಿ.", @@ -191,17 +296,19 @@ "translation-banner-no-bugs-title": "ಇಲ್ಲಿ ದೋಷಗಳಿಲ್ಲ!", "translation-banner-no-bugs-content": "ಈ ಪುಟವನ್ನು ಭಾಷಾಂತರಿಸಲಾಗುತ್ತಿಲ್ಲ. ನಾವು ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ ಈ ಪುಟವನ್ನು ಇಂಗ್ಲಿಷ್ ನಲ್ಲಿ ಬಿಟ್ಟಿದ್ದೇವೆ.", "translation-banner-no-bugs-dont-show-again": "ಮತ್ತೆ ತೋರಿಸಬೇಡಿ", + "translation-program": "ಅನುವಾದ ಪ್ರೋಗ್ರಾಂ", "try-using-search": "ನೀವು ಏನನ್ನು ಹುಡುಕುತ್ತಿದ್ದೀರಿ ಎಂಬುದನ್ನು ಕಂಡುಹಿಡಿಯಲು ಹುಡುಕಾಟವನ್ನು ಬಳಸಲು ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ", "tutorials": "ಟ್ಯುಟೋರಿಯಲ್ ಗಳು", "up": "ಮೇಲೇ", + "use": "ಬಳಸಿ", "use-ethereum": "ಇಥಿರಿಯಮ್ ಬಳಸಿ", "use-ethereum-menu": "ಇಥಿರಿಯಮ್ ಮೆನು ಬಳಸಿ", + "use-menu": "ಬಳಸಿ ಮೆನು", "user-experience": "ಬಳಕೆದಾರರ ಅನುಭವ", "verkle-trees": "ವೆರ್ಕಲ್ ಮರಗಳು", "wallets": "ವ್ಯಾಲೆಟ್‍ಗಳು", "we-couldnt-find-that-page": "ನಮಗೆ ಆ ಪುಟವನ್ನು ಹುಡುಕಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", "web3": "Web3 ಎಂದರೇನು?", - "web3-title": "Web3", "website-last-updated": "ವೆಬ್ ಸೈಟ್ ಕೊನೆಯದಾಗಿ ನವೀಕರಿಸಲಾಗಿದೆ", "what-is-ether": "ಇಥರ್ (ETH) ಎಂದರೇನು?", "what-is-ethereum": "ಇಥಿರಿಯಮ್ ಎಂದರೇನು?", diff --git a/src/intl/ko/common.json b/src/intl/ko/common.json index 0fa72c87cc7..ca22bd4dcc7 100644 --- a/src/intl/ko/common.json +++ b/src/intl/ko/common.json @@ -1,17 +1,31 @@ { - "account-abstraction": "계정 추상화", "about-ethereum-org": "ethereum.org 소개", "about-us": "회사 소개", + "adding-desci-projects": "DeSci 프로젝트 추가", + "adding-developer-tools": "개발자 도구 추가", + "adding-exchanges": "거래소 추가", + "adding-glossary-terms": "용어집 용어 추가", + "adding-layer-2s": "Layer 2s (오프체인) 추가", + "adding-products": "제품 추가하기", + "adding-staking-products": "스테이킹 상품 추가", + "adding-wallets": "지갑 추가", + "account-abstraction": "계정 추상화", + "acknowledgements": "감사의 글", "aria-toggle-search-button": "검색 버튼 보이기/숨기기", "aria-toggle-menu-button": "메뉴 버튼 보이기/숨기기", "beacon-chain": "비콘 체인", "bridges": "블록체인 브리지", + "bug-bounty": "버그 포상금", + "build": "빌드", + "build-menu": "빌드 메뉴", "clear": "지우기", "close": "닫기", "community": "커뮤니티", "community-hub": "커뮤니티 허브", "community-menu": "커뮤니티 메뉴", "contact": "문의처", + "content-buckets": "콘텐츠 버킷", + "content-resources": "콘텐츠 참고 자료", "content-standardization": "콘텐츠 표준화", "contributing": "기여", "contributors": "기여자", @@ -20,14 +34,17 @@ "copied": "복사 완료", "copy": "복사", "danksharding": "댄크샤딩", - "dao-page": "분산형 자율 조직(DAO)", + "dao-page": "DAO - 분산형 자율 조직", "dark-mode": "다크", "data-provided-by": "데이터 원본:", - "decentralized-applications-dapps": "분산형 애플리케이션(디앱)", + "decentralized-applications-dapps": "디앱 - 분산형 애플리케이션", "decentralized-identity": "탈중앙화 신원 증명", "decentralized-social-networks": "탈중앙화 소셜 네트워크", - "decentralized-science": "탈중앙화 과학(DeSci)", - "defi-page": "분산형 금융(DeFi)", + "decentralized-science": "DeSci - 탈중앙화 과학", + "description": "탐색 항목에 대한 설명", + "defi-page": "DeFi - 분산형 금융", + "design": "디자인", + "design-principles": "디자인 원칙", "devcon": "Devcon", "developers": "개발자", "developers-home": "개발자 홈", @@ -51,7 +68,7 @@ "documentation": "개발문서", "down": "아래로", "ecosystem": "생태계", - "edit-page": "페이지 수정", + "edit-page": "페이지 편집", "ef-blog": "이더리움 재단 블로그", "eips": "이더리움 개선 제안", "energy-consumption": "이더리움 에너지 소비량", @@ -83,22 +100,22 @@ "feedback-card-prompt-tutorial": "이 튜토리얼이 도움이 되셨나요?", "feedback-widget-thank-you-title": "피드백을 주셔서 감사합니다!", "feedback-widget-thank-you-subtitle": "몇 가지 질문에 답하여 이 페이지를 개선해 주세요.", - "feedback-widget-thank-you-subtitle-ext": "도움이 필요하다면 Discord에서 커뮤니티를 활용해 보십시오.", + "feedback-widget-thank-you-subtitle-ext": "도움이 필요하시면 Discord에서 커뮤니티에 연락해 볼 수 있습니다.", "feedback-widget-thank-you-timing": "2–3분", "feedback-widget-thank-you-cta": "짧은 공개 설문조사", "find-wallet": "지갑 찾기", "future-proofing": "미래 대비", - "get-eth": " ETH 사기", + "get-eth": "이더 구매하기", "get-involved": "참여하기", "get-started": "시작하기", "grants": "지원금", "grant-programs": "생태계 지원금 프로그램", "guides": "가이드", - "guides-hub": "가이드 허브", + "guides-hub": "사용법 안내서", "history-of-ethereum": "이더리움 연혁", "home": "홈", "how-ethereum-works": "이더리움의 작동 원리", - "how-to-register-an-ethereum-account": "이더리움 계정을 \"등록\"하는 방법", + "how-to-create-an-ethereum-account": "이더리움 계정 \"생성\"하는 법", "how-to-revoke-token-access": "암호화폐 자금에 대한 스마트 계약 액세스를 취소하는 방법", "how-to-swap-tokens": "토큰 교환 방법", "how-to-use-a-bridge": "레이어 2로 토큰을 브리지하는 방법", @@ -115,11 +132,11 @@ "last-edit": "최근 수정", "layer-2": "레이어 2", "learn": "학습하기", - "learn-by-coding": "코딩으로 학습하기", + "learn-by-coding": "코딩으로 학습", "learn-hub": "학습 허브", "learn-menu": "메뉴 살펴보기", "learn-more": "자세히 보기", - "less": "간단히 보기", + "less": "간단히", "light-mode": "라이트", "listing-policy-disclaimer": "이 페이지에 명시된 모든 제품은 공식적으로 보증되지 않으며 정보 제공 용도로만 제공됩니다. 제품을 추가하거나 정책에 대한 피드백을 제공하려면 GitHub에 이슈를 올려 주세요.", "loading": "불러오는 중...", @@ -128,11 +145,112 @@ "loading-error-try-again-later": "데이터를 로드할 수 없습니다. 나중에 다시 시도하세요.", "logo": "로고", "mainnet-ethereum": "메인넷(Mainnet) 이더리움", - "more": "더 보기", - "nav-developers": "개발자", + "merge": "병합", + "more": "자세히", + "nav-about-description": "이더리움 커뮤니티를 위한 공개 오픈 소스 프로젝트", + "nav-advanced-description": "보다 복잡한 주제에 대해 알아보기", + "nav-advanced-label": "고급", + "nav-basics-description": "이더리움의 기초 이해하기", + "nav-basics-label": "기본", + "nav-bridges-description": "웹3는 기본 L1 블록체인과 L2 확장 솔루션의 생태계로 진화해 왔습니다.", + "nav-builders-home-description": "개발자가 개발자를 위해 만든 이더리움 개발자 매뉴얼", + "nav-builders-home-label": "개발자의 홈", + "nav-contribute-description": "도움이 필요하시면 이 자료가 길잡이가 될 수 있습니다.", + "nav-contribute-label": "ethereum.org에 기여하기", + "nav-dao-description": "중앙화된 기관이 없는 회원 소유 커뮤니티", + "nav-dapps-description": "이더리움을 사용하여 앱의 풍부한 생태계를 살펴보기", + "nav-defi-description": "기존 금융 시장에 대한 글로벌하고 개방적인 대안", + "nav-desci-description": "현재 과학 시스템에 대한 글로벌하고 개방적인 대안", + "nav-desoc-description": "소셜 상호 작용 및 콘텐츠 창작을 위한 블록체인 기반 플랫폼", "nav-developers-docs": "개발자 문서", + "nav-developers": "개발자", + "nav-did-description": "고유한 탈중앙화된 식별자를 발급하고 소유", + "nav-docs-description": "이더리움을 이해하고 빌드하는 데 도움이 되는 문서", + "nav-docs-design-description": "고유한 웹3 디자인 과제, 모범 사례 및 사용자 검색 인사이트에 대한 설명", + "nav-docs-design-label": "UX/UI 디자인 기초", + "nav-docs-foundation-description": "이더리움에서 개발할 핵심 기초", + "nav-docs-foundation-label": "기초 주제", + "nav-docs-overview-description": "개발자 문서를 위한 홈", + "nav-docs-stack-description": "이더리움 스택의 모든 세부 사항 이해하기", + "nav-docs-stack-label": "이더리움 스택", + "nav-eip-description": "새로운 기능이나 프로세스를 지정하는 표준", + "nav-eip-label": "이더리움 개선 제안(EIP)", + "nav-emerging-description": "이더리움에 대한 기타 새로운 사용 사례 알아보기", + "nav-emerging-label": "새로운 사용 사례", + "nav-enterprise-description": "이더리움의 비즈니스 애플리케이션", + "nav-ethereum-org-description": "이 웹사이트는 커뮤니티 중심으로 운영됩니다. 함께 참여하고 기여해 보세요.", + "nav-ethereum-wallets-description": "이더리움 계정으로 상호 작업하는 앱", + "nav-events-description": "누구나 참여할 수 있는 탈중앙화 및 자유", + "nav-events-irl-description": "매월 오프라인 및 온라인에서 주요 이더리움 이벤트가 개최됩니다.", + "nav-events-label": "커뮤니티 및 이벤트", + "nav-events-online-description": "이 온라인 커뮤니티에는 수십만 명의 이더리움 열성팬이 있습니다.", + "nav-find-wallet-description": "지갑을 통해 암호화폐를 사용할 수 있습니다.", + "nav-find-wallet-label": "지갑 선택", + "nav-gas-fees-description": "ETH 거래 수수료가 계산되는 방법", + "nav-get-eth-description": "이더리움 애플리케이션을 사용하려면 이더(ETH)가 필요합니다.", + "nav-get-started-description": "이더리움을 사용하기 위한 첫 번째 단계", + "nav-governance-description": "이더리움 프로토콜 업그레이드 관련 프로세스", + "nav-governance-label": "운영 방식", + "nav-grants-description": "보조금 지원 프로그램을 제공하는 프로젝트에 대해 커뮤니티에서 선별한 목록", + "nav-guide-create-account-description": "누구든지 지갑 앱을 사용하여 언제든 무료로 이더리움 계정을 만들 수 있습니다.", + "nav-guide-create-account-label": "이더리움 계정 만들기", + "nav-guide-revoke-access-description": "이더리움 생태계에서 스마트 계약 및 애플리케이션으로 안전하게 상호 작업할 수 있습니다.", + "nav-guide-revoke-access-label": "스마트 계약 액세스를 취소하는 방법", + "nav-guide-use-wallet-description": "지갑의 모든 기본 기능을 실행하는 방법에 대해 알아보기", + "nav-guide-use-wallet-label": "지갑 사용법", + "nav-guides-description": "시작하는 데 도움이 되는 실용적인 단계별 안내서", + "nav-guides-label": "사용 방법 안내", + "nav-history-description": "모든 주요 포크 및 업데이트에 대한 타임라인", + "nav-history-label": "이더리움의 기술적 역사", + "nav-layer-2-description": "이더리움의 더 저렴하고 빠른 거래", + "nav-learn-by-coding-description": "이더리움을 실험하는 데 도움이 되는 도구", + "nav-local-env-description": "이더리움 개발 스택을 선택하고 설정하세요.", + "nav-mainnet-description": "엔터프라이즈 블록체인 애플리케이션은 공개 이더리움 메인넷에 구축될 수 있습니다.", + "nav-nft-description": "이더리움 기반 자산으로 고유한 모든 것을 나타내는 방법", + "nav-open-research-description": "이더리움의 주요 강점 중 하나는 활발한 연구 커뮤니티입니다.", + "nav-open-research-label": "공개 연구", + "nav-overview-description": "이더리움 교육의 모든 것", + "nav-overview-label": "개요", + "nav-participate-overview-description": "참여하는 방법에 대한 개요", "nav-primary": "기본", - "nft-page": "대체 불가 토큰(NFT)", + "nav-quizzes-description": "이더리움과 암호화폐를 얼마나 잘 이해하고 있는지 알아보기", + "nav-quizzes-label": "지식 테스트", + "nav-refi-description": "재생 원칙에 기반한 대안 경제 시스템", + "nav-research-description": "이더리움을 향상하는 데 사용되는 프로세스", + "nav-research-label": "연구 및 개발", + "nav-roadmap-description": "이더리움의 확장성, 보안 및 지속 가능성을 강화하는 방법", + "nav-roadmap-future-description": "이더리움을 강력하고 탈중앙화된 네트워크로 굳히기", + "nav-roadmap-future-label": "미래 대비", + "nav-roadmap-label": "로드맵", + "nav-roadmap-scaling-description": "거래 비용을 더욱 줄이고 속도를 높이기 위한 네트워크 업데이트", + "nav-roadmap-security-description": "이더리움이 미래에도 모든 종류의 공격에 대한 복원력을 유지할 수 있게 확인합니다.", + "nav-roadmap-security-label": "강화된 보안", + "nav-roadmap-ux-description": "이더리움 사용을 단순화해야 합니다.", + "nav-run-a-node-description": "네트워크를 보호하는 한편 완전한 주권자가 될 수 있습니다.", + "nav-security-description": "암호 화폐를 사용할 때 모범 사례 알아보기", + "nav-smart-contracts-description": "이더리움 생태계의 기본 구성 요소", + "nav-stablecoins-description": "스테이블코인은 고정된 가치를 유지하도록 설계된 이더리움 토큰입니다.", + "nav-stake-description": "이더리움을 보호하면서 보상받기", + "nav-stake-label": "스테이킹", + "nav-staking-home-description": "스테이킹의 다른 옵션 개요", + "nav-staking-home-label": "스테이킹 홈", + "nav-staking-pool-description": "다른 사용자와 함께 ETH의 양과 관계없이 스테이킹하고 보상을 받으세요.", + "nav-staking-pool-label": "풀 스테이킹", + "nav-staking-saas-description": "제3자 노드 운영자가 검증자 클라이언트의 운영을 처리함", + "nav-staking-saas-label": "서비스로 스테이킹", + "nav-staking-solo-description": "가정용 컴퓨터를 실행하고 이더리움 네트워크의 보안과 탈중앙화에 기여해 보세요.", + "nav-staking-solo-label": "솔로 스테이킹", + "nav-start-building-description": "신규 사용자를 위한 유용한 정보", + "nav-translation-program-description": "ethereum.org를 모든 언어로 번역하기 위한 공동의 노력", + "nav-tutorials-description": "엄선된 커뮤니티 튜토리얼 목록", + "nav-use-cases-description": "이더리움 사용에 대한 다른 아이디어 살펴보기", + "nav-what-is-ether-description": "이더리움 앱의 화폐", + "nav-what-is-ethereum-description": "이더리움을 특별하게 만드는 것이 무엇인지 이해하기", + "nav-what-is-web3-label": "Web3란 무엇입니까?", + "nav-what-is-web3-description": "규칙을 지시하는 중앙 집중식 독점에 대한 대안", + "nav-whitepaper-description": "2014년 비탈릭 부테린이 작성한 최초의 이더리움 백서", + "nav-zkp-description": "어떤 진술을 드러내지 않으면서도 그것의 유효성을 증명하는 방법", + "nft-page": "NFT - 대체 불가 토큰", "nfts": "NFT", "no": "아니오", "on-this-page": "이 페이지에서는", @@ -140,6 +258,8 @@ "page-developers-aria-label": "개발자 메뉴", "page-index-meta-title": "홈", "page-last-updated": "페이지가 마지막으로 업데이트됨", + "participate": "참여하기", + "participate-menu": "참여 메뉴", "pbs": "제안자-빌더 분리", "pools": "풀 스테이킹", "privacy-policy": "개인정보 보호 정책", @@ -150,8 +270,10 @@ "refresh": "페이지를 새로고침하세요.", "return-home": "홈으로 돌아가기", "roadmap": "이더리움 로드맵", + "research": "연구", + "research-menu": "연구 메뉴", "resources": "번역 참고 자료", - "regenerative-finance": "재생금융(ReFi)", + "regenerative-finance": "ReFi - 재생금융", "run-a-node": "노드 실행하기", "rollup-component-website": "웹사이트", "rollup-component-developer-docs": "개발자 문서", @@ -164,6 +286,7 @@ "search-box-blank-state-text": "바로 검색!", "search-eth-address": "이것은 이더리움 주소로 보입니다. 당사는 특정 주소에 대한 데이터를 제공하지 않습니다. 블록 탐색기를 통해 아래와 같이 검색해 보세요.", "search-no-results": "검색과 일치하는 결과가 없습니다.", + "security": "보안", "single-slot-finality": "단일 슬롯 최종 승인", "statelessness": "무상태성", "see-contributors": "기여자 확인하기", @@ -181,6 +304,7 @@ "start-here": "여기서 시작하세요", "style-guide": "스타일 가이드", "solo": "솔로 스테이킹", + "support": "지원", "terms-of-use": "이용 약관", "translation-banner-body-new": "이 페이지는 아직 내용이 번역되지 않아 영어로 쓰여 있습니다. 이 콘텐츠의 번역을 도와 주세요.", "translation-banner-body-update": "이 페이지의 새로운 버전이 있지만 현재는 영어로만 제공됩니다. 최신 버전의 번역을 도와 주세요.", @@ -191,11 +315,14 @@ "translation-banner-no-bugs-title": "버그 없음!", "translation-banner-no-bugs-content": "이 페이지는 번역되고 있지 않습니다. 이 페이지는 현재 영어로만 제공되고 있습니다.", "translation-banner-no-bugs-dont-show-again": "다시 표시하지 않기", + "translation-program": "번역 프로그램", "try-using-search": "원하는 항목을 찾기 위해 검색을 해보세요.", "tutorials": "튜토리얼", "up": "위로", + "use": "사용", "use-ethereum": "이더리움 사용하기", "use-ethereum-menu": "이더리움 메뉴 사용하기", + "use-menu": "메뉴 사용", "user-experience": "사용자 환경", "verkle-trees": "버클 트리", "wallets": "지갑", @@ -203,8 +330,8 @@ "web3": "Web3란 무엇입니까?", "web3-title": "웹3", "website-last-updated": "웹사이트가 마지막으로 업데이트됨", - "what-is-ether": "이더(ETH)란?", - "what-is-ethereum": "이더리움이란?", + "what-is-ether": "이더(ETH)란 무엇인가요?", + "what-is-ethereum": "이더리움이란 무엇인가요?", "withdrawals": "스테이킹 인출", "yes": "네", "zero-knowledge-proofs": "영지식 증명" diff --git a/src/intl/ml/common.json b/src/intl/ml/common.json index 7784af4c010..79dd534e918 100644 --- a/src/intl/ml/common.json +++ b/src/intl/ml/common.json @@ -1,28 +1,70 @@ { "about-ethereum-org": "Ethereum.org-നെ കുറിച്ച്", "about-us": "ഞങ്ങളെ കുറിച്ച്", + "adding-desci-projects": "Desci പ്രോജക്റ്റുകൾ ചേർക്കൽ", + "adding-developer-tools": "ഡെവലപ്പർ ഉപകരണങ്ങൾ ചേർക്കൽ", + "adding-exchanges": "എക്‌സ്‌ചേഞ്ചുകൾ ചേർക്കൽ", + "adding-glossary-terms": "ഗ്ലോസറി പദങ്ങൾ ചേർക്കൽ", + "adding-staking-products": "സ്റ്റെയ്‌ക്കിങ് ഉൽപ്പന്നങ്ങൾ ചേർക്കൽ", + "adding-wallets": "വാലറ്റുകൾ ചേർക്കൽ", + "account-abstraction": "അക്കൗണ്ട് അബ്‌സ്‌ട്രാക്ഷൻ", + "acknowledgements": "അംഗീകാരങ്ങൾ", "aria-toggle-search-button": "തിരയൽ ബട്ടൺ ടോഗിൾ ചെയ്യുക", "aria-toggle-menu-button": "മെനു ബട്ടൺ ടോഗിൾ ചെയ്യുക", "beacon-chain": "ബീക്കൺ ചെയിൻ", "bridges": "ബ്ലോക്ക്‌ചെയിൻ ബ്രിഡ്‌ജുകൾ", + "bug-bounty": "ബഗ് ബൗണ്ടി", + "build": "ബിൽഡ്", + "build-menu": "ബിൽഡ് മെനു", + "clear": "മായ്ക്കുക", + "close": "അവസാനിപ്പിക്കുക", "community": "കമ്യൂണിറ്റി", "community-hub": "കമ്മ്യൂണിറ്റി കേന്ദ്രം", "community-menu": "കമ്മ്യൂണിറ്റി മെനു", "contact": "ബന്ധപ്പെടുക", + "content-buckets": "ഉള്ളടക്ക ബക്കറ്റുകൾ", + "content-resources": "ഉള്ളടക്ക റിസോഴ്‌സുകൾ", + "content-standardization": "ഉള്ളടക്ക ക്രമവൽക്കരണം", "contributing": "സംഭാവന ചെയ്യുന്നു", "contributors": "കോണ്‍ട്രിബ്യൂട്ടര്‍മാര്‍", "contributors-thanks": "ഈ പേജിലേക്ക് സംഭാവന നൽകിയ എല്ലാവരും - നന്ദി!", "cookie-policy": "കുക്കി നയം", "copied": "പകർത്തി", "copy": "പകര്‍പ്പ്‌", + "danksharding": "ഡാങ്ക്‌ഷാർഡിംഗ്", + "dao-page": "DAOs - വികേന്ദ്രീകൃത സ്വയംഭരണ സ്ഥാപനങ്ങൾ", "dark-mode": "ഡാർക്ക്", "data-provided-by": "ഡാറ്റ ഉറവിടം:", "decentralized-applications-dapps": "ഡാപ്പുകൾ - വികേന്ദ്രീകൃത ആപ്ലിക്കേഷനുകൾ", + "decentralized-identity": "വികേന്ദ്രീകൃത വ്യക്തിവിവരം", + "decentralized-social-networks": "വികേന്ദ്രീകൃത സോഷ്യൽ നെറ്റ്‌വർക്കുകൾ", + "decentralized-science": "DeSci - വികേന്ദ്രീകൃത ശാസ്ത്രം", + "description": "നാവിഗേഷൻ ഇനത്തിനുള്ള വിവരണം", + "defi-page": "DeFi - വികേന്ദ്രീകൃത ധനകാര്യം", + "design": "രൂപരേഖ", + "design-principles": "രൂപരേഖ തത്വങ്ങൾ", "devcon": "ഡവ്കോൺ", "developers": "ഡെവലപ്പർമാർ", "developers-home": "ഡെവലപ്പേഴ്സ് ഹോം", "docs": "ഡോക്യുമെന്‍റുകൾ", + "docsearch-to-select": "തിരഞ്ഞെടുക്കാൻ", + "docsearch-to-navigate": "നാവിഗേറ്റ് ചെയ്യാൻ", + "docsearch-to-close": "അടയ്ക്കാൻ", + "docsearch-search-by": "ഇപ്രകാരം തിരയുക", + "docsearch-start-recent-searches-title": "സമീപകാലത്തേത്", + "docsearch-start-no-recent-searches": "സമീപകാല തിരയലുകൾ ഒന്നുമില്ല", + "docsearch-start-save-recent-search": "ഈ തിരയൽ സംരക്ഷിക്കുക", + "docsearch-start-remove-recent-search": "ഹിസ്റ്ററിയിൽ നിന്ന് ഈ തിരയൽ നീക്കംചെയ്യുക", + "docsearch-start-favorite-searches": "പ്രിയപ്പെട്ടത്", + "docsearch-start-remove-favorite-search": "പ്രിയപ്പെട്ടവയിൽ നിന്ന് ഈ തിരയൽ നീക്കംചെയ്യുക", + "docsearch-no-results-text": "ഇതിനുള്ള ഉത്തരം കണ്ടെത്താനായില്ല", + "docsearch-no-results-suggested-query": "ഇതിനായി തിരഞ്ഞ് ശ്രമിക്കുക", + "docsearch-no-results-missing": "ഈ അന്വേഷണം ഉത്തരം തരുമെന്ന് വിശ്വസിക്കുന്നുണ്ടോ?", + "docsearch-no-results-missing-link": "നമുക്ക് നോക്കി നോക്കാം.", + "docsearch-error-title": "ഉത്തരം കണ്ടെത്താനായില്ല", + "docsearch-error-help": "നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ ഉറപ്പുവരുത്തുക.", "documentation": "പ്രമാണീകരണം", + "down": "താഴെ", "ecosystem": "ഇക്കോസിസ്റ്റം", "edit-page": "പേജ് എഡിറ്റുചെയ്യുക", "ef-blog": "Ethereum ഫൗണ്ടേഷന്‍ ബ്ലോഗ്‌", @@ -32,9 +74,11 @@ "enterprise-menu": "എന്റർപ്രൈസ് മെനു", "esp": "ഇക്കോസിസ്റ്റം സപ്പോർട്ട് പ്രോഗ്രാം", "eth-current-price": "നിലവിലെ ETH വില (USD)", + "ethereum-basics": "Ethereum അടിസ്ഥാനകാര്യങ്ങൾ", + "ethereum-bug-bounty": "Ethereum ബഗ് ബൗണ്ടി പ്രോഗ്രാം", "consensus-when-shipping": "ഇത് ഷിപ്പ് ചെയ്യുന്നത് എപ്പോഴാണ്?", "ethereum-upgrades": "Ethereum അപ്‌ഗ്രേഡുകൾ", - "ethereum-brand-assets": "Ethereum ബ്രാന്‍ഡ് ആസ്തികള്‍", + "ethereum-brand-assets": "Ethereum ബ്രാന്‍ഡ് അസറ്റുകള്‍", "ethereum-online": "ഓൺലൈൻ കമ്മ്യൂണിറ്റികൾ", "ethereum-events": "Ethereum ഇവെന്റ്സ്", "ethereum-foundation": "Ethereum ഫൗണ്ടേഷന്‍", @@ -42,20 +86,37 @@ "ethereum-glossary": "Ethereum പദാവലി", "ethereum-governance": "Ethereum ഭരണനിർവഹണം", "ethereum-logo": "Ethereum ലോഗോ", + "ethereum-roadmap": "Ethereum റോഡ്‌മാപ്പ്", + "ethereum-protocol": "Ethereum പ്രോട്ടോക്കോൾ", "ethereum-security": "Ethereum സുരക്ഷ, അഴിമതി തടയൽ", "ethereum-support": "Ethereum പിന്തുണ", - "ethereum-wallets": "Ethereum വാലറ്റുകള്‍", + "ethereum-wallets": "Ethereum വാലറ്റുകൾ", "ethereum-whitepaper": "Ethereum ധവളപത്രം", + "feedback-widget-prompt": "ഈ പേജ് സഹായകരമാണോ?", + "feedback-card-prompt-page": "ഈ പേജ് സഹായകരമായോ?", + "feedback-card-prompt-article": "ഈ ലേഖനം സഹായകമായിരുന്നോ?", + "feedback-card-prompt-tutorial": "ഈ ട്യൂട്ടോറിയൽ സഹായകമായിരുന്നോ?", + "feedback-widget-thank-you-title": "നിങ്ങളുടെ അഭിപ്രായത്തിന് നന്ദി!", + "feedback-widget-thank-you-subtitle": "കുറച്ച് ചോദ്യങ്ങൾക്ക് ഉത്തരം നൽകി ഈ പേജ് കൂടുതൽ മികച്ചതാക്കുക.", + "feedback-widget-thank-you-subtitle-ext": "നിങ്ങൾക്ക് സഹായം ആവശ്യമുണ്ടെങ്കിൽ, നിങ്ങൾക്ക് ഞങ്ങളുടെ Discord-ലെ കമ്മ്യൂണിറ്റിയുമായി ബന്ധപ്പെടാം.", + "feedback-widget-thank-you-timing": "2–3 മിനിറ്റ്", + "feedback-widget-thank-you-cta": "ഹ്രസ്വമായ സർവേ തുറക്കുക", "find-wallet": "വാലറ്റ് കണ്ടെത്തുക", + "future-proofing": "ഭാവി-പ്രൂഫിംഗ്", "get-eth": "ETH നേടൂ", "get-involved": "ഇടപെടുക", "get-started": "ആരംഭിക്കുക", "grants": "ഗ്രാന്റുകൾ", "grant-programs": "ഇക്കോസിസ്റ്റം ഗ്രാന്റ് പ്രോഗ്രാമുകൾ", - "guides-and-resources": "കമ്മ്യൂണിറ്റി ഗൈഡുകളും റിസോഴ്സുകളും", + "guides": "ഗൈഡുകൾ", + "guides-hub": "ഏതുവിധമെന്ന മാർഗ്ഗനിർദ്ദേശങ്ങൾ", "history-of-ethereum": "Ethereum ചരിത്രം", "home": "ഹോം", "how-ethereum-works": "Ethereum എങ്ങനെ പ്രവർത്തിക്കുന്നു", + "how-to-revoke-token-access": "എങ്ങനെ നിങ്ങളുടെ ക്രിപ്റ്റോ ഫണ്ടുകളിലേക്കുള്ള സ്മാർട്ട് കരാർ പിൻവലിക്കാം", + "how-to-swap-tokens": "എങ്ങനെ ടോക്കൺസ് സ്വാപ്പ് ചെയ്യാം", + "how-to-use-a-bridge": "എങ്ങനെ ടോക്കൺസ് വരി 2-വുമായി ബന്ധിപ്പിക്കാം", + "how-to-use-a-wallet": "എങ്ങനെ ഒരു വാലറ്റ് ഉപയോഗിക്കാം", "image": "ചിത്രം", "in-this-section": "ഈ വിഭാഗത്തിൽ", "individuals": "വ്യക്തികൾ", @@ -69,6 +130,7 @@ "layer-2": "വരി 2", "learn": "പഠിക്കൂ", "learn-by-coding": "കോഡിംഗ് ഉപയോഗിച്ച് പഠിക്കൂ", + "learn-hub": "പഠന ഹബ്", "learn-menu": "മെനു പഠിക്കൂ", "learn-more": "കൂടുതല്‍ അറിയുക", "less": "കുറവ്", @@ -77,30 +139,149 @@ "loading": "ലോഡ്ചെയ്യുന്നു...", "loading-error": "ലോഡു ചെയ്യുന്നതിൽ പിശക്.", "loading-error-refresh": "പിശക്, പുതുക്കുക.", + "loading-error-try-again-later": "ഡേറ്റ ലോഡ് ചെയ്യാൻ സാധിക്കുന്നില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.", "logo": "ലോഗോ", "mainnet-ethereum": "മെയിന്‍നെറ്റ് Ethereum", + "merge": "ലയിപ്പിക്കുക", "more": "കൂടുതൽ", - "nav-developers": "ഡെവലപ്പർമാർ", + "nav-about-description": "Ethereum കമ്മ്യൂണിറ്റിക്കുള്ള ഒരു പൊതുവായ ഓപ്പൺ-സോഴ്‌സ് പ്രൊജക്റ്റ്", + "nav-advanced-description": "കൂടുതൽ സങ്കീർണ്ണമായ വിഷയങ്ങൾ മനസ്സിലാക്കുക", + "nav-advanced-label": "വിപുലമായത്", + "nav-basics-description": "Ethereum-ന്റെ അടിസ്ഥാന തത്ത്വങ്ങൾ മനസ്സിലാക്കുക", + "nav-basics-label": "അടിസ്ഥാന കാര്യങ്ങൾ", + "nav-bridges-description": "പ്രാഥമിക L1 ബ്ലോക്ക്‌ചെയിനുകളുടെയും L2 സ്‌കെയിലിംഗ് സൊല്യൂഷനുകളുടെയും ഒരു ഇക്കോസിസ്റ്റമായി Web3 പരിണമിച്ചിരിക്കുന്നു", + "nav-builders-home-description": "Ethereum-നായുള്ള നിർമ്മാതാക്കളുടെ ഒരു മാനുവൽ—നിർമ്മാതാക്കൾക്കായി, നിർമ്മാതാക്കള്‍ തയ്യാറാക്കിയത്", + "nav-builders-home-label": "നിർമ്മാതാക്കളുടെ ഹോം", + "nav-contribute-description": "നിങ്ങൾക്ക് സഹായിക്കാൻ താൽപ്പര്യമുണ്ടെങ്കിൽ, ഇത് നിങ്ങളെ മുന്നോട്ടുനയിക്കും", + "nav-contribute-label": "Ethereum.org എന്നതിലേക്ക് സംഭാവന നൽകൽ", + "nav-dao-description": "കേന്ദ്രീകൃത അധികാരമില്ലാത്ത, അംഗങ്ങൾക്ക് സ്വന്തമായ കമ്മ്യൂണിറ്റികൾ", + "nav-dapps-description": "Ethereum ഉപയോഗിക്കുന്ന ആപ്പുകളുടെ ഒരു സമ്പന്നമായ ഇക്കോസിസ്റ്റം അടുത്തറിയുക", + "nav-defi-description": "പരമ്പരാഗത സാമ്പത്തിക വിപണിക്കുള്ള ആഗോളമായ ഒരു സ്വതന്ത്ര ബദൽ", + "nav-desci-description": "നിലവിലെ ശാസ്‌ത്രീയ സംവിധാനത്തിനുള്ള ആഗോളമായ ഒരു സ്വതന്ത്ര ബദൽ", + "nav-desoc-description": "സാമൂഹിക ഇടപഴകലിനും ഉള്ളടക്കം സൃഷ്‌ടിക്കുന്നതിനുമായി ബ്ലോക്ക്‌ചെയിൻ അടിസ്ഥാനമാക്കിയുള്ള പ്ലാറ്റ്‌ഫോമുകൾ", "nav-developers-docs": "ഡെവലപ്പർമാർ ഡോക്‌സ്", + "nav-developers": "ഡെവലപ്പർമാർ", + "nav-did-description": "നിങ്ങളുടെ തനത് വികേന്ദ്രീകൃത ഐഡന്റിഫയറുകൾ ഇഷ്യൂ ചെയ്യുക, സ്വന്തമാക്കുക", + "nav-docs-description": "Ethereum മനസ്സിലാക്കി അത് ഉപയോഗിച്ച് ബിൽഡ് ചെയ്യാൻ നിങ്ങളെ സഹായിക്കുന്ന ഡോക്യുമെന്റുകൾ", + "nav-docs-design-description": "തനത് web3 രൂപകൽപ്പനാ ചലഞ്ചുകൾ, മികച്ച കീഴ്‌വഴക്കങ്ങൾ, ഉപയോക്തൃ ഗവേഷണ ഇൻസൈറ്റുകൾ എന്നിവയുടെ വിവരണം", + "nav-docs-design-label": "UX/UI രൂപകൽപ്പനാ അടിസ്ഥാന തത്ത്വങ്ങൾ", + "nav-docs-foundation-description": "Ethereum എന്നതിൽ അഭിവൃദ്ധിപ്പെടാനുള്ള പ്രധാന അടിസ്ഥാന തത്ത്വങ്ങൾ", + "nav-docs-foundation-label": "അടിസ്ഥാന വിഷയങ്ങൾ", + "nav-docs-overview-description": "ഡെവലപ്പർ ഡോക്യുമെന്റുകൾക്കുള്ള നിങ്ങളുടെ ഹോം", + "nav-docs-stack-description": "ഇതറീയം സ്റ്റേക്കിന്റെ എല്ലാ വിശദാംശങ്ങളും മനസ്സിലാക്കുക", + "nav-docs-stack-label": "Ethereum സ്റ്റേക്ക്", + "nav-eip-description": "പുതിയ സവിശേഷതകളോ പ്രോസസ്സുകളോ വ്യക്തമാക്കുന്ന സ്റ്റാൻഡേർഡുകൾ", + "nav-eip-label": "Ethereum ഇംപ്രൂവ്മെന്‍റ് പ്രൊപ്പോസലുകള്‍ (EIP-കൾ)", + "nav-emerging-description": "Ethereum-നുള്ള ഏറ്റവും പുതിയ മറ്റ് ഉപയോഗ സാഹചര്യങ്ങൾ മനസ്സിലാക്കുക", + "nav-enterprise-description": "Ethereum-നുള്ള ബിസിനസ് ആപ്ലിക്കേഷനുകൾ", + "nav-ethereum-org-description": "ഈ വെബ്‌സൈറ്റ് കമ്മ്യൂണിറ്റി പ്രേരിതമാണ്—ഞങ്ങൾക്കൊപ്പം ചേർന്ന് സംഭാവന ചെയ്യൂ", + "nav-ethereum-wallets-description": "നിങ്ങളുടെ Ethereum അക്കൗണ്ടുമായി സംവദിക്കുന്ന ഒരു ആപ്പ്", + "nav-events-description": "വികേന്ദ്രീകരണവും ആർക്കും പങ്കെടുക്കാനുള്ള സ്വാതന്ത്ര്യവും", + "nav-events-irl-description": "നേരിട്ടും ഓൺലൈനിലും ഓരോ മാസവുമുള്ള പ്രമുഖ Ethereum ഇവന്റുകൾ", + "nav-events-label": "കമ്മ്യൂണിറ്റികളും ഇവന്റുകളും", + "nav-events-online-description": "ആയിരക്കണക്കിന് Ethereum പ്രേമികളാണ് ഈ ഓൺലൈൻ കമ്മ്യൂണിറ്റികൾ സൃഷ്‌ടിച്ചിട്ടുള്ളത്", + "nav-find-wallet-description": "ക്രിപ്റ്റോ ഉപയോഗിക്കാൻ വാലറ്റുകൾ നിങ്ങളെ അനുവദിക്കുന്നു", + "nav-find-wallet-label": "നിങ്ങളുടെ വാലറ്റ് തിരഞ്ഞെടുക്കുക", + "nav-gas-fees-description": "ETH ഇടപാട് നിരക്കുകൾ കണക്കാക്കുന്നതെങ്ങനെ", + "nav-get-eth-description": "Ethereum ആപ്ലിക്കേഷനുകൾ ഉപയോഗിക്കാൻ നിങ്ങൾക്ക് ഇതർ (ETH) ആവശ്യമാണ്", + "nav-get-started-description": "Ethereum ഉപയോഗിക്കാനുള്ള നിങ്ങളുടെ ആദ്യ ചുവടുകൾ", + "nav-governance-description": "പ്രോസസ്സിൽ Ethereum പ്രോട്ടോക്കോൾ അപ്‌ഗ്രേഡ് ചെയ്യുന്നത് ഉൾപ്പെടുന്നു", + "nav-governance-label": "ഭരണനിർവഹണം", + "nav-grants-description": "ഗംഭീരമായ ഫണ്ടിംഗ് പ്രോഗ്രാമുകൾ നൽകുന്ന പ്രൊജക്റ്റുകൾ സംബന്ധിച്ച് ഞങ്ങളുടെ കമ്മ്യൂണിറ്റി ക്യുറേറ്റ് ചെയ്‌ത ഒരു ലിസ്റ്റ്", + "nav-guide-create-account-description": "ആർക്കും എപ്പോൾ വേണമെങ്കിലും ഒരു വാലറ്റ് ആപ്പ് ഉപയോഗിച്ച് സൗജന്യമായി ഒരു Ethereum അക്കൗണ്ട് സൃഷ്‌ടിക്കാം", + "nav-guide-revoke-access-description": "Ethereum ഇക്കോസിസ്റ്റത്തിൽ സ്മാർട്ട് കരാറുകൾ, ആപ്ലിക്കേഷനുകൾ എന്നിവയുമായി സംവദിക്കുമ്പോൾ സുരക്ഷിതരായിരിക്കുക", + "nav-guide-revoke-access-label": "സ്‌മാർട്ട് കരാർ ആക്‌സസ് എങ്ങനെ പിൻവലിക്കാം", + "nav-guide-use-wallet-description": "ഒരു വാലറ്റിന്റെ എല്ലാ അടിസ്ഥാന പ്രവർത്തനങ്ങളും പ്രവർത്തിപ്പിക്കുന്ന വിധം മനസ്സിലാക്കുക", + "nav-guide-use-wallet-label": "എങ്ങനെ ഒരു വാലറ്റ് ഉപയോഗിക്കാം", + "nav-guides-description": "ആരംഭിക്കാനായി നിങ്ങളെ സഹായിക്കാൻ, ഘട്ടം ഘട്ടമായുള്ള പ്രായോഗിക ഗൈഡുകൾ", + "nav-guides-label": "എങ്ങനെ ഗൈഡ് ചെയ്യുന്നു", + "nav-history-description": "എല്ലാ പ്രമുഖ ഫോർക്കുകളുടെയും അപ്‌ഡേറ്റുകളുടെയും ഒരു ടൈംലൈൻ", + "nav-history-label": "Ethereum-ന്റെ സാങ്കേതിക ചരിത്രം", + "nav-layer-2-description": "Ethereum-നുള്ള ചെലവ് കുറഞ്ഞതും വേഗമേറിയതുമായ ഇടപാടുകൾ", + "nav-learn-by-coding-description": "Ethereum ഉപയോഗിച്ചുള്ള പരീക്ഷണത്തിന് നിങ്ങളെ സഹായിക്കുന്ന ഉപകരണങ്ങൾ", + "nav-local-env-description": "നിങ്ങളുടെ Ethereum വികസന സഞ്ചയം തിരഞ്ഞെടുത്ത് സജ്ജീകരിക്കുക", + "nav-mainnet-description": "പൊതു Ethereum മെയിൻനെറ്റിൽ എന്റർപ്രൈസ് ബ്ലോക്ക്ചെയിൻ ആപ്ലിക്കേഷനുകൾ സൃഷ്‌ടിക്കാൻ കഴിയും", + "nav-nft-description": "ഒരു Ethereum അധിഷ്ഠിത അസറ്റ് പോലുള്ള, തനതായ എന്തിനെയും പ്രതിനിധീകരിക്കാനുള്ള ഒരു മാർഗ്ഗം", + "nav-open-research-description": "Ethereum-ന്റെ മുൻനിര കരുത്തുകളിലൊന്ന്, അതിന്റെ സജീവമായ ഗവേഷണ കമ്മ്യൂണിറ്റിയാണ്", + "nav-open-research-label": "റിസേർച്ച് എന്നത് തുറക്കുക", + "nav-overview-description": "Ethereum വിദ്യാഭ്യാസം സംബന്ധിച്ച എല്ലാ കാര്യങ്ങളും", + "nav-participate-overview-description": "എങ്ങനെ പങ്കെടുക്കാമെന്നത് സംബന്ധിച്ച ചുരുക്കവിവരണം", "nav-primary": "പ്രാഥമികം", + "nav-quizzes-description": "നിങ്ങൾ Ethereum, ക്രിപ്റ്റോ‌കറൻസികൾ എന്നിവ എത്രത്തോളം നന്നായി മനസ്സിലാക്കിയിട്ടുണ്ടെന്ന് കണ്ടെത്തുക", + "nav-quizzes-label": "നിങ്ങളുടെ അറിവ് പരീക്ഷിക്കുക", + "nav-refi-description": "പുനരുൽപ്പാദന തത്ത്വങ്ങളിൽ അധിഷ്ഠിതമായി സൃഷ്‌ടിച്ചെടുത്ത ഒരു ബദൽ സമ്പദ്‌വ്യവസ്ഥ", + "nav-research-description": "Ethereum മെച്ചപ്പെടുത്താൻ ഉപയോഗിക്കുന്ന പ്രോസസ്സുകൾ", + "nav-research-label": "ഗവേഷണവും വികസനവും", + "nav-roadmap-description": "Ethereum-നുള്ള കൂടുതൽ വിപുലീകരണക്ഷമത, സുരക്ഷ, സ്ഥിരത എന്നിവയിലേക്കുള്ള പാത", + "nav-roadmap-future-description": "ബലവത്തായതും വികേന്ദ്രീകൃതവുമായ ഒരു നെറ്റ്‌വർക്ക് എന്ന നിലയിൽ Ethereum കരുത്തുറ്റതാകുന്നു", + "nav-roadmap-future-label": "ഭാവി-പ്രൂഫിംഗ്", + "nav-roadmap-label": "റോഡ്‌മാപ്പ്", + "nav-roadmap-scaling-description": "ഇടപാട് ചെലവുകളും വേഗതയും കൂടുതൽ ചുരുക്കാനുള്ള നെറ്റ്‌വർക്ക് അപ്‌ഡേറ്റുകൾ", + "nav-roadmap-security-description": "ഭാവിയിലെ എല്ലാത്തരം ആക്രമണങ്ങളെയും അതിജീവിച്ച് Ethereum നിലനിൽക്കുമെന്ന് ഉറപ്പാക്കുന്നു", + "nav-roadmap-security-label": "മെച്ചപ്പെടുത്തിയ സുരക്ഷ", + "nav-roadmap-ux-description": "Ethereum-ന്റെ ഉപയോഗം ലളിതമാക്കേണ്ടതുണ്ട്", + "nav-run-a-node-description": "നെറ്റ്‌വർക്ക് സുരക്ഷിതമാക്കാൻ സഹായിക്കുമ്പോൾ തന്നെ, പൂർണ്ണമായും ഫലവത്തായതുമായി മാറുന്നു", + "nav-security-description": "ക്രിപ്റ്റോകറൻസി ഉപയോഗിക്കുമ്പോഴുള്ള മികച്ച കീഴ്‌വഴക്കങ്ങൾ മനസ്സിലാക്കുക", + "nav-smart-contracts-description": "Ethereum ഇക്കോസിസ്റ്റത്തിന്റെ അടിസ്ഥാന ശിലകൾ", + "nav-stablecoins-description": "ഒരു നിശ്ചിത മൂല്യത്തിൽ നിലനിൽക്കാൻ രൂപകൽപ്പന ചെയ്‌തിട്ടുള്ള Ethereum ടോക്കണുകളാണ് സ്റ്റേബിൾകോയിനുകൾ", + "nav-stake-description": "Ethereum സുരക്ഷിതമാക്കുന്നതിനുള്ള റിവാർഡുകൾ കരസ്ഥമാക്കുക", + "nav-stake-label": "സ്റ്റേക്ക്", + "nav-staking-home-description": "സ്റ്റെയ്ക്കിങ്ങിനുള്ള വ്യത്യസ്‌ത ഓപ്‌ഷനുകളുടെ ഒരു ചുരുക്കവിവരണം", + "nav-staking-pool-description": "മറ്റുള്ളവർക്കൊപ്പം ചേരുന്നതിലൂടെ, സ്റ്റേക്ക് ചെയ്‌ത് ETH-ന്റെ ഏതൊരു തുകയ്‌ക്കുമുള്ള റിവാർഡുകൾ കരസ്ഥമാക്കുക", + "nav-staking-pool-label": "പൂൾഡ് സ്റ്റെയ്ക്കിങ്", + "nav-staking-saas-label": "ഒരു സേവനം ഉപയോഗിച്ചുള്ള സ്റ്റെയ്ക്കിങ്", + "nav-staking-solo-label": "സോളോ സ്റ്റെയ്ക്കിങ്", + "nav-start-building-description": "നവാഗതർക്കുള്ള ഉപയോഗപ്രദമായ വിവരങ്ങൾ", + "nav-translation-program-description": "എല്ലാ ഭാഷകളിലേക്കും ethereum.org വിവർത്തനം ചെയ്യാനുള്ള ഒരു കൂട്ടായ പരിശ്രമം", + "nav-tutorials-description": "കമ്മ്യൂണിറ്റി ട്യൂട്ടോറിയലുകളുടെ ക്യൂറേറ്റ് ചെയ്‌ത ലിസ്റ്റ്", + "nav-use-cases-description": "Ethereum ഉപയോഗത്തിനുള്ള വ്യത്യസ്‌ത ആശയങ്ങൾ കണ്ടെത്തുക", + "nav-what-is-ether-description": "Ethereum ആപ്പുകളുടെ കറൻസി", + "nav-what-is-ethereum-description": "Ethereum-നെ വേറിട്ടതാക്കുന്നത് എന്തെന്ന് മനസ്സിലാക്കുക", + "nav-what-is-web3-label": "എന്താണ് Web3?", + "nav-what-is-web3-description": "കേന്ദ്രീകൃത കുത്തകകൾ സ്വയം നിയമങ്ങൾ സൃഷ്‌ടിക്കുന്ന അവസ്ഥയ്‌ക്ക് പകരമായുള്ള ഒരു സംവിധാനം", + "nav-whitepaper-description": "2014-ൽ വിറ്റാലിക് ബ്യൂട്ടറിൻ എഴുതിയ യഥാർത്ഥ Ethereum ധവളപത്രം", + "nav-zkp-description": "പ്രസ്‌താവന വെളിപ്പെടുത്താതെ തന്നെ ആ പ്രസ്താവനയുടെ സാധുത തെളിയിക്കാനുള്ള ഒരു മാർഗ്ഗം", + "nft-page": "NFTs - നോൺ-ഫഞ്ചിബിൾ ടോക്കണുകൾ", + "nfts": "NFT-കൾ", "no": "ഇല്ല", "on-this-page": "ഈ പേജില്‍", + "open-research": "റിസേർച്ച് എന്നത് തുറക്കുക", + "page-developers-aria-label": "ഡവലപ്പർമാരുടെ മെനു", + "page-index-meta-title": "ഹോം", "page-last-updated": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത പേജ്", + "participate": "പങ്കെടുക്കുക", + "participate-menu": "പങ്കെടുക്കൽ മെനു", + "pbs": "പ്രൊപ്പോസർ-ബിൽഡർ വേർതിരിക്കൽ", + "pools": "പൂൾഡ് സ്റ്റെയ്ക്കിങ്", "privacy-policy": "സ്വകാര്യതാ നയം", "private-ethereum": "പ്രൈവറ്റ് Ethereum", + "product-disclaimer": "Ethereum കമ്മ്യൂണിക്കായുള്ള ഒരു സൗകര്യമായി ഉൽപ്പന്നങ്ങളും സേവനങ്ങളും ലിസ്റ്റ് ചെയ്തിരിക്കുന്നു. ഒരു ഉൽപ്പന്നത്തിന്‍റെയോ സേവനത്തിന്‍റെയോ ഉൾപ്പെടുത്തൽ ethereum.org വെബ്‌സൈറ്റ് ടീമിൽ നിന്നുള്ള അല്ലെങ്കിൽ Ethereum ഫൗണ്ടേഷനിൽ നിന്നുള്ള ഒരു എൻഡോഴ്‌സ്‌മെന്‍റിനെ പ്രതിനിധീകരിക്കുന്നില്ല.", + "quizzes-title": "ക്വിസ് ഹബ്", + "quizzes": "ക്വിസ്സുകൾ", "refresh": "ദയവായി പേജ് പുതുക്കുക.", "return-home": "ഹോമിലേക്ക് മടങ്ങുക", - "run-a-node": "ഒരു നോഡ് റൺ ചെയ്യുക", + "roadmap": "Ethereum റോഡ്‌മാപ്പ്", + "research": "ഗവേഷണം", + "research-menu": "ഗവേഷണ മെനു", + "resources": "വിവർത്തന ഉറവിടങ്ങൾ", + "run-a-node": "ഒരു നോഡ് പ്രവർത്തിപ്പിക്കുക", "rollup-component-website": "വെബ്സൈറ്റ്", "rollup-component-developer-docs": "ഡെവലപ്പർ ഡോക്‌സ്", "rollup-component-technology-and-risk-summary": "സാങ്കേതികവിദ്യയും അപകടസാധ്യതാ സംഗ്രഹവും", + "scaling": "സ്കെയിലിംഗ്", + "saas": "ഒരു സേവനമായി സ്റ്റെയ്ക്കിങ്", "search": "തിരയുക", + "search-ethereum-org": "ethereum.org തിരയുക", + "secret-leader-election": "രഹസ്യ ലീഡർ തിരഞ്ഞെടുപ്പ്", "search-box-blank-state-text": "അകലെ തിരയുക!", "search-eth-address": "ഇത് ഒരു Ethereum വിലാസം പോലെ തോന്നുന്നു. വിലാസങ്ങൾക്ക് മാത്രമായുള്ള ഡാറ്റ ഞങ്ങൾ നൽകുന്നില്ല. ഇതുപോലുള്ള ഒരു ബ്ലോക്ക് എക്സ്പ്ലോററിൽ തിരയാൻ ശ്രമിക്കുക", "search-no-results": "നിങ്ങളുടെ തിരയലിന് ഫലങ്ങളൊന്നുമില്ല", + "security": "സുരക്ഷ", + "single-slot-finality": "സിംഗിൾ-സ്ലോട്ട് ഫൈനലിറ്റി", + "statelessness": "സ്റ്റേറ്റ്‌ലെസ്‌നെസ്", "see-contributors": "കോണ്‍ട്രിബ്യൂട്ടര്‍മാരെ കാണുക", "set-up-local-env": "തദ്ദേശീയ അന്തരീക്ഷം സജ്ജമാക്കൂ", - "sharding": "ഷാർഡ് ചെയിനുകള്‍", + "sharding": "ഷാർഡിംഗ്", "show-all": "എല്ലാം കാണിക്കുക", "show-less": "കുറച്ച് കാണിക്കുക", "site-description": "പണത്തിനും പുതിയ തരം അപ്ലിക്കേഷനുകൾക്കുമുള്ള ആഗോള വികേന്ദ്രീകൃത പ്ലാറ്റ്ഫോമാണ് Ethereum. നിങ്ങൾക്ക് Ethereum- ൽ പണത്തെ നിയന്ത്രിക്കുന്ന കോഡ് എഴുതാനും ലോകത്തെവിടെയും ആക്‌സസ് ചെയ്യാവുന്ന അപ്ലിക്കേഷനുകൾ നിർമ്മിക്കാനും കഴിയും.", @@ -108,10 +289,11 @@ "skip-to-main-content": "പ്രധാന ഉള്ളടക്കത്തിലേക്ക് പോകുക", "smart-contracts": "സ്മാര്‍ട്ട് കരാറുകള്‍", "stablecoins": "സ്റ്റേബിള്‍കോയിനുകള്‍", + "stake-eth": "ETH സ്റ്റേക്ക് ചെയ്യുക", "staking": "സ്റ്റേക്കിംഗ്", - "solo": "Solo staking", - "saas": "Staking as a service", - "pools": "Pooled staking", + "start-here": "ഇവിടെ തുടങ്ങാം", + "solo": "സോളോ സ്റ്റെയ്ക്കിങ്", + "support": "സപ്പോർട്ട്", "terms-of-use": "ഉപയോഗ നിബന്ധനകൾ", "translation-banner-body-new": "നിങ്ങൾ ഈ പേജ് ഇംഗ്ലീഷിൽ കാണുന്നതിന് കാരണം ഞങ്ങൾ ഇത് ഇതുവരെ വിവര്‍ത്തനം ചെയ്തിട്ടില്ലാത്തതിനാലാണ്. ഈ ഉള്ളടക്കം വിവർത്തനം ചെയ്യാൻ ഞങ്ങളെ സഹായിക്കൂ.", "translation-banner-body-update": "ഈ പേജിന്റെ ഒരു പുതിയ പതിപ്പുണ്ട്, പക്ഷേ ഇത് ഇപ്പോൾ ഇംഗ്ലീഷിൽ മാത്രമേ ഉള്ളൂ. ഈ ഏറ്റവും പുതിയ പതിപ്പ് വിവർത്തനം ചെയ്യാൻ ഞങ്ങളെ സഹായിക്കൂ.", @@ -122,20 +304,22 @@ "translation-banner-no-bugs-title": "ഇവിടെ ബഗുകൾ ഒന്നുമില്ല!", "translation-banner-no-bugs-content": "ഈ പേജ് വിവർത്തനം ചെയ്‌തില്ല. ഞങ്ങൾ ഇപ്പോഴത്തേക്ക് ഈ പേജ് ബോധപൂർവ്വം ഇംഗ്ലീഷിൽ തന്നെ വിട്ടിരിക്കുന്നു.", "translation-banner-no-bugs-dont-show-again": "വീണ്ടും കാണിക്കരുത്", + "translation-program": "വിവർത്തന പരിപാടി", "try-using-search": "നിങ്ങൾ തിരയുന്നത് കണ്ടെത്താൻ തിരയൽ ഉപയോഗിച്ച് നോക്കുക, അല്ലെങ്കിൽ", "tutorials": "ട്യൂട്ടോറിയലുകൾ", + "up": "മുകളിൽ", + "use": "ഉപയോഗിക്കുക", "use-ethereum": "Ethereum ഉപയോഗിക്കൂ", "use-ethereum-menu": "Ethereum മെനു ഉപയോഗിക്കൂ", - "wallets": "വാലറ്റുകള്‍", + "use-menu": "ഉപയോഗ മെനു", + "verkle-trees": "Verkle മരങ്ങൾ", + "wallets": "വാലറ്റുകൾ", "we-couldnt-find-that-page": "ഞങ്ങൾക്ക് ആ പേജ് കണ്ടെത്താൻ കഴിഞ്ഞില്ല", "web3": "എന്താണ് Web3?", "website-last-updated": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത വെബ്‌സൈറ്റ്", - "what-is-ether": "എന്താണ് ഇതര്‍ (ETH)?", + "what-is-ether": "എന്താണ് ഈതര്‍ (ETH)?", "what-is-ethereum": "എന്താണ് Ethereum?", - "defi-page": "DeFi - വികേന്ദ്രീകൃത ധനകാര്യം", - "dao-page": "DAOs - വികേന്ദ്രീകൃത സ്വയംഭരണ സ്ഥാപനങ്ങൾ", - "nft-page": "NFTs - നോൺ-ഫഞ്ചിബിൾ ടോക്കണുകൾ", + "withdrawals": "സ്റ്റെയ്ക്കിങ് പിൻവലിക്കലുകൾ", "yes": "അതെ", - "page-index-meta-title": "വീട്", - "page-developers-aria-label": "ഡവലപ്പർമാരുടെ മെനു" + "zero-knowledge-proofs": "പൂജ്യം-അറിവ് പ്രൂഫുകൾ" } diff --git a/src/intl/mr/common.json b/src/intl/mr/common.json index a42f8221f75..89a0c23a675 100644 --- a/src/intl/mr/common.json +++ b/src/intl/mr/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "खाते शून्यमनस्कता", "about-ethereum-org": "Ethereum.org बद्दल", "about-us": "आमच्याबद्दल", + "adding-desci-projects": "Desci प्रकल्प जोडत आहे", + "adding-developer-tools": "विकसक साधने जोडत आहे", + "adding-exchanges": "एक्सचेंज जोडत आहे", + "adding-glossary-terms": "शब्दकोष अटी जोडत आहे", + "adding-staking-products": "स्टिकिंग उत्पादने जोडणे", + "adding-wallets": "वॉलेट्स जोडत आहे", + "account-abstraction": "खाते शून्यमनस्कता", + "acknowledgements": "श्रेयनिर्देश", "aria-toggle-search-button": "शोध बटण टॉगल करा", "aria-toggle-menu-button": "मेनू बटण टॉगल करा", "beacon-chain": "बीकन चेन", "bridges": "ब्लॉकचेन ब्रिज", + "bug-bounty": "बग बाउंटी", + "build": "निर्माण", + "build-menu": "निर्माण मेनू", "clear": "साफ", "close": "बंद", "community": "समुदाय", - "community-hub": "समुदाय यादी", + "community-hub": "समुदाय केंद्र", "community-menu": "समुदाय यादी", "contact": "संपर्क", + "content-buckets": "सामग्री बकेट्स", + "content-resources": "सामग्री संसाधने", "content-standardization": "सामग्री मानकीकरण", "contributing": "योगदान करा", "contributors": "योगदानकर्ते", @@ -27,8 +39,11 @@ "decentralized-identity": "विकेंद्रित ओळख", "decentralized-social-networks": "विकेंद्रित सामाजिक जाळे", "decentralized-science": "DeSci - विकेंद्रित विज्ञान", + "description": "एनएव्ही आयटमचे वर्णन", "defi-page": "DeFi - विकेंद्रीत अर्थव्यवस्था", - "devcon": "डेव्हकॉन", + "design": "डिझाईन", + "design-principles": "डिझाईनची तत्त्वे", + "devcon": "Devcon", "developers": "विकासक", "developers-home": "विकासकांचे मुख्यपृष्ठ", "docs": "दस्तऐवज", @@ -51,7 +66,7 @@ "documentation": "दस्तऐवज", "down": "खाली", "ecosystem": "इकोसिस्टम", - "edit-page": "पृष्ठ संपादित करा", + "edit-page": "पृष्ठ सुधारणे", "ef-blog": "Ethereum फाउंडेशन ब्लॉग", "eips": "Ethereum सुधार प्रस्ताव", "energy-consumption": "Ethereum ची ऊर्जा खपत", @@ -59,11 +74,9 @@ "enterprise-menu": "एंटरप्राइझ मेनू", "esp": "इकोसिस्टम सपोर्ट प्रोग्राम", "eth-current-price": "सध्याची ETH किंमत (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Ethereum दोष बक्षीस कार्यक्रम", "consensus-when-shipping": "हे शिपिंग कधी आहे?", "ethereum-upgrades": "Ethereum चे अपग्रेड", - "ethereum-brand-assets": "Ethereum ब्रँड मालमत्ता", "ethereum-online": "ऑनलाइन समुदाय", "ethereum-events": "Ethereum कार्यक्रम", "ethereum-foundation": "Ethereum फाउंडेशन", @@ -75,7 +88,7 @@ "ethereum-protocol": "Ethereum प्रोटोकॉल", "ethereum-security": "Ethereum सुरक्षा आणि घोटाळा प्रतिबंध", "ethereum-support": "Ethereum सपोर्ट", - "ethereum-wallets": "Ethereum वॉलेट", + "ethereum-wallets": "Ethereum वॅलेट", "ethereum-whitepaper": "Ethereum व्हाइटपेपर", "feedback-widget-prompt": "हे पृष्ठ उपयुक्त आहे का?", "feedback-card-prompt-page": "हे पृष्ठ उपयुक्त होते का?", @@ -83,7 +96,7 @@ "feedback-card-prompt-tutorial": "हे मार्गदर्शन उपयुक्त होते का?", "feedback-widget-thank-you-title": "आपल्या अभिप्रायाबद्दल आपले धन्यवाद!", "feedback-widget-thank-you-subtitle": "हे पृष्ठ काही प्रश्नांची उत्तरे देऊन आणखी चांगले बनवा.", - "feedback-widget-thank-you-subtitle-ext": "तुम्हाला मदत हवी असल्यास, तुम्ही आमच्या Discord वर समुदायापर्यंत पोहोचू शकता.", + "feedback-widget-thank-you-subtitle-ext": "तुम्हाला मदत हवी असल्यास, तुम्ही आमच्या मतभेदावर Discord वर समुदायापर्यंत पोहोचू शकता.", "feedback-widget-thank-you-timing": "2-3 मिनिटे", "feedback-widget-thank-you-cta": "लहान सर्वेक्षण उघडा", "find-wallet": "वॉलेट शोधा", @@ -94,11 +107,10 @@ "grants": "अनुदान", "grant-programs": "अनुदान कार्यक्रम प्रणाली", "guides": "मार्गदर्शक", - "guides-hub": "मार्गदर्शक हब", + "guides-hub": "\"कसे करावे” मार्गदर्शिका", "history-of-ethereum": "Ethereum चा इतिहास", "home": "मुख्यपृष्ठ", "how-ethereum-works": "Ethereum कसे कार्य करते", - "how-to-register-an-ethereum-account": "Ethereum खाते \"नोंदणी\" कसे करावे", "how-to-revoke-token-access": "तुमच्या क्रिप्टो फंडांमध्ये स्मार्ट कॉन्ट्रॅक्ट प्रवेश कसा रद्द करायचा", "how-to-swap-tokens": "प्रतिक कसे देवाणघेवाण करावे", "how-to-use-a-bridge": "टोकन लेयर 2 वर कसे जोडायचे", @@ -115,7 +127,7 @@ "last-edit": "शेवटचे संपादन", "layer-2": "स्तर 2", "learn": "शिका", - "learn-by-coding": "सांकेतिक लेखनासह शिका", + "learn-by-coding": "कोडिंग करून शिका", "learn-hub": "हब शिका", "learn-menu": "जाणून घ्या मेनू", "learn-more": "अधिक जाणून घ्या", @@ -128,10 +140,105 @@ "loading-error-try-again-later": "डेटा लोड करण्यात अक्षम. पुन्हा प्रयत्न करा.", "logo": "लोगो", "mainnet-ethereum": "मेननेट Ethereum", + "merge": "विलीन करा", "more": "अधिक", - "nav-developers": "विकसक", + "nav-about-description": "इथरियम समुदायासाठी सार्वजनिक, मुक्त-स्रोत प्रकल्प", + "nav-advanced-description": "अधिक जटिल विषय जाणून घ्या", + "nav-advanced-label": "प्रगत", + "nav-basics-description": "इथरियमची मूलभूत तत्त्वे समजून घ्या", + "nav-basics-label": "मूलभूत", + "nav-bridges-description": "Web3 प्राथमिक L1 ब्लॉकचेन्स आणि L2 स्केलिंग सोल्यूशन्सच्या इकोसिस्टममध्ये विकसित झाले आहे", + "nav-builders-home-description": "इथरियमसाठी बिल्डर्सचे मॅन्युअल—बिल्डर्सद्वारे, बिल्डर्ससाठी", + "nav-builders-home-label": "बिल्डर्स होम", + "nav-contribute-description": "तुम्हाला मदत करायची असल्यास, हे तुम्हाला मार्गदर्शन करेल", + "nav-contribute-label": "Ethereum.org वर योगदान देत आहे", + "nav-dao-description": "केंद्रीकृत अधिकाराशिवाय सदस्य-मालकीचे समुदाय", + "nav-dapps-description": "इथरियम वापरून ॲप्सची समृद्ध इकोसिस्टम एक्सप्लोर करा", + "nav-defi-description": "पारंपारिक आर्थिक बाजारपेठेसाठी जागतिक, खुला पर्याय", + "nav-desci-description": "सध्याच्या वैज्ञानिक प्रणालीसाठी जागतिक, खुला पर्याय", + "nav-desoc-description": "सामाजिक संवाद आणि सामग्री निर्मितीसाठी ब्लॉकचेन-आधारित व्यासपीठ", "nav-developers-docs": "विकसक डॉक्स", + "nav-developers": "विकासक", + "nav-did-description": "तुमचे विशेष विकेंद्रीकृत अभिज्ञापक जारी करा आणि मालकी मिळवा", + "nav-docs-description": "तुम्हाला इथरियमला समजून घेण्यात आणि तयार करण्यात मदत करणारे दस्तऐवज", + "nav-docs-design-description": "विशेष web3 डिझाइनची आव्हाने, सर्वोत्तम पद्धती आणि वापरकर्ता संशोधन अंतर्दृष्टी यांचे वर्णन", + "nav-docs-design-label": "UX/UI डिझाइनची आधारभूत तत्वे", + "nav-docs-foundation-description": "इथरियमवर विकसित करण्यासाठी मूळ आधारभूत तत्त्वे", + "nav-docs-overview-description": "विकसक दस्तऐवजांसाठी तुमचे होम", + "nav-docs-stack-description": "इथरियम भागभांडवलाचे सर्व तपशील समजून घ्या", + "nav-eip-description": "नवीन वैशिष्ट्ये किंवा प्रक्रिया निर्दिष्ट करणारी मानके", + "nav-eip-label": "इथरियम सुधारणा प्रस्ताव (EIPs)", + "nav-emerging-description": "इथरियमसाठी इतर नवीन वापर प्रकरणे जाणून घ्या", + "nav-enterprise-description": "इथरियमसाठी व्यवसाय ॲप्लिकेशन्स", + "nav-ethereum-org-description": "ही वेबसाइट समुदायाद्वारे चालवली जात आहे—आमच्यात सामील व्हा आणि योगदान द्या", + "nav-ethereum-wallets-description": "तुमच्या इथरियम खात्याशी संवाद साधण्यासाठी एक ॲप", + "nav-events-description": "विकेंद्रीकरण आणि कोणासाठीही भाग घेण्याचे स्वातंत्र्य", + "nav-events-irl-description": "प्रत्येक महिन्यात येथे वैयक्तिक आणि ऑनलाइन प्रमुख इथरियम कार्यक्रम असतात", + "nav-events-label": "समुदाय आणि कार्यक्रम", + "nav-events-online-description": "या ऑनलाइन समुदायांमध्ये शेकडो हजारो इथरियम उत्साही जनक आहेत", + "nav-find-wallet-description": "वॉलेट तुम्हाला क्रिप्टो वापरण्याची परवानगी देतात", + "nav-find-wallet-label": "तुमचे वॉलेट निवडा", + "nav-gas-fees-description": "ETH चे व्यवहार शुल्क कसे मोजले जाते", + "nav-get-eth-description": "इथरियम अ‍ॅप्लिकेशन्स वापरण्यासाठी तुम्हाला इथर (ETH) आवश्यक आहे", + "nav-get-started-description": "इथरियम वापरण्यासाठी तुमची पहिली पायरी", + "nav-governance-description": "इथरियम प्रोटोकॉल अपग्रेड करण्यासाठी प्रक्रिया समाविष्ट आहे", + "nav-governance-label": "शासन", + "nav-grants-description": "अनुदान निधी कार्यक्रम प्रदान करणाऱ्या उपक्रमांवर आमच्या समुदायाने तयार केलेली यादी", + "nav-guide-create-account-description": "वॉलेट ॲपसह कोणीही कधीही इथरियम खाते तयार करू शकते", + "nav-guide-revoke-access-description": "इथरियम इकोसिस्टममधील स्मार्ट करार आणि ॲप्लिकेशन्सशी संवाद साधताना सुरक्षित रहा", + "nav-guide-revoke-access-label": "स्मार्ट करार प्रवेश कसा रद्द करायचा", + "nav-guide-use-wallet-description": "वॉलेटची सर्व मूलभूत कार्ये कशी चालवायची ते शिका", + "nav-guide-use-wallet-label": "वॉलेट कसे वापरावे", + "nav-guides-description": "आपल्याला प्रारंभ करण्यात मदत करण्यासाठी व्यावहारिक चरण-दर-चरण मार्गदर्शक", + "nav-guides-label": "मार्गदर्शन कसे करायचे", + "nav-history-description": "सर्व प्रमुख फॉर्क्स आणि अद्यतनांची टाइमलाइन", + "nav-history-label": "इथरियमचा तांत्रिक इतिहास", + "nav-layer-2-description": "इथरियमसाठी स्वस्त आणि जलद व्यवहार", + "nav-learn-by-coding-description": "तुम्हाला इथरियमचा प्रयोग करण्यास मदत करणारी साधने", + "nav-local-env-description": "तुमचे इथरियम विकास भागभांडवल निवडा आणि सेट करा", + "nav-mainnet-description": "सार्वजनिक इथरियम मेननेटवर एंटरप्राइझ ब्लॉकचेन अ‍ॅप्लिकेशन्स तयार केले जाऊ शकतात", + "nav-nft-description": "Ethereum-आधारित मालमत्ता म्हणून अद्वितीय कोणत्याही गोष्टीचे प्रतिनिधित्व करण्याचा एक मार्ग", + "nav-open-research-description": "इथरियमची प्राथमिक ताकद म्हणजे त्याचा सक्रिय संशोधन समुदाय", + "nav-open-research-label": "संशोधन खोला", + "nav-overview-description": "इथरियम शिक्षणाच्या सर्व गोष्टी", + "nav-participate-overview-description": "सहभागी कसे व्हावे याबद्दलचा आढावा", "nav-primary": "प्राथमिक", + "nav-quizzes-description": "इथरियम आणि क्रिप्टोकरन्सी तुम्हाला किती चांगल्या प्रकारे समजतात ते शोधा", + "nav-quizzes-label": "तुमच्या ज्ञानाची चाचणी घ्या", + "nav-refi-description": "पुनर्निर्मिती तत्त्वांवर आधारित पर्यायी आर्थिक व्यवस्था", + "nav-research-description": "इथरियम सुधारण्यासाठी वापरल्या जाणाऱ्या प्रक्रिया", + "nav-research-label": "संशोधन आणि विकास", + "nav-roadmap-description": "इथरियमसाठी अधिक मापनीयता, सुरक्षितता आणि टिकाऊपणाचा मार्ग", + "nav-roadmap-future-description": "मजबूत आणि विकेंद्रित नेटवर्क म्हणून इथरियमचे घनीकरण", + "nav-roadmap-future-label": "भविष्य-प्रूफिंग", + "nav-roadmap-label": "नकाशा", + "nav-roadmap-scaling-description": "व्यवहार खर्च आणि गती आणखी कमी करण्यासाठी नेटवर्क अद्यतने", + "nav-roadmap-security-description": "भविष्यात इथरियम सर्व प्रकारच्या हल्ल्यांना लवचिक राहते याची खात्री करणे", + "nav-roadmap-security-label": "सुधारित सुरक्षा", + "nav-roadmap-ux-description": "इथरियम वापरणे सोपे करणे आवश्यक आहे", + "nav-run-a-node-description": "नेटवर्क सुरक्षित करण्यात मदत करताना पूर्णपणे सार्वभौम व्हा", + "nav-security-description": "क्रिप्टोकरन्सी वापरताना सर्वोत्तम पद्धती जाणून घ्या", + "nav-smart-contracts-description": "इथरियम इकोसिस्टमचे मूलभूत बिल्डिंग ब्लॉक्स", + "nav-stablecoins-description": "स्टेबलकॉइन्स हे इथरियम टोकन्स आहेत जे एका निश्चित मूल्यावर राहण्यासाठी डिझाइन केले आहेत", + "nav-stake-description": "इथरियम सुरक्षित करण्यासाठी बक्षिसे मिळवा", + "nav-stake-label": "भागभांडवल", + "nav-staking-home-description": "भागभांडवलासाठी विविध पर्यायांचा आढावा", + "nav-staking-pool-description": "इतरांसह सामील होऊन ETH च्या कितीही रकमेसह भागभांडवल मिळवा आणि बक्षिसे मिळवा", + "nav-staking-pool-label": "पूल केलेले स्टॅकिंग", + "nav-staking-saas-description": "थर्ड-पार्टी नोड ऑपरेटर तुमच्या व्हॅलिडेटर क्लायंटचे ऑपरेशन हाताळतात", + "nav-staking-saas-label": "एक सेवेसह भागभांडवल", + "nav-staking-solo-description": "होम हार्डवेअर चालवा आणि वैयक्तिकरित्या इथरियम नेटवर्कची सुरक्षा आणि विकेंद्रीकरण जोडा", + "nav-staking-solo-label": "सोलो स्टॅकिंग", + "nav-start-building-description": "नवोदितांसाठी उपयुक्त माहिती", + "nav-translation-program-description": "Ethereum.org सर्व भाषांमध्ये अनुवादित करण्याचा एक सहयोगी प्रयत्न", + "nav-tutorials-description": "सामुदायिक ट्यूटोरियलची क्युरेट केलेली यादी", + "nav-use-cases-description": "इथरियमच्या वापरासाठी विविध कल्पना शोधा", + "nav-what-is-ether-description": "इथरियम ॲप्सचे चलन", + "nav-what-is-ethereum-description": "असे काय आहे जे इथरियमला विशेष बनवते ते समजून घ्या", + "nav-what-is-web3-label": "Web3 म्हणजे काय?", + "nav-what-is-web3-description": "केंद्रीकृत मक्तेदारी नियमांचे पालन करण्याचा पर्याय", + "nav-whitepaper-description": "2014 मध्ये व्हिटालिक बुटेरिन यांनी लिहिलेले मूळ इथरियम व्हाइटपेपर", + "nav-zkp-description": "विधान उघड न करता विधानाची वैधता सिद्ध करण्याचा एक मार्ग", "nft-page": "NFT - नॉन-फंजीबल टोकन", "nfts": "NFT", "no": "नाही", @@ -140,6 +247,7 @@ "page-developers-aria-label": "विकसक मेनू", "page-index-meta-title": "मुख्यपृष्ठ", "page-last-updated": "पृष्ठ अखेरचे अद्यतनित", + "participate-menu": "सहभागी मेनू", "pbs": "प्रस्तावक-बिल्डर वेगळे करणे", "pools": "पूल केलेले स्टॅकिंग", "privacy-policy": "गुप्तता धोरण", @@ -150,6 +258,8 @@ "refresh": "कृपया पृष्ठ रीफ्रेश करा.", "return-home": "मुख्यपृष्ठावर परत या", "roadmap": "Ethereum नकाशा", + "research": "संशोधन", + "research-menu": "संशोधन मेनू", "resources": "भाषांतर संसाधने", "regenerative-finance": "ReFi - रीजनरेटिव्ह फायनान्स", "run-a-node": "एक नोड चालवा", @@ -164,23 +274,23 @@ "search-box-blank-state-text": "शोध घ्या!", "search-eth-address": "हे Ethereum पत्त्याप्रमाणे दिसते. आम्ही पत्त्यांसाठी विशिष्ट असा डेटा प्रदान करत नाही. ब्लॉक एक्सप्लोरअर वर एथरस्केन प्रमाणे त्यासाठी शोध घेण्याचा प्रयत्न करा", "search-no-results": "आपल्या शोधासाठी कोणतेही परिणाम नाहीत", + "security": "सुरक्षा", "single-slot-finality": "एकटा-स्लॉट अंतिमता", "statelessness": "राज्यहीनता", "see-contributors": "योगदानकर्ता पहा", - "set-up-local-env": "स्थानिक वातावरण सेट अप करा", + "set-up-local-env": "स्थानिक पातळीवर सेट अप करा", "sharding": "खापरीकरण", "show-all": "सर्व दाखवा", "show-less": "कमी दाखवा", "site-description": "Ethereum हे पैसे आणि नवीन प्रकारच्या अनुप्रयोगांसाठी जागतिक, विकेंद्रीकृत व्यासपीठ आहे. Ethereum वर, आपण पैसे नियंत्रित करणारा कोड लिहू शकता आणि जगात कोठेही प्रवेशयोग्य अनुप्रयोग तयार करू शकता.", - "site-title": "ethereum.org", "skip-to-main-content": "प्रमुख मजकुराकडे जा", "smart-contracts": "स्मार्ट कॉन्ट्रॅक्ट", - "stablecoins": "स्टेबलकॉइन्स", + "stablecoins": "स्टेबलकोइन्स", "stake-eth": "भागभांडवल ETH", "staking": "स्टॅकिंग", "start-here": "इथून सुरुवात", - "style-guide": "Style guide", "solo": "सोलो स्टॅकिंग", + "support": "मदत", "terms-of-use": "वापरण्याच्या अटी", "translation-banner-body-new": "आपण हे पृष्ठ इंग्रजीमध्ये पहात आहात कारण आम्ही अद्याप ते अनुवादित केलेले नाही. आम्हाला या सामग्रीचे भाषांतर करण्यात मदत करा.", "translation-banner-body-update": "या पृष्ठाची नवीन आवृत्ती आहे परंतु ती आत्ता केवळ इंग्रजीमध्ये आहे. नवीनतम आवृत्ती अनुवादित करण्यात आमची मदत करा.", @@ -191,20 +301,21 @@ "translation-banner-no-bugs-title": "येथे कोणतेही बग नाहीत!", "translation-banner-no-bugs-content": "हे पृष्ठ भाषांतरित केले जात नाही. आम्‍ही जाणूनबुजून हे पृष्‍ठ इंग्रजीमध्‍ये सोडले आहे.", "translation-banner-no-bugs-dont-show-again": "पुन्हा दाखवू नका", + "translation-program": "भाषांतर कार्यक्रम", "try-using-search": "तुम्ही जे शोधत आहात ते शोधण्यासाठी शोध बार वापरून पहा किंवा", "tutorials": "शिकवण्या", "up": "वर", + "use": "वापर", "use-ethereum": "Ethereum वापरा", "use-ethereum-menu": "Ethereum मेनू वापरा", - "user-experience": "User experience", + "use-menu": "वापर मेनू", "verkle-trees": "वर्कल ट्रीस", "wallets": "वॉलेट", "we-couldnt-find-that-page": "आम्हाला ते पृष्ठ सापडले नाही", "web3": "Web3 म्हणजे काय?", - "web3-title": "Web3", "website-last-updated": "संकेतस्थळाचे अखेरचे अद्यतनित", - "what-is-ether": "इथर(ETH) म्हणजे काय?", - "what-is-ethereum": "इथेरियम म्हणजे काय?", + "what-is-ether": "इथर (ETH) म्हणजे काय?", + "what-is-ethereum": "Ethereum म्हणजे काय?", "withdrawals": "पैसे काढणे स्टिकिंग", "yes": "होय", "zero-knowledge-proofs": "शून्य-ज्ञान पुरावे" diff --git a/src/intl/ms/common.json b/src/intl/ms/common.json index cd11bf06c59..e4c552d801e 100644 --- a/src/intl/ms/common.json +++ b/src/intl/ms/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Pengabstrakan akaun", "about-ethereum-org": "Perihal ethereum.org", "about-us": "Perihal kami", + "adding-desci-projects": "Menambah Projek Desci", + "adding-developer-tools": "Menambah Alat Pemaju", + "adding-exchanges": "Menambah Pertukaran", + "adding-glossary-terms": "Menambah Istilah Daftar Kata", + "adding-staking-products": "Menambah Produk Pertaruhan", + "adding-wallets": "Menambah Dompet", + "account-abstraction": "Pengabstrakan akaun", + "acknowledgements": "Perakuan", "aria-toggle-search-button": "Togol butang cari", "aria-toggle-menu-button": "Togol butang menu", "beacon-chain": "Rantai Beacon", "bridges": "Jambatan blok rantai", + "bug-bounty": "Hadiah untuk penemuan Pepijat", + "build": "Bina", + "build-menu": "Bina menu", "clear": "Kosongkan", "close": "Tutup", "community": "Komuniti", "community-hub": "Hab komuniti", "community-menu": "Menu Komuniti", "contact": "Hubungi", + "content-buckets": "Baldi Kandungan", + "content-resources": "Sumber Kandungan", "content-standardization": "Pemiawaian kandungan", "contributing": "Menyumbang", "contributors": "Penyumbang", @@ -23,11 +35,14 @@ "dao-page": "DAO - Organisasi autonomi yang tak terpusat", "dark-mode": "Gelap", "data-provided-by": "Sumber data:", - "decentralized-applications-dapps": "Dapps - Aplikasi tidak berpusat", + "decentralized-applications-dapps": "Dapp - Aplikasi tidak berpusat", "decentralized-identity": "Identiti ternyahpusat", "decentralized-social-networks": "Rangkaian sosial ternyahpusat", "decentralized-science": "DeSci - Sains ternyahpusat", + "description": "Deskripsi untuk item navigasi", "defi-page": "DeFi - Kewangan tak terpusat", + "design": "Reka Bentuk", + "design-principles": "Prinsip Reka Bentuk", "devcon": "Devcon", "developers": "Pembangun", "developers-home": "Laman Utama Pembangun", @@ -51,7 +66,7 @@ "documentation": "Dokumentasi", "down": "Bawah", "ecosystem": "Ekosistem", - "edit-page": "Edit halaman", + "edit-page": "Edit halaman\nOr\nSunting halaman", "ef-blog": "Blog Yayasan Ethereum", "eips": "Cadangan Penambahbaikan Ethereum", "energy-consumption": "Penggunaan tenaga Ethereum", @@ -63,7 +78,7 @@ "ethereum-bug-bounty": "Sistem baunti pepijat Ethereum", "consensus-when-shipping": "Bilakah ia dihantar?", "ethereum-upgrades": "Naik taraf Ethereum", - "ethereum-brand-assets": "Aset Jenama Ethereum", + "ethereum-brand-assets": "Aset jenama Ethereum", "ethereum-online": "Komuniti dalam talian", "ethereum-events": "Acara Ethereum", "ethereum-foundation": "Yayasan Ethereum", @@ -83,22 +98,22 @@ "feedback-card-prompt-tutorial": "Adakah tutorial ini membantu?", "feedback-widget-thank-you-title": "Terima kasih atas maklum balas anda!", "feedback-widget-thank-you-subtitle": "Jadikan halaman ini lebih baik dengan menjawab beberapa soalan.", - "feedback-widget-thank-you-subtitle-ext": "Jika anda memerlukan bantuan, anda boleh menghubungi komuniti kami di Discord kami.", + "feedback-widget-thank-you-subtitle-ext": "Jika anda memerlukan bantuan, anda boleh menghubungi komuniti kami di Discord.", "feedback-widget-thank-you-timing": "2–3 minit", "feedback-widget-thank-you-cta": "Tinjauan ringkas terbuka", "find-wallet": "Cari dompet", "future-proofing": "Langkah berdaya tahan masa depan", "get-eth": "Dapatkan ETH", "get-involved": "Libatkan diri", - "get-started": "Mari mulakan", + "get-started": "Mari bermula", "grants": "Geran", "grant-programs": "Program Geran Ekosistem", "guides": "Panduan", - "guides-hub": "Hab panduan", + "guides-hub": "Panduan cara", "history-of-ethereum": "Sejarah Ethereum", "home": "Laman Utama", "how-ethereum-works": "Cara Ethereum berfungsi", - "how-to-register-an-ethereum-account": "Cara \"mendaftar\" akaun Ethereum", + "how-to-create-an-ethereum-account": "Cara untuk \"mencipta\" akaun Ethereum", "how-to-revoke-token-access": "Cara membatalkan akses kontrak pintar kepada dana kripto anda", "how-to-swap-tokens": "Cara menukar token", "how-to-use-a-bridge": "Cara menghubungkan token kepada lapisan 2", @@ -115,7 +130,7 @@ "last-edit": "Suntingan terakhir", "layer-2": "Lapisan 2", "learn": "Ketahui", - "learn-by-coding": "Belajar melalui mengekod", + "learn-by-coding": "Belajar melalui pengekodan", "learn-hub": "Hab Pembelajaran", "learn-menu": "Menu belajar", "learn-more": "Ketahui lebih lanjut", @@ -128,10 +143,109 @@ "loading-error-try-again-later": "Tidak dapat memuatkan data. Cuba lagi kemudian.", "logo": "logo", "mainnet-ethereum": "Jaringan Utama Ethereum", - "more": "Selanjutnya", - "nav-developers": "Pemaju", + "merge": "Gabung", + "more": "Lebih lanjut", + "nav-about-description": "Satu projek sumber terbuka umum untuk komuniti Ethereum", + "nav-advanced-description": "Pelajari topik yang lebih kompleks", + "nav-advanced-label": "Maju", + "nav-basics-description": "Fahami asas Ethereum", + "nav-basics-label": "Asas", + "nav-bridges-description": "Web3 telah berkembang menjadi satu ekosistem blok rantai L1 utama dan penyelesaian penskalaan L2", + "nav-builders-home-description": "Buku panduan pembina untuk Ethereum—oleh pembina, untuk pembina", + "nav-builders-home-label": "Laman utama pembina", + "nav-contribute-description": "Jika anda mahu membantu, ini akan memberi anda panduan", + "nav-contribute-label": "Menyumbang kepada ethereum.org", + "nav-dao-description": "Komuniti milik ahli tanpa penguasaan berpusat", + "nav-dapps-description": "Terokai pelbagai ekosistem aplikasi menggunakan Ethereum", + "nav-defi-description": "Satu alternatif global yang terbuka berbanding pasaran kewangan tradisional", + "nav-desci-description": "Satu alternatif global yang terbuka berbanding sistem saintifik semasa", + "nav-desoc-description": "Platform berasaskan blok rantai untuk interaksi sosial dan penciptaan kandungan", "nav-developers-docs": "Dokumen pembangun", + "nav-developers": "Pembangun", + "nav-did-description": "Hasilkan dan miliki pengecam tidak berpusat anda yang unik", + "nav-docs-description": "Dokumen untuk membantu anda memahami dan membina dengan Ethereum", + "nav-docs-design-description": "Deskripsi cabaran reka bentuk web3 unik, amalan terbaik, dan pemahaman penyelidikan pengguna", + "nav-docs-design-label": "Asas reka bentuk UX/UI", + "nav-docs-foundation-description": "Laman utama anda untuk dokumen pembangun", + "nav-docs-foundation-label": "Topik asas", + "nav-docs-overview-description": "Laman utama anda untuk dokumen pembangun", + "nav-docs-stack-description": "Fahami semua butiran timbunan Ethereum", + "nav-docs-stack-label": "Timbunan Ethereum", + "nav-eip-description": "Standard yang menentukan ciri atau proses baharu", + "nav-eip-label": "Cadangan penambahbaikan Ethereum (EIP)", + "nav-emerging-description": "Kenali kes penggunaan baharu yang lain bagi Ethereum", + "nav-emerging-label": "Kes penggunaan yang muncul", + "nav-enterprise-description": "Aplikasi perniagaan untuk Ethereum", + "nav-ethereum-org-description": "Tapak web ini dipacu oleh komuniti—sertai kami dan buat sumbangan juga", + "nav-ethereum-wallets-description": "Aplikasi untuk berinteraksi dengan akaun Ethereum anda", + "nav-events-description": "Desentralisasi dan kebebasan untuk mengambil bahagian kepada sesiapa sahaja", + "nav-events-irl-description": "Setiap bulan terdapat acara besar Ethereum secara langsung dan dalam talian", + "nav-events-label": "Komuniti dan acara", + "nav-events-online-description": "Begitu ramai penyokong Ethereum mengetuai komuniti dalam talian ini", + "nav-find-wallet-description": "Dompet membolehkan anda menggunakan kripto", + "nav-find-wallet-label": "Pilih dompet anda", + "nav-gas-fees-description": "Cara yuran transaksi ETH dikira", + "nav-get-eth-description": "Anda memerlukan ether (ETH) untuk menggunakan aplikasi Ethereum", + "nav-get-started-description": "Langkah pertama anda untuk menggunakan Ethereum", + "nav-governance-description": "Proses yang terlibat untuk meningkatkan protokol Ethereum", + "nav-governance-label": "Tadbir Urus", + "nav-grants-description": "Senarai yang dipilih susun oleh komuniti tentang projek yang menyediakan program pembiayaan geran", + "nav-guide-create-account-description": "Semua orang boleh mencipta akaun Ethereum pada bila-bila masa, secara percuma dengan aplikasi dompet", + "nav-guide-create-account-label": "Cara untuk mencipta akaun Ethereum", + "nav-guide-revoke-access-description": "Kekal selamat apabila berinteraksi dengan kontrak pintar dan aplikasi dalam ekosistem Ethereum", + "nav-guide-revoke-access-label": "Cara membatalkan akses kontrak pintar", + "nav-guide-use-wallet-description": "Belajar cara mengendalikan semua fungsi asas dalam sebuah dompet", + "nav-guide-use-wallet-label": "Cara menggunakan dompet", + "nav-guides-description": "Panduan langkah demi langkah praktikal untuk membantu anda bermula", + "nav-guides-label": "Panduan cara", + "nav-history-description": "Garis masa semua pelaksanaan dan pengemaskinian penting", + "nav-history-label": "Sejarah teknikal Ethereum", + "nav-layer-2-description": "Transaksi yang lebih murah dan pantas untuk Ethereum", + "nav-learn-by-coding-description": "Alat-alat yang membantu anda mencuba dengan Ethereum", + "nav-local-env-description": "Pilih dan tetapkan tindanan pembangunan Ethereum anda", + "nav-mainnet-description": "Aplikasi blok rantai syarikat boleh dibina pada Rangkaian Utama Ethereum umum", + "nav-nft-description": "Satu cara untuk mewakili apa sahaja yang unik sebagai aset berasaskan Ethereum", + "nav-open-research-description": "Salah satu kelebihan utama Ethereum ialah komuniti penyelidikannya yang aktif", + "nav-open-research-label": "Penyelidikan terbuka", + "nav-overview-description": "Segala-galanya tentang Ethereum", + "nav-overview-label": "Ringkasan", + "nav-participate-overview-description": "Gambaran keseluruhan tentang cara untuk mengambil bahagian", "nav-primary": "Utama", + "nav-quizzes-description": "Ketahui sejauh mana anda memahami Ethereum dan mata wang kripto", + "nav-quizzes-label": "Uji pengetahuan anda", + "nav-refi-description": "Satu sistem ekonomi alternatif yang dibina atas prinsip penjanaan semula", + "nav-research-description": "Proses yang digunakan untuk menambah baik Ethereum", + "nav-research-label": "Penyelidikan dan pembangunan", + "nav-roadmap-description": "Laluan untuk penskalaan, keselamatan dan kelestarian yang lebih untuk Ethereum", + "nav-roadmap-future-description": "Mengukuhkan Ethereum sebagai satu rangkaian yang teguh dan tidak berpusat", + "nav-roadmap-future-label": "Langkah berdaya tahan masa depan", + "nav-roadmap-label": "Pelan hala tuju", + "nav-roadmap-scaling-description": "Pengemaskinian rangkaian untuk mengurangkan lagi kos transaksi dan kelajuan", + "nav-roadmap-security-description": "Memastikan Ethereum kekal berdaya tahan kepada semua jenis serangan pada masa depan", + "nav-roadmap-security-label": "Meningkatkan keselamatan", + "nav-roadmap-ux-description": "Penggunaan Ethereum perlu dipermudahkan", + "nav-run-a-node-description": "Jadi berkuasa sepenuhnya di samping membantu melindungi rangkaian", + "nav-security-description": "Ketahui amalan terbaik apabila menggunakan mata wang kripto", + "nav-smart-contracts-description": "Blok pembangunan asas bagi ekosistem Ethereum", + "nav-stablecoins-description": "Stablecoins ialah token Ethereum yang direka bentuk untuk kekal pada nilai tetap", + "nav-stake-description": "Peroleh ganjaran kerana menggunakan Ethereum", + "nav-stake-label": "Petaruhan", + "nav-staking-home-description": "Gambaran keseluruhan tentang pilihan berbeza untuk pertaruhan", + "nav-staking-pool-description": "Bertaruh dan peroleh ganjaran dengan sebarang amaun ETH dengan menyertai bersama orang lain", + "nav-staking-pool-label": "Pertaruhan terkumpul", + "nav-staking-saas-description": "Pengendali nod pihak ketiga mengendalikan operasi klien pengesah anda", + "nav-staking-saas-label": "Pertaruhan dengan perkhidmatan", + "nav-staking-solo-label": "Pertaruhan solo", + "nav-start-building-description": "Maklumat berguna untuk pengguna baharu", + "nav-translation-program-description": "Usahasama untuk menterjemah ethereum.org kepada semua bahasa", + "nav-tutorials-description": "Senarai tutorial komuniti yang dipilih susun", + "nav-use-cases-description": "Terokai idea lain untuk penggunaan Ethereum", + "nav-what-is-ether-description": "Mata wang aplikasi Ethereum", + "nav-what-is-ethereum-description": "Fahami perkara yang membuatkan Ethereum istimewa", + "nav-what-is-web3-label": "Apakah itu Web3?", + "nav-what-is-web3-description": "Alternatif kepada monopoli berpusat yang menentukan peraturan", + "nav-whitepaper-description": "Kertas putih Ethereum yang asal ditulis oleh Vitalik Buterin pada 2014", + "nav-zkp-description": "Satu cara untuk membuktikan kesahihan kenyataan tanpa mendedahkan kenyataan itu sendiri", "nft-page": "NFT - Token yang tidak dapat dipertukarkan", "nfts": "NFT", "no": "Tidak", @@ -140,6 +254,7 @@ "page-developers-aria-label": "Menu Pembangun", "page-index-meta-title": "Laman Utama", "page-last-updated": "Kali terakhir halaman dikemas kini", + "participate-menu": "Menu penyertaan", "pbs": "Pemisahan pencadang-pembina", "pools": "Pertaruhan terkumpul", "privacy-policy": "Dasar privasi", @@ -150,9 +265,11 @@ "refresh": "Sila muat semula halaman.", "return-home": "kembali ke laman utama", "roadmap": "Peta hala tuju Ethereum", + "research": "Penyelidikan", + "research-menu": "Menu penyelidikan", "resources": "Sumber untuk penterjemahan", - "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Jalankan nod", + "regenerative-finance": "ReFi - Kewangan Jana Semula", + "run-a-node": "Gerakkan nod", "rollup-component-website": "Laman web", "rollup-component-developer-docs": "Dokumen pembangun", "rollup-component-technology-and-risk-summary": "Teknologi dan ringkasan risiko", @@ -164,6 +281,7 @@ "search-box-blank-state-text": "Cari!", "search-eth-address": "Kelihatan seperti alamat Ethereum. Kami tidak menyediakan data spesifik kepada alamat. Cuba cari pada pelayar blok seperti", "search-no-results": "Carian anda tidak dijumpai", + "security": "Keselamatan", "single-slot-finality": "Kemuktamadan slot tunggal", "statelessness": "Ketiadaan keadaan", "see-contributors": "Lihat penyumbang", @@ -172,15 +290,15 @@ "show-all": "Tunjukkan semua", "show-less": "Tunjukkan lebih sedikit", "site-description": "Ethereum ialah sebuah platform global dan tak terpusat untuk mata wang dan pelbagai aplikasi baharu. Dalam Ethereum, anda boleh menulis kod yang dapat mengawal mata wang, serta membina aplikasi yang boleh diakses di mana-mana sahaja di dunia.", - "site-title": "ethereum.org", "skip-to-main-content": "Langkau ke kandungan utama", "smart-contracts": "Kontrak pintar", - "stablecoins": "Stablecoins", + "stablecoins": "Syiling Stabil", "stake-eth": "Taruh ETH", "staking": "Pertaruhan", "start-here": "Mula di sini", "style-guide": "Gaya panduan", "solo": "Pertaruhan solo", + "support": "Bantuan", "terms-of-use": "Terma Penggunaan", "translation-banner-body-new": "Anda sedang melihat halaman ini dalam Bahasa Inggeris kerana kami belum menterjemahkannya lagi. Bantu kami untuk menterjemahkan kandungan ini.", "translation-banner-body-update": "Terdapat versi baru untuk halaman ini tetapi ianya hanya didapati dalam Bahasa Inggeris buat masa ini. Bantu kami untuk menterjemahkan versi terkini.", @@ -191,20 +309,22 @@ "translation-banner-no-bugs-title": "Tiada pepijat di sini!", "translation-banner-no-bugs-content": "Halaman ini tiada terjemahan. Kami membiarkan halaman ini dalam bahasa Inggeris buat masa ini.", "translation-banner-no-bugs-dont-show-again": "Jangan tunjuk lagi", + "translation-program": "Program Penterjemahan", "try-using-search": "Cuba gunakan carian untuk menemui perkara yang anda cari", "tutorials": "Tutorial", "up": "Atas", + "use": "Guna", "use-ethereum": "Guna Ethereum", "use-ethereum-menu": "Guna menu Ethereum", + "use-menu": "Menu penggunaan", "user-experience": "Pengalaman pengguna", "verkle-trees": "Pohon Verkle", - "wallets": "Dompet", + "wallets": "Dompet-dompet", "we-couldnt-find-that-page": "Maaf, kami tidak jumpa halaman tersebut", "web3": "Apakah itu Web3?", - "web3-title": "Web3", "website-last-updated": "Kali terakhir laman web dikemas kini", "what-is-ether": "Apakah ether (ETH)?", - "what-is-ethereum": "Apa itu Ethereum?", + "what-is-ethereum": "Apakah itu Ethereum?", "withdrawals": "Pertaruhan keluaran", "yes": "Ya", "zero-knowledge-proofs": "Bukti sifar pengetahuan" diff --git a/src/intl/nb/common.json b/src/intl/nb/common.json index aeb21b49f38..316ae4e5b59 100644 --- a/src/intl/nb/common.json +++ b/src/intl/nb/common.json @@ -1,30 +1,70 @@ { "about-ethereum-org": "Om ethereum.org", "about-us": "Om oss", + "adding-desci-projects": "Legger til Desci-prosjekter", + "adding-developer-tools": "Legger til utviklerverktøy", + "adding-exchanges": "Legger til børser", + "adding-glossary-terms": "Legger til ordlisteuttrykk", + "adding-staking-products": "Legger til staking-produkter", + "adding-wallets": "Legger til lommebøker", + "account-abstraction": "Kontoabstraksjon", + "acknowledgements": "Anerkjennelser", "aria-toggle-search-button": "Veksleknapp for søk", "aria-toggle-menu-button": "Veksleknapp for meny", "beacon-chain": "Beacon-kjeden", "bridges": "Blokkkjedebroer", + "bug-bounty": "Bug bounty-program", + "build": "Bygg", + "build-menu": "Byggemeny", + "clear": "Tøm", "close": "Lukk", "community": "Fellesskap", "community-hub": "Samfunnssentral", "community-menu": "Fellesskapsmeny", "contact": "Kontakt", + "content-buckets": "Innholdssøyler", + "content-resources": "Innholdsressurser", + "content-standardization": "Innholdsstandardisering", "contributing": "Bidra", "contributors": "Bidragsytere", "contributors-thanks": "Alle som har bidratt til denne siden – takk!", "cookie-policy": "Retningslinjer for informasjonskapsler", "copied": "Kopiert", "copy": "Kopier", + "danksharding": "Danksharding", + "dao-page": "DAO - Desentraliserte egenstyrte organisasjoner", "dark-mode": "Mørk", "data-provided-by": "Datakilde:", "decentralized-applications-dapps": "Dapper - Desentraliserte applikasjoner", + "decentralized-identity": "Desentralisert identitet", + "decentralized-social-networks": "Desentraliserte sosiale nettverk", "decentralized-science": "DeSci - Desentralisert vitenskap", + "description": "Beskrivelse av nav-element", + "defi-page": "DeFi - Desentralisert finans", + "design": "Design", + "design-principles": "Designprinsipper", "devcon": "Devcon", "developers": "Utviklere", "developers-home": "Startside for utviklere", "docs": "Dokumenter", + "docsearch-to-select": "Å velge", + "docsearch-to-navigate": "Å navigere", + "docsearch-to-close": "Å lukke", + "docsearch-search-by": "Søk etter", + "docsearch-start-recent-searches-title": "Nylig", + "docsearch-start-no-recent-searches": "Ingen nylige søk", + "docsearch-start-save-recent-search": "Lagre dette søket", + "docsearch-start-remove-recent-search": "Fjern dette søket fra historikken", + "docsearch-start-favorite-searches": "Favoritt", + "docsearch-start-remove-favorite-search": "Fjern dette søket fra favoritter", + "docsearch-no-results-text": "Ingen resultater for", + "docsearch-no-results-suggested-query": "Prøv å søke etter", + "docsearch-no-results-missing": "Burde dette spørsmålet gi deg resultater?", + "docsearch-no-results-missing-link": "Gi oss beskjed.", + "docsearch-error-title": "Kunne ikke hente resultater", + "docsearch-error-help": "Du burde kanskje sjekke koblingen til nettverket ditt.", "documentation": "Dokumentasjon", + "down": "Ned", "ecosystem": "Økosystem", "edit-page": "Rediger side", "ef-blog": "Ethereum Foundation-blogg", @@ -34,10 +74,10 @@ "enterprise-menu": "Bedrift-meny", "esp": "Støtteprogram for økosystem", "eth-current-price": "Nåværende ETH-pris (USD)", + "ethereum-basics": "Grunnleggende om Ethereum", "ethereum-bug-bounty": "Ethereums belønningsprogram for problemløsning", "consensus-when-shipping": "Når blir den levert?", "ethereum-upgrades": "Ethereum-oppgraderinger", - "ethereum-brand-assets": "Merkevareaktiva for Ethereum", "ethereum-online": "Nettbaserte felleskap", "ethereum-events": "Ethereum-arrangementer", "ethereum-foundation": "Ethereum Foundation", @@ -45,6 +85,8 @@ "ethereum-glossary": "Ethereum-ordliste", "ethereum-governance": "Ethereum-styring", "ethereum-logo": "Ethereum-logo", + "ethereum-roadmap": "Ethereum-veikart", + "ethereum-protocol": "Ethereum-protokoll", "ethereum-security": "Ethereums sikkerhets- og svindelforebygging", "ethereum-support": "Ethereum-brukerstøtte", "ethereum-wallets": "Ethereum-lommebøker", @@ -59,18 +101,17 @@ "feedback-widget-thank-you-timing": "2–3 min.", "feedback-widget-thank-you-cta": "Åpne kort spørreundersøkelse", "find-wallet": "Finn lommebok", + "future-proofing": "Fremtidssikring", "get-eth": "Hent ETH", "get-involved": "Bli involvert", "get-started": "Kom i gang", "grants": "Tilskudd", "grant-programs": "Støtteprogram for økosystem", - "guides-and-resources": "Fellesskapsveiledninger og -ressurser", "guides": "Veiledninger", - "guides-hub": "Veileder-hub", + "guides-hub": "Veiledninger", "history-of-ethereum": "Ethereums historie", "home": "Startside", "how-ethereum-works": "Slik fungerer Ethereum", - "how-to-create-an-ethereum-account": "Slik registrerer du en Ethereum-konto", "how-to-revoke-token-access": "Slik opphever du smartkontraktens tilgang til dine krypto-midler", "how-to-swap-tokens": "Hvordan bytte token", "how-to-use-a-bridge": "Hvordan bygger du tokenbro til lag 2", @@ -88,6 +129,7 @@ "layer-2": "Lag 2", "learn": "Lær", "learn-by-coding": "Lær ved koding", + "learn-hub": "Læringshub", "learn-menu": "Lær-meny", "learn-more": "Finn ut mer", "less": "Mindre", @@ -96,23 +138,143 @@ "loading": "Laster...", "loading-error": "Lasting mislyktes.", "loading-error-refresh": "Feil, vennligst oppdater.", + "loading-error-try-again-later": "Kan ikke laste inn data. Prøv igjen senere.", "logo": "logo", "mainnet-ethereum": "Ethereum-hovednett", + "merge": "Slå sammen", "more": "Mer", + "nav-about-description": "Et offentlig, åpen kildekode-prosjekt for Ethereum-samfunnet", + "nav-advanced-description": "Lær de mer komplekse emnene", + "nav-advanced-label": "Avansert", + "nav-basics-description": "Forstå det grunnleggende av Ethereum", + "nav-basics-label": "Grunnleggende", + "nav-bridges-description": "Web3 har utviklet seg til et økosystem av hovedsakelig L1-blokkjeder og L2-skalerings-løsninger", + "nav-builders-home-description": "En byggehåndbok for Ethereum, av byggere for byggere", + "nav-builders-home-label": "Byggernes hjem", + "nav-contribute-description": "Hvis du vil ha hjelp, vill dette veilede deg", + "nav-contribute-label": "Bidra til ethereum.org", + "nav-dao-description": "Samfunn eid av medlemmer uten sentralisert myndighet", + "nav-dapps-description": "Utforsk et rikt økosystem av apper ved bruk av Ethereum", + "nav-defi-description": "Et globalt, åpent alternativ til det tradisjonelle finansmarkedet", + "nav-desci-description": "Et globalt, åpent alternativ til dagens vitenskapelige system", + "nav-desoc-description": "Blokkjede-baserte plattformer for sosiale interaksjoner og utvikling av innhold", + "nav-developers-docs": "Dokumenter for utviklere", + "nav-developers": "Utviklere", + "nav-did-description": "Utsted og eie dine unike desentraliserte identifikatorer", + "nav-docs-description": "Dokumenter for å hjelpe deg med å forstå og bygge med Ethereum", + "nav-docs-design-description": "Beskrivelse av unike web3-designutfordringer, beste praksis og brukeres innblikk i forskning", + "nav-docs-design-label": "UX/UI grunnleggende design", + "nav-docs-foundation-description": "Grunnleggende faktorer for å utvikle på Ethereum", + "nav-docs-overview-description": "Ditt hjem for utviklere-dokumenter", + "nav-docs-stack-description": "Forstå alle detaljene av Ethereum-stabelen", + "nav-eip-description": "Standarder som angir nye funksjoner eller prosesser", + "nav-eip-label": "Forslag til forbedringer for Ethereum (EIPs)", + "nav-emerging-description": "Bli kjent med andre nyere brukstilfeller for Ethereum", + "nav-enterprise-description": "Forretningsapplikasjoner for Ethereum", + "nav-ethereum-org-description": "Dette nettstedet er drevet av fellesskapet – bli med oss og bidra også", + "nav-ethereum-wallets-description": "En app for å samhandle med Ethereum-kontoen din", + "nav-events-description": "Desentralisering og frihet til å delta for alle", + "nav-events-irl-description": "Hver måned er det store Ethereum-arrangementer personlig og på nett", + "nav-events-label": "Fellesskap og arrangementer", + "nav-events-online-description": "Hundretusener av Ethereum-entusiaster samles i disse nettsamfunnene", + "nav-find-wallet-description": "Lommebøker lar deg bruke krypto", + "nav-find-wallet-label": "Velg din lommebok", + "nav-gas-fees-description": "Hvordan er ETH-transaksjonsgebyrer kalkulert", + "nav-get-eth-description": "Du trenger ether (ETH) for å bruke Ethereum-applikasjoner", + "nav-get-started-description": "Ditt første steg for å bruke Ethereum", + "nav-governance-description": "Prosessen involvert i oppgradering av Ethereum-protokollen", + "nav-governance-label": "Styring", + "nav-grants-description": "En kuratert liste av samfunnet vårt over prosjekter som gir tilskuddsfinansieringsprogrammer", + "nav-guide-create-account-description": "Hvem som helst kan skape en Ethereum-konto når som helst, helt gratis med en lommebok-app", + "nav-guide-revoke-access-description": "Vær trygg når du samhandler med smarte kontrakter og applikasjoner i Ethereum-økosystemet", + "nav-guide-revoke-access-label": "Hvordan tilbakekalle smart kontraktstilgang", + "nav-guide-use-wallet-description": "Lær hvordan du bruker alle de grunnleggende funksjonene til en lommebok", + "nav-guide-use-wallet-label": "Slik bruker du en lommebok", + "nav-guides-description": "Praktiske trinnvise veiledninger for å hjelpe deg i gang", + "nav-guides-label": "Hvordan bruke veiledere", + "nav-history-description": "En tidslinje for alle de store forgrene og oppdateringene", + "nav-history-label": "Ethereums tekniske historie", + "nav-layer-2-description": "Billigere og raskere transaksjoner for Ethereum", + "nav-learn-by-coding-description": "Verktøy som hjelper deg å eksperimentere med Ethereum", + "nav-local-env-description": "Velg og sett opp Ethereum-utviklingsstabelen din", + "nav-mainnet-description": "Enterprise blokkjede-applikasjoner kan bygges på det offentlige Ethereum Mainnet", + "nav-nft-description": "En måte å representere noe unikt som en Ethereum-basert eiendel", + "nav-open-research-description": "En av de viktigste styrkene til Ethereum er det aktive forskningsmiljøet", + "nav-open-research-label": "Åpen forskning", + "nav-overview-description": "Alt om Ethereum-utdanning", + "nav-participate-overview-description": "Oversikt over hvordan du deltar", + "nav-primary": "Primær", + "nav-quizzes-description": "Finn ut hvor godt du forstår Ethereum og kryptovalutaer", + "nav-quizzes-label": "Test kunnskapen din", + "nav-refi-description": "Et alternativt økonomisk system bygget på regenerative prinsipper", + "nav-research-description": "Prosesser som brukes til å forbedre Ethereum", + "nav-research-label": "Forskning og utvikling", + "nav-roadmap-description": "Veien til mer skalerbarhet, sikkerhet og bærekraft for Ethereum", + "nav-roadmap-future-description": "Styrking av Ethereum som et robust og desentralisert nettverk", + "nav-roadmap-future-label": "Fremtidssikring", + "nav-roadmap-label": "Veikart", + "nav-roadmap-scaling-description": "Nettverksoppdateringer for å redusere transaksjonskostnader og hastighet ytterligere", + "nav-roadmap-security-description": "Sørge for at Ethereum forblir motstandsdyktig mot alle slags angrep i fremtiden", + "nav-roadmap-security-label": "Forbedret sikkerhet", + "nav-roadmap-ux-description": "Bruk av Ethereum må forenkles", + "nav-run-a-node-description": "Bli fullstendig suveren samtidig som du bidrar til å sikre nettverket", + "nav-security-description": "Lær beste praksis når du bruker kryptovaluta", + "nav-smart-contracts-description": "De grunnleggende bulideringsblokkene i Ethereum-økosystemet", + "nav-stablecoins-description": "Stablecoins er Ethereum-tokens designet for å holde seg på en fast verdi", + "nav-stake-description": "Tjen belønninger for å sikre Ethereum", + "nav-stake-label": "Stake", + "nav-staking-home-description": "En oversikt over ulike alternativer for staking", + "nav-staking-pool-description": "Stake og tjen belønninger med et hvilket som helst beløp av ETH ved å bli med andre", + "nav-staking-pool-label": "Samlet staking", + "nav-staking-saas-label": "Staking med en tjeneste", + "nav-staking-solo-label": "Solo-staking", + "nav-start-building-description": "Nyttig informasjon for nykommere", + "nav-translation-program-description": "Et samarbeid for å oversette ethereum.org til alle språk", + "nav-tutorials-description": "Kuratert liste over opplæringsprogrammer for fellesskapet", + "nav-use-cases-description": "Oppdag forskjellige ideer for bruk av Ethereum", + "nav-what-is-ether-description": "Valutaen til Ethereum-apper", + "nav-what-is-ethereum-description": "Forstå hva som gjør Ethereum spesielt", + "nav-what-is-web3-label": "Hva er Web3?", + "nav-what-is-web3-description": "Et alternativ til sentraliserte monopoler som dikterer reglene", + "nav-whitepaper-description": "Den originale Ethereum whitepaper skrevet av Vitalik Buterin i 2014", + "nav-zkp-description": "En måte å bevise gyldigheten av en uttalelse uten å avsløre selve uttalelsen", + "nft-page": "NFT - Ikke-ombyttelige tokener", + "nfts": "FTF-er", + "no": "Nei", "on-this-page": "På denne siden", + "open-research": "Åpen forskning", + "page-developers-aria-label": "Utviklermeny", + "page-index-meta-title": "Startside", "page-last-updated": "Siden sist oppdatert", + "participate-menu": "Delta-menyen", + "pbs": "Seperasjon av Forslag-bygger", + "pools": "Samlet staking", "privacy-policy": "Retningslinjer for personvern", "private-ethereum": "Privat Ethereum", + "product-disclaimer": "Produkter og tjenester er listet som en bekvemmelighet for Ethereum-samfunnet. Inkludering av produkter eller tjenester representerer ikke en anbefaling fra ethereum.org nettside-teamet, eller Ethereum Foundation.", + "quizzes-title": "Quiz-hub", + "quizzes": "Quizer", "refresh": "Last inn siden på nytt.", "return-home": "returner hjem", - "run-a-node": "Kjør en node", + "roadmap": "Ethereum-veikart", + "research": "Forskning", + "research-menu": "Forskning-menyen", + "resources": "Oversettelsesressurser", + "run-a-node": "Kjøre en node", "rollup-component-website": "Nettsted", "rollup-component-developer-docs": "Dokumenter for utviklere", "rollup-component-technology-and-risk-summary": "Teknologi- og risikosammendrag", + "scaling": "Skalering", + "saas": "Staking som en tjeneste", "search": "Søk", + "search-ethereum-org": "Søk på ethereum.org", + "secret-leader-election": "Hemmelig valg av leder", "search-box-blank-state-text": "Søk i vei!", "search-eth-address": "Dette ser ut som en Ethereum adresse. Vi oppgir ikke data som er spesifikke for adresser. Prøv å søke på en blokkjedeutforsker som", "search-no-results": "Ingen resultater for søket ditt", + "security": "Sikkerhet", + "single-slot-finality": "Enkeltsporsavslutning", + "statelessness": "Statelesshet", "see-contributors": "Vis bidragsytere", "set-up-local-env": "Sett opp lokalt miljø", "sharding": "Sharding", @@ -124,10 +286,9 @@ "smart-contracts": "Smarte kontrakter", "stablecoins": "Stablecoins", "staking": "Staking", + "start-here": "Start her", "solo": "Solo-staking", - "saas": "Staking som en tjeneste", - "pools": "Samlet staking", - "withdrawals": "Staking uttak", + "support": "Brukerstøtte", "terms-of-use": "Vilkår for bruk", "translation-banner-body-new": "Du ser på denne siden på engelsk fordi vi ikke har oversatt den ennå. Hjelp oss å oversette dette innholdet.", "translation-banner-body-update": "Det finnes en ny versjon av denne siden, men den er bare på engelsk akkurat nå. Hjelp oss å oversette den nyeste versjonen.", @@ -138,24 +299,23 @@ "translation-banner-no-bugs-title": "Ingen feil her!", "translation-banner-no-bugs-content": "Denne siden oversettes ikke. Vi har med hensikt latt denne siden stå på engelsk så lenge.", "translation-banner-no-bugs-dont-show-again": "Ikke vis igjen", + "translation-program": "Oversettelsesprogram", "try-using-search": "Prøv å bruke søk for å finne det du leter etter eller", "tutorials": "Veiledninger", + "up": "Opp", + "use": "Bruk", "use-ethereum": "Bruke Ethereum", "use-ethereum-menu": "Bruke Ethereum-meny", - "wallets": "Lommebøker", + "use-menu": "Bruk-menyen", + "verkle-trees": "Verkle-trær", + "wallets": "Lommebok", "we-couldnt-find-that-page": "Vi fant ikke den siden", "web3": "Hva er Web3?", "web3-title": "Web3", "website-last-updated": "Nettsiden ble sist oppdatert", "what-is-ether": "Hva er ether (ETH)?", "what-is-ethereum": "Hva er Ethereum?", - "defi-page": "DeFi - Desentralisert finans", - "dao-page": "DAO - Desentraliserte egenstyrte organisasjoner", - "nft-page": "NFT - Ikke-ombyttelige tokener", - "decentralized-social-networks": "Desentraliserte sosiale nettverk", - "decentralized-identity": "Desentralisert identitet", + "withdrawals": "Staking uttak", "yes": "Ja", - "zero-knowledge-proofs": "Null-kunnskap bevis", - "page-index-meta-title": "Hjem", - "page-developers-aria-label": "Utviklermeny" + "zero-knowledge-proofs": "Null-kunnskap bevis" } diff --git a/src/intl/nl/common.json b/src/intl/nl/common.json index 5812c5dc2bb..9a33df80de4 100644 --- a/src/intl/nl/common.json +++ b/src/intl/nl/common.json @@ -1,17 +1,28 @@ { - "account-abstraction": "Accountabstractie", "about-ethereum-org": "Over ethereum.org", "about-us": "Over ons", + "adding-desci-projects": "Desci-projecten toevoegen", + "adding-developer-tools": "Tools voor ontwikkelaars toevoegen", + "adding-exchanges": "Uitwisselingskantoor toevoegen", + "adding-glossary-terms": "Nieuwe woorden toevoegen", + "adding-products": "Producten toevoegen", + "adding-staking-products": "Staking-producten toevoegen", + "adding-wallets": "Portemonnees toevoegen", + "account-abstraction": "Accountabstractie", + "acknowledgements": "Erkenningen", "aria-toggle-search-button": "Toon/verberg zoekknop", "aria-toggle-menu-button": "Toon/verberg menuknop", "beacon-chain": "Beacon Chain", "bridges": "Blockchain-bruggen", + "build": "Bouwen", + "build-menu": "Bouwmenu", "clear": "Wissen", "close": "Sluiten", "community": "Community", "community-hub": "Community hub", "community-menu": "Community-menu", "contact": "Contact", + "content-resources": "Inhoudelijke bronnen", "content-standardization": "Inhoudsstandaardisering", "contributing": "Bijdragen", "contributors": "Bijdragers", @@ -27,7 +38,10 @@ "decentralized-identity": "Gedecentraliseerde identiteit", "decentralized-social-networks": "Gedecentraliseerde sociale netwerken", "decentralized-science": "DeSci - Gedecentraliseerde wetenschap", + "description": "Beschrijving voor nav.item", "defi-page": "DeFi - Gedecentraliseerde financiën", + "design": "Ontwerp", + "design-principles": "Ontwerpprincipes", "devcon": "Devcon", "developers": "Ontwikkelaars", "developers-home": "Startpagina voor ontwikkelaars", @@ -51,7 +65,7 @@ "documentation": "Documentatie", "down": "Naar beneden", "ecosystem": "Ecosysteem", - "edit-page": "Pagina bewerken", + "edit-page": "Bewerk pagina", "ef-blog": "Ethereum Foundation-blog", "eips": "Voorstellen voor verbetering van Ethereum", "energy-consumption": "Ethereum-energieverbruik", @@ -63,7 +77,7 @@ "ethereum-bug-bounty": "Ethereum bug bounty-programma", "consensus-when-shipping": "Wanneer wordt het verstuurd?", "ethereum-upgrades": "Ethereum-upgrades", - "ethereum-brand-assets": "Ethereum-merkcontent", + "ethereum-brand-assets": "Merkactiva van Ethereum", "ethereum-online": "Online gemeenschappen", "ethereum-events": "Ethereum-evenementen", "ethereum-foundation": "Ethereum Foundation", @@ -75,7 +89,7 @@ "ethereum-protocol": "Ethereum-protocol", "ethereum-security": "Ethereum-beveiliging en -scampreventie", "ethereum-support": "Ethereum-ondersteuning", - "ethereum-wallets": "Ethereum Wallets", + "ethereum-wallets": "Ethereum wallets", "ethereum-whitepaper": "Ethereum-whitepaper", "feedback-widget-prompt": "Vond u deze pagina nuttig?", "feedback-card-prompt-page": "Was deze pagina behulpzaam?", @@ -83,22 +97,22 @@ "feedback-card-prompt-tutorial": "Was deze tutorial nuttig?", "feedback-widget-thank-you-title": "Bedankt voor je feedback!", "feedback-widget-thank-you-subtitle": "Maak deze pagina nog beter door enkele vragen te beantwoorden.", - "feedback-widget-thank-you-subtitle-ext": "Als u hulp nodig heeft, kunt u contact opnemen met de community op ons Discord-kanaal.", + "feedback-widget-thank-you-subtitle-ext": "Als je hulp nodig hebt, kun je contact opnemen met de gemeenschap op onze Discord.", "feedback-widget-thank-you-timing": "2-3 minuten", "feedback-widget-thank-you-cta": "Open korte enquête", - "find-wallet": "Zoek wallet", + "find-wallet": "Zoek een wallet", "future-proofing": "Toekomstbestendigheid", - "get-eth": "ETH verkrijgen", + "get-eth": "Verkrijg ETH", "get-involved": "Help mee", "get-started": "Aan de slag", "grants": "Subsidies", "grant-programs": "Ecosysteem-subsidieprogramma's", "guides": "Gidsen", - "guides-hub": "Hub voor handleidingen", + "guides-hub": "Handleidingen", "history-of-ethereum": "Geschiedenis van Ethereum", "home": "Home", "how-ethereum-works": "Hoe Ethereum werkt", - "how-to-register-an-ethereum-account": "Hoe een Ethereum-account registreren", + "how-to-create-an-ethereum-account": "Hoe een Ethereum-account \"creëren\"", "how-to-revoke-token-access": "Hoe toegang via slimme contracten tot uw cryptofondsen herroepen", "how-to-swap-tokens": "Hoe tokens wisselen", "how-to-use-a-bridge": "Hoe tokens naar laag 2 bridgen", @@ -115,7 +129,7 @@ "last-edit": "Laatst bewerkt", "layer-2": "Laag 2", "learn": "Info", - "learn-by-coding": "Leer door coderen", + "learn-by-coding": "Leer door te coderen", "learn-hub": "Hub leren", "learn-menu": "Leer menu", "learn-more": "Meer informatie", @@ -128,18 +142,121 @@ "loading-error-try-again-later": "Kan gegevens niet laden. Probeer het later nog eens.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Samenvoegen", "more": "Meer", - "nav-developers": "Ontwikkelaars", + "nav-about-description": "Een openbaar, open-source project voor de Ethereum-gemeenschap", + "nav-advanced-description": "Leer de complexere onderwerpen", + "nav-advanced-label": "Geavanceerd", + "nav-basics-description": "Begrijp de fundamenten van Ethereum", + "nav-basics-label": "Basisbeginselen", + "nav-bridges-description": "Web3 is geëvolueerd naar een ecosysteem van primaire L1-blockchains en L2-schaaloplossingen", + "nav-builders-home-description": "Een bouwhandleiding voor Ethereum – door bouwers, voor bouwers", + "nav-builders-home-label": "Startpagina bouwers", + "nav-contribute-description": "Als je wilt helpen, zal dit je leidraad zijn", + "nav-contribute-label": "Bijdragen aan ethereum.org", + "nav-dao-description": "Gemeenschappen die eigendom zijn van leden, zonder gecentraliseerd gezag", + "nav-dapps-description": "Ontdek een rijk ecosysteem van apps met behulp van Ethereum", + "nav-defi-description": "Een wereldwijd, open alternatief voor de traditionele financiële markt", + "nav-desci-description": "Een wereldwijd, open alternatief voor het huidige wetenschappelijke systeem", + "nav-desoc-description": "Op blockchain gebaseerde platforms voor sociale interactie en contentcreatie", "nav-developers-docs": "Ontwikkelaarsdocumenten", + "nav-developers": "Ontwikkelaars", + "nav-did-description": "Geef je unieke gedecentraliseerde identifiers uit en beheer deze", + "nav-docs-description": "Documenten om je te helpen Ethereum te begrijpen en ermee te bouwen", + "nav-docs-design-description": "Beschrijving van unieke uitdagingen op het gebied van web3-ontwerp, best practices en inzichten uit gebruikersonderzoeken", + "nav-docs-design-label": "Basisbeginselen voor UX/UI-ontwerp", + "nav-docs-foundation-description": "Kernfundamenten om te ontwikkelen op Ethereum", + "nav-docs-foundation-label": "Fundamentele onderwerpen", + "nav-docs-overview-description": "Je thuisbasis voor ontwikkelaarsdocumenten", + "nav-docs-stack-description": "Begrijp alle details van de Ethereum stack", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Normen die nieuwe functies of processen specificeren", + "nav-eip-label": "Ethereum-verbeteringsvoorstellen (EIP's)", + "nav-emerging-description": "Maak kennis met andere nieuwere gebruiksscenario's voor Ethereum", + "nav-enterprise-description": "Zakelijke toepassingen voor Ethereum", + "nav-ethereum-org-description": "Deze website wordt door de gemeenschap aangestuurd — doe mee en draag ook bij", + "nav-ethereum-wallets-description": "Een app om te communiceren met je Ethereum-account", + "nav-events-description": "Decentralisatie en vrijheid om te participeren voor iedereen", + "nav-events-irl-description": "Elke maand zijn er grote Ethereum-evenementen, zowel persoonlijk als online", + "nav-events-label": "Gemeenschappen en evenementen", + "nav-events-online-description": "Honderdduizenden Ethereum-enthousiastelingen zijn actief in deze online gemeenschappen", + "nav-find-wallet-description": "Met portemonnees kun je crypto gebruiken", + "nav-find-wallet-label": "Kies je portemonnee", + "nav-gas-fees-description": "Hoe worden ETH-transactiekosten berekend", + "nav-gas-fees-label": "Gas kosten", + "nav-get-eth-description": "Je hebt ether (ETH) nodig om Ethereum-applicaties te gebruiken", + "nav-get-started-description": "Je eerste stappen om Ethereum te gebruiken", + "nav-governance-description": "Het proces dat betrokken is bij het upgraden van het Ethereum-protocol", + "nav-governance-label": "Bestuur", + "nav-grants-description": "Een door onze gemeenschap samengestelde lijst met projecten die subsidieprogramma's aanbieden", + "nav-guide-create-account-description": "Iedereen kan op elk moment gratis een Ethereum-account aanmaken met een portemonnee-app", + "nav-guide-create-account-label": "Een Ethereum-account maken", + "nav-guide-revoke-access-description": "Blijf veilig tijdens de interactie met slimme contracten en applicaties in het Ethereum-ecosysteem", + "nav-guide-revoke-access-label": "Hoe je de toegang tot slimme contracten kunt intrekken", + "nav-guide-use-wallet-description": "Leer hoe je alle basisfuncties van een portemonnee gebruikt", + "nav-guide-use-wallet-label": "Hoe een wallet gebruiken", + "nav-guides-description": "Praktische stap-voor-stap handleidingen om je op weg te helpen", + "nav-guides-label": "Handleidingen", + "nav-history-description": "Een tijdlijn van alle belangrijke vorken en updates", + "nav-history-label": "Technische geschiedenis van Ethereum", + "nav-layer-2-description": "Goedkopere en snellere transacties voor Ethereum", + "nav-learn-by-coding-description": "Tools die je helpen met Ethereum te experimenteren", + "nav-local-env-description": "Kies en configureer je Ethereum-ontwikkelstack", + "nav-mainnet-description": "Enterprise blockchain-applicaties kunnen worden gebouwd op het openbare Ethereum Mainnet", + "nav-nft-description": "Een manier om iets unieks te vertegenwoordigen als een op Ethereum gebaseerd activum", + "nav-open-research-description": "Een van de belangrijkste sterke punten van Ethereum is de actieve onderzoeksgemeenschap", + "nav-open-research-label": "Onderzoek openen", + "nav-overview-description": "Alles wat met Ethereum-voorlichting te maken heeft", + "nav-overview-label": "Overzicht", + "nav-participate-overview-description": "Overzicht van hoe je kunt deelnemen", "nav-primary": "Primair", + "nav-quizzes-description": "Ontdek hoe goed je Ethereum en cryptocurrencies begrijpt", + "nav-quizzes-label": "Test je kennis", + "nav-refi-description": "Een alternatief economisch systeem dat voortbouwt op regeneratieve principes", + "nav-research-description": "Processen die gebruikt worden om Ethereum te verbeteren", + "nav-research-label": "Onderzoek en ontwikkeling", + "nav-roadmap-description": "Het traject naar meer schaalbaarheid, veiligheid en duurzaamheid voor Ethereum", + "nav-roadmap-future-description": "Ethereum versterken als een robuust en gedecentraliseerd netwerk", + "nav-roadmap-future-label": "Toekomstbestendigheid", + "nav-roadmap-label": "Routekaart", + "nav-roadmap-scaling-description": "Netwerkupdates om de transactiekosten en snelheid verder te verlagen", + "nav-roadmap-security-description": "Ervoor zorgen dat Ethereum ook in de toekomst bestand blijft tegen allerlei soorten aanvallen", + "nav-roadmap-security-label": "Verbeterde beveiliging", + "nav-roadmap-ux-description": "Het gebruik van Ethereum moet worden vereenvoudigd", + "nav-run-a-node-description": "Word volledig soeverein en help tegelijkertijd het netwerk te beveiligen", + "nav-security-description": "Leer best practices bij het gebruik van cryptocurrency", + "nav-smart-contracts-description": "De fundamentele bouwstenen van het Ethereum-ecosysteem", + "nav-stablecoins-description": "Stablecoins zijn Ethereum-tokens die zijn ontworpen om een vaste waarde te behouden", + "nav-stake-description": "Verdien beloningen voor het veiligstellen van Ethereum", + "nav-stake-label": "Stake", + "nav-staking-home-description": "Een overzicht van verschillende opties voor staking", + "nav-staking-home-label": "Staking-startpagina", + "nav-staking-pool-description": "Stake en verdien beloningen met elk willekeurig ETH-bedrag door samen te werken met anderen", + "nav-staking-pool-label": "Gepoolde staking", + "nav-staking-saas-description": "Node operators van derden beheren de werking van uw validator-client", + "nav-staking-saas-label": "Staking met een service", + "nav-staking-solo-description": "Voer home-hardware uit en voeg persoonlijk toe aan de beveiliging en decentralisatie van het Ethereum-netwerk", + "nav-staking-solo-label": "Solo staking", + "nav-start-building-description": "Nuttige informatie voor nieuwkomers", + "nav-translation-program-description": "Een collaboratieve inspanning om ethereum.org in alle talen te vertalen", + "nav-tutorials-description": "Samengestelde lijst van gemeenschapstutorials", + "nav-use-cases-description": "Ontdek verschillende ideeën voor het gebruik van Ethereum", + "nav-what-is-ether-description": "De valuta van Ethereum-apps", + "nav-what-is-ethereum-description": "Begrijp wat Ethereum speciaal maakt", + "nav-what-is-web3-label": "Wat is Web3?", + "nav-what-is-web3-description": "Een alternatief voor gecentraliseerde monopolies die de regels dicteren", + "nav-whitepaper-description": "Het oorspronkelijke Ethereum-whitepaper geschreven door Vitalik Buterin in 2014", + "nav-zkp-description": "Een manier om de geldigheid van een verklaring te bewijzen zonder de verklaring zelf te onthullen", "nft-page": "NFT's - Niet-vervangbare tokens", "nfts": "NFT's", "no": "Nee", "on-this-page": "Op deze pagina", "open-research": "Onderzoek openen", - "page-developers-aria-label": "Ontwikkelaarsmenu", + "page-developers-aria-label": "Menu voor ontwikkelaars", "page-index-meta-title": "Home", "page-last-updated": "Pagina laatst bijgewerkt", + "participate": "Doe mee", + "participate-menu": "Deelnamemenu", "pbs": "Scheiding proposer-builder", "pools": "Gepoolde staking", "privacy-policy": "Privacybeleid", @@ -150,6 +267,8 @@ "refresh": "Ververs de pagina.", "return-home": "terug naar startpagina", "roadmap": "Ethereum-roadmap", + "research": "Onderzoek", + "research-menu": "Onderzoeksmenu", "resources": "Vertaalbronnen", "regenerative-finance": "ReFi - Regeneratieve financiering", "run-a-node": "Run een node", @@ -164,6 +283,7 @@ "search-box-blank-state-text": "Zoeken maar!", "search-eth-address": "Dit lijkt op een Ethereum-adres. We verstrekken geen specifieke gegevens. Probeer het te zoeken op een block explorer zoals", "search-no-results": "Geen zoekresulaten", + "security": "Beveiliging", "single-slot-finality": "Single-slot finaliteit", "statelessness": "Statelessness", "see-contributors": "Bekijk bijdragers", @@ -181,6 +301,7 @@ "start-here": "Start hier", "style-guide": "Stijlgids", "solo": "Solo staking", + "support": "Ondersteuning", "terms-of-use": "Gebruiksvoorwaarden", "translation-banner-body-new": "Je bekijkt deze pagina in het Engels omdat we hem nog niet hebben vertaald. Help ons deze inhoud te vertalen.", "translation-banner-body-update": "Er is een nieuwe versie van deze pagina, maar die is momenteel alleen in het Engels. Help ons de nieuwste versie te vertalen.", @@ -191,11 +312,14 @@ "translation-banner-no-bugs-title": "Geen bugs hier!", "translation-banner-no-bugs-content": "Deze pagina wordt niet vertaald. We hebben deze pagina voorlopig bewust in het Engels laten staan.", "translation-banner-no-bugs-dont-show-again": "Niet meer tonen", + "translation-program": "Vertalingsprogramma", "try-using-search": "Gebruik zoekopdracht om te vinden waar u naar op zoek bent", "tutorials": "Tutorials", "up": "Naar boven", + "use": "Gebruik", "use-ethereum": "Ethereum gebruiken", "use-ethereum-menu": "Ethereum-menu gebruiken", + "use-menu": "Gebruiksmenu", "user-experience": "Gebruikerservaring", "verkle-trees": "Verkle-bomen", "wallets": "Wallets", diff --git a/src/intl/pcm/common.json b/src/intl/pcm/common.json index 3d5c1b34f68..831ff9692e1 100644 --- a/src/intl/pcm/common.json +++ b/src/intl/pcm/common.json @@ -1,7 +1,14 @@ { - "account-abstraction": "Akant abstashon", "about-ethereum-org": "Abou ethereum.org", "about-us": "Abou us", + "adding-desci-projects": "To dey add Desci Projects", + "adding-developer-tools": "To dey add Divelopa Tools", + "adding-exchanges": "To dey add ekshanjis", + "adding-glossary-terms": "To dey add Glossary Terms", + "adding-staking-products": "To dey add Staking Products", + "adding-wallets": "To dey add Wallets", + "account-abstraction": "Akant abstashon", + "acknowledgements": "Acknowledgements", "aria-toggle-search-button": "Press searsh buton", "aria-toggle-menu-button": "Press menu buton", "beacon-chain": "Beacon Chain", @@ -12,6 +19,8 @@ "community-hub": "Komunity hub", "community-menu": "Komunity menu", "contact": "Kontact", + "content-buckets": "Kontents Buckets", + "content-resources": "Kontent Risorsis", "content-standardization": "Di Koret standad for D way kontent supose dey", "contributing": "Dey kontribut", "contributors": "Kontributor", @@ -27,7 +36,10 @@ "decentralized-identity": "Disentralized identity", "decentralized-social-networks": "Disentralized soshia netwoks", "decentralized-science": "DeSci - Disentralized sayens", + "description": "Desikripshon for nav item", "defi-page": "Defi - Disentralized finans", + "design": "Disign", + "design-principles": "Disign Prinsipol", "devcon": "Devkon", "developers": "Divelopas", "developers-home": "Divelopas haus", @@ -59,7 +71,6 @@ "enterprise-menu": "Entaprise menu", "esp": "Ekosystem Suport programme", "eth-current-price": "Kurrent ETH price (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Ethereum bug bounty program", "consensus-when-shipping": "Wen e go ship?", "ethereum-upgrades": "Ethereum upgrades", @@ -83,7 +94,7 @@ "feedback-card-prompt-tutorial": "Shey dis tutorial dey helep?", "feedback-widget-thank-you-title": "Tank yu for wetin yu tell us!", "feedback-widget-thank-you-subtitle": "Make dis page betta as yu dey ansa few kweshons.", - "feedback-widget-thank-you-subtitle-ext": "If yu nid any helep, yu fit tok to di komunity on top awa Discord.", + "feedback-widget-thank-you-subtitle-ext": "If yu nid helep, yu fit rish out to di komunity on awa Discord.", "feedback-widget-thank-you-timing": "2-3 min", "feedback-widget-thank-you-cta": "Make yu open short survey", "find-wallet": "Find wallet", @@ -94,11 +105,10 @@ "grants": "Grants", "grant-programs": "Ecosystem Grant programs", "guides": "Guides", - "guides-hub": "Guides hub", + "guides-hub": "Hau to dey guide", "history-of-ethereum": "Ethereum history", "home": "Haus", "how-ethereum-works": "Hau ethereum dey work", - "how-to-register-an-ethereum-account": "Hau yu fit regista ethereum akant", "how-to-revoke-token-access": "Hau yu fit komot smart kontract wey get asess to yor crypto funds", "how-to-swap-tokens": "Hau yu fit take swap tokens", "how-to-use-a-bridge": "Hau yu fit bridge tokens to layer2", @@ -115,7 +125,7 @@ "last-edit": "Last edit", "layer-2": "Layer 2", "learn": "Make yu Learn", - "learn-by-coding": "Learn by coding", + "learn-by-coding": "Learn by kodin", "learn-hub": "Learn Hub", "learn-menu": "Learn menu", "learn-more": "Make yu learn more", @@ -128,10 +138,104 @@ "loading-error-try-again-later": "Di tin wey yu dey find nor gri load. Yu fit try am again later.", "logo": "logo", "mainnet-ethereum": "Ethereum mainnet", - "more": "More", - "nav-developers": "Developers", + "merge": "Merge am", + "more": "Show more", + "nav-about-description": "A publik, projet wey dey open for di Ethereum komunity", + "nav-advanced-description": "Learn topiks wey dey kompleks pass welu welu", + "nav-advanced-label": "Waya Pass", + "nav-basics-description": "Undastand di fundamentals of Ethereum", + "nav-basics-label": "Basiks", + "nav-bridges-description": "Web3 don dey evolve into ekosystem of primary L1 blokchains andi L2 solushons wey dey skale", + "nav-builders-home-description": "One buildas manual wey dey for Ethereum—by pipo wey dey build, for pipo wey dey build", + "nav-builders-home-label": "Buildas home", + "nav-contribute-description": "If yu wont helep, dis go guide yu", + "nav-contribute-label": "To dey kontribute to ethereum.org", + "nav-dao-description": "Komunitis wey memba own witout authority wey dem sentralize", + "nav-dapps-description": "Eksplor one rish ekosystem of apps wey dey yus Ethereum", + "nav-defi-description": "One global, open altanative wey dey di tradishonal finanshia market", + "nav-desci-description": "One global, open altanative wey dey di kurent sayentifik system", + "nav-desoc-description": "Platfoms wey base on blokchain for soshia interakshon and kontent kreashon", "nav-developers-docs": "Diveloas docs", + "nav-developers": "Divelopas", + "nav-did-description": "Isshiu make yu get your own unik desentralized identifiers", + "nav-docs-description": "Docs to helep yu ondastand andi build wit Ethereum", + "nav-docs-design-description": "Desikripshon of unik web3 disign shalengis, ogbonge praktis andi user researsh insights", + "nav-docs-design-label": "UX/UI disign fundamentals", + "nav-docs-foundation-description": "Core fundamental wey go divelop on Ethereum", + "nav-docs-overview-description": "Yor home for divelopa docs", + "nav-docs-stack-description": "Ondastand all di details wey dey for di Ethereum stack", + "nav-eip-description": "Standards wey spesify new fitures abi processes", + "nav-eip-label": "Ethereum improvement proposal (EIPs)", + "nav-emerging-description": "Mak yu sabi oda case for Ethereum wey new pass", + "nav-enterprise-description": "Biznes aplikashons wey dey for Ethereum", + "nav-ethereum-org-description": "Dis website na wetin komunity dey drive—make yu join us andi kontribute too", + "nav-ethereum-wallets-description": "App wey yu fit yus interat wit yor Ethereum akant", + "nav-events-description": "Disentralizashon and fridom to artisipate for anybodi", + "nav-events-irl-description": "Efri month major Ethereum events dey for in-pesin andi online", + "nav-events-label": "Komunitis andi events", + "nav-events-online-description": "Plenti pipol wey bi Ethereum supporta papa for dis online komunitis", + "nav-find-wallet-description": "Wallets dey alow yu to yus krypto", + "nav-find-wallet-label": "Mak yu shuse yor wallet", + "nav-gas-fees-description": "Hau dem dey kalkulate ETH transakshon fees", + "nav-gas-fees-label": "Gas fee", + "nav-get-eth-description": "Yu go nid ether (ETH) to yus Ethereum aplikashons", + "nav-get-started-description": "Yor first steps to sabi yus Ethereum", + "nav-governance-description": "Di process wey dey involve to dey upgrade di Ethereum protokol", + "nav-governance-label": "Governance", + "nav-grants-description": "List wey wi kurate by awa komunity for projets wey provide grant wey dey fund programs", + "nav-guide-create-account-description": "Anybodi fit kreate one Ethereum akant at any taim, for fri wit one wallet app", + "nav-guide-revoke-access-description": "Mak yu stay safe wen yu dey rilate wit smat kontrats and aplikashons for di Ethereum ekosystem", + "nav-guide-revoke-access-label": "Hau yu go sabi rivoke smat kontrat access", + "nav-guide-use-wallet-description": "Mak yu sabi hau to operate all di basik funkshons of one wallet", + "nav-guide-use-wallet-label": "Hau to yus wallet", + "nav-guides-description": "Pratika step-by-step dey guide to helep yu stat", + "nav-guides-label": "Hau-to-sabi guides", + "nav-history-description": "One timeline for all di major forks and updates", + "nav-history-label": "Teknikal histori ofi Ethereum", + "nav-layer-2-description": "Sheapa andi fasta transakshon for Ethereum", + "nav-learn-by-coding-description": "Tools wey fit helep yu eksperiment wit Ethereum", + "nav-local-env-description": "Shuse andi set up yor Ethereum divelopment stak", + "nav-mainnet-description": "Wi sabi fit build enterprise blokchain aplikashons on di publik Ethereum Mainnet", + "nav-nft-description": "Na one way to reprisent anytin wey dey unik as Ethereum-based asset", + "nav-open-research-description": "One of di primary pawa of Ethereum na im aktive risearsh komunity", + "nav-open-research-label": "Open risearsh", + "nav-overview-description": "All tins wey consign Ethereum edukashon", + "nav-participate-overview-description": "Ovaview on hau yu go fit patisipate", "nav-primary": "Primary", + "nav-quizzes-description": "Mak yu find out hau welu yu ondastand Ethereum and kryptokurensis", + "nav-quizzes-label": "Make yu test yor knowlege", + "nav-refi-description": "One alternative ekonomik system wey dem build on regenerative prinsipol", + "nav-research-description": "Processes wey dem yus to impruf Ethereum", + "nav-research-label": "Risearsh andi divelopment", + "nav-roadmap-description": "Di path wey folow to more skalability, sekurity andi sustainability for Ethereum", + "nav-roadmap-future-description": "Make Ethereum gidigba as one bigi andi disentralize netwok", + "nav-roadmap-future-label": "Fushure-prufin", + "nav-roadmap-label": "Roadmap", + "nav-roadmap-scaling-description": "Netwok updates to kontinu dey ridus trasakshon cost and speed", + "nav-roadmap-security-description": "To dey make sure Ethereum stand gidigba to all kain attaks into di fushure", + "nav-roadmap-security-label": "Sikurity wey don impruf", + "nav-roadmap-ux-description": "To dey yus Ethereum nid to dey simpol", + "nav-run-a-node-description": "Mak yu dey fully sovereign as yu dey helep sikure di netwok", + "nav-security-description": "Learn di ogbonge praktis wen yu dey yus kryptokurensis", + "nav-smart-contracts-description": "Di fundamental buildin bloks ofi Ethereum ekosystem", + "nav-stablecoins-description": "Stabolcoins na Ethereum tokens wey dem disign to stay for value wey nor dey shanj", + "nav-stake-description": "Mak yu earn riwods for yu to sikure Ethereum", + "nav-stake-label": "Stake", + "nav-staking-home-description": "One ovaview of difrent opshon for stakin", + "nav-staking-pool-description": "Stake andi earn riwods wit any amount of ETH by to join wit odas", + "nav-staking-pool-label": "Pooled stakin", + "nav-staking-saas-label": "To dey stake wit one sarvis", + "nav-staking-solo-label": "Solo Stakin", + "nav-start-building-description": "Informashon wey dey yusful for otondo", + "nav-translation-program-description": "One joint effoti to make sure dem translate ethereum.org to all di languages", + "nav-tutorials-description": "List wey dem kurate for komunity tutorials", + "nav-use-cases-description": "Diskova difrent idias wey dem fit use Ethereum for", + "nav-what-is-ether-description": "Di kurrensy wey dem dey use for Ethereum apps", + "nav-what-is-ethereum-description": "Mak yu ondastand wetin make Ethereum dey speshia", + "nav-what-is-web3-label": "Wetin bi web3?", + "nav-what-is-web3-description": "One alternativ to sentranliz monopoliz to dey diktate di rules", + "nav-whitepaper-description": "Di orijina Ethereum whitepaper wey Vitalik Buterin write for 2014", + "nav-zkp-description": "One way yu fit yus pruf di validity of one statement witout make yu show di statement imsef", "nft-page": "NFTs - Non-fungibol tokens", "nfts": "NFTs", "no": "No", @@ -140,6 +244,7 @@ "page-developers-aria-label": "Divelopas' Menu", "page-index-meta-title": "Haus", "page-last-updated": "Last taim wey dem update dis page", + "participate-menu": "Patisipate menu", "pbs": "Proposa-builda seperashon", "pools": "Pooled stakin", "privacy-policy": "Privacy policy", @@ -150,6 +255,8 @@ "refresh": "Abeg rifresh dis page.", "return-home": "Make yu riturn haus", "roadmap": "Ethereum roadmap", + "research": "Risearsh", + "research-menu": "Risearsh menu", "resources": "Translashon risorsis", "regenerative-finance": "ReFi - Regenerative finans", "run-a-node": "Run node", @@ -164,23 +271,23 @@ "search-box-blank-state-text": "Searsh away!", "search-eth-address": "E be like ethereum address. Wi nor dey provide info to address. Try to dey find am on top blok explorer like", "search-no-results": "Nor rizut for wetin you dey find", + "security": "Security", "single-slot-finality": "Singol slot finality", "statelessness": "Statelessnes", "see-contributors": "Si kontributors", - "set-up-local-env": "Set up your local level", + "set-up-local-env": "Set up yor local level", "sharding": "Sharding", "show-all": "Show mi evrytin", "show-less": "Show mi smoll", "site-description": "Ethereum na one global, disentrlize platfom for money and new kain aplikashon. For Ethereum, yu fit write kode wey det kontrol money, and dey build aplikashon wey yu fir yus anywia in di world.", - "site-title": "ethereum.org", "skip-to-main-content": "Skip go main kontent", "smart-contracts": "Smart contracts", - "stablecoins": "Stablecoins", + "stablecoins": "Stabolcoins", "stake-eth": "Stake ETH", "staking": "To dey stake", "start-here": "Make yu stat here", - "style-guide": "Style guide", "solo": "Solo Stakin", + "support": "Support", "terms-of-use": "Terms of yus", "translation-banner-body-new": "Yu dey look dis page in English bikos wi neva tranlate am. Helep us translate dis kontent.", "translation-banner-body-update": "Dis na di new vashon of di page but im dey only English for nau. Helep us translate di latest vashon.", @@ -191,11 +298,14 @@ "translation-banner-no-bugs-title": "No bugs for here!", "translation-banner-no-bugs-content": "Wi nor dey translate dis page as wi leave am for english by pupose.", "translation-banner-no-bugs-dont-show-again": "Nor show am again", + "translation-program": "Translashon program", "try-using-search": "Try to dey yus di searsh take find wetin yu dey find", "tutorials": "Tutorials", "up": "Up", - "use-ethereum": "Yus Ethereum", + "use": "Yus", + "use-ethereum": "Yus Ethreum", "use-ethereum-menu": "Yus ethereum menu", + "use-menu": "Yus menu", "user-experience": "User experience", "verkle-trees": "Verkle trees", "wallets": "Wallets", @@ -203,8 +313,8 @@ "web3": "Wetin bi web3?", "web3-title": "Web3", "website-last-updated": "Website last update", - "what-is-ether": "Wetin be ether (ETH)?", - "what-is-ethereum": "What is Ethereum?", + "what-is-ether": "Wetin bi ether (ETH)?", + "what-is-ethereum": "Wetin bi Ethereum?", "withdrawals": "To dey stake witdrawals", "yes": "Yes", "zero-knowledge-proofs": "Zero-knowledge prufs" diff --git a/src/intl/pt-br/common.json b/src/intl/pt-br/common.json index fc79dee685b..09d80ef87ff 100644 --- a/src/intl/pt-br/common.json +++ b/src/intl/pt-br/common.json @@ -1,5 +1,5 @@ { - "about-ethereum-org": "Sobre ethereum.org", + "about-ethereum-org": "Sobre o ethereum.org ", "about-us": "Quem somos", "adding-desci-projects": "Adicionar projetos DeSci", "adding-developer-tools": "Adicionando ferramentas de desenvolvedor", @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Alternar botão de menu", "beacon-chain": "Beacon Chain", "bridges": "Pontes de “Blockchains”", + "bug-bounty": "Recompensa por bugs", + "build": "Criar", + "build-menu": "Menu Criar", "clear": "Limpar", "close": "Fechar", "community": "Comunidade", @@ -38,6 +41,7 @@ "decentralized-identity": "Identidade descentralizada", "decentralized-social-networks": "Redes sociais descentralizadas", "decentralized-science": "DeSci - Ciência descentralizada", + "description": "Descrição do item de navegação", "defi-page": "DeFi - Finanças descentralizadas", "design": "Visual", "design-principles": "Princípios do design", @@ -64,7 +68,7 @@ "documentation": "Documentação", "down": "Abaixo", "ecosystem": "Ecossistema", - "edit-page": "Editar Página", + "edit-page": "Editar página", "ef-blog": "Blog da Fundação Ethereum", "eips": "Propostas de melhorias no Ethereum", "energy-consumption": "Consumo energético do Ethereum", @@ -76,7 +80,7 @@ "ethereum-bug-bounty": "Plano de recompensas à caça a erros de programação", "consensus-when-shipping": "Quando estará disponível?", "ethereum-upgrades": "Melhorias no Ethereum", - "ethereum-brand-assets": "Ativos da marca Ethereum", + "ethereum-brand-assets": "Ativos de marca Ethereum", "ethereum-online": "Comunidades on-line", "ethereum-events": "Eventos Ethereum", "ethereum-foundation": "Fundação Ethereum", @@ -84,7 +88,7 @@ "ethereum-glossary": "Glossário de Ethereum", "ethereum-governance": "Governança da Ethereum", "ethereum-logo": "Logotipo da Ethereum", - "ethereum-roadmap": "Roteiro Ethereum", + "ethereum-roadmap": "Planejamento Ethereum", "ethereum-protocol": "Protocolo Ethereum", "ethereum-security": "Segurança e prevenção de fraude da Ethereum", "ethereum-support": "Suporte do Ethereum", @@ -96,18 +100,18 @@ "feedback-card-prompt-tutorial": "Este tutorial foi útil?", "feedback-widget-thank-you-title": "Agradecemos o seu feedback!", "feedback-widget-thank-you-subtitle": "Torne esta página ainda melhor respondendo a estas perguntas.", - "feedback-widget-thank-you-subtitle-ext": "Se precisar de ajuda, entre em contato com a comunidade em nosso Discord.", + "feedback-widget-thank-you-subtitle-ext": "Se precisar de ajuda, você pode entrar em contato com a comunidade em nosso Discord.", "feedback-widget-thank-you-timing": "2 – 3 minutos", "feedback-widget-thank-you-cta": "Abrir pesquisa rápida", "find-wallet": "Buscar carteira", "future-proofing": "À prova de futuro", - "get-eth": "Compre ETH", + "get-eth": "Obtenha ETH", "get-involved": "Participe", "get-started": "Introdução", "grants": "Recompensas", "grant-programs": "Programas de recompensas do ecossistema", "guides": "Guias", - "guides-hub": "How-to guides", + "guides-hub": "Guias práticos", "history-of-ethereum": "História do Ethereum", "home": "Início", "how-ethereum-works": "Como Ethereum funciona", @@ -143,9 +147,114 @@ "mainnet-ethereum": "Rede principal da Ethereum", "merge": "Integração", "more": "Mais", - "nav-developers": "Desenvolvedores", + "nav-about-description": "Um projeto público e de código aberto para a comunidade Ethereum", + "nav-advanced-description": "Fique por dentro dos tópicos mais complexos", + "nav-advanced-label": "Avançado", + "nav-basics-description": "Entenda os fundamentos do Ethereum", + "nav-basics-label": "Fundamentos", + "nav-bridges-description": "Web3 passou a ser um ecossistema de blockchains L1 primárias e soluções de escalabilidade L2", + "nav-builders-home-description": "Um manual para desenvolvedores de Ethereum: de desenvolvedores para desenvolvedores", + "nav-builders-home-label": "Página inicial para desenvolvedores", + "nav-contribute-description": "Use este material, caso queira ajudar", + "nav-contribute-label": "Contribua com ethereum.org", + "nav-dao-description": "Comunidades de membros sem liderança centralizada", + "nav-dapps-description": "Conheça o amplo ecossistema de apps que usam Ethereum", + "nav-defi-description": "Uma alternativa aberta e global ao mercado financeiro tradicional", + "nav-desci-description": "Uma alternativa global e aberta ao sistema científico atual", + "nav-desoc-description": "Plataformas baseadas em blockchain para interação social e criação de conteúdo", "nav-developers-docs": "Documentação para o desenvolvedor", + "nav-developers": "Desenvolvedores", + "nav-did-description": "Emita e seja o proprietário de seus identificadores descentralizados exclusivos", + "nav-docs-description": "Documentos que o ajudam a entender e criar com Ethereum", + "nav-docs-design-description": "Descrição dos desafios de design únicos do Web3, práticas recomendadas e informações de pesquisa para o usuário", + "nav-docs-design-label": "Fundamentos de design de UX/UI", + "nav-docs-foundation-description": "Principais fundamentos para desenvolver usando Ethereum", + "nav-docs-foundation-label": "Tópicos fundamentais", + "nav-docs-overview-description": "Seu repositório de documentos para o desenvolvedor", + "nav-docs-stack-description": "Entenda todos os detalhes da pilha do Ethereum", + "nav-docs-stack-label": "Pilha de Ethereum", + "nav-eip-description": "Padrões que especificam novos recursos ou processos", + "nav-eip-label": "Propostas de melhorias do Ethereum (EIPs)", + "nav-emerging-description": "Conheça outros casos de uso mais recentes do Ethereum", + "nav-emerging-label": "Casos de uso emergentes", + "nav-enterprise-description": "Aplicações de negócios para o Ethereum", + "nav-ethereum-org-description": "Este website é dedicado à comunidade: participe e contribua", + "nav-ethereum-wallets-description": "Um app para interagir com sua conta Ethereum", + "nav-events-description": "Descentralização e liberdade para participar", + "nav-events-irl-description": "Há eventos importantes, presenciais e online, sobre o Ethereum todos os meses", + "nav-events-label": "Comunidades e eventos", + "nav-events-online-description": "Milhares de entusiastas do Ethereum nestas comunidades online", + "nav-find-wallet-description": "As carteiras permitem que você use criptomoedas", + "nav-find-wallet-label": "Escolha sua carteira", + "nav-gas-fees-description": "Como as taxas de transação de ETH são calculadas", + "nav-gas-fees-label": "Taxas de gás", + "nav-get-eth-description": "Você precisa de ethers (ETH) para usar aplicações Ethereum", + "nav-get-started-description": "Sua porta de entrada para usar Ethereum", + "nav-governance-description": "O processo o upgrade do protocolo Ethereum", + "nav-governance-label": "Governança", + "nav-grants-description": "Uma lista selecionada por nossa comunidade sobre projetos que oferecem programas de financiamento", + "nav-guide-create-account-description": "Com uma carteira digital, qualquer pessoa pode criar uma conta Ethereum de forma gratuita e a qualquer momento", + "nav-guide-create-account-label": "Como criar uma conta Ethereum", + "nav-guide-revoke-access-description": "Proteja-se ao interagir com contratos inteligentes e aplicações no ecossistema Ethereum", + "nav-guide-revoke-access-label": "Como revogar o acesso a contratos inteligentes", + "nav-guide-use-wallet-description": "Aprenda como operar todas as funções básicas de uma carteira", + "nav-guide-use-wallet-label": "Como usar uma carteira", + "nav-guides-description": "Guias detalhados e práticos para ajudá-lo a começar", + "nav-guides-label": "Guias explicativos", + "nav-history-description": "Uma linha do tempo de todos os forks e atualizações mais importantes", + "nav-history-label": "História técnica do Ethereum", + "nav-layer-2-description": "Transações mais rápidas e econômicas para Ethereum", + "nav-learn-by-coding-description": "Ferramentas que o ajudam a usar Ethereum", + "nav-local-env-description": "Escolha e configure sua pilha de desenvolvimento Ethereum", + "nav-mainnet-description": "É possível criar aplicações blockchain empresariais na rede principal pública do Ethereum", + "nav-nft-description": "Uma forma de representar qualquer coisa única como um ativo baseado no Ethereum", + "nav-open-research-description": "Um dos pontos fortes do Ethereum é sua comunidade ativa de pesquisa", + "nav-open-research-label": "Pesquisa aberta", + "nav-overview-description": "Tudo sobre o Ethereum: informações", + "nav-overview-label": "Visão geral", + "nav-participate-overview-description": "Descrição geral de como participar", "nav-primary": "Principal", + "nav-private-description": "Recursos de desenvolvedor Ethereum para empresas privadas", + "nav-quizzes-description": "Comprove seus conhecimentos sobre Ethereum e criptomoedas", + "nav-quizzes-label": "Teste seus conhecimentos", + "nav-refi-description": "Um sistema econômico alternativo criado com vase em princípios regenerativos", + "nav-research-description": "Processos usados para melhorar o Ethereum", + "nav-research-label": "Pesquisa e desenvolvimento", + "nav-roadmap-description": "O caminho para mais escalabilidade, segurança e sustentabilidade no Ethereum", + "nav-roadmap-future-description": "Fortalecimento do Ethereum como uma rede robusta e descentralizada", + "nav-roadmap-future-label": "À prova de futuro", + "nav-roadmap-label": "Planejamento", + "nav-roadmap-scaling-description": "Atualizações de rede para reduzir ainda mais os custos e aumentar a rapidez das transações", + "nav-roadmap-scaling-label": "Transações mais baratas", + "nav-roadmap-security-description": "Como garantir a resiliência do Ethereum face a todos os tipos de ataques no futuro", + "nav-roadmap-security-label": "Segurança reforçada", + "nav-roadmap-ux-description": "O uso do Ethereum precisa ser mais simples", + "nav-roadmap-ux-label": "Melhor experiência do usuário", + "nav-run-a-node-description": "Torne-se totalmente soberano enquanto ajuda a proteger a rede", + "nav-security-description": "Aprenda as práticas recomendadas ao usar criptomoedas", + "nav-smart-contracts-description": "Os elementos básicos do ecossistema Ethereum", + "nav-stablecoins-description": "Stablecoins são tokens Ethereum criadas para que se mantenham em um valor estável", + "nav-stake-description": "Ganhe recompensas para proteger o Ethereum", + "nav-stake-label": "Participe", + "nav-staking-home-description": "Uma descrição geral das diferentes opções de participação", + "nav-staking-home-label": "Staking de casa", + "nav-staking-pool-description": "Participe com outros e ganhe recompensas com qualquer quantidade de ETH", + "nav-staking-pool-label": "Staking em pool (combinado)", + "nav-staking-saas-description": "Operadores de nó terceirizados lidam com a operação de seu cliente validador", + "nav-staking-saas-label": "Participação com um serviço", + "nav-staking-solo-description": "Execute o hardware local e adicione pessoalmente à segurança e descentralização da rede Ethereum", + "nav-staking-solo-label": "Participação individual", + "nav-start-building-description": "Informações úteis para principiantes", + "nav-translation-program-description": "Um esforço colaborativo para traduzir o site ethereum.org para todos os idiomas", + "nav-tutorials-description": "Lista selecionada de tutoriais da comunidade", + "nav-use-cases-description": "Descubra como usar o Ethereum de diferentes formas", + "nav-use-cases-label": "Casos de uso", + "nav-what-is-ether-description": "A moeda dos aplicativos Ethereum", + "nav-what-is-ethereum-description": "Entenda o que torna o Ethereum especial", + "nav-what-is-web3-label": "O que é Web3?", + "nav-what-is-web3-description": "Uma alternativa aos monopólios centralizados que ditam as regras", + "nav-whitepaper-description": "A proposta original do Ethereum, escrita por Vitalik Buterin em 2014", + "nav-zkp-description": "Uma forma de provar a validade de uma afirmação sem a revelar", "nft-page": "NFTs - Tokens não fungíveis", "nfts": "NFTs (Tokens Não Fungíveis)", "no": "Não", @@ -154,6 +263,8 @@ "page-developers-aria-label": "Menu dos Desenvolvedores", "page-index-meta-title": "Início", "page-last-updated": "Última atualização da página", + "participate": "Participar", + "participate-menu": "Menu Participe", "pbs": "Separação de Proponente-Construtor", "pools": "Staking em pool (combinado)", "privacy-policy": "Política de privacidade", @@ -164,13 +275,15 @@ "refresh": "Atualize a página.", "return-home": "Voltar ao início", "roadmap": "Planejamento Ethereum", + "research": "Pesquisa", + "research-menu": "Menu Pesquisa", "resources": "Recursos de tradução", "regenerative-finance": "ReFi - Finanças regenerativas", "run-a-node": "Executar um nó", - "rollup-component-website": "Site", + "rollup-component-website": "Website", "rollup-component-developer-docs": "Documentação para o desenvolvedor", "rollup-component-technology-and-risk-summary": "Resumo da tecnologia e riscos", - "scaling": "Escalabilidade", + "scaling": "Dimensionamento", "saas": "Participação como serviço", "search": "Pesquisar", "search-ethereum-org": "Buscar no ethereum.org", @@ -211,9 +324,11 @@ "try-using-search": "Tente usar a pesquisa para encontrar o que está procurando ou", "tutorials": "Tutoriais", "up": "Acima", + "use": "Uso", "use-ethereum": "Usar Ethereum", "use-ethereum-menu": "Menu Usar Ethereum", - "user-experience": "Experiência do Usuário", + "use-menu": "Menu Uso", + "user-experience": "Experiência do usuário", "verkle-trees": "Árvores de Verkle", "wallets": "Carteiras", "we-couldnt-find-that-page": "Não foi possível encontrar essa página", @@ -221,7 +336,7 @@ "web3-title": "Web3", "website-last-updated": "Última atualização do site", "what-is-ether": "O que é ether (ETH)?", - "what-is-ethereum": "O que é Ethereum?", + "what-is-ethereum": "O que é o Ethereum?", "withdrawals": "Saque de staking", "yes": "Sim", "zero-knowledge-proofs": "Prova de conhecimento zero" diff --git a/src/intl/pt/common.json b/src/intl/pt/common.json index 4f80ec5d733..5d9a9096b6e 100644 --- a/src/intl/pt/common.json +++ b/src/intl/pt/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Abstração da conta", "about-ethereum-org": "Acerca do ethereum.org", "about-us": "Quem somos", + "adding-desci-projects": "Adicionar projetos Desci", + "adding-developer-tools": "Adicionar ferramentas de programador", + "adding-exchanges": "Adicionar câmbios", + "adding-glossary-terms": "Adicionar termos do glossário", + "adding-staking-products": "Adicionar produtos de implantação", + "adding-wallets": "Adicionar carteiras", + "account-abstraction": "Abstração da conta", + "acknowledgements": "Reconhecimentos", "aria-toggle-search-button": "Alternar botão de pesquisa", "aria-toggle-menu-button": "Botão menu alternativo", "beacon-chain": "Cadeia sinalizadora", "bridges": "Pontes de Blockchain", + "bug-bounty": "Recompensa por bugs", + "build": "Construir", + "build-menu": "Menu de construção", "clear": "Limpar", "close": "Fechar", "community": "Comunidade", "community-hub": "Centro de Comunidade", "community-menu": "Menu de comunidade", "contact": "Contacto", + "content-buckets": "Buckets de conteúdo", + "content-resources": "Recursos de conteúdo", "content-standardization": "Normalização de conteúdos", "contributing": "Contribuir", "contributors": "Contribuidores", @@ -27,7 +39,9 @@ "decentralized-identity": "Identidade descentralizada", "decentralized-social-networks": "Redes sociais descentralizadas", "decentralized-science": "DeSci - Ciência Descentralizada", + "description": "Descrição do item de navegação", "defi-page": "DeFi - Finanças descentralizadas", + "design-principles": "Princípios do design", "devcon": "Devcon", "developers": "Programadores", "developers-home": "Menu para Programadores", @@ -63,7 +77,7 @@ "ethereum-bug-bounty": "Programa de recompensas de bug de Ethereum", "consensus-when-shipping": "Quando é que é enviado?", "ethereum-upgrades": "Atualizações do Ethereum", - "ethereum-brand-assets": "Ativos da Marca Ethereum", + "ethereum-brand-assets": "Recursos de marca Ethereum", "ethereum-online": "Comunidades online", "ethereum-events": "Eventos Ethereum", "ethereum-foundation": "Fundação Ethereum", @@ -86,19 +100,19 @@ "feedback-widget-thank-you-subtitle-ext": "Se precisar de ajuda, pode entrar em contacto com a comunidade no nosso Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Abrir um inquérito rápido", - "find-wallet": "Procurar carteira", + "find-wallet": "Encontrar carteira", "future-proofing": "À prova de futuro", - "get-eth": "Obtenha o ETH", + "get-eth": "Obter ETH", "get-involved": "Envolva-se", - "get-started": "Começar", + "get-started": "Introdução", "grants": "Permissões", "grant-programs": "Programas de concessão do ecossistema", "guides": "Guias", - "guides-hub": "Central de guias", + "guides-hub": "Tutoriais", "history-of-ethereum": "A história do Ethereum", "home": "Início", "how-ethereum-works": "Como funciona o Ethereum", - "how-to-register-an-ethereum-account": "Como \"registar\" uma conta Ethereum", + "how-to-create-an-ethereum-account": "Como \"registar\" uma conta Ethereum", "how-to-revoke-token-access": "Como revogar o acesso de contratos inteligentes aos seus fundos digitais", "how-to-swap-tokens": "Como trocar tokens", "how-to-use-a-bridge": "Como conectar tokens à camada 2", @@ -115,7 +129,7 @@ "last-edit": "Última edição", "layer-2": "Camada 2", "learn": "Aprender", - "learn-by-coding": "Aprenda usando programação", + "learn-by-coding": "Aprenda programando", "learn-hub": "Centro de Aprendizagem", "learn-menu": "Menu aprender", "learn-more": "Saber mais", @@ -128,10 +142,108 @@ "loading-error-try-again-later": "Não foi possível carregar os dados. Tente novamente mais tarde.", "logo": "logótipo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Fusão", "more": "Mais", - "nav-developers": "Programadores", + "nav-about-description": "Um projeto público e open-source para a comunidade Ethereum", + "nav-advanced-description": "Aprenda os tópicos mais complexos", + "nav-advanced-label": "Avançado", + "nav-basics-description": "Compreenda os princípios básicos do Ethereum", + "nav-basics-label": "Informações básicas", + "nav-bridges-description": "A Web3 evoluiu para um ecossistema de blockchains L1 primárias e soluções de dimensionamento L2", + "nav-builders-home-description": "Um manual para construtores Ethereum—de construtores para construtores", + "nav-builders-home-label": "Página inicial do construtor", + "nav-contribute-description": "Se quiser ajudar, isto irá guiá-lo", + "nav-contribute-label": "Contribuir para ethereum.org", + "nav-dao-description": "Comunidades pertencentes aos membros, sem autoridade centralizada", + "nav-dapps-description": "Explore um rico ecossistema de aplicações que utilizam Ethereum", + "nav-defi-description": "Uma alternativa global e aberta ao mercado financeiro tradicional", + "nav-desci-description": "Uma alternativa global e aberta ao atual sistema científico", + "nav-desoc-description": "Plataformas baseadas em blockchain para interação social e criação de conteúdos", "nav-developers-docs": "Documentos de programadores", + "nav-developers": "Programadores", + "nav-did-description": "Emita e possua os seus identificadores descentralizados únicos", + "nav-docs-description": "Documentos para o ajudar a compreender e a construir com o Ethereum", + "nav-docs-design-description": "Descrição de desafios únicos de design web3, melhores práticas e conhecimentos de pesquisas de utilizadores", + "nav-docs-design-label": "Princípios básicos de design UX/UI", + "nav-docs-foundation-description": "Fundamentos básicos para desenvolver em Ethereum", + "nav-docs-foundation-label": "Tópicos fundamentais", + "nav-docs-overview-description": "O seu lar para documentos de programador", + "nav-docs-stack-description": "Compreenda todos os detalhes da pilha de Ethereum", + "nav-docs-stack-label": "Pilha de Ethereum", + "nav-eip-description": "Padrões que especificam novos recursos ou processos", + "nav-eip-label": "Propostas de Melhoramentos do Ethereum (EIPs)", + "nav-emerging-description": "Conheça outros casos de utilização mais recentes para o Ethereum", + "nav-enterprise-description": "Aplicações comerciais para o Ethereum", + "nav-ethereum-org-description": "Este website é orientado para a comunidade - junte-se a nós e contribua também", + "nav-ethereum-wallets-description": "Uma aplicação para interagir com a sua conta Ethereum", + "nav-events-description": "Descentralização e liberdade de participação para todos", + "nav-events-irl-description": "Todos os meses há grandes eventos Ethereum presenciais e online", + "nav-events-label": "Comunidades e eventos", + "nav-events-online-description": "Centenas de milhares de entusiastas do Ethereum participam nestas comunidades online", + "nav-find-wallet-description": "As carteiras permitem-lhe utilizar criptomoedas", + "nav-find-wallet-label": "Escolha a sua carteira", + "nav-gas-fees-description": "Como são calculadas as taxas de transação de ETH", + "nav-gas-fees-label": "Taxas de gas", + "nav-get-eth-description": "Precisa de ether (ETH) para utilizar as aplicações Ethereum", + "nav-get-started-description": "Os seus primeiros passos para utilizar o Ethereum", + "nav-governance-description": "O processo envolvido na atualização do protocolo Ethereum", + "nav-governance-label": "Governação", + "nav-grants-description": "Uma lista selecionada pela nossa comunidade sobre projetos que fornecem programas de financiamento de subsídios", + "nav-guide-create-account-description": "Qualquer pessoa pode criar uma conta Ethereum em qualquer altura, gratuitamente com uma aplicação de carteira", + "nav-guide-revoke-access-description": "Mantenha-se em segurança ao interagir com contratos inteligentes e aplicações no ecossistema Ethereum", + "nav-guide-revoke-access-label": "Como revogar o acesso a um contrato inteligente", + "nav-guide-use-wallet-description": "Aprenda a operar todas as funções básicas de uma carteira", + "nav-guide-use-wallet-label": "Como usar uma carteira", + "nav-guides-description": "Guias práticos passo-a-passo para o ajudar a começar", + "nav-guides-label": "Tutoriais", + "nav-history-description": "Uma cronologia de todos os principais forks e atualizações", + "nav-history-label": "História técnica do Ethereum", + "nav-layer-2-description": "Transações mais baratas e mais rápidas para o Ethereum", + "nav-learn-by-coding-description": "Ferramentas que o ajudam a experimentar com Ethereum", + "nav-local-env-description": "Escolher e configurar a sua pilha de desenvolvimento Ethereum", + "nav-mainnet-description": "As aplicações de blockchain empresariais podem ser construídas na rede pública Ethereum principal", + "nav-nft-description": "Uma forma de representar algo único como um ativo baseado na Ethereum", + "nav-open-research-description": "Um dos principais pontos fortes do Ethereum é a sua comunidade de investigação ativa", + "nav-open-research-label": "Pesquisa aberta", + "nav-overview-description": "Tudo sobre a formação Ethereum", + "nav-participate-overview-description": "Visão geral sobre como participar", "nav-primary": "Principal", + "nav-quizzes-description": "Descubra até que ponto compreende o Ethereum e as criptomoedas", + "nav-quizzes-label": "Teste os seus conhecimentos", + "nav-refi-description": "Um sistema económico alternativo baseado em princípios regenerativos", + "nav-research-description": "Processos utilizados para melhorar o Ethereum", + "nav-research-label": "Investigação e desenvolvimento", + "nav-roadmap-description": "O caminho para uma maior escalabilidade, segurança e sustentabilidade do Ethereum", + "nav-roadmap-future-description": "Solidificar o Ethereum como uma rede robusta e descentralizada", + "nav-roadmap-future-label": "À prova de futuro", + "nav-roadmap-label": "Roteiro", + "nav-roadmap-scaling-description": "Atualizações de rede para reduzir ainda mais os custos e a velocidade das transações", + "nav-roadmap-security-description": "Garantir a resiliência do Ethereum a todos os tipos de ataques no futuro", + "nav-roadmap-security-label": "Segurança melhorada", + "nav-roadmap-ux-description": "A utilização do Ethereum tem de ser simplificada", + "nav-run-a-node-description": "Torne-se totalmente independente enquanto ajuda a proteger a rede", + "nav-security-description": "Aprenda as melhores práticas ao utilizar criptomoedas", + "nav-smart-contracts-description": "Os blocos de construção fundamentais do ecossistema Ethereum", + "nav-stablecoins-description": "Stablecoins são tokens Ethereum concebidos para se manterem num valor fixo", + "nav-stake-description": "Ganhar recompensas por proteger o Ethereum", + "nav-stake-label": "Investir", + "nav-staking-home-description": "Uma visão geral das diferentes opções de implantação", + "nav-staking-pool-description": "Participe e ganhe recompensas com qualquer quantidade de ETH unindo-se a outros", + "nav-staking-pool-label": "Participação agrupada", + "nav-staking-saas-description": "Os operadores de nós de terceiros tratam do funcionamento do seu cliente validador", + "nav-staking-saas-label": "Staking com um serviço", + "nav-staking-solo-description": "Opere hardware doméstico e contribua pessoalmente para a segurança e descentralização da rede Ethereum", + "nav-staking-solo-label": "Participação individual", + "nav-start-building-description": "Informações úteis para os principiantes", + "nav-translation-program-description": "Um esforço de colaboração para traduzir o ethereum.org para todas as línguas", + "nav-tutorials-description": "Lista selecionada de tutoriais da comunidade", + "nav-use-cases-description": "Descubra ideias distintas para a utilização do Ethereum", + "nav-what-is-ether-description": "A moeda das aplicações na blockchain Ethereum", + "nav-what-is-ethereum-description": "Compreenda o que torna o Ethereum especial", + "nav-what-is-web3-label": "O que é Web3?", + "nav-what-is-web3-description": "Uma alternativa aos monopólios centralizados que ditam as regras", + "nav-whitepaper-description": "O documento técnico original do Ethereum escrito por Vitalik Buterin em 2014", + "nav-zkp-description": "Uma forma de provar a validade de uma afirmação sem revelar a própria afirmação", "nft-page": "NFTs - Tokens não fungíveis", "nfts": "NFT", "no": "Não", @@ -140,6 +252,8 @@ "page-developers-aria-label": "Menu para Programadores", "page-index-meta-title": "Início", "page-last-updated": "Última atualização da página", + "participate": "Participar", + "participate-menu": "Menu de participação", "pbs": "Separação proponente-construtor", "pools": "Participação agrupada", "privacy-policy": "Política de privacidade", @@ -150,10 +264,12 @@ "refresh": "Atualize a página.", "return-home": "voltar à página principal", "roadmap": "Roteiro Ethereum", + "research": "Pesquisa", + "research-menu": "Menu de pesquisa", "resources": "Recursos de tradução", "regenerative-finance": "ReFi - Finanças regenerativas", "run-a-node": "Executar um nó", - "rollup-component-website": "Website", + "rollup-component-website": "Sítio web", "rollup-component-developer-docs": "Documentos de programadores", "rollup-component-technology-and-risk-summary": "Tecnologia e resumo de riscos", "scaling": "Dimensionamento", @@ -164,6 +280,7 @@ "search-box-blank-state-text": "Procure!", "search-eth-address": "Isto parece um endereço Ethereum. Nós não fornecemos dados específicos para endereços. Tente procurá-lo num explorador de blocos como", "search-no-results": "Nenhum resultado para a sua pesquisa", + "security": "Segurança", "single-slot-finality": "Finalidade de slot único", "statelessness": "Apatridia", "see-contributors": "Ver colaboradores", @@ -179,8 +296,8 @@ "stake-eth": "Bloquear ETH", "staking": "Implantação", "start-here": "Comece aqui", - "style-guide": "Style guide", "solo": "Participação individual", + "support": "Apoio", "terms-of-use": "Termos de Utilização", "translation-banner-body-new": "Está a ver esta página em inglês porque ainda não a traduzimos. Ajude-nos a traduzir este conteúdo.", "translation-banner-body-update": "Existe uma nova versão desta página, mas por enquanto só existe em inglês. Ajude-nos a traduzir a versão mais recente.", @@ -191,19 +308,20 @@ "translation-banner-no-bugs-title": "Nenhum bug aqui!", "translation-banner-no-bugs-content": "Esta página não está a ser traduzida. Deixamos intencionalmente esta página em Inglês por enquanto.", "translation-banner-no-bugs-dont-show-again": "Não mostrar novamente", + "translation-program": "Programa de tradução", "try-using-search": "Tente utilizar a pesquisa para encontrar o que está à procura ou", "tutorials": "Tutoriais", "up": "Para cima", + "use": "Utilizar", "use-ethereum": "Usar o Ethereum", "use-ethereum-menu": "Usar o menu do Ethereum", - "user-experience": "User experience", + "use-menu": "Menu de uso", "verkle-trees": "Árvores Verkle", "wallets": "Carteiras", "we-couldnt-find-that-page": "Não conseguimos encontrar esta página", "web3": "O que é Web3?", - "web3-title": "Web3", "website-last-updated": "Última atualização do site", - "what-is-ether": "O que é o ether (ETH)?", + "what-is-ether": "O que é o Ether (ETH)?", "what-is-ethereum": "O que é o Ethereum?", "withdrawals": "Levantamentos de staking", "yes": "Sim", diff --git a/src/intl/ro/common.json b/src/intl/ro/common.json index af59e97f384..8b6846ce546 100644 --- a/src/intl/ro/common.json +++ b/src/intl/ro/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Abstractizarea contului", "about-ethereum-org": "Despre ethereum.org", "about-us": "Despre noi", + "adding-desci-projects": "Adăugarea proiectelor Desci", + "adding-developer-tools": "Adăugarea instrumentelor de dezvoltator", + "adding-exchanges": "Adăugarea schimburilor", + "adding-glossary-terms": "Adăugarea termenilor de glosar", + "adding-staking-products": "Adăugarea produselor de mizare", + "adding-wallets": "Adăugarea portofelelor", + "account-abstraction": "Abstractizarea contului", + "acknowledgements": "Mulțumiri", "aria-toggle-search-button": "Activează butonul de căutare", "aria-toggle-menu-button": "Activați butonul pentru meniu", "beacon-chain": "Lanțul Beacon", "bridges": "Punți Blockchain", + "bug-bounty": "Recompensă pentru depistarea disfuncționalităților", + "build": "Versiune", + "build-menu": "Meniu Versiune", "clear": "Eliminare", "close": "Închidere", "community": "Comunitatea", "community-hub": "Centrul comunitar", "community-menu": "Meniul pentru comunitate", "contact": "Contact", + "content-buckets": "Categorii de conținut", + "content-resources": "Resurse conținut", "content-standardization": "Standardizarea conținutului", "contributing": "Contribuire", "contributors": "Cine și-a adus contribuția", @@ -27,7 +39,10 @@ "decentralized-identity": "Identitate descentralizată", "decentralized-social-networks": "Rețele sociale descentralizate", "decentralized-science": "DeSci - Știința descentralizată", + "description": "Descriere articol nav", "defi-page": "DeFi - Finanțele descentralizate", + "design": "Design", + "design-principles": "Principii de concepție", "devcon": "Devcon", "developers": "Dezvoltatori", "developers-home": "Pagina de pornire pentru dezvoltatori", @@ -51,7 +66,7 @@ "documentation": "Documentație", "down": "Jos", "ecosystem": "Ecosistemul", - "edit-page": "Modificați pagina", + "edit-page": "Editare pagină", "ef-blog": "Blogul Fundației Ethereum", "eips": "Propuneri de îmbunătățire pentru Ethereum", "energy-consumption": "Energia consumată de Ethereum", @@ -63,7 +78,7 @@ "ethereum-bug-bounty": "Programul Ethereum de recompense pentru interceptarea disfuncționalităților", "consensus-when-shipping": "Când va fi lansat?", "ethereum-upgrades": "Actualizările Ethereum", - "ethereum-brand-assets": "Materialele de branding Ethereum", + "ethereum-brand-assets": "Materiale de branding Ethereum", "ethereum-online": "Comunitățile online", "ethereum-events": "Evenimentele Ethereum", "ethereum-foundation": "Fundația Ethereum", @@ -83,7 +98,7 @@ "feedback-card-prompt-tutorial": "A fost util acest tutorial?", "feedback-widget-thank-you-title": "Îți mulțumim pentru feedback!", "feedback-widget-thank-you-subtitle": "Îmbunătățește și mai mult această pagină răspunzând la câteva întrebări.", - "feedback-widget-thank-you-subtitle-ext": "Daca ai nevoie de ajutor, poți contacta comunitatea pe canalul nostru de Discord.", + "feedback-widget-thank-you-subtitle-ext": "Dacă ai nevoie de ajutor, poți contacta comunitatea de pe Discord.", "feedback-widget-thank-you-timing": "2-3 minute", "feedback-widget-thank-you-cta": "Deschide sondajul scurt", "find-wallet": "Găsiți portofelul", @@ -94,11 +109,10 @@ "grants": "Granturi", "grant-programs": "Programele de granturi ale ecosistemului", "guides": "Ghiduri", - "guides-hub": "Centru de ghiduri", + "guides-hub": "Tutoriale", "history-of-ethereum": "Istoricul Ethereum", "home": "Pagina de pornire", "how-ethereum-works": "Cum funcționează Ethereum", - "how-to-register-an-ethereum-account": "Cum se „înregistrează” un cont Ethereum", "how-to-revoke-token-access": "Cum se poate revoca accesul contractului inteligent la fondurile cripto", "how-to-swap-tokens": "Cum se schimbă tokenuri", "how-to-use-a-bridge": "Cum se face legătura între tokenuri și nivelul 2", @@ -115,7 +129,7 @@ "last-edit": "Ultima modificare", "layer-2": "Nivel 2", "learn": "Învață", - "learn-by-coding": "Învățați codificând", + "learn-by-coding": "Învațați scriind cod", "learn-hub": "Centru de învățare", "learn-menu": "Meniu de învățare", "learn-more": "Află mai multe", @@ -128,18 +142,117 @@ "loading-error-try-again-later": "Nu se pot încărca datele. Încearcă din nou mai târziu.", "logo": "logo", "mainnet-ethereum": "Rețeaua principală Ethereum", - "more": "Aflați mai multe", - "nav-developers": "Dezvoltatori", + "merge": "Fuziunea", + "more": "Mai mult", + "nav-about-description": "Un proiect public, open source pentru comunitatea Ethereum", + "nav-advanced-description": "Află mai multe despre subiecte mai complexe", + "nav-advanced-label": "Avansat", + "nav-basics-description": "Aprofundează noțiunile de bază ale Ethereum", + "nav-basics-label": "Noțiuni de bază", + "nav-bridges-description": "Web3 a evoluat într-un ecosistem de blockchainuri L1 principale și soluții de scalare L2", + "nav-builders-home-description": "Un manual pentru dezvoltatorii Ethereum, de la dezvoltatori, pentru dezvoltatori", + "nav-builders-home-label": "Pagina de pornire a dezvoltatorului", + "nav-contribute-description": "Aici vei găsi îndrumare dacă dorești să contribui", + "nav-contribute-label": "Contribuții la ethereum.org", + "nav-dao-description": "Comunități ale membrilor, fără autoritate centralizată", + "nav-dapps-description": "Explorează un ecosistem bogat de aplicații care folosesc Ethereum", + "nav-defi-description": "O alternativă globală, deschisă la piața financiară clasică", + "nav-desci-description": "O alternativă globală, deschisă la sistemul științific actual", + "nav-desoc-description": "Platforme bazate pe blockchain pentru interacțiune socială și creare de conținut", "nav-developers-docs": "Documente dezvoltator", + "nav-developers": "Dezvoltatori", + "nav-did-description": "Creezi și deții proprii identificatori unici, descentralizați", + "nav-docs-description": "Documente care te ajută să înțelegeți și să construiești cu Ethereum", + "nav-docs-design-description": "Descrierea provocărilor de design unice web3, practicile de urmat și punctele de vedere în materie de cercetare ale utilizatorilor", + "nav-docs-design-label": "Elemente de bază de design UX/UI", + "nav-docs-foundation-description": "Elemente fundamentale pentru dezvoltare în Ethereum", + "nav-docs-foundation-label": "Subiecte fundamentale", + "nav-docs-overview-description": "Punctul tău de plecare pentru documentele dezvoltatorilor", + "nav-docs-stack-description": "Aprofundează toate detaliile stivei Ethereum", + "nav-docs-stack-label": "Stiva Ethereum", + "nav-eip-description": "Standarde care specifică funcții și procese noi", + "nav-eip-label": "Propuneri de îmbunătățire pentru Ethereum (EIP-uri)", + "nav-emerging-description": "Află cazuri de utilizare noi pentru Ethereum", + "nav-enterprise-description": "Aplicații în afaceri pentru Ethereum", + "nav-ethereum-org-description": "Acest site este creat și gestionat de comunitate. Vino alături de noi și contribuie și tu", + "nav-ethereum-wallets-description": "O aplicație pentru interacțiuni cu contul tău Ethereum", + "nav-events-description": "Descentralizare și libertate de a participa pentru oricine", + "nav-events-irl-description": "În fiecare lună, sunt organizate evenimente majore Ethereum cu participare fizică și online", + "nav-events-label": "Comunități și evenimente", + "nav-events-online-description": "Sute de mii de pasionați de Ethereum se regăsesc în aceste comunități online", + "nav-find-wallet-description": "Portofelele îți permit să folosești cripto", + "nav-find-wallet-label": "Alege-ți portofelul", + "nav-gas-fees-description": "Calcularea comisioanelor de tranzacție ETH", + "nav-get-eth-description": "Ai nevoie de ether (ETH) pentru a folosi aplicațiile Ethereum", + "nav-get-started-description": "Primi pașii în folosirea Ethereum", + "nav-governance-description": "Procesul de upgrade al protocolului Ethereum", + "nav-governance-label": "Conducere", + "nav-grants-description": "O listă gestionată de comunitatea noastră pentru proiectele care oferă finanțare prin granturi programelor", + "nav-guide-create-account-description": "Orice poate crea un cont Ethereum în orice moment, gratuit, cu o aplicație portofel", + "nav-guide-revoke-access-description": "Fii atent când interacționezi cu aplicații și contracte inteligente în ecosistemul Ethereum", + "nav-guide-revoke-access-label": "Revocarea accesului la contracte inteligente", + "nav-guide-use-wallet-description": "Află cum poți folosi toate funcțiile de bază ale unui portofel", + "nav-guide-use-wallet-label": "Cum se utilizează un portofel", + "nav-guides-description": "Ghiduri practice, pas cu pas pentru a te ajuta să începi", + "nav-guides-label": "Folosirea ghidurilor", + "nav-history-description": "O cronologie a tuturor bifurcațiilor și update-urilor importante", + "nav-history-label": "Istoricul tehnic al Ethereum", + "nav-layer-2-description": "Tranzacții mai ieftine și mai rapide pentru Ethereum", + "nav-learn-by-coding-description": "Instrumente care te ajută să experimentezi cu Ethereum", + "nav-local-env-description": "Alege și configurează stiva de dezvoltare Ethereum", + "nav-mainnet-description": "Aplicațiile blockchain pentru companii pot fi create pe rețeaua principală publică Ethereum", + "nav-nft-description": "O modalitate de a reprezenta orice lucru unic ca activ bazat pe Ethereum", + "nav-open-research-description": "Unul prin principalele puncte forte ale Ethereum este comunitatea de cercetare activă", + "nav-open-research-label": "Deschidere cercetare", + "nav-overview-description": "Toate proiectele de educație Ethereum", + "nav-overview-label": "Prezentare generală", + "nav-participate-overview-description": "Prezentare a modalității de participare", "nav-primary": "Principal", + "nav-private-description": "Resurse destinate dezvoltatorilor din Ethereum-ul privat pentru întreprinderi", + "nav-quizzes-description": "Află cât de bine înțelegi Ethereum și criptomonedele", + "nav-quizzes-label": "Testează-ți cunoștințele", + "nav-refi-description": "O sistem economic alternativ bazat pe principii regenerative", + "nav-research-description": "Procesele folosite pentru a îmbunătăți Ethereum", + "nav-research-label": "Cercetare și dezvoltare", + "nav-roadmap-description": "Calea către scalabilitate, securitate și durabilitate superioare pentru Ethereum", + "nav-roadmap-future-description": "Consolidarea Ethereum ca o rețea robustă și descentralizată", + "nav-roadmap-future-label": "Dovadă viitoare", + "nav-roadmap-label": "Foaie de parcurs", + "nav-roadmap-scaling-description": "Actualizări de rețea pentru a reduce mai mult costurile și viteza tranzacțiilor", + "nav-roadmap-security-description": "Eforturi depuse pentru ca Ethereum să continue să reziste tuturor tipurilor de atacuri în viitor", + "nav-roadmap-security-label": "Securitate îmbunătățită", + "nav-roadmap-ux-description": "Utilizarea Ethereum trebuie simplificată", + "nav-run-a-node-description": "Ai control absolut în timp ce contribui la protejarea securității rețelei", + "nav-security-description": "Familiarizează-te cu cele mai bune practici când folosești criptomonede", + "nav-smart-contracts-description": "Elementele de bază ale dezvoltării ecosistemului Ethereum", + "nav-stablecoins-description": "Stablecoin-urile sunt tokenuri Ethereum concepute să rămână la o valoare fixă", + "nav-stake-description": "Câștigă recompense când protejezi Ethereum", + "nav-stake-label": "Miză", + "nav-staking-home-description": "O descriere generală a diferitelor opțiuni de mizare", + "nav-staking-pool-description": "Mizează și câștigă recompense cu orice cantitate de ETH alăturându-te celorlalți", + "nav-staking-pool-label": "Miză cumulată", + "nav-staking-saas-label": "Mizare cu un serviciu", + "nav-staking-solo-label": "Miză individuală", + "nav-start-building-description": "Informații utile pentru nou-veniți", + "nav-translation-program-description": "Un proiect de colaborare pentru a traduce ethereum.org în toate limbile", + "nav-tutorials-description": "Listă curatoriată cu tutoriale generate de comunitate", + "nav-use-cases-description": "Descoperă diferite idei pentru utilizarea Ethereum", + "nav-what-is-ether-description": "Moneda aplicațiilor Ethereum", + "nav-what-is-ethereum-description": "Aflați ce face ca Ethereum să fie special", + "nav-what-is-web3-label": "Ce este Web3?", + "nav-what-is-web3-description": "O alternativă la monopolurile centralizate care dictează regulile", + "nav-whitepaper-description": "Cartea albă originală Ethereum scrisă de Vitalik Buterin în 2014", + "nav-zkp-description": "O modalitate de a dovedi validitatea unei afirmații fără a expune afirmația", "nft-page": "NFT - Tokenuri nefungibile", "nfts": "NFT-uri", "no": "Nu", "on-this-page": "Pe această pagină", "open-research": "Deschidere cercetare", - "page-developers-aria-label": "Meniu pentru programatori", + "page-developers-aria-label": "Meniul pentru dezvoltatori", "page-index-meta-title": "Pagina de pornire", "page-last-updated": "Ultima actualizare a paginii", + "participate": "Participă", + "participate-menu": "Meniu Participare", "pbs": "Separare ofertant-constructor", "pools": "Miză cumulată", "privacy-policy": "Politică de confidențialitate", @@ -150,9 +263,10 @@ "refresh": "Actualizează pagina.", "return-home": "înapoi la pagina principală", "roadmap": "Parcurs Ethereum", + "research": "Cercetare", + "research-menu": "Meniu Cercetare", "resources": "Resurse de traducere", - "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Rulați un nod", + "run-a-node": "Rularea unui nod", "rollup-component-website": "Site web", "rollup-component-developer-docs": "Documente programator", "rollup-component-technology-and-risk-summary": "Tehnologie şi rezumat al riscurilor", @@ -164,23 +278,24 @@ "search-box-blank-state-text": "Începe căutarea!", "search-eth-address": "Pare o adresă Ethereum. Nu oferim date care corespund adreselor. Încearcă să le cauți într-un block explorer ca", "search-no-results": "Nu există rezultate pentru această căutare", + "security": "Securitatea", "single-slot-finality": "Finalitate cu un singur slot", "statelessness": "Delegare", "see-contributors": "Vezi cine a contribuit", - "set-up-local-env": "Configurați un mediu local", - "sharding": "Fragmentare", + "set-up-local-env": "Configurarea unui mediu local", + "sharding": "Fragmentarea", "show-all": "Afișează tot", "show-less": "Afișează mai puțin", "site-description": "Ethereum este o platformă mondială, descentralizată, care se ocupă de bani și noi tipuri de aplicații. Pe Ethereum se pot crea coduri pentru controlul banilor și se pot elabora aplicații accesibile oriunde în lume.", "site-title": "ethereum.org", "skip-to-main-content": "Salt la conținutul principal", "smart-contracts": "Contractele inteligente", - "stablecoins": "Stablecoin-uri", + "stablecoins": "Stablecoins", "stake-eth": "Mizați ETH", "staking": "Mizarea", "start-here": "Începe aici", - "style-guide": "Style guide", "solo": "Miză individuală", + "support": "Asistență", "terms-of-use": "Condiții de utilizare", "translation-banner-body-new": "Vizualizezi această pagină în limba engleză deoarece încă nu am tradus-o. Ajută-ne să traducem conținutul acestei pagini.", "translation-banner-body-update": "Există o nouă versiune a acestei pagini, dar este doar în limba engleză pentru moment. Ajută-ne să traducem versiunea cea mai recentă.", @@ -191,19 +306,21 @@ "translation-banner-no-bugs-title": "Nicio eroare aici!", "translation-banner-no-bugs-content": "Această pagină nu este tradusă. Am lăsat în mod intenționat această pagină în limba engleză deocamdată.", "translation-banner-no-bugs-dont-show-again": "Nu afișa din nou", + "translation-program": "Programul de traducere", "try-using-search": "Încearcă să ajustezi căutarea pentru a găsi ceea ce cauți", "tutorials": "Tutoriale", "up": "Sus", + "use": "Utilizare", "use-ethereum": "Utilizează Ethereum", "use-ethereum-menu": "Meniul Utilizează Ethereum", - "user-experience": "User experience", + "use-menu": "Meniu Utilizare", "verkle-trees": "Arbori Verkle", "wallets": "Portofele", "we-couldnt-find-that-page": "Nu am găsit pagina respectivă", "web3": "Ce este Web3?", "web3-title": "Web3", "website-last-updated": "Ultima actualizare a site-ului", - "what-is-ether": "Ce este ether-ul (ETH)?", + "what-is-ether": "Ce este ether (ETH)?", "what-is-ethereum": "Ce este Ethereum?", "withdrawals": "Retrageri la mizare", "yes": "Da", diff --git a/src/intl/ru/common.json b/src/intl/ru/common.json index 0cae901adc0..bce708f1c90 100644 --- a/src/intl/ru/common.json +++ b/src/intl/ru/common.json @@ -5,7 +5,6 @@ "adding-developer-tools": "Добавление инструментов для разработчиков", "adding-exchanges": "Добавление бирж", "adding-glossary-terms": "Добавление терминов в глоссарий", - "adding-layer-2s": "Adding Layer 2s", "adding-products": "Добавление продуктов", "adding-staking-products": "Добавление продуктов, использующих стейкинг", "adding-wallets": "Добавление кошельков", @@ -15,6 +14,9 @@ "aria-toggle-menu-button": "Переключение кнопки меню", "beacon-chain": "Beacon Chain", "bridges": "Мосты блокчейна", + "bug-bounty": "Вознаграждения за найденные ошибки", + "build": "Сборка", + "build-menu": "Меню сборки", "clear": "Очистить", "close": "Закрыть", "community": "Сообщество", @@ -38,6 +40,7 @@ "decentralized-identity": "Децентрализованная идентификация", "decentralized-social-networks": "Децентрализованные социальные сети", "decentralized-science": "DeSci - Децентрализованная наука", + "description": "Описание элемента навигации", "defi-page": "DeFi - Децентрализованные финансы", "design": "Дизайн", "design-principles": "Принципы дизайна", @@ -76,7 +79,7 @@ "ethereum-bug-bounty": "Программа вознаграждения за нахождение ошибок Ethereum", "consensus-when-shipping": "Когда это запустится?", "ethereum-upgrades": "Обновления Ethereum", - "ethereum-brand-assets": "Активы бренда Ethereum", + "ethereum-brand-assets": "Ресурсы бренда Ethereum", "ethereum-online": "Онлайн-сообщества", "ethereum-events": "Мероприятия Ethereum", "ethereum-foundation": "Фонд Ethereum", @@ -96,7 +99,7 @@ "feedback-card-prompt-tutorial": "Было ли это руководство полезным?", "feedback-widget-thank-you-title": "Спасибо за ваш отзыв!", "feedback-widget-thank-you-subtitle": "Сделайте эту страницу еще лучше, ответив на несколько вопросов.", - "feedback-widget-thank-you-subtitle-ext": "Если вам нужна помощь, вы можете связаться с сообществом в нашем Discord.", + "feedback-widget-thank-you-subtitle-ext": "Если вам нужна помощь, вы можете связаться с сообществом в нашем Discord.", "feedback-widget-thank-you-timing": "2–3 мин", "feedback-widget-thank-you-cta": "Открыть небольшой опрос", "find-wallet": "Найти кошелек", @@ -128,7 +131,7 @@ "last-edit": "Последнее редактирование", "layer-2": "Слой 2", "learn": "Обучение", - "learn-by-coding": "Обучение на программировании", + "learn-by-coding": "Учитесь на программировании", "learn-hub": "Учебный центр", "learn-menu": "Меню обучения", "learn-more": "Узнать больше", @@ -143,9 +146,113 @@ "mainnet-ethereum": "Основная сеть Ethereum", "merge": "Слияние", "more": "Больше", - "nav-developers": "Разработчикам", + "nav-about-description": "Публичный проект с открытым кодом для сообщества Ethereum", + "nav-advanced-description": "Узнавайте о более сложных темах", + "nav-advanced-label": "Дополнительно", + "nav-basics-description": "Разберитесь в основах Ethereum", + "nav-basics-label": "Основы", + "nav-bridges-description": "Web3 становится экосистемой, состоящей из первичных блокчейнов L1 и решений для масштабирования L2", + "nav-builders-home-description": "Руководство разработчика для Ethereum. От разработчиков и для разработчиков", + "nav-builders-home-label": "Домашняя страница для разработчиков", + "nav-contribute-description": "Если вам нужна помощь, вам это пригодится", + "nav-contribute-label": "Помощь в развитии ethereum.org", + "nav-dao-description": "Сообщества, принадлежащие своим членам, без централизованного аппарата управления", + "nav-dapps-description": "Откройте для себя богатую экосистему приложений с помощью Ethereum", + "nav-defi-description": "Глобальная открытая альтернатива традиционному финансовому рынку", + "nav-desci-description": "Глобальная открытая альтернатива существующей научной системе", + "nav-desoc-description": "Платформы на основе блокчейна для социального взаимодействия и создания контента", "nav-developers-docs": "Документация для разработчиков", + "nav-developers": "Разработчикам", + "nav-did-description": "Создавайте уникальные децентрализованные идентификаторы и владейте ими", + "nav-docs-description": "Документы, помогающие разобраться в Ethereum и заняться разработкой", + "nav-docs-design-description": "Описание уникальных вызовов, связанных с дизайном web3, рекомендации и результаты пользовательских исследований", + "nav-docs-design-label": "Основы дизайна UX/UI", + "nav-docs-foundation-description": "Отправная точка для разработки на Ethereum", + "nav-docs-foundation-label": "Основные темы", + "nav-docs-overview-description": "Ваш центр документации для разработчиков", + "nav-docs-stack-description": "Понимание всех особенностей стека Ethereum", + "nav-docs-stack-label": "Стек Ethereum", + "nav-eip-description": "Стандарты, определяющие новые функции или процессы", + "nav-eip-label": "Предложения по улучшению Ethereum (EIP)", + "nav-emerging-description": "Узнавайте самые свежие примеры использования Ethereum", + "nav-emerging-label": "Новые варианты использования", + "nav-enterprise-description": "Бизнес-приложения для Ethereum", + "nav-ethereum-org-description": "Этот сайт развивается сообществом, станьте его участником и внесите свой вклад", + "nav-ethereum-wallets-description": "Приложение для взаимодействия с вашим аккаунтом Ethereum", + "nav-events-description": "Децентрализация и свобода участия для каждого", + "nav-events-irl-description": "Каждый месяц проходят крупные мероприятия Ethereum — как онлайн, так и в очном режиме", + "nav-events-label": "Сообщества и мероприятия", + "nav-events-online-description": "Эти онлайн-сообщества развиваются сотнями тысяч энтузиастов Ethereum", + "nav-find-wallet-description": "Кошельки позволяют пользоваться криптовалютой", + "nav-find-wallet-label": "Выберите кошелек", + "nav-gas-fees-description": "Как рассчитываются комиссии за транзакции в ETH", + "nav-gas-fees-label": "Комиссии за газ", + "nav-get-eth-description": "Чтобы пользоваться приложениями Ethereum, потребуется эфир (ETH)", + "nav-get-started-description": "Ваши первые шаги к использованию Ethereum", + "nav-governance-description": "Процесс включает обновление протокола Ethereum", + "nav-governance-label": "Руководство", + "nav-grants-description": "Список проектов, предлагающих гранты для финансирования программ, ведется нашим сообществом", + "nav-guide-create-account-description": "Каждый может создать аккаунт Ethereum бесплатно и в любое время с помощью приложения кошелька", + "nav-guide-create-account-label": "Как создать учетную запись Ethereum", + "nav-guide-revoke-access-description": "Оставайтесь в безопасности, взаимодействуя с умными контрактами и приложениями в экосистеме Ethereum", + "nav-guide-revoke-access-label": "Как отозвать доступ смарт-контрактов", + "nav-guide-use-wallet-description": "Узнайте, как работают все основные функции кошелька", + "nav-guide-use-wallet-label": "Как использовать кошелек", + "nav-guides-description": "Практичные пошаговые руководства, помогающие начать", + "nav-guides-label": "Практические руководства", + "nav-history-description": "График всех основных ветвлений и обновлений", + "nav-history-label": "Техническая история Ethereum", + "nav-layer-2-description": "Транзакции Ethereum дешевле и быстрее", + "nav-learn-by-coding-description": "Инструменты, помогающие экспериментировать с Ethereum", + "nav-local-env-description": "Выберите и настройте свой стек разработки Ethereum", + "nav-mainnet-description": "Блокчейн-приложения для компаний можно создавать на публичной основной сети Ethereum", + "nav-nft-description": "Способ представить что-либо уникальное как актив на основе Ethereum", + "nav-open-research-description": "Одно из ключевых преимуществ Ethereum — активное сообщество исследователей", + "nav-open-research-label": "Текущие исследования", + "nav-overview-description": "Обучающие материалы по Ethereum на любые темы", + "nav-overview-label": "Обзор", + "nav-participate-overview-description": "Обзор возможностей для участия", "nav-primary": "Основной", + "nav-private-description": "Ресурсы разработчиков для частного предприятия Ethereum", + "nav-quizzes-description": "Узнайте, насколько хорошо вы разбираетесь в Ethereum и криптовалютах", + "nav-quizzes-label": "Проверьте свои знания", + "nav-refi-description": "Альтернативная экономическая система, построенная на регенеративных принципах", + "nav-research-description": "Процессы, используемые для совершенствования Ethereum", + "nav-research-label": "Исследования и разработки", + "nav-roadmap-description": "Путь к большей масштабируемости, безопасности и экологичности Ethereum", + "nav-roadmap-future-description": "Укрепление Ethereum как надежной и децентрализованной сети", + "nav-roadmap-future-label": "Обеспечение будущего", + "nav-roadmap-label": "Дорожная карта", + "nav-roadmap-scaling-description": "Обновления сети для дальнейшего сокращения расходов и времени на транзакции", + "nav-roadmap-scaling-label": "Более дешевые транзакции", + "nav-roadmap-security-description": "Обеспечение способности Ethereum выдерживать любые типы будущих атак", + "nav-roadmap-security-label": "Улучшенная безопасность", + "nav-roadmap-ux-description": "Использование Ethereum нужно упростить", + "nav-run-a-node-description": "Получите полную независимость, помогая защитить сеть", + "nav-security-description": "Узнайте о лучших способах использовать криптовалюту", + "nav-smart-contracts-description": "Главные строительные блоки экосистемы Ethereum", + "nav-stablecoins-description": "Стейблкойны — это токены Ethereum, разработанные для сохранения фиксированной ценности", + "nav-stake-description": "Зарабатывайте вознаграждения за защиту Ethereum", + "nav-stake-label": "Доля", + "nav-staking-home-description": "Обзор различных вариантов стейкинга", + "nav-staking-home-label": "Главная страница стейкинга", + "nav-staking-pool-description": "Становитесь дольщиком и зарабатывайте награды при любом количестве ETH, объединяясь с другими", + "nav-staking-pool-label": "Объединенный стейкинг", + "nav-staking-saas-description": "Операторы сторонних узлов управляют работой вашего клиента валидатора", + "nav-staking-saas-label": "Стейкинг с услугой", + "nav-staking-solo-description": "Запустите домашнее оборудование и лично добавьте безопасности и децентрализации сети Ethereum", + "nav-staking-solo-label": "Одиночный стейкинг", + "nav-start-building-description": "Полезная информация для новичков", + "nav-translation-program-description": "Общие усилия по переводу ethereum.org на все языки", + "nav-tutorials-description": "Курируемый список руководств сообщества", + "nav-use-cases-description": "Узнайте различные идеи по использованию Ethereum", + "nav-use-cases-label": "Применение", + "nav-what-is-ether-description": "Валюта приложений Ethereum", + "nav-what-is-ethereum-description": "Узнайте, в чем особенность Ethereum", + "nav-what-is-web3-label": "Что такое Web3?", + "nav-what-is-web3-description": "Альтернатива централизованным монополиям, диктующим свои условия", + "nav-whitepaper-description": "Первоначальное описание Ethereum, написанное Виталиком Бутериным в 2014 году", + "nav-zkp-description": "Способ доказать действительность заявления, не раскрывая его", "nft-page": "NFT - Невзаимозаменяемые токены", "nfts": "NFT", "no": "Нет", @@ -154,6 +261,8 @@ "page-developers-aria-label": "Меню разработчиков", "page-index-meta-title": "Главная", "page-last-updated": "Последнее обновление страницы", + "participate": "Участвуйте", + "participate-menu": "Меню участия", "pbs": "Разделение предлагающих и строителей", "pools": "Объединенный стейкинг", "privacy-policy": "Политика о конфиденциальности", @@ -164,10 +273,12 @@ "refresh": "Обновите страницу.", "return-home": "Вернуться на главную", "roadmap": "Дорожная карта Ethereum", + "research": "Исследования", + "research-menu": "Меню исследований", "resources": "Ресурсы для перевода", "regenerative-finance": "ReFi - Регенеративные финансы", "run-a-node": "Запуск узла", - "rollup-component-website": "Сайт", + "rollup-component-website": "Вебсайт", "rollup-component-developer-docs": "Документация для разработчиков", "rollup-component-technology-and-risk-summary": "Обзор рисков и технологий", "scaling": "Масштабирование", @@ -190,14 +301,14 @@ "site-title": "ethereum.org", "skip-to-main-content": "Перейти к основному содержанию", "smart-contracts": "Умные контракты", - "stablecoins": "Stablecoins", + "stablecoins": "Стабильные монеты", "stake-eth": "Вложить ETH", "staking": "Ставки", "start-here": "Начните здесь", "style-guide": "Руководство по стилю", "solo": "Одиночный стейкинг", "support": "Поддержка", - "terms-of-use": "Условия пользования", + "terms-of-use": "Условия использования", "translation-banner-body-new": "Вы просматриваете эту страницу на английском языке, потому что мы еще не перевели ее. Помогите нам перевести эти материалы.", "translation-banner-body-update": "Есть новая версия этой страницы, но пока только на английском языке. Помогите нам перевести последнюю версию.", "translation-banner-button-see-english": "См. английский", @@ -211,8 +322,10 @@ "try-using-search": "Попробуйте использовать поиск, чтобы найти то, что вы ищете, или", "tutorials": "Учебники", "up": "Вверх", + "use": "Использование", "use-ethereum": "Использование Ethereum", "use-ethereum-menu": "Использовать меню Ethereum", + "use-menu": "Меню использования", "user-experience": "Пользовательский опыт", "verkle-trees": "Деревья Веркла", "wallets": "Кошельки", @@ -220,7 +333,7 @@ "web3": "Что такое Web3?", "web3-title": "Web3", "website-last-updated": "Последнее обновление страницы", - "what-is-ether": "Что такое эфир (ETH)?", + "what-is-ether": "Что такое Ether (ETH)?", "what-is-ethereum": "Что такое Ethereum?", "withdrawals": "Вывод средств, использованных в стейкинге", "yes": "Да", diff --git a/src/intl/se/common.json b/src/intl/se/common.json index 91d517b23e9..37ff2d70218 100644 --- a/src/intl/se/common.json +++ b/src/intl/se/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Kontoabstraktion", "about-ethereum-org": "Om ethereum.org", "about-us": "Om oss", + "adding-desci-projects": "Lägga till Desci-projekt", + "adding-developer-tools": "Lägga till utvecklarverktyg", + "adding-exchanges": "Lägga till börser", + "adding-glossary-terms": "Lägga till ordlistetermer", + "adding-staking-products": "Lägga till utsättningsprodukter", + "adding-wallets": "Lägga till plånböcker", + "account-abstraction": "Kontoabstraktion", + "acknowledgements": "Tack till", "aria-toggle-search-button": "Växla sökknappen", "aria-toggle-menu-button": "Växla menyknappen", "beacon-chain": "Beacon-kedjan", "bridges": "Blockkedjebryggor", + "bug-bounty": "Hittelön för skadlig kod", + "build": "Bygg", + "build-menu": "Byggmeny", "clear": "Rensa", "close": "Stäng", - "community": "Community", + "community": "Gemenskap", "community-hub": "Gemenskapshubben", "community-menu": "Gemenskapsmenyn", "contact": "Kontakta oss", + "content-buckets": "Innehållsämnen", + "content-resources": "Innehållsresurser", "content-standardization": "Standardisering av innehåll", "contributing": "Bidragande", "contributors": "Bidragsgivare", @@ -27,7 +39,10 @@ "decentralized-identity": "Decentraliserad identitet", "decentralized-social-networks": "Decentraliserade sociala nätverk", "decentralized-science": "DeSci - Decentraliserad vetenskap", + "description": "Beskrivning för navobjekt", "defi-page": "DeFi - Decentraliserad finansiering", + "design": "Design", + "design-principles": "Designprinciper", "devcon": "Devcon", "developers": "Utvecklare", "developers-home": "Startsida för utvecklare", @@ -59,22 +74,24 @@ "enterprise-menu": "Företagsmeny", "esp": "Stödprogram för ekosystemet", "eth-current-price": "Nuvarande ETH-pris (USD)", + "ethereum-basics": "Grunderna i Ethereum", "ethereum-bug-bounty": "Ethereums program för hittelön för skadlig kod", "consensus-when-shipping": "När lanseras det?", "ethereum-upgrades": "Ethereum-uppgraderingar", "ethereum-brand-assets": "Ethereum-varumärkestillgångar", - "ethereum-online": "Communitys online", + "ethereum-online": "Gemenskaper online", "ethereum-events": "Ethereum-evenemang", "ethereum-foundation": "Ethereum Foundation", "ethereum-foundation-logo": "Ethereum Foundation-logotyp", "ethereum-glossary": "Ethereum-ordlista", "ethereum-governance": "Ethereum – styrning", "ethereum-logo": "Ethereum-logotyp", - "ethereum-roadmap": "Färdplan för Ethereum", + "ethereum-roadmap": "Vägkarta för Ethereum", + "ethereum-protocol": "Ethereum-protokoll", "ethereum-security": "Ethereum – skydd och förebyggande av bedrägerier", "ethereum-support": "Ethereum-support", "ethereum-wallets": "Ethereum-plånböcker", - "ethereum-whitepaper": "Vitbok för Ethereum", + "ethereum-whitepaper": "Ethereum-faktablad", "feedback-widget-prompt": "Är den här sidan till hjälp?", "feedback-card-prompt-page": "Var den här sidan till hjälp?", "feedback-card-prompt-article": "Var den här artikeln till hjälp?", @@ -92,11 +109,10 @@ "grants": "Anslag", "grant-programs": "Anslagsprogram för ekosystemet", "guides": "Guider", - "guides-hub": "Hubb för guider", + "guides-hub": "Guider", "history-of-ethereum": "Ethereums historia", "home": "Startsida", "how-ethereum-works": "Så här fungerar Ethereum", - "how-to-create-an-ethereum-account": "Så här \"registrerar\" man ett Ethereum-konto", "how-to-revoke-token-access": "Så här återkallar du åtkomsten till smarta kontrakt för dina kryptofonder", "how-to-swap-tokens": "Så här byter man polletter", "how-to-use-a-bridge": "Så här överför man polletter till lager 2", @@ -123,12 +139,111 @@ "loading": "Laddar ...", "loading-error": "Laddningsfel.", "loading-error-refresh": "Fel, uppdatera.", + "loading-error-try-again-later": "Det gick inte att läsa in data. Försök igen senare.", "logo": "logotyp", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Sammanfoga", "more": "Mer", - "nav-developers": "Utvecklare", + "nav-about-description": "Ett kollektivt projekt med öppen källa för Ethereum-communityn", + "nav-advanced-description": "Lär dig om de mer komplexa ämnena", + "nav-advanced-label": "Avancerat", + "nav-basics-description": "Förstå grunderna i Ethereum", + "nav-basics-label": "Grunderna", + "nav-bridges-description": "Web3 har utvecklats till ett ekosystem av primära L1-blockkedjor och L2-skalningslösningar", + "nav-builders-home-description": "En bygghandbok för Ethereum – av byggare, för byggare", + "nav-builders-home-label": "Startsida för byggare", + "nav-contribute-description": "Om du vill ha hjälp kommer denna handbok att vägleda dig", + "nav-contribute-label": "Bidra till ethereum.org", + "nav-dao-description": "Medlemsägda gemenskaper utan centraliserad ledning", + "nav-dapps-description": "Utforska ett rikt ekosystem av appar med Ethereum", + "nav-defi-description": "Ett globalt, öppet alternativ till den traditionella finansiella marknaden", + "nav-desci-description": "Ett globalt, öppet alternativ till det nuvarande vetenskapliga systemet", + "nav-desoc-description": "Blockkedjebaserade plattformar för social interagering och innehållsskapande", "nav-developers-docs": "Utvecklardokument", + "nav-developers": "Utvecklare", + "nav-did-description": "Skapa och äg dina unika decentraliserade identifierare", + "nav-docs-description": "Dokument som hjälper dig att förstå och bygga med Ethereum", + "nav-docs-design-description": "Beskrivning av unika web3-designutmaningar, bästa praxis och insikter om användarforskning", + "nav-docs-design-label": "Grunder för UX/UI-design", + "nav-docs-foundation-description": "Grunderna för att utveckla på Ethereum", + "nav-docs-foundation-label": "Grundläggande ämnen", + "nav-docs-overview-description": "Din startsida för dokument för utvecklare", + "nav-docs-stack-description": "Förstå alla detaljerna i Ethereum-stacken", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Standarder som specificerar nya funktioner och processer", + "nav-eip-label": "Förbättringsförslag för Ethereum (EIP:er)", + "nav-emerging-description": "Få reda på andra nya användarfall för Ethereum", + "nav-enterprise-description": "Företagsapplikationer för Ethereum", + "nav-ethereum-org-description": "Den här webbplatsen drivs av communityn – delta och bidra själv", + "nav-ethereum-wallets-description": "En app för att interagera med ditt Ethereum-konto", + "nav-events-description": "Decentralisering och frihet att delta för alla", + "nav-events-irl-description": "Varje månad äger stora Ethereum-evenemang rum i verkligheten och online", + "nav-events-label": "Gemenskaper och evenemang", + "nav-events-online-description": "Hundratusentals Ethereum-entusiaster ligger bakom dessa onlinegemenskaper", + "nav-find-wallet-description": "Med plånböcker kan du använda crypto", + "nav-find-wallet-label": "Välj din plånbok", + "nav-gas-fees-description": "Hur ETH-transaktionsavgifter beräknas", + "nav-get-eth-description": "Du behöver ether (ETH) för att använda Ethereum-applikationer", + "nav-get-started-description": "Dina första steg för att använda Ethereum", + "nav-governance-description": "Processen att uppgradera Ethereum-protokollet", + "nav-governance-label": "Styrning", + "nav-grants-description": "En kurerad lista av vår gemenskap med projekt som tillhandahåller program för stipendiefinansering", + "nav-guide-create-account-description": "Vem som helst kan när som helst skapa ett Ethereum-konto gratis med en plånboksapp", + "nav-guide-revoke-access-description": "Håll dig säker när du interagerar med smarta kontrakt och applikationer i Ethereum-ekosystemet", + "nav-guide-revoke-access-label": "Så nekar du åtkomst till smarta kontrakt", + "nav-guide-use-wallet-description": "Ta reda på hur du använder alla grundläggande funktioner för en plånbok", + "nav-guide-use-wallet-label": "Så här använder man en plånbok", + "nav-guides-description": "Praktiska steg-för-steg-guider som hjälper dig att komma igång", + "nav-guides-label": "Guider", + "nav-history-description": "En tidslinje för alla viktiga förgreningar och uppdateringar", + "nav-history-label": "Ethereums tekniska historia", + "nav-layer-2-description": "Billigare och snabbare transaktioner för Ethereum", + "nav-learn-by-coding-description": "Verktyg som hjälper dig att experimentera med Ethereum", + "nav-local-env-description": "Välj och konfigurera din Ethereum-utvecklingsstack", + "nav-mainnet-description": "Enterprise-blockkedjeapplikationer kan byggas på det kollektiva Ethereum-huvudnätverket", + "nav-nft-description": "Ett sätt att representera något unikt som en Ethereum-baserad tillgång", + "nav-open-research-description": "En av de främsta styrkorna med Ethereum är dess aktiva forskningsgemenskap", + "nav-open-research-label": "Öppen forskning", + "nav-overview-description": "Allt om Ethereum-utbildning", + "nav-participate-overview-description": "Översikt över hur du deltar", "nav-primary": "Primär", + "nav-quizzes-description": "Ta reda på hur väl du förstår Ethereum och kryptovalutor", + "nav-quizzes-label": "Testa dina kunskaper", + "nav-refi-description": "Ett alternativt ekonomiskt system byggt på regenerativa principer", + "nav-research-description": "Processer som används för att förbättra Ethereum", + "nav-research-label": "Forskning och utveckling", + "nav-roadmap-description": "Vägen till ökad skalbarhet, säkerhet och hållbarhet för Ethereum", + "nav-roadmap-future-description": "Stärker Ethereum som ett robust och decentraliserat nätverk", + "nav-roadmap-future-label": "Framtidssäkring", + "nav-roadmap-label": "Vägkarta", + "nav-roadmap-scaling-description": "Nätverksuppdateringar för att ytterligare reducera transaktionskostnader och hastighet", + "nav-roadmap-security-description": "Se till att Ethereum håller sig motståndskraftigt mot alla typer av angrepp i framtiden", + "nav-roadmap-security-label": "Förbättrad säkerhet", + "nav-roadmap-ux-description": "Användningen av Ethereum måste förenklas", + "nav-run-a-node-description": "Bli hypereffektiv samtidigt som du hjälper till att göra nätverket säkert", + "nav-security-description": "Lär dig bästa praxis för att använda kryptovaluta", + "nav-smart-contracts-description": "De grundläggande byggnadsblocken i Ethereum-ekosystemet", + "nav-stablecoins-description": "Stablecoins är Ethereum-tokens som är utformade för att ha ett fast värde", + "nav-stake-description": "Få belöningar för att göra Ethereum säkrare", + "nav-stake-label": "Insats", + "nav-staking-home-description": "En översikt över olika alternativ för utsättningar", + "nav-staking-home-label": "Staking startsida", + "nav-staking-pool-description": "Satsa och få belöningar med valfri mängd ETH genom att gå samman med andra", + "nav-staking-pool-label": "Sammansatt utsättning", + "nav-staking-saas-description": "Nodoperatörer från tredje part hanterar driften av din valideringsklient", + "nav-staking-saas-label": "Utsättning med en tjänst", + "nav-staking-solo-description": "Kör hem hårdvara och personligen lägg till säkerheten och decentraliseringen av Ethereum-nätverket", + "nav-staking-solo-label": "Soloutsättning", + "nav-start-building-description": "Användbar information för nybörjare", + "nav-translation-program-description": "Ett samarbetsprojekt för att översätta ethereum.org till alla språk", + "nav-tutorials-description": "Kurerad lista över community-guider", + "nav-use-cases-description": "Upptäck olika idéer för Ethereum-användning", + "nav-what-is-ether-description": "Valutan för Ethereum-appar", + "nav-what-is-ethereum-description": "Förstå vad som gör Ethereum speciellt", + "nav-what-is-web3-label": "Vad är Web3?", + "nav-what-is-web3-description": "Ett alternativ till centraliserade monopol som bestämmer reglerna", + "nav-whitepaper-description": "Det ursprungliga Ethereum-faktabladet skrivet av Vitalik Buterin år 2014", + "nav-zkp-description": "Ett sätt att bevisa giltigheten i ett uttalande utan att avslöja själva uttalandet", "nft-page": "NFT - Icke-fungibla polletter", "nfts": "NFT:er", "no": "Nej", @@ -137,44 +252,50 @@ "page-developers-aria-label": "Utvecklarmeny", "page-index-meta-title": "Startsida", "page-last-updated": "Sidan uppdaterades senast", + "participate": "Delta", + "participate-menu": "Deltagandemeny", "pbs": "Separering av förslagsgivare och byggare", - "pools": "Sammansatt stakning", + "pools": "Sammansatt utsättning", "privacy-policy": "Sekretesspolicy", "private-ethereum": "Privat Ethereum", - "product-disclaimer": "Produkter och tjänster listas för att underlätta för personerna i Ethereum-communityn. En produkt eller tjänst som finns med i listan innebär inte en rekommendation eller någon typ av godkännande från teamet för webbplatsen ethereum.org eller Ethereum Foundation.", - "quizzes-title": "Kvisshubben", + "product-disclaimer": "Produkter och tjänster listas för att underlätta för personerna i Ethereum-gemenskapen. En produkt eller tjänst som finns med i listan innebär inte en rekommendation eller någon typ av godkännande från teamet för webbplatsen ethereum.org eller Ethereum Foundation.", + "quizzes-title": "Frågesportshubben", "quizzes": "Frågesporter", "refresh": "Uppdatera sidan.", "return-home": "återgå till startsidan", - "roadmap": "Färdplan för Ethereum", + "roadmap": "Vägkarta för Ethereum", + "research": "Forskning", + "research-menu": "Forskningsmeny", + "resources": "Översättningsresurser", "run-a-node": "Kör en nod", "rollup-component-website": "Webbplats", "rollup-component-developer-docs": "Utvecklardokument", "rollup-component-technology-and-risk-summary": "Teknik- och risksammanfattning", "scaling": "Skalning", - "saas": "Staking som en tjänst", + "saas": "Utsättning som en tjänst", "search": "Sök", "search-ethereum-org": "Sök på ethereum.org", "secret-leader-election": "Hemligt val av ledare", "search-box-blank-state-text": "Sök!", - "search-eth-address": "Detta ser ut som en Ethereum-adress. Vi tillhandahåller inte data som är specifik för adresser. Försök att söka efter det på en blockutforskare som", + "search-eth-address": "Detta ser ut som en Ethereum-adress. Vi tillhandahåller inte data som är specifika för adresser. Försök att söka efter det på en blockutforskare som", "search-no-results": "Vi hittade inga resultat för din sökning", + "security": "Säkerhet", "single-slot-finality": "Single-slot finality (SSF)", "statelessness": "Statslöshet", "see-contributors": "Se medverkande", "set-up-local-env": "Konfigurera lokal miljö", - "sharding": "Horisontell partitionering", + "sharding": "Sharding", "show-all": "Visa alla", "show-less": "Visa mindre", "site-description": "Ethereum är en global, decentraliserad plattform för pengar och nya slags applikationer. På Ethereum kan du skriva kod som styr pengar och bygga appar som är tillgängliga var som helst i världen.", - "site-title": "ethereum.org", "skip-to-main-content": "Hoppa till huvudinnehållet", "smart-contracts": "Smarta kontrakt", "stablecoins": "Stablecoins", "stake-eth": "Stake ETH", - "staking": "Staking", - "style-guide": "Style guide", - "solo": "Solo-staking", + "staking": "Utsättning", + "start-here": "Börja här", + "solo": "Soloutsättning", + "support": "Hjälp", "terms-of-use": "Användarvillkor", "translation-banner-body-new": "Du ser den här sidan på engelska eftersom vi inte har översatt den än. Hjälp oss att översätta detta innehåll.", "translation-banner-body-update": "Det finns en ny version av den här sidan men den finns bara på engelska just nu. Hjälp oss att översätta den senaste versionen.", @@ -185,21 +306,23 @@ "translation-banner-no-bugs-title": "Inga buggar här!", "translation-banner-no-bugs-content": "Den här sidan översätts inte. Vi har avsiktligt lämnat den här sidan på engelska för tillfället.", "translation-banner-no-bugs-dont-show-again": "Visa inte igen", + "translation-program": "Översättningsprogram", "try-using-search": "Prova att använda sökfunktionen för att hitta det du letar efter eller", "tutorials": "Handledningar", "up": "Upp", + "use": "Använd", "use-ethereum": "Använda Ethereum", - "use-ethereum-menu": "Använd Ethereum-menyn", - "user-experience": "User experience", + "use-ethereum-menu": "Använda Ethereum-menyn", + "use-menu": "Användningsmeny", "verkle-trees": "Verkle-träd", "wallets": "Plånböcker", - "we-couldnt-find-that-page": "Vi kunde inte hitta den sidan", + "we-couldnt-find-that-page": "Vi kunde inte hitta sidan", "web3": "Vad är Web3?", "web3-title": "Web3", "website-last-updated": "Webbplatsen senast uppdaterad", - "what-is-ether": "Vad är ether (ETH)?", + "what-is-ether": "Vad är Ether (ETH)?", "what-is-ethereum": "Vad är Ethereum?", - "withdrawals": "Staking-uttag", + "withdrawals": "Utsättningsuttag", "yes": "Ja", "zero-knowledge-proofs": "Nollkunskapsbevis" } diff --git a/src/intl/sk/common.json b/src/intl/sk/common.json index 1632b009603..5206a601670 100644 --- a/src/intl/sk/common.json +++ b/src/intl/sk/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Abstrakcia účtu", "about-ethereum-org": "O ethereum.org", "about-us": "O nás", + "adding-desci-projects": "Pridávanie projektov Desci", + "adding-developer-tools": "Pridávanie nástrojov pre vývojárov", + "adding-exchanges": "Pridávanie zmenární", + "adding-glossary-terms": "Pridávanie pojmov do slovníka", + "adding-staking-products": "Pridávanie produktov pre staking", + "adding-wallets": "Pridávanie peňaženiek", + "account-abstraction": "Abstrakcia účtu", + "acknowledgements": "Poďakovania", "aria-toggle-search-button": "Prepínač vyhľadávania", "aria-toggle-menu-button": "Prepínač ponuky", "beacon-chain": "Beacon Chain", "bridges": "Mosty blockchainu", + "bug-bounty": "Odmena za nájdenie chýb", + "build": "Zostava", + "build-menu": "Ponuka Zostava", "clear": "Vymazať", "close": "Zavrieť", "community": "Komunita", "community-hub": "Komunitné centrum", "community-menu": "Ponuka Komunita", "contact": "Kontakt", + "content-buckets": "Kategórie", + "content-resources": "Zdroje", "content-standardization": "Štandardizácia obsahu", "contributing": "Príspevky", "contributors": "Prispievatelia", @@ -27,7 +39,10 @@ "decentralized-identity": "Decentralizovaná identita", "decentralized-social-networks": "Decentralizovaná sociálna sieť", "decentralized-science": "DeSci - Decentralizovaná veda", + "description": "Popis položky navigácie", "defi-page": "DeFi - Decentralizované finančníctvo", + "design": "Dizajn", + "design-principles": "Princípy dizajnu", "devcon": "Developerská konferencia", "developers": "Vývojári", "developers-home": "Domovská stránka pre vývojárov", @@ -63,7 +78,7 @@ "ethereum-bug-bounty": "Program na lovenie chýb v ethereu", "consensus-when-shipping": "Kedy vychádza?", "ethereum-upgrades": "Vylepšenia Etherea", - "ethereum-brand-assets": "Zdroje značky Ethereum", + "ethereum-brand-assets": "Značkové položky Ethereum", "ethereum-online": "Online komunity", "ethereum-events": "Udalosti Ethereum", "ethereum-foundation": "Nadácia Etherea", @@ -83,7 +98,7 @@ "feedback-card-prompt-tutorial": "Bol tento návod užitočný?", "feedback-widget-thank-you-title": "Ďakujeme za názor!", "feedback-widget-thank-you-subtitle": "Urobte túto stránku lepšou zodpovedaním na pár otázok.", - "feedback-widget-thank-you-subtitle-ext": "Pokiaľ potrebujete pomoc môžte za obrátiť na komunitný kanál na Discorde.", + "feedback-widget-thank-you-subtitle-ext": "Ak potrebujete pomoc, môžete sa obrátiť na komunitu na Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Krátky prieskum", "find-wallet": "Nájsť peňaženku", @@ -94,11 +109,10 @@ "grants": "Granty", "grant-programs": "Programy ekosystémových grantov", "guides": "Nápoveda", - "guides-hub": "Centrum nápoved", + "guides-hub": "Návody", "history-of-ethereum": "História Etherea", "home": "Domov", "how-ethereum-works": "Ako Ethereum funguje", - "how-to-register-an-ethereum-account": "Ako si \"zaregistrovať\" účet Etherea", "how-to-revoke-token-access": "Ako zrušiť prístup chytrého kontraktu k Vašim prostriedkom", "how-to-swap-tokens": "Ako zameniť tokeny / kryptomeny", "how-to-use-a-bridge": "Ako preniesť tokeny do siete druhej úrovne", @@ -128,10 +142,103 @@ "loading-error-try-again-later": "Nemožné načítať údaje. Skúste to znova.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Zlúčenie", "more": "Viac", - "nav-developers": "Pre vývojárov", + "nav-about-description": "Verejný projekt s otvoreným zdrojovým kódom pre komunitu Ethereum", + "nav-advanced-description": "Zoznámte sa so zložitejšími témami", + "nav-advanced-label": "Pre pokročilých", + "nav-basics-description": "Pochopenie základov Etherea", + "nav-basics-label": "Základy", + "nav-bridges-description": "Web3 sa vyvinul do ekosystému primárnych blockchainov L1 a škálovacích riešení L2", + "nav-builders-home-description": "Príručka programátora pre Ethereum — programátori programátorom", + "nav-builders-home-label": "Domovská stránka pre programátorov", + "nav-contribute-description": "Ak chcete pomôcť, toto vám poskytne návod", + "nav-contribute-label": "Prispievanie na portál ethereum.org", + "nav-dao-description": "Členské komunity bez centralizovanej autority", + "nav-dapps-description": "Preskúmajte bohatý ekosystém aplikácií využívajúcich Ethereum", + "nav-defi-description": "Globálna, otvorená alternatíva k tradičnému finančnému trhu", + "nav-desci-description": "Globálna, otvorená alternatíva k súčasnému vedeckému systému", + "nav-desoc-description": "Platformy založené na blockchaine pre sociálnu interakciu a tvorbu obsahu", "nav-developers-docs": "Vývojárske dokumenty", + "nav-developers": "Vývojári", + "nav-did-description": "Vydávajte a vlastnite svoje jedinečné decentralizované identifikátory", + "nav-docs-description": "Dokumenty, ktoré vám pomôžu pochopiť a vytvoriť systémy pomocou Etherea", + "nav-docs-design-description": "Opis jedinečných výziev v oblasti dizajnu web3, osvedčených postupov a skúseností používateľov", + "nav-docs-design-label": "Základy dizajnu UX/UI", + "nav-docs-foundation-description": "Hlavné princípy vývoja na platforme Ethereum", + "nav-docs-overview-description": "Vaša domovská stránka s dokumentmi pre vývojárov", + "nav-docs-stack-description": "Pochopenie všetkých podrobností o Ethereum stack", + "nav-eip-description": "Štandardy, ktoré špecifikujú nové funkcie alebo procesy", + "nav-eip-label": "Návrhy na zlepšenie Etherea (EIP)", + "nav-emerging-description": "Spoznajte ďalšie novšie prípady použitia Etherea", + "nav-enterprise-description": "Obchodné aplikácie pre Ethereum", + "nav-ethereum-org-description": "Táto webová stránka je vytvorená komunitou — pridajte sa k nám a prispievajte aj vy", + "nav-ethereum-wallets-description": "Aplikácia na interakciu s vaším účtom Ethereum", + "nav-events-description": "Decentralizácia a možnosť účasti pre každého", + "nav-events-irl-description": "Každý mesiac sa konajú významné osobné a online podujatia zamerané na Ethereum", + "nav-events-label": "Komunity a podujatia", + "nav-events-online-description": "Súčasťou týchto online komunít sú stovky tisíc nadšencov Etherea", + "nav-find-wallet-description": "Peňaženky, ktoré umožňujú používať kryptomeny", + "nav-find-wallet-label": "Vyberte si peňaženku", + "nav-gas-fees-description": "Ako sa vypočítavajú poplatky za transakcie ETH", + "nav-get-eth-description": "Na používanie aplikácií Ethereum potrebujete ether (ETH)", + "nav-get-started-description": "Vaše prvé kroky pri používaní Etherea", + "nav-governance-description": "Proces aktualizácie protokolu Etherea", + "nav-governance-label": "Správa", + "nav-grants-description": "Zoznam zostavený našou komunitou týkajúci sa projektov, ktoré poskytujú grantové programy", + "nav-guide-create-account-description": "Účet Ethereum si môže kedykoľvek vytvoriť ktokoľvek, a to zadarmo pomocou aplikácie s peňaženkou", + "nav-guide-revoke-access-description": "Zostaňte v bezpečí pri interakcii s inteligentnými kontraktmi a aplikáciami v ekosystéme Ethereum", + "nav-guide-revoke-access-label": "Ako zrušiť prístup k inteligentným kontraktom", + "nav-guide-use-wallet-description": "Naučte sa ovládať všetky základné funkcie peňaženky", + "nav-guide-use-wallet-label": "Ako používať peňaženku", + "nav-guides-description": "Praktické podrobné príručky, ktoré vám pomôžu začať", + "nav-guides-label": "Organizačné príručky", + "nav-history-description": "Časová os všetkých hlavných verzií a aktualizácií", + "nav-history-label": "Technická história Etherea", + "nav-layer-2-description": "Lacnejšie a rýchlejšie transakcie pre Ethereum", + "nav-learn-by-coding-description": "Nástroje, ktoré vám pomôžu experimentovať s Ethereom", + "nav-local-env-description": "Výber a nastavenie vývojárskeho Ethereum stack", + "nav-mainnet-description": "Podnikové blockchainové aplikácie môžu byť vytvárané vo verejnej sieti Ethereum Mainnet", + "nav-nft-description": "Spôsob, ako reprezentovať čokoľvek unikátne ako majetok založený na Ethereu", + "nav-open-research-description": "Jednou z hlavných predností Etherea je jeho aktívna komunita výskumníkov", + "nav-open-research-label": "Otvoriť prieskum", + "nav-overview-description": "Všetko o vzdelávaní v oblasti Etherea", + "nav-participate-overview-description": "Prehľad o tom, ako sa zapojiť", "nav-primary": "Primárne", + "nav-quizzes-description": "Zistite, ako dobre rozumiete ethereu a kryptomenám", + "nav-quizzes-label": "Otestujte si svoje znalosti", + "nav-refi-description": "Alternatívny ekonomický systém založený na princípoch obnovy", + "nav-research-description": "Procesy používané na zlepšenie Etherea", + "nav-research-label": "Výskum a vývoj", + "nav-roadmap-description": "Cesta k väčšej škálovateľnosti, bezpečnosti a udržateľnosti pre Ethereum", + "nav-roadmap-future-description": "Posilnenie Etherea ako robustnej a decentralizovanej siete", + "nav-roadmap-future-label": "Zabezpečenie do budúcnosti", + "nav-roadmap-label": "Plán cesty", + "nav-roadmap-scaling-description": "Sieťové aktualizácie na ďalšie zníženie transakčných nákladov a zvýšenie rýchlosti", + "nav-roadmap-security-description": "Zabezpečenie odolnosti Etherea voči rôznym druhom útokov aj v budúcnosti", + "nav-roadmap-security-label": "Zlepšené zabezpečenie", + "nav-roadmap-ux-description": "Používanie Etherea sa musí zjednodušiť", + "nav-run-a-node-description": "Staňte na úplne samostatnými pri pomáhaní v zabezpečení siete", + "nav-security-description": "Naučte sa osvedčené postupy pri používaní kryptomien", + "nav-smart-contracts-description": "Základné stavebné bloky ekosystému Ethereum", + "nav-stablecoins-description": "Stablecoiny sú tokenmi Etherea, ktoré sú navrhnuté tak, aby mali fixnú hodnotu", + "nav-stake-description": "Získajte odmeny za zabezpečenie Etherea", + "nav-stake-label": "Staking", + "nav-staking-home-description": "Prehľad rôznych možností stakingu", + "nav-staking-pool-description": "Využívajte staking, získavajte odmeny s ľubovoľnou sumou ETH a pridajte sa k ostatným", + "nav-staking-pool-label": "Stakovanie v pooloch", + "nav-staking-saas-label": "Stakovanie ako služba", + "nav-staking-solo-label": "Sólo stakovanie", + "nav-start-building-description": "Užitočné informácie pre nováčikov", + "nav-translation-program-description": "Spoločné úsilie o preklad webovej lokality ethereum.org do všetkých jazykov", + "nav-tutorials-description": "Zoznam komunitných výukových materiálov", + "nav-use-cases-description": "Objavte rôzne nápady na využitie Etherea", + "nav-what-is-ether-description": "Mena aplikácií Etherea", + "nav-what-is-ethereum-description": "Pochopte, čím je Ethereum výnimočné", + "nav-what-is-web3-label": "Čo je Web3?", + "nav-what-is-web3-description": "Alternatíva k centralizovaným monopolom určujúcim pravidlá", + "nav-whitepaper-description": "Pôvodný dokument o Ethereu, ktorý napísal Vitalik Buterin v roku 2014", + "nav-zkp-description": "Spôsob, ako dokázať platnosť výroku bez odhalenia samotného výroku", "nft-page": "NFT - Non-fungible tokeny", "nfts": "NFT-čka", "no": "Nie", @@ -140,6 +247,8 @@ "page-developers-aria-label": "Ponuka pre vývojárov", "page-index-meta-title": "Domov", "page-last-updated": "Posledná aktualizácia stránky", + "participate": "Pripoj sa", + "participate-menu": "Ponuka účasti", "pbs": "Oddelenie navrhovateľ-staviteľ", "pools": "Stakovanie v pooloch", "privacy-policy": "Zásady ochrany osobných údajov", @@ -150,10 +259,11 @@ "refresh": "Obnovte stránku.", "return-home": "návrat domov", "roadmap": "Cestovná mapa Etherea", + "research": "Výskum", + "research-menu": "Ponuka Výskum", "resources": "Zdroje prekladu", "regenerative-finance": "ReFi - Regeneratívne finančníctvo", "run-a-node": "Spustiť uzol", - "rollup-component-website": "Website", "rollup-component-developer-docs": "Vývojárske dokumenty", "rollup-component-technology-and-risk-summary": "Zhrnutie technológií a rizík", "scaling": "Škálovanie", @@ -164,11 +274,11 @@ "search-box-blank-state-text": "Hľadajte!", "search-eth-address": "Toto vyzerá ako ethereová adresa. Neposkytujeme dáta o špecifických adresách. Vyskúšajte ju vyhľadať cez prehliadač blokov ako", "search-no-results": "Neboli nájdené žiadne výsledky pre hľadaný výraz", + "security": "Zabezpečenie", "single-slot-finality": "Konečnosť jedného slotu", "statelessness": "Bezstavovosť", "see-contributors": "Zobraziť prispievateľov", "set-up-local-env": "Nastavenie miestneho prostredia", - "sharding": "Sharding", "show-all": "Zobraziť všetko", "show-less": "Zobraziť menej", "site-description": "Ethereum je globálna decentralizovaná platforma pre peniaze a nové typy aplikácii. V Ethereu môžete tvoriť kód, ktorý bude riadiť peniaze, a zostavovať aplikácie, ktoré budú prístupné z celého sveta.", @@ -179,8 +289,8 @@ "stake-eth": "Stakovanie ETH", "staking": "Stakovanie", "start-here": "Začnite tu", - "style-guide": "Style guide", "solo": "Sólo stakovanie", + "support": "Podpora", "terms-of-use": "Podmienky používania", "translation-banner-body-new": "Táto stránka sa zobrazuje v angličtine, pretože sme ju ešte nestihli preložiť. Pomôžte nám s jej prekladom.", "translation-banner-body-update": "K dispozícii je nová verzia tejto stránky. V súčasnosti je však len v angličtine. Pomôžte nám s prekladom najnovšej verzie.", @@ -191,17 +301,18 @@ "translation-banner-no-bugs-title": "Tu niesu žiadne chyby!", "translation-banner-no-bugs-content": "Táto stránka nebola preložená. Zatiaľ sme ponechali túto stránku v Angličtine.", "translation-banner-no-bugs-dont-show-again": "Znova nezobrazovať", + "translation-program": "Program prekladania", "try-using-search": "Pokúste sa použiť vyhľadávač na nájdenie toho, čo hľadáte", "tutorials": "Kurzy", "up": "Hore", + "use": "Používanie", "use-ethereum": "Používanie Etherea", "use-ethereum-menu": "Ponuka Používanie Etherea", - "user-experience": "User experience", + "use-menu": "Ponuka Použiť", "verkle-trees": "Verkle stromy", "wallets": "Peňaženky", "we-couldnt-find-that-page": "Túto stránku sme nenašli", "web3": "Čo je Web3?", - "web3-title": "Web3", "website-last-updated": "Posledná aktualizácia stránky", "what-is-ether": "Čo je Ether (ETH)?", "what-is-ethereum": "Čo je to Ethereum?", diff --git a/src/intl/sl/common.json b/src/intl/sl/common.json index c1934601fba..5fdd5d81061 100644 --- a/src/intl/sl/common.json +++ b/src/intl/sl/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Abstrakcija računa", "about-ethereum-org": "O ethereum.org", "about-us": "O nas", + "adding-desci-projects": "Dodajanje projektov DeSci", + "adding-developer-tools": "Dodajanje orodij za razvijalce", + "adding-exchanges": "Dodajanje borz", + "adding-glossary-terms": "Dodajanje izrazov v slovar", + "adding-staking-products": "Dodajanje izdelkov za zastavljanje", + "adding-wallets": "Dodajanje denarnic", + "account-abstraction": "Abstrakcija računa", + "acknowledgements": "Zahvale", "aria-toggle-search-button": "Preklopni gumb za iskanje", "aria-toggle-menu-button": "Preklopni gumb za meni", "beacon-chain": "Oddajniška veriga", "bridges": "Mostovi blokovnih verig", + "bug-bounty": "Nagrade za odpravljanje napak", + "build": "Razvijanje", + "build-menu": "Meni za razvijanje", "clear": "Počisti", "close": "Zapri", "community": "Skupnost", "community-hub": "Središče skupnosti", "community-menu": "Meni skupnosti", "contact": "Stik", + "content-buckets": "Vsebinska vedra", + "content-resources": "Viri vsebin", "content-standardization": "Standardizacija vsebine", "contributing": "Prispevajte", "contributors": "Sodelujoči", @@ -27,7 +39,10 @@ "decentralized-identity": "Decentralizirana identiteta", "decentralized-social-networks": "Decentralizirana družabna omrežja", "decentralized-science": "DeSci - Decentralizirana znanost", + "description": "Opis elementa za krmarjenje", "defi-page": "DeFi - Decentralizirane finance", + "design": "Oblikovanje", + "design-principles": "Načela oblikovanja", "devcon": "Devcon", "developers": "Razvijalci", "developers-home": "Začetna stran za razvijalce", @@ -83,7 +98,7 @@ "feedback-card-prompt-tutorial": "Je bila ta vadnica uporabna?", "feedback-widget-thank-you-title": "Hvala za povratne informacije.", "feedback-widget-thank-you-subtitle": "Odgovorite na nekaj vprašanj in to stran še izboljšajte.", - "feedback-widget-thank-you-subtitle-ext": "Če potrebujete pomoč, se lahko obrnete na skupnost na našem portalu Discord.", + "feedback-widget-thank-you-subtitle-ext": "Če potrebujete pomoč, se lahko obrnete na skupnost na našem Discordu.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Odpri kratko anketo", "find-wallet": "Poišči denarnico", @@ -94,11 +109,11 @@ "grants": "Finančne spodbude", "grant-programs": "Program za podporo ekosistemu", "guides": "Vodiči", - "guides-hub": "Središče vodičev", + "guides-hub": "Navodila", "history-of-ethereum": "Zgodovina Ethereuma", "home": "Začetna stran", "how-ethereum-works": "Kako deluje Ethereum", - "how-to-register-an-ethereum-account": "Kako \"registrirati\" račun Ethereum", + "how-to-create-an-ethereum-account": "Kako \"ustvariti\" Ethereum račun", "how-to-revoke-token-access": "Kako pametni pogodbi preklicati dostop do vaših kripto sredstev", "how-to-swap-tokens": "Kako zamenjati žetone", "how-to-use-a-bridge": "Kako premostiti žetone na 2. raven", @@ -128,10 +143,108 @@ "loading-error-try-again-later": "Ni bilo mogoče naložiti podatkov. Ponovno poskusite kasneje.", "logo": "logotip", "mainnet-ethereum": "Glavno omrežje Ethereum", + "merge": "Združitev", "more": "Več", - "nav-developers": "Razvijalci", + "nav-about-description": "Javen odprtokodni projekt za Ethereumovo skupnost", + "nav-advanced-description": "Spoznajte tudi bolj zapletene teme", + "nav-advanced-label": "Dodatno", + "nav-basics-description": "Razumite osnove Ethereuma", + "nav-basics-label": "Osnove", + "nav-bridges-description": "Web3 se je razvil v ekosistem primarnih verig blokov na 1. ravni in rešitev za širjenje na 2. ravni", + "nav-builders-home-description": "Priročnik za razvijalce, ki delajo z Ethereumom – od razvijalcev za razvijalce", + "nav-builders-home-label": "Domača stran za razvijalce", + "nav-contribute-description": "Če potrebujete pomoč, jo lahko dobite tukaj", + "nav-contribute-label": "Prispevanje k skupnosti ethereum.org", + "nav-dao-description": "Skupnosti v lasti članov brez centralizirane oblasti", + "nav-dapps-description": "Raziščite bogat ekosistem aplikacij, ki uporabljajo Ethereum", + "nav-defi-description": "Globalna, odprta alternativa tradicionalnemu finančnemu trgu", + "nav-desci-description": "Globalna, odprta alternativa obstoječemu sistemu znanosti", + "nav-desoc-description": "Platforme, ki temeljijo na verigah blokov, za družabno interakcijo in ustvarjanje vsebin", "nav-developers-docs": "Dokumentacija za razvijalce", + "nav-developers": "Razvijalci", + "nav-did-description": "Izdajajte in si lastite edinstvene decentralizirane identifikatorje", + "nav-docs-description": "Dokumentacija, ki vam bo pomagala razumeti Ethereum in razvijati z njim", + "nav-docs-design-description": "Opis edinstvenih oblikovalskih izzivov, najboljših praks in vpogledov v raziskave uporabnikov, povezanih z web3", + "nav-docs-design-label": "Osnove oblikovanja uporabniške izkušnje/vmesnika", + "nav-docs-foundation-description": "Najpomembnejše osnove za razvijanje v Ethereumu", + "nav-docs-foundation-label": "Temeljne teme", + "nav-docs-overview-description": "Vaša domača stran z dokumentacijo za razvijalce", + "nav-docs-stack-description": "Razumite vse podrobnosti Ethereumovega sklada", + "nav-docs-stack-label": "Sklad Ethereum", + "nav-eip-description": "Standardi za opredeljevanje novih funkcij ali procesov", + "nav-eip-label": "Predlogi za izboljšanje Ethereuma (EIP)", + "nav-emerging-description": "Spoznajte druge novejše primere uporabe Ethereuma", + "nav-enterprise-description": "Poslovne aplikacije za Ethereum", + "nav-ethereum-org-description": "To spletno mesto napaja skupnost – pridružite se nam in prispevajte", + "nav-ethereum-wallets-description": "Aplikacija za interakcijo z vašim računom Ethereum", + "nav-events-description": "Decentralizacija in svoboda sodelovanja za vsakogar", + "nav-events-irl-description": "Vsak mesec se odvijajo dogodki o Ethereumu v živo in v spletu", + "nav-events-label": "Skupnosti in dogodki", + "nav-events-online-description": "V teh spletnih skupnostih je zbrano več sto tisoč Ethereumovih zanesenjakov", + "nav-find-wallet-description": "Denarnice vam omogočajo uporabo kriptovalut", + "nav-find-wallet-label": "Izberite denarnico", + "nav-gas-fees-description": "Kako se izračunajo provizije za transakcije z ETH", + "nav-get-eth-description": "Če želite uporabljati Ethereumove aplikacije, potrebujete ether (ETH)", + "nav-get-started-description": "Prvi koraki uporabe Ethereuma", + "nav-governance-description": "Postopek nadgradnje protokola Ethereum", + "nav-governance-label": "Upravljanje", + "nav-grants-description": "Seznam projektov s programi financiranja z nepovratnimi sredstvi, ki ga je pregledala skupnost", + "nav-guide-create-account-description": "Z aplikacijo denarnice lahko kdor koli kadar koli brezplačno ustvari račun Ethereum", + "nav-guide-create-account-label": "Kako ustvariti Ethereum račun", + "nav-guide-revoke-access-description": "Varna interakcija s pametnimi pogodbami in aplikacijami v Ethereumovem ekosistemu", + "nav-guide-revoke-access-label": "Preklic dostopa za pametne pogodbe", + "nav-guide-use-wallet-description": "Spoznajte, kako uporabljate vse osnovne funkcije denarnice", + "nav-guide-use-wallet-label": "Kako uporabljati denarnico", + "nav-guides-description": "Priročni postopni koraki za začetek uporabe", + "nav-guides-label": "Navodila", + "nav-history-description": "Časovnica vseh večjih razcepov in posodobitev", + "nav-history-label": "Tehnična zgodovina Ethereuma", + "nav-layer-2-description": "Cenejše in hitrejše transakcije v Ethereumovem omrežju", + "nav-learn-by-coding-description": "Orodja, ki vam pomagajo pri eksperimentiranju z Ethereumom", + "nav-local-env-description": "Izberite in nastavite sklad za razvoj v Ethereumu", + "nav-mainnet-description": "Poslovne aplikacije z verigami blokov lahko razvijate v javnem glavnem Ethereumovem omrežju", + "nav-nft-description": "Način predstavitve česar koli edinstvenega kot sredstva, ki temelji na Ethereumu", + "nav-open-research-description": "Ena glavnih Ethereumovih prednosti je njegova aktivna raziskovalna skupnost", + "nav-open-research-label": "Odprte raziskave", + "nav-overview-description": "Vsa gradiva za izobraževanje o Ethereumu", + "nav-overview-label": "Pregled", + "nav-participate-overview-description": "Pregled načinov sodelovanja", "nav-primary": "Primarna", + "nav-private-description": "Razvijalski viri za zasebni Ethereum za podjetja", + "nav-quizzes-description": "Preverite, kako dobro poznate Ethereum in kriptovalute", + "nav-quizzes-label": "Preverite svoje znanje", + "nav-refi-description": "Nadomestni ekonomski sistem, zgrajen na načelih regeneracije", + "nav-research-description": "Postopki za izboljševanje Ethereuma", + "nav-research-label": "Raziskave in razvoj", + "nav-roadmap-description": "Pot do večje razširljivosti, varnosti in trajnosti za Ethereum", + "nav-roadmap-future-description": "Vzpostavljanje Ethereuma kot robustnega in decentraliziranega omrežja", + "nav-roadmap-future-label": "Zaščita za prihodnost", + "nav-roadmap-label": "Načrt", + "nav-roadmap-scaling-description": "Posodobitve omrežja za dodatno znižanje stroškov transakcij in hitrejše delovanje", + "nav-roadmap-security-description": "Zagotavljanje, da Ethereum tudi v prihodnje ostane odporen na vse vrste napadov", + "nav-roadmap-security-label": "Izboljšana varnost", + "nav-roadmap-ux-description": "Uporaba Ethereuma mora biti preprostejša", + "nav-run-a-node-description": "Postanite popolnoma suvereni, medtem ko pomagate varovati omrežje", + "nav-security-description": "Naučite se najboljših praks pri uporabi kriptovalut", + "nav-smart-contracts-description": "Osnovni gradniki Ethereumovega ekosistema", + "nav-stablecoins-description": "Stabilni kovanci so Ethereumovi žetoni, zasnovani tako, da ohranijo fiksno vrednost", + "nav-stake-description": "Zaslužite nagrade, tako da zavarujete Ethereum", + "nav-stake-label": "Zastavljanje", + "nav-staking-home-description": "Pregled različnih možnosti zastavljanja", + "nav-staking-pool-description": "Pridružite se drugim, zastavite poljubno količino ETH in si prislužite nagrade", + "nav-staking-pool-label": "Skupno zastavljanje", + "nav-staking-saas-label": "Zastavljanje s storitvijo", + "nav-staking-solo-label": "Samostojno zastavljanje", + "nav-start-building-description": "Koristne informacije za novince", + "nav-translation-program-description": "Skupna prizadevanja za prevod spletnega mesta ethereum.org v vse jezike", + "nav-tutorials-description": "Pregledan seznam vadnic skupnosti", + "nav-use-cases-description": "Odkrijte različne zamisli za uporabo Ethereuma", + "nav-what-is-ether-description": "Valuta aplikacij na Ethereumu", + "nav-what-is-ethereum-description": "Razumite, zakaj je Ethereum poseben", + "nav-what-is-web3-label": "Kaj je Web3?", + "nav-what-is-web3-description": "Alternativa centraliziranim monopolistom, ki narekujejo pravila", + "nav-whitepaper-description": "Izvirna bela knjiga o Ethereumu, ki jo je leta 2014 napisal Vitalik Buterin", + "nav-zkp-description": "Način dokazovanja veljavnosti izjave brez razkrivanja same izjave", "nft-page": "NFT-ji - Nezamenljivi žetoni", "nfts": "NFT-ji", "no": "Ne", @@ -140,6 +253,8 @@ "page-developers-aria-label": "Meni za razvijalce", "page-index-meta-title": "Začetna stran", "page-last-updated": "Zadnja posodobitev strani", + "participate": "Sodelovanje", + "participate-menu": "Meni za sodelovanje", "pbs": "Ločitev med predlagateljem in sestavljalcem", "pools": "Skupno zastavljanje", "privacy-policy": "Pravilnik o zasebnosti", @@ -150,6 +265,8 @@ "refresh": "Osvežite stran.", "return-home": "vrni se domov", "roadmap": "Načrt strani Ethereum", + "research": "Raziskave", + "research-menu": "Meni za raziskave", "resources": "Prevajalski viri", "regenerative-finance": "ReFi - Regenerativne finance", "run-a-node": "Upravljajte vozlišče", @@ -164,6 +281,8 @@ "search-box-blank-state-text": "Začnite iskati!", "search-eth-address": "To je videti kot naslov Ethereum. Ne zagotavljamo podatkov za posamezne naslove. Poskusite ga poiskati v pregledovalniku blokov, kot je", "search-no-results": "Ni rezultatov iskanja", + "security": "Varnost", + "single-slot-finality": "", "statelessness": "Brezdomovinstvo", "see-contributors": "Pokaži sodelavce", "set-up-local-env": "Nastavitev lokalnega okolja", @@ -171,7 +290,6 @@ "show-all": "Prikaži vse", "show-less": "Prikaži manj", "site-description": "Ethereum je globalna, decentralizirana platforma za denar in nove vrste aplikacij. V Ethereumu lahko pišete programsko kodo, ki upravlja denar, in gradite aplikacije, ki so dostopne povsod po svetu.", - "site-title": "ethereum.org", "skip-to-main-content": "Preskoči na glavno vsebino", "smart-contracts": "Pametne pogodbe", "stablecoins": "Stabilni kovanci", @@ -180,6 +298,7 @@ "start-here": "Začnite tukaj", "style-guide": "Slogovni priročnik", "solo": "Samostojno zastavljanje", + "support": "Podpora", "terms-of-use": "Pogoji uporabe", "translation-banner-body-new": "To stran vidite v angleščini, ker je še nismo prevedli. Pomagajte nam prevesti to vsebino.", "translation-banner-body-update": "Na voljo je nova različica te strani, vendar je zaenkrat samo v angleščini. Pomagajte nam prevesti najnovejšo različico.", @@ -190,12 +309,14 @@ "translation-banner-no-bugs-title": "Brez napak!", "translation-banner-no-bugs-content": "Ta stran se ne prevaja. Namenoma smo jo za zdaj pustili v angleščini.", "translation-banner-no-bugs-dont-show-again": "Ne prikaži več", + "translation-program": "Program prevajanja", "try-using-search": "Da bi našli, kar iščete, poskusite z uporabo iskalnika ali", "tutorials": "Vadnice", "up": "Gor", + "use": "Uporaba", "use-ethereum": "Uporaba Ethereuma", "use-ethereum-menu": "Meni Uporaba Ethereuma", - "user-experience": "User experience", + "use-menu": "Meni za uporabo", "verkle-trees": "Verklejeva drevesa", "wallets": "Denarnice", "we-couldnt-find-that-page": "Te strani ni mogoče najti", diff --git a/src/intl/sr/common.json b/src/intl/sr/common.json index a8eb8787ac4..9bdec43f6f0 100644 --- a/src/intl/sr/common.json +++ b/src/intl/sr/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Apstrakcija naloga", "about-ethereum-org": "O ethereum.org", "about-us": "O nama", + "adding-desci-projects": "Dodavanje Desci projekata", + "adding-developer-tools": "Dodavanje alata za programere", + "adding-exchanges": "Dodavanje menjačnica", + "adding-glossary-terms": "Dodavanje termina u rečnik", + "adding-staking-products": "Dodavanje ulagačkih proizvoda", + "adding-wallets": "Dodavanje novčanika", + "account-abstraction": "Apstrakcija naloga", + "acknowledgements": "Zahvalnost", "aria-toggle-search-button": "Dugme za pretragu", "aria-toggle-menu-button": "Dugme menija", "beacon-chain": "Beacon lanac", "bridges": "Blokčejn mostovi", + "bug-bounty": "Lov na bagove", + "build": "Gradnja", + "build-menu": "Meni gradnje", "clear": "Obriši", "close": "Zatvori", "community": "Zajednica", "community-hub": "Čvorište zajednice", "community-menu": "Meni Zajednice", "contact": "Kontakt", + "content-buckets": "Grupe sadržaja", + "content-resources": "Resursi za sadržaj", "content-standardization": "Standardizacija sadržaja", "contributing": "Doprinesi", "contributors": "Saradnici", @@ -27,7 +39,10 @@ "decentralized-identity": "Decentralizovan identitet", "decentralized-social-networks": "Decentralizovane društvene mreže", "decentralized-science": "DeSci - Decentralizovana nauka", + "description": "Opis za stavku navigacije", "defi-page": "DeFi - Decentralizovane finansije", + "design": "Dizajn", + "design-principles": "Principi dizajna", "devcon": "Devcon", "developers": "Programeri", "developers-home": "Kuća programera", @@ -51,7 +66,7 @@ "documentation": "Dokumentacija", "down": "Nadolе", "ecosystem": "Ekosistem", - "edit-page": "Izmeni stranicu", + "edit-page": "Izmenite stranicu", "ef-blog": "Blog Ethereum fondacije", "eips": "Predlozi za poboljšanje Ethereum-a", "energy-consumption": "Ethereum potrošnja energije", @@ -83,22 +98,22 @@ "feedback-card-prompt-tutorial": "Da li vam je ovaj tutorijal bio od pomoći?", "feedback-widget-thank-you-title": "Hvala na povratnim informacijama!", "feedback-widget-thank-you-subtitle": "Poboljšajte ovu stranicu tako što ćete odgovoriti na nekoliko pitanja.", - "feedback-widget-thank-you-subtitle-ext": "Ako vam je potrebna pomoć, možete se obratiti zajednici na našem Diskordu.", + "feedback-widget-thank-you-subtitle-ext": "Ako vam je potrebna pomoć, možete se obratiti zajednici na našem Discordu.", "feedback-widget-thank-you-timing": "2–3 minute", "feedback-widget-thank-you-cta": "Otvori kratku anketu", "find-wallet": "Pronađi novčanik", "future-proofing": "Sigurno za budućnost", "get-eth": "Uzmi ETH", "get-involved": "Uključi se", - "get-started": "Započni", + "get-started": "Počnite", "grants": "Odobrenja", "grant-programs": "Program grantova za podršku ekosistemu", "guides": "Vodiči", - "guides-hub": "Centar za vodiče", + "guides-hub": "Vodiči", "history-of-ethereum": "Istorija Ethereum-a", "home": "Početna", "how-ethereum-works": "Kako Ethereum funkcioniše", - "how-to-register-an-ethereum-account": "Kako registrovati Ethereum nalog", + "how-to-create-an-ethereum-account": "Kako da kreirate Ethereum nalog", "how-to-revoke-token-access": "Kako ukinuti pristup pametnog ugovora vašim kripto fondovima", "how-to-swap-tokens": "Kako razmeniti tokene", "how-to-use-a-bridge": "Kako premostiti tokene na nivo 2", @@ -128,11 +143,111 @@ "loading-error-try-again-later": "Nije moguće učitati podatke. Pokušajte ponovo kasnije.", "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Spajanje", "more": "Više", - "nav-developers": "Programeri", + "nav-about-description": "Javni, projekat otvorenog koda za Ethereum zajednicu", + "nav-advanced-description": "Saznajte više od složenijim temama", + "nav-advanced-label": "Napredno", + "nav-basics-description": "Shvatite osnove Ethereuma", + "nav-basics-label": "Osnove", + "nav-bridges-description": "Web3 se razvio u ekosistem primarnih L1 lanaca blokova i L2 rešenja za skaliranje", + "nav-builders-home-description": "Priručnik za graditelje za Ethereum – od graditelja, za graditelje", + "nav-builders-home-label": "Početna stanica za graditelje", + "nav-contribute-description": "Ukoliko želite da pomognete, ovo će vam biti vodič", + "nav-contribute-label": "Doprinos ethereum.org", + "nav-dao-description": "Zajednice koje su u vlasništvu članova bez centralizovanog autoriteta", + "nav-dapps-description": "Istražite bogat ekosistem aplikacija koristeći Ethereum", + "nav-defi-description": "Globalna, otvorena alternativa tradicionalnom finansijskom tržištu", + "nav-desci-description": "Globalna, otvorena alternativa trenutnom naučnom sistemu", + "nav-desoc-description": "Platforme bazirane na lancima blokova za društvenu interakciju i kreiranje sadržaja", "nav-developers-docs": "Dokumentacija za programere", + "nav-developers": "Programeri", + "nav-did-description": "Izdajte i posedujte sopstvene jedinstvene decentralizovane identifikatore", + "nav-docs-description": "Dokumenti koji će vam pomoći da razumete i gradite uz Ethereum", + "nav-docs-design-description": "Opis jedinstvenih dizajnerskih izazova mreže web3, najbolje prakse i uvidi istraživanja korisnika", + "nav-docs-design-label": "Osnove dizajna korisničkog doživljaja/korisničkog interfejsa", + "nav-docs-foundation-description": "Suštinske osnove za razvoj na Ethereumu", + "nav-docs-foundation-label": "Temeljne teme", + "nav-docs-overview-description": "Početna stranica za dokumente za programere", + "nav-docs-stack-description": "Shvatite sve detalje Ethereum steka", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Standardi koji određuju nove funkcije ili procese", + "nav-eip-label": "Predlozi za poboljšanje Ethereuma (EIP)", + "nav-emerging-description": "Upoznajte druge novije slučajeve korišćenja za Ethereum", + "nav-emerging-label": "Načini primene", + "nav-enterprise-description": "Poslovne aplikacije za Ethereum", + "nav-ethereum-org-description": "Ovaj veb-sajt vodi zajednica – pridružite nam se, pa i sami dajte svoj doprinos", + "nav-ethereum-wallets-description": "Aplikacija za interakciju sa Ethereum nalogom", + "nav-events-description": "Decentralizacija i sloboda učešća za svakoga", + "nav-events-irl-description": "Svakog meseca se održavaju velika Ethereum dešavanja, kako uz lično prisustvo, tako i na mreži", + "nav-events-label": "Zajednice i događaji", + "nav-events-online-description": "Na stotine hiljada Ethereum entuzijasta stvara u ovim zajednicama na mreži", + "nav-find-wallet-description": "Novčanici vam omogućavaju korišćenje kriptovaluta", + "nav-find-wallet-label": "Odaberite novčanik", + "nav-gas-fees-description": "Kako se računaju provizije za transakciju ETH", + "nav-get-eth-description": "Potreban vam je ether (ETH) da biste koristili Ethereum aplikacije", + "nav-get-started-description": "Prvi korak ka korišćenju Ethereuma", + "nav-governance-description": "Postupak uključen u nadogradnju Ethereum protokola", + "nav-governance-label": "Nadzor", + "nav-grants-description": "Uređena lista koju je pripremila naša zajednica i koja se odnosi na projekte sa obezbeđenim programima finansiranja grantova", + "nav-guide-create-account-description": "Svako može da kreira Ethereum nalog bilo kad, besplatno uz aplikaciju novčanika", + "nav-guide-create-account-label": "Kako kreirati Ethereum nalog", + "nav-guide-revoke-access-description": "Ostanite bezbedni pri interakciji sa pametnim ugovorima i aplikacijama u ekosistemu Ethereum", + "nav-guide-revoke-access-label": "Kako da opozovete pristup pametnom ugovoru", + "nav-guide-use-wallet-description": "Saznajte kako da upravljate svim osnovnim funkcijama novčanika", + "nav-guide-use-wallet-label": "Kako koristiti novčanik", + "nav-guides-description": "Praktični, postupni vodiči kao pomoć pri prvim koracima", + "nav-guides-label": "Vodiči", + "nav-history-description": "Vremenska linija svih glavnih račvanja i ažuriranja", + "nav-history-label": "Tehnička istorija Ethereuma", + "nav-layer-2-description": "Jeftinije i brže transakcije za Ethereum", + "nav-learn-by-coding-description": "Alatke za olakšavanje eksperimentisanja sa Ethereumom", + "nav-local-env-description": "Odaberite i postavite Ethereum razvojni stek", + "nav-mainnet-description": "Na javnoj Ethereum glavnoj mreži mogu da se grade aplikacije lanca blokova za preduzeća", + "nav-nft-description": "Način da se bilo šta jedinstveno prikaže kao sredstvo zasnovano na Ethereumu", + "nav-open-research-description": "Jedna od primarnih prednosti Ethereuma je njegova aktivna istraživačka zajednica", + "nav-open-research-label": "Otvori istraživanje", + "nav-overview-description": "Sve u vezi sa Ethereum edukacijom", + "nav-overview-label": "Pregled", + "nav-participate-overview-description": "Pregled načina učestvovanja", "nav-primary": "Primarna", - "nft-page": "NFT - Nezamenljivi tokeni", + "nav-private-description": "Resursi za programere za Ethereum kod privatnih poduzeća", + "nav-quizzes-description": "Otkrijte koliko dobro se razumete u Ethereum i kriptovalute", + "nav-quizzes-label": "Testirajte svoje znanje", + "nav-refi-description": "Alternativa ekonomskom sistemu izgrađena na regenerativnim principima", + "nav-research-description": "Postupci koji se koriste za poboljšanje Ethereuma", + "nav-research-label": "Istraživanje i razvoj", + "nav-roadmap-description": "Putanja do većeg rasta, bezbednosti i održivosti za Ethereum", + "nav-roadmap-future-description": "Učvršćivanje Ethereuma kao snažne i decentralizovane mreže", + "nav-roadmap-future-label": "Sigurno za budućnost", + "nav-roadmap-label": "Plan", + "nav-roadmap-scaling-description": "Ažuriranja mreže radi daljeg smanjenja troškova transakcije i brzine", + "nav-roadmap-security-description": "Vodite računa da Ethereum ostane otporan na sve vrste napada u budućnosti", + "nav-roadmap-security-label": "Poboljšana bezbednost", + "nav-roadmap-ux-description": "Korišćenje Ethereuma treba da se pojednostavi", + "nav-run-a-node-description": "Postanite potpuno suvereni dok pomažete u obezbeđivanju mreže", + "nav-security-description": "Saznajte koje su najbolje prakse pri korišćenju kriptovalute", + "nav-smart-contracts-description": "Osnovni gradivni blokovi Ethereum ekosistema", + "nav-stablecoins-description": "Stabilni novčići su Ethereum tokeni osmišljeni da ostanu na fiksnoj vrednosti", + "nav-stake-description": "Zaradite nagrade za obezbeđivanje Ethereuma", + "nav-stake-label": "Ulog", + "nav-staking-home-description": "Pregled različitih opcija za ulaganje", + "nav-staking-pool-description": "Stavite ulog i zarađujte nagrade sa bilo kojom količinom ETH-a tako što ćete se pridružiti sa drugima", + "nav-staking-pool-label": "Udruženo ulaganje", + "nav-staking-saas-description": "Treća lica upravljaju radom vašeg klijenta za validatore", + "nav-staking-saas-label": "Ulaganje uz uslugu", + "nav-staking-solo-label": "Samostalno ulaganje", + "nav-start-building-description": "Korisne informacije za novajlije", + "nav-translation-program-description": "Zajednički napor da se ethereum.org prevede na sve jezike", + "nav-tutorials-description": "Uređena lista tutorijala zajednice", + "nav-use-cases-description": "Otkrijte različite ideje za korišćenje Ethereuma", + "nav-what-is-ether-description": "Valuta Ethereumovih aplikacija", + "nav-what-is-ethereum-description": "Uvidite zbog čega je Ethereum poseban", + "nav-what-is-web3-label": "Šta je Web3?", + "nav-what-is-web3-description": "Alternativa centralizovanim monopolima koji diktiraju pravila", + "nav-whitepaper-description": "Originalni beli papir za Ethereum napisan 2014. godine, autor Vitalik Buterin", + "nav-zkp-description": "Način da se dokaže verodostojnost izvoda bez pokazivanja samog izvoda", + "nft-page": "NFT - Nezamenljivi tokeni", "nfts": "Nezamenjivi tokeni", "no": "Ne", "on-this-page": "Na ovoj stranici", @@ -140,6 +255,7 @@ "page-developers-aria-label": "Meni programera", "page-index-meta-title": "Početna", "page-last-updated": "Stranica poslednji put ažurirana", + "participate-menu": "Meni učestvovanja", "pbs": "Razdvajanje predlagača-graditelja", "pools": "Udruženo ulaganje", "privacy-policy": "Politika privatnosti", @@ -150,6 +266,8 @@ "refresh": "Molimo osvežite stranicu.", "return-home": "povratak na početnu stranicu", "roadmap": "Plan mreže Ethereum", + "research": "Istraživanje", + "research-menu": "Meni istraživanja", "resources": "Resursi za prevođenje", "regenerative-finance": "ReFi - Regenerativne finansije", "run-a-node": "Pokretanje čvora", @@ -164,11 +282,12 @@ "search-box-blank-state-text": "Traži dalje!", "search-eth-address": "Ovo izgleda kao Ethereum adresa. Ne pružamo podatke specifične adresama. Pokušajte pretragu na block exploreru kao", "search-no-results": "Nema rezultata za vašu pretragu", + "security": "Bezbednost", "single-slot-finality": "Jednokratna konačnost", "statelessness": "Stanje bez pripadnosti", "see-contributors": "Pogledaj saradnike", - "set-up-local-env": "Postavi lokalno okruženje", "sharding": "Usitnjavanje", + "set-up-local-env": "Postavite lokalno okruženje", "show-all": "Prikaži sve", "show-less": "Prikaži manje", "site-description": "Ethereum je globalna, decentralizovana platforma za novac i nove vrste aplikacija. Na Ethereumu možete pisati kod koji kontroliše novac i graditi aplikacije dostupne bilo gde u svetu.", @@ -181,6 +300,7 @@ "start-here": "Počni ovde", "style-guide": "Stilski priručnik", "solo": "Samostalno ulaganje", + "support": "Podrška", "terms-of-use": "Uslovi korišćenja", "translation-banner-body-new": "Ovu stranicu čitate na engleskom jer je još nismo preveli. Pomozite nam da prevedemo ovaj sadržaj.", "translation-banner-body-update": "Postoji novija verzija ove stranice ali je trenutno dostupna samo na engleskom. Pomozite nam da prevedemo poslednju verziju.", @@ -191,17 +311,18 @@ "translation-banner-no-bugs-title": "Ovo nije greška!", "translation-banner-no-bugs-content": "Ova stranica nije prevođena. Namerno smo ostavili ovu stranicu na engleskom jeziku za sada.", "translation-banner-no-bugs-dont-show-again": "Ne prikazuj ponovo", + "translation-program": "Program Prevođenja", "try-using-search": "Pokušajte da koristite funkciju pretrage da biste pronašli to što tražite", "tutorials": "Tutorijali", "up": "Gore", + "use": "Korišćenje", "use-ethereum": "Koristi Ethereum", "use-ethereum-menu": "Koristi Ethereum meni", - "user-experience": "User experience", + "use-menu": "Meni korišćenja", "verkle-trees": "Verkle stabla", "wallets": "Novčanici", "we-couldnt-find-that-page": "Nismo uspeli da pronađemo tu stranicu", "web3": "Šta je Web3?", - "web3-title": "Web3", "website-last-updated": "Websajt poslednji put ažuriran", "what-is-ether": "Šta je ether (ETH)?", "what-is-ethereum": "Šta je Ethereum?", diff --git a/src/intl/sw/common.json b/src/intl/sw/common.json index 3d86e370b48..5f00e7e51a5 100644 --- a/src/intl/sw/common.json +++ b/src/intl/sw/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Ubora wa akaunti", "about-ethereum-org": "Kuhusu ethereum.org", "about-us": "Kuhusu sisi", + "adding-desci-projects": "Kuongeza mipango ya Desci", + "adding-developer-tools": "Kuongeza zana za watengenezaji", + "adding-exchanges": "Kuongeza masoko", + "adding-glossary-terms": "Kuongeza Farahasa ya Maneno", + "adding-staking-products": "Kuongeza bidhaa za hisa", + "adding-wallets": "Kuongeza pochi", + "account-abstraction": "Ubora wa akaunti", + "acknowledgements": "Shukurani", "aria-toggle-search-button": "Badilisha kitufe cha utafutaji", "aria-toggle-menu-button": "Badilisha kitufe cha orodha", "beacon-chain": "Mlolongo wa beacon", "bridges": "Madaraja ya blockchain", + "bug-bounty": "Mtafuta mdudu", + "build": "Unda", + "build-menu": "Unda menyu", "clear": "Futa", "close": "Funga", "community": "Jamii", "community-hub": "Msingi wa jamii", "community-menu": "Menyu ya Jamii", "contact": "Wasiliana", + "content-buckets": "Vikapu vya yaliomo", + "content-resources": "Rasilimali za maudhui", "content-standardization": "Usanifishaji wa maudhui", "contributing": "Kuchangia", "contributors": "Wachangiaji", @@ -27,7 +39,10 @@ "decentralized-identity": "Utambulisho uliogatuliwa", "decentralized-social-networks": "Mitandao ya kijamiii iliogatuliwa", "decentralized-science": "DeSci - Sayansi iliogatuliwa", + "description": "Ufafanuzi wa kipengee cha usogezaji", "defi-page": "DeFi - Fedha zisizotawalia", + "design": "Kubuni", + "design-principles": "Kanuni za kubuni", "devcon": "Devkon", "developers": "Wasanidi programu", "developers-home": "Nyumba ya Wasanidi Programu", @@ -59,7 +74,6 @@ "enterprise-menu": "Oradha ya biashara", "esp": "Programu ya usaidizi kwenye ikolojia", "eth-current-price": "Bei ya sasa ya ETH(USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Mpango wa malipo ya watafuta hitilafu", "consensus-when-shipping": "Inasfirishwa lini?", "ethereum-upgrades": "Visasisho vya Ethereum", @@ -83,7 +97,7 @@ "feedback-card-prompt-tutorial": "Umesaidika na mafunzo haya?", "feedback-widget-thank-you-title": "Asante kwa maoni yako!", "feedback-widget-thank-you-subtitle": "Fanya ukurasa huu kua bora zaidi kwa kujibu maswali kadhaa.", - "feedback-widget-thank-you-subtitle-ext": "Kwa msaada zaidi unaweza kufikia jumuiya yetu kwenye Discord.", + "feedback-widget-thank-you-subtitle-ext": "Kwa msaada zaidi unaweza kufikia jumuiya yetu kwenye Discord yetu.", "feedback-widget-thank-you-timing": "Dakika 2-3", "feedback-widget-thank-you-cta": "Fungua uangalizi mfupi", "find-wallet": "Tafuta pochi", @@ -94,11 +108,10 @@ "grants": "Tunzo", "grant-programs": "Programu za ikolojia na tunzo", "guides": "Maelekezo", - "guides-hub": "Kitovu cha maelekezo", + "guides-hub": "Jinsi ya kutumia miongozo", "history-of-ethereum": "Historia ya Ethereum", "home": "Nyumbani", "how-ethereum-works": "Jinsi Ethereum inavyofanya kazi", - "how-to-register-an-ethereum-account": "Jinsi ya \"kujisajili\" kwenye akaunti ya Ethereum", "how-to-revoke-token-access": "Jinsi ya Kubatilisha mkataba erevu usifikie fedha zako za kripto", "how-to-swap-tokens": "Jinsi ya kubadili tokeni", "how-to-use-a-bridge": "Jinsi ya kuvusha tokeni kwenda safu ya namba 2", @@ -121,17 +134,111 @@ "learn-more": "Jifunze zaidi", "less": "Kidogo", "light-mode": "Nyepesi", - "listing-policy-disclaimer": "Bidhaa zote zilizo zilizoorodheshwa kwenye ukurasa huu sio uthibitisho rasmi, na zinatolewea kwa kusidi la chanzo cha taarifa tu. kama unataka kuongeza bidhaa ama kutuma maoni juu ya sera ongea suala kwenye GitHub.", + "listing-policy-disclaimer": "Bidhaa zote zilizo zilizoorodheshwa kwenye ukurasa huu sio uthibitisho rasmi, na zinatolewea kwa kusidi la chanzo cha taarifa tu. kama unataka kuongeza bidhaa ama kutuma maoni juu ya sera ongea suala kwenye Github.", "loading": "Inapakia...", "loading-error": "Tatizo katika upakiaji.", "loading-error-refresh": "Kuna tatizo, tafadhali fanyiza upya.", "loading-error-try-again-later": "Imeshindwa kupakia data. Jaribu tena baadae.", "logo": "nembo", "mainnet-ethereum": "Mtandao kuu wa Ethereum", + "merge": "Unganisha", "more": "Zaidi", - "nav-developers": "Wasanidi programu", + "nav-about-description": "Mradi wa huria wa umma kwa ajili ya jamii ya Ethereum", + "nav-advanced-description": "Pata maelezo kuhusu mada nzito zaidi", + "nav-advanced-label": "Ya hali ya juu", + "nav-basics-description": "Elewa mambo ya msingi ya Ethereum", + "nav-basics-label": "Mambo ya msingi", + "nav-bridges-description": "Web3 imekua mfumo wa ikolojia wa minyororo bloku ya msingi ya L1 na programu za uboreshaji wa L2", + "nav-builders-home-description": "Mwongozo wa mjenzi wa Ethereum—na wajenzi, kwa wajenzi", + "nav-builders-home-label": "Nyumbani kwa mjenzi", + "nav-contribute-description": "Ikiwa unataka usaidizi, hii itakuongoza", + "nav-contribute-label": "Kuchangia kwenye ethereum.org", + "nav-dao-description": "Jamii zinazomilikiwa na wanachama bila mamlaka ya serikali", + "nav-dapps-description": "Gundua mfumo ikolojia wenye programu nyingi kwa kutumia Ethereum", + "nav-defi-description": "Mfumo mbadala huria wa kimataifa kwa soko la fedha la zamani", + "nav-desci-description": "Mfumo mbadala huria wa kimataifa kwa mfumo wa sasa wa kisayansi", + "nav-desoc-description": "Mifumo ya mnyororo bloku ya mawasiliano ya jamii na uundaji wa maudhui", "nav-developers-docs": "Nyaraka za wasanidi programu", + "nav-developers": "Wasanidi programu", + "nav-did-description": "Toa na umiliki vitambulishi vyako vya kipekee vilivyogatuliwa", + "nav-docs-description": "Hati za kukusaidia kuelewa na kujenga kwa Ethereum", + "nav-docs-design-description": "Ufafanuzi wa changamoto za kipekee za muundo wa web3, desturi bora na maarifa ya utafiti wa mtumiaji", + "nav-docs-design-label": "Mambo ya msingi ya muundo wa UX/UI", + "nav-docs-foundation-description": "Mambo ya msingi ya kuimarika kwenye Ethereum", + "nav-docs-overview-description": "Nyumbani kwako kwa hati za wasanidi programu", + "nav-docs-stack-description": "Elewa maelezo yote ya bloku ya Ethereum", + "nav-eip-description": "Viwango vinavyobainisha vipengele au michakato mipya", + "nav-eip-label": "Mapendekezo ya uboreshaji wa Ethereum (EIP)", + "nav-emerging-description": "Fahamu visa vingine vipya zaidi vya matumizi vya Ethereum", + "nav-enterprise-description": "Programu za biashara za Ethereum", + "nav-ethereum-org-description": "Tovuti hii inachochewa kijamii—jiunge nasi na uchangie pia", + "nav-ethereum-wallets-description": "Programu ya kutumia akaunti yako ya Ethereum", + "nav-events-description": "Ugatuaji na uhuru wa kushiriki kwa kila mtu", + "nav-events-irl-description": "Kila mwezi kuna matukio makubwa ya Ethereum ya ana kwa ana au mtandaoni", + "nav-events-label": "Jamii na matukio", + "nav-events-online-description": "Mamia ya maelfu ya wapenzi wa Ethereum wako katika jamii hizi za mtandaoni", + "nav-find-wallet-description": "Pochi hukuruhusu kutumia kripto", + "nav-find-wallet-label": "Chagua pochi yako", + "nav-gas-fees-description": "Jinsi ada za muamala wa ETH zinazovyokokotolewa", + "nav-gas-fees-label": "Ada ya gesi", + "nav-get-eth-description": "Unahitaji ether (ETH) ili kutumia programu za Ethereum", + "nav-get-started-description": "Hatua zako za kwanza kutumia Ethereum", + "nav-governance-description": "Mchakato unaohusika katika kuboresha itifaki ya Ethereum", + "nav-governance-label": "Utawala", + "nav-grants-description": "Orodha iliyorekebishwa na jamii yetu kuhusu miradi inayotoa mipango ya fedha za ruzuku", + "nav-guide-create-account-description": "Yeyote anaweza kufungua akaunti ya Ethereum wakati wowote, bila malipo kwa programu ya pochi", + "nav-guide-revoke-access-description": "Endelea kuwa salama wakati wa kutumia mikataba-erevu na programu katika mfumo ikolojia wa Ethereum", + "nav-guide-revoke-access-label": "Jinsi ya kubatilisha ufikiaji wa mkataba-erevu", + "nav-guide-use-wallet-description": "Pata maelezo ya jinsi ya kutumia vipengele vyote vya msingi vya pochi", + "nav-guide-use-wallet-label": "Jinsi ya kutumia pochi", + "nav-guides-description": "Miongozo halisi ya hatua kwa hatua ya kukusaidia kuanza", + "nav-guides-label": "Jinsi ya kutumia miongozo", + "nav-history-description": "Ratiba ya migawanyiko na taarifa zote kuu", + "nav-history-label": "Historia ya kiufundi ya Ethereum", + "nav-layer-2-description": "Miamala nafuu na ya haraka ya Ethereum", + "nav-learn-by-coding-description": "Zana za kukusaidia kujaribu Ethereum", + "nav-local-env-description": "Chagua na ufungue bloku ya maendeleo yako ya Ethereum", + "nav-mainnet-description": "Programu za mnyororo wa bloku za biashara zinaweza kuundwa kwenye Mtandao Mkuu wa umma wa Ethereum", + "nav-nft-description": "Njia ya kuwakilisha kitu chochote cha pekee kama mali zilizojengwa na Ethereum", + "nav-open-research-description": "Moja ya nguvu za msingi za Ethereum ni jamii yake ya utafiti wa mara kwa mara", + "nav-open-research-label": "Tafiti zilizowazi", + "nav-overview-description": "Masuala yote yanayohusu elimu ya Ethereum", + "nav-participate-overview-description": "Muhtasari kuhusu jinsi ya kushiriki", "nav-primary": "Msingi", + "nav-quizzes-description": "Fahamu jinsi ya kuelewa vyema Ethereum na cryptocurrency", + "nav-quizzes-label": "Jaribu maarifa yako", + "nav-refi-description": "Mfumo wa uchumi mbadala uliojengwa kwa kanuni endelevu", + "nav-research-description": "Michakato inayotumiwa kuboresha Ethereum", + "nav-research-label": "Utafiti na maendeleo", + "nav-roadmap-description": "Njia ya uimarikaji, usalama na uendelevu zaidi wa Ethereum", + "nav-roadmap-future-description": "Kuimarisha Ethereum kama mtandao madhubuti na uliogatuliwa", + "nav-roadmap-future-label": "Uthibitishaji-wa-badae", + "nav-roadmap-label": "Mpango", + "nav-roadmap-scaling-description": "Taarifa za mtandao ili kupunguza zaidi gharama na kasi", + "nav-roadmap-security-description": "Kuhakiklisha kuwa Ethereum inaendelea kuwa imara kwa aina zote za mashambulizi siku zijazo", + "nav-roadmap-security-label": "Usalama ulioimarishwa", + "nav-roadmap-ux-description": "Kutumia Ethereum kunahitaji kurahisishwa", + "nav-run-a-node-description": "Kuwa huru kikamilifu huku ukisaidia kulinda mtandao", + "nav-security-description": "Jifunze desturi bora unapotumia sarafu ya kripto", + "nav-smart-contracts-description": "Bloku za msingi za ujenzi za mfumo ikolojia wa Ethereum", + "nav-stablecoins-description": "Sarafu imara ni token za Ethereum zilizoundwa ili kusalia kwenye thamani isiyobadilika", + "nav-stake-description": "Pata zawadi kwa kulinda Ethereum", + "nav-stake-label": "Hisa", + "nav-staking-home-description": "Muhtasari wa machaguo tofauti ya kusimamisha", + "nav-staking-pool-description": "Simamisha na upate zawadi kwa kiasi chochote cha ETH kwa kujiunga na wengine", + "nav-staking-pool-label": "Usimamishaji wa hisa wa kundi", + "nav-staking-saas-label": "Usimamishaji wa huduma", + "nav-staking-solo-label": "Usimamishaji binafsi wa hisa", + "nav-start-building-description": "Taarifa muhimu kwa wanaoanza", + "nav-translation-program-description": "Jitihada za pamoja za kutafsiri ethereum.org hadi lugha zote", + "nav-tutorials-description": "Orodha iliyorekebishwa ya mafunzo ya jamii", + "nav-use-cases-description": "Gundua hoja tofauti za matumizi ya Ethereum", + "nav-what-is-ether-description": "Sarafu ya programu za Ethereum", + "nav-what-is-ethereum-description": "Elewa kile ambacho kinafanya Ethereum kuwa ya kipekee", + "nav-what-is-web3-label": "Je, Web3 ni nini?", + "nav-what-is-web3-description": "Mbadala wa ukiritimba wa serikali unaoamua sheria", + "nav-whitepaper-description": "Karatasi nyeupe asili ya Ethereum iliyoandikwa na Vitalik Buterin in 2014", + "nav-zkp-description": "Njia ya kuimarisha uthibitisho wa taarifa bila kufichua taarifa yenyewe", "nft-page": "NFTs - Ishara zisizoambukiza", "nfts": "NFTs", "no": "Hapana", @@ -140,6 +247,8 @@ "page-developers-aria-label": "Menyu kwa Wasanidi Programu", "page-index-meta-title": "Nyumbani", "page-last-updated": "Ukurasa ulisasishwa mwisho", + "participate": "Shiriki", + "participate-menu": "Menyu ya kushiriki", "pbs": "Utengano wa mpendekezaji-mjenzi", "pools": "Usimamishaji wa hisa wa kundi", "privacy-policy": "Sera ya faragha", @@ -150,6 +259,8 @@ "refresh": "Tafadhali onyesha ukurasa upya.", "return-home": "rudi nyumbani", "roadmap": "Barabara ya Ethereum", + "research": "Utafiti", + "research-menu": "Menyu ya utafiti", "resources": "Rasilimali za tafsiri", "regenerative-finance": "ReFi - Uzalishaji upya wa fedha", "run-a-node": "Endesha nodi", @@ -164,6 +275,7 @@ "search-box-blank-state-text": "Umabali wa kutafuta!", "search-eth-address": "Hii inafanana na anuwani ya Ethereum. Hatutoi taarifa za anuwani yenyewe. Jaribu kuitafuta kwenye chunguzi za bloku kama", "search-no-results": "Hakuna matokeo ya ulichotafuta", + "security": "Usalama", "single-slot-finality": "Mwisho wa nafasi-moja", "statelessness": "Pasipokua na hali", "see-contributors": "Ona wachangiaji", @@ -172,15 +284,14 @@ "show-all": "Onyesha yote", "show-less": "Onyesha chache", "site-description": "Ethereum ni jukwaa la kimataifa, ambalo halitegemei wamiliki wa madaraka kwa pesa na aina mpya za programu. Kwenye Ethereum, unaweza kuandika msimbo unaodhibiti pesa, na kuunda programu zinazoweza kupatikana mahali popote ulimwenguni.", - "site-title": "ethereum.org", "skip-to-main-content": "Ruka kwenda kwenye maudhui makuu", "smart-contracts": "Mikataba erevu", - "stablecoins": "Sarafu imara", + "stablecoins": "Sarafu-imara", "stake-eth": "Weka ETH", "staking": "Kusimamisha", "start-here": "Anza hapa", - "style-guide": "Style guide", "solo": "Usimamishaji binafsi wa hisa", + "support": "Msaada", "terms-of-use": "Masharti ya matumizi", "translation-banner-body-new": "Unatazama ukurahasa huu kwa kiingereza kwasababu bado hatujautafsiri. Tusaidie kutafsiri maudhui haya.", "translation-banner-body-update": "Kuna toleo jipya la ukurasa huu ila liko kwenye Kiingereza tu hivi sasa. Tusaidie kutafsiri toleo jipya zaidi.", @@ -191,17 +302,18 @@ "translation-banner-no-bugs-title": "Hapana hitilafu hapa!", "translation-banner-no-bugs-content": "Ukurasa huu hautafsiriwi. Tumeuacha ukurasa huu kwa Kiingereza kwa sasa.", "translation-banner-no-bugs-dont-show-again": "Usionyeshe tena", + "translation-program": "Programu ya Kutafsiri", "try-using-search": "Jaribu kutumia utafutaji kupata unachotafuta", "tutorials": "Mafunzo", "up": "Juu", + "use": "Tumia", "use-ethereum": "Tumia Ethereum", "use-ethereum-menu": "Tumia orodha ya Ethereum", - "user-experience": "User experience", + "use-menu": "Tumia menyu", "verkle-trees": "Miti ya Verkle", "wallets": "Pochi", "we-couldnt-find-that-page": "Hatukuweza kupata ukurasa huo", "web3": "Je, Web3 ni nini?", - "web3-title": "Web3", "website-last-updated": "Ukurasa ulisasishwa mwisho", "what-is-ether": "Ether ni nini (ETH)?", "what-is-ethereum": "Ethereum ni nini?", diff --git a/src/intl/ta/common.json b/src/intl/ta/common.json index a11901f2e36..8d660be8a98 100644 --- a/src/intl/ta/common.json +++ b/src/intl/ta/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "கணக்குச் சுருக்கம்", "about-ethereum-org": "ethereum.org பற்றிய தகவல்கள்", "about-us": "எங்களைப் பற்றிய தகவல்கள்", + "adding-desci-projects": "டெஸ்கி திட்டங்களைச் சேர்த்தல்", + "adding-developer-tools": "உருவாக்குநர்கள் (டெவலப்பர்கள்) கருவிகளைச் சேர்த்தல்", + "adding-exchanges": "எக்ஸ்சேஞ்ச்களைச் சேர்த்தல்", + "adding-glossary-terms": "சொற்களஞ்சிய சொற்களைச் சேர்த்தல்", + "adding-staking-products": "ஸ்டேக்கிங் தயாரிப்புகளைச் சேர்த்தல்", + "adding-wallets": "வாலட்களைச் சேர்த்தல்", + "account-abstraction": "கணக்குச் சுருக்கம்", + "acknowledgements": "ஒப்புதல்கள்", "aria-toggle-search-button": "தேடல் மெனு பட்டனை நிலைமாற்றும்", "aria-toggle-menu-button": "மெனு பட்டனை நிலைமாற்றும்", "beacon-chain": "தீப்பந்த சங்கிலி", "bridges": "பிளாக்செயின் பாலங்கள்", + "bug-bounty": "பிழைக்கான ஊக்க ஊதியம்", + "build": "கட்டமைப்பு", + "build-menu": "மெனுவை கட்டமைக்கவும்", "clear": "அழி", "close": "மூடு", "community": "சமூகம்", "community-hub": "சமூக மையம்", "community-menu": "சமூகம் மெனு", "contact": "தொடர்புக்கு", + "content-buckets": "உள்ளடக்கப் பக்கெட்கள்", + "content-resources": "உள்ளடக்க வளங்கள்", "content-standardization": "தகவல் தரப்படுத்தல்", "contributing": "பங்களிக்கிறீர்கள்", "contributors": "பங்களிப்பாளர்கள்", @@ -27,7 +39,10 @@ "decentralized-identity": "பன்முனைப்படுத்தப்பட்ட அடையாளம்", "decentralized-social-networks": "பன்முனைப்படுத்தப்பட்ட சமூக வலைப்பின்னல்கள்", "decentralized-science": "DeSci - பன்முனை அறிவியல்", + "description": "நேவி உருப்படிக்கான விளக்கம்", "defi-page": "DeFi - பன்முனைப்படுத்தப்பட்ட நிதி", + "design": "வடிவமைப்பு", + "design-principles": "வடிவமைப்புக் கொள்கைகள்", "devcon": "டெவ்கான்", "developers": "உருவாக்குநர்கள் (டெவலப்பர்கள்)", "developers-home": "உருவாக்குநர்களின் முகப்பு", @@ -51,7 +66,7 @@ "documentation": "ஆவணப்படுத்துதல்", "down": "கீழே", "ecosystem": "சூழல்", - "edit-page": "பக்கத்தைத் திருத்து", + "edit-page": "பக்கத்தைத் தொகுக்க", "ef-blog": "எத்தேரியம் நிறுவன வலைப்பதிவு", "eips": "எத்தேரியம் முன்னேற்ற முன்மொழிவுகள்", "energy-consumption": "எத்தேரியம் ஆற்றல் நுகர்வு", @@ -59,7 +74,6 @@ "enterprise-menu": "நிறுவனம் மெனு", "esp": "சூழலுக்கு ஆதரவு வழங்கும் திட்டம்", "eth-current-price": "தற்போதைய ETH விலை (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "நிரற் பிழைக்கான எத்தேரியம் வெகுமதித் திட்டம்", "consensus-when-shipping": "அது எப்போது ஷிப்பிங் செய்யும்?", "ethereum-upgrades": "எத்தேரியம் மேம்பாடுகள்", @@ -75,7 +89,7 @@ "ethereum-protocol": "எத்தீரியம் நெறிமுறை", "ethereum-security": "எத்தேரியம் பாதுகாப்பு மற்றும் மோசடி தடுப்பு", "ethereum-support": "எத்தேரியம் தொடர்பான உதவி", - "ethereum-wallets": "எத்தேரியம் பணப்பைகள்", + "ethereum-wallets": "Ethereum பணப்பைகள்", "ethereum-whitepaper": "எத்தேரியம் யாதாஸ்து", "feedback-widget-prompt": "இந்தப் பக்கம் உதவியாக உள்ளதா?", "feedback-card-prompt-page": "இந்தப் பக்கம் உதவியாக இருந்ததா?", @@ -86,19 +100,18 @@ "feedback-widget-thank-you-subtitle-ext": "உங்களுக்கு உதவி தேவைப்பட்டால், எங்கள் சமூகத்தை Discord தளத்தில் தொடர்புகொள்ளலாம்.", "feedback-widget-thank-you-timing": "2–3 நிமிடம்", "feedback-widget-thank-you-cta": "சிறிய கருத்துக்கணிப்பைத் திற", - "find-wallet": "பணப்பையைத் தேடு", + "find-wallet": "பணப்பையைத் தேடுங்கள்", "future-proofing": "எதிர்காலச்-சான்று", - "get-eth": "ETHஐ பெறுக", + "get-eth": "ETH பெறுக", "get-involved": "ஈடுபடுத்திக் கொள்ளுங்கள்", - "get-started": "தொடங்கு", + "get-started": "தொடங்குக", "grants": "உதவித் தொகைகள்", "grant-programs": "சூழலுக்கான உதவித் தொகை திட்டங்கள்", "guides": "வழிகாட்டிகள்", - "guides-hub": "வழிகாட்டிகள் மையம்", + "guides-hub": "எப்படி வழிகாட்டுகிறது", "history-of-ethereum": "எத்தேரியம் வரலாறு", "home": "முகப்பு", "how-ethereum-works": "எத்தேரியம் எப்படிச் செயல்படுகிறது?", - "how-to-register-an-ethereum-account": "எத்தேரியம் கணக்கைப் \"பதிவு\" செய்வது எப்படி", "how-to-revoke-token-access": "உங்கள் கிரிப்டோ நிதியை மேம்படுத்தப்பட்ட ஒப்பந்த அணுகலை எப்படி\n மீண்டும் பெறுவது", "how-to-swap-tokens": "டோக்கன்களை மாற்றுவது எப்படி", "how-to-use-a-bridge": "டோக்கன்களை எப்படி இரண்டாம் அடுக்குடன் இணைப்பது", @@ -115,11 +128,11 @@ "last-edit": "கடைசியாகத் திருத்தப்பட்டது", "layer-2": "2ம் அடுக்கு", "learn": "கற்றுக்கொள்க", - "learn-by-coding": "குறியீடுகளை எழுதுவதன் மூலம் கற்றுக்கொள்க", + "learn-by-coding": "குறியீடுகள் மூலம் கற்க", "learn-hub": "கற்கும் கூடம்", "learn-menu": "கற்றுக்கொள்க மெனு", "learn-more": "மேலும் அறிக", - "less": "குறைந்த", + "less": "குறைவாக", "light-mode": "வெளிச்சம்", "listing-policy-disclaimer": "இந்தப் பக்கத்தில் பட்டியலிடப்பட்டுள்ள அனைத்துத் தயாரிப்புகளுக்கும் அதிகாரப்பூர்வமான ஒப்புதல்கள் வழங்கப்படவில்லை, அவை தகவல்களாக வாசிக்கப்படுவற்காக மட்டுமே வழங்கப்பட்டுள்ளன. நீங்கள் ஒரு தயாரிப்பைச் சேர்க்கவோ கொள்கையைப் பற்றிக் கருத்து வழங்கவோ விரும்பினால், GitHubக்குச் சென்று புகாரளியுங்கள்.", "loading": "ஏற்றுகிறது...", @@ -128,10 +141,103 @@ "loading-error-try-again-later": "தகவல்களைப் பெற முடியவில்லை. பின்னர் மீண்டும் முயற்சிக்கவும்.", "logo": "லோகோ", "mainnet-ethereum": "முதன்வலை எத்தேரியம்", + "merge": "இணைக்கவும்", "more": "மேலும்", - "nav-developers": "உருவாக்குநர்கள் (டெவலப்பர்கள்)", + "nav-about-description": "எத்தேரியம் சமூகத்திற்கான ஒரு பொதுவான, வெளிப்படையான திட்டம்", + "nav-advanced-description": "மிகவும் சிக்கலான தலைப்புகளைக் கற்றுக்கொள்ளுங்கள்", + "nav-advanced-label": "மேம்பட்டவை", + "nav-basics-description": "எத்தேரியம்-இன் அடிப்படைகளைப் புரிந்துகொள்ளுங்கள்", + "nav-basics-label": "அடிப்படைகள்", + "nav-bridges-description": "Web3 முதன்மை L1 பிளாக்செயின்கள் மற்றும் L2 ஸ்கேலிங் தீர்வுகளின் சுற்றுச்சூழல் அமைப்பாக உருவாகியுள்ளது", + "nav-builders-home-description": "எத்தீரியம்க்கான பில்டர்ஸ் கையேடு- பில்டர்களுக்கானாது, பில்டர்களால் உருவாக்கப்பட்டது", + "nav-builders-home-label": "பில்டர்களின் முகப்பு", + "nav-contribute-description": "நீங்கள் உதவ விரும்பினால், இது உங்களுக்கு வழிகாட்டும்", + "nav-contribute-label": "ethereum.org தளத்திற்கான பங்களிப்பு", + "nav-dao-description": "மையப்படுத்தப்பட்ட அதிகாரம் அற்ற உறுப்பினர்களுக்குச் சொந்தமான சமூகங்கள்", + "nav-dapps-description": "எத்தேரியம்-ஐ பயன்படுத்தி செயலிகளின் உயரிய அமைப்பை ஆராய்ந்திடுங்கள்", + "nav-defi-description": "பாரம்பரிய நிதிச் சந்தைக்கான உலகளாவிய, வெளிப்படையான மாற்று", + "nav-desci-description": "தற்போதைய விஞ்ஞான அமைப்பிற்கான உலகளாவிய, வெளிப்படையான மாற்று", + "nav-desoc-description": "சமூக தொடர்பு மற்றும் உள்ளடக்க உருவாக்கத்திற்கான பிளாக்செயின் அடிப்படையிலான தளங்கள்", "nav-developers-docs": "உருவாக்குநர்களின் ஆவணங்கள்", + "nav-developers": "உருவாக்குநர்கள் (டெவலப்பர்கள்)", + "nav-did-description": "உங்கள் தனிப்பட்ட பரவலாக்கப்பட்ட அடையாளங்காட்டிகளை வழங்கி உரிமையைக் கொண்டிருங்கள்", + "nav-docs-description": "எத்தேரியம் குறித்து புரிந்துகொள்ளவும் அதனுடன் வளர்ச்சியை அடைவதற்கு உதவும் ஆவணங்கள்", + "nav-docs-design-description": "தனித்துவமான web3 வடிவமைப்புச் சவால்கள், சிறந்த நடைமுறைகள் மற்றும் பயனர் ஆராய்ச்சி நுண்ணறிவுகளின் விளக்கம்", + "nav-docs-design-label": "UX/UI வடிவமைப்பு அடிப்படைகள்", + "nav-docs-foundation-description": "எத்தேரியம்-இல் உருவாக்குவதற்கான முக்கிய அடிப்படைகள்", + "nav-docs-overview-description": "உருவாக்குநர்கள் (டெவலப்பர்கள்) ஆவணங்களுக்கான உங்கள் முகப்பு", + "nav-docs-stack-description": "எத்தேரியம் ஸ்டாக்-இன் அனைத்து விவரங்களையும் புரிந்துகொள்ளுதல்", + "nav-eip-description": "புதிய அம்சங்கள் அல்லது செயல்முறைகளைக் குறிப்பிடும் தரநிலைகள்", + "nav-eip-label": "எத்தேரியம் முன்னேற்ற முன்மொழிவுகள் (EIPக்கள்)", + "nav-emerging-description": "எத்தேரியம்-க்கான பிற புதிய பயன்பாட்டு நிலைகளைத் தெரிந்துகொள்ளுதல்", + "nav-enterprise-description": "எத்தேரியம்-க்கான வணிக செயலிகள்", + "nav-ethereum-org-description": "இந்த இணையதளம் சமூகத்தால் வழிநடத்தப்படுகிறது - எங்களுடன் சேர்ந்து பங்களித்திடுங்கள்", + "nav-ethereum-wallets-description": "உங்கள் எத்தேரியம் கணக்குடன் ஊடாடுவதற்கான செயலி", + "nav-events-description": "அதிகாரப் பரவலாக்கம் மற்றும் எவரும் பங்கேற்கும் சுதந்திரம்", + "nav-events-irl-description": "ஒவ்வொரு மாதமும் நேரில் பங்கேற்கும் மற்றும் ஆன்லைனில் பங்கேற்கும் முக்கிய எத்தேரியம் நிகழ்வுகள்", + "nav-events-label": "சமூகங்கள் மற்றும் நிகழ்வுகள்", + "nav-events-online-description": "இந்த ஆன்லைன் சமூகத்தில் ஆயிரக்கணக்கான எத்தேரியம் பயனர்கள் ஒன்றுசேர்கின்றனர்", + "nav-find-wallet-description": "வாலட்கள் கிரிப்டோவை பயன்படுத்த அனுமதிக்கிறது", + "nav-find-wallet-label": "உங்கள் வாலட்டை தேர்ந்தெடுக்கவும்", + "nav-gas-fees-description": "ETH பரிவர்த்தனை கட்டணங்கள் எவ்வாறு கணக்கிடப்படுகின்றன", + "nav-get-eth-description": "எத்தேரியம் செயலிகளில் பயன்படுத்த உங்களுக்கு ஈதர்(ETH) தேவைப்படும்", + "nav-get-started-description": "எத்தேரியம்-ஐ பயன்படுத்துவதற்கான உங்கள் முதற்படிகள்", + "nav-governance-description": "எத்தேரியம் நெறிமுறையை புதுப்பிக்கும் செயல்முறை", + "nav-governance-label": "நிர்வாகம்", + "nav-grants-description": "மானிய நிதி திட்டங்களை வழங்கும் திட்டங்களில் எங்கள் சமூகத்தால் தொகுக்கப்பட்ட பட்டியல்", + "nav-guide-create-account-description": "எந்த நேரத்திலும் ஒரு வாலட் செயலியுடன் இலவசமாக எவரும் ஒரு எத்தேரியம் கணக்கை உருவாக்கலாம்", + "nav-guide-revoke-access-description": "எத்தேரியம் அமைப்பில் உள்ள ஸ்மார்ட் ஒப்பந்தங்கள் மற்றும் செயலிகளைப் பயன்படுத்தும்போது பாதுகாப்பாக இருந்திடுங்கள்", + "nav-guide-revoke-access-label": "ஸ்மார்ட் ஒப்பந்த அணுகலை எவ்வாறு திரும்பப் பெறுவது", + "nav-guide-use-wallet-description": "வாலட்-இன் அடிப்படை செயல்பாடுகள் அனைத்தையும் எவ்வாறு பயன்படுத்துவது என்பதை கற்றல்", + "nav-guide-use-wallet-label": "Wallet பயன்படுத்துவது எப்படி", + "nav-guides-description": "நீங்கள் தொடங்குவதற்கு உதவும் வகையில் படிப்படியான செயல்முறை வழிகாட்டு முறைகள்", + "nav-guides-label": "எப்படி வழிகாட்டுகிறது", + "nav-history-description": "அனைத்து முக்கிய ஃபோர்க்குகள் மற்றும் புதுப்பித்தலுக்கான காலவரையறை", + "nav-history-label": "எத்தேரியம்-இன் தொழில்நுட்ப வரலாறு", + "nav-layer-2-description": "எத்தேரியம்-க்கான விலைமலிவான மற்றும் விரைவான பரிவர்த்தனைகள்", + "nav-learn-by-coding-description": "எத்தேரியம் உடன் ஆராய்வதற்கு உதவக்கூடிய கருவிகள்", + "nav-local-env-description": "உங்கள் எத்தேரியம் உருவாக்க அடுக்கைத் தேர்ந்தெடுத்து அமைத்தல்", + "nav-mainnet-description": "நிறுவன பிளாக்செயின் செயலிகள் பொது எத்தேரியம் மெயின்நெட்டில் உருவாக்கலாம்", + "nav-nft-description": "எத்தேரியம் அடிப்படையிலான உடைமையைப் போன்று ஏதேனும் தனித்துவமான ஒன்றை கட்சிப்படுத்தும் வழி", + "nav-open-research-description": "எத்தேரியம்-இன் முதன்மை வலிமைகளில் ஒன்று அதன் செயல்பாட்டுடன் கூடிய ஆராய்ச்சி சமூகம்", + "nav-open-research-label": "திறந்த ஆராய்ச்சி", + "nav-overview-description": "எத்தேரியம் சார்ந்த அனைத்து கல்வி", + "nav-participate-overview-description": "எவ்வாறு பங்கேற்பது என்பதன் மீதான கண்ணோட்டம்", "nav-primary": "முதன்மை", + "nav-quizzes-description": "எத்தேரியம் மற்றும் கிரிப்டோகரன்சி குறித்து எவ்வளவு நன்றாகப் புரிந்துவைத்துள்ளீர்கள் என்று கண்டறிதல்", + "nav-quizzes-label": "உங்கள் பொதுஅறிவை சோதித்தல்", + "nav-refi-description": "மீளுருவாக்கம் கொள்கைகளைக் கொண்டு உருவாக்கப்பட்ட ஒரு மாற்று பொருளாதார அமைப்பு", + "nav-research-description": "எத்தேரியம்-ஐ மேம்படுத்துவதற்கு பயன்படுத்தப்படும் செயல்முறைகள்", + "nav-research-label": "ஆராய்ச்சி மற்றும் வளர்ச்சி", + "nav-roadmap-description": "எத்தேரியம்-க்கான அதிக அளவிடுதல், பாதுகாப்பு மற்றும் நிலைத்தன்மைக்கான பாதை", + "nav-roadmap-future-description": "Ethereum ஒரு வலுவான மற்றும் பரவலாக்கப்பட்ட நெட்வொர்க்காகத் திடப்படுத்துதல்", + "nav-roadmap-future-label": "எதிர்காலச்-சான்று", + "nav-roadmap-label": "திட்டப்பாதை", + "nav-roadmap-scaling-description": "பரிவர்த்தனை கட்டணங்கள் மற்றும் வேகத்தை மேலும் குறைப்பதற்கான நெட்வொர்க் புதுப்பித்தல்கள்", + "nav-roadmap-security-description": "எத்தேரியம் எதிர்காலத்தில் அனைத்து வகையான சைபர் தாக்குதல்களையும் தாங்கி நிற்கிறது என்பதை உறுதி செய்தல்", + "nav-roadmap-security-label": "மேம்பட்ட பாதுகாப்பு", + "nav-roadmap-ux-description": "எத்தேரியம் பயன்பாடு எளிதாக்கப்பட வேண்டும்", + "nav-run-a-node-description": "நெட்வொர்க்கைப் பாதுகாக்க உதவும்போது முழு இறையாண்மையாக இருத்தல்", + "nav-security-description": "கிரிப்டோகரன்சியை பயன்படுத்தும்போது சிறந்த செயல்முறையை கற்றிடுங்கள்", + "nav-smart-contracts-description": "எத்தேரியம் அமைப்பின் அடிப்படை வளர்ச்சி படிகள்", + "nav-stablecoins-description": "Stablecoins ஒரு நிலையான மதிப்பில் இருக்க வடிவமைக்கப்பட்ட எத்தேரியம் டோக்கன்கள்", + "nav-stake-description": "எத்தேரியம்-ஐ பாதுகாப்பதற்கான ரிவார்ட்களை ஈட்டிடுங்கள்", + "nav-stake-label": "பங்கு", + "nav-staking-home-description": "ஸ்டேக்கிங்-கிற்கான வெவ்வேறு விருப்பத்தேர்வுகளின் கண்ணோட்டம்", + "nav-staking-pool-description": "மற்றவர்களுடன் இணைந்து எந்த ஒரு ETH தொகையுடன் ஸ்டேக் செய்து ரிவார்டுகளை ஈட்டிடுங்கள்", + "nav-staking-pool-label": "பூல்டு ஸ்டேக்கிங்", + "nav-staking-saas-label": "சேவையுடன் கூடிய ஸ்டேகிங்", + "nav-staking-solo-label": "சோலோ ஸ்டேக்கிங்", + "nav-start-building-description": "புதிதாக நிறுவியுள்ளவர்களுக்கான பயனுள்ள தகவல்கள்", + "nav-translation-program-description": "Ethereum.org-ஐ அனைத்து மொழிகளிலும் மொழிபெயர்ப்பு செய்வதற்கான ஒரு கூட்டு முயற்சி", + "nav-tutorials-description": "சமூக கல்விசார் பாடங்களின் தொகுப்பு", + "nav-use-cases-description": "எத்தேரியம் பயன்பாட்டிற்கான வெவ்வேறு யோசனைகளை கண்டறிதல்", + "nav-what-is-ether-description": "எத்தேரியம் செயலிகளின் நாணயம்", + "nav-what-is-ethereum-description": "எத்தேரியம்-ஐ எது சிறப்பாக்குகிறது என்பதை புரிந்துகொள்ளுதல்", + "nav-what-is-web3-label": "Web3 என்றால் என்ன?", + "nav-what-is-web3-description": "விதிகளைக் கொண்டிருக்கும் மையப்படுத்தப்பட்ட தனிஆதிக்கங்களுக்கு மாற்றாக", + "nav-whitepaper-description": "2014-இல் அசல் எத்தேரியம் யாதாஸ்துவை விட்டாலிக் புட்டரின் எழுதினார்", + "nav-zkp-description": "அறிக்கையை வெளிப்படுத்தாமல் ஒரு அறிக்கையின் செல்லுபடியை நிரூபிக்க ஒரு வழி", "nft-page": "NFTs - மாற்ற முடியாத டோக்கன்கள்", "nfts": "NFTs", "no": "இல்லை", @@ -140,6 +246,7 @@ "page-developers-aria-label": "டெவலப்பர்களின் மெனு", "page-index-meta-title": "முகப்பு", "page-last-updated": "பக்கம் கடைசியாக மாற்றப்பட்டது", + "participate-menu": "பங்கேற்பாளர் மெனு", "pbs": "பல பிரிக்கப்பட்ட சரிபார்ப்பு", "pools": "பூல்டு ஸ்டேக்கிங்", "privacy-policy": "தனியுரிமைக் கொள்கை", @@ -150,9 +257,10 @@ "refresh": "இந்தப் பக்கத்தை ரெஃபிரெஷ் செய்யவும்.", "return-home": "முகப்புக்குச் செல்", "roadmap": "எத்தீரியம் திட்டப்படம்", + "research": "ஆராய்ச்சி", + "research-menu": "ஆராய்ச்சி மெனு", "resources": "மொழிபெயர்ப்பு ஆதாரங்கள்", - "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "முனையை இயக்கு", + "run-a-node": "ஒரு கணுவை இயக்கவும்", "rollup-component-website": "வலைத்தளம்", "rollup-component-developer-docs": "உருவாக்குநர்களின் ஆவணங்கள்", "rollup-component-technology-and-risk-summary": "தொழில்நுட்பம் மற்றும் இடர் மதிப்பீட்டு சுருக்கம்", @@ -164,23 +272,23 @@ "search-box-blank-state-text": "தேடுங்கள்!", "search-eth-address": "இது எத்தேரியம் முகவரிபோல் தெரிகிறது. முகவரிகளுக்கு ஏற்ப, குறிப்பிட்ட தரவுகளை நாங்கள் வழங்குவதில்லை. இது போன்ற ஒரு பிளாக் உலாவியில் அதைத் தேட முயற்சி செய்க", "search-no-results": "உங்கள் தேடலுக்கான முடிவுகள் எதுவும் இல்லை", + "security": "பாதுகாப்பு", "single-slot-finality": "ஒருமுறைமாற்றல்", "statelessness": "நாடற்ற தன்மை", "see-contributors": "பங்களிப்பாளர்களைக் காட்டு", - "set-up-local-env": "உட்பணிச் சூழலை உருவாக்கு", + "set-up-local-env": "உட்பணிச் சூழல் உருவாக்கு", "sharding": "ஷார்டிங்", "show-all": "அனைத்தையும் காட்டு", "show-less": "குறைவாகக் காட்டு", "site-description": "எத்தேரியம் என்பது பணம் மற்றும் புதிய வகை செயலிகளுக்கான பன்முனைப்படுத்தப்பட்ட உலகளாவிய தளமாகும். எத்தேரியமில், நீங்கள் பணத்தைக் கட்டுப்படுத்துவதற்கான குறியீட்டை எழுதலாம், உலகின் அனைத்துப் பகுதிகளில் இருந்தும் அணுகக்கூடிய செயலிகளை உருவாக்கலாம்.", - "site-title": "ethereum.org", "skip-to-main-content": "பிரதான உள்ளடக்கத்திற்குச் செல்", "smart-contracts": "ஸ்மார்ட் ஒப்பந்தங்கள்", - "stablecoins": "ஸ்டேபிள்காயின்ஸ்", + "stablecoins": "நிலைத்தக் காசுகள்", "stake-eth": "எத்தீரியத்தில் பங்குவை", "staking": "ஸ்டேக்கிங்", "start-here": "இங்கே இருக்கவும்", - "style-guide": "Style guide", "solo": "சோலோ ஸ்டேக்கிங்", + "support": "ஆதரவு", "terms-of-use": "பயன்பாட்டு விதிமுறைகள்", "translation-banner-body-new": "இவ்விணையப் பக்கம் இன்னும் மொழிபெயர்க்கப்படாததால், இதனை நீங்கள் ஆங்கிலத்தில் காண்கிறீர்கள். இதனை மொழிபெயர்க்க உதவுங்கள்.", "translation-banner-body-update": "தற்போது இப்பக்கத்திற்கான புதிய பதிப்பு ஆங்கிலத்தில் மட்டுமே உள்ளது. சமீபத்திய பதிப்பினை மொழிபெயர்க்க உதவுங்கள்.", @@ -191,20 +299,21 @@ "translation-banner-no-bugs-title": "இதில் நிரற்பிழை இல்லை!", "translation-banner-no-bugs-content": "இன்னும் இந்தப் பக்கம் மொழிபெயர்க்கப்படவில்லை. இந்தப் பக்கத்தை நாங்கள் ஆங்கிலத்திலேயே வைத்திருக்கக் காரணமுள்ளது.", "translation-banner-no-bugs-dont-show-again": "மீண்டும் காட்ட வேண்டாம்", + "translation-program": "மொழிபெயர்ப்புத் திட்டம்", "try-using-search": "உங்களுக்கு வேண்டியதைக் கண்டறிய தேடல் பட்டனைப் பயன்படுத்தவும் அல்லது", "tutorials": "பயிற்சிகள்", "up": "மேலே", + "use": "பயன்படுத்த", "use-ethereum": "எத்தேரியமைப் பயன்படுத்துதல்", "use-ethereum-menu": "எத்தேரியமைப் பயன்படுத்துதல் மெனு", - "user-experience": "User experience", + "use-menu": "மெனுவை பயன்படுத்துக", "verkle-trees": "வெர்க்கில் மரங்கள்", "wallets": "பணப்பைகள்", "we-couldnt-find-that-page": "அந்தப் பக்கத்தைக் கண்டறிய முடியவில்லை", "web3": "Web3 என்றால் என்ன?", - "web3-title": "Web3", "website-last-updated": "வலைத்தளம் கடைசியாக மாற்றப்பட்டது", "what-is-ether": "ஈதர் (ETH) என்றால் என்ன?", - "what-is-ethereum": "எத்தேரியும் என்றால் என்ன?", + "what-is-ethereum": "ஈதெரியம் என்றால் என்ன?", "withdrawals": "ஸ்டேக்கிங் பின்வாங்கல்", "yes": "ஆம்", "zero-knowledge-proofs": "ஜீரோ-நிரூபன சான்றுகள்" diff --git a/src/intl/th/common.json b/src/intl/th/common.json index 8c40b1a29d6..16948294a44 100644 --- a/src/intl/th/common.json +++ b/src/intl/th/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "บัญชีนามธรรม", "about-ethereum-org": "เกี่ยวกับ ethereum.org", "about-us": "เกี่ยวกับเรา", + "adding-desci-projects": "เพิ่มโครงการ Desci", + "adding-developer-tools": "เพิ่มเครื่องมือของผู้พัฒนา", + "adding-exchanges": "เพิ่มการแลกเปลี่ยน", + "adding-glossary-terms": "เพิ่มคำศัพท์อภิธานศัพท์", + "adding-staking-products": "เพิ่มแสต็กของผลิตภัณฑ์", + "adding-wallets": "เพิ่มกระเป๋าเงิน", + "account-abstraction": "บัญชีนามธรรม", + "acknowledgements": "กิตติกรรมประกาศ", "aria-toggle-search-button": "ปุ่มเปิด-ปิดการค้นหา", "aria-toggle-menu-button": "ปุ่มเปิด-ปิดเมนู", "beacon-chain": "Beacon Chain", "bridges": "สะพาน Blockchain", + "bug-bounty": "โปรแกรมตามล่าหาบั๊ก", + "build": "สร้าง", + "build-menu": "เมนูสร้าง", "clear": "ลบ", "close": "ปิด", "community": "ชุมชน", "community-hub": "ศูนย์กลางชุมชน", "community-menu": "เมนูชุมชน", "contact": "ติดต่อ", + "content-buckets": "ที่เก็บข้อมูลเนื้อหา", + "content-resources": "แหล่งข้อมูลเนื้อหา", "content-standardization": "การกำหนดมาตรฐานเนื้อหา", "contributing": "การมีส่วนร่วม", "contributors": "ผู้มีส่วนร่วม", @@ -27,7 +39,10 @@ "decentralized-identity": "ตัวตนแบบกระจายศูนย์", "decentralized-social-networks": "เครือข่ายสังคมแบบกระจายศูนย์", "decentralized-science": "DeSci - วิทยาศาสตร์แบบ Decentralized", + "description": "คำอธิบายรายการนำทาง", "defi-page": "DeFi - ระบบการเงินแบบ Decentralized", + "design": "ออกแบบ", + "design-principles": "หลักการออกแบบ", "devcon": "Devcon", "developers": "นักพัฒนา", "developers-home": "หน้าแรกของนักพัฒนา", @@ -71,7 +86,7 @@ "ethereum-glossary": "อภิธานศัพท์อีเธอเรียม", "ethereum-governance": "การกำกับดูแลอีเธอเรียม", "ethereum-logo": "โลโก้อีเธอเรียม", - "ethereum-roadmap": "เส้นทาง Ethereum", + "ethereum-roadmap": "แผนงานอีเธอเรียม", "ethereum-protocol": "โปรโตคอลของอีเธอเรียม", "ethereum-security": "ความปลอดภัยในอีเธอเรียมและการป้องกันการหลอกลวง", "ethereum-support": "การสนับสนุนเกี่ยวกับอีเธอเรียม", @@ -83,10 +98,10 @@ "feedback-card-prompt-tutorial": "ได้ประโยชน์จากบทสอนใช้งานนี้หรือไม่", "feedback-widget-thank-you-title": "ขอขอบคุณสำหรับความคิดเห็น!", "feedback-widget-thank-you-subtitle": "ช่วยปรับปรุงหน้านี้โดยการตอบคำถาม", - "feedback-widget-thank-you-subtitle-ext": "หากต้องการความช่วยเหลือ โปรดติดต่อชุมชนของเราทาง Discord", + "feedback-widget-thank-you-subtitle-ext": "หากคุณต้องการความช่วยเหลือ โปรดติดต่อที่ชุมชนใน Discord ของเรา", "feedback-widget-thank-you-timing": "2-3 นาที", "feedback-widget-thank-you-cta": "เปิดแบบสำรวจอย่างย่อ", - "find-wallet": "ค้นหาวอลเล็ท", + "find-wallet": "ค้นหากระเป๋าสตางค์", "future-proofing": "รองรับอนาคต", "get-eth": "รับ ETH", "get-involved": "เข้าร่วมกับเรา", @@ -94,11 +109,10 @@ "grants": "ทุน", "grant-programs": "โครงการสนับสนุนระบบนิเวศ", "guides": "คู่มือ", - "guides-hub": "ฮับคู่มือ", + "guides-hub": "คู่มือการใช้", "history-of-ethereum": "ประวัติของอีเธอเรียม", "home": "หน้าหลัก", "how-ethereum-works": "อีเธอเรียมทำงานอย่างไร", - "how-to-register-an-ethereum-account": "วิธี \"ลงทะเบียน\" บัญชีอีเธอเรียม", "how-to-revoke-token-access": "วิธียกเลิกการเข้าถึงสินทรัพย์คริปโตของคุณจากสัญญาอัจฉริยะ", "how-to-swap-tokens": "วิธีแลกเปลี่ยนเหรียญโทเค็น", "how-to-use-a-bridge": "วิธีเชื่อมเหรียญโทเค็นกับเลเยอร์ 2", @@ -128,10 +142,106 @@ "loading-error-try-again-later": "ไม่สามารถโหลดข้อมูล ลองอีกครั้งในภายหลัง", "logo": "โลโก้", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "ผสาน", "more": "เพิ่มเติม", - "nav-developers": "นักพัฒนา", + "nav-about-description": "โครงการโอเพ่นซอร์สสาธารณะสำหรับชุมชนอีเธอเรียม", + "nav-advanced-description": "เรียนรู้หัวข้อที่ซับซ้อนมากขึ้น", + "nav-advanced-label": "ขั้นสูง", + "nav-basics-description": "ทำความเข้าใจปัจจัยพื้นฐานของอีเธอเรียม", + "nav-basics-label": "พื้นฐาน", + "nav-bridges-description": "Web3 ได้พัฒนาไปสู่ระบบนิเวศของบล็อกเชน L1 หลักและโซลูชันการปรับขนาด L2", + "nav-builders-home-description": "คู่มือผู้สร้างสำหรับอีเธอเรียม—โดยผู้สร้าง สำหรับผู้สร้าง", + "nav-builders-home-label": "หน้าหลักของผู้สร้าง", + "nav-contribute-description": "หากคุณต้องการความช่วยเหลือ นี่จะแนะนำคุณ", + "nav-contribute-label": "การมีส่วนร่วมใน ethereum.org", + "nav-dao-description": "ชุมชนที่สมาชิกเป็นเจ้าของโดยไม่มีอำนาจจากส่วนกลาง", + "nav-dapps-description": "สำรวจระบบนิเวศที่มั่นคงของแอปที่ใช้อีเธอเรียม", + "nav-defi-description": "ทางเลือกที่เปิดกว้างระดับโลกสำหรับตลาดการเงินแบบดั้งเดิม", + "nav-desci-description": "ทางเลือกที่เปิดกว้างระดับโลกสำหรับระบบวิทยาศาสตร์ในปัจจุบัน", + "nav-desoc-description": "แพลตฟอร์มที่ใช้บล็อกเชนสำหรับการโต้ตอบทางสังคมและการสร้างเนื้อหา", "nav-developers-docs": "เอกสารสำหรับนักพัฒนา", + "nav-developers": "นักพัฒนา", + "nav-did-description": "ออกและเป็นเจ้าของตัวระบุแบบกระจายศูนยที่ไม่เหมือนใครของคุณ", + "nav-docs-description": "เอกสารที่ช่วยให้คุณเข้าใจและสร้างขึ้นด้วยอีเธอเรียม", + "nav-docs-design-description": "คำอธิบายของความท้าทายในการออกแบบ web3 ที่ไม่เหมือนใคร แนวปฏิบัติที่ดีที่สุด และข้อมูลเชิงลึกในการวิจัยผู้ใช้งาน", + "nav-docs-design-label": "พื้นฐานการออกแบบ UX/UI", + "nav-docs-foundation-description": "ปัจจัยพื้นฐานหลักในการพัฒนาบนอีเธอเรียม", + "nav-docs-foundation-label": "หัวข้อพื้นฐาน", + "nav-docs-overview-description": "หน้าหลักของคุณสำหรับเอกสารของผู้พัฒนา", + "nav-docs-stack-description": "ทำความเข้าใจรายละเอียดทั้งหมดของสแต็กของอีเธอเรียม", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "มาตรฐานที่ระบุคุณสมบัติหรือกระบวนการใหม่", + "nav-eip-label": "ข้อเสนอการปรับปรุงอีเธอเรียม (EIP)", + "nav-emerging-description": "ทำความรู้จักกรณีการใช้งานใหม่อื่นๆ สำหรับอีเธอเรียม", + "nav-enterprise-description": "แอปพลิเคชันธุรกิจสำหรับอีเธอเรียม", + "nav-ethereum-org-description": "เว็บไซต์นี้ขับเคลื่อนโดยชุมชน—เข้าร่วมกับเราและมีส่วนร่วมกัน", + "nav-ethereum-wallets-description": "แอปสำหรับโต้ตอบกับบัญชีอีเธอเรียมของคุณ", + "nav-events-description": "การกระจายศูนย์และเสรีภาพในการเข้าร่วมสำหรับทุกคน", + "nav-events-irl-description": "ทุกเดือนจะมีกิจกรรมอีเธอเรียมที่สำคัญทั้งแบบตัวต่อตัวและออนไลน์", + "nav-events-label": "ชุมชนและกิจกรรมต่างๆ", + "nav-events-online-description": "ผู้ชื่นชอบอีเธอเรียมหลายแสนคนเป็นผู้ก่อตั้งชุมชนออนไลน์เหล่านี้", + "nav-find-wallet-description": "กระเป๋าเงินช่วยให้คุณใช้คริปโตได้", + "nav-find-wallet-label": "เลือกวอลเล็ทของคุณ", + "nav-gas-fees-description": "ค่าธรรมเนียมการทำธุรกรรม ETH คำนวณอย่างไร", + "nav-gas-fees-label": "Gas fees", + "nav-get-eth-description": "คุณต้องมีอีเธอร์ (ETH) เพื่อใช้แอปพลิเคชันอีเธอเรียม", + "nav-get-started-description": "ขั้นตอนแรกในการใช้งานอีเธอเรียม", + "nav-governance-description": "กระบวนการที่เกี่ยวข้องกับการอัปเกรดโปรโตคอลอีเธอเรียม", + "nav-governance-label": "การกำกับดูแล", + "nav-grants-description": "รายชื่อที่รวบรวมโดยชุมชนของเราเกี่ยวกับโครงการที่จัดให้มีโครงการให้ทุนสนับสนุน", + "nav-guide-create-account-description": "ทุกคนสามารถสร้างบัญชีอีเธอเรียมได้ฟรีตลอดเวลาด้วยแอปวอลเล็ท", + "nav-guide-revoke-access-description": "ใช้งานอย่างปลอดภัยเมื่อโต้ตอบกับสัญญาอัจฉริยะและแอปพลิเคชันในระบบนิเวศอีเธอเรียม", + "nav-guide-revoke-access-label": "วิธีเพิกถอนการเข้าถึงสัญญาอัจฉริยะ", + "nav-guide-use-wallet-description": "เรียนรู้วิธีใช้งานฟังก์ชันพื้นฐานทั้งหมดของวอลเล็ท", + "nav-guide-use-wallet-label": "วิธีใช้วอลเล็ท", + "nav-guides-description": "คำแนะนำการปฏิบัติทีละขั้นตอนเพื่อช่วยคุณในการเริ่มต้นใช้งาน", + "nav-guides-label": "วิธีการแนะนำ", + "nav-history-description": "ไทม์ไลน์ของฟอร์กและการอัปเดตที่สำคัญทั้งหมด", + "nav-history-label": "ประวัติทางเทคนิคของอีเธอเรียม", + "nav-layer-2-description": "การทำธุรกรรมสำหรับอีเธอเรียมที่ราคาถูกกว่าและเร็วกว่า", + "nav-learn-by-coding-description": "เครื่องมือที่ช่วยให้คุณทดลองกับอีเธอเรียมได้", + "nav-local-env-description": "เลือกและตั้งค่าสแต็กการพัฒนาอีเธอเรียมของคุณ", + "nav-mainnet-description": "สามารถสร้างแอปพลิเคชันบล็อกเชนระดับองค์กรขึ้นบนเครือข่ายหลักของอีเธอเรียมสาธารณะได้", + "nav-nft-description": "วิธีการนำเสนอสิ่งที่เป็นเอกลักษณ์ในฐานะสินทรัพย์ที่ใช้อีเธอเรียม", + "nav-open-research-description": "จุดแข็งที่สำคัญประการหนึ่งของอีเธอเรียม คือชุมชนการวิจัยที่กระตือรือร้น", + "nav-open-research-label": "เปิดงานวิจัย", + "nav-overview-description": "ทุกสิ่งเกี่ยวกับการศึกษาอีเธอเรียม", + "nav-participate-overview-description": "ภาพรวมเกี่ยวกับวิธีการเข้าร่วม", "nav-primary": "หลัก", + "nav-quizzes-description": "ค้นหาว่าคุณเข้าใจอีเธอเรียมและสกุลเงินดิจิทัลได้ดีเพียงใด", + "nav-quizzes-label": "ทดสอบความรู้ของคุณ", + "nav-refi-description": "ระบบเศรษฐกิจทางเลือกที่สร้างจากหลักการปฏิรูป", + "nav-research-description": "กระบวนการที่ใช้ในการปรับปรุงอีเธอเรียม", + "nav-research-label": "การวิจัยและพัฒนา", + "nav-roadmap-description": "เส้นทางสู่ความสามารถในการปรับขนาด การรักษาความปลอดภัย และความยั่งยืนมากขึ้นสำหรับอีเธอเรียม", + "nav-roadmap-future-description": "ทำให้อีเธอเรียมมั่นคงยิ่งขึ้นในฐานะเครือข่ายที่แข็งแกร่งและกระจายศูนย์", + "nav-roadmap-future-label": "รองรับอนาคต", + "nav-roadmap-label": "แผนงาน", + "nav-roadmap-scaling-description": "การอัปเดตเครือข่ายเพื่อลดต้นทุนและความเร็วในการทำธุรกรรมเพิ่มเติม", + "nav-roadmap-security-description": "ทำให้มั่นใจว่าอีเธอเรียมยังมีความยืดหยุ่นต่อการโจมตีทุกประเภทในอนาคต", + "nav-roadmap-security-label": "ความปลอดภัยที่ปรับปรุงให้ดีขึ้น", + "nav-roadmap-ux-description": "การใช้งานอีเธอเรียมจำเป็นต้องทำให้ง่ายขึ้น", + "nav-run-a-node-description": "มีเสถียรภาพอย่างเต็มที่ในขณะที่ช่วยรักษาความปลอดภัยให้เครือข่าย", + "nav-security-description": "เรียนรู้แนวปฏิบัติที่ดีที่สุดเมื่อใช้คริปโตเคอร์เรนซี", + "nav-smart-contracts-description": "โครงสร้างพื้นฐานของระบบนิเวศอีเธอเรียม", + "nav-stablecoins-description": "สเตเบิลคอยน์คือโทเค็นอีเธอเรียมที่ออกแบบมาให้มีมูลค่าคงที่", + "nav-stake-description": "รับรางวัลสำหรับการรักษาความปลอดภัยอีเธอเรียม", + "nav-stake-label": "สเตก", + "nav-staking-home-description": "ภาพรวมของตัวเลือกต่างๆ สำหรับการสเตก", + "nav-staking-pool-description": "สเตกและรับรางวัลด้วย ETH จำนวนเท่าใดก็ได้โดยการเข้าร่วมกับผู้อื่น", + "nav-staking-pool-label": "การ Stake แบบกองรวม", + "nav-staking-saas-label": "การสเตกด้วยบริการ", + "nav-staking-solo-label": "การ Stake แบบกองเดี่ยว", + "nav-start-building-description": "ข้อมูลที่มีประโยชน์สำหรับผู้เริ่มต้นใหม่", + "nav-translation-program-description": "ความพยายามร่วมกันในการแปล ethereum.org เป็นภาษาอื่นๆ ทั้งหมด", + "nav-tutorials-description": "รายการบทช่วยสอนของชุมชนที่รวบรวมไว้", + "nav-use-cases-description": "ค้นพบแนวคิดที่แตกต่างกันในการใช้งานอีเธอเรียม", + "nav-what-is-ether-description": "สกุลเงินของแอปอีเธอเรียม", + "nav-what-is-ethereum-description": "ทำความเข้าใจว่าอะไรที่ทำให้อีเธอเรียมพิเศษ", + "nav-what-is-web3-label": "Web3 คืออะไร", + "nav-what-is-web3-description": "ทางเลือกอื่นนอกเหนือจากการผูกขาดแบบรวมศูนย์ซึ่งกำหนดกฎเกณฑ์", + "nav-whitepaper-description": "เอกสารไวท์เปเปอร์ต้นฉบับของอีเธอเรียมเขียนโดยวิทาลิก บูเทอรินในปี 2014", + "nav-zkp-description": "วิธีการพิสูจน์ความถูกต้องของข้อความโดยไม่ต้องเปิดเผยข้อความนั้น", "nft-page": "NFTs - Non-fungible tokens", "nfts": "NFT", "no": "ไม่", @@ -140,6 +250,7 @@ "page-developers-aria-label": "เมนูสำหรับผู้พัฒนา", "page-index-meta-title": "หน้าหลัก", "page-last-updated": "หน้าปรับปรุงล่าสุด", + "participate-menu": "เมนูการมีส่วนร่วม", "pbs": "การแยกผู้เสนอและผู้พัฒนา", "pools": "การ Stake แบบกองรวม", "privacy-policy": "นโยบายความเป็นส่วนตัว", @@ -150,6 +261,8 @@ "refresh": "โปรดรีเฟรชหน้า", "return-home": "กลับไปหน้าแรก", "roadmap": "แผนงานอีเธอเรียม", + "research": "การวิจัย", + "research-menu": "เมนูการวิจัย", "resources": "แหล่งข้อมูลการแปล", "regenerative-finance": "ReFi - ระบบการเงินแบบเกิดใหม่", "run-a-node": "รันโหนด", @@ -164,6 +277,7 @@ "search-box-blank-state-text": "ค้นหา", "search-eth-address": "ดูเหมือนคำต้นจะเป็นที่อยู่ของอีเธอเรียม เราไม่ได้ให้ข้อมูลเจาะจงสำหรับที่อยู่ ลองค้นหาใน block explorer ดู", "search-no-results": "ไม่พบผลการค้นหาที่คุณต้องการ", + "security": "ความปลอดภัย", "single-slot-finality": "Single-slot finality", "statelessness": "การไร้ซึ่งสถานะ", "see-contributors": "ดูผู้มีส่วนร่วม", @@ -181,6 +295,7 @@ "start-here": "เริ่มต้นที่นี่", "style-guide": "คู่มือการออกแบบ", "solo": "การ Stake แบบกองเดี่ยว", + "support": "ฝ่ายสนับสนุน", "terms-of-use": "ข้อกำหนดการใช้งาน", "translation-banner-body-new": "คุณกำลังดูหน้านี้เป็นภาษาอังกฤษเพราะเรายังไม่ได้แปล ช่วยเราแปลเนื้อหานี้", "translation-banner-body-update": "มีเวอร์ชันใหม่ของหน้านี้ แต่ตอนนี้เป็นภาษาอังกฤษเท่านั้น ช่วยเราแปลเวอร์ชันล่าสุด", @@ -191,11 +306,14 @@ "translation-banner-no-bugs-title": "ตรงนี้ไม่มีบั๊ก!", "translation-banner-no-bugs-content": "ยังไม่มีการแปลหน้านี้เพราะเราตั้งใจเก็บหน้านี้ไว้เป็นภาษาอังกฤษ ณ ตอนนี้", "translation-banner-no-bugs-dont-show-again": "ไม่ต้องแสดงอีก", + "translation-program": "โปรแกรมแปลภาษา", "try-using-search": "ลองใช้การค้นหาเพื่อค้นหาสิ่งที่คุณกำลังมองหาหรือ", "tutorials": "บทช่วยสอน", "up": "ขึ้น", + "use": "การใช้งาน", "use-ethereum": "ใช้อีเธอเรียม", "use-ethereum-menu": "เมนูใช้อีเธอเรียม", + "use-menu": "ใช้เมนู", "user-experience": "ประสบการณ์ผู้ใช้งาน", "verkle-trees": "ต้นไม้เวอร์เคิล", "wallets": "วอลเล็ท", diff --git a/src/intl/tk/common.json b/src/intl/tk/common.json index 8bc0241ce20..cb8ccf83c58 100644 --- a/src/intl/tk/common.json +++ b/src/intl/tk/common.json @@ -23,7 +23,7 @@ "dao-page": "DAO-lar - Merkezleşdirilmedik awtonom guramalar", "dark-mode": "Gara", "data-provided-by": "Maglumat çeşmesi:", - "decentralized-applications-dapps": "Merkezleşdirilmedik programmalar(dapps)", + "decentralized-applications-dapps": "Dapps - Merkezleşdirilmedik programmalar", "decentralized-identity": "Merkezleşdirilmedik şahsyýet", "decentralized-social-networks": "Merkezleşdirilmedik sosial ulgamlar", "decentralized-science": "DeSci - Merkezleşdirilmedik ylym", diff --git a/src/intl/tr/common.json b/src/intl/tr/common.json index 8f227ead141..5c5251d4e78 100644 --- a/src/intl/tr/common.json +++ b/src/intl/tr/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Menü düğmesini aç/kapat", "beacon-chain": "İşaret Zinciri", "bridges": "Blok zinciri köprüleri", + "bug-bounty": "Hata ödülü", + "build": "Geliştirme", + "build-menu": "Geliştirme menüsü", "clear": "Temizle", "close": "Kapat", "community": "Topluluk", @@ -38,6 +41,7 @@ "decentralized-identity": "Merkezî olmayan kimlik", "decentralized-social-networks": "Merkezî olmayan sosyal ağlar", "decentralized-science": "DeSci - Merkeziyetsiz bilim", + "description": "Gezinme öğesi açıklaması", "defi-page": "DeFi - Merkezi Olmayan Finans", "design": "Tasarım", "design-principles": "Tasarım İlkeleri", @@ -76,7 +80,7 @@ "ethereum-bug-bounty": "Ethereum hata yakalama prim programı", "consensus-when-shipping": "Ne zaman gönderiliyor?", "ethereum-upgrades": "Ethereum yükseltmeleri", - "ethereum-brand-assets": "Ethereum Marka Varlıkları", + "ethereum-brand-assets": "Ethereum marka varlıkları", "ethereum-online": "Çevrimiçi topluluklar", "ethereum-events": "Ethereum etkinlikleri", "ethereum-foundation": "Ethereum'un Geleceği", @@ -88,7 +92,7 @@ "ethereum-protocol": "Ethereum protokolü", "ethereum-security": "Ethereum güvenliği ve dolandırıcılık önleme", "ethereum-support": "Ethereum destek", - "ethereum-wallets": "Ethereum Cüzdanlar", + "ethereum-wallets": "Ethereum cüzdanları", "ethereum-whitepaper": "Ethereum Teknik Raporu", "feedback-widget-prompt": "Bu sayfa yardımcı oldu mu?", "feedback-card-prompt-page": "Bu sayfa yararlı oldu mu?", @@ -96,12 +100,12 @@ "feedback-card-prompt-tutorial": "Bu rehber yararlı oldu mu?", "feedback-widget-thank-you-title": "Geri bildiriminiz için teşekkürler!", "feedback-widget-thank-you-subtitle": "Birkaç soru yanıtlayarak bu sayfanın daha iyi hâle gelmesine yardımcı olun.", - "feedback-widget-thank-you-subtitle-ext": "Yardıma ihtiyacınız varsa Discord sunucumuzdan topluluğa ulaşabilirsiniz.", + "feedback-widget-thank-you-subtitle-ext": "Yardıma ihtiyacınız olursa Discord sunucumuzda topluluğa ulaşabilirsiniz.", "feedback-widget-thank-you-timing": "2–3 dakika", "feedback-widget-thank-you-cta": "Kısa anketi aç", "find-wallet": "Cüzdan bul", "future-proofing": "Geleceği garantileme", - "get-eth": "ETH edin", + "get-eth": "ETH edinin", "get-involved": "Dahil olun", "get-started": "Başlayın", "grants": "Yardımlar", @@ -128,7 +132,7 @@ "last-edit": "Son düzenleme", "layer-2": "Katman 2", "learn": "Öğren", - "learn-by-coding": "Kodlayarak öğren", + "learn-by-coding": "Kodlayarak öğrenin", "learn-hub": "Bilgi Merkezi", "learn-menu": "Öğren menüsü", "learn-more": "Daha fazla bilgi edinin", @@ -142,10 +146,115 @@ "logo": "logo", "mainnet-ethereum": "Mainnet Ethereum", "merge": "Birleşme", - "more": "Daha fazlası", - "nav-developers": "Geliştiriciler", + "more": "Daha fazla", + "nav-about-description": "Ethereum topluluğu için halka açık, açık kaynaklı bir proje", + "nav-advanced-description": "Daha karmaşık konular hakkında bilgi edinin", + "nav-advanced-label": "Gelişmiş", + "nav-basics-description": "Ethereum'un temellerini anlamak", + "nav-basics-label": "Temel Bilgiler", + "nav-bridges-description": "Web3, birincil L1 blok zincirleri ve L2 ölçeklendirme çözümlerinden oluşan bir ekosisteme dönüştü", + "nav-builders-home-description": "Ethereum için geliştirici kılavuzu—geliştirenler tarafından geliştiriciler için", + "nav-builders-home-label": "Geliştirici evi", + "nav-contribute-description": "Yardım etmek istiyorsanız bu size yol gösterecektir", + "nav-contribute-label": "Ethereum.org'a katkıda bulunma", + "nav-dao-description": "Merkezi yetkiye sahip olmayan üyelere ait topluluklar", + "nav-dapps-description": "Ethereum'u kullanarak zengin uygulama ekosistemini keşfedin", + "nav-defi-description": "Geleneksel finans piyasasına küresel ve açık bir alternatif", + "nav-desci-description": "Mevcut bilimsel sisteme küresel ve açık bir alternatif", + "nav-desoc-description": "Sosyal etkileşim ve içerik oluşturma için blok zincir tabanlı platformlar", "nav-developers-docs": "Geliştirici dokümanları", + "nav-developers": "Geliştiriciler", + "nav-did-description": "Benzersiz merkezi olmayan tanımlayıcılarınızı yayınlayın ve bunlara sahip olun", + "nav-docs-description": "Ethereum'u anlamanıza ve geliştirmenize yardımcı olacak belgeler", + "nav-docs-design-description": "Benzersiz web3 tasarımı zorluklarının, en iyi uygulamaların ve kullanıcı araştırma bilgilerinin açıklaması", + "nav-docs-design-label": "UX/UI tasarım temelleri", + "nav-docs-foundation-description": "Ethereum'da geliştirilecek önemli temeller", + "nav-docs-foundation-label": "Temel konular", + "nav-docs-overview-description": "Geliştirici belgeleri için adresiniz", + "nav-docs-stack-description": "Ethereum yığınının tüm ayrıntılarını anlamak", + "nav-docs-stack-label": "Ethereum yığını", + "nav-eip-description": "Yeni özellikleri veya süreçleri belirleyen standartlar", + "nav-eip-label": "Ethereum iyileştirme önerileri (EIP'ler)", + "nav-emerging-description": "Ethereum'un diğer yeni kullanım örnekleri hakkında bilgi edinin", + "nav-emerging-label": "Yeni ortaya çıkan kullanım alanları", + "nav-enterprise-description": "Ethereum için iş uygulamaları", + "nav-ethereum-org-description": "Bu web sitesi topluluk odaklıdır-bize katılarak siz de katkıda bulunun", + "nav-ethereum-wallets-description": "Ethereum hesabınızla etkileşime girecek bir uygulama", + "nav-events-description": "Merkezi olmayan yönetim ve herkese katılma özgürlüğü", + "nav-events-irl-description": "Her ay şahsen ve çevrimiçi olarak sunulan önemli Ethereum etkinlikleri düzenleniyor", + "nav-events-label": "Topluluklar ve etkinlikler", + "nav-events-online-description": "Yüzbinlerce Ethereum tutkunu bu çevrimiçi topluluklarda bir araya geliyor", + "nav-find-wallet-description": "Cüzdanlar kripto kullanmanıza olanak sağlar", + "nav-find-wallet-label": "Cüzdanınızı seçin", + "nav-gas-fees-description": "ETH işlem ücretleri nasıl hesaplanıyor", + "nav-gas-fees-label": "Gaz ücretleri", + "nav-get-eth-description": "Ethereum uygulamalarını kullanmak için ether'e (ETH) ihtiyacınız var", + "nav-get-started-description": "Ethereum'u kullanmak için ilk adımlarınız", + "nav-governance-description": "Ethereum protokolünü yükseltme süreci", + "nav-governance-label": "Yönetim", + "nav-grants-description": "Hibe finansmanı programları sağlayan projeler hakkında topluluğumuzun hazırladığı bir liste", + "nav-guide-create-account-description": "Cüzdan uygulamasını kullanan herkes herhangi bir zamanda ücretsiz şekilde bir Ethereum hesabı oluşturabilir", + "nav-guide-create-account-label": "Bir Ethereum hesabı nasıl oluşturulur", + "nav-guide-revoke-access-description": "Ethereum ekosistemindeki akıllı sözleşmeler ve uygulamalarla etkileşimde bulunurken güvenliğinizi sağlayın", + "nav-guide-revoke-access-label": "Akıllı sözleşme erişimi nasıl iptal edilir", + "nav-guide-use-wallet-description": "Bir cüzdanın temel fonksiyonlarının nasıl kullanılacağını öğrenin", + "nav-guide-use-wallet-label": "Cüzdan nasıl kullanılır?", + "nav-guides-description": "Başlamanıza yardımcı olacak pratik adım adım kılavuzlar", + "nav-guides-label": "Nasıl yapılır kılavuzları", + "nav-history-description": "Tüm önemli çatallanmaların ve güncellemelerin zaman çizelgesi", + "nav-history-label": "Ethereum'un teknik tarihi", + "nav-layer-2-description": "Ethereum için daha ucuz ve daha hızlı işlemler", + "nav-learn-by-coding-description": "Ethereum'u denemenize yardımcı olacak araçlar", + "nav-local-env-description": "Ethereum geliştirme yığınınızı seçin ve oluşturun", + "nav-mainnet-description": "Halka açık Ethereum Ana Ağı üzerinde işletme blok zinciri uygulamaları oluşturulabilir", + "nav-nft-description": "Benzersiz bir şeyi Ethereum tabanlı bir varlık olarak göstermenin yolu", + "nav-open-research-description": "Ethereum'un başlıca avantajlarından biri sahip olduğu aktif araştırma topluluğudur", + "nav-open-research-label": "Açık araştırma", + "nav-overview-description": "Ethereum eğitimiyle ilgili her şey", + "nav-overview-label": "Genel Bakış", + "nav-participate-overview-description": "Nasıl katılınacağına ilişkin genel bakış", "nav-primary": "Birincil", + "nav-private-description": "Özel işletmeler için Ethereum geliştirici kaynakları", + "nav-quizzes-description": "Ethereum ve kripto paraları ne kadar iyi anladığınızı öğrenin", + "nav-quizzes-label": "Bilginizi sınayın", + "nav-refi-description": "Yenileyici ilkeler üzerine inşa edilen alternatif bir ekonomik sistem", + "nav-research-description": "Ethereum'u geliştirmek için kullanılan süreçler", + "nav-research-label": "Araştırma ve geliştirme", + "nav-roadmap-description": "Ethereum için daha ölçeklenebilir, güvenli ve sürdürülebilir olmanın yolu", + "nav-roadmap-future-description": "Ethereum'u sağlam ve merkezi olmayan bir ağ olarak güçlendirmek", + "nav-roadmap-future-label": "Geleceği garantileme", + "nav-roadmap-label": "Yol haritası", + "nav-roadmap-scaling-description": "İşlem maliyetlerini ve hızını azaltmaya yardımcı olan ağ güncellemeleri", + "nav-roadmap-scaling-label": "Daha ucuz işlemler", + "nav-roadmap-security-description": "Ethereum'un gelecekteki her türlü saldırıya karşı dayanıklı kalmasını sağlamak", + "nav-roadmap-security-label": "Gelişmiş güvenlik", + "nav-roadmap-ux-description": "Ethereum'un kullanımı basitleştirilmeli", + "nav-roadmap-ux-label": "Daha iyi kullanıcı deneyimi", + "nav-run-a-node-description": "Ağın güvenliğini sağlamaya yardımcı olurken tamamen hakim olun", + "nav-security-description": "Kripto paralarını kullanırken en iyi uygulamaları öğrenin", + "nav-smart-contracts-description": "Ethereum ekosisteminin temel yapı blokları", + "nav-stablecoins-description": "Stabil coin'ler sabit bir değerde kalacak şekilde tasarlanmış Ethereum token'larıdır", + "nav-stake-description": "Ethereum'u güvence altına alırken ödüller kazanın", + "nav-stake-label": "Kilit", + "nav-staking-home-description": "Farklı hisseleme seçeneklerine genel bakış", + "nav-staking-home-label": "Staking Ana Sayfa", + "nav-staking-pool-description": "Elinizdeki ETH miktarı farketmeksizin istediğiniz hisselemeye katılın ve ödüller kazanın", + "nav-staking-pool-label": "Havuzlanmış Staking", + "nav-staking-saas-description": "Üçüncü taraf düğüm operatörleri, doğrulayıcı istemcinizin çalışmasını yönetir", + "nav-staking-saas-label": "Bir hizmet ile hisseleme", + "nav-staking-solo-description": "Ev donanımını çalıştırın ve Ethereum ağının güvenliğine ve merkezsizleştirilmesine kişisel olarak katkıda bulunun", + "nav-staking-solo-label": "Tekli staking", + "nav-start-building-description": "Yeni başlayanlar için faydalı bilgiler", + "nav-translation-program-description": "Ethereum.org'u tüm dillere çevirmeyi amaçlayan ortak bir çalışma", + "nav-tutorials-description": "Topluluk eğitimleri için özel olarak hazırlanmış liste", + "nav-use-cases-description": "Ethereum kullanımına uygun farklı fikirleri keşfedin", + "nav-use-cases-label": "Kullanım alanları", + "nav-what-is-ether-description": "Ethereum uygulamalarının para birimi", + "nav-what-is-ethereum-description": "Ethereum'u özel kılan şeyin ne olduğunu öğrenmek", + "nav-what-is-web3-label": "Web3 nedir?", + "nav-what-is-web3-description": "Kuralları belirleyen merkezi tekellere bir alternatif", + "nav-whitepaper-description": "2014 yılında Vitalik Buterin tarafından yazılan orijinal Ethereum tanıtım belgesi", + "nav-zkp-description": "İfadenin kendisini açığa çıkarmadan bir ifadenin geçerliliğini kanıtlamanın bir yolu", "nft-page": "NFT'ler - Değiştirilemeyen tokenler", "nfts": "NFT'ler", "no": "Hayır", @@ -154,6 +263,8 @@ "page-developers-aria-label": "Geliştirici Menüsü", "page-index-meta-title": "Ana sayfa", "page-last-updated": "Sayfanın son güncellenmesi", + "participate": "Katılın", + "participate-menu": "Katılım menüsü", "pbs": "Teklifi yapan-oluşturucu ayrımı", "pools": "Havuzlanmış Staking", "privacy-policy": "Gizlilik politikası", @@ -164,6 +275,8 @@ "refresh": "Lütfen sayfayı yenileyiniz.", "return-home": "ana sayfaya dön", "roadmap": "Ethereum yol haritası", + "research": "Araştırma", + "research-menu": "Araştırma menüsü", "resources": "Çeviri kaynakları", "regenerative-finance": "SüFi - Sürdürülebilir finans", "run-a-node": "Bir düğüm çalıştırın", @@ -182,22 +295,21 @@ "single-slot-finality": "Tek yuva kesinliği", "statelessness": "Durumsuzluk", "see-contributors": "Katkıda bulunanları göster", - "set-up-local-env": "Yerel ortamı kur", + "set-up-local-env": "Yerel ortamı ayarla", "sharding": "Parçalama", "show-all": "Tümünü göster", "show-less": "Daha az göster", "site-description": "Ethereum, bir para ve yeni tür uygulamalar için evrensel, merkezi olmayan bir platformdur. Ethereum'da parayı kontrol eden kod yazabilir ve dünyanın her yerinden erişilebilir uygulamalar oluşturabilirsiniz.", - "site-title": "ethereum.org", "skip-to-main-content": "Ana içeriğe geç", "smart-contracts": "Akıllı sözleşmeler", - "stablecoins": "Sabit coinler", + "stablecoins": "Sabit paralar", "stake-eth": "ETH stake etme", "staking": "Stake etme", "start-here": "Başlamak için", "style-guide": "Stil rehberi", "solo": "Tekli staking", "support": "Destek", - "terms-of-use": "Kullanım Koşulları", + "terms-of-use": "Kullanım koşulları", "translation-banner-body-new": "Henüz çevirmediğimiz için bu sayfayı İngilizce olarak görüntülüyorsunuz. Bu içeriği çevirmemize yardım edin.", "translation-banner-body-update": "Bu sayfanın yeni bir sürümü vardır ancak şu anda yalnızca İngilizce'dir. Son sürümü çevirmemize yardımcı ol.", "translation-banner-button-see-english": "İngilizce'yi gör", @@ -211,8 +323,10 @@ "try-using-search": "Aradığınızı bulmak için arama işlevini kullanmayı deneyin veya", "tutorials": "Sunumlar", "up": "Yukarı", + "use": "Kullanım", "use-ethereum": "Ethereum'u Kullan", "use-ethereum-menu": "Ethereum menüsünü kullanın", + "use-menu": "Menüyü kullan", "user-experience": "Kullanıcı deneyimi", "verkle-trees": "Verkle ağaçları", "wallets": "Cüzdanlar", diff --git a/src/intl/uk/common.json b/src/intl/uk/common.json index 1d9a7bcdcaa..d02280b5942 100644 --- a/src/intl/uk/common.json +++ b/src/intl/uk/common.json @@ -1,17 +1,31 @@ { - "account-abstraction": "Абстрагування облікового запису", "about-ethereum-org": "Про ethereum.org", "about-us": "Про нас", + "adding-desci-projects": "Додавання проєктів Desci", + "adding-developer-tools": "Додавання інструментів розробника", + "adding-exchanges": "Додавання обмінників", + "adding-glossary-terms": "Додавання словникових термінів", + "adding-layer-2s": "Додавання Шару 2s", + "adding-products": "Додавання товарів", + "adding-staking-products": "Додавання продуктів стейкінгу", + "adding-wallets": "Додавання гаманців", + "account-abstraction": "Абстрагування облікового запису", + "acknowledgements": "Подяки", "aria-toggle-search-button": "Перемикання кнопки пошуку", "aria-toggle-menu-button": "Перемикання кнопки меню", "beacon-chain": "Beacon Chain", "bridges": "Мости блокчейну", + "bug-bounty": "Винагороди за виявлення помилок", + "build": "Будувати", + "build-menu": "Меню будівництва", "clear": "Очистити", "close": "Закрити", "community": "Спільнота", "community-hub": "Центр спільноти", "community-menu": "Меню «Спільнота»", "contact": "Контакти", + "content-buckets": "Категорії вмісту", + "content-resources": "Ресурси вмісту", "content-standardization": "Стандартизація контенту", "contributing": "Участь у проекті", "contributors": "Учасники проекту", @@ -27,7 +41,10 @@ "decentralized-identity": "Децентралізована ідентичність", "decentralized-social-networks": "Децентралізовані соціальні мережі", "decentralized-science": "DeSci - Децентралізована наука", + "description": "Опис елемента навігації", "defi-page": "DeFi - Децентралізовані фінанси", + "design": "Оформлення", + "design-principles": "Принципи оформлення", "devcon": "Devcon", "developers": "Розробникам", "developers-home": "Головна сторінка для розробників", @@ -51,7 +68,7 @@ "documentation": "Документація", "down": "Вниз", "ecosystem": "Екосистема", - "edit-page": "Змінити сторінку", + "edit-page": "Виправити сторінку", "ef-blog": "Блог Ethereum Foundation", "eips": "Пропозиції покращення Ethereum", "energy-consumption": "Енергоспоживання Ethereum", @@ -63,7 +80,7 @@ "ethereum-bug-bounty": "Програма винагород за пошук помилок Ethereum", "consensus-when-shipping": "Коли відбудеться запуск?", "ethereum-upgrades": "Оновлення Ethereum", - "ethereum-brand-assets": "Елементи бренду Ethereum", + "ethereum-brand-assets": "Ресурси бренду Ethereum", "ethereum-online": "Онлайн-спільноти", "ethereum-events": "Події Ethereum", "ethereum-foundation": "Ethereum Foundation", @@ -83,22 +100,22 @@ "feedback-card-prompt-tutorial": "Чи була ця інструкція корисною?", "feedback-widget-thank-you-title": "Дякуємо за ваш відгук!", "feedback-widget-thank-you-subtitle": "Зробіть цю сторінку ще кращою, відповівши на кілька запитань.", - "feedback-widget-thank-you-subtitle-ext": "Якщо вам потрібна допомога, ви можете звернутися до нашої спільноти в Discord.", + "feedback-widget-thank-you-subtitle-ext": "Якщо вам потрібна допомога, ви можете зв'язатися зі спільнотою на нашому Discord.", "feedback-widget-thank-you-timing": "2-3 хв", "feedback-widget-thank-you-cta": "Відкрийте коротке опитування", "find-wallet": "Знайти гаманець", "future-proofing": "Забезпечення майбутнього", - "get-eth": "Як отримати ETH", + "get-eth": "Отримати ETH", "get-involved": "Долучитися", - "get-started": "Почати", + "get-started": "Початок роботи", "grants": "Гранти", "grant-programs": "Програми грантів екосистеми", "guides": "Посібники", - "guides-hub": "Центр посібників", + "guides-hub": "Інструкції", "history-of-ethereum": "Історія Ethereum", "home": "Головна", "how-ethereum-works": "Як працює Ethereum", - "how-to-register-an-ethereum-account": "Як зареєструвати обліковий запис Ethereum", + "how-to-create-an-ethereum-account": "Як «створити» обліковий запис Ethereum", "how-to-revoke-token-access": "Як анулювати доступ смарт-контракту до ваших криптовалютних ресурсів", "how-to-swap-tokens": "Як обміняти токени", "how-to-use-a-bridge": "Як перевести токени у шар 2", @@ -128,10 +145,116 @@ "loading-error-try-again-later": "Неможливо завантажити дані. Спробуйте пізніше.", "logo": "логотип", "mainnet-ethereum": "Основна мережа Ethereum", + "merge": "Злиття", "more": "Більше", - "nav-developers": "Розробники", + "nav-about-description": "Публічний проєкт із відкритим вихідним кодом для спільноти Ethereum", + "nav-advanced-description": "Вивчайте складніші теми", + "nav-advanced-label": "Для досвідчених розробників", + "nav-basics-description": "Про основи Ethereum", + "nav-basics-label": "Основне", + "nav-bridges-description": "Концепція Web3 перетворилася на екосистему первинних блокчейнів L1 і рішень для масштабування L2", + "nav-builders-home-description": "Посібник із програмування на Ethereum. Створено розробниками для розробників", + "nav-builders-home-label": "Головна сторінка розробника", + "nav-contribute-description": "Якщо ви хочете допомогти, тут ви дізнаєтеся, як це зробити", + "nav-contribute-label": "Сприяння розвитку ethereum.org", + "nav-dao-description": "Спільноти, що належать учасникам, без централізованого керування", + "nav-dapps-description": "Дослідіть багату екосистему програм, що використовують Ethereum", + "nav-defi-description": "Глобальна відкрита альтернатива традиційному фінансовому ринку", + "nav-desci-description": "Глобальна, відкрита альтернатива сучасній науковій системі", + "nav-desoc-description": "Платформи на основі блокчейну для соціальної взаємодії та створення контенту", "nav-developers-docs": "Документація для розробників", + "nav-developers": "Розробникам", + "nav-did-description": "Випускайте децентралізовані ідентифікатори та володійте ними", + "nav-docs-description": "Документи, які допоможуть вам краще зрозуміти платформу Ethereum та будувати з її допомогою", + "nav-docs-design-description": "Опис унікальних викликів web3-дизайну, найкращих методик і результатів досліджень користувачів", + "nav-docs-design-label": "Основи UX/UI-дизайну", + "nav-docs-foundation-description": "Основні принципи розробки на Ethereum", + "nav-docs-foundation-label": "Основоположні теми", + "nav-docs-overview-description": "Ваша головна сторінка для документації розробника", + "nav-docs-stack-description": "Про всі деталі стека Ethereum", + "nav-docs-stack-label": "Стековий список Ethereum", + "nav-eip-description": "Стандарти, які визначають нові функції або процеси", + "nav-eip-label": "Пропозиції покращення Ethereum (EIP)", + "nav-emerging-description": "Ознайомтеся з іншими новими варіантами використання Ethereum", + "nav-emerging-label": "Нові варіанти використання", + "nav-enterprise-description": "Бізнес-програми для Ethereum", + "nav-ethereum-org-description": "Цей сайт керується спільнотою — приєднуйтеся до нас і робіть свій внесок", + "nav-ethereum-wallets-description": "Програма для взаємодії з вашим обліковим записом Ethereum", + "nav-events-description": "Децентралізація та право участі для кожного", + "nav-events-irl-description": "Щомісяця відбуваються великі події, пов’язані з Ethereum, як очні, так і онлайн", + "nav-events-label": "Спільноти та події", + "nav-events-online-description": "Сотні тисяч ентузіастів Ethereum беруть участь у цих онлайн-спільнотах", + "nav-find-wallet-description": "Гаманці дають змогу використовувати криптовалюту", + "nav-find-wallet-label": "Виберіть свій гаманець", + "nav-gas-fees-description": "Як розраховується комісія за транзакції ETH", + "nav-gas-fees-label": "Плата за газ", + "nav-get-eth-description": "Щоб використовувати програми Ethereum, потрібен ether (ETH)", + "nav-get-started-description": "Перші кроки з використання Ethereum", + "nav-governance-description": "Процес оновлення протоколу Ethereum", + "nav-governance-label": "Керування", + "nav-grants-description": "Спеціальний список від нашої спільноти щодо проєктів, які надають програми грантового фінансування", + "nav-guide-create-account-description": "Будь-хто може безкоштовно створити обліковий запис Ethereum за допомогою програми-гаманця в будь-який час", + "nav-guide-create-account-label": "Як створити обліковий запис Ethereum", + "nav-guide-revoke-access-description": "Залишайтеся в безпеці під час взаємодії зі смартконтрактами та програмами в екосистемі Ethereum", + "nav-guide-revoke-access-label": "Як анулювати доступ смартконтракту", + "nav-guide-use-wallet-description": "Дізнайтеся, як працюють усі основні функції гаманця", + "nav-guide-use-wallet-label": "Як користуватися гаманцем", + "nav-guides-description": "Практичні покрокові інструкції, які допоможуть вам розпочати роботу", + "nav-guides-label": "Інструкції", + "nav-history-description": "Хронологія всіх основних форків і оновлень", + "nav-history-label": "Технічна історія Ethereum", + "nav-layer-2-description": "Дешевші та швидші транзакції для Ethereum", + "nav-learn-by-coding-description": "Інструменти, які допоможуть вам експериментувати з Ethereum", + "nav-local-env-description": "Виберіть і налаштуйте стек для розробки Ethereum", + "nav-mainnet-description": "Корпоративні блокчейн-програми можуть бути побудовані на загальнодоступній головній мережі Ethereum", + "nav-nft-description": "Спосіб представити що-небудь унікальне як актив на основі Ethereum", + "nav-open-research-description": "Однією з головних переваг Ethereum є його активна дослідницька спільнота", + "nav-open-research-label": "Відкрите дослідження", + "nav-overview-description": "Усе про освіту у сфері Ethereum", + "nav-overview-label": "Огляд", + "nav-participate-overview-description": "Огляд того, як узяти участь", "nav-primary": "Головна", + "nav-private-description": "Ресурси для розробників для приватного підприємства Ethereum", + "nav-quizzes-description": "Дізнайтеся, наскільки добре ви розбираєтеся в Ethereum і криптовалютах", + "nav-quizzes-label": "Перевірте свої знання", + "nav-refi-description": "Альтернативна економічна система, побудована на регенеративних принципах", + "nav-research-description": "Процеси, що використовуються для покращення Ethereum", + "nav-research-label": "Дослідження та розробка", + "nav-roadmap-description": "Шлях до масштабованості, безпеки та сталого розвитку Ethereum", + "nav-roadmap-future-description": "Зміцнення Ethereum як надійної та децентралізованої мережі", + "nav-roadmap-future-label": "Забезпечення майбутнього", + "nav-roadmap-label": "План розвитку", + "nav-roadmap-scaling-description": "Оновлення мережі для подальшого зниження транзакційних витрат і збільшення швидкості виконання операцій", + "nav-roadmap-scaling-label": "Дешевші транзакції", + "nav-roadmap-security-description": "Забезпечення стійкості Ethereum до всіх видів атак у майбутньому", + "nav-roadmap-security-label": "Покращена безпека", + "nav-roadmap-ux-description": "Використання Ethereum потребує спрощення", + "nav-roadmap-ux-label": "Кращий користувацький досвід", + "nav-run-a-node-description": "Отримайте абсолютну самостійність, допомагаючи захистити мережу", + "nav-security-description": "Ознайомтеся з найкращими методиками використання криптовалюти", + "nav-smart-contracts-description": "Фундаментальні блоки екосистеми Ethereum", + "nav-stablecoins-description": "Стабільні монети — це токени Ethereum, створені, щоб зберігати фіксоване значення", + "nav-stake-description": "Заробляйте винагороди, захищаючи Ethereum", + "nav-stake-label": "Ставка", + "nav-staking-home-description": "Огляд різних можливостей для стейкінгу", + "nav-staking-home-label": "Стейкінг: головна сторінка", + "nav-staking-pool-description": "Вкладайте кошти й отримуйте винагороди з будь-якою кількістю ETH, об’єднуючи зусилля з іншими.", + "nav-staking-pool-label": "Стейкінг у пулі", + "nav-staking-saas-description": "Сторонні оператори вузлів керують роботою вашого клієнта перевірки.", + "nav-staking-saas-label": "Стейкінг як послуга", + "nav-staking-solo-description": "Запустіть домашнє обладнання та особисто додайте безпеку й децентралізацію мережі Ethereum.", + "nav-staking-solo-label": "Одиночний стейкінг", + "nav-start-building-description": "Корисна інформація для новачків", + "nav-translation-program-description": "Спільна робота над перекладом сайту ethereum.org на всі мови світу", + "nav-tutorials-description": "Спеціальний список посібників спільноти", + "nav-use-cases-description": "Відкрийте для себе різні ідеї щодо використання Ethereum", + "nav-use-cases-label": "Варіанти використання", + "nav-what-is-ether-description": "Валюта в програмах Ethereum", + "nav-what-is-ethereum-description": "Про те, що робить Ethereum особливим", + "nav-what-is-web3-label": "Що таке Web3?", + "nav-what-is-web3-description": "Альтернатива централізованим монополіям, що диктують правила", + "nav-whitepaper-description": "Початкова документація Ethereum, складена Віталіком Бутеріним у 2014 році", + "nav-zkp-description": "Спосіб довести правдивість твердження, не розкриваючи саме твердження", "nft-page": "NFT - Невзаємозамінні токени", "nfts": "NFT", "no": "Ні", @@ -140,6 +263,8 @@ "page-developers-aria-label": "Меню розробника", "page-index-meta-title": "Головна", "page-last-updated": "Останнє оновлення сторінки", + "participate": "Візьміть участь", + "participate-menu": "Меню учасника", "pbs": "Розрізнення автора пропозиції та розробника", "pools": "Стейкінг у пулі", "privacy-policy": "Політика конфіденційності", @@ -150,10 +275,12 @@ "refresh": "Оновіть сторінку.", "return-home": "поверніться на головну сторінку", "roadmap": "План розвитку Ethereum", + "research": "Дослідження", + "research-menu": "Меню дослідника", "resources": "Ресурси для перекладу", "regenerative-finance": "ReFi - Регенеративні фінанси", - "run-a-node": "Запуск вузла", - "rollup-component-website": "Сайт", + "run-a-node": "Запустити вузол", + "rollup-component-website": "Website", "rollup-component-developer-docs": "Документація для розробників", "rollup-component-technology-and-risk-summary": "Огляд технологій і ризиків", "scaling": "Масштабування", @@ -164,6 +291,7 @@ "search-box-blank-state-text": "Введіть пошуковий запит.", "search-eth-address": "Схоже, це адреса Ethereum. Ми не надаємо дані про адреси. Спробуйте знайти їх у посібник із блоків, наприклад", "search-no-results": "Пошук не дав результатів", + "security": "Security", "single-slot-finality": "Завершення в одному слоті", "statelessness": "Відсутність стану", "see-contributors": "Переглянути учасників", @@ -175,12 +303,13 @@ "site-title": "ethereum.org", "skip-to-main-content": "Перейти до основного контенту", "smart-contracts": "Смарт-контракти", - "stablecoins": "Stablecoins", + "stablecoins": "Стабільні монети", "stake-eth": "Частка ETH", "staking": "Стейкінг", "start-here": "Почніть тут", "style-guide": "Керівництво по стилю", "solo": "Одиночний стейкінг", + "support": "Підтримка", "terms-of-use": "Умови використання", "translation-banner-body-new": "Ця сторінка відображається англійською мовою, оскільки ми ще не переклали її. Допоможіть нам у цьому.", "translation-banner-body-update": "Ми оновили контент на цій сторінці, але наразі нова версія доступна лише англійською мовою. Допоможіть нам її перекласти.", @@ -191,11 +320,14 @@ "translation-banner-no-bugs-title": "Тут немає помилок!", "translation-banner-no-bugs-content": "Ця сторінка не перекладається. Ми навмисно поки що залишили її англійською.", "translation-banner-no-bugs-dont-show-again": "Не показувати знову", + "translation-program": "програму перекладів", "try-using-search": "Спробуйте скористатися пошуком, щоб знайти те, що ви шукаєте, або", "tutorials": "Навчальні посібники", "up": "Вгору", + "use": "Використання", "use-ethereum": "Використання Ethereum", "use-ethereum-menu": "Використання меню Ethereum", + "use-menu": "Меню користувача", "user-experience": "Взаємодія з користувачем", "verkle-trees": "Дерева Веркла", "wallets": "Гаманці", diff --git a/src/intl/ur/common.json b/src/intl/ur/common.json index c25636ae3ca..1535bda07ef 100644 --- a/src/intl/ur/common.json +++ b/src/intl/ur/common.json @@ -1,30 +1,70 @@ { "about-ethereum-org": "ethereum.org کے بارے میں", "about-us": "ہمارے بارے میں", + "adding-desci-projects": "Desci پراجیکٹس کو شامل کرنا", + "adding-developer-tools": "ڈویلپر ٹولز شامل کرنا", + "adding-exchanges": "ایکسچینجز کو شامل کرنا", + "adding-glossary-terms": "لغت کی اصطلاحات شامل کرنا", + "adding-staking-products": "اسٹیکنگ پروڈکٹس کو شامل کرنا", + "adding-wallets": "والیٹ شامل کرنا", + "account-abstraction": "اکاؤنٹ کا خلاصہ", + "acknowledgements": "تسلیمات", "aria-toggle-search-button": "تلاش کے بٹن کو ٹوگل کریں", "aria-toggle-menu-button": "مینو بٹن ٹوگل کریں", "beacon-chain": "بیکن چین", "bridges": "بلاک چین بریجز", + "bug-bounty": "بگ باؤنٹی", + "build": "تعمیر کریں", + "build-menu": "تعمیر کریں کا مینو", + "clear": "صاف کریں", "close": "بند کریں", "community": "کمیونٹی", "community-hub": "کمیونٹی کا مرکز", "community-menu": "کمیونٹی مینو", "contact": "رابطہ", + "content-buckets": "مواد کی بالٹیاں", + "content-resources": "مواد کے وسائل", + "content-standardization": "مواد کی معیارکاری", "contributing": "شراکت داری کرنا", "contributors": "شراکت دار", "contributors-thanks": "ان تمام لوگوں کا شکریہ - جنہوں نے اس صفحہ کیلئے شراکت کی!", "cookie-policy": "کوکی پالیسی", "copied": "کاپی کیا گیا", "copy": "کاپی کریں", + "danksharding": "ڈینک شرڈنگ", + "dao-page": "DAOs - غیر مرکزی خودمختار تنظیمیں", "dark-mode": "گہرا", "data-provided-by": "ڈیٹا کا ذریعہ:", "decentralized-applications-dapps": "Dapps - غیر مرکزی ایپلیکیشنز", + "decentralized-identity": "غیر مرکزی شناخت", + "decentralized-social-networks": "غیر مرکزی سوشل نیٹ ورکس", "decentralized-science": "DeSci - غیر مرکزی سائنس", + "description": "نیویگیشن آئٹم کی تفصیل", + "defi-page": "DeFi - غیر مرکزی مالیات", + "design": "ڈیزائن", + "design-principles": "ڈیزائن کے اصول", "devcon": "ڈیوکون", "developers": "ڈویلپرز", "developers-home": "ڈویلپرز کا ہوم", "docs": "دستاویز", + "docsearch-to-select": "منتخب کرنا", + "docsearch-to-navigate": "نیویگیٹ کرنا", + "docsearch-to-close": "بند کرنا", + "docsearch-search-by": "تلاش کریں بلحاظ", + "docsearch-start-recent-searches-title": "حالیہ", + "docsearch-start-no-recent-searches": "کوئی حالیہ تلاش نہیں", + "docsearch-start-save-recent-search": "اس تلاش کو محفوظ کریں", + "docsearch-start-remove-recent-search": "اس تلاش کو ہسٹری سے ہٹا دیں", + "docsearch-start-favorite-searches": "پسندیدہ", + "docsearch-start-remove-favorite-search": "اس تلاش کو پسندیدہ سے ہٹا دیں", + "docsearch-no-results-text": "کے لیے کوئی نتائج نہیں ہیں", + "docsearch-no-results-suggested-query": "تلاش کرنے کی کوشش کریں", + "docsearch-no-results-missing": "یقین ہے کہ اس سوال کے جواب ملیں گے؟", + "docsearch-no-results-missing-link": "ہمیں بتائیں۔", + "docsearch-error-title": "نتائج حاصل کرنے سے قاصر", + "docsearch-error-help": "ہو سکتا ہے آپ اپنا نیٹ ورک کنکشن چیک کرنا چاہیں۔", "documentation": "دستاویز کاری", + "down": "نیچے", "ecosystem": "ایکو سسٹم", "edit-page": "صفحے میں ترمیم کریں", "ef-blog": "Ethereum فاؤنڈیشن بلاگ", @@ -45,6 +85,8 @@ "ethereum-glossary": "Ethereum لغت", "ethereum-governance": "Ethereum گورننس", "ethereum-logo": "Ethereum لوگو", + "ethereum-roadmap": "ایتھریم روڈ میپ", + "ethereum-protocol": "ایتھریم پروٹوکول", "ethereum-security": "Ethereum سیکورٹی اور جعل سازی کی روک تھام", "ethereum-support": "Ethereum سپورٹ", "ethereum-wallets": "Ethereum والیٹس", @@ -55,22 +97,21 @@ "feedback-card-prompt-tutorial": "کیا یہ ٹیوٹوریل کارآمد تھا؟", "feedback-widget-thank-you-title": "آپ کے فیڈبیک کے لیے شکریہ!", "feedback-widget-thank-you-subtitle": "چند سوالوں کے جواب دے کر اس صفحے کو مزید بہتر بنائیں۔", - "feedback-widget-thank-you-subtitle-ext": "اگر آپ کو مدد کی ضرورت ہے، تو آپ ہمارے Discord پر کمیونٹی سے رابطہ کر سکتے ہیں۔", + "feedback-widget-thank-you-subtitle-ext": "اگر آپ کو مدد کی ضرورت ہو تو آپ ہمارے Discord پر کمیونٹی سے رابطہ کر سکتے ہیں۔", "feedback-widget-thank-you-timing": "2–3 منٹ", "feedback-widget-thank-you-cta": "مختصر سروے کھولیں", "find-wallet": "والیٹ تلاش کریں", + "future-proofing": "مستقبل کا ثبوت", "get-eth": "ETH حاصل کریں", "get-involved": "شامل ہوں", - "get-started": "شروع کریں", + "get-started": "شروع کرے", "grants": "گرانٹس", "grant-programs": "ایکو سسٹم گرانٹ پروگرامز", - "guides-and-resources": "کمیونٹی کے اصول اور ذرائع", "guides": "اصول", - "guides-hub": "اصولوں کا مرکز", + "guides-hub": "طریقہ کار کی رہنمائیاں", "history-of-ethereum": "Ethereum کی ہسٹری", "home": "ہوم", "how-ethereum-works": "Ethereum کیسے کام کرتا ہے", - "how-to-create-an-ethereum-account": "Ethereum اکاؤنٹ کو کیسے \"رجسٹر\" کریں", "how-to-revoke-token-access": "اسمارٹ کانٹریکٹ کی اپنے کرپٹو فنڈز تک رسائی کیسے منسوخ کریں", "how-to-swap-tokens": "ٹوکنز کو کیسے سواپ کریں", "how-to-use-a-bridge": "ٹوکنز کو تہہ نمبر 2 تک کیسے بریج کریں", @@ -88,6 +129,7 @@ "layer-2": "تہہ نمبر 2", "learn": "سیکھیں", "learn-by-coding": "کوڈنگ سے سیکھیں", + "learn-hub": "سیکھنے کا مرکز", "learn-menu": "مینو جانیں", "learn-more": "مزید جانیں", "less": "کم", @@ -96,44 +138,154 @@ "loading": "لوڈ ہو رہا ہے...", "loading-error": "لوڈ ہونے میں نقص۔", "loading-error-refresh": "نقص، براہ کرم ریفریش کریں۔", + "loading-error-try-again-later": "ڈیٹا لوڈ کرنے میں ناکام۔ بعد میں دوبارہ کوشش کریں۔", "logo": "لوگو", "mainnet-ethereum": "مین نیٹ Ethereum", + "merge": "ضم کریں", "more": "مزید", - "nav-developers": "ڈویلپرز", + "nav-about-description": "ایتھریئم کمیونٹی کے لیے ایک عوامی، اوپن سورس پراجیکٹ", + "nav-advanced-description": "مزید پیچیدہ موضوعات کے بارے میں جانیں", + "nav-basics-description": "ایتھریئم کے بنیادی اصولوں کو سمجھیں", + "nav-basics-label": "بنیادی چیزیں", + "nav-bridges-description": "Web3 نے ترقی کرتے ہوئے بنیادی L1 بلاک چینز اور L2 توسیع پذیر حلوں کے ایک ایکو سسٹم کی صورت اختیار کر لی ہے", + "nav-builders-home-description": "ایتھریئم کے لیے ایک بلڈر کا رہنما کتابچہ—بلڈرز کی جانب سے، بلڈرز کے لیے تیار کردہ", + "nav-builders-home-label": "بلڈر کا ہوم", + "nav-contribute-description": "اگر آپ مدد کرنا چاہتے ہیں، تو یہ آپ کی رہنمائی کرے گا", + "nav-contribute-label": "ethereum.org میں اپنا حصہ ڈالنا", + "nav-dao-description": "کسی مرکزی اتھارٹی کے بغیر اراکین کے زیر ملکیت کمیونٹیز", + "nav-dapps-description": "ایتھریئم استعمال کرتے ہوئے ایپس کے ایک وسیع ایکو سسٹم کو دریافت کریں", + "nav-defi-description": "روایتی مالیاتی مارکیٹ کا ایک عالمگیر، شفاف متبادل", + "nav-desci-description": "موجودہ سائنسی سسٹم کا ایک عالمگیر، شفاف متبادل", + "nav-desoc-description": "سماجی تعامل اور مواد کی تخلیق کاری کے لیے بلاک چین پر مبنی پلیٹ فارمز", "nav-developers-docs": "ڈویلپرز دستاویزات", + "nav-developers": "ڈویلپرز", + "nav-did-description": "اپنی منفرد غیر مرکزی شناختوں کا اجراء کریں اور ان کے مالک بنیں", + "nav-docs-description": "ایتھریئم کے ساتھ تعمیر کرنے اور اسے سمجھنے میں آپ کی مدد کے لیے دستاویزات", + "nav-docs-design-description": "web3 ڈیزائن کے منفرد مسائل، بہترین حکمت عملیوں اور صارفی تحقیق سے متعلقہ بصیرتوں کی تفصیل", + "nav-docs-design-label": "UX/UI ڈیزائن کے بنیادی اصول", + "nav-docs-foundation-description": "ایتھریئم پر چیزیں بنانے کے بنیادی اصول", + "nav-docs-overview-description": "ڈویلپر کی دستاویزات کے لیے آپ کا ہوم", + "nav-docs-stack-description": "ایتھریئم اسٹیک کی تمام تفصیلات کو سمجھیں", + "nav-eip-description": "وہ معیارات جو نئی خصوصیات یا عوامل کی وضاحت کرتے ہیں", + "nav-eip-label": "ایتھریئم کی بہتری کی تجاویز (EIPs)", + "nav-emerging-description": "ایتھریئم کے لیے دیگر نئی استعمال کی صورتوں کی معلومات حاصل کریں", + "nav-enterprise-description": "ایتھریئم کے لیے کاروباری ایپلی کیشنز", + "nav-ethereum-org-description": "یہ ویب سائٹ کمیونٹی کے زیر انتظام ہے—ہمارے ساتھ شامل ہوں اور اپنا حصہ بھی ڈالیں", + "nav-ethereum-wallets-description": "اپنے ایتھریئم اکاؤنٹ کے ساتھ تعامل کرنے کی ایپ", + "nav-events-description": "غیر مرکزیت اور ہر شخص کو اپنا کردار ادا کرنے کی آزادی", + "nav-events-irl-description": "ہر مہینے ایتھریئم کے بڑے بالمشافہ اور آن لائن ایونٹس منعقد ہوتے ہیں", + "nav-events-label": "کمیونٹیز اور ایونٹس", + "nav-events-online-description": "ایتھریئم کمیونٹیز کے پرجوش صارفین کی کثیر تعداد ان آن لائن کمیونٹیز میں اکٹھی ہوتی ہے", + "nav-find-wallet-description": "والیٹس آپ کو کرپٹو استعمال کرنے کی اجازت دیتے ہیں", + "nav-find-wallet-label": "اپنا والیٹ منتخب کریں", + "nav-gas-fees-description": "ETH کی ٹرانزیکشن فیس کا حساب کیسے لگایا جاتا ہے", + "nav-get-eth-description": "ایتھریئم ایپلی کیشنز استعمال کرنے کے لیے آپ کو ایتھر (ETH) کی ضرورت ہوتی ہے", + "nav-get-started-description": "ایتھریئم استعمال کرنے کے لیے آپ کے ابتدائی مراحل", + "nav-governance-description": "ایتھریئم پروٹوکول کو اپ گریڈ کرنے پر مشتمل عمل", + "nav-governance-label": "گورننس", + "nav-grants-description": "ہماری کمیونٹی کے ایسے پراجیکٹس کی ایک منتخب شدہ فہرست جو گرانٹ فنڈنگ کے پروگرامز فراہم کرتے ہیں", + "nav-guide-create-account-description": "والیٹ ایپ کے ساتھ، کوئی بھی شخص کسی بھی وقت ایتھریئم اکاؤنٹ مفت تخلیق کر سکتا ہے", + "nav-guide-revoke-access-description": "ایتھریئم ایکو سسٹم میں اسمارٹ معاہدوں اور ایپلی کیشنز کے ساتھ تعامل کرتے وقت محفوظ رہیں", + "nav-guide-revoke-access-label": "اسمارٹ معاہدے تک رسائی کو کیسے منسوخ کریں", + "nav-guide-use-wallet-description": "والیٹ کے تمام بنیادی فنکشنز کو آپریٹ کرنے کا طریقہ کار جانیں", + "nav-guide-use-wallet-label": "والیٹ کا استعمال کیسے کریں", + "nav-guides-description": "آغاز کرنے میں آپ کی مدد کے لیے مرحلہ وار عملی رہنمائیاں", + "nav-guides-label": "طریقہ کار کی رہنمائیاں", + "nav-history-description": "تمام بڑی فورکس اور اپ ڈیٹس کی ٹائم لائن", + "nav-history-label": "ایتھریئم کی تکنیکی ہسٹری", + "nav-layer-2-description": "ایتھریئم کے لیے سستی اور تیز تر ٹرانزیکشنز", + "nav-learn-by-coding-description": "ایتھریئم کا تجربہ حاصل کرنے میں آپ کی مدد کے لیے ٹولز", + "nav-local-env-description": "اپنا ایتھریئم ڈویلپمنٹ اسٹیک منتخب کریں اور اسے سیٹ اپ کریں", + "nav-mainnet-description": "ایتھریئم کے عوامی مین نیٹ پر انٹرپرائز بلاک چین کی ایپلی کیشنز تیار کی جا سکتی ہیں", + "nav-nft-description": "ایک ایتھریئم پر مبنی اثاثے کی حیثیت سے کسی بھی منفرد چیز کی نمائندگی کرنے کا ایک طریقہ", + "nav-open-research-description": "ایتھریئم کی بنیادی خوبیوں میں سے ایک چیز اس کی فعال محقق کمیونٹی ہے", + "nav-open-research-label": "ریسرچ کھولیں", + "nav-overview-description": "ایتھریئم کی تعلیم سے متعلق تمام چیزیں", + "nav-participate-overview-description": "شرکت کرنے کے طریقہ کار کا جائزہ", "nav-primary": "بنیادی", + "nav-quizzes-description": "جانیں کہ آپ ایتھریئم اور کرپٹو کرنسیز کو کتنے بہتر انداز میں سمجھتے ہیں", + "nav-quizzes-label": "اپنے علم کی جانچ کریں", + "nav-refi-description": "ایک متبادل معاشی نظام جو تخلیق نو کے اصولوں پر قائم کیا گیا ہے", + "nav-research-description": "ایتھریئم کی بہتری میں استعمال ہونے والے طریقے", + "nav-research-label": "تحقیق اور ترقی", + "nav-roadmap-description": "ایک ایسا راستہ جو ایتھریئم کے لیے زیادہ توسیع پذیری، سکیورٹی اور پائیداری کو فروغ دیتا ہے", + "nav-roadmap-future-description": "ایتھریئم کو ایک مضبوط اور غیر مرکزی نیٹ ورک کی حیثیت سے مستحکم بنانا", + "nav-roadmap-future-label": "مستقبل کا ثبوت", + "nav-roadmap-label": "روڈ میپ", + "nav-roadmap-scaling-description": "ٹرانزیکشن کے اخراجات اور رفتار کو مزید کم کرنے کے لیے نیٹ ورک کی اپ ڈیٹس", + "nav-roadmap-security-description": "اس بات کو یقینی بنانا کہ ایتھریئم مستقبل میں ہر قسم کے حملوں کے خلاف مزاحم رہے", + "nav-roadmap-security-label": "بہتر کردہ سکیورٹی", + "nav-roadmap-ux-description": "ایتھریئم کے استعمال کو آسان بنانے کی ضرورت ہے", + "nav-run-a-node-description": "نیٹ ورک کو محفوظ بنانے میں مدد کرتے ہوئے مکمل طور پر خود مختار بنیں", + "nav-security-description": "کرپٹو کرنسی استعمال کرتے وقت بہترین حکمت عملیاں سیکھیں", + "nav-smart-contracts-description": "ایتھریئم ایکو سسٹم کے بنیادی بلڈنگ بلاکس", + "nav-stablecoins-description": "اسٹیبل کوائنز وہ ایتھریئم ٹوکنز ہیں جنہیں ایک مقررہ قیمت پر برقرار رکھنے کے لیے ڈیزائن کیا جاتا ہے", + "nav-stake-description": "ایتھریئم کو محفوظ بنانے کے عوض انعامات حاصل کریں", + "nav-stake-label": "اسٹیک کرنا", + "nav-staking-home-description": "اسٹیکنگ کے مختلف اختیارات کا ایک جائزہ", + "nav-staking-pool-description": "دوسروں کے ساتھ شامل ہوتے ہوئے ETH کی کسی بھی رقم کے ساتھ اسٹیک کریں اور انعامات حاصل کریں", + "nav-staking-pool-label": "پُولڈ اسٹیکنگ", + "nav-staking-saas-label": "سروس کے ساتھ اسٹیکنگ", + "nav-staking-solo-label": "سولواسٹیکنگ", + "nav-start-building-description": "نوآموز افراد کے لیے مفید معلومات", + "nav-translation-program-description": "تمام زبانوں میں ethereum.org کا ترجمہ کرنے کی ایک اجتماعی کاوش", + "nav-tutorials-description": "کمیونٹی ٹیوٹوریلز کی ایک منتخب شدہ فہرست", + "nav-use-cases-description": "ایتھریئم کے استعمال کے مختلف تصورات دریافت کریں", + "nav-what-is-ether-description": "ایتھریئم ایپس کی کرنسی", + "nav-what-is-ethereum-description": "جانیں کہ ایتھریئم کی انفرادیت کا کیا راز ہے", + "nav-what-is-web3-label": "Web3 کیا ہے؟", + "nav-what-is-web3-description": "قوانین کا تعین کرنے والی مرکزی اجارہ داریوں کا متبادل", + "nav-whitepaper-description": "ایتھریئم کا اصل وائٹ پیپر 2014 میں Vitalik Buterin نے لکھا تھا", + "nav-zkp-description": "ایک ایسا طریقہ جس سے کسی بیان کو ازخود ظاہر کیے بغیر اس بیان کی درستگی کی توثیق کی جا سکتی ہے", + "nft-page": "NFTs - نان فنجیبل ٹوکنز", "nfts": "NFTs", "no": "نہیں", "on-this-page": "اس صفحے پر", "open-research": "ریسرچ کھولیں", + "page-developers-aria-label": "ڈویلپرز کا مینو", + "page-index-meta-title": "ہوم", "page-last-updated": "صفحہ آخری بار اپ ڈیٹ کیا گیا", + "participate-menu": "حصہ لینے کا مینو", + "pbs": "تجویز کنندہ بلڈر کی علیحدگی", + "pools": "پُولڈ اسٹیکنگ", "privacy-policy": "رازداری کی پالیسی", "private-ethereum": "پرائیویٹ Ethereum", + "product-disclaimer": "مصنوعات اور خدمات ایتھریم کمیونٹی کے لیے ایک سہولت کے طور پر درج ہیں۔ کسی پروڈکٹ یا سروس کی شمولیت ethereum.org ویب سائٹ ٹیم، یا Ethereum Foundation کی طرف سے تصدیق کی نمائندگی نہیں کرتی ہے۔", + "quizzes-title": "کوئز ہب", + "quizzes": "کوئزز", "refresh": "براہ کرم صفحہ ریفریش کریں۔", "return-home": "ہوم پر واپس جائیں", + "roadmap": "ایتھریم روڈ میپ", + "research": "تحقیق", + "research-menu": "تحقیق کا مینو", + "resources": "ترجمے کے ذرائع", "run-a-node": "نوڈ چلائیں", "rollup-component-website": "ویب سائٹ", "rollup-component-developer-docs": "ڈویلپر دستاویزات", "rollup-component-technology-and-risk-summary": "ٹیکنالوجی اور خطرے کا خلاصہ", + "saas": "بطور سروس اسٹیکنگ", "search": "تلاش کریں", + "search-ethereum-org": "ethereum.org تلاش کریں", + "secret-leader-election": "خفیہ لیڈر الیکشن", "search-box-blank-state-text": "تلاش کریں!", "search-eth-address": "یہ Ethereum ایڈریس کی طرح لگتا ہے۔ ہم ایڈریسز کا مخصوص ڈیٹا فراہم نہیں کرتے ہیں۔ بلاک ایکسپلورر پر اسے تلاش کرنے کی کوشش کریں، جیسے", "search-no-results": "آپ کی تلاش کا کوئی نتیجہ نہیں", + "security": "سیکورٹی", + "single-slot-finality": "واحد-سلاٹ فنیلٹی", + "statelessness": "غیر حیثیتی", "see-contributors": "شراکت داران دیکھیں", "set-up-local-env": "مقامی ماحول قائم کریں", "sharding": "شارڈنگ", "show-all": "سب دکھائیں", "show-less": "کم دکھائیں", "site-description": "Ethereum پیسوں اور نئی قسم کی ایپلیکیشنز کے لیے ایک غیر مرکزی عالمی پلیٹ فارم ہے۔ Ethereum پر، آپ پیسے کو کنٹرول کرنے والا کوڈ لکھ سکتے، اور دنیا بھر میں کہیں سے بھی قابل رسائی ایپلیکیشنز بنا سکتے ہیں۔", - "site-title": "ethereum.org", "skip-to-main-content": "اہم مواد پر جائیں", "smart-contracts": "اسمارٹ معاہدات", "stablecoins": "اسٹیبل کوائنز", "staking": "اسٹیکنگ", + "start-here": "یہاں شروع کریں", "solo": "سولواسٹیکنگ", - "saas": "بطور سروس اسٹیکنگ", - "pools": "پُولڈ اسٹیکنگ", - "withdrawals": "اسٹیکنگ نکلوانا", + "support": "معاونت", "terms-of-use": "استعمال کی شرائط", "translation-banner-body-new": "آپ یہ صفحہ انگریزی میں دیکھ رہے ہیں کیونکہ ہم نے ابھی تک اس کا ترجمہ نہیں کیا۔ اس مواد کا ترجمہ کرنے میں ہماری مدد کریں۔", "translation-banner-body-update": "اس صفحہ کا ایک نیا ورژن ہے لیکن یہ ابھی صرف انگریزی میں ہے۔ تازہ ترین ورژن کا ترجمہ کرنے میں ہماری مدد کریں۔", @@ -144,23 +296,23 @@ "translation-banner-no-bugs-title": "یہاں کوئی نقائص نہیں!", "translation-banner-no-bugs-content": "اس صفحے کا ترجمہ نہیں کیا جا رہا۔ ہم نے جان بوجھ کر اس صفحے کو ابھی انگریزی میں چھوڑ دیا ہے۔", "translation-banner-no-bugs-dont-show-again": "دوبارہ نہ دکھائیں", + "translation-program": "ترجمے کا پروگرام", "try-using-search": "مطلوبہ چیز پانے کے لیے تلاش کرنے کی کوشش کریں یا", "tutorials": "ٹیوٹوریلز", + "up": "اوپر", + "use": "استعمال", "use-ethereum": "Ethereum استعمال کریں", "use-ethereum-menu": "Ethereum مینو استعمال کریں", + "use-menu": "استعمال کا مینو", + "verkle-trees": "ورکل ٹریز", "wallets": "والیٹس", "we-couldnt-find-that-page": "ہم وہ صفحہ تلاش نہیں کر سکے", "web3": "Web3 کیا ہے؟", "web3-title": "Web3", "website-last-updated": "ویب سائٹ آخری بار اپ ڈیٹ کی گئی", "what-is-ether": "ایتھر (ETH) کیا ہے؟", - "what-is-ethereum": "Ethereum کیا ہے؟", - "defi-page": "DeFi - غیر مرکزی مالیات", - "dao-page": "DAOs - غیر مرکزی خودمختار تنظیمیں", - "nft-page": "NFTs - نان فنجیبل ٹوکنز", - "decentralized-social-networks": "غیر مرکزی سوشل نیٹ ورکس", - "decentralized-identity": "غیر مرکزی شناخت", + "what-is-ethereum": "What is Ethereum?", + "withdrawals": "اسٹیکنگ نکلوانا", "yes": "جی ہاں", - "zero-knowledge-proofs": "بغیر معلومات کے ثبوت", - "page-index-meta-title": "ہوم" + "zero-knowledge-proofs": "بغیر معلومات کے ثبوت" } diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json index 494b8873ebc..22dc7af41ca 100644 --- a/src/intl/vi/common.json +++ b/src/intl/vi/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Tóm tắt tài khoản", "about-ethereum-org": "Giới thiệu về ethereum.org", "about-us": "Giới thiệu về chúng tôi", + "adding-desci-projects": "Thêm dự án Desci", + "adding-developer-tools": "Thêm công cụ nhà phát triển", + "adding-exchanges": "Thêm sàn giao dịch", + "adding-glossary-terms": "Thêm thuật ngữ chú giải", + "adding-staking-products": "Thêm sản phẩm staking", + "adding-wallets": "Thêm ví", + "account-abstraction": "Tóm tắt tài khoản", + "acknowledgements": "Lời cảm ơn", "aria-toggle-search-button": "Nút Kích hoạt tìm kiếm", "aria-toggle-menu-button": "Điều hướng menu", "beacon-chain": "Chuỗi Beacon", "bridges": "Các cầu nối chuỗi khối", + "bug-bounty": "Tiền thưởng phát hiện lỗi", + "build": "Phát triển", + "build-menu": "Menu Phát triển", "clear": "Xóa", "close": "Đóng", "community": "Cộng đồng", "community-hub": "Diễn đàn cộng đồng", "community-menu": "Menu Cộng đồng", "contact": "Liên hệ", + "content-buckets": "Danh mục nội dung", + "content-resources": "Tài nguyên nội dung", "content-standardization": "Chuẩn hóa nội dung", "contributing": "Đang đóng góp", "contributors": "Người đóng góp", @@ -27,7 +39,10 @@ "decentralized-identity": "Nhận dạng phi tập trung", "decentralized-social-networks": "Mạng xã hội phi tập trung", "decentralized-science": "DeSci - Ngành khoa học phi tập trung", + "description": "Mô tả mục điều hướng", "defi-page": "DeFi - Tài chính phi tập trung", + "design": "Thiết kế", + "design-principles": "Nguyên tắc thiết kế", "devcon": "Hội nghị các nhà phát triển", "developers": "Nhà phát triển", "developers-home": "Trang chủ dành cho nhà phát triển", @@ -51,7 +66,7 @@ "documentation": "Tài liệu tham khảo", "down": "Xuống", "ecosystem": "Hệ sinh thái", - "edit-page": "Trang chỉnh sửa", + "edit-page": "Trang chỉnh sữa", "ef-blog": "Blog về Nền tảng Ethereum", "eips": "Đề xuất cải tiến Ethereum", "energy-consumption": "Tiêu thụ năng lượng của Ethereum", @@ -88,17 +103,16 @@ "feedback-widget-thank-you-cta": "Tạo khảo sát ngắn", "find-wallet": "Tìm ví", "future-proofing": "Đáp ứng nhu cầu trong tương lai", - "get-eth": "Tải ETH", + "get-eth": "Nhận ETH", "get-involved": "Tham gia", "get-started": "Bắt đầu", "grants": "Các khoản tài trợ", "grant-programs": "Các chương trình tài trợ cho hệ sinh thái", "guides": "Hướng dẫn", - "guides-hub": "Trung tâm hướng dẫn", + "guides-hub": "Hướng dẫn sử dụng", "history-of-ethereum": "Lịch sử Ethereum", "home": "Trang chủ", "how-ethereum-works": "Cách hoạt động của Ethereum", - "how-to-register-an-ethereum-account": "Cách \"đăng kí\" một tài khoản Ethereum", "how-to-revoke-token-access": "Cách thu hồi quyền đã kí từ các hợp đồng thông minh đối với tài sản crypto của bạn", "how-to-swap-tokens": "Cách để hoán đổi token", "how-to-use-a-bridge": "Cách để chuyển thể token sang lớp 2", @@ -115,11 +129,11 @@ "last-edit": "Lần chỉnh sửa gần nhất", "layer-2": "Lớp 2", "learn": "Tìm hiểu", - "learn-by-coding": "Học lập trình", + "learn-by-coding": "Tìm hiểu bằng cách mã hoá", "learn-hub": "Trung tâm Học tập", "learn-menu": "Menu Tìm hiểu", "learn-more": "Tìm hiểu thêm", - "less": "Ẩn bớt", + "less": "Ít hơn", "light-mode": "Chế độ sáng", "listing-policy-disclaimer": "Tất cả sản phẩm trên trang này đều không được thẩm định chính thức và chỉ được cung cấp vì mục đích thông tin. Nếu bạn muốn thêm sản phẩm hoặc phản hồi về chính sách, hãy tạo phiếu sự cố trên GitHub.", "loading": "Đang tải...", @@ -128,10 +142,112 @@ "loading-error-try-again-later": "Không thể tải dữ liệu. Hãy thử lại sau.", "logo": "logo", "mainnet-ethereum": "Ethereum Mạng chính", - "more": "Xem thêm", - "nav-developers": "Nhà phát triển", + "merge": "Gộp", + "more": "Thêm", + "nav-about-description": "Một dự án mã nguồn mở công khai dành cho cộng đồng Ethereum", + "nav-advanced-description": "Tìm hiểu các chủ đề phức tạp hơn", + "nav-advanced-label": "Nâng cao", + "nav-basics-description": "Tìm hiểu các nguyên tắc cơ bản của Ethereum", + "nav-basics-label": "Nguyên tắc cơ bản", + "nav-bridges-description": "Web3 đã phát triển thành một hệ sinh thái gồm các chuỗi khối L1 chính và các giải pháp mở rộng quy mô L2", + "nav-builders-home-description": "Sổ tay hướng dẫn dành cho nhà phát triển về Ethereum—bởi các nhà phát triển, dành cho các nhà phát triển", + "nav-builders-home-label": "Trang chủ của Nhà phát triển", + "nav-contribute-description": "Nếu bạn muốn giúp đỡ thì tài liệu này sẽ hướng dẫn cho bạn", + "nav-contribute-label": "Đóng góp cho ethereum.org", + "nav-dao-description": "Các cộng đồng được sở hữu bởi thành viên mà không cần sự lãnh đạo tập trung", + "nav-dapps-description": "Khám phá hệ sinh thái ứng dụng phong phú sử dụng Ethereum", + "nav-defi-description": "Một lựa chọn mở toàn cầu thay thế cho thị trường tài chính truyền thống", + "nav-desci-description": "Một lựa chọn mở toàn cầu thay thế cho hệ thống khoa học hiện tại", + "nav-desoc-description": "Các nền tảng dựa trên chuỗi khối cho việc tương tác xã hội và sáng tạo nội dung", "nav-developers-docs": "Tài liệu dành cho nhà phát triển", + "nav-developers": "Nhà phát triển", + "nav-did-description": "Phát hành và sở hữu mã định danh phi tập trung của riêng bạn", + "nav-docs-description": "Tài liệu giúp bạn hiểu và phát triển với Ethereum", + "nav-docs-design-description": "Mô tả các thách thức thiết kế web3 riêng, các phương pháp hay nhất và thông tin chi tiết từ nghiên cứu người dùng", + "nav-docs-design-label": "Nguyên tắc cơ bản về thiết kế UX/UI", + "nav-docs-foundation-description": "Các nguyên tắc cơ bản cốt lõi để phát triển trên Ethereum", + "nav-docs-foundation-label": "Các chủ đề chính", + "nav-docs-overview-description": "Ngôi nhà dành cho tài liệu nhà phát triển của bạn", + "nav-docs-stack-description": "Tìm hiểu tất cả chi tiết của hệ thống Ethereum", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Các tiêu chuẩn xác định các tính năng hoặc quy trình mới", + "nav-eip-label": "Đề xuất cải tiến Ethereum (EIP)", + "nav-emerging-description": "Tìm hiểu các trường hợp sử dụng Ethereum khác mới hơn", + "nav-enterprise-description": "Các ứng dụng kinh doanh cho Ethereum", + "nav-ethereum-org-description": "Trang web này hướng tới cộng đồng—hãy tham gia và đóng góp cùng chúng tôi", + "nav-ethereum-wallets-description": "Một ứng dụng để tương tác với tài khoản Ethereum của bạn", + "nav-events-description": "Phi tập trung và cho phép mọi người tự do tham gia", + "nav-events-irl-description": "Hằng tháng có các sự kiện Ethereum lớn trực tiếp và trực tuyến", + "nav-events-label": "Cộng đồng và sự kiện", + "nav-events-online-description": "Hàng trăm ngàn người đam mê Ethereum trong các cộng đồng trực tuyến này", + "nav-find-wallet-description": "Ví cho phép bạn sử dụng tiền điện tử", + "nav-find-wallet-label": "Chọn ví", + "nav-gas-fees-description": "Phí giao dịch ETH được tính như thế nào", + "nav-gas-fees-label": "Phí gas", + "nav-get-eth-description": "Bạn cần ether (ETH) để sử dụng các ứng dụng Ethereum", + "nav-get-started-description": "Những bước đầu tiên để sử dụng Ethereum", + "nav-governance-description": "Quy trình bao gồm việc nâng cấp giao thức Ethereum", + "nav-governance-label": "Quản trị", + "nav-grants-description": "Một danh sách được cộng đồng của chúng tôi lựa chọn về các dự án cung cấp các chương trình tài trợ", + "nav-guide-create-account-description": "Mọi người đều có thể tạo tài khoản Ethereum vào bất kỳ thời điểm nào, miễn phí thông qua một ứng dụng ví", + "nav-guide-create-account-label": "Cách tạo tài khoản Ethereum", + "nav-guide-revoke-access-description": "Giữ an toàn khi tương tác với các hợp đồng và ứng dụng thông minh trong hệ sinh thái Ethereum", + "nav-guide-revoke-access-label": "Cách thu hồi quyền truy cập hợp đồng thông minh", + "nav-guide-use-wallet-description": "Tìm hiểu cách vận hành tất cả các chức năng cơ bản của ví", + "nav-guide-use-wallet-label": "Cách để sử dụng ví", + "nav-guides-description": "Hướng dẫn từng bước thực tế để giúp bạn bắt đầu", + "nav-guides-label": "Hướng dẫn sử dụng", + "nav-history-description": "Dòng thời gian của tất cả thông tin và cập nhật chính", + "nav-history-label": "Lịch sử kỹ thuật của Ethereum", + "nav-layer-2-description": "Giao dịch Ethereum rẻ hơn và nhanh hơn", + "nav-learn-by-coding-description": "Các công cụ giúp bạn thử nghiệm Ethereum", + "nav-local-env-description": "Chọn và thiết lập hệ thống phát triển Ethereum của bạn", + "nav-mainnet-description": "Các ứng dụng chuỗi khối doanh nghiệp có thể được xây dựng trên Mạng chính Ethereum công cộng", + "nav-nft-description": "Một cách để đại diện cho bất kỳ thứ gì độc nhất dưới dạng tài sản dựa trên Ethereum", + "nav-open-research-description": "Một trong những thế mạnh chính của Ethereum là cộng đồng nghiên cứu tích cực", + "nav-open-research-label": "Nghiên cứu mở", + "nav-overview-description": "Tất cả thông tin về giáo dục Ethereum", + "nav-overview-label": "Tổng quan", + "nav-participate-overview-description": "Tổng quan về cách tham gia", "nav-primary": "Chính", + "nav-private-description": "Tài nguyên dành cho nhà phát triển cho doanh nghiệp tư nhân Ethereum", + "nav-quizzes-description": "Tìm hiểu xem bạn hiểu rõ về Ethereum và tiền điện tử đến mức nào", + "nav-quizzes-label": "Kiểm tra kiến thức của bạn", + "nav-refi-description": "Một hệ thống kinh tế thay thế được xây dựng trên các nguyên tắc tái tạo", + "nav-research-description": "Quy trình được sử dụng để cải thiện Ethereum", + "nav-research-label": "Nghiên cứu và phát triển", + "nav-roadmap-description": "Lộ trình tăng cường khả năng mở rộng, bảo mật và bền vững hơn cho Ethereum", + "nav-roadmap-future-description": "Củng cố Ethereum như một mạng lưới mạnh mẽ và phi tập trung", + "nav-roadmap-future-label": "Đáp ứng nhu cầu trong tương lai", + "nav-roadmap-label": "Lộ trình", + "nav-roadmap-scaling-description": "Cập nhật mạng để giảm thêm chi phí và tốc độ giao dịch", + "nav-roadmap-security-description": "Đảm bảo Ethereum luôn bền bỉ trước mọi hình thức tấn công trong tương lai", + "nav-roadmap-security-label": "Cải thiện an ninh", + "nav-roadmap-ux-description": "Việc sử dụng Ethereum cần được đơn giản hóa", + "nav-run-a-node-description": "Trở nên hoàn toàn độc lập mà vẫn đảm bảo an ninh mạng", + "nav-security-description": "Tìm hiểu các phương pháp hay nhất khi sử dụng tiền mã hóa", + "nav-smart-contracts-description": "Các khối xây dựng cơ bản của hệ sinh thái Ethereum", + "nav-stablecoins-description": "Stablecoin là token Ethereum được thiết kế để duy trì ở một giá trị cố định", + "nav-stake-description": "Kiếm phần thưởng khi bảo mật Ethereum", + "nav-stake-label": "Đặt cược", + "nav-staking-home-description": "Tổng quan về các tùy chọn đặt cược khác nhau", + "nav-staking-home-label": "Trang chủ ký gửi", + "nav-staking-pool-description": "Đặt cược và nhận thưởng với số lượng ETH bất kỳ bằng cách tham gia cùng những người khác", + "nav-staking-pool-label": "Đặt cọc chung", + "nav-staking-saas-description": "Các nhà khai thác nút bên thứ ba xử lý hoạt động của ứng dụng khách trình xác thực của bạn", + "nav-staking-saas-label": "Đặt cược như một dịch vụ", + "nav-staking-solo-description": "Chạy phần cứng tại nhà và tự mình thêm vào tính bảo mật và phân quyền của mạng Ethereum", + "nav-staking-solo-label": "Đặt cọc riêng", + "nav-start-building-description": "Thông tin hữu ích cho người mới bắt đầu", + "nav-translation-program-description": "Một nỗ lực hợp tác để dịch ethereum.org sang tất cả các ngôn ngữ", + "nav-tutorials-description": "Danh sách các hướng dẫn cộng đồng được lựa chọn", + "nav-use-cases-description": "Khám phá những ý tưởng sử dụng Ethereum đa dạng", + "nav-what-is-ether-description": "Tiền tệ của ứng dụng Ethereum", + "nav-what-is-ethereum-description": "Tìm hiểu điều gì làm cho Ethereum trở nên đặc biệt", + "nav-what-is-web3-label": "Web3 là gì?", + "nav-what-is-web3-description": "Một giải pháp thay thế cho việc tập trung ủy quyền để đưa ra các quy tắc", + "nav-whitepaper-description": "Sách trắng Ethereum ban đầu được viết bởi Vitalik Buterin vào năm 2014", + "nav-zkp-description": "Một cách để chứng minh tính hợp lệ của một tuyên bố mà không tiết lộ chính tuyên bố đó", "nft-page": "NFT - Non-Fungible Token", "nfts": "Các NFT", "no": "Không", @@ -140,6 +256,8 @@ "page-developers-aria-label": "Menu của nhà phát triển", "page-index-meta-title": "Trang chủ", "page-last-updated": "Trang cập nhật mới nhất", + "participate": "Tham gia", + "participate-menu": "Menu Tham gia", "pbs": "Phân tách Bên xây dựng-đề xuất", "pools": "Đặt cọc chung", "privacy-policy": "Chính sách quyền riêng tư", @@ -150,6 +268,8 @@ "refresh": "Vui lòng tải lại trang.", "return-home": "Trở về trang chủ", "roadmap": "Lộ trình Ethereum", + "research": "Nghiên cứu", + "research-menu": "Menu Nghiên cứu", "resources": "Tài nguyên dịch thuật", "regenerative-finance": "ReFi - Tài chính tái tạo", "run-a-node": "Vận hành một nút", @@ -164,6 +284,7 @@ "search-box-blank-state-text": "Tìm kiếm nào!", "search-eth-address": "Đây giống như một địa chỉ Ethereum. Chúng tôi không cung cấp dữ liệu cho những địa chỉ này. Thử tìm kiếm trên một trình duyệt khối như", "search-no-results": "Không tìm thấy kết quả cho tìm kiếm của bạn", + "security": "Bảo mật", "single-slot-finality": "Khối cuối ở vị trí đơn nhất", "statelessness": "Phi trạng thái", "see-contributors": "Xem những người đóng góp", @@ -172,7 +293,6 @@ "show-all": "Hiện tất cả", "show-less": "Ẩn bớt", "site-description": "Ethereum là một nền tảng toàn cầu, phi tập trung dành cho các ứng dụng về tài chính và các loại ứng dụng mới. Trên Ethereum, bạn có thể viết mã kiểm soát tài chính và xây dựng các ứng dụng có thể truy cập được từ bất cứ đâu trên thế giới.", - "site-title": "ethereum.org", "skip-to-main-content": "Nhảy đến nội dung chính", "smart-contracts": "Hợp đồng thông minh", "stablecoins": "Stablecoin", @@ -181,6 +301,7 @@ "start-here": "Bắt đầu ở đây", "style-guide": "Mẫu thiết kế", "solo": "Đặt cọc riêng", + "support": "Hỗ Trợ", "terms-of-use": "Điều khoản sử dụng", "translation-banner-body-new": "Bạn đang xem trang này bằng tiếng Anh vì chúng tôi chưa dịch trang này. Hãy giúp chúng tôi dịch nội dung này.", "translation-banner-body-update": "Đã có phiên bản mới của trang này nhưng chỉ hiển thị tiếng Anh. Hãy giúp chúng tôi dịch phiên bản mới nhất.", @@ -191,11 +312,14 @@ "translation-banner-no-bugs-title": "Không có con bọ nào ở đây!", "translation-banner-no-bugs-content": "Trang này chưa được dịch. Hiện chúng tôi chủ đích cung cấp trang này bằng Tiếng Anh.", "translation-banner-no-bugs-dont-show-again": "Không hiển thị lại", + "translation-program": "Chương trình dịch thuật", "try-using-search": "Hãy sử dụng công cụ tìm kiếm để tìm những gì bạn cần", "tutorials": "Hướng dẫn", "up": "Lên", + "use": "Sử dụng", "use-ethereum": "Sử dụng Ethereum", "use-ethereum-menu": "Sử dụng menu Ethereum", + "use-menu": "Menu Sử dụng", "user-experience": "Kinh nghiệm của người dùng", "verkle-trees": "Cây Verkle", "wallets": "Ví", @@ -203,7 +327,7 @@ "web3": "Web3 là gì?", "web3-title": "Web3", "website-last-updated": "Trang cập nhật mới nhất", - "what-is-ether": "Ether (ETH) là gì?", + "what-is-ether": "ether (ETH) là gì?", "what-is-ethereum": "Ethereum là gì?", "withdrawals": "Rút tài sản đặt cược", "yes": "Có", From 0d82cbc89bb8d8aafc519423ca553a50bb39ced0 Mon Sep 17 00:00:00 2001 From: Jakub <100724231+konopkja@users.noreply.github.com> Date: Thu, 22 Feb 2024 17:53:18 +0500 Subject: [PATCH 410/478] update swapping guide - remove kernel link someone just clearly wanted to linkfarm in this guide for kernel. Why link to a different project, when we have our own what is defi explanatory page --- public/content/guides/how-to-swap-tokens/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/guides/how-to-swap-tokens/index.md b/public/content/guides/how-to-swap-tokens/index.md index bb91edcd58d..7cda654c47a 100644 --- a/public/content/guides/how-to-swap-tokens/index.md +++ b/public/content/guides/how-to-swap-tokens/index.md @@ -24,7 +24,7 @@ Some popular exchanges are: - [1Inch](https://app.1inch.io/#/1/unified/swap/ETH/DAI) - [Curve](https://curve.fi/#/ethereum/swap) -If you'd like to learn more about what DeFi is and how these new kinds of exchanges work, we can recommend the [Kernel Library](https://library.kernel.community/Topic+-+DeFi/Topic+-+DeFi). +Interesting? Learn more about what [decentralised finance (DeFi)](/defi/) is and how these new kinds of exchanges work. ## 2. Select the pair of tokens you wish to swap From c16ca5bf1f9abe93f3c0325367356a8748c44ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Thu, 22 Feb 2024 13:54:04 -0300 Subject: [PATCH 411/478] chore: remove Portis wallet --- src/data/wallets/wallet-data.ts | 46 --------------------------------- 1 file changed, 46 deletions(-) diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 1fa23da43f4..0e04fce107c 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -35,7 +35,6 @@ import OneKeyImage from "@/public/wallets/onekey.png" import OperaImage from "@/public/wallets/opera.png" import PhantomImage from "@/public/wallets/phantom.png" import PillarImage from "@/public/wallets/pillar.png" -import PortisImage from "@/public/wallets/portis.png" import RabbyWalletImage from "@/public/wallets/rabbywallet.png" import RainbowImage from "@/public/wallets/rainbow.png" import SafeImage from "@/public/wallets/safe.png" @@ -393,51 +392,6 @@ const walletData: WalletData[] = [ onboard_documentation: "https://www.argent.xyz/learn/", documentation: "", }, - { - last_updated: "June 22, 2022", - name: "Portis", - image: PortisImage, - brand_color: "#ffffff", - url: "https://www.portis.io", - wallet_live_date: "Nov, 2018", - active_development_team: true, - languages_supported: ["en"], - twitter: "https://twitter.com/portis_io", - discord: "", - reddit: "", - telegram: "https://t.me/PortisHQ", - ios: false, - android: false, - linux: false, - windows: false, - macOS: false, - firefox: false, - chromium: false, - hardware: false, - open_source: false, - repo_url: "", - non_custodial: true, - security_audit: [], - scam_protection: false, - hardware_support: false, - walletconnect: false, - rpc_importing: true, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: false, - layer_2: true, - gas_fee_customization: false, - ens_support: false, - erc_20_support: true, - eip_1559_support: false, - buy_crypto: true, - withdraw_crypto: false, - multisig: false, - social_recovery: false, - onboard_documentation: "https://docs.portis.io/", - documentation: "", - }, { last_updated: "November 15, 2022", name: "Coinbase Wallet", From 0189cf03fcaccd3b25c955c4e7c5219b4ed9e2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Thu, 22 Feb 2024 13:59:44 -0300 Subject: [PATCH 412/478] chore: remove Sequence wallet --- public/wallets/portis.png | Bin 2122 -> 0 bytes public/wallets/sequence.png | Bin 3384 -> 0 bytes src/data/wallets/wallet-data.ts | 49 -------------------------------- 3 files changed, 49 deletions(-) delete mode 100644 public/wallets/portis.png delete mode 100644 public/wallets/sequence.png diff --git a/public/wallets/portis.png b/public/wallets/portis.png deleted file mode 100644 index 562cbd229e943884dfa1413acae91ab1494acf05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2122 zcmV-Q2(|Z#P)jzDCEQf-xftHE4#nRT(yS#gvuP;7Lu z(Nc@AJW^$6ptU4CN=j>+ZL--tRCY>gnH@q}5i>(;ve<61*;1RkYqZ@GG)EmjS0+Yb zPI8+#QFCOa$QU_KIa_?zaEyuo000+sQchCu~L#mj1E;nFOvDZ$18 zvV8wf`09+!l7vQuK%_@{eO0yh5Aw?yACEm_K0f|GdWN(7c<%@o!CQF&Uwpok=f`@% z-Wk+L@&#KvZ{s;z0NKB{0mCFwi!@E&<(q(O0EKvyZ~Ry(4ImTm@lB+plmMpUExvKK zx&fx|@J$GT1Qbk&`F#^{DY-HVnGm1;%sfAqEl`N{?D;07c+xrqkfk&G#@*^fsYIG} zm}1Q9n^^KBkrqfi!RGW$q!d@O24Y>LBAwAUeyo)20>KmMe7*@4mmqe5Y{q=!Y&GW+ zmbnQjo6R?&l3exx=kiUUB-?)?W+^tqh zYWWBx==8n`6PYARshg12K~2Tv=bMOYsi5sfp;`JA)`@-N$68BdQH&0d1_38N--Jp_ znW&@}NW^J<6Kr+D6ASDnZ_6WzQ~D;xCP;<>wHGMT3C}kX$MPc~wOyJ7H-T@QEdT^WGDUvFfWq1<4UkQdZ$gfbS5T!CW-!6Y zTb(N=nAr=vF@4=P0hJQ4C8S~Yq)hm^x|SPOQBG?k%7l2i4);+?(7seFOf>hZ>*=Q~ z4x1ILtaXe+0LAj<9AlD<6{oq!eoj9>Kjq<26hK<1GAmZBU-6Bzm9=HS)5&?a0?hz{ zEU&CGsk8>BuSg8(NMR$Y`FXKAS)Kvb$j)&}yyBaHs%v8va!O5WfrLD*T4egd`NofN zw72TK>Zeh60|fK1SyffNHqy~WYDATUl1WlKpLi zp8~Ca*6YuqMXD1Ur(6dE4~Xn)Jyhayb^0ClTwy^n_X8z5%l$LlGlhpkS(N+XK6Un^ zfyI8@LVPOn3GjP4wym+;i~yFGq0?uFzuafpWiu35T#niIm>FDtAG6~z%Zk(Afd%2R zW0qa^?w|zj?!U7mMwVsA^7Ln5fd?{r@c2E%IN`3O=SX9JT>Ek<jTh6^Jtzb(`x{TrRH_&F@7xpgjoy?8c{A9pcn-- z3aP-R!@lMwt`=KtN}I>bmpH88&9>?n_~Y*`b+?jwzo-qVGK5ZjzBY@kSp)`uxu%%C zPBEO~#6RG08k??+X|Ul>AhkwZt;|kLHq?V!Da-n(G0wfv5fO2@unHUUWJ$eZcj=v#^7kNt0$CLW*DKU7KDWfEa^| z?oc<0tw&*!?`$i$N1?#N55~0eZFai@Qd>XItIo~SylT{ld2Zguc$CP7rO|fyvB@^(_NSvT zfk2XIXY64O24i@%@#E6)7lE)%k4e+90mX_B9=XvKonnCUsi^XF1 z_44$!!w{x$6jCoYh`vGUyeiY9-D$0cMhb`Bhd6MgmYyst2r?aemd zjlwR}`}zvqxnFAaogj)rj3{uOx!?Bu_)m`i0a!Whn9}wV3;+NC07*qoM6N<$f>%2e Az5oCK diff --git a/public/wallets/sequence.png b/public/wallets/sequence.png deleted file mode 100644 index 00268aef5cab9242c9b2feabb369c9a991cde502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3384 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 O0000 Date: Thu, 22 Feb 2024 14:02:13 -0300 Subject: [PATCH 413/478] chore: remove Aktionariat wallet --- public/wallets/aktionariat.png | Bin 774 -> 0 bytes src/data/wallets/wallet-data.ts | 47 -------------------------------- 2 files changed, 47 deletions(-) delete mode 100644 public/wallets/aktionariat.png diff --git a/public/wallets/aktionariat.png b/public/wallets/aktionariat.png deleted file mode 100644 index 6b8ab9a61791cfd52ca0f101b207c11370a68f2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmV+h1Nr=kP)QMa0k4fAwWcr{qt+CLG3M_-XHB zjA?2L`K&ZC**ED@5n^Nb{+#b Date: Thu, 22 Feb 2024 14:04:47 -0300 Subject: [PATCH 414/478] chore: remove Numio wallet --- public/wallets/numio.png | Bin 1937 -> 0 bytes src/data/wallets/wallet-data.ts | 46 -------------------------------- 2 files changed, 46 deletions(-) delete mode 100644 public/wallets/numio.png diff --git a/public/wallets/numio.png b/public/wallets/numio.png deleted file mode 100644 index 42423f48060ec8eea062f7e7ac387a6dd323de0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1937 zcmV;C2X6R@P)C(+kK5{=gBidp zqD>%Ml?`9so7dghT7chF903F!xLZa0aTmH?5Aa^R{k{j_d)<4`5W@X_zmEWVo_`M@ zxWpq*UGF}o#ths$07LJodnZHp>}lwEof}I;a3pUZ0|cJuIkz@7R=~XrIP|abE=@7e5TAZltH9xUZ_HF?u#G%Pv_P2%*5uPWdXJG~L|t{HW3_JAW4= zxI*7Sk(H*T#(-&7R!aB#*=qwKT4-D|Qj1KIWSzta2z?Wm(!)PfB7(D+%`~!+Sjj7m zGPlZ0)5mj(lf`1O(8&1-WU}VQke;S|r&*e&>FZghB80>L$r8ldSVwNgv-TZLAQxL?W-$2O>JD79$y;>?sB=baGajg zP3f?wspOf^qiX}fC!me25*v{{0tPjGR3!dzVg#=u@(f=^{-+gnIbFw0#fik(NXqMp zrlf2j^h{iS(o}?w5=czGOka;23-G|%4;m`aJ+mBa>Pn?-Kt^R3u@B+(Km zk<&v!f4STl%tbA)vr^^UY|2Q##5Z{S!B^uhMsRjJlP8E3m1cCb%FuYr)Q~4F&GY76 zjL*!onaA=fL{38E*ChlL8YN2HY2L7l5js0jl5TO4q0%|bx zyta!GT*b49vPCL~$u;RX>{RV%?{=7G;2KOt@Fh@*G@urbm&kL}V*sWW zB`?n_YeOVP^D5z~Fts#p1=)da5NHty5cn3ZZYnWP2gK4f2n^(_sn9eP!F_mmc(9NjW zx2rBT)LXx+kljv+)N2EuC9USF6-aXN#en_L^}|o~XI*bEV*XH%bSkDIbciRIio4tG zN@=BwKNr+M$uGhy4 zMOL=uJLtre(kP2kn0Qy?doHLCjx4JjKwwK_7cYL}r@9W7nm+(Tl2&HX)bgob^-1@U zx1Fp%pPyecKj669#n0>NtGWK@CnE)HWW&DHMWsHsQ6u_~oR<&rBmAM;t}njYtVj3{ XV{f6k84FAP00000NkvXXu0mjfvRIpV diff --git a/src/data/wallets/wallet-data.ts b/src/data/wallets/wallet-data.ts index 8fb7643b828..0e57e70aa71 100644 --- a/src/data/wallets/wallet-data.ts +++ b/src/data/wallets/wallet-data.ts @@ -28,7 +28,6 @@ import LoopringImage from "@/public/wallets/loopring.png" import MetaMaskImage from "@/public/wallets/metamask.png" import MewImage from "@/public/wallets/mew.png" import MyEtherWalletImage from "@/public/wallets/myetherwallet.png" -import NumioImage from "@/public/wallets/numio.png" import OKXImage from "@/public/wallets/okx.jpeg" import OneKeyImage from "@/public/wallets/onekey.png" import OperaImage from "@/public/wallets/opera.png" @@ -143,51 +142,6 @@ const walletData: WalletData[] = [ onboard_documentation: "https://support.keyst.one/", documentation: "", }, - { - last_updated: "June 22, 2022", - name: "Numio", - image: NumioImage, - brand_color: "#3F3F3F", - url: "https://www.numio.one/", - wallet_live_date: "December 2020", - active_development_team: true, - languages_supported: ["en"], - twitter: "https://twitter.com/GetNumio/", - discord: "", - reddit: "", - telegram: "", - ios: true, - android: true, - linux: false, - windows: false, - macOS: false, - firefox: false, - chromium: false, - hardware: false, - open_source: false, - repo_url: "", - non_custodial: true, - security_audit: [], - scam_protection: false, - hardware_support: false, - walletconnect: true, - rpc_importing: false, - nft_support: true, - connect_to_dapps: true, - staking: false, - swaps: true, - layer_2: true, - gas_fee_customization: false, - ens_support: false, - erc_20_support: false, - eip_1559_support: false, - buy_crypto: true, - withdraw_crypto: false, - multisig: false, - social_recovery: false, - onboard_documentation: "https://docs.numio.one/", - documentation: "", - }, { last_updated: "June 22, 2022", name: "Coin98", From f942941499612376752a9c185b5c234bd271fad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Quiroz?= Date: Thu, 22 Feb 2024 14:06:12 -0300 Subject: [PATCH 415/478] chore: remove Opera wallet --- public/wallets/opera.png | Bin 1186 -> 0 bytes src/data/wallets/wallet-data.ts | 47 -------------------------------- 2 files changed, 47 deletions(-) delete mode 100644 public/wallets/opera.png diff --git a/public/wallets/opera.png b/public/wallets/opera.png deleted file mode 100644 index 3fe453e467ec622d6d5b47630219fbf840dfb2c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1186 zcmV;T1YP@yP)00ZVpL_t(|oXuO?mZKmLYz1vFDw@Fm|LPvRBr{nHQIXxA zml-`;)AW_5BswCcuKIQ?B(t^5vKZUG(k0y^qH0HJ-@@lxl#0K^sL79odE9x%42mM&MSvhTaoea(=R+{P6+oF^++#Z4x1vVaAD+dSB-jKzCsH~9brhh{YZ;J&)ITO9CJ&tj< z*8D)isLE^kjKga~-XaI(oa$;X-Gqh}Rqhdk_X>Cm8>hNQBWABJMf0pfkSYf81@xPe z*P!a=E5!7}t9%~uwN#!>hZ*Xv93mbU5LsNX6E6f6$m5j~<*oO`AO3KEGJ6%#5*Q7U>DO{5^jSW)2Z z!!Z|~1y|#>YV=saWBv0iI2ND#F>z)eRCYi?*X?Ds6D|{W8@;!pab@Y~nijAvJhh?( z*L3kyf%g&dbt%$Ml?X?DY~hVB#7$`La@K@II#`DTY3A&3sSFvh{4qcK!jq>bOEofL zSEi4`P$c?J;|8Chpw}c$r2C;CXb;aiDFsT@BW*2QMZld@oj$RJ`_r0GR9JfjutR_y z;Y`XG2D}|Iq9V8ny#>%I!h_{o03Bfy-UP`13n1TRLzz1)irj%e=1y&G?&RI)E>BhN z0<3el7-jAzigLG!bc37fU?ZHp)fc%pGn9A(Onck4{2Nk@w@+!e+-@By<{m0g_OXfh z#dOFp7^2*xFUmgLquk?5%08f_+#_hpK4d50sJ9&>Q1*io%6$|>*$=xY_i-MjIIvXF z3;IuvWNA8d=8T8V1jGNzvAV;@>PsokNE{$UjhMNQH&7!eJNbhU;^a>gy@k@!TL=?) zJmd`o9ztXO`PvN>C7MZCe2s+V4v?^Bni)_smS(1o(9FU_I(q|=j Date: Thu, 22 Feb 2024 10:07:55 -0700 Subject: [PATCH 416/478] Update src/intl/en/page-staking.json --- src/intl/en/page-staking.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/page-staking.json b/src/intl/en/page-staking.json index e0dfdb68c34..4eb7361ca9e 100644 --- a/src/intl/en/page-staking.json +++ b/src/intl/en/page-staking.json @@ -187,7 +187,7 @@ "page-staking-section-comparison-requirements-title": "Requirements", "page-staking-section-comparison-solo-requirements-li1": "You must deposit 32 ETH", "page-staking-section-comparison-solo-requirements-li2": "Maintain hardware that runs both an Ethereum execution client and consensus client while connected to the internet", - "page-staking-section-comparison-solo-requirements-li3": "The Staking Launchpad will walk you through the process and hardware requirements", + "page-staking-section-comparison-solo-requirements-li3": "The Staking Launchpad will walk you through the process and hardware requirements", "page-staking-section-comparison-saas-requirements-li1": "Deposit 32 ETH and generate your keys with assistance", "page-staking-section-comparison-saas-requirements-li2": "Store your keys securely", "page-staking-section-comparison-saas-requirements-li3": "The rest is taken care of, though specific services will vary", From 82bc02be43c18ad986ecedbb20621ea4501add3a Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 17:08:36 +0000 Subject: [PATCH 417/478] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 305480f1611..ec9ab0f4158 100644 --- a/README.md +++ b/README.md @@ -1730,6 +1730,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Jen
      Jen

      💻 Eugene
      Eugene

      🖋 RimTaeX
      RimTaeX

      🖋 + Daniel Zarifpour
      Daniel Zarifpour

      🖋 From 7282531f38c813494007ee7c5f4873d21900b13c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 17:08:37 +0000 Subject: [PATCH 418/478] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ff708ef6b20..a814fde63a2 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -11101,6 +11101,15 @@ "contributions": [ "content" ] + }, + { + "login": "zarifpour", + "name": "Daniel Zarifpour", + "avatar_url": "https://avatars.githubusercontent.com/u/16494335?v=4", + "profile": "http://zarifpour.xyz", + "contributions": [ + "content" + ] } ], "contributorsPerLine": 7, From b976889fca75810434f69fd785ed49ecdbc3cef1 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Thu, 22 Feb 2024 18:30:46 +0100 Subject: [PATCH 419/478] hide contributor profile link if the url doesn't exist --- src/components/FileContributors.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/FileContributors.tsx b/src/components/FileContributors.tsx index 0d6dff23f33..ec3b2d607da 100644 --- a/src/components/FileContributors.tsx +++ b/src/components/FileContributors.tsx @@ -146,7 +146,7 @@ const FileContributors = ({ :{" "} - {lastContributor.user && ( + {lastContributor.user?.url && ( @{lastContributor.user.login} From 25ab899dcf23f30d26d0821b5775b0f465cd7231 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:43:17 -0800 Subject: [PATCH 420/478] chore: update roadmap home image --- public/content/roadmap/index.md | 2 +- public/content/translations/id/roadmap/index.md | 2 +- public/content/translations/it/roadmap/index.md | 2 +- public/content/translations/ru/roadmap/index.md | 2 +- public/content/translations/tr/roadmap/index.md | 2 +- public/content/translations/zh-tw/roadmap/index.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/content/roadmap/index.md b/public/content/roadmap/index.md index ef683bb7ddf..f34365a9db7 100644 --- a/public/content/roadmap/index.md +++ b/public/content/roadmap/index.md @@ -3,7 +3,7 @@ title: Ethereum roadmap description: The path to more scalability, security and sustainability for Ethereum. lang: en template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Ethereum roadmap" summaryPoints: buttons: diff --git a/public/content/translations/id/roadmap/index.md b/public/content/translations/id/roadmap/index.md index 91b0879f1dd..77dc8a4a4ac 100644 --- a/public/content/translations/id/roadmap/index.md +++ b/public/content/translations/id/roadmap/index.md @@ -3,7 +3,7 @@ title: Peta Perjalanan Ethereum description: Jalan menuju peningkatan skalabilitas, keamanan, dan keberlanjutan Ethereum. lang: id template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Peta Perjalanan Ethereum" summaryPoints: buttons: diff --git a/public/content/translations/it/roadmap/index.md b/public/content/translations/it/roadmap/index.md index b427fd00185..86cdd166d0b 100644 --- a/public/content/translations/it/roadmap/index.md +++ b/public/content/translations/it/roadmap/index.md @@ -3,7 +3,7 @@ title: Roadmap di Ethereum description: Il percorso verso una maggiore scalabilità, sicurezza e sostenibilità per Ethereum. lang: it template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Roadmap di Ethereum" summaryPoints: buttons: diff --git a/public/content/translations/ru/roadmap/index.md b/public/content/translations/ru/roadmap/index.md index 9229e8bf9db..17db45aa71e 100644 --- a/public/content/translations/ru/roadmap/index.md +++ b/public/content/translations/ru/roadmap/index.md @@ -3,7 +3,7 @@ title: Дорожная карта Ethereum description: Путь к большей масштабируемости, безопасности и экологичности Ethereum. lang: ru template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Дорожная карта Ethereum" summaryPoints: buttons: diff --git a/public/content/translations/tr/roadmap/index.md b/public/content/translations/tr/roadmap/index.md index 0783b9e5311..8adfaf18576 100644 --- a/public/content/translations/tr/roadmap/index.md +++ b/public/content/translations/tr/roadmap/index.md @@ -3,7 +3,7 @@ title: Ethereum yol haritası description: Ethereum için daha ölçeklenebilir, güvenli ve sürdürülebilir olmanın yolu. lang: tr template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "Ethereum yol haritası" summaryPoints: buttons: diff --git a/public/content/translations/zh-tw/roadmap/index.md b/public/content/translations/zh-tw/roadmap/index.md index db8f286786f..cef027bf246 100644 --- a/public/content/translations/zh-tw/roadmap/index.md +++ b/public/content/translations/zh-tw/roadmap/index.md @@ -3,7 +3,7 @@ title: 以太坊開發藍圖 description: 以太坊實現更高可擴容性、安全性和永續性的路徑。 lang: zh-tw template: roadmap -image: /roadmap/roadmap-main.png +image: /heroes/roadmap-hub-hero.jpg alt: "以太坊開發藍圖" summaryPoints: buttons: From 053ad58e73da8e10d49ef993aea1d38f2d945949 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 12:16:37 -0800 Subject: [PATCH 421/478] i18n: import latest common.json from Crowdin Locales: am, hy-am, be, bs, da, gu, ig, lt, pcm, fa, ta, tk, uz --- src/intl/be/common.json | 141 ++++++++++++++++++++---- src/intl/bs/common.json | 141 +++++++++++++++++++----- src/intl/da/common.json | 140 +++++++++++++++++++++--- src/intl/fa/common.json | 175 +++++++++++++++++++++++++----- src/intl/gu/common.json | 205 +++++++++++++++++++++++++++++++---- src/intl/hy-am/common.json | 137 +++++++++++++++++++---- src/intl/ig/common.json | 161 ++++++++++++++++++++++----- src/intl/lt/common.json | 216 +++++++++++++++++++++++++++++++++++-- src/intl/pcm/common.json | 3 + src/intl/tk/common.json | 136 +++++++++++++++++++---- src/intl/uz/common.json | 206 +++++++++++++++++++++++++++++++---- 11 files changed, 1462 insertions(+), 199 deletions(-) diff --git a/src/intl/be/common.json b/src/intl/be/common.json index 0c50d136a70..1cdfb3e756e 100644 --- a/src/intl/be/common.json +++ b/src/intl/be/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Дамашняя старонка", "about-ethereum-org": "Аб партале ethereum.org", "about-us": "Пра нас", + "adding-desci-projects": "Даданне праектаў Desci", + "adding-developer-tools": "Даданне інструментаў распрацоўшчыка", + "adding-exchanges": "Даданне біржаў", + "adding-glossary-terms": "Даданне тэрмінаў слоўніка", + "adding-staking-products": "Даданне прадуктаў для стэйкінгу", + "adding-wallets": "Даданне гаманцоў", + "account-abstraction": "Дамашняя старонка", + "acknowledgements": "Падзякі", "aria-toggle-search-button": "Пераключэнне кнопкі пошуку", "aria-toggle-menu-button": "Пераключэнне кнопкі меню", "beacon-chain": "Beacon Chain", "bridges": "Масты блокчэйну", + "bug-bounty": "Узнагарода за выяўленне памылак", + "build": "Стварыць", + "build-menu": "Меню стварэння", "clear": "Ачысціць", "close": "Закрыць", "community": "Супольнасць", "community-hub": "Цэнтр супольніцтва", "community-menu": "Меню Супольнасці", "contact": "Кантакты", + "content-buckets": "Катэгорыі кантэнту", + "content-resources": "Рэсурсы кантэнту", "content-standardization": "Стандартызацыя кантэнту", "contributing": "Садзейнічанне", "contributors": "Саўдзельнікі", @@ -27,7 +39,10 @@ "decentralized-identity": "Дэцэнтралізаваная ідэнтычнасць", "decentralized-social-networks": "Дэцэнтралізаваная сацыяльная сетка", "decentralized-science": "DeSci - Дэцэнтралізаваная навука", + "description": "Апісанне элемента навігацыі", "defi-page": "DeFi - Дэцэнтралізаваныя фінансы", + "design": "Дызайн", + "design-principles": "Прынцыпы дызайну", "devcon": "Devcon", "developers": "Распрацоўшчыкі", "developers-home": "Галоўная старонка для распрацоўшчыкаў", @@ -59,7 +74,6 @@ "enterprise-menu": "Меню карпаратыўнага сектару", "esp": "Праграма падтрымкі экасістэмы", "eth-current-price": "Бягучая цана ETH (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Праграма ўзнагароды за пошук памылак у Ethereum", "consensus-when-shipping": "Калі адбудзецца запуск?", "ethereum-upgrades": "Абновы Ethereum", @@ -75,7 +89,7 @@ "ethereum-protocol": "Пратакол Ethereum", "ethereum-security": "Бяспека Ethereum і прадухіленне ашуканства", "ethereum-support": "Падтрымка Ethereum", - "ethereum-wallets": "Ethereum гаманцы", + "ethereum-wallets": "Гаманцы Ethereum", "ethereum-whitepaper": "Тэхнічная дакументацыя Ethereum", "feedback-widget-prompt": "Ці дапамагла вам гэтая старонка?", "feedback-card-prompt-page": "Ці была гэтая старонка карыснай?", @@ -83,10 +97,9 @@ "feedback-card-prompt-tutorial": "Ці было гэтае кіраўніцтва карысным?", "feedback-widget-thank-you-title": "Дзякуй за ваш водгук!", "feedback-widget-thank-you-subtitle": "Палепшыце старонку шляхам адказу на некалькі пытанняў.", - "feedback-widget-thank-you-subtitle-ext": "У выпадку калі вам патрэбна дапамога, вы можаце звярнуцца да супольніцтва ў нашым Discord.", + "feedback-widget-thank-you-subtitle-ext": "Калі вам патрэбна дапамога, вы можаце звярнуцца да супольніцтва праз Discord.", "feedback-widget-thank-you-timing": "2–3 хвіліны", "feedback-widget-thank-you-cta": "Адкрыйце кароткую апытанку", - "find-wallet": "Find wallet", "future-proofing": "Забеспячэнне будучыні", "get-eth": "Атрымайце ETH", "get-involved": "Далучыцца", @@ -94,11 +107,10 @@ "grants": "Гранты", "grant-programs": "Праграмы грантаў экасістэмы", "guides": "Кіраўніцтвы", - "guides-hub": "Даведачны цэнтр", + "guides-hub": "Практычныя кіраўніцтвы", "history-of-ethereum": "Гісторыя Ethereum", "home": "Галоўная", "how-ethereum-works": "Як працуе Ethereum", - "how-to-register-an-ethereum-account": "Як зарэгістраваць уліковы запіс Ethereum", "how-to-revoke-token-access": "Як адклікаць доступ смарт-кантракту да вашых рэсурсаў крыптавалюты", "how-to-swap-tokens": "Як абмяняць токены", "how-to-use-a-bridge": "Як перанесці токены на ўзровень 2", @@ -115,11 +127,9 @@ "last-edit": "Апошняя змена", "layer-2": "Узровень 2", "learn": "Абучэнне", - "learn-by-coding": "Learn by coding", "learn-hub": "Навучальны цэнтр", "learn-menu": "Меню дапамогі", "learn-more": "Даведайцеся больш", - "less": "Less", "light-mode": "Светлы", "listing-policy-disclaimer": "Усе прадукты, пералічаныя на гэтай старонцы, не з'яўляюцца афіцыйнымі рэкамендацыямі і прыведзены тут толькі ў інфармацыйных мэтах. Каб дадаць прадукт або адправіць водгук аб палітыцы, паведаміце аб праблеме на GitHub.", "loading": "Загрузка...", @@ -128,10 +138,101 @@ "loading-error-try-again-later": "Немагчыма загрузіць даныя. Паўтарыце пазней.", "logo": "лагатып", "mainnet-ethereum": "Асноўная сетка Ethereum", - "more": "More", - "nav-developers": "Разпрацоўшчыкі", + "merge": "Зліццё", + "nav-about-description": "Публічны праект з адкрытым зыходным кодам для супольніцтва Ethereum", + "nav-advanced-description": "Знаёмцеся з больш складанымі тэмамі", + "nav-advanced-label": "Дадаткова", + "nav-basics-description": "Зразумейце асновы Ethereum", + "nav-basics-label": "Асновы", + "nav-bridges-description": "Web3 ператварылася ў экасістэму блокчэйнаў першага ўзроўню L1 і рашэнняў для маштабавання L2", + "nav-builders-home-description": "Кіраўніцтва па распрацоўцы для Ethereum: ад распрацоўшчыкаў і для распрацоўшчыкаў", + "nav-builders-home-label": "Галоўная старонка для стваральнікаў", + "nav-contribute-description": "Калі вы жадаеце дапамагчы, то гэта вам спатрэбіцца", + "nav-contribute-label": "Уклад у развіццё ethereum.org", + "nav-dao-description": "Супольніцтвы без цэнтралізаванага кіраўніцтва, якія належаць іх удзельнікам", + "nav-dapps-description": "Пазнаёмцеся з багатай экасістэмай праграмных дадаткаў з дапамогай Ethereum", + "nav-defi-description": "Глабальная, даступная для ўсіх альтэрнатыва традыцыйнаму фінансаваму рынку", + "nav-desci-description": "Глабальная, даступная для ўсіх альтэрнатыва існуючай навуковай сістэме", + "nav-desoc-description": "Платформы на аснове блокчэйнаў для сацыяльнага ўзаемадзеяння і стварэння кантэнту", "nav-developers-docs": "Дакументацыя для распрацоўшчыкаў", + "nav-developers": "Распрацоўшчыкі", + "nav-did-description": "Стварайце свае ўнікальныя дэцэнтралізаваныя ідэнтыфікатары і валодайце імі", + "nav-docs-description": "Дакументы, якія дапамогуць зразумець Ethereum і ствараць разам з ім", + "nav-docs-design-description": "Апісанне ўнікальных дызайнерскіх задач web3, лепшых практычных рэкамендацый і вынікаў даследаванняў карыстальнікаў", + "nav-docs-design-label": "Асновы UX/UI-дызайну", + "nav-docs-foundation-description": "Асноўныя прынцыпы распрацоўкі на Ethereum", + "nav-docs-overview-description": "Ваша галоўная старонка для дакументаў па распрацоўцы", + "nav-docs-stack-description": "Зразумець усё пра стэк Ethereum", + "nav-eip-description": "Стандарты, якія вызначаюць новыя функцыі або працэсы", + "nav-eip-label": "Прапановы па паляпшэнні Ethereum (EIP)", + "nav-emerging-description": "Пазнаёмцеся з новымі магчымасцямі выкарыстання Ethereum", + "nav-enterprise-description": "Ethereum: праграмныя дадаткі для бізнесу", + "nav-ethereum-org-description": "Гэты вэб-сайт быў створаны па ініцыятыве супольнасці — далучайцеся да нас і рабіце свой унёсак разам з намі", + "nav-ethereum-wallets-description": "Праграмны дадатак для ўзаемадзеяння з вашым акаўнтам Ethereum", + "nav-events-description": "Дэцэнтралізацыя і свабода ўдзелу для кожнага", + "nav-events-irl-description": "Кожны месяц праводзяцца буйныя падзеі Ethereum, у якіх можна ўдзельнічаць вочна і анлайн", + "nav-events-label": "Супольнасці і падзеі", + "nav-events-online-description": "Гэтыя анлайн-супольнасці заснаваны сотнямі тысяч энтузіястаў Ethereum", + "nav-find-wallet-description": "Гаманцы дазваляюць вам выкарыстоўваць крыптавалюту", + "nav-find-wallet-label": "Выберыце свой гаманец", + "nav-gas-fees-description": "Як разлічваецца камісія за транзакцыі ETH", + "nav-get-eth-description": "Для выкарыстання праграмных дадаткаў Ethereum вам неабходна мець эфір (ETH)", + "nav-get-started-description": "Вашы першыя крокі па выкарыстанні Ethereum", + "nav-governance-description": "Працэс, звязаны з абнаўленнем пратакола Ethereum", + "nav-grants-description": "Складзены нашым супольніцтвам куратарскі спіс праектаў з праграмамі грантавага фінансавання", + "nav-guide-create-account-description": "Кожны можа стварыць акаўнт Ethereum з дапамогай праграмнага дадатку для гаманца бясплатна і ў любы час", + "nav-guide-revoke-access-description": "Заставайцеся ў бяспецы пры ўзаемадзеянні са смарт-кантрактамі і праграмнымі дадаткамі ў экасістэме Ethereum", + "nav-guide-revoke-access-label": "Як адклікаць доступ смарт-кантракта", + "nav-guide-use-wallet-description": "Даведайцеся, як кіраваць усімі асноўнымі функцыямі гаманца", + "nav-guide-use-wallet-label": "Як карыстацца кашальком", + "nav-guides-description": "Практычныя паслядоўныя даведнікі, якія дапамогуць вам пачаць працу", + "nav-guides-label": "Як карыстацца даведнікамі", + "nav-history-description": "Храналогія ўсіх асноўных альтэрнатыўных варыянтаў і абнаўленняў", + "nav-history-label": "Тэхнічныя звесткі аб Ethereum", + "nav-layer-2-description": "Танныя і хуткія транзакцыі для Ethereum", + "nav-learn-by-coding-description": "Інструменты, якія дапамагаюць эксперыментаваць з Ethereum", + "nav-local-env-description": "Выберыце і наладзьце свой стэк распрацоўкі Ethereum", + "nav-mainnet-description": "Праграмныя блокчэйн-дадаткі для прадпрыемстваў можна ствараць у агульнадаступнай асноўнай сетцы Ethereum Mainnet", + "nav-nft-description": "Спосаб прадставіць што-небудзь унікальнае ў якасці актыву на аснове Ethereum", + "nav-open-research-description": "Адной з галоўных пераваг Ethereum з'яўляецца актыўнае даследчае супольніцтва", + "nav-open-research-label": "Адкрытае даследаванне", + "nav-overview-description": "Усё, што звязана з адукацыяй Ethereum", + "nav-participate-overview-description": "Агляд на тэму удзелу", "nav-primary": "Головна", + "nav-quizzes-description": "Даведайцеся аб тым, наколькі добра вы разумееце Ethereum і крыптавалюты", + "nav-quizzes-label": "Праверце свае веды", + "nav-refi-description": "Альтэрнатыўная эканамічная сістэма, заснаваная на прынцыпах рэгенерацыі", + "nav-research-description": "Працэсы, якія выкарыстоўваюцца для паляпшэння Ethereum", + "nav-research-label": "Даследаванні і распрацоўкі", + "nav-roadmap-description": "Шлях да большай бяспечнасці, маштабавання і стабільнасці для Ethereum", + "nav-roadmap-future-description": "Умацаванне Ethereum у якасці надзейнай і дэцэнтралізаванай сеткі", + "nav-roadmap-future-label": "Забеспячэнне будучыні", + "nav-roadmap-label": "План развіцця", + "nav-roadmap-scaling-description": "Абнаўленне сеткі для далейшага зніжэння кошту і паляпшэння хуткасці транзакцый", + "nav-roadmap-security-description": "Забеспячэнне ўстойлівасці Ethereum для ўсіх тыпаў пагроз у будучыні", + "nav-roadmap-security-label": "Палепшаная бяспека", + "nav-roadmap-ux-description": "Выкарыстанне Ethereum неабходна зрабіць боль простым", + "nav-run-a-node-description": "Стаць поўнасцю самастойным, дапамагаючы забяспечваць бяспеку сеткі", + "nav-security-description": "Знаёмцеся з лепшымі практычнымі рэкамендацыямі падчас выкарыстання крыптавалюты", + "nav-smart-contracts-description": "Фундаментальныя блокі экасістэмы Ethereum", + "nav-stablecoins-description": "Стэйблкойны — гэта токены Ethereum, кошт якіх павінен застаецца нязменным", + "nav-stake-description": "Атрымлівайце ўзнагароды за забеспячэнне бяспекі Ethereum", + "nav-stake-label": "Стэйкінг", + "nav-staking-home-description": "Агляд розных варыянтаў для стэйкінгу", + "nav-staking-pool-description": "Стэйкайце і атрымлівайце ўзнагароды з любой колькасцю ETH разам з іншымі людзьмі", + "nav-staking-pool-label": "Аб'яднаны стэйкінг", + "nav-staking-saas-label": "Стэйкінг пры дапамозе паслуг", + "nav-staking-solo-label": "Адзіночны стэйкінг", + "nav-start-building-description": "Карысная інфармацыя для тых, хто пачынае", + "nav-translation-program-description": "Сумесныя намаганні па перакладу ethereum.org на ўсе мовы", + "nav-tutorials-description": "Куратарскі спіс навучальных матэрыялаў супольніцтва", + "nav-use-cases-description": "Пазнаёмцеся з рознымі ідэямі выкарыстання Ethereum", + "nav-what-is-ether-description": "Валюта праграмных дадаткаў Ethereum", + "nav-what-is-ethereum-description": "Разуменне таго, што робіць Ethereum асаблівым", + "nav-what-is-web3-label": "Што такое Web3?", + "nav-what-is-web3-description": "Альтэрнатыва цэнтралізаваным манаполіям, якія дыктуюць свае правілы", + "nav-whitepaper-description": "Арыгінальная тэхнічная дакументацыя Ethereum, якая была напісана Віталікам Бутэрыным у 2014 годзе", + "nav-zkp-description": "Спосаб даказаць сапраўднасць сцвярджэння без яго раскрыцця", "nft-page": "NFT - Неўзаемназаменныя токены", "nfts": "NFT", "no": "Не", @@ -140,6 +241,7 @@ "page-developers-aria-label": "Меню Распрацоўшчыка", "page-index-meta-title": "Галоўная", "page-last-updated": "Абноўлена", + "participate-menu": "Меню ўдзелу", "pbs": "Адрозненне аўтара прапановы і распрацоўшчыка", "pools": "Аб'яднаны стэйкінг", "privacy-policy": "Палітыка прыватнасці", @@ -150,13 +252,11 @@ "refresh": "Абнавіць старонку.", "return-home": "вярнуцца на галоўную старонку", "roadmap": "План развіцця Ethereum", + "research": "Даследаванне", + "research-menu": "Меню даследавання", "resources": "Рэсурсы для перакладу", - "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "Дакументацыя для распрацоўшчыкаў", "rollup-component-technology-and-risk-summary": "Агляд тэхналогій і рызыкі", - "scaling": "Scaling", "saas": "Стэйкінг, як паслуга", "search": "Пошук", "search-ethereum-org": "Шукаць на ethereum.org", @@ -167,19 +267,13 @@ "single-slot-finality": "Завяршэнне ў адзін слот", "statelessness": "Адсутнасць статусу", "see-contributors": "Прагляд удзельнікаў", - "set-up-local-env": "Set up local environment", - "sharding": "Sharding", "show-all": "Паказаць усё", "show-less": "Паказваць менш", "site-description": "Ethereum гэта глабальная, дэцэнтралізаваная платформа для карыстання грашыма і новымі тыпамі дадаткаў. На гэтай платформе вы можаце пісаць код, які кантралюе грошы і стварае даступныя з усіх краёў свету дадаткі.", - "site-title": "ethereum.org", "skip-to-main-content": "Перайсці да асноўнага зместу", - "smart-contracts": "Smart contracts", - "stablecoins": "Stablecoins", "stake-eth": "Стэйкайце ETH", "staking": "Стэйкінг", "start-here": "Пачніце тут", - "style-guide": "Style guide", "solo": "Адзіночны стэйкінг", "terms-of-use": "Правілы выкарыстання", "translation-banner-body-new": "Гэта старонка адлюстроўваецца на англійскай мове, таму што мы яшчэ не пераклалі яе. Дапамажыце нам у гэтым.", @@ -191,17 +285,18 @@ "translation-banner-no-bugs-title": "Памылак тут няма!", "translation-banner-no-bugs-content": "Гэтая старонка не перакладзена. Мы наўмысна пакуль пакінулі яе на англійскай мове.", "translation-banner-no-bugs-dont-show-again": "Больш не паказваць", + "translation-program": "Праграму перакладу", "try-using-search": "Паспрабуйце выкарыстоўваць пошук, каб знайсці тое, што вы шукаеце або", "tutorials": "Падручнікі", "up": "Уверх", + "use": "Выкарыстанне", "use-ethereum": "Карыстанне Ethereum", "use-ethereum-menu": "Выкарыстанне меню Ethereum", - "user-experience": "User experience", + "use-menu": "Меню выкарыстання", "verkle-trees": "Дрэвы Веркла", "wallets": "Гаманцы", "we-couldnt-find-that-page": "Гэтая старонка не знойдзена", "web3": "Што такое Web3?", - "web3-title": "Web3", "website-last-updated": "Абноўлена", "what-is-ether": "Што такое эфір (ETH)?", "what-is-ethereum": "Што такое Ethereum?", diff --git a/src/intl/bs/common.json b/src/intl/bs/common.json index 2cd5eefc6b2..0d612748ad7 100644 --- a/src/intl/bs/common.json +++ b/src/intl/bs/common.json @@ -1,17 +1,27 @@ { - "account-abstraction": "Pregled računa", "about-ethereum-org": "O ethereum.org", "about-us": "O nama", + "adding-desci-projects": "Dodavanje Desci projekata", + "adding-developer-tools": "Dodavanje alata za programere", + "adding-exchanges": "Dodavanje konverzija", + "adding-glossary-terms": "Dodavanje pojmova iz rječnika", + "adding-staking-products": "Dodavanje proizvoda uloga", + "adding-wallets": "Dodavanje novčanika", + "account-abstraction": "Pregled računa", "aria-toggle-search-button": "Dugme za pretragu", "aria-toggle-menu-button": "Dugme za isključivanje/uključivanje menija", "beacon-chain": "Beacon Chain", "bridges": "Mostovi za bloklance", + "build": "Verzija", + "build-menu": "Meni verzije", "clear": "Obriši", "close": "Zatvori", "community": "Zajednica", "community-hub": "Društveni dom", "community-menu": "Sadržaj društva", "contact": "Stupite u kontakt", + "content-buckets": "Grupe sadržaja", + "content-resources": "Resursi sadržaja", "content-standardization": "Standardizacija sadržaja", "contributing": "Doprinosi", "contributors": "Saradnici", @@ -27,7 +37,10 @@ "decentralized-identity": "Decentralizovan identitet", "decentralized-social-networks": "Decentralizovane društvene mreže", "decentralized-science": "DeSci - Decentralizovana nauka", + "description": "Opis stavke za navigaciju", "defi-page": "DeFi - Decentralizovane finansije", + "design": "Dizajn", + "design-principles": "Principi dizajna", "devcon": "Devcon", "developers": "Programeri", "developers-home": "Početna stranica za programere", @@ -51,7 +64,6 @@ "documentation": "Dokumentacija", "down": "Dolе", "ecosystem": "Ekosistem", - "edit-page": "Edit page", "ef-blog": "Ethereum Foundation Blog", "eips": "Prejdlozi za Poboljšanje Ethereum-a", "energy-consumption": "Ethereum potrošnja energije", @@ -63,7 +75,6 @@ "ethereum-bug-bounty": "Nagradni program za lovce grešaka na Ethereumu", "consensus-when-shipping": "Kada je isporuka?", "ethereum-upgrades": "Nadogradnje Ethereuma", - "ethereum-brand-assets": "Ethereum brand assets", "ethereum-online": "Zajednice na mreži", "ethereum-events": "Ethereum događaji", "ethereum-foundation": "Ethereum Foundation", @@ -83,22 +94,20 @@ "feedback-card-prompt-tutorial": "Da li vam je ovaj lekcija pomogla?", "feedback-widget-thank-you-title": "Hvala na povratnim informacijama!", "feedback-widget-thank-you-subtitle": "Poboljšajte ovu stranicu putem odgovora na nekoliko pitanja.", - "feedback-widget-thank-you-subtitle-ext": "Ako vam treba pomoć, možete se obratiti zajednici na našem Diskord-u.", + "feedback-widget-thank-you-subtitle-ext": "Ako vam je potrebna pomoć, kontaktirajte zajednicu na našoj stranici Discord.", "feedback-widget-thank-you-timing": "2–3 minute", "feedback-widget-thank-you-cta": "Otvori kratku anketu", - "find-wallet": "Find wallet", "future-proofing": "Osiguranje za budućnost", "get-eth": "Nabavite ETH", "get-involved": "Uključite se", - "get-started": "Get started", "grants": "Stipendije", "grant-programs": "Program za Stipendiranje Ekosistema", "guides": "Vodiči", - "guides-hub": "Centar za vodiče", + "guides-hub": "Vodiči za početak korištenja", "history-of-ethereum": "Istorija Ethereum-a", "home": "Početna", "how-ethereum-works": "Kako Ethereum funkcioniše", - "how-to-register-an-ethereum-account": "Kako \"registrovati\" Ethereum račun", + "how-to-create-an-ethereum-account": "Kako \"registrovati\" Ethereum račun", "how-to-revoke-token-access": "Kako ukinuti pristup pametnom ugovoru vašim kripto sredstvima", "how-to-swap-tokens": "Kako razmeniti tokene", "how-to-use-a-bridge": "Kako premostiti tokene na nivo 2", @@ -115,11 +124,9 @@ "last-edit": "Posljednje uređivanje", "layer-2": "Sloj 2", "learn": "Nauči", - "learn-by-coding": "Learn by coding", "learn-hub": "Centar za učenje", "learn-menu": "Sadržaj centra za učenje", "learn-more": "Nauči više", - "less": "Less", "light-mode": "Svjetlo", "listing-policy-disclaimer": "Svi proizvodi navedeni na ovoj stranici nisu naše zvanične preporuke, i dati su samo u informativne svrhe. Ukoliko želite da dodate proizvod, ili date vaše mišljenje o pravilima, molimo obratite se GitHub-u.", "loading": "Učitavanje...", @@ -128,10 +135,102 @@ "loading-error-try-again-later": "Nije moguće učitati podatke. Pokušajte ponovo kasnije.", "logo": "logo", "mainnet-ethereum": "Glavna mreža Ethereum", - "more": "More", - "nav-developers": "Programeri", + "merge": "Spajanje", + "nav-about-description": "Javni projekt otvorenog koda za zajednicu Ethereum", + "nav-advanced-description": "Naučite složenije teme", + "nav-basics-description": "Naučite osnove Ethereuma", + "nav-basics-label": "Osnove", + "nav-bridges-description": "Web3 je prerastao u ekosistem primarnih L1 blok-lanaca i L2 skalirajućih rješenja", + "nav-builders-home-description": "Priručnik za Ethereum – napravili graditelji za graditelje", + "nav-builders-home-label": "Dom graditelja", + "nav-contribute-description": "Ako želite pomoći, ovo su smjernice", + "nav-contribute-label": "Doprinos platformi ethereum.org", + "nav-dao-description": "Zajednice u vlasništvu člana bez centraliziranog tijela", + "nav-dapps-description": "Istražite bogati ekosistem aplikacija koje koriste Ethereum", + "nav-defi-description": "Globalna, otvorena alternativa tradicionalnom finansijskom tržištu", + "nav-desci-description": "Globalna, otvorena alternativa trenutnom naučnom sistemu", + "nav-desoc-description": "Platforme na bazi blok-lanaca za socijalnu interakciju i kreiranje sadržaja", "nav-developers-docs": "Dokumenti za programere", + "nav-developers": "Programeri", + "nav-did-description": "Izdajte i posjedujte vlastite decentralizirane identifikatore", + "nav-docs-description": "Dokumenti koji će vam pomoći da razumijete i gradite uz Ethereum", + "nav-docs-design-description": "Opis jedinstvenih izazova u dizajniranju web3, najbolje prakse i uvidi korisničkog istraživanja", + "nav-docs-design-label": "Osnove dizajniranja UX/UI", + "nav-docs-foundation-description": "Ključne osnove za razvoj na Ethereumu", + "nav-docs-overview-description": "Vaš dom za dokumente razvojnih programera", + "nav-docs-stack-description": "Naučite sve detalje Ethereum stacka", + "nav-eip-description": "Standardi koji određuju nove funkcije ili procese", + "nav-eip-label": "Prijedlozi za poboljšanje Ethereuma (EIP-ovi)", + "nav-emerging-description": "Upoznajte druge novije slučajeve upotrebe za Ethereum", + "nav-emerging-label": "Primjeri korštenja u nastajanju", + "nav-enterprise-description": "Poslovne aplikacije za Ethereum", + "nav-ethereum-org-description": "Ovu web aplikaciju pokreće zajednica – pridružite nam se i doprinesite i vi", + "nav-ethereum-wallets-description": "Aplikacija za interakciju s vašim Ethereum računom", + "nav-events-description": "Decentralizacija i sloboda za učešće svima", + "nav-events-irl-description": "Svakog mjeseca odvijaju se lični i online vodeći događaji na Ethereumu", + "nav-events-label": "Zajednice i događaji", + "nav-events-online-description": "Stodine hiljada entuzijasta za Ethereum stvaraju ove online zajednice", + "nav-find-wallet-description": "Novčanici vam omogućavaju da koristite kriptovalute", + "nav-find-wallet-label": "Odaberite svoj novčanik", + "nav-gas-fees-description": "Kako se izračunavaju naknade za ETH transakcije", + "nav-get-eth-description": "Treba vam ether (ETH) za upotrebu Ethereum aplikacija", + "nav-get-started-description": "Vaši prvi koraci prilikom upotrebe Ethereuma", + "nav-governance-description": "Proces uključen u nadogradnju Ethereum protokola", + "nav-grants-description": "Prilagođena lista naše zajednice na projektima koji pružaju programe finansiranja", + "nav-guide-create-account-description": "Svako u bilo kojem trenutku može besplatno kreirati Ethereum račun uz aplikaciju novčanika", + "nav-guide-create-account-label": "Kako napraviti Ethereum račun", + "nav-guide-revoke-access-description": "Zaštitite se prilikom interakcije s pametnim ugovorima i aplikacijama u Ethereum ekosistemu", + "nav-guide-revoke-access-label": "Kako ponišitit pristup pametnom ugovoru", + "nav-guide-use-wallet-description": "Naučite kako da se rukovodite svim osnovnim funkcijama novčanika", + "nav-guide-use-wallet-label": "Kako koristiti novčanik", + "nav-guides-description": "Praktični detaljni vodiči da vam pomognu da započnete", + "nav-guides-label": "Vodiči za početak korištenja", + "nav-history-description": "Vremenska linija svih glavnih forkova i ažuriranja", + "nav-history-label": "Tehnička historija Ethereuma", + "nav-layer-2-description": "Jeftinije i brže transakcije za Ethereum", + "nav-learn-by-coding-description": "Alati koji vam pomažu da eksperimentirate s Ethereumom", + "nav-local-env-description": "Odaberite i postavite svoj Ethereum razvojni stog", + "nav-mainnet-description": "Poslovne aplikacije blok-lanca se mogu izgraditi na javnom Ethereum Mainnetu", + "nav-nft-description": "Način da se bilo šta jedinstveno prikaže kao imovina zasnovana na Etheriumu", + "nav-open-research-description": "Jedna od primarnih snaga Ethereuma je njegovna aktivna istraživačka zajednica", + "nav-open-research-label": "Otvori istraživanje", + "nav-overview-description": "Sve o edukaciji o Ethereumu", + "nav-participate-overview-description": "Pregled učešća", "nav-primary": "Primarni", + "nav-quizzes-description": "Otkrijte koliko dobro razumijete Ethereum i kriptovalute", + "nav-quizzes-label": "Testirajte svoje znanje", + "nav-refi-description": "Alternativna verzija ekonomskog sistema o regenerativnim principima", + "nav-research-description": "Procesi koji se koriste za poboljšanje Ethereuma", + "nav-research-label": "Istraživanje i razvoj", + "nav-roadmap-description": "Put ka skalabilnijem, sigurnijem i održivijem Ethereumu", + "nav-roadmap-future-description": "Učvršćivanje Ethereuma kao čvrste i decentralizirane mreže", + "nav-roadmap-future-label": "Osiguranje za budućnost", + "nav-roadmap-label": "Mapa puta", + "nav-roadmap-scaling-description": "Ažuriranje mreže ka dodatnom smanjenju troškova i brzine transakcije", + "nav-roadmap-security-description": "Osiguranje otpornosti Ethereuma od svih napada u budućnosti", + "nav-roadmap-security-label": "Poboljšana sigurnost", + "nav-roadmap-ux-description": "Korištenje Ethereuma treba biti pojednostavljeno", + "nav-run-a-node-description": "Postanite potpuno uspješni dok pomažete zaštititi mrežu", + "nav-security-description": "Naučite najbolje prakse prilikom korištenja kriptovalute", + "nav-smart-contracts-description": "Osnovni gradivni blokovi Ethereum ekosistema", + "nav-stablecoins-description": "Stabilne kritpovalute (stablecoins) su Ethereum tokeni koji trebaju ostati pri fiksnoj vrijednosti", + "nav-stake-description": "Zaradite nagrade dok osiguravate Ethereum", + "nav-stake-label": "Ulog", + "nav-staking-home-description": "Pregled različitih opcija stavljanja uloga", + "nav-staking-pool-description": "Stavite ulog i zaradite nagrade s bilo kojim iznosom ETH-a udruživanjem s drugima", + "nav-staking-pool-label": "Udruženo ulaganje", + "nav-staking-saas-label": "Stavljanje uloga uz servis", + "nav-staking-solo-label": "Samostalno ulaganje", + "nav-start-building-description": "Korisne informacije za novake", + "nav-translation-program-description": "Zajednički trud da se ethereum.org prevede na sve jezike", + "nav-tutorials-description": "Prilagođena lista tutorijala za zajednicu", + "nav-use-cases-description": "Otkrijte različite ideje upotrebe Ethereuma", + "nav-what-is-ether-description": "Valuta Ethereum aplikacija", + "nav-what-is-ethereum-description": "Saznajte zašto je Ethereum poseban", + "nav-what-is-web3-label": "Šta je Web3?", + "nav-what-is-web3-description": "Alternativa centraliziranim monopolima koji diktiraju pravila", + "nav-whitepaper-description": "Originalni dokument o Ethereumu koji je napisao Vitalik Buterin 2014. godine", + "nav-zkp-description": "Način dokazivanja valjanost tvrdnje bez otkrivanja same tvrdnje", "nft-page": "NFT - Nezamenljivi tokeni", "nfts": "NFT", "no": "Ne", @@ -140,6 +239,7 @@ "page-developers-aria-label": "Sadržaj za programere", "page-index-meta-title": "Početna", "page-last-updated": "Stranica poslednji put ažurirana", + "participate-menu": "Meni učešća", "pbs": "Razdvoj između predlagača i graditelja", "pools": "Udruženo ulaganje", "privacy-policy": "Pravila o privatnosti", @@ -150,13 +250,11 @@ "refresh": "Molimo osvežite stranicu.", "return-home": "vrati se na početnu stranicu", "roadmap": "Plan razvoja Ethereum-a", + "research": "Istraživanje", + "research-menu": "Meni istraživanja", "resources": "Pomoćna sredstva za prevođenje", - "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "Dokumenti za programere", "rollup-component-technology-and-risk-summary": "Sažetak o tehnologiji i riziku", - "scaling": "Scaling", "saas": "Ulaganje kao servis", "search": "Pretraži", "search-ethereum-org": "Pretraži ethereum.org", @@ -167,19 +265,13 @@ "single-slot-finality": "Single-slot zaključenje", "statelessness": "Bezstanje", "see-contributors": "Smotri saradnike", - "set-up-local-env": "Set up local environment", - "sharding": "Sharding", "show-all": "Izloži sve", "show-less": "Izloži manje", "site-description": "Ethereum je globalna, decentralizovana platforma za novac i nove vrste aplikacija. Na Ethereum-u možete programirati kod koji kontroliše novac i graditi aplikacije dostupne bilo gdje u svijetu.", - "site-title": "ethereum.org", "skip-to-main-content": "Skoči na glavni sadržaj", - "smart-contracts": "Smart contracts", - "stablecoins": "Stablecoins", "stake-eth": "Uložite ETH", "staking": "Ulaganje", "start-here": "Počni ovdje", - "style-guide": "Style guide", "solo": "Samostalno ulaganje", "terms-of-use": "Uslovi korištenja", "translation-banner-body-new": "Ovu stranici je na engleskom jer je još nismo preveli. Pomozite nam da prevedemo ovaj sadržaj.", @@ -191,17 +283,18 @@ "translation-banner-no-bugs-title": "Ovo nije greška!", "translation-banner-no-bugs-content": "Ova stranica nije prevedena. Namjerno smo je ostavili na engleskom za sada.", "translation-banner-no-bugs-dont-show-again": "Ne prikazuj ponovo", + "translation-program": "Program prevođenja", "try-using-search": "Pokušajte koristiti funkciju pretrage da nađete to što vam treba", "tutorials": "Praktični vodiči", "up": "Gore", + "use": "Korištenje", "use-ethereum": "Koristi Ethereum", "use-ethereum-menu": "Koristi Ethereum sadržaj", - "user-experience": "User experience", + "use-menu": "Meni korištenja", "verkle-trees": "Verkle stabla", "wallets": "Novčanici", "we-couldnt-find-that-page": "Nismo našli tu stranicu", "web3": "Šta je Web3?", - "web3-title": "Web3", "website-last-updated": "Posljednje ažuriranje stranice", "what-is-ether": "Šta je ether (ETH)?", "what-is-ethereum": "Šta je Ethereum?", diff --git a/src/intl/da/common.json b/src/intl/da/common.json index 836cfa0fa9b..8bf10697b5b 100644 --- a/src/intl/da/common.json +++ b/src/intl/da/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "Konto-abstraktion", "about-ethereum-org": "Om ethereum.org", "about-us": "Om os", + "adding-desci-projects": "Tilføjelse af Desci-projekter", + "adding-developer-tools": "Tilføjelse af udviklerværktøjer", + "adding-exchanges": "Tilføjelse af handler", + "adding-glossary-terms": "Tilføjelse af termer ftil glossar", + "adding-staking-products": "Tilføjelse af indsatsprodukter", + "adding-wallets": "Tilføjelse af punge", + "account-abstraction": "Konto-abstraktion", + "acknowledgements": "Anerkendelser", "aria-toggle-search-button": "Skift søgeknap", "aria-toggle-menu-button": "Tænd/sluk menuknappen", "beacon-chain": "Beacon Chain", "bridges": "Blockchain-broer", + "bug-bounty": "Fejldusør", + "build": "Build", + "build-menu": "Build-menu", "clear": "Ryd", "close": "Luk", "community": "Fællesskab", "community-hub": "Fællesskabs-hub", "community-menu": "Fællesskabs-menu", "contact": "Kontakt", + "content-buckets": "Indholdsmapper", + "content-resources": "Indholdsressourcer", "content-standardization": "Standardisering af indhold", "contributing": "Bidrager", "contributors": "Bidragere", @@ -27,7 +39,10 @@ "decentralized-identity": "Decentraliseret identitet", "decentralized-social-networks": "Decentraliserede sociale netværk", "decentralized-science": "DeSci - Decentraliseret videnskab", + "description": "Beskrivelse f. nav-punkt", "defi-page": "DeFi - Decentraliserede finanser", + "design": "Design", + "design-principles": "Designprincipper", "devcon": "Devcon", "developers": "Udviklere", "developers-home": "Udviklerens startside", @@ -51,7 +66,7 @@ "documentation": "Dokumentation", "down": "Ned", "ecosystem": "Økosystem", - "edit-page": "Redigér side", + "edit-page": "Rediger side", "ef-blog": "Ethereum Foundation Blog", "eips": "Forslag til forbedring af Ethereum", "energy-consumption": "Ethereums energiforbrug", @@ -59,7 +74,6 @@ "enterprise-menu": "Virksomhedsmenu", "esp": "Supportprogram for økosystem", "eth-current-price": "Aktuel ETH-pris (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Ethereum-fejlbelønningsprogram", "consensus-when-shipping": "Hvornår sendes det?", "ethereum-upgrades": "Ethereum-opgraderinger", @@ -75,7 +89,7 @@ "ethereum-protocol": "Ethereum-protokol", "ethereum-security": "Ethereums sikkerhed og forebyggelse af svindel", "ethereum-support": "Ethereum Support", - "ethereum-wallets": "Ethereum-tegnebog", + "ethereum-wallets": "Ethereum-tegnebøger", "ethereum-whitepaper": "Ethereum-hvidbog", "feedback-widget-prompt": "Er denne side nyttig?", "feedback-card-prompt-page": "Var denne side nyttig?", @@ -83,7 +97,7 @@ "feedback-card-prompt-tutorial": "Var denne vejledning nyttig?", "feedback-widget-thank-you-title": "Tak for din feedback!", "feedback-widget-thank-you-subtitle": "Gør denne side endnu bedre ved at besvare et par spørgsmål.", - "feedback-widget-thank-you-subtitle-ext": "Hvis du har brug for hjælp, kan du spørge fællesskabet på vores Discord.", + "feedback-widget-thank-you-subtitle-ext": "Har du brug for hjælp, kan du spørge fællesskabet på vores Discord.", "feedback-widget-thank-you-timing": "2–3 min", "feedback-widget-thank-you-cta": "Åbn kort undersøgelse", "find-wallet": "Find tegnebog", @@ -94,11 +108,10 @@ "grants": "Tilskud", "grant-programs": "Økosystem-tilskudsprogrammer", "guides": "Guider", - "guides-hub": "Guidehub", + "guides-hub": "Sådan gør du-guider", "history-of-ethereum": "Ethereums historik", "home": "Startside", "how-ethereum-works": "Sådan fungerer Ethereum", - "how-to-register-an-ethereum-account": "Sådan \"registreres\" en Ethereum konto", "how-to-revoke-token-access": "Sådan tilbagekalder man smart kontrakt-adgang til sine krypto midler", "how-to-swap-tokens": "Sådan byttes tokens", "how-to-use-a-bridge": "Sådan forbindes tokens til lag 2", @@ -128,10 +141,105 @@ "loading-error-try-again-later": "Kan ikke indlæse data. Prøv igen senere.", "logo": "logo", "mainnet-ethereum": "Hovednetværk Ethereum", + "merge": "Flet", "more": "Mere", - "nav-developers": "Udviklere", + "nav-about-description": "Et offentligt, open source-projekt for Ethereum-fællesskabet", + "nav-advanced-description": "Lær de mere komplekse emner", + "nav-advanced-label": "Avanceret", + "nav-basics-description": "Forstå det grundlæggende i Ethereum", + "nav-basics-label": "Det grundlæggende", + "nav-bridges-description": "Web3 har udviklet sig til et økosystem af primære L1-blockchains og L2-skaleringsløsninger", + "nav-builders-home-description": "En byggehåndbog til Ethereum - af byggere, for byggere", + "nav-builders-home-label": "Byggerens hjem", + "nav-contribute-description": "Har du brug for hjælp, vil denne vejlede dig", + "nav-contribute-label": "Bidrag til ethereum.org", + "nav-dao-description": "Medlemsejede fællesskaber uden centraliseret myndighed", + "nav-dapps-description": "Udforsk et rigt økosystem af apps, der bruge Ethereum", + "nav-defi-description": "Et globalt, åbent alternativ til et traditionelt finansmarked", + "nav-desci-description": "Et globalt, åbent alternativ til det nuværende videnskabelige system", + "nav-desoc-description": "Blockchainbaserede platforme til social interaktion og indholdsskabelse", "nav-developers-docs": "Udviklerdokumenter", + "nav-developers": "Udviklere", + "nav-did-description": "Udgiv og ej dine unikke decntraliserede identifikatorer", + "nav-docs-description": "Doks, der hjælper dig med at forstå og bygge med Ethereum", + "nav-docs-design-description": "Beskrivelse af unikke web3-designudfordringer, bedste praksis og brugerforskningsindsigt", + "nav-docs-design-label": "Grundlæggende UX-/UI-design", + "nav-docs-foundation-description": "Det helt grundlæggende for udvikling på Ethereum", + "nav-docs-overview-description": "Dit hjem for udvikler-doks", + "nav-docs-stack-description": "Forstå alle detaljerne i Ethereum stack", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Standarder, der specificerer nye funktioner eller processer", + "nav-eip-label": "Forslag til Ethereums forbedring (EIP'er)", + "nav-emerging-description": "Lær andre nyere brugseksempler for Ethereum", + "nav-enterprise-description": "Forretningsapplikationer til Ethereum", + "nav-ethereum-org-description": "Denne hjemmeside er fællesskabsdrevet - slut dig til os, og bidrag", + "nav-ethereum-wallets-description": "En app til at interagere med din Ethereum-konto", + "nav-events-description": "Decentralisering og frihed for alle til at deltage", + "nav-events-irl-description": "Der er store Ethereum-begivenheder hver måned - fysiske og online", + "nav-events-label": "Fællesskaber og begivenheder", + "nav-events-online-description": "Hundredtusindvis af Ethereum-entusiaster bidrager i disse online-fællesskaber", + "nav-find-wallet-description": "Med punge kan du bruge krypto", + "nav-find-wallet-label": "Vælg din tegnebog", + "nav-gas-fees-description": "Sådan beregnes ETH-transaktionsgebyrer", + "nav-get-eth-description": "Det kræver ether (ETH) for at bruge Ethereum-applikationer", + "nav-get-started-description": "Dine første trin mod brug af Ethereum", + "nav-governance-description": "Processen krævet for at opgradere Ethereum-protokollen", + "nav-governance-label": "Forvaltning", + "nav-grants-description": "En organiseret liste fra vores fællesskab over projekter, der er med i tilskudsfinansieringsordninger", + "nav-guide-create-account-description": "Alle kan når som helst og gratis oprette en Ethereum-konto med en tegnebogsapp", + "nav-guide-revoke-access-description": "Forbliv sikker, når du interagerer med smarte kontrakter og applikationer i Ethereum-økosystemet", + "nav-guide-revoke-access-label": "Sådan tilbagekaldes adgang til smart kontrakt", + "nav-guide-use-wallet-description": "Lær, hvordan du kører alle grundlæggende funktioner i en tegnebog", + "nav-guide-use-wallet-label": "Sådan bruges en tegnebog", + "nav-guides-description": "Praktiske trin for trin-guider, der hjælper dig i gang", + "nav-guides-label": "Sådan gør du-guider", + "nav-history-description": "En tidslinje over alle de store forgreninger og opdateringer", + "nav-history-label": "Ethereums tekniske historik", + "nav-layer-2-description": "Billigere og hurtigere transaktioner for Ethereum", + "nav-learn-by-coding-description": "Værktøjer, der hjælper dig med at eksperimentere med Ethereum", + "nav-local-env-description": "Vælg og opsæt din Ethereum-udviklingsstak", + "nav-mainnet-description": "Virksomheders blockchain-applikationer kan bygges på det offentlige Ethereum Mainnet", + "nav-nft-description": "En måde at repræsentere noget unikt på som et Ethereum-baseret aktiv", + "nav-open-research-description": "En af de primære styrker ved Ethereum er dets aktive forskerfællesskab", + "nav-open-research-label": "Åbn søgning", + "nav-overview-description": "Alt om Ethereum-uddannelse", + "nav-participate-overview-description": "Oversigt over hvordan man deltager", "nav-primary": "Primær", + "nav-quizzes-description": "Find ud af, hvor godt du forstår Ethereum og kryptovalutaer", + "nav-quizzes-label": "Test din viden", + "nav-refi-description": "Et alternativt økonomisk system bygger på regenerative principper", + "nav-research-description": "Processer, der bruges til forbedring af Ethereum", + "nav-research-label": "Forskning og udvikling", + "nav-roadmap-description": "Vejen til mere skalerbarhed, sikkerhed og bæredygtighed for Ethereum", + "nav-roadmap-future-description": "Befæstelse af Ethereum som et robust og decentraliseret netværk", + "nav-roadmap-future-label": "Fremtidssikring", + "nav-roadmap-label": "Roadmap", + "nav-roadmap-scaling-description": "Netværksopdateringer for yderligere reduktion af transaktionsomkostninger og for hastighed", + "nav-roadmap-security-description": "Sikring af, at Ethereum forbliver modstandsdygtig over for alle slags angreb i fremtiden", + "nav-roadmap-security-label": "Forbedret sikkerhed", + "nav-roadmap-ux-description": "Brugen af Ethereum skal forenkles", + "nav-run-a-node-description": "Bliv fuldstændig suveræn, mens du hjælper med at sikre netværket", + "nav-security-description": "Lær bedste praksis til at bruge kryptovaluta", + "nav-smart-contracts-description": "De grundlæggende byggesten i Ethereum-økosystemet", + "nav-stablecoins-description": "Stablecoins er Ethereum-tokens beregnet til at holde en fast værdi", + "nav-stake-description": "Optjen bonusser for at sikre Ethereum", + "nav-stake-label": "Indsats", + "nav-staking-home-description": "Oversigt over forskellige muligheder for at satse", + "nav-staking-home-label": "Staking hjem", + "nav-staking-pool-description": "Sats, og optjen bonusser med et hvilket som helst beløb u ETH ved at gå sammen med andre", + "nav-staking-pool-label": "Samlet staking", + "nav-staking-saas-label": "Sats med en service", + "nav-staking-solo-label": "Solo-staking", + "nav-start-building-description": "Nyttig information for nytilkomne", + "nav-translation-program-description": "Et samarbejde om at oversætte ethereum.org til alle sprog", + "nav-tutorials-description": "Organiseret liste over fællesskabsvejledning", + "nav-use-cases-description": "Se forskellige ideer til brug af Ethereum", + "nav-what-is-ether-description": "Valutaen i Ethereum-apps", + "nav-what-is-ethereum-description": "Forstå, hvad der gør Ethereum til noget særligt", + "nav-what-is-web3-label": "Hvad er Web3?", + "nav-what-is-web3-description": "Et alternativ til centraliserede monopoler, der bestemmer reglerne", + "nav-whitepaper-description": "Den oprindelige Ethereum-hvidbog skrevet af Vitalik Buterin i 2014", + "nav-zkp-description": "En måde at bevise gyldigheden af et udsagn uden at afsløre selve udsagnet", "nft-page": "NFT'er - Ikke-ombyttelige tokens", "nfts": "NFT'er", "no": "Nej", @@ -140,6 +248,7 @@ "page-developers-aria-label": "Udviklermenu", "page-index-meta-title": "Startside", "page-last-updated": "Side senest opdateret", + "participate-menu": "Menu for deltagelse", "pbs": "Separation af proposer-builder", "pools": "Samlet staking", "privacy-policy": "Databeskyttelse", @@ -150,9 +259,11 @@ "refresh": "Genindlæs venligst siden.", "return-home": "retur til startside", "roadmap": "Ethereum køreplan", + "research": "Forskning", + "research-menu": "Menu for forskning", "resources": "Oversættelsesressourcer", "regenerative-finance": "ReFi - Regenerativ finansiering", - "run-a-node": "Kør en node", + "run-a-node": "Kør en indholdselement", "rollup-component-website": "Websted", "rollup-component-developer-docs": "Udviklerdokumenter", "rollup-component-technology-and-risk-summary": "Teknologi- og risikoopsummering", @@ -164,6 +275,7 @@ "search-box-blank-state-text": "Søg alt det du vil!", "search-eth-address": "Dette ligner en Ethereum-adresse. Vi leverer ikke data specifikt til adresser. Prøv at søge efter det på en block-stifinder som", "search-no-results": "Ingen resultater af din søgning", + "security": "Sikkerhed", "single-slot-finality": "Enkeltpladsfinalitet", "statelessness": "Tilstandsløshed", "see-contributors": "Se bidragydere", @@ -172,15 +284,14 @@ "show-all": "Vis alle", "show-less": "Vis mindre", "site-description": "Ethereum er en global, decentraliseret platform for penge og nye former for applikationer. På Ethereum kan du skrive kode, der styrer penge, og bygge applikationer tilgængelige overalt i verden.", - "site-title": "ethereum.org", "skip-to-main-content": "Spring til hovedindholdet", - "smart-contracts": "Smart kontrakter", + "smart-contracts": "Intelligente kontrakter", "stablecoins": "Stablecoins", "stake-eth": "Stake ETH", "staking": "Indskyder", "start-here": "Start her", - "style-guide": "Style guide", "solo": "Solo-staking", + "support": "Support", "terms-of-use": "Brugsvilkår", "translation-banner-body-new": "Du ser denne side på engelsk, fordi vi ikke har oversat den endnu. Hjælp os med at oversætte dette indhold.", "translation-banner-body-update": "Der er en ny version af siden, men den er kun på engelsk lige nu. Hjælp os med at oversætte den nyeste version.", @@ -191,17 +302,18 @@ "translation-banner-no-bugs-title": "Ingen fejl her!", "translation-banner-no-bugs-content": "Denne side oversættes ikke. Siden er bevidst bibeholdt på engelsk for nu.", "translation-banner-no-bugs-dont-show-again": "Vis ikke igen", + "translation-program": "Oversættelsesprogram", "try-using-search": "Prøv at bruge søgning for at finde det, du leder efter", "tutorials": "Vejledninger", "up": "Op", + "use": "Brug", "use-ethereum": "Brug Ethereum", "use-ethereum-menu": "Brug Ethereum-menu", - "user-experience": "User experience", + "use-menu": "Brugsmenu", "verkle-trees": "Verkle-træer", "wallets": "Tegnebøger", "we-couldnt-find-that-page": "Vi kunne ikke finde den side", "web3": "Hvad er Web3?", - "web3-title": "Web3", "website-last-updated": "Websted senest opdateret", "what-is-ether": "Hvad er ether (ETH)?", "what-is-ethereum": "Hvad er Ethereum?", diff --git a/src/intl/fa/common.json b/src/intl/fa/common.json index be38ee4b625..137fad43c86 100644 --- a/src/intl/fa/common.json +++ b/src/intl/fa/common.json @@ -1,17 +1,29 @@ { - "account-abstraction": "انتزاع حساب", "about-ethereum-org": "درباره ethereum.org", "about-us": "درباره ما", + "adding-desci-projects": "افزودن پروژه‌های Desci", + "adding-developer-tools": "افزودن ابزارهای توسعه‌دهنده", + "adding-exchanges": "افزودن صرافی‌ها", + "adding-glossary-terms": "افزودن عبارات واژه‌نامه", + "adding-staking-products": "افزودن پروژه‌های سهام‌گذاری", + "adding-wallets": "افزودن کیف پول", + "account-abstraction": "تفکیک حساب", + "acknowledgements": "تقدیرات", "aria-toggle-search-button": "تغییر وضعیت دکمه جستجو", "aria-toggle-menu-button": "تغییر وضعیت دکمه منو", - "beacon-chain": "زنجیره بیکن", - "bridges": "پل‌های زنجیره‌‌ی بلوکی", + "beacon-chain": "زنجیره‌ی بیکن", + "bridges": "پل‌های بلاکچین", + "bug-bounty": "پاداش برای باگ", + "build": "ساخت", + "build-menu": "منوی ساخت", "clear": "پاک‌کردن", "close": "بستن", - "community": "جامعه", - "community-hub": "مرکز اجتماع", + "community": "اجتماع", + "community-hub": "دورهمی جامعه", "community-menu": "منوی جامعه", "contact": "تماس", + "content-buckets": "دسته‌های محتوا", + "content-resources": "منابع محتوا", "content-standardization": "استانداردسازی محتوا", "contributing": "مشارکت", "contributors": "مشارکت کنندگان", @@ -19,17 +31,20 @@ "cookie-policy": "سیاست کوکی‌‌ها", "copied": "کپی شد", "copy": "کپی", - "danksharding": "Danksharding", - "dao-page": "DAOs - سازمان‌های مستقل غیر متمرکز", + "danksharding": "دانک‌شاردینگ", + "dao-page": "DAOها - سازمان‌های خودمختار غیرمتمرکز", "dark-mode": "تاریک", "data-provided-by": "منبع داده‌ها:", "decentralized-applications-dapps": "Dapps - برنامه‌های کاربردی غیر متمرکز", - "decentralized-identity": "هویت نامتمرکز", - "decentralized-social-networks": "شبکه‌های مجازی نامتمرکز", + "decentralized-identity": "هویت غیرمتمرکز", + "decentralized-social-networks": "شبکه های اجتماعی غیر متمرکز", "decentralized-science": "دیسای - دانش نامتمرکز", + "description": "توضیحات برای آیتم پیمایش", "defi-page": "DeFi - امور مالی غیر متمرکز", + "design": "طراحی", + "design-principles": "اصول طراحی", "devcon": "دِوکان", - "developers": "توسعه دهندگان", + "developers": "توسعه‌دهندگان", "developers-home": "خانه توسعه دهندگان", "docs": "اسناد", "docsearch-to-select": "برای انتخاب", @@ -37,7 +52,7 @@ "docsearch-to-close": "مسدود کردن", "docsearch-search-by": "جست و جو بر اساس", "docsearch-start-recent-searches-title": "موارد اخیر", - "docsearch-start-no-recent-searches": "به تازگی جست و جویی نکرده‌اید", + "docsearch-start-no-recent-searches": "به تازگی جست و جویی نکرده‌ اید", "docsearch-start-save-recent-search": "ذخیره این جستجو", "docsearch-start-remove-recent-search": "حذف کردن این جست و جو از تاریخچه", "docsearch-start-favorite-searches": "علاقه مندی ها", @@ -63,7 +78,7 @@ "ethereum-bug-bounty": "برنامه پاداش باگ اتریوم", "consensus-when-shipping": "چه زمانی راه‌اندازی می‌شود؟", "ethereum-upgrades": "ارتقاهای اتریوم", - "ethereum-brand-assets": "دارایی‌های نام تجاری اتریوم", + "ethereum-brand-assets": "دارایی‌های \"برند\" اتریوم", "ethereum-online": "جوامع آنلاین", "ethereum-events": "رویدادهای اتریوم", "ethereum-foundation": "بنیاد اتریوم", @@ -75,7 +90,7 @@ "ethereum-protocol": "پروتکل اتریوم", "ethereum-security": "امنیت اتریوم و جلوگیری از کلاهبرداری", "ethereum-support": "پشتیبانی اتریوم", - "ethereum-wallets": "کیف پول های اتریوم", + "ethereum-wallets": "کیف‌های پول اتریوم", "ethereum-whitepaper": "برگه سفید اتریوم", "feedback-widget-prompt": "آیا این صفحه مفید است؟", "feedback-card-prompt-page": "آیا این برگه مفید بود؟", @@ -86,19 +101,19 @@ "feedback-widget-thank-you-subtitle-ext": "اگر به کمک نیاز دارید، می‌توانید از طریق دیسکورد ما با انجمن در تماس باشید.", "feedback-widget-thank-you-timing": "2-3 دقیقه", "feedback-widget-thank-you-cta": "باز کردن نظرسنجی کوتاه", - "find-wallet": "یافتن کیف پول", + "find-wallet": "کیف پول را پیدا کنید", "future-proofing": "تضمین آینده‌", - "get-eth": "دریافت اتریوم", + "get-eth": "دریافت اتر", "get-involved": "مشارکت کنید", "get-started": "شروع کنید", "grants": "کمک‌های بلاعوض", "grant-programs": "برنامه‌های اعطای اکوسیستم", "guides": "راهنمایی‌ها", - "guides-hub": "مرکز راهنمایی‌ها", + "guides-hub": "راهنماها", "history-of-ethereum": "تاریخچه اتریوم", "home": "خانه", "how-ethereum-works": "اتریوم چگونه کار می‌ کند", - "how-to-register-an-ethereum-account": "چگونگی «ساخت» یک حساب اتریوم", + "how-to-create-an-ethereum-account": "چگونگی «ساخت» یک حساب اتریوم", "how-to-revoke-token-access": "چطور می‌توانید دسترسی قرارداد هوشمند را به رمزارزهای خود ممنوع کنید", "how-to-swap-tokens": "چگونگی مبادله‌ توکن‌ها", "how-to-use-a-bridge": "چگونه توکن‌ها را به لایه 2 انتقال دهیم", @@ -128,10 +143,114 @@ "loading-error-try-again-later": "امکان بارگذاری داده‌ها وجود ندارد. لطفا بعدا دوباره تلاش کنید.", "logo": "لوگو", "mainnet-ethereum": "شبکه اصلی اتریوم", + "merge": "ادغام", "more": "بیشتر", - "nav-developers": "توسعه‌دهندگان", + "nav-about-description": "یک پروژه عمومی و منبع‌باز برای جامعه اتریوم", + "nav-advanced-description": "موضوعات پیچیده‌تر را بیاموزید", + "nav-advanced-label": "پیشرفته", + "nav-basics-description": "اصول اتریوم را بشناسید", + "nav-basics-label": "اصول اولیه", + "nav-bridges-description": "Web3 به اکوسیستمی از بلاک‌چین‌های L1 اولیه و راهکارهای مقیاس‌پذیری L2 تکامل یافته است", + "nav-builders-home-description": "کتابچه راهنمای سازنده برای اتریوم—توسط سازندگان، برای سازندگان", + "nav-builders-home-label": "خانه سازنده", + "nav-contribute-description": "اگر می‌خواهید کمک کنید، این شما را راهنمایی می‌کند", + "nav-contribute-label": "مشارکت در ethereum.org", + "nav-dao-description": "جوامع تحت مالکیت اعضا بدون مرجع متمرکز", + "nav-dapps-description": "با استفاده از اتریوم، در اکوسیستمی غنی از برنامه‌ها کاوش کنید", + "nav-defi-description": "یک جایگزین جهانی و باز برای بازار مالی سنتی", + "nav-desci-description": "یک جایگزین جهانی و باز برای سیستم علمی فعلی", + "nav-desoc-description": "پلتفرم‌های مبتنی بر بلاک‌چین برای تعامل اجتماعی و تولید محتوا", "nav-developers-docs": "اسناد توسعه‌دهندگان", + "nav-developers": "توسعه‌دهندگان", + "nav-did-description": "شناسه‌های غیرمتمرکز منحصربه‌فرد خود را صادر کرده و مالک آن شوید", + "nav-docs-description": "اسنادی برای کمک به شما به‌منظور درک و ساخت با اتریوم", + "nav-docs-design-description": "شرح چالش‌های منحصربه‌فرد طراحی web3، بهترین رویه‌ها، و آمار تحقیقاتی کاربر", + "nav-docs-design-label": "اصول طراحی UX/UI", + "nav-docs-foundation-description": "اصول اساسی برای توسعه در اتریوم", + "nav-docs-foundation-label": "موضوعات بنیادی", + "nav-docs-overview-description": "خانه شما برای اسناد توسعه‌دهنده", + "nav-docs-stack-description": "از تمام جزئیات سهام اتریوم آگاه شوید", + "nav-docs-stack-label": "سهام اتریوم", + "nav-eip-description": "استانداردهایی که ویژگی‌ها یا فرآیندهای جدید را مشخص می‌کنند", + "nav-eip-label": "پیشنهادهای بهبود اتریوم (EIPs)", + "nav-emerging-description": "سایر موارد کاربردهای جدیدتر برای اتریوم را بشناسید", + "nav-emerging-label": "موارد کاربرد در حال ظهور", + "nav-enterprise-description": "کاربردهای تجاری برای اتریوم", + "nav-ethereum-org-description": "این وب‌سایت از نوع جامعه‌محور است—به ما بپیوندید و شما نیز مشارکت کنید", + "nav-ethereum-wallets-description": "برنامه‌ای برای تعامل با حساب اتریوم شما", + "nav-events-description": "تمرکززدایی و آزادی مشارکت برای همگان", + "nav-events-irl-description": "هر ماه رویدادهای مهم اتریوم به‌صورت حضوری و آنلاین برگزار می‌شود", + "nav-events-label": "جوامع و رویدادها", + "nav-events-online-description": "صدها هزار نفر از علاقه‌مندان به اتریوم در این جوامع آنلاین پیشگام می‌شوند", + "nav-find-wallet-description": "کیف‌های پول به شما امکان استفاده از رمزارز را می‌دهند", + "nav-find-wallet-label": "کیف پول خود را انتخاب کنید", + "nav-gas-fees-description": "کارمزدهای تراکنش ETH چگونه محاسبه می‌شوند", + "nav-get-eth-description": "برای استفاده از برنامه‌های اتریوم به اتر (ETH) نیاز دارید", + "nav-get-started-description": "اولین قدم‌های شما برای استفاده از اتریوم", + "nav-governance-description": "فرآیند دخیل در ارتقای پروتکل اتریوم", + "nav-governance-label": "حکومت", + "nav-grants-description": "فهرستی تنظیم‌شده توسط جامعه ما در مورد پروژه‌هایی که برنامه‌های تأمین مالی را ارائه می‌کنند", + "nav-guide-create-account-description": "هر کسی می‌تواند در هر زمانی که بخواهد، به‌صورت رایگان با یک برنامه کیف پول، یک حساب اتریوم ایجاد کند", + "nav-guide-create-account-label": "چگونگی «ساخت» یک حساب اتریوم", + "nav-guide-revoke-access-description": "هنگام تعامل با قراردادهای هوشمند و برنامه‌های کاربردی در اکوسیستم اتریوم همواره در امان باشید", + "nav-guide-revoke-access-label": "نحوه لغو دسترسی قرارداد هوشمند", + "nav-guide-use-wallet-description": "یاد بگیرید چگونه با تمام عملکردهای اساسی یک کیف پول کار کنید", + "nav-guide-use-wallet-label": "چگونگی استفاده از کیف‌پول", + "nav-guides-description": "راهنماهای عملی گام‌به‌گام برای کمک به شما در شروع کار", + "nav-guides-label": "نحوه دسترسی به راهنمایی‌ها", + "nav-history-description": "خط زمانی تمام دسته‌بندی‌ها و به‌روزرسانی‌های اصلی", + "nav-history-label": "تاریخچه فنی اتریوم", + "nav-layer-2-description": "تراکنش‌های ارزان‌تر و سریع‌تر برای اتریوم", + "nav-learn-by-coding-description": "ابزارهایی که به شما کمک می‌کنند با اتریوم آزمایش کنید", + "nav-local-env-description": "سهام توسعه اتریوم خود را انتخاب و راه‌اندازی کنید", + "nav-mainnet-description": "برنامه‌های بلاک‌چین سازمانی را می‌توان بر روی شبکه اصلی عمومی اتریوم ایجاد کرد", + "nav-nft-description": "راهی برای نمایش دادن هر چیز بی‌همتا به‌عنوان یک دارایی مبتنی بر اتریوم", + "nav-open-research-description": "یکی از نقاط قوت اولیه اتریوم جامعه تحقیقاتی فعال آن است", + "nav-open-research-label": "پژوهش باز", + "nav-overview-description": "آموزش همه‌جانبه درباره اتریوم", + "nav-overview-label": "نگاه اجمالی", + "nav-participate-overview-description": "مروری بر نحوه مشارکت", "nav-primary": "اولیه", + "nav-private-description": "منابع توسعه دهندگان برای تشکیلات سازمانی اتریوم", + "nav-quizzes-description": "دریابید که چقدر از اتریوم و رمزارزها آگاه هستید", + "nav-quizzes-label": "دانش خود را بسنجید", + "nav-refi-description": "یک سیستم اقتصادی جایگزین مبتنی بر اصول بازتولیدکننده", + "nav-research-description": "فرآیندهای مورد استفاده برای بهبود اتریوم", + "nav-research-label": "تحقیق و توسعه", + "nav-roadmap-description": "مسیری به سمت افزایش مقیاس‌پذیری، امنیت و پایداری اتریوم", + "nav-roadmap-future-description": "تثبیت اتریوم به‌عنوان یک شبکه قوی و غیرمتمرکز", + "nav-roadmap-future-label": "تضمین آینده‌", + "nav-roadmap-label": "نقشه‌ی راه", + "nav-roadmap-scaling-description": "به‌روزرسانی‌های شبکه برای کاهش بیشتر هزینه‌ها و سرعت تراکنش", + "nav-roadmap-scaling-label": "تراکنش‌های ارزان‌تر", + "nav-roadmap-security-description": "اطمینان از این‌که اتریوم در برابر انواع حملات در آینده مقاوم می‌ماند", + "nav-roadmap-security-label": "بهبود امنیت", + "nav-roadmap-ux-description": "استفاده از اتریوم باید ساده شود", + "nav-run-a-node-description": "درعین‌حال که به امنیت شبکه کمک می‌کنید، حاکمیت کامل را به دست آورید", + "nav-security-description": "بهترین رویه‌ها را در هنگام استفاده از رمزارز بیاموزید", + "nav-smart-contracts-description": "عناصر سازنده اساسی اکوسیستم اتریوم", + "nav-stablecoins-description": "استیبل کوین‌ها توکن‌های اتریوم هستند که به گونه‌ای طراحی شده‌اند که مقدارشان ثابت می‌ماند", + "nav-stake-description": "در ازای ایمن‌سازی اتریوم، پاداش کسب کنید", + "nav-stake-label": "سهام‌گذاری", + "nav-staking-home-description": "مروری بر گزینه‌های مختلف برای سهام‌گذاری", + "nav-staking-home-label": "صفحه اصلی سهام‌گذاری", + "nav-staking-pool-description": "از طریق پیوستن به دیگران، هر چقدر ETH که می‌خواهید سهام‌گذاری کنید و پاداش کسب کنید", + "nav-staking-pool-label": "سهام‌گذاری گروهی", + "nav-staking-saas-description": "عملگرهای گره شخص ثالث، عملیات کلاینت اعتبارسنج شما را مدیریت می‌کنند", + "nav-staking-saas-label": "سهام‌گذاری با یک خدمت", + "nav-staking-solo-description": "سخت‌افزار خانگی را اجرا کنید و شخصاً امنیت و تمرکززدایی شبکه اتریوم را بیشتر کنید", + "nav-staking-solo-label": "سهام گذاری انفرادی", + "nav-start-building-description": "اطلاعات مفید برای تازه‌واردان", + "nav-translation-program-description": "تلاش جمعی برای ترجمه ethereum.org به همه زبان‌ها", + "nav-tutorials-description": "لیست تهیه‌شده از آموزش‌های انجمن", + "nav-use-cases-description": "ایده‌های مختلف برای استفاده از اتریوم را کشف کنید", + "nav-use-cases-label": "موارد استفاده", + "nav-what-is-ether-description": "واحد پول برنامه‌های کاربردی اتریوم", + "nav-what-is-ethereum-description": "با ویژگی متمایز اتریوم آشنا شوید", + "nav-what-is-web3-label": "Web3 چیست؟", + "nav-what-is-web3-description": "جایگزینی برای انحصارهای متمرکز که قوانین را تحمیل می‌کنند", + "nav-whitepaper-description": "وایت‌پیپر اصلی اتریوم که توسط ویتالیک بوترین در سال 2014 نوشته شده است", + "nav-zkp-description": "روشی برای اثبات اعتبار یک گزاره بدون افشای خودِ گزاره", "nft-page": "NFT - توکن‌های معاوضه‌ناپذیر", "nfts": "توکن‌های معاوضه‌ناپذیر", "no": "خیر", @@ -140,6 +259,8 @@ "page-developers-aria-label": "منوی توسعه‌دهنده‌ها", "page-index-meta-title": "خانه", "page-last-updated": "آخرین بروزرسانی صفحه", + "participate": "مشارکت کنید", + "participate-menu": "منوی مشارکت", "pbs": "جداسازی سازنده-پیشنهاددهنده", "pools": "سهام‌گذاری گروهی", "privacy-policy": "سیاست حریم خصوصی", @@ -150,10 +271,12 @@ "refresh": "لطفا صفحه را دوباره باز کنید.", "return-home": "بازگشت به صفحه اصلی", "roadmap": "نقشه‌ راه اتریوم", + "research": "پژوهش", + "research-menu": "منوی پژوهش", "resources": "منابع ترجمه", "regenerative-finance": "ReFi - امور مالی بازتولیدکننده", "run-a-node": "راه‌اندازی یک گره", - "rollup-component-website": "وب‌سایت", + "rollup-component-website": "وب سایت", "rollup-component-developer-docs": "اسناد توسعه‌دهندگان", "rollup-component-technology-and-risk-summary": "خلاصه فناوری و ریسک", "scaling": "مقیاس‌پذیری", @@ -164,23 +287,24 @@ "search-box-blank-state-text": "جستجو کنید!", "search-eth-address": "این شبیه به یک آدرس اتریوم است. ما اطلاعات دقیقی درباره آدرس‌ها ارائه نمی‌کنیم. به دنبال یک جستجوگر بلاک برای این کار بگردید مثل", "search-no-results": "موردی برای جستجویتان یافت نشد", + "security": "ایمنی", "single-slot-finality": "قطعیت تک جایگاهی", "statelessness": "بی‌وضعیتی", "see-contributors": "مشاهده مشارکت کنندگان", "set-up-local-env": "تنظیم محیط محلی", - "sharding": "خرد کردن", + "sharding": "زنجیره ای سازی", "show-all": "نمایش همه", "show-less": "نمایش کمتر", "site-description": "اتریوم یک پلتفرم جهانی و غیرمتمرکز برای پول و انواع جدیدی از کاربردها است. در اتریوم می‌توانید کدی بنویسید که بتواند پول را کنترل کند، و برنامه‌هایی بسازید که در هر جای دنیا قابل دسترسی باشند.", - "site-title": "ethereum.org", "skip-to-main-content": "پرش به محتوای اصلی", "smart-contracts": "قرارداد‌های هوشمند", - "stablecoins": "ارز دیجیتال باثبات", + "stablecoins": "استیبل کوین‌ها", "stake-eth": "اتر را سهام گذاری کنید", "staking": "سهام گذاری", "start-here": "از اینجا شروع کنید", "style-guide": "راهنمای سبک", "solo": "سهام گذاری انفرادی", + "support": "پشتیبانی", "terms-of-use": "شرایط استفاده", "translation-banner-body-new": "شما این صفحه را به زبان انگلیسی می‌بینید زیرا ما هنوز آن را ترجمه نکرده‌ایم. برای ترجمه این محتوا به ما کمک کنید.", "translation-banner-body-update": "نسخه جدیدی از این صفحه موجود است اما در حال حاضر فقط به زبان انگلیسی است. در ترجمه آخرین نسخه به ما کمک کنید.", @@ -191,19 +315,22 @@ "translation-banner-no-bugs-title": "اینجا هیچ اشکالی وجود ندارد!", "translation-banner-no-bugs-content": "این صفحه هنوز ترجمه نشده است. ما فعلا این صفحه را عمدا به زبان انگلیسی رها کرده‌ایم.", "translation-banner-no-bugs-dont-show-again": "دیگر نمایش نده", + "translation-program": "برنامه ترجمه", "try-using-search": "سعی کنید از جستجو برای پیدا کردن آنچه به دنبال آن هستید استفاده کنید یا", "tutorials": "آموزش‌ها", "up": "بالا", + "use": "استفاده", "use-ethereum": "از اتریوم استفاده کنید", "use-ethereum-menu": "از منوی اتریوم استفاده کنید", + "use-menu": "منوی استفاده", "user-experience": "تجربه‌ی کاربری", "verkle-trees": "درختان ورکل", - "wallets": "کیف پول‌ها", + "wallets": "کیف‌پول‌ها", "we-couldnt-find-that-page": "ما نتوانستیم آن صفحه را پیدا کنیم", "web3": "Web3 چیست؟", "web3-title": "Web3", "website-last-updated": "آخرین بروزرسانی وبسایت", - "what-is-ether": "اتریوم (ETH) چیست؟", + "what-is-ether": "اتر (ETH) چیست؟", "what-is-ethereum": "اتریوم چیست؟", "withdrawals": "برداشت‌ها از سهام‌گذاری", "yes": "بله", diff --git a/src/intl/gu/common.json b/src/intl/gu/common.json index 75cbb7086e3..52c35133421 100644 --- a/src/intl/gu/common.json +++ b/src/intl/gu/common.json @@ -1,32 +1,72 @@ { "about-ethereum-org": "ethereum.org વિશે", "about-us": "અમારા વિશે", + "adding-desci-projects": "Desci પ્રોજેક્ટ્સ ઉમેરી રહ્યા છીએ", + "adding-developer-tools": "વિકાસકર્તા સાધનો ઉમેરી રહ્યા છીએ", + "adding-exchanges": "એક્સચેન્જ ઉમેરી રહ્યા છીએ", + "adding-glossary-terms": "ગ્લોસરી શબ્દો ઉમેરી રહ્યા છીએ", + "adding-staking-products": "સ્ટેકિંગ પ્રોડક્ટ્સ ઉમેરી રહ્યા છીએ", + "adding-wallets": "વૉલેટ્સ ઉમેરી રહ્યા છીએ", + "account-abstraction": "ખાતાનો સાર", + "acknowledgements": "સ્વીકૃતિઓ", "aria-toggle-search-button": "શોધ બટનને ટૉગલ કરો", "aria-toggle-menu-button": "ટૉગલ મેનુ બટન", "beacon-chain": "બીકન ચેન", "bridges": "બ્લોકચેન પુલ", + "bug-bounty": "બગ બક્ષિસ", + "build": "બીલ્ડ", + "build-menu": "બિલ્ડ મેનુ", + "clear": "સાફ કરો", "close": "બંધ", "community": "સમુદાય", "community-hub": "સમુદાય-હબ", "community-menu": "સમુદાય-મેનુ", "contact": "સંપર્ક", + "content-buckets": "સામગ્રી બકેટ્સ", + "content-resources": "સામગ્રી સંસાધનો", + "content-standardization": "સામગ્રી પ્રમાણીકરણ", "contributing": "યોગદાન આપી રહ્યા છે", "contributors": "યોગદાન આપનાર", "contributors-thanks": "દરેક વ્યક્તિ જેણે આ પૃષ્ઠમાં યોગદાન આપ્યું છે - આભાર!", "cookie-policy": "કૂકી નીતિ", "copied": "નકલ કરી", "copy": "નકલ કરો", + "danksharding": "ડેંકશાર્ડીંગ", + "dao-page": "DAOs - વિકેન્દ્રિત સ્વાયત્ત સંસ્થાઓ", "dark-mode": "અંધારુ", "data-provided-by": "માહિતીનું પ્રાપ્તિસ્થાન:", "decentralized-applications-dapps": "Dapps - વિકેન્દ્રિત એપ્લિકેશન", + "decentralized-identity": "વિકેન્દ્રિત ઓળખ", + "decentralized-social-networks": "વિકેન્દ્રિત સામાજિક નેટવર્ક્સ", "decentralized-science": "DeSci - વિકેન્દ્રિત વિજ્ઞાન", + "description": "nav આઇટમ માટે વર્ણન", + "defi-page": "DeFi - વિકેન્દ્રિત ફાઇનાન્સ", + "design": "ડિઝાઇન", + "design-principles": "ડિઝાઇન સિદ્ધાંતો", "devcon": "ડેવકોન", "developers": "વિકાસકર્તાઓ", "developers-home": "વિકાસકર્તાઓનું ઘર", "docs": "દસ્તાવેજ", + "docsearch-to-select": "પસંદ કરવા માટે", + "docsearch-to-navigate": "પહોંચવા માટે", + "docsearch-to-close": "બંધ કરવા માટે", + "docsearch-search-by": "દ્વારા શોધો", + "docsearch-start-recent-searches-title": "તાજેતરના", + "docsearch-start-no-recent-searches": "કોઈ તાજેતરની શોધ નથી", + "docsearch-start-save-recent-search": "આ શોધ સાચવો", + "docsearch-start-remove-recent-search": "ઇતિહાસમાંથી આ શોધ દૂર કરો", + "docsearch-start-favorite-searches": "મનપસંદ", + "docsearch-start-remove-favorite-search": "આ શોધને મનપસંદમાંથી દૂર કરો", + "docsearch-no-results-text": "માટે કોઈ પરિણામ નથી", + "docsearch-no-results-suggested-query": "શોધવાનો પ્રયાસ કરો", + "docsearch-no-results-missing": "માને છે કે આ ક્વેરી પરિણામ આપશે?", + "docsearch-no-results-missing-link": "અમને જણાવો.", + "docsearch-error-title": "પરિણામો મેળવવામાં અસમર્થ", + "docsearch-error-help": "તમે તમારું નેટવર્ક કનેક્શન તપાસવા ઇચ્છી શકો છો.", "documentation": "દસ્તાવેજીકરણ", + "down": "નીચે", "ecosystem": "ઇકોસિસ્ટમ", - "edit-page": "પેજ સંપાદિત કરો", + "edit-page": "પાનું સંપાદિત કરો", "ef-blog": "ઈથિરિયમ ફાઉન્ડેશન બ્લોગ", "eips": "ઈથિરિયમ સુધારણા દરખાસ્તો", "energy-consumption": "ઈથિરિયમ ઊર્જા વપરાશ", @@ -37,7 +77,7 @@ "ethereum-bug-bounty": "ઈથિરિયમ બગ બાઉન્ટી પ્રોગ્રામ", "consensus-when-shipping": "તે ક્યારે શિપિંગ કરે છે?", "ethereum-upgrades": "ઈથિરિયમ સુધારાઓ", - "ethereum-brand-assets": "ઈથિરિયમ બ્રાન્ડ અસ્કયામતો", + "ethereum-brand-assets": "Ethereum બ્રાન્ડ અસ્કયામતો", "ethereum-online": "ઑનલાઇન સમુદાયો", "ethereum-events": "ઈથિરિયમ ઘટનાઓ", "ethereum-foundation": "ઈથિરિયમ ફાઉન્ડેશન", @@ -45,9 +85,11 @@ "ethereum-glossary": "ઈથિરિયમ ગ્લોસરી", "ethereum-governance": "ઈથિરિયમ શાસન", "ethereum-logo": "ઈથિરિયમ લોગો", + "ethereum-roadmap": "ઈથિરિયમ રોડમેપ", + "ethereum-protocol": "ઇથેરિયમ પ્રોટોકોલ", "ethereum-security": "ઈથિરિયમ સુરક્ષા અને કૌભાંડ નિવારણ", "ethereum-support": "ઈથિરિયમ સપોર્ટ", - "ethereum-wallets": "ઈથિરિયમ વૉલેટ", + "ethereum-wallets": "ઇથેરિયમ પાકીટ", "ethereum-whitepaper": "ઈથિરિયમ વ્હાઇટપેપર", "feedback-widget-prompt": "શું આ પેજ મદદરૂપ છે?", "feedback-card-prompt-page": "શું આ પેજ મદદરૂપ થયું?", @@ -55,19 +97,25 @@ "feedback-card-prompt-tutorial": "શું આ ટ્યુટોરીયલ મદદરૂપ હતું?", "feedback-widget-thank-you-title": "તમારા પ્રતિભાવ બદલ આભાર!", "feedback-widget-thank-you-subtitle": "થોડા પ્રશ્નોના જવાબ આપીને આ પેજને વધુ સારું બનાવો.", - "feedback-widget-thank-you-subtitle-ext": "જો તમને મદદની જરૂર હોય, તો તમે અમારા Discord પર સમુદાયનો સંપર્ક કરી શકો છો.", + "feedback-widget-thank-you-subtitle-ext": "જો તમને મદદની જરૂર હોય, તો તમે અમારા વિરામ પર સમુદાયનો સંપર્ક કરી શકો છો.", "feedback-widget-thank-you-timing": "2-3 મિનિટ", "feedback-widget-thank-you-cta": "ટૂંકા સર્વેક્ષણ ખોલો", "find-wallet": "વૉલેટ શોધો", - "get-eth": "ETH મેળવો", + "future-proofing": "ફ્યુચર-પ્રૂફિંગ", + "get-eth": "મેળવો ETH", "get-involved": "સામેલ કરો", "get-started": "શરૂઆત કરો", "grants": "અનુદાન", "grant-programs": "ઇકોસિસ્ટમ ગ્રાન્ટ પ્રોગ્રામ્સ", - "guides-and-resources": "સમુદાય માર્ગદર્શિકાઓ અને સંસાધનો", + "guides": "માર્ગદર્શિકાઓ", + "guides-hub": "કેવી રીતે માર્ગદર્શન આપવું", "history-of-ethereum": "ઈથિરિયમનો ઇતિહાસ", "home": "હોમ", "how-ethereum-works": "ઈથિરિયમ કેવી રીતે કામ કરે છે", + "how-to-revoke-token-access": "તમારા ક્રિપ્ટો ફંડ્સમાં સ્માર્ટ કોન્ટ્રાક્ટ ઍક્સેસ કેવી રીતે રદ કરવો", + "how-to-swap-tokens": "ટોકન્સ કેવી રીતે સ્વેપ કરવા", + "how-to-use-a-bridge": "ટોકન્સને લેયર 2 પર કેવી રીતે બ્રિજ કરવા", + "how-to-use-a-wallet": "વૉલેટનો ઉપયોગ કેવી રીતે કરવો", "image": "છબી", "in-this-section": "આ વિભાગમાં", "individuals": "વ્યક્તિઓ", @@ -81,6 +129,7 @@ "layer-2": "સ્તર 2", "learn": "શીખો", "learn-by-coding": "કોડિંગ દ્વારા શીખો", + "learn-hub": "હબ શીખો", "learn-menu": "મેનૂ શીખો", "learn-more": "વધુ શીખો", "less": "ઓછા", @@ -89,42 +138,154 @@ "loading": "લોડ કરી રહ્યું છે...", "loading-error": "લોડ કરવામાં ભૂલ.", "loading-error-refresh": "ભૂલ, કૃપા કરીને રિફ્રેશ કરો.", + "loading-error-try-again-later": "ડેટા લોડ કરવામાં અસમર્થ. પછીથી ફરી પ્રયાસ કરો.", "logo": "લોગો", "mainnet-ethereum": "મેઇનનેટ ઈથિરિયમ", + "merge": "મર્જ કરો", "more": "વધુ", - "nav-developers": "વિકાસકર્તાઓ", + "nav-about-description": "ઈથિરિયમ સમુદાય માટે જાહેર, ઓપન સોર્સ પ્રોજેક્ટ", + "nav-advanced-description": "વધુ જટિલ વિષયો જાણો", + "nav-basics-description": "ઈથિરિયમની મૂળભૂત બાબતોને સમજો", + "nav-basics-label": "મૂળભૂત", + "nav-bridges-description": "Web3 પ્રાથમિક L1 બ્લોકચેન અને L2 સ્કેલિંગ સોલ્યુશન્સની ઇકોસિસ્ટમમાં વિકસિત થયું છે", + "nav-builders-home-description": "ઈથિરિયમ માટે બિલ્ડરનું મેન્યુઅલ—બિલ્ડર દ્વારા, બિલ્ડર માટે", + "nav-builders-home-label": "બિલ્ડરનું હોમ", + "nav-contribute-description": "જો તમે મદદ કરવા માંગતા હોવ, તો આ તમને માર્ગદર્શન આપશે", + "nav-contribute-label": "Ethereum.org માં યોગદાન આપવું", + "nav-dao-description": "કેન્દ્રિય સત્તા વગરના સભ્ય-માલિકીના સમુદાયો", + "nav-dapps-description": "ઈથિરિયમનો ઉપયોગ કરીને એપ્લિકેશન્સની સમૃદ્ધ ઇકોસિસ્ટમનું અન્વેષણ કરો", + "nav-defi-description": "પરંપરાગત નાણાંકીય બજારનો વૈશ્વિક, ખુલ્લો વિકલ્પ", + "nav-desci-description": "વર્તમાન વૈજ્ઞાનિક પ્રણાલીનો વૈશ્વિક, ખુલ્લો વિકલ્પ", + "nav-desoc-description": "સામાજિક ક્રિયાપ્રતિક્રિયા અને સામગ્રી નિર્માણ માટે બ્લોકચેન-આધારિત પ્લેટફોર્મ", "nav-developers-docs": "વિકાસકર્તાઓ દસ્તાવેજો", + "nav-developers": "વિકાસકર્તાઓ", + "nav-did-description": "તમારા અનન્ય વિકેન્દ્રિત ઓળખકર્તાઓ રજૂ કરો અને માલિકી મેળવો", + "nav-docs-description": "ઈથિરિયમ સાથે સમજવા અને બિલ્ડ કરવામાં તમારી મદદ કરવા માટે દસ્તાવેજ", + "nav-docs-design-description": "અનન્ય web3 ડિઝાઇન પડકારો, શ્રેષ્ઠ પ્રયાસો અને વપરાશકર્તા સંશોધન આંતરદૃષ્ટિનું વર્ણન", + "nav-docs-design-label": "UX/UI ડિઝાઇનની મૂળભૂત બાબતો", + "nav-docs-foundation-description": "ઈથિરિયમ પર વિકસાવવા માટેના મુખ્ય મૂળભૂત સિદ્ધાંતો", + "nav-docs-overview-description": "વિકાસકર્તા દસ્તાવેજો માટે તમારું હોમ", + "nav-docs-stack-description": "ઈથિરિયમ સ્ટેકની તમામ વિગતો સમજો", + "nav-eip-description": "ધોરણો કે જે નવી સુવિધાઓ અથવા પ્રક્રિયાઓનો ઉલ્લેખ કરે છે", + "nav-eip-label": "ઈથિરિયમ સુધારણા દરખાસ્તો (EIP)", + "nav-emerging-description": "ઈથિરિયમ માટે અન્ય નવા ઉપયોગના કેસો જાણો", + "nav-enterprise-description": "ઈથિરિયમ માટે વ્યવસાયિક એપ્લિકેશન્સ", + "nav-ethereum-org-description": "આ વેબસાઇટ સમુદાય આધારિત છે - અમારી સાથે જોડાઓ અને યોગદાન આપો", + "nav-ethereum-wallets-description": "તમારા ઈથિરિયમ એકાઉન્ટ સાથે ક્રિયાપ્રતિક્રિયા કરવા માટેની એપ્લિકેશન", + "nav-events-description": "વિકેન્દ્રીકરણ અને કોઈપણ માટે ભાગ લેવાની સ્વતંત્રતા", + "nav-events-irl-description": "દર મહિને મુખ્ય ઈથિરિયમ ઇવેન્ટ્સ વ્યક્તિગત અને ઑનલાઇન હોય છે", + "nav-events-label": "સમુદાયો અને ઘટનાઓ", + "nav-events-online-description": "આ ઑનલાઇન સમુદાયોમાં હજારો ઈથિરિયમ ઉત્સાહીઓ પિતા છે", + "nav-find-wallet-description": "વોલેટ્સ તમને ક્રિપ્ટોનો ઉપયોગ કરવા દે છે", + "nav-find-wallet-label": "તમારું વોલેટ પસંદ કરો", + "nav-gas-fees-description": "ETH ટ્રાન્ઝેક્શન ફીની ગણતરી કેવી રીતે કરવામાં આવે છે", + "nav-get-eth-description": "ઈથિરિયમ એપ્લિકેશનનો ઉપયોગ કરવા માટે તમને ઈથર (ETH) ની જરૂર છે", + "nav-get-started-description": "ઈથિરિયમનો ઉપયોગ કરવા માટેના તમારા પ્રથમ પગલાં", + "nav-governance-description": "ઈથિરિયમ પ્રોટોકોલને અપગ્રેડ કરવામાં સામેલ પ્રક્રિયા", + "nav-governance-label": "શાસન", + "nav-grants-description": "ગ્રાન્ટ ફંડિંગ પ્રોગ્રામ્સ પ્રદાન કરતા પ્રોજેક્ટ્સ પર અમારા સમુદાય દ્વારા ક્યુરેટેડ સૂચિ", + "nav-guide-create-account-description": "વોલેટ એપ્લિકેશન વડે કોઈપણ વ્યક્તિ કોઈપણ સમયે મફતમાં ઈથિરિયમ એકાઉન્ટ બનાવી શકે છે", + "nav-guide-revoke-access-description": "ઈથિરિયમ ઇકોસિસ્ટમમાં સ્માર્ટ કોન્ટ્રેક્ટ્સ અને એપ્લિકેશન્સ સાથે ક્રિયાપ્રતિક્રિયા કરતી વખતે સુરક્ષિત રહો", + "nav-guide-revoke-access-label": "સ્માર્ટ કોન્ટ્રેક્ટ એક્સેસ કેવી રીતે રદ કરવો", + "nav-guide-use-wallet-description": "વોલેટના તમામ મૂળભૂત કાર્યોને કેવી રીતે સંચાલિત કરવા તે જાણો", + "nav-guide-use-wallet-label": "વૉલેટનો ઉપયોગ કેવી રીતે કરવો", + "nav-guides-description": "તમને પ્રારંભ કરવામાં મદદ કરવા માટે પ્રાયોગિક પગલા-દર-પગલા માર્ગદર્શિકાઓ", + "nav-guides-label": "કેવી રીતે માર્ગદર્શન આપવું", + "nav-history-description": "તમામ મુખ્ય ફોર્ક અને અપડેટ્સની સમયરેખા", + "nav-history-label": "ઈથિરિયમનો ટેકનિકલ ઇતિહાસ", + "nav-layer-2-description": "ઈથિરિયમ માટે સસ્તા અને ઝડપી વ્યવહારો", + "nav-learn-by-coding-description": "સાધનો કે જે તમને ઈથિરિયમ સાથે પ્રયોગ કરવામાં મદદ કરે છે", + "nav-local-env-description": "તમારા ઈથિરિયમ વિકાસ સ્ટેકને પસંદ કરો અને સેટ કરો", + "nav-mainnet-description": "એન્ટરપ્રાઇઝ બ્લોકચેન એપ્લિકેશન જાહેર ઈથિરિયમ મેઇનેટ પર બનાવી શકાય છે", + "nav-nft-description": "ઈથિરિયમ-આધારિત સંપત્તિ તરીકે અનન્ય કંઈપણ રજૂ કરવાની રીત", + "nav-open-research-description": "ઈથિરિયમની પ્રાથમિક શક્તિઓમાંનો એક તેનો સક્રિય સંશોધન સમુદાય છે", + "nav-open-research-label": "ખુલ્લું સંશોધન", + "nav-overview-description": "બધી વસ્તુઓનું ઈથિરિયમ શિક્ષણ", + "nav-participate-overview-description": "કેવી રીતે ભાગ લેવો તેની ઝાંખી", "nav-primary": "પ્રાથમિક", + "nav-quizzes-description": "તમે ઈથિરિયમ અને ક્રિપ્ટોકરન્સીને કેટલી સારી રીતે સમજો છો તે જાણો", + "nav-quizzes-label": "તમારા જ્ઞાનનું પરીક્ષણ કરો", + "nav-refi-description": "વૈકલ્પિક આર્થિક પ્રણાલી પુનર્જીવિત સિદ્ધાંતો પર બનેલી છે", + "nav-research-description": "ઈથિરિયમ સુધારવા માટે વપરાતી પ્રક્રિયાઓ", + "nav-research-label": "સંશોધન અને વિકાસ", + "nav-roadmap-description": "ઈથિરિયમ માટે વધુ સ્કેલેબિલીટી, સુરક્ષા અને ટકાઉપણાંનો માર્ગ", + "nav-roadmap-future-description": "મજબૂત અને વિકેન્દ્રિત નેટવર્ક તરીકે ઈથિરિયમને ઘન બનાવવું", + "nav-roadmap-future-label": "ફ્યુચર-પ્રૂફિંગ", + "nav-roadmap-label": "રોડમેપ", + "nav-roadmap-scaling-description": "વ્યવહારના ખર્ચ અને ઝડપને વધુ ઘટાડવા માટે નેટવર્ક અપડેટ્સ", + "nav-roadmap-security-description": "ભવિષ્યમાં ઈથિરિયમ તમામ પ્રકારના હુમલાઓ માટે સ્થિતિસ્થાપક રહે તેની ખાતરી કરવી", + "nav-roadmap-security-label": "સુધારેલ સુરક્ષા", + "nav-roadmap-ux-description": "સુધારેલ સુરક્ષા", + "nav-run-a-node-description": "નેટવર્કને સુરક્ષિત કરવામાં મદદ કરતી વખતે સંપૂર્ણ શ્રેષ્ઠ બનો", + "nav-security-description": "ક્રિપ્ટોકરન્સીનો ઉપયોગ કરતી વખતે શ્રેષ્ઠ પ્રણાલી જાણો", + "nav-smart-contracts-description": "ઈથિરિયમ ઇકોસિસ્ટમના મૂળભૂત બિલ્ડીંગ બ્લોક્સ", + "nav-stablecoins-description": "સ્ટેબલકોઇન્સ એ ઈથિરિયમ ટોકન્સ છે જે નિશ્ચિત મૂલ્ય પર રહેવા માટે રચાયેલ છે", + "nav-stake-description": "ઈથિરિયમને સુરક્ષિત કરવા માટે પુરસ્કારો કમાઓ", + "nav-stake-label": "સ્ટેક", + "nav-staking-home-description": "સ્ટેકિંગ માટેના વિવિધ વિકલ્પોનું પૂર્વાવલોકન", + "nav-staking-pool-description": "અન્ય લોકો સાથે જોડાઈને ETH ની કોઈપણ રકમ સાથે સ્ટેક કરો અને પુરસ્કારો કમાઓ", + "nav-staking-pool-label": "પૂલ સ્ટેકિંગ", + "nav-staking-saas-label": "સેવા સાથે સ્ટેકિંગ", + "nav-staking-solo-label": "સોલો સ્ટેકિંગ", + "nav-start-building-description": "નવા આવનારાઓ માટે ઉપયોગી માહિતી", + "nav-translation-program-description": "ethereum.org ને બધી ભાષાઓમાં અનુવાદિત કરવાનો સહયોગી પ્રયાસ", + "nav-tutorials-description": "સમુદાય ટ્યુટોરિયલ્સની ક્યૂરેટ કરેલ સૂચિ", + "nav-use-cases-description": "ઈથિરિયમના ઉપયોગ માટેના વિવિધ ખ્યાલો શોધો", + "nav-what-is-ether-description": "ઈથિરિયમ એપ્લિકેશન્સનું ચલણ", + "nav-what-is-ethereum-description": "ઈથિરિયમને શું ખાસ બનાવે છે તે સમજો", + "nav-what-is-web3-label": "વેબ3 શું છે?", + "nav-what-is-web3-description": "નિયમોનું નિર્દેશન કરતાં કેન્દ્રિય એકાધિકારનો વિકલ્પ", + "nav-whitepaper-description": "2014 માં વિટાલિક બ્યુટેરિન દ્વારા લખાયેલ મૂળ ઈથિરિયમ વ્હાઇટપેપર", + "nav-zkp-description": "પોતે જ નિવેદન જાહેર કર્યા વિના નિવેદનની માન્યતા સાબિત કરવાની રીત", + "nft-page": "NFTs - નોન-ફંગીબલ ટોકન્સ", + "nfts": "NFT", "no": "ના", "on-this-page": "આ પેજ પર", "open-research": "ખુલ્લું સંશોધન", + "page-developers-aria-label": "ડેવેલોપર્સ મેનુ", + "page-index-meta-title": "હોમ", "page-last-updated": "પેજ નું છેલ્લું અપડેટ", - "privacy-policy": "ગોપનીયતા માટે નીતિ", + "participate-menu": "સહભાગી મેનૂ", + "pbs": "પ્રપોઝર-બિલ્ડરનું વિભાજન", + "pools": "પૂલ સ્ટેકિંગ", + "privacy-policy": "ગોપનીયતા નીતિ", "private-ethereum": "ખાનગી ઈથિરિયમ", + "product-disclaimer": "ઉત્પાદનો અને સેવાઓ ઈથિરિયમ સમુદાય માટે સુવિધા તરીકે સૂચિબદ્ધ છે. ઉત્પાદન અથવા સેવાનો સમાવેશ ethereum.org વેબસાઇટ ટીમ અથવા ઈથિરિયમ ફાઉન્ડેશન તરફથી સમર્થનનું પ્રતિનિધિત્વ કરતું નથી.", + "quizzes-title": "ક્વિઝ હબ", + "quizzes": "ક્વિઝ", "refresh": "કૃપા કરીને પેજ રિફ્રેશ કરો.", "return-home": "હોમ પર પરત", + "roadmap": "ઈથિરિયમ રોડમેપ", + "research": "સંશોધન", + "research-menu": "સંશોધન મેનૂ", + "resources": "અનુવાદ સંસાધનો", "run-a-node": "નોડ ચલાવો", "rollup-component-website": "વેબસાઈટ", "rollup-component-developer-docs": "વિકાસકર્તા દસ્તાવેજો", "rollup-component-technology-and-risk-summary": "ટેકનોલોજી અને જોખમ સારાંશ", + "saas": "સેવા તરીકે સ્ટેકિંગ", "search": "શોધો", + "search-ethereum-org": "ethereum.org શોધો", + "secret-leader-election": "ગુપ્ત આગેવાનની ચૂંટણી", "search-box-blank-state-text": "દૂર શોધો!", "search-eth-address": "આ ઈથિરિયમ સરનામા જેવું લાગે છે. અમે સરનામાં માટે વિશિષ્ટ ડેટા પ્રદાન કરતા નથી. બ્લોક એક્સપ્લોરર જેવા પર તેને શોધવાનો પ્રયાસ કરો", "search-no-results": "તમારી શોધ માટે કોઈ પરિણામ નથી", + "security": "સુરક્ષા", + "single-slot-finality": "સિંગલ-સ્લોટ ફાઇનાલિટી", + "statelessness": "રાજ્યવિહીનતા", "see-contributors": "યોગદાનકર્તાઓ જુઓ", "set-up-local-env": "સ્થાનિક પર્યાવરણ સેટ કરો", - "sharding": "શાર્ડિંગ", + "sharding": "શેરિંગ", "show-all": "બધું બતાવો", "show-less": "ઓછું બતાવો", "site-description": "ઈથિરિયમ એ નાણાં અને નવા પ્રકારની એપ્લિકેશન માટે વૈશ્વિક, વિકેન્દ્રિત પ્લેટફોર્મ છે. ઈથિરિયમ પર, તમે કોડ લખી શકો છો જે પૈસાને નિયંત્રિત કરે છે અને વિશ્વમાં ગમે ત્યાં સુલભ એપ્લિકેશનો બનાવી શકે છે.", - "site-title": "ethereum.org", "skip-to-main-content": "મુખ્ય સામગ્રી પર જાઓ", "smart-contracts": "સ્માર્ટ કરાર", "stablecoins": "સ્ટેબલકોઇન્સ", "staking": "સ્ટેકિંગ", + "start-here": "અહીંથી પ્રારંભ કરો", "solo": "સોલો સ્ટેકિંગ", - "saas": "સેવા તરીકે સ્ટેકિંગ", - "pools": "પૂલ સ્ટેકિંગ", + "support": "આધાર", "terms-of-use": "ઉપયોગના નિયમો", "translation-banner-body-new": "તમે આ પેજ અંગ્રેજીમાં જોઈ રહ્યાં છો કારણ કે અમે હજી સુધી તેનો અનુવાદ કર્યો નથી. આ સામગ્રીનો અનુવાદ કરવામાં અમારી મદદ કરો.", "translation-banner-body-update": "આ પેજનું નવું સંસ્કરણ છે પરંતુ તે હમણાં અંગ્રેજીમાં જ છે. નવીનતમ સંસ્કરણનો અનુવાદ કરવામાં અમારી મદદ કરો.", @@ -135,22 +296,22 @@ "translation-banner-no-bugs-title": "અહીં કોઈ ભૂલો નથી!", "translation-banner-no-bugs-content": "આ પેજનું ભાષાંતર કરવામાં આવી રહ્યું નથી. અમે ઇરાદાપૂર્વક આ પેજ અંગ્રેજીમાં હમણાં માટે છોડી દીધું છે.", "translation-banner-no-bugs-dont-show-again": "ફરીથી બતાવશો નહીં", + "translation-program": "અનુવાદ કાર્યક્રમ", "try-using-search": "તમે જે શોધી રહ્યાં છો તે શોધવા માટે શોધનો ઉપયોગ કરવાનો પ્રયાસ કરો અથવા", "tutorials": "ટ્યુટોરિયલ્સ", + "up": "ઉપર", + "use": "ઉપયોગ", "use-ethereum": "ઈથિરિયમનો ઉપયોગ કરો", "use-ethereum-menu": "ઈથિરિયમ મેનુનો ઉપયોગ કરો", - "wallets": "વૉલેટ", + "use-menu": "ઉપયોગ મેનૂ", + "verkle-trees": "વર્કલ ટ્રીસ", + "wallets": "પાકીટ", "we-couldnt-find-that-page": "અમે તે પેજ શોધી શક્યાં નથી", "web3": "વેબ3 શું છે?", - "website-last-updated": "Website નું છેલ્લું અપડેટ", + "website-last-updated": "વેબસાઇટનું છેલ્લું અપડેટ", "what-is-ether": "ઈથર (ETH) શું છે?", - "what-is-ethereum": "ઈથિરિયમ શું છે?", - "defi-page": "DeFi - વિકેન્દ્રિત ફાઇનાન્સ", - "dao-page": "DAOs - વિકેન્દ્રિત સ્વાયત્ત સંસ્થાઓ", - "nft-page": "NFTs - નોન-ફંગીબલ ટોકન્સ", - "decentralized-social-networks": "વિકેન્દ્રિત સામાજિક નેટવર્ક્સ", - "decentralized-identity": "વિકેન્દ્રિત ઓળખ", + "what-is-ethereum": "શું છે ઇથિરિયમ?", + "withdrawals": "સ્ટેકીંગ ઉપાડ", "yes": "હા", - "zero-knowledge-proofs": "શૂન્ય-જાણકારી પુરાવાઓ", - "page-index-meta-title": "હોમ" + "zero-knowledge-proofs": "શૂન્ય-જાણકારી પુરાવાઓ" } diff --git a/src/intl/hy-am/common.json b/src/intl/hy-am/common.json index 015bd1ac17b..03496571ef2 100644 --- a/src/intl/hy-am/common.json +++ b/src/intl/hy-am/common.json @@ -1,17 +1,28 @@ { - "account-abstraction": "Հաշվի աբստրակցիա", "about-ethereum-org": "ethereum.org-ի մասին", "about-us": "Մեր մասին", + "adding-desci-projects": "Desci նախագծերի ավելացում", + "adding-developer-tools": "Developer-ի գործիքների ավելացում", + "adding-exchanges": "Փոխանակումների ավելացում", + "adding-glossary-terms": "Բառարանի տերմինների ավելացում", + "adding-staking-products": "Staking պրոդուկտների ավելացում", + "adding-wallets": "Դրամապանակների ավելացում", + "account-abstraction": "Հաշվի աբստրակցիա", + "acknowledgements": "Երախտագիտություն", "aria-toggle-search-button": "Միացնել որոնման կոճակը", "aria-toggle-menu-button": "Միացնել որոնման կոճակը", "beacon-chain": "Beacon Chain\n", "bridges": "Բլոկչեյն կամուրջներ", + "build": "Կառուցում", + "build-menu": "Կառուցման ընտրացանկ", "clear": "Պարզ", "close": "Փակ", "community": "Համայնք", "community-hub": "Համայնքային հաբ", "community-menu": "Համայնքի ընտրացանկ", "contact": "Կոնտակտ", + "content-buckets": "Բովանդակության խմբեր", + "content-resources": "Բովանդակության ռեսուրսներ", "content-standardization": "Բովանդակության ստանդարտացում", "contributing": "Աջակցել", "contributors": "Աջակցողներ", @@ -27,7 +38,10 @@ "decentralized-identity": "Ապակենտրոնացված ինքնություն", "decentralized-social-networks": "Ապակենտրոնացված սոցիալական ցանցեր", "decentralized-science": "DeSci - Ապակենտրոնացված գիտություն", + "description": "Նավիգացիոն տարրի Նկարագրություն", "defi-page": "DeFi - Ապակենտրոնացված ֆինանսներ", + "design": "Դիզայն", + "design-principles": "Դիզայնի սկզբունքներ", "devcon": "Devcon", "developers": "Ծրագրավորողներ", "developers-home": "Ծրագրավորողների գլխավոր էջ", @@ -51,7 +65,6 @@ "documentation": "Փաստաթղթեր", "down": "Ներքև", "ecosystem": "Էկոհամակարգ", - "edit-page": "Edit page", "ef-blog": "Ethereum հիմնադրամի բլոգ", "eips": "Ethereum բարելավման առաջարկներ", "energy-consumption": "Ethereum էներգիայի սպառումը", @@ -59,11 +72,9 @@ "enterprise-menu": "Ձեռնարկությունների մենյու", "esp": "Էկոհամակարգերի աջակցության ծրագիր", "eth-current-price": "Ընթացիկ ETH գինը (ԱՄՆ դոլար)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Էթերիում bug bounty ծրագիր", "consensus-when-shipping": "Ե՞րբ է առաքվում:", "ethereum-upgrades": "Էթերիումի բարելավումներ", - "ethereum-brand-assets": "Ethereum brand assets", "ethereum-online": "Առցանց համայնքներ", "ethereum-events": "Էթերիումի իրադարձություններ", "ethereum-foundation": "Էթերիում հիմնադրամ", @@ -83,7 +94,7 @@ "feedback-card-prompt-tutorial": "Օգտակա՞ր էր այս ձեռնարկը:", "feedback-widget-thank-you-title": "Շնորհակալություն արձագանքի համար:", "feedback-widget-thank-you-subtitle": "Դարձրեք այս էջն էլ ավելի լավը՝ պատասխանելով մի քանի հարցերի:", - "feedback-widget-thank-you-subtitle-ext": "Եթե օգնության կարիք ունեք, կարող եք դիմել համայնքին մեր Discord-ով:", + "feedback-widget-thank-you-subtitle-ext": "Եթե օգնության կարիք ունեք, կարող եք կապ հաստատել համայնքի հետ մեր Discord-ով։", "feedback-widget-thank-you-timing": "2–3 րոպե", "feedback-widget-thank-you-cta": "Բացեք կարճ հարցում", "find-wallet": "Գտնել դրամապանակ", @@ -94,11 +105,10 @@ "grants": "Դրամաշնորհներ", "grant-programs": "Էկոհամակարգի դրամաշնորհային ծրագրեր", "guides": "Էքսկուրսավարներ", - "guides-hub": "Էքսկուրսավարների հանգույց", + "guides-hub": "«Ինչպես» ուղեցույցներ", "history-of-ethereum": "Էթերիումի պատմություն", "home": "Գլխավոր", "how-ethereum-works": "Ինչպես է աշխատում Էթերիումը", - "how-to-register-an-ethereum-account": "Ինչպես «գրանցել» Էթերիում հաշիվ", "how-to-revoke-token-access": "Ինչպես չեղարկել խելացի պայմանագրի հասանելիությունը ձեր կրիպտո ֆոնդերին", "how-to-swap-tokens": "Ինչպես փոխանակել նշանները", "how-to-use-a-bridge": "Ինչպես կամրջել նշանները 2-րդ շերտին", @@ -115,7 +125,6 @@ "last-edit": "Վերջին խմբագրումը", "layer-2": "Շերտ 2", "learn": "Սովորեք", - "learn-by-coding": "Learn by coding", "learn-hub": "Սովորել Հաբ", "learn-menu": "Սովորել մենյու", "learn-more": "Իմացեք ավելին", @@ -128,10 +137,102 @@ "loading-error-try-again-later": "Չհաջողվեց բեռնել տվյալները: Փորձեք ավելի ուշ:", "logo": "լոգոն", "mainnet-ethereum": "Mainnet Էթերիում", + "merge": "Միացնել", "more": "Ավելի շատ", - "nav-developers": "Ծրագրավորողներ", + "nav-about-description": "Հանրային, բաց կոդով նախագիծ՝ Ethereum համայնքի համար", + "nav-advanced-description": "Սովորեք ավելի բարդ թեմաները", + "nav-advanced-label": "Ընդլայնված", + "nav-basics-description": "Հասկացեք Ethereum-ի հիմունքները", + "nav-basics-label": "Հիմունքներ", + "nav-bridges-description": "Web3-ը վերածվել է առաջնային L1 բլոկչեյնների և L2 մասշտաբային լուծումների էկոհամակարգի", + "nav-builders-home-description": "Ethereum-ի կառուցման ուղեցույց՝ մշակողներից, մշակողների համար", + "nav-builders-home-label": "Գլխավոր կառուցում", + "nav-contribute-description": "Եթե ցանկանում եք օգնել, սա ձեզ կառաջնորդի", + "nav-contribute-label": "Աջակցում ethereum.org-ին", + "nav-dao-description": "Անդամներին պատկանող համայնքներ՝ առանց կենտրոնացված լիազորությունների", + "nav-dapps-description": "Բացահայտեք Ethereum-ի միջոցով հավելվածների հարուստ էկոհամակարգը", + "nav-defi-description": "Համաշխարհային, բաց այլընտրանք ավանդական ֆինանսական շուկայի համար", + "nav-desci-description": "Գոյություն ունեցող գիտական համակարգի գլոբալ, բաց այլընտրանք", + "nav-desoc-description": "Բլոկչեյնի վրա հիմնված սոցիալական ներգրավվածության և բովանդակության ստեղծման հարթակներ", "nav-developers-docs": "Մշակողների փաստաթղթեր", + "nav-developers": "Ծրագրավորողներ", + "nav-did-description": "Թողարկեք և տիրապետեք ձեր եզակի ապակենտրոնացված նույնացուցիչներին", + "nav-docs-description": "Փաստաթղթեր, որոնք կօգնեն ձեզ հասկանալ և կառուցել Ethereum-ի հետ աշխատանքը", + "nav-docs-design-description": "Web3 դիզայնի եզակի մարտահրավերների, լավագույն փորձի և օգտատերերի հետազոտության պատկերացումների նկարագրությունը", + "nav-docs-design-label": "UX/UI դիզայնի հիմունքներ", + "nav-docs-foundation-description": "Ethereum-ի զարգացման հիմնական սկզբունքները", + "nav-docs-overview-description": "Ձեր «Գլխավոր»-ը մշակողի փաստաթղթերի համար", + "nav-docs-stack-description": "Հասկացեք Ethereum Stack-ի բոլոր մանրամասները", + "nav-eip-description": "Ստանդարտներ, որոնք սահմանում են նոր գործառույթներ կամ գործընթացներ", + "nav-eip-label": "Ethereum-ի բարելավման առաջարկներ (EIPs)", + "nav-emerging-description": "Ծանոթացեք Ethereum-ի այլ նոր օգտագործման դեպքերին", + "nav-enterprise-description": "Բիզնես հավելվածներ Ethereum-ի համար", + "nav-ethereum-org-description": "Այս կայքը հիմնված է համայնքի վրա, միացե՛ք մեզ և նույնպես նպաստե՛ք", + "nav-ethereum-wallets-description": "Հավելված՝ ձեր Ethereum հաշվի հետ փոխազդելու համար", + "nav-events-description": "Ապակենտրոնացում և մասնակցության ազատություն ցանկացածի համար", + "nav-events-irl-description": "Ամեն ամիս տեղի են ունենում Ethereum-ի խոշոր միջոցառումներ անմիջական մասնակցությամբ և առցանց", + "nav-events-label": "Համայնքներ և միջոցառումներ", + "nav-events-online-description": "Այս առցանց համայնքներում ապրում են հարյուր հազարավոր Ethereum էնտուզիաստներ", + "nav-find-wallet-description": "Դրամապանակները թույլ են տալիս օգտագործել կրիպտոարժույթ", + "nav-find-wallet-label": "Ընտրեք ձեր դրամապանակը", + "nav-gas-fees-description": "Ինչպե՞ս են հաշվարկվում ETH գործարքների պահումները", + "nav-get-eth-description": "Ethereum հավելվածներն օգտագործելու համար անհրաժեշտ է ether (ETH)", + "nav-get-started-description": "Ethereum-ի օգտագործման ձեր առաջին քայլերը", + "nav-governance-description": "Ethereum արձանագրության թարմացման հետ կապված գործընթաց", + "nav-grants-description": "Մեր համայնքի կողմից պատրաստված դրամաշնորհային ֆինանսավորման ծրագրեր տրամադրող ծրագրերի ցանկ", + "nav-guide-create-account-description": "Յուրաքանչյուրը կարող է ցանկացած պահի ստեղծել Ethereum հաշիվ՝ անվճար դրամապանակի հավելվածի միջոցով", + "nav-guide-revoke-access-description": "Ապահով մնացեք Ethereum էկոհամակարգում խելացի պայմանագրերի և ծրագրերի հետ գործակցելիս", + "nav-guide-revoke-access-label": "Ինչպես չեղարկել խելացի պայմանագրի մուտքը", + "nav-guide-use-wallet-description": "Իմացեք, թե ինչպես կառավարել դրամապանակի բոլոր հիմնական գործառույթները", + "nav-guide-use-wallet-label": "Ինչպես օգտվել դրամապանակից", + "nav-guides-description": "Գործնական քայլ առ քայլ ուղեցույցներ, որոնք կօգնեն Ձեզ սկսել", + "nav-guides-label": "«Ինչպես» ուղեցույցներ", + "nav-history-description": "Բոլոր հիմնական ֆորկերի և թարմացումների ժամանակացույց", + "nav-history-label": "Ethereum-ի տեխնիկական պատմությունը", + "nav-layer-2-description": "Ավելի էժան և արագ գործարքներ Ethereum-ի համար", + "nav-learn-by-coding-description": "Գործիքներ, որոնք կօգնեն ձեզ փորձարկել Ethereum-ը", + "nav-local-env-description": "Ընտրեք և կազմաձևեք ձեր Ethereum Development Stack-ը", + "nav-mainnet-description": "Ձեռնարկությունների բլոկչեյն ծրագրերը կարող են ստեղծվել հանրային հիմնական Ethereum Mainnet-ում:", + "nav-nft-description": "Ethereum-ի վրա հիմնված ակտիվի տեսքով եզակի բան ներկայացնելու միջոց", + "nav-open-research-description": "Ethereum-ի առաջնային ուժեղ կողմերից մեկը նրա ակտիվ հետազոտական համայնքն է", + "nav-open-research-label": "Բաց հետազոտություն", + "nav-overview-description": "Ethereum-ում կրթության հետ կապված ամեն ինչ", + "nav-participate-overview-description": "Ակնարկ, թե ինչպես մասնակցել", "nav-primary": "Առաջնային", + "nav-quizzes-description": "Պարզեք, թե որքան լավ եք տիրապետում Ethereum-ին և կրիպտոարժույթներին", + "nav-quizzes-label": "Ստուգեք Ձեր գիտելիքները", + "nav-refi-description": "Այլընտրանքային տնտեսական համակարգ՝ հիմնված վերականգնողական սկզբունքների վրա", + "nav-research-description": "Ethereum-ի բարելավման համար օգտագործվող գործընթացները", + "nav-research-label": "Հետազոտություն և զարգացում", + "nav-roadmap-description": "Ethereum-ի ավելի մեծ մասշտաբայնության, անվտանգության և կայունության ուղին", + "nav-roadmap-future-description": "Ethereum-ի ամրապնդումը՝ որպես հուսալի և ապակենտրոնացված ցանց", + "nav-roadmap-future-label": "Ապագայի պաշտպանություն", + "nav-roadmap-label": "Ճանապարհային քարտեզ", + "nav-roadmap-scaling-description": "Ցանցի թարմացումներ՝ գործարքների ծախսերն ու արագությունը հետագայում նվազեցնելու համար", + "nav-roadmap-security-description": "Համոզվելով, որ Ethereum-ը մնում է կայուն բոլոր տեսակի հարձակումներին ապագայում", + "nav-roadmap-security-label": "Բարելավված անվտանգություն", + "nav-roadmap-ux-description": "Ethereum-ի օգտագործումը պետք է հեշտացվի", + "nav-run-a-node-description": "Դարձեք լիովին ինքնիշխան՝ օգնելով պաշտպանել ցանցը", + "nav-security-description": "Իմացեք կրիպտոարժույթի օգտագործման լավագույն փորձը", + "nav-smart-contracts-description": "Ethereum էկոհամակարգի հիմնարար հիմքերը", + "nav-stablecoins-description": "Stablecoin-ները Ethereum նշաններ են, որոնք նախատեսված են ֆիքսված արժեքի վրա մնալու համար", + "nav-stake-description": "Ստացեք պարգևներ՝ Ethereum-ի պաշտպանությունը ապահովելու համար", + "nav-stake-label": "Խաղադրույք", + "nav-staking-home-description": "Խաղադրույքի տարբեր տարբերակների ակնարկ", + "nav-staking-pool-description": "Խաղադրույք կատարեք և ստացեք պարգևներ ցանկացած քանակությամբ ETH-ի հետ՝ միանալով ուրիշներին", + "nav-staking-pool-label": "Միավորված խաղադրույք", + "nav-staking-saas-label": "Խաղադրույք՝ ծառայության միջոցով", + "nav-staking-solo-label": "Միայնակ խաղադրույք", + "nav-start-building-description": "Օգտակար տեղեկություններ սկսնակների համար", + "nav-translation-program-description": "Թարգմանչական համագործակցություն ethereum.org-ի հետ բոլոր լեզուներով", + "nav-tutorials-description": "Համայնքի ուղեցույցների համադրված ցուցակ", + "nav-use-cases-description": "Բացահայտեք Ethereum-ի օգտագործման տարբեր գաղափարները", + "nav-what-is-ether-description": "Ethereum հավելվածների արժույթը", + "nav-what-is-ethereum-description": "Հասկացեք, թե ինչն է առանձնահատուկ դարձնում Ethereum-ը", + "nav-what-is-web3-label": "Ինչ է Web3-ը:", + "nav-what-is-web3-description": "Կանոններ թելադրող կենտրոնացված մենաշնորհների այլընտրանք", + "nav-whitepaper-description": "Ethereum-ի բնօրինակ տեխնիկական փաստաթուղթը, որը գրվել է Վիտալիկ Բուտերինի կողմից 2014 թվականին", + "nav-zkp-description": "Հայտարարության վավերականությունն ապացուցելու միջոց՝ առանց բուն հայտարարությունը բացահայտելու", "nft-page": "NFT - Չփոխարինելի նշաններ", "nfts": "NFT-ներ", "no": "Ոչ", @@ -140,6 +241,7 @@ "page-developers-aria-label": "Մշակողների մենյու", "page-index-meta-title": "Գլխավոր", "page-last-updated": "Էջը վերջին անգամ թարմացվել է", + "participate-menu": "Մասնակցության ընտրացանկ", "pbs": "Առաջարկող-շինարար տարանջատում", "pools": "Միավորված խաղադրույք", "privacy-policy": "Գաղտնիության քաղաքականություն", @@ -150,13 +252,12 @@ "refresh": "Խնդրում ենք թարմացնել էջը։", "return-home": "Վերադառնալ տուն", "roadmap": "Ethereum ճանապարհային քարտեզ", + "research": "Հետազոտություն", + "research-menu": "Հետազոտության ցանկ", "resources": "Թարգմանչական ռեսուրսներ", "regenerative-finance": "ՌեՖի - Ռեգեներատիվ ֆինանսներ", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "Մշակողի փաստաթղթեր", "rollup-component-technology-and-risk-summary": "Տեխնոլոգիաների և ռիսկերի ամփոփում", - "scaling": "Scaling", "saas": "Խաղադրույքը որպես ծառայություն", "search": "Որոնում", "search-ethereum-org": "Որոնեք ethereum.org", @@ -167,19 +268,14 @@ "single-slot-finality": "Մեկ բնիկ վերջնականություն", "statelessness": "Քաղաքացիություն չունեցողություն", "see-contributors": "Տես մասնակիցները", - "set-up-local-env": "Set up local environment", - "sharding": "Sharding", "show-all": "Ցույց տալ ամբողջը", "show-less": "Ցույց տալ ավելի քիչ", "site-description": "Ethereum՝ գլոբալ, ապակենտրոնացված հարթակ փողերի կիրառման և նոր տեսակի հավելվածներ ստեղծելու համար։ Ethereum-ի շնորհիվ դուք կարողեք գրել կոդ, որը կարող է կառավարել գումարներ, և ստեղծել հավելվածներ հասանելի ամբողջ աշխարհում։", - "site-title": "ethereum.org", "skip-to-main-content": "Անցեք հիմնական բովանդակությանը", - "smart-contracts": "Smart contracts", "stablecoins": "Ստեյբլքոիներ", "stake-eth": "Էթեր (ETH) ավանդ դրեք", "staking": "Ցուցադրում", "start-here": "Սկսիր այստեղ", - "style-guide": "Style guide", "solo": "Միայնակ խաղադրույք", "terms-of-use": "Օգտվելու կանոններ", "translation-banner-body-new": "Դուք դիտում եք այս էջը անգլերեն, քանի որ մենք դեռ չենք թարգմանել այն: Օգնեք մեզ թարգմանել այս բովանդակությունը:", @@ -191,20 +287,21 @@ "translation-banner-no-bugs-title": "Այստեղ սխալներ չկան:", "translation-banner-no-bugs-content": "Այս էջը չի թարգմանվում: Մենք միտումնավոր թողել ենք այս էջը անգլերենով:", "translation-banner-no-bugs-dont-show-again": "Այլևս ցույց մի տուր", + "translation-program": "Թարգմանչական ծրագիր", "try-using-search": "Փորձեք օգտագործել որոնումը` գտնելու այն, ինչ փնտրում եք կամ", "tutorials": "Ձեռնարկներ", "up": "Վերև", + "use": "Օգտագործում", "use-ethereum": "Օգտագործեք Էթերիում", "use-ethereum-menu": "Օգտագործեք Ethereum ընտրացանկը", - "user-experience": "User experience", + "use-menu": "Օգտագործման ցանկ", "verkle-trees": "Վերկլի ծառեր", "wallets": "Դրամապանակներ", "we-couldnt-find-that-page": "Մենք չկարողացանք գտնել այդ էջը", "web3": "Ինչ է Web3-ը:", - "web3-title": "Web3", "website-last-updated": "Կայքը վերջին անգամ թարմացվել է", "what-is-ether": "Ի՞նչ է Էթերը (ETH):", - "what-is-ethereum": "Ի՞նչ է Ethereum-ը", + "what-is-ethereum": "Ի՞նչ է Էթերիումը", "withdrawals": "Գումարի դուրսբերումներ", "yes": "Այո՛", "zero-knowledge-proofs": "Զրոյական գիտելիքի ապացույցներ" diff --git a/src/intl/ig/common.json b/src/intl/ig/common.json index 255fc52aa97..6022875d3d1 100644 --- a/src/intl/ig/common.json +++ b/src/intl/ig/common.json @@ -1,22 +1,34 @@ { - "account-abstraction": "Abstraction akaụntụ", "about-ethereum-org": "Banyere ethereum.org", "about-us": "Maka anyị", + "adding-desci-projects": "Ntinye-arumaru nke desci", + "adding-developer-tools": "Na-agbakwunye Ngwaọrụ Onye mmepụta", + "adding-exchanges": "Itinye Mgbanwe ego", + "adding-glossary-terms": "Ntinye atumatu okowa-okwu", + "adding-staking-products": "Itinye ngwa-ahia ntinye ego", + "adding-wallets": "Itinye Akpa ego intaneti", + "account-abstraction": "Abstraction akaụntụ", + "acknowledgements": "Nkwenye", "aria-toggle-search-button": "Gbanwee bọtịnụ ọchụchọ", "aria-toggle-menu-button": "Gbanwee bọtịnụ ndeputa", "beacon-chain": "Beacon Chain", "bridges": "Njikọ blockchain", + "bug-bounty": "Nchọpụta njehie", + "build": "Mepúta", + "build-menu": "Mepụta menu", "clear": "Hichapụ", "close": "Mechie", - "community": "Ndi otu nwere otu mmasi", + "community": "Obodo", "community-hub": "Obodo nzukọ", "community-menu": "Ndetu obodo", "contact": "Ihe mkpoturu", + "content-buckets": "Ihe ntughe: Bọket Ọdịnaya", + "content-resources": "Ego Ọdịnaya", "content-standardization": "Nhazi ọdịnaya", "contributing": "Itu utu", "contributors": "Ndị ntinye aka", "contributors-thanks": "Onye ọ bụla nyere aka na peeji a - daalụ!", - "cookie-policy": "Nkwuputa nke Cookie na aru oru", + "cookie-policy": "Amụma kuki", "copied": "Akọpịala", "copy": "Kọpịa", "danksharding": "Danksharding", @@ -27,7 +39,10 @@ "decentralized-identity": "Njirimara ọtụtụ ndị na achị", "decentralized-social-networks": "Netwọk mmekọrịta ọtụtụ ndị na achi", "decentralized-science": "DeSci - Sayensị ọtụtụ ndị na achị", + "description": "Nkọwa nke ihe nav", "defi-page": "DeFi - Ego n'enweghi nchikwa", + "design": "Mmepụta", + "design-principles": "Usoro mmepụta ihe", "devcon": "Devcon", "developers": "Ndị mmeputa", "developers-home": "Isi ulo oru ndi Mmeputa", @@ -63,7 +78,6 @@ "ethereum-bug-bounty": "Mmemme mmachi nsogbu nwere ike ịmalite na Ethereum", "consensus-when-shipping": "Kedu mgbe ọ na-ebupu?", "ethereum-upgrades": "Nkwalite Ethereum", - "ethereum-brand-assets": "Ihe Njirimara Ethereum", "ethereum-online": "Obodo dị n'ịntanetị", "ethereum-events": "Ihe omume Ethereum", "ethereum-foundation": "Ebe mbido nke Ethereum", @@ -75,7 +89,7 @@ "ethereum-protocol": "Usoro nhazi Ethereum", "ethereum-security": "Nchekwa Ethereum na mgbochi ọhị", "ethereum-support": "Nkwado Ethereum", - "ethereum-wallets": "Akpaego Ethereum", + "ethereum-wallets": "Akpa ego Ethereum", "ethereum-whitepaper": "Akwukwo akuko", "feedback-widget-prompt": "Ibe a ọ na enye aka?", "feedback-card-prompt-page": "Ibe a ọ nyere aka?", @@ -83,22 +97,22 @@ "feedback-card-prompt-tutorial": "Nkuzi a ọ nyere aka?", "feedback-widget-thank-you-title": "Daalụ maka nzaghachi gị!", "feedback-widget-thank-you-subtitle": "Make this page even better by answering a few questions.", - "feedback-widget-thank-you-subtitle-ext": "Ọ bụrụ na ịchọrọ enyemaka, ị nwere ike ịgakwuru ndị obodo na Discord anyị.", + "feedback-widget-thank-you-subtitle-ext": "Ọ bụrụ na ịchọrọ enyemaka, ị nwere ike ịkpọtụrụ ndị obodo anyị na Discord.", "feedback-widget-thank-you-timing": "Nkeji 2–3 ", "feedback-widget-thank-you-cta": "Mepee nyocha dị mkpirikpi", - "find-wallet": "Chọta obere akpa ego", + "find-wallet": "Chọta akpa ego ịntanetị", "future-proofing": "Ihe akaebe ga eme n'ọdịnihu", "get-eth": "Nweta ETH", "get-involved": "Tinye aka", - "get-started": "Bido oru", + "get-started": "Bido", "grants": "Enyemaka", "grant-programs": "Mmemme Nkwado Usoro gburugburu", "guides": "Nduzi", - "guides-hub": "Nduzi njikọ", + "guides-hub": "Otu esi eduzi", "history-of-ethereum": "Akụkọ ihe mere eme nke Ethereum", "home": "Ụnọ", "how-ethereum-works": "Otu Ethereum si arụ ọrụ", - "how-to-register-an-ethereum-account": "Otu esi 'debanye aha' akwụkwọ akaụntụ Ethereum", + "how-to-create-an-ethereum-account": "Etu e si 'emepe' akaụntụ Ethereum", "how-to-revoke-token-access": "Otu esi akagbu ohere nweta smart contract na ego crypto gi", "how-to-swap-tokens": "Uzo esi agbanwe tokens", "how-to-use-a-bridge": "Uzo esi ejikọta tokens na layer 2", @@ -115,7 +129,7 @@ "last-edit": "Ndezi ikpeazụ", "layer-2": "Layer 2", "learn": "Mụta", - "learn-by-coding": "Muta ihe site na eji koodu", + "learn-by-coding": "Muta ihe site na iji ndokwa", "learn-hub": "Ebe mmụta", "learn-menu": "Mutakwuo", "learn-more": "Mutakwuo", @@ -127,11 +141,106 @@ "loading-error-refresh": "Njehie, biko megharia.", "loading-error-try-again-later": "Enwenwughi ike ibudata data. Nwaa oge ọzọ.", "logo": "akara", - "mainnet-ethereum": "Ethereum Bloockchainu na enyefe ego", + "mainnet-ethereum": "Isi netwọk Ethereum", + "merge": "Jikota", "more": "Ọzọ", - "nav-developers": "Ndị mmeputa", + "nav-about-description": "Ihe ọha, nke mmadu niile nwere ike inwete maka otu igwe mmadụ nwere mmasị na Ethereum", + "nav-advanced-description": "Mụta isiokwu ndị siri ike karị", + "nav-advanced-label": "Emelitere", + "nav-basics-description": "Ghọta ihe ndị bụ isi na Ethereum", + "nav-basics-label": "Ihe ndị di mkpa", + "nav-bridges-description": "Web3 agbanwela banye na akụkụ nile mejụpụtara isi L1 blockchains na usoro mmúba nke L2", + "nav-builders-home-description": "Akwụkwọ ntuziaka onye nkwadoeziokwu nke Ethereum—site n'aka ndị nkwadoeziokwu, maka ndị nkwadoeziokwu", + "nav-builders-home-label": "Weebusaiti mmepe peeji nke onye nkwadoeziokwu", + "nav-contribute-description": "Ọ bụrụ na ị chọrọ inye aka, nke a ga-eduzi gị", + "nav-contribute-label": "Na-enye aka na ethereum.org", + "nav-dao-description": "Obodo onye otu nwere na-enweghị ikike etiti", + "nav-dapps-description": "Nyochaa usoro okike bara ụba nke ngwa site na iji Ethereum", + "nav-defi-description": "Nhọrọ uzọ izụ ahịa ego nkịtị ọzọ nke zuru ụwa ọnụ", + "nav-desci-description": "Nhọrọ uzọ ọzọ nke usoro sayensị dị ugbu a nke zuru ụwa ọnụ", + "nav-desoc-description": "Nyiwe dabeere na blockchain maka mmekọrịta mmadụ na ibe ya na imepụta ọdịnaya", "nav-developers-docs": "Akwụkwọ ndị na-emepụta", + "nav-developers": "Ndị mmeputa", + "nav-did-description": "Nye ma nwekwa ihe njirimara gị nke di ebe obula", + "nav-docs-description": "Akwụkwọ iji nyere gị aka ịghọta ma wuo ya na Ethereum", + "nav-docs-design-description": "Nkọwa nke ịma aka imewe web3 pụrụ iche, omume kacha mma na nghọta nyocha onye ọrụ", + "nav-docs-design-label": "Ihe imewe UX/UI bu isi", + "nav-docs-foundation-description": "Isi ihe ndị dị mkpa iji tolite na Ethereum", + "nav-docs-overview-description": "Ụlọ weebusaiti mmepe peeji maka onye mmepụta", + "nav-docs-stack-description": "Ghọta nkọwa niile nke Ethereum stack", + "nav-eip-description": "Ụkpụrụ na-akọwapụta njiarú ma ọ bụ usoro ọhụrụ", + "nav-eip-label": "Atumatu Imeziwanye Ethereum (EIPs)", + "nav-emerging-description": "Mata mmekọrịta ọhụrụ ndị ọzọ mere na Ethereum", + "nav-emerging-label": "Okwu ojiji na-apụta", + "nav-enterprise-description": "Ngwa azụmahịa maka Ethereum", + "nav-ethereum-org-description": "Ebe nrụọrụ weebụ a bụ nke ndị otu nwere mmasị kwadoro—sonyere anyị ma tinye aka", + "nav-ethereum-wallets-description": "Aapụ yana na akaụntụ Ethereum gị ga emekọrịta", + "nav-events-description": "Ebe njikọ na ikike isonye maka onye ọ bụla", + "nav-events-irl-description": "Kwa ọnwa ọbụla, a na-enwe nnukwu ihe omume nke Ethereum ana-eme n'ihu n'ihu nakwa n'ịntanetị", + "nav-events-label": "Otu igwe mmadụ nwere mmasị na 'ihe omume gasị", + "nav-events-online-description": "Ọtụtụ narị puku ndi nna ihe gbasara Ethereum na-anụ ọkụ n'obi na otu igwe ndị a nwere mmasị n'ịntanetị", + "nav-find-wallet-description": "Akpaego na-enye gị ohere ka e jiri crypto", + "nav-find-wallet-label": "Họrọ akpaego gị", + "nav-gas-fees-description": "Kedu ka e si agbakọ ụgwọ nzipụ ego ETH", + "nav-get-eth-description": "Ọ dị mkpa na ị ga-enwe ether (ETH) iji jiri ngwa Ethereum", + "nav-get-started-description": "Nzọụkwụ nke mbụ gị iji jiri Ethereum", + "nav-governance-description": "Usoro a na-etinye aka na nkwalite usoro Ethereum", + "nav-governance-label": "Ọchịchị", + "nav-grants-description": "Ndepụta nke ndị otu igwe anyị nakọtara na arụmọrụ na ihe omume na-enye nkwado ego", + "nav-guide-create-account-description": "Onye ọ bụla nwere ike ịmepụta akaụntụ Ethereum n'oge ọ bụla, n'efu na ngwa akpa ego intaneti", + "nav-guide-create-account-label": "Otu e si emepe akaụntụ Ethereum", + "nav-guide-revoke-access-description": "Nọgide na nchekwa mgbe ị na-emekọrịta na nkwekọrịta smart na gburugburu ebe obibi Ethereum", + "nav-guide-revoke-access-label": "Otu e si akagbu ohere nweta ihe nhazi na-eme n'akpaaka", + "nav-guide-use-wallet-description": "Mụta ka e si eji ihe njiarú niile dị mkpa na akpaego", + "nav-guide-use-wallet-label": "Otu esi eji obere akpa intanet", + "nav-guides-description": "Ntụziaka nzọụkwụ ga-enyere gị aka ibido", + "nav-guides-label": "Otu e si eduzi", + "nav-history-description": "Usoro ihe omume nke isidi iche iche na mmelite niile", + "nav-history-label": "Akụkọ ihe mere eme nke teknụzụ Ethereum", + "nav-layer-2-description": "Nzipụ ego dị ọnụ ala nakwa nke na-aga ngwa ngwa maka Ethereum", + "nav-learn-by-coding-description": "Ngwaọrụ ndị na-enyere gị aka ịnwale Ethereum", + "nav-local-env-description": "Họrọ ma hazie nzulite Ethereum stack gị", + "nav-mainnet-description": "Enwere ike iwulite ngwa azụmahịa blockchain na Ethereum Mainnet nke ọha", + "nav-nft-description": "Ụzọ e ji egosipụta ihe ọbụla pụrụ iche dị ka akụ nke Ethereum", + "nav-open-research-description": "Otu n'ime isi ike nke Ethereum di mkpa bụ obodo nyocha ya na-arụ ọrụ", + "nav-open-research-label": "Nchọpụta mepere emepe", + "nav-overview-description": "Ihe niile gbasara agụmakwụkwọ Ethereum", + "nav-participate-overview-description": "Nchịkọta zuru ezu banyere otu esi esonye", "nav-primary": "Isi mbido", + "nav-quizzes-description": "Chọpụta etu i siri mara Ethereum na cryptocurrencies", + "nav-quizzes-label": "Nwalee ihe ọmụma gị", + "nav-refi-description": "Usoro akụ̀ na ụba ọzọ e wuru n'elu ụkpụrụ ndị na-eweghachi ihe", + "nav-research-description": "Usoro eji emeziwanye Ethereum", + "nav-research-label": "Nnyocha na mmepe", + "nav-roadmap-description": "Ụzọ maka mgbanwe, nchekwa na nkwado maka Ethereum", + "nav-roadmap-future-description": "Na-eme ka Ethereum dị ka netwọk siri ike na nke adighi otu ebe", + "nav-roadmap-future-label": "Ihe akaebe ga eme n'ọdịnihu", + "nav-roadmap-label": "Atụmatụ", + "nav-roadmap-scaling-description": "Mmelite netwọk iji belata ọnụ ahịa azụmahịa yana ọsọ ọsọ", + "nav-roadmap-security-description": "Ijide n'aka na Ethereum ga-anọgide na-eguzogide ụdị mwakpo niile n'ọdịnihu", + "nav-roadmap-security-label": "Nchekwa emelitere", + "nav-roadmap-ux-description": "Iji Ethereum kwesịrị ka ọ dị mfe", + "nav-run-a-node-description": "Bụrụ onye ọchịchị zuru oke ka ị na-enyere aka chekwa netwọkụ ahụ", + "nav-security-description": "Mụta omume kacha mma mgbe ị na-eji cryptocurrency", + "nav-smart-contracts-description": "Ihe ndị bụ isi ụlọ nke gburugburu ebe obibi Ethereum", + "nav-stablecoins-description": "Stablecoins bụ akara ngosi Ethereum emebere ka ọ nọrọ na ọnụ ahịa a kapịrị ọnụ", + "nav-stake-description": "Nweta ụgwọ ọrụ maka ịchekwa Ethereum", + "nav-stake-label": "Ego Etinyere", + "nav-staking-home-description": "Nchịkọta nke nhọrọ dị iche iche maka ntinye ego", + "nav-staking-pool-description": "Tinye ego ma nweta ụgwọ ọrụ site na iji onu ego ọ bụla nke ETH site na isonyere ndị ọzọ", + "nav-staking-pool-label": "Ntinye jikotara", + "nav-staking-saas-label": "Iji ọrụ tinye ego", + "nav-staking-solo-label": "Solo staking", + "nav-start-building-description": "Ozi bara uru maka ndị bịara ọhụrụ\n​", + "nav-translation-program-description": "Mgbalị imekọ ihe ọnụ iji tụgharịa asụsụ ethereum.org na asụsụ niile", + "nav-tutorials-description": "Ndepụta nke nkuzi obodo", + "nav-use-cases-description": "Chọpụta echiche dị iche iche maka iji Ethereum", + "nav-what-is-ether-description": "Ego nke ngwa Ethereum", + "nav-what-is-ethereum-description": "Ghọta ihe mere Ethereum ji bụrụ ihe pụrụ iche", + "nav-what-is-web3-label": "Gịnị bụ Web3?", + "nav-what-is-web3-description": "Nhọrọ ọzọ nye ndị azumahia etiti na-achịkwa iwu", + "nav-whitepaper-description": "Akwụkwọ ntuala Ethereum mbụ nke Vitalik Buterin dere na 2014", + "nav-zkp-description": "Ụzọ iji gosipụta izi ezi nke nkwupụta n'ekpugheghị nkwupụta ahụ n'onwe ya", "nft-page": "NFTs - Non-fungible tokin", "nfts": "NFTs", "no": "Mba", @@ -140,6 +249,7 @@ "page-developers-aria-label": "Ndepụta nhọrọ mmemme ndi Mmeputa", "page-index-meta-title": "Ụnọ", "page-last-updated": "Emelitere peeji ikpeazụ", + "participate-menu": "Menu nsonye", "pbs": "Ịkpa oke onye na-ewu ụlọ", "pools": "Ntinye jikotara", "privacy-policy": "Iwu ihe nzuzo", @@ -150,10 +260,10 @@ "refresh": "Biko megharịa peeji ahụ.", "return-home": "laghachi azu n'ụlọ", "roadmap": "Mapụ nke ụzọ Ethereum", + "research": "Nyochaa", + "research-menu": "Menu nnyocha", "resources": "Akụrụngwa ntụgharị asụsụ", "regenerative-finance": "ReFi - Ego n'enweghi nchikwa", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "Akwụkwọ onye nrụpụta", "rollup-component-technology-and-risk-summary": "Teknụzụ na nchịkọta ihe egwu", "scaling": "Nbawanye ikike", @@ -164,24 +274,22 @@ "search-box-blank-state-text": "Chọrọ gawa!", "search-eth-address": "Nke a dị ka adreesị Ethereum. Anyị anaghị enye data kpọmkwem maka adreesị. Gbalịa ịchọ ya na blọk ihe nchọgharị dị ka", "search-no-results": "Enweghị nsonaazụ maka ọchụchọ gị", + "security": "Nche", "single-slot-finality": "Otu ohere nkwụsị", "statelessness": "Na enweghị obodo", "see-contributors": "Lee ndị nkwado", "set-up-local-env": "Hazie gburugburu ebeulo", - "sharding": "Sharding", "show-all": "Gosi Ihe Niine", "show-less": "Gosi obere", "site-description": "Ethereum bu ụzọ zuru ụwa nile, nke akwadopụtàrà maka ego na ụdịrị ngwa kòmpụtà ọhụrụ. Na Ethereum, ị nwere ike ide koodù na-achịkwa ego, ma ruo ngwa kòmpụtà ndị enwere ike inweta ebe ọ bụla n’ ụwa.", - "site-title": "ethereum.org", "skip-to-main-content": "Mafee na isi ọdịnaya", "smart-contracts": "Nkwekọrịta azụmahịa na emere onwe ya", - "stablecoins": "Crptocurrency na anochite anya ego ndi ozo", + "stablecoins": "Stebụlkọịn", "stake-eth": "Kekọrịta ETH", "staking": "Ntinye ego", "start-here": "Bido ebe a", - "style-guide": "Style guide", "solo": "Solo staking", - "terms-of-use": "Iwu nkwekorita maka Ojiji", + "terms-of-use": "Usoro nke ojiji", "translation-banner-body-new": "I na elele peeji a na asusu Bekee maka na anyi atugharibeghi ya. Nyere anyi aka tugharia asusu odinaya a.", "translation-banner-body-update": "Enwere udi ohuru nke peeji a mana o no naani na asusu Bekee ugbu a. Nyere anyi aka tugharia nke kachasi ohuru.", "translation-banner-button-see-english": "Lee Bekee", @@ -191,20 +299,21 @@ "translation-banner-no-bugs-title": "Enweghị mperi ebe a!", "translation-banner-no-bugs-content": "A naghị atụgharị asụsụ ibe akwụkwọ a. Anyị kpachapụrụ anya hapụ ibe akwụkwọ a n'asụsụ Bekee ka ọ dị.", "translation-banner-no-bugs-dont-show-again": "Egosila ọzọ", + "translation-program": "Mmemme Ntụgharị Asụsụ", "try-using-search": "Gbaa mbọ iji nchọpụta chọpụta ihe ị na-achọ ma ọ bụ", - "tutorials": "Ihe omumu na aka onye nkuzi", - "up": "N'elu", + "tutorials": "Ihe omumu", + "up": "Elu", + "use": "Jiri", "use-ethereum": "Jiri Ethereum", "use-ethereum-menu": "Jiri ndeputa Ethereum", - "user-experience": "User experience", + "use-menu": "Jiri menu", "verkle-trees": "Verkle trees", "wallets": "Akpa ego", "we-couldnt-find-that-page": "Anyị enweghị ike ịhụ ibe ahụ", "web3": "Gịnị bụ Web3?", - "web3-title": "Web3", "website-last-updated": "Emelitere webụsaịtị ikpeazụ", - "what-is-ether": "Gịnị bu ether (ETH)?", - "what-is-ethereum": "Gịnị bu Ethereum?", + "what-is-ether": "Gini bu ether (ETH)?", + "what-is-ethereum": "Gini bu Ethereum?", "withdrawals": "Mwepụ ego etinyere", "yes": "Ee", "zero-knowledge-proofs": "Ihe akaebe ihe ọmụma efu" diff --git a/src/intl/lt/common.json b/src/intl/lt/common.json index a28009b5dee..8699739705d 100644 --- a/src/intl/lt/common.json +++ b/src/intl/lt/common.json @@ -1,28 +1,70 @@ { "about-ethereum-org": "Apie ethereum.org", "about-us": "Apie mus", + "adding-desci-projects": "„Desci“ projektų pridėjimas", + "adding-developer-tools": "Kūrėjo įrankių pridėjimas", + "adding-exchanges": "Keityklų pridėjimas", + "adding-glossary-terms": "Žodyno terminų pridėjimas", + "adding-staking-products": "Palaikymo produktų pridėjimas", + "adding-wallets": "Piniginių pridėjimas", + "account-abstraction": "Sąskaitos abstrakcija", + "acknowledgements": "Padėkos", "aria-toggle-search-button": "Rodyti paieškos mygtuką", "aria-toggle-menu-button": "Rodyti meniu mygtuką", "beacon-chain": "Švyturio grandinė", "bridges": "Blokų grandinės tiltai", + "bug-bounty": "Klaidų atlygis", + "build": "Kurti", + "build-menu": "Kūrimo meniu", + "clear": "Išvalyti", + "close": "Uždaryti", "community": "Bendruomenė", "community-hub": "Bendruomenės centras", "community-menu": "Bendruomenės meniu", "contact": "Susisiekti", + "content-buckets": "Turinio grupės", + "content-resources": "Turinio ištekliai", + "content-standardization": "Turinio standartizavimas", "contributing": "Prisidėkite", "contributors": "Pagalbininkai", "contributors-thanks": "Visiems prisidėjusiems prie šio puslapio – ačiū!", "cookie-policy": "Slapukų naudojimo politika", "copied": "Nukopijuota", "copy": "Kopijuoti", + "danksharding": "Dankšardingas", + "dao-page": "DAO - Decentralizuotos autonominės organizacijos", "dark-mode": "Tamsus", "data-provided-by": "Duomenų šaltinis:", "decentralized-applications-dapps": "Dapps'ai - Decentralizuotos programėlės", + "decentralized-identity": "Decentralizuota tapatybė", + "decentralized-social-networks": "Decentralizuoti socialiniai tinklai", + "decentralized-science": "„DeSci“ - Decentralizuotasis mokslas", + "description": "Navigacijos elemento aprašymas", + "defi-page": "DeFi - Decentralizuoti finansai", + "design": "Projektavimas", + "design-principles": "Projektavimo principai", "devcon": "Devcon", "developers": "Kūrėjams", "developers-home": "Kūrėjų pagrindinis puslapis", "docs": "Dokumentai", + "docsearch-to-select": "Kaip pasirinkti", + "docsearch-to-navigate": "Kaip surasti", + "docsearch-to-close": "Kaip uždaryti", + "docsearch-search-by": "Ieškoti pagal", + "docsearch-start-recent-searches-title": "Naujausia", + "docsearch-start-no-recent-searches": "Nėra naujausių paieškų", + "docsearch-start-save-recent-search": "Įrašyti šią paiešką", + "docsearch-start-remove-recent-search": "Šalinti šią paiešką iš istorijos", + "docsearch-start-favorite-searches": "Mėgstama", + "docsearch-start-remove-favorite-search": "Šalinti šią paiešką iš mėgstamų", + "docsearch-no-results-text": "Nepavyko rasti", + "docsearch-no-results-suggested-query": "Pabandykite ieškoti", + "docsearch-no-results-missing": "Ar manote, kad ši užklausa bus rezultatyvi?", + "docsearch-no-results-missing-link": "Praneškite mums.", + "docsearch-error-title": "Nepavyksta gauti rezultatų", + "docsearch-error-help": "Reikėtų patikrinti ryšį su tinklu.", "documentation": "Dokumentacija", + "down": "Žemyn", "ecosystem": "Ekosistema", "edit-page": "Redaguoti puslapį", "ef-blog": "Ethereum fondo tinklaraštis", @@ -32,6 +74,8 @@ "enterprise-menu": "Verslo meniu", "esp": "Ekosistemos palaikymo programa", "eth-current-price": "Dabartinė ETH kaina (USD)", + "ethereum-basics": "Ethereum pagrindai", + "ethereum-bug-bounty": "„Ethereum“ atlygio už aptiktus riktus programa", "consensus-when-shipping": "Kada bus išsiųstas?", "ethereum-upgrades": "Ethereum atnaujinimai", "ethereum-brand-assets": "Ethereum prekių ženklo turtas", @@ -42,20 +86,37 @@ "ethereum-glossary": "Ethereum žodynėlis", "ethereum-governance": "Ethereum valdymas", "ethereum-logo": "Ethereum logotipas", + "ethereum-roadmap": "„Ethereum“ veiksmų gairės", + "ethereum-protocol": "„Ethereum“ protokolas", "ethereum-security": "Ethereum sauga ir sukčiavimų prevencija", "ethereum-support": "Ethereum palaikymas", "ethereum-wallets": "Ethereum piniginės", "ethereum-whitepaper": "Ethereum baltoji knyga", + "feedback-widget-prompt": "Ar šis puslapis naudingas?", + "feedback-card-prompt-page": "Ar šis puslapis padėjo?", + "feedback-card-prompt-article": "Ar šis straipsnis padėjo?", + "feedback-card-prompt-tutorial": "Ar ši mokomoji programa padėjo?", + "feedback-widget-thank-you-title": "Dėkojame už atsiliepimą!", + "feedback-widget-thank-you-subtitle": "Padarykite šį puslapį dar geresnį atsakydami į kelis klausimus.", + "feedback-widget-thank-you-subtitle-ext": "Jeigu reikia pagalbos, galite kreiptis į mūsų bendruomenę svetainėje „Discord“.", + "feedback-widget-thank-you-timing": "2–3 min.", + "feedback-widget-thank-you-cta": "Atverti trumpą anketą", "find-wallet": "Rasti piniginę", + "future-proofing": "Pritaikymas ateičiai", "get-eth": "Gauti ETH", "get-involved": "Prisijunk", "get-started": "Pradėti", "grants": "Dotacijos", "grant-programs": "Ekosistemos dotacijų programos", - "guides-and-resources": "Bendruomenės gairės ir ištekliai", + "guides": "Gairės", + "guides-hub": "Aiškinamosios gairės", "history-of-ethereum": "Ethereum istorija", "home": "Pagrindinis puslapis", "how-ethereum-works": "Kaip veikia Ethereum", + "how-to-revoke-token-access": "Kaip atšaukti išmaniosios sutarties prieigą prie jūsų kriptovaliutos atsargų", + "how-to-swap-tokens": "Kaip sukeisti žetonus", + "how-to-use-a-bridge": "Kaip susieti žetonus su 2 sluoksniu", + "how-to-use-a-wallet": "Kaip naudoti piniginę", "image": "paveikslėlis", "in-this-section": "Šiame skirsnyje", "individuals": "Asmenims", @@ -66,41 +127,168 @@ "languages": "Kalbos", "last-24-hrs": "Pastarosios 24 valandos", "last-edit": "Paskutinis koreguotas", + "layer-2": "2 sluoksnis", "learn": "Sužinoti", "learn-by-coding": "Mokykitės kurdami kodus", + "learn-hub": "Mokymosi centras", "learn-menu": "Sužinoti meniu", "learn-more": "Sužinoti daugiau", "less": "Mažiau", "light-mode": "Šviesus", - "listing-policy-disclaimer": "Visi šiame puslapyje išvardyti produktai nėra oficialiai patvirtinti ir yra pateikti tik informaciniais tikslais. Jei norite pridėti produktą ar pateikti atsiliepimą apie politiką, iškelkite klausimą GitHub platformoje.", + "listing-policy-disclaimer": "Visi šiame puslapyje išvardyti produktai nėra oficialiai patvirtinti ir yra pateikti tik informaciniais tikslais. Jei norite pridėti produktą ar pateikti atsiliepimą apie politiką, iškelkite klausimą Github platformoje.", "loading": "Įkeliama...", "loading-error": "Įkėlimo klaida.", "loading-error-refresh": "Klaida, prašome atnaujinti.", + "loading-error-try-again-later": "Nepavyksta įkelti duomenų. Pabandykite vėliau.", "logo": "logotipas", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Sulieti", "more": "Daugiau", + "nav-about-description": "Etereum bendruomenei skirtas viešas, atvirojo šaltinio projektas", + "nav-advanced-description": "Įvaldykite sudėtingesnes temas", + "nav-advanced-label": "Pažengusiems", + "nav-basics-description": "Supraskite Ethereum pagrindus", + "nav-basics-label": "Pagrindai", + "nav-bridges-description": "Web3 išaugo į pirminių L1 blokų grandinių ir L2 dydžio pritaikymo sprendimų ekosistemą", + "nav-builders-home-description": "Kūrėjų Ethereum vadovas. Sukurta kūrėjų kūrėjams", + "nav-builders-home-label": "Kūrėjų pagrindinis puslapis", + "nav-contribute-description": "Norėdami padėti, laikykitės šių rekomendacijų", + "nav-contribute-label": "Prisidėkite prie ethereum.org", + "nav-dao-description": "Narių bendruomenės be centralizuoto valdymo", + "nav-dapps-description": "Atraskite turtingą taikomųjų programų ekosistemą naudodami Ethereum", + "nav-defi-description": "Visuotinė, atvira tradicinės finansų rinkos alternatyva", + "nav-desci-description": "Visuotinė, atvira esamos mokslinės sistemos alternatyva", + "nav-desoc-description": "Socialinės sąveikos ir turinio kūrimo platformos blokų grandinių pagrindu", + "nav-developers-docs": "Kūrėjų dokumentai", + "nav-developers": "Kūrėjams", + "nav-did-description": "Sukurkite ir turėkite savo unikalius decentralizuotus identifikatorius", + "nav-docs-description": "Dokumentai, padėsiantis jums suprasti Ethereum platformą ir joje kurti", + "nav-docs-design-description": "Unikalaus web3 dizaino iššūkių aprašymas, geriausios praktikos ir naudotojų tyrimo įžvalgos", + "nav-docs-design-label": "UX/UI dizaino pradmenys", + "nav-docs-foundation-description": "Pagrindiniai dalykai, reikalingi kuriant Ethereum platformoje", + "nav-docs-overview-description": "Kūrėjų dokumentų pagrindinis puslapis", + "nav-docs-stack-description": "Supraskite Ethereum saugyklos informaciją", + "nav-eip-description": "Standartai, pagal kuriuos apibūdinamos naujos savybės ir procesai", + "nav-eip-label": "Pasiūlymai, kaip tobulinti Ethereum", + "nav-emerging-description": "Susipažinkite su naujausiais Ethereum naudotojų atvejais", + "nav-enterprise-description": "Ethereum verslo taikomosios programos", + "nav-ethereum-org-description": "Ši interneto svetainė pagrįsta bendruomenės bendradarbiavimu – prisijunkite ir prisidėkite ir jūs", + "nav-ethereum-wallets-description": "Taikomoji programa, skirta susieti su Ethereum paskyra", + "nav-events-description": "Decentralizuotas požiūris ir laisvė dalyvauti visiems", + "nav-events-irl-description": "Kas mėnesį gyvai ir nuotoliniu būdu organizuojami reikšmingi Ethereum renginiai", + "nav-events-label": "Bendruomenės ir renginiai", + "nav-events-online-description": "Šimtai tūkstančių Ethereum entuziastų aktyviai dalyvauja šiose internetinėse bendruomenėse", + "nav-find-wallet-description": "Piniginėse galite naudoti kriptovaliutą", + "nav-find-wallet-label": "Pasirinkite piniginę", + "nav-gas-fees-description": "Kaip apskaičiuojami vidinės Ethereum kriptovaliutos mokesčiai?", + "nav-get-eth-description": "Kad galėtumėte naudoti Ethereum taikomąsias programas, jums reikia eterių (ETH – vidinė Ethereum kriptovaliuta)", + "nav-get-started-description": "Pirmieji žingsniai naudojant Ethereum", + "nav-governance-description": "Ethereum protokolo naujinimo procesas", + "nav-governance-label": "Valdymas", + "nav-grants-description": "Mūsų bendruomenės sudarytas projektų, kuriuose teikiamos dotacijų finansavimo programos, sąrašas", + "nav-guide-create-account-description": "Ethereum paskyrą bet kada gali susikurti visi naudotojai, turintys piniginės taikomąją programą", + "nav-guide-revoke-access-description": "Saugiai valdykite išmaniąsias sutartis ir taikomąsias programas Ethereum ekosistemoje", + "nav-guide-revoke-access-label": "Kaip atšaukti prieigą prie išmaniųjų sutarčių?", + "nav-guide-use-wallet-description": "Sužinokite, kaip valdyti visas pagrindines piniginės funkcijas", + "nav-guide-use-wallet-label": "Kaip naudoti piniginę", + "nav-guides-description": "Praktiški detalūs pradiniai nurodymai", + "nav-guides-label": "Aiškinamosios gairės", + "nav-history-description": "Visų svarbiausių išsišakojimų ir naujinių tvarkaraštis", + "nav-history-label": "Ethereum techninė istorija", + "nav-layer-2-description": "Ethereum pigesni ir spartesni sandoriai", + "nav-learn-by-coding-description": "Įrankiai, kurie padeda jums eksperimentuoti Ethereum platformoje", + "nav-local-env-description": "Pasirinkite ir sukurtkite savo Ethereum kūrimo saugyklą", + "nav-mainnet-description": "Verslo blokų grandinių taikomąsias programas galima sukurti viešame tinkle Ethereum Mainnet", + "nav-nft-description": "Būdas pateikti viską, kas unikalu, kaip Ethereum pagrįstą investiciją", + "nav-open-research-description": "Viena iš pagrindinių Ethereum stiprybių – aktyvi tyrėjų bendruomenė", + "nav-open-research-label": "Atverti tyrimą", + "nav-overview-description": "Viskas apie Ethereum švietimą", + "nav-overview-label": "Apžvalga", + "nav-participate-overview-description": "Dalyvavimo galimybių apžvalga", + "nav-primary": "Pagrindinis", + "nav-quizzes-description": "Pasitikrinkite, ar gerai išmanote Ethereum ir kriptovaliutas", + "nav-quizzes-label": "Patikrinkite savo žinias", + "nav-refi-description": "Alternatyvi ekonominė sistema, sukurta regeneravimo principu", + "nav-research-description": "Ethereum tobulinimo procesai", + "nav-research-label": "Tyrimai ir plėtra", + "nav-roadmap-description": "Kelias link didesnio Ethereum išplečiamumo, saugumo ir tvarumo", + "nav-roadmap-future-description": "Ethereum, kaip patikimo ir decentralizuoto tinklo, įtvirtinimas", + "nav-roadmap-future-label": "Pritaikymas ateičiai", + "nav-roadmap-label": "Planas", + "nav-roadmap-scaling-description": "Tinklo naujiniai, siekiant dar labiau sumažinti sandorių išlaidas ir greitį", + "nav-roadmap-security-description": "Užtikrinimas, kad Ethereum platforma ir ateityje išliktų atspari įvairiems išpuoliams", + "nav-roadmap-security-label": "Didesnis saugumas", + "nav-roadmap-ux-description": "Ethereum naudojimas turi būti paprastesnis", + "nav-run-a-node-description": "Tapkite visiškai nepriklausomi ir padėkite apsaugoti tinklą", + "nav-security-description": "Susipažinkite su geriausiomis kriptovaliutos naudojimo praktikomis", + "nav-smart-contracts-description": "Pagrindiniai Ethereum ekosistemos blokai", + "nav-stablecoins-description": "Stablecoins yra Ethereum žetonai, kurių vertė išlieka fiksuota", + "nav-stake-description": "Gaukite atlygį už Ethereum saugumo didinimą", + "nav-stake-label": "Palaikyti", + "nav-staking-home-description": "Skirtingų palaikymo parinkčių apžvalga", + "nav-staking-pool-description": "Palaikykite ir gaukite bet kokios ETH sumos atlygį prisijungdami prie kitų", + "nav-staking-pool-label": "Sutelktasis palaikymas", + "nav-staking-saas-label": "Palaikymas teikiant paslaugą", + "nav-staking-solo-label": "Savarankiškas palaikymas", + "nav-start-building-description": "Naudinga informacija naujokams", + "nav-translation-program-description": "Bendros pastangos išversti puslapį ethereum.org į visas kalbas", + "nav-tutorials-description": "Sudarytas bendruomenės vadovėlių sąrašas", + "nav-use-cases-description": "Atraskite kitokio Ethereum panaudojimo idėjų", + "nav-what-is-ether-description": "Ethereum taikomųjų programų valiuta", + "nav-what-is-ethereum-description": "Supraskite, kodėl Ethereum yra ypatinga platforma", + "nav-what-is-web3-label": "Kas yra „Web3“?", + "nav-what-is-web3-description": "Centralizuotų monopolijų, diktuojančių taisykles, alternatyva", + "nav-whitepaper-description": "Originali Ethereum baltoji knyga, kurią 2014 m. parašė Vitalik Buterin", + "nav-zkp-description": "Būdas įrodyti teiginio pagrįstumą, neatskleidžiant paties teiginio", + "nft-page": "NFT - Nekeičiamieji žetonai", + "nfts": "NFT žetonai", "no": "Ne", "on-this-page": "Šiame puslapyje", + "open-research": "Atverti tyrimą", + "page-developers-aria-label": "Kūrėjų meniu", + "page-index-meta-title": "Pagrindinis puslapis", "page-last-updated": "Puslapis paskutinį kartą atnaujintas", + "participate-menu": "Dalyvavimo meniu", + "pbs": "Siūlytojo-kūrėjo atskyrimas", + "pools": "Sutelktasis palaikymas", "privacy-policy": "Privatumo politika", "private-ethereum": "Privatus Ethereum", + "product-disclaimer": "Produktų ir paslaugų sąrašas sudarytas tam, kad „Ethereum“ bendruomenei būtų patogiau. Jei produktas ar paslauga įtraukiamas (-a), tai nereiškia, kad jį (ją) patvirtino interneto svetainės ethereum.org komanda arba „Ethereum“ fondas.", + "quizzes-title": "Apklausų centras", + "quizzes": "Apklausos", "refresh": "Prašome atnaujinti puslapį.", + "return-home": "grįžti į pradžią", + "roadmap": "„Ethereum“ veiksmų gairės", + "research": "Tyrimai", + "research-menu": "Tyrimų meniu", + "resources": "Vertimo ištekliai", "run-a-node": "Paleisti mazgą", + "rollup-component-developer-docs": "Kūrėjo dokumentai", + "rollup-component-technology-and-risk-summary": "Technologijų ir rizikų suvestinė", + "scaling": "Dydžio pritaikymas", + "saas": "Palaikymo paslauga", "search": "Paieška", + "search-ethereum-org": "Ieškoti svetainėje ethereum.org", + "secret-leader-election": "Slaptieji lyderio rinkimai", "search-box-blank-state-text": "Ieškok!", "search-eth-address": "Panašu, kad tai Ethereum adresas. Mes neteikiame duomenų, susijusių su konkrečiais adresais. Bandykite ieškoti duomenų blokų naršyklėje Etherscan", "search-no-results": "Rezultatų, atitinkančių paieškos užklausą, nerasta", + "security": "Saugumas", + "single-slot-finality": "Baigtumas per tą patį laikotarpį", + "statelessness": "Bepilietybė", "see-contributors": "Žiūrėti pagalbininkus", - "set-up-local-env": "Susikurti vietinę aplinką", - "sharding": "Padalijimo grandinės", + "set-up-local-env": "Susikurkite vietinę aplinką", + "sharding": "Skirstymas", "show-all": "Rodyti visus", "show-less": "Rodyti mažiau", "site-description": "Ethereum yra globali, decentralizuota platforma, skirta pinigų ir naujo tipo programoms. Ethereum platformoje galite sukurti pinigus valdantį kodą ir kurti programas, prieinamas visame pasaulyje.", - "site-title": "ethereum.org", "skip-to-main-content": "Pereiti prie pagrindinio turinio", "smart-contracts": "Išmaniosios sutartys", "stablecoins": "Stablecoins", "staking": "Palaikymas", + "start-here": "Pradėti čia", + "solo": "Savarankiškas palaikymas", + "support": "Parama", "terms-of-use": "Naudojimosi sąlygos", "translation-banner-body-new": "Šį puslapį matote anglų kalba, nes jis dar nėra išverstas. Padėkite mums išversti šį turinį.", "translation-banner-body-update": "Jau yra nauja šio puslapio versija, bet kol kas tik anglų kalba. Padėkite mums išversti naujausią versiją.", @@ -108,17 +296,25 @@ "translation-banner-button-translate-page": "Išversti puslapį", "translation-banner-title-new": "Padėkite išversti šį puslapį", "translation-banner-title-update": "Padėkite atnaujinti šį puslapį", + "translation-banner-no-bugs-title": "Čia riktų nėra!", + "translation-banner-no-bugs-content": "Šis puslapis neverčiamas. Kol kas jį tyčia paliekame anglų kalba.", + "translation-banner-no-bugs-dont-show-again": "Daugiau nerodyti", + "translation-program": "Vertimo programa", + "try-using-search": "Norėdami surasti norimą dalyką išbandykite paieškos funkciją arba", "tutorials": "Pamokos", + "up": "Aukštyn", + "use": "Naudojimas", "use-ethereum": "Naudoti Ethereum", "use-ethereum-menu": "Naudoti Ethereum meniu", + "use-menu": "Naudojimo meniu", + "verkle-trees": "„Verkle“ medžiai", "wallets": "Piniginės", + "we-couldnt-find-that-page": "Nepavyko rasti šio puslapio", + "web3": "Kas yra „Web3“?", "website-last-updated": "Svetainė paskutinį kartą atnaujinta", "what-is-ether": "Kas yra Ether (ETH)?", "what-is-ethereum": "Kas yra Ethereum?", - "defi-page": "DeFi - Decentralizuoti finansai", - "dao-page": "DAO - Decentralizuotos autonominės organizacijos", - "nft-page": "NFT - Nekeičiamieji žetonai", + "withdrawals": "Palaikymo lėšų atsiėmimas", "yes": "Taip", - "page-index-meta-title": "Pagrindinis puslapis", - "page-developers-aria-label": "Kūrėjų meniu" + "zero-knowledge-proofs": "Įrodymas be žinių" } diff --git a/src/intl/pcm/common.json b/src/intl/pcm/common.json index 831ff9692e1..45de847bd24 100644 --- a/src/intl/pcm/common.json +++ b/src/intl/pcm/common.json @@ -13,6 +13,9 @@ "aria-toggle-menu-button": "Press menu buton", "beacon-chain": "Beacon Chain", "bridges": "Blokchain bridges", + "bug-bounty": "Bug bounty", + "build": "Build", + "build-menu": "Build menu", "clear": "Klear", "close": "Klose", "community": "Komunity", diff --git a/src/intl/tk/common.json b/src/intl/tk/common.json index cb8ccf83c58..26e0ac4fd69 100644 --- a/src/intl/tk/common.json +++ b/src/intl/tk/common.json @@ -1,17 +1,28 @@ { - "account-abstraction": "Hasap abstraksiýasy", "about-ethereum-org": "Ethereum.org hakynda", "about-us": "Biz hakda", + "adding-desci-projects": "“Desci” proýektlerini goşmak", + "adding-developer-tools": "Işläp taýýarlaýjynyň gurallaryny goşmak", + "adding-exchanges": "Birža goşmak", + "adding-glossary-terms": "Sözlük adalgalaryny goşmak", + "adding-staking-products": "Steýking önümlerini goşmak", + "adding-wallets": "Gapjyk goşmak", + "account-abstraction": "Hasap abstraksiýasy", "aria-toggle-search-button": "Gözleg çalşyrgyç düwmesi", "aria-toggle-menu-button": "Menýu çalşyrgyç düwmesi", "beacon-chain": "Beacon Chain", "bridges": "Blok zynjyry köprüleri", + "bug-bounty": "Bug bounty", + "build": "Gurnalyş", + "build-menu": "Gurnalyş menýusy", "clear": "Arassalamak", "close": "Ýapmak", "community": "Jemgyýet", "community-hub": "Jemgyýet merkezi", "community-menu": "Jemgyýet menýusy", "contact": "Habarlaşmak", + "content-buckets": "Mazmun Bedreleri", + "content-resources": "Mazmun resurslary", "content-standardization": "Mazmuny standartlaşdyrmak", "contributing": "Goşant goşmak", "contributors": "Goşant goşanlar", @@ -27,7 +38,10 @@ "decentralized-identity": "Merkezleşdirilmedik şahsyýet", "decentralized-social-networks": "Merkezleşdirilmedik sosial ulgamlar", "decentralized-science": "DeSci - Merkezleşdirilmedik ylym", + "description": "Nawigasiýa elementiniň beýany", "defi-page": "DeFi - Merkezleşdirilmedik maliýe", + "design": "Dizaýn", + "design-principles": "Dizaýn ýörelgeleri", "devcon": "Devcon", "developers": "Işläp düzüjiler", "developers-home": "Işläp düzüjileriň öýi", @@ -59,11 +73,9 @@ "enterprise-menu": "Kärhana menýusy", "esp": "Ekoulgamy goldamak maksatnamasy", "eth-current-price": "Häzirki ETH bahasy (USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Ethereum säwlikleri boýunça baýrak meýilnamasy", "consensus-when-shipping": "Haçan iberilýär?", "ethereum-upgrades": "Ethereum täzelenmeleri", - "ethereum-brand-assets": "Ethereum brand assets", "ethereum-online": "Onlaýn jemgyýetler", "ethereum-events": "Ethereum wakalary", "ethereum-foundation": "Ethereum gaznasy", @@ -83,22 +95,20 @@ "feedback-card-prompt-tutorial": "Bu gollanma peýdaly boldumy?", "feedback-widget-thank-you-title": "Pikirleriňiz üçin sag boluň!", "feedback-widget-thank-you-subtitle": "Birnäçe soraga jogap bermek bilen bu sahypany has hem gowulaň.", - "feedback-widget-thank-you-subtitle-ext": "Kömek gerek bolsa, Diskord-da jemgyýet bilen habarlaşyp bilersiňiz.", + "feedback-widget-thank-you-subtitle-ext": "Kömek gerek bolsa, Discord sahypamyzda jemgyýet bilen habarlaşyp bilersiňiz.", "feedback-widget-thank-you-timing": "2–3 minut ", "feedback-widget-thank-you-cta": "Gysga sowalnamany açmak", - "find-wallet": "Find wallet", "future-proofing": "Geljege taýýarlyk", - "get-eth": "ETH alyň", + "get-eth": "ETH edinmek", "get-involved": "Gatnaşmak", "get-started": "Başlamak üçin", "grants": "Grantlar", "grant-programs": "Ekoulgamyň grant maksatnamalary", "guides": "Gollanmalar", - "guides-hub": "Gollanmalar merkezi", + "guides-hub": "Nädip etmelidigini öwredýän gollanmalar", "history-of-ethereum": "Ethereum taryhy", "home": "Baş sahypa", "how-ethereum-works": "Ethereum nähili işleýär", - "how-to-register-an-ethereum-account": "Ethereum hasabyny nädip \"bellige aldyrmaly\"", "how-to-revoke-token-access": "Akylly şertnamanyň kripto serişdeleriňize girişini nädip ýatyrmaly", "how-to-swap-tokens": "Tokenleri nädip çalyşmaly", "how-to-use-a-bridge": "Tokenleri 2-nji gatlaga nädip köpri etmeli", @@ -115,11 +125,9 @@ "last-edit": "Soňky redaktirleme", "layer-2": "2-nji gatlak", "learn": "Öwrenmek", - "learn-by-coding": "Learn by coding", "learn-hub": "Öwrenme merkezi", "learn-menu": "Öwrenmek menýusy", "learn-more": "Goşmaça maglumat", - "less": "Less", "light-mode": "Ýagty", "listing-policy-disclaimer": "Bu sahypada görkezilen önümleriň hemmesi resmi tassyklama däl we diňe maglumat maksatly berilýär. Önüm goşmak ýa-da syýasat barada seslenme goýmak isleseňiz, GitHub-da bir mesele gozgaň.", "loading": "Ýüklenýär...", @@ -128,10 +136,101 @@ "loading-error-try-again-later": "Maglumatlary ýükläp bolmaýar. Soňrak täzeden synanyşyň.", "logo": "logotip", "mainnet-ethereum": "Esasy ulgam Ethereum", - "more": "More", - "nav-developers": "Döredijiler", + "merge": "Birleşdirmek", + "nav-about-description": "Ethereum jemgyýeti üçin jemgyýetçilik, açyk çeşme kodly taslama", + "nav-advanced-description": "Has çylşyrymly mowzuklary öwreniň", + "nav-basics-description": "Ethereum-yň esaslaryna düşüniň", + "nav-basics-label": "Esasy maglumatlar", + "nav-bridges-description": "Web3 başlangyç L1 blokçeýnleriň we L2 masştabirleme çözgütleriniň ekosistemasyna öwrüldi", + "nav-builders-home-description": "Ethereum üçin gurluşykçy gollanmasy—gurluşykçylar tarapyndan, gurluşykçylar üçin", + "nav-builders-home-label": "Gurluşykçynyň öýi", + "nav-contribute-description": "Kömek etmek isleseňiz, bu size ýol görkezer", + "nav-contribute-label": "Ethereuma.org websaýtyna goşant goşmak", + "nav-dao-description": "Merkezleşdirilen hökümeti bolmadyk, agzalara degişli jemgyýetler", + "nav-dapps-description": "Ethereum ulanyp, programmalaryň baý ekosistemasyny öwreniň", + "nav-defi-description": "Adaty maliýe bazarynyň ornuny tutýan global, açyk alternatiwa", + "nav-desci-description": "Häzirki ylmy ulgama global, açyk alternatiwa", + "nav-desoc-description": "Sosial gatnaşyklar we mazmun döretmek üçin blokçeýn esasly platformalar", "nav-developers-docs": "Işläp düzüji resminamalary", + "nav-developers": "Işläp düzüjiler", + "nav-did-description": "Özboluşly merkezleşdirilmedik kesgitleýjileriňizi beriň we olara eýeçilik ediň", + "nav-docs-description": "Ethereum bilen düşünmäge we gurmaga kömek edýän resminamalar", + "nav-docs-design-description": "Özboluşly web3 dizaýn kynçylyklarynyň beýany, iň oňat tejribe we ulanyjy gözleg düşünjeleri", + "nav-docs-design-label": "UX/UI dizaýn esaslary", + "nav-docs-foundation-description": "Ethereum-da ösmek üçin esasy esaslar", + "nav-docs-overview-description": "Işläp taýýarlaýjy resminamalary üçin öýüňiz", + "nav-docs-stack-description": "Ethereum steginiň ähli jikme-jikliklerine düşüniň", + "nav-eip-description": "Täze aýratynlyklary ýa-da prosesleri kesgitleýän standartlar", + "nav-eip-label": "Ethereum-y gowulandyrmak barada teklipler (EGBT)", + "nav-emerging-description": "Ethereum-a degişli has täze ulanylyş ýagdaýlary barada öwreniň", + "nav-enterprise-description": "Ethereum üçin işewürlik programmalary", + "nav-ethereum-org-description": "Bu web sahypasy jemgyýet tarapyndan dolandyrylýar - siz hem bize goşulyň we goşant goşuň", + "nav-ethereum-wallets-description": "Ethereum hasabyňyz bilen täsirleşmek üçin programma", + "nav-events-description": "Merkezi bolmadyk dolandyryş we her kim üçin gatnaşmak azatlygy", + "nav-events-irl-description": "Her aý fiziki görnüşde we onlaýn geçirilýän uly Ethereum çäreleri bolýar", + "nav-events-label": "Jemgyýetler we çäreler", + "nav-events-online-description": "Bu onlaýn jemgyýetlerde ýüz müňlerçe Ethereum höwesjeňler atalyk edýär", + "nav-find-wallet-description": "Gapjyklar kripto ulanmaga mümkinçilik berýär", + "nav-find-wallet-label": "Gapjygyňyzy saýlaň", + "nav-gas-fees-description": "ETH amal tölegleri nähili hasaplanýar", + "nav-get-eth-description": "Ethereum programmalaryny ulanmagyňyz üçin size efir (ETH) gerek", + "nav-get-started-description": "Ethereum-y ulanmak üçin ilkinji ädimleriňiz", + "nav-governance-description": "Ethereum protokolyny täzelemek bilen baglanyşykly proses", + "nav-governance-label": "Dolandyryş", + "nav-grants-description": "Grant maliýeleşdiriş maksatnamalaryny hödürleýän taslamalar boýunça jemgyýetimiz tarapyndan düzülen sanaw", + "nav-guide-create-account-description": "Islendik adam islendik wagt gapjyk programmasy bilen mugt Ethereum hasabyny döredip biler", + "nav-guide-revoke-access-description": "Iş salyşan wagtyňyz Ethereum ekosistemasyndaky akylly şertnamalar we programmalar arkaly howpsuz boluň", + "nav-guide-revoke-access-label": "Akylly şertnama giriş hukugyny nädip ýatyrmaly", + "nav-guide-use-wallet-description": "Gapjykdaky esasy funksiýalaryň ählisini nädip işletmelidigini öwreniň", + "nav-guide-use-wallet-label": "Gapjygy nädip ulanmaly", + "nav-guides-description": "Siziň başlamagyňyza kömek etmek üçin amaly ädimler", + "nav-guides-label": "Nädip etmelidigini öwredýän gollanmalar", + "nav-history-description": "Ähli esasy forklaryň we täzelenmeleriň wagtlarynyň rejesi", + "nav-history-label": "Ethereumyň tehniki taryhy", + "nav-layer-2-description": "Ethereum üçin arzanrak we has çalt amallar", + "nav-learn-by-coding-description": "Ethereum bilen synag geçirmäge kömek edýän gurallar", + "nav-local-env-description": "Ethereum işläp taýýarlaýyş stegiňizi we guruň", + "nav-mainnet-description": "Kärhana blokçeýn programmalary köpçülige açyk Ethereum esasy torunda gurlup bilner", + "nav-nft-description": "Üýtgeşik bir zady Ethereum esasly aktiw hökmünde görkezmegiň usuly", + "nav-open-research-description": "Ethereum-yň esasy güýçlerinden biri onuň işjeň gözleg jemgyýetidir", + "nav-open-research-label": "Açyk gözleg", + "nav-overview-description": "Hemme zat barada Ethereum okuwy", + "nav-participate-overview-description": "Nädip gatnaşmalydygy barada gysgaça maglumat", "nav-primary": "Esasy", + "nav-quizzes-description": "Ethereum we kriptowalýuta nä derejede düşünýändigiňizi biliň", + "nav-quizzes-label": "Bilimleriňizi barlaň", + "nav-refi-description": "Täzeden dikeldiş ýörelgelerine esaslanýan alternatiw ykdysady ulgam", + "nav-research-description": "Ethereum-y gowulandyrmak üçin ulanylýan prosesler", + "nav-research-label": "Gözleg we ösüş", + "nav-roadmap-description": "Ethereum üçin has giňelişe, howpsuzlyga we durnuklylyga barýan ýol", + "nav-roadmap-future-description": "Ethereumy berk we merkezleşdirilmedik ulgam hökmünde berkitmek", + "nav-roadmap-future-label": "Geljege taýýarlyk", + "nav-roadmap-label": "Hereketleriň meýilnamasy", + "nav-roadmap-scaling-description": "Geleşik çykdajylaryny we tizligini has hem azaltmak üçin tor täzelenmeleri", + "nav-roadmap-security-description": "Ethereumyň geljekde her dürli hüjümlere çydamlydygyna göz ýetirmek", + "nav-roadmap-security-label": "Kämilleşdirilen howpsuzlyk", + "nav-roadmap-ux-description": "Ethereum-y ulanmak aňsatlaşdyrylmaly", + "nav-run-a-node-description": "Toruň howpsuzlygyny üpjün etmekde doly özygtyýarly boluň", + "nav-security-description": "Kriptowalýuta ulanylanda iň oňat tejribeleri öwreniň", + "nav-smart-contracts-description": "Ethereum ekosistemasynyň esasy gurluş bölekleri", + "nav-stablecoins-description": "Steýblkoýnlar kesgitlenen bahada galmak üçin döredilen Ethereum tokenleridir", + "nav-stake-description": "Ethereum-yň howpsuzlygyny üpjün edýändigiňiz üçin baýrak gazanyň", + "nav-stake-label": "Stawka", + "nav-staking-home-description": "Stawkalaryň dürli wariantlaryna syn", + "nav-staking-pool-description": "Başgalar bilen birleşip, islendik mukdardaky ETH stawka ediň we baýrak alyň", + "nav-staking-pool-label": "Üýşürilen steýking", + "nav-staking-saas-label": "Hyzmat bilen steýking", + "nav-staking-solo-label": "Ýeke steýking", + "nav-start-building-description": "Täze gelenler üçin peýdaly maglumatlar", + "nav-translation-program-description": "Ethereum.org websaýtyny ähli dillere terjime etmek üçin bilelikdäki tagalla", + "nav-tutorials-description": "Jemgyýetçilik okuw sapaklarynyň halypalyk sanawy", + "nav-use-cases-description": "Ethereum ulanmak üçin dürli pikirleri tapyň", + "nav-what-is-ether-description": "Ethereum programmalarynyň walýutasy", + "nav-what-is-ethereum-description": "Ethereum-y nämäniň aýratyn edýändigine düşüniň", + "nav-what-is-web3-label": "Web3 näme?", + "nav-what-is-web3-description": "Düzgünleri görkezýän merkezleşdirilen monopoliýalaryň ornuny tutýan alternatiwa", + "nav-whitepaper-description": "Witalik Buterin tarapyndan 2014-nji ýylda ýazylan asyl Ethereum tehniki resminamasy", + "nav-zkp-description": "Beýannamanyň özüni äşgär etmezden, beýannamanyň dogrudygyny subut etmegiň usuly", "nft-page": "NFT-lar - Özara çalşylmaýan tokenler", "nfts": "NFT-lar", "no": "Ýok", @@ -140,6 +239,7 @@ "page-developers-aria-label": "Işläp düzüji menýusy", "page-index-meta-title": "Baş sahypa", "page-last-updated": "Sahypa soňky gezek täzelendi", + "participate-menu": "Gatnaşmak menýusy", "pbs": "Teklipçiniň bilen gurujynyň tapawudy", "pools": "Üýşürilen steýking", "privacy-policy": "Gizlinlik syýasaty", @@ -150,13 +250,13 @@ "refresh": "Sahypany täzeden ýükläň.", "return-home": "baş sahypa dolanmak", "roadmap": "Ethereum ýol kartasy", + "research": "Gözleg", + "research-menu": "Gözleg menýusy", "resources": "Terjime gorlary", - "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Düwün işlediň", "rollup-component-website": "Website", "rollup-component-developer-docs": "Işläp düzüji resminamalary", "rollup-component-technology-and-risk-summary": "Tehnologiýa we töwekgelçilik barada gysgaça mazmun", - "scaling": "Scaling", "saas": "Hyzmat hökmünde steýking", "search": "Gözleg", "search-ethereum-org": "ethereum.org-da gözlemek", @@ -164,6 +264,7 @@ "search-box-blank-state-text": "Gözläň!", "search-eth-address": "Bu Ethereum salgysyna meňzeýär. Salgylara mahsus maglumatlary bermeýäris. Şunuň ýaly blok agtaryjyda ony gözläp görüň", "search-no-results": "Gözlegiňiz boýunça netije ýok", + "security": "Howpsuzlyk", "single-slot-finality": "Ýeke slot gutarnyklylygy", "statelessness": "Raýatlygy ýokluk", "see-contributors": "Goşant goşýanlary görmek", @@ -172,14 +273,12 @@ "show-all": "Hemmesini görkez", "show-less": "Az görkez", "site-description": "Ethereum pul we täze görnüşli programmalar üçin global, merkezleşdirilmedik platformadyr. Ethereum-da pullara gözegçilik edýän kod ýazyp, dünýäniň islendik ýerinden girip bolýan programmalary gurup bilersiňiz.", - "site-title": "ethereum.org", "skip-to-main-content": "Esasy mazmuna geçmek", "smart-contracts": "Akylly şertnamalar", "stablecoins": "Stablecoins\n", "stake-eth": "ETH goýmak", "staking": "Steýking", "start-here": "Şu ýerden başlaň", - "style-guide": "Style guide", "solo": "Ýeke steýking", "terms-of-use": "Ulanyş şertleri", "translation-banner-body-new": "Bu sahypany iňlis dilinde görýärsiňiz, sebäbi ony entek terjime etmedik. Bu mazmuny terjime etmäge kömek ediň.", @@ -191,17 +290,18 @@ "translation-banner-no-bugs-title": "Bu ýerde ýalňyşlyk ýok!", "translation-banner-no-bugs-content": "Bu sahypa terjime edilmeýär. Bu sahypany häzirlikçe bilgeşlin iňlis dilinde goýduk.", "translation-banner-no-bugs-dont-show-again": "Indi görkezme", + "translation-program": "Terjime Maksatnamasy", "try-using-search": "Gözleýän zadyňyzy tapmak üçin gözlegi ulanyp görüň ýa-da", "tutorials": "Okuw gollanmalary", "up": "Ýokary", + "use": "Ulanyş", "use-ethereum": "Ethereum ulanmak", "use-ethereum-menu": "Ethereum menýusyny ulanmak", - "user-experience": "User experience", + "use-menu": "Menýuny ulanmak", "verkle-trees": "Verkle agaçlary", "wallets": "Gapjyklar", "we-couldnt-find-that-page": "Şol sahypany tapyp bilmedik", "web3": "Web3 näme?", - "web3-title": "Web3", "website-last-updated": "Websaýtyň soňky täzelenmesi", "what-is-ether": "Ether (ETH) näme?", "what-is-ethereum": "Ethereum näme?", diff --git a/src/intl/uz/common.json b/src/intl/uz/common.json index b5d25cdeb01..941519ed4f6 100644 --- a/src/intl/uz/common.json +++ b/src/intl/uz/common.json @@ -1,30 +1,70 @@ { "about-ethereum-org": "ethereum.org haqida", "about-us": "Biz haqimizda", + "adding-desci-projects": "Desci loyihalarini qo'shish", + "adding-developer-tools": "Dasturchi vositalarini qo'shish", + "adding-exchanges": "Birjalarni qo'shish", + "adding-glossary-terms": "Glossariy atamalarni qo'shish", + "adding-staking-products": "Pul tikish mahsulotlarini qo'shish", + "adding-wallets": "Hamyonlarni qo'shish", + "account-abstraction": "Hisob abstraksiyasi", + "acknowledgements": "Minnatdorchilik", "aria-toggle-search-button": "Qidiruv tugmasini almashtirish", "aria-toggle-menu-button": "Menyu tugmasini almashtirish", "beacon-chain": "Beacon Chain", "bridges": "Blokcheyn ko'priklar", + "bug-bounty": "Xatolar mo'lligi", + "build": "Qurish", + "build-menu": "Qurish menyusi", + "clear": "Tozalash", "close": "Yopish", "community": "Hamjamiyat", "community-hub": "Hamjamiyat markazi", "community-menu": "Hamjamiyat menyusi", "contact": "Aloqa", + "content-buckets": "Kontent Idishlari", + "content-resources": "Kontent resurslari", + "content-standardization": "Kontentni standartlashtirish", "contributing": "Hissa qo‘shish", "contributors": "Hissa qoʻshganlar", "contributors-thanks": "Bu sahifada hissa qoʻshganlarning barchasiga rahmat!", "cookie-policy": "Cookie siyosati", "copied": "Nusxa olindi", "copy": "Nusxa olish", + "danksharding": "Danksharding", + "dao-page": "DAO - Markazlashmagan avtonom tashkilotlar", "dark-mode": "Tungi", "data-provided-by": "Ma'lumotlar manbai:", "decentralized-applications-dapps": "Dapps - Markazlashtirilmagan ilovalar", - "decentralized-science": "DeSci - Decentralized science", + "decentralized-identity": "Markazlashmagan identifikatsiya", + "decentralized-social-networks": "Markazlashmagan ijtimoiy tarmoqlar", + "decentralized-science": "DeSci - Markazlashmagan ilm", + "description": "Nav elementi uchun tavsif", + "defi-page": "DeFi - Markazlashmagan moliya", + "design": "Dizayn", + "design-principles": "Dizayn Tamoyillari", "devcon": "Devcon", "developers": "Ishlab chiquvchilar", "developers-home": "Dasturchilar bosh sahifasi", "docs": "Docs", + "docsearch-to-select": "Tanlash uchun", + "docsearch-to-navigate": "Kezish uchun", + "docsearch-to-close": "Yopish uchun", + "docsearch-search-by": "Qidiruv asosi", + "docsearch-start-recent-searches-title": "Oxirgi", + "docsearch-start-no-recent-searches": "Oxirgi qidiruvlar yoʻq", + "docsearch-start-save-recent-search": "Bu qidiruvni saqlash", + "docsearch-start-remove-recent-search": "Bu qidiruvni tarixdan olib tashlash", + "docsearch-start-favorite-searches": "Saralangan", + "docsearch-start-remove-favorite-search": "Bu qidiruvni saralanganlardan olib tashlash", + "docsearch-no-results-text": "Bunga natija topilmadi", + "docsearch-no-results-suggested-query": "Buni qidirishga urining", + "docsearch-no-results-missing": "Bu soʻrov natija berishiga ishonasizmi?", + "docsearch-no-results-missing-link": "Bizga xabar bering.", + "docsearch-error-title": "Natijalarni olish imkonsiz", + "docsearch-error-help": "Internetga ulanishni tekshirishingiz mumkin.", "documentation": "Hujjatnoma", + "down": "Pastga", "ecosystem": "Ekotizim", "edit-page": "Sahifani tahrirlash", "ef-blog": "Ethereum Foundation Blogi", @@ -34,10 +74,11 @@ "enterprise-menu": "Korxona menyusi", "esp": "Ekotizimni qo'llab-quvvatlash dasturi", "eth-current-price": "Joriy ETH narxi (USD)", + "ethereum-basics": "Ethereum asoslari", "ethereum-bug-bounty": "Ethereum xatolarini topishni dastaklash dasturi", "consensus-when-shipping": "Qachon yuboriladi?", "ethereum-upgrades": "Ethereum yangilanishlari", - "ethereum-brand-assets": "Ethereum brendi aktivlari", + "ethereum-brand-assets": "Ethereum brendining resurslari", "ethereum-online": "Onlayn hamjamiyatlar", "ethereum-events": "Ethereum voqealari", "ethereum-foundation": "Ethereum Foundation", @@ -45,6 +86,8 @@ "ethereum-glossary": "Ethereum lug'ati", "ethereum-governance": "Ethereum boshqaruvi", "ethereum-logo": "Ethereum logotipi", + "ethereum-roadmap": "Ethereum yoʻl xaritasi", + "ethereum-protocol": "Etereum protokoli", "ethereum-security": "Ethereum xavfsizligi va firibgarlikning oldini olish", "ethereum-support": "Ethereum yordam xizmati", "ethereum-wallets": "Ethereum Hamyonlar", @@ -55,19 +98,26 @@ "feedback-card-prompt-tutorial": "Qoʻllanma foydali boʻldimi?", "feedback-widget-thank-you-title": "Fikr-mulohazangiz uchun rahmat!", "feedback-widget-thank-you-subtitle": "Bir qancha savollarga javob berib, bu sahifani yanada yaxshilang.", - "feedback-widget-thank-you-subtitle-ext": "Sizga yordam kerak boʻlsa, Discord sahifamiz orqali hamjamiyatimiz bilan aloqaga chiqing.", + "feedback-widget-thank-you-subtitle-ext": "Agar sizga yordam kerak boʻlsa, bizning Discord orqali hamjamiyat bilan bogʻlanishingiz mumkin.", "feedback-widget-thank-you-timing": "2–3 daq", "feedback-widget-thank-you-cta": "Qisqa soʻrovnomani ochish", "find-wallet": "Hamyonni topish", + "future-proofing": "Kelajakka tayyorlik", "get-eth": "ETH olish", "get-involved": "Ishtirok etish", "get-started": "Boshlang", "grants": "Grantlar", "grant-programs": "Ekotizim grant dasturlari", - "guides-and-resources": "Hamjamiyat qoʻllanmalari va resurslari", + "guides": "Qoʻllanmalar", + "guides-hub": "Qo'llanmalar", "history-of-ethereum": "Ethereum tarixi", "home": "Bosh sahifa", "how-ethereum-works": "Ethereum qanday ishlaydi", + "how-to-create-an-ethereum-account": "Ethereum hisobini qanday \"yaratish\" mumkin", + "how-to-revoke-token-access": "Kripto mablagʻlaringizga aqlli shartnoma kirishini qanday bekor qilish mumkin", + "how-to-swap-tokens": "Tokenlarni qanday almashtirish mumkin", + "how-to-use-a-bridge": "Tokenlarni 2-qatlamga qanday ulash mumkin", + "how-to-use-a-wallet": "Hamyonni qanday ishlatish mumkin", "image": "rasm", "in-this-section": "Bu bo'limda", "individuals": "Jismoniy shaxslar", @@ -81,6 +131,7 @@ "layer-2": "Qatlam 2", "learn": "O'rganish", "learn-by-coding": "Kodlash orqali bilib oling", + "learn-hub": "Oʻrganish markazi", "learn-menu": "Oʻrganish menyusi", "learn-more": "Ko'proq ma'lumot olish", "less": "Kamroq", @@ -89,42 +140,160 @@ "loading": "Yuklanmoqda...", "loading-error": "Yuklashda xatolik.", "loading-error-refresh": "Xatolik yuz berdi, yangilang.", + "loading-error-try-again-later": "Ma'lumotlarni yuklash imkonsiz. Yana bir harakat qilib ko'ring.", "logo": "logotip", "mainnet-ethereum": "Mainnet Ethereum", - "more": "Yana", - "nav-developers": "Ishlab chiquvchilar", + "merge": "Birlashtirish", + "more": "Ko'proq", + "nav-about-description": "Ethereum jamiyati uchun ochiq kodli jamoatchilik loyihasi", + "nav-advanced-description": "Murakkabroq mavzularni oʻrganing", + "nav-advanced-label": "Kengaytirilgan", + "nav-basics-description": "Ethereum asoslarini tushuning", + "nav-basics-label": "Asoslar", + "nav-bridges-description": "Web3 asosiy L1 blokcheynlari va L2 masshtablash yechimlari ekotizimiga aylandi.", + "nav-builders-home-description": "Ethereum quruvchilarining qoʻllanmasi – quruvchilardan quruvchilar uchun", + "nav-builders-home-label": "Quruvchi bosh sahifasi", + "nav-contribute-description": "Agar yordam bermoqchi boʻlsangiz, sizga bu yoʻl koʻrsatadi", + "nav-contribute-label": "Ethereum.org saytiga hissa qoʻshing", + "nav-dao-description": "Markazlashgan idoraga ega boʻlmagan aʼzolarga tegishli jamoalar", + "nav-dapps-description": "Ethereum ishlatadigan ilovalarning boy ekotizimini kashf eting", + "nav-defi-description": "Anʼanaviy moliya bozoriga global, ochiq muqobil", + "nav-desci-description": "Hozirgi ilmiy tizimga global, ochiq muqobil", + "nav-desoc-description": "Ijtimoiy aloqa va kontent yaratish uchun blokcheynga asoslangan platformalar", "nav-developers-docs": "Dasturchilar uchun hujjatlar", + "nav-developers": "Ishlab chiquvchilar", + "nav-did-description": "Noyob markazlashmagan identifikatorlaringizni chiqaring va ularga egalik qiling", + "nav-docs-description": "Ethereumni tushunish va qurishga yordam beradigan hujjatlar", + "nav-docs-design-description": "Noyob web3 dizayn muammolari, eng yaxshi amaliyotlar va foydalanuvchi tadqiqotlari tushunchalarining tavsifi", + "nav-docs-design-label": "UX/UI dizayn asoslari", + "nav-docs-foundation-description": "Ethereumda ishlab chiqish uchun asosiy asoslar", + "nav-docs-foundation-label": "Asosiy mavzular", + "nav-docs-overview-description": "Dasturchi hujjatlari uchun bosh sahifa", + "nav-docs-stack-description": "Ethereum stekining barcha tafsilotlarini tushuning", + "nav-docs-stack-label": "Ethereum stack", + "nav-eip-description": "Yangi xususiyatlar yoki jarayonlarni belgilaydigan standartlar", + "nav-eip-label": "Ethereumni yaxshilash takliflari (EIP)", + "nav-emerging-description": "Ethereumdan boshqa sohalarda foydalanishni bilib oling", + "nav-enterprise-description": "Ethereum uchun biznes ilovalar", + "nav-ethereum-org-description": "Bu veb-sayt hamjamiyat tomonidan yaratilgan – bizga qoʻshiling va hissa qoʻshing", + "nav-ethereum-wallets-description": "Ethereum hisobingiz bilan ishlash uchun ilova", + "nav-events-description": "Markazsizlashtirish va har kim uchun ishtirok etish erkinligi", + "nav-events-irl-description": "Har oyda yuz beradigan katta Ethereum yuzma-yuz va onlayn tadbirlari", + "nav-events-label": "Jamoalar va tadbirlar", + "nav-events-online-description": "Bu onlayn hamjamiyatlarda yuz minglab Ethereum ishqibozlari jamlangan", + "nav-find-wallet-description": "Hamyonlar kripto ishlatish imkonini beradi", + "nav-find-wallet-label": "Hamyoningizni tanlang", + "nav-gas-fees-description": "ETH tranzaksiya toʻlovlari qanday hisoblanadi", + "nav-get-eth-description": "Ethereum ilovalaridan foydalanish uchun sizga efir (ETH) kerak", + "nav-get-started-description": "Ethereumdan foydalanish uchun birinchi qadamlaringiz", + "nav-governance-description": " Ethereum protokolini yangilash bilan bogʻliq jarayon", + "nav-governance-label": "Boshqaruv", + "nav-grants-description": "Hamjamiyatimiz tomonidan grant moliyalashtirish dasturlarini taqdim etuvchi loyihalar boʻyicha tuzilgan roʻyxat", + "nav-guide-create-account-description": "Har kim xohlagan vaqtda, hamyon ilovasi bilan bepul Ethereum hisobini yaratishi mumkin", + "nav-guide-create-account-label": "Ethereum hisobini qanday yaratish mumkin", + "nav-guide-revoke-access-description": "Ethereum ekotizimidagi smart shartnomalar va ilovalar bilan ishlashda xavfsiz qoling", + "nav-guide-revoke-access-label": "Qanday qilib smart shartnomaga kirish ruxsatini bekor qilish mumkin", + "nav-guide-use-wallet-description": "Hamyonning barcha asosiy funksiyalarini qanday boshqarishni bilib oling", + "nav-guide-use-wallet-label": "Hamyonni qanday ishlatish mumkin", + "nav-guides-description": "Ishni boshlashga yordam beradigan amaliy koʻrsatmalar", + "nav-guides-label": "Yoʻriqnomalar", + "nav-history-description": "Barcha asosiy yoʻnalishlar va yangilanishlar xronologiyasi", + "nav-history-label": "Ethereumning texnik tarixi", + "nav-layer-2-description": "Ethereum uchun arzonroq va tezroq bitimlar", + "nav-learn-by-coding-description": "Ethereum bilan tajriba qilishga yordam beradigan vositalar", + "nav-local-env-description": "Ethereum ishlab chiqish stekini tanlang va sozlang", + "nav-mainnet-description": "Enterprise blokcheyn ilovalari ommaviy Ethereum Mainnetʼda qurilishi mumkin", + "nav-nft-description": "Ethereumga asoslangan aktiv sifatida noyob narsalarni koʻrsatish usuli", + "nav-open-research-description": "Ethereumning asosiy kuchli tomonlaridan biri uning faol tadqiqot hamjamiyatidir", + "nav-open-research-label": "Ochiq tadqiqot", + "nav-overview-description": "Ethereum saboqlariga oid hamma narsa", + "nav-participate-overview-description": "Qanday ishtirok etish haqida axborot", "nav-primary": "Asosiy", + "nav-quizzes-description": "Ethereum va kriptovalyutalarni qanchalik yaxshi tushunganingizni bilib oling", + "nav-quizzes-label": "Bilimingizni sinab koʻring", + "nav-refi-description": "Muqobil iqtisodiy tizim regenerativ tamoyillarga asoslanadi", + "nav-research-description": "Ethereumni yaxshilash uchun ishlatiladigan jarayonlar", + "nav-research-label": "Izlanish va rivojlanish", + "nav-roadmap-description": "Ethereum uchun koʻproq miqyoslilik, xavfsizlik va barqarorlikka yoʻl", + "nav-roadmap-future-description": "Ethereumni mustahkam va markazlashmagan tarmoq sifatida mustahkamlash", + "nav-roadmap-future-label": "Kelajakka tayyorlik", + "nav-roadmap-label": "Yoʻl xaritasi", + "nav-roadmap-scaling-description": "Tranzaksiya xarajatlari va tezligini yanada kamaytirish uchun tarmoq yangilanishi", + "nav-roadmap-security-description": "Ethereum kelajakdagi barcha turdagi hujumlarga chidamli boʻlishiga ishonch hosil qilish", + "nav-roadmap-security-label": "Takomillashgan xavfsizlik", + "nav-roadmap-ux-description": "Ethereumdan foydalanishni soddalashtirish kerak", + "nav-run-a-node-description": "Tarmoq xavfsizligini taʼminlashda toʻliq suveren boʻling", + "nav-security-description": "Kriptovalyutadan foydalanishning eng yaxshi amaliyotlarini bilib oling", + "nav-smart-contracts-description": "Ethereum ekotizimining asosiy qurilish bloklari", + "nav-stablecoins-description": "Stablecoins – bu belgilangan qiymatda qolish uchun moʻljallangan Ethereum tokenlari", + "nav-stake-description": "Ethereumni himoya qilganingiz uchun mukofot oling", + "nav-stake-label": "Manfaat", + "nav-staking-home-description": "Ishtirok etish uchun turli xil variantlarning umumiy koʻrinishi", + "nav-staking-pool-description": "Boshqalar bilan kuchlarni birlashtirib, istalgan miqdordagi ETH bilan stavka oling va mukofot oling", + "nav-staking-pool-label": "Birlashtirilgan steyking", + "nav-staking-saas-label": "Steyking xizmat sifatida", + "nav-staking-solo-label": "Yakka steyking", + "nav-start-building-description": "Yangi qoʻshilganlar uchun foydali maʼlumotlar", + "nav-translation-program-description": "Ethereum.org saytini barcha tillarga tarjima qilishda hamkorlik", + "nav-tutorials-description": "Hamjamiyat qoʻllanmalari tanlangan roʻyxati", + "nav-use-cases-description": "Ethereumdan foydalanish uchun turli gʻoyalarni kashf eting", + "nav-what-is-ether-description": "Ethereum ilovalarining valyutasi", + "nav-what-is-ethereum-description": "Ethereumni nima maxsus qilishini tushuning", + "nav-what-is-web3-label": "Web3 nima?", + "nav-what-is-web3-description": "Qoidalarni belgilovchi markazlashgan monopoliyalarga muqobil", + "nav-whitepaper-description": "Asl Ethereum bayonnomasi 2014-yilda Vitalik Buterin tomonidan yozilgan", + "nav-zkp-description": "Bayonotning oʻzini oshkor qilmasdan, uning toʻgʻriligini isbotlash usuli", + "nft-page": "NFT - Unikal tokenlar", + "nfts": "NFTlar", "no": "Yo'q", "on-this-page": "Bu sahifada", "open-research": "Ochiq tadqiqot", + "page-developers-aria-label": "Dasturchilar menyusi", + "page-index-meta-title": "Bosh sahifa", "page-last-updated": "Sahifa oxirgi marta yangilandi", + "participate-menu": "Ishtirok menyusi", + "pbs": "Maslahatchi-tuzuvchini ajratish", + "pools": "Birlashtirilgan steyking", "privacy-policy": "Maxfiylik Siyosati", "private-ethereum": "Xususiy Ethereum", + "product-disclaimer": "Mahsulotlar va xizmatlar Ethereum hamjamiyati uchun qulaylik maqsadida keltirilgan. Mahsulot yoki xizmatning kiritilishiethereum.org veb-sayti jamoasi yoki Ethereum Foundation tomonidan tasdiqlanishini bildirmaydi.", + "quizzes-title": "Viktorina markazi", + "quizzes": "Viktorinalar", "refresh": "Sahifani yangilang.", "return-home": "bosh sahifaga qaytish", + "roadmap": "Ethereum yoʻl xaritasi", + "research": "Tadqiqot", + "research-menu": "Tadqiqot menyusi", + "resources": "Tarjima resurslari", "run-a-node": "Tugunni ishga tushiring", "rollup-component-website": "Veb-sayt", "rollup-component-developer-docs": "Dasturchilar uchun hujjatlar", "rollup-component-technology-and-risk-summary": "Xatarlar xulosasi va texnologiyalar", + "scaling": "Scaling", + "saas": "Steyking xizmat sifatida", "search": "Qidiruv", + "search-ethereum-org": "Ethereum.org qidirish", + "secret-leader-election": "Yashirin yetakchi saylovi", "search-box-blank-state-text": "Qidiring!", "search-eth-address": "Bu Ethereum manziliga o'xshaydi. Biz manzillarga xos ma'lumotlarni taqdim etmaymiz. Bu kabi blok explorerdan qidirib ko'ring", "search-no-results": "Qidiruv natija bermadi", + "security": "Xavfsizlik", + "single-slot-finality": "Bir slotli yakun", + "statelessness": "Fuqarosizlik", "see-contributors": "Hissadorlarni ko'ring", - "set-up-local-env": "Mahalliy muhitni sozlash", + "set-up-local-env": "Mahalliy muhitni o'rnating", "sharding": "Sharding", "show-all": "Hammasi", "show-less": "Kamroq", "site-description": "Ethereum - bu pul va yangi turdagi dasturlar uchun global, markazlashmagan platforma. Ethereum-da siz pulni boshqaradigan kod yozishingiz va dunyoning istalgan nuqtasida mavjud bo'lgan dasturlarni yaratishingiz mumkin.", - "site-title": "ethereum.org", "skip-to-main-content": "Asosiy tarkibga o'tish", "smart-contracts": "Aqlli shartnomalar", "stablecoins": "Stablecoins", + "stake-eth": "ETH ulushi", "staking": "Steyking", + "start-here": "Shu yerdan boshlang", "solo": "Yakka steyking", - "saas": "Steyking xizmat sifatida", - "pools": "Birlashtirilgan steyking", + "support": "Qo'llab-quvvatlash", "terms-of-use": "Foydalanish shartlari", "translation-banner-body-new": "Sahifani ingliz tilida ko'rmoqdasiz, chunki hali tarjima qilmaganmiz. Bu kontentni tarjima qilishda yordam bering.", "translation-banner-body-update": "Bu sahifaning yangi versiyasi mavjud, ammo hozirda faqat ingliz tilida. Oxirgi versiyasini tarjima qilishda yordam bering.", @@ -135,22 +304,23 @@ "translation-banner-no-bugs-title": "Xatolar topilmadi!", "translation-banner-no-bugs-content": "Bu sahifa hozir tarjima qilinmaydi. Hozircha bu sahifani inglizchada qoldiramiz.", "translation-banner-no-bugs-dont-show-again": "Koʻrsatilmasin", + "translation-program": "Tarjima dasturi", "try-using-search": "Izlayotganingizni topish uchun qidiruvdan foydalaning yoki", "tutorials": "Darsliklar", + "up": "Tepaga", + "use": "Foydalanish", "use-ethereum": "Ethereum-dan foydalaning", "use-ethereum-menu": "Ethereum ishlatish menyusi", + "use-menu": "Foydalanish menyusi", + "user-experience": "Foydalanuvchi tajribasi", + "verkle-trees": "Verkle tarmoqlari", "wallets": "Hamyonlar", "we-couldnt-find-that-page": "Bu sahifa topilmadi", "web3": "Web3 nima?", "website-last-updated": "Sahifa oxirgi marta yangilandi", - "what-is-ether": "Ether (ETH) nima?", + "what-is-ether": "Ether (ETH) bu nima?", "what-is-ethereum": "Ethereum bu nima?", - "defi-page": "DeFi - Markazlashmagan moliya", - "dao-page": "DAO - Markazlashmagan avtonom tashkilotlar", - "nft-page": "NFT - Unikal tokenlar", - "decentralized-social-networks": "Markazlashmagan ijtimoiy tarmoqlar", - "decentralized-identity": "Markazlashmagan identifikatsiya", + "withdrawals": "Staking yechib olish", "yes": "Ha", - "zero-knowledge-proofs": "Zero-knowledge proofs", - "page-index-meta-title": "Bosh sahifa" + "zero-knowledge-proofs": "Nol bilim bilan isbotlashlar" } From 47ff3fb09ce9a128bfe029f282fa3ced232ea437 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 12:51:51 -0800 Subject: [PATCH 422/478] i18n: import latest common.json from Crowdin Locales: ar, az, bg, bn, cs, de, el, es, fr, hu, id, it, ja, kk, ne-np, pl, zh, zh-tw --- src/intl/ar/common.json | 2 - src/intl/az/common.json | 176 ++++++++++++++++++++++++------- src/intl/bg/common.json | 16 --- src/intl/bn/common.json | 3 +- src/intl/cs/common.json | 5 - src/intl/hu/common.json | 1 - src/intl/it/common.json | 3 + src/intl/ja/common.json | 1 - src/intl/kk/common.json | 208 +++++++++++++++++++++++++++++++++---- src/intl/ne-np/common.json | 141 ++++++++++++++++++++----- src/intl/pl/common.json | 4 - src/intl/zh-tw/common.json | 3 +- 12 files changed, 440 insertions(+), 123 deletions(-) diff --git a/src/intl/ar/common.json b/src/intl/ar/common.json index 48e08671636..a2d7a8899a7 100644 --- a/src/intl/ar/common.json +++ b/src/intl/ar/common.json @@ -244,7 +244,6 @@ "nav-translation-program-description": "جهد تعاوني لترجمة موقع ethereum.org إلى جميع اللغات", "nav-tutorials-description": "قائمة منسقة من تعليمات الاستخدام المجتمعية", "nav-use-cases-description": "اكتشف أفكارًا مختلفة لاستخدام إيثريوم", - "nav-use-cases-label": "Use cases", "nav-what-is-ether-description": "عملة تطبيقات إيثريوم", "nav-what-is-ethereum-description": "فهم ما يميز إيثريوم", "nav-what-is-web3-label": "ما هو Web3؟", @@ -303,7 +302,6 @@ "stake-eth": "تجميد عملات إثير", "staking": "تجميد العملات", "start-here": "البدء من هنا", - "style-guide": "Style guide", "solo": "تجميد العملات الفردي", "support": "الدعم", "terms-of-use": "شروط الاستخدام", diff --git a/src/intl/az/common.json b/src/intl/az/common.json index 75ad893b5d8..9ef53e6a892 100644 --- a/src/intl/az/common.json +++ b/src/intl/az/common.json @@ -5,23 +5,24 @@ "adding-developer-tools": "Tərtibatçı Alətlərinin əlavə edilməsi", "adding-exchanges": "Mübadilələrin əlavə edilməsi", "adding-glossary-terms": "Lüğət Şərtlərinin əlavə edilməsi", - "adding-layer-2s": "Adding Layer 2s", - "adding-products": "Adding Products", - "adding-staking-products": "Staking Məhsullarının əlavə edilməsi", - "adding-wallets": "Pulqablarının əlavə edilməsi", + "adding-staking-products": "Payçı məhsulların əlavə edilməsi", + "adding-wallets": "Pul kisələrinin əlavə edilməsi", "account-abstraction": "Hesab abstraksiyası", "acknowledgements": "Təsdiqlər", "aria-toggle-search-button": "Axtarış düyməsini aç/bağla", "aria-toggle-menu-button": "Menyu düyməsini aç/bağla", "beacon-chain": "İşarə (Beacon) zənciri", "bridges": "Blockchain körpüləri", + "bug-bounty": "Xəta bonusu", + "build": "Yarat", + "build-menu": "Yaratma menyusu", "clear": "Təmizlə", "close": "Bağla", "community": "İcma", "community-hub": "İcma mərkəzi", "community-menu": "İcma Menyusu", "contact": "Əlaqə", - "content-buckets": "Məzmun Kovaları", + "content-buckets": "Məzmun qutuları", "content-resources": "Məzmun Resursları", "content-standardization": "Məzmun standartlaşdırılması", "contributing": "Töhfələr", @@ -31,13 +32,14 @@ "copied": "Kopyalandı", "copy": "Kopyala", "danksharding": "Dankşardinq", - "dao-page": "DAO - Mərkəzləşdirilməmiş muxtar təşkilatlar", + "dao-page": "DAO - Mərkəzləşdirilməmiş yerli təşkilatlar", "dark-mode": "Tünd", "data-provided-by": "Məlumat mənbəyi:", "decentralized-applications-dapps": "Dapps - Mərkəzləşdirilməmiş tətbiqlər", - "decentralized-identity": "Mərkəzləşdirilməmiş şəxsiyyət", + "decentralized-identity": "Mərkəzləşdirilməmiş eynilik", "decentralized-social-networks": "Mərkəzləşdirilməmiş sosial şəbəkələr", "decentralized-science": "DeSci - Mərkəzləşdirilməmiş elm", + "description": "Naviqasiya elementi üçün təsvir", "defi-page": "DeFi - Mərkəzləşdirilməmiş maliyyə", "design": "Dizayn", "design-principles": "Dizayn Prinsipləri", @@ -72,8 +74,7 @@ "enterprise-menu": "Müəssisə Menyu", "esp": "Ekosistemə Dəstək Proqramı", "eth-current-price": "Cari ETH qiyməti (USD)", - "ethereum-basics": "Ethereum basics", - "ethereum-bug-bounty": "Ethereum baq mükafatı proqramı", + "ethereum-bug-bounty": "Ethereum bug bounty proqramı", "consensus-when-shipping": "Nə vaxt göndərilir?", "ethereum-upgrades": "Ethereum yenilənmələri", "ethereum-brand-assets": "Ethereum brend aktivləri", @@ -88,15 +89,15 @@ "ethereum-protocol": "Ethereum protokolu", "ethereum-security": "Ethereum təhlükəsizliyi və saxtakarlığın qarşısının alınması", "ethereum-support": "Ethereum dəstəyi", - "ethereum-wallets": "Ethereum pull kisəsi", - "ethereum-whitepaper": "Ethereum Ağ Sənədi", + "ethereum-wallets": "Ethereum pulqabısı", + "ethereum-whitepaper": "Ethereum üzrə texniki sənəd", "feedback-widget-prompt": "Bu səhifə faydalıdır?", "feedback-card-prompt-page": "Bu səhifə faydalı oldu?", "feedback-card-prompt-article": "Bu məqalə faydalı oldu?", "feedback-card-prompt-tutorial": "Bu təlimat faydalı oldu?", - "feedback-widget-thank-you-title": "Rəyə görə təşəkkür edirik!", + "feedback-widget-thank-you-title": "Rəyiniz üçün təşəkkür edirik!", "feedback-widget-thank-you-subtitle": "Bir neçə sualı cavablandırmaqla bu səhifəni daha da yaxşılaşdırın.", - "feedback-widget-thank-you-subtitle-ext": "Köməyə ehtiyacınız varsa, bizim səhifəmizdə icma ilə əlaqə saxlaya bilərsiniz: Discord.", + "feedback-widget-thank-you-subtitle-ext": "Əgər köməyə ehtiyacınız varsa, Discord vasitəsilə icma ilə əlaqə saxlaya bilərsiniz.", "feedback-widget-thank-you-timing": "2-3 dəqiqə", "feedback-widget-thank-you-cta": "Qısa sorğunu aç", "find-wallet": "Pulqabı tap", @@ -107,15 +108,14 @@ "grants": "Qrantlar", "grant-programs": "Ekosistem dəstək proqramları", "guides": "Bələdçilər", - "guides-hub": "Bələdçi mərkəzi", + "guides-hub": "Təlimatlar", "history-of-ethereum": "Ethereumun tarixi", "home": "Əsas səhifə", "how-ethereum-works": "Ethereumun işləmə prinsipi", - "how-to-create-an-ethereum-account": "How to \"create\" an Ethereum account", "how-to-revoke-token-access": "Kriptofondlarınıza ağıllı müqavilə girişini necə ləğv etmək olar", "how-to-swap-tokens": "Tokenləri necə dəyişmək olar", "how-to-use-a-bridge": "Tokenləri 2-ci Qrupla necə əlaqələndirmək olar", - "how-to-use-a-wallet": "Pulqabını necə istifadə etmək olar", + "how-to-use-a-wallet": "Pul kisəsindən necə istifadə etmək olar", "image": "şəkil", "in-this-section": "Bu bölmədə", "individuals": "Fərdlər", @@ -128,25 +128,118 @@ "last-edit": "Son redaktə", "layer-2": "2-ci Qrup", "learn": "Öyrən", - "learn-by-coding": "Kodlaşdırma yolu ilə öyrən", + "learn-by-coding": "Kodlaşdırma ilə öyrənin", "learn-hub": "Öyrənmə mərkəzi", "learn-menu": "Menyunu öyrən", "learn-more": "Daha ətraflı", "less": "Daha az", "light-mode": "İşıq", - "listing-policy-disclaimer": "Bu səhifədə sadalanan məhsullar rəsmi tövsiyələr olmamaqla yanaşı, sadəcə məlumat məqsədi üçün nəzərdə tutulub. Məhsul əlavə etmək və ya bu siyasətlə bağlı rəy bildirmək istəyirsinizsə, GitHub-da bununla bağlı məsələ qaldırın.", + "listing-policy-disclaimer": "Bu səhifədə sadalanan bütün məhsullar rəsmi tövsiyələr olmamaqla yanaşı, sadəcə məlumat məqsədi üçün nəzərdə tutulub. Məhsul əlavə etmək və ya bu siyasətlə bağlı rəy bildirmək istəyirsinizsə, GitHub-da bununla bağlı məsələ qaldırın.", "loading": "Yüklənilir...", "loading-error": "Yükləmə xətası.", "loading-error-refresh": "Xəta, lütfən yeniləyin.", "loading-error-try-again-later": "Datanı yükləmək alınmadı. Biraz sonra yenidən cəhd edin.", - "logo": "logo", + "logo": "loqo", "mainnet-ethereum": "Mainnet Ethereum", "merge": "Birləşdirmə", "more": "Daha çox", - "nav-developers": "Tərtibatçılar", + "nav-about-description": "Ethereum icması üçün ictimai, açıq mənbə layihəsi", + "nav-advanced-description": "Daha mürəkkəb mövzuları öyrənin", + "nav-advanced-label": "Təkmilləşmiş", + "nav-basics-description": "Ethereum-un əsaslarını anlayın", + "nav-basics-label": "Əsaslar", + "nav-bridges-description": "Web3 təməl L1 blokçeynləri və L2 genişləmə həlləri üçün ekosistemə çevrilib", + "nav-builders-home-description": "Ethereum üçün yaradıcı təlimatı. Yaradıcılar tərəfindən yaradıcılar üçün", + "nav-builders-home-label": "Yaradıcının əsas səhifəsi", + "nav-contribute-description": "Kömək etmək istəyirsinizsə, bu sizi yönləndirəcək", + "nav-contribute-label": "ethereum.org saytına töhfə et", + "nav-dao-description": "Mərkəzləşdirilmiş rəhbərliyi olmayan üzvlərə məxsus icmalar", + "nav-dapps-description": "Ethereum-dan istifadə edərək tətbiqlərin zəngin ekosistemini araşdırın", + "nav-defi-description": "Ənənəvi maliyyə bazarının qlobal, açıq alternativi", + "nav-desci-description": "Hazırkı elmi sistemin qlobal, açıq alternativi", + "nav-desoc-description": "Sosial qarşılıqlı əlaqə və məzmun yaradılması üçün blokçeyn əsaslı platformalar", "nav-developers-docs": "Tərtibatçı sənədləri", + "nav-developers": "Tərtibatçılar", + "nav-did-description": "Unikal mərkəzləşdirilməmiş eyniləşdiricilərinizi yaradın və sahib olun", + "nav-docs-description": "Ethereum-u anlamaq və qurmağınıza kömək edəcək sənədlər", + "nav-docs-design-description": "Unikal web3 dizayn çətinliklərinin, qabaqcıl təcrübələrin və istifadəçi araşdırması nəticələrinin təsviri", + "nav-docs-design-label": "UX/UI dizayn əsasları", + "nav-docs-foundation-description": "Ethereum-da inkişaf etmək üçün əsaslar", + "nav-docs-overview-description": "Tərtibatçı sənədləri üçün mərkəz", + "nav-docs-stack-description": "Ethereum platformasının bütün təfərrüatlarını anlayın", + "nav-eip-description": "Yeni xüsusiyyətləri və ya prosesləri müəyyən edən standartlar", + "nav-eip-label": "Ethereum təkmilləşdirmə təklifləri (EIP-lər)", + "nav-emerging-description": "Ethereum-un digər daha yeni istifadə halları barədə öyrənin", + "nav-enterprise-description": "Ethereum üçün biznes tətbiqləri", + "nav-ethereum-org-description": "Bu vebsayt icma tərəfindən idarə edilir—bizə qoşulun və öz töhfənizi verin", + "nav-ethereum-wallets-description": "Ethereum hesabınızla əlaqədə olmaq üçün tətbiq", + "nav-events-description": "Hər kəs üçün mərkəzləşdirilməmiş və sərbəst iştirak imkanı", + "nav-events-irl-description": "Hər ay Ethereum ilə bağlı geniş canlı və onlayn tədbirlər keçirilir", + "nav-events-label": "İcmalar və tədbirlər", + "nav-events-online-description": "Yüz minlərlə Ethereum entuziastı bu onlayn icmalarda birləşir", + "nav-find-wallet-description": "Cüzdanlar sizə kriptovalyutadan istifadə etmək imkanı verir", + "nav-find-wallet-label": "Cüzdan seç", + "nav-gas-fees-description": "ETH tranzaksiya haqları necə hesablanır", + "nav-gas-fees-label": "Qaz haqları", + "nav-get-eth-description": "Ethereum tətbiqlərindən istifadə etmək üçün sizə ether (ETH) lazımdır", + "nav-get-started-description": "Ethereum-dan istifadə edilməsində ilk addımlarınız", + "nav-governance-description": "Ethereum protokolunun təkmilləşdirilməsinin həyata keçirildiyi proses", + "nav-governance-label": "İdarəçilik", + "nav-grants-description": "Qrant maliyyələşdirmə proqramlarını təmin edən layihələrin icmamız tərəfindən seçilmiş siyahısı", + "nav-guide-create-account-description": "Hər kəs istənilən vaxt cüzdan tətbiqi ilə pulsuz Ethereum hesabı yarada bilər", + "nav-guide-revoke-access-description": "Ethereum ekosistemindəki ağıllı müqavilələr və tətbiqlər ilə qarşılıqlı əlaqə zamanı təhlükəsizliyinizi təmin edin", + "nav-guide-revoke-access-label": "Ağıllı müqaviləyə çıxışı necə ləğv etmək olar", + "nav-guide-use-wallet-description": "Cüzdanın bütün əsas funksiyalarının işlədilməsi qaydasını öyrənin", + "nav-guide-use-wallet-label": "Pul kisəsindən necə istifadə etmək olar", + "nav-guides-description": "Başlamanıza kömək etmək üçün təfərrüatlı təlimat", + "nav-guides-label": "Təlimat", + "nav-history-description": "Bütün əsas şaxələnmələr və yeniləmələrin qrafiki", + "nav-history-label": "Ethereum-un texnoloji tarixçəsi", + "nav-layer-2-description": "Ethereum üçün daha ucuz və daha sürətli tranzaksiyalar", + "nav-learn-by-coding-description": "Ethereum-u sınamanıza kömək edən alətlər", + "nav-local-env-description": "Ethereum inkişaf platformanızı seçin və quraşdırın", + "nav-mainnet-description": "Ethereum-un əsas ictimai şəbəkəsində qurula biləcək olan Müəssisə blokçeyn tətbiqləri", + "nav-nft-description": "Unikal olan hər bir şeyin Ethereum əsaslı aktiv kimi təqdim edilmə yolu", + "nav-open-research-description": "Ethereum-un əsas güclü tərəflərindən biri onun fəal tədqiqat icmasıdır", + "nav-open-research-label": "Açıq araşdırma", + "nav-overview-description": "Ethereum təlimləri ilə bağlı bütün məlumatlar", + "nav-participate-overview-description": "İştirak etmə qaydalarına ümumi baxış", "nav-primary": "Əsas", - "nft-page": "NFTs - Bir-birini əvəz edə bilməyən nişanlar", + "nav-quizzes-description": "Ethereum və kriptovalyutanı nə dərəcədə yaxşı anladığınızı öyrənin", + "nav-quizzes-label": "Biliyinizi yoxlayın", + "nav-refi-description": "Regenerativ prinsiplər üzərində qurulmuş alternativ iqtisadi sistem", + "nav-research-description": "Ethereum-u təkmilləşdirmək üçün istifadə olunan prorseslər", + "nav-research-label": "Tədqiqat və inkişaf", + "nav-roadmap-description": "Ethereum üçün genişlənmə, təhlükəsizlik və dayanıqlılığa gedən yol", + "nav-roadmap-future-description": "Ethereum-un etibarlı və mərkəzləşdirilməmiş şəbəkə kimi gücləndirilməsi", + "nav-roadmap-future-label": "Gələcəyin planlaşdırılması", + "nav-roadmap-label": "Tədbir planı", + "nav-roadmap-scaling-description": "Tranzaksiya xərclərini daha da azaltmaq üçün şəbəkə və sürət yeniləmələri", + "nav-roadmap-security-description": "Gələcəkdə Ethereum-un hər cür hücuma qarşı dayanıqlılığının təmin edilməsi", + "nav-roadmap-security-label": "Təkmilləşdirilmiş təhlükəsizlik", + "nav-roadmap-ux-description": "Ethereum-dan istifadə sadələşdirilməlidir", + "nav-run-a-node-description": "Şəbəkənin təhlükəsizliyinin təmin edilməsinə kömək edərkən tamamilə müstəqil ol", + "nav-security-description": "Kriptovalyutadan istifadə edərkən qabaqcıl təcrübələr barədə öyrənin", + "nav-smart-contracts-description": "Ethereum ekosisteminin təməl komponentləri", + "nav-stablecoins-description": "Steyblkoynlar (stablecoin) sabit dəyərdə qalmaq üçün nəzərdə tutulmuş Ethereum tokenləridir", + "nav-stake-description": "Ethereum-un təhlükəsizliyinin təmin edilməsi üçün mükafatlar qazanın", + "nav-stake-label": "Pay", + "nav-staking-home-description": "Pay yerləşdirmə üçün müxtəlif variantların icmalı", + "nav-staking-pool-description": "Başqaları ilə qoşularaq payınızla iştirak edin və istənilən ETH məbləği ilə mükafatlar qazanın", + "nav-staking-pool-label": "Birləşdirilmiş paylar", + "nav-staking-saas-label": "Xidmətlə pay yatırmaq", + "nav-staking-solo-label": "Solo payçılıq", + "nav-start-building-description": "Yeni başlayanlar üçün faydalı məlumat", + "nav-translation-program-description": "ethereum.org saytının bütün dillərə tərcümə edilməsi üçün birgə səy", + "nav-tutorials-description": "İcma təlimatlarının seçilmiş siyahısı", + "nav-use-cases-description": "Ethereum-un istifadəsi üçün fərqli ideyalar kəşf edin", + "nav-what-is-ether-description": "Ethereum tətbiqlərinin valyutası", + "nav-what-is-ethereum-description": "Ethereum-u xüsusi edən məqamları anlayın", + "nav-what-is-web3-label": "Web3 nədir?", + "nav-what-is-web3-description": "Qaydaları diktə edən mərkəzləşdirilməmiş monopoliyaların alternativi", + "nav-whitepaper-description": "Vitalik Buterin tərəfindən 2014-cü ildə yazılmış ilk Ethereum texniki məlumat sənədi", + "nav-zkp-description": "Bəyanatın özünü açıqlamadan onun hüquqi qüvvəsini sübut etmə yolu", + "nft-page": "NFTs - Bir-birini əvəz edə bilməyən tokenlər", "nfts": "NFT-lər", "no": "Xeyr", "on-this-page": "Bu səhifədə", @@ -154,54 +247,55 @@ "page-developers-aria-label": "Tərtibatçı menyusu", "page-index-meta-title": "Əsas səhifə", "page-last-updated": "Səhifə ən son yeniləndi", + "participate-menu": "İştirak menyusu", "pbs": "Təklif edən-qurucu ayrılması", - "pools": "Birləşdirilmiş steykinq", - "privacy-policy": "Gizlilik siyasəti", + "pools": "Birləşdirilmiş paylar", + "privacy-policy": "Məıxfilik siyasəti", "private-ethereum": "Şəxsi Ethereum", - "product-disclaimer": "Məhsullar və xidmətlər Ethereum icmasının rahatlığı üçün siyahıya alınmışdır. Məhsul və ya xidmətin daxil edilməsi, ethereum.org veb-sayt komandası və ya Ethereum Fondu tərəfindənonun təsdiqləndiyi demək deyil.", + "product-disclaimer": "Məhsullar və xidmətlər Ethereum icmasının rahatlığı üçün siyahıya alınmışdır. Məhsul və ya xidmətin daxil edilməsi, ethereum.org veb-sayt komandası və ya Ethereum Fondu tərəfindən onun təsdiqləndiyi demək deyil.", "quizzes-title": "Sorğu-sual şəbəkəsi", "quizzes": "Sorğu-suallar", "refresh": "Səhifəni yeniləyin.", "return-home": "əsas səhifəyə qayıdın", "roadmap": "Ethereum planlama xəritəsi", + "research": "Tədqiqat", + "research-menu": "Tədqiqat menyusu", "resources": "Tərcümə resursları", "regenerative-finance": "ReFi - Regenerativ maliyyə", "run-a-node": "Düyün başladın", - "rollup-component-website": "Veb-sayt", + "rollup-component-website": "Vebsayt", "rollup-component-developer-docs": "Tərtibatçı sənədləri", "rollup-component-technology-and-risk-summary": "Texnologiya və risk icmalı", - "scaling": "Ölçəkləmə", + "scaling": "Miqyaslama", "saas": "Bir xidmət kimi steykinq", "search": "Axtarış", "search-ethereum-org": "Ethereum.org-da axtarın", "secret-leader-election": "Gizli lider seçimi", "search-box-blank-state-text": "Axtarış et!", - "search-eth-address": "Bu, Ethereum ünvanına bənzəyir. Biz ünvanlar üçün xüsusi məlumat təqdim etmirik. Gərəkli məlumatları blok tədqiqatçılarında tapmağa çalışın, məsələn:", + "search-eth-address": "Bu, Ethereum ünvanına bənzəyir. Biz ünvanlar üçün xüsusi məlumat təqdim etmirik. Lazımi məlumatları blok tədqiqatçılarında tapmağa çalışın, məsələn:", "search-no-results": "Axtarışınız heç bir nəticə vermədi", "security": "Təhlükəsizlik", "single-slot-finality": "Tək yuvalı tamamlama", "statelessness": "Vətəndaşsızlıq", "see-contributors": "Töhfəçilərə bax", "set-up-local-env": "Yerli mühiti qur", - "sharding": "Parçalanma", + "sharding": "Parçalanma(Sharding)", "show-all": "Hamısını göstər", "show-less": "Daha az göstər", - "site-description": "Ethereum, pul və yeni tətbiqetmə növləri üçün qlobal və mərkəzi olmayan bir platformadır. Ethereum-da pula nəzarət edən kodlar yaza bilər və dünyanın hər yerindən müraciət edilən bilən tətbiqetmələr yarada bilərsiniz.", - "site-title": "ethereum.org", + "site-description": "Ethereum pul və yeni tətbiqetmə növləri üçün qlobal və mərkəzi olmayan bir platformadır. Ethereum-da pula nəzarət edən kodlar yaza bilər və dünyanın hər yerindən müraciət edilən bilən tətbiqetmələr yarada bilərsiniz.", "skip-to-main-content": "Əsas məzmuna keç", "smart-contracts": "Ağıllı müqavilələr", - "stablecoins": "Stabil koinlər", + "stablecoins": "Stabilkoinlər", "stake-eth": "ETH-ni steyk", - "staking": "Steykinq", + "staking": "Payçılıq", "start-here": "Buradan başlayın", - "style-guide": "Style guide", - "solo": "Solo steykinq", + "solo": "Solo payçılıq", "support": "Dəstək", "terms-of-use": "İstifadə şərtləri", - "translation-banner-body-new": "Bu səhifə hələ tərcümə edilmədiyi üçün İngilis dilində təqdim olunur. Bu məzmunu tərcümə etməyimizə kömək edin.", + "translation-banner-body-new": "Bu səhifə hələ tərcümə edilmədiyi üçün ingilis dilində təqdim olunur. Bu məzmunu tərcümə etməyimizə kömək edin.", "translation-banner-body-update": "Bu səhifənin yeni versiyası var, lakin hazırda yalnız ingilis dilindədir. Ən son versiyanı tərcümə etməkdə bizə kömək edin.", "translation-banner-button-see-english": "İngiliscə bax", - "translation-banner-button-translate-page": "Səhifəni tərcümə Et", + "translation-banner-button-translate-page": "Səhifəni tərcümə et", "translation-banner-title-new": "Bu səhifəni tərcümə et", "translation-banner-title-update": "Bu səhifəni yeniləməyimizə kömək et", "translation-banner-no-bugs-title": "Burada baq yoxdur!", @@ -211,18 +305,20 @@ "try-using-search": "Axtardığınızı tapmaq üçün axtarışdan istifadə etməyə çalışın və ya", "tutorials": "Təlimatlar", "up": "Yuxarı", + "use": "İstifadə", "use-ethereum": "Ethereum istifadə et", "use-ethereum-menu": "Ethereum menyusunu istifadə et", + "use-menu": "İstifadə menyusu", "user-experience": "İstifadəçi təcrübəsi", "verkle-trees": "Verkle ağacı", "wallets": "Pulqabıları", "we-couldnt-find-that-page": "Həmin səhifəni tapa bilmədik", "web3": "Web3 nədir?", "web3-title": "Web3", - "website-last-updated": "Veb-səhifə ən son yeniləndi", - "what-is-ether": "Efir (ETH) nədir?", + "website-last-updated": "Veb-saytın ən son yenilənməsi", + "what-is-ether": "Ether (ETH) nədir?", "what-is-ethereum": "Ethereum nədir?", - "withdrawals": "Steykinq çıxarılması", + "withdrawals": "Payın çıxarılması", "yes": "Bəli", - "zero-knowledge-proofs": "Sıfır bilik verməklə isbat protokolu" + "zero-knowledge-proofs": "Sıfır biliklərlə təsdiqləmə" } diff --git a/src/intl/bg/common.json b/src/intl/bg/common.json index 731feec1177..51f538fd6c2 100644 --- a/src/intl/bg/common.json +++ b/src/intl/bg/common.json @@ -5,8 +5,6 @@ "adding-developer-tools": "Добавяне на инструменти за разработчици", "adding-exchanges": "Добавяне на борси", "adding-glossary-terms": "Добавяне на термини в речника", - "adding-layer-2s": "Adding Layer 2s", - "adding-products": "Adding Products", "adding-staking-products": "Добавяне на продукти за залагане", "adding-wallets": "Добавяне на портфейли", "account-abstraction": "Абстракция на акаунта", @@ -76,7 +74,6 @@ "enterprise-menu": "Меню на предприятието", "esp": "Програма за поддръжка на екосистемата", "eth-current-price": "Настояща цена на ETH (в USD)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "Кампания за търсене на бъгове на Етереум", "consensus-when-shipping": "Кога излиза?", "ethereum-upgrades": "Подобрения на Етереум", @@ -176,7 +173,6 @@ "nav-eip-description": "Стандарти, които определят нови функции или процеси", "nav-eip-label": "Предложения за подобряване на Eтереум (EIP)", "nav-emerging-description": "Запознайте се с други, по-нови случаи на използване за Eтереум", - "nav-emerging-label": "Emerging use cases", "nav-enterprise-description": "Бизнес приложения за Eтереум", "nav-ethereum-org-description": "Този уебсайт се ръководи от общността – присъединете се към нас и дайте своя принос", "nav-ethereum-wallets-description": "Приложение, което да взаимодейства с вашия акаунт в Eтереум", @@ -187,14 +183,12 @@ "nav-find-wallet-description": "Портфейлите ви позволяват да използвате криптовалута", "nav-find-wallet-label": "Изберете своя портфейл", "nav-gas-fees-description": "Как се изчисляват таксите за транзакции с ETH", - "nav-gas-fees-label": "Gas fees", "nav-get-eth-description": "Нужен ви е етер (ETH), за да използвате приложенията на Eтереум", "nav-get-started-description": "Първи стъпки в използването на Eтереум", "nav-governance-description": "Процесът, използван за надграждането на протокола на Eтереум", "nav-governance-label": "Управление", "nav-grants-description": "Списък, подбран от нашата общност, с проекти, които предоставят програми с безвъзмездно финансиране", "nav-guide-create-account-description": "Всеки може да си създаде акаунт в Eтереум по всяко време, безплатно с приложение за портфейл", - "nav-guide-create-account-label": "Как да „регистрирате“ акаунт в Етереум", "nav-guide-revoke-access-description": "Бъдете защитени, когато взаимодействате с интелигентни договори и приложения в екосистемата на Eтереум", "nav-guide-revoke-access-label": "Как да отмените достъпа на интелигентен договор", "nav-guide-use-wallet-description": "Разберете как да управлявате всички основни функции на портфейл", @@ -225,11 +219,9 @@ "nav-roadmap-future-label": "Подсигуряване за бъдещето", "nav-roadmap-label": "Пътна карта", "nav-roadmap-scaling-description": "Актуализации на мрежата за допълнително намаляване на цената на трансакциите и скоростта им", - "nav-roadmap-scaling-label": "Cheaper transactions", "nav-roadmap-security-description": "Гарантиране, че Eтереум ще остане устойчива на всякакви атаки в бъдеще", "nav-roadmap-security-label": "Повишена сигурност", "nav-roadmap-ux-description": "Употребата на Eтереум трябва да е лесна", - "nav-roadmap-ux-label": "Better user experience", "nav-run-a-node-description": "Станете напълно суверенни, като същевременно подпомагате обезопасяването на мрежата", "nav-security-description": "Научете кои са най-добрите практики при използване на криптовалута", "nav-smart-contracts-description": "Основните градивни блокове на екосистемата на Eтереум", @@ -237,18 +229,14 @@ "nav-stake-description": "Печелете награди за това да правите Eтереум по-безопасна", "nav-stake-label": "Залагане", "nav-staking-home-description": "Преглед на различните опции за залагане", - "nav-staking-home-label": "Staking home", "nav-staking-pool-description": "Залагайте и печелете награди с каквато и да е сума ETH, като се обедините с други", "nav-staking-pool-label": "Групово залагане", - "nav-staking-saas-description": "Third-party node operators handle the operation of your validator client", "nav-staking-saas-label": "Залагане с услуга", - "nav-staking-solo-description": "Run home hardware and personally add to the security and decentralization of the Ethereum network", "nav-staking-solo-label": "Самостоятелно залагане", "nav-start-building-description": "Полезна информация за начинаещи", "nav-translation-program-description": "Доброволно сътрудничество за превеждане на ethereum.org на всички езици", "nav-tutorials-description": "Списък на общността с подбрани обучения", "nav-use-cases-description": "Открийте различни идеи за използване на Eтереум", - "nav-use-cases-label": "Use cases", "nav-what-is-ether-description": "Валутата на приложенията на Eтереум", "nav-what-is-ethereum-description": "Научете какво прави Eтереум специална", "nav-what-is-web3-label": "Какво представлява Web3?", @@ -278,7 +266,6 @@ "research": "Проучване", "research-menu": "Меню за проучване", "resources": "Източници за превод", - "regenerative-finance": "ReFi - Regenerative finance", "run-a-node": "Активирайте нод", "rollup-component-website": "Уебсайт", "rollup-component-developer-docs": "Документация на разработчика", @@ -300,14 +287,12 @@ "show-all": "Покажи всички", "show-less": "Покажи по-малко", "site-description": "Етереум е глобална, децентрализирана платформа за пари и нови видове приложения. В Етереум можете да създавате код, който контролира пари, и да правите приложения, достъпни по целия свят.", - "site-title": "ethereum.org", "skip-to-main-content": "Прeскачане към основното съдържание", "smart-contracts": "Умни договори", "stablecoins": "Стейбълкойни", "stake-eth": "Залагайте ETH", "staking": "Залагане", "start-here": "Започнете тук", - "style-guide": "Style guide", "solo": "Самостоятелно залагане", "support": "Поддръжка", "terms-of-use": "Условия за ползване", @@ -328,7 +313,6 @@ "use-ethereum": "Използвайте Етереум", "use-ethereum-menu": "Използвайте менюто на Етереум", "use-menu": "Меню за използване", - "user-experience": "User experience", "verkle-trees": "Дърво на Verkle", "wallets": "Портфейли", "we-couldnt-find-that-page": "Не можахме да намерим тази страница", diff --git a/src/intl/bn/common.json b/src/intl/bn/common.json index 0f59184a56c..71e00b38b1d 100644 --- a/src/intl/bn/common.json +++ b/src/intl/bn/common.json @@ -40,7 +40,7 @@ "decentralized-social-networks": "বিকেন্দ্রীভূত সামাজিক নেটওয়ার্ক", "decentralized-science": "DeSci - ডিসেন্ট্রালাইজড সায়েন্স", "description": "ন্যাভ আইটেমের জন্য বর্ণনা", - "defi-page": "DeFi - বিকেন্দ্রীভূত অর্থ", + "defi-page": "DeFi - বিকেন্দ্রীভূত অর্থ ", "design": "ডিজাইন", "design-principles": "ডিজাইনের মূলনীতি", "devcon": "Devcon", @@ -315,7 +315,6 @@ "wallets": "ওয়ালেটসমূহ", "we-couldnt-find-that-page": "আমরা সেই পৃষ্ঠাটি খুঁজে পাইনি", "web3": "Web3 কি?", - "web3-title": "Web3", "website-last-updated": "যখন ওয়েবসাইট শেষবারের মতো আপডেট করা হয়েছে", "what-is-ether": "ইথার (ETH) কী?", "what-is-ethereum": "ইথেরিয়াম কী?", diff --git a/src/intl/cs/common.json b/src/intl/cs/common.json index 259eda85ff3..ec37bed5f2e 100644 --- a/src/intl/cs/common.json +++ b/src/intl/cs/common.json @@ -5,8 +5,6 @@ "adding-developer-tools": "Přidávání vývojářských nástrojů", "adding-exchanges": "Přidávání směnáren", "adding-glossary-terms": "Přidávání termínů do slovníku pojmů", - "adding-layer-2s": "Adding Layer 2s", - "adding-products": "Adding Products", "adding-staking-products": "Přidávání produktů pro staking", "adding-wallets": "Přidávání peněženek", "account-abstraction": "Abstrakce účtu", @@ -224,7 +222,6 @@ "nav-roadmap-future-label": "Příprava na budoucnost", "nav-roadmap-label": "Plán postupu", "nav-roadmap-scaling-description": "Aktualizace sítě ve snaze o další snížení transakčních nákladů a zvýšení rychlosti", - "nav-roadmap-scaling-label": "Cheaper transactions", "nav-roadmap-security-description": "Zajištění odolnosti Etherea vůči všem druhům útoků i do budoucna", "nav-roadmap-security-label": "Vylepšené zabezpečení", "nav-roadmap-ux-description": "Používání Etherea je třeba zjednodušit", @@ -297,14 +294,12 @@ "show-all": "Zobrazit vše", "show-less": "Zobrazit méně", "site-description": "Ethereum je celosvětová, decentralizovaná platforma pro peníze a nové druhy aplikací. Na platformě Ethereum můžeš napsat kód pro správu peněz a vytvářet aplikace přístupné odkudkoli na světě.", - "site-title": "ethereum.org", "skip-to-main-content": "Přeskočit na hlavní obsah", "smart-contracts": "Chytré kontrakty", "stablecoins": "Stabilní kryptoměny (stablecoins)", "stake-eth": "Stakujte ETH", "staking": "Stakování", "start-here": "Začněte zde", - "style-guide": "Style guide", "solo": "Samostatné uzamčení", "support": "Podpora", "terms-of-use": "Podmínky použití", diff --git a/src/intl/hu/common.json b/src/intl/hu/common.json index 618612529f7..7bf1ef880bc 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -6,7 +6,6 @@ "adding-exchanges": "Tőzsdék hozzáadása", "adding-glossary-terms": "Új fogalmak hozzáadása", "adding-layer-2s": "2. réteg hozzáadása", - "adding-products": "Adding Products", "adding-staking-products": "Letétbe helyezési lehetőségek hozzáadása", "adding-wallets": "Tárcák hozzáadása", "account-abstraction": "Számlaabsztrakció", diff --git a/src/intl/it/common.json b/src/intl/it/common.json index 82182853012..f192b05544c 100644 --- a/src/intl/it/common.json +++ b/src/intl/it/common.json @@ -15,6 +15,9 @@ "aria-toggle-menu-button": "Attiva/Disattiva pulsante menu", "beacon-chain": "La Beacon Chain", "bridges": "Ponti della blockchain", + "bug-bounty": "Bug bounty", + "build": "Build", + "build-menu": "Menu build", "clear": "Cancella", "close": "Chiudi", "community": "Community", diff --git a/src/intl/ja/common.json b/src/intl/ja/common.json index bfff2afd021..9988f7c5956 100644 --- a/src/intl/ja/common.json +++ b/src/intl/ja/common.json @@ -300,7 +300,6 @@ "show-all": "すべて表示", "show-less": "少なく表示", "site-description": "イーサリアムは、お金と新しい種類のアプリケーションのためのグローバルな分散型プラットフォームです。 イーサリアムでは、お金を制御するコードを書くことができ、世界中のどこにいてもアクセス可能なアプリケーションを構築できます。", - "site-title": "ethereum.org", "skip-to-main-content": "メインコンテンツへスキップ", "smart-contracts": "スマートコントラクト", "stablecoins": "ステーブルコイン", diff --git a/src/intl/kk/common.json b/src/intl/kk/common.json index 54d7d03ef4a..4c8878363e2 100644 --- a/src/intl/kk/common.json +++ b/src/intl/kk/common.json @@ -1,29 +1,70 @@ { "about-ethereum-org": "ethereum.org туралы", "about-us": "Біз туралы", + "adding-desci-projects": "Desci жобаларын қосу", + "adding-developer-tools": "Әзірлеуші құралдарды қосу", + "adding-exchanges": "Биржаларды қосу", + "adding-glossary-terms": "Глоссарий терминдерін қосу", + "adding-staking-products": "Стейкинг өнімдерін қосу", + "adding-wallets": "Әмияндарды қосу", + "account-abstraction": "Есептік жазбаның абстракциясы", + "acknowledgements": "Тану", "aria-toggle-search-button": "Іздеуді ауыстыру түймесі", "aria-toggle-menu-button": "Мәзірді ауыстыру түймесі", "beacon-chain": "Beacon Chain", "bridges": "Блокчейн көпірлері", - "close": "Close", + "bug-bounty": "Баг марапаты", + "build": "Құру", + "build-menu": "Мәзір құру", + "clear": "Тазалау", + "close": "Жабу", "community": "Қауымдастық", "community-hub": "Қауымдастық орталығы", "community-menu": "Қауымдастық мәзірі", "contact": "Контакт", + "content-buckets": "Мазмұн шелектері", + "content-resources": "Мазмұн ресурстары", + "content-standardization": "Мазмұнды стандарттау", "contributing": "Үлес қосу", "contributors": "Үлес қосушылар", "contributors-thanks": "Бұл бетке үлес қосқандардың бәріне рақмет!", "cookie-policy": "Cookie саясаты", "copied": "Көшірілді", "copy": "Көшіру", + "danksharding": "Данкшардинг", + "dao-page": "DAO-лар - Орталықсыздандырылған автономды ұйымдар", "dark-mode": "Күңгірт", "data-provided-by": "Деректер көзі:", "decentralized-applications-dapps": "Dapps - Орталықсыздандырылған қолданбалар", + "decentralized-identity": "Орталықтандырылмаған сәйкестендіру", + "decentralized-social-networks": "Орталықтандырылмаған әлеуметтік желілер", + "decentralized-science": "DeSci - Орталықтандырылмаған ғылым", + "description": "Навигация элементінің сипаттамасы", + "defi-page": "DeFi - Орталықсыздандырылған қаржы", + "design": "Дизайн", + "design-principles": "Дизайн принциптері", "devcon": "Devcon", "developers": "Әзірлеушілер", "developers-home": "Әзірлеушілер басты беті", "docs": "Құжаттар", + "docsearch-to-select": "Тандау", + "docsearch-to-navigate": "Өту", + "docsearch-to-close": "Жабу", + "docsearch-search-by": "Іздеу", + "docsearch-start-recent-searches-title": "Соңғы", + "docsearch-start-no-recent-searches": "Соңғы іздеу сұраулары жоқ", + "docsearch-start-save-recent-search": "Бұл іздеу сұрауларын сақтаңыз", + "docsearch-start-remove-recent-search": "Бұл іздеу сұрауын тарихтан жойыңыз", + "docsearch-start-favorite-searches": "Таңдаулы", + "docsearch-start-remove-favorite-search": "Бұл іздеу сұрауын таңдаулылардан алып тастаңыз", + "docsearch-no-results-text": "Сұраныс бойынша нәтиже жоқ", + "docsearch-no-results-suggested-query": "Іздеуге тырысыңыз", + "docsearch-no-results-missing": "Осы сұраныс бойынша нәтижелер болуы керек деп ойлайсыз ба?", + "docsearch-no-results-missing-link": "Бізге хабарлаңыз.", + "docsearch-error-title": "Нәтиже беру мүмкін болмады", + "docsearch-error-help": "Желіге қосылуды тексеру қажет болуы мүмкін.", "documentation": "Құжаттама", + "down": "Төмен", "ecosystem": "Экожүйе", "edit-page": "Бетті өңдеу", "ef-blog": "Ethereum қорының блогі", @@ -44,29 +85,37 @@ "ethereum-glossary": "Ethereum глоссарийі", "ethereum-governance": "Ethereum платформасын Басқару", "ethereum-logo": "Ethereum логотипі", + "ethereum-roadmap": "Ethereum жол картасы", + "ethereum-protocol": "Ethereum хаттамасы", "ethereum-security": "Ethereum қауіпсіздігі және алаяқтықтың алдын алу", "ethereum-support": "Ethereum қолдауы", "ethereum-wallets": "Ethereum әмияндары", "ethereum-whitepaper": "Ethereum жобалық құжаты", "feedback-widget-prompt": "Бұл бет пайдалы ма?", - "feedback-card-prompt-page": "Was this page helpful?", - "feedback-card-prompt-article": "Was this article helpful?", - "feedback-card-prompt-tutorial": "Was this tutorial helpful?", + "feedback-card-prompt-page": "Бұл бет пайдалы болды ма?", + "feedback-card-prompt-article": "Бұл мақала пайдалы болды ма?", + "feedback-card-prompt-tutorial": "Бұл нұсқаулық пайдалы болды ма?", "feedback-widget-thank-you-title": "Пікіріңіз үшін рахмет!", "feedback-widget-thank-you-subtitle": "Бірнеше сұраққа жауап беру арқылы бұл бетті бұрыннан да жақсырақ етіңіз.", - "feedback-widget-thank-you-subtitle-ext": "If you need help, you can reach out to the community on our Discord.", + "feedback-widget-thank-you-subtitle-ext": "Егер сізге көмек қажет болса, сіз біздің Discord мекенжайы бойынша қоғамдастыққа хабарласа аласыз.", "feedback-widget-thank-you-timing": "2-3 мин", "feedback-widget-thank-you-cta": "Қысқаша сауалнаманы ашу", "find-wallet": "Әмиян табу", + "future-proofing": "Болашақты қамтамасыз ету", "get-eth": "ETH алу", "get-involved": "Қатысу", "get-started": "Бастау", "grants": "Гранттар", "grant-programs": "Экожүйелік гранттар бағдарламалары", - "guides-and-resources": "Қауымдастық нұсқаулықтары мен ресурстары", + "guides": "Нұсқаулықтар", + "guides-hub": "Нұсқаулық", "history-of-ethereum": "Ethereum тарихы", "home": "Басты бет", "how-ethereum-works": "Ethereum қалай жұмыс істейді?", + "how-to-revoke-token-access": "Ақылды келісімшарттың криптоқаражатына қол жетімділігін қалай жоюға болады", + "how-to-swap-tokens": "Токендерді қалай ауыстыруға болады", + "how-to-use-a-bridge": "Токендерді 2-деңгейге қалай аударуға болады", + "how-to-use-a-wallet": "Әмиянды қалай пайдалануға болады", "image": "сурет", "in-this-section": "Бұл бөлімде", "individuals": "Тұлғалар", @@ -80,6 +129,7 @@ "layer-2": "2-қабат", "learn": "Үйрену", "learn-by-coding": "Кодтау арқылы үйрену", + "learn-hub": "Оқу орталығы", "learn-menu": "Үйрену мәзірі", "learn-more": "Көбірек білу", "less": "Азырақ", @@ -88,42 +138,153 @@ "loading": "Жүктелуде...", "loading-error": "Жүктеу қатесі.", "loading-error-refresh": "Қате, жаңартыңыз.", + "loading-error-try-again-later": "Деректерді жүктеу мүмкін емес. Кейінірек қайталап көріңіз.", "logo": "логотип", "mainnet-ethereum": "Mainnet Ethereum", + "merge": "Біріктіру", "more": "Көбірек", - "nav-developers": "Әзірлеушілер", + "nav-about-description": "Ethereum қауымдастығы үшін ортақ, ашық жоба", + "nav-advanced-description": "Одан да күрделі тақырыптарды үйреніңіз", + "nav-basics-description": "Ethereum негіздерін түсініңіз", + "nav-basics-label": "Негіздер", + "nav-bridges-description": "Web3 негізгі L1 блокчейндері мен L2 масштабтау шешімдері экожүйесі болып өзгертілді", + "nav-builders-home-description": "Ethereum үшін әзірлеуші нұсқаулығы—әзірлеушілер бойынша, әзірлеушілер үшін", + "nav-builders-home-label": "Әзірлеуші басты беті", + "nav-contribute-description": "Егер сіз көмектескіңіз келсе, бұл сізге бағыт-бағдар көрсетеді", + "nav-contribute-label": "ethereum.org жүйесіне үлес қосу", + "nav-dao-description": "Мүшелердің иелігіндегі орталықтандырылған басқарусыз қауымдастықтар", + "nav-dapps-description": "Ethereum қолданатын қолданбалардың бай экожүйесін қарап шығыңыз", + "nav-defi-description": "Дәстүрлі қаржылық нарықтың ғаламдық, ашық баламасы", + "nav-desci-description": "Ағымдағы ғылыми жүйенің ғаламдық, ашық баламасы", + "nav-desoc-description": "Әлеуметтік өзара қарым-қатынас пен контент жасауға арналған блокчейн негізіндегі платформалар", "nav-developers-docs": "Әзірлеушілер құжаттары", + "nav-developers": "Әзірлеушілер", + "nav-did-description": "Бірегей орталықсыздандырылған идентификаторларды шығару және оларға иелік ету", + "nav-docs-description": "Ethereum арқылы түсінуге және құруға көмектесетін құжаттар", + "nav-docs-design-description": "Бірегей web3 құрылымы тапсырмаларының, ең жақсы тәжірибелерінің және пайдаланушы зерттеу мәліметтерінің сипаттамасы", + "nav-docs-design-label": "UX/UI құрылымы негіздері", + "nav-docs-foundation-description": "Ethereum жүйесінде әзірлеуге арналған негіздер", + "nav-docs-overview-description": "Әзірлеуші құжаттарының мекені", + "nav-docs-stack-description": "Ethereum стегінің барлық мәліметтерін түсініңіз", + "nav-eip-description": "Жаңа мүмкіндіктерді немесе процестерді көрсететін стандарттар", + "nav-eip-label": "Ethereum жетілдіру ұсыныстары (EIP)", + "nav-emerging-description": "Ethereum үшін басқа жаңа қолдану жағдайларын біліңіз", + "nav-enterprise-description": "Ethereum үшін бизнестік қолданбалар", + "nav-ethereum-org-description": "Бұл веб-сайт қауымдастық тарапынан басқарылады—бізге қосылып, өз үлесіңізді қосыңыз", + "nav-ethereum-wallets-description": "Ethereum шотымен жұмыс істеуге арналған қолданба", + "nav-events-description": "Орталықсыздандыру және әркімнің қатысу еркіндігі", + "nav-events-irl-description": "Әр айда маңызды Ethereum жүзбе-жүз және онлайн іс-шаралары болады", + "nav-events-label": "Қауымдастықтар мен іс-шаралар", + "nav-events-online-description": "Бұл онлайн қауымдастықтарда жүз мыңдаған Ethereum ынтагерлері бар", + "nav-find-wallet-description": "Әмияндар криптовалютаны пайдалану мүмкіндігін береді", + "nav-find-wallet-label": "Әмияныңызды таңдаңыз", + "nav-gas-fees-description": "ETH транзакцияларының алымы қалай есептеледі", + "nav-get-eth-description": "Ethereum қолданбаларын пайдалану үшін сізге эфир (ETH) қажет", + "nav-get-started-description": "Ethereum пайдаланудың алғашқы қадамдары", + "nav-governance-description": "Ethereum протоколын жаңартудағы процесс", + "nav-governance-label": "Басқармасы", + "nav-grants-description": "Грант негізінде қаржыландыру бағдарламаларын беретін жобалар бойынша біздің қауымдастығымыз тарапынан мұқият таңдалған тізім", + "nav-guide-create-account-description": "Кез келген адам кез келген уақытта әмиян қолданбасы арқылы Ethereum шотын тегін жасай алады", + "nav-guide-revoke-access-description": "Смарт келісімшарттармен және Ethereum экожүйелерімен жұмыс істегенде қауіпсіздікті сақтаңыз", + "nav-guide-revoke-access-label": "Смарт келісімшартты қолдану құқығын қалай қайтарып алуға болады", + "nav-guide-use-wallet-description": "Әмиянның барлық негізгі функцияларын қолдану туралы біліңіз", + "nav-guide-use-wallet-label": "Әмиянды қалай пайдалануға болады", + "nav-guides-description": "Сізге жұмысты бастауға көмектесетін қадамдық практикалық нұсқаулар", + "nav-guides-label": "Практикалық нұсқаулықтар", + "nav-history-description": "Барлық негізгі өзгерістер мен жаңартулардың хронологиясы", + "nav-history-label": "Ethereum техникалық тарихы", + "nav-layer-2-description": "Ethereum үшін арзан және жылдам транзакциялар", + "nav-learn-by-coding-description": "Ethereum арқылы тәжірибе жүргізіп көруге көмектесетін құралдар", + "nav-local-env-description": "Choose and set up your Ethereum әзірлеу стегін таңдау және орнату", + "nav-mainnet-description": "Кәсіпорын блокчейн қолданбаларын ортақ Ethereum негізгі желісінде құруға болады", + "nav-nft-description": "Ethereum негізіндегі актив ретінде бірегей өнімді ұсыну жолы", + "nav-open-research-description": "Ethereum негізгі басым тараптарының бірі оның белсенді зерттеу қауымдастығы болып табылады", + "nav-open-research-label": "Ағымдағы зерттеулер", + "nav-overview-description": "Ethereum туралы барлық мәліметтер", + "nav-participate-overview-description": "Қатысу әдісі туралы шолу", "nav-primary": "Негізгі", + "nav-quizzes-description": "Ethereum және криптовалюталарды қаншалықты түсінетініңізді біліңіз", + "nav-quizzes-label": "Біліміңізді тексеріп көріңіз", + "nav-refi-description": "Қалпына келтіру принциптеріне негізделген балама экономикалық жүйе", + "nav-research-description": "Ethereum жақсарту үшін пайдаланылатын процестер", + "nav-research-label": "Зерттеу және әзірлеу", + "nav-roadmap-description": "Ethereum үшін масштабтау, қауіпсіздік және тұрақтылық жолы", + "nav-roadmap-future-description": "Ethereum криптовалютасын сенімді және орталықсыздандырылған желі ретінде нығайту", + "nav-roadmap-future-label": "Болашақты қамтамасыз ету", + "nav-roadmap-label": "Жол картасы", + "nav-roadmap-scaling-description": "Транзакция шығындары мен жылдамдығын одан әрі азайтуға арналған желі жаңартулары", + "nav-roadmap-security-description": "Ethereum криптовалютасының болашақтағы барлық қауіп түрлеріне төзімділігін қамтамасыз ету", + "nav-roadmap-security-label": "Жақсартылған қауіпсіздік", + "nav-roadmap-ux-description": "Ethereum пайдалану қарапайымдастырылуы керек", + "nav-run-a-node-description": "Желінің қауіпсіздігін қамтамасыз ету кезінде толықтай тәуелсіз болыңыз", + "nav-security-description": "Криптовалютаны пайдалану кезінде ең жақсы тәжірибелерді үйреніңіз", + "nav-smart-contracts-description": "Ethereum экожүйесінің негізгі құру блоктары", + "nav-stablecoins-description": "Стейблкоиндар белгіленген құнда қалуға арналған Ethereum токендері болып табылады", + "nav-stake-description": "Ethereum қауіпсіздігі үшін марапаттар алыңыз", + "nav-stake-label": "Ставка", + "nav-staking-home-description": "Ставка жасау үшін әртүрлі опцияларды шолу", + "nav-staking-pool-description": "Ставка жасаңыз және басқалармен қосылу арқылы кез келген ETH сомасында марапаттар алыңыз", + "nav-staking-pool-label": "Пулдық стейкинг", + "nav-staking-saas-label": "Қызмет арқылы ставка жасау", + "nav-staking-solo-label": "Соло стейкинг", + "nav-start-building-description": "Жаңа келгендер үшін пайдалы ақпарат", + "nav-translation-program-description": "ethereum.org сайтын барлық тілдерге аударуға бірге әрекеттену", + "nav-tutorials-description": "Қауымдастық нұсқаулығының таңдалған тізімі", + "nav-use-cases-description": "Ethereum пайдаланудың әртүрлі идеяларын ашыңыз", + "nav-what-is-ether-description": "Ethereum қолданбаларының валютасы", + "nav-what-is-ethereum-description": "Ethereum ерекшелігі неде екенін түсініңіз", + "nav-what-is-web3-label": "Web3 дегеніміз не?", + "nav-what-is-web3-description": "Ережелерді орнататын орталықтандырылған монополияның баламасы", + "nav-whitepaper-description": "Бастапқы Ethereum ресми құжаты 2014 жылы Виталик Бутерин тарапынан жазылған", + "nav-zkp-description": "Мәлімдеменің өзін әшкерелемей, мәлімдеменің жарамдылығын дәлелдеу әдісі", + "nft-page": "NFT-лер - Өзара алмастырылмайтын токендер", + "nfts": "NFT-лер", "no": "Жоқ", "on-this-page": "Бұл бетте", - "open-research": "Open research", + "open-research": "Ағымдағы зерттеулер", + "page-developers-aria-label": "Әзірлеушілер мәзірі", + "page-index-meta-title": "Басты бет", "page-last-updated": "Соңғы бет жаңартылуы", + "participate-menu": "Қатысу мәзірі", + "pbs": "Мәлімдеуші мен құрылысшыны бөлу", + "pools": "Пулдық стейкинг", "privacy-policy": "Құпиялық саясаты", "private-ethereum": "Жеке Ethereum", + "product-disclaimer": "Өнімдер мен қызметтер Ethereum қауымдастығы үшін ыңғайлылық үшін көрсетілген. Өнімді немесе қызметті қосу ethereum.org веб-сайт тобы немесе Ethereum қоры тарапынан мақұлдауды білдірмейді.", + "quizzes-title": "Викторина орталығы", + "quizzes": "Викториналар", "refresh": "Бетті жаңартыңыз.", "return-home": "үйге оралу", + "roadmap": "Ethereum жол картасы", + "research": "Зерттеу", + "research-menu": "Зерттеу мәзірі", + "resources": "Аударма ресурстары", "run-a-node": "Түйінді басқару", "rollup-component-website": "Веб-сайт", "rollup-component-developer-docs": "Әзірлеуші құжаттары", "rollup-component-technology-and-risk-summary": "Технология және тәуекелдер туралы жиынтық мәліметтер", + "saas": "Қызмет ретіндегі стейкинг", "search": "Іздеу", + "search-ethereum-org": "ethereum.org іздеу", + "secret-leader-election": "Құпия көшбасшыны сайлау", "search-box-blank-state-text": "Іздеңіз!", "search-eth-address": "Бұл Ethereum мекенжайына ұқсайды. Біз мекенжайлар туралы деректерді қамтамасыз етпейміз. Оны мына сияқты блок іздеу құралында іздеп көріңіз:", "search-no-results": "Іздеу нәтижелер қайтармады", + "security": "Қауіпсіздік", + "single-slot-finality": "Бір ұяшықта аяқтау", + "statelessness": "Мәртебенің болмауы", "see-contributors": "Үлес қосушыларды көру", - "set-up-local-env": "Жергілікті ортаны реттеу", - "sharding": "Sharding", + "set-up-local-env": "Локал орта баптау", "show-all": "Бәрін көрсету", "show-less": "Азырақ көрсету", "site-description": "Ethereum — ақша мен жаңа қолданбаларың түрлеріне арналған жаһандық, орталықсыздандырылған платформа. Ethereum арқылы ақша бақылайтын код жазып, әлемнің кез келген жерінде қолжетімді болатын қолданбалар жасай аласыз.", - "site-title": "ethereum.org", "skip-to-main-content": "Негізгі мазмұнға өту", - "smart-contracts": "Смарт келісімшарттар", - "stablecoins": "Стейблкойндар", + "smart-contracts": "Ақылды келісімшарттар", + "stablecoins": "Stablecoins", "staking": "Стейкиң", + "start-here": "Осы жерден бастаңыз", "solo": "Соло стейкинг", - "saas": "Қызмет ретіндегі стейкинг", - "pools": "Пулдық стейкинг", + "support": "Қолдау көрсету", "terms-of-use": "Пайдалану шарттары", "translation-banner-body-new": "Біз бұл бетті аудармағандықтан, оны ағылшын тілінде көріп отырсыз. Бұл мазмұнды аударуға көмектесіңіз.", "translation-banner-body-update": "Бұл беттің жаңарақ нұсқасы бар, бірақ ол ағылшын тілінде ғана қолжетімді. Соңғы нұсқасын аударуға көмектесіңіз.", @@ -134,21 +295,22 @@ "translation-banner-no-bugs-title": "Мұнда қателер жоқ!", "translation-banner-no-bugs-content": "Бұл бет аударылып жатқан жоқ. Біз бұл бетті әзірге әдейі ағылшын тілінде қалдырдық.", "translation-banner-no-bugs-dont-show-again": "Қайта көрсетпеу", + "translation-program": "Аударма бағдарламасы", "try-using-search": "Іздеп жатқаныңызды табу үшін іздеуді қолданып көріңіз", "tutorials": "Туториалдар", + "up": "Жоғары", + "use": "Қолд.", "use-ethereum": "Ethereum платформасын пайдалану", "use-ethereum-menu": "Ethereum мәзірін пайдалану", + "use-menu": "Қолдану мәзірі", + "verkle-trees": "Веркола Ауылы", "wallets": "Әмияндар", "we-couldnt-find-that-page": "Бұл бетті табу мүмкін болмады", "web3": "Web3 дегеніміз не?", "website-last-updated": "Веб-сайттың соңғы жаңартылуы", - "what-is-ether": "Ether (ETH) дегеніміз не?", - "what-is-ethereum": "Ethereum дегеніміз не?", - "defi-page": "DeFi - Орталықсыздандырылған қаржы", - "dao-page": "DAO-лар - Орталықсыздандырылған автономды ұйымдар", - "nft-page": "NFT-лер - Өзара алмастырылмайтын токендер", - "decentralized-social-networks": "Decentralized social networks", - "decentralized-identity": "Decentralized identity", + "what-is-ether": "Ether (ETH) деген не?", + "what-is-ethereum": "Ethereum деген не?", + "withdrawals": "Ставкаларды шығару", "yes": "Иә", - "page-index-meta-title": "Басты бет" + "zero-knowledge-proofs": "Нөлдік жария етілген дәлелдер" } diff --git a/src/intl/ne-np/common.json b/src/intl/ne-np/common.json index eb03a178d97..f3467e8b2e5 100644 --- a/src/intl/ne-np/common.json +++ b/src/intl/ne-np/common.json @@ -1,17 +1,27 @@ { - "account-abstraction": "खाता अमूर्तता", "about-ethereum-org": "ethereum.org को बारेमा", "about-us": "हाम्रो बारेमा", + "adding-desci-projects": "डेस्की(Desci) परियोजनाहरू थप्दै", + "adding-developer-tools": "निर्माता उपकरणहरू थप्दै", + "adding-exchanges": "आदानप्रदानहरू थप्दै", + "adding-glossary-terms": "शब्दावली सर्तहरू थप्दै", + "adding-staking-products": "स्टेकिङ उत्पादनहरू थप्दै", + "adding-wallets": "वालेटहरू थप्दै", + "account-abstraction": "खाता अमूर्तता", "aria-toggle-search-button": "खोज बटन टगल गर्नुहोस्", "aria-toggle-menu-button": "मेनु बटन टगल गर्नुहोस्", "beacon-chain": "बीकन चेन", "bridges": "ब्लकचेन ब्रिज", + "build": "निर्माण", + "build-menu": "निर्माण मेनु", "clear": "खाली गर्नुहोस्", "close": "बन्द गर्नुहोस्", "community": "समुदाय", "community-hub": "सामुदायिक केन्द्र", "community-menu": "समुदाय मेनु", "contact": "सम्पर्क गर्नुहोस्", + "content-buckets": "विषयवस्तु बाल्टी", + "content-resources": "विषयवस्तुका स्रोतहरू", "content-standardization": "विषयवस्तु मानकीकरण", "contributing": "योगदान गर्दै", "contributors": "योगदानकर्ताहरू", @@ -27,7 +37,10 @@ "decentralized-identity": "विकेन्द्रीकृत पहिचान", "decentralized-social-networks": "विकेन्द्रीकृत सामाजिक सञ्जाल", "decentralized-science": "DeSci - विकेन्द्रीकृत विज्ञान", + "description": "न्याभ सामग्रीको विवरण", "defi-page": "DeFi - विकेन्द्रीकृत वित्त", + "design": "डिजाइन", + "design-principles": "डिजाइनका सिद्धान्तहरू", "devcon": "डेवकन", "developers": "निर्माताहरु", "developers-home": "निर्माताको गृहपृष्ठ", @@ -51,7 +64,6 @@ "documentation": "कागजात", "down": "तल", "ecosystem": "इकोसिस्टम", - "edit-page": "Edit page", "ef-blog": "इथेरियम प्रतिष्ठान ब्लग", "eips": "इथेरियम सुधार प्रस्तावहरू", "energy-consumption": "इथेरियम ऊर्जा खपत", @@ -59,11 +71,9 @@ "enterprise-menu": "उद्यम मेनु", "esp": "इकोसिस्टम समर्थन कार्यक्रम", "eth-current-price": "ETH को वर्तमान मूल्य (अमेरिकी डलर)", - "ethereum-basics": "Ethereum basics", "ethereum-bug-bounty": "इथेरियम बग बाउन्टी कार्यक्रम", "consensus-when-shipping": "यो कहिले ढुवानी हुदैछ?", "ethereum-upgrades": "इथेरियम अपग्रेडहरू", - "ethereum-brand-assets": "Ethereum brand assets", "ethereum-online": "अनलाइन समुदायहरू", "ethereum-events": "इथरियम कार्यक्रमहरू", "ethereum-foundation": "इथेरियम प्रतिष्ठान", @@ -75,7 +85,6 @@ "ethereum-protocol": "इथेरियम प्रोटोकल", "ethereum-security": "इथेरियम सुरक्षा र घोटाला रोकथाम", "ethereum-support": "इथेरियम समर्थन", - "ethereum-wallets": "Ethereum wallets", "ethereum-whitepaper": "इथेरियम वाहिटपेपर", "feedback-widget-prompt": "के यो पृष्ठ उपयोगी छ?", "feedback-card-prompt-page": "के यो पृष्ठ उपयोगी थियो?", @@ -83,10 +92,9 @@ "feedback-card-prompt-tutorial": "के यो ट्यूटोरियल उपयोगी थियो?", "feedback-widget-thank-you-title": "तपाईंको प्रतिक्रियाको लागि धन्यवाद!", "feedback-widget-thank-you-subtitle": "केहि प्रश्नहरूका जवाफ दिएर यो पृष्ठ अझ राम्रो बनाउनुहोस्।", - "feedback-widget-thank-you-subtitle-ext": "तपाईंलाई मद्दत चाहिन्छ भने, तपाईंले हाम्रो डिस्कर्ड समुदायमा सम्पर्क गर्न सक्नुहुन्छ।", + "feedback-widget-thank-you-subtitle-ext": "तपाईंलाई मद्दत चाहिन्छ भने, तपाईं हाम्रो कलह समुदायलाई सम्पर्क गर्न सक्नुहुन्छ।", "feedback-widget-thank-you-timing": "२-३ मिनेट", "feedback-widget-thank-you-cta": "छोटो सर्वेक्षण खोल्नुहोस्", - "find-wallet": "Find wallet", "future-proofing": "भविष्यका लागि सुरक्षित गर्दै", "get-eth": "ETH प्राप्त गर्नुहोस्", "get-involved": "संलग्न हुनुहोस्", @@ -94,11 +102,10 @@ "grants": "अनुदान", "grant-programs": "इकोसिस्टम अनुदान कार्यक्रम", "guides": "मार्गदर्शनहरू", - "guides-hub": "मार्गदर्शनहरूका केन्द्र", + "guides-hub": "कसरी मार्गदर्शन गर्ने", "history-of-ethereum": "इथेरियमको इतिहास", "home": "गृहपृष्ठ", "how-ethereum-works": "इथेरियमले कसरी काम गर्छ", - "how-to-register-an-ethereum-account": "इथेरियम खाता कसरी \"दर्ता गर्ने\"", "how-to-revoke-token-access": "स्मार्ट सम्झौताको क्रिप्टो कोषमा पहुँच कसरी रद्द गर्ने", "how-to-swap-tokens": "टोकनहरू कसरी साटासाट गर्ने", "how-to-use-a-bridge": "टोकनहरुलाई तह २ मा कसरी ब्रिज गर्ने", @@ -115,11 +122,9 @@ "last-edit": "पछिल्लो सम्पादन", "layer-2": "तह २", "learn": "सिक्नुहोस्", - "learn-by-coding": "Learn by coding", "learn-hub": "सिक्ने केन्द्र", "learn-menu": "सिक्ने मेनु", "learn-more": "थप जान्नुहोस्", - "less": "Less", "light-mode": "उज्यालो", "listing-policy-disclaimer": "यस पृष्ठमा सूचीबद्ध कुनैपनि उत्पादनहरू आधिकारिक अनुमोदन होइनन् र केवल सूचना उद्देश्यका लागि प्रदान गरिएका हुन्। तपाईं उत्पादन थप्न वा नीतिमा प्रतिक्रिया दिन चाहनुहुन्छ भने GitHub मा मुद्दा उठाउनुहोस्।", "loading": "लोड हुँदै...", @@ -128,10 +133,100 @@ "loading-error-try-again-later": "डाटा लोड गर्न असमर्थ। केहि समय पछि पुन: प्रयास गर्नुहोस्।", "logo": "लोगो", "mainnet-ethereum": "इथेरियमको मुख्य नेटवर्क", - "more": "More", - "nav-developers": "निर्माताहरु", + "merge": "एउटैमा मिलाउनु", + "nav-about-description": "इथेरियम समुदायको लागि एउटा सार्वजनिक, ओपन-सोर्स परियोजना", + "nav-advanced-description": "जटिल विषयहरू बारे जान्नुहोस्", + "nav-basics-description": "इथेरियमको आधारभूत कुराहरू बुझ्नुहोस्", + "nav-basics-label": "आधारभूत कुराहरू", + "nav-bridges-description": "Web3 को विकास एउटा त्यस्तो इकोसिस्टमको रुपमा भइसकेको छ जसमा आधारभूत L1 ब्लकचेनहरू र L2 स्केलिङ सोलुशनहरू समावेश रहेको छ", + "nav-builders-home-description": "इथेरियमको लागि एउटा निर्माणकर्ता म्यानुअल- निर्माणकर्ताहरूबाट निर्माणकर्ताहरूका निम्ति", + "nav-builders-home-label": "निर्माणकर्ता गृहपृष्ठ", + "nav-contribute-description": "तपाईं मद्दत गर्न चाहनुहुन्छ भने, यसले तपाईंलाई मार्गदर्शन प्रदान गर्नेछ", + "nav-contribute-label": "ethereum.org मा योगदान गर्दै", + "nav-dao-description": "केन्द्रीकृत अधिकार बिना सदस्य-स्वामित्व समुदायहरू", + "nav-dapps-description": "इथेरियम प्रयोग गर्ने एपहरूका एउटा प्रचुर इकोसिस्टमको अन्वेषण गर्नुहोस्", + "nav-defi-description": "पारम्परिक वित्तीय बजारको सट्टा एउटा विश्वव्यापी, खुला विकल्प", + "nav-desci-description": "वर्तमान वैज्ञानिक प्रणालीको सट्टा एउटा विश्वव्यापी, खुला विकल्प", + "nav-desoc-description": "सामाजिक अन्तरक्रिया र सामग्री सिर्जनाको लागि ब्लकचेन-आधारित प्लेटफर्महरू", "nav-developers-docs": "निर्माताको कागजात", + "nav-developers": "निर्माताहरु", + "nav-did-description": "तपाईंको अद्वितीय विकेन्द्रीकृत पहिचानकर्ताहरू जारी गर्नुहोस् र स्वामित्व लिनुहोस्", + "nav-docs-description": "तपाईंलाई इथेरियम बुझ्न र निर्माण गर्न मद्दत गर्ने कागजातहरू", + "nav-docs-design-description": "विशिष्ट web3 डिजाइन चुनौतीहरू, उत्कृष्ट अभ्यासहरू र प्रयोगकर्ता अनुसन्धान अन्तर्दृष्टिहरूका विवरण", + "nav-docs-design-label": "UX/UI डिजाइनका आधारभूत कुराहरू", + "nav-docs-foundation-description": "इथेरियममा विकास गर्ने मुख्य आधारभूत कुराहरू", + "nav-docs-overview-description": "डेभेलपर कागजातहरूका लागि तपाईंको गृहपृष्ठ", + "nav-docs-stack-description": "इथेरियम स्ट्याकको सबै विवरणहरू बुझ्नुहोस्", + "nav-eip-description": "नयाँ विशेषताहरू वा प्रक्रियाहरू निर्दिष्ट गर्ने मानकहरू", + "nav-eip-label": "इथेरियम सुधार प्रस्तावहरू (EIPs)", + "nav-emerging-description": "इथेरियमको लागि अन्य नयाँ प्रयोग मामिलाहरू बारेमा थाहा पाउनुहोस्", + "nav-enterprise-description": "इथेरियमको लागि व्यापारिक एप्लिकेशनहरू", + "nav-ethereum-org-description": "यो वेबसाइट समुदाय सञ्चालित हो—हामीसँग जोडिनुहोस् र योगदान पनि गर्नुहोस्", + "nav-ethereum-wallets-description": "तपाईंको इथेरियम खातासँग अन्तरक्रिया गर्नको लागि एउटा एप", + "nav-events-description": "विकेन्द्रीकरण र सबैलाई सहभागी हुने स्वतन्त्रता", + "nav-events-irl-description": "हरेक महिना प्रत्यक्ष तथा अनलाइन माध्यमबाट विशेष इथेरियम आयोजनाहरू भइरहेका हुन्छन्", + "nav-events-label": "समुदायहरू र आयोजनाहरू", + "nav-events-online-description": "यी अनलाइन समुदायहरूका अभिभावकत्व सयौँ हजारौँ इथेरियम उत्साहीहरूले लिन्छन्", + "nav-find-wallet-description": "तपाईंलाई क्रिप्टो प्रयोग गर्न वालेटले अनुमति दिन्छ", + "nav-find-wallet-label": "तपाईंको वालेट छान्नुहोस्", + "nav-gas-fees-description": "ETH कारोवार शुल्कहरू कसरी हिसाब गरिन्छन्", + "nav-get-eth-description": "इथेरियम एप्लिकेशनहरूका प्रयोग गर्न तपाईंलाई इथर (ETH) आवश्यक पर्छ", + "nav-get-started-description": "तपाईंले इथेरियम प्रयोग गर्ने सुरुवाती कदमहरू", + "nav-governance-description": "इथेरियम प्रोटोकललाई अद्यावदिक गर्ने सम्मिलित प्रक्रिया", + "nav-grants-description": "अनुदान कोष कार्यक्रम प्रदान गर्ने परियोजनाहरू बारेमा हाम्रो समुदायबाट क्युरेट गरिएको सूची", + "nav-guide-create-account-description": "कसैले पनि वालेट एपको साथ कुनै पनि समयमा निःशुल्क इथेरियम खाता सिर्जना गर्न सक्दछन्", + "nav-guide-revoke-access-description": "इथेरियम इकोसिस्टम भित्र स्मार्ट सम्झौताहरू र एप्लिकेशनहरूसँग अन्तरक्रिया गर्दा सुरक्षित बस्नुहोस्", + "nav-guide-revoke-access-label": "स्मार्ट सम्झौताको पहुँचलाई कसरी रद्द गर्ने", + "nav-guide-use-wallet-description": "वालेटका सबै आधारभूत कार्यहरू कसरी सञ्चालन गर्ने भनेर सिक्नुहोस्", + "nav-guide-use-wallet-label": "वालेट कसरी प्रयोग गर्ने", + "nav-guides-description": "तपाईंलाई सुरुवात गर्न मद्दत गर्नको लागि व्यवहारिक चरण-दर-चरण मार्गदर्शकहरू", + "nav-guides-label": "कसरी भन्ने मार्गदर्शकहरू", + "nav-history-description": "सबै मूख्य फोर्कहरू र अपडेटका समय रेखा", + "nav-history-label": "इथेरियमको प्राविधिक इतिहास", + "nav-layer-2-description": "इथेरियमको लागि सस्तो र छिटो कारोवारहरू", + "nav-learn-by-coding-description": "तपाईंलाई इथेरियमसँग प्रयोग गर्न मद्दत गर्ने उपकरणहरू", + "nav-local-env-description": "तपाईंको इथेरियम विकास स्ट्याकलाई छान्नुहोस् र सेट अप गर्नुहोस्", + "nav-mainnet-description": "व्यापार ब्लकचेन एप्लिकेशनहरू सार्वजनिक इथेरियम मेइन्नेटमा निर्माण गर्न सकिन्छ", + "nav-nft-description": "इथेरियम-आधारित सम्पत्तिको रूपमा कुनै पनि अद्वितीय प्रतिनिधित्व गर्ने एउटा तरिका", + "nav-open-research-description": "इथेरियमको एउटा मुख्य शक्ति यसको सक्रिय अनुसन्धान समुदाय हो", + "nav-open-research-label": "अनुसन्धान खोल्नुहोस्", + "nav-overview-description": "इथेरियम शिक्षाको सबै कुरा", + "nav-participate-overview-description": "कसरी सहभागी भन्ने बारेमा एउटा अवलोकन", "nav-primary": "प्राथमिक", + "nav-quizzes-description": "तपाईंले इथेरियम र क्रिप्टोकरेन्सीहरू कत्तिको राम्ररी बुझ्नु भएको छ भन्ने कुरा थाहा पाउनुहोस्", + "nav-quizzes-label": "आफ्नो ज्ञानको परीक्षण गर्नुहोस्", + "nav-refi-description": "पुनरुत्पादक सिद्धान्तहरूमा आधारित वैकल्पिक आर्थिक प्रणाली", + "nav-research-description": "इथेरियमलाई सुधार गर्ने प्रक्रियाहरू", + "nav-research-label": "अनुसन्धान र विकास", + "nav-roadmap-description": "इथेरियमको लागि थप स्केलेबिलिटि, सुरक्षा र दीगोपनाको मार्ग", + "nav-roadmap-future-description": "इथेरियमलाई एउटा सुदृढ तथा विकेन्द्रीकृत सञ्जालको रुपमा ठोस बनाउने", + "nav-roadmap-future-label": "भविष्यका लागि सुरक्षित गर्दै", + "nav-roadmap-label": "मार्गचित्र", + "nav-roadmap-scaling-description": "कारोवार खर्चहरू र गतिलाई थप घटाउने नेटवर्क अपडेटहरू", + "nav-roadmap-security-description": "भविष्यमा कुनै पनि किसिमको हमला विरुद्ध इथेरियम सबल रहेको कुरा सुनिश्चित गर्ने", + "nav-roadmap-security-label": "सुधारिएको सुरक्षा", + "nav-roadmap-ux-description": "इथेरियमको प्रयोगलाई सरल गर्नु आवश्यक रहेको छ", + "nav-run-a-node-description": "नेटवर्कलाई सुरक्षित बनाउन मद्दत गर्दै पूर्ण रुपमा सार्वभौम बन्ने", + "nav-security-description": "क्रिप्टोकरेन्सी प्रयोग गर्दा उत्कृष्ट अभ्यासहरू सिक्नुहोस्", + "nav-smart-contracts-description": "इथेरियम इकोसिस्टमका प्राथमिक निर्माण ब्कलहरू", + "nav-stablecoins-description": "स्टेबलकोइनहरू त्यस्ता इथेरियम टोकनहरू हुन् जसलाई स्थिर मूल्यमा रहनको लागि डिजाइन गरिएको छ", + "nav-stake-description": "इथेरियमलाई सुरक्षित बनाउँदा पुरस्कार कमाउनुहोस्", + "nav-stake-label": "स्टेक", + "nav-staking-home-description": "स्टेकिङ गर्नको लागि विभिन्न विकल्पहरूको एक अवलोकन", + "nav-staking-pool-description": "अरूहरूसँग सम्मिलित भएर कुनै पनि मात्राको ETHबाट स्टेक गर्नुहोस् र पुरस्कार कमाउनुहोस्", + "nav-staking-pool-label": "जम्मा गरिएको स्टेकिंग", + "nav-staking-saas-label": "एउटा सेवासँग स्ट्याकिङ गर्दै", + "nav-staking-solo-label": "एकल स्टेकिंग", + "nav-start-building-description": "नवागन्तुकहरूका लागि उपयोगी जानकारी", + "nav-translation-program-description": "सबै भाषाहरूमा ethereum.org लाई अनुवाद गर्ने एउटा सहकार्यात्मक प्रयास", + "nav-tutorials-description": "सामुदायिक ट्युटोरियलहरूका क्युरेट गरिएको सूची", + "nav-use-cases-description": "इथेरियम प्रयोगको लागि विभिन्न विचारहरू", + "nav-what-is-ether-description": "इथेरियम एपहरूका मुद्रा", + "nav-what-is-ethereum-description": "इथेरियमलाई के कुराले विशेष बनाउँछ भन्ने कुरा बुझ्नुहोस्", + "nav-what-is-web3-label": "Web3 के हो?", + "nav-what-is-web3-description": "नियमहरू निर्देशन गर्ने केन्द्रीकृत एकाधिकारहरूका एउटा विकल्प", + "nav-whitepaper-description": "सबैभन्दा पहिलो इथेरियम स्वेतपत्रलाई भिटालिक बुटेरिनले 2014मा लेखेका हुन्", + "nav-zkp-description": "बयानलाई खुलासा नगरिकन त्यस बयानको वैधतालाई प्रमाणित गर्ने एउटा तरिका", "nft-page": "NFTs - नन-फन्जिबल टोकन", "nfts": "NFTs", "no": "होइन", @@ -140,6 +235,7 @@ "page-developers-aria-label": "निर्माताको मेनु", "page-index-meta-title": "गृहपृष्ठ", "page-last-updated": "पृष्ठ अन्तिम पटक अद्यावधिक गरिएको", + "participate-menu": "सहभागी मेनु", "pbs": "प्रस्तावक-निर्माता विभाजन", "pools": "जम्मा गरिएको स्टेकिंग", "privacy-policy": "गोपनीयता नीति", @@ -150,13 +246,11 @@ "refresh": "कृपया पृष्ठलाई रिफ्रेस गर्नुहोस।", "return-home": "गृहपृष्ठमा फर्कनुहोस", "roadmap": "इथेरियम रोडम्याप", + "research": "अनुसन्धान", + "research-menu": "अनुसन्धान मेनु", "resources": "अनुवादका स्रोतहरू", - "regenerative-finance": "ReFi - Regenerative finance", - "run-a-node": "Run a node", - "rollup-component-website": "Website", "rollup-component-developer-docs": "निर्माताको कागजात", "rollup-component-technology-and-risk-summary": "प्रविधि र जोखिमको सारांश", - "scaling": "Scaling", "saas": "सेवाको रूपमा स्टेकिंग", "search": "खोज्नुहोस्", "search-ethereum-org": "ethereum.orgमा खोज्नुहोस्", @@ -167,19 +261,12 @@ "single-slot-finality": "एकल-स्लट फाइनालिटि", "statelessness": "स्तिथिविहीनता", "see-contributors": "योगदानकर्ताहरु हेर्नुहोस्", - "set-up-local-env": "Set up local environment", - "sharding": "Sharding", "show-all": "सबै देखाउनुहोस", "show-less": "कम देखाउनुहोस", "site-description": "ईथेरियम एक विश्वव्यापी, विकेन्द्रित प्लेटफर्म हो जुन वित्तिय तथा अन्य प्रयोगका लागि बनाइएको हो। ईथेरियममा तपाईंले विश्वभरबाट पहुँच हुने पैसा नियन्त्रण गर्ने कोड लेख्न र एप्पहरु बनाउन सक्नुहुनेछ।", - "site-title": "ethereum.org", "skip-to-main-content": "सिधै मुख्य विषयवस्तुमा जानुहोस्", - "smart-contracts": "Smart contracts", - "stablecoins": "Stablecoins", - "stake-eth": "Stake ETH", "staking": "स्टेकिंग", "start-here": "यहाँबाट सुरु गर्नुहोस्", - "style-guide": "Style guide", "solo": "एकल स्टेकिंग", "terms-of-use": "उपयोगका सर्तहरु", "translation-banner-body-new": "तपाईंले यो पृष्ठ अंग्रेजीमा हेर्दै हुनुहुन्छ किनभने हामीले यसलाई अझै अनुवाद गरेका छैनौं। हामीलाई यो विषयवस्तु अनुवाद गर्न सहयोग गर्नुहोस्।", @@ -191,19 +278,19 @@ "translation-banner-no-bugs-title": "यहाँ कुनै बगहरू छैनन्!", "translation-banner-no-bugs-content": "यो पृष्ठ अनुवाद भइरहेको छैन। हामीले जानाजानी यो पृष्ठ अहिलेको लागि अंग्रेजीमा छोडेका छौं।", "translation-banner-no-bugs-dont-show-again": "फेरि नदेखाउनुहोस्", + "translation-program": "अनुवाद कार्यक्रम", "try-using-search": "तपाईंले जुन चिज खोजिरहनु भएको छ, त्यसकोलागि खोज्नको प्रयोग गर्ने प्रयास गर्नुहोस् वा", "tutorials": "ट्यूटोरियलहरू", "up": "माथि", + "use": "प्रयोग", "use-ethereum": "इथेरियम प्रयोग गर्नुहोस", "use-ethereum-menu": "इथेरियम मेनु प्रयोग गर्नुहोस", - "user-experience": "User experience", + "use-menu": "प्रयोग मेनु", "verkle-trees": "भर्कल ट्रिहरु", "wallets": "वालेटहरु", "we-couldnt-find-that-page": "हामीले त्यो पृष्ठ फेला पार्न सकेनौं", "web3": "Web3 के हो?", - "web3-title": "Web3", "website-last-updated": "वेबसाइट अन्तिम पटक अद्यावधिक गरिएको", - "what-is-ether": "What is ether (ETH)?", "what-is-ethereum": "इथरियम के हो?", "withdrawals": "स्टेकिंग निकासी", "yes": "हो", diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index f52f15a8b9d..b46f6c713d0 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -5,8 +5,6 @@ "adding-developer-tools": "Dodawanie narzędzi deweloperskich", "adding-exchanges": "Dodawanie giełd", "adding-glossary-terms": "Dodawanie terminów glosariusza", - "adding-layer-2s": "Adding Layer 2s", - "adding-products": "Adding Products", "adding-staking-products": "Dodawanie produktów stakingowych", "adding-wallets": "Dodawanie portfeli", "account-abstraction": "Abstrakcja konta", @@ -229,7 +227,6 @@ "nav-roadmap-security-description": "Dbanie o to, aby sieć Ethereum pozostała odporna na wszelkiego rodzaju ataki w przyszłości", "nav-roadmap-security-label": "Zwiększone bezpieczeństwo", "nav-roadmap-ux-description": "Korzystanie z Ethereum wymaga uproszczenia", - "nav-roadmap-ux-label": "Better user experience", "nav-run-a-node-description": "Zapewnij sobie pełną suwerenność, zarazem pomagając w zabezpieczeniu sieci", "nav-security-description": "Poznaj najlepsze praktyki dotyczące korzystania z kryptowalut", "nav-smart-contracts-description": "Podstawowe elementy składowe ekosystemu Ethereum", @@ -248,7 +245,6 @@ "nav-translation-program-description": "Wspólny wysiłek na rzecz przetłumaczenia ethereum.org na wszystkie języki", "nav-tutorials-description": "Wyselekcjonowana lista samouczków społeczności", "nav-use-cases-description": "Odkryj różne pomysły na wykorzystanie Ethereum", - "nav-use-cases-label": "Use cases", "nav-what-is-ether-description": "Waluta aplikacji Ethereum", "nav-what-is-ethereum-description": "Dowiedz się, co wyróżnia Ethereum", "nav-what-is-web3-label": "Co to jest Web3?", diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index 5293ac67414..14c2016ca96 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -164,7 +164,7 @@ "nav-desoc-description": "基於區塊鏈的平台,用於社交互動、内容建立。", "nav-developers-docs": "開發者文件", "nav-developers": "開發者", - "nav-did-description": "發佈並擁有您獨特的去中心化身分識別", + "nav-did-description": "發佈並擁有你獨特的去中心化身分識別", "nav-docs-description": "幫助你瞭解並使用以太坊來建造的文件", "nav-docs-design-description": "獨特的 Web3 設計挑戰、最佳案例和使用研究洞見的說明", "nav-docs-design-label": "UX/UI 設計基礎", @@ -300,7 +300,6 @@ "show-all": "顯示全部", "show-less": "收起", "site-description": "以太坊是一個全球化、去中心化平台,提供營利商機和新型應用程式。你可以在以太坊撰寫程式碼控制資金,並建立可從全球各地存取的應用程式。", - "site-title": "ethereum.org", "skip-to-main-content": "跳至主要内容", "smart-contracts": "智慧型合約", "stablecoins": "穩定幣", From 4413b711b96265c134749d5118cc72bd78d4a6db Mon Sep 17 00:00:00 2001 From: Dimitris Apostolou Date: Thu, 22 Feb 2024 22:53:54 +0200 Subject: [PATCH 423/478] Fix typo --- .github/ISSUE_TEMPLATE/suggest_glossary_term.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml b/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml index 4510fc1eb8b..5d2cb21c97e 100644 --- a/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml +++ b/.github/ISSUE_TEMPLATE/suggest_glossary_term.yaml @@ -31,7 +31,7 @@ body: - type: textarea id: glossary_term_sources attributes: - label: Sources, if any (please do not submit copywrited content without appropriate approval) + label: Sources, if any (please do not submit copyrighted content without appropriate approval) description: Please list any sources utilized validations: required: false From fc35ae7a187ffb30e2063b788844b9563cb7fde7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 15:09:55 -0800 Subject: [PATCH 424/478] chore: move acronym to start of label --- src/intl/am/common.json | 2 +- src/intl/ar/common.json | 2 +- src/intl/az/common.json | 2 +- src/intl/be/common.json | 2 +- src/intl/bg/common.json | 2 +- src/intl/bn/common.json | 2 +- src/intl/bs/common.json | 2 +- src/intl/ca/common.json | 2 +- src/intl/cs/common.json | 2 +- src/intl/da/common.json | 2 +- src/intl/de/common.json | 2 +- src/intl/el/common.json | 2 +- src/intl/en/common.json | 2 +- src/intl/es/common.json | 2 +- src/intl/fa/common.json | 2 +- src/intl/fi/common.json | 2 +- src/intl/fil/common.json | 2 +- src/intl/fr/common.json | 2 +- src/intl/gu/common.json | 2 +- src/intl/he/common.json | 2 +- src/intl/hi/common.json | 2 +- src/intl/hr/common.json | 2 +- src/intl/hu/common.json | 2 +- src/intl/hy-am/common.json | 2 +- src/intl/id/common.json | 2 +- src/intl/ig/common.json | 2 +- src/intl/it/common.json | 2 +- src/intl/ja/common.json | 2 +- src/intl/ka/common.json | 2 +- src/intl/kk/common.json | 2 +- src/intl/km/common.json | 2 +- src/intl/kn/common.json | 2 +- src/intl/ko/common.json | 2 +- src/intl/ml/common.json | 2 +- src/intl/mr/common.json | 2 +- src/intl/ms/common.json | 2 +- src/intl/nb/common.json | 2 +- src/intl/ne-np/common.json | 2 +- src/intl/nl/common.json | 2 +- src/intl/pcm/common.json | 2 +- src/intl/pl/common.json | 2 +- src/intl/pt-br/common.json | 2 +- src/intl/pt/common.json | 2 +- src/intl/ro/common.json | 2 +- src/intl/ru/common.json | 2 +- src/intl/se/common.json | 2 +- src/intl/sk/common.json | 2 +- src/intl/sl/common.json | 2 +- src/intl/sr/common.json | 2 +- src/intl/sw/common.json | 2 +- src/intl/ta/common.json | 2 +- src/intl/th/common.json | 2 +- src/intl/tk/common.json | 2 +- src/intl/tr/common.json | 2 +- src/intl/uk/common.json | 2 +- src/intl/ur/common.json | 2 +- src/intl/uz/common.json | 2 +- src/intl/vi/common.json | 2 +- src/intl/zh-tw/common.json | 2 +- src/intl/zh/common.json | 2 +- 60 files changed, 60 insertions(+), 60 deletions(-) diff --git a/src/intl/am/common.json b/src/intl/am/common.json index 4e32f12a422..3e188d51ed4 100644 --- a/src/intl/am/common.json +++ b/src/intl/am/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "የEthereum ቁልል ሁሉንም ዝርዝሮች ይረዱ", "nav-docs-stack-label": "የኢቲሪየም ስታክ", "nav-eip-description": "አዲስ ባህሪያትን ወይም ሂደቶችን የሚገልጹ ደረጃዎች", - "nav-eip-label": "የEthereum ማሻሻያ ፕሮፖዛል (EIPዎች)", + "nav-eip-label": "EIPዎች - የEthereum ማሻሻያ ፕሮፖዛል", "nav-emerging-description": "ለEthereum ሌሎች አዳዲስ የጉዳዩ ጥቅሞችን ይወቁ", "nav-enterprise-description": "ለEthereum የንግድ መተግበሪያዎች", "nav-ethereum-org-description": "ይህ ድረ ገጽ በማህበረሰብ የሚመራ ነው - ይቀላቀሉን እና እርስዎም ያዋጡ", diff --git a/src/intl/ar/common.json b/src/intl/ar/common.json index a2d7a8899a7..f5a4c6f0cc0 100644 --- a/src/intl/ar/common.json +++ b/src/intl/ar/common.json @@ -173,7 +173,7 @@ "nav-docs-stack-description": "فهم جميع التفاصيل المتعلقة بحزمة إيثيريوم", "nav-docs-stack-label": "كومة ايثيريوم", "nav-eip-description": "المعايير التي تحدد الميزات أو العمليات الجديدة", - "nav-eip-label": "مقترحات تحسين إيثيريوم (EIP)", + "nav-eip-label": "EIP - مقترحات تحسين إيثيريوم", "nav-emerging-description": "تعرَّف على أحدث حالات استخدام إيثريوم الأخرى", "nav-emerging-label": "حالات الاستخدام الناشئة", "nav-enterprise-description": "تطبيقات إيثريوم للأعمال", diff --git a/src/intl/az/common.json b/src/intl/az/common.json index 9ef53e6a892..6c053c6a171 100644 --- a/src/intl/az/common.json +++ b/src/intl/az/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "Tərtibatçı sənədləri üçün mərkəz", "nav-docs-stack-description": "Ethereum platformasının bütün təfərrüatlarını anlayın", "nav-eip-description": "Yeni xüsusiyyətləri və ya prosesləri müəyyən edən standartlar", - "nav-eip-label": "Ethereum təkmilləşdirmə təklifləri (EIP-lər)", + "nav-eip-label": "EIP-lər - Ethereum təkmilləşdirmə təklifləri", "nav-emerging-description": "Ethereum-un digər daha yeni istifadə halları barədə öyrənin", "nav-enterprise-description": "Ethereum üçün biznes tətbiqləri", "nav-ethereum-org-description": "Bu vebsayt icma tərəfindən idarə edilir—bizə qoşulun və öz töhfənizi verin", diff --git a/src/intl/be/common.json b/src/intl/be/common.json index 1cdfb3e756e..3b83299e9df 100644 --- a/src/intl/be/common.json +++ b/src/intl/be/common.json @@ -164,7 +164,7 @@ "nav-docs-overview-description": "Ваша галоўная старонка для дакументаў па распрацоўцы", "nav-docs-stack-description": "Зразумець усё пра стэк Ethereum", "nav-eip-description": "Стандарты, якія вызначаюць новыя функцыі або працэсы", - "nav-eip-label": "Прапановы па паляпшэнні Ethereum (EIP)", + "nav-eip-label": "EIP - Прапановы па паляпшэнні Ethereum", "nav-emerging-description": "Пазнаёмцеся з новымі магчымасцямі выкарыстання Ethereum", "nav-enterprise-description": "Ethereum: праграмныя дадаткі для бізнесу", "nav-ethereum-org-description": "Гэты вэб-сайт быў створаны па ініцыятыве супольнасці — далучайцеся да нас і рабіце свой унёсак разам з намі", diff --git a/src/intl/bg/common.json b/src/intl/bg/common.json index 51f538fd6c2..e6dbd6b48cf 100644 --- a/src/intl/bg/common.json +++ b/src/intl/bg/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "Разберете всички подробности за обема на Етереум", "nav-docs-stack-label": "Обем на Етереум", "nav-eip-description": "Стандарти, които определят нови функции или процеси", - "nav-eip-label": "Предложения за подобряване на Eтереум (EIP)", + "nav-eip-label": "EIP - Предложения за подобряване на Eтереум", "nav-emerging-description": "Запознайте се с други, по-нови случаи на използване за Eтереум", "nav-enterprise-description": "Бизнес приложения за Eтереум", "nav-ethereum-org-description": "Този уебсайт се ръководи от общността – присъединете се към нас и дайте своя принос", diff --git a/src/intl/bn/common.json b/src/intl/bn/common.json index 71e00b38b1d..738641a6dc6 100644 --- a/src/intl/bn/common.json +++ b/src/intl/bn/common.json @@ -169,7 +169,7 @@ "nav-docs-overview-description": "আপনার ডেভেলপার হোমের ডক্স", "nav-docs-stack-description": "ইথেরিয়াম স্ট্যাকের সমস্ত বিস্তারিত বোঝা", "nav-eip-description": "স্ট্যান্ডার্ড যা নতুন ফিচার বা প্রক্রিয়াকে সুনির্দিষ্ট করে", - "nav-eip-label": "ইথেরিয়াম উন্নয়নের প্রস্তাব (EIP)", + "nav-eip-label": "EIP - ইথেরিয়াম উন্নয়নের প্রস্তাব", "nav-emerging-description": "ইথেরিয়াম আরও নতুন কোন কোন ভাবে ব্যবহার করা সম্ভব তা জানুন", "nav-enterprise-description": "ইথেরিয়ামের জন্য বিজনেস অ্যাপ্লিকেশন", "nav-ethereum-org-description": "এই ওয়েবসাইটটি কমিউনিটির দ্বারা চালিত হয়—আমাদের সাথে যোগ দিন এবং আপনার অবদান রাখুন", diff --git a/src/intl/bs/common.json b/src/intl/bs/common.json index 0d612748ad7..49355ad2f9e 100644 --- a/src/intl/bs/common.json +++ b/src/intl/bs/common.json @@ -160,7 +160,7 @@ "nav-docs-overview-description": "Vaš dom za dokumente razvojnih programera", "nav-docs-stack-description": "Naučite sve detalje Ethereum stacka", "nav-eip-description": "Standardi koji određuju nove funkcije ili procese", - "nav-eip-label": "Prijedlozi za poboljšanje Ethereuma (EIP-ovi)", + "nav-eip-label": "EIP-ovi - Prijedlozi za poboljšanje Ethereuma", "nav-emerging-description": "Upoznajte druge novije slučajeve upotrebe za Ethereum", "nav-emerging-label": "Primjeri korštenja u nastajanju", "nav-enterprise-description": "Poslovne aplikacije za Ethereum", diff --git a/src/intl/ca/common.json b/src/intl/ca/common.json index 058140420aa..80b095fd654 100644 --- a/src/intl/ca/common.json +++ b/src/intl/ca/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Compreneu tots els detalls de la pila Ethereum", "nav-docs-stack-label": "Pila Ethereum", "nav-eip-description": "Estàndards que especifiquen noves característiques o processos", - "nav-eip-label": "Propostes de millora d'Ethereum (EIP)", + "nav-eip-label": "EIP - Propostes de millora d'Ethereum", "nav-emerging-description": "Coneixeu altres casos d'ús més nous per a Ethereum", "nav-enterprise-description": "Aplicacions empresarials per a Ethereum", "nav-ethereum-org-description": "Aquest lloc web l'impulsa la comunitat, uniu-vos a nosaltres i contribuïu també", diff --git a/src/intl/cs/common.json b/src/intl/cs/common.json index ec37bed5f2e..7f1b875b9d4 100644 --- a/src/intl/cs/common.json +++ b/src/intl/cs/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Seznamte se se všemi podrobnostmi Ethereum zásobníku", "nav-docs-stack-label": "Ethereum zásobník", "nav-eip-description": "Normy, které specifikují nové funkce nebo postupy", - "nav-eip-label": "Návrhy na zlepšení platformy Ethereum (EIP)", + "nav-eip-label": "EIP - Návrhy na zlepšení platformy Ethereum", "nav-emerging-description": "Seznamte se s dalšími novějšími případy použití Etherea", "nav-emerging-label": "Rozvíjející se případy použití", "nav-enterprise-description": "Obchodní aplikace pro Ethereum", diff --git a/src/intl/da/common.json b/src/intl/da/common.json index 8bf10697b5b..f416ffa7fde 100644 --- a/src/intl/da/common.json +++ b/src/intl/da/common.json @@ -169,7 +169,7 @@ "nav-docs-stack-description": "Forstå alle detaljerne i Ethereum stack", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Standarder, der specificerer nye funktioner eller processer", - "nav-eip-label": "Forslag til Ethereums forbedring (EIP'er)", + "nav-eip-label": "EIP'er - Forslag til Ethereums forbedring", "nav-emerging-description": "Lær andre nyere brugseksempler for Ethereum", "nav-enterprise-description": "Forretningsapplikationer til Ethereum", "nav-ethereum-org-description": "Denne hjemmeside er fællesskabsdrevet - slut dig til os, og bidrag", diff --git a/src/intl/de/common.json b/src/intl/de/common.json index 20a7ab0dc3a..fabfacf8351 100644 --- a/src/intl/de/common.json +++ b/src/intl/de/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Verstehen Sie den Ethereum-Stack in allen Einzelheiten", "nav-docs-stack-label": "Ethereum-Stack", "nav-eip-description": "Standards, die neue Funktionen oder Prozesse bezeichnen", - "nav-eip-label": "Ethereum Verbesserungsvorschläge (EIPs)", + "nav-eip-label": "EIPs - Ethereum Verbesserungsvorschläge", "nav-emerging-description": "Lernen Sie mehr aktuelle Anwendungsfälle für Ethereum kennen", "nav-emerging-label": "Neue Anwendungsfälle", "nav-enterprise-description": "Geschäftliche Anwendungen für Ethereum", diff --git a/src/intl/el/common.json b/src/intl/el/common.json index d934a884446..6db31724217 100644 --- a/src/intl/el/common.json +++ b/src/intl/el/common.json @@ -173,7 +173,7 @@ "nav-docs-overview-description": "Η αρχική σελίδα σας για τα έγγραφα σχετικά με τον προγραμματισμό", "nav-docs-stack-description": "Κατανοήστε όλες τις λεπτομέρειες του Ethereum stack", "nav-eip-description": "Πρότυπα που προσδιορίζουν νέες δυνατότητες ή διεργασίες", - "nav-eip-label": "Προτάσεις βελτίωσης Ethereum (EIP)", + "nav-eip-label": "EIP - Προτάσεις βελτίωσης Ethereum", "nav-emerging-description": "Μάθετε για άλλες νεότερες περιπτώσεις χρήσης του Ethereum", "nav-emerging-label": "Μελλοντικές περιπτώσεις χρήσης", "nav-enterprise-description": "Επιχειρηματικές εφαρμογές για το Ethereum", diff --git a/src/intl/en/common.json b/src/intl/en/common.json index bc7759c511d..5c3195c5482 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -175,7 +175,7 @@ "nav-docs-stack-description": "Understand all the details of the Ethereum stack", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Standards that specify new features or processes", - "nav-eip-label": "Ethereum improvement proposals (EIPs)", + "nav-eip-label": "EIPs - Ethereum improvement proposals", "nav-emerging-description": "Get to know other newer use cases for Ethereum", "nav-emerging-label": "Emerging use cases", "nav-enterprise-description": "Business applications for Ethereum", diff --git a/src/intl/es/common.json b/src/intl/es/common.json index 487163cbe4a..8a889d2b7d5 100644 --- a/src/intl/es/common.json +++ b/src/intl/es/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Entender todos los detalles de la pila Ethereum", "nav-docs-stack-label": "Pila de Ethereum", "nav-eip-description": "Estándares que especifican nuevas características o procesos", - "nav-eip-label": "Propuestas de mejora de Ethereum (EIP)", + "nav-eip-label": "EIP - Propuestas de mejora de Ethereum", "nav-emerging-description": "Conozca otros nuevos casos de uso para Ethereum", "nav-emerging-label": "Casos de uso emergentes", "nav-enterprise-description": "Aplicaciones empresariales para Ethereum", diff --git a/src/intl/fa/common.json b/src/intl/fa/common.json index 137fad43c86..cda3cd041cc 100644 --- a/src/intl/fa/common.json +++ b/src/intl/fa/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "از تمام جزئیات سهام اتریوم آگاه شوید", "nav-docs-stack-label": "سهام اتریوم", "nav-eip-description": "استانداردهایی که ویژگی‌ها یا فرآیندهای جدید را مشخص می‌کنند", - "nav-eip-label": "پیشنهادهای بهبود اتریوم (EIPs)", + "nav-eip-label": "EIPs - پیشنهادهای بهبود اتریوم", "nav-emerging-description": "سایر موارد کاربردهای جدیدتر برای اتریوم را بشناسید", "nav-emerging-label": "موارد کاربرد در حال ظهور", "nav-enterprise-description": "کاربردهای تجاری برای اتریوم", diff --git a/src/intl/fi/common.json b/src/intl/fi/common.json index aa26783b865..ce4e25c185d 100644 --- a/src/intl/fi/common.json +++ b/src/intl/fi/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "Etusivusi kehittäjän dokumenteille", "nav-docs-stack-description": "Tutustu Ethereum-pinon yksityiskohtiin", "nav-eip-description": "Uusia ominaisuuksia tai prosesseja määrittelevät standardit", - "nav-eip-label": "Ethereum-parannusehdotukset (EIP:t)", + "nav-eip-label": "EIP:t - Ethereum-parannusehdotukset", "nav-emerging-description": "Tutustu muihin uudempiin Ethereumin käyttötapauksiin", "nav-enterprise-description": "Liiketoimintasovellukset Ethereumille", "nav-ethereum-org-description": "Tämä verkkosivusto on yhteisölähtöinen – liity mukaan ja osallistu", diff --git a/src/intl/fil/common.json b/src/intl/fil/common.json index 36d8dcc0b92..86600debbdc 100644 --- a/src/intl/fil/common.json +++ b/src/intl/fil/common.json @@ -167,7 +167,7 @@ "nav-docs-overview-description": "Ang tahanan mo para sa mga dokumento ng developer", "nav-docs-stack-description": "Maunawaan ang lahat ng detalye ng Ethereum stack", "nav-eip-description": "Mga pamantayan na tumutukoy ng mga bagong feature o proseso", - "nav-eip-label": "Mga pagsusulong para sa pagpapabuti ng Ethereum (EIPs)", + "nav-eip-label": "EIPs - Mga pagsusulong para sa pagpapabuti ng Ethereum", "nav-emerging-description": "Malaman ang ibang mas bagong mga kaso ng paggamit para sa Ethereum", "nav-emerging-label": "Mga bagong use case", "nav-enterprise-description": "Mga gamit sa negosyo ng Ethereum", diff --git a/src/intl/fr/common.json b/src/intl/fr/common.json index b2a015a38a2..5cc7cec9341 100644 --- a/src/intl/fr/common.json +++ b/src/intl/fr/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Comprendre tous les détails de la pile Ethereum", "nav-docs-stack-label": "Pile d'Ethereum", "nav-eip-description": "Normes définissant de nouvelles caractéristiques ou de nouveaux processus", - "nav-eip-label": "Propositions d'amélioration d'Ethereum (EIP)", + "nav-eip-label": "EIP - Propositions d'amélioration d'Ethereum", "nav-emerging-description": "Découvrez d'autres cas d'utilisation plus récents d'Ethereum", "nav-emerging-label": "Cas d'utilisation émergents", "nav-enterprise-description": "Applications commerciales d'Ethereum", diff --git a/src/intl/gu/common.json b/src/intl/gu/common.json index 52c35133421..f36e83f4519 100644 --- a/src/intl/gu/common.json +++ b/src/intl/gu/common.json @@ -167,7 +167,7 @@ "nav-docs-overview-description": "વિકાસકર્તા દસ્તાવેજો માટે તમારું હોમ", "nav-docs-stack-description": "ઈથિરિયમ સ્ટેકની તમામ વિગતો સમજો", "nav-eip-description": "ધોરણો કે જે નવી સુવિધાઓ અથવા પ્રક્રિયાઓનો ઉલ્લેખ કરે છે", - "nav-eip-label": "ઈથિરિયમ સુધારણા દરખાસ્તો (EIP)", + "nav-eip-label": "EIP - ઈથિરિયમ સુધારણા દરખાસ્તો", "nav-emerging-description": "ઈથિરિયમ માટે અન્ય નવા ઉપયોગના કેસો જાણો", "nav-enterprise-description": "ઈથિરિયમ માટે વ્યવસાયિક એપ્લિકેશન્સ", "nav-ethereum-org-description": "આ વેબસાઇટ સમુદાય આધારિત છે - અમારી સાથે જોડાઓ અને યોગદાન આપો", diff --git a/src/intl/he/common.json b/src/intl/he/common.json index 0078e8169ad..6db1b768429 100644 --- a/src/intl/he/common.json +++ b/src/intl/he/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "הבית שלך למסמכי המפתח", "nav-docs-stack-description": "תבין את כל הפרטים של אתריום", "nav-eip-description": "התקנים המגדירים את התכונות או תהליכים החדשים", - "nav-eip-label": "הצעות לשיפור אתריום (EIP)", + "nav-eip-label": "EIP - הצעות לשיפור אתריום", "nav-emerging-description": "למד על מקרי שימוש חדשים אחרים באתריום", "nav-enterprise-description": "אפליקציות עסקיות לאתריום", "nav-ethereum-org-description": "האתר מונע ע\"י קהילה - הצטרף אלינו ותרום גם כן", diff --git a/src/intl/hi/common.json b/src/intl/hi/common.json index c0dd7a97810..5c55c097c0c 100644 --- a/src/intl/hi/common.json +++ b/src/intl/hi/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "एथेरियम स्टैक का सारा विवरण समझें", "nav-docs-stack-label": "इथेरियम स्टैक", "nav-eip-description": "नए फ़ीचर और प्रोसेस के बारे में बताने वाले मानक", - "nav-eip-label": "एथेरियम सुधार प्रस्ताव (EIP)", + "nav-eip-label": "EIP - एथेरियम सुधार प्रस्ताव", "nav-emerging-description": "एथेरियम के दूसरे नए उपयोग से जुड़े मामलों के बारे में जानें", "nav-emerging-label": "उभरते उपयोग के मामले", "nav-enterprise-description": "एथेरियम के लिए बिज़नेस एप्लिकेशन", diff --git a/src/intl/hr/common.json b/src/intl/hr/common.json index 3171b483a7d..f25c8c5119c 100644 --- a/src/intl/hr/common.json +++ b/src/intl/hr/common.json @@ -170,7 +170,7 @@ "nav-docs-stack-description": "Razumijevanje svih pojedinosti Ethereumovih stogova", "nav-docs-stack-label": "Ethereumovi stogovi", "nav-eip-description": "Standardi koji definiraju nove značajke ili postupke", - "nav-eip-label": "Prijedlozi za poboljšanje Ethereuma (EIP)", + "nav-eip-label": "EIP - Prijedlozi za poboljšanje Ethereuma", "nav-emerging-description": "Upoznajte novije slučajeve upotrebe Ethereuma", "nav-enterprise-description": "Poslovne primjene Ethereuma", "nav-ethereum-org-description": "Ovo web-mjesto pokreće zajednica – pridružite nam se i doprinesite svojim sudjelovanjem", diff --git a/src/intl/hu/common.json b/src/intl/hu/common.json index 7bf1ef880bc..0a72019d6bd 100644 --- a/src/intl/hu/common.json +++ b/src/intl/hu/common.json @@ -172,7 +172,7 @@ "nav-docs-overview-description": "A fejlesztői dokumentumok otthona", "nav-docs-stack-description": "Ismerje meg az Ethereum stack összes részletét", "nav-eip-description": "Szabványok, amelyek új funkciókat vagy folyamatokat határoznak meg", - "nav-eip-label": "Ethereum fejlesztési javaslatok (EIP-k)", + "nav-eip-label": "EIP-k - Ethereum fejlesztési javaslatok", "nav-emerging-description": "Ismerje meg az Ethereum egyéb, újabb felhasználási eseteit", "nav-emerging-label": "Új alkalmazási területek", "nav-enterprise-description": "Üzleti alkalmazások az Ethereumhoz", diff --git a/src/intl/hy-am/common.json b/src/intl/hy-am/common.json index 03496571ef2..1636546e29b 100644 --- a/src/intl/hy-am/common.json +++ b/src/intl/hy-am/common.json @@ -164,7 +164,7 @@ "nav-docs-overview-description": "Ձեր «Գլխավոր»-ը մշակողի փաստաթղթերի համար", "nav-docs-stack-description": "Հասկացեք Ethereum Stack-ի բոլոր մանրամասները", "nav-eip-description": "Ստանդարտներ, որոնք սահմանում են նոր գործառույթներ կամ գործընթացներ", - "nav-eip-label": "Ethereum-ի բարելավման առաջարկներ (EIPs)", + "nav-eip-label": "EIPs - Ethereum-ի բարելավման առաջարկներ", "nav-emerging-description": "Ծանոթացեք Ethereum-ի այլ նոր օգտագործման դեպքերին", "nav-enterprise-description": "Բիզնես հավելվածներ Ethereum-ի համար", "nav-ethereum-org-description": "Այս կայքը հիմնված է համայնքի վրա, միացե՛ք մեզ և նույնպես նպաստե՛ք", diff --git a/src/intl/id/common.json b/src/intl/id/common.json index 5a798766741..45af554f267 100644 --- a/src/intl/id/common.json +++ b/src/intl/id/common.json @@ -173,7 +173,7 @@ "nav-docs-stack-description": "Pahami semua detail tentang tumpukan Ethereum", "nav-docs-stack-label": "Tumpukan Ethereum", "nav-eip-description": "Standar yang menentukan fitur atau proses baru", - "nav-eip-label": "Proposal peningkatan Ethereum (EIP)", + "nav-eip-label": "EIP - Proposal peningkatan Ethereum", "nav-emerging-description": "Kenali kasus penggunaan baru lainnya untuk Ethereum", "nav-emerging-label": "Kasus penggunaan yang muncul", "nav-enterprise-description": "Aplikasi bisnis untuk Ethereum", diff --git a/src/intl/ig/common.json b/src/intl/ig/common.json index 6022875d3d1..6035c22eeb4 100644 --- a/src/intl/ig/common.json +++ b/src/intl/ig/common.json @@ -169,7 +169,7 @@ "nav-docs-overview-description": "Ụlọ weebusaiti mmepe peeji maka onye mmepụta", "nav-docs-stack-description": "Ghọta nkọwa niile nke Ethereum stack", "nav-eip-description": "Ụkpụrụ na-akọwapụta njiarú ma ọ bụ usoro ọhụrụ", - "nav-eip-label": "Atumatu Imeziwanye Ethereum (EIPs)", + "nav-eip-label": "EIPs - Atumatu Imeziwanye Ethereum", "nav-emerging-description": "Mata mmekọrịta ọhụrụ ndị ọzọ mere na Ethereum", "nav-emerging-label": "Okwu ojiji na-apụta", "nav-enterprise-description": "Ngwa azụmahịa maka Ethereum", diff --git a/src/intl/it/common.json b/src/intl/it/common.json index f192b05544c..8248fde5c45 100644 --- a/src/intl/it/common.json +++ b/src/intl/it/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Capire tutti i dettagli dello stack di Ethereum", "nav-docs-stack-label": "Stack di Ethereum", "nav-eip-description": "Standard che specificano nuove funzionalità o processi", - "nav-eip-label": "Proposte di miglioramento di Ethereum (EIP)", + "nav-eip-label": "EIP - Proposte di miglioramento di Ethereum", "nav-emerging-description": "Conoscere altri casi d'uso più recenti di Ethereum", "nav-emerging-label": "Casi d'uso emergenti", "nav-enterprise-description": "Applicazioni commerciali di Ethereum", diff --git a/src/intl/ja/common.json b/src/intl/ja/common.json index 9988f7c5956..e0e478f950c 100644 --- a/src/intl/ja/common.json +++ b/src/intl/ja/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "イーサリアムスタックの全詳細を理解する", "nav-docs-stack-label": "イーサリアムスタック", "nav-eip-description": "新機能やプロセスを特定する基準", - "nav-eip-label": "イーサリアム改善提案(EIP)", + "nav-eip-label": "EIP - イーサリアム改善提案", "nav-emerging-description": "イーサリアムの他の新しいユースケースを知る", "nav-emerging-label": "新たなユースケース", "nav-enterprise-description": "イーサリアムのビジネスアプリケーション", diff --git a/src/intl/ka/common.json b/src/intl/ka/common.json index fb618fb1e3d..4c17c15679e 100644 --- a/src/intl/ka/common.json +++ b/src/intl/ka/common.json @@ -169,7 +169,7 @@ "nav-docs-overview-description": "დეველოპერის დოკუმენტების თქვენი მთავარი გვერდი", "nav-docs-stack-description": "ეთერეუმის სტეკის ყველა დეტალის გააზრება", "nav-eip-description": "ახალი ფუნქციების თუ პროცესების მაკონკრეტებელი სტანდარტები", - "nav-eip-label": "ეთერეუმის წინადადებები და შეთავაზებები (EIP-ები)", + "nav-eip-label": "EIP-ები - ეთერეუმის წინადადებები და შეთავაზებები", "nav-emerging-description": "ეთერეუმის სხვა უფრო ახალი გამოყენების ქეისების გაცნობა", "nav-enterprise-description": "ეთერეუმის ბიზნეს აპლიკაციები", "nav-ethereum-org-description": "ვებსაიტი იმართება საზოგადოების მიერ—შემოგვიერთდით და მიიღეთ მონაწილეობა", diff --git a/src/intl/kk/common.json b/src/intl/kk/common.json index 4c8878363e2..372ed9d0e09 100644 --- a/src/intl/kk/common.json +++ b/src/intl/kk/common.json @@ -167,7 +167,7 @@ "nav-docs-overview-description": "Әзірлеуші құжаттарының мекені", "nav-docs-stack-description": "Ethereum стегінің барлық мәліметтерін түсініңіз", "nav-eip-description": "Жаңа мүмкіндіктерді немесе процестерді көрсететін стандарттар", - "nav-eip-label": "Ethereum жетілдіру ұсыныстары (EIP)", + "nav-eip-label": "EIP - Ethereum жетілдіру ұсыныстары", "nav-emerging-description": "Ethereum үшін басқа жаңа қолдану жағдайларын біліңіз", "nav-enterprise-description": "Ethereum үшін бизнестік қолданбалар", "nav-ethereum-org-description": "Бұл веб-сайт қауымдастық тарапынан басқарылады—бізге қосылып, өз үлесіңізді қосыңыз", diff --git a/src/intl/km/common.json b/src/intl/km/common.json index 2dfca119496..bf7597404f5 100644 --- a/src/intl/km/common.json +++ b/src/intl/km/common.json @@ -166,7 +166,7 @@ "nav-docs-overview-description": "ផ្ទះរបស់អ្នក​សម្រាប់​ឯកសារអ្នកអភិវឌ្ឍន៍", "nav-docs-stack-description": "ស្វែងយល់ពីព័ត៌មានលម្អិតទាំងអស់នៃ stack របស់ Ethereum", "nav-eip-description": "ស្ដង់ដារ​ដែល​បញ្ជាក់មុខងារ​ ឬ​ដំណើរការ​ថ្មី", - "nav-eip-label": "សំណើកែលម្អ Ethereum (EIP)", + "nav-eip-label": "EIP - សំណើកែលម្អ Ethereum", "nav-emerging-description": "ស្វែងយល់ពីករណីប្រើប្រាស់ថ្មីជាងនេះផ្សេងទៀតសម្រាប់ Ethereum", "nav-enterprise-description": "កម្មវិធី​អាជីវកម្មសម្រាប់ Ethereum", "nav-ethereum-org-description": "គេហទំព័រនេះមានការជំរុញពីសហគមន៍ សូមចូលរួមជាមួយពួកយើង និងរួមចំណែកផងដែរ", diff --git a/src/intl/kn/common.json b/src/intl/kn/common.json index a4359e960d2..195667f9ae3 100644 --- a/src/intl/kn/common.json +++ b/src/intl/kn/common.json @@ -167,7 +167,7 @@ "nav-docs-overview-description": "ಡೆವಲಪರ್ ದಾಖಲೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ಮನೆ", "nav-docs-stack-description": "ಎಥೆರಿಯಮ್ ಸ್ಟಾಕಿನ ಎಲ್ಲಾ ವಿವರಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಿ", "nav-eip-description": "ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳು ಅಥವಾ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ ಮಾನದಂಡಗಳು", - "nav-eip-label": "ಇಥಿರಿಯಂ ಸುಧಾರಣಾ ಪ್ರಸ್ತಾವನೆಗಳು(ಇಸುಪ್ರ ಗಳು)", + "nav-eip-label": "ಇಸುಪ್ರ ಗಳು - ಇಥಿರಿಯಂ ಸುಧಾರಣಾ ಪ್ರಸ್ತಾವನೆಗಳು", "nav-emerging-description": "ಎಥೆರಿಯಮ್ನ ಇತರ ಹೊಸ ಬಳಕೆಯ ಪ್ರಕರಣಗಳನ್ನು ತಿಳಿದುಕೊಳ್ಳಿ", "nav-enterprise-description": "ಎಥೆರಿಯಮ್ಗಾಗಿ ವ್ಯವಹಾರ ಅಪ್ಲಿಕೇಶನ್ಗಳು", "nav-ethereum-org-description": "ಈ ಜಾಲತಾಣವು ಸಮುದಾಯ ಪ್ರೇರಿತವಾಗಿದೆ - ನಮ್ಮೊಂದಿಗೆ ಸೇರಿ ಹಾಗೂ ಕೊಡುಗೆ ನೀಡಿ", diff --git a/src/intl/ko/common.json b/src/intl/ko/common.json index ca22bd4dcc7..6d30712cee8 100644 --- a/src/intl/ko/common.json +++ b/src/intl/ko/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "이더리움 스택의 모든 세부 사항 이해하기", "nav-docs-stack-label": "이더리움 스택", "nav-eip-description": "새로운 기능이나 프로세스를 지정하는 표준", - "nav-eip-label": "이더리움 개선 제안(EIP)", + "nav-eip-label": "EIP - 이더리움 개선 제안", "nav-emerging-description": "이더리움에 대한 기타 새로운 사용 사례 알아보기", "nav-emerging-label": "새로운 사용 사례", "nav-enterprise-description": "이더리움의 비즈니스 애플리케이션", diff --git a/src/intl/ml/common.json b/src/intl/ml/common.json index 79dd534e918..f8d5a84958c 100644 --- a/src/intl/ml/common.json +++ b/src/intl/ml/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "ഇതറീയം സ്റ്റേക്കിന്റെ എല്ലാ വിശദാംശങ്ങളും മനസ്സിലാക്കുക", "nav-docs-stack-label": "Ethereum സ്റ്റേക്ക്", "nav-eip-description": "പുതിയ സവിശേഷതകളോ പ്രോസസ്സുകളോ വ്യക്തമാക്കുന്ന സ്റ്റാൻഡേർഡുകൾ", - "nav-eip-label": "Ethereum ഇംപ്രൂവ്മെന്‍റ് പ്രൊപ്പോസലുകള്‍ (EIP-കൾ)", + "nav-eip-label": "EIP-കൾ - Ethereum ഇംപ്രൂവ്മെന്‍റ് പ്രൊപ്പോസലുകള്‍", "nav-emerging-description": "Ethereum-നുള്ള ഏറ്റവും പുതിയ മറ്റ് ഉപയോഗ സാഹചര്യങ്ങൾ മനസ്സിലാക്കുക", "nav-enterprise-description": "Ethereum-നുള്ള ബിസിനസ് ആപ്ലിക്കേഷനുകൾ", "nav-ethereum-org-description": "ഈ വെബ്‌സൈറ്റ് കമ്മ്യൂണിറ്റി പ്രേരിതമാണ്—ഞങ്ങൾക്കൊപ്പം ചേർന്ന് സംഭാവന ചെയ്യൂ", diff --git a/src/intl/mr/common.json b/src/intl/mr/common.json index 89a0c23a675..9944d5a62bb 100644 --- a/src/intl/mr/common.json +++ b/src/intl/mr/common.json @@ -167,7 +167,7 @@ "nav-docs-overview-description": "विकसक दस्तऐवजांसाठी तुमचे होम", "nav-docs-stack-description": "इथरियम भागभांडवलाचे सर्व तपशील समजून घ्या", "nav-eip-description": "नवीन वैशिष्ट्ये किंवा प्रक्रिया निर्दिष्ट करणारी मानके", - "nav-eip-label": "इथरियम सुधारणा प्रस्ताव (EIPs)", + "nav-eip-label": "EIPs - इथरियम सुधारणा प्रस्ताव", "nav-emerging-description": "इथरियमसाठी इतर नवीन वापर प्रकरणे जाणून घ्या", "nav-enterprise-description": "इथरियमसाठी व्यवसाय ॲप्लिकेशन्स", "nav-ethereum-org-description": "ही वेबसाइट समुदायाद्वारे चालवली जात आहे—आमच्यात सामील व्हा आणि योगदान द्या", diff --git a/src/intl/ms/common.json b/src/intl/ms/common.json index e4c552d801e..e2a0133865f 100644 --- a/src/intl/ms/common.json +++ b/src/intl/ms/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Fahami semua butiran timbunan Ethereum", "nav-docs-stack-label": "Timbunan Ethereum", "nav-eip-description": "Standard yang menentukan ciri atau proses baharu", - "nav-eip-label": "Cadangan penambahbaikan Ethereum (EIP)", + "nav-eip-label": "EIP - Cadangan penambahbaikan Ethereum", "nav-emerging-description": "Kenali kes penggunaan baharu yang lain bagi Ethereum", "nav-emerging-label": "Kes penggunaan yang muncul", "nav-enterprise-description": "Aplikasi perniagaan untuk Ethereum", diff --git a/src/intl/nb/common.json b/src/intl/nb/common.json index 316ae4e5b59..8c969545fc4 100644 --- a/src/intl/nb/common.json +++ b/src/intl/nb/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "Ditt hjem for utviklere-dokumenter", "nav-docs-stack-description": "Forstå alle detaljene av Ethereum-stabelen", "nav-eip-description": "Standarder som angir nye funksjoner eller prosesser", - "nav-eip-label": "Forslag til forbedringer for Ethereum (EIPs)", + "nav-eip-label": "EIPs - Forslag til forbedringer for Ethereum", "nav-emerging-description": "Bli kjent med andre nyere brukstilfeller for Ethereum", "nav-enterprise-description": "Forretningsapplikasjoner for Ethereum", "nav-ethereum-org-description": "Dette nettstedet er drevet av fellesskapet – bli med oss og bidra også", diff --git a/src/intl/ne-np/common.json b/src/intl/ne-np/common.json index f3467e8b2e5..46d2fe308d3 100644 --- a/src/intl/ne-np/common.json +++ b/src/intl/ne-np/common.json @@ -158,7 +158,7 @@ "nav-docs-overview-description": "डेभेलपर कागजातहरूका लागि तपाईंको गृहपृष्ठ", "nav-docs-stack-description": "इथेरियम स्ट्याकको सबै विवरणहरू बुझ्नुहोस्", "nav-eip-description": "नयाँ विशेषताहरू वा प्रक्रियाहरू निर्दिष्ट गर्ने मानकहरू", - "nav-eip-label": "इथेरियम सुधार प्रस्तावहरू (EIPs)", + "nav-eip-label": "EIPs - इथेरियम सुधार प्रस्तावहरू", "nav-emerging-description": "इथेरियमको लागि अन्य नयाँ प्रयोग मामिलाहरू बारेमा थाहा पाउनुहोस्", "nav-enterprise-description": "इथेरियमको लागि व्यापारिक एप्लिकेशनहरू", "nav-ethereum-org-description": "यो वेबसाइट समुदाय सञ्चालित हो—हामीसँग जोडिनुहोस् र योगदान पनि गर्नुहोस्", diff --git a/src/intl/nl/common.json b/src/intl/nl/common.json index 9a33df80de4..2642fb818e6 100644 --- a/src/intl/nl/common.json +++ b/src/intl/nl/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "Begrijp alle details van de Ethereum stack", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Normen die nieuwe functies of processen specificeren", - "nav-eip-label": "Ethereum-verbeteringsvoorstellen (EIP's)", + "nav-eip-label": "EIP's - Ethereum-verbeteringsvoorstellen", "nav-emerging-description": "Maak kennis met andere nieuwere gebruiksscenario's voor Ethereum", "nav-enterprise-description": "Zakelijke toepassingen voor Ethereum", "nav-ethereum-org-description": "Deze website wordt door de gemeenschap aangestuurd — doe mee en draag ook bij", diff --git a/src/intl/pcm/common.json b/src/intl/pcm/common.json index 45de847bd24..8cf9840adb6 100644 --- a/src/intl/pcm/common.json +++ b/src/intl/pcm/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "Yor home for divelopa docs", "nav-docs-stack-description": "Ondastand all di details wey dey for di Ethereum stack", "nav-eip-description": "Standards wey spesify new fitures abi processes", - "nav-eip-label": "Ethereum improvement proposal (EIPs)", + "nav-eip-label": "EIPs - Ethereum improvement proposal", "nav-emerging-description": "Mak yu sabi oda case for Ethereum wey new pass", "nav-enterprise-description": "Biznes aplikashons wey dey for Ethereum", "nav-ethereum-org-description": "Dis website na wetin komunity dey drive—make yu join us andi kontribute too", diff --git a/src/intl/pl/common.json b/src/intl/pl/common.json index b46f6c713d0..99864fc4670 100644 --- a/src/intl/pl/common.json +++ b/src/intl/pl/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Poznaj wszystkie szczegóły stosu Ethereum", "nav-docs-stack-label": "Stos Ethereum", "nav-eip-description": "Standardy określające nowe funkcje lub procesy", - "nav-eip-label": "Wnioski dotyczące ulepszenia Ethereum (EIP)", + "nav-eip-label": "EIP - Wnioski dotyczące ulepszenia Ethereum", "nav-emerging-description": "Poznaj inne, nowsze przypadki użycia Ethereum", "nav-emerging-label": "Pojawiające się przypadki użycia", "nav-enterprise-description": "Zastosowania biznesowe Ethereum", diff --git a/src/intl/pt-br/common.json b/src/intl/pt-br/common.json index 09d80ef87ff..ac5e901a555 100644 --- a/src/intl/pt-br/common.json +++ b/src/intl/pt-br/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Entenda todos os detalhes da pilha do Ethereum", "nav-docs-stack-label": "Pilha de Ethereum", "nav-eip-description": "Padrões que especificam novos recursos ou processos", - "nav-eip-label": "Propostas de melhorias do Ethereum (EIPs)", + "nav-eip-label": "EIPs - Propostas de melhorias do Ethereum", "nav-emerging-description": "Conheça outros casos de uso mais recentes do Ethereum", "nav-emerging-label": "Casos de uso emergentes", "nav-enterprise-description": "Aplicações de negócios para o Ethereum", diff --git a/src/intl/pt/common.json b/src/intl/pt/common.json index 5d9a9096b6e..57b6bcb6e36 100644 --- a/src/intl/pt/common.json +++ b/src/intl/pt/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "Compreenda todos os detalhes da pilha de Ethereum", "nav-docs-stack-label": "Pilha de Ethereum", "nav-eip-description": "Padrões que especificam novos recursos ou processos", - "nav-eip-label": "Propostas de Melhoramentos do Ethereum (EIPs)", + "nav-eip-label": "EIPs - Propostas de Melhoramentos do Ethereum", "nav-emerging-description": "Conheça outros casos de utilização mais recentes para o Ethereum", "nav-enterprise-description": "Aplicações comerciais para o Ethereum", "nav-ethereum-org-description": "Este website é orientado para a comunidade - junte-se a nós e contribua também", diff --git a/src/intl/ro/common.json b/src/intl/ro/common.json index 8b6846ce546..b8fe5a14951 100644 --- a/src/intl/ro/common.json +++ b/src/intl/ro/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "Aprofundează toate detaliile stivei Ethereum", "nav-docs-stack-label": "Stiva Ethereum", "nav-eip-description": "Standarde care specifică funcții și procese noi", - "nav-eip-label": "Propuneri de îmbunătățire pentru Ethereum (EIP-uri)", + "nav-eip-label": "EIP-uri - Propuneri de îmbunătățire pentru Ethereum", "nav-emerging-description": "Află cazuri de utilizare noi pentru Ethereum", "nav-enterprise-description": "Aplicații în afaceri pentru Ethereum", "nav-ethereum-org-description": "Acest site este creat și gestionat de comunitate. Vino alături de noi și contribuie și tu", diff --git a/src/intl/ru/common.json b/src/intl/ru/common.json index bce708f1c90..a2a008c7543 100644 --- a/src/intl/ru/common.json +++ b/src/intl/ru/common.json @@ -173,7 +173,7 @@ "nav-docs-stack-description": "Понимание всех особенностей стека Ethereum", "nav-docs-stack-label": "Стек Ethereum", "nav-eip-description": "Стандарты, определяющие новые функции или процессы", - "nav-eip-label": "Предложения по улучшению Ethereum (EIP)", + "nav-eip-label": "EIP - Предложения по улучшению Ethereum", "nav-emerging-description": "Узнавайте самые свежие примеры использования Ethereum", "nav-emerging-label": "Новые варианты использования", "nav-enterprise-description": "Бизнес-приложения для Ethereum", diff --git a/src/intl/se/common.json b/src/intl/se/common.json index 37ff2d70218..346fac1ab7f 100644 --- a/src/intl/se/common.json +++ b/src/intl/se/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "Förstå alla detaljerna i Ethereum-stacken", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Standarder som specificerar nya funktioner och processer", - "nav-eip-label": "Förbättringsförslag för Ethereum (EIP:er)", + "nav-eip-label": "EIP:er - Förbättringsförslag för Ethereum", "nav-emerging-description": "Få reda på andra nya användarfall för Ethereum", "nav-enterprise-description": "Företagsapplikationer för Ethereum", "nav-ethereum-org-description": "Den här webbplatsen drivs av communityn – delta och bidra själv", diff --git a/src/intl/sk/common.json b/src/intl/sk/common.json index 5206a601670..fdf669ccb48 100644 --- a/src/intl/sk/common.json +++ b/src/intl/sk/common.json @@ -169,7 +169,7 @@ "nav-docs-overview-description": "Vaša domovská stránka s dokumentmi pre vývojárov", "nav-docs-stack-description": "Pochopenie všetkých podrobností o Ethereum stack", "nav-eip-description": "Štandardy, ktoré špecifikujú nové funkcie alebo procesy", - "nav-eip-label": "Návrhy na zlepšenie Etherea (EIP)", + "nav-eip-label": "EIP - Návrhy na zlepšenie Etherea", "nav-emerging-description": "Spoznajte ďalšie novšie prípady použitia Etherea", "nav-enterprise-description": "Obchodné aplikácie pre Ethereum", "nav-ethereum-org-description": "Táto webová stránka je vytvorená komunitou — pridajte sa k nám a prispievajte aj vy", diff --git a/src/intl/sl/common.json b/src/intl/sl/common.json index 5fdd5d81061..5baad9fc2a8 100644 --- a/src/intl/sl/common.json +++ b/src/intl/sl/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Razumite vse podrobnosti Ethereumovega sklada", "nav-docs-stack-label": "Sklad Ethereum", "nav-eip-description": "Standardi za opredeljevanje novih funkcij ali procesov", - "nav-eip-label": "Predlogi za izboljšanje Ethereuma (EIP)", + "nav-eip-label": "EIP - Predlogi za izboljšanje Ethereuma", "nav-emerging-description": "Spoznajte druge novejše primere uporabe Ethereuma", "nav-enterprise-description": "Poslovne aplikacije za Ethereum", "nav-ethereum-org-description": "To spletno mesto napaja skupnost – pridružite se nam in prispevajte", diff --git a/src/intl/sr/common.json b/src/intl/sr/common.json index 9bdec43f6f0..13b4a5d6661 100644 --- a/src/intl/sr/common.json +++ b/src/intl/sr/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Shvatite sve detalje Ethereum steka", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Standardi koji određuju nove funkcije ili procese", - "nav-eip-label": "Predlozi za poboljšanje Ethereuma (EIP)", + "nav-eip-label": "EIP - Predlozi za poboljšanje Ethereuma", "nav-emerging-description": "Upoznajte druge novije slučajeve korišćenja za Ethereum", "nav-emerging-label": "Načini primene", "nav-enterprise-description": "Poslovne aplikacije za Ethereum", diff --git a/src/intl/sw/common.json b/src/intl/sw/common.json index 5f00e7e51a5..187a13206b2 100644 --- a/src/intl/sw/common.json +++ b/src/intl/sw/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "Nyumbani kwako kwa hati za wasanidi programu", "nav-docs-stack-description": "Elewa maelezo yote ya bloku ya Ethereum", "nav-eip-description": "Viwango vinavyobainisha vipengele au michakato mipya", - "nav-eip-label": "Mapendekezo ya uboreshaji wa Ethereum (EIP)", + "nav-eip-label": "EIP - Mapendekezo ya uboreshaji wa Ethereum", "nav-emerging-description": "Fahamu visa vingine vipya zaidi vya matumizi vya Ethereum", "nav-enterprise-description": "Programu za biashara za Ethereum", "nav-ethereum-org-description": "Tovuti hii inachochewa kijamii—jiunge nasi na uchangie pia", diff --git a/src/intl/ta/common.json b/src/intl/ta/common.json index 8d660be8a98..67a3482b6c9 100644 --- a/src/intl/ta/common.json +++ b/src/intl/ta/common.json @@ -168,7 +168,7 @@ "nav-docs-overview-description": "உருவாக்குநர்கள் (டெவலப்பர்கள்) ஆவணங்களுக்கான உங்கள் முகப்பு", "nav-docs-stack-description": "எத்தேரியம் ஸ்டாக்-இன் அனைத்து விவரங்களையும் புரிந்துகொள்ளுதல்", "nav-eip-description": "புதிய அம்சங்கள் அல்லது செயல்முறைகளைக் குறிப்பிடும் தரநிலைகள்", - "nav-eip-label": "எத்தேரியம் முன்னேற்ற முன்மொழிவுகள் (EIPக்கள்)", + "nav-eip-label": "EIPக்கள் - எத்தேரியம் முன்னேற்ற முன்மொழிவுகள்", "nav-emerging-description": "எத்தேரியம்-க்கான பிற புதிய பயன்பாட்டு நிலைகளைத் தெரிந்துகொள்ளுதல்", "nav-enterprise-description": "எத்தேரியம்-க்கான வணிக செயலிகள்", "nav-ethereum-org-description": "இந்த இணையதளம் சமூகத்தால் வழிநடத்தப்படுகிறது - எங்களுடன் சேர்ந்து பங்களித்திடுங்கள்", diff --git a/src/intl/th/common.json b/src/intl/th/common.json index 16948294a44..02921370935 100644 --- a/src/intl/th/common.json +++ b/src/intl/th/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "ทำความเข้าใจรายละเอียดทั้งหมดของสแต็กของอีเธอเรียม", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "มาตรฐานที่ระบุคุณสมบัติหรือกระบวนการใหม่", - "nav-eip-label": "ข้อเสนอการปรับปรุงอีเธอเรียม (EIP)", + "nav-eip-label": "EIP - ข้อเสนอการปรับปรุงอีเธอเรียม", "nav-emerging-description": "ทำความรู้จักกรณีการใช้งานใหม่อื่นๆ สำหรับอีเธอเรียม", "nav-enterprise-description": "แอปพลิเคชันธุรกิจสำหรับอีเธอเรียม", "nav-ethereum-org-description": "เว็บไซต์นี้ขับเคลื่อนโดยชุมชน—เข้าร่วมกับเราและมีส่วนร่วมกัน", diff --git a/src/intl/tk/common.json b/src/intl/tk/common.json index 26e0ac4fd69..7c1a7bd5c9c 100644 --- a/src/intl/tk/common.json +++ b/src/intl/tk/common.json @@ -161,7 +161,7 @@ "nav-docs-overview-description": "Işläp taýýarlaýjy resminamalary üçin öýüňiz", "nav-docs-stack-description": "Ethereum steginiň ähli jikme-jikliklerine düşüniň", "nav-eip-description": "Täze aýratynlyklary ýa-da prosesleri kesgitleýän standartlar", - "nav-eip-label": "Ethereum-y gowulandyrmak barada teklipler (EGBT)", + "nav-eip-label": "EGBT - Ethereum-y gowulandyrmak barada teklipler", "nav-emerging-description": "Ethereum-a degişli has täze ulanylyş ýagdaýlary barada öwreniň", "nav-enterprise-description": "Ethereum üçin işewürlik programmalary", "nav-ethereum-org-description": "Bu web sahypasy jemgyýet tarapyndan dolandyrylýar - siz hem bize goşulyň we goşant goşuň", diff --git a/src/intl/tr/common.json b/src/intl/tr/common.json index 5c5251d4e78..2f16785dc51 100644 --- a/src/intl/tr/common.json +++ b/src/intl/tr/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Ethereum yığınının tüm ayrıntılarını anlamak", "nav-docs-stack-label": "Ethereum yığını", "nav-eip-description": "Yeni özellikleri veya süreçleri belirleyen standartlar", - "nav-eip-label": "Ethereum iyileştirme önerileri (EIP'ler)", + "nav-eip-label": "EIP'ler - Ethereum iyileştirme önerileri", "nav-emerging-description": "Ethereum'un diğer yeni kullanım örnekleri hakkında bilgi edinin", "nav-emerging-label": "Yeni ortaya çıkan kullanım alanları", "nav-enterprise-description": "Ethereum için iş uygulamaları", diff --git a/src/intl/uk/common.json b/src/intl/uk/common.json index d02280b5942..d1436e5d865 100644 --- a/src/intl/uk/common.json +++ b/src/intl/uk/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "Про всі деталі стека Ethereum", "nav-docs-stack-label": "Стековий список Ethereum", "nav-eip-description": "Стандарти, які визначають нові функції або процеси", - "nav-eip-label": "Пропозиції покращення Ethereum (EIP)", + "nav-eip-label": "EIP - Пропозиції покращення Ethereum", "nav-emerging-description": "Ознайомтеся з іншими новими варіантами використання Ethereum", "nav-emerging-label": "Нові варіанти використання", "nav-enterprise-description": "Бізнес-програми для Ethereum", diff --git a/src/intl/ur/common.json b/src/intl/ur/common.json index 1535bda07ef..9a333c3dfe9 100644 --- a/src/intl/ur/common.json +++ b/src/intl/ur/common.json @@ -167,7 +167,7 @@ "nav-docs-overview-description": "ڈویلپر کی دستاویزات کے لیے آپ کا ہوم", "nav-docs-stack-description": "ایتھریئم اسٹیک کی تمام تفصیلات کو سمجھیں", "nav-eip-description": "وہ معیارات جو نئی خصوصیات یا عوامل کی وضاحت کرتے ہیں", - "nav-eip-label": "ایتھریئم کی بہتری کی تجاویز (EIPs)", + "nav-eip-label": "EIPs - ایتھریئم کی بہتری کی تجاویز", "nav-emerging-description": "ایتھریئم کے لیے دیگر نئی استعمال کی صورتوں کی معلومات حاصل کریں", "nav-enterprise-description": "ایتھریئم کے لیے کاروباری ایپلی کیشنز", "nav-ethereum-org-description": "یہ ویب سائٹ کمیونٹی کے زیر انتظام ہے—ہمارے ساتھ شامل ہوں اور اپنا حصہ بھی ڈالیں", diff --git a/src/intl/uz/common.json b/src/intl/uz/common.json index 941519ed4f6..5744bf2d01b 100644 --- a/src/intl/uz/common.json +++ b/src/intl/uz/common.json @@ -172,7 +172,7 @@ "nav-docs-stack-description": "Ethereum stekining barcha tafsilotlarini tushuning", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Yangi xususiyatlar yoki jarayonlarni belgilaydigan standartlar", - "nav-eip-label": "Ethereumni yaxshilash takliflari (EIP)", + "nav-eip-label": "EIP - Ethereumni yaxshilash takliflari", "nav-emerging-description": "Ethereumdan boshqa sohalarda foydalanishni bilib oling", "nav-enterprise-description": "Ethereum uchun biznes ilovalar", "nav-ethereum-org-description": "Bu veb-sayt hamjamiyat tomonidan yaratilgan – bizga qoʻshiling va hissa qoʻshing", diff --git a/src/intl/vi/common.json b/src/intl/vi/common.json index 22dc7af41ca..17f50efa5e3 100644 --- a/src/intl/vi/common.json +++ b/src/intl/vi/common.json @@ -171,7 +171,7 @@ "nav-docs-stack-description": "Tìm hiểu tất cả chi tiết của hệ thống Ethereum", "nav-docs-stack-label": "Ethereum stack", "nav-eip-description": "Các tiêu chuẩn xác định các tính năng hoặc quy trình mới", - "nav-eip-label": "Đề xuất cải tiến Ethereum (EIP)", + "nav-eip-label": "EIP - Đề xuất cải tiến Ethereum", "nav-emerging-description": "Tìm hiểu các trường hợp sử dụng Ethereum khác mới hơn", "nav-enterprise-description": "Các ứng dụng kinh doanh cho Ethereum", "nav-ethereum-org-description": "Trang web này hướng tới cộng đồng—hãy tham gia và đóng góp cùng chúng tôi", diff --git a/src/intl/zh-tw/common.json b/src/intl/zh-tw/common.json index 14c2016ca96..9a675fbb6eb 100644 --- a/src/intl/zh-tw/common.json +++ b/src/intl/zh-tw/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "瞭解所有關於以太坊技術堆棧的細節", "nav-docs-stack-label": "以太坊技術堆棧", "nav-eip-description": "規範新功能或流程的標準", - "nav-eip-label": "以太坊改進提案 (EIP)", + "nav-eip-label": "EIP - 以太坊改進提案", "nav-emerging-description": "瞭解其他比較新的以太坊使用案例", "nav-emerging-label": "新興使用案例", "nav-enterprise-description": "以太坊的商業應用程式", diff --git a/src/intl/zh/common.json b/src/intl/zh/common.json index 933a8a8c9de..589a6f67750 100644 --- a/src/intl/zh/common.json +++ b/src/intl/zh/common.json @@ -174,7 +174,7 @@ "nav-docs-stack-description": "了解以太坊堆栈全部细节", "nav-docs-stack-label": "以太坊堆栈", "nav-eip-description": "详细规定新功能或新流程的标准", - "nav-eip-label": "以太坊改进提案 (EIP)", + "nav-eip-label": "EIP - 以太坊改进提案", "nav-emerging-description": "学习其他以太坊新用例", "nav-emerging-label": "新出现的用例", "nav-enterprise-description": "以太坊的商业应用程序", From d77b3a2321346dd003274ea5c741e6299d60a77d Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 15:36:24 -0800 Subject: [PATCH 425/478] feat: add matomo event to lang picker input --- src/components/LanguagePicker/index.tsx | 12 ++++++++-- .../LanguagePicker/useLanguagePicker.tsx | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/components/LanguagePicker/index.tsx b/src/components/LanguagePicker/index.tsx index 367d9a488be..df7a593abb0 100644 --- a/src/components/LanguagePicker/index.tsx +++ b/src/components/LanguagePicker/index.tsx @@ -37,8 +37,15 @@ const LanguagePicker = ({ menuState, ...props }: LanguagePickerProps) => { - const { t, refs, disclosure, filterValue, setFilterValue, filteredNames } = - useLanguagePicker(handleClose, menuState) + const { + t, + refs, + disclosure, + filterValue, + setFilterValue, + filteredNames, + handleInputFocus, + } = useLanguagePicker(handleClose, menuState) const { inputRef, firstItemRef, noResultsRef, footerRef } = refs const { onClose } = disclosure @@ -137,6 +144,7 @@ const LanguagePicker = ({ e.stopPropagation() } }} + onFocus={handleInputFocus} /> ([]) + // Used to only send one matomo event for users who focus the filter input + const [hasFocusedInput, setHasFocusedInput] = useState(false) + + // Reset if user switches languages + useEffect(() => { + setHasFocusedInput(false) + }, [locale]) + // perform all the filtering and mapping when the filter value change useEffect(() => { const locales = filterRealLocales(rawLocales) @@ -188,6 +196,21 @@ export const useLanguagePicker = ( ) } + /** + * Send Matomo event when user focuses in the filter input. + * Only send once per user per session per language + * @returns void + */ + const handleInputFocus = (): void => { + if (hasFocusedInput) return + trackCustomEvent({ + ...eventBase, + eventAction: "Filter input", + eventName: "Focused inside filter input", + }) + setHasFocusedInput(true) + } + return { t, refs, @@ -195,5 +218,6 @@ export const useLanguagePicker = ( filterValue, setFilterValue, filteredNames, + handleInputFocus, } } From 566774cd9c4687362dac6673e2118bda36d26215 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 16:02:32 -0800 Subject: [PATCH 426/478] chore: run autofix to sort imports --- src/components/PageMetadata.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/PageMetadata.tsx b/src/components/PageMetadata.tsx index 8d9be28fdae..0012059c0c5 100644 --- a/src/components/PageMetadata.tsx +++ b/src/components/PageMetadata.tsx @@ -2,9 +2,10 @@ import Head from "next/head" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" +import { getOgImage } from "@/lib/utils/metadata" import { filterRealLocales } from "@/lib/utils/translations" import { getFullUrl } from "@/lib/utils/url" -import { getOgImage } from "@/lib/utils/metadata" + import { SITE_URL } from "@/lib/constants" type NameMeta = { From ca4f2bd35c35db7f1d7a79a8ede1332edb42b054 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 16:02:32 -0800 Subject: [PATCH 427/478] chore: run autofix to sort imports --- src/components/PageMetadata.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/PageMetadata.tsx b/src/components/PageMetadata.tsx index 8d9be28fdae..0012059c0c5 100644 --- a/src/components/PageMetadata.tsx +++ b/src/components/PageMetadata.tsx @@ -2,9 +2,10 @@ import Head from "next/head" import { useRouter } from "next/router" import { useTranslation } from "next-i18next" +import { getOgImage } from "@/lib/utils/metadata" import { filterRealLocales } from "@/lib/utils/translations" import { getFullUrl } from "@/lib/utils/url" -import { getOgImage } from "@/lib/utils/metadata" + import { SITE_URL } from "@/lib/constants" type NameMeta = { From 906078d1e1a088c7adb03e99aa62c530a54fe546 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 22 Feb 2024 21:06:52 -0800 Subject: [PATCH 428/478] fix: typos Co-authored-by: Corwin Smith --- src/intl/en/common.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/intl/en/common.json b/src/intl/en/common.json index 5c3195c5482..a1669ab757e 100644 --- a/src/intl/en/common.json +++ b/src/intl/en/common.json @@ -161,7 +161,7 @@ "nav-dao-description": "Member-owned communities without centralized authority", "nav-dapps-description": "Explore a rich ecosystem of apps using Ethereum", "nav-defi-description": "A global, open alternative to the traditional financial market", - "nav-desci-description": "A global, open alternative to th current scientific system", + "nav-desci-description": "A global, open alternative to the current scientific system", "nav-desoc-description": "Blockchain-based platforms for social interaction and content creation", "nav-developers-docs": "Developers docs", "nav-developers": "Developers", @@ -219,7 +219,7 @@ "nav-private-description": "Developer resources for private enterprise Ethereum", "nav-quizzes-description": "Find out how well you understand Ethereum and cryptocurrencies", "nav-quizzes-label": "Test your knowledge", - "nav-refi-description": "An alternative economic system build on regenerative principles", + "nav-refi-description": "An alternative economic system built on regenerative principles", "nav-research-description": "Processes used to improve Ethereum", "nav-research-label": "Research and development", "nav-roadmap-overview-description": "The future of Ethereum", From 61e0f95999e3be98b4ccb81057b726b4c72814bb Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 11:46:38 +0000 Subject: [PATCH 429/478] Update Sassal link --- .all-contributorsrc | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a814fde63a2..aaa03c9a751 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -1521,7 +1521,7 @@ "login": "sassal", "name": "sassal", "avatar_url": "https://avatars0.githubusercontent.com/u/9276959?v=4", - "profile": "https//twitter.com/sassal0x", + "profile": "https://twitter.com/sassal0x", "contributions": [ "content" ] diff --git a/README.md b/README.md index ec9ab0f4158..99d0eb883fb 100644 --- a/README.md +++ b/README.md @@ -402,7 +402,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Pooja Ranjan
      Pooja Ranjan

      🖋 - sassal
      sassal

      🖋 + sassal
      sassal

      🖋 Robert Zaremba
      Robert Zaremba

      🖋 Tas
      Tas

      🤔 🖋 Sylvain Pace
      Sylvain Pace

      💻 From da01fa920a3f4d6ef637d65caa16a0f4e6d49270 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 11:49:12 +0000 Subject: [PATCH 430/478] Fix vyper discord link --- .../developers/docs/programming-languages/python/index.md | 2 +- .../de/developers/docs/programming-languages/python/index.md | 2 +- .../pt-br/developers/docs/programming-languages/python/index.md | 2 +- .../tr/developers/docs/programming-languages/python/index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/developers/docs/programming-languages/python/index.md b/public/content/developers/docs/programming-languages/python/index.md index 4b33cd1f63f..dc1ef837a6c 100644 --- a/public/content/developers/docs/programming-languages/python/index.md +++ b/public/content/developers/docs/programming-languages/python/index.md @@ -82,7 +82,7 @@ The following Ethereum-based projects use tools mentioned on this page. The rela ## Python Community discussion {#python-community-contributors} - [Ethereum Python Community Discord](https://discord.gg/9zk7snTfWe) for Web3.py and other Python framework discussion -- [Vyper Discord](<[https://discord.gg/9zk7snTfWe](https://discord.gg/SdvKC79cJk)>) for Vyper smart contract programming discussion +- [Vyper Discord](https://discord.gg/SdvKC79cJk) for Vyper smart contract programming discussion ## Other aggregated lists {#other-aggregated-lists} 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 9eba7a28b36..2014cfad11b 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 @@ -82,7 +82,7 @@ Die folgenden Ethereum-basierten Projekte verwenden die auf dieser Seite erwähn ## Python Community-Diskussionen {#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/9zk7snTfWe](https://discord.gg/SdvKC79cJk)>) für Diskussionen zu Vyper Smart Contract-Programmierung +- [Vyper Discord](https://discord.gg/SdvKC79cJk) für Diskussionen zu Vyper Smart Contract-Programmierung ## Andere aggregierte Listen {#other-aggregated-lists} diff --git a/public/content/translations/pt-br/developers/docs/programming-languages/python/index.md b/public/content/translations/pt-br/developers/docs/programming-languages/python/index.md index 100eaca3bc6..1cf6176d26b 100644 --- a/public/content/translations/pt-br/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/pt-br/developers/docs/programming-languages/python/index.md @@ -82,7 +82,7 @@ Os seguintes projetos baseados na Ethereum usam ferramentas mencionadas nesta p ## Comunidade de discussão Python {#python-community-contributors} - [Comunidade Discord Python Ethereum](https://discord.gg/9zk7snTfWe) Para discussões sobre Web3.py e outros frameworks Python -- [Vyper Discord](<[https://discord.gg/9zk7snTfWe](https://discord.gg/SdvKC79cJk)>) Para discussão sobre programação de contrato inteligente com Vyper +- [Vyper Discord](https://discord.gg/SdvKC79cJk) Para discussão sobre programação de contrato inteligente com Vyper ## Demais listas agregadas {#other-aggregated-lists} diff --git a/public/content/translations/tr/developers/docs/programming-languages/python/index.md b/public/content/translations/tr/developers/docs/programming-languages/python/index.md index 503a9582fa9..dd75e253214 100644 --- a/public/content/translations/tr/developers/docs/programming-languages/python/index.md +++ b/public/content/translations/tr/developers/docs/programming-languages/python/index.md @@ -82,7 +82,7 @@ Aşağıdaki Ethereum tabanlı projeler bu sayfada bahsedilen araçları kullan ## Python Topluluk tartışması {#python-community-contributors} - Web3.py ve diğer Python çerçeve tartışmaları için [Ethereum Python Topluluk Discord'u](https://discord.gg/9zk7snTfWe) -- Vyper akıllı sözleşme programlama ile ilgili tartışmalar için [Vyper Discord'u](<[https://discord.gg/9zk7snTfWe](https://discord.gg/SdvKC79cJk)>) +- Vyper akıllı sözleşme programlama ile ilgili tartışmalar için [Vyper Discord'u](https://discord.gg/SdvKC79cJk) ## Diğer Toplu Listeler {#other-aggregated-lists} From 54a370d26c36bff1ed4be324e5c3d0c981e2ef9f Mon Sep 17 00:00:00 2001 From: bholuhacks Date: Fri, 23 Feb 2024 06:51:05 -0500 Subject: [PATCH 431/478] fix: cleanup dead link --- .../es/developers/tutorials/erc20-with-safety-rails/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md index 909cf1672da..07511ef0c15 100644 --- a/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md +++ b/public/content/translations/es/developers/tutorials/erc20-with-safety-rails/index.md @@ -24,7 +24,7 @@ Si quieres ver el código fuente completo: ## Creando un contrato ERC-20 {#creating-an-erc-20-contract} -Antes de agregar la funcionalidad del riel de seguridad, necesitamos un contrato ERC-20. En este artículo usaremos [el Asistente de Contratos de OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/wizard). Ábrelo en otra ventana del navegador y sigue estas instrucciones: +Antes de agregar la funcionalidad del riel de seguridad, necesitamos un contrato ERC-20. En este artículo usaremos [el Asistente de Contratos de OpenZeppelin](https://docs.openzeppelin.com/contracts/5.x/wizard). Ábrelo en otra ventana del navegador y sigue estas instrucciones: 1. Selecciona **ERC-20**. 2. Ingresa estos ajustes: From 10902cc403a9fc17db20eac57beb1ca9a8a53c7b Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 12:04:53 +0000 Subject: [PATCH 432/478] Fix broken eip 1803 link --- .../pow/mining/mining-algorithms/ethash/index.md | 2 +- .../pow/mining/mining-algorithms/ethash/index.md | 2 +- .../consensus-mechanisms/pow/mining-algorithms/ethash/index.md | 2 +- .../pow/mining/mining-algorithms/ethash/index.md | 2 +- .../consensus-mechanisms/pow/mining-algorithms/ethash/index.md | 2 +- .../pow/mining/mining-algorithms/ethash/index.md | 2 +- .../pow/mining/mining-algorithms/ethash/index.md | 2 +- .../consensus-mechanisms/pow/mining-algorithms/ethash/index.md | 2 +- .../pow/mining/mining-algorithms/ethash/index.md | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index b98edc2b18e..5072ec70c34 100644 --- a/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### El uso de SHA3 {#sha3} -El desarrollo de Ethereum coincidió con el desarrollo del estándar SHA3, y el proceso de estándares hizo un cambio tardío en el relleno del algoritmo hash finalizado, de modo que los hashes de Ethereum sha3_256 y sha3_512 no son hashes SHA3 estándar, sino una variante a la que se hace referencia a menudo referida a menudo como Keccak-256 y Keccak-512 en otros contextos. Vea el conversación [aquí](https://eips.ethereum.org/EIPS-1803), [aquí](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use), o [aquí](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +El desarrollo de Ethereum coincidió con el desarrollo del estándar SHA3, y el proceso de estándares hizo un cambio tardío en el relleno del algoritmo hash finalizado, de modo que los hashes de Ethereum sha3_256 y sha3_512 no son hashes SHA3 estándar, sino una variante a la que se hace referencia a menudo referida a menudo como Keccak-256 y Keccak-512 en otros contextos. Vea el conversación [aquí](https://eips.ethereum.org/EIPS/eip-1803), [aquí](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use), o [aquí](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Por favor, tenga esto en cuenta, ya que los hashes SHA3 se mencionan en la descripción del algoritmo a continuación. diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index c49aa95c4a7..f10aea0f6d5 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### L'uso di "SHA3" {#sha3} -Lo sviluppo di Ethereum è coinciso con lo sviluppo dello standard SHA3 e il processo standard ha effettuato una modifica tardiva al padding dell'algoritmo di hash finalizzato, quindi, gli hash "sha3_256" e "sha3_512" di Ethereum non sono hash dello standard sha3, ma una variante, spesso definita "Keccak-256" e "Keccak-512" in altri contesti. Vedi la discussione, es. [qui](https://eips.ethereum.org/EIPS-1803), [qui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) o [qui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +Lo sviluppo di Ethereum è coinciso con lo sviluppo dello standard SHA3 e il processo standard ha effettuato una modifica tardiva al padding dell'algoritmo di hash finalizzato, quindi, gli hash "sha3_256" e "sha3_512" di Ethereum non sono hash dello standard sha3, ma una variante, spesso definita "Keccak-256" e "Keccak-512" in altri contesti. Vedi la discussione, es. [qui](https://eips.ethereum.org/EIPS/eip-1803), [qui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) o [qui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Si ricorda che gli hash "sha3" siano presentati nella descrizione dell'algoritmo più avanti. diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index 6ce129cda25..8dd5f30c576 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### 「SHA3」の使用 {#sha3} -イーサリアムの開発は、SHA3 標準の開発と同時期に起こりました。標準プロセスは、最終決定したハッシュアルゴリズムのパディングが遅れて変更されたため、イーサリアムの「sha3_256」および「sha3_512」ハッシュは、標準の sha3 ハッシュではありません。他の文脈の多くでは、変異型として「Keccak-256」および「Keccak-512」と呼ばれています。 この考察については、 [こちら](https://eips.ethereum.org/EIPS-1803)、[こちら](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)、または[こちら](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)を参照してください。 +イーサリアムの開発は、SHA3 標準の開発と同時期に起こりました。標準プロセスは、最終決定したハッシュアルゴリズムのパディングが遅れて変更されたため、イーサリアムの「sha3_256」および「sha3_512」ハッシュは、標準の sha3 ハッシュではありません。他の文脈の多くでは、変異型として「Keccak-256」および「Keccak-512」と呼ばれています。 この考察については、 [こちら](https://eips.ethereum.org/EIPS/eip-1803)、[こちら](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)、または[こちら](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)を参照してください。 以下のアルゴリズムの説明では、「sha3」ハッシュが参照されることを覚えておいてください。 diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index 6ce129cda25..8dd5f30c576 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### 「SHA3」の使用 {#sha3} -イーサリアムの開発は、SHA3 標準の開発と同時期に起こりました。標準プロセスは、最終決定したハッシュアルゴリズムのパディングが遅れて変更されたため、イーサリアムの「sha3_256」および「sha3_512」ハッシュは、標準の sha3 ハッシュではありません。他の文脈の多くでは、変異型として「Keccak-256」および「Keccak-512」と呼ばれています。 この考察については、 [こちら](https://eips.ethereum.org/EIPS-1803)、[こちら](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)、または[こちら](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)を参照してください。 +イーサリアムの開発は、SHA3 標準の開発と同時期に起こりました。標準プロセスは、最終決定したハッシュアルゴリズムのパディングが遅れて変更されたため、イーサリアムの「sha3_256」および「sha3_512」ハッシュは、標準の sha3 ハッシュではありません。他の文脈の多くでは、変異型として「Keccak-256」および「Keccak-512」と呼ばれています。 この考察については、 [こちら](https://eips.ethereum.org/EIPS/eip-1803)、[こちら](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)、または[こちら](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)を参照してください。 以下のアルゴリズムの説明では、「sha3」ハッシュが参照されることを覚えておいてください。 diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index eab3c19bca5..d8d8d424df6 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### O uso de 'SHA3' {#sha3} -O desenvolvimento do Ethereum coincidiu com o desenvolvimento do padrão SHA3, e o processo de padrões fez uma alteração tardia no preenchimento do algoritmo de hash finalizado, para que os hashes "sha3_256" e "sha3_512" do Ethereum não sejam hashes sha3 padrão, mas uma variante muitas vezes referida como "Keccak-256" e "Keccak-512" em outros contextos. Veja a discussão, por exemplo, [aqui](https://eips.ethereum.org/EIPS-1803), [aqui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ou [aqui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +O desenvolvimento do Ethereum coincidiu com o desenvolvimento do padrão SHA3, e o processo de padrões fez uma alteração tardia no preenchimento do algoritmo de hash finalizado, para que os hashes "sha3_256" e "sha3_512" do Ethereum não sejam hashes sha3 padrão, mas uma variante muitas vezes referida como "Keccak-256" e "Keccak-512" em outros contextos. Veja a discussão, por exemplo, [aqui](https://eips.ethereum.org/EIPS/eip-1803), [aqui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ou [aqui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Tenha isso em mente, já que hashes "sha3" são referidos na descrição do algoritmo abaixo. diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index 547b3e3c738..94f1d9d0aa2 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### O uso de 'SHA3' {#sha3} -O desenvolvimento do Ethereum coincidiu com o desenvolvimento do padrão SHA3, e o processo de padrões fez uma alteração tardia no preenchimento do algoritmo de hash finalizado, para que os hashes "sha3_256" e "sha3_512" do Ethereum não sejam hashes sha3 padrão, mas uma variante muitas vezes referida como "Keccak-256" e "Keccak-512" em outros contextos. Veja a discussão, por exemplo, [aqui](https://eips.ethereum.org/EIPS-1803), [aqui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ou [aqui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +O desenvolvimento do Ethereum coincidiu com o desenvolvimento do padrão SHA3, e o processo de padrões fez uma alteração tardia no preenchimento do algoritmo de hash finalizado, para que os hashes "sha3_256" e "sha3_512" do Ethereum não sejam hashes sha3 padrão, mas uma variante muitas vezes referida como "Keccak-256" e "Keccak-512" em outros contextos. Veja a discussão, por exemplo, [aqui](https://eips.ethereum.org/EIPS/eip-1803), [aqui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ou [aqui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Tenha isso em mente, já que hashes "sha3" são referidos na descrição do algoritmo abaixo. diff --git a/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index baaf4e7dade..c5c1bb72e3f 100644 --- a/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### 'SHA3' kullanımı {#sha3} -Ethereum'un gelişimi, SHA3 standardının geliştirilmesiyle çakıştı ve standartlar süreci, sonlandırılmış karma algoritmanın dolgusunda geç bir değişiklik yaptı, böylece Ethereum'un "sha3_256" ve "sha3_512" karmaları standart sha3 karmaları değil, diğer bağlamlarda "Keccak-256" ve "Keccak-512" olarak genellikle atıfta bulunulan bir değişkendir. Tartışmaya ör. [buradan](https://eips.ethereum.org/EIPS-1803), [buradan](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ve [buradan bakabilirsiniz](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). +Ethereum'un gelişimi, SHA3 standardının geliştirilmesiyle çakıştı ve standartlar süreci, sonlandırılmış karma algoritmanın dolgusunda geç bir değişiklik yaptı, böylece Ethereum'un "sha3_256" ve "sha3_512" karmaları standart sha3 karmaları değil, diğer bağlamlarda "Keccak-256" ve "Keccak-512" olarak genellikle atıfta bulunulan bir değişkendir. Tartışmaya ör. [buradan](https://eips.ethereum.org/EIPS/eip-1803), [buradan](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ve [buradan bakabilirsiniz](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). Lütfen aşağıdaki algoritmanın açıklamasında "sha3" karmalarına atıfta bulunulduğunu unutmayın. diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md index 122299948ce..064da732d50 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### 使用“SHA3” {#sha3} -以太坊的开发恰逢 SHA3 标准的制定, 标准进程对最终确定的哈希算法的填充做了后期改动,使得以太坊的 “sha3_256”和“sha3_512”哈希值不是标准的 sha3 哈希值,而是在其他情况下 常被称为“Keccak-256”和“Keccak-512”的变量。 讨论请见[此处](https://eips.ethereum.org/EIPS-1803)、[此处](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)或[此处](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)。 +以太坊的开发恰逢 SHA3 标准的制定, 标准进程对最终确定的哈希算法的填充做了后期改动,使得以太坊的 “sha3_256”和“sha3_512”哈希值不是标准的 sha3 哈希值,而是在其他情况下 常被称为“Keccak-256”和“Keccak-512”的变量。 讨论请见[此处](https://eips.ethereum.org/EIPS/eip-1803)、[此处](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)或[此处](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)。 请记住这一点,因为下面的算法描述中提到了“sha3”哈希值。 diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md index 5e672a7807b..0b1fb4db55a 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -44,7 +44,7 @@ ACCESSES = 64 # number of accesses in hashimoto loop ### 使用“SHA3” {#sha3} -以太坊的开发恰逢 SHA3 标准的制定, 标准进程对最终确定的哈希算法的填充做了后期改动,使得以太坊的 “sha3_256”和“sha3_512”哈希值不是标准的 sha3 哈希值,而是在其他情况下 常被称为“Keccak-256”和“Keccak-512”的变量。 讨论请见[此处](https://eips.ethereum.org/EIPS-1803)、[此处](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)或[此处](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)。 +以太坊的开发恰逢 SHA3 标准的制定, 标准进程对最终确定的哈希算法的填充做了后期改动,使得以太坊的 “sha3_256”和“sha3_512”哈希值不是标准的 sha3 哈希值,而是在其他情况下 常被称为“Keccak-256”和“Keccak-512”的变量。 讨论请见[此处](https://eips.ethereum.org/EIPS/eip-1803)、[此处](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)或[此处](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)。 请记住这一点,因为下面的算法描述中提到了“sha3”哈希值。 From 9574c63b72bfe7e6bdef0e8c870137e3eeb93763 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 12:09:11 +0000 Subject: [PATCH 433/478] Fix broken contributor link --- .all-contributorsrc | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a814fde63a2..630958bd14d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -8839,7 +8839,7 @@ "login": "slf188", "name": "菲利", "avatar_url": "https://avatars.githubusercontent.com/u/49417481?v=4", - "profile": "huggingface.co/slf188", + "profile": "https://huggingface.co/slf188", "contributions": [ "doc" ] diff --git a/README.md b/README.md index ec9ab0f4158..afb6a0ce18a 100644 --- a/README.md +++ b/README.md @@ -1410,7 +1410,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d June Clarke
      June Clarke

      📖 - 菲利
      菲利

      📖 + 菲利
      菲利

      📖 DamitusThyYeetus123
      DamitusThyYeetus123

      📖 matusame
      matusame

      🌍 Lohan
      Lohan

      💻 From de4f015edeb6a65bc1585d30f07c378e5fe3b754 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 12:14:42 +0000 Subject: [PATCH 434/478] Update 404 mining link --- public/_redirects | 4 ++-- public/content/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ar/roadmap/beacon-chain/index.md | 2 +- public/content/translations/bg/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ca/roadmap/beacon-chain/index.md | 2 +- public/content/translations/de/roadmap/beacon-chain/index.md | 2 +- public/content/translations/el/roadmap/beacon-chain/index.md | 2 +- public/content/translations/es/roadmap/beacon-chain/index.md | 2 +- public/content/translations/fa/roadmap/beacon-chain/index.md | 2 +- public/content/translations/fr/roadmap/beacon-chain/index.md | 2 +- public/content/translations/hi/roadmap/beacon-chain/index.md | 2 +- public/content/translations/hr/roadmap/beacon-chain/index.md | 2 +- public/content/translations/hu/roadmap/beacon-chain/index.md | 2 +- public/content/translations/id/roadmap/beacon-chain/index.md | 2 +- public/content/translations/it/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ja/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ml/roadmap/beacon-chain/index.md | 2 +- public/content/translations/nl/roadmap/beacon-chain/index.md | 2 +- public/content/translations/pl/roadmap/beacon-chain/index.md | 2 +- .../content/translations/pt-br/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ro/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ru/roadmap/beacon-chain/index.md | 2 +- public/content/translations/sl/roadmap/beacon-chain/index.md | 2 +- public/content/translations/sw/roadmap/beacon-chain/index.md | 2 +- public/content/translations/tr/roadmap/beacon-chain/index.md | 2 +- public/content/translations/uk/roadmap/beacon-chain/index.md | 2 +- .../content/translations/zh-tw/roadmap/beacon-chain/index.md | 2 +- public/content/translations/zh/roadmap/beacon-chain/index.md | 2 +- 28 files changed, 29 insertions(+), 29 deletions(-) diff --git a/public/_redirects b/public/_redirects index 14133acc971..9231fdf048c 100644 --- a/public/_redirects +++ b/public/_redirects @@ -72,9 +72,9 @@ /en/dart/ /en/developers/docs/programming-languages/dart/ 301! -/developers/docs/mining/ /en/developers/docs/consensus-mechanisms/pow/mining/ 301! +/developers/docs/consensus-mechanisms/pow/mining/ /en/developers/docs/consensus-mechanisms/pow/mining/ 301! -/en/developers/docs/mining/ /en/developers/docs/consensus-mechanisms/pow/mining/ 301! +/en/developers/docs/consensus-mechanisms/pow/mining/ /en/developers/docs/consensus-mechanisms/pow/mining/ 301! /*/beginners /:splat/what-is-ethereum/ 301! diff --git a/public/content/roadmap/beacon-chain/index.md b/public/content/roadmap/beacon-chain/index.md index 6504254154a..74ba5d74678 100644 --- a/public/content/roadmap/beacon-chain/index.md +++ b/public/content/roadmap/beacon-chain/index.md @@ -30,7 +30,7 @@ Read more on our [node architecture page](/developers/docs/nodes-and-clients/nod The Beacon Chain introduced [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) to Ethereum. This keeps Ethereum secure and earns validators more ETH in the process. In practice, staking involves staking ETH in order to activate validator software. As a staker, you run the software that creates and validates new blocks in the chain. -Staking serves a similar purpose that [mining](/developers/docs/mining/) used to, but is different in many ways. Mining required large up-front expenditures in the form of powerful hardware and energy consumption, resulting in economies of scale, and promoting centralization. Mining also did not come with any requirement to lock up assets as collateral, limiting the protocol's ability to punish bad actors after an attack. +Staking serves a similar purpose that [mining](/developers/docs/consensus-mechanisms/pow/mining/) used to, but is different in many ways. Mining required large up-front expenditures in the form of powerful hardware and energy consumption, resulting in economies of scale, and promoting centralization. Mining also did not come with any requirement to lock up assets as collateral, limiting the protocol's ability to punish bad actors after an attack. The transition to proof-of-stake made Ethereum significantly more secure and decentralized by comparison to proof-of-work. The more people that participate in the network, the more decentralized and safe from attacks it becomes. diff --git a/public/content/translations/ar/roadmap/beacon-chain/index.md b/public/content/translations/ar/roadmap/beacon-chain/index.md index dd2f4105f05..3e2217db13e 100644 --- a/public/content/translations/ar/roadmap/beacon-chain/index.md +++ b/public/content/translations/ar/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ summaryPoint3: قدمت سلسلة المنارة منطق إجماع الآرا قدمت سلسلة المنارة [إثبات الحصة](/developers/docs/consensus-mechanisms/pos/) إلى إثيريوم. وهذا يحافظ على أمان إثيريوم ويُكسب برامج المدققين المزيد من ETH في هذه العملية. وعمليًا، سيشتمل تجميد العملات على تجميد ETH من أجل تنشيط برنامج المدقق. وكأحد المراهنين، فإنك تشغل البرنامج الذي ينشئ ويصادق على كتل جديدة في السلسلة. -إن تجميد العملات يقدم غرضًا مشابهًا لما يستخدمه [التنقيب](/developers/docs/mining/)، لكنه مختلف من عدة جوانب. ويتطلب التنقيب نفقات أولية طائلة في شكل أجهزة قوية واستهلاك كبير للطاقة، ما يؤدي إلى تحقيق وفورات للتوسع وتعزيز المركزية. ولا يفرض التنقيب أيضًا أي شروط لحجز الأصول كضمان إضافي، ما يحد من قدرة البروتوكول على معاقبة الأطراف المسيئة بعد الهجوم. +إن تجميد العملات يقدم غرضًا مشابهًا لما يستخدمه [التنقيب](/developers/docs/consensus-mechanisms/pow/mining/)، لكنه مختلف من عدة جوانب. ويتطلب التنقيب نفقات أولية طائلة في شكل أجهزة قوية واستهلاك كبير للطاقة، ما يؤدي إلى تحقيق وفورات للتوسع وتعزيز المركزية. ولا يفرض التنقيب أيضًا أي شروط لحجز الأصول كضمان إضافي، ما يحد من قدرة البروتوكول على معاقبة الأطراف المسيئة بعد الهجوم. وقد جعل الانتقال إلى إثبات الحصة إثيريوم أكثر أمنًا ولا مركزية بالمقارنة مع إثبات العمل. وكلما زاد عدد الأشخاص الذين يشاركون في الشبكة، زادت اللامركزية وأصبحت الشبكة أكثر أمانًا ضد الهجمات. diff --git a/public/content/translations/bg/roadmap/beacon-chain/index.md b/public/content/translations/bg/roadmap/beacon-chain/index.md index e1f2ea8eef5..aec7b8266c3 100644 --- a/public/content/translations/bg/roadmap/beacon-chain/index.md +++ b/public/content/translations/bg/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ summaryPoint3: Бийкън чейн въведе логиката на конс Бийкън чейн въведе [доказателство-за-залог](/developers/docs/consensus-mechanisms/pos/) в Eтереум. Това поддържа сигурността на Eтереум, а валидаторите печелят повече ETH в процеса. На практика залагането е свързано със залагане на ETH с цел активиране на валидаторския софтуер. Като залагащ вие управлявате софтуер, който създава и валидира нови блокове във веригата. -Целта на залагането е подобна на тази, която имаше [добиването](/developers/docs/mining/), но се различава по много начини. Добиването изискваше да се правят големи инвестиции предварително под формата на мощен хардуер и консумация на енергия, което доведе до икономии по отношение на мащабируемостта и насърчаваше централизацията. Освен това, при добивът нямаше изисквания за заключване на активи като обезпечение, което ограничава способността на протокола да наказва некоректните участници след атака. +Целта на залагането е подобна на тази, която имаше [добиването](/developers/docs/consensus-mechanisms/pow/mining/), но се различава по много начини. Добиването изискваше да се правят големи инвестиции предварително под формата на мощен хардуер и консумация на енергия, което доведе до икономии по отношение на мащабируемостта и насърчаваше централизацията. Освен това, при добивът нямаше изисквания за заключване на активи като обезпечение, което ограничава способността на протокола да наказва некоректните участници след атака. След прехода към доказателство-за-залог Eтереум стана значително по-сигурен и децентрализиран в сравнение с механизма за доказателство-за-работа. Колкото повече хора участват в мрежата, толкова по-децентрализирана и защитена от атаки става тя. diff --git a/public/content/translations/ca/roadmap/beacon-chain/index.md b/public/content/translations/ca/roadmap/beacon-chain/index.md index 018d7aa98b2..b74e59fa8d3 100644 --- a/public/content/translations/ca/roadmap/beacon-chain/index.md +++ b/public/content/translations/ca/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ El rol de la cadena de balisa canviarà amb el pas del temps, però és un eleme La cadena de balisa introduirà la [prova de participació](/developers/docs/consensus-mechanisms/pos/) a Ethereum. És una manera nova d'ajudar a mantenir segur l'Ethereum. Ho podeu concebre com un bé públic que farà Ethereum més saludable i et farà guanyar més ETH en el procés. A la pràctica, haureu d'apostar ETH per tal d'activar el programari de validació. Com a validador, processareu les transaccions i creareu nous blocs a la cadena. -Apostar i convertir-se en validador és més senzill que [minar](/developers/docs/mining/) (la manera actual de mantenir la xarxa segura). I s'espera que això contribueixi a fer Ethereum més segur a llarg termini. Com més gent participi a la xarxa, més descentralitzada i segura serà davant dels atacs. +Apostar i convertir-se en validador és més senzill que [minar](/developers/docs/consensus-mechanisms/pow/mining/) (la manera actual de mantenir la xarxa segura). I s'espera que això contribueixi a fer Ethereum més segur a llarg termini. Com més gent participi a la xarxa, més descentralitzada i segura serà davant dels atacs. Si us interessa ser validador i contribuir a protegir la cadena de balisa, aquí podeu aprendre més sobre les apostes. diff --git a/public/content/translations/de/roadmap/beacon-chain/index.md b/public/content/translations/de/roadmap/beacon-chain/index.md index 11446851595..f8a33ce6ca0 100644 --- a/public/content/translations/de/roadmap/beacon-chain/index.md +++ b/public/content/translations/de/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ Die Beacon Chain ist die Bezeichnung für ein Kontenbuch, das das Netzwerk von E Die Beacon Chain brachte [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) zu Ethereum. Dieser Mechanismus sichert Ethereum und sorgt dafür, dass die Validatoren dabei ETH verdienen. In der Praxis bedeutet dies ETH einzusetzen, um die Validierungssoftware zu aktivieren. Als Staker führen Sie die Software aus die in der Chain neue Blöcke erstellt und validiert. -Staking erfüllt denselben Zweck wie einst [Mining](/developers/docs/mining/), aber unterscheidet sich davon in vielerlei Hinsicht. Mining erforderte hohe Voraufwendungen in Form von mächtiger Hardware und hohem Energieverbrauch. Dies führte zu Skaleneffekten und förderte Zentralisierung. Mining sah auch keine Verpflichtung vor Vermögenswerte, als Sicherheiten zu sperren. Das Protokoll hatte dadurch weniger Möglichkeiten feindselige Akteure nach einer Attacke zu bestrafen. +Staking erfüllt denselben Zweck wie einst [Mining](/developers/docs/consensus-mechanisms/pow/mining/), aber unterscheidet sich davon in vielerlei Hinsicht. Mining erforderte hohe Voraufwendungen in Form von mächtiger Hardware und hohem Energieverbrauch. Dies führte zu Skaleneffekten und förderte Zentralisierung. Mining sah auch keine Verpflichtung vor Vermögenswerte, als Sicherheiten zu sperren. Das Protokoll hatte dadurch weniger Möglichkeiten feindselige Akteure nach einer Attacke zu bestrafen. Der Wechsel zu Proof-of-Stake machte Ethereum wesentlich sicherer und dezentralisierte im Vergleich zu Proof-of-Work. Je mehr Menschen sich am Netzwerk beteiligen, desto dezentralisierter und sicherer wird es vor Angriffen. diff --git a/public/content/translations/el/roadmap/beacon-chain/index.md b/public/content/translations/el/roadmap/beacon-chain/index.md index 5b43c77f51e..a42752afcd7 100644 --- a/public/content/translations/el/roadmap/beacon-chain/index.md +++ b/public/content/translations/el/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ summaryPoint4: Μπορεί να το γνωρίζετε αυτό ως "Φάση Η κύρια αλυσίδα θα εισαγάγει το [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) στο Ethereum. Ένα νέο τρόπο για να σας βοηθήσει να διατηρήσετε το Ethereum ασφαλές. Σκεφτείτε το σαν δημόσιο αγαθό που θα κάνει το Ethereum πιο υγιές και θα σας αποδώσει περισσότερο ETH κατά την παραγωγή του. Στην πράξη, θα σας εμπλέξει στην αποθήκευση (staking) ETH προκειμένου να ενεργοποιήσετε το λογισμικό επικύρωσης. Ως επικυρωτής θα επεξεργάζεστε συναλλαγές και θα δημιουργείτε νέα μπλοκ στην αλυσίδα (chain). -Το Staking (αποθήκευση) και η λειτουργία σας ως επικυρωτής, είναι ευκολότερη από την [εξόρυξη](/developers/docs/mining/) (πώς είναι το δίκτυο ασφαλισμένο επί του παρόντος). Με την ελπίδα να βοηθήσει το Ethereum να γίνει πιο ασφαλές μακροπρόθεσμα. Όσο περισσότεροι άνθρωποι συμμετέχουν στο δίκτυο, τόσο πιο αποκεντρωμένο και ασφαλές από μια επίθεση θα μπορέσει να γίνει. +Το Staking (αποθήκευση) και η λειτουργία σας ως επικυρωτής, είναι ευκολότερη από την [εξόρυξη](/developers/docs/consensus-mechanisms/pow/mining/) (πώς είναι το δίκτυο ασφαλισμένο επί του παρόντος). Με την ελπίδα να βοηθήσει το Ethereum να γίνει πιο ασφαλές μακροπρόθεσμα. Όσο περισσότεροι άνθρωποι συμμετέχουν στο δίκτυο, τόσο πιο αποκεντρωμένο και ασφαλές από μια επίθεση θα μπορέσει να γίνει. Αν ενδιαφέρεστε να γίνετε επικυρωτής και να βοηθήσετε στην ασφάλιση του Beacon Chain, μάθετε περισσότερα για το staking. diff --git a/public/content/translations/es/roadmap/beacon-chain/index.md b/public/content/translations/es/roadmap/beacon-chain/index.md index b6d69f37bed..5ddcfc4318a 100644 --- a/public/content/translations/es/roadmap/beacon-chain/index.md +++ b/public/content/translations/es/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ Cadena de baliza es el nombre que se le ha dado a un libro mayor de cuentas que La cadena de baliza introdujo la [prueba de participación](/developers/docs/consensus-mechanisms/pos/) en Ethereum. Esta mantiene la seguridad de Ethereum y permite a los validadores obtener más ETH en el proceso. En la práctica, la participación supone comprometer ETH para poder activar el software de validación. Como participante, se encargará de ejecutar el software que crea y valida los nuevos bloques de la cadena. -La participación cumple un propósito similar al que solía realizar la [minería](/developers/docs/mining/), pero con muchas diferencias entre ambos. La minería requería de una inversión inicial significativa destinada a la adquisición de un productivo hardware y a cubrir los gastos de consumo energético, lo que derivó en economías de escala y en la promoción de la centralización. La minería tampoco requería la retención de activos colaterales, lo que limitaba los alcances del protocolo a castigar las acciones incorrectas solo tras un ataque. +La participación cumple un propósito similar al que solía realizar la [minería](/developers/docs/consensus-mechanisms/pow/mining/), pero con muchas diferencias entre ambos. La minería requería de una inversión inicial significativa destinada a la adquisición de un productivo hardware y a cubrir los gastos de consumo energético, lo que derivó en economías de escala y en la promoción de la centralización. La minería tampoco requería la retención de activos colaterales, lo que limitaba los alcances del protocolo a castigar las acciones incorrectas solo tras un ataque. La transición de Ethereum a la prueba de participación hace que la red sea significativamente más segura y descentralizada en comparación con la prueba de trabajo. Cuantas más personas participan en la red, más descentralizada y menos segura frente a ataques se vuelve. diff --git a/public/content/translations/fa/roadmap/beacon-chain/index.md b/public/content/translations/fa/roadmap/beacon-chain/index.md index 522f695b3ed..ae979013f93 100644 --- a/public/content/translations/fa/roadmap/beacon-chain/index.md +++ b/public/content/translations/fa/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ summaryPoint3: زنجیره بیکن منطق اجماع و پروتکل شای زنجیره بیکن [اثبات سهام](/developers/docs/consensus-mechanisms/pos/) را برای اولین بار به اتریوم وارد کرد. این زنجیره شبکۀ اتریوم را امن نگه می‌دارد و در این فرایند، اعتبار اتریوم بیشتری را به اعتبارسنج‌ها می‌رساند. در عمل، سهام‌گذاری شامل سهام‌گذاری روی اتریوم به منظور فعال کردن نرم‌افزار اعتبارسنج است. شما به عنوان یک سهام‌گذار، نرم‌افزاری را اجرا می‌کنید که بلوک‌های جدیدی را در زنجیره ایجاد و تأیید می‌کند. -سهام‌گذاری هدفی مشابه با [استخراج (ماینینگ)](/developers/docs/mining/) دارد، اما از بسیاری جهات متفاوت است. استخراج نیاز به سرمایۀ اولیۀ زیادی در قالب سخت‌افزار قدرتمند و مصرف انرژی داشت که منجر به صرفه به مقیاس (مزیت مقیاس) و افزایش متمرکزسازی می‌شد. ضمناً، استخراج هیچ الزامی برای قفل کردن دارایی‌ها به عنوان وثیقه نداشت و همین، توانایی پروتکل را برای مجازات نقش‌آفرینان بدکار پس از حمله محدود می‌کرد. +سهام‌گذاری هدفی مشابه با [استخراج (ماینینگ)](/developers/docs/consensus-mechanisms/pow/mining/) دارد، اما از بسیاری جهات متفاوت است. استخراج نیاز به سرمایۀ اولیۀ زیادی در قالب سخت‌افزار قدرتمند و مصرف انرژی داشت که منجر به صرفه به مقیاس (مزیت مقیاس) و افزایش متمرکزسازی می‌شد. ضمناً، استخراج هیچ الزامی برای قفل کردن دارایی‌ها به عنوان وثیقه نداشت و همین، توانایی پروتکل را برای مجازات نقش‌آفرینان بدکار پس از حمله محدود می‌کرد. جایگزینی اثبات سهام به جای اثبات کار، اتریوم را به طور قابل توجهی امن‌تر و غیرمتمرکزتر کرد. هرچه افراد بیشتری در شبکه شرکت کنند، غیرمتمرکزتر و در برابر حملات امن‌تر می‌شود. diff --git a/public/content/translations/fr/roadmap/beacon-chain/index.md b/public/content/translations/fr/roadmap/beacon-chain/index.md index 9f1b49cb8c2..146cde12188 100644 --- a/public/content/translations/fr/roadmap/beacon-chain/index.md +++ b/public/content/translations/fr/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ La chaîne Beacon est le nom donné au registre de comptes utilisé pour la cond La Chaîne phare introduit la [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos/) dans Ethereum. Cela permet de sécuriser Ethereum et pour les validateurs de gagner plus d'ETH au cours du processus. En pratique, le staking implique de miser des ETH pour activer le logiciel de validation. En tant que validateur, vous exécutez le logiciel qui créé et valide de nouveaux blocs dans la chaîne. -La mise en jeu a un objectif similaire au [minage](/developers/docs/mining/), mais diffère à plusieurs titres. Le minage nécessitait d’importantes dépenses initiales sous la forme d’une puissante consommation en matériel et énergie, entraînant des économies d’échelle et promouvant la centralisation. Le minage n'impliquait pas non plus l'obligation de bloquer les actifs en tant que garantie, ce qui limite la capacité du protocole à punir les mauvais acteurs après une attaque. +La mise en jeu a un objectif similaire au [minage](/developers/docs/consensus-mechanisms/pow/mining/), mais diffère à plusieurs titres. Le minage nécessitait d’importantes dépenses initiales sous la forme d’une puissante consommation en matériel et énergie, entraînant des économies d’échelle et promouvant la centralisation. Le minage n'impliquait pas non plus l'obligation de bloquer les actifs en tant que garantie, ce qui limite la capacité du protocole à punir les mauvais acteurs après une attaque. La transition vers la preuve d'enjeu a rendu Ethereum nettement plus sûr et décentralisé par comparaison avec la preuve de travail. Plus le nombre de participants sera élevé sur le réseau, plus celui-ci sera décentralisé et à l'abri des attaques. diff --git a/public/content/translations/hi/roadmap/beacon-chain/index.md b/public/content/translations/hi/roadmap/beacon-chain/index.md index 99181a16beb..b086ae0241d 100644 --- a/public/content/translations/hi/roadmap/beacon-chain/index.md +++ b/public/content/translations/hi/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ summaryPoint3: बीकन चेन ने सहमति तर्क और बीकन चेन ने एथेरियम के लिए [हिस्सेदारी का सबूत](/developers/docs/consensus-mechanisms/pos/) की शुरुआत की। यह एथेरियम को सुरक्षित रखता है और इस प्रोसेस में सत्यापनकर्ता ज़्यादा ETH अर्जित करते हैं। व्यवहार में, स्टेकिंग, सत्यापनकर्ता सॉफ़्टवेयर को सक्रिय करने के लिए स्टेकिंग ETH शामिल करता है। एक स्टेकर के तौर पर, आप उस सॉफ़्टवेयर को चलाते हैं जो चेन में नए ब्लॉक बनाता और मान्य करता है। -स्टेकिंग उसी तरह के उद्देश्य को पूरा करता है जिसका इस्तेमाल [माईनिंग](/Developers/docs/mining/) में किया जाता है, लेकिन यह कई मायनों में अलग है। माईनिंग के लिए शक्तिशाली हार्डवेयर और ऊर्जा खपत के रूप में बड़े अग्रिम व्यय की आवश्यकता होती है, जिसके परिणामस्वरूप बड़े व्यय (बड़ी आर्थिक इकाई) और केंद्रीकरण को बढ़ावा मिलता है। माईनिंग भी एसेट को आनुषंगिक के रूप में बंद करने की आवश्यकता के साथ नहीं आया, बल्कि इसका उद्देश्य हमले के बाद बुरे लोगों को दंडित करने की प्रोटोकॉल की क्षमता को सीमित करना है। +स्टेकिंग उसी तरह के उद्देश्य को पूरा करता है जिसका इस्तेमाल [माईनिंग](/developers/docs/consensus-mechanisms/pow/mining/) में किया जाता है, लेकिन यह कई मायनों में अलग है। माईनिंग के लिए शक्तिशाली हार्डवेयर और ऊर्जा खपत के रूप में बड़े अग्रिम व्यय की आवश्यकता होती है, जिसके परिणामस्वरूप बड़े व्यय (बड़ी आर्थिक इकाई) और केंद्रीकरण को बढ़ावा मिलता है। माईनिंग भी एसेट को आनुषंगिक के रूप में बंद करने की आवश्यकता के साथ नहीं आया, बल्कि इसका उद्देश्य हमले के बाद बुरे लोगों को दंडित करने की प्रोटोकॉल की क्षमता को सीमित करना है। हिस्सेदारी के सबूत में बदलाव ने एथेरियम को काम के सबूत की तुलना में बहुत ज़्यादा सुरक्षित और विकेंद्रीकृत बना दिया। जितने अधिक लोग नेटवर्क में भाग लेंगे, हमले से यह उतना ही अधिक विकेंद्रीकृत और सुरक्षित होगा। diff --git a/public/content/translations/hr/roadmap/beacon-chain/index.md b/public/content/translations/hr/roadmap/beacon-chain/index.md index 7162782b4f3..33bf7da509d 100644 --- a/public/content/translations/hr/roadmap/beacon-chain/index.md +++ b/public/content/translations/hr/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ Beacon Chain bila je temeljna komponenta [sadašnjeg sigurnog, ekološkog i pril Beacon Chain uveo je u Ethereum [dokaz uloga](/developers/docs/consensus-mechanisms/pos/). Tako je zaštićen Ethereum, a validatori imaju mogućnost veće zarade ETH-a. U praksi, ulaganje znači ulaganje ETH-a kako bi se aktivirao softver validatora. Kao ulagač pokrećete softver koji izrađuje i potvrđuje nove blokove u lancu. -Ulaganje ima sličnu ulogu kao i [rudarenje](/developers/docs/mining/), ali uz mnoge razlike. Rudarenje zahtijeva veća prethodna ulaganja u obliku snažnog hardvera i potrošnje energije i rezultira proporcionalnom zaradom kroz proizvodnju i naprednom centralizacijom. Rudarenje nije imalo zahtjev da se sredstva blokiraju kao pokriće te protokol tako nije mogao kazniti loše sudionike nakon napada. +Ulaganje ima sličnu ulogu kao i [rudarenje](/developers/docs/consensus-mechanisms/pow/mining/), ali uz mnoge razlike. Rudarenje zahtijeva veća prethodna ulaganja u obliku snažnog hardvera i potrošnje energije i rezultira proporcionalnom zaradom kroz proizvodnju i naprednom centralizacijom. Rudarenje nije imalo zahtjev da se sredstva blokiraju kao pokriće te protokol tako nije mogao kazniti loše sudionike nakon napada. Prijelazom na dokaz uloga Ethereum je postao sigurniji i manje centraliziran u odnosu na dokaz rada. Što više ljudi sudjeluje u mreži, to će ona biti decentraliziranija i sigurnija od napada. diff --git a/public/content/translations/hu/roadmap/beacon-chain/index.md b/public/content/translations/hu/roadmap/beacon-chain/index.md index 1624261f221..96c27947beb 100644 --- a/public/content/translations/hu/roadmap/beacon-chain/index.md +++ b/public/content/translations/hu/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ Beacon lánc a neve annak a számlafőkönyvek, amely az Ethereum-[letétesek](/ A Beacon lánc vezette be a [proof-of-stake-et](/developers/docs/consensus-mechanisms/pos/) az Ethereum rendszerébe. Ez tartja fent az Ethereum biztonságát, és a folyamat során a validátorokat több ETH-hoz juttatja. A gyakorlatban a letétbe helyezés úgy néz ki, hogy ETH-t helyez letétbe a validátorszoftver aktiválásához. Letétesként futtatja a szoftvert, amely új blokkokat hoz létre és validál a láncon. -A letétbe helyezés hasonló célt szolgál, mint korábban a [bányászat](/developers/docs/mining/), de számos tekintetben különbözik attól. A bányászat nagy összegű kezdeti kiadásokkal járt, nagy teljesítményű hardverek beszerzésével és nagy energiafogyasztással, ami a tehetősebbeknek kedvezett, és elősegítette a centralizációt. Emellett a bányászat nem követelte meg a fedezetként szolgáló eszközök zárolását, ezzel korlátozta a protokoll képességét a rosszindulatú szereplők megbüntetésére egy támadás után. +A letétbe helyezés hasonló célt szolgál, mint korábban a [bányászat](/developers/docs/consensus-mechanisms/pow/mining/), de számos tekintetben különbözik attól. A bányászat nagy összegű kezdeti kiadásokkal járt, nagy teljesítményű hardverek beszerzésével és nagy energiafogyasztással, ami a tehetősebbeknek kedvezett, és elősegítette a centralizációt. Emellett a bányászat nem követelte meg a fedezetként szolgáló eszközök zárolását, ezzel korlátozta a protokoll képességét a rosszindulatú szereplők megbüntetésére egy támadás után. A proof-of-stake mechanizmusra való áttérés jelentősen fokozta az Ethereum biztonságát és decentralizációját a proof-of-work rendszerhez képest. Minél több ember vesz részt a hálózatban, annál decentralizáltabb és védettebb lesz a támadásokkal szemben. diff --git a/public/content/translations/id/roadmap/beacon-chain/index.md b/public/content/translations/id/roadmap/beacon-chain/index.md index 36aba00e25d..899485564bc 100644 --- a/public/content/translations/id/roadmap/beacon-chain/index.md +++ b/public/content/translations/id/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ Rantai Suar adalah nama yang diberikan kepada buku besar akun yang melakukan dan Rantai Suar memperkenalkan [bukti taruhan](/developers/docs/consensus-mechanisms/pos/) pada Ethereum. Hal ini membuat Ethereum tetap aman dan membuat validator mendapatkan lebih banyak ETH dalam prosesnya. Dalam praktiknya, penaruhan melibatkan penaruhan ETH untuk mengaktifkan perangkat lunak validator. Sebagai penaruh, Anda menjalankan perangkat lunak yang membuat dan memvalidasi blok baru dalam chain. -Penaruhan memiliki tujuan yang serupa dengan [penambangan](/developers/docs/mining/), tetapi berbeda dalam banyak hal. Penambangan membutuhkan pengeluaran besar di muka dalam bentuk perangkat keras yang kuat dan konsumsi energi, yang menghasilkan skala ekonomi, dan mendorong sentralisasi. Penambangan juga tidak dilengkapi dengan persyaratan untuk mengunci aset sebagai jaminan, membatasi kemampuan protokol untuk menghukum pelaku kejahatan setelah terjadi serangan. +Penaruhan memiliki tujuan yang serupa dengan [penambangan](/developers/docs/consensus-mechanisms/pow/mining/), tetapi berbeda dalam banyak hal. Penambangan membutuhkan pengeluaran besar di muka dalam bentuk perangkat keras yang kuat dan konsumsi energi, yang menghasilkan skala ekonomi, dan mendorong sentralisasi. Penambangan juga tidak dilengkapi dengan persyaratan untuk mengunci aset sebagai jaminan, membatasi kemampuan protokol untuk menghukum pelaku kejahatan setelah terjadi serangan. Transisi ke bukti taruhan membuat Ethereum secara signifikan lebih aman dan terdesentralisasi dibandingkan dengan bukti kerja. Semakin banyak orang yang berpartisipasi dalam jaringan, semakin terdesentralisasi dan aman dari serangan. diff --git a/public/content/translations/it/roadmap/beacon-chain/index.md b/public/content/translations/it/roadmap/beacon-chain/index.md index 0ea7f8bdd85..70f3ad03bac 100644 --- a/public/content/translations/it/roadmap/beacon-chain/index.md +++ b/public/content/translations/it/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ Beacon Chain è il nome dato a un libro mastro di conti che hanno condotto e coo La Beacon Chain ha introdotto la [proof of stake](/developers/docs/consensus-mechanisms/pos/) in Ethereum. Questo mantiene sicura Ethereum e consente ai validatori di guadagnare più ETH nel processo. In pratica, lo staking prevede di puntare ETH per poter attivare il software del validatore. Come staker, esegui il software che crea e convalida i nuovi blocchi nella catena. -Lo staking serve a uno scopo simile a quello del [mining](/developers/docs/mining/), ma è differente in molti modi. Il mining richiedeva ingenti spese iniziali sotto forma di hardware potente e consumi energetici, risultando in economie di scala e promuovendo la centralizzazione. Il mining, inoltre, non prevedeva alcun requisito di bloccare le risorse come garanzie, limitando la capacità del protocollo di punire gli utenti malevoli dopo un attacco. +Lo staking serve a uno scopo simile a quello del [mining](/developers/docs/consensus-mechanisms/pow/mining/), ma è differente in molti modi. Il mining richiedeva ingenti spese iniziali sotto forma di hardware potente e consumi energetici, risultando in economie di scala e promuovendo la centralizzazione. Il mining, inoltre, non prevedeva alcun requisito di bloccare le risorse come garanzie, limitando la capacità del protocollo di punire gli utenti malevoli dopo un attacco. La transizione al proof of stake ha reso Ethereum significativamente più sicura e decentralizzata rispetto al proof of work. Più persone parteciperanno alla rete, più questa diventerà decentralizzata e protetta dagli attacchi. diff --git a/public/content/translations/ja/roadmap/beacon-chain/index.md b/public/content/translations/ja/roadmap/beacon-chain/index.md index 67d78a51a4d..7efc00bf1d6 100644 --- a/public/content/translations/ja/roadmap/beacon-chain/index.md +++ b/public/content/translations/ja/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ summaryPoint3: ビーコンチェーンは、コンセンサスロジックと ビーコンチェーンの稼働の伴い、 [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos/)がイーサリアムに導入されました。 イーサリアムの安全性が保たれ、バリデータはより多くのETHを獲得することができるようになりました。 実際にバリデータソフトウェアを起動するには、ETHをステーキングすることになります。 ステーカーは、チェーンに新しいブロックを作成し、検証するバリデータソフトウェアを実行します。 -ステーキングは、かつての[マイニング](/developers/docs/mining/)と同じ目的を果たしますが、その手法は多くの点で異なります。 マイニングには、強力なハードウェアや大量のエネルギーが必要であり、そのため、多額の先行投資が必要になります。その結果、規模の経済が生まれ、集中化が進みました マイニングにおいても、資産を担保としてロックする必要がなかったため、攻撃後に悪意のある行為者を罰するプロトコルの能力にも限界がありました。 +ステーキングは、かつての[マイニング](/developers/docs/consensus-mechanisms/pow/mining/)と同じ目的を果たしますが、その手法は多くの点で異なります。 マイニングには、強力なハードウェアや大量のエネルギーが必要であり、そのため、多額の先行投資が必要になります。その結果、規模の経済が生まれ、集中化が進みました マイニングにおいても、資産を担保としてロックする必要がなかったため、攻撃後に悪意のある行為者を罰するプロトコルの能力にも限界がありました。 プルーフ・オブ・ステークへの移行により、イーサリアムは従来のプルーフ・オブ・ワークに比べて、格段にセキュリティと分散性が向上しました。 ネットワークに参加する人が多いほど、より分散化され、攻撃の危険性が減少します。 diff --git a/public/content/translations/ml/roadmap/beacon-chain/index.md b/public/content/translations/ml/roadmap/beacon-chain/index.md index 669f4091ab2..86690ec8980 100644 --- a/public/content/translations/ml/roadmap/beacon-chain/index.md +++ b/public/content/translations/ml/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ summaryPoint3: ബീക്കൺ ചെയിൻ പൊതു യുക്ത ബീക്കൺ ചെയിൻ Ethereum-ന് [പ്രൂഫ് ഓഫ് സ്റ്റേക്ക്](/developers/docs/consensus-mechanisms/pos/) അവതരിപ്പിച്ചിരിക്കുന്നു. ഇത് Ethereum-ത്തെ സുരക്ഷിതമായി നിലനിർത്തുകയും വാലിഡേറ്റർമാർ പ്രക്രിയയിൽ കൂടുതൽ ETH നേടുകയും ചെയ്യുന്നു. പ്രായോഗികമായി, വാലിഡേറ്റർ സോഫ്റ്റ്‌വെയർ സജീവമാക്കുന്നതിന് സ്റ്റെയ്ക്കിങിൽ സ്റ്റെയ്ക്കിങ് ETH ഉൾപ്പെടുന്നു. ഒരു സ്റ്റേക്കർ എന്ന നിലയിൽ, ചെയിനിലെ പുതിയ ബ്ലോക്കുകൾ സൃഷ്ടിക്കുകയും സാധൂകരിക്കുകയും ചെയ്യുന്ന സോഫ്റ്റ്‌വെയർ നിങ്ങൾ പ്രവർത്തിപ്പിക്കും. -വ്യത്യസ്‌തമായ രീതികളിൽ [മൈനിംഗ്](/developers/docs/mining/) ഉപയോഗിച്ചിരുന്ന സമാനമായ ഉദ്ദേശ്യമാണ് സ്റ്റേക്കിംഗ് നിർവഹിക്കുന്നത്. ഇക്കണോമീസ് ഓഫ് സ്‌കെയിലിംഗിന്റെ ഫലമുണ്ടാക്കുകയും കേന്ദ്രീകരണം പ്രോത്സാഹിപ്പിക്കുകയും ചെയ്തുകൊണ്ട് മൈനിംഗ് ശക്തമായ ഹാർഡ്‌വെയറിന്റെയും ഊർജ്ജ ഉപഭോഗത്തിന്റെയും രൂപത്തിൽ വലിയ മുൻകൂർ അടച്ചുതീർക്കേണ്ട ചെലവുകൾ ആവശ്യപ്പെടുന്നു. ഒരു ആക്രമണത്തിന് ശേഷം മോശം ആക്റ്റർമാരെ ശിക്ഷിക്കുന്നതിനുള്ള പ്രോട്ടോക്കോളിന്റെ കഴിവ് പരിമിതപ്പെടുത്തിക്കൊണ്ട്, ഈടായി ആസ്തികൾ ലോക്ക് ചെയ്യേണ്ട യാതൊരു ആവശ്യവും മൈനിംഗിൽ ഉണ്ടായിരുന്നുമില്ല. +വ്യത്യസ്‌തമായ രീതികളിൽ [മൈനിംഗ്](/developers/docs/consensus-mechanisms/pow/mining/) ഉപയോഗിച്ചിരുന്ന സമാനമായ ഉദ്ദേശ്യമാണ് സ്റ്റേക്കിംഗ് നിർവഹിക്കുന്നത്. ഇക്കണോമീസ് ഓഫ് സ്‌കെയിലിംഗിന്റെ ഫലമുണ്ടാക്കുകയും കേന്ദ്രീകരണം പ്രോത്സാഹിപ്പിക്കുകയും ചെയ്തുകൊണ്ട് മൈനിംഗ് ശക്തമായ ഹാർഡ്‌വെയറിന്റെയും ഊർജ്ജ ഉപഭോഗത്തിന്റെയും രൂപത്തിൽ വലിയ മുൻകൂർ അടച്ചുതീർക്കേണ്ട ചെലവുകൾ ആവശ്യപ്പെടുന്നു. ഒരു ആക്രമണത്തിന് ശേഷം മോശം ആക്റ്റർമാരെ ശിക്ഷിക്കുന്നതിനുള്ള പ്രോട്ടോക്കോളിന്റെ കഴിവ് പരിമിതപ്പെടുത്തിക്കൊണ്ട്, ഈടായി ആസ്തികൾ ലോക്ക് ചെയ്യേണ്ട യാതൊരു ആവശ്യവും മൈനിംഗിൽ ഉണ്ടായിരുന്നുമില്ല. പ്രൂഫ് ഓഫ് സ്റ്റേക്കിലേക്കുള്ള മാറ്റം Ethereum-ത്തെ പ്രൂഫ് ഓഫ് വർക്കുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ കൂടുതൽ സുരക്ഷിതവും വികേന്ദ്രീകൃതവുമാക്കി. നെറ്റ്‌വർക്കിൽ കൂടുതൽ ആളുകൾ പങ്കെടുക്കുമ്പോൾ, അത് കൂടുതൽ വികേന്ദ്രീകൃതവും ആക്രമണങ്ങളിൽ നിന്ന് സുരക്ഷിതവുമാകും. diff --git a/public/content/translations/nl/roadmap/beacon-chain/index.md b/public/content/translations/nl/roadmap/beacon-chain/index.md index cfd87143a50..58630db91ab 100644 --- a/public/content/translations/nl/roadmap/beacon-chain/index.md +++ b/public/content/translations/nl/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ Het doel van de Beacon Chain zal in de loop van de tijd veranderen, maar het is De Beacon Chain zal [Proof-of-Stake](/developers/docs/consensus-mechanisms/pos/) introduceren bij Ethereum. Dit is een nieuwe manier waarbij u kunt helpen om Ethereum veilig te houden. Zie het als iets dat voor iedereen toegankelijk is en wat Ethereum beter maakt en waarmee je tegelijk meer ETH verdiend. In de praktijk betekent het dat het uw betrokkenheid vergt door het staken van ETH om zo de validatorsoftware te activeren. Als validator verwerkt u transacties en creëert u nieuwe blokken in de keten. -Sstaken en een validator worden is makkelijker dan [mining](/developers/docs/mining/) (hoe het huidige netwerk nu beveiligd wordt). Hopelijk zal dit helpen om Ethereum op langere termijn veilig te maken. Hoe meer mensen meewerken aan het netwerk, hoe meer het zal decentraliseren en hoe veiliger het zal worden. +Sstaken en een validator worden is makkelijker dan [mining](/developers/docs/consensus-mechanisms/pow/mining/) (hoe het huidige netwerk nu beveiligd wordt). Hopelijk zal dit helpen om Ethereum op langere termijn veilig te maken. Hoe meer mensen meewerken aan het netwerk, hoe meer het zal decentraliseren en hoe veiliger het zal worden. Als u geïnteresseerd bent om een validator te worden en de Beacon Chain te beveiligen, hier vindt u meer informatie over staken. diff --git a/public/content/translations/pl/roadmap/beacon-chain/index.md b/public/content/translations/pl/roadmap/beacon-chain/index.md index 8ced95ba2b5..1233d3115af 100644 --- a/public/content/translations/pl/roadmap/beacon-chain/index.md +++ b/public/content/translations/pl/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ Wprowadził on mechanizm konsensusu (lub „warstwę konsensusu”), który zaj Łańcuch śledzący wprowadził do Ethereum mechanizm [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). Zapewnia to bezpieczeństwo Ethereum i daje walidatorom więcej ETH w tym procesie. W praktyce staking polega na stakowaniu ETH w celu aktywowania oprogramowania walidatora. Jako staker używasz oprogramowania, które tworzy i waliduje nowe bloki w łańcuchu. -Staking służy podobnym celom, co kiedyś [wydobywanie](/developers/docs/mining/), ale różni się pod wieloma względami. Wydobywanie wymagało dużych nakładów początkowych w postaci potężnego sprzętu i zużycia energii, co skutkowało ekonomią skali i sprzyjało centralizacji. Wydobywanie nie wiązało się również z wymogiem blokowania aktywów jako zabezpieczenia, co ograniczało możliwości protokołu w zakresie karania wrogich podmiotów po ataku. +Staking służy podobnym celom, co kiedyś [wydobywanie](/developers/docs/consensus-mechanisms/pow/mining/), ale różni się pod wieloma względami. Wydobywanie wymagało dużych nakładów początkowych w postaci potężnego sprzętu i zużycia energii, co skutkowało ekonomią skali i sprzyjało centralizacji. Wydobywanie nie wiązało się również z wymogiem blokowania aktywów jako zabezpieczenia, co ograniczało możliwości protokołu w zakresie karania wrogich podmiotów po ataku. Przejście na proof-of-stake sprawiło, że sieć Ethereum stała się znacznie bezpieczniejsza i zdecentralizowana w porównaniu z proof-of-work. Im więcej osób uczestniczy w sieci, tym staje się ona bardziej zdecentralizowana i lepiej zabezpieczona przed atakami. diff --git a/public/content/translations/pt-br/roadmap/beacon-chain/index.md b/public/content/translations/pt-br/roadmap/beacon-chain/index.md index 1b334ff6b1e..1225995e7b3 100644 --- a/public/content/translations/pt-br/roadmap/beacon-chain/index.md +++ b/public/content/translations/pt-br/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ Beacon Chain é o nome dado a um registro de contas que orientava e coordenava a A Beacon Chain introduziu a [prova de participação](/developers/docs/consensus-mechanisms/pos/) no Ethereum. Isso mantém o Ethereum protegido e os validadores recebem mais ETH no processo. Na prática, você precisará participar com os seus ETH para ativar o software de validador. Como participante, você executa o software que cria e valida novos blocos na cadeia. -O processo de participação tem um objetivo semelhante ao da [mineração](/developers/docs/mining/), mas tem muitas diferenças. A mineração exigia grandes investimentos iniciais na forma de um hardware potente e consumo de energia, o que resultava em economias de escala e promovia a centralização. A mineração também não tem como garantia uma exigência de bloqueio de ativos, o que limita a capacidade do protocolo de punir os malfeitores após um ataque. +O processo de participação tem um objetivo semelhante ao da [mineração](/developers/docs/consensus-mechanisms/pow/mining/), mas tem muitas diferenças. A mineração exigia grandes investimentos iniciais na forma de um hardware potente e consumo de energia, o que resultava em economias de escala e promovia a centralização. A mineração também não tem como garantia uma exigência de bloqueio de ativos, o que limita a capacidade do protocolo de punir os malfeitores após um ataque. A transição para a prova de participação tornou o Ethereum consideravelmente mais seguro e descentralizado, em comparação com a prova de trabalho. Quanto mais pessoas participarem da rede, mais descentralizada e segura contra ataques ela será. diff --git a/public/content/translations/ro/roadmap/beacon-chain/index.md b/public/content/translations/ro/roadmap/beacon-chain/index.md index 02813bd268d..6d9571a48cc 100644 --- a/public/content/translations/ro/roadmap/beacon-chain/index.md +++ b/public/content/translations/ro/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ Lanțul Beacon a fost o componentă fundamentală pentru [securitatea, respectul Lanțul Beacon a introdus [dovada mizei](/developers/docs/consensus-mechanisms/pos/) în Ethereum. Aceasta asigură securitatea Ethereum și generează mai mult ETH pentru validatori în cadrul procesului. În practică, mizarea implică mizarea ETH pentru activarea software-ului validatorului. În calitate de staker, rulați software-ul care creează și validează noile blocuri din lanț. -Mizarea joacă același rol avut înainte de [minare](/developers/docs/mining/), dar diferă în multe moduri. Minarea necesita cheltuieli inițiale mari, sub forma unor echipamente hardware puternice și a unui consum mare de energie, ceea ce duce la economii de scalare și promovarea centralizării. De asemenea, minarea nu implica cerințe pentru blocarea activelor drept garanție, limitând capacitatea protocolului de a pedepsi actorii răi după un atac. +Mizarea joacă același rol avut înainte de [minare](/developers/docs/consensus-mechanisms/pow/mining/), dar diferă în multe moduri. Minarea necesita cheltuieli inițiale mari, sub forma unor echipamente hardware puternice și a unui consum mare de energie, ceea ce duce la economii de scalare și promovarea centralizării. De asemenea, minarea nu implica cerințe pentru blocarea activelor drept garanție, limitând capacitatea protocolului de a pedepsi actorii răi după un atac. Tranziția la dovada mizei a făcut ca Ethereum să fie mult mai sigur și mai descentralizat în comparație cu dovada muncii. Cu cât numărul de oameni din rețea este mai mare, cu atât mai descentralizată și mai sigură în caz de atacuri devine aceasta. diff --git a/public/content/translations/ru/roadmap/beacon-chain/index.md b/public/content/translations/ru/roadmap/beacon-chain/index.md index c6ecec4caab..c0f94caa795 100644 --- a/public/content/translations/ru/roadmap/beacon-chain/index.md +++ b/public/content/translations/ru/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ summaryPoint3: Сеть Beacon ввела логику консенсуса и Сеть Beacon ввела [доказательство владения](/developers/docs/consensus-mechanisms/pos/) в Ethereum. Это обеспечивает безопасность Ethereum и дает валидаторам возможность зарабатывать ЕТН в процессе. На практике стейкинг представляет собой ставку ETH для того, чтобы активировать ПО валидатора. В роли дольщика вы запускаете программное обеспечение, которое создает и проверяет новые блоки в сети. -Стейкинг служит той же цели, что и [майнинг](/developers/docs/mining/) в прошлом, но имеет много отличий. Майнинг требовал значительных начальных расходов в виде мощного оборудования и энергопотребления, что отражалось в нехватке масштабирования и способствовало централизации. Майнинг также не сопровождался каким-либо требованием о блокировании активов в качестве залога, что ограничивало способность протокола наказывать злоумышленников после атаки. +Стейкинг служит той же цели, что и [майнинг](/developers/docs/consensus-mechanisms/pow/mining/) в прошлом, но имеет много отличий. Майнинг требовал значительных начальных расходов в виде мощного оборудования и энергопотребления, что отражалось в нехватке масштабирования и способствовало централизации. Майнинг также не сопровождался каким-либо требованием о блокировании активов в качестве залога, что ограничивало способность протокола наказывать злоумышленников после атаки. Переход к доказательству владения сделал Ethereum значительно более безопасным и децентрализованным по сравнению с доказательством работы. Чем больше людей принимают участие в работе сети, тем более децентрализованной и защищенной от атак она становится. diff --git a/public/content/translations/sl/roadmap/beacon-chain/index.md b/public/content/translations/sl/roadmap/beacon-chain/index.md index dcff2d23b4e..325aab287ef 100644 --- a/public/content/translations/sl/roadmap/beacon-chain/index.md +++ b/public/content/translations/sl/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ Oddajniška veriga je bila temeljni del [varnega, okolju prijaznega in prilagodl Oddajniška veriga je v Ethereum vpeljala mehanizem [dokaza o deležu](/developers/docs/consensus-mechanisms/pos/). Ta ščiti Ethereum in omogoča validatorjem, da v postopku zaslužijo več ETH. V praksi to pomeni, da je treba za aktiviranje programske opreme za validacijo zastaviti ETH. Kot zastavljavec poganjate programsko opremo, ki ustvarja in validira nove bloke v verigi. -Zastavljanje deluje podobno, kot je prej [rudarjenje](/developers/docs/mining/), vendar je drugačno. Rudarjenje je zahtevalo veliko predhodno investicijo v obliki zmogljive strojne opreme in porabe energije. Posledici sta bili ekonomija obsega in spodbujanje centralizacije. Rudarjenje prav tako ni vključevalo zahteve po zamrznitvi sredstev kot jamstva, kar je omejevalo možnosti prokotola, da kaznuje storilce po napadu. +Zastavljanje deluje podobno, kot je prej [rudarjenje](/developers/docs/consensus-mechanisms/pow/mining/), vendar je drugačno. Rudarjenje je zahtevalo veliko predhodno investicijo v obliki zmogljive strojne opreme in porabe energije. Posledici sta bili ekonomija obsega in spodbujanje centralizacije. Rudarjenje prav tako ni vključevalo zahteve po zamrznitvi sredstev kot jamstva, kar je omejevalo možnosti prokotola, da kaznuje storilce po napadu. S prehodom na mehanizem dokaza o deležu je Ethereum postal občutno varnejši in bolj decentraliziran v primerjavi z mehanizmom dokaza o delu. Več ljudi kot sodeluje v omrežju, bolj decentralizirano in varno pred napadi postane. diff --git a/public/content/translations/sw/roadmap/beacon-chain/index.md b/public/content/translations/sw/roadmap/beacon-chain/index.md index 49df9c1eb0b..e92f17f889b 100644 --- a/public/content/translations/sw/roadmap/beacon-chain/index.md +++ b/public/content/translations/sw/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ Jukumu ya mnyororo wa Kioleza litabadilika baada ya mda ila sehemu ya msingi ya Mnyororo wa Kioleza utaingiza [uthibitisho-wa-hisa](/developers/docs/consensus-mechanisms/pos/) kwenye Ethereum. Hii ndio njia mpya ya wewe kusaidia Ethereum kua salama. Ifikirie kama faida kw jamii ambayo itafanya Ethereum kua na afya na kukutenegenezea hela zaidi wakati wa mchakato. Kiuhalisia, itahusisha wewe kuweka hisa za ETH ili kuamsha programu. Kama mthibitishaji utafanya mchakato wa shughuli za pesa na utaunda vitalu vipya kwenye mnyororo. -Kuweka hisa na kua mt hibitishaji ni rahisi kuliko [kuchimba](/developers/docs/mining/)(jinsi ambavyo mtandao ni saklama kwa sasa). Mwishowe hii inamatumaini itasaidia Ethereum kua salama zaidi. Jinsi watu wengi wanavyoshiriki katika mtandao, ndivyo unavyozodi kujitegemea na salama kutoka kwa shambulio litakalokuja. +Kuweka hisa na kua mt hibitishaji ni rahisi kuliko [kuchimba](/developers/docs/consensus-mechanisms/pow/mining/)(jinsi ambavyo mtandao ni saklama kwa sasa). Mwishowe hii inamatumaini itasaidia Ethereum kua salama zaidi. Jinsi watu wengi wanavyoshiriki katika mtandao, ndivyo unavyozodi kujitegemea na salama kutoka kwa shambulio litakalokuja. Kama ungependa kua mthibitishaji na kusaidia kulinda mnyororo wa Kioleza, jifunze zaidi jinsi ya kuweka hisa. diff --git a/public/content/translations/tr/roadmap/beacon-chain/index.md b/public/content/translations/tr/roadmap/beacon-chain/index.md index 9671a04f1ff..e241bfdf9ce 100644 --- a/public/content/translations/tr/roadmap/beacon-chain/index.md +++ b/public/content/translations/tr/roadmap/beacon-chain/index.md @@ -28,7 +28,7 @@ summaryPoint3: İşaret Zinciri ve mutabakat mantığını ve şimdilerde Ethere İşaret Zinciri, Ethereum'a [Hisse İspatını](/developers/docs/consensus-mechanisms/pos/) tanıttı. Bu, Ethereum'u güvende tutar ve süreç doğrulayıcılarına daha fazla ETH kazandırır. Pratikte hisseleme, doğrulayıcı yazılımını aktive etmek için ETH'nin hisselenmesini içerir. Bir paydaş olarak, zincirde yeni bloklar oluşturan ve doğrulayan yazılımı çalıştırırsınız. -Hisseleme [ madenciliğin](/developers/docs/mining/) eskiden yaptığına benzer bir amaca hizmet eder, ancak birçok yönden farklıdır. Madencilik güçlü donanım, enerji harcaması gibi büyük ön harcamalar gerektiriyordu ve ölçeklendirilmiş ekonomilere sebep oluyor ve merkeziyetçiliği teşvik ediyordu. Madencilik ayrıca varlıkları teminat olarak kitlemeye gerek duymuyordu ve protokolün uğranan saldırıdan sonra gerekli kişilere gerekli ceza vermesini de sınırlandırıyordu. +Hisseleme [ madenciliğin](/developers/docs/consensus-mechanisms/pow/mining/) eskiden yaptığına benzer bir amaca hizmet eder, ancak birçok yönden farklıdır. Madencilik güçlü donanım, enerji harcaması gibi büyük ön harcamalar gerektiriyordu ve ölçeklendirilmiş ekonomilere sebep oluyor ve merkeziyetçiliği teşvik ediyordu. Madencilik ayrıca varlıkları teminat olarak kitlemeye gerek duymuyordu ve protokolün uğranan saldırıdan sonra gerekli kişilere gerekli ceza vermesini de sınırlandırıyordu. Hisse ispatına geçiş Ethereum'u, iş ispatına kıyasla, çok daha güvenli ve merkeziyetsiz hale getirdi. Ağa katılan insan sayısı arttıkça, mevcut ağ bir o kadar merkeziyetsiz ve saldırılara karşı daha da güvende olur. diff --git a/public/content/translations/uk/roadmap/beacon-chain/index.md b/public/content/translations/uk/roadmap/beacon-chain/index.md index a327ab4df2e..696f36de8f5 100644 --- a/public/content/translations/uk/roadmap/beacon-chain/index.md +++ b/public/content/translations/uk/roadmap/beacon-chain/index.md @@ -32,7 +32,7 @@ Beacon Chain був необхідним компонентом для [безп Завдяки Beacon Chain в Ethereum з’явилася модель [доказу частки](/developers/docs/consensus-mechanisms/pos/). Це дає змогу захищати Ethereum і допомагає валідаторам заробляти більше ETH у процесі. На практиці процес стейкінгу передбачає виставляння ETH для активації програмного забезпечення валідатора. Стейкер запускає програмне забезпечення, що створює нові блоки в ланцюгу та здійснює їх валідацію. -Стейкінг виконує функцію, схожу на ту, яку мав [майнінг](/developers/docs/mining/), але ці процеси відрізняються в багатьох аспектах. Майнінг потребував високих попередніх витрат, як-от потужного апаратного забезпечення та великої кількості енергії, що призвело до економії масштабів і просування централізації. Майнінг також не вимагав фіксування додаткових активів, що обмежувало здатність протоколу карати зловмисників після атак. +Стейкінг виконує функцію, схожу на ту, яку мав [майнінг](/developers/docs/consensus-mechanisms/pow/mining/), але ці процеси відрізняються в багатьох аспектах. Майнінг потребував високих попередніх витрат, як-от потужного апаратного забезпечення та великої кількості енергії, що призвело до економії масштабів і просування централізації. Майнінг також не вимагав фіксування додаткових активів, що обмежувало здатність протоколу карати зловмисників після атак. Завдяки переходу на модель доказу частки мережа Ethereum стала набагато безпечнішою та більш децентралізованою, як порівняти з періодом використання моделі підтвердження роботи. Що більше людей беруть участь у мережі, то більш децентралізованою та захищеною від атак вона стає. diff --git a/public/content/translations/zh-tw/roadmap/beacon-chain/index.md b/public/content/translations/zh-tw/roadmap/beacon-chain/index.md index 29b5e354810..6d21cc63613 100644 --- a/public/content/translations/zh-tw/roadmap/beacon-chain/index.md +++ b/public/content/translations/zh-tw/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ summaryPoint3: 信標鏈引入共識邏輯和區塊廣播協定,現在可保 信標鏈將[權益證明](/developers/docs/consensus-mechanisms/pos/)引入以太坊。 這可以保證以太坊的安全,驗證者可以在此過程中賺取更多以太幣。 實際上,你需要使用質押以太幣來啟用驗證者軟體。 身為質押者,你將執行在鏈中建立及驗證新區塊的軟體。 -質押的目的與[挖礦](/developers/docs/mining/)相似,但在很多方面有所不同。 挖礦需要大量的前期支出,包括強大的硬體和高能耗,從而產生規模經濟並促進中心化。 挖礦也不要求將任何資產鎖定以作為抵押品,這限制了協定在攻擊發生後懲罰作惡者的能力。 +質押的目的與[挖礦](/developers/docs/consensus-mechanisms/pow/mining/)相似,但在很多方面有所不同。 挖礦需要大量的前期支出,包括強大的硬體和高能耗,從而產生規模經濟並促進中心化。 挖礦也不要求將任何資產鎖定以作為抵押品,這限制了協定在攻擊發生後懲罰作惡者的能力。 相較於工作量證明,過渡到權益證明後,以太坊的安全性和去中心化程度大幅提升。 參與網路的人越多,去中心化程度和安全性越高,抵禦攻擊的能力也越強。 diff --git a/public/content/translations/zh/roadmap/beacon-chain/index.md b/public/content/translations/zh/roadmap/beacon-chain/index.md index c79e8d1540e..a1b8bff0b93 100644 --- a/public/content/translations/zh/roadmap/beacon-chain/index.md +++ b/public/content/translations/zh/roadmap/beacon-chain/index.md @@ -27,7 +27,7 @@ summaryPoint3: 信标链引入的共识逻辑和区块广播协议目前保护 信标链将[权益证明机制](/developers/docs/consensus-mechanisms/pos/)引入以太坊。 这保证了以太坊的安全,并在此过程中让验证者获得更多以太币。 在实际操作中,质押将需要质押以太币,以激活验证者软件。 作为质押人,你运行该软件并在链中创建和验证新区块。 -质押的作用与曾经的[挖矿](/developers/docs/mining/)类似,但有许多不同之处。 挖矿的前期支出庞大,需要投入强大的硬件和消耗大量能源,从而产生规模经济并促进集中化。 挖矿也没有提出任何将资产锁定作为抵押品的要求,这限制了被攻击后协议惩罚不良行为者的能力。 +质押的作用与曾经的[挖矿](/developers/docs/consensus-mechanisms/pow/mining/)类似,但有许多不同之处。 挖矿的前期支出庞大,需要投入强大的硬件和消耗大量能源,从而产生规模经济并促进集中化。 挖矿也没有提出任何将资产锁定作为抵押品的要求,这限制了被攻击后协议惩罚不良行为者的能力。 和工作量证明相比,过渡到权益证明让以太坊的安全性与去中心化得到显著提升。 参与该网络的人越多,网络去中心化程度越高,面临攻击时也越安全。 From f323dce30f44939e6bb248cb6a2cf496b3db357a Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 13:54:20 +0000 Subject: [PATCH 435/478] Fix manticore link --- .../de/developers/docs/smart-contracts/testing/index.md | 2 +- .../hu/developers/docs/smart-contracts/testing/index.md | 2 +- .../id/developers/docs/smart-contracts/testing/index.md | 2 +- .../pl/developers/docs/smart-contracts/testing/index.md | 2 +- .../ro/developers/docs/smart-contracts/testing/index.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) 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 60a07e1bdeb..f705599b516 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 @@ -37,7 +37,7 @@ incomplete: true - [Solidity and Truffle Continuous Integration Setup](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _ – So richten Sie Travis oder Circle CI für Trüffel-Tests zusammen mit nützlichen Plugins ein._ - [Übersicht über Testprodukte](/developers/tutorials/guide-to-smart-contract-security-tools/) _ – Eine Übersicht und ein Vergleich verschiedener Testprodukte_ - [So verwenden Sie Echidna zum Testen von Smart Contracts](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [So finden Sie mit Manticore Fehler in Smart Contracts](/developers/tutorials/how-to-use-manticor-to-find-smart-contract-bugs/) +- [So finden Sie mit Manticore Fehler in Smart Contracts](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [So finden Sie mit Slither Fehler in Smart Contracts](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [So simulieren Sie Solidity-Verträge zum Testen](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) - [So migrieren Sie von Truffle-Tests zur OpenZeppelin-Testumgebung](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) diff --git a/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md b/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md index 9e8311cf2ce..a8334c9c076 100644 --- a/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/hu/developers/docs/smart-contracts/testing/index.md @@ -37,7 +37,7 @@ incomplete: true - [Solidity and Truffle Continuous Integration Setup](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _– A Travis vagy a Circle CI telepítése a Truffle-höz, valamint hasznos tesztelési pluginok._ - [Testing products overview](/developers/tutorials/guide-to-smart-contract-security-tools/) _– A külöböző tesztelési termékek bemutatása és összehasonlítása._ - [Echinda használata okosszerződés teszteléshez](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [A Manticore használata okosszerződés bugok felderítésére](/developers/tutorials/how-to-use-manticor-to-find-smart-contract-bugs/) +- [A Manticore használata okosszerződés bugok felderítésére](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [A Slither használata okosszerződés bugok felderítésére](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [Solidity szerződés mockup-ok teszteléshez](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) - [Truffle Test migráció az OpenZeppelin Teszt környezetbe](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) diff --git a/public/content/translations/id/developers/docs/smart-contracts/testing/index.md b/public/content/translations/id/developers/docs/smart-contracts/testing/index.md index a48c83ad503..2fec20609ef 100644 --- a/public/content/translations/id/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/id/developers/docs/smart-contracts/testing/index.md @@ -37,7 +37,7 @@ incomplete: true - [Pengaturan Integrasi Berkelanjutan Solidity dan Truffle](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _– Cara menyiapkan Travis atau Circle CI untuk pengujian Truffle bersama dengan plugin yang berguna._ - [Gambaran umum produk pengujian](/developers/tutorials/guide-to-smart-contract-security-tools/) _– Gambaran umum dan perbandingan dari produk pengujian berbeda._ - [Cara menggunakan Echidna untuk menguji kontrak pintar](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [Cara menggunakan Manticore untuk menemukan bug kontrak pintar](/developers/tutorials/how-to-use-manticor-to-find-smart-contract-bugs/) +- [Cara menggunakan Manticore untuk menemukan bug kontrak pintar](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [Cara menggunakan Slither untuk menemukan bug kontrak pintar](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [Cara meniru kontrak Solidity untuk pengujian](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) - [Cara berpindah dari Uji Truffle ke Lingkungan Uji OpenZeppelin](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) diff --git a/public/content/translations/pl/developers/docs/smart-contracts/testing/index.md b/public/content/translations/pl/developers/docs/smart-contracts/testing/index.md index 74b9d93cbf0..c7b29760bb1 100644 --- a/public/content/translations/pl/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/pl/developers/docs/smart-contracts/testing/index.md @@ -37,7 +37,7 @@ incomplete: true - [Solidity and Truffle Continuous Integration Setup](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _– jak skonfigurować Travis lub Circle CI do testowania Truffle wraz z przydatnymi wtyczkami_ - [Narzędzia testowe](/developers/tutorials/guide-to-smart-contract-security-tools/) _– przegląd i porównanie różnych narzędzi testowych_ - [Echidna – narzędzie do testowania inteligentnych kontraktów](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [Manticore – narzędzie do znajdowania błędów w inteligentnych kontraktach](/developers/tutorials/how-to-use-manticor-to-find-smart-contract-bugs/) +- [Manticore – narzędzie do znajdowania błędów w inteligentnych kontraktach](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [Slither – narzędzie do znajdowania błędów w inteligentnych kontraktach](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [Jak tworzyć kontrakty Solidity pod kątem testowania](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) - [Jak migrować z Truffle Tests do środowiska testowego OpenZeppelin](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) diff --git a/public/content/translations/ro/developers/docs/smart-contracts/testing/index.md b/public/content/translations/ro/developers/docs/smart-contracts/testing/index.md index ed80a85e75f..2097c4979cb 100644 --- a/public/content/translations/ro/developers/docs/smart-contracts/testing/index.md +++ b/public/content/translations/ro/developers/docs/smart-contracts/testing/index.md @@ -42,7 +42,7 @@ incomplete: true - [Configurare de integrare continuă cu Solidity și Truffle](/developers/tutorials/solidity-and-truffle-continuous-integration-setup/) _– Cum se configurează Travis sau Circle CI pentru testare Truffle împreună cu plugin-uri utile._ - [Prezentare generală a produselor de testare](/developers/tutorials/guide-to-smart-contract-security-tools/) _– O prezentare generală și o comparație a diferitelor produse de testare._ - [Cum se folosește Echidna pentru a testa contractele inteligente](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) -- [Cum se folosește Manticore pentru a depista bug-uri în contractele inteligente](/developers/tutorials/how-to-use-manticor-to-find-smart-contract-bugs/) +- [Cum se folosește Manticore pentru a depista bug-uri în contractele inteligente](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) - [Cum se folosește Slither pentru a depista bug-uri în contractele inteligente](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) - [Cum să simulaţi contracte Solidity pentru testare](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) - [Cum să migraţi de la Testele Truffle la mediul de testare OpenZeppelin](https://docs.openzeppelin.com/test-environment/0.1/migrating-from-truffle) From 88dd82ecda077bde7c869732e84043023d2a5ed3 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 13:56:43 +0000 Subject: [PATCH 436/478] Fix broken anatomy link --- .../ro/developers/docs/smart-contracts/deploying/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ro/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/ro/developers/docs/smart-contracts/deploying/index.md index 3a1edf82da8..c6733389b46 100644 --- a/public/content/translations/ro/developers/docs/smart-contracts/deploying/index.md +++ b/public/content/translations/ro/developers/docs/smart-contracts/deploying/index.md @@ -10,7 +10,7 @@ Pentru a implementa un contract inteligent, trebuie doar să trimiteţi o tranza ## Condiții prealabile {#prerequisites} -Ar trebui să înțelegeţi [rețelele Ethereum](/developers/docs/networks/), [tranzacțiile](/developers/docs/transactions/) și [anatomia contractelor inteligente](/developers/docs/smart-contract/anatomy/) înainte de a implementa contracte inteligente. +Ar trebui să înțelegeţi [rețelele Ethereum](/developers/docs/networks/), [tranzacțiile](/developers/docs/transactions/) și [anatomia contractelor inteligente](/developers/docs/smart-contracts/anatomy/) înainte de a implementa contracte inteligente. Implementarea unui contract costă de asemenea ether (ETH), deci ar trebui să vă familiarizaţi cu [gazul și taxele](/developers/docs/gas/) pe Ethereum. From fcf74ab962ef9f526c1d874882ae1f7829c22584 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 13:58:33 +0000 Subject: [PATCH 437/478] Fix broken contributing link --- .../translations/de/contributing/design-principles/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/de/contributing/design-principles/index.md b/public/content/translations/de/contributing/design-principles/index.md index 44da51c3434..0a38ba485db 100644 --- a/public/content/translations/de/contributing/design-principles/index.md +++ b/public/content/translations/de/contributing/design-principles/index.md @@ -10,7 +10,7 @@ description: Die Grundsätze hinter den Entscheidungen über Design und Inhalt v 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](/beitrag/) leisten. +Machen Sie sich mit den Informationen vertraut, bevor Sie einen [Beitrag zu ethereum.org](/contributing/) leisten. ## Was sind Designgrundsätze? {#ways-to-contribute} From b768ee3c8e096aa84f1e7ec36f267b41019e7f9c Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:02:15 +0000 Subject: [PATCH 438/478] Fix broken blog link --- public/content/translations/es/foundation/index.md | 2 +- public/content/translations/pt-br/foundation/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/es/foundation/index.md b/public/content/translations/es/foundation/index.md index 4af3d7b22e9..6c26e088a0c 100644 --- a/public/content/translations/es/foundation/index.md +++ b/public/content/translations/es/foundation/index.md @@ -27,7 +27,7 @@ Desde 2014, Ethereum Foundation ha organizado Devcon, la conferencia anual para Puede acceder al contenido en vídeo de las presentaciones de la conferencia para cada año desde su inicio en el [sitio](https://archive.devcon.org/). -Obtenga más información en [devcon.org](https://devcon.org/), consulte el blog [Devcon](https://blog.ethereum.org/category/devcon/), o siga [@efdevcon](https://twitter.com/EFDevcon) para ver los últimos anuncios. +Obtenga más información en [devcon.org](https://devcon.org/), consulte el blog [Devcon](https://blog.ethereum.org/category/events/), o siga [@efdevcon](https://twitter.com/EFDevcon) para ver los últimos anuncios. ### Programa de becas {#fellowship-program} diff --git a/public/content/translations/pt-br/foundation/index.md b/public/content/translations/pt-br/foundation/index.md index f2c680d4287..2d62dcf90cf 100644 --- a/public/content/translations/pt-br/foundation/index.md +++ b/public/content/translations/pt-br/foundation/index.md @@ -27,7 +27,7 @@ Desde 2014, a Fundação Ethereum organiza a Devcon, uma conferência anual para Você pode acessar todo o conteúdo de vídeo das conferências de cada ano em [archive.devcon.org](https://archive.devcon.org/). -Saiba mais em [devcon.org](https://devcon.org/), confira o [Blog da Devcon](https://blog.ethereum.org/category/devcon/) ou siga [@efdevcon](https://twitter.com/EFDevcon) para ler os últimos comunicados. +Saiba mais em [devcon.org](https://devcon.org/), confira o [Blog da Devcon](https://blog.ethereum.org/category/events/) ou siga [@efdevcon](https://twitter.com/EFDevcon) para ler os últimos comunicados. ### Programa de Bolsas {#fellowship-program} From 4d9bbc6cc3d643ff62f61e10c73fab26f97847cf Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:05:38 +0000 Subject: [PATCH 439/478] Fix broken danksharding link --- public/content/roadmap/single-slot-finality/index.md | 2 +- .../translations/de/roadmap/single-slot-finality/index.md | 2 +- .../translations/es/roadmap/single-slot-finality/index.md | 2 +- .../translations/fa/roadmap/single-slot-finality/index.md | 2 +- .../translations/fr/roadmap/single-slot-finality/index.md | 2 +- .../translations/hu/roadmap/single-slot-finality/index.md | 2 +- .../translations/id/roadmap/single-slot-finality/index.md | 2 +- .../translations/it/roadmap/single-slot-finality/index.md | 2 +- .../translations/ja/roadmap/single-slot-finality/index.md | 2 +- .../translations/pt-br/roadmap/single-slot-finality/index.md | 2 +- .../translations/ru/roadmap/single-slot-finality/index.md | 2 +- .../translations/tr/roadmap/single-slot-finality/index.md | 2 +- .../translations/zh-tw/roadmap/single-slot-finality/index.md | 2 +- .../translations/zh/roadmap/single-slot-finality/index.md | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/content/roadmap/single-slot-finality/index.md b/public/content/roadmap/single-slot-finality/index.md index d680b3166d1..6ee3f5e62ed 100644 --- a/public/content/roadmap/single-slot-finality/index.md +++ b/public/content/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ The problem with scaling aggregation by growing the number of validators per sub ## Current progress {#current-progress} -SSF is in the research phase. It is not expected to ship for several years, likely after other substantial upgrades such as [Verkle trees](/roadmap/verkle-trees/) and [Danksharding](/roadmap/danksharding]). +SSF is in the research phase. It is not expected to ship for several years, likely after other substantial upgrades such as [Verkle trees](/roadmap/verkle-trees/) and [Danksharding](/roadmap/danksharding/). ## Further reading {#further-reading} 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 97b109ac4ae..b988eafe741 100644 --- a/public/content/translations/de/roadmap/single-slot-finality/index.md +++ b/public/content/translations/de/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ Das Problem mit dem Skalieren von Aggregationen mit einer Erhöhung der Validato ## Aktueller Fortschritt {#current-progress} -SSF ist in der Forschungsphase. Es ist nicht zu erwarten, dass es in den nächsten Jahren entsendet werden kann, wahrscheinlich wird dies erst nach anderen wesentlichen Verbesserungen wie [Verkle Bäumen](/roadmap/verkle-trees/) und [Danksharding](/roadmap/danksharding]) passieren können. +SSF ist in der Forschungsphase. Es ist nicht zu erwarten, dass es in den nächsten Jahren entsendet werden kann, wahrscheinlich wird dies erst nach anderen wesentlichen Verbesserungen wie [Verkle Bäumen](/roadmap/verkle-trees/) und [Danksharding](/roadmap/danksharding/) passieren können. ## Weiterführende Informationen {#further-reading} diff --git a/public/content/translations/es/roadmap/single-slot-finality/index.md b/public/content/translations/es/roadmap/single-slot-finality/index.md index 14aa0f70c0a..46691d6951e 100644 --- a/public/content/translations/es/roadmap/single-slot-finality/index.md +++ b/public/content/translations/es/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ La agregación de escalabilidad aumentando el número de validadores por subred ## Progreso actual {#current-progress} -SSF está en su fase de investigación. No se espera que se lance en varios años, probablemente después de mejoras sustanciales como [árboles de Verkle](/roadmap/verkle-trees/)y[Danksharding](/roadmap/danksharding]). +SSF está en su fase de investigación. No se espera que se lance en varios años, probablemente después de mejoras sustanciales como [árboles de Verkle](/roadmap/verkle-trees/)y[Danksharding](/roadmap/danksharding/). ## Más información {#further-reading} diff --git a/public/content/translations/fa/roadmap/single-slot-finality/index.md b/public/content/translations/fa/roadmap/single-slot-finality/index.md index 29e512c006e..9c4601bb66a 100644 --- a/public/content/translations/fa/roadmap/single-slot-finality/index.md +++ b/public/content/translations/fa/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ lang: fa ## پیشرفت فعلی {#current-progress} -SSF در مرحله تحقیقاتی است. انتظار نمی‌رود تا چندین سال آتی تحقق یابد، و احتمالاً باید ابتدا ارتقاهای اساسی دیگر مانند [درختان ورکل](/roadmap/verkle-trees/) و [Danksharding](/roadmap/danksharding]) را پشت سر گذاشت. +SSF در مرحله تحقیقاتی است. انتظار نمی‌رود تا چندین سال آتی تحقق یابد، و احتمالاً باید ابتدا ارتقاهای اساسی دیگر مانند [درختان ورکل](/roadmap/verkle-trees/) و [Danksharding](/roadmap/danksharding/) را پشت سر گذاشت. ## بیشتر بخوانید {#further-reading} diff --git a/public/content/translations/fr/roadmap/single-slot-finality/index.md b/public/content/translations/fr/roadmap/single-slot-finality/index.md index c4ee30c87fd..ae46bdd68fe 100644 --- a/public/content/translations/fr/roadmap/single-slot-finality/index.md +++ b/public/content/translations/fr/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ Le problème avec l'évolutivité de l'agrégation en augmentant le nombre de va ## Progrès actuels {#current-progress} -La Finalité à créneau unique (SSF) est en phase d'études. Celle-ci ne devrait pas être opérationnelle avant plusieurs années, probablement après que d'autres avancées substantielles aient été réalisées, telles que [l'Arbre de Verkle](/roadmap/verkle-trees/) et la [solution Danksharding](/roadmap/danksharding]). +La Finalité à créneau unique (SSF) est en phase d'études. Celle-ci ne devrait pas être opérationnelle avant plusieurs années, probablement après que d'autres avancées substantielles aient été réalisées, telles que [l'Arbre de Verkle](/roadmap/verkle-trees/) et la [solution Danksharding](/roadmap/danksharding/). ## Complément d'information {#further-reading} diff --git a/public/content/translations/hu/roadmap/single-slot-finality/index.md b/public/content/translations/hu/roadmap/single-slot-finality/index.md index 21e774a6bac..ca0f469eb8a 100644 --- a/public/content/translations/hu/roadmap/single-slot-finality/index.md +++ b/public/content/translations/hu/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ Ha az aggregáció skálázásához az alhálózatokban megnövelnék a validát ## Jelenlegi helyzet {#current-progress} -Az SSF még kutatási fázisban van. Nem várható, hogy a következő években bevezetésre kerül, inkább más lényeges fejlesztések után eszközölése várható, mint például a [Verkle-fák](/roadmap/verkle-trees/) és a [Danksharding](/roadmap/danksharding]). +Az SSF még kutatási fázisban van. Nem várható, hogy a következő években bevezetésre kerül, inkább más lényeges fejlesztések után eszközölése várható, mint például a [Verkle-fák](/roadmap/verkle-trees/) és a [Danksharding](/roadmap/danksharding/). ## További olvasnivaló {#further-reading} diff --git a/public/content/translations/id/roadmap/single-slot-finality/index.md b/public/content/translations/id/roadmap/single-slot-finality/index.md index efce220168a..a14515ebe6c 100644 --- a/public/content/translations/id/roadmap/single-slot-finality/index.md +++ b/public/content/translations/id/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ Masalah dengan penskalaan agregasi dengan meningkatkan jumlah validator per subn ## Kemajuan saat ini {#current-progress} -SSF sedang dalam tahap penelitian. Ini tidak diharapkan akan diluncurkan dalam beberapa tahun ke depan, kemungkinan setelah peningkatan besar lainnya seperti [Verkle trees](/roadmap/verkle-trees/) dan [Danksharding](/roadmap/danksharding]). +SSF sedang dalam tahap penelitian. Ini tidak diharapkan akan diluncurkan dalam beberapa tahun ke depan, kemungkinan setelah peningkatan besar lainnya seperti [Verkle trees](/roadmap/verkle-trees/) dan [Danksharding](/roadmap/danksharding/). ## Bacaan lebih lanjut {#further-reading} diff --git a/public/content/translations/it/roadmap/single-slot-finality/index.md b/public/content/translations/it/roadmap/single-slot-finality/index.md index 68c0b4d9cf8..e6e39ca8373 100644 --- a/public/content/translations/it/roadmap/single-slot-finality/index.md +++ b/public/content/translations/it/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ Il problema con il ridimensionamento dell'aggregazione, aumentando il numero di ## Stato attuale {#current-progress} -Lo SSF è nella fase di ricerca. Non dovrebbe essere distribuito per svariati anni, possibilmente dopo altri aggiornamenti sostanziali come gli [alberi di Verkle](/roadmap/verkle-trees/) e il [Danksharding](/roadmap/danksharding]). +Lo SSF è nella fase di ricerca. Non dovrebbe essere distribuito per svariati anni, possibilmente dopo altri aggiornamenti sostanziali come gli [alberi di Verkle](/roadmap/verkle-trees/) e il [Danksharding](/roadmap/danksharding/). ## Letture consigliate {#further-reading} diff --git a/public/content/translations/ja/roadmap/single-slot-finality/index.md b/public/content/translations/ja/roadmap/single-slot-finality/index.md index add46d2a795..789329f292f 100644 --- a/public/content/translations/ja/roadmap/single-slot-finality/index.md +++ b/public/content/translations/ja/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ lang: ja ## 現在の進行状況 {#current-progress} -SSFはまだ研究段階です。 [バークルツリー](/roadmap/verkle-trees/)や[ダンクシャーディング](/roadmap/danksharding])などの他の大きなアップグレードが完了してから、数年後になるかもしれません。 +SSFはまだ研究段階です。 [バークルツリー](/roadmap/verkle-trees/)や[ダンクシャーディング](/roadmap/danksharding/)などの他の大きなアップグレードが完了してから、数年後になるかもしれません。 ## 参考文献 {#further-reading} diff --git a/public/content/translations/pt-br/roadmap/single-slot-finality/index.md b/public/content/translations/pt-br/roadmap/single-slot-finality/index.md index da52f022deb..ff826aae6d8 100644 --- a/public/content/translations/pt-br/roadmap/single-slot-finality/index.md +++ b/public/content/translations/pt-br/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ O problema da escalabilidade da agregação por meio do aumento do número de va ## Progresso atual {#current-progress} -A SSF está em fase de pesquisa. A implementação não deverá ocorrer por vários anos, provavelmente apenas após outras melhorias consideráveis, como [Verkle Trees](/roadmap/verkle-trees/) e [Danksharding](/roadmap/danksharding]). +A SSF está em fase de pesquisa. A implementação não deverá ocorrer por vários anos, provavelmente apenas após outras melhorias consideráveis, como [Verkle Trees](/roadmap/verkle-trees/) e [Danksharding](/roadmap/danksharding/). ## Leitura adicional {#further-reading} diff --git a/public/content/translations/ru/roadmap/single-slot-finality/index.md b/public/content/translations/ru/roadmap/single-slot-finality/index.md index e75e217d630..62eac221a94 100644 --- a/public/content/translations/ru/roadmap/single-slot-finality/index.md +++ b/public/content/translations/ru/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ lang: ru ## Текущий прогресс {#current-progress} -SSF находится в фазе исследования. Это нововведение вряд ли выйдет в течение следующих лет. Вероятно, оно станет возможным только после других существенных обновлений, таких как [древа Веркла](/roadmap/verkle-trees/) и [данкшардинг](/roadmap/danksharding]). +SSF находится в фазе исследования. Это нововведение вряд ли выйдет в течение следующих лет. Вероятно, оно станет возможным только после других существенных обновлений, таких как [древа Веркла](/roadmap/verkle-trees/) и [данкшардинг](/roadmap/danksharding/). ## Дополнительная литература {#further-reading} diff --git a/public/content/translations/tr/roadmap/single-slot-finality/index.md b/public/content/translations/tr/roadmap/single-slot-finality/index.md index f80c80d4a0a..a7f356bb155 100644 --- a/public/content/translations/tr/roadmap/single-slot-finality/index.md +++ b/public/content/translations/tr/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ Bugünün taahhüt mekanizması kesinlik aracı (doğrulayıcıların 2/3'ünün ## Güncel ilerleme {#current-progress} -SSF araştırma aşamasında. Birkaç yıl daha gelmesi beklenmiyor, muhtemelen çok aşamalı yükseltmelerden, [(Verkle ağaçları](/roadmap/verkle-trees/) ve [Danksharding](/roadmap/danksharding]) gibi) sonra. +SSF araştırma aşamasında. Birkaç yıl daha gelmesi beklenmiyor, muhtemelen çok aşamalı yükseltmelerden, [(Verkle ağaçları](/roadmap/verkle-trees/) ve [Danksharding](/roadmap/danksharding/) gibi) sonra. ## Daha fazla bilgi {#further-reading} diff --git a/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md b/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md index 28aa188aef2..f31ea16ec42 100644 --- a/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md +++ b/public/content/translations/zh-tw/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ lang: zh-tw ## 目前進度 {#current-progress} -單一時隙最終確定性目前處於研究階段, 預計幾年內都不會上線,可能在[沃克爾尔樹](/roadmap/verkle-trees/)、[Danksharding](/roadmap/danksharding]) 等其他重大升級發佈之後發佈。 +單一時隙最終確定性目前處於研究階段, 預計幾年內都不會上線,可能在[沃克爾尔樹](/roadmap/verkle-trees/)、[Danksharding](/roadmap/danksharding/) 等其他重大升級發佈之後發佈。 ## 了解更多 {#further-reading} diff --git a/public/content/translations/zh/roadmap/single-slot-finality/index.md b/public/content/translations/zh/roadmap/single-slot-finality/index.md index 278a2e26245..21df677cc6b 100644 --- a/public/content/translations/zh/roadmap/single-slot-finality/index.md +++ b/public/content/translations/zh/roadmap/single-slot-finality/index.md @@ -58,7 +58,7 @@ lang: zh ## 当前进展 {#current-progress} -单时隙确定性正处于研究阶段。 预计它不会在几年内推出,可能会在 [Verkle 树](/roadmap/verkle-trees/)和 [Danksharding](/roadmap/danksharding]) 等其他重大升级之后推出。 +单时隙确定性正处于研究阶段。 预计它不会在几年内推出,可能会在 [Verkle 树](/roadmap/verkle-trees/)和 [Danksharding](/roadmap/danksharding/) 等其他重大升级之后推出。 ## 延伸阅读 {#further-reading} From 1109dcb027fff22c574c2cafdd292e68a99b079d Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:15:48 +0000 Subject: [PATCH 440/478] Fix broken eth glossary links --- src/intl/en/glossary.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/glossary.json b/src/intl/en/glossary.json index 5e2d2a9a58f..8a1a2dcd548 100644 --- a/src/intl/en/glossary.json +++ b/src/intl/en/glossary.json @@ -1,6 +1,6 @@ { "51%-attack-term": "51% attack", - "51%-attack-definition": "A type of attack on a decentralized network where a group gains control of the majority of nodes. This would allow them to defraud the blockchain by reversing transactions and double spending ether and other tokens.", + "51%-attack-definition": "A type of attack on a decentralized network where a group gains control of the majority of nodes. This would allow them to defraud the blockchain by reversing transactions and double spending ether and other tokens.", "account-term": "Account", "account-definition": "An object containing an address, balance, nonce, and optional storage and code. An account can be a contract account or an externally owned account (EOA).

      More on Ethereum accounts.", "address-term": "Address", From ffb7f3d14f3e8e9cb10d95cfa5ffb4b07a66cee0 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:18:02 +0000 Subject: [PATCH 441/478] Fix broken pbs link --- public/content/translations/de/roadmap/pbs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/de/roadmap/pbs/index.md b/public/content/translations/de/roadmap/pbs/index.md index b20468cf7f8..fb3cd3f670a 100644 --- a/public/content/translations/de/roadmap/pbs/index.md +++ b/public/content/translations/de/roadmap/pbs/index.md @@ -41,7 +41,7 @@ Danksharding ist der Weg, auf dem Ethereum zu >100000 Transaktionen pro Sekunde ## Aktueller Fortschritt {#current-progress} -PBS ist in einer fortgeschrittenen Phase der Forschung, aber es gibt immer noch ein paar wichtige Designfragen, die gelöst werden müssen, bevor es in Ethereum Clients implementiert werden kann. Es gibt noch keine endgültige Spezifikation. Das heißt, dass PBS wahrscheinlich noch mindestens ein Jahr oder länger entfernt ist. Informieren Sie sich über den neuesten [Forschungsstand](https://notes.ethereum.org/@vbuterin/pbs_zensur_resistance). +PBS ist in einer fortgeschrittenen Phase der Forschung, aber es gibt immer noch ein paar wichtige Designfragen, die gelöst werden müssen, bevor es in Ethereum Clients implementiert werden kann. Es gibt noch keine endgültige Spezifikation. Das heißt, dass PBS wahrscheinlich noch mindestens ein Jahr oder länger entfernt ist. Informieren Sie sich über den neuesten [Forschungsstand](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance). ## Weiterführende Informationen {#further-reading} From 54330f3edf608e1af29be6eebf50963221031073 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:21:52 +0000 Subject: [PATCH 442/478] Fix contributor profile link url --- .all-contributorsrc | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 630958bd14d..02bba0f1a80 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -8830,7 +8830,7 @@ "login": "joonspoon", "name": "June Clarke ", "avatar_url": "https://avatars.githubusercontent.com/u/302478?v=4", - "profile": "jointheleague.org", + "profile": "https://www.jointheleague.org/", "contributions": [ "doc" ] diff --git a/README.md b/README.md index afb6a0ce18a..3c00ee32503 100644 --- a/README.md +++ b/README.md @@ -1409,7 +1409,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Patoshi
      Patoshi

      📖 - June Clarke
      June Clarke

      📖 + June Clarke
      June Clarke

      📖 菲利
      菲利

      📖 DamitusThyYeetus123
      DamitusThyYeetus123

      📖 matusame
      matusame

      🌍 From 582a1e793e2cd6ad98da57c2ff59afc543cafb70 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:26:53 +0000 Subject: [PATCH 443/478] Fix broken merge links --- .../pow/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining-algorithms/dagger-hashamoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining-algorithms/dagger-hashamoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining-algorithms/dagger-hashamoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- public/content/translations/ro/developers/docs/mev/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- .../pow/mining-algorithms/dagger-hashamoto/index.md | 2 +- .../pow/mining/mining-algorithms/dagger-hashimoto/index.md | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/index.md b/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/index.md index a78c1ba9d22..4e800a2593a 100644 --- a/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: A detailed look at the Dagger-Hashimoto algorithm. lang: en --- -Dagger-Hashimoto was the original research implementation and specification for Ethereum's mining algorithm. Dagger-Hashimoto was superseded by [Ethash](#ethash). Mining was switched off completely at [The Merge](/updates/merge) on 15th September 2022. Since then, Ethereum has been secured using a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) mechanism instead. This page is for historical interest - the information here is no longer relevant for post-Merge Ethereum. +Dagger-Hashimoto was the original research implementation and specification for Ethereum's mining algorithm. Dagger-Hashimoto was superseded by [Ethash](#ethash). Mining was switched off completely at [The Merge](/roadmap/merge/) on 15th September 2022. Since then, Ethereum has been secured using a [proof-of-stake](/developers/docs/consensus-mechanisms/pos) mechanism instead. This page is for historical interest - the information here is no longer relevant for post-Merge Ethereum. ## Prerequisites {#prerequisites} diff --git a/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index d44cffea04e..9c9aa81d681 100644 --- a/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/es/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: Un examen detallado del algoritmo Dagger-Hashimoto. lang: es --- -Dagger Hashimoto fue la implementación y especificación de investigación original para el algoritmo de minería de Ethereum. Dagger Hashimoto fue reemplazado por [Ethash](#ethash). La minería se apagó por completo en [La fusión](/updates/merge) el 15 de septiembre de 2022. Desde entonces, Ethereum se ha asegurado a través de un mecanismo [de prueba de participación](/developers/docs/consensus-mechanisms/pos) en su lugar. Esta página es de interés histórico: la información que contiene ya no es relevante para Ethereum después de La fusión. +Dagger Hashimoto fue la implementación y especificación de investigación original para el algoritmo de minería de Ethereum. Dagger Hashimoto fue reemplazado por [Ethash](#ethash). La minería se apagó por completo en [La fusión](/roadmap/merge/) el 15 de septiembre de 2022. Desde entonces, Ethereum se ha asegurado a través de un mecanismo [de prueba de participación](/developers/docs/consensus-mechanisms/pos) en su lugar. Esta página es de interés histórico: la información que contiene ya no es relevante para Ethereum después de La fusión. ## Pre-requisitos: {#prerequisites} diff --git a/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 73b6e39b976..49a08c7a3b3 100644 --- a/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/fr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: Un regard détaillé sur l'algorithme Dagger-Hashimoto. lang: fr --- -Dagger-Hashimoto représentait l'implémentation et la spécification originales de recherche pour l'algorithme de minage d'Ethereum. Dagger-Hashimoto a été remplacé par [Ethash](#ethash). Le minage a été complètement arrêté avec [La Fusion](/updates/merge) du 15 septembre 2022. Depuis lors, Ethereum a été sécurisé en utilisant à la place un mécanisme de [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos). Cette page a un intérêt historique - l'information fournie n'est plus pertinente depuis La Fusion Ethereum. +Dagger-Hashimoto représentait l'implémentation et la spécification originales de recherche pour l'algorithme de minage d'Ethereum. Dagger-Hashimoto a été remplacé par [Ethash](#ethash). Le minage a été complètement arrêté avec [La Fusion](/roadmap/merge/) du 15 septembre 2022. Depuis lors, Ethereum a été sécurisé en utilisant à la place un mécanisme de [preuve d'enjeu](/developers/docs/consensus-mechanisms/pos). Cette page a un intérêt historique - l'information fournie n'est plus pertinente depuis La Fusion Ethereum. ## Prérequis {#prerequisites} diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 90bd1a8137d..fb45ba79cee 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: A Dagger-Hashimoto algoritmus részletes áttekintése. lang: hu --- -A Dagger-Hashimoto volt az Ethereum bányászati algoritmusának eredeti fejlesztési implementációja és specifikációja. A Dagger-Hashimoto algoritmust az [Ethash](#ethash) váltotta le. A bányászatot teljesen kikapcsolták az [egyesítés (Merge)](/updates/merge) frissítés életbe lépésekor, 2022. szeptember 15-én. Azóta az Ethereumot a [proof-of-stake (letéti igazolás)](/developers/docs/consensus-mechanisms/pos) mechanizmusa biztosítja. Ez az oldal elavult témákat tartalmaz, amelyek többé már nem relevánsak az egyesítés (Merge) utáni Ethereummal kapcsolatban. +A Dagger-Hashimoto volt az Ethereum bányászati algoritmusának eredeti fejlesztési implementációja és specifikációja. A Dagger-Hashimoto algoritmust az [Ethash](#ethash) váltotta le. A bányászatot teljesen kikapcsolták az [egyesítés (Merge)](/roadmap/merge/) frissítés életbe lépésekor, 2022. szeptember 15-én. Azóta az Ethereumot a [proof-of-stake (letéti igazolás)](/developers/docs/consensus-mechanisms/pos) mechanizmusa biztosítja. Ez az oldal elavult témákat tartalmaz, amelyek többé már nem relevánsak az egyesítés (Merge) utáni Ethereummal kapcsolatban. ## Előfeltételek {#prerequisites} diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md index acf9c387f9c..50148d6c2f2 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md @@ -4,7 +4,7 @@ description: Uno sguardo dettagliato all'algoritmo di Dagger-Hashimoto. lang: it --- -Dagger-Hashimoto era l'implementazione e specifica di ricerca originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il mining sarà disattivato completamente dopo [La Fusione](/updates/merge), a partire dalla quale Ethereum sarà invece protetto usando un meccanismo di [proof-of-stake](/developers/docs/consensus-mechanisms/pos). +Dagger-Hashimoto era l'implementazione e specifica di ricerca originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il mining sarà disattivato completamente dopo [La Fusione](/roadmap/merge/), a partire dalla quale Ethereum sarà invece protetto usando un meccanismo di [proof-of-stake](/developers/docs/consensus-mechanisms/pos). ## Prerequisiti {#prerequisites} diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 04537f99e8d..855eeb4f2ab 100644 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: Uno sguardo dettagliato all'algoritmo di Dagger-Hashimoto. lang: it --- -Dagger-Hashimoto era l'implementazione e specifica di ricerca originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il Mining è stata disattivato completamente con[ il Merge](/updates/merge) il 15 settembre 2022. Da allora, Ethereum è stato assicurato utilizzando un meccanismo [proof-of-of-stake](/developers/docs/consensus-mechanisms/pos). Questa pagina è di interesse storico - le informazioni qui non sono più rilevanti per post-Merge Ethereum. +Dagger-Hashimoto era l'implementazione e specifica di ricerca originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il Mining è stata disattivato completamente con[ il Merge](/roadmap/merge/) il 15 settembre 2022. Da allora, Ethereum è stato assicurato utilizzando un meccanismo [proof-of-of-stake](/developers/docs/consensus-mechanisms/pos). Questa pagina è di interesse storico - le informazioni qui non sono più rilevanti per post-Merge Ethereum. ## Prerequisiti {#prerequisites} diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md index 9d2b83b8b13..f7b6f9e3fcc 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md @@ -4,7 +4,7 @@ description: ダガーハシモト・アルゴリズムの詳細 lang: ja --- -ダガーハシモト(Dagger-Hashimoto)は、イーサリアムのマイニングアルゴリズムの最初の研究実装と仕様でした。 その後、ダガーハシモトから[Ethash](#ethash)に置き換えられました。 マイニングは、2022 年 9 月 15 日の[マージ](/updates/merge)で完全に廃止されました。 それ以降、イーサリアムには [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)のメカニズムが使われています。 このページについては過去の流れを理解する目的でご覧ください。この情報は、マージ後のイーサリアムには該当しません。 +ダガーハシモト(Dagger-Hashimoto)は、イーサリアムのマイニングアルゴリズムの最初の研究実装と仕様でした。 その後、ダガーハシモトから[Ethash](#ethash)に置き換えられました。 マイニングは、2022 年 9 月 15 日の[マージ](/roadmap/merge/)で完全に廃止されました。 それ以降、イーサリアムには [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)のメカニズムが使われています。 このページについては過去の流れを理解する目的でご覧ください。この情報は、マージ後のイーサリアムには該当しません。 ## 前提知識 {#prerequisites} diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index e585a64b127..a92747b9e20 100644 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: ダガーハシモト・アルゴリズムの詳細 lang: ja --- -ダガーハシモト(Dagger-Hashimoto)は、イーサリアムのマイニングアルゴリズムの最初の研究実装と仕様でした。 その後、ダガーハシモトから[Ethash](#ethash)に置き換えられました。 マイニングは、2022 年 9 月 15 日の[マージ](/updates/merge)で完全に廃止されました。 それ以降、イーサリアムには [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)のメカニズムが使われています。 このページについては過去の流れを理解する目的でご覧ください。この情報は、マージ後のイーサリアムには該当しません。 +ダガーハシモト(Dagger-Hashimoto)は、イーサリアムのマイニングアルゴリズムの最初の研究実装と仕様でした。 その後、ダガーハシモトから[Ethash](#ethash)に置き換えられました。 マイニングは、2022 年 9 月 15 日の[マージ](/roadmap/merge/)で完全に廃止されました。 それ以降、イーサリアムには [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)のメカニズムが使われています。 このページについては過去の流れを理解する目的でご覧ください。この情報は、マージ後のイーサリアムには該当しません。 ## 前提知識 {#prerequisites} diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md index 3f5b0428f79..b59c19de477 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md @@ -4,7 +4,7 @@ description: O algoritmo Dagger-Hashimoto em detalhes lang: pt-br --- -Dagger-Hashimoto foi a implementação original de pesquisa e especificação para o algoritmo de mineração do Ethereum. Dagger-Hashimoto foi substituído por [Ethash](#ethash). A mineração foi completamente desligada na [Fusão](/updates/merge) no dia 15 de setembro de 2022. Desde então, o Ethereum foi protegido usando um mecanismo [prova de participação](/developers/docs/consensus-mechanisms/pos). Esta página é para fins históricos. As informações aqui não são mais relevantes para o Ethereum posterior à Fusão. +Dagger-Hashimoto foi a implementação original de pesquisa e especificação para o algoritmo de mineração do Ethereum. Dagger-Hashimoto foi substituído por [Ethash](#ethash). A mineração foi completamente desligada na [Fusão](/roadmap/merge/) no dia 15 de setembro de 2022. Desde então, o Ethereum foi protegido usando um mecanismo [prova de participação](/developers/docs/consensus-mechanisms/pos). Esta página é para fins históricos. As informações aqui não são mais relevantes para o Ethereum posterior à Fusão. ## Pré-Requisitos {#prerequisites} diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index c396ee0a381..39aabac4433 100644 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: O algoritmo Dagger-Hashimoto em detalhes lang: pt-br --- -Dagger-Hashimoto foi a implementação original de pesquisa e especificação para o algoritmo de mineração do Ethereum. Dagger-Hashimoto foi substituído por [Ethash](#ethash). A mineração foi completamente desligada na [Fusão](/updates/merge) no dia 15 de setembro de 2022. Desde então, o Ethereum foi protegido usando um mecanismo [prova de participação](/developers/docs/consensus-mechanisms/pos). Esta página é para fins históricos. As informações aqui não são mais relevantes para o Ethereum posterior à Fusão. +Dagger-Hashimoto foi a implementação original de pesquisa e especificação para o algoritmo de mineração do Ethereum. Dagger-Hashimoto foi substituído por [Ethash](#ethash). A mineração foi completamente desligada na [Fusão](/roadmap/merge/) no dia 15 de setembro de 2022. Desde então, o Ethereum foi protegido usando um mecanismo [prova de participação](/developers/docs/consensus-mechanisms/pos). Esta página é para fins históricos. As informações aqui não são mais relevantes para o Ethereum posterior à Fusão. ## Pré-Requisitos {#prerequisites} diff --git a/public/content/translations/ro/developers/docs/mev/index.md b/public/content/translations/ro/developers/docs/mev/index.md index 896b1f00315..2548fad0404 100644 --- a/public/content/translations/ro/developers/docs/mev/index.md +++ b/public/content/translations/ro/developers/docs/mev/index.md @@ -8,7 +8,7 @@ Maximal extractable value (MEV) refers to the maximum value that can be extracte ## Miner extractable value -This concept was first applied under the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and was initially referred to as "miner extractable value." Aceasta deoarece în dovada-muncii (PoW), miner-ii controlează includerea, excluderea și ordonarea tranzacțiilor. However, after the transition to proof-of-stake via [The Merge](/updates/merge) validators will be responsible for these roles, and mining will no longer be applicable. The value extraction methods here will still persist after this transition, and thus a name change was needed. To keep the same acronym for continuity while maintaining the same fundamental meaning, "maximal extractable value" is now used as a more inclusive replacement. +This concept was first applied under the context of [proof-of-work](/developers/docs/consensus-mechanisms/pow/), and was initially referred to as "miner extractable value." Aceasta deoarece în dovada-muncii (PoW), miner-ii controlează includerea, excluderea și ordonarea tranzacțiilor. However, after the transition to proof-of-stake via [The Merge](/roadmap/merge/) validators will be responsible for these roles, and mining will no longer be applicable. The value extraction methods here will still persist after this transition, and thus a name change was needed. To keep the same acronym for continuity while maintaining the same fundamental meaning, "maximal extractable value" is now used as a more inclusive replacement. ## Condiții prealabile {#prerequisites} diff --git a/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 19471096911..928262c63ce 100644 --- a/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/tr/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: Dagger-Hashimoto algoritmasına detaylı bir bakış. lang: tr --- -Dagger-Hashimoto, Ethereum'un madencilik algoritması için orijinal araştırma uygulaması ve şartnamesiydi. Dagger-Hashimoto'nun yerini [Ethash](#ethash) aldı. 15 Eylül 2022'de gerçekleşen [Birleşim'den](/updates/merge) sonra madencilik tamamen durdurulmuştur. O zamandan beri Ethereum [hisse ispatı](/developers/docs/consensus-mechanisms/pos) mekanizmasını kullanmaktadır. Bu sayfa sadece bilgilendirme içindir - burdaki bilgi Birleşim sonrası Ethereum için geçerli değildir. +Dagger-Hashimoto, Ethereum'un madencilik algoritması için orijinal araştırma uygulaması ve şartnamesiydi. Dagger-Hashimoto'nun yerini [Ethash](#ethash) aldı. 15 Eylül 2022'de gerçekleşen [Birleşim'den](/roadmap/merge/) sonra madencilik tamamen durdurulmuştur. O zamandan beri Ethereum [hisse ispatı](/developers/docs/consensus-mechanisms/pos) mekanizmasını kullanmaktadır. Bu sayfa sadece bilgilendirme içindir - burdaki bilgi Birleşim sonrası Ethereum için geçerli değildir. ## Ön koşullar {#prerequisites} diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md index 7b093f7b0fc..f7bd1947ec3 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md @@ -4,7 +4,7 @@ description: 详细了解 Dagger-Hashimoto 算法。 lang: zh --- -Dagger-Hashimoto 是以太坊挖矿算法的原始研究实现和规范。 但是,Dagger-Hashimoto 已被 [Ethash](#ethash) 取代。 在 2022 年 9 月 15 日实施的[合并](/updates/merge)后,挖矿完全关闭。 此后,以太坊采用[权益证明](/developers/docs/consensus-mechanisms/pos)机制保护安全。 本页面展示与历史有关的内容,其中的信息不再与合并后的以太坊相关。 +Dagger-Hashimoto 是以太坊挖矿算法的原始研究实现和规范。 但是,Dagger-Hashimoto 已被 [Ethash](#ethash) 取代。 在 2022 年 9 月 15 日实施的[合并](/roadmap/merge/)后,挖矿完全关闭。 此后,以太坊采用[权益证明](/developers/docs/consensus-mechanisms/pos)机制保护安全。 本页面展示与历史有关的内容,其中的信息不再与合并后的以太坊相关。 ## 前提条件 {#prerequisites} diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md index 20e1c3c511a..cfa5dba9130 100644 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md +++ b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -4,7 +4,7 @@ description: 详细了解 Dagger-Hashimoto 算法。 lang: zh --- -Dagger-Hashimoto 是以太坊挖矿算法的原始研究实现和规范。 但是,Dagger-Hashimoto 已被 [Ethash](#ethash) 取代。 在 2022 年 9 月 15 日实施的[合并](/updates/merge)后,挖矿完全关闭。 此后,以太坊采用[权益证明](/developers/docs/consensus-mechanisms/pos)机制保护安全。 本页面展示与历史有关的内容,其中的信息不再与合并后的以太坊相关。 +Dagger-Hashimoto 是以太坊挖矿算法的原始研究实现和规范。 但是,Dagger-Hashimoto 已被 [Ethash](#ethash) 取代。 在 2022 年 9 月 15 日实施的[合并](/roadmap/merge/)后,挖矿完全关闭。 此后,以太坊采用[权益证明](/developers/docs/consensus-mechanisms/pos)机制保护安全。 本页面展示与历史有关的内容,其中的信息不再与合并后的以太坊相关。 ## 前提条件 {#prerequisites} From d05938524c570c2ca09cffcafab1b8e53261fe74 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:28:44 +0000 Subject: [PATCH 444/478] Fix broken waffle tutorial link --- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/developers/tutorials/waffle-test-simple-smart-contract/index.md index 437cef8e80e..725b252c57a 100644 --- a/public/content/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ You've made your first big step towards testing smart contracts with Waffle! You - [Testing ERC20 with Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: Dynamic mocking and testing contract calls](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Waffle say hello world tutorial with hardhat and ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Waffle say hello world tutorial with hardhat and ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) diff --git a/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md index 8b03bddf19a..b503f867578 100644 --- a/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/es/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Si la prueba sale bien, nos garantizará que se ha revertido la transacción. Si - [Probar ERC20 con Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: Llamadas dinámicas de simulación y prueba de contratos](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Tutorial de Waffle "Hola, Mundo" con hardhat y ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Tutorial de Waffle "Hola, Mundo" con hardhat y ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) diff --git a/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md index dfec15096da..3a3beba4140 100644 --- a/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/fr/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Vous avez fait votre premier (grand) pas vers les tests des contrats intelligent - [Tester ERC20 avec Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle : Bouchonnage dynamique et tests de contrats](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Tutoriel pour "dire bonjour au monde" avec hardhat et ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Tutoriel pour "dire bonjour au monde" avec hardhat et ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) diff --git a/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md index 0b993380cec..c22edf45590 100644 --- a/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Hai compiuto il tuo primo grande passo verso il test dei contratti intelligenti - [Testare ERC-20 con Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: simulazioni dinamiche e test delle chiamate del contratto](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Tutorial Waffle Hello world con hardhat ed ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Tutorial Waffle Hello world con hardhat ed ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) diff --git a/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md index 1a3ade19e87..fbd8ef0174c 100644 --- a/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/pt-br/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Você acabou de dar seu primeiro grande passo para testar contratos inteligentes - [Testando ERC20 com Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: simulações dinâmicas e testando chamadas de contrato](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Waffle diga olá mundo tutorial com capacete de segurança e ethers](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Waffle diga olá mundo tutorial com capacete de segurança e ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) diff --git a/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md index ebd19cf0a36..f9347ba7288 100644 --- a/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Waffle ile akıllı sözleşmeleri test etmenin ilk büyük adımını tamamlad - [ERC20 sözleşmelerini Waffle ile test etme](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: Dinamik taklit ve sözleşme çağrılarını test etme](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) diff --git a/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md index 78c4e6e9e5f..ac2092232b1 100644 --- a/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ it("Reverts when Vei amount uneven", async () => { - [使用 Waffle 测试 ERC20](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle:动态模拟和测试合约调用](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Waffle 使用 hardhat 和 ethers 设置 hello world 的教程](/developers/tutorials/waffle-hello-world-with-buidler-tutorial/) +- [Waffle 使用 hardhat 和 ethers 设置 hello world 的教程](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) From 92375b7e286075941cb562968a9875ff78aaf7e9 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:32:56 +0000 Subject: [PATCH 445/478] Fix broken tutorial link --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/content/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 3a4362a8a3b..feba04ec3f6 100644 --- a/public/content/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -290,4 +290,4 @@ Source code for this tutorial can be found [here](https://github.com/EthWorks/Wa Tutorials you may also be interested in: -- [Testing smart contracts with Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Testing smart contracts with Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 5a02a57cd90..e02dbacd6dd 100644 --- a/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/es/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ El código fuente de este tutorial puedes econtrarlo [aquí](https://github.com/ Otros tutoriales que podrían interesarte: -- [Probar contratos inteligentes con Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Probar contratos inteligentes con Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 295af215f85..223212c98ed 100644 --- a/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/fr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Le code source de ce tutoriel est disponible [ici](https://github.com/EthWorks/W Voici d'autres tutoriels qui pourraient vous intéresser : -- [Tester des contrats intelligents avec Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Tester des contrats intelligents avec Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index d519a35b046..1cadc084ba2 100644 --- a/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Sumber kode untuk tutorial ini bisa ditemukan [di sini](https://github.com/EthWo Tutorial yang mungkin juga Anda minati: -- [Menguji kontrak pintar dengan Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Menguji kontrak pintar dengan Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 01b9867941b..9ebabc03766 100644 --- a/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Il codice sorgente di questo tutorial si può trovare [qui](https://github.com/E Altri tutorial che potrebbero interessarti: -- [Test di Smart Contract con Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Test di Smart Contract con Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/ja/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/ja/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index ed3239a7274..1d0e8432284 100644 --- a/public/content/translations/ja/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/ja/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Waffle のドキュメンテーションは、[こちら](https://ethereum-waffl さらに、以下のチュートリアルをおすすめします: -- [Waffle を使ってスマートコントラクトをテストする](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Waffle を使ってスマートコントラクトをテストする](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 01f72c61d62..9f979ee9a43 100644 --- a/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -294,4 +294,4 @@ Kod źródłowy dla tego samouczka można znaleźć [tutaj](https://github.com/E Samouczki mogą być interesujące: -- [Testowanie inteligentnych kontraktów z Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Testowanie inteligentnych kontraktów z Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 166750fb68b..4ef4f315eac 100644 --- a/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ O código fonte deste tutorial pode ser encontrado [aqui](https://github.com/Eth Você pode também estar interessado em: -- [Testando contratos inteligentes com Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Testando contratos inteligentes com Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/ro/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/ro/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 7dfe1274a9e..947d1d681bb 100644 --- a/public/content/translations/ro/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/ro/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Codul sursă pentru acest tutorial se află [aici](https://github.com/EthWorks/W Alte tutoriale care vă pot interesa: -- [Testarea contractelor inteligente cu Waffle](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Testarea contractelor inteligente cu Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 19899d962e8..62cdacbc4a4 100644 --- a/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Bu öğreticinin kaynak kodu [burada](https://github.com/EthWorks/Waffle/tree/ma Ayrıca ilginizi çekebilecek öğreticiler: -- [Waffle ile akıllı sözleşmeleri test etme](/developers/tutorials/testing-smart-contract-with-waffle/) +- [Waffle ile akıllı sözleşmeleri test etme](/developers/tutorials/waffle-test-simple-smart-contract//) diff --git a/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 4b4a658e11d..44519664b42 100644 --- a/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Waffle 的文档可在[此处](https://ethereum-waffle.readthedocs.io/)获得。 您可能还感兴趣的教程: -- [使用 Waffle 测试智能合约](/developers/tutorials/testing-smart-contract-with-waffle/) +- [使用 Waffle 测试智能合约](/developers/tutorials/waffle-test-simple-smart-contract//) From a0de1ffa22174644838bf60f2c02871f695ddbff Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:34:54 +0000 Subject: [PATCH 446/478] Fix broken governance link --- public/content/translations/tr/roadmap/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tr/roadmap/index.md b/public/content/translations/tr/roadmap/index.md index 8adfaf18576..cce125f28fb 100644 --- a/public/content/translations/tr/roadmap/index.md +++ b/public/content/translations/tr/roadmap/index.md @@ -61,7 +61,7 @@ Ethereum; ölçeklenebilirliğini, güvenliğini ya da sürdürülebilirliğini Yol haritası çoğunlukla, araştırmacı ve geliştirmecilerin yıllar süren çalışmasının ürünüdür çünkü protokol oldukça tekniktir, ancak motive olmuş kişiler katılabilir. Fikirler genellikle [ethresear.ch](https://ethresear.ch/), [Ethereum sihirbazları](https://ethereum-magicians.org/) gibi forumlarda veya Eth Ar&Ge discord sunucusunda tartışma başlıkları olarak ortaya atılır. Yeni keşfedilmiş sistem açıklarına karşı tepkiler, uygulama katmanında çalışan organizasyonlardan (merkeziyetsiz uygulama ve borsalar) öneriler ya da son kullanıcılar için bilinen ihtilaflar (ücretler veya işlem hızları gibi) olabilir. Bu fikirler olgunlaştığında [Ethereum İyileştirme Önerileri](https://eips.ethereum.org/) olarak önerilebilirler. Herhangi bir zamanda topluluk içinden fikir sunulması için bu, tümüyle halka açık biçimde yapılır. -[Ethereum yönetişimi hakkında daha fazlası](/yönetişim/) +[Ethereum yönetişimi hakkında daha fazlası](/governance/) From dc07c0a3ccc464a0d5131741d0d81c7525168579 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:37:46 +0000 Subject: [PATCH 447/478] Fix random figma link --- public/content/translations/id/roadmap/index.md | 2 +- public/content/translations/it/roadmap/index.md | 2 +- public/content/translations/ru/roadmap/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/content/translations/id/roadmap/index.md b/public/content/translations/id/roadmap/index.md index 77dc8a4a4ac..1d426ea829b 100644 --- a/public/content/translations/id/roadmap/index.md +++ b/public/content/translations/id/roadmap/index.md @@ -59,7 +59,7 @@ Ethereum ditingkatkan secara rutin untuk meningkatkan skalabilitas, keamanan, at -Peta jalan ini sebagian besar adalah hasil kerja bertahun-tahun dari para peneliti dan pengembang - karena protokol ini sangat teknis - tetapi setiap orang yang berminat boleh ikut serta. Ide-ide biasanya dimulai dari diskusi di forum seperti [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) atau server discord Eth R&D. Ide-ide tersebut mungkin tanggapan terhadap kerentanan baru yang ditemukan, saran dari organisasi yang bekerja di lapisan aplikasi (seperti dapps dan bursa pertukaran) atau dari perselisihan yang diketahui oleh pengguna akhir (seperti biaya atau kecepatan transaksi). Ketika sudah matang, ide-ide ini dapat diusulkan sebagai [Proposal Peningkatan Ethereum](https://eips.ethereum.org/). Semua ini dilakukan di ruang publik sehingga setiap anggota komunitas dapat memberi masukan kapan saja. +Peta jalan ini sebagian besar adalah hasil kerja bertahun-tahun dari para peneliti dan pengembang - karena protokol ini sangat teknis - tetapi setiap orang yang berminat boleh ikut serta. Ide-ide biasanya dimulai dari diskusi di forum seperti [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://ethereum-magicians.org/) atau server discord Eth R&D. Ide-ide tersebut mungkin tanggapan terhadap kerentanan baru yang ditemukan, saran dari organisasi yang bekerja di lapisan aplikasi (seperti dapps dan bursa pertukaran) atau dari perselisihan yang diketahui oleh pengguna akhir (seperti biaya atau kecepatan transaksi). Ketika sudah matang, ide-ide ini dapat diusulkan sebagai [Proposal Peningkatan Ethereum](https://eips.ethereum.org/). Semua ini dilakukan di ruang publik sehingga setiap anggota komunitas dapat memberi masukan kapan saja. [Selengkapnya tentang tata kelola Ethereum](/governance/) diff --git a/public/content/translations/it/roadmap/index.md b/public/content/translations/it/roadmap/index.md index 86cdd166d0b..8d944589f1e 100644 --- a/public/content/translations/it/roadmap/index.md +++ b/public/content/translations/it/roadmap/index.md @@ -59,7 +59,7 @@ Ethereum riceve aggiornamenti regolari che migliorano la sua scalabilità, sicur -La tabella di marcia è principalmente il risultato di anni di lavoro da parte di ricercatori e sviluppatori - perché il protocollo è molto tecnico - ma qualsiasi persona motivata può partecipare. Le idee di solito iniziano come discussioni su un forum come [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) o il server Eth R&D discord. Possono essere risposte a nuove vulnerabilità che vengono scoperte, suggerimenti da parte di organizzazioni che lavorano nel livello dell'applicazione (come dapps e borse) o da attriti conosciuti per gli utenti finali (come costi o velocità di transazione). Quando queste idee maturano, possono essere proposte come [Ethereum Improvement Proposals](https://eips.ethereum.org/). Tutto questo viene fatto in pubblico in modo che chiunque della comunità possa esprimere la propria opinione in qualsiasi momento. +La tabella di marcia è principalmente il risultato di anni di lavoro da parte di ricercatori e sviluppatori - perché il protocollo è molto tecnico - ma qualsiasi persona motivata può partecipare. Le idee di solito iniziano come discussioni su un forum come [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://ethereum-magicians.org/) o il server Eth R&D discord. Possono essere risposte a nuove vulnerabilità che vengono scoperte, suggerimenti da parte di organizzazioni che lavorano nel livello dell'applicazione (come dapps e borse) o da attriti conosciuti per gli utenti finali (come costi o velocità di transazione). Quando queste idee maturano, possono essere proposte come [Ethereum Improvement Proposals](https://eips.ethereum.org/). Tutto questo viene fatto in pubblico in modo che chiunque della comunità possa esprimere la propria opinione in qualsiasi momento. [Ulteriori informazioni sulla governance di Ethereum](/governance/) diff --git a/public/content/translations/ru/roadmap/index.md b/public/content/translations/ru/roadmap/index.md index 17db45aa71e..f15e7d887f5 100644 --- a/public/content/translations/ru/roadmap/index.md +++ b/public/content/translations/ru/roadmap/index.md @@ -59,7 +59,7 @@ Ethereum обновляется регулярно, что приводит к -В большинстве своем, дорожная карта является результатом многолетней работы исследователей и разработчиков, поскольку этот протокол очень зависит от технических моментов, но в целом, внести свой вклад может любой мотивированный человек. Жизненный цикл идей обычно начинается с дискуссии на одном из форумов, таких как [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://www.figma.com/exit?url=https%3A%2F%2Fethereum-magicians.org%2F) или на Discord сервере Eth R&D. Они могут появляться как ответ на выявленные уязвимые места, или как предложение от одной из компаний, работающей на уровне приложений (таких как децентрализованные приложения или биржи), или в результате понимания ограничений для конечных пользователей (таких как стоимость или скорость транзакций). Когда идеи готовы, они могут быть формализованы в виде Предложений по улучшению Ethereum (EIP). Все это происходит публично, чтобы каждый представитель сообщества мог в любой момент высказать свое мнение. +В большинстве своем, дорожная карта является результатом многолетней работы исследователей и разработчиков, поскольку этот протокол очень зависит от технических моментов, но в целом, внести свой вклад может любой мотивированный человек. Жизненный цикл идей обычно начинается с дискуссии на одном из форумов, таких как [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://ethereum-magicians.org/) или на Discord сервере Eth R&D. Они могут появляться как ответ на выявленные уязвимые места, или как предложение от одной из компаний, работающей на уровне приложений (таких как децентрализованные приложения или биржи), или в результате понимания ограничений для конечных пользователей (таких как стоимость или скорость транзакций). Когда идеи готовы, они могут быть формализованы в виде Предложений по улучшению Ethereum (EIP). Все это происходит публично, чтобы каждый представитель сообщества мог в любой момент высказать свое мнение. [Подробнее об управлении Ethereum](/governance/) From 9e30b36596c45c88d15143d446ce28fa203419fa Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:44:15 +0000 Subject: [PATCH 448/478] Fix broken staking links --- .../de/developers/docs/consensus-mechanisms/pow/mining/index.md | 2 +- .../docs/nodes-and-clients/node-architecture/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 ac42edb3de6..6158aad9bcb 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 @@ -16,7 +16,7 @@ Mining ist der Prozess zur Erstellung eines Blocks aus Transaktionen, der zur Et Ethereum verwendet derzeit, genau wie Bitcoin, einen [Proof-of-Work (PoW)](/developers/docs/consensus-mechanisms/pow/)-Konsensmechanismus. Mining ist das Lebenselixier des Proof-of-Work. Ethereum-Miner (Computer, die eine Software ausführen) nutzen ihre Zeit und Rechenleistung zur Verarbeitung von Transaktionen und Erstellung von Blöcken. - Proof-of-Stake wird im Laufe des nächsten Jahres Mining und Proof-of-Work ersetzen. Du kannst schon heute mit dem Staking deiner ETH beginnen. Mehr zum Staking + Proof-of-Stake wird im Laufe des nächsten Jahres Mining und Proof-of-Work ersetzen. Du kannst schon heute mit dem Staking deiner ETH beginnen. Mehr zum Staking ## Warum gibt es Miner? {#why-do-miners-exist} 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 e532eb3ee45..1e4822e399f 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 @@ -39,7 +39,7 @@ Der Konsensclient nimmt nicht an Attestierungen oder dem Vorschlagen von Blöcke 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. -[Mehr über Staking](/abstecken/). +[Mehr über Staking](/staking/). ## Vergleich der Knotenkomponenten {#node-comparison} From ad61711494d146b8728ba7299317e4997cc50dbc Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:48:29 +0000 Subject: [PATCH 449/478] Fix broken staking links --- public/content/translations/ja/roadmap/beacon-chain/index.md | 2 +- public/content/translations/ja/roadmap/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/translations/ja/roadmap/beacon-chain/index.md b/public/content/translations/ja/roadmap/beacon-chain/index.md index 7efc00bf1d6..6689d9afa70 100644 --- a/public/content/translations/ja/roadmap/beacon-chain/index.md +++ b/public/content/translations/ja/roadmap/beacon-chain/index.md @@ -19,7 +19,7 @@ summaryPoint3: ビーコンチェーンは、コンセンサスロジックと ## ビーコンチェーンとは {#what-does-the-beacon-chain-do} -ビーコンチェーンは、イーサリアム [ステーカー](/staking/)のネットワークを実行、調整していたアカウントのレジャーに与えられた名前です。後に、このイーサリアム[ステーカー](/saking/)が実際のイーサリアムブロックの検証を開始しました。 ただし、ビーコンチェーンでは、トランザクションの処理やスマートコントラクトとのやりとりは行いません。代わりに、実行レイヤーがこれらの処理を行います ビーコンチェーンでは、ブロックとアテステーションの処理、フォーク選択アルゴリズムの実行、報酬とペナルティの管理などを行います。 詳細は、[ノードアーキテクチャのページ](/developers/docs/nodes-and-clients/node-architecture/#node-comparison)をご覧ください。 +ビーコンチェーンは、イーサリアム [ステーカー](/staking/)のネットワークを実行、調整していたアカウントのレジャーに与えられた名前です。後に、このイーサリアム[ステーカー](/staking/)が実際のイーサリアムブロックの検証を開始しました。 ただし、ビーコンチェーンでは、トランザクションの処理やスマートコントラクトとのやりとりは行いません。代わりに、実行レイヤーがこれらの処理を行います ビーコンチェーンでは、ブロックとアテステーションの処理、フォーク選択アルゴリズムの実行、報酬とペナルティの管理などを行います。 詳細は、[ノードアーキテクチャのページ](/developers/docs/nodes-and-clients/node-architecture/#node-comparison)をご覧ください。 ## ビーコンチェーンの影響 {#beacon-chain-features} diff --git a/public/content/translations/ja/roadmap/index.md b/public/content/translations/ja/roadmap/index.md index 1f8ac57c5bd..7e4e43fc6a1 100644 --- a/public/content/translations/ja/roadmap/index.md +++ b/public/content/translations/ja/roadmap/index.md @@ -108,7 +108,7 @@ buttons: ## 特定の技術アップグレードについての情報 {#looking-for-specific-technical-upgrades} - [ダンクシャーディング](/roadmap/danksharding) - ダンクシャーディングは、イーサリアムのブロックに「ブロブ」と呼ばれるデータを追加することで、ユーザーのレイヤー2ロールアップ使用料を大幅に削減します。 -- [ステーキングの引き出し](/saking/withdrawals) - 上海/カペラのアップグレードにより、イーサリアム上のステーキングしたETHを引き出せるようになりました。また、ステーキングしたETHのロックを解除できるようになりました。 +- [ステーキングの引き出し](/staking/withdrawals) - 上海/カペラのアップグレードにより、イーサリアム上のステーキングしたETHを引き出せるようになりました。また、ステーキングしたETHのロックを解除できるようになりました。 - [シングルスロット・ファイナリティ](/roadmap/single-slot-finality) - 15分待たずに、同一のスロット内でブロックが提案され、ファイナライズが可能になります。 これにより、アプリにとっては利便性が向上し、攻撃がはるかに困難になります。 - [プロポーザー/ビルダーセパレーション](/roadmap/pbs) - ブロックを構築するタスクとブロックを提案するタスクを別々のバリデータに分割することで、イーサリアムにおけるコンセンサス合意プロセスを、より効率的で公平にし、検閲耐性のあるものにします。 - [シークレットリーダー選出](/roadmap/secret-leader-election) - 高度な暗号化を使い、現在のブロック提案者のアイデンティティが公開されないようにします。これにより、特定の攻撃タイプから保護できます。 From 99e3206cb8cd0a5eac34fc512125881025ab68fa Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 14:51:03 +0000 Subject: [PATCH 450/478] Fix broken staking links --- public/content/translations/ar/staking/withdrawals/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ar/staking/withdrawals/index.md b/public/content/translations/ar/staking/withdrawals/index.md index b4f652d16b8..18333888f4d 100644 --- a/public/content/translations/ar/staking/withdrawals/index.md +++ b/public/content/translations/ar/staking/withdrawals/index.md @@ -154,7 +154,7 @@ eventName="read more"> إذا كنت جزءًا من تجمع الرهان أو تحمل رموز المراهنة المميزة، يجب عليك الرجوع إلى موفر الخدمة الخاص بك للحصول على مزيد من التفاصيل حول كيفية التعامل مع عمليات سحب المراهنة، حيث تعمل كل خدمة بشكل مختلف. -بشكل عام، يجب أن يتمتع المستخدمون بالحرية في استعادة عملة ETH الأساسية الخاصة بهم التي تمت مراهنتها، أو تغيير موفر خدمة المراهنة الذي يستخدمونه. إذا أصبح عدد مجمع معين كبيرًا جدًّا، فيمكن الخروج من الأموال واستردادها وإعادة رهنها مع موفر خدمة أصغر. أو، إذا جمعت ما يكفي من عملة ETH، فيمكنك المراهنة من المنزل. +بشكل عام، يجب أن يتمتع المستخدمون بالحرية في استعادة عملة ETH الأساسية الخاصة بهم التي تمت مراهنتها، أو تغيير موفر خدمة المراهنة الذي يستخدمونه. إذا أصبح عدد مجمع معين كبيرًا جدًّا، فيمكن الخروج من الأموال واستردادها وإعادة رهنها مع موفر خدمة أصغر. أو، إذا جمعت ما يكفي من عملة ETH، فيمكنك المراهنة من المنزل. From 7d4104bcf99df45f0ee36f1346c0b7257e0be6ac Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 15:01:01 +0000 Subject: [PATCH 451/478] Fix misc broken links --- public/_redirects | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- .../content/translations/ar/roadmap/beacon-chain/index.md | 2 +- public/content/translations/es/roadmap/index.md | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- public/content/translations/hi/roadmap/merge/index.md | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- public/content/translations/ja/history/index.md | 2 +- public/content/translations/ml/roadmap/merge/index.md | 2 +- public/content/translations/nl/roadmap/merge/index.md | 6 +++--- public/content/translations/pl/developers/docs/index.md | 2 +- .../pl/developers/docs/smart-contracts/languages/index.md | 2 +- public/content/translations/pl/enterprise/index.md | 6 +++--- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- public/content/translations/pt-br/history/index.md | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- public/content/translations/ro/enterprise/index.md | 4 ++-- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- .../developers/tutorials/uniswap-v2-annotated-code/index.md | 2 +- .../translations/zh/guides/how-to-id-scam-tokens/index.md | 2 +- src/intl/ig/page-index.json | 2 +- 23 files changed, 28 insertions(+), 28 deletions(-) diff --git a/public/_redirects b/public/_redirects index 9231fdf048c..9d12486501d 100644 --- a/public/_redirects +++ b/public/_redirects @@ -148,7 +148,7 @@ /*/eth2 /:splat/upgrades/ 301! -/*/developers/docs/layer-2-scaling /:splat/developers/docs/scaling 301! +/*/developers/docs/scaling /:splat/developers/docs/scaling 301! /*/developers/docs/scaling/layer-2-rollups /:splat/developers/docs/scaling 301! diff --git a/public/content/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/developers/tutorials/uniswap-v2-annotated-code/index.md index f1f3561de0a..da52442866e 100644 --- a/public/content/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -755,7 +755,7 @@ This is the main function of the factory, to create a pair exchange between two (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -We want the address of the new exchange to be deterministic, so it can be calculated in advance off chain (this can be useful for [layer 2 transactions](/developers/docs/layer-2-scaling/)). +We want the address of the new exchange to be deterministic, so it can be calculated in advance off chain (this can be useful for [layer 2 transactions](/developers/docs/scaling/)). To do this we need to have a consistent order of the token addresses, regardless of the order in which we have received them, so we sort them here. ```solidity diff --git a/public/content/translations/ar/roadmap/beacon-chain/index.md b/public/content/translations/ar/roadmap/beacon-chain/index.md index 3e2217db13e..a7bad82b3c3 100644 --- a/public/content/translations/ar/roadmap/beacon-chain/index.md +++ b/public/content/translations/ar/roadmap/beacon-chain/index.md @@ -72,5 +72,5 @@ summaryPoint3: قدمت سلسلة المنارة منطق إجماع الآرا ## قراءة إضافية -- [المزيد عن ترقيات إثيريوم في المستقبل](/roapmap/vision) +- [المزيد عن ترقيات إثيريوم في المستقبل](/roadmap/vision/) - [المزيد عن إثبات الحصة](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/es/roadmap/index.md b/public/content/translations/es/roadmap/index.md index db36ca332d1..10484a27d80 100644 --- a/public/content/translations/es/roadmap/index.md +++ b/public/content/translations/es/roadmap/index.md @@ -61,7 +61,7 @@ Ethereum se actualiza periódciamente para mejorar su escalabilidad, seguridad o La hoja de ruta es principalmente el resultado de años de trabajo de investigadores y desarrolladores, dado que el protocolo es muy técnico. No obstante cualquier persona motivada puede participar. Las ideas usualmente empiezan como discusiones en un foro del estilo [ethresear.ch](https://ethresear.ch/), [Ethereum magicians](https://ethereum-magicians.org/) o el servidor de Discord de Eth. Pueden haber respuestas a nuevos puntos flacos que se descubren, sugerencias de organizaciones que trabajan en la capa de aplicaciones (como DApps e intercambios) o disuasiones conocidas para los usuarios finales (como costes o velocidades de transacción). Cuando estas ideas maduren, se pueden proponer como [propuestas de mejora de Ethereum o EIP] (https://eips.ethereum.org/). Todo esto se hace en público para que cualquier persona de la comunidad pueda intervenir en cualquier momento. -[Más información sobre la gobernanza de Ethereum](/gobernanza/) +[Más información sobre la gobernanza de Ethereum](/governance/) diff --git a/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md index 932255920d8..310de316a09 100644 --- a/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/fr/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ C'est la fonction principale de l'usine : créer un échange de paires entre deu (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -Nous souhaitons que l'adresse du nouvel échange soit déterminable de sorte qu'elle puisse être calculée à l'avance hors chaîne (cela peut être utile pour [les transactions de couche 2](/developers/docs/layer-2-scaling/)). Pour cela, nous devons avoir les adresses de jetons dans un ordre cohérent indépendant de l'ordre dans lequel nous les avons reçus. Aussi les trions-nous ici. +Nous souhaitons que l'adresse du nouvel échange soit déterminable de sorte qu'elle puisse être calculée à l'avance hors chaîne (cela peut être utile pour [les transactions de couche 2](/developers/docs/scaling/)). Pour cela, nous devons avoir les adresses de jetons dans un ordre cohérent indépendant de l'ordre dans lequel nous les avons reçus. Aussi les trions-nous ici. ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); diff --git a/public/content/translations/hi/roadmap/merge/index.md b/public/content/translations/hi/roadmap/merge/index.md index 725361016e7..098a40bba45 100644 --- a/public/content/translations/hi/roadmap/merge/index.md +++ b/public/content/translations/hi/roadmap/merge/index.md @@ -135,7 +135,7 @@ title="ग़लत धारणा: "मर्ज गैस शुल् contentPreview="False. The Merge was a change of consensus mechanism, not an expansion of network capacity, and was never intended to lower gas fees."> गैस शुल्क नेटवर्क की क्षमता के सापेक्ष नेटवर्क की माँग का एक उत्पाद है। मर्ज ने काम का सबूत के उपयोग को हटा दिया, सहमति के लिए हिस्सेदारी का सबूत में बदल गया, लेकिन नेटवर्क क्षमता या थ्रूपुट को सीधे प्रभावित करने वाले किसी भी पैरामीटर को महत्वपूर्ण रूप से नहीं बदला। -[रोलअप-केंद्रित रोडमैप](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) के साथ, [परत 2](/परत-2/) पर उपयोगकर्ता गतिविधि को बढ़ाने पर ध्यान केंद्रित किया जा रहा है, परत 1 मेननेट को एक सुरक्षित विकेंद्रीत सेटमलमेंट परत के रूप में सक्षम करते हुए रोलअप डेटा स्टोरेज के लिए अनुकूलित किया गया है, ताकि रोलअप लेनदेन को तेज़ी से किफ़ायती बनाया जा सके। इसे समझने के लिए हिस्सेदारी के सबूत में ट्रांज़िशन की महत्वपूर्ण भूमिका होती है। [गैस और फीस के बारे में और जानकारी।](/डेवलपर/दस्तावेज़/गैस/) +[रोलअप-केंद्रित रोडमैप](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) के साथ, [परत 2](/layer-2/) पर उपयोगकर्ता गतिविधि को बढ़ाने पर ध्यान केंद्रित किया जा रहा है, परत 1 मेननेट को एक सुरक्षित विकेंद्रीत सेटमलमेंट परत के रूप में सक्षम करते हुए रोलअप डेटा स्टोरेज के लिए अनुकूलित किया गया है, ताकि रोलअप लेनदेन को तेज़ी से किफ़ायती बनाया जा सके। इसे समझने के लिए हिस्सेदारी के सबूत में ट्रांज़िशन की महत्वपूर्ण भूमिका होती है। [गैस और फीस के बारे में और जानकारी।](/डेवलपर/दस्तावेज़/गैस/) diff --git a/public/content/translations/ml/roadmap/merge/index.md b/public/content/translations/ml/roadmap/merge/index.md index af4bd58d1ad..9eed0dffac6 100644 --- a/public/content/translations/ml/roadmap/merge/index.md +++ b/public/content/translations/ml/roadmap/merge/index.md @@ -135,7 +135,7 @@ title="തെറ്റിദ്ധാരണ: "ഗ്യാസ് ഫീസ contentPreview="False. The Merge was a change of consensus mechanism, not an expansion of network capacity, and was never intended to lower gas fees."> നെറ്റ്‌വർക്കിന്റെ ശേഷിയുമായി ബന്ധപ്പെട്ട നെറ്റ്‌വർക്ക് ഡിമാൻഡിന്റെ ഫലമാണ് ഗ്യാസ് ഫീസ്. പൊതു രീതിക്കുള്ള പ്രൂഫ് ഓഫ് സ്റ്റേക്കിലേക്ക് മാറിക്കൊണ്ട് ലയനം പ്രൂഫ് ഓഫ് വർക്കിന്റെ ഉപയോഗം ഒഴിവാക്കി, എന്നാൽ നെറ്റ്‌വർക്ക് ശേഷിയെയോ ത്രൂപുട്ടിനെയോ നേരിട്ട് സ്വാധീനിക്കുന്ന പാരാമീറ്ററുളെയൊന്നും കാര്യമായി മാറ്റിയില്ല. -ഒരു [റോളപ്പ്-കേന്ദ്രീകൃത റോഡ്മാപ്പ്](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) ഉപയോഗിച്ച്, [വരി-2](/വരി-2/)-ൽ ഉപയോക്തൃ ആക്റ്റിവിറ്റി അളക്കുന്നതിലാണ് ശ്രമങ്ങൾ കേന്ദ്രീകരിക്കുന്നത്, അതേസമയം റോളപ്പ് ഇടപാടുകൾ വളരെ ചെലവ് കുറഞ്ഞതാക്കാൻ സഹായിക്കുന്നതിന് റോളപ്പ് ഡാറ്റ സംഭരണത്തിനായി ഒപ്റ്റിമൈസ് ചെയ്‌ത ഒരു സുരക്ഷിത വികേന്ദ്രീകൃത സെറ്റിൽമെന്റ് വരിയായി വരി 1 മെയിൻനെറ്റ് പ്രാപ്‌തമാക്കുന്നു. ഇത് പൂർത്തീകരിക്കുന്നതിനുള്ള ഒരു നിർണ്ണായക സൂചനയാണ് പ്രൂഫ് ഓഫ് സ്റ്റേക്കിലേക്കുള്ള മാറ്റം. [ഗ്യാസിനെയും ഫീസിനെയും കുറിച്ച് കൂടുതൽ.](/developers/docs/gas/) +ഒരു [റോളപ്പ്-കേന്ദ്രീകൃത റോഡ്മാപ്പ്](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) ഉപയോഗിച്ച്, [വരി-2](/layer-2/)-ൽ ഉപയോക്തൃ ആക്റ്റിവിറ്റി അളക്കുന്നതിലാണ് ശ്രമങ്ങൾ കേന്ദ്രീകരിക്കുന്നത്, അതേസമയം റോളപ്പ് ഇടപാടുകൾ വളരെ ചെലവ് കുറഞ്ഞതാക്കാൻ സഹായിക്കുന്നതിന് റോളപ്പ് ഡാറ്റ സംഭരണത്തിനായി ഒപ്റ്റിമൈസ് ചെയ്‌ത ഒരു സുരക്ഷിത വികേന്ദ്രീകൃത സെറ്റിൽമെന്റ് വരിയായി വരി 1 മെയിൻനെറ്റ് പ്രാപ്‌തമാക്കുന്നു. ഇത് പൂർത്തീകരിക്കുന്നതിനുള്ള ഒരു നിർണ്ണായക സൂചനയാണ് പ്രൂഫ് ഓഫ് സ്റ്റേക്കിലേക്കുള്ള മാറ്റം. [ഗ്യാസിനെയും ഫീസിനെയും കുറിച്ച് കൂടുതൽ.](/developers/docs/gas/) De Baken Ketting diff --git a/public/content/translations/pl/developers/docs/index.md b/public/content/translations/pl/developers/docs/index.md index 9dbce0359ea..6f1ae718c97 100644 --- a/public/content/translations/pl/developers/docs/index.md +++ b/public/content/translations/pl/developers/docs/index.md @@ -42,4 +42,4 @@ Jeśli jest to Twoja pierwsza próba rozwoju Ethereum, zalecamy zacząć od pocz - [Standardy tokenów](/developers/docs/standards/tokens/) - [Wyrocznie](/developers/docs/oracles/) -- [Skalowanie](/developers/docs/layer-2-scaling/) +- [Skalowanie](/developers/docs/scaling/) diff --git a/public/content/translations/pl/developers/docs/smart-contracts/languages/index.md b/public/content/translations/pl/developers/docs/smart-contracts/languages/index.md index 0ef6fd35496..ce2f7cd9621 100644 --- a/public/content/translations/pl/developers/docs/smart-contracts/languages/index.md +++ b/public/content/translations/pl/developers/docs/smart-contracts/languages/index.md @@ -209,7 +209,7 @@ Jeśli dopiero zapoznajesz się z Ethereum i nie kodowałeś jeszcze w językach **Yul+** - Niskopoziomowe, bardzo wydajne rozszerzenie do Yul. -- Początkowo zaprojektowany na potrzeby kontraktu typu [optymistyczna wartość zbiorcza](/docs/layer-2-scaling/#rollups-and-sidechains). +- Początkowo zaprojektowany na potrzeby kontraktu typu [optymistyczna wartość zbiorcza](/developers/docs/scaling/). - Yul+ można postrzegać jako eksperymentalną propozycję ulepszenia Yul, dodającą do niego nowe funkcje. ### Ważne linki {#important-links-2} diff --git a/public/content/translations/pl/enterprise/index.md b/public/content/translations/pl/enterprise/index.md index 467380b3754..c19d40beff4 100644 --- a/public/content/translations/pl/enterprise/index.md +++ b/public/content/translations/pl/enterprise/index.md @@ -24,7 +24,7 @@ Wiele firm i konsorcjów wdrożyło prywatne, autoryzowane łańcuchy bloków dl ### Kluczowe różnice {#key-differences} - Bezpieczeństwo/niezmienność blockchainu — odporność blockchainu na manipulacje jest określana przez jego algorytm konsensusu. Sieć główna Ethereum jest zabezpieczona przez interakcję tysięcy niezależnych węzłów prowadzonych przez osoby fizyczne i górników na całym świecie. Łańcuchy prywatne zazwyczaj mają niewielką liczbę węzłów, które są kontrolowane przez jedną lub kilka organizacji; te węzły mogą być ściśle kontrolowane, ale przepisanie łańcucha lub dokonanie oszukańczych transakcji wymaga naruszenia tylko kilku z nich. -- Wydajność — ponieważ prywatne sieci Enterprise Ethereum mogą używać węzłów o wysokiej wydajności ze specjalnymi wymaganiami sprzętowymi i różnymi algorytmami konsensusu, takimi jak proof-of-authority, mogą osiągnąć wyższą przepustowość transakcji w warstwie podstawowej (Warstwa 1). W sieci głównej Ethereum wysoką przepustowość można osiągnąć przy użyciu [rozwiązań skalowania warstwy 2](/developers/docs/layer-2-scaling/). +- Wydajność — ponieważ prywatne sieci Enterprise Ethereum mogą używać węzłów o wysokiej wydajności ze specjalnymi wymaganiami sprzętowymi i różnymi algorytmami konsensusu, takimi jak proof-of-authority, mogą osiągnąć wyższą przepustowość transakcji w warstwie podstawowej (Warstwa 1). W sieci głównej Ethereum wysoką przepustowość można osiągnąć przy użyciu [rozwiązań skalowania warstwy 2](/developers/docs/scaling/). - Koszt — koszt obsługi sieci prywatnej odzwierciedla się przede wszystkim w pracy związanej z konfiguracją sieci i zarządzaniem nią oraz serwerami do jej obsługi. Chociaż połączenie z siecią główną Ethereum nie wiąże się z żadnymi kosztami, każda transakcja wiąże się z opłatą za gaz, za którą należy zapłacić Ethereum. Przekaźniki transakcyjne (znane również jako stacje gazu) są opracowywane w celu wyeliminowania potrzeby, aby użytkownicy końcowi, a nawet przedsiębiorstwa, bezpośrednio wykorzystywali Ether w swoich transakcjach. Niektóre [analizy](https://github.com/EYBlockchain/fundamental-cost-of-ownership/blob/master/EY%20Total%20Cost%20of%20Ownership%20for%20Blockchain%20Solutions.pdf) wykazały, że całkowity koszt obsługi aplikacji może być niższy w sieci głównej niż w przypadku uruchomienia prywatnego łancucha. - Zezwalanie na węzły — tylko autoryzowane węzły mogą dołączać do łańcuchów prywatnych. Każdy może skonfigurować węzeł w sieci głównej Ethereum. - Prywatność — dostęp do danych zapisanych w prywatnych łańcuchach można kontrolować, ograniczając dostęp do sieci, a także w bardziej szczegółowy sposób za pomocą kontroli dostępu i transakcji prywatnych. Wszystkie dane zapisane w warstwie 1 sieci mainnet są widoczne dla każdego, więc poufne informacje powinny być przechowywane i przesyłane poza łańcuchem lub szyfrowane. Pojawiają się wzorce projektowe, które to ułatwiają (np. Baseline, Aztec), a także rozwiązania warstwy 2, które mogą utrzymywać dane w podziale i poza warstwą 1. @@ -33,7 +33,7 @@ Wiele firm i konsorcjów wdrożyło prywatne, autoryzowane łańcuchy bloków dl Przedsiębiorstwa eksperymentują z technologią blockchain od około 2016 roku, kiedy uruchomiono projekty Hyperledger, Quorum i Corda. Skupiono się w dużej mierze na blockchainach przedsiębiorstw posiadających zezwolenie prywatne, Jednakże począwszy od 2019 r. nastąpiła zmiana w myśleniu o publicznych i prywatnych blockchainach dla aplikacji biznesowych. [Ankieta](https://assets.ey.com/content/dam/ey-sites/ey-com/en_gl/topics/blockchain/ey-public-blockchain-opportunity-snapshot.pdf) przeprowadzona przez firmę Forrester ujawniła, że „respondenci ankiety… widzą ten potencjał, przy czym 75% deklaruje, że prawdopodobnie będą korzystać z publicznych blockchainów w przyszłości, a prawie jedna trzecia twierdzi, że jest to bardzo prawdopodobne”. Paul Brody z EY [rozmawiał](https://www.youtube.com/watch?v=-ycu5vGDdZw&feature=youtu.be&t=3668) o korzyściach z budowania na publicznym blockchainie, które (w zależności od aplikacji) mogą obejmować silniejsze zabezpieczenia/niezmienność, przejrzystość, niższy całkowity koszt posiadania oraz możliwość współdziałania ze wszystkimi innymi aplikacjami, które również znajdują się w sieci głównej (efekty sieciowe). Dzielenie się wspólnymi punktami odniesienia między firmami pozwala uniknąć niepotrzebnego tworzenia wielu odizolowanych silosów, które nie mogą się komunikować i udostępniać lub synchronizować między sobą informacji. -Kolejnym osiągnięciem, które przenosi nacisk na publiczne blockchainy, jest [Warstwa 2](/developers/docs/layer-2-scaling/). Warstwa 2 to przede wszystkim kategoria technologii skalowalności, która umożliwia stosowanie aplikacji o wysokiej przepustowości w publicznych łańcuchach. Ale rozwiązania warstwy 2 mogą również [ umożliwić uporanie się z innymi problemami, które w przeszłości skłoniły deweloperów przedsiębiorstw do wyboru sieci prywatnych](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). +Kolejnym osiągnięciem, które przenosi nacisk na publiczne blockchainy, jest [Warstwa 2](/developers/docs/scaling/). Warstwa 2 to przede wszystkim kategoria technologii skalowalności, która umożliwia stosowanie aplikacji o wysokiej przepustowości w publicznych łańcuchach. Ale rozwiązania warstwy 2 mogą również [ umożliwić uporanie się z innymi problemami, które w przeszłości skłoniły deweloperów przedsiębiorstw do wyboru sieci prywatnych](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). Baseline Protocol to jeden z kluczowych projektów, który definiuje protokół umożliwiający poufną i złożoną współpracę między przedsiębiorstwami bez pozostawiania żadnych poufnych danych w łańcuchu. W ciągu 2020 r. nabrał istotnego [rozpędu](https://www.oasis-open.org/news/pr/baseline-protocol-achieves-key-milestone-with-release-of-v0-1-implementation-for-enterprise-). @@ -70,7 +70,7 @@ Różne organizacje podjęły pewne wspólne działania, aby uczynić Ethereum p ### Rozwiązania skalowalne {#scalability-solutions} -[Warstwa 2](/developers/docs/layer-2-scaling/) to zestaw technologii lub systemów, które działają na wierzchu Ethereum (Warstwa 1), dziedziczą właściwości zabezpieczeń z warstwy 1 i zapewniają większą wydajność przetwarzania transakcji (przepustowość), niższe opłaty transakcyjne (koszty operacyjne) i szybsze potwierdzenia transakcji niż warstwa 1. Rozwiązania skalowania warstwy 2 są zabezpieczone przez warstwę 1, ale umożliwiają aplikacjom łańcucha bloków obsługę znacznie większej liczby użytkowników, działań lub danych, niż może pomieścić warstwa 1. Wiele z nich wykorzystuje najnowsze postępy w kryptografii i dowody zerowej wiedzy (ZK), aby zmaksymalizować wydajność i bezpieczeństwo. +[Warstwa 2](/developers/docs/scaling/) to zestaw technologii lub systemów, które działają na wierzchu Ethereum (Warstwa 1), dziedziczą właściwości zabezpieczeń z warstwy 1 i zapewniają większą wydajność przetwarzania transakcji (przepustowość), niższe opłaty transakcyjne (koszty operacyjne) i szybsze potwierdzenia transakcji niż warstwa 1. Rozwiązania skalowania warstwy 2 są zabezpieczone przez warstwę 1, ale umożliwiają aplikacjom łańcucha bloków obsługę znacznie większej liczby użytkowników, działań lub danych, niż może pomieścić warstwa 1. Wiele z nich wykorzystuje najnowsze postępy w kryptografii i dowody zerowej wiedzy (ZK), aby zmaksymalizować wydajność i bezpieczeństwo. Zbudowanie aplikacji na bazie rozwiązania skalowalności warstwy 2 może pomóc [rozwiązuje wiele problemów, które wcześniej skłaniały firmy do budowania na prywatnych blockchainach](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/), zachowując jednak korzyści płynące z budowania na sieci głównej. diff --git a/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md index abb2688c1cb..6e7dc1e351c 100644 --- a/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/pt-br/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ Essa é a função principal da fábrica, para criar um par de troca entre dois (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -Queremos que o endereço da nova troca seja determinante, para poder ser calculado antecipadamente fora da cadeia (isso pode ser útil para [transações com camada 2](/developers/docs/layer-2-scaling/)). Para isso, precisamos ter uma ordem consistente dos endereços dos tokens, independente da ordem na qual nós os recebemos, então os classificamos aqui. +Queremos que o endereço da nova troca seja determinante, para poder ser calculado antecipadamente fora da cadeia (isso pode ser útil para [transações com camada 2](/developers/docs/scaling/)). Para isso, precisamos ter uma ordem consistente dos endereços dos tokens, independente da ordem na qual nós os recebemos, então os classificamos aqui. ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); diff --git a/public/content/translations/pt-br/history/index.md b/public/content/translations/pt-br/history/index.md index c4793903270..ef2ab6670a3 100644 --- a/public/content/translations/pt-br/history/index.md +++ b/public/content/translations/pt-br/history/index.md @@ -13,7 +13,7 @@ Uma linha do tempo dos principais marcos, bifurcações e atualizações da bloc Bifurcações ocorrem quando grandes atualizações ou alterações técnicas precisam ser feitas na rede, que geralmente são decorrentes de [Propostas de Melhoria do Ethereum (EIPs)] (/ eips /) e alteram as "regras" do protocolo. -Quando é necessário atualizar um software tradicional, com controle centralizado, a empresa apenas publica uma nova versão para o usuário final. Blockchains funcionam de maneira diferente porque não há propriedade centralizada. [Clientes Ethereum](/developers/docs/nodes-and-clients/) devem atualizar seu software para implementar as novas regras da bifurcação. Além disso, os criadores de bloco (mineradores em um mundo com prova de trabalho, validadores em um mundo com prova de participação) e nós devem criar blocos e validá-los conforme as novas regras. [Mais sobre mecanismos de consenso](/developers/docs/consenus-mechanisms/) +Quando é necessário atualizar um software tradicional, com controle centralizado, a empresa apenas publica uma nova versão para o usuário final. Blockchains funcionam de maneira diferente porque não há propriedade centralizada. [Clientes Ethereum](/developers/docs/nodes-and-clients/) devem atualizar seu software para implementar as novas regras da bifurcação. Além disso, os criadores de bloco (mineradores em um mundo com prova de trabalho, validadores em um mundo com prova de participação) e nós devem criar blocos e validá-los conforme as novas regras. [Mais sobre mecanismos de consenso](/developers/docs/consensus-mechanisms/) Essas mudanças de regra podem criar uma divisão temporária na rede. Novos blocos podem ser produzidos conforme as novas regras ou as antigas. Geralmente, as bifurcações são acordadas antes do tempo, para que os clientes adotem as mudanças de uníssono e para que a bifurcação com as melhorias se torne a cadeia principal. No entanto, em casos raros, desacordos sobre as bifurcações podem fazer com que a rede seja dividida permanentemente. Esse foi notadamente o caso para a criação do Ethereum Classic com a [bifurcação DAO] (#dao-fork). diff --git a/public/content/translations/ro/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/ro/developers/tutorials/uniswap-v2-annotated-code/index.md index 9d3c48f1623..b22b23bcad6 100644 --- a/public/content/translations/ro/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/ro/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ Aceasta este funcția principală a fabricii, să creeze un schimb în pereche (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -Vrem ca adresa noului schimb să fie deterministă, încât să poată fi calculată în avans off-chain (acest lucrul poate fi util pentru [tranzacțiile de nivel 2](/developers/docs/layer-2-scaling/)). Pentru a face aceasta, avem nevoie de o ordine consecventă a adreselor tokenurilor, indiferent de ordinea în care le-am primit, de aceea le sortăm aici. +Vrem ca adresa noului schimb să fie deterministă, încât să poată fi calculată în avans off-chain (acest lucrul poate fi util pentru [tranzacțiile de nivel 2](/developers/docs/scaling/)). Pentru a face aceasta, avem nevoie de o ordine consecventă a adreselor tokenurilor, indiferent de ordinea în care le-am primit, de aceea le sortăm aici. ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); diff --git a/public/content/translations/ro/enterprise/index.md b/public/content/translations/ro/enterprise/index.md index 4abe4ebef2c..1a4828ca745 100644 --- a/public/content/translations/ro/enterprise/index.md +++ b/public/content/translations/ro/enterprise/index.md @@ -33,7 +33,7 @@ Multe companii și consorții au implementat blockchain-uri private autorizate p Întreprinderile experimentează tehnologia blockchain încă din 2016, când au fost lansate proiectele Hyperledger, Quorum și Corda. S-au axat în mare parte pe blockchain-urile întreprinderilor private autorizate, dar începând din 2019 a avut loc o schimbare de concept în privinţa blockchain-urilor publice faţă de cele private pentru aplicațiile de afaceri. Un [sondaj](https://assets.ey.com/content/dam/ey-sites/ey-com/en_gl/topics/blockchain/ey-public-blockchain-opportunity-snapshot.pdf) realizat de Forrester a dezvăluit că „Respondenții la sondaj ... îşi dau seama de acest potențial, 75% afirmând că probabil vor valorifica blockchain-urile publice în viitor, iar aproape o treime declarând că acest lucru este foarte probabil”. Paul Brody de la EY a [vorbit](https://www.youtube.com/watch?v=-ycu5vGDdZw&feature=youtu.be&t=3668) despre avantajele construirii pe blockchain-ul public, care (în funcție de aplicație) pot include o mai mare securitate/imuabilitate şi transparență, costuri totale de proprietate mai mici și capacitatea de a interopera cu toate celelalte aplicații ce se află tot pe Mainnet (efecte de rețea). Partajarea unui cadru comun de referință între companii evită crearea inutilă a numeroase silozuri izolate care nu pot comunica și partaja sau sincroniza informații între ele. -O altă evoluţie prin care atenţia se mută asupra blockchain-ului public este [Nivelul 2](/developers/docs/scaling/layer-2). Nivelul 2 este în primul rând o categorie de tehnologie de scalabilitate care face posibile aplicații cu randament ridicat pe lanțurile publice. Dar soluțiile de Nivelul 2 pot de asemenea [aborda unele dintre celelalte provocări care au determinat dezvoltatorii pentru înteprinderi să aleagă lanțuri private în trecut](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). +O altă evoluţie prin care atenţia se mută asupra blockchain-ului public este [Nivelul 2](/layer-2/). Nivelul 2 este în primul rând o categorie de tehnologie de scalabilitate care face posibile aplicații cu randament ridicat pe lanțurile publice. Dar soluțiile de Nivelul 2 pot de asemenea [aborda unele dintre celelalte provocări care au determinat dezvoltatorii pentru înteprinderi să aleagă lanțuri private în trecut](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). Protocolul Baseline este un proiect-cheie care definește un protocol ce permite colaborarea confidențială și complexă între întreprinderi fără a lăsa date sensibile pe lanț. A câștigat un [avânt](https://www.oasis-open.org/2020/08/26/baseline-protocol-achieves-key-milestone-with-release-of-v0-1-implementation-for-enterprise/) semnificativ pe cursul anului 2020. @@ -71,7 +71,7 @@ Diverse organizații au depus eforturi comune pentru a creşte uşurinţa de uti ### Soluții de scalabilitate {#scalability-solutions} -[Nivelul 2](/developers/docs/scaling/#layer-2-scaling) este un set de tehnologii sau sisteme care rulează peste Ethereum (Nivelul 1), moștenesc proprietăți de securitate din Nivelul 1 și oferă o capacitate mai mare de procesare a tranzacțiilor (transfer), taxe de tranzacție mai mici (cost de operare) și confirmări mai rapide ale tranzacțiilor decât Nivelul 1. Soluțiile de scalare de Nivelul 2 sunt securizate de Nivelul 1, dar permit aplicațiilor blockchain să gestioneze mai mulți utilizatori sau acțiuni sau date decât ar putea găzdui Nivelul 1. Multe dintre acestea valorifică progresele recente în criptografie și dovezile de zero-knowledge (ZK) pentru a maximiza performanța și securitatea. +[Nivelul 2](/layer-2/) este un set de tehnologii sau sisteme care rulează peste Ethereum (Nivelul 1), moștenesc proprietăți de securitate din Nivelul 1 și oferă o capacitate mai mare de procesare a tranzacțiilor (transfer), taxe de tranzacție mai mici (cost de operare) și confirmări mai rapide ale tranzacțiilor decât Nivelul 1. Soluțiile de scalare de Nivelul 2 sunt securizate de Nivelul 1, dar permit aplicațiilor blockchain să gestioneze mai mulți utilizatori sau acțiuni sau date decât ar putea găzdui Nivelul 1. Multe dintre acestea valorifică progresele recente în criptografie și dovezile de zero-knowledge (ZK) pentru a maximiza performanța și securitatea. Construirea aplicației dvs. pe o soluție de scalabilitate de Nivelul 2 poate ajuta la [soluționarea multor preocupări care anterior au determinat companiile să construiască pe blockchain-uri private](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/), dar păstrează avantajele construirii pe Mainnet. diff --git a/public/content/translations/tr/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/tr/developers/tutorials/uniswap-v2-annotated-code/index.md index f81404dc6ac..54f4c9e8dbe 100644 --- a/public/content/translations/tr/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/tr/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ Bu, fabrikanın ana işlevidir, yani iki ERC-20 token'ı arasında bir eş takas (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -Zincir dışında önceden hesaplanabilmesi için yeni takasın adresinin deterministik olmasını istiyoruz (bu, [katman 2 işlemleri](/developers/docs/layer-2-scaling/) için yararlı olabilir). Bunu yapabilmek için onları aldığımız sıraya bakmaksızın jeton adreslerinin tutarlı bir sırasına sahip olmamız gerekir, bu yüzden de onları burada sıralarız. +Zincir dışında önceden hesaplanabilmesi için yeni takasın adresinin deterministik olmasını istiyoruz (bu, [katman 2 işlemleri](/developers/docs/scaling/) için yararlı olabilir). Bunu yapabilmek için onları aldığımız sıraya bakmaksızın jeton adreslerinin tutarlı bir sırasına sahip olmamız gerekir, bu yüzden de onları burada sıralarız. ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); diff --git a/public/content/translations/zh/developers/tutorials/uniswap-v2-annotated-code/index.md b/public/content/translations/zh/developers/tutorials/uniswap-v2-annotated-code/index.md index 12fb6fd148e..cddb7f3b0a6 100644 --- a/public/content/translations/zh/developers/tutorials/uniswap-v2-annotated-code/index.md +++ b/public/content/translations/zh/developers/tutorials/uniswap-v2-annotated-code/index.md @@ -743,7 +743,7 @@ contract UniswapV2Factory is IUniswapV2Factory { (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); ``` -我们希望新交易所的地址是可以确定的,这样就可以在链下提前计算(这对于[二层网络交易](/developers/docs/layer-2-scaling/)来说比较有用)。 为此,无论收到代币地址的顺序如何,我们需要代币地址始终按顺序排列,因此我们在此处对它们排序。 +我们希望新交易所的地址是可以确定的,这样就可以在链下提前计算(这对于[二层网络交易](/developers/docs/scaling/)来说比较有用)。 为此,无论收到代币地址的顺序如何,我们需要代币地址始终按顺序排列,因此我们在此处对它们排序。 ```solidity require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); diff --git a/public/content/translations/zh/guides/how-to-id-scam-tokens/index.md b/public/content/translations/zh/guides/how-to-id-scam-tokens/index.md index f99cf5262b5..04549679db7 100644 --- a/public/content/translations/zh/guides/how-to-id-scam-tokens/index.md +++ b/public/content/translations/zh/guides/how-to-id-scam-tokens/index.md @@ -19,7 +19,7 @@ lang: zh title="什么是 ARB?" contentPreview=''> -Arbitrum 是一个开发和管理 乐观卷叠 的组织。 最初,Arbitrum 是一家以营利为目的的公司,但后来采取了去中心化步骤。 在这一过程中,他们发行了可交易的治理代币。 +Arbitrum 是一个开发和管理 乐观卷叠 的组织。 最初,Arbitrum 是一家以营利为目的的公司,但后来采取了去中心化步骤。 在这一过程中,他们发行了可交易的治理代币。 diff --git a/src/intl/ig/page-index.json b/src/intl/ig/page-index.json index 36dcdc23b69..39c4d691005 100644 --- a/src/intl/ig/page-index.json +++ b/src/intl/ig/page-index.json @@ -77,7 +77,7 @@ "page-index-nft-button": "Ihe ndị ọzọ na NFT", "page-index-nft-alt": "A na-egosipụta akara Eth site na hologram.", "community-events-content-heading": "Sonye na otu ethereum.org", - "community-events-content-1": "Sonye ihe dị ka ndị puku iri anọ na ọrụ nkwekọrịta anyị.", + "community-events-content-1": "Sonye ihe dị ka ndị puku iri anọ na ọrụ nkwekọrịta anyị.", "community-events-content-2": "Sonye nzuko obodo anyị kwa ọnwa maka mmelite na-akpali akpali na mmepe Ethereum.org yana ozi gbasara gburugburu ebe obibi kacha mkpa. Nweta ohere ịjụ ajụjụ, kesaa echiche, na inye azịza - ọ bụ oge zuru oke iji sonye na obodo Ethereum na-eto eto.", "community-events-next-event": "Mgbakọ ọzọ", "community-events-no-events-planned": "O nweghị mmemme akwadoro", From 97489c4492fb4377daaa9d850797174b0f2e825a Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 15:05:22 +0000 Subject: [PATCH 452/478] Fix broken links --- public/content/translations/hi/roadmap/merge/index.md | 2 +- .../translations/it/developers/docs/scaling/zk-rollups/index.md | 2 +- .../translations/ro/developers/docs/apis/backend/index.md | 2 +- public/content/translations/ro/history/index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/content/translations/hi/roadmap/merge/index.md b/public/content/translations/hi/roadmap/merge/index.md index 098a40bba45..d91e89bf548 100644 --- a/public/content/translations/hi/roadmap/merge/index.md +++ b/public/content/translations/hi/roadmap/merge/index.md @@ -135,7 +135,7 @@ title="ग़लत धारणा: "मर्ज गैस शुल् contentPreview="False. The Merge was a change of consensus mechanism, not an expansion of network capacity, and was never intended to lower gas fees."> गैस शुल्क नेटवर्क की क्षमता के सापेक्ष नेटवर्क की माँग का एक उत्पाद है। मर्ज ने काम का सबूत के उपयोग को हटा दिया, सहमति के लिए हिस्सेदारी का सबूत में बदल गया, लेकिन नेटवर्क क्षमता या थ्रूपुट को सीधे प्रभावित करने वाले किसी भी पैरामीटर को महत्वपूर्ण रूप से नहीं बदला। -[रोलअप-केंद्रित रोडमैप](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) के साथ, [परत 2](/layer-2/) पर उपयोगकर्ता गतिविधि को बढ़ाने पर ध्यान केंद्रित किया जा रहा है, परत 1 मेननेट को एक सुरक्षित विकेंद्रीत सेटमलमेंट परत के रूप में सक्षम करते हुए रोलअप डेटा स्टोरेज के लिए अनुकूलित किया गया है, ताकि रोलअप लेनदेन को तेज़ी से किफ़ायती बनाया जा सके। इसे समझने के लिए हिस्सेदारी के सबूत में ट्रांज़िशन की महत्वपूर्ण भूमिका होती है। [गैस और फीस के बारे में और जानकारी।](/डेवलपर/दस्तावेज़/गैस/) +[रोलअप-केंद्रित रोडमैप](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) के साथ, [परत 2](/layer-2/) पर उपयोगकर्ता गतिविधि को बढ़ाने पर ध्यान केंद्रित किया जा रहा है, परत 1 मेननेट को एक सुरक्षित विकेंद्रीत सेटमलमेंट परत के रूप में सक्षम करते हुए रोलअप डेटा स्टोरेज के लिए अनुकूलित किया गया है, ताकि रोलअप लेनदेन को तेज़ी से किफ़ायती बनाया जा सके। इसे समझने के लिए हिस्सेदारी के सबूत में ट्रांज़िशन की महत्वपूर्ण भूमिका होती है। [गैस और फीस के बारे में और जानकारी।](/developers/docs/gas/) Date: Fri, 23 Feb 2024 15:15:15 +0000 Subject: [PATCH 453/478] More broken links! --- public/content/translations/de/community/get-involved/index.md | 2 +- public/content/translations/hi/roadmap/merge/index.md | 2 +- .../translations/id/developers/docs/apis/javascript/index.md | 2 +- .../developers/tutorials/erc-721-vyper-annotated-code/index.md | 2 +- .../translations/ro/developers/docs/apis/javascript/index.md | 2 +- .../translations/ro/developers/docs/standards/tokens/index.md | 2 +- src/intl/ar/page-run-a-node.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/content/translations/de/community/get-involved/index.md b/public/content/translations/de/community/get-involved/index.md index a552bf7a44c..38762ee7236 100644 --- a/public/content/translations/de/community/get-involved/index.md +++ b/public/content/translations/de/community/get-involved/index.md @@ -62,7 +62,7 @@ Wenn Sie kein Entwickler sind, ist es nicht ganz so einfach, herauszufinden, wo ### Ethereum-Inhalte in Ihre Muttersprache übersetzen {#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). +- Wie Sie sich beteiligen können, erfahren Sie [hier](/contributing/translation-program/). ### Einen Knoten ausführen {#run-a-node} diff --git a/public/content/translations/hi/roadmap/merge/index.md b/public/content/translations/hi/roadmap/merge/index.md index d91e89bf548..92de9ce0d25 100644 --- a/public/content/translations/hi/roadmap/merge/index.md +++ b/public/content/translations/hi/roadmap/merge/index.md @@ -100,7 +100,7 @@ id="developers"> - ऑन-चेन रैंडमनेस के स्रोत - _सुरक्षित शीर्ष_ और _अंतिम रूप दिए गए ब्लॉक_ की अवधारणा -अधिक जानकारी के लिए, टिम बीको के इस ब्लॉग पोस्ट को देखें [एथेरियम के एप्लिकेशन को मर्ज कैसे प्रभावित करता है] (https://blog.ethereum.org/2021/11/29/how-the-merge-impacts-app-layer/)। +अधिक जानकारी के लिए, टिम बीको के इस ब्लॉग पोस्ट को देखें [एथेरियम के एप्लिकेशन को मर्ज कैसे प्रभावित करता है](https://blog.ethereum.org/2021/11/29/how-the-merge-impacts-app-layer/)। ## मर्ज और ऊर्जा की खपत {#merge-and-energy} diff --git a/public/content/translations/id/developers/docs/apis/javascript/index.md b/public/content/translations/id/developers/docs/apis/javascript/index.md index cbf960f4b40..c780ef969d1 100644 --- a/public/content/translations/id/developers/docs/apis/javascript/index.md +++ b/public/content/translations/id/developers/docs/apis/javascript/index.md @@ -6,7 +6,7 @@ lang: id Agar aplikasi web dapat berinteraksi dengan blockchain Ethereum (yaitu membaca data blockchain dan/atau mengirim transaksi ke jaringan), aplikasi harus terhubung ke node Ethereum. -Untuk keperluan ini, setiap klien Ethereum mengimplementasikan spesifikasi [JSON-RPC](/developers/docs/apis/json-rpc/), sehingga ada keseragaman kumpulan [titik akhir](/developers/docs/apis/json-rpc/endpoints/) yang bisa menjadi tumpuan aplikasi. +Untuk keperluan ini, setiap klien Ethereum mengimplementasikan spesifikasi [JSON-RPC](/developers/docs/apis/json-rpc/), sehingga ada keseragaman kumpulan [titik akhir](/developers/docs/apis/json-rpc//) yang bisa menjadi tumpuan aplikasi. Jika ingin Anda menggunakan JavaScript untuk terhubung dengan node Ethereum, dimungkinkan menggunakan JavaScript vanilla, tetapi beberapa pustaka praktis telah ada di dalam ekosistem yang akan membuat proses ini jauh lebih mudah. Dengan pustaka ini, pengembang dapat menulis metode satu baris yang intuitif untuk memulai permintaan JSON RPC (di bawah tenda) yang berinteraksi dengan Ethereum. diff --git a/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md index 960c69543fb..fbc70bd02c3 100644 --- a/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md +++ b/public/content/translations/pt-br/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -13,7 +13,7 @@ published: 2021-04-01 ## Introdução {#introduction} -O [ERC-721](/developers/docs/standards/tokens/erc-721/) padrão é usado para manter a propriedade de tokens não fungíveis (NFT). [ERC-20](/developers/docs/standards/totens/erc-20/) os tokens se comportam como uma mercadoria, porque não há diferença entre os totens individuais. Em contraste com isso, ERC-721 tokens são projetados para ativos semelhantes, mas não idênticos, como diferentes [cat cartoons](https://www.cryptokitties.co/) ou títulos de diferentes imóveis. +O [ERC-721](/developers/docs/standards/tokens/erc-721/) padrão é usado para manter a propriedade de tokens não fungíveis (NFT). [ERC-20](/developers/docs/standards/tokens/erc-20/) os tokens se comportam como uma mercadoria, porque não há diferença entre os totens individuais. Em contraste com isso, ERC-721 tokens são projetados para ativos semelhantes, mas não idênticos, como diferentes [cat cartoons](https://www.cryptokitties.co/) ou títulos de diferentes imóveis. Neste artigo, vamos analisar o [contrato ERC-721 de Ryuya Nakamura](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy). Este contrato é escrito em [Vyper](https://vyper.readthedocs.io/en/latest/index.html), a Python-like linguagem de contrato projetada para tornar é mais difícil escrever código inseguro do que na solidez. diff --git a/public/content/translations/ro/developers/docs/apis/javascript/index.md b/public/content/translations/ro/developers/docs/apis/javascript/index.md index 89e836dc565..7232134fccc 100644 --- a/public/content/translations/ro/developers/docs/apis/javascript/index.md +++ b/public/content/translations/ro/developers/docs/apis/javascript/index.md @@ -6,7 +6,7 @@ lang: ro Pentru ca o aplicație web să interacționeze cu blockchain-ul Ethereum (adică să citească datele blockchain-ului și/sau să trimită tranzacții către rețea), trebuie să se conecteze la un nod Ethereum. -În acest scop, fiecare client Ethereum implementează specificația [JSON-RPC](/developers/docs/apis/json-rpc/), astfel încât să existe un set uniform de [endpoint-uri](/developers/docs/apis/json-rpc/endpoints/) pe care se pot baza aplicațiile. +În acest scop, fiecare client Ethereum implementează specificația [JSON-RPC](/developers/docs/apis/json-rpc/), astfel încât să existe un set uniform de [endpoint-uri](/developers/docs/apis/json-rpc//) pe care se pot baza aplicațiile. Dacă doriţi să utilizaţi JavaScript pentru a vă conecta la un nod Ethereum, puteţi să utilizaţi vanilla JavaScript, dar există mai multe biblioteci utile în ecosistem care facilitează mult acest lucru. Cu aceste biblioteci, programatorii pot scrie metode intuitive şi scurte pentru a inițializa cereri JSON RPC (în culise) care interacționează cu Ethereum. diff --git a/public/content/translations/ro/developers/docs/standards/tokens/index.md b/public/content/translations/ro/developers/docs/standards/tokens/index.md index 3e72207e0ae..18a44859401 100644 --- a/public/content/translations/ro/developers/docs/standards/tokens/index.md +++ b/public/content/translations/ro/developers/docs/standards/tokens/index.md @@ -20,7 +20,7 @@ Iată câteva dintre cele mai populare standarde de token-uri pe Ethereum: - [ERC-20](/developers/docs/standards/tokens/erc-20/) - O interfață standard pentru tokenuri fungibile (interschimbabile), cum ar fi tokenurile de vot, tokenurile de miză sau monedele virtuale. - [ERC-721](/developers/docs/standards/tokens/erc-721/) - O interfață standard pentru tokenuri nefungibile, cum ar fi un act de proprietate pentru opere de artă sau o melodie. -- [ERC-777](/developers/docs/docs/standards/tokens/erc-777/) - ERC-777 permite utilizatorilor să construiască funcționalități suplimentare pe lângă tokenuri, cum ar fi un contract de mixare, pentru o mai mare confidențialitate a tranzacțiilor, sau o funcție de recuperare de urgență ca să vă salveze dacă vă pierdeți cheile private. +- [ERC-777](/developers/docs/standards/tokens/erc-777/) - ERC-777 permite utilizatorilor să construiască funcționalități suplimentare pe lângă tokenuri, cum ar fi un contract de mixare, pentru o mai mare confidențialitate a tranzacțiilor, sau o funcție de recuperare de urgență ca să vă salveze dacă vă pierdeți cheile private. - [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - ERC-1155 permite efectuarea mai eficientă a tranzacțiilor și gruparea tranzacțiilor – economisind astfel costurile. Acest standard de tokenuri facilitează crearea de tokenuri de utilitate (cum ar fi $BNB sau $BAT) și de tokenuri nefungibile, cum ar fi CryptoPunks. ## Referințe suplimentare {#further-reading} diff --git a/src/intl/ar/page-run-a-node.json b/src/intl/ar/page-run-a-node.json index c1fe2774b48..669d0ffa923 100644 --- a/src/intl/ar/page-run-a-node.json +++ b/src/intl/ar/page-run-a-node.json @@ -106,7 +106,7 @@ "page-run-a-node-staking-description": "على الرغم من أنه غير مطلوب، مع عقدة قيد التشغيل أنت أقرب خطوة إلى تجميد عملات إثير الخاصة بك لكسب المكافآت والمساعدة في المساهمة في مكون مختلف من مكونات أمان إثيريوم.", "page-run-a-node-staking-link": "تجميد عملات إثير", "page-run-a-node-staking-plans-title": "هل تخطط لتجميد العملات؟", - "page-run-a-node-staking-plans-description": "لتعظيم كفاءة المصادق من المفضل استخدام 16 جيجابايت من الذاكرة العشوائية، ولكن استخدام 32 جيجا يعتبر أفضل، مع استخدام وحدة معالجة مركزية بتقييم يزيد علي 6667 وفق ما يرد علي موقع cpubenchmark.net. من الموصي به أيضاً أن يتمكن المراهن من الوصول إلي سرعة عالية وغير محدودة للانترنت ولكنه لا يعتبر خيار إجباري.", + "page-run-a-node-staking-plans-description": "لتعظيم كفاءة المصادق من المفضل استخدام 16 جيجابايت من الذاكرة العشوائية، ولكن استخدام 32 جيجا يعتبر أفضل، مع استخدام وحدة معالجة مركزية بتقييم يزيد علي 6667 وفق ما يرد علي موقع cpubenchmark.net. من الموصي به أيضاً أن يتمكن المراهن من الوصول إلي سرعة عالية وغير محدودة للانترنت ولكنه لا يعتبر خيار إجباري.", "page-run-a-node-staking-plans-ethstaker-link-label": "كيفية التسوّق لأجهزة برنامج المدقق لإثيريوم", "page-run-a-node-staking-plans-ethstaker-link-description": "EthStaker يتناول المزيد من التفاصيل لمدة ساعة خاصة", "page-run-a-node-sovereignty-title": "السيادة", From 0d63d474920056712653976fbbfd2271cb45a2d6 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Fri, 23 Feb 2024 16:00:05 +0000 Subject: [PATCH 454/478] Broken links --- .../fr/developers/docs/consensus-mechanisms/pos/index.md | 2 +- .../consensus-mechanisms/pos/attack-and-defense/index.md | 2 +- .../hu/developers/docs/standards/tokens/index.md | 2 +- .../id/contributing/translation-program/index.md | 4 ++-- public/content/translations/id/enterprise/index.md | 2 +- .../docs/programming-languages/javascript/index.md | 2 +- public/content/translations/nl/roadmap/merge/index.md | 6 +++--- .../translations/pl/developers/docs/apis/backend/index.md | 2 +- .../pl/developers/docs/standards/tokens/index.md | 2 +- public/content/translations/pl/roadmap/merge/index.md | 4 ++-- .../pt-br/contributing/translation-program/index.md | 2 +- .../translations/pt-br/roadmap/beacon-chain/index.md | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) diff --git a/public/content/translations/fr/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/fr/developers/docs/consensus-mechanisms/pos/index.md index 5780e415170..0b8dcfb4b7d 100644 --- a/public/content/translations/fr/developers/docs/consensus-mechanisms/pos/index.md +++ b/public/content/translations/fr/developers/docs/consensus-mechanisms/pos/index.md @@ -24,7 +24,7 @@ Alors qu'avec le consensus de preuve de travail, la fréquence des blocs est dé Ce qui suit fournit une explication de bout en bout de la façon dont une transaction est exécutée avec la preuve d'enjeu Ethereum (PoS). -1. Un utilisateur crée et [signe une](/developers/docs/transaction/) avec sa clé privée. Ceci est généralement géré par un portefeuille ou une bibliothèque telle que l'éther [. s](https://docs.ethers.io/v5/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) etc mais sous le capuchon l'utilisateur fait une requête à un noeud en utilisant l'API [JSON-RPC](/developers/docs/apis/json-rpc/). L'utilisateur définit la quantité de gaz qu'il est prêt à payer comme un pourboire au validateur pour l'encourager à inclure la transaction dans un bloc. Les [pourboires](/developers/docs/gas/#priority-fee) sont payés au validateur alors que les [frais de base](/developers/docs/gas/#base-fee) sont brûlés. +1. Un utilisateur crée et [signe une](/developers/docs/transactions/) avec sa clé privée. Ceci est généralement géré par un portefeuille ou une bibliothèque telle que l'éther [. s](https://docs.ethers.io/v5/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) etc mais sous le capuchon l'utilisateur fait une requête à un noeud en utilisant l'API [JSON-RPC](/developers/docs/apis/json-rpc/). L'utilisateur définit la quantité de gaz qu'il est prêt à payer comme un pourboire au validateur pour l'encourager à inclure la transaction dans un bloc. Les [pourboires](/developers/docs/gas/#priority-fee) sont payés au validateur alors que les [frais de base](/developers/docs/gas/#base-fee) sont brûlés. 2. La transaction est soumise à un client d'exécution [Ethereum](/developers/docs/nodes-and-clients/#execution-client) qui vérifie sa validité. Cela signifie s'assurer que l'expéditeur a suffisamment d'ETH pour remplir la transaction et qu'il l'a signée avec la bonne clé. 3. Si la transaction est valide, le client d'exécution l'ajoute à son mempool local (liste des transactions en attente) et le transmet également à d'autres nœuds sur le réseau d'informations de la couche d'exécution. Quand d'autres nœuds reçoivent la transaction, ils l'ajoutent également à leur mempool local. Les utilisateurs avancés peuvent s'abstenir de diffuser leur transaction et la transmettre à des créateurs de blocs spécialisés tels que [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview). Cela leur permet d'organiser les transactions dans les blocs à venir pour un profit maximal ([MEV](/developers/docs/mev/#mev-extraction)). 4. Un des nœuds sur le réseau est le bloc proposant pour le créneau actuel, ayant précédemment été sélectionné pseudo-aléatoirement à l'aide de RANDAO. Ce noeud est responsable de la construction et de la diffusion du prochain bloc à ajouter à la blockchain Ethereum et de la mise à jour de l'état global. Le noeud est composé de trois parties : un client d'exécution, un client de consensus et un client validateur. Le client d'exécution relie les transactions depuis le mempool local à une « charge utile d'exécution » et les exécute localement pour générer un changement d'état. Ces informations sont transmises au client de consensus où la charge utile d'exécution est enveloppée dans un « bloc balise » qui contient également des informations sur les récompenses, les pénalités, les réductions, les attestations, etc. qui permettent au réseau de se mettre d'accord sur la séquence de blocs en tête de la chaîne. La communication entre l'exécution et les clients de consensus est décrite plus en détail dans [Connecting the Consensus and Execution Clients](/developers/docs/networking-layer/#connecting-clients). diff --git a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md index 2eb0c36a410..4d5df77fc35 100644 --- a/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md +++ b/public/content/translations/hu/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md @@ -8,7 +8,7 @@ A tolvajok és szabotőrök folyamatosan keresik a lehetőséget, hogy megtámad ## Előfeltételek {#prerequisites} -A [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) alapszintű ismerete szükséges. Hasznos lesz továbbá, ha alapszintű ismeretekkel rendelkezel az Ethereum [ösztönzési réteg](/developers/docs/docs/consensus-mechanisms/pos/rewards-and-penalties) és az elágazásválasztási algoritmus, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper) működéséről. +A [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) alapszintű ismerete szükséges. Hasznos lesz továbbá, ha alapszintű ismeretekkel rendelkezel az Ethereum [ösztönzési réteg](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) és az elágazásválasztási algoritmus, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper) működéséről. ## Mit akarnak a támadók? {#what-do-attackers-want} diff --git a/public/content/translations/hu/developers/docs/standards/tokens/index.md b/public/content/translations/hu/developers/docs/standards/tokens/index.md index 3b049014063..3d098c07e2d 100644 --- a/public/content/translations/hu/developers/docs/standards/tokens/index.md +++ b/public/content/translations/hu/developers/docs/standards/tokens/index.md @@ -29,5 +29,5 @@ _Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldal - [Token integrációs checklista](/developers/tutorials/token-integration-checklist/) _– Egy checklista, melyet figyelembe kell venni tokenekkel történő interakcióknál_ - [Az ERC20 token okosszerződés megértése](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Bevezetés az első okosszerződésed telepítésébe egy Ethereum teszt hálózaton._ -- [ERC20 tokenek átutalása és jóváhagyása egy Solidity okosszerződésből](/developers/tutorials/transfers-and-approval-of-erc20-tokens-from-a-solidity-smart-contract/) _– Egy okosszerződés használata token interakcióhoz a Solidity nyelv használatával._ +- [ERC20 tokenek átutalása és jóváhagyása egy Solidity okosszerződésből](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Egy okosszerződés használata token interakcióhoz a Solidity nyelv használatával._ - [ERC721 piac implementáció [egy how-to segédleg]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Hogyan lehet tokenizált tárgyakat eladásra kínálni egy decentralizált és titkosított felületen._ diff --git a/public/content/translations/id/contributing/translation-program/index.md b/public/content/translations/id/contributing/translation-program/index.md index 5352562fdff..3430534a439 100644 --- a/public/content/translations/id/contributing/translation-program/index.md +++ b/public/content/translations/id/contributing/translation-program/index.md @@ -46,7 +46,7 @@ Program Terjemahan ethereum.org bertujuan untuk membuat Ethereum dapat diakses o Kami menyarankan Anda untuk melihat Panduan Gaya Penerjemahan ethereum.org. Ini berisi beberapa panduan, instruksi, dan tips yang paling penting bagi para penerjemah dan bisa menjadi rujukan saat melokalkan situs web. - {" "}Lihat Panduan Gaya Penerjemahan + {" "}Lihat Panduan Gaya Penerjemahan 1. **[Bergabung dengan projek kami di Crowdin](https://crowdin.com/project/ethereum-org/)** @@ -115,7 +115,7 @@ Jika Anda adalah seorang penerjemah ethereum.org atau ingin menjadi salah satuny Jika Anda membantu kami dengan terjemahan, Anda mungkin menemukan beberapa informasi yang berguna dalam Pertanyaan yang Sering Diajukan tentang terjemahan kami. - {" "}Pertanyaan yang Sering Diajukan tentang menerjemahkan ethereum.org + {" "}Pertanyaan yang Sering Diajukan tentang menerjemahkan ethereum.org ## Sumber Daya {#resources} diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index 5b0060ce92c..6ddfd32b2e0 100644 --- a/public/content/translations/id/enterprise/index.md +++ b/public/content/translations/id/enterprise/index.md @@ -33,7 +33,7 @@ Banyak bisnis dan konsorsium telah menyebarkan blockchain pribadi yang diizinkan Perusahaan telah bereksperimen dengan teknologi blockchain sejak sekitar 2016, ketika proyek Hyperledger, Quorum, dan Corda diluncurkan. Fokusnya terutama pada blockchain perusahaan privat yang diizinkan, tapi sejak awal 2019 ada perubahan dalam pemikiran tentang blockchain publik vs privat untuk aplikasi bisnis. Sebuah [survei](https://assets.ey.com/content/dam/ey-sites/ey-com/en_gl/topics/blockchain/ey-public-blockchain-opportunity-snapshot.pdf) yang diadakan oleh Forrester menunjukkan bahwa "Responden survey ... melihat potensi ini, dengan 75% mengatakan bahwa mereka kemungkinan besar akan memanfaatkan blockchain publik di masa depan, dan hampir sepertiga mengatakan mereka sangat mungkin melakukan itu". Paul Brody dari EY telah [membahas](https://www.youtube.com/watch?v=-ycu5vGDdZw&feature=youtu.be&t=3668) tentang keuntungan membangun pada blockchain publik, yang (bergantung pada aplikasi) bisa mencakup keamanan/kekebalan yang lebih kuat, transparansi, biaya total kepemilikan yang lebih rendah, dan kemampuan untuk bekerja sama dengan semua aplikasi lainnya yang juga ada di Jaringan Utama (efek jaringan). Berbagi kerangka acuan umum antar perusahaan menghindari munculnya sejumlah silo terisolasi yang tidak perlu yang tidak bisa saling berkomunikasi dan berbagi atau sinkron satu sama lain. -Pengembangan lainnya yang menggeser fokus ke blockchain publik adalah [Lapisan 2](/developers/docs/scaling/layer-2). Lapisan 2 terutama untuk kategori teknologi skalabilitas yang membuat aplikasi throughput tinggi mungkin ada di rantai publik. Tetapi solusi Lapisan 2 juga bisa [mengatasi beberapa tantangan lainnya yang mendorong pengembang perusahaan memilih rantai privat di masa lalu](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). +Pengembangan lainnya yang menggeser fokus ke blockchain publik adalah [Lapisan 2](/developers/docs/scaling/layer-2-rollups/). Lapisan 2 terutama untuk kategori teknologi skalabilitas yang membuat aplikasi throughput tinggi mungkin ada di rantai publik. Tetapi solusi Lapisan 2 juga bisa [mengatasi beberapa tantangan lainnya yang mendorong pengembang perusahaan memilih rantai privat di masa lalu](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). Protokol Baseline adalah salah satu proyek utama yang menentukan satu protokol yang memungkinkan kolaborasi rahasia dan rumit di antara perusahaan tanpa meninggalkan data sensitif apa pun secara on-chain. Proyek ini telah mendapatkan [momentum](https://www.oasis-open.org/2020/08/26/baseline-protocol-achieves-key-milestone-with-release-of-v0-1-implementation-for-enterprise/) signifikan sepanjang 2020. diff --git a/public/content/translations/it/developers/docs/programming-languages/javascript/index.md b/public/content/translations/it/developers/docs/programming-languages/javascript/index.md index e6e69f0248c..81a821658c4 100644 --- a/public/content/translations/it/developers/docs/programming-languages/javascript/index.md +++ b/public/content/translations/it/developers/docs/programming-languages/javascript/index.md @@ -32,7 +32,7 @@ Di più sui [contratti intelligenti](/developers/docs/smart-contracts/). ### La macchina virtuale Ethereum {#the-ethereum-virtual-machine} -Esiste un'implementazione JavaScript della [macchina virtuale di Ethereum](/en/developers/docs/evm/), che supporta le regole più recenti relative alle diramazioni della rete. Le regole relative alle diramazioni si riferiscono alle modifiche apportate alla macchina virtuale di Ethereum (EVM) a seguito di upgrade pianificati. +Esiste un'implementazione JavaScript della [macchina virtuale di Ethereum](/developers/docs/evm/), che supporta le regole più recenti relative alle diramazioni della rete. Le regole relative alle diramazioni si riferiscono alle modifiche apportate alla macchina virtuale di Ethereum (EVM) a seguito di upgrade pianificati. È suddivisa in vari pacchetti JavaScript che puoi leggere per comprendere meglio: diff --git a/public/content/translations/nl/roadmap/merge/index.md b/public/content/translations/nl/roadmap/merge/index.md index a3aba65868a..67408e0a5a6 100644 --- a/public/content/translations/nl/roadmap/merge/index.md +++ b/public/content/translations/nl/roadmap/merge/index.md @@ -17,13 +17,13 @@ summaryPoint4: Vroeger noemden we dit "de docking." ## Wat is de merge? {#what-is-the-docking} -Het is belangrijk om te onthouden dat aanvankelijk de [Beacon Chain](/roadmap/beacon-chain/) apart werd verzonden van het [hoofdnet](/glossary/#mainnet) - de keten die we vandaag gebruiken. Het Ethereum-hoofdnet blijft beveiligd door [proof-of-work](/ontwikkelaars/docs/consensus-mechanisms/pow/), zelfs terwijl de Beacon Chain parallel draait met [proof-of-stake](/ontwikkelaars/docs/consensus-mechanisms/pos/). De merge is het moment wanneer beide systemen eindelijk samenkomen. +Het is belangrijk om te onthouden dat aanvankelijk de [Beacon Chain](/roadmap/beacon-chain/) apart werd verzonden van het [hoofdnet](/glossary/#mainnet) - de keten die we vandaag gebruiken. Het Ethereum-hoofdnet blijft beveiligd door [proof-of-work](/developers/docs/consensus-mechanisms/pow/), zelfs terwijl de Beacon Chain parallel draait met [proof-of-stake](/developers/docs/consensus-mechanisms/pos/). De merge is het moment wanneer beide systemen eindelijk samenkomen. Stel je voor dat Ethereum een ruimteschip is dat nog niet helemaal klaar is voor een interstellaire reis. Met de Beacon Chain heeft de gemeenschap een nieuwe motor en een geharde romp gebouwd. Als het zover is, zal het huidige schip aan dit nieuwe systeem koppelen en samensmelten tot één schip, klaar om serieuze lichtjaren te overbruggen en het heelal in te gaan. ## Samenvoegen met het hoofdnet {#docking-mainnet} -Als het klaar is, zal het Ethereum-hoofdnet "fuseren" met de Beacon Chain en zijn eigen shard worden die proof-of-stake gebruikt in plaats van [proof-of-work](/ontwikkelaars/docs/consensus-mechanisms/pow/). +Als het klaar is, zal het Ethereum-hoofdnet "fuseren" met de Beacon Chain en zijn eigen shard worden die proof-of-stake gebruikt in plaats van [proof-of-work](/developers/docs/consensus-mechanisms/pow/). Het hoofdnet zal de mogelijkheid om slimme contracten uit te voeren in het proof-of-stake systeem brengen, plus de volledige geschiedenis en huidige staat van Ethereum, om ervoor te zorgen dat de overgang soepel verloopt voor alle ETH-houders en -gebruikers. @@ -41,7 +41,7 @@ Alle Ethereum-upgrades zijn ietwat met elkaar verbonden. Laten we daarom samenva ### De merge en de Beacon Chain {#docking-and-beacon-chain} -Zodra de merge plaatsvindt, zullen stakers worden toegewezen om het Ethereum-hoofdnet te valideren. [Mining](/ontwikkelaars/docs/consensus-mechanisms/pow/mining/) zal niet langer nodig zijn, dus miners zullen waarschijnlijk hun inkomsten investeren in het staken in het nieuwe proof-of-stake systeem. +Zodra de merge plaatsvindt, zullen stakers worden toegewezen om het Ethereum-hoofdnet te valideren. [Mining](/developers/docs/consensus-mechanisms/pow/mining/) zal niet langer nodig zijn, dus miners zullen waarschijnlijk hun inkomsten investeren in het staken in het nieuwe proof-of-stake systeem. De Baken Ketting diff --git a/public/content/translations/pl/developers/docs/apis/backend/index.md b/public/content/translations/pl/developers/docs/apis/backend/index.md index f8d2ad39309..3991479a59e 100644 --- a/public/content/translations/pl/developers/docs/apis/backend/index.md +++ b/public/content/translations/pl/developers/docs/apis/backend/index.md @@ -12,7 +12,7 @@ Jeśli chcesz użyć określonego języka programowania do połączenia z węzł ## Warunki wstępne {#prerequisites} -Pomocne może być zrozumienie [stosu Ethereum](/developers/docs/ethereum-stack/) i [klientów Ethereum](/docs/nodes-and-clients/). +Pomocne może być zrozumienie [stosu Ethereum](/developers/docs/ethereum-stack/) i [klientów Ethereum](/developers/docs/nodes-and-clients/). ## Dlaczego warto użyć biblioteki? {#why-use-a-library} diff --git a/public/content/translations/pl/developers/docs/standards/tokens/index.md b/public/content/translations/pl/developers/docs/standards/tokens/index.md index 1f049eac59c..6f89f69c06e 100644 --- a/public/content/translations/pl/developers/docs/standards/tokens/index.md +++ b/public/content/translations/pl/developers/docs/standards/tokens/index.md @@ -29,5 +29,5 @@ _Znasz jakieś zasoby społeczności, które Ci pomogły? Wyedytuj tę stronę - [Lista kontrolna integracji tokenów](/developers/tutorials/token-integration-checklist/) _– lista kontrolna rzeczy, które należy wziąć pod uwagę podczas interakcji z tokenami._ - [Zrozumienie inteligentnego kontraktu tokena ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– wprowadzenie do wdrożenie pierwszego inteligentnego kontraktu w sieci testowej Ethereum._ -- [Przenoszenie i zatwierdzanie tokenów ERC20 z inteligentnego kontraktu Solidity](/developers/tutorials/transfers-and-approval-of-erc20-tokens-from-a-solidity-smart-contract/) _– jak używać inteligentnego kontraktu do interakcji z tokenem przy użyciu języka Solidity._ +- [Przenoszenie i zatwierdzanie tokenów ERC20 z inteligentnego kontraktu Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– jak używać inteligentnego kontraktu do interakcji z tokenem przy użyciu języka Solidity._ - [Wdrażanie rynku ERC721 [przewodnik]](/developers/tutorials/how-to-implement-an-erc721-market/) _– jak wystawiać tokenizowane przedmioty na sprzedaż na zdecentralizowanej tablicy ogłoszeń._ diff --git a/public/content/translations/pl/roadmap/merge/index.md b/public/content/translations/pl/roadmap/merge/index.md index fa1a0f771c9..43d2e4ec6f8 100644 --- a/public/content/translations/pl/roadmap/merge/index.md +++ b/public/content/translations/pl/roadmap/merge/index.md @@ -135,7 +135,7 @@ title="Błędne przekonanie: „w wyniku fuzji nie udało się obniżyć opłat contentPreview="False. The Merge was a change of consensus mechanism, not an expansion of network capacity, and was never intended to lower gas fees."> Opłaty za gaz są wypadkową zapotrzebowania na sieć i jej przepustowości. W wyniku Połączenia zrezygnowano z mechanizmu proof-of-work, przechodząc na mechanizm konsensusu proof-of-stake, ale nie zmieniono znacząco żadnych parametrów, które bezpośrednio wpływają na przepustowość sieci. -W ramach [planu działania skoncentrowanego na pakietach zbiorczych](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) wysiłki koncentrują się na zwiększeniu aktywności użytkowników w [warstwie 2](/warstwa-2/), przy jednoczesnym umożliwieniu działania sieci głównej w warstwie 1 jako bezpiecznej, zdecentralizowanej warstwy rozliczenia, zoptymalizowanej do przechowywania danych pakietów zbiorczych, co pomoże uczynić transakcje na pakietach zbiorczych wykładniczo tańszymi. Przejście na proof-of-stake jest kluczowym prekursorem realizacji tego celu. [Więcej o gazie i opłatach](/developers/docs/gas/) +W ramach [planu działania skoncentrowanego na pakietach zbiorczych](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) wysiłki koncentrują się na zwiększeniu aktywności użytkowników w [warstwie 2](/layer-2/), przy jednoczesnym umożliwieniu działania sieci głównej w warstwie 1 jako bezpiecznej, zdecentralizowanej warstwy rozliczenia, zoptymalizowanej do przechowywania danych pakietów zbiorczych, co pomoże uczynić transakcje na pakietach zbiorczych wykładniczo tańszymi. Przejście na proof-of-stake jest kluczowym prekursorem realizacji tego celu. [Więcej o gazie i opłatach](/developers/docs/gas/) Date: Fri, 23 Feb 2024 16:02:56 +0000 Subject: [PATCH 455/478] Broken links --- .../translations/ro/developers/docs/standards/tokens/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ro/developers/docs/standards/tokens/index.md b/public/content/translations/ro/developers/docs/standards/tokens/index.md index 18a44859401..58fbf432d8c 100644 --- a/public/content/translations/ro/developers/docs/standards/tokens/index.md +++ b/public/content/translations/ro/developers/docs/standards/tokens/index.md @@ -31,5 +31,5 @@ _Cunoașteți o resursă a comunității care v-a ajutat? Editaţi această pagi - [Lista de verificare pentru integrarea tokenurilor](/developers/tutorials/token-integration-checklist/) _– O listă de verificare a elementelor de luat în considerare atunci când interacționaţi cu tokenurile._ - [Înțelegerea contractului inteligent de tokenuri ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– O introducere în implementarea primului dvs. contract inteligent într-o rețea de testare Ethereum._ -- [Transferuri și aprobare de tokenuri ERC20 dintr-un contract inteligent Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contracct/) _- Cum să utilizaţi un contract inteligent pentru a interacționa cu un token folosind limbajul Solidity._ +- [Transferuri și aprobare de tokenuri ERC20 dintr-un contract inteligent Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _- Cum să utilizaţi un contract inteligent pentru a interacționa cu un token folosind limbajul Solidity._ - [Implementarea unei piețe ERC721 [un ghid al modalităţilor de a o realiza]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Cum să puneţi la vânzare articole tokenizate pe un panou de anunțuri descentralizate._ From d287d6be38073c8acc4266f2a941fe785e711878 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 23 Feb 2024 16:25:44 +0000 Subject: [PATCH 456/478] Update Crowdin translation progress --- src/data/translationProgress.json | 304 +++++++++++++++--------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/src/data/translationProgress.json b/src/data/translationProgress.json index 59e3f858350..aca3891e1f5 100644 --- a/src/data/translationProgress.json +++ b/src/data/translationProgress.json @@ -3,637 +3,637 @@ "languageId": "af", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "am", "words": { - "approved": 10264, - "total": 340023 + "approved": 10516, + "total": 339941 } }, { "languageId": "ar", "words": { - "approved": 40831, - "total": 340023 + "approved": 40902, + "total": 339941 } }, { "languageId": "az", "words": { - "approved": 19233, - "total": 340023 + "approved": 29436, + "total": 339941 } }, { "languageId": "be", "words": { - "approved": 6512, - "total": 340023 + "approved": 6760, + "total": 339941 } }, { "languageId": "bg", "words": { - "approved": 15288, - "total": 340023 + "approved": 15409, + "total": 339941 } }, { "languageId": "bi", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "bn", "words": { - "approved": 36709, - "total": 340023 + "approved": 36780, + "total": 339941 } }, { "languageId": "br-FR", "words": { "approved": 82, - "total": 340023 + "total": 339941 } }, { "languageId": "bs", "words": { - "approved": 6512, - "total": 340023 + "approved": 6760, + "total": 339941 } }, { "languageId": "ca", "words": { - "approved": 20283, - "total": 340023 + "approved": 20404, + "total": 339941 } }, { "languageId": "cs", "words": { - "approved": 27147, - "total": 340023 + "approved": 41514, + "total": 339941 } }, { "languageId": "da", "words": { - "approved": 2087, - "total": 340023 + "approved": 2335, + "total": 339941 } }, { "languageId": "de", "words": { - "approved": 163389, - "total": 340023 + "approved": 166447, + "total": 339941 } }, { "languageId": "el", "words": { - "approved": 104170, - "total": 340023 + "approved": 104465, + "total": 339941 } }, { "languageId": "eo", "words": { "approved": 169, - "total": 340023 + "total": 339941 } }, { "languageId": "es-EM", "words": { - "approved": 327805, - "total": 340023 + "approved": 329876, + "total": 339941 } }, { "languageId": "et", "words": { "approved": 75, - "total": 340023 + "total": 339941 } }, { "languageId": "eu", "words": { "approved": 36, - "total": 340023 + "total": 339941 } }, { "languageId": "fa", "words": { - "approved": 96963, - "total": 340023 + "approved": 99242, + "total": 339941 } }, { "languageId": "fa-AF", "words": { "approved": 186, - "total": 340023 + "total": 339941 } }, { "languageId": "fi", "words": { - "approved": 23151, - "total": 340023 + "approved": 23380, + "total": 339941 } }, { "languageId": "fil", "words": { - "approved": 55116, - "total": 340023 + "approved": 55187, + "total": 339941 } }, { "languageId": "fr", "words": { - "approved": 335812, - "total": 340023 + "approved": 336161, + "total": 339941 } }, { "languageId": "gi", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "gl", "words": { - "approved": 1680, - "total": 340023 + "approved": 2199, + "total": 339941 } }, { "languageId": "gu-IN", "words": { - "approved": 1924, - "total": 340023 + "approved": 2431, + "total": 339941 } }, { "languageId": "ha", "words": { "approved": 4, - "total": 340023 + "total": 339941 } }, { "languageId": "he", "words": { - "approved": 1839, - "total": 340023 + "approved": 2223, + "total": 339941 } }, { "languageId": "hi", "words": { - "approved": 58037, - "total": 340023 + "approved": 58108, + "total": 339941 } }, { "languageId": "hr", "words": { - "approved": 14065, - "total": 340023 + "approved": 14180, + "total": 339941 } }, { "languageId": "hu", "words": { - "approved": 199117, - "total": 340023 + "approved": 201829, + "total": 339941 } }, { "languageId": "hy-AM", "words": { - "approved": 10264, - "total": 340023 + "approved": 10512, + "total": 339941 } }, { "languageId": "id", "words": { - "approved": 159747, - "total": 340023 + "approved": 159765, + "total": 339941 } }, { "languageId": "ig", "words": { - "approved": 23987, - "total": 340023 + "approved": 24352, + "total": 339941 } }, { "languageId": "it", "words": { - "approved": 335339, - "total": 340023 + "approved": 335275, + "total": 339941 } }, { "languageId": "ja", "words": { - "approved": 284322, - "total": 340023 + "approved": 287545, + "total": 339941 } }, { "languageId": "ka", "words": { - "approved": 2067, - "total": 340023 + "approved": 2315, + "total": 339941 } }, { "languageId": "kk", "words": { - "approved": 1773, - "total": 340023 + "approved": 2366, + "total": 339941 } }, { "languageId": "km", "words": { - "approved": 16244, - "total": 340023 + "approved": 16315, + "total": 339941 } }, { "languageId": "kn", "words": { - "approved": 27688, - "total": 340023 + "approved": 27759, + "total": 339941 } }, { "languageId": "ko", "words": { - "approved": 52457, - "total": 340023 + "approved": 53303, + "total": 339941 } }, { "languageId": "ku", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "ky", "words": { "approved": 12, - "total": 340023 + "total": 339941 } }, { "languageId": "lb", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "lt", "words": { - "approved": 2195, - "total": 340023 + "approved": 2714, + "total": 339941 } }, { "languageId": "mai", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "mk", "words": { "approved": 88, - "total": 340023 + "total": 339941 } }, { "languageId": "ml-IN", "words": { - "approved": 11949, - "total": 340023 + "approved": 12307, + "total": 339941 } }, { "languageId": "mn", "words": { "approved": 64, - "total": 340023 + "total": 339941 } }, { "languageId": "mr", "words": { - "approved": 26532, - "total": 340023 + "approved": 26603, + "total": 339941 } }, { "languageId": "ms", "words": { - "approved": 37764, - "total": 340023 + "approved": 37835, + "total": 339941 } }, { "languageId": "my", "words": { "approved": 706, - "total": 340023 + "total": 339941 } }, { "languageId": "ne-NP", "words": { - "approved": 2067, - "total": 340023 + "approved": 2315, + "total": 339941 } }, { "languageId": "nl", "words": { - "approved": 37990, - "total": 340023 + "approved": 38061, + "total": 339941 } }, { "languageId": "no", "words": { - "approved": 2335, - "total": 340023 + "approved": 2711, + "total": 339941 } }, { "languageId": "or", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "pa-IN", "words": { "approved": 6, - "total": 340023 + "total": 339941 } }, { "languageId": "pcm", "words": { - "approved": 17795, - "total": 340023 + "approved": 17866, + "total": 339941 } }, { "languageId": "pl", "words": { - "approved": 95690, - "total": 340023 + "approved": 95709, + "total": 339941 } }, { "languageId": "pt-BR", "words": { - "approved": 318546, - "total": 340023 + "approved": 318622, + "total": 339941 } }, { "languageId": "pt-PT", "words": { - "approved": 26642, - "total": 340023 + "approved": 26713, + "total": 339941 } }, { "languageId": "ro", "words": { - "approved": 78449, - "total": 340023 + "approved": 78570, + "total": 339941 } }, { "languageId": "ru", "words": { - "approved": 97033, - "total": 340023 + "approved": 96995, + "total": 339941 } }, { "languageId": "sat", "words": { "approved": 57, - "total": 340023 + "total": 339941 } }, { "languageId": "si-LK", "words": { "approved": 706, - "total": 340023 + "total": 339941 } }, { "languageId": "sk", "words": { - "approved": 6995, - "total": 340023 + "approved": 7243, + "total": 339941 } }, { "languageId": "sl", "words": { - "approved": 27027, - "total": 340023 + "approved": 27166, + "total": 339941 } }, { "languageId": "sn", "words": { "approved": 465, - "total": 340023 + "total": 339941 } }, { "languageId": "so", "words": { "approved": 493, - "total": 340023 + "total": 339941 } }, { "languageId": "sq", "words": { "approved": 693, - "total": 340023 + "total": 339941 } }, { "languageId": "sr-CS", "words": { - "approved": 26783, - "total": 340023 + "approved": 26854, + "total": 339941 } }, { "languageId": "sv-SE", "words": { - "approved": 10613, - "total": 340023 + "approved": 10874, + "total": 339941 } }, { "languageId": "sw", "words": { - "approved": 17140, - "total": 340023 + "approved": 17237, + "total": 339941 } }, { "languageId": "ta", "words": { - "approved": 2071, - "total": 340023 + "approved": 2319, + "total": 339941 } }, { "languageId": "te", "words": { "approved": 694, - "total": 340023 + "total": 339941 } }, { "languageId": "tg", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "th", "words": { - "approved": 6569, - "total": 340023 + "approved": 6817, + "total": 339941 } }, { "languageId": "ti", "words": { "approved": 0, - "total": 340023 + "total": 339941 } }, { "languageId": "tk", "words": { - "approved": 6514, - "total": 340023 + "approved": 6762, + "total": 339941 } }, { "languageId": "tl", "words": { "approved": 86, - "total": 340023 + "total": 339941 } }, { "languageId": "tr", "words": { - "approved": 320889, - "total": 340023 + "approved": 320901, + "total": 339941 } }, { "languageId": "uk", "words": { - "approved": 64983, - "total": 340023 + "approved": 65054, + "total": 339941 } }, { "languageId": "ur-IN", "words": { - "approved": 1838, - "total": 340023 + "approved": 2315, + "total": 339941 } }, { "languageId": "ur-PK", "words": { "approved": 725, - "total": 340023 + "total": 339941 } }, { "languageId": "uz", "words": { - "approved": 2496, - "total": 340023 + "approved": 2907, + "total": 339941 } }, { "languageId": "vi", "words": { - "approved": 16708, - "total": 340023 + "approved": 19284, + "total": 339941 } }, { "languageId": "yo", "words": { "approved": 687, - "total": 340023 + "total": 339941 } }, { "languageId": "zh-CN", "words": { - "approved": 306060, - "total": 340023 + "approved": 311060, + "total": 339941 } }, { "languageId": "zh-TW", "words": { - "approved": 113683, - "total": 340023 + "approved": 125769, + "total": 339941 } }, { "languageId": "zu", "words": { "approved": 109, - "total": 340023 + "total": 339941 } } ] \ No newline at end of file From 0f9ae18b251e9f9bced81f71aa32734f1526485f Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Sun, 25 Feb 2024 02:15:40 +0000 Subject: [PATCH 457/478] Update Crowdin contributors --- src/data/crowdin/combined-translators.json | 2420 +++++++++++++++++--- 1 file changed, 2073 insertions(+), 347 deletions(-) diff --git a/src/data/crowdin/combined-translators.json b/src/data/crowdin/combined-translators.json index 42ed3dd27fe..d706d8d9c3f 100644 --- a/src/data/crowdin/combined-translators.json +++ b/src/data/crowdin/combined-translators.json @@ -8828,6 +8828,12 @@ "totalCosts": 159.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14995487/medium/f890d1e85e50d0289ca19930aae629d1.png" }, + { + "id": 15448050, + "username": "santi-gnzlz", + "totalCosts": 91.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15448050/medium/b795cd3e997f1157bb866ef1a077fef2.png" + }, { "id": 15946267, "username": "socopower", @@ -13011,462 +13017,1987 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" } ] - } - ] - }, - { - "lang": "fa", - "data": [ + }, { - "fileId": "6161", + "fileId": "7631", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 158.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15194310, + "username": "MGETH", + "totalCosts": 2880.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 113.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" } ] }, { - "fileId": "6163", + "fileId": "6241", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 347.44, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15153752, + "username": "jumagios", + "totalCosts": 641.35, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15153752/medium/4c5ec8941f8b5f636035a6ca16df9b8d.jpeg" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 94.94, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15123407, + "username": "JDAL", + "totalCosts": 346.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15123407/medium/dfea944357736aa8f0908f38c8bd97a8_default.png" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 41.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 15061909, + "username": "lealp22", + "totalCosts": 204.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15061909/medium/418c844e1b58b7da484f33f1fb1eaaae.jpeg" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 34.34, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" - } - ] - }, - { - "fileId": "6185", - "contributors": [ + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 124.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + }, { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 266.64, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15153604, + "username": "DiegoRodriguezM", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15153604/medium/11569f93ca6c50d1f1039d949c390a8e.jpeg" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 47.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15383024, + "username": "alx255", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15383024/medium/b9e5bd7a7d9dfc1012d3d820da36f6e2_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" - } - ] - }, - { - "fileId": "6165", - "contributors": [ + "id": 15966545, + "username": "askr", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966545/medium/350ebd9c64c3a9a5244827c6f34d05e7_default.png" + }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 23.23, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + }, + { + "id": 15487308, + "username": "newton099", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15487308/medium/4039f2f3c1d992a73045fe97fb41aecc.png" } ] }, { - "fileId": "6167", + "fileId": "3056", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 451.47, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 14750970, + "username": "joab83", + "totalCosts": 219.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14750970/medium/0b87f19553c843060ce216cdd76f919d_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 114.13, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 14834276, + "username": "ElTitoDG", + "totalCosts": 148.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14834276/medium/403ec82c5eab442ae648bc5290a0e6b9.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 14737978, + "username": "ZeroSlayer", + "totalCosts": 95.95, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14737978/medium/d188e89855364d34aad1be1959f11ae6_default.png" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" - } - ] - }, - { - "fileId": "5559", - "contributors": [ - { - "id": 15074339, - "username": "mmp8103", - "totalCosts": 266.64, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15074339/medium/5199c5dafe0b10d9bf8a99c34ff3a277.png" + "id": 14867212, + "username": "haritz_950423", + "totalCosts": 79.79, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14867212/medium/f2d03c7459424f9158deca133bb7a6db.jpeg" }, { - "id": 15855621, - "username": "subriper", - "totalCosts": 220.18, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15855621/medium/ab1a2868b313e6dfc113a754286d37d5.jpg" + "id": 14778126, + "username": "Thalma", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14778126/medium/3927ee487076db1a7dd83d45a6d2dc64.jpeg" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 90.9, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 14652060, + "username": "JazminVidal", + "totalCosts": 56.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14652060/medium/a4f3c9974a51710ea11e87a24ac2df27.png" }, { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 81.81, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15080289, + "username": "mattiaverduci", + "totalCosts": 39.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080289/medium/f3c6e7873da71c5307ba187c9e6ebf50.jpeg" }, { - "id": 14814690, - "username": "khodaarahmi", + "id": 14631802, + "username": "edgargrau", "totalCosts": 37.37, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814690/medium/22dbf1e43823e76cb094bff3fdcca212.jpeg" - } - ] - }, - { - "fileId": "5561", - "contributors": [ + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 2924.96, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 14990899, + "username": "juan.baranowa", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14990899/medium/c7ef51465c9acf0f30c989ec42d6d5d2.png" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 158.57, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15061909, + "username": "lealp22", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15061909/medium/418c844e1b58b7da484f33f1fb1eaaae.jpeg" }, { - "id": 14951357, - "username": "AH1309", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14951357/medium/8791c0b99febb787a5293b1b8487a6a9_default.png" + "id": 14943545, + "username": "k.otika", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14943545/medium/8591b0d6e4eb6d5cf6fb49acabda89d3_default.png" } ] }, { - "fileId": "2766", + "fileId": "3124", "contributors": [ { - "id": 14733070, - "username": "loopersosa", - "totalCosts": 435.31, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733070/medium/14f75ef000001434196357bca4f22490.jpg" - }, - { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 290.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 13522334, + "username": "santy95_77", + "totalCosts": 303, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13522334/medium/16d302ea919c1608cfa57af85221ca86.jpeg" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 219.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 14992061, + "username": "Divanny", + "totalCosts": 251.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14992061/medium/932dae148005c8671a50691ac97b7ddc.jpeg" }, { - "id": 15002741, - "username": "dariusheslamipor", - "totalCosts": 205.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15002741/medium/368ee2e7888434a922e5781aa2c194bf.jpeg" + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 167.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" }, { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 66.66, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 13450175, + "username": "elchany2003", + "totalCosts": 113.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13450175/medium/1512f06d16de820437e75b308d57fd1a.jpg" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 53.53, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15194310, + "username": "MGETH", + "totalCosts": 96.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 17.17, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 15111835, + "username": "LeonelM21", + "totalCosts": 93.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15111835/medium/5df70e80366ef94764ad8cbde854d2a5.png" }, { - "id": 14555882, - "username": "ElAmir", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14555882/medium/47bd8403dc0a881324cf1d5aef976a7b.jpg" + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 33.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" }, { - "id": 15793733, - "username": "mahdishahabnia10", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15793733/medium/530cfa36d26d8b01474098c8952b0478.png" + "id": 15946267, + "username": "socopower", + "totalCosts": 18.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg" } ] }, { - "fileId": "2704", + "fileId": "7995", "contributors": [ { - "id": 15947697, - "username": "mahdigachloo33", - "totalCosts": 712.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947697/medium/6d060369501296118d0d9155a941096a.jpeg" - }, - { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 69.69, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 870.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 14555882, - "username": "ElAmir", - "totalCosts": 15.15, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14555882/medium/47bd8403dc0a881324cf1d5aef976a7b.jpg" - }, + "id": 15194310, + "username": "MGETH", + "totalCosts": 294.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + } + ] + }, + { + "fileId": "6267", + "contributors": [ { - "id": 14733070, - "username": "loopersosa", - "totalCosts": 10.1, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733070/medium/14f75ef000001434196357bca4f22490.jpg" + "id": 15085311, + "username": "bunturx", + "totalCosts": 1864.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "id": 15178052, + "username": "sudokunym", + "totalCosts": 324.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15178052/medium/6d7cf49c669b00f2bcaa28716d078bc0.jpeg" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 2.02, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" } ] }, { - "fileId": "2702", + "fileId": "6243", "contributors": [ { - "id": 15967125, - "username": "erfanej", - "totalCosts": 604.99, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 15109143, + "username": "avelinomunoz.13.990", + "totalCosts": 1725.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15109143/medium/15bc93dea94521f060a6ca73118ace17.png" }, { - "id": 15947697, - "username": "mahdigachloo33", - "totalCosts": 293.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947697/medium/6d060369501296118d0d9155a941096a.jpeg" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 989.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 16001243, - "username": "0xArkonomi", - "totalCosts": 142.41, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16001243/medium/b75b58e1e84d60e633167eb068b1253e.jpg" + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 588.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 108.07, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 209.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 107.06, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15155208, + "username": "doblea59", + "totalCosts": 150.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155208/medium/10c38f6da511bcb1a7cd9e99bb851b0f.jpeg" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 21.21, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "id": 15271124, + "username": "gael.jggs", + "totalCosts": 99.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15271124/medium/40d1d2789aa8aa4e636b32dd7d925186_default.png" } ] }, { - "fileId": "2712", + "fileId": "7627", "contributors": [ { - "id": 15967125, - "username": "erfanej", - "totalCosts": 496.92, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 1374.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 272.7, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15857153, + "username": "eugedelaoliva93", + "totalCosts": 84.84, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15857153/medium/f7cd69b42365e152a5b853421ed0b61d.jpeg" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 188.87, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 16059186, + "username": "Netchevereone", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16059186/medium/22e49dddeab741905dffdac1d01f0ed0_default.png" } ] }, { - "fileId": "2710", + "fileId": "3100", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 464.6, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 14872676, + "username": "VLN_1", + "totalCosts": 287.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14872676/medium/8d173c43fac87f0975a31275048360c8.jpeg" }, { - "id": 15967125, - "username": "erfanej", - "totalCosts": 293.91, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 12673086, + "username": "alvaro3639", + "totalCosts": 112.11, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12673086/medium/c4dd31ecaaffcae28a9ec421a8a12248.jpg" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 240.38, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15085311, + "username": "bunturx", + "totalCosts": 110.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 83.83, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 69.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 15566383, - "username": "raminvalizadeh29", - "totalCosts": 28.28, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15566383/medium/adf7b433679fa9f895b77e19223a2e70.jpeg" + "id": 12596551, + "username": "lidiam", + "totalCosts": 60.6, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12596551/medium/4d64ba444829e0a830179079cbf8fd80.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" - } - ] - }, - { - "fileId": "2716", - "contributors": [ - { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 739.32, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 14834276, + "username": "ElTitoDG", + "totalCosts": 43.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14834276/medium/403ec82c5eab442ae648bc5290a0e6b9.png" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 447.43, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 14778992, + "username": "IsmaelRC", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14778992/medium/646865835d4b959bf3bfca67b66ef04f.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 88.88, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" }, { - "id": 15967119, - "username": "timtey", - "totalCosts": 16.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + "id": 14755966, + "username": "RealGoye", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14755966/medium/f5becfea2dd543f57f356dfb3e42487d_default.png" } ] }, { - "fileId": "2908", + "fileId": "3160", "contributors": [ { - "id": 15097099, - "username": "nader.sedigh", - "totalCosts": 622.16, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + "id": 15085311, + "username": "bunturx", + "totalCosts": 849.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 156.55, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15002443, + "username": "Pamelaocampo444", + "totalCosts": 57.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15002443/medium/89be2efab05a804101bdf30622d0f983_default.png" }, { - "id": 15233666, - "username": "Alifarhani", - "totalCosts": 94.94, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + "id": 15084601, + "username": "metanube", + "totalCosts": 54.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084601/medium/7e8ee6ec15e9d0be68e2c6ff9a0b34c8_default.png" }, { - "id": 15967115, - "username": "itsdeeters", - "totalCosts": 29.29, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 49.49, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" }, { - "id": 14665754, - "username": "R3z4_Pr0gramm3r", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + "id": 13566526, + "username": "guido.gentile.1995", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13566526/medium/fbe52bcbb93ae7e2bf52c85b6ea5d5f5.jpg" + }, + { + "id": 15080733, + "username": "Kuitlahuak", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15080733/medium/9fd244d47265c127c5c0d3cfe4ebf4b2_default.png" + }, + { + "id": 15087823, + "username": "Alvaro203204", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15087823/medium/bfdfab68e4c4b9482f9c7f533ec845c9.png" } ] }, { - "fileId": "2860", + "fileId": "7999", "contributors": [ { - "id": 15967125, - "username": "erfanej", - "totalCosts": 921.12, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + "id": 15194310, + "username": "MGETH", + "totalCosts": 3253.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" }, { - "id": 15099529, - "username": "Aria-Naraghi", - "totalCosts": 155.54, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 2218.97, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + } + ] + }, + { + "fileId": "3074", + "contributors": [ + { + "id": 14834276, + "username": "ElTitoDG", + "totalCosts": 388.85, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14834276/medium/403ec82c5eab442ae648bc5290a0e6b9.png" + }, + { + "id": 14911627, + "username": "marcoporracin", + "totalCosts": 168.67, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14911627/medium/29719c7ebb665982afa5447e382aeb13.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 90.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 59.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" + }, + { + "id": 14778126, + "username": "Thalma", + "totalCosts": 42.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14778126/medium/3927ee487076db1a7dd83d45a6d2dc64.jpeg" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 18.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + } + ] + }, + { + "fileId": "3120", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 398.95, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15401858, + "username": "andykamin3", + "totalCosts": 120.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15401858/medium/8ef405a63e7eaade682b4a8059685184.jpeg" + }, + { + "id": 14807238, + "username": "rom1919", + "totalCosts": 61.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14807238/medium/4e9d7e22b8ba45851bf0d10bf4bb2f68.jpeg" + }, + { + "id": 15480452, + "username": "asusrid", + "totalCosts": 18.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15480452/medium/39ea3acb0c4e9143d7fba152016d26c7_default.png" + }, + { + "id": 25420, + "username": "Ryo567", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/25420/medium/c407ca20cecfad35ba1bc9ef42232137.png" + } + ] + }, + { + "fileId": "3164", + "contributors": [ + { + "id": 15084601, + "username": "metanube", + "totalCosts": 1558.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084601/medium/7e8ee6ec15e9d0be68e2c6ff9a0b34c8_default.png" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 106.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15082987, + "username": "Grampus", + "totalCosts": 45.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15082987/medium/3745aa71b5e8897fcee2ab6c9e9a26fe.jpeg" + }, + { + "id": 15070281, + "username": "SZ14RT", + "totalCosts": 41.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15070281/medium/dc29b1568f0c3b8fb54a0a6724e2f13b_default.png" + }, + { + "id": 14682564, + "username": "rich1n", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14682564/medium/3198f898fb53f31fa32bf08236627a34.jpeg" + } + ] + }, + { + "fileId": "2994", + "contributors": [ + { + "id": 14886730, + "username": "charlyzona", + "totalCosts": 2024.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14886730/medium/5f19a49b0b330b8b575eee9a41d7faac.jpeg" + }, + { + "id": 14791370, + "username": "williamx", + "totalCosts": 122.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14791370/medium/59d86e6d660482edfdda6487b7fc1205_default.png" + }, + { + "id": 14885094, + "username": "FrancoElicabe", + "totalCosts": 31.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14885094/medium/ff9074ceb417d440b86adcd9172cc6e6_default.png" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 14823390, + "username": "bitgalea", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823390/medium/443d0c232ef980933088d87cccbceadf_default.png" + }, + { + "id": 14890278, + "username": "Hephaistos357", + "totalCosts": 10.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14890278/medium/7fd731668afeab1f389fbe0b256f0619.png" + }, + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + }, + { + "id": 14943545, + "username": "k.otika", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14943545/medium/8591b0d6e4eb6d5cf6fb49acabda89d3_default.png" + } + ] + }, + { + "fileId": "2986", + "contributors": [ + { + "id": 15085311, + "username": "bunturx", + "totalCosts": 569.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" + }, + { + "id": 15966349, + "username": "chiogonzalezt", + "totalCosts": 534.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966349/medium/1d277519e5b8ccdfc1de7b60ec89e1b0.jpeg" + }, + { + "id": 14865328, + "username": "Lostday", + "totalCosts": 239.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14865328/medium/16e7617eadda7d8511b4bcc3c6e5ae57_default.png" + }, + { + "id": 15061725, + "username": "octaaaa", + "totalCosts": 221.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15061725/medium/4bf352fdf48fcda0d615d83b89ae4263.png" + }, + { + "id": 14791370, + "username": "williamx", + "totalCosts": 125.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14791370/medium/59d86e6d660482edfdda6487b7fc1205_default.png" + }, + { + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 47.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" + }, + { + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, + { + "id": 15224384, + "username": "mezaj4486", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15224384/medium/a2a78d9a9f74c8e5a5c47cd503aa557d.png" + } + ] + }, + { + "fileId": "6259", + "contributors": [ + { + "id": 15154968, + "username": "Secvndvs", + "totalCosts": 170.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15154968/medium/63bd618dfc395cc82c1ba5119280c40c_default.png" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 160.59, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15998451, + "username": "gato1904", + "totalCosts": 52.52, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15998451/medium/b48c75b54930b781a82c9146d5ba2daf.png" + }, + { + "id": 15674887, + "username": "Charlyboy", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15674887/medium/adf7358a1af66b39938e57334b2ce312.jpg" + } + ] + }, + { + "fileId": "3088", + "contributors": [ + { + "id": 14687676, + "username": "joseachemazzei", + "totalCosts": 342.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14687676/medium/dc4cef6c7ba35e45690a3cbfb2db7009.jpg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 212.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 14776878, + "username": "JoshNX", + "totalCosts": 141.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14776878/medium/21ac9de5adfcb01ba92df55ea1428126_default.png" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, + { + "id": 14964031, + "username": "Charlongolo", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14964031/medium/1fcad8b23307ba5ad33dac76e91ee6a3.png" + } + ] + }, + { + "fileId": "3116", + "contributors": [ + { + "id": 15191278, + "username": "julioenrique19", + "totalCosts": 827.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15191278/medium/93a3b7e041a6ed6bb7f72586f223ebd8.png" + }, + { + "id": 14682564, + "username": "rich1n", + "totalCosts": 194.93, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14682564/medium/3198f898fb53f31fa32bf08236627a34.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 106.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 14320782, + "username": "JoseDeFreitas", + "totalCosts": 80.8, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14320782/medium/db9b49609d804eb2048076de466d3162_default.png" + }, + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + } + ] + }, + { + "fileId": "6261", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 805.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15294248, + "username": "kempo17", + "totalCosts": 157.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15294248/medium/5b2b23f53504fd6a13a351ee58209ec7_default.png" + }, + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 148.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + }, + { + "id": 15161680, + "username": "agustinasegat", + "totalCosts": 104.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15161680/medium/62b2a3ce8e4003b84a0fceb6be409bba.jpeg" + }, + { + "id": 15186514, + "username": "Nach3", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15186514/medium/e053f5e70fadd69a00fce56662e286fa_default.png" + } + ] + }, + { + "fileId": "2980", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 104.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 14935087, + "username": "Martinpons", + "totalCosts": 88.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14935087/medium/a96e2edf880e873237f137148aa343c1_default.png" + }, + { + "id": 15425492, + "username": "luenconi", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15425492/medium/d0d3884eb7d2b3f03f3e8e6c56c9b787.jpeg" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 55.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, + { + "id": 15094993, + "username": "javier.donoso", + "totalCosts": 45.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15094993/medium/824cbde6ec1e62405249bcf060ef90d1.jpeg" + }, + { + "id": 14977143, + "username": "David0", + "totalCosts": 39.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14977143/medium/6ffd071efb4fab7bd5081b6e579dc0c9_default.png" + }, + { + "id": 15423118, + "username": "samuelproxd1", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15423118/medium/0b73e2850265eaffa68201bc0c8a026c.jpeg" + }, + { + "id": 14791370, + "username": "williamx", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14791370/medium/59d86e6d660482edfdda6487b7fc1205_default.png" + } + ] + }, + { + "fileId": "6245", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 803.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15155208, + "username": "doblea59", + "totalCosts": 430.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155208/medium/10c38f6da511bcb1a7cd9e99bb851b0f.jpeg" + }, + { + "id": 14763374, + "username": "elmarceloc", + "totalCosts": 94.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14763374/medium/25a8ac3837c276bc3a9e89b158668552.png" + }, + { + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 33.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" + } + ] + }, + { + "fileId": "6263", + "contributors": [ + { + "id": 15085311, + "username": "bunturx", + "totalCosts": 566.61, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 171.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + } + ] + }, + { + "fileId": "6432", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 2926.98, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 1258.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, + { + "id": 16028920, + "username": "paopastorelli", + "totalCosts": 41.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16028920/medium/e3049f379e035388449ee79ea5b75888.jpeg" + }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + } + ] + }, + { + "fileId": "6436", + "contributors": [ + { + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 3484.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + } + ] + }, + { + "fileId": "7308", + "contributors": [ + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 2874.46, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, + { + "id": 15881053, + "username": "luxxing", + "totalCosts": 70.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15881053/medium/95bd3e1a44d660c405ba34c0732edbcc_default.png" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 54.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + } + ] + }, + { + "fileId": "3144", + "contributors": [ + { + "id": 15085311, + "username": "bunturx", + "totalCosts": 457.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" + }, + { + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" + }, + { + "id": 14958987, + "username": "fernanmartine", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14958987/medium/c3675bae5c0086400ebe95c94d4a4580_default.png" + } + ] + }, + { + "fileId": "6247", + "contributors": [ + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 207.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + } + ] + }, + { + "fileId": "3138", + "contributors": [ + { + "id": 15083265, + "username": "siulnairda", + "totalCosts": 448.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15083265/medium/827dfe415bb9980315b0256b43afbe67.png" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 410.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 14763374, + "username": "elmarceloc", + "totalCosts": 119.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14763374/medium/25a8ac3837c276bc3a9e89b158668552.png" + }, + { + "id": 15247956, + "username": "kenip", + "totalCosts": 60.6, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15247956/medium/d5a5d69f6aecc80fe75873d940743a36.png" + }, + { + "id": 15966545, + "username": "askr", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966545/medium/350ebd9c64c3a9a5244827c6f34d05e7_default.png" + }, + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + } + ] + }, + { + "fileId": "3156", + "contributors": [ + { + "id": 15084601, + "username": "metanube", + "totalCosts": 255.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084601/medium/7e8ee6ec15e9d0be68e2c6ff9a0b34c8_default.png" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 140.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15966545, + "username": "askr", + "totalCosts": 70.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966545/medium/350ebd9c64c3a9a5244827c6f34d05e7_default.png" + } + ] + }, + { + "fileId": "7304", + "contributors": [ + { + "id": 15966349, + "username": "chiogonzalezt", + "totalCosts": 750.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15966349/medium/1d277519e5b8ccdfc1de7b60ec89e1b0.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 749.42, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 432.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + }, + { + "id": 15770841, + "username": "Angelito_18", + "totalCosts": 134.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15770841/medium/f82644a45b17eed3facb1815dcc83d13.jpeg" + } + ] + }, + { + "fileId": "2998", + "contributors": [ + { + "id": 14886730, + "username": "charlyzona", + "totalCosts": 919.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14886730/medium/5f19a49b0b330b8b575eee9a41d7faac.jpeg" + }, + { + "id": 14656338, + "username": "transgresor_metal", + "totalCosts": 88.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14656338/medium/994846d1f939b5a9efdafa335adcc091.jpeg" + }, + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 57.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + }, + { + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" + } + ] + }, + { + "fileId": "3148", + "contributors": [ + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 498.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + }, + { + "id": 15087823, + "username": "Alvaro203204", + "totalCosts": 151.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15087823/medium/bfdfab68e4c4b9482f9c7f533ec845c9.png" + }, + { + "id": 15474196, + "username": "Ivan_Sarapura", + "totalCosts": 20.2, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15474196/medium/7d0c8d1b9a3745f3d1dbfaec3ab9e4a2.jpeg" + }, + { + "id": 14964031, + "username": "Charlongolo", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14964031/medium/1fcad8b23307ba5ad33dac76e91ee6a3.png" + } + ] + }, + { + "fileId": "6265", + "contributors": [ + { + "id": 15161680, + "username": "agustinasegat", + "totalCosts": 151.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15161680/medium/62b2a3ce8e4003b84a0fceb6be409bba.jpeg" + }, + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + } + ] + }, + { + "fileId": "3036", + "contributors": [ + { + "id": 15085311, + "username": "bunturx", + "totalCosts": 235.33, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" + }, + { + "id": 15058949, + "username": "gracieluu_ar", + "totalCosts": 214.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15058949/medium/c8bf678ba85795ea778fbc67e30f0733.jpeg" + }, + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 163.62, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 14914189, + "username": "carloscuadro", + "totalCosts": 117.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14914189/medium/7ec4ee047758da8e4a91c37eeda0f674_default.png" + }, + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 84.84, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + }, + { + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 69.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + }, + { + "id": 14779212, + "username": "matthewrock2011", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14779212/medium/39661a937aa3dc153a7acd8d06b4a8fd.jpeg" + }, + { + "id": 15946267, + "username": "socopower", + "totalCosts": 51.51, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg" + }, + { + "id": 14690796, + "username": "Elksomi", + "totalCosts": 40.4, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14690796/medium/660146d2708cef70c249f33235e06eb5_default.png" + }, + { + "id": 14752336, + "username": "Necis", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14752336/medium/208a2993fae0ba74355502af0dbf7bd4_default.png" + }, + { + "id": 14865328, + "username": "Lostday", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14865328/medium/16e7617eadda7d8511b4bcc3c6e5ae57_default.png" + }, + { + "id": 14320782, + "username": "JoseDeFreitas", + "totalCosts": 12.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14320782/medium/db9b49609d804eb2048076de466d3162_default.png" + }, + { + "id": 13510211, + "username": "MirageIonova", + "totalCosts": 6.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13510211/medium/f447099407b409a18ab34d7829683e43.png" + }, + { + "id": 14964031, + "username": "Charlongolo", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14964031/medium/1fcad8b23307ba5ad33dac76e91ee6a3.png" + }, + { + "id": 14861960, + "username": "isaul", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14861960/medium/96f44a8792e2cf800d5e2f1545bee4a3_default.png" + } + ] + }, + { + "fileId": "3010", + "contributors": [ + { + "id": 14948857, + "username": "ultralord97", + "totalCosts": 366.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14948857/medium/34c7ec153c8ed21b3c11340e8dda6641_default.png" + }, + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 351.48, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + }, + { + "id": 14702332, + "username": "joaquindeleonamerio", + "totalCosts": 209.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14702332/medium/f5e389288946c3f0bd1b305fdb383daf.jpg" + }, + { + "id": 15085311, + "username": "bunturx", + "totalCosts": 108.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15085311/medium/ead5dd5aa5070be2f8d446c286f27d7a.jpeg" + }, + { + "id": 14953547, + "username": "Tostaito", + "totalCosts": 82.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14953547/medium/49fb806cf50b5b40e0539f0bd1ef2445_default.png" + }, + { + "id": 14865328, + "username": "Lostday", + "totalCosts": 70.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14865328/medium/16e7617eadda7d8511b4bcc3c6e5ae57_default.png" + }, + { + "id": 14763374, + "username": "elmarceloc", + "totalCosts": 50.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14763374/medium/25a8ac3837c276bc3a9e89b158668552.png" + }, + { + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 38.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + }, + { + "id": 15542547, + "username": "Andrew22123", + "totalCosts": 26.26, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15542547/medium/fffae8cd8da3c88db943d27cc0e4208b_default.png" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + } + ] + }, + { + "fileId": "3092", + "contributors": [ + { + "id": 14481500, + "username": "Diana1941", + "totalCosts": 1012.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14481500/medium/4f38cf223b0db6882a77961b52ca9eb1_default.png" + }, + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 422.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + }, + { + "id": 15155844, + "username": "CryptoSpace", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15155844/medium/6e6407e27f509308774f480afe52ff7d.png" + }, + { + "id": 15255998, + "username": "rolandopiconnadales", + "totalCosts": 14.14, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15255998/medium/43dc1eaa54592e9e6c019bef41e1e4eb.jpeg" + }, + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 13.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + } + ] + }, + { + "fileId": "3024", + "contributors": [ + { + "id": 15194310, + "username": "MGETH", + "totalCosts": 9.09, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg" + }, + { + "id": 16224092, + "username": "coscujin64", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16224092/medium/3d8af10f6adb207ed307b53a2942fe16.png" + }, + { + "id": 14777840, + "username": "educordobac", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14777840/medium/28e0c7c5a9b9377a04173c40e52eb5f2.jpeg" + }, + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + }, + { + "id": 14865328, + "username": "Lostday", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14865328/medium/16e7617eadda7d8511b4bcc3c6e5ae57_default.png" + } + ] + }, + { + "fileId": "3070", + "contributors": [ + { + "id": 14652358, + "username": "Iberriak", + "totalCosts": 155.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14652358/medium/b670537abb6dfccf1ff57ac170a7d1ee.jpeg" + }, + { + "id": 14865328, + "username": "Lostday", + "totalCosts": 145.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14865328/medium/16e7617eadda7d8511b4bcc3c6e5ae57_default.png" + }, + { + "id": 15553253, + "username": "EmelyGarcia", + "totalCosts": 76.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15553253/medium/2077ec790711bf21dd6cad91f776f003.png" + }, + { + "id": 15135505, + "username": "Andrea00P", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15135505/medium/8e95dff743c0a7e4feedb53ef122eba5_default.png" + }, + { + "id": 15506008, + "username": "RvalM", + "totalCosts": 31.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15506008/medium/4fc0dc01596dd2eaffca626acccd754c_default.png" + }, + { + "id": 15373568, + "username": "erick.marro2000", + "totalCosts": 30.3, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15373568/medium/7c6f24a85885abafd0a8c67b450e71a8.png" + }, + { + "id": 14935087, + "username": "Martinpons", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14935087/medium/a96e2edf880e873237f137148aa343c1_default.png" + }, + { + "id": 14987673, + "username": "vlunaram", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14987673/medium/e34007ba233ab626cef7659c13a7d685_default.png" + }, + { + "id": 16224092, + "username": "coscujin64", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16224092/medium/3d8af10f6adb207ed307b53a2942fe16.png" + }, + { + "id": 14631802, + "username": "edgargrau", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14631802/medium/49b31ee9ceace460558cf61dcaaa1e2f.jpeg" + } + ] + }, + { + "fileId": "3110", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 732.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + }, + { + "id": 15193964, + "username": "MrAlizarinCrimson", + "totalCosts": 68.68, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15193964/medium/c6d2e5c698abf1ad8d755ef78ebbe86b.jpg" + }, + { + "id": 15946101, + "username": "w1lkns", + "totalCosts": 63.63, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15946101/medium/3d2813e6686c380c0a74b58d86b12c3d.jpeg" + }, + { + "id": 15084601, + "username": "metanube", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15084601/medium/7e8ee6ec15e9d0be68e2c6ff9a0b34c8_default.png" + } + ] + }, + { + "fileId": "8003", + "contributors": [ + { + "id": 15714091, + "username": "Karym_GG", + "totalCosts": 3403.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15714091/medium/69afa2fb791e1be17640c54018cb4e2e_default.png" + } + ] + } + ] + }, + { + "lang": "fa", + "data": [ + { + "fileId": "6161", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 158.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + } + ] + }, + { + "fileId": "6163", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 347.44, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 94.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 41.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 34.34, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + } + ] + }, + { + "fileId": "6185", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 266.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 47.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + } + ] + }, + { + "fileId": "6165", + "contributors": [ + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 23.23, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + } + ] + }, + { + "fileId": "6167", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 451.47, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 114.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + } + ] + }, + { + "fileId": "5559", + "contributors": [ + { + "id": 15074339, + "username": "mmp8103", + "totalCosts": 266.64, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15074339/medium/5199c5dafe0b10d9bf8a99c34ff3a277.png" + }, + { + "id": 15855621, + "username": "subriper", + "totalCosts": 220.18, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15855621/medium/ab1a2868b313e6dfc113a754286d37d5.jpg" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 90.9, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 81.81, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 14814690, + "username": "khodaarahmi", + "totalCosts": 37.37, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14814690/medium/22dbf1e43823e76cb094bff3fdcca212.jpeg" + } + ] + }, + { + "fileId": "5561", + "contributors": [ + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 2924.96, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 158.57, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 14951357, + "username": "AH1309", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14951357/medium/8791c0b99febb787a5293b1b8487a6a9_default.png" + } + ] + }, + { + "fileId": "2766", + "contributors": [ + { + "id": 14733070, + "username": "loopersosa", + "totalCosts": 435.31, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733070/medium/14f75ef000001434196357bca4f22490.jpg" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 290.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 219.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15002741, + "username": "dariusheslamipor", + "totalCosts": 205.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15002741/medium/368ee2e7888434a922e5781aa2c194bf.jpeg" + }, + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 66.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 53.53, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 17.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 14555882, + "username": "ElAmir", + "totalCosts": 4.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14555882/medium/47bd8403dc0a881324cf1d5aef976a7b.jpg" + }, + { + "id": 15793733, + "username": "mahdishahabnia10", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15793733/medium/530cfa36d26d8b01474098c8952b0478.png" + } + ] + }, + { + "fileId": "2704", + "contributors": [ + { + "id": 15947697, + "username": "mahdigachloo33", + "totalCosts": 712.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947697/medium/6d060369501296118d0d9155a941096a.jpeg" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 69.69, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 14555882, + "username": "ElAmir", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14555882/medium/47bd8403dc0a881324cf1d5aef976a7b.jpg" + }, + { + "id": 14733070, + "username": "loopersosa", + "totalCosts": 10.1, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14733070/medium/14f75ef000001434196357bca4f22490.jpg" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 2.02, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + } + ] + }, + { + "fileId": "2702", + "contributors": [ + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 604.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15947697, + "username": "mahdigachloo33", + "totalCosts": 293.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15947697/medium/6d060369501296118d0d9155a941096a.jpeg" + }, + { + "id": 16001243, + "username": "0xArkonomi", + "totalCosts": 142.41, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16001243/medium/b75b58e1e84d60e633167eb068b1253e.jpg" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 108.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 107.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 21.21, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + } + ] + }, + { + "fileId": "2712", + "contributors": [ + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 496.92, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 272.7, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 188.87, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + } + ] + }, + { + "fileId": "2710", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 464.6, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 293.91, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 240.38, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 83.83, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + }, + { + "id": 15566383, + "username": "raminvalizadeh29", + "totalCosts": 28.28, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15566383/medium/adf7b433679fa9f895b77e19223a2e70.jpeg" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + } + ] + }, + { + "fileId": "2716", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 739.32, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 447.43, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 88.88, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15967119, + "username": "timtey", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967119/medium/cdc0fbd1e4667f13ed75ac64b4e6c809.jpeg" + } + ] + }, + { + "fileId": "2908", + "contributors": [ + { + "id": 15097099, + "username": "nader.sedigh", + "totalCosts": 622.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15097099/medium/4fca4ea357c99c5d605850315f21ae65.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 156.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" + }, + { + "id": 15233666, + "username": "Alifarhani", + "totalCosts": 94.94, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15233666/medium/deec4866c37352c795ed3d0000236714.jpeg" + }, + { + "id": 15967115, + "username": "itsdeeters", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967115/medium/f3008c834c6c279d6567a82bee569b7c.png" + }, + { + "id": 14665754, + "username": "R3z4_Pr0gramm3r", + "totalCosts": 3.03, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14665754/medium/72c1f853dc01a48166c2ac4476d4a63a.png" + } + ] + }, + { + "fileId": "2860", + "contributors": [ + { + "id": 15967125, + "username": "erfanej", + "totalCosts": 921.12, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967125/medium/2223e574efc34243ef6e77236d77a6ba.png" + }, + { + "id": 15099529, + "username": "Aria-Naraghi", + "totalCosts": 155.54, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15099529/medium/77b12f03c6675c85ad45efc6f3e23be3_default.png" }, { "id": 15967119, @@ -16292,6 +17823,12 @@ "totalCosts": 590.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15624473/medium/7790c08f2ef4a5ba028091b6393900be_default.png" }, + { + "id": 15466824, + "username": "Niainarisoa", + "totalCosts": 187.86, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15466824/medium/a5fd6d5af3cb8d37ce7784e9c70237a6.png" + }, { "id": 15954931, "username": "XofEE", @@ -20973,17 +22510,17 @@ "totalCosts": 928.19, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15185884/medium/0d349af8ba0364fdd96b55b46c40590c.jpg" }, + { + "id": 12844463, + "username": "MATsxm", + "totalCosts": 16.16, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, { "id": 15829153, "username": "Francoisc23", "totalCosts": 15.15, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15829153/medium/8817724f0106278d9bdcb040991d7842_default.png" - }, - { - "id": 12844463, - "username": "MATsxm", - "totalCosts": 4.04, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] }, @@ -21752,7 +23289,7 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 71.71, + "totalCosts": 85.85, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" } ] @@ -21866,8 +23403,14 @@ { "id": 12844463, "username": "MATsxm", - "totalCosts": 3.03, + "totalCosts": 58.58, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/12844463/medium/6fae27edb4b41f363587f737ea2f96de.jpg" + }, + { + "id": 15466824, + "username": "Niainarisoa", + "totalCosts": 39.39, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15466824/medium/a5fd6d5af3cb8d37ce7784e9c70237a6.png" } ] }, @@ -21896,6 +23439,12 @@ "username": "omahs", "totalCosts": 224.22, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14823260/medium/2e90039ed53752ac5277c9cf4fce6fe7.jpeg" + }, + { + "id": 15466824, + "username": "Niainarisoa", + "totalCosts": 19.19, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15466824/medium/a5fd6d5af3cb8d37ce7784e9c70237a6.png" } ] }, @@ -24983,6 +26532,94 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" } ] + }, + { + "fileId": "7328", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 151.5, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "7340", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 1816.99, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "7334", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 1016.06, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "7336", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 965.56, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "7483", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 773.66, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "6568", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 2327.04, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "6572", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 385.82, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] + }, + { + "fileId": "8011", + "contributors": [ + { + "id": 15965461, + "username": "Satglow", + "totalCosts": 1124.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png" + } + ] } ] }, @@ -38553,6 +40190,12 @@ "totalCosts": 16.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13471138/medium/2d75a021ff9aad863e9ea3435aa3c682_default.png" }, + { + "id": 13903009, + "username": "igntsh", + "totalCosts": 15.15, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/13903009/medium/04ae0d1fd930da54d2c40b2d5e37e31c.jpg" + }, { "id": 14362948, "username": "jcxmt125", @@ -39527,7 +41170,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 159.58, + "totalCosts": 174.73, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" }, { @@ -39585,7 +41228,7 @@ { "id": 15894449, "username": "wosek_", - "totalCosts": 34.34, + "totalCosts": 62.62, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg" } ] @@ -58436,7 +60079,7 @@ { "id": 15473664, "username": "hotr1pak", - "totalCosts": 1449.35, + "totalCosts": 1521.06, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" }, { @@ -58497,6 +60140,12 @@ "totalCosts": 1606.91, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15804803/medium/e753b43a4cf480cd2a37c5795cdb83ba_default.png" }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 55.55, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 15800361, "username": "nazarenkooleksij0", @@ -58525,6 +60174,12 @@ { "fileId": "6183", "contributors": [ + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 421.17, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 15869379, "username": "viktoriia.mykytiuk02", @@ -58649,6 +60304,12 @@ "totalCosts": 25.25, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15143910/medium/c51e6458948ee8d9c7deb546cbb114a6_default.png" }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 22.22, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 14686790, "username": "Horus267", @@ -58660,6 +60321,12 @@ { "fileId": "5565", "contributors": [ + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 379.76, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 15967233, "username": "jasminesprout", @@ -58684,12 +60351,6 @@ "totalCosts": 3.03, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15895803/medium/96636c4279311f716614648a85940e81_default.png" }, - { - "id": 15473664, - "username": "hotr1pak", - "totalCosts": 3.03, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" - }, { "id": 13490273, "username": "Cmml", @@ -58824,6 +60485,12 @@ "username": "Horus267", "totalCosts": 11.11, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14686790/medium/9695742f9165e3cf2585e31e74898270.png" + }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 8.08, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" } ] }, @@ -58905,6 +60572,12 @@ "totalCosts": 86.86, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15825921/medium/75b88c5c4f949a723e15dccdaeb69c16.jpeg" }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 15824883, "username": "anastasiia.danchuk", @@ -59001,6 +60674,12 @@ "username": "jasminesprout", "totalCosts": 30.3, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" + }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 25.25, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" } ] }, @@ -59029,6 +60708,12 @@ "username": "jasminesprout", "totalCosts": 1165.54, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15967233/medium/b3515c2cf957fd413921b8fc9ccd6960.jpg" + }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 29.29, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" } ] }, @@ -59064,6 +60749,12 @@ "totalCosts": 64.64, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15804803/medium/e753b43a4cf480cd2a37c5795cdb83ba_default.png" }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 15895803, "username": "KristiKris", @@ -59169,6 +60860,12 @@ "totalCosts": 84.84, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15824955/medium/517b6400bc31546d1889eb56a4d5f6ee.jpeg" }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 45.45, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" + }, { "id": 15967233, "username": "jasminesprout", @@ -59221,6 +60918,12 @@ "username": "dmytro.zalatukhin", "totalCosts": 8.08, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15824955/medium/517b6400bc31546d1889eb56a4d5f6ee.jpeg" + }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 7.07, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" } ] }, @@ -59262,6 +60965,12 @@ "username": "makc7", "totalCosts": 49.49, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15860037/medium/9c2048ac721bc2d7abd49d178bf2857e.png" + }, + { + "id": 15473664, + "username": "hotr1pak", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15473664/medium/97a49851d4c929fd21f8ebcc8947a400.jpeg" } ] } @@ -61973,6 +63682,12 @@ "totalCosts": 47.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/14829178/medium/39ff70d1cbcdbad8e9056cb4aa4ee789.jpg" }, + { + "id": 15236832, + "username": "Andypsl8", + "totalCosts": 5.05, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/59227a901011469470b992963cd20855.jpg" + }, { "id": 15895151, "username": "ChaosGod", @@ -61985,12 +63700,6 @@ "totalCosts": 5.05, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15515726/medium/98af5d1ee9b8c33327474cf6dce467b5.jpeg" }, - { - "id": 15236832, - "username": "Andypsl8", - "totalCosts": 5.05, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/59227a901011469470b992963cd20855.jpg" - }, { "id": 16044050, "username": "noahazael", @@ -62532,6 +64241,12 @@ "totalCosts": 14.14, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15073799/medium/a33ad8c1e01cf31890babace80908193.png" }, + { + "id": 15236832, + "username": "Andypsl8", + "totalCosts": 1.01, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/59227a901011469470b992963cd20855.jpg" + }, { "id": 16072688, "username": "lz895779981", @@ -62543,12 +64258,6 @@ "username": "sheepskin1", "totalCosts": 1.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15524545/medium/7777b3e0ba87243b51733b6016b6a945.png" - }, - { - "id": 15236832, - "username": "Andypsl8", - "totalCosts": 1.01, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/59227a901011469470b992963cd20855.jpg" } ] }, @@ -67130,18 +68839,18 @@ "totalCosts": 40.4, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15311346/medium/62e0a2b5c543569c10511bcf1f84c112_default.png" }, - { - "id": 15101527, - "username": "alexanderhawl", - "totalCosts": 27.27, - "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15101527/medium/d5363de72b7fd3067a430db7ac9ad8ab.jpeg" - }, { "id": 15236832, "username": "Andypsl8", "totalCosts": 27.27, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15236832/medium/59227a901011469470b992963cd20855.jpg" }, + { + "id": 15101527, + "username": "alexanderhawl", + "totalCosts": 27.27, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15101527/medium/d5363de72b7fd3067a430db7ac9ad8ab.jpeg" + }, { "id": 15635039, "username": "farmerlesheng", @@ -68614,6 +70323,17 @@ "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15438492/medium/cccf6914fa8683665b5a72a175b712a7.jpeg" } ] + }, + { + "fileId": "8011", + "contributors": [ + { + "id": 16158452, + "username": "sang_shi", + "totalCosts": 1124.13, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/16158452/medium/8544f339158effd95f9bda0987cb93aa_default.png" + } + ] } ] }, @@ -68679,7 +70399,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 31.31, + "totalCosts": 46.46, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" } ] @@ -68719,7 +70439,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 593.88, + "totalCosts": 622.16, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -69241,7 +70961,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 391.88, + "totalCosts": 405.01, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -69443,7 +71163,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 154.53, + "totalCosts": 161.6, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -69565,7 +71285,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 1986.67, + "totalCosts": 1991.72, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" } ] @@ -69711,7 +71431,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 59.59, + "totalCosts": 81.81, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -69977,7 +71697,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 1651.35, + "totalCosts": 1663.47, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -70205,7 +71925,7 @@ { "id": 15399006, "username": "Xeift", - "totalCosts": 664.58, + "totalCosts": 702.96, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" }, { @@ -70312,6 +72032,12 @@ "username": "0xycl", "totalCosts": 129.28, "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15508914/medium/98fd4c1396bf4b16bcf44f291ee28fcc.png" + }, + { + "id": 15399006, + "username": "Xeift", + "totalCosts": 24.24, + "avatarUrl": "https://crowdin-static.downloads.crowdin.com/avatar/15399006/medium/4b4638642287027a89529ecb11074e44.png" } ] }, From 29cd022442b51e661c9955e56e3234e43d388cbb Mon Sep 17 00:00:00 2001 From: Fredrik Svantes Date: Mon, 26 Feb 2024 00:03:12 +0100 Subject: [PATCH 458/478] Update execution-bounty-hunters.json Added nrv who submitted 5x medium and 2x low vulnerabilities --- src/data/execution-bounty-hunters.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/data/execution-bounty-hunters.json b/src/data/execution-bounty-hunters.json index f1282594b14..2e99eea6f57 100644 --- a/src/data/execution-bounty-hunters.json +++ b/src/data/execution-bounty-hunters.json @@ -24,6 +24,11 @@ "name": "Yoonho Kim (team Hithereum)", "score": 20000 }, + { + "username": "", + "name": "nrv", + "score": 31000 + }, { "username": "johnyangk", "name": "John Youngseok Yang (Software Platform Lab)", From a948dc46170d86e196059b63c45654cadbb6a3ab Mon Sep 17 00:00:00 2001 From: Fredrik Svantes Date: Mon, 26 Feb 2024 09:45:49 +0100 Subject: [PATCH 459/478] Update execution-bounty-hunters.json Updated nrv's Name as per nrv's request --- src/data/execution-bounty-hunters.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/execution-bounty-hunters.json b/src/data/execution-bounty-hunters.json index 2e99eea6f57..5a95dc3d751 100644 --- a/src/data/execution-bounty-hunters.json +++ b/src/data/execution-bounty-hunters.json @@ -26,7 +26,7 @@ }, { "username": "", - "name": "nrv", + "name": "nrv (@nervoir)", "score": 31000 }, { From fe57d91aa9562c94dd59c14f91dfc5d653977d48 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 26 Feb 2024 09:22:13 +0000 Subject: [PATCH 460/478] Remove View in English button --- src/components/TranslationBanner.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/TranslationBanner.tsx b/src/components/TranslationBanner.tsx index 1a621627b95..ff7f5b8e182 100644 --- a/src/components/TranslationBanner.tsx +++ b/src/components/TranslationBanner.tsx @@ -96,7 +96,9 @@ const TranslationBanner = ({ {t("translation-banner-button-translate-page")} - {!isPageContentEnglish && ( + {/* Todo: Reimplement once fixed */} + {/* Issue: https://github.com/ethereum/ethereum-org-website/issues/12292 */} + {/* {!isPageContentEnglish && ( - )} + )} */} Date: Mon, 26 Feb 2024 09:43:55 +0000 Subject: [PATCH 461/478] Delete duplicates and restructure english content --- .../dagger-hashimoto/index.md | 0 .../mining-algorithms/ethash/index.md | 0 .../{ => mining}/mining-algorithms/index.md | 0 .../dagger-hashamoto/index.md | 334 ------ .../pow/mining-algorithms/ethash/index.md | 1014 ----------------- .../pow/mining-algorithms/index.md | 39 - .../dagger-hashamoto/index.md | 334 ------ .../pow/mining-algorithms/ethash/index.md | 1014 ----------------- .../pow/mining-algorithms/index.md | 37 - .../dagger-hashamoto/index.md | 334 ------ .../pow/mining-algorithms/ethash/index.md | 1014 ----------------- .../pow/mining-algorithms/index.md | 37 - .../dagger-hashamoto/index.md | 334 ------ .../pow/mining-algorithms/ethash/index.md | 1014 ----------------- .../pow/mining-algorithms/index.md | 37 - 15 files changed, 5542 deletions(-) rename public/content/developers/docs/consensus-mechanisms/pow/{ => mining}/mining-algorithms/dagger-hashimoto/index.md (100%) rename public/content/developers/docs/consensus-mechanisms/pow/{ => mining}/mining-algorithms/ethash/index.md (100%) rename public/content/developers/docs/consensus-mechanisms/pow/{ => mining}/mining-algorithms/index.md (100%) delete mode 100644 public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md delete mode 100644 public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md delete mode 100644 public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md delete mode 100644 public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md delete mode 100644 public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md delete mode 100644 public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md delete mode 100644 public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md delete mode 100644 public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md delete mode 100644 public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md delete mode 100644 public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md delete mode 100644 public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md delete mode 100644 public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md diff --git a/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/index.md b/public/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md similarity index 100% rename from public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto/index.md rename to public/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md diff --git a/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md similarity index 100% rename from public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md rename to public/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md diff --git a/public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/public/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md similarity index 100% rename from public/content/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md rename to public/content/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md deleted file mode 100644 index acf9c387f9c..00000000000 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -title: Dagger-Hashimoto -description: Uno sguardo dettagliato all'algoritmo di Dagger-Hashimoto. -lang: it ---- - -Dagger-Hashimoto era l'implementazione e specifica di ricerca originale per l'algoritmo di mining di Ethereum. Dagger-Hashimoto è stato sostituito da [Ethash](#ethash). Il mining sarà disattivato completamente dopo [La Fusione](/updates/merge), a partire dalla quale Ethereum sarà invece protetto usando un meccanismo di [proof-of-stake](/developers/docs/consensus-mechanisms/pos). - -## Prerequisiti {#prerequisites} - -Per meglio comprendere questa pagina, ti consigliamo prima di informarti sul [consenso proof-of-work](/developers/docs/consensus-mechanisms/pow), sul [mining](/developers/docs/consensus-mechanisms/pow/mining) e sugli [algoritmi di mining](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms). - -## Dagger-Hashimoto {#dagger-hashimoto} - -Dagger-Hashimoto punta a soddisfare due obiettivi: - -1. **Resistenza ASIC**: la creazione di hardware specializzato per l'algoritmo dovrebbe apportare un beneficio minimo -2. **Verificabilità da un client leggero**: un blocco dovrebbe essere efficientemente verificabile da un client leggero. - -Con una modifica aggiuntiva, specifichiamo anche come raggiungere un terzo obiettivo se desiderato, ma al costo di una maggiore complessità: - -**Archiviazione della catena completa**: il mining dovrebbe richiedere l'archiviazione dello stato completo della blockchain (a causa della struttura irregolare dell'albero di stato di Ethereum, prevediamo la possibilità di alcune potature (pruning), soprattutto dopo alcuni contratti usati spesso, che vogliamo comunque mantenere al minimo). - -## Generazione del DAG {#dag-generation} - -Il codice per l'algoritmo sarà definito in Python, di seguito. Per prima cosa, diamo `encode_int` per il marshaling in stringhe di interi non firmati con una precisione specificata. È dato anche il suo opposto: - -```python -NUM_BITS = 512 - -def encode_int(x): - "Encode an integer x as a string of 64 characters using a big-endian scheme" - o = '' - for _ in range(NUM_BITS / 8): - o = chr(x % 256) + o - x //= 256 - return o - -def decode_int(s): - "Unencode an integer x from a string using a big-endian scheme" - x = 0 - for c in s: - x *= 256 - x += ord(c) - return x -``` - -Poi supponiamo che `sha3` sia una funzione che prende un intero e produce un intero e che `dbl_sha3` sia una funzione double-sha3; se vogliamo convertire questo codice di riferimento in un uso d'implementazione: - -```python -from pyethereum import utils -def sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(x)) - -def dbl_sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(utils.sha3(x))) -``` - -### Parametri {#parameters} - -I parametri usati per l'algoritmo sono: - -```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 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 -} -``` - -`P` in questo caso è un numero primo scelto in modo che `log₂(P)` sia solo di poco inferiore a 512, che corrisponde ai 512 bit che abbiamo usato per rappresentare i nostri numeri. Nota che in realtà deve essere memorizzata solo la seconda metà del DAG, quindi il requisito de-facto di RAM parte da 1 GB e cresce di 441 MB l'anno. - -### Costruzione del grafico dagger {#dagger-graph-building} - -Il primitivo di costruzione del grafico dagger è definito come segue: - -```python -def produce_dag(params, seed, length): - P = params["P"] - picker = init = pow(sha3(seed), params["w"], P) - o = [init] - for i in range(1, length): - x = picker = (picker * init) % P - for _ in range(params["k"]): - x ^= o[x % i] - o.append(pow(x, params["w"], P)) - return o -``` - -Essenzialmente, avvia un grafico come un singolo nodo, `sha3(seed)` e da lì si inizia ad aggiungere sequenzialmente gli altri nodi, a seconda dei nodi casuali precedenti. Quando viene creato un nuovo nodo, è calcolata una potenza modulare del seed per selezionare casualmente degli indici inferiori a `i` (usando il suddetto `x % i`) e i valori dei nodi a questi indici sono usati all'interno di un calcolo per generare un nuovo valore per `x`, che viene poi passato a una piccola funzione di proof-of-work (basata su XOR) per generare, infine, il valore del grafico all'indice `i`. La logica dietro questa costruzione particolare è forzare l'accesso sequenziale del DAG; il valore successivo del DAG che sarà accessibile non è determinabile finché non sia noto il valore corrente. Infine, l'esponenziazione modulare genera ulteriormente un hashing del risultato. - -Questo algoritmo si basa su diversi risultati dalla teoria dei numeri. Vedere l'appendice più avanti per una discussione. - -## Valutazione da client leggero {#light-client-evaluation} - -Questa costruzione del grafico intende consentire a ogni nodo nel grafico di essere ricostruito calcolando solamente l'albero secondario di un piccolo numero di nodi, in modo da richiedere solo una piccola quantità di memoria ausiliaria. Nota che, con k=1, l'albero secondario è solo una catena di valori che cresce al primo elemento nel DAG. - -La funzione di calcolo del client leggero per il DAG funziona così: - -```python -def quick_calc(params, seed, p): - w, P = params["w"], params["P"] - cache = {} - - def quick_calc_cached(p): - if p in cache: - pass - elif p == 0: - cache[p] = pow(sha3(seed), w, P) - else: - x = pow(sha3(seed), (p + 1) * w, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(x % p) - cache[p] = pow(x, w, P) - return cache[p] - - return quick_calc_cached(p) -``` - -essenzialmente, è semplicemente una riscrittura dell'algoritmo di cui sopra, che elimina il ciclo di calcolo dei valori per l'intero DAG e sostituisce la ricerca del nodo precedente con una chiamata ricorsiva o una ricerca della cache. Nota che per `k=1`, la cache non è necessaria, anche se in realtà un'ulteriore ottimizzazione pre-calcola le prime migliaia di valori del DAG e li mantiene come una cache statica per i calcoli; vedi l'appendice per l'implementazione di un codice a riguardo. - -## Doppio buffer di DAG {#double-buffer} - -In un client completo, è usato un [_doppio buffer_](https://wikipedia.org/wiki/Multiple_buffering) di 2 DAG prodotti dalla suddetta formula. L'idea è che i DAG siano prodotti ogni `epochtime` numero di blocchi, secondo i parametri indicati sopra. Il client non usa l'ultimo DAG prodotto, ma quello precedente. Il beneficio è che consente ai DAG di essere sostituiti nel tempo senza dover prevedere un passaggio in cui i miner devono improvvisamente ricalcolare tutti i dati. In caso contrario vi sarebbe il rischio, a intervalli regolari, di un brusco rallentamento temporaneo nell'elaborazione della catena e l'aumento drastico della centralizzazione. In quei pochi minuti prima che tutti i dati siano ricalcolati sussiste quindi il rischio di un attacco 51%. - -L'algoritmo usato per generare la serie di DAG usati per calcolare il lavoro per un blocco è il seguente: - -```python -def get_prevhash(n): - from pyethereum.blocks import GENESIS_PREVHASH - from pyethereum import chain_manager - if num <= 0: - return hash_to_int(GENESIS_PREVHASH) - else: - prevhash = chain_manager.index.get_block_by_number(n - 1) - return decode_int(prevhash) - -def get_seedset(params, block): - seedset = {} - seedset["back_number"] = block.number - (block.number % params["epochtime"]) - seedset["back_hash"] = get_prevhash(seedset["back_number"]) - seedset["front_number"] = max(seedset["back_number"] - params["epochtime"], 0) - seedset["front_hash"] = get_prevhash(seedset["front_number"]) - return seedset - -def get_dagsize(params, block): - return params["n"] + (block.number // params["epochtime"]) * params["n_inc"] - -def get_daggerset(params, block): - dagsz = get_dagsize(params, block) - seedset = get_seedset(params, block) - if seedset["front_hash"] <= 0: - # No back buffer is possible, just make front buffer - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": 0}} - else: - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": seedset["front_number"]}, - "back": {"dag": produce_dag(params, seedset["back_hash"], dagsz), - "block_number": seedset["back_number"]}} -``` - -## Hashimoto {#hashimoto} - -L'idea dietro all'Hashimoto originale è usare la blockchain come dataset, eseguendo un calcolo che selezioni N indici dalla blockchain, raccolga le transazioni a quegli indici, esegua uno XOR di questi dati e restituisca l'hash del risultato. L'algoritmo originale di Thaddeus Dryja, tradotto in Python per coerenza, è il seguente: - -```python -def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): - hash_output_A = sha256(prev_hash + merkle_root + nonce) - txid_mix = 0 - for i in range(64): - shifted_A = hash_output_A >> i - transaction = shifted_A % len(list_of_transactions) - txid_mix ^= list_of_transactions[transaction] << i - return txid_max ^ (nonce << 192) -``` - -Sfortunatamente, anche se Hashimoto è considerato gravoso per la RAM, si affida a un'aritmetica a 256 bit, che richiede molti calcoli. Per risolvere questo problema, Dagger-Hashimoto usa comunque solo i 64 bit meno significativi, indicizzando il proprio dataset. - -```python -def hashimoto(dag, dagsize, params, header, nonce): - m = dagsize / 2 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= dag[m + (mix % 2**64) % m] - return dbl_sha3(mix) -``` - -L'uso di SHA3 doppi consente una forma di dati zero, una pre-verifica quasi istantanea, che verifica solo che sia stato fornito un valore intermedio corretto. Questo livello esterno di proof-of-work è altamente pro-ASIC e abbastanza debole, ma è pensato per rendere ancora più complicati gli attacchi DDoS, poiché per produrre un blocco che non sarà immediatamente scartato deve essere eseguito un po’ di lavoro. Ecco la versione del client leggero: - -```python -def quick_hashimoto(seed, dagsize, params, header, nonce): - m = dagsize // 2 - mix = sha3(nonce + header) - for _ in range(params["accesses"]): - mix ^= quick_calc(params, seed, m + (mix % 2**64) % m) - return dbl_sha3(mix) -``` - -## Mining e verifica {#mining-and-verifying} - -Mettiamo ora tutto insieme nell'algoritmo di mining: - -```python -def mine(daggerset, params, block): - from random import randint - nonce = randint(0, 2**64) - while 1: - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - if result * params["diff"] < 2**256: - break - nonce += 1 - if nonce >= 2**64: - nonce = 0 - return nonce -``` - -Ecco l'algoritmo di verifica: - -```python -def verify(daggerset, params, block, nonce): - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -Verifica adatta a un client leggero: - -```python -def light_verify(params, header, nonce): - seedset = get_seedset(params, block) - result = quick_hashimoto(seedset["front_hash"], get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -Inoltre, nota che Dagger-Hashimoto impone anche altri requisiti sull'intestazione del blocco: - -- Perché la verifica a due livelli funzioni, l'intestazione di un blocco deve avere sia il nonce che il valore medio di pre-sha3 -- Da qualche parte, l'intestazione di un blocco deve memorizzare la sha3 del set di seed corrente - -## Letture consigliate {#further-reading} - -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ - -## Appendice {#appendix} - -Come notato sopra, l'RNG usato per la generazione del DAG si affida ad alcuni risultati dalla teoria dei numeri. Per prima cosa, accertiamoci che l'RNG di Lehmer che è la base per la variabile `picker` abbia un periodo ampio. In secondo luogo, mostriamo che `pow(x,3,P)` non mapperà `x` a `1` o `P-1`, a condizione che all’inizio `x ∈ [2,P-2]`. Infine, mostriamo che `pow(x,3,P)` ha un basso tasso di collisione se trattato come funzione di hashing. - -### Generatore di numeri casuali di Lehmer {#lehmer-random-number} - -Sebbene la funzione `produce_dag` non necessiti di produrre numeri casuali imparziali, un possibile rischio è dato dal fatto che `seed**i % P` prende solo una manciata di valori. Questo potrebbe fornire un vantaggio ai miner che riconoscono lo schema, rispetto a quelli che non lo conoscono. - -Per evitarlo, si è fatto ricorso a un risultato dalla teoria dei numeri. Un [_Numero primo sicuro_](https://en.wikipedia.org/wiki/Safe_prime) si definisce come numero primo `P` tale per cui anche `(P-1)/2` è un numero primo. L'_ordine_ di un membro `x` del [gruppo moltiplicativo](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ` è definito come il valore minimo di `m` tale per cui
      xᵐ mod P ≡ 1
      -Date queste definizioni, abbiamo: - -> Osservazione 1. Ipotizziamo che `x` sia un membro del gruppo moltiplicativo `ℤ/Pℤ` per un numero primo sicuro `P`. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, allora l'ordine di `x` è `P-1` o `(P-1)/2`. - -_Dimostrazione_. Poiché `P` è un numero primo sicuro, allora per il \[Teorema di Lagrange\]\[lagrange\], l'ordine di `x` è `1`, `2`, `(P-1)/2` o `P-1`. - -L'ordine di `x` non può essere `1`, poiché secondo il Piccolo teorema di Fermat: - -
      xP-1 mod P ≡ 1
      - -Quindi, `x`, deve essere un'identità moltiplicativa di `ℤ/nℤ`, che è univoca. Poiché abbiamo presupposto che `x ≠ 1`, ciò è impossibile. - -L'ordine di `x` non può essere `2` a meno che `x = P-1`, poiché ciò violerebbe il fatto che `P` sia un numero primo. - -Dalla suddetta proposizione possiamo capire che iterando `(picker * init) % P`, avrà una lunghezza del ciclo di almeno `(P-1)/2`. Questo perché abbiamo selezionato `P` come un numero primo sicuro, approssimativamente pari a una potenza superiore di due e che `init` è nell'intervallo `[2,2**256+1]`. Data la magnitudine di `P`, non dovremmo mai aspettarci un ciclo dall'esponenziazione modulare. - -Quando assegniamo la prima cella nel DAG (la variabile etichettata come `init`), calcoliamo `pow(sha3(seed) + 2, 3, P)`. A prima vista, questo non garantisce che il risultato sia `1` né `P-1`. Tuttavia, poiché `P-1` è un numero primo sicuro, abbiamo la seguente garanzia aggiuntiva, che è un corollario dell'Osservazione 1: - -> Osservazione 2. Ipotizziamo che `x` sia un membro del gruppo moltiplicativo `ℤ/Pℤ` per un numero primo sicuro `P`, e prendiamo `w` come numero naturale. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, nonché `w mod P ≠ P-1 mod P` e `w mod P ≠ 0 mod P`, allora `xʷ mod P ≠ 1 mod P` e `xʷ mod P ≠ P-1 mod P` - -### Esponenziazione modulare come funzione di hash {#modular-exponentiation} - -Per certi valori di `P` e `w`, la funzione `pow(x, w, P)` potrebbe avere molte collisioni. Ad esempio, `pow(x,9,19)` prende solo i valori `{1,18}`. - -Dato che `P` è primo, allora è possibile scegliere un'appropriata `w` per una funzione di hashing di esponenziazione modulare usando il seguente risultato: - -> Osservazione 3. Prendiamo `P` come numero primo; `w` e `P-1` sono coprimi se e solo se per ogni `a` e `b` in `ℤ/Pℤ`: -> ->
      -> `aʷ mod P ≡ bʷ mod P` se e solo se `a mod P ≡ b mod P` ->
      - -Dunque, dato che `P` è primo e `w` è coprimo rispetto a `P-1`, abbiamo che `|{pow(x, w, P) : x ∈ ℤ}| = P`, e questo implica che la funzione di hashing ha la frequenza di collisione minima possibile. - -Nel caso speciale in cui `P` sia un numero primo sicuro, come da noi selezionato, allora `P-1` ha solo i fattori 1, 2, `(P-1)/2` e `P-1`. Poiché `P` > 7, sappiamo che 3 è primo rispetto a `P-1`, quindi `w=3` soddisfa la proposizione precedente. - -## Algoritmo di valutazione più efficiente basato sulla cache {#cache-based-evaluation} - -```python -def quick_calc(params, seed, p): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_calc_cached(cache, params, p) - -def quick_calc_cached(cache, params, p): - P = params["P"] - if p < len(cache): - return cache[p] - else: - x = pow(cache[0], p + 1, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(cache, params, x % p) - return pow(x, params["w"], P) - -def quick_hashimoto(seed, dagsize, params, header, nonce): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_hashimoto_cached(cache, dagsize, params, header, nonce) - -def quick_hashimoto_cached(cache, dagsize, params, header, nonce): - m = dagsize // 2 - mask = 2**64 - 1 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) - return dbl_sha3(mix) -``` diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md deleted file mode 100644 index f460ab4985b..00000000000 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ /dev/null @@ -1,1014 +0,0 @@ ---- -title: Ethash -description: Uno sguardo dettagliato all'algoritmo Ethash. -lang: it ---- - - - Ethash era l'algoritmo di mining di proof-of-work di Ethereum. Il proof-of-work è stato ora **interamente disattivato** ed Ethereum è ora protetto usando invece il [proof-of-stake](/developers/docs/consensus-mechanisms/pos). Leggi di più su La Fusione, sul proof-of-stake e sullo staking. Questa pagina è per interesse storico! - - -[Ethash](https://github.com/ethereum/wiki/wiki/Ethash) è una versione modificata dell'algoritmo [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto). Il proof-of-work di Ethash è [a elevato consumo di memoria](https://wikipedia.org/wiki/Memory-hard_function), cosa pensata per rendere l'algoritmo resistente agli ASIC. Gli ASIC di Ethash sono infine stati sviluppati, ma il mining della GPU è stata un'opzione ancora valida fino alla disattivazione del proof-of-work. Ethash è ancora usato per minare altre valute su altre reti di proof-of-work non di Ethereum. - -## Come funziona Ethash? {#how-does-ethash-work} - -La gravosità sulla memoria è ottenuta con un algoritmo di proof-of-work che richiede la scelta di sotto-serie di una risorsa fissa, dipendente dal nonce e dall'intestazione del blocco. Questa risorsa (di pochi gigabyte di dimensioni) è detta DAG. Il DAG è modificato ogni 30.000 blocchi, una finestra di circa 125 ore detta un'epoca (circa 5,2 giorni) e richiede un po' di tempo per generarsi. Poiché il DAG dipende solo dall'altezza del blocco, può esser pre-generato, ma se non è il client, deve attendere fino alla fine di questo processo per produrre un blocco. Se i client non si pre-generano e salvano anticipatamente nella cache i DAG, la rete potrebbe subire un enorme ritardo dei blocchi a ogni transizione d'epoca. Il DAG non deve necessariamente essere generato per verificare il proof-of-work, perché è essenzialmente possibile eseguire la verifica con poca CPU e poca memoria. - -Il percorso generale intrapreso dall'algoritmo è il seguente: - -1. Esiste un **seed**, calcolabile per ogni blocco scansionando fino a quel punto le intestazioni dei blocchi. -2. Dal seed, si può calcolare una **cache pseudo-casuale di 16 MB**. I client leggeri memorizzano la cache. -3. Dalla cache, possiamo generare un **dataset di 1 GB**, caratterizzato dal fatto che ogni elemento nel dataset dipende solo da una piccola quantità di elementi dalla cache. I client completi e i miner memorizzano il dataset. Il dataset cresce linearmente col tempo. -4. Durante il mining vengono prese delle fette (slice) casuali del dataset, eseguendone l'hashing. La verifica può essere effettuata con poca memoria usando la cache per rigenerare le parti specifiche del dataset necessarie, così da dover solo memorizzare la cache. - -Il grande dataset è aggiornato una volta ogni 30.000 blocchi, in questo modo l'impegno di un miner sarà per lo più quello di leggere il dataset, non effettuare modifiche a esso. - -## Definizioni {#definitions} - -Adottiamo le seguenti definizioni: - -``` -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 -``` - -### L'uso di "SHA3" {#sha3} - -Lo sviluppo di Ethereum è coinciso con lo sviluppo dello standard SHA3 e il processo standard ha effettuato una modifica tardiva al padding dell'algoritmo di hash finalizzato, quindi, gli hash "sha3_256" e "sha3_512" di Ethereum non sono hash dello standard sha3, ma una variante, spesso definita "Keccak-256" e "Keccak-512" in altri contesti. Vedi la discussione, es. [qui](https://github.com/ethereum/EIPs/issues/59), [qui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) o [qui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). - -Si ricorda che gli hash "sha3" siano presentati nella descrizione dell'algoritmo più avanti. - -## Parametri {#parameters} - -I parametri della cache e del dataset di Ethash dipendono dal numero del blocco. Le dimensioni della cache e del dataset crescono entrambe linearmente; tuttavia, prendiamo sempre il numero primo maggiore successivo alla soglia di crescita lineare, per ridurre il rischio di regolarità accidentali che determinano un comportamento ciclico. - -```python -def get_cache_size(block_number): - sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= HASH_BYTES - while not isprime(sz / HASH_BYTES): - sz -= 2 * HASH_BYTES - return sz - -def get_full_size(block_number): - sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= MIX_BYTES - while not isprime(sz / MIX_BYTES): - sz -= 2 * MIX_BYTES - return sz -``` - -Nell'appendice sono presentate tabelle delle dimensioni del dataset e della cache. - -## Generazione della cache {#cache-generation} - -Specifichiamo ora la funzione per produrre una cache: - -```python -def mkcache(cache_size, seed): - n = cache_size // HASH_BYTES - - # Sequentially produce the initial dataset - o = [sha3_512(seed)] - for i in range(1, n): - o.append(sha3_512(o[-1])) - - # Use a low-round version of randmemohash - for _ in range(CACHE_ROUNDS): - for i in range(n): - v = o[i][0] % n - o[i] = sha3_512(map(xor, o[(i-1+n) % n], o[v])) - - return o -``` - -Il processo di produzione della cache richiede dapprima il riempimento sequenziale di 32 MB di memoria, poi l'esecuzione di due passaggi dell'algoritmo _RandMemoHash_ di Sergio Demian Lerner da [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). L'output è una serie di valori a 64 byte 524288. - -## Funzione di aggregazione dei dati {#date-aggregation-function} - -Usiamo un algoritmo ispirato dall'[hash FNV](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) in alcuni casi come un sostituto non associativo per XOR. Nota che moltiplichiamo il numero primo con l'intero input a 32 bit, a differenza della specifica FNV-1, che moltiplica invece il numero primo con un byte (ottetto). - -```python -FNV_PRIME = 0x01000193 - -def fnv(v1, v2): - return ((v1 * FNV_PRIME) ^ v2) % 2**32 -``` - -Anche lo yellow paper specifica fnv come v1\*(FNV_PRIME ^ v2), tutte le implementazioni correnti usano attualmente la suddetta definizione. - -## Calcolo dell'intero dataset {#full-dataset-calculation} - -Ogni elemento da 64 byte nell'intero dataset da 1 GB è calcolato come segue: - -```python -def calc_dataset_item(cache, i): - n = len(cache) - r = HASH_BYTES // WORD_BYTES - # initialize the mix - 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 - for j in range(DATASET_PARENTS): - cache_index = fnv(i ^ j, mix[j % r]) - mix = map(fnv, mix, cache[cache_index % n]) - return sha3_512(mix) -``` - -Essenzialmente, combiniamo i dati da 256 nodi della cache selezionati pseudo-casualmente e ne eseguiamo l'hash per calcolare il nodo del dataset. L'intero dataset è quindi generato da: - -```python -def calc_dataset(full_size, cache): - return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)] -``` - -## Ciclo principale {#main-loop} - -Ora, specifichiamo il ciclo principale in stile "hashimoto", dove aggreghiamo i dati dal dataset completo per poter produrre il valore finale per un'intestazione e nonce in particolare. Nel codice seguente, `header` rappresenta l'_hash_ SHA3-256 della rappresentazione RLP di un'intestazione del blocco _troncata_, ovvero, di un'intestazione che esclude i campi **mixHash** e **nonce**. Un `nonce` si compone degli otto byte di un intero non firmato da 64 bit, con ordinamento big-endian. Quindi `nonce[::-1]` è la rappresentazione little-endian di otto byte di quel valore: - -```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 - s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s - mix = [] - for _ in range(MIX_BYTES / HASH_BYTES): - mix.extend(s) - # mix in random dataset nodes - 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 - 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])) - return { - "mix digest": serialize_hash(cmix), - "result": serialize_hash(sha3_256(s+cmix)) - } - -def hashimoto_light(full_size, cache, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x)) - -def hashimoto_full(full_size, dataset, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: dataset[x]) -``` - -Essenzialmente, manteniamo un mix di 128 byte e recuperiamo sequenzialmente e ripetutamente 128 byte dal dataset completo e usiamo la funzione `fnv` per combinarli col mix. Vengono usati 128 byte di accesso sequenziale così che ogni ciclo dell'algoritmo recuperi sempre una pagina intera dalla RAM, minimizzando le ricerche a vuoto nel lookaside buffer che gli ASIC dovrebbero teoricamente poter evitare. - -Se l'output di questo algoritmo è inferiore all'obiettivo desiderato, allora il nonce è valido. Nota che l'applicazione aggiuntiva di `sha3_256` alla fine assicura che esista un nonce intermedio, che può essere fornito per provare che almeno una piccola quantità di lavoro è stata eseguita; questa rapida verifica di PoW esterna è utilizzabile per scopi anti-DDoS. Serve anche a fornire la garanzia statistica che il risultato sia un numero a 256 bit imparziale. - -## Mining {#mining} - -L'algoritmo di mining è definito come segue: - -```python -def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit - target = zpad(encode_int(2**256 // difficulty), 64)[::-1] - from random import randint - nonce = randint(0, 2**64) - while hashimoto_full(full_size, dataset, header, nonce) > target: - nonce = (nonce + 1) % 2**64 - return nonce -``` - -## Definire l'hash del seed {#seed-hash} - -Per poter calcolare l'hash del seed da usare per fare mining su un dato blocco, usiamo il seguente algoritmo: - -```python - def get_seedhash(block): - s = '\x00' * 32 - for i in range(block.number // EPOCH_LENGTH): - s = serialize_hash(sha3_256(s)) - return s -``` - -Nota che per la fluidità delle attività di mining e verifica, consigliamo di pre-calcolare gli hash dei seed futuri e i dataset in un thread separato. - -## Letture consigliate {#further-reading} - -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ - -## Appendice {#appendix} - -Il seguente codice dovrebbe essere anteposto se sei interessato all'esecuzione della suddetta specifica di Python come codice. - -```python -import sha3, copy - -# Assumes little endian bit ordering (same as Intel architectures) -def decode_int(s): - return int(s[::-1].encode('hex'), 16) if s else 0 - -def encode_int(s): - a = "%x" % s - return '' if s == 0 else ('0' * (len(a) % 2) + a).decode('hex')[::-1] - -def zpad(s, length): - return s + '\x00' * max(0, length - len(s)) - -def serialize_hash(h): - return ''.join([zpad(encode_int(x), 4) for x in h]) - -def deserialize_hash(h): - return [decode_int(h[i:i+WORD_BYTES]) for i in range(0, len(h), WORD_BYTES)] - -def hash_words(h, sz, x): - if isinstance(x, list): - x = serialize_hash(x) - y = h(x) - return deserialize_hash(y) - -def serialize_cache(ds): - return ''.join([serialize_hash(h) for h in ds]) - -serialize_dataset = serialize_cache - -# sha3 hash function, outputs 64 bytes -def sha3_512(x): - return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) - -def sha3_256(x): - return hash_words(lambda v: sha3.sha3_256(v).digest(), 32, x) - -def xor(a, b): - return a ^ b - -def isprime(x): - for i in range(2, int(x**0.5)): - if x % i == 0: - return False - return True -``` - -### Dimensioni dei dati {#data-sizes} - -Le seguenti tabelle di ricerca forniscono approssimativamente 2048 epoche tabulate di dimensioni dei dati e della cache. - -```python -def get_datasize(block_number): - return data_sizes[block_number // EPOCH_LENGTH] - -def get_cachesize(block_number): - return cache_sizes[block_number // EPOCH_LENGTH] - -data_sizes = [ -1073739904, 1082130304, 1090514816, 1098906752, 1107293056, -1115684224, 1124070016, 1132461952, 1140849536, 1149232768, -1157627776, 1166013824, 1174404736, 1182786944, 1191180416, -1199568512, 1207958912, 1216345216, 1224732032, 1233124736, -1241513344, 1249902464, 1258290304, 1266673792, 1275067264, -1283453312, 1291844992, 1300234112, 1308619904, 1317010048, -1325397376, 1333787776, 1342176128, 1350561664, 1358954368, -1367339392, 1375731584, 1384118144, 1392507008, 1400897408, -1409284736, 1417673344, 1426062464, 1434451072, 1442839168, -1451229056, 1459615616, 1468006016, 1476394112, 1484782976, -1493171584, 1501559168, 1509948032, 1518337664, 1526726528, -1535114624, 1543503488, 1551892096, 1560278656, 1568669056, -1577056384, 1585446272, 1593831296, 1602219392, 1610610304, -1619000192, 1627386752, 1635773824, 1644164224, 1652555648, -1660943488, 1669332608, 1677721216, 1686109312, 1694497664, -1702886272, 1711274624, 1719661184, 1728047744, 1736434816, -1744829056, 1753218944, 1761606272, 1769995904, 1778382464, -1786772864, 1795157888, 1803550592, 1811937664, 1820327552, -1828711552, 1837102976, 1845488768, 1853879936, 1862269312, -1870656896, 1879048064, 1887431552, 1895825024, 1904212096, -1912601216, 1920988544, 1929379456, 1937765504, 1946156672, -1954543232, 1962932096, 1971321728, 1979707264, 1988093056, -1996487552, 2004874624, 2013262208, 2021653888, 2030039936, -2038430848, 2046819968, 2055208576, 2063596672, 2071981952, -2080373632, 2088762752, 2097149056, 2105539712, 2113928576, -2122315136, 2130700672, 2139092608, 2147483264, 2155872128, -2164257664, 2172642176, 2181035392, 2189426048, 2197814912, -2206203008, 2214587264, 2222979712, 2231367808, 2239758208, -2248145024, 2256527744, 2264922752, 2273312128, 2281701248, -2290086272, 2298476672, 2306867072, 2315251072, 2323639168, -2332032128, 2340420224, 2348808064, 2357196416, 2365580416, -2373966976, 2382363008, 2390748544, 2399139968, 2407530368, -2415918976, 2424307328, 2432695424, 2441084288, 2449472384, -2457861248, 2466247808, 2474637184, 2483026816, 2491414144, -2499803776, 2508191872, 2516582272, 2524970368, 2533359232, -2541743488, 2550134144, 2558525056, 2566913408, 2575301504, -2583686528, 2592073856, 2600467328, 2608856192, 2617240448, -2625631616, 2634022016, 2642407552, 2650796416, 2659188352, -2667574912, 2675965312, 2684352896, 2692738688, 2701130624, -2709518464, 2717907328, 2726293376, 2734685056, 2743073152, -2751462016, 2759851648, 2768232832, 2776625536, 2785017728, -2793401984, 2801794432, 2810182016, 2818571648, 2826959488, -2835349376, 2843734144, 2852121472, 2860514432, 2868900992, -2877286784, 2885676928, 2894069632, 2902451584, 2910843008, -2919234688, 2927622784, 2936011648, 2944400768, 2952789376, -2961177728, 2969565568, 2977951616, 2986338944, 2994731392, -3003120256, 3011508352, 3019895936, 3028287104, 3036675968, -3045063808, 3053452928, 3061837696, 3070228352, 3078615424, -3087003776, 3095394944, 3103782272, 3112173184, 3120562048, -3128944768, 3137339264, 3145725056, 3154109312, 3162505088, -3170893184, 3179280256, 3187669376, 3196056704, 3204445568, -3212836736, 3221224064, 3229612928, 3238002304, 3246391168, -3254778496, 3263165824, 3271556224, 3279944576, 3288332416, -3296719232, 3305110912, 3313500032, 3321887104, 3330273152, -3338658944, 3347053184, 3355440512, 3363827072, 3372220288, -3380608384, 3388997504, 3397384576, 3405774208, 3414163072, -3422551936, 3430937984, 3439328384, 3447714176, 3456104576, -3464493952, 3472883584, 3481268864, 3489655168, 3498048896, -3506434432, 3514826368, 3523213952, 3531603584, 3539987072, -3548380288, 3556763264, 3565157248, 3573545344, 3581934464, -3590324096, 3598712704, 3607098752, 3615488384, 3623877248, -3632265856, 3640646528, 3649043584, 3657430144, 3665821568, -3674207872, 3682597504, 3690984832, 3699367808, 3707764352, -3716152448, 3724541056, 3732925568, 3741318016, 3749706368, -3758091136, 3766481536, 3774872704, 3783260032, 3791650432, -3800036224, 3808427648, 3816815488, 3825204608, 3833592704, -3841981568, 3850370432, 3858755968, 3867147904, 3875536256, -3883920512, 3892313728, 3900702592, 3909087872, 3917478784, -3925868416, 3934256512, 3942645376, 3951032192, 3959422336, -3967809152, 3976200064, 3984588416, 3992974976, 4001363584, -4009751168, 4018141312, 4026530432, 4034911616, 4043308928, -4051695488, 4060084352, 4068472448, 4076862848, 4085249408, -4093640576, 4102028416, 4110413696, 4118805632, 4127194496, -4135583104, 4143971968, 4152360832, 4160746112, 4169135744, -4177525888, 4185912704, 4194303616, 4202691968, 4211076736, -4219463552, 4227855488, 4236246656, 4244633728, 4253022848, -4261412224, 4269799808, 4278184832, 4286578048, 4294962304, -4303349632, 4311743104, 4320130432, 4328521088, 4336909184, -4345295488, 4353687424, 4362073472, 4370458496, 4378852736, -4387238528, 4395630208, 4404019072, 4412407424, 4420790656, -4429182848, 4437571456, 4445962112, 4454344064, 4462738048, -4471119232, 4479516544, 4487904128, 4496289664, 4504682368, -4513068416, 4521459584, 4529846144, 4538232704, 4546619776, -4555010176, 4563402112, 4571790208, 4580174464, 4588567936, -4596957056, 4605344896, 4613734016, 4622119808, 4630511488, -4638898816, 4647287936, 4655675264, 4664065664, 4672451968, -4680842624, 4689231488, 4697620352, 4706007424, 4714397056, -4722786176, 4731173248, 4739562368, 4747951744, 4756340608, -4764727936, 4773114496, 4781504384, 4789894784, 4798283648, -4806667648, 4815059584, 4823449472, 4831835776, 4840226176, -4848612224, 4857003392, 4865391488, 4873780096, 4882169728, -4890557312, 4898946944, 4907333248, 4915722368, 4924110976, -4932499328, 4940889728, 4949276032, 4957666432, 4966054784, -4974438016, 4982831488, 4991221376, 4999607168, 5007998848, -5016386432, 5024763776, 5033164672, 5041544576, 5049941888, -5058329728, 5066717056, 5075107456, 5083494272, 5091883904, -5100273536, 5108662144, 5117048192, 5125436032, 5133827456, -5142215296, 5150605184, 5158993024, 5167382144, 5175769472, -5184157568, 5192543872, 5200936064, 5209324928, 5217711232, -5226102656, 5234490496, 5242877312, 5251263872, 5259654016, -5268040832, 5276434304, 5284819328, 5293209728, 5301598592, -5309986688, 5318374784, 5326764416, 5335151488, 5343542144, -5351929472, 5360319872, 5368706944, 5377096576, 5385484928, -5393871232, 5402263424, 5410650496, 5419040384, 5427426944, -5435816576, 5444205952, 5452594816, 5460981376, 5469367936, -5477760896, 5486148736, 5494536832, 5502925952, 5511315328, -5519703424, 5528089984, 5536481152, 5544869504, 5553256064, -5561645696, 5570032768, 5578423936, 5586811264, 5595193216, -5603585408, 5611972736, 5620366208, 5628750464, 5637143936, -5645528192, 5653921408, 5662310272, 5670694784, 5679082624, -5687474048, 5695864448, 5704251008, 5712641408, 5721030272, -5729416832, 5737806208, 5746194304, 5754583936, 5762969984, -5771358592, 5779748224, 5788137856, 5796527488, 5804911232, -5813300608, 5821692544, 5830082176, 5838468992, 5846855552, -5855247488, 5863636096, 5872024448, 5880411008, 5888799872, -5897186432, 5905576832, 5913966976, 5922352768, 5930744704, -5939132288, 5947522432, 5955911296, 5964299392, 5972688256, -5981074304, 5989465472, 5997851008, 6006241408, 6014627968, -6023015552, 6031408256, 6039796096, 6048185216, 6056574848, -6064963456, 6073351808, 6081736064, 6090128768, 6098517632, -6106906496, 6115289216, 6123680896, 6132070016, 6140459648, -6148849024, 6157237376, 6165624704, 6174009728, 6182403712, -6190792064, 6199176064, 6207569792, 6215952256, 6224345216, -6232732544, 6241124224, 6249510272, 6257899136, 6266287744, -6274676864, 6283065728, 6291454336, 6299843456, 6308232064, -6316620928, 6325006208, 6333395584, 6341784704, 6350174848, -6358562176, 6366951296, 6375337856, 6383729536, 6392119168, -6400504192, 6408895616, 6417283456, 6425673344, 6434059136, -6442444672, 6450837376, 6459223424, 6467613056, 6476004224, -6484393088, 6492781952, 6501170048, 6509555072, 6517947008, -6526336384, 6534725504, 6543112832, 6551500672, 6559888768, -6568278656, 6576662912, 6585055616, 6593443456, 6601834112, -6610219648, 6618610304, 6626999168, 6635385472, 6643777408, -6652164224, 6660552832, 6668941952, 6677330048, 6685719424, -6694107776, 6702493568, 6710882176, 6719274112, 6727662976, -6736052096, 6744437632, 6752825984, 6761213824, 6769604224, -6777993856, 6786383488, 6794770816, 6803158144, 6811549312, -6819937664, 6828326528, 6836706176, 6845101696, 6853491328, -6861880448, 6870269312, 6878655104, 6887046272, 6895433344, -6903822208, 6912212864, 6920596864, 6928988288, 6937377152, -6945764992, 6954149248, 6962544256, 6970928768, 6979317376, -6987709312, 6996093824, 7004487296, 7012875392, 7021258624, -7029652352, 7038038912, 7046427776, 7054818944, 7063207808, -7071595136, 7079980928, 7088372608, 7096759424, 7105149824, -7113536896, 7121928064, 7130315392, 7138699648, 7147092352, -7155479168, 7163865728, 7172249984, 7180648064, 7189036672, -7197424768, 7205810816, 7214196608, 7222589824, 7230975104, -7239367552, 7247755904, 7256145536, 7264533376, 7272921472, -7281308032, 7289694848, 7298088832, 7306471808, 7314864512, -7323253888, 7331643008, 7340029568, 7348419712, 7356808832, -7365196672, 7373585792, 7381973888, 7390362752, 7398750592, -7407138944, 7415528576, 7423915648, 7432302208, 7440690304, -7449080192, 7457472128, 7465860992, 7474249088, 7482635648, -7491023744, 7499412608, 7507803008, 7516192384, 7524579968, -7532967296, 7541358464, 7549745792, 7558134656, 7566524032, -7574912896, 7583300992, 7591690112, 7600075136, 7608466816, -7616854912, 7625244544, 7633629824, 7642020992, 7650410368, -7658794112, 7667187328, 7675574912, 7683961984, 7692349568, -7700739712, 7709130368, 7717519232, 7725905536, 7734295424, -7742683264, 7751069056, 7759457408, 7767849088, 7776238208, -7784626816, 7793014912, 7801405312, 7809792128, 7818179968, -7826571136, 7834957184, 7843347328, 7851732352, 7860124544, -7868512384, 7876902016, 7885287808, 7893679744, 7902067072, -7910455936, 7918844288, 7927230848, 7935622784, 7944009344, -7952400256, 7960786048, 7969176704, 7977565312, 7985953408, -7994339968, 8002730368, 8011119488, 8019508096, 8027896192, -8036285056, 8044674688, 8053062272, 8061448832, 8069838464, -8078227328, 8086616704, 8095006592, 8103393664, 8111783552, -8120171392, 8128560256, 8136949376, 8145336704, 8153726848, -8162114944, 8170503296, 8178891904, 8187280768, 8195669632, -8204058496, 8212444544, 8220834176, 8229222272, 8237612672, -8246000768, 8254389376, 8262775168, 8271167104, 8279553664, -8287944064, 8296333184, 8304715136, 8313108352, 8321497984, -8329885568, 8338274432, 8346663296, 8355052928, 8363441536, -8371828352, 8380217984, 8388606592, 8396996224, 8405384576, -8413772672, 8422161536, 8430549376, 8438939008, 8447326592, -8455715456, 8464104832, 8472492928, 8480882048, 8489270656, -8497659776, 8506045312, 8514434944, 8522823808, 8531208832, -8539602304, 8547990656, 8556378752, 8564768384, 8573154176, -8581542784, 8589933952, 8598322816, 8606705024, 8615099264, -8623487872, 8631876992, 8640264064, 8648653952, 8657040256, -8665430656, 8673820544, 8682209152, 8690592128, 8698977152, -8707374464, 8715763328, 8724151424, 8732540032, 8740928384, -8749315712, 8757704576, 8766089344, 8774480768, 8782871936, -8791260032, 8799645824, 8808034432, 8816426368, 8824812928, -8833199488, 8841591424, 8849976448, 8858366336, 8866757248, -8875147136, 8883532928, 8891923328, 8900306816, 8908700288, -8917088384, 8925478784, 8933867392, 8942250368, 8950644608, -8959032704, 8967420544, 8975809664, 8984197504, 8992584064, -9000976256, 9009362048, 9017752448, 9026141312, 9034530688, -9042917504, 9051307904, 9059694208, 9068084864, 9076471424, -9084861824, 9093250688, 9101638528, 9110027648, 9118416512, -9126803584, 9135188096, 9143581312, 9151969664, 9160356224, -9168747136, 9177134464, 9185525632, 9193910144, 9202302848, -9210690688, 9219079552, 9227465344, 9235854464, 9244244864, -9252633472, 9261021824, 9269411456, 9277799296, 9286188928, -9294574208, 9302965888, 9311351936, 9319740032, 9328131968, -9336516736, 9344907392, 9353296768, 9361685888, 9370074752, -9378463616, 9386849408, 9395239808, 9403629184, 9412016512, -9420405376, 9428795008, 9437181568, 9445570688, 9453960832, -9462346624, 9470738048, 9479121536, 9487515008, 9495903616, -9504289664, 9512678528, 9521067904, 9529456256, 9537843584, -9546233728, 9554621312, 9563011456, 9571398784, 9579788672, -9588178304, 9596567168, 9604954496, 9613343104, 9621732992, -9630121856, 9638508416, 9646898816, 9655283584, 9663675776, -9672061312, 9680449664, 9688840064, 9697230464, 9705617536, -9714003584, 9722393984, 9730772608, 9739172224, 9747561088, -9755945344, 9764338816, 9772726144, 9781116544, 9789503872, -9797892992, 9806282624, 9814670464, 9823056512, 9831439232, -9839833984, 9848224384, 9856613504, 9865000576, 9873391232, -9881772416, 9890162816, 9898556288, 9906940544, 9915333248, -9923721088, 9932108672, 9940496512, 9948888448, 9957276544, -9965666176, 9974048384, 9982441088, 9990830464, 9999219584, -10007602816, 10015996544, 10024385152, 10032774016, 10041163648, -10049548928, 10057940096, 10066329472, 10074717824, 10083105152, -10091495296, 10099878784, 10108272256, 10116660608, 10125049216, -10133437312, 10141825664, 10150213504, 10158601088, 10166991232, -10175378816, 10183766144, 10192157312, 10200545408, 10208935552, -10217322112, 10225712768, 10234099328, 10242489472, 10250876032, -10259264896, 10267656064, 10276042624, 10284429184, 10292820352, -10301209472, 10309598848, 10317987712, 10326375296, 10334763392, -10343153536, 10351541632, 10359930752, 10368318592, 10376707456, -10385096576, 10393484672, 10401867136, 10410262144, 10418647424, -10427039104, 10435425664, 10443810176, 10452203648, 10460589952, -10468982144, 10477369472, 10485759104, 10494147712, 10502533504, -10510923392, 10519313536, 10527702656, 10536091264, 10544478592, -10552867712, 10561255808, 10569642368, 10578032768, 10586423168, -10594805632, 10603200128, 10611588992, 10619976064, 10628361344, -10636754048, 10645143424, 10653531776, 10661920384, 10670307968, -10678696832, 10687086464, 10695475072, 10703863168, 10712246144, -10720639616, 10729026688, 10737414784, 10745806208, 10754190976, -10762581376, 10770971264, 10779356288, 10787747456, 10796135552, -10804525184, 10812915584, 10821301888, 10829692288, 10838078336, -10846469248, 10854858368, 10863247232, 10871631488, 10880023424, -10888412032, 10896799616, 10905188992, 10913574016, 10921964672, -10930352768, 10938742912, 10947132544, 10955518592, 10963909504, -10972298368, 10980687488, 10989074816, 10997462912, 11005851776, -11014241152, 11022627712, 11031017344, 11039403904, 11047793024, -11056184704, 11064570752, 11072960896, 11081343872, 11089737856, -11098128256, 11106514816, 11114904448, 11123293568, 11131680128, -11140065152, 11148458368, 11156845696, 11165236864, 11173624192, -11182013824, 11190402688, 11198790784, 11207179136, 11215568768, -11223957376, 11232345728, 11240734592, 11249122688, 11257511296, -11265899648, 11274285952, 11282675584, 11291065472, 11299452544, -11307842432, 11316231296, 11324616832, 11333009024, 11341395584, -11349782656, 11358172288, 11366560384, 11374950016, 11383339648, -11391721856, 11400117376, 11408504192, 11416893568, 11425283456, -11433671552, 11442061184, 11450444672, 11458837888, 11467226752, -11475611776, 11484003968, 11492392064, 11500780672, 11509169024, -11517550976, 11525944448, 11534335616, 11542724224, 11551111808, -11559500672, 11567890304, 11576277376, 11584667008, 11593056128, -11601443456, 11609830016, 11618221952, 11626607488, 11634995072, -11643387776, 11651775104, 11660161664, 11668552576, 11676940928, -11685330304, 11693718656, 11702106496, 11710496128, 11718882688, -11727273088, 11735660416, 11744050048, 11752437376, 11760824704, -11769216128, 11777604736, 11785991296, 11794381952, 11802770048, -11811157888, 11819548544, 11827932544, 11836324736, 11844713344, -11853100928, 11861486464, 11869879936, 11878268032, 11886656896, -11895044992, 11903433088, 11911822976, 11920210816, 11928600448, -11936987264, 11945375872, 11953761152, 11962151296, 11970543488, -11978928512, 11987320448, 11995708288, 12004095104, 12012486272, -12020875136, 12029255552, 12037652096, 12046039168, 12054429568, -12062813824, 12071206528, 12079594624, 12087983744, 12096371072, -12104759936, 12113147264, 12121534592, 12129924992, 12138314624, -12146703232, 12155091584, 12163481216, 12171864704, 12180255872, -12188643968, 12197034112, 12205424512, 12213811328, 12222199424, -12230590336, 12238977664, 12247365248, 12255755392, 12264143488, -12272531584, 12280920448, 12289309568, 12297694592, 12306086528, -12314475392, 12322865024, 12331253632, 12339640448, 12348029312, -12356418944, 12364805248, 12373196672, 12381580928, 12389969024, -12398357632, 12406750592, 12415138432, 12423527552, 12431916416, -12440304512, 12448692352, 12457081216, 12465467776, 12473859968, -12482245504, 12490636672, 12499025536, 12507411584, 12515801728, -12524190592, 12532577152, 12540966272, 12549354368, 12557743232, -12566129536, 12574523264, 12582911872, 12591299456, 12599688064, -12608074624, 12616463488, 12624845696, 12633239936, 12641631616, -12650019968, 12658407296, 12666795136, 12675183232, 12683574656, -12691960192, 12700350592, 12708740224, 12717128576, 12725515904, -12733906816, 12742295168, 12750680192, 12759071872, 12767460736, -12775848832, 12784236928, 12792626816, 12801014656, 12809404288, -12817789312, 12826181504, 12834568832, 12842954624, 12851345792, -12859732352, 12868122496, 12876512128, 12884901248, 12893289088, -12901672832, 12910067584, 12918455168, 12926842496, 12935232896, -12943620736, 12952009856, 12960396928, 12968786816, 12977176192, -12985563776, 12993951104, 13002341504, 13010730368, 13019115392, -13027506304, 13035895168, 13044272512, 13052673152, 13061062528, -13069446272, 13077838976, 13086227072, 13094613632, 13103000192, -13111393664, 13119782528, 13128157568, 13136559232, 13144945024, -13153329536, 13161724288, 13170111872, 13178502784, 13186884736, -13195279744, 13203667072, 13212057472, 13220445824, 13228832128, -13237221248, 13245610624, 13254000512, 13262388352, 13270777472, -13279166336, 13287553408, 13295943296, 13304331904, 13312719488, -13321108096, 13329494656, 13337885824, 13346274944, 13354663808, -13363051136, 13371439232, 13379825024, 13388210816, 13396605056, -13404995456, 13413380224, 13421771392, 13430159744, 13438546048, -13446937216, 13455326848, 13463708288, 13472103808, 13480492672, -13488875648, 13497269888, 13505657728, 13514045312, 13522435712, -13530824576, 13539210112, 13547599232, 13555989376, 13564379008, -13572766336, 13581154432, 13589544832, 13597932928, 13606320512, -13614710656, 13623097472, 13631477632, 13639874944, 13648264064, -13656652928, 13665041792, 13673430656, 13681818496, 13690207616, -13698595712, 13706982272, 13715373184, 13723762048, 13732150144, -13740536704, 13748926592, 13757316224, 13765700992, 13774090112, -13782477952, 13790869376, 13799259008, 13807647872, 13816036736, -13824425344, 13832814208, 13841202304, 13849591424, 13857978752, -13866368896, 13874754688, 13883145344, 13891533184, 13899919232, -13908311168, 13916692096, 13925085056, 13933473152, 13941866368, -13950253696, 13958643584, 13967032192, 13975417216, 13983807616, -13992197504, 14000582272, 14008973696, 14017363072, 14025752192, -14034137984, 14042528384, 14050918016, 14059301504, 14067691648, -14076083584, 14084470144, 14092852352, 14101249664, 14109635968, -14118024832, 14126407552, 14134804352, 14143188608, 14151577984, -14159968384, 14168357248, 14176741504, 14185127296, 14193521024, -14201911424, 14210301824, 14218685056, 14227067264, 14235467392, -14243855488, 14252243072, 14260630144, 14269021568, 14277409408, -14285799296, 14294187904, 14302571392, 14310961792, 14319353728, -14327738752, 14336130944, 14344518784, 14352906368, 14361296512, -14369685376, 14378071424, 14386462592, 14394848128, 14403230848, -14411627392, 14420013952, 14428402304, 14436793472, 14445181568, -14453569664, 14461959808, 14470347904, 14478737024, 14487122816, -14495511424, 14503901824, 14512291712, 14520677504, 14529064832, -14537456768, 14545845632, 14554234496, 14562618496, 14571011456, -14579398784, 14587789184, 14596172672, 14604564608, 14612953984, -14621341312, 14629724288, 14638120832, 14646503296, 14654897536, -14663284864, 14671675264, 14680061056, 14688447616, 14696835968, -14705228416, 14713616768, 14722003328, 14730392192, 14738784128, -14747172736, 14755561088, 14763947648, 14772336512, 14780725376, -14789110144, 14797499776, 14805892736, 14814276992, 14822670208, -14831056256, 14839444352, 14847836032, 14856222848, 14864612992, -14872997504, 14881388672, 14889775744, 14898165376, 14906553472, -14914944896, 14923329664, 14931721856, 14940109696, 14948497024, -14956887424, 14965276544, 14973663616, 14982053248, 14990439808, -14998830976, 15007216768, 15015605888, 15023995264, 15032385152, -15040768384, 15049154944, 15057549184, 15065939072, 15074328448, -15082715008, 15091104128, 15099493504, 15107879296, 15116269184, -15124659584, 15133042304, 15141431936, 15149824384, 15158214272, -15166602368, 15174991232, 15183378304, 15191760512, 15200154496, -15208542592, 15216931712, 15225323392, 15233708416, 15242098048, -15250489216, 15258875264, 15267265408, 15275654528, 15284043136, -15292431488, 15300819584, 15309208192, 15317596544, 15325986176, -15334374784, 15342763648, 15351151744, 15359540608, 15367929728, -15376318336, 15384706432, 15393092992, 15401481856, 15409869952, -15418258816, 15426649984, 15435037568, 15443425664, 15451815296, -15460203392, 15468589184, 15476979328, 15485369216, 15493755776, -15502146944, 15510534272, 15518924416, 15527311232, 15535699072, -15544089472, 15552478336, 15560866688, 15569254528, 15577642624, -15586031488, 15594419072, 15602809472, 15611199104, 15619586432, -15627975296, 15636364928, 15644753792, 15653141888, 15661529216, -15669918848, 15678305152, 15686696576, 15695083136, 15703474048, -15711861632, 15720251264, 15728636288, 15737027456, 15745417088, -15753804928, 15762194048, 15770582656, 15778971008, 15787358336, -15795747712, 15804132224, 15812523392, 15820909696, 15829300096, -15837691264, 15846071936, 15854466944, 15862855808, 15871244672, -15879634816, 15888020608, 15896409728, 15904799104, 15913185152, -15921577088, 15929966464, 15938354816, 15946743424, 15955129472, -15963519872, 15971907968, 15980296064, 15988684928, 15997073024, -16005460864, 16013851264, 16022241152, 16030629248, 16039012736, -16047406976, 16055794816, 16064181376, 16072571264, 16080957824, -16089346688, 16097737856, 16106125184, 16114514816, 16122904192, -16131292544, 16139678848, 16148066944, 16156453504, 16164839552, -16173236096, 16181623424, 16190012032, 16198401152, 16206790528, -16215177344, 16223567744, 16231956352, 16240344704, 16248731008, -16257117824, 16265504384, 16273898624, 16282281856, 16290668672, -16299064192, 16307449216, 16315842176, 16324230016, 16332613504, -16341006464, 16349394304, 16357783168, 16366172288, 16374561664, -16382951296, 16391337856, 16399726208, 16408116352, 16416505472, -16424892032, 16433282176, 16441668224, 16450058624, 16458448768, -16466836864, 16475224448, 16483613056, 16492001408, 16500391808, -16508779648, 16517166976, 16525555328, 16533944192, 16542330752, -16550719616, 16559110528, 16567497088, 16575888512, 16584274816, -16592665472, 16601051008, 16609442944, 16617832064, 16626218624, -16634607488, 16642996096, 16651385728, 16659773824, 16668163712, -16676552576, 16684938112, 16693328768, 16701718144, 16710095488, -16718492288, 16726883968, 16735272832, 16743661184, 16752049792, -16760436608, 16768827008, 16777214336, 16785599104, 16793992832, -16802381696, 16810768768, 16819151744, 16827542656, 16835934848, -16844323712, 16852711552, 16861101952, 16869489536, 16877876864, -16886265728, 16894653056, 16903044736, 16911431296, 16919821696, -16928207488, 16936592768, 16944987776, 16953375616, 16961763968, -16970152832, 16978540928, 16986929536, 16995319168, 17003704448, -17012096896, 17020481152, 17028870784, 17037262208, 17045649536, -17054039936, 17062426496, 17070814336, 17079205504, 17087592064, -17095978112, 17104369024, 17112759424, 17121147776, 17129536384, -17137926016, 17146314368, 17154700928, 17163089792, 17171480192, -17179864192, 17188256896, 17196644992, 17205033856, 17213423488, -17221811072, 17230198912, 17238588032, 17246976896, 17255360384, -17263754624, 17272143232, 17280530048, 17288918912, 17297309312, -17305696384, 17314085504, 17322475136, 17330863744, 17339252096, -17347640192, 17356026496, 17364413824, 17372796544, 17381190016, -17389583488, 17397972608, 17406360704, 17414748544, 17423135872, -17431527296, 17439915904, 17448303232, 17456691584, 17465081728, -17473468288, 17481857408, 17490247552, 17498635904, 17507022464, -17515409024, 17523801728, 17532189824, 17540577664, 17548966016, -17557353344, 17565741184, 17574131584, 17582519168, 17590907008, -17599296128, 17607687808, 17616076672, 17624455808, 17632852352, -17641238656, 17649630848, 17658018944, 17666403968, 17674794112, -17683178368, 17691573376, 17699962496, 17708350592, 17716739968, -17725126528, 17733517184, 17741898112, 17750293888, 17758673024, -17767070336, 17775458432, 17783848832, 17792236928, 17800625536, -17809012352, 17817402752, 17825785984, 17834178944, 17842563968, -17850955648, 17859344512, 17867732864, 17876119424, 17884511872, -17892900224, 17901287296, 17909677696, 17918058112, 17926451072, -17934843776, 17943230848, 17951609216, 17960008576, 17968397696, -17976784256, 17985175424, 17993564032, 18001952128, 18010339712, -18018728576, 18027116672, 18035503232, 18043894144, 18052283264, -18060672128, 18069056384, 18077449856, 18085837184, 18094225792, -18102613376, 18111004544, 18119388544, 18127781248, 18136170368, -18144558976, 18152947328, 18161336192, 18169724288, 18178108544, -18186498944, 18194886784, 18203275648, 18211666048, 18220048768, -18228444544, 18236833408, 18245220736] - -cache_sizes = [ -16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, -17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, -18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, -19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, -20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, -21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, -22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, -23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, -24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, -25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, -25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, -26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, -27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, -28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, -29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, -30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, -31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, -32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, -33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, -34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, -35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, -36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, -36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, -37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, -38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, -39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, -40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, -41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, -42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, -43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, -44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, -45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, -46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, -47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, -47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, -48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, -49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, -50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, -51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, -52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, -53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, -54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, -55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, -56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, -57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, -58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, -58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, -59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, -60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, -61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, -62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, -63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, -64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, -65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, -66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, -67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, -68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, -69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, -69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, -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] -``` diff --git a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md deleted file mode 100644 index 14365daef39..00000000000 --- a/public/content/translations/it/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Algoritmi di mining -description: Uno sguardo dettagliato agli algoritmi usati per il mining di Ethereum. -lang: it ---- - - - -Il proof-of-work non è più alla base del meccanismo di consenso di Ethereum, a significare che il mining è stato disattivato. Invece, Ethereum, è protetto dai validatori che mettono ETH in staking. Puoi iniziare oggi a mettere i tuoi ETH in staking. Leggi di più su [La Fusione](/roadmap/merge/), il [proof-of-stake](/developers/docs/consensus-mechanisms/pos/) e lo [staking](/staking/). Questa pagina è per solo interesse storico. - - - -Il mining di Ethereum usava un algoritmo noto come Ethash. L'idea fondamentale dell'algoritmo è che un miner prova a trovare l'input di un nonce usando il calcolo di forza bruta, così che l'hash risultante sia inferiore a una soglia determinata dalla difficoltà calcolata. Questo livello di difficoltà può esser regolato dinamicamente, consentendo alla produzione dei blocchi di verificarsi a un intervallo regolare. - -## Prerequisiti {#prerequisites} - -Per comprendere meglio questa pagina, ti consigliamo prima di leggere sul [consenso proof-of-work](/developers/docs/consensus-mechanisms/pow) e sul [mining](/developers/docs/consensus-mechanisms/pow/mining). - -## Dagger Hashimoto {#dagger-hashimoto} - -Dagger Hashimoto era un algoritmo di ricerca precursore del mining di Ethereum, sostituito da Ethash. Era un amalgama di due algoritmi differenti: Dagger e Hashimoto. È sempre e solo stato un'implementazione di ricerca e fu superato da Ethash prima del lancio della Rete Principale di Ethereum. - -[Dagger](http://www.hashcash.org/papers/dagger.html) prevede la generazione di un [Grafico Aciclico Diretto](https://en.wikipedia.org/wiki/Directed_acyclic_graph), porzioni casuali del quale ricevono un hashing insieme. Il principio fondamentale è che ogni nonce richiede solo una piccola porzione di un grande albero di dati totali. Ricalcolare l'albero secondario per ogni nonce è proibitivo per il mining, da cui l'esigenza di memorizzare l'albero, invece, va bene per verificare un singolo nonce. Dagger è stato progettato per essere un'alternativa agli algoritmi esistenti come Scrypt, che sono gravosi per la memoria (memory-hard) ma difficili da verificare all'aumentare dell'uso della memoria verso livelli veramente sicuri. Dagger era però vulnerabile all'accelerazione dell'hardware con memoria condiviso ed è stato abbandonato a favore di altre vie di ricerca. - -[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) è un algoritmo che aggiunge resistenza ASIC, essendo vincolato da aspetti I/O (cioè le letture di memoria rappresentano il fattore limitante nel processo di mining). La teoria è che vi sia più disponibilità di RAM che di calcolo: sono già stati usati miliardi di dollari in ricerca per l'ottimizzazione della RAM per diversi scenari d'uso, che spesso coinvolgono schemi d'accesso semi-casuale (da cui "memoria d'accesso casuale", Random Access Memory). Di conseguenza, è probabile che la RAM esistente sia abbastanza vicina all'ottimale per valutare l'algoritmo. Hashimoto usa la blockchain come una fonte di dati, perché soddisfa simultaneamente i punti (1) e (3) di cui sopra. - -Dagger-Hashimoto usava delle versioni modificate degli algoritmi di Dagger e Hashimoto. La differenza tra Dagger Hashimoto e Hashimoto è che, anziché usare la blockchain come una fonte di dati, Dagger Hashimoto usa una serie di dati generata e personalizzata, che si aggiorna a seconda dei dati del blocco ogni N blocchi. La serie di dati è generata usando l'algoritmo di Dagger, che consente di calcolare efficientemente una sotto-serie specifica a ogni nonce per l'algoritmo di verifica del client leggero. La differenza tra Dagger Hashimoto e Dagger è che, a differenza del Dagger originale, il dataset usato per interrogare il blocco è semi-permanente, in quanto viene aggiornato solo occasionalmente (es. una volta a settimana). Questo significa che la porzione dello sforzo per generare il dataset è prossima allo zero, e diventano quindi trascurabili gli argomenti di Sergio Lerner riguardanti le velocizzazioni della memoria condivisa. - -Maggiori informazioni su [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto). - -## Ethash {#ethash} - -Ethash era l'algoritmo di mining che era effettiamente usato sulla vera Rete Principale di Ethereum sotto l'ora deprecata architettura del proof-of-work. Ethash in realtà è un nuovo nome assegnato a una versione specifica di Dagger-Hashimoto dopo un aggiornamento significativo dell'algoritmo, che comunque eredita i principi fondamentali del suo predecessore. La Rete Principale di Ethereum ha sempre e solo usato Ethash; Dagger Hashimoto era una versione R&D dell'algoritmo di mining che fu superata prima che il mining fosse avviato sulla rete principale di Ethereum. - -[Maggiori informazioni su Ethash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash). - -## Letture consigliate {#further-reading} - -_Conosci una risorsa della community che ti è stata utile? Modifica questa pagina e aggiungila!_ diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md deleted file mode 100644 index 9d2b83b8b13..00000000000 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -title: ダガーハシモト -description: ダガーハシモト・アルゴリズムの詳細 -lang: ja ---- - -ダガーハシモト(Dagger-Hashimoto)は、イーサリアムのマイニングアルゴリズムの最初の研究実装と仕様でした。 その後、ダガーハシモトから[Ethash](#ethash)に置き換えられました。 マイニングは、2022 年 9 月 15 日の[マージ](/updates/merge)で完全に廃止されました。 それ以降、イーサリアムには [プルーフ・オブ・ステーク](/developers/docs/consensus-mechanisms/pos)のメカニズムが使われています。 このページについては過去の流れを理解する目的でご覧ください。この情報は、マージ後のイーサリアムには該当しません。 - -## 前提知識 {#prerequisites} - -このページをより理解するために、まず[プルーフ・オブ・ワーク・コンセンサス](/developers/docs/consensus-mechanisms/pow)、[マイニング](/developers/docs/consensus-mechanisms/pow/mining)、[マイニングアルゴリズム](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms)を読むことをお勧めします。 - -## ダガーハシモト {#dagger-hashimoto} - -ダガーハシモトは、次の 2 つの目的を達成することを目指しています。 - -1. **ASIC 耐性**: アルゴリズム専用ハードウェアの製作によって得られる利益を、最小限にすること。 -2. **ライトクライアントの検証可能性**: ライトクライアントがブロックを効率的に検証可能であること。 - -追加の修正により、ご希望に応じて、3 つ目の目標を達成する方法も記載しますが、複雑になります。 - -**フルチェーンストレージ**: マイニングでは、完全なブロックチェーンの状態の保管を必要にすること(イーサリアムのステートツリーの不規則な構造により、特によく使われるいくつかのコントラクトは、ある程度のプルーニングが可能だと予想されます。しかし、これを最小限に抑えたいと考えています)。 - -## 有向非巡回グラフ(DAG)の生成 {#dag-generation} - -Python を使って、このアルゴリズムのコードを以下に定義します。 最初に、指定された精度の符号なし整数型を、マーシャリングして文字列にするため `encode_int`を用意します。 変換された値を戻す関数もまた用意します。 - -```python -NUM_BITS = 512 - -def encode_int(x): - "Encode an integer x as a string of 64 characters using a big-endian scheme" - o = '' - for _ in range(NUM_BITS / 8): - o = chr(x % 256) + o - x //= 256 - return o - -def decode_int(s): - "Unencode an integer x from a string using a big-endian scheme" - x = 0 - for c in s: - x *= 256 - x += ord(c) - return x -``` - -次に`sha3`は、整数を引数に取り、整数を出力する関数とします。`dbl_sha3`は、倍精度浮動小数点数型の sha3 関数とします。このレファレンスのコードを、実装する場合は次のように使います。 - -```python -from pyethereum import utils -def sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(x)) - -def dbl_sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(utils.sha3(x))) -``` - -### パラメータ {#parameters} - -アルゴリズムに使用されるパラメータは次のとおりです。 - -```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 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 -} -``` - -この場合、`P`は、`log₂(P)`によって 512 よりわずかに小さくなるように選ばれた素数です。これは、数値を表すために使用している 512 ビットに対応します。 実際に格納される必要があるのは、DAG の後半部分です。事実上の RAM 要件は、1GB から始まり毎年 441MB ずつ増加します。 - -### ダガーグラフの構築 {#dagger-graph-building} - -原始的なダガーグラフの構築は、以下のように定義できます。 - -```python -def produce_dag(params, seed, length): - P = params["P"] - picker = init = pow(sha3(seed), params["w"], P) - o = [init] - for i in range(1, length): - x = picker = (picker * init) % P - for _ in range(params["k"]): - x ^= o[x % i] - o.append(pow(x, params["w"], P)) - return o -``` - -基本的には、単一ノードである`sha3(seed)`として、グラフをスタートします。そこから、ランダムな前のノードに基づいて、他のノードを順次追加し始めます。 新しいノードが作成されると、シードの冪剰余が計算され、`i`より小さいいくつかのインデックスがランダムに選択されます (上記の`x % i`を使用) 。それらのインデックスのノードの値は、計算で使用され、`x`の新しい値を生成します。この値は、 (排他的論理和に基づいた) 小さなプルール・オブ・ワーク関数に送られ、最終的にはインデックス`i`のブラフの値を生成します。 この特有の設計の背後にある理論的根拠は、DAG のシーケンシャルアクセスを強制することです。アクセスされる DAG の次の値は、現在の値が判明するまで決定できません。 最後に、冪剰余で結果をさらにハッシュ化します。 - -このアルゴリズムは、数論から得られたいくつかの結果に依存しています。 考察については、ページ下部にある付録を参照してください。 - -## ライトクライアントの評価 {#light-client-evaluation} - -上記のグラフ構造は、少数のノードのみのサブツリーを計算してグラフの各ノードを再構築できるようすることを目的にしています。また、少量の補助メモリのみを必要とします。 k=1 の場合、サブツリーは、DAG の最初の要素までのチェーンの値にすぎないことに注意してください。 - -ライトクライアントの DAG 計算関数は、次のように動作します。 - -```python -def quick_calc(params, seed, p): - w, P = params["w"], params["P"] - cache = {} - - def quick_calc_cached(p): - if p in cache: - pass - elif p == 0: - cache[p] = pow(sha3(seed), w, P) - else: - x = pow(sha3(seed), (p + 1) * w, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(x % p) - cache[p] = pow(x, w, P) - return cache[p] - - return quick_calc_cached(p) -``` - -基本的に、上記のアルゴリズムを単純に書き直し、DAG 全体の値を計算するループが除かれ、以前のノード検索から、再帰呼び出しまたはキャッシュ検索に置き換えられています。 `k=1`の場合、キャッシュは不要となることに注意してください。しかし、さらなる最適化において、DAG の最初の数千の値が事前に計算され、計算用の静的キャッシュとして保持されます。これのコード実装は、付録を参照してください。 - -## 有向非巡回グラフ(DAG)のダブルバッファ {#double-buffer} - -フルクライアントでは、上記の式で生成した 2 つの DAG の[_ダブルバッファ_](https://wikipedia.org/wiki/Multiple_buffering)が使われます。 このアイデアは、DAG が上記のパラメータに従い、ブロックの`epochtime`数ごとに生成されるというものです。 クライアントは、最新の生成された DAG を使うのではなく、1 つ前の DAG を使います。 この利点としては、マイナーが突然すべてのデータを再計算するステップを取り入れる必要がなく、DAG を時間の経過とともに置き換えられることです。 そうでなければ、チェーンを処理する一定間隔で突然一時的に遅くなり、集中化が劇的に増加する可能性があります。 これにより、すべてのデータが再計算される前の数分間以内に、51%攻撃のリスクが発生します。 - -ブロックのワークを計算するために使われる DAG セットを生成するために使用するアルゴリズムは、次のようになります。 - -```python -def get_prevhash(n): - from pyethereum.blocks import GENESIS_PREVHASH - from pyethereum import chain_manager - if num <= 0: - return hash_to_int(GENESIS_PREVHASH) - else: - prevhash = chain_manager.index.get_block_by_number(n - 1) - return decode_int(prevhash) - -def get_seedset(params, block): - seedset = {} - seedset["back_number"] = block.number - (block.number % params["epochtime"]) - seedset["back_hash"] = get_prevhash(seedset["back_number"]) - seedset["front_number"] = max(seedset["back_number"] - params["epochtime"], 0) - seedset["front_hash"] = get_prevhash(seedset["front_number"]) - return seedset - -def get_dagsize(params, block): - return params["n"] + (block.number // params["epochtime"]) * params["n_inc"] - -def get_daggerset(params, block): - dagsz = get_dagsize(params, block) - seedset = get_seedset(params, block) - if seedset["front_hash"] <= 0: - # No back buffer is possible, just make front buffer - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": 0}} - else: - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": seedset["front_number"]}, - "back": {"dag": produce_dag(params, seedset["back_hash"], dagsz), - "block_number": seedset["back_number"]}} -``` - -## ハシモト {#hashimoto} - -オリジナルのハシモトの背景にあるアイデアは、ブロックチェーンをデータセットとして使用することです。ブロックチェーンから N 個のインデックスを選択して計算を実行し、これらのインデックスでトランザクションを収集し、このデータの排他的論理和(XOR)を実行して、結果のハッシュ値を返します。 Thaddeus Dryja のオリジナルのアルゴリズムは、次のように一貫性のために Python でも書かれています。 - -```python -def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): - hash_output_A = sha256(prev_hash + merkle_root + nonce) - txid_mix = 0 - for i in range(64): - shifted_A = hash_output_A >> i - transaction = shifted_A % len(list_of_transactions) - txid_mix ^= list_of_transactions[transaction] << i - return txid_max ^ (nonce << 192) -``` - -残念ながら、ハシモトは RAM の消費が多いとみなされています。256 ビット演算に依存しており、計算にかなりのオーバーヘッドがあります。 しかし、ダガーハシモトでは、この問題に対処するため、最下位 64 ビットのみを使用してデータセットのインデックスを作成します。 - -```python -def hashimoto(dag, dagsize, params, header, nonce): - m = dagsize / 2 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= dag[m + (mix % 2**64) % m] - return dbl_sha3(mix) -``` - -倍精度浮動小数点数型(double) SHA3 を使用して、ゼロデータ形式、ほぼ即時の事前検証、提供された正しい中間値のみの検証などが可能です。 このプルーフ・オブ・ワークの外側のレイヤーは、ASIC と相性が非常に良く、かなり脆弱になってます。しかし、すぐに拒否されないブロックを生成するには、少量のワークをしなければならないため、DDoS 攻撃をさらに困難にします。 以下は、ライトクライアントのバージョンです。 - -```python -def quick_hashimoto(seed, dagsize, params, header, nonce): - m = dagsize // 2 - mix = sha3(nonce + header) - for _ in range(params["accesses"]): - mix ^= quick_calc(params, seed, m + (mix % 2**64) % m) - return dbl_sha3(mix) -``` - -## マイニングと検証 {#mining-and-verifying} - -それでは、すべてをマイニングアルゴリズムにまとめてみましょう。 - -```python -def mine(daggerset, params, block): - from random import randint - nonce = randint(0, 2**64) - while 1: - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - if result * params["diff"] < 2**256: - break - nonce += 1 - if nonce >= 2**64: - nonce = 0 - return nonce -``` - -以下は、検証アルゴリズムです。 - -```python -def verify(daggerset, params, block, nonce): - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -以下は、ライトクライアントフレンドリーな検証です。 - -```python -def light_verify(params, header, nonce): - seedset = get_seedset(params, block) - result = quick_hashimoto(seedset["front_hash"], get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -また、ダガーハシモトは、ブロックヘッダに次の追加の要件を課していることに注意してください。 - -- 2 層検証が機能するためには、ブロックヘッダーに、ノンス (nonce)と、前に sha3 だった中間値の両方が含まれている必要がある。 -- ブロックヘッダーのどこかに、現在のシードセットの sha3 が格納されている必要がある。 - -## 参考文献 {#further-reading} - -_役に立つコミュニティリソースをご存知の場合は、 このページを編集して追加してください。_ - -## 付録 {#appendix} - -前述のように、DAG の生成で使われる乱数発生器(RNG)は、数論から得られた次の結果に依存しています。 最初に`picker`変数のもととなるレーマー乱数発生器の周期が広いことを断言しておきます。 次に、`pow(x,3,P)`は、 `x ∈ [2,P-2]`を開始条件として、`x`を`1`または`P-1`にマップしないことを示します。 最後に、 `pow(x,3,P)`を、ハッシュ関数として扱うと、衝突率が低くなることを示します。 - -### レーマー 乱数発生器 {#lehmer-random-number} - -`produce_dag`関数は、無作為の乱数を生成する必要がない一方で、潜在的な脅威として`seed**i % P`が一握りの値しか取れません。 このため、このパターンを認識しているマイナーは、そうでないマイナーに比べて有利になる可能性があります。 - -これを避けるために、数論による結果を使う必要があります。 [_安全素数_](https://en.wikipedia.org/wiki/Safe_prime)とは、 `(P-1)/2`も素数であるような素数`P`と定義されています。 [乗法群](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n)のメンバー `x`の*次数* `ℤ/nℤ`は、次の公式にある小さい字の`m`で定義されています。
      xᵐ mod P ≡ 1
      -これらの定義から、次のようになります。 - -> 見解 1. `x`を安全素数`P`の乗法群`ℤ/Pℤ`のメンバーとします。 `x mod P ≠ 1 mod P`かつ`x mod P ≠ P-1 mod P`の場合は、`x`の次数は、`P-1`または`(P-1)/2`となります。 - -_証明_. `P`は安全素数なので、\[ラグランジュの定理\]\[lagrange\]により、`x`の次数は`1`、`2`、`(P-1)/2`、または`P-1`のいずれかになります。 - -`x`の次数は`1`になることはできません。フェルマーの小定理により、次を満たすためです。 - -
      xP-1 mod P ≡ 1
      - -したがって、`x`は`ℤ/nℤ`の乗法的単位元でなければならず、一意です。 前提で`x≠1`としたので、これはありえません。 - -`x = P-1`でない限り、`x`の次数を`2`にすることはできません。これは、`P`が素数であることに違反するためです。 - -上記の命題から、`(picker * init) % P`の繰り返しは、少なくとも`(P-1)/2`の周期になることがわかります。 これは、`P`を 2 以上の累乗にほぼ等しい安全素数として選択し、`init`が`[2,2**256+1]`の間隔にあるためです。 `P`の大きさを考えると、冪剰余から周期を予想することはできません。 - -DAG の最初のセルを割り当てるとき (`init`というラベルの付いた変数) 、`pow(sha3(seed) + 2, 3, P)`を計算します。 一見すると、これは結果が`1`でも`P-1`でもないことを保証しません。 しかし、`P-1`は、安全素数であるため、見解 1 の帰結となる次の追加の保証があります。 - -> 見解 2. `x`を安全素数`P`の乗法群`ℤ/Pℤ`のメンバーとし、`w`を自然数とします。 `x mod P ≠ 1 mod P`かつ`x mod P ≠ P-1 mod P`および`w mod P ≠ P-1 mod P`かつ`w mod P ≠ 0 mod P`の場合、`xʷ mod P ≠ 1 mod P`かつ`xʷ mod P ≠ P-1 mod P` - -### ハッシュ関数としての冪乗余 {#modular-exponentiation} - -`P`と`w`の特定の値に対して、関数`pow(x,w,P)`は、多くの衝突を起こす可能性があります。 たとえば、`pow(x,9,19) `は値`{1,18}`のみを取ります。 - -`P`が素数であるとすると、累積余剰ハッシュ関数の適切な`w`は、次の結果を使用して選択できます。 - -> 見解 3. `P`を素数とし、`ℤ/Pℤ`のすべての`a`かつ`b`において、そのときに限り`w`かつ`P-1`が互いに素であることが成り立ち、これは次のようになります。 -> ->
      -> `a mod P ≡ b mod P` のとき、そのときに限り `aʷ mod P ≡ bʷ mod P` ->
      - -したがって、`P`が素数でかつ`w`が`P-1`に対して互いに素であるとすると、`|{pow(x, w, P) : x ∈ ℤ}| = P `が得られます。考えられるハッシュ関数の衝突率が最小であることを意味します。 - -選択したように`P`が安全素数であるという特殊なケースでは、`P-1`が 1、2、`(P-1)/2`、および`P-1`の因数のみを持ちます。 `P`>7 であるため、3 は、`P-1`に対して互いに素であることがわかります。したがって、`w=3`は、上記の命題を満たします。 - -## より効率的なキャッシュベースの評価アルゴリズム {#cache-based-evaluation} - -```python -def quick_calc(params, seed, p): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_calc_cached(cache, params, p) - -def quick_calc_cached(cache, params, p): - P = params["P"] - if p < len(cache): - return cache[p] - else: - x = pow(cache[0], p + 1, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(cache, params, x % p) - return pow(x, params["w"], P) - -def quick_hashimoto(seed, dagsize, params, header, nonce): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_hashimoto_cached(cache, dagsize, params, header, nonce) - -def quick_hashimoto_cached(cache, dagsize, params, header, nonce): - m = dagsize // 2 - mask = 2**64 - 1 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) - return dbl_sha3(mix) -``` diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md deleted file mode 100644 index 6ce129cda25..00000000000 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ /dev/null @@ -1,1014 +0,0 @@ ---- -title: Ethash -description: Ethashアルゴリズムの詳細 -lang: ja ---- - - - Ethashは、イーサリアムのプルーフ・オブ・ワークのマイニングアルゴリズムでした。 プルーフ・オブ・ワークは、今『完全に廃止』されており、イーサリアムは現在プルーフ・オブ・ステークにより安全が確保されています。 詳細については、マージプルーフ・オブ・ステークおよびステーキングを参照してください。 このページについては、これまでのイーサリアムの歩みを学ぶための参考としてお読みください。 - - -[Ethash](https://github.com/ethereum/wiki/wiki/Ethash)は、 [ダガーハシモト](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto)アルゴリズムの改良版です。 Ethash プルーフ・オブ・ワークは、[メモリハード](https://wikipedia.org/wiki/Memory-hard_function)になっており、アルゴリズムで ASIC 耐性が高まると考えられました。 最終的には、Ethash ASIC が開発されましたが、GPU マイニングは、プルーフ・オブ・ワークが停止されるまでが実行可能なオプションでした。 Ethash は現在でも、イーサリアム以外のプルール・オブ・ワーク・ネットワークで他のコインのマイニングに使われています。 - -## Ethash の仕組み {#how-does-ethash-work} - -ノンス (nonce)とブロックヘッダーに依存する固定リソースのサブセットを選択する必要があるプルーフ・オブ・ワーク・アルゴリズムで、メモリハードを実現します。 この(数ギガバイトの大きさの)リソースは、DAG と呼ばれます。 DAG は、30000 ブロックごと、エポックと呼ばれる最大 125 時間(約 5.2 日)のウィンドウで、変更されます。また生成にはしばらく時間がかかります。 DAG はブロックの高さのみに依存するため、事前に生成はできますが、そうでない場合、クライアントはブロックの生成プロセスが終わるまで待つ必要があります。 クライアントが事前に DAG を生成してキャッシュしないと、各エポックの遷移で大規模なブロック遅延がネットワークに発生する可能性があります。 プルーフ・オブ・ワークを検証するために、DAG が生成される必要がないことに留意してください。基本的に低 CPU と小さなメモリ両方で検証できます。 - -アルゴリズムが取る一般的なルートは以下のとおりです。 - -1. **シード**が存在し、その時点までブロックヘッダーをスキャンすることで、ブロックごとに計算できる。 -2. シードから**16MB の疑似乱数キャッシュ**を計算できる。 ライトクライアントは、キャッシュを保存する。 -3. キャッシュから各アイテムがキャッシュの少数のアイテムのみに依存するプロパティを持つ**1GB データセット**を生成できる。 フルクライアントとマイナーは、データセットを保存する。 データセットは時間とともに線形的に増加する。 -4. マイニングは、データセットのランダムなスライスを取得し、それらを結合してハッシュ化する。 検証はキャッシュを使用して必要なデータセットの特定の部分を再生成するため、少ないメモリで実行できる(そのためキャッシュの保存だけ必要)。 - -大きなデータセットでは、30000 ブロックごとに一度更新されます。マイナーの労力の大部分は、データセットを読み込むことであり、データセットに変更を加えることではありません。 - -## 定義 {#definitions} - -以下の定義を採用しています。 - -``` -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 -``` - -### 「SHA3」の使用 {#sha3} - -イーサリアムの開発は、SHA3 標準の開発と同時期に起こりました。標準プロセスは、最終決定したハッシュアルゴリズムのパディングが遅れて変更されたため、イーサリアムの「sha3_256」および「sha3_512」ハッシュは、標準の sha3 ハッシュではありません。他の文脈の多くでは、変異型として「Keccak-256」および「Keccak-512」と呼ばれています。 この考察については、 [こちら](https://eips.ethereum.org/EIPS-1803)、[こちら](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)、または[こちら](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)を参照してください。 - -以下のアルゴリズムの説明では、「sha3」ハッシュが参照されることを覚えておいてください。 - -## パラメータ {#parameters} - -Ethash のキャッシュとデータセットのパラメータは、ブロック番号に依存します。 キャッシュサイズとデータセットサイズは、両方とも線形に増えていきます。しかし、周期的な動作につながる偶発的な規則性が発生するリスクを減らすために、線形的に増加するしきい値を下回る最大の素数を常に取ります。 - -```python -def get_cache_size(block_number): - sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= HASH_BYTES - while not isprime(sz / HASH_BYTES): - sz -= 2 * HASH_BYTES - return sz - -def get_full_size(block_number): - sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= MIX_BYTES - while not isprime(sz / MIX_BYTES): - sz -= 2 * MIX_BYTES - return sz -``` - -データセットとキャッシュサイズの値の表は、付録に記載されています。 - -## キャッシュ生成 {#cache-generation} - -以下に、キャッシュを生成する関数を記述します。 - -```python -def mkcache(cache_size, seed): - n = cache_size // HASH_BYTES - - # Sequentially produce the initial dataset - o = [sha3_512(seed)] - for i in range(1, n): - o.append(sha3_512(o[-1])) - - # Use a low-round version of randmemohash - for _ in range(CACHE_ROUNDS): - for i in range(n): - v = o[i][0] % n - o[i] = sha3_512(map(xor, o[(i-1+n) % n], o[v])) - - return o -``` - -キャッシュ生成プロセスは、最初に 32MB のメモリを順番に埋め、次に、[_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf)に掲載されている Sergio Demian Lerner 氏の*RandMemoHash*アルゴリズムを 2 パス実行します。 出力は、524288 個の 64 バイトの値のセットです。 - -## データ集約関数 {#date-aggregation-function} - -いくつかのケースにおいて、排他的論理和の非結合的代替として[FNV hash](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function)から発想を得たアルゴリズムを使用します。 素数を 1 バイト(オクテット)ずつ順番に乗算する FNV-1 の仕様ではなく、素数を全 32 ビットの入力で乗算することに注意してください。 - -```python -FNV_PRIME = 0x01000193 - -def fnv(v1, v2): - return ((v1 * FNV_PRIME) ^ v2) % 2**32 -``` - -イエローペーパーでは、FNV を v1\*(FNV_PRIME ^ v2)と指定していますが、現在の実装ではすべて上記の定義で統一しています。 - -## フルデータセットの計算 {#full-dataset-calculation} - -1GB のフルデータセットの 64 バイトの各アイテムは、次のように計算されます。 - -```python -def calc_dataset_item(cache, i): - n = len(cache) - r = HASH_BYTES // WORD_BYTES - # initialize the mix - 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 - for j in range(DATASET_PARENTS): - cache_index = fnv(i ^ j, mix[j % r]) - mix = map(fnv, mix, cache[cache_index % n]) - return sha3_512(mix) -``` - -基本的に、疑似乱数で選ばれた 256 個のキャッシュノードからデータを結合し、データセットノードを計算するためにハッシュ化します。 そのあと、データセット全体が、次のように生成されます。 - -```python -def calc_dataset(full_size, cache): - return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)] -``` - -## メインループ {#main-loop} - -ここでは、メインのハシモトに似たループを記述します。特定のヘッダーとノンス (nonce)の最終的な値を生成するために、フルデータセットからデータを集約します。 以下のコードでは、`header`は*切り捨てられた*ブロックヘッダー(すなわち、フィールド**mixHash**と**nonce**を除外したヘッダー)の RLP 表現の SHA3-256*ハッシュ*を表します。 `nonce`は、ビッグエンディアンオーダーの 64 ビット符号なし整数 8 バイトです。 したがって、`nonce[::-1]`は、その値の 8 バイトのリトルエンディアン表現です。 - -```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 - s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s - mix = [] - for _ in range(MIX_BYTES / HASH_BYTES): - mix.extend(s) - # mix in random dataset nodes - 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 - 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])) - return { - "mix digest": serialize_hash(cmix), - "result": serialize_hash(sha3_256(s+cmix)) - } - -def hashimoto_light(full_size, cache, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x)) - -def hashimoto_full(full_size, dataset, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: dataset[x]) -``` - -基本的に、128 バイト幅の「mix」を維持し、フルデータセットから 128 バイトを繰り返し順番にフェッチし、`fnv`関数を使って、それを mix と結合します。 128 バイトのシーケンシャルアクセス が使用されており、アルゴリズムの各ラウンドは、常に RAM から完全なページをフェッチし、理論的に ASIC が回避できるトランスレーション・ルックアサイド・バッファのミスを最小限にします。 - -アルゴリズムの出力が目標値を下回っている場合は、ノンス (nonce)は有効です。 `sha3_256`を最後に追加適用することで、ノンス (nonce)が必ず存在することになります。これは、少なくとも少量のワークが行われたことを証明するために提供でき、このクイックアウタ・ープルーフ・オブ・ワーク(PoW)検証は、DDoS 対策に利用できます。 また、その結果が不偏の 256 ビットの数であることを統計的に保証する役割もあります。 - -## マイニング {#mining} - -マイニングアルゴリズムは、以下のように定義されています。 - -```python -def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit - target = zpad(encode_int(2**256 // difficulty), 64)[::-1] - from random import randint - nonce = randint(0, 2**64) - while hashimoto_full(full_size, dataset, header, nonce) > target: - nonce = (nonce + 1) % 2**64 - return nonce -``` - -## シードハッシュの定義 {#seed-hash} - -あるブロック上でマイニングをするために使うシードハッシュを計算するのに、以下のアルゴリズムを使っています。 - -```python - def get_seedhash(block): - s = '\x00' * 32 - for i in range(block.number // EPOCH_LENGTH): - s = serialize_hash(sha3_256(s)) - return s -``` - -スムーズなマイニングと検証のために、別々のスレッドで将来のシードハッシュとデータセットを事前計算することを推奨します。 - -## 参考文献 {#further-reading} - -_役に立つコミュニティリソースをご存知の場合は、 このページを編集して追加してください。_ - -## 付録 {#appendix} - -上記の python で記述された仕様をコードとして実行する場合は、以下のコードを先頭に付け足してください。 - -```python -import sha3, copy - -# Assumes little endian bit ordering (same as Intel architectures) -def decode_int(s): - return int(s[::-1].encode('hex'), 16) if s else 0 - -def encode_int(s): - a = "%x" % s - return '' if s == 0 else ('0' * (len(a) % 2) + a).decode('hex')[::-1] - -def zpad(s, length): - return s + '\x00' * max(0, length - len(s)) - -def serialize_hash(h): - return ''.join([zpad(encode_int(x), 4) for x in h]) - -def deserialize_hash(h): - return [decode_int(h[i:i+WORD_BYTES]) for i in range(0, len(h), WORD_BYTES)] - -def hash_words(h, sz, x): - if isinstance(x, list): - x = serialize_hash(x) - y = h(x) - return deserialize_hash(y) - -def serialize_cache(ds): - return ''.join([serialize_hash(h) for h in ds]) - -serialize_dataset = serialize_cache - -# sha3 hash function, outputs 64 bytes -def sha3_512(x): - return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) - -def sha3_256(x): - return hash_words(lambda v: sha3.sha3_256(v).digest(), 32, x) - -def xor(a, b): - return a ^ b - -def isprime(x): - for i in range(2, int(x**0.5)): - if x % i == 0: - return False - return True -``` - -### データサイズ {#data-sizes} - -次のルックアップテーブルは、データサイズとキャッシュサイズの約 2048 個のエポックの一覧です。 - -```python -def get_datasize(block_number): - return data_sizes[block_number // EPOCH_LENGTH] - -def get_cachesize(block_number): - return cache_sizes[block_number // EPOCH_LENGTH] - -data_sizes = [ -1073739904, 1082130304, 1090514816, 1098906752, 1107293056, -1115684224, 1124070016, 1132461952, 1140849536, 1149232768, -1157627776, 1166013824, 1174404736, 1182786944, 1191180416, -1199568512, 1207958912, 1216345216, 1224732032, 1233124736, -1241513344, 1249902464, 1258290304, 1266673792, 1275067264, -1283453312, 1291844992, 1300234112, 1308619904, 1317010048, -1325397376, 1333787776, 1342176128, 1350561664, 1358954368, -1367339392, 1375731584, 1384118144, 1392507008, 1400897408, -1409284736, 1417673344, 1426062464, 1434451072, 1442839168, -1451229056, 1459615616, 1468006016, 1476394112, 1484782976, -1493171584, 1501559168, 1509948032, 1518337664, 1526726528, -1535114624, 1543503488, 1551892096, 1560278656, 1568669056, -1577056384, 1585446272, 1593831296, 1602219392, 1610610304, -1619000192, 1627386752, 1635773824, 1644164224, 1652555648, -1660943488, 1669332608, 1677721216, 1686109312, 1694497664, -1702886272, 1711274624, 1719661184, 1728047744, 1736434816, -1744829056, 1753218944, 1761606272, 1769995904, 1778382464, -1786772864, 1795157888, 1803550592, 1811937664, 1820327552, -1828711552, 1837102976, 1845488768, 1853879936, 1862269312, -1870656896, 1879048064, 1887431552, 1895825024, 1904212096, -1912601216, 1920988544, 1929379456, 1937765504, 1946156672, -1954543232, 1962932096, 1971321728, 1979707264, 1988093056, -1996487552, 2004874624, 2013262208, 2021653888, 2030039936, -2038430848, 2046819968, 2055208576, 2063596672, 2071981952, -2080373632, 2088762752, 2097149056, 2105539712, 2113928576, -2122315136, 2130700672, 2139092608, 2147483264, 2155872128, -2164257664, 2172642176, 2181035392, 2189426048, 2197814912, -2206203008, 2214587264, 2222979712, 2231367808, 2239758208, -2248145024, 2256527744, 2264922752, 2273312128, 2281701248, -2290086272, 2298476672, 2306867072, 2315251072, 2323639168, -2332032128, 2340420224, 2348808064, 2357196416, 2365580416, -2373966976, 2382363008, 2390748544, 2399139968, 2407530368, -2415918976, 2424307328, 2432695424, 2441084288, 2449472384, -2457861248, 2466247808, 2474637184, 2483026816, 2491414144, -2499803776, 2508191872, 2516582272, 2524970368, 2533359232, -2541743488, 2550134144, 2558525056, 2566913408, 2575301504, -2583686528, 2592073856, 2600467328, 2608856192, 2617240448, -2625631616, 2634022016, 2642407552, 2650796416, 2659188352, -2667574912, 2675965312, 2684352896, 2692738688, 2701130624, -2709518464, 2717907328, 2726293376, 2734685056, 2743073152, -2751462016, 2759851648, 2768232832, 2776625536, 2785017728, -2793401984, 2801794432, 2810182016, 2818571648, 2826959488, -2835349376, 2843734144, 2852121472, 2860514432, 2868900992, -2877286784, 2885676928, 2894069632, 2902451584, 2910843008, -2919234688, 2927622784, 2936011648, 2944400768, 2952789376, -2961177728, 2969565568, 2977951616, 2986338944, 2994731392, -3003120256, 3011508352, 3019895936, 3028287104, 3036675968, -3045063808, 3053452928, 3061837696, 3070228352, 3078615424, -3087003776, 3095394944, 3103782272, 3112173184, 3120562048, -3128944768, 3137339264, 3145725056, 3154109312, 3162505088, -3170893184, 3179280256, 3187669376, 3196056704, 3204445568, -3212836736, 3221224064, 3229612928, 3238002304, 3246391168, -3254778496, 3263165824, 3271556224, 3279944576, 3288332416, -3296719232, 3305110912, 3313500032, 3321887104, 3330273152, -3338658944, 3347053184, 3355440512, 3363827072, 3372220288, -3380608384, 3388997504, 3397384576, 3405774208, 3414163072, -3422551936, 3430937984, 3439328384, 3447714176, 3456104576, -3464493952, 3472883584, 3481268864, 3489655168, 3498048896, -3506434432, 3514826368, 3523213952, 3531603584, 3539987072, -3548380288, 3556763264, 3565157248, 3573545344, 3581934464, -3590324096, 3598712704, 3607098752, 3615488384, 3623877248, -3632265856, 3640646528, 3649043584, 3657430144, 3665821568, -3674207872, 3682597504, 3690984832, 3699367808, 3707764352, -3716152448, 3724541056, 3732925568, 3741318016, 3749706368, -3758091136, 3766481536, 3774872704, 3783260032, 3791650432, -3800036224, 3808427648, 3816815488, 3825204608, 3833592704, -3841981568, 3850370432, 3858755968, 3867147904, 3875536256, -3883920512, 3892313728, 3900702592, 3909087872, 3917478784, -3925868416, 3934256512, 3942645376, 3951032192, 3959422336, -3967809152, 3976200064, 3984588416, 3992974976, 4001363584, -4009751168, 4018141312, 4026530432, 4034911616, 4043308928, -4051695488, 4060084352, 4068472448, 4076862848, 4085249408, -4093640576, 4102028416, 4110413696, 4118805632, 4127194496, -4135583104, 4143971968, 4152360832, 4160746112, 4169135744, -4177525888, 4185912704, 4194303616, 4202691968, 4211076736, -4219463552, 4227855488, 4236246656, 4244633728, 4253022848, -4261412224, 4269799808, 4278184832, 4286578048, 4294962304, -4303349632, 4311743104, 4320130432, 4328521088, 4336909184, -4345295488, 4353687424, 4362073472, 4370458496, 4378852736, -4387238528, 4395630208, 4404019072, 4412407424, 4420790656, -4429182848, 4437571456, 4445962112, 4454344064, 4462738048, -4471119232, 4479516544, 4487904128, 4496289664, 4504682368, -4513068416, 4521459584, 4529846144, 4538232704, 4546619776, -4555010176, 4563402112, 4571790208, 4580174464, 4588567936, -4596957056, 4605344896, 4613734016, 4622119808, 4630511488, -4638898816, 4647287936, 4655675264, 4664065664, 4672451968, -4680842624, 4689231488, 4697620352, 4706007424, 4714397056, -4722786176, 4731173248, 4739562368, 4747951744, 4756340608, -4764727936, 4773114496, 4781504384, 4789894784, 4798283648, -4806667648, 4815059584, 4823449472, 4831835776, 4840226176, -4848612224, 4857003392, 4865391488, 4873780096, 4882169728, -4890557312, 4898946944, 4907333248, 4915722368, 4924110976, -4932499328, 4940889728, 4949276032, 4957666432, 4966054784, -4974438016, 4982831488, 4991221376, 4999607168, 5007998848, -5016386432, 5024763776, 5033164672, 5041544576, 5049941888, -5058329728, 5066717056, 5075107456, 5083494272, 5091883904, -5100273536, 5108662144, 5117048192, 5125436032, 5133827456, -5142215296, 5150605184, 5158993024, 5167382144, 5175769472, -5184157568, 5192543872, 5200936064, 5209324928, 5217711232, -5226102656, 5234490496, 5242877312, 5251263872, 5259654016, -5268040832, 5276434304, 5284819328, 5293209728, 5301598592, -5309986688, 5318374784, 5326764416, 5335151488, 5343542144, -5351929472, 5360319872, 5368706944, 5377096576, 5385484928, -5393871232, 5402263424, 5410650496, 5419040384, 5427426944, -5435816576, 5444205952, 5452594816, 5460981376, 5469367936, -5477760896, 5486148736, 5494536832, 5502925952, 5511315328, -5519703424, 5528089984, 5536481152, 5544869504, 5553256064, -5561645696, 5570032768, 5578423936, 5586811264, 5595193216, -5603585408, 5611972736, 5620366208, 5628750464, 5637143936, -5645528192, 5653921408, 5662310272, 5670694784, 5679082624, -5687474048, 5695864448, 5704251008, 5712641408, 5721030272, -5729416832, 5737806208, 5746194304, 5754583936, 5762969984, -5771358592, 5779748224, 5788137856, 5796527488, 5804911232, -5813300608, 5821692544, 5830082176, 5838468992, 5846855552, -5855247488, 5863636096, 5872024448, 5880411008, 5888799872, -5897186432, 5905576832, 5913966976, 5922352768, 5930744704, -5939132288, 5947522432, 5955911296, 5964299392, 5972688256, -5981074304, 5989465472, 5997851008, 6006241408, 6014627968, -6023015552, 6031408256, 6039796096, 6048185216, 6056574848, -6064963456, 6073351808, 6081736064, 6090128768, 6098517632, -6106906496, 6115289216, 6123680896, 6132070016, 6140459648, -6148849024, 6157237376, 6165624704, 6174009728, 6182403712, -6190792064, 6199176064, 6207569792, 6215952256, 6224345216, -6232732544, 6241124224, 6249510272, 6257899136, 6266287744, -6274676864, 6283065728, 6291454336, 6299843456, 6308232064, -6316620928, 6325006208, 6333395584, 6341784704, 6350174848, -6358562176, 6366951296, 6375337856, 6383729536, 6392119168, -6400504192, 6408895616, 6417283456, 6425673344, 6434059136, -6442444672, 6450837376, 6459223424, 6467613056, 6476004224, -6484393088, 6492781952, 6501170048, 6509555072, 6517947008, -6526336384, 6534725504, 6543112832, 6551500672, 6559888768, -6568278656, 6576662912, 6585055616, 6593443456, 6601834112, -6610219648, 6618610304, 6626999168, 6635385472, 6643777408, -6652164224, 6660552832, 6668941952, 6677330048, 6685719424, -6694107776, 6702493568, 6710882176, 6719274112, 6727662976, -6736052096, 6744437632, 6752825984, 6761213824, 6769604224, -6777993856, 6786383488, 6794770816, 6803158144, 6811549312, -6819937664, 6828326528, 6836706176, 6845101696, 6853491328, -6861880448, 6870269312, 6878655104, 6887046272, 6895433344, -6903822208, 6912212864, 6920596864, 6928988288, 6937377152, -6945764992, 6954149248, 6962544256, 6970928768, 6979317376, -6987709312, 6996093824, 7004487296, 7012875392, 7021258624, -7029652352, 7038038912, 7046427776, 7054818944, 7063207808, -7071595136, 7079980928, 7088372608, 7096759424, 7105149824, -7113536896, 7121928064, 7130315392, 7138699648, 7147092352, -7155479168, 7163865728, 7172249984, 7180648064, 7189036672, -7197424768, 7205810816, 7214196608, 7222589824, 7230975104, -7239367552, 7247755904, 7256145536, 7264533376, 7272921472, -7281308032, 7289694848, 7298088832, 7306471808, 7314864512, -7323253888, 7331643008, 7340029568, 7348419712, 7356808832, -7365196672, 7373585792, 7381973888, 7390362752, 7398750592, -7407138944, 7415528576, 7423915648, 7432302208, 7440690304, -7449080192, 7457472128, 7465860992, 7474249088, 7482635648, -7491023744, 7499412608, 7507803008, 7516192384, 7524579968, -7532967296, 7541358464, 7549745792, 7558134656, 7566524032, -7574912896, 7583300992, 7591690112, 7600075136, 7608466816, -7616854912, 7625244544, 7633629824, 7642020992, 7650410368, -7658794112, 7667187328, 7675574912, 7683961984, 7692349568, -7700739712, 7709130368, 7717519232, 7725905536, 7734295424, -7742683264, 7751069056, 7759457408, 7767849088, 7776238208, -7784626816, 7793014912, 7801405312, 7809792128, 7818179968, -7826571136, 7834957184, 7843347328, 7851732352, 7860124544, -7868512384, 7876902016, 7885287808, 7893679744, 7902067072, -7910455936, 7918844288, 7927230848, 7935622784, 7944009344, -7952400256, 7960786048, 7969176704, 7977565312, 7985953408, -7994339968, 8002730368, 8011119488, 8019508096, 8027896192, -8036285056, 8044674688, 8053062272, 8061448832, 8069838464, -8078227328, 8086616704, 8095006592, 8103393664, 8111783552, -8120171392, 8128560256, 8136949376, 8145336704, 8153726848, -8162114944, 8170503296, 8178891904, 8187280768, 8195669632, -8204058496, 8212444544, 8220834176, 8229222272, 8237612672, -8246000768, 8254389376, 8262775168, 8271167104, 8279553664, -8287944064, 8296333184, 8304715136, 8313108352, 8321497984, -8329885568, 8338274432, 8346663296, 8355052928, 8363441536, -8371828352, 8380217984, 8388606592, 8396996224, 8405384576, -8413772672, 8422161536, 8430549376, 8438939008, 8447326592, -8455715456, 8464104832, 8472492928, 8480882048, 8489270656, -8497659776, 8506045312, 8514434944, 8522823808, 8531208832, -8539602304, 8547990656, 8556378752, 8564768384, 8573154176, -8581542784, 8589933952, 8598322816, 8606705024, 8615099264, -8623487872, 8631876992, 8640264064, 8648653952, 8657040256, -8665430656, 8673820544, 8682209152, 8690592128, 8698977152, -8707374464, 8715763328, 8724151424, 8732540032, 8740928384, -8749315712, 8757704576, 8766089344, 8774480768, 8782871936, -8791260032, 8799645824, 8808034432, 8816426368, 8824812928, -8833199488, 8841591424, 8849976448, 8858366336, 8866757248, -8875147136, 8883532928, 8891923328, 8900306816, 8908700288, -8917088384, 8925478784, 8933867392, 8942250368, 8950644608, -8959032704, 8967420544, 8975809664, 8984197504, 8992584064, -9000976256, 9009362048, 9017752448, 9026141312, 9034530688, -9042917504, 9051307904, 9059694208, 9068084864, 9076471424, -9084861824, 9093250688, 9101638528, 9110027648, 9118416512, -9126803584, 9135188096, 9143581312, 9151969664, 9160356224, -9168747136, 9177134464, 9185525632, 9193910144, 9202302848, -9210690688, 9219079552, 9227465344, 9235854464, 9244244864, -9252633472, 9261021824, 9269411456, 9277799296, 9286188928, -9294574208, 9302965888, 9311351936, 9319740032, 9328131968, -9336516736, 9344907392, 9353296768, 9361685888, 9370074752, -9378463616, 9386849408, 9395239808, 9403629184, 9412016512, -9420405376, 9428795008, 9437181568, 9445570688, 9453960832, -9462346624, 9470738048, 9479121536, 9487515008, 9495903616, -9504289664, 9512678528, 9521067904, 9529456256, 9537843584, -9546233728, 9554621312, 9563011456, 9571398784, 9579788672, -9588178304, 9596567168, 9604954496, 9613343104, 9621732992, -9630121856, 9638508416, 9646898816, 9655283584, 9663675776, -9672061312, 9680449664, 9688840064, 9697230464, 9705617536, -9714003584, 9722393984, 9730772608, 9739172224, 9747561088, -9755945344, 9764338816, 9772726144, 9781116544, 9789503872, -9797892992, 9806282624, 9814670464, 9823056512, 9831439232, -9839833984, 9848224384, 9856613504, 9865000576, 9873391232, -9881772416, 9890162816, 9898556288, 9906940544, 9915333248, -9923721088, 9932108672, 9940496512, 9948888448, 9957276544, -9965666176, 9974048384, 9982441088, 9990830464, 9999219584, -10007602816, 10015996544, 10024385152, 10032774016, 10041163648, -10049548928, 10057940096, 10066329472, 10074717824, 10083105152, -10091495296, 10099878784, 10108272256, 10116660608, 10125049216, -10133437312, 10141825664, 10150213504, 10158601088, 10166991232, -10175378816, 10183766144, 10192157312, 10200545408, 10208935552, -10217322112, 10225712768, 10234099328, 10242489472, 10250876032, -10259264896, 10267656064, 10276042624, 10284429184, 10292820352, -10301209472, 10309598848, 10317987712, 10326375296, 10334763392, -10343153536, 10351541632, 10359930752, 10368318592, 10376707456, -10385096576, 10393484672, 10401867136, 10410262144, 10418647424, -10427039104, 10435425664, 10443810176, 10452203648, 10460589952, -10468982144, 10477369472, 10485759104, 10494147712, 10502533504, -10510923392, 10519313536, 10527702656, 10536091264, 10544478592, -10552867712, 10561255808, 10569642368, 10578032768, 10586423168, -10594805632, 10603200128, 10611588992, 10619976064, 10628361344, -10636754048, 10645143424, 10653531776, 10661920384, 10670307968, -10678696832, 10687086464, 10695475072, 10703863168, 10712246144, -10720639616, 10729026688, 10737414784, 10745806208, 10754190976, -10762581376, 10770971264, 10779356288, 10787747456, 10796135552, -10804525184, 10812915584, 10821301888, 10829692288, 10838078336, -10846469248, 10854858368, 10863247232, 10871631488, 10880023424, -10888412032, 10896799616, 10905188992, 10913574016, 10921964672, -10930352768, 10938742912, 10947132544, 10955518592, 10963909504, -10972298368, 10980687488, 10989074816, 10997462912, 11005851776, -11014241152, 11022627712, 11031017344, 11039403904, 11047793024, -11056184704, 11064570752, 11072960896, 11081343872, 11089737856, -11098128256, 11106514816, 11114904448, 11123293568, 11131680128, -11140065152, 11148458368, 11156845696, 11165236864, 11173624192, -11182013824, 11190402688, 11198790784, 11207179136, 11215568768, -11223957376, 11232345728, 11240734592, 11249122688, 11257511296, -11265899648, 11274285952, 11282675584, 11291065472, 11299452544, -11307842432, 11316231296, 11324616832, 11333009024, 11341395584, -11349782656, 11358172288, 11366560384, 11374950016, 11383339648, -11391721856, 11400117376, 11408504192, 11416893568, 11425283456, -11433671552, 11442061184, 11450444672, 11458837888, 11467226752, -11475611776, 11484003968, 11492392064, 11500780672, 11509169024, -11517550976, 11525944448, 11534335616, 11542724224, 11551111808, -11559500672, 11567890304, 11576277376, 11584667008, 11593056128, -11601443456, 11609830016, 11618221952, 11626607488, 11634995072, -11643387776, 11651775104, 11660161664, 11668552576, 11676940928, -11685330304, 11693718656, 11702106496, 11710496128, 11718882688, -11727273088, 11735660416, 11744050048, 11752437376, 11760824704, -11769216128, 11777604736, 11785991296, 11794381952, 11802770048, -11811157888, 11819548544, 11827932544, 11836324736, 11844713344, -11853100928, 11861486464, 11869879936, 11878268032, 11886656896, -11895044992, 11903433088, 11911822976, 11920210816, 11928600448, -11936987264, 11945375872, 11953761152, 11962151296, 11970543488, -11978928512, 11987320448, 11995708288, 12004095104, 12012486272, -12020875136, 12029255552, 12037652096, 12046039168, 12054429568, -12062813824, 12071206528, 12079594624, 12087983744, 12096371072, -12104759936, 12113147264, 12121534592, 12129924992, 12138314624, -12146703232, 12155091584, 12163481216, 12171864704, 12180255872, -12188643968, 12197034112, 12205424512, 12213811328, 12222199424, -12230590336, 12238977664, 12247365248, 12255755392, 12264143488, -12272531584, 12280920448, 12289309568, 12297694592, 12306086528, -12314475392, 12322865024, 12331253632, 12339640448, 12348029312, -12356418944, 12364805248, 12373196672, 12381580928, 12389969024, -12398357632, 12406750592, 12415138432, 12423527552, 12431916416, -12440304512, 12448692352, 12457081216, 12465467776, 12473859968, -12482245504, 12490636672, 12499025536, 12507411584, 12515801728, -12524190592, 12532577152, 12540966272, 12549354368, 12557743232, -12566129536, 12574523264, 12582911872, 12591299456, 12599688064, -12608074624, 12616463488, 12624845696, 12633239936, 12641631616, -12650019968, 12658407296, 12666795136, 12675183232, 12683574656, -12691960192, 12700350592, 12708740224, 12717128576, 12725515904, -12733906816, 12742295168, 12750680192, 12759071872, 12767460736, -12775848832, 12784236928, 12792626816, 12801014656, 12809404288, -12817789312, 12826181504, 12834568832, 12842954624, 12851345792, -12859732352, 12868122496, 12876512128, 12884901248, 12893289088, -12901672832, 12910067584, 12918455168, 12926842496, 12935232896, -12943620736, 12952009856, 12960396928, 12968786816, 12977176192, -12985563776, 12993951104, 13002341504, 13010730368, 13019115392, -13027506304, 13035895168, 13044272512, 13052673152, 13061062528, -13069446272, 13077838976, 13086227072, 13094613632, 13103000192, -13111393664, 13119782528, 13128157568, 13136559232, 13144945024, -13153329536, 13161724288, 13170111872, 13178502784, 13186884736, -13195279744, 13203667072, 13212057472, 13220445824, 13228832128, -13237221248, 13245610624, 13254000512, 13262388352, 13270777472, -13279166336, 13287553408, 13295943296, 13304331904, 13312719488, -13321108096, 13329494656, 13337885824, 13346274944, 13354663808, -13363051136, 13371439232, 13379825024, 13388210816, 13396605056, -13404995456, 13413380224, 13421771392, 13430159744, 13438546048, -13446937216, 13455326848, 13463708288, 13472103808, 13480492672, -13488875648, 13497269888, 13505657728, 13514045312, 13522435712, -13530824576, 13539210112, 13547599232, 13555989376, 13564379008, -13572766336, 13581154432, 13589544832, 13597932928, 13606320512, -13614710656, 13623097472, 13631477632, 13639874944, 13648264064, -13656652928, 13665041792, 13673430656, 13681818496, 13690207616, -13698595712, 13706982272, 13715373184, 13723762048, 13732150144, -13740536704, 13748926592, 13757316224, 13765700992, 13774090112, -13782477952, 13790869376, 13799259008, 13807647872, 13816036736, -13824425344, 13832814208, 13841202304, 13849591424, 13857978752, -13866368896, 13874754688, 13883145344, 13891533184, 13899919232, -13908311168, 13916692096, 13925085056, 13933473152, 13941866368, -13950253696, 13958643584, 13967032192, 13975417216, 13983807616, -13992197504, 14000582272, 14008973696, 14017363072, 14025752192, -14034137984, 14042528384, 14050918016, 14059301504, 14067691648, -14076083584, 14084470144, 14092852352, 14101249664, 14109635968, -14118024832, 14126407552, 14134804352, 14143188608, 14151577984, -14159968384, 14168357248, 14176741504, 14185127296, 14193521024, -14201911424, 14210301824, 14218685056, 14227067264, 14235467392, -14243855488, 14252243072, 14260630144, 14269021568, 14277409408, -14285799296, 14294187904, 14302571392, 14310961792, 14319353728, -14327738752, 14336130944, 14344518784, 14352906368, 14361296512, -14369685376, 14378071424, 14386462592, 14394848128, 14403230848, -14411627392, 14420013952, 14428402304, 14436793472, 14445181568, -14453569664, 14461959808, 14470347904, 14478737024, 14487122816, -14495511424, 14503901824, 14512291712, 14520677504, 14529064832, -14537456768, 14545845632, 14554234496, 14562618496, 14571011456, -14579398784, 14587789184, 14596172672, 14604564608, 14612953984, -14621341312, 14629724288, 14638120832, 14646503296, 14654897536, -14663284864, 14671675264, 14680061056, 14688447616, 14696835968, -14705228416, 14713616768, 14722003328, 14730392192, 14738784128, -14747172736, 14755561088, 14763947648, 14772336512, 14780725376, -14789110144, 14797499776, 14805892736, 14814276992, 14822670208, -14831056256, 14839444352, 14847836032, 14856222848, 14864612992, -14872997504, 14881388672, 14889775744, 14898165376, 14906553472, -14914944896, 14923329664, 14931721856, 14940109696, 14948497024, -14956887424, 14965276544, 14973663616, 14982053248, 14990439808, -14998830976, 15007216768, 15015605888, 15023995264, 15032385152, -15040768384, 15049154944, 15057549184, 15065939072, 15074328448, -15082715008, 15091104128, 15099493504, 15107879296, 15116269184, -15124659584, 15133042304, 15141431936, 15149824384, 15158214272, -15166602368, 15174991232, 15183378304, 15191760512, 15200154496, -15208542592, 15216931712, 15225323392, 15233708416, 15242098048, -15250489216, 15258875264, 15267265408, 15275654528, 15284043136, -15292431488, 15300819584, 15309208192, 15317596544, 15325986176, -15334374784, 15342763648, 15351151744, 15359540608, 15367929728, -15376318336, 15384706432, 15393092992, 15401481856, 15409869952, -15418258816, 15426649984, 15435037568, 15443425664, 15451815296, -15460203392, 15468589184, 15476979328, 15485369216, 15493755776, -15502146944, 15510534272, 15518924416, 15527311232, 15535699072, -15544089472, 15552478336, 15560866688, 15569254528, 15577642624, -15586031488, 15594419072, 15602809472, 15611199104, 15619586432, -15627975296, 15636364928, 15644753792, 15653141888, 15661529216, -15669918848, 15678305152, 15686696576, 15695083136, 15703474048, -15711861632, 15720251264, 15728636288, 15737027456, 15745417088, -15753804928, 15762194048, 15770582656, 15778971008, 15787358336, -15795747712, 15804132224, 15812523392, 15820909696, 15829300096, -15837691264, 15846071936, 15854466944, 15862855808, 15871244672, -15879634816, 15888020608, 15896409728, 15904799104, 15913185152, -15921577088, 15929966464, 15938354816, 15946743424, 15955129472, -15963519872, 15971907968, 15980296064, 15988684928, 15997073024, -16005460864, 16013851264, 16022241152, 16030629248, 16039012736, -16047406976, 16055794816, 16064181376, 16072571264, 16080957824, -16089346688, 16097737856, 16106125184, 16114514816, 16122904192, -16131292544, 16139678848, 16148066944, 16156453504, 16164839552, -16173236096, 16181623424, 16190012032, 16198401152, 16206790528, -16215177344, 16223567744, 16231956352, 16240344704, 16248731008, -16257117824, 16265504384, 16273898624, 16282281856, 16290668672, -16299064192, 16307449216, 16315842176, 16324230016, 16332613504, -16341006464, 16349394304, 16357783168, 16366172288, 16374561664, -16382951296, 16391337856, 16399726208, 16408116352, 16416505472, -16424892032, 16433282176, 16441668224, 16450058624, 16458448768, -16466836864, 16475224448, 16483613056, 16492001408, 16500391808, -16508779648, 16517166976, 16525555328, 16533944192, 16542330752, -16550719616, 16559110528, 16567497088, 16575888512, 16584274816, -16592665472, 16601051008, 16609442944, 16617832064, 16626218624, -16634607488, 16642996096, 16651385728, 16659773824, 16668163712, -16676552576, 16684938112, 16693328768, 16701718144, 16710095488, -16718492288, 16726883968, 16735272832, 16743661184, 16752049792, -16760436608, 16768827008, 16777214336, 16785599104, 16793992832, -16802381696, 16810768768, 16819151744, 16827542656, 16835934848, -16844323712, 16852711552, 16861101952, 16869489536, 16877876864, -16886265728, 16894653056, 16903044736, 16911431296, 16919821696, -16928207488, 16936592768, 16944987776, 16953375616, 16961763968, -16970152832, 16978540928, 16986929536, 16995319168, 17003704448, -17012096896, 17020481152, 17028870784, 17037262208, 17045649536, -17054039936, 17062426496, 17070814336, 17079205504, 17087592064, -17095978112, 17104369024, 17112759424, 17121147776, 17129536384, -17137926016, 17146314368, 17154700928, 17163089792, 17171480192, -17179864192, 17188256896, 17196644992, 17205033856, 17213423488, -17221811072, 17230198912, 17238588032, 17246976896, 17255360384, -17263754624, 17272143232, 17280530048, 17288918912, 17297309312, -17305696384, 17314085504, 17322475136, 17330863744, 17339252096, -17347640192, 17356026496, 17364413824, 17372796544, 17381190016, -17389583488, 17397972608, 17406360704, 17414748544, 17423135872, -17431527296, 17439915904, 17448303232, 17456691584, 17465081728, -17473468288, 17481857408, 17490247552, 17498635904, 17507022464, -17515409024, 17523801728, 17532189824, 17540577664, 17548966016, -17557353344, 17565741184, 17574131584, 17582519168, 17590907008, -17599296128, 17607687808, 17616076672, 17624455808, 17632852352, -17641238656, 17649630848, 17658018944, 17666403968, 17674794112, -17683178368, 17691573376, 17699962496, 17708350592, 17716739968, -17725126528, 17733517184, 17741898112, 17750293888, 17758673024, -17767070336, 17775458432, 17783848832, 17792236928, 17800625536, -17809012352, 17817402752, 17825785984, 17834178944, 17842563968, -17850955648, 17859344512, 17867732864, 17876119424, 17884511872, -17892900224, 17901287296, 17909677696, 17918058112, 17926451072, -17934843776, 17943230848, 17951609216, 17960008576, 17968397696, -17976784256, 17985175424, 17993564032, 18001952128, 18010339712, -18018728576, 18027116672, 18035503232, 18043894144, 18052283264, -18060672128, 18069056384, 18077449856, 18085837184, 18094225792, -18102613376, 18111004544, 18119388544, 18127781248, 18136170368, -18144558976, 18152947328, 18161336192, 18169724288, 18178108544, -18186498944, 18194886784, 18203275648, 18211666048, 18220048768, -18228444544, 18236833408, 18245220736] - -cache_sizes = [ -16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, -17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, -18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, -19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, -20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, -21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, -22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, -23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, -24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, -25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, -25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, -26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, -27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, -28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, -29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, -30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, -31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, -32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, -33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, -34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, -35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, -36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, -36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, -37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, -38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, -39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, -40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, -41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, -42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, -43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, -44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, -45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, -46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, -47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, -47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, -48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, -49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, -50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, -51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, -52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, -53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, -54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, -55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, -56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, -57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, -58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, -58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, -59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, -60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, -61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, -62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, -63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, -64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, -65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, -66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, -67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, -68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, -69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, -69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, -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] -``` diff --git a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md deleted file mode 100644 index 293dfa2405d..00000000000 --- a/public/content/translations/ja/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: マイニングアルゴリズム -description: イーサリアムのマイニングで使われたアルゴリズムの詳細 -lang: ja ---- - - -プルーフ・オブ・ワークは、イーサリアムの合意メカニズムの基盤ではなくなり、すでにマイニングは廃止されています。 マイニングに代わって、イーサリアムはETHをステーキングするバリデータにより保護されています。 今日からETHのステーキングを始めることができます。 詳細についてはマージプルーフ・オブ・ステークおよびステーキングを参照してください。 このページについては、これまでのイーサリアムの歩みを学ぶための参考としてお読みください。 - - -イーサリアムのマイニングでは、Ethash と呼ばれるアルゴリズムを使っていました。 このアルゴリズムの基本的なアイデアは、マイナーがしらみつぶしに計算を行い、ノンス (nonce)の入力を探し、その結果のハッシュ値が、計算された難易度によって決められたしきい値より小さくなるように試みるというものです。 この難易度は動的に調整することが可能で、一定間隔でブロック生成を行うことができます。 - -## 前提知識 {#prerequisites} - -このページをより理解するために、事前に[プルーフ・オブ・ワーク・コンセンサス](/developers/docs/consensus-mechanisms/pow)と[マイニング](/developers/docs/consensus-mechanisms/pow/mining)をお読みになることをお勧めします。 - -## ダガーハシモト {#dagger-hashimoto} - -ダガーハシモト(Dagger-Hashimoto)は、イーサリアムのマイニングアルゴリズムの前身となる研究アルゴリズムで、後に Ethash に取って代わられました。 ダガーハシモトは、ダガー(Dagger)とハシモト(Hashimoto)という、2 つの異なるアルゴリズムを組み合わせたものです。 研究実装のみを目的としており、イーサリアムメインネットが開始されるまでには、Ethash に引き継がれています。 - -[ダガー](http://www.hashcash.org/papers/dagger.html)は、[有向非巡回グラフ(Directed Acyclic Graph)](https://en.wikipedia.org/wiki/Directed_acyclic_graph)の生成を伴い、それのランダムなスライスを合わせてハッシュ化します。 コアとなる原則として、各ノンス (nonce)が必要とするのは巨大な全データツリーのごく一部のみであるということです。 各ノンス (nonce)のサブツリーを再計算することは、マイニングでは禁止されているため、ツリーを保存する必要があります(ただし、単一ノンス相当の検証では、サブツリーの再計算は可能)。 ダガーは、Scrypt のような既存のアルゴリズムの代替となるように設計されています。Scrypt はメモリハードですが、実際に安全なレベルのメモリハードまで増加すると検証が難しくなります。 一方、ダガーは共有メモリ・ハードウェア・アクセラレーションに対して脆弱であり、他の研究手段を優先し、取り下げられました。 - -[ハシモト](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf)は、入出力バウンドであること(メモリの読込みがマイニングプロセスの制限要因)により、ASIC 耐性を付加するアルゴリズムです。 この理論は、RAM は計算資源よりも利用可能であるということです。数十億ドル相当かけて、異なるユースケースでの RAM の最適化について研究がすでになされています。これらのユースケースの多くには、ほぼランダムなアクセスパターン(そのため RAM「ランダム・アクセス・メモリ」と呼ばれる)が含まれています。 その結果、既存の RAM はアルゴリズムを評価する上で、ほぼ最適に近い可能性があります。 ハシモトは、データのソースとしてブロックチェーンを使い、上記の(1)と(3)を同時に満たします。 - -ダガーハシモトは、ダガーとハシモトアルゴリズムを修正したものです。 ダガーハシモトとハシモトの違いとしては、ブロックチェーンデータをソースとして使わず、ダガーハシモトは、カスタム生成のデータセットを使い、N ブロックごとにブロックデータを基にして更新します。 このデータセットは、ダガーアルゴリズムを使って生成され、ライトクライアント検証アルゴリズムのための、各ノンス (nonce)に特有なサブセットで効率的な計算を可能にします。 ダガーハシモトとダガーの違いとしては、オリジナルのダガーとは異なり、ブロックのクエリーとして使われるデータセットは、半永続的で、周期的な間隔で更新(例: 1 週間に一回)されるだけということです。 データセットを生成する労力の割合はゼロに近く、共有メモリの高速化に関する Sergio Lerner の主張は、無視できるようになります。 - -[ダガーハシモト](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto)の詳細 - -## Ethash {#ethash} - -Ethash は、現在は廃止となっているプルーフ・オブ・ワークのアーキテクチャの下で、実際にイーサリアムメインネットで使われたマイニングアルゴリズムです。 Ethash は、ダガーハシモトのアルゴリズムが大幅に更新された後に、特定のダガーハシモトのバージョンに事実上付けられたた新しい名前です。なので、前バージョンの基本理念を継承しています。 イーサリアムメインネットは、これまで Ethash のみを使用していました。ダガーハシモトは、研究開発バージョンのマイニングアルゴリズムで、イーサリアムメインネットでマイニングが開始される前に Ethash に引き継がれました。 - -[Ethash の詳細](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash) - -## 参考文献 {#further-reading} - -_役に立つコミュニティリソースをご存知の場合は、 このページを編集して追加してください。_ diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md deleted file mode 100644 index 3f5b0428f79..00000000000 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -title: Dagger-Hashimoto -description: O algoritmo Dagger-Hashimoto em detalhes -lang: pt-br ---- - -Dagger-Hashimoto foi a implementação original de pesquisa e especificação para o algoritmo de mineração do Ethereum. Dagger-Hashimoto foi substituído por [Ethash](#ethash). A mineração foi completamente desligada na [Fusão](/updates/merge) no dia 15 de setembro de 2022. Desde então, o Ethereum foi protegido usando um mecanismo [prova de participação](/developers/docs/consensus-mechanisms/pos). Esta página é para fins históricos. As informações aqui não são mais relevantes para o Ethereum posterior à Fusão. - -## Pré-Requisitos {#prerequisites} - -Para melhor entender esta página, recomendamos que você leia primeiro o[ consenso de prova de trabalho, ](/developers/docs/consensus-mechanisms/pow)[mineração](/developers/docs/consensus-mechanisms/pow/mining) e [algoritmos de mineração](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms). - -## Dagger-Hashimoto {#dagger-hashimoto} - -Dagger-Hashimoto pretende satisfazer dois objetivos: - -1. **Resistência a ASIC**: o benefício de criar hardware especializado para o algoritmo deve ser o menor possível. -2. **Cliente leve verificável**: um bloco deve ser verificável eficientemente por um cliente leve. - -Com uma modificação adicional, também especificamos como atingir um terceiro objetivo se desejado, mas à custa de uma complexidade adicional: - -**Armazenamento completo da cadeia**: a mineração deveria exigir o armazenamento do estado completo da blockchain (devido à estrutura irregular da árvore de estado Ethereum, esperamos que haja um pouco de perda, especialmente de alguns contratos muitas vezes usados, mas queremos minimizar isso). - -## Geração do DAG {#dag-generation} - -O código do algoritmo será definido em Python abaixo. Primeiro, damos `encode_int` para combinar inteiros sem sinal de precisão especificada em strings. Sua inversa também é dada: - -```python -NUM_BITS = 512 - -def encode_int(x): - "Encode an integer x as a string of 64 characters using a big-endian scheme" - o = '' - for _ in range(NUM_BITS / 8): - o = chr(x % 256) + o - x //= 256 - return o - -def decode_int(s): - "Unencode an integer x from a string using a big-endian scheme" - x = 0 - for c in s: - x *= 256 - x += ord(c) - return x -``` - -Em seguida assumimos que `sha3` é uma função que recebe um inteiro e retorna um inteiro, e `dbl_sha3` é uma função double-sha3, se converter este código de referência em uma implementação de uso: - -```python -from pyethereum import utils -def sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(x)) - -def dbl_sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(utils.sha3(x))) -``` - -### Parâmetros {#parameters} - -Os parâmetros usados para o algoritmo são: - -```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 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 -} -``` - -`P` neste caso é uma primeira escolha tal que `log(P)` é apenas ligeiramente menor que 512, que corresponde aos 512 bits que temos usado para representar nossos números. Observe que apenas a última metade do DAG precisa realmente ser armazenado, assim o requisito de RAM de-facto começa em 1 GB e cresce 441 MB por ano. - -### Construção de gráfico Dagger {#dagger-graph-building} - -A construção primitiva de gráfico dagger é definida da seguinte forma: - -```python -def produce_dag(params, seed, length): - P = params["P"] - picker = init = pow(sha3(seed), params["w"], P) - o = [init] - for i in range(1, length): - x = picker = (picker * init) % P - for _ in range(params["k"]): - x ^= o[x % i] - o.append(pow(x, params["w"], P)) - return o -``` - -Essencialmente, ele começa um gráfico como um único nó, `sha3(seed)`, e de lá começa a adicionar sequencialmente outros nós com base em nós aleatórios anteriores. Quando um novo nó é criado, uma potência modular da semente é computada para aleatoriamente selecionar alguns índices menores que `i` (usando `x % i` acima), e os valores dos nós desses índices são usados em um cálculo para gerar um novo valor para `x`, que é então alimentada em uma pequena função de prova de trabalho (baseada em XOR) para finalmente gerar o valor do gráfico no índice `i`. A lógica por trás deste design específico é forçar o acesso sequencial do DAG; o próximo valor do DAG que será acessado não pode ser determinado até que o valor atual seja conhecido. Finalmente, a exponenciação modular faz o hash do resultado ainda mais. - -Este algoritmo depende de vários resultados da teoria numérica. Veja o apêndice abaixo para uma discussão. - -## Avaliação de cliente leve {#light-client-evaluation} - -A construção do gráfico acima pretende permitir que cada nó no gráfico seja reconstruído computando uma subárvore com apenas um pequeno número de nós e exigindo uma pequena quantidade de memória auxiliar. Note que com k=1, a subárvore é apenas uma cadeia de valores que vai subindo até o primeiro elemento do DAG. - -A função de computação do cliente leve para o DAG funciona da seguinte forma: - -```python -def quick_calc(params, seed, p): - w, P = params["w"], params["P"] - cache = {} - - def quick_calc_cached(p): - if p in cache: - pass - elif p == 0: - cache[p] = pow(sha3(seed), w, P) - else: - x = pow(sha3(seed), (p + 1) * w, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(x % p) - cache[p] = pow(x, w, P) - return cache[p] - - return quick_calc_cached(p) -``` - -Essencialmente, é simplesmente uma reescrita do algoritmo acima que remove o loop de computação dos valores de todo o DAG e substitui a pesquisa anterior de nó por uma chamada recursiva ou uma pesquisa de cache. Observe que para `k=1` o cache é desnecessário, embora uma otimização maior na verdade pré-calcula os primeiros poucos milhares de valores do DAG e o mantém como um cache estático para computações; ver o apêndice para uma implementação de código disso. - -## Buffer duplo de DAGs {#double-buffer} - -Em um cliente completo, é usado um [_buffer duplo_](https://wikipedia.org/wiki/Multiple_buffering) de 2 DAGs produzidos pela fórmula acima. A ideia é que DAGs são produzidos a cada `epochtime` número de blocos de acordo com os parâmetros acima. Em vez do cliente usar o último DAG produzido, ele usa o anterior. A vantagem disto é permitir que os DAG sejam substituídos com o passar do tempo, sem necessidade de incorporar um passo em que os mineradores devem, de repente, recriar todos os dados. Caso contrário, existe o potencial para um abrandamento abrupto temporário do processamento da cadeia a intervalos regulares e um aumento dramático da centralização. Assim, existe o risco de ataques de 51% dentro desses poucos minutos antes de todos os dados serem recomputados. - -O algoritmo usado para gerar o conjunto de DAGs usados para computar o trabalho de um bloco é o seguinte: - -```python -def get_prevhash(n): - from pyethereum.blocks import GENESIS_PREVHASH - from pyethereum import chain_manager - if num <= 0: - return hash_to_int(GENESIS_PREVHASH) - else: - prevhash = chain_manager.index.get_block_by_number(n - 1) - return decode_int(prevhash) - -def get_seedset(params, block): - seedset = {} - seedset["back_number"] = block.number - (block.number % params["epochtime"]) - seedset["back_hash"] = get_prevhash(seedset["back_number"]) - seedset["front_number"] = max(seedset["back_number"] - params["epochtime"], 0) - seedset["front_hash"] = get_prevhash(seedset["front_number"]) - return seedset - -def get_dagsize(params, block): - return params["n"] + (block.number // params["epochtime"]) * params["n_inc"] - -def get_daggerset(params, block): - dagsz = get_dagsize(params, block) - seedset = get_seedset(params, block) - if seedset["front_hash"] <= 0: - # No back buffer is possible, just make front buffer - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": 0}} - else: - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": seedset["front_number"]}, - "back": {"dag": produce_dag(params, seedset["back_hash"], dagsz), - "block_number": seedset["back_number"]}} -``` - -## Hashimoto {#hashimoto} - -A ideia por trás do Hashimoto original é usar a blockchain como um conjunto de dados, executando um cálculo que seleciona N índices da blockchain, reúne as transações nesses índices, executa um XOR desses dados e retorna o hash do resultado. O algoritmo original de Thaddeus Dryja, convertido para Python para consistência, é o seguinte: - -```python -def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): - hash_output_A = sha256(prev_hash + merkle_root + nonce) - txid_mix = 0 - for i in range(64): - shifted_A = hash_output_A >> i - transaction = shifted_A % len(list_of_transactions) - txid_mix ^= list_of_transactions[transaction] << i - return txid_max ^ (nonce << 192) -``` - -Infelizmente, enquanto Hashimoto é considerado de uso intenso de RAM, ele depende da aritmética de 256 bits, o que tem uma sobrecarga computacional considerável. No entanto, Dagger-Hashimoto usa apenas os 64 bits menos significativos ao indexar seu conjunto de dados para resolver esta questão. - -```python -def hashimoto(dag, dagsize, params, header, nonce): - m = dagsize / 2 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= dag[m + (mix % 2**64) % m] - return dbl_sha3(mix) -``` - -O uso duplo do SHA3 permite uma forma de zero dados, pré-verificação quase instantânea, verificando apenas se foi fornecido um valor intermediário correto. Esta camada exterior de prova de trabalho é altamente favorável a ASIC e razoavelmente fraca, mas existe para tornar a DDoS ainda mais difícil, uma vez que essa pequena quantidade de trabalho tem de ser feita para produzir um bloco que não seja imediatamente rejeitado. Aqui está a versão de cliente leve: - -```python -def quick_hashimoto(seed, dagsize, params, header, nonce): - m = dagsize // 2 - mix = sha3(nonce + header) - for _ in range(params["accesses"]): - mix ^= quick_calc(params, seed, m + (mix % 2**64) % m) - return dbl_sha3(mix) -``` - -## Mineração e verificação {#mining-and-verifying} - -Agora, vamos colocar tudo junto no algoritmo de mineração: - -```python -def mine(daggerset, params, block): - from random import randint - nonce = randint(0, 2**64) - while 1: - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - if result * params["diff"] < 2**256: - break - nonce += 1 - if nonce >= 2**64: - nonce = 0 - return nonce -``` - -Aqui está o algoritmo de verificação: - -```python -def verify(daggerset, params, block, nonce): - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -Verificação amigável do cliente leve: - -```python -def light_verify(params, header, nonce): - seedset = get_seedset(params, block) - result = quick_hashimoto(seedset["front_hash"], get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -Além disso, note que Dagger-Hashimoto impõe requisitos adicionais no cabeçalho do bloco: - -- Para que a verificação em duas camadas funcione, um cabeçalho de bloco deve ter ambos o nonce e o valor do meio pre-sha3 -- Um cabeçalho de bloco deve armazenar o sha3 do seedset atual em algum lugar - -## Leitura adicional {#further-reading} - -_Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ - -## Apêndice {#appendix} - -Como mencionado acima, o RNG usado para geração de DAGs depende de alguns resultados da teoria de números. Primeiro, nós fornecemos garantias de que o Lehmer RNG, que é a base para a variável `picker`, tenha um longo período. Segundo, mostramos que `pow(x,3,P)` não vai correlacionar `x` para `1` ou `P-1` fornecer `x ∈ [2,P-2]` para começar. Finalmente, mostramos que `pow(x,3,P)` tem uma baixa taxa de colisão quando tratado como uma função de hashing. - -### Gerador de números aleatórios Lehmer {#lehmer-random-number} - -Enquanto a função `produce_dag` não precisa produzir números aleatórios sem viés, uma ameaça potencial é que `seed**i % P` só absorve um punhado de valores. Isto poderia proporcionar uma vantagem aos mineradores reconhecendo o padrão em relação aos que não o fazem. - -Para evitar isso, apela-se a um resultado da teoria dos números. Um [_número primo seguro_](https://en.wikipedia.org/wiki/Safe_prime) é definido como sendo um `P` primo tal que `(P-1)/2` também é primo. A _ordem_ de um membro `x` do [grupo multiplicativo](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `Z/nZ` é definido como o mínimo de `m` tal que
      xᵐ mod P ≡ 1
      -Dadas essas definições, temos: - -> Observação 1. Deixe `x` ser um membro do grupo multiplicador `Z/PZ` para um `P` primo seguro. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, então a ordem de `x` é `P-1` ou `(P-1)/2`. - -_Prova_. Já que `P` é um primo seguro, então pelo \[Teorema de Lagrange\]\[lagrange\] temos que a ordem de `x` é `1`, `2`, `(P-1)/2` ou `P-1`. - -A ordem de `x` não pode ser `1`, já que pelo Pequeno Teorema de Fermat, nós temos: - -
      xP-1 mod P ≡ 1
      - -Daí `x` deve ser uma identidade multiplicadora de `Z/nZ`, que é única. Como partimos do princípio de que `x ≠ 1` por suposição, isso não é possível. - -A ordem de `x` não pode ser `2` a menos que `x = P-1`, já que isso violaria o princípio de que `P` é primo. - -A partir da proposta acima, podemos reconhecer que a iteração `(picker * init) % P` terá um ciclo de comprimento de pelo menos `(P-1)/2`. Isso acontece porque selecionamos `P` para ser um primo seguro aproximadamente igual a uma potência de dois mais alta, e `init` está no intervalo `[2,2**256+1]`. Dada a magnitude de `P`, nunca devemos esperar um ciclo da exponenciação modular. - -Quando estamos atribuindo a primeira célula no DAG (a variável rotulada como `init`), nós computamos `pow (sha3(seed) + 2, 3, P)`. À primeira vista, isso não garante que o resultado não é `1` nem `P-1`. No entanto, como `P-1` é um primo seguro, temos a seguinte garantia adicional, que é uma afirmação deduzida da Observação 1: - -> Observação 2. Deixe `x` ser um membro do grupo multiplicador `Z/PZ` para um `P` primo seguro, e deixe `w` ser um número natural. Se `x mod P ≠ 1 mod P` e `x mod P ≠ P-1 mod P`, assim como `w mod P ≠ P-1 mod P` e `w mod P ≠ 0 mod P`, então `xʷ mod P ≠ 1 mod P` e `xʷ mod P ≠ P-1 mod P` - -### Exponenciação modular como uma função hash {#modular-exponentiation} - -Para certos valores de `P` e `w`, a função `pow(x, w, P)` pode ter muitas colisões. Por exemplo, `pow(x,9,19)` recebe apenas valores `{1,18}`. - -Dado que `P` é primo, então um `w` apropriado para uma função hash de exponenciação modular pode ser escolhida usando o seguinte resultado: - -> Observação 3. Considere `P` um primo; `w` e `P-1` são relativamente primos, se e somente se para todos `a` e `b` em `Z/PZ`: -> ->
      -> `aʷ mod P ≡ bʷ mod P` se e somente se `a mod P ≡ b mod P` ->
      - -Assim, dado que `P` é primo e `w` é relativamente primo de `P-1`, temos que `|{pow(x, w, P) : x ∈ ℤ}| = P`, implicando que a função tem a taxa mínima de colisão possível. - -No caso especial que `P` é um primo seguro como selecionamos, então `P-1` só tem fatores 1, 2, `(P-1)/2` e `P-1`. Como `P` > 7, sabemos que 3 é relativamente primo de `P-1`, daí `w=3` satisfaz a proposta acima. - -## Algoritmo de avaliação baseado em cache mais eficiente {#cache-based-evaluation} - -```python -def quick_calc(params, seed, p): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_calc_cached(cache, params, p) - -def quick_calc_cached(cache, params, p): - P = params["P"] - if p < len(cache): - return cache[p] - else: - x = pow(cache[0], p + 1, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(cache, params, x % p) - return pow(x, params["w"], P) - -def quick_hashimoto(seed, dagsize, params, header, nonce): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_hashimoto_cached(cache, dagsize, params, header, nonce) - -def quick_hashimoto_cached(cache, dagsize, params, header, nonce): - m = dagsize // 2 - mask = 2**64 - 1 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) - return dbl_sha3(mix) -``` diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md deleted file mode 100644 index eab3c19bca5..00000000000 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ /dev/null @@ -1,1014 +0,0 @@ ---- -title: Ethash -description: O algoritmo de mineração Ethash em detalhes -lang: pt-br ---- - - - Ethash foi o algoritmo de mineração da prova de trabalho do Ethereum. A prova de trabalho foi agora **totalmente desativada** e o Ethereum agora está protegido usando a prova de participação. Leia mais sobre A Fusão, prova de participação e staking. Esta página é de interesse histórico! - - -[Ethash](https://github.com/ethereum/wiki/wiki/Ethash) é uma versão modificada do algoritmo [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto). A prova de trabalho Ethash faz uso de [muita memória](https://wikipedia.org/wiki/Memory-hard_function), o que foi pensado para tornar o algoritmo ASIC resistente. Os ASICs Ethash foram eventualmente desenvolvidos, mas a mineração de GPU ainda era uma opção viável até que a prova de trabalho fosse desativada. Ethash ainda é usado para minerar outras moedas em outras redes de prova de trabalho não Ethereum. - -## Como o Ethash funciona? {#how-does-ethash-work} - -Dificuldade de memória é alcançada com um algoritmo de prova de trabalho que requer a escolha de subconjuntos de um recurso fixo dependente do nonce e do cabeçalho do bloco. Este recurso (alguns gigabytes em tamanho) é chamado de DAG. O DAG é alterado a cada 30.000 blocos, uma janela de cerca de 125 horas chamada de período eletrônico (aproximadamente 5,2 dias) e leva um tempo para gerar. Como o DAG depende apenas da altura do bloco, ele pode ser pré-gerado, mas o cliente não precisa esperar até o final deste processo para produzir um bloco. Se os clientes não pré-geraram e armazenaram em cache os DAGs antes, a rede pode sofrer um grande atraso em blocos em cada transição de período eletrônico (epoch). Note que o DAG não precisa ser gerado para verificar a prova de trabalho, permitindo essencialmente a verificação com baixa CPU e pouca memória. - -A rota geral que o algoritmo faz é a seguinte: - -1. Existe uma **seed** que pode ser calculada para cada bloco escaneando os cabeçalhos dos blocos até esse ponto. -2. Da seed, pode-se calcular um **cache pseudo-randômico de 16 MB**. Clientes leves armazenam o cache. -3. A partir do cache, podemos gerar um **conjunto de dados de 1 GB**, com a propriedade que cada item no conjunto de dados depende de apenas um pequeno número de itens do cache. Clientes e mineradores completos armazenam o conjunto de dados. O conjunto de dados cresce linearmente com o tempo. -4. Mineração envolve pegar fatias aleatórias do conjunto de dados e fazer hashing deles juntos. A verificação pode ser feita com pouca memória usando o cache para regenerar os pedaços específicos do conjunto de dados que você precisa, então você só precisa armazenar o cache. - -O grande conjunto de dados é atualizado uma vez a cada 30.000 blocos, então o maior esforço de um minerador é ler o conjunto de dados, e não fazer alterações nele. - -## Definições {#definitions} - -Nós empregamos as seguintes definições: - -``` -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 -``` - -### O uso de 'SHA3' {#sha3} - -O desenvolvimento do Ethereum coincidiu com o desenvolvimento do padrão SHA3, e o processo de padrões fez uma alteração tardia no preenchimento do algoritmo de hash finalizado, para que os hashes "sha3_256" e "sha3_512" do Ethereum não sejam hashes sha3 padrão, mas uma variante muitas vezes referida como "Keccak-256" e "Keccak-512" em outros contextos. Veja a discussão, por exemplo, [aqui](https://eips.ethereum.org/EIPS-1803), [aqui](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use) ou [aqui](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057). - -Tenha isso em mente, já que hashes "sha3" são referidos na descrição do algoritmo abaixo. - -## Parâmetros {#parameters} - -Os parâmetros do cache Ethash e do conjunto de dados dependem do número do bloco. Tamanho do cache e tamanho do conjunto de dados crescem linearmente; entretanto, sempre tomamos o mais alto prime abaixo do limiar de crescimento linear, a fim de reduzir o risco de regularidades acidentais que conduzem a comportamentos cíclicos. - -```python -def get_cache_size(block_number): - sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= HASH_BYTES - while not isprime(sz / HASH_BYTES): - sz -= 2 * HASH_BYTES - return sz - -def get_full_size(block_number): - sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= MIX_BYTES - while not isprime(sz / MIX_BYTES): - sz -= 2 * MIX_BYTES - return sz -``` - -Tabelas de conjunto de dados e valores de tamanho do cache são fornecidos no apêndice. - -## Geração de cache {#cache-generation} - -Agora, especificamos a função para produzir um cache: - -```python -def mkcache(cache_size, seed): - n = cache_size // HASH_BYTES - - # Sequentially produce the initial dataset - o = [sha3_512(seed)] - for i in range(1, n): - o.append(sha3_512(o[-1])) - - # Use a low-round version of randmemohash - for _ in range(CACHE_ROUNDS): - for i in range(n): - v = o[i][0] % n - o[i] = sha3_512(map(xor, o[(i-1+n) % n], o[v])) - - return o -``` - -O processo de produção de cache envolve primeiro preenchimento sequencial de 32 MB de memória e depois executar duas passagens do algoritmo _RandMemoHash_ de Sergio Demian Lerner de [_Strict Memory Hard Hashing Functions_ (2014)](http://www.hashcash.org/papers/memohash.pdf). A saída é um conjunto de 524288 valores de 64-bytes. - -## Função de agregação de dados {#date-aggregation-function} - -Usamos um algoritmo inspirado no [FNV hash](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) em alguns casos como um substituto não associativo para o XOR. Observe que multiplicamos o primo com a entrada completa de 32 bits, em contraste com a especificação FNV-1 que multiplica o primo por um byte (octeto) por sua vez. - -```python -FNV_PRIME = 0x01000193 - -def fnv(v1, v2): - return ((v1 * FNV_PRIME) ^ v2) % 2**32 -``` - -Observe que até mesmo o yellow paper especifica fnv como v1\*(FNV_PRIME ^ v2). Todas as implementações atuais usam consistentemente a definição acima. - -## Cálculo completo do conjunto de dados {#full-dataset-calculation} - -Cada item de 64 bytes no conjunto de dados completo de 1 GB é calculado da seguinte forma: - -```python -def calc_dataset_item(cache, i): - n = len(cache) - r = HASH_BYTES // WORD_BYTES - # initialize the mix - 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 - for j in range(DATASET_PARENTS): - cache_index = fnv(i ^ j, mix[j % r]) - mix = map(fnv, mix, cache[cache_index % n]) - return sha3_512(mix) -``` - -Essencialmente, combinamos dados de 256 nós de cache selecionados de maneira pseudo-aleatória e fazemos o hash para calcular o nó do conjunto de dados. Todo o conjunto de dados é então gerado por: - -```python -def calc_dataset(full_size, cache): - return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)] -``` - -## Loop principal {#main-loop} - -Agora, especificamos o loop padrão "hashimoto" principal, onde agregamos dados do conjunto de dados completo para produzir nosso valor final para um cabeçalho em particular ou nonce. No código abaixo, `header` representa o _hash \_SHA3-256 da representação RLP de um cabeçalho de bloco \_truncado_, ou seja, de um cabeçalho excluindo os campos **mixHash** e **nonce**. `nonce` é os oito bytes de um inteiro sem sinal de 64 bits na ordem big-endian. Então `nonce[::-1]` é a representação little-endian de oito bytes desse valor: - -```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 - s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s - mix = [] - for _ in range(MIX_BYTES / HASH_BYTES): - mix.extend(s) - # mix in random dataset nodes - 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 - 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])) - return { - "mix digest": serialize_hash(cmix), - "result": serialize_hash(sha3_256(s+cmix)) - } - -def hashimoto_light(full_size, cache, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x)) - -def hashimoto_full(full_size, dataset, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: dataset[x]) -``` - -Essencialmente, mantemos um "mix" de 128 bytes de largura, e de maneira sequencial e repetida buscamos 128 bytes do conjunto de dados completo e usamos a função `fnv` para combiná-lo com o mix. 128 bytes de acesso sequencial são usados para que cada rodada do algoritmo sempre busque uma página inteira de RAM, minimizando a possibilidade de que o buffer de pesquisa de tradução perca o que os ASICs teoricamente seriam capazes de evitar. - -Se a saída deste algoritmo está abaixo do alvo desejado, então o nonce é válido. Observe que a aplicação extra de `sha3_256` no final garante que existe um nonce intermediário que pode ser fornecido para provar que pelo menos uma pequena quantidade de trabalho foi feita; esta rápida verificação de prova de trabalho pode ser usada para fins anti-DDoS. Serve também para dar garantias estatísticas de que o resultado é um número imparcial de 256 bits. - -## Mineração {#mining} - -O algoritmo de mineração é definido da seguinte forma: - -```python -def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit - target = zpad(encode_int(2**256 // difficulty), 64)[::-1] - from random import randint - nonce = randint(0, 2**64) - while hashimoto_full(full_size, dataset, header, nonce) > target: - nonce = (nonce + 1) % 2**64 - return nonce -``` - -## Definição do hash seed {#seed-hash} - -Para calcular o hash seed que seria usado para minerar no topo de um determinado bloco, usamos o seguinte algoritmo: - -```python - def get_seedhash(block): - s = '\x00' * 32 - for i in range(block.number // EPOCH_LENGTH): - s = serialize_hash(sha3_256(s)) - return s -``` - -Observe que, para que a mineração e a verificação aconteçam sem contratempos, recomendamos pré-computar os hashes seed e conjuntos de dados futuros em threads separadas. - -## Leitura adicional {#further-reading} - -_Conhece algum recurso da comunidade que o ajudou? Edite essa página e adicione!_ - -## Apêndice {#appendix} - -O código a seguir deve ser precedido se você estiver interessado em executar a especificação python acima como código. - -```python -import sha3, copy - -# Assumes little endian bit ordering (same as Intel architectures) -def decode_int(s): - return int(s[::-1].encode('hex'), 16) if s else 0 - -def encode_int(s): - a = "%x" % s - return '' if s == 0 else ('0' * (len(a) % 2) + a).decode('hex')[::-1] - -def zpad(s, length): - return s + '\x00' * max(0, length - len(s)) - -def serialize_hash(h): - return ''.join([zpad(encode_int(x), 4) for x in h]) - -def deserialize_hash(h): - return [decode_int(h[i:i+WORD_BYTES]) for i in range(0, len(h), WORD_BYTES)] - -def hash_words(h, sz, x): - if isinstance(x, list): - x = serialize_hash(x) - y = h(x) - return deserialize_hash(y) - -def serialize_cache(ds): - return ''.join([serialize_hash(h) for h in ds]) - -serialize_dataset = serialize_cache - -# sha3 hash function, outputs 64 bytes -def sha3_512(x): - return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) - -def sha3_256(x): - return hash_words(lambda v: sha3.sha3_256(v).digest(), 32, x) - -def xor(a, b): - return a ^ b - -def isprime(x): - for i in range(2, int(x**0.5)): - if x % i == 0: - return False - return True -``` - -### Tamanho dos dados {#data-sizes} - -As tabelas de pesquisa a seguir fornecem aproximadamente 2.048 períodos eletrônicos (epoch) tabulados de tamanhos de dados e tamanhos de cache. - -```python -def get_datasize(block_number): - return data_sizes[block_number // EPOCH_LENGTH] - -def get_cachesize(block_number): - return cache_sizes[block_number // EPOCH_LENGTH] - -data_sizes = [ -1073739904, 1082130304, 1090514816, 1098906752, 1107293056, -1115684224, 1124070016, 1132461952, 1140849536, 1149232768, -1157627776, 1166013824, 1174404736, 1182786944, 1191180416, -1199568512, 1207958912, 1216345216, 1224732032, 1233124736, -1241513344, 1249902464, 1258290304, 1266673792, 1275067264, -1283453312, 1291844992, 1300234112, 1308619904, 1317010048, -1325397376, 1333787776, 1342176128, 1350561664, 1358954368, -1367339392, 1375731584, 1384118144, 1392507008, 1400897408, -1409284736, 1417673344, 1426062464, 1434451072, 1442839168, -1451229056, 1459615616, 1468006016, 1476394112, 1484782976, -1493171584, 1501559168, 1509948032, 1518337664, 1526726528, -1535114624, 1543503488, 1551892096, 1560278656, 1568669056, -1577056384, 1585446272, 1593831296, 1602219392, 1610610304, -1619000192, 1627386752, 1635773824, 1644164224, 1652555648, -1660943488, 1669332608, 1677721216, 1686109312, 1694497664, -1702886272, 1711274624, 1719661184, 1728047744, 1736434816, -1744829056, 1753218944, 1761606272, 1769995904, 1778382464, -1786772864, 1795157888, 1803550592, 1811937664, 1820327552, -1828711552, 1837102976, 1845488768, 1853879936, 1862269312, -1870656896, 1879048064, 1887431552, 1895825024, 1904212096, -1912601216, 1920988544, 1929379456, 1937765504, 1946156672, -1954543232, 1962932096, 1971321728, 1979707264, 1988093056, -1996487552, 2004874624, 2013262208, 2021653888, 2030039936, -2038430848, 2046819968, 2055208576, 2063596672, 2071981952, -2080373632, 2088762752, 2097149056, 2105539712, 2113928576, -2122315136, 2130700672, 2139092608, 2147483264, 2155872128, -2164257664, 2172642176, 2181035392, 2189426048, 2197814912, -2206203008, 2214587264, 2222979712, 2231367808, 2239758208, -2248145024, 2256527744, 2264922752, 2273312128, 2281701248, -2290086272, 2298476672, 2306867072, 2315251072, 2323639168, -2332032128, 2340420224, 2348808064, 2357196416, 2365580416, -2373966976, 2382363008, 2390748544, 2399139968, 2407530368, -2415918976, 2424307328, 2432695424, 2441084288, 2449472384, -2457861248, 2466247808, 2474637184, 2483026816, 2491414144, -2499803776, 2508191872, 2516582272, 2524970368, 2533359232, -2541743488, 2550134144, 2558525056, 2566913408, 2575301504, -2583686528, 2592073856, 2600467328, 2608856192, 2617240448, -2625631616, 2634022016, 2642407552, 2650796416, 2659188352, -2667574912, 2675965312, 2684352896, 2692738688, 2701130624, -2709518464, 2717907328, 2726293376, 2734685056, 2743073152, -2751462016, 2759851648, 2768232832, 2776625536, 2785017728, -2793401984, 2801794432, 2810182016, 2818571648, 2826959488, -2835349376, 2843734144, 2852121472, 2860514432, 2868900992, -2877286784, 2885676928, 2894069632, 2902451584, 2910843008, -2919234688, 2927622784, 2936011648, 2944400768, 2952789376, -2961177728, 2969565568, 2977951616, 2986338944, 2994731392, -3003120256, 3011508352, 3019895936, 3028287104, 3036675968, -3045063808, 3053452928, 3061837696, 3070228352, 3078615424, -3087003776, 3095394944, 3103782272, 3112173184, 3120562048, -3128944768, 3137339264, 3145725056, 3154109312, 3162505088, -3170893184, 3179280256, 3187669376, 3196056704, 3204445568, -3212836736, 3221224064, 3229612928, 3238002304, 3246391168, -3254778496, 3263165824, 3271556224, 3279944576, 3288332416, -3296719232, 3305110912, 3313500032, 3321887104, 3330273152, -3338658944, 3347053184, 3355440512, 3363827072, 3372220288, -3380608384, 3388997504, 3397384576, 3405774208, 3414163072, -3422551936, 3430937984, 3439328384, 3447714176, 3456104576, -3464493952, 3472883584, 3481268864, 3489655168, 3498048896, -3506434432, 3514826368, 3523213952, 3531603584, 3539987072, -3548380288, 3556763264, 3565157248, 3573545344, 3581934464, -3590324096, 3598712704, 3607098752, 3615488384, 3623877248, -3632265856, 3640646528, 3649043584, 3657430144, 3665821568, -3674207872, 3682597504, 3690984832, 3699367808, 3707764352, -3716152448, 3724541056, 3732925568, 3741318016, 3749706368, -3758091136, 3766481536, 3774872704, 3783260032, 3791650432, -3800036224, 3808427648, 3816815488, 3825204608, 3833592704, -3841981568, 3850370432, 3858755968, 3867147904, 3875536256, -3883920512, 3892313728, 3900702592, 3909087872, 3917478784, -3925868416, 3934256512, 3942645376, 3951032192, 3959422336, -3967809152, 3976200064, 3984588416, 3992974976, 4001363584, -4009751168, 4018141312, 4026530432, 4034911616, 4043308928, -4051695488, 4060084352, 4068472448, 4076862848, 4085249408, -4093640576, 4102028416, 4110413696, 4118805632, 4127194496, -4135583104, 4143971968, 4152360832, 4160746112, 4169135744, -4177525888, 4185912704, 4194303616, 4202691968, 4211076736, -4219463552, 4227855488, 4236246656, 4244633728, 4253022848, -4261412224, 4269799808, 4278184832, 4286578048, 4294962304, -4303349632, 4311743104, 4320130432, 4328521088, 4336909184, -4345295488, 4353687424, 4362073472, 4370458496, 4378852736, -4387238528, 4395630208, 4404019072, 4412407424, 4420790656, -4429182848, 4437571456, 4445962112, 4454344064, 4462738048, -4471119232, 4479516544, 4487904128, 4496289664, 4504682368, -4513068416, 4521459584, 4529846144, 4538232704, 4546619776, -4555010176, 4563402112, 4571790208, 4580174464, 4588567936, -4596957056, 4605344896, 4613734016, 4622119808, 4630511488, -4638898816, 4647287936, 4655675264, 4664065664, 4672451968, -4680842624, 4689231488, 4697620352, 4706007424, 4714397056, -4722786176, 4731173248, 4739562368, 4747951744, 4756340608, -4764727936, 4773114496, 4781504384, 4789894784, 4798283648, -4806667648, 4815059584, 4823449472, 4831835776, 4840226176, -4848612224, 4857003392, 4865391488, 4873780096, 4882169728, -4890557312, 4898946944, 4907333248, 4915722368, 4924110976, -4932499328, 4940889728, 4949276032, 4957666432, 4966054784, -4974438016, 4982831488, 4991221376, 4999607168, 5007998848, -5016386432, 5024763776, 5033164672, 5041544576, 5049941888, -5058329728, 5066717056, 5075107456, 5083494272, 5091883904, -5100273536, 5108662144, 5117048192, 5125436032, 5133827456, -5142215296, 5150605184, 5158993024, 5167382144, 5175769472, -5184157568, 5192543872, 5200936064, 5209324928, 5217711232, -5226102656, 5234490496, 5242877312, 5251263872, 5259654016, -5268040832, 5276434304, 5284819328, 5293209728, 5301598592, -5309986688, 5318374784, 5326764416, 5335151488, 5343542144, -5351929472, 5360319872, 5368706944, 5377096576, 5385484928, -5393871232, 5402263424, 5410650496, 5419040384, 5427426944, -5435816576, 5444205952, 5452594816, 5460981376, 5469367936, -5477760896, 5486148736, 5494536832, 5502925952, 5511315328, -5519703424, 5528089984, 5536481152, 5544869504, 5553256064, -5561645696, 5570032768, 5578423936, 5586811264, 5595193216, -5603585408, 5611972736, 5620366208, 5628750464, 5637143936, -5645528192, 5653921408, 5662310272, 5670694784, 5679082624, -5687474048, 5695864448, 5704251008, 5712641408, 5721030272, -5729416832, 5737806208, 5746194304, 5754583936, 5762969984, -5771358592, 5779748224, 5788137856, 5796527488, 5804911232, -5813300608, 5821692544, 5830082176, 5838468992, 5846855552, -5855247488, 5863636096, 5872024448, 5880411008, 5888799872, -5897186432, 5905576832, 5913966976, 5922352768, 5930744704, -5939132288, 5947522432, 5955911296, 5964299392, 5972688256, -5981074304, 5989465472, 5997851008, 6006241408, 6014627968, -6023015552, 6031408256, 6039796096, 6048185216, 6056574848, -6064963456, 6073351808, 6081736064, 6090128768, 6098517632, -6106906496, 6115289216, 6123680896, 6132070016, 6140459648, -6148849024, 6157237376, 6165624704, 6174009728, 6182403712, -6190792064, 6199176064, 6207569792, 6215952256, 6224345216, -6232732544, 6241124224, 6249510272, 6257899136, 6266287744, -6274676864, 6283065728, 6291454336, 6299843456, 6308232064, -6316620928, 6325006208, 6333395584, 6341784704, 6350174848, -6358562176, 6366951296, 6375337856, 6383729536, 6392119168, -6400504192, 6408895616, 6417283456, 6425673344, 6434059136, -6442444672, 6450837376, 6459223424, 6467613056, 6476004224, -6484393088, 6492781952, 6501170048, 6509555072, 6517947008, -6526336384, 6534725504, 6543112832, 6551500672, 6559888768, -6568278656, 6576662912, 6585055616, 6593443456, 6601834112, -6610219648, 6618610304, 6626999168, 6635385472, 6643777408, -6652164224, 6660552832, 6668941952, 6677330048, 6685719424, -6694107776, 6702493568, 6710882176, 6719274112, 6727662976, -6736052096, 6744437632, 6752825984, 6761213824, 6769604224, -6777993856, 6786383488, 6794770816, 6803158144, 6811549312, -6819937664, 6828326528, 6836706176, 6845101696, 6853491328, -6861880448, 6870269312, 6878655104, 6887046272, 6895433344, -6903822208, 6912212864, 6920596864, 6928988288, 6937377152, -6945764992, 6954149248, 6962544256, 6970928768, 6979317376, -6987709312, 6996093824, 7004487296, 7012875392, 7021258624, -7029652352, 7038038912, 7046427776, 7054818944, 7063207808, -7071595136, 7079980928, 7088372608, 7096759424, 7105149824, -7113536896, 7121928064, 7130315392, 7138699648, 7147092352, -7155479168, 7163865728, 7172249984, 7180648064, 7189036672, -7197424768, 7205810816, 7214196608, 7222589824, 7230975104, -7239367552, 7247755904, 7256145536, 7264533376, 7272921472, -7281308032, 7289694848, 7298088832, 7306471808, 7314864512, -7323253888, 7331643008, 7340029568, 7348419712, 7356808832, -7365196672, 7373585792, 7381973888, 7390362752, 7398750592, -7407138944, 7415528576, 7423915648, 7432302208, 7440690304, -7449080192, 7457472128, 7465860992, 7474249088, 7482635648, -7491023744, 7499412608, 7507803008, 7516192384, 7524579968, -7532967296, 7541358464, 7549745792, 7558134656, 7566524032, -7574912896, 7583300992, 7591690112, 7600075136, 7608466816, -7616854912, 7625244544, 7633629824, 7642020992, 7650410368, -7658794112, 7667187328, 7675574912, 7683961984, 7692349568, -7700739712, 7709130368, 7717519232, 7725905536, 7734295424, -7742683264, 7751069056, 7759457408, 7767849088, 7776238208, -7784626816, 7793014912, 7801405312, 7809792128, 7818179968, -7826571136, 7834957184, 7843347328, 7851732352, 7860124544, -7868512384, 7876902016, 7885287808, 7893679744, 7902067072, -7910455936, 7918844288, 7927230848, 7935622784, 7944009344, -7952400256, 7960786048, 7969176704, 7977565312, 7985953408, -7994339968, 8002730368, 8011119488, 8019508096, 8027896192, -8036285056, 8044674688, 8053062272, 8061448832, 8069838464, -8078227328, 8086616704, 8095006592, 8103393664, 8111783552, -8120171392, 8128560256, 8136949376, 8145336704, 8153726848, -8162114944, 8170503296, 8178891904, 8187280768, 8195669632, -8204058496, 8212444544, 8220834176, 8229222272, 8237612672, -8246000768, 8254389376, 8262775168, 8271167104, 8279553664, -8287944064, 8296333184, 8304715136, 8313108352, 8321497984, -8329885568, 8338274432, 8346663296, 8355052928, 8363441536, -8371828352, 8380217984, 8388606592, 8396996224, 8405384576, -8413772672, 8422161536, 8430549376, 8438939008, 8447326592, -8455715456, 8464104832, 8472492928, 8480882048, 8489270656, -8497659776, 8506045312, 8514434944, 8522823808, 8531208832, -8539602304, 8547990656, 8556378752, 8564768384, 8573154176, -8581542784, 8589933952, 8598322816, 8606705024, 8615099264, -8623487872, 8631876992, 8640264064, 8648653952, 8657040256, -8665430656, 8673820544, 8682209152, 8690592128, 8698977152, -8707374464, 8715763328, 8724151424, 8732540032, 8740928384, -8749315712, 8757704576, 8766089344, 8774480768, 8782871936, -8791260032, 8799645824, 8808034432, 8816426368, 8824812928, -8833199488, 8841591424, 8849976448, 8858366336, 8866757248, -8875147136, 8883532928, 8891923328, 8900306816, 8908700288, -8917088384, 8925478784, 8933867392, 8942250368, 8950644608, -8959032704, 8967420544, 8975809664, 8984197504, 8992584064, -9000976256, 9009362048, 9017752448, 9026141312, 9034530688, -9042917504, 9051307904, 9059694208, 9068084864, 9076471424, -9084861824, 9093250688, 9101638528, 9110027648, 9118416512, -9126803584, 9135188096, 9143581312, 9151969664, 9160356224, -9168747136, 9177134464, 9185525632, 9193910144, 9202302848, -9210690688, 9219079552, 9227465344, 9235854464, 9244244864, -9252633472, 9261021824, 9269411456, 9277799296, 9286188928, -9294574208, 9302965888, 9311351936, 9319740032, 9328131968, -9336516736, 9344907392, 9353296768, 9361685888, 9370074752, -9378463616, 9386849408, 9395239808, 9403629184, 9412016512, -9420405376, 9428795008, 9437181568, 9445570688, 9453960832, -9462346624, 9470738048, 9479121536, 9487515008, 9495903616, -9504289664, 9512678528, 9521067904, 9529456256, 9537843584, -9546233728, 9554621312, 9563011456, 9571398784, 9579788672, -9588178304, 9596567168, 9604954496, 9613343104, 9621732992, -9630121856, 9638508416, 9646898816, 9655283584, 9663675776, -9672061312, 9680449664, 9688840064, 9697230464, 9705617536, -9714003584, 9722393984, 9730772608, 9739172224, 9747561088, -9755945344, 9764338816, 9772726144, 9781116544, 9789503872, -9797892992, 9806282624, 9814670464, 9823056512, 9831439232, -9839833984, 9848224384, 9856613504, 9865000576, 9873391232, -9881772416, 9890162816, 9898556288, 9906940544, 9915333248, -9923721088, 9932108672, 9940496512, 9948888448, 9957276544, -9965666176, 9974048384, 9982441088, 9990830464, 9999219584, -10007602816, 10015996544, 10024385152, 10032774016, 10041163648, -10049548928, 10057940096, 10066329472, 10074717824, 10083105152, -10091495296, 10099878784, 10108272256, 10116660608, 10125049216, -10133437312, 10141825664, 10150213504, 10158601088, 10166991232, -10175378816, 10183766144, 10192157312, 10200545408, 10208935552, -10217322112, 10225712768, 10234099328, 10242489472, 10250876032, -10259264896, 10267656064, 10276042624, 10284429184, 10292820352, -10301209472, 10309598848, 10317987712, 10326375296, 10334763392, -10343153536, 10351541632, 10359930752, 10368318592, 10376707456, -10385096576, 10393484672, 10401867136, 10410262144, 10418647424, -10427039104, 10435425664, 10443810176, 10452203648, 10460589952, -10468982144, 10477369472, 10485759104, 10494147712, 10502533504, -10510923392, 10519313536, 10527702656, 10536091264, 10544478592, -10552867712, 10561255808, 10569642368, 10578032768, 10586423168, -10594805632, 10603200128, 10611588992, 10619976064, 10628361344, -10636754048, 10645143424, 10653531776, 10661920384, 10670307968, -10678696832, 10687086464, 10695475072, 10703863168, 10712246144, -10720639616, 10729026688, 10737414784, 10745806208, 10754190976, -10762581376, 10770971264, 10779356288, 10787747456, 10796135552, -10804525184, 10812915584, 10821301888, 10829692288, 10838078336, -10846469248, 10854858368, 10863247232, 10871631488, 10880023424, -10888412032, 10896799616, 10905188992, 10913574016, 10921964672, -10930352768, 10938742912, 10947132544, 10955518592, 10963909504, -10972298368, 10980687488, 10989074816, 10997462912, 11005851776, -11014241152, 11022627712, 11031017344, 11039403904, 11047793024, -11056184704, 11064570752, 11072960896, 11081343872, 11089737856, -11098128256, 11106514816, 11114904448, 11123293568, 11131680128, -11140065152, 11148458368, 11156845696, 11165236864, 11173624192, -11182013824, 11190402688, 11198790784, 11207179136, 11215568768, -11223957376, 11232345728, 11240734592, 11249122688, 11257511296, -11265899648, 11274285952, 11282675584, 11291065472, 11299452544, -11307842432, 11316231296, 11324616832, 11333009024, 11341395584, -11349782656, 11358172288, 11366560384, 11374950016, 11383339648, -11391721856, 11400117376, 11408504192, 11416893568, 11425283456, -11433671552, 11442061184, 11450444672, 11458837888, 11467226752, -11475611776, 11484003968, 11492392064, 11500780672, 11509169024, -11517550976, 11525944448, 11534335616, 11542724224, 11551111808, -11559500672, 11567890304, 11576277376, 11584667008, 11593056128, -11601443456, 11609830016, 11618221952, 11626607488, 11634995072, -11643387776, 11651775104, 11660161664, 11668552576, 11676940928, -11685330304, 11693718656, 11702106496, 11710496128, 11718882688, -11727273088, 11735660416, 11744050048, 11752437376, 11760824704, -11769216128, 11777604736, 11785991296, 11794381952, 11802770048, -11811157888, 11819548544, 11827932544, 11836324736, 11844713344, -11853100928, 11861486464, 11869879936, 11878268032, 11886656896, -11895044992, 11903433088, 11911822976, 11920210816, 11928600448, -11936987264, 11945375872, 11953761152, 11962151296, 11970543488, -11978928512, 11987320448, 11995708288, 12004095104, 12012486272, -12020875136, 12029255552, 12037652096, 12046039168, 12054429568, -12062813824, 12071206528, 12079594624, 12087983744, 12096371072, -12104759936, 12113147264, 12121534592, 12129924992, 12138314624, -12146703232, 12155091584, 12163481216, 12171864704, 12180255872, -12188643968, 12197034112, 12205424512, 12213811328, 12222199424, -12230590336, 12238977664, 12247365248, 12255755392, 12264143488, -12272531584, 12280920448, 12289309568, 12297694592, 12306086528, -12314475392, 12322865024, 12331253632, 12339640448, 12348029312, -12356418944, 12364805248, 12373196672, 12381580928, 12389969024, -12398357632, 12406750592, 12415138432, 12423527552, 12431916416, -12440304512, 12448692352, 12457081216, 12465467776, 12473859968, -12482245504, 12490636672, 12499025536, 12507411584, 12515801728, -12524190592, 12532577152, 12540966272, 12549354368, 12557743232, -12566129536, 12574523264, 12582911872, 12591299456, 12599688064, -12608074624, 12616463488, 12624845696, 12633239936, 12641631616, -12650019968, 12658407296, 12666795136, 12675183232, 12683574656, -12691960192, 12700350592, 12708740224, 12717128576, 12725515904, -12733906816, 12742295168, 12750680192, 12759071872, 12767460736, -12775848832, 12784236928, 12792626816, 12801014656, 12809404288, -12817789312, 12826181504, 12834568832, 12842954624, 12851345792, -12859732352, 12868122496, 12876512128, 12884901248, 12893289088, -12901672832, 12910067584, 12918455168, 12926842496, 12935232896, -12943620736, 12952009856, 12960396928, 12968786816, 12977176192, -12985563776, 12993951104, 13002341504, 13010730368, 13019115392, -13027506304, 13035895168, 13044272512, 13052673152, 13061062528, -13069446272, 13077838976, 13086227072, 13094613632, 13103000192, -13111393664, 13119782528, 13128157568, 13136559232, 13144945024, -13153329536, 13161724288, 13170111872, 13178502784, 13186884736, -13195279744, 13203667072, 13212057472, 13220445824, 13228832128, -13237221248, 13245610624, 13254000512, 13262388352, 13270777472, -13279166336, 13287553408, 13295943296, 13304331904, 13312719488, -13321108096, 13329494656, 13337885824, 13346274944, 13354663808, -13363051136, 13371439232, 13379825024, 13388210816, 13396605056, -13404995456, 13413380224, 13421771392, 13430159744, 13438546048, -13446937216, 13455326848, 13463708288, 13472103808, 13480492672, -13488875648, 13497269888, 13505657728, 13514045312, 13522435712, -13530824576, 13539210112, 13547599232, 13555989376, 13564379008, -13572766336, 13581154432, 13589544832, 13597932928, 13606320512, -13614710656, 13623097472, 13631477632, 13639874944, 13648264064, -13656652928, 13665041792, 13673430656, 13681818496, 13690207616, -13698595712, 13706982272, 13715373184, 13723762048, 13732150144, -13740536704, 13748926592, 13757316224, 13765700992, 13774090112, -13782477952, 13790869376, 13799259008, 13807647872, 13816036736, -13824425344, 13832814208, 13841202304, 13849591424, 13857978752, -13866368896, 13874754688, 13883145344, 13891533184, 13899919232, -13908311168, 13916692096, 13925085056, 13933473152, 13941866368, -13950253696, 13958643584, 13967032192, 13975417216, 13983807616, -13992197504, 14000582272, 14008973696, 14017363072, 14025752192, -14034137984, 14042528384, 14050918016, 14059301504, 14067691648, -14076083584, 14084470144, 14092852352, 14101249664, 14109635968, -14118024832, 14126407552, 14134804352, 14143188608, 14151577984, -14159968384, 14168357248, 14176741504, 14185127296, 14193521024, -14201911424, 14210301824, 14218685056, 14227067264, 14235467392, -14243855488, 14252243072, 14260630144, 14269021568, 14277409408, -14285799296, 14294187904, 14302571392, 14310961792, 14319353728, -14327738752, 14336130944, 14344518784, 14352906368, 14361296512, -14369685376, 14378071424, 14386462592, 14394848128, 14403230848, -14411627392, 14420013952, 14428402304, 14436793472, 14445181568, -14453569664, 14461959808, 14470347904, 14478737024, 14487122816, -14495511424, 14503901824, 14512291712, 14520677504, 14529064832, -14537456768, 14545845632, 14554234496, 14562618496, 14571011456, -14579398784, 14587789184, 14596172672, 14604564608, 14612953984, -14621341312, 14629724288, 14638120832, 14646503296, 14654897536, -14663284864, 14671675264, 14680061056, 14688447616, 14696835968, -14705228416, 14713616768, 14722003328, 14730392192, 14738784128, -14747172736, 14755561088, 14763947648, 14772336512, 14780725376, -14789110144, 14797499776, 14805892736, 14814276992, 14822670208, -14831056256, 14839444352, 14847836032, 14856222848, 14864612992, -14872997504, 14881388672, 14889775744, 14898165376, 14906553472, -14914944896, 14923329664, 14931721856, 14940109696, 14948497024, -14956887424, 14965276544, 14973663616, 14982053248, 14990439808, -14998830976, 15007216768, 15015605888, 15023995264, 15032385152, -15040768384, 15049154944, 15057549184, 15065939072, 15074328448, -15082715008, 15091104128, 15099493504, 15107879296, 15116269184, -15124659584, 15133042304, 15141431936, 15149824384, 15158214272, -15166602368, 15174991232, 15183378304, 15191760512, 15200154496, -15208542592, 15216931712, 15225323392, 15233708416, 15242098048, -15250489216, 15258875264, 15267265408, 15275654528, 15284043136, -15292431488, 15300819584, 15309208192, 15317596544, 15325986176, -15334374784, 15342763648, 15351151744, 15359540608, 15367929728, -15376318336, 15384706432, 15393092992, 15401481856, 15409869952, -15418258816, 15426649984, 15435037568, 15443425664, 15451815296, -15460203392, 15468589184, 15476979328, 15485369216, 15493755776, -15502146944, 15510534272, 15518924416, 15527311232, 15535699072, -15544089472, 15552478336, 15560866688, 15569254528, 15577642624, -15586031488, 15594419072, 15602809472, 15611199104, 15619586432, -15627975296, 15636364928, 15644753792, 15653141888, 15661529216, -15669918848, 15678305152, 15686696576, 15695083136, 15703474048, -15711861632, 15720251264, 15728636288, 15737027456, 15745417088, -15753804928, 15762194048, 15770582656, 15778971008, 15787358336, -15795747712, 15804132224, 15812523392, 15820909696, 15829300096, -15837691264, 15846071936, 15854466944, 15862855808, 15871244672, -15879634816, 15888020608, 15896409728, 15904799104, 15913185152, -15921577088, 15929966464, 15938354816, 15946743424, 15955129472, -15963519872, 15971907968, 15980296064, 15988684928, 15997073024, -16005460864, 16013851264, 16022241152, 16030629248, 16039012736, -16047406976, 16055794816, 16064181376, 16072571264, 16080957824, -16089346688, 16097737856, 16106125184, 16114514816, 16122904192, -16131292544, 16139678848, 16148066944, 16156453504, 16164839552, -16173236096, 16181623424, 16190012032, 16198401152, 16206790528, -16215177344, 16223567744, 16231956352, 16240344704, 16248731008, -16257117824, 16265504384, 16273898624, 16282281856, 16290668672, -16299064192, 16307449216, 16315842176, 16324230016, 16332613504, -16341006464, 16349394304, 16357783168, 16366172288, 16374561664, -16382951296, 16391337856, 16399726208, 16408116352, 16416505472, -16424892032, 16433282176, 16441668224, 16450058624, 16458448768, -16466836864, 16475224448, 16483613056, 16492001408, 16500391808, -16508779648, 16517166976, 16525555328, 16533944192, 16542330752, -16550719616, 16559110528, 16567497088, 16575888512, 16584274816, -16592665472, 16601051008, 16609442944, 16617832064, 16626218624, -16634607488, 16642996096, 16651385728, 16659773824, 16668163712, -16676552576, 16684938112, 16693328768, 16701718144, 16710095488, -16718492288, 16726883968, 16735272832, 16743661184, 16752049792, -16760436608, 16768827008, 16777214336, 16785599104, 16793992832, -16802381696, 16810768768, 16819151744, 16827542656, 16835934848, -16844323712, 16852711552, 16861101952, 16869489536, 16877876864, -16886265728, 16894653056, 16903044736, 16911431296, 16919821696, -16928207488, 16936592768, 16944987776, 16953375616, 16961763968, -16970152832, 16978540928, 16986929536, 16995319168, 17003704448, -17012096896, 17020481152, 17028870784, 17037262208, 17045649536, -17054039936, 17062426496, 17070814336, 17079205504, 17087592064, -17095978112, 17104369024, 17112759424, 17121147776, 17129536384, -17137926016, 17146314368, 17154700928, 17163089792, 17171480192, -17179864192, 17188256896, 17196644992, 17205033856, 17213423488, -17221811072, 17230198912, 17238588032, 17246976896, 17255360384, -17263754624, 17272143232, 17280530048, 17288918912, 17297309312, -17305696384, 17314085504, 17322475136, 17330863744, 17339252096, -17347640192, 17356026496, 17364413824, 17372796544, 17381190016, -17389583488, 17397972608, 17406360704, 17414748544, 17423135872, -17431527296, 17439915904, 17448303232, 17456691584, 17465081728, -17473468288, 17481857408, 17490247552, 17498635904, 17507022464, -17515409024, 17523801728, 17532189824, 17540577664, 17548966016, -17557353344, 17565741184, 17574131584, 17582519168, 17590907008, -17599296128, 17607687808, 17616076672, 17624455808, 17632852352, -17641238656, 17649630848, 17658018944, 17666403968, 17674794112, -17683178368, 17691573376, 17699962496, 17708350592, 17716739968, -17725126528, 17733517184, 17741898112, 17750293888, 17758673024, -17767070336, 17775458432, 17783848832, 17792236928, 17800625536, -17809012352, 17817402752, 17825785984, 17834178944, 17842563968, -17850955648, 17859344512, 17867732864, 17876119424, 17884511872, -17892900224, 17901287296, 17909677696, 17918058112, 17926451072, -17934843776, 17943230848, 17951609216, 17960008576, 17968397696, -17976784256, 17985175424, 17993564032, 18001952128, 18010339712, -18018728576, 18027116672, 18035503232, 18043894144, 18052283264, -18060672128, 18069056384, 18077449856, 18085837184, 18094225792, -18102613376, 18111004544, 18119388544, 18127781248, 18136170368, -18144558976, 18152947328, 18161336192, 18169724288, 18178108544, -18186498944, 18194886784, 18203275648, 18211666048, 18220048768, -18228444544, 18236833408, 18245220736] - -cache_sizes = [ -16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, -17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, -18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, -19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, -20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, -21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, -22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, -23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, -24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, -25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, -25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, -26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, -27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, -28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, -29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, -30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, -31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, -32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, -33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, -34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, -35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, -36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, -36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, -37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, -38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, -39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, -40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, -41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, -42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, -43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, -44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, -45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, -46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, -47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, -47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, -48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, -49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, -50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, -51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, -52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, -53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, -54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, -55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, -56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, -57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, -58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, -58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, -59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, -60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, -61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, -62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, -63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, -64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, -65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, -66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, -67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, -68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, -69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, -69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, -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] -``` diff --git a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md deleted file mode 100644 index 9cf602208cf..00000000000 --- a/public/content/translations/pt-br/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Algoritmos de mineração -description: Os algoritmos usados para mineração Ethereum -lang: pt-br ---- - - -A prova de trabalho não está mais subjacente ao mecanismo de consenso do Ethereum, o que significa que a mineração foi desativada. Em vez disso, o Ethereum é garantido por validadores que apostam em ETH. Você pode começar a fazer o staking do seu ETH hoje. Leia mais sobre A Fusão, prova de participação e participação. Esta página é apenas de interesse histórico. - - -A mineração Ethereum usou um algoritmo conhecido como Ethash. A ideia fundamental do algoritmo é que um minerador tente encontrar uma entrada de nonce usando a computação de força bruta, para que o hash resultante seja menor que um limite determinado pela dificuldade calculada. Esse nível de dificuldade pode ser ajustado dinamicamente, permitindo que a produção de blocos ocorra em intervalos regulares. - -## Pré-Requisitos {#prerequisites} - -Para entender melhor esta página, recomendamos que você leia primeiro sobre o [consenso da prova de trabalho](/developers/docs/consensus-mechanisms/pow) e a [mineração](/developers/docs/consensus-mechanisms/pow/mining). - -## Dagger Hashimoto {#dagger-hashimoto} - -Dagger Hashimoto foi um algoritmo de pesquisa precursor para mineração Ethereum que Ethash substituiu. Era uma fusão de dois algoritmos diferentes: Dagger e Hashimoto. Foi apenas uma implementação de pesquisa e foi substituída pelo Ethash no momento em que a rede principal do Ethereum foi lançada. - -[Dagger](http://www.hashcash.org/papers/dagger.html) envolve a geração de um [Grafo Acíclico Direcionado](https://en.wikipedia.org/wiki/Directed_acyclic_graph), cujas fatias aleatórias do hash são feitas juntas. O princípio central é que cada nonce requer apenas uma pequena porção de uma grande árvore de dados total. Recomputar a subárvore para cada nonce é proibitivo para a mineração – daí a necessidade de armazenar a árvore – mas tudo bem para uma única verificação de valor do nonce. O Dagger foi projetado para ser uma alternativa aos algoritmos existentes como o Scrypt, que fazem uso intenso de memória, mas que são difíceis de verificar conforme a utilização de memória aumenta para níveis genuinamente seguros. No entanto, Dagger era vulnerável à aceleração de hardware de memória compartilhada e caiu em favor de outras vias de pesquisa. - -[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) é um algoritmo que adiciona resistência ASIC ao ser vinculado à E/S (ou seja, leituras de memória são o fator limitante no processo de mineração). A teoria é que a RAM está mais disponível do que a computação; bilhões de dólares em pesquisas já investigaram a otimização de RAM para diferentes casos de uso, o que geralmente envolvem padrões de acesso quase aleatórios (daí “memória de acesso aleatório”). Como resultado, é provável que a memória RAM existente esteja moderadamente próxima do ideal para avaliar o algoritmo. Hashimoto usa a blockchain como fonte de dados, satisfazendo simultaneamente (1) e (3) acima. - -Dagger-Hashimoto usou versões modificadas dos algoritmos Dagger e Hashimoto. A diferença entre Dagger Hashimoto e Hashimoto é que, ao invés de usar a blockchain como fonte de dados, o Dagger Hashimoto usa um conjunto de dados gerados de forma personalizada, que atualiza com base nos dados do bloco a cada N blocos. O conjunto de dados é gerado usando o algoritmo Dagger, permitindo calcular com eficiência um subconjunto específico para cada nonce para o algoritmo de verificação de cliente leve. A diferença entre Dagger Hashimoto e Dagger é que, ao contrário do Dagger original, o conjunto de dados usado para consultar o bloco é semipermanente, sendo atualizado apenas em intervalos ocasionais (por exemplo, uma vez por semana). Isso significa que a porção do esforço de geração do conjunto de dados é próxima de zero, de modo que os argumentos de Sergio Lerner a respeito das acelerações de memória compartilhada tornam-se insignificantes. - -Mais sobre [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto). - -## Ethash {#ethash} - -Ethash foi o algoritmo de mineração, que na verdade foi usado na rede principal Ethereum real, sob a agora obsoleta arquitetura de prova de trabalho. Ethash foi efetivamente um novo nome dado a uma versão específica do Dagger-Hashimoto depois que o algoritmo foi significativamente atualizado, enquanto ainda herdava os princípios fundamentais de seu antecessor. A rede principal do Ethereum só usava Ethash. Dagger Hashimoto era uma versão de pesquisa e desenvolvimento do algoritmo de mineração que foi substituído antes do início da mineração na rede principal do Ethereum. - -[Mais sobre Ethash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash). - -## Leitura adicional {#further-reading} - -_Conhece um recurso da comunidade que o ajudou? Edite esta página e adicione-a!_ diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md deleted file mode 100644 index 7b093f7b0fc..00000000000 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashamoto/index.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -title: Dagger-Hashimoto -description: 详细了解 Dagger-Hashimoto 算法。 -lang: zh ---- - -Dagger-Hashimoto 是以太坊挖矿算法的原始研究实现和规范。 但是,Dagger-Hashimoto 已被 [Ethash](#ethash) 取代。 在 2022 年 9 月 15 日实施的[合并](/updates/merge)后,挖矿完全关闭。 此后,以太坊采用[权益证明](/developers/docs/consensus-mechanisms/pos)机制保护安全。 本页面展示与历史有关的内容,其中的信息不再与合并后的以太坊相关。 - -## 前提条件 {#prerequisites} - -为了更好地了解此页面,建议提前阅读[工作量证明共识](/developers/docs/consensus-mechanisms/pow)、[挖矿](/developers/docs/consensus-mechanisms/pow/mining)和[挖矿算法](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms)。 - -## Dagger-Hashimoto 算法 {#dagger-hashimoto} - -Dagger-Hashimoto 旨在实现两个目标: - -1. **ASIC 抗性**:为算法打造专用硬件的益处应尽可能小。 -2. **轻量级客户端可验证性**:区块应能被轻量级客户端高效验证。 - -在作出进一步修改后,我们还要具体说明如何在必要时实现第三个目标,但要以增加复杂性为代价: - -**完整链存储**:挖矿需要存储完整的区块链状态(因为以太坊状态子树的不规则结构,我们预计将有可能进行一些修改,特别是一些经常用到的合约,但我们希望尽量减少这种情况)。 - -## 有向无环图世代 {#dag-generation} - -以下算法代码将在 Python 中定义。 首先,我们定义了 `encode_int`,用于将指定精度的无符号整数封送为字符串。 同时还定义了它的逆函数。 - -```python -NUM_BITS = 512 - -def encode_int(x): - "Encode an integer x as a string of 64 characters using a big-endian scheme" - o = '' - for _ in range(NUM_BITS / 8): - o = chr(x % 256) + o - x //= 256 - return o - -def decode_int(s): - "Unencode an integer x from a string using a big-endian scheme" - x = 0 - for c in s: - x *= 256 - x += ord(c) - return x -``` - -接下来我们假设 `sha3` 是一个需要输入整数,然后输出整数的函数,而 `dbl_sha3` 是一个 double-sha3 函数;如果将此引用代码转换为实现,使用以下代码: - -```python -from pyethereum import utils -def sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(x)) - -def dbl_sha3(x): - if isinstance(x, (int, long)): - x = encode_int(x) - return decode_int(utils.sha3(utils.sha3(x))) -``` - -### 参数 {#parameters} - -该算法使用的参数有: - -```python -SAFE_PRIME_512 = 2**512 - 38117 # Largest Safe Prime less than 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 -} -``` - -`P` 在这种情况下为优先选择,因此 `log₂(P)` 仅略小于 512。512 对应于我们用来代表我们数目的 512 字节。 请注意,实际上只需要存储有向无环图的后半部分,因此,实际内存要求最初为 1 GB,每年增长 441 MB。 - -### Dagger 建图 {#dagger-graph-building} - -Dagger 建图基本式的定义如下: - -```python -def produce_dag(params, seed, length): - P = params["P"] - picker = init = pow(sha3(seed), params["w"], P) - o = [init] - for i in range(1, length): - x = picker = (picker * init) % P - for _ in range(params["k"]): - x ^= o[x % i] - o.append(pow(x, params["w"], P)) - return o -``` - -基本上,建图从单个节点 `sha3(seed)` 开始,然后根据随机的先前节点按顺序添加到其他节点上。 创建一个新的节点后,将计算种子的模块化能力,以随机选择一些小于 `i` 的索引(使用上述 `x % i`),并且使用这些索引上的节点值进行计算,以产生新的 `x` 值,随后该值被提供给一个小的工作量证明函数(基于 XOR),最终在索引 `i` 生成图值。 这种特殊设计背后的基本原理是强制按顺序访问有向无环图。如果当前值未知,则无法确定要访问的下一个有向无环图的值。 最后,模幂运算会使结果更加恶化。 - -这种算法依赖于数字理论的若干结果。 讨论情况见下文附录。 - -## 轻量级客户端评估 {#light-client-evaluation} - -上述构图旨在实现图中每个节点的重构,只计算少量节点的子树,并且仅需少量的辅助内存。 请注意,当 k=1 时,子树只是一个上升到有向无环图第一个元素的值链。 - -轻量级客户端中,有向无环图的计算函数如下: - -```python -def quick_calc(params, seed, p): - w, P = params["w"], params["P"] - cache = {} - - def quick_calc_cached(p): - if p in cache: - pass - elif p == 0: - cache[p] = pow(sha3(seed), w, P) - else: - x = pow(sha3(seed), (p + 1) * w, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(x % p) - cache[p] = pow(x, w, P) - return cache[p] - - return quick_calc_cached(p) -``` - -本质上,它只是对上述算法的重写,删除了计算整个有向无环图值的循环,并用递归调用或缓存查找替换了早期的节点查找。 请注意,对于 `k=1` 的情况,缓存是不必要的,尽管进一步的优化实际上预先计算了有向无环图的前几千个值,并将其作为静态缓存进行计算;有关此代码实现,请参见附录。 - -## 有向无环图的双倍缓冲 {#double-buffer} - -在完整客户端中,使用了上述公式生成的 2 个有向无环图的[_双倍缓冲_](https://wikipedia.org/wiki/Multiple_buffering)。 具体概念是,根据上述参数,每个 `epochtime` 生成一个有向无环图。 但客户端使用的并非是最新生成的有向无环图,而是前一个。 这样做的好处是,有向无环图可以随着时间的推移而被替换掉,无需包含矿工必须突然重新计算所有数据的步骤。 否则,定期的链处理可能会突然暂时放缓,并大幅提高中心化程度。 因此,在重新计算所有数据之前的几分钟时间内,存在 51% 的攻击风险。 - -要生成用于块工作计算的有向无环图集,算法如下: - -```python -def get_prevhash(n): - from pyethereum.blocks import GENESIS_PREVHASH - from pyethereum import chain_manager - if num <= 0: - return hash_to_int(GENESIS_PREVHASH) - else: - prevhash = chain_manager.index.get_block_by_number(n - 1) - return decode_int(prevhash) - -def get_seedset(params, block): - seedset = {} - seedset["back_number"] = block.number - (block.number % params["epochtime"]) - seedset["back_hash"] = get_prevhash(seedset["back_number"]) - seedset["front_number"] = max(seedset["back_number"] - params["epochtime"], 0) - seedset["front_hash"] = get_prevhash(seedset["front_number"]) - return seedset - -def get_dagsize(params, block): - return params["n"] + (block.number // params["epochtime"]) * params["n_inc"] - -def get_daggerset(params, block): - dagsz = get_dagsize(params, block) - seedset = get_seedset(params, block) - if seedset["front_hash"] <= 0: - # No back buffer is possible, just make front buffer - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": 0}} - else: - return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), - "block_number": seedset["front_number"]}, - "back": {"dag": produce_dag(params, seedset["back_hash"], dagsz), - "block_number": seedset["back_number"]}} -``` - -## Hashimoto {#hashimoto} - -初始 Hashimoto 旨在将区块链用作数据集,执行从区块链中选择 N 个索引的计算,收集这些索引处的交易,对这些数据执行 XOR,并返回结果哈希值。 Thaddeus Dryja 的初始算法(为了保持一致性,被转化成 Python),具体如下: - -```python -def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): - hash_output_A = sha256(prev_hash + merkle_root + nonce) - txid_mix = 0 - for i in range(64): - shifted_A = hash_output_A >> i - transaction = shifted_A % len(list_of_transactions) - txid_mix ^= list_of_transactions[transaction] << i - return txid_max ^ (nonce << 192) -``` - -不幸的是,虽然 Hashimoto 被视为内存硬件,但它依靠的是 256 位计算,计算量非常之大。 然而,Dagger-Hashimoto 在索引其数据集时仅使用最低有效 64 位来解决此问题。 - -```python -def hashimoto(dag, dagsize, params, header, nonce): - m = dagsize / 2 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= dag[m + (mix % 2**64) % m] - return dbl_sha3(mix) -``` - -使用双 SHA3 可以实现零数据、近乎即时的预验证,仅验证是否提供了正确的中间值。 此工作量证明的外层对专用集成电路高度友好且相当薄弱,但它的存在使分布式拒绝服务变得更加困难,因为必须完成少量工作才能生成不会立即被拒绝的区块。 以下为轻量级客户端版本: - -```python -def quick_hashimoto(seed, dagsize, params, header, nonce): - m = dagsize // 2 - mix = sha3(nonce + header) - for _ in range(params["accesses"]): - mix ^= quick_calc(params, seed, m + (mix % 2**64) % m) - return dbl_sha3(mix) -``` - -## 挖矿与验证 {#mining-and-verifying} - -现在,将它们全部整合到挖矿算法中: - -```python -def mine(daggerset, params, block): - from random import randint - nonce = randint(0, 2**64) - while 1: - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - if result * params["diff"] < 2**256: - break - nonce += 1 - if nonce >= 2**64: - nonce = 0 - return nonce -``` - -以下为验证算法: - -```python -def verify(daggerset, params, block, nonce): - result = hashimoto(daggerset, get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -轻量级客户端的友好验证: - -```python -def light_verify(params, header, nonce): - seedset = get_seedset(params, block) - result = quick_hashimoto(seedset["front_hash"], get_dagsize(params, block), - params, decode_int(block.prevhash), nonce) - return result * params["diff"] < 2**256 -``` - -另外,请注意 Dagger-Hashimoto 对区块头有着额外的要求: - -- 为了使双层验证起效,区块头必须同时具有随机数和中间值 pre-sha3 -- 在某处,区块头必须存储当前种子集的 sha3 - -## 延伸阅读 {#further-reading} - -_还有哪些社区资源对你有所帮助? 请编辑本页面并添加!_ - -## 附录 {#appendix} - -如前所述,用于生成有向无环图的随机数生成依赖于数论的一些结果。 Lehmer 随机数生成程序是 `picker` 变量的基础,因此我们首先确保它具有很宽的周期。 其次,只要一开始 `x ∈ [2,P-2]`,我们便能证明 `pow(x,3,P)` 不会将 `x` 映射到 `1` 或 `P-1`。 最后,我们证明 `pow(x,3,P)` 在被视为散列函数时具有较低的冲突率。 - -### Lehmer 随机数生成程序 {#lehmer-random-number} - -虽然 `produce_dag` 函数不需要生成无偏随机数,但潜在的威胁是 `seed**i % P` 只取少数几个值。 这可以为矿工识别模式提供优势。 - -为了避免这种情况,可采用数论结果。 [_安全素数_](https://en.wikipedia.org/wiki/Safe_prime)定义为素数 `P`,从而 `(P-1)/2` 也是素数。 [乘数组](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n)中 `x` 的*顺序* (乘数组 `ℤ/nℤ`)定义为最小 `m`,以使
      xᵐ mod P ≡ 1
      -鉴于这些定义,我们得到: - -> 观察 1。 令 `x` 成为乘法组 `ℤ/Pℤ` 的一员,以获得安全素数 `P`。 如果 `x mod P ≠ 1 mod P` 和 `x mod P ≠ P-1 mod P`,那么 `x` 的顺序是 ` P-1` 或 `(P-1)/2`。 - -_证明_。 由于 `P` 是一个安全素数,那么根据 \[Lagrange's Theorem\]\[lagrange\],我们得到 `x` 的顺序为 `1`、`2`、`(P-1)/2` 或 `P-1`。 - -`x` 的顺序不能是 `1`,因为根据费马小定理,我们得出: - -
      xP-1 mod P ≡ 1
      - -因此,`x` 必须是 `ℤ/nℤ` 的乘法单位,并且是唯一的乘法单位。 由于我们假设 `x ≠ 1`,所以这是不可能的。 - -`x` 的顺序不能是 `2`,除非 `x = P-1`,因为这将违反 `P` 是素数的事实。 - -从以上命题中,我们可以知道,迭代 `(picker * init) % P` 的循环长度至少为 `(P-1)/2`。 这是因为我们选择 `P` 作为安全素数,强度几乎翻倍,且 `init` 处于 `[2,2**256+1]` 区间内。 鉴于强度为 `P`,我们永远不应期待源自模幂运算的周期。 - -在有向无环图中分配第一个单元时(变量标签为 `init`),我们会计算 `pow(sha3(seed) + 2, 3, P)`。 初看起来,这并不能保证结果既不是 `1` 也不是 `P-1`。 然而,既然 `P-1` 是一个安全素数,我们还提供以下额外保证,这是观察 1 的必然结果: - -> 观察 2。 令 `x` 成为乘法组 `ℤ/Pℤ` 的一员,以获得安全素数 `P`,并让 `w` 成为自然数。 如果 `x mod P ≠ 1 mod P`、`x mod P ≠ P-1 mod P`,且 `w mod P ≠ P-1 mod P`、`w mod P ≠ 0 mod P`,那么 `xʷ mod P ≠ 1 mod P` 且 `xʷ mod P ≠ P-1 mod P` - -### 模幂运算用作散列函数 {#modular-exponentiation} - -对于特定的 `P` 值和 `w` 值,函数 `pow(x, w, P)` 可能存在许多冲突。 例如,`pow(x,9,19)` 的值只能接受 `{1,18}`。 - -鉴于 `P` 为素数,可以使用以下结果,选择一个用于模幂运算哈希函数的适当 `w` 值: - -> 观察 3。 令 `P` 为素数;当且仅当用于 `ℤ/Pℤ` 中所有 `a` 和 `b` 满足以下条件时,`w` 和 `P-1` 才能为互素。 -> ->
      -> `aʷ mod P ≡ bʷ mod P`,当且仅当 `a mod P ≡ b mod P` ->
      - -因此,鉴于 `P` 为素数,且 `w` 与 `P-1` 为互素,我们得出 `|{pow(x, w, P) : x ∈ ℤ}| = P`,表示散列函数具有尽可能小的冲突率。 - -在特殊情况下,`P` 是我们选择的安全素数,那么 `P-1` 仅有系数 1、2、`(P-1)/2` 和 `P-1`。 由于 `P` > 7,我们知道 3 与 `P-1` 互素,因此 `w=3` 满足上述命题。 - -## 更有效的缓存评估算法 {#cache-based-evaluation} - -```python -def quick_calc(params, seed, p): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_calc_cached(cache, params, p) - -def quick_calc_cached(cache, params, p): - P = params["P"] - if p < len(cache): - return cache[p] - else: - x = pow(cache[0], p + 1, P) - for _ in range(params["k"]): - x ^= quick_calc_cached(cache, params, x % p) - return pow(x, params["w"], P) - -def quick_hashimoto(seed, dagsize, params, header, nonce): - cache = produce_dag(params, seed, params["cache_size"]) - return quick_hashimoto_cached(cache, dagsize, params, header, nonce) - -def quick_hashimoto_cached(cache, dagsize, params, header, nonce): - m = dagsize // 2 - mask = 2**64 - 1 - mix = sha3(encode_int(nonce) + header) - for _ in range(params["accesses"]): - mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) - return dbl_sha3(mix) -``` diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md deleted file mode 100644 index 122299948ce..00000000000 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash/index.md +++ /dev/null @@ -1,1014 +0,0 @@ ---- -title: Ethash -description: Ethash 算法详细介绍。 -lang: zh ---- - - - Ethash 是以太坊的工作量证明挖矿算法。 工作量证明现在已经被**完全关闭**,取而代之,以太坊现在使用权益证明来保证安全。 阅读更多关于合并权益证明质押的信息。 此页面是为了满足对历史的兴趣! - - -[Ethash](https://github.com/ethereum/wiki/wiki/Ethash) 是 [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto) 算法的修改版。 Ethash 工作量证明是[内存密集型](https://wikipedia.org/wiki/Memory-hard_function)算法,这被认为使算法可抵御专用集成电路。 Ethash 专用集成电路最终被开发出来,但在工作量证明被关闭之前,图形处理单元挖矿仍然是一个可行的选择。 Ethash 仍然用于在其他非以太坊工作量证明网络上挖掘其他币。 - -## Ethash 是如何工作的? {#how-does-ethash-work} - -内存硬度通过工作量证明算法实现,需要根据随机数和区块头选择固定资源子集。 该资源(大小为几 GB)称为有向无环图。 有向无环图每 30000 个区块更改一次(大约 125 小时的窗口,称为一个时段(大约 5.2 天)),需要一段时间才能生成。 由于有向无环图仅依赖于区块高度,因此可以预先生成,但如果没有,则客户端需要等到此过程结束才能生成区块。 如果客户端没有提前预生成和缓存有向无环图,网络可能会在每个时段过渡时遇到严重的区块延迟。 请注意,不需要生成有向无环图即可验证,工作量证明本质上允许使用低端中央处理器和小内存进行验证。 - -该算法采取的一般路线如下: - -1. 有一个**种子**,可以通过扫描区块头直到该点来为每个区块计算种子。 -2. 从种子中可以计算出 **16 MB 的伪随机缓存**。 轻量级客户端存储缓存。 -3. 我们可以从缓存中生成一个 **1 GB 数据集**,数据集中每个项目仅依赖于一小部分缓存中的项目。 全客户端和矿工存储数据集。 数据集随着时间的流逝而呈线性增长。 -4. 采矿会抢走数据集的随机片段并将它们散列在一起。 可以通过使用缓存来重新生成你需要的数据集中的特定区块,以较低的内存进行验证,以使你只需要存储缓存。 - -每隔 30000 个区块更新一次大数据集,因此,矿工的绝大部分工作都是读取数据集,而不是对其进行修改。 - -## 定义 {#definitions} - -我们采用以下定义: - -``` -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 -``` - -### 使用“SHA3” {#sha3} - -以太坊的开发恰逢 SHA3 标准的制定, 标准进程对最终确定的哈希算法的填充做了后期改动,使得以太坊的 “sha3_256”和“sha3_512”哈希值不是标准的 sha3 哈希值,而是在其他情况下 常被称为“Keccak-256”和“Keccak-512”的变量。 讨论请见[此处](https://eips.ethereum.org/EIPS-1803)、[此处](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use)或[此处](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)。 - -请记住这一点,因为下面的算法描述中提到了“sha3”哈希值。 - -## 参数 {#parameters} - -Ethash 的缓存和数据集的参数取决于区块号。 缓存大小和数据集大小都呈线性增长;然而,我们总是取低于线性增长阈值的最高素数,以降低意外规律导致循环行为的风险。 - -```python -def get_cache_size(block_number): - sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= HASH_BYTES - while not isprime(sz / HASH_BYTES): - sz -= 2 * HASH_BYTES - return sz - -def get_full_size(block_number): - sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH) - sz -= MIX_BYTES - while not isprime(sz / MIX_BYTES): - sz -= 2 * MIX_BYTES - return sz -``` - -附录中提供了数据集和缓存大小值表。 - -## 缓存生成 {#cache-generation} - -现在,我们来指定生成缓存的函数: - -```python -def mkcache(cache_size, seed): - n = cache_size // HASH_BYTES - - # Sequentially produce the initial dataset - o = [sha3_512(seed)] - for i in range(1, n): - o.append(sha3_512(o[-1])) - - # Use a low-round version of randmemohash - for _ in range(CACHE_ROUNDS): - for i in range(n): - v = o[i][0] % n - o[i] = sha3_512(map(xor, o[(i-1+n) % n], o[v])) - - return o -``` - -缓存生成过程中,先按顺序填充 32 MB 内存,然后从 [_严格内存硬哈希函数 _(2014)](http://www.hashcash.org/papers/memohash.pdf) 执行两次 Sergio Demian Lerner 的 _RandMemoHash_ 算法。 输出一组 524288 个 64 字节值。 - -## 数据聚合函数 {#date-aggregation-function} - -我们使用灵感来自 [FNV 哈希](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function)的算法,在部分情况下,这种算法可用作逻辑异或的不相关替代。 请注意,我们使用全 32 位输入乘以素数,与之相对地,FNV-1 spec 用 1 个字节(8 个字节)依次乘以素数。 - -```python -FNV_PRIME = 0x01000193 - -def fnv(v1, v2): - return ((v1 * FNV_PRIME) ^ v2) % 2**32 -``` - -请注意,即使黄皮书也指出 fnv 为 v1\*(FNV_PRIME ^ v2),所有当前实现始终采用上述定义。 - -## 完整数据集计算 {#full-dataset-calculation} - -整个 1 GB 数据集中每个 64 字节项目的计算如下: - -```python -def calc_dataset_item(cache, i): - n = len(cache) - r = HASH_BYTES // WORD_BYTES - # initialize the mix - 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 - for j in range(DATASET_PARENTS): - cache_index = fnv(i ^ j, mix[j % r]) - mix = map(fnv, mix, cache[cache_index % n]) - return sha3_512(mix) -``` - -基本上,我们将来自 256 个伪随机选择的缓存节点的数据聚集起来求哈希值,以计算数据集节点。 然后生成整个数据集: - -```python -def calc_dataset(full_size, cache): - return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)] -``` - -## 主循环 {#main-loop} - -现在,我们指定了类似“hashimoto”的主要循环。在此循环中,我们聚合整个数据集的数据,以生成特定区块头和随机数的最终值。 在下面的代码中,`header` 代表一个*被截断*区块头的递归长度前缀表示的 SHA3-256 _哈希值_。被截断是指区块头被截去了 **mixHash** 和**随机数**字段。 `nonce` 是指一个 64 位无符号整数的八个字节,按大端序排列。 因此 `nonce[::-1]` 是上述值的八字节小端序表示: - -```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 - s = sha3_512(header + nonce[::-1]) - # start the mix with replicated s - mix = [] - for _ in range(MIX_BYTES / HASH_BYTES): - mix.extend(s) - # mix in random dataset nodes - 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 - 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])) - return { - "mix digest": serialize_hash(cmix), - "result": serialize_hash(sha3_256(s+cmix)) - } - -def hashimoto_light(full_size, cache, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x)) - -def hashimoto_full(full_size, dataset, header, nonce): - return hashimoto(header, nonce, full_size, lambda x: dataset[x]) -``` - -基本上,我们保持着一个宽 128 字节的“混合物”,并多次按顺序从整个数据集中获取 128 字节,并使用 `fnv` 函数将其与混合物结合起来。 使用 128 字节的序列访问,以便每轮算法总是能从随机访问内存获取完整的页面,从而尽量减少转译后备缓冲区的疏忽,而专用集成电路在理论上能够避免这些疏忽。 - -如果此算法的输出低于所需目标,即证明随机数是有效的。 请注意,在最后额外应用 `sha3_256` 将确保中间随机数的存在。提供此证据可以证明至少做了少量工作;而且此快速外部工作量证明验证可以用于反分布式拒绝服务目的。 也可提供统计保证,说明结果是一个无偏 256 位数字。 - -## 挖矿 {#mining} - -挖矿算法定义如下: - -```python -def mine(full_size, dataset, header, difficulty): - # zero-pad target to compare with hash on the same digit - target = zpad(encode_int(2**256 // difficulty), 64)[::-1] - from random import randint - nonce = randint(0, 2**64) - while hashimoto_full(full_size, dataset, header, nonce) > target: - nonce = (nonce + 1) % 2**64 - return nonce -``` - -## 定义种子哈希 {#seed-hash} - -为了计算用于在给定区块上挖掘的种子哈希值,我们使用以下算法: - -```python - def get_seedhash(block): - s = '\x00' * 32 - for i in range(block.number // EPOCH_LENGTH): - s = serialize_hash(sha3_256(s)) - return s -``` - -请注意,为了顺利挖矿和验证,我们建议在单个线程中预先计算未来的种子哈希值和数据集。 - -## 延伸阅读 {#further-reading} - -_还有哪些社区资源对你有所帮助? 请编辑本页面并添加!_ - -## 附录 {#appendix} - -如果你有兴趣将上述 python spec 作为代码运行,则应在头部添加以下代码。 - -```python -import sha3, copy - -# Assumes little endian bit ordering (same as Intel architectures) -def decode_int(s): - return int(s[::-1].encode('hex'), 16) if s else 0 - -def encode_int(s): - a = "%x" % s - return '' if s == 0 else ('0' * (len(a) % 2) + a).decode('hex')[::-1] - -def zpad(s, length): - return s + '\x00' * max(0, length - len(s)) - -def serialize_hash(h): - return ''.join([zpad(encode_int(x), 4) for x in h]) - -def deserialize_hash(h): - return [decode_int(h[i:i+WORD_BYTES]) for i in range(0, len(h), WORD_BYTES)] - -def hash_words(h, sz, x): - if isinstance(x, list): - x = serialize_hash(x) - y = h(x) - return deserialize_hash(y) - -def serialize_cache(ds): - return ''.join([serialize_hash(h) for h in ds]) - -serialize_dataset = serialize_cache - -# sha3 hash function, outputs 64 bytes -def sha3_512(x): - return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) - -def sha3_256(x): - return hash_words(lambda v: sha3.sha3_256(v).digest(), 32, x) - -def xor(a, b): - return a ^ b - -def isprime(x): - for i in range(2, int(x**0.5)): - if x % i == 0: - return False - return True -``` - -### 数据大小 {#data-sizes} - -以下查找表列表显示了大约 2048 个数据大小和缓存大小时段。 - -```python -def get_datasize(block_number): - return data_sizes[block_number // EPOCH_LENGTH] - -def get_cachesize(block_number): - return cache_sizes[block_number // EPOCH_LENGTH] - -data_sizes = [ -1073739904, 1082130304, 1090514816, 1098906752, 1107293056, -1115684224, 1124070016, 1132461952, 1140849536, 1149232768, -1157627776, 1166013824, 1174404736, 1182786944, 1191180416, -1199568512, 1207958912, 1216345216, 1224732032, 1233124736, -1241513344, 1249902464, 1258290304, 1266673792, 1275067264, -1283453312, 1291844992, 1300234112, 1308619904, 1317010048, -1325397376, 1333787776, 1342176128, 1350561664, 1358954368, -1367339392, 1375731584, 1384118144, 1392507008, 1400897408, -1409284736, 1417673344, 1426062464, 1434451072, 1442839168, -1451229056, 1459615616, 1468006016, 1476394112, 1484782976, -1493171584, 1501559168, 1509948032, 1518337664, 1526726528, -1535114624, 1543503488, 1551892096, 1560278656, 1568669056, -1577056384, 1585446272, 1593831296, 1602219392, 1610610304, -1619000192, 1627386752, 1635773824, 1644164224, 1652555648, -1660943488, 1669332608, 1677721216, 1686109312, 1694497664, -1702886272, 1711274624, 1719661184, 1728047744, 1736434816, -1744829056, 1753218944, 1761606272, 1769995904, 1778382464, -1786772864, 1795157888, 1803550592, 1811937664, 1820327552, -1828711552, 1837102976, 1845488768, 1853879936, 1862269312, -1870656896, 1879048064, 1887431552, 1895825024, 1904212096, -1912601216, 1920988544, 1929379456, 1937765504, 1946156672, -1954543232, 1962932096, 1971321728, 1979707264, 1988093056, -1996487552, 2004874624, 2013262208, 2021653888, 2030039936, -2038430848, 2046819968, 2055208576, 2063596672, 2071981952, -2080373632, 2088762752, 2097149056, 2105539712, 2113928576, -2122315136, 2130700672, 2139092608, 2147483264, 2155872128, -2164257664, 2172642176, 2181035392, 2189426048, 2197814912, -2206203008, 2214587264, 2222979712, 2231367808, 2239758208, -2248145024, 2256527744, 2264922752, 2273312128, 2281701248, -2290086272, 2298476672, 2306867072, 2315251072, 2323639168, -2332032128, 2340420224, 2348808064, 2357196416, 2365580416, -2373966976, 2382363008, 2390748544, 2399139968, 2407530368, -2415918976, 2424307328, 2432695424, 2441084288, 2449472384, -2457861248, 2466247808, 2474637184, 2483026816, 2491414144, -2499803776, 2508191872, 2516582272, 2524970368, 2533359232, -2541743488, 2550134144, 2558525056, 2566913408, 2575301504, -2583686528, 2592073856, 2600467328, 2608856192, 2617240448, -2625631616, 2634022016, 2642407552, 2650796416, 2659188352, -2667574912, 2675965312, 2684352896, 2692738688, 2701130624, -2709518464, 2717907328, 2726293376, 2734685056, 2743073152, -2751462016, 2759851648, 2768232832, 2776625536, 2785017728, -2793401984, 2801794432, 2810182016, 2818571648, 2826959488, -2835349376, 2843734144, 2852121472, 2860514432, 2868900992, -2877286784, 2885676928, 2894069632, 2902451584, 2910843008, -2919234688, 2927622784, 2936011648, 2944400768, 2952789376, -2961177728, 2969565568, 2977951616, 2986338944, 2994731392, -3003120256, 3011508352, 3019895936, 3028287104, 3036675968, -3045063808, 3053452928, 3061837696, 3070228352, 3078615424, -3087003776, 3095394944, 3103782272, 3112173184, 3120562048, -3128944768, 3137339264, 3145725056, 3154109312, 3162505088, -3170893184, 3179280256, 3187669376, 3196056704, 3204445568, -3212836736, 3221224064, 3229612928, 3238002304, 3246391168, -3254778496, 3263165824, 3271556224, 3279944576, 3288332416, -3296719232, 3305110912, 3313500032, 3321887104, 3330273152, -3338658944, 3347053184, 3355440512, 3363827072, 3372220288, -3380608384, 3388997504, 3397384576, 3405774208, 3414163072, -3422551936, 3430937984, 3439328384, 3447714176, 3456104576, -3464493952, 3472883584, 3481268864, 3489655168, 3498048896, -3506434432, 3514826368, 3523213952, 3531603584, 3539987072, -3548380288, 3556763264, 3565157248, 3573545344, 3581934464, -3590324096, 3598712704, 3607098752, 3615488384, 3623877248, -3632265856, 3640646528, 3649043584, 3657430144, 3665821568, -3674207872, 3682597504, 3690984832, 3699367808, 3707764352, -3716152448, 3724541056, 3732925568, 3741318016, 3749706368, -3758091136, 3766481536, 3774872704, 3783260032, 3791650432, -3800036224, 3808427648, 3816815488, 3825204608, 3833592704, -3841981568, 3850370432, 3858755968, 3867147904, 3875536256, -3883920512, 3892313728, 3900702592, 3909087872, 3917478784, -3925868416, 3934256512, 3942645376, 3951032192, 3959422336, -3967809152, 3976200064, 3984588416, 3992974976, 4001363584, -4009751168, 4018141312, 4026530432, 4034911616, 4043308928, -4051695488, 4060084352, 4068472448, 4076862848, 4085249408, -4093640576, 4102028416, 4110413696, 4118805632, 4127194496, -4135583104, 4143971968, 4152360832, 4160746112, 4169135744, -4177525888, 4185912704, 4194303616, 4202691968, 4211076736, -4219463552, 4227855488, 4236246656, 4244633728, 4253022848, -4261412224, 4269799808, 4278184832, 4286578048, 4294962304, -4303349632, 4311743104, 4320130432, 4328521088, 4336909184, -4345295488, 4353687424, 4362073472, 4370458496, 4378852736, -4387238528, 4395630208, 4404019072, 4412407424, 4420790656, -4429182848, 4437571456, 4445962112, 4454344064, 4462738048, -4471119232, 4479516544, 4487904128, 4496289664, 4504682368, -4513068416, 4521459584, 4529846144, 4538232704, 4546619776, -4555010176, 4563402112, 4571790208, 4580174464, 4588567936, -4596957056, 4605344896, 4613734016, 4622119808, 4630511488, -4638898816, 4647287936, 4655675264, 4664065664, 4672451968, -4680842624, 4689231488, 4697620352, 4706007424, 4714397056, -4722786176, 4731173248, 4739562368, 4747951744, 4756340608, -4764727936, 4773114496, 4781504384, 4789894784, 4798283648, -4806667648, 4815059584, 4823449472, 4831835776, 4840226176, -4848612224, 4857003392, 4865391488, 4873780096, 4882169728, -4890557312, 4898946944, 4907333248, 4915722368, 4924110976, -4932499328, 4940889728, 4949276032, 4957666432, 4966054784, -4974438016, 4982831488, 4991221376, 4999607168, 5007998848, -5016386432, 5024763776, 5033164672, 5041544576, 5049941888, -5058329728, 5066717056, 5075107456, 5083494272, 5091883904, -5100273536, 5108662144, 5117048192, 5125436032, 5133827456, -5142215296, 5150605184, 5158993024, 5167382144, 5175769472, -5184157568, 5192543872, 5200936064, 5209324928, 5217711232, -5226102656, 5234490496, 5242877312, 5251263872, 5259654016, -5268040832, 5276434304, 5284819328, 5293209728, 5301598592, -5309986688, 5318374784, 5326764416, 5335151488, 5343542144, -5351929472, 5360319872, 5368706944, 5377096576, 5385484928, -5393871232, 5402263424, 5410650496, 5419040384, 5427426944, -5435816576, 5444205952, 5452594816, 5460981376, 5469367936, -5477760896, 5486148736, 5494536832, 5502925952, 5511315328, -5519703424, 5528089984, 5536481152, 5544869504, 5553256064, -5561645696, 5570032768, 5578423936, 5586811264, 5595193216, -5603585408, 5611972736, 5620366208, 5628750464, 5637143936, -5645528192, 5653921408, 5662310272, 5670694784, 5679082624, -5687474048, 5695864448, 5704251008, 5712641408, 5721030272, -5729416832, 5737806208, 5746194304, 5754583936, 5762969984, -5771358592, 5779748224, 5788137856, 5796527488, 5804911232, -5813300608, 5821692544, 5830082176, 5838468992, 5846855552, -5855247488, 5863636096, 5872024448, 5880411008, 5888799872, -5897186432, 5905576832, 5913966976, 5922352768, 5930744704, -5939132288, 5947522432, 5955911296, 5964299392, 5972688256, -5981074304, 5989465472, 5997851008, 6006241408, 6014627968, -6023015552, 6031408256, 6039796096, 6048185216, 6056574848, -6064963456, 6073351808, 6081736064, 6090128768, 6098517632, -6106906496, 6115289216, 6123680896, 6132070016, 6140459648, -6148849024, 6157237376, 6165624704, 6174009728, 6182403712, -6190792064, 6199176064, 6207569792, 6215952256, 6224345216, -6232732544, 6241124224, 6249510272, 6257899136, 6266287744, -6274676864, 6283065728, 6291454336, 6299843456, 6308232064, -6316620928, 6325006208, 6333395584, 6341784704, 6350174848, -6358562176, 6366951296, 6375337856, 6383729536, 6392119168, -6400504192, 6408895616, 6417283456, 6425673344, 6434059136, -6442444672, 6450837376, 6459223424, 6467613056, 6476004224, -6484393088, 6492781952, 6501170048, 6509555072, 6517947008, -6526336384, 6534725504, 6543112832, 6551500672, 6559888768, -6568278656, 6576662912, 6585055616, 6593443456, 6601834112, -6610219648, 6618610304, 6626999168, 6635385472, 6643777408, -6652164224, 6660552832, 6668941952, 6677330048, 6685719424, -6694107776, 6702493568, 6710882176, 6719274112, 6727662976, -6736052096, 6744437632, 6752825984, 6761213824, 6769604224, -6777993856, 6786383488, 6794770816, 6803158144, 6811549312, -6819937664, 6828326528, 6836706176, 6845101696, 6853491328, -6861880448, 6870269312, 6878655104, 6887046272, 6895433344, -6903822208, 6912212864, 6920596864, 6928988288, 6937377152, -6945764992, 6954149248, 6962544256, 6970928768, 6979317376, -6987709312, 6996093824, 7004487296, 7012875392, 7021258624, -7029652352, 7038038912, 7046427776, 7054818944, 7063207808, -7071595136, 7079980928, 7088372608, 7096759424, 7105149824, -7113536896, 7121928064, 7130315392, 7138699648, 7147092352, -7155479168, 7163865728, 7172249984, 7180648064, 7189036672, -7197424768, 7205810816, 7214196608, 7222589824, 7230975104, -7239367552, 7247755904, 7256145536, 7264533376, 7272921472, -7281308032, 7289694848, 7298088832, 7306471808, 7314864512, -7323253888, 7331643008, 7340029568, 7348419712, 7356808832, -7365196672, 7373585792, 7381973888, 7390362752, 7398750592, -7407138944, 7415528576, 7423915648, 7432302208, 7440690304, -7449080192, 7457472128, 7465860992, 7474249088, 7482635648, -7491023744, 7499412608, 7507803008, 7516192384, 7524579968, -7532967296, 7541358464, 7549745792, 7558134656, 7566524032, -7574912896, 7583300992, 7591690112, 7600075136, 7608466816, -7616854912, 7625244544, 7633629824, 7642020992, 7650410368, -7658794112, 7667187328, 7675574912, 7683961984, 7692349568, -7700739712, 7709130368, 7717519232, 7725905536, 7734295424, -7742683264, 7751069056, 7759457408, 7767849088, 7776238208, -7784626816, 7793014912, 7801405312, 7809792128, 7818179968, -7826571136, 7834957184, 7843347328, 7851732352, 7860124544, -7868512384, 7876902016, 7885287808, 7893679744, 7902067072, -7910455936, 7918844288, 7927230848, 7935622784, 7944009344, -7952400256, 7960786048, 7969176704, 7977565312, 7985953408, -7994339968, 8002730368, 8011119488, 8019508096, 8027896192, -8036285056, 8044674688, 8053062272, 8061448832, 8069838464, -8078227328, 8086616704, 8095006592, 8103393664, 8111783552, -8120171392, 8128560256, 8136949376, 8145336704, 8153726848, -8162114944, 8170503296, 8178891904, 8187280768, 8195669632, -8204058496, 8212444544, 8220834176, 8229222272, 8237612672, -8246000768, 8254389376, 8262775168, 8271167104, 8279553664, -8287944064, 8296333184, 8304715136, 8313108352, 8321497984, -8329885568, 8338274432, 8346663296, 8355052928, 8363441536, -8371828352, 8380217984, 8388606592, 8396996224, 8405384576, -8413772672, 8422161536, 8430549376, 8438939008, 8447326592, -8455715456, 8464104832, 8472492928, 8480882048, 8489270656, -8497659776, 8506045312, 8514434944, 8522823808, 8531208832, -8539602304, 8547990656, 8556378752, 8564768384, 8573154176, -8581542784, 8589933952, 8598322816, 8606705024, 8615099264, -8623487872, 8631876992, 8640264064, 8648653952, 8657040256, -8665430656, 8673820544, 8682209152, 8690592128, 8698977152, -8707374464, 8715763328, 8724151424, 8732540032, 8740928384, -8749315712, 8757704576, 8766089344, 8774480768, 8782871936, -8791260032, 8799645824, 8808034432, 8816426368, 8824812928, -8833199488, 8841591424, 8849976448, 8858366336, 8866757248, -8875147136, 8883532928, 8891923328, 8900306816, 8908700288, -8917088384, 8925478784, 8933867392, 8942250368, 8950644608, -8959032704, 8967420544, 8975809664, 8984197504, 8992584064, -9000976256, 9009362048, 9017752448, 9026141312, 9034530688, -9042917504, 9051307904, 9059694208, 9068084864, 9076471424, -9084861824, 9093250688, 9101638528, 9110027648, 9118416512, -9126803584, 9135188096, 9143581312, 9151969664, 9160356224, -9168747136, 9177134464, 9185525632, 9193910144, 9202302848, -9210690688, 9219079552, 9227465344, 9235854464, 9244244864, -9252633472, 9261021824, 9269411456, 9277799296, 9286188928, -9294574208, 9302965888, 9311351936, 9319740032, 9328131968, -9336516736, 9344907392, 9353296768, 9361685888, 9370074752, -9378463616, 9386849408, 9395239808, 9403629184, 9412016512, -9420405376, 9428795008, 9437181568, 9445570688, 9453960832, -9462346624, 9470738048, 9479121536, 9487515008, 9495903616, -9504289664, 9512678528, 9521067904, 9529456256, 9537843584, -9546233728, 9554621312, 9563011456, 9571398784, 9579788672, -9588178304, 9596567168, 9604954496, 9613343104, 9621732992, -9630121856, 9638508416, 9646898816, 9655283584, 9663675776, -9672061312, 9680449664, 9688840064, 9697230464, 9705617536, -9714003584, 9722393984, 9730772608, 9739172224, 9747561088, -9755945344, 9764338816, 9772726144, 9781116544, 9789503872, -9797892992, 9806282624, 9814670464, 9823056512, 9831439232, -9839833984, 9848224384, 9856613504, 9865000576, 9873391232, -9881772416, 9890162816, 9898556288, 9906940544, 9915333248, -9923721088, 9932108672, 9940496512, 9948888448, 9957276544, -9965666176, 9974048384, 9982441088, 9990830464, 9999219584, -10007602816, 10015996544, 10024385152, 10032774016, 10041163648, -10049548928, 10057940096, 10066329472, 10074717824, 10083105152, -10091495296, 10099878784, 10108272256, 10116660608, 10125049216, -10133437312, 10141825664, 10150213504, 10158601088, 10166991232, -10175378816, 10183766144, 10192157312, 10200545408, 10208935552, -10217322112, 10225712768, 10234099328, 10242489472, 10250876032, -10259264896, 10267656064, 10276042624, 10284429184, 10292820352, -10301209472, 10309598848, 10317987712, 10326375296, 10334763392, -10343153536, 10351541632, 10359930752, 10368318592, 10376707456, -10385096576, 10393484672, 10401867136, 10410262144, 10418647424, -10427039104, 10435425664, 10443810176, 10452203648, 10460589952, -10468982144, 10477369472, 10485759104, 10494147712, 10502533504, -10510923392, 10519313536, 10527702656, 10536091264, 10544478592, -10552867712, 10561255808, 10569642368, 10578032768, 10586423168, -10594805632, 10603200128, 10611588992, 10619976064, 10628361344, -10636754048, 10645143424, 10653531776, 10661920384, 10670307968, -10678696832, 10687086464, 10695475072, 10703863168, 10712246144, -10720639616, 10729026688, 10737414784, 10745806208, 10754190976, -10762581376, 10770971264, 10779356288, 10787747456, 10796135552, -10804525184, 10812915584, 10821301888, 10829692288, 10838078336, -10846469248, 10854858368, 10863247232, 10871631488, 10880023424, -10888412032, 10896799616, 10905188992, 10913574016, 10921964672, -10930352768, 10938742912, 10947132544, 10955518592, 10963909504, -10972298368, 10980687488, 10989074816, 10997462912, 11005851776, -11014241152, 11022627712, 11031017344, 11039403904, 11047793024, -11056184704, 11064570752, 11072960896, 11081343872, 11089737856, -11098128256, 11106514816, 11114904448, 11123293568, 11131680128, -11140065152, 11148458368, 11156845696, 11165236864, 11173624192, -11182013824, 11190402688, 11198790784, 11207179136, 11215568768, -11223957376, 11232345728, 11240734592, 11249122688, 11257511296, -11265899648, 11274285952, 11282675584, 11291065472, 11299452544, -11307842432, 11316231296, 11324616832, 11333009024, 11341395584, -11349782656, 11358172288, 11366560384, 11374950016, 11383339648, -11391721856, 11400117376, 11408504192, 11416893568, 11425283456, -11433671552, 11442061184, 11450444672, 11458837888, 11467226752, -11475611776, 11484003968, 11492392064, 11500780672, 11509169024, -11517550976, 11525944448, 11534335616, 11542724224, 11551111808, -11559500672, 11567890304, 11576277376, 11584667008, 11593056128, -11601443456, 11609830016, 11618221952, 11626607488, 11634995072, -11643387776, 11651775104, 11660161664, 11668552576, 11676940928, -11685330304, 11693718656, 11702106496, 11710496128, 11718882688, -11727273088, 11735660416, 11744050048, 11752437376, 11760824704, -11769216128, 11777604736, 11785991296, 11794381952, 11802770048, -11811157888, 11819548544, 11827932544, 11836324736, 11844713344, -11853100928, 11861486464, 11869879936, 11878268032, 11886656896, -11895044992, 11903433088, 11911822976, 11920210816, 11928600448, -11936987264, 11945375872, 11953761152, 11962151296, 11970543488, -11978928512, 11987320448, 11995708288, 12004095104, 12012486272, -12020875136, 12029255552, 12037652096, 12046039168, 12054429568, -12062813824, 12071206528, 12079594624, 12087983744, 12096371072, -12104759936, 12113147264, 12121534592, 12129924992, 12138314624, -12146703232, 12155091584, 12163481216, 12171864704, 12180255872, -12188643968, 12197034112, 12205424512, 12213811328, 12222199424, -12230590336, 12238977664, 12247365248, 12255755392, 12264143488, -12272531584, 12280920448, 12289309568, 12297694592, 12306086528, -12314475392, 12322865024, 12331253632, 12339640448, 12348029312, -12356418944, 12364805248, 12373196672, 12381580928, 12389969024, -12398357632, 12406750592, 12415138432, 12423527552, 12431916416, -12440304512, 12448692352, 12457081216, 12465467776, 12473859968, -12482245504, 12490636672, 12499025536, 12507411584, 12515801728, -12524190592, 12532577152, 12540966272, 12549354368, 12557743232, -12566129536, 12574523264, 12582911872, 12591299456, 12599688064, -12608074624, 12616463488, 12624845696, 12633239936, 12641631616, -12650019968, 12658407296, 12666795136, 12675183232, 12683574656, -12691960192, 12700350592, 12708740224, 12717128576, 12725515904, -12733906816, 12742295168, 12750680192, 12759071872, 12767460736, -12775848832, 12784236928, 12792626816, 12801014656, 12809404288, -12817789312, 12826181504, 12834568832, 12842954624, 12851345792, -12859732352, 12868122496, 12876512128, 12884901248, 12893289088, -12901672832, 12910067584, 12918455168, 12926842496, 12935232896, -12943620736, 12952009856, 12960396928, 12968786816, 12977176192, -12985563776, 12993951104, 13002341504, 13010730368, 13019115392, -13027506304, 13035895168, 13044272512, 13052673152, 13061062528, -13069446272, 13077838976, 13086227072, 13094613632, 13103000192, -13111393664, 13119782528, 13128157568, 13136559232, 13144945024, -13153329536, 13161724288, 13170111872, 13178502784, 13186884736, -13195279744, 13203667072, 13212057472, 13220445824, 13228832128, -13237221248, 13245610624, 13254000512, 13262388352, 13270777472, -13279166336, 13287553408, 13295943296, 13304331904, 13312719488, -13321108096, 13329494656, 13337885824, 13346274944, 13354663808, -13363051136, 13371439232, 13379825024, 13388210816, 13396605056, -13404995456, 13413380224, 13421771392, 13430159744, 13438546048, -13446937216, 13455326848, 13463708288, 13472103808, 13480492672, -13488875648, 13497269888, 13505657728, 13514045312, 13522435712, -13530824576, 13539210112, 13547599232, 13555989376, 13564379008, -13572766336, 13581154432, 13589544832, 13597932928, 13606320512, -13614710656, 13623097472, 13631477632, 13639874944, 13648264064, -13656652928, 13665041792, 13673430656, 13681818496, 13690207616, -13698595712, 13706982272, 13715373184, 13723762048, 13732150144, -13740536704, 13748926592, 13757316224, 13765700992, 13774090112, -13782477952, 13790869376, 13799259008, 13807647872, 13816036736, -13824425344, 13832814208, 13841202304, 13849591424, 13857978752, -13866368896, 13874754688, 13883145344, 13891533184, 13899919232, -13908311168, 13916692096, 13925085056, 13933473152, 13941866368, -13950253696, 13958643584, 13967032192, 13975417216, 13983807616, -13992197504, 14000582272, 14008973696, 14017363072, 14025752192, -14034137984, 14042528384, 14050918016, 14059301504, 14067691648, -14076083584, 14084470144, 14092852352, 14101249664, 14109635968, -14118024832, 14126407552, 14134804352, 14143188608, 14151577984, -14159968384, 14168357248, 14176741504, 14185127296, 14193521024, -14201911424, 14210301824, 14218685056, 14227067264, 14235467392, -14243855488, 14252243072, 14260630144, 14269021568, 14277409408, -14285799296, 14294187904, 14302571392, 14310961792, 14319353728, -14327738752, 14336130944, 14344518784, 14352906368, 14361296512, -14369685376, 14378071424, 14386462592, 14394848128, 14403230848, -14411627392, 14420013952, 14428402304, 14436793472, 14445181568, -14453569664, 14461959808, 14470347904, 14478737024, 14487122816, -14495511424, 14503901824, 14512291712, 14520677504, 14529064832, -14537456768, 14545845632, 14554234496, 14562618496, 14571011456, -14579398784, 14587789184, 14596172672, 14604564608, 14612953984, -14621341312, 14629724288, 14638120832, 14646503296, 14654897536, -14663284864, 14671675264, 14680061056, 14688447616, 14696835968, -14705228416, 14713616768, 14722003328, 14730392192, 14738784128, -14747172736, 14755561088, 14763947648, 14772336512, 14780725376, -14789110144, 14797499776, 14805892736, 14814276992, 14822670208, -14831056256, 14839444352, 14847836032, 14856222848, 14864612992, -14872997504, 14881388672, 14889775744, 14898165376, 14906553472, -14914944896, 14923329664, 14931721856, 14940109696, 14948497024, -14956887424, 14965276544, 14973663616, 14982053248, 14990439808, -14998830976, 15007216768, 15015605888, 15023995264, 15032385152, -15040768384, 15049154944, 15057549184, 15065939072, 15074328448, -15082715008, 15091104128, 15099493504, 15107879296, 15116269184, -15124659584, 15133042304, 15141431936, 15149824384, 15158214272, -15166602368, 15174991232, 15183378304, 15191760512, 15200154496, -15208542592, 15216931712, 15225323392, 15233708416, 15242098048, -15250489216, 15258875264, 15267265408, 15275654528, 15284043136, -15292431488, 15300819584, 15309208192, 15317596544, 15325986176, -15334374784, 15342763648, 15351151744, 15359540608, 15367929728, -15376318336, 15384706432, 15393092992, 15401481856, 15409869952, -15418258816, 15426649984, 15435037568, 15443425664, 15451815296, -15460203392, 15468589184, 15476979328, 15485369216, 15493755776, -15502146944, 15510534272, 15518924416, 15527311232, 15535699072, -15544089472, 15552478336, 15560866688, 15569254528, 15577642624, -15586031488, 15594419072, 15602809472, 15611199104, 15619586432, -15627975296, 15636364928, 15644753792, 15653141888, 15661529216, -15669918848, 15678305152, 15686696576, 15695083136, 15703474048, -15711861632, 15720251264, 15728636288, 15737027456, 15745417088, -15753804928, 15762194048, 15770582656, 15778971008, 15787358336, -15795747712, 15804132224, 15812523392, 15820909696, 15829300096, -15837691264, 15846071936, 15854466944, 15862855808, 15871244672, -15879634816, 15888020608, 15896409728, 15904799104, 15913185152, -15921577088, 15929966464, 15938354816, 15946743424, 15955129472, -15963519872, 15971907968, 15980296064, 15988684928, 15997073024, -16005460864, 16013851264, 16022241152, 16030629248, 16039012736, -16047406976, 16055794816, 16064181376, 16072571264, 16080957824, -16089346688, 16097737856, 16106125184, 16114514816, 16122904192, -16131292544, 16139678848, 16148066944, 16156453504, 16164839552, -16173236096, 16181623424, 16190012032, 16198401152, 16206790528, -16215177344, 16223567744, 16231956352, 16240344704, 16248731008, -16257117824, 16265504384, 16273898624, 16282281856, 16290668672, -16299064192, 16307449216, 16315842176, 16324230016, 16332613504, -16341006464, 16349394304, 16357783168, 16366172288, 16374561664, -16382951296, 16391337856, 16399726208, 16408116352, 16416505472, -16424892032, 16433282176, 16441668224, 16450058624, 16458448768, -16466836864, 16475224448, 16483613056, 16492001408, 16500391808, -16508779648, 16517166976, 16525555328, 16533944192, 16542330752, -16550719616, 16559110528, 16567497088, 16575888512, 16584274816, -16592665472, 16601051008, 16609442944, 16617832064, 16626218624, -16634607488, 16642996096, 16651385728, 16659773824, 16668163712, -16676552576, 16684938112, 16693328768, 16701718144, 16710095488, -16718492288, 16726883968, 16735272832, 16743661184, 16752049792, -16760436608, 16768827008, 16777214336, 16785599104, 16793992832, -16802381696, 16810768768, 16819151744, 16827542656, 16835934848, -16844323712, 16852711552, 16861101952, 16869489536, 16877876864, -16886265728, 16894653056, 16903044736, 16911431296, 16919821696, -16928207488, 16936592768, 16944987776, 16953375616, 16961763968, -16970152832, 16978540928, 16986929536, 16995319168, 17003704448, -17012096896, 17020481152, 17028870784, 17037262208, 17045649536, -17054039936, 17062426496, 17070814336, 17079205504, 17087592064, -17095978112, 17104369024, 17112759424, 17121147776, 17129536384, -17137926016, 17146314368, 17154700928, 17163089792, 17171480192, -17179864192, 17188256896, 17196644992, 17205033856, 17213423488, -17221811072, 17230198912, 17238588032, 17246976896, 17255360384, -17263754624, 17272143232, 17280530048, 17288918912, 17297309312, -17305696384, 17314085504, 17322475136, 17330863744, 17339252096, -17347640192, 17356026496, 17364413824, 17372796544, 17381190016, -17389583488, 17397972608, 17406360704, 17414748544, 17423135872, -17431527296, 17439915904, 17448303232, 17456691584, 17465081728, -17473468288, 17481857408, 17490247552, 17498635904, 17507022464, -17515409024, 17523801728, 17532189824, 17540577664, 17548966016, -17557353344, 17565741184, 17574131584, 17582519168, 17590907008, -17599296128, 17607687808, 17616076672, 17624455808, 17632852352, -17641238656, 17649630848, 17658018944, 17666403968, 17674794112, -17683178368, 17691573376, 17699962496, 17708350592, 17716739968, -17725126528, 17733517184, 17741898112, 17750293888, 17758673024, -17767070336, 17775458432, 17783848832, 17792236928, 17800625536, -17809012352, 17817402752, 17825785984, 17834178944, 17842563968, -17850955648, 17859344512, 17867732864, 17876119424, 17884511872, -17892900224, 17901287296, 17909677696, 17918058112, 17926451072, -17934843776, 17943230848, 17951609216, 17960008576, 17968397696, -17976784256, 17985175424, 17993564032, 18001952128, 18010339712, -18018728576, 18027116672, 18035503232, 18043894144, 18052283264, -18060672128, 18069056384, 18077449856, 18085837184, 18094225792, -18102613376, 18111004544, 18119388544, 18127781248, 18136170368, -18144558976, 18152947328, 18161336192, 18169724288, 18178108544, -18186498944, 18194886784, 18203275648, 18211666048, 18220048768, -18228444544, 18236833408, 18245220736] - -cache_sizes = [ -16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, -17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, -18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, -19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, -20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, -21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, -22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, -23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, -24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, -25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, -25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, -26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, -27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, -28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, -29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, -30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, -31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, -32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, -33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, -34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, -35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, -36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, -36961984, 37093312, 37223488, 37355072, 37486528, 37617472, 37747904, -37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, -38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, -39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, -40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, -41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, -42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, -43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, -44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, -45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, -46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, -47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, -47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, -48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, -49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, -50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, -51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, -52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, -53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, -54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, -55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, -56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, -57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, -58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, -58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, -59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, -60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, -61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, -62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, -63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, -64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, -65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, -66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, -67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, -68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, -69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, -69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, -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] -``` diff --git a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md b/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md deleted file mode 100644 index 23840628cc6..00000000000 --- a/public/content/translations/zh/developers/docs/consensus-mechanisms/pow/mining-algorithms/index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: 挖矿算法 -description: 以太坊挖矿所用的算法的详细介绍 -lang: zh ---- - - -工作量证明不再是以太坊共识机制的基础,这意味着挖矿已终结。 取而代之的是,以太坊将由质押了以太币的验证者保护。 你可以立即开始质押以太币。 详细了解合并权益证明质押。 此页面仅为满足对历史的兴趣。 - - -以太坊挖矿使用过一种称为 Ethash 的算法。 该算法的基本思想是,矿工尝试使用蛮力计算找到一个随机数输入,使得生成的哈希小于一个取决于计算难度的阈值。 此难度级别可以动态调整,从而允许定期进行区块生产。 - -## 前提条件 {#prerequisites} - -为了更好地理解本页内容,推荐您先阅读[工作量证明共识](/developers/docs/consensus-mechanisms/pow)和[挖矿](/developers/docs/consensus-mechanisms/pow/mining)。 - -## Dagger Hashimoto {#dagger-hashimoto} - -Dagger Hashimoto 是以太坊挖矿的先导研究算法,现已被 Ethash 取代。 它是两种不同算法:Dagger 和 Hashimoto 的融合。 它只是一个研究实现,并在以太坊主网启动时被 Ethash 取代。 - -[Dagger](http://www.hashcash.org/papers/dagger.html) 会生成一个[有向无环图](https://en.wikipedia.org/wiki/Directed_acyclic_graph),将共同取哈希值的内容随机划分。 其核心原理是,每个随机数只取总数据树的一小部分。 挖矿禁止为每个随机数重新计算子树,因此需要总存储树,但若为验证某个随机数的价值,则可以重新计算。 Dagger 的设计目的是替代诸如 Scrypt 的已有算法。后者是“内存困难算法”,但当它们的内存困难程度增加到可信的安全水平时将很难验证。 然而,Dagger 容易受到共享内存硬件加速的影响,因此我们放弃了这种算法,转而采用了其他研究途径。 - -[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) 算法通过实现输入/输出密集的特性(即,内存读取速度是挖矿过程中的限制因素)来增加对专用集成电路的抵抗性。 理论上来说使用内存比使用计算能力更容易;已有价值数十亿美元的经费投入被用于研究针对不同应用场景的内存优化,通常涉及近随机访问模式(即“随机存取存储器”)。 因此,现有的内存对评价算法效率的能力更接近最优。 Hashimoto 使用区块链作为数据源,同时满足上述第 (1) 和第 (3) 条。 - -Dagger-Hashimoto 是在 Dagger 和 Hashimoto 的基础上改进而来的以太币挖矿算法。 Dagger Hashimoto 和 Hashimoto 的差别在于,Dagger Hashimoto 的数据来源并非是区块链,而是自定义生成的数据集,这些数据集将基于所有 N 区块上的区块数据进行更新。 这些数据集采用 Dagger 算法生成,可为轻量级客户端的验证算法高效计算特定于每个随机数的子集。 Dagger Hashimoto 算法和 Dagger 算法的差别在于,与原来的 Dagger 不同,用于查询区块的数据集只是暂时的,只会偶尔更新(例如每周更新一次)。 这意味着生成数据集的工作量接近于零,所以 Sergio Lerner 关于共享内存加速的论据变得微不足道。 - -详细了解 [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining-algorithms/dagger-hashimoto)。 - -## Ethash {#ethash} - -Ethash 是在现已弃用的工作量证明架构下,实际用于真正的以太坊主网的挖矿算法。 Ethash 实际上是为 Dagger Hashimoto 算法进行重要更新后的一个特殊版本命名的新名称,但它仍然继承了其前身的基本原理。 以太坊主网只使用过 Ethash - Dagger Hashimoto 是挖矿算法的研发版本,在以太坊主网上开始挖矿之前被取代。 - -[详细了解 Ethash](/developers/docs/consensus-mechanisms/pow/mining-algorithms/ethash)。 - -## 延伸阅读 {#further-reading} - -_还有哪些社区资源对您有所帮助? 请编辑本页面并添加!_ From 3c17ce5db5dac4ca54411f4d8a34e8e896f27cac Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 26 Feb 2024 12:23:44 +0000 Subject: [PATCH 462/478] Remove unused tutorials and fix broken links/urls --- .../index.md | 0 .../docs/nodes-and-clients/index.md | 3 - .../nodes-and-clients/run-a-node/index.md | 2 +- .../index.md | 110 --------- .../tutorials/send-token-etherjs/index.md | 212 ------------------ .../docs/nodes-and-clients/index.md | 1 - .../developers/docs/standards/tokens/index.md | 2 +- .../docs/nodes-and-clients/index.md | 3 - .../nodes-and-clients/run-a-node/index.md | 2 +- .../tutorials/run-light-node-geth/index.md | 104 --------- .../tutorials/run-light-node-geth/index.md | 104 --------- .../sending-tokens-using-ethersjs/index.md | 212 ------------------ .../tutorials/send-token-etherjs/index.md | 212 ------------------ .../docs/nodes-and-clients/index.md | 1 - .../developers/docs/standards/tokens/index.md | 2 +- .../tutorials/run-light-node-geth/index.md | 167 -------------- .../index.md | 0 .../docs/nodes-and-clients/index.md | 3 - .../nodes-and-clients/run-a-node/index.md | 2 +- .../tutorials/run-light-node-geth/index.md | 104 --------- .../docs/nodes-and-clients/index.md | 3 - .../nodes-and-clients/run-a-node/index.md | 2 +- .../tutorials/run-light-node-geth/index.md | 104 --------- .../tutorials/run-light-node-geth/index.md | 104 --------- 24 files changed, 6 insertions(+), 1453 deletions(-) rename public/content/translations/es/developers/tutorials/{send-token-etherjs => send-token-ethersjs}/index.md (100%) delete mode 100644 public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md delete mode 100644 public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md delete mode 100644 public/content/translations/id/developers/tutorials/run-light-node-geth/index.md delete mode 100644 public/content/translations/it/developers/tutorials/run-light-node-geth/index.md delete mode 100644 public/content/translations/it/developers/tutorials/sending-tokens-using-ethersjs/index.md delete mode 100644 public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md delete mode 100644 public/content/translations/pl/developers/tutorials/run-light-node-geth/index.md rename public/content/translations/pt-br/developers/tutorials/{send-token-etherjs => send-token-ethersjs}/index.md (100%) delete mode 100644 public/content/translations/ro/developers/tutorials/run-light-node-geth/index.md delete mode 100644 public/content/translations/tr/developers/tutorials/run-light-node-geth/index.md delete mode 100644 public/content/translations/zh/developers/tutorials/run-light-node-geth/index.md diff --git a/public/content/translations/es/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/es/developers/tutorials/send-token-ethersjs/index.md similarity index 100% rename from public/content/translations/es/developers/tutorials/send-token-etherjs/index.md rename to public/content/translations/es/developers/tutorials/send-token-ethersjs/index.md diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/index.md index cef246b9782..04ecebd6da6 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/index.md @@ -233,8 +233,6 @@ Erigon که قبلاً به عنوان Erigon شناخته می‌شد، یک ف `geth --syncmode "light"` -برای جزئیات بیشتر آموزش [اجرای گره‌ی سبک geth](/developers/tutorials/run-light-node-geth/) را مشاهده کنید. - **تنظیم همگام‌سازی کامل با آرشیو در [Besu](https://besu.hyperledger.org/)** `besu --sync-mode=FULL` @@ -312,5 +310,4 @@ Erigon که قبلاً به عنوان Erigon شناخته می‌شد، یک ف ## آموزش‌های مرتبط {#related-tutorials} -- [اجرای یک گره با geth](/developers/tutorials/run-light-node-geth/) _- چگونه geth را بارگیری، نصب و اجرا کنیم. Covering syncmodes, the JavaScript console, and more._ - [Raspberry Pi 4 خود را فقط با اتصال کارت MicroSD به یک گره‌ی اعتبارسنج تبدیل کنید - راهنمای نصب](/developers/tutorials/run-node-raspberry-pi/) _- Raspberry Pi 4 خود را متصل کنید، یک کابل اترنت وصل کنید، دیسک SSD را وصل کنید و دستگاه را روشن کنید تا Raspberry Pi 4 را به یک گره‌ی کامل اتریوم که لایه‌ی اجرا (شبکه‌ی اصلی) و / یا لایه‌ی اجماع (زنجیره‌ی بیکن / اعتبارسنج) را اجرا می‌کند تبدیل کنید._ diff --git a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md index c983032e2c3..a39b8e4a4c5 100644 --- a/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/fa/developers/docs/nodes-and-clients/run-a-node/index.md @@ -88,7 +88,7 @@ If you're new to the topic of running a node, or looking for a less technical pa - زمان و تاریخ سیستم درست است. - روتر و فایروال شما اتصالات را در پورت‌های شنونده (listening ports) می‌پذیرند. به طور پیش‌فرض کلاینت‌های اتریوم از یک پورت شنونده (TCP) و یک پورت یابنده (UDP) که هر دو به‌طور پیش‌فرض روی 30303 هستند استفاده می‌کنند. -کلاینت خود را ابتدا روی شبکه‌ی تست اجرا کنید تا مطمئن شوید که همه‌‌چیز به‌درستی کار می‌کند. [اجرای یک گره سبک geth‏](/developers/tutorials/run-light-node-geth/) باید کارگشا باشد. شما باید هرگونه تنظیمات کلاینت که به صورت پیش‌‌فرض وجود ندارند را در ابتدا مشخص کنید. می‌توانید از پرچم‌ها و فایل‌های پیکربندی برای مشخص کردن پیکربندی موردنظر استفاده کنید. برای اطلاع از جزئیات، مستندات کلاینت خود را بررسی کنید. اجرای کلاینت، توابع اصلی، نقاط پایانی انتخاب شده و جستجوی همتایان را آغاز می‌کند. پس از یافتن موفق همتایان، کلاینت شروع به همگام‌سازی می‌کند. داده‌ی کنونی زنجیره‌ی بلوکی زمانی آماده خواهد بود که کلاینت به‌طور موفقیت‌آمیز با وضعیت فعلی همگام‌سازی کرده باشد. +کلاینت خود را ابتدا روی شبکه‌ی تست اجرا کنید تا مطمئن شوید که همه‌‌چیز به‌درستی کار می‌کند. اجرای یک گره سبک geth‏ باید کارگشا باشد. شما باید هرگونه تنظیمات کلاینت که به صورت پیش‌‌فرض وجود ندارند را در ابتدا مشخص کنید. می‌توانید از پرچم‌ها و فایل‌های پیکربندی برای مشخص کردن پیکربندی موردنظر استفاده کنید. برای اطلاع از جزئیات، مستندات کلاینت خود را بررسی کنید. اجرای کلاینت، توابع اصلی، نقاط پایانی انتخاب شده و جستجوی همتایان را آغاز می‌کند. پس از یافتن موفق همتایان، کلاینت شروع به همگام‌سازی می‌کند. داده‌ی کنونی زنجیره‌ی بلوکی زمانی آماده خواهد بود که کلاینت به‌طور موفقیت‌آمیز با وضعیت فعلی همگام‌سازی کرده باشد. ### استفاده از کلاینت {#using-the-client} diff --git a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md b/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md deleted file mode 100644 index b756c45d627..00000000000 --- a/public/content/translations/fr/developers/tutorials/kickstart-your-dapp-frontend-development-wth-create-eth-app/index.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Démarrer le développement de votre interface dApp avec create-eth-app -description: Aperçu de l'utilisation de create-eth-app et de ses fonctionnalités -author: "Markus Waas" -tags: - - "create-eth-app" - - "frontend" - - "javascript" - - "ethers.js" - - "the graph" - - "DeFi" -skill: beginner -lang: fr -published: 2020-04-27 -source: soliditydeveloper.com -sourceUrl: https://soliditydeveloper.com/create-eth-app ---- - -La dernière fois nous nous sommes intéressés à [Solidity](https://soliditydeveloper.com/solidity-overview-2020) et avons mentionné [create-eth-app](https://github.com/PaulRBerg/create-eth-app). Vous allez maintenant découvrir comment l'utiliser, quelles fonctionnalités y sont intégrées et comment l'étendre encore. Initiée par Paul Razvan Berg, fondateur de [Sablier](http://sablier.com/), cette application livrée avec plusieurs intégrations facultatives au choix va vous permettre de débuter le développement de votre interface. - -## Installation {#installation} - -L'installation nécessite au minimum Yarn 0.25 (`npm install yarn --global`). L'installation est aussi simple que l'exécution : - -```bash -yarn create eth-app my-eth-app -cd my-eth-app -yarn react-app:start -``` - -Elle s'appuie sur [create-react-app](https://github.com/facebook/create-react-app). Pour voir votre application, ouvrez `http://localhost:3000/`. Lorsque vous êtes prêt à déployer en production, créez un paquet minifié avec le constructeur yarn. Un moyen simple de l'héberger est [Netlify](https://www.netlify.com/). Vous pouvez créer un dépôt GitHub, l'ajouter à Netlify, configurer la commande de construction et le tour est joué ! Votre application sera hébergée et utilisable par tout le monde. Et tout ceci gratuitement. - -## Fonctionnalités {#features} - -### React & create-react-app {#react--create-react-app} - -Premièrement, le coeur de l'application : React et toutes les fonctionnalités additionnelles livrées avec _create-react-app_. Utiliser cette seule application est une excellente option si vous ne souhaitez pas intégrer Ethereum. [React](https://reactjs.org/) rend la construction d'interfaces utilisateur interactives très facile. La prise en main n'est peut-être pas aussi facile qu'avec [Vue](https://vuejs.org/), mais l'application est encore largement utilisée, possède plus de fonctionnalités et surtout offre un choix de plusieurs milliers de bibliothèques supplémentaires. Avec _create-react-app_, le démarrage est très simple. L'application inclut : - -- React, JSX, ES6, TypeScript et le support pour Flow syntax. -- Langages complémentaires à ES6 comme l'opérateur de propagation d'objet. -- CSS auto-préfixé, pour se passer de -webkit- ou d'autres préfixes. -- Un exécuteur de test unitaire interactif rapide avec une prise en charge intégrée pour les rapports de couverture. -- Un serveur de développement en direct qui signale les erreurs courantes. -- Un script de construction pour associer du JS, du CSS et des images en vue de la mise en production, avec des hachages et une cartographie du code source. - -_create-react-app_, en particulier, fait usage des nouveaux [effets hooks](https://reactjs.org/docs/hooks-effect.html). Une méthode pour écrire de puissants mais très petits composants, dits fonctionnels. Voir ci-dessous la section sur Apollo pour savoir comment ils sont utilisés dans _create-react-app_. - -### Espaces de travail Yarn {#yarn-workspaces} - -[Les espaces de travail Yarn](https://classic.yarnpkg.com/en/docs/workspaces/) vous permettent de disposer de plusieurs paquets, mais également d'être en mesure de tous les gérer à partir du dossier racine et d'installer toutes leurs dépendances en une fois en utilisant `yarn install`. Ceci est particulièrement adapté pour les petits packs additionnels, tels que les adresses de contrats intelligents/la gestion ABI (les informations sur l'endroit où vous avez déployé tels contrats intelligents et comment communiquer avec eux) ou l'intégration de graphes, les deux parties de `create-eth-app`. - -### ethers.js {#ethersjs} - -Si [Web3](https://docs.web3js.org/) est encore largement utilisé, [ethers.js](https://docs.ethers.io/) a davantage été employé comme alternative l'année dernière et est intégré à _create-eth-app_. Vous pouvez travailler avec celui-ci, le faire évoluer vers Web3 ou envisager une mise à niveau pour passer à [ethers.js v5](https://docs-beta.ethers.io/) qui n'est pratiquement plus en version bêta. - -### Le réseau Graph {#the-graph} - -[GraphQL](https://graphql.org/) est un moyen alternatif de gérer les données par rapport à une [API Restful](https://restfulapi.net/). Il offre plusieurs avantages par rapport aux APIs REST, en particulier pour les données décentralisées de la blockchain. Si vous êtes intéressé par le raisonnement qui le sous-tend, jetez un œil à [GraphQL va propulser le Web décentralisé](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a). - -Vous récupérez normalement directement les données de votre contrat intelligent. Vous souhaitez connaître l'instant précis de la dernière transaction ? Appelez simplement `MyContract.methods.latestTradeTime().call()` qui récupère les données d'un nœud Ethereum comme Infura dans votre dApp. Mais que faire si vous avez besoin de centaines de points de données différents ? Il en résulterait des centaines d'extractions de données vers le nœud, nécessitant à chaque fois un [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) qui ralentirait votre dApp et lui ferait perdre son efficacité. Pour éviter cela, une solution pourrait être d'utiliser une fonction d'appel de récupération dans votre contrat qui restitue plusieurs données à la fois. Ce n'est cependant pas toujours idéal. - -Vous pourriez également être intéressé par les données historiques. Vous souhaitez peut-être connaître non seulement le moment de la dernière transaction mais également le moment de chacune des transactions que vous avez réalisées vous-même. Utilisez le paquet subgraph de _create-eth-app_, lisez la [documentation](https://thegraph.com/docs/define-a-subgraph) et adaptez-la à vos propres contrats. Si vous êtes à la recherche de contrats intelligents populaires, il se peut même qu'il en existe déjà un avec subgraph. Jetez un œil à [l'explorateur de sous-graphes](https://thegraph.com/explorer/). - -Une fois que vous disposez d'un subgraph, vous pouvez écrire une simple requête dans votre dApp afin de récupérer toutes les données importantes de la blockchain, y compris les données historiques dont vous avez besoin. Une seule demande de récupération suffit. - -### Apollo {#apollo} - -Grâce à l'intégration d'[Apollo Boost](https://www.apollographql.com/docs/react/get-started/), vous pouvez facilement intégrer Graph dans votre dApp React. Surtout lorsque vous utilisez [des hooks React et Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks-676d116eeae2), récupérer des données est aussi simple que d'écrire une requête GraphQl dans votre composant: - -```js -const { loading, error, data } = useQuery(myGraphQlQuery) - -React.useEffect(() => { - if (!loading && !error && data) { - console.log({ data }) - } -}, [loading, error, data]) -``` - -## Modèles (Templates) {#templates} - -En haut, il est possible de choisir parmi différents modèles. À ce jour, vous pouvez utiliser une intégration Aave, Compound, UniSwap ou Sablier. Ces modèles ajoutent tous des adresses importantes de contrats intelligents de service ainsi que des intégrations pré-construites de subgraph. Il suffit d'ajouter le modèle à la commande de création comme `yarn create eth-app my-eth-app --with-template aav`. - -### Aave {#aave} - -[Aave](https://aave.com/) est un marché décentralisé de prêt d'argent. Les déposants fournissent des liquidités au marché pour gagner un revenu passif, tandis que les emprunteurs peuvent emprunter avec des garanties. Une fonctionnalité exclusive d'Aave réside dans ces [prêts flash](https://docs.aave.com/developers/guides/flash-loans) qui vous permettent d'emprunter de l'argent sans aucune garantie, pour autant que vous remboursiez le prêt en une seule transaction. Cela peut être utile par exemple pour vous donner de l'argent supplémentaire sur l'arbitrage d'échange. - -Les jetons échangés qui vous rapportent des intérêts sont appelés _aTokens_. - -Si vous choisissez d'intégrer Aave avec _create-eth-app_, vous obtiendrez une [intégration subgraph](https://docs.aave.com/developers/getting-started/using-graphql). Aave utilise The Graph et vous fournit déjà plusieurs Subgraphs prêts à l'emploi sur [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) et [le réseau principal](https://thegraph.com/explorer/subgraph/aave/protocol) en formulaire [brut](https://thegraph.com/explorer/subgraph/aave/protocol-raw) ou [formaté](https://thegraph.com/explorer/subgraph/aave/protocol). - -![Aave Flash Loan meme - "Ouah, si je pouvais garder mon prêt flash plus longtemps qu'une transaction, ce serait génial" ;](./flashloan-meme.png) - -### Compound {#compound} - -[Compound](https://compound.finance/) est similaire à Aave. L'intégration inclut déjà le nouveau [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195). Les intérêts gagnés des jetons sont ici étonnamment appelés _cTokens_. - -### Uniswap {#uniswap} - -[Uniswap](https://uniswap.exchange/) est un système d'échange décentralisé (DEX). Les fournisseurs de liquidités peuvent percevoir des commissions en fournissant les jetons ou l'éther requis pour les deux parties d'une transaction. Le protocole est largement utilisé et dispose donc de liquidités très nombreuses pour une très large gamme de jetons. Vous pouvez facilement l'intégrer dans votre dApp pour permettre, par exemple, aux utilisateurs d'échanger leur ETH contre du DAI. - -Malheureusement, à l'heure où ces lignes sont écrites, l'intégration est uniquement proposée pour Uniswap v1 et non pour la toute nouvelle version [v2](https://uniswap.org/blog/uniswap-v2/). - -### Sablier {#sablier} - -[Sablier](https://sablier.com/) permet aux utilisateurs d'effectuer des paiements en continu. Au lieu d'un seul versement, vous recevez en fait votre argent en continu sans avoir rien d'autre à faire après la mise en place initiale. L'intégration inclut son [propre sous-graphe](https://thegraph.com/explorer/subgraph/sablierhq/sablier). - -## Et après ? {#whats-next} - -Si vous avez des questions sur _create-eth-app_, allez sur le [serveur de la Communauté Sablier](https://discord.gg/bsS8T47), où vous pouvez entrer en contact avec les auteurs de _create-eth-app_. Dans un premier temps, vous pourriez vouloir intégrer un framework d'interface utilisateur comme [Material UI](https://material-ui.com/), écrire des requêtes GraphQL pour les données dont vous avez réellement besoin et configurer le déploiement. diff --git a/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md deleted file mode 100644 index 8352a365b03..00000000000 --- a/public/content/translations/fr/developers/tutorials/send-token-etherjs/index.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: Envoyer des jetons avec ethers.js -description: Guide à l'intention des débutants sur l'envoi de jetons à l'aide d'ether.js. -author: Kim YongJun -tags: - - "ETHERS.JS" - - "ERC-20" - - "JETONS" -skill: beginner -lang: fr -published: 2021-04-06 ---- - -## Envoyer un jeton avec ethers.js (5.0) {#send-token} - -### Dans ce tutoriel, vous allez apprendre à {#you-learn-about} - -- Importer ethers.js -- Transférer un jeton -- Définir le prix du gaz en fonction de l'état du trafic réseau - -### Pour commencer {#to-get-started} - -Pour commencer, nous devons d'abord importer la bibliothèque ethers.js dans notre JavaScript en intégrant ethers.js (5.0) - -### Installation {#install-ethersjs} - -```shell -/home/ricmoo> npm install --save ethers -``` - -ES6 dans le navigateur : - -```html - -``` - -ES3 (UMD) dans le navigateur : - -```html - -``` - -### Paramètres {#param} - -1. **`contract_address`** : l'adresse du contrat du jeton (l'adresse du contrat est nécessaire lorsque le jeton que vous voulez transférer n'est pas de l'ether) -2. **`send_token_amount`** : le montant que vous désirez envoyer au destinataire -3. **`to_address`** : l'adresse du destinataire -4. **`send_account`** : l'adresse de l'expéditeur -5. **`private_key`** : clé privée de l'expéditeur afin de signer la transaction et de transférer véritablement les jetons - -## Remarque {#notice} - -`signTransaction(tx)` est retiré car `sendTransaction()` le fait en interne. - -## Procédure d'envoi {#procedure} - -### 1. Se connecter au réseau (testnet) {#connect-to-network} - -#### Définir le fournisseur (Infura) {#set-provider} - -Se connecter au réseau de test Ropsten - -```javascript -window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") -``` - -### 2. Créer un portefeuille {#create-wallet} - -```javascript -let wallet = new ethers.Wallet(private_key) -``` - -### 3. Connecter le portefeuille au réseau {#connect-wallet-to-net} - -```javascript -let walletSigner = wallet.connect(window.ethersProvider) -``` - -### 4. Obtenir le prix actuel du gaz {#get-gas} - -```javascript -window.ethersProvider.getGasPrice() // gasPrice -``` - -### 5. Définir la transaction {#define-transaction} - -Les variables définies ci-dessous sont dépendantes de `send_token()` - -### Paramètres de la transaction {#transaction-params} - -1. **`send_account`** : adresse de l'expéditeur du jeton -2. **`to_address`** : adresse du destinataire du jeton -3. **`send_token_amount`** : nombre de jetons à envoyer -4. **`gas_limit`** : limite de gaz -5. **`gas_price`** : prix du gaz - -[Voir ci-dessous pour savoir comment les utiliser](#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. Transférer {#transfer} - -```javascript -walletSigner.sendTransaction(tx).then((transaction) => { - console.dir(transaction) - alert("Send finished!") -}) -``` - -## Comment l’utiliser  {#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 -) -``` - -### Réussi ! {#success} - -![image de la transaction effectuée avec succès](./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) { - // general token send - let contract = new ethers.Contract( - contract_address, - send_abi, - walletSigner - ) - - // How many tokens? - let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) - console.log(`numberOfTokens: ${numberOfTokens}`) - - // Send tokens - contract.transfer(to_address, numberOfTokens).then((transferResult) => { - console.dir(transferResult) - alert("sent token") - }) - } // ether send - 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("Send finished!") - }) - } catch (error) { - alert("failed to send!!") - } - } - }) -} -``` diff --git a/public/content/translations/hu/developers/docs/nodes-and-clients/index.md b/public/content/translations/hu/developers/docs/nodes-and-clients/index.md index 60aadc3bb34..17d93b81389 100644 --- a/public/content/translations/hu/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/hu/developers/docs/nodes-and-clients/index.md @@ -225,5 +225,4 @@ Az interneten rengeteg utasítás és információ található az Ethereum klien ## Kapcsolódó útmutatók {#related-tutorials} -- [Csomópont futtatása Geth-tel](/developers/tutorials/run-light-node-geth/) _– Hogyan lehet letölteni, telepíteni és futtatni a Geth-et. Lefedi a szinkronizációs módokat, a JavaScript konzolt és még sok mást._ - [Alakítsd át a Raspberry Pi 4-edet egy Eth 1.0 vagy egy Eth 2.0 csomóponttá csak a MicroSD kártya flashelésével - Telepítési útmutató](/developers/tutorials/run-node-raspberry-pi/) _– Flasheld a Raspberry Pi 4-et, csatlakoztass egy ethernet kábelt, csatlakoztasd az SSD-t, és kapcsold be az eszközt, hogy a Raspberry Pi 4 teljes Ethereum 1.0 vagy Ethereum 2.0 csomópontokká (beacon chain / validátor) váljon._ diff --git a/public/content/translations/hu/developers/docs/standards/tokens/index.md b/public/content/translations/hu/developers/docs/standards/tokens/index.md index 3b049014063..3d098c07e2d 100644 --- a/public/content/translations/hu/developers/docs/standards/tokens/index.md +++ b/public/content/translations/hu/developers/docs/standards/tokens/index.md @@ -29,5 +29,5 @@ _Ismersz olyan közösségi anyagot, amely segített neked? Módosítsd az oldal - [Token integrációs checklista](/developers/tutorials/token-integration-checklist/) _– Egy checklista, melyet figyelembe kell venni tokenekkel történő interakcióknál_ - [Az ERC20 token okosszerződés megértése](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Bevezetés az első okosszerződésed telepítésébe egy Ethereum teszt hálózaton._ -- [ERC20 tokenek átutalása és jóváhagyása egy Solidity okosszerződésből](/developers/tutorials/transfers-and-approval-of-erc20-tokens-from-a-solidity-smart-contract/) _– Egy okosszerződés használata token interakcióhoz a Solidity nyelv használatával._ +- [ERC20 tokenek átutalása és jóváhagyása egy Solidity okosszerződésből](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– Egy okosszerződés használata token interakcióhoz a Solidity nyelv használatával._ - [ERC721 piac implementáció [egy how-to segédleg]](/developers/tutorials/how-to-implement-an-erc721-market/) _– Hogyan lehet tokenizált tárgyakat eladásra kínálni egy decentralizált és titkosított felületen._ diff --git a/public/content/translations/id/developers/docs/nodes-and-clients/index.md b/public/content/translations/id/developers/docs/nodes-and-clients/index.md index 57e12dc6333..bccc501394c 100644 --- a/public/content/translations/id/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/id/developers/docs/nodes-and-clients/index.md @@ -231,8 +231,6 @@ Perhatikan dokumentasi klien atau halaman bantuan untuk menemukan mode sinkronis `geth --syncmode "light"` -Untuk detail lebih lanjut, lihat tutorialnya di [menjalankan node ringan Geth](/developers/tutorials/run-light-node-geth/). - **Menyiapkan sinkronisasi penuh dengan arsip di [Besu](https://besu.hyperledger.org/)** `besu --sync-mode=FULL` @@ -310,5 +308,4 @@ Ada banyak informasi tentang klien Ethereum di internet. Berikut adalah beberapa ## Tutorial terkait {#related-tutorials} -- [Menjalankan Node dengan Geth](/developers/tutorials/run-light-node-geth/) _– Cara mengunduh, menginstal, dan menjalankan Geth. Covering syncmodes, the JavaScript console, and more._ - [Ubah Raspberry Pi 4 Anda menjadi node validator cukup dengan mem-flash kartu MicroSD – Panduan instalasi](/developers/tutorials/run-node-raspberry-pi/) _– Flash Raspberry Pi 4, colokkan kabel ethernet, hubungkan SSD dan nyalakan perangkat untuk mengubah Raspberry Pi 4 menjadi node penuh Ethereum yang menjalankan lapisan eksekusi (Jaringan Utama) dan / atau lapisan konsensus (Rantai Suar / validator)._ diff --git a/public/content/translations/id/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/id/developers/docs/nodes-and-clients/run-a-node/index.md index 95d4d45c56e..cc2244be4c1 100644 --- a/public/content/translations/id/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/id/developers/docs/nodes-and-clients/run-a-node/index.md @@ -88,7 +88,7 @@ Sebelum memulai perangkat lunak klien Ethereum, lakukan pemeriksaan terakhir bah - Sistem memiliki waktu dan tanggal yang tepat. - Router dan firewall Anda menerima koneksi pada port pendengar. Secara default, klien Ethereum menggunakan port pendengar (TCP) dan port penemuan (UDP), keduanya pada 30303 secara default. -Jalankan klien Anda pada testnet terlebih dahulu untuk menolong memastikan semuanya bekerja dengan benar. [Menjalankan node ringan Geth](/developers/tutorials/run-light-node-geth/) seharusnya membantu. Anda perlu mendeklarasikan pengaturan klien mana pun yang bukan default pada awalnya. Anda dapat menggunakan bendera atau berkas konfigurasi untuk mendeklarasikan konfigurasi yang diinginkan. Lihat dokumentasi klien Anda untuk eksekusi Klien khusus yang akan memulai fungsi inti, titik akhir terpilihnya, dan mulai mencari peer. Setelah berhasil menemukan peer, klien memulai sinkronisasi. Data rantai blok saat ini akan tersedia setelah klien berhasil disinkronisasikan dengan state saat ini. +Jalankan klien Anda pada testnet terlebih dahulu untuk menolong memastikan semuanya bekerja dengan benar. Anda perlu mendeklarasikan pengaturan klien mana pun yang bukan default pada awalnya. Anda dapat menggunakan bendera atau berkas konfigurasi untuk mendeklarasikan konfigurasi yang diinginkan. Lihat dokumentasi klien Anda untuk eksekusi Klien khusus yang akan memulai fungsi inti, titik akhir terpilihnya, dan mulai mencari peer. Setelah berhasil menemukan peer, klien memulai sinkronisasi. Data rantai blok saat ini akan tersedia setelah klien berhasil disinkronisasikan dengan state saat ini. ### Menggunakan klien {#using-the-client} diff --git a/public/content/translations/id/developers/tutorials/run-light-node-geth/index.md b/public/content/translations/id/developers/tutorials/run-light-node-geth/index.md deleted file mode 100644 index a481e451498..00000000000 --- a/public/content/translations/id/developers/tutorials/run-light-node-geth/index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Cara menjalankan node ringan dengan Geth -description: How to download, install and run a lightclient with Geth. -author: "Brain Gu" -tags: - - "klien" - - "node" -skill: beginner -lang: id -published: 2022-03-04 ---- - -Anda mungkin tertarik menjalankan [node Ethereum](/developers/docs/nodes-and-clients/). Salah satu cara termudah untuk melakukannya adalah dengan mengunduh, menginstal, dan menjalankan Geth. Dengan Geth, kita bisa mengaktifkan node ringan dan menjalankannya dalam hitungan menit. - -A light client requires less than 400MB of storage whilst still allowing full interactivity with the Ethereum state. Light clients retrieve data from remote peers, so some queries may take longer to respond in comparison to other sync modes. - -For an explanation of the differences between the different sync modes, read our [nodes and clients developer docs](/developers/docs/nodes-and-clients/#node-types). - -## Install and run {#install-and-run} - -First, [install Geth](https://geth.ethereum.org/docs/install-and-build/installing-geth). - -After installing Geth, you can run an Ethereum node in "light" mode by running the following command in a Terminal window: - -```bash -geth --syncmode light -``` - -Once launched, Geth will begin connecting to other nodes on Ethereum - known as "peers". The process of connecting to peers may take a while. - -When your Geth node has enough peers, it will import headers from new blocks on the chain. - -When new block headers no longer have an "age", Geth will be synced to the chain's head. - -## Menghentikan dan memulai kembali node Anda {#stopping-and-restarting-your-node} - -You can stop your node at any time by pressing CTRL+C. - -When restarting the node, Geth will take a few minutes to download block headers created since the node was last run. - -## Enable the HTTP-RPC server {#enable-the-http-rpc-server} - -Enabling the HTTP-RPC server lets you connect your Ethereum node to other software like wallets, browser extensions, or custom software libraries. - -You can enable the HTTP-RPC server by running the following command when launching Geth: - -```bash -geth --syncmode light --http -``` - -Once enabled, run `curl http://127.0.0.1:8545`. This should report no error. - -### Allow remote connections {#allow-remote-connections} - -To allow remote hosts to connect to your node, launch Geth with the following command: - -``` -geth --syncmode light --http --http.addr 0.0.0.0 -``` - -Note: this assumes that there is no process blocking requests to your localhost, such as a firewall. - -## Geth JavaScript console {#geth-javascript-console} - -Geth has a built-in JavaScript console and a JavaScript API called [web3js](https://github.com/ethereum/web3.js/) that you can use to interact with your node. - -To use the JavaScript console run: - -```bash -geth attach -``` - -This console allows direct interaction with Ethereum. For example, running the `eth.blockNumber` command will print the latest known block number. - -[Dokumentasi web3js lengkap](http://web3js.readthedocs.io/) - -## Mainnet and testnets {#mainnet-and-testnets} - -Geth runs your node on [Ethereum Mainnet](/glossary/#mainnet) by default. - -It is also possible to use Geth to run a node on one of the [public test networks](/networks/#testnets), by running one of the following commands in Terminal: - -```bash -geth --syncmode light --ropsten -geth --syncmode light --rinkeby -geth --syncmode light --goerli -``` - -## Di mana data blockchain dan EVM disimpan? {#where-is-the-blockchain-and-evm-data-stored} - -Direktori yang digunakan Geth untuk menyimpan data blockchain mentah tergantung pada sistem operasi Anda. Upon running Geth, look for a message that looks like this: - -```bash -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -``` - -Jalur yang mengikuti `“database=”` akan memberi tahu Anda di mana data blockchain disimpan dalam mesin Anda. Jika Anda menjalankan node penuh, direktori ini akan berisi semua data tentang setiap blok yang pernah diserahkan ke blockchain. Karena kita menjalankan node ringan, direktori ini hanya berisi header blok. - -Penting untuk ditekankan di sini bahwa, pada tingkat paling bawah, inilah tempat di mana blockchain tinggal. Konten lengkap blockchain dan state EVM disimpan dalam setiap node penuh di jaringan Ethereum, dalam direktori yang tampak sangat mirip dengan direktori di komputer Anda. - -## Bacaan lebih lanjut {#further-reading} - -- [Pelajari selengkapnya tentang jaringan yang berbeda](/developers/docs/networks/). -- [Run a full node](/run-a-node/) diff --git a/public/content/translations/it/developers/tutorials/run-light-node-geth/index.md b/public/content/translations/it/developers/tutorials/run-light-node-geth/index.md deleted file mode 100644 index 85baf203afa..00000000000 --- a/public/content/translations/it/developers/tutorials/run-light-node-geth/index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Come eseguire un nodo leggero con Geth -description: Come scaricare, installare ed eseguire un client leggero con Geth. -authors: "Brian Gu" -tags: - - "client" - - "nodi" -skill: beginner -lang: it -published: 2022-03-04 ---- - -Se ti interessa eseguire un [nodo Ethereum](/developers/docs/nodes-and-clients/), uno dei modi più facili è scaricare, installare ed eseguire Geth. Con Geth, possiamo ottenere un nodo leggero attivo in pochi minuti. - -Un client leggero richiede meno di 400MB d'archiviazione, pur consentendo la piena interattività con lo stato di Ethereum. I client leggeri recuperano i dati dai peer remoti, quindi alcune interrogazioni potrebbero richiedere un più di tempo per la risposta rispetto ad altre modalità di sincronizzazione. - -Per una spiegazione delle differenze tra le diverse modalità di sincronizzazione, leggi la nostra [documentazione per sviluppatori di nodi e client](/developers/docs/nodes-and-clients/#node-types). - -## Installa ed esegui {#install-and-run} - -Innanzitutto occorre [installare Geth](https://geth.ethereum.org/docs/install-and-build/installing-geth). - -Dopo aver installato Geth, puoi eseguire un nodo di Ethereum in modalità "light" eseguendo il seguente comando in una finestra del Terminale: - -```bash -geth --syncmode light -``` - -Una volta avviato, Geth inizia a connettersi ad altri nodi su Ethereum, noti come "peer". Il processo di connessione ai peer potrebbe richiedere un po' di tempo. - -Quando il tuo nodo di Geth ha abbastanza peer, importerà le intestazioni dai nuovi blocchi sulla catena. - -Quando le intestazioni del nuovo blocco non avranno più una "età", Geth sarà sincronizzato all'inizio della catena. - -## Arrestare e riavviare il nodo {#stopping-and-restarting-your-node} - -Puoi interrompere il tuo nodo quando vuoi premendo CTRL+C. - -Riavviando il nodo, Geth impiegherà qualche minuto per scaricare le intestazioni del blocco create dall'ultima esecuzione del nodo. - -## Abilita il server HTTP-RPC {#enable-the-http-rpc-server} - -Abilitare il server HTTP-RPC ti consente di connettere il tuo nodo di Ethereum ad altri software come portafogli, estensioni del browser o librerie software personalizzate. - -Puoi abilitare il server HTTP-RPC eseguendo il seguente comando al lancio di Geth: - -```bash -geth --syncmode light --http -``` - -Una volta abilitato, esegui `curl http://127.0.0.1:8545`. Non dovresti ricevere alcun errore. - -### Consenti le connessioni remote {#allow-remote-connections} - -Per consentire a host remoti di connettersi al tuo nodo, avvia Geth con il seguente comando: - -``` -geth --syncmode light --http --http.addr 0.0.0.0 -``` - -Nota: questo presuppone che non ci sia alcun processo che blocca le richieste al tuo host locale, come ad esempio un firewall. - -## Console JavaScript di Geth {#geth-javascript-console} - -Geth ha una console JavaScript integrata e un'APi JavaScript chiamata [web3js](https://github.com/ethereum/web3.js/), che puoi usare per interagire col tuo nodo. - -Per usare la console JavaScript, esegui: - -```bash -geth attach -``` - -Questa console consente di interagire direttamente con Ethereum. Ad esempio, eseguendo il comando `eth.blockNumber` si otterrà il numero dell'ultimo blocco noto. - -[Documentazione completa di web3js](http://web3js.readthedocs.io/) - -## Rete principale e reti di prova {#mainnet-and-testnets} - -Geth esegue di default il tuo nodo sulla [Rete principale di Ethereum](/glossary/#mainnet/). - -Puoi anche usare Geth per eseguire un nodo su una delle [reti di prova pubbliche](/networks/#testnets/), eseguendo uno dei seguenti comandi nel Terminale: - -```bash -geth --syncmode light --ropsten -geth --syncmode light --rinkeby -geth --syncmode light --goerli -``` - -## Dove sono memorizzati i dati della blockchain e dell'EVM? {#where-is-the-blockchain-and-evm-data-stored} - -La directory che Geth usa per memorizzare i dati grezzi della blockchain dipende dal sistema operativo. Dopo aver eseguito Geth, cerca un messaggio simile a questo: - -```bash -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -``` - -Il percorso dopo `"database="` dovrebbe indicare dove sono memorizzati i dati della blockchain sul computer locale. Se esegui un nodo completo, questa directory conterrà tutti i dati su ogni blocco salvato nella blockchain. Poiché noi eseguiamo un nodo leggero, questa directory contiene solo le intestazioni dei blocchi. - -Vale la pena ribadire che, al livello più basso, questo percorso è la posizione in cui si trova la blockchain. I contenuti completi della blockchain e dello stato dell'EVM sono memorizzati in ogni nodo completo nella rete di Ethereum, in directory che somigliano molto a quella presente sul tuo computer. - -## Letture consigliate {#further-reading} - -- [Scopri di più sulle diverse reti](/developers/docs/networks/). -- [Eseguire un nodo di Ethereum](/run-a-node/) diff --git a/public/content/translations/it/developers/tutorials/sending-tokens-using-ethersjs/index.md b/public/content/translations/it/developers/tutorials/sending-tokens-using-ethersjs/index.md deleted file mode 100644 index 0f9979626fc..00000000000 --- a/public/content/translations/it/developers/tutorials/sending-tokens-using-ethersjs/index.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: Invio di token utilizzando ethers.js -description: Guida per principianti per l'invio di token utilizzando ethers.js. -author: Kim YongJun -tags: - - "ETHERS.JS" - - "ERC-20" - - "TOKEN" -skill: beginner -lang: it -published: 2021-04-06 ---- - -## Invio di token utilizzando ethers.js(5.0) {#send-token} - -### In questo tutorial imparerai come {#you-learn-about} - -- Importare ethers.js -- Trasferire token -- Impostare il prezzo del gas in base alla situazione del traffico di rete - -### Per iniziare {#to-get-started} - -Per iniziare, dobbiamo prima importare la libreria di ethers.js nel nostro javascript. `Include ethers.js(5.0)` - -### Installazione {#install-ethersjs} - -```shell -/home/ricmoo> npm install --save ethers -``` - -ES6 nel browser - -```html - -``` - -ES3(UMD) nel browser - -```html - -``` - -### Parametri {#param} - -1. **`contract_address`**: Indirizzo del contratto del token (l'indirizzo del contratto è necessario quando il token che vuoi trasferire non è ether) -2. **`send_token_amount`**: L'importo che vuoi inviare al destinatario -3. **`to_address`**: L'indirizzo del destinatario -4. **`send_account`**: L'indirizzo del mittente -5. **`private_key`**: La chiave privata del mittente per firmare la transazione e trasferire realmente i token - -## Avviso {#notice} - -`signTransaction(tx)` è rimossa perché `sendTransaction()` lo fa internamente. - -## Invio delle procedure {#procedure} - -### 1. Connettiti alla rete (rete di prova) {#connect-to-network} - -#### Imposta il provider (Infura) {#set-provider} - -Connettiti alla rete di prova di Ropsten - -```javascript -window.provider = new InfuraProvider("ropsten") -``` - -### 2. Crea il portafoglio {#create-wallet} - -```javascript -let wallet = new ethers.Wallet(private_key) -``` - -### 3. Connetti il portafoglio alla rete {#connect-wallet-to-net} - -```javascript -let walletSigner = wallet.connect(window.ethersProvider) -``` - -### 4. Ottieni il prezzo corrente del gas {#get-gas} - -```javascript -window.ethersProvider.getGasPrice() // gasPrice -``` - -### 5. Definisci la transazione {#define-transaction} - -Queste variabili definite di seguito dipendono da `send_token()` - -### Parametri della transazione {#transaction-params} - -1. **`send_account`**: indirizzo del mittente del token -2. **`to_address`**: indirizzo del destinatario del token -3. **`send_token_amount`**: l'importo di token da inviare -4. **`gas_limit`**: limite di gas -5. **`gas_price`**: prezzo del gas - -[Vedi sotto come usarli](#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. Trasferimento {#transfer} - -```javascript -walletSigner.sendTransaction(tx).then((transaction) => { - console.dir(transaction) - alert("Send finished!") -}) -``` - -## Come usarlo {#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 -) -``` - -### Fatto! {#success} - -![immagine della transazione eseguita correttamente](./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) { - // general token send - let contract = new ethers.Contract( - contract_address, - send_abi, - walletSigner - ) - - // How many tokens? - let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) - console.log(`numberOfTokens: ${numberOfTokens}`) - - // Send tokens - contract.transfer(to_address, numberOfTokens).then((transferResult) => { - console.dir(transferResult) - alert("sent token") - }) - } // ether send - 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("Send finished!") - }) - } catch (error) { - alert("failed to send!!") - } - } - }) -} -``` diff --git a/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md deleted file mode 100644 index c160a581043..00000000000 --- a/public/content/translations/ja/developers/tutorials/send-token-etherjs/index.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: ethers.jsを使用したトークンの送信 -description: ethers.jsを使用してトークンを送信するための初心者向けのガイド -author: Kim YongJun -tags: - - "ETHERS.JS" - - "ERC-20" - - "トークン" -skill: beginner -lang: ja -published: 2021-04-06 ---- - -## ethers.js(5.0)を使用したトークンの送信 {#send-token} - -### このチュートリアルでは、次の処理を行う方法について学びます。 {#you-learn-about} - -- ethers.jsのインポート -- トークンの転送 -- ネットワークの混雑状況に応じたガス代の設定 - -### はじめに {#to-get-started} - -まず、ethers.jsというライブラリをjavascriptにインポートする必要があります。これには、ethers.js 5.0も含まれます。 - -### インストール {#install-ethersjs} - -```shell -/home/ricmoo> npm install --save ethers -``` - -ブラウザでES6を使用するには次のようにします。 - -```html - -``` - -ブラウザでES3(UMD)を使用するには次のようにします。 - -```html - -``` - -### パラメータ {#param} - -1. **`contract_address`**: トークンのコントラクトアドレス(転送したいトークンがイーサでない場合は、コントラクトアドレスが必要となります) -2. **`send_token_amount`**: 受取人に送る量 -3. **`to_address`**: 受取人のアドレス -4. **`send_account`**: 送信者のアドレス -5. **`private_key`**: トランザクションに署名し、実際にトークンを転送するための送信者の秘密鍵 - -## 注意 {#notice} - -`signTransaction(tx)`は、`sendTransaction()`の内部で実行されるため削除されました。 - -## 送信の手順 {#procedure} - -### 1. ネットワーク(testnet)に接続する {#connect-to-network} - -#### プロバイダー(Infura)の設定 {#set-provider} - -テストネットのRopstenに接続します。 - -```javascript -window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") -``` - -### 2. ウォレットを作成する {#create-wallet} - -```javascript -let wallet = new ethers.Wallet(private_key) -``` - -### 3. ウォレットをネットに接続する {#connect-wallet-to-net} - -```javascript -let walletSigner = wallet.connect(window.ethersProvider) -``` - -### 4. 現在のガス代を取得する {#get-gas} - -```javascript -window.ethersProvider.getGasPrice() // gasPrice -``` - -### 5. トランザクションを定義する {#define-transaction} - -以下で定義されている変数は、`send_token()`に依存します。 - -### トランザクションのパラメータ {#transaction-params} - -1. **`send_account`**: トークン送信者のアドレス -2. **`to_address`**: トークンの受取人のアドレス -3. **`send_token_amount`**: 送信するトークンの量 -4. **`gas_limit`**: ガスリミット -5. **`gas_price`**: ガス代 - -[使い方については以下をご覧ください。](#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. 転送する {#transfer} - -```javascript -walletSigner.sendTransaction(tx).then((transaction) => { - console.dir(transaction) - alert("Send finished!") -}) -``` - -## 使い方 {#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 -) -``` - -### 成功しました! {#success} - -![トランザクションが成功したときのイメージ](./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) { - // general token send - let contract = new ethers.Contract( - contract_address, - send_abi, - walletSigner - ) - - // How many tokens? - let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) - console.log(`numberOfTokens: ${numberOfTokens}`) - - // Send tokens - contract.transfer(to_address, numberOfTokens).then((transferResult) => { - console.dir(transferResult) - alert("sent token") - }) - } // ether send - 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("Send finished!") - }) - } catch (error) { - alert("failed to send!!") - } - } - }) -} -``` diff --git a/public/content/translations/pl/developers/docs/nodes-and-clients/index.md b/public/content/translations/pl/developers/docs/nodes-and-clients/index.md index 1bb4b2615b9..b28130b5340 100644 --- a/public/content/translations/pl/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/pl/developers/docs/nodes-and-clients/index.md @@ -225,5 +225,4 @@ W Internecie jest wiele instrukcji i informacji o klientach Ethereum, tutaj jest ## Powiązane samouczki {#related-tutorials} -- [Uruchamianie węzła za pomocą Geth](/developers/tutorials/run-light-node-geth/) _– Jak pobrać, zainstalować i uruchomić Geth. Omówienie trybów synchronizacji, konsoli JavaScript i więcej._ - [Turn your Raspberry Pi 4 into an Eth 1.0 or Eth 2.0 node just by flashing the MicroSD card – Installation guide](/developers/tutorials/run-node-raspberry-pi/) _– Flash your Raspberry Pi 4, plug in an ethernet cable, connect the SSD disk and power up the device to turn the Raspberry Pi 4 into a full Ethereum 1.0 node or an Ethereum 2.0 node (beacon chain / validator)._ diff --git a/public/content/translations/pl/developers/docs/standards/tokens/index.md b/public/content/translations/pl/developers/docs/standards/tokens/index.md index 1f049eac59c..6f89f69c06e 100644 --- a/public/content/translations/pl/developers/docs/standards/tokens/index.md +++ b/public/content/translations/pl/developers/docs/standards/tokens/index.md @@ -29,5 +29,5 @@ _Znasz jakieś zasoby społeczności, które Ci pomogły? Wyedytuj tę stronę - [Lista kontrolna integracji tokenów](/developers/tutorials/token-integration-checklist/) _– lista kontrolna rzeczy, które należy wziąć pod uwagę podczas interakcji z tokenami._ - [Zrozumienie inteligentnego kontraktu tokena ERC20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– wprowadzenie do wdrożenie pierwszego inteligentnego kontraktu w sieci testowej Ethereum._ -- [Przenoszenie i zatwierdzanie tokenów ERC20 z inteligentnego kontraktu Solidity](/developers/tutorials/transfers-and-approval-of-erc20-tokens-from-a-solidity-smart-contract/) _– jak używać inteligentnego kontraktu do interakcji z tokenem przy użyciu języka Solidity._ +- [Przenoszenie i zatwierdzanie tokenów ERC20 z inteligentnego kontraktu Solidity](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– jak używać inteligentnego kontraktu do interakcji z tokenem przy użyciu języka Solidity._ - [Wdrażanie rynku ERC721 [przewodnik]](/developers/tutorials/how-to-implement-an-erc721-market/) _– jak wystawiać tokenizowane przedmioty na sprzedaż na zdecentralizowanej tablicy ogłoszeń._ diff --git a/public/content/translations/pl/developers/tutorials/run-light-node-geth/index.md b/public/content/translations/pl/developers/tutorials/run-light-node-geth/index.md deleted file mode 100644 index a41cb513594..00000000000 --- a/public/content/translations/pl/developers/tutorials/run-light-node-geth/index.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -title: Jak uruchomić lekki węzeł za pomocą Geth -description: Jak pobrać, zainstalować i uruchomić Geth. Obejmuje tryby synchronizacji, konsolę JavaScript i nie tylko -author: "Brian Gu" -tags: - - "klienty" - - "węzły" -skill: intermediate -lang: pl -published: 2020-06-14 ---- - -Możesz być zainteresowany uruchomieniem [węzła Ethereum](/developers/docs/nodes-and-clients/). Jednym z najprostszych sposobów jest pobieranie, instalowanie i uruchamianie Geth. Dzięki Geth możemy uruchomić lekki węzeł w ciągu kilku minut. - -Najpierw musisz [zainstalować Geth](https://geth.ethereum.org/docs/install-and-build/installing-geth). - -Po zainstalowaniu Getha uruchomienie pełnego węzła Ethereum jest tak proste, jak pisanie - -```bash -$ geth -``` - -w wierszu poleceń (bez znaku dolara). Nie rób tego jeszcze! Po uruchomieniu `geth` Geth: - -- Zainicjuje lokalną kopię EVM w stanie pustym -- Rozpocznie pobieranie wszystkich bloków w historii Ethereum, zaczynając od bloku 0. -- Powtórzy wszystkie transakcje we wszystkich blokach, aby zaktualizować stan EVM każdą transakcją, aż osiągnie stan bieżący. - -Ten proces może trwać od godzin do dni i wymaga kilkuset GB wolnego miejsca. Na razie po prostu uruchomimy lekki węzeł w sieci testowej, aby zapoznać się z tym, jak korzystać z Getha. Aby to zrobić, będziemy musieli przejść przez kilka ważnych opcji i narzędzi wiersza poleceń. - -## Główna sieć i testnet {#mainnet-and-testnet} - -Domyślnie Geth uruchamia węzeł sieci głównej. Możesz uruchomić `geth --testnet`, aby uruchomić pełny węzeł sieci testowej Ropsten. Możesz uruchomić węzeł w Rinkeby, zamieniając `testnet` na `rinkeby`. - -[Dowiedz się więcej o różnych sieciach](/developers/docs/networks/). - -## Syncmode {#syncmode} - -Geth ma trzy `syncmode`. - -```bash -$ geth --syncmode "full" -$ geth --syncmode "fast" -$ geth --syncmode "light" -``` - -`"full"` uruchamia pełny węzeł dokładnie tak, jak można się spodziewać — twoja maszyna inicjuje lokalną kopię EVM w jej oryginalnym czystym stanie, pobiera każdy blok od początku łańcucha bloków i wykonuje każdą transakcję w każdym bloku, aktualizując stan EVM, aż osiągnie obecny stan EVM. - -`"fast"` pobiera wszystkie bloki, ale także pobiera ostatnią migawkę stanu EVM z peera (obecnie stan 64 bloków EVM w przeszłości), wykonując transakcje tylko w najnowszych blokach do osiąga aktualny stan EVM. Zaletą `"fast"` jest to, że synchronizacja do obecnego stanu zajmuje znacznie mniej czasu; jednak opiera się na pełnym archiwalnym węźle równorzędnym dla migawki stanu, więc nie weryfikuje wszystkiego dla siebie. - -Wreszcie, `"light"` uruchamia lekki węzeł, który omówiliśmy powyżej. - -Aby wyjaśnić różnice pomiędzy trzema trybami synchronizacji, zobacz tę [odpowiedź giełdy](https://ethereum.stackexchange.com/questions/11297/what-is-geths-light-sync-and-why-is-it-so-fast). - -## Dokumentacja i inne opcje wiersza poleceń {#documentation-and-other-command-line-options} - -- [Pełna dokumentacja](https://geth.ethereum.org/docs/) -- [Wszystkie opcje wiersza poleceń](https://geth.ethereum.org/docs/interface/command-line-options) - -## Uruchomienie lekkiego węzła {#running-your-light-node} - -Uruchomimy lekki węzeł sieci testowej, aby zapoznać się z zarządzaniem węzłem i interakcją z nim. Aby to zrobić, po prostu uruchom - -```bash -$ geth --testnet --syncmode "light" -``` - -Poczekaj kilka sekund i miejmy nadzieję, że otrzymasz dane wyjściowe, które wyglądają mniej więcej tak: - -```bash -$ geth --testnet --syncmode "light" -INFO [11-18|14:04:47] Maximum peer count ETH=0 LES=100 total=25 -INFO [11-18|14:04:47] Starting peer-to-peer node instance=Geth/v1.8.11-stable/darwin-amd64/go1.10.3 -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -INFO [11-18|14:04:47] Persisted trie from memory database nodes=355 size=51.89kB time=561.839µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B -INFO [11-18|14:04:47] Initialised chain configuration config="{ChainID: 3 Homestead: 0 DAO: DAOSupport: true EIP150: 0 EIP155: 10 EIP158: 10 Byzantium: 1700000 Constantinople: Engine: ethash}" -INFO [11-18|14:04:47] Disk storage enabled for ethash caches dir=/Users/bgu/Library/Ethereum/testnet/geth/ethash count=3 -INFO [11-18|14:04:47] Disk storage enabled for ethash DAGs dir=/Users/bgu/.ethash count=2 -INFO [11-18|14:04:47] Added trusted checkpoint chain=ropsten block=3375103 hash=9017ab…249e89 -INFO [11-18|14:04:47] Loaded most recent local header number=0 hash=419410…ca4a2d td=1048576 -INFO [11-18|14:04:47] Starting P2P networking -INFO [11-18|14:04:49] UDP listener up net=enode://3ef47be442520e4708b5ff25e6e213c496046f443f8393ff5e7ec55f1cf27c374e2e93e78235bde651a5734a012a40eacfc16deab762ee0f380b95d117ac530c@[::]:30303 -WARN [11-18|14:04:49] Light client mode is an experimental feature -INFO [11-18|14:04:49] RLPx listener up self="enode://3ef47be442520e4708b5ff25e6e213c496046f443f8393ff5e7ec55f1cf27c374e2e93e78235bde651a5734a012a40eacfc16deab762ee0f380b95d117ac530c@[::]:30303?discport=0" -INFO [11-18|14:04:49] IPC endpoint opened url=/Users/bgu/Library/Ethereum/testnet/geth.ipc -INFO [11-18|14:04:51] Mapped network port proto=udp extport=30303 intport=30303 interface="UPNP IGDv1-IP1" -INFO [11-18|14:04:51] Mapped network port proto=tcp extport=30303 intport=30303 interface="UPNP IGDv1-IP1" -INFO [11-18|14:08:55] Block synchronisation started -INFO [11-18|14:08:58] Imported new block headers count=192 elapsed=1.574s number=3375295 hash=62f6b1…95c47f ignored=0 -INFO [11-18|14:08:58] Imported new block headers count=192 elapsed=127.088ms number=3375487 hash=ae759b…453ac5 ignored=0 -INFO [11-18|14:08:59] Imported new block headers count=960 elapsed=582.125ms number=3376447 hash=4cab62…445b82 ignored=0 -INFO [11-18|14:08:59] Imported new block headers count=192 elapsed=169.936ms number=3376639 hash=470614…85ce15 ignored=0 -INFO [11-18|14:08:59] Imported new block headers count=384 elapsed=245.745ms number=3377023 hash=dad8ee…2862d2 ignored=0 -INFO [11-18|14:08:59] Imported new block headers count=192 elapsed=128.514ms number=3377215 hash=ebcd84…ea26cb ignored=0 -INFO [11-18|14:09:00] Imported new block headers count=192 elapsed=125.427ms number=3377407 hash=fca10c…8ed04d ignored=0 -INFO [11-18|14:09:00] Imported new block headers count=192 elapsed=109.536ms number=3377599 hash=9aa141…f34080 ignored=0 -INFO [11-18|14:09:00] Imported new block headers count=192 elapsed=109.849ms number=3377791 hash=499f2d…e0c713 ignored=0 -``` - -Uwaga: przez kilka minut, a nawet godzin, jeśli masz szczególnego pecha, możesz nie widzieć komunikatów „Block synchronisation started” i następnie „Imported new block headers”. W tym czasie Twój klient próbuje znaleźć równorzędne pełne węzły, które obsłużą klientów typu light. W powyższym przykładzie możemy stwierdzić po znacznikach czasu, że moja maszyna musiała odczekać około czterech minut między rozpoczęciem wyszukiwania równorzędnych węzłów a faktycznym znalezieniem takiego, z którego można pobrać bloki. Jest to obecnie otwarty problem w społeczności Ethereum — jak zachęcić ludzi do uruchamiania pełnych węzłów, które obsługują klientów typu light? - -Gdy rozpocznie się synchronizacja bloków, Twoja maszyna będzie potrzebować kilku minut, aby nadrobić zaległości w najnowszych blokach w łańcuchu bloków. W tym momencie twój wynik zacznie wyglądać tak: - -```bash -INFO [11-18|16:06:04.025] Imported new block headers count=2 elapsed=6.253ms number=4456862 hash=ce0a0b…6ab128 -INFO [11-18|16:06:27.819] Imported new block headers count=2 elapsed=5.982ms number=4456864 hash=04a054…b4f661 -INFO [11-18|16:06:34.080] Imported new block headers count=2 elapsed=4.774ms number=4456866 hash=15a43c…efc782 -INFO [11-18|16:06:45.464] Imported new block headers count=2 elapsed=5.213ms number=4456868 hash=eb02d5…227564 -INFO [11-18|16:07:11.630] Imported new block headers count=2 elapsed=5.835ms number=4456870 hash=67daa7…66892d -``` - -W tym momencie wiadomości zaczną przychodzić co 10-30 sekund, a wartość `count` będzie składać się z pojedynczych cyfr dla każdej wiadomości. - -## Gdzie przechowywane są dane z blockchainu i EVM? {#where-is-the-blockchain-and-evm-data-stored} - -Katalog, którego Geth używa do przechowywania nieprzetworzonych danych łańcucha bloków, zależy od systemu operacyjnego. Po uruchomieniu Geth poszukaj wiadomości, która wygląda jak - -```bash -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -``` - -Ścieżka po `„database="` powinna Ci powiedzieć, gdzie dane łańcucha bloków są przechowywane na Twoim komputerze. Jeśli używasz pełnego węzła, ten katalog będzie zawierał wszystkie dane o każdym bloku, który kiedykolwiek został przekazany do łańcucha bloków. Ponieważ mamy lekki węzeł, ten katalog zawiera tylko nagłówki bloków. - -Warto w tym miejscu podkreślić, że na najniższym poziomie to właśnie tutaj żyje blockchain. Pełna zawartość łańcucha bloków i stan EVM są przechowywane na każdym pełnym węźle w sieci Ethereum, w katalogach, które wyglądają bardzo podobnie do tego na twoim komputerze. - -## Dołączanie do konsoli JavaScript {#attaching-to-the-javascript-console} - -Uruchamianie węzła nie jest przydatne, chyba że faktycznie możemy z nim wchodzić w interakcje. Na przykład możemy chcieć rozgłaszać żądania transakcji lub wyszukiwać dane EVM/blockchainu (takie jak saldo konta). Geth ma wbudowaną konsolę JavaScript i interfejs API JavaScript o nazwie [web3js](https://github.com/ethereum/web3.js/), którego możesz użyć do interakcji z węzłem. - -Aby użyć konsoli JavaScript: - -1. Rozpocznij uruchamianie węzła w oknie terminala (zarówno pełny, jak i lekki węzeł są akceptowane). -2. Poszukaj wiadomości, która wygląda tak: - -```bash -INFO [11-18|14:04:49] IPC endpoint opened url=/Users/bgu/Library/Ethereum/testnet/geth.ipc -``` - -Ten komunikat powinien zostać zarejestrowany przed rozpoczęciem synchronizacji bloku. - -3. Ten komunikat wskazuje ścieżkę do punktu końcowego IPC (komunikacja między procesami). Skopiuj tę ścieżkę (w powyższym przykładzie jest to `/Users/bgu/Library/Ethereum/testnet/geth.ipc`). -4. Otwórz nowe okno lub kartę terminala i uruchom następujące polecenie: `$ geth attach [ścieżka Twojego punktu końcowego IPC]` - -To powinno otworzyć konsolę JavaScript. Możemy teraz używać web3js do interakcji z węzłem. - -[Pełna dokumentacja web3js](http://web3js.readthedocs.io/) - -Oto kilka przydatnych obiektów udostępnianych przez ten interfejs API. Dostęp do nich można uzyskać, wpisując je w konsoli JavaScript. - -- `eth.syncing` zwraca obiekt, jeśli twój węzeł rozpoczął, ale nie zakończył synchronizacji bloku, lub wartość `false`, jeśli zakończył synchronizację lub nie został uruchomiony. Jeśli węzeł nadal się synchronizuje, `eth.syncing` poinformuje Cię o ostatnim numerze bloku, którego dane otrzymałeś, a także o całkowitej liczbie bloków w bieżącym łańcuchu bloków. -- `net.peerCount` zwraca liczbę peerów, z którymi jesteś połączony. Jeśli jest to 0, prawdopodobnie będziesz musiał poczekać kilka minut lub zacząć szukać rozwiązań w Google (może to być zapora sieciowa, problem z siecią lub coś innego). -- `admin.peers` da Ci listę wszystkich peerów z którymi Twój węzeł jest podłączony. Jeśli to jest puste, twój węzeł nie jest połączony z żadnymi innymi peerami. - -Możemy również użyć web3js do inicjowania kont, pisania i wysyłania żądań transakcji do sieci, sprawdzania sald kont i metadanych i nie tylko. Omówimy te operacje w dalszej części; na razie spróbuj uruchomić następujące polecenie, aby sprawdzić saldo jednego z moich kont w sieci testowej Ropsten: - -```js -eth.getBalance('0x85d918c2B7F172d033D190152AEc58709Fb6D048') -# returns 1059286000000000000 as of 11-18-2018. Ta wartość jest podana w "Wei". -# Jedno Wei jest nominałem, który jest równoważny 10^-18 ether. -# Saldo tego konta w ether wynosi około 1,059 eth. -``` - -## Zatrzymywanie i ponowne uruchamianie węzła {#stopping-and-restarting-your-node} - -Możesz zatrzymać swój węzeł w każdej chwili. Jeśli chcesz zrestartować węzeł, ponowna synchronizacja Geth zajmie kilka sekund lub minut (pobranie bloków i/lub nagłówków bloków od miejsca, w którym zostało przerwane, gdy węzeł ostatnio przestał działać). Jeśli którakolwiek z powyższych instrukcji nie działa, pierwszą rzeczą, którą powinieneś zrobić, to spróbować zrestartować swój węzeł. - -Jeśli jesteś zainteresowany uruchomieniem pełnego węzła Ethereum, najlepiej jest to zrobić z dedykowanej maszyny z dobrą łącznością sieciową, a nie z komputera osobistego. Oto przewodnik do uruchomienia węzła z AWS (jest to trochę przestarzałe, a AMI nie są już aktualne lub dostępne, abyś musiał zrobić trochę Googling): [Jak uruchomić węzeł na AWS](https://medium.com/mercuryprotocol/how-to-run-an-ethereum-node-on-aws-a8774ed3acf6) diff --git a/public/content/translations/pt-br/developers/tutorials/send-token-etherjs/index.md b/public/content/translations/pt-br/developers/tutorials/send-token-ethersjs/index.md similarity index 100% rename from public/content/translations/pt-br/developers/tutorials/send-token-etherjs/index.md rename to public/content/translations/pt-br/developers/tutorials/send-token-ethersjs/index.md diff --git a/public/content/translations/ro/developers/docs/nodes-and-clients/index.md b/public/content/translations/ro/developers/docs/nodes-and-clients/index.md index 23cec983ff8..17697acd678 100644 --- a/public/content/translations/ro/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/ro/developers/docs/nodes-and-clients/index.md @@ -233,8 +233,6 @@ Verificați cu atenţie documentația sau pagina de ajutor a clientului pentru a `geth --syncmode "light"` -For further details, check out the tutorial on [running Geth light node](/developers/tutorials/run-light-node-geth/). - **Setting up full sync with archive in [Besu](https://besu.hyperledger.org/)** `besu --sync-mode=FULL` @@ -312,5 +310,4 @@ There is a lot of information about Ethereum clients on the internet. Here are f ## Tutoriale corelate {#related-tutorials} -- [Rularea unui nod cu Geth](/developers/tutorials/run-light-node-geth/) _ – Cum se descarcă, se instalează şi se rulează Geth. Covering syncmodes, the JavaScript console, and more._ - [Transformați Raspberry Pi 4 într-un nod validator doar prin flash-area cardului MicroSD – Ghidul de instalare](/developers/tutorials/run-node-raspberry-pi/) _– Flash-ați Raspberry Pi 4, conectați un cablu ethernet, conectați discul SSD și porniți dispozitivul pentru a transforma Raspberry Pi 4 într-un nod Ethereum complet care rulează nivelul de execuție (Mainnet) și / sau nivelul de consens (Lanțul Beacon / validatorul)._ diff --git a/public/content/translations/ro/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ro/developers/docs/nodes-and-clients/run-a-node/index.md index 1704805c918..e71bbf5f883 100644 --- a/public/content/translations/ro/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ro/developers/docs/nodes-and-clients/run-a-node/index.md @@ -88,7 +88,7 @@ Este bine ca, înainte de a porni software-ul client Ethereum, să efectuați o - Data și ora sistemului sunt corecte. - Routerul și firewall-ul acceptă conexiuni pe porturile de ascultare. Clienții Ethereum utilizează în mod implicit un port de ascultare (TCP) și un port de descoperire (UDP), ambele pe 30303 în mod implicit. -Rulaţi mai întâi clientul pe un testnet, pentru a vă asigura că totul funcționează corect. [Dacă rulaţi un nod ușor Geth](/developers/tutorials/run-light-node-geth/), aceasta ar trebui să vă ajute. Toate setările de client ce nu sunt cele implicite trebuie să fie declarate de la început. You can use flags or the config file to declare your preferred configuration. Consultați documentația clientului dvs. pentru detalii Execuția clientului va iniția funcțiile sale de bază, endpoint-urile alese și va începe să caute partenerii. După ce a reuşit să descopere partenerii, clientul începe sincronizarea. Datele actualizate ale blockchain-ului vor fi disponibile după sincronizarea cu succes a clientului cu starea actuală. +Rulaţi mai întâi clientul pe un testnet, pentru a vă asigura că totul funcționează corect. Dacă rulaţi un nod ușor Geth, aceasta ar trebui să vă ajute. Toate setările de client ce nu sunt cele implicite trebuie să fie declarate de la început. You can use flags or the config file to declare your preferred configuration. Consultați documentația clientului dvs. pentru detalii Execuția clientului va iniția funcțiile sale de bază, endpoint-urile alese și va începe să caute partenerii. După ce a reuşit să descopere partenerii, clientul începe sincronizarea. Datele actualizate ale blockchain-ului vor fi disponibile după sincronizarea cu succes a clientului cu starea actuală. ### Utilizarea clientului {#using-the-client} diff --git a/public/content/translations/ro/developers/tutorials/run-light-node-geth/index.md b/public/content/translations/ro/developers/tutorials/run-light-node-geth/index.md deleted file mode 100644 index 0bd495f1355..00000000000 --- a/public/content/translations/ro/developers/tutorials/run-light-node-geth/index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Cum se execută un nod ușor cu Geth -description: How to download, install and run a lightclient with Geth. -author: "Brian Gu" -tags: - - "clienți" - - "noduri" -skill: beginner -lang: ro -published: 2022-03-04 ---- - -Poate sunteţi interesat să rulaţi un [nod Ethereum](/developers/docs/noses-and-clients/). Unul dintre cele mai simple moduri de a face acest lucru este să descărcați, să instalați și să rulați Geth. Utilizând Geth, putem pune în funcţiune un nod ușor în câteva minute. - -A light client requires less than 400MB of storage whilst still allowing full interactivity with the Ethereum state. Light clients retrieve data from remote peers, so some queries may take longer to respond in comparison to other sync modes. - -For an explanation of the differences between the different sync modes, read our [nodes and clients developer docs](/developers/docs/nodes-and-clients/#node-types). - -## Install and run {#install-and-run} - -First, [install Geth](https://geth.ethereum.org/docs/install-and-build/installing-geth). - -After installing Geth, you can run an Ethereum node in "light" mode by running the following command in a Terminal window: - -```bash -geth --syncmode light -``` - -Once launched, Geth will begin connecting to other nodes on Ethereum - known as "peers". The process of connecting to peers may take a while. - -When your Geth node has enough peers, it will import headers from new blocks on the chain. - -When new block headers no longer have an "age", Geth will be synced to the chain's head. - -## Oprirea și repornirea nodului dvs. {#stopping-and-restarting-your-node} - -You can stop your node at any time by pressing CTRL+C. - -When restarting the node, Geth will take a few minutes to download block headers created since the node was last run. - -## Enable the HTTP-RPC server {#enable-the-http-rpc-server} - -Enabling the HTTP-RPC server lets you connect your Ethereum node to other software like wallets, browser extensions, or custom software libraries. - -You can enable the HTTP-RPC server by running the following command when launching Geth: - -```bash -geth --syncmode light --http -``` - -Once enabled, run `curl http://127.0.0.1:8545`. This should report no error. - -### Allow remote connections {#allow-remote-connections} - -To allow remote hosts to connect to your node, launch Geth with the following command: - -``` -geth --syncmode light --http --http.addr 0.0.0.0 -``` - -Note: this assumes that there is no process blocking requests to your localhost, such as a firewall. - -## Geth JavaScript console {#geth-javascript-console} - -Geth has a built-in JavaScript console and a JavaScript API called [web3js](https://github.com/ethereum/web3.js/) that you can use to interact with your node. - -To use the JavaScript console run: - -```bash -geth attach -``` - -This console allows direct interaction with Ethereum. For example, running the `eth.blockNumber` command will print the latest known block number. - -[Full web3js documentation](http://web3js.readthedocs.io/) - -## Mainnet and testnets {#mainnet-and-testnets} - -Geth runs your node on [Ethereum Mainnet](/glossary/#mainnet) by default. - -It is also possible to use Geth to run a node on one of the [public test networks](/networks/#testnets), by running one of the following commands in Terminal: - -```bash -geth --syncmode light --ropsten -geth --syncmode light --rinkeby -geth --syncmode light --goerli -``` - -## Unde sunt stocate datele de pe blockchain și EVM? {#where-is-the-blockchain-and-evm-data-stored} - -Directorul pe care îl utilizează Geth pentru a stoca datele brute de pe blockchain depinde de sistemul dvs. de operare. Upon running Geth, look for a message that looks like this: - -```bash -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -``` - -Calea care urmează `„database=”` (baza de date) ar trebui să vă spună unde sunt stocate datele blockchain-ului pe mașină. Dacă rulaţi un nod complet, acest director va conține toate datele despre fiecare bloc care a fost vreodată alocat la blockchain. Din moment ce rulăm un nod ușor, acest director conține doar anteturile blocului. - -Merită subliniat aici că, la cel mai de jos nivel, aici locuieşte blockchain-ul. Conținutul complet al blockchain-ului și starea EVM sunt stocate pe fiecare nod complet din rețeaua Ethereum, în directoare care seamănă foarte mult cu cele de pe computerul dvs. - -## Referințe suplimentare {#further-reading} - -- [Aflaţi mai multe despre diferite rețele](/developers/docs/Networks/). -- [Run a full node](/run-a-node/) diff --git a/public/content/translations/ru/developers/docs/nodes-and-clients/index.md b/public/content/translations/ru/developers/docs/nodes-and-clients/index.md index 70b36dd5bfe..d6c49df8d10 100644 --- a/public/content/translations/ru/developers/docs/nodes-and-clients/index.md +++ b/public/content/translations/ru/developers/docs/nodes-and-clients/index.md @@ -233,8 +233,6 @@ Erigon (в прошлом — Turbo-Geth) представляет собой о `geth --syncmode "light"` -Для получения дополнительной информации ознакомьтесь с руководством по [запуску легкого узла Geth](/developers/tutorials/run-light-node-geth/). - **Настройка полной синхронизации с архивом в [Besu](https://besu.hyperledger.org/)** `besu --sync-mode=FULL` @@ -312,5 +310,4 @@ Erigon (в прошлом — Turbo-Geth) представляет собой о ## Связанные руководства {#related-tutorials} -- [Запуск узла с помощью Geth](/developers/tutorials/run-light-node-geth/) _— как загрузить, установить и запустить Geth. О синхронизаторах, консоли JavaScript и многом другом._ - [Превратите свой Raspberry Pi 4 в узел валидатора, просто прошив карту MicroSD: руководство по установке](/developers/tutorials/run-node-raspberry-pi/) _— прошейте свой Raspberry Pi 4, подключите кабель Ethernet, подключите SSD-диск и включите устройство, чтобы превратить Raspberry Pi 4 в полноценный узел Ethereum, работающий на уровне исполнения (Mainnet) и/или на уровне консенсуса (Beacon Chain / validator)._ diff --git a/public/content/translations/ru/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/ru/developers/docs/nodes-and-clients/run-a-node/index.md index 7c929248252..5272112b648 100644 --- a/public/content/translations/ru/developers/docs/nodes-and-clients/run-a-node/index.md +++ b/public/content/translations/ru/developers/docs/nodes-and-clients/run-a-node/index.md @@ -88,7 +88,7 @@ sidebarDepth: 2 - В системе установлены правильное время и дата. - Ваш маршрутизатор и брандмауэр принимают подключения к прослушиваемым портам. По умолчанию клиенты Ethereum используют порт слушателя (TCP) и порт обнаружения (UDP), оба по умолчанию 30303. -Сначала запустите свой клиент в тестовой сети, чтобы убедиться, что все работает правильно. [Инструкции по запуску легкого узла Geth](/developers/tutorials/run-light-node-geth/) должны помочь. Необходимо указать все настройки клиента, которые не установлены по умолчанию. Вы можете использовать конфигурационный файл, чтобы определить свой набор настроек. Конкретные настройки можно найти в документации вашего клиента Исполнение клиента запустит его базовые функции и выбранные конечные точки, а затем начнется поиск узлов одноранговой сети. Когда узел найдет одноранговые соединения, клиент начнет синхронизацию. Актуальные данные блокчейна будут доступны, как только клиент закончит синхронизацию до текущего состояния. +Сначала запустите свой клиент в тестовой сети, чтобы убедиться, что все работает правильно. Необходимо указать все настройки клиента, которые не установлены по умолчанию. Вы можете использовать конфигурационный файл, чтобы определить свой набор настроек. Конкретные настройки можно найти в документации вашего клиента Исполнение клиента запустит его базовые функции и выбранные конечные точки, а затем начнется поиск узлов одноранговой сети. Когда узел найдет одноранговые соединения, клиент начнет синхронизацию. Актуальные данные блокчейна будут доступны, как только клиент закончит синхронизацию до текущего состояния. ### Использование клиента {#using-the-client} diff --git a/public/content/translations/tr/developers/tutorials/run-light-node-geth/index.md b/public/content/translations/tr/developers/tutorials/run-light-node-geth/index.md deleted file mode 100644 index 44c4418b076..00000000000 --- a/public/content/translations/tr/developers/tutorials/run-light-node-geth/index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Geth ile bir hafif (light) düğüm nasıl çalıştırılır -description: Geth ile bir lightclient nasıl indirilir, kurulur ve çalıştırılır. -author: "Brian Gu" -tags: - - "istemciler" - - "düğümler" -skill: beginner -lang: tr -published: 2022-03-04 ---- - -Bir [Ethereum düğümü](/developers/docs/nodes-and-clients/) çalıştırmak istiyor olabilirsiniz. Bunu yapmanın en kolay yollarından biri Geth'i indirmek, kurmak ve çalıştırmaktır. Geth ile bir hafif düğümü dakikalar içinde çalışır duruma getirebiliriz. - -Hafif istemci, Ethereum durumuyla tam etkileşime izin verirken 400 Mb'den daha az depolama gerektirir. Hafif istemciler uzak eşlerden veri alır, bu nedenle bazı sorguların yanıtlanması diğer senkronizasyon modlarına kıyasla daha uzun sürebilir. - -Farklı senkronizasyon modları arasındaki farkların açıklaması için [düğüm ve istemci geliştirici belgelerimizi](/developers/docs/nodes-and-clients/#node-types) okuyun. - -## Kurun ve çalıştırın {#install-and-run} - -İlk olarak, [Geth'i kurun](https://geth.ethereum.org/docs/install-and-build/installing-geth). - -Geth'i kurduktan sonra, bir Terminal penceresinde aşağıdaki komutu çalıştırarak bir Ethereum düğümünü "hafif" modda çalıştırabilirsiniz: - -```bash -geth --syncmode light -``` - -Geth başlatıldıktan sonra, "eşler" olarak bilinen Ethereum üzerindeki diğer düğümlere bağlanmaya başlayacak. Eşlerle bağlantı kurma süreci biraz zaman alabilir. - -Geth düğümünüz yeterli sayıda eşe sahip olduğunda, zincirdeki yeni bloklardan başlıkları içe aktarır. - -Yeni blok başlıklarının artık bir "yaşı" olmadığında Geth, zincirin başıyla senkronize edilir. - -## Düğümünüzü durdurma ve yeniden başlatma {#stopping-and-restarting-your-node} - -CTRL+C tuşlarına basarak düğümünüzü istediğiniz zaman durdurabilirsiniz. - -Düğümü yeniden başlatırken, Geth'in düğümün son çalıştırılmasından bu yana oluşturulan blok başlıklarını indirmesi birkaç dakika sürecektir. - -## HTTP-RPC sunucusunu etkinleştir {#enable-the-http-rpc-server} - -HTTP-RPC sunucusunu etkinleştirmek, Ethereum düğümünüzü cüzdanlar, tarayıcı uzantıları veya özel yazılım kitaplıkları gibi diğer yazılımlara bağlamanıza olanak tanır. - -Geth'i başlatırken aşağıdaki komutu çalıştırarak HTTP-RPC sunucusunu etkinleştirebilirsiniz: - -```bash -geth --syncmode light --http -``` - -Etkinleştirildiğinde, `curl http://127.0.0.1:8545` komutunu çalıştırın. Bu, hata bildirmemelidir. - -### Uzak bağlantılara izin verin {#allow-remote-connections} - -Uzak ana bilgisayarların düğümünüze bağlanmasına izin vermek için aşağıdaki komutla Geth'i başlatın: - -``` -geth --syncmode light --http --http.addr 0.0.0.0 -``` - -Not: Bu, güvenlik duvarı gibi yerel ana makinenize gelen istekleri engelleyen bir işlem olmadığını varsayar. - -## Geth JavaScript konsolu {#geth-javascript-console} - -Geth, düğümünüzle etkileşim kurmak için kullanabileceğiniz yerleşik bir JavaScript konsoluna ve [web3js](https://github.com/ethereum/web3.js/) adlı bir JavaScript API'sine sahiptir. - -JavaScript konsolunu kullanmak için şunu çalıştırın: - -```bash -geth attach -``` - -Bu konsol, Ethereum ile doğrudan etkileşime izin verir. Örneğin, `eth.blockNumber` komutunu çalıştırmak, bilinen en son blok numarasını yazdıracaktır. - -[Tam web3js belgeleri](http://web3js.readthedocs.io/) - -## Mainnet ve test ağları {#mainnet-and-testnets} - -Geth, düğümünüzü varsayılan olarak [Ethereum Mainnet](/glossary/#mainnet/) üzerinde çalıştırır. - -Terminal'de aşağıdaki komutlardan birini çalıştırarak, [genel test ağlarından](/networks/#testnets/) birinde bir düğüm çalıştırmak için Geth'i kullanmak da mümkündür: - -```bash -geth --syncmode light --ropsten -geth --syncmode light --rinkeby -geth --syncmode light --goerli -``` - -## Blok zinciri ve EVM verileri nerede saklanıyor? {#where-is-the-blockchain-and-evm-data-stored} - -Geth'in ham blok zinciri verilerini depolamak için kullandığı dizin, işletim sisteminize bağlıdır. Geth'i çalıştırdıktan sonra şuna benzeyen bir mesaj bulmaya çalışın: - -```bash -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -``` - -`“database=”` ardındaki yol, blok zinciri verilerinin makinenizde nerede depolandığını size söyleyecektir. Tam bir düğüm çalıştırıyorsanız bu dizin, blok zincirine taahhüt edilmiş her blok hakkındaki tüm verileri içerecektir. Hafif bir düğüm çalıştırdığımız için bu dizin yalnızca blok başlıklarını içerir. - -Bu noktada, buranın blok zincirinin en düşük seviyede yaşadığı yer olduğunu vurgulamakta fayda var. Blok zincirinin tam içeriği ve EVM durumu, Ethereum ağındaki her tam düğümde, bilgisayarınızdakine çok benzeyen dizinlerde depolanır. - -## Daha fazla okuma {#further-reading} - -- [Farklı ağlar hakkında öğrenin](/developers/docs/networks/). -- [Tam bir düğüm çalıştırın](/run-a-node/) diff --git a/public/content/translations/zh/developers/tutorials/run-light-node-geth/index.md b/public/content/translations/zh/developers/tutorials/run-light-node-geth/index.md deleted file mode 100644 index 1e39c3df0ad..00000000000 --- a/public/content/translations/zh/developers/tutorials/run-light-node-geth/index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: 如何通过Geth运行轻节点 -description: 怎样使用 Geth 下载、安装和运行轻客户端。 -authors: "Brian Gu" -tags: - - "客户端" - - "节点" -skill: beginner -lang: zh -published: 2022-03-04 ---- - -您可能会对运行[以太坊节点](/developers/docs/nodes-and-clients/)感兴趣。 最简单的实现方式就是下载、安装和运行 Geth。 通过 Geth,我们只需数分钟便能设置并运行一个轻节点。 - -轻客户端需要不到 400MB 的存储空间,但仍然可与以太坊状态进行完全交互。 轻客户端从远程对等点检索数据,因此与其他同步模式相比,某些查询的响应时间可能更长。 - -有关不同同步模式之间差异的说明,请阅读我们的[节点和客户端开发者文档](/developers/docs/nodes-and-clients/#node-types)。 - -## 安装并运行 {#install-and-run} - -首先,[安装 Geth](https://geth.ethereum.org/docs/install-and-build/installing-geth)。 - -安装 Geth 后,可以通过在终端窗口运行以下命令以“轻”模式运行以太坊节点: - -```bash -geth --syncmode light -``` - -启动后,Geth 将开始连接到以太坊上的其他节点 — 称为“对等节点”。 连接到对等节点的过程可能需要一段时间。 - -当您的 Geth 节点有足够多的对等节点时,它将从链上的新区块中导入区块头。 - -当新的区块头不再有“age”时,Geth 将同步到链的头部。 - -## 停止和重启节点 {#stopping-and-restarting-your-node} - -您可以随时按 Ctrl+C 键停止您的节点。 - -重启节点时,Geth 需要用几分钟下载自上次运行该节点以来创建的区块头。 - -## 启用 HTTP-RPC 服务器 {#enable-the-http-rpc-server} - -启用 HTTP-RPC 服务器可让您将以太坊节点连接到其他软件,如钱包、浏览器扩展程序或自定义软件库。 - -您可以在启动 Geth 时通过运行以下命令来启用 HTTP-RPC 服务器: - -```bash -geth --syncmode light --http -``` - -启用后,运行 `curl http://127.0.0.1:8545`。 应该不会报错。 - -### 允许远程连接 {#allow-remote-connections} - -要允许远程主机连接到您的节点,请使用以下命令启动 Geth: - -``` -geth --syncmode light --http --http.addr 0.0.0.0 -``` - -注意:这种情况假设没有进程阻止发送到您的本地主机的请求,例如防火墙。 - -## Geth JavaScript 控制台 {#geth-javascript-console} - -Geth 有一个内置的 JavaScript 控制台和一个名为 [web3js](https://github.com/ethereum/web3.js/) 的 JavaScript API,您可以使用它与您的节点进行交互。 - -要使用 JavaScript 控制台,运行以下命令: - -```bash -geth attach -``` - -该控制台允许与以太坊直接交互。 例如,运行 `eth.blockNumber` 命令将输出最新的已知区块编号。 - -[完整 web3js 相关文档](http://web3js.readthedocs.io/) - -## 主网和测试网 {#mainnet-and-testnets} - -Geth 默认在[以太坊主网](/glossary/#mainnet/)上运行节点。 - -通过在终端运行以下命令之一,也可以使用 Geth 在几个[公共测试网络](/networks/#testnets/)之一上运行节点: - -```bash -geth --syncmode light --ropsten -geth --syncmode light --rinkeby -geth --syncmode light --goerli -``` - -## 区块链和以太坊虚拟机数据存储在哪里? {#where-is-the-blockchain-and-evm-data-stored} - -Geth 用于存储原始区块链数据的目录取决于您的操作系统。 运行 Geth 后,查找如下所示的消息: - -```bash -INFO [11-18|14:04:47] Allocated cache and file handles database=/Users/bgu/Library/Ethereum/testnet/geth/lightchaindata cache=768 handles=128 -``` - -`“database=”`后面的路径应该显示区块链数据在您计算机中的存储位置。 如果您运行的是完整节点,则此目录将包含有关已提交到区块链的每个区块的所有数据。 因为我们在运行轻节点,此目录仅包含区块头。 - -此处要强调的是,在最低层级,这里便是区块链的所在之处。 区块链的完整内容和以太坊虚拟机状态存储在以太网络上的每个完整节点中,其存储目录与您计算机上这个目录非常相似。 - -## 延伸阅读 {#further-reading} - -- [详细了解不同的网络](/developers/docs/networks/)。 -- [运行完整节点](/run-a-node/) From 17ad0e47dfe239dcb54a287d05dabb8cf6f2d62f Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 26 Feb 2024 12:26:21 +0000 Subject: [PATCH 463/478] Disable SVG URLs in AssetDownload --- src/components/AssetDownload/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/AssetDownload/index.tsx b/src/components/AssetDownload/index.tsx index 6943ddf484b..dd3e2fc477d 100644 --- a/src/components/AssetDownload/index.tsx +++ b/src/components/AssetDownload/index.tsx @@ -62,11 +62,12 @@ const AssetDownload = ({ {t("page-assets-download-download")} ( {extname(imgSrc).slice(1).toUpperCase()}) - {svgUrl && ( + {/* Disables SVG due to bug: https://github.com/ethereum/ethereum-org-website/issues/12267 */} + {/* {svgUrl && ( {t("page-assets-download-download")} (SVG) - )} + )} */} ) From 24a8846fb8954dee081e11978f64ecf960a4f61c Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 26 Feb 2024 12:37:34 +0000 Subject: [PATCH 464/478] Update security.txt --- public/.well-known/security.txt | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/public/.well-known/security.txt b/public/.well-known/security.txt index 5be3832278f..f5633e95685 100644 --- a/public/.well-known/security.txt +++ b/public/.well-known/security.txt @@ -2,27 +2,26 @@ Hash: SHA256 Contact: mailto:security@ethereum.org -Expires: 2023-12-31T23:59:00.000Z +Expires: 2026-12-31T23:59:00.000Z Encryption: https://ethereum.org/security_at_ethereum.org.asc Acknowledgments: https://bounty.ethereum.org Preferred-Languages: en Canonical: https://ethereum.org/.well-known/security.txt Policy: https://bounty.ethereum.org Hiring: https://ethereum.org/en/community/get-involved/#ethereum-jobs - -----BEGIN PGP SIGNATURE----- -iQIzBAEBCAAdFiEErpbtlp5HmwCE8+F/6I0zNPpfagoFAmMV3bMACgkQ6I0zNPpf -agrOjhAAgMDS9RJUbJzcAybRfp/STq4Kf50TFd3iqx/t8ECw5UGazefieHesOhZ5 -9B9l6VAIHEGqbm+ukkhT+eBofhkAGEupiH/rUTy3hpFo1Ggp9QGi464Y8RyB0hID -BwjAsAVEdHyh8T6YrqxKRGvgELuEMZfuPfVhdIGU8CfEQozzuA9q3mChckXdTlSt -TvOKTMdnNPMlEhp4dT93iQaXDBAncE48TkUi/c8U4qolkskuDhZ4qJkc7xcv5Uk4 -TfF83Xs87AF9ZmABWawlCx7VHhp0HGljtGUpobf2DXV0TG77/dZzMQ4xdyqvDq+v -tm3djp3UHZVhOkDxMKpBzLnCkCvyvh/tvN4j/trdHHzXx6gEEkuiR5wPPoomCosi -95AGNFf0vpe2HucL/bOrBySxME+hifAnmkiaXltLbyUUTBQPfkHMHMoq1dmPokm2 -4RZaZ1A/K7rirZLC4w/RmxONVqvxT0baFTcZGyKzYm6gEZ9kCwWw1tyEl472yK0H -UR2cAhlo+Wa61cOTtwHVw0FMVyG0xZkR04y8WM3T8lE6imGLSmCDgPMZm8XnKdkY -SMGD3+TzLxe6mymmw+1dGXCPjjkImdrhBGxlwEU74vkFQKiWv/GftiDYYcilcQbS -OD1N7PTmpef+JEYXOpwxxUTSXu0SfVTSkx0wnHkqbib7Wwv5IwY= -=g+49 +iQIzBAEBCAAdFiEErpbtlp5HmwCE8+F/6I0zNPpfagoFAmXYslMACgkQ6I0zNPpf +agrlTA//Q1P+fzNaYtUUm7pg7Jz4VaEACaQZ5qNNmKl9VZ6yCS45pmqpPAAyDM2p +ZyFOUF3Q3UmHdwmVEGrHSREhoqx5I78KH4dmx4G38RG+4SMhSCZG0Ztf9Z3Dg0o2 +ZeO7vS7mp/STyxiG1Nnkg5Ivhuhq8sdQXF7hM+9JUVri7upEH0QtdAS/jZaoLCvx +GsWe8XnBru8aH9O2kCO4iigCphOpzaSORJH7rcuo/mo6jGvJER4J0RkjK2KMX7W/ +TFQmpR+8Sxaw+einVEQBDppcbBhOO7yAHq3TQOa01pxIQJ2togJ0Sl3pUiYeqPgf +aITyRfzhyh+zEb7V49QOIohvazZA7gnBmgUW8xF9cfTrChsxKV8TxovGc/cHroy9 +JI8XkJaZbX1GlbIUqTKgc/MF01gXXVTyjbnQ6HtCNG4BAq3hsWDnoziodGFojn/+ +PiY9cLok8Jxy6nzV0ANLunfbNF2usjPEDFxRviCSS3NoBXhq0+Ra/MXljKB46lb5 +qkfBdsAF9IJ8Bx7knrLbpVMe8tciXcXqorCfEBZONNk9RL5OkuDQgPQXi/2sRXXN +xxIpxkDf63104NIypjEjp5c8WkD+VF84BhNuhYsp50T2hfgtL39vOGaQ2593Rss1 +j8MNLO2xlwoHiJoTe3CFw/Yl7MtjJSxiaQ0v42JRxyjclLDX1Rc= +=CMMm -----END PGP SIGNATURE----- \ No newline at end of file From 113f50f95d20b77371ce1a6c0ecba7ca583e4504 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 26 Feb 2024 17:02:38 +0100 Subject: [PATCH 465/478] Update src/intl/en/glossary.json --- src/intl/en/glossary.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/en/glossary.json b/src/intl/en/glossary.json index be20e714e91..d50cd73a4e4 100644 --- a/src/intl/en/glossary.json +++ b/src/intl/en/glossary.json @@ -238,7 +238,7 @@ "ommer-term": "Ommer (uncle) block", "ommer-definition": "When a proof-of-work miner finds a valid block, another miner may have published a competing block which is added to the tip of the blockchain first. This valid, but stale, block can be included by newer blocks as ommers and receive a partial block reward. The term \"ommer\" is the preferred gender-neutral term for the sibling of a parent block, but this is also sometimes referred to as an \"uncle\". This was relevant for Ethereum when it was a proof-of-work network, but ommers are not a feature of proof-of-stake Ethereum because precisely one block proposer is selected in each slot.", "on-chain-term": "On-Chain", - "on-chain-definition": "On-chain is an umbrella term that includes any transaction or data that is available on the blockchain and visible to all nodes on the blockchain network such as mempool data, historical transactions, and account information.", + "on-chain-definition": "Refers to actions or transactions that happen on the blockchain and are publicly available.

      Think of it as writing something in a big, shared notebook that everyone can see and check, making sure that whatever is written (like sending digital money or making a contract) is permanent and can't be changed or erased.", "optimistic-rollup-term": "Optimistic rollup", "optimistic-rollup-definition": "A rollup of transactions that use fraud proofs to offer increased layer 2 transaction throughput while using the security provided by Mainnet (layer 1). Unlike Plasma, a similar layer 2 solution, Optimistic rollups can handle more complex transaction types – anything possible in the EVM. They do have latency issues compared to Zero-knowledge rollups because a transaction can be challenged via the fraud proof. More on Optimistic rollups.", "oracle-term": "Oracle", From 466368fd8e852151f37376e542984b1474a9acb9 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:19:59 -0700 Subject: [PATCH 466/478] Update public/content/translations/id/developers/docs/apis/javascript/index.md --- .../translations/id/developers/docs/apis/javascript/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/id/developers/docs/apis/javascript/index.md b/public/content/translations/id/developers/docs/apis/javascript/index.md index c780ef969d1..6c2e0446e67 100644 --- a/public/content/translations/id/developers/docs/apis/javascript/index.md +++ b/public/content/translations/id/developers/docs/apis/javascript/index.md @@ -6,7 +6,7 @@ lang: id Agar aplikasi web dapat berinteraksi dengan blockchain Ethereum (yaitu membaca data blockchain dan/atau mengirim transaksi ke jaringan), aplikasi harus terhubung ke node Ethereum. -Untuk keperluan ini, setiap klien Ethereum mengimplementasikan spesifikasi [JSON-RPC](/developers/docs/apis/json-rpc/), sehingga ada keseragaman kumpulan [titik akhir](/developers/docs/apis/json-rpc//) yang bisa menjadi tumpuan aplikasi. +Untuk keperluan ini, setiap klien Ethereum mengimplementasikan spesifikasi [JSON-RPC](/developers/docs/apis/json-rpc/), sehingga ada keseragaman kumpulan [titik akhir](/developers/docs/apis/json-rpc/) yang bisa menjadi tumpuan aplikasi. Jika ingin Anda menggunakan JavaScript untuk terhubung dengan node Ethereum, dimungkinkan menggunakan JavaScript vanilla, tetapi beberapa pustaka praktis telah ada di dalam ekosistem yang akan membuat proses ini jauh lebih mudah. Dengan pustaka ini, pengembang dapat menulis metode satu baris yang intuitif untuk memulai permintaan JSON RPC (di bawah tenda) yang berinteraksi dengan Ethereum. From 731df9c4dbb365a8a49636da81ed278ddb50c12e Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:07 -0700 Subject: [PATCH 467/478] Update public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 1cadc084ba2..653f0ca5d46 100644 --- a/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/id/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Sumber kode untuk tutorial ini bisa ditemukan [di sini](https://github.com/EthWo Tutorial yang mungkin juga Anda minati: -- [Menguji kontrak pintar dengan Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) +- [Menguji kontrak pintar dengan Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) From 36d2ee30930e032901d720ecfc5285ba1ee5176d Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:13 -0700 Subject: [PATCH 468/478] Update public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 9ebabc03766..87c55672021 100644 --- a/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/it/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Il codice sorgente di questo tutorial si può trovare [qui](https://github.com/E Altri tutorial che potrebbero interessarti: -- [Test di Smart Contract con Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) +- [Test di Smart Contract con Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) From fd4a1f46058aee6c6d6852a8a89212195b18f97b Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:24 -0700 Subject: [PATCH 469/478] Update public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md --- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md index c22edf45590..0a00b551d84 100644 --- a/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/it/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Hai compiuto il tuo primo grande passo verso il test dei contratti intelligenti - [Testare ERC-20 con Waffle](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: simulazioni dinamiche e test delle chiamate del contratto](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Tutorial Waffle Hello world con hardhat ed ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) +- [Tutorial Waffle Hello world con hardhat ed ethers](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/) From 1dc498dbd331675f31414cc6c9d2edcf1bc37516 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:33 -0700 Subject: [PATCH 470/478] Update public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 9f979ee9a43..f9dbf6311b5 100644 --- a/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/pl/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -294,4 +294,4 @@ Kod źródłowy dla tego samouczka można znaleźć [tutaj](https://github.com/E Samouczki mogą być interesujące: -- [Testowanie inteligentnych kontraktów z Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) +- [Testowanie inteligentnych kontraktów z Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) From 02e21251f77961257f7c41832bfd20355bb8c62e Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:39 -0700 Subject: [PATCH 471/478] Update public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 4ef4f315eac..651f49afe6a 100644 --- a/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/pt-br/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ O código fonte deste tutorial pode ser encontrado [aqui](https://github.com/Eth Você pode também estar interessado em: -- [Testando contratos inteligentes com Waffle](/developers/tutorials/waffle-test-simple-smart-contract//) +- [Testando contratos inteligentes com Waffle](/developers/tutorials/waffle-test-simple-smart-contract/) From ed46787b39ccdc0ac26a0edc725f41a76898ec08 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:53 -0700 Subject: [PATCH 472/478] Update public/content/translations/ro/developers/docs/apis/javascript/index.md --- .../translations/ro/developers/docs/apis/javascript/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ro/developers/docs/apis/javascript/index.md b/public/content/translations/ro/developers/docs/apis/javascript/index.md index 7232134fccc..2e8de5c88ad 100644 --- a/public/content/translations/ro/developers/docs/apis/javascript/index.md +++ b/public/content/translations/ro/developers/docs/apis/javascript/index.md @@ -6,7 +6,7 @@ lang: ro Pentru ca o aplicație web să interacționeze cu blockchain-ul Ethereum (adică să citească datele blockchain-ului și/sau să trimită tranzacții către rețea), trebuie să se conecteze la un nod Ethereum. -În acest scop, fiecare client Ethereum implementează specificația [JSON-RPC](/developers/docs/apis/json-rpc/), astfel încât să existe un set uniform de [endpoint-uri](/developers/docs/apis/json-rpc//) pe care se pot baza aplicațiile. +În acest scop, fiecare client Ethereum implementează specificația [JSON-RPC](/developers/docs/apis/json-rpc/), astfel încât să existe un set uniform de [endpoint-uri](/developers/docs/apis/json-rpc/) pe care se pot baza aplicațiile. Dacă doriţi să utilizaţi JavaScript pentru a vă conecta la un nod Ethereum, puteţi să utilizaţi vanilla JavaScript, dar există mai multe biblioteci utile în ecosistem care facilitează mult acest lucru. Cu aceste biblioteci, programatorii pot scrie metode intuitive şi scurte pentru a inițializa cereri JSON RPC (în culise) care interacționează cu Ethereum. From 8c4942b6d2b140d8cf94457093167cd8639d14c1 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:20:59 -0700 Subject: [PATCH 473/478] Update public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 62cdacbc4a4..35e6377fd9b 100644 --- a/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/tr/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Bu öğreticinin kaynak kodu [burada](https://github.com/EthWorks/Waffle/tree/ma Ayrıca ilginizi çekebilecek öğreticiler: -- [Waffle ile akıllı sözleşmeleri test etme](/developers/tutorials/waffle-test-simple-smart-contract//) +- [Waffle ile akıllı sözleşmeleri test etme](/developers/tutorials/waffle-test-simple-smart-contract/) From 99fbec4cef543af9c5468020c74285a0b4be301f Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:21:06 -0700 Subject: [PATCH 474/478] Update public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md --- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md index f9347ba7288..20b01d0d49e 100644 --- a/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/tr/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ Waffle ile akıllı sözleşmeleri test etmenin ilk büyük adımını tamamlad - [ERC20 sözleşmelerini Waffle ile test etme](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle: Dinamik taklit ve sözleşme çağrılarını test etme](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) +- [Hardhat ve ethers ile Waffle'da merhaba dünya öğreticisi](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/) From 7408fee03e301326e6206123884ed05c40a68d24 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:21:18 -0700 Subject: [PATCH 475/478] Update public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md --- .../tutorials/waffle-dynamic-mocking-and-testing-calls/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md b/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md index 44519664b42..247e3df0df8 100644 --- a/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md +++ b/public/content/translations/zh/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/index.md @@ -295,4 +295,4 @@ Waffle 的文档可在[此处](https://ethereum-waffle.readthedocs.io/)获得。 您可能还感兴趣的教程: -- [使用 Waffle 测试智能合约](/developers/tutorials/waffle-test-simple-smart-contract//) +- [使用 Waffle 测试智能合约](/developers/tutorials/waffle-test-simple-smart-contract/) From 87326188e33e62a3e3d31fb199d1722bc6ce5ffb Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:21:30 -0700 Subject: [PATCH 476/478] Update public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md --- .../tutorials/waffle-test-simple-smart-contract/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md b/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md index ac2092232b1..cd99b2f1dae 100644 --- a/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md +++ b/public/content/translations/zh/developers/tutorials/waffle-test-simple-smart-contract/index.md @@ -200,4 +200,4 @@ it("Reverts when Vei amount uneven", async () => { - [使用 Waffle 测试 ERC20](/developers/tutorials/testing-erc-20-tokens-with-waffle/) - [Waffle:动态模拟和测试合约调用](/developers/tutorials/waffle-dynamic-mocking-and-testing-calls/#gatsby-focus-wrapper) -- [Waffle 使用 hardhat 和 ethers 设置 hello world 的教程](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers//) +- [Waffle 使用 hardhat 和 ethers 设置 hello world 的教程](/developers/tutorials/waffle-say-hello-world-with-hardhat-and-ethers/) From 9af2aa6496e8407bcb9fd14f6c7fc3b9f248ba38 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 12:21:37 -0700 Subject: [PATCH 477/478] Update public/content/translations/id/enterprise/index.md --- public/content/translations/id/enterprise/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/id/enterprise/index.md b/public/content/translations/id/enterprise/index.md index 6ddfd32b2e0..2a2b5928d08 100644 --- a/public/content/translations/id/enterprise/index.md +++ b/public/content/translations/id/enterprise/index.md @@ -33,7 +33,7 @@ Banyak bisnis dan konsorsium telah menyebarkan blockchain pribadi yang diizinkan Perusahaan telah bereksperimen dengan teknologi blockchain sejak sekitar 2016, ketika proyek Hyperledger, Quorum, dan Corda diluncurkan. Fokusnya terutama pada blockchain perusahaan privat yang diizinkan, tapi sejak awal 2019 ada perubahan dalam pemikiran tentang blockchain publik vs privat untuk aplikasi bisnis. Sebuah [survei](https://assets.ey.com/content/dam/ey-sites/ey-com/en_gl/topics/blockchain/ey-public-blockchain-opportunity-snapshot.pdf) yang diadakan oleh Forrester menunjukkan bahwa "Responden survey ... melihat potensi ini, dengan 75% mengatakan bahwa mereka kemungkinan besar akan memanfaatkan blockchain publik di masa depan, dan hampir sepertiga mengatakan mereka sangat mungkin melakukan itu". Paul Brody dari EY telah [membahas](https://www.youtube.com/watch?v=-ycu5vGDdZw&feature=youtu.be&t=3668) tentang keuntungan membangun pada blockchain publik, yang (bergantung pada aplikasi) bisa mencakup keamanan/kekebalan yang lebih kuat, transparansi, biaya total kepemilikan yang lebih rendah, dan kemampuan untuk bekerja sama dengan semua aplikasi lainnya yang juga ada di Jaringan Utama (efek jaringan). Berbagi kerangka acuan umum antar perusahaan menghindari munculnya sejumlah silo terisolasi yang tidak perlu yang tidak bisa saling berkomunikasi dan berbagi atau sinkron satu sama lain. -Pengembangan lainnya yang menggeser fokus ke blockchain publik adalah [Lapisan 2](/developers/docs/scaling/layer-2-rollups/). Lapisan 2 terutama untuk kategori teknologi skalabilitas yang membuat aplikasi throughput tinggi mungkin ada di rantai publik. Tetapi solusi Lapisan 2 juga bisa [mengatasi beberapa tantangan lainnya yang mendorong pengembang perusahaan memilih rantai privat di masa lalu](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). +Pengembangan lainnya yang menggeser fokus ke blockchain publik adalah [Lapisan 2](/developers/docs/scaling/#layer-2-scaling). Lapisan 2 terutama untuk kategori teknologi skalabilitas yang membuat aplikasi throughput tinggi mungkin ada di rantai publik. Tetapi solusi Lapisan 2 juga bisa [mengatasi beberapa tantangan lainnya yang mendorong pengembang perusahaan memilih rantai privat di masa lalu](https://entethalliance.org/how-ethereum-layer-2-scaling-solutions-address-barriers-to-enterprises-building-on-mainnet/). Protokol Baseline adalah salah satu proyek utama yang menentukan satu protokol yang memungkinkan kolaborasi rahasia dan rumit di antara perusahaan tanpa meninggalkan data sensitif apa pun secara on-chain. Proyek ini telah mendapatkan [momentum](https://www.oasis-open.org/2020/08/26/baseline-protocol-achieves-key-milestone-with-release-of-v0-1-implementation-for-enterprise/) signifikan sepanjang 2020. From 0de3db3360ec70d856d6325b85aec61b6392c7c4 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 26 Feb 2024 22:35:34 -0700 Subject: [PATCH 478/478] ordering --- .../docs/data-and-analytics/block-explorers/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/developers/docs/data-and-analytics/block-explorers/index.md index bd9b317a2e9..c9914e920e2 100644 --- a/public/content/developers/docs/data-and-analytics/block-explorers/index.md +++ b/public/content/developers/docs/data-and-analytics/block-explorers/index.md @@ -14,7 +14,6 @@ You should understand the basic concepts of Ethereum so you can make sense of th ## Services {#services} - [Etherscan](https://etherscan.io/) -_Also available in Chinese, Korean, Russian, and Japanese_ -- [Ethernow](https://www.ethernow.xyz/) - [Beaconcha.in](https://beaconcha.in/) - [Blockchair](https://blockchair.com/ethereum) -_Also available in Spanish, French, Italian, Dutch, Portuguese, Russian, Chinese, and Farsi_ - [Blockscout](https://blockscout.com/) @@ -26,6 +25,7 @@ You should understand the basic concepts of Ethereum so you can make sense of th - [Sirato](https://www.web3labs.com/sirato) - [EthVM](https://www.ethvm.com/) - [DexGuru Block Explorer](https://ethereum.dex.guru/) +- [Ethernow](https://www.ethernow.xyz/) ## Data {#data} @@ -233,12 +233,12 @@ The consensus layer top-level data includes the following: ## Block explorers {#block-explorers} - [Etherscan](https://etherscan.io/) - a block explorer you can use to fetch data for Ethereum Mainnet and Goerli Testnet -- [Ethernow](https://www.ethernow.xyz/) - a real-time transaction explorer that enables you to see the Ethereum Mainnet pre-chain layer - [Beaconcha.in](https://beaconcha.in/) - an open source block explorer for Ethereum Mainnet and Goerli Testnet - [Blockchair](https://blockchair.com/ethereum) - the most private Ethereum explorer. Also for sorting and filtering (mempool) data - [Etherchain](https://www.etherchain.org/) - a block explorer for the Ethereum Mainnet - [Ethplorer](https://ethplorer.io/) - a block explorer with a focus on tokens for the Ethereum Mainnet and the Kovan testnet - [Rantom](https://rantom.app/) - A user-friendly open-source DeFi & NFT transaction viewer for detailed insights +- [Ethernow](https://www.ethernow.xyz/) - a real-time transaction explorer that enables you to see the Ethereum Mainnet pre-chain layer ## Further reading {#further-reading}

      M2>x<%EyjQGWcOqW=!8%%1 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È_v#Ua7t}f-LKdE(FF31*kj)X{-rj- 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 E0EBE3r~m)} diff --git a/public/manifest.json b/public/manifest.json index 3c81fdc3d60..1144f0a3838 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -39,18 +39,4 @@ } ], "description": "Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.", - "screenshots": [ - { - "src": "/assets/manifest-homepage-screenshot.png", - "type": "image/png", - "sizes": "2048x1734", - "form_factor": "wide" - }, - { - "src": "/assets/manifest-homepage-screenshot-mobile.png", - "type": "image/png", - "sizes": "1290x2195", - "form_factor": "narrow" - } - ] } \ No newline at end of file From a64eb3fef1e174b5eb7e377156bcc3223d554523 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 21 Feb 2024 16:43:51 +0000 Subject: [PATCH 405/478] Update index.md --- public/content/web3/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/web3/index.md b/public/content/web3/index.md index bfef73ace80..b9834fec636 100644 --- a/public/content/web3/index.md +++ b/public/content/web3/index.md @@ -98,7 +98,7 @@ However, people define many Web3 communities as DAOs. These communities all have Traditionally, you would create an account for every platform you use. For example, you might have a Twitter account, a YouTube account, and a Reddit account. Want to change your display name or profile picture? You have to do it across every account. You can use social sign-ins in some cases, but this presents a familiar problem—censorship. In a single click, these platforms can lock you out of your entire online life. Even worse, many platforms require you to trust them with personally identifiable information to create an account. -Web3 solves these problems by allowing you to control your digital identity with an Ethereum address and ENS profile. Using an Ethereum address provides a single login across platforms that is secure, censorship-resistant, and anonymous. +Web3 solves these problems by allowing you to control your digital identity with an Ethereum address and Ethereum Name Service (ENS) profile. Using an Ethereum address provides a single login across platforms that is secure, censorship-resistant, and anonymous. Sign-in with Ethereum From 05d1c3d276b1fb64173b59681fad1c3e31118b33 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Wed, 21 Feb 2024 16:48:33 -0700 Subject: [PATCH 406/478] Cleanup --- src/components/StablecoinBoxGrid.tsx | 14 +------------- src/pages/stablecoins.tsx | 15 +++++++++------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/components/StablecoinBoxGrid.tsx b/src/components/StablecoinBoxGrid.tsx index dd1493c2471..b740677a307 100644 --- a/src/components/StablecoinBoxGrid.tsx +++ b/src/components/StablecoinBoxGrid.tsx @@ -206,18 +206,7 @@ const GridItem = ({ }} > {isOpen ? ( - <> - - - {title === t("page-stablecoins-algorithmic") && ( - - - - )} - - - - + ) : ( <> @@ -228,7 +217,6 @@ const GridItem = ({ {isOpen && (

      tUGZR^dins2q095!#v5 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 +%O#)?0K9uinf1R`kvG#WZiS=uIFp`Ec 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%0Dc5_8Q1Dk5yt^Z&Y6Q+#enuKBm z4Vc+w^G8B<$IWrcFq0yN*N1vg4~3t*`xOAs{&=|+a|OUH*UJJxpX>^N=p3k#EFIsJ zL8;wG{R01*xg)v`WtbyJ8g0X-gSKVI9y`&c(aHyOv$^v}+htc^UU3Rm1vHNagv#Qq zpQ8_8e^r;&y>kM{iDt66QcXQ>SYLxu>K*MFp!7?jNnM4}z z?^0Pag!I|TC8VA3MUFG_|w3e?K_W9&nGz9GYAvdSU;*d=51#rWAuQ2C1FJmY@@|wB~G9ycWO&Pg2G=Fkx=4_ zpCp)UW^+}W|1#yN0F7Nbf$t~&X;&`iiDdkywl0rTT_M2}GG~et@ifPfAapMl4<31J zv%U59KKt0slei{jB4cmXen`Hj5(R*l*K!p=3#agB*#!#*a0fgvNGslMW;}fGp;d%e z+6Cv&w7Fap*0($q@N&5muZ8|(@vaHyF>EN@!n z-tBhh9XH#&b1STrjYeUwF?z+yefHSTH)F-1E7vPcwW-tkg*?D%B;5D|R-B3>krLvR zTc^2?JPGr0n`csdR!;7x_yF>DOum|v3b4%aYZwwdhn+Qa?@9426vq0TkIqQ*hZD?^ zTdC^?<}6i*8te$C)f%ww*Ub7_V_qra;P7D;+?_taEuxi`^<+F`16JL%vdYR4UuXLj zRv#o{A*ZTr$z}djhI}Pge3L8cHgGrgWCY&RCJ(YQlth$=@Nt}+5K13oNx;%?3Q$Ca zi#A!B_>_;+tFUZ^arB;CE{^2C;$v$tdOQaYD3~@edh5z zC0qZDIN+b-0hLDX^mOi{4(AjXcm;kbD3wXy2?aqeOr7GS@RU~1gjc*LoboZwRIc}e zmrvRGtuUX+t8=)%9OpvB3!?zQu~T^NB_gD9d5l~UqQ6QYqCIv7?x2V-1(zdL9b7@X z$6k1To4vDg3u}m8cG1EK%rQsWWO$@cDc6{EZOqY2X`}bk3qUkRDzmKK^d(f1XJW za7E!ga7pbb{8C_w8uOq81DYzGNA(!-q3yWJCbC07I;Om zGYw-~M%2mUm?+k@Y5t@(#Cvs-LixB z{6macGy2-qx6iSXZl(72OWSS5Yis?wg7NI7&E$%Zanpt{W-^9y?cnRrZM3(Z+inXM zOtgzHAB+5OJ$q3{Y|_lhcEL60Sl?kBh(LZNd6Qb2Jt&NO4k@DXpF5 zk4~@wlfH$z{^ZnQiFw_RA6|p+PX@-*lR?{+RLiK?qla;NfMw;Ir|-*NlD|NHf5NB8ke)R5&O zU;Vz96LT@S!-VI?&F%KhZ$8N>o@V<58+lh>J&w~lfrIGr!CmC9_?k#HQNBkX-E3d~ z`pYaX=h&CNG?P1YrTJM8-7CrgCC1Z4`=mP!LO zUbT8Flh!>p;hf>NaN$%x?UZm$_=qm)UEm7C6Hf9^aSFo=Vmp;MAe`?LwME~={@Y={-c=Et3t4> zJ4pxH_T7hV?S>6DYV2^kn$4J=n%HNwR=$N!v{wZreDxGBr0-5~J#vPI(>$93;V-_F z5>FFmr4Aj&tnvOsn198@a8oOPEpBpH0?jTAS}oeZU}K_)`^y`!2GDU7)^Wcv=7-E;41d;IBlZ44*u zzWBup=r_h7)$WSpc}iK8pfC5mCb=f5K9Ph(F<=I)D194fd_Czse?vVFBPu?%8`E1ppz; zpYBs${PI@&`q!SL{}^U}{nxixUnW*S74te zae&j_ui90Y&O?Yg);G_gW*{NtQ)XEj!6@+3=ZEKnq+FJvJgxoreNIU(ZkJ zjxb;O!4IBsVef^q0Knz~hud)~7x%!@_pVxflq&>u1;FK8`O^owsVs^UPVo*LsCEkg z2M(YBa7SJNK-L|$023bke5s4Euj&>?tmeGg(fLIcW z=yd&dt}T$caowL*g5ro2r0OxjeC%i~3aGLG(1W;K&p_We6stOAC_+}EY;@pI71oVp zhQHje3{Xkb7wL4R%=hb*o$gr`KWLMsqF*0`d(=PW?$wJ8ez&iz;#2Rm#~Si$sH^uY z2*!-yZc`SCP9xz8PK`|`Fcp0iv(d*r&Y=Em(o%mOOEmsX(DB2rr(Y1hT9)V$3m)xW zOL$t3qV5KJ@W-pIrG0=+TQJAU2Ul1}w^kO#oPcM;qc4gavZCSlwF?6E?XA@LG$BC^ z6Qqz%5||WR@QnUl_X!qRQ_V>`hEnXlT?cLF)@{`DUQSr{vTLuNY1dyng_Aa=))VFC zZf=PnYEirt1>xx*3AjpE;Bm@lignsk4L3^UW2L$^DMwUsEy%|8$Lxid*4vwJZ^ghU zS6lS!XX7WIW8)?c;TowDpA&Q*>w%T%lA$7{z6S2be(s^=R@B_hZnf;nN<*j6C9;@WeO$Bh2#N+7&r=U}U-T&ABBdp}~ zglpjaI<5`b$rz+l*n8ON&HfbGFvYOks=BCGsPZPI1xbcpttipbYcFBxkPo1VZyT;n{UP% zZM(hj@PS%13z9x|5c5p z$!S<89L(Icfd7RqQJc9s=lPfSW48ZoyXx}scKIdaxH^jaxeMkqiYUCKNV*5>9^bov zDF<5i*xh%1jCFrr0YLFKZLPOwp5Kj_NSX8br(mmcah|v5qVi}SA}ct@nJ2d~k7=-j z%p0n>QmYY5f3j}Wx4aL0)sH#eFsx4WaZ3k9lCP;Cay)bI?h*NTfPeq8KZ#c(qm-SX zMOj2k3DM2oUbEjeZaGXpI|OCe0VpcyAVWCEEqy30e+ibt3WDN2^H5kS*Qs&|(Jh53 zmyEP}?d0zsXZjHWz&JIX<5Q5olBPKEq?a$qxZpJxFJ&h%%BB#e!p@ea(BJ#Ztc-#o z=V)cPg-_I9PGIGsR{#+0R3ATkWEWNo*JCxH zhu!ttlWqQj;V5GT9-^aKi`KjQ_cz$Tetn6pTg~-Kx6I%QfT1Xl%IZmh6Hp;1=kI(3 z5cf(vC$HoL-#_szOdbjNP4H3zo(?htoxINsJJP58&J^c8)1Q(@ikqJA1uw-p^?9~5 zXY)Tby}m^f(aPzNd7PSF--YoM?Npab;{od5qhfUZ;rey$_W0xP*pkItxK^yj=1d=C z*KoS`ymJRJ-)tf8R)!wtoc>P$s7b~PZI*jYD)U_BX~h|^<(v1Hya=gwd#P2|_d?mK z&Ypj13swM;dk-qItFN7B=U*_wMvd<4R~vWl5p#wB3p~#QaM`PJ@LcfEk5rkT!aR@{ zoRWI^J#987@Gkt*u;}9;5q%1x_#QXlCE9yRkC*{Xc_iHMKFwuu9PX*{(|49ACEHsO)rDm=k0gq0=pM{e$u z<#%d)eJ8)dbf>~gaSHvDUoKr%PHp~Ivz~wEsXg}NAFj2d_4RE0PqMiej<*3Ldija` zbf`yzCbKaPU9vwRp(FToMMx&T&=}`z%UoacJ6Zme0>GMA_uETczdjL5Fqhpj)k?WO zdheDhtn?nR;*wrAmNjw3NMzN;07F(-wZGAxdFXXJyrl(epbL?Ec43bC3UZ=WJ8#i> zw(v?60Jx&_I4x50xs#a7X{m3q<WG|=EOE8jOAzi})K&AlD+I9li!ukjVl(il+(q@&<~- zNHJ3!g{UwB@3hbt3w@atQ(WaO|5Ni1+=w98321nEejXHoao$aE!nBg$wmWdj%0E#< zl`S)eo37>nl_rGh8Jc8iG?5-Fbe| z#dEm(wcO463P&%J^2wa?R#8+&wLwkFqW=n>2-*a~ikHZvu;!4XjTwQMz#7x<>zpMNb#*QoLUIQ zJA+d_q`Hk~=Y-w|kxnQ0MTOlvTkOAn>8ExWMT)!bp3T)CGdW?($>ftQ)F)~6pFhV- z>1a16PqJy#(c7MRZj=4{y_kmF+h`xZ{XF~hr{}QAg-KS?!Q&||HHC-pN|*?iU^@M2 zs0!=O&Y0Ir%E;p=eWa37g#PI}@w4Enou|A=;xIff;;F9GM&$Avi~0tx5{eJ93RN!o ztd(zkYpim-2=)5OB6&FPdMZD~aZIyvr+l^9Ea8eazn0R*|G#g(X!S?U{_B6c)o%FM zV9fsth%m(ImBpu90N@IM*W3cYCHA?`U&iS`g<~Ex!#A)KGNOraFnj))E%tBUT*7I& zllHkUTxoaz&Y1VM0N@F!2ZV92E!}GW@b^!$QP$o5`G0-c#*WV{0I1M87w@V!)$7ik zRrar6eZijp`8xaBSO3Z`y@q?tP*l)Z?v4jd!~Zs}KVaX#?=?)y*V@1Q%crfpKW&ck z5b9BdN-A3_qWt6{OyPX!2M_&I**%TEv$%q%sud12YxmEpI?@YZflILS=_4@uzvvs( z=cI5i4?oIIe-erWCXp^}E^9-h4auou_C(+-Veo6qciE~{tL>r-W^iI#3IJgNAj+H3 zEWkKSy>|A^0zZ^Tj(`q5zJjNnM)<1ia;@}lGE2W3>nr*@iojE+NqhDz;hxCBHj+D; zhYsz-<}QM6%H9P*cbKID~hP?yfXj91vS)`ruvrRzAQRm&#RXq!8mYj?Q&)XPjVJx>t-<;9rVe{rdO^dk#U z02t=?1gk@++}mKUF4+`U0Ni{5eJ67p@)CAOxd;4#2cAO#fGYqNOhO=5PM$&}@RwQ4 zqYYbcq;F765bwfZEP&SO6Hx0z1Bk^qXOAdu^$I59R^a$u5#xHp(KRx&d79zf%My#r7wyit44;{PbBSysO zn`TT0A3Drc6U_)(_$S5DcIv(qC5us~Q z>1*qnImz6_ral517JgCB9SHWYNCG`|&6V!d?cF=>30H~LKK+z`RV}Cbi)`Fzlo3!~ z(#ETt`fZJo%?R`*cr3z9k6UN(n)N9E`QsFbdX`c}sJv@kbJFMD_usePo_uoK zhkGhpXw$pxNlweITYJ#D_w3KTx#MlhtSMMc-~=)X3OUJ~vd*%nRXcT5#%AXIiywQ- zy0RYp*fle_0zei3lusnkyvQA&>I+Vu*6ehzx)a){CblH?Ngqq4pbH=YH$|s@`<&XQfL^K6$>dbDo7h9 zQu5WtrZ!*G_^h}oha7$I`^~z9QD7nEmpaCb9jqB!TXp(wAZx}Vt2$O~?Z=yJaQ{+H zsFrgr4RVDbOoo1EIN{kTf|p$a%NFP)1@Kmm$7Bn=#TObGicAW4hwxheDDpcsXoR$W2ViTIh?h5$h8XRDzX5ul*25KKK`a% zx@e?bcJbIVDgX$mmc+aEG+`-b2}-4vT+x_U0En^I=${T_0bm;n8|`-eb(2s~@9)Em zcrfPKATLs>WA)-f$tZSwI`#!WO2?<>pGqIC7>}&^t7lbm_orZ@O)8%&Y2cx(JP!gy zAN4~m+=X6O$LZv~NBqjH>gsCd7bn>C?}d_Me;YG;D04O`H(=ghi(_S(;prcR@9yzy z_)$4Lnm+QYYZ*jg*o=I-tiGwc^GX(D`j<;MdODa&TK|~8}G6)OJXOS&?IrzzFAv~Na zJVlp8H_uL~loTf%W9-hy^YVJAegrt^8(zQ?p#m%VG!%{N+HCjsMtkb)0lDDwHQdb5_}^ePMr z{g6!;lb`|lMy;-3+TUs~aoFqWA1$`_8We83am@u5$)-#jZW?ckkKYR{-34+c>-Pu5(yx#$kd)vn=W+dhiHWy<{|i{ayyi)+=cM-z|>Cor#SoxuP9^qCmbS2#mnA! zMxT-SW$A>YP**$DzeH0#BM;!G&MH9puhQvH{ddZPf(WWj96#&Ze2AIU80xX|!*;t-^rH9Hb{5qJ2cj;PeEhl=}mhJWS z>@g&C=x*7=k-iFFJB&Ynn*O5m{ciPKs^PO!Z_Bn0%8MRd9( zddZWx!b`8hGiVxoqrJ&@R=3){Sk8TO=>Z!)VUS&V^9-9X9oad1c^xi827vkk=3+Wf zAS=x5bo+iwR~W*l*34m8)xi_m_fR9~YE8_0S1;aY%O2ls6VDxBmws%DRSZO7HN#*0 zskH4}SE#FcPquWmof~WHi66aSJ(|nx&W~TnRU+;7=+B?EIOjD&2 zjPS~!L)7Mc8(OW3qYWBmstK=7cj-?Al6lTH7COgRK=tHgt4_Ce=LCROFDWTuf>8v~T3nO17iK_vkf#I|>QuV1fJ)Ci>|kfL^h7jmvgx#$ zHr{&ncbh4zt~rgB1u?8q2qxsJpcS|HhsAJV%ALi>}RK<1ycfz@+m$Do*JN!aC+wPCpOvt{?_9* zddwL6^FRAIRt0o_Y}9}1*wvV1+E@2o-Fx3Ed*X==cHOme?TcTSOMz-`pfzot5&HiwB-Kb;+um zg9jV!&9}C)34V|}g}T^C(oQ%>ClotanAW37*asZiFGY^Ue0|yX#qWG-GOTnvKE4^hvHYi0&+QPJ$NP5!~3u$$=Wo zGFMvVzN6gjh^BJ467oEOsX$D_u!+;BPcgJsduAh!`jAuKq`DBC7EWhqan`3#Ddzeb z_-k~2=+&#l`wsDi<{YAl(u+Rbk>04EP+8P}sZN@j8l1*G^bK9xSWv0I>`lL-4GC9Z z@Z8}W`o3Nz#hyTLMSh(v?_$X~N^(Fr9(E|$$T}$nWN8h%4zx}E$m^Y10=?gh!A@i3la9zOk zNfZfl3u5xo=6~z)BK!6|OYDa~e%Fe7SJ=!^jaM;92S`;|Y;V?@djOUiMz}qk^M$*$S_zJQ_39C!avbCjJvI zsZPY_O~6*1QtDRx+63Jd)~8Ro^LzENV~$(z-n!Ene4McGCOGOOhx&7sS^4)a;lv>0 zns~aKG;=70_?*gh*e5hbLTkZM-s($w_tr+BPNLHHqXgBxM~SWC4&Wc%w-~L&KK93d zdWT(nWiKWes%LQ#j)(ZI7L)vc``14X1%OXoh6RAjK9B`~=bx2=!4giLbhj`5-nI6z z+nFT2*A)P&4E|bBLVNM~jaY(s6qDR#_K*McWz4(l&R>v8xCyz;iO%AoW5+o0^VDwp z>OVYWfAcqgXjfc+W(xo+)4DbL>^t`?M!~EK3pZb|u@lh1JW)ko+~zbB9=aMslQ%J{ z^2it+8b{mH_}_!Jt2Qp7gz8s3AwE%CmQ&kQeATPklIq^$($8zok@}@5gLqkEz4~S9 z6Q?$#w${vMq{avJZN!4dG!J58i6Fd|J3NJ_;_1|T;EEz0d?=xE*RDO_o8w&hP=#L` z*D4HgGjAI=?%`y?0hHDzBg`CTrI-^Bo!xxnJOo$+nJ0we$B`rLjK90EPISPoxf%tiA@Ci^VLLRJ zJM4!KJnPrKEL=F5CszPu^Ei>Rnmce`UA7y`0;}wEpScOe3FeB9V}`S6#{d2MkNFh< zhY(8KcH8wReP(k4!j`|W%@qLV&!1zS`7oWG2x7zdZNLMh))=UCW_cY}kl%V(ta4h#Wi=Ja;PpeVCN|j}ANN64YX_P=!0nT2pM_ zTE|$j%$|N>qs=-03Y&ZJcshAbq;jQ5OUrTQAYB=si~TATDM?X%&|iP*i|Jev&kADV zBZq#rAL>cz6ql8|`fF|WG}fH3-J6ft`ghjbuB{uaqEA;gyrA}HXr%E&;SfQk1z_4Vys z6}HP3FO|~fAsdRtsp%*^U2*j!TexTlbP&x%f8p+EdOsf+tB!wFm)en!0A3d9+q5)w z*y?v0uwb;pUU_A$9XilrBZrN)h3B1XvuBL4A)K-(Vr}C*A#H)eD*2UAN+pWIGD-zB zh~CO3$J5M-US6`AlZu1vuHTts3ohV#E>3OeaEYfB9tp&+gvYNlaS$(l1Nr!sk9bE< zcm@X0_^yrrM&uU9svDT^)xZ~6E9+nGR$0n8A>0!IR0ujxua^Hfq>0k1vY0AjEd~n! zdyZg%rwQvtgZ;{xV_XN*SYOTk)Fn1zXn(9upe$C<9|Q!oB)OnbdefK4CS`nW{!3}B zh4pg>YnASdKic>&$rQ+(jh)Xx#Az)ka%843c-d=S81%NH^pVu?OMCZW z9x>3yjv0YMXFtl1j0vSIz&k95=SVnuzn&lEms}LczeE}Z=~-Xj!Pu~a0~NJgu~csT z`}IU2s~!chdY9=AL@}ngSQBF@G-vWI1`AoYXyq^DMcr5{OWui$gnyDRYfj$O)a>=9 zwVHTJVO~AiI8`_=m%r-l1PWp5YY-pM-)e2ex*Q>U)Th>ix>ixLIL+@g-;T`IWUPyqeZY4tyzH*Xr2`|y02@8#qBXnmDDfzS3f0EZp9-w!@*Su0PFO|(@ z0+9)DyZO3bYeU5^D=S5&)d$?WA>*inmrzJ8=4vbORQ{4PxNMte&mOu00%0q#bcjYY z5Z-zwS)Alb!c+3)kZ%ho6tVdBHLufKuD9*ml6*@0I|E}%c+C=)n zb}?r2FaND+C>r+Wls`luBhXOQ0*|=@UD0vYvXa(_zAEbpBB%_yQbhe+DOM{>i6nMxkVSd>Y9mm`IQxZ?T_lt>kozz zFN!{@m!2pas~nOOXuT*IpyaOI;Tu{1luW1tIjiInT9b(Xl(w*+5?tY_wXgcQ4(2+d zee7X~7pN2b^zGCTkE>%LjUQ<7G6eq!w({}Pt0VI;@l+5=GB>qbF}|+zQ(KbELoyBV zRHCKgOE#i?Bk{g?&f6#a5#^3O63;(C6A#WIu5c3$!bLD7qfr|ZOkL9^SSqu=mA{r>A*)h*P4~|#ySUSzz{g_0=Tv_ zr&OO_!r?ddDb*|=f=EGf6zxMcEzudzydoiWy^ zuZp%Obkq-t=3Swk=C}F?7^=6}OCo#6$NK@|M!QyhA+u#1b-F_z^_M=*vqvgCV{c4j zt>y|nxQ4Wt{lh(2@m@^4GCTjWX?E@c>=S;m{S@bq8k8;v!^C)FFL| z&+`cDfKG~|$SSL@k*>y^|2r@5vK7znwDGh1*_F4=051C?Od}LkGYIF2$ia@+ceTy$ zR@oCjevYxP!mhdeLaRo8wEUentzrxc1lO>4H>QGqwF5b53o_CDwr<5XTl>ZqEI*ZV zsQOYnZ^1CGl4FmgJ6DTD_vCc)J!HxvzE{1d4#2|kh`tMiaB9=4BlV@)r|Q+KCp_8c z=~U-E;RWrZXn#U`>F>O=!oK>IzYPU|fBDLfv1%uv0nAV?(1yP9h)Gw#6&~G)r*v9m=%lUk5-c%OF$1&T`{0%C=o2pp=?#m72@iEl zYDi*K;UGp;B{+>BlD@?bg0F_96G##w$EGTpy)+gz0u2ViXV8|ceDe=lN+8zAiQuB* z{@_$*yLO{3j9|AHCqH`i8j2vZ#ZQ1A=U8)7QwjtKE@(&7uwj1>=VDW zfJtnWCDE)?!rX^AsL&}>b-Wsk7!)Y`nzgO=kAMFh19r20;qwbH=Qf%$7a&*gS_rA| zovKHJw1cY;xB}qY&!G4)!v5+nKk8Qic($%P;#@DcsI z@Z)T#PMk1?jaaniS$w$@1Cd*ze_BYZ0~0*;5$iZvyMz;n zwe>6rSfF+9snb=0&)|TWOf48Rq0-_>lMYSrH96AYuZ4ozinP1EXXICdoH`*5Zfb+- zpjDshkR?=Axf0#HQwL5gyx0(@eQRJ+eDyKnEwu$-5JC#IMfE?tvawGd>Wg?6oplmp z`phZ5P}s6@n~fPc3_-*!Hk4IAny6~xLZ5(ANo{S5tzEsHvTvrt>u%>vp2!5G4ds zPVuWeIz@2;Uh0OhS^Oc;qMve5zo~EaC&4v(1WnZ6c>e;72oHSZCwgeX+oJwLf+Ox> zgI$0dbXC2nOsXUCocbj3gy^h+T~6hdCb!D!{iNdJC&s}C|31*M*p|M+-PW7-+ue6w zWuN)XY#TlTJ~5fQqGm|z94PeV_y`LE1GwtI?5kh@xxKt}i}fEgfVK-Jfsw5Oh2ZTH^$lwEu6h4%Zue~IU(>j}bnra2JGOMiR!)}cJI+Jj$!KA^y=gEc*IbLpxG@rBxg`&1KXEr3|9}Nc~g3eT860am8z5t<=v(dxF<# zN?ORv!b}kxSE8c?9!jGPNa3x?u=+t)R`hlcf52ZICwo{k0ukY+JEyfs=+UDW@!M?J zut5kxX8LBa%$!HQDtjIWFTk(yM^r0xool=>B;HfKiXX-I#}U|79c`pvsK!+LG265I zAd`0#VNePiFkk@IPI_aVW*D2dMYOqquDP8A8s3KKzk&`5)BG>`!P9fj@)xmism}Bs z?N4v=k7u-#h?iihFQBKOeRj2t8!DM3Z?@q>huQqO<9KRJj`RVKewg9s+xNUizhrjX zt#dL{{mR4;05{t!i#K5MbuahSF0cvXP`Yt8m095q`_Y5X+9)>K7GjlWaApA@(JWa2 zc>RqP_UYfg#zu`S_3>>9DVrq6xp1Dj}O&(HW0|ORZg_O7TWEhss{L@4o&O9R$fjUVX>smrCJo> zhM;^jVlWCAv@5kUjjcMx-^ko+E7nHp*;tWv37PX(Gq1(ue^pf-^%9DWWo5k(xR(R7 z1wkQJDNw>uJenu_-a_;#Mg!GUA`y1-m5&V+%svI+RZ~yt~yl zt=Vix*tn_Sgyw(w^2hAD8!+!Wj5R3z5^U-`8*T7xb)M^70-5*wEd=8Yf^iDo)1S(q z`N5$>ZT8K7eFFvOx0z@3;8gy2n>KH<)2nx1_?>_4-dDz)M(fH(?$v$v!KGHz+THIu z4AB4pKmbWZK~!$LZVn0neL0b*K9vkXu}e1oH3NVBrh592wf5%9)hNqW*)`YC$DBRZ zOlD*18HEU~3%u-ES-kvNpCR;Brw;V}%KEe;8O?Vf*o%=Yd&=BBb| zbC=@z^q1N|>p>qaG~!gF#@<3=0Fyv$zrJr~XNi!?67>j1%7FhG7hnM9oy*^<#CpZ+ z)&<`D_+97O^*4`VZY+TzQ6kw{VE@PV4(i3PijjXy?}5K4QNx<@09I$zKWn`Rv+}38 z>ZIOg% zb&NsfT+uchrL%IZ7cu;tr3m7fD6Htj6cCGVSfgQl(tJ?@YgwMrm?H%VDX-}6cgcpF z;GQ&n;ODSXW`+I=`$Zis)%!;JKL*K@jB`hhw%a35Y^5*WW;b4c4psmrg#`fcQf~V& ztNrpT>uk@SMw>f#I@XE?`W1rFRdM1Mf&D{2d6#SYR@wY{Gwjk!rZac#yy+&oHgFX9 zr^uyV<}~9iADL;FUObvHUdr~$CAsLgWinq10N=as4Xh|_N9OcV=3jA2UX;+-{MO37 zT)ngzVQvrm$j#Gj@)XPxsEzWc{>Y(5HRR|T^BsArpP`nbBlB;~8GHkUCsPcE;aG`Y zd<&jZI%GbSUh!SVh%eK8saV&B99#KmZKpZD*PGAr#U)Yai5GmWNgS_b z=MM)7E;{&v9EE>L9zihqhJ40bJpEi!GB^`l#g)7})~2zErp18Pt}gcipf-ENQ(Bt} zzGT{3ha{P`d+{xc+FY-T6n0?3_zD=tPGkS{IS76#2FKv}SlgLm*-&Hc+Ir06dby_SPsl z3`iGCUW2D^bVIXd;Yq#~(5G_kQTz9Qdd9joj1Vk^{lN!zaAoCYyMdFGQUGuZ0N^M* zy}~`_=|AF;r=Q$sKe%@T%8x~M=O-rHxpRj=`+PF-iIn`;tv_Vn{OS^W`>i&cG^NC* z%|6MP7dVK2V-E$q+)FYc=8x2)6k=3&qK)cO@mvuVbR=ihhK*!Osx#GH)VJy`ct6)R zy#BQ|jxgVEpx#wR)vwmD(Vk+DLNW`r2bb|VEmS{}6KamFHi$JeWQA%GE|XJw;t2=k zDcWcqp7IyPqny!SOJ*lO$vKryZAC81ru5N%lt%pO?NGG_OtSEAl{IbnIWEdq1mwS9 z%IQ<@DL>6~l}>G5c}F|QaH4#okJ_}TBAR%(GQ?kH5WR%uV9`L!i@YPsB&U#fbd~d<8 zkny#Ld!P1`v&hf>6W3A`MMw(5($jw!pypuWuOg7~73XhjrXU&|Vj6bV#{6Ybh>lY&t%6c%;Z zsk})}7@w623>oIpO%eU>w$xB&p_w8Fo z`RMmp>&eP(D3=5d#VCDCPFmN5Ke!KQbrF7)dT)eC4_vLQjuT$MHL8FZ{Of5-VmQgzbv|_pQR0wUc9V7 z^=XP9e1v~SL&cF(TD3W?GqndGUXm=BB&3P#)~}A2 zb!9f%V-YdAtzAro3I|q4l|qf)F0_M ztnUY5sX@QGriySL49V;CBuw4A&BP(s=vV(T+rK7k4V2br;UfYFvo696c zUCQE)xkp=FSKF}ipgr~Ii&k{9w+*fsW`{V;(zWb_&A(=fO_@Hk0x9mi2 zcMzUG&iGVrI@CRJ>Hx+N+HMy%>^ta};TxwHWsZJLeYtog>e%_uGZ*b?w7697(YB=o zBrBDzzAvS@NuIx=4tDR}!U2OHh62EbjnyZ6BDmJXR3`Uy@1`mxv>i1#34l&RYf`0+ z8+E)o>8g!DH45GtM8p`{Y(LDM*V33&K?V;QL<8%SZ~VNVb4Ch#~%6V zyLQewC78m$3abL@_Hq8Bmk;8EpAba~egv;7g?2krt2|U}tCPx#4VQ;k3B$yTnL^Guo+0<@Rn>vOz zbscxkYN4c!=3&FQgNp;E8#WwZ!nvEf*T&ksIU}qbp-OZN0H7>Ee*sj-AiwAgw02s- z>Hm$~t6f?)$l917G`7{)xN$>l;-sOjFhXnwY6Pw|(jsIK1?M8PcWbH}owv(4@laka zE&Uj@s;ir!0RkS{r22`525G#Z@hfv+Oc>N2wJ7Vx##Id(@b%nrC#`R91Dv{VU;-e` zL2b;*X#k52Q}~Ppq4H5DuT$KmoRaPaf!a`dX+`_2U;jR6(pPg*dcCzF)SoqDl8qQ9 zbH8jL1Fx>W!SDIqwR1lkO-CtTADca!HZf|LZQFGSv!>fIK|K&<4?1GXD;k%gfvA)H zeK^sfHY@yPf>m@0?Ls|OU+NE=$xF&enk>^tVir#ePc3-WZ*;IQRvl{7YRHfQ-Un$S zD^1#BHi%_DUFFlM8TCWab~ITIUeJbDFEkvrv9JE8rv@$Z(LkoUlp;$HOu}nim1*Nc z+#@JOgT4scO1YO>an!MB@}<*@C7i&~rbjc^4QSCRI!l{oCI+$!(6?`2cuuG1wXleZKE?8Or2$f9?9HZuCc)};!~e1FD7_46`29SeK)3+fNVM?OT-jyG*QY!CflnVmq!^56f*T{e3@?OcLE6+n)M z#{Lt~;XD7n#D4zs6?PT(7JvSWS8*Sa_>d@BRIkV^k@^~qGob*mI1~Urf2Do$GZUz` z_g4VWdT7bwO>E*nVIxLXaGL*jZJ@4{QGX*QKE)|7{cU3$`|3YEXG>n(Y+wI+rU1a? zUG2)9$^&j%V69zqkTSh)JJ78E!WVA0;bX9nQARrZ3&?oyJ$bO)MCskQb-^nXIDmsmZhY8s`U4*0`>=TwL6R)5TSUbNZkk)-9OmsvR|9 zqP3p;q_kif(7%Fk6;;Xwn)`q~dDo%MTt(ln{&E1O$Aym;IGV?lGuKi4W5-&Ea}?P9 z;1%w;roes5O7Lsue&tHw9k)pnM=&=kVeZn$=SDBRyx8w2pD>O)jYkf$K?7xWIr__7 z{X)0g`ziGQFh0pnU4yqP!KbM2;}koqU!{bXKZ#yY)gBKux0#>a@C(j~u07x+b~BAzDEz8Leo=&Omi za^+_Dc#ln;e2$$vYc%!3f|-D{fv)sSHSM17Ek{6p#O}O(Ar_1*wO_btlU#~V!Ru6*YRr~6;CPuzVu z8(zBGURY_uuczX1YW{E?n|EA~v$x7V{_*P(zGveRBwPIIMppn>bm0PSBvQm6mGlH7E9^RnR}3b6O~)V{J$H5gz;lXSQ%qZ7uFIQ|1!*Zcp?1z zKYvc8!0Egs`b#L%!Cd-S^>MrRyW8x$_bs)O0Tp(^<%?|KhluVH}17=X!4JnKHkom%6*4Jv4p{TRx5IqQzsp2QKot7fmf}x zy~J+60Sf>VQ2<~Z^Oghd+L+vb2&-Cax7o5c*4RPjgJZ^zunQNl33%f;1lwgUfRC;= z%G9Z3{vmwzr;kpd?@{102c`0Aep_GLZttwDvd15LlT&$nxGNC_k$DSk778N6hA>~1 zbsQTQJYb(qOb_7DUY1KT38<)rEfiqa+Q>=)ewrg8&hkwmX=1^MmyKq z48$@+Z!AtAfK;MX9ns=W|9%``N`;J&iSwE~5F)wRwa^>^h zoT?ccS&%nI1<|F#J|>dMer}%fXpYqZkkCri>9 zJ+sEHy>c810L**c0)UE;CdtQa}ALY#)Q@>7LsKbkVeSYLHf)-jQ z3ZT{_o&bJsVw~Csuk6~r-z^5Yz@BwN1oK=C72On{D60YUc2@ zeu{JAgu$-ZpmmevqLPW~09QpnU9A-BcUd&mrh{L3hTyNdx(<4Gfi~r=<+YikO*cwP zyYl=|(3E^ht~YX;64pRkd$+I#Ja!bz1IR;VAxN7cl6l2uYS1?1mRQ>yvMr%dMW+X3Dy%aOHOL(tMlaPT(4u-57nS|!0 zidT=ks}w7eefx4X7nWL{PONrAbF!2*vaSbOx8?{}udc(a`2l2N z!))lVQC7KgpY>(ld*hep+OT=_=`Q02an{-_+r977%vYmfPw~I#1Ac04$0=kJg)QPK zn|QL6tGL~D5JpTzc`NAis`oV5z5nux?OfAtSKT?&=3Y0#>%8R{bN`JE_WJYNY|Gls zC{g#c8*Z3wS6nk4`JFo2;0tF~|I&|hYxWzSwOj#k?>+17r$5jiEm^r zMtDgECO%VI@st#xTYO`u&3U>{pRjhRjKnwMv*2f0qvg68WNMOwNWnnzOqEA_8MRoS zP(Edx=99cyd@A_LQ*BM(l8LGfNM0g2mgGTlN~dr+;iYzqD9r0ahZ_P1jRTVNt1UMG z6RVr0Iz1eHg4Wv_XVfo>Hc9b8ZBYJ#8=Iu$MSh~8{G}K!Wf|d=+OpOIQiO1Pz+X7) zFqGoRiRNiP$m<0`kJgxefC|{4h#bGo8W`&}x0e-yo(O(Ukgi?r++~~^H&sZKS=bPKUdqkaX zJav`G35_T4hmTYWV}2<)xcI6E)(0dbn>Bm54dc|e_+#j>A!MYz#a0_J3MB(9mr2e? z(ZDVELcN#{;YK#Bhjwac}E9=BxjH!nrJ9_x_Dl+(jK7NtkP*OR6MEDsm|o5 zKOGDbKT7UfU0v^SB;ylJ#M4p`kQ`HUL-pMn8&yBrD-z#}UuEgA5d{Fr3Cpp7P{F>E z`W2UJ(DSN2tItq=N+W%q!g^5LI0U8fCM?)!%#d|lwI7WQIuYL&`J-f?%_yoWKhaw4 zM)jd~E!nEdTB|uYR7{*_8m$oX{XwS+A zrHB0v^+!t6A7?((lY>`%k=0`#AuCC~g(Jb-N~6xWm#4lc3kwqlDfQXWEBDOAS8Du;fc1!Q}G-Y10Md~Lmbwf5d-^-jCCvb#0d6eFT3>| z%6ckZdTdo}etA3d-hOfZ>?v{HoN+OG{>T_V5xn}dE=a`%+XXzqNB&Up#C;t1qqC2s zZEMxpHL&xiw3tD8<)`fPD6DfV=P>fb0S*GRv>XD)z~uQn#9H;Eixw@6kN?4cC<*{a zjv`Kz!wnQthV<7C!{;)Sb!-LLMI{}G>SIabcM^oSHs(B)Z_V>kCQL0gt`+8ptia4e zf|||-l_B$R5l{p>#f*oQlu1gQ>f5w-<|-qIpTrWEY+y!D+(n^iclpvum&n^_WsHPd zL#=OkZ<&R23?{adER0*q?Y-|)BZIUxBe>|ZXl@D`Jl$$p#jOVIuOIOw8{nT}Gw)=4 z{p%aij(#~$$c-O2F=kAgk#yX-V<(#S4J@{C8*sb_9o`h);UjoZFMPx-i>+H%$LP_6 z;yrg<$A&jPCh$S{_+z^IG4K84yuuO$cKMKYx-$_FU1SYkV{rTq)#GifgQ8rCS$FKg%Tm)_opr>(t zEyz;+3{WTIuDe#m=RS82RuSgM$3OlSG+H%RR5pvuGfPgs3LiIbIUHa9%Cflo?&Wdk z`>&7R{LOQ-k!2@CJz7C_Oa?ct>==ZQUsf+SHW5!%ThDf8xlsY3)i_JdXClZW4sd?z zvLq^iuucr#%kOF$n}?5WGfvj_HXM!bes7U;68sI#j`3p#gG-^IF>4sSCfGp{6ClD| zw{}-7dSP7*9y&G#W14Yy(+)N)PhuHjUQC~c8FDf*UUu|!Ci1Btaj^~CCUc+@G!Y$K zM6PHk(>|*9ZJH`drWXN)AlWXnT?@zdudUGc68Gb*83SVZe%V%mcG0>EdX3}@$9&C!9?g> z1_|3~)*XY6cx1Kv1zy<~CX$w&`k~{KI5E0Q}m&c_Z4dl!iV*TuP`53+`N6&)>aoC4TFk zh?f1`Q)%D>AD#YVTmX>J_DA2k@ac8&sZZU<I1#00sQ0Rk0^E)2>=Sukw9!i; zyYi6jEH!(9pW4Ay-r|vS7VhmYlc$_aTL}c`BObxwI`NuCxIcw$Hz~ z97VgvoXjaOR@rLI=+P+mjbfZ1n2S7lECUEtS9yE7{>$s1*0(|*FfVy@UU5-Zgm1bc z;(dlHfK+U_y8Z^PGt&oQ$E&Ls+B$9$s^t z7ee-f0;v$F%k6LSM^#a0Kd%ZooC`s`%{ZpUR2$``+Uze>Un709iAQO&z!Z*n}W;cf9EqTmXz4Oj`3`zS3|q zzWim{6es_$$L!_AiA7PUyjLNqBc6SJS3LXdi}4XH08GRJ0QK(sItWJ>0FOTo&mfF_ z&wGC%#*Zs=WlQ$ZLocTSz%|!gi4}mUY+(CT-WUJU1`-zcKDUm3NJVC}pURizPeA0K z`7y7ePzPCfZrr6q(z$kgAPMcdK^A{ zFiOgpilcAX2du-)Ehf_b#*aqf5M_XxkCJRz8cWorVty)w`u`u0tnR8zz+2yi%|*V1SB?_P_N1DQGL} z$ycLXIawpmm6~!CDfq~cv>E5kDgrphA_&=w>#a4*S2G@OhKG8^dFPCY>#jXFuDNCs zZd+K-a++S4@d=4#?Hg>WZFEenOTneQiw$gpIhoTljQS zJoCh=Sn}fLI6&Jwch)T2!_B4-9!uLqK*XA;WG(FrLRpv9Q>aE=o{eZp^V+`aLJ6tV zF&Xh+Hev3@8q%XrE{$pD^ow8m)f?jK>n7mp$GJlVy(*4rJL&e?GXD9;s;eTmd7O(| z`S1*wwICE$__>cUdjI}|ITu%u*tf5))lQX-CR`egMsaTfhb8)Z$OD?x)TD6%rLGr= zb^6WEtKc;@UGsN7t}^e&?R&98)j!=89cgb(#be8=0>FsDCX?)uA$0ssd}ifjZ|E}M^`$oMck&>lD6 zbXi=4Fn%!hzbSHOusJFaz89BZ58yiE9dA1?Zn$;=f@ilD#iWibT-Rci1%NLt#8uXo zbOEpcxsa|bQ(i!lRcj8$ec#6{J@cRIIH7gf<&&60vu1+koqaM$)O|ypgGia914`X* z=RG)dK4*cK@#`C#So#4s`GkbB#l^2joCQhYe!>H7Yl?hqEy| zVnqLRy6fqTs!9_3j*tFP=Y%`Kd0FD4@mQNB&UOnsNv3i>#N|Hhu4v zb@A)zLS+z!t~^sVOQ{Foxuz=XIOhQJhjm$!;f_0o}g%2F_EWB%? zf~?O<-X*Smd5KqGrA&nfow#s8lFUaK=4VhYX8BI1t>NbDj91>lmGT&HQkEtR%4I$V z@vY%{opK=(`rb6ID_x%|bM)gg;T1dzU;9iL#)Axb-MEKCLC-cIXI_qi)9#o&b4tu% zY~99O=h=r}h)XY65V!r>%;-0rehkG5H$CmMwBka^auW?vhn|`e<{?g4o?tT}(S?7Q zG6Z{VSr+zFnO2pt!||afpHnFDKYrKtxaS{Vim4Y3h_`$MYk%ipW~r2jrjU8ZOVXn z?7cvGKuQU-((!q2_Fj&jwxxd2il&5iRNE($4^WHe(n*9w=Y8qrY zER)I1i!{PCuC!A28|Sz4?;3 z<_ZpKjz(DrOS|-R1-N;XoX9J4%qM4ml{qbyToKxmyEZv>vM1Iw2I3L`#r~%^;yMkN zW!oEL`mFQf_S-Lun{LEX8Eyz@s7dcEKWU|l<+8qOJ`#4y)#L|rB0Dz{nZ89En{OmG`AxxLIx- zQtgf)$dK~SZQ9?tw~CouEsnd?2J-`ZDw5#M%qMkU0g4*8Wv1x5XtY5J$wry%ahIAknu$Oq8UKa=6CDO>!+W2Dt_bFKUNd~FyCDBO$DwXW3BSv8M63(5d`$Af%m?vX;m^5 zo$8s1se(^pXn9MhgoCWOxW%&W`0guz$F2Z(UQCGWeWtM7UA>Y>8Rw8=2U zvR({l!1U(T0&!~^B`vBrHEn!$6wS`{8#?0mfByj%Tf5k_o)~lIoR4644=1tr$5cAh z$&*KA=euOdX3W#=W0>$<~-ZcVt{J{~X)}bl@9fF}{R{ z#P9yz%`t5n+I`?y<02YA4CT5QvV#LhTU+;d=;7A*!WZsEC_gwp{E;i-;)_S6wx95R z9Gn_n*IyaU)6@D0e(0gC@#lZ~D5tIl#Bcn@m2t!M`ui@OTBdmo890wo0pOl{R>$Z6 z?mGy(&qD#=?P-?r6$${fTswy?TU7v99^d}TKIrreoY_oh-{#or+ z-5arMeRe+fg7~jSmwZ*1g_|mB{tByxm-*Lu^1Kxvdk;Re3Ufod;@T@Oi0M;CG7)D$ zWWaPNIbEkFa`3PtDD-PV>w3fby$rYr!0C84Zru`Fwrxtjx$;UE`fALBFUdqCVF|`- ze#(~@B_xi%GrocAR|FDPAhJw(UBfnsX?S=>d42BV>bYsG(@r}2oM&1I*tiKR086%W zlKD`KQlpNA_bJsCbMe_NrcN0LzmGr>04-`7ZS%g?Sh|8u7)-ogf8C`lRP}39VDpnf z*jZ*@l*@v9bzi@;?RVl-qVk|h&@~!Ns3ieZ!*j<{F`=H-dT>ebEhh0i{U*`UMmpa07T(gJ`si^>Ga$n=`@ znXUUz#V7yg-Ix|%jthXRG3S3X6I&qhzMfolEv0>dbh{q~09^pI9O!`pz|HZ2k4}FL z3IJ$ZvcdVtgRA1RpZzWi;+gR~zjJ$@cC!yx3-atxCXw{7o15dW|NOCd=)23X0C1K9 zfXSp0pJQkqfA71?*}&xSBdK9$u~r(?=x^1R#S1tlfH*J5!29kl+#rE z5v;P%MEhAS>d|9|BU~BIoS+|yC&SW8N-kDR-&uLkfWjC4FY^|2KiwXzt5Z*4t+uiEFa-c&3A%$+@oy0WNj zwCz0_3!hyV`}Z}(TW-4?1pxehl7(pN0^mzux-Z6};Go}26#(Rif&%{XFt7K*i+h=* zKOZ0Zz%A(lKnnoAH-Kh_ot&C~{PATdj-mkYp0}j}K%K`!4=s;po>|Jty{qH$OQ)ex zZ6fI)?Yq!}d!HA|(6YH7XgwBdHa5gj%+b2RucF>D7M}{Kd(l6QVl#g@r}}f_&~jQlc=0eN z%(m}rV8g~f){PlD8}joM#9%bf2QeS@RO=y5TQ%?Bhu_=5SRojO8Fk`Ul~9B=(yicA zfY;YQI9RWqDWfCFqMXM>5!JW;9ocXb@SwD1g-O^NT{NDRu6TZ^OUR{I4*fyo-0_$gLz40 zme|P?wyE4arh#?`w*z}yum;e8P+%)2bN8T#(v$VcjCkW4&qITMc=TubsSw8eI*ZqN zadv56%YEH4j9UXzu+ObRK<32GiyIr;;>pK$#tY9iauR)S>|sN8@TlQ2`@(Z$!nE;N z{OTS1u`+YtmmZ11-3G)Rzi@HPJ#R>E9BkUUH(pr0Cf04(jqss=Ok%ElG0H(V-aL+R zr5|)e_(?yM!a`9dhudq9rU5NxbC08j>&m4+u#_Xbhvp7Hdbe?yLSenO<~8k4w@}9VB*J%M@8On^uQRKcjuDYUf0Z?VW7Z(Cw{n~RVZti0q zb3t5iftGSkZ)(*z9>Pxe*T1PR7R|)`K%Pf8hn!7QdIf8uV1uQFV zU|#bJDDIEwv;bfcUS7E`?)~0I6jF}Ft#6tY^EgRmyRQ`h6sB7NZYbnj2Ljh^G)X|* zY@a-|*L9tgftOwt{#C$=+<`fQ7EyIScL)U-O+W8z^h9M(ELY)L2nE9tSRWmQ)eBE| zd1|{Tsaxl#^DP-PxCZjC65?ZgsVL&E_M8nvPL z*b)6XsXGoUl;hac8N_LD%c)g8mEB!ut=q5pCY@KbVR&-?{-am`SRHqN zYg@egj_L89J7;16;KwKcRF&)6`=K8+$5;Mw4Qo!^xxF8y?@Pwef0s?tlB=8PC`~mT zi_d-L*?8`mRullvkGJ1G5i{h)N^xB${#Kwnc`9L$Pu5LUL3UFas{6dQ0;^D8*023d zxcp{a*ZEZO&v<9tD*mhSMU^Cfy5{3`;$Nk$sMWW>-0WL7)Gu$ zt|HcP>h~FiI6kkV*2(;>67&R7IlF5jlG~+tu zP!u#}Bvp3p?I_GN9?!Le7L2u=xqH_k+~;nK-8-98?x!{BgB(O)DUF4(ez-)!@+#IQ za{9(3Z~&*twP<+)&4He5zD}5iqCS4o2MmjY_o)DI9Q}%YjaZ|>Wz)XKLs$lGM}eUw zTA35LDLZs%FWPc<4y6r>^XH6@IrFBZ!jbYetyyFc9Y6l?n@Caobj;0%(Pve*J=Fige$E2MfLpbcfRlXjA)%{a!lp@8F9R?V0FgL2L<<#kkW9M9pRYTKsmF=XH%Ht(mzyal-aoQ@UxVel;S$deo>F4k{B zNH&Jp9UOq%whUKUcP+_Vl@#QHeCxdwp!Hw@HJDUob6eJMGO#!u2M8x-Yo?g4DUZ+#b(R&wB z{`$T)Hk$4oumBy(hWpHzf5G@T)Y=>`aH4EACgBeuFr74MGJc9KLWAUJDgkWY zwhapan7!{dIL-UqaO3#+zkdg_nxo1j#=QA|ZGl3i0zi9F0Qh?p048t(^rIiWA}+aP z6q~D*?Vkg$ORl*|gk(W8+V|bh>C!)cgcI9S;@|$;%i;+sQv@M+HZ z1f>uEBVV81QaZZTLkE)C03Om8!DJl`@wg&;Aj3m zHl2pYpZ)3WF>MMO*xfPj$22WBJt(Aqx?6D*?+BBvrx$L++Q?m4^%w)sA_$x|H2(en zbs5@lYEc`z1j|$%j;}V;N}0O$@!5ZZpJld;*_T2?%i*W)cO6pEA&vR=6^eZFm|@N=On33+EfVi~y1 zu|yndJ`gACd+E~M@ppgoNVGN|kKg_M55@(Tg3K8T0Hi1GK28q*@h85<#^S2@&_`~H zU-`8gUqt~xjLnU2>dG>H_x{!KnN$FXN&#R7eCOsDgn5-9Z=2t)?I+^vUt1hs``UeR z)6MhZ_x|ABoOFRU^r@)4=#_@Bk7%2M(v_&J7|UxMVzJS4Sg*Wv2m#YI~< zmE40q>4H4jWScbf4eXN@gO%v*S zy&0EHx>#t$7q6B9x^?S?E2;4)0dUF+!Q{}PoJ?WdFx2U-H$QML@L&ijX?74@_;oOq zA4B~(>)guWi5nkBQM`L@;YzfPx5vCWY(!l+Ek@wp!@k5mUVtj(G$9!O5(4l|xSo06 zd#*wlitkEJ+KR{yPU}AP^lHkp535O6p`p))NtNgBJy?DE#`o!4N5|!tpUXSlpa@p% z9qUfUqQ#Az_I)-!c<0TpPyirGmPrc$kEsBl1%OHcAZY-Qr=D69PdxcjTz2VYC;&`{ zX4b#sjP&uhq5}6oL~LF&p&6U%R<6eNv}IpQNAj9Ta9b%|8gNQ;(s1_Kf>+-C`=5@dThe=PHf%?WDCv=66`dm)LoIqOG~ z-ap~M8o)Y@h>**Z@|$ClPl%{5!c)v^jv|QK&4$mql^bK%md()zpOSOV8_!rco3+YR z+*RNs*Ms+Dmfc4I1(Y8WUQsVUBwpv^q!f2>zFiu@v80)Pr-_qjtJm&}N1s^3Y5t7} z+xy3u3DaWcxzphJLGj4lPsPCQ{o_qH&0|yUWNg~9CDw1+Oq>lv^GOFebM&wRV)ZTz2CsQD*3 zG*N6v`Et!Be7G|=9mR&fRz?mUXi0Z@qd4U~j*VW;&>o{h($eKIU6rKkGO32uC;z21RPn3s*9*!8tC}6lP-z-qlP2e* zInHR^skrsqgA%TDg(Gb(fGBIG5xDi5Izf*{OkHjS(HU_oxFA1;aI+6cj7XC-ng_-Wp=LrtRo{Dw|-PLDnQQu;-n%X;H#TzyQKIwIENO5^UYKOLLb zZ;adD^$YRFJ7-0&(H!eQq0-Z!$CwPCq!39j++23&(~pAo=QwQ(bFmI^>XXW|tdqI6 zD5r|>6r7+r1hslq0?-e4`{q;ewZC{VnvZXf>u9U}eeiotC;+S_O}Dt?1FZQj8J%THnHSNdt?_nnNaL^m z;>lRH^i;h4ofpJg-!_&xlrpl@a{=QXr_IRA)|n)7{hxIN4Cf5uW%hpTd#p#(+17j} zzRr`((`)0)PuaI|U&~$PyLv5b+&Vr{fWx1_GT0ZGM`;)JbK&Nirc3_jE8?edDmY~R zyfSV5sd1}iYAL@qeHG8b7{^cfwvY_~06+jqL_t&%!yoUfUoUJIbz9+aCv2~cn|To@ ze|=Uxx2y(fP^Yi)@_DwmDu4TCH{8U>bU7|m?`oxPpPAkaI?GelN79Jr)?wZDq|;tb z4nOmB1B%RxImEda3qc)N0YFjs##wRxdAKU+#~_IkVK>(ziKN)Wwfr~^mD)B_vn{`Q zQ%YH;PCUp%6XqX-qxDE19gybI7ojar9_f={ekr0zODt_TH?g#*7~qqm{QHYZ{IV zz9G2n@g2h@{WWIbB`QS5x_b0R0D3@$zY!bVSa^~36UFG^Caic9g=S5lbkMG@dyAKK z;H$diS$W(-s#Kl>mWo7LX6wP{B#Ap1v{N(!t-{C*+y$vW;?4w^hqqw`cb>jBgNzH+4Q)YH8 z%pRngu$t$9Z{hFZZO(*Ps;H=fHgPe1)s{N}&=wPFF_k;j%}vB!-j z2Qp2dVv?MitWEcOotn)c?52YLLlm~?-$irB79`DxRFgSj={sGYxM~>b>!L3UM$I`M z!7rNcop2WOBn6P_B<@01;&TD+PHwXFJa?l^Ib zdrqIQ;?dWFJ{ZhHCQ@TbzYY37>4A?d{Z#4uTXSz^(7=2LKC60S)<{1ao=VnicK2@m z@vqW^Kc<&y1OsE<-1B*c&z1FC>5QE`umERbJ_l$Lok_O`8 zw+XGRnV6^49N$hfx3;3WegOZ({qdcA<4t2ZO?ow^QPEBW&zdP@jMox0$s?XmK6Q)} zp!blZEk5#*E8~r~o&&w)FokRtr@a<{RUDa7rdQzq-S2M1y!4~^OPh`Y06ydvRK9R) zc&`Dxonu4e$@tE_Dgb;37XatSAAaH;m8ohsEeqqj5pI2&_ttGk;_Lr=Rea?u&&S+( zW8;IEe3~$!Y^+;n`d^Y~En|N)pFN4IFD2W9=2$$Dm_E(X{MWxy@(}!8G{y17MU!@r zl1KHwKFAa4^n%TpSUV11sbQNPA^ng1UVI~Q#+p2Bd-`#gk5yJU+}4AI@Gf|%2c}3T zBN!W>f^l){N}gOEkft6~^>w{-SF^Q*X5vszDIAH#%QwUh7PRM|KQ*R|@0)E&A%>l> zZKAa0;`7NtO3mH6^RTUIW>4CrU+wJm3;#=`Sz)612-{{|a>vV&-3;Z~EeG;S{K+{-uHKOMfN}4Xw2Kb{49bn#8{s)se~q z`bn`b(vOoL1^g$NbsXSy$|3w84aWt7{NM(pb4GJ3jsC<#ErwFCkz)8gIDjy!gdCX2i@{ln-IN1FdwiJ`Ww#S16k-j1A&$ zpO$|9FxPAut@k6kc%U4bg;MBme=Hx#lVyD9k$%wZd!0D+hd%P8d}5z(pP-uq>r5K= z;+=i6?M@dBeVN=^9#1>yQ^_`G8?;Rwfj1Ry3R|9ZJajB``X=4nXt187+W^L_cFL=t zEn(@)Z4f-(KjV11P2YTsd1|ea_ef6sT8FkF$0`*ldgEJk)ylo`oo~Jn1A7mPKlu0u z;(|+@q}WHuR0Qbd0N;$F(;t80>zD^e0pO!I#;;(8R^LJLoxE^nkhhC+$z9)C8h`ic zrw~^5iI4r-P4R(Wn!)72zAcAmOS@vcw?F9yFH2wR78XeSEU!hj9;_<`R{asiwXlI~KWcxbSulC3 z_Nycx=+jHTTGoqg%Q0PLAyG1 znc$VLUymm>{TW75@Z^cZUAvn@Ub62$%Dl=G-kNA1jn@09QJ96rZ>4RuC&Ko6kzqwz zcNRdHsqn$C^^?kQiF`!_2$cEKerPJZck#=H4~y%ko>)W`9*rxnIFE5xe~>xCmc3Jw zpFml4+xE8j(pR71BwAbC`JOA&3RC~I$WczQEqo3O0Q(!`wl`mn1p$1xk+(VTLIL2e zyB>@g)5aoLM{|Fa{@rY^i5#abRRCyW6MtcR;7%<749LE^uFpE&?%fCC@h6r;r~UC> zPRfl-rN`2|p2y0>>y!mpS zV@3_;bOWQAgI_^}-`5iA##H}yO_K%ULH*nH-C5Tr&uC}Cv5Y+82S)GmuJe)?sQ_RE zxG?MbEZ9HeTkFrVs7SbBZA<*)7Z=Bq&u)t$W2VQP1?R@diKx!A*v>M6TS3{mmg_oB zl`+S(Uu|QPo~ndz5L!`({ZOpxTe*Djgre=L45Nh)Ivbhgg(*s_mQZkF*EYbl^FJ+2 z?q}YWTy!!vZfM5U$X1k%_Tm;`KWj~uS4PK4Z)Jngt+Vt zV>l5r5fkUdw`*eflb~4@)1Oxhf);1TZt1aQV;io2*2fAIA2)3{7|m?34;efZQ~#4= z?)jr)5`N_SvoT%`6)iDI$Gyv`}QA;C!X0DPd&FRE51HW`- z%$Ylw`C{3S{3+)8`hiNiSGAM%?DgpiFD*lQJ03b`Jef*aO~?{-m7-GAAm+!O@^>EN zI?!=?{{i|&OrQ_t)c+&|tb>p{beAzZ2db(_RaR%_`uY|3wLvcQDBrRbrRT;?uQkli z_Mtql1%QE^fY$$Z8^ZA+%=bs*j;1?GDebILa=pwvo*8PcSKRpTL!ZMkn0X?75`Atb zxql{%`=d%;*SEiH%+Zf--gYRyardftaq(^}0Gt!I;nRBL$bPw|vKqH;J%D?F6)4iT z#if_di)*hQgCeADxy=2Qko?o#FLU~F6PxsNnP*I4ZLX^w@u(;ZKOIN~faUS@v)fUW ztQ7$Ct6Sq#;+m&Nk@jK@>Z@N{!rX5)r+MERmtKqofC1V1bA7RB$)339zIFI)KAA$* z`SVAVzJa;6e4TI|=BhujNu5Bd~$%`70-Gg|m)f*vX)yV}?9 zFd~)Mfl`RFSS^E&7~Y4q5bHMDg6nWmcRY5@@2ALuI28)oR=NI;J?PX14u@D%iMi`< z)3)KhNvmM?MMhSxr0iFGgsJ?f$f%V!DJw=%54o~&T>B_N z)TINoX$;b;-tZDu%9(Q!Thos9Ck@#-qw*E=NEwmO#EZDfBwQ2f+uAjTYeL65;ThLZ z%2MRdwM;`=sko@ZVxf!5L*|9Ni+PPS0K+WPAm*|5yUHEJN6S@OYf!#pnWd?+70av4 zKnoZ>8TXxx-SSWA$@Qao;zdi^lyZFn{p&xcJ7A z(S4{20L;s2OGktW6lE;*_$>Q7qBpSnAun%dp4kSCkMpb>+V_2I2+Ya4LzjN^gU;EH zW}LDb6R-A-C*xax^K9%mv=s$_%j4o}ro@0D(1*s@mp0ZDC4nOH#6eQ*JAE{E&JP=B^40*Q?-O*U^j7=Q7pr(*HqlW{rb-mkn? z_hY@0`DppWc*O!)n{!h>CRCw9e$Xwd{MQfucU_v}2hZetdCxvcnNt~wNMMr za;%iEmbT@_qdcM|lEJiH*G=-C=}TElKPbKA+u9|oJd!eKXeJKwoN|%Q{DEn{!f;>4 ziMQ?4wqEeW`6~P;?v_>h+UAtenMP|kDLaQ==9_D7;?y`9-;ek5viOOUZK$j3T(w~I?uYWW?MS%NNE%qD@};s`<0!XI zoO#wCvs2cY)(Caw=w6n-?S; zls4#Es~i3Q;21xF10~25d%{;k8RrI}6xN%*rw8=y;YKULu_ZAB{T`HuRT>J&7Ds;I z<1gc>GS-v2&LNI-250b)mT&q^;8=Wrop+u20RAANJZGH(5~Tuih5uDLGCJbRl8!s; z^d#gxg}jjce%$o5A}ie=jl0@#=hniS4Y@z-c-=Xvj4@_p|Cm2-a-7FJe$cR9>Apt= zG~EuK0DwwvG^fH3$QI>q<#Fb$JWif=U&z`x#QgXuN~7*6sPvg_3OwzX9s3Tmrzl@5 z6D;k}y}h!(nmkWAz4v1|q)Cxk1B3lU<@iO$49^ivlWhZR>=%@eOAp(T?ZP_nV<^`} zjx3KGN1T+Gil6yi(d zs%@Y2j**TTj$v6RJS%-4fVs|nGH9v1PNW^P>}xEe`w`9w#AiSIAt#xXmAxdQqD9hi ztZ%Gay+0m$U@bK78`r(#;yCxpF{wb-9eK2kO639F7LhpG_MzzVG>2&JUm1)y7qhP!9o<=5=2VeGvhG7}U$-w7Kei?IGT%M_@(H*ioE96|V|{`{3GK+DXPiGV zF25P2?+Zsozahw!F#Bg|R z4hMrSzjAEMz>-bhe#*2RAMIOMS1`wNJ}Te1w`l!J9BJ#}CF@NKbVsQRgL@UFemTSm z9qp5CXW6G)ufR2pyfAnu?HXK4N&46y$}>xsE{e~5`o9+ifY1Hy-MHdpFv!FZ z8zSb0HVl@GK`J+}WE3b3gL>+$7tfp&mFEH%umMms7&YYk&^V4H0;X}$kcsRF^bzHR z#`Fqtjjz8=aj;W%!$vp*m>BvjH8?4RrvYRt@$fW=I2cFRGLPlRO(F>CGdB%N<6uL~ z5dp??;$^wq;B<1|uWvu#oTNey1NUTh_Bo)!&_fXdo?w!bL{tdP=79HKZas>bw@F)rZix;1WPk-iKXw?!QM7!mdTTlQ{7!LiU>%Sye=5{Oq zJn-O_`13z|l#P#3X#wCW8VPgD)8RFMm!bFJv*y8v*2h15;rns^xf9|~{-1ZTIp8Ei zexS;;KeUshzQ}tsCMUmw3xKcwFBAagj>D|yC^ntxIN&V@C_6HFlV%8?I}uPJ1YV1whHuUprYhIBm>!s1x1INf0)dn!}N4V`evid*&ZnWVf?^Z1$O?@!wHaW#(~H7 zA$@$VVvWBpcx<~Jv}tM5laW;PG-GXCCrq}@+<;?pEPeVi(Q-n3R4qgn;PwLpIe~YW z_bmu_-S}}LVBS3t^4sa2L?Nde1Gyc)!YBu=4o>iir&dHxu(8;I0)U;SbHV=5e+Wt# zCp+|E#DH9Hd?s&D575g&T7FJm@r(MhEA|wJWzbi#Cq0}DP*mVjUrcJ;JhWSJL%Sbk zJ8qL`n{olCofOzIHBza-%{G_A3IL65qe}G z=KtIAFaJc08a6!s`=8*C{X+P%=RRwnoQMs*%o9~H(2;nQ1zL9CpX!-~$KtA!=k0t63IMNg z0Z@|oO_uP=DNgafh=07Nm`D$bkNx^Bap#Ap{zwG?%V*jRYmTE;zZh33-^YB>1@Ze> zRvAChG40j+e%pngjT=w^_#_Gd53FLb{NI=qv3R9=I~4#5<2cmD@+CVlsrN*zS+h6Z z_3pP|T6r&dH^Z-GqU&j17X$U2q?F4RS%Umgw;O5i{KAEB_CK@->s-F@<2=H};&JLg z9_!t^Pu7i--E8E5?8E7XKG`2pPr&MDebWBq%OftX=@e8rat>fUI{7dCu71tnG0N17 zHkTt`pJ@_JQ<^*~({AqvPr#ii(FmDJ8xq*y1&M|1M;A=lt3Rv+|-v4X+Ds}3& zobRuFt5!)4aYDR_1?xeq0W>u2qb}O0mjTTC24$NX!9ulG%FtJzw0sT0peL1NtX8(E=04xc}f>jIiqOCjjvFXG(NPC|;0bjbD zCUpbXaZ8*Ncazwu8>lUmz+WlWe>j4m6^U+)4`VSMK6H@gs3AtywGf=I zRQC{S8%hU9>A$B<;EdHZwyKE(-Zi~i)3&GEON zeJVELLTJXEb7R(gd=6vXq&wRBDlafg15a?b%~D1=!m(9%DeY_k*vGo=vW}e(xu$gP z&_4OdGV_I2@Qwrw=2s@T8+s7PiV?2RE-A*>_I@+Ke zM{|1gILxWGUYN9<6xUvdVEdBs+&k}-9$g6VFGVzIbQ(^5+X;>b`HXQ<-=Z7V?~lhH z+JJ)9s%XM;$%tViQvv+EbEabLV+3s$A(Zu#ot(A6U#XJp(>vk5UKg1c{Ked?1#|E( zuiO<6JhF(*jN|d2e)mmr_4T+ILjii?Wj4;Wdtx`wVMYn+=X(raH=eMN2)c%-=^1$DPFZ5%i6`5mW(NReYCwF8?)!ni4fm zqV37e_1pI2Z}%{BsR3zmPer4HtfyUv3}ds!jiD2+K`Crc8hSq(lky7N@{Ts{M<31uTl+8FGoTCnW#Pj|DS z_t?gG=R0vVaBXn`a9Vz3T)2?93On~U9gVO3@1-1&SrzYo_n8U+&aYQtD*U?-Ft^%! zAg;e*N-S6~o<1L$UM2r?&E_dBRt6OotXb{r2+5k_4;-R1=Ce5tA0K3cyScfU`Sm{5 zbod}<3>m_DZ79620{vJlT#Ou{;%|}ZWFKF{OUOTqFA&a96{fl?lrA^c8%xogJF76P zRipisud#7Io5qKjJGU|}vhgz<|H#PQ#-VIAl(|nYOKx!XRDl9!UcLEx#W|B5QrpnxG(gI~as|E+K3q$Y6Vr>s+pjIR#|2F0lr zxu9)9KI)m9fxz*EHSu*xrwZC(!!UNtr}ar$4ma|cRWhf$h_&Isa$3>}6=#nCZtB5q#TOBjk$ zBV=Oj!e%%J1^SSd-h_2DS+fQ|0WZ<4b2K$?E$!s~kF77)X7&s68?_<&zNc=o7XgN8 z(_Mo7A1P>r z>@l^_hEP6iXZ~>j*OI$-?1}BH-x_fL*MW?15K19K2K9~!tpCSyh(_hbLCkM@^=3bh z!-B_;<7WVv$_bT4=!-yw9A)4te2JKQI>%62k`HVLwgD}2INrG*sp}x+m-3T*?YL3+ ztc)A-a(PYx2wC*(FKF}CSR>CJISSuUu)2+y&V7tjiXoMKg3s!yjJMLepY|$QheCwuyP3}U#za|iS=9e zU^(XExaIZ*(Qg#x!5@TWv;UN~%H7?ZZ$_rR=;3X#=#kBFf;QlO$AVj?#5K2{7yXed zp#O@}2$mpm2fpYj+RpN=%w0#vRkva>Z%pra=Dua|@*`VdBb43-_KXX!ogSCphOBNf zdnu$f4{3QA{#x_YzIghcRagXUjcacnjdJBlTnTX4mwA+O$uZ*xq6h$A^|kHWpF4+C zVXMfhsky9IpOt#DCLGJDSBU4D%z0`m)X;xBFYvv6w(|lj?zl>jjMY9fo%Ha4n6;Yw z^w35)@{2sOe#6SR=R0323ILBk_Yl8 z7}w6#_o>B0sS_>;n7lrH=;of4ZF-R)I=7?|2oXUi3*&&8f_jAmd`tp)h$5b4QbkPC zLtWz}1mGm!6O;VK#f|zB$PHY4?ZVE+ukXp2J!f3J`OOz0$Q_8L*#;&e2hfB;IF4p3Q+7<6;OAt{OiZ7& z#Ij|}uqW_Xd%5; zXs7ecT7@A!y@dk616wdN{zy!lHYtAn-z-2F&dD$5uXT708QA~t$A`y553h@V{D&XJ z+}V@kPyXZ`blQ}gQ6c#+vn};xBiOM1Kz#9wOE~SkBHnn*ytw1t6X7j4Q^=UO4m_H; zse>Jp;RyU7fAw+$5rXQE)L(bk=-0Pj^E*CP7AuQ_VnTODU%R@bw?>@L+nJuejt8?XUrUvlMEM7w!vIj zIZ!ch*ipD3ko1L2mfZkNC7YLid1HF-{RVIQ7VD`*kdES*5qxcQ?rR`Ew=XKnESArp zkK>a}P}0vX3P}eK^`osf$K7|`$EndN@jw2@M_Jf7AYnJkMg|SUU;aG`&$vO}mxW&o zzOY(ayW@uBSp4xHe}#5)BHs7D>*BogIW5`S)BY~rOFGb|-*ghlV93P5e$@@zGegBw zmNUyhzSXsPTTsg`jGQ<@OY5nION^3^UngD_w0xFz?t4C+0i?>n>*B!^=7pBYqe)C+ zCLU57ocNPJ3;*!SYna8T;#+>@#uDGMgE8YzshBK-ne$vW=-#t$?10aIaNlzLTJ?$F z`tA3|rB~CoUqu1n0G3Yv5CwpR&#sIQfAogeqyXRv#&6%XEI#+?C-I|&1ppKP-v8mL zXzfck`smrJtqG9|M-7G6FcH{7ZM0JL%D1R0VN#B(0Aer;2H=?g5V7p{*FeCS;iRcbE!a?@uVCSO`OCIsP(h?m_J1z&6z14g zZF{45)I!yCt#jjr3YD;oD5 zNsAD}=;y|BvVSCsT7w56bjHGwoBD3_OOK;Wid}f@ZD>Txn}rR1oZ7UO#Rc~;1eT*X ztvnL#Q!NTO5p*6U|7NIu5(mHPkk8A@`e_}tj`I5b);X3ssq^uv-DFX;R4CmLo3}K? zPLwA-d9OfDLG8#nHm2pI}5sg(HQOPdi2 zY>yjI0MMmM@(cuRMmgZ?|NB9njgHGMK?sH^S#h;)9cx;#0I+ODBd7aO0Cpnhw(!td1>P8{?g~-+G1uz`}*=V&TGNxEQ!JE=B=h(14^Qc~}PXs%kdp zAkxJ9>Y17ROoI8L?8}(GpA$`5eXv=N8R$YTg%o^zB9irvhu zFt<2xFbV;!(RKuDD{NSKGS$tRQY_nQfmYf9Cy}@9W#M$3jr|cZY6KRASePE*)ZY$x zYd>@AzWoN#o_eByvJcbN9n3){a0(QdAO=@~g&#uV^rL83N>U=f+P44_$g909&j3-! zNTG;NPd_NtNBQLIe4gkKLCHwhs1hUVIv@XBzhpr-e8jntvF)yJt&Mx{N5lVUkC-`c zR!lp0QuITSH&7zvix1Z%l7F)eP&`|*i&{4=+)&W3v5Hc{HNFB3g$pVzyUC%zvF_oJiZjat9#;x zTP}Pd`DvLWkOl()AvEs_w=&_%Sy5d((c# zj2@Ae80G1#A1XzGR5P2VM-fbp#e&Uv+}O~}x>iub^K8fuI> zVA##f$9J;1JZNBV6jTPJfLC`+uAMZCJ_zMXbRiICvIb(lsn6TuDiEkS&v341-%{ry z^g4&Gx&AD#YaEnW*)FkC)Nmy3zISabUD+7#zI|?7ebofUP-S6R&6o&27!NiPsIJ-+Zo?SA^5Gg z&4?SWo5-fRR@I1<@uZV|x|@K-deWEw*9&Z<3XSZAQ^!e-mc#8TS?N z_s8PH2sZl1jv2}ag$LX|^mWXjzH`Z4S1A~uE~91jMQ5RX@Y4&Od2*5E=+YC`+4Ace zpdAIsgIGaxZrDIOK7dlCo5Qqjc(*SWEN~SwW*BAUr#0pTG*gnI_Ba1)@6Owy(#arI;#uzpQWr{u=fP+swZSUbS)ew3yZVYxKhs@gC zK!zqBjOjp**`g9Whl~b;V_(LE7W&C16lgufgg6XkIeejy9mWX@>a-DA#Ag=AgD*Z4 z7v6kX-1wHcF^Nrm46CGT0mq*y32Vi<_8^ zpM`%#s^n2*X_hM+LFQ~uzAbGQIE=3;1FUG_%UlC6$1f+#k>Rl@)AE~msld>|8o)V@ z@d{qH|BB}M+@cp8d|vVr4@ys+Wd26+3J_%788S|lG~x5+)G4hc^hPdm47a^av26J^ z`p_dWW#Z7d?utoq1#5$;la*c#R1Y&(4b$helZ65!Q@#(V%S(*H*t7n7_Oy9k8w_i6;@6p z69t(WbfZtOn!CHnNZ+H(h)Rs?>g7}TTbe4kJjKTYPg(<&KBW{~SRfv$h~B+gXt)$} zz3wfG67m3w@Q7^xYCrEOXxo>2i1L%{!Q-s=l2 z4%GER5iK{cAq04P@bK&)-%^UCOKDdUgFMAEgHMwH`P@r`9A=v?ak&=`qnvTNXF{+BVrH@3r?Co?7hYWZfiOA<&rJCA~ydCGT*J#=?IfYJ|Z@WuxAGmy`& zUb8z6wqp5xz%lj)*ngTk8buLkt8%{3r~~_`<6Gv`4^0X7s%iGwY^eKOO)tP?~Tk| zUviGP>_ChdG=h5H7sID_i#NXKVyp`e=4AgV>i=-8rM)b9VGVQHBXQZ4^W(zHXT|Ql zjGcEq9VZ*Rb1-`{%E0XLjO>U@ZaXh#%^T0$L|!ZO>uB#5n_pm_{IzAsthA&v2gNfi z?4%5W@f)6Z-PA*d1>dx4LEFk8IY60NO1bquNmTf!-siAwx=-UCcD~QN%Q)b^g6*Rm zVw0x?W%>$M){SjU1vF(P)({M|3(@BM{Xe)4;W&7L zd|jrBfEMpZ1gJov+S7zF=QJh<}fJuEC=8ph%#w&^F_`#`2 zHZdN4cqa+~52N@nGd}jK^Es(jeBpK`sp_Hg{#7m*hZyiqa&mcPx&XN94fEp@pZEn9 zH`b4JSsGX7%$IA4l`EUD7Vu&``tauX;QOzQ|M(wfqlt7VH`}de>$q(8WR)k&6`ry! z$SZboL`teO2;pc7v#&Y%wdBqyl;~)&q*X4J|%4p5}tC9zMgBW`s9l_N^@@B4CSC?Xh*sX0*PC$0ZlzFrPtzO-q~KOc$q5&7YlCu*$jWBt^{E56P?iDPeq3(Z5{Z{wjFWu{4-8!h*fr{X9lqz;%$z#p>9SB_; z*%TPaCeb7&P;D#_w#Tl9{m^`3TzKI*n8(9}I6k_2<^Wmx8wpnPkQ?(g4iyE(s?Itu zMWw_qkBy%b;?uE!k&z@xxduj-$%67yZnDoZt>Cp#k|*iV=2w|vHD-AK;U8aOQ|l?r zPG1(k^07BEXmpR=oCIoWQ26D^XOD4XLTcwO=+8;LnKSVxwVe&Q7B*qJ#bb{=7S~-f zGk)XOZ^Hb)?mSo+VJ^rFty3p8Wzj$j02iMbYFZ?|#L1^w5Z=iv7J+!3{LM`%Coro; zc~Jl;iOeU1Wz3Z2x%t%fTp|D$9O^uTYQJZ0PMRtxb=3UzS<>IZxXQ;|I)k|8^NRlP zOHSr22Y*%R$hY)^J=w5*Y4Mi$`_Da$wra2V?caHSTyZTL-SA62aU)r=0Kg`R764QL z_~1uwNEZNoSy<;JNFtpPzj0kteDUv}jK?2+IezmuKZ;M!iO@@n7ywK<62Ho<&{cd3e)V&o z7|NoeO4eB=ofp}^2&!zx7kU+*^4gk#CjK#Zkr$)^50me_&xt0FG=b#{$Cm8Ji6btZ z^=><}a0bd*;+6h9bG07k3=F}Qz=+{PIDI}2g@7T97oMQ0 zCfsJ9Se&L$J}6%nJA-k4KEe8^au*pdt6xvZ@7%SYzIG2Az-_4nsf!yo?}rSEyM=W{~5zbA(DF@FLDyp3#Z?v6KMCVc!jHu(#|(b{LT z^X^Au7FM4wx^NnGR1`E4MR>jy4Pq4lo_PEjO#9!A8E;&;AmFH)K`9Ef*n@)G6Hl(d zAK?DDgA+XC#;Rx}e+Q@SR-n-JGD7(`#Da@!1pv#P$xnY#?j&r@lc(SOjIQiw?IRUJ zxcH?G*hpeu<<&#tDQ}3i3mTkLp*Y}1Z!eU0HetqXAEws^4<5j2&A!R+3My=yw$(E4 z5_EUw2aPClw8x|gEc!VG;VBYN?d)x8i5+_nrIo6lJ+%bABc- zs9bvt%TKy^Y3GEL(bRyKwhEfkqLK;$?BM08A%wiP8RzX#FY)P0iIR=HQ`$}sl)80l zd6bRP9h;hCEpzf6o7Tig{MBD_@eEGEPDYS4iaF~*`d?2z0=w#dy2AZQuIrLlRi9;) z9fb$JFG_{&2+H>r0Pvl29AymO_@|}u(xT;Y$)y*>^;j4gKNdwE z`#WId7|C}V^O^g;zazf?gO#`$n1N|z6aZKky9O*l%9ru^IJ=X(cDKhDzx*6>vW=YN zJyQX|yfBrN*%7Ka#n?AWnVdxsNPI1+f&o!ue3hTA{}wlrNi`uzJzBFO>(h zp4g`^e2*NniRXQL9EtfHtkGrFAU1|`W$gM*YS&|%w~1r9@LdN}7g+KR@#?rWFJ$@>+qeZ%rYaB5`W7GOO36#WD6)VO zsoq#|O`d{z-X}crEbGt$*BUaXQnotJ0^@YfrWIeFJMXZpgi;2tY@_AgHD{3nbcLU> z{VEhBy=m>Ij$;}(1( zPnwE_MmO|<=PXT&0iK@i&)Rm^hQo3Hmlnt32e)APbU1y%g1DHm*i)!-*ckUV^NnG2ZuqS?LDAIaqEko+i8`I~|f=Bu01S5GUfRUtWtca&x@tEmPvs%O=tW z8JoH)8%<)tJKk%3tUxlZu&sBkKloY&1fLs>N2qV}(wj4|ct!k@szB*% zdkLeYEnvC!Kk?-vnbi!cJTns4C7Ka=S)%1dewps{vs!jj9%k%LOii6w3m#YrF4IC6 z*E0T-cWJl6JPo^))`XpCzV?PaW>sL~yv`f0v?&U)de_3o5adJM)Z7N8SHhF+!`X@L%dX&Rq zZMdGXJ_e2M8-0iBI;AK8*x6fO%9uR?Zpk|suS!1)aPrCe1drUzXP)H-xvN>%z1@f_ z4%U^5UcNJ*R5IY1eRuZX#uXM(Jw)MV>k$sDHSg(&LwlJApwP2y*~(~Q>>GyS_GH|o zc@THb-0{e_|3B{D13b&?$on3e03nL#qW5l^>CNEYOXAq+$)+cpZK<1Vw&dG)bA4Nr z-8h>~Z|*g=al@wA22Ah0BLPA}y&)ll-rs-DeV*r$04H(cc(3=sqx-&3nKNfjpEGBs z7rZ#kopE0bj0W>CHJdPSwB2^g0?uKN*|wuQY|Ok-HuI|SXw2Xus@ky{RbvM`wXM#UJ+Pg# z*8=U1&M-TtFCyz002M$Nkl1!kuR!#^3#_Yw9X>Y+n+;%4ltZc zSg6T{%OEy6rQ9y7v#)} zXVFOlO;Y=}%YjMNUCRiPa+R&8)vHVG-w*)kjWqJ7KQ$fUhrTf7GU8^EKEpfnRr7#u z4?VMVkNxm}er?mHjInQi^KOJA7;I=4VUd#58pYCPaNpiCv;}NNxZ#j}==}=-bU=&0 z>Btwl z1FQ;3BOMYQI$TJn9gb?>u`DbknH+AK3W^3*pR@rX8-Kg@p5TzW0OpO<7Q(7Vt;LB3^X4{PZS!^n0CpYqoBczE^n>|=I&L-x zosqy&f6xJ#7Wn6hFA1qeHUf31tCE_TEI&cOt}oKayZ0SuvvSUEKs9|YHo(oO^YkH! zEHxl!PT)RSsb2KUaQe~)>jG+3PZ!tNHdMys=a-OImgRELB$EtME#8)c2-y-IKVdu! z+4J1S?S$lKt}g=PVYm-h32cWOamdKeUkUWdA=OA);uL8XleG?w{xP}2y=7^f6ph&g zq9hMSkl9NwA4bsUH6$OK>|g)oUWAEyq1v(19(i~THtGwRB#p5}{j-U3ANE7Y`SY)~ zmzQrqc;GZ;?ScKvYWwUb=i1%xn#3WT7N)x0uUWojGrugJ9}Lrd+}+o#)CzIro#k^EG(mvGvI zMgf5D{>KWm8f@oK|6}&?&kVKB-ADwUfnG`st-x*no+A4h0sz~$9I-Ed=}&ClLaE)x z?1Ya^k@CcCP0~x`?=ao}Qjt|RA^%i0E3W#2oOjAr=^P0UOvm#m37nA7|EB*WFk(F` zGtVQ!R(|Ogqjw$8)uORv^Y(lWFpI5kUVmBSs9N zf1$1oRaTv0&}##w>X*v=B5a=(V)Lp5CjMy{g3=Vw4ZW?yhEWF`eCe=RW0IQ)V5|}* znkVJdl4CmxCDgH6LLZOuPW=%!88k~ssWD%N#-%WH^9xW{ir`fV2N=2)uKBfZ-#)0j z?rnJ-pl3rT*E&MGN|iUMdzD#h8MXVisO8*$unLV7n{C*j?lx!UNSN9jLV7yUD69^Z z$Foa!us%8i-Ot;-@0krFI%oh8ywgSJT~kwOX%U*6(gFZVf8bCf0*kL8Nsap2X~U_H zmI44wVa(f=wsPefyW_U`HUvDRf=+du=}vO+ziQPkgdr-pDR&DSGBGDr4zm|u+-@5; z?zXG1p64b2y0A$T=B;6*+P%}FRR)=vy{+%w3dteluO1Po%y%o4REkgw3X18}{&g$0 z88cg@Xws-flZGyruewdUE}=#_?mATX?Xv*moMHKP7I4K*SLE|dG6g~_#Z{VqGW^ANTsD=-z2 z?HV_(y%v>$b5XH5Kq`nGd<_Cf))*YbTlp5^c?jx(23a=71_ zzR{KaRu^v7Npqdn7-9XUJ#@1l6qZ(CGLdvSsP9&=`jnjZWZDnqVB)B|Yfjyn>2~kb93iZ$vIaqp9O=vUoULnq7kng0f73tYBvSb9}P9S72ZZSc}N(? zpY)5UASbBNWxhwhKju^88DjZ zD=T&&++7b}YKqO9jk@3r4FFZu%?JQ&wJlqBplN8TUA<%+yoE#nAXWAt0PxK7#}NS7 zWw+ck1_6M<83F*JOQ4O$FWq*^$ArmGf3X_j`h2v>-GO<5UakQktkGCM!B2bfmBV)G zbh$0zP~{42tm+^^U0ChW=TyOBaahAT?F?puO1T73f%&_N3N%|ZU}}(Ye<16+{s_hn z8l2~X`m%5DJdp&W%;C}NSny+ICkhQ;(c&pFqR=><0m7v9; znhQhPBb-Jfn9P{U9AO{KV)bJWAuR^IdP%r3jG;;=8`u@x@-N~5+c&$BoFfQA4o@jk;u4SMR8)w4ub1I_*>m8MwCW@v#IkdW4bb z-}*fhxYD)$mS1KXeZLhK;r<3#9xcYr$j2LB#`kaiN`A3Tc^Y6lL6t|$r!`KQ{z|We z?1j#EpwF~}ubFR;KKHuy89LT(`|u1KGznoF-STB!E!Ez-K`zZDO*NRMmFb{o4%p7u zPI8l&n~u!Mx~H8tc%V(1JIY2~+1mz>%%L60R3{l}jm5>IM%Gd?VNk)GapVZpBFU7PHNTNc@EcaF6o!#cWJ z?{d~@<)|^14QZ*A?t#!Y>`mMFO0_-oKWnX_vcTSR=WM&}wsAIaDB44GnF_jzGFs!E zI$3G|{oO70@(X45fe($d_r8A=dp`*oIm#kXE0@sJ+bbF@cQ)8Bf4&#(VeHp#9cJ?v z45z&Zb0*%$SyzeAn4e#3_x;DKwqtV>xQw*hZs#B@4|5MdkJYH^(^@p;ylrHBrvhTt zg>gBw<2a(IUWH@8Q|l6U&R4)snRp)BD=CiP6DLIXsK4Ex)_6q#nf?*JAnHBF;nkz* zPey!y&4@$j#g0gC7UfbfJnPIvE$QYccsjxM7qTV(MfA^vaWQ5W`v{iC&zO##7zjypPgs7-gJdsF|LPo?NrHrhV=vWscH;u zM>#}z3I4GiY2)f%3fE8bT`a%m1c}>pWbfLZ{#9#_KfMF~!(sLw18n?E1X`{c%6=-> z+9O$`JlZ-uo>}_QQ{hFPM{`~q_K@gN@HK*3mXLFPyk3)yq}EAVL&)k$4jOZG_%4C# zb7IEe8f)2GAFs!JN0H@YmOvV|Co|`dnZ-p!^41zu%{T~bXgm=C=*K=fN$W|%bs~;0 zvAq6-Nsta^I!KNeeVpycrlgq-ksm^%u~z~o+)uN5v_~I1 zdKy8ElU8uB$W9$BwkEVy3?0_r=FcC)I52=);Mr(>qGq`S>t{;ILPT_tbF?CE?&H4v zN!L}2_ULg43&~R{e&?4s;JjJFR6j^)cbT|h@7T_@`EJ`@V^2T3$JTAyYh8Qxw-Mup zSoK-7VjVkW^=SQS$9OxiZ*R_^hTEJ4{cX&+uJEwnH?)@)r7(V_$w46#Ji}T*cx2Ee zg-;-c&<%Y6eolQhmv!syY4~g#Hgn;5*l=$DUtxJ;x*)8AfU??w+73Up2DMAo?>Ts> z2X~&ZEh`UOr^cRWh?)SL1GZ!54tS?SX>aY(x?5ybwN;#VpuKrqo=smg%7%{{U=@Y+ z_S#FkY{QDzZT5soXyCjG)5rz3bmgnojf+$ZZ=Pkt#$$V+11*epe2y*9;dSug9^Zy0 z_fq@9mlvR=o4K!zw8H3YF0|8BG4T!cE;Nzm$b>+JJi`ce=8Xe>Q_$)uTJE`D#FBr^+zWq!xhtgr}#{Cco&7&n3~2zq?ErF@2_=BFR6~WdfIf2*1DtaJ~tZ*bKlsb`{!|Eyp>i zIcj?k)Ul}6Ew7$198YsAqKXa6cy9BLeN^>p2M8u>K$mehf^s!M-<}RE9O|gZ3Q`iWV-KYoGY|cx*vRg%1;h+PYjIZFs-TUoo4CI2d~p zb^bs6pC@51U15L!cXz?`7gJc}4hc1=gbk+IQ5LMf`sH?PTW_-uBLMKFznsK^wupQK z1LHDT{YLK;x)eRUiw1g&o!6(-#4pBvk?O<|Cf?U#rIuMe* zBdGy*yIZJ3Ytyca)p0P;0SUDw^C$XYid{f;Gz?`eVjQE`NCFD{Wg zQ{gd={331RTMTQNi>D`Q2#s+f%n&zx5$1J}gn@(9UAF7c6=};-`^k@1Vxy|b{_0Eb zM-uVUCIHHcqygX&dt?2clnH<=9b8;i0Dy%sEs{dw+>UBm`+cAisJoHVRA7%e5GNKjY3ogaH_b5+=RIM1j^}XbCsjbjW!W z;X=3n$&IHjU9u4h?8Cxu0BTsf!t_gS!X`olp?tzUj7b@2%JUs?nROE1BUYjJYN*!1 zmxKzXx^(xR0&av9BM4A~4a)|!Cvcl(U>;0o?80MSAv;_4Mg2qqT1A+lU25Lkyt#n! z{iscuFwmx3* zRaceTop;RTW*O=zg*Lyf+hAb7xXPwY8^I=Oq%*^{x0X{|(9OC7hblM>U1zu7GLJdy zVhsR_8w3D$a^s*fB>)inlS?xgda{x|#)ZB%Z}D{b92?bE+LV88sub~|0#Xrrf$wlPyi!HB>lM0?h{ zl;3M#^x~)H>uUjhI~>}AI)UOP3^K)+rW9!gILlQA9e_x+u-496^5>u>q@k7TD1UO+MhV{TK$Cd1t#vueC zvobKI$ji4FA-ThND}O>O0k?oe8U!9R3(B40rAU+^Gs{#u74Y|TqPg0nNRMVyXbdC2 zjJ@f)6EM`*q9N)u2f^KK+~`pVQ;oARBROE=c5QoCAE`tktz+VUgnTG~{ziJIeSS}b zTP0UpiT#cR3I`g}zH$Pas#~qHw!-eZXAuVqV^9kkgsZ&4wV-AzfbZ~U98)41Y7cCU z+{}suVruKcjjXmXK}FpLY&ds>lPdu^9sCzCmq?JP4~N{na&y9*1rW`Ds%!1fBxJ1{ z@zop-YHXBdAvL;l(%FgA)Y?qn>WqEL{=KoC4yC1tt3$KX5=WW3o?j;HnT5Sl(e7{80x7`a& z)z-n++dCCnQr>J&KX=GpUvt=Qzio_Nvt&40ldzlZ10OeV3#$+S*omtB8njbRwgq$g zB?16~#Tw`21$*G3)!fuSj%mmlws65HZkkItKbBQ=!CVpt3(J-(E8=O?a1Vi> zmIo~MI_xJjFUmHy>@rtYR9nIEli*k6LYguS)fG;D|NgzW%|6Hm=1DtWD2q^uSbJ3n zwG0=QNyKpf_|%86O1v}Tzvb6VB!m;+-iLY0rm*-MQrBOCdj8{-|0HG8{3O#~{rdHz zZ2jOlu+GgzaEF5(cL0%nb)`FVrUC(rlN^{9`M3IS*DhUc;D9_#P32h^=u?U?!JfUC zi!3?~Uvi{Poj3^1M=-K=fyD`-M}VCS-h+5;;?H-j=;^ z(jIttvsGcb@su(QSVr3Vh%%13tD#PLII z?C7Dk??3@_AOej|<<@UhH=B3$BwM&-3#B3TDSHHeCXX)D1pN= z+DK!2*3tuQ#*8blecT&f_$gbzbu;S6d)kffy2f@L-i0aBjdtDj^X#Tu#@j&DqBn4m zSVFt50k=+EX6qzrGWe6|2C&+qw)XUc2W;KTt8CunarXZAO|wbUxNL$(!6*QrHe6DA z)_(ZkTW#sng&h8mwR_(;lD?4b^OjRIk~Pv$9ZLy)Vrye7UOr<#|H%&8e}ldIp0PG( z{!pK@h(sSGFQPZ`=jhRT``))#*#_)BUwutqyXW44&`bi_6oPOl6KX|Ol=_O9W+D;m zoD`~KuV=+ms_@ji+GB_r)9OpV*5AMF%o?D177jys>r3!>Nwt6Z1Jln9Vt$IFc9;o+ z&j?4ae^e)YOA>SkqS z?QQM)6ZZT|d(mW@Pt-d4*g!6#jkVd+rTt2CWexK!LOBi_c(kFAi!Nt~{vjK7dyc#3 zg_q8obm*_}u&*cF>jrbKwcTyYPD}#4vKwAQp_QVUb|@y*uAD#FMvTQQEtlYQM6Lt( zHd)+mXKx|_fJO-b(68~rsegqM`)zu#l4eXDoGVy|_*%nvftS)AlgJJ1tz^?(d#*Fb zYiz?S2W{i3eO8Gnntt$(7u-48=G{ITK{T1bCSP?uuMgTk#boNnv`Cm=TmV3%l_x*# zkENYagz>dWAdruH#BiDkCmprAHUP#b)q z@=(qZ=L9eRW^WM!d4dyyG(|;O_QLZ8_RRC!>^ysv#W&BlahQX;&;j}bqOI0@tTj?Ut6$bw$*d__4#L(Sxsr3wF6e~0ljSOq+vF8@-WL| zub$1Bej5aS&mg$6cG)i5{OTLFXzFy%CFdaQTyMX6^aU$K)6J}_G4(lbh@q$zK@r*v z=E63-wA=PF4=!HJMdr^;L;GKMXo`ja^{>=;lN3%5cM1J@7Zomckw!@kdn1#deix@m z$G#Yn;-_gI!dJhs-ahxmuLc2tb7jAS06?k{MPy=zYDgfanu!&x2_(9de@1w!ARWkfe?U)-%4VQEAW5tai^eG8NGs68n< z)4`r!cHAC(cm=nzU>q6-m#iCuMzHDA+}vnGhW4==Z=R0IwB8&RR@u*g@fbF>JJ_|? zEI{2{8{4>H9kx)<+w>VTZ04NNE|vM>^Oz7o9lAC-+1NsR@B0_pCqFq5HD7J*TmQ7o zHf<_ovC^GEybaR4Na%2TblS8W`^s0YMsgebOQ0K62PGXpMK6`<(oUNW*>2pvt;z1Y z?@2aYr|knDSbzqAY22zJ4dGz}cj@$jR*_zclcpnc9L$4e`_->D*^hp-&aS#@zJ2Nw z6K&kMVB`3A6#ytaeZd}oVyFG!e;#)MfUkf3-KcM2vLeekI13ZyD5mN1$YSi(pe08$`I?o?3BRm&9pyCfb?HjRtgBMk6-W`c%S>zchS#>+lw#kuy1|q zDd^lDp@13w%j@4AA)^w&G&0HcgVEQ~cJ8jSf5+bY>eu($O*c%nuYKhz8$OKjrY-b! zw1lgEIB)N7f@g@8`g{49&?{A-7%M&lMHC?w#UU!3UkV3(Ysna6CG(f!CUn+q{TO;# z@)ALfPtjz|aOEk|Rf|>}Nk&Wrq%+LE+Et=7v6FHWKbBxI&w8 zO9BAj{D+5a?YbZU@QF{M0YD6_iv$3a1Ldcz5&(F9=>hxi|9aIb*r0#%(^uO^J~8S| z1pquXRaT8(j@IekMwN+t>mKvlLJGe{%fN%fnGF!E5uif{( zzq3Wxuu14dd6b6oJGHxf40|)kV;hyf@NaqKI+UP(T5^K%z z$8~`=G0*T7dxE|K)q;O`7oC013!X5MDKk>Qr?KO^Z{JZna`YsO{qr#Lvr*~BjSb2> zm|H15dv&6mN=rS_!PM58P=EUB>-+4an9H-rAOw)d0by86sPC#}F(q+3>MT;yoA~PH zjOyENnT~qDe#|of0Z<{f0N1QN#GF)Ox85=nIwO?{e!_FhwlZ$+ud}&x$Jyj71~Y$2 zpe>YG;Z@u!-n8Wu8j{|y4}Rb#7XXmP8=tR%tvGTgPXg!F9o#mM27ue$1c28YVVgD` zJ>xCL;X(m=}FUnlCds5E~bOt&Nm;1lMIsLfFGobAO4h&#tcQogTPP& z$rz#l2Lw%cZDKqGn>Tf8f@Gm1+F{) zLkA(;hDu@`k}ES8r~{yG)}1UY^*m&!JR3%dXc%0G7f_2xCqWlI6w70_2vMq(uj*AB z#>;{tfXLb$pW~3E7{*FXZKL13ID3}$5Cgs1r!)|WX>zUsb%h+rb*1f&7@miOKIIpD z|JMSIcjm*(63Wz;dJ7C~Jo&$!{&D~PTQRY*iw%Bvo4IhFjlFU(Tx(1{@XyCJ(Tlih z7yj_Kgm?r5wYh}Ki!n^=EA45dzOsRvX6LY1+rY05jR`t1(ycgYQ|Z~ei`&5#P_OI2 zsp35iTe*7X!hz<{UW_rG@T~3dz5?5^5v?3Y@~sz#X$uhMzUG?oHg!6tUHV~qfHo8~ zQaF^i^e3)td{j)(ibRO5)4lnlaYgirX_R3qT_oIF!XhNnoumLF z1@_vi9SE$QL9<3*yWyJYth zhoGu$D2MZuV+-ogUs%4AoA3oT1!mJHKYKlPeo@~Z*+M<1=j=2{tXvA+simj#=VFSK$5ya}>ms>(;W9bO?U&*ASW6!0O0uC)#o!}BosV%x{ zxJ^LtQgu~R&6Ro7ouU| zgbNl9!+!Pn(F0IztDDqn>&bo@5~%cY8m1#ff=|o8qFc)~O-$*j9Z*Q0>7Tr}0vzf< z`_FXTKqW;?`?bU%d^spbB=*)AUr&C?d=vO@tunq8z~9?XdHg246WqKdM4X~u=nZNv z5?qt;>oyMie)8k(X#Tuli{CfN=H4;ZI(3I$?ax_z+C_Wqso5aVEVu!T761CJsrC z9^4D8dK*8ouT2`0$GWOLDw8XiM-ZAFiAj(_!|m9y(`Yn1VzaLwZ{3HqwVivm+CGlLRmh~A$HQ62vCA8fTXD+_G#;@o0}LkDq@lO^mCE5r)#r>6!T+fqCHX@h8H3GZ4RRUchQm9)0WN5a$(ic{pzx;wTcs z8zVG=USW=f2i>MK>xwKc_>^PTY$w_Pc4MOPtPQ7K-f`1hy9Hsm{=Lxd+^zxYN-#$` z=_kApMrU^#_`<;CG8H4bkY(M$x{XdFKDh)A+QDmW*Om)?e(0#$>BPDZZ2&bLZ2OJ^ zd*X$iwq{GIWp!mQwP3o2GaVA9B}@{KPAuMN>Yl z5heU04FGNqn{dsyTK`CsjxLCuL%>=>1a)W?(INV}7xr8J-ZOqk+cytQig%2#Ik$~) zp8W-c(Y%=SEzRmW)YtJJ$^EHac02l{o4}y&wP9`Pf)(WH>A*?6L|?bdPjHe6U3hv` z5K(@vpwAOA2@o1Ex2L24II^j@@kJus}u;57PJ1^ z$mNzTYj#>GW)%DO$hO6c#@U^B&ag>WAne{5(_rKgb62*ai*idly~h~x4fRG<^48JL zHlX^S^U)sR1H5U*t;9q| zx696zwzJtwCR@(|oowk-FIqJMZ=>P4&A(xqjhcwb&K{Z*sdt#sjkL>pgkpDZ%(qof zudrd=2H0Qx)wR~S>v?AEowe{Sm{> z-l70NtU_fFf67{b<1bcp{7#~J-b$m!r)P9AUVJ76P9g3IiJbY=yBb&~aa+TS-6XPDQunk?8w>4)=hiYnowZMV^d=Vaz3s6lUbbyJ55P2 zMQ9Qj?1gok6iK-PQ$Lo?gD?7{g%4W6Sj;uqfBo09cJRBm2Q9U*{iY%V9-=l^s%wrX>oImTEVTzn>O2Afdk+@crtL?qdu|@L zX%GOA27t>50H}_2^L;y719l=fAaym9In0=UCAO_PNID68S_~>_{Dghlg>qajRHaFm zGQ@R)yQfmcUm9ZTw=fPe%d|z+BI-BSu15l|;0$Ika$qV+nX5Z>g9Ry=qb2s|j8=QXpNBct-$0YN3xG%V#5U#3oG`0W)$m3@)kdXVHaFfoPE~ zLxQhp2^dMMV$`h6Bk>p=@P!x1|oKmmT4RVw1n=L2H^Fq6u|{p zVt#S=jRj&oLP+av{rVl;rkG%V^_RDBgFt=r8GHHVgV>gSk6m}&5Eu>0N$o}**cHif zQy|Np`t>0Wc^~IiOrHJ4pWS1N7IcGwUJ3n0+cch@cd8r#lQ;jHStp7aX`uH|n$Ucs ze|&~K<3YP(2d8j;DID}oSpX8?uqaIO2#~ZOX)OQ{@=X9H@bsmHN2ZJMf?dT=!>< zZ%;nC)IR#L8|_a&zlg;RI4Aq2bWY(-W2+dd$56w4-?vxTvgfwjcfRv?w&aFH06;59 zoYMjLT*9>FFYmDb_?KT>x9nc_cYpgS8#_*+Y#g+pr{7&%j}9W^k7%u*T%d6H&h*Qy z9}zQ&=M^8)huASqCM?Ab@k86s4Ac8tahdr5ollL|y1mqlCZF?c?sn}xPT$;zbaEDE zZN}ON#+i;ClnyL7Fss8n&mk7-d-ospgUSZfmg!(Aw<=lf|<9Wic<3n<)-j^_7&OkSKhGk z<0rXF@?02!L4crjb%lDw&8jpGgEuiLnCVr*!gskMxoHDaf&b)VXU z#+#5I5s7nwF+!^C%TT*|khWY8!=^)rj*OLP{Xz|QHs$04L7`eZiz?vGS#2?2(H-Fi zQ~>K{yB}D2wm#;Bx7L3}?8}v>b==?Mn{3<`B_M(TfN07;#(dr6+_|&De)WqT*wNf? zJ@ba!{2QlP_x=*tamuGK4DBcrU$qI53j+FPBZ`cW&g)C%qb`zsWLl-70$~vZq@)!< znzFj0#y;`He{d*PKGwh=9BVt+<|T#aqAlP=8wy?XazPGZeQUyF4V*79xWD>bYiYF)!f&mLV}u-eBeNt!?w zjg?x@G_yymu4{5Z=(@Tp%kAC~`>MTAp^qsZk?$RHqLzNH4S_@d`uYYK-_$AXG7F6b z+1cEHhX#d(C01NoX*u0;xlP>-A)&KYSzhM1QwMQy+Fe3{V#rf$%>&V??7{Kk-aNw~ z6$9S!r|^}zsC@@8QTh08p4Im5cTcn%t{oM$5y2c+F-j2tScL$<{)1&UY0^0Mc7xD5 znDko;can=2zqtQ3V%FLc?59pdV^UWxsIm_~pK+Uhe)ciXnDJF&rfGg^{*0@tTD+E*La#l`mP=k~)ZK&zi_Cim}%VCxAq z78F@I>g-hqdDy+zI#_D(2julYqeW+*4^vsH-c(4OS5s1jvAu_o^xr^{B!Q<$5~QOf zZ!t~`P`pgP%cTp^6jL!8Scg_3$XHZd!A<`{cvgjI@v31Rn1#vAUN&^dVAtdoY!r*< zK`IhU2)nvkCM-%3z&d4xr_Qhj<#?5jDZWT=G;)j?JseXFm{s5)q@A0B!-hLTLWfX= zyzjtq=Gb=B_XHa;L}vY@F$BN~+Wz1>`Shl(T1&ea5`09rkS4}x87`zR?jFRs$TQ}t z^qDY}w|<#^F|YK~F?9Y~>$nU?nR$5!_SosfEy^eF%)Ip8I=iMq-9w`_3|MJ#Vp%+m1lm9tcbIqb)btz)9J5!+U32POmKM+N+}t z9M;hfbab>?L%UTQ?#=p_`$@)iqfe!KY=1OVPQ7Qyzee&bht-l-Nz7fGup^b^nGv4;-YFMqn%hK}fB zANc5ayK-h8Wnqj%liRVQWoW#qbB${n6Zh;WwQ6p6-*EjXyY1GYlsy~VrSVb%Z}7-i zXRA+WPZChPRK}S|2oK^U@zWuy^VmjO!-!!qw#MDxG_k5B=og)1$47h$rd*Pz_@3Tp zlqNGyjOURv!t||pt;6M?=@R&vUYC3qES!T&-lK#|3+B&1qZu9A*P|?50n2wrj5%VmDtmhD#oO z(aKAQl*v?tx|+FYrZc39axQ(Kg-WJZdiTs?KO*yPm~1Vrw_^pR2+|z4s;VOvFJ`ZSBZl`d0ij)j+WpuwJacCW2iv%{(pdLDTYL5*O}UFWQspz+anDogZjlp|yi+pJUOi{wl4!nsa!=N*lK0cb&172>KmG zsIbksj+UL((Z)>}YFE8yqV=1E2s-e!|7fOf>!*3id40592>@tMs4ngMUWE}?LhWjb z5(sFcG~gi8I@aLo=f4SWu@U&bFDFi1Uxc-*iijVP+v<{w@J3^#&bU-gbscFOP<|IM zw_KWk-u832y9-|H@k5Mb=gSa=>&<13X?F8XQ>{-w#vhX)fV2T<4=-%=lLNWasKO&g&CvUZP+P+h_Z8y%(nz-<{+a7-m?W3n_ZQRW9w&>;=He_5EYlM#v z*__7G+@SW*0pZaGihkzZZtD+myKEpD0G6Uy3?EeWc6ofo5IuG3f<5!>0ekGxWiZ-C+CTo|&Ca+JV=}9Xw_ja^%_^ko6zDB4;GJ$GcqeTnU1m)cIQ}SJXm?5b zR%`}awfoq{Lb&3Gwx^^aFF}bvr4O(|8&kb8C~@G^bRmlgKi@R~^zMr^6aoM;0U*h? zkVk0Og6RiI6hSzg;qZIw&SQ2A_0c1SbhE{@!|n*8Two9ttzAM^lPi;gmsc5w;)7Mv zZxm5jCb-A4q-l{P@JGNyNi+b;Ia~)JPgP11=JgA{lH@{a@${K`OdK4*=E_kHum(^! z*n8=p%OXR7RnACX!4W`crB}z97c$j9`Rk#{M8Xq|tSoeEWe2eL??1wAf*hMScbbhH z){6}i3omv86Tz`;^SHtZcyImn^hz@Dh(6L>lRi;h4?Ws)8zBaQJCGO2%j5MK)o zl~3>BD5e|ne9}~b{ijgglDdlT89@$OjFbx(vbjN8Zr}g@>o5RH?CW2%U zL(U4!fQP5kIOXjLNh)}vU4SE4F2U-6iKAyKA6^v~KRpHAo4jE2Q@?K8AqTZfh4!N# zEVr^VZS9L+{Q!$|#%#2>_`*2JMor`>8{vQdmnUsI?f8QqT*#sPLZmHK76H~T!BJ^& z>i=TS|NLjG?Pot+!(7qZKJn?r_K}Z|aCJwQGkFpP0FE4Nu%G^Dy*=^xb9OBfli&E; zdr@Z$<5T%~+w)vJFCn0fw8oy}$I9%x-(G3UQ2F^E-~M|S0Lbc0d3=#BL~(%7f$NqH zN9}w6^`f0BsIV`8>Em|Q)xDV?(8l8R9_SR?i6#2Sx!5p^857ZQW*2P{VX-$)d-BWMKi!a zY+hkT0Pbn;-a6C@2aC#2Odv4|OVJ`wfI844$4A2 zV=Xqw_U++j+jY}z9P0ICQbGBi#Fp6VH3wLem7qOk4)a*HZ+JC6ZQWK5BVaj)|HDu% zH;(y%+u5woL^hF+%jqz=%WUPVtL>h5UxfewDkdd(laMjCQQiDs_3BP%OuhHsTgf8` z0H_)cV3K9U$_+Mt+(Z{LpmaoHyv}Di^=qlZ~rK*E~&e%WHu0=QJ3s8eQ5LLNS>!00GHavB>ALe0Y70?jH z!rZ|Kkn#_h3Arvw}JVDyO6wo3tiSvhjsGZ7%VL~4ofAvJbskYfxzH-dI_r3LY z?BqF{x^S{xf!V8e9aRq9zEE`4I*$YnuQ)yu)Pr}3Bk$l8u8;6je$p6H2W?BCtuzCu z4ar1^e%W2J5axvW2GdB>mjnXTS6Nv)4O5v3CO@V1`hwA3g&OfA`|@Fm?YA-xr+W9u z!T$9myXCg&HfeGe>SiVMq4fmVC^=X;>dE*i4CUf8eEsIXf^q3I31L#9t-saAg@aP- z7vAI-A!=VJ0SzH6LEJsNn(XBl57?^ZTT!=t8nyA=5QKtRGkG-YUCdq~MB&g7v<-y| z&{8O5!1nMsX9Pkdk>exc8^3?oC#_z{kh!u6G#6X5oom(DvZcUYTE5Ozk=}LB9J}-G zk=C~#2Ode^Oy%YumYTT?hb_ zVzP1q2lr^1LJ{zRq5uFu07*naR7+)8^D!S`mh%3GH@KOj`ST_rTrU9t`imDjU0|7J zTJuIZW*XPqwM$0YRSSor6(aC@(&Y}gH8Hjname<-Lu>5_jQ4x)zRLvwqya#1HD2%8 zUyd-rVPE46$YXrY!MZsb{d&{B^RRi}2MrB*dCZ~Yk%bVP4!(m1B`1Np|66b>kA6yg zIRG(EEW6^V#i-RKeqjLOJ2=f1`tS1){jj_O0bTlQJ_r61XecYIq^>Tw8J}T8``I9D ztM@{1wF^S2Dx21m8iy-TPg{Xt&S`iMCr?NNLYWKjNb5!}nrQm=?%`u|XAX2bvNq6- zKJN{vfv>2n=kWiO9XL|xNKG7vz2=da13*9kQ4#m^lGAQfBCmhZKf(2G-laExoSf3f`JtE&qqnzA%p1g@5sr-c(ZA0)={z-gK?YSl%DM$j6 z`uTdPIg3M_vzU|JW=mf<%pt`byX~`ASl2NKFap0DYZviC>GID1lyFu9ESkNWitUMC zuD0E4j#|$7ZVdf}Hfp%`0DVA$znTa|kM3{7hV{o}S`NJB8pePVZkkTVcWs%|b5Z?0 zY4k7~hGwiB7y6N)h-_qcVC>KGG2^*qd+fEf`5a_+B4@Pd^f&v!XK%MfxAwNI-rO3d zUoNc*fnX0u(XKpr&VdUFgC;%lgXw$8?7k{$a%C?`io3EW{cib}+%>kSQiN*S~+p;fIcK+2Nqwdh0+`^N(^904leWi$|tYyA@x?4}GA=Q;!}&0AM$Bq}e?m7;lrO z47L4xtL(`qwxX4H8v+(+AC)jLL~J^TCeKFotG4jh`??U)yakx~9EQ*+w?EIHuYnfu zS0fLH`NV5XRhZ!GwV70@_zDW}cA08N1bSSaNxW2I6@)Mahi0V+0kFQ+mORYE6(&02 zho_H4c!hLHTms^^;3%$tJJ^t3-}*W4$Ke4s$umAfzmmV=1$@F+#$N~G5rhmd1wXi! zY0~Lqe^se`yz%@)d1Bg3IMFZtRKW#Lza+m%XYvnYnEGps6H_X#evILsKKUk^&<+{E)Ny+ z)wS(0%UX}doXrR#?nOKFbh{HRtbKADxXjkso_k>z+R+fyfp?SFzq2ixHxvQ9$u?|Q zp08gTFZ7^aN#h&civ2|sI8-7avt~oSJ;kM*9eYn&_uhSM#)2zt%EFP>jee<%bm;%* za2G*H)`ZNMlrijjbttcr8JNFe#AV;%w5J)bp#@ww-6$z3BH%sx%tQ2+RHEHBcQq6 ziV=h#&1Iw69GDLrgBp9*_R=~bzOC;A*wd;wZMlppVF@*vTH4id%pq@ieWxAXame~~ zYj1bovDof-*Ldqjdu@Yu3TY3Lwgjz&LJc?yj*olc>n%$41#zk|VX=1I8GGchH!vYn zW`jl#w}rP(v{6&g^dt>q)NvN=O=&N%kZFcDCdg_B%yd={|7@Rb=0CRwA-6`Gcl{Wf zbKNl75En!-)grUeL2H2KUQ+T?8_`?xN=^ESPu6Qk_uE;b5x0xL{_*HM=vcBIc{PuI3CQ}8QChby8xGzEdmobj!=Y| zksm4b6+_a1)9FHZj1klF^nCD-#P+9}F#|d_Gi3jD)0TW&z4icVdn-}@UCE}mBNF4e z)*rPeWiXV=u#?mu`$tzVnPl@&9nlt5EgLtTM4DtXjjp}je*5*-0|wKB4?M@s{X)C; z>S-LZPhbIGWe+{F#SQ~={(>oX&9xI)*q7TQk8EdB*l+Lqz-;@}CnvKR&31cdx=mSd z0#y|c?MF~xBR8jeW6S$0n>8!fixC#tv21~!m;FnTRTnj=WnTJxIZ~z1!IbQbJ&d`i zi5uuDLDby55ndL^r2|A#9TZ8zdHM1a_HX~PfdUyjCu$@Y)`-_0y$>4ITh$> z*wjfwP=!AnjR!Eknly1~@Kav}4x0tXMIcElDBg9o^VU1CGt2Cr{0aCgxe|rADZivl z?oF_UXaV)%il|b@%i7xV3oC5vj>D+8F0v8BhM)~%0&Sa{Yi{>dZB6(HK0iH^eB;5K zzB9=eq^7`^gj$51N0oggwqbVcJcNYuAs7|e&|wHtYkmE8N_)|OgEi4XDZ=3^Z{&M{ z4c2)Ua9g(S$2M~zoA2&GuPOfr|6Yh)vL2awHAs+H;HZuoYuxxJQpH zn=}zyGuRo{tr52iBfL@whw{WS>8ZlFF9?K%1%4u}Xsj0}sBl&p@e*Ax>(cO*RJZKf zAR&4NZT{X5(1bB&Os;+9OH0tk(FbiJXA?-&6Lb;2Vg`yX+OKN-JKNCFUSC^c|Mbtx zthA)mKJ~Gg_K^?GhjB>ZQ3)9)!OI~O@QH0C9SitQlf*~wDko1@A1@3Xfy7^hNu0mw zPf}Dp1Yhvd`M9sA@O&J80w4pHV8lgL2vuF+sl0(1vf;15@ukIso7C`6$0Q_EXo5rZ z2x^KP8tny@>m9pt(|51^_kAzHQ0!%Y^LKw@Q)hEn6gQ6!lWHgH(&7vDt^e~RT3`0q zhd#W>KK}8mEGs1dAf$y*I)7&>!F+r4p)K|UGypW6V+@x7z$ZqsFs6-*vwaEYZ3;L~GCTz4Z02v=#od6+EURg&wo=1Q_E(^B461P7&i%pl`?_qfCx3b(&F5MHSpA zaG1s_rjt*2*I!k;oNo;H@U|czxR^G4@P)tEAr+v*yi{Vv^~m~@hVAJt`6oh7@*#1G z7D;@yIpLyP!7>L>Tz1Zd0FNF;s1Q|aQzwssG1niaI~E;bsB0zSjsZaPU?b|xYEk)l z8Z!d6w}2;19FF>X7&bZF8fJdfW=YINX-+A@HdbkAjjQb~Dk_F) z!)=eo1`Y$z3@{Y?po9A(-P$dv7^Mgaxtw6(9b7aJi74{$Vzw;vCCTzf^b|G{nvfts zO$~>sMYS9Rm;0Pkj!NTpYz%vGyQ-K?UzhAGTQq+hHqL_3mKTRVO_Z&)td2gr-_1Pr z%U0Py zlo2Qs$>_gITUptJnHkh@uH9fC{^0d6*}A#_fD@Z=wSC1q#hm%-Dg*#{-uvELxOL0+ z2RO7IJHoA%WiPKq=oIzilZOV?y*`F(OjKT8B4P^C|09kv>7VS?RnZShVQiO{bNIw& zRoWi9qP|&UWEFK^chVnk=ojG&{|9? z1f;kPa}KR4^mv#>I{0U<=9dLQvk(~Rgiuy{+Kq0(INlnwaU!qQkd7H#tHwG60nXHM zTcXrleQ> zvQnK;L@htnrproT_Puf3o_cJvZQXd1L)~s@8kxx9{}67McBTz>qwx*!0MozsE(!)yrSNgEDaI(O`ZfJQj*27M;rXn^K2)E@Z&8kI*A3J~55bz)#FyrI!GMG^O|)fQQmFu_vuS zKp_8A1&qSZ2mo|<4Hi|E6@E*u7izHkV8gx>f=Ho3k+2mqVgDKO_Esl^-%+Q!Nsxf< z>XXIT4FC0W2W|WAQoH-E$?y~qc0@={PBHUY8@;j|Qy$#LnmKc-&7UJR^P!*`pX=G{ zKE&R!tn7@9g26WLn_EGgv(o%-#bO>3;TBR7FK$+P*in{bl zOb>OyykL*+J$#<;(W4vm>cn~glY_Fk%mJyoj&5F7vc@@n?35ijdTq>H=Ri)EAUX(+>u!qTvpZTtc`c^#Nll_k0T8(}l-80BcsL<56)04bBV@EO_ z7Lt1=yec0>3vEA)k0Gun_n;)L9x8)B0)FlleDDn}6GqJ6`Cc9`qzHusQdne>Fv-I~ z1iS?&Vi_POG{IN6#e7=ENg%0EvHX6x+|f!(>Jj+eY0F(<`$L8&04>mi6noYMXiW z9J}M=)2!dbPS%dOHH-C=oJ`e7^Oa1*bO1-Sx*F6f*P#mfWMPxN@RL`qWLp(CrYG2) z_Y6k>fIX8EIw_ic&-Rla?`FMt!ruL!5%&J~O9Ma`%1wljg<`jG%EN;o^2%l9_Df6% z1NPi%%gP8@v;}4D&t_Vk~L6?RiPE8dyjKAYi=Hw zXC~PAF@vlhLbuWyBqEEas1s60!|ROtRsDJ1dd7AT{8DX4Z84##M@|ai?IAP}d_r1J znQ9XOg8V!?J^80#_Y*L|W)RTc!P9!2(Bh&`YOe5B8e@54kCN$=N~5^3!6s!?iga9I zf^+=kn}kF}GtwjxLmWkmaCwc%(r^Wm2&B*SQ&f*ExT*9phCDux=p*R^)LoUFjpEh&o+HkHNrgNI@xtA)iZ@!K;RA-aMbwY!nG-eGz za4m~5{Q?KFXY4sN=Hzs(xA(vA8k;w>FWQID=u(_xk3PPOOQgFwa2(0y$+0$WBwCwt zF$#dTNAWSx+~` zck(KKjSy(tG0a`Pus>d8>|NVCR3;Mw7c${%EjK%@Wt5cz>{-r08q@Eo7$Ct ziB~GPtOY__;}w6A!M(#DdEzb4Bmf{vmFW}`;sjq0S7!27Y>yDW^w;y(OLXe+ibuJd z+jO%s_`A=u{(Jn<-B!fKn6X!mMqU1R8#JaXiYquDf{+3!0RWkQa6tfCXKH)apRn!gwplZ6XyJl^b|=~ZCS8G+3A70Lxd#;@oWeh0BHZ;8G<=z7+9E)9 zx;PtQ(L)GhZ?_Izd)N$w|3^;cvSxSM1^W-}MZA4d4w9e&Ai!|8G?m?eHk?Ddi)_vF zd+f~dS`Pn5AV4r$3Z`iz?Zap5u{X?6hrBLQIZ)~v7eKDm0pp;k%(;@{>jYUoX zGJoOIi3Jv3nFOaAo0r%z^$A8y=76AMEP#pA_iy8rx18c9Fer(4Y=XS3Z~}1t5nhwBrU|Y5LpcMm4lsr~VAH6~o_lc*2l>a?u%Jp0JL5x# zkAj)o6G4FEF#D=}v)F~(M_L5rvSFMvXS~h9274PC$%<76u)V#3&30eAX7QE4Y=hmU zEvUFSYah6GI#SPrkb)^-u;0O^sL5`;X(osILpb~?<@Wjm*km4JU%)=a%o#md;8Qvp zUBQVad*FeC_KTmdVe!-6zVzj*?3P=Gdx7piY zc*@@ousN)4pv`UBcEEP+&gT~HU`!p1r%l0LgP7?&lxK9xj{%ZAr7HG#ei5pQ4>O@P zx*GhE!?~@f1vm%nu$_sjCwMSPxb%`fyb$VZdQJKdWeFIn=PM3h5#`{4r{W|H&cg`s z2{nnYG&nJbs!-2-@c0?qwdWwWg=rPoE*SgeW8g&_Lfkfy&YY^x0+`IczX?o`<2r9@UQs=b*Zaua^-IO-gjSQZPMGm@ed!fDKn88hJJqFEHK2?*j0`iv48mcM_|0~wU7SE68pp_ z7bhkFh@(1kr(A*)T{J#E{nT#z{&!#FaHy?)>ND5ahdwrv4X*0o(vw1Hk1W{`!(X-h zAcy#`u#g*IfAfvo*^mHVeJh;}nS~DtDJZ|ghtAl4{OfWA0Cw6pzVT=F-jDP{P$7(a z31$=sno#~N8;{xl+=mbei>|-@#%FEflq^VH!a`7kPUznnO_YO5sGo1@y;Nz18EVi0^Cy&7&w!cYc&>`j(j~B3 zcq$t_QYn%+sqxGaMZ^eu^itP<@bF1H#BFsQI?cLrJT~Fktg(h@qgw{7eY_k#-ip}{ zvj)a&H4N+uRDaghaR|UoA~6Ts!5Hn#4gcI;*gWsU;U@w~-MX=Gr5T8s*vKK`d4vU& zHvf1D0s-aRNa99u9R~b5oh&To#^f2+ZVfPdvR$fv^r$}JfKCWeK&351QhL>EhcMl7 z!UYCuYf7-^H-ovPm#Yw0IZhX!W08HBL)l_f#?3^45<99%cRNuC~BvU%7G5`;&YVxl!_8*trGn|*k{!ZRhcJ}RspeaJcFbNp)ZC!L-At$hY~AV@Of)xPqKN- z52qa%h#7E>jr@WA6$mMAv!{{f@6~Ut&0Kti^+6z}Jti5X3BV~3i||%+)m$J-`4U(+ zL)a%ESX<8lri1{_H8i+-bYB(_PfT!`X6fL903G}`ruw#w#KzR-6@7suX z3p%~Yhx(*rq<*26`dBt=9o5DE0?aR4s4xP= zii?=4bco@iNwDyAHDgbO?|a*#Nlmw(r13!e;4IbyJ$oQ1#0_EXX=|D1r75Qi!qJ^* z+hSe{j<;o}g5ZZde3wX|=R})#p+!wR{L0X7QX)+xXaJB1h;CnJbDOv?hrR>)U^bwW z4lpCGmo3_FAJDq^F(v+Lh5G4`wXPO*|LA#D$boXfm3D zK;vKp1gKjw@aj!yA~Q^{zfopSJ-yDZxoU(hUO0^T3H8L9`%+G{7jKBQ6Pf^j^}q&H zZy!P<=IxGG5C8~~4|^R7M_HL zm63p|9Xf1{2l^+E#D#H7Fce9i3RBvQbn<2X^Kp|n=`@N>E_jVOEB zvZB;}{qyzQlH6nW+`7Q7Su)bP=U|hZTgV)H0bd9E0a@K*Rz7rEWsPI+sc`0v!262$ zhPu9B9hqZt5HQI?$hy(itw&f8VdYMFW9*L4%(JlzyK`vS&bsM9hH{;wUCT6AEfdoP zCfyzgrm;jqQ;Tsqpvj*5#R{wD_Vg_`O|skW9$|xqO2v7|vx&9Zv1286-+fy!DOkzn zi1GIR4~#~*G6-FJtcYGf-v5Sr4gK-iCkyO>pB`Y&Y_ME}ipr`=?F{?8AtOiF+(naY z0DCYOegG$F-8+X6Sp}w^j=)PSDn7yD?<|4~O_sx<>h$qrZ1H0D=|fm2ayiJ@t8;S2 znkYFOBzNtcReyT(HkQJV7q4g1UE~xg_^asNEL*jSkR$-}i$3yDUv@r$5-E(F6WXQV zIW7tc@H5-I@Jq5)Qtumr;#ntf6hEekXG27B7qiNQ6Yv)l!Hao@Z})8RN8$RV@z(Ov zeH@>V-piH&BI4sn6FZO!7{2EU5j~FRlfX~)HP2uDG31->kD>euZV5jlV~6E2LLAY? z`7@YaYV2so3(Q_zcGjL<`nnxCTEanno$vAIVs_%{tA@fW=wn;9lp+AI9wFl@OfO$+ z^Je#>-xk6n?`eR!t~Q)_u6Fhw{6)##ir_34EGP6sZRIKLsZO{Wbs zyTAnGH}N(8iY^FLYE;j`2zu;5pTL-^#?IZwzf3wCB1UW@% zIn}l12sQU+V5_}rf339sPm?g?hPGVoB<;Rg8 zi!q)~U?R8bvL4M;d$wT$00Dqnc;@qOL94-y!>tVhkTU-u{;^D42zSw6!Y0zz zD7r|yL0#2(+qMF2?oaRHc7H$n;D<)r-o2IftDj^3`9L{)sB^}#EtjE(+PmI8)5eYG z=KufY?mfWlI*tR~LYhGsV32c81PBHM5(G(5%$X9EB`R3aa@x1M-nA{Sz0RM%4Nu-( z2L;QPC5j4^)}$ngVgyN$APIm0Ip;Wt6EJx&1I+vXI`7<#tB7RY+KP+`{=XcL7DEB@i5z+2@^2q<*`dQbDDMS!hq5*Ca1z zD}7r<)|rXWHLqHY2Y}x$JOCWsd$`-!*)o_`i!8wU^URh$cDPxV$h6)2ga2e020I~x}3qe+6 zRA?b<)9gdxvas}=ch+$lE0Xd+IB`rYu`nK<{p`msqP$3)0T?u&Bp{$vr`JH3_li6L z_N@ojK+Mk~q#K5Uwmn_h8%y`$??0NG?~CTm!AffsuF4P=Z#{rAH<*G6 z|A^5+V|*Al&>#NbY~uC~NSGa|!41;=yW<~lmo#ixSNw;nAQ!1^`Q$5KP8&;pe!N$LJ?7*>Q62wPQ83Y}x+!3r>nooid3K01NR} zfB?N1+M>Xppm@tWg(cHdPwk2?{OzNhjvpR>{3rLstQolQL@-evXMrGIImCPRHOE)K zx*pfo>*IazS`z>MH!kM1<8cH7x>Ytl>uF9+Vo6Q>8r^`3vz8<7t03vZPlz#uZC-h< z_}&w>MSYSb>hmRcdD;@()OF%%+zt*If^e1%U3t!w+i0$WFco!KMwWoW)fifyK-XpS zybEW>#TQKjPe~w|wqw~E>PlfImh{x;+_25gTH~BB)|zDEA;Xi4YzI;lgut!$vn#U z&NY&-sJ0-W+IO%HtHdKHVVbZ~#IRw}oEScsx}oyL#)5JzmP`p%e)PaA`<*qO_lLw~ zaQKw_Vl>RBf()YrVpHzkdn~r^ID+8388^T~@dSX?JC?hi_Hx5qT((>YV*qd(Yv#3^ z;^c{1yc1j!vu2J5{w`=Bl#SS<1q zKg8R9AdGdNIm;r4r;=x%-4S2^+VhM#is4V*6z|8f`s|syqP9mnBh-p%4rm zumy(iZ$AGVma2OZ4$X)^|KrBv#MTn=7?6dt8hF#EipR1g2Yi&)~4H&@KnvOKa`t?+FAJ&On zE3!@5L)xtZfH--a0Q8+{ik6hy1>eY;rc$8)0OK#0^OgGRgvdv6t5{T6%VC0 z`o%@nv;hMEHVj|D0HEu1|M=Bkzct?V{_)iN;|&0;?^Hb=U>@2WfA__Q;$lwr{ox;d zAV#BPEIe3PL(%v0w?k!pyLX+8|MQur;&H4fKl#b`$AA2t3u6G5^*yqK94#0xb`$Gg zJs4m7+_Kn*(ZGNBj~|Hzmk%Lbod8OPU3yk_Z>@Jc`1ZYIWG1o46r@o zhUt1s$Dp+exScD>+?$ee#Q}K)@lRNpPgth)F}NcR`@-LjAwT#?Z~4m~QYVh(Z^k-l zU=QD7d9F9bT+m|GdvQ0u5#lzvRGKfNf+fbZ_0zNc`I74nDfSKZO9X6}VN#C=~hCLkDomXmGkn zcTICmk-?`y|7p_;IG z<3BXC=PJXY=fS_?jnsupI6-ULIc?I6k;F;D1Ju`drNVF4OoXsw%8FFl#(&XErOHzn z?T|bTIBO2?iaTyugz$72V7uH2BDhBC6@7(SkC#!J9fjQdUyd+oL! z0|49kEU|lEcyR+>r!d-FfC0cD=LK_~f95}jbEU$ve}>txR71>8()nO@$NUgqzAi$5uFqn#}n zh`#*N(fGpWUyfJS*2eUUrpKad=EqPxpBaZQ_oSt<|7W)|;o!UwCa!O+(kP-NrDs?l zjE(8(VU`Q-5mw_uTw^H>vt57s55Ow`^Ip#ldTPmV0a>PVPJWUf^aY1o(Z;xLML4lz z({8*2v=H`fNL+c<#0*_FXAW+whr`b)Rm=S4Z^y-t56dsOeY3A(_)Deo!~cHh22mwY z$hE|(7q`XA7Z1kzwMP(m56SqymoJ#essAFxM$RMl$>I_-k><*`m${xdyTLzYd5l9D z%e|AgI|k47G+|U$zPvU@5i9&X_blQB;FK6Onl)7+VCgz{SAO#I@m*TQdK%*pmW9& zet5Yh^pkvt0yUnMaYc8@dMasz=g>GwZ*wDup)^PNKWuQnRMKW4|J*-T_C{A}kn%Nu zY)`wP2yi=ln)O}Uikui@gnq~{@aTbodE%&LmC6)Xr2*#KkN1RT_I*Q;+j#Q2rA0%m zRty;W#l%t2VhrfBN-HYWU2fJdf&oA+ZsQ+*d{=DTdLlglESisNZt%cyb&06uB>r;v zh#kA?2>~z{W&79|&M7SaN!e5&-~a8k2uHV}V8BDbRWs8op)7ED%@H2$7=k>Hdr`bK#2vR@5Q{Dy z&3>k+vuIs03OOvV8<*nEzvOQTQQokK^C}aDq$%K_JO&zy5m>z;eE6Jz&pdImk$KV% z%qx%$5~2f76Jy5`atoux!MN(r@F@&L7i&*rle}qthTy2JlSe%zJBJc=7;~!%#Vwvk z$yYTH!xq-0BIJQ{x}bUD=NS$nxt6KOJk80*1BXuHs{JssfL_QDN5zb()x>ugSP=a%xIV*gag6DG7xH1(wqlQI|5+OYB~^E#}Xd8gIWFFGE-05u}>>>^~p(xkqZ6 z#A92}EU0 z`4i7@&d&lEIJqdfyrV61o|u9;t$_|HAO z>%aNj(<9=bIB_jIK|Smt=!#x%#WnL5bHSEazjH9FOkDHcdaOF*!tc=6lEJV=>fmT%AHAxdMJ1@NGB6=}s;;Z?|Kig{Sf59{`Mfd{s)fLqRe z%9IwUzwuJ`V~fn;AF~RJF8Z&YK#wtnjEF@ys3!)WJ`@3D3rZ&r%Fmrq5#D zz#l2IcP@*o5`Z&|ahGEVEfIIR*#qGqB>E5z;}!b!%%d;iU1V6yo;Ej{&^PQoxHHDh z9vIi&H9sayu2%X@J~Em)q3RsqC!cQ0*PZ)WzEds+kbTbJ7vquX_``3<-Sjz1{Pvmj zLwEmX%G2uHN-MiEEx7G?&<*Kt)@@Seh{gk!L<(AD+4R|pEuW8Vbqu+qJobXX^u&qg zSpVGq*z&@j=xnQx8PkWO44xK?FQ1r3M}7M$TQ1;cdAZNGfNUxlVjI9Q$GwvdjW+i`SVw)0dtn%#leTbM1g1+qV65eCNUK?5VfM z_(_xFO1xA~mM9S#2GBHNEqth#E+!uI>O$U8cNULu zHSzr8E8;8%FZB5I_Pg<B$|@yPbnP@0u5r<_~7B zqb~u+q)LW;0QhMfk~{-2%s1?f>W($V>PL6Pdb~{Ca?7}Q-v?&kjj#<*x_E%zegY$! zp|N-g9y_ic6SL=3p=%M3kw-&=GwdVtB>QOh>|Zcm4%a9WmD0fVxr4PWlCKG>jT4QtIg}DNQVJZf8(2>cx-9SZ|f>EQkLC` zv|P)b3aqAVj_nY^Qpo_5<;mB!whCf=cX2vvA18tjLU1b(%2iuiOq(_(>s_;E9ZJ=~ zaqF#1ao;}%W#Gwp;_=N`k8om)(_U9!bzxkwcorLi#&~ks=6LDlZ8353%siQQ{OEo< zR*O3rV#AJ{ge%zHv2MdQkZeHAojZvWBUk3hvxgsf0VVff+;(3B;Tc1}d*KG@ERz~W z=DyV+Y2Wzm-@XpRf>DVi&ehUL@|{0?@Wz*Y2LM`MKKS4Xi~t@(0M-y6|M=2)?|T+t zVeC*jUXJficZn*_Jx?hvUtSZR`OLDog!pow{KUMNH?KIM)l=d>(M;1>UNdp7pIbq^ z(9b`{rZnOY|KJlCW9X8jL}W6dcxv6fu)4zl;NJCEKdp%yuAdk0e8&VfStpVSP(jmy zk|W1mK`VU}e}q{okQix|f0dP3pt_jx+xgfdn*?CA;g*;MeMxE6FChxVkmuYWn+qKE0|hi;K*1e^8^Ap z$Api4cJB9Mo*C<|F_7m@8pfyqC@hn)1bL&vxqKv5nKshYmN!x^>%8>Nn=8I%6?c zR+5L4wT@|*$VGK3y>)+f6t}?yZo(RKK2~3o*l4TZ)tCqvQ>LzCkI|p~xbZuPr+~(m zE>7$r^kQRPiP4O()cD9kRrnWh1g>ld{jK4NEiUlLag!Dn^sDH<3IR9h;)KtM*#zUN zV!;i+40;LYKxa%DwL01JA#d=;!-t(1AF!|735+-FmwDJMmcukK#{O+}FmZKmBX*fsc-j{b@M5HIDWn1OvQK8oQ6R+jj%1&a}AZ8_Zkio%7eKk zZ7#-(GHA3oWF~v!csWlkODj{yK!J_0vOR7p+*CRj%6RLzXQkkYxRmu-9_gi**5%yu z-Z`#fUz|whl}eq{)@M1U^INyywxt5RHGGM&>rb4hqwcPlHf2IgoirNZLoN8%JBCBI zhgJ{dBwr;$L+}+L11-riHMBa*$CzIo@Hct|IC8W$g^_I-q&0HlSeK3?M~}o9pgPMM zQay;Zz!Mh08givTzY(K>nwpb@J*wrjNei^QgK`7KYITemH5^6x@KjC?#h{=+r~PPp z!c!WY1&J;{XO}qPnEMy-+tS2g*Gf-#3`Ce(DLhS7x;j|9c44*uB%(Zi2>OZPsCvnx?ls8rQOeBYD}*e7$93-P=7 z*#1L=0;+B5!fVn1PM8m*yeI$Tm&U}{d^h#6pc(cL0sxM z;PLPiyDgzp%h{7z|!$nX)%@BpyyKnr}z#j*4%3;>`@CG^M;0QY};U2NXG z4VlEHyq}4oJDzE%rog2F78(FN^ZfC6=;2r5)|+M#T4@S05De5`12gCZG}i6${)4UY zmHVELqelw4|EOOkPFW*o5PQ>k$w-Ci;3jZBT3N06V{>TPV66thu3IN*<=6ymEhH&7&CSxihsgxaB9C2nGD-`3|8>sg>um_ zq7C3&U0pq={Tm^t?(O08;WPCR4vQx<+%~pQkU^>rpEu>HGmqd2Q&OLbUpOm>W zw>*&G)sK7ME9EKZe!=5dhW$?27{JNBG5Z}>T*ltHXt_mwUe{%JtysHQX!q`^xhQxkI*#e)^rFoUDod!G9?WNP`3T zIrnJp>!q8;J`ouVFev2P_9A@s_OUB1& z!qrq0LZcGn>9csXRCdg0CO;>3CqGBsK6ia>A+%Qwd&5234#bHA2ciRyF$0h}Oq)Cr z`Q|u`qfizN0)n{2)++$ij*sIE1~WF|hGXnU{3_;z_r-JhOy_}D8mN};#r-_sKwrft zuha0Tu74U7R1zjqS-AXb8m=-{8jYwX>19y$ghPS9&L^@6)SM^I!_@WgBIl&QMAn%y zED0P}%0bw8=G5c2xbA!Vjq@ z?5CAGE;&b-Tcu*NOq2JV3ZPq!16v4QYxgaJEv@C1iEkHr2Xr{Xlaq_LC6$Lx7C zp?{UJY5hJtgzb(2y-%Y+pF%jnNzjB-;7?85dgB-i{~!PWKmbWZK~zi*M@|FtYQef8 zvHwsb2S+!jKI@_jr^8oKmoYu)0Z`=>brl9)%5sI1gNvM$)6W$cOzWncqw;~%nRwmoeo-4H~df^U=pqU zW971avHXdbG8EYOkrSf<-l^quL(IQ!d@Q+jb_~K=@(f-u5}4ph!U&-GO{a31=yq=l zz1F?IxDM!3NzZUtVR7-Uj4O^|F*tl%hJ9r$923XJIlOT2i8j5mHID2%l7_99UOa)*?i}_T z2W=ZbIJqwOhrk{grR$M2U3qr4KldNX$((mZpUQK?b;(cmDO*8`L@>H19-D*TG@bD+ z=7_CzZX{mQY1cv%79o7iU_LjLgWx6bPWe1W+-n+Q2=wi;r5DER`4eN{2pA7^8qx~a zl`iLq$e#lMOcP$#M7_Yu@)PDX#CmwfINDSX{hf&|Yxl=XkME4WokQY=cV86KF2evtT@7ivS!?rf14P9~sj)*j+uGwZF0rc<}&wK!v|8 zyl9)oli4Z3LmvyBdYNao&#s&FA;*nwIv2=W9$&xxNP&`OCGlZS&}aD(FXhXX9m=;_KW1@>g6*$=# za!7>x5VO(~!Y!O!7=*yRk`vOpR8yg1ItAHIyf)%kD!kHi)pUc{{K+61drdc2BG&+z zU+WNQvvVnAFHXjm2eboiZky==lIiVG$7wcnJeOdr(DzibuHD+%WU2(HgxQn9q&W#( z0d|@^?d|O_+tmO8S3gqTZHUed{(OCB6`Z$ad zcl@|fD5&SgwQre>!mu^I^^Y&dp8ZETRW~->cbzzT6y_c`U@QW<2iv-BSHiWrx=-AG z`xUrjp2n&CRdMtPuAqNue!TbH7o+g6LP3CF`MY~zg4SSpI6Qvu_pV1U4}yt|0wSlG z-~K9|`0Ix*VCTXCNaCqwt?{>Cd>BQ+iTKFJ@F?(}`4~5d+#*;p>3%5xk9pv@Fl1=} z@YGWW(*R)htm$|Fn9oVIp}_RK%s-}yNn=tGOWL+PL8%g_8~nk-8>PP|hiYq$2|t86q04y{v!|I8 z9S{x{Xil*X28X?53f-uksKrto=HV3X`Z_tuFmKK{j6Sn+8r{OzpZit5Gl|6R z3>=M0{p~xC#w%;~qD*PcIKkua2H`__MT#HSK{Jl>5@wbRWOl- z-Gv0Eh88n42uhE~<}JGsu%SG{CDH2lO8u`}amX`S{Dk?>QMC{J_=mzV}=KPI5#IYf;C`EAgl_d4#`=nI2G% z9PJn1{`RK0_r51$$gq)d`<+)HAgZEmwMkdYisfedqastBu*_lOFUNKqUQ_i%{Id%sd#a7Wq!R3$Yl%y&gO9~GQWb6W5#*1r#dI zLNgmM@cPp~#sFZ|*7)#8ua8fB>bl(A`QDRv#Z`=*!{%^-E`$Kk0N_~$aBvy`y!D-) zn2|P~Pi#xs`6}o~#F0bY@vU#Hk9)uRow#Dj%=n`}`4H=j>j}&Rxb~X*_#s`FZtcSW z;In`EbUgOZ`uKl8^M`TEowy<6z-D0pP|9Z8NWXUNq4@k~m*XJ^Vcs3MD4X0FqsCy= z0)y$e>2kH$0CwkCw=NLg*?PSTyLMkRkqJn z`m2QRLTDu&^wf+v>ikQd0vgvJ359rIo#t^(u&msCQsbbUr}9Q!iGw~DUk9)**fx0{ z=d?H@BPQ-9^Qwf8E4_8l)N)_sQHE3x0Y_v>bJ&x?F4iCCOJ$w}YN3v?&?!&WS*PpB zVB-6Z!<)IOnbWg;|>*(DG3_t+PDJI%5awN*mj8`fXTJ8+E z#jO{h{x`qMZLuN6eet(w+WCKb5~Sj9+s@;hXu$wrs77G@K$tG2cUPXXIw-~MBS0Jt?h09c2wS3JKxmM>oumtDRX1JP+1p~(-p zt`y`9N{6YbbqHEs~c=DD`cyv7gU|`Bi4FC=uuE79cXpH4l zY9#^zd5&V_gn=uSz%Bv&Cj|@1g=XPuuumK~(m)7;y66M_uO*Lhd8FNZ zmwA>#5MZUudD5ql*EZ4i9Q#Cs!r<`G!Na8M%00zMJRBI$+Ez=$RD89w#;g&rcyML{kNqyuCC(=`m|pC2r3BsHho0 zSO$$u9ADRC*O@L(79Yo;>cpWFQM2z@)E+$%Bqu!A$hhgIX>skf7zT}DoOoty@+19t zvoE_>>aMtzJQ^_fzP=8xW3L{IWw;deR7XQyC+-dI72D81Qj|EbF>`X#N9A2?ZiI==bf3sJ*bcHNDW;;nbjj@fgEMSqN=bBdMW z@&@&kUcJGapZz1p%JvFrPct^LPS@49aQeRu9vH!yd>**#8m^41jXkY~kSY#`b9z`F zIC*}{p^T(4;u^HUC;lr+=eK))(uw7qd^8nGzWism)>-5BVMUAfCh=H);r< zLC_z|`xjnzwtQI^_kKL(+m69vD<2K1daqr$hkx|3wHSG~qJWr>d*Z@HaJjRs7)pNgTd&5hU3>9r zxiGH0Vk-QiLTFN)tB&>OOe|Y|B)xt?Zyn`g6uRNWR5#M`eGR1Ue$eydl+Sc?wj4qxGxgQ@)`0d{&p{K zQ{2D%t+BFK?z#Dv7Dyvhg0#bvc&`k=F>+3t&i$M+G5er`+`8OzonekCf9muEAam0_ zmuu|+4JzT^a_yyW8dqzCS15j!NtgB?v{j+Iw86e9BUXl@jKzAD8=JO5Wes~k6)hgt zY2qM^#+>P)k+k-!KgNA3bS%rmG}2FHWVY3IQ6t~LpYm0F+9ze?wo#e2e4L@4k{?4B zXy27(n8x;d2}|j5-eHJ?ig{n9Hf-ISa={#V9}dT?^v2+a@7@P?tc5OZ;oW^Aqk152^ov0{>gz+Ra{Q3U1S9BR{XAezEJd z^e7+rhhoHq0|)BkYhT_N&ppu?W7v~jcJnk`VdIspANy-*J8)A;qYO0_H_9g|R?nOL zxX}O(onXSIi}kjd5OTG664<%^aBNz;hnV4b=VDJj0z>Z+7)W^eZ%-Lj&>$%2_N=nxgDhsC9zNhX1oXaZ{dA z`G`2{Z}D1O7f+=RzAJb_l~JbFYa#TEIb+&FuBQwRy2E?rChB1-n1^;&`M9z-=cKX{ zpLKCELE{E>Qql*FkE};IsC2_x?2m2q(+O_nd*JC@7pDEvbE34MP|S8RcJlG*A(~p8 z=Nj{xP8mlBGLjBps@%%*`_`jzU{77j_&UJt zK`2kg%@`9CW{o7Q#HbieILB`0+RiP7(ZTo(CEc`1L+}ROKW@HuV$7I^ zJQ?|_-dj4MU9KsjrnZb(>mmD~ZJD|w?_L7%jkEhH|A)=YUopwS_@7#SV9)Fs8 zw;;b7SdE^cAr2m^iIHPR#YKb!n0x7XWN|})75g4Uwr4rShTT~1C6!_4No?p_`-zHp z{s+6_<&|sjQh=Ac0nG1X9Vkb;W67OUV=?=gO7KctP^9l%L1ZN>O6$Nh=b`^3gy6nP z=Tyql&tA|g*9j+_IO&9S9dX`^4=jx6EBI#Yx>@h+r-m)!lBGcMb4?WQ3|ZjS+dO>4 zwQkzf&6sC* zWiZ}S$HtrsM`3X5;Tb&t0lTWf=u=t0ToY7Ydx?|w$0Ef|am-$7Fg5_$<5|}@-rE;x zfqiza`w<3BtUbV>3luG85{5XYh|_kLY5ztve7a32)WeP!ZSMJvSEIGLd)SgKG@y zREA@LzMSO)28h(GJJ1RcyqVB0uROUk);zgC7A+Ybi{HZfiF~ySeUSzslBKg4v$S@! z#*LH)SF4q#7)<3d5Pr5z-8%G1@Zt5R2-vLbPa=<=gy5Bd+|K`Aifp6gg7HU zm{&R_?4`x(;hUS9GF@d!PVG=ggUh%iyqr7c^SjU~LPPNYzH8UU`0_t|rZ525xBnEl zRVe>ex=83{tcrpP1oU1D43$wT%L`?D*#H2+wiB98yRkkkF^2dmxVD3qWnKxgn?d`j zVy4XSiJ;|1s$9v*O(GXO4F(Fr-#-@@nNb-tiM)$}lc=3ZprWk`?n6dYCQM*BQLIbG z(FMdd+ds>2k#WMf09n6-CSqySAZoW@0N?`Hr;m%pK!k~vxMabN*+VO1&+Zx)^Wkw3 zaWiJknhb-}KUTj)OtL*YQT`7=fU^h-twY4v-X0ea7x67`nFmY<5~FEntaxq_*IyKi7R^90TZh1ROY9;R*O01_EJ7}*#Pk|IjJeenhY#MKXbZ~XdIDE!C5 zTqJW0Gyr(^xpoWy9s=H7@zIZ788_YlF=rtt1c?7cId4#f;{uowLg0Sx;cfB1|MydP z0GP)Kf%*TOIL{RXoZ_ zh-c!jcqG&AVk05YP{rT<5dc=B=yd{WBvQqosB}u)WUh$gZWx>o&KK*aDDbZzZvS_~ zMAV>s#!WnP>&h!|i?R@FEre7q4if+Jl?!G55O6GFr5FCvdeNAS2XIrhZo@9x+nWu- z#q_ZuPH>8>qfM7VY-Wf}J9YX*;#c7gjImGwT?I2*-r(6!4S*zeGHK3Z`|Dgyh6_Sv z-xPKmyHjIe+F0>+)&{c2+ZknFP`un>NtcWR-ddIJRYH4wbqL;=O zFp`ud4xW!&*=`1bp2Vgto$>iEycEy9@JihEwkzZP_goRM*{#iR@Uq0DUBTvj8zR99EY*!{pP*PaXr)( zzeNau#Y*9a>k3WiA-&z;|h|@h6F zOK;tHi#u*M#Zj5&0(V<;4#~i|=~gHu5lUK=a|4q=_z%b1@^jNmdzv693VD2HSsF_j z!_&4o&)q=hrkOItJNqR=C$8JK!5F((N5Tpi$*+jVj%#1SMJTLz`Q=w(+(u)BG=(xc zS@(}J=P|wkWFv4R>d7EChQm?bS7E$jTyTvAi~%YwvMkt9=$3u!#^tYfD`;LhaLc?S*{Ai()1~zA8SrC>9!y+$A#~^@Dwl({+l%R;-#1O z#?#Nd67w%z$f;st?hX|N!2$l6Kk0Gy($v5Bm;EW$Ec&1QL#V}RqWu^E9LLZ_{%aIQ zj`FQ7ZD--BkKm>gV-*DPZ?*w|<^-K=h_?^|s0m|(YJfiw9!k8=#tCv7sS#3Ih%;uM zXi6ai1DFOt&@lUyjzZ&IM-bLB=LfRE6qVdyHX|Tthd$_K zrxV)bIy8)VJYpy@f=LT$Bdzqn4_6{s34w|y|K@)crYm&yR9elE&iL>D?OE2pnwYcb z;+TaY^dOXQy>Pjh{vH3htu4(f3MnQ}&UYZ4JfnpQbrajj?6ZiFp3m?XhL! zUKFR*F?+@=_8%9-MBG%T4QGPIbtQ9`DiDU?a5hxDD$!Gu{F`62i#E9SxuhDG_>pIx zi+Ky?#62InDCRF1!aQZp31{1%eK7qGU!_++{Nmr>iQ^``^{7@4tvgxYj3HthYj~mD zl25S{@*?sv3P7bt#tI+EK*~cEbjh(Q?zJ6eh#SS2AL)w=S7IoKC| zI(Z;+hy|tIkn{CzDfhN_oFLZvA;Pz~Y7WKAQf~|}Yca_0RM3ly=<%#48mcC9{<>m* z{tN(wc)4%h>H(lTzW3-(WKXymzVm{(@%owYj(SQf((OM`7mssj#gK`M7F`n8zhzR! z2(~24YDDhxjr&(&0C@;cLzi(dVG0H%@*rjC7UgIlwfy-L@jW~M+#z5)1&~ zwS9knnYQ9}Rg|lGQ@(Alh~&2d>}HI*<)s@=HAj8zDdZa`koC1dzlS0h9F|JrAt-z` zCaD_adcgWY<~Dc)y=tA(u=ZFTykjkUH5EJ@BtX72f&)gQkT(t|-w@@1#1-$;+dToq zT7I6fMEaVcJz9bFDU5O(*@x)es{tW#Bd$C(Uh$yP=usn?8@*!d_Jeo{ASfDPQ7#K9y{xJx#Hv zDq+^Y*W*C!|rb)ld}o}_Z5@RI1-smw?iDZg-T8=BMEUhM6QJ+=FBPVw6X& zl+$G&$R{l~oir|$XV3@7EcaXN4c!a657bM5G6~zBh6iL+?&5yVHl#NM@})-sXr_C+ z6yhU)Fs}vx?unI?+at@jkLGp1=e@8J7G54y@V**@Z@oIH;6KeiQ$at~B{$9M` z9vp=dv;yOk6F3BKk4rgBbM4y~#kl!6{Kq3e9}aV!*xeM*J+diYeP$g-3!Tu6rO25s zj9IhcJ2=f=R>nDy1)l?an$O04_wJ1Qzqt!9xsx#fm_^uH#zX?ZC%*;!d6)7vU#?lZ zH~#*!t7F@S{&CS27smXXCd5!Y6rg4%A2`eAO#Ou`M|v0}m$I2&D1`dJ|FJAYH_Fa4 zu6-`VPD%7~t?*IXw;UzRA^X4sN1_!E9DRV%%$XDM0u0@{jJY>Kxr2Dfx(tq<#<%7Csv7E5{PYQ~6E5R1iDQlpCs`%G1!`q;pWEp>l0Q z0(q!N`J09;mRDAei?`xf8*&xroN~s(c!fQ%^6JzF6(I|xVHz&vVITH1@*7>q4?GR) zJV-rK!WuXMa-r^li_{?@`>+miUp#kAgth%q&O^8JT^ayz-#>Yo!T_KzvK|cpocrpW z?3-mMSF}yaP3)VrMPq1xJ8$iWFin{8UYV-%Q_o(-K`G`fZ5-f!3fWS^l(9%T5XxfZ zT+V?)_5^>S@(-G-=fJk6K5>eJnEUoM#OjxKao}zThIUQt0f)s@#{GhM(_-ocV`K10 z6uA|J!dfNs=@$46LN)Ec8_%Y7`{F1vw4v00`TP-a!!=W50S7uq3~2#27+FdC>65&f z_^%On!3BwULbtfex1wZz5{vv{zFzQ(oCMy{Ck`D22l@^s_WBOI0z6AUkVB0e64T~P zkBb+~iW#%V#NZLgP4QlFmJ{NRse2u@zJUOlzktgr-)IDv=DU*Gm`SPNSk&1he2-ouThi5>lM**F*UMynl z7~K41S-?X1s+W)Lf1c(CR^lCtNFraxfroZlrt1ps5(*dg)Wb5Fc`U$xg)STzQF;T<_FMChx+NJShhghVQL zlYUXI^U3)x{g)1?hjiUiUMDYYpH1tUP{!{T;HymEPAOYfChEKuPn~n(dOr=s$lKa< zCXTazUi(U2Jn`6;INoqF7B0CouDWqvjGBzs}yxPW97^6MAgLI8?C8zn{a{cs}Iu%c3o&hvDu+YnO zD>9i?&o#xj?^_$EIRv`+y4i8@Vm!s*g`!KjrK7=ocMz0K_F@bw$$OUm>SxBW%rR!| z)x-4Ot;b^ZBfFyhAYnCbn;DniJ{4mFnh5_Q-{d}}7x3w#e>tA?SEG(ThKR0hjn$8B ziyH9y{U5p%4+&M!Xt=37+A(nb)|g1y zvvgdV>zGMf1*$Y%n8-&sj`BgKlP7Ymw;V6!ILfs(A~fCW4FIIu*5~*OW#@!OUgEm) zCiQdc*1i`8vOz za{0_b7Srx{;e|u-wXbbP@qRLE*+1H zjbri9L(j13J{>pSd>PMXXWYHVAKw%suwyPP<$h>!fz5>EQE*`mON^-o!>$%U~n)d1l8 z-`|=B0N1|d>I?xedp3&N?*l~H~uS*HDJm9^wYcIAO7JxbuES-*^ zYCMzPd=|{-HCL$+-bobCwZaNf>T&vh0OKP2vXOJ?)t6FH2;gBTX#J5P(+;6?5ROaVdrY{wceJSPlefc9FnMsObsHK1nYim(XDL=0>o#mL< zeAzI5D->|f3yU%>DyPflnVHKx$v`ro_Pf;dEH^jB_;Vu;yBix$hWbXvv(+s9Aa@yHLh z#OMBswdhoz_|;#(4W?!a%nwYsN{BbOlCIDvd8Ox`-4>ty>|@ZJDY)~0JDZ)N>~nOd z^t)7_Joe#3r{dl(t&DGfZDsto|MvTF%Uv)+2(84!o{P4@{}LK!Lwx3ceh>GPqvDVM z^y6{iB?zR8eP8xVv`AQz(SCZ_ukv>x3^><@;zcQqk4bELH->`8GW>o1cix*cGZ%lX z)8{tXHG@{pQzQ5fpdpg9jOjo|j_l0*N#;W|l{NRRdl2-V*SZ|8V zKDRLIP+7loXJaf|_6+MV0+!2Xk+@H~7d>+17@v8qpKpES19g6w}40>QbhhR{k!Of`AoR~&{Ka?2b z{YyfyGG40y+p+yH8{Zm)j|!s-4+ttIM~WA#ZzIeHs8vo1)7}XFTDUPIRTg zXHCtaxcR2}@M)tMLkeJkckF6|_jww3aZ}^61=BIq&>N5y7C6>$>I};NgM40!kKx91 z+SH-oR58y@l{mrov15%0>^2c*pf=w7-aB7o0Pq6Frq8Wd3txCS>)8|p`?d=F;-C3@ z@GpUHslV8l{Ykn-H?n^KRAY?;xVb%s!C^HX0Q7RCa^e&o0gf?WCg}kHK}RL9Rm33u zbg0i^NNM1IQqYu>!(XrujEy^Lq7?zbAcSm{;JwNzH|EYYd7A+Ujw?9{<7pU$aZI%o zu)2O0n}1tEq0nN}7lIxiNpRfIMbw}yXetT&D(G`z%mD4i(p6!-;mj%#B)O8ev6(!> zrqYwYWAV^29AyG~N&4%lk#+7!_S3@5?`snfatG|Ad(_)n|eeQ(_ z(H@ z#qeAGkGqlwBaQ7Wjpz?2ccSpW!2Cej(M`Czx_D)E;YN7ZwnHvTF@4H7+yhUIX;a4$ zr&MDyGZhWUQ~unRX;M$evNqsE(&Fm5DL?qxe%nSMp|Gh1CBshk@fvZpcb|xRK6+!^ zbn8TnSP>{Q2aBH3ywXj%<;8a~LweHuYl(^`6>QTU5jobP` z2z&JCXnXYp;wfZL3igL4C{%Lw_fokhE)=)|Uz7VKcsBl}qJ#lfK&1j!cj9&RD8lhB zqEJpjIOGW7R_Vj~E)S#((NlBQ+ZVyt7--H|XmEe%?Z51DB&1cKAg#<5BRiVs8UzYoCVG&F(}udMh|{{S;xnX z9*iOZo_p9}V9p^b=CgYY@v6Wr=PUD+Nv78i-Tc=QTIMLmWVLn8l+D2@5Ptw+tOlcS zRdzU*Py@p_z|w-@?(;8histrSF>mfPyt(M*tC&yrlA%p>Rr!(g2B?q~}?-CEph1c>DT%!Yu14rSmJxK!Ih^2`B3`(fQZ; zze{cKwR!#Yq%Rd-{#|~5KD@Ii{utx=l~uLzwXeJ!n|JJwsk7$9!fVIH)Qd;NK)gqs z1t(4-XI}r^{ZaGM&baL@m2u}yV`Ag>?)b_#R&z+GnKoBZ4g~N_Tg)UY+*t zKOXn}-6l?-79IdDzim1vwAsty;WM?4tY^Jp48&QL#JyPq+X?M)a2JL;^<6Py9Ns*p zqtwDvf<`EYPSqv0{CGQatOmMpY~P7EwEZM`juC#LgS}ccyd5#uF{+w92l`em?{VH- zvWa{g@BEb7?z8fh_~DNnc)oclj+gPEoX+Rw%W2_De|T9oUx`b_&z`cfjMBTDH+j!o zrZMF?!lS&(`O5|szPAd?us6ko`P*mZyjc+GC_k^#Z|}1W zr80WTf&O@3{#`ESjq;bv$Z|{V$g0bk%5~5<>v~P0{4|`-0ruhhcQwU^ms?^Z9xsj_ zN=TT9?!8+8QDNZOgIGddES~?Bn-IiFcJdNURZpmXRZ~S!Q zt-3QdY-!^_LkGruXOL?Y2T6txt%{SUn2YFDhK(5+7ZLt*4ld$HPC`yWymN8fb%0i* zH#igPmhFv~AKM+%(M7%YgY($yRK<6{wJWynI1-C)nGlOH0MJ8)AwhJ%?*S7BIl~7q zI4bGY$;onRuwf_wPndi9Ujv(N=7mNBy{Wf?d1V(2MUdT~9De2=+WDh*89k4SGb)Kw z;-BjZun;uXBSUB%mcyqv>t`Q_!nHNaEy|Q;n@D=+ZLYsmsv(z?$wR~%>xlPFgsI!N z`B-dzWp^Av`P`R+7h(W#`<)lW6<3XkD*2)^-Z~26kl%j%<5l|3`H?SpR!Zk<*HS@e zJ6c{$0-4D-D zfuRqZkCHb6WUmTDXtZ8}q|GlqvL_B~s>29wOkDF;LaLADaINzOR%6kfzT&wR@oT^KslouD zuC|5zJkCU=l>GFW1^LRDY9d0OVsLlGrG=UAodo7h#R<=~j?2l&#!PDrl_PEv{ZLd2 zz?|qlchD?DrY++;WKSrL_r-)`l2VTyGkq7xX$y^uDHH94H?8k;L+b>lJT18-R9P>C zK^I%rqpKt>Cb7)k&q>%V#xi^XlUVF@RJ577RG_|S(J$ITGgQ%&u-wckJ(fHim>n2y5cMg;HYHgws^pX5&t z5<)D5mn&ZAh%bEc0ovIsKK9Y2apjeh6Tu_{Ovj(3wAZGgY=#q|KsSBe6Myj+%VGg1 z(SP}uFNupUs$#rKXlSmVpm^u}$&+W}2S3;rU-;YaWqjm6_=69|g%@fOUYc#xX1s>M9m^2Uoat`jBu3&_ zHk4QRf~f5?CH4bs;O~lj{$)FJD(n$16X;Z=96qU6H1%sN(FSzJ#!aV0j1*J`hMg^mh#(N zyvhmv0WPE)B%WzGX-Y9z%lNZ+0yuo6FvGmFXxNjcEJka(G0~A6fY}mkJbFd!I8%tx@CHw|C@{)^8*<0|9d{rYur7gn0x#G8`lS#NSij-D{fQiYQi(VqUVi+jJe zE*^byS4^KZHh%Lz-58hPrm6wAXOL5@;j~WEEm1E{y0){S_}pJDk4D`7{qnEe93T1QtW=o%SOWm^cS8T4d3sBH z_HQ2I1kf}L%HGQ+oQedVQz);jIPZMy=MWwZzVfA2@xV7$#()3s|0Qm?4cv#x6prO9 z(}J?AR_=}e^B0fdF0&OwtWU;eOR#ptxG7H&m8x=%csYJ{(Xp~$!rD(IG_wziZSl#z z3wQYyYtvfPF?IeqA2QZ0Z{$@Hx4`)vU$QzcrO~F-b+*lw&rs>BpwF_03>lE~T32z> zd(%qq`y<>_*lh@jp=_WWcWJ(iVA4v;757?OP>wSvwc-_zJ=LoVC~-!MP_2FaZ9BwA z*M_2x#i>R4j2%06;4Nns#zvkhFJee`F(1ydYf|x4&uRXXCr|QShi8C#1mV3=z7L0w zzy%?K>`JVK2T+HGU7kotcUV#~8w*Y7JcFxS)}MpKFZZ;7C;V&ca0?0FG!(BQW5$f; zyE<`xIBraMMPTv(32Y+qmgqta^C|wEiYe z%hb@dMyoj7u&gVXuj2?cN@?!0|*Or0{Ev7$!GTD!h39{N6f&!sc5 z6u+S40l)@`5eTzzXSs6Kp?Lm<)$vOox`mDPu%5Mp*Ez>bSX0x0@#zNKa5lvI-hWqy z0LZ3O$Fiq3;T35kC-asdK%a`sSosy_gtXiymOAws_*(ie=4F4JCtiN*w$(X&;Bb8$ z1D6NmX{Rs%z*`R|WcA=QdEBscOI-==fIAT~uj_mnMz4GPBY&FTJbM1tSXzF@OvAvqhcVOeEKAFGJF}Pw`E@WwO~ns$s6-D)V=3jYf%$PSG;j@}sg%+hTwD~2Nm7e_Q?);NoB|#POny1Nplm%uqLi1UxlVb7~Q9D0*|tg2|YMSd4Q!@!I!s zYHaQ5^>M7`FtqzD1_0CW2yiL;%8~3P@uo5u-h}SD2LGt0mrugv-k7AOEW@Fk$LZpy zoxRwJ6Bxm+t&gXdZHSjKI<7t55u=BX;KctWc)Xg!`XP@lPs4tjZ`U1pxtwcR;JNa% zI%_OfSU{)z_-FK8>SYdC(GZ3GPQPtC>cF2D5!fD&JKixjKJbx+?CVu96ujx{f!fmz zTAph*3Cb}18Fl8zR0F?B1CO%i9%3D6;UuV@t%h-0SY?gI8hTPoz85~)zSxJv*y2a_ zraXE@&!9Xdg5#1^=F_E;8v51Ymb?)|L0$Y;R1UzUBp*Bj=_+<0AtCxB^rouBE$mp* z0Ki%Y(Vju_9REV#NfqVs5^aRd8^cNYiKB6kt8x5~Gyo_tC%aqR_SE*X zzd0Z1j6QSWBwhu-gX`W`*B*&?-aQX*k`s`NmE=VvKZ@+(sb@CfG4WJfI)5In`^UjQ zCPpN*+;V>N+iNhU*$s`l6kcW;9srb+cono#`r_%Xb6AMj68TO~)x~7e*gv;@ubkEVy)d;&&OQ z=NDUk_GW!6`&VFX*wIE5dAjRA0k3`R#L0BY>wGW-=%|syQSyypzu@UyNHs{WVxpP8 zHFDCwfm5Nib$BO&N0z_VL!ur(`*ZSd6yIYp0I06QI1oW~;gVPE7L(Zru#eZhzo%B4 z8=El5X+mB^*Z}yN)9Jc>aC)X2ISPY~q44{a?5$bjl|Lwy*B$Vttp}OMoiTnaJkS_C zSx}Fzr5!x?9*$eO!)C9dtk(SvgOmFzVVQetzTNv2r_k9;li$5m%Ep{O?2+6v_};y} zdnosA?zi3JXe4wRBx=E1iL}MC-0REBSdM#k*Dv>P%9EsF)?41Q+fMIYgOs0159G1k zn~Pi4b3Trl#{F7x6>YT)FW*V~lwaxY-TPwiWjVBt_E>%@mv~pe2-?dt>yUR#LvGsR zWn0~orH2&K*e3J%ynI<^58dH;@)EwJKen^@O-pE^rKVgx^C0g*&SBquXL>JXKkio@ z#IBCs@#2cs_`lzNh66u`qi%~4N=VU7PaKY;8@9!*Z|N0x-##W9 z+a|;V-`gA;HXlW9)er9zeew1)Am(0B6_;LINi2Je7om5q2d%Ar;+0o-#;$!B4z`Wq zlqO;CdK>Bpx#5Vem^*V2>GdF>hnNaH#hs3Cf42s20i7{x`e2MsDq}0I(YGIpm~`m{ zG4J{*7zEVChG&VXjW^CYQ%A-xz3=8&vUEsP;kiI|_dL+q-Moa6_;TWSOMLFLYvTJ4 z9gPotXimKU19|``46ENLU&4&M(m_x%zWeQ(_{!gIiBrfuFS~AL%ty{zO(?>%9F$NQ z>3XQk>E6f=yEzQBZT)c!242P^XlE?oH2=aIFtQ$lM?vse17ENx|DDyqURe@+N6X1> zPNp7>jqDxw?%WNmP9yW4lHLF=oI3*Vhj>mUBc%0 zwZf15ek?;diMk+-juJO%hx5^U+gM(MO>h0qPuuDtrQ(Tm;2dr%Pqu?TE9QP73n^rr ziTFKjl@HK3!*t4B%d|?qCf#mRS5XIl%LtL}DD{ChW<4Y;A5^i;;+NDw+LqoJMHVh) zgUZj&5}vGs^=-`>-02hZeEYV;74gI1ISZF=(i4^~#@Q zV&tV=F;&(x0?|pCEltSKc3?>G%HG(zac8u$R?ME%FYda5H5k3lxUuLMz@6T`&Y$m!hddLlw(a-0g4sVIRvtJ%M+l=kQYa^s}2;JK6~Sh)eh-m&K(Q%_eM2S3JF9 zd#qZsJ$m&Y6br7rggG%IhT|=!7i$GtbIR@)dv?~xv)@@2Er&Yeh8t$bZFf(^>&=;X z;Ol!iM8YX^3~MjHc?NV&FozilsM)VU^tE*jE` zkIFJ#Z_Gmy;F`BNm$*w<3KXhHJw!Kh=94vD@#G^1<2&Dbp8ezGxc&W0V$#KUp2Qfv z+Y|PT4bZ3Wc8tRXmdkHtmsY}%2!zBXZi>dyZrh%ont@?qO#u{3fg|>?eoHLYeUc{_9mTcnxSi!KYJ|hz4sC1xZ~o+JD0=^JYMwa51f!sNo!`yqg9S*2DZ$uV`kS(WN1}1yMMv(t3bF9Jq8(pf!wcimWKz%aJ$TRFF;=+Ad@YyG>)>oG@6eI+-M* zGKlF$3dnk2Ae;b`p+d+&xjpV?`0c$5hh^!KxrnJD!>6^Yj4ZA;x(XK!5*#gBboHW; zO$JogShm|!ZMt9*0sVOTr4y50-6z=pbm>6)j*j8+gNJv<%9UH=0#2OFoeOa!_ShMO zU9k+dg~Cx&LXbkTr3sa zIibG+V}e7BDfRbhN0>h`-a`zgs;VLB68V{Db|S#{^bQP6UtE0;Y>HcMo)Z7*H*b!o zo@$TZ|F3^TXo30ZTJrFr-SMt>Ul#9q?_6Nf5?}lJ`grt_&2c?U%HWi3%a|`qA~cj-J5f&i5bQ9-sT%_pmq}7r+1eALQhl3p9ke zJY($>AJ^}_`!E2wZ$o_j>n{`AZf3miy%#W+xG-Yub>AU;#93X8>(;1ni-emLaMG3} zPU2!vWw`EyOs~LAmmInz7uSX$FmO)jickTC_-dIsM`)89f-X+HTb9gK!91xX9*Dq@ zlbCGiv0!wJe^3~;9pKB$KKpwz;E)xPUdkZs*63AB|v3 z*!IQ3za@^=9EgiA7#E8d&SJAJ4P-+I1Go>Pffo_j_U<<@X3V;Pjs0;}3g{rGV`@>t z$vhZu-c7L0mq;h$!&;z%t%(i%FgE?dOt4^lk2^ga!7|2M%$jm6&j%Zr zRf40qH2{G?e-ukQ;%~q7JR85ZxN_;dxbv+upkWQ1jHyq$?1|sjR@}jHNn;Ju;ye*I z?VsP$Tkmx>pGn z088n$42$lL#GwilS~66IU=cTktL1q*#&MF7GG3DNqKqrT+0J&tzC{m>6Lhz zf-hpt5Efq20xwVNKJ)Cx9FzCG|4!;~HRj^aqmQnIXWal#wGlB!mkjxoaKqmGPdj9USRINTQp%PGVL{%N(JBCF2|2T52?-M52nhBn=x( ztWZNnv8?f&fo8C!6V{;NqWOzoX2W$Srw{8J8j_9;8bAm%1yiO52GSB;wn92d%!hB= zprKJ6^O=UBQFx-Sf1B8vIV~fOm{XAW{UbtT3!E48v__IHI2p5|tW714KVl9~y zV%8GS@Ai#*C47G5#mgTmpgaoaGUXHN&a@Wjz5s;_9s!K)+>D~5 z3;4T^4Ms5}-O~-U>59J$5qVE@g8MKh#&&Gl9fxqod#bjMF&Y%tT{kaoVjnnv!3bh= zk{7(yP|hkXBkT3PgfqS)dBt=Q`(H=b9)9=Gm4_hpdR0)qU8*dU%o< z<7~>rp;-0G1+CJ?Ay&q? zeD$?sxH{cqVUe9V*~X6Swg#& z;_1YN|4CR3!_X3gO$vq)c4-J{4iGSe5xk;P1twB>qx66zOc;9a4OJrj=d4T71oa37 z6=S##2y{Pz(;78VeT=UK=$y5I8lHo%g z2Bay??9rN4duei9f{`*p^IRz)ZFtC;$+@7x(Nv;m!0U zT$hBEby#;Kq3AFio=*ZoG7no9pAY#5MWm3S!@n)>_`-ja*Q%g^s4}7R_V^585&2@C^Iu2KN-^ujt^6QgAL;!6i`Q+m|y zz58zR9T-9Yc$%O9@XET=PV;`~-pSN^AWhS}6fm7+p_!aRZS~~(N9dmLw>=lW@is`X zCY)<>?^+iwG~%(d7$whA*54YR!;=T~$54Wp&Z)TSXTRO67yCOJuf2I4N;%^3l}7gf!Ehpda1_hK(4;-XM*&r3Ym+Sz$5WI?8IO3!(FP))z%|G5bs5!-x(NA3=h4 ztr^-YiAgN}gZfQwSw(RLIGV1o>GDk zyj7=At_1LPUY7Xiz7M8v#FKD-r1L4^!(gR;5|`o!59C@lbVNPMsJ;3nTECP*43}F+rEH{hO&9J{mZuwz^j)6 zz(jil1%T8@0f3qV=4%fvCiIoM?D^*k?1$ew&c3e1GRCIboMmHdG=_W$DY)WhZ!E!4 zSNJuZ`Q;w2v2BDXID&ikJ_-G7(HcVet{!gv(}Xjk*P*+$1_3K!m1GN|-F;mGj1|ng zr!X8miULL6nL_KrUV7Asp*Cs8U>iF*83CUZ+serYo+|XATs{j|$j%Q5>BJjQlZ2}t zmV>>&1VAAaA~YsrSiB95mtd$6LV$@U;rOZVRWJT&+{lH#?qx(NB|7od^sV^38Z+Ws zE1mF5Aq$1GRM6|B@h4obB}|3*H2v{1BL0Whkv#RCa5O072;Pik(sf6nPGhhcd5xMT zTvvaJ|E)12UQX0)VP4UA6c0zZ>Kko`i^k?9#GCS=?e%4N)@`y`w+*+sx1az3Jt{mE5w6m^FsOC* zxr>TPwj!yz`a=6&@y%3e_k;((4Oy+jsGI0btpoa&?_}k#u|WWL7Zz)WjAYUC5w1vK zS=6lXT=TZ(QYi{>NeCRqHTCFBny$>bBy?pTDarLvedrJw>$n1qk2$_0ndU#AlSnTd z2?A*p0QlF5v0PO~xZp#$zTb*6)9H(Z0P1NA7fd0peX=DaVnm6|?{W+4Dou1gp8!Fd zW&Ej1s600grG4W2YdzLjlwq32ht^K#V`}}O?tDzWVt7qnK0knHEx@V~`9yU^XFGkk z&US9iveMczTfBOKEx%*3^-9q=S06AwDMzproB*)%7FvO`@L!%7)H=D$Z=vxm)Is%7 zTH&*w9R+z7x{;az7t*pTK&c&m){ZPYx+BN>!uyyxC)q}(i|@#s#MrGUOTZ}clpQ#J z#O5xWXNzx|Vu^ShZzmsuJ|Fa6I6?LTY61L&0V3 zVZt4pvzw90E?PMXfJ^QG-L-OT5X~Z)vS=CALu80uc>ZYS1>Z3pv$D2}1OZ z2Bsfs0JEnrfIM(5GjE&*k`_w;j6aTc{+;sIonk2{fnqTWc;OJjQ4lZmt#4GltZ=V4 zB4Pzt0Y;rH1lK2OpBAESm=_8VdZs#fCsBW2lt}N3rq@9(Cb~nk_q3n<^f#g!&$aS10Y*Tsv+A>1E{#a0&9_nQzLCfXwptpd0yxM9tR4xBGPTe3jlGbVFEQ=Dn?*E9&P7YAaHL&2keDt%R{q1iTt&JE<^!fg#F2% zthNIO8ti}kk8jb^WQcj`kIF-#*0#Yxzg_vTI{NW zHvB$%d_Vw#SaWjoiD3kRT3cU9tf~oEk0Pkd$@Pg?gojC3f?bpU!LPQDnbrw7on_gDAQg%{af?c#3RSQK}b?usLM-SH%AMQ;{ z!qwv^pIC-hkuiKj{Pb4hlc^rU7q19kQ5WSSeCgDwFX2hL*)z}WwV%JRgP2yScHaYw zam}WAy#l;ej3X3iP+v{(4L=(vs3na99m-R4t?MylRV_IvBHc84aBD@@Y{L%WP>u7V7fKq}OC5rRboBnDb_G8y> z{p`%?GJEZ%-PXVN0Q;*iK4#NVUXtdczV}1@KohDiUbg@DZ=SPl+m73#A6;&r{L~7B z3F;fcSA7-E;iGUb@UMO4n0@D)TX0*~!$Sak=#e4sp#UJ5;q?NI_2++az<&JnD|Y9d zbMW?X2ZX%f7L{=2S!L0s%u~4V#1qXAzO&XIf8s&=+#gS{-dHUP-Z~tvLN3y0o-DP0 z|Nb`GlxYt>a<@%DE49VIC(;S-5?YI!lCjA2-fr!#+Holgu$8pF856=6X! za|KpMMa5{omP3Gdwvoe9P?{sg8*ahfD*$y3igR=%9prtb%^F@(n%I<9)il$;#5XM} zLz$}#3#ba_dFD2j*}*7GWsIU+T>dM@t6RmWo9XA;8Z>LqSGy9~x%>iOSNh?RpeKZK zI!w!qjNz_SC5A_s0|H)C31A|cQ2lT<;)TBRG{2@l!Y!2_j?ni$5%Pd$pv+lGsF$OJ zTR^b?z^z!n6Lq*Lcsc<}(HEHvkhhXH^LjT?A3IHmD z;_da<4?|}j!n$P9e_I6rDX!$I zsGKn?M!ez&E0;uscd{Oo$1=Cd2kRom4QfdlvAV>{^=dJPX>M?&P-RqYAqa=&OtnLE zqi@I=s1iz-saz>yviTp9(jS+@2!GsBfX3Pf=ul;1ZSwKYyxhdz;m1Ed&c19vOy^6M zF@C&FL|8o#W?Ls>RE91CCIJNAn7GULsd1`k402vD_~iB0+$osD7y=JV*pxT2Kb1vH zp9DfM!1U2RLsm+%c+%7(1+%X7XEW|Kb5B>>{#{2b|7;$X$3-S3qsJawZnxYv8bOZ~ zZpAPNCC8RB@9$7}drxXkiU7f~0(}MJ4?)t~Zx!43zWb`3K2d>sZf_euW*kaG)1Yya zvG!%{(PzRP;ZqE!LPj6Jzfp6ks#hC;c)N85DJ~G|YuDafESvUQLrb}R^zqy6z7LPI zA;ZM<245l=eE^%*QI*skVt&B_%QGBG~9kR+CQaqX1AXfw&Zzz-gFB&`I!KpauF7eqb10O$JgI zS&b^USZ{c~;ZGr_s;+1VDIZ8sr%*-i=?fZ3G@6Vx6dq4(B5ef%dsxFD*3b@f zz5YYZ8k+IvFPy@gz-a{flW+|#S`S5aEymFy zT;y83!YUL@*S>b#_Ut}@ce*=l?i>^VBnWhD>|_Uzl-SGb6at{x9=K-;?#7eBIlZOk z5iZB_jp`89#cFJ zuY~HuAcE~KgAG}c%lc2=2F{(wm3Sdud`Lb34=n?e2U==c8rGXqwvX+1PzJt$=dJAQ zT=+>PzL!=wkp6@NlM;Z0fRe?CPSIXA%mXS|<1Fw(wdYm`X}s&1(-*vV+L-ETAEmhT zf{_@`y`g8s`_f)ZZBV`IAY`>i*89GF`}lrF{0i-bqy(?D+Mns2llD8!2Pe$LBa532lV5_>-kcBqr~g5q~*FRHwhhuW+? zsK%p=g?K?9%e$tOn4}oa-WS?Xdr|SwoIgYw^@9>ApCANKdWBSzH#rWT>z_u7`bl+c zZN_zcBXZ>tkdYV0aU$U)UD(n6pzJDz$#%QUr4}0Wp zc+HXl5B?7l2ApoL0+P`VLie;<*dg15i?8zT67oI2p z-|B3@-~_xSjI~+ICK4kX!yEV>iU?4W*J!UjyUR}Ol0rp;4MvfD;hKpyedS>5ml_0^ z%GP;G>J|07{;Ashq(A^Sz&!$#6*bxZ?dNR!Cg|AQV#Y+1O`bZ;7B87<85zm&{}l$9 zF~+>0byfLBJR#wV_y+28;f2<5muk{4E>tFgaDdnFnHu3!q9_EPsy}m&c+gU25uS_J zp+mfF)l+kWcn*H3z8WMP8c%+ZUo=PPKJ1klTL97VjRG|;RJDkAp>z@M>#XtYf-wLh zeudB7G29lQG(U*G(D+dv!g00T@juFov)Z9?puB=XDf1Zxt4^U_Dp#-x^sDpUDMw03 z%3E`sWL6rJs*?&)c~Y!)0W{AQPd#{SgvZ?-VSbn1%mLk*+nX`2D6w7JGw}kQPi4B> z(BT<2eZd%;zHp?a4nxrj1+PXFgmiXZqd>^~-^%w*&}`z*_QqR+D`m9O4*dgPI#Dkd zCX=?d`m!BASZ;5=zSDAX(Vv#sV5^s8*iFmF+k|mRDBQ`j3v;STD5$;?zEP0I46xLA z6>8|vNKjiP2oJNPU`<)HSA8!4w6?HDsm^$Nz1*n}YmM2P@8sL-n=o3%+hMOn!e1}J z8^GMjR(G-0Hm}`dCHY5e*@98FXvqY^U|h1}tj{|(V<=MJ&F0=Q!sgtZVO^msv_5oZ ztaeqsR1bb4U@s&4kTo?|0jEK~V3i)~tPlV#qGw41C~2j>RgI}Xd4z0OtC@$psy*PW zcxRF~Do@8|ea^S)0(lGV487Py*-gN>Gs-u9!Fyo-XP9D8v>tD^b z1Qe)NqE;6WqweS$SXv(#5r!V~T5VczF1 z$iR36!G34aX0%ClqD;WUHFcscqJcEG@Q7!sR~Uz?qvku!wb6R5HC=ORQ0fT$UCmia z=X*5Hg1P2D$z8Mq%8k;~Tbs#OEE#4?Gp~Z-ZTIK72%8Odbr3RD`L4!nxT+C2kKa>~k z@IxoRj(x8zJRhBTrnH`(TgI&)Vo>NCaLy-VeWNtd5v6yC>$&pg2=xzX9T4HMzt%fF zi_c5Aq=Bn*TRmcVsgtWJTkYBBF4zyBe1jN!m)Lx2;3AA*plX9T8dui4XN9auK@P)W=Sw02gyc!|>QQNyWAM36O5cc_4 zjGeS4OXk?BRnxJUt0&IyVJy5VeKGCZr^@cQeWd--AFU>zM*HFyp0&e=s?i$8>Yo8L zeqtZ{#3#nts8Iu`Yo@*M{2^PpJj4F-FBZCGg9b$eJHa%%j)A7blVIhs+jcg)W&Qbr zTtW>jfzdnUj_v>#Cy;{T0EW#krE0q=%2?AlN=;!-uC5 zf?~eA|064(WYq@dc<_%&jD|>&Ky_7rs6HZ~GAcp*(F?6xZ-LjE`OW&r<*HDBdhVtG^4LH}Ld<^3TN4 zsWuwod|)CQKLBu&n63K`WLhsQ_inyrp$#6&Mptm4y@HXfzvA&g%@UsIh~}az@FH|Y zNI*K_k@mJqE8&>(6n@qrFzC~#n~za3Bt%FjpiJa*HeW}1DkBxA-z8kVe)FGC*-w7- zx-FP9#D4EHO9+*b$UI(0Tfr0hP6U7kw-XqSKU!RrOJCc&ztO(?gRS4tl;S`_H*J`(f+H!9rhN|iu9jcGUMI){Y<(^-~2q%Oix)w}i4e7-TmAKa;7v&M~ zJha1cj5=vNdiogt>bVv{xgP9|#}ehOL+g|djW?y&Px-4%J?rSuJH6uMeV}WN6WvGO zD2)!4tNJP5=+G-~1J87BV7}|YCQ_Nog{0uqNPlR(+>8eOxBqzqL}(xT(qDhfrp@VC z0iX=Q;a9%&Q?&F?*vFo@2?ckoW@VqZ<0o=ZvO?vS4NGs3BQA9iRv=Dlh;cG6$xl*wkrLSjPt8Nd@mufZ7@J)E!zAMTrJyfJs1` znVAFKR0@*}!6#lc`uFccod-gIC-H5dC)MU~s7Irt?O}Kjy}Iggl=?=`VlqU`gMdMT zeaKXOe2zGOn>OtQ4;t*j2k*3#r>pGr=@WL#>Zu6eVYW#j4;bYa)T8`)5^o~q?hz^t z3l~R!vN~VbYEM1=GBKz7+KQ#qSznXEJCzg0T{VKg-FpjBirHb0J+c}_fe->f^$8nz zT0>p(@}vN881D=<_DGxpfaJu$gPAVC zCA1~bLnztLpN`N@t&uc}yaN8H&f$IN>!|L+En#LDzf^}YSc?$2 zf_b7l7Fh#OOpw4AMla<=UwJ{ltv_m0tZdcEZ@^zMNaVI&3dB!7xfA!xU2WR@**0;` zNCb6Eic08x2VBCPpWoj;b{PB+E+z&l2a0x2~T-UC{#il69aDFt*v=}Ud?`)%ku ztqU%sfj)qwvtF!O6(yJL$iBmtb^NTAo-aXRrIoNAqwxGT)0VFsf`tjaDinwn@9m7$ zK|St5Ue%5&2{o!={_o#+5haS5_`*jcrqF`7|Uk7r76rx z)Gwi@ydvbnp|KquT&fn)6IBTvXcX3E$%x`JLKiX0WH}@+2R(6xDmq^ZT>scwB)*!s=Lwls)5CqfzHz@#UP6VI;s054j=U>UR zGr4v4=tDEH-tF&rqnGOQOk!5Q_WD8iUd^_2*&N&h6GqAv0KgF@oJxcf|MAmZ2*-;s zf`JD%b2y%cw8D@>tOL~p_3VK+zjXokv%78O(&4shRoZJC&U*NpyKf&$x$qI9&7R8Ur@VBul@L7$kFWgeiIgC; z8{R8;+-L;_mG0hOI9*a&3XZo}I>LSl?h^^IArFcQe-(L65IwGaUS(AyJfoj5XQp*lynkM{_=2Svfe}hpbe25Yd~X55xBXv2fUs}%RhesAknLxa#-~&7G|JRk zBbr)cF~Fv6OBMr^#*fCd@4dCh;9C1<^`|G%nV2@)A6S z!)lv&h2B>7fbqC47}r9BsyYg-p!rs5m5=thdaibBe;5?KRTIjmj(QitMRkgl20elP z@QnX{cpbc+^f#F|0kdMf2<|(OZ<{wB!P1d<^n|utH0QE?{LzUvcJv@{RpAd2ULpc( zMJRb0!w^~%0~RMLAj@J+*-o31PC`-qH8WpIP>bLnZ<3es=;^qGm)r8{1l#m>rak-Y z+ct2}1pCM%i%?Xnuyydj_Z+%xHJ1_*+H{9!o@$SOa+xdx= zrRkskSK-O%-+piup~hKwzoYEY$0o!S0KymV_E#|1Z^P@w_VmBw0RY}ba}zXL4Sv|E z(}WolY|(9m@14@$>PnjJt(P-x&pXGhww#g?3XQ=aYcX!E$IeT(9!aq=Oksg;545({ zMvYrvH|fK!2xs&YO-vF(6i{)lj)uZ3d1bkgoL6AD4dADApFwUiTEnI*CC#_cm(l>=No0r3tc+@ zhI2G#g_GjnsXVW5ERX1Yl%MiaTJaAgI}-kC@7sp7v2wz=5A9SP^i2d3xP*5mjGvwD>YItWx?g2aApgDfBFwKlH@M5OoDqKDH~XF5A%~b++;K91J@T zS;@sxyjBjd*~_Nd)CJ=$DOm=8qMF4|68}VV7jRYG_}7ZzXi;vnZCQWJvd?7NY(neI zTRP5?hVTxroXzSS_%T{VgS>+Ioi^s5t+6*Z97;{;@K3;!XI9QqE@^IHuPS3IVB%@{-o@tfa)M{ehOTz}RGF>c zd=jr6Sy)sP3Ugov9!tAf5qzIHb9&jQKfQ>s)I+QX^Zf1|<@S@O6dt6)W~~`&vsR^J zI0O)=8fsN843{8XKd_tqM<+X%T|y{@S}em;QJ(0_j3Xrk&8<|3PX!iDtTKq?F0{$} ziuS2#nm@sBrSq}IQ++CawglUvUG-gy5LbI#z7?!mAfP*|kHohD@mmA{%IOkYPlV6S zP4E&bv7WA{-FQIi(mM!(!@isENU!nkWEJTJW8Y`Xi$l>R+l!aR0~l>JptQDp`67GZ zp$Rs9HpV&ql#cqUNgO^_D4ze}&;|JkHB}G&RJ{nlqi0GiJeANm2>!{JjO&=X_wA{) zpZ-MNAdgu3sL{6S{`od)1|gkQCaxzWBNLBL<@mP_z_1ow2I-~jdl?>u!Y{}pfEals z<(pWA)LJU2kOqQ7Cve}{g!+zm4i>$y?P6ySRNFgm>}1|6!b8hE4~u^GY^^>0Z+mU+ z^I10IrqQ+Z_t-jkf)@ zEEHD`*!&ffY{hLeEn$G#%#VL%dCj)twH({~_8F_hv!@h@)6%-wEw@au2OgYi!$-2m zKnX3H5BQ}0h+PW|I&`{vuG2%k4~ok`gKs1o(OG%wovxJ?O=>&zT=b0QD&?v9L^PPd z@33u487`DwKd*!ykxn?JKJxiJcCWq&c+yIU(XIB!fAra)06;>ez2;Em-s|{PzKgz5 z{-I#H%jDnEFV>;m%#h?ckwP z#KudrMRO;(>;G0<;i!)^p*yT2u!R=9zkj{%>M1QR0RpYKMk_;pwr77X$`6?^Lx9a&5^tj|LMV5hrzedNIf zcqti=@CmIx2q$-C$L39hkn(VXkh2qD2oo!-d)ad=(og?*2Q9c{AAfv4V`ml{Sg@1o z2MDS_AxJ1VzP?e7qPDc(hxY2;+Z??h$Bw>_UWYcf!%#I)`Y4Y8oAx{+xJKXW91pkn z=h5}Ml@Yzy+0zK_@egCy@nvcZLZD06uPympsYnzar z%!N+XY&!q$Z(qQ*_z`>fu_gAYPu~Q=EqF(5*SWnS>N}OYHWmV)zNVXf`m?v%LmwG_ zeFXsF4BwTYaPZu-hae!=+TD1s`IG#6V z(U#tf)k#lnxFS3c`73?)nKJv2A8p6uO_u%5-~NG3oW{mDK5Oa{kJF(~)XtDs1poND zIDD^u5F2lL9FK!hABB8XR{Mw1yYP*26{71L;Ot|Ay9iJ9N<^?S@#-mQtZ(#9>{A}b zzEN39qa!Lex(`od@0F+0@F(^j@-UV{&(zOs004dtZd-Tl&a$)FMZjBbqS<0~Yjj58 z*wMpm#4s!s`pQKq8qkdU!s1$=+b$Bvw4|tzd7vIfHAK61 zm_d--V*axgqB>GSf(}7=S%$^a*}Qxd0!qLGDav(*0XdMlG6jzaNiaV9`g#-kOf7)< zgJ*!VgkC8?uvJ=m5rxZ2UyoARRHu&|VngvNFmNDshzGb8jaKUlZ-UyGR0I+HE zAsFE`C}!RTth8BzYydSjZ$3f2j@Z(r^Zt7(004+fFuoKQyAaPxa&MS2D3SfEJS;Th zikA>btm7kb+bcJ`T^XlsgUfq?TRqcy=7W#Z)rWr*^_o(Ju^7_pJKm|Yd@|5|R7Pwr zPHX1jtT(7i(HuS--6d2frXI&~a!CIHQYaa$o=4 z&raL(SeLeROR!1v##_pWfiN+dS;PQimSU#n9Kl^VykCdPi5*^9(cQ6p*BRY_Xi)?Kj67=-Rm6N^H6&!x2&OmV{@DO*ZVmJKLOEa8vr7hI2MP2$Tca+PwBPY)Lfw??iSRa20BDa zF6D%-NIjR3+y|VFP}@uxON2qLGX{&eqIsuC~mmf z>-10T@5-s^@MebKWu`X*YYBARS`HkouEwhv-<4r?UvORm_$rk7nk)gjdFbF&8xB34 z)UPM^SpRkt{fPUB=lo(X%&2-Qj{;MtSj?>(tttKAqAz; z0i2n)SR|xSTv2|}&gPz{+>5N`Qu6Q0xR)!~&Nh}1Q?sV0Ll>eD#Cqb&{VFpClsFXi z{uX$y=#yBw2yB6tiNRO!j9^MSeb)xl*av>^@C_LWr*!yTc;w}3?1pmV<{KX9U-XT> zimzMSbMjGEq3n=*lvk`I-f4bduJrYnw3_;uJT-S|t&N}mJ%?D`bluURvh`D*p{!7T zbggf+?h0GuvkLFSlWXhWQAzFjU;Q@vKE6y!jnykELp2Dn_4L$9I418Yd1tX?f3d_~ ze`&7`9++=Wd~}vgotVsyu8c24iwNG)w^$Qm9HTkWl>q@@=t`&>goXmB{^^;+6o9G* zDpQIq1tkgg{7VN>h~8@p7Ok+m?pOrgX4@NE4q@>;%)0g(?qLIa_i3?@eS-Pnra{m@ zqF+77SkrZ_pAH7BAF=jPS}oxYo_jXmo__L}EnVIhp85pKz#vWrTn>!@lGu0crwEQ) zHkaFvo;rb|S}%BFec2!6+5SDJ@M_R(gGQy=r>#!|+j0HFZo%onnz6|dR(H^Mm$b><7VU=`lc3_*xTq(`{ZNGxg;jJ|L}1Z_2=HyN;sNi~P9;ZB-C5LyE**ezEbJnQ_RW&7I0SrvBvpZZ$$V@;PwfF8^TS%({J zju(aXL~xpo{y_E8AdKk||JHf_cbd*_`p6t^}Y`|M?_ zJ~Y=REg|eOcCTHW|1H5cee1}=`odXt7HoB>t`gw+5Bl`tC@CZmjl002M$Nklp&jTt$jg0aKPrPXUgerJF^vCBWUPkA(7qN?|k78B#r}1eWhjLr5 zeWUv*y{Cy1UXj1*ch!s7`*0GjhWA^yZbfP5Q;`Bdtmm#s{NLjy0(2lYB0$r203~hK zQ<<0S>8Fq4QuP>CgQ@P~qN1vVL7a;4b+Dbm0=S^yoDIclZV@rD<=P@UyBcC-lgEpj zHA|NH>BNc6VWV`4FaqhgQ(ow9bie=o%^+)oefBeVVUc&nHodV2w_Zth)6EMkX<#ze z87J)k0@z6qW>0)#p51oaASR^C9tPkmf3pr|PMM7vJ<#UO9b$LfF`5M_8OCys{l`!C zz`*Zepa1;LxWXsCH+>!vQ)=&ZaYRk`9}KF7PPThzBSM_#*$7wIM?ba{YqrT)3xcSu ziq}WBj`2rGtN|()^y?UWU;Ek{wrIgz`{XAl+4yl`Q`lC&>)~=Ndtt6DTDEP=BLu)3 z2-P~-m%sEew8o|F+&*}emD(<$TXxI?!1FI0wkICHiO>oYn1HoN+(3aHH|v*sND}@Cd4K)@#X?Xi;qCWRpsjyJJIyR+e&KBZ5;y8k!VYU#D6k;w1H!_r`BbHX0 zU(&=sdHTE^J$BYcXW#|k=E<&++%`)&WfVTU`mgFN{7`?((y1IT4I4JRZS}P^xECcp z5^%7D~Hf@joQx{SG zn(S#Euvhz}fbsW#|F%8*lM`5;_plW!r`WQkqb(H+C_GzYO@NEQemLD}u5p4ZgqEQ1 zF3UQt7uHi%_OCzK0DnM$ziS&eXWG=ML+ua#UV+xQW%(;T`~bNHD4) zuQX)WHg}Scdb{q-%j?!|rf*I)TlJOJSC9!~{6H^n|s z{@PUKoV{p2`^io_xIfeW?*IIurH`Rb@1m_l|s*)VcjRzB?1Jws7u9~U#|KGBalzSRd^pf19WAh))_{J zEEvR4LMxJu73&CdO#>Qj7b~i;F0Mfdvc#>7@n8zRb%TkKgqz2~{8B6>4GSok&B6gO z`DHO(Q9(R&G;tMMRSE$Lv7nGmsVEQ(W{w?+Cz=5;j(ei?;&V<1z>kM+L@?hNP~Sb3 z!Xim}h?c+)%{?|J+e@Myn zJh5)i!?5dtH;h3jl8DCB+Fgv2iYovNNybtYB}mPoZTJ*}i6&_g&l*_odRz%VrPR#r z->?}Chx(OtQ8sj>yFcWCaHjta>v2LyP?+d<}dTzL|Ib>ZCUHf3T4^Sa`;2ahzcT&S<=E_gZg!Yy|n>_hz=>jMX#Mj@?X z3})w5*`}?h?BFq!k4JR1KmOAX+rmXsb|8gFps4FU*bTgmeqvLdz+fTQ>xe&iDjoVJ*a5^$*?!=E_U+Rugn&1FlEq zZo7%Lu>8>mJSU+Lqp_f^mF8gK;a~_M`jY!&@rMF{+8^K;^8P?80H}(9r=(0C08ZMO>{@&DVHof3 z0U+=jl;q?|LI9uufE?VGFPjUWCdoYj(8Jz^t^n}d0o%X-FmC#%VU0Ku8icsc-pLdp zBqC)Uo+&nL%Ezt$A-e+?-^-VbV9yyT0I0v(`$~OZQrciY#;)oUHrE$$P>%5fGvRXS=P-6M# z3K3wS=+CAp5l>Wu2jilDP!fDT=w1Z)QpQrq3C*qYqE%W_M_4VCR||>=sa3&vXvA=% zi(B|7Cnv(o!%G0J_j@9ckYc@0#H>ZCBa|8q!vA4&XO!_8QNpc6(E=p`LX1^oeXR9e z0waYIOCL1?8aSCTE8#w_ZA)uVe#nN0SV$W#;e{Z9F`ei5tphxQB-bpR!;4?wWs@ST&YezJ9(YF?XwA*@j zJ!4ONWFDR(l9*>NkWMrJu<>SSU)LSH>%n>=g+%6Iu_u)+bW7`HCPwBzpAmTGW1bIv zJ>b5zwKv}3`rFT*JA^^aF1znTx7qY*v+bR&dvMKs+{RCvPB_U7yr1T?R@d9de|Ms- zT9bw_Mulsv#3mE2)Q)hp!!}y4DzT*h_aB^u@1A4#+&dHt)3G*mSnx99soOt^<?|vP@!v@AF!lWxErKQqLbA{=;yIF=wW27MbE?92Z#|5n zXRbBkih9bpbX#-l3|qW{P$L<{&Ay8F9-1XM>8gW9^7P6hg5i}8_6O@wjj3}R@Cm(bb;l`Lqop!NeIrn<5bL1>|EdFd4NQ7L=-!M6M^+`=yzXuS!a zbD4Qxo)%RN;Wi>{o~b6h!=-m49w-ZQ8f?$jBX;^wjwOK)3uh0pr3;4Jn4Ki4`h^76mz31(11E|r?75DW+WNPSVZd30(pie#vHRkL_HSWhW11;r+9ht-gJ>O<6R;ntMuwuYDfy z*Sb)yymZu*x7wlI=WHvAIZg0%mfkzX=ArPT&~1FAg2_h(h4S@CKheQjb*1dkU7>zC zmz=91%p(gkZ2p=_)+Y%$5%htSBE0QRNb`}ynNq2M;K{Uwl$^zp_m?9a)`k)o`kV`Z z)gRs$z|57M91fz#!}kGimAcrDtleybN$OXEEp0fY2Jc%-}V4m{NpfVg$*Hv814{(l7k2T1s%NdQ2B z{gL|xx%=O+p~$}R_01%~vIJpYeM7m8fx$Fy{&>brS9^2wG26ZSC>v8I-{f94cm7B= zOEX{!SJ>KhTOgb+*{s>K*iZ~2{t|9LE|n1HXpW5-G1%5`IAuF`Y_$)6=q6jbWC*dK zYwQi;0V$@%?Ag=MYU*uozjcsFw!rSWZyK)Z=c9ex3C-kILK2*}*I(O$GQl*v^_Fy8 zr}QK)joEWQKV?6EZa-Sng9!n!0;K>nH^Bf+EIQQ2=sG;P_OH-J2qU+NXHU1-*T4QU zo5TVp`GwSV7TVa+WECOWwRybT6P2%dLax#_Y&>WG^wl?9nc}mbnL~(#lptV^KE8qM zmDj}zg%dc9plUs?gNNEz{`wv^J}eQM@5#eA0p!{0eQPLa5CY&yc>p*<=mb0f{PB1a zicu0zY(|xMAI^dSKQa0b96XCaJ`3hZU;1nkf_VhZJ{hYQGKF%Bobt|FB@RW%GVt2%eN0Y8NKNs1*3 z?|hXlTe8H)jKWHjx2kUg!t~R)+dFn54`xuUjl~t;65=AI62nFy@$nUbBNX&Lv??l~ zqpU-V1bZm}2zO4NXht#S89RLN0?#C1Q2eQ87+RfC0zgx9LAu?3`!pLnCK0@9XB--wgZor%-qp9IQP8K7=x_#DR|L_TT$iScn7u!JqZx zjg2Q<0iY}6`U@y8O`ivG=|q1Fc{qtat%m^p`qy4#t~+S=-apTN_tUG~1Ay>NeW3n! z+>3!&_hNFbMFHSD-+UVdfG+l_&%Cz+faXhm+uYcR^(T|{?^PR(qS2SW{HVKSm(WOr z;nj!cVwIPD_JV!=tD9{j8>YYc%Kx-`9!v=F{NgGXF(OXGWc=~d+w5G;lreBm9v?>M)2ecC~G>NCMrF++>7 z>^}xfsv z(;haF(O&Oyt5(Spg)BLjWIEx~VTSu3>1CL09|X3iMxZPNN2jl0UKCfm0C z93FG_*(aX34Vs`2--_l^n(z|_3_&QI6VCD-OxTU4*;auu;CEvEg=AwE`pXE z8596~tz}!qdu^V=5w$LM`(Nh7y2sjAgz!HfC4g=Szf(K}04~)l>sH6z)<2b9j$sb;6As}nGT}_@Tkd(DfeE6`wkrVmBr1GRJ(W(O22f7KYE?=O5~8Udq9-q7vFfxI z%%vV^sr1JsaZ>-_hFDq4MRzaegEkVly-C+^`uqAef};vih4`_-_cr-GN~)Duem!#- z&qRBzq_T@mnuROth2w}t8Q|s&4d_h4|2K9BZ>~6^u|~}upY$@c&0EDYF-hc_v=O{e zziEFUKCAEE&t}F0L#Q51*+1)G@leqCFqP zn*d{<*BB3Bj_ZtP8nfN|&)KWEPpx6Ubk76h?Bh=?L}rI+t{gt>xbu{P5P zcVC}hTxDf7t?ospA4)iNbv4k^H8!9>bQ620UR}kV(#VJ|>94 z!~2ZNP**7cyzpu!0`+Qp7}u*ar{m#3OyAg%l~s!H>kuBDnlKiaWlI*zl0AYcUZ23d zpFOvake4TH{@j_+8VJHtP|k1$tp=830}5z(Bzn8pUVi0(-Mng)hXIgB2;p7(p*c_t z-%fa?s<$7b6r7uzZ4W(oPf!4W=cIK|IC2D+*{`fSg}}SP?!9vY?^8p))d#T*BP?)~ zhzik5UWln&Mfj?7#NE!%zhGtM)xIA0#PqCBLLUV92>;Xi5o%G^{#g1-;e@qVVZy4R zN6Ra#t+1dBkB#M4Re_Rf*Y1`wFcC$8KF-(Zk8wsqZv=*HyL0U&g zsiSux#k>FQ=-YQsef>8o^Q!!KB-*{+l{T6Q&5%#uU$A5p9;eS5YQskM^|jT%V%%Q! zbqB>=ouZ?5UY(|cY<^>pM3d^EPPzaV74UJkZYs8)J+;-kG@rA_A6brJ4*QobMc^z} zQZXnh;#}xoZrYGPX zNW#n%Xs^q-&@Qqc;cfTrP3OEl_+_F@e(=z`CNNF+17X9K$|jaj1A4`XFZtbdqPWf!J@hq zVzL?KT$#2@=<62X$_m0=mg(%+5WF&vmm$1gf6lfO^Sr9M5~beWHfQw+TS$oKK|}lT zLExyUe^r$hP+8D5uk~-P(HLweqp1nf8&&GAv9qn-lNBj8DY2H1n+u&8b%c;7`S&w3T-=719b@a z>2w2Q8oaM=>~49*m+(GVU~AWAL3H?jsxu6B1MHdoj4w4Fi<|KJ7aXOcDqJL%ZDAGf+6=mc5YcAZKyapB5 zIFYlKdORbD6wbOPPx??W^S)g@m)=X>8ig_PSS3R65_ZS{U ze(}>>J9xCr#w{3ZGjGCk0ft!e^dKrv^N`@7L-UA2yQpsh>}VVClGVR(S{@bzdm0l8 z5xn?RG@N)5YPUM03m?n*9#cQw6fhJ*x#<#yq{nv^*be%+3r3Xp-ai(lkqLJ8RIUB^ zM+Ypc?5wSMXr;}ZKY~zOa(R!Eh>U}%lkaE18G{$Cd>LFQ7<)x1AA?0z-Ftwj^h~TAQ7RC|wBjYHD7(t`6aMbl?p*7O4CIzO#@Wi7 z(;3e#ZWJ{*P4b?OjsP#cQ7xjse)$3a<4P{xQ=L!%*op_?HU)qf7JR@P@aw5w)PbS< zLZ0E75J*;R5@J*%Y&mtR88@z__OqYuaN<$S@iY))&8<^x#>^2A@hu28&m+V?iO>TV zToCjFlL-f~Xp&8tItDAeQ&{kyqKNL6&g9XAdzif3(+K~Q5wq zbeaA6pG{&SV^Pq=9ic~CC1MxvUWKbuzURIA0Nw_cnsV2C60N{$v~Ne*7ueoIbarJPuf@ax)qd5rfiyKd%y3iF9yH~@u6!#A)R4g({i~nCLYY3QKBi$L>r7FctRDhgN{! z2z}dT#_Izs%1Vk3n>HUr@N|JN0;6plF|N94g$3B&HnP##b8G8!)#!aVd=(1|Z731! zh$}O=mnFV8Rtrat=c6&1gG;a>xEaJ!bAUD!EFfqG77;&j_ui9s_G~t>(?(!vIg8kQ zD4nP+QDb!W241fn@i2VP#IcO@jehY3ME6S4o~JBy>)BNN{Mifk_kZ^kLXafpm9Z?W z70e?gxGk)<3%I!KO^oOjD<>h?zZ(Xz+~^PkP5sk35nSqG|N8xn_Uh}0Y}A;s_LGYvb9kzG6S zUh<7Mte(&lfB8i`07MD^jz|7`V;yy#HJ~1C zYFzunj30nCe=?il6fB(*u^v{eYQ^n>y~;0a4zzwWv+KiQEGzuXb)j@Su-1lE>>E7-g51o0||5{4%oWq<~}wTJIVv?3IJ+=`d1mrdyv8c$^Gj?58aJ50UI{u!|ONLwC>)09AV&mn>`B`e|;Ei z5ED+hk)RzeO8sB(U>=m~?;=_EA;9TOytuTKBxgL-U`0_-P-w}CJ#8c&01}8>*jZKq z4mrUh1`{pjPA|j_vUdel_(pm7mCwVP!vyOv9^_R?icOU$#uS!RBb>xlFG#D{*|k`@ zCiLwKE+CkL=`RLS*s!VJ+7IO}{C8o9CR`Q9&&%O?4T6OWDBDz_M5FPiw0-a*kk}9R zkIh&MCIq2CZ&}h}?GInbGf*9=onMCr_|0$m4{&dTKW$Zi_=E=*^Gfu*){v7YD(#t{ z9VK3MmUZo&YzuFmZE5Lj_-POe=SN|{cYUn44XW0q@|BYLYWWYFnBLK)6yK(rLEdt_y1e|fD38^h~XgS zM$D<4bCtGX^AS6S$AlU4M%hQ7m}=8t2KB=FUvuS^2QBw;d*#y)>Ye(j7TW$y&IRIy z*SX?|1eFPd4(WsYaaqgvmXMz@F4k8$`>+DyiT5B)+MogO9bjI=OcTs}?a}(nf>L1}`i)^jZL!AZrf)*y4wb1ZKC`r>NbnR8l)nTv=!d_iv1TN_<@FbxGl(FuWe zq)finPfR=yi-FaWJO^m)XK;g?FaoJ-cbMzlIZGjm)YL*>g>T!jmMgDg^d`b)PkKXt z91i|@G>6kxrjPTbbyi&71g(wIRAO)HCJ5kgCqvOQkbPLAxJ-Qs?r|%@N}Cs1DDzKV`za9TBy!8Z#ix!Gs~e>CfJIl zLs9-z?SwBO1i;TQHj($rh4W|G;zgqnf-|mYyBjX3JdTD-t$2`PCXA`Cl4*;|A01&4DaPSCuQSUk|F+X(gWE7c_SyrQb zC{TDHoaPcVa(JP(QfP@2$Ir4()YyphA$Zap3SCav7>&gkSYjtCq(krtSHG6O zj#IyuoI1{=t*!#-FLT83kTta+uhF({Ib-{F72;yOgn6mPh7Rv%wS6AigkFI`ybzWDezxw^J`98in8XmRqxA*TVv7bJ<#m?eM=+4#4?atfM zZD3*vQv_DTjNt%_&Is|Fh#{S08}T+)NO+DxX(PetIvasf*X_4WV{fCq7c_+G%(!dS z?{W_mQ9IlI11SEi&BtmO-0gXZIN?)R9J=9^C*MYoPej;1iM=3R3SY|haViCXRkxr3 zz#h;+bOoHW-h^7IDB-c%CCkqe6yE>k+xzX6my6(sPk>iF*3t-lp*23tGyXx_AODW8 zJvZ=o{cA-i035Sa_zw@GKrjmfI?d;$2s(GXecm?U`uzxe)#j$2&|hnE?B6rFFN94~|PSJzd~ugLS4sm#@BJ)_X{t6xR;BnenVv8oGIlHgc-#Ireg zcqzPWJGSN8ZWL(yVz@AK$ym#Pw(bR;?Xl*yZxkFDqR4C=PMe8!G$DS@_VaN~=Gw~ayx0Kq*9TiS(+#&<}nIw;eTD|0&k*2C@n>;oNPXOdKBhAL7_jbh*yIe(HVGmSYOIY862KYjCERiUI z(w;3SZaa$$_8J>C0dE4# zC(|$ly^MEY#hh=^m~mio&pyTZIvQ7+#6rt}5%4CFgx8k|t=3tZ7VxHg{@;YaD0NT{>TDoFz_EGFokK9(y#isMSZS`5jlp& zfOx~g2enZ@tu>Nsd8iBORGd?7dpBlTCQ9$gL;BeK6;o~8)D-KM5bCNvFD9J!-pyHd zWbaYNpK1_y#2a9bJmYKD+opBpRx;0aX?=cW1f=YX5+fj)BMhN#LcZnxP z^&NK-17mt0d-ACbl#^#)`qD?RA|7aa_MEpTpWKb2KpnALC)*GP%)b36vGOXm`|qD> zpZ%;n1DJjD8wmPeS`UMFq?seR7*>R9zJIR=kpjTRjRhzG zY{HUwkp2Ge%|Xi?4*>Gvo@*$Cp4j|&`_c#Uo;kRt+gLlLj?ud zgqfI+mE%BXta;@~t$JO1gr~|+jGdDw&(YQsjGuuJC+TR*qeOruXeg&W4==v0&#%q( z*YZSg^;%Q9DoA;e0)UsVcchWadIOGb)q%IE+<~4vrgXUI(9D`zV52M;Tu4-L*OWww`Dn z5DMF)Lq|M+{B zIuy!_|Ip;XhD058?^PWZ%_CPmzT#GOzW(vv1%-{aa*0nH<*R49j=%3HoxYEb`1g7i z|811!#?I|u(o$}8FH57+(po~eoVO!KG6_+VY}2NVB6JM%K4Vwb^);BP%S!(O=_=TS z$py7soywb$T=gdsJ6K_JTAFcBU8{6h^jC4AAZfR}(D_?eE@L9Ce3! zcWVdD<(eaamo%oEu}qYE^7@7r1Q8W%uFIXlUXS~KxjRjOfhxs=LFAQ^5}2`Cl3Q5! z>JgS!R8*q~KzvlzHqj8ZcwZ4yv=4RAH*(b~%jW*nxtD9SGX)F8{H})djX{-E4og83 z1stpZj~y>0oYP6-myNaw2-0@%Duy|>$L_p+9*ox%gtuYaaFMlR_ukWlLCCk8R?H@R z!2s|-z~XF9ldWI>Hhqzf)y;4OC&8173RB;e#}oi|?>S(G6acora|ovVLOd0u0~0;f78fk$G8%^=HLv~)9&-PEfv^&} zxYw1{-(VB~diKPE6a33BIB$tq>1BZ9?wVSR9EY3$Ay~y9H-bIFavkbp4sN0+y48aw zXbM^C7GJ1={<{Pp6ia-$bw`+>czHb$)XOqLV<)Vk%BlV5`I3*%qsmep>8}G`Y0|96 zGQ6Dd8`bPfTtLU9EVtDIP1t(5h;-FqAJ}$OZ zHxtqZB}U&9MOk`QvHYS*HY(-=d{&L?V6tZAmN1{xAYeg2P2WnPOoIO&tf^wAshRai zvhxrW77|;$4+=&p15kn>?1Shm?KuMoI5Yk=t!R#EehGAA0xOIs`p_KA&n9GL+Ej2?3C4 zr?c66_UL+Mm=39H|d0suU$DJTFeTRfO`L|sG=1FISY+CP1EFWxS*@NyI> z03iNSCwMtZ2i;WLV$Z*L1_5HG-H*V2<+7nDY$^nR>ZBu_g?lX;wLRMOKc~0>Ta_8-e)(P z-A!IL+3fDyec6(--XwN@F>H6IiOvKwo?QdkKjTUXtTmwyNADIS&7GXnid9I1Kab)Phn z)G4g3;Y0{f~)G1_KZg2UJc}6m>%X zgAuV7uxmv{6W*e2&Oo7hCM3kVNKv9&ENgglbQJS$2!PZQjQ_=MpPw;tG{DqUt{VnG zL1su-WshhcSL<}XRI4}ExnEm}U(qHy9C?+SF^J2yfD@%K62@gc#5zte@f?wx-3D(IJ{EA?4_ z(hJFexaH+M+xW~biwQ}z`|i#FOw-Rg0&V0Fr7NK!87VBEC?R_f6x*>=^)@7Ygry}$ z*tCg>ws2k&dOeIb0AAdhD#ZZIu$OS*#id=g`ITJTvc1-->ys$0oiR@u4WdtuLms*L zws|&ZUZNd7RASFReF`I8lzr^a$Z3AVXeSe^_Jb^9u;x1J^L+KPw_Y_iblVTVpF{N9 zBD?dh2><}5vfl*&5VUX7o&Mp|LDW!>zxi6N{p`m%mY8gIH{gMJ001P5%Q)6p+hc_V zbvY-zqFJEXEdMD4ex?l*Np|;3(b#;RmoAV3&6Q zfF3&A<)UYN3c$@`=Ar@MThI4U(lv#+=$PA{KW?Y?HPID4fNA3GDng&nSxH1g!k=r+ zaKI7KKy}j}N;Q=$5W!H^8bt?H__vkkN?{-hKP7GCM%T!$yEbHV|vwt>MUrL>~Z5G%POEMiIp@eIj5cqp2tV@*BzF-uMA#QYg6Zs2FQU!FZ+-)gyY}0Ez5e)d8{Fo z?3GuIM`u+>x|SnE)Fispt$?zx9m50Z4Hl-M0#1mAD%W)$FH}bQW$Dnw>%8;>`Vrdl z8@&cyjb~Tb?oB7Gp1t3^RYb(Np0o!goQKzWHY<&#wj)n z88R-OXHdQfAR2h%U(aw9@rc6fh2P!Dz>BV>jNj<+uk*`)r<*Rk#@+1~!8_y{Jltn} z=QfQ^0bt3#jg6bWhK~F8@3b%cpFbl#>^S<|akIgD{{TPuEx(XR7dFPfR=;@HOPMT> z|9rx#Y}nw5$%Z90axN_+l=w+Z7v+dlH( z3^oFh_UyCAT)4F8=r}@i&$lkz#kX!ffG2XF{oB9YNqDkwd*+!MLf$`VbLXVmXaC|V z2JmPU!d>>%lezZ%vsoy9)9nj?e+4-004jS7YhM1q(GmbJH(CL@vG~r zzN@M2w+$G%e(;0!c)QK8uYUD5HtH~S?$@HGB};wnDJw{8aJtog{8U=Kl_2 zvp2#{BKW_yWjiS6Gz9N?gg`{u!zDxwwEg5QmnY$Z`O^sHoWbJcml~+H_lUrkck|7o z)?j@vDB4@B2iS#llE!4;o;v&d=bpD#6mft3zpt@%w@k*+7DoRNs=H?>$~?m65E8GH zs1e#Aq^HN(qQ&EwJ9z50gxJp?&xPOY#y~N|9(wo+fJn35Vj0421}+ewq~@3oHTse@ z+&$rg@`6m|j_un{*mu798hDFgqyTux<}5_GM!=O()E$sh!cToQ0Dvz)X}bXcJoK^E z_VG{p5dg%C{V{Qt{+iCZZ{th3_MJzz6S6PdKKY#fj=PX%DQ@y!-)gjTU#|? z&;2r+C^Z{wJF{hP6R_T>T}WKudGC^BgWMt+cA@DtJRLp-AIgpC%-X1T2<< zQ7P8-MLSY-JzmCAkjg`;gZ$#!=p-WR#G*(|h>r$1fH5CK1j`M4#Pixyjl2jeq*Ce{ zf?^b9s6tuS)H(xyb4x4yhV&z$5tfvKVkvo~3x}S>1~4kh3uWAe+|bf!=L63UgSzkPsVLt0n zF>Cip*23vFgNQu`4%7eu*k?E1003Yz5dZ=JfU4?FXr71SxyEk1ezA>8VSU%;f|d4U zemfBWwz?dx3yFv`0)?#)sL>TtKD@O9uLB1FSo;nDfCkpqY=EClcJF;_ZFDMI9LWci zv6UQsyLKKS%Fj~LKa7VCI;*X_CtIAA-E{tgcc{;_5pQT^Z3Ar51^_pe=r{6!??6dc zQc`NM$gva0rf?2VSdc^khzG~`f%QLhw?m{lqobbXXUTAi)MI#z_IIIJBE`$8W2dc&{GuUv zDo+CJbtUQQX3ZRhqF#CLDM|<9%t>$lBfUYzd7l#c!9RjO`{(?2_}?$(yZ3zeDn-y> z|51mas(HMP6EIVO+IEsIZC}j!`$Io>3tj=yMdp6 z+c(XDpfcP?wEOjh+%2wZMSu+Z;J8Sd*+2)D=g`>`|q7Y3c``-vIIudxIm6aG5yBYY|;jHvB#Z_kv|E! zj&b3vR3R?<#FI}Su;SukTeftzEnb*`@tHB=`c3WBxG?0kUVG}5YQd1#N2H%9jQt}l8KA1>NepXY3;;ZhM}d)BTDlyNrnbI`km5Cr@j8_F zgoGs|zl`v4cIa1pN}BZgt{>1RAO;Yd_T-CLOt9ge?8@LNi9B2fVnskav$OLbM> z2n<$4beDbTdfExaK5fcm3sE)`UAK$|_#KB#DxQo%1_JhAXl&~UvpNiHRrO4ip~C=>McK&M z5M;_O=0U5IpS8#Ggi}Ca{SmB7o#ad}B9i6+JSM`b8!BuB5mP45NVTOHu@^5*ce$^( zZaHq7UOdBoG08siiJ7+S$^_OLj|Zu)PBhVnLAv<;qn`F!ByjfQKh3wNpUAhHZyig7 z#K}08k)rM$006E?UL-@lyrGOx|Hl{`p)LY|0|3a{CXMv zlQ7h-ynzTL7@Ui2?!w4>E%4yQ>yq-@Sz839dhgC zZ#Pzgi~04R^&tJ}P>bG=hkE)#8hE2fvIf6FKV8+)(Q7YntU`~KZFlV5Q2+oy07*na zRK*q5g#Djp%T_U_CPboRSI?;&jFd7+!f&Nu=w+^G`xb)CqyAKX%LqJ#^BT{+eW9ca zthG1Msh!?W*o&dvmJCRF<+^D$0|3%6oU*k3xw09zJ~dUQ%VV$FOR$5yLy+S_0G6Pl zwWez3aaO$@*m26rPM5HzwOeK;DFLpVW=j?(qmSvqqq>24B%PnY3$keeAYKDaT802R(0Bm!xeUL*J0}f05JQ?Nw(nHX*P0{bStz# zVkvc3x?{~xKGN0nnHr1|Oe59-u(gJ_hFD2%y&WX|>B$47&aj+5H{Mp?F~_FN9!08$ zZtBbPxlj5tuP}9z%2COl@mjL9pL)PW^J7lSxD8qaN}_kK>B3XJ(vI!V2Mj^Ku_s@- za;n{R*Fu{zgJ@c$`{ps8?n=eF-qE`bcf$L4!K=p=E6RwBy`jWjT%To~)OqzySJ=!2 zsYKIPC<2V^023s$2*9hh=+GQc$-e07Kq7z}RS#$IM^*_%FCB)WN%v@P;e!KO*mE7- zQEodopRjl$ORT$R1@eBZ?b%j9M2KTHcV?QcTRRguD%@Uv8J_?00ZSS^)vmc`p(Rcw z>JjM+-8jcc9ggK6@>##e3cwFVPjp6qCIi19XVC<$5ztaP&c1fQFlX9Gi;-t1kDjsN zBZ$O);|!a+FqNy}%W7U%s1@cm+0Iwrw$`d9QaewxwYNYd-}+W?h=1!V~U+M>pvL zP7`i97o{)xb(zewW=$aE(Ri3oKe>d8?C4R#=weWnVtT~LA$U|Tu(9Jt0GdE$zuRMv zy@^Lhwf*_034_0SoSnu){g=-kc996u(=%)$VYihhzNY4oeg1E5v^Cd^v$yy35z_ln za(0g-D!?kd$wuQD*X>dOJoD5+o;}jO_{FR7*cKyZpacW}F{QK0-?MbO*e3zrR0|^Ii{~r9kPf}+ zIv<1}nrUk*dKHsvc-O9dfJx%*mRpuGCp;tgS?1(dS|zDGk3k7pb|kk3W5!Oxg^jQ) zm(8^#HV#9Gg(G3ZKb*khz62`a|8Pm(sjI3Oe4ImM|98Lzu9(Xv9pjh;GZoG_b4M^)f}i($fA$-2;RC#1SkURfK9Iys z_1*Tp#}3(}-`!mCH=#OA>K@9Ohk!n9- zv>top4MO}IM)n8Eg`|*164oW)c-Ls1s;>e7@Rg_F{m02;yP6aLt1SW{QIpr>?}3X0 z^mlU@;b_wa0095}7NIPM*r)#NT6^GOz$%0-Q+~gT9U41&-kH;VY=E-tsi$AGtFM`5 z|L~9ZzylC*UA6o%=s#2Zg+ET$)pgj5fY=`W*30&lFMr-{xD~?#{7u4S@FBtNa8|MX zfc3AjuGPNw?|*J%#v^Pxxm0{xb<{lpIt1VRzWwae<=nPjzUqo@UL69WJc@hCHn|Gwc3zcHKlu049Jukn*ULbnYjA>&5W8kTb zVZ^JK*KZAMV7KoC06+?Wk3a0C0B}lOzn)%2QAPm(*q)6rPYB<80|0=)H3tqBvhE(j z3t&EcoD={607PxIOl>(U1A5QAeB<*nJxP5AtsC(^EXJFz6>mVLtI!zkV6YXR0RX@T z*aHA)Y%&0y5EP(?hy<;EyW>1sy4&@lu-O>u@Fvt>$WXvCxKhSqgcINHVdE=fu5V0p zDF7G{-Z)g5o?^!FLB~TmCk8EMtDiNGc#NLpMlK(u+|Y)(lN|ER7~nbqKy)L}hjKmz zIwa$55gjEEfC}JHQT}I@5;*Ps`2KxWH6_sMbrZQuLeUTbQLCO7LsOP`v8 ztix3f;Ni_~M<_=)=oQq?ppWlTgViJF9fJ?_e+xX7H~)<8aQyL{Tm4@(f7#r_`#b2HQk$V(P#22$fE&bk(L9~Rmq7oS^Hhv^wp79W7pDj7g z>p@)^ps}mF&We9Zp^2QzIPw7i;x+P6YsRy`0cDaxsJh5?DA^jJwfM~d+E(#idGd#c zM>s{4jQDzPYLcSa5CsT+*MSjJ=}$trc34CRUUr23WchR+|LRx%yEXH&jWgHyvo9h8 z!e~oZh?SBGuNk9ZYllndT~=39XEEUeHh$E|0565fyTRosA1FtKyk8FS4iVKe zR2LO{0Dv=P-2eb)0{}>HX(QY^LqAv7Haj3;!Ra<+h)e(g7!zD1At`53ydy6@`Sc;H z#Pe|Jl1x&|r2!B?#!~YGhaT6`(reGHKV@6q$g|tlO}90xl>$I(U(kht>$NA6)4-EY z9Rjd=((bzB7E%BN0RXr~5eZ&-tq^&y-EJj!>zvFHZvAWkm0!v@Z))o1ne8r0RUgI| z$+#m%#1ig!1V+J;==Gu;2uS-C0p!~7&~HR%S4DITMGENXQu>@8#%aHeLV=x;p6Vh? z36v5B&{g&J(lmN~tEE_q@J^zwXkJvQEaqB$gVJ0P4Fh>tQCCK?<|d9D4tOBOt?2Ez zWHsP5CwZ?~QF{pEEQ5*C04TE7@c3Bni^JQWs2MWq({}Bd6h)}446o1QWwf=+GR7qm zk&pBYlrK<^BkP5v^}FN)|E^xqpJO3R$#RTSKX`1f?b%vrsR@~c{vU$_N2}!(WJB+E z!Y|Lk5HN-4bK-#_+`BhrTnqdYf#&$@ zy$|rzey<2;sPFyH5!?7|o-JR{X&=3J61l-gGR`p)$ynxSAx}~C$aoF+AZHDrGeQN3 z35%fT{hiRci>u_&BmT!zcy1r-a61lURn@)FIo#gZR%*?C4dnPG8c@qg{#I}+O#+e0~DmZ-^x!eL#Oj5Wd)VDwjAoz4bCvkC-GrP^{TygjA%V% z%YyYvmM3b3m=l##N*2jA9q4&W^6KsI_ChDg3Q&p7AM z1DFU}%iq1Rea;htzPN`4eSbfFRNXYM)TifCNxwjB_p0C2-(5r{e0@`+{rIsQt8A{f zc~<}^UJAg9G`q?ruHMuhOP!~vx*A8$Qy>03(2M-TpiC>f$&{*n}hw{lP+y25~ zt2{v(8GxEetVdU^#Zb8@&hQ1K3~!gN(B`TUc6q7|I7BHnRCWHOE9oYje=DHQ7Qkvv z$YG_d(I*c#SUGvmdj=?*l&+c6V(hv#Q_=gT+BkUIFd};hu-4W#)D(rV6uth45q;=_ zlF`v<1QH2=BZv}wJD*l(fA!WuT`#ZA2mnGM$lbMoe#&g`e&o#>qK_rT*wks`Y&bx> zuI3_|(#^ckoYdYk#72!xu*sxUP?X7>LsfR>R09sQj8}M1X&E3>oFRtFP>szZA|?#O zIH{87Wsq_M2Nu@#Zsg7Kk~#norL-R&!}{GzYVM>dv9^5OJex6Z3_Knkmvq$t-X*W9 zgIySV_?To_r4Z2^l&mM6RxN}x)H@h`PG&cCBV9NpkXkR`+XZ8bv=p8A+m70U9oH? zfaM7`1O0nEbw}jz=C1Gdb!9U`Vld8PoahBQK1q*G}O*071uf%xJ zLFK7#u3SD+S5?;y0M$`Hb3##(h9a2Dek7x^E*VOj^}9=jAO;G5A+Ugz9P6|#&mBkS za>7WAz=&Iwz*YPqc-4NMqy642O1B0%35 zDol#1BETd4-w(a|7!y*OYZ_1$S2rV~MJM2|GI-;$-Dm7{Ua3Vy6XALZa^doE7Lx?9 zfWf8c?&W#Sw)gdX=#2vpIXU#wvduPOlWOL#y{#AUXuBObT*4aY%jc!PZ;Re?fwtXw~st9 zk4Ybc!L`bM@%TYIRnSJNfW>YR*}rcSo2Lx>+}~VBM-Q?8{Le>0PbJtVKd}m9ZyL`h zeumKDOYMOV zF9fM6ZvcqrxWz?pKYLPy_6YAjXiRGpBO~~WFP^Zk|JPQ~;|l;W%mPe-aadRReOAMl8b8#>8Sg zM!7|(V1-?jQsT^+3j6ne{{@DtD!Xdsl|;sX&lEP=x4(^n7DdCu4==O3?*>(w=)@%r zpP++D?GBxM4;mhL`up}Rczy(?i>9IY*QvZ#`_ZFs5e}=~KKJ>1ZNV}&-0&_Ja#an| z^-TD>N-qV#ZU6uu2?79!U7qFdXKC-sr&~5U0KhgPK!n(*0RY_p(1dpe08lB-f8~(+ z@elSB{b9Xbf73ks(wFZh)VjCPl)&d5XP@T-0BWk+?3pJI+m9dJV*mQDUvMb^!U;{L zu(H92u0MRJ*narfHgf89+SkAS2^*Qh_(9-Rd;Ty10KqN1%%1~Y0_D!mKn91_3XQV{ zyf=d@=J05WzaaJ{^!6rNwHX_R_Ke{RijEJJzH z02BZ^Xv1jRhLW=u4=k-`0tl!rS8+$070rqf3Rm? zA%^#ITeWJAjUS(coJM}jBgbs*O^X2CjlkgHF~!EF0XuN8h^Q*009ZZCMO+Z{TpQn# zG8E#^zlx%5lr35~1sN^I)kV)y9h&f%dwX{&fBWsB2d^h(L!66Zpz7#Qb#yoYfKmWd zHlGUspiTMtcpAL9&!*2nF%J+h4#mBvT7cr*KPY3lCwk?5pk75wXx)fn&;bB2*rbpG zAO^40P86S|C1o}Y8AbqrSVc*K-wJf4@t|Xny?I}Mk5>&aA`##Tcm|M4GvR;ZMWI<8iML-A(Ja(QZhp{5UY9er-06=u7c`7ywza1{Bt1p`fHug%{U};b z9&fboJ$lHtyqRxllgWp973q!=5jyeO2@HI%J%M)Wiz5~9K9#)--mkBLes=Yx-)T2C zRCpvtRd`?*}qf1}x>GM46+tl`-Vaf60j&^I9R);XWmT z-~IDC=bzU(|BsKC{P3Rbp6;rn7r(#!I(d~4sIiJX#ap)JSXTBiJmk{sp8FTua?hwHxtlF2P{fj?q0aWfW_&7n0aruZ2#B);#Z%zIcBy0sSl`pH4Zz zDDU#RQcA-H44iypZA&1Hiq`HHw(R;7m)K`_UBb+Zot-TU^wc!dG<;yqYU)NIc@pKGVciF)tdq!3)rT8N?^?T)K; zEBs^!IjFO9YcViS;`dRkTeJt7=mP06o_snBeOMWhDrXZV0K@)p_6KetdF>W|Y9$Jf z4*vo|28_K^8+wfVk)|-ciC!K5#}(83~YVp`Y|)ioBsTT1pY16jk!%Z^I}t zgp_8X)FU=7o=8^7t{zdO2<#*pPi>9T0RU9s+741~g%OWeGJzrjjV3K)N@^VIKk}*g zG{o`OCGFE&TDqOC=VV@y1KUiUJjJF=PC>55>r}DG{vnxxp3$ z{eJ#+TC+JEuTiI;y-V}x{Hp^O^XC7;ZUDng(dlOU-nWm~8=EWa<~5Oa$4yD3b5oiY z83RL+8;269jd9l&=2Ct%wKh=%fNwW)FVqdYe9z{LpytswS0ymp87@wl`m?Acfg@oD-%K0TIvr^K=DX{m*~Z z%-|p763FPsqyTvCsY1K`Lm5N>IGY0C{JY%u0GX+#0|2~&LI3A?dyl4$_dQ5NPmHEY zyXGBwiacEbf|a)0W8dCSdc%5WOo^oZQ|6}G+|`q8+!Ru%AZlu#HGo0MIal!nT1F-S08-LPZ>zLO0{3cMcLUy(@+LYC zkh%kR5s9J$*@LJM0{WH`$*#Vk9%EmhMGYk~4W2ebNpaHyfUUKu)?$$LR$eiMb#j_b z8c&3%*dEqAqVm2~W^a+2dgO>+yZyE+utB6@W5)w2c!-ER?{K(vhHHF&GY}F()ZA!0 zQ__RJywu*p8@rTrjd8=1Z2p|twrWL&O`eME>GXSU+v*&cqS%{=PuJn#)Lajcm3_(p z(KJo~mMAA`m5%C~7Rx>c=&!lQ5>rRvC`9VS;qlPA4gD#OEoVxQFXL>+)CqiUuv1mV zHf_;NyW;AZmP#ss5P+IW*MLRO(bLUCHbb&qOTHESVaNdd3Vp$egO#@bwbNEa=zs7x zmO)yAB{xj4sY_B_N&%PZgOVJG0mHaJ0P=!YA9$ln`!bJkn!{qzq7kgo0ffX&`kbzT zHD2i$aK5WA>#`H*LbDGXw`w8*EnGCtZn1-qoQg)pk z+70L+uY$lve|{0}c2|N%gmjkQ02)PC-pF5JVFfa9J+fyXK)V*4QZfEhQmAxClq*>_n*EA^6;U{B#l;DH>N$kh z)f};c6Oa6%0{}!)pR8)KPjUaecTVKhb>6Q`PI!QnCNfawGrXY zEwYU9!^t_+VL$oFQQNQ~k7xm7T#no0$M@m27i$0VuMeQe47H#B>^U|TF?Q!2gbbOK zV%1fB_S|#%lyw+y`ZW9E|5?ER@M!`G+#y<=e=hJ-;7wO(qRW7I;9v({!J7#4R)M$t za&jvzZ~y=qXwE8;&%OWR-&Cr~MLdEL3IOoZO8@}A{)Vkuxf~F~Oq()=$;dTgtnPT{ zYPw5QRx<#At=kHz=PT5Cz`pdw2khFb@p2XlQ(V(M+AB;7iIP%s-#velFuXZ-{dF^m zsxXgddi=(F@TGfIRa)Ap@764k$#r-E61r{bI2JwH?K5`&@ji#}zYo4k#Pk@2`apbA zVVsLgYArwSw9Az zpWDO)%J9zx75UzL6xTrbCd5&BMXRmfw42BmF?P-B+0K(N`$UCh9WFqCiow7GXot3W z(~7p~gXrLq{4!KOK=i-^)xTOGTi|Cq-m0^I_|kLMP-`wKL|ABz&6}5MHxeF4VcrfO z$!DHK+R9Z6@i-WOcO10ufA5ghf-e30zkd+Hs}@kxE&xT7>@WUuF^V4LvZiT)De5&& z&)105p&u?=!`&1AFkaLts;NgCQA@l_0#w%iGEn$$BK-E*7r*p?&0UPt$-F&30)PMj z|NPabZ1hf7>|#+r&|`?vr1adLnG0viMX_|N&%cnYTT#XgJn8eeW4 zoJTJGMA#|j8Z~oJ4FYbKa?G!12D0Jk+)MhA&&D;6~oU^Fp=U$s+0&)C8d(aCT&at&yT{W z5#fLZ8kgOKU~OXqUq(8Eyi*l;KzF(gjLZ3o2Uao$))5Ir6JS%Vjd?f*2oKQcnj3g= zT-=+jj=0Q+$~Ff85HR6t((Q~I9cP<29|t5=Vz=J17+_Tb?e~aZQ`?6DKaWuJXY9Ib z<`ao2**!z`tEultPJ7)l2xm8c?!-X=fci*}YDSE4vu3#n0LuNV-8tW-5Y+K*i6I)(GHR4EhRbW3$e&6CjRZV)7-Pj^X{ zc3ujB@5-B8NoZu8Cu|Jhodi;t$sot5@MLAK)1B{D`(1ID^2HH|y0fp4?9tRP0NAmT zv^8(r(Gztxf7vRVv3RV71AvhdSL5E@5~!0$S)W?ow@X>wccW~-{@xg;kDVNkl7vCf z%RWFkHQ#*hZHwuPwCh%6+LUoIPEjw9qX_t|fB;?^FO}qt`?DSHMh)k^r+85z_>4!N zf6g0Ox=#0Ajze|v>f=4zd!~0rBUcCCP^$IxhS;`U1-5NR4mnl(3GY0Me7RHD*OQBr zF@Lrkeg4BgGzJ_UeDa*vBzbAq;bmOPoDante`Io!XV~CI%>^yZ+ABEapT4_6rQbNu zn(Vy?jS1brTvJ~2y832#lp#MPU>GJeE}whYe~X9KlJBzue%H*JtyFc|+s2S{G!f75 z*kR~JQ0j%FJdNNl45p=>XowF)3Dn`drd;-~9;X0ckAk)mukMC&dL56ya z&Ak8}$ET&(2o#-R3JvQ9BR>X4<=OYkUj2(c(Dfv1LKix$6M1#^#n9lkKW2Mw329E%Fx0hK7Cs0DDM@bP65WLR)ziUbo4} zQX&FHI8rcPnpuONdG@%yNqWsYZp*Ya003MB01+|h(Ad*TR1etv+2;;h4q;>OxJ?lN zMlfdR4L3g7Gmx8i{YE^wDqAdb25VTnQb`c{6r(|M%5clb7zNmmwH~0py!N%n5-_Tn zFsRjllS|86kV~6T*emxi9?bn+$fWZ0PeFzy)V@6KL8E9qi^VAnx;zp!uKTglbzp#L z2Gmg3*nyX014fBfCsU}|p*$~zI*d&pg}wm&3$kr1sjli9kYxeeH`FUa0pXaDHxdA{ zCM5#IBP~H9a`7I&B^aE(8kr(r#aO= zm$E@b{=j|=5X!X={h0ckekv_#!61a}RXkv?Z7#MW2P?>FPuO}43)6Avx`ll4*WSpu z9mBrUC;GchBUSA;>X6^y!of@UpwHsRfx~^(sldAIt&HO7=RKZzqZ!&(1E4t+DKLtF67i z(WWfSuq7)qEoE#pOn?%_ceI`{5M3GUIi!kJ8blc%RqUWQGM}A+U+3IsRgWuFN8U7+ zwTF<$bT50`l2aJGb`a_suV?FRv~@RKX?NW{i9F%};{gHqa_z{GVj{(u1BFc{(#oVMDHb$B0XdEY$B0{oS7oh~2>g&;SbXat3D53EqZ2W}b*b>rg z{P+~cK%`5lcyNC)hSn3--QHp|r)M|={Ni~;ssNm}b9b%1xM2_Ns<8X+z1r5@IE$R< zHMEI^g;B`JAEXB-e&yj^C&Ed8BgI_=@6oJx{W#8*Ba5H5!^dg>pAWS~OO}&IxiW-TV%8fg7)SQlKBahcff{URygry3o`1`l~1HP*yok5&|>>pkU`KUNvQU zJh|LwqMx3EGiZrD@$?qb1f<#GmD6qF>|~2hpl+ld)|?x{p8z*nG}U(l%uQ!=B1C-A z$tK(T=5ZpZRa*~6*AdwK<}I6S3)ZAt1kn=YnB|5H_d5`QWEegxN|sXjh#o4-$_;h}*AwjdKw~^aJ~qA@Iv^fe7%@F34`QEiYw}%B|QYPZ&$&)ycMU&1fQ~03rc& zqFeYMAkyF$k5uQpLO1x8oOq5LuD7R2Rh;OxH=YB0z4wSkpdXwD*z4B2 zX4tAV8R*-F*}k`n?U#=$tyG&WxNfQ~#rt0X5O!|NC9JIiO0j2Av;;Vw^?_(oGz=pu z#1PV|4ADNHP7`a@3UVf=6~IA`b81Q@HT%NlQ;Et#B&x&+=iFUW*-n~;3L-2NT1|Bs z(NE*-rkkeN+I3SboqaJ&m`_kXczxr&tL3ym=#>9)kj(B!ofVzD!_z|qzHm}i*N?i& zzu(=V`t!j%FWN#s)?+!H3k0FmXbs4hl2_|%yK$oJvjUw~rh(91z+l8!CPy zG48X-^V^bT(+OFh$fPPH?EGPv&oI2mml4W!B#e6ibnk$D=h2tg6gA-`Cy%gx7`8T0 zV{Ogq`L2UEY(5OQ;1r%d33mSjcRHiWys)mC$X-z%avRUNif((34e7JLJU~eM1@*6eT6DdI$4OGE3UxZmaovgc?uGWM zs;X-%;g+_%c^Cs!8%WAo4$Xf!yToz{t1~V=i3lGv@i<`74-mw?1=0J`H$o575vTxP zHOERyI_#1EK4w4r>8mJ12stv)hGN8602eUVM%li-J8k=0d*L55;6rziMr0ITJwxml zKhGui<3XYTEWwbJNBE#TKu$N>!ylW^f*}D%vQyw$?zwt?a2al7ySRW1cU>~OC? z+#ElT${N4okK4AMw(opvD|wQ8?aw}Q10Hedp3wIW0033DTaik(p0aO#bCZopkG6mQ zzaK}zCf>nFyGR%7S;!r%OEvb*|9p+Gez}0Mz5)OM16u?FCu3%?O@X@Q=2qJe9^GaK z_MWiM|LrFT#W>2#(W^Go0FPIl*RVf*y?_FaR|U?hZ#2ww&VA;CrmN$e3G?yQeqQ8ZqJvU@63Fad{;mx^_T>9e6#ECoXvez{nI!8NkKh3e0;Th=YZOODMqn<~*sDFAl8ebOo_%IwDL0SAm9>5L`(WHm%; zTL02E(l@2C{--+tgD3Y;HGXey>9d1bwYGDY007qzyH`htCIlT$%Su2~m7(D%i%I-lC zqTBL$UqO zx8K0?KMjS)B1=ps;sRbE(i}Jv2I{7JCAaZk1q9B%zu#P42m2{dc~^BA_QS2Iw%uNS z;w_8njtib(LGyN zh^JhR1D@qI+C9wQs_2wz?KNGB?;%!rro~>|xC?`AGsge z85**#Sr=)W=+a4;{fep<)|_UG9~tjL*sETSb`VujK@`?g{6@S(>#pPk8Ic44kiySh z?8X56gL|aplBd6Nr3+A!k&ag!vV%VylyazvC_Z(pyUlpTb--z(|GD1I&{RAESU=^aynkTtflZ0kCjpgp4->nxEq2&9sSIUM@V~_ZMWaLj?@H%?GFF|w6EQt zRmShfh)&gr(IcL}M8KFy)D4e+LJr3e&RFfh2@<1AFFHBpKW!qSKpANT2%C=qcw}O- zi@-E#VyY!4k&=^q-f__YOGCRElNenz{-MMGGOQxYXs^~mh<^bGDv%wj84Hb!ZH4QO z8$O)pj|L2zLX-i4U}Z$?WB zMhCh6{(YWEaZYxG=QvM6z<&Z;X``VW&E4?+F2=0D)c%?&;6o%)Ey6LrY5KJi@pj8A zjrOC*w%MrIQv2v#00t*9t|B@CwS?K;tP-MkWZU5!@^ufNYSX5VWA4N-ryDFc`!Kw_ z*sfTNcPF{4r%WPU1+t{{tm+5xiH4S;_VV^_dwPA5&0aJN0KnBY8L)t!uS1^GTVF4< zr!chk5N+V$PtCNeuOH(XD%=(C{NnSBrp6xo$q$ZUusvZb0Wm!AP$qRv1>lV?#d}ns zAdM0Ic|1&?m|nK=d8GizbtwSuBMrekQUC;OB{W4>aUFCnDQ&iIe{-iDI?#_%brK!W zXgMd2lUF;;<}96qH}?c09bg1yIqb#BPbmQclh_rbD6>P{CX-q)C{#CpFV+Kd(~|@~ z(#49^)_+Ys=dGhZ3}`0-QsXn>%Rc7V|2&#vET2M?dI@e@bdjW;j1 z)vLzY1U&PjwN@jWix-KeI{f+IzBp(*S|Qrg3r{aRMY`wBCy3U4)T-FWj!7E<_;7|@ zM`-(LnVvIAZf+OpptlnKz6t|=qVou!GMgw($wY-_y$m6Bhrp&<;a&cE(HwfWRS&WK zTM8@-y^VE;VX$T{k9v*SW9V=M3hq)=NjYbU(vJTy$7L^*ZCYt7^}9Q$vw*K2 zJA_(%mVD@JEt=wLGwfP_yrR3Io$aJ&$ZfM7ukXf4TY!!%)NZ+Xq2080noXP>13weh zIowOoyUv|=IG#bb}aYj@o@$L_dq zw55y+$MK*SXS9>H8OPrt;iQDVJ=4a`9S)yU*v5jxWwb>q91x#vQ6>ltESYVVHS@Q$K2R=A_%=MYA!KWjP^Uq0Gjnr`c8H-jT9y`?lj&R#IbEUp>|C`p{gb zJjO-{Fdz%>@?)TOCScs2L6m`PJ9_veVdoB5NyZw%}gusu&(7%yz z9cA{v|JMz+ZtWxldki<*>g@+V$hO`4^4Pe?TgHSW?y0xi2;*_zJt%eYpws?b%@xBh zFGtXNDwp~n#ZWuhzWBvuo}9K4bVuZFF3e?5#QN0#10+lBLw(MAZbfn z1b}<)S%?>vN>Z8cRK^8`x)Z9WWTH-(`NoaM?CamyVi_6Z?6aR)Mjp9T6cIu9{RYKr zP}d0n@Jc>R|5clnInMs&|E?p&f<}T2A6}bX+u>GyjDfXGwCoYVMvR zQg&gy&C05_zx$ibcA5wdqf$fdCKkvwtEOP+PhtLb+RmK^Ebn9qUI-Zom&uj|(sgF$ zOhUAcgcr3V@D3sW`?Da&I_=LseZAdq;}jGn5^yy4{U!~z+CTB9_lr^>KqvPG@%ZoW z4R^j(007{1>u3tGzx%?2wtO`}DDlA{(n?5d1YGt{U;QP#H$izNV^1_1Dl|9IWDz6Jo`kuTd-*WqOyNgaa~e$-3X?%Pvj-+5#U-WuHi z3_eZBUigYOI_?31hMaxGpFaIc3W$Hx0pg~bpd9K(Hx9gSuvWHpu8#;kjxc#7yWaNh zJT6^3HOGPQz7j_hGJX_i$Iw& z*2a%db}3`z>DP)9y|lE#N|1BPORK000xKxhG(70i(=f&-#iHo-j5VG≺VgnvK?k zO+pxgE#6)jEb8%^E-J3X;8V%xcK6I=yc;J>NXHW;3819%4{Jl{jaRKXiXc$JJ&I;j zUQr8*obam{%#xB4F~*a}k&tBxY&3MA^NNJ2iwoLd1rhbh0MF{j2b~O=VQc{Fg=io&Ez+e9I4F?{ZKaU6iM4XaN zh)1}i2>`&p16A;M4C1v)OZJmns8kr!|5O99zqXUYHow09!M5K0&nx)9|R71eB5 zJ8dGKdhsYzLXk%#le`;;ClfJlsKgLl0IP{KcDkh6eU8B^P~rHS7{40J!w89|JZ)W_ z?X1y&5#l51L+*ooy5CJ{Dy8u&bcfiYs zlM%xBA1bdx{)IS$8vqmM3E9B>>$OzIp7I<=%NxTzj0d}c=w99pa$JTog6oP@iJqpU zxWm5v$N@Y>a|y3G&E_u8BqU%A3Lxb$q_0IfUYzp6)lgq9Lsft8N2n)*53kbRe3N%s zs5RAj0D$P;D7*cJc{US;KCmwr^16qyr+qM^0e*@H2pcX%^9tiH91j!mA@Lb4Au5>> z$UmORzza-ich>(kxF(nEb5Pf~w$pKXck_dHw>%IvrU3=YtFIliJy{2B_JT=v?}PJf z@luS3idy9N?YYFeWL17Y6s)yg9{9zjq#gkzl$ex&(ulmsVj>&@Y1a^ryq5%-33!nx zJ&%l$QfB(z|MFP$Mu9g5Y58@EqkFA3s(e+GK=w3N0KSSfBN$a&&RO1U-aZ zMf-`zk-^{Nd$ka+(+E=siT}ReI*6KK-08qzUP->{2Iv_Hm^zMjwBza5Koo#vA_Al) zMv)i0$AKAWMBwn-;>{%g?0fU>&tXv-T^RGf3}xf9>rW6m)a=9e%(GcD)Hk}0o}epE zpRTi4UOQqX<(&Wt=Mn(`?;-%lZe63F>KX^|wA+u|S7cYNn1lXi0-k-+3;2^wV+YSi zQVG1cp~zl){e<1B6aWAThARbtPaa1QYQ=3X1wccmi!6|Lk`#@1+~xoPGL-9j4W%p$ z3NLOrj^jtC-E{pFo{e`IDHvS6DWg|1B64X>Rj(ZZNV#Wcp&dI~Y~^Luj9Z1=kFaz? z2+x_7j*f4y4cCHs^VtJe+IH56fsO>CAZ7v*8*Ler0jNv1(r|s(j^JKY4{LnGTN%G@ zZxMK&H&@Od0T-`?=7)d1c(C|wD`T?-@Anp>2bPw0k{T9J768*^05(MhjqJrs*`wij z!}T&gr{f_!XJN99&j>?Ds<|3w*+)9<`;Tq2&Z=y?|F)&JdRdH!j_z5noprQ>OP z-$PR|5+yUgJf3|HVJ83pKmbWZK~$nT=vw6qFD`DjN4~k;at;qccfSZ-TCDBelZ#O@ z4}*V{ExB%n&ATeYBH|@+k$;)8wXKlR$|-y(Oh&>G8S?25RY3-2c@Jwp;EZ3$VhYhM zi=sSUWr&lPvc^p)`_WM3Hm$>Lq>9VlS!~;0+6V8cvpep%8c+-2 zdFJzFB6f`B>@%ieRE;CuQ6##u7{C|;+f`KHus|BR1VGoR=wjm;A5w>P0)Qza(q=ii z<^>qj!_{*x+5_XElF;|nL|sfG(z8-6=~wk=B>MMJqhm3wMmU`urv~SW=DJsoq7C=s zpioC1_=9+WXS=imOBc?y%<1W*N-Rf@okvLhF?QE&vn+F3xFy6O--H4LaN+U?DdWg< z{)_ZUK@{`$Qf}iaMyd&p5|cU6icx#d!D{>2le=u+!BZG$M`K5rW_Mr!Ua&9`Bc|tg z;pRH``|_#xJjtToJaKano>y?Xg|yvO0G#@53QiZ3CdNZgQOz|Qo=7U}_4)SGpX^6x zUyH0U!luogWV4rK*f`RmMGr^6!^Cu;cu|x2C|y)RR)g($;RLBxTLBV|;2Ltr_qX9u zo?(lxo(KSdc}hQr!WU&1(VTVjlDX~nBI4<6puGB18~VWq0EkpWWJM0tlBZKy@4H7u z?xhY!>TvN3IeYEjm1BFi?K5BqIG8N9TkpVDq_rv#4f5CVM$u1?XlWj>{rehm1UzIr zwr3N4Fv$D>~D{c2{M1qTHB}L|PyYBjltX*CtIML1^)^)22e+I@4WmXo@hK(R$5lUe6Is++QogLfbIZ~zT|0y_X zO_(&=5|R@vX%zbnz;>E$8dh%T&=2@qSug$4$NmeL3Tq6JN?cQ*s{7#e?a9MC?TLT? z><0+|Ao|i$4O8CKR{e=MS~xXUg*L3i`>LX%-@f(8TNr|yZ27Xegy$a%12ICP)qsis zqCj20I*MYv6i>Efd+6aC2r)L4O&%RaPS-cL9V6!}xfKz@r%#_wC-&Nzq7slLX?8ao zs8GUGXmS)5wlUe>!b`5!*50}TZ}fD)0$B(OIe3XpBwD~cD=MlYeC*pOzmpIo*1)9q z5$3jtaQ@5e!TTqntPCXtY#jiAqbQxpH69yJ$gd<@eq}m&yvN$Y`4NBw#4OcZ7$og1 zW089D2>}4I?S>ns*%!XB*a=#qha2pCaGSS_jeIve{TGjL0s!ng&}-lQ?n}-F20+&Lb?%Y{s|AC=s#*FFqiH~QJlNc{$j=^GogW|OztR#2L z^W>QN(T`pN_^{Bv`qk?Y{2UvBKk>l8z}G_Jgi@4)Pd<5!C;(X?(&ySg{6m0F(C2q* z({DinS6>k6+qdn<(B8=SngNn@Jm@>Go_hXZAF1vaJH(;g;lJxkU@WMuVxfU@9EWh% zUgX6+lFij6B20%sH+Y_>9k-liUZkMOX$m;dycWpM1Ve=MT&!XO$RmI9qvud z34Hg?Ub^i~(eV?3a+qUl@?Z*}T&BPGph56L{9Gs(^;E- z_bMU)th6WrotQHh<6D|m`rAyZlka?MJ82*Y!S|_a?4zHY{Eh$sPXP=NsB*xbdFmi* z%JX*Hoh$9H{`z{11)hRfn^(Unen)BCNx`8A0N?oc*Fg3kw?_Z~to#)K05B*-t2tm_ z|Bn~&gq~{O_~wHy92AMM0__oX{88;ckpiTEaB*#b6-NMM8c&|r382)yaVKMPP*FiWp^buM37#fC$uDj2$A-EN zfJMkxLh_eg81ySDs!+>R6-<~&s9C%o z73O~!V9B9)9lA|7s9PzFW)7b$Bcab*;vi zmNgL)HxGkrm94pIwoRQf2KlHQ9=XeIzG=D5AganR!W`?UYv{B62MbZ&R@gOb=Fu*U zk1B>~BLKiNzue*g01M_#0)TK903f<5MbN=Rwe}X}-cJO8^z;~~_>oRbhv=@O95WH? z4NsQ&-Anx4?{sxwjcXu`u~GoEp|np)Nx~Qyg>kB%zATlB5&!^s;24vk^45{;@h-3% zJ=<@)005P2MvKbokg){fkc@>F2^&fQ2_pdjw6rv_DGz1bC!ttC9z(v?o<+RWU)9x1 zLr^eygNPZ&i2)20QUuDQv4K359Vn2x+4v1$0hf_mAms?a0NO|nV=l$TMYA7}5}LV6 z4!JsvS5e5F>8bISgkcap7Gp~f6%pPALj3OC_gmZ`PyM*7A#+ zEMq!p+=$+m7*IYt&W5H%008eU${Ccae~ZUo_Dj$08&CEYFV>h7e+wf5LWjNf)J_XW z@pj8~vuu8*JZLe{GUntJsB~f7C^6(EA*F`o2ZG6EE#1-K_ zT&{}0x6jc&yRix00{}oN_YxJ}oRlBpP2v^xI6pKswK<-UG%^;w2Dws2PYDZ-SmH$x zOyqWx#8b|BiZ1vE_bZh|I$l^2C=itcw;PXB9SY$bh2c}4@?r2iEnVVCA@Esti0+#= z-TV%b6v0E@cXLp+8cJ?kl=vv)D@dmhPCm^f(g^kSbfHAA#p`vLjT=SI_{cu46rt26 z|4-ljKR&)^N1#5usWzf^Jxa?BuN0CCxPU$S6kEM=0&4^^m*f8isI$U0ZYCTp4l^sS zT8wN+x+fIvDnaYg@w^`U>Cay!yy$>kbM-=;8B#ICGiJ0n4YuC{06f3GkTjbo?T%Y# z5=DVl^%EV8GG@GLm1iG?asSrU@)GE3{LbD895}Nzbl72!aH1lq7#$izpSK} zy+$8id*OKOvc_twH8@}VJ1%?=V##g}bP)>vC^^w4Tt-O@U~vgyIJ2b?*<&vIoJm%ErjfAnuUq=aNV^SQFl%Ng z00CrGKw<|7q5S%`3g&|LUfmc%%h_whqB|wM65jm7V>3lQ89^E4$-EX*OmoeZXK2u%Qcy z5p+gv(jK?2uFHP#-J|yWGiT6M05o`TDswf~txp%0!wssb_Xd5;UV65~e)7E>=+kO< z-ZzPS)sx}zfjt{_(Y5l#uBhxJo#HM#e6ZKn-I{5)+?GnH_aXM;vjvV<4iKs2${Uv1 zOrjzTK{un(q}^&?w?G(*s3WgX84$fTcFU+l1;qIz^UDjkk3Fw)gv$^pZ~vh(fO3t1 zblL*A{V(-VB%YAAFw5CpO&WzaU>JriVS(Lx`vl9FAh}=73^Y;%{nG&jL=W{R{VzW2 zzVQ-F9!J~24>}+Cb7KJAK@WyMd80dh7v1QxV{wnbbBF@;t@e3(hF89O24(n<@ZKe} zdmP-2Pj`{`%)sN^xR#Dk5tTGt!s&cnMz!7CIA2uq?(_DZy3p|qPIdu6IDEJlr`LT% zz0P5c?6PS%la5JCwK9MSxhGCrbYzt+m>X{&x{Wli^GCDRG3K0{7F02>dV{YTT6(6W z0ex~{Y7JUQ8n|u`@>N(5CSZ_F;L8HUC zLCZupmf?Q(+aaveI^-!Y1GXw5Z+VeIG#czDo#USqsd>>|%z8&7SARDiBqam#0m$8q z+;wQ@Da(S#M}{EltepYB$ppkjgb^O2F{ZM9-Jx+>S%FNovBG}(y{&d8uh*i{@m+Dl zEW6^GDHfMZ#0K$hF;dmbjWY^%16VZXLF@&^g9J=bm0jcnJzEvvlsgT123kVw)Zr@I z@WdvYH9pfm`@iPfbO4qF?6fVfmfO?M?y;KIR$FmBkttVZSYH%nito{QmE*;Q*ZiOe$I?O}8FRoM0oS=Q2CZ!6X;0st`4Vrhr=EB!i`dMGP*yj%bk_dy2VT#1cHCj8Q*Vo=p{h4=om;K`Z{lTXI z@Vm}?cS^rNuXe+zD+qy-or5>?krEWK4dm+~j~k(D2L_^10JcJyp*DW}C~}NVB;-*j z-f)CEI&u;rAdc_hc$19+T|6Ddcnk`W5Gw(xwQ=JfycY9Oo`A}T9swGt9|SOYgFdtf z@7a+INEkZecxinQkXse+&&N=#VC$5Ei-ct3f?TxA_bN)QRvBG z46+h7QStUyf3?sSEEr`6_P5xNf1Cr;K8A88(k4xcw6Ffltr%t5SThhLL}>tM&}xzw zmvq|WkLQrb`zRi1(_93AXb@;Rq~y_|Yc&Yo@!%rmG-*eHv|)1{(Fr!8z>c*~equQW zPtci~q?Gq-%hB_K9^^k&3zIfCN3+}PYhQbvlnQC~@I%vSJJv~#!Rq-p1eJ0AN23(&znIES0Qx_<3zhXK^~IlpFM2%+`Wuc39}tj z(9jut_W2Kbm%fX~wlYR`ymiD*fhL?fX|m0oJrN}W;|2j!G!66=mH8D9bt{S*#_#?$ zFafWvI<5ZExX`EI9=J$({HzV6u4+fHDJZNaCB|t4)qV^I6KoQBilvCIsA;!Xx9+h? zlSyTt+WzaG4)FrL;s^*rvcmr3Yn$xgo>KdlfBrnFE~4N|csJnfJCqPe-pG(b zFBDJjP>i;%_7o{G)^FNLn5IegsZZZy|Mg$5F}F_HKYsNVyXoeMcnAfQsh7T4|DV0{ zfbZ+9?*5TvYwu-QmSjubd#`xMarPu+K!7k(M%%aT+rDinP)eb^h0oj4LfMp+KoYX2 z?Rds^y!W;&S(3H)p4RaD{XO@8H5@x}5=cql+WL?CzxTP%e$I2w@BEG{&-?0S@GzwQ z^i^}Q-uLV(vLAkDqqQ{#+ZX@wL7TG()SeVYzA{4BGX~2Fd+lGo`V7XwT>JQ^mf1sp zvfORxHDx{w#6rP9v6zaQbybRm$oEwf(N^w!MGBa%a_$(AGUSBFDPZi}D;%n>i+G>Cv z9U8rqQ~(1hTuP!dP6-co~Hpp9cI)Vha`);nf_58uBEpg;_Dr#0Pc z1vftVD5jomFaQ*n*4e%H-fZcN9Urt&T+(P_85%!+62Qt)DA2V|dm9Gb@2^$;oyJT0 zxARIy{rO0J;(y|BdjaOp7L=_e6^(?DXvY|sh~XicjXQBPOG=qjy9mED%2MfD;WBnQ zjfrwg4-V9|dwYvT@W-Qj2LMnF0N^}*yp_$OszXMxxadgN7n2);U^309E#a7<7?NCpOiAkG6ZF-|%I!H~D z2Vy872oUxl%~|~|Bb9I%)WI;fpV0FI&wLNRUBr_@DE(hQ3JCJQ_gHOHxXoEQ!zRrh z4aiZ}6O9MtAXl#{D3$nLD7X56*ZRCF!+c{v>zovd0(M?N*|PiPqt=S|-u27J+x(fy zgl!Y0kn1&cbIIt;eR!94b%}kV+kF=pK)^mJr-##j} z4-{45@AA;&T>DT)Up^;40xtJa<~{q1?TKf%8Mt!0_rnY9uDkJ;aiPj6HTQaTr3`v? z@Vm_FyPNjlPCK-00sttEduc_pHK9;Tg6Sg`1{8TJ%k#gTSh9*08HG_a8HH0UZkQEbNoz=Tj06O)m*Z0)d6xY1AzJ-YQ%}vxvHKN)wys00&`22Bumhcwi zCtPD6`P0cZVl0D|p9OTQFYC3nPoA^=dynDB6^HZILY$Cd`Auo4ja*H-&u{g`$$Way zpf>14-e0|6FNW3`+1`OUhTh|zOLnB!)uH5CU=FRTzGw$9 ze(WK{*D)M*O3Uimw^_%i--Ns^!N}2Yl&(0tov_c5r<%-^1 z>xk%%*S>hdcI{|nuQeG!Mg|710o|?2{ziwIy&I)&$@vBh^M`E9h9+19rr3QS&H>01 z2q`822c9AmOUoP*|${rdX4}91qF@vpZ~tu z&Yljnd+wc$u^mj!4aSE2;+h*9bYew2I^qV~<&u$Df)Qi@`Ve~H< z(j>;H7P^tUoxz`H3`0#IWPnYu@nMYSvi|;fg{l}_E$^$(sv{j5m!2Jfs-TWN5UHCkT>a3r z0lIzk;OxI;Ko&*!n9)${r@+>rF-qmB9b~Na4_BXh;ZOTGC8pU!*Xo=O*Up@GOh=sa z0e0>;{myUxpMQ_bl+q(HHy!c0e=bm3I!{{eT?t+32;3)~@VUYZgmlh>t>Tasdd-!Z>l|~y!1Z45lY?Od zvStLKl!9=yt+tJ?=E5p+p8OBPp>+;n2&S|4!mI?q&@<3VMsd|in(jY|YR2FTf2ta< zzBML>)~QCd*ztOBMrnXT{^-$a9D9%2tJ}}ARtGarjsgsu3=k^P(y{+Vghc?}D<))2 zp0VvA6i^bZ4}{gb&|;J4kFe!8O}F&Xv5aF9rQU;~FVPt7hCwfgxpx?+bqoLiG&Yq( za_YUgvbY8$)0zV`hP9u^R6;rUPUGrN?1UGo00-FOVLdI_F!!9dov-Y+Aeqk40d`f)zupwJfEy0gZ0^oW6k#1FOJyy=SnOnsoSo(ZJI4#Gs&V7KtRy3UB5P4Yu`Z|NH9M*-+PwcSNVVU;H&&(hM zLo_T=J@(kcr|s39CoKuahUK@+wNWq+^l1GcsUU6K*fTIm^335@L8z6z8_w9ttrgZ% z-C=Q~hS>txix(ls<>%KBvSlM-03vNA;Sr`IPeub=l@x>@k)1!$KxmXBR$NeM^XE;p zPyWd@FuD-_L0RQbC2;xIn>r8wdAjRQ5Ii`&cLlQTi6byg94@q@hYKvffY6`qEdUg- z4S?EG%ZSznB_!6IUP9S)v93zDG95eDHH3x{XyoLnv*>}!tsKYj>UzSu zBP>TJM%$?DQ8sZhfHN2>6O+UFQ;0r+38-Imn*v4%@Zsd{zAo1m>T7+h4+^cuRm}5T zK)bnljQj*~K7=npFt7HhUUkquzTNihkzMwyZ~pnE3;*=78QdAsnB@INeL*$BJjik4G)SUBP)}*XXinDG$YW5 zfpnbd6yw1m!=WE(!(;O_bQVP@*+FHn*^P425=LY7+28-&wRYWgqnMmE6;fC=8J|?Xl9Da}04E7AaD@D3+vopog+o^H zvzsJ!r4vxqY2WCeUW67AGG+aSX8X~PUtmzw*(W}+9IDybCZi=DKWZ^@R|A$zYLL2mqx_t44{-Dy`lPRJ5_Uhj-@Kc2hXy!{2N$_A zyF}cJcim-P-F0l{0SwVsi|yFS0{Yf)@|103i7gVUiJwYrf@*B*&f^HC9mF)Aham+; z0Unc@{k$A1aeZRZqD`u*+lW83g~_nn?!4oAXcA?pL8)-A!Hyg|3&TaEEnYB@__O#- z;IY>4c`}fg5`2rtpgOtYofqg^(14AJoc1tt%w5gbaf5GICI8w3rcL_ zlx)IxOmUk^Pq+(Y-cRZsmF0>B81jR9N}#t;47EG7h4ilj2P-hFuD8n4YWufu{tfd9 z0EWJL)@m7+)l;{g2#8Weeuhy078vo zuG16LKb3`dv5-Sb{2u;tNtJ2N)^Yr3js4_%uUbWMoBj3Q-e*fzflieX+|@Q0sJ$4U z+c($SfBf6C0KH1=Q=hpO!DgAG8PoXp4Q_$X?9x@gZO4fJ@Go}QPk;0pirG~A%;(nF z{U6JEQviVOZG}2&!}`u!b;9xtIG_mIAXtzA3w?c3ja1+T?!`@$C=vK4Eh$ea3@>twDRe|))e4XB;; zr*yC{7~4Bs{B!nDpkz}31Ej$?kct->n;{mVQUw2kb5(5I>c|@)&7MxY&LZ(RN#@!S z$2tN~{M zzbP*=gtTESt*Y*V8n+q6aDlZF<5x=l#KcIHT`20{F;gtAIJ_t)jvtA#JPJCqc9cFl z?Z)e81JFz&Jx`9PsOW^L<1C(IwaAZ)kRw?ysVm8+0suVy^cE-sM*uF(CY@-;hWflW zlQ+{=I~CtiApkyhJx1y{=T+dhf!bR~d3gh@R7VMC&}8@De;XkTXe-juGtQUPI|iN! z6DF~iXCSlbj^7mk!0!ZFBS9$B?j4<7ZqpNv5z)`LepOqkobIEt^twZ71q%4O->&|I zt4aDH-J1qjUKVX4S*U=>E>PS!KkH&NcS3b&+ zptN0fcnPAvJ9&?tyIQs$ifVcFM&TYf0t1z(y~_dnDExs8rILl?89!nI=)maP)YN3L zP#0(68IeezRvbPj$Ml!}DhvF3bs6PU1xXGD0MvlN?mz$ipuPC=8H+~QHE$VUoGe1A z;jt`*wc>cHKd9fnCyLErQt|x5A5+>B=)6Jzv_lQM{n>-oQPFDGvoBpVcLZ}N3KA93 zO&*dgy!z4fDK9}WvWb2hYy;pH#yp`g zAbrkw8OiS$bkKiz?Vx#D(+^5X8d~#=x3~1hisDw*<4~dawy{u2$1smXv6e=lh*A;? zsiNu3brP2!zux(xw$#BXH|_?tN&i0AyW)TJRsGvryO2%j^0gSuN&$0qvu8@i_!W&3 zuz@+fhpj$R#lEbfILva3Km7iy%TET(EtIi2aMFy}}BlW+mF3B{??tnz1%+ zLZYRlAtyp5E+u+7vZO*tRST%foH;xcPwvEc%gji#OemV;@${F>GmL&9dC&EK%IUho zC1q8K2DiAr`(35Dw8ah`J`2F4*3$9RoQggseI!5|9DkhB*|p!cU#=z|cor;v z7{s}E$euTlhQz@xm}~RScG?Ti?6kewQ^4?(5TDE(l*XPW0SB~19EoDt(*V4JflQ#i zF!et=f*Z-y3tKbxK;0fo6mxf7T@PS@R>v?=%3h&NEHSJV+QVh1x7wXIjkZ-QVWJ(u zUhX3MFj>@?)0Hjdm2HtmBU8C_0qzUeNe-3AVU!gVx7zww^KAdoI&=^zfXzc~^-Zz% z&}Zk{n4ARk?5@C!;S1;(&e-!$=drJgvyXprnk`+P<_u(4(~ni(0&$lVHxNn?0Ki57 z063Eg0FX8kqmMuK$l}mLHRH`?(t+*X(GFw830Mni?dIFZ*{an!?904xcq*w1E}MZE z0KWU}?HGqH;%z_GZoNItQUM?}61MHo{u+Dk$uoppEV78yP@BDUs!g9i&f@r89-0nJ zM}}qa3Pv{VBs5A(D{P$MFfybNeh2yLqQU`ijXZ26nu3#X?I?P1wWf3Wqf9bfiCs+K z56Nwf<*>%>D6pfu4_YJ>&y6?Ez)(2B#!diSt|eX7J+uPem*3p}i29Wt)ITI{419A< z$=*-2{BlxgfDN$;Kv+A#vnIeKtXIu_u+QXLXKS;~g>hxZoUxXXlLUQuJfVKV+5ZEO z1rVSEGmP6e@(5SQdh!0bpZg!I-_?HJ!A*g#=Q0*J?f)9M$i2C}GWXH)l&Sx2uRNC) zDsZE&)&Uk- zY$Wlp&Q8P8OnMYgAEN9lS-+U>d4Wn$dU^uGp#OKTlWSD-i|UuGOJ3+?zB^ykfj*@M z3jBP_Jypp32Y8iF*H;=W+^G3Lk3z`Gv zIwxamA7f0Iu=C4ExAz981O{d(g^CP=8lCNLK4e9hCEHpQ*7Q zf9Ife$G6(5d*|BJxucv8S^dn(D*`64r&9IF<6oW5m;2pTSqq8Fr*~fY)KGJE&K@BI zC&|{vF53yKOWsbHDes*N+N8aY3Lu5aMVc2fH84Ilym$f%dVfv7%xzfxhm!kp4JSQGE0T6L(e}JMgo+X6P61)VuvkmXuXBWFua0ukC*tD$5#aiRdhtPCT3j7^_0k@#L=wsGT5=RqgR<21a+X3fqb zro$wZ)-foviM_f75WtZFXzzLv_=6E@6754DT49r?;9-Pu8+JH6{D}>;{vbl=IQ!H? zv$;1E%HuqH_~E^5CJc|UnFuNAwv{*^9UYxc=n)P6U;M>Pn?HXPRO}u02!m!lX@pRY zQ6szU|NPA=s6dEELQfk!@TJHpExo{o?2P^D(fyz);{gk-CPsO@YYnGdbf0(`(tiHQ zq3`MsgrQ&)(ry3s-4|Uzfi%p^uP$#{bg#72Jg*en!43sW5PrG;55CUMc zPT1!F09{pT+EppAJ2)KpJBb;5r3i)TTi&$6$5^$tK8Uj4YuEYDO{ z^;{Xc72o{PM^88gfV=LR2Lr%tNB`^4+E-JiOY-nmzG@9nAKgkwh^neKybH4|XY@!E zbi*y$W2JGEg%%X`XCdv?77}7y<*82GXAR@Qhdb&0G~^fV9emlK&wi4c#B1u=1n)nN zGOeCa6Jv-6nC)mo6`xiJV#P5!da@Gq{ZW7#b6q$Jc?qey{PdM0rKvWlfiYn1+U=l) z+w9KU*4Rh{V*OqTa(?%|V;F&22qiGd#)7~zJn_8I%bQowLAiVjA8Fsgxf!@q3pBrw z*)|MNy$Jl#Q3%GahN)#O#xCc9I&>HNcav+EuD*vsT@-|I<_JixDw{cHB5@BVdET44 z-@i`D49<$5)bHqBkMkd?dEoTv7W?HdkJ`rdJ8aSXO#8oI`!E0}7TTZ|=09B-=t6-H zQj}i|2Av5t^<%#|Xg~hxYoO64!+26oT(L#40Zc|HBM!CZ9C!C0U*2&I&;eg!b=YcnUWa`6as+IE?YO8vTuLq%eLwUj0bq)3a+4F#YqRo^%lGaTq6%Qc^|2Mb!QN5&}}<*mEq-cz&`nj8@M<6vJ3zf zmB^vnp#Q`RNB{sa07yZkhAM*6bK}O{FaS)1HZ}{zwB~MYHOZg5#4E3>G%s6M@j7si zmO8DAYI>z7DMM)RcBrMRFgn*0<32Jf#wo+QyE*{b#$$XA05_ac!7J;~<(@gkoz{!~ z-u~fwA{DNXPgOOo7~oO<)3HXTk90I@RVdb*0r-xlJ=2n4g+SS%p5ygk@9AC+RnE7c z4{0#i$FY{eyip6)Km92^J&Ey1>_-3`RVX5oQc`RreL%`or$}%QRs~b18sPkCe)j+X ze0M)lSAvGC-UDqePfIbKfx5I&BjOxzrWMcMM#fRSLIj8&7Q>H>7TPq*@RthvLVYns-KxZym!^8yf;hOXI9m=U@VHJJ$ncP)C65^D4v)Jv~>sTGIKR+VG@oIp;+&I zFmn%mp$CD^#Ym+A^{zUVVM!kG3iH+mm3lk?fD~kjDE5QHCAZQ@PI?|yh89Q+r2BEvB zV&G48Kp$_MiXo;0uesBBKQ$vmOeQvX3TwF5BIzWg!!djOi6gLB<`EijrY$DMZZbwQ zjq-s5N`C-wk3De)S)~Av{;2=}(k&4HoZGVu%C5?%`MMk<+s}Ww8)JI`at#20xe8&T zl6f-S(c{(j>B0C<# zNkSp5(ncnsQyhaM4*`0?14X$w1ErZI#t0CmJ(PO?vab}^oR z0FjwD{XXKSr8F*J_!o8at{sHpcz(Z~K9xuQLkJt1O(@psFp$AA5zXEjV?Y>b$k3~- zySah6#IGGUZaA;}DT6xCGT;njt$?J@<-zW`u84g}zSH>*4{8Jy8sb8IUb7^F=R`67 zFjO;+bhqXriJVR^NrFyhi6dlGVLV=0d&bs2U&P!p!afE7V8LQSY7S}x_gQ(@G3dO$s=eiTT3gd;Km7g? z>Zt;w&jh>w!(#z^GsiGs2B)QayhA1{Dp@NPbI!UKEA5v*Jq388!#;4|L=1u1%TRjx-Fz!~>`Q)dNI4xTnfqc<6XrT{z_@suq-Q*TH1pS3nX?lTFkI$>6-4P(BNQD1*)Iq+zo z*h3o5TUh01e;tGqPg8A|o!DDo$9Lwj4tLmf*H3~nd^-Dgh0>$q2G^bHbMSY+kiW0* z{rS}g*NwfLx<%6aIQUi7=K2O}R4aPTX2RVF!*cE%UcJW)9Uxr$=hE_890f4OP}!mA z-{S%Lr)OpYob0euhjQ%#VEk~5b1|$}NlCFbKAS!Jk_onOsT>y=2Rz5MlY3FVy!`o< zJEV&Jp9W|2sy_D@-cRxu$X954TS{h+~uU$UdRxeM- z9?=C2zL-5aC=Cj|z~Sj9G~VfN{-APYqLgX}S6F8X_HS|TULDZ$T`^=cz>%&y8u_Ew zj-DuUA+C>|JP)%{ge_aK*lxRhwoRBAg6@jBCQz@=IPIPlNZ&o*OIZ&Y_%x_*sK9~a z0)UTtLUxxE@}L56U3qyc49pdTIxd1eq}tg9Z@pucEe7~^?C^PeZA*zIpl4cg`*=&6 z08kcz*VzHs_s9#}D>ma;6SX=T8SvQTH18_Yl7duMk_V8O^*du)muo(Dbt#!nvXsjs zayFlwPDP)zFI9{6kQVDkJ0Z@_=T_RWeP^r`CeKV9SUz~qY`Xz~LVOa5YYEZAxL5yG z3(AQOiIqB7^^K9y@42;jpuP0|R!8lY)pKc<*uAOOH8Jop+ zfa;ev;d`JCl(b8p0&0Jte;v&@zr2)duRVL#<}XaQ58OKy`Krm*Vf#c#vTJUiWZ5$l zRU!PT%o;;HmpQ7JFJkX&CA8uB(Ffz@ao=y1m*)|86H6;Zn6zWGARgI{cq?2rf9krye2S?ln z%gryc)47GPTGbMQ3R^7BK~XqmkDoN&5@CyoL*7qT*eBRBhM^CX94QQ&w!t#Ccd|5= z74_NqbCs5#Tfw?t&b-oKAz?kt9icWNBhf~Wg&8V46_%bDOGpi;4zY=89n`u_xdpUV zn>zG>$AcZ1qu(=>6c~@tr+X%#i6yR?(8Be^lufeL*Uho)oKzIMEw&%z^uYrKc=k6q z@3N&!$J^a^&*oXw0Qos^;5>%ueRSU8c+bzpz&!?}Vw*krA!bh9yIxxHUWgzgCChm+$Li6(INcFQS~juUwMV% zyyQFdbo$8Q7`E5g@?~kRIo=uofNn^Iis9hk!EXER_nx!L%1V3SBTMaG7yx3TNsT!dl4%cbAvy>Gw$ zSLRTtgnRKCJc#1H4&j}RV|bV)#zg=IkRlkGTD-BO$oG~yZ}D&)T$Sh7%b<_%B$tk& z7p=}|D1r8|A&P?*XC8)a(TO?DAkU4plmq? zfJ&533W3oJ9mZXE+~61h)E4!i_V)k)sI93+seo}}+BkXxv?dN)N1;^4w|h8YP&x5) zqlENX6QAY?5MmgfiiqDbbNUPv2Pia|M>XMk3dVsu{am<|{A^()Z)gJ8!y;2wSq-hs zBQ5Doad9v_$H?fvt8aJ_pS zLz{55+vW|q_Wf^fVu6o>ZQ&z$o(Pb^EZMI~qJ5a>>Y3-h`jsaTm`~Y*pIBuNeR`!c z%u4VaxOSk%lr~PF_S`ea>_^|*VV&)vE(E|wKbcM2Dt$>suRlDbAe4b;dhMq_K5UOa z{sQ2)(e|~kf5IkDle8kiP(q`BsB8$v%xw+;kY8)x{`XC``IQs)UjP7B0st5`2ms&| znNFw#ta7T_e*A+S7_js0fB*F-?1LZnyfX!S((x`1A@{uZ%8Tky>sc98RZl&+%eKCf zOB~2{=G);Idt>o*PGW-^2h&gzvI&ZL3^&Osgf>D+=_sBNa22Ol>Bu-=TiXh7fEZWj z+wcmhw9_Z^@Y3kERoCa(gP&Y#lcpp%u!)lcHHWBk`G+RUs?QjToJ}EuM{bA|COHi3u1e5?LQnb}*?`qeRO;SLzw2@a7lIa5D5+ z@vM~z@lnouQSn_pkdpGp!`x)7@BqEmi7?zutaPz0RaQ5$i9jjL^W^b3g0(I|hER;b z5#ix3Zq}Z?xoiwdZTz?_=vWF?zb!fA>cmFxsr_@#hN*p~pi813<*qPie7>Hg1WRYSkmrt`%Yz_th05YryfKU!V zavuPI8yx^(7>kTQ9r#tR5CGd>I|YEF*6z9ICRh?AD^Sn$i=#)+!+v$xX3w4l&@{`% z=4FJEHOWC_(a%i(g5@{n8@&e#z%$hPZbKYMPYN)BE9;xuov~YSe1{K*f|7ZrulIse z(o4RHXA|e*K&ub2^6Ti|xT@mZq2KiP4i1tMAVEgLTF~Of$Xb0=aw=gR1lX;G0=o`S zNJd&3#&Wx(y-)2@^s%+Rw%WLQp&5T75VC=JW`TdNZc|@J@rqGp z-P%IpRqw?!t=C3mW!PlGzNKX*p)^;Udy@7$>~ZgY$z6j5a?SXoAdD>xR?zBhczlNq zYYVd5*G$KYi8TNPv^S)5y?3pbVXxJ7PM=)s)8AzL?Z$%u%!mVt^?>RPVFHrjUu%h& zPGq={$ASik3s*z}Zf$qHQ>km7;H2xXf$u!vax$o&3zvcZ{Pmv=$mdKj+)pl;<3cbr zv=LAAG~T;;D2{sVPw}W+eSJFX2GI{C*ALvThyOty9kgLtRl8#X31y$z1+b$J?}U*k zwGxw~0NJ%b<=@Pj2lXUtt{8EosO)6EXymtEgw$y0W7^S~NWm8y69vPFyiW)(fTFJr zqi6#0*+=009>H7_jG*dOyL!@l`|xxIl3geVYYCxqT`0V|<_?PnOpySnt((v*l^ANH zhV@z|9)hs~Qb}v)I`Y+ZKvz?NOEt55|NRq6i^uD@Bh zzbx7(=H}Jf<4+&Mz#VQMe{inNnjQlHL~^%xtvvU4>^uwTzZxUpSZMUqk-1bK0wb{A z^Vlc3|JbpUP_0h4rPqwNRDe|ifcRri;J3EA8kDqk$iE?$Hg2p15%x;5Xb2iu#pmt@xL8{cyWjB! zdv#a7RUm_n!O%K>2H?w>Zsa=pIJ%iwlwYyv1I6GI3y@ac{+bsho4GPysro6WYd&7R zattasAEm!+BV18#ZYh9@D#lk2`paa?Mn)U~J5U6`64k5UHbd`zAAAcG&8s7o(*H!+ z)Tf8k>)?6_T&HUSALa3R>SPu1jt|+@n$% zLcYDT&p!I8sj%H8BM-_rF;F;-PyIF4V@%##Y3pC242R3`^owNQk%lfC*=14^dxkit zmlkW2+gmAP+^3Y>T+v@0UfTQ==y|NwJitki$c)`RgtR=~VUIt05Q^eLjGYPSykUgw zY@&W@U1)^st{rQ0W&+@i=_C<0Y}!XClT?=L%T5;%#{TG{ojhA-dk$7wV`qrvOorhz zA&s$FY-f&_!vK)Z{(gpy8clq9h5qD!bMpn;_{v#Z|9lC1xHNm)0y(k+pfLFqD^ZoA~vb8T&+ebb&31_@kaR=c`E>_Kvln{+mzW8ENNsI>nyrdfCMFZ^>+AGjP=+Lx`F@zEFv@t zeKa*E!g+N{ve*7fp?Jm0;DrxB_R)TTA5q788dK&l&BfBk2$;u7`h&5e~oRU0__`}?L2?DFfahu$ozvU8q4y}Q1^M2d)mY}iGJ zmO8>_*5F)H2IYMv030#dVgSdu*uxq&95?=O7M57RT*&~YM`lFe;1X(au&3bzU}ulj zSk?I!7a~jYPfJs?TPH@1jI`w|N87d6jUTSq7iJjA*O)VFKjd35s)?2m^-^`3(>=S&+vG0NG5oc)SN z4Xg{^b6r|Wu0KDQ|DbZqFsjhg(usD$cG3t-WEJ7D&gB6BVT8??HIn(L%bt01za8D* zXxXqQF1Zx|000`XY-nN)a^C-{1NMx1IOnwVa69eqGUz&@t7lG2FRMSv(Mkge+3jC6 zfTa&}okk*;s6N=kIHnK!rhw_}!jJ>FLm+G(&;{7JIJef0>?pM2lO@Op7wv9BmE6P{ z76%BxEhB0pvZ1WG5ANOj)Y8;v8(#(h@U8uJF|pllcwm8z8K2Bvi85$T*R{+MQY+|; zgnT!@>jZj~V8)hPJ9rRH#~r$c|K7vg^MbVB26TLCXN|q`=u!3*J+^pRCi=x@02i&6 zIdKdI`*D_#g>wdSS1{?i$12aPM*=lr?Is)rAeDnEVodXo{EIEuqi5DUO_IP0M-><&Ok9$okr=K5AbRaKSN z0Pt(HY5)%Tr*T$-{Xp|@Vq%gdDx!jGl4!@Xi4MKv&nri!H=GktbOlD7Hon(u#RMlDKB!Om4|^t|;DJ2XQZ?;@(}o z241|O`MT4CFZo@3CM!BLnA$q={zq~8!yoKHk=px6__{>XdESatsQviMD3-L|d{r z9uFcq4CBTv=qfyQAj7ge;h%g8hJi^DmqtRKe4De~h<({-^t(WTTE4JxWHM-rLMGF1Wt1sLg)$$T55T zv3+(e9y0&*<<<0cMvA-6W$}0RBJX&GAlSNXKZ>;;3=b%SF)YZ#QJYC2%O_08BnD3s z163;obB|w${<`$CH?SCb-{00NX^INx@bL;fi_h4YF(VN6bJ*O1dSk`(n?d<5W(;lG zvI#_b7GRA@P{{&R;GymsT{%3XkLJL#vNn4hNsB>Sf?-C(n3#511T$)`4Nmvo{){xl|gp+&4~jIi(jsK9>y@Jlvse4PEmKipy0 zEJ<;oAGPy<;pkl{*!$!ms`J71?g>4Y0swkC!|ZQAe;;v~Vvvtnu>HZOUdZ@sMsWH1 zSDyxibJ8C8*fNayt3a%)Q8Z3p-`UiM1q^$Mx$*n|wFBWK$o}Nh*V@M($^k8?djgWt zCAI7W0P=JD?7x3>gn9Bg;&Y|jzx?Z`ZR(5wEnffg{Bmit>aD}YMWW-|VQZf|VE_5; zFF63fa2Eo=%cC1hj1}eY)QJi}20H*7RNGg-_K?k*hayI0XHNR#apf9Nt!sIB>A6z- z;rG^BS#hIfjLbsGl?_la73GKG{f47p3UjiHCTiqN+T8n78>s&MextS%bCJA=YoScv z0{zzheMi_dwc9PXEwVfBo&oh(94K5FnF8~oGNC5z7euaExEW zx@Np5T3HvNR;{T)?m*!RC@?lQ4naE3GBagxSL|XLBv91iVP1z!)!N+RzyTq+zQo0d z0u!N|SjKUb+j&c|q4Jcb5~@-3u$dCzpcPGi6EWeNQ4BX@z-Vo6Cq{g$MaRUmS)k5f zBB)`*(tQEN%=8@CPw>p3?qmeh#w<+W3BGr;q1(Kr7!>_}y91hk0RW;frm9Zr0hS&- zR0t@u%&uKI6K}CNw@#?+W#xVL_-{5i0KlS!7B;7zlI^T*=7AWB+q zLpQkHht5l0x^MbQ`IH4803g7DV(Qjn{BI!UwBk-n$)$~N6yVnoz)YR(t(KiN5(-83 z6wt4~PPykE>Lu*2xo?_}H@d(j#hOOm>e z-ngvO^ydh?P88yD$a{bf9M>C!_R2(G@NuF28$ygJ-zMkm>i$A@qANl+7KmuN5)w4q6={;ik=> zZ4+mVx3DM*j8}mMt!9b$+!5#(o)${|Ww6$KWzmA7Koo_>`e(&&=ggjA#JJ)36h;>Iqnbo_lEz-=~TQkuzP;`eX zR2B2|<;$pi{NWrP0HDoEs~X+9pgATP;Ez~8B3P@m&IuG00y|=Y006XQ2gXp*`-_2R z7>cLl)FkH-*U91;6BWT)8^wA=s0l!Eoq&xJ1ppvSPMFpxXCQk2)vxwPU3g-BS8W#NDMYmmL0i?|vC8PoJ%_$DcZG9o=#EiI2~RPCwj@Yk%By zAfN5rorf$@Wn;%?4*>w^8i6Xs0FalLkMqn77yxouQ()Kh9~H|wqsEmH`9y%_Zh>_hhh0GN}E9KnxDmwL&|Zy}cPc{@Sq zw4g57j_{0bt|APhh&3x<&6}h>@RaxB zr$Fa+S@+jrucr^x@S9YCk_aRt`M062%eJg9wnrb?WyO^hFgc7v-vkvs&Rys7iygi0 zqQzq|;LgCIMHIm@ppwR$Jm%8c^>ePFSXqW1@|hF1d;1X#0vHA`LbkJ~&lx@17R?(& z{-8BJa?U1BpJ@+$ZieMd@Bnp#WlrtEs?-N}m)a{YAGNcmD$wPo5^8cL`;cTDF`{9S zk}<-|s$^FE4XG_Ms2c3^sEkp#p%41hta{rZue0BcInC$QfF2rb}f zP4#*9JPkHuYNFk^W~|Mdl>(EH%oZ5TD6rOJc0)Mc5muoR3jD*Bw(m%ub@1@%b7m1P za13(?l*~I%xv)ezlS0uwthU8VVJ={NYELR~(B=(!#B?rTY$e$PAD?1#7oz{r{O4qw zH*OG>O?%fW2LL!|YhMNc@X;xRums@wrVIeo1I8xZ|I}{)i2n4nrDqI>MF?h3z)q2b zQ*e1uWl~+D=C7*hvLAkT7XXh==>I3$ojAv&XLufe>UWyRFJOl#%QeR z&2}w#F#xcW3?^AfIzRof$-8fjM0H7SJ29Sm!8CJuR@}W`2fRq+A+~22%se|mJM7LqAOW=RZ-e!x7DM4#46lV}&RHae z#-$6VVq=7$Un+bKQc|_rLcJ8dO zhkv@mP9ACk6q1Q?InyT3hb1tRumm_UNoC5EfnJrlk2z4Z?frs4pqagXsVAy@n#bgL z%Kn83LdN3@Ex{P8o0zj|EjlUGMq^8i#@O74e%=89Bn*-)!9855B<-=YBH3W;gps1? zc%7rUKX>Z1P0CKU`yQCj_(rZl#}k5XMK^itft%&Ms^(Q8UAJy*0l>5$s*5(e<$-Gm zhX?Z@@~UJLXJ=CVy8C$#w9`fAlpyxdVlI(FnUCmFR6Z^Z%#Gd`e(zBTx?Vf7wZyhP zdkj58s7;!lYQ^QH*3lJASd{5DV_B9Bj|1KyeVUhD(otf{uU0IDN4a392=#PydnMq_ zUKnHn0ra&v2aeG>W31q0F>EJiY&h%%!vQ)40aVEtm0;IjKNUNv?5BV;VUQpxXY*6I zs@e)1Knahk@a-o~mI3CfN2c$y7>xWm6SHjmsO(H(K70!Wr*w~5{p&JZb zR|9F`ER_dqMJ}v43Kf5WvV`LNGdd^3#)#rSE6Ea5(JLXpg|R;hW<6CM_X*@7u!s5) zdsOMC1gMokG+6dF{^>gPM{QwMFMaxeS}}w8)@X1Ue2{ge|>_!lx!PJ27O-ZFKf{7N01qEU&OtE3@sv2PfFX3DM9| z^x0ESpR$);+Chw}$@Zt8TaIUTFxS$ss%o#gRq<|fFGKh<&lcFPe!ZUo5NTidhnsBb zlu$R0ktf`Bu0j0!-mrD(?AT=s3i|BZ|Mdcj`36vxi(J{l=^O6(Z+L&;M|F?>!~3Fs zA~e>ybG`PBf8FGinGZn?wR|~13kIFbsLSJ$Q2LLz?&FAwNWGCA{|MMLv)g{m~ zL2FXsS$da%#yG{pvDHM8E(U}{K6tOTDo4>^=I~X@k#DSWzfN*q^YZKppBE*OixB2rtQeI8^f;Z24~J6ZSIG+nOEA8JKO2+yFsFsmRH%- z$)jz`#B?SadD#S>!A07nmVsv8uyG>>rcsQoDR^r}dUZB93(N^UAde~l0IYj?i={&~ zy==)mglWz65?F^hBmA)w`OGm9wrIgrOG(5NwHJyp7RPsVXyS8+-u35YOp~ei9eQQr zQE%FM%o%?sju)Cb3uQz&N<|i5rhCn`x>XaV4xQ7XG%i|%l~xenX3tU1_Tc?L1&ZZ# zZ(`+FuQuJ~-ix1|L8pHEAC*rT(hxEbXpSDKwx9fHx9!j6_x2gDjl42= zb*;|=@2P8U+Hl%20Q6mmu+M+-Lv{^Rc|wG0&hqaO0HCS1&;A7fz-zls+D9K;;TQm< z>{h28xHfPLZ%W$%0A4(0KVYqC1_1Es&#cD#Am>d006dJbl$YBJ0N^kl<}cdHRTJzh zU;VIUjbR~SnD%EaFitd5G#6_#DgeOuc;33_1pxTR%L4$oUP_ZQr>pGe|GgcW<}&;G z*Z<6>&!VHL?3(nr=8wnaYd~vR8v^~med9G-|KdqJv_?Bn)>xE8aVR)p_@#{o6hm$f z3^bZ*)&K6#S(@Fnxsu_e7vNu6NxSXZS!ml|JVEq=j%Vom5wuf;bdPND+W#x5%4LeZKcC#^SN6@{1k~RXxGT#2gjZKEO zI6Ryfu3cVOfO=54Vq`b!xa~{4mS9W zc=VMb$5jJDXh(S?#kY+6kr=OYpzInqHVwsFEXG#6bplJ2vM-O21BaVz!-j2k6JXP+ zlhe3If|k4tknsQjQ~&^2y$ae(V(Q5_rX&Aco4xSjc0iq3Hg~qDCJC>i`Xo`Uxy>jZ z_8+JM0I=IW`oJ0#mtJTAf6QrI>!=g}VEYN=#0D4u001Bx3Yegu&*awF%WHSyp)k=F zqL?3nVksCyyxLp$56l;V#9WG3|DvTq3hs)hOshF(`R^XgA(3td%K zQijn<#h=*#?#{N%fy;wfl8{g?=YZ5%R02#t5-WD1SF^&u9KUX0zud*=PRjdYdpg%sDLh zbF^QsKje1-0Lo#{DTUU&i_NFnG$%6!AeKUU1!K?v2t{a;V3_C>%Utt~=9l{VHr80^ zZ;>NL;ECJ{;HVkkklH%}pn5190(mKi0NftIx;%o|me?PdXSC0F{~ekgd)T`+V6dv7 zzPgYf5&@4z;T_ZjgF}3HT5?aJtOC)%x)4y?j$Pj%2!MU9}mg9&*RSu_Z zr0^3Ewug`|T03MEl7g=rfoT}$Lm5{BZv~-L5w1Oqq?d1}|bW_$MeJ+^vfwk=<(>lB~c&n$W3T3y~v`5ge@;XN2oi|zh< zZ*jUaa3?%g*JI!!p6}Y1&)b#_gjhOXqlMEZX9wAb?wn^cW@NDbRY9d4Z!OSbpFLY^ zhoR%HC@V#85ob4CH`|gUG3>NfTM+deoj}+N7%sZn+N}v7M<<5(f?~4`yP7N)udbPR zuif+DDj2W;xH!4Ro5Q@?R9y_JZ*OuNbYkd7Z`M;!QhD_!84?2ofXOpwD**tM@x23` z#5kNl($GsNWRlk$-t&g0_x|}dq!Ou?fxe?Ms=i$L->ee+WO$eEvJ!`ttsBpw$KCJr zxvs4kXX!Y3En1pm%kkiyHX|ANTdW;{+VtPAvU2rE?Rjf4_P_GNY1{Zx0o1@y@`v=o zHe11pMJ)K)GXMw0;Y_vPO6qFuj{EP#aGVKsGkt+^t`e&6t1pz5blCPS#kO(X2`ewD z$BAQ{t+{?YPB&?cO|5~d9jB>sb)u2zbwb|t(H(;e5jg374xD%6QvH~D08rDhqc}wU zawi6nYUI&K=AIDhgpdfxOm%g{Fz#!>Stg8dlA~v_F$qw68VsSM09%v+aLvoD#(6Li-9xJtm7cP@?_C2W^aRVm!HviT=-_+Nf8;?A zUBsM_;*9Sz=SH$u8C(Vx>eBCCNj1l){%fi`U;sFXvja@EADv|Piva)tfZKC%>+6T6 z>t)m#Mt17`nJ3QM!#_K1*<&LCAxuQ3NOkk8o1^@(%Ci*O?R($ZVaE>j*&TOHfnp!y zV7ipne&zEpK6ay1Eo7g!b#tC=*;MXi{p1lN2|tx#7nx(vo-DV5BUNg7o3J3&mfbqt zvL_{4H+o1J`9qQA#n31KfEalM08klv$b-r(;&3gu(xZ#cS{uk<0RU*TR#;Z^j#k={ zSI=4l>@;&`CjpL}XLIJKT0|h!omYE$9hC2ZlfQSLTrTxO+5NdwU+ZdnvF%i_mus*h z7@Ln#r@73f9mp<`fV)yt<1viJSR^t^68#}%RJ_Hd%E(9m!(b)`4d)EQyFdhv5jW6j z^rk+lzK7V0S27IJ=bP==o;=GvP-sB_+a|+|cn#~~lBHwOlfo7w@F{b)SFhf9b?dV0 zznAaBy87KdRE;`h4{4E6`FyLr_F9>(f8~f{))}21ZYvjOGv+gFEMqkW;Exw-QF`*h zMOMiEd}LORU3+b&UAu~K!PKtjvpk9Ro=(R#vnU3LnT#48FsB~nX4=uE1tFkaU zv!{1`R)rs^4}EHHyJ-9OcG?eqaNJ57^6dJ%76MF4H`w#Jl+;zHdWtK6p5`6WA&UXP zEmg81P+n)0*3Zb14zz#_t57PfI7sGV3*EEnumv>*!IC_gDK^-SpFLsGIDaf!J;SnL zH}6A67MNUBs1*<;63?de^aa&HD>}JjgwQ#(r3}xcP@6J0)iMY}Y<*!cZgttdZF?;~ zEXGD8r^4WH4*9vxmad-4`Z5cr9heVUpL8hHcrl^TckVui99U*0gtICytHsV6ZrOz3 z%$Y)nfQ(p6L{}0^D9DfyQS7S;n0sjl2gv0FmLYUo-Bxn0)(Va>-@u+#S6K%*zMFet z49FsXgaFN%l*+z<{We*3%nH<{>*M6bwV-U0Ox$W>q)^Vu&c@ytT_iXRR|jf$=>gRg zu5Or{^g+$yK=#}tRzuPMyLFQEM5N$g99j#MZ(U5AxLQzwlneT*&MP0eg8=|H-~987 zjd<@!=_)jWHXZKyB&H0AzErVFuUX7wFizC0!`Se<^j*TdaJa4$_~hQ+y%#d;gr~BL z(7^Aob?b|u49mo`CW!^26d|UXi9F098*_4!QPQT`@e|e151&EEHmF7>V_+YHVvu;D zD3cqZaZq@GYN#EyY&wYdNF#{Cl~BYc*``f<5p)XK6sG}G;od z&+)!!Krnw=em(#I7yu$7qU=+j1o=59(VKgeQFY*}IMnU}06YiU@+Uue*%mFDZvXt1 z8}N9eAG-;Zen};%<7*t~dNBY90PxgPM~F$cz`pQ>x&8Hem5;rOoL&AB#o#%c-)cMX z8ccu^Wd6MIY^vj(=VcACYES1D6C=3-+TKaT`pTruR9pJfKR1kB!d~rozg_-GS94Z< zDG0+y7s|9_jw*KEoN);GDbA4KI!vI0Nu^Q4bsINtC1!1ct-f|T#u!j>UZw^;3`L;~ zNW|D#zizWl!@xdo_7vs|DTdUpA#S|vKb((3>4F0QjLC?^=!92=V9oFJ(9G%%|DEZs zzdM1>?Hz8p#K}Hz2zoAzP7^11$nZEkH{>-sT*x+ATiqDrGgH4(qPx;(!`Z0U*%4x} ziz-Im|H(;mP4H$vuZ7%Kop_fHKl$-i6MFTp|MG5PQzv6+X2Ej} zb@?ng#F#^sh1!85P4Zg>0Jt!c4ZZ|CCqQcM3djon8tB)a((uNz zU&op!btnIrONN7ltU;c5b?X^>ZO37ZT{Bzn0%IPknc zA06l}-cRZWI!8A2u2^k~gW7?xEkHm;Wesyt8RxrLLxuqYU_;M(nS=*(6rjmaXzRK_ z_t)3e^QSni#M%U=tGPHSArUZL3PuctJy1+J#j(a%rT*n+bY($Gbv9Mdmet}N)Yd_q z-?D1xSi9H^kSSz{Pz)Z5mn`ab#ZivKYd~IEs;_-ejJ~>Um)(5h0-H1;#ig$$sG+gf z_8ma+3;^J|)pIb;ivd8j3x)03RzRIwY}z!|#<}CkXH-C@<9F(y36R>Zy=Mb{W`9p`TZ%peQ^o5)uGBP+l3DJE3zcK&w6ikI5|RA&R*`ce;a4 zsHBD*{$qxme2ZU5R8LU|fELi?<>alEev*RRE>;2oJkA%DvF3-_==21O$E!-l6#q~g z_UCKhwEy$fzq@?s@<2IB7zbM`!|+y(At@e3YaD$_j}{X~ZGDT&cLIGP93YJV-J$z39*qDuCAwuj1JXc0=&Ci+}Mg102XC;-z)$C;HAp~050j+myAWN58hm(4|qT@&fOZ%*y+Z? zA_b1TIOL(``jqZR&J6T)H-Pkc81t_K0q~onD%3TsOG;n+5AU<)zQOgcg=rO6mz6-Ka{J!cvE4NS^z-WKaz6S|-d7#{@uAabIm;@RHDq}2?|i}Tvi{6TdJ zP!lSIIW>bALPON>?=;z>Ez3V%E4o$cA2w{$YUXdKq(FgpUzZ zLwrmm&xCP6dj-jQgNDoNn_wUx+V3emPE}103>x{CU(`-$$0_I>Vjb{b_bRD|#tQ%p z&)BKlIvh#H1LTJ>kH~=Du)>QC>fT@d`c(jSwYGA_JY*RR`=VTR7xbfa@BD~AE#;oTTjOJO#;6%W7!jEI5sxGDc^2Q#6~czO|71O34Nnv5ry3b5-WDw!4I9b`OBmj3 z5kVKAV~sJ?F%}BCK&se|MrhAbu(x(3+O~a-wr<-=i^d7+fluCQ*DPlaz0`Q-Dm;*J z((wv3P|rFw^w2t_9zhMcHCv3Uj7>lc=U_yX@l{~cF({K`V>M@by+ZD9aoZjiR2`P}+m*aLAXzKMeis9>RO@J4Tc2Y^YD9NkTGCC} z$P+N14YTZ=H1x9NR*gq}bPVGzDu!$EqHZo@3|;_G3TP&RISMdBax&hdAu-O|x}XRz z$liGBG#je>X!eVEZno7jZ{z?Bnn5VpN_+0v^)@;q$8NlBicOzQxYJRpgCOdz0LuLH zq?cm%ePp6dl@5S5Q2V2ZkUOInClk;|>gzh~hu=Q}*rOC({RI9501%MCyLBKP z|5n$-NC3HpCF|LziX8x8bWXSf0L%dZpgFj|ZW*sKmYxAn^qqg-Y6bZbcJKYO?Y2A9 zumyNb0p9+1px+AE-hk7_fxWT;9JeD!31LUbg}$IrYXfN1jlOOaYw^OHvu*nFQ5F$1 zjIb(nTIP5GycAkQ^SxqkYiSKaKg#rop%6d-=S2tIOTjK6f5~}DZLF1 z^`;oLn|EG%F}0x!1(v}4$iU~Ud?Ko_j3t-v15%1$k7!LvKDy#i7EP~(fJhD>EV8`Q^~~RmI8v}~uwS1%n|W->WQ@hI zM8Y7bFlgWh`HcL=o`W5b1L`O-0idye##c6|SS8#^k^8NZhR z0!U?!4si^xq~rZ}4wu-e!v)N3HFoRui(sG}53mGJ{@hbGc6Pcg zScT&#AvF5fZ)<#s#$M%ApVG5J5PI|&F&UoRM<|_*B{m$Eh?TcZuqiM>m7Z(0t!qzN zMagNq_pVho1*e;$f+FU?7MOKL!B7iu64t}E7J$!y=}r?0=#W@w_Mas*WfcsNTK7i+ zKufc6lQSH%!*Bo)>|&W$W&FRuJgPPfCx7In6Q>CrUrWwcbAPQBoh#$nHM9W?`RU2% zL^Ev61VUqB4~mGzLqA$|sER?Nq+o78tVKxGs5;e0>Q{^q+G{x$UeXGp9uebpk-LvK zck}~YT$;LGNwJ1-t?u{0^#ah)e>v#@OnM9#y0%j))UBG(<%?&l9|-{P=r{iY+x}<^ zTDbA9&R?{2aUn+j1-fM8T-g8DiGBfY4{}Z9ijb#(pYY_RlAcS*~$t14sL{ zabvOl=tui8{!5t>#%8X;KKQ{&c;8NE0~P|E{}DTR@-T6@=h|QW)ncc3mSWWtHoRI^ zS`uO^D|?8^cFuXZj38$B=Rd!ONpqyT$N>P{C)L@Tw~$bXUBt}Uzwd&5|A)^KU$oUe z`q3pUa+5p&fRcFgWL$@KkL`bS=Nxbxbc9J1k}9vPGeO>#og6|y1Nv~dfxVdJ5oACKaX4$3xLis%+7Soa?(!f4Qh*TGnu zHZhqFjCaXztMWD5UEz=@-Nh#V0C7VPA30CHA^_baU_6PlF`0=_4WXDoE#Q_wtxVLt z>lEazqidM$-k0yFW2Qq5J#E@(yfwV?yC+`V(7Hm--ri}~x79|JxuX0c^Ti%0+c!HV zhrj;cA3$(JX>_69Z6>bt1cAQ#E`~E71rgKwl>G+?=XgA5zwyo6LAOG`2!)M~-&XTn zDIb4m=OuWvhTBm#F+cwPRx8SDvCsY4?RMJ-(;Q0B87Uceu8rAz)S+zJ33@8(jbV*0(+l-K^600RYOBM%Ihh zm`hlqIN__j_Ce6|s!jc2pif-6lDsjl4yozHZ8RA0H8pGscb$O^;4E``sm&x5#Dkw) zWXo1$K}9LWl9%>X&)tKwqWN{mTs`OZ{_`Nw+j({bfP>h$7`*ut-6lifdybuKaO?HWH!Wb@OomcjYjhBs z*lydi@2vBVyJ5}zKnMWpmhr3*0M9)03hXgy(Axq4Ku(mb;>W(HU8i@U|BKKrzmX004wzR2c(xTzr(g zX9kz=?LPDM_o+X)eon=!ugSBrgfJVmP)UnkI~soW9z0g6U{O$b3K`j=Fzlp=!6F(@ zN!q>#gMSPCvaY^~yi2K|`Bv{Ft)_JcNe$cexzP%q_wC7O4Fzyfo^r_#Rw#OeoY0aIXHhJzO%LZs0#$0w0@2mIR z;rCfLk1}iHeb`XbX6ql@Zjs%gcIOQZ9xbuQm=?#pnKJ^$9b#E~Ygqqe^uDQT4K2-$0ui+U5Ui+avU=o@NJ0i_58s19 zzPz#ynR>WoLD8KYBLF4+UH7>z==aBgD$#lUE;fx8`gA?9uxnvHY6FNU&m%oi^R>o@ zlgAPIM8T^4buUIDIqD}9vosYWTnwy3A)=4fSmXE0A6_2({HTThKYQ;1nB{ez{oe?I z252%QF(t%aVsEo;hQW3m+p(Q^Wsf##(td5f_RDPh{r_!}rcGMMPLsH?aT4#z-g``5iI@V2QAB{W7zir3U3 z2zf!fZQWUHZ@hiXRxBG~OBM}>=aF(Qz;n74#iNy!Y=xkZK7$utVPTGag+nWf951*)TYtGb^LGVGz z@LQ1<-W#OB78Jq!1+(|JAan`GIAwiw3ynCg6QuVTllSYC#Q1jnj}`JC4P5iTUjMFqb&IO3zdAy8{p`O_+N;m5w^4&Zg-o7g7x3$v`)~n}j>*iA!54797c~d}J zonXU;2D3(}p3H4mFP+cy!KExW$)fuvkjFFhl*n*KA~fkJO_a%v%sT)`kA{Zu)M ze!~6s?u(&Bg-w|@#1@0}mz`a1+qY*B#oe(9_QvbyY|qZKR$9~qqEc^1_feA)ZNc4RENMz4 zgOdA&)X4e_KFUaSJ~)q zj_=O2AQXmo-aXoGUp0(ArM_A!-S`t7R8Cg|T#>&IFRB?$absEU;xjAC2$gd73ZDLz zb`fvh^B0P(w5rM?KujAxGR~66CfH!Y9`t35_Qden={?jm(M>!lAEoTmVjvp2pJeC( zt))QIJyO&<{*%u_Kh$pwlYstHXtnHVI9OGpFDj(`)5wG?@Yb9>mN3mLhk-6K*y1s6 zaSCEb*6y@*ty0T=!_+;m-!KdRv2InNsTy{yJ;X;pQ;mKs-S+Ix#@M3XCQXR5#q6I` zC&w5z6;Ao?g?fTE4za?|@V&oxZ;iKFvEJe3T?K;T=?oAK59WeEgi|C)4@rcyz5R~S z?BydYk=W{zOG{Vj)(O4eOj4Tz>#iFN{xgAVT8qU43o<_aR4Fpd3zkNl_-YXM`bNU< zfu0qHkzsUf2*@9OEjA(Af+IbJyT+3nVT>0+zH9I*oQG4~Gj}=Z0O8+iXAc$Fp|>tz zfK>tdN4zZp{bTsJe%9naPaS*E8TykFxl`+a78uo?B)(k+LY=JXS1g`l;^qf2x~C|4=0^{WtLujhW2YrlBy4Vye0!|9b%tlwbC80bqCKs~jl zs3rQZFeFZy%sQsIpg(WYP!ZLKwWpU}L9{q{r*{>My0 z9){7sj3kt_hcMH5*V@fmOZ$NZWdClrf=d;4_E@Q9q-R+rvX@}wdjki@;^{xgMo$=I zLq-fBZz!i~Lz)g44ehyZSn5SQuIoRQ;4vV&*TMHgNT}=D-pM(jYgnp$`umz8&7~l% z^BNZ%o?T6O01~?KpuP})qt5a41++t7Nh(i$rdEnyP^&Xe?6+U|1^`d}sHQUth?K|} zEEo_JX!B4b>S{WG=B)y*{tVDJWykgn-G*T+8g=yHU;QT8mbk*80kaql#sRwr}dX-27k5+i_%2!#9F zij{MLf{C?r=Zb-qKgfn(#X>b5h4wfY{ZNMhP+XL6_cI|L`B)0|^5~-lw*m{n|NigG z_S0u}VlgQQiYDS%jIf6vo(SY(s6D$b%`!7F0Qm3>`_dQZxyAQ-0|1dgonJ;?Z@!&x zKPCQmczC`2{ok*&MGF%&N4c#rRVXBV4JqkZA?3vKP%Q3#K_4XAgkCV6Vosoig{KacUp zn+W;)1L^+=kaQg6m;nrBZ$fY{)5YB{1AukUpSBl&dCYFd0N`t1TSR|TF7?v=zpbQ+ z38Jx`OfR1l$)dDX!2?8#iV+F^DHR3w~@>-H>U7F+Fx7*Un_-SuzmI zi{_0+5brO*H)!N7yriXBOJi9@3ksG?mX(c#AMF+l^NgvP(x3J#tl$G1F_z@WtC?qvl_w6GFRyrOXGwtKd z*YMD0T3r8Y$8{$bg{|#ST&D%F^AZPSkG#s>}pKchj*&d|6IRG z3TUqA@8bDt`{`4AfhfwgM;>2p4g1GWV48>EnZr$rPXYO$O);~T5)5|(3 z#-nSYRGCU%Sz3>?K-l=+zsLaKEMw>^cJD*cPQh}$0e~!0H*Gl19`HI|FGKCy-~Kql z64nzuv~^(flHUE#flGhlZ|YOg`CH#uZ?B@rnx3-2?)lIJOH3lJsyrZ}o%%Fp(+W36BO3iMM{lY3&6w*VYn@ z(5e(8)@lw~rJxBA^A+Yi7GYF824DSRP=fGTF>jDFhC&#lwbr< z#9^(JgG4p))g4cd!fJTpDB=Nk+Szj%wr2HA5CAZo!_z=itf*|m`|J{ewn7j9rh`Nf zN&f7(JS@+-*IwI-v0?(=ZOI73J)>LENOQfep%XzWNXU z6NWn4D_?K@QEBfdsf~hHtFCRr*s$EN17Lipk0exWwcNa7LKB7Aa8L=N;A0$L9cbnI zDfjwkeR_FgTL=JnITEM6xV#EMX#~b35h(W?iD3zP1>?Mp0k7~A0~x0ppXw@kfXEH-%&m&a?$&rp;3iLCC{7JUD+3_{0{|f|#2~O>RdxAX)7`E^H5fGSpu4L$ z_xS_t`iA_Wes_WuHBozMPXvf{_R34=Z1c8E^hHrN3W`O*mCD(UUnsJ~$ z6aqkXS%YnTaliGf>$J7YC)jjgjy)p~uZMM?_jfam)iYP0(^z!;h^}(kc`z`#gbtu- zD^x8hHJvd42#91Y z9f8MZzrIp}sK?l>|HzV?TC_=fT_c7PSCA7Gmeqr5)z=1dh7ZEqM_~b45U>sb5iSl- z&JYYIymeK?5YfDmsc%X$kdXphv55;%qLp&CY{TOyh}caXOaPleWWNmU0TO0P`Kb^a z5f~q~aLAKmh74z9)EELfz(5oq17gBJd6C?XIi+*!J0^dP*Zji(07d)DuV-=&hky9+ z1e-S}f&J#H_iaYT72B{ejrO)7%bIBm=f{C~pz)!7RfZ*<_KRO0$GbTXPvwaY0U#O# z0C7N9+Y15!!rXm8>c8^ZAzJ{7z_LY&@M{sYzc20Z!vd6V#d z9cjaofDevhZ{%#>fpKSjaWP(Eb>4i4iK0Jvo;|e#^WL$qf%zt z=e{({CQb_=;dMz?{bqV=)Q$R?JGzqAOSQ2TkMW|S8as0~7YCs$7*$7rzA(y?5Kzm2 zRO_Ojx_$I7{qenf8;RIcXip#Gy_}s@i_-LpUAPFGcVh#gtOg*WbK=3FV~#%-}}fKyP5D+xhs%x4oCmV=#p!y36OI(;y z8Br@%egD{jmY6sUl#CjSB`nOMMWaBa>WeI>k~2sq%9L^xC81VZZ6IcqIply5ge6$G zWD0W*gslP))pdzIAiH2&s$VPe++Lh z3a%jpN6%IirJ#)lMOrmpzr%+OCIrBEn+w_owmDrJdiVLz)d_(Q;zh)Jl$R0$;7QO5 zUoWzcf+FA{07#w=fo{;BQpczRwAab#=%rs=wCA271i+|1_Q(_CZQ6|M4FIHoHsIw! z0QlZ6&>F&l)lacCG5`<)fa>Ea>Zs2bZxF#JR&oc4+%?WVQ9~Jh^yzyhX+`UXT@dJA!I|10tzSA5an%HFIUSqj6dX zOnot^6vqgSw`J=Q`k};vdWYJ8L4%3kon*=5hBKY0HRZNSv_*^;W0P}HZpI8sM1Wkc*y-%rtht8-S5`ZdR{Vm0wLk3 z7mbl`4?B(r_s(5HBDw&=WvI=ZJrM_#v3P&S;8Z}k6&Z!mKfi9Ba9QicE2Qgd*9V8z zpt8Lg!F1)!-D#x-K-!+NRAmb^aV%aQj$`jAxwUe(n_glp_NG$3;?>dO{6Q=_=cu{kmukwfNk? zew}`>$acSd!Wt{9ZPoGx$gxLT%zz+!1EhmDUcO|p!}{4Al=ulF(RDe5SE{6kS+~3? za@A-&s5O{S0_~uepldpCnNZo`HvdkHyoZL{@f~?~hENrYmk+d$e|C!XA3#`6s;D)h zq7*~td_p%}D6zvwvh6tYv9lAypbeM7=tp_%E2&S#H#oYA2I^8-YU^EJMGzY0COG^WiEux=eB--fFw)Q5J&h#!6Zf|b}nkj<#@AGZutOPn&RF?v>2VOz-#1}h- zW$szL-DjbUPq8D13+(mRH#kM@XFj{o=FS`HtR!E0DIEdqB?n1+`wHS|jE*Iq(M1dh zcA-#=!7FQt#SI#OH`YN6DK6ULh2!lLpO|S$N#bru^ts}rrKPpoKmOy(SYFk;L-)8b z(J(Pn8E}K_)z?yiPdaRC*G#p){$I;nm;$W@fidCb11U713W0EW`PECd?&pVXL}EB0 z0Pe7q$?S+E&r?q{yP5vcI3PZ5V-RQu<@Tee-^L=U${v4Wp*@I&Q8ZTIuCKkB>+*lc zm#f|6ZqXdj7;EAn{mLtN8~^Jbyv3sIi(j0NGJY5bQ0nIoA1!_^`4<9TyS+&nQh^YD z%hrqb)DJfzOpitB^q@_i#9{gx0{|}%WK(#&H{vCI#$J3e)mE;YWMBP1bMeB`?<{E7 z5Vl)Ex8S1|PZEH{KTO^nLZ`SMxvN^aQI@RpotSSQ&dJ~J`m(5 zZN`i#Kno9Yo{*}Wm#8B(QXBJGG`DQt<2-{FFPv#36Ql9MR3m{8B{ttFjAf1;KhK;B z!z&;K0VSKCzbgLbP2x$vE;r7^ZSWAfqca59sA@ZT>M}ybawpuHFm4brk5I@E6HYsU zSZ(Fz7;YB#f}(2Mx%U*1MEzO&Mx)eGd}9sQYkL8by5!d9z~|rAo92@i_Waytd-i8o zK)-a9^`#GJAxmuT>;w$9>#=BKadhM6Ds42*H6Gocg%Z!Pk8RwVWB>B)7g#L%+MoUT zeIS0s;en`0q!#&e<9E@j-xjq#$b5a;UmYu22bD6;mf3$jxy$mi8|=$}`GCz^0*B&Y zJ$VKO!7*Jj06=m0O%MPM9Xf{>HU>67-vXAz1-=rGjnIjX7cc>DG<_MLxz6Qi35`^MKlNsM_x(^6^w=HKFa z+^sf$P#?uBs$c)%n{V4Izeoq7ZI#`5=V**GScxPAmSC0tZrohcva4h7n#)?j+_3T1 z1Mwx=j5L0P{1S{cb2;b{ufKi-{tDz8;_5y4&`eu%H*k*wWc^HcU7O*JzxhK`zq$fd zkOoEfr@P@ZCB#Ul!CS4_L&k!fvJfjSDcaG0yA zLU>bBicvtdRpA9tUPFCo!oBy*wvl+XNN}Y+rn0KT82}U(<`XVwI!gRVXRWU6u9SAz zOD}Ci;57i@_890H0{aJs5*Wv00DyuW-bE-2LNsu4H#Y|1 zaWVGHyin-g`(x}Fjm5mWU-b+N4RRigI;?nyP0?CZ(%<_{;!=YMH6#N7U`$a&42UC^ zDqfE5@EVtMixAd^TjC(%zp;+Gc*@s|#rIpj_dL^x?DA9(a>Mh6xXI zBQVezYNTuEyL65QfjEDKh#^WbgnnM)&j0Iuosq8;>lUw05Th}|E$##%*j|&e4rq+ zV+h^S&?xyy3x-m?EQ&tTUMRyVc_AhyL|CjlCy3tK)Bm`Vw|=Wl@Br{#rBw|exYVO~ z3AG`F!wbcmS2U~zy(J!{K|E*(p(qU;1h5G2sP8`L3)kVRSkv|1gu*$Gy`Z?V6~!i= zW$-RN$*+yYy%|2Fy1JIJFGYV0eFHox&q#S#Q&WdGZ=*x%i^u4oKZrYF2qSsYm2vG0 zed#W!4&Lr6-oFIJ{;PPR9ZAc#58XA+7A+X=LC>r2xicdJ#hnZQO4>0boN0@0i+2bB z;tQ4Xi#iBlxgWHnJQE_|>{-bc8;#J}{d%>%l5rh9j?Cr7eR%Wtw`Gfyajd}rK*m1Z zlE$fc+Y;csfBE7uyLcg!5OhKS5P!zK{FaHb<)xn=wPXA9ZN|j$_R!sl79Cc^+CbQ+ zpm5u`CEqq|zJPH=y{%c5VhiVt#5jdEqp0YK^HL~#YA5?;!?*00Q_-V358S`h?!G_C;)XEB)O@%1y#pOYCVrB^3>okxFxI&KD^L8& zgd#8S{nVd~_0J3Eq&jk4 z*O-qTV8gc}cx!BGW}W64nq3CcZ5A?x?8~JmWE6#nX~>-8#5siMSU1XO|3X+wODR8;WTiVIYU^DHk?JK&KyNZj1D`Ff~1Pj zprK){78ToKQ)eXD?JFkR*zp5#VyY*k0fyt7jyW{8i7EYU$?eFGK`tpOEU?qaInNNP ztf-*bTARW-=fn{nAldF%J;VkN>q|%)lr=gR1bBg8?Kt(X*ZzvKW@1|(2WcP=)R2+( z@W)1hN`PUt4k9;90b25#6#K8elobd8K**0L#@X~4@d5Nze;{!mYj$x-gFW>h2kg}G z4!i4~@wR&HKnws-Lb=LyD=W}fu8;H^+0HhqlE zydA@XMI)>aVU6SjA%kAkQihY>Cx)EcH)ODmqE3q?%AFwKU;s^IUE^*Y3RozmJnAW< zkXD?X@*C{H_H;YW_#B%w+CKfoIW}uPYoQdC8mwKZTm8GPeJ~$rCJJB~e6?UOQI8_7 z9EDykO5i-JX{^BmH_;~IJU3)i0HWD@p50-S77Vo^<0A+wz`YPy`KX^oGRa-_S;l#Kz9h5VHvV#- zQy}jYIodhkn zH*K9ZnNUEphuYZWP{JDaMmdWCfa5tt9L>e+@_d)Cfg;^q-lL3J`b^S*4tSIxc&z5; z5JFJ{n}6VH0dlN_ZFb+VwLZB>HYc zpHW=e!kMwa=|C@?M+U?mUQY;*CY`-8mhFceX%u5}+>~K9cyy$ND6AaMckp|M#+=qM zpz^cNRoUJRX_kAs2xCLeJbglJ*w{FmvwExzPl;tLdE>FG9-Mz93y|KLn(<~G?LLM&ZK&9`aO2HL}qO|n_Y|Gl%3*CL@ioJwu7pZxHI9XfTA5C98o zKF-DwpsxBJ`7%n?Y9nQ}>r3~jw3xkS-Eg``*x=B(DyjA8bP8r${uDQl@Kwog5= z*6v)}*Rpd!#=#-+=z%I5Gh?L9TshpLhlVg(6mUtj)m);#X`a^jz|v*SRfNgL>;BNL zQ#h^F+9bkK&ssW?umMeW5H#B>8TIz~Cui7Q4**BO^VL;N7-ZGi;r(UEyfQ%1E`YAR zZ8(bhaZ^WOG&mIJcI4>PwS~eY`%y#G?Lq!n<6A2WPIXbeWu2+9^wbP1$SSZ-ci|mgqg}U;X>sL;(?6q>bz+?sEUC~EI?oL;yHd3Bv1f+eN3naa%AC-yd zt@XnZn?+CgN zI(h(}G(CbsfVK;U5xR^QeY4%Md=l{1NgRMZrYRN+p8g0ftBB3BYu82FwtcrH4IgBm z`OI2`5<&LbEBjdhG6@$j(;j<#f+Z0vDC3+I$*1wU-)*r22HJ`hw*v#)52eOw+rRG= zmP*s?j+Mz673A9H4XJolN7&~+x4@Pz8{lZAj@MX}2m25HW52!f>Un4V8Xnex(0D3V zlqq;lW!P)4@3N&!#@XMY(3fz8?(hagfW~gYhKb3|YqICor4t4q6-c&`_P_sjF`)}I zTGfTT&@CDO*Z0pgi?(-zyGzhThYz>ee?GYxPqs4q=tpN_)G(d{lg0&O5TT8q^j-bo z4>DbMqo7-U?q0sj;!<&b-+n8{zW2So2&Y0(IL^k{Vkinn_mr2dKVyE)c+#R#QH22j zh8Isiy~&0W3+0>Nyw{QvJ%!UX^-|f~Ur^8jN<^l;{8Acuk>5~ zDhsLxtjcy^&6bm0XcNXH0@XegFKxUnsF#{4VfBeq*>>h!t}U21%f^poe))uS^zaBu zP2X4j)aNn)kk`Uq;zXUlSVA4JdJO9YqdTO1Z@OOFMayGV6)o zHwmRXF;{>#WJbKNcKP*q=Sr%EsF4^yj6xWKkqHGkOSV9PYQO%}JMXWD0vW!`o5qdc@^)Yu z_w4gAz(GDCugA#u+-uz45Ax@lu+oxS_SNlqHR*K^FZ=JR$zrP!Z%MknQ z=U3Q+j|^ozvtKj+ZxxNeP@ep-H>j7{nuY0_z1ONl(ELPZD$!vX%3ciI^LIS?;T_FZ%ed+SmBC&^ozQh@pYg4 zV!gun(TybDuiwpdWB1(nuDWTgF=o{?jUOfP5~Umni>?S#y$S&hkbs1C>dAe5u-Y9n zdITY$5E20UukkKagHqtva|tU@iomzJss_WfP>UNd2#<*n%Y#>IsILP>K+x0}1RxNW zM{B=+v6eh?7;(SYkJ*qrnV`kM(j7Q*4v+n6_~B{9>I8iN!N00@rMLyuy<;VE|~f;`lJZbLHmsY^ikrE(aY!CsY!5?HkokFNCuGWwah+Va!8 zCOxD)NQ@Wtk6V{G4auWDk1zxkl{F6jKOR{7-p(k5u>(&<7g^@TGONVPU55+B*7O8b zoz6Rba6EAn6{nGG-Qm_RM`it{$!jF71GX8(j3BUUiLX2$jzcl<*X^vW*@Pts1};Al zNVnJsz<>R6)y%Fj+I<}UW|eW|^63TLYY`gfK(8_s`Z2MBSPel4dc_h35}z0(qC$A> zN)$igeSy|SVIjV>vb@H5i}ptu7lOBRo8m%q_7Q4;5Ef(rFa!&A!A_Q!V$g_UF9D%M zLOkA7f&x_cxjL|TxIXvW73fo44P5GK`ft|U-@B*WSZ6%Ae+Uf3*#YEXn>Sqoc`end z8$)a^=eh(uFeOm!6atOzc4O$e=3FJ$bw7MSUjv<`z1~v{5ayt=*>=2g$T~qGxpUb# zn=yF+AyWLk-XGk0@ZB2I{rB#l{kF0OcoW4NVE$+2>~3ezcTx&npgjJ3A(As(!8=jw zYb#2Ib}BiMin6)_CBant$iw3-eh9J&x>UvK z@oQ7}I{)gg*WUZb{!QZ<8i))5vdI3TmHobfvv?H{^tH91ir|qhZ)olPt!PGC5MV|V z>s|`hRus^2$Ws#d)48a;3Wo(4gLq^oLL2eiX}Z(=kASAoOY4R|y4odhiHyW8*R~*Mf-a@D;1+p~16z_A2(fTh#E_sZ# zA|$NGs7^djAB?`V4`}t$+^NEYx03y%wW-niBA*&WxS0MJAM}>->@`UzYAH9oxhk2H z&T}eXMv8B&N7l9LjICWg##Y`whVn7Mr5v@m5O3riJI^4#eJth&vX&X2XmnoO1!6s_=8 z&pdksL;YY|FelEI%!{(VCU= z#XSm zb5>l_lTZ>X?6##qGlTLVrE??bVn_Ek*e`yz-!7fcMea0?@Vb-mpzn*Em$f6Hq>x#U zW~{${YmDd&*zCfEcp-R7P+Xh_D*NoYEEE8>7}(*!#o8gBJSaE>K5_sEVF@;JR3h@L zcwp;8EjHFbn$mdhK*3jLFTc1K1Di5r3PF|v8s?Ja6K(v&{)~C%9?MW3P9|HJ$6L37 zP+C>w9OtxehY~*HwnY{=oVz#HkI1Xewu*+d57KiP_oUyF)&n$ zb&Vg#yCC0Sfhw^IHK>-1~PG zvz}c90kViStI~o%zg=|aZ8jaa_3#*aU1xccE1qZEx+?{s{$UhGb1gq4b=8``zCVp zCnvJJ!WQI1dA4=qNlQ!3MsXEv<5MQv%mwIQ#^8mH2X0$Wkcen#XMk2xDnb1@vEAj@Tr32uD^m&@%BtRy!!~@WrA^L9B21@c#Mso5al_TQY{U|-<#wJ)V(%= z3xP_i4uUB5>Y)C0ee9~|R$On*)dZx4>hcC+%U6|w0(GU+P8=^F zTzD3;r%KBQ0kI0*P5kh|Kksl^LjMHx zKxG({7TEMvi73cNvF=O0MdN9RhO&4K-vFSE3(f$5cDvIY_0rmBgfy1t`i0a|+y3ft zYpE~Bv2`qA!zbG4u`=YMu@JPOz6~R_8p6#Uw1cVWF~&`@)%VY~u`^;gbZI{c^cQ7H zKBD!}4F{fejz!Qwj$uBPWSkwWP&SlbkXesm!x`3@Q+D_2`8W?w1i7J>uqtePINsP56cTB}-ZVe<@f zXxPZa2?n73v_0e6p97?^lmHa}T<&YJS6<(XlKl$a`y*`0;>k9G_~++ff?fm8sR?c1tMCgDVgv0Un;Df6;tb`DXU?-bcldZXH znqx9{0KucU>Yx719J^x$3LeO#e%1tT;UIbBSREFO2N3$^Va3sk2RqEg+7#NC2MWMe zEU?GfSHHRz1uYNpU;U#z^rtUcobvNqvB*AaFTI>foRlQ{+rL?eMJEH7jZRR0vK-NK z>Py#8EKJVZQ-clVjLXYi^A?&01eIyW+wAEd?ZxP$3T62u4rC+nSYsg|qsU0?Tp9d2 zylCNd9s^hfXpnn-b+vvf)+Gv2U1b%%d2^wC=i7T-xqpsT;_5qxdk6r!(N)HK3KXf#0#tX5oQza9ZamIn++uUEU`)gdP|&mL7@=^~v5A~Km1XBL@@(rkzbcXCsq`0TDQwOGXp~MrtU?(_$G`BQ6!NjBq zNx%y+7Eu()s*vR!#=p(>>^o%T)fE^HO|!9MhB+k%IZ>(i*AMU7DiuMZx?V|v?{3WS zxf&+zCqF)DKVNsy`o~1uXFj>e?z(dr73c8hs>TTHHindm6U4d<**IE5?J)3U-^Lgx zBQx6`dT@^Y)nCm=Iic9BD$FlXnYj#Ao&QPig#z742t6g}^7_DR-<~Xc>fg5mK^bg+ z|J6rq+8nqs4m93gN+Iem=4lmP*#Gd2mu%mD3;-Tq1OmVk7XmCfIy%-ke*pm`?)0L?$utqAz5pRY?LUh-@9z(;PgFB5aAH^K|8XIIO+ zN(ATG2LqIyRbv14?Txl`^LhLK|M_beG{6Xl(+qDglDC(?XmALaryqWQyY)u-`rUv1 zn8hfLr_c#pqq#u~vi|-jbx}Zjp7@_#JBsZ8eseu2ACW*F&LxH;u!ZU$kxNXwo44Hu z9_zVFqQAzM#t1KN&-Z?Dk2;$3-F@L8f{ zU|7Nj?-5TCppmEy0@vK9>t9s3chB{|+|+j-_gkm?b(XKgi&4<-necg~^3q3<8WDk4 zI`QWRAplF{KrsL-UU{6?;=zCZLN%dN@)0(d*_q>)E%#CpLIL8$YQoWIwOz{oFpNnD zB@DEo?AI|UKqgO0CIrGjJ950lu2kgOefOsjN(yfQ4qM`+a`Wm47jq6zy-EzS=Ce=s zbv%*|beHqmF#y<1xSc`li6g0xCjeF(bSS6+?(i^i=l1SBWRE_w0vP7U2y2tZK~`=xduWs67u&FqZWn#Y zB8&rMTt7V36NvMR7l-W6H8yWW(mt;}zPh#&pbIPk?*1K zr=>tj*K)|~?Lu1!uDb%`7OmF_aRWGSp&%toh0!Vk(zOcjQyIJrAKKrdfN-v?sDO_{ zS%=^?CPo(PI-rt?YlmoiYv_Bk?f<>FPfd1x>dk45-`t#5d+CJ>7(E`gFraYfE?Hzz z@mTQ(6UUEntHn`#ljEHjM{X4SUXo6AV|G$E?Xk5Lz<0iM&^l2pu30w0830Hz=Osr7 z5raQ{elHF3@4Y%7{3~AG-CwWX<9!Nz7aiR~=AE}>aMp?yvOJ+%Kp<Mu590rVgIFcVhax=1kFO$Tc9`{KjLl=6n^6xU9%VI7K-rRcny5_G6?)| zgQn;|`BtNjOYQN!@M z!NJ(%T#M`?zpRO~Am>F;RuoRC0b`Z|Ji0Ndx51$3^@|F(5O{c<58Zed(fQo9w=uqT zUGj)BLTwge0MHCtMr35D3r*Cs7yBo_YwdCGJTJkxI#2Ul&()#es{%!)6UB8r3hsE6 z>LI{t>jr0(uIH%%+a5?oARoaXh2d-whGC8RS^Upi8!p(cz31$%)#GuB8Owg*!N#h( zmBe4)vk&Oqa}_pr>}Wy&04p2o)mwFt0mQnWrz1QqCIrA3n>2BdGcC8|gA@7Db~7xlof5~b=d4q`}r$?lT@z;u+57yuOJwgc6D z+IDX_iV;eX-Ff>I!W$*9_cicLh`oVv>UQL8Q&Z;H1C-M*EDyy@ruC?+!vhTDp%F>e z3xm6c%1Xv~ZwntfggrLMn#;@Z#%s3T@QFcK&^2Qm&|HJ(bY7divWXblnbmgxBU9|Y zkEXcT=Hh9bVzFEG)zqsk(GOnZ#r=p!62Ea7_}|nt6twL1i9-kAXo2z{rwH+O-dMXn z59RYgra%Y!m2+*8Vt|(Fk0jli8{hh@OZp2C<5y|IZ`UP%K4||c15x6?e{>j`>_H2S zjI(8gA)GR62y!IG;l>M=y8k3jRk8N@FRUVVJO(kW{fIJMdEQvMF7x;GRkhbD$waxX zXC;6aq}VS^X1Ha8gt=qi5eo_ru?HSq zW7B4ayLnhp&~Dqe6xjw))e0`xGRBkenw-F%7R%Zz9vGgDMmZ!h#;9r|S*ywwG!H3OOZ z!F}nr7scMi%q#G(L7XWE*xUt^2(gQzaeN<(>4$?-1j-K9Ms>Pd-Qah$78VuN;+da{ ztfScOePFmf{K#m$8>5+98lYFZQ1el=)CtB*9um=;uhEY`$pEppCk_&$;V}k*P9{0I z60ek@Ib2Hk;Gg^`)pl<$$B{1)Pwx?yh<-saxvxon_SanWriQ!ZI#g>T`iry*dw$&! z+eLWM#KaU^@!$*_JPxA*g(9UdgJAZB#Menfd(i*li+a#5d5U(xFSTQYC%(^fupnaz z2>36aKM19^6oj=nNFLdqXL~?{6g7J2V4MMRxd+|h!BgW!w%`VG*9faPIg4ikHSwmg3ITLAZ za(p`iIvIy+9}lXf zE=-9oxU(16=x4{r=r>*Omi%o-x5_hHN={{>oWyr^_7K8dxLwGuMF(-tw(dL&8bC99 z!5Ey8=b)d8cZju`iONd`G@3su$EUjg?dr8|pZMtH65KCi8a?Yj=c>t^(t715$!fHQ zUICeP>z4DN)*J&Nr5J;h5ab}y=*jvyL?@x3Ddb=c$WaXq?VvHXzypl{u0I(Bm0~+_ z=8~n{F~nwKP!tvpgd~|Nw1=C|8n-G?djR!u%4Ybuo|G-*bJaoPUI=R~tk0?Yvg{yE zm*LF$wX3JwT^|}{!$z=PKubn1MpvM^zI+~3@Aa%F7)h>~XSc1!DFW0gIsB@xgXClk zf8W)5_mO*IiE37k(9d$NpVxmo-J%RmfF#9?BQ`!i~g5h9KJ`jNQNt=$& zuG*iq_G-LoEfy`bFgQd7J_o6R8oVmfd)oD@3_{w~anjB5CxK3DIPLE4{G(OcSop}A%6}H>Cqxp6OnPUk^)k6s%v0y_FGWqQ!D4~r)kUAGGw%fDMrvXoUhz<~p&~O``I2a)$P_WKZy~#n_ z9XXomy#M2fXLtYo%ZN)J>%7Mf9L}*#94HD3iY;lxFk&E01&%Aq-g+w)X#Ol9?{6nI z{Se?|@veVvKi>S8Y{eZT?Bh?&jKMnVis<9aD(W5s){tO^&GeK481tV7tqtd|Q+8d!_9~QRWKvcyc zoL*|fhIz^Xb+pQ02)QyCw{A1&8VMS`fiEgss12LhP-Fnmt5>i?09d&as9Mp*-P`Q} zW&RFHmb5uQjlA%}X^bDLi5VRb)}7{zhS zDHRC)+#d?_)*jq{+R7@*Z0S<0l`)u+fclz5y|iEnQJ{$p@9?4XjOjB@urYenP!uU~ zZZpq3pJQ2B7u-R3{+x+0vcy&7@T24(46n)eR(xSm_Q!2QqdgO2$Hgph>yzM~tT?PiI)W%I5VN)h2A;7?pf%?49F1WcCxv>$L7XA}n zx41Rz!i9F?r@v*#QxULW4f*lM=3%9&1z$=7dakRIfrnfknhywtv8*h-(q_MW`HcPK znWHus7`DItn^nvsFAkgLv{$m;yE4+3|4HwK0wTRqU;<0frL{VIpZ~VSLVHHp z*S_(nrOYCh5Qh!tJ*OKWyE6bN?X+)w^ChgJ&)TC;$N*rmQ}|wM0H6nyw3pMzOsBWs z^g;mCRs|6PV3|Gg@sT%W0MHCWxShky(@$@<`3pwbSN?LfgM)WM7q5_OUftSHI|~cz z?D?Oi+Ot324id#@?4uu#Cq}QwD7l(BKEqoN(_r4d|GiCi`FyGU#g`wmd+r|s14@%M z)RdvW@Lf~VpY|6WLNuKA>@2c>`ucjSuL*boYt5_vSt8xVuMtqXa;m2zM^P=bS{~U1MWYqKK6k56?4@SgYfJcK3Jz zf6Y)0l)P8>@wfgW+DMrpXtpY1lU=x2XqE6ZxjDHQbT-0k1mP(?n7>36PcXv75K75-@e247zO}C0#KIDP|(rS>)9>?02qE50L0^6Cox{te3NOhJpmpT&+baZxyS(p2)3#=dg`UIXqbxQGI*CZ#iuY^u zp58@B^3l;!@vn0WKq#ngM2I+mLtVI|a}FpFD#|ke=oK&kP}zD`^x|EOeBUEj$6GZ? zd18=2?7tig0ID!d2=5btu(QFUF*Y1NWB~N(iQ)xB3!o?~xi1unt-PU|@bnA@Vy+K@ z;ww-$}*obk{fJB^Wy%ALRbYW=V5P8N80Upw`zn`SLI!5K~ zR7pJF4eNGW3^9lATQkijjEX?v#n_|rt_|+>Dkapc-*wV{;w9ciV7wUQ{n3aKfYw~C z;R+dGoJAEfWB;+UcI4DqOB@wxk32rZ7B2;^oV8YRC_i~Q`kj5_tL`4%qGH_}uWr8U ze*GHwL0^^J1KvkJ=Wdt0AKvLz`TFS{A9}|h{3mbzy<2haA+pvb|4-M%N46p?XaLr^ zp|P3s11ltg0L8%#VVwy@z994)d6^es&{cxbR^OO73)v>B zEl?r1uqmqR2c8`Lu5B2*8oUoYZbh?QfnNw`jg1?KU=t*n(ux}5%2%Vf>f?;sB0ysi z6u3G-&s{UN-1ujVGtLVLCs2q%K@dh4vHc>Dvv}U|y2Tmo!OKbMDqh|@7b`D(?l`;) z0j3$_85trBiR)v1nCEb7t}K1(K=YvR1o?QW)ngPEOkYdk9HD)rcN8+G%b+}7w0qW$ z2jU+^hdlUsTvM{Pw$&K`oJN*4W(;w^=M5%gAA2g}TKlT_nCG6~LA~m1>5^$E-iPqK zuQc;|Pg9_}hPbmB3hdr<*&ZTp_L4<|;FEmhK(DU4+v9&gCa7((*WNg7r%s-NcUpsT zw4XC5+`YX3nC?^{t&45Zta#!P6Bjl<7G$4B+r0ghZP=7XtnyC#(Ap2#{cA>9d_=W1 zSKv@nfuWya1wojn+LlHaVkapXl)wJ{k$Vt&r=iiJLE8yM`CnUIUIR5^>?x@)^;e3*<3a}U;2Rq7aF0T6M67z8!2C0VyO~G)^`Sde z+;81pl%Ja)yq`*KvuB<@Wa$?!+gOy(vlfm6?myI%+2Iwq`Sqh#S$4rb`{@tas=F9# z2ufG5ZiInV zV5HYUzX}o>QIS(PN#?5h1~Vq)iK;M5QckPEAVORA={no?dMbugr|s@lbM3*8O|dZ( z`&e(y-2iW_26%hbdv3}*JRoW-`S0F0kMe;|(IvHk@qXfXHOO42?GWK6vU2KacW)ax zF3D!yhOBu~l=Vi&pqSel$I>yVu08RZmcq1+Nz#FCL$Kl=jJC#@#4gwbIpoj0bOr!u z2X$nuWKN&hjnP=zK1(Fj^FyE}FIqC(`Udnp-CFDu;`jF*(ujUinu--KE^fzRr`*=R zo$h4%Ee*w>7{}Y)peQd}oD6TkdfW*TKxeb-P_?z|{N(zdu?l0+WdNXcK;QYNUeLXK zz%ov z@um?zDIY^EkP&nrTwqUxnmvOtB4LaT#b9FXJ>x)y9ASs{loQsX*ru&cwrO`HItO)T zu2am(@JEF>zKDjXIx<@6WSmPmEJGKKU7>*pg+i=EJuU(b(G-EShA~;5lVLar|Ju9o-Ac4!q%{ zNs~e29At-%?7&er3!QJWO+{fpVQRefW1bpL(yeafXgyT_dh4P>N{CiE=U@|HSJ-Fv zZ6XZIfio_A&JgyO2{V$Y>u8G_fMX=*B!$dTJGCiyI2j!jXHAtMmZS2=ol5E4t84o6WVG6^^*j#-@>O5U zVcQuHKz{(Z>@3Jh2RELw!mJAREzSY)X7g4}vIWaW1E9e;QnB2tY%0q!2HUsQcE0w% zJp+Ipd(fnNT}z`}X%t9<+#us2eRl2Xg?Cb?ZDeCUa^xabzoYFFPfRAxyype%HPV&! zTYW)(h<6v(m+P+(Hlsrg2{wjN4h8 zw;%#V$6^*J20k>UPux35h%j?ottcx30!*+!o`6JFqwE4mlRhKZ~O|3WvtC%(g2!3WxpjR z_Q%*F2BV1x27S9t7~czKl#M_&qxh^B$|-yJp#}Dre>K4~hVa%~cklat@vBeyO0rTFQLbERMuBpK19+rO1O7LT7;suv zopl$JOv2x^O|hkRo$a5 z>F5kaIZ#i` zwbdx`>h3-SzGxn;TbFG=`L7)ql~mX#SgRiT$ZX~|F%j{M@aLdzSL&iD7dkufcHr>3 z|4^R&=MQ(=$uqUg!O`|l|Fj(D6=vX8&IhmfKiyZ?Uw$uW{4tkUyEL7*Y(hc*@7wUo ziL|eN?Gc+Y`^E+U6$oCw^^F&Z4}J~v&6pjcW=S;hl9{C&qj`of{{nKixNzGP0%5;SKL!@@^e3plkGeF^8-QXRPfVn$TiWRsJV{&Z%k`Xq4(O6)(5S(B%xpdKV z_HxgIOb0I>b4jKDPLk>=2AVo+ZI|prhX+Bg)}Z_?2O2Xsw+umA1CX25#BnUL;`~Z$ zZ$|NtXUQmx?Pg8J=xab96w+bN$kiDVptvprg57yal5;s8WVLuD393IEeyRa)nL$ZO zHe>!IykYQ|nH0&r#H+@zAV2@IEraJAH7c%aJuL;Q_UAv}jAB35=3)SlkPzh*_o9*d zrlzg~VQ~q(f!9?7fHV%p2k@AkK5Z%o zCPFJ=03fPdT_^lr@q6jL^pKvRHtdap*RSDFRu11HSmHhi35Q@r)`xY8A>fk6Ymwp{ zmsU6-C1)2WOjL-4GWeWQJWazn03{EJ0TwU98?+j9?<1*o%7InK82|_YK;Ep;vHd|@ z09A=P45co%r>lqB7?JFci4|*hsvh zRbTyg)n=2C07VyETW(ED{-APk#t$Na=%9X;@K5U+2C9u6D4NRgh&X{EXtAZtM<_Za z8N?b1`Vb@dWYc46^!pr_%Hq~1)y&n-t=To@^|t93`>YS>R`;%A{*Q^o>o?GLSGa#a zjS@XR@T9d(8-|3t;vv*G7^F8ea|Xp2{Y;MSPffEZ6lN>&$eOz_0a##AS%_~K$~xnt zqiDTx`<>TO@6albPJXMe{pMfwAN79qY3pCTnfLBF`Fm2Ji`?UW&Nq|SP2J-c*ezpS z^8eKP+LIbM$F!gbmbZ$QyAalp5ELC!5()J}Vn*=*t(=o(&{bC5WHAE6F>Ei#I4ci@oc7ZJgnv{l`MUZhWKk8Y(IB;O zt{;dpythMN;lZwbM58p2v>x$%F`k1m0+5m?CMLqkn&kE4^Jng)s^^&(Qu64djK7*N zmZ@O>tYzN~W&a$GH+etBkLEXRVdd=0HH0e=G;KWwA41oV7qQ?#wRiO3?3;G95U;QX z`v^kf$?z?`;WOM4M;Rs5X$Ro}E@o8&RX>3c0Pz?%_yesc%5(Ub7Y_b3}+dwS0sOSshGX0U9Q3I=+qEqdZ|!p^J*sTR z%w*!NFS3*w;V9x%d7f|$P;0d6=!^fy$Lo^%Tx4uTj`8X*FWU=*Fzq{_ug$$<4Bl(> zk>HCN6xGO(c5Y0!LpzSxoRn$yi9aVi=Cn}n{Ci!V@9(SXt>nM^b=P<122Cm|YP4+| z&)EjNVXZj|q}i#UOtoNin~i+5&Z5F_-dPZ3<0gy)`KpER9;G&S>1bQ9bh>4ptp!4U zvt0tAtD~c@H8D2_fC9B<%?w+*d@wR>6b~TnR-*VncNU|OqsYxJ=fYzX?t`#T;{T#R z7m4OCE-ng$uOS%c3}Qc&p{NYvP&RRs^Bk0thU#k_@ni%#8+B`&nBYLtWjX9fPFYmY zO!&?`97@jH`SS(H1e;wLwNYcnAuH~%vu7?df1_}~t7V_4w~3RJdA1n@f=kF(Yi+{h zp(s5kfYva?5-{KpDjn5wJhxw-M_*SNM^j%Gq9G&2wVcs1&(&Kxo|$RL4$r{@R1g{@ zq<6R_B`2~TjkYOM2~|qm?6^UMQDF`J;SW-6)7ypi5#awHbRhtsiOjCZBz)+WS!sYBb9D^>~ z#tnxEWzh)oTm(ja6K(Ol;hbX?Mpy;_$nohDWh2GDsI1QR3;?`q9`)5n(B9q0i|*x% z{=AOTQ~IOV0ylL)^Y+d#Yea`vfGp=oY8D{@&VpWx9D#65w=JG)AG&ukp=`t9rNr0L zSL*a`$$j-Qc2{-oC}EE&Ae5wdFYV6?ODz4EOFW>npr4H%)wuOgPrdp|URn)OaCS}| zdwwMz|G4CHV?{*+x{o5uyG+PI3;`A|0o8<%OZ9{Vcmqy>~D`JG!Z^$v5<37_5y{JTOLqgHY2Yy-$|>BlbH@qHKp5ccqnB~$J0 z`^Q=m&cI6216F}VePHhud*jW$=yKR!s)bTO1}qj4gs_@0Z4`UfL>o+qcW=%>M6IQ~ zQ6%$FvyTt5ZsdO}F7nwKC3f)b;}+dH5Z&+;+qUDl71d^=h)zMKod}PH{1GB)FLGxG z2r85kp%*kUe-7=)1VP}eh4l@w*)sSUm0%6Xm4wWB_CyX2I!!p*{Rc*) z^dDnmCgZ4vE~_U-y`9t(>bpOO!V^GT(HcP~KzH@N$ORps3nX=8RutB{M(@tkx$*QqK z8!`w1K^SXLtimzwEdW`2%8c=LJE%f!IO8a3ohrKm!Z>5&)QQbjTlG`V0ATwr82|(t zB(kZa)wvMOO-5?3%F2pRW+a*CE3nW72E0cjQ2Hp;S0&^9A(P? z!v4SiyTvk4AVfq-7#8Y02x@BTQ0}*2aRsdCFk+HLMKbv=V`Zm9%y14AQ!G0>*Nzb* zH8QdfmW>l_C|0c5xwRa2@Knb0Jti_1i0?@}S4b?dEc?P2R@>Nd{b0nJP&DrZrs4{g z$um$MPepi(=K{T7kEioF;_LkEne$k$owPe{Ux4zoA0ZRcV3dr(*N2H(PRx=R`^sM} zao$=Q4Q^o2C=FL38f@R5i*WcP(4J-k;|AmXP>vUMmOb|9T>I!pCu2p_jlevwJVX;g z;#|ri6vE3{pdp;#hgLTB{=^|^#j3IfrizKdJ!R#Mb_FYBc{TS9?}Z>SirDATw1Ip% zIBEgt2b|n!ENnFR!nr3D$kDzW?BvOnd9K8c9lpS!uNo$;(L!MEB8i1ArGIaPOt;-O z)}}${%0;Daz!S6*4&lxLDuD3d-mBA_WEn-_V{DV z>?>cvN`@chX{GyaSyI7DfwEP8F5_(5wlrXU6S1Bf#KBe*nIE9L`alpK1#o-)Y1@(Bka|jzYkkVi} zS@<>31VxnrY;xN1<2Dh+f-KqP4S7A?0!tkaVLb?QS6$PD1z|mXRR^QiO3Y;`Jvw3V zGa2Je80O5yYoZs-I7(|h<#!&RZ)pw}1lbE&VAm=lOGoUcPNXu<@VY+xo5u02L(x1Av1!Zvde6aXkiQPkw(l z5M_2#1^~|Mo2ufN3QS>!J^ADY4%@@+|9ths-g>UJz)#)gfyz>wva`zU-@m&RAxXOZ z>vz9y%kLCaFH8)Jh~~9p{uq$D|L~zp_T&$?5XZB_zWJ@s*n}x!h5{p9gZz5V-7oh~ z_+4aCI+xyHU;EqFE$c#qEn7a#X3tH;P%q4jkLd)@qN5TW2E835I-8K5cb2B~g$_Fo z?pkXEcY62pO5dn|l!NZqK?feyGKsZ_@CDLd2dynCEI^vEm_kn%99J7Xgf6Kn=d zr(jKcqf}6_N?xAc=imBkfHo>e>$|s3Ypww`jijX(LEY{hc|ge?w==0Z77k-Seqj)EY7TTA(7@LC!Uo`;OjbXsy!)MqF z2n~@k%pm}Xi+B5~>jW}zsT;upS8n{~-|s)gzD_*~P(By4r#AuzEE-4R{Wx^UKs+No zUPVu747G4zYCvJpi#0%W=&iv7FHurnXN4G*h7;p>bYee*r~K&t-)y~ZTw6Ej=zlmD z`VM7HVWpLD5ElYKe-5}5Z8?OBkRmK`NI&AsVgTUAtI7@hd6nn8KHP$&i3E==57L5? zT9g-rD`U(k*64)fI6T2HwiUHF;1%KZl?RXAjL=0!0oCsy(-WB)^+1y7!-GsDIwLWc5S%N(iy_ zMfM;6v4u#My=~DQ%Pm3hv3(F=IU%7}OP7oK@b@lV?Nb?THR8Fu`?aG;c{*(E?GtSB z*l6aLUvItp_j^?Mpqt~Sg%(ErA!G1J?0rAS-nM?r5i73Bv*l~1*y_6`A?(qdkb$et zY(bp;G3M{x%Z1p}d5JD{iBDar`)B{6PYLh)JJCW<-sovRmtTEXPHdf=YZafljrsw( z&f+3LWcT#ma_#=)b)QwBp8}cstk{$W;^qARf=eP=yAA{;oJzn7;d!_+xtaXyUbq6`1+e zju%=T;S&llkZ6$ieSZ*d5W2OZe7Hg!>n6|=;@D#b1IZtTK-Z0Lh|@(YQ5o7v1Ss#i z^6C~VMA_cL{uzY1!)1_0x+gT>4jW{Pe|L!??8Rwe!R!KZjxTPFuV%%El`MKuNFt;+Zpc z44UwHQzuyF!Z~*GLa~+A)#DMq$|mCdwf(hx+lvypp}gE8g8OZ5dOSKQ!V{z?SVRbQ ziGx81-qIoCqfmOcSTlS3(9lun>S)s{V!!tF*f?~DD88({ZyX+GUH0_z`>nRU!#?rn zpR!f!@U9ZelXT_Et-lDau)aU6u_}wke_=6-<}-z~QLm*Co1<1G_eHd$60%5f##z&!7O~UA}kY>T?wny^{f!3crisTe$09M|q z4=pxoH+^&U!Y5z-c(tWDgo6g~uF;RY_%9$pH^9o^|nQdp5??HXfVF&~vUX;4k^EENPSo08>`bZ9n^Qwr$#cfPG4;t%U(N zeJS8FY%2s!<0_e|$&2bs>jNOJ0YG_rjS`@XCKpS9#;pT^ks+loLz4Dga?5MQQ~C7X zQaijQ2L~*e<36y&ZrzY(6VTOrDE9UjyRCow;% zKY?U|emu}~XLbcpk5v7;)R2LkUJ5&eI*MZe(C?gL|ctfclq+^%$egIv$S+9{`z-$pgSo1b}M@R zWcb$RbY>9+Bq4CX5Oy6TQUEloHNTyDmpw-e?U!cf8fl9yj;&7EyFdtsU_T06-` z0r>Q62#hK6q84&1(G7Z9jQB~e*M+q@fN=TFO$XC@hjTVPaZN*))ENvF^ zm~49r*`Y?D%>$KxbY1mzy)X)u+Y!K~EwB+UTApE3(&NZax#hxSSy$d>J=m!NaYhbM zh)wpgvFOAW!b~%F2_ZQXU}JXrPM56pF&D6eQTP1gIir+67`K}maBjume~xilc)k*U z06<35QgJ$)YH9OenF4&*&m19EF0anLdRM0rs7~c~01OnP0$QmLI-rKDPVV7(qf|Ct zUT6lcaC0$pjXDB{e%3+r@x}e;J~GRE)C=2y7#=iSG_Oft?&@Cop}nMw@B~z4!)j)`?&h}hvvlcblp9R_!|rHl=qB)5=6XW z@%FABq|1MykgDnIFTQlnzV`K9phWN-MuB$Wd=3WfanP1eML7ojKM2XdQDZ^k)I-OA z8rqEr+qiKViqKGd_L(i9E9(#rLW%XAf>Aylii}ud%{1CUXj^m6l~HCk0eHx^wOzJ* z?_CH*(@g3o*me?QZ2!JGoHD zbt8F3naX6;K-?rDa?3P$iN7ijwY-8_I}Ng>3?p+t)Ip(RP(Hwjq0PNKxI;olTYO?X zUQmiN6^H;340;O$C7wf~j#O+VO*Gzr%++GyHYLCmAUk8VD!wdOn7#*Pz`Bw=ev|2idTaf6{QV+I+Wb z?GW0s5Cq%fkDtbq@eJV_R@(phKl9zBDVfvk!Eip; zW=(@;D#V*$^Y(d8c`}Dhv*=q^L&>NShyuXZS+oGTfk5lL({UyQQ76<;yZ0Rh zQPpfKSI>8Gj&m;*T5;iJ6!{6z`b}rd>yes)CkG?VRkOq@QGj{&37Zd$htN}O=(?-8w;%KRQ3S~xY{e1E~q z(kFsJ!IjuaJP9HZ-qzo^ln@e(1^Q@DH=hLOVTO$C0Bvg;+Q=jrg( zDqq#_MO}92K)rqW-*#9j>?QAiXpueo=sem`2sSpOuCI7^YDH5UxRuAfs}9CtXzH;a z{WQzA?>ug4fPVh!uQx)Ygz}s5dgY;;Mz-pezy9&tuc`r8>As891DTb5LrQdjVgMM$ z0{(@6{E*FswPnZ%t~;o9=>Z!Z0N}Y{27phj^9fbgdbZk|9>6nR-IVPB0PQWKeytDy zqF7TuDJ_P&^YLQ<%HFVt-@n%W;{RI@%98a#^MU^u(IxaOG0hYg*V{M0x*KKOX+l$c z(Qdg5dhO6*0Dx}w<^uo*JF@L7|GtSBV&mu6aue##TVDC3w*{G(rc8>>^n)IywyY zs%X61bh-8q-n|~fk?wb*qQ-KV?}@ z>qhRV#G76o_2JO6#)0maY*===7I~zb5CAbY5o&9;5x(OcKHHznHQ(hy8sL-$r4{wo zfFfOeYA*6}Ot_f0yt=JH@mqYk-qrB{1}A}2#{oQ4EWvh+PGL|MClPu=AuY-;!vRM* zMFAay*Xd~O7Dpbgsr_|IM`LdP!#n(K>h&)5W$!@l#)G1SJ;ArXb;MrXnq!lvEwW62 z%+X0uanq0eiYa%!*QxwB|Bk%7$-@m9&FSqZnsz*Y*g`skY$M>Kd9%a-pz+}E11h{; z{_nrtVz`zeJ6d0qCCM$L@Cs>WecOV3a0Cy)j7;cuaW+_(IS~L19&x=rc(nKNjsl!H zDUgXTnE6_s&Dz^)e<8YasWSYf)w>S=yZ?*RdyF`#{CHozzb=16=XBSb&*-cU{UX3~ z6XUuPU{fdH=180nCc-)rPM8nP&)zZo6#tpG{q9f7mo2^ZvIxlIU#vCq`0oXDt)4F` z+z{0dFM$$xW2!`G8`>*KL5N&{o~0CUS3SV(=(r@-B0{5_i$YNj7j<}eNpTz*6^lYx4icOr3_y#RZ~#C~h>%`{ zP$OFC_;pN35TLD4*GHv~5w$a2#nDPv;*_CTJ0dE~F#rr1HC4A<=L{X>L+1Z}Kmd~e zMA<5*oaUBJ!W_XofCo`5p1Gl8#-R_w0}UjhXiud`3=bcNeB*fuYYkRr>j0VUL~nBG zLX|yue}W#5VsT%Ubc)o0pMclV-A>BfHH&VLTR^&wl_V=RoeTW(um8H*;`sOC!RtSn*d^jdIS zoQ;c3A@paDJ@?EWI|y6U?9BDdK{J_)##5Kn>rnQ|_0VTV60%ThYoA@nEyY1eGBM$K zCM8-bo~!~NigDwrqF-^ptBl`;KWYqKk|(RH2JEF5F4(3Q&)^Icj%REFMu&RKJ6&lr zrlb&7ZhGgHvhh5}9*i!2|+ z`lfnD>Z8aK=NyY06{#^L4X(4I`Lpe2CjXbK>&V|m{@;0b^@yC$v?Ye5Dp)oy;@x>Z zr^52`2qn@n$^igcF*Kad#$XE=dKS(n>u;R~Kqkee&Lo5yV^Q;n^5{B|OaAI-yOUS_ zQGWE|M&6vBi@jG@2L?Fk_e)D#2q#L&PQqR0<(9JtRv4{NWcmca6d`~X%pUkahCTcU zdgoN;T3Kp2G=sZxjm!e4oKXio-zzUE1VD~WN>K=a*@OT{aOPwCauw=(wY7H0!Nr zfRoXj`Jd`h*clnU`;mcU6qKP~`SgH0xOrg>gydJsxuvLO49p5GM)^jjQ|o39c;1ZpWACWtV7Z4Y344TW3%Q? z!kHn&g2_Svt0dWSh>qG%;Qt=#ocy3eVK*f7GGsa(VW(najMl z{(EgVVCT*@qNm7%DfFV%*VNb)!q}~ZMRwKl6q`Pka7JTc(H(4c^OLK7r#mM-m!$sz zUd8Ay&E$J1`}Y2Eu;t;k9ng&(1mHXMs3wzcYj6;DHVHv^zV{CV1M(jWV^t4f0WRC? zyUqZ}Dj^)t)d(dChPk4|39}Q5U=jPIWr4_IQ5-J>HdW#JA{1(E6 z(cxnV%NGmVb(9O&R{)rA5Z!1hA;u@h#Q;odU~VrXR9`3ZKnP&4c$+(W62FNN#8sA) zX;fCpL9!<(%g%|Hg68Em+Dp&n*fv7IwlRjMrq8hDH_yZP9c}m}!fL^|=0-s(HP4F$ zP+_=~Rv@~%Kw{X}5So0)Ye%f6yvvpot|DVaJZu?+Rz$EYB6QQy%{f+jzSQP0KY#e6 zYi!+3k&GA33FL{qNYyJ4L z_7DTI6$+HW{3F|8f6pi@FTj5K>UqmM0wW7 zV(c#f)OYH{MOb62na2#>(PUF7_U0Dsrk9EcXV(rzKAUjXn0|C0qr>}bCIFMwx6MWN zBlHmVQ8`6W5^udhPtvcK#yhfcpcn?gp;Y8{;rMeLSr=O@Au1A5Ccsof_?Fp;7K5H{ zG!BnU9#pJvgXWS%?qNS&-~p~o+>1N#rz4aDO5*hitO$%x@M?%~?^=Aap<#C~FsmzA~J zv(Fv2SD-fj_$MAzt=geO#VEeQ@IH$p9*E*&2C!Jy5J&YK3cyB;TJurF&P8e3gF#~t z0z?HHV^HwKES-#Z*4zb&He*∈8tEZ{$H)o<~tYd=0jNs)!}t{VEs*!a>N?asMgM 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 z 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%0Df=hzDCXs$9S@qkOJBE$lVB>hvTi-)#^gh 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